Нахождение количества пересечений по двум линиям - PullRequest
0 голосов
/ 10 мая 2011

Используя немного кода, подобного следующему:

    static bool Intersects(Vector2 a1, Vector2 a2, Vector2 b1, Vector2 b2, out Vector2 intersection)
    {
        intersection = Vector2.Zero;

        Vector2 b = a2 - a1;
        Vector2 d = b2 - b1;
        float bDotDPerp = b.X * d.Y - b.Y * d.X;


        if (bDotDPerp == 0)
            return false;

        Vector2 c = b1 - a1;
        float t = (c.X * d.Y - c.Y * d.X) / bDotDPerp;
        if (t < 0 || t > 1)
            return false;

        float u = (c.X * b.Y - c.Y * b.X) / bDotDPerp;
        if (u < 0 || u > 1)
            return false;

        intersection = a1 + t * b;

        return true;
    }

Я могу определить, где сталкиваются две строки.Однако координаты даны относительно окна, а не друг друга.Например, скажем, две линии перпендикулярны друг другу.Один из них перекрывает второй по одному пикселю при 0,0.Это будет означать, что для разрешения этого столкновения мне нужно будет вернуться на 1 пиксель назад.Однако, если бы я выполнил этот же тест, скажем, 400 400, он сказал бы, что он пересекается в 399, 399. Очевидно, мне не нужно разрешать коллизию 399, 399.используйте эту информацию, чтобы узнать, насколько много линии перекрываются, поэтому я могу переместить их обратно соответствующим образом.Что я должен сделать, чтобы сделать это?

1 Ответ

0 голосов
/ 10 мая 2011

Этот ответ был довольно очевиден, и я понял это.

Просто вычтите a1 и a2 из X и Y из outVect:

(outVect.X-a1.X), (outVect.Y-a1.Y)

Это отрицает его местоположение.

...