青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品


姚明,81年,97年開始接觸電腦,6年的編程學(xué)習(xí)經(jīng)歷, 曾有4年工作經(jīng)驗(yàn),最終轉(zhuǎn)向基礎(chǔ)理論學(xué)習(xí)和研究, 現(xiàn)華中理工科技大學(xué)在讀,有志于圖形學(xué)領(lǐng)域工作發(fā)展

EMAIL:alanvincentmail@gmail.com QQ:31547735

隨筆分類(34)

文章分類(99)

相冊(cè)

收藏夾(6)

編程技術(shù)網(wǎng)站

出國留學(xué)網(wǎng)站

數(shù)學(xué)資源網(wǎng)站

圖形學(xué)網(wǎng)站

  • ati
  • ati開發(fā)者
  • azure
  • 葉蔚的個(gè)人網(wǎng)站
  • cnblogs
  • 計(jì)算機(jī)圖形學(xué)群
  • directx
  • directx官方網(wǎng)站
  • Eurographics
  • 計(jì)算機(jī)圖形學(xué)年會(huì)
  • gamedev
  • 游戲編程網(wǎng)站
  • nvidia
  • nvidia開發(fā)者
  • opengl
  • opengl官方網(wǎng)站
  • opengpu
  • GPU 相關(guān)的圖形學(xué)技術(shù)
  • SCI
  • 圖形學(xué)論文
  • siggraph
  • 世界圖形學(xué)年會(huì)
  • Tim Rowley
  • 收集整理了頂級(jí)年會(huì)的論文合集

英語資源網(wǎng)站

自由職業(yè)者

搜索

  •  

最新評(píng)論

跟我一起學(xué)圖形編程

                              作者:姚明           聯(lián)系方式:alanvincentmail@gmail.com     2011年1月26日 17:42:15


點(diǎn),線,面,我們這節(jié)課學(xué)學(xué)面的填充和生成。千萬不要忽略這節(jié)課的重要性,我們平時(shí)看到的3維圖形,一般是由三角網(wǎng)格構(gòu)成,比如,一個(gè)人,一座山,一張桌子。網(wǎng)格被填充了顏色后,就是我們看到的栩栩如生的樣子。但是,它們不是被簡單的填充單一的顏色,被填充的顏色是經(jīng)過紋理,光照,材質(zhì)等運(yùn)算后得到的結(jié)果,這是一個(gè)復(fù)雜的過程,專業(yè)術(shù)語稱其為象素著色。這些內(nèi)容,以后的課程我們慢慢深入學(xué)習(xí)。在這里,我們只用隨機(jī)顏色的線條簡單的填充整個(gè)多邊形表面。


理論:

填充的算法大概分為兩種思路,第一種,掃描線法,想象一下,從一個(gè)封閉多邊形外面一點(diǎn)開始,畫一直線,與多邊形相交,通過檢測掃描線上每點(diǎn)的狀態(tài),就能區(qū)分出,多邊形外部和內(nèi)部的點(diǎn)。第二種,種子算法,先取多邊形內(nèi)部任意一點(diǎn)做種子,由這個(gè)種子,向左右,上下擴(kuò)散,最終填充整個(gè)多邊形內(nèi)部。我認(rèn)為,掃描線算法適用于,多邊形各頂點(diǎn)值已知,即邊界已知情況下的填充。種子算法適用于,邊界未知情況,例如,屏幕上有多個(gè)多邊形重疊區(qū)域的填充。詳細(xì)的算法細(xì)節(jié)請(qǐng)參考點(diǎn)擊下載的相關(guān)章節(jié)。下面給出掃描線算法的實(shí)現(xiàn)代碼。


