p03直线、圆、椭圆的生成

合集下载

数学中常用几何画板绘制椭圆

数学中常用几何画板绘制椭圆

数学中常⽤⼏何画板绘制椭圆圆锥曲线是⾼中数学的重点和难点,也是历来⾼考的必考内容,所以对于⾼中⽣来说,弄懂圆锥曲线这块难啃的⾻头,是很有必要的。

其中要熟练掌握的圆锥曲线之⼀就是椭圆,它是圆锥与平⾯的截线,其实要想画出椭圆,其⽅法不⽌⼀种,下⾯就⼀起来通过学学椭圆的五种画法。

⽅法⼀、利⽤椭圆第⼀定义构造椭圆椭圆第⼀定义:平⾯内到两个定点的距离之和等于定长2a(a>0)的点的轨迹就是椭圆,按照此定义可画出椭圆,具体步骤如下:1.单击“圆⼯具”,在画板的适当位置任意画⼀个圆,将圆⼼的标签改为F1。

单击“点⼯具”,在圆上任意画⼀点C,同时选中点F1和点C,执⾏“构造”-“线段”命令,构造出线段F1C。

单击“点⼯具”,在线段F1C任意画⼀点F2。

2.在圆上任意画⼀点E,并构造线段EF1和线段EF2。

选中线段EF2,执⾏“构造”-“中点”命令,构造线段EF2的中点F。

3.选中线段EF2和点F,执⾏“构造”-“垂线”命令,构造出线段EF2的垂直平分线j。

同时选中线段EF1和直线j,选择“构造”-“交点”命令,构造线段EF1和直线j的交点G。

4.选中点G和点E(把点E称做是点G的相关点,改变G点的位置,点E的位置也跟着改变),选择“构造”-“轨迹”命令,可画出椭圆。

拖动点B 和点F2可改变椭圆的形状。

⽅法⼆、利⽤椭圆第⼆定义画椭圆椭圆的第⼆定义:设动点M(x, y)与定点F(c, 0)的距离和它到定直线l: x=a2/c的距离的⽐是常数(a>c>0),则点M的轨迹是椭圆。

点F 是椭圆的⼀个焦点,直线l是椭圆中对应于焦点F的准线,常数e=c/a(0<e<1)。

具体的操作步骤如下:步骤⼀打开⼏何画板,使⽤“点⼯具”画任意⼀点F,使⽤“线⼯具”画直线L(点F不在L上)。

过点F作⼀条直线,在直线上取⼀点P;步骤⼆选中点F、P执⾏“度量”--“距离”命令,度量FP的长度;选中点F和度量的FP的长度,执⾏“构造”--“以圆⼼和半径绘圆”构造以点F为圆⼼,FP为半径的圆。

计算机图形学-三种直线生成算法及圆的生成算法

计算机图形学-三种直线生成算法及圆的生成算法

计算机科学与技术学院2013-2014学年第一学期《计算机图形学》实验报告班级:110341C学号:110341328姓名:田野教师:惠康华成绩:实验(一):平面图形直线和圆的生成一、实验目的与要求1.在掌握直线和圆的理论基础上,分析和掌握DDA生成直线算法、中点生成直线算法、Bresenham生成直线算法、中点画圆算法、Bresenham圆生成算法。

2.熟悉VC6.0MFC环境,利用C语言编程实现直线和圆的生成。

3.比较直线生成三种算法的异同,明确其优点和不足。

同时了解圆的生成算法适用范围。

二、实验内容1.掌握VC6.0环境中类向导和消息映射函数的概念,并且为本次实验做好编程准备工作。

2. 用C语言进行编程实现上述算法,并且调试顺利通过。

3. 在MFC图形界面中显示不同算法下的图形,并且注意对临界值、特殊值的检验。

完成后保存相关图形。

三、算法分析➢DDA直线生成算法描述:1)给定一直线起始点(x0,y0)和终点(x1,y1)。

分别计算dx=x1-x0,dy=y1-y0。

2)计算直线的斜率k=dy/dx。

当|k|<1时转向3);当|k|<=1时,转向4);3)当x每次增加1时,y增加k。

即(xi,yi)→(xi+1,yi+k)。

