多边形的扫描转换matlab实现,多边形扫描转换算法

难得有机会写写代码,发这留纪念吧:

多边形扫描转换算法,用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

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

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(j),i,RGB(255,0,0));

p=p->next->next;//考虑端点情况

}

}

}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值