相比于Breanham算法,中点画线算法更加直接(非效率)。

中点算法的重要假设是,我们能绘出没有间隔的最细的直线。两对角像素之间的连接是没有间隔的。

一、中点画线算法原理

设线段端点为:(x1, y1),(x2, y2),∆x和∆y为水平和垂直偏移量
{∆y=y2−y1∆x=x2−x1\left\{ \begin{array}{c} ∆y=y_2-y_1 \\ ∆x=x_2-x_1 \end{array} \right. {∆y=y2​−y1​∆x=x2​−x1​​

直线的隐式方程:f(x,y)≡(y1−y2)x+(x2−x1)y+x1y2−x2y1=0f(x,y)≡(y_1-y_2)x+(x_2-x_1)y+x_1y_2-x_2y_1=0f(x,y)≡(y1​−y2​)x+(x2​−x1​)y+x1​y2​−x2​y1​=0

那么直线斜率为:k=y1−y2x1−x2k=\frac{y_1-y_2}{x_1-x_2}k=x1​−x2​y1​−y2​​

假设已经确定了要显示的点(xk , yk),那么,需要确定下一个点(xk+1,yk+1)(x_k+1 , y_{k+1})(xk​+1,yk+1​)是绘制在像素B(xk+1,yk)(x_k+1, y_k)(xk​+1,yk​)还是A(xk+1,yk+1)(x_k+1, y_k+1)(xk​+1,yk​+1)上。

设M为AB的中点,Q为线段与AB边的交点。若Q在M的上面,则应取像素点A作为(xk+1,yk+1)(x_k+1 , y_k+1)(xk​+1,yk​+1) ,否则应取像素点B。
​​​​
平面任一点(x,y)(x, y)(x,y)与直线的相对位置可由(x,y)(x, y)(x,y)的符号确定:
{f(x,y)<0,(x,y)位于直线下方f(x,y)=0,(x,y)位于直线上f(x,y)>0,(x,y)位于直线上方\left\{ \begin{array}{c} f (x, y) < 0,(x, y)位于直线下方 \\ f (x, y) = 0,(x, y)位于直线上 \\ f (x, y) > 0,(x, y)位于直线上方 \end{array} \right. ⎩⎨⎧​f(x,y)<0,(x,y)位于直线下方f(x,y)=0,(x,y)位于直线上f(x,y)>0,(x,y)位于直线上方​
设决策参数pkp_kpk​为M点的函数值:

pk=f(xk+1,yk+12)=a(xk+1)+b(yk+12)+cp_k = f (x_k+1, y_k+\frac12) = a (x_k+1) + b (y_k + \frac12) + cpk​=f(xk​+1,yk​+21​)=a(xk​+1)+b(yk​+21​)+c
那么,

若pk≤0p_k ≤ 0pk​≤0,Q应取A(xk+1,yk+1)(x_k+1, y_k+1)(xk​+1,yk​+1),

若pk>0p_k > 0pk​>0,Q应取B(xk+1,yk)(x_k+1, y_k)(xk​+1,yk​)
因此,有如下关系:

当pk≤0p_k ≤ 0pk​≤0时,yk+1=yk+1y_{k+1} = y_k+1yk+1​=yk​+1
当pk>0p_k > 0pk​>0时,yk+1=yky_{k+1} = y_kyk+1​=yk​
既然像素取值取决于pk的符号,为避免浮点数运算,不妨取:

pk=2f(xk+1,yk+12)=2a(xk+1)+2b(yk+12)+2cp_k = 2 f (x_k+1, y_k+\frac12) = 2a (x_k+1) + 2b (y_k + \frac12) + 2cpk​=2f(xk​+1,yk​+21​)=2a(xk​+1)+2b(yk​+21​)+2c
其中

{a=y1−y2,a=−∆yb=x2−x1,b=∆xc=x1y2−x2y1\left\{ \begin{array}{lr} a=y_1-y_2,a=-∆y \\ b=x_2-x_1,b=∆x\\ c=x_1y_2-x_2y_1 \end{array} \right. ⎩⎨⎧​a=y1​−y2​,a=−∆yb=x2​−x1​,b=∆xc=x1​y2​−x2​y1​​
进一步推导pkp_kpk​与pk+1p_{k+1}pk+1​的递推关系:

pk+1=2a(xk+1+1)+2b(yk+1+1/2)+2cp_{k+1}=2a (x_{k+1}+1) + 2b (y_{k+1} + 1/2) + 2cpk+1​=2a(xk+1​+1)+2b(yk+1​+1/2)+2c

pk+1−pk=2a(xk+1−xk)+2b(yk+1−yk)=2a+2b(yk+1−yk)p_{k+1}-p_k=2a(x_{k+1}-x_k)+2b(y_{k+1}-y_k)=2a+2b(y_{k+1}-y_k)pk+1​−pk​=2a(xk+1​−xk​)+2b(yk+1​−yk​)=2a+2b(yk+1​−yk​)

最终,得到如下递推关系:
{pk+1=pk+2a+2b=pk−2∆y+2∆x,pk≤0pk+1=pk+2a=pk−2∆y,pk>0\left\{ \begin{array}{lr} p_{k+1} = p_k + 2a + 2b= p_k - 2∆y + 2∆x& , p_k ≤ 0\\ p_{k+1}= p_k + 2a = p_k - 2∆y &,p_k > 0& \end{array} \right. {pk+1​=pk​+2a+2b=pk​−2∆y+2∆xpk+1​=pk​+2a=pk​−2∆y​,pk​≤0,pk​>0​​
对于线段的起始端点(x1, y2),决策变量p0为

p0=2f(x0+1,y0+12)=2a(x0+1)+2b(y0+12)+2=2ax0+2a+2by0+b+2=2f(x0,y0)+2a+b=2a+b=−2∆y+∆x\begin {aligned} \ p_0 = 2 f (x_0+1, y_0+\frac12) & = 2a (x_0+1) + 2b (y_0+\frac12) + 2\\ & = 2a x_0+ 2a + 2b y_0+ b + 2&\\ & = 2 f(x_0, y_0) + 2a + b&\\ &= 2a + b = -2∆y +∆x \end{aligned}  p0​=2f(x0​+1,y0​+21​)​=2a(x0​+1)+2b(y0​+21​)+2=2ax0​+2a+2by0​+b+2=2f(x0​,y0​)+2a+b=2a+b=−2∆y+∆x​​
可见,中点画线算法与Bresenham算法的原理相同,只是在确定决策参数pk时不同。

中点画线算法也仅包含整数运算,算法效率很高。

二、C语言实现


void MidpointLine(int x0,int y0,int x1,int y1,int color)
{int dx = abs(x1 - x0);int sx = x0<x1: 1: -1;int dy = abs(y1 - y0);int sy = y0<y1: 1: -1;int a = -sy*dy,b=sx*dx;int p = 2*a + b;while(putpixle(x0,y0),x0 != x1 || y0 !=y1){if(dx > dy){x0+=sx;if(p < 0) {p +=2*(a+b);y+=sy;}else     {p+=2*a;}}              else{y0+=sy;if(p < 0) {p +=2*(a+b);x +=sx;}else     {p+=2*a;}}  }
}

【计算机图形学】画线算法——中点画线算法相关推荐

  1. 【计算机图形学】扫面转换算法(DDA算法 中点画线算法 Bresenham画线算法)

    模块1 扫描转换算法 一 实验目的 编写直线.弧线的光栅扫描转换算法,并对线宽与线形的算法加以探讨 用DDA算法.中点画线算法.Bresenham画线算法绘制直线(如果键盘输入数据,给出数据值:如果绘 ...

  2. [计算机图形学算法]直线扫描转换算法-中点画线法

    DDA算法用斜截式表示直线方程,简化了乘法运算,但任存在浮点运算. 我们猜想,用别的方式表示直线,是否能把浮点运算也简化为整数运算. 在中点画线法中,我们用Ax+By+C=0的一般式方程来表示直线,即 ...

  3. 计算机图形学 学习笔记(一):概述,直线扫描转换算法:DDA,中点画线算法,Bresenham算法

    前言 本笔记基于 http://www.icourse163.org/learn/CAU-45006?tid=1001746004#/learn/announce 感谢中国农大 赵明老师的分享~ 现在 ...

  4. c语言计算机图形来画八分画圆,计算机图形学:中点画圆算法

    在平面解析几何中,圆的方程可以描述为(x – x0)2 + (y – y0)2 = R2,其中(x0, y0)是圆心坐标,R是圆的半径,特别的,当(x0, y0)就是坐标中心点时,圆方程可以简化为x2 ...

  5. JAVA实现中点画线_实验1-中点画线和Bresenham画线算法的实现

    <实验1-中点画线和Bresenham画线算法的实现>由会员分享,可在线阅读,更多相关<实验1-中点画线和Bresenham画线算法的实现(9页珍藏版)>请在人人文库网上搜索. ...

  6. 画毛毛虫代码计算机图形学,计算机图形学 实验 数值微分(DDA)法、中点画线法、Bresenham算法.doc...

    文档介绍: 实验名称数值微分(DDA)法.中点画线法.Bresenham算法实验时间年月日专业姓名学号预****操作座位号教师签名总评一.实验目的:1.了解数值微分(DDA)法.中点画线法.Brese ...

  7. [XJTUSE]计算机图形学第二章作业,使用OpenGL编程实现DDA、中点画线和Bresenham算法和中点画圆法

    首先是Windows10 + Visual Studio 2019 搭建OpenGL环境可以查看如下链接: 萌新向!!!Windows10 + Visual Studio 2019 搭建OpenGL环 ...

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

    文章目录 概述 一.基本思想 二.构造判别式: 三.递推出增量 优化: 总结: 四.例题分析 五.伪代码 概述 中点画线法(Midpoint Line Algorithm)是一种画线(Line Dra ...

  9. 图形学--(中点画线法+Bresenham画线算法)

    编程环境:codeblocks+EGE库 用到的函数:putpixel(int x1,int y1,int color)  用某种颜色打亮一个坐标点. 这俩种算法都是用来在计算机上画一条直线的,那么我 ...

  10. java实现计算机图形学中点画线算法

    代码:DrawLine.java: import javax.swing.*; import java.awt.*;public class DrawLine extends JPanel {publ ...

最新文章

  1. linux、sql 常用的一些特殊符号
  2. 卷积神经网络——池化层学习——最大池化
  3. 【嵌入式】Libmodbus下载和编译详解
  4. KMP字符串匹配算法理解(转)
  5. 7-1 Say Hello to Integers (5 分)
  6. 计算机课用英语怎么说cute,cute英语怎么读
  7. les有学计算机的吗,拷问LES大涡模拟
  8. CDN技术详解及实现原理
  9. 渗透测试-地基篇-Cobal Strike-taowu梼杌详细介绍(十九)
  10. liunux 查看系统参数、网络参数的命令
  11. [Winter Vacation] 语文实词虚词练习册答案
  12. 一只蒟蒻的树形DP学习笔记
  13. QTableWidget使用setCellWidget设置控件居中显示
  14. 安装和使用Windows XP系统故障恢复控制台
  15. 计算机语言表示教师节快乐,教师节经典暖心语录80句精选
  16. PTA基础编程题目集1-6题答案
  17. 大鱼号自媒体如何快速通过试运营转正?
  18. 如何注册腾讯云账号(图文教程)?
  19. 【群晖nas】阿里域名DDNS 配置外网访问(华硕AC68U路由端口映射)
  20. 虚拟机安装Linux教程

热门文章

  1. 计算机系统思维导图简单画法,思维导图简单画法 有创意的思维导图
  2. 判断浏览器是否最小化
  3. tensorflow2 搭建LeNet5训练MINST手写数字数据集并用c++ opencv4.5.5 DNN加载模型预测结果
  4. SQL 获取当前日期上一个月的日期
  5. iPhone设备字体详解
  6. SAP MM TCODE
  7. 使用IBM SPSS Statistics的新手应该如何入门
  8. 离线下载谷歌浏览器chrome安装包
  9. python反编译安卓_APK反编译得工具总结(转载)
  10. 项目中常用到的正则(价格千位分割格式化,手机号3-4-4格式化,密码验证,去除空格,获取url参数,检测24小时时间制,检测url前缀,检测中文,检测手机号,英文单词前后加空格,判断版本号)