⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 polydisp.cpp

📁 有用的东西哦!和大家一起分享咧!以后要多交流哦!
💻 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 + -