📄 polydisp.cpp
字号:
// PolyDisp.cpp: implementation of the CPolyDisp class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Poly.h"
#include "PolyDisp.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
/*#define round(x) ((x>0)?(int)(x+0.5):(int)(x-0.5))
struct edge
{
int ymax;
float xi;
float m;
struct edge *next;
};*/
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CPolyDisp::CPolyDisp()
{
}
CPolyDisp::~CPolyDisp()
{
}
CPolyDisp::CPolyDisp(CDC *poDC)
{
pDC = poDC;
}
void CPolyDisp::insert_et(struct edge *anedge,struct edge **p_edges)
{
struct edge *p;
p=*p_edges;
*p_edges=anedge;
anedge->next=p;
}
short CPolyDisp::insert_aet(struct edge *p,struct edge **p_aet)
{
struct edge *q,*k,*l;
if(!(q=(struct edge *)malloc(sizeof(struct edge))))
{
printf("\nOUT MEMORY IN INSERTING EDGE RECORD TO AET\n");
return(0);
}
q->ymax=p->ymax; q->xi=p->xi;
q->m=p->m; q->next=NULL;
if(!(*p_aet)||((*p_aet)->xi>q->xi)||(((*p_aet)->xi==q->xi)&&((*p_aet)->m>q->m)))
{
l=*p_aet; *p_aet=q; q->next=l;
}
else
{
l=*p_aet;
k=l->next;
while(k&&(k->xi<q->xi))
{
l=k;
k=k->next;
}
if(k&&(k->xi==q->xi)&&(k->m<q->m))
{
l=k;
k=k->next;
}
l->next=q;
q->next=k;
}
return(1);
}
void CPolyDisp::draw_line(int x1,int x2,int y,COLORREF crColor)
{
int i;
//y=getmaxy()-y;
for(i=x1+1;i<=x2-1;i++)
pDC->SetPixel(i,y,crColor);
}
void CPolyDisp::poly_fill(CDC *pDC,int numpoint,int *points,COLORREF crColor)
{
struct edge **et=NULL,*aet,*anedge,*p,*q;
//*et=new struct edge[];
//aet=new struct edge[];
int i,j,maxy,miny,x1,y1,x2,y2,yi,znum;
maxy=miny=points[1];
znum=2*numpoint;
for(i=3;i<znum;i++)
{
if(maxy<points[i]) maxy=points[i];
else if(miny>points[i])miny=points[i];
i++;
}
if(!(et=(struct edge **)malloc((maxy-miny+1)*sizeof(struct edge *))))
{
printf("\nOUT MEMORY IN CONSTRUCTING ET\n");
return;
}
for(i=0;i<maxy-miny+1;i++) et[i]=NULL;
x1=points[znum-2]; y1=points[znum-1];
for(i=0;i<znum;i+=2)
{
x2=points[i]; y2=points[i+1];
if(y1!=y2)
{
if(!(anedge=(struct edge *)malloc(sizeof(struct edge *))))
{printf("\nOUT MEMORY IN CONSTRUCTING EDGE RECORD.\n");
goto quit;
}
anedge->m=(float)(x2-x1)/(y2-y1);
anedge->next=NULL;
if(y2>y1)
{
j=i+1;
do{
if((j+=2)>znum) j-=znum;
}while(points[j]==y2);
if(points[j]>y2) anedge->ymax=y2-1;
else anedge->ymax=y2;
anedge->xi=x1;
insert_et(anedge,&et[y1-miny]);
}
else
{
j=i+1;
do{
if(j-=2) j+=znum;
}while(points[j]==y1);
if(points[j]>y1) anedge->ymax=y1;
else anedge->ymax=y1;
anedge->xi=x2;
insert_et(anedge,&et[y2-miny]);
}
}
x1=x2;
y1=y2;
}
aet=NULL;
for(yi=miny;yi<maxy;yi++)
{
p=et[yi-miny];
while(p)
{
if(!insert_aet(p,&aet)) goto quit;
p=p->next;
}
p=aet;
while(p)
{ //void lineDDA(int x1, int y1, int x2, int y2, COLORREF crColor)
draw_line(round(p->xi),round(p->next->xi),yi,crColor);
//lineDDA(p->xi,yi,p->next->xi,yi,color);
p=p->next->next;
}
p=aet;
while(p&&(p->ymax==yi))
{
aet=p->next;
free(p);
p=aet;
}
while(p)
{
if(p->ymax==yi)
{
q->next=p->next;
free(p);
p=q->next;
}
else
{
p->xi+=p->m;
q=p;
p=p->next;
}
}
}
/*quit:
if(et)
{
for(yi=miny;yi<=maxy;yi++)
{
q=p=et[yi-miny];
while(p)
{
q=p->next;
free(p);
p=q;
}
}
free(et);
}*/
quit:
if(et)
{
for(yi=miny;yi=maxy;yi++)
{
q=p=et[yi-miny];
while(p)
{
q=p->next ;
free(p);
p=q;
}
}
free(et);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -