forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Сортировка вершин (http://forum.boolean.name/showthread.php?t=13460)

WISHMASTER35 08.10.2010 22:24

Сортировка вершин
 
Нужно отсортировать 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;
}

Mr_F_ 09.10.2010 13:31

Ответ: Сортировка вершин
 
я делал это, но в том проекте адовый говнокод, это было давно и на блиц3д.
но суть такова: ты делаешь то же самое что и в 2д, но в пространстве выбранного полигона. т.е. если речь о блиц3д, то ты можешь создать пивот, поставить его в центр полигона и сделать ему AlignToNormal к нормали полика, затем TFormPoint'ить точки полигона в пространство пивота и сортировать по/против часовой стрелки.

WISHMASTER35 09.10.2010 14:44

Ответ: Сортировка вершин
 
не, не блиц3д.
забыл сказать, что вершины все будут на одной плоскости.
вообщем пытаюсь написать алгоритм соединения двух полигонов.

WISHMASTER35 12.10.2010 00:25

Ответ: Сортировка вершин
 
тогда как вершины спроецировать на плоскость XY? Если нормаль плоскости на которой они лежали известна.


Часовой пояс GMT +4, время: 21:25.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot