Как рассчитать (x, y) для фиксированной длины дуги от точки на окружности - PullRequest
9 голосов
/ 06 ноября 2010

Я потратил так много часов на это, что чувствую, как моё здравомыслие медленно ослабевает. Так что любая помощь будет действительно цениться. Я постараюсь быть кратким, насколько это возможно.

У меня есть круг на 2D плоскости. Я знаю декартовы координаты для его центральной точки (C) и радиуса (R).

Моя путаница проистекает из этой проблемы. Когда предоставляется точка на плоскости за пределами круга; Я могу рассчитать точку (P) на окружности круга, ближайшую к этой точке.

Что я хочу сделать, так это определить координаты (x, y) 2 точек на окружности. Давайте назовем их P1 и P2. P1 и P2 - два конца дуги. Дуга имеет фиксированную длину (X). P - средняя точка между P1 и P2. Таким образом, длина дуги от P до P1 и от P до P2 равны X / 2.

Короче говоря: дано C, R, P, X; Мне нужно рассчитать P1 и P2.

Я пытаюсь закодировать это на c ++, но любые предложения или псевдокод будут хороши.

EDIT: X - длина дуги, а не прямая линия между P1 и P2

Ответы [ 3 ]

4 голосов
/ 06 ноября 2010

На окружности угол theta соответствует длине дуги theta * R, что означает, что ваша дуга будет составлять угол theta = X / R.Так что, если начать с вашей точки

P = C + R * (sin(u), cos(u))

, просто поднимитесь / уменьшитесь на theta/2:

P1 = C + R * (sin(u + theta/2), cos(u + theta/2))

и

P2 = C + R * (sin(u - theta/2), cos(u - theta/2))
3 голосов
/ 06 ноября 2010

Дуга, составляющая угол θ (в радианах), имеет длину дуги θR.Итак, вы хотите, чтобы половинный угол θ = X / (2R).Затем вам нужно взять вектор (P-C), повернуть его на углы ± θ и добавить обратно в C, чтобы получить P1 и P2.Чтобы повернуть вектор на угол, умножьте его на матрицу вращения .

Итак, в псевдокоде это будет выглядеть так:

θ = X/(2R)
A = 2x2 rotation matrix corresponding to a rotation by θ radians
A' = transpose of A
P1 = C + A * (P - C)
P2 = C - A' * (P - C)
0 голосов
/ 06 ноября 2010

Есть несколько вещей, которые могут помочь.Не буду писать код, но я думаю, что решение будет основано на треугольниках.Рассмотрим:

Любой радиус такой же длины.

Таким образом, треугольник, нарисованный из P1-P1-C, является равнобедренным.

Любая касательная перпендикулярна радиусу.

Мне было бы трудно доказать это прямо здесь и сейчас, но если вы продолжите линии от C до P1 / P2, чтобы касательная, которая пересекает окружность в C-> P, также образовала равнобедренную клетку.

Оттуда должно быть легко разобраться.

...