橢圓中點(diǎn)Bresenham算法_第1頁(yè)
橢圓中點(diǎn)Bresenham算法_第2頁(yè)
橢圓中點(diǎn)Bresenham算法_第3頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、目錄一、設(shè)計(jì)題目 2二、設(shè)計(jì)要求 2三、設(shè)計(jì)方案 2四、程序流程圖 6五、程序清單 7六、程序運(yùn)行結(jié)果分析 15七、系統(tǒng)不足及改進(jìn)方案 15八、 設(shè)計(jì)總結(jié) 16一、設(shè)計(jì)題目:橢圓中點(diǎn) Brese nham算法二、設(shè)計(jì)要求:1要求有兩種輸入方式:(1)輸入橢圓的長(zhǎng)短軸來(lái)生成橢圓;(2)根據(jù)輸入點(diǎn)來(lái)生成橢圓并輸出橢圓的長(zhǎng)短軸;2、橢圓的顏色為紅色;三、設(shè)計(jì)方案:1、橢圓對(duì)稱性質(zhì):橢圓分別關(guān)于 X軸、丫軸對(duì)稱。因此在計(jì)算橢圓生成的時(shí)候,只需要計(jì)算1/4個(gè)橢圓,經(jīng)過(guò)對(duì)稱原理就可以實(shí)現(xiàn)其他 3/4個(gè)橢圓的生成了, 即:計(jì)算出目標(biāo)點(diǎn)(x,y )的坐標(biāo),必然存在(x,-y )、( -x,y )(-x,-y

2、)< 此方案中采用計(jì)算第一象限中橢圓的生成,即:計(jì)算x=0到y(tǒng)=0的1/4的橢圓。先通過(guò)平移的方法將假設(shè)橢圓中心在坐標(biāo)原點(diǎn),然后計(jì)算,最后再平移 到真實(shí)中心位置。2、對(duì)于第一象限的橢圓,斜率 k=- (b*b) *x/(a*a) *y ,當(dāng)x<y時(shí),斜率k的絕對(duì)值小于1,計(jì)算時(shí)在x方向上取單位量;當(dāng)x>y時(shí),斜率k的絕對(duì) 值大于1,計(jì)算時(shí)在y方向上取單位量。記:x<y的區(qū)域?yàn)榈谝粎^(qū)域,x>y的區(qū)域?yàn)榈诙^(qū)域。3、輸入方式一:輸入橢圓的長(zhǎng)短軸來(lái)生成橢圓。已知:長(zhǎng)短半軸分別為a、b,計(jì)算的初始位置為(0,b )。2 2 二 2- i橢圓的方程為:a b 。令 F (x

3、,y ) =b*b*x*x+a*a*y*y- a*a* b*b=O(1)對(duì)于第一區(qū)域,如圖1所示,P點(diǎn)坐標(biāo)為(Xp, yp )、P1 ( Xp+1, yP)為P點(diǎn)正右邊的點(diǎn)、P2( Xp+1, yp-1 )為P點(diǎn)右下方的點(diǎn),M( Xp+l,yp-0.5 )為P1、P2的中點(diǎn)。圖1第一區(qū)域示意圖令 d=F( M) =F( Xp+1, yp-0.5 ) =b*b+a*a* ( b-0.5 ) *( b-0.5 ) -a*a*b*b當(dāng) Xp=0、yp=b 時(shí),d 的初始值為:d= b*b-a*a*b+1/4a*aCDd>=0時(shí),應(yīng)取P2作為下一個(gè)像素點(diǎn),則其正右方的點(diǎn)的坐標(biāo)為(Xp +2, y

4、p-1 ),右下方的點(diǎn)的坐標(biāo)為(Xp +2, yp-2),中點(diǎn)坐標(biāo)為(Xp +2, yp-1.5 ) o此時(shí),d=F (M) =F ( Xp+2, yp-1.5) =d+b*b* (2* xp +3) -2a*a* ( yp-1 )d<0時(shí),應(yīng)取P1作為下一個(gè)像素點(diǎn),則其正右方的點(diǎn)的坐標(biāo)為(Xp+2, yp), 右下方的點(diǎn)的坐標(biāo)為(xp+2, yp-i),中點(diǎn)坐標(biāo)為(xp+2, yp-o.5)。此時(shí),d=F( M =F( Xp+2, yp-0.5)=d+2* b*b* Xp +3* b*b(2)對(duì)于第二區(qū)域,如圖2所示,P點(diǎn)坐標(biāo)為(Xp, yp),P1( Xp, yP-i)為 P點(diǎn)正下方

5、的點(diǎn)、P2( Xp+1, yp-l )為P點(diǎn)右下方的點(diǎn),M( Xp+0.5, yp-1 )為P1、P2的中點(diǎn)。圖2第二區(qū)域示意圖令 d=F( M)=F(Xp+0.5,yp-1)=b*b*( Xp+0.5)*(Xp+0.5)+a*a*(yp-1)* ( yp-1) -a*a*b*b設(shè)P坐標(biāo)的初始值為Xp=Xo , yp=yo, X0=y0d的初始值為:d= F ( X0+o.5, y0-1 ) = b*b* ( X0+o.5) * ( Xo+O.5) +a*a* ( y°-1 ) * ( y°-1 ) -a*a*b*bCDd>=0時(shí),應(yīng)取P1作為下一個(gè)像素點(diǎn),則其正下方

6、的點(diǎn)的坐標(biāo)為(Xp, yP-2), 右下方的點(diǎn)的坐標(biāo)為(Xp+1, yP-2),中點(diǎn)坐標(biāo)為(Xp+0.5, yP-2 )。此時(shí),d=F (M =F ( Xp+0.5, yp -2) =d+ a*a* (3-2 * yp)d<0時(shí),應(yīng)取P2作為下一個(gè)像素點(diǎn),則其正下方的點(diǎn)的坐標(biāo)為(Xp+1, yp-2 ),右下方的點(diǎn)的坐標(biāo)為(Xp +2, yp-2),中點(diǎn)坐標(biāo)為(Xp+i.5, yp-2)。此時(shí),d=F (M =F ( Xp+1.5, yp-2) =d+2*b*b* ( X0+1 ) + a*a* (3-2* yp)(3) 根據(jù)對(duì)稱性原理計(jì)算其他3個(gè)象限的坐標(biāo)。輸入方式二:根據(jù)輸入點(diǎn)來(lái)生成

7、橢圓并輸出橢圓的長(zhǎng)短軸。已知:兩點(diǎn)坐標(biāo)(Xi, yi)、( X2, y2)2 2匸L i2 2 設(shè)橢圓的方程為:a b將兩點(diǎn)坐標(biāo)(X1, y1 )、( X2y2 )代人橢圓方程中,得出a、b的值分別為:2 2 2 a = ( X2 * yi2 2X1 * y2 )2 2(yi - y2 )b2=( Xi2* y222 2X2 * yi )/(2 2Xi - X2)然后按照方式一生成所求橢圓。四、程序流程圖輸入方式一的流程圖如圖3所示:輸入方式二的流程圖如圖4所示:圖3輸入方式一流程圖圖4輸入方式二流程圖五、程序清單/ zhon gdia nsua nfa.cpp : Defines the e

8、ntry point for the con sole applicati on.#in elude "stdafx.h"#i nclude <stdlib.h>#in clude <vector>#i nclude <GL/glut.h>#in clude <math.h>int a;int b;/*定義長(zhǎng)短半軸分別為a、b*/void GetValue()int in put=O;int x1,x2,y1,y2;n");printf("請(qǐng)輸入中點(diǎn)算法產(chǎn)生的方式:printf("1.輸入橢圓長(zhǎng)短

9、半徑n");printf("2.輸入橢圓坐標(biāo)n");/*輸出兩種輸入方式*/scan f("%d",&in put);if(i nput=1)printf("請(qǐng)輸入a的值:n");scan f("%d",&a);printf("請(qǐng)輸入b的值:n");scan f("%d",&b);if(i nput=2)printf("請(qǐng)輸入第一個(gè)坐標(biāo)的值:n");scan f("%d,%d",& x1, &a

10、mp;y1);printf("請(qǐng)輸入第二個(gè)坐標(biāo)的值:n");scan f("%d,%d",& x2, &y2);a=sqrt (y1*y1*x2*x2-x1*x1*y2*y2)/(y1*y1-y2*y2);b=sqrt (x1*x1*y2*y2-x2*x2*y1*y1)/(x1*x1-x2*x2);/*根據(jù)輸入的兩個(gè)坐標(biāo)計(jì)算橢圓長(zhǎng)短半軸a、b的值*/prin tf("a=%d",a);prin tf("b=%d",b);/*輸出長(zhǎng)短半軸a、b的值*/void Poi ntsEllipse(i nt

11、x,i nt y)glColor3f (1.0f, O.Of, 0.0f);/*生成的橢圓的顏色為紅色*/gIPoi ntSize(1);gIBeg in (GL_POINTS);glVertex2i(x+200,y+200);glVertex2i(-x+200,y+200);glVertex2i(x+200,-y+200);glVertex2i(-x+200,-y+200);/*根據(jù)對(duì)稱原理求出橢圓上各個(gè)點(diǎn)的坐標(biāo)*/glE nd ();void myDisplay()glClear(GL_COLOR_BUFFER_BIT);glColor3f (1.0f, 0.0f, 0.0f);glBeg

12、 in (GL_POINTS);int a=200,b=100;float x,y,d1,d2;x=0;y=b;/*第一區(qū)域的起始坐標(biāo)*/d仁 b*b+a*a*(-b+0.25);Poi ntsEllipse(x,y);/*計(jì)算第一區(qū)域橢圓上各個(gè)點(diǎn)的坐標(biāo)*/while(b*b*(x+1)<a*a*(y-0.5)if (d1<0)d1+=b*b*(2*x+3);x+;elsed1+=b*b*(2*x+3)+a*a*(-2*y+2);X+;y-;Poi ntsEllipse(x,y);/*計(jì)算第二區(qū)域橢圓上各個(gè)點(diǎn)的坐標(biāo)*/d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)

13、*(y-1)-a*a*b*b;/*第二區(qū)域的起始點(diǎn)處的d值*/while(y>0)if (d2<0)d2+=2*b*b*(x+1)-a*a*(2*y-3);x+;y-;elsed2+=a*a*(-2*y+3);y-;Poi ntsEllipse(x,y);glE nd ();glFlush();/*保證前面的OpenGL命令立即執(zhí)行*/void Init()GetValue();glClearColor(0.0, 0.0, 0.0, 0.0);/*定義清空顏色設(shè)計(jì)為黑色*/glShadeModel(GL_FLAT);void Reshape(i nt w, int h)glView

14、port(0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode(GL_PROJECTION);glLoadlde ntity();gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);int main (i nt argc, char *argv)glutI nit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutI nitWin dowPositio n(100, 100);/*定義窗口在屏幕中的位置*/glutInitWindow

15、Size(600, 600);/*定義窗口的大小*/glutCreateWi ndow("zho ngdia nsua nfa!");/*根據(jù)前述設(shè)置的信息創(chuàng)建窗口 */In it();glutDisplay Fun c(myDisplay);glutReshapeF un c(Reshape);glutMa in Loop();return 0;六、程序運(yùn)行結(jié)果分析運(yùn)行該程序,窗口中顯示:請(qǐng)輸入中點(diǎn)算法產(chǎn)生的方式:1、輸入橢圓長(zhǎng)短半徑。2、輸入橢圓坐標(biāo)。輸入1,并單擊回車,顯示請(qǐng)輸入a的值,輸入a的值,并單擊回車,將顯示請(qǐng) 輸入b的值,輸入b的值,并單擊回車,屏幕上將顯示

16、一個(gè)以 a、b為長(zhǎng)短半軸 的紅色橢圓;輸入2,并單擊回車,將顯示請(qǐng)輸入第一個(gè)坐標(biāo)的值,輸入第一個(gè)坐標(biāo)的值,并 單擊回車,將顯示請(qǐng)輸入第二個(gè)坐標(biāo)的值,輸入第二個(gè)坐標(biāo)的值,并單擊回車, 屏幕上將顯示一個(gè)以原點(diǎn)為中心,經(jīng)過(guò)兩個(gè)坐標(biāo)的紅色橢圓。七、系統(tǒng)不足及改進(jìn)方案該算法生成的橢圓以原點(diǎn)為中心,如果要想實(shí)現(xiàn)橢圓的中心可放在任何位置, 則在上述算法中通過(guò)平移的方法將假設(shè)圓心在坐標(biāo)原點(diǎn),然后計(jì)算,最后再平 移到真實(shí)的中心位置。假設(shè)橢圓的中心坐標(biāo)為(x-center , y-center ),則1 1x y 1 = xy 110x cen ter y0010cen ter 1其中,x' y'1為平移后的齊次坐標(biāo),x y 1為平移前的齊次坐標(biāo),i00010x cen ter ycen ter1為平移向量。八、設(shè)計(jì)總結(jié)回顧起此次計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì),我仍感慨頗多,做這次課程設(shè)計(jì)之前 我還自認(rèn)為圖形學(xué)這門課我學(xué)的還不錯(cuò),但是當(dāng)做設(shè)計(jì)時(shí)才發(fā)現(xiàn)原來(lái)還有這么 多東西沒有弄懂。做完設(shè)計(jì)之后,感覺自己學(xué)到了很多很多的東西,同時(shí)不僅 鞏固了以前所學(xué)過(guò)的知識(shí),而且學(xué)到了很多在書本上所沒有學(xué)到過(guò)的知識(shí)。通 過(guò)這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是重要性,只有理論知識(shí)沒有實(shí) 踐,一切都等于虛設(shè),相當(dāng)于紙上談兵。只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把 所學(xué)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論