日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算机图形学有序边表作业,《计算机图形学》有序边表填充算法.docx

發布時間:2024/9/27 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机图形学有序边表作业,《计算机图形学》有序边表填充算法.docx 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

實驗報告

實驗目的

1、掌握有序邊表算法填充多邊形區域;

2、理解多邊形填充算法的意義;

3、增強C語言編程能力。

算法原理介紹

根據多邊形內部點的連續性知:一條掃描線與多邊形的交點中,入點和出點之間所 有點都是多邊形的內部點。所以,對所有的掃描線填充入點到出點之間所有的點就可填 充多邊形。

判斷掃描線上的點是否在多邊形之內,對于一條掃描線,多邊形的掃描轉換過程可 以分為四個步驟:

(1)求交:計算掃描線與多邊形各邊的交點;

(2)排序:把所有交點按x值遞增順序排序;

(3)配對:第一個與第二個,第三個與第四個等等;每對交點代表掃描線與多邊 形的一個相交區間;

(4)著色:把相交區間內的象素置成多邊形顏色,把相交區間外的象素置成背景 色。

p1,p3,p4,p5屬于局部極值點,要把他們兩次存入交點表中。如掃描線y=7上的交

點中,有交點(2,7,13),按常規方法填充不正確,而要把頂點(7,7)兩次存入交點表中 (2,7,7,13)。p2, p6為非極值點,則不用如上處理。

為了提高效率,在處理一條掃描線時,僅對與它相交的多邊形的邊進行求交運算。 把與當前掃描線相交的邊稱為活性邊,并把它們按與掃描線交點x坐標遞增的順序存放 在一個鏈表中,稱此鏈表為活性邊表(AET)。

對每一條掃描線都建立一個與它相交的多邊形的活性邊表(AET。每個AET的一

個節點代表一條活性邊,它包含三項內容

x -當前掃描線與這條邊交點的x坐標;

△ x -該邊與當前掃描線交點到下一條掃描線交點的x增量;

ymax -該邊最高頂點相交的掃描線號。

每條掃描線的活性邊表中的活性邊節點按照各活性邊與掃描線交點的x值遞增排序

連接在一起。

當掃描線y移動到下一條掃描線y = y+1時,活性邊表需要更新,即刪去不與新掃 描線相交的多邊形邊,同時增加與新掃描線相交的多邊形邊,并根據增量法重新計 算掃描線與各邊的交點x。

當多邊形新邊表ET構成后,按下列步驟進行:

對每一條掃描線i,初始化ET表的表頭指針ET[i];

將ymax = i的邊放入ET[i]中;

使y=多邊形最低的掃描線號;

初始化活性邊表AET為空;

循環,直到AET和ET為空。

將新邊表ET中對應y值的新邊節點插入到AET表。

遍歷AET表,將兩兩配對的交點之間填充給定顏色值。

遍歷AET表,將ymax= y的邊節點從AET表中刪除,并將ymax> y的各邊節點 的x值遞增△ x;并重新排序。

y增加1。

三、程序源代碼

#in elude "graphics.h"

#defi ne WINDOW_HEIGHT 480

#define NULL 0

#i nclude "alloc.h"

#i nclude "stdio.h"

#i nclude "dos.h"

#i nclude "con io.h"

typedefstruct tEdge/*typedef是將結構定義成數據類型*/

{ int ymax;/*邊所交的最高掃描線號*/

float x;/*當前掃描線與邊的交點的x值*/

float dx;/*從當前掃描線到下一條掃描線之間的 x增量*/

struct tEdge *n ext;

}Edge;

typedef struct poi nt{int x,y;}POINT;/*將結點插入邊表的主體函數

typedef struct poi nt{int x,y;}POINT;

/*將結點插入邊表的主體函數*/

void In sertEdge(Edge *list,Edge *edge)/* {

Edge *p,*q=list;

p=q->n ext;/*

while(p!=NULL)/*

{

if(edge->xx) /* p=NULL;

else/*

{q=p; p=p->n ext;

}

}

edge->n ext=q->n ext; q->n ext=edge;

}

活性邊edge插入活性邊表list中*/

記住q原來所指之結點*/ 按x值非遞減順序增加邊表*/ 要插入的邊的x較大不應該在當前插入*/

要插入的邊的x較小應該在當前插入*/

/* 使欲插入之結點edge指向q原來所指之結點*/

/*使q指向插入之結點*/

int yNext(int k,int cnt,POINT *pts)

/*對于多邊形中的某個頂點序號k(0,1...6),返回下一頂點的縱坐標,如果這2 個頂點所在邊是 水平的,則順延,即返回第(k+2)個頂點的縱坐標),cnt是頂點個數 +1,pts指向多邊形頂點結構體的指針*/

{

int j;

if((k+1)>(cnt-1))/*當前頂點為最后一個頂點,則下一個頂點為第0個頂點*/

j=0;

e

總結

以上是生活随笔為你收集整理的计算机图形学有序边表作业,《计算机图形学》有序边表填充算法.docx的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。