两点阵列多边形的Javascript碰撞

时间:2017-06-06 02:08:48

标签: javascript arrays collision

我已经搜遍了所有,我找到了矩形圆和精灵碰撞的答案。没有什么能在两个点阵列之间提供碰撞检测,例如,

var poly1=[
    [0,0],
    [20,50],
    [50,70],
    [70,20],
    [50,0]
];
// each point from one to the next represent a line in the shape, then the last point connects to the first to complete it.
var poly2=[
    [50,30],
    [40,90],
    [70,110],
    [90,70],
    [80,20]
];
var collided=arraysCollided(poly1,poly2);

有没有人知道可以做到这一点的图书馆?我的研究没有提供任何支持这一点,也没有与某些游戏引擎库相关联。

例如,当一个或多个点位于另一个点的多边形内时,会触发碰撞true

2 个答案:

答案 0 :(得分:0)

SAT.js对我而言,我只是将每一点都放入SAT.Vector然后进入SAT.Polygon,然后用SAT.testPolygonPolygon(SAT.Polygon,SAT.Polygon);

测试它们
var poly1={
    name:"poly2",
    x:400,
    y:60,
    rotation:0,
    runner:function(){

    },
    points:[
        [20,-50],
        [-30,-50],
        [-30,30],
        [10,60],
        [50,20]
    ]
};
var poly2={
    name:"poly2",
    x:50,
    y:70,
    runner:function(){
        this.x+=1;
    },
    points:[
        [-20,-40],
        [-60,50],
        [10,70],
        [50,30],
        [30,-20]
    ]
};
pGon=(poly)=>{
    var center=SAT.Vector(0,0);
    var pts=[];
    for(var i in poly.points){
        var point=poly.points[i];
        // point = [0:x,1:y]
        pts[pts.length]=new SAT.Vector(point[0]+poly.x,point[1]+poly.y);
    }
    var poly_a=new SAT.Polygon(center,pts);
    return poly_a;
};
pCollide=(p1,p2)=>{
    var p1_poly=pGon(p1);
    var p2_poly=pGon(p2);
    var res=new SAT.Response();
    var collided=SAT.testPolygonPolygon(p1_poly,p2_poly,res);
    console.log(collided);
    console.log(res);
    return collided;
};
var collided=pCollided(poly1,poly2);

用它,它将每个点映射到坐标系上的多边形,然后从那里测试它。所以collided = true

答案 1 :(得分:0)

我检查了每个多边形的每个点是否在另一个多边形中。这是检查点是否在多边形中的代码:

function pip(x, y, polygon) {
let odd = false;

let v = polygon.va; //The vertices array
let j = v.length - 2;

for (let i=0; i<v.length-1; i+=2) {
    if ((v[i+1]<= y && v[j+1]>=y ||  v[j+1]<= y && v[i+1]>=y)
        && (v[i]<=x || v[j]<=x)) {
          odd ^= (v[i] + (y-v[i+1])*(v[j]-v[i])/(v[j+1]-v[i+1])) < x; 
    }

    j=i; 
}
if(odd === false) odd = 0;
    return odd;
}

我是从Here那里得到的,但是对其进行了修改以使其适用于像[x1,y1,x2,y2,x3,y3...]这样的数组。要使其适用于x,y对,只需更改for循环修饰符,并将polygon.va[i][0]视为x,将polygon[i][1]视为y

相关问题