"разбор проги"
Страницы: 1
Пользователь: arhangel14 Сообщений: 10 Статус: Пользователь Зарегистрирован: 14 октября 2008, 3:19 Был:15 января 2009, 20:15 | Дата: 14 января 2009, 3:07 Сообщение № 1 |
помогите плз разобраться почему не работает программа,должна строить злощастную выпуклую оболочку точек на плоскости... сначала вводиться количество точек вобщем,потом координаты точек....тем не менее ни о какой выпуклой оболочки не выдает.... #include <stdio.h> #include <stdlib.h> #include <math.h> #define EPS 1E-10 #define N 1000 int n; // число точек всего double x[N][2]; // массив с координатами точек /* текущий центр координат (для вычисления вектороного произведения в функции cmp) */ double *xt; double xtstatic[2]; /* Находит знак векторного произведения векторов, проведеденных из точки xt в точки a и b */ int cmp (const void *a, const void *b) { double *p1, *p2; double s; p1 = (double *) a; p2 = (double *) b; s = (p1[0] - xt[0]) * (p2[1] - xt[1]) - (p2[0] - xt[0]) * (p1[1] - xt[1]); if (fabs (s) < EPS) { s = (p1[0] - xt[0]) * (p1[0] - xt[0]) + (p1[1] - xt[1]) * (p1[1] - xt[1]); s -= (p2[0] - xt[0]) * (p2[0] - xt[0]) + (p2[1] - xt[1]) * (p2[1] - xt[1]); if (fabs (s) < EPS) return 0; if (s < 0) return 1; return -1; }; if (s < 0) return 1; return -1; } /* Для точек из глобального массива x находит выпуклую оболочку и кладёт индексы точек выпуклой оболочки в массив stack */ int convexhull (int *stack) { int i_ymin; // индек точки с минимальной координатой y int sp; // индекс последнего элемента в стеке; в конце // — число точек в выпуклой оболочке for (int i = 0; i < n; i++){ if (x[i][1] < x[i_ymin][1]) i_ymin = i; } xt = xtstatic; xt[0] = x[i_ymin][0]; xt[1] = x[i_ymin][1]; x[i_ymin][0] = x[0][0]; x[i_ymin][1] = x[0][1]; x[0][0] = xt[0]; x[0][1] = xt[1]; qsort (&x[1], n, 2 * sizeof (double), cmp); stack[0] = 0; stack[1] = 1; stack[2] = 2; sp = 2; i = 2; while (i < n + 1) { xt = x[stack[sp - 1]]; if (cmp (&x[stack[sp]][0], &x[(i + 1) % n][0]) < 0) { stack[++sp] = (++i) % n; } else { sp--; } } return sp; } int main () { int stack[N]; scanf ("%d", &n); for (int i = 0; i < n; i++) scanf ("%lf %lf", &x[i][0], &x[i][1]); int length = convexhull (stack); return 0; } |
Пользователь: DMT Сообщений: 123 Статус: Программист Зарегистрирован: 18 октября 2007, 2:35 Был:13 ноября 2017, 4:54 | Дата: 15 января 2009, 20:37 Сообщение № 2 |
|
Пользователь: DMT Сообщений: 123 Статус: Программист Зарегистрирован: 18 октября 2007, 2:35 Был:13 ноября 2017, 4:54 | Дата: 15 января 2009, 20:51 Сообщение № 3 |
Вот этот исходник вполне корректно работает! |
Страницы: 1