Determinar si un punto pertenece a una recta

Ir abajo

Determinar si un punto pertenece a una recta

Mensaje por carlosmgilp el Jue Mayo 10, 2018 4:55 pm

Hola muchachos, como están.
Alguien tendrá una función para determinar si un punto esta en una recta.
Lo que quiero es seleccionar una linea y luego especificar un punto, y que la función devuelva T si el punto esta es esa linea.
Entiendo que seleccionaría la linea y extraería el punto inicial y el punto final, ya tendría esos valores y los valores del tercer punto que lo selecciono en pantalla.
Pero no me se una formula para saber si ese tercer punto se encuentra entre los dos puntos de la linea.
De antemano muchas gracias.

carlosmgilp

Mensajes : 132
Fecha de inscripción : 17/03/2016
Edad : 36
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Determinar si un punto pertenece a una recta

Mensaje por robierzo el Jue Mayo 10, 2018 6:36 pm

Hay varias formas de hacerlo, pero quizás la más sencilla es con el GEOMCAL de Autocad.
Primero lo cargas:
Código:
(if (= cal nil) (arxload "geomcal")) ; Carga el GEOMCAL
Y luego utilizas la opción "dpl":
Código:
(SETQ dist_pt_recta (C:CAL "dpl(P3,P1,P2)")); donde P1 Y P2 son dos puntos de la recta y P3 es un punto cualquiera

Esto es algo que aprendí hace muuuucho tiempo del señor administrador de este foro, D. Gabriel.
avatar
robierzo

Mensajes : 53
Fecha de inscripción : 17/03/2016
Localización : La Coruña

Ver perfil de usuario http://www.selmotopografia.es

Volver arriba Ir abajo

Re: Determinar si un punto pertenece a una recta

Mensaje por carlosmgilp el Jue Mayo 10, 2018 7:33 pm

Hola hermano, como estás.
Ha la probé y no me funciona, porque asume que la línea es infinita y yo necesito saber si ese tercer punto, se encuentra entre los dos puntos de la recta.
Gracias.

carlosmgilp

Mensajes : 132
Fecha de inscripción : 17/03/2016
Edad : 36
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Determinar si un punto pertenece a una recta

Mensaje por robierzo el Jue Mayo 10, 2018 8:05 pm

En ese caso, una vez que sabes si pertenece o no a la recta, sólo tienes que comprobar que la distancia P1-P3 y P2-P3 son menores que la distancia P1-P2. Si son menores o iguales, está en la recta, si son mayores, está fuera.

Código:
(cond ((and (= dist_pt_recta 0.0)
    (<= (distance P1 P3) (distance P1 P2))
    (<= (distance P2 P3) (distance P1 P2))
       )
       (alert "El Punto pertenece a la recta")
)
)
avatar
robierzo

Mensajes : 53
Fecha de inscripción : 17/03/2016
Localización : La Coruña

Ver perfil de usuario http://www.selmotopografia.es

Volver arriba Ir abajo

Re: Determinar si un punto pertenece a una recta

Mensaje por carlosmgilp el Vie Mayo 11, 2018 4:12 pm

Hola robierzo, como estas.
Todo trabaja muy bien. Muy agradecido por tu ayuda.
Así lo deje.

Código:
(setq p1 (getpoint))
(setq p2 (getpoint))
(setq p3 (getpoint))

(pt_recta p1 p2 p3)

(defun pt_recta    (p1 p2 p3 / dist_pt_recta)
  (if (= cal nil)
    (arxload "geomcal"))
  (setq dist_pt_recta (c:cal "dpl(P3,P1,P2)"))
  (if (and (= dist_pt_recta 0.0)
     (<= (distance p1 p3) (distance p1 p2))
     (<= (distance p2 p3) (distance p1 p2)))
    t
    nil))

Ahora quería consultarte para hacer una comparación pero en toda una lista de puntos.
Porque las cosas surgen después de que uno va haciendo las pruebas.

Ahora quiero hacer esa comparación, pero con una lista de puntos.
Por ejemplo:
Tengo una lista de puntos '(p1 p2 p3 p4 pn) y el punto que es el que necesito comparar si esta en la recta o no (ptr)
Pero la comparación seria que compruebe si ptr esta entre p1 p2, si no esta, siga comprobando los demás p2 p3, si no p3 p4, si no p4 pn
Y así sucesivamente hasta que finalice la lista de puntos.

Aquí coloco unas variables por si puedes verlo o no se si tendría que abrir otro post, bueno tu me comentas.

