Как рассчитать (x,y) для фиксированной длины дуги от точки на окружности

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

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

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

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

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

Я пытаюсь закодировать это на С++, но любые предложения или псевдокоды были бы замечательными.

РЕДАКТИРОВАТЬ: X - это длина дуги, а не прямая линия между P1 и P2.


person JConway    schedule 05.11.2010    source источник
comment
Как насчет некоторых примеров из следующих: codeproject.com/KB/recipes/Wykobi. aspx Они очень эффективны и несколько элегантны, ищите ближайшую точку на окружности из внешних точек и сегменты касательной к окружности.   -  person    schedule 06.11.2010


Ответы (3)


На окружности угол 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))
person Jesse Beder    schedule 05.11.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)
person Adam Rosenfield    schedule 05.11.2010

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

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

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

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

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

Должно быть легко понять оттуда.

person Edward Strange    schedule 06.11.2010