这是下棋/棋盘比赛用的。
玩家的视觉范围存储为相对于玩家位置的坐标数组。
// Example:
[
{ x: 0, y: -3 },
{ x: -2, y: -2 },
{ x: -1, y: -2 },
{ x: 0, y: -2 },
{ x: 1, y: -2 },
// and so on
]视觉范围是硬编码的,因为它们就像国际象棋,棋子只能相对于它们当前的位置向特定的方向移动。
董事会上也有灌木丛。它们在板上的坐标被存储在一个数组中。
// Example:
[
{ x: 5, y: 5 },
{ x: 5, y: 6 },
{ x: 5, y: 7 },
{ x: 6, y: 7 },
{ x: 7, y: 7 }
]我目前计算视野的方法大致如下:


问题是,如果灌木丛有不规则的形状,就不会排除某些点。(在上图中用紫色的方框标记)。
我也读过38239309,但在这种情况下,瓷砖有一个固定的像素大小,而我的没有。
既然:
还有另一种方法可以用来确定视野吗?
更新
我已经毁了我的大脑一段时间了,从评论中看,玛拉卡的想法似乎让我想出了一个解决方案,对我现有的算法做了最小的修改。我可能误解了玛拉卡的想法,但最终还是奏效了。它只是发生了,这是国际象棋,最大的视觉范围。如果视觉范围是整个板,因为没有检查相邻细胞的相邻细胞(如果涉及某种递归可能是可能的),那么它可能仍然不起作用,但至少目前没有更多的“漏”图像:
不过,我相信我需要加强我的数学知识,并在未来重新讨论这个话题,如果我真的想出一个算法,可以工作,无论视觉范围。
发布于 2020-10-14 19:21:59
对不起,我知道这个问题有点老了,但我还是想回答它(如果不是为你,那么其他人谁可能需要这样的东西在未来)。
我最初的想法是将灌木丛定义为范围而不是数字;也就是说,如果平方5,2是灌木,那么灌木实际上是(在数学语法中) {x: 4.5 <= x <= 5.5}{y: 1.5 <= y <= 2.5}。现在,不幸的是,您似乎在使用javascript之类的东西,因为注释是//,而我只知道python,所以我不能给您实际使用的代码。然而,我将从数学上定义答案,所以任何使用任何语言的人都应该能够实现这个答案。
因为看起来你希望视觉是完整的正方形(一个正方形是亮不亮的,它不可能像现实生活中那样半可见半背后的遮盖物),所以我们可以简单地检查一下,每一个潜在的视觉方块(图a),如果从玩家的中心到目标的正方形的线包含任何一个灌木丛共用的点(图b)。
现在,为了让一条线穿过一个二维多边形,它必须穿过它的一个边。因此,我们可以在直线上运行一个简单的算法,相对于正方形的四个边框。这是很简单的测试一条线是否通过一个边缘,看看他们是否有一个交叉使用一个数学方程。设置彼此相等的直线,通过求解x和y的方程找到交点,然后查看该点是否在边框线的范围内。
然而,灌木丛的边缘与x和y轴平行,所以我们不能使用传统方法。然而,这也使它更容易一些,因为对于与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:播放器(p)的视觉,每个方块(o)可见:
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)都是可见的:
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 https://stackoverflow.com/questions/63994235
复制相似问题