1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169
|
From: "Maintainer: Debian Science Maintainers"
<debian-science-maintainers@lists.alioth.debian.org>
Date: Sun, 19 Dec 2021 10:34:32 +0100
Subject: Expose api
---
triangle.c | 496 +----------------------------------------------------
triangle.h | 562 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 564 insertions(+), 494 deletions(-)
diff --git a/triangle.c b/triangle.c
index 7c4b880..58cb813 100644
--- a/triangle.c
+++ b/triangle.c
@@ -194,28 +194,6 @@
/* */
/*****************************************************************************/
-/* For single precision (which will save some memory and reduce paging), */
-/* define the symbol SINGLE by using the -DSINGLE compiler switch or by */
-/* writing "#define SINGLE" below. */
-/* */
-/* For double precision (which will allow you to refine meshes to a smaller */
-/* edge length), leave SINGLE undefined. */
-/* */
-/* Double precision uses more memory, but improves the resolution of the */
-/* meshes you can generate with Triangle. It also reduces the likelihood */
-/* of a floating exception due to overflow. Finally, it is much faster */
-/* than single precision on 64-bit architectures like the DEC Alpha. I */
-/* recommend double precision unless you want to generate a mesh for which */
-/* you do not have enough memory. */
-
-/* #define SINGLE */
-
-#ifdef SINGLE
-#define REAL float
-#else /* not SINGLE */
-#define REAL double
-#endif /* not SINGLE */
-
/* If yours is not a Unix system, define the NO_TIMER compiler switch to */
/* remove the Unix-specific timing code. */
@@ -298,16 +276,6 @@
/* Number of splay tree nodes allocated at once. */
#define SPLAYNODEPERBLOCK 508
-/* The vertex types. A DEADVERTEX has been deleted entirely. An */
-/* UNDEADVERTEX is not part of the mesh, but is written to the output */
-/* .node file and affects the node indexing in the other output files. */
-
-#define INPUTVERTEX 0
-#define SEGMENTVERTEX 1
-#define FREEVERTEX 2
-#define DEADVERTEX -32768
-#define UNDEADVERTEX -32767
-
/* Two constants for algorithms based on random sampling. Both constants */
/* have been chosen empirically to optimize their respective algorithms. */
@@ -335,7 +303,6 @@
#define ONETHIRD 0.333333333333333333333333333333333333333333333333333333333333
#include <stdio.h>
-#include <stdlib.h>
#include <string.h>
#include <math.h>
#ifndef NO_TIMER
@@ -364,15 +331,6 @@ char *findfield();
enum locateresult {INTRIANGLE, ONEDGE, ONVERTEX, OUTSIDE};
-/* Labels that signify the result of vertex insertion. The result indicates */
-/* that the vertex was inserted with complete success, was inserted but */
-/* encroaches upon a subsegment, was not inserted because it lies on a */
-/* segment, or was not inserted because another vertex occupies the same */
-/* location. */
-
-enum insertvertexresult {SUCCESSFULVERTEX, ENCROACHINGVERTEX, VIOLATINGVERTEX,
- DUPLICATEVERTEX};
-
/* Labels that signify the result of direction finding. The result */
/* indicates that a segment connecting the two query points falls within */
/* the direction triangle, along the left edge of the direction triangle, */
@@ -380,258 +338,6 @@ enum insertvertexresult {SUCCESSFULVERTEX, ENCROACHINGVERTEX, VIOLATINGVERTEX,
enum finddirectionresult {WITHIN, LEFTCOLLINEAR, RIGHTCOLLINEAR};
-/*****************************************************************************/
-/* */
-/* The basic mesh data structures */
-/* */
-/* There are three: vertices, triangles, and subsegments (abbreviated */
-/* `subseg'). These three data structures, linked by pointers, comprise */
-/* the mesh. A vertex simply represents a mesh vertex and its properties. */
-/* A triangle is a triangle. A subsegment is a special data structure used */
-/* to represent an impenetrable edge of the mesh (perhaps on the outer */
-/* boundary, on the boundary of a hole, or part of an internal boundary */
-/* separating two triangulated regions). Subsegments represent boundaries, */
-/* defined by the user, that triangles may not lie across. */
-/* */
-/* A triangle consists of a list of three vertices, a list of three */
-/* adjoining triangles, a list of three adjoining subsegments (when */
-/* segments exist), an arbitrary number of optional user-defined */
-/* floating-point attributes, and an optional area constraint. The latter */
-/* is an upper bound on the permissible area of each triangle in a region, */
-/* used for mesh refinement. */
-/* */
-/* For a triangle on a boundary of the mesh, some or all of the neighboring */
-/* triangles may not be present. For a triangle in the interior of the */
-/* mesh, often no neighboring subsegments are present. Such absent */
-/* triangles and subsegments are never represented by NULL pointers; they */
-/* are represented by two special records: `dummytri', the triangle that */
-/* fills "outer space", and `dummysub', the omnipresent subsegment. */
-/* `dummytri' and `dummysub' are used for several reasons; for instance, */
-/* they can be dereferenced and their contents examined without violating */
-/* protected memory. */
-/* */
-/* However, it is important to understand that a triangle includes other */
-/* information as well. The pointers to adjoining vertices, triangles, and */
-/* subsegments are ordered in a way that indicates their geometric relation */
-/* to each other. Furthermore, each of these pointers contains orientation */
-/* information. Each pointer to an adjoining triangle indicates which face */
-/* of that triangle is contacted. Similarly, each pointer to an adjoining */
-/* subsegment indicates which side of that subsegment is contacted, and how */
-/* the subsegment is oriented relative to the triangle. */
-/* */
-/* The data structure representing a subsegment may be thought to be */
-/* abutting the edge of one or two triangle data structures: either */
-/* sandwiched between two triangles, or resting against one triangle on an */
-/* exterior boundary or hole boundary. */
-/* */
-/* A subsegment consists of a list of four vertices--the vertices of the */
-/* subsegment, and the vertices of the segment it is a part of--a list of */
-/* two adjoining subsegments, and a list of two adjoining triangles. One */
-/* of the two adjoining triangles may not be present (though there should */
-/* always be one), and neighboring subsegments might not be present. */
-/* Subsegments also store a user-defined integer "boundary marker". */
-/* Typically, this integer is used to indicate what boundary conditions are */
-/* to be applied at that location in a finite element simulation. */
-/* */
-/* Like triangles, subsegments maintain information about the relative */
-/* orientation of neighboring objects. */
-/* */
-/* Vertices are relatively simple. A vertex is a list of floating-point */
-/* numbers, starting with the x, and y coordinates, followed by an */
-/* arbitrary number of optional user-defined floating-point attributes, */
-/* followed by an integer boundary marker. During the segment insertion */
-/* phase, there is also a pointer from each vertex to a triangle that may */
-/* contain it. Each pointer is not always correct, but when one is, it */
-/* speeds up segment insertion. These pointers are assigned values once */
-/* at the beginning of the segment insertion phase, and are not used or */
-/* updated except during this phase. Edge flipping during segment */
-/* insertion will render some of them incorrect. Hence, don't rely upon */
-/* them for anything. */
-/* */
-/* Other than the exception mentioned above, vertices have no information */
-/* about what triangles, subfacets, or subsegments they are linked to. */
-/* */
-/*****************************************************************************/
-
-/*****************************************************************************/
-/* */
-/* Handles */
-/* */
-/* The oriented triangle (`otri') and oriented subsegment (`osub') data */
-/* structures defined below do not themselves store any part of the mesh. */
-/* The mesh itself is made of `triangle's, `subseg's, and `vertex's. */
-/* */
-/* Oriented triangles and oriented subsegments will usually be referred to */
-/* as "handles." A handle is essentially a pointer into the mesh; it */
-/* allows you to "hold" one particular part of the mesh. Handles are used */
-/* to specify the regions in which one is traversing and modifying the mesh.*/
-/* A single `triangle' may be held by many handles, or none at all. (The */
-/* latter case is not a memory leak, because the triangle is still */
-/* connected to other triangles in the mesh.) */
-/* */
-/* An `otri' is a handle that holds a triangle. It holds a specific edge */
-/* of the triangle. An `osub' is a handle that holds a subsegment. It */
-/* holds either the left or right side of the subsegment. */
-/* */
-/* Navigation about the mesh is accomplished through a set of mesh */
-/* manipulation primitives, further below. Many of these primitives take */
-/* a handle and produce a new handle that holds the mesh near the first */
-/* handle. Other primitives take two handles and glue the corresponding */
-/* parts of the mesh together. The orientation of the handles is */
-/* important. For instance, when two triangles are glued together by the */
-/* bond() primitive, they are glued at the edges on which the handles lie. */
-/* */
-/* Because vertices have no information about which triangles they are */
-/* attached to, I commonly represent a vertex by use of a handle whose */
-/* origin is the vertex. A single handle can simultaneously represent a */
-/* triangle, an edge, and a vertex. */
-/* */
-/*****************************************************************************/
-
-/* The triangle data structure. Each triangle contains three pointers to */
-/* adjoining triangles, plus three pointers to vertices, plus three */
-/* pointers to subsegments (declared below; these pointers are usually */
-/* `dummysub'). It may or may not also contain user-defined attributes */
-/* and/or a floating-point "area constraint." It may also contain extra */
-/* pointers for nodes, when the user asks for high-order elements. */
-/* Because the size and structure of a `triangle' is not decided until */
-/* runtime, I haven't simply declared the type `triangle' as a struct. */
-
-typedef REAL **triangle; /* Really: typedef triangle *triangle */
-
-/* An oriented triangle: includes a pointer to a triangle and orientation. */
-/* The orientation denotes an edge of the triangle. Hence, there are */
-/* three possible orientations. By convention, each edge always points */
-/* counterclockwise about the corresponding triangle. */
-
-struct otri {
- triangle *tri;
- int orient; /* Ranges from 0 to 2. */
-};
-
-/* The subsegment data structure. Each subsegment contains two pointers to */
-/* adjoining subsegments, plus four pointers to vertices, plus two */
-/* pointers to adjoining triangles, plus one boundary marker, plus one */
-/* segment number. */
-
-typedef REAL **subseg; /* Really: typedef subseg *subseg */
-
-/* An oriented subsegment: includes a pointer to a subsegment and an */
-/* orientation. The orientation denotes a side of the edge. Hence, there */
-/* are two possible orientations. By convention, the edge is always */
-/* directed so that the "side" denoted is the right side of the edge. */
-
-struct osub {
- subseg *ss;
- int ssorient; /* Ranges from 0 to 1. */
-};
-
-/* The vertex data structure. Each vertex is actually an array of REALs. */
-/* The number of REALs is unknown until runtime. An integer boundary */
-/* marker, and sometimes a pointer to a triangle, is appended after the */
-/* REALs. */
-
-typedef REAL *vertex;
-
-/* A queue used to store encroached subsegments. Each subsegment's vertices */
-/* are stored so that we can check whether a subsegment is still the same. */
-
-struct badsubseg {
- subseg encsubseg; /* An encroached subsegment. */
- vertex subsegorg, subsegdest; /* Its two vertices. */
-};
-
-/* A queue used to store bad triangles. The key is the square of the cosine */
-/* of the smallest angle of the triangle. Each triangle's vertices are */
-/* stored so that one can check whether a triangle is still the same. */
-
-struct badtriang {
- triangle poortri; /* A skinny or too-large triangle. */
- REAL key; /* cos^2 of smallest (apical) angle. */
- vertex triangorg, triangdest, triangapex; /* Its three vertices. */
- struct badtriang *nexttriang; /* Pointer to next bad triangle. */
-};
-
-/* A stack of triangles flipped during the most recent vertex insertion. */
-/* The stack is used to undo the vertex insertion if the vertex encroaches */
-/* upon a subsegment. */
-
-struct flipstacker {
- triangle flippedtri; /* A recently flipped triangle. */
- struct flipstacker *prevflip; /* Previous flip in the stack. */
-};
-
-/* A node in a heap used to store events for the sweepline Delaunay */
-/* algorithm. Nodes do not point directly to their parents or children in */
-/* the heap. Instead, each node knows its position in the heap, and can */
-/* look up its parent and children in a separate array. The `eventptr' */
-/* points either to a `vertex' or to a triangle (in encoded format, so */
-/* that an orientation is included). In the latter case, the origin of */
-/* the oriented triangle is the apex of a "circle event" of the sweepline */
-/* algorithm. To distinguish site events from circle events, all circle */
-/* events are given an invalid (smaller than `xmin') x-coordinate `xkey'. */
-
-struct event {
- REAL xkey, ykey; /* Coordinates of the event. */
- VOID *eventptr; /* Can be a vertex or the location of a circle event. */
- int heapposition; /* Marks this event's position in the heap. */
-};
-
-/* A node in the splay tree. Each node holds an oriented ghost triangle */
-/* that represents a boundary edge of the growing triangulation. When a */
-/* circle event covers two boundary edges with a triangle, so that they */
-/* are no longer boundary edges, those edges are not immediately deleted */
-/* from the tree; rather, they are lazily deleted when they are next */
-/* encountered. (Since only a random sample of boundary edges are kept */
-/* in the tree, lazy deletion is faster.) `keydest' is used to verify */
-/* that a triangle is still the same as when it entered the splay tree; if */
-/* it has been rotated (due to a circle event), it no longer represents a */
-/* boundary edge and should be deleted. */
-
-struct splaynode {
- struct otri keyedge; /* Lprev of an edge on the front. */
- vertex keydest; /* Used to verify that splay node is still live. */
- struct splaynode *lchild, *rchild; /* Children in splay tree. */
-};
-
-/* A type used to allocate memory. firstblock is the first block of items. */
-/* nowblock is the block from which items are currently being allocated. */
-/* nextitem points to the next slab of free memory for an item. */
-/* deaditemstack is the head of a linked list (stack) of deallocated items */
-/* that can be recycled. unallocateditems is the number of items that */
-/* remain to be allocated from nowblock. */
-/* */
-/* Traversal is the process of walking through the entire list of items, and */
-/* is separate from allocation. Note that a traversal will visit items on */
-/* the "deaditemstack" stack as well as live items. pathblock points to */
-/* the block currently being traversed. pathitem points to the next item */
-/* to be traversed. pathitemsleft is the number of items that remain to */
-/* be traversed in pathblock. */
-/* */
-/* alignbytes determines how new records should be aligned in memory. */
-/* itembytes is the length of a record in bytes (after rounding up). */
-/* itemsperblock is the number of items allocated at once in a single */
-/* block. itemsfirstblock is the number of items in the first block, */
-/* which can vary from the others. items is the number of currently */
-/* allocated items. maxitems is the maximum number of items that have */
-/* been allocated at once; it is the current number of items plus the */
-/* number of records kept on deaditemstack. */
-
-struct memorypool {
- VOID **firstblock, **nowblock;
- VOID *nextitem;
- VOID *deaditemstack;
- VOID **pathblock;
- VOID *pathitem;
- int alignbytes;
- int itembytes;
- int itemsperblock;
- int itemsfirstblock;
- long items, maxitems;
- int unallocateditems;
- int pathitemsleft;
-};
-
/* Global constants. */
@@ -647,168 +353,6 @@ REAL o3derrboundA, o3derrboundB, o3derrboundC;
unsigned long randomseed; /* Current random number seed. */
-/* Mesh data structure. Triangle operates on only one mesh, but the mesh */
-/* structure is used (instead of global variables) to allow reentrancy. */
-
-struct mesh {
-
-/* Variables used to allocate memory for triangles, subsegments, vertices, */
-/* viri (triangles being eaten), encroached segments, bad (skinny or too */
-/* large) triangles, and splay tree nodes. */
-
- struct memorypool triangles;
- struct memorypool subsegs;
- struct memorypool vertices;
- struct memorypool viri;
- struct memorypool badsubsegs;
- struct memorypool badtriangles;
- struct memorypool flipstackers;
- struct memorypool splaynodes;
-
-/* Variables that maintain the bad triangle queues. The queues are */
-/* ordered from 4095 (highest priority) to 0 (lowest priority). */
-
- struct badtriang *queuefront[4096];
- struct badtriang *queuetail[4096];
- int nextnonemptyq[4096];
- int firstnonemptyq;
-
-/* Variable that maintains the stack of recently flipped triangles. */
-
- struct flipstacker *lastflip;
-
-/* Other variables. */
-
- REAL xmin, xmax, ymin, ymax; /* x and y bounds. */
- REAL xminextreme; /* Nonexistent x value used as a flag in sweepline. */
- int invertices; /* Number of input vertices. */
- int inelements; /* Number of input triangles. */
- int insegments; /* Number of input segments. */
- int holes; /* Number of input holes. */
- int regions; /* Number of input regions. */
- int undeads; /* Number of input vertices that don't appear in the mesh. */
- long edges; /* Number of output edges. */
- int mesh_dim; /* Dimension (ought to be 2). */
- int nextras; /* Number of attributes per vertex. */
- int eextras; /* Number of attributes per triangle. */
- long hullsize; /* Number of edges in convex hull. */
- int steinerleft; /* Number of Steiner points not yet used. */
- int vertexmarkindex; /* Index to find boundary marker of a vertex. */
- int vertex2triindex; /* Index to find a triangle adjacent to a vertex. */
- int highorderindex; /* Index to find extra nodes for high-order elements. */
- int elemattribindex; /* Index to find attributes of a triangle. */
- int areaboundindex; /* Index to find area bound of a triangle. */
- int checksegments; /* Are there segments in the triangulation yet? */
- int checkquality; /* Has quality triangulation begun yet? */
- int readnodefile; /* Has a .node file been read? */
- long samples; /* Number of random samples for point location. */
-
- long incirclecount; /* Number of incircle tests performed. */
- long counterclockcount; /* Number of counterclockwise tests performed. */
- long orient3dcount; /* Number of 3D orientation tests performed. */
- long hyperbolacount; /* Number of right-of-hyperbola tests performed. */
- long circumcentercount; /* Number of circumcenter calculations performed. */
- long circletopcount; /* Number of circle top calculations performed. */
-
-/* Triangular bounding box vertices. */
-
- vertex infvertex1, infvertex2, infvertex3;
-
-/* Pointer to the `triangle' that occupies all of "outer space." */
-
- triangle *dummytri;
- triangle *dummytribase; /* Keep base address so we can free() it later. */
-
-/* Pointer to the omnipresent subsegment. Referenced by any triangle or */
-/* subsegment that isn't really connected to a subsegment at that */
-/* location. */
-
- subseg *dummysub;
- subseg *dummysubbase; /* Keep base address so we can free() it later. */
-
-/* Pointer to a recently visited triangle. Improves point location if */
-/* proximate vertices are inserted sequentially. */
-
- struct otri recenttri;
-
-}; /* End of `struct mesh'. */
-
-
-/* Data structure for command line switches and file names. This structure */
-/* is used (instead of global variables) to allow reentrancy. */
-
-struct behavior {
-
-/* Switches for the triangulator. */
-/* poly: -p switch. refine: -r switch. */
-/* quality: -q switch. */
-/* minangle: minimum angle bound, specified after -q switch. */
-/* goodangle: cosine squared of minangle. */
-/* offconstant: constant used to place off-center Steiner points. */
-/* vararea: -a switch without number. */
-/* fixedarea: -a switch with number. */
-/* maxarea: maximum area bound, specified after -a switch. */
-/* usertest: -u switch. */
-/* regionattrib: -A switch. convex: -c switch. */
-/* weighted: 1 for -w switch, 2 for -W switch. jettison: -j switch */
-/* firstnumber: inverse of -z switch. All items are numbered starting */
-/* from `firstnumber'. */
-/* edgesout: -e switch. voronoi: -v switch. */
-/* neighbors: -n switch. geomview: -g switch. */
-/* nobound: -B switch. nopolywritten: -P switch. */
-/* nonodewritten: -N switch. noelewritten: -E switch. */
-/* noiterationnum: -I switch. noholes: -O switch. */
-/* noexact: -X switch. */
-/* order: element order, specified after -o switch. */
-/* nobisect: count of how often -Y switch is selected. */
-/* steiner: maximum number of Steiner points, specified after -S switch. */
-/* incremental: -i switch. sweepline: -F switch. */
-/* dwyer: inverse of -l switch. */
-/* splitseg: -s switch. */
-/* conformdel: -D switch. docheck: -C switch. */
-/* quiet: -Q switch. verbose: count of how often -V switch is selected. */
-/* usesegments: -p, -r, -q, or -c switch; determines whether segments are */
-/* used at all. */
-/* */
-/* Read the instructions to find out the meaning of these switches. */
-
- int poly, refine, quality, vararea, fixedarea, usertest;
- int regionattrib, convex, weighted, jettison;
- int firstnumber;
- int edgesout, voronoi, neighbors, geomview;
- int nobound, nopolywritten, nonodewritten, noelewritten, noiterationnum;
- int noholes, noexact, conformdel;
- int incremental, sweepline, dwyer;
- int splitseg;
- int docheck;
- int quiet, verbose;
- int usesegments;
- int order;
- int nobisect;
- int steiner;
- REAL minangle, goodangle, offconstant;
- REAL maxarea;
-
-/* Variables for file names. */
-
-#ifndef TRILIBRARY
- char innodefilename[FILENAMESIZE];
- char inelefilename[FILENAMESIZE];
- char inpolyfilename[FILENAMESIZE];
- char areafilename[FILENAMESIZE];
- char outnodefilename[FILENAMESIZE];
- char outelefilename[FILENAMESIZE];
- char outpolyfilename[FILENAMESIZE];
- char edgefilename[FILENAMESIZE];
- char vnodefilename[FILENAMESIZE];
- char vedgefilename[FILENAMESIZE];
- char neighborfilename[FILENAMESIZE];
- char offfilename[FILENAMESIZE];
-#endif /* not TRILIBRARY */
-
-}; /* End of `struct behavior'. */
-
-
/*****************************************************************************/
/* */
/* Mesh manipulation primitives. Each triangle contains three pointers to */
@@ -919,11 +463,6 @@ struct behavior {
/** **/
/** **/
-/* Fast lookup arrays to speed some of the mesh manipulation primitives. */
-
-int plus1mod3[3] = {1, 2, 0};
-int minus1mod3[3] = {2, 0, 1};
-
/********* Primitives for triangles *********/
/* */
/* */
@@ -1053,18 +592,9 @@ int minus1mod3[3] = {2, 0, 1};
lprevself(otri); \
symself(otri);
-/* These primitives determine or set the origin, destination, or apex of a */
+/* These primitives set the origin, destination, or apex of a */
/* triangle. */
-#define org(otri, vertexptr) \
- vertexptr = (vertex) (otri).tri[plus1mod3[(otri).orient] + 3]
-
-#define dest(otri, vertexptr) \
- vertexptr = (vertex) (otri).tri[minus1mod3[(otri).orient] + 3]
-
-#define apex(otri, vertexptr) \
- vertexptr = (vertex) (otri).tri[(otri).orient + 3]
-
#define setorg(otri, vertexptr) \
(otri).tri[plus1mod3[(otri).orient] + 3] = (triangle) vertexptr
@@ -1146,16 +676,6 @@ int minus1mod3[3] = {2, 0, 1};
/* */
/* */
-/* sdecode() converts a pointer to an oriented subsegment. The orientation */
-/* is extracted from the least significant bit of the pointer. The two */
-/* least significant bits (one for orientation, one for viral infection) */
-/* are masked out to produce the real pointer. */
-
-#define sdecode(sptr, osub) \
- (osub).ssorient = (int) ((unsigned long) (sptr) & (unsigned long) 1l); \
- (osub).ss = (subseg *) \
- ((unsigned long) (sptr) & ~ (unsigned long) 3l)
-
/* sencode() compresses an oriented subsegment into a single pointer. It */
/* relies on the assumption that all subsegments are aligned to two-byte */
/* boundaries, so the least significant bit of (osub).ss is zero. */
@@ -1221,12 +741,10 @@ int minus1mod3[3] = {2, 0, 1};
#define setsegdest(osub, vertexptr) \
(osub).ss[5 - (osub).ssorient] = (subseg) vertexptr
-/* These primitives read or set a boundary marker. Boundary markers are */
+/* This primitive sets a boundary marker. Boundary markers are */
/* used to hold user-defined tags for setting boundary conditions in */
/* finite element solvers. */
-#define mark(osub) (* (int *) ((osub).ss + 8))
-
#define setmark(osub, value) \
* (int *) ((osub).ss + 8) = value
@@ -1302,16 +820,6 @@ int minus1mod3[3] = {2, 0, 1};
/* */
/* */
-#define vertexmark(vx) ((int *) (vx))[m->vertexmarkindex]
-
-#define setvertexmark(vx, value) \
- ((int *) (vx))[m->vertexmarkindex] = value
-
-#define vertextype(vx) ((int *) (vx))[m->vertexmarkindex + 1]
-
-#define setvertextype(vx, value) \
- ((int *) (vx))[m->vertexmarkindex + 1] = value
-
#define vertex2tri(vx) ((triangle *) (vx))[m->vertex2triindex]
#define setvertex2tri(vx, value) \
diff --git a/triangle.h b/triangle.h
index aa1ee39..4b8e6f5 100644
--- a/triangle.h
+++ b/triangle.h
@@ -248,6 +248,33 @@
/* */
/*****************************************************************************/
+/* Moved here from triangle.c by Adam Powell 2006/8/12 */
+/* Note the triangle library in the Debian package uses REAL=double */
+/* */
+/* For single precision (which will save some memory and reduce paging), */
+/* define the symbol SINGLE by using the -DSINGLE compiler switch or by */
+/* writing "#define SINGLE" below. */
+/* */
+/* For double precision (which will allow you to refine meshes to a smaller */
+/* edge length), leave SINGLE undefined. */
+/* */
+/* Double precision uses more memory, but improves the resolution of the */
+/* meshes you can generate with Triangle. It also reduces the likelihood */
+/* of a floating exception due to overflow. Finally, it is much faster */
+/* than single precision on 64-bit architectures like the DEC Alpha. I */
+/* recommend double precision unless you want to generate a mesh for which */
+/* you do not have enough memory. */
+
+/* #define SINGLE */
+
+/*#ifdef SINGLE
+#define REAL float
+#else /* not SINGLE */
+#define REAL double
+/*#endif /* not SINGLE */
+
+#define ANSI_DECLARATORS
+
struct triangulateio {
REAL *pointlist; /* In / out */
REAL *pointattributelist; /* In / out */
@@ -289,3 +316,538 @@ void trifree(VOID *memptr);
void triangulate();
void trifree();
#endif /* not ANSI_DECLARATORS */
+
+/*****************************************************************************/
+/* */
+/* The remainder of this file is moved from triangle.c by Adam Powell */
+/* 2006/8/12 to expose more of the API, e.g. to OpenCACSCADE. */
+/* */
+/*****************************************************************************/
+
+/* The vertex types. A DEADVERTEX has been deleted entirely. An */
+/* UNDEADVERTEX is not part of the mesh, but is written to the output */
+/* .node file and affects the node indexing in the other output files. */
+
+#define INPUTVERTEX 0
+#define SEGMENTVERTEX 1
+#define FREEVERTEX 2
+#define DEADVERTEX -32768
+#define UNDEADVERTEX -32767
+
+/* Maximum number of characters in a file name (including the null). */
+
+#define FILENAMESIZE 2048
+
+#include <stdlib.h>
+
+/* Labels that signify the result of vertex insertion. The result indicates */
+/* that the vertex was inserted with complete success, was inserted but */
+/* encroaches upon a subsegment, was not inserted because it lies on a */
+/* segment, or was not inserted because another vertex occupies the same */
+/* location. */
+
+enum insertvertexresult {SUCCESSFULVERTEX, ENCROACHINGVERTEX, VIOLATINGVERTEX,
+ DUPLICATEVERTEX};
+
+/*****************************************************************************/
+/* */
+/* The basic mesh data structures */
+/* */
+/* There are three: vertices, triangles, and subsegments (abbreviated */
+/* `subseg'). These three data structures, linked by pointers, comprise */
+/* the mesh. A vertex simply represents a mesh vertex and its properties. */
+/* A triangle is a triangle. A subsegment is a special data structure used */
+/* to represent an impenetrable edge of the mesh (perhaps on the outer */
+/* boundary, on the boundary of a hole, or part of an internal boundary */
+/* separating two triangulated regions). Subsegments represent boundaries, */
+/* defined by the user, that triangles may not lie across. */
+/* */
+/* A triangle consists of a list of three vertices, a list of three */
+/* adjoining triangles, a list of three adjoining subsegments (when */
+/* segments exist), an arbitrary number of optional user-defined */
+/* floating-point attributes, and an optional area constraint. The latter */
+/* is an upper bound on the permissible area of each triangle in a region, */
+/* used for mesh refinement. */
+/* */
+/* For a triangle on a boundary of the mesh, some or all of the neighboring */
+/* triangles may not be present. For a triangle in the interior of the */
+/* mesh, often no neighboring subsegments are present. Such absent */
+/* triangles and subsegments are never represented by NULL pointers; they */
+/* are represented by two special records: `dummytri', the triangle that */
+/* fills "outer space", and `dummysub', the omnipresent subsegment. */
+/* `dummytri' and `dummysub' are used for several reasons; for instance, */
+/* they can be dereferenced and their contents examined without violating */
+/* protected memory. */
+/* */
+/* However, it is important to understand that a triangle includes other */
+/* information as well. The pointers to adjoining vertices, triangles, and */
+/* subsegments are ordered in a way that indicates their geometric relation */
+/* to each other. Furthermore, each of these pointers contains orientation */
+/* information. Each pointer to an adjoining triangle indicates which face */
+/* of that triangle is contacted. Similarly, each pointer to an adjoining */
+/* subsegment indicates which side of that subsegment is contacted, and how */
+/* the subsegment is oriented relative to the triangle. */
+/* */
+/* The data structure representing a subsegment may be thought to be */
+/* abutting the edge of one or two triangle data structures: either */
+/* sandwiched between two triangles, or resting against one triangle on an */
+/* exterior boundary or hole boundary. */
+/* */
+/* A subsegment consists of a list of four vertices--the vertices of the */
+/* subsegment, and the vertices of the segment it is a part of--a list of */
+/* two adjoining subsegments, and a list of two adjoining triangles. One */
+/* of the two adjoining triangles may not be present (though there should */
+/* always be one), and neighboring subsegments might not be present. */
+/* Subsegments also store a user-defined integer "boundary marker". */
+/* Typically, this integer is used to indicate what boundary conditions are */
+/* to be applied at that location in a finite element simulation. */
+/* */
+/* Like triangles, subsegments maintain information about the relative */
+/* orientation of neighboring objects. */
+/* */
+/* Vertices are relatively simple. A vertex is a list of floating-point */
+/* numbers, starting with the x, and y coordinates, followed by an */
+/* arbitrary number of optional user-defined floating-point attributes, */
+/* followed by an integer boundary marker. During the segment insertion */
+/* phase, there is also a pointer from each vertex to a triangle that may */
+/* contain it. Each pointer is not always correct, but when one is, it */
+/* speeds up segment insertion. These pointers are assigned values once */
+/* at the beginning of the segment insertion phase, and are not used or */
+/* updated except during this phase. Edge flipping during segment */
+/* insertion will render some of them incorrect. Hence, don't rely upon */
+/* them for anything. */
+/* */
+/* Other than the exception mentioned above, vertices have no information */
+/* about what triangles, subfacets, or subsegments they are linked to. */
+/* */
+/*****************************************************************************/
+
+/*****************************************************************************/
+/* */
+/* Handles */
+/* */
+/* The oriented triangle (`otri') and oriented subsegment (`osub') data */
+/* structures defined below do not themselves store any part of the mesh. */
+/* The mesh itself is made of `triangle's, `subseg's, and `vertex's. */
+/* */
+/* Oriented triangles and oriented subsegments will usually be referred to */
+/* as "handles." A handle is essentially a pointer into the mesh; it */
+/* allows you to "hold" one particular part of the mesh. Handles are used */
+/* to specify the regions in which one is traversing and modifying the mesh.*/
+/* A single `triangle' may be held by many handles, or none at all. (The */
+/* latter case is not a memory leak, because the triangle is still */
+/* connected to other triangles in the mesh.) */
+/* */
+/* An `otri' is a handle that holds a triangle. It holds a specific edge */
+/* of the triangle. An `osub' is a handle that holds a subsegment. It */
+/* holds either the left or right side of the subsegment. */
+/* */
+/* Navigation about the mesh is accomplished through a set of mesh */
+/* manipulation primitives, further below. Many of these primitives take */
+/* a handle and produce a new handle that holds the mesh near the first */
+/* handle. Other primitives take two handles and glue the corresponding */
+/* parts of the mesh together. The orientation of the handles is */
+/* important. For instance, when two triangles are glued together by the */
+/* bond() primitive, they are glued at the edges on which the handles lie. */
+/* */
+/* Because vertices have no information about which triangles they are */
+/* attached to, I commonly represent a vertex by use of a handle whose */
+/* origin is the vertex. A single handle can simultaneously represent a */
+/* triangle, an edge, and a vertex. */
+/* */
+/*****************************************************************************/
+
+/* The triangle data structure. Each triangle contains three pointers to */
+/* adjoining triangles, plus three pointers to vertices, plus three */
+/* pointers to subsegments (declared below; these pointers are usually */
+/* `dummysub'). It may or may not also contain user-defined attributes */
+/* and/or a floating-point "area constraint." It may also contain extra */
+/* pointers for nodes, when the user asks for high-order elements. */
+/* Because the size and structure of a `triangle' is not decided until */
+/* runtime, I haven't simply declared the type `triangle' as a struct. */
+
+typedef REAL **triangle; /* Really: typedef triangle *triangle */
+
+/* An oriented triangle: includes a pointer to a triangle and orientation. */
+/* The orientation denotes an edge of the triangle. Hence, there are */
+/* three possible orientations. By convention, each edge always points */
+/* counterclockwise about the corresponding triangle. */
+
+struct otri {
+ triangle *tri;
+ int orient; /* Ranges from 0 to 2. */
+};
+
+/* The subsegment data structure. Each subsegment contains two pointers to */
+/* adjoining subsegments, plus four pointers to vertices, plus two */
+/* pointers to adjoining triangles, plus one boundary marker, plus one */
+/* segment number. */
+
+typedef REAL **subseg; /* Really: typedef subseg *subseg */
+
+/* An oriented subsegment: includes a pointer to a subsegment and an */
+/* orientation. The orientation denotes a side of the edge. Hence, there */
+/* are two possible orientations. By convention, the edge is always */
+/* directed so that the "side" denoted is the right side of the edge. */
+
+struct osub {
+ subseg *ss;
+ int ssorient; /* Ranges from 0 to 1. */
+};
+
+/* The vertex data structure. Each vertex is actually an array of REALs. */
+/* The number of REALs is unknown until runtime. An integer boundary */
+/* marker, and sometimes a pointer to a triangle, is appended after the */
+/* REALs. */
+
+typedef REAL *vertex;
+
+/* A queue used to store encroached subsegments. Each subsegment's vertices */
+/* are stored so that we can check whether a subsegment is still the same. */
+
+struct badsubseg {
+ subseg encsubseg; /* An encroached subsegment. */
+ vertex subsegorg, subsegdest; /* Its two vertices. */
+};
+
+/* A queue used to store bad triangles. The key is the square of the cosine */
+/* of the smallest angle of the triangle. Each triangle's vertices are */
+/* stored so that one can check whether a triangle is still the same. */
+
+struct badtriang {
+ triangle poortri; /* A skinny or too-large triangle. */
+ REAL key; /* cos^2 of smallest (apical) angle. */
+ vertex triangorg, triangdest, triangapex; /* Its three vertices. */
+ struct badtriang *nexttriang; /* Pointer to next bad triangle. */
+};
+
+/* A stack of triangles flipped during the most recent vertex insertion. */
+/* The stack is used to undo the vertex insertion if the vertex encroaches */
+/* upon a subsegment. */
+
+struct flipstacker {
+ triangle flippedtri; /* A recently flipped triangle. */
+ struct flipstacker *prevflip; /* Previous flip in the stack. */
+};
+
+/* A node in a heap used to store events for the sweepline Delaunay */
+/* algorithm. Nodes do not point directly to their parents or children in */
+/* the heap. Instead, each node knows its position in the heap, and can */
+/* look up its parent and children in a separate array. The `eventptr' */
+/* points either to a `vertex' or to a triangle (in encoded format, so */
+/* that an orientation is included). In the latter case, the origin of */
+/* the oriented triangle is the apex of a "circle event" of the sweepline */
+/* algorithm. To distinguish site events from circle events, all circle */
+/* events are given an invalid (smaller than `xmin') x-coordinate `xkey'. */
+
+struct event {
+ REAL xkey, ykey; /* Coordinates of the event. */
+ VOID *eventptr; /* Can be a vertex or the location of a circle event. */
+ int heapposition; /* Marks this event's position in the heap. */
+};
+
+/* A node in the splay tree. Each node holds an oriented ghost triangle */
+/* that represents a boundary edge of the growing triangulation. When a */
+/* circle event covers two boundary edges with a triangle, so that they */
+/* are no longer boundary edges, those edges are not immediately deleted */
+/* from the tree; rather, they are lazily deleted when they are next */
+/* encountered. (Since only a random sample of boundary edges are kept */
+/* in the tree, lazy deletion is faster.) `keydest' is used to verify */
+/* that a triangle is still the same as when it entered the splay tree; if */
+/* it has been rotated (due to a circle event), it no longer represents a */
+/* boundary edge and should be deleted. */
+
+struct splaynode {
+ struct otri keyedge; /* Lprev of an edge on the front. */
+ vertex keydest; /* Used to verify that splay node is still live. */
+ struct splaynode *lchild, *rchild; /* Children in splay tree. */
+};
+
+/* A type used to allocate memory. firstblock is the first block of items. */
+/* nowblock is the block from which items are currently being allocated. */
+/* nextitem points to the next slab of free memory for an item. */
+/* deaditemstack is the head of a linked list (stack) of deallocated items */
+/* that can be recycled. unallocateditems is the number of items that */
+/* remain to be allocated from nowblock. */
+/* */
+/* Traversal is the process of walking through the entire list of items, and */
+/* is separate from allocation. Note that a traversal will visit items on */
+/* the "deaditemstack" stack as well as live items. pathblock points to */
+/* the block currently being traversed. pathitem points to the next item */
+/* to be traversed. pathitemsleft is the number of items that remain to */
+/* be traversed in pathblock. */
+/* */
+/* alignbytes determines how new records should be aligned in memory. */
+/* itembytes is the length of a record in bytes (after rounding up). */
+/* itemsperblock is the number of items allocated at once in a single */
+/* block. itemsfirstblock is the number of items in the first block, */
+/* which can vary from the others. items is the number of currently */
+/* allocated items. maxitems is the maximum number of items that have */
+/* been allocated at once; it is the current number of items plus the */
+/* number of records kept on deaditemstack. */
+
+struct memorypool {
+ VOID **firstblock, **nowblock;
+ VOID *nextitem;
+ VOID *deaditemstack;
+ VOID **pathblock;
+ VOID *pathitem;
+ int alignbytes;
+ int itembytes;
+ int itemsperblock;
+ int itemsfirstblock;
+ long items, maxitems;
+ int unallocateditems;
+ int pathitemsleft;
+};
+
+
+/* Mesh data structure. Triangle operates on only one mesh, but the mesh */
+/* structure is used (instead of global variables) to allow reentrancy. */
+
+struct mesh {
+
+/* Variables used to allocate memory for triangles, subsegments, vertices, */
+/* viri (triangles being eaten), encroached segments, bad (skinny or too */
+/* large) triangles, and splay tree nodes. */
+
+ struct memorypool triangles;
+ struct memorypool subsegs;
+ struct memorypool vertices;
+ struct memorypool viri;
+ struct memorypool badsubsegs;
+ struct memorypool badtriangles;
+ struct memorypool flipstackers;
+ struct memorypool splaynodes;
+
+/* Variables that maintain the bad triangle queues. The queues are */
+/* ordered from 4095 (highest priority) to 0 (lowest priority). */
+
+ struct badtriang *queuefront[4096];
+ struct badtriang *queuetail[4096];
+ int nextnonemptyq[4096];
+ int firstnonemptyq;
+
+/* Variable that maintains the stack of recently flipped triangles. */
+
+ struct flipstacker *lastflip;
+
+/* Other variables. */
+
+ REAL xmin, xmax, ymin, ymax; /* x and y bounds. */
+ REAL xminextreme; /* Nonexistent x value used as a flag in sweepline. */
+ int invertices; /* Number of input vertices. */
+ int inelements; /* Number of input triangles. */
+ int insegments; /* Number of input segments. */
+ int holes; /* Number of input holes. */
+ int regions; /* Number of input regions. */
+ int undeads; /* Number of input vertices that don't appear in the mesh. */
+ long edges; /* Number of output edges. */
+ int mesh_dim; /* Dimension (ought to be 2). */
+ int nextras; /* Number of attributes per vertex. */
+ int eextras; /* Number of attributes per triangle. */
+ long hullsize; /* Number of edges in convex hull. */
+ int steinerleft; /* Number of Steiner points not yet used. */
+ int vertexmarkindex; /* Index to find boundary marker of a vertex. */
+ int vertex2triindex; /* Index to find a triangle adjacent to a vertex. */
+ int highorderindex; /* Index to find extra nodes for high-order elements. */
+ int elemattribindex; /* Index to find attributes of a triangle. */
+ int areaboundindex; /* Index to find area bound of a triangle. */
+ int checksegments; /* Are there segments in the triangulation yet? */
+ int checkquality; /* Has quality triangulation begun yet? */
+ int readnodefile; /* Has a .node file been read? */
+ long samples; /* Number of random samples for point location. */
+
+ long incirclecount; /* Number of incircle tests performed. */
+ long counterclockcount; /* Number of counterclockwise tests performed. */
+ long orient3dcount; /* Number of 3D orientation tests performed. */
+ long hyperbolacount; /* Number of right-of-hyperbola tests performed. */
+ long circumcentercount; /* Number of circumcenter calculations performed. */
+ long circletopcount; /* Number of circle top calculations performed. */
+
+/* Triangular bounding box vertices. */
+
+ vertex infvertex1, infvertex2, infvertex3;
+
+/* Pointer to the `triangle' that occupies all of "outer space." */
+
+ triangle *dummytri;
+ triangle *dummytribase; /* Keep base address so we can free() it later. */
+
+/* Pointer to the omnipresent subsegment. Referenced by any triangle or */
+/* subsegment that isn't really connected to a subsegment at that */
+/* location. */
+
+ subseg *dummysub;
+ subseg *dummysubbase; /* Keep base address so we can free() it later. */
+
+/* Pointer to a recently visited triangle. Improves point location if */
+/* proximate vertices are inserted sequentially. */
+
+ struct otri recenttri;
+
+}; /* End of `struct mesh'. */
+
+
+/* Data structure for command line switches and file names. This structure */
+/* is used (instead of global variables) to allow reentrancy. */
+
+struct behavior {
+
+/* Switches for the triangulator. */
+/* poly: -p switch. refine: -r switch. */
+/* quality: -q switch. */
+/* minangle: minimum angle bound, specified after -q switch. */
+/* goodangle: cosine squared of minangle. */
+/* offconstant: constant used to place off-center Steiner points. */
+/* vararea: -a switch without number. */
+/* fixedarea: -a switch with number. */
+/* maxarea: maximum area bound, specified after -a switch. */
+/* usertest: -u switch. */
+/* regionattrib: -A switch. convex: -c switch. */
+/* weighted: 1 for -w switch, 2 for -W switch. jettison: -j switch */
+/* firstnumber: inverse of -z switch. All items are numbered starting */
+/* from `firstnumber'. */
+/* edgesout: -e switch. voronoi: -v switch. */
+/* neighbors: -n switch. geomview: -g switch. */
+/* nobound: -B switch. nopolywritten: -P switch. */
+/* nonodewritten: -N switch. noelewritten: -E switch. */
+/* noiterationnum: -I switch. noholes: -O switch. */
+/* noexact: -X switch. */
+/* order: element order, specified after -o switch. */
+/* nobisect: count of how often -Y switch is selected. */
+/* steiner: maximum number of Steiner points, specified after -S switch. */
+/* incremental: -i switch. sweepline: -F switch. */
+/* dwyer: inverse of -l switch. */
+/* splitseg: -s switch. */
+/* conformdel: -D switch. docheck: -C switch. */
+/* quiet: -Q switch. verbose: count of how often -V switch is selected. */
+/* usesegments: -p, -r, -q, or -c switch; determines whether segments are */
+/* used at all. */
+/* */
+/* Read the instructions to find out the meaning of these switches. */
+
+ int poly, refine, quality, vararea, fixedarea, usertest;
+ int regionattrib, convex, weighted, jettison;
+ int firstnumber;
+ int edgesout, voronoi, neighbors, geomview;
+ int nobound, nopolywritten, nonodewritten, noelewritten, noiterationnum;
+ int noholes, noexact, conformdel;
+ int incremental, sweepline, dwyer;
+ int splitseg;
+ int docheck;
+ int quiet, verbose;
+ int usesegments;
+ int order;
+ int nobisect;
+ int steiner;
+ REAL minangle, goodangle, offconstant;
+ REAL maxarea;
+
+/* Variables for file names. */
+
+#ifndef TRILIBRARY
+ char innodefilename[FILENAMESIZE];
+ char inelefilename[FILENAMESIZE];
+ char inpolyfilename[FILENAMESIZE];
+ char areafilename[FILENAMESIZE];
+ char outnodefilename[FILENAMESIZE];
+ char outelefilename[FILENAMESIZE];
+ char outpolyfilename[FILENAMESIZE];
+ char edgefilename[FILENAMESIZE];
+ char vnodefilename[FILENAMESIZE];
+ char vedgefilename[FILENAMESIZE];
+ char neighborfilename[FILENAMESIZE];
+ char offfilename[FILENAMESIZE];
+#endif /* not TRILIBRARY */
+
+}; /* End of `struct behavior'. */
+
+/* Fast lookup arrays to speed some of the mesh manipulation primitives. */
+
+static int plus1mod3[3] = {1, 2, 0};
+static int minus1mod3[3] = {2, 0, 1};
+
+/* These primitives determine the origin, destination, or apex of a */
+/* triangle. */
+
+#define org(otri, vertexptr) \
+ vertexptr = (vertex) (otri).tri[plus1mod3[(otri).orient] + 3]
+
+#define dest(otri, vertexptr) \
+ vertexptr = (vertex) (otri).tri[minus1mod3[(otri).orient] + 3]
+
+#define apex(otri, vertexptr) \
+ vertexptr = (vertex) (otri).tri[(otri).orient + 3]
+
+/* sdecode() converts a pointer to an oriented subsegment. The orientation */
+/* is extracted from the least significant bit of the pointer. The two */
+/* least significant bits (one for orientation, one for viral infection) */
+/* are masked out to produce the real pointer. */
+
+#define sdecode(sptr, osub) \
+ (osub).ssorient = (int) ((unsigned long) (sptr) & (unsigned long) 1l); \
+ (osub).ss = (subseg *) \
+ ((unsigned long) (sptr) & ~ (unsigned long) 3l)
+
+/* This primitive reads a boundary marker. Boundary markers are */
+/* used to hold user-defined tags for setting boundary conditions in */
+/* finite element solvers. */
+
+#define mark(osub) (* (int *) ((osub).ss + 8))
+
+/********* Primitives for vertices *********/
+/* */
+/* */
+
+#define vertexmark(vx) ((int *) (vx))[m->vertexmarkindex]
+
+#define setvertexmark(vx, value) \
+ ((int *) (vx))[m->vertexmarkindex] = value
+
+#define vertextype(vx) ((int *) (vx))[m->vertexmarkindex + 1]
+
+#define setvertextype(vx, value) \
+ ((int *) (vx))[m->vertexmarkindex + 1] = value
+
+
+/********* Function prototypes *********/
+
+#ifdef ANSI_DECLARATORS
+void *poolalloc(struct memorypool *pool);
+void traversalinit(struct memorypool *pool);
+void initializevertexpool(struct mesh *m, struct behavior *b);
+triangle *triangletraverse(struct mesh *m);
+void vertexdealloc(struct mesh *m, vertex dyingvertex);
+vertex vertextraverse(struct mesh *m);
+vertex getvertex(struct mesh *m, struct behavior *b, int number);
+void triangledeinit(struct mesh *m, struct behavior *b);
+void triangleinit(struct mesh *m);
+void makevertexmap(struct mesh *m, struct behavior *b);
+enum insertvertexresult insertvertex(struct mesh *m, struct behavior *b,
+ vertex newvertex, struct otri *searchtri,
+ struct osub *splitseg,
+ int segmentflaws, int triflaws);
+long delaunay(struct mesh *m, struct behavior *b);
+void insertsegment(struct mesh *m, struct behavior *b,
+ vertex endpoint1, vertex endpoint2, int newmark);
+void carveholes(struct mesh *m, struct behavior *b, REAL *holelist, int holes,
+ REAL *regionlist, int regions);
+void enforcequality(struct mesh *m, struct behavior *b);
+#else /* not ANSI_DECLARATORS */
+void *poolalloc();
+void traversalinit();
+void initializevertexpool();
+triangle *triangletraverse();
+void vertexdealloc();
+vertex vertextraverse();
+vertex getvertex();
+void triangledeinit();
+void triangleinit();
+void makevertexmap();
+enum insertvertexresult insertvertex();
+long delaunay();
+void insertsegment();
+void carveholes();
+void enforcequality();
+#endif /* not ANSI_DECLARATORS */
|