• 大小: 9KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-05-10
  • 语言: C/C++
  • 标签: 图形学  

资源简介

江苏科技大学计科专业计算机图形学实验图形区域填充代码,列表应该还有实验报告

资源截图

代码片段和文件信息

/**************************
 * Includes
 *
 **************************/

#include 
#include 
#include “gl/glut.h“
#include “windows.h“
const int POINTNUM=7; //多边形点数.

/******定义结构体用于活性边表AET和新边表NET***********************************/
 typedef struct XET
 {
  float x;
  float dxymax;
  XET* next;
 }AETNET;

/******定义点结构体point******************************************************/
 struct point
 {
  float x;
  float y;
 }
 polypoint[POINTNUM]={2505055015055040025025010035010010012030};//多边形顶点

 void PolyScan()
{
/******计算最高点的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;
  }
  glClear(GL_COLOR_BUFFER_BIT);        //赋值的窗口显示.  
  glColor3f(0.00.00.0);             //设置直线的颜色红色
  glBegin(GL_POINTS);
/******扫描并建立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=p

评论

共有 条评论