SoRoMan

人若无名,便可专心练剑。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

思考:计算机图形学中的左上像素填充约定(top-left filling convention for filling geometry)

我们知道目前显示器显示的原理,光栅化显示最小的单元是pixel(或者说精度为piexl),一个pixel所占的区域一般是个正方形,显示器上的画面就由一个或多个这样的小方格组成。如果以每个小方格为一个单元来制定屏幕坐标的话,问题就来了,因为方格本身有大小,不是一个严格意义上的"点"。

问题来源:屏幕坐标点的选取以及像素方格本身的大小
如果以方格中心点为基准制定坐标点(即对于任意一整数坐标点p(x,y),p必为某个像素方格的中心),以一个方格为跨度来制定屏幕坐标系的话。如图,屏幕上3X3的方格组成一个正方形的画面,如果按照方格中心点为基准制定坐标点,其区域屏幕坐标为(0,0,2,2)(注意:0,1,2都位于方格中心,其中,左上角坐标为(0,0),右下角坐标为(2,2)),而按照数学运算,其上下跨距就是2-0 = 2 pixels,左右跨距2-0 = 2 pixels,即总共包含2X2=4个方格.而实际画面中的跨距是3X3,即共包含9个方格(从最左上端到最右下端),问题来了,前后矛盾了。左上像素填充约定可以解决这个问题。

问题解决:左上像素填充约定
还是举刚才的例子,如果给定左上角坐标为(0,0),右下角坐标为(2,2)的矩形区域,叫显示设备去绘制的话,按照左上像素填充约定,在屏幕上填充的像素点将是:(0,0),(0,1),(1,0),(1,0)这个2X2区域,而非图中所示的3X3区域。反过来说图中所示的3X3区域要用坐标表示的话应该是(0,0,3,3)。简单来说,在左上像素填充约定下,要填充(x1,y1,x2,y2)(x1,y1,x2,y2为整数)的矩形,实际填充的区域会是(x1-0.5,y1-0.5,x2-0.5,y2-0.5),这个区域的左上角像素坐标为(x1,y1),右下角像素坐标为(x2-1,y2-1),即实际的填充区域会向左和向上各偏移0.5个像素。故称左上像素填充约定。

  0 1 2
   0 口口口
   1 口口口
   2 口口口

D3D, GDI, OpenGL等图形库使用左上填充约定的,如果接触过这些图形库,你可能会知道这个约定。还记得画一个全屏幕的矩形吧:DrawRectangle(0, 0, Screen_Width-1, Screen_Height-1)。

想法一:想到别的填充约定,比如右上,左下,右下等,这些不知道有哪些系统使用。

想法二:如果以像素方格的左上角为基准制定坐标点(即对于任意一整数坐标点p(x,y),p必为某个像素方格的左上角),情况怎么样?这时,给定(0,0,2,2),则填充时可以还会遇到一样的问题,填充(0,0),(0,1),(1,0),(1,0),(2,0),(2,1),(0,2),(1,2),(2,2),最后还是包含了3X3= 9个像素。

想法三:
to be continued...



SoRoMan 2006-07-26 16:55
posted on 2006-07-26 16:55  SoRoMan  阅读(934)  评论(0编辑  收藏  举报
free web counters
Vistaprint Discount Codes