2015-09-23 50 views
1

我正在製作帶有陰影的2D遊戲,並且爲了從燈光投射陰影我繪製可見性多邊形。在我繪製它之前,我喜歡光線的交點,然後對這些點進行排序。我用這個算法Sort points in clockwise order?排列圍繞中心拋球的2D點比較例外

的問題是,我得到這個例外,在遊戲的一些點:

Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract! 

我不知道爲什麼會這樣。我檢查了很多次錯誤,但是我的代碼與該帖子中的代碼完全相同。

這是我的比較。

public class SortPoints implements Comparator<Point2D.Double>{ 

    private Point2D.Double center; 
    public SortPoints(Point2D.Double _center){ 
     center = _center; 
    } 
    @Override 
    public int compare(Point2D.Double o1, Point2D.Double o2) { 

     if(o1.equals(o2)){//edited if statement 
      return 0; 
     } 
     if (o1.x - center.x >= 0 && o2.x - center.x < 0) 
      return 1; 
     if (o1.x - center.x < 0 && o2.x - center.x >= 0) 
      return -1; 
     if (o1.x - center.x == 0 && o2.x - center.x == 0) { 
      if (o1.y - center.y >= 0 || o2.y - center.y >= 0) 
       if (o1.y > o2.y) 
        return 1; 
       else return -1; 
      if (o2.y > o1.y) 
       return 1; 
      else return -1; 
     } 

     // compute the cross product of vectors (center -> a) x (center -> b) 
     double det = (o1.x - center.x) * (o2.y - center.y) - (o2.x - center.x) * (o1.y - center.y); 
     if (det < 0) 
      return 1; 
     if (det > 0) 
      return -1; 

     // points a and b are on the same line from the center 
     // check which point is closer to the center 
     double d1 = (o1.x - center.x) * (o1.x - center.x) + (o1.y - center.y) * (o1.y - center.y); 
     double d2 = (o2.x - center.x) * (o2.x - center.x) + (o2.y - center.y) * (o2.y - center.y); 
     if(d1 > d2) 
      return 1; 
     else return -1; 
    } 
} 

編輯: 我沒有處理,其中有兩點是相同的部分。所以我在比較方法的開始處添加了這個:

if(o1.equals(o2)){ 
    return 0; 
} 
+0

錯誤發生在哪一行?堆棧跟蹤顯示它嗎? – DSlomer64

+0

您是否在IDE中遇到異常,並查看拋出異常的代碼?代碼中爲什麼會拋出異常,或者你能夠自己推斷出原因嗎? – mvd

+0

沒有堆棧跟蹤不。它只是顯示了我創建比較器的那部分代碼。它指向這一行 - > Collections.sort(intersectionPoints,new SortPoints(lightSource));之後它進入java中的數組和集合。 –

回答

1

您的方法沒有處理點數相等的情況。 Comparatorcompare方法可以根據參數之間的關係返回正數或負數 - 如果參數相等,則返回0。

+1

我建議編輯這樣的話,它說OP *不處理點相等的情況*(而不是將它寫成問題)。 –