2011-06-29 54 views
4

我的工作用JavaScript编写/ jQuery的游戏。我的部分代码在瓦片网格上绘制一个随机多边形(一个岛)。我需要检查一个点是否在多边形内。点在多边形击中测试在JavaScript(Chrome有错误)

我在堆栈溢出(原始here)中使用了我在severalplaces中找到的一个多边形点相交脚本。这在Firefox中正常工作。在Chrome中,脚本内的多边形内有些点不在里面。

在Firefox: enter image description here

在Chrome中(岛是不同的,因为它们是随机生成): enter image description here

请看看源在这里,特别是pointPolygonIntersect功能: Point in Polygon Hit Test

谁能弄清楚为什么会这样?原来的脚本是用C语言编写的,我使用的是JavaScript版本 - 这是否会导致问题?

+0

测试'pointPolygonIntersect()'是相当简单的,所以你必须要得到浏览器之间不同的数据。如果您在两个浏览器上转储数据并进行比较,可能会更容易看到。 – Orbling

+0

谢谢......它可能是除了pointPolygonIntersect之外的东西。我一直在试图找出数据的差异,但迄今为止还没有发现。 – shipshape

回答

2

选择一个岛屿,并坚持下去。跟踪两个浏览器中的代码并查看它们的不同之处。我们没有理由反对的随机性,你可以很容易地删除打...

+1

出于测试目的,这是明智的。 – Orbling

+0

谢谢,这个建议帮我弄清楚了这个问题。我仍然不确定到底发生了什么,但差异发生在对多边形点阵列进行排序并删除重复值的函数中。我发现了另一种方法来做到这一点,不会导致这个问题。 – shipshape

+0

大声笑,也许我会用这个现象在我的岛屿地形创建补丁。 :) – shipshape

0

我给它一个快速浏览一下。无法跟踪应用程序流,但看起来奇怪的是

c = !c; 

代码行。如果你第一次符合条件,为什么不把它设置为真,或者直接返回true?我假设,铬会变为“真实”,然后在下一次在x/y范围内将其倒置。

我不熟悉拉斐尔或SVG,但似乎你的多边形为正方形,这样你可以做一个简单的测试中

//original found here http://www.gamedev.net/topic/483716-point-inside-of-rectangle/ 
function inside(x, y, l, r, b, t){ //x,y are the point, l,r,b,t are the extents of the rectangle 
    return x > l && x < r && y > b && y < t; 
} 
+2

多边形岛不是正方形(瓷砖是正方形,但这不是我正在做的打击测试)。“c =!c”只是简单地将c从true切换到false,反之亦然,作为相交测试。所述相交测试的工作原理是检查的假想线相交是否多边形的周界的奇数或偶数的时间,这是脚本如何确定该点在多边形的内部。这是一个整洁的脚本,但我没有写。 – shipshape