直到xi增加到x1。

并且每次把得到的坐标值利用系统函数扫描显示出来。

但要注意对y坐标要进行int(y+0.5)取整运算。

结束。

4)对y每次增加1时,x增加1/k,即(xi,yi)→(xi+1/k,yi+1)。

直到yi增加到y1. 并且每次把得到的坐标值利用系统函数扫描显示出来。

但要注意对x坐标要进行int(x+0.5)取整运算。

结束。

➢中点生成算法描述:算法基本思想:取当前点(xp,yp),那么直线下一点的可能取值只能近的正右方点P1(xp+1,yp)或者P2(xp+1,yp+1)。

为了确定好下一点,引入了这两点中的中点M(xp+1,yp+0.5)。

这时可以把改点带入所在直线方程,可以观察该中点与直线的位置关系。

高中数学复习指导:生成椭圆的五种平面几何条件

高中数学复习指导:生成椭圆的五种平面几何条件

x2 y 2 + = 1 上. a 2 b2
5.利用两直线的交点生成椭圆: 利用两直线的交点生成椭圆:
y −0 y −0 b2 y −b y +b b2 ⋅ = − 2 ,或 ⋅ =− 2 x−a x+a a x −0 x −0 a 2 2 2 2 2 2 2 x y y x y a −x (1) 把 2 + 2 = 1 变形为 2 = 1 − 2 , 2 = , a b b a b a2
椭圆方程: 椭圆方程:
y2 b2 y −0 y −0 b2 = ⋅ = − 在 x ≠ ±a 的条件下,又可变为 2 ,即 , a − x 2 a2 x−a x+a a2 b2 这表明椭圆上的点 ( x, y) 与长轴端点连线的斜率之比为定值 − 2 . a b2 即当我们过定点 (a,0) 、 ( −a,0) 作两条直线,其斜率之积为 − 2 时, a 2 2 x y 交点 M 在椭圆 2 + 2 = 1 上. a b 2 2 x y x2 y2 x2 b 2 − y 2 (2)把 2 + 2 = 1 变形为 2 = 1 − 2 , 2 = ,在 x ≠ 0 的条件下, a b a b a b2 b2 b 2 − y 2 y −b y +b b2 = ⋅ = − 又可变为 2 ,即 , a x2 x −0 x −0 a2 b2 这表明椭圆上的点 ( x, y ) 与短轴端点连线的斜率之比为定值 − 2 . a
生成椭圆的五种平面几何条件
我们以焦点在 x 轴上的椭圆为例探究其产生的主要的平面几何条件: 1.由两定点生成椭圆( : 由两定点生成椭圆(椭圆的定义) 椭圆的定义)
பைடு நூலகம்
( x + c)2 + y 2 + ( x − c)2 + y 2 = 2a ( 2a > 2c > 0 ) . 椭圆方程: 椭圆方程

直线、圆、椭圆的生成算法

直线、圆、椭圆的生成算法

计算机科学与技术学院2012-2013学年第一学期《计算机图形学》实验报告班级:100341C学号:100341328姓名:魏然教师:惠康华成绩:实验项目:直线、圆、椭圆的生成算法一、实验目的与要求(1)了解Visual C++等编程环境中常用控件命令与绘图函数,初步掌握在实验设计集成环境(IDE)下进行图形处理程序的设计方法。

(2)熟练掌握直线的3种扫描转换算法:DDA算法,中点算法和Bresenham算法。

(3)掌握中点画圆算法、圆的Brensenham算法和椭圆的中点算法。

二、实验内容(1)在Visual C++环境中设计MFC单文档程序,利用消息处理函数,搭建能运行图形算法程序的平台。

(2)在平台中使用已有的点、线、圆等绘图函数,设计一个平面图形。

Visual C++基本绘图函数可参考有关文献。

(3)根据教材中给定的算法,实现直线段的3种生成算法:DDA算法,中点法和Bresenham算法。

(4)根据教材中给定的算法,实现圆与椭圆的生成算法。

