我正在尝试在多边形算法中创建一个快速 2D点,用于命中测试(例如Polygon.contains(p:Point)).对于有效技术的建议将不胜感激.
graphics performance polygon collision-detection point-in-polygon
我看到下面的算法用于检查点是否在此链接的给定多边形中:
int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy)
{
int i, j, c = 0;
for (i = 0, j = nvert-1; i < nvert; j = i++) {
if ( ((verty[i]>testy) != (verty[j]>testy)) &&
(testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
c = !c;
}
return c;
}
Run Code Online (Sandbox Code Playgroud)
我试过这个算法,它实际上工作得很完美.但遗憾的是,在花了一些时间试图了解它之后,我无法理解它.
因此,如果有人能够理解这个算法,请向我解释一下.
谢谢.
Struggeling将鼠标的位置转换为网格中tile的位置.当它完全平坦时,数学看起来像这样:
this.position.x = Math.floor(((pos.y - 240) / 24) + ((pos.x - 320) / 48));
this.position.y = Math.floor(((pos.y - 240) / 24) - ((pos.x - 320) / 48));
Run Code Online (Sandbox Code Playgroud)
其中pos.x和pos.y是鼠标的位置,240和320是贴片的大小,24和48是贴片的大小.然后,位置包含我正在悬停的图块的网格坐标.这在平坦表面上工作得相当好.

现在我正在增加高度,数学没有考虑到.

此网格是包含噪声的2D网格,正在转换为高度和平铺类型.高度实际上只是对瓷砖"Y"位置的调整,因此可以在同一位置绘制两个瓷砖.
我不知道如何确定我在哪个瓷砖上空盘旋.
编辑:
取得了一些进展...之前,我依靠鼠标悬停事件来计算网格位置.我只是将其更改为在绘制循环本身中进行计算,并检查坐标是否在当前绘制的图块的限制范围内.创造了一些头顶的东西,不确定我是否对它非常满意,但我会确认它是否有效.
编辑2018:
我没有答案,但既然这是[sd]开放的赏金,请自己修改一些代码和演示
网格本身是简化的;
let grid = [[10,15],[12,23]];
Run Code Online (Sandbox Code Playgroud)
这导致如下绘图:
for (var i = 0; i < grid.length; i++) {
for (var j = 0; j < grid[0].length; j++) {
let x = (j - i) * resourceWidth;
let y = ((i + j) …Run Code Online (Sandbox Code Playgroud) algorithm ×1
c ×1
canvas ×1
graphics ×1
isometric ×1
javascript ×1
mouse ×1
noise ×1
performance ×1
polygon ×1