2016-08-30 6 views
1

exampleНайти центр окружности определяется 2 точками и их касательное пересечение

У меня есть декартовы координаты P, P0 и P1, как я могу найти C?

Обратите внимание, что C также является ортоцентром треугольника, который имеет P как вершину и P0 и P1 как высоты.

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

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

+0

Я не прошу для кода, я прошу для решения этой математической задачи. Вопрос указывает, что математические ответы в порядке, я просто отметил это как Javascript, потому что это то, что я использую. Я также отметил его как векторную графику, так как это предмет вопроса. –

+0

Пожалуйста, задайте этот вопрос на math.stackexchange.com. Этот сайт здесь не предназначен для объяснения алгебры, а для ответа на вопросы о программировании. –

+0

Возможно, вы в этом поправитесь, мои извинения. Проблема в том, что ответ MBo (который я сейчас проверяю). Первый метод, безусловно, правильный, но попытка решения для решения оказывается невероятно дорогостоящей процессорной. В настоящее время я проверяю второй метод, который оказывается очень эффективным. На первый взгляд первый выглядел более многообещающим и элегантным. Так что да, это как бы между двумя сайтами. Опять же, мои извинения за то, что спросили об этом здесь. –

ответ

1

Метод 1:
векторы CP0 и PP0 перпендикулярны, и CP1 и PP1 перпендикулярны, так что мы можем написать систему двух уравнений для точечных продуктов этих векторных пар и найти два неизвестных CX и CY (координаты центра)

CP0 = (CX - P0.X, CY - P0.Y) 
CP1 = (CX - P1.X, CY - P1.Y) 
PP0 = (P.X - P0.X, P.Y - P0.Y) 
PP1 = (P.X - P1.X, P.Y - P1.Y) 

Dot(CP0, PP0) = 0 
Dot(CP1, PP1) = 0 

(CX - P0.X) * (P.X - P0.X) + (CY - P0.Y) * (P.Y - P0.Y) = 0 
(CX - P1.X) * (P.X - P1.X) + (CY - P1.Y) * (P.Y - P1.Y) = 0 

Способ 2:
средней точке М между P0 и P1 имеет координаты

M.X = (P0.X + P1.X)/2   ///1 
    M.Y = (P0.Y + P1.X)/2   ///2 
    Distance P-M is DM 
    DM_Squared = (P.X-M.X)^2 + (P.Y-M.Y)^2  ///3 
    L, D distances are from your notation 
    L_Squared = (P.X-P0.X)^2 + (P.Y-P0.Y)^2  ///4 

Тета является углом P0PC

Cos(Theta) = Length(P - M)/Length(P - P0) = DM/L 
D = Length(C - P) = L/Cos(Theta) = L * L/DM 
and finally 
C = P - L^2 * (P0 - M)/DM^2 

Coeff = L_Squared/DM_Squared   ///5 
C.X = P.X - Coeff * (P.X - M.X)   ///6 
C.Y = P.Y - Coeff * (P.Y - M.Y)   ///7 

Формула 1..7 готовы к использованию

+0

Спасибо за расширение ответа, я уже проверял его на правильность. Я приму это через минуту, как только подтвержу это :) –

+0

Исправлены исправления исправлений во втором методе caclulations – MBo