三、重要算法分析(一)、直线的生成1、DDA算法定义直线两端点和直线颜色:整型变量 x0=?, y0=?,x1=?,y1=?,c=颜色;定义整型变量x,y,i;浮点数dx,dy,k;根据数学算法得到斜率k,k=dy/dx,其中dx=(float)(x1-x0),dy=(float)(y1-y0);定义x=x0;y=y0;通过对x和y各增加一个小增量,计算下一步的x、y值。

当k的绝对值小于1的时候,标记一个像素点,像素点的坐标为(x,int(y+0.5),c),y=y+k,如果x=x i,则停止;当k的绝对值大于或等于1的时候,标记一个像素点,像素点的坐标为(int(x+0.5),y,c),x=x+1/k,如果y=y i,则停止;2、中点算法定义直线两端点和直线颜色:整型变量 x0=?, y0=?,x1=?,y1=?,c=颜色;定义浮点数:a,b,d1,d2,d,x,y;假设直线方程f(x,y)=ax+by+c=0,则a=y0-y1;b=x1-x0;判别式d=2*a+b;d1=2*a;d2=2*(a+b);定义x=x0;y=y0;标记像素点(x,y,c);x值逐一增加,y值取决于d;当d大于等于0的时候,取正右方的点,上一步的d值加d1;当d小于0的时候,取右上方的点,上一步的d值加d2;3、Bresenham算法定义直线两端点和直线颜色:整型变量 x0=?, y0=?,x1=?,y1=?,c=颜色;定义整型变量 i,x,y,dx,dy;整型变量:k,e;dx=x1-x0,dy=y1-y0;e=-dx;定义x=x0;y=y0;标记像素点(x,y,c),x逐一增加,e=e+2*dy,其中如果e>=0,则y增加,e=e-2*dx, 如果x=x i,则停止;(二)、圆的生成1、中点画圆定义圆的中点和圆弧颜色:整型变量 x0=?, y0=?,r=?,c=颜色,x,y,d;使x=0,y=r,d=1-r;标记像素点(x,y,c);当x<=y的时候,如果d<0,则d=d+2*x+3;否则d=d+2*(x-y)+5,y逐一减;x逐一增加,标记像素点(x+x0,y+y0,c);标记像素点(-x+x0,y+y0,c);标记像素点(-x+x0,-y+y0,c);标记像素点(x+x0,-y+y0,c);标记像素点(y+x0,x+y0,c);标记像素点(-y+x0,x+y0,c);标记像素点(-y+x0,-x+y0,c);标记像素点(y+x0,-x+y0,c);2、Bresenham画圆定义圆的中点和圆弧颜色:整型变量 x0=?, y0=?,r=?,c=颜色,x,y,e;浮点数e,d;使x=0,y=r,e=3-2*r;当x<=y的时候,如果e<0,则e=e+4*x+6,x逐一增加;否则e=e+4*(x-y)+10,x逐一增加,y逐一减;标记像素点(x+x0,y+y0,c);标记像素点(-x+x0,y+y0,c);标记像素点(-x+x0,-y+y0,c);标记像素点(x+x0,-y+y0,c);标记像素点(y+x0,x+y0,c);标记像素点(-y+x0,x+y0,c);标记像素点(-y+x0,-x+y0,c);标记像素点(y+x0,-x+y0,c);四、程序运行截图图1 直线的生成图2 圆的生成五、总结与调试经验通过本次试验,我初步了解了怎样在计算机上进行图形处理,并且学会了怎样在Visual C++上创建生成图形的工程,用不同算法实现了直线和圆的生成,知道了各个算法之间的优缺点。

几何画板生成椭圆曲线八种方法

