圆、椭圆的生成算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
学院:计算机科学与信息学院专业:计算机科学与技术班级:07软件2 姓名学号实验组实验时间2010-4-2 指导教师成绩
实验项目名称圆、椭圆的生成算法
实
验目的
通过本实验,使学生了解并掌握在光栅显示系统中园的生成和显示算法和椭圆的生成和显示算法。
实验要求1.实现在光栅显示系统中园的生成和显示算法和栅显示系统中椭圆的生成和显示算法,进一步熟悉相关开发平台。
2.掌握圆的几种算法(中点算法,二次差分算法以及Bresenham算法),并理解各种算法的优劣。
实验原理圆的中点算法算法原理:
画出第二个八分园(45°-90°),利用
八对称性画出其它八分园。
1.用中点算法画第二个八分园。
从当前已获得的象素递推出下一个象
素。
园弧的隐函数的形式为
F(x,y)=x2+y2-R2=0
则园弧的正负划分性为:F(x,y)>0,(x,y)在园
外;F(x,y)<0,(x,y)在园内;
F(x,y)=0,(x,y)在园上。
设(xi,yi)为已确定的象素坐标,则下一个象素
只能是正右方的E点或右下方的SE点。设M是E
和SE的中点,则M=(xi+1,yi-0.5):
F(x,y)>0
F(x,y)<0 F(x,y)=0
xi,yi
M
E
SE
如F(M)<0,则M 在园内,说明E 距离圆弧更近,下一点取正右方E 点; 如F(M)>0,则M 在园外,说明SE 距离圆弧更近,下一点取右下方SE 点; 如F(M)=0,则M 在园上,下一点取E 点或SE 点。
构造判别式:d=F(M)=F(xi+1,yi-0.5)=(xi+1)2+(yi-0.5)2-R2
椭圆的中点算法原理:
中点算法可以推广到一般二次曲线如椭圆。 中心在原点的椭圆方程为:
隐函数的形式为:
a=b 时,该方程表示的是圆。
椭圆具有四对称性,可只考虑第一象限的椭圆弧。 椭圆上任一点(x,y)处的法向量为:
如在p 点法线两分量相等,则p 点将椭圆第一象限分成两部份,上半部份法向量在y 方向的分量比x 方向的大,在下半部份相反。在p 点:
在当前中点处,法向量(2b2 (Xp+1),2a2 (Yp-0.5))的y 分量比x 分量大,即: b2 (Xp+1) < a2 (Yp-0.5)
而在下一中点,不等式改变方向,则说明椭圆弧从上部分转入下部分。
与圆弧中点算法类似:确定一个象素Pi 后,接着在下两个候选象素的中点计算一个判别
222
2
1
x y a
b
+
=y x
b
a ()22222
,()0
F x y b x a y ab =+-=22(,)22x y F F N x y i j f i f j b xi a y j
x y
∂∂=+=+=+∂∂ 2
2
x y
f f or
b x a y
==x
y
p(x,y) N
上
下
B
M T P i (x i,y i )
式d=F(M)的值,由判别式的符号确定更近的点。
实
验
环
境
Windows XP、Microsoft Visual Studio 2008
实验步骤1.根据实验要求写出算法。
2.根据算法编制实验所需的数据结构。
3.根据算法和数据结构编写源程序,并且调试,得出结果
4.对结果进行分析,并撰写实验报告。
实验内容1、实现中点画园算法、二阶差分算法、及Bresendham画圆算法,并比较各算法。
首先建立一单文档工程名为CircleEllipe,并在vs下新建一个对话框,设置如下:
对对话框建立类向导,名为DlgCircle,添加相应的变量m_x,m_y,m_R,之后在view中添加相应的函数变量,以及添加对话框的变量Dlg1,并建立对话框和窗体的连接
this->Dlg1.DoModal()。
主要的函数代码如下:
void CCircleEllipeView::CirclePoints(int x, int y)
{
CDC* pDC=GetDC();
COLORREF color=RGB(0,255,0);
pDC->SetPixel(x+Dlg1.m_x,y+Dlg1.m_y,color);
pDC->SetPixel(y+Dlg1.m_y,x+Dlg1.m_x,color); pDC->SetPixel(-x+Dlg1.m_x,y+Dlg1.m_y,color);
pDC->SetPixel(y+Dlg1.m_y,-x+Dlg1.m_x,color); pDC->SetPixel(x+Dlg1.m_x,-y+Dlg1.m_y,color); pDC->SetPixel(-y+Dlg1.m_y,x+Dlg1.m_x,color); pDC->SetPixel(-x+Dlg1.m_x,-y+Dlg1.m_y,color);
pDC->SetPixel(-y+Dlg1.m_y,-x+Dlg1.m_x,color);
ReleaseDC(pDC);
}
void CCircleEllipeView::MidPointCircle(int r)
{int x=0;
int y= r;
int d=1 - r;
CirclePoints(x, y);
while (y>x)
{ if (d<0) //选择T
d+=2*x+3;
else { //选择B
d+=2*(x-y)+5;
y--;
}
x++;
CirclePoints(x, y);
} //End of while
}
void CCircleEllipeView::ChafenCircle(int r)
{int x=0,y=r;
int d=1-r;
int del1=3,del2=5-2*r;
CirclePoints(x, y);
while(y>x)
{
if(d<0)// %选E点
{ d=d+del1;
del1=del1+2;
del2=del2+2;
}
else// %选SE点
{
d=d+del2;
del1=del1+2;
del2=del2+4;