中点画椭圆法实验报告

合集下载

用《几何画板》探究点的轨迹:椭圆

用《几何画板》探究点的轨迹:椭圆

用《几何画板》探究点的轨迹:椭圆一、设计理念本节是人教A高中数学选修1-1第二章圆锥曲线与方程中的2.1椭圆——信息技术应用内容,在教学设计上考虑了以下三点:1 、数学学科的教学活动是数学学科素养培养的主要途径;2、解析几何的本质是用代数方法研究图形的几何性质,体现了数形结合的重要思想;3、信息技术与课堂教学的深度融合,以信息技术为手段实现学生“做数学”.二、知识目标已知几何图形建立直角坐标系的两个原则及引入参量b=的意义,培养学生用对称的美学思维来体现数学的和谐美;让学生认同与领悟:思考1和思考2使用定义解题是首选的,但也可以用其他方法来解,培养学生从定义的角度思考问题的好习惯;思考3是典型的用代入法求动点的伴随点的轨迹,培养学生的辩证思维方法,会用分析、联系的观点解决问题;通过例3培养学生的对问题引申、分段讨论的思维品质.三、能力目标(1)想象与归纳能力:能根据课程的内容能想象日常生活中哪些是椭圆、双曲线和抛物线的实际例子,能用数学符号或自然语言的描述椭圆的定义,能正确且直观地绘作图形,反过来根据图形能用数学术语和数学符号表示.(2)思维能力:会把几何问题化归成代数问题来分析,反过来会把代数问题转化为几何问题来思考,培养学生的数形结合的思想方法;培养学生的会从特殊性问题引申到一般性来研究,培养学生的辩证思维能力.(3)实践能力:培养学生实际动手能力,综合利用已有的知识能力.(4)数学活动能力:培养学生观察、实验、探究、验证与交流等数学活动能力.(5)创新意识能力:培养学生思考问题、并能探究发现一些问题的能力,探究解决问题的一般的思想、方法和途径.二、内容分析本节内容在2.2椭圆B组题之后,B组题一共四道题(如下图),都与椭圆的生成有关,所以在本节的处理上,就将B组题与本节课的第二定义相整合,以介绍椭圆的生成方式为线索展开.三、学情分析学生在初中学习直线与圆的位置关系中,学生已经接触到如何建立平面直角坐标系,体会将几何问题转化为代数问题的方法,已经了解到数形结合的数学思想了。

几何画板中的度量功能实验报告:椭圆的画法

几何画板中的度量功能实验报告:椭圆的画法

几何画板中的度量功能实验报告一、 实验目的1. 学习应用数学知识原理来指导绘制圆锥曲线。

2. 掌握几何画板中的建立坐标系,绘制已知点以及运用几何画板中内置计算器计算比值的方法,掌握度量菜单的用法。

3. 应用几何画板中的操作类按钮的功能动态显示圆锥曲线的变化状况。

二、 实验原理圆锥曲线基本定义,椭圆的参数方程以及椭圆的标准方程。

实验内容:根据椭圆的不同定义,标准方程以及参数方程,绘制不同的椭圆曲线。

三、 实验仪器PC 计算机; 软件工具:几何画板5.04 四、实验课时:6课时 五、实验步骤 (一)知识储备椭圆的第一定义:平面内与两定点F 1、F 2(即焦点)的距离的和等于常数的动点P 的轨迹叫做椭圆. 其数学表达式为:|PF 1|+|PF 2|=2a (2a >|F 1F 2|),焦距:|F 1F 2|=2c ≤2a.椭圆的第二定义:平面内到定点F(c ,0)的距离和到定直线l :ca x 2=(F 不在l 上)的距离之比为常数,即离心率ace =(0<e<1)的点的轨迹是椭圆. (二)椭圆的画法:1、根据椭圆的第一定义画椭圆:2种画法。

2、缩放法画椭圆3、双圆法画椭圆(三)各种画法的实验步骤1、根据椭圆的第一定义画椭圆:有两种画法 画法一:(1)新建页:【文件】-【文档选项】-【增加页】-【空白页面】,命名为:根据椭圆的第一定义画椭圆——画法一。

(2)构造控制台:选择【线段工具】,在空白处画线段AB ,选中线段AB ,【构造】-【构造线段上的点】(点C ),选中点C ,【度量】-【点的值】(xx ____上在AB C ),【数据】-【计算】-输入 :上在____1AB C ,选中比值,鼠标右击-【标记比值】。

