overlap.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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)
  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. }
  30. /* Returns 1 if line1 from Map1 overlaps area2 from Map2,
  31. * 0 otherwise */
  32. int line_overlap_area(struct line_pnts *LPoints, struct Map_info *AMap,
  33. int area)
  34. {
  35. int i, nisles, isle;
  36. static struct line_pnts *APoints = NULL;
  37. static struct line_pnts **IPoints = NULL;
  38. static int isles_alloc = 0;
  39. G_debug(4, "line_overlap_area area = %d", area);
  40. if (!APoints) {
  41. APoints = Vect_new_line_struct();
  42. isles_alloc = 10;
  43. IPoints = G_malloc(isles_alloc * sizeof(struct line_pnts *));
  44. for (i = 0; i < isles_alloc; i++)
  45. IPoints[i] = Vect_new_line_struct();
  46. }
  47. Vect_get_area_points(AMap, area, APoints);
  48. nisles = Vect_get_area_num_isles(AMap, area);
  49. if (nisles >= isles_alloc) {
  50. IPoints = G_realloc(IPoints, (nisles + 10) * sizeof(struct line_pnts *));
  51. for (i = isles_alloc; i < nisles + 10; i++)
  52. IPoints[i] = Vect_new_line_struct();
  53. isles_alloc = nisles + 10;
  54. }
  55. for (i = 0; i < nisles; i++) {
  56. isle = Vect_get_area_isle(AMap, area, i);
  57. Vect_get_isle_points(AMap, isle, IPoints[i]);
  58. }
  59. /* Try if any of line vertices is within area */
  60. for (i = 0; i < LPoints->n_points; i++) {
  61. if (Vect_point_in_poly(LPoints->x[i], LPoints->y[i], APoints)) {
  62. int inside = 1;
  63. for (isle = 0; isle < nisles; isle++) {
  64. if (Vect_point_in_poly(LPoints->x[i], LPoints->y[i], IPoints[isle])) {
  65. inside = 0;
  66. break;
  67. }
  68. }
  69. if (inside) {
  70. G_debug(4, " -> line vertex inside area");
  71. return 1;
  72. }
  73. }
  74. }
  75. /* Skip points */
  76. if (LPoints->n_points < 2)
  77. return 0;
  78. /* Try intersections of line with area/isles boundary */
  79. /* Outer boundary */
  80. if (Vect_line_check_intersection2(LPoints, APoints, 0)) {
  81. G_debug(4, " -> line intersects outer area boundary");
  82. return 1;
  83. }
  84. for (i = 0; i < nisles; i++) {
  85. if (Vect_line_check_intersection2(LPoints, IPoints[i], 0)) {
  86. G_debug(4, " -> line intersects area island boundary");
  87. return 1;
  88. }
  89. }
  90. return 0;
  91. }