【计算机图形学|直线生成算法】中点画线法

这篇具有很好参考价值的文章主要介绍了【计算机图形学|直线生成算法】中点画线法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

中点画线法(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=y0y1,b=x1x0,c=x0y1x1y0.

  • 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 d0情况,则取正右方像素 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=y0y1=2
b = x 1 − x 0 = 5 b=x_1-x_0=5 b=x1x0=5
c = x 0 y 1 − x 1 y 0 = − 10 c=x_0y_1-x_1y_0=-10 c=x0y1x1y0=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)

如下图:
中点画线法,计算机图形学,算法文章来源地址https://www.toymoban.com/news/detail-762918.html

五、伪代码

/* 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 */
 } 

到了这里,关于【计算机图形学|直线生成算法】中点画线法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机图形学】图形变换(以任意直线为对称轴的对称变换)

    模块3-2 图形变换 一 实验目的 编写图形各种变换的算法 二 实验内容 1 :任意直线的对称变换。要求将变换矩阵写在实验报告中,并与代码匹配。求对任意直线Ax+By+C=0的对称变换矩阵。 实验结果如下图所示: 1:预设图形初始化 2:鼠标左键点击直线起点 3:鼠标右键点击直线

    2024年02月01日
    浏览(45)
  • 计算机图形学头歌实训平台答案——CG1-v2.0-直线绘制

    1.本关任务 (1)根据直线DDA算法补全line函数,其中直线斜率0k1; (2)当直线方程恰好经过P(x,y)和T(x,y+1)的中点M时,统一选取直线上方的T点为显示的像素点。 2.输入 (1)直线两端点坐标:(13, 20)和(180,140); (2)直线颜色为白色。 3.输出 程序运行结果为一条直线,具体结果如下图所示:

    2024年02月06日
    浏览(41)
  • 【计算机图形学】二维图形裁剪算法

    Cohen-Sutherland算法 Cohen-Sutherland是最早最流行的算法。 核心思想:通过 编码测试 来减少计算交点的次数。(编码算法) 1. 区域码: 线段端点以区域赋值以四位二进制码。 编码顺序:四位从右到左分别为:左边界、右边界、下边界、上边界。 编码值:落在相应位置为1,否则

    2024年02月02日
    浏览(39)
  • 计算机图形学:二维图形的几何变换(算法原理及代码实现)

    对于一个二维图形作平移、旋转、放缩变换,可以转换为在二维坐标系中图形的所有点分别可以对应到在x,y轴方向分别平移tx,ty(平移)、绕一点旋转固定的角(旋转)、在x,y轴方向分别放缩sx,sy倍。 对于变换的原理,只需要将原图形的点通过极坐标或者相加、相乘,再

    2024年02月11日
    浏览(29)
  • 计算机图形学03:改进的中点BH算法

    作者 :非妃是公主 专栏 :《计算机图形学》 博客地址 :https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 专栏名称 专栏地址 软件工程 专栏——软件工程 计算机图形学 专栏——计算机图形学 操作系统 专栏——操作系统 软件测试 专

    2024年01月17日
    浏览(33)
  • 【Weiler-Atherton算法】 计算机图形学多边形裁剪算法

    源代码: https://github.com/ricar0/Weiler-Atherton-Alogrithm/tree/master 通常来说就是利用多边形来裁剪多边形的一种方法,一般情况下是利用矩形来裁剪凹凸多边形 凸多边形 凹多边形 上面红色划线部分就是裁剪出的部分 OPENGL基础语法 基本上就是一些画线和画多边形的操作,难度较低

    2023年04月09日
    浏览(38)
  • 【计算机图形学】【代码复现】A-SDF中的数据集制作与数据生成

    Follow A-SDF 的 Data Generation 部分: We follow (1) ANSCH to create URDF for shape2motion dataset (1-2) URDF2OBJ(本人认为是1-2之间需要进行的重要的过渡部分) (2) Manifold to create watertight meshes (3) and modified mesh_to_sdf for generating sampled points and sdf values. follow这个github: ANSCH 在 global_info.py 中,主要修改

    2024年02月08日
    浏览(45)
  • 计算机图形学:三次Bezier曲线的绘制(算法原理及代码实现)

    一、实现方案        贝塞尔曲线原理:贝塞尔曲线是计算机图形图像造型的基本工具,是图形造型运用得最多的基本线条之一。它通过控制曲线上的四个点(起始点、终止点以及两个相互分离的中间点)来创造、编辑图形。其中起重要作用的是位于曲线中央的控制线。这条

    2024年02月11日
    浏览(37)
  • 【计算机图形学 】扫描线多边形填充算法 | OpenGL+鼠标交互

    传送门 实现多边形扫描线填充算法,并和鼠标进行交互。 具体原理略过,会贴上完整代码,可直接运行。 环境: vs2019,OpenGL的库(可以搜索如何用vs使用OpenGL的库,可以使用vs自带的插件或者其他方法,很方便) 要点: 1.NET和AET的创建,改动 2.改变鼠标点击和鼠标拖拽的响应

    2023年04月08日
    浏览(39)
  • 【计算机图形学】裁剪算法(Cohen-Sutherland算法 & 中值分割算法 & Liang-Barsky算法)

    一 实验目的 编写直线段、多边形裁剪算法 熟悉Cohen-Sutherland算法、中值分割算法和Liang-Barsky算法的裁剪 二 实验算法理论分析 Cohen-Sutherland 算法:     中值分割算法: 与CS算法一样,首先对直线段端点进行编码,并把线段与窗口的关系一样分为3种情况:全在、完全不在、线

    2024年02月03日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包