| 
       
    
     经验:      | 发帖: 4773 | 粉丝: 1 |        | 铜币: 254 | 龙鳞: 127 |  Lv12 精灵:
  
 
  
 
 
  
 
 294魔堡金豆0闪耀金条396元气能量1044超凡耐力
 |  |  |              C++多边形扫描转换算法                  
最近学习计算机图形学,写了个多边形扫描转换算法,贴出来分享一下;
 MFC还不是太明白,主要还是使用OnDraw函数...
 大家多指教...
 void CPolyFillView::OnDraw(CDC* pDC)
 {
 CPolyFillDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 // TODO: add draw code for native data here
 const int POINTNUM=6; //多边形点数.
 /定义结构体用于活性边表AET和新边表NET/
 typedef struct XET
 {
 float x;
 float dx,ymax;
 XET* next;
 }AET,NET;
 /定义点结构体point*/
 struct point
 {
 float x;
 float y;
 }polypoint[POINTNUM]={250,50,550,150,550,400,250,250,100,350,100,100};//多边形顶点
 //mypoint[POINTNUM]={100,100,200,100,200,200,100,200};//正方形
 /计算最高点的y坐标(扫描到此结束)**/
 int MaxY=0;
 int i;
 for(i=0;i<POINTNUM;i++)
 if(polypoint.y>MaxY)
 MaxY=polypoint.y;
 /*初始化AET表/
 AET *pAET=new AET;
 pAET->next=NULL;
 /初始化NET表*/
 NET *pNET[1024];
 
 for(i=0;i<=MaxY;i++)
 {
 pNET=new NET;
 pNET->next=NULL;
 }
 /扫描并建立NET表*/
 for(i=0;i<=MaxY;i++)
 {
 for(int j=0;j<POINTNUM;j++)
 if(polypoint[j].y==i)
 {
 if(polypoint[(j-1+POINTNUM)%POINTNUM].y>polypoint[j].y)
 {
 NET *p=new NET;
 p->x=polypoint[j].x;
 p->ymax=polypoint[(j-1+POINTNUM)%POINTNUM].y;
 p->dx=(polypoint[(j-1+POINTNUM)%POINTNUM].x-polypoint[j].x)/(polypoint[(j-1+POINTNUM)%POINTNUM].y-polypoint[j].y);
 p->next=pNET->next;
 pNET->next=p;
 }
 if(polypoint[(j+1+POINTNUM)%POINTNUM].y>polypoint[j].y)
 {
 NET *p=new NET;
 p->x=polypoint[j].x;
 p->ymax=polypoint[(j+1+POINTNUM)%POINTNUM].y;
 p->dx=(polypoint[(j+1+POINTNUM)%POINTNUM].x-polypoint[j].x)/(polypoint[(j+1+POINTNUM)%POINTNUM].y-polypoint[j].y);
 p->next=pNET->next;
 pNET->next=p;
 }
 }
 }
 /建立并更新活性边表AET/
 for(i=0;i<=MaxY;i++)
 {
 //计算新的交点x,更新AET/
 NET *p=pAET->next;
 while(p)
 {
 p->x=p->x + p->dx;
 p=p->next;
 }
 //更新后新AET先排序
 
 
    👀 温馨提示:部分内容需登录后查阅。立即登录
中华游戏网 cnyouw.cn   |