Xmipp  v3.23.11-Nereus
delaunay.cpp
Go to the documentation of this file.
1 #include "dcel.h"
2 #include "defines.h"
3 #include "delaunay.h"
4 #include <float.h>
5 #include "graph.h"
6 #ifdef LOGGING
7 #include "log.h"
8 #endif
9 #ifdef LOCATION_STATISTICS
10 #include "statistics.h"
11 #endif
12 #include "point.h"
13 #include "polygon.h"
14 #include "sorting.h"
15 #include <stdio.h>
16 #include <time.h>
17 #include <stdlib.h>
18 #include <string.h>
19 #ifdef LOCATION_STATISTICS
20 #include "/home/jnavas/workspace/Delaunay_Scipion/performance.h"
21 #endif
22 
23 #ifdef DEBUG
24 #include <GL/glut.h>
25 #endif
26 
27 /*****************************************************************************
28 * Defines
29 *****************************************************************************/
30 #define MAX_NEIGHBORS 50
31 #define EXTERNAL_FACE 0
32 
33 /*****************************************************************************
34 * Variables declaration
35 *****************************************************************************/
37 struct Graph_T graph;
38 
39 /*****************************************************************************
40 * Private functions declaration
41 *****************************************************************************/
42 void insert_First_Node( struct Delaunay_T *delaunay);
43 void get_Vertex_Of_Node( struct Graph_T *graph, int node_Index, int *index1, int *index2, int *index3);
44 int is_Interior_To_Node( struct DCEL_T *dcel, struct Graph_T *graph,
45  struct Point_T *p,
46  int node_Index);
47 int is_Strictly_Interior_To_Node(struct DCEL_T *dcel, struct Graph_T *graph, struct Point_T *p, int node_Index);
48 bool analyze_Face( struct Delaunay_T *delaunay, int point_Index);
49 void split_Triangle( struct DCEL_T *dcel, struct Graph_T *graph, int point_Index, int node_Index, int nTriangles);
50 double modified_Signed_Area( struct DCEL_T *dcel, struct Node_T *node);
51 int select_Colinear_Edge( struct DCEL_T *dcel, int point_Index, int edge_ID);
52 void check_Edge( struct DCEL_T *dcel, struct Graph_T *graph, int edge_ID);
53 void flip_Edges_Dcel( struct DCEL_T *dcel, struct Graph_T *graph, int edge_ID);
54 
55 
56 /***************************************************************************
57 * Public functions declaration
58 ***************************************************************************/
59 /***************************************************************************
60 * Name: init_Delaunay
61 * IN: nPoints # points in triangulation
62 * OUT: delaunay delaunay data
63 * IN/OUT: N/A
64 * RETURN: SUCCESS if delaunay allocated. FAILURE i.o.c
65 * Description: allocates structures to store "nPoints" points.
66 ***************************************************************************/
67 int init_Delaunay( struct Delaunay_T *delaunay, int nPoints)
68 {
69  int ret=SUCCESS; // Return value.
70 
71  // Allocate DCEL.
72  delaunay->dcel = (struct DCEL_T *)malloc(sizeof(struct DCEL_T));
73  if (delaunay->dcel == NULL)
74  {
75 #ifdef LOGGING
76  sprintf( log_Text, "Error allocating DCEL in init_Delaunay\n");
77  write_Log( log_Text);
78 #endif
79  printf("Error allocating DCEL in init_Delaunay\n");
80  ret = FAILURE;
81  }
82  else
83  {
84  // Create DCEL data to store nPoints.
85  if (initialize_DCEL( delaunay->dcel, nPoints, INVALID, INVALID) == FAILURE)
86  {
87 #ifdef LOGGING
88  sprintf( log_Text, "Error calling initialize_DCEL in init_Delaunay\n");
89  write_Log( log_Text);
90 #endif
91  printf("Error allocating DCEL in init_Delaunay\n");
92  ret = FAILURE;
93  }
94  else
95  {
96  // Initialize graph.
97  if (initialize_Graph( &delaunay->graph, delaunay->dcel->sizeVertex*10) == FAILURE)
98  {
99 #ifdef LOGGING
100  sprintf( log_Text, "Error allocating graph in init_Delaunay\n");
101  write_Log( log_Text);
102 #endif
103  printf("Error allocating graph in init_Delaunay\n");
104  ret = FAILURE;
105 
106  delaunay->voronoiComputed = true;
107  }
108  }
109  }
110 
111  return(ret);
112 }
113 
114 
115 /***************************************************************************
116 * Name: delete_Delaunay
117 * IN: N/A
118 * OUT: N/A
119 * IN/OUT: delaunay delaunay data
120 * RETURN: N/A
121 * Description: Free delaunay data.
122 ***************************************************************************/
123 void delete_Delaunay( struct Delaunay_T *delaunay)
124 {
125  // Deallocate DCEL.
126  finalize_DCEL(delaunay->dcel);
127 
128  // Deallocate Delaunay.
129  finalize_Delaunay(delaunay);
130 }
131 
132 
133 /***************************************************************************
134 * Name: insert_Point
135 * IN: x x coordinate of new point
136 * y y coordinate of new point
137 * OUT: N/A
138 * IN/OUT: delaunay delaunay data
139 * RETURN: N/A
140 * Description: Inserts a new point in the Delaunay set of points.
141 ***************************************************************************/
142 int insert_Point( struct Delaunay_T *delaunay, double x, double y)
143 {
144  int ret=SUCCESS; // Return value.
145 
146  // Check if dcel is full.
147  if (delaunay->dcel->nVertex == delaunay->dcel->sizeVertex)
148  {
149  printf("Dcel is full. Resizing DCEL\n");
150 
151  // Resize vertex array.
152  if (resize_DCEL( delaunay->dcel, RESIZE_POINTS) == FAILURE)
153  {
154 #ifdef LOGGING
155  sprintf("Error resizing DCEL in insert_Point.\n");
156  write_Log( log_Text);
157 #endif
158  printf("Error resizing DCEL in insert_Point.\n");
159  ret = FAILURE;
160  }
161  }
162 
163  if (ret == SUCCESS)
164  {
165  // Update coordinates.
166  delaunay->dcel->vertex[delaunay->dcel->nVertex].vertex.x = x;
167  delaunay->dcel->vertex[delaunay->dcel->nVertex].vertex.y = y;
168 
169  // Increase # points.
170  delaunay->dcel->nVertex++;
171  }
172 
173  return(ret);
174 }
175 
176 
177 /***************************************************************************
178 * Name: create_Delaunay_Triangulation
179 * IN: createVoronoi determines if Voronoi areas must be computed.
180 * OUT: N/A
181 * IN/OUT: delaunay delaunay data
182 * RETURN: SUCCESS if Voronoi computed. FAILURE i.o.c.
183 * Description: Computes the Delaunay triangulation using points stored in
184 * the DCEL field of the "delaunay" data. If "createVoronoi"
185 * TRUE, then it also computes the Voronoi area of the
186 * triangulation
187 ***************************************************************************/
188 int create_Delaunay_Triangulation( struct Delaunay_T *delaunay, int createVoronoi)
189 {
190  int ret=SUCCESS; // Return value.
191 
192  // Build Delaunay triangulation from scratch.
193  incremental_Delaunay( delaunay);
194 
195  // Set as imaginary faces with vertex points P_MINUS_2 or P_MINUS_1.
196  purge_Delaunay( delaunay);
197 
198  delaunay->voronoiComputed = false;
199 
200  // Check if Voronoi areas must be computed.
201  if (createVoronoi)
202  {
203  // Allocate Voronoi structures.
204  if (initialize_Voronoi( &delaunay->voronoi, get_Number_Faces( delaunay->dcel)*2) == FAILURE)
205  {
206 #ifdef LOGGING
207  sprintf("Error allocating Voronoi data in create_Delaunay_Triangulation.\n");
208  write_Log( log_Text);
209 #endif
210  printf("Error allocating Voronoi data in create_Delaunay_Triangulation.\n");
211  ret = FAILURE;
212  }
213  else
214  {
215  // Build Voronoi diagram.
216  build_Voronoi( &delaunay->voronoi, delaunay->dcel);
217 
218  // Set Voronoi flag as computed.
219  delaunay->voronoiComputed = true;
220  }
221  }
222 
223  return(ret);
224 }
225 
226 
227 
228 /***************************************************************************
229 * Name: initialize_Delaunay
230 * IN: dcel dcel data
231 * OUT: N/A
232 * IN/OUT: delaunay delaunay data
233 * RETURN: N/A
234 * Description: Allocates graph and gets reference to input dcel
235 ***************************************************************************/
236 int initialize_Delaunay(struct Delaunay_T *delaunay, struct DCEL_T *dcel)
237 {
238  int ret=SUCCESS; // Return value.
239 
240  // Get reference to DCEL.
241  delaunay->dcel = dcel;
242  delaunay->voronoiComputed = false;
243 
244  // Initialize graph.
245  if (initialize_Graph( &delaunay->graph, delaunay->dcel->nVertex*10) == FAILURE)
246  {
247 #ifdef LOGGING
248  sprintf("Error allocating graph in DCEL in insert_Point.\n");
249  write_Log( log_Text);
250 #endif
251  printf("Error allocating graph in DCEL in insert_Point.\n");
252  ret = FAILURE;
253  }
254 
255  return(ret);
256 }
257 
258 
259 /***************************************************************************
260 * Name: finalize_Delaunay
261 * IN: N/A
262 * OUT: N/A
263 * IN/OUT: delaunay delaunay data
264 * RETURN: N/A
265 * Description: Free graph, Voronoi areas and dereferences dcel.
266 ***************************************************************************/
267 void finalize_Delaunay(struct Delaunay_T *delaunay)
268 {
269  // Delete graph.
270  finalize_Graph( &delaunay->graph);
271 
272  // Delete Voronoi.
273  if (delaunay->voronoiComputed)
274  {
275  finalize_Voronoi( &delaunay->voronoi);
276  }
277 
278  // Dereference DCEL.
279  delaunay->dcel = NULL;
280 }
281 
282 
283 //#define DEBUG_INCREMENTAL_DELAUNAY
284 /***************************************************************************
285 * Name: incremental_Delaunay
286 * IN: N/A
287 * OUT: N/A
288 * IN/OUT: delaunay delaunay data
289 * RETURN: N/A
290 * Description: Builds a Delaunay triangulation using the incremental
291 * algorithm.
292 ***************************************************************************/
293 void incremental_Delaunay(struct Delaunay_T *delaunay)
294 {
295  int point_Index=0; // Points loop counter.
296 
297 #ifdef DELAUNAY_STATISTICS
298  // Initialize graph statistics (first 2 points are located in first triangle).
299  delaunay_Stat.trianglesFound[0] = 2;
300  delaunay_Stat.trianglesFound[1] = 0;
301  delaunay_Stat.trianglesFound[2] = 0;
302  delaunay_Stat.nFlipped = 0;
303 #endif
304  delaunay->dcel->incremental = true;
305 
306  // Set highest point at first position of the DCEL vertex array.
308 
309  // Insert initial nodes.
310  insert_First_Node( delaunay);
311 
312  // Update edge from new point.
313  update_Vertex_Edge_At( delaunay->dcel, 1, 0);
314 
315  // Insert first 6 edges due to first point.
316  insertEdge( delaunay->dcel, 1, 4, 3, 2, 1);
317  insertEdge( delaunay->dcel, P_MINUS_2, 6, 1, 3, 1);
318  insertEdge( delaunay->dcel, P_MINUS_1, 5, 2, 1, 1);
319  insertEdge( delaunay->dcel, P_MINUS_2, 1, 6, 5, 0);
320  insertEdge( delaunay->dcel, 1, 3, 4, 6, 0);
321  insertEdge( delaunay->dcel, P_MINUS_1, 2, 5, 4, 0);
322 
323  // Insert first internal face and external face.
324  insertFace( delaunay->dcel, 4);
325  insertFace( delaunay->dcel, 1);
326 
327  // Loop all other points.
328  for (point_Index=1; point_Index<delaunay->dcel->nVertex ; point_Index++)
329  {
330  // Insert new point into triangle where it is located.
331  analyze_Face( delaunay, point_Index);
332  }
333 }
334 
335 
336 /***************************************************************************
337 * Name: build_Delaunay_From_Triangulation
338 * IN: N/A
339 * OUT: N/A
340 * IN/OUT: delaunay delaunay data
341 * RETURN: N/A
342 * Description: Builds a Delaunay triangulation using the incremental
343 * algorithm.
344 ***************************************************************************/
346 {
347  int i=0; // Loop counters.
348  int nPending=0; // Edges pending.
349  int temp=0; // Intermediate variable.
350  struct Point_T triangle[3];
351  struct Dcel_Vertex_T *vertex=NULL; // Current triangle.
352  struct Dcel_Edge_T *prev=NULL; // Previous of current edge.
353  struct Dcel_Edge_T *twin=NULL; // Twin of current edge.
354  struct Dcel_Edge_T *neighbor=NULL; // Twin of current edge.
355 #ifdef DEBUG_DCEL
356  char prueba;
357  char filename[20];
358  int step=0;
359 #endif
360 #ifdef DELAUNAY_STATISTICS
361  delaunay_Stat.nFlipped = 0;
362 #endif
363 
364  // Initialize variables.
365  i=0;
366  nPending = dcel->nEdges;
367  dcel->incremental = false;
368 
369  // Analyze all edges.
370  while (nPending > 0)
371  {
372  // Check edge is still pending.
373  if (!dcel->edgeChecked[i])
374  {
375 #ifdef DEBUG_DCEL
376  printf("Edge %d in face %d and its twin is %d in face %d\n", i+1, dcel->edges[i].face, dcel->edges[i].twin_Edge, dcel->edges[dcel->edges[i].twin_Edge-1].face);
377 #endif
378  // Check edge is not in convex hull.
379  if ((dcel->edges[i].face != 0) && (dcel->edges[dcel->edges[i].twin_Edge-1].face) != 0)
380  {
381  // Get origin of first edge of current face.
382  vertex = get_Vertex( dcel, dcel->edges[i].origin_Vertex-1);
383  triangle[0] = vertex->vertex;
384 
385  // Get origin of previous edge.
386  prev = get_Edge( dcel, dcel->edges[i].previous_Edge-1);
387  vertex = get_Vertex( dcel, prev->origin_Vertex-1);
388  triangle[2] = vertex->vertex;
389 
390  // Get origin of twin of current edge of current face.
391  twin = get_Edge( dcel, dcel->edges[i].twin_Edge-1);
392  vertex = get_Vertex( dcel, twin->origin_Vertex-1);
393  triangle[1] = vertex->vertex;
394 
395  // Get origin of previous edge of twin.
396  neighbor = get_Edge( dcel, twin->previous_Edge-1);
397  vertex = get_Vertex( dcel, neighbor->origin_Vertex-1);
398 
399  // Check if neighbor point is in circle.
400  if (in_Circle( &triangle[0], &triangle[1], &triangle[2], &vertex->vertex))
401  {
402 #ifdef DELAUNAY_STATISTICS
403  delaunay_Stat.nFlipped++;
404 #endif
405 #ifdef DEBUG_DCEL
406  printf("Edge %d wrong. Pending %d. \n", i+1, nPending);
407  scanf( "%c", &prueba);
408 #endif
409  // Update vertex.
410  dcel->vertex[dcel->edges[i].origin_Vertex-1].origin_Edge = twin->next_Edge;
411  dcel->vertex[twin->origin_Vertex-1].origin_Edge = dcel->edges[i].next_Edge;
412 
413  // Update origin of current and twin edges.
414  temp = dcel->edges[dcel->edges[i].previous_Edge-1].origin_Vertex;
415  dcel->edges[twin->twin_Edge-1].origin_Vertex = dcel->edges[twin->previous_Edge-1].origin_Vertex;
416  dcel->edges[dcel->edges[i].twin_Edge-1].origin_Vertex = temp;
417 
418  // Update next edges.
419  dcel->edges[dcel->edges[i].next_Edge-1].next_Edge = dcel->edges[i].twin_Edge;
420  dcel->edges[twin->next_Edge-1].next_Edge = twin->twin_Edge;
421  dcel->edges[dcel->edges[i].previous_Edge-1].next_Edge = twin->next_Edge;
422  dcel->edges[twin->previous_Edge-1].next_Edge = dcel->edges[i].next_Edge;
423  dcel->edges[twin->twin_Edge-1].next_Edge = dcel->edges[twin->twin_Edge-1].previous_Edge;
424  dcel->edges[dcel->edges[i].twin_Edge-1].next_Edge = dcel->edges[dcel->edges[i].twin_Edge-1].previous_Edge;
425 
426  // Update previous edges.
427  dcel->edges[twin->twin_Edge-1].previous_Edge = dcel->edges[dcel->edges[i].next_Edge-1].next_Edge;
428  dcel->edges[dcel->edges[i].twin_Edge-1].previous_Edge = dcel->edges[twin->next_Edge-1].next_Edge;
429  dcel->edges[dcel->edges[i].next_Edge-1].previous_Edge = dcel->edges[dcel->edges[i].previous_Edge-1].next_Edge;
430  dcel->edges[twin->next_Edge-1].previous_Edge = dcel->edges[twin->previous_Edge-1].next_Edge;
431  dcel->edges[dcel->edges[i].previous_Edge-1].previous_Edge = dcel->edges[twin->twin_Edge-1].next_Edge;
432  dcel->edges[twin->previous_Edge-1].previous_Edge = dcel->edges[dcel->edges[i].twin_Edge-1].next_Edge;
433 
434  // Update faces in edges.
435  dcel->edges[dcel->edges[i].previous_Edge-1].face = dcel->edges[i].face;
436  dcel->edges[twin->previous_Edge-1].face = twin->face;
437 
438  // Update faces.
439  dcel->faces[dcel->edges[i].face].edge = twin->twin_Edge;
440  dcel->faces[twin->face].edge = dcel->edges[i].twin_Edge;
441 
442  // Update pending edges.
443  dcel->edgeChecked[i] = 1;
444  nPending--;
445 
446  // If twin not checked set as checked.
447  if (!dcel->edgeChecked[dcel->edges[i].twin_Edge-1])
448  {
449  nPending--;
450  dcel->edgeChecked[dcel->edges[i].twin_Edge-1] = 1;
451  }
452 
453  // Update pending edges.
454  set_Edge_Not_Checked( dcel, dcel->edges[i].previous_Edge-1, &nPending);
455  set_Edge_Not_Checked( dcel, dcel->edges[i].next_Edge-1, &nPending);
456  set_Edge_Not_Checked( dcel, dcel->edges[dcel->edges[i].twin_Edge-1].previous_Edge-1, &nPending);
457  set_Edge_Not_Checked( dcel, dcel->edges[dcel->edges[i].twin_Edge-1].next_Edge-1, &nPending);
458 #ifdef DEBUG_DCEL
459  printf("Edge %d flipped. Pending %d. \n", i+1, nPending);
460  step++;
461  sprintf( filename, "setp%d.txt", step);
462  write_DCEL( dcel, filename);
463  draw_DCEL_Points( &delaunay_Dcel, 0.1, WHITE);
464  draw_DCEL_Triangulation( &delaunay_Dcel);
465  glutSwapBuffers();
466 #endif
467  }
468  // Edge OK -> Not to be flipped.
469  else
470  {
471  dcel->edgeChecked[i] = 1;
472  nPending--;
473 #ifdef DEBUG_DCEL
474  printf("Edge %d is OK. Pending %d. \n", i+1, nPending);
475  scanf( "%c", &prueba);
476 #endif
477  }
478  }
479  // Edge in convex hull -> Not to be flipped.
480  else
481  {
482  dcel->edgeChecked[i] = 1;
483  nPending--;
484 #ifdef DEBUG_DCEL
485  printf("Edge %d in convex hull. Peding %d\n", i+1, nPending);
486  scanf( "%c", &prueba);
487 #endif
488  }
489  }
490  else
491  {
492 #ifdef DEBUG_DCEL
493  printf("Edge %d already checked. Pending %d\n", i+1, nPending);
494  scanf( "%c", &prueba);
495 #endif
496  }
497 
498  // Next edge.
499  i++;
500  i = i % dcel->nEdges;
501  }
502 }
503 
504 void purge_Delaunay( struct Delaunay_T *delaunay)
505 {
506  int edge_Index=0; // Next edge to update.
507 
508  // Initialize edge and point indexes.
509  edge_Index = delaunay->dcel->edges[edge_Index].previous_Edge-1;
510 
511  do
512  {
513  // Invalid current face.
514  update_Face( delaunay->dcel, INVALID, delaunay->dcel->edges[edge_Index].face);
515 
516  // Get index of edge departing from next point in convex hull.
517  edge_Index = delaunay->dcel->edges[edge_Index].previous_Edge-1;
518  edge_Index = delaunay->dcel->edges[edge_Index].twin_Edge-1;
519 
520  // Get index of next edge to update.
521  edge_Index = delaunay->dcel->edges[edge_Index].previous_Edge-1;
522 
523  // Check if new unbounded point is P_MINUS_1.
524  if (delaunay->dcel->edges[edge_Index].origin_Vertex == P_MINUS_1)
525  {
526  // Invalid current face.
527  update_Face( delaunay->dcel, INVALID, delaunay->dcel->edges[edge_Index].face);
528 
529  // Skip edges in current face.
530  edge_Index = delaunay->dcel->edges[edge_Index].twin_Edge-1;
531  edge_Index = delaunay->dcel->edges[edge_Index].previous_Edge-1;
532  }
533 
534  } while(delaunay->dcel->edges[edge_Index].origin_Vertex != 1);
535  // Until top most point found again.
536 
537  // Invalid current face.
538  update_Face( delaunay->dcel, INVALID, delaunay->dcel->edges[edge_Index].face);
539 
540  // Invalid zero face.
541  update_Face( delaunay->dcel, INVALID, 0);
542 }
543 
544 
545 int select_Closest( struct Delaunay_T *delaunay, int index)
546 {
547  int finished=FALSE; // Loop control flag.
548  int point_Index=0; // Index of a point.
549  int closest_Index=0; // Index of closest point.
550  int edge_Index=0; // Index of current edge.
551  struct Dcel_Vertex_T *origin=NULL; // Vertex data.
552  struct Dcel_Vertex_T *new_Point=NULL; // Vertex data.
553  double closest_Dist=0.0, new_Dist=0.0; // Distance to current closest point.
554 
555  // Get edge departing from point.
556  origin = get_Vertex( delaunay->dcel, index);
557 
558  // Get first edge to analyze.
559  edge_Index = origin->origin_Edge-1;
560 
561 #ifdef DEBUG_TWO_CLOSEST
562  printf("Searching closest point to %d. Starting edge %d\n", index, edge_Index);
563 #endif
564 
565  // Get index of current point.
566  closest_Index = delaunay->dcel->edges[delaunay->dcel->edges[edge_Index].next_Edge-1].origin_Vertex-1;
567  new_Point = get_Vertex( delaunay->dcel, closest_Index);
568  closest_Dist = distance( &origin->vertex, &new_Point->vertex);
569 
570 #ifdef DEBUG_TWO_CLOSEST
571  printf("Initial point is %d whose distance is %lf\n", closest_Index, closest_Dist);
572 #endif
573 
574  // Initialize loop.
575  finished = FALSE;
576  while (!finished)
577  {
578  // Select new edge.
579  edge_Index = delaunay->dcel->edges[delaunay->dcel->edges[edge_Index].previous_Edge-1].twin_Edge-1;
580 #ifdef DEBUG_TWO_CLOSEST
581  printf("Checking edge %d\n", edge_Index);
582 #endif
583 
584  if (edge_Index == origin->origin_Edge-1)
585  {
586  finished = TRUE;
587 
588 #ifdef DEBUG_TWO_CLOSEST
589  printf("Search finished.\n");
590 #endif
591  }
592  else
593  {
594  point_Index = delaunay->dcel->edges[delaunay->dcel->edges[edge_Index].next_Edge-1].origin_Vertex-1;
595 
596 #ifdef DEBUG_TWO_CLOSEST
597  printf("Checking point %d\n", point_Index);
598 #endif
599 
600  if (point_Index >= 0)
601  {
602  new_Point = get_Vertex( delaunay->dcel, point_Index);
603  new_Dist = distance( &origin->vertex, &new_Point->vertex);
604 
605 #ifdef DEBUG_TWO_CLOSEST
606  printf("New distance is %lf and previous is %lf.", new_Dist, closest_Dist);
607 #endif
608  if (new_Dist < closest_Dist)
609  {
610  closest_Dist = new_Dist;
611  closest_Index = point_Index;
612 #ifdef DEBUG_TWO_CLOSEST
613  printf("New point is closer. \n");
614 #endif
615  }
616  }
617 #ifdef DEBUG_TWO_CLOSEST
618  printf("Not checked because it is an imaginary point\n");
619 #endif
620  }
621  }
622 
623  return(closest_Index);
624 }
625 
626 
627 //#define #ifdef DEBUG_GET_FACE_POINTS
628 /***************************************************************************
629 * Name: get_Face_Points
630 * IN: dcel dcel data
631 * face_ID face to recover its points
632 * OUT: p first point of the face
633 * q second point of the face
634 * r third point of the face
635 * Description: gets the three points that form a triangle associated to the
636 * face_ID face.
637 ***************************************************************************/
638 int get_Face_Points( struct Delaunay_T *delaunay, int face_ID, struct Point_T *p,
639  struct Point_T *q,
640  struct Point_T *r)
641 {
642  int i=1;
643  int index=0;
644  int found=FALSE;
645  struct Dcel_Edge_T *edge=NULL; // Current edge.
646  struct Dcel_Face_T *face=NULL; // Current face.
647  int faceIndex=0;
648 
649  i=1;
650  while ((!found) && (i<get_Number_Faces( delaunay->dcel)))
651  {
652  // Get i-face.
653  face = get_Face( delaunay->dcel, i);
654 
655  if (face->imaginaryFace != INVALID)
656  {
657  index = face->edge-1;
658  edge = get_Edge( delaunay->dcel, index);
659 
660  faceIndex++;
661 #ifdef DEBUG_GET_FACE_POINTS
662  printf("Face index %d. Target face %d\n", faceIndex, face_ID);
663 #endif
664  if (faceIndex == face_ID)
665  {
666 #ifdef DEBUG_GET_FACE_POINTS
667  printf("%d \n ", dcel->edges[index].origin_Vertex-1);
668  printf("%d \n", dcel->edges[edge->next_Edge-1].origin_Vertex-1);
669  printf("%d \n", dcel->edges[edge->previous_Edge-1].origin_Vertex-1);
670 #endif
671  if (delaunay->dcel->edges[index].origin_Vertex-1 >= 0)
672  {
673  p->x = delaunay->dcel->vertex[delaunay->dcel->edges[index].origin_Vertex-1].vertex.x;
674  p->y = delaunay->dcel->vertex[delaunay->dcel->edges[index].origin_Vertex-1].vertex.y;
675  }
676  else
677  {
678  p->x = INVALID;
679  p->y = INVALID;
680  }
681  if (delaunay->dcel->edges[edge->next_Edge-1].origin_Vertex-1 >= 0)
682  {
683  q->x = delaunay->dcel->vertex[delaunay->dcel->edges[edge->next_Edge-1].origin_Vertex-1].vertex.x;
684  q->y = delaunay->dcel->vertex[delaunay->dcel->edges[edge->next_Edge-1].origin_Vertex-1].vertex.y;
685  }
686  else
687  {
688  q->x = INVALID;
689  q->y = INVALID;
690  }
691  if (delaunay->dcel->edges[edge->previous_Edge-1].origin_Vertex-1 >= 0)
692  {
693  r->x = delaunay->dcel->vertex[delaunay->dcel->edges[edge->previous_Edge-1].origin_Vertex-1].vertex.x;
694  r->y = delaunay->dcel->vertex[delaunay->dcel->edges[edge->previous_Edge-1].origin_Vertex-1].vertex.y;
695  }
696  else
697  {
698  r->x = INVALID;
699  r->y = INVALID;
700  }
701 
702  found=TRUE;
703  }
704  }
705  i++;
706  }
707 
708  return(found);
709 }
710 
711 
712 //#define DEBUG_NEXT_FACE_ITERATOR
713 /***************************************************************************
714 * Name: next_Face_Iterator
715 * IN: delaunay delaunay data
716 * OUT: p1 first point of the face
717 * p2 second point of the face
718 * p3 third point of the face
719 * Description: gets the three points that form a triangle associated to a
720 * triangle. First call returns the first triangle and successive
721 * calls return the next triangle (the function remembers last
722 * triangle returned). The function returns FALSE if the end
723 * of the list of triangles was reached and a real triangle
724 * was not found.
725 ***************************************************************************/
726 bool next_Face_Iterator(struct Delaunay_T *delaunay, struct Point_T *p1,
727  struct Point_T *p2,
728  struct Point_T *p3)
729 {
730  bool validFace; // Return value.
731  int edgeIndex; // Edge index.
732  bool finished; // Loop control flag.
733  struct Dcel_Face_T *face=NULL; // Current face.
734  struct Dcel_Edge_T *edge=NULL; // Current edge.
735  int nFaces; // # faces in DCEL.
736 
737  // Get # faces in DCEL.
738  nFaces = get_Number_Faces( delaunay->dcel);
739 
740  // Check if face index is out of bounds.
741  if (delaunay->faceIndex < nFaces)
742  {
743  // Search next face.
744  finished = false;
745  while (!finished)
746  {
747  // Get i-face.
748  face = get_Face( delaunay->dcel, delaunay->faceIndex);
749 
750 #ifdef DEBUG_NEXT_FACE_ITERATOR
751  printf("\nNew face %d of %d\n", delaunay->faceIndex, nFaces);
752 #endif
753 
754  delaunay->faceIndex++;
755 
756  // Check if current face is imaginary.
757  if (face->imaginaryFace != INVALID)
758  {
759  // Update return value and loop control flag to exit.
760  finished = true;
761  validFace = true;
762 
763  // Get edge index and edge data.
764  edgeIndex = face->edge - 1;
765  edge = get_Edge( delaunay->dcel, edgeIndex);
766 
767 #ifdef DEBUG_NEXT_FACE_ITERATOR
768  printf("\t1st point index %d \n", delaunay->dcel->edges[edgeIndex].origin_Vertex-1);
769  printf("\t2nd point index %d \n", delaunay->dcel->edges[edge->next_Edge-1].origin_Vertex-1);
770  printf("\t3rd point index %d \n", delaunay->dcel->edges[edge->previous_Edge-1].origin_Vertex-1);
771 #endif
772 
773  // Update output points.
774  p1->x = delaunay->dcel->vertex[delaunay->dcel->edges[edgeIndex].origin_Vertex-1].vertex.x;
775  p1->y = delaunay->dcel->vertex[delaunay->dcel->edges[edgeIndex].origin_Vertex-1].vertex.y;
776  p2->x = delaunay->dcel->vertex[delaunay->dcel->edges[edge->next_Edge-1].origin_Vertex-1].vertex.x;
777  p2->y = delaunay->dcel->vertex[delaunay->dcel->edges[edge->next_Edge-1].origin_Vertex-1].vertex.y;
778  p3->x = delaunay->dcel->vertex[delaunay->dcel->edges[edge->previous_Edge-1].origin_Vertex-1].vertex.x;
779  p3->y = delaunay->dcel->vertex[delaunay->dcel->edges[edge->previous_Edge-1].origin_Vertex-1].vertex.y;
780  }
781  else
782  {
783 #ifdef DEBUG_NEXT_FACE_ITERATOR
784  // Get edge index and edge data.
785  edgeIndex = face->edge - 1;
786  edge = get_Edge( delaunay->dcel, edgeIndex);
787  printf("Skipping imaginary face %d\n", delaunay->faceIndex-1);
788  printf("\t1st point index %d \n", delaunay->dcel->edges[edgeIndex].origin_Vertex-1);
789  printf("\t2nd point index %d \n", delaunay->dcel->edges[edge->next_Edge-1].origin_Vertex-1);
790  printf("\t3rd point index %d \n", delaunay->dcel->edges[edge->previous_Edge-1].origin_Vertex-1);
791 #endif
792  // Check if all faces searched.
793  if (delaunay->faceIndex >= nFaces)
794  {
795  finished = true;
796  validFace = false;
797 #ifdef DEBUG_NEXT_FACE_ITERATOR
798  printf("\t\t\tLast face %d found. Resetting index.\n", delaunay->faceIndex);
799 #endif
800  delaunay->faceIndex = 1;
801  }
802  }
803  }
804  }
805  // Reset face index.
806  else
807  {
808  delaunay->faceIndex = 1;
809  validFace = false;
810  }
811 
812  return(validFace);
813 }
814 
815 
816 
817 
818 void select_Two_Closest( struct Delaunay_T *delaunay, int *first, int *second)
819 {
820  int point_Index1=0, point_Index2=0;
821  int edge_Index=0; // Loop counter.
822  double lowest_Dist=DBL_MAX; // Distance between closest points.
823  double new_distance=0.0; // New distance.
824  struct Dcel_Vertex_T *p1=NULL; // Vertex data.
825  struct Dcel_Vertex_T *p2=NULL; // Vertex data.
826 
827  // Check all edges.
828  for (edge_Index=0; edge_Index<delaunay->dcel->nEdges; edge_Index++)
829  {
830  // If twin edge higher than current edge then points have not yet been checked.
831  if (delaunay->dcel->edges[edge_Index].twin_Edge-1 > edge_Index)
832  {
833  // Get two points indexes.
834  point_Index1 = delaunay->dcel->edges[edge_Index].origin_Vertex-1;
835  point_Index2 = delaunay->dcel->edges[delaunay->dcel->edges[edge_Index].twin_Edge-1].origin_Vertex-1;
836 
837  // Check if both points are valid (not P_MINUS_1 nor P_MINUS_2).
838  if ((point_Index1 >= 0) && (point_Index2 >= 0))
839  {
840  // Get two points.
841  p1 = get_Vertex( delaunay->dcel, point_Index1);
842  p2 = get_Vertex( delaunay->dcel, point_Index2);
843 
844  // Compute distance.
845  new_distance = distance( &p1->vertex, &p2->vertex);
846 
847  // Check if new distance is lower than current closest distance.
848  if (new_distance < lowest_Dist)
849  {
850  // Update lowest distance.
851  lowest_Dist = new_distance;
852 
853  (*first) = point_Index1;
854  (*second) = point_Index2;
855  }
856  }
857  }
858  }
859 }
860 
861 
862 //#define DEBUG_SELECT_CLOSEST_POINT
863 /***************************************************************************
864 * Name: select_Closest_Point
865 * IN: delaunay delaunay triangulation
866 * voronoi voronoi areas associated to delaunay triangulation
867 * p input point
868 * OUT: q closest point to input "p" point
869 * lowest_Distance distance from input "p" to output "q"
870 * RETURN: True TRUE if closest point found. False i.o.c.
871 * Description: finds the closest point in the DCEl to an input "p" point.
872 ***************************************************************************/
873 bool select_Closest_Point( struct Delaunay_T *delaunay, struct Point_T *p,
874  struct Point_T *q,
875  double *lowest_Distance)
876 {
877  int i=0, j=0; // Loop counters.
878  int node_Index=0; // Index of current node analyzed.
879  bool found=false; // Loop control flag.
880  bool finished=false; // Loop control flag.
881  int child_Index=0; // Children node ID.
882  int nChildren=0; // Number of children of current node.
883  int edge_Id=0; // Edge identifier.
884 
885  int current_Point=0; // Current point checked.
886  int first_Point=0; // First point checked.
887 
888  // Circular buffer to store point candidates.
889  int in=0;
890  int out=0;
891  int nItems=0;
892  int candidatesSize=MAX_NEIGHBORS;
893  int *candidates=NULL, *refCandidates=NULL;
894  int *inserted=NULL;
895  int nElems=0; // # elements to copy.
896  int nDiscarded=0;
897  bool allocationError=false; // Error allocating memory.
898 
899 #ifdef LOCATION_STATISTICS
900  // # triangles searched before a new point is located.
901  location_Stat.current++;
902  location_Stat.begin[location_Stat.current] = getTime();
903  location_Stat.nTrianglesSearched[location_Stat.current] = 0;
904 #endif
905 
906 #ifdef DEBUG_SELECT_CLOSEST_POINT
907  printf("Point to search: ");
908  print_Point( p);
909 #endif
910 
911  // Loop while not leaf node found and not end of set of points and not.
912  finished = false;
913  while (!finished)
914  {
915  // If node is a leaf then triangle that surrounds point has been found.
916  if (is_Leaf_Node( &delaunay->graph, node_Index))
917  {
918 #ifdef DEBUG_SELECT_CLOSEST_POINT
919  printf("Leaf node found: %d\n", node_Index);
920 #endif
921  // Allocate neighbors array.
922  candidates = (int *) calloc( candidatesSize, sizeof(int));
923  inserted = (int *) calloc( delaunay->voronoi.dcel.nVertex, sizeof(int));
924 
925  // Insert points from leaf node.
926  for (i=0; i<N_POINTS ;i++)
927  {
928  if (delaunay->graph.nodes[node_Index].points_Index[i] >= 0)
929  {
930  candidates[in] = delaunay->graph.nodes[node_Index].points_Index[i];
931  inserted[candidates[in]] = TRUE;
932 #ifdef DEBUG_SELECT_CLOSEST_POINT
933  printf("Inserted point %d. # %d. In %d. Out %d\n", candidates[in], nItems+1, in, out);
934 #endif
935  nItems++;
936  in++;
937  }
938  }
939 
940  found = false;
941  allocationError = false;
942  while ((!found) && (!allocationError))
943  {
944 #ifdef DEBUG_SELECT_CLOSEST_POINT
945  printf("Checking Point %d.\n", candidates[out]);
946 #endif
947  if (candidates[out] >= 0)
948  {
949 #ifdef LOCATION_STATISTICS
950  // Update # triangles searched.
951  location_Stat.nTrianglesSearched[location_Stat.current]++;
952 #endif
953  if (inner_To_Voronoi_Area( &delaunay->voronoi, candidates[out]-1, p))
954  {
955  // End inner and outer loops.
956  found = true;
957  finished = true;
958 
959  // Update point and distance.
960  q->x = delaunay->dcel->vertex[candidates[out]-1].vertex.x;
961  q->y = delaunay->dcel->vertex[candidates[out]-1].vertex.y;
962  (*lowest_Distance) = distance( p, q);
963 
964 #ifdef DEBUG_SELECT_CLOSEST_POINT
965  printf("Point %d found.\n", candidates[out]);
966  getchar();
967 #endif
968  }
969  else
970  {
971 #ifdef DEBUG_SELECT_CLOSEST_POINT
972  printf("Discard point %d.\n", candidates[out]);
973 #endif
974  // Get first neighbor.
975  edge_Id = delaunay->dcel->vertex[candidates[out]-1].origin_Edge;
976  edge_Id = delaunay->dcel->edges[edge_Id - 1].twin_Edge;
977  current_Point = delaunay->dcel->edges[edge_Id - 1].origin_Vertex;
978  first_Point = current_Point;
979 
980  do
981  {
982  // Check if circular buffer is full.
983  if (nItems == candidatesSize)
984  {
985 #ifdef DEBUG_SELECT_CLOSEST_POINT
986  printf("Circular buffer is full. Size %d and current # elements %d\n",
987  nItems,
988  candidatesSize);
989 #endif
990  // Compute # elements to copy.
991  nElems = candidatesSize - out;
992 
993  // Double size of the candidates array.
994  refCandidates = candidates;
995  candidatesSize = candidatesSize*2;
996  candidates = (int *) calloc( candidatesSize, sizeof(int));
997  if (candidates != NULL)
998  {
999  // Copy current candidates.
1000  memcpy( candidates, &refCandidates[out], nElems*sizeof(int));
1001  memcpy( &candidates[nElems], refCandidates, (nItems-nElems)*sizeof(int));
1002  free( refCandidates);
1003  }
1004  else
1005  {
1006 #ifdef LOGGING
1007  sprintf( log_Text, "Error allocating neighbors array in select_Closest_Point.\n");
1008  write_Log( log_Text);
1009 #endif
1010  printf("Error allocating neighbors array in select_Closest_Point.\n");
1011  allocationError = true;
1012  break;
1013  }
1014 
1015  in = nItems;
1016  out = 0;
1017  }
1018 
1019  if (current_Point >= 0)
1020  {
1021  if (!inserted[current_Point])
1022  {
1023  inserted[current_Point] = TRUE;
1024 
1025  // Insert point.
1026  candidates[in] = current_Point;
1027  nItems++;
1028  in++;
1029  in = in % candidatesSize;
1030 #ifdef DEBUG_SELECT_CLOSEST_POINT
1031  printf("Inserted point %d. # %d. In %d. Out %d\n", current_Point, nItems, in, out);
1032 #endif
1033  }
1034 #ifdef DEBUG_SELECT_CLOSEST_POINT
1035  else
1036  {
1037  printf("Point %d already checked.\n", current_Point);
1038 
1039  }
1040 #endif
1041  }
1042 
1043  // Get next point.
1044  edge_Id = delaunay->dcel->edges[edge_Id - 1].next_Edge;
1045  edge_Id = delaunay->dcel->edges[edge_Id - 1].twin_Edge;
1046  current_Point = delaunay->dcel->edges[edge_Id - 1].origin_Vertex;
1047  }
1048  while (current_Point != first_Point);
1049 
1050  // Check if all vertices searched.
1051  nDiscarded++;
1052  if (nDiscarded == delaunay->dcel->nVertex)
1053  {
1054  allocationError = true;
1055  finished = true;
1056  found = false;
1057  }
1058 
1059 #ifdef DEBUG_SELECT_CLOSEST_POINT
1060  printf("All %d neighbors inserted.\n", candidates[out]);
1061  getchar();
1062 #endif
1063  }
1064  }
1065 #ifdef DEBUG_SELECT_CLOSEST_POINT
1066  else
1067  {
1068  printf("Imaginary point %d.\n", candidates[out]);
1069  getchar();
1070  }
1071 #endif
1072  // Check next point.
1073 #ifdef DEBUG_SELECT_CLOSEST_POINT
1074  printf("Removed point %d. # %d. In %d. Out %d\n", candidates[out], nItems-1, in, out+1);
1075  getchar();
1076 #endif
1077  out++;
1078  nItems--;
1079  out = out % candidatesSize;
1080  }
1081 
1082  // Free candidates circular buffer.
1083  free( candidates);
1084  free( inserted);
1085  }
1086  else
1087  {
1088  // Search triangle in children nodes.
1089  i=0;
1090  found = false;
1091  nChildren = get_nChildren_Node( &delaunay->graph, node_Index);
1092 
1093 #ifdef DEBUG_SELECT_CLOSEST_POINT
1094  printf("Start search in node %d\n", node_Index);
1095 #endif
1096  while ((!found) && (i < nChildren))
1097  {
1098  // Get i-children.
1099  child_Index = get_iChildren_Node( &delaunay->graph, node_Index, i);
1100 
1101 #ifdef LOCATION_STATISTICS
1102  // Update # triangles searched.
1103  location_Stat.nTrianglesSearched[location_Stat.current]++;
1104 #endif
1105 
1106 #ifdef DEBUG_SELECT_CLOSEST_POINT
1107  printf("Checking %d-child in node %d. Node %d\n", i, child_Index, node_Index);
1108 #endif
1109  // Check if point is interior to i-child node.
1110  if (is_Interior_To_Node( delaunay->dcel, &delaunay->graph, p, child_Index))
1111  {
1112  // Search in next children node.
1113  node_Index = child_Index;
1114 
1115  // End loop.
1116  found = true;
1117 #ifdef DEBUG_SELECT_CLOSEST_POINT
1118  printf("Point inside node %d\n", node_Index);
1119 #endif
1120  }
1121  // Next child.
1122  else
1123  {
1124  i++;
1125  if (i == nChildren)
1126  {
1127  // Point must be equal to an existing point. Retry all points in current node.
1128  found = false;
1129  i=0;
1130  while ((!found) && (i < nChildren))
1131  {
1132  // Get i-children.
1133  child_Index = get_iChildren_Node( &delaunay->graph, node_Index, i);
1134 
1135  // Get closest point between the three points of the triangle.
1136  for (j=0; j<N_POINTS ;j++)
1137  {
1138  //printf("Point %d is (%lf,%lf)\n", delaunay->graph.nodes[child_Index].points_Index[j],
1139  // delaunay->dcel->vertex[delaunay->graph.nodes[child_Index].points_Index[j]-1].vertex.x,
1140  // delaunay->dcel->vertex[delaunay->graph.nodes[child_Index].points_Index[j]-1].vertex.y);
1141  if (equal_Point( p, &delaunay->dcel->vertex[delaunay->graph.nodes[child_Index].points_Index[j]-1].vertex))
1142  {
1143  (*lowest_Distance) = 0.0;
1144  q->x = delaunay->dcel->vertex[delaunay->graph.nodes[child_Index].points_Index[j]-1].vertex.x;
1145  q->y = delaunay->dcel->vertex[delaunay->graph.nodes[child_Index].points_Index[j]-1].vertex.y;
1146  found = true;
1147  //printf("Found point (%lf,%lf) equal to (%lf,%lf)\n", q->x, q->y, p->x, p->y);
1148 #ifdef DEBUG_SELECT_CLOSEST_POINT
1149  printf("Index point %d. Distance %lf\n", delaunay->graph.nodes[child_Index].points_Index[i], (*lowest_Distance));
1150 #endif
1151  }
1152  }
1153 
1154  i++;
1155  }
1156 
1157  // End main loop and force inner loop to finish.
1158  finished = true;
1159  i = nChildren;
1160 
1161  if (!found)
1162  {
1163  //exit(0);
1164  printf( "ERROR: No nodes surround new point.\n");
1165  print_Point( p);
1166 #ifdef LOGGING
1167  sprintf( log_Text, "ERROR: No nodes surround new point.\n");
1168  write_Log( log_Text);
1169 #endif
1170  }
1171  }
1172  }
1173  }
1174  }
1175  }
1176 
1177 #ifdef LOCATION_STATISTICS
1178  location_Stat.end[location_Stat.current] = getTime();
1179 #endif
1180 
1181  return(found);
1182 }
1183 
1184 //#define DEBUG_SELECT_CLOSEST_DCEL
1185 /***************************************************************************
1186 * Name: select_Closest_Point_DCEL
1187 * IN: dcel triangulation DCEL
1188 * nAnchors # anchors to be used as initial points
1189 * p input point
1190 * OUT: q closest point to input "p" point
1191 * lowest_Distance distance from input "p" to output "q"
1192 * RETURN: True TRUE if closest point found. False i.o.c.
1193 * Description: finds the closest point in the DCEl to an input "p" point.
1194 ***************************************************************************/
1195 bool select_Closest_Point_DCEL( struct DCEL_T *dcel, int nAnchors, struct Point_T *p,
1196  struct Point_T *q,
1197  double *lowest_Distance)
1198 {
1199  bool error=false; // Convex hull error flag.
1200  bool foundClosest=false; // Return value.
1201  bool foundEdge=false; // Found edge flag.
1202  int i=0; // Loop index.
1203  int index=0; // Array index.
1204  int edgeIndex=0; // DCEL edge index.
1205  int selectedVertex=0; // Vertex selected as initial point.
1206  int faceID=0; // Face identifier.
1207  double newDistance=0.0; // Distance to between points.
1208  struct Point_T *r1, *r2; // Points references.
1209  int nPoints=0; // # points in convex hull.
1210  int *points;
1211 
1212  // Initialize output value.
1213  (*lowest_Distance) = DBL_MAX;
1214 
1215 #ifdef LOCATION_STATISTICS
1216  // # triangles searched before a new point is located.
1217  location_Stat.current++;
1218  location_Stat.nTrianglesSearched[location_Stat.current] = 0;
1219 #endif
1220 
1221  // Check if point is exterior to convex hull.
1222  if (!is_Interior_To_Convex_Hull( dcel, p, &error))
1223  {
1224 #ifdef DEBUG_SELECT_CLOSEST_DCEL
1225  printf("Point (%f,%f) is exterior to convex hull\n", p->x, p->y);
1226 #endif
1227  // Get points in convex hull.
1228  get_Convex_Hull( dcel, &nPoints, points);
1229 
1230  // Check all points in convex hull.
1231  for (i=0; i<nPoints ;i++)
1232  {
1233  // Check if current anchor is closest point.
1234  newDistance = distance( p, &dcel->vertex[index].vertex);
1235 #ifdef DEBUG_SELECT_CLOSEST_DCEL
1236  printf("Point %d is (%f,%f). Distance %f\n", index+1,
1237  dcel->vertex[index].vertex.x,
1238  dcel->vertex[index].vertex.y,
1239  newDistance);
1240 #endif
1241  if (newDistance < (*lowest_Distance))
1242  {
1243  // Update output data.
1244  (*lowest_Distance) = newDistance;
1245  selectedVertex = index;
1246 #ifdef DEBUG_SELECT_CLOSEST_DCEL
1247  printf("New point is closer\n");
1248 #endif
1249  }
1250  }
1251  }
1252  else
1253  {
1254 #ifdef DEBUG_SELECT_CLOSEST_DCEL
1255  printf("Point (%f,%f) is INTERIOR to convex hull\n", p->x, p->y);
1256  printf("Selecting %d random anchors\n", nAnchors);
1257 #endif
1258  srand((int) time(NULL));
1259 
1260  // Select random anchor points.
1261  for (i=0; i<nAnchors ;i++)
1262  {
1263  // Select a new random point.
1264  index = rand() % dcel->nVertex;
1265 
1266  // Check if current anchor is closest point.
1267  newDistance = distance( p, &dcel->vertex[index].vertex);
1268 #ifdef DEBUG_SELECT_CLOSEST_DCEL
1269  printf("Point %d is (%f,%f). Distance %f\n", index+1,
1270  dcel->vertex[index].vertex.x,
1271  dcel->vertex[index].vertex.y,
1272  newDistance);
1273 #endif
1274  if (newDistance < (*lowest_Distance))
1275  {
1276  // Update output data.
1277  (*lowest_Distance) = newDistance;
1278  selectedVertex = index;
1279 #ifdef DEBUG_SELECT_CLOSEST_DCEL
1280  printf("New point is closer\n");
1281 #endif
1282  }
1283  }
1284 
1285  // Get face where selected point is the origin vertex.
1286  faceID = dcel->edges[dcel->vertex[selectedVertex].origin_Edge-1].face;
1287 
1288  // Main loop to start location from selected anchor.
1289  foundClosest = false;
1290  while (!foundClosest)
1291  {
1292 #ifdef DEBUG_SELECT_CLOSEST_DCEL
1293  printf("Searching in face %d\n", faceID);
1294 #endif
1295  // Check if point is internal to face.
1296  if (is_Interior_To_Face( dcel, p, faceID))
1297  {
1298 #ifdef DEBUG_SELECT_CLOSEST_DCEL
1299  printf("Point (%f,%f) is interior to face %d\n", p->x, p->y, faceID);
1300 #endif
1301  // Initialize output value.
1302  (*lowest_Distance) = DBL_MAX;
1303 
1304  // Get edge in current face.
1305  edgeIndex = dcel->faces[faceID].edge - 1;
1306 
1307  // Check all triangle vertex.
1308  for (i=0; i<N_POINTS_TRIANGLE ;i++)
1309  {
1310  // Get vertex.
1311  index = dcel->edges[edgeIndex].origin_Vertex-1;
1312 
1313  // Check if current vertex is closer.
1314  newDistance = distance( p, &dcel->vertex[index].vertex);
1315 #ifdef DEBUG_SELECT_CLOSEST_DCEL
1316  printf("Point %d is (%f,%f). Distance %f\n", index+1,
1317  dcel->vertex[index].vertex.x,
1318  dcel->vertex[index].vertex.y,
1319  newDistance);
1320 #endif
1321  if (newDistance < (*lowest_Distance))
1322  {
1323  // Update output data.
1324  (*lowest_Distance) = newDistance;
1325  selectedVertex = index;
1326 #ifdef DEBUG_SELECT_CLOSEST_DCEL
1327  printf("New point %d is closer\n", index+1);
1328 #endif
1329  }
1330 
1331  // Get next edge.
1332  edgeIndex = dcel->edges[edgeIndex].next_Edge - 1;
1333  }
1334 
1335  // Get reference to closest point.
1336  q->x = dcel->vertex[selectedVertex].vertex.x;
1337  q->y = dcel->vertex[selectedVertex].vertex.y;
1338  foundClosest = true;
1339 
1340 #ifdef DEBUG_SELECT_CLOSEST_DCEL
1341  printf("Closest point index %d is (%f,%f)\n", selectedVertex+1, q->x, q->y);
1342 #endif
1343  }
1344  else
1345  {
1346  // Get first edge.
1347  edgeIndex = dcel->faces[faceID].edge - 1;
1348 
1349  // Check edge to continue searching face.
1350  foundEdge = false;
1351  while(!foundEdge)
1352  {
1353  // Get edge extreme points.
1354  r1 = &dcel->vertex[dcel->edges[edgeIndex].origin_Vertex-1].vertex;
1355  r2 = &dcel->vertex[dcel->edges[dcel->edges[edgeIndex].twin_Edge-1].origin_Vertex-1].vertex;
1356 
1357 #ifdef DEBUG_SELECT_CLOSEST_DCEL
1358  printf("Checking edge %d. Points %d %d\n", edgeIndex+1,
1359  dcel->edges[edgeIndex].origin_Vertex,
1360  dcel->edges[dcel->edges[edgeIndex].twin_Edge-1].origin_Vertex);
1361 #endif
1362  // If right turn then this is the edge.
1363  if (check_Turn( r1, r2, p) == RIGHT_TURN)
1364  {
1365  // End inner loop.
1366  foundEdge = true;
1367 
1368  // Get next edge.
1369  faceID = dcel->edges[dcel->edges[edgeIndex].twin_Edge-1].face;
1370 #ifdef DEBUG_SELECT_CLOSEST_DCEL
1371  printf("Right turn. New face is %d\n", faceID);
1372 #endif
1373  }
1374  // Get next edge in triangle.
1375  else
1376  {
1377  edgeIndex = dcel->edges[edgeIndex].next_Edge - 1;
1378 #ifdef DEBUG_SELECT_CLOSEST_DCEL
1379  printf("Left turn. New edge is %d\n", edgeIndex+1);
1380 #endif
1381  }
1382  }
1383  }
1384  }
1385  }
1386 
1387  return(foundClosest);
1388 }
1389 
1390 //*****************************************************************************
1391 // PRIVATE FUNCTION BODIES
1392 //*****************************************************************************
1393 void insert_First_Node( struct Delaunay_T *delaunay)
1394 {
1395  struct Node_T node; // Temp variable.
1396 
1397  // Insert root triangle.
1398  node.points_Index[0] = 1;
1399  node.points_Index[1] = P_MINUS_2;
1400  node.points_Index[2] = P_MINUS_1;
1401  node.face_ID = 1;
1402  insert_Node( &delaunay->graph, &node);
1403 }
1404 
1405 
1406 
1407 
1408 //#define DEBUG_IS_INTERIOR_TO_NODE
1409 /***************************************************************************
1410 * Name: is_Interior_To_Node
1411 * IN: dcel triangulation DCEL
1412 * graph incremental Delaunay graph
1413 * p input point
1414 * node_Index graph node index
1415 * OUT: N/A
1416 * RETURN: True TRUE if point is interior to node
1417 * Description: check if input point p is interior to "node_Index" node.
1418 ***************************************************************************/
1419 int is_Interior_To_Node(struct DCEL_T *dcel, struct Graph_T *graph, struct Point_T *p, int node_Index)
1420 {
1421  int is_Interior=FALSE; // Return value.
1422  int id1=0, id2=0, id3=0; // IDs of vertex points.
1423 
1424  //Get an edge of the face associated to the node.
1425  get_Vertex_Of_Node( graph, node_Index, &id1, &id2, &id3);
1426 
1427 #ifdef DEBUG_IS_INTERIOR_TO_NODE
1428  printf(" Vertices %d %d %d\n", id1, id2, id3);
1429 #endif
1430 
1431  // Check if there is not a right turn.
1432  if (!(return_Turn( dcel, p, id1, id2) == RIGHT_TURN) &&
1433  !(return_Turn( dcel, p, id2, id3) == RIGHT_TURN) &&
1434  !(return_Turn( dcel, p, id3, id1) == RIGHT_TURN))
1435  {
1436  // Point is interior.
1437  is_Interior = TRUE;
1438  }
1439 
1440  return(is_Interior);
1441 }
1442 
1443 int is_Strictly_Interior_To_Node(struct DCEL_T *dcel, struct Graph_T *graph, struct Point_T *p, int node_Index)
1444 {
1445  int is_Interior=FALSE; // Return value.
1446  int id1=0, id2=0, id3=0; // IDs of vertex points.
1447 
1448  //Get an edge of the face associated to the node.
1449  get_Vertex_Of_Node( graph, node_Index, &id1, &id2, &id3);
1450 
1451  // Check if there is always a turn left.
1452  if ((return_Turn( dcel, p, id1, id2) == LEFT_TURN) &&
1453  (return_Turn( dcel, p, id2, id3) == LEFT_TURN) &&
1454  (return_Turn( dcel, p, id3, id1) == LEFT_TURN))
1455  {
1456  // Point is interior.
1457  is_Interior = TRUE;
1458  }
1459 
1460  return(is_Interior);
1461 }
1462 
1463 
1464 
1465 //#define DEBUG_ANALYZE_FACE
1466 bool analyze_Face( struct Delaunay_T *delaunay, int point_Index)
1467 {
1468  int i=0; // Loop counter.
1469  int node_Index=0; // Index of current node analyzed.
1470  bool found=false; // Loop control flag and return value.
1471  bool finished=false; // Loop control flag.
1472  struct Dcel_Vertex_T *point=NULL; // Pointer to points in DCEL.
1473 
1474  // Get new point to insert.
1475  point = get_Vertex( delaunay->dcel, point_Index);
1476 
1477 #ifdef DEBUG_ANALYZE_FACE
1478  printf("*******************\nSearching point %d coordinates (%lf,%lf)\n", point_Index+1,
1479  point->vertex.x,
1480  point->vertex.y);
1481 #endif
1482 
1483  // Initialize loop control flag.
1484  finished = FALSE;
1485  while (!finished)
1486  {
1487  // If node is a leaf then triangle found.
1488  if (delaunay->graph.nodes[node_Index].nChildren == 0)
1489  {
1490 #ifdef DEBUG_ANALYZE_FACE
1491  printf("Found leaf node %d.\n", node_Index);
1492 #endif
1493 
1494  // Check if point is strictly interior (not over an edge).
1495  if (is_Strictly_Interior_To_Node(delaunay->dcel, &delaunay->graph, &point->vertex, node_Index))
1496  {
1497 #ifdef DEBUG_ANALYZE_FACE
1498  printf("It is strictly interior\n");
1499 #endif
1500  // Split current triangle creating 3 triangles.
1501  split_Triangle( delaunay->dcel, &delaunay->graph, point_Index, node_Index, 3);
1502  }
1503  // Point over an edge.
1504  else
1505  {
1506 #ifdef DEBUG_ANALYZE_FACE
1507  printf("It is over an edge\n");
1508 #endif
1509 
1510  // Split current triangle creating 2 triangles.
1511  split_Triangle( delaunay->dcel, &delaunay->graph, point_Index, node_Index, 2);
1512  }
1513 
1514  // Finish main loop.
1515  finished = TRUE;
1516  }
1517  else
1518  {
1519  // Search triangle in children nodes.
1520  i=0;
1521  found = FALSE;
1522  while ((!found) && (i < delaunay->graph.nodes[node_Index].nChildren))
1523  {
1524 #ifdef DEBUG_ANALYZE_FACE
1525  printf("Trying %d-child from node %d: node id %d.\n", i, node_Index, delaunay->graph.nodes[node_Index].children_Index[i]);
1526 #endif
1527 
1528  // Check if point is interior to i-child node.
1529  if (is_Interior_To_Node( delaunay->dcel, &delaunay->graph, &point->vertex,
1530  delaunay->graph.nodes[node_Index].children_Index[i]))
1531  {
1532 #ifdef DELAUNAY_STATISTICS
1533  // Update triangle where point is located.
1534  delaunay_Stat.trianglesFound[i]++;
1535 #endif
1536 
1537  // Search in next children node.
1538  node_Index = delaunay->graph.nodes[node_Index].children_Index[i];
1539 
1540  // End loop.
1541  found = TRUE;
1542 
1543 #ifdef DEBUG_ANALYZE_FACE
1544  printf("Interior to node %d. Fetch node data.\n", node_Index);
1545  printf("Node vertices are %d %d %d.\n", delaunay->graph.nodes[node_Index].points_Index[0],
1546  delaunay->graph.nodes[node_Index].points_Index[1],
1547  delaunay->graph.nodes[node_Index].points_Index[2]);
1548 #endif
1549  }
1550  // Next child.
1551  else
1552  {
1553  i++;
1554 
1555  // Check if all children checked.
1556  if (i == delaunay->graph.nodes[node_Index].nChildren)
1557  {
1558  // Force exit function.
1559  finished = TRUE;
1560  i = delaunay->graph.nodes[node_Index].nChildren;
1561  printf("CRITICAL ERROR: point (%lf,%lf) is not interior to any node.\n", point->vertex.x, point->vertex.y);
1562  printf("Current node %d has %d children.\n", node_Index, delaunay->graph.nodes[node_Index].nChildren);
1563  printf("Node vertices are %d %d %d.\n", delaunay->graph.nodes[node_Index].points_Index[0],
1564  delaunay->graph.nodes[node_Index].points_Index[1],
1565  delaunay->graph.nodes[node_Index].points_Index[2]);
1566  exit(0);
1567  }
1568  }
1569  }
1570  }
1571  }
1572 
1573  return(found);
1574 }
1575 
1576 //#define DEBUG_SPLIT_TRIANGLE
1577 void split_Triangle( struct DCEL_T *dcel, struct Graph_T *graph, int point_Index, int node_Index, int nTriangles)
1578 {
1579  int new_Edge_ID=0; // Edge identifier.
1580  int new_Face_ID=0; // Face identifier.
1581  int prev_Edge_ID=0; // Stores previous edge id.
1582  int next_Edge_ID=0; // Stores next edge id.
1583  int collinear_Edge_ID=0, collinear_Index=0; // Edge identifier of collinear edge.
1584  int flip_Candidates[2]; // Edges that must be cheked due to split operation.
1585  struct Dcel_Face_T *face=NULL; // Pointer to current face.
1586  int old_Node_ID1=0, old_Node_ID2=0; // Old nodes id.
1587  struct Node_T *node=NULL, new_Node[3]; // Nodes.
1588 
1589  double area[3];
1590 
1591  // Get identifiers of next edge and face to be created.
1592  new_Edge_ID = get_Number_Edges( dcel) + 1;
1593  new_Face_ID = get_Number_Faces( dcel);
1594 
1595  // Update edge departing from new point.
1596  update_Vertex_Edge_At( dcel, new_Edge_ID, point_Index);
1597 
1598  // Get information of node where the new triangles are created.
1599  node = get_Node( graph, node_Index);
1600 
1601  // Get data of the face of the triangle to be splitted.
1602  face = get_Face( dcel, node->face_ID);
1603 
1604  // Check number of new triangles to create.
1605  if (nTriangles == 3)
1606  {
1607  // Save previous and next edges ID.
1608  prev_Edge_ID = dcel->edges[face->edge-1].previous_Edge;
1609  next_Edge_ID = dcel->edges[face->edge-1].next_Edge;
1610 
1611  // Insert two new edges: new_Edge_ID and new_Edge_ID+1.
1612  insertEdge( dcel, point_Index+1, new_Edge_ID+5, new_Edge_ID+1, face->edge, node->face_ID);
1613  insertEdge( dcel, dcel->edges[next_Edge_ID-1].origin_Vertex, new_Edge_ID+2, face->edge,
1614  new_Edge_ID, node->face_ID);
1615 
1616  // Insert two new edges: new_Edge_ID+2 and new_Edge_ID+3.
1617  insertEdge( dcel, point_Index+1, new_Edge_ID+1, new_Edge_ID+3, next_Edge_ID, new_Face_ID);
1618  insertEdge( dcel, dcel->edges[prev_Edge_ID-1].origin_Vertex, new_Edge_ID+4, next_Edge_ID,
1619  new_Edge_ID+2, new_Face_ID);
1620 
1621  // Insert two new edges: new_Edge_ID+4 and new_Edge_ID+5.
1622  insertEdge( dcel, point_Index+1, new_Edge_ID+3, new_Edge_ID+5, prev_Edge_ID, new_Face_ID+1);
1623  insertEdge( dcel, dcel->edges[face->edge-1].origin_Vertex, new_Edge_ID, prev_Edge_ID,
1624  new_Edge_ID+4, new_Face_ID+1);
1625 
1626  // Update existing edges.
1627  update_Edge( dcel, NO_UPDATE, NO_UPDATE, new_Edge_ID, new_Edge_ID+1, NO_UPDATE, face->edge-1);
1628  update_Edge( dcel, NO_UPDATE, NO_UPDATE, new_Edge_ID+2, new_Edge_ID+3, new_Face_ID, next_Edge_ID-1);
1629  update_Edge( dcel, NO_UPDATE, NO_UPDATE, new_Edge_ID+4, new_Edge_ID+5, new_Face_ID+1, prev_Edge_ID-1);
1630 
1631  // Insert two new faces.
1632  insertFace( dcel, new_Edge_ID + 2);
1633  insertFace( dcel, new_Edge_ID + 4);
1634 
1635  // Update leaf node.
1636  node->children_Index[0] = get_Graph_Length( graph);
1637  node->children_Index[1] = get_Graph_Length( graph) + 1;
1638  node->children_Index[2] = get_Graph_Length( graph) + 2;
1639  update_Node( graph, node_Index, 3, node);
1640 
1641  // Insert three new nodes.
1642  new_Node[0].points_Index[0] = get_Edge_Origin_Vertex( dcel, new_Edge_ID);
1643  new_Node[0].points_Index[1] = get_Edge_Origin_Vertex( dcel, new_Edge_ID - 1);
1644  new_Node[0].points_Index[2] = get_Edge_Origin_Vertex( dcel, face->edge - 1);
1645  new_Node[0].face_ID = node->face_ID;
1646  area[0] = modified_Signed_Area( dcel, &new_Node[0]);
1647  new_Node[1].points_Index[0] = get_Edge_Origin_Vertex( dcel, new_Edge_ID + 2);
1648  new_Node[1].points_Index[1] = get_Edge_Origin_Vertex( dcel, new_Edge_ID + 1);
1649  new_Node[1].points_Index[2] = get_Edge_Origin_Vertex( dcel, next_Edge_ID - 1);
1650  new_Node[1].face_ID = new_Face_ID;
1651  area[1] = modified_Signed_Area( dcel, &new_Node[1]);
1652  new_Node[2].points_Index[0] = get_Edge_Origin_Vertex( dcel, new_Edge_ID + 4);
1653  new_Node[2].points_Index[1] = get_Edge_Origin_Vertex( dcel, new_Edge_ID + 3);
1654  new_Node[2].points_Index[2] = get_Edge_Origin_Vertex( dcel, prev_Edge_ID - 1);
1655  new_Node[2].face_ID = new_Face_ID + 1;
1656  area[2] = modified_Signed_Area( dcel, &new_Node[2]);
1657  if (area[0] > area[1])
1658  {
1659  // 2nd, 0th, 1st.
1660  if (area[2] > area[0])
1661  {
1662  insert_Node( graph, &new_Node[2]);
1663  insert_Node( graph, &new_Node[0]);
1664  insert_Node( graph, &new_Node[1]);
1665  }
1666  // 0th, 2nd, 1st.
1667  else
1668  {
1669  insert_Node( graph, &new_Node[0]);
1670  if (area[2] > area[1])
1671  {
1672 
1673  insert_Node( graph, &new_Node[2]);
1674  insert_Node( graph, &new_Node[1]);
1675  }
1676  // 0th, 1st, 2nd.
1677  else
1678  {
1679  insert_Node( graph, &new_Node[1]);
1680  insert_Node( graph, &new_Node[2]);
1681  }
1682  }
1683  }
1684  else
1685  {
1686  // 2nd, 1st, 0th.
1687  if (area[2] > area[1])
1688  {
1689  insert_Node( graph, &new_Node[2]);
1690  insert_Node( graph, &new_Node[1]);
1691  insert_Node( graph, &new_Node[0]);
1692  }
1693  else
1694  {
1695  insert_Node( graph, &new_Node[1]);
1696  if (area[2] > area[0])
1697  {
1698  insert_Node( graph, &new_Node[2]);
1699  insert_Node( graph, &new_Node[0]);
1700  }
1701  else
1702  {
1703  insert_Node( graph, &new_Node[0]);
1704  insert_Node( graph, &new_Node[2]);
1705  }
1706  }
1707  }
1708 
1709 #ifdef DEBUG
1710  print_Graph(graph);
1711  print_DCEL( dcel);
1712 #endif
1713 
1714  // Check if edges must be flipped.
1715  check_Edge( dcel, graph, face->edge);
1716  check_Edge( dcel, graph, prev_Edge_ID);
1717  check_Edge( dcel, graph, next_Edge_ID);
1718  }
1719  else
1720  {
1721  // Get edge identifier where new point is collinear.
1722  collinear_Edge_ID = select_Colinear_Edge( dcel, point_Index, face->edge);
1723  if (collinear_Edge_ID != -1)
1724  {
1725  collinear_Index = collinear_Edge_ID - 1;
1726 
1727  // Save previous and next edges ID.
1728  prev_Edge_ID = dcel->edges[collinear_Index].previous_Edge;
1729  next_Edge_ID = dcel->edges[collinear_Index].next_Edge;
1730 
1731 #ifdef DEBUG_SPLIT_TRIANGLE
1732  printf("Collinear edges are %d and %d. Origins are %d and %d\n",
1733  collinear_Edge_ID,
1734  dcel->edges[collinear_Index].twin_Edge,
1735  dcel->edges[collinear_Index].origin_Vertex,
1736  dcel->edges[dcel->edges[collinear_Index].twin_Edge-1].origin_Vertex);
1737  printf("Faces that share edge are:\n");
1738  printFace( dcel, dcel->edges[collinear_Index].face);
1739  printFace( dcel, dcel->edges[dcel->edges[collinear_Index].twin_Edge-1].face);
1740 #endif
1741 
1742  // Store edges that must be checked after split of first triangle operation.
1743  flip_Candidates[0] = next_Edge_ID;
1744  flip_Candidates[1] = prev_Edge_ID;
1745 
1746  // Store nodes ID that are going to be updated.
1747  old_Node_ID1 = get_Node_Assigned( graph, dcel->edges[collinear_Index].face);
1748  old_Node_ID2 = get_Node_Assigned( graph, dcel->edges[dcel->edges[collinear_Index].twin_Edge-1].face);
1749 
1750  // Update current face with new edge: new_Edge_ID.
1751  insertEdge( dcel, dcel->edges[prev_Edge_ID-1].origin_Vertex, new_Edge_ID+1, next_Edge_ID,
1752  collinear_Edge_ID, node->face_ID);
1753 
1754  // Insert a new face with two new edges: new_Edge_ID+1 and new_Edge_ID+2.
1755  insertEdge( dcel, point_Index+1, new_Edge_ID, new_Edge_ID+2, prev_Edge_ID, new_Face_ID);
1756  insertEdge( dcel, dcel->edges[collinear_Index].origin_Vertex, new_Edge_ID+3, prev_Edge_ID,
1757  new_Edge_ID+1, new_Face_ID);
1758  update_Vertex_Edge_At( dcel, new_Edge_ID+1, point_Index);
1759  update_Face( dcel, new_Edge_ID, node->face_ID);
1760 
1761  // Update existing edges.
1762  update_Edge( dcel, point_Index+1, NO_UPDATE, new_Edge_ID, NO_UPDATE, NO_UPDATE, collinear_Index);
1763  update_Edge( dcel, NO_UPDATE, NO_UPDATE, NO_UPDATE, new_Edge_ID, NO_UPDATE, next_Edge_ID-1);
1764  update_Edge( dcel, NO_UPDATE, NO_UPDATE, new_Edge_ID+1, new_Edge_ID+2, new_Face_ID, prev_Edge_ID-1);
1765 
1766  // Get node of current edge and update it.
1767  node = get_Node( graph, old_Node_ID1);
1768  node->children_Index[0] = get_Graph_Length( graph);
1769  node->children_Index[1] = get_Graph_Length( graph) + 1;
1770  node->children_Index[2] = INVALID;
1771  update_Node( graph, old_Node_ID1, 2, node);
1772 
1773  // Insert two new nodes in first node splitted.
1774  new_Node[0].points_Index[0] = get_Edge_Origin_Vertex( dcel, dcel->edges[collinear_Index].previous_Edge - 1);
1775  new_Node[0].points_Index[1] = get_Edge_Origin_Vertex( dcel, collinear_Index);
1776  new_Node[0].points_Index[2] = get_Edge_Origin_Vertex( dcel, dcel->edges[collinear_Index].next_Edge - 1);
1777  new_Node[0].face_ID = dcel->edges[collinear_Index].face;
1778  insert_Node( graph, &new_Node[0]);
1779 #ifdef DEBUG_SPLIT_TRIANGLE
1780  printf("Splitting first triangle\n");
1781  printFace( dcel, new_Node[0].face_ID);
1782 #endif
1783  new_Node[1].points_Index[0] = get_Edge_Origin_Vertex( dcel, dcel->edges[collinear_Index].previous_Edge - 1);
1784  new_Node[1].points_Index[1] = get_Edge_Origin_Vertex( dcel, dcel->edges[dcel->edges[dcel->edges[collinear_Index].previous_Edge-1].twin_Edge-1].previous_Edge-1);
1785  new_Node[1].points_Index[2] = get_Edge_Origin_Vertex( dcel, dcel->edges[dcel->edges[collinear_Index].previous_Edge - 1].twin_Edge-1);
1786  new_Node[1].face_ID = new_Face_ID;
1787  insert_Node( graph, &new_Node[1]);
1788 
1789  // Insert new face.
1790  insertFace( dcel, new_Edge_ID + 2);
1791 #ifdef DEBUG_SPLIT_TRIANGLE
1792  printf("Splitting second triangle\n");
1793  printFace( dcel, new_Node[1].face_ID);
1794 #endif
1795 
1796  // Update twin face.
1797  collinear_Edge_ID = dcel->edges[collinear_Index].twin_Edge;
1798  collinear_Index = collinear_Edge_ID-1;
1799  prev_Edge_ID = dcel->edges[collinear_Index].previous_Edge;
1800  next_Edge_ID = dcel->edges[collinear_Index].next_Edge;
1801 
1802  // Insert a new face with two new edges: new_Edge_ID+3 and new_Edge_ID+4.
1803  insertEdge( dcel, point_Index+1, new_Edge_ID+2, new_Edge_ID+4, next_Edge_ID, new_Face_ID+1);
1804  insertEdge( dcel, dcel->edges[prev_Edge_ID-1].origin_Vertex, new_Edge_ID+5, next_Edge_ID,
1805  new_Edge_ID+3, new_Face_ID+1);
1806 
1807  // Update current face with new edge: new_Edge_ID+5.
1808  insertEdge( dcel, point_Index+1, new_Edge_ID+4, collinear_Edge_ID, prev_Edge_ID, dcel->edges[collinear_Index].face);
1809 
1810  // Update existing edges.
1811  update_Edge( dcel, NO_UPDATE, NO_UPDATE, new_Edge_ID+3, new_Edge_ID+4, new_Face_ID+1, next_Edge_ID-1);
1812  update_Edge( dcel, NO_UPDATE, NO_UPDATE, NO_UPDATE, new_Edge_ID+5, NO_UPDATE, collinear_Index);
1813  update_Edge( dcel, NO_UPDATE, NO_UPDATE, new_Edge_ID+5, NO_UPDATE, NO_UPDATE, prev_Edge_ID-1);
1814 
1815  // Get node of twin edge and update it.
1816  node = get_Node( graph, old_Node_ID2);
1817  node->children_Index[0] = get_Graph_Length( graph);
1818  node->children_Index[1] = get_Graph_Length( graph) + 1;
1819  node->children_Index[2] = INVALID;
1820  update_Node( graph, old_Node_ID2, 2, node);
1821 
1822  // Insert two new nodes in first node splitted.
1823  new_Node[0].points_Index[0] = get_Edge_Origin_Vertex( dcel, dcel->edges[collinear_Index].previous_Edge - 1);
1824  new_Node[0].points_Index[1] = get_Edge_Origin_Vertex( dcel, collinear_Index);
1825  new_Node[0].points_Index[2] = get_Edge_Origin_Vertex( dcel, dcel->edges[collinear_Index].next_Edge - 1);
1826  new_Node[0].face_ID = dcel->edges[collinear_Index].face;
1827  insert_Node( graph, &new_Node[0]);
1828  update_Face( dcel, collinear_Edge_ID, new_Node[0].face_ID);
1829 #ifdef DEBUG_SPLIT_TRIANGLE
1830  printf("Splitting third triangle\n");
1831  printFace( dcel, new_Node[0].face_ID);
1832 #endif
1833  new_Node[1].points_Index[0] = get_Edge_Origin_Vertex( dcel, dcel->edges[next_Edge_ID - 1].previous_Edge - 1);
1834  new_Node[1].points_Index[1] = get_Edge_Origin_Vertex( dcel, next_Edge_ID - 1);
1835  new_Node[1].points_Index[2] = get_Edge_Origin_Vertex( dcel, dcel->edges[next_Edge_ID - 1].next_Edge - 1);
1836  new_Node[1].face_ID = dcel->edges[next_Edge_ID - 1].face;
1837  insert_Node( graph, &new_Node[1]);
1838 
1839  // Insert new face.
1840  insertFace( dcel, new_Edge_ID + 4);
1841 
1842 #ifdef DEBUG_SPLIT_TRIANGLE
1843  printf("Splitting forth triangle\n");
1844  printFace( dcel, new_Node[1].face_ID);
1845 #endif
1846 
1847  // Check candidates from first triangle.
1848  check_Edge( dcel, graph, flip_Candidates[0]);
1849  check_Edge( dcel, graph, flip_Candidates[1]);
1850 
1851  // Check candidates from second triangle.
1852  check_Edge( dcel, graph, prev_Edge_ID);
1853  check_Edge( dcel, graph, next_Edge_ID);
1854  }
1855 #ifdef DEBUG_SPLIT_TRIANGLE
1856  else
1857  {
1858  printf("Collinear edge is negative. Point index %d and face edge %d\n", point_Index, face->edge);
1859  }
1860 #endif
1861  }
1862 }
1863 
1864 
1865 double modified_Signed_Area( struct DCEL_T *dcel, struct Node_T *node)
1866 {
1867  double area=0.0; // Return value.
1868 
1869  // Check if any of the vertex is not real: P_MINUS_! or P_MINUS_2.
1870  if ((node->points_Index[0] < 0) ||
1871  (node->points_Index[1] < 0) ||
1872  (node->points_Index[2] < 0))
1873  {
1874  // Set area zero.
1875  area = 0.0;
1876  }
1877  else
1878  {
1879  // Compute area.
1880  area = signed_Area( &dcel->vertex[node->points_Index[0]-1].vertex,
1881  &dcel->vertex[node->points_Index[1]-1].vertex,
1882  &dcel->vertex[node->points_Index[2]-1].vertex);
1883  }
1884 
1885  return(area);
1886 }
1887 
1888 //#define DEBUG_SELECT_COLLINEAR_EDGE
1889 int select_Colinear_Edge( struct DCEL_T *dcel, int point_Index, int edge_ID)
1890 {
1891  int edge_Index=0; // Index of edge of current face.
1892  int collinear_Edge=0; // Return value.
1893  int id1=0, id2=0, id3=0; // IDs of vertex points.
1894  struct Point_T *p=NULL; // Reference to new point.
1895 
1896  // Set edge index.
1897  edge_Index = edge_ID - 1;
1898 
1899  // Get index of the vertex of current face.
1900  id1 = get_Edge_Origin_Vertex( dcel, dcel->edges[edge_Index].previous_Edge-1);
1901  id2 = get_Edge_Origin_Vertex( dcel, edge_Index);
1902  id3 = get_Edge_Origin_Vertex( dcel, dcel->edges[edge_Index].next_Edge-1);
1903 
1904 #ifdef DEBUG_SELECT_COLLINEAR_EDGE
1905  printf("Triangles points are %d, %d and %d\n", id1, id2, id3);
1906 #endif
1907 
1908  // Get point coordinates.
1909  p = get_Vertex_Point( dcel, point_Index);
1910 
1911  // Check if point is collinear to previous edge.
1912  if (return_Turn( dcel, p, id1, id2) == COLINEAR)
1913  {
1914 #ifdef DEBUG_SELECT_COLLINEAR_EDGE
1915  printf("Collinear to points %d and %d\n", id1, id2);
1916 #endif
1917  collinear_Edge = dcel->edges[edge_Index].previous_Edge;
1918  }
1919  // Check if point is collinear to input edge.
1920  else if (return_Turn( dcel, p, id2, id3) == COLINEAR)
1921  {
1922 #ifdef DEBUG_SELECT_COLLINEAR_EDGE
1923  printf("Collinear to points %d and %d\n", id2, id3);
1924 #endif
1925  collinear_Edge = edge_ID;
1926  }
1927  // Check if point is collinear to next edge.
1928  else if (return_Turn( dcel, p, id3, id1) == COLINEAR)
1929  {
1930 #ifdef DEBUG_SELECT_COLLINEAR_EDGE
1931  printf("Collinear to points %d and %d\n", id3, id1);
1932 #endif
1933  collinear_Edge = dcel->edges[edge_Index].next_Edge;
1934  }
1935  else
1936  {
1937  printf("Checking when point is collinear but it is not.\n");
1938 #ifdef DEBUG
1939  sprintf( log_Text, "Checking when point is collinear but it is not.\n");
1940  write_Log( log_Text);
1941 #endif
1942  collinear_Edge = -1;
1943  }
1944 
1945 #ifdef DEBUG_SELECT_COLLINEAR_EDGE
1946  printf("Collinear edge is %d\n", collinear_Edge);
1947 #endif
1948 
1949  return(collinear_Edge);
1950 }
1951 
1952 
1953 
1954 void flip_Edges_Dcel( struct DCEL_T *dcel, struct Graph_T *graph, int edge_ID)
1955 {
1956  int temp=0; // Temp variable.
1957  int edge_Index=0; // Edge index.
1958  struct Node_T *node=NULL, new_Node;
1959  int old_Node_ID1=0, old_Node_ID2=0; // Old nodes id.
1960  struct Dcel_Edge_T *twin=NULL, *edge=NULL;
1961 
1962  // Get edge index.
1963  edge_Index = edge_ID-1;
1964 
1965  // Get edge and twin edge information.
1966  edge = get_Edge( dcel, edge_Index);
1967  twin = get_Edge( dcel, dcel->edges[edge_Index].twin_Edge-1);
1968 
1969 #ifdef DEBUG
1970  printf("FLIPPING EDGES %d and %d\n", edge_Index+1, dcel->edges[edge_Index].twin_Edge);
1971  if ((edge->face > get_Number_Faces( dcel)) || (twin->face > get_Number_Faces( dcel)))
1972  {
1973  printf("Higher than number of faces\n");
1974  exit(0);
1975  }
1976 #endif
1977 
1978  // Store nodes ID that are going to be updated to internal nodes.
1979  old_Node_ID1 = get_Node_Assigned( graph, edge->face);
1980  old_Node_ID2 = get_Node_Assigned( graph, twin->face);
1981 
1982 #ifdef DEBUG
1983  if ((old_Node_ID1 <= 0) || (old_Node_ID1 > get_Graph_Length( graph)) ||
1984  (old_Node_ID2 <= 0) || (old_Node_ID2 > get_Graph_Length( graph)))
1985  {
1986  exit(0);
1987  }
1988 #endif
1989 
1990  // Update vertex of flipped edge.
1991  if (edge->origin_Vertex > 0)
1992  {
1993  update_Vertex_Edge_At( dcel, twin->next_Edge, edge->origin_Vertex-1);
1994  }
1995  if (dcel->edges[edge->next_Edge-1].origin_Vertex > 0)
1996  {
1997  update_Vertex_Edge_At( dcel, edge->next_Edge, dcel->edges[edge->next_Edge-1].origin_Vertex-1);
1998  }
1999 
2000  // Update origin of current and twin edges.
2001  temp = dcel->edges[edge->previous_Edge-1].origin_Vertex;
2002  dcel->edges[edge_Index].origin_Vertex = dcel->edges[twin->previous_Edge-1].origin_Vertex;
2003  dcel->edges[edge->twin_Edge-1].origin_Vertex = temp;
2004 
2005  // Update next edges.
2006  dcel->edges[edge->next_Edge-1].next_Edge = edge->twin_Edge;
2007  dcel->edges[twin->next_Edge-1].next_Edge = edge_ID;
2008  dcel->edges[edge->previous_Edge-1].next_Edge = twin->next_Edge;
2009  dcel->edges[twin->previous_Edge-1].next_Edge = edge->next_Edge;
2010  dcel->edges[edge_Index].next_Edge = edge->previous_Edge;
2011  dcel->edges[edge->twin_Edge-1].next_Edge = twin->previous_Edge;
2012 
2013  // Update previous edges.
2014  dcel->edges[edge_Index].previous_Edge = dcel->edges[dcel->edges[edge_Index].next_Edge-1].next_Edge;
2015  dcel->edges[edge->twin_Edge-1].previous_Edge = dcel->edges[twin->next_Edge-1].next_Edge;
2016  dcel->edges[edge->next_Edge-1].previous_Edge = edge_ID;
2017  dcel->edges[twin->next_Edge-1].previous_Edge = edge->twin_Edge;
2018  dcel->edges[edge->previous_Edge-1].previous_Edge = edge->next_Edge;
2019  dcel->edges[twin->previous_Edge-1].previous_Edge = twin->next_Edge;
2020 
2021  // Update faces of edges that have moved to another face.
2022  dcel->edges[edge->previous_Edge-1].face = edge->face;
2023  dcel->edges[twin->previous_Edge-1].face = twin->face;
2024 
2025  // Update faces.
2026  dcel->faces[edge->face].edge = edge_ID;
2027  dcel->faces[twin->face].edge = edge->twin_Edge;
2028 
2029  // Get node of current edge and update it.
2030  node = get_Node( graph, old_Node_ID1);
2031  node->children_Index[0] = get_Graph_Length( graph);
2032  node->children_Index[1] = get_Graph_Length( graph) + 1;
2033  node->children_Index[2] = INVALID;
2034  update_Node( graph, old_Node_ID1, 2, node);
2035 
2036  // Get node of twin edge and update it.
2037  node = get_Node( graph, old_Node_ID2);
2038  node->children_Index[0] = get_Graph_Length( graph);
2039  node->children_Index[1] = get_Graph_Length( graph) + 1;
2040  node->children_Index[2] = INVALID;
2041  update_Node( graph, old_Node_ID2, 2, node);
2042 
2043  // Insert two new nodes.
2044  new_Node.points_Index[0] = get_Edge_Origin_Vertex( dcel, edge->previous_Edge - 1);
2045  new_Node.points_Index[1] = get_Edge_Origin_Vertex( dcel, edge_Index);
2046  new_Node.points_Index[2] = get_Edge_Origin_Vertex( dcel, edge->next_Edge - 1);
2047  new_Node.face_ID = edge->face;
2048  insert_Node( graph, &new_Node);
2049  new_Node.points_Index[0] = get_Edge_Origin_Vertex( dcel, twin->previous_Edge - 1);
2050  new_Node.points_Index[1] = get_Edge_Origin_Vertex( dcel, edge->twin_Edge - 1);
2051  new_Node.points_Index[2] = get_Edge_Origin_Vertex( dcel, twin->next_Edge - 1);
2052  new_Node.face_ID = twin->face;
2053  insert_Node( graph, &new_Node);
2054 
2055  // Check recursively edges that could be illegal.
2056  check_Edge( dcel, graph, edge->previous_Edge);
2057  check_Edge( dcel, graph, twin->next_Edge);
2058 }
2059 
2060 //#define DEBUG_CHECK_EDGES
2061 void check_Edge( struct DCEL_T *dcel, struct Graph_T *graph, int edge_ID)
2062 {
2063  int flip_Edges=FALSE; // Flip needed flag.
2064  int edge_Index=0; // Edge index.
2065  struct Point_T *common1=NULL, *common2=NULL, *p=NULL, *q=NULL;
2066 
2067  // Get edge inde.
2068  edge_Index = edge_ID-1;
2069 
2070  // Check if the edge is NOT in the external face.
2071  flip_Edges = FALSE;
2072  if (!is_External_Edge( dcel, edge_Index))
2073  {
2074  // Check if any of the vertex of current edge is P-2 or P-1.
2075  if (is_Negative_Any_Vertex( dcel, edge_ID))
2076  {
2077  // Check if any of the vertex of incident faces is P-2 or P-1.
2078  if ((dcel->edges[dcel->edges[edge_Index].previous_Edge-1].origin_Vertex > 0) &&
2079  (dcel->edges[dcel->edges[dcel->edges[edge_Index].twin_Edge-1].previous_Edge-1].origin_Vertex > 0))
2080  {
2081  // Get points of incident faces to current edge.
2082  p = get_Vertex_Point( dcel, dcel->edges[dcel->edges[edge_Index].previous_Edge-1].origin_Vertex-1);
2083  q = get_Vertex_Point( dcel, dcel->edges[dcel->edges[dcel->edges[edge_Index].twin_Edge-1].previous_Edge-1].origin_Vertex-1);
2084 
2085  // Set p as the vertex with highest y-coordinate.
2086  if (p->y < q->y)
2087  {
2088  p = get_Vertex_Point( dcel, dcel->edges[dcel->edges[dcel->edges[edge_Index].twin_Edge-1].previous_Edge-1].origin_Vertex-1);
2089  q = get_Vertex_Point( dcel, dcel->edges[dcel->edges[edge_Index].previous_Edge-1].origin_Vertex-1);
2090  }
2091 
2092  // Origin vertex is negative.
2093  if (dcel->edges[edge_Index].origin_Vertex < 0)
2094  {
2095  // Get destination point of current edge.
2096  common1 = get_Vertex_Point( dcel, dcel->edges[dcel->edges[edge_Index].twin_Edge-1].origin_Vertex-1);
2097 
2098  // Check if negative vertex is P-2.
2099  if (dcel->edges[edge_Index].origin_Vertex == P_MINUS_2)
2100  {
2101  // If turn LEFT_TURN then flip edge.
2102  if (check_Turn( p, q, common1) == LEFT_TURN)
2103  {
2104  flip_Edges = TRUE;
2105  }
2106  }
2107  else
2108  {
2109  // If turn RIGHT then flip edge.
2110  if (check_Turn( p, q, common1) == RIGHT_TURN)
2111  {
2112  flip_Edges = TRUE;
2113  }
2114  }
2115  }
2116  // Destination vertex is negative.
2117  else
2118  {
2119  // Get origin point of current edge.
2120  common1 = get_Vertex_Point( dcel, dcel->edges[edge_Index].origin_Vertex-1);
2121 
2122  // Check if negative vertex is P-2.
2123  if (dcel->edges[dcel->edges[edge_Index].twin_Edge-1].origin_Vertex == P_MINUS_2)
2124  {
2125  // If turn LEFT_TURN then flip edge.
2126  if (check_Turn( p, q, common1) == LEFT_TURN)
2127  {
2128  flip_Edges = TRUE;
2129  }
2130  }
2131  else
2132  {
2133  // If turn RIGHT then flip edge.
2134  if (check_Turn( p, q, common1) == RIGHT_TURN)
2135  {
2136  flip_Edges = TRUE;
2137  }
2138  }
2139  }
2140  }
2141  }
2142  // Vertex of candidate edge are positive.
2143  else
2144  {
2145  // Check if any of the other points of the triangles are P-2 or P-1.
2146  if ((dcel->edges[dcel->edges[edge_Index].previous_Edge-1].origin_Vertex > 0) &&
2147  (dcel->edges[dcel->edges[dcel->edges[edge_Index].twin_Edge-1].previous_Edge-1].origin_Vertex > 0))
2148  {
2149  // All points are positive -> normal in circle check.
2150  // Get points of edge to flip.
2151  common1 = get_Vertex_Point( dcel, dcel->edges[edge_Index].origin_Vertex-1);
2152  common2 = get_Vertex_Point( dcel, dcel->edges[dcel->edges[edge_Index].next_Edge-1].origin_Vertex-1);
2153 
2154  // Get points of faces.
2155  p = get_Vertex_Point( dcel, dcel->edges[dcel->edges[edge_Index].previous_Edge-1].origin_Vertex-1);
2156  q = get_Vertex_Point( dcel, dcel->edges[dcel->edges[dcel->edges[edge_Index].twin_Edge-1].previous_Edge-1].origin_Vertex-1);
2157 
2158  // Check if edge must be flipped.
2159  if (in_Circle( common1, common2, p, q))
2160  {
2161  flip_Edges = TRUE;
2162  }
2163  }
2164  }
2165  }
2166 
2167  // Check if edges must be flipped.
2168  if (flip_Edges)
2169  {
2170 #ifdef DELAUNAY_STATISTICS
2171  // Update triangle where point is located.
2172  delaunay_Stat.nFlipped++;
2173 #endif
2174 #ifdef DEBUG_CHECK_EDGES
2175  printf("Flipping edge %d\n", edge_ID);
2176 #endif
2177  // Flip edges.
2178  flip_Edges_Dcel( dcel, graph, edge_ID);
2179  }
2180 }
struct Voronoi_T voronoi
Definition: delaunay.h:18
#define FAILURE
Definition: defines.h:20
int twin_Edge
Definition: dcel.h:38
int update_Face(struct DCEL_T *dcel, int edge_ID, int index)
Definition: dcel.cpp:1428
int edge
Definition: dcel.h:46
void build_Voronoi(struct Voronoi_T *voronoi, struct DCEL_T *dcel)
Definition: voronoi.cpp:574
int origin_Vertex
Definition: dcel.h:37
struct Dcel_Vertex_T * get_Vertex(struct DCEL_T *dcel, int index)
Definition: dcel.cpp:882
int get_Graph_Length(struct Graph_T *graph)
Definition: graph.cpp:57
struct Node_T * nodes
Definition: graph.h:26
int initialize_DCEL(struct DCEL_T *dcel, int nPoints, int nEdges, int nFaces)
Definition: dcel.cpp:32
int insert_Node(struct Graph_T *graph, struct Node_T *node)
Definition: graph.cpp:182
Definition: point.h:12
int sizeVertex
Definition: dcel.h:56
void delete_Delaunay(struct Delaunay_T *delaunay)
Definition: delaunay.cpp:123
struct Point_T * get_Vertex_Point(struct DCEL_T *dcel, int index)
Definition: dcel.cpp:917
static double * y
Definition: dcel.h:50
void finalize_Voronoi(struct Voronoi_T *voronoi)
Definition: voronoi.cpp:697
int get_iChildren_Node(struct Graph_T *graph, int node_Index, int child_Index)
Definition: graph.cpp:105
int get_Face_Points(struct Delaunay_T *delaunay, int face_ID, struct Point_T *p, struct Point_T *q, struct Point_T *r)
Definition: delaunay.cpp:638
struct Graph_T graph
Definition: delaunay.h:16
void get_Vertex_Of_Node(struct Graph_T *graph, int node_Index, int *index1, int *index2, int *index3)
Definition: graph.cpp:139
int get_Node_Assigned(struct Graph_T *graph, int face_ID)
Definition: graph.cpp:332
void build_Delaunay_From_Triangulation(struct DCEL_T *dcel)
Definition: delaunay.cpp:345
POINT_T x
Definition: point.h:14
struct Dcel_Face_T * get_Face(struct DCEL_T *dcel, int index)
Definition: dcel.cpp:1479
int previous_Edge
Definition: dcel.h:39
int lexicographic_Higher(struct Point_T *p1, struct Point_T *p2)
Definition: point.cpp:211
void select_Two_Closest(struct Delaunay_T *delaunay, int *first, int *second)
Definition: delaunay.cpp:818
struct DCEL_T dcel
Definition: voronoi.h:12
doublereal * x
#define i
int select_Closest(struct Delaunay_T *delaunay, int index)
Definition: delaunay.cpp:545
int get_Number_Edges(struct DCEL_T *dcel)
Definition: dcel.cpp:950
#define MAX_NEIGHBORS
Definition: delaunay.cpp:30
int insert_Point(struct Delaunay_T *delaunay, double x, double y)
Definition: delaunay.cpp:142
#define NO_UPDATE
Definition: dcel.h:17
void finalize_DCEL(struct DCEL_T *dcel)
Definition: dcel.cpp:595
Definition: point.h:10
int is_External_Edge(struct DCEL_T *dcel, int index)
Definition: dcel.cpp:1175
void print_Graph(struct Graph_T *graph)
Definition: graph.cpp:555
void insert_First_Node(struct Delaunay_T *delaunay)
Definition: delaunay.cpp:1393
#define SUCCESS
Definition: defines.h:21
struct Node_T * get_Node(struct Graph_T *graph, int index)
Definition: graph.cpp:246
glob_log first
bool next_Face_Iterator(struct Delaunay_T *delaunay, struct Point_T *p1, struct Point_T *p2, struct Point_T *p3)
Definition: delaunay.cpp:726
int is_Leaf_Node(struct Graph_T *graph, int index)
Definition: graph.cpp:317
#define P_MINUS_1
Definition: defines.h:34
enum Turn_T return_Turn(struct DCEL_T *dcel, struct Point_T *p, int source_ID, int dest_ID)
Definition: dcel.cpp:1736
struct DCEL_T * dcel
Definition: delaunay.h:17
MpiNode * node
int select_Colinear_Edge(struct DCEL_T *dcel, int point_Index, int edge_ID)
Definition: delaunay.cpp:1889
int children_Index[3]
Definition: graph.h:17
bool analyze_Face(struct Delaunay_T *delaunay, int point_Index)
Definition: delaunay.cpp:1466
void print_Point(struct Point_T *point)
Definition: point.cpp:67
int equal_Point(struct Point_T *p1, struct Point_T *p2)
Definition: point.cpp:39
void printFace(struct DCEL_T *dcel, int faceID)
Definition: dcel.cpp:1719
#define N_POINTS_TRIANGLE
Definition: polygon.h:10
viol index
void finalize_Graph(struct Graph_T *graph)
Definition: graph.cpp:398
int nEdges
Definition: dcel.h:60
bool select_Closest_Point(struct Delaunay_T *delaunay, struct Point_T *p, struct Point_T *q, double *lowest_Distance)
Definition: delaunay.cpp:873
int next_Edge
Definition: dcel.h:40
int in_Circle(struct Point_T *p1, struct Point_T *p2, struct Point_T *p3, struct Point_T *q)
Definition: point.cpp:114
int face_ID
Definition: graph.h:19
struct Dcel_Edge_T * edges
Definition: dcel.h:63
int in
int points_Index[3]
Definition: graph.h:18
struct Graph_T graph
Definition: delaunay.cpp:37
struct Node_T root_Node
Definition: delaunay.cpp:36
#define INVALID
Definition: defines.h:29
double modified_Signed_Area(struct DCEL_T *dcel, struct Node_T *node)
Definition: delaunay.cpp:1865
#define P_MINUS_2
Definition: defines.h:35
int * edgeChecked
Definition: dcel.h:62
void purge_Delaunay(struct Delaunay_T *delaunay)
Definition: delaunay.cpp:504
int is_Interior_To_Node(struct DCEL_T *dcel, struct Graph_T *graph, struct Point_T *p, int node_Index)
Definition: delaunay.cpp:1419
free((char *) ob)
int write_DCEL(struct DCEL_T *dcel, int type, const char *fileName)
Definition: dcel.cpp:301
int get_Number_Faces(struct DCEL_T *dcel)
Definition: dcel.cpp:1360
int get_nChildren_Node(struct Graph_T *graph, int index)
Definition: graph.cpp:88
void update_Node(struct Graph_T *graph, int index, int nChildren, struct Node_T *node)
Definition: graph.cpp:264
struct Dcel_Vertex_T * vertex
Definition: dcel.h:57
int initialize_Delaunay(struct Delaunay_T *delaunay, struct DCEL_T *dcel)
Definition: delaunay.cpp:236
#define j
int is_Negative_Any_Vertex(struct DCEL_T *dcel, int edgeID)
Definition: dcel.cpp:1676
void flip_Edges_Dcel(struct DCEL_T *dcel, struct Graph_T *graph, int edge_ID)
Definition: delaunay.cpp:1954
POINT_T y
Definition: point.h:15
#define DBL_MAX
TYPE distance(struct Point_T *p, struct Point_T *q)
Definition: point.cpp:28
bool is_Interior_To_Face(struct DCEL_T *dcel, struct Point_T *p, int face_ID)
Definition: dcel.cpp:1628
#define FALSE
Definition: defines.h:24
struct Point_T vertex
Definition: dcel.h:32
int origin_Edge
Definition: dcel.h:31
int nVertex
Definition: dcel.h:55
struct Dcel_Edge_T * get_Edge(struct DCEL_T *dcel, int index)
Definition: dcel.cpp:1287
Definition: graph.h:22
int get_Edge_Origin_Vertex(struct DCEL_T *dcel, int edge_Index)
Definition: dcel.cpp:1218
bool voronoiComputed
Definition: delaunay.h:15
#define N_POINTS
Definition: graph.h:8
TYPE signed_Area(struct Point_T *p1, struct Point_T *p2, struct Point_T *p3)
Definition: point.cpp:267
#define TRUE
Definition: defines.h:25
int nChildren
Definition: graph.h:16
void split_Triangle(struct DCEL_T *dcel, struct Graph_T *graph, int point_Index, int node_Index, int nTriangles)
Definition: delaunay.cpp:1577
int faceIndex
Definition: delaunay.h:20
void incremental_Delaunay(struct Delaunay_T *delaunay)
Definition: delaunay.cpp:293
void finalize_Delaunay(struct Delaunay_T *delaunay)
Definition: delaunay.cpp:267
int init_Delaunay(struct Delaunay_T *delaunay, int nPoints)
Definition: delaunay.cpp:67
int inner_To_Voronoi_Area(struct Voronoi_T *voronoi, int index, struct Point_T *q)
Definition: voronoi.cpp:618
enum Turn_T check_Turn(struct Point_T *p1, struct Point_T *p2, struct Point_T *p3)
Definition: point.cpp:73
int create_Delaunay_Triangulation(struct Delaunay_T *delaunay, int createVoronoi)
Definition: delaunay.cpp:188
bool incremental
Definition: dcel.h:52
void print_DCEL(struct DCEL_T *dcel)
Definition: dcel.cpp:386
float r2
int resize_DCEL(struct DCEL_T *dcel, enum Resize_DCEL_T resize_Type)
Definition: dcel.cpp:471
int is_Strictly_Interior_To_Node(struct DCEL_T *dcel, struct Graph_T *graph, struct Point_T *p, int node_Index)
Definition: delaunay.cpp:1443
int update_Vertex_Edge_At(struct DCEL_T *dcel, int edge_ID, int index)
Definition: dcel.cpp:799
int initialize_Voronoi(struct Voronoi_T *voronoi, int nPoints)
Definition: voronoi.cpp:29
bool is_Interior_To_Convex_Hull(struct DCEL_T *dcel, struct Point_T *p, bool *error)
Definition: dcel.cpp:2018
int imaginaryFace
Definition: dcel.h:47
bool select_Closest_Point_DCEL(struct DCEL_T *dcel, int nAnchors, struct Point_T *p, struct Point_T *q, double *lowest_Distance)
Definition: delaunay.cpp:1195
Definition: graph.h:14
void check_Edge(struct DCEL_T *dcel, struct Graph_T *graph, int edge_ID)
Definition: delaunay.cpp:2061
struct Dcel_Face_T * faces
Definition: dcel.h:68
bool get_Convex_Hull(struct DCEL_T *dcel, int *length, int *points)
Definition: dcel.cpp:1910
int set_Edge_Not_Checked(struct DCEL_T *dcel, int index, int *n)
Definition: dcel.cpp:2554
int insertFace(struct DCEL_T *dcel, int edge_ID)
Definition: dcel.cpp:1376
void set_Highest_First(struct DCEL_T *dcel, int(*f)(struct Point_T *, struct Point_T *))
Definition: sorting.cpp:52
int initialize_Graph(struct Graph_T *graph, int size)
Definition: graph.cpp:21
int insertEdge(struct DCEL_T *dcel, int origin, int twin, int prev, int next, int face)
Definition: dcel.cpp:998
float r1
int face
Definition: dcel.h:41
int update_Edge(struct DCEL_T *dcel, int origin, int twin, int prev, int next, int face, int index)
Definition: dcel.cpp:1060