Реализация теоремы об отделении в Javascript

Я пытаюсь сделать простой тест обнаружения столкновений для двух выпуклых форм. Мои фигуры определены ниже

var convex2 = [
    {x:-0.1, y:-0.1},
    {x: 0.12, y:-0.07},
    {x: 0.22, y:0.0},
    {x: 0.0, y:0.2},
    {x:-0.1, y:0.12}
];

var convex = [
        {x:-0.08, y:-0.07},
        {x: 0.07, y:-0.06},
        {x: 0.09, y: 0.08},
        {x:-0.07, y: 0.09},
];

У меня есть функция, чтобы проверить, сталкиваются ли два полигона друг с другом и вызывает его

convexConvex(convex, convex2)

Ниже моя попытка реализовать SPT

Во-первых, я новичок в Javascript, поэтому, пожалуйста, дайте мне знать, если я делаю неправильный синтаксис.

Я определил проекционную ось как горизонтальную ось х (1,0). Я не уверен, что это правильно.

Функция всегда возвращает true, даже если они не сталкиваются. Что я делаю неправильно?

function convexConvex(p1, p2) {
    //TODO
    var axis = {x:1,y:0};
    var p2MaxValue = Number.NEGATIVE_INFINITY;
    var p2MinValue = Number.POSITIVE_INFINITY;
    var p1MaxValue = Number.NEGATIVE_INFINITY;
    var p1MinValue = Number.POSITIVE_INFINITY;
    var p2MaxPoint; //Max point for P2
    var p2MinPoint; //Min point for P2
    var p1MaxPoint; //Max point for p1
    var p1MinPoint; //Min point for p1

    //find min and max points in shape p2
    for(var i in p2)
    {
        var dotProduct = p2[i].x*axis.x + p2[i].y*axis.y;
        if(dotProduct > p2MaxValue)
        {
            p2MaxValue = dotProduct;
            p2MaxPoint = p2[i];
        }
        if(dotProduct < p2MinValue)
        {
           p2MinValue = dotProduct;
           p2MinPoint = p2[i];
        }
    }

    //find min and max points in shape p1
    for(var i in p1)
    {
        var dotProduct = p1[i].x*axis.x + p1[i].y*axis.y;
        if(dotProduct > p1MaxValue)
        {
            p1MaxValue = dotProduct;
            p1MaxPoint = p1[i];
        }
        if(dotProduct < p1MinValue)
        {
           p1MinValue = dotProduct;
           p1MinPoint = p1[i];
        }
    }

    //compare the min and max projection values
    if(p2MinValue < p1MaxValue || p2MaxValue < p1MinValue)
        return true
    return false;
}

1 ответ

Поскольку p2MinValue а также p1MinValue оба начинаются с отрицательной бесконечности, ни один из них никогда не примет никаких других значений. Нет, ось не может быть правильной.

Я нашел хорошую рецензию и реализовал ее в Академии Хана: https://www.khanacademy.org/computer-programming/polygon-collision-detector/6339295315755008

Другие вопросы по тегам