计算机图形学教程动画实验报告,计算机图形学画圆实验报告.doc
計算機圖形學畫圓實驗報告
洛陽理工學院實驗報告用紙
計算機 系 B080504 班 姓名 劉 青 學號 成績_______
實 驗
名 稱Bresenham畫圓算法同組人日期實驗題目:
使用中心畫圓法,結合圓的四對稱特性實現圓繪制的演示程序。
實驗目的:
(1) 通過單擊鼠標左鍵確定圓心,然后拖拽鼠標來確定圓的半徑大小,在演示程序界面上顯示圓心坐標和半徑的長度;
(2) 使用邊長大于5像素的矩形來表示光柵顯示設備上的像素以實現算法的演示效果;
(3) 實現圓繪制過程的動畫演示;
(4) 演示程序可以顯示圓繪制過程中每一步的運算結果;
(5) 程序界面可以使用的語言及技術包括:C++(Qt,Win32 API)、VB/C#(GDI+)或Java(Swing),界面要求簡單、整潔,可以充分實現要求的功能。
實驗內容:
實驗分析(C#語言GDI+實現)
(1)圓的特性
圓被定義為到給定中心位置(xc,yc)距離為r的點集。圓心位于原點的圓有四條對稱軸x=0,y=0,x=y和x=-y。若已知圓弧上一點(x,y),可以得到其關于四條對稱軸的其它7個點,這種性質稱為圓的八對稱性。因此,只要掃描轉換八分之一圓弧,就可以求出整個圓弧的象素集。
顯示圓弧上的八個對稱點的算法:
void CirclePoints(int x,int y,int color)
{ drawpixel(x,y,color); drawpixel(y,x,color);
drawpixel(-x,y,color); drawpixel(y,-x,color);
drawpixel(x,-y,color); drawpixel(-y,x,color);
drawpixel(-x,-y,color); drawpixel(-y,-x,color);
}
(2)畫理想圓流程圖如圖-1:
圖-1:畫理想圓流程圖
(3)中點畫圓法圖-2 中點畫圓法當前象素與下一象素的候選者
如果我們構造函數 F(x,y)=x2+y2-R2,則對于圓上的點有F(x,y)=0,對于圓外的點有F(x,y)>0,對于圓內的點F(x,y)<0 。與中點畫線法一樣,構造判別式:
d=F(M)=F(xp+1,yp-0.5)=(xp+1)2+(yp-0.5)2-R2
若 d<0,則應取P1為下一象素,而且再下一象素的判別式為:
d=F(xp+2,yp-0.5)=(xp+2)2+(yp-0.5)2-R2=d+2xp+3
若d≥0,則應取P2為下一象素,而且下一象素的判別式為
d=F(xp+2,yp-1.5)=(xp+2)2+(yp-1.5)2-R2=d+2(xp-yp)+5
我們這里討論的第一個象素是(0,R),判別式d的初始值為:
d0=F(1,R-0.5)=1.25-R中點畫圓算法:
MidPointCircle(int r int color)
{ int x,y;
float d;
x=0; y=r; d=1.25-r;
circlepoints (x,y,color);
while(x<=y)
{
if(d<0)
d+=2*x+3;
else
{
d+=2*(x-y)+5;
y--;
}
x++;
circlepoints (x,y,color);
}
}
為了進一步提高算法的效率,可以將上面的算法中的浮點數改寫成整數,將乘法運算改成加法運算,即僅用整數實現中點畫圓法。
Bresenham畫線法與中點畫線法相似,,它通過每列象素中確定與理想直線最近的象素來進行直線的掃描的轉換的。通過各行,各列的象素中心構造一組虛擬網格線的交點,然后確定該列象素中與此交點最近的的象素。該算法的巧妙之處在于可以采用增量計算,使得對于每一列,只要檢查一個誤差項的符號,就可以確定該列的所求對象。假設x列的象素已確定,其行下標為y。那么下一個象素的列坐標必為x+1。而行坐標要么不變,要么遞增1。是否遞增1取決于如圖所示的誤差項d的值。因為直線的起始點在象素中心,所以誤差項d的初始值為0。X下標每增加1,d的值相應遞增直線的斜率值,即d=d+k(k=y/x為直線斜率)。一旦d>=1時,就把它減去,這樣保證d始終在0、1之間。當d>0.5時,直線與x+1垂直網絡線交點最接近于當前象素(x,y)的右上方象素(x+1,y+1);而當d<0.5時,更接近于象素(x+1,y),當d=0。5時,與上述二象素一樣接近,約定取(x+1,y+1)。令e=d-0。5。則當e>=0時,下一象素的y下標增加1,而當e〈0時,下一象素的y下標不增。E的初始值為-0.5.
private Rectangle[] Bresenham_Circle(Point pcs, int rs)
{
總結
以上是生活随笔為你收集整理的计算机图形学教程动画实验报告,计算机图形学画圆实验报告.doc的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言布尔变量逻辑运算,在C ++中对布
- 下一篇: OpenGL ES 2.0 入门(持续更