【计算机图形学|直线生成算法】中点画线法
文章目录
- 概述
- 一、基本思想
- 二、构造判别式:
- 三、递推出增量
- 优化:
- 总结:
- 四、例题分析
- 五、伪代码
概述
中点画线法(Midpoint Line Algorithm)是一种画线(Line Drawing)算法,用来在计算机屏幕上绘制线条。
它的基本思想是从线段的起点和终点出发,按照一定的规则向终点逐步逼近,并在途中以控制变量的方式得出每个像素点的坐标,从而绘制出所需的线条。
具体实现中,中点画线法通过计算线段斜率的变化情况,来分为斜率小于1和大于等于1两种情况,并采用Bresenham的对称性原理,以中点的颜色来控制每个像素点的生长方向,从而获得较高的绘制效率和图像质量表现。
总的来说,中点画线法是一种高效且易于实现的线段绘制算法,也是计算机图形学领域最基本的算法之一。
一、基本思想
当前像素点为 ( x p , y p ) (x_p,y_p) (xp,yp),下一个像素点为 P 1 P1 P1或 P 2 P2 P2。
设 M = ( x p + 1 , y p + 0.5 ) M=(x_p+1,y_p+0.5) M=(xp+1,yp+0.5)为 P 1 P1 P1与 P 2 P2 P2之中点, Q Q Q为理想直线与 x = x p + 1 x=x_p+1 x=xp+1垂线的交点。将 Q Q Q与 M M M的 y y y坐标进行比较。
当 M M M在 Q Q Q的下方,则 P 2 P2 P2应为下一个像素点;当 M M M在 Q Q Q的上方,则 P 1 P1 P1应为下一个像素点。
二、构造判别式:
d = F ( M ) = F ( x p + 1 , y p + 0.5 ) = a ( x p + 1 ) + b ( y p + 0.5 ) + c d=F(M)=F(x_p+1,y_p+0.5)=a(x_p+1)+b(y_p+0.5)+c d=F(M)=F(xp+1,yp+0.5)=a(xp+1)+b(yp+0.5)+c
其中, a = y 0 − y 1 , b = x 1 − x 0 , c = x 0 y 1 − x 1 y 0 a=y_0-y_1, b=x_1-x_0, c=x_0y_1-x_1y_0 a=y0−y1,b=x1−x0,c=x0y1−x1y0.
- 当 d < 0 d<0 d<0时, M M M在 L ( Q L(Q L(Q点 ) ) )下方,取右上方 P 2 ( x p + 1 , y p + 1 ) P2(x_p+1,y_p+1) P2(xp+1,yp+1)为下一个像素;
- 当 d > 0 d>0 d>0时, M M M在 L ( Q L(Q L(Q点 ) ) )上方,取右方 P 1 ( x p + 1 , y p ) P1(x_p+1,y_p) P1(xp+1,yp)为下一个像素;
- 当 d = 0 d=0 d=0时,选 P 1 P1 P1或 P 2 P2 P2均可,约定取 P 1 ( x p + 1 , y p ) P1(x_p+1,y_p) P1(xp+1,yp)为下一个像素;
三、递推出增量
若当前像素处于:
d ≥ 0 d\geq 0 d≥0情况,则取正右方像素 P 1 ( x p + 1 , y p ) P1(x_p+1, y_p) P1(xp+1,yp),要判下一个像素位置,应计算
d 1 = F ( x p + 2 , y p + 0.5 ) = a ( x p + 2 ) + b ( y p + 0.5 ) = d + a d1=F(x_p+2, y_p+0.5)=a(x_p+2)+b(y_p+0.5)=d+a d1=F(xp+2,yp+0.5)=a(xp+2)+b(yp+0.5)=d+a
增量为 a a a。
d < 0 d<0 d<0时,则取右上方像素 P 2 ( x p + 1 , y p + 1 ) P2(x_p+1, y_p+1) P2(xp+1,yp+1)。要判断再下一像素,则要计算
d 2 = F ( x p + 2 , y p + 1.5 ) = a ( x p + 2 ) + b ( y p + 1.5 ) + c = d + a + b d2= F(x_p+2, y_p+1.5)=a(x_p+2)+b(y_p+1.5)+c=d+a+b d2=F(xp+2,yp+1.5)=a(xp+2)+b(yp+1.5)+c=d+a+b
增量为 a + b a+b a+b。
优化:
由于画线从 ( x 0 , y 0 (x_0, y_0 (x0,y0)开始, d d d的初值为:
d 0 = F ( x 0 + 1 , y 0 + 0.5 ) = F ( x 0 , y 0 ) + a + 0.5 b = a + 0.5 b d_0=F(x_0+1, y_0+0.5)=F(x_0, y_0)+a+0.5b=a+0.5b d0=F(x0+1,y0+0.5)=F(x0,y0)+a+0.5b=a+0.5b
可以用 2 d 2d 2d代替 d d d来避免小数,提高效率。令 d 0 = 2 a + b , d 1 = 2 a , d 2 = 2 a + 2 b d_0=2a+b, d_1=2a, d_2=2a+2b d0=2a+b,d1=2a,d2=2a+2b。
总结:
如果 d > 0 d > 0 d>0,则中点 ( x , y m ) (x_, y_m) (x,ym)在 L ( Q ) L(Q) L(Q)的上方,此时应该取右边的像素点 P 1 ( x p + 1 , y p ) P1(x_p+1,y_p) P1(xp+1,yp),即 x x x加1、 y y y不变。此时, d d d的值增加 d 1 d1 d1,即 d = d + d 1 d=d+d1 d=d+d1。
如果 d < 0 d<0 d<0,则中点 ( x m , y m ) (x_m, y_m) (xm,ym)在 L ( Q ) L(Q) L(Q)的下方,应该取右上方的像素点 P 2 ( x p + 1 , y p + 1 ) P2(x_p+1,y_p+1) P2(xp+1,yp+1),即 x x x和 y y y均加1。此时, d d d的值增加 d 2 d2 d2,即 d = d + d 2 d=d+d2 d=d+d2。
四、例题分析
以P0(0,0)到P1(5,2)为例,使用中点画线法,计算 d 0 d_0 d0, d 1 d_1 d1和 d 2 d_2 d2,并画出对应表格。
首先,根据两点坐标求出 a a a、 b b b、 c c c的值,有:
a = y 0 − y 1 = − 2 a=y_0-y_1=-2 a=y0−y1=−2
b = x 1 − x 0 = 5 b=x_1-x_0=5 b=x1−x0=5
c = x 0 y 1 − x 1 y 0 = − 10 c=x_0y_1-x_1y_0=-10 c=x0y1−x1y0=−10
接着,根据公式得到 d 0 d_0 d0, d 1 d_1 d1和 d 2 d_2 d2的初值,有:
d 0 = 2 a + b = 1 d_0 = 2a+b = 1 d0=2a+b=1
d 1 = 2 a = − 4 d_1 = 2a = -4 d1=2a=−4
d 2 = 2 a + 2 b = 6 d_2 = 2a+2b = 6 d2=2a+2b=6
然后,根据中点画线法的算法流程结合总结,可以按照如下表格计算每个像素点的坐标 ( x i , y i ) (x_i,y_i) (xi,yi)以及 d i d_i di的变化:
count | x | y | d | P |
---|---|---|---|---|
0 | 0 | 0 | 1 | P0 |
1 | 1 | 0 | -3 | |
2 | 2 | 1 | 3 | |
3 | 3 | 1 | -1 | |
4 | 4 | 2 | 5 | |
5 | 5 | 2 | 1 | P1 |
其中, P P P表示像素点位置, c o u n t count count表示计数, d d d表示中点到直线距离的判别式值(经过放大2倍),根据 d > 0 d>0 d>0还是 d < 0 d < 0 d<0判断所选的下一个像素点。对于 d = 0 d=0 d=0,约定选择右下方的像素点。
最终,依照算法,连线的轨迹如下:
P0 (0, 0) -> (1, 1) -> (2, 1) -> (3, 2) -> (4, 2) -> P1 (5, 2)
如下图:
五、伪代码
/* mid PointLine */
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 */}
【计算机图形学|直线生成算法】中点画线法相关推荐
- [计算机图形学算法]直线扫描转换算法-中点画线法
DDA算法用斜截式表示直线方程,简化了乘法运算,但任存在浮点运算. 我们猜想,用别的方式表示直线,是否能把浮点运算也简化为整数运算. 在中点画线法中,我们用Ax+By+C=0的一般式方程来表示直线,即 ...
- 计算机图形学直线算法程序,计算机图形学直线生成算法实现.doc
计算机图形学直线生成算法实现.doc (7页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 实验二直线生成算法实现班级08信计学号80姓名 ...
- 【计算机图形学】中点画线法实现任意斜率直线的绘制
[计算机图形学]中点画线法实现任意斜率直线的绘制 一.中点画线法原理简介 1.建立基础 中点画线法的建立基础是数值微分画线法(DDA),其作为改进算法,沿用了DDA算法的增量思想,针对影响DDA算法效 ...
- 【计算机图形学】扫面转换算法(DDA算法 中点画线算法 Bresenham画线算法)
模块1 扫描转换算法 一 实验目的 编写直线.弧线的光栅扫描转换算法,并对线宽与线形的算法加以探讨 用DDA算法.中点画线算法.Bresenham画线算法绘制直线(如果键盘输入数据,给出数据值:如果绘 ...
- 画毛毛虫代码计算机图形学,计算机图形学 实验 数值微分(DDA)法、中点画线法、Bresenham算法.doc...
文档介绍: 实验名称数值微分(DDA)法.中点画线法.Bresenham算法实验时间年月日专业姓名学号预****操作座位号教师签名总评一.实验目的:1.了解数值微分(DDA)法.中点画线法.Brese ...
- 图形学--(中点画线法+Bresenham画线算法)
编程环境:codeblocks+EGE库 用到的函数:putpixel(int x1,int y1,int color) 用某种颜色打亮一个坐标点. 这俩种算法都是用来在计算机上画一条直线的,那么我 ...
- 【计算机图形学】中点画线法实现焦点在x、y轴上的椭圆绘制
[计算机图形学]中点画线法实现焦点在x.y轴上的椭圆绘制 一.中点画线法原理简介 1.建立基础 中点画线法的原理介绍见直线绘制的博文中点画线法实现任意斜率直线的绘制.基本思路是以下一点在椭圆外/内的位 ...
- 中点画线法c语言程序,计算机图形学 :中点画圆法
由于安装了easyx的vc6.0只能用initgraph(x,y)初始化一个x*y的第一象限的画板.所以对于书上的画圆法我们需要稍微进行一点改变.这个算法只能画1/8的圆,其它7/8的圆只能通过对称关 ...
- 图形学---中点画线法---opengl中实现
目的: 为了优化DDA算法中的浮点数运算(DDA中每次+k运算,|k|<1,所以存在浮点数运算),达到整数运算,提高效率. 基本思想: 当前像素点为(xp,yp),下一像素点为P1或P2.设P1 ...
最新文章
- java的注释规范_Java代码注释规范
- seo 伪原创_如何判断外包的seo文章是否是抄袭或伪原创?
- MOSS/Sharepoint 如何更改一台已经安装了SharePoint的服务器名称
- Java加密与解密的艺术~安全协议~模型分析
- JQuery和php方面的填空题,PHP复习题(问答题)
- 3-8:类与对象下篇——友元函数、友元类和内部类
- c语言商品货架管理_武威树脂蔬菜货架厂家价格,生鲜市场货架报价_欧固隆货架...
- 索引法则--最佳左前缀法则
- oracle使用表空间语句,oracle表空间语句
- 调整VirtualBox虚拟机分辨率的方法
- Qt界面显示OpenCV读取的图片
- Linux命令:查看服务器IP地址
- 位置不可用无法访问介质受写入保护 chkdsk无法修复. 不知道怎样找到呢?
- matlab绘三维椭球面_【MATLAB】高等数学中的八种常见的三维曲面
- Windows7 家庭普通版升级旗舰版
- 计算给定日期是当年的第几周
- Quartus2入门及半加器设计
- Hadoop获取namenode的命令
- 5G物联网智能家居实战课程 第一章
- NC信息交换平台外部接口写入单据