如果無法修改算法以正確的順序返回它們,則可以計算返回點的centroid(將它們全部加起來除以計數,凸包的質心總是位於船體),然後計算從質心的角度以這樣的各點:
point.angle = atan2(point.y - centroid.y, point.x - centroid.x);
然後排序基於所述角點的列表。
而且,你的C#代碼不符合Java的這一部分:
// Recursively proceed with new sets
HullSplit(minPt, farthestPt, leftSetMinPt, ref hull);
HullSplit(maxPt, farthestPt, leftSetMaxPt, ref hull);
// should be:
// HullSplit(farthestPt, maxPt, leftSetMaxPt, ref hull);
Java是:
hullSet(A,P,leftSetAP,hull);
hullSet(P,B,leftSetPB,hull);
而且,你已經有效扭轉了你點到線測試的跡象相比於Java的:
public int pointLocation(Point A, Point B, Point P) {
int cp1 = (B.x-A.x)*(P.y-A.y) - (B.y-A.y)*(P.x-A.x);
return (cp1>0)?1:-1;
}
if (pointLocation(A,B,p) == -1) // tests for negative
if (pointLocation(A,P,M)==1) { // tests for positive
if (pointLocation(P,B,M)==1) { // tests for positive
C#:
private static bool IsAboveLine(Point a, Point b, Point pt)
{
var result = ((b.X - a.X) * (pt.Y - a.Y))
-((b.Y - a.Y) * (pt.X - a.X));
return (result > 0) ? true : false;
}
if (IsAboveLine(minPt, maxPt, pt)) // tests for positive
if (!IsAboveLine(minPt, farthestPt, set.ElementAt(i))) // tests for negative
if (!IsAboveLine(farthestPt, maxPt, set.ElementAt(i))) // tests for negative
既然你提供的頁面是用java寫的,你可以發佈你的代碼,即使它是「確切的」嗎? –
你想完全實現QuickHull還是任何凸包算法?我的意思是,該網頁指出QuickHull比Graham Scan更易於實施,但我不同意。 Graham Scan不僅更簡單,而且速度更快。這是一個JS實現:http://jsfiddle.net/UbxEM/6/ –
是的,我需要實現QuickHull,我已經實現了其他的 – kskyriacou