Показать сообщение отдельно
Старый 08.10.2010, 22:24   #1
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Сортировка вершин

Нужно отсортировать 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;
}
(Offline)
 
Ответить с цитированием