直线中点算法

news2024/9/28 4:00:30

中点算法是基于隐函数方程设计的,使用像素网格中点来判断如何选取距离理想直线最近的像素点,直线的中点算法不仅与 Bresenham 算法产生同样的像素点集,二期还可以推广到圆和椭圆。

原理

直线的隐函数表示

F ( x , y ) = y − k x − b = 0 F(x, y) = y -kx -b = 0 F(x,y)=ykxb=0
理想直线将平面划分成三个区域
对于直线上的点, $F(x, y) = 0 $
对于直线上方的点, F ( x , y ) > 0 F(x, y) >0 F(x,y)>0
对于直线下方的点, F ( x , y ) < 0 F(x, y) <0 F(x,y)<0

在这里插入图片描述
中点误差项

d i = F ( x i + 1 , y i + 0.5 ) = y i + 0.5 − k ( x i + 1 ) − b d_i = F(x_i + 1, y_i + 0.5) = y_i + 0.5 - k(x_i + 1) -b di=F(xi+1,yi+0.5)=yi+0.5k(xi+1)b

在这里插入图片描述

y i + 1 = { y i + 1 d i < 0 y i d i ≥ 0 y_{i+1} = \begin{cases} y_i + 1 & d_i < 0 \\ y_i & d_i \geq 0 \end{cases} yi+1={yi+1yidi<0di0

中点误差项的递推公式

  • d i < 0 d_i < 0 di<0 , 下一步进行判断的中点为 M u ( x i + 2 , y i + 1.5 ) M_u(x_i +2,y_i+ 1.5) Mu(xi+2yi+1.5) , 中点的误差项的递推公式为

在这里插入图片描述
d i + 1 = d i + 1 − k d_{i+1} = d_{i} + 1 - k di+1=di+1k

上一步选择 P u P_u Pu 后,中点误差项的增量为 1 − k 1-k 1k

  • d i ≥ 0 d_i \geq 0 di0 时,下一步进行判断的中点为 M d ( x i + 2 , y i + 0.5 ) M_d(x_i + 2, y_{i} + 0.5) Md(xi+2,yi+0.5) 中点的误差项的递推公式为
    在这里插入图片描述

d i + 1 = d i − k d_{i+1} = d_i - k di+1=dik
上一步选择 P d P_d Pd 后,中点误差项的增量为 − k -k k

中点误差项的初始值

直线的起点坐标扫描转换后的像素为 P 0 ( x 0 , y 0 ) P_0(x_0, y_0) P0(x0,y0) .从像素 P 0 P_0 P0 出发沿着主位移 x x x 方向的递增一个单位,第一个参与判断的中点是 M ( x 0 + 1 , y 0 + 0.5 ) M(x_0+1, y_0 + 0.5) M(x0+1,y0+0.5)。 代入中点误差项计算公式, d d d 的初始值为

d 0 = 0.5 − k d_0 = 0.5 - k d0=0.5k

算法

  • 设置像素点的颜色
  • 读入直线的两个端点坐标
  • 计算中点误差项的初始值 d d d
  • d < 0 d <0 d<0 时, d d d 的增量为 1 − k 1-k 1k, 当 d ≥ 0 d \geq 0 d0 时, d 的增量为 − k d 的增量为 -k d的增量为k
  • 根据每一步中点误差项的值,选择像素点并绘制出来
void MidPointLine(CDC* pDC, CPoint P0, CPoint P1) {
	COLORREF crColor = RGB(0, 0, 0);
	double k, d;
	int dx = P1.x - P0.x;
	int dy = P1.y - P1.y;
	k = double (dy) / dx;
	d = 0.5 -k;
	double inColorUp = 1 - k;
	double inColorDown = -k;
	for (int x=P0.x, y= P0.y; x <P1.x; x++) {
		pDC->SetPixelV(x, y, crColor)
		if (d <0) {
			y++;
			d += inColorUp;
		}
		else {
			d += inColorDown; 
		}
	}  	
}

总结

中点算法是一种浮点数算法,现在的计算机做浮点数运算和整数运算一样快
中点算法设计巧妙,不需要取证操作
中点算法同样适用于绘制圆和椭圆

参考 《计算几何算法与实现》孔令德

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1334031.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

强大的Adobe全家桶软件都是干什么用的,你知道吗?

Adobe Creative Suite是Adobe系统公司出品的一个图形设计、影像编辑与网络开发的软件产品套装。该套装的最高版本是Adobe Creative Cloud。 根据受众市场的不同分为Master Collection(大师版)、Production Premium&#xff08;影音高级版&#xff09;Design&Web Premium&a…

JAVA第一季

第二章 变量和常量 Java中的常用关键字 Java标识符 标识符就是用于给 Java 程序中变量、类、方法等命名的符号。 使用标识符时&#xff0c;需要遵守几条规则&#xff1a; 1. 标识符可以由字母、数字、下划线&#xff08;_&#xff09;、美元符&#xff08;$&#xff09;组成…

微信小程序~如何设置页面的背景色

微信小程序~如何设置页面的背景色 众所周知&#xff0c;微信小程序每个页面由.json&#xff0c;.scss&#xff0c;.ts&#xff0c;.wxml这四个文件组成。 有的小伙伴会发现&#xff0c;需要给页面加背景色的时候&#xff0c;只需在此页面的.scss文件中写个page{background-colo…

kali-钓鱼网站远程代码漏洞分析

文章目录 一、靶场搭建二、开始信息收集&#xff0c;寻找漏洞三、使用蚁剑连接后门程序四、使用webshell查看数据库信息五、进入网站后台 实验环境 Kali CentOs 一、靶场搭建 CentOsIP地址192.168.64.159 #关闭centos防火墙 [rootlocalhost ~]# systemctl disable --now fi…

常用两种Linux命令生成器

在Linux中&#xff0c;可以使用多种命令来生成随机密码。以下是其中两种常用的命令&#xff1a; 1.pwgen&#xff1a;这个命令可以生成随机、无意义的但容易发音的密码。生成的密码可以只包含小写字母、大小写混合或数字。大写字母和数字会以一种便于记忆的方式放置&#xff0…

【办公技巧】ppt如何加密只能看不能修改?

大家是否想要给PPT文件设置加密&#xff0c;让ppt文件变为只能查看不能修改的状态&#xff1f;今天给大家分享给PPT文件设置带有密码的只读模式&#xff08;修改权限&#xff09;。 方法如下&#xff1a; PPT文件之后&#xff0c;将PPT文件进行另存为操作&#xff0c;但是在选…

云计算与大数据之间的羁绊(期末不挂科版):云计算 | 大数据 | Hadoop | HDFS | MapReduce | Hive | Spark

文章目录 前言&#xff1a;一、云计算1.1 云计算的基本思想1.2 云计算概述——什么是云计算&#xff1f;1.3 云计算的基本特征1.4 云计算的部署模式1.5 云服务1.6 云计算的关键技术——虚拟化技术1.6.1 虚拟化的好处1.6.2 虚拟化技术的应用——12306使用阿里云避免了高峰期的崩…

线上服务有哪些稳定性指标?

在分布式高可用设计中&#xff0c;系统监控非常重要&#xff0c;系统监控做好了&#xff0c;可以提前对异常情况进行报警&#xff0c;避免很多线上故障的产生。系统监控做得好不好&#xff0c;也是评价一家互联网公司基础建设水平的重要标准&#xff0c;今天一起来讨论一下&…

线下终端门店调研包含哪些内容

品牌渠道一般分为线上和线下&#xff0c;线上的价格、促销信息、店铺优惠机制等都可以通过登录查看&#xff0c;但是线下门店的数据则需要进店巡查&#xff0c;否则无法得到真实的店铺销售数据&#xff0c;当然也有品牌是靠线下的业务团队报备机制获得这些信息&#xff0c;但是…

18.仿简道云公式函数实战-数学函数-AVERAGE

1. AVERAGE函数 AVERAGE 函数可用于计算一组数值的算术平均值。 2. 函数用法 AVERAGE(数字1,数字2,...) 3. 函数示例 AVERAGE(1,3,5)&#xff0c;返回结果为 3 4. 代码实战 首先我们在function包下创建math包&#xff0c;在math包下创建AvgFunction类&#xff0c;代码如…

使用静态HTTP进行缓存:提高网站性能的关键

大家好&#xff0c;今天我们来聊聊如何通过使用静态HTTP进行缓存&#xff0c;来提高网站的“奔跑速度”。没错&#xff0c;就像给网站穿上了一双“风火轮”&#xff0c;让它飞得更快&#xff01; 首先&#xff0c;我们来了解一下什么是缓存。简单来说&#xff0c;缓存就是把你…

浅谈Dubbo核心概念及架构流程

浅谈Dubbo核心概念及架构流程 前言重要概念1、SPI2、ServiceBean3、URL4、Invoker 整体流程1、架构图2、调用链路 笔者碎碎言&#xff0c;我们学习Dubbo应该学的是什么&#xff1f; 笔者是一名业务开发&#xff0c;认为一切目的都要为我们的目标服务&#xff0c;即日常工作有帮…

fragstats:景观指数的突变分析

作者&#xff1a;CSDN _养乐多_ 本文将介绍景观指数时间序列的突变分析&#xff0c;包括突变时间、突变频次等。以及景观指数突变分析所用的软件和 python 代码。 结果如下图所示&#xff0c; 图1 突变频次 图2 突变时间 文章目录 一、景观指数计算二、景观指数时间序列构建…

Python 数据分析 Matplotlib篇 plt.rcParams 字典(第5讲)

Python 数据分析 Matplotlib篇 plt.rcParams字典(第5讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

传输损伤和传输质量解读

目录 传输损伤 传输质量 噪声和干扰 通信编码 传输损伤 数据信号在数据通信系统的端到端连接的每个环节都可能受到伤害&#xff0c;ITU称之为传输损伤。并推荐用误码、抖动、漂移、滑动和时延来表示。 误码(Error)。指信号在传输过程中码元发生的差错&#xff0c;即接…

SpringBoot2.x+mybatis plus3.x集成Activit7版本

文/朱季谦 在Activiti6版本当中&#xff0c;若要集成到Springboot里&#xff0c;需要写一些额外的配置类&#xff0c;我曾经在Activiti工作流框架学习笔记&#xff08;二&#xff09;之springboot2.0整合工作流Activiti6.0一文当中总结过相关配置过程&#xff0c;感兴趣的同学…

SpringBoot集成RabbitMq消息队列【附源码】

1. 项目背景 要啥项目背景&#xff0c;就是干&#xff01;&#xff01;&#xff01; SpringBoot版本&#xff1a;2.7.12 2. Rabbit MQ安装 这里讲解使用docker安装RabbitMQ&#xff0c;如果在windows下面安装RabbitMQ&#xff0c;参考下文 【笑小枫的按步照搬系列】Window…

数据结构:KMP算法

1.何为KMP算法 KMP算法是由Knuth、Morris和Pratt三位学者发明的&#xff0c;所以取了三位学者名字的首字母&#xff0c;叫作KMP算法。 2.KMP的用处 KMP主要用于字符串匹配的问题&#xff0c;主要思想是当出现字符串不匹配时&#xff0c;我们可以知道一部分之前已经匹配过的的文…

音视频技术开发周刊 | 325

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 AI读心术震撼登顶会&#xff01;模型翻译脑电波&#xff0c;人类思想被投屏&#xff5c;NeurIPS 2023 在最近举办的NeurIPS大会上&#xff0c;研究人员展示了当代AI更震撼…

服务器扩容未生效、不成功:解决方法

记一次解决服务器扩容未生效的解决办法 老板&#xff1a;失忆啊&#xff0c;我花钱给服务器扩容了10000000G&#xff0c;但是数据库和mq都还是用不了&#xff0c;到底是不是服务器磁盘满了&#xff0c;你到底有没有查一下什么原因导致服务用不了啊。 失忆&#xff1a;老板您确…