(3)画圆:选择【点工具】,在空白处,作点D 、点E ,双击点D ,选中点E ,【变换】-【缩放】-【按标记比进行缩放】-【确定】,得到点E ’(通过拖动点C ,可以控制点E ’的位置,从而改变下面的椭圆的离心率。

信息技术应用用《几何画板》探究点的轨迹:椭圆

信息技术应用用《几何画板》探究点的轨迹:椭圆
用《几何画板》探究 点的轨迹:椭圆
*轨迹与轨迹方程
轨迹:动点按照一定条件运动所形成的曲线 (几何图形)
轨迹方程:动点运动,其坐标(x,y)所满足的 关系式
(代数方程)
例1 如图,F是定点,l 是不经过F的定直线,动点 M到定点F的距离与到定直线 l 的距离的比e是小于
1的常数,动点M的轨迹是什么?
所以,这样的动点Q的轨迹即为椭圆.
定义法:利用所学过的曲线的定义直接写出 所求的动点的轨迹方程
课堂小结 1.用几何画板探究点的轨迹. 2.轨迹方程的常见求法.
作业
1、已知点P(2,0),Q(8,0),点M与点P
的距离是它与点Q的距离的
1 5
,求点M轨
迹方程.并说明轨迹是什么图形.
2、点M与定点F(2,0)的距离和它到定 直线x=8的距离的比是1:2,求点M轨迹
解:设d是M到直线l : x 245的距离,设M(x,y) 根据题意有 MF 4
d 5

(x 4)2 y 2 4
x

25 4
5
将上式两边平方并化简,得:9x2 25y2 225
y
.M(x,y) .O
F(-4,0)

x2 y2
25 9
1
x 所以,点M的轨迹是长轴、短轴分 别为10、6的椭圆.
又 OQ PQ 为定值 ,等量代换有 OQQAr,分析这个 式子本身的几何意义即得点Q的轨迹.
Pl
Q
..
O
A
演示轨迹三
解:因为点Q是线段PA垂直平 分线上的点,所以有
PQ QA
又 OQPQr
Pl
Q
..
O
A
所以,OQQAr 此即为动点Q到两个定点O、A的距离之和

基于中点提取的椭圆检测算法

基于中点提取的椭圆检测算法
s e d a d a c a y a l s sr n e it n e t rilo cuso p e n c ur c swela to g r ssa c o pa ta c l n o i dHog rnf m ( H ) etr x at n d el a zt n ywod :e i eet n ad mz u hTa s r R T ;cne t c o;eg c i i ls i e o er i ol a o
F . F iW AN Yi U J. U
( eat etfP  ̄i ,N nh n n e i,N nh n inx 3 0 1 hn ) D p r n h c a cag U i rt a cagJag i 0 3 ,C ia m o s v sy 3
Absr c : Fo h Ho g ta so m meho o lis s dee to s so ta t rt e u h r n fr t d f r elp e tci n i lw a d e d h e tr g , a fs rnd mie n n e s ug soa e a t a o z d
d i1 .7 4 S ..0 7 2 1 .2 0 o:0 32 / P J1 8 .0 1 07 5
基 于 中点 提 取 的椭 圆检 测 算 法
范 怡, 傅继武
( 昌大学 物理 系 , 昌 3 0 3 ) 南 南 3 0 1
(uiu nu e u c) fj @ c .d .a w

要: 针对 Hog u h变换检测椭 圆时存在运 算速度慢、 需要 大量储 存 空间的 问题 , 出一 种快速 的随机椭 圆检 测 提
算法。该 算法随机 采样 2点并搜 索第 3点 , 再利用椭 圆极径性质 求出椭 圆中心坐标 , 着通过 坐标 变换得 到简化 的椭 接

中点画圆算法实验报告

中点画圆算法实验报告

中点画圆算法实验报告首先,我们按照中点画圆算法的步骤编写了C++语言的程序,在空白窗口内绘制一个圆。

程序首先要求用户输入圆心坐标和半径,然后根据算法计算出圆上每个点的坐标,并将这些点绘制在窗口上。

程序使用了Windows API中的GDI函数来实现图形绘制的功能。

接下来,我们进行了多组实验,分别对比了中点画圆算法与其他传统绘制圆的方法,包括递归法、Bresenham算法等。

通过用计时器记录每种算法的绘制时间,我们发现中点画圆算法在同样的绘制条件下,绘制时间明显更短,效率更高。

这主要是因为中点画圆算法对于一个给定的圆弧上的点,只需要计算出其他七个点的坐标,而其他传统方法需要计算更多的相关点来绘制整个圆。

此外,我们还对中点画圆算法的绘制效果进行了观察。

通过多次改变圆心坐标和半径的值,我们发现在不同的条件下,中点画圆算法能够正确绘制出圆的边界,而不会出现明显的形变或失真,这说明此算法在绘制精度方面表现良好。

在实验过程中,我们还分别测试了圆心坐标和半径的取值范围对中点画圆算法绘制效果的影响。

从实验结果来看,当圆心坐标超出窗口范围或半径过大时,绘制的圆可能无法完整显示在窗口内,甚至出现绘制异常的情况。

这是因为算法没有对这些异常情况进行处理。

为了解决这个问题,我们可以在程序中加入判断逻辑,限制圆心坐标和半径的取值范围,从而保证绘制的圆在窗口内完整显示。

综上所述,中点画圆算法是一个简单且高效的圆绘制算法,通过绘制点的对称性减少了计算量,从而提高了绘制效率。

但在具体应用中,还需要对圆心坐标和半径的取值范围进行限制,以确保绘制结果的正确性和可视性。

以后的研究可以进一步改进算法,增加对异常情况的处理,提高绘制的稳定性和可靠性。

中点画椭圆

中点画椭圆

中点椭圆生成过程2 中点椭圆生成过程2
5. 在区域2的每个yk位置处,从k=0开始,完成下列检测: 在区域2的每个y 位置处, 开始,完成下列检测: • 假如d2k>0,椭圆下一点选为(xk,yk-1), 假如d 椭圆下一点选为( 且:d2k+1=p2k-2a2yk+1+a2, k+1 k+1 • 否则,沿椭圆的下一个点为(xk+1,yk-1), 否则,沿椭圆的下一个点为( k+1 且:d2k+1=p2k+2b2 xk+1-2a2 yk+1+a2, k+1 k+1 k+1 • 使用与区域1中相同的x和y增量计算。 使用与区域1中相同的x 增量计算。 • 循环至(a,0) 循环至( 6. 确定其它三个像限中对称的点。 确定其它三个像限中对称的点。 7. 将每个计算出的像素位置(x,y)平移到中心在(xc,yc)的椭圆 将每个计算出的像素位置( 平移到中心在( 轨迹上,并按坐标值画点: 轨迹上,并按坐标值画点:x=x+xc,y=y+yc
中点椭圆生成区域划分
中点法依据椭圆斜率将第一像 限的椭圆( 分成两部分。 限的椭圆(b≤a)分成两部分。 根据斜率变化确定步长方向: 根据斜率变化确定步长方向: 斜率绝对值小于1 区域1 斜率绝对值小于 1 的 区域 1 方向取单位步长; 内x方向取单位步长; 斜率绝对值大于1 区域2 斜率绝对值大于 1 的 区域 2 方向取单位步长。 内y方向取单位步长。 • 区域分割条件 – 在每一步中,需检测曲线的斜率值。 在每一步中,需检测曲线的斜率值。 – 椭圆的斜率可从椭圆方程中计算出: 椭圆的斜率可从椭圆方程中计算出: dy/dx=- x/2 dy/dx=-2b2x/2a2y – 在两区域交界处:dy/dx=-1,即:2b2x=2a2y。 在两区域交界处:dy/dx= – 因此,区域1和区域2的交替条件是: 因此,区域1和区域2的交替条件是: x≥2 2b2x≥2a2y

中点画椭圆课程设计报告

中点画椭圆课程设计报告

河南理工大学计算机科学与技术学院课程设计报告200 8 — 200 9 学年第二学期课程名称计算机图形学设计题目椭圆中点Bresenham算法学生姓名张宁宁学号310609010404专业班级计算机06-4班指导教师徐文鹏2009 年 6 月18 日目录一、设计题目 (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)。

此方案中采用计算第一象限中椭圆的生成,即:计算x=0到y=0的1/4的椭圆。

先通过平移的方法将假设椭圆中心在坐标原点,然后计算,最后再平移到真实中心位置。

2、对于第一象限的椭圆,斜率k=-(b*b)*x/ (a*a)*y ,当x<y时,斜率k的绝对值小于1,计算时在x方向上取单位量;当x>y时,斜率k的绝对值大于1,计算时在y方向上取单位量。

记:x<y的区域为第一区域,x>y的区域为第二区域。

3、输入方式一:输入椭圆的长短轴来生成椭圆。

已知:长短半轴分别为a、b,计算的初始位置为(0,b)。

(1)对于第一区域,如图1所示,P点坐标为(P x,P y)、P1(P x+1, P y)为P点正右边的点、P2(P x+1, P y-1)为P点右下方的点,M(P x+1,P y-0.5)为P1、P2的中点。

令d=F(M)=F(P x+1,P y-0.5)=b*b+a*a*(b-0.5)*(b-0.5)-a*a*b*b当P x=0、P y=b时,d的初始值为:d= b*b-a*a*b+1/4a*a○1d>=0时,应取P2作为下一个像素点,则其正右方的点的坐标为(P x+2,P y-1),右下方的点的坐标为(P x+2,P y-2),中点坐标为(P x+2,P y-1.5)。

图形学画圆实验报告参考模板

图形学画圆实验报告参考模板

4.2.3程序实现与上机实习(二)一、实验目的编写圆和椭圆的扫描转换算法程序,验证算法的正确性。

二、实验任务1.编写中点画圆法的扫描转换程序,考虑原点在(x0,y0)处程序的改动;2.添加鼠标程序,实现交互式画圆;3.编写中点画椭圆法的扫描转换程序;4.添加鼠标程序,实现交互式画椭圆;三、实验内容1.编写中点画圆法的扫描转换程序,考虑原点在(x0,y0)处程序的改动;分析:考虑圆心不再原点,设圆心坐标为(x0,y0)。

通过平移坐标原点到圆心,则第二个8分圆上一点p(x,y),其原始坐标为x’=x+x0y’=y+y0即p’1(x0 +x, y+y0)其它7个对称点分别是:p’2(x0+y,y+x0), p’3 (x0+y,y0-x),p’4 (x0+x,y0-y),p’5 (x0-x,y0-y),p’6 (x0-y,y0-x),p’7 (x0-y,y0+x),p’8 (x0-x,y0+y)算法程序如下:{int x,y;float d;x=0;y=r;d=1.25-r;CirPot(x0,y0,x,y,color);while (x<=y){if(d<0){d+=2*x+3; x++;}(x0+R,y0)else{d+=2*(x-y)+5;x++; y--;}CirPot(x0,y0,x,y,color);} /* while*/} /* MidpointCiecle */int CirPot(int x0,int y0,int x,int y,int color){Setpixel((x0+x),(y0+y));Setpixel((x0+y),(y0+x));Setpixel((x0+y),(y0-x));Setpixel((x0+x),(y0-y));Setpixel((x0-x),(y0-y));Setpixel((x0-y),(y0-x));Setpixel((x0-y),(y0+x));Setpixel((x0-x),(y0+y));}程序实现步骤:(1)建立MidPointCircle工程文件;(2)右击CMidPointCircleView类,建立成员函数void MidpointCircle(CDC *pDC,int x0, int y0, int r, COLORREF color)int CirPot(CDC *pDC,int x0, int y0, int x, int y, COLORREF color)(3) 编写成员函数代码,程序如下:void CMidPointCircleView::MidpointCircle(CDC *pDC,int x0, int y0, int r, COLORREF color) {int x,y;float d;x=0;y=r;d=1.25-r;CirPot(pDC,x0,y0,x,y,color);while (x<=y){if(d<0){d+=2*x+3; x++;}else{d+=2*(x-y)+5;x++; y--;}CirPot(pDC,x0,y0,x,y,color);} /* while*/}int CMidPointCircleView::CirPot(CDC *pDC,int x0, int y0, int x, int y, COLORREF color) {pDC->SetPixel((x0+x),(y0+y),color);pDC->SetPixel((x0+y),(y0+x),color);pDC->SetPixel((x0+y),(y0-x),color);pDC->SetPixel((x0+x),(y0-y),color);pDC->SetPixel((x0-x),(y0-y),color);pDC->SetPixel((x0-y),(y0-x),color);pDC->SetPixel((x0-y),(y0+x),color);pDC->SetPixel((x0-x),(y0+y),color);return 0;}(4)编写OnDraw(CDC* pDC)函数,程序如下:void CMidPointCircleView::OnDraw(CDC* pDC){CMidPointCircleDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data hereMidpointCircle(pDC,100, 100, 10, RGB(255,0,0));MidpointCircle(pDC,500, 300, 60, RGB(255,255,0));}(6)编译、运行程序,查看结果。

计算机图形学-画椭圆和圆

计算机图形学-画椭圆和圆
y--;
}
x++;
glVertex2i(x +xc, y +yc);
glVertex2i(y +xc, x +yc);
glVertex2i(y +xc, -x +yc);
glVertex2i(x +xc, -y +yc);
glVertex2i(-x +xc, -y +yc);
glVertex2i(-y +xc, -x +yc);
绘图过程如下:
.输入直线的两端点P0(X0,Y0)和P1(X1,Y1)。
.计算初始值△x, △y,d=△x-2△y,x=X0,y=Y0.
.绘制点(x,y)。判断d的符号,若d<0,则(x,y)更新为(x+1,y+1),d更新为d+2△x-2△y;否则(x,y)更新为(x+1,y),d更新为△y。
.当直线没有画完时,重复步骤 ,否则结束。
intx = 0;
inty =b;
Ellipsepot(x0,y0, x, y);
// 1
while(sqb*(x + 1) < sqa*(y - 0.5))
{
if(d < 0)
{
d += sqb*(2 * x + 3);
}
else
{
d += (sqb*(2 * x + 3) + sqa*((-2)*y + 2));
glVertex2i(198,2);
glEnd();
glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序

椭圆的中点生成算法

椭圆的中点生成算法

实验三.椭圆的中点生成算法1.算法分析椭圆方程:F(x, y) = b2x2 + a2y2 - a2b2 = 0定义椭圆弧上某点的切线法向量N如下:对方程分别求x偏导和y偏导,最后得到椭圆弧上(x,y)点处的法向量是(2b2x, 2a2y)。

椭圆弧法向量的y分量比较大,即:2b2(x + 1) < 2a2(y –0.5);椭圆弧法向量的x分量比较大,即:2b2(x +1) > 2a2(y –0.5)。

y方向每变化1个单位,x方向变化大于一个单位,因此中点算法需要沿着x方向步进画点,x每次增量加1,求y的值。

同理,中点算法沿着y方向反向步进,y每次减1,求x的值。

假设当前位置是P(xi, yi),则下一个可能的点就是P点右边的P1(xi+1, yi)点或右下方的P2(xi+1, yi-1)点,取舍的方法取决于判别式di:di = F(xi+1, yi-0.5) = b2(xi+1)2 + a2(yi-0.5)2 –a2b2若di < 0,表示像素点P1和P2的中点在椭圆内,这时可取P1为下一个像素点。

此时xi+1 = xi + 1,yi+1 = yi,di+1 = di + b2(2xi + 3)计算出di的增量是b2(2xi + 3)。

同理,若di >= 0,表示像素点P1和P2的中点在椭圆外,这时应当取P2为下一个像素点。

此时xi+1 = xi + 1,yi+1 = yi - 1,di+1 = d1 + b2(2xi+3) + a2(-2yi+2)计算出di的增量是b2(2xi+3)+a2(-2yi+2)。

计算di的增量的目的是减少计算量,提高算法效率,每次判断一个点时,不必完整的计算判别式di,只需在上一次计算出的判别式上增加一个增量即可。

2.代码实现void CHuXiaoHua_graphics3View::OnMidpointEllipse(){// TODO: Add your command handler code hereCDC* dc = GetDC();int a=136,b=104,color=RGB(255,35,67),x,y;double e1,e2;x = 0; y = b;e1 = a*a*(-b+0.25)+b*b ;while( b*b*(x+1) < a*a*(y-0.5)){if(e1<0){e1 +=b*b*(2*x+3);x++;else{e1 += (b*b*(2*x+3)+a*a*(-2*y+2));x++;y--;}CHuXiaoHua_graphics3View::Ellipse(x,y,color,dc); }e2=sqrt(b*(x+0.5))+sqrt(a*(y-1))-sqrt(a*b);while(y >0){if (e2 <0){e2 += b*b*(2*x+2)+a*a*(-2*y+3);x++;y--;}else{e2 += a*a*(-2*y+3);y--;CHuXiaoHua_graphics3View::Ellipse(x,y,color,dc);}}void CHuXiaoHua_graphics3View::Ellipse(int x,int y,int color,CDC* dc){dc->SetPixel(x+346,y+265,color);dc->SetPixel(-x+346,y+265,color);dc->SetPixel(-x+346,-y+265,color);dc->SetPixel(x+346,-y+265,color);}3.运行结果。

计算机图形学-画椭圆和圆

计算机图形学-画椭圆和圆
glVertex2i(198,2);
glEnd();
glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序
}
int main(int argc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式
// 1
while(sqb*(x + 1) < sqa*(y {
d += sqb*(2 * x + 3);
}
else
{
d += (sqb*(2 * x + 3) + sqa*((-2)*y + 2));
--y;
}
++x;
Ellipsepot(x0,y0, x, y);
// glRectf(50.0f,100.0f,150.0f,50.0f); //绘制一个矩形
glPointSize(10); //三个点
glBegin(GL_POINTS);
glColor3f(1.0f,0.0f,0.0f);
glVertex2i(2,148);
glVertex2i(100,75);
实验一
1.实验目的
了解OpenGL编程,并熟悉OpenGL的主要功能、绘制流程和基本语法。学会配置OpenGL环境,并在该环境中编程绘图。
2.实验内容
OpenGL的主要功能:模型绘制、模型观察、颜色模式、光照应用、图像效果增强、位图和图像处理、纹理映射、实时动画和交互技术。
OpenGL的绘制流程分为两个方面:一个完整的窗口系统的OpenGL图形处理系统的结构为:最底层为图形硬件,第二层为操作系统,第三层为窗口系统,第四层为OpenGL,最上面的层为应用软件;OpenGL命令将被放在一个命令缓冲区中,这样命令缓冲区中包含了大量的命令、顶点数据和纹理数据。当缓冲区被清空时,缓冲区中的命令和数据都将传递给流水线的下一个阶段。

中点画圆算法实验报告

中点画圆算法实验报告

中点画圆算法实验报告篇一:计算机图形学实验报告-中点画圆算法班级R数学111大连交通大学姓名实验报告同组人课程名称: 计算机图形学成绩实验名称: 中点画圆算法指导老师篇二:中点算法画填充圆实验报告中点算法画填充圆实验报告一(实验题目中点算法画填充圆。

中点画圆算法内容:1,输入圆心位置和圆的半径,得到圆周上的第一个点Point1;(假设起始点为坐标原点,后面将通过坐标平移来处理非圆心在圆点)2,计算决策关键参数的初始值,P = 5/4 - r;3,在每个Xn的位置,从n = 0开始,更具决策值P来判断:如果P&lt;0,下一个点的位置为(Xn+1,Yn);并且执行P = P + 2*x+3;如果P&gt;=0,下一个点的位置为(Xn+1,Yn-1);并且执行P = P + 2.0*(x-y)+5;4,通过对称原理计算其他7个对称相关点;5,移动坐标到圆心点(x1,y1)X = X + x1;Y = Y + y1;6,如果X&lt;Y重复执行3到5的步骤,否则结束该算法源代码:#include&lt;GL/glut.h&gt;GLint xc = 0;GLint yc = 0;int p[200][200];class screenPt{private:GLint x,y;public:screenPt(){x = y = 0;}void setCoords(GLint xCoordValue,GLint yCoordValue){ x = xCoordValue;y = yCoordValue;}GLint getx() const{return x;}GLint gety() const{return y;}void incrementx(){x++;}void decrementy(){y--;}};void setPixel(GLint xCoord,GLint yCoord){p[xCoord][yCoord]=1;//设置边缘色为1glBegin(GL_POINTS);glVertex2i(xCoord,yCoord);glEnd();}void circlePlotPoints(GLint xc,GLint yc,screenPt circPt) {setPixel(xc + circPt.getx(),yc + circPt.gety());setPixel(xc - circPt.getx(),yc + circPt.gety());setPixel(xc + circPt.getx(),yc - circPt.gety());setPixel(xc - circPt.getx(),yc - circPt.gety());setPixel(xc + circPt.gety(),yc + circPt.getx());setPixel(xc - circPt.gety(),yc + circPt.getx());setPixel(xc + circPt.gety(),yc - circPt.getx());setPixel(xc - circPt.gety(),yc - circPt.getx());}void circleMidpoint(GLint radius)screenPt circPt;GLint p = 1 - radius;circPt.setCoords(0,radius);void circlePlotPoints(GLint,GLint,screenPt); circlePlotPoints(xc,yc,circPt);while(circPt.getx()&lt;circPt.gety()){circPt.incrementx();if(p&lt;0)p+=2*circPt.getx()+1;else{circPt.decrementy();p+=2*(circPt.getx() - circPt.gety())+1;}circlePlotPoints(xc,yc,circPt);}}void getPixel(int x , int y , int&amp; Color ) {Color=p[x][y];}void setPixel2 (GLint xCoord , GLint yCoord) {//p[i][j]=1;填充色为2p[xCoord][yCoord]=2;glColor3f(0.0,1.0,1.0);glPointSize(5);glBegin (GL_POINTS);glVertex2f(xCoord , yCoord);glEnd ();}void boundaryFill4 (int x, int y, int fillColor,int borderColor) {int interiorColor;getPixel (x, y, interiorColor);if((interiorColor != borderColor ) &amp;&amp;(interiorColor !=fillColor)){setPixel2 (x, y);boundaryFill4 (x + 1, y , fillColor, borderColor);boundaryFill4 (x - 1, y , fillColor, borderColor);boundaryFill4 (x , y + 1, fillColor, borderColor);boundaryFill4 (x , y - 1, fillColor, borderColor);}void renderScene(void ){glClear(GL_COLOR_BUFFER_BIT);gluOrtho2D(-500,500,-500,500);glPointSize(3);circleMidpoint(30);boundaryFill4(100, 100, 2, 1);glFlush();}int main(int argc, char *argv[]){glutInit(&amp;argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow(&quot;一个OpenGL程序&quot;);glutDisplayFunc(&amp;renderScene);glutMainLoop((本文来自: 博旭范文网:中点画圆算法实验报告));return 0;}运行结果:实验总结:这次试验总的来说,就是根据书里的实验思想,再稍加修改就可以得到正确的答案。

中心点画椭圆算法

中心点画椭圆算法

中心点画椭圆算法是一种在计算机图形学中绘制椭圆的算法。

下面是一个简单的步骤描述,展示如何使用这种方法:
1.
定义椭圆参数:首先,你需要定义椭圆的中心点(通常表示为(x, y)),以及两个半轴的长度,通常表示为a和b。

其中,a是椭圆水平方向上的半轴长度,b是垂直方向上的半轴长度。

2.
3.
计算控制点:对于椭圆上的任意一点P(x, y),我们需要找到两个控制点,这两个控制点将与椭圆的中心点一起确定椭圆上的这个点。

这两个控制点的坐标可以通过以下公式计算:
4.
1.控制点1的坐标为(x0, y0),其中x0 = (x - xc) / 2, y0 = (y - yc) / 2
2.控制点2的坐标为(x1, y1),其中x1 = (x + xc) / 2, y1 = (y + yc) / 2
其中,xc和yc分别是椭圆中心点的x和y坐标。

5.
绘制椭圆:然后,你可以使用控制点和对应的控制线来绘制椭圆。

对于椭圆上的每个点P(x, y),你可以画出两条控制线,一条从P到控制点1,另一条从P到控制点2。

当这两条控制线相交时,你就可以找到椭圆上的下一个点。

6.
7.
迭代步骤:重复步骤3,直到绘制出完整的椭圆。

8.
请注意,这种方法可能不适用于所有情况,尤其是当椭圆的形状或尺寸发生动态变化时。

在这种情况下,可能需要更复杂的算法来处理这些变化。

学生数学小课题:《画椭圆的探究》

学生数学小课题:《画椭圆的探究》

学生数学小课题:《画椭圆的探究》学生数学小课题:《画椭圆的探究》一问题思索做手抄报、画画等经常用到椭圆,可我总画不出椭圆那顺滑柔美的线条。

我想:画直线可以用尺子,画圆可以用圆规,那椭圆又是怎样画的?用什么工具呢?我去过几家卖文具的商店,都没买到画椭圆的工具,我能不能创造一个画椭圆的工具呢?强烈的好奇心驱使我走进了椭圆的探究。

二研究意义我做这样一个小课题,其一就是特别想通过自己的思考与实验,去弄明白自己不知道的数学知识或数学原理,在研究的过程中增强自己的数学思维能力,并获取一些操作经验。

其二,我想让同学们知道遇到新知识,展开联想,寻找新旧知识之间的关联点,在旧知识的的基础上解决新问题。

其三,我想让同学们知道生活与数学是分不开的,从数学中学到的知识完全可以运用到生活中,数学与生活从不分家。

三研究方法1、画图法:利用学过的知识,画与椭圆相关的图形,寻找它们和椭圆的关系。

2、分析法:通过数据分析,发现椭圆的大小与什么有关?3、实验法:动手做实验,求证椭圆的画法和三角形之间的联系,并制作了简易的画椭圆工具。

4、查阅法:通过上网查寻资料,了解椭圆的相关知识,对小课题进行补充研究,了解椭圆在生活中的应用。

四研究过程这段时间我们刚好学习了圆的知识,我知道了圆是在一个平面上与一点相距一特定的距离(半径)的所有点的集合,它是由曲线围成的平面图形。

圆的大小与半径有关,画圆可以用圆规。

如果把一个圆,均匀地压缩或拉伸,便成了椭圆。

一根圆木棒,用锯子斜着锯断,断面就是椭圆。

那什么是椭圆?椭圆怎么画?它的大小与什么有关呢?一个个问题萦绕在我的脑海里。

我静静地思考着,决定去弄个明白。

Part.01初步探究1.思考与猜想2.操作与验证为了得到准确的结论,我让妈妈帮我在电脑里绘制出3个形状不一样大的椭圆打印出来让我进行研究。

操作一:方法如下:先将椭圆对折,折痕与椭圆边上的交点标上A、B,连接AB,再在线段AB同一侧的椭圆边上取C1,C2,C3,C4,C 5,C6,C7分别与A点.B点连接,测量线段AB,AC1,AC2,AC3…BC1,BC2,BC3…的长度,计算周长。

实验2 圆和椭圆的绘制

实验2  圆和椭圆的绘制

安徽大学实验2 圆和椭圆的绘制实验目的1、通过实验,进一步理解和掌握中点算法;2、掌握以上算法生成椭圆或圆的基本过程;3、通过编程,完成用中点算法实现椭圆或圆的绘制。

实验环境计算机、Turbo C或其他C语言程序设计环境实验学时2学时,必做实验。

实验内容用中点(Besenham)算法实现椭圆或圆的绘制。

实验步骤1.算法、原理清晰,有详细的设计步骤;2.依据算法、步骤或程序流程图,用C语言编写源程序;3.编辑源程序并进行调试;4.进行运行测试,并结合情况进行调整;5.对运行结果进行保存与分析;6.打印源程序或把源程序以文件的形式提交;7.按格式书写实验报告。

分析与思考1.为何在程序运行时,有的椭圆或圆仅在屏幕左上角显示了一部分?2.用中点算法生成的椭圆,为何在半径较大时,图形的失真严重?#include < graphics.h >void midbresenhamellipse(int x0,int y0,int a,int b,int color){int x,y;float d1,d2;x=0;y=b;d1=b*b+a*a*(-b+0.25);putpixel(x+x0,y+y0,color);putpixel(x0-x,y0-y,color);putpixel(x0-x,y0+y,color);putpixel(x0+x,y0-y,color);while(b*b*(x+1)<a*a*(y-0.5)){if(d1<=0){d1+=b*b*(2*x+3);x++;}else{d1+=b*b*(2*x+3)+a*a*(-2*y+2);x++;y--;}putpixel(x+x0,y+y0,color);putpixel(x0-x,y0-y,color);putpixel(x0-x,y0+y,color);putpixel(x0+x,y0-y,color);}d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;while(y>0){if(d2<=0){d2+=b*b*(2*x+2)+a*a*(-2*y+3);x++;y--;}else{d2+=a*a*(-2*y+3);y--;}putpixel(x0+x,y0+y,color);putpixel(x0-x,y0-y,color);putpixel(x0-x,y0+y,color);putpixel(x0+x,y0-y,color);}}int main(){int gdriver=DETECT,gmode;initgraph(&gdriver,&gmode,"C:\\tc20\\BGI");setbkcolor(WHITE);midbresenhamellipse(200,200,60,40,RED);getch();closegraph();return 0;}。

计算机图形学实验报告-中点画圆算法

计算机图形学实验报告-中点画圆算法
pDC->SetPixel((xc-x),(yc+y),c);
pDC->SetPixel((xc+x),(yc-y),c);
pDC->SetPixel((xc-x),(yc-y),c);
pDC->SetPixel((xc+y),(yc+x),c);
pDC->SetPixel((xc-y),(yc+x),c);
通过上机实践,更好地掌握中点画圆算法
实验仪器:
PC机、VC6.0
实验步骤、内容:
菜单
消息响应函数:
void CDrawCircleView::OnMidPoint()
{
CDC *pDC=GetDC();
int xc=200,yc=300,r=50,c=0;
int x,y; float d;
x=0;y=r;d=1.25-r;
pDC->SetPixel((xc+x),(yc+y),c);
pDC->SetPixel((xc-x),(yc+y),c);
pDC->SetPixel((xc+x),(yc-y),c);
pDC->SetPixel((xc-x),(yc-y),c);
pDC->SetPixel((xc+y),(yc+x),c);
pDC->SetPixel((xc-y),(yc+x),c);
pDC->SetPixel((xc+y),(yc-x),c);
pDC->SetPixel((xc-y),(yc-x),c);
while(x<=y)
{
if(d<0)

贵州大学--实验二:圆和椭圆的生成算法

贵州大学--实验二:圆和椭圆的生成算法
实验要求1掌握圆的基本特性八对称性2掌握椭圆的基本特性四对称性3掌握中点算法和二次差分法的思想4熟练的编写出测试代码实验原理一中点算法画圆和椭圆的实验原理一画圆因为圆具有八对称性可以先画出第二个八分圆利用八对称性画出其它八分圆
贵州大学实验报告
学院:计算机科学与信息学院 姓名 实验时间 实验项目名称 实 验 目 的 1, 掌握圆的基本特性(八对称性) 实 2, 掌握椭圆的基本特性(四对称性) 验 3, 掌握中点算法和二次差分法的思想 要 4, 熟练的编写出测试代码 求 一、中点算法画圆和椭圆的实验原理 (一) 画圆 因为圆具有八对称性,可以先画出第二个八分圆, 利用八对称性画出其它八分圆。已知圆弧的隐函数 的形式为: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)为已确定的象素坐标, 则下一个象素只能是正右方的 T 点或右下方的 B 点。 设 M 是 T 和 B 的中点,则 M 的坐标为(xi+1,yi-0.5) F(x,y)<0 F(x,y)=0 F(x,y)>0 掌握圆和椭圆的中点算法及二次差分法, 了解并掌握在光栅显示系统中圆和椭圆的生成 和显示算法,并在自己熟悉的平台上实现相应的测试代码。 学号 指导教师 实验二:圆和椭圆的生成算法 专业:软件工程 班级:102 实验组 成绩
2 2 2 2 2 2
实 硬件平台:PC 机 验 软 环 编程语言:java 境 1. 掌握中点算法和二次差分法画圆和椭圆的基本原理; 实 2. 依据算法,在 eclipse 下编写源程序并进行调试; 验 3. 对运行过程中的错误进行修改; 步 4. 对运行结果进行分析与总结; 骤 5.书写实验报告。 中心算法画圆的核心代码如下: public void midPointDrawCircle(int r, Graphics g) { int x, y; float d; x = 0; y = r; d = 1 - r; g.drawLine(x + MOVE, y + MOVE, x + MOVE, y + MOVE); 实 验 内 容 g.drawLine(x + MOVE, -y + MOVE, x + MOVE, -y + MOVE); while (x <= y) { if (d < 0) {// M在圆的内部,取正右方的点 d += 2 * x + 3; x++; } else {// M在圆的外部,取右下方的点 d += 2 * (x - y) + 5; y--; x++; } // 画对称位置上的圆 g.drawLine(x + MOVE, y + MOVE, x + MOVE, y + MOVE); 件:Windows 平台,eclips从上半部进入了下半部, 如果 b2x>=a2y, 则椭圆进 入下半部份,此时令△y=1,且:d0=b2(x+0.5)2+a2(y-1)2-a2b2 (a) 若 d<0, 则 M 在 椭 圆 内 部 , 取 右 下 方 像 素 R , 则 d=F(xp+1.5,yp-2), 增 量 为 2(b2xi+1-a2yi+1)+a2 (b)若 d>=0,M 在椭圆的外部, 取正下方像素 L, d=F(xp+0.5,yp-2), 则 增量为: 2(-2yi+1+1) a 下半部分的终止条件为 y=0

Bresenham椭圆算法

Bresenham椭圆算法

GIS专业实验报告(计算机图形学)实验3 使用Bresenham画椭圆算法,绘制一个椭圆一.实验目的及要求根据Bresenham画椭圆算法,掌握绘制椭圆的程序设计方法。

在绘制时应利用椭圆的对称性。

注意,不能使用语言库中的画圆函数。

二.理论基础1.Bresenham椭圆算法:中点Bresenham椭圆绘制算法的基本原理与中点Bresenham画圆算法类似,也是尽可能的迫近椭圆(多边形迫近法),推导出圆弧的增量算法的表达式,找到最接近椭圆圆弧的像素点。

三.算法设计与分析程序源码如下:#include <gl/gl.h>#include <gl/glu.h>#include <gl/glut.h>#include <math.h>#include <stdio.h>void drawEllipse (int a, int b, int xLoc, int yLoc){glPushMatrix ();int x, y;float d1, d2, aa, bb;aa = a * a;bb = b * b;d1 = bb + aa * (-b + 0.25);glTranslatef ((GLfloat) xLoc, (GLfloat) yLoc, 0.0f);x = 0;y = b;glBegin (GL_POINTS);glVertex2i ( x, y);glVertex2i (-x, y);glVertex2i (-x, -y);glVertex2i ( x, -y);while (bb * (x + 1) < aa * (y - 0.5)){if (d1 <= -0.000001){d1 += bb * ((x << 1) + 3);}else{d1 += bb * ((x << 1) + 3) + aa * (2 - (y << 1));-- y;}++ x;glVertex2i ( x, y);glVertex2i (-x, y);glVertex2i (-x, -y);glVertex2i ( x, -y);}d2 = bb * (0.25 * x) + aa * (1 - (y << 1));while (y > 0){if (d2 <= -0.000001){++ x;d2 += bb * ((x + 1) << 1) + aa * (3 - (y << 1));}else{d2 += aa * (3 - (y << 1));}-- y;glVertex2i ( x, y);glVertex2i (-x, -y);glVertex2i (-x, y);glVertex2i ( x, -y);}glEnd ();glPopMatrix ();}void display (void){glClearColor(0.0,0.0,0.0,0.0);glClear (GL_COLOR_BUFFER_BIT);glLoadIdentity ();glColor3f (1.0f, 0.0f, 0.0f);drawEllipse (400, 300, 50, 50);glutSwapBuffers ();glFlush();}void reshape (int w, int h){glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity ();if (w <= h){gluOrtho2D (-600.0, 600.0, -600.0 * (GLfloat) h / (GLfloat) w, 600.0 * (GLfloat) h / (GLfloat) w);}else{gluOrtho2D (-600.0 * (GLfloat) w / (GLfloat) h,600.0 * (GLfloat) w / (GLfloat) h, -600.0, 600.0);}glMatrixMode (GL_MODELVIEW);glLoadIdentity ();}int main (int argc, char ** argv){glutInit (&argc, argv);glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);glutInitWindowSize (450,450);glutCreateWindow ("Bresenham 椭圆");glClearColor(0.0,0.0,0.0,0.0);glutReshapeFunc (reshape);glutDisplayFunc (display);glutMainLoop ();}四.试及运行结果的自我分析与自我评价图1 椭圆运行结果五.实验心得及建议。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、实验目标
1.了解中点画椭圆法的基本思想;
2.掌握中点画椭圆法的基本步骤。

二、实验内容
本次实验要解决的问题主要是中点画椭圆法,椭圆中心不在原点及长轴和短轴任意长度的画椭圆问题。

原理简述:中点法依据椭圆斜率将第一像限的椭圆(b ≤a)分成两部分。

根据
斜率变化确定步长方向:斜率绝对值小于1的区域1内x 方向取单位步长;斜率绝对值大于
1的区域2内y 方向取单位步长。

椭圆对称性质:椭圆分别关于X 轴、Y 轴对称。

因此在计算椭圆生成的时候,只需要计算1/4个椭圆,经过对称原理就可以实现其他3/4个椭圆的生成了,即:计算出目标点(x,y )的坐标,必然存在(x,-y )、(-x,y )(-x,-y )。

此方案中采用计算第一象限中椭圆的生成,即:计算x=0到y=0的1/4的椭圆。

先通过平移的方法将假设椭圆中心在坐标原点,然后计算,最后再平移到真实中心位置。

三、实验步骤
一、打开cgdemoMFC 工程
1.打开Microsoft Visual Studio 2008
2.File-->Open-->cgdemo.sln
二、添加菜单
1.左侧视图栏中有三个视图:ClassView 、ResourceView 、FileView ,点击 ResourceView
2.展开cgdemo ,展开Menu ,双击IDR_MAINFRAME
第一象限椭圆区域划分 区域1:椭圆切线斜率小于1;
区域2:椭圆切线斜率大于1。

3.在右侧窗口菜单栏中找到“基本图形生成”菜单项,在该菜单项中添加“中点画圆法”,在“中点画圆法”属性框中找到ID框填:ID_LINE_ELLIPSE。

三、创建、编辑函数
1.打开cgdemoView.h头文件,在cgdemoView类枚举类型成员变量m_drawstyle中添加LINE_ELLIPSE。

2.给菜单项“中点画椭圆法”添加命令消息响应函数OnLineCircle()在该函数中添加以下程序代码。

void CcgdemoView::OnLineEllipse()
{
// TODO: Add your command handler code here
m_drawstyle=LINE_ELLIPSE;
Invalidate(true);
}
3.在鼠标左键按下消息响应函数中添加当m_drawstyle为LINE_ELLIPSE时的情况,代码如下所示。

void CcgdemoView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
switch(m_drawstyle)
{
case LINE_DDA:
case LINE_MIDPT:
case LINE_ELLIPSE:
}
4.在鼠标移动消息响应函数中添加m_drawstyle为LINE_CIRCLE时的情况,代码如下所示。

void CcgdemoView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
switch(m_drawstyle)
{
case LINE_DDA:
case LINE_MIDPT:
case LINE_ELLIPSE:
}
5.在cgdemoView.h头文件类中添加成员函数void MidpointEllipse(CDC* pDC, int x0,int y0,int x1, int y1,int color);并在cgdemoView.cpp源文件中void CcgdemoView::MidpointEllipseCDC* pDC,int x0,int y0,int x1,int y1,int color)为其
添加我们编写的中点画椭圆法代码;在中点画圆法中我们要计算两点之间的距离
以求椭圆的长轴和短轴,在此过程中用到了abs()函数,因此要在cgdemoView.cpp 添加#include"math.h"头文件。

四、实验遇到的问题及其解决方法(重点)
(包括在算法推导、编程、编译过程中遇到的问题、解决过程和最终解决方法)。

在中点画圆法程序的编写过程中在算法推导方面主要遇到的问题是:上下部分分界点的判断问题。

通过老师的讲解和同学之间的讨论以及网上资料的查找最终解决了该问题。

在算法编程过程遇到的主要问题是:原始设定椭圆圆心的坐标(0,0),我们实现的是任意椭圆圆心坐标的中点画椭圆法,对于椭圆圆心坐标的编写的过程遇到问题。

最终通过网上资料的查找解决任意椭圆圆心坐标编写的问题。

在编译过程遇到的问题:在中点画圆法中我们要计算两点之间的距离以求椭圆的长轴和短轴,在此过程中用到了abs()函数,该函数包含在”math.h”中,刚开始编写时忘记添加"math.h"头文件导致编译出现错误。

编译成功后,但运行程序后发现画出来椭圆有一部分是直线。

通过单步调试发现程序编写的错误,运算符号写错“-”写成了“+”是程序画出来的椭圆出现直线的根源,改正之后,画出的椭圆满足要求。

五、实验结论和收获
通过做中点画椭圆算法,让我了解到了中点画椭圆算法实现的基本思想,掌握中点画椭圆法的基本步骤,加深我对中点画椭圆算法的理解;对MFC单文档工程更加熟悉,学会了对菜单项的添加以及对添加的菜单项添加消息命令函数,左键按下以及鼠标移动消息响应函数等等。

最后,编写程序一定要仔细认真,细小错误都会导致整个程序运行不成功!程序编写完成要仔细检查,要养成良好的编程规范!。

相关文档
最新文档