计算网格中直线经过的格子
来源:互联网 发布:极速格斗网络电影 编辑:程序博客网 时间:2024/04/26 16:34
关于在位图上像绘制直线的算法,可以参见:http://free.pages.at/easyfilter/bresenham.html。但是不同于在位图上绘制直线,需要的是:一条直线经过哪些格子。
- 假设有p0,p1两个点,位置如下图:
- 我们很容易得到连线的方程。首先我们按照在x上取整递增,很容易计算出x=1, 2, 3, 4…时y的值是多少。
- 然后对y值取整,所得到(x1,y1),(x2,y2),(x3,y3)…肯定是连线过的格子。
- 但是我们遗漏了这种情况,左上格也是连线经过的格子,但由于我们只在x轴上进行取整递增运算,没有被考虑在内。
- 在(2)时已经可以知道A点坐标,我们可以斜率来判断连线是否经过上面一格。如果“蓝色线的斜率小于p0-p1的斜率”,说明连线经过了上面一格。
- 利用这种方法,可以轻松计算出连线经过的所有格子。
AS3实现的demo:
源码:
/**
* 返回网格中两个点,连线经过的格子。
* @see http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm
*/
public static function determineTouchedTiles(p0:Point, p1:Point):Vector.
{
var touched:Vector.=new Vector.();
var x0:Number=p0.x;
var y0:Number=p0.y;
var x1:Number=p1.x;
var y1:Number=p1.y;
var steep:Boolean=Math.abs(y1 - y0) > Math.abs(x1 - x0);
if (steep)
{
x0=p0.y;
y0=p0.x;
x1=p1.y;
y1=p1.x;
}
if (x0 > x1)
{
var x0_old:Number=x0;
var y0_old:Number=y0;
x0=x1;
x1=x0_old;
y0=y1;
y1=y0_old;
}
var ratio:Number=Math.abs((y1 - y0) / (x1 - x0));
var mirror:int=y1 > y0 ? 1 : -1;
for (var col:int= Math.floor(x0); col < Math.ceil(x1); col++)
{
var currY:Number=y0 + mirror * ratio * (col - x0);
//第一格不进行延边计算
var skip:Boolean = false;
if(col == Math.floor(x0)){
skip = (int(currY) != int(y0));
}
if(!skip){
if (!steep)
{
touched.push(new Point(col, Math.floor(currY)));
}
else
{
touched.push(new Point(Math.floor(currY), col));
}
}
//根据斜率计算是否有跨格。
if ((mirror > 0 ? (Math.ceil(currY) - currY) : (currY - Math.floor(currY))) < ratio)
{
var crossY:int = Math.floor(currY) + mirror;
//判断是否超出范围
if(crossY>Math.max(int(y0), int(y1)) || crossY
//跨线格子
if (!steep)
{
touched.push(new Point(col, crossY));
}
else
{
touched.push(new Point(crossY, col));
}
}
}
return touched;
}
http://www.itamt.com/2011/04/line-touched-tile/
- 计算网格中直线经过的格子
- 一条直线上经过的格子
- 获取直线经过的像素
- 1.10 找经过点最多的直线
- Matlab研究小问题:如何计算一条线段所经过的网格区域和各区域内的长度
- 在20×20的网格中同一直线上四个数的最大乘积是多少?
- 计算网格的两个定义
- 一个网格计算的构想
- 绘图 网格 直线 正弦
- 计算直线的交点数
- 计算直线的交点数
- 计算直线的交点数
- hdu 计算直线的交点
- 计算直线的交点数
- 计算直线的交点数
- 计算直线的交点数
- 计算直线的交点数
- 计算直线的交点数
- 构建WDK驱动出现fatal error U1087: cannot have : and :: dependents for same target
- 影子clone,深度clone
- 播放器的一些基础知识
- 失忆?
- js 控制textbox enter 回车 禁止提交功能(ie9,firefox,ie8,chrome测试通过)
- 计算网格中直线经过的格子
- What is mx_internal?
- ERP原理_采购管理
- 16、在Linux下改变进程的优先级
- Android Canvas绘图抗锯齿解决方法
- extjs4 进行查询操作化后,页面自动跳至查询结果后第一页
- UIButton 按钮控件-IOS开发
- ATL(Active Template Library)
- hadoop常见配置含义备忘录