中点画线算法:

所需绘制直线的左下端点记为  , 右上端点记为  

令   ,   ,则直线的斜截式为 : 

所以,用隐函数表示直线的方程为   :   

容易验证,点(x , y)若在直线上,F(x , y)= 0 ; 若在直线上方,F(x , y)> 0 ; 若在直线下方,F(x , y)< 0 。

(1).     斜率在 (0,1)区间:

假定选择了   处的像素 P ,现在必须在 P 的右邻像素 E 和右上方相邻像素 NE 中选取一个像素。

在中点算法中,只需计算    (M表示中点),并测试它的符号即可。

若 F(M)< 0 , 则 M 在直线下方,直线距离点 NE 更近 ,选择 NE ; 若 F(M)> 0 , 则 M 在直线上方,直线距离点 E 更近 ,选择 E .

如果选择的是 E ,应判断:

如果选择的是 NE ,应判断:

因为第一个像素是端点  , 可直接计算 J 的初始值  ,以此决定是选 E 还是选 NE。

第一个中点在  处,有

由于 落在线上,因此  ,故  值为   .

(2).     斜率在 (-1,0)区间:

假定选择了   处的像素 P ,现在必须在 P 的右邻像素 E 和右下方相邻像素 NE 中选取一个像素。

在中点算法中,只需计算    (M表示中点),并测试它的符号即可。

若 F(M)< 0 , 则 M 在直线下方,直线距离点 E 更近 ,选择 E ; 若 F(M)> 0 , 则 M 在直线上方,直线距离点 NE 更近 ,选择 NE .

如果选择的是 E ,应判断:

如果选择的是 NE ,应判断:

因为第一个像素是端点  , 可直接计算 J 的初始值  ,以此决定是选 E 还是选 NE。

第一个中点在  处,有

由于 落在线上,因此  ,故  值为   .

(3).     斜率大于 1:

直线的方程用隐函数还可以表示为:   (即上方式子取反)

容易验证,点(x , y)若在直线上,F(x , y)= 0 ; 若在直线左边,F(x , y)< 0 ; 若在直线右边,F(x , y)> 0 。

假定选择了   处的像素 P ,现在必须在 P 的上邻像素 E 和右上方相邻像素 NE 中选取一个像素。

在中点算法中,只需计算    (M表示中点),并测试它的符号即可。

若 F(M)< 0 , 则 M 在直线左边,直线距离点 NE 更近 ,选择 NE ; 若 F(M)> 0 , 则 M 在直线右边,直线距离点 E 更近 ,选择 E .

如果选择的是 E ,应判断:

如果选择的是 NE ,应判断:

因为第一个像素是端点  , 可直接计算 J 的初始值  ,以此决定是选 E 还是选 NE。

第一个中点在  处,有

​​​​​​​

由于 落在线上,因此  ,故  值为   .

(4).     斜率小于 -1:

假定选择了   处的像素 P ,现在必须在 P 的上邻像素 E 和左上方相邻像素 NE 中选取一个像素。

在中点算法中,只需计算    (M表示中点),并测试它的符号即可。

若 F(M)< 0 , 则 M 在直线左边,直线距离点 E 更近 ,选择 E ; 若 F(M)> 0 , 则 M 在直线右边,直线距离点 NE 更近 ,选择 NE .

如果选择的是 E ,应判断:

如果选择的是 NE ,应判断:

​​​​​​​

因为第一个像素是端点  , 可直接计算 J 的初始值  ,以此决定是选 E 还是选 NE。

第一个中点在  处,有

​​​​​​​

由于 落在线上,因此  ,故  值为   .

核心代码:

(在实现中,为消除分数部分,将 F 乘以 2 重新定义 F,使每个常量和判断变量均乘以 2 ,但这并不影响判断变量  的符号,因此仍可作为中点检测标准。)

from PySide2.QtCore import *
class Line:def __init__(self, p):self.p = pdef points_list_mid(self):points = []if self.p[0].y() == self.p[1].y():if self.p[0].x() > self.p[1].x():self.p.reverse()x = self.p[0].x()y = self.p[0].y()while x < self.p[1].x():points.append(QPoint(x, y))x = x+1return pointsif self.p[0].x() == self.p[1].x():if self.p[0].y() > self.p[1].y():self.p.reverse()x = self.p[0].x()y = self.p[0].y()while y < self.p[1].y():points.append(QPoint(x, y))y = y+1return pointsm = (self.p[1].y()-self.p[0].y())/(self.p[1].x()-self.p[0].x())if m > 0 and m <= 1:if self.p[0].x() > self.p[1].x():self.p.reverse()dx = self.p[1].x() - self.p[0].x()dy = self.p[1].y() - self.p[0].y()d = dx - 2*dydNE = 2*dx - 2*dydE = -2*dyx = self.p[0].x()y = self.p[0].y()while x < self.p[1].x():points.append(QPoint(x, y))if d < 0:d = d + dNEy = y + 1else:d = d + dEx = x+1elif m >= -1 and m < 0:if self.p[0].x() > self.p[1].x():self.p.reverse()dx = self.p[1].x() - self.p[0].x()dy = self.p[1].y() - self.p[0].y()d = -dx - 2*dydNE = -2*dx - 2*dydE = -2*dyx = self.p[0].x()y = self.p[0].y()while x < self.p[1].x():points.append(QPoint(x, y))if d >= 0:d = d + dNEy = y - 1else:d = d + dEx = x+1elif m > 1:if self.p[0].y() > self.p[1].y():self.p.reverse()dx = self.p[1].x() - self.p[0].x()dy = self.p[1].y() - self.p[0].y()d = dy - 2*dxdNE = 2*dy - 2*dxdE = -2*dxx = self.p[0].x()y = self.p[0].y()while y < self.p[1].y():points.append(QPoint(x, y))if d <= 0:d = d + dNEx = x + 1else:d = d + dEy = y+1else:if self.p[0].y() > self.p[1].y():self.p.reverse()dx = self.p[1].x() - self.p[0].x()dy = self.p[1].y() - self.p[0].y()d = -dy - 2*dxdNE = -2*dy - 2*dxdE = -2*dxx = self.p[0].x()y = self.p[0].y()while y < self.p[1].y():points.append(QPoint(x, y))if d >= 0:d = d + dNEx = x - 1else:d = d + dEy = y + 1return points

