2009-11-25 26 views
15

Buscando la manera más rápida para calcular un punto que se encuentra en una línea una distancia dada de distancia desde el punto final de la línea:dado un punto de inicio y final, y una distancia, calcular un punto a lo largo de una 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 algunos hackeos de mi área normal de especialización.

Esta es la función que se sugiere a continuación. No está cerca de funcionar. Si yo calculo puntos cada 5 grados en la parte superior derecha de 90 grados de un círculo como puntos de inicio y llamo a la función siguiente con el centro del círculo como x2, y2 con una distancia de 4 los puntos finales son totalmente incorrectos. Se encuentran debajo y a 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)); 

}

que he encontrado this solución en stackoverflow, pero no lo entiendo por completo, ¿alguien puede aclarar?

+4

Tal vez deberías usar flotadores/dobles, porque recibirá roundi ng errores. Esto podría ser una preocupación. – Lucas

+1

Lo que Lucas dijo. Además, probablemente leas mi publicación mientras tengo un error tipográfico. Si x1y1 es el origen, quieres x1y1 + vxvy * (mag + distancia), no x2y2. Es decir, comenzando desde el origen, desea recorrer la distancia _a x2y2_ más la distancia adicional, usando la dirección de x1y1 a x2y2. Aunque creo que es posible que desee reformular su pregunta. ¿Qué es exactamente lo que quiere hacer? La pregunta tal como está ahora parece más un problema intermedio. –

+0

[Geometría: ¡Encontrar un punto a lo largo de una línea a cierta distancia de otro punto!] (Http://math.stackexchange.com/questions/175896/finding-a-point-along-a-line-a-certain- distancia-lejos-de-otro-punto/1630886 # 1630886) –

Respuesta

33

Creo que esto pertenece a MathOverflow, pero responderé ya que esta es su primera publicación. En primer lugar, calcular el vector de X1Y1 a x2y2:

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

luego calcular la longitud:

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

Normalizar el vector de unidad de longitud:

vx /= mag; 
vy /= mag; 

Finalmente calcular el nuevo vector, que es x2y2 + vxvy * (mag + distancia).

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

En su lugar, puede omitir algunos de los cálculos que se multiplican por la distancia/mag.

+16

desafortunadamente, Mathoverflow es demasiado esnob para entretener a este tipo de pregunta; pertenece aquí. –

+0

Eso es desafortunado. –

+1

Disculpa si es demasiado simple chicos, totalmente fuera de mi área normal de competencia. Gracias por la ayuda. – amanda

1

Estas ecuaciones están equivocados:

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

Cuestiones relacionadas