我正在製作帶有陰影的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;
}
錯誤發生在哪一行?堆棧跟蹤顯示它嗎? – DSlomer64
您是否在IDE中遇到異常,並查看拋出異常的代碼?代碼中爲什麼會拋出異常,或者你能夠自己推斷出原因嗎? – mvd
沒有堆棧跟蹤不。它只是顯示了我創建比較器的那部分代碼。它指向這一行 - > Collections.sort(intersectionPoints,new SortPoints(lightSource));之後它進入java中的數組和集合。 –