橢圓中點Bresenham算法_第1頁
橢圓中點Bresenham算法_第2頁
橢圓中點Bresenham算法_第3頁
橢圓中點Bresenham算法_第4頁
橢圓中點Bresenham算法_第5頁
已閱讀5頁,還剩12頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、目錄一、設計題目2二、設計要求2三、設計方案2四、程序流程圖6五、程序清單7六、程序運行結果分析15七、系統不足及改進方案15八、設計總結16一、設計題目:橢圓中點Bresenham算法二、設計要求:1、要求有兩種輸入方式:(1)輸入橢圓的長短軸來生成橢圓;(2)根據輸入點來生成橢圓并輸出橢圓的長短軸;2、橢圓的顏色為紅色;三、設計方案:1、橢圓對稱性質:橢圓分別關于X軸、Y軸對稱。因此在計算橢圓生成的時候,只需要計算1/4個橢圓,經過對稱原理就可以實現其他3/4個橢圓的生成了,即:計算出目標點(x,y)的坐標,必然存在(x,-y)、(-x,y)(-x,-y)。此方案中采用計算第一象限中橢圓的

2、生成,即:計算x=0到y=0的1/4的橢圓。先通過平移的方法將假設橢圓中心在坐標原點,然后計算,最后再平移到真實中心位置。2、對于第一象限的橢圓,斜率k=-(b*b)*x/ (a*a)*y ,當xy時,斜率k的絕對值大于1,計算時在y方向上取單位量。記:xy的區域為第二區域。3、輸入方式一:輸入橢圓的長短軸來生成橢圓。 已知:長短半軸分別為a、b,計算的初始位置為(0,b)。橢圓的方程為:。令F(x,y)=b*b*x*x+a*a*y*y- a*a* b*b=0(1)對于第一區域,如圖1所示,P點坐標為(,)、P1(+1, )為P點正右邊的點、P2(+1, -1)為P點右下方的點,M(+1,-0

3、.5)為P1、P2的中點。令d=F(M)=F(+1,-0.5)=b*b+a*a*(b-0.5)*(b-0.5)-a*a*b*b當=0、=b時,d的初始值為:d= b*b-a*a*b+1/4a*ad=0時,應取P2作為下一個像素點,則其正右方的點的坐標為(+2,-1),右下方的點的坐標為(+2,-2),中點坐標為(+2,-1.5)。此時,d=F(M)=F(+2,-1.5)=d+b*b*(2*+3)-2a*a*(-1)d=0時,應取P1作為下一個像素點,則其正下方的點的坐標為(,-2),右下方的點的坐標為(+1,-2),中點坐標為(+0.5,-2)。此時,d=F(M)=F(+0.5,-2)=d+

4、a*a*(3-2 *)d0時,應取P2作為下一個像素點,則其正下方的點的坐標為(+1,-2),右下方的點的坐標為(+2,-2),中點坐標為(+1.5,-2)。此時,d=F(M)=F(+1.5,-2)=d+2*b*b*(+1)+ a*a*(3-2*)(3)根據對稱性原理計算其他3個象限的坐標。輸入方式二:根據輸入點來生成橢圓并輸出橢圓的長短軸。已知:兩點坐標(,)、(,)設橢圓的方程為:將兩點坐標(,)、(,)代人橢圓方程中,得出a、b的值分別為:=(*-*)/(-)=(*-*)/(-)然后按照方式一生成所求橢圓。四、程序流程圖輸入方式一的流程圖如圖3所示:輸入方式二的流程圖如圖4所示: 五、程

5、序清單/ zhongdiansuanfa.cpp : Defines the entry point for the console application.#include stdafx.h#include #include #include #include int a;int b;/*定義長短半軸分別為a、b*/void GetValue()int input=0;int x1,x2,y1,y2;printf(請輸入中點算法產生的方式:n);printf(1.輸入橢圓長短半徑n);printf(2.輸入橢圓坐標n);/*輸出兩種輸入方式*/scanf(%d,&input);if(inpu

