Distancia de un punto a una recta


Función para calcular la distancia (mínima) de un punto a una recta y el punto donde se produce.

Public Function Line_Distance(ByVal q As Point2D, ByVal p1 As Point2D, ByVal p2 As Point2D, ByRef s As Point2D) As Double

‘ Calcula la distancia de un punto (q) a una línea P que pasa por dos puntos (p1,p2).
‘ s es el punto de intersección de la recta P con la recta Q(q,s) perpendicular a P.
‘ La ecuación de una recta que pasa por dos puntos (p1,p2) puede escribirse
‘ de la forma y=u(x-p1.x)+p1.y (1), siendo u=(p2.y-p1.y)/(p2.x-p1.x) la pendiente.
‘ Para que la recta Q sea ortogonal a P la pendiente de Q debe ser v=-1/u,
‘ y la ecuación de la recta Q será: y=v(x-q.x)+q.y (2)
‘ Igualando (1)=(2), u(x-p1.x)+p1.y=v(x-q.x)+q.y, y despejando el valor de x
‘ obtendremos la abcisa del punto de intersección buscado s.X=x,
‘ x=(-v*q.x+q.y+u*p1.x-p1.y)/(u-v) y el valor de la ordenada y=s.y se obtiene
‘ sustituyendo en la ecuación (1) el valor de x.
‘ La distancia mínima será entonces math.sqrt((s.x-q.x)^2+(s.y-q.y)^2)
‘ – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – -
‘ Ejemplo de llamada a la función
‘ Declaración en el módulo
‘ Public Structure Point2D
‘    Public X As Double
‘    Public Y As Double
‘ End Structure
‘ Declaraciones en el procedimiento
‘ Dim q As Point2D
‘ Dim p1 As Point2D
‘ Dim p2 As Point2D
‘ Dim s As Point2D
‘ Dim d As Double
‘ Dim msg As String
‘ q.X = -13
‘ q.Y = -25
‘ p1.X = -50
‘ p1.Y = 10
‘ p2.X = 20
‘ p2.Y = 20
‘ s.X = 0
‘ s.Y = 0
‘ d = Line_Distance(q, p1, p2, s)
‘ msg=”d= ” & Format(d,”0.00000000000000″) & vbnewline & _
‘ “Pto intersección PQ (” & format(s.x,”0.000000″) & “, ” & _
‘ format(s.y,”0.000000″) & “)”
‘ MsgBox(msg, vbinformation, “Distancia de un punto a una recta”)
‘ – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – -
Dim u As Double, v As Double
If (p1.X = p2.X) Then
Return Math.Abs(p1.X – q.X)
ElseIf p1.Y = p2.Y Then
Return Math.Abs(p1.Y – q.Y)
Else
u = (p2.Y – p1.Y) / (p2.X – p1.X)
v = -1 / u
s.X = (-v * q.X + q.Y + u * p1.X – p1.Y) / (u – v)
s.Y = u * (s.X – p1.X) + p1.Y
Return Math.Sqrt((s.X – q.X) ^ 2 + (s.Y – q.Y) ^ 2)
End If

End Function

About these ads
Esta entrada fue publicada en visual basic y etiquetada , , , , . Guarda el enlace permanente.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s