Dado un punto inicial y final, y una distancia, calcule un punto a lo largo de una línea

StackOverflow https://stackoverflow.com/questions/1800138

Pregunta

Buscando la forma más rápida de calcular un punto que se encuentra en una línea una distancia dada desde el punto final de la línea:

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 = ???
}  

Gracias por las respuestas, no, esto no es tarea, solo un poco de pirateo Mi área normal de experiencia.

Esta es la función que se sugiere a continuación. No está cerca de trabajar. Si yo calcule puntos cada 5 grados en la parte superior derecha de 90 grados de Un círculo como puntos de inicio y llamar a la función de abajo con el centro del círculo como x2, y2 con una distancia de 4, los puntos finales son totalmente incorrectos. Se encuentran debajo ya la derecha del centro y la longitud es tan larga como el punto central. ¿Alguien tiene alguna sugerencia?

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

}

He encontrado esta solución en stackoverflow pero no lo entiendo completamente, ¿alguien puede aclarar?

¿Fue útil?

Solución

Creo que esto pertenece a MathOverflow, pero responderé ya que esta es tu primera publicación. Primero debes calcular el vector de x1y1 a x2y2:

float vx = x2 - x1;
float vy = y2 - y1;

Luego calcula la longitud:

float mag = sqrt(vx*vx + vy*vy);

Normaliza el vector a la longitud de la unidad:

vx /= mag;
vy /= mag;

Finalmente, calcula el nuevo vector, que es x2y2 + vxvy * (mag + distance).

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

Puede omitir algunos de los cálculos multiplicando con distance / mag en su lugar.

Otros consejos

Estas ecuaciones son incorrectas:

px = (int) ( (double) x2 + vx * (mag + (double)distance) );

py = (int) ( (double) y2 + vy * (mag + (double)distance) );

Las ecuaciones correctas son:

px = (int) ( (double) x2 + vx * (double)distance );

py = (int) ( (double) y2 + vy * (double)distance );

Tom

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top