多邊形掃描轉換演算法
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都可以。