




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、習(xí)題4. 在本章第一節(jié)說明Bresenham算法如何選擇下一個(gè)像素點(diǎn)位置的圖2-3中,其實(shí)是假定了在當(dāng)前選擇的點(diǎn)是(x,y)時(shí),真正直線與橫坐標(biāo)為x+1的直線的交點(diǎn)是在y和y+1之間。如果不是這樣,而是下面兩種情況:在y到y(tǒng)-1之間。例如從(0,0)到(7,2)的直線,在點(diǎn)(2,1)處向后。在y+1到y(tǒng)+2之間。例如從(0,0)到(7,5)的直線,在點(diǎn)(2,1)處向后。試說明為什么對所列兩種情況算法仍能正確地工作。解答:在給出兩種情況下,Bresenham算法仍然能夠正確工作的原因是判別式d保證了在這兩種總情況下,仍然能正確的取到最接近真正直線的像素點(diǎn)。在Bresenham算法中,按照判別式d
2、的正負(fù)來決定選擇哪一點(diǎn)作為下一個(gè)像素點(diǎn),判別式d如下計(jì)算:d = d1 d2。其中d1 = yp y,d2= y + 1 yp,y是當(dāng)前選中點(diǎn)(x,y)的縱坐標(biāo),yp是真正直線與橫坐標(biāo)為x+1的直線的交點(diǎn)的縱坐標(biāo)。當(dāng)d0時(shí),取上點(diǎn),即(x+1,y+1)作為下一個(gè)像素點(diǎn),當(dāng)d0時(shí),取下點(diǎn),即(x+1,y)作為下一個(gè)像素點(diǎn)。這里還要說明一下,因?yàn)榇颂幨前凑諘辖o出的Bresenham算法來進(jìn)行像素選擇的,所以實(shí)際上有一個(gè)先決條件,即直線的斜率處于0和1之間。只要保證斜率滿足條件,在當(dāng)前選擇的點(diǎn)是(x,y)時(shí),真正直線與橫坐標(biāo)為x+1的直線的交點(diǎn)即使不在y和y+1之間,書上所給的Bresenham都
3、可以正確工作。題目所給兩種情況中的直線斜率都滿足算法的先決條件。在第(1)種情況下,如下圖所示:當(dāng)前選擇點(diǎn)為(x,y),下一點(diǎn)實(shí)際為P點(diǎn),該點(diǎn)處于(x+1,y-1)和(x+1,y)兩點(diǎn)之間,實(shí)際應(yīng)取(x+1,y)點(diǎn)作為下一個(gè)像素點(diǎn)?,F(xiàn)在來看一下為什么一定會(huì)取(x+1,y)點(diǎn)作為下一個(gè)像素點(diǎn),而不是取(x+1,y-1)點(diǎn)作為下一個(gè)像素點(diǎn)。設(shè)Q點(diǎn)為選擇(x,y)點(diǎn)作為顯示像素點(diǎn)時(shí)實(shí)際的直線上的點(diǎn),根據(jù)Bresenham算法的特點(diǎn)Q點(diǎn)的縱坐標(biāo)yq一定滿足y-0,5yqy+0.5,否則不會(huì)選擇(x,y)點(diǎn)作為顯示像素點(diǎn),因?yàn)镻點(diǎn)的縱坐標(biāo)處于y和y-1之間,所以y-0.5yqy,否則該直線斜率將不滿足條
4、件(直線斜率將小于0)。當(dāng)y-0,5yqy時(shí),則一定有y-0,5ypy,因?yàn)槿绻鹹py-0.5,則P點(diǎn)的縱坐標(biāo)會(huì)比Q點(diǎn)縱坐標(biāo)更小,這時(shí)直線的斜率就不滿足先決條件了(直線斜率將小于0)。所以因?yàn)橹本€斜率先決條件的限制,當(dāng)真正直線與橫坐標(biāo)為x+1的直線的交點(diǎn)是在y和y-1之間時(shí),該實(shí)際交點(diǎn)一定更靠近(x+1,y)點(diǎn),所以一定會(huì)取(x+1,y)點(diǎn)作為下一個(gè)像素點(diǎn)。再來看一下按照Bresenham算法計(jì)算會(huì)取哪一點(diǎn)。從圖可知,因?yàn)镻點(diǎn)縱坐標(biāo)yp在y-1和y之間,所以有ypy,ypy+1,所以有d1=yp-y0,由此可得d=d1-d2y+1,而如果yq1,所以直線斜率大于1)。當(dāng)yyqy+0.5時(shí),則一
5、定有y+1ypy+1+0.5,因?yàn)槿绻鹹py+1+0.5,同時(shí)又有yqy+0.5,則yp-yq1,這時(shí)直線的斜率大于1,不滿足先決條件。所以因?yàn)橹本€斜率先決條件的限制,當(dāng)真正直線與橫坐標(biāo)為x+1的直線的交點(diǎn)是在y+1和y+2之間時(shí),該實(shí)際交點(diǎn)一定更靠近(x+1,y+1)點(diǎn),所以一定會(huì)取(x+1,y+1)點(diǎn)作為下一個(gè)像素點(diǎn)。再來看一下按照Bresenham算法計(jì)算會(huì)取哪一點(diǎn)。從圖可知,因?yàn)镻點(diǎn)縱坐標(biāo)yp在y+1和y+2之間,所以有ypy,ypy+1,所以有d1=yp-y0,d2=y+1-yp0,所以要取上點(diǎn)(x+1,y+1)作為下一個(gè)像素點(diǎn),跟實(shí)際應(yīng)取的點(diǎn)是一致的,所以在這種情況下Bresenh
6、am算法仍然可以正確工作。綜上所述,雖然書中所說算法在當(dāng)前選擇的點(diǎn)是(x,y)時(shí),假定了真正直線與橫坐標(biāo)為x+1的直線的交點(diǎn)是在y和y+1之間,但只要要繪制的直線斜率滿足處于0與1之間的先決條件,那么即使真正直線與橫坐標(biāo)為x+1的直線的交點(diǎn)不是在y和y+1之間,書上所介紹的Bresenham算法仍然可以正確工作。習(xí)題6. 推廣本章第二節(jié)給出的Bresenham畫圓算法使能夠畫出一個(gè)內(nèi)部填充的實(shí)心圓。解答:因?yàn)锽resenham畫圓算法在畫圓的時(shí)候通過繪制對稱點(diǎn)來完成整個(gè)圓周的繪制,所以只需繪制對稱點(diǎn)之間連線上的象素點(diǎn)即可完成對圓形內(nèi)部的填充。推廣算法的實(shí)現(xiàn)代碼如下:/參數(shù):(x0,y0)為圓心
7、,R為半徑,edgeColor為圓形邊界顏色,inColor為圓形內(nèi)部填充顏色void CDraw:BresenhamFillCircle(CDC *pDC, int x0, int y0, int R, COLORREF edgeColor, COLORREF inColor)int x,y,p;int i;x = 0;y = R;p = 3 - (R1);for (;x=y;x+)for (i=-y+y0;iSetPixel(-x+x0,i,inColor);pDC-SetPixel(x+x0,i,inColor);for (i=-y+x0;iSetPixel(i,x+y0,inColor
8、);pDC-SetPixel(i,-x+y0,inColor);/繪制圓弧上對稱的八個(gè)像素點(diǎn)pDC-SetPixel(x + x0, y + y0, edgeColor);pDC-SetPixel(-x + x0, y + y0, edgeColor);pDC-SetPixel(x + x0, -y + y0, edgeColor);pDC-SetPixel(-x + x0, -y + y0, edgeColor);pDC-SetPixel(y + x0, x + y0, edgeColor);pDC-SetPixel(-y + x0, x + y0, edgeColor);pDC-SetPi
9、xel(y + x0, -x + y0, edgeColor);pDC-SetPixel(-y + x0, -x + y0, edgeColor);if (p 0)p+=(x2) + 6);elsep+=(x-y)2) + 10);y-;習(xí)題8. 本章第三節(jié)敘述了使用活躍邊表的多邊形掃描轉(zhuǎn)換算法中ET表的填寫方法。試寫一個(gè)算法,輸入多邊形頂點(diǎn)坐標(biāo)的逆時(shí)針序列,輸出正確填寫的ET表。解答:下面直接給出獲得ET表的實(shí)現(xiàn)代碼,為了構(gòu)造書中所給樣式的ET表,需要定義如下兩個(gè)結(jié)構(gòu):struct EdgeNode/邊節(jié)點(diǎn)int ymax;/最大y值,吊桶數(shù)據(jù)double xmin;/小y值端點(diǎn)的x值,吊桶
10、數(shù)據(jù)double fm;/斜率倒數(shù),吊桶數(shù)據(jù)EdgeNode* next;/連接下一個(gè)邊;struct HeadNode/頭節(jié)點(diǎn)int ymin;/最小y值,ET表中登記項(xiàng)的y值EdgeNode* link;/連接邊節(jié)點(diǎn)HeadNode* next;/連接下一個(gè)頭節(jié)點(diǎn);下面的實(shí)現(xiàn)代碼用戶獲得構(gòu)造完成的ET的頭節(jié)點(diǎn)的頭指針。其中參數(shù)points存放多邊形的頂點(diǎn)的逆時(shí)針序列。HeadNode* CTestAView:GetET(CArray* points)HeadNode* pHead= NULL;int ymin;/記錄正在處理的當(dāng)前邊的最小y值int nymin,nymax;/記錄與正在處理
11、的當(dāng)前邊連接的下一邊的最小y值和最大y值/循環(huán)點(diǎn)列表構(gòu)造最初的邊鏈表for (int i=0;iGetSize();i+)/獲得當(dāng)前點(diǎn)和下一點(diǎn),構(gòu)成一條邊CPoint point1 = (CPoint)points-GetAt(i);CPoint point2;/如果當(dāng)前點(diǎn)已經(jīng)是最后一個(gè)點(diǎn),則和第一點(diǎn)構(gòu)成一條邊if (i = points-GetSize() -1)point2 = (CPoint)points-GetAt(0);elsepoint2 = (CPoint)points-GetAt(i+1);/邊平行于x軸,舍棄if (point1.y = point2.y)continue;/
12、構(gòu)造邊結(jié)構(gòu)EdgeNode* edge = new EdgeNode();edge-next = NULL;/計(jì)算斜率倒數(shù)edge-fm = (double)(point2.x - point1.x)/(point2.y - point1.y);/設(shè)置ymin,ymax和xminif (point1.y point2.y)edge-ymax = point1.y;ymin = point2.y;edge-xmin = point2.x;elseedge-ymax = point2.y;ymin = point1.y;edge-xmin = point1.x;CPoint point3;/獲得比
13、較局部極大極小的第三點(diǎn),該點(diǎn)和第二點(diǎn)夠成一條邊/如果前兩點(diǎn)已經(jīng)取到頂點(diǎn)序列尾部,則順序從頭取點(diǎn)作為第三點(diǎn)int j = i+2;doif (jGetSize()point3 = (CPoint)points-GetAt(j);elsepoint3 = (CPoint)points-GetAt(j-points-GetSize();j+;while(point2.y = point3.y);if (point2.y point3.y)/計(jì)算point2和point3點(diǎn)對應(yīng)的ymin和ymaxnymax = point2.y;nymin= point3.y;elsenymax = point3.y
14、;nymin= point2.y;/下面判斷局部極大極小并縮短相應(yīng)的邊/如果連續(xù)的兩條邊的ymin值和ymax值都不同/表示連接兩邊的節(jié)點(diǎn)不為局部極大或極小if (ymin != nymin & edge-ymax != nymax)/縮短當(dāng)前邊/如果當(dāng)前邊的ymax值較大,則縮短當(dāng)前邊的ymin值if (edge-ymax nymax)ymin+;edge-xmin += edge-fm;else/否則,縮短當(dāng)前邊的ymax值edge-ymax-;/以下處理將當(dāng)前邊加入ET表if (pHead = NULL)/當(dāng)前沒有頭節(jié)點(diǎn)pHead = new HeadNode();pHead-ymin
15、= ymin;pHead-link = edge;pHead-next = NULL;elseAddEdge(pHead,ymin,edge);/返回獲得的ET表頭指針return pHead;在上面的實(shí)現(xiàn)代碼中用到了一個(gè)添加邊函數(shù),該函數(shù)作用是將處理完成的一條邊加入到當(dāng)前已有的ET表中,該函數(shù)的實(shí)現(xiàn)代碼如下:void CTestAView:AddEdge(HeadNode* head, int ymin, EdgeNode* edge)HeadNode* temphead;while (head != NULL)/循環(huán)頭節(jié)點(diǎn)if (head-ymin = ymin)/找到了對應(yīng)的頭節(jié)點(diǎn)Edg
16、eNode* p = head-link;/獲得頭節(jié)點(diǎn)對應(yīng)的第一條邊節(jié)點(diǎn)if (p-xmin edge-xmin)/新加入邊的xmin值較小head-link = edge;edge-next = p;return;while (p-next != NULL)/循環(huán)當(dāng)前頭節(jié)點(diǎn)下所有邊節(jié)點(diǎn)if (p-next-xmin edge-xmin)edge-next = p-next;p-next = edge;return;p = p-next;/到這里說明新加入的邊的xmin值比原有的都大p-next = edge;return;else if (head-ymin ymin)/當(dāng)前頭節(jié)點(diǎn)的ymin
17、值大于新加入的邊的ymin/下面處理新加入頭節(jié)點(diǎn)HeadNode* newhead = new HeadNode();newhead-ymin = head-ymin;newhead-link = head-link;newhead-next = head-next;head-ymin = ymin;head-link = edge;head-next = newhead;return;temphead = head;head = head-next;/到這里說明新加入的邊的ymin值比原有的頭節(jié)點(diǎn)的ymin值都大HeadNode* newhead = new HeadNode();newhe
18、ad-ymin = ymin;newhead-link = edge;newhead-next = NULL;temphead-next = newhead;獲得ET的實(shí)現(xiàn)函數(shù)中有兩處需要說明:判斷局部極大極小時(shí),是用多邊形頂點(diǎn)序列中相鄰的3個(gè)點(diǎn)所構(gòu)成的兩條邊進(jìn)行判斷,這是要求這兩個(gè)邊不能存在平行于x軸的邊,因?yàn)楫?dāng)取得point1和point2點(diǎn)時(shí)已經(jīng)判斷了確定的邊是否平行于x軸,所以主要處理在于確保獲得的point3點(diǎn),不會(huì)和point2點(diǎn)同時(shí)在一條平行于x軸的直線上,如果獲得的point3點(diǎn)與point2點(diǎn)的y坐標(biāo)相同,就按頂點(diǎn)序列繼續(xù)取下一點(diǎn)作為point3點(diǎn),直到point2點(diǎn)的y坐標(biāo)
19、與取得的point3點(diǎn)的y坐標(biāo)不同為止。在判斷不是局部極大或極小后,縮短的都是當(dāng)前處理的邊,這樣做可以保證邊一次處理完畢,否則就會(huì)有處理當(dāng)前邊時(shí),卻需要去縮短以前處理的邊或者還沒有處理的邊的情況存在。對當(dāng)前邊處理的方式就是如果當(dāng)前邊的ymax最大,則在ymin方向上縮短當(dāng)前邊,否則就在ymax方向上縮短當(dāng)前邊。為了檢測以上構(gòu)造的ET表是否正確,下面編寫實(shí)現(xiàn)了使用上面方法構(gòu)造的ET表完成多邊形掃描轉(zhuǎn)換算法。代碼如下:void CTestAView:Polygonfill(CDC *pDC, CArray* points, COLORREF color)/獲得ET表HeadNode* pET =
20、GetHEET(points);/AET表EdgeNode* pAET = NULL;/最小y值int y = pET-ymin;/最大y值int ymax = y;/有需要處理的掃描線while (y ymin = y)/將當(dāng)前頭節(jié)點(diǎn)對應(yīng)的邊合并到AET表中/獲得當(dāng)前要合并的頭節(jié)點(diǎn)下邊鏈表的頭指針EdgeNode* p = pET-link;if (pAET = NULL) pAET = p;elseEdgeNode* q = pAET;while (q-next != NULL) q = q-next;q-next = p;/清除已經(jīng)處理過的頭節(jié)點(diǎn),并釋放空間HeadNode* delet
21、ehead = pET;pET = pET-next;delete deletehead;/根據(jù)移動(dòng)過來的邊,修改ymax值while (p!=NULL)if (ymax ymax)ymax = p-ymax;p=p-next;/排序SortAET(pAET);EdgeNode* pFill = pAET;/填充AET表中的區(qū)間while (pFill != NULL)/填充當(dāng)前邊和下一條邊之間的區(qū)間for (int i=(int)pFill-xmin;inext-xmin;i+)pDC-SetPixel(i,y,color);/AET表中的邊應(yīng)成對出現(xiàn)pFill = pFill-next-n
22、ext;/將AET表中ymax為當(dāng)前掃描線的邊清除出表pFill = pAET;EdgeNode* pFore = NULL;while (pFill != NULL)/當(dāng)前邊ymax等于掃描線if (pFill-ymax = y)if (pFore != NULL)/說明要?jiǎng)h除的不是第一個(gè)節(jié)點(diǎn)pFore-next = pFill-next;/修改上一條邊的指向else/說明要?jiǎng)h除的是第一個(gè)節(jié)點(diǎn)pAET = pFill-next;/需要修改AET表頭指針指向下一條邊/銷毀已經(jīng)清除出鏈表的邊對象EdgeNode* deleteedge = pFill;/移動(dòng)到下一條邊pFill = pFill-
23、next;delete deleteedge;else/記錄當(dāng)前邊作為下次處理時(shí)的上一邊pFore = pFill;/移動(dòng)到下一條邊pFill = pFill-next;/AET表中仍然有邊if (pAET != NULL)/重新計(jì)算AET中各邊的xmin值pFill = pAET;while (pFill != NULL)pFill-xmin+=pFill-fm;pFill = pFill-next;/重新排序SortAET(pAET);/處理下一條掃描線y+;上面代碼中使用到對AET表進(jìn)行排序的函數(shù),其代碼如下:void CTestAView:SortAET(EdgeNode *pEDGE
24、)/要排序的邊鏈表中第一個(gè)邊EdgeNode* p1 = pEDGE;/第一個(gè)邊的下一個(gè)邊EdgeNode* p2 = NULL;while (p1 != NULL)p2 = p1-next;/獲得下一條邊while (p2 != NULL)/如果前一條邊的xmin大于后一條邊if (p1-xmin p2-xmin)/交換數(shù)據(jù)int cid;double cdd;cid = p1-ymax;p1-ymax = p2-ymax;p2-ymax = cid;cdd = p1-xmin;p1-xmin = p2-xmin;p2-xmin = cdd;cdd = p1-fm;p1-fm = p2-fm
25、;p2-fm = cdd;/下一條邊p2 = p2-next;/下一條邊p1 = p1-next;以上代碼均測試通過。習(xí)題8. 若窗口在定義為平行于用戶坐標(biāo)軸的直立矩形后,還允許此窗口再繞左下角點(diǎn)旋轉(zhuǎn)角,寫出由旋轉(zhuǎn)后窗口到直立矩形視見區(qū)的變換矩陣。解答:設(shè)在繞左下角點(diǎn)旋轉(zhuǎn)角之前,窗口的左下角點(diǎn)坐標(biāo)為(wxl, wyl),右上角點(diǎn)坐標(biāo)為(wxh, wyh),直立矩形視見區(qū)的左下角點(diǎn)坐標(biāo)為(vxl, vyl),右上角點(diǎn)坐標(biāo)為(vxh, vyh)。變換矩陣可按如下方式求得:首先平移窗口,使其左下角點(diǎn)與坐標(biāo)系原點(diǎn)重合,然后繞原點(diǎn)旋轉(zhuǎn)角,使窗口變回直立矩形,然后對其作比例變換使其大小與視見區(qū)相同,最后通
26、過平移使其與視見區(qū)重合。由此得到視見變換矩陣為:習(xí)題10. 求完成如下空間圖形變換的變換矩陣:產(chǎn)生對平面對稱的圖形。繞過原點(diǎn)和(1,1,1)的直線旋轉(zhuǎn)。解答:(3) 變換矩陣如下:(4) 在以過坐標(biāo)原點(diǎn)的任意直線為旋轉(zhuǎn)軸作旋轉(zhuǎn)變換的變換矩陣中代入向量值及旋轉(zhuǎn)角度,得變換矩陣如下:習(xí)題14. 等軸投影是投影方向與三個(gè)坐標(biāo)軸有相等夾角時(shí)的正交投影,設(shè)要實(shí)現(xiàn)一個(gè)投影方向?yàn)椋?,1,1)的等軸投影,可以先繞軸再繞軸做旋轉(zhuǎn)變換使投影方向重合于軸正方向,然后就可以進(jìn)行正交投影了。試用這個(gè)想法推導(dǎo)出做等軸投影的變換矩陣,然后驗(yàn)證三根坐標(biāo)軸上的單位向量被相等地縮短,并且可以使三個(gè)坐標(biāo)軸的投影具有相等的夾角。解
27、答:已知:xxzy(x1,y1,z1)(0, y1,v)O在視覺坐標(biāo)系下可得如下變換:獲得變換矩陣為在觀察坐標(biāo)系下可得如下變換矩陣:因?yàn)椋?,即三個(gè)坐標(biāo)軸上的單位向量以相同比例系數(shù)縮短三個(gè)坐標(biāo)軸上的單位向量在投影平面上的點(diǎn)為,三個(gè)坐標(biāo)軸上的投影具有相等的夾角。習(xí)題20. 修改Cohen-Sutherland直線裁剪算法,使其成為一個(gè)直線“開窗”算法,即指定一個(gè)窗口后,窗口內(nèi)舍棄,窗口外保留。解答:根據(jù)題意,可知只需要對原Cohen-Sutherland算法中的兩處進(jìn)行修改即可滿足要求。第一處是判斷C1和C2的邏輯乘結(jié)果不為0時(shí),此時(shí)如果該條件滿足,表示線段完全在窗外,原算法此處需要將原線段完全舍
28、棄,這里就需要將原線段完全繪制出來即可。第二處是最后要將原線段中窗口中可見部分繪制出來,此時(shí)原算法已經(jīng)完成對原線段的裁剪,得出來原線段在窗口內(nèi)的部分,這里只需要改成將原線段去掉窗口以內(nèi)部分后的線段繪制出來即可。根據(jù)以上分析,修改Cohen-Sutherland直線裁剪算法為直線“開窗”算法如下:double xl, xr, yt, yb; (這里事先給出窗口的位置,四個(gè)數(shù)值是已知的),修改的部分用藍(lán)色表示void Cohen_Sutherland(double x0, y0, x2, y2)int c, c1, c2;double x, y;/需要將原線段的端點(diǎn)保存起來,以備后面需要確定原線段
29、去除窗口內(nèi)部分時(shí)使用double x00=x0,y00=y0,x22=x2,y22=y2;makecode(x0, y0,c1); makecode(x2, y2, c2);while (c1!=0 | c2!=0)if (c1&c2!=0) showline(x00, y00, x22, y22);/顯示原線段,能走到這說明原線段都在窗口外return;c=c1; if (c=0) c=c2;if (c&1=1) y=y0+(y2-y0)*(x1-x0)/(x2-x0); x=x1;else if (c&2=2) y=y0+(y2-y0)*(xr-x0)/(x2-x0); x=xr;else
30、 if (c&4=4) x=x0+(x2-x0)*(yb-y0)/(y2-y0); y=yb;else if (c&8=8) x=x0+(x2-x0)*(yt-y0)/(y2-y0); y=yt;if (c=c1)x0=x; y0=y; makecode(x, y, c1);elsex2=x; y2=y; makecode(x, y, c2);/因?yàn)樵惴ǖ木€段分割保證了端點(diǎn)的順序性,所以采用如下的方法可確定原線段在窗口外的部分if (x00!=x0 | y00!=y0) showline(x00,y00,x0,y0);if (x2!=x22 | y2!=y22) showline(x2,y2
31、,x22,y22);此算法已經(jīng)編碼實(shí)現(xiàn)并測試通過。另一種方法是在分割線段的同時(shí)繪制窗口外的線段,該方法無需記錄初始點(diǎn)坐標(biāo)。double xl, xr, yt, yb; (這里事先給出窗口的位置,四個(gè)數(shù)值是已知的),修改的部分用藍(lán)色表示void Cohen_Sutherland(double x0, y0, x2, y2)int c, c1, c2;double x, y;makecode(x0, y0,c1); makecode(x2, y2, c2);while (c1!=0 | c2!=0)if (c1&c2!=0) /顯示線段,此時(shí)繪制的是分割完后,完全在窗口外同側(cè)的線段showline
32、(x0, y0, x2, y2); return;c=c1; if (c=0) c=c2;if (c&1=1) y=y0+(y2-y0)*(x1-x0)/(x2-x0); x=x1;else if (c&2=2) y=y0+(y2-y0)*(xr-x0)/(x2-x0); x=xr;else if (c&4=4) x=x0+(x2-x0)*(yb-y0)/(y2-y0); y=yb;else if (c&8=8) x=x0+(x2-x0)*(yt-y0)/(y2-y0); y=yt;if (c=c1)showline(x0,y0,x,y);/繪制被分割拋棄的線段x0=x; y0=y; make
33、code(x, y, c1);elseshowline(x,y,x2,y2);/繪制被分割拋棄的線段x2=x; y2=y; makecode(x, y, c2);此算法已經(jīng)編碼實(shí)現(xiàn)并測試通過。習(xí)題10. 設(shè)平面上四點(diǎn)設(shè)平面上四點(diǎn)(1,1),(2,3),(4,3),(3,1)確定的Bezier曲線是P(t),如果在點(diǎn)P(1/2)處將它分為兩段,求前后兩段做為Bezier曲線各自的四個(gè)控制點(diǎn)坐標(biāo)。解答:使用分裂法,有:PP0(1,1)R0P1(2,3)R1P2(4,3)R2P3(3,1)R3R0=(3/2,2)R1=(3,3)R2=(7/2,2)R0=(9/4,5/2)R1=(13/4,5/2)R
34、0=(11/4,5/2)i=0i=1i=2Q0Q1Q2Q3前半段四個(gè)控制點(diǎn)Q0(1,1),Q1(3/2,2),Q2(9/4,5/2),Q3(11/4,5/2),0t1/2;后半段四個(gè)控制點(diǎn)R0(11/4,5/2),R1(13/4,5/2),R2(7/2,2),R3(3,1),1/2t1。習(xí)題17. 設(shè)給定n個(gè)型值點(diǎn),問如何作出一條均勻4階3次B樣條曲線,使曲線分別以和為起點(diǎn)和終點(diǎn),并與邊和邊相切。解答:解法1:根據(jù)題意,在已有的n個(gè)型值點(diǎn)前面增加兩個(gè)型值點(diǎn)和,在后面增加兩個(gè)型值點(diǎn)和。第一段曲線由,控制,要求曲線要以為起點(diǎn),并且與邊相切,則有:解上面方程可得出和為:最后一段曲線由,控制,要求曲線要以為終點(diǎn),并且與邊相切,則有:解上面方程可得出和為:增加如上4點(diǎn)到已有的型值點(diǎn)中,可使作出的均勻4階3次B樣條曲線滿足題目要求。解法2:也可以只在前后各增加一個(gè)型值點(diǎn)和。第一段曲線由,控制,要求曲線要以為起點(diǎn),
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 員工簽員工合同范本
- 倆兄弟合伙開店合同范本
- 與他人合伙經(jīng)營合同范本
- 共享汽車租車合同范本
- 冷鏈購銷合同范本
- 合伙出資金合同范本
- 員工協(xié)議簡易合同范本
- 合同范本水印有問題
- 共同建房合同范本
- 廠房質(zhì)押合同范本
- 三年級下冊豎式脫式計(jì)算
- 七年級數(shù)學(xué)蘇科版下冊 101 二元一次方程 課件
- 《財(cái)務(wù)風(fēng)險(xiǎn)的識(shí)別與評估管理國內(nèi)外文獻(xiàn)綜述》
- ??谑写媪糠抠I賣合同模板(范本)
- 經(jīng)典文學(xué)作品中的女性形象研究外文文獻(xiàn)翻譯2016年
- 高爐煤氣安全知識(shí)的培訓(xùn)
- 2008 年全國高校俄語專業(yè)四級水平測試試卷
- 需求供給與均衡價(jià)格PPT課件
- 金融工程鄭振龍課后習(xí)題答案
- 時(shí)間單位換算表
- DTSD342-9N說明書(精編版)
評論
0/150
提交評論