OpenGL 多邊形的掃瞄轉換

2021-09-01 23:38:29 字數 1958 閱讀 2398

一、理論

求交:計算掃瞄線與多邊形各邊的交點

排序:把所有交點按遞增順序進行排序

交點配對:第乙個與第二個,第三個與第四個(保證交點的個數為偶數個)

區間填色:把這些相交區間內的畫素置成不同與背景色的填充色

在填充過程中應該考慮兩個問題:一是當掃瞄線與多邊形頂點相交時,交點的取捨問題。二是多邊形邊界上的畫素的取捨問題。

對於第二個問題,應該考慮邊界上的畫素的取捨問題,例如對於左下角為(1,1)右上角為(3,3)的正方形填充時,若對邊界上的所有畫素進行填充,就會得到乙個3x3的正方形,所以規定右/上邊界的畫素不予填充,左/下邊界的畫素進行填充.通常為了提高效率只是對與多邊形相交的邊進行求交計算。把處理的資料存放在行相應的鍊錶中。

為了計算每條掃瞄線與各多邊形各邊的交點,最簡單的辦法就是把多邊形的所有邊放在乙個表中。在處理每條掃瞄線的時,按照順序從表中取出所有的邊,分別於掃瞄線求交。為了提高效率,在處理一條掃瞄線的時候,僅對與它相交的多邊形的邊進行求交運算。我們把當前掃瞄線相交的邊稱為活性邊,並把它們按照與掃瞄線交點x座標遞增的順序存放在乙個鍊錶中,此鍊錶稱為活性邊表。活性邊表的每個節點存放著相關定點的資訊,如掃瞄線與該邊的交點x,邊所跨的掃瞄線的條數等等.由於邊的連貫性,以及掃瞄線的連續性,在當前掃瞄線處理完畢之後,我們不必為下一條掃瞄線從頭開始構造活性鍊錶,而只是對當前的活性鍊錶進行適當的修改.

#include #include const int pointnum = 7;

//鍊錶的實現

typedef struct xetaet, net;

//結構體對於某乙個點的實現

struct point

polypoint[pointnum] = ;//頂點座標的位置

void polyscan()

//選出最大的頂點所對應的y值

aet *paet = new aet;

paet->next = null;

net *pnet[1024];

for (i = 0; i <= maxy; i++)//初始化掃瞄邊的活性邊表

glclear(gl_color_buffer_bit);

glcolor3f(0.0, 0.0, 0.0);

glbegin(gl_points);

//乙個點跟前面的點形成一條線段,同時跟後面乙個點形成線段

for (i = 0; i < maxy; i++)

if (polypoint[(j + 1 + pointnum) % pointnum].y > polypoint[j].y)

}} }

//把新邊表net[i]中的邊節點用插入排序法插入aet表,使之按照x的座標遞增順序排序

for (i = 0; i <= maxy; i++)

aet *tq = paet;

p = paet->next;

tq->next = null;

while (p)

//遍歷aet表,把配對交點的區間(左閉右開)上的畫素(x,y)

多邊形掃瞄轉換演算法

1.多邊形的頂點表示轉換為多邊形的點陣表示 1 頂點表示 用多邊形的頂點的序列來描述多邊形,幾何意義強 佔記憶體少。2 點陣表示 用位於多邊形內的畫素的集合來描述多邊形。3 轉換基本思想 按掃瞄線順序,計算掃瞄線與多邊形的相交區間,再用要求的顏色顯示這些區間的所有象素 2.x掃瞄線演算法的演算法步驟...

多邊形的掃瞄轉換與區域填充

在計算機圖形學中,多邊形有兩種重要的表示方法 頂點表示和點陣表示。頂點表示是用多邊形的頂點序列來表示多邊形。這種表示直觀 幾何意義強 佔記憶體少,易於進行幾何變換,但由於它沒有明確指出哪些象素在多邊形內,故不能直接用於面著色 點陣表示是用位於多邊形內的象素集合來刻畫多邊形。這種表示丟失了許多幾何資訊...

OpenGL 多邊形偏移

include gltools.h include glshadermanager.h include else define freeglut static include endif gluint list glint spinx 0 glint spiny 0 glfloat tdist 0....