| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6645 人关注过本帖, 1 人收藏
标题:多边形扫描转换算法
只看楼主 加入收藏
blueboy82006
Rank: 5Rank: 5
来 自:幻想世界
等 级:贵宾
威 望:16
帖 子:1227
专家分:57
注 册:2007-7-23
结帖率:0
收藏(1)
 问题点数:0 回复次数:9 
多边形扫描转换算法
最近学习计算机图形学,写了个多边形扫描转换算法,贴出来分享一下;
图片附件: 游客没有浏览图片的权限,请 登录注册

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[i].y>MaxY)
            MaxY=polypoint[i].y;
        
/*******初始化AET表***********************************************************/
        AET *pAET=new AET;
        pAET->next=NULL;
        
/******初始化NET表************************************************************/
        NET *pNET[1024];
        for(i=0;i<=MaxY;i++)
        {
            pNET[i]=new NET;
            pNET[i]->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[i]->next;
                        pNET[i]->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[i]->next;
                        pNET[i]->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先排序*************************************************************/
                //断表排序,不再开辟空间
            AET *tq=pAET;
            p=pAET->next;
            tq->next=NULL;
            while(p)
            {
                while(tq->next && p->x >= tq->next->x)
                    tq=tq->next;
                NET *s=p->next;
                p->next=tq->next;
                tq->next=p;
                p=s;
                tq=pAET;
            }
    //(改进算法)先从AET表中删除ymax==i的结点****************************************/
            AET *q=pAET;
            p=q->next;
            while(p)
            {
                if(p->ymax==i)
                {
                    q->next=p->next;
                    delete p;
                    p=q->next;
                }
                else
                {
                    q=q->next;
                    p=q->next;
                }
            }
    //将NET中的新点加入AET,并用插入法按X值递增排序**********************************/
            p=pNET[i]->next;
            q=pAET;
            while(p)
            {
                while(q->next && p->x >= q->next->x)
                    q=q->next;
                NET *s=p->next;
                p->next=q->next;
                q->next=p;
                p=s;
                q=pAET;
            }
/******配对填充颜色***************************************************************/
            p=pAET->next;
            while(p && p->next)
            {
                for(float j=p->x;j<=p->next->x;j++)
                    pDC->SetPixel(static_cast<int>(j),i,RGB(255,0,0));
                p=p->next->next;//考虑端点情况
            }    
        }
}


PolyFill.rar (1.84 MB)
搜索更多相关主题的帖子: 多边形 算法 扫描 
2008-10-18 12:43
lmyouya
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2008-10-17
收藏
得分:0 
很牛!
什么时候才有精华贴吖!我

吖吖走了
2008-10-18 15:12
blueboy82006
Rank: 5Rank: 5
来 自:幻想世界
等 级:贵宾
威 望:16
帖 子:1227
专家分:57
注 册:2007-7-23
收藏
得分:0 
好你个涛子,下我代码还不回贴...
你惨了...

2008-10-20 12:15
oladyru
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-10-20
收藏
得分:0 
还看不懂。。。。。。。。。。
2008-10-27 21:07
yyj692471453
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2008-8-14
收藏
得分:0 
我在学计算机图形学,不过是专业选修课,上课没怎么听,貌似你的代码要花点时间消化,谢谢楼主.
2008-10-28 22:22
blueboy82006
Rank: 5Rank: 5
来 自:幻想世界
等 级:贵宾
威 望:16
帖 子:1227
专家分:57
注 册:2007-7-23
收藏
得分:0 
[bo][un]yyj692471453[/un] 在 2008-10-28 22:22 的发言:[/bo]

我在学计算机图形学,不过是专业选修课,上课没怎么听,貌似你的代码要花点时间消化,谢谢楼主.

现在又发现好多能改进的地方...

2008-10-28 22:33
入门级弟子
Rank: 1
来 自:深圳
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-10-31
收藏
得分:0 
人过留名,雁过留声!

努力学习!
2008-11-04 18:11
mbstorm
Rank: 1
等 级:新手上路
帖 子:166
专家分:0
注 册:2008-10-31
收藏
得分:0 
楼主,能给我解释一下吗?!看不懂……
2008-11-04 21:58
ronaldowsy
Rank: 1
等 级:新手上路
帖 子:68
专家分:0
注 册:2008-10-20
收藏
得分:0 
呵呵,这是用MFC写出来的代码,而且代码是直接写在ONDraw里面的
如果想学好MFC,我建议你还是先学好API吧!因为MFC全是API函数的封装,我可以这么给你说,你在MFC中根本找不到MAIN函数,不信你可以试一试,MFC中的MAIN藏的很深很深,这就是微软的厉害之处!你还在学习MFC的初级阶段!刚开始接触图形编程吧,慢慢的到后面就会明白很多了!
2008-11-06 02:39
半夏第一天
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-12-13
收藏
得分:0 
为什么我用vc++运行的时候,总是提示有一个错误。求解???
2012-12-14 16:24
快速回复:多边形扫描转换算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029606 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved