当前位置:首页 » 操作系统 » 多边形扫描转换算法

多边形扫描转换算法

发布时间: 2022-02-14 14:53:03

1. 多边形扫描转换中,活性边表的数据结构有哪几项

算法用到的数据结构有:

typedef struct nodeEdge
{
int ymax; //边的上端点的y坐标
float x; //在AEL中表示当前扫描线与边的交点的x坐标,
//初值(即在ET中的值)为边的下端点x的坐标
float deltax; //边的斜率的倒数
nodeEdge *nextEdge; //指向下一条边的指针
}Edge; //边的分类表和活化边表的数据结构(扫描转换多边形的扫描线算法)

void CGraphicsView::SCanPolygon(int color,CDC*pDC)
{
//扫描转换多边形—扫描线算法
Edge *et[ARRLENGTH];
Edge e[90];
Edge* ael;
Edge test;
Edge *left,*right; //left和right做配对用
int i;

for(i=0;i<ARRLENGTH;i++)
{
et[i]=NULL;
}

//手动生成et表
e[0].ymax=40; e[0].x=50; e[0].deltax=-1; e[0].nextEdge=&e[20];
e[20].ymax=50; e[20].x=70; e[20].deltax=5.0/4; e[20].nextEdge=NULL;
e[60].ymax=80; e[60].x=20; e[60].deltax=0; e[60].nextEdge=NULL;
e[30].ymax=110; e[30].x=120; e[30].deltax=0; e[30].nextEdge=NULL;
e[50].ymax=80; e[50].x=70; e[50].deltax=-5; e[50].nextEdge=&e[40];
e[40].ymax=110; e[40].x=70; e[40].deltax=5.0/4; e[40].nextEdge=NULL;
et[0]=NULL; et[10]=&e[0]; et[20]=NULL; et[30]=NULL;
et[40]=&e[60]; et[50]=&e[30]; et[60]=NULL; et[70]=&e[50]; et[80]=NULL;

2. 计算机图形学实验:多边形的扫描转换与填充

靠,问题描述这么清楚,肯定是从书上看的,你们自己发的计算机图形学书上就有算法吧。自己懒的编吧、

3. 图形学:谁有扫描转换多边形的扫描线算法,wtc下可执行的程序最好

http://renjie120.bokee.com/viewdiary.15042912.html

http://topic.csdn.net/u/20080903/08/c1cee87d-2825-42a5-982c-43019794bc44.html

看看吧!

4. 任意给定五边形的5个顶点坐标,利用多边形填充的扫描算法,编写程序生成一个实心五边形

//////////////////////////////////////////////////////////////////////////////////////////////////
// 功能: 填充多边形
//
// 参数: lpPoints: 指向顶点坐标数组的指针,数组类型为POINT,多边形由它们顺次封闭连接得到
// nCount: 顶点的个数
// nColor: 填充的颜色 默认为黑色
// pDC: 设备句柄指针
//
// 返回: 无返回值
//
// 说明: 可以是边相交的多边形
//
//////////////////////////////////////////////////////////////////////////////////////////////////
void FillPolygon(LPPOINT lpPoints,int nCount, CDC *pDC, int nColor/*=0*/)
{
// 检查参数合法性
ASSERT_VALID(pDC);
ASSERT(lpPoints);
ASSERT(nCount>2);
ASSERT(nColor>=0);

// 边结构数据类型
typedef struct Edge{
int ymax; // 边的最大y坐标
float x; // 与当前扫描线的交点x坐标
float dx; // 边所在直线斜率的倒数
struct Edge * pNext; // 指向下一条边
}Edge, * LPEdge;

int i=0,j=0,k=0;
int y0=0,y1=0; // 扫描线的最大和最小y坐标
LPEdge pAET=NULL; // 活化边表头指针
LPEdge * pET=NULL; // 边表头指针

pAET=new Edge; // 初始化表头指针,第一个元素不用
pAET->pNext=NULL;

// 获取y方向扫描线边界
y0=y1=lpPoints[0].y;
for(i=1;i<nCount;i++)
{
if(lpPoints[i].y<y0)
y0=lpPoints[i].y;
else if(lpPoints[i].y>y1)
y1=lpPoints[i].y;
}
if(y0>=y1) return;

// 初始化边表,第一个元素不用
pET=new LPEdge[y1-y0+1];
for(i=0;i<=y1-y0;i++)
{
pET[i]= new Edge;
pET[i]->pNext=NULL;
}

for(i=0;i<nCount;i++)
{
j=(i+1)%nCount; // 组成边的下一点
if(lpPoints[i].y != lpPoints[j].y)// 如果该边不是水平的则加入边表
{
LPEdge peg; // 指向该边的指针
LPEdge ppeg; // 指向边指针的指针

// 构造边
peg =new Edge;
k=(lpPoints[i].y>lpPoints[j].y)?i:j;
peg->ymax=lpPoints[k].y; // 该边最大y坐标
k=(k==j)?i:j;
peg->x=(float)lpPoints[k].x; // 该边与扫描线焦点x坐标
if(lpPoints[i].y != lpPoints[j].y)
peg->dx=(float)(lpPoints[i].x-lpPoints[j].x)/(lpPoints[i].y-lpPoints[j].y);// 该边斜率的倒数
peg->pNext=NULL;

// 插入边
ppeg=pET[lpPoints[k].y-y0];
while(ppeg->pNext)
ppeg=ppeg->pNext;
ppeg->pNext=peg;
}// end if
}// end for i

// 扫描
for(i=y0;i<=y1;i++)
{
LPEdge peg0=pET[i-y0]->pNext;
LPEdge peg1=pET[i-y0];
if(peg0)// 有新边加入
{
while(peg1->pNext)
peg1=peg1->pNext;
peg1->pNext=pAET->pNext;
pAET->pNext=peg0;
}

// 按照x递增排序pAET
peg0=pAET;
while(peg0->pNext)
{
LPEdge pegmax=peg0;
LPEdge peg1=peg0;
LPEdge pegi=NULL;

while(peg1->pNext)
{
if(peg1->pNext->x>pegmax->pNext->x)
pegmax=peg1;
peg1=peg1->pNext;
}
pegi=pegmax->pNext;
pegmax->pNext=pegi->pNext;
pegi->pNext=pAET->pNext;
pAET->pNext=pegi;
if(peg0 == pAET)
peg0=pegi;
}

// 遍历活边表,画线
peg0=pAET;
while(peg0->pNext)
{
if(peg0->pNext->pNext)
{
DrawLine((int)peg0->pNext->x,i,(int)peg0->pNext->pNext->x,i,pDC,nColor);
peg0=peg0->pNext->pNext;
}
else
break;
}

// 把ymax=i的节点从活边表删除并把每个节点的x值递增dx
peg0=pAET;
while(peg0->pNext)
{
if(peg0->pNext->ymax < i+2)
{
peg1=peg0->pNext;
peg0->pNext=peg0->pNext->pNext; //删除
delete peg1;
continue;
}
peg0->pNext->x+=peg0->pNext->dx; //把每个节点的x值递增dx
peg0=peg0->pNext;
}
}

// 删除边表
for(i=0;i<y1-y0;i++)
if(pET[i])
delete pET[i];
if(pAET)
delete pAET;
if(pET)
delete[] pET;
}

5. 谁帮我写个算法:多边形的扫描转换

不会啊

6. 边缘填充算法属于()算法一种。

边缘填充算法属于A 多边形扫描转换

7. 急求用C语言编写的扫描线填充多边形的算法

可惜,分少了。
去投票或回答问题弄50+分,问题加到50分+就可以办了。能给我投几票就更好了。( ⊙ o ⊙ )

8. 扫描转换多边形 问题OpenGL 求助

你是想把任意多边形切割成三角形,好让opengl来绘制吗?
你可以搜索下 割耳朵 算法.

9. 有没有完整的计算机图形学多边形扫描转换的算法

freetype就是一个。您在freetype的list中可以看到很多。
agg,fog都可以。

热点内容
dz数据库配置 发布:2024-12-29 13:21:42 浏览:507
什么是编译后执行 发布:2024-12-29 13:12:28 浏览:346
电脑服务器蓝屏怎么办 发布:2024-12-29 12:59:31 浏览:383
科学的算法 发布:2024-12-29 12:58:50 浏览:874
百战沙城脚本 发布:2024-12-29 12:35:23 浏览:756
188旅游网站源码 发布:2024-12-29 12:18:17 浏览:361
memcache设置缓存时间设置 发布:2024-12-29 12:06:51 浏览:939
交运换算法 发布:2024-12-29 11:56:59 浏览:964
魅族保存网页在哪个文件夹 发布:2024-12-29 11:38:02 浏览:53
安卓光遇耳机下一个复刻是什么 发布:2024-12-29 11:36:41 浏览:271