一个算法,输入多边形顶点坐标的逆时针序列,输出正确填写的ET表。
void CEdgeTable::Init(PointArray& ptArray) { Create(ptArray);//创建ET表,一个链表指针下只有一个吊桶 Sort();//对ET表中的吊桶按ymin由小到大排序 Merge();//排序后的ET表中的吊桶,若相邻吊桶有相同ymin,则相邻吊桶合并到同一个链表指针下
}
void CEdgeTable::Create(PointArray& ptArray) { int count=ptArray.GetSize (); CActiveEdgeTable* AET; for(int i=1;i<=count;i++){ if(ptArray[i-1].y !=ptArray[i%count].y )//去掉水平边 { if(((ptArray[i-1].y >=ptArray[i%count].y ) &&(ptArray[(i+1)%count].y >=ptArray[i%count].y)) ||((ptArray[i-1].y <=ptArray[i%count].y ) &&(ptArray[(i+1)%count].y <=ptArray[i%count].y))){ AET=new CActiveEdgeTable(ptArray[i-1],ptArray[i%count]);//局部极值点
}else{ AET=new CActiveEdgeTable(ptArray[i-1],ptArray[i%count],FALSE);//非局部极值点
} ETlist.Add (AET); } } }
void CEdgeTable::Sort(void) { int count=ETlist.GetSize (); CActiveEdgeTable* t; for(int a=1;a
void CEdgeTable::Merge() {
CActiveEdgeTable *pre,*cur; for(int i=1;i
9.多边形扫描转换的活跃边表算法如何处理给出顶点序列连成多边形时各边有相交的情况?如何处理多边形内部又有多边形空洞的情况?请举例说明。
当各边有相交的情况,在进行完x?x?1步骤之后,可能破坏了AET表中各项x坐m标的递增次序,故应按x坐标递增重新排序,正常填充。
当多边形内部又有多边形空洞的情况,依据区域的奇偶性质,以及局部极大局部极小的特点,正常填充。
自相交多边形 带有空洞的多边形
10.设五边形的五个顶点是(10.5,10.5),(15,5),(12,5),(8,2.5),(4,5.5),要利用使用活跃边表的扫描转换算法进行填充,写出应填写的ET表,写出活跃边表的变化情况。
e2
e3
e1
e4
e5
∧ ET:
Y吊桶表 … 6
13 ∧ 12 ∧ 11 ∧ 10 ∧ 9 ∧ 8 ∧ 7 e2 2e/∧ 5 7/5 3 11 56 11 141/∧ 3 -2/3 5 ∧ 4 ∧ e1 e5 3 6 8 -4/3 5 8 2 ∧ 2
∧ ymax xmin 1/m AET指针 初始化 ∧
e1 e5 扫描线3 扫描线4 扫描线5 扫描线6 扫描线7 扫描线8 扫描线9 扫描线10 扫描线11 扫描线12 ∧
6 8 e1 -4/3 5 5 5 8 e5 2 2 e5 ∧ ∧ ∧
6 62/3 -4/3 e1 6 51/3 -4/3 e1 6 4 e2 10 12 e3 2 -4/3 7/5 2 11 141/3 -2/3 ∧
e3 11 132/3 -2/3 ∧
e3 11 13 e3 11 52/5 e11 64/5 e2 7/5 7/5 2 -2/3 ∧
11 81/5 e11 121/3 -2/3 ∧
e3 11 112/3 -2/3 ∧
e3 11 11 -2/3 ∧
11 93/5 e2 7/5 7/5 11 11
12.修改画圆的Bresenham算法使能画出椭圆,设椭圆中心在坐标原点,长轴和短轴分别为a和b。
利用Bresenham画圆算法画椭圆
dyb2x??2?1 dxay令x?0,y?0
(1)在x?[0,x0]上,x0满足b2x0?a2y0,x?x?1,y值变化小于1。 (2)在x?[x0,a]上,x0满足b2x0?a2y0,y?y?1,x值变化小于1。 情况(1)如图
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库计算机图形学课后题答案--许长青、许志闻(3)在线全文阅读。
相关推荐: