1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| private static void sortPointsForPolygon(List<Vector3d> vectors) {
// 1 trouver le barycentre
Vector3d p = centroid(vectors);
// 2 trier suivant les angles
Collections.sort(vectors, new Comparator<Vector3d>() {
@Override
public int compare(Vector3d p1, Vector3d p2) {
// angle
double a1 = angle(p,p1);
double a2 = angle(p,p2);
if ( a1<a2 ) {
return -1;
}
else if ( a1>a2 ) {
return 1;
}
else {
double d1 = distance(p,p1);
double d2 = distance(p,p2);
if ( d1<d2 ) {
return -1;
}
else if ( d1>d2 ) {
return 1;
}
else {
return 0;
}
}
}
private double distance(Vector3d p1, Vector3d p2) {
return p1.distance(p2);
/*double px = p2.getX() - p1.getX();
double pz = p2.getZ() - p1.getZ();
return Math.sqrt(px * px + pz * pz);*/
}
private double angle(Vector3d p, Vector3d p1) {
double dx = p1.getX() - p.getX();
double dz = p1.getZ() - p.getZ();
return Math.atan2(dz, dx);
}
});
}
private static Vector3d centroid(List<Vector3d> points) {
double x = 0, z = 0;
for(Vector3d point : points) {
x += point.getX();
z += point.getZ();
}
return new Vector3d(x / points.size(), 0, z / points.size());
} |
Partager