overlap.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include <stdlib.h>
  2. #include <grass/gis.h>
  3. #include <grass/dbmi.h>
  4. #include <grass/vector.h>
  5. #include "proto.h"
  6. /* Add all elements of area A to the list */
  7. void add_aarea(struct Map_info *In, int aarea, int *ALines, int *AAreas)
  8. {
  9. int i, j, aline, naisles, aisle, acentroid;
  10. static struct ilist *BoundList = NULL;
  11. if (!BoundList)
  12. BoundList = Vect_new_list();
  13. acentroid = Vect_get_area_centroid(In, aarea);
  14. ALines[acentroid] = 1;
  15. Vect_get_area_boundaries(In, aarea, BoundList);
  16. for (i = 0; i < BoundList->n_values; i++) {
  17. aline = abs(BoundList->value[i]);
  18. ALines[aline] = 1;
  19. }
  20. naisles = Vect_get_area_num_isles(In, aarea);
  21. for (j = 0; j < naisles; j++) {
  22. aisle = Vect_get_area_isle(In, aarea, j);
  23. Vect_get_isle_boundaries(In, aisle, BoundList);
  24. for (i = 0; i < BoundList->n_values; i++) {
  25. aline = abs(BoundList->value[i]);
  26. ALines[aline] = 1;
  27. }
  28. }
  29. if (AAreas)
  30. AAreas[aarea] = 1;
  31. }
  32. /* Returns 1 if line1 from Map1 overlaps area2 from Map2,
  33. * 0 otherwise */
  34. int line_overlap_area(struct line_pnts *LPoints, struct Map_info *AMap,
  35. int area)
  36. {
  37. int i, nisles, isle;
  38. static struct line_pnts *APoints = NULL;
  39. static struct line_pnts **IPoints = NULL;
  40. static int isles_alloc = 0;
  41. G_debug(4, "line_overlap_area area = %d", area);
  42. if (!APoints) {
  43. APoints = Vect_new_line_struct();
  44. isles_alloc = 10;
  45. IPoints = G_malloc(isles_alloc * sizeof(struct line_pnts *));
  46. for (i = 0; i < isles_alloc; i++)
  47. IPoints[i] = Vect_new_line_struct();
  48. }
  49. Vect_get_area_points(AMap, area, APoints);
  50. nisles = Vect_get_area_num_isles(AMap, area);
  51. if (nisles >= isles_alloc) {
  52. IPoints = G_realloc(IPoints, (nisles + 10) * sizeof(struct line_pnts *));
  53. for (i = isles_alloc; i < nisles + 10; i++)
  54. IPoints[i] = Vect_new_line_struct();
  55. isles_alloc = nisles + 10;
  56. }
  57. for (i = 0; i < nisles; i++) {
  58. isle = Vect_get_area_isle(AMap, area, i);
  59. Vect_get_isle_points(AMap, isle, IPoints[i]);
  60. }
  61. /* Try if any of line vertices is within area */
  62. for (i = 0; i < LPoints->n_points; i++) {
  63. if (Vect_point_in_poly(LPoints->x[i], LPoints->y[i], APoints)) {
  64. int inside = 1;
  65. for (isle = 0; isle < nisles; isle++) {
  66. if (Vect_point_in_poly(LPoints->x[i], LPoints->y[i], IPoints[isle])) {
  67. inside = 0;
  68. break;
  69. }
  70. }
  71. if (inside) {
  72. G_debug(4, " -> line vertex inside area");
  73. return 1;
  74. }
  75. }
  76. }
  77. /* Skip points */
  78. if (LPoints->n_points < 2)
  79. return 0;
  80. /* Try intersections of line with area/isles boundary */
  81. /* Outer boundary */
  82. if (Vect_line_check_intersection2(LPoints, APoints, 0)) {
  83. G_debug(4, " -> line intersects outer area boundary");
  84. return 1;
  85. }
  86. for (i = 0; i < nisles; i++) {
  87. if (Vect_line_check_intersection2(LPoints, IPoints[i], 0)) {
  88. G_debug(4, " -> line intersects area island boundary");
  89. return 1;
  90. }
  91. }
  92. return 0;
  93. }