2017-04-04 58 views
0

我读了如何保持这两点之间的点(即:那是段的一部分,具有一定的不精确性)位置:How can I tell if a point is nearby a certain line?如何删除远离细分的点?

因此,我实现了这个小算法在Java中,我的代码是(注意,变量的名字应该很清楚你:))!

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; 

要确保你明白:

  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)中的分数。

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

回答

0

请注意,引用的方法确定距离无限远的距离。如果你只需要在有限的细分市场附近的点,你会修改它。

在任何情况下,算法应远离线找点。如果不这样做,检查
一)是否曾经发现点去除
b)是否能够去除对象c属于points_to_test列表,从returned列表

编辑
有相当有效的办法找点和线段using vector arithmetics

// 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(u-v)   // 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); 
} 
+0

问题势必之间的距离“注意,列举法确定从无限线的距离。如果你需要近有限段分而已,你会修改它。”事实上。您能否告诉我我应该如何删除这些点的方式? –

+0

你还没有回答 - 如果...> maximal_allowed_distance)'情况有火吗? – MBo

+0

是的,我的问题的确只是由于这样一个事实,即在该段末端延伸的点被忽略(即:未被移除,因为被认为属于该段)。 –