cvt.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. /*************************************************************************
  2. * Copyright (c) 2011 AT&T Intellectual Property
  3. * All rights reserved. This program and the accompanying materials
  4. * are made available under the terms of the Eclipse Public License v1.0
  5. * which accompanies this distribution, and is available at
  6. * https://www.eclipse.org/legal/epl-v10.html
  7. *
  8. * Contributors: Details at https://graphviz.org
  9. *************************************************************************/
  10. #include <assert.h>
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <limits.h>
  14. #include <pathplan/vis.h>
  15. #include <util/alloc.h>
  16. typedef Ppoint_t ilcoord_t;
  17. #ifdef DEBUG
  18. static void printVconfig(vconfig_t * cp);
  19. static void printVis(char *lbl, COORD * vis, int n);
  20. static void printDad(int *vis, int n);
  21. #endif
  22. vconfig_t *Pobsopen(Ppoly_t ** obs, int n_obs)
  23. {
  24. vconfig_t *rv;
  25. int poly_i, pt_i, i;
  26. int start, end;
  27. rv = malloc(sizeof(vconfig_t));
  28. if (!rv) {
  29. return NULL;
  30. }
  31. /* get storage */
  32. size_t n = 0;
  33. for (poly_i = 0; poly_i < n_obs; poly_i++) {
  34. n += obs[poly_i]->pn;
  35. }
  36. if (n > INT_MAX) { // will this overflow rv->N?
  37. free(rv);
  38. return NULL;
  39. }
  40. rv->P = calloc(n, sizeof(Ppoint_t));
  41. assert(n_obs >= 0);
  42. rv->start = calloc((size_t)n_obs + 1, sizeof(int));
  43. rv->next = calloc(n, sizeof(int));
  44. rv->prev = calloc(n, sizeof(int));
  45. rv->N = (int)n;
  46. rv->Npoly = n_obs;
  47. // bail out if any above allocations failed
  48. if (rv->start == NULL || (n > 0 && (rv->P == NULL ||
  49. rv->next == NULL ||
  50. rv->prev == NULL))) {
  51. free(rv->prev);
  52. free(rv->next);
  53. free(rv->start);
  54. free(rv->P);
  55. free(rv);
  56. return NULL;
  57. }
  58. /* build arrays */
  59. i = 0;
  60. for (poly_i = 0; poly_i < n_obs; poly_i++) {
  61. start = i;
  62. rv->start[poly_i] = start;
  63. assert(obs[poly_i]->pn <= INT_MAX);
  64. end = start + (int)obs[poly_i]->pn - 1;
  65. for (pt_i = 0; pt_i < (int)obs[poly_i]->pn; pt_i++) {
  66. rv->P[i] = obs[poly_i]->ps[pt_i];
  67. rv->next[i] = i + 1;
  68. rv->prev[i] = i - 1;
  69. i++;
  70. }
  71. rv->next[end] = start;
  72. rv->prev[start] = end;
  73. }
  74. rv->start[poly_i] = i;
  75. visibility(rv);
  76. return rv;
  77. }
  78. void Pobsclose(vconfig_t * config)
  79. {
  80. free(config->P);
  81. free(config->start);
  82. free(config->next);
  83. free(config->prev);
  84. if (config->vis) {
  85. free(config->vis[0]);
  86. free(config->vis);
  87. }
  88. free(config);
  89. }
  90. void Pobspath(vconfig_t *config, Ppoint_t p0, int poly0, Ppoint_t p1, int poly1,
  91. Ppolyline_t *output_route) {
  92. int i, *dad;
  93. size_t opn;
  94. Ppoint_t *ops;
  95. COORD *ptvis0, *ptvis1;
  96. ptvis0 = ptVis(config, poly0, p0);
  97. ptvis1 = ptVis(config, poly1, p1);
  98. dad = makePath(p0, poly0, ptvis0, p1, poly1, ptvis1, config);
  99. opn = 1;
  100. for (i = dad[config->N]; i != config->N + 1; i = dad[i])
  101. opn++;
  102. opn++;
  103. ops = gv_calloc(opn, sizeof(Ppoint_t));
  104. size_t j = opn - 1;
  105. ops[j--] = p1;
  106. for (i = dad[config->N]; i != config->N + 1; i = dad[i])
  107. ops[j--] = config->P[i];
  108. ops[j] = p0;
  109. assert(j == 0);
  110. #ifdef DEBUG
  111. printVconfig(config);
  112. printVis("p", ptvis0, config->N + 1);
  113. printVis("q", ptvis1, config->N + 1);
  114. printDad(dad, config->N + 1);
  115. #endif
  116. free(ptvis0);
  117. free(ptvis1);
  118. output_route->pn = opn;
  119. output_route->ps = ops;
  120. free(dad);
  121. }
  122. #ifdef DEBUG
  123. static void printVconfig(vconfig_t * cp)
  124. {
  125. int i, j;
  126. int *next, *prev;
  127. Ppoint_t *pts;
  128. array2 arr;
  129. next = cp->next;
  130. prev = cp->prev;
  131. pts = cp->P;
  132. arr = cp->vis;
  133. printf("this next prev point\n");
  134. for (i = 0; i < cp->N; i++)
  135. printf("%3d %3d %3d (%3g,%3g)\n", i, next[i], prev[i],
  136. pts[i].x, pts[i].y);
  137. printf("\n\n");
  138. for (i = 0; i < cp->N; i++) {
  139. for (j = 0; j < cp->N; j++)
  140. printf("%4.1f ", arr[i][j]);
  141. printf("\n");
  142. }
  143. }
  144. static void printVis(char *lbl, COORD * vis, int n)
  145. {
  146. int i;
  147. printf("%s: ", lbl);
  148. for (i = 0; i < n; i++)
  149. printf("%4.1f ", vis[i]);
  150. printf("\n");
  151. }
  152. static void printDad(int *vis, int n)
  153. {
  154. int i;
  155. printf(" ");
  156. for (i = 0; i < n; i++) {
  157. printf("%3d ", i);
  158. }
  159. printf("\n");
  160. printf("dad: ");
  161. for (i = 0; i < n; i++) {
  162. printf("%3d ", vis[i]);
  163. }
  164. printf("\n");
  165. }
  166. #endif