Найдите третью точку в строке, используя c ++ - PullRequest
1 голос
/ 08 июля 2011

Я работаю в приложении C ++.И это ново для меня.Здесь я пишу функцию, которая получает две координаты линии.Я должен обработать эти координаты и найти другую точку, которая находится на той же линии.Я получу A(x1,y1) and B(x2,y2) координаты.нужно найти C(x3,y3) координаты.Поэтому я вычисляю наклон данной линии.

Double slope = (x1-x2)/(y1-y2);

И я знаю расстояние 3-й точки от точки А.

Double dis = sqrt(pow(x2-x1) + pow(y2-y1)) * 1.35 ;

Я хочу найти новые координаты x3, y3, используя Slope и dis.

Может кто-нибудь помочь мне решить эту проблему, пожалуйста.

Для вычисления x3 я могу использовать математическую часть,

x3 = slope * y3 -------------------1

dis = sqrt(pow(x3-x1) + pow(y3-y1)) ------------2

Используя эти 2 уравнения, которые генерируются во время выполнения, я хочу вычислить x3 и y3.

Ответы [ 3 ]

6 голосов
/ 08 июля 2011

Слишком много математики.

x3 = (x1 - x2) * 1.35 + x2
y3 = (y1 - y2) * 1.35 + y2
5 голосов
/ 08 июля 2011

Если вы не работаете с графиком "1.5d" y=y(x), вы никогда не должны использовать формулы, основанные на y=m*x+q, потому что это не работает для вертикальных линий (и плохо работает для почти вертикальных линий).

В вашем случае наилучшим подходом является использование параметрического уравнения для линии

x = x1 + t * dx
y = y1 + t * dy

, где dx = x2 - x1 и dy = y2 - y1 пропорциональны компонентам вектора единицы направления, ориентированного от P1 к P2и используются вместо m и q для определения линии (избегая любых проблем с вертикальными или почти вертикальными линиями).

Если вам нужна точка на определенном расстоянии, вам просто нужно найтифактические компоненты вектора единицы с

double dx = x2 - x1;
double dy = y2 - y1;
double dist = sqrt(dx*dx + dy*dy);
dx /= dist;
dy /= dist;

, а затем координаты нужной вам точки равны

double x3 = x1 + prescribed_distance * dx;
double y3 = y1 + prescribed_distance * dy;

или вместо этого используется -prescribed_distance в зависимости от того, с какой стороны вы хотите точку: в направлении P2или от него?

Если, однако, предписанное расстояние пропорционально текущему расстоянию между двумя точками, нормализация не требуется, и результат можете проще:

double x3 = x1 + (x2 - x1) * k;
double y3 = y1 + (y2 - y1) * k;

, где k - это соотношение между предписанным расстоянием и расстоянием между двумя точками (опять же с положительным или отрицательным знаком в зависимости от того, какая сторона вас интересует).

Используя параметрические уравнения x=x(t), y=y(t) вместо явных уравнений y=y(x) в дополнение к отсутствию искусственных проблем сингулярности, которые зависят от системы координат, вы также получаете формулы, тривиальные для расширения в более высоких измерениях.Например, для 3D-линии вам просто нужно добавить z координату к вышеприведенным формулам таким же образом, как используются x и y ...

0 голосов
/ 08 июля 2011

Если вы подставите первое уравнение "y3 = slope * x3" во второе уравнение "dis = sqrt(pow(x3-x1) + pow(y3-y1))" и возьмете в квадрат обе стороны, вы получите квадратик, который можно решить с помощью квадратной формулы.

После подстановки вы получите:

dis^2 = (x3-x1)^2 + (slope*x3 - y1)^2

Квадрат с обеих сторон:

(slope^2+1)*x3^2 + (-2*slope*y1-2*x1) + 2*y1^2 = dis^2

Решите для x3, используя квадратную формулу:

x3 = (2*slope*y1+2*x1) +/- sqrt((2*slope*y1+2*x1)^b - 4*(slope^2+1)*(2*y1^2-dis^2))/(2*(slope^2+1))

Подставьте x3 в первое уравнение, чтобы получить y3:

y3 = slope * x3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...