path.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #include <grass/gis.h>
  2. #include "path.h"
  3. void path_init(struct path *p)
  4. {
  5. p->vertices = NULL;
  6. p->count = 0;
  7. p->alloc = 0;
  8. p->start = -1;
  9. }
  10. void path_free(struct path *p)
  11. {
  12. if (p->vertices)
  13. G_free(p->vertices);
  14. p->count = 0;
  15. p->alloc = 0;
  16. p->start = -1;
  17. }
  18. void path_alloc(struct path *p, int n)
  19. {
  20. if (p->alloc >= n)
  21. return;
  22. p->alloc = n;
  23. p->vertices = G_realloc(p->vertices, p->alloc * sizeof(struct vertex));
  24. }
  25. void path_reset(struct path *p)
  26. {
  27. p->count = 0;
  28. p->start = -1;
  29. }
  30. void path_append(struct path *p, double x, double y, int mode)
  31. {
  32. struct vertex *v;
  33. if (p->count >= p->alloc)
  34. path_alloc(p, p->alloc ? p->alloc * 2 : 100);
  35. v = &p->vertices[p->count++];
  36. v->x = x;
  37. v->y = y;
  38. v->mode = mode;
  39. }
  40. void path_copy(struct path *dst, const struct path *src)
  41. {
  42. int i;
  43. path_reset(dst);
  44. path_alloc(dst, src->count);
  45. for (i = 0; i < src->count; i++) {
  46. struct vertex *v = &src->vertices[i];
  47. path_append(dst, v->x, v->y, v->mode);
  48. }
  49. dst->start = src->start;
  50. }
  51. void path_begin(struct path *p)
  52. {
  53. p->count = 0;
  54. p->start = -1;
  55. }
  56. void path_move(struct path *p, double x, double y)
  57. {
  58. p->start = p->count;
  59. path_append(p, x, y, P_MOVE);
  60. }
  61. void path_cont(struct path *p, double x, double y)
  62. {
  63. path_append(p, x, y, P_CONT);
  64. }
  65. void path_close(struct path *p)
  66. {
  67. struct vertex *v;
  68. if (p->start < 0)
  69. return;
  70. v = &p->vertices[p->start];
  71. path_append(p, v->x, v->y, P_CLOSE);
  72. p->start = -1;
  73. }
  74. void path_stroke(struct path *p, void (*line)(double, double, double, double))
  75. {
  76. int i;
  77. for (i = 1; i < p->count; i++) {
  78. struct vertex *v0 = &p->vertices[i-1];
  79. struct vertex *v1 = &p->vertices[i];
  80. if (v1->mode != P_MOVE)
  81. (*line)(v0->x, v0->y, v1->x, v1->y);
  82. }
  83. path_reset(p);
  84. }