如何实现Javascript折线碰撞检测

时间:2017-06-06 11:37:43

标签: javascript collision polyline

我目前有一个JavaScript平台游戏。我使用许多其他网站上描述的SAT方法创建了一个带有响应的多边形 - 多边形碰撞检测。

我还在Polygon构造函数中创建了一个函数,该函数将返回暴露于多边形顶部的边或暴露于多边形底部的边,具体取决于选择的方向。返回的数组包含许多不同的向量,稍后将对其进行更详细的解释。

目前的代码看起来有点像这样:

Polygon.prototype.getSidesOn = function(dir) {
  if (dir === "top" || dir === "bottom") {
    var result = [], start = false, stop = false, elen = 
this.calcPoints.length, e = 0, f = 0, point, next, prevX, prevY, directionX,   directionY;
    while (!stop) {
      if (e >= 5*elen) {return;}
      f = e%elen;
      prev = f-1 < 0 ? this.calcPoints[elen-1] : this.calcPoints[f-1];
      point = this.calcPoints[f];
      prevX = directionX;
      prevY = directionY;
      directionX = point.x > prev.x ? "right" : point.x < prev.x ? "left" : directionX;
      directionY = point.y < prev.y ? "up" : point.y > prev.y ? "down" : directionY;
      if (prevX !== directionX && prevX && prevY) {
        if (!start) {
          start = dir === "top" ? directionY === "up" : directionY === "down";
        } else {
          break;
        }
      }
      if (start) {
        if (point.x !== prev.x) {
          if (!result.length) {
            result.push(new Vector(prev.x,prev.y),new 
Vector(point.x,point.y));
          } else {
            result.push(new Vector(point.x,point.y));
          }
        } else {
          break;
        }
      }
      e++;
    }
    return result;
  } else {
    return;
  }
}

我知道它有点乱,但这不用担心,因为我稍后会优化它。

基本上,它仅适用于凸多边形(我的意思是“凸起”一词,如三角形或不会再回到自身的形状)。无论如何,它的作用是因为所有凸多边形只有两个点,相邻的边朝向相反的X方向。

无论如何,输出的数组看起来有点像这样:

//[Vector,Vector,Vector,Vector...]

这不是它实际上的样子,但基本上,它为每个检测到的点输出一个Vector数组。

我需要实现的是一种检测这些折线之间碰撞的方法。与多边形 - 多边形碰撞检测系统不同,不需要响应向量,相反,代码应输出“true”或“false”bool。

我目前能想到的唯一方法是:

function PolylinePolyline(line1,line2) {
  var i, ilen = line1.length, j, jlen = line2.length;
  for (i = 0; i < ilen; i++) {
    for (j = 0; j < jlen; j++) {
      var point1 = line1[i];
      var point2 = i+1 < ilen ? line1[i+1] : line1[0];
      var point3 = line2[j];
      var point4 = j+1 < jlen ? line2[j+1] : line2[0];
      var line01 = new line(point1,point2);
      var line02 = new line(point3,point4);
      if (LineLine(line01,line02) {
        return true;
      }
    }
  }
  return false;
}

虽然这很有效,但是如果线条长5分,那么使用起来非常昂贵,我必须检测其中4个之间的碰撞。我希望有一种替代方案,如果它们发生碰撞则返回true,否则返回false。我不会解释为什么我需要这个,因为它有点抽象,但折线的例子是:

Note that the polylines are convex-shaped

1 个答案:

答案 0 :(得分:0)

您可以通过定义(伪随机)两个多边形之间的无限长度线来加速碰撞搜索,以便该线将多边形分成3组:上方,下方和碰撞。因为它们是由线路驱动的,所以你知道以上所有都不会与下面的所有部分发生冲突。重复几次,直到你有一定数量的未定多边形对,然后将旧算法应用于剩余的对。

通过计算连接多边形集中两个多边形中心的直线中间的法线,可以找到(伪随机)无限长度线。