2011-07-08 18 views
5

Esta es geometría gráfica básica y/o trigonométrica, y me siento tonto por preguntar, pero no puedo recordar cómo va esto. Entonces:Encuentra una línea que se intersecta con una línea conocida en ángulo recto, dado un punto

  1. Tengo una línea definida por dos puntos (x1, y1) y (x2, y2).
  2. Tengo un tercer punto (xp, yp) que se encuentra en otro lugar.

Quiero calcular el punto (x 'y') que se encuentra en algún lugar a lo largo de la línea en el # 1, de tal manera que, cuando se unen con el punto desde el # 2, crea una nueva línea perpendicular a la primera línea . enter image description here

Gracias.

Respuesta

5

puede encontrar ese punto considerando en primer lugar un punto genérico (x, y) largo de la línea de (x1, y1) a (x2, y2):

x = x1 + t*(x2 - x1) 
y = y1 + t*(y2 - y1) 

y la computación en la (al cuadrado) distancia desde este punto de (xp, yp)

E = (x - xp)**2 + (y - yp)**2 

que sustituyendo la definición de x y y da

E = (x1 + t*(x2 - x1) - xp)**2 + 
    (y1 + t*(y2 - y1) - yp)**2 

a continuación para encontrar el mínimo de esta distancia que varía t derivamos E con respecto a t

dE/dt = 2*(x1 + t*(x2 - x1) - xp)*(x2 - x1) + 
     2*(y1 + t*(y2 - y1) - yp)*(y2 - y1) 

que después de algún cálculo da

dE/dt = 2*((x1 - xp)*(x2 - x1) + (y1 - yp)*(y2 - y1) + 
      t*((x2 - x1)**2 + (y1 - y2)**2)) 

buscando cuando este derivado es cero obtenemos una ecuación explícita para t

t = ((xp - x1)*(x2 - x1) + (yp - y1)*(y2 - y1))/
    ((x2 - x1)**2 + (y2 - y1)**2) 

por lo que el punto final se puede calcular utilizando ese valor para t en la definición de (x, y).

Utilizando la notación vectorial esto es exactamente la misma fórmula sugerida por Gareth ...

t = <p - p1, p2 - p1>/<p2 - p1, p2 - p1> 

donde la notación <a, b> representa la operación de producto escalar ax*bx + ay*by.

Tenga en cuenta también que la misma fórmula funciona en un espacio n-dimensional.

+0

Gracias por esto. Te doy la respuesta aceptada ya que la tuya es la única que toma lo que sé (códigos cartesianos) y me da una fórmula real para conectarlos. (Me gusta la idea vectorial, pero eso genera más preguntas que respuestas dada mi memoria de geometría.) –

+0

Es un esfuerzo heroico de @ 6502, pero esta respuesta muestra por qué tengo mi regla sobre los vectores. –

+0

@gareth: Cuando me enfrento a un problema geométrico, siempre pienso en los vectores (es por eso que elevé tu respuesta), pero sé que la mayoría de los programadores no se sienten cómodos con ellos. – 6502

0

Puede resolver la pendiente de la línea que conecta (x1, y1) y (x2, y2). Entonces sabes que la línea perpendicular tiene una pendiente inversa negativa de eso.

Para encontrar la intersección en y, use la pendiente para ver cuánto viaja la línea en y de x=0 a x1.

b + (x1 - x0) * m = y1 
b + (x1 - 0) * m = y1 
b + (x1 * m)  = y1 
b = y1 - x1 * m 

entonces se puede obtener las fórmulas de la línea entre los dos puntos y la línea de (xp, yp) con la pendiente arriba. Para una x dada, tienen igual a y, por lo que puede resolver por esa x, luego, conéctela a la fórmula de y.

m = slope_from_1_to_2 = (y2 - y1)/(x2 - x1) 
n = slopePerpendicular = (-1)/m 

b = intercept_for_1_to_2 = y1 - x1 * m 
c = intercept_for_p  = yp - xp * n 

Así, las ecuaciones para las líneas son de la forma y = mx + b

Los puntos 1 y 2:

y(x) = mx + b

punto P:

y(x) = nx + c

puesto su y 's igual a encontrar x'

mx' + b = nx' + c 
(m-n)x' = c - b 
    x' = (c - b)/(m - n) 

Y el uso de cualquiera de las fórmulas para calcular y'

tanto

y' = mx' + b

+0

Gracias. En la ecuación 'y (x) = mx + y2' - ¿por qué usas' y2' para sustituir a 'b'? –

+0

Buen punto, 'b' debe ser la intersección en y, donde la línea toca el eje y. 'y2' no es necesariamente así, déjame revisar mis cálculos. –

+1

Usar la fórmula 'y = m * x + q' para un verdadero problema bidimensional significa buscar problemas. No puede manejar líneas verticales con este tipo de enfoque; mejor usar ecuaciones paramétricas 'x = x (t), y = y (t)' en su lugar. – 6502

1

La línea de respuesta es:

y=ax+b 
where a=(x1-x2)/(y2-y1) 
     b=yp-(x1-x2)*xp/(y2-y1) 

Cómo la resultado fue obtenido:

1) slope for the original line: (y2-y1)/(x2-x1) 

2) slope for the answer: -1/((y2-y1)/(x2-x1)) = (x1-x2)/(y2-y1) 

3) Plug this into (xp,yp) we can have the result line. 

Simplemente calcule la respuesta de las líneas después de esto (esto es demasiado largo ... Tengo hambre).

+0

Esto no funciona para 'y1 = y2' (división por cero). En realidad, uno no debería usar fórmulas basadas en "pendiente" cuando se trata de verdaderos problemas bidimensionales. La fórmula 'y = mx + q' solo funciona bien cuando se trata de problemas de 1.5 dimensiones (es decir, con gráficos' y = y (x) '). – 6502

+0

@ 6502 Hmm. Gracias por salvarme los errores en el futuro porque no es probable que lo olvide otra vez. –

5

Una regla empírica útil en este tipo de geometría computacional es que debe trabajar con vectores todo lo que pueda, cambiando a coordenadas cartesianas solo como último recurso. Así que vamos a resolver esto usando álgebra vectorial.Suponga que su línea va desde p a p + r, y el otro punto es q.

Ahora, cualquier punto de la línea, incluyendo el punto que está tratando de encontrar (lo llaman s), se puede expresar como s = p + λ r para un λ parámetro escalar.

Ahora el vector de q a s debe ser perpendicular a r. Por lo tanto

(q - (p + λ r)) · r = 0

dónde: · es la dot product operator. Expandir el producto:

(q - p) · r = λ (r · r)

y dividir:

λ = (q - p) · r/r · r

Al llegar a ponerlo en práctica, es necesario comprobar si r · r = 0, para evitar la división por cero.

+0

Gracias por el pensamiento esclarecedor en vectores. –

Cuestiones relacionadas