如何删除远离段的点?

我在这里阅读如何保持两点之间的点(即:它是一个段的一部分,有一些不精确): 如何判断一个点是否在某一行附近?

因此,我用Java实现了这个小算法,而我的代码是(注意变量的名称应该对你来说很清楚!:)):

List 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; 

确定你明白:

  1. returned是包含在段上或段附近的点的列表(以及确定点是否在段之外的“不精确”/最大距离是变量: maximal_allowed_distance

  2. points_to_test是我的图表中存在的所有点:我的段+段中真正的点+几乎在段上的点(<= maximal_allowed_distance )+远离段的点( > maximal_allowed_distance )。 我的小算法的想法是我删除所有后者。

  3. segment_[first|last]_point是两个段的末端

  4. cpoints_to_test的当前点,我想知道它是远离段还是(根据maximal_allowed_distance

  5. getNumber(0)返回点的X坐标, getNumber(1)返回Y值。

但是,它不起作用。 它不会返回优点(即:段中的点,考虑到maximal_allowed_distance )。

你知道我在这个问题的第一行误解了我给你的答案吗? 您是否在我自己的算法实现中看到任何错误?

注意,引用的方法确定距无限线的距离。 如果您只需要有限段附近的点,您可以修改它。

在任何情况下算法都应该找到远离线的点。 如果不这样做,请检查
a)是否找到要删除的点数
b)是否能够从returned列表中删除属于points_to_test列表的对象c

编辑
使用矢量算法找到点和线段之间的距离是相当有效的方法

 // Copyright 2001 softSurfer, 2012 Dan Sunday // This code may be freely used, distributed and modified for any purpose // providing that this copyright notice is included with it. // SoftSurfer makes no warranty for this code, and cannot be held // liable for any real or imagined damage resulting from its use. // Users of this code must verify correctness for their application. // Assume that classes are already given for the objects: // Point and Vector with // coordinates {float x, y, z;} (z=0 for 2D) // appropriate operators for: // Point = Point ± Vector // Vector = Point - Point // Vector = Scalar * Vector // Line with defining endpoints {Point P0, P1;} // Segment with defining endpoints {Point P0, P1;} //=================================================================== // dot product (3D) which allows vector operations in arguments #define dot(u,v) ((u).x * (v).x + (u).y * (v).y + (u).z * (v).z) #define norm(v) sqrt(dot(v,v)) // norm = length of vector #define d(u,v) norm(uv) // distance = norm of difference // dist_Point_to_Segment(): get the distance of a point to a segment // Input: a Point P and a Segment S (in any dimension) // Return: the shortest distance from P to S float dist_Point_to_Segment( Point P, Segment S) { Vector v = S.P1 - S.P0; Vector w = P - S.P0; double c1 = dot(w,v); if ( c1 <= 0 ) return d(P, S.P0); double c2 = dot(v,v); if ( c2 <= c1 ) return d(P, S.P1); double b = c1 / c2; Point Pb = S.P0 + b * v; return d(P, Pb); }