2009-12-17 15 views
10

Conozco los puntos finales de un segmento de línea y la distancia/tamaño de los extremos perpendiculares que me gustaría crear, pero necesito calcular los puntos finales de la línea perpendicular. He estado golpeando mi cabeza contra la pared usando triángulos de 45-45-90 y productos de puntos, pero parece que no puedo hacer que todo se una.¿Cómo se calculan los puntos finales de los segmentos de línea perpendiculares?

Conozco los puntos en azul y la distancia a los puntos en rojo, necesito encontrar los puntos en rojo.

Antes de marcar como duplicado, probé la respuesta publicada en this question pero resultó en tapas finales que siempre eran verticales.

http://rauros.net/files/caps.png http://rauros.net/files/caps.png

+0

Dependería del punto en la línea conocida en la que desea que la línea perpendicular lo encuentre también. Su diagrama de ejemplo parece mostrar que están en el punto medio de las líneas conocidas. – ZombieSheep

+0

sí, se cruzan en el punto medio de la línea roja – basszero

+0

Relacionado: [calcule un desplazamiento perpendicular desde una línea diagonal] (http://stackoverflow.com/q/17195055/183120). – legends2k

Respuesta

16

Si B1 es el punto azul entre los 2 puntos rojos, y B2 es el otro punto azul y luego la manera de hacer esto es:

  • Búsqueda B1 - B2
  • Normalizar este vector
  • Entonces escalar este vector por medio de la distancia entre los puntos rojos
  • Rotar 90 grados
  • Añadir este vector a B1 (esto es R1)
  • Su btract este vector de B1 (Esto es R2)

Todo lo anterior es bastante sencillo: ¡el truco más difícil sería encontrar la forma de escribirlo en el texto!

Esto podría ser útil, aunque - matriz para rotar 90 grados:

[ 0 -1 ] 
[ 1 0 ] 
+0

La explicación del vector llano en inglés es exactamente lo que necesitaba junta las piezas en mi cabeza. ¡Gracias! Es una pena que no hayas recibido muchos votos favorables – basszero

3

Usted sabe que la pendiente de la línea azul, vamos a llamarlo m. Y una línea perpendicular a la línea azul tendrá pendiente -1/m.

para encontrar la coordenada x necesita algo de trigonometría, sine \theta = d/delta_x, donde \ theta es el ángulo de la línea azul para el eje xyd es la distancia a uno de los puntos rojos del punto azul. Luego sume/reste delta_x a la coordenada x del punto azul donde desea que la línea sea perpendicular. Ahora puede usar la fórmula de punto y pendiente para descubrir la coordenada y.

+0

Pero necesita resolver un sistema de ecuaciones que involucran distancia para convertir la forma de pendiente de punto en un segmento de línea. Esperaba una solución de sistema resuelto – basszero

+0

Sí, me perdí un paso, primero debe encontrar la coordenada x de la fórmula de punto y pendiente, donde entra el trigonometría. – nlucaroni

8

La forma fácil de solucionar este no es pensar en términos de pendiente m, sino más bien el cambio en x e y, que Llamo dx, dy (de la notación de cálculo). La razón es por una razón, que lidiar con una pendiente para una línea vertical es infinito, y en cualquier caso, no necesita usar funciones trigonométricas, este código será más rápido y simple.

dx = x2 - x1; 
dy = y2 - y1; 

Supongo que el punto 2 es la intersección de la línea deseada.

Ok, entonces la línea perpendicular tiene una pendiente con el recíproco negativo de la primera. Hay dos maneras de hacerlo:

dx2 = -dy 
dy2 = dx 

o

dx2 = dy 
dy2 = -dx 

esto corresponde a las dos direcciones, uno girando a la derecha, y el otro dejado.

Sin embargo, dx y dy se escalan a la longitud del segmento de línea original. Tu perpendicular tiene una longitud diferente.

Aquí es la longitud entre dos puntos:

double length(double x1, double y1, double x2, double y2) { 
return sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)); 
} 

hacer lo que quiera, ir a uno u otro lado, es:

double scale = length(whatever length you want to go)/sqrt(dx*dx+dy*dy); 
double dx2 = -dy * scale; 
double dy2 = dx * scale 

y luego lo mismo para el otro lado . Me acabo de dar cuenta de que mi ejemplo es algo C++, ya que utilicé sqrt, pero las diferencias son triviales. Tenga en cuenta que puede escribir el código de manera más eficiente, combinando las raíces cuadradas.

Cuestiones relacionadas