思考:計(jì)算機(jī)圖形學(xué)中的左上像素填充約定(top-left filling convention for filling geometry)
我們知道目前顯示器顯示的原理,光柵化顯示最小的單元是pixel(或者說精度為piexl),一個(gè)pixel所占的區(qū)域一般是個(gè)正方形,顯示器上的畫面就由一個(gè)或多個(gè)這樣的小方格組成。如果以每個(gè)小方格為一個(gè)單元來(lái)制定屏幕坐標(biāo)的話,問題就來(lái)了,因?yàn)榉礁癖旧碛写笮。皇且粋€(gè)嚴(yán)格意義上的"點(diǎn)"。
問題來(lái)源:屏幕坐標(biāo)點(diǎn)的選取以及像素方格本身的大小
如果以方格中心點(diǎn)為基準(zhǔn)制定坐標(biāo)點(diǎn)(即對(duì)于任意一整數(shù)坐標(biāo)點(diǎn)p(x,y),p必為某個(gè)像素方格的中心),以一個(gè)方格為跨度來(lái)制定屏幕坐標(biāo)系的話。如圖,屏幕上3X3的方格組成一個(gè)正方形的畫面,如果按照方格中心點(diǎn)為基準(zhǔn)制定坐標(biāo)點(diǎn),其區(qū)域屏幕坐標(biāo)為(0,0,2,2)(注意:0,1,2都位于方格中心,其中,左上角坐標(biāo)為(0,0),右下角坐標(biāo)為(2,2)),而按照數(shù)學(xué)運(yùn)算,其上下跨距就是2-0 = 2 pixels,左右跨距2-0 = 2 pixels,即總共包含2X2=4個(gè)方格.而實(shí)際畫面中的跨距是3X3,即共包含9個(gè)方格(從最左上端到最右下端),問題來(lái)了,前后矛盾了。左上像素填充約定可以解決這個(gè)問題。
問題解決:左上像素填充約定
還是舉剛才的例子,如果給定左上角坐標(biāo)為(0,0),右下角坐標(biāo)為(2,2)的矩形區(qū)域,叫顯示設(shè)備去繪制的話,按照左上像素填充約定,在屏幕上填充的像素點(diǎn)將是:(0,0),(0,1),(1,0),(1,0)這個(gè)2X2區(qū)域,而非圖中所示的3X3區(qū)域。反過來(lái)說圖中所示的3X3區(qū)域要用坐標(biāo)表示的話應(yīng)該是(0,0,3,3)。簡(jiǎn)單來(lái)說,在左上像素填充約定下,要填充(x1,y1,x2,y2)(x1,y1,x2,y2為整數(shù))的矩形,實(shí)際填充的區(qū)域會(huì)是(x1-0.5,y1-0.5,x2-0.5,y2-0.5),這個(gè)區(qū)域的左上角像素坐標(biāo)為(x1,y1),右下角像素坐標(biāo)為(x2-1,y2-1),即實(shí)際的填充區(qū)域會(huì)向左和向上各偏移0.5個(gè)像素。故稱左上像素填充約定。
? 0 1?2
?? 0 口口口
?? 1 口口口
?? 2 口口口
D3D, GDI, OpenGL等圖形庫(kù)使用左上填充約定的,如果接觸過這些圖形庫(kù),你可能會(huì)知道這個(gè)約定。還記得畫一個(gè)全屏幕的矩形吧:DrawRectangle(0, 0, Screen_Width-1, Screen_Height-1)。
想法一:想到別的填充約定,比如右上,左下,右下等,這些不知道有哪些系統(tǒng)使用。
想法二:如果以像素方格的左上角為基準(zhǔn)制定坐標(biāo)點(diǎn)(即對(duì)于任意一整數(shù)坐標(biāo)點(diǎn)p(x,y),p必為某個(gè)像素方格的左上角),情況怎么樣?這時(shí),給定(0,0,2,2),則填充時(shí)可以還會(huì)遇到一樣的問題,填充(0,0),(0,1),(1,0),(1,0),(2,0),(2,1),(0,2),(1,2),(2,2),最后還是包含了3X3= 9個(gè)像素。
想法三:
to be continued...