【www.scfx8.com--专业技术个人总结】
贵州大学实验报告 学院:
计信学院 专业:
计科 班级:
计科 101 姓名 罗琳 学号 1008060016 实验组 实验时间 2013-4-8 指导教师 吴云 成绩 实验项目名称 椭圆的生成算法 实验目的 通过本实验,使学生了解并掌握在光栅显示系统中椭圆的生成和显示算法。
实验要求 实现中点椭圆算法。
实验原理 中点算法 算法原理:
中点算法可以推广到一般二次曲线如椭圆。
中心在原点的椭圆方程为:
隐函数的形式为:
a=b 时,该方程表示的是圆。
椭圆具有四对称性,可只考虑第一象限的椭圆弧。
椭圆上任一点(x,y)处2 22 21x ya b y x b a 2 2 2 2 2, ( ) 0 F x y b x a y ab x y p(x,y) N上 下
的法向量为:
如在 p 点法线两分量相等,则 p 点将椭圆第一象限分成两部份,上半部份法向量在 y方向的分量比 x 方向的大,在下半部份相反。在 p 点:
在当前中点处,法向量(2b 2 (Xp+1),2a 2 (Yp-0.5))的 y 分量比 x 分量大,即:
b 2 (Xp+1) =0(取 B 点)时,下一点(i+1)点的坐标为(x i +1,Y i -1),为确定 i+2 点取的下一个中点 M 的坐标为:(x i +2,Y i -1.5) 2.在每一次迭代中都要判断椭圆是否已从上半部进入了下半部,如果 b 2 x>=a 2 y,则椭圆进入下半部份,此时令△y=1,且:
2 2( , ) 2 2x yF FN x y i j f i f j b xi a y jx y 2 2x yf f or b x a y B M T P i (x i, y i ) 2 2 2 2 2 2( ) 1, 0.5 ( 1) ( 0.5)i i i id F M F x y b x a y a b 2 2011, 0.5 ( )4d F b b a b 22 2 212, 0.5 (2 3)(2 3) 2new i i old ii id F x y d b xd b x b x b 2 22 2 2 2 21 12, 1.5 (2 3) ( 2 2)(2 3) ( 2 2) 2 2new i i old i ii i i id F x y d b x a yd b x a y b x b a y 22 2 2 2 20( 0. 5) 1 d b x a y a b L M R P i (x i , y i )
(1)若 d=0,取正下方像素 L,则 3.终止条件为:y=0 MidpointEllipe(a,b, color) int a,b,color; { int x,y; float d1,d2; x = 0; y = b; d1 = b*b +a*a*(-b+0.25); putpixel(x,y,color); while( b*b*(x+1) 0) { if (d2 GetDC(); pWnd->Invalidate(); pWnd->UpdateWindow(); UpdateData(true); int a,b; a=m_a; b=m_b; 2 2 2 2 22 2, ( ) 0 F x y b x a y abb x a y 2 22 2 2 2( , )a ba b a b
if(a==0||b==0)MessageBox("请输入椭圆的半径!"); else{ int x0=m_x0,y0=m_y0; pDC->SetViewportOrg(x0,y0), //画直角坐标轴 pDC->MoveTo(0,-y0), pDC->LineTo(0,y0), pDC->MoveTo(-x0,0), pDC->LineTo(x0,0); int x,y,a1,b1,a2,b2; double d1,d2,fx,fy; a1=a*a; b1=b*b; a2=2*a1; b2=2*b1; fx=0; fy=a2*b; d1=b1-a1*b+0.25*a1; x=0; y=b; while (fxSetPixel(x,y,RGB(0,0,255)); pDC->SetPixel(-x,y,RGB(0,255,0)); pDC->SetPixel(x,-y,RGB(255,0,0)); pDC->SetPixel(-x,-y,RGB(255,255,255)); x++; fx=fx+b2;
if(d1SetPixel(x,y,RGB(0,0,255)); pDC->SetPixel(-x,y,RGB(0,255,0)); pDC->SetPixel(x,-y,RGB(255,0,0)); pDC->SetPixel(-x,-y,RGB(255,255,255)); d2=b1*(x+0.5)*(x+0.5)+a1*(y-1)*(y-1)-a1*b1; while (y>0) { y--; fy=fy-a2; if(d2>=0) d2=d2-fy+a1; else { x++; fx=fx +b2; d2=d2+fx-fy+a1; } pDC->SetPixel(x,y,RGB(0,0,255)); pDC->SetPixel(-x,y,RGB(0,255,0)); pDC->SetPixel(x,-y,RGB(255,0,0));
pDC->SetPixel(-x,-y,RGB(255,255,255)); } } UpdateData(false); } void CHuanYuanDlg::OnDelete() { // TODO: Add your control notification handler code here Invalidate(); } 实验结果 编译、调试并运行程序,结果如下:
实验 在上一次实验的基础上,掌握了利用中点算法生成椭圆基本过程, 了解并掌握在光栅显示系统中椭圆的生成和显示算法。
指导教师意见 签名:
年 月 日