2017-04-04 59 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

是的,我的問題的確只是由於這樣一個事實,即在該段末端延伸的點被忽略(即:未被移除,因爲被認爲屬於該段)。 –