C++编程:多边形扫描转换算法
来源:优易学  2010-1-14 19:31:47   【优易学:中国教育考试门户网】   资料下载   IT书店

  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;
  }

[1] [2] 下一页

责任编辑:cyth

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训