Bresenham 贝汉明算法

这篇具有很好参考价值的文章主要介绍了Bresenham 贝汉明算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

理解:给定两个点,画出两个点的连线经过的栅格。

求解思路:

1.

bresenham贝汉明算法_Bimme军的博客-CSDN博客

2.

若干计算机图形学算法实现_JulyThirteenth的博客-CSDN博客

// grid traversal
void gridTraversal(const dPoint &start, const dPoint &goal, const double resolution, std::vector<iPoint> &visited_grid)
`{`
    `iPoint s_grid = {static_cast<int>(std::floor(start.x / resolution)), static_cast<int>(std::floor(start.y / resolution))};`
    `iPoint g_grid = {static_cast<int>(std::floor(goal.x / resolution)), static_cast<int>(std::floor(goal.y / resolution))};`
    `dPoint vector = {goal.x - start.x, goal.y - start.y};`
    `double stepX = (vector.x > 0) ? 1 : -1;`
    `double stepY = (vector.y > 0) ? 1 : -1;`
    `double next_grid_boundary_x = (s_grid.x + stepX) * resolution;`
    `double next_grid_boundary_y = (s_grid.y + stepY) * resolution;`
    `double tMaxX = (vector.x != 0) ? (next_grid_boundary_x - start.x) / vector.x : DBL_MAX;`
    `double tMaxY = (vector.y != 0) ? (next_grid_boundary_y - start.y) / vector.y : DBL_MAX;`
    `double tDeltaX = (vector.x != 0) ? resolution / vector.x * stepX : DBL_MAX;`
    `double tDeltaY = (vector.y != 0) ? resolution / vector.y * stepY : DBL_MAX;`
    `iPoint diff = {0, 0};`
    `iPoint c_grid = {s_grid.x, s_grid.y};`
    `visited_grid.push_back(c_grid);`
    `bool negative = false;`
    `if (s_grid.x != g_grid.x && vector.x < 0)`
    `{`
        `diff.x--, negative = true;`
    `}`
    `if (s_grid.y != g_grid.y && vector.y < 0)`
    `{`
        `diff.y--, negative = true;`
    `}`
    `if (negative)`
    `{`
        `c_grid.x += diff.x;`
        `c_grid.y += diff.y;`
        `visited_grid.push_back(c_grid);`
    `}`
    `double tx = tMaxX;`
    `double ty = tMaxY;`
    `while (!(c_grid == g_grid))`
    `{`
        `if (tx < ty)`
        `{`
            `c_grid.x += stepX;`
            `tx += tDeltaX;`
        `}`
        `else`
        `{`
            `c_grid.y += stepY;`
            `ty += tDeltaY;`
        `}`
        `visited_grid.push_back(c_grid);`
    `}`
`}`

算法理解

我们首先找到当前栅格的下一个 x 和 y 方向的栅格 1 和 2 ;

计算下 1 和 2 距离开始节点的 x 向 和 y 向的距离 xd 和 yd 占起止点之间在 x y 向的距离的百分比 x% y%;

假如 x% < y% 那么下一个栅格就是 当前节点的 x 加 1 或者 -1 ;

注意更新 x% , 也就是 x% 变为了 新的当前节点到开始节点 x 向的距离占起止节点之间 x 向的距离的百分比了。

TARE 里面有类似的实现代码

int 栅格作为输入的代码:



//!bresenham 算法
//!https://www.guyuehome.com/41384

#include <iostream>
#include <stdio.h>
#include<string.h>
#define H 16     //触摸框宽度
#define W 16
using namespace std;
unsigned short Array[H][W];
 
void Bresenham(unsigned short x1, unsigned short y1, unsigned short x2, unsigned short y2, unsigned short(*array)[W]){
 
	int dx = abs(x2 - x1);
 
	int dy = abs(y2 - y1);
 
	bool is_great_than_45_degree = false;
 
	if (dx <= dy)
	{
		// 大于45度
		// Y 方向上变化速率快于 X 方向上变化速率,选择在 Y 方向上迭代,在每次迭代中计算 X 轴上变化;
		is_great_than_45_degree = true;
	}
 
	int fx = (x2 - x1) > 0 ? 1 : -1;
	int fy = (y2 - y1) > 0 ? 1 : -1;
	
	if (dy == 0)//0°
		fy = 0;
	if (dx == 0)//90°
		fx = 0;
 
	int ix = x1;
	int iy = y1;
	int p1 = 2 * dy - dx; //小于等于45°
	int p2 = 2 * dx - dy; //大于45°
if (is_great_than_45_degree){
		while (iy != y2){
			//Array[num - iy - 1][ix] = 0;
			*(*(array + (H- iy - 1)) + ix) = 1;
			//p2>0
			if (p2 > 0){
				p2 += 2 * (dx - dy);
				ix += fx;
			}
			else{
				p2 += 2*dx;
			}
			iy += fy;
			//Array[num - iy - 1][ix] = 0;
			*(*(array + (H - iy - 1)) + ix) = 1;
		}
	}
	else{
		while (ix != x2){
			//Array[num - iy - 1][ix] = 0;
			*(*(array + (H - iy - 1)) + ix) = 1;
			//p1>0
			if (p1 > 0){
				p1 += 2 * (dy - dx);
				iy += fy;
			}
			else{
				p1 += 2 * dy;
			}
			ix += fx;
			//Array[num - iy - 1][ix] = 0;
			*(*(array + (H - iy - 1)) + ix) = 1;
		}
	}
}
 
 
 
