检查点是否位于两组坐标之间

时间:2013-12-23 03:10:46

标签: javascript math coordinates point

我正在创建一个塔防游戏,并希望阻止用户将塔放在路径上。该路径存储为具有属性xy的对象数组。我会做一个简单的例子来解释一下。许多“级别”(也称为路径)存储在数组中。在这个数组中(例如Array[0])是多个对象,每个对象详细说明地图上的一个点,然后将它们连接起来创建路径:

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)。

使用上面的路径示例,您可以测试我的小提琴以确保您关注。尝试(应该)返回true的坐标0,35。这是因为x没有改变,所以我们只检查y是否在第一个和第二个点的y值之内。按预期工作:)

然而,我的问题是试图找出塔是否在对角线路径上。这两个值都会改变,所以我需要弄清楚数学来解释各种各样的“对角线”。使用第二和第三路径点,形成从x:0y:50x:50y:100的对角线,我们可以想象围绕此对角线的正方形。我的(不正确的)功能目前阻止该方块中的任何点成为塔,而它应该只是不能使用的对角线。

基本上,我目前的错误功能是这样做的,a是对角线的起点,b是终点:

if(x is between a.x and b.x AND y is between a.y and b.y){
   build the tower
}

对于所有单词和缺少代码感到抱歉,但jsFiddle是一个非常简化的版本,应该有助于理解。我主要是在寻找实现功能的数学,如果你可以帮助伪,我可以自己编写代码。

1 个答案:

答案 0 :(得分:2)

您是否考虑了线方程: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

这一点在线上,但在两点的边界之外。所以你必须为此添加检查。

我可以继续查看更多积分。但我希望上面的内容能帮到你。