¿Cómo eliminar puntos que están lejos de un segmento?
Leí cómo mantener puntos que están entre dos puntos (es decir: que son parte de un segmento, con cierta imprecisión) aquí:¿Cómo puedo saber si un punto está cerca de cierta línea?
Por lo tanto, implementé este pequeño algoritmo en Java, y mi código es (¡tenga en cuenta que el nombre de las variables debe estar claro para usted! :)):
List<Cupple> returned = new ArrayList<>(points_to_test);
for(Cupple c : points_to_test) {
/*if(c == segment_first_point || c == segment_last_point) {
continue;
}*/
if(Math.abs(Math.abs(
(segment_last_point.getNumber(0) - segment_first_point.getNumber(0))
*
(segment_first_point.getNumber(1) - c.getNumber(1))
-
(segment_first_point.getNumber(0) - c.getNumber(0))
*
(segment_last_point.getNumber(1) - segment_first_point.getNumber(1))
)
/
Math.sqrt(
Math.pow((segment_last_point.getNumber(0) - segment_first_point.getNumber(0)), 2)
+
Math.pow((segment_last_point.getNumber(1) - segment_first_point.getNumber(1)), 2)
)
) > maximal_allowed_distance) {
returned.remove(c);
}
}
return returned;
Para estar seguro de que comprende:
returned
es la lista con puntos que están en el segmento, o cerca del segmento (y la "imprecisión" / distancia máxima que determina si un punto está fuera del segmento es la variable:maximal_allowed_distance
)
points_to_test
son TODOS los puntos que están presentes en mi gráfico: los dos de mi segmento + los puntos que realmente están en el segmento + los puntos que están casi en el segmento (<=maximal_allowed_distance
) + los puntos que están lejos del segmento (>maximal_allowed_distance
)La idea de mi pequeño algoritmo es que elimino todo lo último.
segment_[first|last]_point
son las extremidades de los dos segmentos
c
es el punto actual depoints_to_test
y quiero saber si está lejos del segmento o dentro (de acuerdo con elmaximal_allowed_distance
)
getNumber(0)
devuelve la coordenada X del punto,getNumber(1)
devuelve el Y.
Sin embargo, no funciona. No devuelve los puntos buenos (es decir: los puntos que están en el segmento, teniendo en cuentamaximal_allowed_distance
)
¿Sabes si entendí mal la respuesta que te di en la primera línea de esta pregunta? ¿Ves algún error en mi propia implementación de este algoritmo?