內(nèi)容:

  1//-----------------------------------------------------------------------------------------------
  2// 功能:  填充多邊形
  3//
  4// 參數(shù):  lpPoints: 指向頂點(diǎn)坐標(biāo)數(shù)組的指針,數(shù)組類型為POINT,多邊形由它們順次封閉連接得到
  5//          nCount:   頂點(diǎn)的個(gè)數(shù)
  6//          nColor:   填充的顏色 默認(rèn)為黑色
  7//          DC:       設(shè)備句柄
  8//
  9// 返回:  無返回值
 10//
 11// 說明:  可以是邊相交的多邊形
 12//
 13// 創(chuàng)建(修改): 2011-1-13 16:31 姚明
 14//-----------------------------------------------------------------------------------------------
 15void FillPolygon(LPPOINT lpPoints, int nCount, int nColor /*=0*/,HDC &DC)
 16{
 17  // 邊結(jié)構(gòu)數(shù)據(jù)類型
 18  typedef struct Edge
 19  {
 20    int ymax;                // 邊的最大y坐標(biāo)
 21    float x;                // 與當(dāng)前掃描線的交點(diǎn)x坐標(biāo)
 22    float dx;                // 邊所在直線斜率的倒數(shù)
 23    struct Edge *pNext;        // 指向下一條邊
 24  }
 Edge,  *LPEdge;
 25
 26  int i = 0, j = 0, k = 0;
 27  int y0 = 0, y1 = 0;        // 掃描線的最大和最小y坐標(biāo)
 28  LPEdge pAET = NULL;        // 活化邊表頭指針
 29  LPEdge *pET = NULL;        // 邊表頭指針
 30
 31  pAET = new Edge;            // 初始化表頭指針,第一個(gè)元素不用
 32  pAET->pNext = NULL;
 33
 34  // 獲取y方向掃描線邊界
 35  y0 = y1 = lpPoints[0].y;
 36  for (i = 1; i < nCount; i++)
 37  {
 38    if (lpPoints[i].y < y0)
 39      y0 = lpPoints[i].y;
 40    else if (lpPoints[i].y > y1)
 41      y1 = lpPoints[i].y;
 42  }

 43  if (y0 >= y1)
 44    return ;
 45
 46  // 初始化邊表,第一個(gè)元素不用
 47  pET = new LPEdge[y1 - y0 + 1];
 48  for (i = 0; i <= y1 - y0; i++)
 49  {
 50    pET[i] = new Edge;
 51    pET[i]->pNext = NULL;
 52  }

 53
 54  for (i = 0; i < nCount; i++)
 55  {
 56    j = (i + 1% nCount;                // 組成邊的下一點(diǎn)
 57    if (lpPoints[i].y != lpPoints[j].y)
 58    // 如果該邊不是水平的則加入邊表
 59    {
 60      LPEdge peg;                        // 指向該邊的指針
 61      LPEdge ppeg;                        // 指向邊指針的指針
 62
 63      // 構(gòu)造邊
 64      peg = new Edge;
 65      k = (lpPoints[i].y > lpPoints[j].y) ? i : j;
 66      peg->ymax = lpPoints[k].y;        // 該邊最大y坐標(biāo)
 67      k = (k == j) ? i : j;
 68      peg->= (float)lpPoints[k].x;    // 該邊與掃描線焦點(diǎn)x坐標(biāo)
 69      if (lpPoints[i].y != lpPoints[j].y)
 70        peg->dx = (float)(lpPoints[i].x - lpPoints[j].x) / (lpPoints[i].y -
 71          lpPoints[j].y);
 72      // 該邊斜率的倒數(shù)
 73      peg->pNext = NULL;
 74
 75      // 插入邊
 76      ppeg = pET[lpPoints[k].y - y0];
 77      while (ppeg->pNext)
 78        ppeg = ppeg->pNext;
 79      ppeg->pNext = peg;
 80    }
 // end if
 81  }
 // end for i
 82
 83  // 掃描
 84  for (i = y0; i <= y1; i++)
 85  {
 86    LPEdge peg0 = pET[i - y0]->pNext;
 87    LPEdge peg1 = pET[i - y0];
 88    if (peg0)
 89    // 有新邊加入
 90    {
 91      while (peg1->pNext)
 92        peg1 = peg1->pNext;
 93      peg1->pNext = pAET->pNext;
 94      pAET->pNext = peg0;
 95    }

 96
 97    // 按照x遞增排序pAET
 98    peg0 = pAET;
 99    while (peg0->pNext)
100    {
101      LPEdge pegmax = peg0;
102      LPEdge peg1 = peg0;
103      LPEdge pegi = NULL;
104
105      while (peg1->pNext)
106      {
107        if (peg1->pNext->> pegmax->pNext->x)
108          pegmax = peg1;
109        peg1 = peg1->pNext;
110      }

111      pegi = pegmax->pNext;
112      pegmax->pNext = pegi->pNext;
113      pegi->pNext = pAET->pNext;
114      pAET->pNext = pegi;
115      if (peg0 == pAET)
116        peg0 = pegi;
117    }

118
119    // 遍歷活邊表,畫線
120    peg0 = pAET;
121    while (peg0->pNext)
122    {
123      if (peg0->pNext->pNext)
124      {
125        Bresenham((int)peg0->pNext->x, i, (int)peg0->pNext->pNext->x, i, DC);
126        peg0 = peg0->pNext->pNext;
127      }

128      else
129        break;
130    }

131
132    // 把ymax=i的節(jié)點(diǎn)從活邊表刪除并把每個(gè)節(jié)點(diǎn)的x值遞增dx
133    peg0 = pAET;
134    while (peg0->pNext)
135    {
136      if (peg0->pNext->ymax < i + 2)
137      {
138        peg1 = peg0->pNext;
139        peg0->pNext = peg0->pNext->pNext; //刪除
140        delete peg1;
141        continue;
142      }

143      peg0->pNext->+= peg0->pNext->dx; //把每個(gè)節(jié)點(diǎn)的x值遞增dx
144      peg0 = peg0->pNext;
145    }

146  }

147
148  // 刪除邊表
149  for (i = 0; i < y1 - y0; i++)
150    if (pET[i])
151      delete pET[i];
152
153  if (pAET)
154    delete pAET;
155  if (pET)
156    delete []pET;
157}


分析:

以下是被修改后的WM_TIMER消息代碼   

 

 1     case WM_TIMER:
 2             GetClientRect (hwnd, &rect) ;
 3            if(rect.right <=0 || rect.bottom<=0return 0//窗口最小化后結(jié)束繪制
 4            hdc = GetDC (hwnd) ;
 5            hdcMem = CreateCompatibleDC(NULL);    //創(chuàng)建內(nèi)存設(shè)備環(huán)境
 6            hBitmap = CreateCompatibleBitmap(hdc, 
 7                rect.right, rect.bottom);          //創(chuàng)建內(nèi)存設(shè)備環(huán)境相關(guān)的位圖
 8            SelectObject(hdcMem, hBitmap);          //選擇位圖對(duì)象到內(nèi)存設(shè)備環(huán)境
 9
10            for(int i=0;i<12;i++// 循環(huán)次數(shù)必須是偶數(shù),否則最后一根線無法形成閉合區(qū)域
11            {
12//                COLORREF crColor = RGB(rand()%256,rand()%256,rand()%256); //隨機(jī)產(chǎn)生點(diǎn)的顏色值
13//                SetPixel (hdc, x, y, crColor) ;      //在顯示設(shè)備環(huán)境中繪制點(diǎn)
14//                SetPixel (hdcMem, x, y, crColor) ;//在內(nèi)存設(shè)備環(huán)境中繪制點(diǎn)
15
16                static int xTemp = -1;
17                static int yTemp = -1;
18
19                x = rand()%rect.right;              //隨機(jī)產(chǎn)生點(diǎn)的X坐標(biāo)
20                y = rand()%rect.bottom;              //隨機(jī)產(chǎn)生點(diǎn)的Y坐標(biāo)
21
22                Bresenham(rect.right/2,rect.bottom/2,x,y,hdcMem);
23
24                if(xTemp != -1 && yTemp != -1)
25                {
26                    Bresenham(x,y,xTemp,yTemp,hdcMem);
27
28                    POINT pts[3];                 //填充區(qū)域的3個(gè)頂點(diǎn)
29                    pts[0].x = rect.right/2;
30                    pts[0].y = rect.bottom/2;
31                    pts[1].x = x;
32                    pts[1].y = y;
33                    pts[2].x = xTemp;
34                    pts[2].y = yTemp;
35                    FillPolygon(pts , 3 , 0  ,hdcMem);
36
37                    xTemp = -1;
38                    yTemp = -1;
39
40                }
else
41                {
42                    xTemp = x;
43                    yTemp = y;
44                }

45            }

46
47            BitBlt(hdc,00, rect.right, rect.bottom, hdcMem, 00, SRCCOPY); //將內(nèi)存設(shè)備環(huán)境中的數(shù)據(jù)傳到顯示設(shè)備環(huán)境顯示
48            DeleteObject(hBitmap);                  //釋放位圖對(duì)象
49            DeleteDC (hdcMem) ;                      //釋放內(nèi)存設(shè)備環(huán)境
50            ReleaseDC (hwnd, hdc) ;                  //釋放顯示設(shè)備環(huán)境
51            return 0 ;
posted on 2011-01-26 17:34 姚明 閱讀(1823) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 原創(chuàng)教程
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久精品国产99国产精品澳门| 亚洲精品护士| 亚洲国产精品黑人久久久| 91久久午夜| 亚洲一区二区三区四区五区午夜| 欧美一区在线直播| 欧美伦理91| 国产视频精品va久久久久久| 亚洲国产欧美精品| 亚洲欧美国产制服动漫| 欧美.日韩.国产.一区.二区| 99精品国产99久久久久久福利| 欧美亚洲一级| 欧美激情女人20p| 国产亚洲欧美一区在线观看| 一区二区三区精品在线| 久久久久久国产精品mv| 日韩视频一区二区| 久久久久国色av免费观看性色| 欧美久久视频| 国内精品久久国产| 亚洲专区在线| 亚洲黄色小视频| 欧美中在线观看| 国产精品国产三级国产专播精品人 | 欧美一区二区福利在线| 亚洲精品1234| 久久精品99国产精品酒店日本| 欧美日韩一卡二卡| 亚洲人体大胆视频| 久久伊人亚洲| 午夜精品久久| 国产精品第一区| 99在线|亚洲一区二区| 久久在线免费观看| 亚洲伊人第一页| 欧美日韩免费网站| 亚洲精品综合| 欧美成人tv| 久久精品2019中文字幕| 国产乱码精品| 亚洲综合激情| 艳妇臀荡乳欲伦亚洲一区| 免费美女久久99| 亚洲大胆人体视频| 久久久久久久久一区二区| 亚洲视频在线看| 欧美日韩一本到| 99视频在线观看一区三区| 亚洲第一精品福利| 老司机午夜精品视频在线观看| 狠狠色噜噜狠狠色综合久| 久久久国产午夜精品| 亚洲综合不卡| 国产精品一区二区a| 亚洲免费小视频| 亚洲色图制服丝袜| 国产精品扒开腿做爽爽爽软件| 日韩一区二区福利| 亚洲黄色成人| 欧美韩日精品| 99精品国产福利在线观看免费| 欧美激情第9页| 美女久久网站| 亚洲伦理网站| 亚洲精品美女91| 欧美日韩亚洲在线| 亚洲已满18点击进入久久| 这里只有精品视频在线| 欧美四级电影网站| 性欧美精品高清| 午夜精品视频网站| 国产一二精品视频| 久久亚洲一区| 久久偷看各类wc女厕嘘嘘偷窃| 在线观看视频一区| 欧美激情免费观看| 欧美精品免费播放| 亚洲淫片在线视频| 性色一区二区| 一色屋精品视频免费看| 欧美成人免费观看| 欧美精品在线观看播放| 亚洲一级特黄| 亚洲欧美日韩国产综合精品二区| 国产一区二区按摩在线观看| 麻豆精品在线播放| 欧美电影打屁股sp| 一区二区激情小说| 亚洲免费在线| 影音先锋亚洲视频| 亚洲欧洲视频| 国产精品你懂的| 久久青青草原一区二区| 免费成人在线观看视频| 亚洲视频一区二区在线观看 | 国产精品素人视频| 久久久五月天| 欧美精品1区2区3区| 亚洲欧美日韩一区二区在线| 久久er精品视频| 亚洲日韩欧美视频| 一区二区av| 狠狠久久五月精品中文字幕| 亚洲激情第一页| 国产精品毛片大码女人| 老巨人导航500精品| 欧美精品1区2区| 欧美中文字幕在线| 麻豆精品国产91久久久久久| 在线视频精品一| 久久经典综合| 中文在线资源观看网站视频免费不卡| 亚洲一区区二区| 亚洲国产精品成人va在线观看| 亚洲精品中文字| 国产一区二区三区高清| 亚洲区在线播放| 国产综合婷婷| 日韩一区二区精品| 狠狠综合久久| 一区二区三区国产精品| 亚洲丶国产丶欧美一区二区三区| 99精品国产在热久久下载| 国精产品99永久一区一区| 日韩午夜三级在线| 黄色综合网站| 亚洲视频狠狠| 日韩视频一区| 久久久久久尹人网香蕉| 亚洲欧美日韩国产另类专区| 老司机一区二区三区| 欧美一区二区三区免费大片| 欧美精品99| 免费观看成人网| 国产伦精品一区二区三区视频孕妇 | 国产精品一区一区| 亚洲激情国产精品| 一区二区亚洲精品| 亚洲午夜伦理| 99精品国产福利在线观看免费| 久久精品成人一区二区三区| 亚洲一区二区高清| 欧美1区视频| 另类尿喷潮videofree| 国产精品美女一区二区在线观看| 欧美激情1区2区| 黄色成人在线免费| 小黄鸭精品密入口导航| 亚洲一区二区三区欧美| 欧美激情在线观看| 欧美国产精品日韩| 影音先锋亚洲一区| 欧美一区二区成人| 香蕉乱码成人久久天堂爱免费| 欧美日韩1区| 亚洲国产精品久久久久秋霞蜜臀 | 亚洲丰满在线| 在线看片日韩| 久久久亚洲一区| 久久久精品动漫| 国产日韩欧美综合一区| 亚洲午夜性刺激影院| 亚洲一区不卡| 欧美视频在线视频| 一区二区日韩欧美| 一区二区三区久久精品| 欧美女人交a| 91久久精品美女高潮| 亚洲欧洲一区| 欧美v国产在线一区二区三区| 牛人盗摄一区二区三区视频| 黄色精品一二区| 久久精品中文字幕一区| 久久久蜜桃一区二区人| 国产无一区二区| 欧美在线亚洲在线| 久久夜色撩人精品| 伊人成人网在线看| 久久免费少妇高潮久久精品99| 美女主播一区| 亚洲盗摄视频| 男女精品视频| 亚洲区国产区| 亚洲香蕉成视频在线观看 | 国产欧美日本在线| 欧美一区精品| 女人香蕉久久**毛片精品| 亚洲二区视频| 欧美精品日韩精品| 99热这里只有成人精品国产| 亚洲欧美一区二区三区在线| 国产欧美 在线欧美| 欧美伊人影院| 欧美激情亚洲自拍| 制服丝袜激情欧洲亚洲| 国产精品国产三级国产专播精品人| 亚洲男人天堂2024| 美日韩精品视频| 亚洲美女av网站|