如何确定棋盘上玩家的视野

问题描述

这是用于国际象棋/棋盘游戏。

玩家的视野范围存储为相对于玩家位置的坐标数组。

// Example:
[
  { x: 0,y: -3 },{ x: -2,y: -2 },{ x: -1,{ x: 0,{ x: 1,// and so on
]

视觉范围是硬编码的,因为它们就像国际象棋一样,其中棋子只能相对于其当前位置在特定方向上移动。

板上也有灌木丛。它们在板上的坐标存储在一个数组中。

// Example:
[
  { x: 5,y: 5 },{ x: 5,y: 6 },y: 7 },{ x: 6,{ x: 7,y: 7 }
]

我目前计算视野的方法大致如下:

  1. 有多少个灌木丛,然后有多少个线方程。
  2. 这些方程式是从灌木丛和玩家的坐标中得出的。
  3. 然后将线向外外推,直到它们到达视觉范围的边缘。
  4. 所有恰好在外推线段上的点(或方框)将被删除

board-1



board-2


问题是,如果灌木丛具有不规则形状,则不会排除某些点。 (在上图中用紫色框标记)。

我也读过38239309,但是在这种情况下,图块的像素大小是固定的,而我的不是。

由于:

  • 这是一个棋盘游戏,将灌木丛视为geometrical shapes可能不是最好的主意;
  • 依靠简单的旧y = mx + C会产生不准确的输出

还有其他方法可以用来确定视野吗?


更新

我已经动脑筋了一段时间,似乎maraca的想法使我提出了一个对现有算法进行最小改动的解决方案。我可能会误解马拉卡的想法,但最终奏效了。刚好发生,所以这是视野范围最大的棋子。如果视野范围是整个电路板,则可能仍然不起作用,因为未检查相邻单元的相邻单元(如果涉及某种递归,则可能是可能的),但是至少目前没有“泄漏”的视野:

no leaky visions

不过,我仍然相信,如果我真的想提出一种无论视觉范围如何都可以工作的算法,那么将来我将需要加强我的数学知识并重新审视此主题

解决方法

对不起,我知道这个问题有点老了,但是我还是想回答这个问题(如果不是对您来说,那么对于将来可能会需要这种东西的其他人)。

我最初的想法是将灌木丛定义为范围而不是数字。也就是说,如果正方形5、2是灌木丛,则该灌木丛实际上(以数学语法)为{x: 4.5 <= x <= 5.5}{y: 1.5 <= y <= 2.5}。现在,不幸的是,您似乎正在使用javascript或某些东西,因为注释是//,而且我只知道python,所以我无法为您提供实际使用的代码。但是,我将以数学方式定义答案,因此任何使用任何语言的人都应该能够实现此答案。

因为看起来您想让视觉成为整个正方形(一个正方形是否被点亮,或者像现实生活中一样,它不可能是半透明的半透明遮盖物),所以我们可以简单地检查每个潜在的视觉方块(图 a ),如果从玩家方块中心到目标方块中心的线包含任一灌木丛(图 b )。

现在,为了使一条线穿过二维多边形,它必须穿过其一侧。因此,可以对直线与正方形的四个边界边线运行一种简单的算法。通过使用数学方程式查看一条线是否有交点,可以很容易地测试一条线是否通过一条边。设置直线彼此相等,通过求解x和y的方程式找到交点,然后查看该点是否在边界线的范围内。

但是,衬套的边缘平行于x和y轴,因此我们不能使用traditional method。但是,这也使它变得容易一些,因为对于平行于x轴的线,我们只需要找到x值即可,因为y值是恒定的。

从数学上讲,给定水平边缘y = a {x: x1 <= x <= x2}和线y = mx + c,我们将两者相等,然后看x是否在边缘范围内。

mx + c = a
mx = a - c
x = (a - c) / m

y值相同:给定垂直边缘x = a {y: y1 <= y <= <2}和线(y - c) / m = x,我们检查y是否在边缘范围内。

(y - c) / m = a
y - c = am
y = am + c

对所有边缘执行此操作,然后查看线条是否完全通过形状。使用所有灌木丛和所有正方形进行此操作,您将看到可以看到和看不到哪个正方形。

索引:
a :每个方格(o)可见的玩家(p)的视野:

        o  
    o o o o o 
    o o o o o 
  o o o p o o o
    o o o o o 
    o o o o o 
        o 

b :玩家(p)的视野被遮盖的灌木丛(b)遮盖了,其中每个正方形(o)可见,而每个正方形(x)则可见,如果灌木丛不在那里: / p>

        o  
    x o o o o 
    x x o o o 
  x x b p o o o
    x b b x o 
    x x x x x 
        x