Determinar si un punto pertenece a una recta
4 participantes
Página 1 de 1.
Determinar si un punto pertenece a una recta
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.
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 : 149
Fecha de inscripción : 17/03/2016
Edad : 42
Localización : Venezuela
Re: Determinar si un punto pertenece a una recta
Hay varias formas de hacerlo, pero quizás la más sencilla es con el GEOMCAL de Autocad.
Primero lo cargas:
Esto es algo que aprendí hace muuuucho tiempo del señor administrador de este foro, D. Gabriel.
Primero lo cargas:
- Código:
(if (= cal nil) (arxload "geomcal")) ; Carga el GEOMCAL
- 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.
Re: Determinar si un punto pertenece a una recta
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.
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 : 149
Fecha de inscripción : 17/03/2016
Edad : 42
Localización : Venezuela
Re: Determinar si un punto pertenece a una recta
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")
)
)
Re: Determinar si un punto pertenece a una recta
Hola robierzo, como estas.
Todo trabaja muy bien. Muy agradecido por tu ayuda.
Así lo deje.
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.
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.
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 : 149
Fecha de inscripción : 17/03/2016
Edad : 42
Localización : Venezuela
Re: Determinar si un punto pertenece a una recta
Prueba
Si quieres una lista con los pares de puntos
Pienso que también podrías utilizar la prueba de la suma de distancias para conocer si un punto esta alineado con otros dos
0.0001 sería una holgura, porque no me fío del cero absoluto que sería así
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
- Código:
(mapcar'(lambda (x y) (dist_pt_recta x y pt3)) lst (append(cdr lst)(list(car lst))) )
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 : 182
Fecha de inscripción : 17/03/2016
Re: Determinar si un punto pertenece a una recta
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.
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 : 149
Fecha de inscripción : 17/03/2016
Edad : 42
Localización : Venezuela
Re: Determinar si un punto pertenece a una recta
Otra posibilidad:
Un saludo.
- 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 : 28
Fecha de inscripción : 18/03/2016
Re: Determinar si un punto pertenece a una recta
Gracias kasperle.
Agregada a mis funciones tambien.
Un saludo.
Agregada a mis funciones tambien.
Un saludo.
carlosmgilp- Mensajes : 149
Fecha de inscripción : 17/03/2016
Edad : 42
Localización : Venezuela
Re: Determinar si un punto pertenece a una recta
Más depurada...
Un saludo.
- Código:
(defun pto_lin (a b)
(equal (distance (vlax-curve-getclosestpointto a b) b) 0.0 0.00000001)
)
Un saludo.
kasperle- Mensajes : 28
Fecha de inscripción : 18/03/2016
Re: Determinar si un punto pertenece a una recta
Gracias hermano.
carlosmgilp- Mensajes : 149
Fecha de inscripción : 17/03/2016
Edad : 42
Localización : Venezuela
Temas similares
» Z en punto de seleccion
» PROGRESIVA EN ETIQUETA DE PUNTO C3D
» PUNTO DE INSERCIÓN DE MLEADER
» Seleccionar objeto por medio de un punto
» Cambia el punto de inserción de un bloque ya insertado.
» PROGRESIVA EN ETIQUETA DE PUNTO C3D
» PUNTO DE INSERCIÓN DE MLEADER
» Seleccionar objeto por medio de un punto
» Cambia el punto de inserción de un bloque ya insertado.
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.
|
|