int main(){
	memset(Array, 0, H*W);
	unsigned short (*arr)[W] = Array;
	Bresenham(2, 7, 5, 1, arr);
	for (int i = 0; i < H; ++i){
		for (int j = 0; j < W; ++j){
			cout << int(Array[i][j]) << " ";
		}
		cout << endl;
	}
	system("pause");
    return 0;
}

//!

https://www.guyuehome.com/41384 代码

//!

https://zhuanlan.zhihu.com/p/493330783 公式推导文章来源地址https://www.toymoban.com/news/detail-692983.html

到了这里,关于Bresenham 贝汉明算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【计算机图形学|直线生成算法】Bresenham画法详解

    Bresenham画法是一种用于计算计算机图形中线条的算法,其原理是沿着所需绘制的线段中的像素点进行递增或递减,来进行准确的点阵绘制。 实现该算法的关键在于确定像素在基准线上的位置,以及在每次迭代时进行相应的调整。该算法比传统的直线算法更快且更准确,在低速

    2024年02月07日
    浏览(38)
  • 【计算机图形学】扫面转换算法(DDA算法 & 中点画线算法 & Bresenham画线算法)

    模块1 扫描转换算法 一 实验目的 编写直线、弧线的光栅扫描转换算法,并对线宽与线形的算法加以探讨 用DDA算法、中点画线算法、Bresenham画线算法绘制直线(如果键盘输入数据,给出数据值;如果绘制图案,图案中应包含各种斜率;如果鼠标确定任意两点,给出操作说明)

    2024年04月12日
    浏览(26)
  • 【图形学】探秘图形学奥秘:DDA与Bresenham算法的解密与实战

    ​ 🌈个人主页: Sarapines Programmer 🔥 系列专栏: 《图形学 | 图像解码》 ⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 ​ 目录 🌌1. 初识模式识别 🌌2. 开发环境的使用及基本图形生成 🌍2.1 开发环境及实现 🌍2.2 实验目的 🌍2

    2024年01月21日
    浏览(35)
  • 基于Bresenham直线算法的机器人栅格地图路径规划(附带Matlab代码)

    基于Bresenham直线算法的机器人栅格地图路径规划(附带Matlab代码) 路径规划是机器人导航中的关键任务之一,它涉及寻找从起点到目标点的最优路径。在栅格地图中,机器人通常被表示为一个点,而障碍物被表示为栅格单元。Bresenham直线算法是一种经典的图形算法,可以用于

    2024年02月07日
    浏览(36)
  • C++的MFC实现Bresenham算法画直线,从菜单和鼠标响应开始包含代码的完整良心教程

    首先在菜单栏中加入这个工具 然后给他一个ID,注意要全大写   在类视图中右键你的view,选择属性   在消息栏添加鼠标消息,此时会自动添加一个空函数体。    在事件栏添加鼠标事件,为按下菜单栏按钮的时候添加要做的事情。此时也会生成一个空函数体叫做void CMFCApp

    2024年02月06日
    浏览(32)
  • 机器学习算法入门与编程实践

    1.无监督学习的两个主要任务是(多选) BD A 回归                                        B 降维 C 分类                                        D 聚类 2.下列对无监督学习描述错误的是   C   A 无标签                                                B 核心是聚

    2024年02月04日
    浏览(29)
  • 数学建模—编程手算法学习路线(自用)

    评价、决策、评判、提出方案、选择方案、择优、后果等… 基于多个评价指标,选出最优方案 层次分析法 是指将与决策总是有关的元素分解成目标、准则、方案 等层次,在此基础之上进行定性和定量分析的决策方法。 比较适合于具有分层交错评价指标的目标系统,而且目

    2024年02月13日
    浏览(33)
  • 汉明距离,两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。

    题记: 两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y,计算并返回它们之间的汉明距离。 示例 1: 输入 :x = 1, y = 4 输出 :2 解释 : 1 (0 0 0 1) 4 (0 1 0 0) ------↑— ↑ 上面的箭头指出了对应二进制位不同的位置。 示例 2:

    2024年02月15日
    浏览(27)
  • leetcode 461. 汉明距离

            比较简单的一题,先对两个整数进行异或操作,会将两个整数二进制形式中各个数字进行异或操作,不同的数字则为1,再通过移位操作统计得到的二进制数中为1的个数,即为所求。 Java代码如下:

    2024年02月22日
    浏览(23)
  • 汉明码奇偶校验矩阵理解

    首先看  汉明码 一、矩阵解释 单bit纠正( SEC,single  error correction ) 以数据位为8位(m)为例,编码位数为r,2^r=m+r+1 r最小为4 编码后位数为4+8=12位 编码位为p1,p2 ,p3, p4 p1掌控:d1 d2 d4 d5 d7,分别对应位置是:11,101,111,1001,1011(也就是位置的二进制编码,第一位为1的,注意p1由

    2024年02月11日
    浏览(25)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包