2011-10-12 13 views
18

Estoy tratando de encontrar una manera de extender un segmento de línea en una distancia específica. Por ejemplo, si tengo un segmento de línea que comienza en 10,10 que se extiende a 20,13 y quiero extender la longitud por 3, ¿cómo calculo el nuevo punto final? Puedo obtener la longitud por sqrt (a^2 + b^2) en este ejemplo 10.44, así que si quisiera saber el nuevo punto final de 10,10 con una longitud de 13.44, ¿cuál sería computacionalmente la manera más rápida? También sé la pendiente pero no sé si eso me ayuda en este caso.Extender un segmento de línea a una distancia específica

+1

Esto no es una cuestión de programación, sino matemática simple, que luego debe ampliar a su código. – Constantinius

+3

@Constantinius Todavía es una pregunta de algoritmo, solo una basada en matemáticas (que la ciencia de la computación es extremadamente pesada). – corsiKa

+0

@glowcoder: No estoy de acuerdo. Sin entender las matemáticas subyacentes, no hay duda de que fracasa con su tarea. Por otro lado, si está familiarizado con las matemáticas, es una tarea trivial traducirlo al código del programa. – Constantinius

Respuesta

35

Puede hacerlo buscando el vector unitario de su segmento de línea y escalarlo a la longitud deseada, y luego traducir el punto final de su segmento de línea con este vector. Suponga que los puntos finales de su segmento de línea son A y B y desea extenderse después del punto final B (y lenAB es la longitud del segmento de línea).

#include <math.h> // Needed for pow and sqrt. 
struct Point 
{ 
    double x; 
    double y; 
} 

... 

struct Point A, B, C; 
double lenAB; 

... 

lenAB = sqrt(pow(A.x - B.x, 2.0) + pow(A.y - B.y, 2.0)); 
C.x = B.x + (B.x - A.x)/lenAB * length; 
C.y = B.y + (B.y - A.y)/lenAB * length; 
+10

donde lenAB = sqrt ((A.x - B.x) ** 2 + (A.y - B.y) ** 2) –

+0

esta solución parece funcionar más rápido. Gracias por su ayuda – goodgulf

+2

en caso de que se pregunte de dónde viene esto, (Bx - Ax)/lenAB * longitud es lo mismo que cos (slope_alpha) * longitud ... ayudado para mí – fersarr

7

Si ya tiene la pendiente se puede calcular el nuevo punto:

x = old_x + length * cos(alpha); 
y = old_y + length * sin(alpha); 

no he hecho esto desde hace tiempo por lo que tomar con un grano de sal.

+4

donde alpha = atan2 (y-old_y, x-old_x) –

+0

Gracias por su ayuda, esta solución parece un poco más lenta que la solución más baja. Aprecio la ayuda, esto funcionó también. – goodgulf

3

Me tropecé con esto después de haber buscado esto por mí mismo, y para darle una solución out-of-the-box, se puede echar un vistazo al código dentro de una clase de vectores estándar (en cualquier idioma) y cereza elegir qué partes necesita, pero terminé usando una y el código se ve así:

vector.set(x,y); 
vector.normalize(); 
vector.multiply(10000);// scale it by the amount that you want 

¡Buena suerte!

+0

Creo que esta es la respuesta más elegante –

Cuestiones relacionadas