几何画板生成椭圆曲线八种方法
三、同心圆法。
选择“文件”→“新绘图”,选择“图表”→“建立坐标轴”,用“圆”工具作两圆心为原点的同心圆(外圆半径长就是最终椭圆的长半轴长a,内圆半径长就是最终椭圆的短半轴长b),选中点B和圆周上的点C和D,按Ctrl+H键隐藏。
选择“显示”→“线型”→“虚线”,在外圆圆周上任取一点E,按住shift键,同时选中点A和点E,按Ctrl+L作出线段AE,同时选中线段AE和内圆圆周,按Ctrl+I键作出交点F。
2.按住shift键,先后选中点F,选择“显示”→“追踪点”,同样选中点G和点C,选择“显示”→“追踪点”。
按住shift键,先后选中点C和线段AB,选择“编辑”→“操作类按钮”→“动画”,弹出“匹配路径”对话框,选择“双向”、“沿着线段j”、“慢慢地”,按“动画”按钮完成设置。这时,绘图板上会出现一个“动画”按钮,双击“动画”按钮,就会自动画出椭圆。完成,存盘退出。
同时选中点A和点D,按Ctrl+L键作线段AD。再同时选中垂线k和线段AD定值。
选中点F,按Ctrl+T键追踪点F。选中点D和圆周,选择“编辑”→“操作类按钮”→“动画”,弹出“匹配路径”对话框,选择“单向”、“绕圆c1”、“正常地”,按“动画”按钮完成设置。这时,绘图板上会出现一个“动画”按钮,双击“动画”按钮,就会自动画出椭圆(如图4)。另外您也可以同时选中点F和点D,选择“作图”→“轨迹”也可以作出该椭圆。完成,存盘退出
二、准线法(到定点的距离与到定直线的距离之比为常数e)
打开一个新的绘图板,选择“图表”→“建立坐标轴”。
用“线段”工具作线段CD,在线段CD上任取一点E。同时选中点C和点E,选择“度量”→“距离”,量出CE的长。同样量出CD的长。
按住shift键,选中量出的CE和CD的距离,按鼠标右键弹出对话框,选择“度量”→“计算”。在打开的计算器中选择“数值”→“距离(C到E)”。选择“/”→“距离(C到D)”→“确定”。在绘图板上就会出现CE和CD的比值。用“文本工具”双击该值,弹出“度量值格式”对话框,选择“T文本格式”。 将“距离(C到E)/距离(C到D)”改成“e”,确定,完成改变。选中点B,按Ctrl+H键隐藏,在X轴上取点F(F为椭圆的一个焦点)。作线段GH,在其上取点I。用上面的方法量出GI的距离,并将其距离名称改为c。选中c和e的值,打开计算器,将c除以e的值求出,并将其名改为a。

CAD绘制椭圆

CAD绘制椭圆

CAD绘制椭圆椭圆是数学中常见的几何形状之一,也是CAD绘图中经常需要用到的图形。

在CAD软件中,我们可以通过一些特定的方法来绘制椭圆。

本文将介绍两种常用的CAD绘制椭圆的方法,并详细说明其步骤和注意事项。

方法一:使用命令绘制椭圆在CAD软件中,我们可以使用特定的命令来绘制椭圆。

下面将以AutoCAD为例,详细介绍使用命令绘制椭圆的步骤和注意事项。

步骤一:打开CAD软件,创建新的绘图文件。

步骤二:在绘图界面上,点击“绘图”或输入“ELLIPSE”命令来激活绘制椭圆的工具。

步骤三:在命令行中输入椭圆的两个焦点坐标。

焦点是椭圆的两个关键点,可以通过直接输入坐标值或者使用其他绘图工具来确定。

步骤四:输入椭圆的长轴和短轴长度。

长轴是椭圆的主轴,短轴是椭圆的次轴。

可以直接输入数值或者通过其他绘图工具进行测量。

步骤五:按下“Enter”键,CAD软件将自动绘制出完整的椭圆。

注意事项:1. 在输入焦点坐标和长短轴长度时,要保证输入的值是准确的,以免绘制出不符合要求的椭圆。

2. 可以使用捕捉功能来辅助输入焦点坐标和长度数值,保证绘制的椭圆准确无误。

方法二:使用绘图工具绘制椭圆除了使用命令,CAD软件中也提供了绘图工具来绘制椭圆。

下面将以SketchUp为例,详细介绍使用绘图工具绘制椭圆的步骤和注意事项。

步骤一:打开CAD软件,创建新的绘图文件。

步骤二:在绘图界面上,点击“绘制”或选择相应的绘图工具栏,找到绘制椭圆的工具。

步骤三:点击椭圆绘制工具,然后在绘图界面上按住鼠标左键,拖动鼠标来绘制椭圆。

