我正在创建一个塔防游戏,并希望阻止用户在路径上放置塔。该路径存储为具有属性 x
和 y
的对象数组。我将做一个简单的例子来解释。许多“级别”(也称为路径)存储在数组内。该数组(例如 Array[0]
)内有多个对象,每个对象详细说明了 map 上的一个点,然后将这些点连接起来创建一条路径:
levels = [
[{x: 0, y: 0}, // When plotted:
{x: 0, y: 50}], // 0,0 to 0,50 creates a vertical line
{x: 50, y: 100}], // 0,50 to 50,100 creates a diagonal
[{}] // more levels
];
由于计算某个点是否位于仅一个 x/y 值变化的路径上的数学原理相对简单,因此我有一个工作版本 ( which you can find here )。
使用上面的路径示例,您可以测试我的 fiddle 以确保您遵循。尝试坐标 0,35
(应该)返回 true。这是因为 x 不会改变,所以我们只需检查 y 是否在第一个和第二个点的 y 值范围内(事实确实如此)。按预期工作:)
但是,我的问题是试图找出塔是否位于对 Angular 线上。这两个值都会改变,所以我需要计算出数学来解释某种“对 Angular 线”。使用第二个和第三个路径点,从 x:0
、y:50
到 x:50
、y:100 的对 Angular 线
形成后,我们可以想象围绕这条对 Angular 线有一个正方形。我的(不正确的)函数目前阻止该正方形中的任何点成为塔,而它应该只是不能使用的对 Angular 线。
本质上,我当前的错误函数执行此操作,a
是对 Angular 线的起点,b
是终点:
if(x is between a.x and b.x AND y is between a.y and b.y){
build the tower
}
很抱歉所有的文字和缺乏代码,但是 jsFiddle是一个真正精简的版本,应该有助于理解。我主要是在寻找数学来实现该功能,如果您可以帮助伪代码,我可以自己编写代码。
最佳答案
你考虑过直线方程吗:y = a * x + b
你可以用两个点找到a和b。
使用第一个点:(0,50)
50 = 0 + b
因此:
b = 50
使用第二个点:(50, 100)
100 = 50 * a + 50
因此:
a = 1;
因此,确定一个点是否在那条线上的方程是:
y = 1 * x + 50
示例:
第 1 点:(10, 60)
y = 1 * 10 + 50 = 60
这个点就上线了。
第 2 点:(60, 110)
y = 1 * 60 + 50 = 110
该点在线上,但在两点的边界之外。所以你必须为此添加检查。
我可以继续检查更多点。但我希望以上内容能让您继续前进。
关于javascript - 检查点是否位于两组坐标之间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20736483/