6、t=1)printf(請輸入a的值:n);scanf(%d,&a);printf(請輸入b的值:n);scanf(%d,&b);if(input=2)printf(請輸入第一個坐標的值:n);scanf(%d,%d,&x1,&y1);printf(請輸入第二個坐標的值:n);scanf(%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);/*根據輸入的兩個坐標計算橢圓長短半軸a、b的值*/ printf(a=%d,a);prin

7、tf(b=%d,b);/*輸出長短半軸a、b的值*/void PointsEllipse(int x,int y) glColor3f (1.0f, 0.0f, 0.0f); /*生成的橢圓的顏色為紅色*/ glPointSize(1); glBegin (GL_POINTS); glVertex2i(x+200,y+200); glVertex2i(-x+200,y+200); glVertex2i(x+200,-y+200); glVertex2i(-x+200,-y+200);/*根據對稱原理求出橢圓上各個點的坐標*/ glEnd (); void myDisplay() glClear

8、(GL_COLOR_BUFFER_BIT); glColor3f (1.0f, 0.0f, 0.0f); glBegin (GL_POINTS); /int a=200,b=100; float x,y,d1,d2; x=0; y=b;/*第一區域的起始坐標*/ d1=b*b+a*a*(-b+0.25); PointsEllipse(x,y); /*計算第一區域橢圓上各個點的坐標*/while(b*b*(x+1)a*a*(y-0.5) if (d10) if (d20) d2+=2*b*b*(x+1)-a*a*(2*y-3); x+; y-; else d2+=a*a*(-2*y+3); y-

9、; PointsEllipse(x,y); glEnd (); glFlush();/*保證前面的OpenGL命令立即執行*/ void Init() GetValue(); glClearColor(0.0, 0.0, 0.0, 0.0);/*定義清空顏色設計為黑色*/ glShadeModel(GL_FLAT); void Reshape(int w, int h) glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, (GLdou

10、ble) w, 0.0, (GLdouble) h);int main(int argc, char *argv) glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100);/*定義窗口在屏幕中的位置*/ glutInitWindowSize(600, 600);/*定義窗口的大小*/ glutCreateWindow(zhongdiansuanfa!);/*根據前述設置的信息創建窗口*/ Init(); glutDisplayFunc(myDispl

11、ay); glutReshapeFunc(Reshape); glutMainLoop(); return 0;六、程序運行結果分析運行該程序,窗口中顯示:請輸入中點算法產生的方式:1、輸入橢圓長短半徑。2、輸入橢圓坐標。輸入1,并單擊回車,顯示請輸入a的值,輸入a的值,并單擊回車,將顯示請輸入b的值,輸入b的值,并單擊回車,屏幕上將顯示一個以a、b為長短半軸的紅色橢圓;輸入2,并單擊回車,將顯示請輸入第一個坐標的值,輸入第一個坐標的值,并單擊回車,將顯示請輸入第二個坐標的值,輸入第二個坐標的值,并單擊回車,屏幕上將顯示一個以原點為中心,經過兩個坐標的紅色橢圓。七、系統不足及改進方案 該算法生

12、成的橢圓以原點為中心,如果要想實現橢圓的中心可放在任何位置,則在上述算法中通過平移的方法將假設圓心在坐標原點,然后計算,最后再平移到真實的中心位置。假設橢圓的中心坐標為(x-center,y-center),則 = 其中,為平移后的齊次坐標,為平移前的齊次坐標, 為平移向量。八、設計總結回顧起此次計算機圖形學課程設計,我仍感慨頗多,做這次課程設計之前我還自認為圖形學這門課我學的還不錯,但是當做設計時才發現原來還有這么多東西沒有弄懂。做完設計之后,感覺自己學到了很多很多的東西,同時不僅鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。通過這次課程設計使我懂得了理論與實際相結合是重要性,只有理論知識沒有實踐,一切都等于虛設,相當于紙上談兵。只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能提高自己的實際動手能力和獨立思考的能力。在設計過程中遇到的問題,可以說得是困難重重

溫馨提示

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

評論

0/150

提交評論