Пересечение по кругу вектора, возникающего внутри круга - PullRequest
3 голосов
/ 11 октября 2009

У меня есть круг. Внутри круга есть точка. У меня есть вектор, возникающий в этой точке. Я хотел бы знать, в какой точке круга этот вектор пересекается. Вот рисунок:

http://n4te.com/temp/circle.png http://n4te.com/temp/circle.png

Красная точка - это точка, которую я пытаюсь определить.

Я знаю эти вещи: центр круга, начало вектора и направление вектора.

Я знаю, что это основные вещи, но у меня все еще проблемы. Большинство гуглингов приводят меня к столкновению линии с окружностью, которое связано, но не совсем так. Спасибо за любую помощь, вы можете предоставить!

Ответы [ 2 ]

11 голосов
/ 11 октября 2009

Элементарная векторная алгебра .

O — center of circle (vector)
r — its radius       (scalar)
A — origin of ray    (vector)
k — direction of ray (vector)

Решите (A + kt - O)² = r² для скаляра t, выберите положительный корень, и A + kt - ваша точка.

Дальнейшее объяснение:

. является точечным произведением , ² для вектора является точечным произведением вектора с самим собой. Развернуть LHS

(A + kt - O)² = (A - O)² + 2(k.(A - O))t + k²t².

Квадратиком является k²t² + 2(k.(A - O))t + (A - O)² - r² = 0. С точки зрения ваших переменных это становится (rayVX² + rayVY²)t² + 2(rayVX(rayX - circleX) + rayVY(rayY - circleY))t + (rayX - circleX)² + (rayY - circleY)² - r² = 0.

7 голосов
/ 12 октября 2009

Большое спасибо Антону Тихому за подробный ответ. Это был результирующий код Java:

float xDiff = rayX - circleX;
float yDiff = rayY - circleY;
float a = rayVX * rayVX + rayVY * rayVY;
float b = 2 * (rayVX * (rayX - circleX) + rayVY * (rayY - circleY));
float c = xDiff * xDiff + yDiff * yDiff - r * r;
float disc = b * b - 4 * a * c;
if (disc >= 0) {
    float t = (-b + (float)Math.sqrt(disc)) / (2 * a);
    float x = rayX + rayVX * t;
    float y = rayY + rayVY * t;
    // Do something with point.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...