Найти ребро, которое прямоугольник касается другого прямоугольника - PullRequest
0 голосов
/ 09 октября 2010

с заданным краевым перечислением, например:

none, top, left, bottom, right,

Учитывая 2 прямоугольника, как я могу найти, какой край прямоугольника A пересекает этот прямоугольник B? Мне не нужно знать, какой край B касается края A, мне просто нужно знать, какой край A ударяет этот B.

Я нашел этот алгоритм, но он не возвращает конкретное ребро:

bool edgeIntersection( vector2f a, vector2f b, DOUBLEPOINT c, DOUBLEPOINT d )
{
    //one edge is a-b, the other is c-d
    vector2f bminusa;
    vector2f cminusa;
    vector2f cminusd;

    bminusa.x = b.x - a.x;
    bminusa.y = b.y - a.y;

    cminusa.x = c.point[0] - a.x;
    cminusa.y = c.point[1] - a.y;

    cminusd.x = c.point[0] - d.point[0];
    cminusd.y = c.point[1] - d.point[1];

    double det=determinant(bminusa,cminusd);
    double t=determinant(cminusa,cminusd)/det;
    double u=determinant(bminusa,cminusa)/det;
    if ((t<0)||(u<0)||(t>1)||(u>1))return false;
    return true;
}

Мой вышеупомянутый алгоритм проверяет каждое ребро по очереди, учитывая TopLeftA TopLeftB BottomRightA BottomRightB, как создать функцию, которую нужно вызывать только один раз?

Спасибо

1 Ответ

1 голос
/ 09 октября 2010

Если вы использовали edgeIntersection, чтобы определить, что произошло пересечение, то:

if (b.x < a.x) return left;
if (b.y < a.y) return top;
if (b.x+b.width > a.x+a.width) return right;
return bottom;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...