Código:
(setq ptr '(40.1531 -0.0770504 0.750286))

(setq lst '((39.9426 -0.237852 0.737583)
            (39.9892 0.0278258 0.675765)
            (40.0146 0.295616 0.607395)
            (40.123 -0.24705 0.78794)
            (40.1685 0.00945168 0.731126)
            (40.1963 0.268271 0.669536)
            (40.3096 -0.257485 0.840029)
            (40.3539 -0.0104983 0.788255)
            (40.3843 0.239006 0.733402)))

Estaba intentando con un lambda pero no supe como aplicarlo.

(apply '(lambda (x y) (dist_pt_recta x y pt3)) lst )

Bueno cualquier cosa me dice.
Nuevamente muchas gracias por la solución anterior.

Saludos.

carlosmgilp

Mensajes : 132
Fecha de inscripción : 17/03/2016
Edad : 36
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Determinar si un punto pertenece a una recta

Mensaje por nolo el Sáb Mayo 12, 2018 9:25 am

Prueba
Código:
(mapcar'(lambda (x y) (dist_pt_recta x y pt3)) lst (append(cdr  lst)(list(car lst))) )
Te devolverá una lista con los resultados nil y t.
Si quieres una lista con los pares de puntos
Código:

(vl-remove nil
(mapcar '(lambda (x y) (if (dist_pt_recta x y pt3)(list x y))) lst (append(cdr  lst)(list(car lst))) )
)

Pienso que también podrías utilizar la prueba de la suma de distancias para conocer si un punto esta alineado con otros dos
Código:
(defun esta (pt p1 p2 / s)
(if (<= (setq s (abs(-(distance p1 p2)(+(distance p1 pt)(distance p2 pt)))))  0.0001)
(list p1 p2)
))

Código:
(vl-remove nil
(mapcar '(lambda (x y) (esta ptr x y )) lst (append(cdr  lst)(list(car lst))) )
)

0.0001 sería una holgura, porque no me fío del cero absoluto que sería así
Código:
(defun esta (pt p1 p2)
(zerop (-(distance p1 p2)(+(distance p1 pt)(distance p2 pt))))
)

En tu ejemplo, el punto no esta cercano a una línea que una dos puntos consecutivos de  la lista aunque casi a toca a alguna unión aleatoria de dos puntos de la lista

Un saludo

Editado para corregir y añadir la defun esta

nolo

Mensajes : 167
Fecha de inscripción : 17/03/2016

Ver perfil de usuario

Volver arriba Ir abajo

Re: Determinar si un punto pertenece a una recta

Mensaje por carlosmgilp el Lun Mayo 14, 2018 5:24 pm

Hola nolo como has estado.
Gracias por tu ayuda tambien.

La funcion esta con holgura me funciono muy bien, de por si fue la unica, las demas siempre me dieron de resultado nil y no se por que.

Mil gracias.

carlosmgilp

Mensajes : 132
Fecha de inscripción : 17/03/2016
Edad : 36
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Determinar si un punto pertenece a una recta

Mensaje por kasperle el Miér Mayo 16, 2018 1:20 pm

Otra posibilidad:

Código:

(defun pto_lin (a b)
  ;; a: línea como "ename"
  ;; b: punto como lo devuelve "getpoint" o una lista de coordenadas
  ;; la precisión "0.00000001" se puede aumentar o disminuir a gusto...
  (if (equal (distance (vlax-curve-getclosestpointto (vlax-ename->vla-object a) b) b) 0. 0.00000001) T nil)
  )

Un saludo.

kasperle

Mensajes : 15
Fecha de inscripción : 18/03/2016

Ver perfil de usuario

Volver arriba Ir abajo

Re: Determinar si un punto pertenece a una recta

Mensaje por carlosmgilp el Miér Mayo 16, 2018 3:06 pm

Gracias kasperle.
Agregada a mis funciones tambien.
Un saludo.

carlosmgilp

Mensajes : 132
Fecha de inscripción : 17/03/2016
Edad : 36
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Determinar si un punto pertenece a una recta

Mensaje por kasperle el Jue Mayo 17, 2018 9:10 am

Más depurada...
Código:

(defun pto_lin (a b)
  (equal (distance (vlax-curve-getclosestpointto a b) b) 0.0 0.00000001)
  )

Un saludo.

kasperle

Mensajes : 15
Fecha de inscripción : 18/03/2016

Ver perfil de usuario

Volver arriba Ir abajo

Re: Determinar si un punto pertenece a una recta

Mensaje por carlosmgilp el Jue Mayo 17, 2018 5:14 pm

Gracias hermano.

carlosmgilp

Mensajes : 132
Fecha de inscripción : 17/03/2016
Edad : 36
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Determinar si un punto pertenece a una recta

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.