关于在位图上像绘制直线的算法,可以参见:http://free.pages.at/easyfilter/bresenham.html。但是不同于在位图上绘制直线,需要的是:一条直线经过哪些格子。

  1. 假设有p0,p1两个点,位置如下图:
  2. 我们很容易得到连线的方程。首先我们按照在x上取整递增,很容易计算出x=1, 2, 3, 4…时y的值是多少。
  3. 然后对y值取整,所得到(x1,y1),(x2,y2),(x3,y3)…肯定是连线过的格子。
  4. 但是我们遗漏了这种情况,左上格也是连线经过的格子,但由于我们只在x轴上进行取整递增运算,没有被考虑在内。
  5. 在(2)时已经可以知道A点坐标,我们可以斜率来判断连线是否经过上面一格。如果“蓝色线的斜率小于p0-p1的斜率”,说明连线经过了上面一格。
  6. 利用这种方法,可以轻松计算出连线经过的所有格子。

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. 计算三维空间中直线和三角形的交点

    计算三维空间中直线和三角形的交点 前言 一.计算平面方程 1.1 平面不过原点 1.2 平面过原点 1.3 平面过 zzz 轴 1.4 平面为 yOzyOzyOz 平面 二.计算直线方程 三.计算交点 ...

  2. 在 N 条水平线与 M 条竖直线构成的网格中,放 K 枚石子

    [题目描述] 在 N 条水平线与 M 条竖直线构成的网格中,放 K 枚石子,每个石子都只能放在网格的交叉点上.问在最优的摆放方式下,最多能找到多少四边平行于坐标轴的长方形,它的四个角上都恰好放着一枚石 ...

  3. a推b等价于非a或b_探究正方形网格中互相垂直的两条直线(非网格线)

    2020年天津中考数学第18题改编(预备)题3,正方形网格中互相垂直的两条直线(非网格线) 例1 如图,点A,B都是正方形网格上的格点,请用没有刻度的直尺画出过点A且与AB垂直的直线,并简要说明理由. ...

  4. 网格中的BFS,逆向(POJ2049)

    题目链接:http://poj.org/problem?id=2049 解题报告: 网格中的BFS,最主要的是边界问题. 1.这里在左右,上下两个方向上,分别判断墙,和门,细节是,向上有t个墙,for ...

  5. hazelcast配置内存_在内存数据网格中引入hazelcast imdg

    hazelcast配置内存 Today's article will be oriented to a very specific concept, which is the In-Memory Da ...

  6. 计算机图形学直线算法论文,《计算机图形学》中直线生成算法的教学心得

    摘要:<计算机图形学>是计算机科学与技术专业一门重要的专业课,其中直线生成算法是教学重点之一.该文通过分析几种直线生成算法的特点,阐述了理论教学和实践教学的重点和难点,总结了教学的体会和心 ...

  7. excel怎么一个格子斜分_『在Excel中,把一个格子用线分成三个怎么弄啊』一个单元格怎么斜分两个...

    在Excel中,把一个格子用线分成三个怎么弄啊 1.以excel2010版本为例,如选中该单元格后击页面上方的"": 2.在插入栏下,找到"形状"选项,并点击, ...

  8. 利用Gauss-Legendre 5点通用公式计算线路中边桩坐标并计算放样数据

    .正算主程序  GSZS 10→DimZ "X0"?I:"Y0"?S:"K0" ?O:"F0"?G:"KN&q ...

  9. 使用C++面向对象思想计算两条直线交点

    使用C++面向对象思想计算两条直线交点 以下是使用C++面向对象思想计算两条直线交点的示例代码: #include <iostream>using namespace std;class ...

最新文章

  1. Python 使用 Flask框架记录
  2. 语言生成不自闭迷宫_4招教你分清自闭症、多动症、发育迟缓、抑郁症的区别...
  3. python tkinter画笑脸_Python3 Tkinter基础 Canvas create_line 画实线与虚线
  4. Java客户端操作elasticsearch--向索引库添加mappings映射数据
  5. 推荐一个以动画效果显示github提交记录的黑科技工具:Gource
  6. 【招聘(深圳)】敢为软件技术有限公司 .Net 工程师
  7. 基于visual Studio2013解决面试题之0902内存拷贝
  8. linux外接显示屏,关掉本身的笔记本电脑
  9. Python笔记:0
  10. FormData对象
  11. HDU 6185 2017广西邀请赛:Covering(矩阵快速幂)
  12. 随机森林python反欺诈_携程金融自动化迭代反欺诈模型体系
  13. 软件测试用例设计包括哪些类型?
  14. 利用函数wavread对语音信号进行采样_信号时间采样
  15. [MTK]LCD 调试总结
  16. Pr:添加黑边效果的方法
  17. Android 4.0 源代码结构
  18. Swift 检查版本更新 itunes
  19. 13c语言——运算符
  20. 人工智能里的数学修炼 | 隐马尔可夫模型:基于EM的鲍姆-韦尔奇算法求解模型参数

热门文章

  1. 基础算法-支持向量机
  2. 极路由+花生壳内网版配置
  3. linux可以打开浏览器嘛,Linux下怎样可以打开浏览器?
  4. 信修修:固态硬盘各式样,对比起来哪家强?
  5. 数据结构课程设计【C++实现】
  6. shp、tif文件坐标系转换
  7. DWZ的几个常用组件
  8. 安装向日葵后亮度无法调节
  9. Android Jenkins + gradle 实现自动化打包流程并上传至蒲公英平台全过程
  10. 关于JSON.stringify()的用法