• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            SoRoMan

            人若無(wú)名,便可專心練劍.

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              12 隨筆 :: 1 文章 :: 41 評(píng)論 :: 0 Trackbacks

            思考:計(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...

            posted on 2006-07-26 16:55 SoRoMan 閱讀(2129) 評(píng)論(7)  編輯 收藏 引用

            評(píng)論

            # re: 思考:計(jì)算機(jī)圖形學(xué)中的左上像素填充約定(top-left filling convention for filling geometry) 2006-07-26 17:50 mroske
            原來(lái)還有這種約定。。。

            在我的認(rèn)識(shí)中一個(gè)坐標(biāo)都是從 0 開始,而長(zhǎng)度都是從 1 開始。(光柵)

            int w = 3, h = 3;
            for (int y = 0; y < h; ++y) {
            for (int x = 0; x < w; ++x) {
            SetPixel(x, y, 0xffffff);
            }
            }
            代碼說明 y = h - 1 和 x = w - 1。

            如果一個(gè)坐標(biāo)它的長(zhǎng)度因該為1,那么 p1(0, 0) 到 p2(2, 0) 的長(zhǎng)度應(yīng)該為3。即 (0,0), (1,0), (2,0),如果直接 2 - 0 = 2,那這個(gè)得到只是坐標(biāo)差距,并不是長(zhǎng)度。 換成長(zhǎng)度為 2 = w - 1, w = 3;

            typedef struct tagRECT {
            LONG left;
            LONG top;
            LONG right;
            LONG bottom;
            } RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;
            其中 left 和 top 是左上角的 x, y 軸坐標(biāo). right 和 bottom 是右下角的 x, y 軸坐標(biāo)。
            在設(shè)置這樣一個(gè)矩形范圍的時(shí)候,往往右下角坐標(biāo)是不包括在內(nèi)的,也就是說右下角實(shí)際坐標(biāo)為 right - 1, bottom -1,所以 right - left 是可以直接算出其長(zhǎng)度的。


            以上純屬個(gè)人瞎吹。。。。
              回復(fù)  更多評(píng)論
              

            # re: 思考:計(jì)算機(jī)圖形學(xué)中的左上像素填充約定(top-left filling convention for filling geometry) 2006-07-26 21:14 SoRoMan
            to mroske:

            如果一個(gè)坐標(biāo)它的長(zhǎng)度因該為1,那么 p1(0, 0) 到 p2(2, 0) 的長(zhǎng)度應(yīng)該為3。即 (0,0), (1,0), (2,0),如果直接 2 - 0 = 2,那這個(gè)得到只是坐標(biāo)差距,并不是長(zhǎng)度。
            ------------------------------------------
            不知道你這里說的長(zhǎng)度是什么意思?

            在屏幕上的最小單位是一個(gè)像素,屏幕上的坐標(biāo)是以以像素為單位的,所以坐標(biāo)之間的差距就是多少個(gè)像素.

            p1(0, 0) 到 p2(2, 0) 之間的差距為2,表明中間跨越2個(gè)像素.或者說長(zhǎng)度為2個(gè)像素. 所以不能填充(0,0),(1,0),(2,0) 3個(gè)像素.我們可以作個(gè)實(shí)驗(yàn),你調(diào)用一些圖形庫(kù)中的畫線函數(shù),畫出p1(0, 0) 到 p2(2, 0)的直線,最后在屏幕上出現(xiàn)的應(yīng)該是2個(gè)像素,而不是3個(gè).  回復(fù)  更多評(píng)論
              

            # re: 思考:計(jì)算機(jī)圖形學(xué)中的左上像素填充約定(top-left filling convention for filling geometry) 2006-07-27 11:29 mroske
            :) 我所指的所謂“長(zhǎng)度”即一個(gè)像素的長(zhǎng)度,如果有3個(gè)像素,那我可能說長(zhǎng)度為3。不好意思,讓你費(fèi)解了。

            之所以我所 2 - 0 = 2 是坐標(biāo)差距,是因?yàn)椤?”在長(zhǎng)度中是無(wú)意義的(但存在)。。

            “你調(diào)用一些圖形庫(kù)中的畫線函數(shù),畫出p1(0, 0) 到 p2(2, 0)的直線,最后在屏幕上出現(xiàn)的應(yīng)該是2個(gè)像素,而不是3個(gè)”
            ----- 或許你是對(duì)的。

            但是我認(rèn)為畫線,它因該存在于一個(gè)矩形中,即任何的線都是一個(gè)矩形的對(duì)角線。不好意思我再引用我先前的回答:
            “在設(shè)置這樣一個(gè)矩形范圍的時(shí)候,往往右下角坐標(biāo)是不包括在內(nèi)的,也就是說右下角實(shí)際坐標(biāo)為 right - 1, bottom -1,所以 right - left 是可以直接算出其長(zhǎng)度的。 ”
            如果說 left = 0, top = 0, right = 2, bottom = 0,那么 right - left 應(yīng)該等于 2,即長(zhǎng)度為 2。 那么實(shí)際坐標(biāo)有如下:(0,0), (1,0),不包括的坐標(biāo)(2,0)。證明右下角坐標(biāo)是不包括的。



            謝謝你的實(shí)驗(yàn),我去做了一下。
              回復(fù)  更多評(píng)論
              

            # re: 思考:計(jì)算機(jī)圖形學(xué)中的左上像素填充約定(top-left filling convention for filling geometry) 2006-07-27 11:40 mroske
            “即任何的線都是一個(gè)矩形的對(duì)角線”并非任何的線,我指任何的直線。:)  回復(fù)  更多評(píng)論
              

            # re: 思考:計(jì)算機(jī)圖形學(xué)中的左上像素填充約定(top-left filling convention for filling geometry) 2006-07-27 12:06 SoRoMan

            “在設(shè)置這樣一個(gè)矩形范圍的時(shí)候,往往右下角坐標(biāo)是不包括在內(nèi)的,也就是說右下角實(shí)際坐標(biāo)為 right - 1, bottom -1,所以 right - left 是可以直接算出其長(zhǎng)度的。 ”
            --------------------
            你說的這個(gè)是結(jié)論,至于原因,就是為什么在繪制的時(shí)候不去包括右下角(right, bottom),而去繪制(right - 1, bottom - 1)?正如我文中說的,是左上約定在起的作用。

            簡(jiǎn)單概括一下就是:

            在一般的坐標(biāo)系里面,比如畫一個(gè)矩形(0,0,2,2),會(huì)經(jīng)過(2,2)這點(diǎn)。而在以像素為單位的屏幕坐標(biāo)系里面,像素有大小,所以如果以其中心點(diǎn)為基準(zhǔn)(坐標(biāo)點(diǎn)),在繪制的時(shí)候,就會(huì)包含(right, bottom)這個(gè)像素的1/4部分,但是1個(gè)像素是最小單元,要么繪制,要么不繪制,所以,為了解決無(wú)法繪制1/4像素的問題,就統(tǒng)統(tǒng)向左向上移動(dòng)1/2像素,繪制移動(dòng)后的矩形區(qū)域,其大小(面積)不變,位置變了,新的矩形的右下角成了(right - 1, bottom - 1)。
              回復(fù)  更多評(píng)論
              

            # re: 思考:計(jì)算機(jī)圖形學(xué)中的左上像素填充約定(top-left filling convention for filling geometry) 2006-07-27 23:08 mroske
            :) 為了不污染你的 blog,我把我的想法寫在了我自己的 blog,
            http://blog.programfan.com/article.asp?id=16886
            上面連接正是。  回復(fù)  更多評(píng)論
              

            # re: 思考:計(jì)算機(jī)圖形學(xué)中的左上像素填充約定(top-left filling convention for filling geometry) 2006-11-29 13:11 asuna
            介個(gè)吧, 你們說的都很高深, 我看的也不是很懂. 偶只知道, 在(0, 0, 2, 2)的坐標(biāo)里面, 畫矩形的話是8個(gè)格子, 但是填矩形的話是4個(gè)格子.
            不過我覺得如果你愿意, 既然坐標(biāo)都設(shè)置成了中心點(diǎn)了, 矩形當(dāng)然也可以填成9個(gè)格子.
            不過如果不是自己寫坐標(biāo)和寫填充函數(shù)的話, ms默認(rèn)的坐標(biāo)設(shè)置是左上角的坐標(biāo).
            既然是約定么,應(yīng)該就只是告訴大家他是照這個(gè)約定來(lái)填的象素.我的理解就是這個(gè)約定里面畫會(huì)比填在下面和右邊個(gè)多一個(gè)象素.
            cc...  回復(fù)  更多評(píng)論
              


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久综合伊人77777| 99久久婷婷国产综合精品草原| 欧美麻豆久久久久久中文| 狠狠色丁香婷婷久久综合五月 | 久久久www免费人成精品| 国产91色综合久久免费| 伊人久久大香线蕉AV一区二区| 国产69精品久久久久777| 国产精品99久久久久久宅男| 亚洲AV无码久久| 日产精品久久久久久久| 2021久久精品国产99国产精品| 久久久青草青青国产亚洲免观| 久久精品综合网| 日本WV一本一道久久香蕉| 久久久91精品国产一区二区三区| 久久久精品国产sm调教网站| 久久九九久精品国产免费直播| 久久久久夜夜夜精品国产| 久久精品日日躁夜夜躁欧美| 久久这里只有精品首页| 亚洲中文字幕无码一久久区| 国内精品伊人久久久久777| 国内精品久久久久久不卡影院| 国内精品久久久久久久久电影网| 中文无码久久精品| 久久午夜无码鲁丝片秋霞| AAA级久久久精品无码区| AV无码久久久久不卡网站下载 | www性久久久com| 中文字幕久久波多野结衣av| 伊人精品久久久久7777| 亚洲国产高清精品线久久| 久久精品这里热有精品| 国产精品女同久久久久电影院| 久久午夜无码鲁丝片秋霞 | 99久久国产精品免费一区二区| 亚洲人成电影网站久久| 香蕉久久影院| 18岁日韩内射颜射午夜久久成人| 久久笫一福利免费导航|