首页 > 其他分享 >栅格地图: Bresenham's line

栅格地图: Bresenham's line

时间:2023-09-01 20:45:10浏览次数:43  
标签:int Bresenham 栅格 dx y1 y0 line x1 x0

参考:网易公开课,中国农业大学,Bresenham

image
image

解释:对于【图2】中,当d≥1的时候,减去1,实际测试不对,应该分界点是0.5,超过0.5就要减去1.0

image

【图3】中对于判断变量进行了改进,设置:e = d-0.5

image

按照上述理解,整理出如下浮点运算和整数运算的代码,

  • 代码仅针对x0<x1,y0<y1,且dy/dx ∈[0,1]

1.浮点运算

void bresenham2d3(nav_msgs::OccupancyGrid & map, int x0,int y0, int x1,int y1){
	int dx = x1-x0; 
	int dy = y1-y0; 

	float k = std::abs(dy/float(dx)); 	// 计算斜率
	float d = 0;	
	int x = x0,y=y0;	
	for(;x<=x1;x++){
		map.data[y* (map.info.width) +x] =120;    // 在(x,y)处绘制cell绿色背景
		d = d+k;
		if (d>0.5){
			d = d-1.0;
			y++;
		}
	}    	
	map.data[y1* (map.info.width) +x1] =100;
}

如果是浮点数运算,会存在如下问题:
k = 0.388889
判断x=8时,计算y的位置时,由于d = 0.111111 ,所以y保持不变;同x=7在同一行;
判断x=9时,由于d =0.5 ,没有超过0.5,但是在执行【if (d>0.5)】比较时,程序认为条件满足了,所以进入了分支。所以y的栅格对应的上移了一格,就出现了图中绿色的栅格;

问题说明:浮点数的比较不稳定,还是需要转换为整数运算来计算;才能保证计算结果绝对准确;

image

2.整数运算

void bresenham2d4(nav_msgs::OccupancyGrid &map, int x0, int y0, int x1, int y1){
    int dx = x1 - x0;
    int dy = y1 - y0;
    int x, y;

    int d = -dx; // 初始值,对应上述右图中的step1;
    for (x = x0, y = y0; x <= x1; x++){
        map.data[y * (map.info.width) + x] = 0; // 在(x,y)处绘制cell背景,0表示白色背景
        d = d + 2 * dy;                         // 增量dy,对应上述右图中的step2
        if (d > 0){
            d = d - 2 * dx;             // 大于0了就减去dx,对应上述右图中的step3;
            y++;  
        }
    }
    map.data[y1 * (map.info.width) + x1] = 100;
}

标签:int,Bresenham,栅格,dx,y1,y0,line,x1,x0
From: https://www.cnblogs.com/leaver/p/17672806.html

相关文章

  • GIS进行多个栅格属性组合绘图
    最近希望借鉴LCZ局地气候分区的方法进行空间耦合关系的制图,使单个像元内能够包括不同类型的属性信息,例如“人口密度高—GDP低—POI密度高”的形式。并且基础数据是栅格,记录一下操作过程。1.对栅格进行重分类这一步骤不再详细叙述,将栅格重分类为不同的等级(高中低)2.对多个栅格进......
  • 无涯教程-Android Online Test函数
    Android在线测试模拟了真正的在线认证考试。您将看到基于Android概念的多项选择题(MCQ),将为您提供四个options。您将为该问题选择最合适的答案,然后继续进行下一个问题,而不会浪费时间。完成完整的考试后,您将获得在线考试分数。总问题数-20最长时间-20分钟StartTest......
  • 无涯教程-Android Online Quiz函数
    以下测验提供与Android相关的多项选择题(MCQ)。您将必须阅读所有给定的答案,然后单击正确的答案。如果您不确定答案,则可以使用显示答案按钮检查答案。您可以使用下一个测验按钮检查测验中的新问题集。Q1-android中的PendingIntent是什么?A-这是一种意图B-用于在活动......
  • getline的几种用法
    istream库下istream&getline(char*s,streamsizen);istream&getline(char*s,streamsizen,chardelim);从istream输入流中读取字符传入字符串s,个数为n string库下istream&getline(istream&is,string&str,chardelim);istream&getline(istre......
  • Daimayuan Online Judge 线段树打标记2
    给\(n\)个数\(a_1,a_2,\cdots,a_n\)。支持\(q\)个操作:1lrd,令所有的\(a_i(l\leqi\leqr)\)加上\(d\)。2lrd,令所有的\(a_i(l\leqi\leqr)\)乘上\(d\)。3lrd,令所有的\(a_i(l\leqi\leqr)\)等于\(d\)。4lr,查询\((\sum_{i=l......
  • Daimayuan Online Judge 线段树打标记1
    给\(n\)个数\(a_1,a_2,\cdots,a_n\)。支持\(q\)个操作:1lrd,令所有的\(a_i(l\leqi\leqr)\)加上\(d\)。2lr,查询\(max_{i=l}^{r}a_i\)。区间修改的线段树要比基础线段树多考虑一个元素:\(lazy\tag\)。复杂的信息可以用多个标记表示。\(lazy\ta......
  • Daimayuan Online Judge 线段树2
    给\(n\)个数\(a_1,a_2,\cdots,a_n\)。支持\(q\)个操作:1xd,修改\(a_x=d\)。2lr,查询\([l,r]\)中的最大子段和。一:确定需要维护的信息。根据分治中线讨论,哪些信息可以合并出所需信息。递归讨论新信息如何合并。直至完全拆解。不越过分治中线:\([l,r]\)......
  • Daimayuan Online Judge 线段树1
    给\(n\)个数\(a_1,a_2,\cdots,a_n\)。支持\(q\)个操作:1.1xd,修改\(a_x=d\)。2.2lr,查询\(min_{i=l}^{r}a_i\),并输出\(\sum_{i=l}^{r}[a_i=min_{i=l}^{r}a_i]\)。一:确定出需要维护的信息\(Info\)。建立线段树节点structInfo{ intminv......
  • 报错 PEP 8: expected 2 blank lines, found 1
    PyCharm提示:PEP8:expected2blanklines,found1类或方法前需要空两行解决方法:Ctrl+Alt+L格式化一下就OK了。或者手动在前面敲一行......
  • redis高级用法:慢查询、pipline与事务、发布订阅、bitmap位图、HyperLogLog、GEO地理位
    目录一高级用法之慢查询1.1生命周期1.2两个配置1.2.1slowlog-max-len1.2.2slowlog-max-len1.3设置慢查询1.5作用二pipline与事务2.1什么是pipeline(管道)2.2python客户端实现pipline2.3与原生操作对比2.4使用建议2.5原生redis操作操作事务三发布订阅3.1角色3.2模......