Учитывая начальную и конечную точки, а также расстояние, вычислите точку вдоль линии
Вопрос
Ищете самый быстрый способ вычислить точку, лежащую на прямой заданное расстояние от конечной точки линии:
void calculate_line_point(int x1, int y1, int x2, int y2, int distance, int *px, int *py)
{
//calculate a point on the line x1-y1 to x2-y2 that is distance from x2-y2
*px = ???
*py = ???
}
Спасибо за ответы, нет, это не домашнее задание, просто немного взлома из моей обычной области знаний.
Это функция, предложенная ниже.Это и близко не похоже на работу.Если я вычисляю точки через каждые 5 градусов в верхней правой 90-градусной части окружность в качестве начальных точек и вызовите приведенную ниже функцию с центром окружности как x2, y2 с расстоянием 4 конечные точки абсолютно неверны.Они расположены ниже и правее центра, а их длина равна длине центральной точки.У кого-нибудь есть какие-нибудь предложения?
void calculate_line_point(int x1, int y1, int x2, int y2, int distance)
{
//calculate a point on the line x1-y1 to x2-y2 that is distance from x2-y2
double vx = x2 - x1; // x vector
double vy = y2 - y1; // y vector
double mag = sqrt(vx*vx + vy*vy); // length
vx /= mag;
vy /= mag;
// calculate the new vector, which is x2y2 + vxvy * (mag + distance).
px = (int) ( (double) x2 + vx * (mag + (double)distance) );
py = (int) ( (double) y2 + vy * (mag + (double)distance) );
}
Я нашел это решение по stackoverflow, но я не совсем понимаю его, кто-нибудь может уточнить?
Решение
Я думаю, это относится к MathOverflow, но я отвечу, поскольку это ваш первый пост.Сначала вы вычисляете вектор от x1y1 до x2y2:
float vx = x2 - x1;
float vy = y2 - y1;
Затем вычислите длину:
float mag = sqrt(vx*vx + vy*vy);
Нормализуйте вектор до единичной длины:
vx /= mag;
vy /= mag;
Наконец, вычислите новый вектор, который равен x2y2 + vxvy * (mag + расстояние).
*px = (int)((float)x1 + vx * (mag + distance));
*py = (int)((float)y1 + vy * (mag + distance));
Вместо этого вы можете опустить некоторые вычисления, умноженные на distance / mag.
Другие советы
Эти уравнения неверны:
px = (int) ( (double) x2 + vx * (mag + (double)distance) );
py = (int) ( (double) y2 + vy * (mag + (double)distance) );
Правильными уравнениями являются:
px = (int) ( (double) x2 + vx * (double)distance );
py = (int) ( (double) y2 + vy * (double)distance );
Том