Учитывая начальную и конечную точку и расстояние, рассчитайте точку вдоль линии - PullRequest
16 голосов
/ 26 ноября 2009

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

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, но не понимаю его полностью, кто-нибудь может уточнить?

Ответы [ 2 ]

34 голосов
/ 26 ноября 2009

Я думаю, что это относится к 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 + distance).

*px = (int)((float)x1 + vx * (mag + distance));
*py = (int)((float)y1 + vy * (mag + distance));

Вместо этого вы можете опустить некоторые вычисления, умноженные на расстояние / mag.

1 голос
/ 10 апреля 2016

Эти уравнения неверны:

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 );

Tom

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