步骤四:根据绘制的需求,调整椭圆的长轴和短轴长度。

步骤五:松开鼠标左键,CAD软件将自动绘制出完整的椭圆。

注意事项:1. 使用绘图工具绘制椭圆时,要保持手稳定,以免绘制出形状不规则的椭圆。

2. 可以使用软件提供的辅助工具,如吸附功能和对象捕捉,来实现更精确的绘制。

总结:本文介绍了两种常用的CAD绘制椭圆的方法,使用命令和绘图工具。

直线和圆的方程怎么联立

直线和圆的方程怎么联立

直线和圆的方程怎么联立直线和圆是几何学中的基本图形,它们之间的关系在解决问题时非常重要。

如何联立直线和圆的方程,可以通过以下步骤来进行。

假设我们要解决的问题是找到直线和圆的交点坐标。

1.建立直线的方程直线的方程可以用一般式表示,即Ax + By + C = 0。

其中,A、B、C分别是直线的系数。

如果我们已经知道直线上的两个点(x1, y1)和(x2, y2),可以通过以下公式计算出直线的系数:A = y2 - y1B = x1 - x2C = x2y1 - x1y22.建立圆的方程圆的方程有多种表示方法,其中一种常用的是标准式,即 (x - h)² + (y - k)² = r²。

其中,(h, k)是圆心的坐标,r是圆的半径。

如果我们已经知道圆心的坐标和半径,那么可以直接将这些值代入方程中。

3.将直线的方程代入圆的方程将直线的方程中的x和y分别代入圆的方程,得到一个关于未知数的二次方程。

解这个二次方程,即可求出直线和圆的交点坐标。

求解二次方程可以使用求根公式或者配方法。

4.求解交点坐标根据求解的二次方程,可得到交点的横坐标x和纵坐标y。

这两个坐标就是直线和圆的交点的坐标。

通过以上步骤,我们可以联立直线和圆的方程,并求出它们的交点坐标。

这样的求解方法在几何学中应用广泛,可以帮助我们解决直线和圆相关的问题。

下面是一个具体的例子来说明如何联立直线和圆的方程:假设有一条直线L,它通过点(1, 2)和(3, 4),要求找到直线L和圆C的交点坐标。

1.建立直线的方程通过点(1, 2)和(3, 4)可以计算出直线的系数: A = 4 - 2 = 2 B = 1 - 3 = -2 C = 3×2 - 1×4 = 2所以直线L的方程为:2x - 2y + 2 = 02.建立圆的方程假设圆C的圆心坐标为(0, 0),半径为2。

将这些值代入圆的标准方程中,得到圆C的方程:x² + y² = 43.将直线的方程代入圆的方程将直线L的方程中的x和y分别代入圆C的方程,得到一个关于未知数的二次方程:(2x - 2y + 2)² + y² = 44.求解交点坐标解这个二次方程,可以得到直线L和圆C的交点坐标。

椭圆的生成算法原理

椭圆的生成算法原理

椭圆的生成算法原理椭圆是数学中一个重要的几何图形,其形状类似于拉伸的圆,具有许多特殊的性质和应用。

椭圆的生成算法是指通过一系列步骤和公式来确定椭圆上各个点的坐标,即生成椭圆的过程。

下面将详细介绍椭圆的生成算法原理。

椭圆的生成算法主要有两种,一种是解析生成算法,另一种是数值生成算法。

1. 解析生成算法:解析生成算法是通过椭圆的几何性质以及数学公式来确定椭圆上各个点的坐标。

椭圆的数学定义是平面上到两个定点F1和F2的距离之和恒定的点的集合,这个距离之和被称为椭圆的焦距。

椭圆的生成算法可以通过以下步骤来实现:(1)确定椭圆的中心点坐标:椭圆的中心点坐标是椭圆坐标系的原点,可以通过给定的椭圆中心点位置来确定。

(2)确定椭圆的长轴和短轴长度:椭圆的长轴和短轴是确定椭圆形状的关键参数,可以通过给定的椭圆长轴长度和短轴长度来确定。

(3)确定椭圆的旋转角度:椭圆可以绕着中心点旋转一定角度,旋转角度可以通过给定的旋转角来确定。

