"разбор проги"


Страницы: 1
Пользователь: arhangel14
Сообщений: 10
Статус: Пользователь
Зарегистрирован:
14 октября 2008, 3:19
Был:15 января 2009, 20:15
arhangel14
smsup
Дата: 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
DMT
smsup
Дата: 15 января 2009, 20:37 Сообщение № 2
Код на C++
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #define EPS 0.001
  5. #define N 1000
  6. int n; // число точек всего
  7. double x[N][2]; // массив с координатами точек
  8. /*
  9. текущий центр координат (для вычисления вектороного произведения в функции cmp)
  10. */
  11. double *xt;
  12. double xtstatic[2];
  13. /*
  14. Находит знак векторного произведения векторов, проведеденных из
  15. точки xt в точки a и b
  16. */
  17. int
  18. cmp (const void *a, const void *b)
  19. {
  20. double *p1, *p2;
  21. double s;
  22. p1 = (double *) a;
  23. p2 = (double *) b;
  24. s = (p1[0] - xt[0]) * (p2[1] - xt[1]) - (p2[0] - xt[0]) * (p1[1] - xt[1]);
  25. if (fabs (s) < EPS)
  26. {
  27. s =
  28. (p1[0] - xt[0]) * (p1[0] - xt[0]) + (p1[1] - xt[1]) * (p1[1] - xt[1]);
  29. s -=
  30. (p2[0] - xt[0]) * (p2[0] - xt[0]) + (p2[1] - xt[1]) * (p2[1] - xt[1]);
  31. if (fabs (s) < EPS)
  32. return 0;
  33. if (s < 0)
  34. return 1;
  35. return -1;
  36. };
  37. if (s < 0)
  38. return 1;
  39. return -1;
  40. }
  41. /*
  42. Для точек из глобального массива x находит выпуклую оболочку и кладёт
  43. индексы точек выпуклой оболочки в массив stack
  44. */
  45. int
  46. convexhull (int *stack)
  47. {
  48. int i,i_ymin; // индек точки с минимальной координатой y
  49. int sp; // индекс последнего элемента в стеке; в конце
  50. // — число точек в выпуклой оболочке
  51. i_ymin=0;
  52. for (i = 0; i < n; i++){
  53. if (x[i][1] < x[i_ymin][1]) i_ymin = i;
  54. }
  55. xt = xtstatic;
  56. xt[0] = x[i_ymin][0];
  57. xt[1] = x[i_ymin][1];
  58. x[i_ymin][0] = x[0][0];
  59. x[i_ymin][1] = x[0][1];
  60. x[0][0] = xt[0];
  61. x[0][1] = xt[1];
  62. qsort (&x[1], n, 2 * sizeof (double), cmp);
  63. stack[0] = 0;
  64. stack[1] = 1;
  65. stack[2] = 2;
  66. sp = 2;
  67. i = 2;
  68. while (i < n + 1)
  69. {
  70. xt = x[stack[sp - 1]];
  71. if (cmp (&x[stack[sp]][0], &x[(i + 1) % n][0]) < 0)
  72. {
  73. stack[++sp] = (++i) % n;
  74. } else {
  75. sp--;
  76. }
  77. }
  78. return sp;
  79. }
  80. int
  81. main ()
  82. {
  83. int stack[N*2];
  84. scanf ("%d", &n);
  85. for (int i = 0; i < n; i++) scanf ("%lf %lf", &x[i][0], &x[i][1]);
  86. int length = convexhull (stack);
  87. for (int i = 0; i < length; i++) printf ("%f %f\n", x[stack[i]][0], x[stack[i]][1]);
  88. return 0;
  89. }
  90.  
При использовании обязательна ссылка на http://DMTSoft.ru
Пользователь: DMT
Сообщений: 123
Статус: Программист
Зарегистрирован:
18 октября 2007, 2:35
Был:13 ноября 2017, 4:54
DMT
smsup
Дата: 15 января 2009, 20:51 Сообщение № 3
Вот этот исходник вполне корректно работает!

Страницы: 1