我目前有一个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。我不会解释为什么我需要这个,因为它有点抽象,但折线的例子是:
答案 0 :(得分:0)
您可以通过定义(伪随机)两个多边形之间的无限长度线来加速碰撞搜索,以便该线将多边形分成3组:上方,下方和碰撞。因为它们是由线路驱动的,所以你知道以上所有都不会与下面的所有部分发生冲突。重复几次,直到你有一定数量的未定多边形对,然后将旧算法应用于剩余的对。
通过计算连接多边形集中两个多边形中心的直线中间的法线,可以找到(伪随机)无限长度线。