(4)根据椭圆的数学公式确定椭圆上各个点的坐标:椭圆的数学公式为:x = a * cosθ,y = b * sinθ,其中a和b分别是椭圆的长轴和短轴长度,θ是点P在椭圆上的极角。

通过以上步骤,椭圆的生成算法能够确定椭圆上任意给定角度的点的坐标。

2. 数值生成算法:数值生成算法是通过数值计算的方法来确定椭圆上各个点的坐标。

常用的数值生成算法有Bresenham算法和中点画圆法。

(1)Bresenham算法:Bresenham算法是一种通过离散化的方法来绘制椭圆的生成算法。

该算法通过遍历椭圆的象限来确定椭圆上各个点的坐标,并在每个象限内使用Bresenham画线算法来绘制曲线。

(2)中点画圆法:中点画圆法是一种通过迭代计算的方法来绘制椭圆的生成算法。

该算法通过以椭圆的中心点为起点,按照逆时针方向遍历椭圆的一个象限,根据一个决策参数来确定椭圆上各个点的坐标。

这两种数值生成算法能够准确地绘制椭圆,适用于计算机图形学等领域。

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




//斜率判断,斜率绝对值大于1,则m为false,否则为 true bool m=(fabs(y1-y0)<=fabs(x1-x0)); //如果传入的坐标值x1<x0,将坐标值互换 if(x0>x1) {d=x0;x0=x1;x1=d; d=y0;y0=y1;y1=d;} a=y0-y1; b=x1-x0; x=x0;y=y0; pDC->SetPixel(x,y,color);
F x, y 0 F x, y 0 F x, y 0 点在直线上面 点在直线上方 点在直线下方
P2
Q
P=(xp,yp) P1
∴欲判断中点M点是在Q点上方还是在Q点下 方,只需把M代入F(x,y),并检查它的符号。
构造判别式: d=F(M)=F(xp+1,yp+0. 5) =a(xp+1)+b(yp+0.5)+c P=(xp,yp) 当d<0,M在直线(Q点)下 方,取右上方P2; 当d>0,M在直线(Q点)上 方,取右方P1; 当d=0,选P1或P2均可, 约定取P1; 能否采用增量算法呢?
P2
Q P1
若d0 ->M在直线上方->取P1; 此时再下一个象素的判别式为 d1=F(xp+2, yp+0.5) =a(xp+2)+b(yp+0.5)+c = a(xp +1)+b(yp +0.5)+c +a =d+a; 增量为a
P2
Q
P=(xp,yp) P1

若d<0->M在直线下方->取P2; 此时再下一个象素的判别式为 d2= F(xp+2, yp+1.5) =a(xp+2)+b(yp+1.5)+c = a(xp +1)+b(yp +0.5)+c +a +b =d+a+b ; 增量为a+b
//斜率绝对值小于等于1的情况 if(m) {//第一种情况,y值递增 if(y0<=y1) {d=2*a+b; delta1=2*a;delta2=2*(a+b); while(x<x1) {if (d<0) {x++; y++; d+=delta2; } else {x++; d+=delta1;} pDC->SetPixel(x,y,color); } }
第四步:编写OnDraw()函数
void CDDALineView::OnDraw(CDC* pDC) { CDDALineDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here ddaline(pDC,100,100,400,100,RGB(255,0,0)); ddaline(pDC,400,100,400,400,RGB(0,255,0)); ddaline(pDC,400,400,100,400,RGB(0,0,255)); ddaline(pDC,100,400,100,100,RGB(255,255,0)); ddaline(pDC,100,100,400,400,RGB(255,0,255)); ddaline(pDC,100,400,400,100,RGB(0,255,255)); }
第三步:编写自定义的成员函数ddaline()程序
void CDDALineView::ddaline(CDC* pDC, int x0, int y0, int x1, int y1, COLORREF color) { int length,i; float x,y,dx,dy; length=abs(x1-x0); if (abs(y1-y0)>length) length=abs(y1-y0); dx=(float)(x1-x0)/length; dy=(float)(y1-y0)/length; x=x0+0.5;y=y0+0.5; for (i=1;i<=length;i++) { pDC->SetPixel((int)x,(int)y,color); x=x+dx;y=y+dy; } }