加上UI界面实现效果:

PS: 如需参考完整代码,请移步:https://download.csdn.net/download/qq_42185999/11834675   进行下载

中点画线算法画直线----计算机图形学相关推荐

  1. DDA算法画直线----计算机图形学

    生成直线的DDA算法: 假设待扫描转换的直线段为 Pb(xb, yb), Pe(xe, ye),如图所示: 令  , 斜率  , 则直线方程为  为方便起见,这里 假定  . 显然,对于每一个 xi  ...

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

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

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

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

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

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

  5. openGL实现中点画线算法、DDA画线算法,Bresenham画线算法,并进行鼠标键盘的交互

    首先设置变量用于进行鼠标交互和键盘交互: int m = 0; GLdouble m1 =0, m2 = 0; 1.实验入口主函数: //主函数 int main(int argc, char** a ...

  6. 中点画线完整算法c语言,中点画线算法

    在网上看中点画线算法,很多说法是中点画线类似于Breshehanm画线. 但是助教说的中点画线是寻找直线两端点的中点进行画点,然后分别递归左右半段直线. 当年不好好学习,递归掌握的不好,现在自己试了试 ...

  7. 任意斜率的中点画线算法

    一.中点画线算法的基本原理 在画直线的过程中,当前像素点P(xp,yp),则下一个点与直线最接近的像素只能是P1或者P2,即P点的正右方或者右上角的点.设M(xp+1,yp+0.5)为P1与P2的中点 ...

  8. 中点画线算法(计算机图形学)

    0.画线算法 0.DDA(digital differential analyzer) A.基本原理 画线时,会给出两个端点(x0,y0),(xend,yend)据此计算出斜率m,然后 从(x0,y0 ...

  9. 中点画线算法(任意斜率)

    基本原理 在画直线段的过程中,当前像素点为(xp ,yp ),下一个像素点有两种可选择点P1(xp +1,yp )或P2(xp +1,yp +1).若M=(xp +1,yp +0.5)为P1与P2之中 ...

  10. 中点画线完整算法c语言,中点画线算法(任意斜率)

    基本原理 在画直线段的过程中,当前像素点为(xp ,yp ),下一个像素点有两种可选择点P1(xp +1,yp )或P2(xp +1,yp +1).若M=(xp +1,yp +0.5)为P1与P2之中 ...

最新文章

  1. 人工智能十年回顾:CNN、AlphaGo、GAN……它们曾这样改变世界
  2. Vue (响应式原理-模拟-0)
  3. flAbsPath on /var/lib/dpkg/status failed - realpath
  4. IDEA 下载、安装、配置和案例
  5. 高等学校计算机一级考试题库,全国计算机一级考试题库「附答案」
  6. android开发设置页面自适应横竖屏,android TV 竖屏页面开发
  7. 如何破解zip压缩文件的密码问题?
  8. 【操作系统-Windows】组件服务 DCOM 配置编辑安全属性
  9. 开机黑屏显示html,电脑开机显示display going to sleep怎么办?
  10. Opencv中的颜色检测
  11. 什么是闭包,对闭包的理解,闭包的用途及优缺点
  12. 什么是过拟合(overfitting)
  13. lombok报错 InvalidDefinitionException: No serializer found
  14. 在Linux(unix)中,以波浪线“~”开始的文件名
  15. DOM ------ 仿淘宝关闭二维码
  16. 【新能源】从“材料”到“电池组”一文读懂动力电池生产全流程!
  17. 小程序实现长按图片弹出保存图片、发送给朋友、识别图中码菜单。
  18. PC格局已改变 联想未来的短板在哪里?
  19. MATLAB学习笔记1——函数调用、参数传递、全局变量使用
  20. 浏览器背景知识(dlmu2001)

热门文章

  1. 基础篇:4.1)规范化:3d工程图纸出图步骤详解
  2. 开源纯C#工控网关+组态软件
  3. Vue 监听浏览器页面窗口切换, 窗口最小化
  4. matlab遗传算法之goat工具箱
  5. aqua datastudio配置
  6. Turnserver服务器搭建
  7. IO操作write()写的文档内不是你设置的buff
  8. Funcode-贪吃蛇
  9. 基于WEB的达内学子书城/商城源代码
  10. bilibili视频解析php源码,Bilibili视频直链信息解析工具源码