algorithm - 有什么公式可以在没有循环的情况下在 Bresenham 的 2D 线中获得点?
问题描述
假设我们有 (x1,y1) 和 (x2,y2) 可能很远
我们可以计算与 (x1,y1) 有 N 距离的直线上的点吗?
我的简单想法是在 for 循环中添加计数,但如果距离非常大,这将很昂贵
*注意:不能使用浮点数
解决方案
在第一个八分圆 (0 <= y2-y1 <= x2-x1) 中,公式为:
y(x) = y1 + round( (x-x1)(y2-y1) / (x2-x1) )
如果您不能使用浮点数,那么您可能需要使用地板除法。您可以像这样进行舍入:
y(x) = y1 + floor( ( 2(x-x1)(y2-y1) + (x2-x1) ) / 2(x2-x1) )
Bresenham 算法的重点是逐步计算这个公式,以避免乘法和除法,这在当时比现在通常要昂贵得多。
注意:我假设您想要沿 x 或 y 的距离,因为您想要剪裁线。如果您真的想要欧几里德距离,请参阅@Beta 答案
推荐阅读
- r - BatchGetSymbols -> GetSP500Stocks() -> 错误:表的列数不一致。你想要fill = TRUE吗?
- javascript - Javascript检查两个数组中是否存在值返回缺失值
- html - 我为什么要购买域名?我可以不注册就拥有自己的网站吗?
- .net - 为什么我的 VB.NET 代码创建的项目列表都一样
- python-3.x - 具有按用户 ID 指示的最大行数的数据集
- c++ - 为什么 Eigen 默认使用 Column-Major 而不是 Row-Major?
- python - 根据python中另一列的值提取字符串的一部分
- oracle - SQL*Plus 自定义摘要报告
- node.js - 创建用于在 React.js 中添加问题的脚本
- arrays - 如何根据 Rails Postgres 中的多个键搜索哈希数组?