增量算法:在一个迭代算法中,如果每 一步的x、y值是用前一步的值加上一个 增量来获得,则称为增量算法。 DDA算法就是一个增量算法。
数值微分(DDA)法
void DDALine(int x0,int y0,int x1,int y1,int color) int x; float dx, dy, y, k; dx, = x1-x0, dy=y1-y0; k=dy/dx, y=y0; for (x=x0; xx1, x++) drawpixel (x, int(y+0.5), color); y=y+k;
P2
Q
P=(xp,yp) P1

画线从(x0, y0)开始,d的初值 d0=F(x0+1, y0+0.5)= a(x0 +1)+b(y0 +0.5)+c = F(x0, y0)+a+0.5b = a+0.5b
由于只用d 的符号作判断,为了只包含整数运算, 可以用2d代替d来摆脱小数,提高效率。
void Midpoint Line (int x0,int y0,int x1, int y1,int color) { int a, b, d1, d2, d, x, y; a=y0-y1, b=x1-x0, d=2*a+b; d1=2*a, d2=2* (a+b); x=x0, y=y0; drawpixel(x, y, color); while (x<x1) { if (d<0) {x++; y++; d+=d2; } else {x++; d+=d1;} drawpixel (x, y, color); } /* while */ } /* mid PointLine */
3.2.1 中点算法 3.2.2内接正多边形迫近法 3.2.3等面积正多边形逼近法 3.2.4生成圆弧的正负法
3.1直线段的扫描转换算法


直线的扫描转换: 确定最佳逼近于该直线 的一组象素,并且按扫描线顺序,对这 些象素进行写操作。 三个常用算法:
数值微分法(DDA) 中点画线法 Bresenham算法。
x 0 1 2 3 4 5
实现DDA画线程序
步骤: 第一步:建立一个DDALine的工程文件; 第二步:添加ddaline()成员函数

方法:在工作区中选择CLASSVIEW类窗口,右击 CDDAlineView类,选择“add member function…”, 定义如下的成员函数: void ddaline(CDC* pDC,int x0,int y0,int x1,int y1,COLORREF color);
即确定一个图形的哪些部分在窗口内,哪些在窗口外,即裁剪。
图形显示前需要:扫描转换+裁剪 ●裁剪---〉扫描转换:最常用,节约计算时间。 ●扫描转换---〉裁剪:算法简单;
本章内容
3.1扫描转换直线段
3.1.1 DDA算法 3.1.2中点画线法 3.1.3Bresenham画线算法
3.2圆弧、椭圆弧扫描转换
p p
现需确定下一个点亮的象素。
中点画线法



当M在Q的下方-> P2离直线更近更近->取P2 。 M在Q的上方-> P1离直线更近更近->取P1 M与Q重合, P1、P2任取一点。
P2 Q
P=(xp,yp) P1

问题:如何判断M与Q点的关系?
3.1.2中点画线法
假设直线方程为:ax+by+c=0 其中a=y0-y1, b=x1-x0, c=x0y1-x1y0 由常识知:


MidpointLine(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color) {int a,b,delta1,delta2,d,x,y; //传入的端点坐标x值相等 if(x0==x1) {if(y0<y1) { for(int i=y0;i<=y1;i++) pDC->SetPixel(x0,i,color); } else { for(int i=y1;i<=y0;i++) pDC->SetPixel(x0,i,color); } return; }
k
x1 x0
令x x0 x1; x x stepx y kx b x, round( y)
这种方法直观,但效率太低,因为每一步需要一次浮点乘法 和一次舍入运算。
计算yi+1= kxi+1+b = kxi+b+kx = yi+kx 当x =1; yi+1 = yi+k 即:当x每递增1,y递增k(即直线斜率); 注意上述分析的算法仅适用于k ≤1的情形。 在这种情况下,x每增加1,y最多增加1。 当 k 1时,必须把x,y地位互换
数值微分(DDA)法

缺点: 在此算法中,y、k必须是float,且每 一步都必须对y进行舍入取整,不利于硬件实 现。
中点画线法
相关文档
最新文档