Сортировка вершин
Нужно отсортировать 3д вершины, чтобы из них получился правильный полигон.
Для 2д это делается сортировкой по полярному углу относительно вершины с самой маленькой координатой.
private void sort(Vector<Point> points) {
Point p0 = getMinPoint(points);
points.remove(p0);
sort(points, p0);
points.insertElementAt(p0, 0);
}
private void sort(Vector<Point> points, Point p0) {
boolean sort = true;
while(sort) {
sort = false;
for(int i=0; i<points.size()-1; i++) {
Point a = points.get(i);
Point b = points.get(i+1);
float t1 = (float)(a.x-p0.x)/(a.y-p0.y);
float t2 = (float)(b.x-p0.x)/(b.y-p0.y);
if(t1 > t2) {
swap(points, i, i+1);
sort = true;
}
}
}
}
private Point getMinPoint(Vector<Point> points) {
Point p0 = points.get(0);
for(int i=1; i<points.size(); i++) {
Point p =points.get(i);
if(p.y*10000+p.x < p0.y*10000+p0.x) p0 = p;
}
return p0;
}
|