From e2c3dedb96784377ccc7c1b665460d2c400aa0c2 Mon Sep 17 00:00:00 2001 From: Yi Zhang Date: Tue, 3 Aug 2021 10:21:01 +0800 Subject: [PATCH] initial upload --- .gitignore | 2 + CMakeLists.txt | 15 + LICENSE | 666 + README | 41 + config.sh | 17 + src/CMakeLists.txt | 54 + src/lib/predicates.cxx | 4702 ++++++ src/lib/tetgen.cxx | 32520 ++++++++++++++++++++++++++++++++++++++ src/lib/tetgen.h | 3438 ++++ src/sample/tetcall.cxx | 198 + src/tool/predicates.cxx | 4702 ++++++ src/tool/tetgen.cxx | 32520 ++++++++++++++++++++++++++++++++++++++ src/tool/tetgen.h | 3438 ++++ tetgen_manual.pdf | Bin 0 -> 3952041 bytes 14 files changed, 82313 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 LICENSE create mode 100644 README create mode 100755 config.sh create mode 100644 src/CMakeLists.txt create mode 100644 src/lib/predicates.cxx create mode 100644 src/lib/tetgen.cxx create mode 100644 src/lib/tetgen.h create mode 100644 src/sample/tetcall.cxx create mode 100644 src/tool/predicates.cxx create mode 100644 src/tool/tetgen.cxx create mode 100644 src/tool/tetgen.h create mode 100644 tetgen_manual.pdf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d56cb93 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build/ +.DS_Store \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..f9ee6f2 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.15.2) + +# 设置工程名称和语言 +project(TETGEN) + +message(STATUS "Platform: " ${CMAKE_HOST_SYSTEM_NAME}) +if(${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Windows") + #set(CMAKE_C_COMPILER gcc) + #set(CMAKE_CXX_COMPILER g++) + set(CMAKE_INSTALL_PREFIX D:/Library) +endif() +message(STATUS "Install prefix: " ${CMAKE_INSTALL_PREFIX}) + +# 添加源文件地址 +add_subdirectory(src/) \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e253c3d --- /dev/null +++ b/LICENSE @@ -0,0 +1,666 @@ +TetGen License +-------------- + +TetGen is distributed under a dual licensing scheme. You can +redistribute it and/or modify it under the terms of the GNU Affero +General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later +version. A copy of the GNU Affero General Public License is reproduced +below. + +If the terms and conditions of the AGPL v.3. would prevent you from +using TetGen, please consider the option to obtain a commercial +license for a fee. These licenses are offered by the Weierstrass +Institute for Applied Analysis and Stochastics (WIAS). As a rule, +licenses are provided "as-is", unlimited in time for a one time +fee. Please send corresponding requests to: +tetgen@wias-berlin.de. Please do not forget to include some +description of your company and the realm of its activities. + +===================================================================== +GNU AFFERO GENERAL PUBLIC LICENSE + +Version 3, 19 November 2007 + +Copyright © 2007 Free Software Foundation, Inc. +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +Preamble + +The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + +The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains +free software for all its users. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + +Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + +A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come +about. The GNU General Public License permits making a modified +version and letting the public access it on a server without ever +releasing its source code to the public. + +The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + +An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing +under this license. + +The precise terms and conditions for copying, distribution and +modification follow. + +TERMS AND CONDITIONS + +0. Definitions. + +"This License" refers to version 3 of the GNU Affero General Public +License. + +"Copyright" also means copyright-like laws that apply to other kinds +of works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of +an exact copy. The resulting work is called a "modified version" of +the earlier work or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based +on the Program. + +To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user +through a computer network, with no transfer of a copy, is not +conveying. + +An interactive user interface displays "Appropriate Legal Notices" to +the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +1. Source Code. + +The "source code" for a work means the preferred form of the work for +making modifications to it. "Object code" means any non-source form of +a work. + +A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can +regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same +work. + +2. Basic Permissions. + +All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, +without conditions so long as your license otherwise remains in +force. You may convey covered works to others for the sole purpose of +having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the +conditions stated below. Sublicensing is not allowed; section 10 makes +it unnecessary. + +3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such +circumvention is effected by exercising rights under this License with +respect to the covered work, and you disclaim any intention to limit +operation or modification of the work as a means of enforcing, against +the work's users, your or third parties' legal rights to forbid +circumvention of technological measures. + +4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + +5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these +conditions: + +a) The work must carry prominent notices stating that you modified it, +and giving a relevant date. b) The work must carry prominent notices +stating that it is released under this License and any conditions +added under section 7. This requirement modifies the requirement in +section 4 to "keep intact all notices". c) You must license the +entire work, as a whole, under this License to anyone who comes into +possession of a copy. This License will therefore apply, along with +any applicable section 7 additional terms, to the whole of the work, +and all its parts, regardless of how they are packaged. This License +gives no permission to license the work in any other way, but it does +not invalidate such permission if you have separately received it. d) +If the work has interactive user interfaces, each must display +Appropriate Legal Notices; however, if the Program has interactive +interfaces that do not display Appropriate Legal Notices, your work +need not make them do so. A compilation of a covered work with other +separate and independent works, which are not by their nature +extensions of the covered work, and which are not combined with it +such as to form a larger program, in or on a volume of a storage or +distribution medium, is called an "aggregate" if the compilation and +its resulting copyright are not used to limit the access or legal +rights of the compilation's users beyond what the individual works +permit. Inclusion of a covered work in an aggregate does not cause +this License to apply to the other parts of the aggregate. + +6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of +sections 4 and 5, provided that you also convey the machine-readable +Corresponding Source under the terms of this License, in one of these +ways: + +a) Convey the object code in, or embodied in, a physical product +(including a physical distribution medium), accompanied by the +Corresponding Source fixed on a durable physical medium customarily +used for software interchange. b) Convey the object code in, or +embodied in, a physical product (including a physical distribution +medium), accompanied by a written offer, valid for at least three +years and valid for as long as you offer spare parts or customer +support for that product model, to give anyone who possesses the +object code either (1) a copy of the Corresponding Source for all the +software in the product that is covered by this License, on a durable +physical medium customarily used for software interchange, for a price +no more than your reasonable cost of physically performing this +conveying of source, or (2) access to copy the Corresponding Source +from a network server at no charge. c) Convey individual copies of +the object code with a copy of the written offer to provide the +Corresponding Source. This alternative is allowed only occasionally +and noncommercially, and only if you received the object code with +such an offer, in accord with subsection 6b. d) Convey the object +code by offering access from a designated place (gratis or for a +charge), and offer equivalent access to the Corresponding Source in +the same way through the same place at no further charge. You need not +require recipients to copy the Corresponding Source along with the +object code. If the place to copy the object code is a network server, +the Corresponding Source may be on a different server (operated by you +or a third party) that supports equivalent copying facilities, +provided you maintain clear directions next to the object code saying +where to find the Corresponding Source. Regardless of what server +hosts the Corresponding Source, you remain obligated to ensure that it +is available for as long as needed to satisfy these requirements. e) +Convey the object code using peer-to-peer transmission, provided you +inform other peers where the object code and Corresponding Source of +the work are being offered to the general public at no charge under +subsection 6d. A separable portion of the object code, whose source +code is excluded from the Corresponding Source as a System Library, +need not be included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, +family, or household purposes, or (2) anything designed or sold for +incorporation into a dwelling. In determining whether a product is a +consumer product, doubtful cases shall be resolved in favor of +coverage. For a particular product received by a particular user, +"normally used" refers to a typical or common use of that class of +product, regardless of the status of the particular user or of the way +in which the particular user actually uses, or expects or is expected +to use, the product. A product is a consumer product regardless of +whether the product has substantial commercial, industrial or +non-consumer uses, unless such uses represent the only significant +mode of use of the product. + +"Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to +install and execute modified versions of a covered work in that User +Product from a modified version of its Corresponding Source. The +information must suffice to ensure that the continued functioning of +the modified object code is in no case prevented or interfered with +solely because modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or +updates for a work that has been modified or installed by the +recipient, or for the User Product in which it has been modified or +installed. Access to a network may be denied when the modification +itself materially and adversely affects the operation of the network +or violates the rules and protocols for communication across the +network. + +Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + +7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its +conditions. Additional permissions that are applicable to the entire +Program shall be treated as though they were included in this License, +to the extent that they are valid under applicable law. If additional +permissions apply only to part of the Program, that part may be used +separately under those permissions, but the entire Program remains +governed by this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders +of that material) supplement the terms of this License with terms: + +a) Disclaiming warranty or limiting liability differently from the +terms of sections 15 and 16 of this License; or b) Requiring +preservation of specified reasonable legal notices or author +attributions in that material or in the Appropriate Legal Notices +displayed by works containing it; or c) Prohibiting misrepresentation +of the origin of that material, or requiring that modified versions of +such material be marked in reasonable ways as different from the +original version; or d) Limiting the use for publicity purposes of +names of licensors or authors of the material; or e) Declining to +grant rights under trademark law for use of some trade names, +trademarks, or service marks; or f) Requiring indemnification of +licensors and authors of that material by anyone who conveys the +material (or modified versions of it) with contractual assumptions of +liability to the recipient, for any liability that these contractual +assumptions directly impose on those licensors and authors. All other +non-permissive additional terms are considered "further restrictions" +within the meaning of section 10. If the Program as you received it, +or any part of it, contains a notice stating that it is governed by +this License along with a term that is a further restriction, you may +remove that term. If a license document contains a further restriction +but permits relicensing or conveying under this License, you may add +to a covered work material governed by the terms of that license +document, provided that the further restriction does not survive such +relicensing or conveying. + +If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; the +above requirements apply either way. + +8. Termination. + +You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + +9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run +a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + +10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + +11. Patents. + +A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims owned +or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + +If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + +A patent license is "discriminatory" if it does not include within the +scope of its coverage, prohibits the exercise of, or is conditioned on +the non-exercise of one or more of the rights that are specifically +granted under this License. You may not convey a covered work if you +are a party to an arrangement with a third party that is in the +business of distributing software, under which you make payment to the +third party based on the extent of your activity of conveying the +work, and under which the third party grants, to any of the parties +who would receive the covered work from you, a discriminatory patent +license (a) in connection with copies of the covered work conveyed by +you (or copies made from those copies), or (b) primarily for and in +connection with specific products or compilations that contain the +covered work, unless you entered into that arrangement, or that patent +license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + +12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under +this License and any other pertinent obligations, then as a +consequence you may not convey it at all. For example, if you agree to +terms that obligate you to collect a royalty for further conveying +from those to whom you convey the Program, the only way you could +satisfy both those terms and this License would be to refrain entirely +from conveying the Program. + +13. Remote Network Interaction; Use with the GNU General Public +License. + +Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your +version supports such interaction) an opportunity to receive the +Corresponding Source of your version by providing access to the +Corresponding Source from a network server at no charge, through some +standard or customary means of facilitating copying of software. This +Corresponding Source shall include the Corresponding Source for any +work covered by version 3 of the GNU General Public License that is +incorporated pursuant to the following paragraph. + +Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + +14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions +of the GNU Affero General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever +published by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future versions +of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + +Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + +15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT +WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + +16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR +CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT +NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR +LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM +TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER +PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + +To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively state +the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + Copyright (C) + + This program is free software: you can redistribute it and/or + modify it under the terms of the GNU Affero General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public + License along with this program. If not, see + . Also add information on how to + contact you by electronic and paper mail. + +If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for +the specific requirements. + +You should also get your employer (if you work as a programmer) or +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. For more information on this, and how to apply and follow +the GNU AGPL, see . \ No newline at end of file diff --git a/README b/README new file mode 100644 index 0000000..302ed9b --- /dev/null +++ b/README @@ -0,0 +1,41 @@ +This is TetGen version 1.5.1 (released on August, 2018) + +Please see the documentation of TetGen for compiling and using TetGen. +It is available at the following link: + + http://www.tetgen.org + +For more information on this product, contact : + + Hang Si + Research Group of Numerical Mathematics and Scientific Computing + Weierstrass Institute for Applied Analysis and Stochastics + Mohrenstr. 39 + 10117 Berlin, Germany + + Phone: +49 (0) 30-20372-446 Fax: +49 (0) 30-2044975 + EMail: + Web Site: http://www.wias-berlin.de/~si + +------------------- IMPORTANCE NOTICE ----------------------------- + +BEFORE INTALLING OR USING TetGen(R) READ the +GENERAL LICENSE TERMS AND CONDITIONS + +------------------------------------------------------------------- + +------------------- IMPORTANCE NOTICE ----------------------------- + +This package is organized and distributed by Dr. Yi Zhang. +It is distributed under the TetGen License + +Phone: +86 180-7279-5431 +E-mail: zhangyiss@icloud.com +Address: Yuquan Campus, Zhejiang University, + 38 Zheda Road, Hangzhou 310027, China + +Note that source files in the lib/ and tool/ directories are identical +to each other except that the tetgen.h file in the lib/ directory has +the TETLIBRARY macro defined. + +------------------------------------------------------------------- \ No newline at end of file diff --git a/config.sh b/config.sh new file mode 100755 index 0000000..acdf495 --- /dev/null +++ b/config.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +cmd=${1} +package=tetgen +address=/opt/stow +targetdir=/usr/local + +if [[ ${cmd} == "configure" && ! -d "build/" ]]; then + mkdir build && cd build && cmake .. -DCMAKE_INSTALL_PREFIX=${address}/${package} -DCMAKE_BUILD_TYPE=Release +elif [[ ${cmd} == "configure" ]]; then + cd build && rm -rf * && cmake .. -DCMAKE_INSTALL_PREFIX=${address}/${package} -DCMAKE_BUILD_TYPE=Release +elif [[ ${cmd} == "build" ]]; then + cd build && make +elif [[ ${cmd} == "install" ]]; then + cd build && sudo make install + sudo stow --dir=${address} --target=${targetdir} ${package} +fi \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..e095931 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,54 @@ +# 设定源文件文件夹 +aux_source_directory(lib TETGENLIB_SRC) +# 设置编译选项 +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") + +# 以下部分为库的编译 +# 注意目标名必须唯一 所以不能直接生成相同名称的动态库与静态库 +# 注意此处不必为目标名称添加lib前缀和相应后缀,cmake会自行添加 +add_library(tetlib SHARED ${TETGENLIB_SRC}) +# 首先添加静态库的生成命令 +add_library(tetlib_static STATIC ${TETGENLIB_SRC}) +# 设置编译选项 将源代码编译为动态与静态库 +# 设置静态库的输出名称从而获得与动态库名称相同的静态库 +set_target_properties(tetlib PROPERTIES OUTPUT_NAME "tetgen") +set_target_properties(tetlib_static PROPERTIES OUTPUT_NAME "tetgen") +# 设置输出目标属性以同时输出动态库与静态库 +set_target_properties(tetlib PROPERTIES CLEAN_DIRECT_OUTPUT 1) +set_target_properties(tetlib_static PROPERTIES CLEAN_DIRECT_OUTPUT 1) +# 设置动态库的版本号 +set_target_properties(tetlib PROPERTIES VERSION 1.5.1 SOVERSION 1.5.1) +# 设置库文件的输出地址 +set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) + +# 库的安装命令 +if(WIN32) + install(TARGETS tetlib DESTINATION lib) + install(TARGETS tetlib_static DESTINATION lib) +else() + install(TARGETS tetlib tetlib_static + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib) +endif() +# 头文件安装命令 +install(FILES lib/tetgen.h DESTINATION include) + + +# 设置可执行文件的输出地址 +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) + +# 以下为可执行命令行工具的编译 +# 设定源文件文件夹 +aux_source_directory(tool TETGEN_SRC) +# 添加可执行文件 +add_executable(tetgen ${TETGEN_SRC}) +# 命令行工具安装命令 +install(TARGETS tetgen RUNTIME DESTINATION sbin) + +# 以下部分为例子程序的编译 +# 添加可执行文件 +add_executable(tetcall sample/tetcall.cxx) +# 为安装文件添加动态库的搜索地址 在Windows下并没有什么用 直接忽略 +set_target_properties(tetcall PROPERTIES INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/lib) +# 链接动态库 +target_link_libraries(tetcall PUBLIC tetlib) diff --git a/src/lib/predicates.cxx b/src/lib/predicates.cxx new file mode 100644 index 0000000..5a7a48e --- /dev/null +++ b/src/lib/predicates.cxx @@ -0,0 +1,4702 @@ +/*****************************************************************************/ +/* */ +/* Routines for Arbitrary Precision Floating-point Arithmetic */ +/* and Fast Robust Geometric Predicates */ +/* (predicates.c) */ +/* */ +/* May 18, 1996 */ +/* */ +/* Placed in the public domain by */ +/* Jonathan Richard Shewchuk */ +/* School of Computer Science */ +/* Carnegie Mellon University */ +/* 5000 Forbes Avenue */ +/* Pittsburgh, Pennsylvania 15213-3891 */ +/* jrs@cs.cmu.edu */ +/* */ +/* This file contains C implementation of algorithms for exact addition */ +/* and multiplication of floating-point numbers, and predicates for */ +/* robustly performing the orientation and incircle tests used in */ +/* computational geometry. The algorithms and underlying theory are */ +/* described in Jonathan Richard Shewchuk. "Adaptive Precision Floating- */ +/* Point Arithmetic and Fast Robust Geometric Predicates." Technical */ +/* Report CMU-CS-96-140, School of Computer Science, Carnegie Mellon */ +/* University, Pittsburgh, Pennsylvania, May 1996. (Submitted to */ +/* Discrete & Computational Geometry.) */ +/* */ +/* This file, the paper listed above, and other information are available */ +/* from the Web page http://www.cs.cmu.edu/~quake/robust.html . */ +/* */ +/*****************************************************************************/ + +/*****************************************************************************/ +/* */ +/* Using this code: */ +/* */ +/* First, read the short or long version of the paper (from the Web page */ +/* above). */ +/* */ +/* Be sure to call exactinit() once, before calling any of the arithmetic */ +/* functions or geometric predicates. Also be sure to turn on the */ +/* optimizer when compiling this file. */ +/* */ +/* */ +/* Several geometric predicates are defined. Their parameters are all */ +/* points. Each point is an array of two or three floating-point */ +/* numbers. The geometric predicates, described in the papers, are */ +/* */ +/* orient2d(pa, pb, pc) */ +/* orient2dfast(pa, pb, pc) */ +/* orient3d(pa, pb, pc, pd) */ +/* orient3dfast(pa, pb, pc, pd) */ +/* incircle(pa, pb, pc, pd) */ +/* incirclefast(pa, pb, pc, pd) */ +/* insphere(pa, pb, pc, pd, pe) */ +/* inspherefast(pa, pb, pc, pd, pe) */ +/* */ +/* Those with suffix "fast" are approximate, non-robust versions. Those */ +/* without the suffix are adaptive precision, robust versions. There */ +/* are also versions with the suffices "exact" and "slow", which are */ +/* non-adaptive, exact arithmetic versions, which I use only for timings */ +/* in my arithmetic papers. */ +/* */ +/* */ +/* An expansion is represented by an array of floating-point numbers, */ +/* sorted from smallest to largest magnitude (possibly with interspersed */ +/* zeros). The length of each expansion is stored as a separate integer, */ +/* and each arithmetic function returns an integer which is the length */ +/* of the expansion it created. */ +/* */ +/* Several arithmetic functions are defined. Their parameters are */ +/* */ +/* e, f Input expansions */ +/* elen, flen Lengths of input expansions (must be >= 1) */ +/* h Output expansion */ +/* b Input scalar */ +/* */ +/* The arithmetic functions are */ +/* */ +/* grow_expansion(elen, e, b, h) */ +/* grow_expansion_zeroelim(elen, e, b, h) */ +/* expansion_sum(elen, e, flen, f, h) */ +/* expansion_sum_zeroelim1(elen, e, flen, f, h) */ +/* expansion_sum_zeroelim2(elen, e, flen, f, h) */ +/* fast_expansion_sum(elen, e, flen, f, h) */ +/* fast_expansion_sum_zeroelim(elen, e, flen, f, h) */ +/* linear_expansion_sum(elen, e, flen, f, h) */ +/* linear_expansion_sum_zeroelim(elen, e, flen, f, h) */ +/* scale_expansion(elen, e, b, h) */ +/* scale_expansion_zeroelim(elen, e, b, h) */ +/* compress(elen, e, h) */ +/* */ +/* All of these are described in the long version of the paper; some are */ +/* described in the short version. All return an integer that is the */ +/* length of h. Those with suffix _zeroelim perform zero elimination, */ +/* and are recommended over their counterparts. The procedure */ +/* fast_expansion_sum_zeroelim() (or linear_expansion_sum_zeroelim() on */ +/* processors that do not use the round-to-even tiebreaking rule) is */ +/* recommended over expansion_sum_zeroelim(). Each procedure has a */ +/* little note next to it (in the code below) that tells you whether or */ +/* not the output expansion may be the same array as one of the input */ +/* expansions. */ +/* */ +/* */ +/* If you look around below, you'll also find macros for a bunch of */ +/* simple unrolled arithmetic operations, and procedures for printing */ +/* expansions (commented out because they don't work with all C */ +/* compilers) and for generating random floating-point numbers whose */ +/* significand bits are all random. Most of the macros have undocumented */ +/* requirements that certain of their parameters should not be the same */ +/* variable; for safety, better to make sure all the parameters are */ +/* distinct variables. Feel free to send email to jrs@cs.cmu.edu if you */ +/* have questions. */ +/* */ +/*****************************************************************************/ + +#include +#include +#include +#ifdef CPU86 +#include +#endif /* CPU86 */ +#ifdef LINUX +#include +#endif /* LINUX */ + +#include "tetgen.h" // Defines the symbol REAL (float or double). + +#ifdef USE_CGAL_PREDICATES + #include + typedef CGAL::Exact_predicates_inexact_constructions_kernel cgalEpick; + typedef cgalEpick::Point_3 Point; + cgalEpick cgal_pred_obj; +#endif // #ifdef USE_CGAL_PREDICATES + +/* On some machines, the exact arithmetic routines might be defeated by the */ +/* use of internal extended precision floating-point registers. Sometimes */ +/* this problem can be fixed by defining certain values to be volatile, */ +/* thus forcing them to be stored to memory and rounded off. This isn't */ +/* a great solution, though, as it slows the arithmetic down. */ +/* */ +/* To try this out, write "#define INEXACT volatile" below. Normally, */ +/* however, INEXACT should be defined to be nothing. ("#define INEXACT".) */ + +#define INEXACT /* Nothing */ +/* #define INEXACT volatile */ + +/* #define REAL double */ /* float or double */ +#define REALPRINT doubleprint +#define REALRAND doublerand +#define NARROWRAND narrowdoublerand +#define UNIFORMRAND uniformdoublerand + +/* Which of the following two methods of finding the absolute values is */ +/* fastest is compiler-dependent. A few compilers can inline and optimize */ +/* the fabs() call; but most will incur the overhead of a function call, */ +/* which is disastrously slow. A faster way on IEEE machines might be to */ +/* mask the appropriate bit, but that's difficult to do in C. */ + +//#define Absolute(a) ((a) >= 0.0 ? (a) : -(a)) +#define Absolute(a) fabs(a) + +/* Many of the operations are broken up into two pieces, a main part that */ +/* performs an approximate operation, and a "tail" that computes the */ +/* roundoff error of that operation. */ +/* */ +/* The operations Fast_Two_Sum(), Fast_Two_Diff(), Two_Sum(), Two_Diff(), */ +/* Split(), and Two_Product() are all implemented as described in the */ +/* reference. Each of these macros requires certain variables to be */ +/* defined in the calling routine. The variables `bvirt', `c', `abig', */ +/* `_i', `_j', `_k', `_l', `_m', and `_n' are declared `INEXACT' because */ +/* they store the result of an operation that may incur roundoff error. */ +/* The input parameter `x' (or the highest numbered `x_' parameter) must */ +/* also be declared `INEXACT'. */ + +#define Fast_Two_Sum_Tail(a, b, x, y) \ + bvirt = x - a; \ + y = b - bvirt + +#define Fast_Two_Sum(a, b, x, y) \ + x = (REAL) (a + b); \ + Fast_Two_Sum_Tail(a, b, x, y) + +#define Fast_Two_Diff_Tail(a, b, x, y) \ + bvirt = a - x; \ + y = bvirt - b + +#define Fast_Two_Diff(a, b, x, y) \ + x = (REAL) (a - b); \ + Fast_Two_Diff_Tail(a, b, x, y) + +#define Two_Sum_Tail(a, b, x, y) \ + bvirt = (REAL) (x - a); \ + avirt = x - bvirt; \ + bround = b - bvirt; \ + around = a - avirt; \ + y = around + bround + +#define Two_Sum(a, b, x, y) \ + x = (REAL) (a + b); \ + Two_Sum_Tail(a, b, x, y) + +#define Two_Diff_Tail(a, b, x, y) \ + bvirt = (REAL) (a - x); \ + avirt = x + bvirt; \ + bround = bvirt - b; \ + around = a - avirt; \ + y = around + bround + +#define Two_Diff(a, b, x, y) \ + x = (REAL) (a - b); \ + Two_Diff_Tail(a, b, x, y) + +#define Split(a, ahi, alo) \ + c = (REAL) (splitter * a); \ + abig = (REAL) (c - a); \ + ahi = c - abig; \ + alo = a - ahi + +#define Two_Product_Tail(a, b, x, y) \ + Split(a, ahi, alo); \ + Split(b, bhi, blo); \ + err1 = x - (ahi * bhi); \ + err2 = err1 - (alo * bhi); \ + err3 = err2 - (ahi * blo); \ + y = (alo * blo) - err3 + +#define Two_Product(a, b, x, y) \ + x = (REAL) (a * b); \ + Two_Product_Tail(a, b, x, y) + +/* Two_Product_Presplit() is Two_Product() where one of the inputs has */ +/* already been split. Avoids redundant splitting. */ + +#define Two_Product_Presplit(a, b, bhi, blo, x, y) \ + x = (REAL) (a * b); \ + Split(a, ahi, alo); \ + err1 = x - (ahi * bhi); \ + err2 = err1 - (alo * bhi); \ + err3 = err2 - (ahi * blo); \ + y = (alo * blo) - err3 + +/* Two_Product_2Presplit() is Two_Product() where both of the inputs have */ +/* already been split. Avoids redundant splitting. */ + +#define Two_Product_2Presplit(a, ahi, alo, b, bhi, blo, x, y) \ + x = (REAL) (a * b); \ + err1 = x - (ahi * bhi); \ + err2 = err1 - (alo * bhi); \ + err3 = err2 - (ahi * blo); \ + y = (alo * blo) - err3 + +/* Square() can be done more quickly than Two_Product(). */ + +#define Square_Tail(a, x, y) \ + Split(a, ahi, alo); \ + err1 = x - (ahi * ahi); \ + err3 = err1 - ((ahi + ahi) * alo); \ + y = (alo * alo) - err3 + +#define Square(a, x, y) \ + x = (REAL) (a * a); \ + Square_Tail(a, x, y) + +/* Macros for summing expansions of various fixed lengths. These are all */ +/* unrolled versions of Expansion_Sum(). */ + +#define Two_One_Sum(a1, a0, b, x2, x1, x0) \ + Two_Sum(a0, b , _i, x0); \ + Two_Sum(a1, _i, x2, x1) + +#define Two_One_Diff(a1, a0, b, x2, x1, x0) \ + Two_Diff(a0, b , _i, x0); \ + Two_Sum( a1, _i, x2, x1) + +#define Two_Two_Sum(a1, a0, b1, b0, x3, x2, x1, x0) \ + Two_One_Sum(a1, a0, b0, _j, _0, x0); \ + Two_One_Sum(_j, _0, b1, x3, x2, x1) + +#define Two_Two_Diff(a1, a0, b1, b0, x3, x2, x1, x0) \ + Two_One_Diff(a1, a0, b0, _j, _0, x0); \ + Two_One_Diff(_j, _0, b1, x3, x2, x1) + +#define Four_One_Sum(a3, a2, a1, a0, b, x4, x3, x2, x1, x0) \ + Two_One_Sum(a1, a0, b , _j, x1, x0); \ + Two_One_Sum(a3, a2, _j, x4, x3, x2) + +#define Four_Two_Sum(a3, a2, a1, a0, b1, b0, x5, x4, x3, x2, x1, x0) \ + Four_One_Sum(a3, a2, a1, a0, b0, _k, _2, _1, _0, x0); \ + Four_One_Sum(_k, _2, _1, _0, b1, x5, x4, x3, x2, x1) + +#define Four_Four_Sum(a3, a2, a1, a0, b4, b3, b1, b0, x7, x6, x5, x4, x3, x2, \ + x1, x0) \ + Four_Two_Sum(a3, a2, a1, a0, b1, b0, _l, _2, _1, _0, x1, x0); \ + Four_Two_Sum(_l, _2, _1, _0, b4, b3, x7, x6, x5, x4, x3, x2) + +#define Eight_One_Sum(a7, a6, a5, a4, a3, a2, a1, a0, b, x8, x7, x6, x5, x4, \ + x3, x2, x1, x0) \ + Four_One_Sum(a3, a2, a1, a0, b , _j, x3, x2, x1, x0); \ + Four_One_Sum(a7, a6, a5, a4, _j, x8, x7, x6, x5, x4) + +#define Eight_Two_Sum(a7, a6, a5, a4, a3, a2, a1, a0, b1, b0, x9, x8, x7, \ + x6, x5, x4, x3, x2, x1, x0) \ + Eight_One_Sum(a7, a6, a5, a4, a3, a2, a1, a0, b0, _k, _6, _5, _4, _3, _2, \ + _1, _0, x0); \ + Eight_One_Sum(_k, _6, _5, _4, _3, _2, _1, _0, b1, x9, x8, x7, x6, x5, x4, \ + x3, x2, x1) + +#define Eight_Four_Sum(a7, a6, a5, a4, a3, a2, a1, a0, b4, b3, b1, b0, x11, \ + x10, x9, x8, x7, x6, x5, x4, x3, x2, x1, x0) \ + Eight_Two_Sum(a7, a6, a5, a4, a3, a2, a1, a0, b1, b0, _l, _6, _5, _4, _3, \ + _2, _1, _0, x1, x0); \ + Eight_Two_Sum(_l, _6, _5, _4, _3, _2, _1, _0, b4, b3, x11, x10, x9, x8, \ + x7, x6, x5, x4, x3, x2) + +/* Macros for multiplying expansions of various fixed lengths. */ + +#define Two_One_Product(a1, a0, b, x3, x2, x1, x0) \ + Split(b, bhi, blo); \ + Two_Product_Presplit(a0, b, bhi, blo, _i, x0); \ + Two_Product_Presplit(a1, b, bhi, blo, _j, _0); \ + Two_Sum(_i, _0, _k, x1); \ + Fast_Two_Sum(_j, _k, x3, x2) + +#define Four_One_Product(a3, a2, a1, a0, b, x7, x6, x5, x4, x3, x2, x1, x0) \ + Split(b, bhi, blo); \ + Two_Product_Presplit(a0, b, bhi, blo, _i, x0); \ + Two_Product_Presplit(a1, b, bhi, blo, _j, _0); \ + Two_Sum(_i, _0, _k, x1); \ + Fast_Two_Sum(_j, _k, _i, x2); \ + Two_Product_Presplit(a2, b, bhi, blo, _j, _0); \ + Two_Sum(_i, _0, _k, x3); \ + Fast_Two_Sum(_j, _k, _i, x4); \ + Two_Product_Presplit(a3, b, bhi, blo, _j, _0); \ + Two_Sum(_i, _0, _k, x5); \ + Fast_Two_Sum(_j, _k, x7, x6) + +#define Two_Two_Product(a1, a0, b1, b0, x7, x6, x5, x4, x3, x2, x1, x0) \ + Split(a0, a0hi, a0lo); \ + Split(b0, bhi, blo); \ + Two_Product_2Presplit(a0, a0hi, a0lo, b0, bhi, blo, _i, x0); \ + Split(a1, a1hi, a1lo); \ + Two_Product_2Presplit(a1, a1hi, a1lo, b0, bhi, blo, _j, _0); \ + Two_Sum(_i, _0, _k, _1); \ + Fast_Two_Sum(_j, _k, _l, _2); \ + Split(b1, bhi, blo); \ + Two_Product_2Presplit(a0, a0hi, a0lo, b1, bhi, blo, _i, _0); \ + Two_Sum(_1, _0, _k, x1); \ + Two_Sum(_2, _k, _j, _1); \ + Two_Sum(_l, _j, _m, _2); \ + Two_Product_2Presplit(a1, a1hi, a1lo, b1, bhi, blo, _j, _0); \ + Two_Sum(_i, _0, _n, _0); \ + Two_Sum(_1, _0, _i, x2); \ + Two_Sum(_2, _i, _k, _1); \ + Two_Sum(_m, _k, _l, _2); \ + Two_Sum(_j, _n, _k, _0); \ + Two_Sum(_1, _0, _j, x3); \ + Two_Sum(_2, _j, _i, _1); \ + Two_Sum(_l, _i, _m, _2); \ + Two_Sum(_1, _k, _i, x4); \ + Two_Sum(_2, _i, _k, x5); \ + Two_Sum(_m, _k, x7, x6) + +/* An expansion of length two can be squared more quickly than finding the */ +/* product of two different expansions of length two, and the result is */ +/* guaranteed to have no more than six (rather than eight) components. */ + +#define Two_Square(a1, a0, x5, x4, x3, x2, x1, x0) \ + Square(a0, _j, x0); \ + _0 = a0 + a0; \ + Two_Product(a1, _0, _k, _1); \ + Two_One_Sum(_k, _1, _j, _l, _2, x1); \ + Square(a1, _j, _1); \ + Two_Two_Sum(_j, _1, _l, _2, x5, x4, x3, x2) + +/* splitter = 2^ceiling(p / 2) + 1. Used to split floats in half. */ +static REAL splitter; +static REAL epsilon; /* = 2^(-p). Used to estimate roundoff errors. */ +/* A set of coefficients used to calculate maximum roundoff errors. */ +static REAL resulterrbound; +static REAL ccwerrboundA, ccwerrboundB, ccwerrboundC; +static REAL o3derrboundA, o3derrboundB, o3derrboundC; +static REAL iccerrboundA, iccerrboundB, iccerrboundC; +static REAL isperrboundA, isperrboundB, isperrboundC; + +// Options to choose types of geometric computtaions. +// Added by H. Si, 2012-08-23. +static int _use_inexact_arith; // -X option. +static int _use_static_filter; // Default option, disable it by -X1 + +// Static filters for orient3d() and insphere(). +// They are pre-calcualted and set in exactinit(). +// Added by H. Si, 2012-08-23. +static REAL o3dstaticfilter; +static REAL ispstaticfilter; + + + +// The following codes were part of "IEEE 754 floating-point test software" +// http://www.math.utah.edu/~beebe/software/ieee/ +// The original program was "fpinfo2.c". + +double fppow2(int n) +{ + double x, power; + x = (n < 0) ? ((double)1.0/(double)2.0) : (double)2.0; + n = (n < 0) ? -n : n; + power = (double)1.0; + while (n-- > 0) + power *= x; + return (power); +} + +#ifdef SINGLE + +float fstore(float x) +{ + return (x); +} + +int test_float(int verbose) +{ + float x; + int pass = 1; + + //(void)printf("float:\n"); + + if (verbose) { + (void)printf(" sizeof(float) = %2u\n", (unsigned int)sizeof(float)); +#ifdef CPU86 // + (void)printf(" FLT_MANT_DIG = %2d\n", FLT_MANT_DIG); +#endif + } + + x = (float)1.0; + while (fstore((float)1.0 + x/(float)2.0) != (float)1.0) + x /= (float)2.0; + if (verbose) + (void)printf(" machine epsilon = %13.5e ", x); + + if (x == (float)fppow2(-23)) { + if (verbose) + (void)printf("[IEEE 754 32-bit macheps]\n"); + } else { + (void)printf("[not IEEE 754 conformant] !!\n"); + pass = 0; + } + + x = (float)1.0; + while (fstore(x / (float)2.0) != (float)0.0) + x /= (float)2.0; + if (verbose) + (void)printf(" smallest positive number = %13.5e ", x); + + if (x == (float)fppow2(-149)) { + if (verbose) + (void)printf("[smallest 32-bit subnormal]\n"); + } else if (x == (float)fppow2(-126)) { + if (verbose) + (void)printf("[smallest 32-bit normal]\n"); + } else { + (void)printf("[not IEEE 754 conformant] !!\n"); + pass = 0; + } + + return pass; +} + +# else + +double dstore(double x) +{ + return (x); +} + +int test_double(int verbose) +{ + double x; + int pass = 1; + + // (void)printf("double:\n"); + if (verbose) { + (void)printf(" sizeof(double) = %2u\n", (unsigned int)sizeof(double)); +#ifdef CPU86 // + (void)printf(" DBL_MANT_DIG = %2d\n", DBL_MANT_DIG); +#endif + } + + x = 1.0; + while (dstore(1.0 + x/2.0) != 1.0) + x /= 2.0; + if (verbose) + (void)printf(" machine epsilon = %13.5le ", x); + + if (x == (double)fppow2(-52)) { + if (verbose) + (void)printf("[IEEE 754 64-bit macheps]\n"); + } else { + (void)printf("[not IEEE 754 conformant] !!\n"); + pass = 0; + } + + x = 1.0; + while (dstore(x / 2.0) != 0.0) + x /= 2.0; + //if (verbose) + // (void)printf(" smallest positive number = %13.5le ", x); + + if (x == (double)fppow2(-1074)) { + //if (verbose) + // (void)printf("[smallest 64-bit subnormal]\n"); + } else if (x == (double)fppow2(-1022)) { + //if (verbose) + // (void)printf("[smallest 64-bit normal]\n"); + } else { + (void)printf("[not IEEE 754 conformant] !!\n"); + pass = 0; + } + + return pass; +} + +#endif + +/*****************************************************************************/ +/* */ +/* exactinit() Initialize the variables used for exact arithmetic. */ +/* */ +/* `epsilon' is the largest power of two such that 1.0 + epsilon = 1.0 in */ +/* floating-point arithmetic. `epsilon' bounds the relative roundoff */ +/* error. It is used for floating-point error analysis. */ +/* */ +/* `splitter' is used to split floating-point numbers into two half- */ +/* length significands for exact multiplication. */ +/* */ +/* I imagine that a highly optimizing compiler might be too smart for its */ +/* own good, and somehow cause this routine to fail, if it pretends that */ +/* floating-point arithmetic is too much like real arithmetic. */ +/* */ +/* Don't change this routine unless you fully understand it. */ +/* */ +/*****************************************************************************/ + +void exactinit(int verbose, int noexact, int nofilter, REAL maxx, REAL maxy, + REAL maxz) +{ + REAL half; + REAL check, lastcheck; + int every_other; +#ifdef LINUX + int cword; +#endif /* LINUX */ + +#ifdef CPU86 +#ifdef SINGLE + _control87(_PC_24, _MCW_PC); /* Set FPU control word for single precision. */ +#else /* not SINGLE */ + _control87(_PC_53, _MCW_PC); /* Set FPU control word for double precision. */ +#endif /* not SINGLE */ +#endif /* CPU86 */ +#ifdef LINUX +#ifdef SINGLE + /* cword = 4223; */ + cword = 4210; /* set FPU control word for single precision */ +#else /* not SINGLE */ + /* cword = 4735; */ + cword = 4722; /* set FPU control word for double precision */ +#endif /* not SINGLE */ + _FPU_SETCW(cword); +#endif /* LINUX */ + + if (verbose) { + printf(" Initializing robust predicates.\n"); + } + +#ifdef USE_CGAL_PREDICATES + if (cgal_pred_obj.Has_static_filters) { + printf(" Use static filter.\n"); + } else { + printf(" No static filter.\n"); + } +#endif // USE_CGAL_PREDICATES + +#ifdef SINGLE + test_float(verbose); +#else + test_double(verbose); +#endif + + every_other = 1; + half = 0.5; + epsilon = 1.0; + splitter = 1.0; + check = 1.0; + /* Repeatedly divide `epsilon' by two until it is too small to add to */ + /* one without causing roundoff. (Also check if the sum is equal to */ + /* the previous sum, for machines that round up instead of using exact */ + /* rounding. Not that this library will work on such machines anyway. */ + do { + lastcheck = check; + epsilon *= half; + if (every_other) { + splitter *= 2.0; + } + every_other = !every_other; + check = 1.0 + epsilon; + } while ((check != 1.0) && (check != lastcheck)); + splitter += 1.0; + + /* Error bounds for orientation and incircle tests. */ + resulterrbound = (3.0 + 8.0 * epsilon) * epsilon; + ccwerrboundA = (3.0 + 16.0 * epsilon) * epsilon; + ccwerrboundB = (2.0 + 12.0 * epsilon) * epsilon; + ccwerrboundC = (9.0 + 64.0 * epsilon) * epsilon * epsilon; + o3derrboundA = (7.0 + 56.0 * epsilon) * epsilon; + o3derrboundB = (3.0 + 28.0 * epsilon) * epsilon; + o3derrboundC = (26.0 + 288.0 * epsilon) * epsilon * epsilon; + iccerrboundA = (10.0 + 96.0 * epsilon) * epsilon; + iccerrboundB = (4.0 + 48.0 * epsilon) * epsilon; + iccerrboundC = (44.0 + 576.0 * epsilon) * epsilon * epsilon; + isperrboundA = (16.0 + 224.0 * epsilon) * epsilon; + isperrboundB = (5.0 + 72.0 * epsilon) * epsilon; + isperrboundC = (71.0 + 1408.0 * epsilon) * epsilon * epsilon; + + // Set TetGen options. Added by H. Si, 2012-08-23. + _use_inexact_arith = noexact; + _use_static_filter = !nofilter; + + // Calculate the two static filters for orient3d() and insphere() tests. + // Added by H. Si, 2012-08-23. + + // Sort maxx < maxy < maxz. Re-use 'half' for swapping. + if (maxx > maxz) { + half = maxx; maxx = maxz; maxz = half; + } + if (maxy > maxz) { + half = maxy; maxy = maxz; maxz = half; + } + else if (maxy < maxx) { + half = maxy; maxy = maxx; maxx = half; + } + + o3dstaticfilter = 5.1107127829973299e-15 * maxx * maxy * maxz; + ispstaticfilter = 1.2466136531027298e-13 * maxx * maxy * maxz * (maxz * maxz); + +} + +/*****************************************************************************/ +/* */ +/* grow_expansion() Add a scalar to an expansion. */ +/* */ +/* Sets h = e + b. See the long version of my paper for details. */ +/* */ +/* Maintains the nonoverlapping property. If round-to-even is used (as */ +/* with IEEE 754), maintains the strongly nonoverlapping and nonadjacent */ +/* properties as well. (That is, if e has one of these properties, so */ +/* will h.) */ +/* */ +/*****************************************************************************/ + +int grow_expansion(int elen, REAL *e, REAL b, REAL *h) +/* e and h can be the same. */ +{ + REAL Q; + INEXACT REAL Qnew; + int eindex; + REAL enow; + INEXACT REAL bvirt; + REAL avirt, bround, around; + + Q = b; + for (eindex = 0; eindex < elen; eindex++) { + enow = e[eindex]; + Two_Sum(Q, enow, Qnew, h[eindex]); + Q = Qnew; + } + h[eindex] = Q; + return eindex + 1; +} + +/*****************************************************************************/ +/* */ +/* grow_expansion_zeroelim() Add a scalar to an expansion, eliminating */ +/* zero components from the output expansion. */ +/* */ +/* Sets h = e + b. See the long version of my paper for details. */ +/* */ +/* Maintains the nonoverlapping property. If round-to-even is used (as */ +/* with IEEE 754), maintains the strongly nonoverlapping and nonadjacent */ +/* properties as well. (That is, if e has one of these properties, so */ +/* will h.) */ +/* */ +/*****************************************************************************/ + +int grow_expansion_zeroelim(int elen, REAL *e, REAL b, REAL *h) +/* e and h can be the same. */ +{ + REAL Q, hh; + INEXACT REAL Qnew; + int eindex, hindex; + REAL enow; + INEXACT REAL bvirt; + REAL avirt, bround, around; + + hindex = 0; + Q = b; + for (eindex = 0; eindex < elen; eindex++) { + enow = e[eindex]; + Two_Sum(Q, enow, Qnew, hh); + Q = Qnew; + if (hh != 0.0) { + h[hindex++] = hh; + } + } + if ((Q != 0.0) || (hindex == 0)) { + h[hindex++] = Q; + } + return hindex; +} + +/*****************************************************************************/ +/* */ +/* expansion_sum() Sum two expansions. */ +/* */ +/* Sets h = e + f. See the long version of my paper for details. */ +/* */ +/* Maintains the nonoverlapping property. If round-to-even is used (as */ +/* with IEEE 754), maintains the nonadjacent property as well. (That is, */ +/* if e has one of these properties, so will h.) Does NOT maintain the */ +/* strongly nonoverlapping property. */ +/* */ +/*****************************************************************************/ + +int expansion_sum(int elen, REAL *e, int flen, REAL *f, REAL *h) +/* e and h can be the same, but f and h cannot. */ +{ + REAL Q; + INEXACT REAL Qnew; + int findex, hindex, hlast; + REAL hnow; + INEXACT REAL bvirt; + REAL avirt, bround, around; + + Q = f[0]; + for (hindex = 0; hindex < elen; hindex++) { + hnow = e[hindex]; + Two_Sum(Q, hnow, Qnew, h[hindex]); + Q = Qnew; + } + h[hindex] = Q; + hlast = hindex; + for (findex = 1; findex < flen; findex++) { + Q = f[findex]; + for (hindex = findex; hindex <= hlast; hindex++) { + hnow = h[hindex]; + Two_Sum(Q, hnow, Qnew, h[hindex]); + Q = Qnew; + } + h[++hlast] = Q; + } + return hlast + 1; +} + +/*****************************************************************************/ +/* */ +/* expansion_sum_zeroelim1() Sum two expansions, eliminating zero */ +/* components from the output expansion. */ +/* */ +/* Sets h = e + f. See the long version of my paper for details. */ +/* */ +/* Maintains the nonoverlapping property. If round-to-even is used (as */ +/* with IEEE 754), maintains the nonadjacent property as well. (That is, */ +/* if e has one of these properties, so will h.) Does NOT maintain the */ +/* strongly nonoverlapping property. */ +/* */ +/*****************************************************************************/ + +int expansion_sum_zeroelim1(int elen, REAL *e, int flen, REAL *f, REAL *h) +/* e and h can be the same, but f and h cannot. */ +{ + REAL Q; + INEXACT REAL Qnew; + int index, findex, hindex, hlast; + REAL hnow; + INEXACT REAL bvirt; + REAL avirt, bround, around; + + Q = f[0]; + for (hindex = 0; hindex < elen; hindex++) { + hnow = e[hindex]; + Two_Sum(Q, hnow, Qnew, h[hindex]); + Q = Qnew; + } + h[hindex] = Q; + hlast = hindex; + for (findex = 1; findex < flen; findex++) { + Q = f[findex]; + for (hindex = findex; hindex <= hlast; hindex++) { + hnow = h[hindex]; + Two_Sum(Q, hnow, Qnew, h[hindex]); + Q = Qnew; + } + h[++hlast] = Q; + } + hindex = -1; + for (index = 0; index <= hlast; index++) { + hnow = h[index]; + if (hnow != 0.0) { + h[++hindex] = hnow; + } + } + if (hindex == -1) { + return 1; + } else { + return hindex + 1; + } +} + +/*****************************************************************************/ +/* */ +/* expansion_sum_zeroelim2() Sum two expansions, eliminating zero */ +/* components from the output expansion. */ +/* */ +/* Sets h = e + f. See the long version of my paper for details. */ +/* */ +/* Maintains the nonoverlapping property. If round-to-even is used (as */ +/* with IEEE 754), maintains the nonadjacent property as well. (That is, */ +/* if e has one of these properties, so will h.) Does NOT maintain the */ +/* strongly nonoverlapping property. */ +/* */ +/*****************************************************************************/ + +int expansion_sum_zeroelim2(int elen, REAL *e, int flen, REAL *f, REAL *h) +/* e and h can be the same, but f and h cannot. */ +{ + REAL Q, hh; + INEXACT REAL Qnew; + int eindex, findex, hindex, hlast; + REAL enow; + INEXACT REAL bvirt; + REAL avirt, bround, around; + + hindex = 0; + Q = f[0]; + for (eindex = 0; eindex < elen; eindex++) { + enow = e[eindex]; + Two_Sum(Q, enow, Qnew, hh); + Q = Qnew; + if (hh != 0.0) { + h[hindex++] = hh; + } + } + h[hindex] = Q; + hlast = hindex; + for (findex = 1; findex < flen; findex++) { + hindex = 0; + Q = f[findex]; + for (eindex = 0; eindex <= hlast; eindex++) { + enow = h[eindex]; + Two_Sum(Q, enow, Qnew, hh); + Q = Qnew; + if (hh != 0) { + h[hindex++] = hh; + } + } + h[hindex] = Q; + hlast = hindex; + } + return hlast + 1; +} + +/*****************************************************************************/ +/* */ +/* fast_expansion_sum() Sum two expansions. */ +/* */ +/* Sets h = e + f. See the long version of my paper for details. */ +/* */ +/* If round-to-even is used (as with IEEE 754), maintains the strongly */ +/* nonoverlapping property. (That is, if e is strongly nonoverlapping, h */ +/* will be also.) Does NOT maintain the nonoverlapping or nonadjacent */ +/* properties. */ +/* */ +/*****************************************************************************/ + +int fast_expansion_sum(int elen, REAL *e, int flen, REAL *f, REAL *h) +/* h cannot be e or f. */ +{ + REAL Q; + INEXACT REAL Qnew; + INEXACT REAL bvirt; + REAL avirt, bround, around; + int eindex, findex, hindex; + REAL enow, fnow; + + enow = e[0]; + fnow = f[0]; + eindex = findex = 0; + if ((fnow > enow) == (fnow > -enow)) { + Q = enow; + enow = e[++eindex]; + } else { + Q = fnow; + fnow = f[++findex]; + } + hindex = 0; + if ((eindex < elen) && (findex < flen)) { + if ((fnow > enow) == (fnow > -enow)) { + Fast_Two_Sum(enow, Q, Qnew, h[0]); + enow = e[++eindex]; + } else { + Fast_Two_Sum(fnow, Q, Qnew, h[0]); + fnow = f[++findex]; + } + Q = Qnew; + hindex = 1; + while ((eindex < elen) && (findex < flen)) { + if ((fnow > enow) == (fnow > -enow)) { + Two_Sum(Q, enow, Qnew, h[hindex]); + enow = e[++eindex]; + } else { + Two_Sum(Q, fnow, Qnew, h[hindex]); + fnow = f[++findex]; + } + Q = Qnew; + hindex++; + } + } + while (eindex < elen) { + Two_Sum(Q, enow, Qnew, h[hindex]); + enow = e[++eindex]; + Q = Qnew; + hindex++; + } + while (findex < flen) { + Two_Sum(Q, fnow, Qnew, h[hindex]); + fnow = f[++findex]; + Q = Qnew; + hindex++; + } + h[hindex] = Q; + return hindex + 1; +} + +/*****************************************************************************/ +/* */ +/* fast_expansion_sum_zeroelim() Sum two expansions, eliminating zero */ +/* components from the output expansion. */ +/* */ +/* Sets h = e + f. See the long version of my paper for details. */ +/* */ +/* If round-to-even is used (as with IEEE 754), maintains the strongly */ +/* nonoverlapping property. (That is, if e is strongly nonoverlapping, h */ +/* will be also.) Does NOT maintain the nonoverlapping or nonadjacent */ +/* properties. */ +/* */ +/*****************************************************************************/ + +int fast_expansion_sum_zeroelim(int elen, REAL *e, int flen, REAL *f, REAL *h) +/* h cannot be e or f. */ +{ + REAL Q; + INEXACT REAL Qnew; + INEXACT REAL hh; + INEXACT REAL bvirt; + REAL avirt, bround, around; + int eindex, findex, hindex; + REAL enow, fnow; + + enow = e[0]; + fnow = f[0]; + eindex = findex = 0; + if ((fnow > enow) == (fnow > -enow)) { + Q = enow; + enow = e[++eindex]; + } else { + Q = fnow; + fnow = f[++findex]; + } + hindex = 0; + if ((eindex < elen) && (findex < flen)) { + if ((fnow > enow) == (fnow > -enow)) { + Fast_Two_Sum(enow, Q, Qnew, hh); + enow = e[++eindex]; + } else { + Fast_Two_Sum(fnow, Q, Qnew, hh); + fnow = f[++findex]; + } + Q = Qnew; + if (hh != 0.0) { + h[hindex++] = hh; + } + while ((eindex < elen) && (findex < flen)) { + if ((fnow > enow) == (fnow > -enow)) { + Two_Sum(Q, enow, Qnew, hh); + enow = e[++eindex]; + } else { + Two_Sum(Q, fnow, Qnew, hh); + fnow = f[++findex]; + } + Q = Qnew; + if (hh != 0.0) { + h[hindex++] = hh; + } + } + } + while (eindex < elen) { + Two_Sum(Q, enow, Qnew, hh); + enow = e[++eindex]; + Q = Qnew; + if (hh != 0.0) { + h[hindex++] = hh; + } + } + while (findex < flen) { + Two_Sum(Q, fnow, Qnew, hh); + fnow = f[++findex]; + Q = Qnew; + if (hh != 0.0) { + h[hindex++] = hh; + } + } + if ((Q != 0.0) || (hindex == 0)) { + h[hindex++] = Q; + } + return hindex; +} + +/*****************************************************************************/ +/* */ +/* linear_expansion_sum() Sum two expansions. */ +/* */ +/* Sets h = e + f. See either version of my paper for details. */ +/* */ +/* Maintains the nonoverlapping property. (That is, if e is */ +/* nonoverlapping, h will be also.) */ +/* */ +/*****************************************************************************/ + +int linear_expansion_sum(int elen, REAL *e, int flen, REAL *f, REAL *h) +/* h cannot be e or f. */ +{ + REAL Q, q; + INEXACT REAL Qnew; + INEXACT REAL R; + INEXACT REAL bvirt; + REAL avirt, bround, around; + int eindex, findex, hindex; + REAL enow, fnow; + REAL g0; + + enow = e[0]; + fnow = f[0]; + eindex = findex = 0; + if ((fnow > enow) == (fnow > -enow)) { + g0 = enow; + enow = e[++eindex]; + } else { + g0 = fnow; + fnow = f[++findex]; + } + if ((eindex < elen) && ((findex >= flen) + || ((fnow > enow) == (fnow > -enow)))) { + Fast_Two_Sum(enow, g0, Qnew, q); + enow = e[++eindex]; + } else { + Fast_Two_Sum(fnow, g0, Qnew, q); + fnow = f[++findex]; + } + Q = Qnew; + for (hindex = 0; hindex < elen + flen - 2; hindex++) { + if ((eindex < elen) && ((findex >= flen) + || ((fnow > enow) == (fnow > -enow)))) { + Fast_Two_Sum(enow, q, R, h[hindex]); + enow = e[++eindex]; + } else { + Fast_Two_Sum(fnow, q, R, h[hindex]); + fnow = f[++findex]; + } + Two_Sum(Q, R, Qnew, q); + Q = Qnew; + } + h[hindex] = q; + h[hindex + 1] = Q; + return hindex + 2; +} + +/*****************************************************************************/ +/* */ +/* linear_expansion_sum_zeroelim() Sum two expansions, eliminating zero */ +/* components from the output expansion. */ +/* */ +/* Sets h = e + f. See either version of my paper for details. */ +/* */ +/* Maintains the nonoverlapping property. (That is, if e is */ +/* nonoverlapping, h will be also.) */ +/* */ +/*****************************************************************************/ + +int linear_expansion_sum_zeroelim(int elen, REAL *e, int flen, REAL *f, + REAL *h) +/* h cannot be e or f. */ +{ + REAL Q, q, hh; + INEXACT REAL Qnew; + INEXACT REAL R; + INEXACT REAL bvirt; + REAL avirt, bround, around; + int eindex, findex, hindex; + int count; + REAL enow, fnow; + REAL g0; + + enow = e[0]; + fnow = f[0]; + eindex = findex = 0; + hindex = 0; + if ((fnow > enow) == (fnow > -enow)) { + g0 = enow; + enow = e[++eindex]; + } else { + g0 = fnow; + fnow = f[++findex]; + } + if ((eindex < elen) && ((findex >= flen) + || ((fnow > enow) == (fnow > -enow)))) { + Fast_Two_Sum(enow, g0, Qnew, q); + enow = e[++eindex]; + } else { + Fast_Two_Sum(fnow, g0, Qnew, q); + fnow = f[++findex]; + } + Q = Qnew; + for (count = 2; count < elen + flen; count++) { + if ((eindex < elen) && ((findex >= flen) + || ((fnow > enow) == (fnow > -enow)))) { + Fast_Two_Sum(enow, q, R, hh); + enow = e[++eindex]; + } else { + Fast_Two_Sum(fnow, q, R, hh); + fnow = f[++findex]; + } + Two_Sum(Q, R, Qnew, q); + Q = Qnew; + if (hh != 0) { + h[hindex++] = hh; + } + } + if (q != 0) { + h[hindex++] = q; + } + if ((Q != 0.0) || (hindex == 0)) { + h[hindex++] = Q; + } + return hindex; +} + +/*****************************************************************************/ +/* */ +/* scale_expansion() Multiply an expansion by a scalar. */ +/* */ +/* Sets h = be. See either version of my paper for details. */ +/* */ +/* Maintains the nonoverlapping property. If round-to-even is used (as */ +/* with IEEE 754), maintains the strongly nonoverlapping and nonadjacent */ +/* properties as well. (That is, if e has one of these properties, so */ +/* will h.) */ +/* */ +/*****************************************************************************/ + +int scale_expansion(int elen, REAL *e, REAL b, REAL *h) +/* e and h cannot be the same. */ +{ + INEXACT REAL Q; + INEXACT REAL sum; + INEXACT REAL product1; + REAL product0; + int eindex, hindex; + REAL enow; + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + + Split(b, bhi, blo); + Two_Product_Presplit(e[0], b, bhi, blo, Q, h[0]); + hindex = 1; + for (eindex = 1; eindex < elen; eindex++) { + enow = e[eindex]; + Two_Product_Presplit(enow, b, bhi, blo, product1, product0); + Two_Sum(Q, product0, sum, h[hindex]); + hindex++; + Two_Sum(product1, sum, Q, h[hindex]); + hindex++; + } + h[hindex] = Q; + return elen + elen; +} + +/*****************************************************************************/ +/* */ +/* scale_expansion_zeroelim() Multiply an expansion by a scalar, */ +/* eliminating zero components from the */ +/* output expansion. */ +/* */ +/* Sets h = be. See either version of my paper for details. */ +/* */ +/* Maintains the nonoverlapping property. If round-to-even is used (as */ +/* with IEEE 754), maintains the strongly nonoverlapping and nonadjacent */ +/* properties as well. (That is, if e has one of these properties, so */ +/* will h.) */ +/* */ +/*****************************************************************************/ + +int scale_expansion_zeroelim(int elen, REAL *e, REAL b, REAL *h) +/* e and h cannot be the same. */ +{ + INEXACT REAL Q, sum; + REAL hh; + INEXACT REAL product1; + REAL product0; + int eindex, hindex; + REAL enow; + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + + Split(b, bhi, blo); + Two_Product_Presplit(e[0], b, bhi, blo, Q, hh); + hindex = 0; + if (hh != 0) { + h[hindex++] = hh; + } + for (eindex = 1; eindex < elen; eindex++) { + enow = e[eindex]; + Two_Product_Presplit(enow, b, bhi, blo, product1, product0); + Two_Sum(Q, product0, sum, hh); + if (hh != 0) { + h[hindex++] = hh; + } + Fast_Two_Sum(product1, sum, Q, hh); + if (hh != 0) { + h[hindex++] = hh; + } + } + if ((Q != 0.0) || (hindex == 0)) { + h[hindex++] = Q; + } + return hindex; +} + +/*****************************************************************************/ +/* */ +/* compress() Compress an expansion. */ +/* */ +/* See the long version of my paper for details. */ +/* */ +/* Maintains the nonoverlapping property. If round-to-even is used (as */ +/* with IEEE 754), then any nonoverlapping expansion is converted to a */ +/* nonadjacent expansion. */ +/* */ +/*****************************************************************************/ + +int compress(int elen, REAL *e, REAL *h) +/* e and h may be the same. */ +{ + REAL Q, q; + INEXACT REAL Qnew; + int eindex, hindex; + INEXACT REAL bvirt; + REAL enow, hnow; + int top, bottom; + + bottom = elen - 1; + Q = e[bottom]; + for (eindex = elen - 2; eindex >= 0; eindex--) { + enow = e[eindex]; + Fast_Two_Sum(Q, enow, Qnew, q); + if (q != 0) { + h[bottom--] = Qnew; + Q = q; + } else { + Q = Qnew; + } + } + top = 0; + for (hindex = bottom + 1; hindex < elen; hindex++) { + hnow = h[hindex]; + Fast_Two_Sum(hnow, Q, Qnew, q); + if (q != 0) { + h[top++] = q; + } + Q = Qnew; + } + h[top] = Q; + return top + 1; +} + +/*****************************************************************************/ +/* */ +/* estimate() Produce a one-word estimate of an expansion's value. */ +/* */ +/* See either version of my paper for details. */ +/* */ +/*****************************************************************************/ + +REAL estimate(int elen, REAL *e) +{ + REAL Q; + int eindex; + + Q = e[0]; + for (eindex = 1; eindex < elen; eindex++) { + Q += e[eindex]; + } + return Q; +} + +/*****************************************************************************/ +/* */ +/* orient2dfast() Approximate 2D orientation test. Nonrobust. */ +/* orient2dexact() Exact 2D orientation test. Robust. */ +/* orient2dslow() Another exact 2D orientation test. Robust. */ +/* orient2d() Adaptive exact 2D orientation test. Robust. */ +/* */ +/* Return a positive value if the points pa, pb, and pc occur */ +/* in counterclockwise order; a negative value if they occur */ +/* in clockwise order; and zero if they are collinear. The */ +/* result is also a rough approximation of twice the signed */ +/* area of the triangle defined by the three points. */ +/* */ +/* Only the first and last routine should be used; the middle two are for */ +/* timings. */ +/* */ +/* The last three use exact arithmetic to ensure a correct answer. The */ +/* result returned is the determinant of a matrix. In orient2d() only, */ +/* this determinant is computed adaptively, in the sense that exact */ +/* arithmetic is used only to the degree it is needed to ensure that the */ +/* returned value has the correct sign. Hence, orient2d() is usually quite */ +/* fast, but will run more slowly when the input points are collinear or */ +/* nearly so. */ +/* */ +/*****************************************************************************/ + +REAL orient2dfast(REAL *pa, REAL *pb, REAL *pc) +{ + REAL acx, bcx, acy, bcy; + + acx = pa[0] - pc[0]; + bcx = pb[0] - pc[0]; + acy = pa[1] - pc[1]; + bcy = pb[1] - pc[1]; + return acx * bcy - acy * bcx; +} + +REAL orient2dexact(REAL *pa, REAL *pb, REAL *pc) +{ + INEXACT REAL axby1, axcy1, bxcy1, bxay1, cxay1, cxby1; + REAL axby0, axcy0, bxcy0, bxay0, cxay0, cxby0; + REAL aterms[4], bterms[4], cterms[4]; + INEXACT REAL aterms3, bterms3, cterms3; + REAL v[8], w[12]; + int vlength, wlength; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j; + REAL _0; + + Two_Product(pa[0], pb[1], axby1, axby0); + Two_Product(pa[0], pc[1], axcy1, axcy0); + Two_Two_Diff(axby1, axby0, axcy1, axcy0, + aterms3, aterms[2], aterms[1], aterms[0]); + aterms[3] = aterms3; + + Two_Product(pb[0], pc[1], bxcy1, bxcy0); + Two_Product(pb[0], pa[1], bxay1, bxay0); + Two_Two_Diff(bxcy1, bxcy0, bxay1, bxay0, + bterms3, bterms[2], bterms[1], bterms[0]); + bterms[3] = bterms3; + + Two_Product(pc[0], pa[1], cxay1, cxay0); + Two_Product(pc[0], pb[1], cxby1, cxby0); + Two_Two_Diff(cxay1, cxay0, cxby1, cxby0, + cterms3, cterms[2], cterms[1], cterms[0]); + cterms[3] = cterms3; + + vlength = fast_expansion_sum_zeroelim(4, aterms, 4, bterms, v); + wlength = fast_expansion_sum_zeroelim(vlength, v, 4, cterms, w); + + return w[wlength - 1]; +} + +REAL orient2dslow(REAL *pa, REAL *pb, REAL *pc) +{ + INEXACT REAL acx, acy, bcx, bcy; + REAL acxtail, acytail; + REAL bcxtail, bcytail; + REAL negate, negatetail; + REAL axby[8], bxay[8]; + INEXACT REAL axby7, bxay7; + REAL deter[16]; + int deterlen; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL a0hi, a0lo, a1hi, a1lo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j, _k, _l, _m, _n; + REAL _0, _1, _2; + + Two_Diff(pa[0], pc[0], acx, acxtail); + Two_Diff(pa[1], pc[1], acy, acytail); + Two_Diff(pb[0], pc[0], bcx, bcxtail); + Two_Diff(pb[1], pc[1], bcy, bcytail); + + Two_Two_Product(acx, acxtail, bcy, bcytail, + axby7, axby[6], axby[5], axby[4], + axby[3], axby[2], axby[1], axby[0]); + axby[7] = axby7; + negate = -acy; + negatetail = -acytail; + Two_Two_Product(bcx, bcxtail, negate, negatetail, + bxay7, bxay[6], bxay[5], bxay[4], + bxay[3], bxay[2], bxay[1], bxay[0]); + bxay[7] = bxay7; + + deterlen = fast_expansion_sum_zeroelim(8, axby, 8, bxay, deter); + + return deter[deterlen - 1]; +} + +REAL orient2dadapt(REAL *pa, REAL *pb, REAL *pc, REAL detsum) +{ + INEXACT REAL acx, acy, bcx, bcy; + REAL acxtail, acytail, bcxtail, bcytail; + INEXACT REAL detleft, detright; + REAL detlefttail, detrighttail; + REAL det, errbound; + REAL B[4], C1[8], C2[12], D[16]; + INEXACT REAL B3; + int C1length, C2length, Dlength; + REAL u[4]; + INEXACT REAL u3; + INEXACT REAL s1, t1; + REAL s0, t0; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j; + REAL _0; + + acx = (REAL) (pa[0] - pc[0]); + bcx = (REAL) (pb[0] - pc[0]); + acy = (REAL) (pa[1] - pc[1]); + bcy = (REAL) (pb[1] - pc[1]); + + Two_Product(acx, bcy, detleft, detlefttail); + Two_Product(acy, bcx, detright, detrighttail); + + Two_Two_Diff(detleft, detlefttail, detright, detrighttail, + B3, B[2], B[1], B[0]); + B[3] = B3; + + det = estimate(4, B); + errbound = ccwerrboundB * detsum; + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + Two_Diff_Tail(pa[0], pc[0], acx, acxtail); + Two_Diff_Tail(pb[0], pc[0], bcx, bcxtail); + Two_Diff_Tail(pa[1], pc[1], acy, acytail); + Two_Diff_Tail(pb[1], pc[1], bcy, bcytail); + + if ((acxtail == 0.0) && (acytail == 0.0) + && (bcxtail == 0.0) && (bcytail == 0.0)) { + return det; + } + + errbound = ccwerrboundC * detsum + resulterrbound * Absolute(det); + det += (acx * bcytail + bcy * acxtail) + - (acy * bcxtail + bcx * acytail); + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + Two_Product(acxtail, bcy, s1, s0); + Two_Product(acytail, bcx, t1, t0); + Two_Two_Diff(s1, s0, t1, t0, u3, u[2], u[1], u[0]); + u[3] = u3; + C1length = fast_expansion_sum_zeroelim(4, B, 4, u, C1); + + Two_Product(acx, bcytail, s1, s0); + Two_Product(acy, bcxtail, t1, t0); + Two_Two_Diff(s1, s0, t1, t0, u3, u[2], u[1], u[0]); + u[3] = u3; + C2length = fast_expansion_sum_zeroelim(C1length, C1, 4, u, C2); + + Two_Product(acxtail, bcytail, s1, s0); + Two_Product(acytail, bcxtail, t1, t0); + Two_Two_Diff(s1, s0, t1, t0, u3, u[2], u[1], u[0]); + u[3] = u3; + Dlength = fast_expansion_sum_zeroelim(C2length, C2, 4, u, D); + + return(D[Dlength - 1]); +} + +REAL orient2d(REAL *pa, REAL *pb, REAL *pc) +{ + REAL detleft, detright, det; + REAL detsum, errbound; + + detleft = (pa[0] - pc[0]) * (pb[1] - pc[1]); + detright = (pa[1] - pc[1]) * (pb[0] - pc[0]); + det = detleft - detright; + + if (detleft > 0.0) { + if (detright <= 0.0) { + return det; + } else { + detsum = detleft + detright; + } + } else if (detleft < 0.0) { + if (detright >= 0.0) { + return det; + } else { + detsum = -detleft - detright; + } + } else { + return det; + } + + errbound = ccwerrboundA * detsum; + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + return orient2dadapt(pa, pb, pc, detsum); +} + +/*****************************************************************************/ +/* */ +/* orient3dfast() Approximate 3D orientation test. Nonrobust. */ +/* orient3dexact() Exact 3D orientation test. Robust. */ +/* orient3dslow() Another exact 3D orientation test. Robust. */ +/* orient3d() Adaptive exact 3D orientation test. Robust. */ +/* */ +/* Return a positive value if the point pd lies below the */ +/* plane passing through pa, pb, and pc; "below" is defined so */ +/* that pa, pb, and pc appear in counterclockwise order when */ +/* viewed from above the plane. Returns a negative value if */ +/* pd lies above the plane. Returns zero if the points are */ +/* coplanar. The result is also a rough approximation of six */ +/* times the signed volume of the tetrahedron defined by the */ +/* four points. */ +/* */ +/* Only the first and last routine should be used; the middle two are for */ +/* timings. */ +/* */ +/* The last three use exact arithmetic to ensure a correct answer. The */ +/* result returned is the determinant of a matrix. In orient3d() only, */ +/* this determinant is computed adaptively, in the sense that exact */ +/* arithmetic is used only to the degree it is needed to ensure that the */ +/* returned value has the correct sign. Hence, orient3d() is usually quite */ +/* fast, but will run more slowly when the input points are coplanar or */ +/* nearly so. */ +/* */ +/*****************************************************************************/ + +REAL orient3dfast(REAL *pa, REAL *pb, REAL *pc, REAL *pd) +{ + REAL adx, bdx, cdx; + REAL ady, bdy, cdy; + REAL adz, bdz, cdz; + + adx = pa[0] - pd[0]; + bdx = pb[0] - pd[0]; + cdx = pc[0] - pd[0]; + ady = pa[1] - pd[1]; + bdy = pb[1] - pd[1]; + cdy = pc[1] - pd[1]; + adz = pa[2] - pd[2]; + bdz = pb[2] - pd[2]; + cdz = pc[2] - pd[2]; + + return adx * (bdy * cdz - bdz * cdy) + + bdx * (cdy * adz - cdz * ady) + + cdx * (ady * bdz - adz * bdy); +} + +REAL orient3dexact(REAL *pa, REAL *pb, REAL *pc, REAL *pd) +{ + INEXACT REAL axby1, bxcy1, cxdy1, dxay1, axcy1, bxdy1; + INEXACT REAL bxay1, cxby1, dxcy1, axdy1, cxay1, dxby1; + REAL axby0, bxcy0, cxdy0, dxay0, axcy0, bxdy0; + REAL bxay0, cxby0, dxcy0, axdy0, cxay0, dxby0; + REAL ab[4], bc[4], cd[4], da[4], ac[4], bd[4]; + REAL temp8[8]; + int templen; + REAL abc[12], bcd[12], cda[12], dab[12]; + int abclen, bcdlen, cdalen, dablen; + REAL adet[24], bdet[24], cdet[24], ddet[24]; + int alen, blen, clen, dlen; + REAL abdet[48], cddet[48]; + int ablen, cdlen; + REAL deter[96]; + int deterlen; + int i; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j; + REAL _0; + + Two_Product(pa[0], pb[1], axby1, axby0); + Two_Product(pb[0], pa[1], bxay1, bxay0); + Two_Two_Diff(axby1, axby0, bxay1, bxay0, ab[3], ab[2], ab[1], ab[0]); + + Two_Product(pb[0], pc[1], bxcy1, bxcy0); + Two_Product(pc[0], pb[1], cxby1, cxby0); + Two_Two_Diff(bxcy1, bxcy0, cxby1, cxby0, bc[3], bc[2], bc[1], bc[0]); + + Two_Product(pc[0], pd[1], cxdy1, cxdy0); + Two_Product(pd[0], pc[1], dxcy1, dxcy0); + Two_Two_Diff(cxdy1, cxdy0, dxcy1, dxcy0, cd[3], cd[2], cd[1], cd[0]); + + Two_Product(pd[0], pa[1], dxay1, dxay0); + Two_Product(pa[0], pd[1], axdy1, axdy0); + Two_Two_Diff(dxay1, dxay0, axdy1, axdy0, da[3], da[2], da[1], da[0]); + + Two_Product(pa[0], pc[1], axcy1, axcy0); + Two_Product(pc[0], pa[1], cxay1, cxay0); + Two_Two_Diff(axcy1, axcy0, cxay1, cxay0, ac[3], ac[2], ac[1], ac[0]); + + Two_Product(pb[0], pd[1], bxdy1, bxdy0); + Two_Product(pd[0], pb[1], dxby1, dxby0); + Two_Two_Diff(bxdy1, bxdy0, dxby1, dxby0, bd[3], bd[2], bd[1], bd[0]); + + templen = fast_expansion_sum_zeroelim(4, cd, 4, da, temp8); + cdalen = fast_expansion_sum_zeroelim(templen, temp8, 4, ac, cda); + templen = fast_expansion_sum_zeroelim(4, da, 4, ab, temp8); + dablen = fast_expansion_sum_zeroelim(templen, temp8, 4, bd, dab); + for (i = 0; i < 4; i++) { + bd[i] = -bd[i]; + ac[i] = -ac[i]; + } + templen = fast_expansion_sum_zeroelim(4, ab, 4, bc, temp8); + abclen = fast_expansion_sum_zeroelim(templen, temp8, 4, ac, abc); + templen = fast_expansion_sum_zeroelim(4, bc, 4, cd, temp8); + bcdlen = fast_expansion_sum_zeroelim(templen, temp8, 4, bd, bcd); + + alen = scale_expansion_zeroelim(bcdlen, bcd, pa[2], adet); + blen = scale_expansion_zeroelim(cdalen, cda, -pb[2], bdet); + clen = scale_expansion_zeroelim(dablen, dab, pc[2], cdet); + dlen = scale_expansion_zeroelim(abclen, abc, -pd[2], ddet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + cdlen = fast_expansion_sum_zeroelim(clen, cdet, dlen, ddet, cddet); + deterlen = fast_expansion_sum_zeroelim(ablen, abdet, cdlen, cddet, deter); + + return deter[deterlen - 1]; +} + +REAL orient3dslow(REAL *pa, REAL *pb, REAL *pc, REAL *pd) +{ + INEXACT REAL adx, ady, adz, bdx, bdy, bdz, cdx, cdy, cdz; + REAL adxtail, adytail, adztail; + REAL bdxtail, bdytail, bdztail; + REAL cdxtail, cdytail, cdztail; + REAL negate, negatetail; + INEXACT REAL axby7, bxcy7, axcy7, bxay7, cxby7, cxay7; + REAL axby[8], bxcy[8], axcy[8], bxay[8], cxby[8], cxay[8]; + REAL temp16[16], temp32[32], temp32t[32]; + int temp16len, temp32len, temp32tlen; + REAL adet[64], bdet[64], cdet[64]; + int alen, blen, clen; + REAL abdet[128]; + int ablen; + REAL deter[192]; + int deterlen; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL a0hi, a0lo, a1hi, a1lo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j, _k, _l, _m, _n; + REAL _0, _1, _2; + + Two_Diff(pa[0], pd[0], adx, adxtail); + Two_Diff(pa[1], pd[1], ady, adytail); + Two_Diff(pa[2], pd[2], adz, adztail); + Two_Diff(pb[0], pd[0], bdx, bdxtail); + Two_Diff(pb[1], pd[1], bdy, bdytail); + Two_Diff(pb[2], pd[2], bdz, bdztail); + Two_Diff(pc[0], pd[0], cdx, cdxtail); + Two_Diff(pc[1], pd[1], cdy, cdytail); + Two_Diff(pc[2], pd[2], cdz, cdztail); + + Two_Two_Product(adx, adxtail, bdy, bdytail, + axby7, axby[6], axby[5], axby[4], + axby[3], axby[2], axby[1], axby[0]); + axby[7] = axby7; + negate = -ady; + negatetail = -adytail; + Two_Two_Product(bdx, bdxtail, negate, negatetail, + bxay7, bxay[6], bxay[5], bxay[4], + bxay[3], bxay[2], bxay[1], bxay[0]); + bxay[7] = bxay7; + Two_Two_Product(bdx, bdxtail, cdy, cdytail, + bxcy7, bxcy[6], bxcy[5], bxcy[4], + bxcy[3], bxcy[2], bxcy[1], bxcy[0]); + bxcy[7] = bxcy7; + negate = -bdy; + negatetail = -bdytail; + Two_Two_Product(cdx, cdxtail, negate, negatetail, + cxby7, cxby[6], cxby[5], cxby[4], + cxby[3], cxby[2], cxby[1], cxby[0]); + cxby[7] = cxby7; + Two_Two_Product(cdx, cdxtail, ady, adytail, + cxay7, cxay[6], cxay[5], cxay[4], + cxay[3], cxay[2], cxay[1], cxay[0]); + cxay[7] = cxay7; + negate = -cdy; + negatetail = -cdytail; + Two_Two_Product(adx, adxtail, negate, negatetail, + axcy7, axcy[6], axcy[5], axcy[4], + axcy[3], axcy[2], axcy[1], axcy[0]); + axcy[7] = axcy7; + + temp16len = fast_expansion_sum_zeroelim(8, bxcy, 8, cxby, temp16); + temp32len = scale_expansion_zeroelim(temp16len, temp16, adz, temp32); + temp32tlen = scale_expansion_zeroelim(temp16len, temp16, adztail, temp32t); + alen = fast_expansion_sum_zeroelim(temp32len, temp32, temp32tlen, temp32t, + adet); + + temp16len = fast_expansion_sum_zeroelim(8, cxay, 8, axcy, temp16); + temp32len = scale_expansion_zeroelim(temp16len, temp16, bdz, temp32); + temp32tlen = scale_expansion_zeroelim(temp16len, temp16, bdztail, temp32t); + blen = fast_expansion_sum_zeroelim(temp32len, temp32, temp32tlen, temp32t, + bdet); + + temp16len = fast_expansion_sum_zeroelim(8, axby, 8, bxay, temp16); + temp32len = scale_expansion_zeroelim(temp16len, temp16, cdz, temp32); + temp32tlen = scale_expansion_zeroelim(temp16len, temp16, cdztail, temp32t); + clen = fast_expansion_sum_zeroelim(temp32len, temp32, temp32tlen, temp32t, + cdet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + deterlen = fast_expansion_sum_zeroelim(ablen, abdet, clen, cdet, deter); + + return deter[deterlen - 1]; +} + +REAL orient3dadapt(REAL *pa, REAL *pb, REAL *pc, REAL *pd, REAL permanent) +{ + INEXACT REAL adx, bdx, cdx, ady, bdy, cdy, adz, bdz, cdz; + REAL det, errbound; + + INEXACT REAL bdxcdy1, cdxbdy1, cdxady1, adxcdy1, adxbdy1, bdxady1; + REAL bdxcdy0, cdxbdy0, cdxady0, adxcdy0, adxbdy0, bdxady0; + REAL bc[4], ca[4], ab[4]; + INEXACT REAL bc3, ca3, ab3; + REAL adet[8], bdet[8], cdet[8]; + int alen, blen, clen; + REAL abdet[16]; + int ablen; + REAL *finnow, *finother, *finswap; + REAL fin1[192], fin2[192]; + int finlength; + + + REAL adxtail, bdxtail, cdxtail; + REAL adytail, bdytail, cdytail; + REAL adztail, bdztail, cdztail; + INEXACT REAL at_blarge, at_clarge; + INEXACT REAL bt_clarge, bt_alarge; + INEXACT REAL ct_alarge, ct_blarge; + REAL at_b[4], at_c[4], bt_c[4], bt_a[4], ct_a[4], ct_b[4]; + int at_blen, at_clen, bt_clen, bt_alen, ct_alen, ct_blen; + INEXACT REAL bdxt_cdy1, cdxt_bdy1, cdxt_ady1; + INEXACT REAL adxt_cdy1, adxt_bdy1, bdxt_ady1; + REAL bdxt_cdy0, cdxt_bdy0, cdxt_ady0; + REAL adxt_cdy0, adxt_bdy0, bdxt_ady0; + INEXACT REAL bdyt_cdx1, cdyt_bdx1, cdyt_adx1; + INEXACT REAL adyt_cdx1, adyt_bdx1, bdyt_adx1; + REAL bdyt_cdx0, cdyt_bdx0, cdyt_adx0; + REAL adyt_cdx0, adyt_bdx0, bdyt_adx0; + REAL bct[8], cat[8], abt[8]; + int bctlen, catlen, abtlen; + INEXACT REAL bdxt_cdyt1, cdxt_bdyt1, cdxt_adyt1; + INEXACT REAL adxt_cdyt1, adxt_bdyt1, bdxt_adyt1; + REAL bdxt_cdyt0, cdxt_bdyt0, cdxt_adyt0; + REAL adxt_cdyt0, adxt_bdyt0, bdxt_adyt0; + REAL u[4], v[12], w[16]; + INEXACT REAL u3; + int vlength, wlength; + REAL negate; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j, _k; + REAL _0; + + + adx = (REAL) (pa[0] - pd[0]); + bdx = (REAL) (pb[0] - pd[0]); + cdx = (REAL) (pc[0] - pd[0]); + ady = (REAL) (pa[1] - pd[1]); + bdy = (REAL) (pb[1] - pd[1]); + cdy = (REAL) (pc[1] - pd[1]); + adz = (REAL) (pa[2] - pd[2]); + bdz = (REAL) (pb[2] - pd[2]); + cdz = (REAL) (pc[2] - pd[2]); + + Two_Product(bdx, cdy, bdxcdy1, bdxcdy0); + Two_Product(cdx, bdy, cdxbdy1, cdxbdy0); + Two_Two_Diff(bdxcdy1, bdxcdy0, cdxbdy1, cdxbdy0, bc3, bc[2], bc[1], bc[0]); + bc[3] = bc3; + alen = scale_expansion_zeroelim(4, bc, adz, adet); + + Two_Product(cdx, ady, cdxady1, cdxady0); + Two_Product(adx, cdy, adxcdy1, adxcdy0); + Two_Two_Diff(cdxady1, cdxady0, adxcdy1, adxcdy0, ca3, ca[2], ca[1], ca[0]); + ca[3] = ca3; + blen = scale_expansion_zeroelim(4, ca, bdz, bdet); + + Two_Product(adx, bdy, adxbdy1, adxbdy0); + Two_Product(bdx, ady, bdxady1, bdxady0); + Two_Two_Diff(adxbdy1, adxbdy0, bdxady1, bdxady0, ab3, ab[2], ab[1], ab[0]); + ab[3] = ab3; + clen = scale_expansion_zeroelim(4, ab, cdz, cdet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + finlength = fast_expansion_sum_zeroelim(ablen, abdet, clen, cdet, fin1); + + det = estimate(finlength, fin1); + errbound = o3derrboundB * permanent; + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + Two_Diff_Tail(pa[0], pd[0], adx, adxtail); + Two_Diff_Tail(pb[0], pd[0], bdx, bdxtail); + Two_Diff_Tail(pc[0], pd[0], cdx, cdxtail); + Two_Diff_Tail(pa[1], pd[1], ady, adytail); + Two_Diff_Tail(pb[1], pd[1], bdy, bdytail); + Two_Diff_Tail(pc[1], pd[1], cdy, cdytail); + Two_Diff_Tail(pa[2], pd[2], adz, adztail); + Two_Diff_Tail(pb[2], pd[2], bdz, bdztail); + Two_Diff_Tail(pc[2], pd[2], cdz, cdztail); + + if ((adxtail == 0.0) && (bdxtail == 0.0) && (cdxtail == 0.0) + && (adytail == 0.0) && (bdytail == 0.0) && (cdytail == 0.0) + && (adztail == 0.0) && (bdztail == 0.0) && (cdztail == 0.0)) { + return det; + } + + errbound = o3derrboundC * permanent + resulterrbound * Absolute(det); + det += (adz * ((bdx * cdytail + cdy * bdxtail) + - (bdy * cdxtail + cdx * bdytail)) + + adztail * (bdx * cdy - bdy * cdx)) + + (bdz * ((cdx * adytail + ady * cdxtail) + - (cdy * adxtail + adx * cdytail)) + + bdztail * (cdx * ady - cdy * adx)) + + (cdz * ((adx * bdytail + bdy * adxtail) + - (ady * bdxtail + bdx * adytail)) + + cdztail * (adx * bdy - ady * bdx)); + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + finnow = fin1; + finother = fin2; + + if (adxtail == 0.0) { + if (adytail == 0.0) { + at_b[0] = 0.0; + at_blen = 1; + at_c[0] = 0.0; + at_clen = 1; + } else { + negate = -adytail; + Two_Product(negate, bdx, at_blarge, at_b[0]); + at_b[1] = at_blarge; + at_blen = 2; + Two_Product(adytail, cdx, at_clarge, at_c[0]); + at_c[1] = at_clarge; + at_clen = 2; + } + } else { + if (adytail == 0.0) { + Two_Product(adxtail, bdy, at_blarge, at_b[0]); + at_b[1] = at_blarge; + at_blen = 2; + negate = -adxtail; + Two_Product(negate, cdy, at_clarge, at_c[0]); + at_c[1] = at_clarge; + at_clen = 2; + } else { + Two_Product(adxtail, bdy, adxt_bdy1, adxt_bdy0); + Two_Product(adytail, bdx, adyt_bdx1, adyt_bdx0); + Two_Two_Diff(adxt_bdy1, adxt_bdy0, adyt_bdx1, adyt_bdx0, + at_blarge, at_b[2], at_b[1], at_b[0]); + at_b[3] = at_blarge; + at_blen = 4; + Two_Product(adytail, cdx, adyt_cdx1, adyt_cdx0); + Two_Product(adxtail, cdy, adxt_cdy1, adxt_cdy0); + Two_Two_Diff(adyt_cdx1, adyt_cdx0, adxt_cdy1, adxt_cdy0, + at_clarge, at_c[2], at_c[1], at_c[0]); + at_c[3] = at_clarge; + at_clen = 4; + } + } + if (bdxtail == 0.0) { + if (bdytail == 0.0) { + bt_c[0] = 0.0; + bt_clen = 1; + bt_a[0] = 0.0; + bt_alen = 1; + } else { + negate = -bdytail; + Two_Product(negate, cdx, bt_clarge, bt_c[0]); + bt_c[1] = bt_clarge; + bt_clen = 2; + Two_Product(bdytail, adx, bt_alarge, bt_a[0]); + bt_a[1] = bt_alarge; + bt_alen = 2; + } + } else { + if (bdytail == 0.0) { + Two_Product(bdxtail, cdy, bt_clarge, bt_c[0]); + bt_c[1] = bt_clarge; + bt_clen = 2; + negate = -bdxtail; + Two_Product(negate, ady, bt_alarge, bt_a[0]); + bt_a[1] = bt_alarge; + bt_alen = 2; + } else { + Two_Product(bdxtail, cdy, bdxt_cdy1, bdxt_cdy0); + Two_Product(bdytail, cdx, bdyt_cdx1, bdyt_cdx0); + Two_Two_Diff(bdxt_cdy1, bdxt_cdy0, bdyt_cdx1, bdyt_cdx0, + bt_clarge, bt_c[2], bt_c[1], bt_c[0]); + bt_c[3] = bt_clarge; + bt_clen = 4; + Two_Product(bdytail, adx, bdyt_adx1, bdyt_adx0); + Two_Product(bdxtail, ady, bdxt_ady1, bdxt_ady0); + Two_Two_Diff(bdyt_adx1, bdyt_adx0, bdxt_ady1, bdxt_ady0, + bt_alarge, bt_a[2], bt_a[1], bt_a[0]); + bt_a[3] = bt_alarge; + bt_alen = 4; + } + } + if (cdxtail == 0.0) { + if (cdytail == 0.0) { + ct_a[0] = 0.0; + ct_alen = 1; + ct_b[0] = 0.0; + ct_blen = 1; + } else { + negate = -cdytail; + Two_Product(negate, adx, ct_alarge, ct_a[0]); + ct_a[1] = ct_alarge; + ct_alen = 2; + Two_Product(cdytail, bdx, ct_blarge, ct_b[0]); + ct_b[1] = ct_blarge; + ct_blen = 2; + } + } else { + if (cdytail == 0.0) { + Two_Product(cdxtail, ady, ct_alarge, ct_a[0]); + ct_a[1] = ct_alarge; + ct_alen = 2; + negate = -cdxtail; + Two_Product(negate, bdy, ct_blarge, ct_b[0]); + ct_b[1] = ct_blarge; + ct_blen = 2; + } else { + Two_Product(cdxtail, ady, cdxt_ady1, cdxt_ady0); + Two_Product(cdytail, adx, cdyt_adx1, cdyt_adx0); + Two_Two_Diff(cdxt_ady1, cdxt_ady0, cdyt_adx1, cdyt_adx0, + ct_alarge, ct_a[2], ct_a[1], ct_a[0]); + ct_a[3] = ct_alarge; + ct_alen = 4; + Two_Product(cdytail, bdx, cdyt_bdx1, cdyt_bdx0); + Two_Product(cdxtail, bdy, cdxt_bdy1, cdxt_bdy0); + Two_Two_Diff(cdyt_bdx1, cdyt_bdx0, cdxt_bdy1, cdxt_bdy0, + ct_blarge, ct_b[2], ct_b[1], ct_b[0]); + ct_b[3] = ct_blarge; + ct_blen = 4; + } + } + + bctlen = fast_expansion_sum_zeroelim(bt_clen, bt_c, ct_blen, ct_b, bct); + wlength = scale_expansion_zeroelim(bctlen, bct, adz, w); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, wlength, w, + finother); + finswap = finnow; finnow = finother; finother = finswap; + + catlen = fast_expansion_sum_zeroelim(ct_alen, ct_a, at_clen, at_c, cat); + wlength = scale_expansion_zeroelim(catlen, cat, bdz, w); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, wlength, w, + finother); + finswap = finnow; finnow = finother; finother = finswap; + + abtlen = fast_expansion_sum_zeroelim(at_blen, at_b, bt_alen, bt_a, abt); + wlength = scale_expansion_zeroelim(abtlen, abt, cdz, w); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, wlength, w, + finother); + finswap = finnow; finnow = finother; finother = finswap; + + if (adztail != 0.0) { + vlength = scale_expansion_zeroelim(4, bc, adztail, v); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, vlength, v, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (bdztail != 0.0) { + vlength = scale_expansion_zeroelim(4, ca, bdztail, v); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, vlength, v, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (cdztail != 0.0) { + vlength = scale_expansion_zeroelim(4, ab, cdztail, v); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, vlength, v, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + + if (adxtail != 0.0) { + if (bdytail != 0.0) { + Two_Product(adxtail, bdytail, adxt_bdyt1, adxt_bdyt0); + Two_One_Product(adxt_bdyt1, adxt_bdyt0, cdz, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + if (cdztail != 0.0) { + Two_One_Product(adxt_bdyt1, adxt_bdyt0, cdztail, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + } + if (cdytail != 0.0) { + negate = -adxtail; + Two_Product(negate, cdytail, adxt_cdyt1, adxt_cdyt0); + Two_One_Product(adxt_cdyt1, adxt_cdyt0, bdz, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + if (bdztail != 0.0) { + Two_One_Product(adxt_cdyt1, adxt_cdyt0, bdztail, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + } + } + if (bdxtail != 0.0) { + if (cdytail != 0.0) { + Two_Product(bdxtail, cdytail, bdxt_cdyt1, bdxt_cdyt0); + Two_One_Product(bdxt_cdyt1, bdxt_cdyt0, adz, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + if (adztail != 0.0) { + Two_One_Product(bdxt_cdyt1, bdxt_cdyt0, adztail, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + } + if (adytail != 0.0) { + negate = -bdxtail; + Two_Product(negate, adytail, bdxt_adyt1, bdxt_adyt0); + Two_One_Product(bdxt_adyt1, bdxt_adyt0, cdz, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + if (cdztail != 0.0) { + Two_One_Product(bdxt_adyt1, bdxt_adyt0, cdztail, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + } + } + if (cdxtail != 0.0) { + if (adytail != 0.0) { + Two_Product(cdxtail, adytail, cdxt_adyt1, cdxt_adyt0); + Two_One_Product(cdxt_adyt1, cdxt_adyt0, bdz, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + if (bdztail != 0.0) { + Two_One_Product(cdxt_adyt1, cdxt_adyt0, bdztail, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + } + if (bdytail != 0.0) { + negate = -cdxtail; + Two_Product(negate, bdytail, cdxt_bdyt1, cdxt_bdyt0); + Two_One_Product(cdxt_bdyt1, cdxt_bdyt0, adz, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + if (adztail != 0.0) { + Two_One_Product(cdxt_bdyt1, cdxt_bdyt0, adztail, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + } + } + + if (adztail != 0.0) { + wlength = scale_expansion_zeroelim(bctlen, bct, adztail, w); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, wlength, w, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (bdztail != 0.0) { + wlength = scale_expansion_zeroelim(catlen, cat, bdztail, w); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, wlength, w, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (cdztail != 0.0) { + wlength = scale_expansion_zeroelim(abtlen, abt, cdztail, w); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, wlength, w, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + + return finnow[finlength - 1]; +} + +#ifdef USE_CGAL_PREDICATES + +REAL orient3d(REAL *pa, REAL *pb, REAL *pc, REAL *pd) +{ + return (REAL) + - cgal_pred_obj.orientation_3_object() + (Point(pa[0], pa[1], pa[2]), + Point(pb[0], pb[1], pb[2]), + Point(pc[0], pc[1], pc[2]), + Point(pd[0], pd[1], pd[2])); +} + +#else + +REAL orient3d(REAL *pa, REAL *pb, REAL *pc, REAL *pd) +{ + REAL adx, bdx, cdx, ady, bdy, cdy, adz, bdz, cdz; + REAL bdxcdy, cdxbdy, cdxady, adxcdy, adxbdy, bdxady; + REAL det; + + + adx = pa[0] - pd[0]; + ady = pa[1] - pd[1]; + adz = pa[2] - pd[2]; + bdx = pb[0] - pd[0]; + bdy = pb[1] - pd[1]; + bdz = pb[2] - pd[2]; + cdx = pc[0] - pd[0]; + cdy = pc[1] - pd[1]; + cdz = pc[2] - pd[2]; + + bdxcdy = bdx * cdy; + cdxbdy = cdx * bdy; + + cdxady = cdx * ady; + adxcdy = adx * cdy; + + adxbdy = adx * bdy; + bdxady = bdx * ady; + + det = adz * (bdxcdy - cdxbdy) + + bdz * (cdxady - adxcdy) + + cdz * (adxbdy - bdxady); + + if (_use_inexact_arith) { + return det; + } + + if (_use_static_filter) { + //if (fabs(det) > o3dstaticfilter) return det; + if (det > o3dstaticfilter) return det; + if (det < -o3dstaticfilter) return det; + } + + + REAL permanent, errbound; + + permanent = (Absolute(bdxcdy) + Absolute(cdxbdy)) * Absolute(adz) + + (Absolute(cdxady) + Absolute(adxcdy)) * Absolute(bdz) + + (Absolute(adxbdy) + Absolute(bdxady)) * Absolute(cdz); + errbound = o3derrboundA * permanent; + if ((det > errbound) || (-det > errbound)) { + return det; + } + + return orient3dadapt(pa, pb, pc, pd, permanent); +} + +#endif // #ifdef USE_CGAL_PREDICATES + +/*****************************************************************************/ +/* */ +/* incirclefast() Approximate 2D incircle test. Nonrobust. */ +/* incircleexact() Exact 2D incircle test. Robust. */ +/* incircleslow() Another exact 2D incircle test. Robust. */ +/* incircle() Adaptive exact 2D incircle test. Robust. */ +/* */ +/* Return a positive value if the point pd lies inside the */ +/* circle passing through pa, pb, and pc; a negative value if */ +/* it lies outside; and zero if the four points are cocircular.*/ +/* The points pa, pb, and pc must be in counterclockwise */ +/* order, or the sign of the result will be reversed. */ +/* */ +/* Only the first and last routine should be used; the middle two are for */ +/* timings. */ +/* */ +/* The last three use exact arithmetic to ensure a correct answer. The */ +/* result returned is the determinant of a matrix. In incircle() only, */ +/* this determinant is computed adaptively, in the sense that exact */ +/* arithmetic is used only to the degree it is needed to ensure that the */ +/* returned value has the correct sign. Hence, incircle() is usually quite */ +/* fast, but will run more slowly when the input points are cocircular or */ +/* nearly so. */ +/* */ +/*****************************************************************************/ + +REAL incirclefast(REAL *pa, REAL *pb, REAL *pc, REAL *pd) +{ + REAL adx, ady, bdx, bdy, cdx, cdy; + REAL abdet, bcdet, cadet; + REAL alift, blift, clift; + + adx = pa[0] - pd[0]; + ady = pa[1] - pd[1]; + bdx = pb[0] - pd[0]; + bdy = pb[1] - pd[1]; + cdx = pc[0] - pd[0]; + cdy = pc[1] - pd[1]; + + abdet = adx * bdy - bdx * ady; + bcdet = bdx * cdy - cdx * bdy; + cadet = cdx * ady - adx * cdy; + alift = adx * adx + ady * ady; + blift = bdx * bdx + bdy * bdy; + clift = cdx * cdx + cdy * cdy; + + return alift * bcdet + blift * cadet + clift * abdet; +} + +REAL incircleexact(REAL *pa, REAL *pb, REAL *pc, REAL *pd) +{ + INEXACT REAL axby1, bxcy1, cxdy1, dxay1, axcy1, bxdy1; + INEXACT REAL bxay1, cxby1, dxcy1, axdy1, cxay1, dxby1; + REAL axby0, bxcy0, cxdy0, dxay0, axcy0, bxdy0; + REAL bxay0, cxby0, dxcy0, axdy0, cxay0, dxby0; + REAL ab[4], bc[4], cd[4], da[4], ac[4], bd[4]; + REAL temp8[8]; + int templen; + REAL abc[12], bcd[12], cda[12], dab[12]; + int abclen, bcdlen, cdalen, dablen; + REAL det24x[24], det24y[24], det48x[48], det48y[48]; + int xlen, ylen; + REAL adet[96], bdet[96], cdet[96], ddet[96]; + int alen, blen, clen, dlen; + REAL abdet[192], cddet[192]; + int ablen, cdlen; + REAL deter[384]; + int deterlen; + int i; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j; + REAL _0; + + Two_Product(pa[0], pb[1], axby1, axby0); + Two_Product(pb[0], pa[1], bxay1, bxay0); + Two_Two_Diff(axby1, axby0, bxay1, bxay0, ab[3], ab[2], ab[1], ab[0]); + + Two_Product(pb[0], pc[1], bxcy1, bxcy0); + Two_Product(pc[0], pb[1], cxby1, cxby0); + Two_Two_Diff(bxcy1, bxcy0, cxby1, cxby0, bc[3], bc[2], bc[1], bc[0]); + + Two_Product(pc[0], pd[1], cxdy1, cxdy0); + Two_Product(pd[0], pc[1], dxcy1, dxcy0); + Two_Two_Diff(cxdy1, cxdy0, dxcy1, dxcy0, cd[3], cd[2], cd[1], cd[0]); + + Two_Product(pd[0], pa[1], dxay1, dxay0); + Two_Product(pa[0], pd[1], axdy1, axdy0); + Two_Two_Diff(dxay1, dxay0, axdy1, axdy0, da[3], da[2], da[1], da[0]); + + Two_Product(pa[0], pc[1], axcy1, axcy0); + Two_Product(pc[0], pa[1], cxay1, cxay0); + Two_Two_Diff(axcy1, axcy0, cxay1, cxay0, ac[3], ac[2], ac[1], ac[0]); + + Two_Product(pb[0], pd[1], bxdy1, bxdy0); + Two_Product(pd[0], pb[1], dxby1, dxby0); + Two_Two_Diff(bxdy1, bxdy0, dxby1, dxby0, bd[3], bd[2], bd[1], bd[0]); + + templen = fast_expansion_sum_zeroelim(4, cd, 4, da, temp8); + cdalen = fast_expansion_sum_zeroelim(templen, temp8, 4, ac, cda); + templen = fast_expansion_sum_zeroelim(4, da, 4, ab, temp8); + dablen = fast_expansion_sum_zeroelim(templen, temp8, 4, bd, dab); + for (i = 0; i < 4; i++) { + bd[i] = -bd[i]; + ac[i] = -ac[i]; + } + templen = fast_expansion_sum_zeroelim(4, ab, 4, bc, temp8); + abclen = fast_expansion_sum_zeroelim(templen, temp8, 4, ac, abc); + templen = fast_expansion_sum_zeroelim(4, bc, 4, cd, temp8); + bcdlen = fast_expansion_sum_zeroelim(templen, temp8, 4, bd, bcd); + + xlen = scale_expansion_zeroelim(bcdlen, bcd, pa[0], det24x); + xlen = scale_expansion_zeroelim(xlen, det24x, pa[0], det48x); + ylen = scale_expansion_zeroelim(bcdlen, bcd, pa[1], det24y); + ylen = scale_expansion_zeroelim(ylen, det24y, pa[1], det48y); + alen = fast_expansion_sum_zeroelim(xlen, det48x, ylen, det48y, adet); + + xlen = scale_expansion_zeroelim(cdalen, cda, pb[0], det24x); + xlen = scale_expansion_zeroelim(xlen, det24x, -pb[0], det48x); + ylen = scale_expansion_zeroelim(cdalen, cda, pb[1], det24y); + ylen = scale_expansion_zeroelim(ylen, det24y, -pb[1], det48y); + blen = fast_expansion_sum_zeroelim(xlen, det48x, ylen, det48y, bdet); + + xlen = scale_expansion_zeroelim(dablen, dab, pc[0], det24x); + xlen = scale_expansion_zeroelim(xlen, det24x, pc[0], det48x); + ylen = scale_expansion_zeroelim(dablen, dab, pc[1], det24y); + ylen = scale_expansion_zeroelim(ylen, det24y, pc[1], det48y); + clen = fast_expansion_sum_zeroelim(xlen, det48x, ylen, det48y, cdet); + + xlen = scale_expansion_zeroelim(abclen, abc, pd[0], det24x); + xlen = scale_expansion_zeroelim(xlen, det24x, -pd[0], det48x); + ylen = scale_expansion_zeroelim(abclen, abc, pd[1], det24y); + ylen = scale_expansion_zeroelim(ylen, det24y, -pd[1], det48y); + dlen = fast_expansion_sum_zeroelim(xlen, det48x, ylen, det48y, ddet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + cdlen = fast_expansion_sum_zeroelim(clen, cdet, dlen, ddet, cddet); + deterlen = fast_expansion_sum_zeroelim(ablen, abdet, cdlen, cddet, deter); + + return deter[deterlen - 1]; +} + +REAL incircleslow(REAL *pa, REAL *pb, REAL *pc, REAL *pd) +{ + INEXACT REAL adx, bdx, cdx, ady, bdy, cdy; + REAL adxtail, bdxtail, cdxtail; + REAL adytail, bdytail, cdytail; + REAL negate, negatetail; + INEXACT REAL axby7, bxcy7, axcy7, bxay7, cxby7, cxay7; + REAL axby[8], bxcy[8], axcy[8], bxay[8], cxby[8], cxay[8]; + REAL temp16[16]; + int temp16len; + REAL detx[32], detxx[64], detxt[32], detxxt[64], detxtxt[64]; + int xlen, xxlen, xtlen, xxtlen, xtxtlen; + REAL x1[128], x2[192]; + int x1len, x2len; + REAL dety[32], detyy[64], detyt[32], detyyt[64], detytyt[64]; + int ylen, yylen, ytlen, yytlen, ytytlen; + REAL y1[128], y2[192]; + int y1len, y2len; + REAL adet[384], bdet[384], cdet[384], abdet[768], deter[1152]; + int alen, blen, clen, ablen, deterlen; + int i; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL a0hi, a0lo, a1hi, a1lo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j, _k, _l, _m, _n; + REAL _0, _1, _2; + + Two_Diff(pa[0], pd[0], adx, adxtail); + Two_Diff(pa[1], pd[1], ady, adytail); + Two_Diff(pb[0], pd[0], bdx, bdxtail); + Two_Diff(pb[1], pd[1], bdy, bdytail); + Two_Diff(pc[0], pd[0], cdx, cdxtail); + Two_Diff(pc[1], pd[1], cdy, cdytail); + + Two_Two_Product(adx, adxtail, bdy, bdytail, + axby7, axby[6], axby[5], axby[4], + axby[3], axby[2], axby[1], axby[0]); + axby[7] = axby7; + negate = -ady; + negatetail = -adytail; + Two_Two_Product(bdx, bdxtail, negate, negatetail, + bxay7, bxay[6], bxay[5], bxay[4], + bxay[3], bxay[2], bxay[1], bxay[0]); + bxay[7] = bxay7; + Two_Two_Product(bdx, bdxtail, cdy, cdytail, + bxcy7, bxcy[6], bxcy[5], bxcy[4], + bxcy[3], bxcy[2], bxcy[1], bxcy[0]); + bxcy[7] = bxcy7; + negate = -bdy; + negatetail = -bdytail; + Two_Two_Product(cdx, cdxtail, negate, negatetail, + cxby7, cxby[6], cxby[5], cxby[4], + cxby[3], cxby[2], cxby[1], cxby[0]); + cxby[7] = cxby7; + Two_Two_Product(cdx, cdxtail, ady, adytail, + cxay7, cxay[6], cxay[5], cxay[4], + cxay[3], cxay[2], cxay[1], cxay[0]); + cxay[7] = cxay7; + negate = -cdy; + negatetail = -cdytail; + Two_Two_Product(adx, adxtail, negate, negatetail, + axcy7, axcy[6], axcy[5], axcy[4], + axcy[3], axcy[2], axcy[1], axcy[0]); + axcy[7] = axcy7; + + + temp16len = fast_expansion_sum_zeroelim(8, bxcy, 8, cxby, temp16); + + xlen = scale_expansion_zeroelim(temp16len, temp16, adx, detx); + xxlen = scale_expansion_zeroelim(xlen, detx, adx, detxx); + xtlen = scale_expansion_zeroelim(temp16len, temp16, adxtail, detxt); + xxtlen = scale_expansion_zeroelim(xtlen, detxt, adx, detxxt); + for (i = 0; i < xxtlen; i++) { + detxxt[i] *= 2.0; + } + xtxtlen = scale_expansion_zeroelim(xtlen, detxt, adxtail, detxtxt); + x1len = fast_expansion_sum_zeroelim(xxlen, detxx, xxtlen, detxxt, x1); + x2len = fast_expansion_sum_zeroelim(x1len, x1, xtxtlen, detxtxt, x2); + + ylen = scale_expansion_zeroelim(temp16len, temp16, ady, dety); + yylen = scale_expansion_zeroelim(ylen, dety, ady, detyy); + ytlen = scale_expansion_zeroelim(temp16len, temp16, adytail, detyt); + yytlen = scale_expansion_zeroelim(ytlen, detyt, ady, detyyt); + for (i = 0; i < yytlen; i++) { + detyyt[i] *= 2.0; + } + ytytlen = scale_expansion_zeroelim(ytlen, detyt, adytail, detytyt); + y1len = fast_expansion_sum_zeroelim(yylen, detyy, yytlen, detyyt, y1); + y2len = fast_expansion_sum_zeroelim(y1len, y1, ytytlen, detytyt, y2); + + alen = fast_expansion_sum_zeroelim(x2len, x2, y2len, y2, adet); + + + temp16len = fast_expansion_sum_zeroelim(8, cxay, 8, axcy, temp16); + + xlen = scale_expansion_zeroelim(temp16len, temp16, bdx, detx); + xxlen = scale_expansion_zeroelim(xlen, detx, bdx, detxx); + xtlen = scale_expansion_zeroelim(temp16len, temp16, bdxtail, detxt); + xxtlen = scale_expansion_zeroelim(xtlen, detxt, bdx, detxxt); + for (i = 0; i < xxtlen; i++) { + detxxt[i] *= 2.0; + } + xtxtlen = scale_expansion_zeroelim(xtlen, detxt, bdxtail, detxtxt); + x1len = fast_expansion_sum_zeroelim(xxlen, detxx, xxtlen, detxxt, x1); + x2len = fast_expansion_sum_zeroelim(x1len, x1, xtxtlen, detxtxt, x2); + + ylen = scale_expansion_zeroelim(temp16len, temp16, bdy, dety); + yylen = scale_expansion_zeroelim(ylen, dety, bdy, detyy); + ytlen = scale_expansion_zeroelim(temp16len, temp16, bdytail, detyt); + yytlen = scale_expansion_zeroelim(ytlen, detyt, bdy, detyyt); + for (i = 0; i < yytlen; i++) { + detyyt[i] *= 2.0; + } + ytytlen = scale_expansion_zeroelim(ytlen, detyt, bdytail, detytyt); + y1len = fast_expansion_sum_zeroelim(yylen, detyy, yytlen, detyyt, y1); + y2len = fast_expansion_sum_zeroelim(y1len, y1, ytytlen, detytyt, y2); + + blen = fast_expansion_sum_zeroelim(x2len, x2, y2len, y2, bdet); + + + temp16len = fast_expansion_sum_zeroelim(8, axby, 8, bxay, temp16); + + xlen = scale_expansion_zeroelim(temp16len, temp16, cdx, detx); + xxlen = scale_expansion_zeroelim(xlen, detx, cdx, detxx); + xtlen = scale_expansion_zeroelim(temp16len, temp16, cdxtail, detxt); + xxtlen = scale_expansion_zeroelim(xtlen, detxt, cdx, detxxt); + for (i = 0; i < xxtlen; i++) { + detxxt[i] *= 2.0; + } + xtxtlen = scale_expansion_zeroelim(xtlen, detxt, cdxtail, detxtxt); + x1len = fast_expansion_sum_zeroelim(xxlen, detxx, xxtlen, detxxt, x1); + x2len = fast_expansion_sum_zeroelim(x1len, x1, xtxtlen, detxtxt, x2); + + ylen = scale_expansion_zeroelim(temp16len, temp16, cdy, dety); + yylen = scale_expansion_zeroelim(ylen, dety, cdy, detyy); + ytlen = scale_expansion_zeroelim(temp16len, temp16, cdytail, detyt); + yytlen = scale_expansion_zeroelim(ytlen, detyt, cdy, detyyt); + for (i = 0; i < yytlen; i++) { + detyyt[i] *= 2.0; + } + ytytlen = scale_expansion_zeroelim(ytlen, detyt, cdytail, detytyt); + y1len = fast_expansion_sum_zeroelim(yylen, detyy, yytlen, detyyt, y1); + y2len = fast_expansion_sum_zeroelim(y1len, y1, ytytlen, detytyt, y2); + + clen = fast_expansion_sum_zeroelim(x2len, x2, y2len, y2, cdet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + deterlen = fast_expansion_sum_zeroelim(ablen, abdet, clen, cdet, deter); + + return deter[deterlen - 1]; +} + +REAL incircleadapt(REAL *pa, REAL *pb, REAL *pc, REAL *pd, REAL permanent) +{ + INEXACT REAL adx, bdx, cdx, ady, bdy, cdy; + REAL det, errbound; + + INEXACT REAL bdxcdy1, cdxbdy1, cdxady1, adxcdy1, adxbdy1, bdxady1; + REAL bdxcdy0, cdxbdy0, cdxady0, adxcdy0, adxbdy0, bdxady0; + REAL bc[4], ca[4], ab[4]; + INEXACT REAL bc3, ca3, ab3; + REAL axbc[8], axxbc[16], aybc[8], ayybc[16], adet[32]; + int axbclen, axxbclen, aybclen, ayybclen, alen; + REAL bxca[8], bxxca[16], byca[8], byyca[16], bdet[32]; + int bxcalen, bxxcalen, bycalen, byycalen, blen; + REAL cxab[8], cxxab[16], cyab[8], cyyab[16], cdet[32]; + int cxablen, cxxablen, cyablen, cyyablen, clen; + REAL abdet[64]; + int ablen; + REAL fin1[1152], fin2[1152]; + REAL *finnow, *finother, *finswap; + int finlength; + + REAL adxtail, bdxtail, cdxtail, adytail, bdytail, cdytail; + INEXACT REAL adxadx1, adyady1, bdxbdx1, bdybdy1, cdxcdx1, cdycdy1; + REAL adxadx0, adyady0, bdxbdx0, bdybdy0, cdxcdx0, cdycdy0; + REAL aa[4], bb[4], cc[4]; + INEXACT REAL aa3, bb3, cc3; + INEXACT REAL ti1, tj1; + REAL ti0, tj0; + REAL u[4], v[4]; + INEXACT REAL u3, v3; + REAL temp8[8], temp16a[16], temp16b[16], temp16c[16]; + REAL temp32a[32], temp32b[32], temp48[48], temp64[64]; + int temp8len, temp16alen, temp16blen, temp16clen; + int temp32alen, temp32blen, temp48len, temp64len; + REAL axtbb[8], axtcc[8], aytbb[8], aytcc[8]; + int axtbblen, axtcclen, aytbblen, aytcclen; + REAL bxtaa[8], bxtcc[8], bytaa[8], bytcc[8]; + int bxtaalen, bxtcclen, bytaalen, bytcclen; + REAL cxtaa[8], cxtbb[8], cytaa[8], cytbb[8]; + int cxtaalen, cxtbblen, cytaalen, cytbblen; + REAL axtbc[8], aytbc[8], bxtca[8], bytca[8], cxtab[8], cytab[8]; + int axtbclen, aytbclen, bxtcalen, bytcalen, cxtablen, cytablen; + REAL axtbct[16], aytbct[16], bxtcat[16], bytcat[16], cxtabt[16], cytabt[16]; + int axtbctlen, aytbctlen, bxtcatlen, bytcatlen, cxtabtlen, cytabtlen; + REAL axtbctt[8], aytbctt[8], bxtcatt[8]; + REAL bytcatt[8], cxtabtt[8], cytabtt[8]; + int axtbcttlen, aytbcttlen, bxtcattlen, bytcattlen, cxtabttlen, cytabttlen; + REAL abt[8], bct[8], cat[8]; + int abtlen, bctlen, catlen; + REAL abtt[4], bctt[4], catt[4]; + int abttlen, bcttlen, cattlen; + INEXACT REAL abtt3, bctt3, catt3; + REAL negate; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j; + REAL _0; + + // Avoid compiler warnings. H. Si, 2012-02-16. + axtbclen = aytbclen = bxtcalen = bytcalen = cxtablen = cytablen = 0; + + adx = (REAL) (pa[0] - pd[0]); + bdx = (REAL) (pb[0] - pd[0]); + cdx = (REAL) (pc[0] - pd[0]); + ady = (REAL) (pa[1] - pd[1]); + bdy = (REAL) (pb[1] - pd[1]); + cdy = (REAL) (pc[1] - pd[1]); + + Two_Product(bdx, cdy, bdxcdy1, bdxcdy0); + Two_Product(cdx, bdy, cdxbdy1, cdxbdy0); + Two_Two_Diff(bdxcdy1, bdxcdy0, cdxbdy1, cdxbdy0, bc3, bc[2], bc[1], bc[0]); + bc[3] = bc3; + axbclen = scale_expansion_zeroelim(4, bc, adx, axbc); + axxbclen = scale_expansion_zeroelim(axbclen, axbc, adx, axxbc); + aybclen = scale_expansion_zeroelim(4, bc, ady, aybc); + ayybclen = scale_expansion_zeroelim(aybclen, aybc, ady, ayybc); + alen = fast_expansion_sum_zeroelim(axxbclen, axxbc, ayybclen, ayybc, adet); + + Two_Product(cdx, ady, cdxady1, cdxady0); + Two_Product(adx, cdy, adxcdy1, adxcdy0); + Two_Two_Diff(cdxady1, cdxady0, adxcdy1, adxcdy0, ca3, ca[2], ca[1], ca[0]); + ca[3] = ca3; + bxcalen = scale_expansion_zeroelim(4, ca, bdx, bxca); + bxxcalen = scale_expansion_zeroelim(bxcalen, bxca, bdx, bxxca); + bycalen = scale_expansion_zeroelim(4, ca, bdy, byca); + byycalen = scale_expansion_zeroelim(bycalen, byca, bdy, byyca); + blen = fast_expansion_sum_zeroelim(bxxcalen, bxxca, byycalen, byyca, bdet); + + Two_Product(adx, bdy, adxbdy1, adxbdy0); + Two_Product(bdx, ady, bdxady1, bdxady0); + Two_Two_Diff(adxbdy1, adxbdy0, bdxady1, bdxady0, ab3, ab[2], ab[1], ab[0]); + ab[3] = ab3; + cxablen = scale_expansion_zeroelim(4, ab, cdx, cxab); + cxxablen = scale_expansion_zeroelim(cxablen, cxab, cdx, cxxab); + cyablen = scale_expansion_zeroelim(4, ab, cdy, cyab); + cyyablen = scale_expansion_zeroelim(cyablen, cyab, cdy, cyyab); + clen = fast_expansion_sum_zeroelim(cxxablen, cxxab, cyyablen, cyyab, cdet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + finlength = fast_expansion_sum_zeroelim(ablen, abdet, clen, cdet, fin1); + + det = estimate(finlength, fin1); + errbound = iccerrboundB * permanent; + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + Two_Diff_Tail(pa[0], pd[0], adx, adxtail); + Two_Diff_Tail(pa[1], pd[1], ady, adytail); + Two_Diff_Tail(pb[0], pd[0], bdx, bdxtail); + Two_Diff_Tail(pb[1], pd[1], bdy, bdytail); + Two_Diff_Tail(pc[0], pd[0], cdx, cdxtail); + Two_Diff_Tail(pc[1], pd[1], cdy, cdytail); + if ((adxtail == 0.0) && (bdxtail == 0.0) && (cdxtail == 0.0) + && (adytail == 0.0) && (bdytail == 0.0) && (cdytail == 0.0)) { + return det; + } + + errbound = iccerrboundC * permanent + resulterrbound * Absolute(det); + det += ((adx * adx + ady * ady) * ((bdx * cdytail + cdy * bdxtail) + - (bdy * cdxtail + cdx * bdytail)) + + 2.0 * (adx * adxtail + ady * adytail) * (bdx * cdy - bdy * cdx)) + + ((bdx * bdx + bdy * bdy) * ((cdx * adytail + ady * cdxtail) + - (cdy * adxtail + adx * cdytail)) + + 2.0 * (bdx * bdxtail + bdy * bdytail) * (cdx * ady - cdy * adx)) + + ((cdx * cdx + cdy * cdy) * ((adx * bdytail + bdy * adxtail) + - (ady * bdxtail + bdx * adytail)) + + 2.0 * (cdx * cdxtail + cdy * cdytail) * (adx * bdy - ady * bdx)); + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + finnow = fin1; + finother = fin2; + + if ((bdxtail != 0.0) || (bdytail != 0.0) + || (cdxtail != 0.0) || (cdytail != 0.0)) { + Square(adx, adxadx1, adxadx0); + Square(ady, adyady1, adyady0); + Two_Two_Sum(adxadx1, adxadx0, adyady1, adyady0, aa3, aa[2], aa[1], aa[0]); + aa[3] = aa3; + } + if ((cdxtail != 0.0) || (cdytail != 0.0) + || (adxtail != 0.0) || (adytail != 0.0)) { + Square(bdx, bdxbdx1, bdxbdx0); + Square(bdy, bdybdy1, bdybdy0); + Two_Two_Sum(bdxbdx1, bdxbdx0, bdybdy1, bdybdy0, bb3, bb[2], bb[1], bb[0]); + bb[3] = bb3; + } + if ((adxtail != 0.0) || (adytail != 0.0) + || (bdxtail != 0.0) || (bdytail != 0.0)) { + Square(cdx, cdxcdx1, cdxcdx0); + Square(cdy, cdycdy1, cdycdy0); + Two_Two_Sum(cdxcdx1, cdxcdx0, cdycdy1, cdycdy0, cc3, cc[2], cc[1], cc[0]); + cc[3] = cc3; + } + + if (adxtail != 0.0) { + axtbclen = scale_expansion_zeroelim(4, bc, adxtail, axtbc); + temp16alen = scale_expansion_zeroelim(axtbclen, axtbc, 2.0 * adx, + temp16a); + + axtcclen = scale_expansion_zeroelim(4, cc, adxtail, axtcc); + temp16blen = scale_expansion_zeroelim(axtcclen, axtcc, bdy, temp16b); + + axtbblen = scale_expansion_zeroelim(4, bb, adxtail, axtbb); + temp16clen = scale_expansion_zeroelim(axtbblen, axtbb, -cdy, temp16c); + + temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (adytail != 0.0) { + aytbclen = scale_expansion_zeroelim(4, bc, adytail, aytbc); + temp16alen = scale_expansion_zeroelim(aytbclen, aytbc, 2.0 * ady, + temp16a); + + aytbblen = scale_expansion_zeroelim(4, bb, adytail, aytbb); + temp16blen = scale_expansion_zeroelim(aytbblen, aytbb, cdx, temp16b); + + aytcclen = scale_expansion_zeroelim(4, cc, adytail, aytcc); + temp16clen = scale_expansion_zeroelim(aytcclen, aytcc, -bdx, temp16c); + + temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (bdxtail != 0.0) { + bxtcalen = scale_expansion_zeroelim(4, ca, bdxtail, bxtca); + temp16alen = scale_expansion_zeroelim(bxtcalen, bxtca, 2.0 * bdx, + temp16a); + + bxtaalen = scale_expansion_zeroelim(4, aa, bdxtail, bxtaa); + temp16blen = scale_expansion_zeroelim(bxtaalen, bxtaa, cdy, temp16b); + + bxtcclen = scale_expansion_zeroelim(4, cc, bdxtail, bxtcc); + temp16clen = scale_expansion_zeroelim(bxtcclen, bxtcc, -ady, temp16c); + + temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (bdytail != 0.0) { + bytcalen = scale_expansion_zeroelim(4, ca, bdytail, bytca); + temp16alen = scale_expansion_zeroelim(bytcalen, bytca, 2.0 * bdy, + temp16a); + + bytcclen = scale_expansion_zeroelim(4, cc, bdytail, bytcc); + temp16blen = scale_expansion_zeroelim(bytcclen, bytcc, adx, temp16b); + + bytaalen = scale_expansion_zeroelim(4, aa, bdytail, bytaa); + temp16clen = scale_expansion_zeroelim(bytaalen, bytaa, -cdx, temp16c); + + temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (cdxtail != 0.0) { + cxtablen = scale_expansion_zeroelim(4, ab, cdxtail, cxtab); + temp16alen = scale_expansion_zeroelim(cxtablen, cxtab, 2.0 * cdx, + temp16a); + + cxtbblen = scale_expansion_zeroelim(4, bb, cdxtail, cxtbb); + temp16blen = scale_expansion_zeroelim(cxtbblen, cxtbb, ady, temp16b); + + cxtaalen = scale_expansion_zeroelim(4, aa, cdxtail, cxtaa); + temp16clen = scale_expansion_zeroelim(cxtaalen, cxtaa, -bdy, temp16c); + + temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (cdytail != 0.0) { + cytablen = scale_expansion_zeroelim(4, ab, cdytail, cytab); + temp16alen = scale_expansion_zeroelim(cytablen, cytab, 2.0 * cdy, + temp16a); + + cytaalen = scale_expansion_zeroelim(4, aa, cdytail, cytaa); + temp16blen = scale_expansion_zeroelim(cytaalen, cytaa, bdx, temp16b); + + cytbblen = scale_expansion_zeroelim(4, bb, cdytail, cytbb); + temp16clen = scale_expansion_zeroelim(cytbblen, cytbb, -adx, temp16c); + + temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + + if ((adxtail != 0.0) || (adytail != 0.0)) { + if ((bdxtail != 0.0) || (bdytail != 0.0) + || (cdxtail != 0.0) || (cdytail != 0.0)) { + Two_Product(bdxtail, cdy, ti1, ti0); + Two_Product(bdx, cdytail, tj1, tj0); + Two_Two_Sum(ti1, ti0, tj1, tj0, u3, u[2], u[1], u[0]); + u[3] = u3; + negate = -bdy; + Two_Product(cdxtail, negate, ti1, ti0); + negate = -bdytail; + Two_Product(cdx, negate, tj1, tj0); + Two_Two_Sum(ti1, ti0, tj1, tj0, v3, v[2], v[1], v[0]); + v[3] = v3; + bctlen = fast_expansion_sum_zeroelim(4, u, 4, v, bct); + + Two_Product(bdxtail, cdytail, ti1, ti0); + Two_Product(cdxtail, bdytail, tj1, tj0); + Two_Two_Diff(ti1, ti0, tj1, tj0, bctt3, bctt[2], bctt[1], bctt[0]); + bctt[3] = bctt3; + bcttlen = 4; + } else { + bct[0] = 0.0; + bctlen = 1; + bctt[0] = 0.0; + bcttlen = 1; + } + + if (adxtail != 0.0) { + temp16alen = scale_expansion_zeroelim(axtbclen, axtbc, adxtail, temp16a); + axtbctlen = scale_expansion_zeroelim(bctlen, bct, adxtail, axtbct); + temp32alen = scale_expansion_zeroelim(axtbctlen, axtbct, 2.0 * adx, + temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + if (bdytail != 0.0) { + temp8len = scale_expansion_zeroelim(4, cc, adxtail, temp8); + temp16alen = scale_expansion_zeroelim(temp8len, temp8, bdytail, + temp16a); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, + temp16a, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (cdytail != 0.0) { + temp8len = scale_expansion_zeroelim(4, bb, -adxtail, temp8); + temp16alen = scale_expansion_zeroelim(temp8len, temp8, cdytail, + temp16a); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, + temp16a, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + + temp32alen = scale_expansion_zeroelim(axtbctlen, axtbct, adxtail, + temp32a); + axtbcttlen = scale_expansion_zeroelim(bcttlen, bctt, adxtail, axtbctt); + temp16alen = scale_expansion_zeroelim(axtbcttlen, axtbctt, 2.0 * adx, + temp16a); + temp16blen = scale_expansion_zeroelim(axtbcttlen, axtbctt, adxtail, + temp16b); + temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32b); + temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, + temp64, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (adytail != 0.0) { + temp16alen = scale_expansion_zeroelim(aytbclen, aytbc, adytail, temp16a); + aytbctlen = scale_expansion_zeroelim(bctlen, bct, adytail, aytbct); + temp32alen = scale_expansion_zeroelim(aytbctlen, aytbct, 2.0 * ady, + temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + + + temp32alen = scale_expansion_zeroelim(aytbctlen, aytbct, adytail, + temp32a); + aytbcttlen = scale_expansion_zeroelim(bcttlen, bctt, adytail, aytbctt); + temp16alen = scale_expansion_zeroelim(aytbcttlen, aytbctt, 2.0 * ady, + temp16a); + temp16blen = scale_expansion_zeroelim(aytbcttlen, aytbctt, adytail, + temp16b); + temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32b); + temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, + temp64, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + } + if ((bdxtail != 0.0) || (bdytail != 0.0)) { + if ((cdxtail != 0.0) || (cdytail != 0.0) + || (adxtail != 0.0) || (adytail != 0.0)) { + Two_Product(cdxtail, ady, ti1, ti0); + Two_Product(cdx, adytail, tj1, tj0); + Two_Two_Sum(ti1, ti0, tj1, tj0, u3, u[2], u[1], u[0]); + u[3] = u3; + negate = -cdy; + Two_Product(adxtail, negate, ti1, ti0); + negate = -cdytail; + Two_Product(adx, negate, tj1, tj0); + Two_Two_Sum(ti1, ti0, tj1, tj0, v3, v[2], v[1], v[0]); + v[3] = v3; + catlen = fast_expansion_sum_zeroelim(4, u, 4, v, cat); + + Two_Product(cdxtail, adytail, ti1, ti0); + Two_Product(adxtail, cdytail, tj1, tj0); + Two_Two_Diff(ti1, ti0, tj1, tj0, catt3, catt[2], catt[1], catt[0]); + catt[3] = catt3; + cattlen = 4; + } else { + cat[0] = 0.0; + catlen = 1; + catt[0] = 0.0; + cattlen = 1; + } + + if (bdxtail != 0.0) { + temp16alen = scale_expansion_zeroelim(bxtcalen, bxtca, bdxtail, temp16a); + bxtcatlen = scale_expansion_zeroelim(catlen, cat, bdxtail, bxtcat); + temp32alen = scale_expansion_zeroelim(bxtcatlen, bxtcat, 2.0 * bdx, + temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + if (cdytail != 0.0) { + temp8len = scale_expansion_zeroelim(4, aa, bdxtail, temp8); + temp16alen = scale_expansion_zeroelim(temp8len, temp8, cdytail, + temp16a); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, + temp16a, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (adytail != 0.0) { + temp8len = scale_expansion_zeroelim(4, cc, -bdxtail, temp8); + temp16alen = scale_expansion_zeroelim(temp8len, temp8, adytail, + temp16a); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, + temp16a, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + + temp32alen = scale_expansion_zeroelim(bxtcatlen, bxtcat, bdxtail, + temp32a); + bxtcattlen = scale_expansion_zeroelim(cattlen, catt, bdxtail, bxtcatt); + temp16alen = scale_expansion_zeroelim(bxtcattlen, bxtcatt, 2.0 * bdx, + temp16a); + temp16blen = scale_expansion_zeroelim(bxtcattlen, bxtcatt, bdxtail, + temp16b); + temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32b); + temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, + temp64, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (bdytail != 0.0) { + temp16alen = scale_expansion_zeroelim(bytcalen, bytca, bdytail, temp16a); + bytcatlen = scale_expansion_zeroelim(catlen, cat, bdytail, bytcat); + temp32alen = scale_expansion_zeroelim(bytcatlen, bytcat, 2.0 * bdy, + temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + + + temp32alen = scale_expansion_zeroelim(bytcatlen, bytcat, bdytail, + temp32a); + bytcattlen = scale_expansion_zeroelim(cattlen, catt, bdytail, bytcatt); + temp16alen = scale_expansion_zeroelim(bytcattlen, bytcatt, 2.0 * bdy, + temp16a); + temp16blen = scale_expansion_zeroelim(bytcattlen, bytcatt, bdytail, + temp16b); + temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32b); + temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, + temp64, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + } + if ((cdxtail != 0.0) || (cdytail != 0.0)) { + if ((adxtail != 0.0) || (adytail != 0.0) + || (bdxtail != 0.0) || (bdytail != 0.0)) { + Two_Product(adxtail, bdy, ti1, ti0); + Two_Product(adx, bdytail, tj1, tj0); + Two_Two_Sum(ti1, ti0, tj1, tj0, u3, u[2], u[1], u[0]); + u[3] = u3; + negate = -ady; + Two_Product(bdxtail, negate, ti1, ti0); + negate = -adytail; + Two_Product(bdx, negate, tj1, tj0); + Two_Two_Sum(ti1, ti0, tj1, tj0, v3, v[2], v[1], v[0]); + v[3] = v3; + abtlen = fast_expansion_sum_zeroelim(4, u, 4, v, abt); + + Two_Product(adxtail, bdytail, ti1, ti0); + Two_Product(bdxtail, adytail, tj1, tj0); + Two_Two_Diff(ti1, ti0, tj1, tj0, abtt3, abtt[2], abtt[1], abtt[0]); + abtt[3] = abtt3; + abttlen = 4; + } else { + abt[0] = 0.0; + abtlen = 1; + abtt[0] = 0.0; + abttlen = 1; + } + + if (cdxtail != 0.0) { + temp16alen = scale_expansion_zeroelim(cxtablen, cxtab, cdxtail, temp16a); + cxtabtlen = scale_expansion_zeroelim(abtlen, abt, cdxtail, cxtabt); + temp32alen = scale_expansion_zeroelim(cxtabtlen, cxtabt, 2.0 * cdx, + temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + if (adytail != 0.0) { + temp8len = scale_expansion_zeroelim(4, bb, cdxtail, temp8); + temp16alen = scale_expansion_zeroelim(temp8len, temp8, adytail, + temp16a); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, + temp16a, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (bdytail != 0.0) { + temp8len = scale_expansion_zeroelim(4, aa, -cdxtail, temp8); + temp16alen = scale_expansion_zeroelim(temp8len, temp8, bdytail, + temp16a); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, + temp16a, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + + temp32alen = scale_expansion_zeroelim(cxtabtlen, cxtabt, cdxtail, + temp32a); + cxtabttlen = scale_expansion_zeroelim(abttlen, abtt, cdxtail, cxtabtt); + temp16alen = scale_expansion_zeroelim(cxtabttlen, cxtabtt, 2.0 * cdx, + temp16a); + temp16blen = scale_expansion_zeroelim(cxtabttlen, cxtabtt, cdxtail, + temp16b); + temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32b); + temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, + temp64, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (cdytail != 0.0) { + temp16alen = scale_expansion_zeroelim(cytablen, cytab, cdytail, temp16a); + cytabtlen = scale_expansion_zeroelim(abtlen, abt, cdytail, cytabt); + temp32alen = scale_expansion_zeroelim(cytabtlen, cytabt, 2.0 * cdy, + temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + + + temp32alen = scale_expansion_zeroelim(cytabtlen, cytabt, cdytail, + temp32a); + cytabttlen = scale_expansion_zeroelim(abttlen, abtt, cdytail, cytabtt); + temp16alen = scale_expansion_zeroelim(cytabttlen, cytabtt, 2.0 * cdy, + temp16a); + temp16blen = scale_expansion_zeroelim(cytabttlen, cytabtt, cdytail, + temp16b); + temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32b); + temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, + temp64, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + } + + return finnow[finlength - 1]; +} + +REAL incircle(REAL *pa, REAL *pb, REAL *pc, REAL *pd) +{ + REAL adx, bdx, cdx, ady, bdy, cdy; + REAL bdxcdy, cdxbdy, cdxady, adxcdy, adxbdy, bdxady; + REAL alift, blift, clift; + REAL det; + REAL permanent, errbound; + + adx = pa[0] - pd[0]; + bdx = pb[0] - pd[0]; + cdx = pc[0] - pd[0]; + ady = pa[1] - pd[1]; + bdy = pb[1] - pd[1]; + cdy = pc[1] - pd[1]; + + bdxcdy = bdx * cdy; + cdxbdy = cdx * bdy; + alift = adx * adx + ady * ady; + + cdxady = cdx * ady; + adxcdy = adx * cdy; + blift = bdx * bdx + bdy * bdy; + + adxbdy = adx * bdy; + bdxady = bdx * ady; + clift = cdx * cdx + cdy * cdy; + + det = alift * (bdxcdy - cdxbdy) + + blift * (cdxady - adxcdy) + + clift * (adxbdy - bdxady); + + permanent = (Absolute(bdxcdy) + Absolute(cdxbdy)) * alift + + (Absolute(cdxady) + Absolute(adxcdy)) * blift + + (Absolute(adxbdy) + Absolute(bdxady)) * clift; + errbound = iccerrboundA * permanent; + if ((det > errbound) || (-det > errbound)) { + return det; + } + + return incircleadapt(pa, pb, pc, pd, permanent); +} + +/*****************************************************************************/ +/* */ +/* inspherefast() Approximate 3D insphere test. Nonrobust. */ +/* insphereexact() Exact 3D insphere test. Robust. */ +/* insphereslow() Another exact 3D insphere test. Robust. */ +/* insphere() Adaptive exact 3D insphere test. Robust. */ +/* */ +/* Return a positive value if the point pe lies inside the */ +/* sphere passing through pa, pb, pc, and pd; a negative value */ +/* if it lies outside; and zero if the five points are */ +/* cospherical. The points pa, pb, pc, and pd must be ordered */ +/* so that they have a positive orientation (as defined by */ +/* orient3d()), or the sign of the result will be reversed. */ +/* */ +/* Only the first and last routine should be used; the middle two are for */ +/* timings. */ +/* */ +/* The last three use exact arithmetic to ensure a correct answer. The */ +/* result returned is the determinant of a matrix. In insphere() only, */ +/* this determinant is computed adaptively, in the sense that exact */ +/* arithmetic is used only to the degree it is needed to ensure that the */ +/* returned value has the correct sign. Hence, insphere() is usually quite */ +/* fast, but will run more slowly when the input points are cospherical or */ +/* nearly so. */ +/* */ +/*****************************************************************************/ + +REAL inspherefast(REAL *pa, REAL *pb, REAL *pc, REAL *pd, REAL *pe) +{ + REAL aex, bex, cex, dex; + REAL aey, bey, cey, dey; + REAL aez, bez, cez, dez; + REAL alift, blift, clift, dlift; + REAL ab, bc, cd, da, ac, bd; + REAL abc, bcd, cda, dab; + + aex = pa[0] - pe[0]; + bex = pb[0] - pe[0]; + cex = pc[0] - pe[0]; + dex = pd[0] - pe[0]; + aey = pa[1] - pe[1]; + bey = pb[1] - pe[1]; + cey = pc[1] - pe[1]; + dey = pd[1] - pe[1]; + aez = pa[2] - pe[2]; + bez = pb[2] - pe[2]; + cez = pc[2] - pe[2]; + dez = pd[2] - pe[2]; + + ab = aex * bey - bex * aey; + bc = bex * cey - cex * bey; + cd = cex * dey - dex * cey; + da = dex * aey - aex * dey; + + ac = aex * cey - cex * aey; + bd = bex * dey - dex * bey; + + abc = aez * bc - bez * ac + cez * ab; + bcd = bez * cd - cez * bd + dez * bc; + cda = cez * da + dez * ac + aez * cd; + dab = dez * ab + aez * bd + bez * da; + + alift = aex * aex + aey * aey + aez * aez; + blift = bex * bex + bey * bey + bez * bez; + clift = cex * cex + cey * cey + cez * cez; + dlift = dex * dex + dey * dey + dez * dez; + + return (dlift * abc - clift * dab) + (blift * cda - alift * bcd); +} + +REAL insphereexact(REAL *pa, REAL *pb, REAL *pc, REAL *pd, REAL *pe) +{ + INEXACT REAL axby1, bxcy1, cxdy1, dxey1, exay1; + INEXACT REAL bxay1, cxby1, dxcy1, exdy1, axey1; + INEXACT REAL axcy1, bxdy1, cxey1, dxay1, exby1; + INEXACT REAL cxay1, dxby1, excy1, axdy1, bxey1; + REAL axby0, bxcy0, cxdy0, dxey0, exay0; + REAL bxay0, cxby0, dxcy0, exdy0, axey0; + REAL axcy0, bxdy0, cxey0, dxay0, exby0; + REAL cxay0, dxby0, excy0, axdy0, bxey0; + REAL ab[4], bc[4], cd[4], de[4], ea[4]; + REAL ac[4], bd[4], ce[4], da[4], eb[4]; + REAL temp8a[8], temp8b[8], temp16[16]; + int temp8alen, temp8blen, temp16len; + REAL abc[24], bcd[24], cde[24], dea[24], eab[24]; + REAL abd[24], bce[24], cda[24], deb[24], eac[24]; + int abclen, bcdlen, cdelen, dealen, eablen; + int abdlen, bcelen, cdalen, deblen, eaclen; + REAL temp48a[48], temp48b[48]; + int temp48alen, temp48blen; + REAL abcd[96], bcde[96], cdea[96], deab[96], eabc[96]; + int abcdlen, bcdelen, cdealen, deablen, eabclen; + REAL temp192[192]; + REAL det384x[384], det384y[384], det384z[384]; + int xlen, ylen, zlen; + REAL detxy[768]; + int xylen; + REAL adet[1152], bdet[1152], cdet[1152], ddet[1152], edet[1152]; + int alen, blen, clen, dlen, elen; + REAL abdet[2304], cddet[2304], cdedet[3456]; + int ablen, cdlen; + REAL deter[5760]; + int deterlen; + int i; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j; + REAL _0; + + + Two_Product(pa[0], pb[1], axby1, axby0); + Two_Product(pb[0], pa[1], bxay1, bxay0); + Two_Two_Diff(axby1, axby0, bxay1, bxay0, ab[3], ab[2], ab[1], ab[0]); + + Two_Product(pb[0], pc[1], bxcy1, bxcy0); + Two_Product(pc[0], pb[1], cxby1, cxby0); + Two_Two_Diff(bxcy1, bxcy0, cxby1, cxby0, bc[3], bc[2], bc[1], bc[0]); + + Two_Product(pc[0], pd[1], cxdy1, cxdy0); + Two_Product(pd[0], pc[1], dxcy1, dxcy0); + Two_Two_Diff(cxdy1, cxdy0, dxcy1, dxcy0, cd[3], cd[2], cd[1], cd[0]); + + Two_Product(pd[0], pe[1], dxey1, dxey0); + Two_Product(pe[0], pd[1], exdy1, exdy0); + Two_Two_Diff(dxey1, dxey0, exdy1, exdy0, de[3], de[2], de[1], de[0]); + + Two_Product(pe[0], pa[1], exay1, exay0); + Two_Product(pa[0], pe[1], axey1, axey0); + Two_Two_Diff(exay1, exay0, axey1, axey0, ea[3], ea[2], ea[1], ea[0]); + + Two_Product(pa[0], pc[1], axcy1, axcy0); + Two_Product(pc[0], pa[1], cxay1, cxay0); + Two_Two_Diff(axcy1, axcy0, cxay1, cxay0, ac[3], ac[2], ac[1], ac[0]); + + Two_Product(pb[0], pd[1], bxdy1, bxdy0); + Two_Product(pd[0], pb[1], dxby1, dxby0); + Two_Two_Diff(bxdy1, bxdy0, dxby1, dxby0, bd[3], bd[2], bd[1], bd[0]); + + Two_Product(pc[0], pe[1], cxey1, cxey0); + Two_Product(pe[0], pc[1], excy1, excy0); + Two_Two_Diff(cxey1, cxey0, excy1, excy0, ce[3], ce[2], ce[1], ce[0]); + + Two_Product(pd[0], pa[1], dxay1, dxay0); + Two_Product(pa[0], pd[1], axdy1, axdy0); + Two_Two_Diff(dxay1, dxay0, axdy1, axdy0, da[3], da[2], da[1], da[0]); + + Two_Product(pe[0], pb[1], exby1, exby0); + Two_Product(pb[0], pe[1], bxey1, bxey0); + Two_Two_Diff(exby1, exby0, bxey1, bxey0, eb[3], eb[2], eb[1], eb[0]); + + temp8alen = scale_expansion_zeroelim(4, bc, pa[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, ac, -pb[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, ab, pc[2], temp8a); + abclen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + abc); + + temp8alen = scale_expansion_zeroelim(4, cd, pb[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, bd, -pc[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, bc, pd[2], temp8a); + bcdlen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + bcd); + + temp8alen = scale_expansion_zeroelim(4, de, pc[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, ce, -pd[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, cd, pe[2], temp8a); + cdelen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + cde); + + temp8alen = scale_expansion_zeroelim(4, ea, pd[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, da, -pe[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, de, pa[2], temp8a); + dealen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + dea); + + temp8alen = scale_expansion_zeroelim(4, ab, pe[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, eb, -pa[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, ea, pb[2], temp8a); + eablen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + eab); + + temp8alen = scale_expansion_zeroelim(4, bd, pa[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, da, pb[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, ab, pd[2], temp8a); + abdlen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + abd); + + temp8alen = scale_expansion_zeroelim(4, ce, pb[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, eb, pc[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, bc, pe[2], temp8a); + bcelen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + bce); + + temp8alen = scale_expansion_zeroelim(4, da, pc[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, ac, pd[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, cd, pa[2], temp8a); + cdalen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + cda); + + temp8alen = scale_expansion_zeroelim(4, eb, pd[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, bd, pe[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, de, pb[2], temp8a); + deblen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + deb); + + temp8alen = scale_expansion_zeroelim(4, ac, pe[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, ce, pa[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, ea, pc[2], temp8a); + eaclen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + eac); + + temp48alen = fast_expansion_sum_zeroelim(cdelen, cde, bcelen, bce, temp48a); + temp48blen = fast_expansion_sum_zeroelim(deblen, deb, bcdlen, bcd, temp48b); + for (i = 0; i < temp48blen; i++) { + temp48b[i] = -temp48b[i]; + } + bcdelen = fast_expansion_sum_zeroelim(temp48alen, temp48a, + temp48blen, temp48b, bcde); + xlen = scale_expansion_zeroelim(bcdelen, bcde, pa[0], temp192); + xlen = scale_expansion_zeroelim(xlen, temp192, pa[0], det384x); + ylen = scale_expansion_zeroelim(bcdelen, bcde, pa[1], temp192); + ylen = scale_expansion_zeroelim(ylen, temp192, pa[1], det384y); + zlen = scale_expansion_zeroelim(bcdelen, bcde, pa[2], temp192); + zlen = scale_expansion_zeroelim(zlen, temp192, pa[2], det384z); + xylen = fast_expansion_sum_zeroelim(xlen, det384x, ylen, det384y, detxy); + alen = fast_expansion_sum_zeroelim(xylen, detxy, zlen, det384z, adet); + + temp48alen = fast_expansion_sum_zeroelim(dealen, dea, cdalen, cda, temp48a); + temp48blen = fast_expansion_sum_zeroelim(eaclen, eac, cdelen, cde, temp48b); + for (i = 0; i < temp48blen; i++) { + temp48b[i] = -temp48b[i]; + } + cdealen = fast_expansion_sum_zeroelim(temp48alen, temp48a, + temp48blen, temp48b, cdea); + xlen = scale_expansion_zeroelim(cdealen, cdea, pb[0], temp192); + xlen = scale_expansion_zeroelim(xlen, temp192, pb[0], det384x); + ylen = scale_expansion_zeroelim(cdealen, cdea, pb[1], temp192); + ylen = scale_expansion_zeroelim(ylen, temp192, pb[1], det384y); + zlen = scale_expansion_zeroelim(cdealen, cdea, pb[2], temp192); + zlen = scale_expansion_zeroelim(zlen, temp192, pb[2], det384z); + xylen = fast_expansion_sum_zeroelim(xlen, det384x, ylen, det384y, detxy); + blen = fast_expansion_sum_zeroelim(xylen, detxy, zlen, det384z, bdet); + + temp48alen = fast_expansion_sum_zeroelim(eablen, eab, deblen, deb, temp48a); + temp48blen = fast_expansion_sum_zeroelim(abdlen, abd, dealen, dea, temp48b); + for (i = 0; i < temp48blen; i++) { + temp48b[i] = -temp48b[i]; + } + deablen = fast_expansion_sum_zeroelim(temp48alen, temp48a, + temp48blen, temp48b, deab); + xlen = scale_expansion_zeroelim(deablen, deab, pc[0], temp192); + xlen = scale_expansion_zeroelim(xlen, temp192, pc[0], det384x); + ylen = scale_expansion_zeroelim(deablen, deab, pc[1], temp192); + ylen = scale_expansion_zeroelim(ylen, temp192, pc[1], det384y); + zlen = scale_expansion_zeroelim(deablen, deab, pc[2], temp192); + zlen = scale_expansion_zeroelim(zlen, temp192, pc[2], det384z); + xylen = fast_expansion_sum_zeroelim(xlen, det384x, ylen, det384y, detxy); + clen = fast_expansion_sum_zeroelim(xylen, detxy, zlen, det384z, cdet); + + temp48alen = fast_expansion_sum_zeroelim(abclen, abc, eaclen, eac, temp48a); + temp48blen = fast_expansion_sum_zeroelim(bcelen, bce, eablen, eab, temp48b); + for (i = 0; i < temp48blen; i++) { + temp48b[i] = -temp48b[i]; + } + eabclen = fast_expansion_sum_zeroelim(temp48alen, temp48a, + temp48blen, temp48b, eabc); + xlen = scale_expansion_zeroelim(eabclen, eabc, pd[0], temp192); + xlen = scale_expansion_zeroelim(xlen, temp192, pd[0], det384x); + ylen = scale_expansion_zeroelim(eabclen, eabc, pd[1], temp192); + ylen = scale_expansion_zeroelim(ylen, temp192, pd[1], det384y); + zlen = scale_expansion_zeroelim(eabclen, eabc, pd[2], temp192); + zlen = scale_expansion_zeroelim(zlen, temp192, pd[2], det384z); + xylen = fast_expansion_sum_zeroelim(xlen, det384x, ylen, det384y, detxy); + dlen = fast_expansion_sum_zeroelim(xylen, detxy, zlen, det384z, ddet); + + temp48alen = fast_expansion_sum_zeroelim(bcdlen, bcd, abdlen, abd, temp48a); + temp48blen = fast_expansion_sum_zeroelim(cdalen, cda, abclen, abc, temp48b); + for (i = 0; i < temp48blen; i++) { + temp48b[i] = -temp48b[i]; + } + abcdlen = fast_expansion_sum_zeroelim(temp48alen, temp48a, + temp48blen, temp48b, abcd); + xlen = scale_expansion_zeroelim(abcdlen, abcd, pe[0], temp192); + xlen = scale_expansion_zeroelim(xlen, temp192, pe[0], det384x); + ylen = scale_expansion_zeroelim(abcdlen, abcd, pe[1], temp192); + ylen = scale_expansion_zeroelim(ylen, temp192, pe[1], det384y); + zlen = scale_expansion_zeroelim(abcdlen, abcd, pe[2], temp192); + zlen = scale_expansion_zeroelim(zlen, temp192, pe[2], det384z); + xylen = fast_expansion_sum_zeroelim(xlen, det384x, ylen, det384y, detxy); + elen = fast_expansion_sum_zeroelim(xylen, detxy, zlen, det384z, edet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + cdlen = fast_expansion_sum_zeroelim(clen, cdet, dlen, ddet, cddet); + cdelen = fast_expansion_sum_zeroelim(cdlen, cddet, elen, edet, cdedet); + deterlen = fast_expansion_sum_zeroelim(ablen, abdet, cdelen, cdedet, deter); + + return deter[deterlen - 1]; +} + +REAL insphereslow(REAL *pa, REAL *pb, REAL *pc, REAL *pd, REAL *pe) +{ + INEXACT REAL aex, bex, cex, dex, aey, bey, cey, dey, aez, bez, cez, dez; + REAL aextail, bextail, cextail, dextail; + REAL aeytail, beytail, ceytail, deytail; + REAL aeztail, beztail, ceztail, deztail; + REAL negate, negatetail; + INEXACT REAL axby7, bxcy7, cxdy7, dxay7, axcy7, bxdy7; + INEXACT REAL bxay7, cxby7, dxcy7, axdy7, cxay7, dxby7; + REAL axby[8], bxcy[8], cxdy[8], dxay[8], axcy[8], bxdy[8]; + REAL bxay[8], cxby[8], dxcy[8], axdy[8], cxay[8], dxby[8]; + REAL ab[16], bc[16], cd[16], da[16], ac[16], bd[16]; + int ablen, bclen, cdlen, dalen, aclen, bdlen; + REAL temp32a[32], temp32b[32], temp64a[64], temp64b[64], temp64c[64]; + int temp32alen, temp32blen, temp64alen, temp64blen, temp64clen; + REAL temp128[128], temp192[192]; + int temp128len, temp192len; + REAL detx[384], detxx[768], detxt[384], detxxt[768], detxtxt[768]; + int xlen, xxlen, xtlen, xxtlen, xtxtlen; + REAL x1[1536], x2[2304]; + int x1len, x2len; + REAL dety[384], detyy[768], detyt[384], detyyt[768], detytyt[768]; + int ylen, yylen, ytlen, yytlen, ytytlen; + REAL y1[1536], y2[2304]; + int y1len, y2len; + REAL detz[384], detzz[768], detzt[384], detzzt[768], detztzt[768]; + int zlen, zzlen, ztlen, zztlen, ztztlen; + REAL z1[1536], z2[2304]; + int z1len, z2len; + REAL detxy[4608]; + int xylen; + REAL adet[6912], bdet[6912], cdet[6912], ddet[6912]; + int alen, blen, clen, dlen; + REAL abdet[13824], cddet[13824], deter[27648]; + int deterlen; + int i; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL a0hi, a0lo, a1hi, a1lo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j, _k, _l, _m, _n; + REAL _0, _1, _2; + + Two_Diff(pa[0], pe[0], aex, aextail); + Two_Diff(pa[1], pe[1], aey, aeytail); + Two_Diff(pa[2], pe[2], aez, aeztail); + Two_Diff(pb[0], pe[0], bex, bextail); + Two_Diff(pb[1], pe[1], bey, beytail); + Two_Diff(pb[2], pe[2], bez, beztail); + Two_Diff(pc[0], pe[0], cex, cextail); + Two_Diff(pc[1], pe[1], cey, ceytail); + Two_Diff(pc[2], pe[2], cez, ceztail); + Two_Diff(pd[0], pe[0], dex, dextail); + Two_Diff(pd[1], pe[1], dey, deytail); + Two_Diff(pd[2], pe[2], dez, deztail); + + Two_Two_Product(aex, aextail, bey, beytail, + axby7, axby[6], axby[5], axby[4], + axby[3], axby[2], axby[1], axby[0]); + axby[7] = axby7; + negate = -aey; + negatetail = -aeytail; + Two_Two_Product(bex, bextail, negate, negatetail, + bxay7, bxay[6], bxay[5], bxay[4], + bxay[3], bxay[2], bxay[1], bxay[0]); + bxay[7] = bxay7; + ablen = fast_expansion_sum_zeroelim(8, axby, 8, bxay, ab); + Two_Two_Product(bex, bextail, cey, ceytail, + bxcy7, bxcy[6], bxcy[5], bxcy[4], + bxcy[3], bxcy[2], bxcy[1], bxcy[0]); + bxcy[7] = bxcy7; + negate = -bey; + negatetail = -beytail; + Two_Two_Product(cex, cextail, negate, negatetail, + cxby7, cxby[6], cxby[5], cxby[4], + cxby[3], cxby[2], cxby[1], cxby[0]); + cxby[7] = cxby7; + bclen = fast_expansion_sum_zeroelim(8, bxcy, 8, cxby, bc); + Two_Two_Product(cex, cextail, dey, deytail, + cxdy7, cxdy[6], cxdy[5], cxdy[4], + cxdy[3], cxdy[2], cxdy[1], cxdy[0]); + cxdy[7] = cxdy7; + negate = -cey; + negatetail = -ceytail; + Two_Two_Product(dex, dextail, negate, negatetail, + dxcy7, dxcy[6], dxcy[5], dxcy[4], + dxcy[3], dxcy[2], dxcy[1], dxcy[0]); + dxcy[7] = dxcy7; + cdlen = fast_expansion_sum_zeroelim(8, cxdy, 8, dxcy, cd); + Two_Two_Product(dex, dextail, aey, aeytail, + dxay7, dxay[6], dxay[5], dxay[4], + dxay[3], dxay[2], dxay[1], dxay[0]); + dxay[7] = dxay7; + negate = -dey; + negatetail = -deytail; + Two_Two_Product(aex, aextail, negate, negatetail, + axdy7, axdy[6], axdy[5], axdy[4], + axdy[3], axdy[2], axdy[1], axdy[0]); + axdy[7] = axdy7; + dalen = fast_expansion_sum_zeroelim(8, dxay, 8, axdy, da); + Two_Two_Product(aex, aextail, cey, ceytail, + axcy7, axcy[6], axcy[5], axcy[4], + axcy[3], axcy[2], axcy[1], axcy[0]); + axcy[7] = axcy7; + negate = -aey; + negatetail = -aeytail; + Two_Two_Product(cex, cextail, negate, negatetail, + cxay7, cxay[6], cxay[5], cxay[4], + cxay[3], cxay[2], cxay[1], cxay[0]); + cxay[7] = cxay7; + aclen = fast_expansion_sum_zeroelim(8, axcy, 8, cxay, ac); + Two_Two_Product(bex, bextail, dey, deytail, + bxdy7, bxdy[6], bxdy[5], bxdy[4], + bxdy[3], bxdy[2], bxdy[1], bxdy[0]); + bxdy[7] = bxdy7; + negate = -bey; + negatetail = -beytail; + Two_Two_Product(dex, dextail, negate, negatetail, + dxby7, dxby[6], dxby[5], dxby[4], + dxby[3], dxby[2], dxby[1], dxby[0]); + dxby[7] = dxby7; + bdlen = fast_expansion_sum_zeroelim(8, bxdy, 8, dxby, bd); + + temp32alen = scale_expansion_zeroelim(cdlen, cd, -bez, temp32a); + temp32blen = scale_expansion_zeroelim(cdlen, cd, -beztail, temp32b); + temp64alen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64a); + temp32alen = scale_expansion_zeroelim(bdlen, bd, cez, temp32a); + temp32blen = scale_expansion_zeroelim(bdlen, bd, ceztail, temp32b); + temp64blen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64b); + temp32alen = scale_expansion_zeroelim(bclen, bc, -dez, temp32a); + temp32blen = scale_expansion_zeroelim(bclen, bc, -deztail, temp32b); + temp64clen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64c); + temp128len = fast_expansion_sum_zeroelim(temp64alen, temp64a, + temp64blen, temp64b, temp128); + temp192len = fast_expansion_sum_zeroelim(temp64clen, temp64c, + temp128len, temp128, temp192); + xlen = scale_expansion_zeroelim(temp192len, temp192, aex, detx); + xxlen = scale_expansion_zeroelim(xlen, detx, aex, detxx); + xtlen = scale_expansion_zeroelim(temp192len, temp192, aextail, detxt); + xxtlen = scale_expansion_zeroelim(xtlen, detxt, aex, detxxt); + for (i = 0; i < xxtlen; i++) { + detxxt[i] *= 2.0; + } + xtxtlen = scale_expansion_zeroelim(xtlen, detxt, aextail, detxtxt); + x1len = fast_expansion_sum_zeroelim(xxlen, detxx, xxtlen, detxxt, x1); + x2len = fast_expansion_sum_zeroelim(x1len, x1, xtxtlen, detxtxt, x2); + ylen = scale_expansion_zeroelim(temp192len, temp192, aey, dety); + yylen = scale_expansion_zeroelim(ylen, dety, aey, detyy); + ytlen = scale_expansion_zeroelim(temp192len, temp192, aeytail, detyt); + yytlen = scale_expansion_zeroelim(ytlen, detyt, aey, detyyt); + for (i = 0; i < yytlen; i++) { + detyyt[i] *= 2.0; + } + ytytlen = scale_expansion_zeroelim(ytlen, detyt, aeytail, detytyt); + y1len = fast_expansion_sum_zeroelim(yylen, detyy, yytlen, detyyt, y1); + y2len = fast_expansion_sum_zeroelim(y1len, y1, ytytlen, detytyt, y2); + zlen = scale_expansion_zeroelim(temp192len, temp192, aez, detz); + zzlen = scale_expansion_zeroelim(zlen, detz, aez, detzz); + ztlen = scale_expansion_zeroelim(temp192len, temp192, aeztail, detzt); + zztlen = scale_expansion_zeroelim(ztlen, detzt, aez, detzzt); + for (i = 0; i < zztlen; i++) { + detzzt[i] *= 2.0; + } + ztztlen = scale_expansion_zeroelim(ztlen, detzt, aeztail, detztzt); + z1len = fast_expansion_sum_zeroelim(zzlen, detzz, zztlen, detzzt, z1); + z2len = fast_expansion_sum_zeroelim(z1len, z1, ztztlen, detztzt, z2); + xylen = fast_expansion_sum_zeroelim(x2len, x2, y2len, y2, detxy); + alen = fast_expansion_sum_zeroelim(z2len, z2, xylen, detxy, adet); + + temp32alen = scale_expansion_zeroelim(dalen, da, cez, temp32a); + temp32blen = scale_expansion_zeroelim(dalen, da, ceztail, temp32b); + temp64alen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64a); + temp32alen = scale_expansion_zeroelim(aclen, ac, dez, temp32a); + temp32blen = scale_expansion_zeroelim(aclen, ac, deztail, temp32b); + temp64blen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64b); + temp32alen = scale_expansion_zeroelim(cdlen, cd, aez, temp32a); + temp32blen = scale_expansion_zeroelim(cdlen, cd, aeztail, temp32b); + temp64clen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64c); + temp128len = fast_expansion_sum_zeroelim(temp64alen, temp64a, + temp64blen, temp64b, temp128); + temp192len = fast_expansion_sum_zeroelim(temp64clen, temp64c, + temp128len, temp128, temp192); + xlen = scale_expansion_zeroelim(temp192len, temp192, bex, detx); + xxlen = scale_expansion_zeroelim(xlen, detx, bex, detxx); + xtlen = scale_expansion_zeroelim(temp192len, temp192, bextail, detxt); + xxtlen = scale_expansion_zeroelim(xtlen, detxt, bex, detxxt); + for (i = 0; i < xxtlen; i++) { + detxxt[i] *= 2.0; + } + xtxtlen = scale_expansion_zeroelim(xtlen, detxt, bextail, detxtxt); + x1len = fast_expansion_sum_zeroelim(xxlen, detxx, xxtlen, detxxt, x1); + x2len = fast_expansion_sum_zeroelim(x1len, x1, xtxtlen, detxtxt, x2); + ylen = scale_expansion_zeroelim(temp192len, temp192, bey, dety); + yylen = scale_expansion_zeroelim(ylen, dety, bey, detyy); + ytlen = scale_expansion_zeroelim(temp192len, temp192, beytail, detyt); + yytlen = scale_expansion_zeroelim(ytlen, detyt, bey, detyyt); + for (i = 0; i < yytlen; i++) { + detyyt[i] *= 2.0; + } + ytytlen = scale_expansion_zeroelim(ytlen, detyt, beytail, detytyt); + y1len = fast_expansion_sum_zeroelim(yylen, detyy, yytlen, detyyt, y1); + y2len = fast_expansion_sum_zeroelim(y1len, y1, ytytlen, detytyt, y2); + zlen = scale_expansion_zeroelim(temp192len, temp192, bez, detz); + zzlen = scale_expansion_zeroelim(zlen, detz, bez, detzz); + ztlen = scale_expansion_zeroelim(temp192len, temp192, beztail, detzt); + zztlen = scale_expansion_zeroelim(ztlen, detzt, bez, detzzt); + for (i = 0; i < zztlen; i++) { + detzzt[i] *= 2.0; + } + ztztlen = scale_expansion_zeroelim(ztlen, detzt, beztail, detztzt); + z1len = fast_expansion_sum_zeroelim(zzlen, detzz, zztlen, detzzt, z1); + z2len = fast_expansion_sum_zeroelim(z1len, z1, ztztlen, detztzt, z2); + xylen = fast_expansion_sum_zeroelim(x2len, x2, y2len, y2, detxy); + blen = fast_expansion_sum_zeroelim(z2len, z2, xylen, detxy, bdet); + + temp32alen = scale_expansion_zeroelim(ablen, ab, -dez, temp32a); + temp32blen = scale_expansion_zeroelim(ablen, ab, -deztail, temp32b); + temp64alen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64a); + temp32alen = scale_expansion_zeroelim(bdlen, bd, -aez, temp32a); + temp32blen = scale_expansion_zeroelim(bdlen, bd, -aeztail, temp32b); + temp64blen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64b); + temp32alen = scale_expansion_zeroelim(dalen, da, -bez, temp32a); + temp32blen = scale_expansion_zeroelim(dalen, da, -beztail, temp32b); + temp64clen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64c); + temp128len = fast_expansion_sum_zeroelim(temp64alen, temp64a, + temp64blen, temp64b, temp128); + temp192len = fast_expansion_sum_zeroelim(temp64clen, temp64c, + temp128len, temp128, temp192); + xlen = scale_expansion_zeroelim(temp192len, temp192, cex, detx); + xxlen = scale_expansion_zeroelim(xlen, detx, cex, detxx); + xtlen = scale_expansion_zeroelim(temp192len, temp192, cextail, detxt); + xxtlen = scale_expansion_zeroelim(xtlen, detxt, cex, detxxt); + for (i = 0; i < xxtlen; i++) { + detxxt[i] *= 2.0; + } + xtxtlen = scale_expansion_zeroelim(xtlen, detxt, cextail, detxtxt); + x1len = fast_expansion_sum_zeroelim(xxlen, detxx, xxtlen, detxxt, x1); + x2len = fast_expansion_sum_zeroelim(x1len, x1, xtxtlen, detxtxt, x2); + ylen = scale_expansion_zeroelim(temp192len, temp192, cey, dety); + yylen = scale_expansion_zeroelim(ylen, dety, cey, detyy); + ytlen = scale_expansion_zeroelim(temp192len, temp192, ceytail, detyt); + yytlen = scale_expansion_zeroelim(ytlen, detyt, cey, detyyt); + for (i = 0; i < yytlen; i++) { + detyyt[i] *= 2.0; + } + ytytlen = scale_expansion_zeroelim(ytlen, detyt, ceytail, detytyt); + y1len = fast_expansion_sum_zeroelim(yylen, detyy, yytlen, detyyt, y1); + y2len = fast_expansion_sum_zeroelim(y1len, y1, ytytlen, detytyt, y2); + zlen = scale_expansion_zeroelim(temp192len, temp192, cez, detz); + zzlen = scale_expansion_zeroelim(zlen, detz, cez, detzz); + ztlen = scale_expansion_zeroelim(temp192len, temp192, ceztail, detzt); + zztlen = scale_expansion_zeroelim(ztlen, detzt, cez, detzzt); + for (i = 0; i < zztlen; i++) { + detzzt[i] *= 2.0; + } + ztztlen = scale_expansion_zeroelim(ztlen, detzt, ceztail, detztzt); + z1len = fast_expansion_sum_zeroelim(zzlen, detzz, zztlen, detzzt, z1); + z2len = fast_expansion_sum_zeroelim(z1len, z1, ztztlen, detztzt, z2); + xylen = fast_expansion_sum_zeroelim(x2len, x2, y2len, y2, detxy); + clen = fast_expansion_sum_zeroelim(z2len, z2, xylen, detxy, cdet); + + temp32alen = scale_expansion_zeroelim(bclen, bc, aez, temp32a); + temp32blen = scale_expansion_zeroelim(bclen, bc, aeztail, temp32b); + temp64alen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64a); + temp32alen = scale_expansion_zeroelim(aclen, ac, -bez, temp32a); + temp32blen = scale_expansion_zeroelim(aclen, ac, -beztail, temp32b); + temp64blen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64b); + temp32alen = scale_expansion_zeroelim(ablen, ab, cez, temp32a); + temp32blen = scale_expansion_zeroelim(ablen, ab, ceztail, temp32b); + temp64clen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64c); + temp128len = fast_expansion_sum_zeroelim(temp64alen, temp64a, + temp64blen, temp64b, temp128); + temp192len = fast_expansion_sum_zeroelim(temp64clen, temp64c, + temp128len, temp128, temp192); + xlen = scale_expansion_zeroelim(temp192len, temp192, dex, detx); + xxlen = scale_expansion_zeroelim(xlen, detx, dex, detxx); + xtlen = scale_expansion_zeroelim(temp192len, temp192, dextail, detxt); + xxtlen = scale_expansion_zeroelim(xtlen, detxt, dex, detxxt); + for (i = 0; i < xxtlen; i++) { + detxxt[i] *= 2.0; + } + xtxtlen = scale_expansion_zeroelim(xtlen, detxt, dextail, detxtxt); + x1len = fast_expansion_sum_zeroelim(xxlen, detxx, xxtlen, detxxt, x1); + x2len = fast_expansion_sum_zeroelim(x1len, x1, xtxtlen, detxtxt, x2); + ylen = scale_expansion_zeroelim(temp192len, temp192, dey, dety); + yylen = scale_expansion_zeroelim(ylen, dety, dey, detyy); + ytlen = scale_expansion_zeroelim(temp192len, temp192, deytail, detyt); + yytlen = scale_expansion_zeroelim(ytlen, detyt, dey, detyyt); + for (i = 0; i < yytlen; i++) { + detyyt[i] *= 2.0; + } + ytytlen = scale_expansion_zeroelim(ytlen, detyt, deytail, detytyt); + y1len = fast_expansion_sum_zeroelim(yylen, detyy, yytlen, detyyt, y1); + y2len = fast_expansion_sum_zeroelim(y1len, y1, ytytlen, detytyt, y2); + zlen = scale_expansion_zeroelim(temp192len, temp192, dez, detz); + zzlen = scale_expansion_zeroelim(zlen, detz, dez, detzz); + ztlen = scale_expansion_zeroelim(temp192len, temp192, deztail, detzt); + zztlen = scale_expansion_zeroelim(ztlen, detzt, dez, detzzt); + for (i = 0; i < zztlen; i++) { + detzzt[i] *= 2.0; + } + ztztlen = scale_expansion_zeroelim(ztlen, detzt, deztail, detztzt); + z1len = fast_expansion_sum_zeroelim(zzlen, detzz, zztlen, detzzt, z1); + z2len = fast_expansion_sum_zeroelim(z1len, z1, ztztlen, detztzt, z2); + xylen = fast_expansion_sum_zeroelim(x2len, x2, y2len, y2, detxy); + dlen = fast_expansion_sum_zeroelim(z2len, z2, xylen, detxy, ddet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + cdlen = fast_expansion_sum_zeroelim(clen, cdet, dlen, ddet, cddet); + deterlen = fast_expansion_sum_zeroelim(ablen, abdet, cdlen, cddet, deter); + + return deter[deterlen - 1]; +} + +REAL insphereadapt(REAL *pa, REAL *pb, REAL *pc, REAL *pd, REAL *pe, + REAL permanent) +{ + INEXACT REAL aex, bex, cex, dex, aey, bey, cey, dey, aez, bez, cez, dez; + REAL det, errbound; + + INEXACT REAL aexbey1, bexaey1, bexcey1, cexbey1; + INEXACT REAL cexdey1, dexcey1, dexaey1, aexdey1; + INEXACT REAL aexcey1, cexaey1, bexdey1, dexbey1; + REAL aexbey0, bexaey0, bexcey0, cexbey0; + REAL cexdey0, dexcey0, dexaey0, aexdey0; + REAL aexcey0, cexaey0, bexdey0, dexbey0; + REAL ab[4], bc[4], cd[4], da[4], ac[4], bd[4]; + INEXACT REAL ab3, bc3, cd3, da3, ac3, bd3; + REAL abeps, bceps, cdeps, daeps, aceps, bdeps; + REAL temp8a[8], temp8b[8], temp8c[8], temp16[16], temp24[24], temp48[48]; + int temp8alen, temp8blen, temp8clen, temp16len, temp24len, temp48len; + REAL xdet[96], ydet[96], zdet[96], xydet[192]; + int xlen, ylen, zlen, xylen; + REAL adet[288], bdet[288], cdet[288], ddet[288]; + int alen, blen, clen, dlen; + REAL abdet[576], cddet[576]; + int ablen, cdlen; + REAL fin1[1152]; + int finlength; + + REAL aextail, bextail, cextail, dextail; + REAL aeytail, beytail, ceytail, deytail; + REAL aeztail, beztail, ceztail, deztail; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j; + REAL _0; + + + aex = (REAL) (pa[0] - pe[0]); + bex = (REAL) (pb[0] - pe[0]); + cex = (REAL) (pc[0] - pe[0]); + dex = (REAL) (pd[0] - pe[0]); + aey = (REAL) (pa[1] - pe[1]); + bey = (REAL) (pb[1] - pe[1]); + cey = (REAL) (pc[1] - pe[1]); + dey = (REAL) (pd[1] - pe[1]); + aez = (REAL) (pa[2] - pe[2]); + bez = (REAL) (pb[2] - pe[2]); + cez = (REAL) (pc[2] - pe[2]); + dez = (REAL) (pd[2] - pe[2]); + + Two_Product(aex, bey, aexbey1, aexbey0); + Two_Product(bex, aey, bexaey1, bexaey0); + Two_Two_Diff(aexbey1, aexbey0, bexaey1, bexaey0, ab3, ab[2], ab[1], ab[0]); + ab[3] = ab3; + + Two_Product(bex, cey, bexcey1, bexcey0); + Two_Product(cex, bey, cexbey1, cexbey0); + Two_Two_Diff(bexcey1, bexcey0, cexbey1, cexbey0, bc3, bc[2], bc[1], bc[0]); + bc[3] = bc3; + + Two_Product(cex, dey, cexdey1, cexdey0); + Two_Product(dex, cey, dexcey1, dexcey0); + Two_Two_Diff(cexdey1, cexdey0, dexcey1, dexcey0, cd3, cd[2], cd[1], cd[0]); + cd[3] = cd3; + + Two_Product(dex, aey, dexaey1, dexaey0); + Two_Product(aex, dey, aexdey1, aexdey0); + Two_Two_Diff(dexaey1, dexaey0, aexdey1, aexdey0, da3, da[2], da[1], da[0]); + da[3] = da3; + + Two_Product(aex, cey, aexcey1, aexcey0); + Two_Product(cex, aey, cexaey1, cexaey0); + Two_Two_Diff(aexcey1, aexcey0, cexaey1, cexaey0, ac3, ac[2], ac[1], ac[0]); + ac[3] = ac3; + + Two_Product(bex, dey, bexdey1, bexdey0); + Two_Product(dex, bey, dexbey1, dexbey0); + Two_Two_Diff(bexdey1, bexdey0, dexbey1, dexbey0, bd3, bd[2], bd[1], bd[0]); + bd[3] = bd3; + + temp8alen = scale_expansion_zeroelim(4, cd, bez, temp8a); + temp8blen = scale_expansion_zeroelim(4, bd, -cez, temp8b); + temp8clen = scale_expansion_zeroelim(4, bc, dez, temp8c); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, + temp8blen, temp8b, temp16); + temp24len = fast_expansion_sum_zeroelim(temp8clen, temp8c, + temp16len, temp16, temp24); + temp48len = scale_expansion_zeroelim(temp24len, temp24, aex, temp48); + xlen = scale_expansion_zeroelim(temp48len, temp48, -aex, xdet); + temp48len = scale_expansion_zeroelim(temp24len, temp24, aey, temp48); + ylen = scale_expansion_zeroelim(temp48len, temp48, -aey, ydet); + temp48len = scale_expansion_zeroelim(temp24len, temp24, aez, temp48); + zlen = scale_expansion_zeroelim(temp48len, temp48, -aez, zdet); + xylen = fast_expansion_sum_zeroelim(xlen, xdet, ylen, ydet, xydet); + alen = fast_expansion_sum_zeroelim(xylen, xydet, zlen, zdet, adet); + + temp8alen = scale_expansion_zeroelim(4, da, cez, temp8a); + temp8blen = scale_expansion_zeroelim(4, ac, dez, temp8b); + temp8clen = scale_expansion_zeroelim(4, cd, aez, temp8c); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, + temp8blen, temp8b, temp16); + temp24len = fast_expansion_sum_zeroelim(temp8clen, temp8c, + temp16len, temp16, temp24); + temp48len = scale_expansion_zeroelim(temp24len, temp24, bex, temp48); + xlen = scale_expansion_zeroelim(temp48len, temp48, bex, xdet); + temp48len = scale_expansion_zeroelim(temp24len, temp24, bey, temp48); + ylen = scale_expansion_zeroelim(temp48len, temp48, bey, ydet); + temp48len = scale_expansion_zeroelim(temp24len, temp24, bez, temp48); + zlen = scale_expansion_zeroelim(temp48len, temp48, bez, zdet); + xylen = fast_expansion_sum_zeroelim(xlen, xdet, ylen, ydet, xydet); + blen = fast_expansion_sum_zeroelim(xylen, xydet, zlen, zdet, bdet); + + temp8alen = scale_expansion_zeroelim(4, ab, dez, temp8a); + temp8blen = scale_expansion_zeroelim(4, bd, aez, temp8b); + temp8clen = scale_expansion_zeroelim(4, da, bez, temp8c); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, + temp8blen, temp8b, temp16); + temp24len = fast_expansion_sum_zeroelim(temp8clen, temp8c, + temp16len, temp16, temp24); + temp48len = scale_expansion_zeroelim(temp24len, temp24, cex, temp48); + xlen = scale_expansion_zeroelim(temp48len, temp48, -cex, xdet); + temp48len = scale_expansion_zeroelim(temp24len, temp24, cey, temp48); + ylen = scale_expansion_zeroelim(temp48len, temp48, -cey, ydet); + temp48len = scale_expansion_zeroelim(temp24len, temp24, cez, temp48); + zlen = scale_expansion_zeroelim(temp48len, temp48, -cez, zdet); + xylen = fast_expansion_sum_zeroelim(xlen, xdet, ylen, ydet, xydet); + clen = fast_expansion_sum_zeroelim(xylen, xydet, zlen, zdet, cdet); + + temp8alen = scale_expansion_zeroelim(4, bc, aez, temp8a); + temp8blen = scale_expansion_zeroelim(4, ac, -bez, temp8b); + temp8clen = scale_expansion_zeroelim(4, ab, cez, temp8c); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, + temp8blen, temp8b, temp16); + temp24len = fast_expansion_sum_zeroelim(temp8clen, temp8c, + temp16len, temp16, temp24); + temp48len = scale_expansion_zeroelim(temp24len, temp24, dex, temp48); + xlen = scale_expansion_zeroelim(temp48len, temp48, dex, xdet); + temp48len = scale_expansion_zeroelim(temp24len, temp24, dey, temp48); + ylen = scale_expansion_zeroelim(temp48len, temp48, dey, ydet); + temp48len = scale_expansion_zeroelim(temp24len, temp24, dez, temp48); + zlen = scale_expansion_zeroelim(temp48len, temp48, dez, zdet); + xylen = fast_expansion_sum_zeroelim(xlen, xdet, ylen, ydet, xydet); + dlen = fast_expansion_sum_zeroelim(xylen, xydet, zlen, zdet, ddet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + cdlen = fast_expansion_sum_zeroelim(clen, cdet, dlen, ddet, cddet); + finlength = fast_expansion_sum_zeroelim(ablen, abdet, cdlen, cddet, fin1); + + det = estimate(finlength, fin1); + errbound = isperrboundB * permanent; + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + Two_Diff_Tail(pa[0], pe[0], aex, aextail); + Two_Diff_Tail(pa[1], pe[1], aey, aeytail); + Two_Diff_Tail(pa[2], pe[2], aez, aeztail); + Two_Diff_Tail(pb[0], pe[0], bex, bextail); + Two_Diff_Tail(pb[1], pe[1], bey, beytail); + Two_Diff_Tail(pb[2], pe[2], bez, beztail); + Two_Diff_Tail(pc[0], pe[0], cex, cextail); + Two_Diff_Tail(pc[1], pe[1], cey, ceytail); + Two_Diff_Tail(pc[2], pe[2], cez, ceztail); + Two_Diff_Tail(pd[0], pe[0], dex, dextail); + Two_Diff_Tail(pd[1], pe[1], dey, deytail); + Two_Diff_Tail(pd[2], pe[2], dez, deztail); + if ((aextail == 0.0) && (aeytail == 0.0) && (aeztail == 0.0) + && (bextail == 0.0) && (beytail == 0.0) && (beztail == 0.0) + && (cextail == 0.0) && (ceytail == 0.0) && (ceztail == 0.0) + && (dextail == 0.0) && (deytail == 0.0) && (deztail == 0.0)) { + return det; + } + + errbound = isperrboundC * permanent + resulterrbound * Absolute(det); + abeps = (aex * beytail + bey * aextail) + - (aey * bextail + bex * aeytail); + bceps = (bex * ceytail + cey * bextail) + - (bey * cextail + cex * beytail); + cdeps = (cex * deytail + dey * cextail) + - (cey * dextail + dex * ceytail); + daeps = (dex * aeytail + aey * dextail) + - (dey * aextail + aex * deytail); + aceps = (aex * ceytail + cey * aextail) + - (aey * cextail + cex * aeytail); + bdeps = (bex * deytail + dey * bextail) + - (bey * dextail + dex * beytail); + det += (((bex * bex + bey * bey + bez * bez) + * ((cez * daeps + dez * aceps + aez * cdeps) + + (ceztail * da3 + deztail * ac3 + aeztail * cd3)) + + (dex * dex + dey * dey + dez * dez) + * ((aez * bceps - bez * aceps + cez * abeps) + + (aeztail * bc3 - beztail * ac3 + ceztail * ab3))) + - ((aex * aex + aey * aey + aez * aez) + * ((bez * cdeps - cez * bdeps + dez * bceps) + + (beztail * cd3 - ceztail * bd3 + deztail * bc3)) + + (cex * cex + cey * cey + cez * cez) + * ((dez * abeps + aez * bdeps + bez * daeps) + + (deztail * ab3 + aeztail * bd3 + beztail * da3)))) + + 2.0 * (((bex * bextail + bey * beytail + bez * beztail) + * (cez * da3 + dez * ac3 + aez * cd3) + + (dex * dextail + dey * deytail + dez * deztail) + * (aez * bc3 - bez * ac3 + cez * ab3)) + - ((aex * aextail + aey * aeytail + aez * aeztail) + * (bez * cd3 - cez * bd3 + dez * bc3) + + (cex * cextail + cey * ceytail + cez * ceztail) + * (dez * ab3 + aez * bd3 + bez * da3))); + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + return insphereexact(pa, pb, pc, pd, pe); +} + +#ifdef USE_CGAL_PREDICATES + +REAL insphere(REAL *pa, REAL *pb, REAL *pc, REAL *pd, REAL *pe) +{ + return (REAL) + - cgal_pred_obj.side_of_oriented_sphere_3_object() + (Point(pa[0], pa[1], pa[2]), + Point(pb[0], pb[1], pb[2]), + Point(pc[0], pc[1], pc[2]), + Point(pd[0], pd[1], pd[2]), + Point(pe[0], pe[1], pe[2])); +} + +#else + +REAL insphere(REAL *pa, REAL *pb, REAL *pc, REAL *pd, REAL *pe) +{ + REAL aex, bex, cex, dex; + REAL aey, bey, cey, dey; + REAL aez, bez, cez, dez; + REAL aexbey, bexaey, bexcey, cexbey, cexdey, dexcey, dexaey, aexdey; + REAL aexcey, cexaey, bexdey, dexbey; + REAL alift, blift, clift, dlift; + REAL ab, bc, cd, da, ac, bd; + REAL abc, bcd, cda, dab; + REAL det; + + + aex = pa[0] - pe[0]; + bex = pb[0] - pe[0]; + cex = pc[0] - pe[0]; + dex = pd[0] - pe[0]; + aey = pa[1] - pe[1]; + bey = pb[1] - pe[1]; + cey = pc[1] - pe[1]; + dey = pd[1] - pe[1]; + aez = pa[2] - pe[2]; + bez = pb[2] - pe[2]; + cez = pc[2] - pe[2]; + dez = pd[2] - pe[2]; + + aexbey = aex * bey; + bexaey = bex * aey; + ab = aexbey - bexaey; + bexcey = bex * cey; + cexbey = cex * bey; + bc = bexcey - cexbey; + cexdey = cex * dey; + dexcey = dex * cey; + cd = cexdey - dexcey; + dexaey = dex * aey; + aexdey = aex * dey; + da = dexaey - aexdey; + + aexcey = aex * cey; + cexaey = cex * aey; + ac = aexcey - cexaey; + bexdey = bex * dey; + dexbey = dex * bey; + bd = bexdey - dexbey; + + abc = aez * bc - bez * ac + cez * ab; + bcd = bez * cd - cez * bd + dez * bc; + cda = cez * da + dez * ac + aez * cd; + dab = dez * ab + aez * bd + bez * da; + + alift = aex * aex + aey * aey + aez * aez; + blift = bex * bex + bey * bey + bez * bez; + clift = cex * cex + cey * cey + cez * cez; + dlift = dex * dex + dey * dey + dez * dez; + + det = (dlift * abc - clift * dab) + (blift * cda - alift * bcd); + + if (_use_inexact_arith) { + return det; + } + + if (_use_static_filter) { + if (fabs(det) > ispstaticfilter) return det; + //if (det > ispstaticfilter) return det; + //if (det < minus_ispstaticfilter) return det; + + } + + REAL aezplus, bezplus, cezplus, dezplus; + REAL aexbeyplus, bexaeyplus, bexceyplus, cexbeyplus; + REAL cexdeyplus, dexceyplus, dexaeyplus, aexdeyplus; + REAL aexceyplus, cexaeyplus, bexdeyplus, dexbeyplus; + REAL permanent, errbound; + + aezplus = Absolute(aez); + bezplus = Absolute(bez); + cezplus = Absolute(cez); + dezplus = Absolute(dez); + aexbeyplus = Absolute(aexbey); + bexaeyplus = Absolute(bexaey); + bexceyplus = Absolute(bexcey); + cexbeyplus = Absolute(cexbey); + cexdeyplus = Absolute(cexdey); + dexceyplus = Absolute(dexcey); + dexaeyplus = Absolute(dexaey); + aexdeyplus = Absolute(aexdey); + aexceyplus = Absolute(aexcey); + cexaeyplus = Absolute(cexaey); + bexdeyplus = Absolute(bexdey); + dexbeyplus = Absolute(dexbey); + permanent = ((cexdeyplus + dexceyplus) * bezplus + + (dexbeyplus + bexdeyplus) * cezplus + + (bexceyplus + cexbeyplus) * dezplus) + * alift + + ((dexaeyplus + aexdeyplus) * cezplus + + (aexceyplus + cexaeyplus) * dezplus + + (cexdeyplus + dexceyplus) * aezplus) + * blift + + ((aexbeyplus + bexaeyplus) * dezplus + + (bexdeyplus + dexbeyplus) * aezplus + + (dexaeyplus + aexdeyplus) * bezplus) + * clift + + ((bexceyplus + cexbeyplus) * aezplus + + (cexaeyplus + aexceyplus) * bezplus + + (aexbeyplus + bexaeyplus) * cezplus) + * dlift; + errbound = isperrboundA * permanent; + if ((det > errbound) || (-det > errbound)) { + return det; + } + + return insphereadapt(pa, pb, pc, pd, pe, permanent); +} + +#endif // #ifdef USE_CGAL_PREDICATES + +/*****************************************************************************/ +/* */ +/* orient4d() Return a positive value if the point pe lies above the */ +/* hyperplane passing through pa, pb, pc, and pd; "above" is */ +/* defined in a manner best found by trial-and-error. Returns */ +/* a negative value if pe lies below the hyperplane. Returns */ +/* zero if the points are co-hyperplanar (not affinely */ +/* independent). The result is also a rough approximation of */ +/* 24 times the signed volume of the 4-simplex defined by the */ +/* five points. */ +/* */ +/* Uses exact arithmetic if necessary to ensure a correct answer. The */ +/* result returned is the determinant of a matrix. This determinant is */ +/* computed adaptively, in the sense that exact arithmetic is used only to */ +/* the degree it is needed to ensure that the returned value has the */ +/* correct sign. Hence, orient4d() is usually quite fast, but will run */ +/* more slowly when the input points are hyper-coplanar or nearly so. */ +/* */ +/* See my Robust Predicates paper for details. */ +/* */ +/*****************************************************************************/ + +REAL orient4dexact(REAL* pa, REAL* pb, REAL* pc, REAL* pd, REAL* pe, + REAL aheight, REAL bheight, REAL cheight, REAL dheight, + REAL eheight) +{ + INEXACT REAL axby1, bxcy1, cxdy1, dxey1, exay1; + INEXACT REAL bxay1, cxby1, dxcy1, exdy1, axey1; + INEXACT REAL axcy1, bxdy1, cxey1, dxay1, exby1; + INEXACT REAL cxay1, dxby1, excy1, axdy1, bxey1; + REAL axby0, bxcy0, cxdy0, dxey0, exay0; + REAL bxay0, cxby0, dxcy0, exdy0, axey0; + REAL axcy0, bxdy0, cxey0, dxay0, exby0; + REAL cxay0, dxby0, excy0, axdy0, bxey0; + REAL ab[4], bc[4], cd[4], de[4], ea[4]; + REAL ac[4], bd[4], ce[4], da[4], eb[4]; + REAL temp8a[8], temp8b[8], temp16[16]; + int temp8alen, temp8blen, temp16len; + REAL abc[24], bcd[24], cde[24], dea[24], eab[24]; + REAL abd[24], bce[24], cda[24], deb[24], eac[24]; + int abclen, bcdlen, cdelen, dealen, eablen; + int abdlen, bcelen, cdalen, deblen, eaclen; + REAL temp48a[48], temp48b[48]; + int temp48alen, temp48blen; + REAL abcd[96], bcde[96], cdea[96], deab[96], eabc[96]; + int abcdlen, bcdelen, cdealen, deablen, eabclen; + REAL adet[192], bdet[192], cdet[192], ddet[192], edet[192]; + int alen, blen, clen, dlen, elen; + REAL abdet[384], cddet[384], cdedet[576]; + int ablen, cdlen; + REAL deter[960]; + int deterlen; + int i; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j; + REAL _0; + + + Two_Product(pa[0], pb[1], axby1, axby0); + Two_Product(pb[0], pa[1], bxay1, bxay0); + Two_Two_Diff(axby1, axby0, bxay1, bxay0, ab[3], ab[2], ab[1], ab[0]); + + Two_Product(pb[0], pc[1], bxcy1, bxcy0); + Two_Product(pc[0], pb[1], cxby1, cxby0); + Two_Two_Diff(bxcy1, bxcy0, cxby1, cxby0, bc[3], bc[2], bc[1], bc[0]); + + Two_Product(pc[0], pd[1], cxdy1, cxdy0); + Two_Product(pd[0], pc[1], dxcy1, dxcy0); + Two_Two_Diff(cxdy1, cxdy0, dxcy1, dxcy0, cd[3], cd[2], cd[1], cd[0]); + + Two_Product(pd[0], pe[1], dxey1, dxey0); + Two_Product(pe[0], pd[1], exdy1, exdy0); + Two_Two_Diff(dxey1, dxey0, exdy1, exdy0, de[3], de[2], de[1], de[0]); + + Two_Product(pe[0], pa[1], exay1, exay0); + Two_Product(pa[0], pe[1], axey1, axey0); + Two_Two_Diff(exay1, exay0, axey1, axey0, ea[3], ea[2], ea[1], ea[0]); + + Two_Product(pa[0], pc[1], axcy1, axcy0); + Two_Product(pc[0], pa[1], cxay1, cxay0); + Two_Two_Diff(axcy1, axcy0, cxay1, cxay0, ac[3], ac[2], ac[1], ac[0]); + + Two_Product(pb[0], pd[1], bxdy1, bxdy0); + Two_Product(pd[0], pb[1], dxby1, dxby0); + Two_Two_Diff(bxdy1, bxdy0, dxby1, dxby0, bd[3], bd[2], bd[1], bd[0]); + + Two_Product(pc[0], pe[1], cxey1, cxey0); + Two_Product(pe[0], pc[1], excy1, excy0); + Two_Two_Diff(cxey1, cxey0, excy1, excy0, ce[3], ce[2], ce[1], ce[0]); + + Two_Product(pd[0], pa[1], dxay1, dxay0); + Two_Product(pa[0], pd[1], axdy1, axdy0); + Two_Two_Diff(dxay1, dxay0, axdy1, axdy0, da[3], da[2], da[1], da[0]); + + Two_Product(pe[0], pb[1], exby1, exby0); + Two_Product(pb[0], pe[1], bxey1, bxey0); + Two_Two_Diff(exby1, exby0, bxey1, bxey0, eb[3], eb[2], eb[1], eb[0]); + + temp8alen = scale_expansion_zeroelim(4, bc, pa[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, ac, -pb[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, ab, pc[2], temp8a); + abclen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + abc); + + temp8alen = scale_expansion_zeroelim(4, cd, pb[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, bd, -pc[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, bc, pd[2], temp8a); + bcdlen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + bcd); + + temp8alen = scale_expansion_zeroelim(4, de, pc[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, ce, -pd[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, cd, pe[2], temp8a); + cdelen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + cde); + + temp8alen = scale_expansion_zeroelim(4, ea, pd[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, da, -pe[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, de, pa[2], temp8a); + dealen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + dea); + + temp8alen = scale_expansion_zeroelim(4, ab, pe[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, eb, -pa[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, ea, pb[2], temp8a); + eablen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + eab); + + temp8alen = scale_expansion_zeroelim(4, bd, pa[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, da, pb[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, ab, pd[2], temp8a); + abdlen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + abd); + + temp8alen = scale_expansion_zeroelim(4, ce, pb[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, eb, pc[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, bc, pe[2], temp8a); + bcelen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + bce); + + temp8alen = scale_expansion_zeroelim(4, da, pc[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, ac, pd[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, cd, pa[2], temp8a); + cdalen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + cda); + + temp8alen = scale_expansion_zeroelim(4, eb, pd[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, bd, pe[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, de, pb[2], temp8a); + deblen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + deb); + + temp8alen = scale_expansion_zeroelim(4, ac, pe[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, ce, pa[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, ea, pc[2], temp8a); + eaclen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + eac); + + temp48alen = fast_expansion_sum_zeroelim(cdelen, cde, bcelen, bce, temp48a); + temp48blen = fast_expansion_sum_zeroelim(deblen, deb, bcdlen, bcd, temp48b); + for (i = 0; i < temp48blen; i++) { + temp48b[i] = -temp48b[i]; + } + bcdelen = fast_expansion_sum_zeroelim(temp48alen, temp48a, + temp48blen, temp48b, bcde); + alen = scale_expansion_zeroelim(bcdelen, bcde, aheight, adet); + + temp48alen = fast_expansion_sum_zeroelim(dealen, dea, cdalen, cda, temp48a); + temp48blen = fast_expansion_sum_zeroelim(eaclen, eac, cdelen, cde, temp48b); + for (i = 0; i < temp48blen; i++) { + temp48b[i] = -temp48b[i]; + } + cdealen = fast_expansion_sum_zeroelim(temp48alen, temp48a, + temp48blen, temp48b, cdea); + blen = scale_expansion_zeroelim(cdealen, cdea, bheight, bdet); + + temp48alen = fast_expansion_sum_zeroelim(eablen, eab, deblen, deb, temp48a); + temp48blen = fast_expansion_sum_zeroelim(abdlen, abd, dealen, dea, temp48b); + for (i = 0; i < temp48blen; i++) { + temp48b[i] = -temp48b[i]; + } + deablen = fast_expansion_sum_zeroelim(temp48alen, temp48a, + temp48blen, temp48b, deab); + clen = scale_expansion_zeroelim(deablen, deab, cheight, cdet); + + temp48alen = fast_expansion_sum_zeroelim(abclen, abc, eaclen, eac, temp48a); + temp48blen = fast_expansion_sum_zeroelim(bcelen, bce, eablen, eab, temp48b); + for (i = 0; i < temp48blen; i++) { + temp48b[i] = -temp48b[i]; + } + eabclen = fast_expansion_sum_zeroelim(temp48alen, temp48a, + temp48blen, temp48b, eabc); + dlen = scale_expansion_zeroelim(eabclen, eabc, dheight, ddet); + + temp48alen = fast_expansion_sum_zeroelim(bcdlen, bcd, abdlen, abd, temp48a); + temp48blen = fast_expansion_sum_zeroelim(cdalen, cda, abclen, abc, temp48b); + for (i = 0; i < temp48blen; i++) { + temp48b[i] = -temp48b[i]; + } + abcdlen = fast_expansion_sum_zeroelim(temp48alen, temp48a, + temp48blen, temp48b, abcd); + elen = scale_expansion_zeroelim(abcdlen, abcd, eheight, edet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + cdlen = fast_expansion_sum_zeroelim(clen, cdet, dlen, ddet, cddet); + cdelen = fast_expansion_sum_zeroelim(cdlen, cddet, elen, edet, cdedet); + deterlen = fast_expansion_sum_zeroelim(ablen, abdet, cdelen, cdedet, deter); + + return deter[deterlen - 1]; +} + +REAL orient4dadapt(REAL* pa, REAL* pb, REAL* pc, REAL* pd, REAL* pe, + REAL aheight, REAL bheight, REAL cheight, REAL dheight, + REAL eheight, REAL permanent) +{ + INEXACT REAL aex, bex, cex, dex, aey, bey, cey, dey, aez, bez, cez, dez; + INEXACT REAL aeheight, beheight, ceheight, deheight; + REAL det, errbound; + + INEXACT REAL aexbey1, bexaey1, bexcey1, cexbey1; + INEXACT REAL cexdey1, dexcey1, dexaey1, aexdey1; + INEXACT REAL aexcey1, cexaey1, bexdey1, dexbey1; + REAL aexbey0, bexaey0, bexcey0, cexbey0; + REAL cexdey0, dexcey0, dexaey0, aexdey0; + REAL aexcey0, cexaey0, bexdey0, dexbey0; + REAL ab[4], bc[4], cd[4], da[4], ac[4], bd[4]; + INEXACT REAL ab3, bc3, cd3, da3, ac3, bd3; + REAL abeps, bceps, cdeps, daeps, aceps, bdeps; + REAL temp8a[8], temp8b[8], temp8c[8], temp16[16], temp24[24]; + int temp8alen, temp8blen, temp8clen, temp16len, temp24len; + REAL adet[48], bdet[48], cdet[48], ddet[48]; + int alen, blen, clen, dlen; + REAL abdet[96], cddet[96]; + int ablen, cdlen; + REAL fin1[192]; + int finlength; + + REAL aextail, bextail, cextail, dextail; + REAL aeytail, beytail, ceytail, deytail; + REAL aeztail, beztail, ceztail, deztail; + REAL aeheighttail, beheighttail, ceheighttail, deheighttail; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j; + REAL _0; + + + aex = (REAL) (pa[0] - pe[0]); + bex = (REAL) (pb[0] - pe[0]); + cex = (REAL) (pc[0] - pe[0]); + dex = (REAL) (pd[0] - pe[0]); + aey = (REAL) (pa[1] - pe[1]); + bey = (REAL) (pb[1] - pe[1]); + cey = (REAL) (pc[1] - pe[1]); + dey = (REAL) (pd[1] - pe[1]); + aez = (REAL) (pa[2] - pe[2]); + bez = (REAL) (pb[2] - pe[2]); + cez = (REAL) (pc[2] - pe[2]); + dez = (REAL) (pd[2] - pe[2]); + aeheight = (REAL) (aheight - eheight); + beheight = (REAL) (bheight - eheight); + ceheight = (REAL) (cheight - eheight); + deheight = (REAL) (dheight - eheight); + + Two_Product(aex, bey, aexbey1, aexbey0); + Two_Product(bex, aey, bexaey1, bexaey0); + Two_Two_Diff(aexbey1, aexbey0, bexaey1, bexaey0, ab3, ab[2], ab[1], ab[0]); + ab[3] = ab3; + + Two_Product(bex, cey, bexcey1, bexcey0); + Two_Product(cex, bey, cexbey1, cexbey0); + Two_Two_Diff(bexcey1, bexcey0, cexbey1, cexbey0, bc3, bc[2], bc[1], bc[0]); + bc[3] = bc3; + + Two_Product(cex, dey, cexdey1, cexdey0); + Two_Product(dex, cey, dexcey1, dexcey0); + Two_Two_Diff(cexdey1, cexdey0, dexcey1, dexcey0, cd3, cd[2], cd[1], cd[0]); + cd[3] = cd3; + + Two_Product(dex, aey, dexaey1, dexaey0); + Two_Product(aex, dey, aexdey1, aexdey0); + Two_Two_Diff(dexaey1, dexaey0, aexdey1, aexdey0, da3, da[2], da[1], da[0]); + da[3] = da3; + + Two_Product(aex, cey, aexcey1, aexcey0); + Two_Product(cex, aey, cexaey1, cexaey0); + Two_Two_Diff(aexcey1, aexcey0, cexaey1, cexaey0, ac3, ac[2], ac[1], ac[0]); + ac[3] = ac3; + + Two_Product(bex, dey, bexdey1, bexdey0); + Two_Product(dex, bey, dexbey1, dexbey0); + Two_Two_Diff(bexdey1, bexdey0, dexbey1, dexbey0, bd3, bd[2], bd[1], bd[0]); + bd[3] = bd3; + + temp8alen = scale_expansion_zeroelim(4, cd, bez, temp8a); + temp8blen = scale_expansion_zeroelim(4, bd, -cez, temp8b); + temp8clen = scale_expansion_zeroelim(4, bc, dez, temp8c); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, + temp8blen, temp8b, temp16); + temp24len = fast_expansion_sum_zeroelim(temp8clen, temp8c, + temp16len, temp16, temp24); + alen = scale_expansion_zeroelim(temp24len, temp24, -aeheight, adet); + + temp8alen = scale_expansion_zeroelim(4, da, cez, temp8a); + temp8blen = scale_expansion_zeroelim(4, ac, dez, temp8b); + temp8clen = scale_expansion_zeroelim(4, cd, aez, temp8c); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, + temp8blen, temp8b, temp16); + temp24len = fast_expansion_sum_zeroelim(temp8clen, temp8c, + temp16len, temp16, temp24); + blen = scale_expansion_zeroelim(temp24len, temp24, beheight, bdet); + + temp8alen = scale_expansion_zeroelim(4, ab, dez, temp8a); + temp8blen = scale_expansion_zeroelim(4, bd, aez, temp8b); + temp8clen = scale_expansion_zeroelim(4, da, bez, temp8c); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, + temp8blen, temp8b, temp16); + temp24len = fast_expansion_sum_zeroelim(temp8clen, temp8c, + temp16len, temp16, temp24); + clen = scale_expansion_zeroelim(temp24len, temp24, -ceheight, cdet); + + temp8alen = scale_expansion_zeroelim(4, bc, aez, temp8a); + temp8blen = scale_expansion_zeroelim(4, ac, -bez, temp8b); + temp8clen = scale_expansion_zeroelim(4, ab, cez, temp8c); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, + temp8blen, temp8b, temp16); + temp24len = fast_expansion_sum_zeroelim(temp8clen, temp8c, + temp16len, temp16, temp24); + dlen = scale_expansion_zeroelim(temp24len, temp24, deheight, ddet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + cdlen = fast_expansion_sum_zeroelim(clen, cdet, dlen, ddet, cddet); + finlength = fast_expansion_sum_zeroelim(ablen, abdet, cdlen, cddet, fin1); + + det = estimate(finlength, fin1); + errbound = isperrboundB * permanent; + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + Two_Diff_Tail(pa[0], pe[0], aex, aextail); + Two_Diff_Tail(pa[1], pe[1], aey, aeytail); + Two_Diff_Tail(pa[2], pe[2], aez, aeztail); + Two_Diff_Tail(aheight, eheight, aeheight, aeheighttail); + Two_Diff_Tail(pb[0], pe[0], bex, bextail); + Two_Diff_Tail(pb[1], pe[1], bey, beytail); + Two_Diff_Tail(pb[2], pe[2], bez, beztail); + Two_Diff_Tail(bheight, eheight, beheight, beheighttail); + Two_Diff_Tail(pc[0], pe[0], cex, cextail); + Two_Diff_Tail(pc[1], pe[1], cey, ceytail); + Two_Diff_Tail(pc[2], pe[2], cez, ceztail); + Two_Diff_Tail(cheight, eheight, ceheight, ceheighttail); + Two_Diff_Tail(pd[0], pe[0], dex, dextail); + Two_Diff_Tail(pd[1], pe[1], dey, deytail); + Two_Diff_Tail(pd[2], pe[2], dez, deztail); + Two_Diff_Tail(dheight, eheight, deheight, deheighttail); + if ((aextail == 0.0) && (aeytail == 0.0) && (aeztail == 0.0) + && (bextail == 0.0) && (beytail == 0.0) && (beztail == 0.0) + && (cextail == 0.0) && (ceytail == 0.0) && (ceztail == 0.0) + && (dextail == 0.0) && (deytail == 0.0) && (deztail == 0.0) + && (aeheighttail == 0.0) && (beheighttail == 0.0) + && (ceheighttail == 0.0) && (deheighttail == 0.0)) { + return det; + } + + errbound = isperrboundC * permanent + resulterrbound * Absolute(det); + abeps = (aex * beytail + bey * aextail) + - (aey * bextail + bex * aeytail); + bceps = (bex * ceytail + cey * bextail) + - (bey * cextail + cex * beytail); + cdeps = (cex * deytail + dey * cextail) + - (cey * dextail + dex * ceytail); + daeps = (dex * aeytail + aey * dextail) + - (dey * aextail + aex * deytail); + aceps = (aex * ceytail + cey * aextail) + - (aey * cextail + cex * aeytail); + bdeps = (bex * deytail + dey * bextail) + - (bey * dextail + dex * beytail); + det += ((beheight + * ((cez * daeps + dez * aceps + aez * cdeps) + + (ceztail * da3 + deztail * ac3 + aeztail * cd3)) + + deheight + * ((aez * bceps - bez * aceps + cez * abeps) + + (aeztail * bc3 - beztail * ac3 + ceztail * ab3))) + - (aeheight + * ((bez * cdeps - cez * bdeps + dez * bceps) + + (beztail * cd3 - ceztail * bd3 + deztail * bc3)) + + ceheight + * ((dez * abeps + aez * bdeps + bez * daeps) + + (deztail * ab3 + aeztail * bd3 + beztail * da3)))) + + ((beheighttail * (cez * da3 + dez * ac3 + aez * cd3) + + deheighttail * (aez * bc3 - bez * ac3 + cez * ab3)) + - (aeheighttail * (bez * cd3 - cez * bd3 + dez * bc3) + + ceheighttail * (dez * ab3 + aez * bd3 + bez * da3))); + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + return orient4dexact(pa, pb, pc, pd, pe, + aheight, bheight, cheight, dheight, eheight); +} + +REAL orient4d(REAL* pa, REAL* pb, REAL* pc, REAL* pd, REAL* pe, + REAL aheight, REAL bheight, REAL cheight, REAL dheight, + REAL eheight) +{ + REAL aex, bex, cex, dex; + REAL aey, bey, cey, dey; + REAL aez, bez, cez, dez; + REAL aexbey, bexaey, bexcey, cexbey, cexdey, dexcey, dexaey, aexdey; + REAL aexcey, cexaey, bexdey, dexbey; + REAL aeheight, beheight, ceheight, deheight; + REAL ab, bc, cd, da, ac, bd; + REAL abc, bcd, cda, dab; + REAL aezplus, bezplus, cezplus, dezplus; + REAL aexbeyplus, bexaeyplus, bexceyplus, cexbeyplus; + REAL cexdeyplus, dexceyplus, dexaeyplus, aexdeyplus; + REAL aexceyplus, cexaeyplus, bexdeyplus, dexbeyplus; + REAL det; + REAL permanent, errbound; + + + aex = pa[0] - pe[0]; + bex = pb[0] - pe[0]; + cex = pc[0] - pe[0]; + dex = pd[0] - pe[0]; + aey = pa[1] - pe[1]; + bey = pb[1] - pe[1]; + cey = pc[1] - pe[1]; + dey = pd[1] - pe[1]; + aez = pa[2] - pe[2]; + bez = pb[2] - pe[2]; + cez = pc[2] - pe[2]; + dez = pd[2] - pe[2]; + aeheight = aheight - eheight; + beheight = bheight - eheight; + ceheight = cheight - eheight; + deheight = dheight - eheight; + + aexbey = aex * bey; + bexaey = bex * aey; + ab = aexbey - bexaey; + bexcey = bex * cey; + cexbey = cex * bey; + bc = bexcey - cexbey; + cexdey = cex * dey; + dexcey = dex * cey; + cd = cexdey - dexcey; + dexaey = dex * aey; + aexdey = aex * dey; + da = dexaey - aexdey; + + aexcey = aex * cey; + cexaey = cex * aey; + ac = aexcey - cexaey; + bexdey = bex * dey; + dexbey = dex * bey; + bd = bexdey - dexbey; + + abc = aez * bc - bez * ac + cez * ab; + bcd = bez * cd - cez * bd + dez * bc; + cda = cez * da + dez * ac + aez * cd; + dab = dez * ab + aez * bd + bez * da; + + det = (deheight * abc - ceheight * dab) + (beheight * cda - aeheight * bcd); + + aezplus = Absolute(aez); + bezplus = Absolute(bez); + cezplus = Absolute(cez); + dezplus = Absolute(dez); + aexbeyplus = Absolute(aexbey); + bexaeyplus = Absolute(bexaey); + bexceyplus = Absolute(bexcey); + cexbeyplus = Absolute(cexbey); + cexdeyplus = Absolute(cexdey); + dexceyplus = Absolute(dexcey); + dexaeyplus = Absolute(dexaey); + aexdeyplus = Absolute(aexdey); + aexceyplus = Absolute(aexcey); + cexaeyplus = Absolute(cexaey); + bexdeyplus = Absolute(bexdey); + dexbeyplus = Absolute(dexbey); + permanent = ((cexdeyplus + dexceyplus) * bezplus + + (dexbeyplus + bexdeyplus) * cezplus + + (bexceyplus + cexbeyplus) * dezplus) + * Absolute(aeheight) + + ((dexaeyplus + aexdeyplus) * cezplus + + (aexceyplus + cexaeyplus) * dezplus + + (cexdeyplus + dexceyplus) * aezplus) + * Absolute(beheight) + + ((aexbeyplus + bexaeyplus) * dezplus + + (bexdeyplus + dexbeyplus) * aezplus + + (dexaeyplus + aexdeyplus) * bezplus) + * Absolute(ceheight) + + ((bexceyplus + cexbeyplus) * aezplus + + (cexaeyplus + aexceyplus) * bezplus + + (aexbeyplus + bexaeyplus) * cezplus) + * Absolute(deheight); + errbound = isperrboundA * permanent; + if ((det > errbound) || (-det > errbound)) { + return det; + } + + return orient4dadapt(pa, pb, pc, pd, pe, + aheight, bheight, cheight, dheight, eheight, permanent); +} + + + diff --git a/src/lib/tetgen.cxx b/src/lib/tetgen.cxx new file mode 100644 index 0000000..599b2e1 --- /dev/null +++ b/src/lib/tetgen.cxx @@ -0,0 +1,32520 @@ +/////////////////////////////////////////////////////////////////////////////// +// // +// TetGen // +// // +// A Quality Tetrahedral Mesh Generator and A 3D Delaunay Triangulator // +// // +// Version 1.5 // +// August 18, 2018 // +// // +// Copyright (C) 2002--2018 // +// // +// TetGen is freely available through the website: http://www.tetgen.org. // +// It may be copied, modified, and redistributed for non-commercial use. // +// Please consult the file LICENSE for the detailed copyright notices. // +// // +/////////////////////////////////////////////////////////////////////////////// + +#include "tetgen.h" + +//// io_cxx /////////////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_node_call() Read a list of points from a file. // +// // +// 'infile' is the file handle contains the node list. It may point to a // +// .node, or .poly or .smesh file. 'markers' indicates each node contains an // +// additional marker (integer) or not. 'uvflag' indicates each node contains // +// u,v coordinates or not. It is reuqired by a PSC. 'infilename' is the name // +// of the file being read, it is only used in error messages. // +// // +// The 'firstnumber' (0 or 1) is automatically determined by the number of // +// the first index of the first point. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_node_call(FILE* infile, int markers, int uvflag, + char* infilename) +{ + char inputline[INPUTLINESIZE]; + char *stringptr; + REAL x, y, z, attrib; + int firstnode, currentmarker; + int index, attribindex; + int i, j; + + // Initialize 'pointlist', 'pointattributelist', and 'pointmarkerlist'. + pointlist = new REAL[numberofpoints * 3]; + if (pointlist == (REAL *) NULL) { + terminatetetgen(NULL, 1); + } + if (numberofpointattributes > 0) { + pointattributelist = new REAL[numberofpoints * numberofpointattributes]; + if (pointattributelist == (REAL *) NULL) { + terminatetetgen(NULL, 1); + } + } + if (markers) { + pointmarkerlist = new int[numberofpoints]; + if (pointmarkerlist == (int *) NULL) { + terminatetetgen(NULL, 1); + } + } + if (uvflag) { + pointparamlist = new pointparam[numberofpoints]; + if (pointparamlist == NULL) { + terminatetetgen(NULL, 1); + } + } + + // Read the point section. + index = 0; + attribindex = 0; + for (i = 0; i < numberofpoints; i++) { + stringptr = readnumberline(inputline, infile, infilename); + if (useindex) { + if (i == 0) { + firstnode = (int) strtol (stringptr, &stringptr, 0); + if ((firstnode == 0) || (firstnode == 1)) { + firstnumber = firstnode; + } + } + stringptr = findnextnumber(stringptr); + } // if (useindex) + if (*stringptr == '\0') { + printf("Error: Point %d has no x coordinate.\n", firstnumber + i); + break; + } + x = (REAL) strtod(stringptr, &stringptr); + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Point %d has no y coordinate.\n", firstnumber + i); + break; + } + y = (REAL) strtod(stringptr, &stringptr); + if (mesh_dim == 3) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Point %d has no z coordinate.\n", firstnumber + i); + break; + } + z = (REAL) strtod(stringptr, &stringptr); + } else { + z = 0.0; // mesh_dim == 2; + } + pointlist[index++] = x; + pointlist[index++] = y; + pointlist[index++] = z; + // Read the point attributes. + for (j = 0; j < numberofpointattributes; j++) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + attrib = 0.0; + } else { + attrib = (REAL) strtod(stringptr, &stringptr); + } + pointattributelist[attribindex++] = attrib; + } + if (markers) { + // Read a point marker. + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + currentmarker = 0; + } else { + currentmarker = (int) strtol (stringptr, &stringptr, 0); + } + pointmarkerlist[i] = currentmarker; + } + if (uvflag) { + // Read point paramteters. + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Point %d has no uv[0].\n", firstnumber + i); + break; + } + pointparamlist[i].uv[0] = (REAL) strtod(stringptr, &stringptr); + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Point %d has no uv[1].\n", firstnumber + i); + break; + } + pointparamlist[i].uv[1] = (REAL) strtod(stringptr, &stringptr); + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Point %d has no tag.\n", firstnumber + i); + break; + } + pointparamlist[i].tag = (int) strtol (stringptr, &stringptr, 0); + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Point %d has no type.\n", firstnumber + i); + break; + } + pointparamlist[i].type = (int) strtol (stringptr, &stringptr, 0); + if ((pointparamlist[i].type < 0) || (pointparamlist[i].type > 2)) { + printf("Error: Point %d has an invalid type.\n", firstnumber + i); + break; + } + } + } + if (i < numberofpoints) { + // Failed to read points due to some error. + delete [] pointlist; + pointlist = (REAL *) NULL; + if (markers) { + delete [] pointmarkerlist; + pointmarkerlist = (int *) NULL; + } + if (numberofpointattributes > 0) { + delete [] pointattributelist; + pointattributelist = (REAL *) NULL; + } + if (uvflag) { + delete [] pointparamlist; + pointparamlist = NULL; + } + numberofpoints = 0; + return false; + } + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_node() Load a list of points from a .node file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_node(char* filebasename) +{ + FILE *infile; + char innodefilename[FILENAMESIZE]; + char inputline[INPUTLINESIZE]; + char *stringptr; + bool okflag; + int markers; + int uvflag; // for psc input. + + // Assembling the actual file names we want to open. + strcpy(innodefilename, filebasename); + strcat(innodefilename, ".node"); + + // Try to open a .node file. + infile = fopen(innodefilename, "r"); + if (infile == (FILE *) NULL) { + printf(" Cannot access file %s.\n", innodefilename); + return false; + } + printf("Opening %s.\n", innodefilename); + + // Set initial flags. + mesh_dim = 3; + numberofpointattributes = 0; // no point attribute. + markers = 0; // no boundary marker. + uvflag = 0; // no uv parameters (required by a PSC). + + // Read the first line of the file. + stringptr = readnumberline(inputline, infile, innodefilename); + // Does this file contain an index column? + stringptr = strstr(inputline, "rbox"); + if (stringptr == NULL) { + // Read number of points, number of dimensions, number of point + // attributes, and number of boundary markers. + stringptr = inputline; + numberofpoints = (int) strtol (stringptr, &stringptr, 0); + stringptr = findnextnumber(stringptr); + if (*stringptr != '\0') { + mesh_dim = (int) strtol (stringptr, &stringptr, 0); + } + stringptr = findnextnumber(stringptr); + if (*stringptr != '\0') { + numberofpointattributes = (int) strtol (stringptr, &stringptr, 0); + } + stringptr = findnextnumber(stringptr); + if (*stringptr != '\0') { + markers = (int) strtol (stringptr, &stringptr, 0); + } + stringptr = findnextnumber(stringptr); + if (*stringptr != '\0') { + uvflag = (int) strtol (stringptr, &stringptr, 0); + } + } else { + // It is a rbox (qhull) input file. + stringptr = inputline; + // Get the dimension. + mesh_dim = (int) strtol (stringptr, &stringptr, 0); + // Get the number of points. + stringptr = readnumberline(inputline, infile, innodefilename); + numberofpoints = (int) strtol (stringptr, &stringptr, 0); + // There is no index column. + useindex = 0; + } + + // Load the list of nodes. + okflag = load_node_call(infile, markers, uvflag, innodefilename); + + fclose(infile); + return okflag; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_edge() Load a list of edges from a .edge file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_edge(char* filebasename) +{ + FILE *infile; + char inedgefilename[FILENAMESIZE]; + char inputline[INPUTLINESIZE]; + char *stringptr; + int markers, corner; + int index; + int i, j; + + strcpy(inedgefilename, filebasename); + strcat(inedgefilename, ".edge"); + + infile = fopen(inedgefilename, "r"); + if (infile != (FILE *) NULL) { + printf("Opening %s.\n", inedgefilename); + } else { + //printf(" Cannot access file %s.\n", inedgefilename); + return false; + } + + // Read number of boundary edges. + stringptr = readnumberline(inputline, infile, inedgefilename); + numberofedges = (int) strtol (stringptr, &stringptr, 0); + if (numberofedges > 0) { + edgelist = new int[numberofedges * 2]; + if (edgelist == (int *) NULL) { + terminatetetgen(NULL, 1); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + markers = 0; // Default value. + } else { + markers = (int) strtol (stringptr, &stringptr, 0); + } + if (markers > 0) { + edgemarkerlist = new int[numberofedges]; + } + } + + // Read the list of edges. + index = 0; + for (i = 0; i < numberofedges; i++) { + // Read edge index and the edge's two endpoints. + stringptr = readnumberline(inputline, infile, inedgefilename); + for (j = 0; j < 2; j++) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Edge %d is missing vertex %d in %s.\n", + i + firstnumber, j + 1, inedgefilename); + terminatetetgen(NULL, 1); + } + corner = (int) strtol(stringptr, &stringptr, 0); + if (corner < firstnumber || corner >= numberofpoints + firstnumber) { + printf("Error: Edge %d has an invalid vertex index.\n", + i + firstnumber); + terminatetetgen(NULL, 1); + } + edgelist[index++] = corner; + } + if (numberofcorners == 10) { + // Skip an extra vertex (generated by a previous -o2 option). + stringptr = findnextnumber(stringptr); + } + // Read the edge marker if it has. + if (markers) { + stringptr = findnextnumber(stringptr); + edgemarkerlist[i] = (int) strtol(stringptr, &stringptr, 0); + } + } + + fclose(infile); + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_face() Load a list of faces (triangles) from a .face file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_face(char* filebasename) +{ + FILE *infile; + char infilename[FILENAMESIZE]; + char inputline[INPUTLINESIZE]; + char *stringptr; + REAL attrib; + int markers, corner; + int index; + int i, j; + + strcpy(infilename, filebasename); + strcat(infilename, ".face"); + + infile = fopen(infilename, "r"); + if (infile != (FILE *) NULL) { + printf("Opening %s.\n", infilename); + } else { + return false; + } + + // Read number of faces, boundary markers. + stringptr = readnumberline(inputline, infile, infilename); + numberoftrifaces = (int) strtol (stringptr, &stringptr, 0); + stringptr = findnextnumber(stringptr); + if (mesh_dim == 2) { + // Skip a number. + stringptr = findnextnumber(stringptr); + } + if (*stringptr == '\0') { + markers = 0; // Default there is no marker per face. + } else { + markers = (int) strtol (stringptr, &stringptr, 0); + } + if (numberoftrifaces > 0) { + trifacelist = new int[numberoftrifaces * 3]; + if (trifacelist == (int *) NULL) { + terminatetetgen(NULL, 1); + } + if (markers) { + trifacemarkerlist = new int[numberoftrifaces]; + if (trifacemarkerlist == (int *) NULL) { + terminatetetgen(NULL, 1); + } + } + } + + // Read the list of faces. + index = 0; + for (i = 0; i < numberoftrifaces; i++) { + // Read face index and the face's three corners. + stringptr = readnumberline(inputline, infile, infilename); + for (j = 0; j < 3; j++) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Face %d is missing vertex %d in %s.\n", + i + firstnumber, j + 1, infilename); + terminatetetgen(NULL, 1); + } + corner = (int) strtol(stringptr, &stringptr, 0); + if (corner < firstnumber || corner >= numberofpoints + firstnumber) { + printf("Error: Face %d has an invalid vertex index.\n", + i + firstnumber); + terminatetetgen(NULL, 1); + } + trifacelist[index++] = corner; + } + if (numberofcorners == 10) { + // Skip 3 extra vertices (generated by a previous -o2 option). + for (j = 0; j < 3; j++) { + stringptr = findnextnumber(stringptr); + } + } + // Read the boundary marker if it exists. + if (markers) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + attrib = 0.0; + } else { + attrib = (REAL) strtod(stringptr, &stringptr); + } + trifacemarkerlist[i] = (int) attrib; + } + } + + fclose(infile); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_tet() Load a list of tetrahedra from a .ele file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_tet(char* filebasename) +{ + FILE *infile; + char infilename[FILENAMESIZE]; + char inputline[INPUTLINESIZE]; + char *stringptr; + REAL attrib; + int corner; + int index, attribindex; + int i, j; + + strcpy(infilename, filebasename); + strcat(infilename, ".ele"); + + infile = fopen(infilename, "r"); + if (infile != (FILE *) NULL) { + printf("Opening %s.\n", infilename); + } else { + return false; + } + + // Read number of elements, number of corners (4 or 10), number of + // element attributes. + stringptr = readnumberline(inputline, infile, infilename); + numberoftetrahedra = (int) strtol (stringptr, &stringptr, 0); + if (numberoftetrahedra <= 0) { + printf("Error: Invalid number of tetrahedra.\n"); + fclose(infile); + return false; + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + numberofcorners = 4; // Default read 4 nodes per element. + } else { + numberofcorners = (int) strtol(stringptr, &stringptr, 0); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + numberoftetrahedronattributes = 0; // Default no attribute. + } else { + numberoftetrahedronattributes = (int) strtol(stringptr, &stringptr, 0); + } + if (numberofcorners != 4 && numberofcorners != 10) { + printf("Error: Wrong number of corners %d (should be 4 or 10).\n", + numberofcorners); + fclose(infile); + return false; + } + + // Allocate memory for tetrahedra. + tetrahedronlist = new int[numberoftetrahedra * numberofcorners]; + if (tetrahedronlist == (int *) NULL) { + terminatetetgen(NULL, 1); + } + // Allocate memory for output tetrahedron attributes if necessary. + if (numberoftetrahedronattributes > 0) { + tetrahedronattributelist = new REAL[numberoftetrahedra * + numberoftetrahedronattributes]; + if (tetrahedronattributelist == (REAL *) NULL) { + terminatetetgen(NULL, 1); + } + } + + // Read the list of tetrahedra. + index = 0; + attribindex = 0; + for (i = 0; i < numberoftetrahedra; i++) { + // Read tetrahedron index and the tetrahedron's corners. + stringptr = readnumberline(inputline, infile, infilename); + for (j = 0; j < numberofcorners; j++) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Tetrahedron %d is missing vertex %d in %s.\n", + i + firstnumber, j + 1, infilename); + terminatetetgen(NULL, 1); + } + corner = (int) strtol(stringptr, &stringptr, 0); + if (corner < firstnumber || corner >= numberofpoints + firstnumber) { + printf("Error: Tetrahedron %d has an invalid vertex index.\n", + i + firstnumber); + terminatetetgen(NULL, 1); + } + tetrahedronlist[index++] = corner; + } + // Read the tetrahedron's attributes. + for (j = 0; j < numberoftetrahedronattributes; j++) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + attrib = 0.0; + } else { + attrib = (REAL) strtod(stringptr, &stringptr); + } + tetrahedronattributelist[attribindex++] = attrib; + } + } + + fclose(infile); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_vol() Load a list of volume constraints from a .vol file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_vol(char* filebasename) +{ + FILE *infile; + char inelefilename[FILENAMESIZE]; + char infilename[FILENAMESIZE]; + char inputline[INPUTLINESIZE]; + char *stringptr; + REAL volume; + int volelements; + int i; + + strcpy(infilename, filebasename); + strcat(infilename, ".vol"); + + infile = fopen(infilename, "r"); + if (infile != (FILE *) NULL) { + printf("Opening %s.\n", infilename); + } else { + return false; + } + + // Read number of tetrahedra. + stringptr = readnumberline(inputline, infile, infilename); + volelements = (int) strtol (stringptr, &stringptr, 0); + if (volelements != numberoftetrahedra) { + strcpy(inelefilename, filebasename); + strcat(infilename, ".ele"); + printf("Warning: %s and %s disagree on number of tetrahedra.\n", + inelefilename, infilename); + fclose(infile); + return false; + } + + tetrahedronvolumelist = new REAL[volelements]; + if (tetrahedronvolumelist == (REAL *) NULL) { + terminatetetgen(NULL, 1); + } + + // Read the list of volume constraints. + for (i = 0; i < volelements; i++) { + stringptr = readnumberline(inputline, infile, infilename); + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + volume = -1.0; // No constraint on this tetrahedron. + } else { + volume = (REAL) strtod(stringptr, &stringptr); + } + tetrahedronvolumelist[i] = volume; + } + + fclose(infile); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_var() Load constraints applied on facets, segments, and nodes // +// from a .var file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_var(char* filebasename) +{ + FILE *infile; + char varfilename[FILENAMESIZE]; + char inputline[INPUTLINESIZE]; + char *stringptr; + int index; + int i; + + // Variant constraints are saved in file "filename.var". + strcpy(varfilename, filebasename); + strcat(varfilename, ".var"); + infile = fopen(varfilename, "r"); + if (infile != (FILE *) NULL) { + printf("Opening %s.\n", varfilename); + } else { + return false; + } + + // Read the facet constraint section. + stringptr = readnumberline(inputline, infile, varfilename); + if (stringptr == NULL) { + // No region list, return. + fclose(infile); + return true; + } + if (*stringptr != '\0') { + numberoffacetconstraints = (int) strtol (stringptr, &stringptr, 0); + } else { + numberoffacetconstraints = 0; + } + if (numberoffacetconstraints > 0) { + // Initialize 'facetconstraintlist'. + facetconstraintlist = new REAL[numberoffacetconstraints * 2]; + index = 0; + for (i = 0; i < numberoffacetconstraints; i++) { + stringptr = readnumberline(inputline, infile, varfilename); + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: facet constraint %d has no facet marker.\n", + firstnumber + i); + break; + } else { + facetconstraintlist[index++] = (REAL) strtod(stringptr, &stringptr); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: facet constraint %d has no maximum area bound.\n", + firstnumber + i); + break; + } else { + facetconstraintlist[index++] = (REAL) strtod(stringptr, &stringptr); + } + } + if (i < numberoffacetconstraints) { + // This must be caused by an error. + fclose(infile); + return false; + } + } + + // Read the segment constraint section. + stringptr = readnumberline(inputline, infile, varfilename); + if (stringptr == NULL) { + // No segment list, return. + fclose(infile); + return true; + } + if (*stringptr != '\0') { + numberofsegmentconstraints = (int) strtol (stringptr, &stringptr, 0); + } else { + numberofsegmentconstraints = 0; + } + if (numberofsegmentconstraints > 0) { + // Initialize 'segmentconstraintlist'. + segmentconstraintlist = new REAL[numberofsegmentconstraints * 3]; + index = 0; + for (i = 0; i < numberofsegmentconstraints; i++) { + stringptr = readnumberline(inputline, infile, varfilename); + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: segment constraint %d has no frist endpoint.\n", + firstnumber + i); + break; + } else { + segmentconstraintlist[index++] = (REAL) strtod(stringptr, &stringptr); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: segment constraint %d has no second endpoint.\n", + firstnumber + i); + break; + } else { + segmentconstraintlist[index++] = (REAL) strtod(stringptr, &stringptr); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: segment constraint %d has no maximum length bound.\n", + firstnumber + i); + break; + } else { + segmentconstraintlist[index++] = (REAL) strtod(stringptr, &stringptr); + } + } + if (i < numberofsegmentconstraints) { + // This must be caused by an error. + fclose(infile); + return false; + } + } + + fclose(infile); + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_mtr() Load a size specification map from a .mtr file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_mtr(char* filebasename) +{ + FILE *infile; + char mtrfilename[FILENAMESIZE]; + char inputline[INPUTLINESIZE]; + char *stringptr; + REAL mtr; + int ptnum; + int mtrindex; + int i, j; + + strcpy(mtrfilename, filebasename); + strcat(mtrfilename, ".mtr"); + infile = fopen(mtrfilename, "r"); + if (infile != (FILE *) NULL) { + printf("Opening %s.\n", mtrfilename); + } else { + return false; + } + + // Read the number of points. + stringptr = readnumberline(inputline, infile, mtrfilename); + ptnum = (int) strtol (stringptr, &stringptr, 0); + if (ptnum != numberofpoints) { + printf(" !! Point numbers are not equal. Ignored.\n"); + fclose(infile); + return false; + } + // Read the number of columns (1, 3, or 6). + stringptr = findnextnumber(stringptr); // Skip number of points. + if (*stringptr != '\0') { + numberofpointmtrs = (int) strtol (stringptr, &stringptr, 0); + } + if ((numberofpointmtrs != 1) && (numberofpointmtrs != 3) && + (numberofpointmtrs != 6)) { + // Column number doesn't match. + numberofpointmtrs = 0; + printf(" !! Metric size does not match (1, 3, or 6). Ignored.\n"); + fclose(infile); + return false; + } + + // Allocate space for pointmtrlist. + pointmtrlist = new REAL[numberofpoints * numberofpointmtrs]; + if (pointmtrlist == (REAL *) NULL) { + terminatetetgen(NULL, 1); + } + mtrindex = 0; + for (i = 0; i < numberofpoints; i++) { + // Read metrics. + stringptr = readnumberline(inputline, infile, mtrfilename); + for (j = 0; j < numberofpointmtrs; j++) { + if (*stringptr == '\0') { + printf("Error: Metric %d is missing value #%d in %s.\n", + i + firstnumber, j + 1, mtrfilename); + terminatetetgen(NULL, 1); + } + mtr = (REAL) strtod(stringptr, &stringptr); + pointmtrlist[mtrindex++] = mtr; + stringptr = findnextnumber(stringptr); + } + } + + fclose(infile); + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_poly() Load a PL complex from a .poly or a .smesh file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_poly(char* filebasename) +{ + FILE *infile; + char inpolyfilename[FILENAMESIZE]; + char insmeshfilename[FILENAMESIZE]; + char inputline[INPUTLINESIZE]; + char *stringptr, *infilename; + int smesh, markers, uvflag, currentmarker; + int index; + int i, j, k; + + // Assembling the actual file names we want to open. + strcpy(inpolyfilename, filebasename); + strcpy(insmeshfilename, filebasename); + strcat(inpolyfilename, ".poly"); + strcat(insmeshfilename, ".smesh"); + + // First assume it is a .poly file. + smesh = 0; + // Try to open a .poly file. + infile = fopen(inpolyfilename, "r"); + if (infile == (FILE *) NULL) { + // .poly doesn't exist! Try to open a .smesh file. + infile = fopen(insmeshfilename, "r"); + if (infile == (FILE *) NULL) { + printf(" Cannot access file %s and %s.\n", + inpolyfilename, insmeshfilename); + return false; + } else { + printf("Opening %s.\n", insmeshfilename); + infilename = insmeshfilename; + } + smesh = 1; + } else { + printf("Opening %s.\n", inpolyfilename); + infilename = inpolyfilename; + } + + // Initialize the default values. + mesh_dim = 3; // Three-dimensional coordinates. + numberofpointattributes = 0; // no point attribute. + markers = 0; // no boundary marker. + uvflag = 0; // no uv parameters (required by a PSC). + + // Read number of points, number of dimensions, number of point + // attributes, and number of boundary markers. + stringptr = readnumberline(inputline, infile, infilename); + numberofpoints = (int) strtol (stringptr, &stringptr, 0); + stringptr = findnextnumber(stringptr); + if (*stringptr != '\0') { + mesh_dim = (int) strtol (stringptr, &stringptr, 0); + } + stringptr = findnextnumber(stringptr); + if (*stringptr != '\0') { + numberofpointattributes = (int) strtol (stringptr, &stringptr, 0); + } + stringptr = findnextnumber(stringptr); + if (*stringptr != '\0') { + markers = (int) strtol (stringptr, &stringptr, 0); + } + if (*stringptr != '\0') { + uvflag = (int) strtol (stringptr, &stringptr, 0); + } + + if (numberofpoints > 0) { + // Load the list of nodes. + if (!load_node_call(infile, markers, uvflag, infilename)) { + fclose(infile); + return false; + } + } else { + // If the .poly or .smesh file claims there are zero points, that + // means the points should be read from a separate .node file. + if (!load_node(filebasename)) { + fclose(infile); + return false; + } + } + + if ((mesh_dim != 3) && (mesh_dim != 2)) { + printf("Input error: TetGen only works for 2D & 3D point sets.\n"); + fclose(infile); + return false; + } + if (numberofpoints < (mesh_dim + 1)) { + printf("Input error: TetGen needs at least %d points.\n", mesh_dim + 1); + fclose(infile); + return false; + } + + facet *f; + polygon *p; + + if (mesh_dim == 3) { + + // Read number of facets and number of boundary markers. + stringptr = readnumberline(inputline, infile, infilename); + if (stringptr == NULL) { + // No facet list, return. + fclose(infile); + return true; + } + numberoffacets = (int) strtol (stringptr, &stringptr, 0); + if (numberoffacets <= 0) { + // No facet list, return. + fclose(infile); + return true; + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + markers = 0; // no boundary marker. + } else { + markers = (int) strtol (stringptr, &stringptr, 0); + } + + // Initialize the 'facetlist', 'facetmarkerlist'. + facetlist = new facet[numberoffacets]; + if (markers == 1) { + facetmarkerlist = new int[numberoffacets]; + } + + // Read data into 'facetlist', 'facetmarkerlist'. + if (smesh == 0) { + // Facets are in .poly file format. + for (i = 1; i <= numberoffacets; i++) { + f = &(facetlist[i - 1]); + init(f); + f->numberofholes = 0; + currentmarker = 0; + // Read number of polygons, number of holes, and a boundary marker. + stringptr = readnumberline(inputline, infile, infilename); + f->numberofpolygons = (int) strtol (stringptr, &stringptr, 0); + stringptr = findnextnumber(stringptr); + if (*stringptr != '\0') { + f->numberofholes = (int) strtol (stringptr, &stringptr, 0); + if (markers == 1) { + stringptr = findnextnumber(stringptr); + if (*stringptr != '\0') { + currentmarker = (int) strtol(stringptr, &stringptr, 0); + } + } + } + // Initialize facetmarker if it needs. + if (markers == 1) { + facetmarkerlist[i - 1] = currentmarker; + } + // Each facet should has at least one polygon. + if (f->numberofpolygons <= 0) { + printf("Error: Wrong number of polygon in %d facet.\n", i); + break; + } + // Initialize the 'f->polygonlist'. + f->polygonlist = new polygon[f->numberofpolygons]; + // Go through all polygons, read in their vertices. + for (j = 1; j <= f->numberofpolygons; j++) { + p = &(f->polygonlist[j - 1]); + init(p); + // Read number of vertices of this polygon. + stringptr = readnumberline(inputline, infile, infilename); + p->numberofvertices = (int) strtol(stringptr, &stringptr, 0); + if (p->numberofvertices < 1) { + printf("Error: Wrong polygon %d in facet %d\n", j, i); + break; + } + // Initialize 'p->vertexlist'. + p->vertexlist = new int[p->numberofvertices]; + // Read all vertices of this polygon. + for (k = 1; k <= p->numberofvertices; k++) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + // Try to load another non-empty line and continue to read the + // rest of vertices. + stringptr = readnumberline(inputline, infile, infilename); + if (*stringptr == '\0') { + printf("Error: Missing %d endpoints of polygon %d in facet %d", + p->numberofvertices - k, j, i); + break; + } + } + p->vertexlist[k - 1] = (int) strtol (stringptr, &stringptr, 0); + } + } + if (j <= f->numberofpolygons) { + // This must be caused by an error. However, there're j - 1 + // polygons have been read. Reset the 'f->numberofpolygon'. + if (j == 1) { + // This is the first polygon. + delete [] f->polygonlist; + } + f->numberofpolygons = j - 1; + // No hole will be read even it exists. + f->numberofholes = 0; + break; + } + // If this facet has hole pints defined, read them. + if (f->numberofholes > 0) { + // Initialize 'f->holelist'. + f->holelist = new REAL[f->numberofholes * 3]; + // Read the holes' coordinates. + index = 0; + for (j = 1; j <= f->numberofholes; j++) { + stringptr = readnumberline(inputline, infile, infilename); + for (k = 1; k <= 3; k++) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Hole %d in facet %d has no coordinates", j, i); + break; + } + f->holelist[index++] = (REAL) strtod (stringptr, &stringptr); + } + if (k <= 3) { + // This must be caused by an error. + break; + } + } + if (j <= f->numberofholes) { + // This must be caused by an error. + break; + } + } + } + if (i <= numberoffacets) { + // This must be caused by an error. + numberoffacets = i - 1; + fclose(infile); + return false; + } + } else { // poly == 0 + // Read the facets from a .smesh file. + for (i = 1; i <= numberoffacets; i++) { + f = &(facetlist[i - 1]); + init(f); + // Initialize 'f->facetlist'. In a .smesh file, each facetlist only + // contains exactly one polygon, no hole. + f->numberofpolygons = 1; + f->polygonlist = new polygon[f->numberofpolygons]; + p = &(f->polygonlist[0]); + init(p); + // Read number of vertices of this polygon. + stringptr = readnumberline(inputline, infile, insmeshfilename); + p->numberofvertices = (int) strtol (stringptr, &stringptr, 0); + if (p->numberofvertices < 1) { + printf("Error: Wrong number of vertex in facet %d\n", i); + break; + } + // Initialize 'p->vertexlist'. + p->vertexlist = new int[p->numberofvertices]; + for (k = 1; k <= p->numberofvertices; k++) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + // Try to load another non-empty line and continue to read the + // rest of vertices. + stringptr = readnumberline(inputline, infile, infilename); + if (*stringptr == '\0') { + printf("Error: Missing %d endpoints in facet %d", + p->numberofvertices - k, i); + break; + } + } + p->vertexlist[k - 1] = (int) strtol (stringptr, &stringptr, 0); + } + if (k <= p->numberofvertices) { + // This must be caused by an error. + break; + } + // Read facet's boundary marker at last. + if (markers == 1) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + currentmarker = 0; + } else { + currentmarker = (int) strtol(stringptr, &stringptr, 0); + } + facetmarkerlist[i - 1] = currentmarker; + } + } + if (i <= numberoffacets) { + // This must be caused by an error. + numberoffacets = i - 1; + fclose(infile); + return false; + } + } + + // Read the hole section. + stringptr = readnumberline(inputline, infile, infilename); + if (stringptr == NULL) { + // No hole list, return. + fclose(infile); + return true; + } + if (*stringptr != '\0') { + numberofholes = (int) strtol (stringptr, &stringptr, 0); + } else { + numberofholes = 0; + } + if (numberofholes > 0) { + // Initialize 'holelist'. + holelist = new REAL[numberofholes * 3]; + for (i = 0; i < 3 * numberofholes; i += 3) { + stringptr = readnumberline(inputline, infile, infilename); + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Hole %d has no x coord.\n", firstnumber + (i / 3)); + break; + } else { + holelist[i] = (REAL) strtod(stringptr, &stringptr); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Hole %d has no y coord.\n", firstnumber + (i / 3)); + break; + } else { + holelist[i + 1] = (REAL) strtod(stringptr, &stringptr); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Hole %d has no z coord.\n", firstnumber + (i / 3)); + break; + } else { + holelist[i + 2] = (REAL) strtod(stringptr, &stringptr); + } + } + if (i < 3 * numberofholes) { + // This must be caused by an error. + fclose(infile); + return false; + } + } + + // Read the region section. The 'region' section is optional, if we + // don't reach the end-of-file, try read it in. + stringptr = readnumberline(inputline, infile, NULL); + if (stringptr != (char *) NULL && *stringptr != '\0') { + numberofregions = (int) strtol (stringptr, &stringptr, 0); + } else { + numberofregions = 0; + } + if (numberofregions > 0) { + // Initialize 'regionlist'. + regionlist = new REAL[numberofregions * 5]; + index = 0; + for (i = 0; i < numberofregions; i++) { + stringptr = readnumberline(inputline, infile, infilename); + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Region %d has no x coordinate.\n", firstnumber + i); + break; + } else { + regionlist[index++] = (REAL) strtod(stringptr, &stringptr); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Region %d has no y coordinate.\n", firstnumber + i); + break; + } else { + regionlist[index++] = (REAL) strtod(stringptr, &stringptr); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Region %d has no z coordinate.\n", firstnumber + i); + break; + } else { + regionlist[index++] = (REAL) strtod(stringptr, &stringptr); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Region %d has no region attrib.\n", firstnumber + i); + break; + } else { + regionlist[index++] = (REAL) strtod(stringptr, &stringptr); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + regionlist[index] = regionlist[index - 1]; + } else { + regionlist[index] = (REAL) strtod(stringptr, &stringptr); + } + index++; + } + if (i < numberofregions) { + // This must be caused by an error. + fclose(infile); + return false; + } + } + + } + + // End of reading poly/smesh file. + fclose(infile); + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_off() Load a polyhedron from a .off file. // +// // +// The .off format is one of file formats of the Geomview, an interactive // +// program for viewing and manipulating geometric objects. More information // +// is available form: http://www.geomview.org. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_off(char* filebasename) +{ + FILE *fp; + tetgenio::facet *f; + tetgenio::polygon *p; + char infilename[FILENAMESIZE]; + char buffer[INPUTLINESIZE]; + char *bufferp; + double *coord; + int nverts = 0, iverts = 0; + int nfaces = 0, ifaces = 0; + int nedges = 0; + int line_count = 0, i; + + // Default, the off file's index is from '0'. We check it by remembering the + // smallest index we found in the file. It should be either 0 or 1. + int smallestidx = 0; + + strncpy(infilename, filebasename, 1024 - 1); + infilename[FILENAMESIZE - 1] = '\0'; + if (infilename[0] == '\0') { + printf("Error: No filename.\n"); + return false; + } + if (strcmp(&infilename[strlen(infilename) - 4], ".off") != 0) { + strcat(infilename, ".off"); + } + + if (!(fp = fopen(infilename, "r"))) { + printf(" Unable to open file %s\n", infilename); + return false; + } + printf("Opening %s.\n", infilename); + + while ((bufferp = readline(buffer, fp, &line_count)) != NULL) { + // Check section + if (nverts == 0) { + // Read header + bufferp = strstr(bufferp, "OFF"); + if (bufferp != NULL) { + // Read mesh counts + bufferp = findnextnumber(bufferp); // Skip field "OFF". + if (*bufferp == '\0') { + // Read a non-empty line. + bufferp = readline(buffer, fp, &line_count); + } + if ((sscanf(bufferp, "%d%d%d", &nverts, &nfaces, &nedges) != 3) + || (nverts == 0)) { + printf("Syntax error reading header on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + // Allocate memory for 'tetgenio' + if (nverts > 0) { + numberofpoints = nverts; + pointlist = new REAL[nverts * 3]; + smallestidx = nverts + 1; // A bigger enough number. + } + if (nfaces > 0) { + numberoffacets = nfaces; + facetlist = new tetgenio::facet[nfaces]; + } + } + } else if (iverts < nverts) { + // Read vertex coordinates + coord = &pointlist[iverts * 3]; + for (i = 0; i < 3; i++) { + if (*bufferp == '\0') { + printf("Syntax error reading vertex coords on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + coord[i] = (REAL) strtod(bufferp, &bufferp); + bufferp = findnextnumber(bufferp); + } + iverts++; + } else if (ifaces < nfaces) { + // Get next face + f = &facetlist[ifaces]; + init(f); + // In .off format, each facet has one polygon, no hole. + f->numberofpolygons = 1; + f->polygonlist = new tetgenio::polygon[1]; + p = &f->polygonlist[0]; + init(p); + // Read the number of vertices, it should be greater than 0. + p->numberofvertices = (int) strtol(bufferp, &bufferp, 0); + if (p->numberofvertices == 0) { + printf("Syntax error reading polygon on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + // Allocate memory for face vertices + p->vertexlist = new int[p->numberofvertices]; + for (i = 0; i < p->numberofvertices; i++) { + bufferp = findnextnumber(bufferp); + if (*bufferp == '\0') { + printf("Syntax error reading polygon on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + p->vertexlist[i] = (int) strtol(bufferp, &bufferp, 0); + // Detect the smallest index. + if (p->vertexlist[i] < smallestidx) { + smallestidx = p->vertexlist[i]; + } + } + ifaces++; + } else { + // Should never get here + printf("Found extra text starting at line %d in file %s\n", line_count, + infilename); + break; + } + } + + // Close file + fclose(fp); + + // Decide the firstnumber of the index. + if (smallestidx == 0) { + firstnumber = 0; + } else if (smallestidx == 1) { + firstnumber = 1; + } else { + printf("A wrong smallest index (%d) was detected in file %s\n", + smallestidx, infilename); + return false; + } + + if (iverts != nverts) { + printf("Expected %d vertices, but read only %d vertices in file %s\n", + nverts, iverts, infilename); + return false; + } + if (ifaces != nfaces) { + printf("Expected %d faces, but read only %d faces in file %s\n", + nfaces, ifaces, infilename); + return false; + } + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_ply() Load a polyhedron from a .ply file. // +// // +// This is a simplified version of reading .ply files, which only reads the // +// set of vertices and the set of faces. Other informations (such as color, // +// material, texture, etc) in .ply file are ignored. Complete routines for // +// reading and writing ,ply files are available from: http://www.cc.gatech. // +// edu/projects/large_models/ply.html. Except the header section, ply file // +// format has exactly the same format for listing vertices and polygons as // +// off file format. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_ply(char* filebasename) +{ + FILE *fp; + tetgenio::facet *f; + tetgenio::polygon *p; + char infilename[FILENAMESIZE]; + char buffer[INPUTLINESIZE]; + char *bufferp, *str; + double *coord; + int endheader = 0, format = 0; + int nverts = 0, iverts = 0; + int nfaces = 0, ifaces = 0; + int line_count = 0, i; + + // Default, the ply file's index is from '0'. We check it by remembering the + // smallest index we found in the file. It should be either 0 or 1. + int smallestidx = 0; + + strncpy(infilename, filebasename, FILENAMESIZE - 1); + infilename[FILENAMESIZE - 1] = '\0'; + if (infilename[0] == '\0') { + printf("Error: No filename.\n"); + return false; + } + if (strcmp(&infilename[strlen(infilename) - 4], ".ply") != 0) { + strcat(infilename, ".ply"); + } + + if (!(fp = fopen(infilename, "r"))) { + printf("Error: Unable to open file %s\n", infilename); + return false; + } + printf("Opening %s.\n", infilename); + + while ((bufferp = readline(buffer, fp, &line_count)) != NULL) { + if (!endheader) { + // Find if it is the keyword "end_header". + str = strstr(bufferp, "end_header"); + // strstr() is case sensitive. + if (!str) str = strstr(bufferp, "End_header"); + if (!str) str = strstr(bufferp, "End_Header"); + if (str) { + // This is the end of the header section. + endheader = 1; + continue; + } + // Parse the number of vertices and the number of faces. + if (nverts == 0 || nfaces == 0) { + // Find if it si the keyword "element". + str = strstr(bufferp, "element"); + if (!str) str = strstr(bufferp, "Element"); + if (str) { + bufferp = findnextfield(str); + if (*bufferp == '\0') { + printf("Syntax error reading element type on line%d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + if (nverts == 0) { + // Find if it is the keyword "vertex". + str = strstr(bufferp, "vertex"); + if (!str) str = strstr(bufferp, "Vertex"); + if (str) { + bufferp = findnextnumber(str); + if (*bufferp == '\0') { + printf("Syntax error reading vertex number on line"); + printf(" %d in file %s\n", line_count, infilename); + fclose(fp); + return false; + } + nverts = (int) strtol(bufferp, &bufferp, 0); + // Allocate memory for 'tetgenio' + if (nverts > 0) { + numberofpoints = nverts; + pointlist = new REAL[nverts * 3]; + smallestidx = nverts + 1; // A big enough index. + } + } + } + if (nfaces == 0) { + // Find if it is the keyword "face". + str = strstr(bufferp, "face"); + if (!str) str = strstr(bufferp, "Face"); + if (str) { + bufferp = findnextnumber(str); + if (*bufferp == '\0') { + printf("Syntax error reading face number on line"); + printf(" %d in file %s\n", line_count, infilename); + fclose(fp); + return false; + } + nfaces = (int) strtol(bufferp, &bufferp, 0); + // Allocate memory for 'tetgenio' + if (nfaces > 0) { + numberoffacets = nfaces; + facetlist = new tetgenio::facet[nfaces]; + } + } + } + } // It is not the string "element". + } + if (format == 0) { + // Find the keyword "format". + str = strstr(bufferp, "format"); + if (!str) str = strstr(bufferp, "Format"); + if (str) { + format = 1; + bufferp = findnextfield(str); + // Find if it is the string "ascii". + str = strstr(bufferp, "ascii"); + if (!str) str = strstr(bufferp, "ASCII"); + if (!str) { + printf("This routine only reads ascii format of ply files.\n"); + printf("Hint: You can convert the binary to ascii format by\n"); + printf(" using the provided ply tools:\n"); + printf(" ply2ascii < %s > ascii_%s\n", infilename, infilename); + fclose(fp); + return false; + } + } + } + } else if (iverts < nverts) { + // Read vertex coordinates + coord = &pointlist[iverts * 3]; + for (i = 0; i < 3; i++) { + if (*bufferp == '\0') { + printf("Syntax error reading vertex coords on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + coord[i] = (REAL) strtod(bufferp, &bufferp); + bufferp = findnextnumber(bufferp); + } + iverts++; + } else if (ifaces < nfaces) { + // Get next face + f = &facetlist[ifaces]; + init(f); + // In .off format, each facet has one polygon, no hole. + f->numberofpolygons = 1; + f->polygonlist = new tetgenio::polygon[1]; + p = &f->polygonlist[0]; + init(p); + // Read the number of vertices, it should be greater than 0. + p->numberofvertices = (int) strtol(bufferp, &bufferp, 0); + if (p->numberofvertices == 0) { + printf("Syntax error reading polygon on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + // Allocate memory for face vertices + p->vertexlist = new int[p->numberofvertices]; + for (i = 0; i < p->numberofvertices; i++) { + bufferp = findnextnumber(bufferp); + if (*bufferp == '\0') { + printf("Syntax error reading polygon on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + p->vertexlist[i] = (int) strtol(bufferp, &bufferp, 0); + if (p->vertexlist[i] < smallestidx) { + smallestidx = p->vertexlist[i]; + } + } + ifaces++; + } else { + // Should never get here + printf("Found extra text starting at line %d in file %s\n", line_count, + infilename); + break; + } + } + + // Close file + fclose(fp); + + // Decide the firstnumber of the index. + if (smallestidx == 0) { + firstnumber = 0; + } else if (smallestidx == 1) { + firstnumber = 1; + } else { + printf("A wrong smallest index (%d) was detected in file %s\n", + smallestidx, infilename); + return false; + } + + if (iverts != nverts) { + printf("Expected %d vertices, but read only %d vertices in file %s\n", + nverts, iverts, infilename); + return false; + } + if (ifaces != nfaces) { + printf("Expected %d faces, but read only %d faces in file %s\n", + nfaces, ifaces, infilename); + return false; + } + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_stl() Load a surface mesh from a .stl file. // +// // +// The .stl or stereolithography format is an ASCII or binary file used in // +// manufacturing. It is a list of the triangular surfaces that describe a // +// computer generated solid model. This is the standard input for most rapid // +// prototyping machines. // +// // +// Comment: A .stl file many contain many duplicated points. They will be // +// unified during the Delaunay tetrahedralization process. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void SwapBytes(char *array, int size, int n) +{ + char *x = new char[size]; + for(int i = 0; i < n; i++) { + char *a = &array[i * size]; + memcpy(x, a, size); + for(int c = 0; c < size; c++) + a[size - 1 - c] = x[c]; + } + delete [] x; +} + +bool tetgenio::load_stl(char* filebasename) +{ + FILE *fp; + tetgenmesh::arraypool *plist; + tetgenio::facet *f; + tetgenio::polygon *p; + char infilename[FILENAMESIZE]; + char buffer[INPUTLINESIZE]; + char *bufferp, *str; + double *coord; + int solid = 0; + int nverts = 0, iverts = 0; + int nfaces = 0; + int line_count = 0, i; + + strncpy(infilename, filebasename, FILENAMESIZE - 1); + infilename[FILENAMESIZE - 1] = '\0'; + if (infilename[0] == '\0') { + printf("Error: No filename.\n"); + return false; + } + if (strcmp(&infilename[strlen(infilename) - 4], ".stl") != 0) { + strcat(infilename, ".stl"); + } + + if (!(fp = fopen(infilename, "rb"))) { + printf("Error: Unable to open file %s\n", infilename); + return false; + } + printf("Opening %s.\n", infilename); + + // "solid", or binary data header + if(!fgets(buffer, sizeof(buffer), fp)){ fclose(fp); return 0; } + bool binary = strncmp(buffer, "solid", 5) && strncmp(buffer, "SOLID", 5); + + // STL file has no number of points available. Use a list to read points. + plist = new tetgenmesh::arraypool(sizeof(double) * 3, 10); + + if(!binary){ + solid = 1; + while ((bufferp = readline(buffer, fp, &line_count)) != NULL) { + // The ASCII .stl file must start with the lower case keyword solid and + // end with endsolid. + if (solid == 0) { + // Read header + bufferp = strstr(bufferp, "solid"); + if (bufferp != NULL) { + solid = 1; + } + } else { + // We're inside the block of the solid. + str = bufferp; + // Is this the end of the solid. + bufferp = strstr(bufferp, "endsolid"); + if (bufferp != NULL) { + solid = 0; + } else { + // Read the XYZ coordinates if it is a vertex. + bufferp = str; + bufferp = strstr(bufferp, "vertex"); + if (bufferp != NULL) { + plist->newindex((void **) &coord); + for (i = 0; i < 3; i++) { + bufferp = findnextnumber(bufferp); + if (*bufferp == '\0') { + printf("Syntax error reading vertex coords on line %d\n", + line_count); + delete plist; + fclose(fp); + return false; + } + coord[i] = (REAL) strtod(bufferp, &bufferp); + } + } + } + } + } + } // if(!binary) + + else { + rewind(fp); + while(!feof(fp)) { + char header[80]; + if(!fread(header, sizeof(char), 80, fp)) break; + unsigned int nfacets = 0; + size_t ret = fread(&nfacets, sizeof(unsigned int), 1, fp); + bool swap = false; + if(nfacets > 100000000){ + //Msg::Info("Swapping bytes from binary file"); + swap = true; + SwapBytes((char*)&nfacets, sizeof(unsigned int), 1); + } + if(ret && nfacets){ + //points.resize(points.size() + 1); + char *data = new char[nfacets * 50 * sizeof(char)]; + ret = fread(data, sizeof(char), nfacets * 50, fp); + if(ret == nfacets * 50){ + for(unsigned int i = 0; i < nfacets; i++) { + float *xyz = (float *)&data[i * 50 * sizeof(char)]; + if(swap) SwapBytes((char*)xyz, sizeof(float), 12); + for(int j = 0; j < 3; j++){ + //SPoint3 p(xyz[3 + 3 * j], xyz[3 + 3 * j + 1], xyz[3 + 3 * j + 2]); + //points.back().push_back(p); + //bbox += p; + plist->newindex((void **) &coord); + coord[0] = xyz[3 + 3 * j]; + coord[1] = xyz[3 + 3 * j + 1]; + coord[2] = xyz[3 + 3 * j + 2]; + } + } + } + delete [] data; + } + } // while (!feof(fp)) + } // binary + + fclose(fp); + + nverts = (int) plist->objects; + // nverts should be an integer times 3 (every 3 vertices denote a face). + if (nverts == 0 || (nverts % 3 != 0)) { + printf("Error: Wrong number of vertices in file %s.\n", infilename); + delete plist; + return false; + } + numberofpoints = nverts; + pointlist = new REAL[nverts * 3]; + for (i = 0; i < nverts; i++) { + coord = (double *) fastlookup(plist, i); + iverts = i * 3; + pointlist[iverts] = (REAL) coord[0]; + pointlist[iverts + 1] = (REAL) coord[1]; + pointlist[iverts + 2] = (REAL) coord[2]; + } + + nfaces = (int) (nverts / 3); + numberoffacets = nfaces; + facetlist = new tetgenio::facet[nfaces]; + + // Default use '1' as the array starting index. + firstnumber = 1; + iverts = firstnumber; + for (i = 0; i < nfaces; i++) { + f = &facetlist[i]; + init(f); + // In .stl format, each facet has one polygon, no hole. + f->numberofpolygons = 1; + f->polygonlist = new tetgenio::polygon[1]; + p = &f->polygonlist[0]; + init(p); + // Each polygon has three vertices. + p->numberofvertices = 3; + p->vertexlist = new int[p->numberofvertices]; + p->vertexlist[0] = iverts; + p->vertexlist[1] = iverts + 1; + p->vertexlist[2] = iverts + 2; + iverts += 3; + } + + delete plist; + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_medit() Load a surface mesh from a .mesh file. // +// // +// The .mesh format is the file format of Medit, a user-friendly interactive // +// mesh viewer program. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_medit(char* filebasename, int istetmesh) +{ + FILE *fp; + tetgenio::facet *tmpflist, *f; + tetgenio::polygon *p; + char infilename[FILENAMESIZE]; + char buffer[INPUTLINESIZE]; + char *bufferp, *str; + double *coord; + int *tmpfmlist; + int dimension = 0; + int nverts = 0; + int nfaces = 0; + int ntets = 0; + int line_count = 0; + int corners = 0; // 3 (triangle) or 4 (quad). + int *plist; + int i, j; + + int smallestidx = 0; + + strncpy(infilename, filebasename, FILENAMESIZE - 1); + infilename[FILENAMESIZE - 1] = '\0'; + if (infilename[0] == '\0') { + printf("Error: No filename.\n"); + return false; + } + if (strcmp(&infilename[strlen(infilename) - 5], ".mesh") != 0) { + strcat(infilename, ".mesh"); + } + + if (!(fp = fopen(infilename, "r"))) { + printf("Error: Unable to open file %s\n", infilename); + return false; + } + printf("Opening %s.\n", infilename); + + while ((bufferp = readline(buffer, fp, &line_count)) != NULL) { + if (*bufferp == '#') continue; // A comment line is skipped. + if (dimension == 0) { + // Find if it is the keyword "Dimension". + str = strstr(bufferp, "Dimension"); + if (!str) str = strstr(bufferp, "dimension"); + if (!str) str = strstr(bufferp, "DIMENSION"); + if (str) { + // Read the dimensions + bufferp = findnextnumber(str); // Skip field "Dimension". + if (*bufferp == '\0') { + // Read a non-empty line. + bufferp = readline(buffer, fp, &line_count); + } + dimension = (int) strtol(bufferp, &bufferp, 0); + if (dimension != 2 && dimension != 3) { + printf("Unknown dimension in file on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + mesh_dim = dimension; + } + } + if (nverts == 0) { + // Find if it is the keyword "Vertices". + str = strstr(bufferp, "Vertices"); + if (!str) str = strstr(bufferp, "vertices"); + if (!str) str = strstr(bufferp, "VERTICES"); + if (str) { + // Read the number of vertices. + bufferp = findnextnumber(str); // Skip field "Vertices". + if (*bufferp == '\0') { + // Read a non-empty line. + bufferp = readline(buffer, fp, &line_count); + } + nverts = (int) strtol(bufferp, &bufferp, 0); + // Initialize the smallest index. + smallestidx = nverts + 1; + // Allocate memory for 'tetgenio' + if (nverts > 0) { + numberofpoints = nverts; + pointlist = new REAL[nverts * 3]; + } + // Read the follwoing node list. + for (i = 0; i < nverts; i++) { + bufferp = readline(buffer, fp, &line_count); + if (bufferp == NULL) { + printf("Unexpected end of file on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + // Read vertex coordinates + coord = &pointlist[i * 3]; + for (j = 0; j < 3; j++) { + if (*bufferp == '\0') { + printf("Syntax error reading vertex coords on line"); + printf(" %d in file %s\n", line_count, infilename); + fclose(fp); + return false; + } + if ((j < 2) || (dimension == 3)) { + coord[j] = (REAL) strtod(bufferp, &bufferp); + } else { + coord[j] = 0.0; + } + bufferp = findnextnumber(bufferp); + } + } + continue; + } + } + if (ntets == 0) { + // Find if it is the keyword "Tetrahedra" + corners = 0; + str = strstr(bufferp, "Tetrahedra"); + if (!str) str = strstr(bufferp, "tetrahedra"); + if (!str) str = strstr(bufferp, "TETRAHEDRA"); + if (str) { + corners = 4; + } + if (corners == 4) { + // Read the number of tetrahedra + bufferp = findnextnumber(str); // Skip field "Tetrahedra". + if (*bufferp == '\0') { + // Read a non-empty line. + bufferp = readline(buffer, fp, &line_count); + } + ntets = strtol(bufferp, &bufferp, 0); + if (ntets > 0) { + // It is a tetrahedral mesh. + numberoftetrahedra = ntets; + numberofcorners = 4; + numberoftetrahedronattributes = 1; + tetrahedronlist = new int[ntets * 4]; + tetrahedronattributelist = new REAL[ntets]; + } + } // if (corners == 4) + // Read the list of tetrahedra. + for (i = 0; i < numberoftetrahedra; i++) { + plist = &(tetrahedronlist[i * 4]); + bufferp = readline(buffer, fp, &line_count); + if (bufferp == NULL) { + printf("Unexpected end of file on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + // Read the vertices of the tet. + for (j = 0; j < corners; j++) { + if (*bufferp == '\0') { + printf("Syntax error reading face on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + plist[j] = (int) strtol(bufferp, &bufferp, 0); + // Remember the smallest index. + if (plist[j] < smallestidx) smallestidx = plist[j]; + bufferp = findnextnumber(bufferp); + } + // Read the attribute of the tet if it exists. + tetrahedronattributelist[i] = 0; + if (*bufferp != '\0') { + tetrahedronattributelist[i] = (REAL) strtol(bufferp, &bufferp, 0); + } + } // i + } // Tetrahedra + if (nfaces == 0) { + // Find if it is the keyword "Triangles" or "Quadrilaterals". + corners = 0; + str = strstr(bufferp, "Triangles"); + if (!str) str = strstr(bufferp, "triangles"); + if (!str) str = strstr(bufferp, "TRIANGLES"); + if (str) { + corners = 3; + } else { + str = strstr(bufferp, "Quadrilaterals"); + if (!str) str = strstr(bufferp, "quadrilaterals"); + if (!str) str = strstr(bufferp, "QUADRILATERALS"); + if (str) { + corners = 4; + } + } + if (corners == 3 || corners == 4) { + // Read the number of triangles (or quadrilaterals). + bufferp = findnextnumber(str); // Skip field "Triangles". + if (*bufferp == '\0') { + // Read a non-empty line. + bufferp = readline(buffer, fp, &line_count); + } + nfaces = strtol(bufferp, &bufferp, 0); + // Allocate memory for 'tetgenio' + if (nfaces > 0) { + if (!istetmesh) { + // It is a PLC surface mesh. + if (numberoffacets > 0) { + // facetlist has already been allocated. Enlarge arrays. + // This happens when the surface mesh contains mixed cells. + tmpflist = new tetgenio::facet[numberoffacets + nfaces]; + tmpfmlist = new int[numberoffacets + nfaces]; + // Copy the data of old arrays into new arrays. + for (i = 0; i < numberoffacets; i++) { + f = &(tmpflist[i]); + tetgenio::init(f); + *f = facetlist[i]; + tmpfmlist[i] = facetmarkerlist[i]; + } + // Release old arrays. + delete [] facetlist; + delete [] facetmarkerlist; + // Remember the new arrays. + facetlist = tmpflist; + facetmarkerlist = tmpfmlist; + } else { + // This is the first time to allocate facetlist. + facetlist = new tetgenio::facet[nfaces]; + facetmarkerlist = new int[nfaces]; + } + } else { + if (corners == 3) { + // It is a surface mesh of a tetrahedral mesh. + numberoftrifaces = nfaces; + trifacelist = new int[nfaces * 3]; + trifacemarkerlist = new int[nfaces]; + } + } + } // if (nfaces > 0) + // Read the following list of faces. + if (!istetmesh) { + for (i = numberoffacets; i < numberoffacets + nfaces; i++) { + bufferp = readline(buffer, fp, &line_count); + if (bufferp == NULL) { + printf("Unexpected end of file on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + f = &facetlist[i]; + tetgenio::init(f); + // In .mesh format, each facet has one polygon, no hole. + f->numberofpolygons = 1; + f->polygonlist = new tetgenio::polygon[1]; + p = &f->polygonlist[0]; + tetgenio::init(p); + p->numberofvertices = corners; + // Allocate memory for face vertices + p->vertexlist = new int[p->numberofvertices]; + // Read the vertices of the face. + for (j = 0; j < corners; j++) { + if (*bufferp == '\0') { + printf("Syntax error reading face on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + p->vertexlist[j] = (int) strtol(bufferp, &bufferp, 0); + // Remember the smallest index. + if (p->vertexlist[j] < smallestidx) { + smallestidx = p->vertexlist[j]; + } + bufferp = findnextnumber(bufferp); + } + // Read the marker of the face if it exists. + facetmarkerlist[i] = 0; + if (*bufferp != '\0') { + facetmarkerlist[i] = (int) strtol(bufferp, &bufferp, 0); + } + } + // Have read in a list of triangles/quads. + numberoffacets += nfaces; + nfaces = 0; + } else { + // It is a surface mesh of a tetrahedral mesh. + if (corners == 3) { + for (i = 0; i < numberoftrifaces; i++) { + plist = &(trifacelist[i * 3]); + bufferp = readline(buffer, fp, &line_count); + if (bufferp == NULL) { + printf("Unexpected end of file on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + // Read the vertices of the face. + for (j = 0; j < corners; j++) { + if (*bufferp == '\0') { + printf("Syntax error reading face on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + plist[j] = (int) strtol(bufferp, &bufferp, 0); + // Remember the smallest index. + if (plist[j] < smallestidx) { + smallestidx = plist[j]; + } + bufferp = findnextnumber(bufferp); + } + // Read the marker of the face if it exists. + trifacemarkerlist[i] = 0; + if (*bufferp != '\0') { + trifacemarkerlist[i] = (int) strtol(bufferp, &bufferp, 0); + } + } // i + } // if (corners == 3) + } // if (b->refine) + } // if (corners == 3 || corners == 4) + } + } + + // Close file + fclose(fp); + + // Decide the firstnumber of the index. + if (smallestidx == 0) { + firstnumber = 0; + } else if (smallestidx == 1) { + firstnumber = 1; + } else { + printf("A wrong smallest index (%d) was detected in file %s\n", + smallestidx, infilename); + return false; + } + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_vtk() Load VTK surface mesh from file (.vtk ascii or binary). // +// // +// This function is contributed by: Bryn Lloyd, Computer Vision Laboratory, // +// ETH, Zuerich. May 7, 2007. // +// // +/////////////////////////////////////////////////////////////////////////////// + +// Two inline functions used in read/write VTK files. + +void swapBytes(unsigned char* var, int size) +{ + int i = 0; + int j = size - 1; + char c; + + while (i < j) { + c = var[i]; var[i] = var[j]; var[j] = c; + i++, j--; + } +} + +bool testIsBigEndian() +{ + short word = 0x4321; + if((*(char *)& word) != 0x21) + return true; + else + return false; +} + +bool tetgenio::load_vtk(char* filebasename) +{ + FILE *fp; + tetgenio::facet *f; + tetgenio::polygon *p; + char infilename[FILENAMESIZE]; + char line[INPUTLINESIZE]; + char mode[128], id[256], fmt[64]; + char *bufferp; + double *coord; + float _x, _y, _z; + int nverts = 0; + int nfaces = 0; + int line_count = 0; + int dummy; + int id1, id2, id3; + int nn = -1; + int nn_old = -1; + int i, j; + bool ImALittleEndian = !testIsBigEndian(); + + int smallestidx = 0; + + strncpy(infilename, filebasename, FILENAMESIZE - 1); + infilename[FILENAMESIZE - 1] = '\0'; + if (infilename[0] == '\0') { + printf("Error: No filename.\n"); + return false; + } + if (strcmp(&infilename[strlen(infilename) - 4], ".vtk") != 0) { + strcat(infilename, ".vtk"); + } + if (!(fp = fopen(infilename, "r"))) { + printf("Error: Unable to open file %s\n", infilename); + return false; + } + printf("Opening %s.\n", infilename); + + // Default uses the index starts from '0'. + firstnumber = 0; + strcpy(mode, "BINARY"); + + while((bufferp = readline(line, fp, &line_count)) != NULL) { + if(strlen(line) == 0) continue; + //swallow lines beginning with a comment sign or white space + if(line[0] == '#' || line[0]=='\n' || line[0] == 10 || line[0] == 13 || + line[0] == 32) continue; + + sscanf(line, "%s", id); + if(!strcmp(id, "ASCII")) { + strcpy(mode, "ASCII"); + } + + if(!strcmp(id, "POINTS")) { + sscanf(line, "%s %d %s", id, &nverts, fmt); + if (nverts > 0) { + numberofpoints = nverts; + pointlist = new REAL[nverts * 3]; + smallestidx = nverts + 1; + } + + if(!strcmp(mode, "BINARY")) { + for(i = 0; i < nverts; i++) { + coord = &pointlist[i * 3]; + if(!strcmp(fmt, "double")) { + fread((char*)(&(coord[0])), sizeof(double), 1, fp); + fread((char*)(&(coord[1])), sizeof(double), 1, fp); + fread((char*)(&(coord[2])), sizeof(double), 1, fp); + if(ImALittleEndian){ + swapBytes((unsigned char *) &(coord[0]), sizeof(coord[0])); + swapBytes((unsigned char *) &(coord[1]), sizeof(coord[1])); + swapBytes((unsigned char *) &(coord[2]), sizeof(coord[2])); + } + } else if(!strcmp(fmt, "float")) { + fread((char*)(&_x), sizeof(float), 1, fp); + fread((char*)(&_y), sizeof(float), 1, fp); + fread((char*)(&_z), sizeof(float), 1, fp); + if(ImALittleEndian){ + swapBytes((unsigned char *) &_x, sizeof(_x)); + swapBytes((unsigned char *) &_y, sizeof(_y)); + swapBytes((unsigned char *) &_z, sizeof(_z)); + } + coord[0] = double(_x); + coord[1] = double(_y); + coord[2] = double(_z); + } else { + printf("Error: Only float or double formats are supported!\n"); + return false; + } + } + } else if(!strcmp(mode, "ASCII")) { + for(i = 0; i < nverts; i++){ + bufferp = readline(line, fp, &line_count); + if (bufferp == NULL) { + printf("Unexpected end of file on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + // Read vertex coordinates + coord = &pointlist[i * 3]; + for (j = 0; j < 3; j++) { + if (*bufferp == '\0') { + printf("Syntax error reading vertex coords on line"); + printf(" %d in file %s\n", line_count, infilename); + fclose(fp); + return false; + } + coord[j] = (REAL) strtod(bufferp, &bufferp); + bufferp = findnextnumber(bufferp); + } + } + } + continue; + } + + if(!strcmp(id, "POLYGONS")) { + sscanf(line, "%s %d %d", id, &nfaces, &dummy); + if (nfaces > 0) { + numberoffacets = nfaces; + facetlist = new tetgenio::facet[nfaces]; + } + + if(!strcmp(mode, "BINARY")) { + for(i = 0; i < nfaces; i++){ + fread((char*)(&nn), sizeof(int), 1, fp); + if(ImALittleEndian){ + swapBytes((unsigned char *) &nn, sizeof(nn)); + } + if (i == 0) + nn_old = nn; + if (nn != nn_old) { + printf("Error: No mixed cells are allowed.\n"); + return false; + } + + if(nn == 3){ + fread((char*)(&id1), sizeof(int), 1, fp); + fread((char*)(&id2), sizeof(int), 1, fp); + fread((char*)(&id3), sizeof(int), 1, fp); + if(ImALittleEndian){ + swapBytes((unsigned char *) &id1, sizeof(id1)); + swapBytes((unsigned char *) &id2, sizeof(id2)); + swapBytes((unsigned char *) &id3, sizeof(id3)); + } + f = &facetlist[i]; + init(f); + // In .off format, each facet has one polygon, no hole. + f->numberofpolygons = 1; + f->polygonlist = new tetgenio::polygon[1]; + p = &f->polygonlist[0]; + init(p); + // Set number of vertices + p->numberofvertices = 3; + // Allocate memory for face vertices + p->vertexlist = new int[p->numberofvertices]; + p->vertexlist[0] = id1; + p->vertexlist[1] = id2; + p->vertexlist[2] = id3; + // Detect the smallest index. + for (j = 0; j < 3; j++) { + if (p->vertexlist[j] < smallestidx) { + smallestidx = p->vertexlist[j]; + } + } + } else { + printf("Error: Only triangles are supported\n"); + return false; + } + } + } else if(!strcmp(mode, "ASCII")) { + for(i = 0; i < nfaces; i++) { + bufferp = readline(line, fp, &line_count); + nn = (int) strtol(bufferp, &bufferp, 0); + if (i == 0) + nn_old = nn; + if (nn != nn_old) { + printf("Error: No mixed cells are allowed.\n"); + return false; + } + + if (nn == 3) { + bufferp = findnextnumber(bufferp); // Skip the first field. + id1 = (int) strtol(bufferp, &bufferp, 0); + bufferp = findnextnumber(bufferp); + id2 = (int) strtol(bufferp, &bufferp, 0); + bufferp = findnextnumber(bufferp); + id3 = (int) strtol(bufferp, &bufferp, 0); + f = &facetlist[i]; + init(f); + // In .off format, each facet has one polygon, no hole. + f->numberofpolygons = 1; + f->polygonlist = new tetgenio::polygon[1]; + p = &f->polygonlist[0]; + init(p); + // Set number of vertices + p->numberofvertices = 3; + // Allocate memory for face vertices + p->vertexlist = new int[p->numberofvertices]; + p->vertexlist[0] = id1; + p->vertexlist[1] = id2; + p->vertexlist[2] = id3; + // Detect the smallest index. + for (j = 0; j < 3; j++) { + if (p->vertexlist[j] < smallestidx) { + smallestidx = p->vertexlist[j]; + } + } + } else { + printf("Error: Only triangles are supported.\n"); + return false; + } + } + } + + fclose(fp); + + // Decide the firstnumber of the index. + if (smallestidx == 0) { + firstnumber = 0; + } else if (smallestidx == 1) { + firstnumber = 1; + } else { + printf("A wrong smallest index (%d) was detected in file %s\n", + smallestidx, infilename); + return false; + } + + return true; + } + + if(!strcmp(id,"LINES") || !strcmp(id,"CELLS")){ + printf("Warning: load_vtk(): cannot read formats LINES, CELLS.\n"); + } + } // while () + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_plc() Load a piecewise linear complex from file(s). // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_plc(char* filebasename, int object) +{ + bool success; + + if (object == (int) tetgenbehavior::NODES) { + success = load_node(filebasename); + } else if (object == (int) tetgenbehavior::POLY) { + success = load_poly(filebasename); + } else if (object == (int) tetgenbehavior::OFF) { + success = load_off(filebasename); + } else if (object == (int) tetgenbehavior::PLY) { + success = load_ply(filebasename); + } else if (object == (int) tetgenbehavior::STL) { + success = load_stl(filebasename); + } else if (object == (int) tetgenbehavior::MEDIT) { + success = load_medit(filebasename, 0); + } else if (object == (int) tetgenbehavior::VTK) { + success = load_vtk(filebasename); + } else { + success = load_poly(filebasename); + } + + if (success) { + // Try to load the following files (.edge, .var, .mtr). + load_edge(filebasename); + load_var(filebasename); + load_mtr(filebasename); + } + + return success; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_mesh() Load a tetrahedral mesh from file(s). // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_tetmesh(char* filebasename, int object) +{ + bool success; + + if (object == (int) tetgenbehavior::MEDIT) { + success = load_medit(filebasename, 1); + } else if (object == (int) tetgenbehavior::NEU_MESH) { + //success = load_neumesh(filebasename, 1); + } else { + success = load_node(filebasename); + if (success) { + success = load_tet(filebasename); + } + if (success) { + // Try to load the following files (.face, .edge, .vol). + load_face(filebasename); + load_edge(filebasename); + load_vol(filebasename); + } + } + + //if (success) { + // Try to load the following files (.var, .mtr). + load_var(filebasename); + load_mtr(filebasename); + //} + + return success; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// save_nodes() Save points to a .node file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenio::save_nodes(char* filebasename) +{ + FILE *fout; + char outnodefilename[FILENAMESIZE]; + char outmtrfilename[FILENAMESIZE]; + int i, j; + + sprintf(outnodefilename, "%s.node", filebasename); + printf("Saving nodes to %s\n", outnodefilename); + fout = fopen(outnodefilename, "w"); + fprintf(fout, "%d %d %d %d\n", numberofpoints, mesh_dim, + numberofpointattributes, pointmarkerlist != NULL ? 1 : 0); + for (i = 0; i < numberofpoints; i++) { + if (mesh_dim == 2) { + fprintf(fout, "%d %.16g %.16g", i + firstnumber, pointlist[i * 3], + pointlist[i * 3 + 1]); + } else { + fprintf(fout, "%d %.16g %.16g %.16g", i + firstnumber, + pointlist[i * 3], pointlist[i * 3 + 1], pointlist[i * 3 + 2]); + } + for (j = 0; j < numberofpointattributes; j++) { + fprintf(fout, " %.16g", + pointattributelist[i * numberofpointattributes + j]); + } + if (pointmarkerlist != NULL) { + fprintf(fout, " %d", pointmarkerlist[i]); + } + fprintf(fout, "\n"); + } + fclose(fout); + + // If the point metrics exist, output them to a .mtr file. + if ((numberofpointmtrs > 0) && (pointmtrlist != (REAL *) NULL)) { + sprintf(outmtrfilename, "%s.mtr", filebasename); + printf("Saving metrics to %s\n", outmtrfilename); + fout = fopen(outmtrfilename, "w"); + fprintf(fout, "%d %d\n", numberofpoints, numberofpointmtrs); + for (i = 0; i < numberofpoints; i++) { + for (j = 0; j < numberofpointmtrs; j++) { + fprintf(fout, "%.16g ", pointmtrlist[i * numberofpointmtrs + j]); + } + fprintf(fout, "\n"); + } + fclose(fout); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// save_elements() Save elements to a .ele file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenio::save_elements(char* filebasename) +{ + FILE *fout; + char outelefilename[FILENAMESIZE]; + int i, j; + + sprintf(outelefilename, "%s.ele", filebasename); + printf("Saving elements to %s\n", outelefilename); + fout = fopen(outelefilename, "w"); + if (mesh_dim == 3) { + fprintf(fout, "%d %d %d\n", numberoftetrahedra, numberofcorners, + numberoftetrahedronattributes); + for (i = 0; i < numberoftetrahedra; i++) { + fprintf(fout, "%d", i + firstnumber); + for (j = 0; j < numberofcorners; j++) { + fprintf(fout, " %5d", tetrahedronlist[i * numberofcorners + j]); + } + for (j = 0; j < numberoftetrahedronattributes; j++) { + fprintf(fout, " %g", + tetrahedronattributelist[i * numberoftetrahedronattributes + j]); + } + fprintf(fout, "\n"); + } + } else { + // Save a two-dimensional mesh. + fprintf(fout, "%d %d %d\n",numberoftrifaces,3,trifacemarkerlist ? 1 : 0); + for (i = 0; i < numberoftrifaces; i++) { + fprintf(fout, "%d", i + firstnumber); + for (j = 0; j < 3; j++) { + fprintf(fout, " %5d", trifacelist[i * 3 + j]); + } + if (trifacemarkerlist != NULL) { + fprintf(fout, " %d", trifacemarkerlist[i]); + } + fprintf(fout, "\n"); + } + } + + fclose(fout); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// save_faces() Save faces to a .face file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenio::save_faces(char* filebasename) +{ + FILE *fout; + char outfacefilename[FILENAMESIZE]; + int i; + + sprintf(outfacefilename, "%s.face", filebasename); + printf("Saving faces to %s\n", outfacefilename); + fout = fopen(outfacefilename, "w"); + fprintf(fout, "%d %d\n", numberoftrifaces, + trifacemarkerlist != NULL ? 1 : 0); + for (i = 0; i < numberoftrifaces; i++) { + fprintf(fout, "%d %5d %5d %5d", i + firstnumber, trifacelist[i * 3], + trifacelist[i * 3 + 1], trifacelist[i * 3 + 2]); + if (trifacemarkerlist != NULL) { + fprintf(fout, " %d", trifacemarkerlist[i]); + } + fprintf(fout, "\n"); + } + + fclose(fout); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// save_edges() Save egdes to a .edge file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenio::save_edges(char* filebasename) +{ + FILE *fout; + char outedgefilename[FILENAMESIZE]; + int i; + + sprintf(outedgefilename, "%s.edge", filebasename); + printf("Saving edges to %s\n", outedgefilename); + fout = fopen(outedgefilename, "w"); + fprintf(fout, "%d %d\n", numberofedges, edgemarkerlist != NULL ? 1 : 0); + for (i = 0; i < numberofedges; i++) { + fprintf(fout, "%d %4d %4d", i + firstnumber, edgelist[i * 2], + edgelist[i * 2 + 1]); + if (edgemarkerlist != NULL) { + fprintf(fout, " %d", edgemarkerlist[i]); + } + fprintf(fout, "\n"); + } + + fclose(fout); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// save_neighbors() Save egdes to a .neigh file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenio::save_neighbors(char* filebasename) +{ + FILE *fout; + char outneighborfilename[FILENAMESIZE]; + int i; + + sprintf(outneighborfilename, "%s.neigh", filebasename); + printf("Saving neighbors to %s\n", outneighborfilename); + fout = fopen(outneighborfilename, "w"); + fprintf(fout, "%d %d\n", numberoftetrahedra, mesh_dim + 1); + for (i = 0; i < numberoftetrahedra; i++) { + if (mesh_dim == 2) { + fprintf(fout, "%d %5d %5d %5d", i + firstnumber, neighborlist[i * 3], + neighborlist[i * 3 + 1], neighborlist[i * 3 + 2]); + } else { + fprintf(fout, "%d %5d %5d %5d %5d", i + firstnumber, + neighborlist[i * 4], neighborlist[i * 4 + 1], + neighborlist[i * 4 + 2], neighborlist[i * 4 + 3]); + } + fprintf(fout, "\n"); + } + + fclose(fout); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// save_poly() Save segments or facets to a .poly file. // +// // +// It only save the facets, holes and regions. No .node file is saved. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenio::save_poly(char* filebasename) +{ + FILE *fout; + facet *f; + polygon *p; + char outpolyfilename[FILENAMESIZE]; + int i, j, k; + + sprintf(outpolyfilename, "%s.poly", filebasename); + printf("Saving poly to %s\n", outpolyfilename); + fout = fopen(outpolyfilename, "w"); + + // The zero indicates that the vertices are in a separate .node file. + // Followed by number of dimensions, number of vertex attributes, + // and number of boundary markers (zero or one). + fprintf(fout, "%d %d %d %d\n", 0, mesh_dim, numberofpointattributes, + pointmarkerlist != NULL ? 1 : 0); + + // Save segments or facets. + if (mesh_dim == 2) { + // Number of segments, number of boundary markers (zero or one). + fprintf(fout, "%d %d\n", numberofedges, edgemarkerlist != NULL ? 1 : 0); + for (i = 0; i < numberofedges; i++) { + fprintf(fout, "%d %4d %4d", i + firstnumber, edgelist[i * 2], + edgelist[i * 2 + 1]); + if (edgemarkerlist != NULL) { + fprintf(fout, " %d", edgemarkerlist[i]); + } + fprintf(fout, "\n"); + } + } else { + // Number of facets, number of boundary markers (zero or one). + fprintf(fout, "%d %d\n", numberoffacets, facetmarkerlist != NULL ? 1 : 0); + for (i = 0; i < numberoffacets; i++) { + f = &(facetlist[i]); + fprintf(fout, "%d %d %d # %d\n", f->numberofpolygons,f->numberofholes, + facetmarkerlist != NULL ? facetmarkerlist[i] : 0, i + firstnumber); + // Output polygons of this facet. + for (j = 0; j < f->numberofpolygons; j++) { + p = &(f->polygonlist[j]); + fprintf(fout, "%d ", p->numberofvertices); + for (k = 0; k < p->numberofvertices; k++) { + if (((k + 1) % 10) == 0) { + fprintf(fout, "\n "); + } + fprintf(fout, " %d", p->vertexlist[k]); + } + fprintf(fout, "\n"); + } + // Output holes of this facet. + for (j = 0; j < f->numberofholes; j++) { + fprintf(fout, "%d %.12g %.12g %.12g\n", j + firstnumber, + f->holelist[j * 3], f->holelist[j * 3 + 1], f->holelist[j * 3 + 2]); + } + } + } + + // Save holes. + fprintf(fout, "%d\n", numberofholes); + for (i = 0; i < numberofholes; i++) { + // Output x, y coordinates. + fprintf(fout, "%d %.12g %.12g", i + firstnumber, holelist[i * mesh_dim], + holelist[i * mesh_dim + 1]); + if (mesh_dim == 3) { + // Output z coordinate. + fprintf(fout, " %.12g", holelist[i * mesh_dim + 2]); + } + fprintf(fout, "\n"); + } + + // Save regions. + fprintf(fout, "%d\n", numberofregions); + for (i = 0; i < numberofregions; i++) { + if (mesh_dim == 2) { + // Output the index, x, y coordinates, attribute (region number) + // and maximum area constraint (maybe -1). + fprintf(fout, "%d %.12g %.12g %.12g %.12g\n", i + firstnumber, + regionlist[i * 4], regionlist[i * 4 + 1], + regionlist[i * 4 + 2], regionlist[i * 4 + 3]); + } else { + // Output the index, x, y, z coordinates, attribute (region number) + // and maximum volume constraint (maybe -1). + fprintf(fout, "%d %.12g %.12g %.12g %.12g %.12g\n", i + firstnumber, + regionlist[i * 5], regionlist[i * 5 + 1], + regionlist[i * 5 + 2], regionlist[i * 5 + 3], + regionlist[i * 5 + 4]); + } + } + + fclose(fout); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// save_faces2smesh() Save triangular faces to a .smesh file. // +// // +// It only save the facets. No holes and regions. No .node file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenio::save_faces2smesh(char* filebasename) +{ + FILE *fout; + char outsmeshfilename[FILENAMESIZE]; + int i, j; + + sprintf(outsmeshfilename, "%s.smesh", filebasename); + printf("Saving faces to %s\n", outsmeshfilename); + fout = fopen(outsmeshfilename, "w"); + + // The zero indicates that the vertices are in a separate .node file. + // Followed by number of dimensions, number of vertex attributes, + // and number of boundary markers (zero or one). + fprintf(fout, "%d %d %d %d\n", 0, mesh_dim, numberofpointattributes, + pointmarkerlist != NULL ? 1 : 0); + + // Number of facets, number of boundary markers (zero or one). + fprintf(fout, "%d %d\n", numberoftrifaces, + trifacemarkerlist != NULL ? 1 : 0); + + // Output triangular facets. + for (i = 0; i < numberoftrifaces; i++) { + j = i * 3; + fprintf(fout, "3 %d %d %d", trifacelist[j], trifacelist[j + 1], + trifacelist[j + 2]); + if (trifacemarkerlist != NULL) { + fprintf(fout, " %d", trifacemarkerlist[i]); + } + fprintf(fout, "\n"); + } + + // No holes and regions. + fprintf(fout, "0\n"); + fprintf(fout, "0\n"); + + fclose(fout); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// readline() Read a nonempty line from a file. // +// // +// A line is considered "nonempty" if it contains something more than white // +// spaces. If a line is considered empty, it will be dropped and the next // +// line will be read, this process ends until reaching the end-of-file or a // +// non-empty line. Return NULL if it is the end-of-file, otherwise, return // +// a pointer to the first non-whitespace character of the line. // +// // +/////////////////////////////////////////////////////////////////////////////// + +char* tetgenio::readline(char *string, FILE *infile, int *linenumber) +{ + char *result; + + // Search for a non-empty line. + do { + result = fgets(string, INPUTLINESIZE - 1, infile); + if (linenumber) (*linenumber)++; + if (result == (char *) NULL) { + return (char *) NULL; + } + // Skip white spaces. + while ((*result == ' ') || (*result == '\t')) result++; + // If it's end of line, read another line and try again. + } while ((*result == '\0') || (*result == '\r') || (*result == '\n')); + return result; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// findnextfield() Find the next field of a string. // +// // +// Jumps past the current field by searching for whitespace or a comma, then // +// jumps past the whitespace or the comma to find the next field. // +// // +/////////////////////////////////////////////////////////////////////////////// + +char* tetgenio::findnextfield(char *string) +{ + char *result; + + result = string; + // Skip the current field. Stop upon reaching whitespace or a comma. + while ((*result != '\0') && (*result != ' ') && (*result != '\t') && + (*result != ',') && (*result != ';')) { + result++; + } + // Now skip the whitespace or the comma, stop at anything else that looks + // like a character, or the end of a line. + while ((*result == ' ') || (*result == '\t') || (*result == ',') || + (*result == ';')) { + result++; + } + return result; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// readnumberline() Read a nonempty number line from a file. // +// // +// A line is considered "nonempty" if it contains something that looks like // +// a number. Comments (prefaced by `#') are ignored. // +// // +/////////////////////////////////////////////////////////////////////////////// + +char* tetgenio::readnumberline(char *string, FILE *infile, char *infilename) +{ + char *result; + + // Search for something that looks like a number. + do { + result = fgets(string, INPUTLINESIZE, infile); + if (result == (char *) NULL) { + return result; + } + // Skip anything that doesn't look like a number, a comment, + // or the end of a line. + while ((*result != '\0') && (*result != '#') + && (*result != '.') && (*result != '+') && (*result != '-') + && ((*result < '0') || (*result > '9'))) { + result++; + } + // If it's a comment or end of line, read another line and try again. + } while ((*result == '#') || (*result == '\0')); + return result; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// findnextnumber() Find the next field of a number string. // +// // +// Jumps past the current field by searching for whitespace or a comma, then // +// jumps past the whitespace or the comma to find the next field that looks // +// like a number. // +// // +/////////////////////////////////////////////////////////////////////////////// + +char* tetgenio::findnextnumber(char *string) +{ + char *result; + + result = string; + // Skip the current field. Stop upon reaching whitespace or a comma. + while ((*result != '\0') && (*result != '#') && (*result != ' ') && + (*result != '\t') && (*result != ',')) { + result++; + } + // Now skip the whitespace and anything else that doesn't look like a + // number, a comment, or the end of a line. + while ((*result != '\0') && (*result != '#') + && (*result != '.') && (*result != '+') && (*result != '-') + && ((*result < '0') || (*result > '9'))) { + result++; + } + // Check for a comment (prefixed with `#'). + if (*result == '#') { + *result = '\0'; + } + return result; +} + +//// //// +//// //// +//// io_cxx /////////////////////////////////////////////////////////////////// + + +//// behavior_cxx ///////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// syntax() Print list of command line switches. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenbehavior::syntax() +{ + printf(" tetgen [-pYrq_Aa_miO_S_T_XMwcdzfenvgkJBNEFICQVh] input_file\n"); + printf(" -p Tetrahedralizes a piecewise linear complex (PLC).\n"); + printf(" -Y Preserves the input surface mesh (does not modify it).\n"); + printf(" -r Reconstructs a previously generated mesh.\n"); + printf(" -q Refines mesh (to improve mesh quality).\n"); + printf(" -R Mesh coarsening (to reduce the mesh elements).\n"); + printf(" -A Assigns attributes to tetrahedra in different regions.\n"); + printf(" -a Applies a maximum tetrahedron volume constraint.\n"); + printf(" -m Applies a mesh sizing function.\n"); + printf(" -i Inserts a list of additional points.\n"); + printf(" -O Specifies the level of mesh optimization.\n"); + printf(" -S Specifies maximum number of added points.\n"); + printf(" -T Sets a tolerance for coplanar test (default 1e-8).\n"); + printf(" -X Suppresses use of exact arithmetic.\n"); + printf(" -M No merge of coplanar facets or very close vertices.\n"); + printf(" -w Generates weighted Delaunay (regular) triangulation.\n"); + printf(" -c Retains the convex hull of the PLC.\n"); + printf(" -d Detects self-intersections of facets of the PLC.\n"); + printf(" -z Numbers all output items starting from zero.\n"); + printf(" -f Outputs all faces to .face file.\n"); + printf(" -e Outputs all edges to .edge file.\n"); + printf(" -n Outputs tetrahedra neighbors to .neigh file.\n"); + printf(" -v Outputs Voronoi diagram to files.\n"); + printf(" -g Outputs mesh to .mesh file for viewing by Medit.\n"); + printf(" -k Outputs mesh to .vtk file for viewing by Paraview.\n"); + printf(" -J No jettison of unused vertices from output .node file.\n"); + printf(" -B Suppresses output of boundary information.\n"); + printf(" -N Suppresses output of .node file.\n"); + printf(" -E Suppresses output of .ele file.\n"); + printf(" -F Suppresses output of .face and .edge file.\n"); + printf(" -I Suppresses mesh iteration numbers.\n"); + printf(" -C Checks the consistency of the final mesh.\n"); + printf(" -Q Quiet: No terminal output except errors.\n"); + printf(" -V Verbose: Detailed information, more terminal output.\n"); + printf(" -h Help: A brief instruction for using TetGen.\n"); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// usage() Print a brief instruction for using TetGen. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenbehavior::usage() +{ + printf("TetGen\n"); + printf("A Quality Tetrahedral Mesh Generator and 3D Delaunay "); + printf("Triangulator\n"); + printf("Version 1.5\n"); + printf("August 18, 2018\n"); + printf("\n"); + printf("Copyright (C) 2002 - 2018\n"); + printf("\n"); + printf("What Can TetGen Do?\n"); + printf("\n"); + printf(" TetGen generates Delaunay tetrahedralizations, constrained\n"); + printf(" Delaunay tetrahedralizations, and quality tetrahedral meshes.\n"); + printf("\n"); + printf("Command Line Syntax:\n"); + printf("\n"); + printf(" Below is the basic command line syntax of TetGen with a list of "); + printf("short\n"); + printf(" descriptions. Underscores indicate that numbers may optionally\n"); + printf(" follow certain switches. Do not leave any space between a "); + printf("switch\n"); + printf(" and its numeric parameter. \'input_file\' contains input data\n"); + printf(" depending on the switches you supplied which may be a "); + printf(" piecewise\n"); + printf(" linear complex or a list of nodes. File formats and detailed\n"); + printf(" description of command line switches are found in user's "); + printf("manual.\n"); + printf("\n"); + syntax(); + printf("\n"); + printf("Examples of How to Use TetGen:\n"); + printf("\n"); + printf(" \'tetgen object\' reads vertices from object.node, and writes "); + printf("their\n Delaunay tetrahedralization to object.1.node, "); + printf("object.1.ele\n (tetrahedra), and object.1.face"); + printf(" (convex hull faces).\n"); + printf("\n"); + printf(" \'tetgen -p object\' reads a PLC from object.poly or object."); + printf("smesh (and\n possibly object.node) and writes its constrained "); + printf("Delaunay\n tetrahedralization to object.1.node, object.1.ele, "); + printf("object.1.face,\n"); + printf(" (boundary faces) and object.1.edge (boundary edges).\n"); + printf("\n"); + printf(" \'tetgen -pq1.414a.1 object\' reads a PLC from object.poly or\n"); + printf(" object.smesh (and possibly object.node), generates a mesh "); + printf("whose\n tetrahedra have radius-edge ratio smaller than 1.414 and "); + printf("have volume\n of 0.1 or less, and writes the mesh to "); + printf("object.1.node, object.1.ele,\n object.1.face, and object.1.edge\n"); + printf("\n"); + printf("Please send bugs/comments to Hang Si \n"); + terminatetetgen(NULL, 0); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// parse_commandline() Read the command line, identify switches, and set // +// up options and file names. // +// // +// 'argc' and 'argv' are the same parameters passed to the function main() // +// of a C/C++ program. They together represent the command line user invoked // +// from an environment in which TetGen is running. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenbehavior::parse_commandline(int argc, char **argv) +{ + int startindex; + int increment; + int meshnumber; + int i, j, k; + char workstring[1024]; + + // First determine the input style of the switches. + if (argc == 0) { + startindex = 0; // Switches are given without a dash. + argc = 1; // For running the following for-loop once. + commandline[0] = '\0'; + } else { + startindex = 1; + strcpy(commandline, argv[0]); + strcat(commandline, " "); + } + + for (i = startindex; i < argc; i++) { + // Remember the command line for output. + strcat(commandline, argv[i]); + strcat(commandline, " "); + if (startindex == 1) { + // Is this string a filename? + if (argv[i][0] != '-') { + strncpy(infilename, argv[i], 1024 - 1); + infilename[1024 - 1] = '\0'; + continue; + } + } + // Parse the individual switch from the string. + for (j = startindex; argv[i][j] != '\0'; j++) { + if (argv[i][j] == 'p') { + plc = 1; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + facet_separate_ang_tol = (REAL) strtod(workstring, (char **) NULL); + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.') || (argv[i][j + 1] == 'e') || + (argv[i][j + 1] == '-') || (argv[i][j + 1] == '+')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + facet_overlap_ang_tol = (REAL) strtod(workstring, (char **) NULL); + } + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + facet_small_ang_tol = (REAL) strtod(workstring, (char **) NULL); + } + } + } else if (argv[i][j] == 's') { + psc = 1; + } else if (argv[i][j] == 'Y') { + nobisect = 1; + if ((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) { + nobisect_nomerge = (argv[i][j + 1] - '0'); + j++; + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if ((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) { + supsteiner_level = (argv[i][j + 1] - '0'); + j++; + } + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if ((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) { + addsteiner_algo = (argv[i][j + 1] - '0'); + j++; + } + } + } else if (argv[i][j] == 'r') { + refine = 1; + } else if (argv[i][j] == 'q') { + quality = 1; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + minratio = (REAL) strtod(workstring, (char **) NULL); + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + mindihedral = (REAL) strtod(workstring, (char **) NULL); + } + } + } else if (argv[i][j] == 'R') { + coarsen = 1; + if ((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) { + coarsen_param = (argv[i][j + 1] - '0'); + j++; + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + coarsen_percent = (REAL) strtod(workstring, (char **) NULL); + } + } + } else if (argv[i][j] == 'w') { + weighted = 1; + if ((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) { + weighted_param = (argv[i][j + 1] - '0'); + j++; + } + } else if (argv[i][j] == 'b') { + // -b(brio_threshold/brio_ratio/hilbert_limit/hilbert_order) + brio_hilbert = 1; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + brio_threshold = (int) strtol(workstring, (char **) &workstring, 0); + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + brio_ratio = (REAL) strtod(workstring, (char **) NULL); + } + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.') || (argv[i][j + 1] == '-')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.') || (argv[i][j + 1] == '-')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + hilbert_limit = (int) strtol(workstring, (char **) &workstring, 0); + } + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.') || (argv[i][j + 1] == '-')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.') || (argv[i][j + 1] == '-')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + hilbert_order = (REAL) strtod(workstring, (char **) NULL); + } + } + if (brio_threshold == 0) { // -b0 + brio_hilbert = 0; // Turn off BRIO-Hilbert sorting. + } + if (brio_ratio >= 1.0) { // -b/1 + no_sort = 1; + brio_hilbert = 0; // Turn off BRIO-Hilbert sorting. + } + } else if (argv[i][j] == 'l') { + incrflip = 1; + } else if (argv[i][j] == 'L') { + flipinsert = 1; + } else if (argv[i][j] == 'm') { + metric = 1; + } else if (argv[i][j] == 'a') { + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + fixedvolume = 1; + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.') || (argv[i][j + 1] == 'e') || + (argv[i][j + 1] == '-') || (argv[i][j + 1] == '+')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + maxvolume = (REAL) strtod(workstring, (char **) NULL); + } else { + varvolume = 1; + } + } else if (argv[i][j] == 'A') { + regionattrib = 1; + } else if (argv[i][j] == 'D') { + cdtrefine = 1; + if (argv[i][j + 1] == 'l') { + use_equatorial_lens = 1; + } else if ((argv[i][j + 1] >= '1') && (argv[i][j + 1] <= '3')) { + reflevel = (argv[i][j + 1] - '1') + 1; + j++; + } + } else if (argv[i][j] == 'i') { + insertaddpoints = 1; + } else if (argv[i][j] == 'd') { + diagnose = 1; + } else if (argv[i][j] == 'c') { + convex = 1; + } else if (argv[i][j] == 'M') { + nomergefacet = 1; + nomergevertex = 1; + if ((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '1')) { + nomergefacet = (argv[i][j + 1] - '0'); + j++; + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if ((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '1')) { + nomergevertex = (argv[i][j + 1] - '0'); + j++; + } + } + } else if (argv[i][j] == 'X') { + if (argv[i][j + 1] == '1') { + nostaticfilter = 1; + j++; + } else { + noexact = 1; + } + } else if (argv[i][j] == 'z') { + if (argv[i][j + 1] == '1') { // -z1 + reversetetori = 1; + j++; + } else { + zeroindex = 1; // -z + } + } else if (argv[i][j] == 'f') { + facesout++; + } else if (argv[i][j] == 'e') { + edgesout++; + } else if (argv[i][j] == 'n') { + neighout++; + } else if (argv[i][j] == 'v') { + voroout = 1; + } else if (argv[i][j] == 'g') { + meditview = 1; + } else if (argv[i][j] == 'k') { + vtkview = 1; + } else if (argv[i][j] == 'J') { + nojettison = 1; + } else if (argv[i][j] == 'B') { + nobound = 1; + } else if (argv[i][j] == 'N') { + nonodewritten = 1; + } else if (argv[i][j] == 'E') { + noelewritten = 1; + } else if (argv[i][j] == 'F') { + nofacewritten = 1; + } else if (argv[i][j] == 'I') { + noiterationnum = 1; + } else if (argv[i][j] == 'S') { + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.') || (argv[i][j + 1] == 'e') || + (argv[i][j + 1] == '-') || (argv[i][j + 1] == '+')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + steinerleft = (int) strtol(workstring, (char **) NULL, 0); + } + } else if (argv[i][j] == 'o') { + if (argv[i][j + 1] == '2') { + order = 2; + j++; + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + optmaxdihedral = (REAL) strtod(workstring, (char **) NULL); + } + } + } else if (argv[i][j] == 'O') { + if ((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) { + optlevel = (argv[i][j + 1] - '0'); + j++; + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if ((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '7')) { + optscheme = (argv[i][j + 1] - '0'); + j++; + } + } + } else if (argv[i][j] == 'T') { + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.') || (argv[i][j + 1] == 'e') || + (argv[i][j + 1] == '-') || (argv[i][j + 1] == '+')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + epsilon = (REAL) strtod(workstring, (char **) NULL); + } + } else if (argv[i][j] == 'C') { + docheck++; + } else if (argv[i][j] == 'Q') { + quiet = 1; + } else if (argv[i][j] == 'V') { + verbose++; + } else if (argv[i][j] == 'x') { + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.') || (argv[i][j + 1] == 'e') || + (argv[i][j + 1] == '-') || (argv[i][j + 1] == '+')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + tetrahedraperblock = (int) strtol(workstring, (char **) NULL, 0); + if (tetrahedraperblock > 8188) { + vertexperblock = tetrahedraperblock / 2; + shellfaceperblock = vertexperblock / 2; + } else { + tetrahedraperblock = 8188; + } + } + } else if (argv[i][j] == 'H') { + if (argv[i+1][0] != '-') { + hole_mesh = 1; + // It is a filename following by -H + strncpy(hole_mesh_filename, argv[i+1], 1024 - 1); + hole_mesh_filename[1024 - 1] = '\0'; + i++; // Skip the next string. + break; // j + } + } else if (argv[i][j] == 'K') { + apply_flow_bc = 1; + } else if ((argv[i][j] == 'h') || // (argv[i][j] == 'H') + (argv[i][j] == '?')) { + usage(); + } else { + printf("Warning: Unknown switch -%c.\n", argv[i][j]); + } + } + } + + if (startindex == 0) { + // Set a temporary filename for debugging output. + strcpy(infilename, "tetgen-tmpfile"); + } else { + if (infilename[0] == '\0') { + // No input file name. Print the syntax and exit. + syntax(); + terminatetetgen(NULL, 0); + } + // Recognize the object from file extension if it is available. + if (!strcmp(&infilename[strlen(infilename) - 5], ".node")) { + infilename[strlen(infilename) - 5] = '\0'; + object = NODES; + } else if (!strcmp(&infilename[strlen(infilename) - 5], ".poly")) { + infilename[strlen(infilename) - 5] = '\0'; + object = POLY; + plc = 1; + } else if (!strcmp(&infilename[strlen(infilename) - 6], ".smesh")) { + infilename[strlen(infilename) - 6] = '\0'; + object = POLY; + plc = 1; + } else if (!strcmp(&infilename[strlen(infilename) - 4], ".off")) { + infilename[strlen(infilename) - 4] = '\0'; + object = OFF; + plc = 1; + } else if (!strcmp(&infilename[strlen(infilename) - 4], ".ply")) { + infilename[strlen(infilename) - 4] = '\0'; + object = PLY; + plc = 1; + } else if (!strcmp(&infilename[strlen(infilename) - 4], ".stl")) { + infilename[strlen(infilename) - 4] = '\0'; + object = STL; + plc = 1; + } else if (!strcmp(&infilename[strlen(infilename) - 5], ".mesh")) { + infilename[strlen(infilename) - 5] = '\0'; + object = MEDIT; + if (!refine) plc = 1; + } else if (!strcmp(&infilename[strlen(infilename) - 4], ".vtk")) { + infilename[strlen(infilename) - 4] = '\0'; + object = VTK; + plc = 1; + } else if (!strcmp(&infilename[strlen(infilename) - 4], ".ele")) { + infilename[strlen(infilename) - 4] = '\0'; + object = MESH; + refine = 1; + } else if (!strcmp(&infilename[strlen(infilename) - 4], ".neu")) { + infilename[strlen(infilename) - 4] = '\0'; + object = NEU_MESH; + refine = 1; + } + } + + if (nobisect && (!plc && !refine)) { // -Y + plc = 1; // Default -p option. + } + if (quality && (!plc && !refine)) { // -q + plc = 1; // Default -p option. + } + if (diagnose && !plc) { // -d + plc = 1; + } + if (refine && !quality) { // -r only + // Reconstruct a mesh, no mesh optimization. + optlevel = 0; + } + if (insertaddpoints && (optlevel == 0)) { // with -i option + optlevel = 2; + } + if (coarsen && (optlevel == 0)) { // with -R option + optlevel = 2; + } + + // Detect improper combinations of switches. + if ((refine || plc) && weighted) { + printf("Error: Switches -w cannot use together with -p or -r.\n"); + return false; + } + + if (convex) { // -c + if (plc && !regionattrib) { + // -A (region attribute) is needed for marking exterior tets (-1). + regionattrib = 1; + } + } + + // Note: -A must not used together with -r option. + // Be careful not to add an extra attribute to each element unless the + // input supports it (PLC in, but not refining a preexisting mesh). + if (refine || !plc) { + regionattrib = 0; + } + // Be careful not to allocate space for element area constraints that + // will never be assigned any value (other than the default -1.0). + if (!refine && !plc) { + varvolume = 0; + } + // If '-a' or '-aa' is in use, enable '-q' option too. + if (fixedvolume || varvolume) { + if (quality == 0) { + quality = 1; + if (!plc && !refine) { + plc = 1; // enable -p. + } + } + } + // No user-specified dihedral angle bound. Use default ones. + if (!quality) { + if (optmaxdihedral < 179.0) { + if (nobisect) { // with -Y option + optmaxdihedral = 179.0; + } else { // -p only + optmaxdihedral = 179.999; + } + } + if (optminsmtdihed < 179.999) { + optminsmtdihed = 179.999; + } + if (optminslidihed < 179.999) { + optminslidihed = 179.999; + } + } + + increment = 0; + strcpy(workstring, infilename); + j = 1; + while (workstring[j] != '\0') { + if ((workstring[j] == '.') && (workstring[j + 1] != '\0')) { + increment = j + 1; + } + j++; + } + meshnumber = 0; + if (increment > 0) { + j = increment; + do { + if ((workstring[j] >= '0') && (workstring[j] <= '9')) { + meshnumber = meshnumber * 10 + (int) (workstring[j] - '0'); + } else { + increment = 0; + } + j++; + } while (workstring[j] != '\0'); + } + if (noiterationnum) { + strcpy(outfilename, infilename); + } else if (increment == 0) { + strcpy(outfilename, infilename); + strcat(outfilename, ".1"); + } else { + workstring[increment] = '%'; + workstring[increment + 1] = 'd'; + workstring[increment + 2] = '\0'; + sprintf(outfilename, workstring, meshnumber + 1); + } + // Additional input file name has the end ".a". + strcpy(addinfilename, infilename); + strcat(addinfilename, ".a"); + // Background filename has the form "*.b.ele", "*.b.node", ... + strcpy(bgmeshfilename, infilename); + strcat(bgmeshfilename, ".b"); + + return true; +} + +//// //// +//// //// +//// behavior_cxx ///////////////////////////////////////////////////////////// + +//// mempool_cxx ////////////////////////////////////////////////////////////// +//// //// +//// //// + +// Initialize fast lookup tables for mesh maniplulation primitives. + +int tetgenmesh::bondtbl[12][12] = {{0,},}; +int tetgenmesh::enexttbl[12] = {0,}; +int tetgenmesh::eprevtbl[12] = {0,}; +int tetgenmesh::enextesymtbl[12] = {0,}; +int tetgenmesh::eprevesymtbl[12] = {0,}; +int tetgenmesh::eorgoppotbl[12] = {0,}; +int tetgenmesh::edestoppotbl[12] = {0,}; +int tetgenmesh::fsymtbl[12][12] = {{0,},}; +int tetgenmesh::facepivot1[12] = {0,}; +int tetgenmesh::facepivot2[12][12] = {{0,},}; +int tetgenmesh::tsbondtbl[12][6] = {{0,},}; +int tetgenmesh::stbondtbl[12][6] = {{0,},}; +int tetgenmesh::tspivottbl[12][6] = {{0,},}; +int tetgenmesh::stpivottbl[12][6] = {{0,},}; + +// Table 'esymtbl' takes an directed edge (version) as input, returns the +// inversed edge (version) of it. + +int tetgenmesh::esymtbl[12] = {9, 6, 11, 4, 3, 7, 1, 5, 10, 0, 8, 2}; + +// The following four tables give the 12 permutations of the set {0,1,2,3}. +// An offset 4 is added to each element for a direct access of the points +// in the tetrahedron data structure. + +int tetgenmesh:: orgpivot[12] = {7, 7, 5, 5, 6, 4, 4, 6, 5, 6, 7, 4}; +int tetgenmesh::destpivot[12] = {6, 4, 4, 6, 5, 6, 7, 4, 7, 7, 5, 5}; +int tetgenmesh::apexpivot[12] = {5, 6, 7, 4, 7, 7, 5, 5, 6, 4, 4, 6}; +int tetgenmesh::oppopivot[12] = {4, 5, 6, 7, 4, 5, 6, 7, 4, 5, 6, 7}; + +// The twelve versions correspond to six undirected edges. The following two +// tables map a version to an undirected edge and vice versa. + +int tetgenmesh::ver2edge[12] = {0, 1, 2, 3, 3, 5, 1, 5, 4, 0, 4, 2}; +int tetgenmesh::edge2ver[ 6] = {0, 1, 2, 3, 8, 5}; + +// Edge versions whose apex or opposite may be dummypoint. + +int tetgenmesh::epivot[12] = {4, 5, 2, 11, 4, 5, 2, 11, 4, 5, 2, 11}; + + +// Table 'snextpivot' takes an edge version as input, returns the next edge +// version in the same edge ring. + +int tetgenmesh::snextpivot[6] = {2, 5, 4, 1, 0, 3}; + +// The following three tables give the 6 permutations of the set {0,1,2}. +// An offset 3 is added to each element for a direct access of the points +// in the triangle data structure. + +int tetgenmesh::sorgpivot [6] = {3, 4, 4, 5, 5, 3}; +int tetgenmesh::sdestpivot[6] = {4, 3, 5, 4, 3, 5}; +int tetgenmesh::sapexpivot[6] = {5, 5, 3, 3, 4, 4}; + +/////////////////////////////////////////////////////////////////////////////// +// // +// inittable() Initialize the look-up tables. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::inittables() +{ + int soffset, toffset; + int i, j; + + + // i = t1.ver; j = t2.ver; + for (i = 0; i < 12; i++) { + for (j = 0; j < 12; j++) { + bondtbl[i][j] = (j & 3) + (((i & 12) + (j & 12)) % 12); + } + } + + + // i = t1.ver; j = t2.ver + for (i = 0; i < 12; i++) { + for (j = 0; j < 12; j++) { + fsymtbl[i][j] = (j + 12 - (i & 12)) % 12; + } + } + + + for (i = 0; i < 12; i++) { + facepivot1[i] = (esymtbl[i] & 3); + } + + for (i = 0; i < 12; i++) { + for (j = 0; j < 12; j++) { + facepivot2[i][j] = fsymtbl[esymtbl[i]][j]; + } + } + + for (i = 0; i < 12; i++) { + enexttbl[i] = (i + 4) % 12; + eprevtbl[i] = (i + 8) % 12; + } + + for (i = 0; i < 12; i++) { + enextesymtbl[i] = esymtbl[enexttbl[i]]; + eprevesymtbl[i] = esymtbl[eprevtbl[i]]; + } + + for (i = 0; i < 12; i++) { + eorgoppotbl [i] = eprevtbl[esymtbl[enexttbl[i]]]; + edestoppotbl[i] = enexttbl[esymtbl[eprevtbl[i]]]; + } + + // i = t.ver, j = s.shver + for (i = 0; i < 12; i++) { + for (j = 0; j < 6; j++) { + if ((j & 1) == 0) { + soffset = (6 - ((i & 12) >> 1)) % 6; + toffset = (12 - ((j & 6) << 1)) % 12; + } else { + soffset = (i & 12) >> 1; + toffset = (j & 6) << 1; + } + tsbondtbl[i][j] = (j & 1) + (((j & 6) + soffset) % 6); + stbondtbl[i][j] = (i & 3) + (((i & 12) + toffset) % 12); + } + } + + + // i = t.ver, j = s.shver + for (i = 0; i < 12; i++) { + for (j = 0; j < 6; j++) { + if ((j & 1) == 0) { + soffset = (i & 12) >> 1; + toffset = (j & 6) << 1; + } else { + soffset = (6 - ((i & 12) >> 1)) % 6; + toffset = (12 - ((j & 6) << 1)) % 12; + } + tspivottbl[i][j] = (j & 1) + (((j & 6) + soffset) % 6); + stpivottbl[i][j] = (i & 3) + (((i & 12) + toffset) % 12); + } + } +} + + +/////////////////////////////////////////////////////////////////////////////// +// // +// restart() Deallocate all objects in this pool. // +// // +// The pool returns to a fresh state, like after it was initialized, except // +// that no memory is freed to the operating system. Rather, the previously // +// allocated blocks are ready to be used. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::arraypool::restart() +{ + objects = 0l; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// poolinit() Initialize an arraypool for allocation of objects. // +// // +// Before the pool may be used, it must be initialized by this procedure. // +// After initialization, memory can be allocated and freed in this pool. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::arraypool::poolinit(int sizeofobject, int log2objperblk) +{ + // Each object must be at least one byte long. + objectbytes = sizeofobject > 1 ? sizeofobject : 1; + + log2objectsperblock = log2objperblk; + // Compute the number of objects in each block. + objectsperblock = ((int) 1) << log2objectsperblock; + objectsperblockmark = objectsperblock - 1; + + // No memory has been allocated. + totalmemory = 0l; + // The top array has not been allocated yet. + toparray = (char **) NULL; + toparraylen = 0; + + // Ready all indices to be allocated. + restart(); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// arraypool() The constructor and destructor. // +// // +/////////////////////////////////////////////////////////////////////////////// + +tetgenmesh::arraypool::arraypool(int sizeofobject, int log2objperblk) +{ + poolinit(sizeofobject, log2objperblk); +} + +tetgenmesh::arraypool::~arraypool() +{ + int i; + + // Has anything been allocated at all? + if (toparray != (char **) NULL) { + // Walk through the top array. + for (i = 0; i < toparraylen; i++) { + // Check every pointer; NULLs may be scattered randomly. + if (toparray[i] != (char *) NULL) { + // Free an allocated block. + free((void *) toparray[i]); + } + } + // Free the top array. + free((void *) toparray); + } + + // The top array is no longer allocated. + toparray = (char **) NULL; + toparraylen = 0; + objects = 0; + totalmemory = 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// getblock() Return (and perhaps create) the block containing the object // +// with a given index. // +// // +// This function takes care of allocating or resizing the top array if nece- // +// ssary, and of allocating the block if it hasn't yet been allocated. // +// // +// Return a pointer to the beginning of the block (NOT the object). // +// // +/////////////////////////////////////////////////////////////////////////////// + +char* tetgenmesh::arraypool::getblock(int objectindex) +{ + char **newarray; + char *block; + int newsize; + int topindex; + int i; + + // Compute the index in the top array (upper bits). + topindex = objectindex >> log2objectsperblock; + // Does the top array need to be allocated or resized? + if (toparray == (char **) NULL) { + // Allocate the top array big enough to hold 'topindex', and NULL out + // its contents. + newsize = topindex + 128; + toparray = (char **) malloc((size_t) (newsize * sizeof(char *))); + toparraylen = newsize; + for (i = 0; i < newsize; i++) { + toparray[i] = (char *) NULL; + } + // Account for the memory. + totalmemory = newsize * (uintptr_t) sizeof(char *); + } else if (topindex >= toparraylen) { + // Resize the top array, making sure it holds 'topindex'. + newsize = 3 * toparraylen; + if (topindex >= newsize) { + newsize = topindex + 128; + } + // Allocate the new array, copy the contents, NULL out the rest, and + // free the old array. + newarray = (char **) malloc((size_t) (newsize * sizeof(char *))); + for (i = 0; i < toparraylen; i++) { + newarray[i] = toparray[i]; + } + for (i = toparraylen; i < newsize; i++) { + newarray[i] = (char *) NULL; + } + free(toparray); + // Account for the memory. + totalmemory += (newsize - toparraylen) * sizeof(char *); + toparray = newarray; + toparraylen = newsize; + } + + // Find the block, or learn that it hasn't been allocated yet. + block = toparray[topindex]; + if (block == (char *) NULL) { + // Allocate a block at this index. + block = (char *) malloc((size_t) (objectsperblock * objectbytes)); + toparray[topindex] = block; + // Account for the memory. + totalmemory += objectsperblock * objectbytes; + } + + // Return a pointer to the block. + return block; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// lookup() Return the pointer to the object with a given index, or NULL // +// if the object's block doesn't exist yet. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void* tetgenmesh::arraypool::lookup(int objectindex) +{ + char *block; + int topindex; + + // Has the top array been allocated yet? + if (toparray == (char **) NULL) { + return (void *) NULL; + } + + // Compute the index in the top array (upper bits). + topindex = objectindex >> log2objectsperblock; + // Does the top index fit in the top array? + if (topindex >= toparraylen) { + return (void *) NULL; + } + + // Find the block, or learn that it hasn't been allocated yet. + block = toparray[topindex]; + if (block == (char *) NULL) { + return (void *) NULL; + } + + // Compute a pointer to the object with the given index. Note that + // 'objectsperblock' is a power of two, so the & operation is a bit mask + // that preserves the lower bits. + return (void *)(block + (objectindex & (objectsperblock - 1)) * objectbytes); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// newindex() Allocate space for a fresh object from the pool. // +// // +// 'newptr' returns a pointer to the new object (it must not be a NULL). // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::arraypool::newindex(void **newptr) +{ + // Allocate an object at index 'firstvirgin'. + int newindex = objects; + *newptr = (void *) (getblock(objects) + + (objects & (objectsperblock - 1)) * objectbytes); + objects++; + + return newindex; +} + + +/////////////////////////////////////////////////////////////////////////////// +// // +// memorypool() The constructors of memorypool. // +// // +/////////////////////////////////////////////////////////////////////////////// + +tetgenmesh::memorypool::memorypool() +{ + firstblock = nowblock = (void **) NULL; + nextitem = (void *) NULL; + deaditemstack = (void *) NULL; + pathblock = (void **) NULL; + pathitem = (void *) NULL; + alignbytes = 0; + itembytes = itemwords = 0; + itemsperblock = 0; + items = maxitems = 0l; + unallocateditems = 0; + pathitemsleft = 0; +} + +tetgenmesh::memorypool::memorypool(int bytecount, int itemcount, int wsize, + int alignment) +{ + poolinit(bytecount, itemcount, wsize, alignment); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// ~memorypool() Free to the operating system all memory taken by a pool. // +// // +/////////////////////////////////////////////////////////////////////////////// + +tetgenmesh::memorypool::~memorypool() +{ + while (firstblock != (void **) NULL) { + nowblock = (void **) *(firstblock); + free(firstblock); + firstblock = nowblock; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// poolinit() Initialize a pool of memory for allocation of items. // +// // +// A `pool' is created whose records have size at least `bytecount'. Items // +// will be allocated in `itemcount'-item blocks. Each item is assumed to be // +// a collection of words, and either pointers or floating-point values are // +// assumed to be the "primary" word type. (The "primary" word type is used // +// to determine alignment of items.) If `alignment' isn't zero, all items // +// will be `alignment'-byte aligned in memory. `alignment' must be either a // +// multiple or a factor of the primary word size; powers of two are safe. // +// `alignment' is normally used to create a few unused bits at the bottom of // +// each item's pointer, in which information may be stored. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::memorypool::poolinit(int bytecount,int itemcount,int wordsize, + int alignment) +{ + // Find the proper alignment, which must be at least as large as: + // - The parameter `alignment'. + // - The primary word type, to avoid unaligned accesses. + // - sizeof(void *), so the stack of dead items can be maintained + // without unaligned accesses. + if (alignment > wordsize) { + alignbytes = alignment; + } else { + alignbytes = wordsize; + } + if ((int) sizeof(void *) > alignbytes) { + alignbytes = (int) sizeof(void *); + } + itemwords = ((bytecount + alignbytes - 1) / alignbytes) + * (alignbytes / wordsize); + itembytes = itemwords * wordsize; + itemsperblock = itemcount; + + // Allocate a block of items. Space for `itemsperblock' items and one + // pointer (to point to the next block) are allocated, as well as space + // to ensure alignment of the items. + firstblock = (void **) malloc(itemsperblock * itembytes + sizeof(void *) + + alignbytes); + if (firstblock == (void **) NULL) { + terminatetetgen(NULL, 1); + } + // Set the next block pointer to NULL. + *(firstblock) = (void *) NULL; + restart(); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// restart() Deallocate all items in this pool. // +// // +// The pool is returned to its starting state, except that no memory is // +// freed to the operating system. Rather, the previously allocated blocks // +// are ready to be reused. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::memorypool::restart() +{ + uintptr_t alignptr; + + items = 0; + maxitems = 0; + + // Set the currently active block. + nowblock = firstblock; + // Find the first item in the pool. Increment by the size of (void *). + alignptr = (uintptr_t) (nowblock + 1); + // Align the item on an `alignbytes'-byte boundary. + nextitem = (void *) + (alignptr + (uintptr_t) alignbytes - + (alignptr % (uintptr_t) alignbytes)); + // There are lots of unallocated items left in this block. + unallocateditems = itemsperblock; + // The stack of deallocated items is empty. + deaditemstack = (void *) NULL; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// alloc() Allocate space for an item. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void* tetgenmesh::memorypool::alloc() +{ + void *newitem; + void **newblock; + uintptr_t alignptr; + + // First check the linked list of dead items. If the list is not + // empty, allocate an item from the list rather than a fresh one. + if (deaditemstack != (void *) NULL) { + newitem = deaditemstack; // Take first item in list. + deaditemstack = * (void **) deaditemstack; + } else { + // Check if there are any free items left in the current block. + if (unallocateditems == 0) { + // Check if another block must be allocated. + if (*nowblock == (void *) NULL) { + // Allocate a new block of items, pointed to by the previous block. + newblock = (void **) malloc(itemsperblock * itembytes + sizeof(void *) + + alignbytes); + if (newblock == (void **) NULL) { + terminatetetgen(NULL, 1); + } + *nowblock = (void *) newblock; + // The next block pointer is NULL. + *newblock = (void *) NULL; + } + // Move to the new block. + nowblock = (void **) *nowblock; + // Find the first item in the block. + // Increment by the size of (void *). + alignptr = (uintptr_t) (nowblock + 1); + // Align the item on an `alignbytes'-byte boundary. + nextitem = (void *) + (alignptr + (uintptr_t) alignbytes - + (alignptr % (uintptr_t) alignbytes)); + // There are lots of unallocated items left in this block. + unallocateditems = itemsperblock; + } + // Allocate a new item. + newitem = nextitem; + // Advance `nextitem' pointer to next free item in block. + nextitem = (void *) ((uintptr_t) nextitem + itembytes); + unallocateditems--; + maxitems++; + } + items++; + return newitem; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// dealloc() Deallocate space for an item. // +// // +// The deallocated space is stored in a queue for later reuse. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::memorypool::dealloc(void *dyingitem) +{ + // Push freshly killed item onto stack. + *((void **) dyingitem) = deaditemstack; + deaditemstack = dyingitem; + items--; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// traversalinit() Prepare to traverse the entire list of items. // +// // +// This routine is used in conjunction with traverse(). // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::memorypool::traversalinit() +{ + uintptr_t alignptr; + + // Begin the traversal in the first block. + pathblock = firstblock; + // Find the first item in the block. Increment by the size of (void *). + alignptr = (uintptr_t) (pathblock + 1); + // Align with item on an `alignbytes'-byte boundary. + pathitem = (void *) + (alignptr + (uintptr_t) alignbytes - + (alignptr % (uintptr_t) alignbytes)); + // Set the number of items left in the current block. + pathitemsleft = itemsperblock; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// traverse() Find the next item in the list. // +// // +// This routine is used in conjunction with traversalinit(). Be forewarned // +// that this routine successively returns all items in the list, including // +// deallocated ones on the deaditemqueue. It's up to you to figure out which // +// ones are actually dead. It can usually be done more space-efficiently by // +// a routine that knows something about the structure of the item. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void* tetgenmesh::memorypool::traverse() +{ + void *newitem; + uintptr_t alignptr; + + // Stop upon exhausting the list of items. + if (pathitem == nextitem) { + return (void *) NULL; + } + // Check whether any untraversed items remain in the current block. + if (pathitemsleft == 0) { + // Find the next block. + pathblock = (void **) *pathblock; + // Find the first item in the block. Increment by the size of (void *). + alignptr = (uintptr_t) (pathblock + 1); + // Align with item on an `alignbytes'-byte boundary. + pathitem = (void *) + (alignptr + (uintptr_t) alignbytes - + (alignptr % (uintptr_t) alignbytes)); + // Set the number of items left in the current block. + pathitemsleft = itemsperblock; + } + newitem = pathitem; + // Find the next item in the block. + pathitem = (void *) ((uintptr_t) pathitem + itembytes); + pathitemsleft--; + return newitem; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// makeindex2pointmap() Create a map from index to vertices. // +// // +// 'idx2verlist' returns the created map. Traverse all vertices, a pointer // +// to each vertex is set into the array. The pointer to the first vertex is // +// saved in 'idx2verlist[in->firstnumber]'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::makeindex2pointmap(point*& idx2verlist) +{ + point pointloop; + int idx; + + if (b->verbose > 1) { + printf(" Constructing mapping from indices to points.\n"); + } + + idx2verlist = new point[points->items + 1]; + + points->traversalinit(); + pointloop = pointtraverse(); + idx = in->firstnumber; + while (pointloop != (point) NULL) { + idx2verlist[idx++] = pointloop; + pointloop = pointtraverse(); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// makesubfacemap() Create a map from vertex to subfaces incident at it. // +// // +// The map is returned in two arrays 'idx2faclist' and 'facperverlist'. All // +// subfaces incident at i-th vertex (i is counted from 0) are found in the // +// array facperverlist[j], where idx2faclist[i] <= j < idx2faclist[i + 1]. // +// Each entry in facperverlist[j] is a subface whose origin is the vertex. // +// // +// NOTE: These two arrays will be created inside this routine, don't forget // +// to free them after using. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::makepoint2submap(memorypool* pool, int*& idx2faclist, + face*& facperverlist) +{ + face shloop; + int i, j, k; + + if (b->verbose > 1) { + printf(" Making a map from points to subfaces.\n"); + } + + // Initialize 'idx2faclist'. + idx2faclist = new int[points->items + 1]; + for (i = 0; i < points->items + 1; i++) idx2faclist[i] = 0; + + // Loop all subfaces, counter the number of subfaces incident at a vertex. + pool->traversalinit(); + shloop.sh = shellfacetraverse(pool); + while (shloop.sh != (shellface *) NULL) { + // Increment the number of incident subfaces for each vertex. + j = pointmark((point) shloop.sh[3]) - in->firstnumber; + idx2faclist[j]++; + j = pointmark((point) shloop.sh[4]) - in->firstnumber; + idx2faclist[j]++; + // Skip the third corner if it is a segment. + if (shloop.sh[5] != NULL) { + j = pointmark((point) shloop.sh[5]) - in->firstnumber; + idx2faclist[j]++; + } + shloop.sh = shellfacetraverse(pool); + } + + // Calculate the total length of array 'facperverlist'. + j = idx2faclist[0]; + idx2faclist[0] = 0; // Array starts from 0 element. + for (i = 0; i < points->items; i++) { + k = idx2faclist[i + 1]; + idx2faclist[i + 1] = idx2faclist[i] + j; + j = k; + } + + // The total length is in the last unit of idx2faclist. + facperverlist = new face[idx2faclist[i]]; + + // Loop all subfaces again, remember the subfaces at each vertex. + pool->traversalinit(); + shloop.sh = shellfacetraverse(pool); + while (shloop.sh != (shellface *) NULL) { + j = pointmark((point) shloop.sh[3]) - in->firstnumber; + shloop.shver = 0; // save the origin. + facperverlist[idx2faclist[j]] = shloop; + idx2faclist[j]++; + // Is it a subface or a subsegment? + if (shloop.sh[5] != NULL) { + j = pointmark((point) shloop.sh[4]) - in->firstnumber; + shloop.shver = 2; // save the origin. + facperverlist[idx2faclist[j]] = shloop; + idx2faclist[j]++; + j = pointmark((point) shloop.sh[5]) - in->firstnumber; + shloop.shver = 4; // save the origin. + facperverlist[idx2faclist[j]] = shloop; + idx2faclist[j]++; + } else { + j = pointmark((point) shloop.sh[4]) - in->firstnumber; + shloop.shver = 1; // save the origin. + facperverlist[idx2faclist[j]] = shloop; + idx2faclist[j]++; + } + shloop.sh = shellfacetraverse(pool); + } + + // Contents in 'idx2faclist' are shifted, now shift them back. + for (i = points->items - 1; i >= 0; i--) { + idx2faclist[i + 1] = idx2faclist[i]; + } + idx2faclist[0] = 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetrahedrondealloc() Deallocate space for a tet., marking it dead. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::tetrahedrondealloc(tetrahedron *dyingtetrahedron) +{ + // Set tetrahedron's vertices to NULL. This makes it possible to detect + // dead tetrahedra when traversing the list of all tetrahedra. + dyingtetrahedron[4] = (tetrahedron) NULL; + + // Dealloc the space to subfaces/subsegments. + if (dyingtetrahedron[8] != NULL) { + tet2segpool->dealloc((shellface *) dyingtetrahedron[8]); + } + if (dyingtetrahedron[9] != NULL) { + tet2subpool->dealloc((shellface *) dyingtetrahedron[9]); + } + + tetrahedrons->dealloc((void *) dyingtetrahedron); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetrahedrontraverse() Traverse the tetrahedra, skipping dead ones. // +// // +/////////////////////////////////////////////////////////////////////////////// + +tetgenmesh::tetrahedron* tetgenmesh::tetrahedrontraverse() +{ + tetrahedron *newtetrahedron; + + do { + newtetrahedron = (tetrahedron *) tetrahedrons->traverse(); + if (newtetrahedron == (tetrahedron *) NULL) { + return (tetrahedron *) NULL; + } + } while ((newtetrahedron[4] == (tetrahedron) NULL) || + ((point) newtetrahedron[7] == dummypoint)); + return newtetrahedron; +} + +tetgenmesh::tetrahedron* tetgenmesh::alltetrahedrontraverse() +{ + tetrahedron *newtetrahedron; + + do { + newtetrahedron = (tetrahedron *) tetrahedrons->traverse(); + if (newtetrahedron == (tetrahedron *) NULL) { + return (tetrahedron *) NULL; + } + } while (newtetrahedron[4] == (tetrahedron) NULL); // Skip dead ones. + return newtetrahedron; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// shellfacedealloc() Deallocate space for a shellface, marking it dead. // +// Used both for dealloc a subface and subsegment. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::shellfacedealloc(memorypool *pool, shellface *dyingsh) +{ + // Set shellface's vertices to NULL. This makes it possible to detect dead + // shellfaces when traversing the list of all shellfaces. + dyingsh[3] = (shellface) NULL; + pool->dealloc((void *) dyingsh); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// shellfacetraverse() Traverse the subfaces, skipping dead ones. Used // +// for both subfaces and subsegments pool traverse. // +// // +/////////////////////////////////////////////////////////////////////////////// + +tetgenmesh::shellface* tetgenmesh::shellfacetraverse(memorypool *pool) +{ + shellface *newshellface; + + do { + newshellface = (shellface *) pool->traverse(); + if (newshellface == (shellface *) NULL) { + return (shellface *) NULL; + } + } while (newshellface[3] == (shellface) NULL); // Skip dead ones. + return newshellface; +} + + +/////////////////////////////////////////////////////////////////////////////// +// // +// pointdealloc() Deallocate space for a point, marking it dead. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::pointdealloc(point dyingpoint) +{ + // Mark the point as dead. This makes it possible to detect dead points + // when traversing the list of all points. + setpointtype(dyingpoint, DEADVERTEX); + points->dealloc((void *) dyingpoint); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// pointtraverse() Traverse the points, skipping dead ones. // +// // +/////////////////////////////////////////////////////////////////////////////// + +tetgenmesh::point tetgenmesh::pointtraverse() +{ + point newpoint; + + do { + newpoint = (point) points->traverse(); + if (newpoint == (point) NULL) { + return (point) NULL; + } + } while (pointtype(newpoint) == DEADVERTEX); // Skip dead ones. + return newpoint; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// maketetrahedron() Create a new tetrahedron. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::maketetrahedron(triface *newtet) +{ + newtet->tet = (tetrahedron *) tetrahedrons->alloc(); + + // Initialize the four adjoining tetrahedra to be "outer space". + newtet->tet[0] = NULL; + newtet->tet[1] = NULL; + newtet->tet[2] = NULL; + newtet->tet[3] = NULL; + // Four NULL vertices. + newtet->tet[4] = NULL; + newtet->tet[5] = NULL; + newtet->tet[6] = NULL; + newtet->tet[7] = NULL; + // No attached segments and subfaces yet. + newtet->tet[8] = NULL; + newtet->tet[9] = NULL; + // Initialize the marker (clear all flags). + setelemmarker(newtet->tet, 0); + for (int i = 0; i < numelemattrib; i++) { + setelemattribute(newtet->tet, i, 0.0); + } + if (b->varvolume) { + setvolumebound(newtet->tet, -1.0); + } + + // Initialize the version to be Zero. + newtet->ver = 11; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// makeshellface() Create a new shellface with version zero. Used for // +// both subfaces and subsegments. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::makeshellface(memorypool *pool, face *newface) +{ + newface->sh = (shellface *) pool->alloc(); + + // No adjointing subfaces. + newface->sh[0] = NULL; + newface->sh[1] = NULL; + newface->sh[2] = NULL; + // Three NULL vertices. + newface->sh[3] = NULL; + newface->sh[4] = NULL; + newface->sh[5] = NULL; + // No adjoining subsegments. + newface->sh[6] = NULL; + newface->sh[7] = NULL; + newface->sh[8] = NULL; + // No adjoining tetrahedra. + newface->sh[9] = NULL; + newface->sh[10] = NULL; + if (checkconstraints) { + // Initialize the maximum area bound. + setareabound(*newface, 0.0); + } + // Set the boundary marker to zero. + setshellmark(*newface, 0); + // Clear the infection and marktest bits. + ((int *) (newface->sh))[shmarkindex + 1] = 0; + if (useinsertradius) { + setfacetindex(*newface, 0); + } + + newface->shver = 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// makepoint() Create a new point. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::makepoint(point* pnewpoint, enum verttype vtype) +{ + int i; + + *pnewpoint = (point) points->alloc(); + + // Initialize the point attributes. + for (i = 0; i < numpointattrib; i++) { + (*pnewpoint)[3 + i] = 0.0; + } + // Initialize the metric tensor. + for (i = 0; i < sizeoftensor; i++) { + (*pnewpoint)[pointmtrindex + i] = 0.0; + } + setpoint2tet(*pnewpoint, NULL); + setpoint2ppt(*pnewpoint, NULL); + if (b->plc || b->refine) { + // Initialize the point-to-simplex field. + setpoint2sh(*pnewpoint, NULL); + if (b->metric && (bgm != NULL)) { + setpoint2bgmtet(*pnewpoint, NULL); + } + } + // Initialize the point marker (starting from in->firstnumber). + setpointmark(*pnewpoint, (int) (points->items) - (!in->firstnumber)); + // Clear all flags. + ((int *) (*pnewpoint))[pointmarkindex + 1] = 0; + // Initialize (set) the point type. + setpointtype(*pnewpoint, vtype); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// initializepools() Calculate the sizes of the point, tetrahedron, and // +// subface. Initialize their memory pools. // +// // +// This routine also computes the indices 'pointmarkindex', 'point2simindex',// +// 'point2pbcptindex', 'elemattribindex', and 'volumeboundindex'. They are // +// used to find values within each point and tetrahedron, respectively. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::initializepools() +{ + int pointsize = 0, elesize = 0, shsize = 0; + int i; + + if (b->verbose) { + printf(" Initializing memorypools.\n"); + printf(" tetrahedron per block: %d.\n", b->tetrahedraperblock); + } + + inittables(); + + // There are three input point lists available, which are in, addin, + // and bgm->in. These point lists may have different number of + // attributes. Decide the maximum number. + numpointattrib = in->numberofpointattributes; + if (bgm != NULL) { + if (bgm->in->numberofpointattributes > numpointattrib) { + numpointattrib = bgm->in->numberofpointattributes; + } + } + if (addin != NULL) { + if (addin->numberofpointattributes > numpointattrib) { + numpointattrib = addin->numberofpointattributes; + } + } + if (b->weighted || b->flipinsert) { // -w or -L. + // The internal number of point attribute needs to be at least 1 + // (for storing point weights). + if (numpointattrib == 0) { + numpointattrib = 1; + } + } + + // Default varconstraint = 0; + if (in->segmentconstraintlist || in->facetconstraintlist) { + checkconstraints = 1; + } + if (b->plc || b->refine) { + // Save the insertion radius for Steiner points if boundaries + // are allowed be split. + if (!b->nobisect || checkconstraints) { + useinsertradius = 1; + } + } + + // The index within each point at which its metric tensor is found. + // Each vertex has three coordinates. + if (b->psc) { + // '-s' option (PSC), the u,v coordinates are provided. + pointmtrindex = 5 + numpointattrib; + // The index within each point at which its u, v coordinates are found. + // Comment: They are saved after the list of point attributes. + pointparamindex = pointmtrindex - 2; + } else { + pointmtrindex = 3 + numpointattrib; + } + // For '-m' option. A tensor field is provided (*.mtr or *.b.mtr file). + if (b->metric) { + // Decide the size (1, 3, or 6) of the metric tensor. + if (bgm != (tetgenmesh *) NULL) { + // A background mesh is allocated. It may not exist though. + sizeoftensor = (bgm->in != (tetgenio *) NULL) ? + bgm->in->numberofpointmtrs : in->numberofpointmtrs; + } else { + // No given background mesh - Itself is a background mesh. + sizeoftensor = in->numberofpointmtrs; + } + // Make sure sizeoftensor is at least 1. + sizeoftensor = (sizeoftensor > 0) ? sizeoftensor : 1; + } else { + // For '-q' option. Make sure to have space for saving a scalar value. + sizeoftensor = b->quality ? 1 : 0; + } + if (useinsertradius) { + // Increase a space (REAL) for saving point insertion radius, it is + // saved directly after the metric. + sizeoftensor++; + } + pointinsradiusindex = pointmtrindex + sizeoftensor - 1; + // The index within each point at which an element pointer is found, where + // the index is measured in pointers. Ensure the index is aligned to a + // sizeof(tetrahedron)-byte address. + point2simindex = ((pointmtrindex + sizeoftensor) * sizeof(REAL) + + sizeof(tetrahedron) - 1) / sizeof(tetrahedron); + if (b->plc || b->refine || b->voroout) { + // Increase the point size by three pointers, which are: + // - a pointer to a tet, read by point2tet(); + // - a pointer to a parent point, read by point2ppt()). + // - a pointer to a subface or segment, read by point2sh(); + if (b->metric && (bgm != (tetgenmesh *) NULL)) { + // Increase one pointer into the background mesh, point2bgmtet(). + pointsize = (point2simindex + 4) * sizeof(tetrahedron); + } else { + pointsize = (point2simindex + 3) * sizeof(tetrahedron); + } + } else { + // Increase the point size by two pointer, which are: + // - a pointer to a tet, read by point2tet(); + // - a pointer to a parent point, read by point2ppt()). -- Used by btree. + pointsize = (point2simindex + 2) * sizeof(tetrahedron); + } + // The index within each point at which the boundary marker is found, + // Ensure the point marker is aligned to a sizeof(int)-byte address. + pointmarkindex = (pointsize + sizeof(int) - 1) / sizeof(int); + // Now point size is the ints (indicated by pointmarkindex) plus: + // - an integer for boundary marker; + // - an integer for vertex type; + // - an integer for geometry tag (optional, -s option). + pointsize = (pointmarkindex + 2 + (b->psc ? 1 : 0)) * sizeof(tetrahedron); + + // Initialize the pool of vertices. + points = new memorypool(pointsize, b->vertexperblock, sizeof(REAL), 0); + + if (b->verbose) { + printf(" Size of a point: %d bytes.\n", points->itembytes); + } + + // Initialize the infinite vertex. + dummypoint = (point) new char[pointsize]; + // Initialize all fields of this point. + dummypoint[0] = 0.0; + dummypoint[1] = 0.0; + dummypoint[2] = 0.0; + for (i = 0; i < numpointattrib; i++) { + dummypoint[3 + i] = 0.0; + } + // Initialize the metric tensor. + for (i = 0; i < sizeoftensor; i++) { + dummypoint[pointmtrindex + i] = 0.0; + } + setpoint2tet(dummypoint, NULL); + setpoint2ppt(dummypoint, NULL); + if (b->plc || b->psc || b->refine) { + // Initialize the point-to-simplex field. + setpoint2sh(dummypoint, NULL); + if (b->metric && (bgm != NULL)) { + setpoint2bgmtet(dummypoint, NULL); + } + } + // Initialize the point marker (starting from in->firstnumber). + setpointmark(dummypoint, -1); // The unique marker for dummypoint. + // Clear all flags. + ((int *) (dummypoint))[pointmarkindex + 1] = 0; + // Initialize (set) the point type. + setpointtype(dummypoint, UNUSEDVERTEX); // Does not matter. + + // The number of bytes occupied by a tetrahedron is varying by the user- + // specified options. The contents of the first 12 pointers are listed + // in the following table: + // [0] |__ neighbor at f0 __| + // [1] |__ neighbor at f1 __| + // [2] |__ neighbor at f2 __| + // [3] |__ neighbor at f3 __| + // [4] |_____ vertex p0 ____| + // [5] |_____ vertex p1 ____| + // [6] |_____ vertex p2 ____| + // [7] |_____ vertex p3 ____| + // [8] |__ segments array __| (used by -p) + // [9] |__ subfaces array __| (used by -p) + // [10] |_____ reserved _____| + // [11] |___ elem marker ____| (used as an integer) + + elesize = 12 * sizeof(tetrahedron); + + // The index to find the element markers. An integer containing varies + // flags and element counter. + if (!(sizeof(int) <= sizeof(tetrahedron)) || + ((sizeof(tetrahedron) % sizeof(int)))) { + terminatetetgen(this, 2); + } + elemmarkerindex = (elesize - sizeof(tetrahedron)) / sizeof(int); + + // The actual number of element attributes. Note that if the + // `b->regionattrib' flag is set, an additional attribute will be added. + numelemattrib = in->numberoftetrahedronattributes + (b->regionattrib > 0); + + // The index within each element at which its attributes are found, where + // the index is measured in REALs. + elemattribindex = (elesize + sizeof(REAL) - 1) / sizeof(REAL); + // The index within each element at which the maximum volume bound is + // found, where the index is measured in REALs. + volumeboundindex = elemattribindex + numelemattrib; + // If element attributes or an constraint are needed, increase the number + // of bytes occupied by an element. + if (b->varvolume) { + elesize = (volumeboundindex + 1) * sizeof(REAL); + } else if (numelemattrib > 0) { + elesize = volumeboundindex * sizeof(REAL); + } + + + // Having determined the memory size of an element, initialize the pool. + tetrahedrons = new memorypool(elesize, b->tetrahedraperblock, sizeof(void *), + 16); + + if (b->verbose) { + printf(" Size of a tetrahedron: %d (%d) bytes.\n", elesize, + tetrahedrons->itembytes); + } + + if (b->plc || b->refine) { // if (b->useshelles) { + // The number of bytes occupied by a subface. The list of pointers + // stored in a subface are: three to other subfaces, three to corners, + // three to subsegments, two to tetrahedra. + shsize = 11 * sizeof(shellface); + // The index within each subface at which the maximum area bound is + // found, where the index is measured in REALs. + areaboundindex = (shsize + sizeof(REAL) - 1) / sizeof(REAL); + // If -q switch is in use, increase the number of bytes occupied by + // a subface for saving maximum area bound. + if (checkconstraints) { + shsize = (areaboundindex + 1) * sizeof(REAL); + } else { + shsize = areaboundindex * sizeof(REAL); + } + // The index within subface at which the facet marker is found. Ensure + // the marker is aligned to a sizeof(int)-byte address. + shmarkindex = (shsize + sizeof(int) - 1) / sizeof(int); + // Increase the number of bytes by two or three integers, one for facet + // marker, one for shellface type and flags, and optionally one + // for storing facet index (for mesh refinement). + shsize = (shmarkindex + 2 + useinsertradius) * sizeof(shellface); + + // Initialize the pool of subfaces. Each subface record is eight-byte + // aligned so it has room to store an edge version (from 0 to 5) in + // the least three bits. + subfaces = new memorypool(shsize, b->shellfaceperblock, sizeof(void *), 8); + + if (b->verbose) { + printf(" Size of a shellface: %d (%d) bytes.\n", shsize, + subfaces->itembytes); + } + + // Initialize the pool of subsegments. The subsegment's record is same + // with subface. + subsegs = new memorypool(shsize, b->shellfaceperblock, sizeof(void *), 8); + + // Initialize the pool for tet-subseg connections. + tet2segpool = new memorypool(6 * sizeof(shellface), b->shellfaceperblock, + sizeof(void *), 0); + // Initialize the pool for tet-subface connections. + tet2subpool = new memorypool(4 * sizeof(shellface), b->shellfaceperblock, + sizeof(void *), 0); + + // Initialize arraypools for segment & facet recovery. + subsegstack = new arraypool(sizeof(face), 10); + subfacstack = new arraypool(sizeof(face), 10); + subvertstack = new arraypool(sizeof(point), 8); + + // Initialize arraypools for surface point insertion/deletion. + caveshlist = new arraypool(sizeof(face), 8); + caveshbdlist = new arraypool(sizeof(face), 8); + cavesegshlist = new arraypool(sizeof(face), 4); + + cavetetshlist = new arraypool(sizeof(face), 8); + cavetetseglist = new arraypool(sizeof(face), 8); + caveencshlist = new arraypool(sizeof(face), 8); + caveencseglist = new arraypool(sizeof(face), 8); + } + + // Initialize the pools for flips. + flippool = new memorypool(sizeof(badface), 1024, sizeof(void *), 0); + unflipqueue = new arraypool(sizeof(badface), 10); + + // Initialize the arraypools for point insertion. + cavetetlist = new arraypool(sizeof(triface), 10); + cavebdrylist = new arraypool(sizeof(triface), 10); + caveoldtetlist = new arraypool(sizeof(triface), 10); + cavetetvertlist = new arraypool(sizeof(point), 10); +} + +//// //// +//// //// +//// mempool_cxx ////////////////////////////////////////////////////////////// + +//// geom_cxx ///////////////////////////////////////////////////////////////// +//// //// +//// //// + +// PI is the ratio of a circle's circumference to its diameter. +REAL tetgenmesh::PI = 3.14159265358979323846264338327950288419716939937510582; + +/////////////////////////////////////////////////////////////////////////////// +// // +// insphere_s() Insphere test with symbolic perturbation. // +// // +// Given four points pa, pb, pc, and pd, test if the point pe lies inside or // +// outside the circumscribed sphere of the four points. // +// // +// Here we assume that the 3d orientation of the point sequence {pa, pb, pc, // +// pd} is positive (NOT zero), i.e., pd lies above the plane passing through // +// points pa, pb, and pc. Otherwise, the returned sign is flipped. // +// // +// Return a positive value (> 0) if pe lies inside, a negative value (< 0) // +// if pe lies outside the sphere, the returned value will not be zero. // +// // +/////////////////////////////////////////////////////////////////////////////// + +REAL tetgenmesh::insphere_s(REAL* pa, REAL* pb, REAL* pc, REAL* pd, REAL* pe) +{ + REAL sign; + + sign = insphere(pa, pb, pc, pd, pe); + if (sign != 0.0) { + return sign; + } + + // Symbolic perturbation. + point pt[5], swappt; + REAL oriA, oriB; + int swaps, count; + int n, i; + + pt[0] = pa; + pt[1] = pb; + pt[2] = pc; + pt[3] = pd; + pt[4] = pe; + + // Sort the five points such that their indices are in the increasing + // order. An optimized bubble sort algorithm is used, i.e., it has + // the worst case O(n^2) runtime, but it is usually much faster. + swaps = 0; // Record the total number of swaps. + n = 5; + do { + count = 0; + n = n - 1; + for (i = 0; i < n; i++) { + if (pointmark(pt[i]) > pointmark(pt[i+1])) { + swappt = pt[i]; pt[i] = pt[i+1]; pt[i+1] = swappt; + count++; + } + } + swaps += count; + } while (count > 0); // Continue if some points are swapped. + + oriA = orient3d(pt[1], pt[2], pt[3], pt[4]); + if (oriA != 0.0) { + // Flip the sign if there are odd number of swaps. + if ((swaps % 2) != 0) oriA = -oriA; + return oriA; + } + + oriB = -orient3d(pt[0], pt[2], pt[3], pt[4]); + if (oriB == 0.0) { + terminatetetgen(this, 2); + } + // Flip the sign if there are odd number of swaps. + if ((swaps % 2) != 0) oriB = -oriB; + return oriB; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// orient4d_s() 4d orientation test with symbolic perturbation. // +// // +// Given four lifted points pa', pb', pc', and pd' in R^4,test if the lifted // +// point pe' in R^4 lies below or above the hyperplane passing through the // +// four points pa', pb', pc', and pd'. // +// // +// Here we assume that the 3d orientation of the point sequence {pa, pb, pc, // +// pd} is positive (NOT zero), i.e., pd lies above the plane passing through // +// the points pa, pb, and pc. Otherwise, the returned sign is flipped. // +// // +// Return a positive value (> 0) if pe' lies below, a negative value (< 0) // +// if pe' lies above the hyperplane, the returned value should not be zero. // +// // +/////////////////////////////////////////////////////////////////////////////// + +REAL tetgenmesh::orient4d_s(REAL* pa, REAL* pb, REAL* pc, REAL* pd, REAL* pe, + REAL aheight, REAL bheight, REAL cheight, + REAL dheight, REAL eheight) +{ + REAL sign; + + sign = orient4d(pa, pb, pc, pd, pe, + aheight, bheight, cheight, dheight, eheight); + if (sign != 0.0) { + return sign; + } + + // Symbolic perturbation. + point pt[5], swappt; + REAL oriA, oriB; + int swaps, count; + int n, i; + + pt[0] = pa; + pt[1] = pb; + pt[2] = pc; + pt[3] = pd; + pt[4] = pe; + + // Sort the five points such that their indices are in the increasing + // order. An optimized bubble sort algorithm is used, i.e., it has + // the worst case O(n^2) runtime, but it is usually much faster. + swaps = 0; // Record the total number of swaps. + n = 5; + do { + count = 0; + n = n - 1; + for (i = 0; i < n; i++) { + if (pointmark(pt[i]) > pointmark(pt[i+1])) { + swappt = pt[i]; pt[i] = pt[i+1]; pt[i+1] = swappt; + count++; + } + } + swaps += count; + } while (count > 0); // Continue if some points are swapped. + + oriA = orient3d(pt[1], pt[2], pt[3], pt[4]); + if (oriA != 0.0) { + // Flip the sign if there are odd number of swaps. + if ((swaps % 2) != 0) oriA = -oriA; + return oriA; + } + + oriB = -orient3d(pt[0], pt[2], pt[3], pt[4]); + if (oriB == 0.0) { + terminatetetgen(this, 2); + } + // Flip the sign if there are odd number of swaps. + if ((swaps % 2) != 0) oriB = -oriB; + return oriB; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// tri_edge_test() Triangle-edge intersection test. // +// // +// This routine takes a triangle T (with vertices A, B, C) and an edge E (P, // +// Q) in 3D, and tests if they intersect each other. // +// // +// If the point 'R' is not NULL, it lies strictly above the plane defined by // +// A, B, C. It is used in test when T and E are coplanar. // +// // +// If T and E intersect each other, they may intersect in different ways. If // +// 'level' > 0, their intersection type will be reported 'types' and 'pos'. // +// // +// The return value indicates one of the following cases: // +// - 0, T and E are disjoint. // +// - 1, T and E intersect each other. // +// - 2, T and E are not coplanar. They intersect at a single point. // +// - 4, T and E are coplanar. They intersect at a single point or a line // +// segment (if types[1] != DISJOINT). // +// // +/////////////////////////////////////////////////////////////////////////////// + +#define SETVECTOR3(V, a0, a1, a2) (V)[0] = (a0); (V)[1] = (a1); (V)[2] = (a2) + +#define SWAP2(a0, a1, tmp) (tmp) = (a0); (a0) = (a1); (a1) = (tmp) + +int tetgenmesh::tri_edge_2d(point A, point B, point C, point P, point Q, + point R, int level, int *types, int *pos) +{ + point U[3], V[3]; // The permuted vectors of points. + int pu[3], pv[3]; // The original positions of points. + REAL abovept[3]; + REAL sA, sB, sC; + REAL s1, s2, s3, s4; + int z1; + + if (R == NULL) { + // Calculate a lift point. + if (1) { + REAL n[3], len; + // Calculate a lift point, saved in dummypoint. + facenormal(A, B, C, n, 1, NULL); + len = sqrt(dot(n, n)); + if (len != 0) { + n[0] /= len; + n[1] /= len; + n[2] /= len; + len = distance(A, B); + len += distance(B, C); + len += distance(C, A); + len /= 3.0; + R = abovept; //dummypoint; + R[0] = A[0] + len * n[0]; + R[1] = A[1] + len * n[1]; + R[2] = A[2] + len * n[2]; + } else { + // The triangle [A,B,C] is (nearly) degenerate, i.e., it is (close) + // to a line. We need a line-line intersection test. + // !!! A non-save return value.!!! + return 0; // DISJOINT + } + } + } + + // Test A's, B's, and C's orientations wrt plane PQR. + sA = orient3d(P, Q, R, A); + sB = orient3d(P, Q, R, B); + sC = orient3d(P, Q, R, C); + + + if (sA < 0) { + if (sB < 0) { + if (sC < 0) { // (---). + return 0; + } else { + if (sC > 0) { // (--+). + // All points are in the right positions. + SETVECTOR3(U, A, B, C); // I3 + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 0, 1, 2); + z1 = 0; + } else { // (--0). + SETVECTOR3(U, A, B, C); // I3 + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 0, 1, 2); + z1 = 1; + } + } + } else { + if (sB > 0) { + if (sC < 0) { // (-+-). + SETVECTOR3(U, C, A, B); // PT = ST + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 2, 0, 1); + SETVECTOR3(pv, 0, 1, 2); + z1 = 0; + } else { + if (sC > 0) { // (-++). + SETVECTOR3(U, B, C, A); // PT = ST x ST + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 1, 2, 0); + SETVECTOR3(pv, 1, 0, 2); + z1 = 0; + } else { // (-+0). + SETVECTOR3(U, C, A, B); // PT = ST + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 2, 0, 1); + SETVECTOR3(pv, 0, 1, 2); + z1 = 2; + } + } + } else { + if (sC < 0) { // (-0-). + SETVECTOR3(U, C, A, B); // PT = ST + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 2, 0, 1); + SETVECTOR3(pv, 0, 1, 2); + z1 = 1; + } else { + if (sC > 0) { // (-0+). + SETVECTOR3(U, B, C, A); // PT = ST x ST + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 1, 2, 0); + SETVECTOR3(pv, 1, 0, 2); + z1 = 2; + } else { // (-00). + SETVECTOR3(U, B, C, A); // PT = ST x ST + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 1, 2, 0); + SETVECTOR3(pv, 1, 0, 2); + z1 = 3; + } + } + } + } + } else { + if (sA > 0) { + if (sB < 0) { + if (sC < 0) { // (+--). + SETVECTOR3(U, B, C, A); // PT = ST x ST + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 1, 2, 0); + SETVECTOR3(pv, 0, 1, 2); + z1 = 0; + } else { + if (sC > 0) { // (+-+). + SETVECTOR3(U, C, A, B); // PT = ST + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 2, 0, 1); + SETVECTOR3(pv, 1, 0, 2); + z1 = 0; + } else { // (+-0). + SETVECTOR3(U, C, A, B); // PT = ST + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 2, 0, 1); + SETVECTOR3(pv, 1, 0, 2); + z1 = 2; + } + } + } else { + if (sB > 0) { + if (sC < 0) { // (++-). + SETVECTOR3(U, A, B, C); // I3 + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 1, 0, 2); + z1 = 0; + } else { + if (sC > 0) { // (+++). + return 0; + } else { // (++0). + SETVECTOR3(U, A, B, C); // I3 + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 1, 0, 2); + z1 = 1; + } + } + } else { // (+0#) + if (sC < 0) { // (+0-). + SETVECTOR3(U, B, C, A); // PT = ST x ST + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 1, 2, 0); + SETVECTOR3(pv, 0, 1, 2); + z1 = 2; + } else { + if (sC > 0) { // (+0+). + SETVECTOR3(U, C, A, B); // PT = ST + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 2, 0, 1); + SETVECTOR3(pv, 1, 0, 2); + z1 = 1; + } else { // (+00). + SETVECTOR3(U, B, C, A); // PT = ST x ST + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 1, 2, 0); + SETVECTOR3(pv, 0, 1, 2); + z1 = 3; + } + } + } + } + } else { + if (sB < 0) { + if (sC < 0) { // (0--). + SETVECTOR3(U, B, C, A); // PT = ST x ST + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 1, 2, 0); + SETVECTOR3(pv, 0, 1, 2); + z1 = 1; + } else { + if (sC > 0) { // (0-+). + SETVECTOR3(U, A, B, C); // I3 + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 0, 1, 2); + z1 = 2; + } else { // (0-0). + SETVECTOR3(U, C, A, B); // PT = ST + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 2, 0, 1); + SETVECTOR3(pv, 1, 0, 2); + z1 = 3; + } + } + } else { + if (sB > 0) { + if (sC < 0) { // (0+-). + SETVECTOR3(U, A, B, C); // I3 + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 1, 0, 2); + z1 = 2; + } else { + if (sC > 0) { // (0++). + SETVECTOR3(U, B, C, A); // PT = ST x ST + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 1, 2, 0); + SETVECTOR3(pv, 1, 0, 2); + z1 = 1; + } else { // (0+0). + SETVECTOR3(U, C, A, B); // PT = ST + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 2, 0, 1); + SETVECTOR3(pv, 0, 1, 2); + z1 = 3; + } + } + } else { // (00#) + if (sC < 0) { // (00-). + SETVECTOR3(U, A, B, C); // I3 + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 1, 0, 2); + z1 = 3; + } else { + if (sC > 0) { // (00+). + SETVECTOR3(U, A, B, C); // I3 + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 0, 1, 2); + z1 = 3; + } else { // (000) + // Not possible unless ABC is degenerate. + // Avoiding compiler warnings. + SETVECTOR3(U, A, B, C); // I3 + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 0, 1, 2); + z1 = 4; + } + } + } + } + } + } + + s1 = orient3d(U[0], U[2], R, V[1]); // A, C, R, Q + s2 = orient3d(U[1], U[2], R, V[0]); // B, C, R, P + + if (s1 > 0) { + return 0; + } + if (s2 < 0) { + return 0; + } + + if (level == 0) { + return 1; // They are intersected. + } + + + if (z1 == 1) { + if (s1 == 0) { // (0###) + // C = Q. + types[0] = (int) SHAREVERT; + pos[0] = pu[2]; // C + pos[1] = pv[1]; // Q + types[1] = (int) DISJOINT; + } else { + if (s2 == 0) { // (#0##) + // C = P. + types[0] = (int) SHAREVERT; + pos[0] = pu[2]; // C + pos[1] = pv[0]; // P + types[1] = (int) DISJOINT; + } else { // (-+##) + // C in [P, Q]. + types[0] = (int) ACROSSVERT; + pos[0] = pu[2]; // C + pos[1] = pv[0]; // [P, Q] + types[1] = (int) DISJOINT; + } + } + return 4; + } + + s3 = orient3d(U[0], U[2], R, V[0]); // A, C, R, P + s4 = orient3d(U[1], U[2], R, V[1]); // B, C, R, Q + + if (z1 == 0) { // (tritri-03) + if (s1 < 0) { + if (s3 > 0) { + if (s4 > 0) { + // [P, Q] overlaps [k, l] (-+++). + types[0] = (int) ACROSSEDGE; + pos[0] = pu[2]; // [C, A] + pos[1] = pv[0]; // [P, Q] + types[1] = (int) TOUCHFACE; + pos[2] = 3; // [A, B, C] + pos[3] = pv[1]; // Q + } else { + if (s4 == 0) { + // Q = l, [P, Q] contains [k, l] (-++0). + types[0] = (int) ACROSSEDGE; + pos[0] = pu[2]; // [C, A] + pos[1] = pv[0]; // [P, Q] + types[1] = (int) TOUCHEDGE; + pos[2] = pu[1]; // [B, C] + pos[3] = pv[1]; // Q + } else { // s4 < 0 + // [P, Q] contains [k, l] (-++-). + types[0] = (int) ACROSSEDGE; + pos[0] = pu[2]; // [C, A] + pos[1] = pv[0]; // [P, Q] + types[1] = (int) ACROSSEDGE; + pos[2] = pu[1]; // [B, C] + pos[3] = pv[0]; // [P, Q] + } + } + } else { + if (s3 == 0) { + if (s4 > 0) { + // P = k, [P, Q] in [k, l] (-+0+). + types[0] = (int) TOUCHEDGE; + pos[0] = pu[2]; // [C, A] + pos[1] = pv[0]; // P + types[1] = (int) TOUCHFACE; + pos[2] = 3; // [A, B, C] + pos[3] = pv[1]; // Q + } else { + if (s4 == 0) { + // [P, Q] = [k, l] (-+00). + types[0] = (int) TOUCHEDGE; + pos[0] = pu[2]; // [C, A] + pos[1] = pv[0]; // P + types[1] = (int) TOUCHEDGE; + pos[2] = pu[1]; // [B, C] + pos[3] = pv[1]; // Q + } else { + // P = k, [P, Q] contains [k, l] (-+0-). + types[0] = (int) TOUCHEDGE; + pos[0] = pu[2]; // [C, A] + pos[1] = pv[0]; // P + types[1] = (int) ACROSSEDGE; + pos[2] = pu[1]; // [B, C] + pos[3] = pv[0]; // [P, Q] + } + } + } else { // s3 < 0 + if (s2 > 0) { + if (s4 > 0) { + // [P, Q] in [k, l] (-+-+). + types[0] = (int) TOUCHFACE; + pos[0] = 3; // [A, B, C] + pos[1] = pv[0]; // P + types[1] = (int) TOUCHFACE; + pos[2] = 3; // [A, B, C] + pos[3] = pv[1]; // Q + } else { + if (s4 == 0) { + // Q = l, [P, Q] in [k, l] (-+-0). + types[0] = (int) TOUCHFACE; + pos[0] = 3; // [A, B, C] + pos[1] = pv[0]; // P + types[1] = (int) TOUCHEDGE; + pos[2] = pu[1]; // [B, C] + pos[3] = pv[1]; // Q + } else { // s4 < 0 + // [P, Q] overlaps [k, l] (-+--). + types[0] = (int) TOUCHFACE; + pos[0] = 3; // [A, B, C] + pos[1] = pv[0]; // P + types[1] = (int) ACROSSEDGE; + pos[2] = pu[1]; // [B, C] + pos[3] = pv[0]; // [P, Q] + } + } + } else { // s2 == 0 + // P = l (#0##). + types[0] = (int) TOUCHEDGE; + pos[0] = pu[1]; // [B, C] + pos[1] = pv[0]; // P + types[1] = (int) DISJOINT; + } + } + } + } else { // s1 == 0 + // Q = k (0####) + types[0] = (int) TOUCHEDGE; + pos[0] = pu[2]; // [C, A] + pos[1] = pv[1]; // Q + types[1] = (int) DISJOINT; + } + } else if (z1 == 2) { // (tritri-23) + if (s1 < 0) { + if (s3 > 0) { + if (s4 > 0) { + // [P, Q] overlaps [A, l] (-+++). + types[0] = (int) ACROSSVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // [P, Q] + types[1] = (int) TOUCHFACE; + pos[2] = 3; // [A, B, C] + pos[3] = pv[1]; // Q + } else { + if (s4 == 0) { + // Q = l, [P, Q] contains [A, l] (-++0). + types[0] = (int) ACROSSVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // [P, Q] + types[1] = (int) TOUCHEDGE; + pos[2] = pu[1]; // [B, C] + pos[3] = pv[1]; // Q + } else { // s4 < 0 + // [P, Q] contains [A, l] (-++-). + types[0] = (int) ACROSSVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // [P, Q] + types[1] = (int) ACROSSEDGE; + pos[2] = pu[1]; // [B, C] + pos[3] = pv[0]; // [P, Q] + } + } + } else { + if (s3 == 0) { + if (s4 > 0) { + // P = A, [P, Q] in [A, l] (-+0+). + types[0] = (int) SHAREVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // P + types[1] = (int) TOUCHFACE; + pos[2] = 3; // [A, B, C] + pos[3] = pv[1]; // Q + } else { + if (s4 == 0) { + // [P, Q] = [A, l] (-+00). + types[0] = (int) SHAREVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // P + types[1] = (int) TOUCHEDGE; + pos[2] = pu[1]; // [B, C] + pos[3] = pv[1]; // Q + } else { // s4 < 0 + // Q = l, [P, Q] in [A, l] (-+0-). + types[0] = (int) SHAREVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // P + types[1] = (int) ACROSSEDGE; + pos[2] = pu[1]; // [B, C] + pos[3] = pv[0]; // [P, Q] + } + } + } else { // s3 < 0 + if (s2 > 0) { + if (s4 > 0) { + // [P, Q] in [A, l] (-+-+). + types[0] = (int) TOUCHFACE; + pos[0] = 3; // [A, B, C] + pos[1] = pv[0]; // P + types[0] = (int) TOUCHFACE; + pos[0] = 3; // [A, B, C] + pos[1] = pv[1]; // Q + } else { + if (s4 == 0) { + // Q = l, [P, Q] in [A, l] (-+-0). + types[0] = (int) TOUCHFACE; + pos[0] = 3; // [A, B, C] + pos[1] = pv[0]; // P + types[0] = (int) TOUCHEDGE; + pos[0] = pu[1]; // [B, C] + pos[1] = pv[1]; // Q + } else { // s4 < 0 + // [P, Q] overlaps [A, l] (-+--). + types[0] = (int) TOUCHFACE; + pos[0] = 3; // [A, B, C] + pos[1] = pv[0]; // P + types[0] = (int) ACROSSEDGE; + pos[0] = pu[1]; // [B, C] + pos[1] = pv[0]; // [P, Q] + } + } + } else { // s2 == 0 + // P = l (#0##). + types[0] = (int) TOUCHEDGE; + pos[0] = pu[1]; // [B, C] + pos[1] = pv[0]; // P + types[1] = (int) DISJOINT; + } + } + } + } else { // s1 == 0 + // Q = A (0###). + types[0] = (int) SHAREVERT; + pos[0] = pu[0]; // A + pos[1] = pv[1]; // Q + types[1] = (int) DISJOINT; + } + } else if (z1 == 3) { // (tritri-33) + if (s1 < 0) { + if (s3 > 0) { + if (s4 > 0) { + // [P, Q] overlaps [A, B] (-+++). + types[0] = (int) ACROSSVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // [P, Q] + types[1] = (int) TOUCHEDGE; + pos[2] = pu[0]; // [A, B] + pos[3] = pv[1]; // Q + } else { + if (s4 == 0) { + // Q = B, [P, Q] contains [A, B] (-++0). + types[0] = (int) ACROSSVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // [P, Q] + types[1] = (int) SHAREVERT; + pos[2] = pu[1]; // B + pos[3] = pv[1]; // Q + } else { // s4 < 0 + // [P, Q] contains [A, B] (-++-). + types[0] = (int) ACROSSVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // [P, Q] + types[1] = (int) ACROSSVERT; + pos[2] = pu[1]; // B + pos[3] = pv[0]; // [P, Q] + } + } + } else { + if (s3 == 0) { + if (s4 > 0) { + // P = A, [P, Q] in [A, B] (-+0+). + types[0] = (int) SHAREVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // P + types[1] = (int) TOUCHEDGE; + pos[2] = pu[0]; // [A, B] + pos[3] = pv[1]; // Q + } else { + if (s4 == 0) { + // [P, Q] = [A, B] (-+00). + types[0] = (int) SHAREEDGE; + pos[0] = pu[0]; // [A, B] + pos[1] = pv[0]; // [P, Q] + types[1] = (int) DISJOINT; + } else { // s4 < 0 + // P= A, [P, Q] in [A, B] (-+0-). + types[0] = (int) SHAREVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // P + types[1] = (int) ACROSSVERT; + pos[2] = pu[1]; // B + pos[3] = pv[0]; // [P, Q] + } + } + } else { // s3 < 0 + if (s2 > 0) { + if (s4 > 0) { + // [P, Q] in [A, B] (-+-+). + types[0] = (int) TOUCHEDGE; + pos[0] = pu[0]; // [A, B] + pos[1] = pv[0]; // P + types[1] = (int) TOUCHEDGE; + pos[2] = pu[0]; // [A, B] + pos[3] = pv[1]; // Q + } else { + if (s4 == 0) { + // Q = B, [P, Q] in [A, B] (-+-0). + types[0] = (int) TOUCHEDGE; + pos[0] = pu[0]; // [A, B] + pos[1] = pv[0]; // P + types[1] = (int) SHAREVERT; + pos[2] = pu[1]; // B + pos[3] = pv[1]; // Q + } else { // s4 < 0 + // [P, Q] overlaps [A, B] (-+--). + types[0] = (int) TOUCHEDGE; + pos[0] = pu[0]; // [A, B] + pos[1] = pv[0]; // P + types[1] = (int) ACROSSVERT; + pos[2] = pu[1]; // B + pos[3] = pv[0]; // [P, Q] + } + } + } else { // s2 == 0 + // P = B (#0##). + types[0] = (int) SHAREVERT; + pos[0] = pu[1]; // B + pos[1] = pv[0]; // P + types[1] = (int) DISJOINT; + } + } + } + } else { // s1 == 0 + // Q = A (0###). + types[0] = (int) SHAREVERT; + pos[0] = pu[0]; // A + pos[1] = pv[1]; // Q + types[1] = (int) DISJOINT; + } + } + + return 4; +} + +int tetgenmesh::tri_edge_tail(point A,point B,point C,point P,point Q,point R, + REAL sP,REAL sQ,int level,int *types,int *pos) +{ + point U[3], V[3]; //, Ptmp; + int pu[3], pv[3]; //, itmp; + REAL s1, s2, s3; + int z1; + + + if (sP < 0) { + if (sQ < 0) { // (--) disjoint + return 0; + } else { + if (sQ > 0) { // (-+) + SETVECTOR3(U, A, B, C); + SETVECTOR3(V, P, Q, R); + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 0, 1, 2); + z1 = 0; + } else { // (-0) + SETVECTOR3(U, A, B, C); + SETVECTOR3(V, P, Q, R); + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 0, 1, 2); + z1 = 1; + } + } + } else { + if (sP > 0) { // (+-) + if (sQ < 0) { + SETVECTOR3(U, A, B, C); + SETVECTOR3(V, Q, P, R); // P and Q are flipped. + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 1, 0, 2); + z1 = 0; + } else { + if (sQ > 0) { // (++) disjoint + return 0; + } else { // (+0) + SETVECTOR3(U, B, A, C); // A and B are flipped. + SETVECTOR3(V, P, Q, R); + SETVECTOR3(pu, 1, 0, 2); + SETVECTOR3(pv, 0, 1, 2); + z1 = 1; + } + } + } else { // sP == 0 + if (sQ < 0) { // (0-) + SETVECTOR3(U, A, B, C); + SETVECTOR3(V, Q, P, R); // P and Q are flipped. + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 1, 0, 2); + z1 = 1; + } else { + if (sQ > 0) { // (0+) + SETVECTOR3(U, B, A, C); // A and B are flipped. + SETVECTOR3(V, Q, P, R); // P and Q are flipped. + SETVECTOR3(pu, 1, 0, 2); + SETVECTOR3(pv, 1, 0, 2); + z1 = 1; + } else { // (00) + // A, B, C, P, and Q are coplanar. + z1 = 2; + } + } + } + } + + if (z1 == 2) { + // The triangle and the edge are coplanar. + return tri_edge_2d(A, B, C, P, Q, R, level, types, pos); + } + + s1 = orient3d(U[0], U[1], V[0], V[1]); + if (s1 < 0) { + return 0; + } + + s2 = orient3d(U[1], U[2], V[0], V[1]); + if (s2 < 0) { + return 0; + } + + s3 = orient3d(U[2], U[0], V[0], V[1]); + if (s3 < 0) { + return 0; + } + + if (level == 0) { + return 1; // The are intersected. + } + + types[1] = (int) DISJOINT; // No second intersection point. + + if (z1 == 0) { + if (s1 > 0) { + if (s2 > 0) { + if (s3 > 0) { // (+++) + // [P, Q] passes interior of [A, B, C]. + types[0] = (int) ACROSSFACE; + pos[0] = 3; // interior of [A, B, C] + pos[1] = 0; // [P, Q] + } else { // s3 == 0 (++0) + // [P, Q] intersects [C, A]. + types[0] = (int) ACROSSEDGE; + pos[0] = pu[2]; // [C, A] + pos[1] = 0; // [P, Q] + } + } else { // s2 == 0 + if (s3 > 0) { // (+0+) + // [P, Q] intersects [B, C]. + types[0] = (int) ACROSSEDGE; + pos[0] = pu[1]; // [B, C] + pos[1] = 0; // [P, Q] + } else { // s3 == 0 (+00) + // [P, Q] passes C. + types[0] = (int) ACROSSVERT; + pos[0] = pu[2]; // C + pos[1] = 0; // [P, Q] + } + } + } else { // s1 == 0 + if (s2 > 0) { + if (s3 > 0) { // (0++) + // [P, Q] intersects [A, B]. + types[0] = (int) ACROSSEDGE; + pos[0] = pu[0]; // [A, B] + pos[1] = 0; // [P, Q] + } else { // s3 == 0 (0+0) + // [P, Q] passes A. + types[0] = (int) ACROSSVERT; + pos[0] = pu[0]; // A + pos[1] = 0; // [P, Q] + } + } else { // s2 == 0 + if (s3 > 0) { // (00+) + // [P, Q] passes B. + types[0] = (int) ACROSSVERT; + pos[0] = pu[1]; // B + pos[1] = 0; // [P, Q] + } + } + } + } else { // z1 == 1 + if (s1 > 0) { + if (s2 > 0) { + if (s3 > 0) { // (+++) + // Q lies in [A, B, C]. + types[0] = (int) TOUCHFACE; + pos[0] = 0; // [A, B, C] + pos[1] = pv[1]; // Q + } else { // s3 == 0 (++0) + // Q lies on [C, A]. + types[0] = (int) TOUCHEDGE; + pos[0] = pu[2]; // [C, A] + pos[1] = pv[1]; // Q + } + } else { // s2 == 0 + if (s3 > 0) { // (+0+) + // Q lies on [B, C]. + types[0] = (int) TOUCHEDGE; + pos[0] = pu[1]; // [B, C] + pos[1] = pv[1]; // Q + } else { // s3 == 0 (+00) + // Q = C. + types[0] = (int) SHAREVERT; + pos[0] = pu[2]; // C + pos[1] = pv[1]; // Q + } + } + } else { // s1 == 0 + if (s2 > 0) { + if (s3 > 0) { // (0++) + // Q lies on [A, B]. + types[0] = (int) TOUCHEDGE; + pos[0] = pu[0]; // [A, B] + pos[1] = pv[1]; // Q + } else { // s3 == 0 (0+0) + // Q = A. + types[0] = (int) SHAREVERT; + pos[0] = pu[0]; // A + pos[1] = pv[1]; // Q + } + } else { // s2 == 0 + if (s3 > 0) { // (00+) + // Q = B. + types[0] = (int) SHAREVERT; + pos[0] = pu[1]; // B + pos[1] = pv[1]; // Q + } + } + } + } + + // T and E intersect in a single point. + return 2; +} + +int tetgenmesh::tri_edge_test(point A, point B, point C, point P, point Q, + point R, int level, int *types, int *pos) +{ + REAL sP, sQ; + + // Test the locations of P and Q with respect to ABC. + sP = orient3d(A, B, C, P); + sQ = orient3d(A, B, C, Q); + + return tri_edge_tail(A, B, C, P, Q, R, sP, sQ, level, types, pos); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// tri_tri_inter() Test whether two triangle (abc) and (opq) are // +// intersecting or not. // +// // +// Return 0 if they are disjoint. Otherwise, return 1. 'type' returns one of // +// the four cases: SHAREVERTEX, SHAREEDGE, SHAREFACE, and INTERSECT. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::tri_edge_inter_tail(REAL* A, REAL* B, REAL* C, REAL* P, + REAL* Q, REAL s_p, REAL s_q) +{ + int types[2], pos[4]; + int ni; // =0, 2, 4 + + ni = tri_edge_tail(A, B, C, P, Q, NULL, s_p, s_q, 1, types, pos); + + if (ni > 0) { + if (ni == 2) { + // Get the intersection type. + if (types[0] == (int) SHAREVERT) { + return (int) SHAREVERT; + } else { + return (int) INTERSECT; + } + } else if (ni == 4) { + // There may be two intersections. + if (types[0] == (int) SHAREVERT) { + if (types[1] == (int) DISJOINT) { + return (int) SHAREVERT; + } else { + return (int) INTERSECT; + } + } else { + if (types[0] == (int) SHAREEDGE) { + return (int) SHAREEDGE; + } else { + return (int) INTERSECT; + } + } + } + } + + return (int) DISJOINT; +} + +int tetgenmesh::tri_tri_inter(REAL* A,REAL* B,REAL* C,REAL* O,REAL* P,REAL* Q) +{ + REAL s_o, s_p, s_q; + REAL s_a, s_b, s_c; + + s_o = orient3d(A, B, C, O); + s_p = orient3d(A, B, C, P); + s_q = orient3d(A, B, C, Q); + if ((s_o * s_p > 0.0) && (s_o * s_q > 0.0)) { + // o, p, q are all in the same halfspace of ABC. + return 0; // DISJOINT; + } + + s_a = orient3d(O, P, Q, A); + s_b = orient3d(O, P, Q, B); + s_c = orient3d(O, P, Q, C); + if ((s_a * s_b > 0.0) && (s_a * s_c > 0.0)) { + // a, b, c are all in the same halfspace of OPQ. + return 0; // DISJOINT; + } + + int abcop, abcpq, abcqo; + int shareedge = 0; + + abcop = tri_edge_inter_tail(A, B, C, O, P, s_o, s_p); + if (abcop == (int) INTERSECT) { + return (int) INTERSECT; + } else if (abcop == (int) SHAREEDGE) { + shareedge++; + } + abcpq = tri_edge_inter_tail(A, B, C, P, Q, s_p, s_q); + if (abcpq == (int) INTERSECT) { + return (int) INTERSECT; + } else if (abcpq == (int) SHAREEDGE) { + shareedge++; + } + abcqo = tri_edge_inter_tail(A, B, C, Q, O, s_q, s_o); + if (abcqo == (int) INTERSECT) { + return (int) INTERSECT; + } else if (abcqo == (int) SHAREEDGE) { + shareedge++; + } + if (shareedge == 3) { + // opq are coincident with abc. + return (int) SHAREFACE; + } + + // Continue to detect whether opq and abc are intersecting or not. + int opqab, opqbc, opqca; + + opqab = tri_edge_inter_tail(O, P, Q, A, B, s_a, s_b); + if (opqab == (int) INTERSECT) { + return (int) INTERSECT; + } + opqbc = tri_edge_inter_tail(O, P, Q, B, C, s_b, s_c); + if (opqbc == (int) INTERSECT) { + return (int) INTERSECT; + } + opqca = tri_edge_inter_tail(O, P, Q, C, A, s_c, s_a); + if (opqca == (int) INTERSECT) { + return (int) INTERSECT; + } + + // At this point, two triangles are not intersecting and not coincident. + // They may be share an edge, or share a vertex, or disjoint. + if (abcop == (int) SHAREEDGE) { + // op is coincident with an edge of abc. + return (int) SHAREEDGE; + } + if (abcpq == (int) SHAREEDGE) { + // pq is coincident with an edge of abc. + return (int) SHAREEDGE; + } + if (abcqo == (int) SHAREEDGE) { + // qo is coincident with an edge of abc. + return (int) SHAREEDGE; + } + + // They may share a vertex or disjoint. + if (abcop == (int) SHAREVERT) { + return (int) SHAREVERT; + } + if (abcpq == (int) SHAREVERT) { + // q is the coincident vertex. + return (int) SHAREVERT; + } + + // They are disjoint. + return (int) DISJOINT; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// lu_decmp() Compute the LU decomposition of a matrix. // +// // +// Compute the LU decomposition of a (non-singular) square matrix A using // +// partial pivoting and implicit row exchanges. The result is: // +// A = P * L * U, // +// where P is a permutation matrix, L is unit lower triangular, and U is // +// upper triangular. The factored form of A is used in combination with // +// 'lu_solve()' to solve linear equations: Ax = b, or invert a matrix. // +// // +// The inputs are a square matrix 'lu[N..n+N-1][N..n+N-1]', it's size is 'n'.// +// On output, 'lu' is replaced by the LU decomposition of a rowwise permuta- // +// tion of itself, 'ps[N..n+N-1]' is an output vector that records the row // +// permutation effected by the partial pivoting, effectively, 'ps' array // +// tells the user what the permutation matrix P is; 'd' is output as +1/-1 // +// depending on whether the number of row interchanges was even or odd, // +// respectively. // +// // +// Return true if the LU decomposition is successfully computed, otherwise, // +// return false in case that A is a singular matrix. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenmesh::lu_decmp(REAL lu[4][4], int n, int* ps, REAL* d, int N) +{ + REAL scales[4]; + REAL pivot, biggest, mult, tempf; + int pivotindex = 0; + int i, j, k; + + *d = 1.0; // No row interchanges yet. + + for (i = N; i < n + N; i++) { // For each row. + // Find the largest element in each row for row equilibration + biggest = 0.0; + for (j = N; j < n + N; j++) + if (biggest < (tempf = fabs(lu[i][j]))) + biggest = tempf; + if (biggest != 0.0) + scales[i] = 1.0 / biggest; + else { + scales[i] = 0.0; + return false; // Zero row: singular matrix. + } + ps[i] = i; // Initialize pivot sequence. + } + + for (k = N; k < n + N - 1; k++) { // For each column. + // Find the largest element in each column to pivot around. + biggest = 0.0; + for (i = k; i < n + N; i++) { + if (biggest < (tempf = fabs(lu[ps[i]][k]) * scales[ps[i]])) { + biggest = tempf; + pivotindex = i; + } + } + if (biggest == 0.0) { + return false; // Zero column: singular matrix. + } + if (pivotindex != k) { // Update pivot sequence. + j = ps[k]; + ps[k] = ps[pivotindex]; + ps[pivotindex] = j; + *d = -(*d); // ...and change the parity of d. + } + + // Pivot, eliminating an extra variable each time + pivot = lu[ps[k]][k]; + for (i = k + 1; i < n + N; i++) { + lu[ps[i]][k] = mult = lu[ps[i]][k] / pivot; + if (mult != 0.0) { + for (j = k + 1; j < n + N; j++) + lu[ps[i]][j] -= mult * lu[ps[k]][j]; + } + } + } + + // (lu[ps[n + N - 1]][n + N - 1] == 0.0) ==> A is singular. + return lu[ps[n + N - 1]][n + N - 1] != 0.0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// lu_solve() Solves the linear equation: Ax = b, after the matrix A // +// has been decomposed into the lower and upper triangular // +// matrices L and U, where A = LU. // +// // +// 'lu[N..n+N-1][N..n+N-1]' is input, not as the matrix 'A' but rather as // +// its LU decomposition, computed by the routine 'lu_decmp'; 'ps[N..n+N-1]' // +// is input as the permutation vector returned by 'lu_decmp'; 'b[N..n+N-1]' // +// is input as the right-hand side vector, and returns with the solution // +// vector. 'lu', 'n', and 'ps' are not modified by this routine and can be // +// left in place for successive calls with different right-hand sides 'b'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::lu_solve(REAL lu[4][4], int n, int* ps, REAL* b, int N) +{ + int i, j; + REAL X[4], dot; + + for (i = N; i < n + N; i++) X[i] = 0.0; + + // Vector reduction using U triangular matrix. + for (i = N; i < n + N; i++) { + dot = 0.0; + for (j = N; j < i + N; j++) + dot += lu[ps[i]][j] * X[j]; + X[i] = b[ps[i]] - dot; + } + + // Back substitution, in L triangular matrix. + for (i = n + N - 1; i >= N; i--) { + dot = 0.0; + for (j = i + 1; j < n + N; j++) + dot += lu[ps[i]][j] * X[j]; + X[i] = (X[i] - dot) / lu[ps[i]][i]; + } + + for (i = N; i < n + N; i++) b[i] = X[i]; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// incircle3d() 3D in-circle test. // +// // +// Return a negative value if pd is inside the circumcircle of the triangle // +// pa, pb, and pc. // +// // +// IMPORTANT: It assumes that [a,b] is the common edge, i.e., the two input // +// triangles are [a,b,c] and [b,a,d]. // +// // +/////////////////////////////////////////////////////////////////////////////// + +REAL tetgenmesh::incircle3d(point pa, point pb, point pc, point pd) +{ + REAL area2[2], n1[3], n2[3], c[3]; + REAL sign, r, d; + + // Calculate the areas of the two triangles [a, b, c] and [b, a, d]. + facenormal(pa, pb, pc, n1, 1, NULL); + area2[0] = dot(n1, n1); + facenormal(pb, pa, pd, n2, 1, NULL); + area2[1] = dot(n2, n2); + + if (area2[0] > area2[1]) { + // Choose [a, b, c] as the base triangle. + circumsphere(pa, pb, pc, NULL, c, &r); + d = distance(c, pd); + } else { + // Choose [b, a, d] as the base triangle. + if (area2[1] > 0) { + circumsphere(pb, pa, pd, NULL, c, &r); + d = distance(c, pc); + } else { + // The four points are collinear. This case only happens on the boundary. + return 0; // Return "not inside". + } + } + + sign = d - r; + if (fabs(sign) / r < b->epsilon) { + sign = 0; + } + + return sign; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// facenormal() Calculate the normal of the face. // +// // +// The normal of the face abc can be calculated by the cross product of 2 of // +// its 3 edge vectors. A better choice of two edge vectors will reduce the // +// numerical error during the calculation. Burdakov proved that the optimal // +// basis problem is equivalent to the minimum spanning tree problem with the // +// edge length be the functional, see Burdakov, "A greedy algorithm for the // +// optimal basis problem", BIT 37:3 (1997), 591-599. If 'pivot' > 0, the two // +// short edges in abc are chosen for the calculation. // +// // +// If 'lav' is not NULL and if 'pivot' is set, the average edge length of // +// the edges of the face [a,b,c] is returned. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::facenormal(point pa, point pb, point pc, REAL *n, int pivot, + REAL* lav) +{ + REAL v1[3], v2[3], v3[3], *pv1, *pv2; + REAL L1, L2, L3; + + v1[0] = pb[0] - pa[0]; // edge vector v1: a->b + v1[1] = pb[1] - pa[1]; + v1[2] = pb[2] - pa[2]; + v2[0] = pa[0] - pc[0]; // edge vector v2: c->a + v2[1] = pa[1] - pc[1]; + v2[2] = pa[2] - pc[2]; + + // Default, normal is calculated by: v1 x (-v2) (see Fig. fnormal). + if (pivot > 0) { + // Choose edge vectors by Burdakov's algorithm. + v3[0] = pc[0] - pb[0]; // edge vector v3: b->c + v3[1] = pc[1] - pb[1]; + v3[2] = pc[2] - pb[2]; + L1 = dot(v1, v1); + L2 = dot(v2, v2); + L3 = dot(v3, v3); + // Sort the three edge lengths. + if (L1 < L2) { + if (L2 < L3) { + pv1 = v1; pv2 = v2; // n = v1 x (-v2). + } else { + pv1 = v3; pv2 = v1; // n = v3 x (-v1). + } + } else { + if (L1 < L3) { + pv1 = v1; pv2 = v2; // n = v1 x (-v2). + } else { + pv1 = v2; pv2 = v3; // n = v2 x (-v3). + } + } + if (lav) { + // return the average edge length. + *lav = (sqrt(L1) + sqrt(L2) + sqrt(L3)) / 3.0; + } + } else { + pv1 = v1; pv2 = v2; // n = v1 x (-v2). + } + + // Calculate the face normal. + cross(pv1, pv2, n); + // Inverse the direction; + n[0] = -n[0]; + n[1] = -n[1]; + n[2] = -n[2]; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// shortdistance() Returns the shortest distance from point p to a line // +// defined by two points e1 and e2. // +// // +// First compute the projection length l_p of the vector v1 = p - e1 along // +// the vector v2 = e2 - e1. Then Pythagoras' Theorem is used to compute the // +// shortest distance. // +// // +// This routine allows that p is collinear with the line. In this case, the // +// return value is zero. The two points e1 and e2 should not be identical. // +// // +/////////////////////////////////////////////////////////////////////////////// + +REAL tetgenmesh::shortdistance(REAL* p, REAL* e1, REAL* e2) +{ + REAL v1[3], v2[3]; + REAL len, l_p; + + v1[0] = e2[0] - e1[0]; + v1[1] = e2[1] - e1[1]; + v1[2] = e2[2] - e1[2]; + v2[0] = p[0] - e1[0]; + v2[1] = p[1] - e1[1]; + v2[2] = p[2] - e1[2]; + + len = sqrt(dot(v1, v1)); + + v1[0] /= len; + v1[1] /= len; + v1[2] /= len; + l_p = dot(v1, v2); + + return sqrt(dot(v2, v2) - l_p * l_p); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// triarea() Return the area of a triangle. // +// // +/////////////////////////////////////////////////////////////////////////////// + +REAL tetgenmesh::triarea(REAL* pa, REAL* pb, REAL* pc) +{ + REAL A[4][4]; + + // Compute the coefficient matrix A (3x3). + A[0][0] = pb[0] - pa[0]; + A[0][1] = pb[1] - pa[1]; + A[0][2] = pb[2] - pa[2]; // vector V1 (pa->pb) + A[1][0] = pc[0] - pa[0]; + A[1][1] = pc[1] - pa[1]; + A[1][2] = pc[2] - pa[2]; // vector V2 (pa->pc) + + cross(A[0], A[1], A[2]); // vector V3 (V1 X V2) + + return 0.5 * sqrt(dot(A[2], A[2])); // The area of [a,b,c]. +} + +REAL tetgenmesh::orient3dfast(REAL *pa, REAL *pb, REAL *pc, REAL *pd) +{ + REAL adx, bdx, cdx; + REAL ady, bdy, cdy; + REAL adz, bdz, cdz; + + adx = pa[0] - pd[0]; + bdx = pb[0] - pd[0]; + cdx = pc[0] - pd[0]; + ady = pa[1] - pd[1]; + bdy = pb[1] - pd[1]; + cdy = pc[1] - pd[1]; + adz = pa[2] - pd[2]; + bdz = pb[2] - pd[2]; + cdz = pc[2] - pd[2]; + + return adx * (bdy * cdz - bdz * cdy) + + bdx * (cdy * adz - cdz * ady) + + cdx * (ady * bdz - adz * bdy); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// interiorangle() Return the interior angle (0 - 2 * PI) between vectors // +// o->p1 and o->p2. // +// // +// 'n' is the normal of the plane containing face (o, p1, p2). The interior // +// angle is the total angle rotating from o->p1 around n to o->p2. Exchange // +// the position of p1 and p2 will get the complement angle of the other one. // +// i.e., interiorangle(o, p1, p2) = 2 * PI - interiorangle(o, p2, p1). Set // +// 'n' be NULL if you only want the interior angle between 0 - PI. // +// // +/////////////////////////////////////////////////////////////////////////////// + +REAL tetgenmesh::interiorangle(REAL* o, REAL* p1, REAL* p2, REAL* n) +{ + REAL v1[3], v2[3], np[3]; + REAL theta, costheta, lenlen; + REAL ori, len1, len2; + + // Get the interior angle (0 - PI) between o->p1, and o->p2. + v1[0] = p1[0] - o[0]; + v1[1] = p1[1] - o[1]; + v1[2] = p1[2] - o[2]; + v2[0] = p2[0] - o[0]; + v2[1] = p2[1] - o[1]; + v2[2] = p2[2] - o[2]; + len1 = sqrt(dot(v1, v1)); + len2 = sqrt(dot(v2, v2)); + lenlen = len1 * len2; + + costheta = dot(v1, v2) / lenlen; + if (costheta > 1.0) { + costheta = 1.0; // Roundoff. + } else if (costheta < -1.0) { + costheta = -1.0; // Roundoff. + } + theta = acos(costheta); + if (n != NULL) { + // Get a point above the face (o, p1, p2); + np[0] = o[0] + n[0]; + np[1] = o[1] + n[1]; + np[2] = o[2] + n[2]; + // Adjust theta (0 - 2 * PI). + ori = orient3d(p1, o, np, p2); + if (ori > 0.0) { + theta = 2 * PI - theta; + } + } + + return theta; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// projpt2edge() Return the projection point from a point to an edge. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::projpt2edge(REAL* p, REAL* e1, REAL* e2, REAL* prj) +{ + REAL v1[3], v2[3]; + REAL len, l_p; + + v1[0] = e2[0] - e1[0]; + v1[1] = e2[1] - e1[1]; + v1[2] = e2[2] - e1[2]; + v2[0] = p[0] - e1[0]; + v2[1] = p[1] - e1[1]; + v2[2] = p[2] - e1[2]; + + len = sqrt(dot(v1, v1)); + v1[0] /= len; + v1[1] /= len; + v1[2] /= len; + l_p = dot(v1, v2); + + prj[0] = e1[0] + l_p * v1[0]; + prj[1] = e1[1] + l_p * v1[1]; + prj[2] = e1[2] + l_p * v1[2]; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// projpt2face() Return the projection point from a point to a face. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::projpt2face(REAL* p, REAL* f1, REAL* f2, REAL* f3, REAL* prj) +{ + REAL fnormal[3], v1[3]; + REAL len, dist; + + // Get the unit face normal. + facenormal(f1, f2, f3, fnormal, 1, NULL); + len = sqrt(fnormal[0]*fnormal[0] + fnormal[1]*fnormal[1] + + fnormal[2]*fnormal[2]); + fnormal[0] /= len; + fnormal[1] /= len; + fnormal[2] /= len; + // Get the vector v1 = |p - f1|. + v1[0] = p[0] - f1[0]; + v1[1] = p[1] - f1[1]; + v1[2] = p[2] - f1[2]; + // Get the project distance. + dist = dot(fnormal, v1); + + // Get the project point. + prj[0] = p[0] - dist * fnormal[0]; + prj[1] = p[1] - dist * fnormal[1]; + prj[2] = p[2] - dist * fnormal[2]; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetalldihedral() Get all (six) dihedral angles of a tet. // +// // +// If 'cosdd' is not NULL, it returns the cosines of the 6 dihedral angles, // +// the edge indices are given in the global array 'edge2ver'. If 'cosmaxd' // +// (or 'cosmind') is not NULL, it returns the cosine of the maximal (or // +// minimal) dihedral angle. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenmesh::tetalldihedral(point pa, point pb, point pc, point pd, + REAL* cosdd, REAL* cosmaxd, REAL* cosmind) +{ + REAL N[4][3], vol, cosd, len; + int f1 = 0, f2 = 0, i, j; + + vol = 0; // Check if the tet is valid or not. + + // Get four normals of faces of the tet. + tetallnormal(pa, pb, pc, pd, N, &vol); + + if (vol > 0) { + // Normalize the normals. + for (i = 0; i < 4; i++) { + len = sqrt(dot(N[i], N[i])); + if (len != 0.0) { + for (j = 0; j < 3; j++) N[i][j] /= len; + } else { + // There are degeneracies, such as duplicated vertices. + vol = 0; //assert(0); + } + } + } + + if (vol <= 0) { // if (vol == 0.0) { + // A degenerated tet or an inverted tet. + facenormal(pc, pb, pd, N[0], 1, NULL); + facenormal(pa, pc, pd, N[1], 1, NULL); + facenormal(pb, pa, pd, N[2], 1, NULL); + facenormal(pa, pb, pc, N[3], 1, NULL); + // Normalize the normals. + for (i = 0; i < 4; i++) { + len = sqrt(dot(N[i], N[i])); + if (len != 0.0) { + for (j = 0; j < 3; j++) N[i][j] /= len; + } else { + // There are degeneracies, such as duplicated vertices. + break; // Not a valid normal. + } + } + if (i < 4) { + // Do not calculate dihedral angles. + // Set all angles be 0 degree. There will be no quality optimization for + // this tet! Use volume optimization to correct it. + if (cosdd != NULL) { + for (i = 0; i < 6; i++) { + cosdd[i] = -1.0; // 180 degree. + } + } + // This tet has zero volume. + if (cosmaxd != NULL) { + *cosmaxd = -1.0; // 180 degree. + } + if (cosmind != NULL) { + *cosmind = -1.0; // 180 degree. + } + return false; + } + } + + // Calculate the cosine of the dihedral angles of the edges. + for (i = 0; i < 6; i++) { + switch (i) { + case 0: f1 = 0; f2 = 1; break; // [c,d]. + case 1: f1 = 1; f2 = 2; break; // [a,d]. + case 2: f1 = 2; f2 = 3; break; // [a,b]. + case 3: f1 = 0; f2 = 3; break; // [b,c]. + case 4: f1 = 2; f2 = 0; break; // [b,d]. + case 5: f1 = 1; f2 = 3; break; // [a,c]. + } + cosd = -dot(N[f1], N[f2]); + if (cosd < -1.0) cosd = -1.0; // Rounding. + if (cosd > 1.0) cosd = 1.0; // Rounding. + if (cosdd) cosdd[i] = cosd; + if (cosmaxd || cosmind) { + if (i == 0) { + if (cosmaxd) *cosmaxd = cosd; + if (cosmind) *cosmind = cosd; + } else { + if (cosmaxd) *cosmaxd = cosd < *cosmaxd ? cosd : *cosmaxd; + if (cosmind) *cosmind = cosd > *cosmind ? cosd : *cosmind; + } + } + } + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetallnormal() Get the in-normals of the four faces of a given tet. // +// // +// Let tet be abcd. N[4][3] returns the four normals, which are: N[0] cbd, // +// N[1] acd, N[2] bad, N[3] abc (exactly corresponding to the face indices // +// of the mesh data structure). These normals are unnormalized. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::tetallnormal(point pa, point pb, point pc, point pd, + REAL N[4][3], REAL* volume) +{ + REAL A[4][4], rhs[4], D; + int indx[4]; + int i, j; + + // get the entries of A[3][3]. + for (i = 0; i < 3; i++) A[0][i] = pa[i] - pd[i]; // d->a vec + for (i = 0; i < 3; i++) A[1][i] = pb[i] - pd[i]; // d->b vec + for (i = 0; i < 3; i++) A[2][i] = pc[i] - pd[i]; // d->c vec + + // Compute the inverse of matrix A, to get 3 normals of the 4 faces. + if (lu_decmp(A, 3, indx, &D, 0)) { // Decompose the matrix just once. + if (volume != NULL) { + // Get the volume of the tet. + *volume = fabs((A[indx[0]][0] * A[indx[1]][1] * A[indx[2]][2])) / 6.0; + } + for (j = 0; j < 3; j++) { + for (i = 0; i < 3; i++) rhs[i] = 0.0; + rhs[j] = 1.0; // Positive means the inside direction + lu_solve(A, 3, indx, rhs, 0); + for (i = 0; i < 3; i++) N[j][i] = rhs[i]; + } + // Get the fourth normal by summing up the first three. + for (i = 0; i < 3; i++) N[3][i] = - N[0][i] - N[1][i] - N[2][i]; + } else { + // The tet is degenerated. + if (volume != NULL) { + *volume = 0; + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetaspectratio() Calculate the aspect ratio of the tetrahedron. // +// // +// The aspect ratio of a tet is L/h, where L is the longest edge length, and // +// h is the shortest height of the tet. // +// // +/////////////////////////////////////////////////////////////////////////////// + +REAL tetgenmesh::tetaspectratio(point pa, point pb, point pc, point pd) +{ + REAL V[6][3], edgelength[6], longlen; + REAL vda[3], vdb[3], vdc[3]; + REAL N[4][3], A[4][4], rhs[4], D; + REAL H[4], volume, minheightinv; + int indx[4]; + int i, j; + + // Set the edge vectors: V[0], ..., V[5] + for (i = 0; i < 3; i++) V[0][i] = pa[i] - pd[i]; + for (i = 0; i < 3; i++) V[1][i] = pb[i] - pd[i]; + for (i = 0; i < 3; i++) V[2][i] = pc[i] - pd[i]; + for (i = 0; i < 3; i++) V[3][i] = pb[i] - pa[i]; + for (i = 0; i < 3; i++) V[4][i] = pc[i] - pb[i]; + for (i = 0; i < 3; i++) V[5][i] = pa[i] - pc[i]; + + // Get the squares of the edge lengths. + for (i = 0; i < 6; i++) edgelength[i] = dot(V[i], V[i]); + + // Calculate the longest and shortest edge length. + longlen = edgelength[0]; + for (i = 1; i < 6; i++) { + longlen = edgelength[i] > longlen ? edgelength[i] : longlen; + } + + // Set the matrix A = [vda, vdb, vdc]^T. + for (i = 0; i < 3; i++) A[0][i] = vda[i] = pa[i] - pd[i]; + for (i = 0; i < 3; i++) A[1][i] = vdb[i] = pb[i] - pd[i]; + for (i = 0; i < 3; i++) A[2][i] = vdc[i] = pc[i] - pd[i]; + // Lu-decompose the matrix A. + lu_decmp(A, 3, indx, &D, 0); + // Get the volume of abcd. + volume = (A[indx[0]][0] * A[indx[1]][1] * A[indx[2]][2]) / 6.0; + // Check if it is zero. + if (volume == 0.0) return 1.0e+200; // A degenerate tet. + + // Compute the 4 face normals (N[0], ..., N[3]). + for (j = 0; j < 3; j++) { + for (i = 0; i < 3; i++) rhs[i] = 0.0; + rhs[j] = 1.0; // Positive means the inside direction + lu_solve(A, 3, indx, rhs, 0); + for (i = 0; i < 3; i++) N[j][i] = rhs[i]; + } + // Get the fourth normal by summing up the first three. + for (i = 0; i < 3; i++) N[3][i] = - N[0][i] - N[1][i] - N[2][i]; + // Normalized the normals. + for (i = 0; i < 4; i++) { + // H[i] is the inverse of the height of its corresponding face. + H[i] = sqrt(dot(N[i], N[i])); + // if (H[i] > 0.0) { + // for (j = 0; j < 3; j++) N[i][j] /= H[i]; + // } + } + // Get the radius of the inscribed sphere. + // insradius = 1.0 / (H[0] + H[1] + H[2] + H[3]); + // Get the biggest H[i] (corresponding to the smallest height). + minheightinv = H[0]; + for (i = 1; i < 4; i++) { + if (H[i] > minheightinv) minheightinv = H[i]; + } + + return sqrt(longlen) * minheightinv; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// circumsphere() Calculate the smallest circumsphere (center and radius) // +// of the given three or four points. // +// // +// The circumsphere of four points (a tetrahedron) is unique if they are not // +// degenerate. If 'pd = NULL', the smallest circumsphere of three points is // +// the diametral sphere of the triangle if they are not degenerate. // +// // +// Return TRUE if the input points are not degenerate and the circumcenter // +// and circumradius are returned in 'cent' and 'radius' respectively if they // +// are not NULLs. Otherwise, return FALSE, the four points are co-planar. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenmesh::circumsphere(REAL* pa, REAL* pb, REAL* pc, REAL* pd, + REAL* cent, REAL* radius) +{ + REAL A[4][4], rhs[4], D; + int indx[4]; + + // Compute the coefficient matrix A (3x3). + A[0][0] = pb[0] - pa[0]; + A[0][1] = pb[1] - pa[1]; + A[0][2] = pb[2] - pa[2]; + A[1][0] = pc[0] - pa[0]; + A[1][1] = pc[1] - pa[1]; + A[1][2] = pc[2] - pa[2]; + if (pd != NULL) { + A[2][0] = pd[0] - pa[0]; + A[2][1] = pd[1] - pa[1]; + A[2][2] = pd[2] - pa[2]; + } else { + cross(A[0], A[1], A[2]); + } + + // Compute the right hand side vector b (3x1). + rhs[0] = 0.5 * dot(A[0], A[0]); + rhs[1] = 0.5 * dot(A[1], A[1]); + if (pd != NULL) { + rhs[2] = 0.5 * dot(A[2], A[2]); + } else { + rhs[2] = 0.0; + } + + // Solve the 3 by 3 equations use LU decomposition with partial pivoting + // and backward and forward substitute.. + if (!lu_decmp(A, 3, indx, &D, 0)) { + if (radius != (REAL *) NULL) *radius = 0.0; + return false; + } + lu_solve(A, 3, indx, rhs, 0); + if (cent != (REAL *) NULL) { + cent[0] = pa[0] + rhs[0]; + cent[1] = pa[1] + rhs[1]; + cent[2] = pa[2] + rhs[2]; + } + if (radius != (REAL *) NULL) { + *radius = sqrt(rhs[0] * rhs[0] + rhs[1] * rhs[1] + rhs[2] * rhs[2]); + } + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// orthosphere() Calulcate the orthosphere of four weighted points. // +// // +// A weighted point (p, P^2) can be interpreted as a sphere centered at the // +// point 'p' with a radius 'P'. The 'height' of 'p' is pheight = p[0]^2 + // +// p[1]^2 + p[2]^2 - P^2. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenmesh::orthosphere(REAL* pa, REAL* pb, REAL* pc, REAL* pd, + REAL aheight, REAL bheight, REAL cheight, + REAL dheight, REAL* orthocent, REAL* radius) +{ + REAL A[4][4], rhs[4], D; + int indx[4]; + + // Set the coefficient matrix A (4 x 4). + A[0][0] = 1.0; A[0][1] = pa[0]; A[0][2] = pa[1]; A[0][3] = pa[2]; + A[1][0] = 1.0; A[1][1] = pb[0]; A[1][2] = pb[1]; A[1][3] = pb[2]; + A[2][0] = 1.0; A[2][1] = pc[0]; A[2][2] = pc[1]; A[2][3] = pc[2]; + A[3][0] = 1.0; A[3][1] = pd[0]; A[3][2] = pd[1]; A[3][3] = pd[2]; + + // Set the right hand side vector (4 x 1). + rhs[0] = 0.5 * aheight; + rhs[1] = 0.5 * bheight; + rhs[2] = 0.5 * cheight; + rhs[3] = 0.5 * dheight; + + // Solve the 4 by 4 equations use LU decomposition with partial pivoting + // and backward and forward substitute.. + if (!lu_decmp(A, 4, indx, &D, 0)) { + if (radius != (REAL *) NULL) *radius = 0.0; + return false; + } + lu_solve(A, 4, indx, rhs, 0); + + if (orthocent != (REAL *) NULL) { + orthocent[0] = rhs[1]; + orthocent[1] = rhs[2]; + orthocent[2] = rhs[3]; + } + if (radius != (REAL *) NULL) { + // rhs[0] = - rheight / 2; + // rheight = - 2 * rhs[0]; + // = r[0]^2 + r[1]^2 + r[2]^2 - radius^2 + // radius^2 = r[0]^2 + r[1]^2 + r[2]^2 -rheight + // = r[0]^2 + r[1]^2 + r[2]^2 + 2 * rhs[0] + *radius = sqrt(rhs[1] * rhs[1] + rhs[2] * rhs[2] + rhs[3] * rhs[3] + + 2.0 * rhs[0]); + } + return true; +} + +void tetgenmesh::tetcircumcenter(point tetorg, point tetdest, point tetfapex, + point tettapex, REAL *circumcenter, REAL *radius) +{ + REAL xot, yot, zot, xdt, ydt, zdt, xft, yft, zft; + REAL otlength, dtlength, ftlength; + REAL xcrossdf, ycrossdf, zcrossdf; + REAL xcrossfo, ycrossfo, zcrossfo; + REAL xcrossod, ycrossod, zcrossod; + REAL denominator; + REAL xct, yct, zct; + + //tetcircumcentercount++; + + /* Use coordinates relative to the apex of the tetrahedron. */ + xot = tetorg[0] - tettapex[0]; + yot = tetorg[1] - tettapex[1]; + zot = tetorg[2] - tettapex[2]; + xdt = tetdest[0] - tettapex[0]; + ydt = tetdest[1] - tettapex[1]; + zdt = tetdest[2] - tettapex[2]; + xft = tetfapex[0] - tettapex[0]; + yft = tetfapex[1] - tettapex[1]; + zft = tetfapex[2] - tettapex[2]; + /* Squares of lengths of the origin, destination, and face apex edges. */ + otlength = xot * xot + yot * yot + zot * zot; + dtlength = xdt * xdt + ydt * ydt + zdt * zdt; + ftlength = xft * xft + yft * yft + zft * zft; + /* Cross products of the origin, destination, and face apex vectors. */ + xcrossdf = ydt * zft - yft * zdt; + ycrossdf = zdt * xft - zft * xdt; + zcrossdf = xdt * yft - xft * ydt; + xcrossfo = yft * zot - yot * zft; + ycrossfo = zft * xot - zot * xft; + zcrossfo = xft * yot - xot * yft; + xcrossod = yot * zdt - ydt * zot; + ycrossod = zot * xdt - zdt * xot; + zcrossod = xot * ydt - xdt * yot; + + /* Calculate the denominator of all the formulae. */ + //if (noexact) { + // denominator = 0.5 / (xot * xcrossdf + yot * ycrossdf + zot * zcrossdf); + //} else { + /* Use the orient3d() routine to ensure a positive (and */ + /* reasonably accurate) result, avoiding any possibility */ + /* of division by zero. */ + denominator = 0.5 / orient3d(tetorg, tetdest, tetfapex, tettapex); + /* Don't count the above as an orientation test. */ + //orientcount--; + //} + + /* Calculate offset (from apex) of circumcenter. */ + xct = (otlength * xcrossdf + dtlength * xcrossfo + ftlength * xcrossod) * + denominator; + yct = (otlength * ycrossdf + dtlength * ycrossfo + ftlength * ycrossod) * + denominator; + zct = (otlength * zcrossdf + dtlength * zcrossfo + ftlength * zcrossod) * + denominator; + + circumcenter[0] = xct + tettapex[0]; + circumcenter[1] = yct + tettapex[1]; + circumcenter[2] = zct + tettapex[2]; + + if (radius != NULL) { + *radius = sqrt(xct * xct + yct * yct + zct * zct); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// planelineint() Calculate the intersection of a line and a plane. // +// // +// The equation of a plane (points P are on the plane with normal N and P3 // +// on the plane) can be written as: N dot (P - P3) = 0. The equation of the // +// line (points P on the line passing through P1 and P2) can be written as: // +// P = P1 + u (P2 - P1). The intersection of these two occurs when: // +// N dot (P1 + u (P2 - P1)) = N dot P3. // +// Solving for u gives: // +// N dot (P3 - P1) // +// u = ------------------. // +// N dot (P2 - P1) // +// If the denominator is 0 then N (the normal to the plane) is perpendicular // +// to the line. Thus the line is either parallel to the plane and there are // +// no solutions or the line is on the plane in which case there are an infi- // +// nite number of solutions. // +// // +// The plane is given by three points pa, pb, and pc, e1 and e2 defines the // +// line. If u is non-zero, The intersection point (if exists) returns in ip. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::planelineint(REAL* pa, REAL* pb, REAL* pc, REAL* e1, REAL* e2, + REAL* ip, REAL* u) +{ + REAL n[3], det, det1; + + // Calculate N. + facenormal(pa, pb, pc, n, 1, NULL); + // Calculate N dot (e2 - e1). + det = n[0] * (e2[0] - e1[0]) + n[1] * (e2[1] - e1[1]) + + n[2] * (e2[2] - e1[2]); + if (det != 0.0) { + // Calculate N dot (pa - e1) + det1 = n[0] * (pa[0] - e1[0]) + n[1] * (pa[1] - e1[1]) + + n[2] * (pa[2] - e1[2]); + *u = det1 / det; + ip[0] = e1[0] + *u * (e2[0] - e1[0]); + ip[1] = e1[1] + *u * (e2[1] - e1[1]); + ip[2] = e1[2] + *u * (e2[2] - e1[2]); + } else { + *u = 0.0; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// linelineint() Calculate the intersection(s) of two line segments. // +// // +// Calculate the line segment [P, Q] that is the shortest route between two // +// lines from A to B and C to D. Calculate also the values of tp and tq // +// where: P = A + tp (B - A), and Q = C + tq (D - C). // +// // +// Return 1 if the line segment exists. Otherwise, return 0. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::linelineint(REAL* A, REAL* B, REAL* C, REAL* D, REAL* P, + REAL* Q, REAL* tp, REAL* tq) +{ + REAL vab[3], vcd[3], vca[3]; + REAL vab_vab, vcd_vcd, vab_vcd; + REAL vca_vab, vca_vcd; + REAL det, eps; + int i; + + for (i = 0; i < 3; i++) { + vab[i] = B[i] - A[i]; + vcd[i] = D[i] - C[i]; + vca[i] = A[i] - C[i]; + } + + vab_vab = dot(vab, vab); + vcd_vcd = dot(vcd, vcd); + vab_vcd = dot(vab, vcd); + + det = vab_vab * vcd_vcd - vab_vcd * vab_vcd; + // Round the result. + eps = det / (fabs(vab_vab * vcd_vcd) + fabs(vab_vcd * vab_vcd)); + if (eps < b->epsilon) { + return 0; + } + + vca_vab = dot(vca, vab); + vca_vcd = dot(vca, vcd); + + *tp = (vcd_vcd * (- vca_vab) + vab_vcd * vca_vcd) / det; + *tq = (vab_vcd * (- vca_vab) + vab_vab * vca_vcd) / det; + + for (i = 0; i < 3; i++) P[i] = A[i] + (*tp) * vab[i]; + for (i = 0; i < 3; i++) Q[i] = C[i] + (*tq) * vcd[i]; + + return 1; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetprismvol() Calculate the volume of a tetrahedral prism in 4D. // +// // +// A tetrahedral prism is a convex uniform polychoron (four dimensional poly-// +// tope). It has 6 polyhedral cells: 2 tetrahedra connected by 4 triangular // +// prisms. It has 14 faces: 8 triangular and 6 square. It has 16 edges and 8 // +// vertices. (Wikipedia). // +// // +// Let 'p0', ..., 'p3' be four affinely independent points in R^3. They form // +// the lower tetrahedral facet of the prism. The top tetrahedral facet is // +// formed by four vertices, 'p4', ..., 'p7' in R^4, which is obtained by // +// lifting each vertex of the lower facet into R^4 by a weight (height). A // +// canonical choice of the weights is the square of Euclidean norm of of the // +// points (vectors). // +// // +// // +// The return value is (4!) 24 times of the volume of the tetrahedral prism. // +// // +/////////////////////////////////////////////////////////////////////////////// + +REAL tetgenmesh::tetprismvol(REAL* p0, REAL* p1, REAL* p2, REAL* p3) +{ + REAL *p4, *p5, *p6, *p7; + REAL w4, w5, w6, w7; + REAL vol[4]; + + p4 = p0; + p5 = p1; + p6 = p2; + p7 = p3; + + // TO DO: these weights can be pre-calculated! + w4 = dot(p0, p0); + w5 = dot(p1, p1); + w6 = dot(p2, p2); + w7 = dot(p3, p3); + + // Calculate the volume of the tet-prism. + vol[0] = orient4d(p5, p6, p4, p3, p7, w5, w6, w4, 0, w7); + vol[1] = orient4d(p3, p6, p2, p0, p1, 0, w6, 0, 0, 0); + vol[2] = orient4d(p4, p6, p3, p0, p1, w4, w6, 0, 0, 0); + vol[3] = orient4d(p6, p5, p4, p3, p1, w6, w5, w4, 0, 0); + + return fabs(vol[0]) + fabs(vol[1]) + fabs(vol[2]) + fabs(vol[3]); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// calculateabovepoint() Calculate a point above a facet in 'dummypoint'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenmesh::calculateabovepoint(arraypool *facpoints, point *ppa, + point *ppb, point *ppc) +{ + point *ppt, pa, pb, pc; + REAL v1[3], v2[3], n[3]; + REAL lab, len, A, area; + REAL x, y, z; + int i; + + ppt = (point *) fastlookup(facpoints, 0); + pa = *ppt; // a is the first point. + pb = pc = NULL; // Avoid compiler warnings. + + // Get a point b s.t. the length of [a, b] is maximal. + lab = 0; + for (i = 1; i < facpoints->objects; i++) { + ppt = (point *) fastlookup(facpoints, i); + x = (*ppt)[0] - pa[0]; + y = (*ppt)[1] - pa[1]; + z = (*ppt)[2] - pa[2]; + len = x * x + y * y + z * z; + if (len > lab) { + lab = len; + pb = *ppt; + } + } + lab = sqrt(lab); + if (lab == 0) { + if (!b->quiet) { + printf("Warning: All points of a facet are coincident with %d.\n", + pointmark(pa)); + } + return false; + } + + // Get a point c s.t. the area of [a, b, c] is maximal. + v1[0] = pb[0] - pa[0]; + v1[1] = pb[1] - pa[1]; + v1[2] = pb[2] - pa[2]; + A = 0; + for (i = 1; i < facpoints->objects; i++) { + ppt = (point *) fastlookup(facpoints, i); + v2[0] = (*ppt)[0] - pa[0]; + v2[1] = (*ppt)[1] - pa[1]; + v2[2] = (*ppt)[2] - pa[2]; + cross(v1, v2, n); + area = dot(n, n); + if (area > A) { + A = area; + pc = *ppt; + } + } + if (A == 0) { + // All points are collinear. No above point. + if (!b->quiet) { + printf("Warning: All points of a facet are collinaer with [%d, %d].\n", + pointmark(pa), pointmark(pb)); + } + return false; + } + + // Calculate an above point of this facet. + facenormal(pa, pb, pc, n, 1, NULL); + len = sqrt(dot(n, n)); + n[0] /= len; + n[1] /= len; + n[2] /= len; + lab /= 2.0; // Half the maximal length. + dummypoint[0] = pa[0] + lab * n[0]; + dummypoint[1] = pa[1] + lab * n[1]; + dummypoint[2] = pa[2] + lab * n[2]; + + if (ppa != NULL) { + // Return the three points. + *ppa = pa; + *ppb = pb; + *ppc = pc; + } + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// Calculate an above point. It lies above the plane containing the subface // +// [a,b,c], and save it in dummypoint. Moreover, the vector pa->dummypoint // +// is the normal of the plane. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::calculateabovepoint4(point pa, point pb, point pc, point pd) +{ + REAL n1[3], n2[3], *norm; + REAL len, len1, len2; + + // Select a base. + facenormal(pa, pb, pc, n1, 1, NULL); + len1 = sqrt(dot(n1, n1)); + facenormal(pa, pb, pd, n2, 1, NULL); + len2 = sqrt(dot(n2, n2)); + if (len1 > len2) { + norm = n1; + len = len1; + } else { + norm = n2; + len = len2; + } + norm[0] /= len; + norm[1] /= len; + norm[2] /= len; + len = distance(pa, pb); + dummypoint[0] = pa[0] + len * norm[0]; + dummypoint[1] = pa[1] + len * norm[1]; + dummypoint[2] = pa[2] + len * norm[2]; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// report_overlapping_facets() Report two overlapping facets. // +// // +// Two subfaces, f1 [a, b, c] and f2 [a, b, d], share the same edge [a, b]. // +// 'dihedang' is the dihedral angle between these two facets. It must less // +// than the variable 'b->facet_overlap_angle_tol'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::report_overlapping_facets(face *f1, face *f2, REAL dihedang) +{ + point pa, pb, pc, pd; + + pa = sorg(*f1); + pb = sdest(*f1); + pc = sapex(*f1); + pd = sapex(*f2); + + if (pc != pd) { + printf("Found two %s self-intersecting facets.\n", + dihedang > 0 ? "nearly" : "exactly"); + printf(" 1st: [%d, %d, %d] #%d\n", + pointmark(pa), pointmark(pb), pointmark(pc), shellmark(*f1)); + printf(" 2nd: [%d, %d, %d] #%d\n", + pointmark(pa), pointmark(pb), pointmark(pd), shellmark(*f2)); + if (dihedang > 0) { + printf("The dihedral angle between them is %g degree.\n", + dihedang / PI * 180.0); + printf("Hint: You may use -p/# to decrease the dihedral angle"); + printf(" tolerance %g (degree).\n", b->facet_overlap_ang_tol); + } + } else { + if (shellmark(*f1) != shellmark(*f2)) { + // Two identical faces from two different facet. + printf("Found two overlapping facets.\n"); + } else { + printf("Found two duplicated facets.\n"); + } + printf(" 1st: [%d, %d, %d] #%d\n", + pointmark(pa), pointmark(pb), pointmark(pc), shellmark(*f1)); + printf(" 2nd: [%d, %d, %d] #%d\n", + pointmark(pa), pointmark(pb), pointmark(pd), shellmark(*f2)); + } + + // Return the information + sevent.e_type = 6; + sevent.f_marker1 = shellmark(*f1); + sevent.f_vertices1[0] = pointmark(pa); + sevent.f_vertices1[1] = pointmark(pb); + sevent.f_vertices1[2] = pointmark(pc); + sevent.f_marker2 = shellmark(*f2); + sevent.f_vertices2[0] = pointmark(pa); + sevent.f_vertices2[1] = pointmark(pb); + sevent.f_vertices2[2] = pointmark(pd); + + terminatetetgen(this, 3); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// report_selfint_edge() Report a self-intersection at an edge. // +// // +// The edge 'e1'->'e2' and the tetrahedron 'itet' intersect. 'dir' indicates // +// that the edge intersects the tet at its origin vertex (ACROSSVERTEX), or // +// its current face (ACROSSFACE), or its current edge (ACROSSEDGE). // +// If 'iedge' is not NULL, it is either a segment or a subface that contains // +// the edge 'e1'->'e2'. It is used to report the geometry entity. // +// // +// Since it is a self-intersection, the vertex, edge or face of 'itet' that // +// is intersecting with this edge must be an input vertex, a segment, or a // +// subface, respectively. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::report_selfint_edge(point e1, point e2, face *iedge, + triface* itet, enum interresult dir) +{ + point forg = NULL, fdest = NULL, fapex = NULL; + int etype = 0, geomtag = 0, facemark = 0; + + if (iedge != NULL) { + if (iedge->sh[5] != NULL) { + etype = 2; // A subface + forg = e1; + fdest = e2; + fapex = sapex(*iedge); + facemark = shellmark(*iedge); + } else { + etype = 1; // A segment + forg = farsorg(*iedge); + fdest = farsdest(*iedge); + // Get a facet containing this segment. + face parentsh; + spivot(*iedge, parentsh); + if (parentsh.sh != NULL) { + facemark = shellmark(parentsh); + } + } + geomtag = shellmark(*iedge); + } + + if (dir == SHAREEDGE) { + // Two edges (segments) are coincide. + face colseg; + tsspivot1(*itet, colseg); + if (etype == 1) { + if (colseg.sh != iedge->sh) { + face parentsh; + spivot(colseg, parentsh); + printf("PLC Error: Two segments are overlapping.\n"); + printf(" Segment 1: [%d, %d] #%d (%d)\n", pointmark(sorg(colseg)), + pointmark(sdest(colseg)), shellmark(colseg), + parentsh.sh ? shellmark(parentsh) : 0); + printf(" Segment 2: [%d, %d] #%d (%d)\n", pointmark(forg), + pointmark(fdest), geomtag, facemark); + sevent.e_type = 4; + sevent.f_marker1 = (parentsh.sh ? shellmark(parentsh) : 0); + sevent.s_marker1 = shellmark(colseg); + sevent.f_vertices1[0] = pointmark( sorg(colseg)); + sevent.f_vertices1[1] = pointmark(sdest(colseg)); + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = facemark; + sevent.s_marker2 = geomtag; + sevent.f_vertices2[0] = pointmark(forg); + sevent.f_vertices2[1] = pointmark(fdest); + sevent.f_vertices2[2] = 0; + } else { + // Two identical segments. Why report it? + terminatetetgen(this, 2); + } + } else if (etype == 2) { + printf("PLC Error: A segment lies in a facet.\n"); + printf(" Segment: [%d, %d] #%d\n", pointmark(sorg(colseg)), + pointmark(sdest(colseg)), shellmark(colseg)); + printf(" Facet: [%d,%d,%d] #%d\n", pointmark(forg), + pointmark(fdest), pointmark(fapex), geomtag); + sevent.e_type = 5; + sevent.f_marker1 = 0; + sevent.s_marker1 = shellmark(colseg); + sevent.f_vertices1[0] = pointmark( sorg(colseg)); + sevent.f_vertices1[1] = pointmark(sdest(colseg)); + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = geomtag; + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(forg); + sevent.f_vertices2[1] = pointmark(fdest); + sevent.f_vertices2[2] = pointmark(fapex); + } + } else if (dir == SHAREFACE) { + // Two triangles (subfaces) are coincide. + face colface; + tspivot(*itet, colface); + if (etype == 2) { + if (colface.sh != iedge->sh) { + printf("PLC Error: Two facets are overlapping.\n"); + printf(" Facet 1: [%d,%d,%d] #%d\n", pointmark(forg), + pointmark(fdest), pointmark(fapex), geomtag); + printf(" Facet 2: [%d,%d,%d] #%d\n", pointmark(sorg(colface)), + pointmark(sdest(colface)), pointmark(sapex(colface)), + shellmark(colface)); + sevent.e_type = 6; + sevent.f_marker1 = geomtag; + sevent.s_marker1 = 0; + sevent.f_vertices1[0] = pointmark(forg); + sevent.f_vertices1[1] = pointmark(fdest); + sevent.f_vertices1[2] = pointmark(fapex); + sevent.f_marker2 = shellmark(colface); + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(sorg(colface)); + sevent.f_vertices2[1] = pointmark(sdest(colface)); + sevent.f_vertices2[2] = pointmark(sapex(colface)); + } else { + // Two identical subfaces. Why report it? + terminatetetgen(this, 2); + } + } else { + terminatetetgen(this, 2); + } + } else if (dir == ACROSSVERT) { + point pp = dest(*itet); + if ((pointtype(pp) == RIDGEVERTEX) || (pointtype(pp) == FACETVERTEX) + || (pointtype(pp) == VOLVERTEX)) { + if (etype == 1) { + printf("PLC Error: A vertex lies in a segment.\n"); + printf(" Vertex: [%d] (%g,%g,%g).\n",pointmark(pp),pp[0],pp[1],pp[2]); + printf(" Segment: [%d, %d] #%d (%d)\n", pointmark(forg), + pointmark(fdest), geomtag, facemark); + sevent.e_type = 7; + sevent.f_marker1 = 0; + sevent.s_marker1 = 0; + sevent.f_vertices1[0] = pointmark(pp); + sevent.f_vertices1[1] = 0; + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = facemark; + sevent.s_marker2 = geomtag; + sevent.f_vertices2[0] = pointmark(forg); + sevent.f_vertices2[1] = pointmark(fdest); + sevent.f_vertices2[2] = 0; + sevent.int_point[0] = pp[0]; + sevent.int_point[1] = pp[1]; + sevent.int_point[2] = pp[2]; + } else if (etype == 2) { + printf("PLC Error: A vertex lies in a facet.\n"); + printf(" Vertex: [%d] (%g,%g,%g).\n",pointmark(pp),pp[0],pp[1],pp[2]); + printf(" Facet: [%d,%d,%d] #%d\n", pointmark(forg), pointmark(fdest), + pointmark(fapex), geomtag); + sevent.e_type = 8; + sevent.f_marker1 = 0; + sevent.s_marker1 = 0; + sevent.f_vertices1[0] = pointmark(pp); + sevent.f_vertices1[1] = 0; + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = geomtag; + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(forg); + sevent.f_vertices2[1] = pointmark(fdest); + sevent.f_vertices2[2] = pointmark(fapex); + sevent.int_point[0] = pp[0]; + sevent.int_point[1] = pp[1]; + sevent.int_point[2] = pp[2]; + } + } else if (pointtype(pp) == FREESEGVERTEX) { + face parentseg, parentsh; + sdecode(point2sh(pp), parentseg); + spivot(parentseg, parentsh); + if (parentseg.sh != NULL) { + point p1 = farsorg(parentseg); + point p2 = farsdest(parentseg); + if (etype == 1) { + printf("PLC Error: Two segments intersect at point (%g,%g,%g).\n", + pp[0], pp[1], pp[2]); + printf(" Segment 1: [%d, %d], #%d (%d)\n", pointmark(forg), + pointmark(fdest), geomtag, facemark); + printf(" Segment 2: [%d, %d], #%d (%d)\n", pointmark(p1), + pointmark(p2), shellmark(parentseg), + parentsh.sh ? shellmark(parentsh) : 0); + sevent.e_type = 1; + sevent.f_marker1 = facemark; + sevent.s_marker1 = geomtag; + sevent.f_vertices1[0] = pointmark(forg); + sevent.f_vertices1[1] = pointmark(fdest); + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = (parentsh.sh ? shellmark(parentsh) : 0); + sevent.s_marker2 = shellmark(parentseg); + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = 0; + sevent.int_point[0] = pp[0]; + sevent.int_point[1] = pp[1]; + sevent.int_point[2] = pp[2]; + } else if (etype == 2) { + printf("PLC Error: A segment and a facet intersect at point"); + printf(" (%g,%g,%g).\n", pp[0], pp[1], pp[2]); + printf(" Segment: [%d, %d], #%d (%d)\n", pointmark(p1), + pointmark(p2), shellmark(parentseg), + parentsh.sh ? shellmark(parentsh) : 0); + printf(" Facet: [%d,%d,%d] #%d\n", pointmark(forg), + pointmark(fdest), pointmark(fapex), geomtag); + sevent.e_type = 2; + sevent.f_marker1 = (parentsh.sh ? shellmark(parentsh) : 0); + sevent.s_marker1 = shellmark(parentseg); + sevent.f_vertices1[0] = pointmark(p1); + sevent.f_vertices1[1] = pointmark(p2); + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = geomtag; + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(forg); + sevent.f_vertices2[1] = pointmark(fdest); + sevent.f_vertices2[2] = pointmark(fapex); + sevent.int_point[0] = pp[0]; + sevent.int_point[1] = pp[1]; + sevent.int_point[2] = pp[2]; + } + } else { + terminatetetgen(this, 2); // Report a bug. + } + } else if (pointtype(pp) == FREEFACETVERTEX) { + face parentsh; + sdecode(point2sh(pp), parentsh); + if (parentsh.sh != NULL) { + point p1 = sorg(parentsh); + point p2 = sdest(parentsh); + point p3 = sapex(parentsh); + if (etype == 1) { + printf("PLC Error: A segment and a facet intersect at point"); + printf(" (%g,%g,%g).\n", pp[0], pp[1], pp[2]); + printf(" Segment : [%d, %d], #%d (%d)\n", pointmark(forg), + pointmark(fdest), geomtag, facemark); + printf(" Facet : [%d, %d, %d] #%d.\n", pointmark(p1), + pointmark(p2), pointmark(p3), shellmark(parentsh)); + sevent.e_type = 2; + sevent.f_marker1 = facemark; + sevent.s_marker1 = geomtag; + sevent.f_vertices1[0] = pointmark(forg); + sevent.f_vertices1[1] = pointmark(fdest); + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = shellmark(parentsh); + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = pointmark(p3); + sevent.int_point[0] = pp[0]; + sevent.int_point[1] = pp[1]; + sevent.int_point[2] = pp[2]; + } else if (etype == 2) { + printf("PLC Error: Two facets intersect at point (%g,%g,%g).\n", + pp[0], pp[1], pp[2]); + printf(" Facet 1: [%d, %d, %d] #%d.\n", pointmark(forg), + pointmark(fdest), pointmark(fapex), geomtag); + printf(" Facet 2: [%d, %d, %d] #%d.\n", pointmark(p1), + pointmark(p2), pointmark(p3), shellmark(parentsh)); + sevent.e_type = 3; + sevent.f_marker1 = geomtag; + sevent.s_marker1 = 0; + sevent.f_vertices1[0] = pointmark(forg); + sevent.f_vertices1[1] = pointmark(fdest); + sevent.f_vertices1[2] = pointmark(fapex); + sevent.f_marker2 = shellmark(parentsh); + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = pointmark(p3); + sevent.int_point[0] = pp[0]; + sevent.int_point[1] = pp[1]; + sevent.int_point[2] = pp[2]; + } + } else { + terminatetetgen(this, 2); // Report a bug. + } + } else if (pointtype(pp) == FREEVOLVERTEX) { + // This is not a PLC error. + // We should shift the vertex. + // not down yet. + terminatetetgen(this, 2); // Report a bug. + } else { + terminatetetgen(this, 2); // Report a bug. + } + terminatetetgen(this, 3); + } else if (dir == ACROSSEDGE) { + if (issubseg(*itet)) { + face checkseg; + tsspivot1(*itet, checkseg); + face parentsh; + spivot(checkseg, parentsh); + // Calulcate the intersecting point. + point p1 = sorg(checkseg); + point p2 = sdest(checkseg); + REAL P[3], Q[3], tp = 0, tq = 0; + linelineint(e1, e2, p1, p2, P, Q, &tp, &tq); + if (etype == 1) { + printf("PLC Error: Two segments intersect at point (%g,%g,%g).\n", + P[0], P[1], P[2]); + printf(" Segment 1: [%d, %d] #%d (%d)\n", pointmark(forg), + pointmark(fdest), geomtag, facemark); + printf(" Segment 2: [%d, %d] #%d (%d)\n", pointmark(p1), + pointmark(p2), shellmark(checkseg), + parentsh.sh ? shellmark(parentsh) : 0); + sevent.e_type = 1; + sevent.f_marker1 = facemark; + sevent.s_marker1 = geomtag; + sevent.f_vertices1[0] = pointmark(forg); + sevent.f_vertices1[1] = pointmark(fdest); + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = (parentsh.sh ? shellmark(parentsh) : 0); + sevent.s_marker2 = shellmark(checkseg); + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = 0; + sevent.int_point[0] = P[0]; + sevent.int_point[1] = P[1]; + sevent.int_point[2] = P[2]; + } else if (etype == 2) { + printf("PLC Error: A segment and a facet intersect at point"); + printf(" (%g,%g,%g).\n", P[0], P[1], P[2]); + printf(" Segment: [%d, %d] #%d (%d)\n", pointmark(p1), + pointmark(p2), shellmark(checkseg), + parentsh.sh ? shellmark(parentsh) : 0); + printf(" Facet: [%d, %d, %d] #%d.\n", pointmark(forg), + pointmark(fdest), pointmark(fapex), geomtag); + sevent.e_type = 2; + sevent.f_marker1 = (parentsh.sh ? shellmark(parentsh) : 0); + sevent.s_marker1 = shellmark(checkseg); + sevent.f_vertices1[0] = pointmark(p1); + sevent.f_vertices1[1] = pointmark(p2); + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = geomtag; + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(forg); + sevent.f_vertices2[1] = pointmark(fdest); + sevent.f_vertices2[2] = pointmark(fapex); + sevent.int_point[0] = P[0]; + sevent.int_point[1] = P[1]; + sevent.int_point[2] = P[2]; + } + terminatetetgen(this, 3); + } + } else if (dir == ACROSSFACE) { + if (issubface(*itet)) { + face checksh; + tspivot(*itet, checksh); + point p1 = sorg(checksh); + point p2 = sdest(checksh); + point p3 = sapex(checksh); + REAL ip[3], u = 0; + planelineint(p1, p2, p3, e1, e2, ip, &u); + if (etype == 1) { + printf("PLC Error: A segment and a facet intersect at point"); + printf(" (%g,%g,%g).\n", ip[0], ip[1], ip[2]); + printf(" Segment: [%d, %d] #%d (%d)\n", pointmark(forg), + pointmark(fdest), geomtag, facemark); + printf(" Facet: [%d, %d, %d] #%d.\n", pointmark(p1), + pointmark(p2), pointmark(p3), shellmark(checksh)); + sevent.e_type = 2; + sevent.f_marker1 = facemark; + sevent.s_marker1 = geomtag; + sevent.f_vertices1[0] = pointmark(forg); + sevent.f_vertices1[1] = pointmark(fdest); + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = shellmark(checksh); + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = pointmark(p3); + sevent.int_point[0] = ip[0]; + sevent.int_point[1] = ip[1]; + sevent.int_point[2] = ip[2]; + } else if (etype == 2) { + printf("PLC Error: Two facets intersect at point (%g,%g,%g).\n", + ip[0], ip[1], ip[2]); + printf(" Facet 1: [%d, %d, %d] #%d.\n", pointmark(forg), + pointmark(fdest), pointmark(fapex), geomtag); + printf(" Facet 2: [%d, %d, %d] #%d.\n", pointmark(p1), + pointmark(p2), pointmark(p3), shellmark(checksh)); + sevent.e_type = 3; + sevent.f_marker1 = geomtag; + sevent.s_marker1 = 0; + sevent.f_vertices1[0] = pointmark(forg); + sevent.f_vertices1[1] = pointmark(fdest); + sevent.f_vertices1[2] = pointmark(fapex); + sevent.f_marker2 = shellmark(checksh); + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = pointmark(p3); + sevent.int_point[0] = ip[0]; + sevent.int_point[1] = ip[1]; + sevent.int_point[2] = ip[2]; + } + terminatetetgen(this, 3); + } + } else { + // An unknown 'dir'. + terminatetetgen(this, 2); + } + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// report_selfint_face() Report a self-intersection at a facet. // +// // +// The triangle with vertices 'p1', 'p2', and 'p3' intersects with the edge // +// of the tetrahedra 'iedge'. The intersection type is reported by 'intflag',// +// 'types', and 'poss'. // +// // +// This routine ASSUMES (1) the triangle (p1,p2,p3) must belong to a facet, // +// 'sface' is a subface of the same facet; and (2) 'iedge' must be either a // +// segment or an edge of another facet. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::report_selfint_face(point p1, point p2, point p3, face* sface, + triface* iedge, int intflag, int* types, int* poss) +{ + face iface; + point e1 = NULL, e2 = NULL, e3 = NULL; + int etype = 0, geomtag = 0, facemark = 0; + + geomtag = shellmark(*sface); + + if (issubface(*iedge)) { + tspivot(*iedge, iface); + e1 = sorg(iface); + e2 = sdest(iface); + e3 = sapex(iface); + etype = 2; + facemark = geomtag; + } else if (issubseg(*iedge)) { + tsspivot1(*iedge, iface); + e1 = farsorg(iface); + e2 = farsdest(iface); + etype = 1; + face parentsh; + spivot(iface, parentsh); + facemark = shellmark(parentsh); + } else { + terminatetetgen(this, 2); + } + + if (intflag == 2) { + // The triangle and the edge intersect only at one point. + REAL ip[3], u = 0; + planelineint(p1, p2, p3, e1, e2, ip, &u); + if ((types[0] == (int) ACROSSFACE) || + (types[0] == (int) ACROSSEDGE)) { + // The triangle and the edge intersect in their interiors. + if (etype == 1) { + printf("PLC Error: A segment and a facet intersect at point"); + printf(" (%g,%g,%g).\n", ip[0], ip[1], ip[2]); + printf(" Segment: [%d,%d] #%d (%d)\n", pointmark(e1), pointmark(e2), + shellmark(iface), facemark); + printf(" Facet: [%d,%d,%d] #%d\n", pointmark(p1), + pointmark(p2), pointmark(p3), geomtag); + sevent.e_type = 2; + sevent.f_marker1 = facemark; + sevent.s_marker1 = shellmark(iface); + sevent.f_vertices1[0] = pointmark(e1); + sevent.f_vertices1[1] = pointmark(e2); + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = geomtag; + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = pointmark(p3); + sevent.int_point[0] = ip[0]; + sevent.int_point[1] = ip[1]; + sevent.int_point[2] = ip[2]; + } else { + printf("PLC Error: Two facets intersect at point"); + printf(" (%g,%g,%g).\n", ip[0], ip[1], ip[2]); + printf(" Facet 1: [%d,%d,%d] #%d\n", pointmark(e1), pointmark(e2), + pointmark(sorg(iface)), shellmark(iface)); + printf(" Facet 2: [%d,%d,%d] #%d\n", pointmark(p1), + pointmark(p2), pointmark(p3), geomtag); + sevent.e_type = 3; + sevent.f_marker1 = shellmark(iface); + sevent.s_marker1 = 0; + sevent.f_vertices1[0] = pointmark(e1); + sevent.f_vertices1[1] = pointmark(e2); + sevent.f_vertices1[2] = pointmark(sorg(iface)); + sevent.f_marker2 = geomtag; + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = pointmark(p3); + sevent.int_point[0] = ip[0]; + sevent.int_point[1] = ip[1]; + sevent.int_point[2] = ip[2]; + } + } else if (types[0] == (int) ACROSSVERT) { + // A vertex of the triangle and the edge intersect. + point crosspt = NULL; + if (poss[0] == 0) { + crosspt = p1; + } else if (poss[0] == 1) { + crosspt = p2; + } else if (poss[0] == 2) { + crosspt = p3; + } else { + terminatetetgen(this, 2); + } + if (!issteinerpoint(crosspt)) { + if (etype == 1) { + printf("PLC Error: A vertex and a segment intersect at (%g,%g,%g)\n", + crosspt[0], crosspt[1], crosspt[2]); + printf(" Vertex: #%d\n", pointmark(crosspt)); + printf(" Segment: [%d,%d] #%d (%d)\n", pointmark(e1), pointmark(e2), + shellmark(iface), facemark); + sevent.e_type = 7; + sevent.f_marker1 = 0; + sevent.s_marker1 = 0; + sevent.f_vertices1[0] = pointmark(crosspt); + sevent.f_vertices1[1] = 0; + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = facemark; + sevent.s_marker2 = shellmark(iface); + sevent.f_vertices2[0] = pointmark(e1); + sevent.f_vertices2[1] = pointmark(e2); + sevent.f_vertices2[2] = 0; + sevent.int_point[0] = crosspt[0]; + sevent.int_point[1] = crosspt[1]; + sevent.int_point[2] = crosspt[2]; + } else { + printf("PLC Error: A vertex and a facet intersect at (%g,%g,%g)\n", + crosspt[0], crosspt[1], crosspt[2]); + printf(" Vertex: #%d\n", pointmark(crosspt)); + printf(" Facet: [%d,%d,%d] #%d\n", pointmark(p1), + pointmark(p2), pointmark(p3), geomtag); + sevent.e_type = 8; + sevent.f_marker1 = 0; + sevent.s_marker1 = 0; + sevent.f_vertices1[0] = pointmark(crosspt); + sevent.f_vertices1[1] = 0; + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = geomtag; + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = pointmark(p3); + sevent.int_point[0] = crosspt[0]; + sevent.int_point[1] = crosspt[1]; + sevent.int_point[2] = crosspt[2]; + } + } else { + // It is a Steiner point. To be processed. + terminatetetgen(this, 2); + } + } else if ((types[0] == (int) TOUCHFACE) || + (types[0] == (int) TOUCHEDGE)) { + // The triangle and a vertex of the edge intersect. + point touchpt = NULL; + if (poss[1] == 0) { + touchpt = org(*iedge); + } else if (poss[1] == 1) { + touchpt = dest(*iedge); + } else { + terminatetetgen(this, 2); + } + if (!issteinerpoint(touchpt)) { + printf("PLC Error: A vertex and a facet intersect at (%g,%g,%g)\n", + touchpt[0], touchpt[1], touchpt[2]); + printf(" Vertex: #%d\n", pointmark(touchpt)); + printf(" Facet: [%d,%d,%d] #%d\n", pointmark(p1), + pointmark(p2), pointmark(p3), geomtag); + sevent.e_type = 8; + sevent.f_marker1 = 0; + sevent.s_marker1 = 0; + sevent.f_vertices1[0] = pointmark(touchpt); + sevent.f_vertices1[1] = 0; + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = geomtag; + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = pointmark(p3); + sevent.int_point[0] = touchpt[0]; + sevent.int_point[1] = touchpt[1]; + sevent.int_point[2] = touchpt[2]; + } else { + // It is a Steiner point. To be processed. + terminatetetgen(this, 2); + } + } else if (types[0] == (int) SHAREVERT) { + terminatetetgen(this, 2); + } else { + terminatetetgen(this, 2); + } + } else if (intflag == 4) { + if (types[0] == (int) SHAREFACE) { + printf("PLC Error: Two facets are overlapping.\n"); + printf(" Facet 1: [%d,%d,%d] #%d\n", pointmark(e1), + pointmark(e2), pointmark(e3), facemark); + printf(" Facet 2: [%d,%d,%d] #%d\n", pointmark(p1), + pointmark(p2), pointmark(p3), geomtag); + sevent.e_type = 6; + sevent.f_marker1 = facemark; + sevent.s_marker1 = 0; + sevent.f_vertices1[0] = pointmark(e1); + sevent.f_vertices1[1] = pointmark(e2); + sevent.f_vertices1[2] = pointmark(e3); + sevent.f_marker2 = geomtag; + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = pointmark(p3); + } else { + terminatetetgen(this, 2); + } + } else { + terminatetetgen(this, 2); + } + + terminatetetgen(this, 3); + return 0; +} + +//// //// +//// //// +//// geom_cxx ///////////////////////////////////////////////////////////////// + +//// flip_cxx ///////////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// flip23() Perform a 2-to-3 flip (face-to-edge flip). // +// // +// 'fliptets' is an array of three tets (handles), where the [0] and [1] are // +// [a,b,c,d] and [b,a,c,e]. The three new tets: [e,d,a,b], [e,d,b,c], and // +// [e,d,c,a] are returned in [0], [1], and [2] of 'fliptets'. As a result, // +// The face [a,b,c] is removed, and the edge [d,e] is created. // +// // +// If 'hullflag' > 0, hull tets may be involved in this flip, i.e., one of // +// the five vertices may be 'dummypoint'. There are two canonical cases: // +// (1) d is 'dummypoint', then all three new tets are hull tets. If e is // +// 'dummypoint', we reconfigure e to d, i.e., turn it up-side down. // +// (2) c is 'dummypoint', then two new tets: [e,d,b,c] and [e,d,c,a], are // +// hull tets. If a or b is 'dummypoint', we reconfigure it to c, i.e., // +// rotate the three input tets counterclockwisely (right-hand rule) // +// until a or b is in c's position. // +// // +// If 'fc->enqflag' is set, convex hull faces will be queued for flipping. // +// In particular, if 'fc->enqflag' is 1, it is called by incrementalflip() // +// after the insertion of a new point. It is assumed that 'd' is the new // +// point. IN this case, only link faces of 'd' are queued. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::flip23(triface* fliptets, int hullflag, flipconstraints *fc) +{ + triface topcastets[3], botcastets[3]; + triface newface, casface; + point pa, pb, pc, pd, pe; + REAL attrib, volume; + int dummyflag = 0; // range = {-1, 0, 1, 2}. + int i; + + if (hullflag > 0) { + // Check if e is dummypoint. + if (oppo(fliptets[1]) == dummypoint) { + // Swap the two old tets. + newface = fliptets[0]; + fliptets[0] = fliptets[1]; + fliptets[1] = newface; + dummyflag = -1; // d is dummypoint. + } else { + // Check if either a or b is dummypoint. + if (org(fliptets[0]) == dummypoint) { + dummyflag = 1; // a is dummypoint. + enextself(fliptets[0]); + eprevself(fliptets[1]); + } else if (dest(fliptets[0]) == dummypoint) { + dummyflag = 2; // b is dummypoint. + eprevself(fliptets[0]); + enextself(fliptets[1]); + } else { + dummyflag = 0; // either c or d may be dummypoint. + } + } + } + + pa = org(fliptets[0]); + pb = dest(fliptets[0]); + pc = apex(fliptets[0]); + pd = oppo(fliptets[0]); + pe = oppo(fliptets[1]); + + flip23count++; + + // Get the outer boundary faces. + for (i = 0; i < 3; i++) { + fnext(fliptets[0], topcastets[i]); + enextself(fliptets[0]); + } + for (i = 0; i < 3; i++) { + fnext(fliptets[1], botcastets[i]); + eprevself(fliptets[1]); + } + + // Re-use fliptets[0] and fliptets[1]. + fliptets[0].ver = 11; + fliptets[1].ver = 11; + setelemmarker(fliptets[0].tet, 0); // Clear all flags. + setelemmarker(fliptets[1].tet, 0); + // NOTE: the element attributes and volume constraint remain unchanged. + if (checksubsegflag) { + // Dealloc the space to subsegments. + if (fliptets[0].tet[8] != NULL) { + tet2segpool->dealloc((shellface *) fliptets[0].tet[8]); + fliptets[0].tet[8] = NULL; + } + if (fliptets[1].tet[8] != NULL) { + tet2segpool->dealloc((shellface *) fliptets[1].tet[8]); + fliptets[1].tet[8] = NULL; + } + } + if (checksubfaceflag) { + // Dealloc the space to subfaces. + if (fliptets[0].tet[9] != NULL) { + tet2subpool->dealloc((shellface *) fliptets[0].tet[9]); + fliptets[0].tet[9] = NULL; + } + if (fliptets[1].tet[9] != NULL) { + tet2subpool->dealloc((shellface *) fliptets[1].tet[9]); + fliptets[1].tet[9] = NULL; + } + } + // Create a new tet. + maketetrahedron(&(fliptets[2])); + // The new tet have the same attributes from the old tet. + for (i = 0; i < numelemattrib; i++) { + attrib = elemattribute(fliptets[0].tet, i); + setelemattribute(fliptets[2].tet, i, attrib); + } + if (b->varvolume) { + volume = volumebound(fliptets[0].tet); + setvolumebound(fliptets[2].tet, volume); + } + + if (hullflag > 0) { + // Check if d is dummytet. + if (pd != dummypoint) { + setvertices(fliptets[0], pe, pd, pa, pb); // [e,d,a,b] * + setvertices(fliptets[1], pe, pd, pb, pc); // [e,d,b,c] * + // Check if c is dummypoint. + if (pc != dummypoint) { + setvertices(fliptets[2], pe, pd, pc, pa); // [e,d,c,a] * + } else { + setvertices(fliptets[2], pd, pe, pa, pc); // [d,e,a,c] + esymself(fliptets[2]); // [e,d,c,a] * + } + // The hullsize does not change. + } else { + // d is dummypoint. + setvertices(fliptets[0], pa, pb, pe, pd); // [a,b,e,d] + setvertices(fliptets[1], pb, pc, pe, pd); // [b,c,e,d] + setvertices(fliptets[2], pc, pa, pe, pd); // [c,a,e,d] + // Adjust the faces to [e,d,a,b], [e,d,b,c], [e,d,c,a] * + for (i = 0; i < 3; i++) { + eprevesymself(fliptets[i]); + enextself(fliptets[i]); + } + // We deleted one hull tet, and created three hull tets. + hullsize += 2; + } + } else { + setvertices(fliptets[0], pe, pd, pa, pb); // [e,d,a,b] * + setvertices(fliptets[1], pe, pd, pb, pc); // [e,d,b,c] * + setvertices(fliptets[2], pe, pd, pc, pa); // [e,d,c,a] * + } + + if (fc->remove_ndelaunay_edge) { // calc_tetprism_vol + REAL volneg[2], volpos[3], vol_diff; + if (pd != dummypoint) { + if (pc != dummypoint) { + volpos[0] = tetprismvol(pe, pd, pa, pb); + volpos[1] = tetprismvol(pe, pd, pb, pc); + volpos[2] = tetprismvol(pe, pd, pc, pa); + volneg[0] = tetprismvol(pa, pb, pc, pd); + volneg[1] = tetprismvol(pb, pa, pc, pe); + } else { // pc == dummypoint + volpos[0] = tetprismvol(pe, pd, pa, pb); + volpos[1] = 0.; + volpos[2] = 0.; + volneg[0] = 0.; + volneg[1] = 0.; + } + } else { // pd == dummypoint. + volpos[0] = 0.; + volpos[1] = 0.; + volpos[2] = 0.; + volneg[0] = 0.; + volneg[1] = tetprismvol(pb, pa, pc, pe); + } + vol_diff = volpos[0] + volpos[1] + volpos[2] - volneg[0] - volneg[1]; + fc->tetprism_vol_sum += vol_diff; // Update the total sum. + } + + // Bond three new tets together. + for (i = 0; i < 3; i++) { + esym(fliptets[i], newface); + bond(newface, fliptets[(i + 1) % 3]); + } + // Bond to top outer boundary faces (at [a,b,c,d]). + for (i = 0; i < 3; i++) { + eorgoppo(fliptets[i], newface); // At edges [b,a], [c,b], [a,c]. + bond(newface, topcastets[i]); + } + // Bond bottom outer boundary faces (at [b,a,c,e]). + for (i = 0; i < 3; i++) { + edestoppo(fliptets[i], newface); // At edges [a,b], [b,c], [c,a]. + bond(newface, botcastets[i]); + } + + if (checksubsegflag) { + // Bond subsegments if there are. + // Each new tet has 5 edges to be checked (except the edge [e,d]). + face checkseg; + // The middle three: [a,b], [b,c], [c,a]. + for (i = 0; i < 3; i++) { + if (issubseg(topcastets[i])) { + tsspivot1(topcastets[i], checkseg); + eorgoppo(fliptets[i], newface); + tssbond1(newface, checkseg); + sstbond1(checkseg, newface); + if (fc->chkencflag & 1) { + enqueuesubface(badsubsegs, &checkseg); + } + } + } + // The top three: [d,a], [d,b], [d,c]. Two tets per edge. + for (i = 0; i < 3; i++) { + eprev(topcastets[i], casface); + if (issubseg(casface)) { + tsspivot1(casface, checkseg); + enext(fliptets[i], newface); + tssbond1(newface, checkseg); + sstbond1(checkseg, newface); + esym(fliptets[(i + 2) % 3], newface); + eprevself(newface); + tssbond1(newface, checkseg); + sstbond1(checkseg, newface); + if (fc->chkencflag & 1) { + enqueuesubface(badsubsegs, &checkseg); + } + } + } + // The bot three: [a,e], [b,e], [c,e]. Two tets per edge. + for (i = 0; i < 3; i++) { + enext(botcastets[i], casface); + if (issubseg(casface)) { + tsspivot1(casface, checkseg); + eprev(fliptets[i], newface); + tssbond1(newface, checkseg); + sstbond1(checkseg, newface); + esym(fliptets[(i + 2) % 3], newface); + enextself(newface); + tssbond1(newface, checkseg); + sstbond1(checkseg, newface); + if (fc->chkencflag & 1) { + enqueuesubface(badsubsegs, &checkseg); + } + } + } + } // if (checksubsegflag) + + if (checksubfaceflag) { + // Bond 6 subfaces if there are. + face checksh; + for (i = 0; i < 3; i++) { + if (issubface(topcastets[i])) { + tspivot(topcastets[i], checksh); + eorgoppo(fliptets[i], newface); + sesymself(checksh); + tsbond(newface, checksh); + if (fc->chkencflag & 2) { + enqueuesubface(badsubfacs, &checksh); + } + } + } + for (i = 0; i < 3; i++) { + if (issubface(botcastets[i])) { + tspivot(botcastets[i], checksh); + edestoppo(fliptets[i], newface); + sesymself(checksh); + tsbond(newface, checksh); + if (fc->chkencflag & 2) { + enqueuesubface(badsubfacs, &checksh); + } + } + } + } // if (checksubfaceflag) + + if (fc->chkencflag & 4) { + // Put three new tets into check list. + for (i = 0; i < 3; i++) { + enqueuetetrahedron(&(fliptets[i])); + } + } + + // Update the point-to-tet map. + setpoint2tet(pa, (tetrahedron) fliptets[0].tet); + setpoint2tet(pb, (tetrahedron) fliptets[0].tet); + setpoint2tet(pc, (tetrahedron) fliptets[1].tet); + setpoint2tet(pd, (tetrahedron) fliptets[0].tet); + setpoint2tet(pe, (tetrahedron) fliptets[0].tet); + + if (hullflag > 0) { + if (dummyflag != 0) { + // Restore the original position of the points (for flipnm()). + if (dummyflag == -1) { + // Reverse the edge. + for (i = 0; i < 3; i++) { + esymself(fliptets[i]); + } + // Swap the last two new tets. + newface = fliptets[1]; + fliptets[1] = fliptets[2]; + fliptets[2] = newface; + } else { + // either a or b were swapped. + if (dummyflag == 1) { + // a is dummypoint. + newface = fliptets[0]; + fliptets[0] = fliptets[2]; + fliptets[2] = fliptets[1]; + fliptets[1] = newface; + } else { // dummyflag == 2 + // b is dummypoint. + newface = fliptets[0]; + fliptets[0] = fliptets[1]; + fliptets[1] = fliptets[2]; + fliptets[2] = newface; + } + } + } + } + + if (fc->enqflag > 0) { + // Queue faces which may be locally non-Delaunay. + for (i = 0; i < 3; i++) { + eprevesym(fliptets[i], newface); + flippush(flipstack, &newface); + } + if (fc->enqflag > 1) { + for (i = 0; i < 3; i++) { + enextesym(fliptets[i], newface); + flippush(flipstack, &newface); + } + } + } + + recenttet = fliptets[0]; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// flip32() Perform a 3-to-2 flip (edge-to-face flip). // +// // +// 'fliptets' is an array of three tets (handles), which are [e,d,a,b], // +// [e,d,b,c], and [e,d,c,a]. The two new tets: [a,b,c,d] and [b,a,c,e] are // +// returned in [0] and [1] of 'fliptets'. As a result, the edge [e,d] is // +// replaced by the face [a,b,c]. // +// // +// If 'hullflag' > 0, hull tets may be involved in this flip, i.e., one of // +// the five vertices may be 'dummypoint'. There are two canonical cases: // +// (1) d is 'dummypoint', then [a,b,c,d] is hull tet. If e is 'dummypoint',// +// we reconfigure e to d, i.e., turnover it. // +// (2) c is 'dummypoint' then both [a,b,c,d] and [b,a,c,e] are hull tets. // +// If a or b is 'dummypoint', we reconfigure it to c, i.e., rotate the // +// three old tets counterclockwisely (right-hand rule) until a or b // +// is in c's position. // +// // +// If 'fc->enqflag' is set, convex hull faces will be queued for flipping. // +// In particular, if 'fc->enqflag' is 1, it is called by incrementalflip() // +// after the insertion of a new point. It is assumed that 'a' is the new // +// point. In this case, only link faces of 'a' are queued. // +// // +// If 'checksubfaceflag' is on (global variable), and assume [e,d] is not a // +// segment. There may be two (interior) subfaces sharing at [e,d], which are // +// [e,d,p] and [e,d,q], where the pair (p,q) may be either (a,b), or (b,c), // +// or (c,a) In such case, a 2-to-2 flip is performed on these two subfaces // +// and two new subfaces [p,q,e] and [p,q,d] are created. They are inserted // +// back into the tetrahedralization. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::flip32(triface* fliptets, int hullflag, flipconstraints *fc) +{ + triface topcastets[3], botcastets[3]; + triface newface, casface; + face flipshs[3]; + face checkseg; + point pa, pb, pc, pd, pe; + REAL attrib, volume; + int dummyflag = 0; // Rangle = {-1, 0, 1, 2} + int spivot = -1, scount = 0; // for flip22() + int t1ver; + int i, j; + + if (hullflag > 0) { + // Check if e is 'dummypoint'. + if (org(fliptets[0]) == dummypoint) { + // Reverse the edge. + for (i = 0; i < 3; i++) { + esymself(fliptets[i]); + } + // Swap the last two tets. + newface = fliptets[1]; + fliptets[1] = fliptets[2]; + fliptets[2] = newface; + dummyflag = -1; // e is dummypoint. + } else { + // Check if a or b is the 'dummypoint'. + if (apex(fliptets[0]) == dummypoint) { + dummyflag = 1; // a is dummypoint. + newface = fliptets[0]; + fliptets[0] = fliptets[1]; + fliptets[1] = fliptets[2]; + fliptets[2] = newface; + } else if (apex(fliptets[1]) == dummypoint) { + dummyflag = 2; // b is dummypoint. + newface = fliptets[0]; + fliptets[0] = fliptets[2]; + fliptets[2] = fliptets[1]; + fliptets[1] = newface; + } else { + dummyflag = 0; // either c or d may be dummypoint. + } + } + } + + pa = apex(fliptets[0]); + pb = apex(fliptets[1]); + pc = apex(fliptets[2]); + pd = dest(fliptets[0]); + pe = org(fliptets[0]); + + flip32count++; + + // Get the outer boundary faces. + for (i = 0; i < 3; i++) { + eorgoppo(fliptets[i], casface); + fsym(casface, topcastets[i]); + } + for (i = 0; i < 3; i++) { + edestoppo(fliptets[i], casface); + fsym(casface, botcastets[i]); + } + + if (checksubfaceflag) { + // Check if there are interior subfaces at the edge [e,d]. + for (i = 0; i < 3; i++) { + tspivot(fliptets[i], flipshs[i]); + if (flipshs[i].sh != NULL) { + // Found an interior subface. + stdissolve(flipshs[i]); // Disconnect the sub-tet bond. + scount++; + } else { + spivot = i; + } + } + } + + // Re-use fliptets[0] and fliptets[1]. + fliptets[0].ver = 11; + fliptets[1].ver = 11; + setelemmarker(fliptets[0].tet, 0); // Clear all flags. + setelemmarker(fliptets[1].tet, 0); + if (checksubsegflag) { + // Dealloc the space to subsegments. + if (fliptets[0].tet[8] != NULL) { + tet2segpool->dealloc((shellface *) fliptets[0].tet[8]); + fliptets[0].tet[8] = NULL; + } + if (fliptets[1].tet[8] != NULL) { + tet2segpool->dealloc((shellface *) fliptets[1].tet[8]); + fliptets[1].tet[8] = NULL; + } + } + if (checksubfaceflag) { + // Dealloc the space to subfaces. + if (fliptets[0].tet[9] != NULL) { + tet2subpool->dealloc((shellface *) fliptets[0].tet[9]); + fliptets[0].tet[9] = NULL; + } + if (fliptets[1].tet[9] != NULL) { + tet2subpool->dealloc((shellface *) fliptets[1].tet[9]); + fliptets[1].tet[9] = NULL; + } + } + if (checksubfaceflag) { + if (scount > 0) { + // The element attributes and volume constraint must be set correctly. + // There are two subfaces involved in this flip. The three tets are + // separated into two different regions, one may be exterior. The + // first region has two tets, and the second region has only one. + // The two created tets must be in the same region as the first region. + // The element attributes and volume constraint must be set correctly. + //assert(spivot != -1); + // The tet fliptets[spivot] is in the first region. + for (j = 0; j < 2; j++) { + for (i = 0; i < numelemattrib; i++) { + attrib = elemattribute(fliptets[spivot].tet, i); + setelemattribute(fliptets[j].tet, i, attrib); + } + if (b->varvolume) { + volume = volumebound(fliptets[spivot].tet); + setvolumebound(fliptets[j].tet, volume); + } + } + } + } + // Delete an old tet. + tetrahedrondealloc(fliptets[2].tet); + + if (hullflag > 0) { + // Check if c is dummypointc. + if (pc != dummypoint) { + // Check if d is dummypoint. + if (pd != dummypoint) { + // No hull tet is involved. + } else { + // We deleted three hull tets, and created one hull tet. + hullsize -= 2; + } + setvertices(fliptets[0], pa, pb, pc, pd); + setvertices(fliptets[1], pb, pa, pc, pe); + } else { + // c is dummypoint. The two new tets are hull tets. + setvertices(fliptets[0], pb, pa, pd, pc); + setvertices(fliptets[1], pa, pb, pe, pc); + // Adjust badc -> abcd. + esymself(fliptets[0]); + // Adjust abec -> bace. + esymself(fliptets[1]); + // The hullsize does not change. + } + } else { + setvertices(fliptets[0], pa, pb, pc, pd); + setvertices(fliptets[1], pb, pa, pc, pe); + } + + if (fc->remove_ndelaunay_edge) { // calc_tetprism_vol + REAL volneg[3], volpos[2], vol_diff; + if (pc != dummypoint) { + if (pd != dummypoint) { + volneg[0] = tetprismvol(pe, pd, pa, pb); + volneg[1] = tetprismvol(pe, pd, pb, pc); + volneg[2] = tetprismvol(pe, pd, pc, pa); + volpos[0] = tetprismvol(pa, pb, pc, pd); + volpos[1] = tetprismvol(pb, pa, pc, pe); + } else { // pd == dummypoint + volneg[0] = 0.; + volneg[1] = 0.; + volneg[2] = 0.; + volpos[0] = 0.; + volpos[1] = tetprismvol(pb, pa, pc, pe); + } + } else { // pc == dummypoint. + volneg[0] = tetprismvol(pe, pd, pa, pb); + volneg[1] = 0.; + volneg[2] = 0.; + volpos[0] = 0.; + volpos[1] = 0.; + } + vol_diff = volpos[0] + volpos[1] - volneg[0] - volneg[1] - volneg[2]; + fc->tetprism_vol_sum += vol_diff; // Update the total sum. + } + + // Bond abcd <==> bace. + bond(fliptets[0], fliptets[1]); + // Bond new faces to top outer boundary faces (at abcd). + for (i = 0; i < 3; i++) { + esym(fliptets[0], newface); + bond(newface, topcastets[i]); + enextself(fliptets[0]); + } + // Bond new faces to bottom outer boundary faces (at bace). + for (i = 0; i < 3; i++) { + esym(fliptets[1], newface); + bond(newface, botcastets[i]); + eprevself(fliptets[1]); + } + + if (checksubsegflag) { + // Bond 9 segments to new (flipped) tets. + for (i = 0; i < 3; i++) { // edges a->b, b->c, c->a. + if (issubseg(topcastets[i])) { + tsspivot1(topcastets[i], checkseg); + tssbond1(fliptets[0], checkseg); + sstbond1(checkseg, fliptets[0]); + tssbond1(fliptets[1], checkseg); + sstbond1(checkseg, fliptets[1]); + if (fc->chkencflag & 1) { + enqueuesubface(badsubsegs, &checkseg); + } + } + enextself(fliptets[0]); + eprevself(fliptets[1]); + } + // The three top edges. + for (i = 0; i < 3; i++) { // edges b->d, c->d, a->d. + esym(fliptets[0], newface); + eprevself(newface); + enext(topcastets[i], casface); + if (issubseg(casface)) { + tsspivot1(casface, checkseg); + tssbond1(newface, checkseg); + sstbond1(checkseg, newface); + if (fc->chkencflag & 1) { + enqueuesubface(badsubsegs, &checkseg); + } + } + enextself(fliptets[0]); + } + // The three bot edges. + for (i = 0; i < 3; i++) { // edges b<-e, c<-e, a<-e. + esym(fliptets[1], newface); + enextself(newface); + eprev(botcastets[i], casface); + if (issubseg(casface)) { + tsspivot1(casface, checkseg); + tssbond1(newface, checkseg); + sstbond1(checkseg, newface); + if (fc->chkencflag & 1) { + enqueuesubface(badsubsegs, &checkseg); + } + } + eprevself(fliptets[1]); + } + } // if (checksubsegflag) + + if (checksubfaceflag) { + face checksh; + // Bond the top three casing subfaces. + for (i = 0; i < 3; i++) { // At edges [b,a], [c,b], [a,c] + if (issubface(topcastets[i])) { + tspivot(topcastets[i], checksh); + esym(fliptets[0], newface); + sesymself(checksh); + tsbond(newface, checksh); + if (fc->chkencflag & 2) { + enqueuesubface(badsubfacs, &checksh); + } + } + enextself(fliptets[0]); + } + // Bond the bottom three casing subfaces. + for (i = 0; i < 3; i++) { // At edges [a,b], [b,c], [c,a] + if (issubface(botcastets[i])) { + tspivot(botcastets[i], checksh); + esym(fliptets[1], newface); + sesymself(checksh); + tsbond(newface, checksh); + if (fc->chkencflag & 2) { + enqueuesubface(badsubfacs, &checksh); + } + } + eprevself(fliptets[1]); + } + + if (scount > 0) { + face flipfaces[2]; + // Perform a 2-to-2 flip in subfaces. + flipfaces[0] = flipshs[(spivot + 1) % 3]; + flipfaces[1] = flipshs[(spivot + 2) % 3]; + sesymself(flipfaces[1]); + flip22(flipfaces, 0, fc->chkencflag); + // Connect the flipped subfaces to flipped tets. + // First go to the corresponding flipping edge. + // Re-use top- and botcastets[0]. + topcastets[0] = fliptets[0]; + botcastets[0] = fliptets[1]; + for (i = 0; i < ((spivot + 1) % 3); i++) { + enextself(topcastets[0]); + eprevself(botcastets[0]); + } + // Connect the top subface to the top tets. + esymself(topcastets[0]); + sesymself(flipfaces[0]); + // Check if there already exists a subface. + tspivot(topcastets[0], checksh); + if (checksh.sh == NULL) { + tsbond(topcastets[0], flipfaces[0]); + fsymself(topcastets[0]); + sesymself(flipfaces[0]); + tsbond(topcastets[0], flipfaces[0]); + } else { + // An invalid 2-to-2 flip. Report a bug. + terminatetetgen(this, 2); + } + // Connect the bot subface to the bottom tets. + esymself(botcastets[0]); + sesymself(flipfaces[1]); + // Check if there already exists a subface. + tspivot(botcastets[0], checksh); + if (checksh.sh == NULL) { + tsbond(botcastets[0], flipfaces[1]); + fsymself(botcastets[0]); + sesymself(flipfaces[1]); + tsbond(botcastets[0], flipfaces[1]); + } else { + // An invalid 2-to-2 flip. Report a bug. + terminatetetgen(this, 2); + } + } // if (scount > 0) + } // if (checksubfaceflag) + + if (fc->chkencflag & 4) { + // Put two new tets into check list. + for (i = 0; i < 2; i++) { + enqueuetetrahedron(&(fliptets[i])); + } + } + + setpoint2tet(pa, (tetrahedron) fliptets[0].tet); + setpoint2tet(pb, (tetrahedron) fliptets[0].tet); + setpoint2tet(pc, (tetrahedron) fliptets[0].tet); + setpoint2tet(pd, (tetrahedron) fliptets[0].tet); + setpoint2tet(pe, (tetrahedron) fliptets[1].tet); + + if (hullflag > 0) { + if (dummyflag != 0) { + // Restore the original position of the points (for flipnm()). + if (dummyflag == -1) { + // e were dummypoint. Swap the two new tets. + newface = fliptets[0]; + fliptets[0] = fliptets[1]; + fliptets[1] = newface; + } else { + // a or b was dummypoint. + if (dummyflag == 1) { + eprevself(fliptets[0]); + enextself(fliptets[1]); + } else { // dummyflag == 2 + enextself(fliptets[0]); + eprevself(fliptets[1]); + } + } + } + } + + if (fc->enqflag > 0) { + // Queue faces which may be locally non-Delaunay. + // pa = org(fliptets[0]); // 'a' may be a new vertex. + enextesym(fliptets[0], newface); + flippush(flipstack, &newface); + eprevesym(fliptets[1], newface); + flippush(flipstack, &newface); + if (fc->enqflag > 1) { + //pb = dest(fliptets[0]); + eprevesym(fliptets[0], newface); + flippush(flipstack, &newface); + enextesym(fliptets[1], newface); + flippush(flipstack, &newface); + //pc = apex(fliptets[0]); + esym(fliptets[0], newface); + flippush(flipstack, &newface); + esym(fliptets[1], newface); + flippush(flipstack, &newface); + } + } + + recenttet = fliptets[0]; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// flip41() Perform a 4-to-1 flip (Remove a vertex). // +// // +// 'fliptets' is an array of four tetrahedra in the star of the removing // +// vertex 'p'. Let the four vertices in the star of p be a, b, c, and d. The // +// four tets in 'fliptets' are: [p,d,a,b], [p,d,b,c], [p,d,c,a], and [a,b,c, // +// p]. On return, 'fliptets[0]' is the new tet [a,b,c,d]. // +// // +// If 'hullflag' is set (> 0), one of the five vertices may be 'dummypoint'. // +// The 'hullsize' may be changed. Note that p may be dummypoint. In this // +// case, four hull tets are replaced by one real tet. // +// // +// If 'checksubface' flag is set (>0), it is possible that there are three // +// interior subfaces connecting at p. If so, a 3-to-1 flip is performed to // +// to remove p from the surface triangulation. // +// // +// If it is called by the routine incrementalflip(), we assume that d is the // +// newly inserted vertex. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::flip41(triface* fliptets, int hullflag, flipconstraints *fc) +{ + triface topcastets[3], botcastet; + triface newface, neightet; + face flipshs[4]; + point pa, pb, pc, pd, pp; + int dummyflag = 0; // in {0, 1, 2, 3, 4} + int spivot = -1, scount = 0; + int t1ver; + int i; + + pa = org(fliptets[3]); + pb = dest(fliptets[3]); + pc = apex(fliptets[3]); + pd = dest(fliptets[0]); + pp = org(fliptets[0]); // The removing vertex. + + flip41count++; + + // Get the outer boundary faces. + for (i = 0; i < 3; i++) { + enext(fliptets[i], topcastets[i]); + fnextself(topcastets[i]); // [d,a,b,#], [d,b,c,#], [d,c,a,#] + enextself(topcastets[i]); // [a,b,d,#], [b,c,d,#], [c,a,d,#] + } + fsym(fliptets[3], botcastet); // [b,a,c,#] + + if (checksubfaceflag) { + // Check if there are three subfaces at 'p'. + // Re-use 'newface'. + for (i = 0; i < 3; i++) { + fnext(fliptets[3], newface); // [a,b,p,d],[b,c,p,d],[c,a,p,d]. + tspivot(newface, flipshs[i]); + if (flipshs[i].sh != NULL) { + spivot = i; // Remember this subface. + scount++; + } + enextself(fliptets[3]); + } + if (scount > 0) { + // There are three subfaces connecting at p. + if (scount < 3) { + // The new subface is one of {[a,b,d], [b,c,d], [c,a,d]}. + // Go to the tet containing the three subfaces. + fsym(topcastets[spivot], neightet); + // Get the three subfaces connecting at p. + for (i = 0; i < 3; i++) { + esym(neightet, newface); + tspivot(newface, flipshs[i]); + eprevself(neightet); + } + } else { + spivot = 3; // The new subface is [a,b,c]. + } + } + } // if (checksubfaceflag) + + + // Re-use fliptets[0] for [a,b,c,d]. + fliptets[0].ver = 11; + setelemmarker(fliptets[0].tet, 0); // Clean all flags. + // NOTE: the element attributes and volume constraint remain unchanged. + if (checksubsegflag) { + // Dealloc the space to subsegments. + if (fliptets[0].tet[8] != NULL) { + tet2segpool->dealloc((shellface *) fliptets[0].tet[8]); + fliptets[0].tet[8] = NULL; + } + } + if (checksubfaceflag) { + // Dealloc the space to subfaces. + if (fliptets[0].tet[9] != NULL) { + tet2subpool->dealloc((shellface *) fliptets[0].tet[9]); + fliptets[0].tet[9] = NULL; + } + } + // Delete the other three tets. + for (i = 1; i < 4; i++) { + tetrahedrondealloc(fliptets[i].tet); + } + + if (pp != dummypoint) { + // Mark the point pp as unused. + setpointtype(pp, UNUSEDVERTEX); + unuverts++; + } + + // Create the new tet [a,b,c,d]. + if (hullflag > 0) { + // One of the five vertices may be 'dummypoint'. + if (pa == dummypoint) { + // pa is dummypoint. + setvertices(fliptets[0], pc, pb, pd, pa); + esymself(fliptets[0]); // [b,c,a,d] + eprevself(fliptets[0]); // [a,b,c,d] + dummyflag = 1; + } else if (pb == dummypoint) { + setvertices(fliptets[0], pa, pc, pd, pb); + esymself(fliptets[0]); // [c,a,b,d] + enextself(fliptets[0]); // [a,b,c,d] + dummyflag = 2; + } else if (pc == dummypoint) { + setvertices(fliptets[0], pb, pa, pd, pc); + esymself(fliptets[0]); // [a,b,c,d] + dummyflag = 3; + } else if (pd == dummypoint) { + setvertices(fliptets[0], pa, pb, pc, pd); + dummyflag = 4; + } else { + setvertices(fliptets[0], pa, pb, pc, pd); + if (pp == dummypoint) { + dummyflag = -1; + } else { + dummyflag = 0; + } + } + if (dummyflag > 0) { + // We deleted 3 hull tets, and create 1 hull tet. + hullsize -= 2; + } else if (dummyflag < 0) { + // We deleted 4 hull tets. + hullsize -= 4; + // meshedges does not change. + } + } else { + setvertices(fliptets[0], pa, pb, pc, pd); + } + + if (fc->remove_ndelaunay_edge) { // calc_tetprism_vol + REAL volneg[4], volpos[1], vol_diff; + if (dummyflag > 0) { + if (pa == dummypoint) { + volneg[0] = 0.; + volneg[1] = tetprismvol(pp, pd, pb, pc); + volneg[2] = 0.; + volneg[3] = 0.; + } else if (pb == dummypoint) { + volneg[0] = 0.; + volneg[1] = 0.; + volneg[2] = tetprismvol(pp, pd, pc, pa); + volneg[3] = 0.; + } else if (pc == dummypoint) { + volneg[0] = tetprismvol(pp, pd, pa, pb); + volneg[1] = 0.; + volneg[2] = 0.; + volneg[3] = 0.; + } else { // pd == dummypoint + volneg[0] = 0.; + volneg[1] = 0.; + volneg[2] = 0.; + volneg[3] = tetprismvol(pa, pb, pc, pp); + } + volpos[0] = 0.; + } else if (dummyflag < 0) { + volneg[0] = 0.; + volneg[1] = 0.; + volneg[2] = 0.; + volneg[3] = 0.; + volpos[0] = tetprismvol(pa, pb, pc, pd); + } else { + volneg[0] = tetprismvol(pp, pd, pa, pb); + volneg[1] = tetprismvol(pp, pd, pb, pc); + volneg[2] = tetprismvol(pp, pd, pc, pa); + volneg[3] = tetprismvol(pa, pb, pc, pp); + volpos[0] = tetprismvol(pa, pb, pc, pd); + } + vol_diff = volpos[0] - volneg[0] - volneg[1] - volneg[2] - volneg[3]; + fc->tetprism_vol_sum += vol_diff; // Update the total sum. + } + + // Bond the new tet to adjacent tets. + for (i = 0; i < 3; i++) { + esym(fliptets[0], newface); // At faces [b,a,d], [c,b,d], [a,c,d]. + bond(newface, topcastets[i]); + enextself(fliptets[0]); + } + bond(fliptets[0], botcastet); + + if (checksubsegflag) { + face checkseg; + // Bond 6 segments (at edges of [a,b,c,d]) if there there are. + for (i = 0; i < 3; i++) { + eprev(topcastets[i], newface); // At edges [d,a],[d,b],[d,c]. + if (issubseg(newface)) { + tsspivot1(newface, checkseg); + esym(fliptets[0], newface); + enextself(newface); // At edges [a,d], [b,d], [c,d]. + tssbond1(newface, checkseg); + sstbond1(checkseg, newface); + if (fc->chkencflag & 1) { + enqueuesubface(badsubsegs, &checkseg); + } + } + enextself(fliptets[0]); + } + for (i = 0; i < 3; i++) { + if (issubseg(topcastets[i])) { + tsspivot1(topcastets[i], checkseg); // At edges [a,b],[b,c],[c,a]. + tssbond1(fliptets[0], checkseg); + sstbond1(checkseg, fliptets[0]); + if (fc->chkencflag & 1) { + enqueuesubface(badsubsegs, &checkseg); + } + } + enextself(fliptets[0]); + } + } + + if (checksubfaceflag) { + face checksh; + // Bond 4 subfaces (at faces of [a,b,c,d]) if there are. + for (i = 0; i < 3; i++) { + if (issubface(topcastets[i])) { + tspivot(topcastets[i], checksh); // At faces [a,b,d],[b,c,d],[c,a,d] + esym(fliptets[0], newface); // At faces [b,a,d],[c,b,d],[a,c,d] + sesymself(checksh); + tsbond(newface, checksh); + if (fc->chkencflag & 2) { + enqueuesubface(badsubfacs, &checksh); + } + } + enextself(fliptets[0]); + } + if (issubface(botcastet)) { + tspivot(botcastet, checksh); // At face [b,a,c] + sesymself(checksh); + tsbond(fliptets[0], checksh); + if (fc->chkencflag & 2) { + enqueuesubface(badsubfacs, &checksh); + } + } + + if (spivot >= 0) { + // Perform a 3-to-1 flip in surface triangulation. + // Depending on the value of 'spivot', the three subfaces are: + // - 0: [a,b,p], [b,d,p], [d,a,p] + // - 1: [b,c,p], [c,d,p], [d,b,p] + // - 2: [c,a,p], [a,d,p], [d,c,p] + // - 3: [a,b,p], [b,c,p], [c,a,p] + // Adjust the three subfaces such that their origins are p, i.e., + // - 3: [p,a,b], [p,b,c], [p,c,a]. (Required by the flip31()). + for (i = 0; i < 3; i++) { + senext2self(flipshs[i]); + } + flip31(flipshs, 0); + // Delete the three old subfaces. + for (i = 0; i < 3; i++) { + shellfacedealloc(subfaces, flipshs[i].sh); + } + if (spivot < 3) { + // // Bond the new subface to the new tet [a,b,c,d]. + tsbond(topcastets[spivot], flipshs[3]); + fsym(topcastets[spivot], newface); + sesym(flipshs[3], checksh); + tsbond(newface, checksh); + } else { + // Bound the new subface [a,b,c] to the new tet [a,b,c,d]. + tsbond(fliptets[0], flipshs[3]); + fsym(fliptets[0], newface); + sesym(flipshs[3], checksh); + tsbond(newface, checksh); + } + } // if (spivot > 0) + } // if (checksubfaceflag) + + if (fc->chkencflag & 4) { + enqueuetetrahedron(&(fliptets[0])); + } + + // Update the point-to-tet map. + setpoint2tet(pa, (tetrahedron) fliptets[0].tet); + setpoint2tet(pb, (tetrahedron) fliptets[0].tet); + setpoint2tet(pc, (tetrahedron) fliptets[0].tet); + setpoint2tet(pd, (tetrahedron) fliptets[0].tet); + + if (fc->enqflag > 0) { + // Queue faces which may be locally non-Delaunay. + flippush(flipstack, &(fliptets[0])); // [a,b,c] (opposite to new point). + if (fc->enqflag > 1) { + for (i = 0; i < 3; i++) { + esym(fliptets[0], newface); + flippush(flipstack, &newface); + enextself(fliptets[0]); + } + } + } + + recenttet = fliptets[0]; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// flipnm() Flip an edge through a sequence of elementary flips. // +// // +// 'abtets' is an array of 'n' tets in the star of edge [a,b].These tets are // +// ordered in a counterclockwise cycle with respect to the vector a->b, i.e.,// +// use the right-hand rule. // +// // +// 'level' (>= 0) indicates the current link level. If 'level > 0', we are // +// flipping a link edge of an edge [a',b'], and 'abedgepivot' indicates // +// which link edge, i.e., [c',b'] or [a',c'], is [a,b] These two parameters // +// allow us to determine the new tets after a 3-to-2 flip, i.e., tets that // +// do not inside the reduced star of edge [a',b']. // +// // +// If the flag 'fc->unflip' is set, this routine un-does the flips performed // +// in flipnm([a,b]) so that the mesh is returned to its original state // +// before doing the flipnm([a,b]) operation. // +// // +// The return value is an integer nn, where nn <= n. If nn is 2, then the // +// edge is flipped. The first and the second tets in 'abtets' are new tets. // +// Otherwise, nn > 2, the edge is not flipped, and nn is the number of tets // +// in the current star of [a,b]. // +// // +// ASSUMPTIONS: // +// - Neither a nor b is 'dummypoint'. // +// - [a,b] must not be a segment. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::flipnm(triface* abtets, int n, int level, int abedgepivot, + flipconstraints* fc) +{ + triface fliptets[3], spintet, flipedge; + triface *tmpabtets, *parytet; + point pa, pb, pc, pd, pe, pf; + REAL ori; + int hullflag, hulledgeflag; + int reducflag, rejflag; + int reflexlinkedgecount; + int edgepivot; + int n1, nn; + int t1ver; + int i, j; + + pa = org(abtets[0]); + pb = dest(abtets[0]); + + if (n > 3) { + // Try to reduce the size of the Star(ab) by flipping a face in it. + reflexlinkedgecount = 0; + + for (i = 0; i < n; i++) { + // Let the face of 'abtets[i]' be [a,b,c]. + if (checksubfaceflag) { + if (issubface(abtets[i])) { + continue; // Skip a subface. + } + } + // Do not flip this face if it is involved in two Stars. + if ((elemcounter(abtets[i]) > 1) || + (elemcounter(abtets[(i - 1 + n) % n]) > 1)) { + continue; + } + + pc = apex(abtets[i]); + pd = apex(abtets[(i + 1) % n]); + pe = apex(abtets[(i - 1 + n) % n]); + if ((pd == dummypoint) || (pe == dummypoint)) { + continue; // [a,b,c] is a hull face. + } + + + // Decide whether [a,b,c] is flippable or not. + reducflag = 0; + + hullflag = (pc == dummypoint); // pc may be dummypoint. + hulledgeflag = 0; + if (hullflag == 0) { + ori = orient3d(pb, pc, pd, pe); // Is [b,c] locally convex? + if (ori > 0) { + ori = orient3d(pc, pa, pd, pe); // Is [c,a] locally convex? + if (ori > 0) { + // Test if [a,b] is locally convex OR flat. + ori = orient3d(pa, pb, pd, pe); + if (ori > 0) { + // Found a 2-to-3 flip: [a,b,c] => [e,d] + reducflag = 1; + } else if (ori == 0) { + // [a,b] is flat. + if (n == 4) { + // The "flat" tet can be removed immediately by a 3-to-2 flip. + reducflag = 1; + // Check if [e,d] is a hull edge. + pf = apex(abtets[(i + 2) % n]); + hulledgeflag = (pf == dummypoint); + } + } + } + } + if (!reducflag) { + reflexlinkedgecount++; + } + } else { + // 'c' is dummypoint. + if (n == 4) { + // Let the vertex opposite to 'c' is 'f'. + // A 4-to-4 flip is possible if the two tets [d,e,f,a] and [e,d,f,b] + // are valid tets. + // Note: When the mesh is not convex, it is possible that [a,b] is + // locally non-convex (at hull faces [a,b,e] and [b,a,d]). + // In this case, an edge flip [a,b] to [e,d] is still possible. + pf = apex(abtets[(i + 2) % n]); + ori = orient3d(pd, pe, pf, pa); + if (ori < 0) { + ori = orient3d(pe, pd, pf, pb); + if (ori < 0) { + // Found a 4-to-4 flip: [a,b] => [e,d] + reducflag = 1; + ori = 0; // Signal as a 4-to-4 flip (like a co-planar case). + hulledgeflag = 1; // [e,d] is a hull edge. + } + } + } + } // if (hullflag) + + if (reducflag) { + if (nonconvex && hulledgeflag) { + // We will create a hull edge [e,d]. Make sure it does not exist. + if (getedge(pe, pd, &spintet)) { + // The 2-to-3 flip is not a topological valid flip. + reducflag = 0; + } + } + } + + if (reducflag) { + // [a,b,c] could be removed by a 2-to-3 flip. + rejflag = 0; + if (fc->checkflipeligibility) { + // Check if the flip can be performed. + rejflag = checkflipeligibility(1, pa, pb, pc, pd, pe, level, + abedgepivot, fc); + } + if (!rejflag) { + // Do flip: [a,b,c] => [e,d]. + fliptets[0] = abtets[i]; + fsym(fliptets[0], fliptets[1]); // abtets[i-1]. + flip23(fliptets, hullflag, fc); + + // Shrink the array 'abtets', maintain the original order. + // Two tets 'abtets[i-1] ([a,b,e,c])' and 'abtets[i] ([a,b,c,d])' + // are flipped, i.e., they do not in Star(ab) anymore. + // 'fliptets[0]' ([e,d,a,b]) is in Star(ab), it is saved in + // 'abtets[i-1]' (adjust it to be [a,b,e,d]), see below: + // + // before after + // [0] |___________| [0] |___________| + // ... |___________| ... |___________| + // [i-1] |_[a,b,e,c]_| [i-1] |_[a,b,e,d]_| + // [i] |_[a,b,c,d]_| --> [i] |_[a,b,d,#]_| + // [i+1] |_[a,b,d,#]_| [i+1] |_[a,b,#,*]_| + // ... |___________| ... |___________| + // [n-2] |___________| [n-2] |___________| + // [n-1] |___________| [n-1] |_[i]_2-t-3_| + // + edestoppoself(fliptets[0]); // [a,b,e,d] + // Increase the counter of this new tet (it is in Star(ab)). + increaseelemcounter(fliptets[0]); + abtets[(i - 1 + n) % n] = fliptets[0]; + for (j = i; j < n - 1; j++) { + abtets[j] = abtets[j + 1]; // Upshift + } + // The last entry 'abtets[n-1]' is empty. It is used in two ways: + // (i) it remembers the vertex 'c' (in 'abtets[n-1].tet'), and + // (ii) it remembers the position [i] where this flip took place. + // These information let us to either undo this flip or recover + // the original edge link (for collecting new created tets). + abtets[n - 1].tet = (tetrahedron *) pc; + abtets[n - 1].ver = 0; // Clear it. + // 'abtets[n - 1].ver' is in range [0,11] -- only uses 4 bits. + // Use the 5th bit in 'abtets[n - 1].ver' to signal a 2-to-3 flip. + abtets[n - 1].ver |= (1 << 4); + // The poisition [i] of this flip is saved above the 7th bit. + abtets[n - 1].ver |= (i << 6); + + if (fc->collectnewtets) { + // Push the two new tets [e,d,b,c] and [e,d,c,a] into a stack. + // Re-use the global array 'cavetetlist'. + for (j = 1; j < 3; j++) { + cavetetlist->newindex((void **) &parytet); + *parytet = fliptets[j]; // fliptets[1], fliptets[2]. + } + } + + // Star(ab) is reduced. Try to flip the edge [a,b]. + nn = flipnm(abtets, n - 1, level, abedgepivot, fc); + + if (nn == 2) { + // The edge has been flipped. + return nn; + } else { // if (nn > 2) + // The edge is not flipped. + if (fc->unflip || (ori == 0)) { + // Undo the previous 2-to-3 flip, i.e., do a 3-to-2 flip to + // transform [e,d] => [a,b,c]. + // 'ori == 0' means that the previous flip created a degenerated + // tet. It must be removed. + // Remember that 'abtets[i-1]' is [a,b,e,d]. We can use it to + // find another two tets [e,d,b,c] and [e,d,c,a]. + fliptets[0] = abtets[(i-1 + (n-1)) % (n-1)]; // [a,b,e,d] + edestoppoself(fliptets[0]); // [e,d,a,b] + fnext(fliptets[0], fliptets[1]); // [1] is [e,d,b,c] + fnext(fliptets[1], fliptets[2]); // [2] is [e,d,c,a] + // Restore the two original tets in Star(ab). + flip32(fliptets, hullflag, fc); + // Marktest the two restored tets in Star(ab). + for (j = 0; j < 2; j++) { + increaseelemcounter(fliptets[j]); + } + // Expand the array 'abtets', maintain the original order. + for (j = n - 2; j>= i; j--) { + abtets[j + 1] = abtets[j]; // Downshift + } + // Insert the two new tets 'fliptets[0]' [a,b,c,d] and + // 'fliptets[1]' [b,a,c,e] into the (i-1)-th and i-th entries, + // respectively. + esym(fliptets[1], abtets[(i - 1 + n) % n]); // [a,b,e,c] + abtets[i] = fliptets[0]; // [a,b,c,d] + nn++; + if (fc->collectnewtets) { + // Pop two (flipped) tets from the stack. + cavetetlist->objects -= 2; + } + } // if (unflip || (ori == 0)) + } // if (nn > 2) + + if (!fc->unflip) { + // The flips are not reversed. The current Star(ab) can not be + // further reduced. Return its current size (# of tets). + return nn; + } + // unflip is set. + // Continue the search for flips. + } + } // if (reducflag) + } // i + + // The Star(ab) is not reduced. + if (reflexlinkedgecount > 0) { + // There are reflex edges in the Link(ab). + if (((b->fliplinklevel < 0) && (level < autofliplinklevel)) || + ((b->fliplinklevel >= 0) && (level < b->fliplinklevel))) { + // Try to reduce the Star(ab) by flipping a reflex edge in Link(ab). + for (i = 0; i < n; i++) { + // Do not flip this face [a,b,c] if there are two Stars involved. + if ((elemcounter(abtets[i]) > 1) || + (elemcounter(abtets[(i - 1 + n) % n]) > 1)) { + continue; + } + pc = apex(abtets[i]); + if (pc == dummypoint) { + continue; // [a,b] is a hull edge. + } + pd = apex(abtets[(i + 1) % n]); + pe = apex(abtets[(i - 1 + n) % n]); + if ((pd == dummypoint) || (pe == dummypoint)) { + continue; // [a,b,c] is a hull face. + } + + + edgepivot = 0; // No edge is selected yet. + + // Test if [b,c] is locally convex or flat. + ori = orient3d(pb, pc, pd, pe); + if (ori <= 0) { + // Select the edge [c,b]. + enext(abtets[i], flipedge); // [b,c,a,d] + edgepivot = 1; + } + if (!edgepivot) { + // Test if [c,a] is locally convex or flat. + ori = orient3d(pc, pa, pd, pe); + if (ori <= 0) { + // Select the edge [a,c]. + eprev(abtets[i], flipedge); // [c,a,b,d]. + edgepivot = 2; + } + } + + if (!edgepivot) continue; + + // An edge is selected. + if (checksubsegflag) { + // Do not flip it if it is a segment. + if (issubseg(flipedge)) { + if (fc->collectencsegflag) { + face checkseg, *paryseg; + tsspivot1(flipedge, checkseg); + if (!sinfected(checkseg)) { + // Queue this segment in list. + sinfect(checkseg); + caveencseglist->newindex((void **) &paryseg); + *paryseg = checkseg; + } + } + continue; + } + } + + // Try to flip the selected edge ([c,b] or [a,c]). + esymself(flipedge); + // Count the number of tets at the edge. + n1 = 0; + j = 0; // Sum of the star counters. + spintet = flipedge; + while (1) { + n1++; + j += (elemcounter(spintet)); + fnextself(spintet); + if (spintet.tet == flipedge.tet) break; + } + if (n1 < 3) { + // This is only possible when the mesh contains inverted + // elements. Reprot a bug. + terminatetetgen(this, 2); + } + if (j > 2) { + // The Star(flipedge) overlaps other Stars. + continue; // Do not flip this edge. + } + + if ((b->flipstarsize > 0) && (n1 > b->flipstarsize)) { + // The star size exceeds the given limit. + continue; // Do not flip it. + } + + // Allocate spaces for Star(flipedge). + tmpabtets = new triface[n1]; + // Form the Star(flipedge). + j = 0; + spintet = flipedge; + while (1) { + tmpabtets[j] = spintet; + // Increase the star counter of this tet. + increaseelemcounter(tmpabtets[j]); + j++; + fnextself(spintet); + if (spintet.tet == flipedge.tet) break; + } + + // Try to flip the selected edge away. + nn = flipnm(tmpabtets, n1, level + 1, edgepivot, fc); + + if (nn == 2) { + // The edge is flipped. Star(ab) is reduced. + // Shrink the array 'abtets', maintain the original order. + if (edgepivot == 1) { + // 'tmpabtets[0]' is [d,a,e,b] => contains [a,b]. + spintet = tmpabtets[0]; // [d,a,e,b] + enextself(spintet); + esymself(spintet); + enextself(spintet); // [a,b,e,d] + } else { + // 'tmpabtets[1]' is [b,d,e,a] => contains [a,b]. + spintet = tmpabtets[1]; // [b,d,e,a] + eprevself(spintet); + esymself(spintet); + eprevself(spintet); // [a,b,e,d] + } // edgepivot == 2 + increaseelemcounter(spintet); // It is in Star(ab). + // Put the new tet at [i-1]-th entry. + abtets[(i - 1 + n) % n] = spintet; + for (j = i; j < n - 1; j++) { + abtets[j] = abtets[j + 1]; // Upshift + } + // Remember the flips in the last entry of the array 'abtets'. + // They can be used to recover the flipped edge. + abtets[n - 1].tet = (tetrahedron *) tmpabtets; // The star(fedge). + abtets[n - 1].ver = 0; // Clear it. + // Use the 1st and 2nd bit to save 'edgepivot' (1 or 2). + abtets[n - 1].ver |= edgepivot; + // Use the 6th bit to signal this n1-to-m1 flip. + abtets[n - 1].ver |= (1 << 5); + // The poisition [i] of this flip is saved from 7th to 19th bit. + abtets[n - 1].ver |= (i << 6); + // The size of the star 'n1' is saved from 20th bit. + abtets[n - 1].ver |= (n1 << 19); + + // Remember the flipped link vertex 'c'. It can be used to recover + // the original edge link of [a,b], and to collect new tets. + tmpabtets[0].tet = (tetrahedron *) pc; + tmpabtets[0].ver = (1 << 5); // Flag it as a vertex handle. + + // Continue to flip the edge [a,b]. + nn = flipnm(abtets, n - 1, level, abedgepivot, fc); + + if (nn == 2) { + // The edge has been flipped. + return nn; + } else { // if (nn > 2) { + // The edge is not flipped. + if (fc->unflip) { + // Recover the flipped edge ([c,b] or [a,c]). + // The sequence of flips are saved in 'tmpabtets'. + // abtets[(i-1) % (n-1)] is [a,b,e,d], i.e., the tet created by + // the flipping of edge [c,b] or [a,c].It must still exist in + // Star(ab). It is the start tet to recover the flipped edge. + if (edgepivot == 1) { + // The flip edge is [c,b]. + tmpabtets[0] = abtets[((i-1)+(n-1))%(n-1)]; // [a,b,e,d] + eprevself(tmpabtets[0]); + esymself(tmpabtets[0]); + eprevself(tmpabtets[0]); // [d,a,e,b] + fsym(tmpabtets[0], tmpabtets[1]); // [a,d,e,c] + } else { + // The flip edge is [a,c]. + tmpabtets[1] = abtets[((i-1)+(n-1))%(n-1)]; // [a,b,e,d] + enextself(tmpabtets[1]); + esymself(tmpabtets[1]); + enextself(tmpabtets[1]); // [b,d,e,a] + fsym(tmpabtets[1], tmpabtets[0]); // [d,b,e,c] + } // if (edgepivot == 2) + + // Recover the flipped edge ([c,b] or [a,c]). + flipnm_post(tmpabtets, n1, 2, edgepivot, fc); + + // Insert the two recovered tets into Star(ab). + for (j = n - 2; j >= i; j--) { + abtets[j + 1] = abtets[j]; // Downshift + } + if (edgepivot == 1) { + // tmpabtets[0] is [c,b,d,a] ==> contains [a,b] + // tmpabtets[1] is [c,b,a,e] ==> contains [a,b] + // tmpabtets[2] is [c,b,e,d] + fliptets[0] = tmpabtets[1]; + enextself(fliptets[0]); + esymself(fliptets[0]); // [a,b,e,c] + fliptets[1] = tmpabtets[0]; + esymself(fliptets[1]); + eprevself(fliptets[1]); // [a,b,c,d] + } else { + // tmpabtets[0] is [a,c,d,b] ==> contains [a,b] + // tmpabtets[1] is [a,c,b,e] ==> contains [a,b] + // tmpabtets[2] is [a,c,e,d] + fliptets[0] = tmpabtets[1]; + eprevself(fliptets[0]); + esymself(fliptets[0]); // [a,b,e,c] + fliptets[1] = tmpabtets[0]; + esymself(fliptets[1]); + enextself(fliptets[1]); // [a,b,c,d] + } // edgepivot == 2 + for (j = 0; j < 2; j++) { + increaseelemcounter(fliptets[j]); + } + // Insert the two recovered tets into Star(ab). + abtets[(i - 1 + n) % n] = fliptets[0]; + abtets[i] = fliptets[1]; + nn++; + // Release the allocated spaces. + delete [] tmpabtets; + } // if (unflip) + } // if (nn > 2) + + if (!fc->unflip) { + // The flips are not reversed. The current Star(ab) can not be + // further reduced. Return its size (# of tets). + return nn; + } + // unflip is set. + // Continue the search for flips. + } else { + // The selected edge is not flipped. + if (!fc->unflip) { + // Release the memory used in this attempted flip. + flipnm_post(tmpabtets, n1, nn, edgepivot, fc); + } + // Decrease the star counters of tets in Star(flipedge). + for (j = 0; j < nn; j++) { + decreaseelemcounter(tmpabtets[j]); + } + // Release the allocated spaces. + delete [] tmpabtets; + } + } // i + } // if (level...) + } // if (reflexlinkedgecount > 0) + } else { + // Check if a 3-to-2 flip is possible. + // Let the three apexes be c, d,and e. Hull tets may be involved. If so, + // we rearrange them such that the vertex e is dummypoint. + hullflag = 0; + + if (apex(abtets[0]) == dummypoint) { + pc = apex(abtets[1]); + pd = apex(abtets[2]); + pe = apex(abtets[0]); + hullflag = 1; + } else if (apex(abtets[1]) == dummypoint) { + pc = apex(abtets[2]); + pd = apex(abtets[0]); + pe = apex(abtets[1]); + hullflag = 2; + } else { + pc = apex(abtets[0]); + pd = apex(abtets[1]); + pe = apex(abtets[2]); + hullflag = (pe == dummypoint) ? 3 : 0; + } + + reducflag = 0; + rejflag = 0; + + + if (hullflag == 0) { + // Make sure that no inverted tet will be created, i.e. the new tets + // [d,c,e,a] and [c,d,e,b] must be valid tets. + ori = orient3d(pd, pc, pe, pa); + if (ori < 0) { + ori = orient3d(pc, pd, pe, pb); + if (ori < 0) { + reducflag = 1; + } + } + } else { + // [a,b] is a hull edge. + // Note: This can happen when it is in the middle of a 4-to-4 flip. + // Note: [a,b] may even be a non-convex hull edge. + if (!nonconvex) { + // The mesh is convex, only do flip if it is a coplanar hull edge. + ori = orient3d(pa, pb, pc, pd); + if (ori == 0) { + reducflag = 1; + } + } else { // nonconvex + reducflag = 1; + } + if (reducflag == 1) { + // [a,b], [a,b,c] and [a,b,d] are on the convex hull. + // Make sure that no inverted tet will be created. + point searchpt = NULL, chkpt; + REAL bigvol = 0.0, ori1, ori2; + // Search an interior vertex which is an apex of edge [c,d]. + // In principle, it can be arbitrary interior vertex. To avoid + // numerical issue, we choose the vertex which belongs to a tet + // 't' at edge [c,d] and 't' has the biggest volume. + fliptets[0] = abtets[hullflag % 3]; // [a,b,c,d]. + eorgoppoself(fliptets[0]); // [d,c,b,a] + spintet = fliptets[0]; + while (1) { + fnextself(spintet); + chkpt = oppo(spintet); + if (chkpt == pb) break; + if ((chkpt != dummypoint) && (apex(spintet) != dummypoint)) { + ori = -orient3d(pd, pc, apex(spintet), chkpt); + if (ori > bigvol) { + bigvol = ori; + searchpt = chkpt; + } + } + } + if (searchpt != NULL) { + // Now valid the configuration. + ori1 = orient3d(pd, pc, searchpt, pa); + ori2 = orient3d(pd, pc, searchpt, pb); + if (ori1 * ori2 >= 0.0) { + reducflag = 0; // Not valid. + } else { + ori1 = orient3d(pa, pb, searchpt, pc); + ori2 = orient3d(pa, pb, searchpt, pd); + if (ori1 * ori2 >= 0.0) { + reducflag = 0; // Not valid. + } + } + } else { + // No valid searchpt is found. + reducflag = 0; // Do not flip it. + } + } // if (reducflag == 1) + } // if (hullflag == 1) + + if (reducflag) { + // A 3-to-2 flip is possible. + if (checksubfaceflag) { + // This edge (must not be a segment) can be flipped ONLY IF it belongs + // to either 0 or 2 subfaces. In the latter case, a 2-to-2 flip in + // the surface mesh will be automatically performed within the + // 3-to-2 flip. + nn = 0; + edgepivot = -1; // Re-use it. + for (j = 0; j < 3; j++) { + if (issubface(abtets[j])) { + nn++; // Found a subface. + } else { + edgepivot = j; + } + } + if (nn == 1) { + // Found only 1 subface containing this edge. This can happen in + // the boundary recovery phase. The neighbor subface is not yet + // recovered. This edge should not be flipped at this moment. + rejflag = 1; + } else if (nn == 2) { + // Found two subfaces. A 2-to-2 flip is possible. Validate it. + // Below we check if the two faces [p,q,a] and [p,q,b] are subfaces. + eorgoppo(abtets[(edgepivot + 1) % 3], spintet); // [q,p,b,a] + if (issubface(spintet)) { + rejflag = 1; // Conflict to a 2-to-2 flip. + } else { + esymself(spintet); + if (issubface(spintet)) { + rejflag = 1; // Conflict to a 2-to-2 flip. + } + } + } else if (nn == 3) { + // Report a bug. + terminatetetgen(this, 2); + } + } + if (!rejflag && fc->checkflipeligibility) { + // Here we must exchange 'a' and 'b'. Since in the check... function, + // we assume the following point sequence, 'a,b,c,d,e', where + // the face [a,b,c] will be flipped and the edge [e,d] will be + // created. The two new tets are [a,b,c,d] and [b,a,c,e]. + rejflag = checkflipeligibility(2, pc, pd, pe, pb, pa, level, + abedgepivot, fc); + } + if (!rejflag) { + // Do flip: [a,b] => [c,d,e] + flip32(abtets, hullflag, fc); + if (fc->remove_ndelaunay_edge) { + if (level == 0) { + // It is the desired removing edge. Check if we have improved + // the objective function. + if ((fc->tetprism_vol_sum >= 0.0) || + (fabs(fc->tetprism_vol_sum) < fc->bak_tetprism_vol)) { + // No improvement! flip back: [c,d,e] => [a,b]. + flip23(abtets, hullflag, fc); + // Increase the element counter -- They are in cavity. + for (j = 0; j < 3; j++) { + increaseelemcounter(abtets[j]); + } + return 3; + } + } // if (level == 0) + } + if (fc->collectnewtets) { + // Collect new tets. + if (level == 0) { + // Push the two new tets into stack. + for (j = 0; j < 2; j++) { + cavetetlist->newindex((void **) &parytet); + *parytet = abtets[j]; + } + } else { + // Only one of the new tets is collected. The other one is inside + // the reduced edge star. 'abedgepivot' is either '1' or '2'. + cavetetlist->newindex((void **) &parytet); + if (abedgepivot == 1) { // [c,b] + *parytet = abtets[1]; + } else { + *parytet = abtets[0]; + } + } + } // if (fc->collectnewtets) + return 2; + } + } // if (reducflag) + } // if (n == 3) + + // The current (reduced) Star size. + return n; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// flipnm_post() Post process a n-to-m flip. // +// // +// IMPORTANT: This routine only works when there is no other flip operation // +// is done after flipnm([a,b]) which attempts to remove an edge [a,b]. // +// // +// 'abtets' is an array of 'n' (>= 3) tets which are in the original star of // +// [a,b] before flipnm([a,b]). 'nn' (< n) is the value returned by flipnm. // +// If 'nn == 2', the edge [a,b] has been flipped. 'abtets[0]' and 'abtets[1]'// +// are [c,d,e,b] and [d,c,e,a], i.e., a 2-to-3 flip can recover the edge [a, // +// b] and its initial Star([a,b]). If 'nn >= 3' edge [a,b] still exists in // +// current mesh and 'nn' is the current number of tets in Star([a,b]). // +// // +// Each 'abtets[i]', where nn <= i < n, saves either a 2-to-3 flip or a // +// flipnm([p1,p2]) operation ([p1,p2] != [a,b]) which created the tet // +// 'abtets[t-1]', where '0 <= t <= i'. These information can be used to // +// undo the flips performed in flipnm([a,b]) or to collect new tets created // +// by the flipnm([a,b]) operation. // +// // +// Default, this routine only walks through the flips and frees the spaces // +// allocated during the flipnm([a,b]) operation. // +// // +// If the flag 'fc->unflip' is set, this routine un-does the flips performed // +// in flipnm([a,b]) so that the mesh is returned to its original state // +// before doing the flipnm([a,b]) operation. // +// // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::flipnm_post(triface* abtets, int n, int nn, int abedgepivot, + flipconstraints* fc) +{ + triface fliptets[3], flipface; + triface *tmpabtets; + int fliptype; + int edgepivot; + int t, n1; + int i, j; + + + if (nn == 2) { + // The edge [a,b] has been flipped. + // 'abtets[0]' is [c,d,e,b] or [#,#,#,b]. + // 'abtets[1]' is [d,c,e,a] or [#,#,#,a]. + if (fc->unflip) { + // Do a 2-to-3 flip to recover the edge [a,b]. There may be hull tets. + flip23(abtets, 1, fc); + if (fc->collectnewtets) { + // Pop up new (flipped) tets from the stack. + if (abedgepivot == 0) { + // Two new tets were collected. + cavetetlist->objects -= 2; + } else { + // Only one of the two new tets was collected. + cavetetlist->objects -= 1; + } + } + } + // The initial size of Star(ab) is 3. + nn++; + } + + // Walk through the performed flips. + for (i = nn; i < n; i++) { + // At the beginning of each step 'i', the size of the Star([a,b]) is 'i'. + // At the end of this step, the size of the Star([a,b]) is 'i+1'. + // The sizes of the Link([a,b]) are the same. + fliptype = ((abtets[i].ver >> 4) & 3); // 0, 1, or 2. + if (fliptype == 1) { + // It was a 2-to-3 flip: [a,b,c]->[e,d]. + t = (abtets[i].ver >> 6); + if (fc->unflip) { + if (b->verbose > 2) { + printf(" Recover a 2-to-3 flip at f[%d].\n", t); + } + // 'abtets[(t-1)%i]' is the tet [a,b,e,d] in current Star(ab), i.e., + // it is created by a 2-to-3 flip [a,b,c] => [e,d]. + fliptets[0] = abtets[((t - 1) + i) % i]; // [a,b,e,d] + eprevself(fliptets[0]); + esymself(fliptets[0]); + enextself(fliptets[0]); // [e,d,a,b] + fnext(fliptets[0], fliptets[1]); // [e,d,b,c] + fnext(fliptets[1], fliptets[2]); // [e,d,c,a] + // Do a 3-to-2 flip: [e,d] => [a,b,c]. + // NOTE: hull tets may be invloved. + flip32(fliptets, 1, fc); + // Expand the array 'abtets', maintain the original order. + // The new array length is (i+1). + for (j = i - 1; j >= t; j--) { + abtets[j + 1] = abtets[j]; // Downshift + } + // The tet abtets[(t-1)%i] is deleted. Insert the two new tets + // 'fliptets[0]' [a,b,c,d] and 'fliptets[1]' [b,a,c,e] into + // the (t-1)-th and t-th entries, respectively. + esym(fliptets[1], abtets[((t-1) + (i+1)) % (i+1)]); // [a,b,e,c] + abtets[t] = fliptets[0]; // [a,b,c,d] + if (fc->collectnewtets) { + // Pop up two (flipped) tets from the stack. + cavetetlist->objects -= 2; + } + } + } else if (fliptype == 2) { + tmpabtets = (triface *) (abtets[i].tet); + n1 = ((abtets[i].ver >> 19) & 8191); // \sum_{i=0^12}{2^i} = 8191 + edgepivot = (abtets[i].ver & 3); + t = ((abtets[i].ver >> 6) & 8191); + if (fc->unflip) { + if (b->verbose > 2) { + printf(" Recover a %d-to-m flip at e[%d] of f[%d].\n", n1, + edgepivot, t); + } + // Recover the flipped edge ([c,b] or [a,c]). + // abtets[(t - 1 + i) % i] is [a,b,e,d], i.e., the tet created by + // the flipping of edge [c,b] or [a,c]. It must still exist in + // Star(ab). Use it to recover the flipped edge. + if (edgepivot == 1) { + // The flip edge is [c,b]. + tmpabtets[0] = abtets[(t - 1 + i) % i]; // [a,b,e,d] + eprevself(tmpabtets[0]); + esymself(tmpabtets[0]); + eprevself(tmpabtets[0]); // [d,a,e,b] + fsym(tmpabtets[0], tmpabtets[1]); // [a,d,e,c] + } else { + // The flip edge is [a,c]. + tmpabtets[1] = abtets[(t - 1 + i) % i]; // [a,b,e,d] + enextself(tmpabtets[1]); + esymself(tmpabtets[1]); + enextself(tmpabtets[1]); // [b,d,e,a] + fsym(tmpabtets[1], tmpabtets[0]); // [d,b,e,c] + } // if (edgepivot == 2) + + // Do a n1-to-m1 flip to recover the flipped edge ([c,b] or [a,c]). + flipnm_post(tmpabtets, n1, 2, edgepivot, fc); + + // Insert the two recovered tets into the original Star(ab). + for (j = i - 1; j >= t; j--) { + abtets[j + 1] = abtets[j]; // Downshift + } + if (edgepivot == 1) { + // tmpabtets[0] is [c,b,d,a] ==> contains [a,b] + // tmpabtets[1] is [c,b,a,e] ==> contains [a,b] + // tmpabtets[2] is [c,b,e,d] + fliptets[0] = tmpabtets[1]; + enextself(fliptets[0]); + esymself(fliptets[0]); // [a,b,e,c] + fliptets[1] = tmpabtets[0]; + esymself(fliptets[1]); + eprevself(fliptets[1]); // [a,b,c,d] + } else { + // tmpabtets[0] is [a,c,d,b] ==> contains [a,b] + // tmpabtets[1] is [a,c,b,e] ==> contains [a,b] + // tmpabtets[2] is [a,c,e,d] + fliptets[0] = tmpabtets[1]; + eprevself(fliptets[0]); + esymself(fliptets[0]); // [a,b,e,c] + fliptets[1] = tmpabtets[0]; + esymself(fliptets[1]); + enextself(fliptets[1]); // [a,b,c,d] + } // edgepivot == 2 + // Insert the two recovered tets into Star(ab). + abtets[((t-1) + (i+1)) % (i+1)] = fliptets[0]; + abtets[t] = fliptets[1]; + } + else { + // Only free the spaces. + flipnm_post(tmpabtets, n1, 2, edgepivot, fc); + } // if (!unflip) + if (b->verbose > 2) { + printf(" Release %d spaces at f[%d].\n", n1, i); + } + delete [] tmpabtets; + } + } // i + + return 1; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// insertpoint() Insert a point into current tetrahedralization. // +// // +// The Bowyer-Watson (B-W) algorithm is used to add a new point p into the // +// tetrahedralization T. It first finds a "cavity", denoted as C, in T, C // +// consists of tetrahedra in T that "conflict" with p. If T is a Delaunay // +// tetrahedralization, then all boundary faces (triangles) of C are visible // +// by p, i.e.,C is star-shaped. We can insert p into T by first deleting all // +// tetrahedra in C, then creating new tetrahedra formed by boundary faces of // +// C and p. If T is not a DT, then C may be not star-shaped. It must be // +// modified so that it becomes star-shaped. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::insertpoint(point insertpt, triface *searchtet, face *splitsh, + face *splitseg, insertvertexflags *ivf) +{ + arraypool *swaplist; + triface *cavetet, spintet, neightet, neineitet, *parytet; + triface oldtet, newtet, newneitet; + face checksh, neighsh, *parysh; + face checkseg, *paryseg; + point *pts, pa, pb, pc, *parypt; + enum locateresult loc = OUTSIDE; + REAL sign, ori; + REAL attrib, volume; + bool enqflag; + int t1ver; + int i, j, k, s; + + if (b->verbose > 2) { + printf(" Insert point %d\n", pointmark(insertpt)); + } + + // Locate the point. + if (searchtet->tet != NULL) { + loc = (enum locateresult) ivf->iloc; + } + + if (loc == OUTSIDE) { + if (searchtet->tet == NULL) { + if (!b->weighted) { + randomsample(insertpt, searchtet); + } else { + // Weighted DT. There may exist dangling vertex. + *searchtet = recenttet; + } + } + // Locate the point. + loc = locate(insertpt, searchtet); + } + + ivf->iloc = (int) loc; // The return value. + + if (b->weighted) { + if (loc != OUTSIDE) { + // Check if this vertex is regular. + pts = (point *) searchtet->tet; + sign = orient4d_s(pts[4], pts[5], pts[6], pts[7], insertpt, + pts[4][3], pts[5][3], pts[6][3], pts[7][3], + insertpt[3]); + if (sign > 0) { + // This new vertex lies above the lower hull. Do not insert it. + ivf->iloc = (int) NONREGULAR; + return 0; + } + } + } + + // Create the initial cavity C(p) which contains all tetrahedra that + // intersect p. It may include 1, 2, or n tetrahedra. + // If p lies on a segment or subface, also create the initial sub-cavity + // sC(p) which contains all subfaces (and segment) which intersect p. + + if (loc == OUTSIDE) { + flip14count++; + // The current hull will be enlarged. + // Add four adjacent boundary tets into list. + for (i = 0; i < 4; i++) { + decode(searchtet->tet[i], neightet); + neightet.ver = epivot[neightet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neightet; + } + infect(*searchtet); + caveoldtetlist->newindex((void **) &parytet); + *parytet = *searchtet; + } else if (loc == INTETRAHEDRON) { + flip14count++; + // Add four adjacent boundary tets into list. + for (i = 0; i < 4; i++) { + decode(searchtet->tet[i], neightet); + neightet.ver = epivot[neightet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neightet; + } + infect(*searchtet); + caveoldtetlist->newindex((void **) &parytet); + *parytet = *searchtet; + } else if (loc == ONFACE) { + flip26count++; + // Add six adjacent boundary tets into list. + j = (searchtet->ver & 3); // The current face number. + for (i = 1; i < 4; i++) { + decode(searchtet->tet[(j + i) % 4], neightet); + neightet.ver = epivot[neightet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neightet; + } + decode(searchtet->tet[j], spintet); + j = (spintet.ver & 3); // The current face number. + for (i = 1; i < 4; i++) { + decode(spintet.tet[(j + i) % 4], neightet); + neightet.ver = epivot[neightet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neightet; + } + infect(spintet); + caveoldtetlist->newindex((void **) &parytet); + *parytet = spintet; + infect(*searchtet); + caveoldtetlist->newindex((void **) &parytet); + *parytet = *searchtet; + + if (ivf->splitbdflag) { + if ((splitsh != NULL) && (splitsh->sh != NULL)) { + // Create the initial sub-cavity sC(p). + smarktest(*splitsh); + caveshlist->newindex((void **) &parysh); + *parysh = *splitsh; + } + } // if (splitbdflag) + } else if (loc == ONEDGE) { + flipn2ncount++; + // Add all adjacent boundary tets into list. + spintet = *searchtet; + while (1) { + eorgoppo(spintet, neightet); + decode(neightet.tet[neightet.ver & 3], neightet); + neightet.ver = epivot[neightet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neightet; + edestoppo(spintet, neightet); + decode(neightet.tet[neightet.ver & 3], neightet); + neightet.ver = epivot[neightet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neightet; + infect(spintet); + caveoldtetlist->newindex((void **) &parytet); + *parytet = spintet; + fnextself(spintet); + if (spintet.tet == searchtet->tet) break; + } // while (1) + + if (ivf->splitbdflag) { + // Create the initial sub-cavity sC(p). + if ((splitseg != NULL) && (splitseg->sh != NULL)) { + smarktest(*splitseg); + splitseg->shver = 0; + spivot(*splitseg, *splitsh); + } + if (splitsh != NULL) { + if (splitsh->sh != NULL) { + // Collect all subfaces share at this edge. + pa = sorg(*splitsh); + neighsh = *splitsh; + while (1) { + // Adjust the origin of its edge to be 'pa'. + if (sorg(neighsh) != pa) { + sesymself(neighsh); + } + // Add this face into list (in B-W cavity). + smarktest(neighsh); + caveshlist->newindex((void **) &parysh); + *parysh = neighsh; + // Add this face into face-at-splitedge list. + cavesegshlist->newindex((void **) &parysh); + *parysh = neighsh; + // Go to the next face at the edge. + spivotself(neighsh); + // Stop if all faces at the edge have been visited. + if (neighsh.sh == splitsh->sh) break; + if (neighsh.sh == NULL) break; + } // while (1) + } // if (not a dangling segment) + } + } // if (splitbdflag) + } else if (loc == INSTAR) { + // We assume that all tets in the star are given in 'caveoldtetlist', + // and they are all infected. + // Collect the boundary faces of the star. + for (i = 0; i < caveoldtetlist->objects; i++) { + cavetet = (triface *) fastlookup(caveoldtetlist, i); + // Check its 4 neighbor tets. + for (j = 0; j < 4; j++) { + decode(cavetet->tet[j], neightet); + if (!infected(neightet)) { + // It's a boundary face. + neightet.ver = epivot[neightet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neightet; + } + } + } + } else if (loc == ONVERTEX) { + // The point already exist. Do nothing and return. + return 0; + } + + + if (ivf->assignmeshsize) { + // Assign mesh size for the new point. + if (bgm != NULL) { + // Interpolate the mesh size from the background mesh. + bgm->decode(point2bgmtet(org(*searchtet)), neightet); + int bgmloc = (int) bgm->scoutpoint(insertpt, &neightet, 0); + if (bgmloc != (int) OUTSIDE) { + insertpt[pointmtrindex] = + bgm->getpointmeshsize(insertpt, &neightet, bgmloc); + setpoint2bgmtet(insertpt, bgm->encode(neightet)); + } + } else { + insertpt[pointmtrindex] = getpointmeshsize(insertpt,searchtet,(int)loc); + } + } // if (assignmeshsize) + + if (ivf->bowywat) { + // Update the cavity C(p) using the Bowyer-Watson algorithm. + swaplist = cavetetlist; + cavetetlist = cavebdrylist; + cavebdrylist = swaplist; + for (i = 0; i < cavetetlist->objects; i++) { + // 'cavetet' is an adjacent tet at outside of the cavity. + cavetet = (triface *) fastlookup(cavetetlist, i); + // The tet may be tested and included in the (enlarged) cavity. + if (!infected(*cavetet)) { + // Check for two possible cases for this tet: + // (1) It is a cavity tet, or + // (2) it is a cavity boundary face. + enqflag = false; + if (!marktested(*cavetet)) { + // Do Delaunay (in-sphere) test. + pts = (point *) cavetet->tet; + if (pts[7] != dummypoint) { + // A volume tet. Operate on it. + if (b->weighted) { + sign = orient4d_s(pts[4], pts[5], pts[6], pts[7], insertpt, + pts[4][3], pts[5][3], pts[6][3], pts[7][3], + insertpt[3]); + } else { + sign = insphere_s(pts[4], pts[5], pts[6], pts[7], insertpt); + } + enqflag = (sign < 0.0); + } else { + if (!nonconvex) { + // Test if this hull face is visible by the new point. + ori = orient3d(pts[4], pts[5], pts[6], insertpt); + if (ori < 0) { + // A visible hull face. + // Include it in the cavity. The convex hull will be enlarged. + enqflag = true; + } else if (ori == 0.0) { + // A coplanar hull face. We need to test if this hull face is + // Delaunay or not. We test if the adjacent tet (not faked) + // of this hull face is Delaunay or not. + decode(cavetet->tet[3], neineitet); + if (!infected(neineitet)) { + if (!marktested(neineitet)) { + // Do Delaunay test on this tet. + pts = (point *) neineitet.tet; + if (b->weighted) { + sign = orient4d_s(pts[4],pts[5],pts[6],pts[7], insertpt, + pts[4][3], pts[5][3], pts[6][3], + pts[7][3], insertpt[3]); + } else { + sign = insphere_s(pts[4],pts[5],pts[6],pts[7], insertpt); + } + enqflag = (sign < 0.0); + } + } else { + // The adjacent tet is non-Delaunay. The hull face is non- + // Delaunay as well. Include it in the cavity. + enqflag = true; + } // if (!infected(neineitet)) + } // if (ori == 0.0) + } else { + // A hull face (must be a subface). + // We FIRST include it in the initial cavity if the adjacent tet + // (not faked) of this hull face is not Delaunay wrt p. + // Whether it belongs to the final cavity will be determined + // during the validation process. 'validflag'. + decode(cavetet->tet[3], neineitet); + if (!infected(neineitet)) { + if (!marktested(neineitet)) { + // Do Delaunay test on this tet. + pts = (point *) neineitet.tet; + if (b->weighted) { + sign = orient4d_s(pts[4],pts[5],pts[6],pts[7], insertpt, + pts[4][3], pts[5][3], pts[6][3], + pts[7][3], insertpt[3]); + } else { + sign = insphere_s(pts[4],pts[5],pts[6],pts[7], insertpt); + } + enqflag = (sign < 0.0); + } + } else { + // The adjacent tet is non-Delaunay. The hull face is non- + // Delaunay as well. Include it in the cavity. + enqflag = true; + } // if (infected(neineitet)) + } // if (nonconvex) + } // if (pts[7] != dummypoint) + marktest(*cavetet); // Only test it once. + } // if (!marktested(*cavetet)) + + if (enqflag) { + // Found a tet in the cavity. Put other three faces in check list. + k = (cavetet->ver & 3); // The current face number + for (j = 1; j < 4; j++) { + decode(cavetet->tet[(j + k) % 4], neightet); + cavetetlist->newindex((void **) &parytet); + *parytet = neightet; + } + infect(*cavetet); + caveoldtetlist->newindex((void **) &parytet); + *parytet = *cavetet; + } else { + // Found a boundary face of the cavity. + cavetet->ver = epivot[cavetet->ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = *cavetet; + } + } // if (!infected(*cavetet)) + } // i + + cavetetlist->restart(); // Clear the working list. + } // if (ivf->bowywat) + + if (checksubsegflag) { + // Collect all segments of C(p). + shellface *ssptr; + for (i = 0; i < caveoldtetlist->objects; i++) { + cavetet = (triface *) fastlookup(caveoldtetlist, i); + if ((ssptr = (shellface*) cavetet->tet[8]) != NULL) { + for (j = 0; j < 6; j++) { + if (ssptr[j]) { + sdecode(ssptr[j], checkseg); + if (!sinfected(checkseg)) { + sinfect(checkseg); + cavetetseglist->newindex((void **) &paryseg); + *paryseg = checkseg; + } + } + } // j + } + } // i + // Uninfect collected segments. + for (i = 0; i < cavetetseglist->objects; i++) { + paryseg = (face *) fastlookup(cavetetseglist, i); + suninfect(*paryseg); + } + + if (ivf->rejflag & 1) { + // Reject this point if it encroaches upon any segment. + face *paryseg1; + for (i = 0; i < cavetetseglist->objects; i++) { + paryseg1 = (face *) fastlookup(cavetetseglist, i); + if (checkseg4encroach((point) paryseg1->sh[3], (point) paryseg1->sh[4], + insertpt)) { + encseglist->newindex((void **) &paryseg); + *paryseg = *paryseg1; + } + } // i + if ((ivf->rejflag & 1) && (encseglist->objects > 0)) { + insertpoint_abort(splitseg, ivf); + ivf->iloc = (int) ENCSEGMENT; + return 0; + } + } + } // if (checksubsegflag) + + if (checksubfaceflag) { + // Collect all subfaces of C(p). + shellface *sptr; + for (i = 0; i < caveoldtetlist->objects; i++) { + cavetet = (triface *) fastlookup(caveoldtetlist, i); + if ((sptr = (shellface*) cavetet->tet[9]) != NULL) { + for (j = 0; j < 4; j++) { + if (sptr[j]) { + sdecode(sptr[j], checksh); + if (!sinfected(checksh)) { + sinfect(checksh); + cavetetshlist->newindex((void **) &parysh); + *parysh = checksh; + } + } + } // j + } + } // i + // Uninfect collected subfaces. + for (i = 0; i < cavetetshlist->objects; i++) { + parysh = (face *) fastlookup(cavetetshlist, i); + suninfect(*parysh); + } + + if (ivf->rejflag & 2) { + REAL rd, cent[3]; + badface *bface; + // Reject this point if it encroaches upon any subface. + for (i = 0; i < cavetetshlist->objects; i++) { + parysh = (face *) fastlookup(cavetetshlist, i); + if (checkfac4encroach((point) parysh->sh[3], (point) parysh->sh[4], + (point) parysh->sh[5], insertpt, cent, &rd)) { + encshlist->newindex((void **) &bface); + bface->ss = *parysh; + bface->forg = (point) parysh->sh[3]; // Not a dad one. + for (j = 0; j < 3; j++) bface->cent[j] = cent[j]; + bface->key = rd; + } + } + if (encshlist->objects > 0) { + insertpoint_abort(splitseg, ivf); + ivf->iloc = (int) ENCSUBFACE; + return 0; + } + } + } // if (checksubfaceflag) + + if ((ivf->iloc == (int) OUTSIDE) && ivf->refineflag) { + // The vertex lies outside of the domain. And it does not encroach + // upon any boundary segment or subface. Do not insert it. + insertpoint_abort(splitseg, ivf); + return 0; + } + + if (ivf->splitbdflag) { + // The new point locates in surface mesh. Update the sC(p). + // We have already 'smarktested' the subfaces which directly intersect + // with p in 'caveshlist'. From them, we 'smarktest' their neighboring + // subfaces which are included in C(p). Do not across a segment. + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + checksh = *parysh; + for (j = 0; j < 3; j++) { + if (!isshsubseg(checksh)) { + spivot(checksh, neighsh); + if (!smarktested(neighsh)) { + stpivot(neighsh, neightet); + if (infected(neightet)) { + fsymself(neightet); + if (infected(neightet)) { + // This subface is inside C(p). + // Check if its diametrical circumsphere encloses 'p'. + // The purpose of this check is to avoid forming invalid + // subcavity in surface mesh. + sign = incircle3d(sorg(neighsh), sdest(neighsh), + sapex(neighsh), insertpt); + if (sign < 0) { + smarktest(neighsh); + caveshlist->newindex((void **) &parysh); + *parysh = neighsh; + } + } + } + } + } + senextself(checksh); + } // j + } // i + } // if (ivf->splitbdflag) + + if (ivf->validflag) { + // Validate C(p) and update it if it is not star-shaped. + int cutcount = 0; + + if (ivf->respectbdflag) { + // The initial cavity may include subfaces which are not on the facets + // being splitting. Find them and make them as boundary of C(p). + // Comment: We have already 'smarktested' the subfaces in sC(p). They + // are completely inside C(p). + for (i = 0; i < cavetetshlist->objects; i++) { + parysh = (face *) fastlookup(cavetetshlist, i); + stpivot(*parysh, neightet); + if (infected(neightet)) { + fsymself(neightet); + if (infected(neightet)) { + // Found a subface inside C(p). + if (!smarktested(*parysh)) { + // It is possible that this face is a boundary subface. + // Check if it is a hull face. + //assert(apex(neightet) != dummypoint); + if (oppo(neightet) != dummypoint) { + fsymself(neightet); + } + if (oppo(neightet) != dummypoint) { + ori = orient3d(org(neightet), dest(neightet), apex(neightet), + insertpt); + if (ori < 0) { + // A visible face, get its neighbor face. + fsymself(neightet); + ori = -ori; // It must be invisible by p. + } + } else { + // A hull tet. It needs to be cut. + ori = 1; + } + // Cut this tet if it is either invisible by or coplanar with p. + if (ori >= 0) { + uninfect(neightet); + unmarktest(neightet); + cutcount++; + neightet.ver = epivot[neightet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neightet; + // Add three new faces to find new boundaries. + for (j = 0; j < 3; j++) { + esym(neightet, neineitet); + neineitet.ver = epivot[neineitet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neineitet; + enextself(neightet); + } + } // if (ori >= 0) + } + } + } + } // i + + // The initial cavity may include segments in its interior. We need to + // Update the cavity so that these segments are on the boundary of + // the cavity. + for (i = 0; i < cavetetseglist->objects; i++) { + paryseg = (face *) fastlookup(cavetetseglist, i); + // Check this segment if it is not a splitting segment. + if (!smarktested(*paryseg)) { + sstpivot1(*paryseg, neightet); + spintet = neightet; + while (1) { + if (!infected(spintet)) break; + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + if (infected(spintet)) { + // Find an adjacent tet at this segment such that both faces + // at this segment are not visible by p. + pa = org(neightet); + pb = dest(neightet); + spintet = neightet; + j = 0; + while (1) { + // Check if this face is visible by p. + pc = apex(spintet); + if (pc != dummypoint) { + ori = orient3d(pa, pb, pc, insertpt); + if (ori >= 0) { + // Not visible. Check another face in this tet. + esym(spintet, neineitet); + pc = apex(neineitet); + if (pc != dummypoint) { + ori = orient3d(pb, pa, pc, insertpt); + if (ori >= 0) { + // Not visible. Found this face. + j = 1; // Flag that it is found. + break; + } + } + } + } + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + if (j == 0) { + // Not found such a face. + terminatetetgen(this, 2); + } + neightet = spintet; + if (b->verbose > 3) { + printf(" Cut tet (%d, %d, %d, %d)\n", + pointmark(org(neightet)), pointmark(dest(neightet)), + pointmark(apex(neightet)), pointmark(oppo(neightet))); + } + uninfect(neightet); + unmarktest(neightet); + cutcount++; + neightet.ver = epivot[neightet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neightet; + // Add three new faces to find new boundaries. + for (j = 0; j < 3; j++) { + esym(neightet, neineitet); + neineitet.ver = epivot[neineitet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neineitet; + enextself(neightet); + } + } + } + } // i + } // if (ivf->respectbdflag) + + // Update the cavity by removing invisible faces until it is star-shaped. + for (i = 0; i < cavebdrylist->objects; i++) { + cavetet = (triface *) fastlookup(cavebdrylist, i); + // 'cavetet' is an exterior tet adjacent to the cavity. + // Check if its neighbor is inside C(p). + fsym(*cavetet, neightet); + if (infected(neightet)) { + if (apex(*cavetet) != dummypoint) { + // It is a cavity boundary face. Check its visibility. + if (oppo(neightet) != dummypoint) { + // Check if this face is visible by the new point. + if (issubface(neightet)) { + // We should only create a new tet that has a reasonable volume. + // Re-use 'volume' and 'attrib'. + pa = org(*cavetet); + pb = dest(*cavetet); + pc = apex(*cavetet); + volume = orient3dfast(pa, pb, pc, insertpt); + attrib = distance(pa, pb) * distance(pb, pc) * distance(pc, pa); + if ((fabs(volume) / attrib) < b->epsilon) { + ori = 0.0; + } else { + ori = orient3d(pa, pb, pc, insertpt); + } + } else { + ori = orient3d(org(*cavetet), dest(*cavetet), apex(*cavetet), + insertpt); + } + enqflag = (ori > 0); + // Comment: if ori == 0 (coplanar case), we also cut the tet. + } else { + // It is a hull face. And its adjacent tet (at inside of the + // domain) has been cut from the cavity. Cut it as well. + //assert(nonconvex); + enqflag = false; + } + } else { + enqflag = true; // A hull edge. + } + if (enqflag) { + // This face is valid, save it. + cavetetlist->newindex((void **) &parytet); + *parytet = *cavetet; + } else { + uninfect(neightet); + unmarktest(neightet); + cutcount++; + // Add three new faces to find new boundaries. + for (j = 0; j < 3; j++) { + esym(neightet, neineitet); + neineitet.ver = epivot[neineitet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neineitet; + enextself(neightet); + } + // 'cavetet' is not on the cavity boundary anymore. + unmarktest(*cavetet); + } + } else { + // 'cavetet' is not on the cavity boundary anymore. + unmarktest(*cavetet); + } + } // i + + if (cutcount > 0) { + // The cavity has been updated. + // Update the cavity boundary faces. + cavebdrylist->restart(); + for (i = 0; i < cavetetlist->objects; i++) { + cavetet = (triface *) fastlookup(cavetetlist, i); + // 'cavetet' was an exterior tet adjacent to the cavity. + fsym(*cavetet, neightet); + if (infected(neightet)) { + // It is a cavity boundary face. + cavebdrylist->newindex((void **) &parytet); + *parytet = *cavetet; + } else { + // Not a cavity boundary face. + unmarktest(*cavetet); + } + } + + // Update the list of old tets. + cavetetlist->restart(); + for (i = 0; i < caveoldtetlist->objects; i++) { + cavetet = (triface *) fastlookup(caveoldtetlist, i); + if (infected(*cavetet)) { + cavetetlist->newindex((void **) &parytet); + *parytet = *cavetet; + } + } + // Swap 'cavetetlist' and 'caveoldtetlist'. + swaplist = caveoldtetlist; + caveoldtetlist = cavetetlist; + cavetetlist = swaplist; + + // The cavity should contain at least one tet. + if (caveoldtetlist->objects == 0l) { + insertpoint_abort(splitseg, ivf); + ivf->iloc = (int) BADELEMENT; + return 0; + } + + if (ivf->splitbdflag) { + int cutshcount = 0; + // Update the sub-cavity sC(p). + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + if (smarktested(*parysh)) { + enqflag = false; + stpivot(*parysh, neightet); + if (infected(neightet)) { + fsymself(neightet); + if (infected(neightet)) { + enqflag = true; + } + } + if (!enqflag) { + sunmarktest(*parysh); + // Use the last entry of this array to fill this entry. + j = caveshlist->objects - 1; + checksh = * (face *) fastlookup(caveshlist, j); + *parysh = checksh; + cutshcount++; + caveshlist->objects--; // The list is shrinked. + i--; + } + } + } + + if (cutshcount > 0) { + i = 0; // Count the number of invalid subfaces/segments. + // Valid the updated sub-cavity sC(p). + if (loc == ONFACE) { + if ((splitsh != NULL) && (splitsh->sh != NULL)) { + // The to-be split subface should be in sC(p). + if (!smarktested(*splitsh)) i++; + } + } else if (loc == ONEDGE) { + if ((splitseg != NULL) && (splitseg->sh != NULL)) { + // The to-be split segment should be in sC(p). + if (!smarktested(*splitseg)) i++; + } + if ((splitsh != NULL) && (splitsh->sh != NULL)) { + // All subfaces at this edge should be in sC(p). + pa = sorg(*splitsh); + neighsh = *splitsh; + while (1) { + // Adjust the origin of its edge to be 'pa'. + if (sorg(neighsh) != pa) { + sesymself(neighsh); + } + // Add this face into list (in B-W cavity). + if (!smarktested(neighsh)) i++; + // Go to the next face at the edge. + spivotself(neighsh); + // Stop if all faces at the edge have been visited. + if (neighsh.sh == splitsh->sh) break; + if (neighsh.sh == NULL) break; + } // while (1) + } + } + + if (i > 0) { + // The updated sC(p) is invalid. Do not insert this vertex. + insertpoint_abort(splitseg, ivf); + ivf->iloc = (int) BADELEMENT; + return 0; + } + } // if (cutshcount > 0) + } // if (ivf->splitbdflag) + } // if (cutcount > 0) + + } // if (ivf->validflag) + + if (ivf->refineflag) { + // The new point is inserted by Delaunay refinement, i.e., it is the + // circumcenter of a tetrahedron, or a subface, or a segment. + // Do not insert this point if the tetrahedron, or subface, or segment + // is not inside the final cavity. + if (((ivf->refineflag == 1) && !infected(ivf->refinetet)) || + ((ivf->refineflag == 2) && !smarktested(ivf->refinesh))) { + insertpoint_abort(splitseg, ivf); + ivf->iloc = (int) BADELEMENT; + return 0; + } + } // if (ivf->refineflag) + + if (b->plc && (loc != INSTAR)) { + // Reject the new point if it lies too close to an existing point (b->plc), + // or it lies inside a protecting ball of near vertex (ivf->rejflag & 4). + // Collect the list of vertices of the initial cavity. + if (loc == OUTSIDE) { + pts = (point *) &(searchtet->tet[4]); + for (i = 0; i < 3; i++) { + cavetetvertlist->newindex((void **) &parypt); + *parypt = pts[i]; + } + } else if (loc == INTETRAHEDRON) { + pts = (point *) &(searchtet->tet[4]); + for (i = 0; i < 4; i++) { + cavetetvertlist->newindex((void **) &parypt); + *parypt = pts[i]; + } + } else if (loc == ONFACE) { + pts = (point *) &(searchtet->tet[4]); + for (i = 0; i < 3; i++) { + cavetetvertlist->newindex((void **) &parypt); + *parypt = pts[i]; + } + if (pts[3] != dummypoint) { + cavetetvertlist->newindex((void **) &parypt); + *parypt = pts[3]; + } + fsym(*searchtet, spintet); + if (oppo(spintet) != dummypoint) { + cavetetvertlist->newindex((void **) &parypt); + *parypt = oppo(spintet); + } + } else if (loc == ONEDGE) { + spintet = *searchtet; + cavetetvertlist->newindex((void **) &parypt); + *parypt = org(spintet); + cavetetvertlist->newindex((void **) &parypt); + *parypt = dest(spintet); + while (1) { + if (apex(spintet) != dummypoint) { + cavetetvertlist->newindex((void **) &parypt); + *parypt = apex(spintet); + } + fnextself(spintet); + if (spintet.tet == searchtet->tet) break; + } + } + + int rejptflag = (ivf->rejflag & 4); + REAL rd; + pts = NULL; + + for (i = 0; i < cavetetvertlist->objects; i++) { + parypt = (point *) fastlookup(cavetetvertlist, i); + rd = distance(*parypt, insertpt); + // Is the point very close to an existing point? + if (rd < minedgelength) { + pts = parypt; + loc = NEARVERTEX; + break; + } + if (rejptflag) { + // Is the point encroaches upon an existing point? + if (rd < (0.5 * (*parypt)[pointmtrindex])) { + pts = parypt; + loc = ENCVERTEX; + break; + } + } + } + cavetetvertlist->restart(); // Clear the work list. + + if (pts != NULL) { + // The point is either too close to an existing vertex (NEARVERTEX) + // or encroaches upon (inside the protecting ball) of that vertex. + if (loc == NEARVERTEX) { + if (!issteinerpoint(insertpt) && b->nomergevertex) { // -M0/1 option. + // 'insertpt' is an input vertex. + // In this case, we still insert this vertex. Issue a warning. + if (!b->quiet) { + printf("Warning: Two points, %d and %d, are very close.\n", + pointmark(insertpt), pointmark(*pts)); + printf(" Creating a very short edge (len = %g) (< %g).\n", + rd, minedgelength); + printf(" You may try a smaller tolerance (-T) (current is %g)\n", + b->epsilon); + printf(" to avoid this warning.\n"); + } + } else { + point2tetorg(*pts, *searchtet); + insertpoint_abort(splitseg, ivf); + ivf->iloc = (int) loc; + return 0; + } + } else { // loc == ENCVERTEX + // The point lies inside the protection ball. + point2tetorg(*pts, *searchtet); + insertpoint_abort(splitseg, ivf); + ivf->iloc = (int) loc; + return 0; + } + } + } // if (b->plc && (loc != INSTAR)) + + if (b->weighted || ivf->cdtflag || ivf->smlenflag + ) { + // There may be other vertices inside C(p). We need to find them. + // Collect all vertices of C(p). + for (i = 0; i < caveoldtetlist->objects; i++) { + cavetet = (triface *) fastlookup(caveoldtetlist, i); + //assert(infected(*cavetet)); + pts = (point *) &(cavetet->tet[4]); + for (j = 0; j < 4; j++) { + if (pts[j] != dummypoint) { + if (!pinfected(pts[j])) { + pinfect(pts[j]); + cavetetvertlist->newindex((void **) &parypt); + *parypt = pts[j]; + } + } + } // j + } // i + // Uninfect all collected (cavity) vertices. + for (i = 0; i < cavetetvertlist->objects; i++) { + parypt = (point *) fastlookup(cavetetvertlist, i); + puninfect(*parypt); + } + if (ivf->smlenflag) { + REAL len; + // Get the length of the shortest edge connecting to 'newpt'. + parypt = (point *) fastlookup(cavetetvertlist, 0); + ivf->smlen = distance(*parypt, insertpt); + ivf->parentpt = *parypt; + for (i = 1; i < cavetetvertlist->objects; i++) { + parypt = (point *) fastlookup(cavetetvertlist, i); + len = distance(*parypt, insertpt); + if (len < ivf->smlen) { + ivf->smlen = len; + ivf->parentpt = *parypt; + } + } + } + } + + + if (ivf->cdtflag) { + // Unmark tets. + for (i = 0; i < caveoldtetlist->objects; i++) { + cavetet = (triface *) fastlookup(caveoldtetlist, i); + unmarktest(*cavetet); + } + for (i = 0; i < cavebdrylist->objects; i++) { + cavetet = (triface *) fastlookup(cavebdrylist, i); + unmarktest(*cavetet); + } + // Clean up arrays which are not needed. + cavetetlist->restart(); + if (checksubsegflag) { + cavetetseglist->restart(); + } + if (checksubfaceflag) { + cavetetshlist->restart(); + } + return 1; + } + + // Before re-mesh C(p). Process the segments and subfaces which are on the + // boundary of C(p). Make sure that each such segment or subface is + // connecting to a tet outside C(p). So we can re-connect them to the + // new tets inside the C(p) later. + + if (checksubsegflag) { + for (i = 0; i < cavetetseglist->objects; i++) { + paryseg = (face *) fastlookup(cavetetseglist, i); + // Operate on it if it is not the splitting segment, i.e., in sC(p). + if (!smarktested(*paryseg)) { + // Check if the segment is inside the cavity. + // 'j' counts the num of adjacent tets of this seg. + // 'k' counts the num of adjacent tets which are 'sinfected'. + j = k = 0; + sstpivot1(*paryseg, neightet); + spintet = neightet; + while (1) { + j++; + if (!infected(spintet)) { + neineitet = spintet; // An outer tet. Remember it. + } else { + k++; // An in tet. + } + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + // assert(j > 0); + if (k == 0) { + // The segment is not connect to C(p) anymore. Remove it by + // Replacing it by the last entry of this list. + s = cavetetseglist->objects - 1; + checkseg = * (face *) fastlookup(cavetetseglist, s); + *paryseg = checkseg; + cavetetseglist->objects--; + i--; + } else if (k < j) { + // The segment is on the boundary of C(p). + sstbond1(*paryseg, neineitet); + } else { // k == j + // The segment is inside C(p). + if (!ivf->splitbdflag) { + checkseg = *paryseg; + sinfect(checkseg); // Flag it as an interior segment. + caveencseglist->newindex((void **) &paryseg); + *paryseg = checkseg; + } else { + //assert(0); // Not possible. + terminatetetgen(this, 2); + } + } + } else { + // assert(smarktested(*paryseg)); + // Flag it as an interior segment. Do not queue it, since it will + // be deleted after the segment splitting. + sinfect(*paryseg); + } + } // i + } // if (checksubsegflag) + + if (checksubfaceflag) { + for (i = 0; i < cavetetshlist->objects; i++) { + parysh = (face *) fastlookup(cavetetshlist, i); + // Operate on it if it is not inside the sub-cavity sC(p). + if (!smarktested(*parysh)) { + // Check if this subface is inside the cavity. + k = 0; + for (j = 0; j < 2; j++) { + stpivot(*parysh, neightet); + if (!infected(neightet)) { + checksh = *parysh; // Remember this side. + } else { + k++; + } + sesymself(*parysh); + } + if (k == 0) { + // The subface is not connected to C(p). Remove it. + s = cavetetshlist->objects - 1; + checksh = * (face *) fastlookup(cavetetshlist, s); + *parysh = checksh; + cavetetshlist->objects--; + i--; + } else if (k == 1) { + // This side is the outer boundary of C(p). + *parysh = checksh; + } else { // k == 2 + if (!ivf->splitbdflag) { + checksh = *parysh; + sinfect(checksh); // Flag it. + caveencshlist->newindex((void **) &parysh); + *parysh = checksh; + } else { + //assert(0); // Not possible. + terminatetetgen(this, 2); + } + } + } else { + // assert(smarktested(*parysh)); + // Flag it as an interior subface. Do not queue it. It will be + // deleted after the facet point insertion. + sinfect(*parysh); + } + } // i + } // if (checksubfaceflag) + + // Create new tetrahedra to fill the cavity. + + for (i = 0; i < cavebdrylist->objects; i++) { + cavetet = (triface *) fastlookup(cavebdrylist, i); + neightet = *cavetet; + unmarktest(neightet); // Unmark it. + // Get the oldtet (inside the cavity). + fsym(neightet, oldtet); + if (apex(neightet) != dummypoint) { + // Create a new tet in the cavity. + maketetrahedron(&newtet); + setorg(newtet, dest(neightet)); + setdest(newtet, org(neightet)); + setapex(newtet, apex(neightet)); + setoppo(newtet, insertpt); + } else { + // Create a new hull tet. + hullsize++; + maketetrahedron(&newtet); + setorg(newtet, org(neightet)); + setdest(newtet, dest(neightet)); + setapex(newtet, insertpt); + setoppo(newtet, dummypoint); // It must opposite to face 3. + // Adjust back to the cavity bounday face. + esymself(newtet); + } + // The new tet inherits attribtes from the old tet. + for (j = 0; j < numelemattrib; j++) { + attrib = elemattribute(oldtet.tet, j); + setelemattribute(newtet.tet, j, attrib); + } + if (b->varvolume) { + volume = volumebound(oldtet.tet); + setvolumebound(newtet.tet, volume); + } + // Connect newtet <==> neightet, this also disconnect the old bond. + bond(newtet, neightet); + // oldtet still connects to neightet. + *cavetet = oldtet; // *cavetet = newtet; + } // i + + // Set a handle for speeding point location. + recenttet = newtet; + //setpoint2tet(insertpt, encode(newtet)); + setpoint2tet(insertpt, (tetrahedron) (newtet.tet)); + + // Re-use this list to save new interior cavity faces. + cavetetlist->restart(); + + // Connect adjacent new tetrahedra together. + for (i = 0; i < cavebdrylist->objects; i++) { + cavetet = (triface *) fastlookup(cavebdrylist, i); + // cavtet is an oldtet, get the newtet at this face. + oldtet = *cavetet; + fsym(oldtet, neightet); + fsym(neightet, newtet); + // Comment: oldtet and newtet must be at the same directed edge. + // Connect the three other faces of this newtet. + for (j = 0; j < 3; j++) { + esym(newtet, neightet); // Go to the face. + if (neightet.tet[neightet.ver & 3] == NULL) { + // Find the adjacent face of this newtet. + spintet = oldtet; + while (1) { + fnextself(spintet); + if (!infected(spintet)) break; + } + fsym(spintet, newneitet); + esymself(newneitet); + bond(neightet, newneitet); + if (ivf->lawson > 1) { + cavetetlist->newindex((void **) &parytet); + *parytet = neightet; + } + } + //setpoint2tet(org(newtet), encode(newtet)); + setpoint2tet(org(newtet), (tetrahedron) (newtet.tet)); + enextself(newtet); + enextself(oldtet); + } + *cavetet = newtet; // Save the new tet. + } // i + + if (checksubfaceflag) { + // Connect subfaces on the boundary of the cavity to the new tets. + for (i = 0; i < cavetetshlist->objects; i++) { + parysh = (face *) fastlookup(cavetetshlist, i); + // Connect it if it is not a missing subface. + if (!sinfected(*parysh)) { + stpivot(*parysh, neightet); + fsym(neightet, spintet); + sesymself(*parysh); + tsbond(spintet, *parysh); + } + } + } + + if (checksubsegflag) { + // Connect segments on the boundary of the cavity to the new tets. + for (i = 0; i < cavetetseglist->objects; i++) { + paryseg = (face *) fastlookup(cavetetseglist, i); + // Connect it if it is not a missing segment. + if (!sinfected(*paryseg)) { + sstpivot1(*paryseg, neightet); + spintet = neightet; + while (1) { + tssbond1(spintet, *paryseg); + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + } + } + } + + if (((splitsh != NULL) && (splitsh->sh != NULL)) || + ((splitseg != NULL) && (splitseg->sh != NULL))) { + // Split a subface or a segment. + sinsertvertex(insertpt, splitsh, splitseg, ivf->sloc, ivf->sbowywat, 0); + } + + if (checksubfaceflag) { + if (ivf->splitbdflag) { + // Recover new subfaces in C(p). + for (i = 0; i < caveshbdlist->objects; i++) { + // Get an old subface at edge [a, b]. + parysh = (face *) fastlookup(caveshbdlist, i); + spivot(*parysh, checksh); // The new subface [a, b, p]. + // Do not recover a deleted new face (degenerated). + if (checksh.sh[3] != NULL) { + // Note that the old subface still connects to adjacent old tets + // of C(p), which still connect to the tets outside C(p). + stpivot(*parysh, neightet); + // Find the adjacent tet containing the edge [a,b] outside C(p). + spintet = neightet; + while (1) { + fnextself(spintet); + if (!infected(spintet)) break; + } + // The adjacent tet connects to a new tet in C(p). + fsym(spintet, neightet); + // Find the tet containing the face [a, b, p]. + spintet = neightet; + while (1) { + fnextself(spintet); + if (apex(spintet) == insertpt) break; + } + // Adjust the edge direction in spintet and checksh. + if (sorg(checksh) != org(spintet)) { + sesymself(checksh); + } + // Connect the subface to two adjacent tets. + tsbond(spintet, checksh); + fsymself(spintet); + sesymself(checksh); + tsbond(spintet, checksh); + } // if (checksh.sh[3] != NULL) + } + } else { + // The Boundary recovery phase. + // Put all new subfaces into stack for recovery. + for (i = 0; i < caveshbdlist->objects; i++) { + // Get an old subface at edge [a, b]. + parysh = (face *) fastlookup(caveshbdlist, i); + spivot(*parysh, checksh); // The new subface [a, b, p]. + // Do not recover a deleted new face (degenerated). + if (checksh.sh[3] != NULL) { + subfacstack->newindex((void **) &parysh); + *parysh = checksh; + } + } + // Put all interior subfaces into stack for recovery. + for (i = 0; i < caveencshlist->objects; i++) { + parysh = (face *) fastlookup(caveencshlist, i); + // Some subfaces inside C(p) might be split in sinsertvertex(). + // Only queue those faces which are not split. + if (!smarktested(*parysh)) { + checksh = *parysh; + suninfect(checksh); + stdissolve(checksh); // Detach connections to old tets. + subfacstack->newindex((void **) &parysh); + *parysh = checksh; + } + } + } + } // if (checksubfaceflag) + + if (checksubsegflag) { + if (ivf->splitbdflag) { + if (splitseg != NULL) { + // Recover the two new subsegments in C(p). + for (i = 0; i < cavesegshlist->objects; i++) { + paryseg = (face *) fastlookup(cavesegshlist, i); + // Insert this subsegment into C(p). + checkseg = *paryseg; + // Get the adjacent new subface. + checkseg.shver = 0; + spivot(checkseg, checksh); + if (checksh.sh != NULL) { + // Get the adjacent new tetrahedron. + stpivot(checksh, neightet); + } else { + // It's a dangling segment. + point2tetorg(sorg(checkseg), neightet); + finddirection(&neightet, sdest(checkseg)); + } + sstbond1(checkseg, neightet); + spintet = neightet; + while (1) { + tssbond1(spintet, checkseg); + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + } + } // if (splitseg != NULL) + } else { + // The Boundary Recovery Phase. + // Queue missing segments in C(p) for recovery. + if (splitseg != NULL) { + // Queue two new subsegments in C(p) for recovery. + for (i = 0; i < cavesegshlist->objects; i++) { + paryseg = (face *) fastlookup(cavesegshlist, i); + checkseg = *paryseg; + //sstdissolve1(checkseg); // It has not been connected yet. + s = randomnation(subsegstack->objects + 1); + subsegstack->newindex((void **) &paryseg); + *paryseg = * (face *) fastlookup(subsegstack, s); + paryseg = (face *) fastlookup(subsegstack, s); + *paryseg = checkseg; + } + } // if (splitseg != NULL) + for (i = 0; i < caveencseglist->objects; i++) { + paryseg = (face *) fastlookup(caveencseglist, i); + if (!smarktested(*paryseg)) { // It may be split. + checkseg = *paryseg; + suninfect(checkseg); + sstdissolve1(checkseg); // Detach connections to old tets. + s = randomnation(subsegstack->objects + 1); + subsegstack->newindex((void **) &paryseg); + *paryseg = * (face *) fastlookup(subsegstack, s); + paryseg = (face *) fastlookup(subsegstack, s); + *paryseg = checkseg; + } + } + } + } // if (checksubsegflag) + + if (b->weighted + ) { + // Some vertices may be completed inside the cavity. They must be + // detected and added to recovering list. + // Since every "live" vertex must contain a pointer to a non-dead + // tetrahedron, we can check for each vertex this pointer. + for (i = 0; i < cavetetvertlist->objects; i++) { + pts = (point *) fastlookup(cavetetvertlist, i); + decode(point2tet(*pts), *searchtet); + if (infected(*searchtet)) { + if (b->weighted) { + if (b->verbose > 1) { + printf(" Point #%d is non-regular after the insertion of #%d.\n", + pointmark(*pts), pointmark(insertpt)); + } + setpointtype(*pts, NREGULARVERTEX); + nonregularcount++; + } + } + } + } + + if (ivf->chkencflag & 1) { + // Queue all segment outside C(p). + for (i = 0; i < cavetetseglist->objects; i++) { + paryseg = (face *) fastlookup(cavetetseglist, i); + // Skip if it is the split segment. + if (!sinfected(*paryseg)) { + enqueuesubface(badsubsegs, paryseg); + } + } + if (splitseg != NULL) { + // Queue the two new subsegments inside C(p). + for (i = 0; i < cavesegshlist->objects; i++) { + paryseg = (face *) fastlookup(cavesegshlist, i); + enqueuesubface(badsubsegs, paryseg); + } + } + } // if (chkencflag & 1) + + if (ivf->chkencflag & 2) { + // Queue all subfaces outside C(p). + for (i = 0; i < cavetetshlist->objects; i++) { + parysh = (face *) fastlookup(cavetetshlist, i); + // Skip if it is a split subface. + if (!sinfected(*parysh)) { + enqueuesubface(badsubfacs, parysh); + } + } + // Queue all new subfaces inside C(p). + for (i = 0; i < caveshbdlist->objects; i++) { + // Get an old subface at edge [a, b]. + parysh = (face *) fastlookup(caveshbdlist, i); + spivot(*parysh, checksh); // checksh is a new subface [a, b, p]. + // Do not recover a deleted new face (degenerated). + if (checksh.sh[3] != NULL) { + enqueuesubface(badsubfacs, &checksh); + } + } + } // if (chkencflag & 2) + + if (ivf->chkencflag & 4) { + // Queue all new tetrahedra in C(p). + for (i = 0; i < cavebdrylist->objects; i++) { + cavetet = (triface *) fastlookup(cavebdrylist, i); + enqueuetetrahedron(cavetet); + } + } + + // C(p) is re-meshed successfully. + + // Delete the old tets in C(p). + for (i = 0; i < caveoldtetlist->objects; i++) { + searchtet = (triface *) fastlookup(caveoldtetlist, i); + if (ishulltet(*searchtet)) { + hullsize--; + } + tetrahedrondealloc(searchtet->tet); + } + + if (((splitsh != NULL) && (splitsh->sh != NULL)) || + ((splitseg != NULL) && (splitseg->sh != NULL))) { + // Delete the old subfaces in sC(p). + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + if (checksubfaceflag) {//if (bowywat == 2) { + // It is possible that this subface still connects to adjacent + // tets which are not in C(p). If so, clear connections in the + // adjacent tets at this subface. + stpivot(*parysh, neightet); + if (neightet.tet != NULL) { + if (neightet.tet[4] != NULL) { + // Found an adjacent tet. It must be not in C(p). + tsdissolve(neightet); + fsymself(neightet); + tsdissolve(neightet); + } + } + } + shellfacedealloc(subfaces, parysh->sh); + } + if ((splitseg != NULL) && (splitseg->sh != NULL)) { + // Delete the old segment in sC(p). + shellfacedealloc(subsegs, splitseg->sh); + } + } + + if (ivf->lawson) { + for (i = 0; i < cavebdrylist->objects; i++) { + searchtet = (triface *) fastlookup(cavebdrylist, i); + flippush(flipstack, searchtet); + } + if (ivf->lawson > 1) { + for (i = 0; i < cavetetlist->objects; i++) { + searchtet = (triface *) fastlookup(cavetetlist, i); + flippush(flipstack, searchtet); + } + } + } + + + // Clean the working lists. + + caveoldtetlist->restart(); + cavebdrylist->restart(); + cavetetlist->restart(); + + if (checksubsegflag) { + cavetetseglist->restart(); + caveencseglist->restart(); + } + + if (checksubfaceflag) { + cavetetshlist->restart(); + caveencshlist->restart(); + } + + if (b->weighted || ivf->smlenflag + ) { + cavetetvertlist->restart(); + } + + if (((splitsh != NULL) && (splitsh->sh != NULL)) || + ((splitseg != NULL) && (splitseg->sh != NULL))) { + caveshlist->restart(); + caveshbdlist->restart(); + cavesegshlist->restart(); + } + + return 1; // Point is inserted. +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// insertpoint_abort() Abort the insertion of a new vertex. // +// // +// The cavity will be restored. All working lists are cleared. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::insertpoint_abort(face *splitseg, insertvertexflags *ivf) +{ + triface *cavetet; + face *parysh; + int i; + + for (i = 0; i < caveoldtetlist->objects; i++) { + cavetet = (triface *) fastlookup(caveoldtetlist, i); + uninfect(*cavetet); + unmarktest(*cavetet); + } + for (i = 0; i < cavebdrylist->objects; i++) { + cavetet = (triface *) fastlookup(cavebdrylist, i); + unmarktest(*cavetet); + } + cavetetlist->restart(); + cavebdrylist->restart(); + caveoldtetlist->restart(); + cavetetseglist->restart(); + cavetetshlist->restart(); + if (ivf->splitbdflag) { + if ((splitseg != NULL) && (splitseg->sh != NULL)) { + sunmarktest(*splitseg); + } + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + sunmarktest(*parysh); + } + caveshlist->restart(); + cavesegshlist->restart(); + } +} + +//// //// +//// //// +//// flip_cxx ///////////////////////////////////////////////////////////////// + +//// delaunay_cxx ///////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// transfernodes() Read the vertices from the input (tetgenio). // +// // +// Transferring all points from input ('in->pointlist') to TetGen's 'points'.// +// All points are indexed (the first point index is 'in->firstnumber'). Each // +// point's type is initialized as UNUSEDVERTEX. The bounding box (xmax, xmin,// +// ...) and the diameter (longest) of the point set are calculated. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::transfernodes() +{ + point pointloop; + REAL x, y, z, w; + int coordindex; + int attribindex; + int mtrindex; + int i, j; + + // Read the points. + coordindex = 0; + attribindex = 0; + mtrindex = 0; + for (i = 0; i < in->numberofpoints; i++) { + makepoint(&pointloop, UNUSEDVERTEX); + // Read the point coordinates. + x = pointloop[0] = in->pointlist[coordindex++]; + y = pointloop[1] = in->pointlist[coordindex++]; + z = pointloop[2] = in->pointlist[coordindex++]; + // Read the point attributes. (Including point weights.) + for (j = 0; j < in->numberofpointattributes; j++) { + pointloop[3 + j] = in->pointattributelist[attribindex++]; + } + // Read the point metric tensor. + for (j = 0; j < in->numberofpointmtrs; j++) { + pointloop[pointmtrindex + j] = in->pointmtrlist[mtrindex++]; + } + if (b->weighted) { // -w option + if (in->numberofpointattributes > 0) { + // The first point attribute is its weight. + //w = in->pointattributelist[in->numberofpointattributes * i]; + w = pointloop[3]; + } else { + // No given weight available. Default choose the maximum + // absolute value among its coordinates. + w = fabs(x); + if (w < fabs(y)) w = fabs(y); + if (w < fabs(z)) w = fabs(z); + } + if (b->weighted_param == 0) { + pointloop[3] = x * x + y * y + z * z - w; // Weighted DT. + } else { // -w1 option + pointloop[3] = w; // Regular tetrahedralization. + } + } + // Determine the smallest and largest x, y and z coordinates. + if (i == 0) { + xmin = xmax = x; + ymin = ymax = y; + zmin = zmax = z; + } else { + xmin = (x < xmin) ? x : xmin; + xmax = (x > xmax) ? x : xmax; + ymin = (y < ymin) ? y : ymin; + ymax = (y > ymax) ? y : ymax; + zmin = (z < zmin) ? z : zmin; + zmax = (z > zmax) ? z : zmax; + } + if (b->psc) { + // Read the geometry parameters. + setpointgeomuv(pointloop, 0, in->pointparamlist[i].uv[0]); + setpointgeomuv(pointloop, 1, in->pointparamlist[i].uv[1]); + setpointgeomtag(pointloop, in->pointparamlist[i].tag); + if (in->pointparamlist[i].type == 0) { + setpointtype(pointloop, RIDGEVERTEX); + } else if (in->pointparamlist[i].type == 1) { + setpointtype(pointloop, FREESEGVERTEX); + } else if (in->pointparamlist[i].type == 2) { + setpointtype(pointloop, FREEFACETVERTEX); + } else if (in->pointparamlist[i].type == 3) { + setpointtype(pointloop, FREEVOLVERTEX); + } + } + } + + // 'longest' is the largest possible edge length formed by input vertices. + x = xmax - xmin; + y = ymax - ymin; + z = zmax - zmin; + longest = sqrt(x * x + y * y + z * z); + if (longest == 0.0) { + printf("Error: The point set is trivial.\n"); + terminatetetgen(this, 10); + } + // Two identical points are distinguished by 'minedgelength'. + minedgelength = longest * b->epsilon; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// hilbert_init() Initialize the Gray code permutation table. // +// // +// The table 'transgc' has 8 x 3 x 8 entries. It contains all possible Gray // +// code sequences traveled by the 1st order Hilbert curve in 3 dimensions. // +// The first column is the Gray code of the entry point of the curve, and // +// the second column is the direction (0, 1, or 2, 0 means the x-axis) where // +// the exit point of curve lies. // +// // +// The table 'tsb1mod3' contains the numbers of trailing set '1' bits of the // +// indices from 0 to 7, modulo by '3'. The code for generating this table is // +// from: http://graphics.stanford.edu/~seander/bithacks.html. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::hilbert_init(int n) +{ + int gc[8], N, mask, travel_bit; + int e, d, f, k, g; + int v, c; + int i; + + N = (n == 2) ? 4 : 8; + mask = (n == 2) ? 3 : 7; + + // Generate the Gray code sequence. + for (i = 0; i < N; i++) { + gc[i] = i ^ (i >> 1); + } + + for (e = 0; e < N; e++) { + for (d = 0; d < n; d++) { + // Calculate the end point (f). + f = e ^ (1 << d); // Toggle the d-th bit of 'e'. + // travel_bit = 2**p, the bit we want to travel. + travel_bit = e ^ f; + for (i = 0; i < N; i++) { + // // Rotate gc[i] left by (p + 1) % n bits. + k = gc[i] * (travel_bit * 2); + g = ((k | (k / N)) & mask); + // Calculate the permuted Gray code by xor with the start point (e). + transgc[e][d][i] = (g ^ e); + } + } // d + } // e + + // Count the consecutive '1' bits (trailing) on the right. + tsb1mod3[0] = 0; + for (i = 1; i < N; i++) { + v = ~i; // Count the 0s. + v = (v ^ (v - 1)) >> 1; // Set v's trailing 0s to 1s and zero rest + for (c = 0; v; c++) { + v >>= 1; + } + tsb1mod3[i] = c % n; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// hilbert_sort3() Sort points using the 3d Hilbert curve. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::hilbert_split(point* vertexarray,int arraysize,int gc0,int gc1, + REAL bxmin, REAL bxmax, REAL bymin, REAL bymax, + REAL bzmin, REAL bzmax) +{ + point swapvert; + int axis, d; + REAL split; + int i, j; + + + // Find the current splitting axis. 'axis' is a value 0, or 1, or 2, which + // correspoding to x-, or y- or z-axis. + axis = (gc0 ^ gc1) >> 1; + + // Calulate the split position along the axis. + if (axis == 0) { + split = 0.5 * (bxmin + bxmax); + } else if (axis == 1) { + split = 0.5 * (bymin + bymax); + } else { // == 2 + split = 0.5 * (bzmin + bzmax); + } + + // Find the direction (+1 or -1) of the axis. If 'd' is +1, the direction + // of the axis is to the positive of the axis, otherwise, it is -1. + d = ((gc0 & (1< 0) { + do { + for (; i < arraysize; i++) { + if (vertexarray[i][axis] >= split) break; + } + for (; j >= 0; j--) { + if (vertexarray[j][axis] < split) break; + } + // Is the partition finished? + if (i == (j + 1)) break; + // Swap i-th and j-th vertices. + swapvert = vertexarray[i]; + vertexarray[i] = vertexarray[j]; + vertexarray[j] = swapvert; + // Continue patitioning the array; + } while (true); + } else { + do { + for (; i < arraysize; i++) { + if (vertexarray[i][axis] <= split) break; + } + for (; j >= 0; j--) { + if (vertexarray[j][axis] > split) break; + } + // Is the partition finished? + if (i == (j + 1)) break; + // Swap i-th and j-th vertices. + swapvert = vertexarray[i]; + vertexarray[i] = vertexarray[j]; + vertexarray[j] = swapvert; + // Continue patitioning the array; + } while (true); + } + + return i; +} + +void tetgenmesh::hilbert_sort3(point* vertexarray, int arraysize, int e, int d, + REAL bxmin, REAL bxmax, REAL bymin, REAL bymax, + REAL bzmin, REAL bzmax, int depth) +{ + REAL x1, x2, y1, y2, z1, z2; + int p[9], w, e_w, d_w, k, ei, di; + int n = 3, mask = 7; + + p[0] = 0; + p[8] = arraysize; + + // Sort the points according to the 1st order Hilbert curve in 3d. + p[4] = hilbert_split(vertexarray, p[8], transgc[e][d][3], transgc[e][d][4], + bxmin, bxmax, bymin, bymax, bzmin, bzmax); + p[2] = hilbert_split(vertexarray, p[4], transgc[e][d][1], transgc[e][d][2], + bxmin, bxmax, bymin, bymax, bzmin, bzmax); + p[1] = hilbert_split(vertexarray, p[2], transgc[e][d][0], transgc[e][d][1], + bxmin, bxmax, bymin, bymax, bzmin, bzmax); + p[3] = hilbert_split(&(vertexarray[p[2]]), p[4] - p[2], + transgc[e][d][2], transgc[e][d][3], + bxmin, bxmax, bymin, bymax, bzmin, bzmax) + p[2]; + p[6] = hilbert_split(&(vertexarray[p[4]]), p[8] - p[4], + transgc[e][d][5], transgc[e][d][6], + bxmin, bxmax, bymin, bymax, bzmin, bzmax) + p[4]; + p[5] = hilbert_split(&(vertexarray[p[4]]), p[6] - p[4], + transgc[e][d][4], transgc[e][d][5], + bxmin, bxmax, bymin, bymax, bzmin, bzmax) + p[4]; + p[7] = hilbert_split(&(vertexarray[p[6]]), p[8] - p[6], + transgc[e][d][6], transgc[e][d][7], + bxmin, bxmax, bymin, bymax, bzmin, bzmax) + p[6]; + + if (b->hilbert_order > 0) { + // A maximum order is prescribed. + if ((depth + 1) == b->hilbert_order) { + // The maximum prescribed order is reached. + return; + } + } + + // Recursively sort the points in sub-boxes. + for (w = 0; w < 8; w++) { + // w is the local Hilbert index (NOT Gray code). + // Sort into the sub-box either there are more than 2 points in it, or + // the prescribed order of the curve is not reached yet. + //if ((p[w+1] - p[w] > b->hilbert_limit) || (b->hilbert_order > 0)) { + if ((p[w+1] - p[w]) > b->hilbert_limit) { + // Calculcate the start point (ei) of the curve in this sub-box. + // update e = e ^ (e(w) left_rotate (d+1)). + if (w == 0) { + e_w = 0; + } else { + // calculate e(w) = gc(2 * floor((w - 1) / 2)). + k = 2 * ((w - 1) / 2); + e_w = k ^ (k >> 1); // = gc(k). + } + k = e_w; + e_w = ((k << (d+1)) & mask) | ((k >> (n-d-1)) & mask); + ei = e ^ e_w; + // Calulcate the direction (di) of the curve in this sub-box. + // update d = (d + d(w) + 1) % n + if (w == 0) { + d_w = 0; + } else { + d_w = ((w % 2) == 0) ? tsb1mod3[w - 1] : tsb1mod3[w]; + } + di = (d + d_w + 1) % n; + // Calculate the bounding box of the sub-box. + if (transgc[e][d][w] & 1) { // x-axis + x1 = 0.5 * (bxmin + bxmax); + x2 = bxmax; + } else { + x1 = bxmin; + x2 = 0.5 * (bxmin + bxmax); + } + if (transgc[e][d][w] & 2) { // y-axis + y1 = 0.5 * (bymin + bymax); + y2 = bymax; + } else { + y1 = bymin; + y2 = 0.5 * (bymin + bymax); + } + if (transgc[e][d][w] & 4) { // z-axis + z1 = 0.5 * (bzmin + bzmax); + z2 = bzmax; + } else { + z1 = bzmin; + z2 = 0.5 * (bzmin + bzmax); + } + hilbert_sort3(&(vertexarray[p[w]]), p[w+1] - p[w], ei, di, + x1, x2, y1, y2, z1, z2, depth+1); + } // if (p[w+1] - p[w] > 1) + } // w +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// brio_multiscale_sort() Sort the points using BRIO and Hilbert curve. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::brio_multiscale_sort(point* vertexarray, int arraysize, + int threshold, REAL ratio, int *depth) +{ + int middle; + + middle = 0; + if (arraysize >= threshold) { + (*depth)++; + middle = arraysize * ratio; + brio_multiscale_sort(vertexarray, middle, threshold, ratio, depth); + } + // Sort the right-array (rnd-th round) using the Hilbert curve. + hilbert_sort3(&(vertexarray[middle]), arraysize - middle, 0, 0, // e, d + xmin, xmax, ymin, ymax, zmin, zmax, 0); // depth. +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// randomnation() Generate a random number between 0 and 'choices' - 1. // +// // +/////////////////////////////////////////////////////////////////////////////// + +unsigned long tetgenmesh::randomnation(unsigned int choices) +{ + unsigned long newrandom; + + if (choices >= 714025l) { + newrandom = (randomseed * 1366l + 150889l) % 714025l; + randomseed = (newrandom * 1366l + 150889l) % 714025l; + newrandom = newrandom * (choices / 714025l) + randomseed; + if (newrandom >= choices) { + return newrandom - choices; + } else { + return newrandom; + } + } else { + randomseed = (randomseed * 1366l + 150889l) % 714025l; + return randomseed % choices; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// randomsample() Randomly sample the tetrahedra for point loation. // +// // +// Searching begins from one of handles: the input 'searchtet', a recently // +// encountered tetrahedron 'recenttet', or from one chosen from a random // +// sample. The choice is made by determining which one's origin is closest // +// to the point we are searching for. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::randomsample(point searchpt,triface *searchtet) +{ + tetrahedron *firsttet, *tetptr; + point torg; + void **sampleblock; + uintptr_t alignptr; + long sampleblocks, samplesperblock, samplenum; + long tetblocks, i, j; + REAL searchdist, dist; + + if (b->verbose > 2) { + printf(" Random sampling tetrahedra for searching point %d.\n", + pointmark(searchpt)); + } + + if (!nonconvex) { + if (searchtet->tet == NULL) { + // A null tet. Choose the recenttet as the starting tet. + *searchtet = recenttet; + } + + // 'searchtet' should be a valid tetrahedron. Choose the base face + // whose vertices must not be 'dummypoint'. + searchtet->ver = 3; + // Record the distance from its origin to the searching point. + torg = org(*searchtet); + searchdist = (searchpt[0] - torg[0]) * (searchpt[0] - torg[0]) + + (searchpt[1] - torg[1]) * (searchpt[1] - torg[1]) + + (searchpt[2] - torg[2]) * (searchpt[2] - torg[2]); + + // If a recently encountered tetrahedron has been recorded and has not + // been deallocated, test it as a good starting point. + if (recenttet.tet != searchtet->tet) { + recenttet.ver = 3; + torg = org(recenttet); + dist = (searchpt[0] - torg[0]) * (searchpt[0] - torg[0]) + + (searchpt[1] - torg[1]) * (searchpt[1] - torg[1]) + + (searchpt[2] - torg[2]) * (searchpt[2] - torg[2]); + if (dist < searchdist) { + *searchtet = recenttet; + searchdist = dist; + } + } + } else { + // The mesh is non-convex. Do not use 'recenttet'. + searchdist = longest; + } + + // Select "good" candidate using k random samples, taking the closest one. + // The number of random samples taken is proportional to the fourth root + // of the number of tetrahedra in the mesh. + while (samples * samples * samples * samples < tetrahedrons->items) { + samples++; + } + // Find how much blocks in current tet pool. + tetblocks = (tetrahedrons->maxitems + b->tetrahedraperblock - 1) + / b->tetrahedraperblock; + // Find the average samples per block. Each block at least have 1 sample. + samplesperblock = 1 + (samples / tetblocks); + sampleblocks = samples / samplesperblock; + sampleblock = tetrahedrons->firstblock; + for (i = 0; i < sampleblocks; i++) { + alignptr = (uintptr_t) (sampleblock + 1); + firsttet = (tetrahedron *) + (alignptr + (uintptr_t) tetrahedrons->alignbytes + - (alignptr % (uintptr_t) tetrahedrons->alignbytes)); + for (j = 0; j < samplesperblock; j++) { + if (i == tetblocks - 1) { + // This is the last block. + samplenum = randomnation((int) + (tetrahedrons->maxitems - (i * b->tetrahedraperblock))); + } else { + samplenum = randomnation(b->tetrahedraperblock); + } + tetptr = (tetrahedron *) + (firsttet + (samplenum * tetrahedrons->itemwords)); + torg = (point) tetptr[4]; + if (torg != (point) NULL) { + dist = (searchpt[0] - torg[0]) * (searchpt[0] - torg[0]) + + (searchpt[1] - torg[1]) * (searchpt[1] - torg[1]) + + (searchpt[2] - torg[2]) * (searchpt[2] - torg[2]); + if (dist < searchdist) { + searchtet->tet = tetptr; + searchtet->ver = 11; // torg = org(t); + searchdist = dist; + } + } else { + // A dead tet. Re-sample it. + if (i != tetblocks - 1) j--; + } + } + sampleblock = (void **) *sampleblock; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// locate() Find a tetrahedron containing a given point. // +// // +// Begins its search from 'searchtet', assume there is a line segment L from // +// a vertex of 'searchtet' to the query point 'searchpt', and simply walk // +// towards 'searchpt' by traversing all faces intersected by L. // +// // +// On completion, 'searchtet' is a tetrahedron that contains 'searchpt'. The // +// returned value indicates one of the following cases: // +// - ONVERTEX, the search point lies on the origin of 'searchtet'. // +// - ONEDGE, the search point lies on an edge of 'searchtet'. // +// - ONFACE, the search point lies on a face of 'searchtet'. // +// - INTET, the search point lies in the interior of 'searchtet'. // +// - OUTSIDE, the search point lies outside the mesh. 'searchtet' is a // +// hull face which is visible by the search point. // +// // +// WARNING: This routine is designed for convex triangulations, and will not // +// generally work after the holes and concavities have been carved. // +// // +/////////////////////////////////////////////////////////////////////////////// + +enum tetgenmesh::locateresult + tetgenmesh::locate(point searchpt, triface* searchtet, int chkencflag) +{ + point torg, tdest, tapex, toppo; + enum {ORGMOVE, DESTMOVE, APEXMOVE} nextmove; + REAL ori, oriorg, oridest, oriapex; + enum locateresult loc = OUTSIDE; + int t1ver; + int s; + + torg = tdest = tapex = toppo = NULL; + + if (searchtet->tet == NULL) { + // A null tet. Choose the recenttet as the starting tet. + searchtet->tet = recenttet.tet; + } + + // Check if we are in the outside of the convex hull. + if (ishulltet(*searchtet)) { + // Get its adjacent tet (inside the hull). + searchtet->ver = 3; + fsymself(*searchtet); + } + + // Let searchtet be the face such that 'searchpt' lies above to it. + for (searchtet->ver = 0; searchtet->ver < 4; searchtet->ver++) { + torg = org(*searchtet); + tdest = dest(*searchtet); + tapex = apex(*searchtet); + ori = orient3d(torg, tdest, tapex, searchpt); + if (ori < 0.0) break; + } + if (searchtet->ver == 4) { + terminatetetgen(this, 2); + } + + // Walk through tetrahedra to locate the point. + while (true) { + + toppo = oppo(*searchtet); + + // Check if the vertex is we seek. + if (toppo == searchpt) { + // Adjust the origin of searchtet to be searchpt. + esymself(*searchtet); + eprevself(*searchtet); + loc = ONVERTEX; // return ONVERTEX; + break; + } + + // We enter from one of serarchtet's faces, which face do we exit? + oriorg = orient3d(tdest, tapex, toppo, searchpt); + oridest = orient3d(tapex, torg, toppo, searchpt); + oriapex = orient3d(torg, tdest, toppo, searchpt); + + // Now decide which face to move. It is possible there are more than one + // faces are viable moves. If so, randomly choose one. + if (oriorg < 0) { + if (oridest < 0) { + if (oriapex < 0) { + // All three faces are possible. + s = randomnation(3); // 's' is in {0,1,2}. + if (s == 0) { + nextmove = ORGMOVE; + } else if (s == 1) { + nextmove = DESTMOVE; + } else { + nextmove = APEXMOVE; + } + } else { + // Two faces, opposite to origin and destination, are viable. + //s = randomnation(2); // 's' is in {0,1}. + if (randomnation(2)) { + nextmove = ORGMOVE; + } else { + nextmove = DESTMOVE; + } + } + } else { + if (oriapex < 0) { + // Two faces, opposite to origin and apex, are viable. + //s = randomnation(2); // 's' is in {0,1}. + if (randomnation(2)) { + nextmove = ORGMOVE; + } else { + nextmove = APEXMOVE; + } + } else { + // Only the face opposite to origin is viable. + nextmove = ORGMOVE; + } + } + } else { + if (oridest < 0) { + if (oriapex < 0) { + // Two faces, opposite to destination and apex, are viable. + //s = randomnation(2); // 's' is in {0,1}. + if (randomnation(2)) { + nextmove = DESTMOVE; + } else { + nextmove = APEXMOVE; + } + } else { + // Only the face opposite to destination is viable. + nextmove = DESTMOVE; + } + } else { + if (oriapex < 0) { + // Only the face opposite to apex is viable. + nextmove = APEXMOVE; + } else { + // The point we seek must be on the boundary of or inside this + // tetrahedron. Check for boundary cases. + if (oriorg == 0) { + // Go to the face opposite to origin. + enextesymself(*searchtet); + if (oridest == 0) { + eprevself(*searchtet); // edge oppo->apex + if (oriapex == 0) { + // oppo is duplicated with p. + loc = ONVERTEX; // return ONVERTEX; + break; + } + loc = ONEDGE; // return ONEDGE; + break; + } + if (oriapex == 0) { + enextself(*searchtet); // edge dest->oppo + loc = ONEDGE; // return ONEDGE; + break; + } + loc = ONFACE; // return ONFACE; + break; + } + if (oridest == 0) { + // Go to the face opposite to destination. + eprevesymself(*searchtet); + if (oriapex == 0) { + eprevself(*searchtet); // edge oppo->org + loc = ONEDGE; // return ONEDGE; + break; + } + loc = ONFACE; // return ONFACE; + break; + } + if (oriapex == 0) { + // Go to the face opposite to apex + esymself(*searchtet); + loc = ONFACE; // return ONFACE; + break; + } + loc = INTETRAHEDRON; // return INTETRAHEDRON; + break; + } + } + } + + // Move to the selected face. + if (nextmove == ORGMOVE) { + enextesymself(*searchtet); + } else if (nextmove == DESTMOVE) { + eprevesymself(*searchtet); + } else { + esymself(*searchtet); + } + if (chkencflag) { + // Check if we are walking across a subface. + if (issubface(*searchtet)) { + loc = ENCSUBFACE; + break; + } + } + // Move to the adjacent tetrahedron (maybe a hull tetrahedron). + fsymself(*searchtet); + if (oppo(*searchtet) == dummypoint) { + loc = OUTSIDE; // return OUTSIDE; + break; + } + + // Retreat the three vertices of the base face. + torg = org(*searchtet); + tdest = dest(*searchtet); + tapex = apex(*searchtet); + + } // while (true) + + return loc; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// flippush() Push a face (possibly will be flipped) into flipstack. // +// // +// The face is marked. The flag is used to check the validity of the face on // +// its popup. Some other flips may change it already. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::flippush(badface*& fstack, triface* flipface) +{ + if (!facemarked(*flipface)) { + badface *newflipface = (badface *) flippool->alloc(); + newflipface->tt = *flipface; + markface(newflipface->tt); + // Push this face into stack. + newflipface->nextitem = fstack; + fstack = newflipface; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// incrementalflip() Incrementally flipping to construct DT. // +// // +// Faces need to be checked for flipping are already queued in 'flipstack'. // +// Return the total number of performed flips. // +// // +// Comment: This routine should be only used in the incremental Delaunay // +// construction. In other cases, lawsonflip3d() should be used. // +// // +// If the new point lies outside of the convex hull ('hullflag' is set). The // +// incremental flip algorithm still works as usual. However, we must ensure // +// that every flip (2-to-3 or 3-to-2) does not create a duplicated (existing)// +// edge or face. Otherwise, the underlying space of the triangulation becomes// +// non-manifold and it is not possible to flip further. // +// Thanks to Joerg Rambau and Frank Lutz for helping in this issue. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::incrementalflip(point newpt, int hullflag, flipconstraints *fc) +{ + badface *popface; + triface fliptets[5], *parytet; + point *pts, *parypt, pe; + REAL sign, ori; + int flipcount = 0; + int t1ver; + int i; + + if (b->verbose > 2) { + printf(" Lawson flip (%ld faces).\n", flippool->items); + } + + if (hullflag) { + // 'newpt' lies in the outside of the convex hull. + // Mark all hull vertices which are connecting to it. + popface = flipstack; + while (popface != NULL) { + pts = (point *) popface->tt.tet; + for (i = 4; i < 8; i++) { + if ((pts[i] != newpt) && (pts[i] != dummypoint)) { + if (!pinfected(pts[i])) { + pinfect(pts[i]); + cavetetvertlist->newindex((void **) &parypt); + *parypt = pts[i]; + } + } + } + popface = popface->nextitem; + } + } + + // Loop until the queue is empty. + while (flipstack != NULL) { + + // Pop a face from the stack. + popface = flipstack; + fliptets[0] = popface->tt; + flipstack = flipstack->nextitem; // The next top item in stack. + flippool->dealloc((void *) popface); + + // Skip it if it is a dead tet (destroyed by previous flips). + if (isdeadtet(fliptets[0])) continue; + // Skip it if it is not the same tet as we saved. + if (!facemarked(fliptets[0])) continue; + + unmarkface(fliptets[0]); + + if ((point) fliptets[0].tet[7] == dummypoint) { + // It must be a hull edge. + fliptets[0].ver = epivot[fliptets[0].ver]; + // A hull edge. The current convex hull may be enlarged. + fsym(fliptets[0], fliptets[1]); + pts = (point *) fliptets[1].tet; + ori = orient3d(pts[4], pts[5], pts[6], newpt); + if (ori < 0) { + // Visible. The convex hull will be enlarged. + // Decide which flip (2-to-3, 3-to-2, or 4-to-1) to use. + // Check if the tet [a,c,e,d] or [c,b,e,d] exists. + enext(fliptets[1], fliptets[2]); + eprev(fliptets[1], fliptets[3]); + fnextself(fliptets[2]); // [a,c,e,*] + fnextself(fliptets[3]); // [c,b,e,*] + if (oppo(fliptets[2]) == newpt) { + if (oppo(fliptets[3]) == newpt) { + // Both tets exist! A 4-to-1 flip is found. + terminatetetgen(this, 2); // Report a bug. + } else { + esym(fliptets[2], fliptets[0]); + fnext(fliptets[0], fliptets[1]); + fnext(fliptets[1], fliptets[2]); + // Perform a 3-to-2 flip. Replace edge [c,a] by face [d,e,b]. + // This corresponds to my standard labels, where edge [e,d] is + // repalced by face [a,b,c], and a is the new vertex. + // [0] [c,a,d,e] (d = newpt) + // [1] [c,a,e,b] (c = dummypoint) + // [2] [c,a,b,d] + flip32(fliptets, 1, fc); + } + } else { + if (oppo(fliptets[3]) == newpt) { + fnext(fliptets[3], fliptets[0]); + fnext(fliptets[0], fliptets[1]); + fnext(fliptets[1], fliptets[2]); + // Perform a 3-to-2 flip. Replace edge [c,b] by face [d,a,e]. + // [0] [c,b,d,a] (d = newpt) + // [1] [c,b,a,e] (c = dummypoint) + // [2] [c,b,e,d] + flip32(fliptets, 1, fc); + } else { + if (hullflag) { + // Reject this flip if pe is already marked. + pe = oppo(fliptets[1]); + if (!pinfected(pe)) { + pinfect(pe); + cavetetvertlist->newindex((void **) &parypt); + *parypt = pe; + // Perform a 2-to-3 flip. + flip23(fliptets, 1, fc); + } else { + // Reject this flip. + flipcount--; + } + } else { + // Perform a 2-to-3 flip. Replace face [a,b,c] by edge [e,d]. + // [0] [a,b,c,d], d = newpt. + // [1] [b,a,c,e], c = dummypoint. + flip23(fliptets, 1, fc); + } + } + } + flipcount++; + } + continue; + } // if (dummypoint) + + fsym(fliptets[0], fliptets[1]); + if ((point) fliptets[1].tet[7] == dummypoint) { + // A hull face is locally Delaunay. + continue; + } + // Check if the adjacent tet has already been tested. + if (marktested(fliptets[1])) { + // It has been tested and it is Delaunay. + continue; + } + + // Test whether the face is locally Delaunay or not. + pts = (point *) fliptets[1].tet; + if (b->weighted) { + sign = orient4d_s(pts[4], pts[5], pts[6], pts[7], newpt, + pts[4][3], pts[5][3], pts[6][3], pts[7][3], + newpt[3]); + } else { + sign = insphere_s(pts[4], pts[5], pts[6], pts[7], newpt); + } + + + if (sign < 0) { + point pd = newpt; + point pe = oppo(fliptets[1]); + // Check the convexity of its three edges. Stop checking either a + // locally non-convex edge (ori < 0) or a flat edge (ori = 0) is + // encountered, and 'fliptet' represents that edge. + for (i = 0; i < 3; i++) { + ori = orient3d(org(fliptets[0]), dest(fliptets[0]), pd, pe); + if (ori <= 0) break; + enextself(fliptets[0]); + } + if (ori > 0) { + // A 2-to-3 flip is found. + // [0] [a,b,c,d], + // [1] [b,a,c,e]. no dummypoint. + flip23(fliptets, 0, fc); + flipcount++; + } else { // ori <= 0 + // The edge ('fliptets[0]' = [a',b',c',d]) is non-convex or flat, + // where the edge [a',b'] is one of [a,b], [b,c], and [c,a]. + // Check if there are three or four tets sharing at this edge. + esymself(fliptets[0]); // [b,a,d,c] + for (i = 0; i < 3; i++) { + fnext(fliptets[i], fliptets[i+1]); + } + if (fliptets[3].tet == fliptets[0].tet) { + // A 3-to-2 flip is found. (No hull tet.) + flip32(fliptets, 0, fc); + flipcount++; + } else { + // There are more than 3 tets at this edge. + fnext(fliptets[3], fliptets[4]); + if (fliptets[4].tet == fliptets[0].tet) { + if (ori == 0) { + // A 4-to-4 flip is found. (Two hull tets may be involved.) + // Current tets in 'fliptets': + // [0] [b,a,d,c] (d may be newpt) + // [1] [b,a,c,e] + // [2] [b,a,e,f] (f may be dummypoint) + // [3] [b,a,f,d] + esymself(fliptets[0]); // [a,b,c,d] + // A 2-to-3 flip replaces face [a,b,c] by edge [e,d]. + // This creates a degenerate tet [e,d,a,b] (tmpfliptets[0]). + // It will be removed by the followed 3-to-2 flip. + flip23(fliptets, 0, fc); // No hull tet. + fnext(fliptets[3], fliptets[1]); + fnext(fliptets[1], fliptets[2]); + // Current tets in 'fliptets': + // [0] [...] + // [1] [b,a,d,e] (degenerated, d may be new point). + // [2] [b,a,e,f] (f may be dummypoint) + // [3] [b,a,f,d] + // A 3-to-2 flip replaces edge [b,a] by face [d,e,f]. + // Hull tets may be involved (f may be dummypoint). + flip32(&(fliptets[1]), (apex(fliptets[3]) == dummypoint), fc); + flipcount++; + } + } + } + } // ori + } else { + // The adjacent tet is Delaunay. Mark it to avoid testing it again. + marktest(fliptets[1]); + // Save it for unmarking it later. + cavebdrylist->newindex((void **) &parytet); + *parytet = fliptets[1]; + } + + } // while (flipstack) + + // Unmark saved tetrahedra. + for (i = 0; i < cavebdrylist->objects; i++) { + parytet = (triface *) fastlookup(cavebdrylist, i); + unmarktest(*parytet); + } + cavebdrylist->restart(); + + if (hullflag) { + // Unmark infected vertices. + for (i = 0; i < cavetetvertlist->objects; i++) { + parypt = (point *) fastlookup(cavetetvertlist, i); + puninfect(*parypt); + } + cavetetvertlist->restart(); + } + + + return flipcount; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// initialdelaunay() Create an initial Delaunay tetrahedralization. // +// // +// The tetrahedralization contains only one tetrahedron abcd, and four hull // +// tetrahedra. The points pa, pb, pc, and pd must be linearly independent. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::initialdelaunay(point pa, point pb, point pc, point pd) +{ + triface firsttet, tetopa, tetopb, tetopc, tetopd; + triface worktet, worktet1; + + if (b->verbose > 2) { + printf(" Create init tet (%d, %d, %d, %d)\n", pointmark(pa), + pointmark(pb), pointmark(pc), pointmark(pd)); + } + + // Create the first tetrahedron. + maketetrahedron(&firsttet); + setvertices(firsttet, pa, pb, pc, pd); + // Create four hull tetrahedra. + maketetrahedron(&tetopa); + setvertices(tetopa, pb, pc, pd, dummypoint); + maketetrahedron(&tetopb); + setvertices(tetopb, pc, pa, pd, dummypoint); + maketetrahedron(&tetopc); + setvertices(tetopc, pa, pb, pd, dummypoint); + maketetrahedron(&tetopd); + setvertices(tetopd, pb, pa, pc, dummypoint); + hullsize += 4; + + // Connect hull tetrahedra to firsttet (at four faces of firsttet). + bond(firsttet, tetopd); + esym(firsttet, worktet); + bond(worktet, tetopc); // ab + enextesym(firsttet, worktet); + bond(worktet, tetopa); // bc + eprevesym(firsttet, worktet); + bond(worktet, tetopb); // ca + + // Connect hull tetrahedra together (at six edges of firsttet). + esym(tetopc, worktet); + esym(tetopd, worktet1); + bond(worktet, worktet1); // ab + esym(tetopa, worktet); + eprevesym(tetopd, worktet1); + bond(worktet, worktet1); // bc + esym(tetopb, worktet); + enextesym(tetopd, worktet1); + bond(worktet, worktet1); // ca + eprevesym(tetopc, worktet); + enextesym(tetopb, worktet1); + bond(worktet, worktet1); // da + eprevesym(tetopa, worktet); + enextesym(tetopc, worktet1); + bond(worktet, worktet1); // db + eprevesym(tetopb, worktet); + enextesym(tetopa, worktet1); + bond(worktet, worktet1); // dc + + // Set the vertex type. + if (pointtype(pa) == UNUSEDVERTEX) { + setpointtype(pa, VOLVERTEX); + } + if (pointtype(pb) == UNUSEDVERTEX) { + setpointtype(pb, VOLVERTEX); + } + if (pointtype(pc) == UNUSEDVERTEX) { + setpointtype(pc, VOLVERTEX); + } + if (pointtype(pd) == UNUSEDVERTEX) { + setpointtype(pd, VOLVERTEX); + } + + setpoint2tet(pa, encode(firsttet)); + setpoint2tet(pb, encode(firsttet)); + setpoint2tet(pc, encode(firsttet)); + setpoint2tet(pd, encode(firsttet)); + + // Remember the first tetrahedron. + recenttet = firsttet; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// incrementaldelaunay() Create a Delaunay tetrahedralization by // +// the incremental approach. // +// // +/////////////////////////////////////////////////////////////////////////////// + + +void tetgenmesh::incrementaldelaunay(clock_t& tv) +{ + triface searchtet; + point *permutarray, swapvertex; + REAL v1[3], v2[3], n[3]; + REAL bboxsize, bboxsize2, bboxsize3, ori; + int randindex; + int ngroup = 0; + int i, j; + + if (!b->quiet) { + printf("Delaunizing vertices...\n"); + } + + // Form a random permuation (uniformly at random) of the set of vertices. + permutarray = new point[in->numberofpoints]; + points->traversalinit(); + + if (b->no_sort) { + if (b->verbose) { + printf(" Using the input order.\n"); + } + for (i = 0; i < in->numberofpoints; i++) { + permutarray[i] = (point) points->traverse(); + } + } else { + if (b->verbose) { + printf(" Permuting vertices.\n"); + } + srand(in->numberofpoints); + for (i = 0; i < in->numberofpoints; i++) { + randindex = rand() % (i + 1); // randomnation(i + 1); + permutarray[i] = permutarray[randindex]; + permutarray[randindex] = (point) points->traverse(); + } + if (b->brio_hilbert) { // -b option + if (b->verbose) { + printf(" Sorting vertices.\n"); + } + hilbert_init(in->mesh_dim); + brio_multiscale_sort(permutarray, in->numberofpoints, b->brio_threshold, + b->brio_ratio, &ngroup); + } + } + + tv = clock(); // Remember the time for sorting points. + + // Calculate the diagonal size of its bounding box. + bboxsize = sqrt(norm2(xmax - xmin, ymax - ymin, zmax - zmin)); + bboxsize2 = bboxsize * bboxsize; + bboxsize3 = bboxsize2 * bboxsize; + + // Make sure the second vertex is not identical with the first one. + i = 1; + while ((distance(permutarray[0],permutarray[i])/bboxsize)epsilon) { + i++; + if (i == in->numberofpoints - 1) { + printf("Exception: All vertices are (nearly) identical (Tol = %g).\n", + b->epsilon); + terminatetetgen(this, 10); + } + } + if (i > 1) { + // Swap to move the non-identical vertex from index i to index 1. + swapvertex = permutarray[i]; + permutarray[i] = permutarray[1]; + permutarray[1] = swapvertex; + } + + // Make sure the third vertex is not collinear with the first two. + // Acknowledgement: Thanks Jan Pomplun for his correction by using + // epsilon^2 and epsilon^3 (instead of epsilon). 2013-08-15. + i = 2; + for (j = 0; j < 3; j++) { + v1[j] = permutarray[1][j] - permutarray[0][j]; + v2[j] = permutarray[i][j] - permutarray[0][j]; + } + cross(v1, v2, n); + while ((sqrt(norm2(n[0], n[1], n[2])) / bboxsize2) < b->epsilon) { + i++; + if (i == in->numberofpoints - 1) { + printf("Exception: All vertices are (nearly) collinear (Tol = %g).\n", + b->epsilon); + terminatetetgen(this, 10); + } + for (j = 0; j < 3; j++) { + v2[j] = permutarray[i][j] - permutarray[0][j]; + } + cross(v1, v2, n); + } + if (i > 2) { + // Swap to move the non-identical vertex from index i to index 1. + swapvertex = permutarray[i]; + permutarray[i] = permutarray[2]; + permutarray[2] = swapvertex; + } + + // Make sure the fourth vertex is not coplanar with the first three. + i = 3; + ori = orient3dfast(permutarray[0], permutarray[1], permutarray[2], + permutarray[i]); + while ((fabs(ori) / bboxsize3) < b->epsilon) { + i++; + if (i == in->numberofpoints) { + printf("Exception: All vertices are coplanar (Tol = %g).\n", + b->epsilon); + terminatetetgen(this, 10); + } + ori = orient3dfast(permutarray[0], permutarray[1], permutarray[2], + permutarray[i]); + } + if (i > 3) { + // Swap to move the non-identical vertex from index i to index 1. + swapvertex = permutarray[i]; + permutarray[i] = permutarray[3]; + permutarray[3] = swapvertex; + } + + // Orient the first four vertices in permutarray so that they follow the + // right-hand rule. + if (ori > 0.0) { + // Swap the first two vertices. + swapvertex = permutarray[0]; + permutarray[0] = permutarray[1]; + permutarray[1] = swapvertex; + } + + // Create the initial Delaunay tetrahedralization. + initialdelaunay(permutarray[0], permutarray[1], permutarray[2], + permutarray[3]); + + if (b->verbose) { + printf(" Incrementally inserting vertices.\n"); + } + insertvertexflags ivf; + flipconstraints fc; + + // Choose algorithm: Bowyer-Watson (default) or Incremental Flip + if (b->incrflip) { + ivf.bowywat = 0; + ivf.lawson = 1; + fc.enqflag = 1; + } else { + ivf.bowywat = 1; + ivf.lawson = 0; + } + + + for (i = 4; i < in->numberofpoints; i++) { + if (pointtype(permutarray[i]) == UNUSEDVERTEX) { + setpointtype(permutarray[i], VOLVERTEX); + } + if (b->brio_hilbert || b->no_sort) { // -b or -b/1 + // Start the last updated tet. + searchtet.tet = recenttet.tet; + } else { // -b0 + // Randomly choose the starting tet for point location. + searchtet.tet = NULL; + } + ivf.iloc = (int) OUTSIDE; + // Insert the vertex. + if (insertpoint(permutarray[i], &searchtet, NULL, NULL, &ivf)) { + if (flipstack != NULL) { + // Perform flip to recover Delaunayness. + incrementalflip(permutarray[i], (ivf.iloc == (int) OUTSIDE), &fc); + } + } else { + if (ivf.iloc == (int) ONVERTEX) { + // The point already exists. Mark it and do nothing on it. + swapvertex = org(searchtet); + if (b->object != tetgenbehavior::STL) { + if (!b->quiet) { + printf("Warning: Point #%d is coincident with #%d. Ignored!\n", + pointmark(permutarray[i]), pointmark(swapvertex)); + } + } + setpoint2ppt(permutarray[i], swapvertex); + setpointtype(permutarray[i], DUPLICATEDVERTEX); + dupverts++; + } else if (ivf.iloc == (int) NEARVERTEX) { + swapvertex = org(searchtet); + if (!b->quiet) { + printf("Warning: Point %d is replaced by point %d.\n", + pointmark(permutarray[i]), pointmark(swapvertex)); + printf(" Avoid creating a very short edge (len = %g) (< %g).\n", + permutarray[i][3], minedgelength); + printf(" You may try a smaller tolerance (-T) (current is %g)\n", + b->epsilon); + printf(" or use the option -M0/1 to avoid such replacement.\n"); + } + // Remember it is a duplicated point. + setpoint2ppt(permutarray[i], swapvertex); + setpointtype(permutarray[i], DUPLICATEDVERTEX); + dupverts++; + } else if (ivf.iloc == (int) NONREGULAR) { + // The point is non-regular. Skipped. + if (b->verbose) { + printf(" Point #%d is non-regular, skipped.\n", + pointmark(permutarray[i])); + } + setpointtype(permutarray[i], NREGULARVERTEX); + nonregularcount++; + } + } + } + + + + delete [] permutarray; +} + +//// //// +//// //// +//// delaunay_cxx ///////////////////////////////////////////////////////////// + +//// surface_cxx ////////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// flipshpush() Push a facet edge into flip stack. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::flipshpush(face* flipedge) +{ + badface *newflipface; + + newflipface = (badface *) flippool->alloc(); + newflipface->ss = *flipedge; + newflipface->forg = sorg(*flipedge); + newflipface->fdest = sdest(*flipedge); + newflipface->nextitem = flipstack; + flipstack = newflipface; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// flip22() Perform a 2-to-2 flip in surface mesh. // +// // +// 'flipfaces' is an array of two subfaces. On input, they are [a,b,c] and // +// [b,a,d]. On output, they are [c,d,b] and [d,c,a]. As a result, edge [a,b] // +// is replaced by edge [c,d]. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::flip22(face* flipfaces, int flipflag, int chkencflag) +{ + face bdedges[4], outfaces[4], infaces[4]; + face bdsegs[4]; + face checkface; + point pa, pb, pc, pd; + int i; + + pa = sorg(flipfaces[0]); + pb = sdest(flipfaces[0]); + pc = sapex(flipfaces[0]); + pd = sapex(flipfaces[1]); + + if (sorg(flipfaces[1]) != pb) { + sesymself(flipfaces[1]); + } + + flip22count++; + + // Collect the four boundary edges. + senext(flipfaces[0], bdedges[0]); + senext2(flipfaces[0], bdedges[1]); + senext(flipfaces[1], bdedges[2]); + senext2(flipfaces[1], bdedges[3]); + + // Collect outer boundary faces. + for (i = 0; i < 4; i++) { + spivot(bdedges[i], outfaces[i]); + infaces[i] = outfaces[i]; + sspivot(bdedges[i], bdsegs[i]); + if (outfaces[i].sh != NULL) { + if (isshsubseg(bdedges[i])) { + spivot(infaces[i], checkface); + while (checkface.sh != bdedges[i].sh) { + infaces[i] = checkface; + spivot(infaces[i], checkface); + } + } + } + } + + // The flags set in these two subfaces do not change. + // Shellmark does not change. + // area constraint does not change. + + // Transform [a,b,c] -> [c,d,b]. + setshvertices(flipfaces[0], pc, pd, pb); + // Transform [b,a,d] -> [d,c,a]. + setshvertices(flipfaces[1], pd, pc, pa); + + // Update the point-to-subface map. + if (pointtype(pa) == FREEFACETVERTEX) { + setpoint2sh(pa, sencode(flipfaces[1])); + } + if (pointtype(pb) == FREEFACETVERTEX) { + setpoint2sh(pb, sencode(flipfaces[0])); + } + if (pointtype(pc) == FREEFACETVERTEX) { + setpoint2sh(pc, sencode(flipfaces[0])); + } + if (pointtype(pd) == FREEFACETVERTEX) { + setpoint2sh(pd, sencode(flipfaces[0])); + } + + // Reconnect boundary edges to outer boundary faces. + for (i = 0; i < 4; i++) { + if (outfaces[(3 + i) % 4].sh != NULL) { + // Make sure that the subface has the ori as the segment. + if (bdsegs[(3 + i) % 4].sh != NULL) { + bdsegs[(3 + i) % 4].shver = 0; + if (sorg(bdedges[i]) != sorg(bdsegs[(3 + i) % 4])) { + sesymself(bdedges[i]); + } + } + sbond1(bdedges[i], outfaces[(3 + i) % 4]); + sbond1(infaces[(3 + i) % 4], bdedges[i]); + } else { + sdissolve(bdedges[i]); + } + if (bdsegs[(3 + i) % 4].sh != NULL) { + ssbond(bdedges[i], bdsegs[(3 + i) % 4]); + if (chkencflag & 1) { + // Queue this segment for encroaching check. + enqueuesubface(badsubsegs, &(bdsegs[(3 + i) % 4])); + } + } else { + ssdissolve(bdedges[i]); + } + } + + if (chkencflag & 2) { + // Queue the flipped subfaces for quality/encroaching checks. + for (i = 0; i < 2; i++) { + enqueuesubface(badsubfacs, &(flipfaces[i])); + } + } + + recentsh = flipfaces[0]; + + if (flipflag) { + // Put the boundary edges into flip stack. + for (i = 0; i < 4; i++) { + flipshpush(&(bdedges[i])); + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// flip31() Remove a vertex by transforming 3-to-1 subfaces. // +// // +// 'flipfaces' is an array of subfaces. Its length is at least 4. On input, // +// the first three faces are: [p,a,b], [p,b,c], and [p,c,a]. This routine // +// replaces them by one face [a,b,c], it is returned in flipfaces[3]. // +// // +// NOTE: The three old subfaces are not deleted within this routine. They // +// still hold pointers to their adjacent subfaces. These informations are // +// needed by the routine 'sremovevertex()' for recovering a segment. // +// The caller of this routine must delete the old subfaces after their uses. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::flip31(face* flipfaces, int flipflag) +{ + face bdedges[3], outfaces[3], infaces[3]; + face bdsegs[3]; + face checkface; + point pa, pb, pc; + int i; + + pa = sdest(flipfaces[0]); + pb = sdest(flipfaces[1]); + pc = sdest(flipfaces[2]); + + flip31count++; + + // Collect all infos at the three boundary edges. + for (i = 0; i < 3; i++) { + senext(flipfaces[i], bdedges[i]); + spivot(bdedges[i], outfaces[i]); + infaces[i] = outfaces[i]; + sspivot(bdedges[i], bdsegs[i]); + if (outfaces[i].sh != NULL) { + if (isshsubseg(bdedges[i])) { + spivot(infaces[i], checkface); + while (checkface.sh != bdedges[i].sh) { + infaces[i] = checkface; + spivot(infaces[i], checkface); + } + } + } + } // i + + // Create a new subface. + makeshellface(subfaces, &(flipfaces[3])); + setshvertices(flipfaces[3], pa, pb,pc); + setshellmark(flipfaces[3], shellmark(flipfaces[0])); + if (checkconstraints) { + //area = areabound(flipfaces[0]); + setareabound(flipfaces[3], areabound(flipfaces[0])); + } + if (useinsertradius) { + setfacetindex(flipfaces[3], getfacetindex(flipfaces[0])); + } + + // Update the point-to-subface map. + if (pointtype(pa) == FREEFACETVERTEX) { + setpoint2sh(pa, sencode(flipfaces[3])); + } + if (pointtype(pb) == FREEFACETVERTEX) { + setpoint2sh(pb, sencode(flipfaces[3])); + } + if (pointtype(pc) == FREEFACETVERTEX) { + setpoint2sh(pc, sencode(flipfaces[3])); + } + + // Update the three new boundary edges. + bdedges[0] = flipfaces[3]; // [a,b] + senext(flipfaces[3], bdedges[1]); // [b,c] + senext2(flipfaces[3], bdedges[2]); // [c,a] + + // Reconnect boundary edges to outer boundary faces. + for (i = 0; i < 3; i++) { + if (outfaces[i].sh != NULL) { + // Make sure that the subface has the ori as the segment. + if (bdsegs[i].sh != NULL) { + bdsegs[i].shver = 0; + if (sorg(bdedges[i]) != sorg(bdsegs[i])) { + sesymself(bdedges[i]); + } + } + sbond1(bdedges[i], outfaces[i]); + sbond1(infaces[i], bdedges[i]); + } + if (bdsegs[i].sh != NULL) { + ssbond(bdedges[i], bdsegs[i]); + } + } + + recentsh = flipfaces[3]; + + if (flipflag) { + // Put the boundary edges into flip stack. + for (i = 0; i < 3; i++) { + flipshpush(&(bdedges[i])); + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// lawsonflip() Flip non-locally Delaunay edges. // +// // +/////////////////////////////////////////////////////////////////////////////// + +long tetgenmesh::lawsonflip() +{ + badface *popface; + face flipfaces[2]; + point pa, pb, pc, pd; + REAL sign; + long flipcount = 0; + + if (b->verbose > 2) { + printf(" Lawson flip %ld edges.\n", flippool->items); + } + + while (flipstack != (badface *) NULL) { + + // Pop an edge from the stack. + popface = flipstack; + flipfaces[0] = popface->ss; + pa = popface->forg; + pb = popface->fdest; + flipstack = popface->nextitem; // The next top item in stack. + flippool->dealloc((void *) popface); + + // Skip it if it is dead. + if (flipfaces[0].sh[3] == NULL) continue; + // Skip it if it is not the same edge as we saved. + if ((sorg(flipfaces[0]) != pa) || (sdest(flipfaces[0]) != pb)) continue; + // Skip it if it is a subsegment. + if (isshsubseg(flipfaces[0])) continue; + + // Get the adjacent face. + spivot(flipfaces[0], flipfaces[1]); + if (flipfaces[1].sh == NULL) continue; // Skip a hull edge. + pc = sapex(flipfaces[0]); + pd = sapex(flipfaces[1]); + + sign = incircle3d(pa, pb, pc, pd); + + if (sign < 0) { + // It is non-locally Delaunay. Flip it. + flip22(flipfaces, 1, 0); + flipcount++; + } + } + + if (b->verbose > 2) { + printf(" Performed %ld flips.\n", flipcount); + } + + return flipcount; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// sinsertvertex() Insert a vertex into a triangulation of a facet. // +// // +// This function uses three global arrays: 'caveshlist', 'caveshbdlist', and // +// 'caveshseglist'. On return, 'caveshlist' contains old subfaces in C(p), // +// 'caveshbdlist' contains new subfaces in C(p). If the new point lies on a // +// segment, 'cavesegshlist' returns the two new subsegments. // +// // +// 'iloc' suggests the location of the point. If it is OUTSIDE, this routine // +// will first locate the point. It starts searching from 'searchsh' or 'rec- // +// entsh' if 'searchsh' is NULL. // +// // +// If 'bowywat' is set (1), the Bowyer-Watson algorithm is used to insert // +// the vertex. Otherwise, only insert the vertex in the initial cavity. // +// // +// If 'iloc' is 'INSTAR', this means the cavity of this vertex was already // +// provided in the list 'caveshlist'. // +// // +// If 'splitseg' is not NULL, the new vertex lies on the segment and it will // +// be split. 'iloc' must be either 'ONEDGE' or 'INSTAR'. // +// // +// 'rflag' (rounding) is a parameter passed to slocate() function. If it is // +// set, after the location of the point is found, either ONEDGE or ONFACE, // +// round the result using an epsilon. // +// // +// NOTE: the old subfaces in C(p) are not deleted. They're needed in case we // +// want to remove the new point immediately. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::sinsertvertex(point insertpt, face *searchsh, face *splitseg, + int iloc, int bowywat, int rflag) +{ + face cavesh, neighsh, *parysh; + face newsh, casout, casin; + face checkseg; + point pa, pb; + enum locateresult loc = OUTSIDE; + REAL sign, ori; + int i, j; + + if (b->verbose > 2) { + printf(" Insert facet point %d.\n", pointmark(insertpt)); + } + + if (bowywat == 3) { + loc = INSTAR; + } + + if ((splitseg != NULL) && (splitseg->sh != NULL)) { + // A segment is going to be split, no point location. + spivot(*splitseg, *searchsh); + if (loc != INSTAR) loc = ONEDGE; + } else { + if (loc != INSTAR) loc = (enum locateresult) iloc; + if (loc == OUTSIDE) { + // Do point location in surface mesh. + if (searchsh->sh == NULL) { + *searchsh = recentsh; + } + // Search the vertex. An above point must be provided ('aflag' = 1). + loc = slocate(insertpt, searchsh, 1, 1, rflag); + } + } + + + // Form the initial sC(p). + if (loc == ONFACE) { + // Add the face into list (in B-W cavity). + smarktest(*searchsh); + caveshlist->newindex((void **) &parysh); + *parysh = *searchsh; + } else if (loc == ONEDGE) { + if ((splitseg != NULL) && (splitseg->sh != NULL)) { + splitseg->shver = 0; + pa = sorg(*splitseg); + } else { + pa = sorg(*searchsh); + } + if (searchsh->sh != NULL) { + // Collect all subfaces share at this edge. + neighsh = *searchsh; + while (1) { + // Adjust the origin of its edge to be 'pa'. + if (sorg(neighsh) != pa) sesymself(neighsh); + // Add this face into list (in B-W cavity). + smarktest(neighsh); + caveshlist->newindex((void **) &parysh); + *parysh = neighsh; + // Add this face into face-at-splitedge list. + cavesegshlist->newindex((void **) &parysh); + *parysh = neighsh; + // Go to the next face at the edge. + spivotself(neighsh); + // Stop if all faces at the edge have been visited. + if (neighsh.sh == searchsh->sh) break; + if (neighsh.sh == NULL) break; + } + } // If (not a non-dangling segment). + } else if (loc == ONVERTEX) { + return (int) loc; + } else if (loc == OUTSIDE) { + // Comment: This should only happen during the surface meshing step. + // Enlarge the convex hull of the triangulation by including p. + // An above point of the facet is set in 'dummypoint' to replace + // orient2d tests by orient3d tests. + // Imagine that the current edge a->b (in 'searchsh') is horizontal in a + // plane, and a->b is directed from left to right, p lies above a->b. + // Find the right-most edge of the triangulation which is visible by p. + neighsh = *searchsh; + while (1) { + senext2self(neighsh); + spivot(neighsh, casout); + if (casout.sh == NULL) { + // A convex hull edge. Is it visible by p. + ori = orient3d(sorg(neighsh), sdest(neighsh), dummypoint, insertpt); + if (ori < 0) { + *searchsh = neighsh; // Visible, update 'searchsh'. + } else { + break; // 'searchsh' is the right-most visible edge. + } + } else { + if (sorg(casout) != sdest(neighsh)) sesymself(casout); + neighsh = casout; + } + } + // Create new triangles for all visible edges of p (from right to left). + casin.sh = NULL; // No adjacent face at right. + pa = sorg(*searchsh); + pb = sdest(*searchsh); + while (1) { + // Create a new subface on top of the (visible) edge. + makeshellface(subfaces, &newsh); + setshvertices(newsh, pb, pa, insertpt); + setshellmark(newsh, shellmark(*searchsh)); + if (checkconstraints) { + //area = areabound(*searchsh); + setareabound(newsh, areabound(*searchsh)); + } + if (useinsertradius) { + setfacetindex(newsh, getfacetindex(*searchsh)); + } + // Connect the new subface to the bottom subfaces. + sbond1(newsh, *searchsh); + sbond1(*searchsh, newsh); + // Connect the new subface to its right-adjacent subface. + if (casin.sh != NULL) { + senext(newsh, casout); + sbond1(casout, casin); + sbond1(casin, casout); + } + // The left-adjacent subface has not been created yet. + senext2(newsh, casin); + // Add the new face into list (inside the B-W cavity). + smarktest(newsh); + caveshlist->newindex((void **) &parysh); + *parysh = newsh; + // Move to the convex hull edge at the left of 'searchsh'. + neighsh = *searchsh; + while (1) { + senextself(neighsh); + spivot(neighsh, casout); + if (casout.sh == NULL) { + *searchsh = neighsh; + break; + } + if (sorg(casout) != sdest(neighsh)) sesymself(casout); + neighsh = casout; + } + // A convex hull edge. Is it visible by p. + pa = sorg(*searchsh); + pb = sdest(*searchsh); + ori = orient3d(pa, pb, dummypoint, insertpt); + // Finish the process if p is not visible by the hull edge. + if (ori >= 0) break; + } + } else if (loc == INSTAR) { + // Under this case, the sub-cavity sC(p) has already been formed in + // insertvertex(). + } + + // Form the Bowyer-Watson cavity sC(p). + for (i = 0; i < caveshlist->objects; i++) { + cavesh = * (face *) fastlookup(caveshlist, i); + for (j = 0; j < 3; j++) { + if (!isshsubseg(cavesh)) { + spivot(cavesh, neighsh); + if (neighsh.sh != NULL) { + // The adjacent face exists. + if (!smarktested(neighsh)) { + if (bowywat) { + if (loc == INSTAR) { // if (bowywat > 2) { + // It must be a boundary edge. + sign = 1; + } else { + // Check if this subface is connected to adjacent tet(s). + if (!isshtet(neighsh)) { + // Check if the subface is non-Delaunay wrt. the new pt. + sign = incircle3d(sorg(neighsh), sdest(neighsh), + sapex(neighsh), insertpt); + } else { + // It is connected to an adjacent tet. A boundary edge. + sign = 1; + } + } + if (sign < 0) { + // Add the adjacent face in list (in B-W cavity). + smarktest(neighsh); + caveshlist->newindex((void **) &parysh); + *parysh = neighsh; + } + } else { + sign = 1; // A boundary edge. + } + } else { + sign = -1; // Not a boundary edge. + } + } else { + // No adjacent face. It is a hull edge. + if (loc == OUTSIDE) { + // It is a boundary edge if it does not contain p. + if ((sorg(cavesh) == insertpt) || (sdest(cavesh) == insertpt)) { + sign = -1; // Not a boundary edge. + } else { + sign = 1; // A boundary edge. + } + } else { + sign = 1; // A boundary edge. + } + } + } else { + // Do not across a segment. It is a boundary edge. + sign = 1; + } + if (sign >= 0) { + // Add a boundary edge. + caveshbdlist->newindex((void **) &parysh); + *parysh = cavesh; + } + senextself(cavesh); + } // j + } // i + + + // Creating new subfaces. + for (i = 0; i < caveshbdlist->objects; i++) { + parysh = (face *) fastlookup(caveshbdlist, i); + sspivot(*parysh, checkseg); + if ((parysh->shver & 01) != 0) sesymself(*parysh); + pa = sorg(*parysh); + pb = sdest(*parysh); + // Create a new subface. + makeshellface(subfaces, &newsh); + setshvertices(newsh, pa, pb, insertpt); + setshellmark(newsh, shellmark(*parysh)); + if (checkconstraints) { + //area = areabound(*parysh); + setareabound(newsh, areabound(*parysh)); + } + if (useinsertradius) { + setfacetindex(newsh, getfacetindex(*parysh)); + } + // Update the point-to-subface map. + if (pointtype(pa) == FREEFACETVERTEX) { + setpoint2sh(pa, sencode(newsh)); + } + if (pointtype(pb) == FREEFACETVERTEX) { + setpoint2sh(pb, sencode(newsh)); + } + // Connect newsh to outer subfaces. + spivot(*parysh, casout); + if (casout.sh != NULL) { + casin = casout; + if (checkseg.sh != NULL) { + // Make sure that newsh has the right ori at this segment. + checkseg.shver = 0; + if (sorg(newsh) != sorg(checkseg)) { + sesymself(newsh); + sesymself(*parysh); // This side should also be inverse. + } + spivot(casin, neighsh); + while (neighsh.sh != parysh->sh) { + casin = neighsh; + spivot(casin, neighsh); + } + } + sbond1(newsh, casout); + sbond1(casin, newsh); + } + if (checkseg.sh != NULL) { + ssbond(newsh, checkseg); + } + // Connect oldsh <== newsh (for connecting adjacent new subfaces). + // *parysh and newsh point to the same edge and the same ori. + sbond1(*parysh, newsh); + } + + if (newsh.sh != NULL) { + // Set a handle for searching. + recentsh = newsh; + } + + // Update the point-to-subface map. + if (pointtype(insertpt) == FREEFACETVERTEX) { + setpoint2sh(insertpt, sencode(newsh)); + } + + // Connect adjacent new subfaces together. + for (i = 0; i < caveshbdlist->objects; i++) { + // Get an old subface at edge [a, b]. + parysh = (face *) fastlookup(caveshbdlist, i); + spivot(*parysh, newsh); // The new subface [a, b, p]. + senextself(newsh); // At edge [b, p]. + spivot(newsh, neighsh); + if (neighsh.sh == NULL) { + // Find the adjacent new subface at edge [b, p]. + pb = sdest(*parysh); + neighsh = *parysh; + while (1) { + senextself(neighsh); + spivotself(neighsh); + if (neighsh.sh == NULL) break; + if (!smarktested(neighsh)) break; + if (sdest(neighsh) != pb) sesymself(neighsh); + } + if (neighsh.sh != NULL) { + // Now 'neighsh' is a new subface at edge [b, #]. + if (sorg(neighsh) != pb) sesymself(neighsh); + senext2self(neighsh); // Go to the open edge [p, b]. + sbond(newsh, neighsh); + } + } + spivot(*parysh, newsh); // The new subface [a, b, p]. + senext2self(newsh); // At edge [p, a]. + spivot(newsh, neighsh); + if (neighsh.sh == NULL) { + // Find the adjacent new subface at edge [p, a]. + pa = sorg(*parysh); + neighsh = *parysh; + while (1) { + senext2self(neighsh); + spivotself(neighsh); + if (neighsh.sh == NULL) break; + if (!smarktested(neighsh)) break; + if (sorg(neighsh) != pa) sesymself(neighsh); + } + if (neighsh.sh != NULL) { + // Now 'neighsh' is a new subface at edge [#, a]. + if (sdest(neighsh) != pa) sesymself(neighsh); + senextself(neighsh); // Go to the open edge [a, p]. + sbond(newsh, neighsh); + } + } + } + + if ((loc == ONEDGE) || ((splitseg != NULL) && (splitseg->sh != NULL)) + || (cavesegshlist->objects > 0l)) { + // An edge is being split. We distinguish two cases: + // (1) the edge is not on the boundary of the cavity; + // (2) the edge is on the boundary of the cavity. + // In case (2), the edge is either a segment or a hull edge. There are + // degenerated new faces in the cavity. They must be removed. + face aseg, bseg, aoutseg, boutseg; + + for (i = 0; i < cavesegshlist->objects; i++) { + // Get the saved old subface. + parysh = (face *) fastlookup(cavesegshlist, i); + // Get a possible new degenerated subface. + spivot(*parysh, cavesh); + if (sapex(cavesh) == insertpt) { + // Found a degenerated new subface, i.e., case (2). + if (cavesegshlist->objects > 1) { + // There are more than one subface share at this edge. + j = (i + 1) % (int) cavesegshlist->objects; + parysh = (face *) fastlookup(cavesegshlist, j); + spivot(*parysh, neighsh); + // Adjust cavesh and neighsh both at edge a->b, and has p as apex. + if (sorg(neighsh) != sorg(cavesh)) { + sesymself(neighsh); + } + // Connect adjacent faces at two other edges of cavesh and neighsh. + // As a result, the two degenerated new faces are squeezed from the + // new triangulation of the cavity. Note that the squeezed faces + // still hold the adjacent informations which will be used in + // re-connecting subsegments (if they exist). + for (j = 0; j < 2; j++) { + senextself(cavesh); + senextself(neighsh); + spivot(cavesh, newsh); + spivot(neighsh, casout); + sbond1(newsh, casout); // newsh <- casout. + } + } else { + // There is only one subface containing this edge [a,b]. Squeeze the + // degenerated new face [a,b,c] by disconnecting it from its two + // adjacent subfaces at edges [b,c] and [c,a]. Note that the face + // [a,b,c] still hold the connection to them. + for (j = 0; j < 2; j++) { + senextself(cavesh); + spivot(cavesh, newsh); + sdissolve(newsh); + } + } + //recentsh = newsh; + // Update the point-to-subface map. + if (pointtype(insertpt) == FREEFACETVERTEX) { + setpoint2sh(insertpt, sencode(newsh)); + } + } + } + + if ((splitseg != NULL) && (splitseg->sh != NULL)) { + if (loc != INSTAR) { // if (bowywat < 3) { + smarktest(*splitseg); // Mark it as being processed. + } + + aseg = *splitseg; + pa = sorg(*splitseg); + pb = sdest(*splitseg); + + // Insert the new point p. + makeshellface(subsegs, &aseg); + makeshellface(subsegs, &bseg); + + setshvertices(aseg, pa, insertpt, NULL); + setshvertices(bseg, insertpt, pb, NULL); + setshellmark(aseg, shellmark(*splitseg)); + setshellmark(bseg, shellmark(*splitseg)); + if (checkconstraints) { + setareabound(aseg, areabound(*splitseg)); + setareabound(bseg, areabound(*splitseg)); + } + if (useinsertradius) { + setfacetindex(aseg, getfacetindex(*splitseg)); + setfacetindex(bseg, getfacetindex(*splitseg)); + } + + // Connect [#, a]<->[a, p]. + senext2(*splitseg, boutseg); // Temporarily use boutseg. + spivotself(boutseg); + if (boutseg.sh != NULL) { + senext2(aseg, aoutseg); + sbond(boutseg, aoutseg); + } + // Connect [p, b]<->[b, #]. + senext(*splitseg, aoutseg); + spivotself(aoutseg); + if (aoutseg.sh != NULL) { + senext(bseg, boutseg); + sbond(boutseg, aoutseg); + } + // Connect [a, p] <-> [p, b]. + senext(aseg, aoutseg); + senext2(bseg, boutseg); + sbond(aoutseg, boutseg); + + // Connect subsegs [a, p] and [p, b] to adjacent new subfaces. + // Although the degenerated new faces have been squeezed. They still + // hold the connections to the actual new faces. + for (i = 0; i < cavesegshlist->objects; i++) { + parysh = (face *) fastlookup(cavesegshlist, i); + spivot(*parysh, neighsh); + // neighsh is a degenerated new face. + if (sorg(neighsh) != pa) { + sesymself(neighsh); + } + senext2(neighsh, newsh); + spivotself(newsh); // The edge [p, a] in newsh + ssbond(newsh, aseg); + senext(neighsh, newsh); + spivotself(newsh); // The edge [b, p] in newsh + ssbond(newsh, bseg); + } + + + // Let the point remember the segment it lies on. + if (pointtype(insertpt) == FREESEGVERTEX) { + setpoint2sh(insertpt, sencode(aseg)); + } + // Update the point-to-seg map. + if (pointtype(pa) == FREESEGVERTEX) { + setpoint2sh(pa, sencode(aseg)); + } + if (pointtype(pb) == FREESEGVERTEX) { + setpoint2sh(pb, sencode(bseg)); + } + } // if ((splitseg != NULL) && (splitseg->sh != NULL)) + + // Delete all degenerated new faces. + for (i = 0; i < cavesegshlist->objects; i++) { + parysh = (face *) fastlookup(cavesegshlist, i); + spivotself(*parysh); + if (sapex(*parysh) == insertpt) { + shellfacedealloc(subfaces, parysh->sh); + } + } + cavesegshlist->restart(); + + if ((splitseg != NULL) && (splitseg->sh != NULL)) { + // Return the two new subsegments (for further process). + // Re-use 'cavesegshlist'. + cavesegshlist->newindex((void **) &parysh); + *parysh = aseg; + cavesegshlist->newindex((void **) &parysh); + *parysh = bseg; + } + } // if (loc == ONEDGE) + + + return (int) loc; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// sremovevertex() Remove a vertex from the surface mesh. // +// // +// 'delpt' (p) is the vertex to be removed. If 'parentseg' is not NULL, p is // +// a segment vertex, and the origin of 'parentseg' is p. Otherwise, p is a // +// facet vertex, and the origin of 'parentsh' is p. // +// // +// Within each facet, we first use a sequence of 2-to-2 flips to flip any // +// edge at p, finally use a 3-to-1 flip to remove p. // +// // +// All new created subfaces are returned in the global array 'caveshbdlist'. // +// The new segment (when p is on segment) is returned in 'parentseg'. // +// // +// If 'lawson' > 0, the Lawson flip algorithm is used to recover Delaunay- // +// ness after p is removed. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::sremovevertex(point delpt, face* parentsh, face* parentseg, + int lawson) +{ + face flipfaces[4], spinsh, *parysh; + point pa, pb, pc, pd; + REAL ori1, ori2; + int it, i, j; + + if (parentseg != NULL) { + // 'delpt' (p) should be a Steiner point inserted in a segment [a,b], + // where 'parentseg' should be [p,b]. Find the segment [a,p]. + face startsh, neighsh, nextsh; + face abseg, prevseg, checkseg; + face adjseg1, adjseg2; + face fakesh; + senext2(*parentseg, prevseg); + spivotself(prevseg); + prevseg.shver = 0; + // Restore the original segment [a,b]. + pa = sorg(prevseg); + pb = sdest(*parentseg); + if (b->verbose > 2) { + printf(" Remove vertex %d from segment [%d, %d].\n", + pointmark(delpt), pointmark(pa), pointmark(pb)); + } + makeshellface(subsegs, &abseg); + setshvertices(abseg, pa, pb, NULL); + setshellmark(abseg, shellmark(*parentseg)); + if (checkconstraints) { + setareabound(abseg, areabound(*parentseg)); + } + if (useinsertradius) { + setfacetindex(abseg, getfacetindex(*parentseg)); + } + // Connect [#, a]<->[a, b]. + senext2(prevseg, adjseg1); + spivotself(adjseg1); + if (adjseg1.sh != NULL) { + adjseg1.shver = 0; + senextself(adjseg1); + senext2(abseg, adjseg2); + sbond(adjseg1, adjseg2); + } + // Connect [a, b]<->[b, #]. + senext(*parentseg, adjseg1); + spivotself(adjseg1); + if (adjseg1.sh != NULL) { + adjseg1.shver = 0; + senext2self(adjseg1); + senext(abseg, adjseg2); + sbond(adjseg1, adjseg2); + } + // Update the point-to-segment map. + setpoint2sh(pa, sencode(abseg)); + setpoint2sh(pb, sencode(abseg)); + + // Get the faces in face ring at segment [p, b]. + // Re-use array 'caveshlist'. + spivot(*parentseg, *parentsh); + if (parentsh->sh != NULL) { + spinsh = *parentsh; + while (1) { + // Save this face in list. + caveshlist->newindex((void **) &parysh); + *parysh = spinsh; + // Go to the next face in the ring. + spivotself(spinsh); + if (spinsh.sh == NULL) { + break; // It is possible there is only one facet. + } + if (spinsh.sh == parentsh->sh) break; + } + } + + // Create the face ring of the new segment [a,b]. Each face in the ring + // is [a,b,p] (degenerated!). It will be removed (automatically). + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + startsh = *parysh; + if (sorg(startsh) != delpt) { + sesymself(startsh); + } + // startsh is [p, b, #1], find the subface [a, p, #2]. + neighsh = startsh; + while (1) { + senext2self(neighsh); + sspivot(neighsh, checkseg); + if (checkseg.sh != NULL) { + // It must be the segment [a, p]. + break; + } + spivotself(neighsh); + if (sorg(neighsh) != delpt) sesymself(neighsh); + } + // Now neighsh is [a, p, #2]. + if (neighsh.sh != startsh.sh) { + // Detach the two subsegments [a,p] and [p,b] from subfaces. + ssdissolve(startsh); + ssdissolve(neighsh); + // Create a degenerated subface [a,b,p]. It is used to: (1) hold the + // new segment [a,b]; (2) connect to the two adjacent subfaces + // [p,b,#] and [a,p,#]. + makeshellface(subfaces, &fakesh); + setshvertices(fakesh, pa, pb, delpt); + setshellmark(fakesh, shellmark(startsh)); + // Connect fakesh to the segment [a,b]. + ssbond(fakesh, abseg); + // Connect fakesh to adjacent subfaces: [p,b,#1] and [a,p,#2]. + senext(fakesh, nextsh); + sbond(nextsh, startsh); + senext2(fakesh, nextsh); + sbond(nextsh, neighsh); + smarktest(fakesh); // Mark it as faked. + } else { + // Special case. There exists already a degenerated face [a,b,p]! + // There is no need to create a faked subface here. + senext2self(neighsh); // [a,b,p] + // Since we will re-connect the face ring using the faked subfaces. + // We put the adjacent face of [a,b,p] to the list. + spivot(neighsh, startsh); // The original adjacent subface. + if (sorg(startsh) != pa) sesymself(startsh); + sdissolve(startsh); + // Connect fakesh to the segment [a,b]. + ssbond(startsh, abseg); + fakesh = startsh; // Do not mark it! + // Delete the degenerated subface. + shellfacedealloc(subfaces, neighsh.sh); + } + // Save the fakesh in list (for re-creating the face ring). + cavesegshlist->newindex((void **) &parysh); + *parysh = fakesh; + } // i + caveshlist->restart(); + + // Re-create the face ring. + if (cavesegshlist->objects > 1) { + for (i = 0; i < cavesegshlist->objects; i++) { + parysh = (face *) fastlookup(cavesegshlist, i); + fakesh = *parysh; + // Get the next face in the ring. + j = (i + 1) % cavesegshlist->objects; + parysh = (face *) fastlookup(cavesegshlist, j); + nextsh = *parysh; + sbond1(fakesh, nextsh); + } + } + + // Delete the two subsegments containing p. + shellfacedealloc(subsegs, parentseg->sh); + shellfacedealloc(subsegs, prevseg.sh); + // Return the new segment. + *parentseg = abseg; + } else { + // p is inside the surface. + if (b->verbose > 2) { + printf(" Remove vertex %d from surface.\n", pointmark(delpt)); + } + // Let 'delpt' be its apex. + senextself(*parentsh); + // For unifying the code, we add parentsh to list. + cavesegshlist->newindex((void **) &parysh); + *parysh = *parentsh; + } + + // Remove the point (p). + + for (it = 0; it < cavesegshlist->objects; it++) { + parentsh = (face *) fastlookup(cavesegshlist, it); // [a,b,p] + senextself(*parentsh); // [b,p,a]. + spivotself(*parentsh); + if (sorg(*parentsh) != delpt) sesymself(*parentsh); + // now parentsh is [p,b,#]. + if (sorg(*parentsh) != delpt) { + // The vertex has already been removed in above special case. + continue; + } + + while (1) { + // Initialize the flip edge list. Re-use 'caveshlist'. + spinsh = *parentsh; // [p, b, #] + while (1) { + caveshlist->newindex((void **) &parysh); + *parysh = spinsh; + senext2self(spinsh); + spivotself(spinsh); + if (spinsh.sh == parentsh->sh) break; + if (sorg(spinsh) != delpt) sesymself(spinsh); + } // while (1) + + if (caveshlist->objects == 3) { + // Delete the point by a 3-to-1 flip. + for (i = 0; i < 3; i++) { + parysh = (face *) fastlookup(caveshlist, i); + flipfaces[i] = *parysh; + } + flip31(flipfaces, lawson); + for (i = 0; i < 3; i++) { + shellfacedealloc(subfaces, flipfaces[i].sh); + } + caveshlist->restart(); + // Save the new subface. + caveshbdlist->newindex((void **) &parysh); + *parysh = flipfaces[3]; + // The vertex is removed. + break; + } + + // Search an edge to flip. + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + flipfaces[0] = *parysh; + spivot(flipfaces[0], flipfaces[1]); + if (sorg(flipfaces[0]) != sdest(flipfaces[1])) + sesymself(flipfaces[1]); + // Skip this edge if it belongs to a faked subface. + if (!smarktested(flipfaces[0]) && !smarktested(flipfaces[1])) { + pa = sorg(flipfaces[0]); + pb = sdest(flipfaces[0]); + pc = sapex(flipfaces[0]); + pd = sapex(flipfaces[1]); + calculateabovepoint4(pa, pb, pc, pd); + // Check if a 2-to-2 flip is possible. + ori1 = orient3d(pc, pd, dummypoint, pa); + ori2 = orient3d(pc, pd, dummypoint, pb); + if (ori1 * ori2 < 0) { + // A 2-to-2 flip is found. + flip22(flipfaces, lawson, 0); + // The i-th edge is flipped. The i-th and (i-1)-th subfaces are + // changed. The 'flipfaces[1]' contains p as its apex. + senext2(flipfaces[1], *parentsh); + // Save the new subface. + caveshbdlist->newindex((void **) &parysh); + *parysh = flipfaces[0]; + break; + } + } // + } // i + + if (i == caveshlist->objects) { + // Do a flip22 and a flip31 to remove p. + parysh = (face *) fastlookup(caveshlist, 0); + flipfaces[0] = *parysh; + spivot(flipfaces[0], flipfaces[1]); + if (sorg(flipfaces[0]) != sdest(flipfaces[1])) { + sesymself(flipfaces[1]); + } + flip22(flipfaces, lawson, 0); + senext2(flipfaces[1], *parentsh); + // Save the new subface. + caveshbdlist->newindex((void **) &parysh); + *parysh = flipfaces[0]; + } + + // The edge list at p are changed. + caveshlist->restart(); + } // while (1) + + } // it + + cavesegshlist->restart(); + + if (b->verbose > 2) { + printf(" Created %ld new subfaces.\n", caveshbdlist->objects); + } + + + if (lawson) { + lawsonflip(); + } + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// slocate() Locate a point in a surface triangulation. // +// // +// Staring the search from 'searchsh'(it should not be NULL). Perform a line // +// walk search for a subface containing the point (p). // +// // +// If 'aflag' is set, the 'dummypoint' is pre-calculated so that it lies // +// above the 'searchsh' in its current orientation. The test if c is CCW to // +// the line a->b can be done by the test if c is below the oriented plane // +// a->b->dummypoint. // +// // +// If 'cflag' is not TRUE, the triangulation may not be convex. Stop search // +// when a segment is met and return OUTSIDE. // +// // +// If 'rflag' (rounding) is set, after the location of the point is found, // +// either ONEDGE or ONFACE, round the result using an epsilon. // +// // +// The returned value indicates the following cases: // +// - ONVERTEX, p is the origin of 'searchsh'. // +// - ONEDGE, p lies on the edge of 'searchsh'. // +// - ONFACE, p lies in the interior of 'searchsh'. // +// - OUTSIDE, p lies outside of the triangulation, p is on the left-hand // +// side of the edge 'searchsh'(s), i.e., org(s), dest(s), p are CW. // +// // +/////////////////////////////////////////////////////////////////////////////// + +enum tetgenmesh::locateresult tetgenmesh::slocate(point searchpt, + face* searchsh, int aflag, int cflag, int rflag) +{ + face neighsh; + point pa, pb, pc; + enum locateresult loc; + enum {MOVE_BC, MOVE_CA} nextmove; + REAL ori, ori_bc, ori_ca; + int i; + + pa = sorg(*searchsh); + pb = sdest(*searchsh); + pc = sapex(*searchsh); + + if (!aflag) { + // No above point is given. Calculate an above point for this facet. + calculateabovepoint4(pa, pb, pc, searchpt); + } + + // 'dummypoint' is given. Make sure it is above [a,b,c] + ori = orient3d(pa, pb, pc, dummypoint); + if (ori > 0) { + sesymself(*searchsh); // Reverse the face orientation. + } else if (ori == 0.0) { + // This case should not happen theoretically. But... + return UNKNOWN; + } + + // Find an edge of the face s.t. p lies on its right-hand side (CCW). + for (i = 0; i < 3; i++) { + pa = sorg(*searchsh); + pb = sdest(*searchsh); + ori = orient3d(pa, pb, dummypoint, searchpt); + if (ori > 0) break; + senextself(*searchsh); + } + if (i == 3) { + return UNKNOWN; + } + + pc = sapex(*searchsh); + + if (pc == searchpt) { + senext2self(*searchsh); + return ONVERTEX; + } + + while (1) { + + ori_bc = orient3d(pb, pc, dummypoint, searchpt); + ori_ca = orient3d(pc, pa, dummypoint, searchpt); + + if (ori_bc < 0) { + if (ori_ca < 0) { // (--) + // Any of the edges is a viable move. + if (randomnation(2)) { + nextmove = MOVE_CA; + } else { + nextmove = MOVE_BC; + } + } else { // (-#) + // Edge [b, c] is viable. + nextmove = MOVE_BC; + } + } else { + if (ori_ca < 0) { // (#-) + // Edge [c, a] is viable. + nextmove = MOVE_CA; + } else { + if (ori_bc > 0) { + if (ori_ca > 0) { // (++) + loc = ONFACE; // Inside [a, b, c]. + break; + } else { // (+0) + senext2self(*searchsh); // On edge [c, a]. + loc = ONEDGE; + break; + } + } else { // ori_bc == 0 + if (ori_ca > 0) { // (0+) + senextself(*searchsh); // On edge [b, c]. + loc = ONEDGE; + break; + } else { // (00) + // p is coincident with vertex c. + senext2self(*searchsh); + return ONVERTEX; + } + } + } + } + + // Move to the next face. + if (nextmove == MOVE_BC) { + senextself(*searchsh); + } else { + senext2self(*searchsh); + } + if (!cflag) { + // NON-convex case. Check if we will cross a boundary. + if (isshsubseg(*searchsh)) { + return ENCSEGMENT; + } + } + spivot(*searchsh, neighsh); + if (neighsh.sh == NULL) { + return OUTSIDE; // A hull edge. + } + // Adjust the edge orientation. + if (sorg(neighsh) != sdest(*searchsh)) { + sesymself(neighsh); + } + + // Update the newly discovered face and its endpoints. + *searchsh = neighsh; + pa = sorg(*searchsh); + pb = sdest(*searchsh); + pc = sapex(*searchsh); + + if (pc == searchpt) { + senext2self(*searchsh); + return ONVERTEX; + } + + } // while (1) + + // assert(loc == ONFACE || loc == ONEDGE); + + + if (rflag) { + // Round the locate result before return. + REAL n[3], area_abc, area_abp, area_bcp, area_cap; + + pa = sorg(*searchsh); + pb = sdest(*searchsh); + pc = sapex(*searchsh); + + facenormal(pa, pb, pc, n, 1, NULL); + area_abc = sqrt(dot(n, n)); + + facenormal(pb, pc, searchpt, n, 1, NULL); + area_bcp = sqrt(dot(n, n)); + if ((area_bcp / area_abc) < b->epsilon) { + area_bcp = 0; // Rounding. + } + + facenormal(pc, pa, searchpt, n, 1, NULL); + area_cap = sqrt(dot(n, n)); + if ((area_cap / area_abc) < b->epsilon) { + area_cap = 0; // Rounding + } + + if ((loc == ONFACE) || (loc == OUTSIDE)) { + facenormal(pa, pb, searchpt, n, 1, NULL); + area_abp = sqrt(dot(n, n)); + if ((area_abp / area_abc) < b->epsilon) { + area_abp = 0; // Rounding + } + } else { // loc == ONEDGE + area_abp = 0; + } + + if (area_abp == 0) { + if (area_bcp == 0) { + senextself(*searchsh); + loc = ONVERTEX; // p is close to b. + } else { + if (area_cap == 0) { + loc = ONVERTEX; // p is close to a. + } else { + loc = ONEDGE; // p is on edge [a,b]. + } + } + } else if (area_bcp == 0) { + if (area_cap == 0) { + senext2self(*searchsh); + loc = ONVERTEX; // p is close to c. + } else { + senextself(*searchsh); + loc = ONEDGE; // p is on edge [b,c]. + } + } else if (area_cap == 0) { + senext2self(*searchsh); + loc = ONEDGE; // p is on edge [c,a]. + } else { + loc = ONFACE; // p is on face [a,b,c]. + } + } // if (rflag) + + return loc; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// sscoutsegment() Look for a segment in the surface triangulation. // +// // +// The segment is given by the origin of 'searchsh' and 'endpt'. // +// // +// If an edge in T is found matching this segment, the segment is "locked" // +// in T at the edge. Otherwise, flip the first edge in T that the segment // +// crosses. Continue the search from the flipped face. // +// // +// This routine uses 'orisent3d' to determine the search direction. It uses // +// 'dummypoint' as the 'lifted point' in 3d, and it assumes that it (dummy- // +// point) lies above the 'searchsh' (w.r.t the Right-hand rule). // +// // +/////////////////////////////////////////////////////////////////////////////// + +enum tetgenmesh::interresult tetgenmesh::sscoutsegment(face *searchsh, + point endpt, int insertsegflag, int reporterrorflag, int chkencflag) +{ + face flipshs[2], neighsh; + point startpt, pa, pb, pc, pd; + enum interresult dir; + enum {MOVE_AB, MOVE_CA} nextmove; + REAL ori_ab, ori_ca, len; + + pc = NULL; // Avoid warnings from MSVC + // The origin of 'searchsh' is fixed. + startpt = sorg(*searchsh); + nextmove = MOVE_AB; // Avoid compiler warning. + + if (b->verbose > 2) { + printf(" Scout segment (%d, %d).\n", pointmark(startpt), + pointmark(endpt)); + } + len = distance(startpt, endpt); + + // Search an edge in 'searchsh' on the path of this segment. + while (1) { + + pb = sdest(*searchsh); + if (pb == endpt) { + dir = SHAREEDGE; // Found! + break; + } + + pc = sapex(*searchsh); + if (pc == endpt) { + senext2self(*searchsh); + sesymself(*searchsh); + dir = SHAREEDGE; // Found! + break; + } + + + // Round the results. + if ((sqrt(triarea(startpt, pb, endpt)) / len) < b->epsilon) { + ori_ab = 0.0; + } else { + ori_ab = orient3d(startpt, pb, dummypoint, endpt); + } + if ((sqrt(triarea(pc, startpt, endpt)) / len) < b->epsilon) { + ori_ca = 0.0; + } else { + ori_ca = orient3d(pc, startpt, dummypoint, endpt); + } + + if (ori_ab < 0) { + if (ori_ca < 0) { // (--) + // Both sides are viable moves. + if (randomnation(2)) { + nextmove = MOVE_CA; + } else { + nextmove = MOVE_AB; + } + } else { // (-#) + nextmove = MOVE_AB; + } + } else { + if (ori_ca < 0) { // (#-) + nextmove = MOVE_CA; + } else { + if (ori_ab > 0) { + if (ori_ca > 0) { // (++) + // The segment intersects with edge [b, c]. + dir = ACROSSEDGE; + break; + } else { // (+0) + // The segment collinear with edge [c, a]. + senext2self(*searchsh); + sesymself(*searchsh); + dir = ACROSSVERT; + break; + } + } else { + if (ori_ca > 0) { // (0+) + // The segment is collinear with edge [a, b]. + dir = ACROSSVERT; + break; + } else { // (00) + // startpt == endpt. Not possible. + terminatetetgen(this, 2); + } + } + } + } + + // Move 'searchsh' to the next face, keep the origin unchanged. + if (nextmove == MOVE_AB) { + if (chkencflag) { + // Do not cross boundary. + if (isshsubseg(*searchsh)) { + return ACROSSEDGE; // ACROSS_SEG + } + } + spivot(*searchsh, neighsh); + if (neighsh.sh != NULL) { + if (sorg(neighsh) != pb) sesymself(neighsh); + senext(neighsh, *searchsh); + } else { + // This side (startpt->pb) is outside. It is caused by rounding error. + // Try the next side, i.e., (pc->startpt). + senext2(*searchsh, neighsh); + if (chkencflag) { + // Do not cross boundary. + if (isshsubseg(neighsh)) { + *searchsh = neighsh; + return ACROSSEDGE; // ACROSS_SEG + } + } + spivotself(neighsh); + if (sdest(neighsh) != pc) sesymself(neighsh); + *searchsh = neighsh; + } + } else { // MOVE_CA + senext2(*searchsh, neighsh); + if (chkencflag) { + // Do not cross boundary. + if (isshsubseg(neighsh)) { + *searchsh = neighsh; + return ACROSSEDGE; // ACROSS_SEG + } + } + spivotself(neighsh); + if (neighsh.sh != NULL) { + if (sdest(neighsh) != pc) sesymself(neighsh); + *searchsh = neighsh; + } else { + // The same reason as above. + // Try the next side, i.e., (startpt->pb). + if (chkencflag) { + // Do not cross boundary. + if (isshsubseg(*searchsh)) { + return ACROSSEDGE; // ACROSS_SEG + } + } + spivot(*searchsh, neighsh); + if (sorg(neighsh) != pb) sesymself(neighsh); + senext(neighsh, *searchsh); + } + } + } // while + + if (dir == SHAREEDGE) { + if (insertsegflag) { + // Insert the segment into the triangulation. + face newseg; + makeshellface(subsegs, &newseg); + setshvertices(newseg, startpt, endpt, NULL); + // Set the default segment marker. + setshellmark(newseg, -1); + ssbond(*searchsh, newseg); + spivot(*searchsh, neighsh); + if (neighsh.sh != NULL) { + ssbond(neighsh, newseg); + } + } + return dir; + } + + if (dir == ACROSSVERT) { + // A point is found collinear with this segment. + if (reporterrorflag) { + point pp = sdest(*searchsh); + printf("PLC Error: A vertex lies in a segment in facet #%d.\n", + shellmark(*searchsh)); + printf(" Vertex: [%d] (%g,%g,%g).\n",pointmark(pp),pp[0],pp[1],pp[2]); + printf(" Segment: [%d, %d]\n", pointmark(startpt), pointmark(endpt)); + } + return dir; + } + + if (dir == ACROSSEDGE) { + // Edge [b, c] intersects with the segment. + senext(*searchsh, flipshs[0]); + if (isshsubseg(flipshs[0])) { + if (reporterrorflag) { + REAL P[3], Q[3], tp = 0, tq = 0; + linelineint(startpt, endpt, pb, pc, P, Q, &tp, &tq); + printf("PLC Error: Two segments intersect at point (%g,%g,%g),", + P[0], P[1], P[2]); + printf(" in facet #%d.\n", shellmark(*searchsh)); + printf(" Segment 1: [%d, %d]\n", pointmark(pb), pointmark(pc)); + printf(" Segment 2: [%d, %d]\n", pointmark(startpt),pointmark(endpt)); + } + return dir; // ACROSS_SEG + } + // Flip edge [b, c], queue unflipped edges (for Delaunay checks). + spivot(flipshs[0], flipshs[1]); + if (sorg(flipshs[1]) != sdest(flipshs[0])) sesymself(flipshs[1]); + flip22(flipshs, 1, 0); + // The flip may create an inverted triangle, check it. + pa = sapex(flipshs[1]); + pb = sapex(flipshs[0]); + pc = sorg(flipshs[0]); + pd = sdest(flipshs[0]); + // Check if pa and pb are on the different sides of [pc, pd]. + // Re-use ori_ab, ori_ca for the tests. + ori_ab = orient3d(pc, pd, dummypoint, pb); + ori_ca = orient3d(pd, pc, dummypoint, pa); + if (ori_ab <= 0) { + flipshpush(&(flipshs[0])); + } else if (ori_ca <= 0) { + flipshpush(&(flipshs[1])); + } + // Set 'searchsh' s.t. its origin is 'startpt'. + *searchsh = flipshs[0]; + } + + return sscoutsegment(searchsh, endpt, insertsegflag, reporterrorflag, + chkencflag); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// scarveholes() Remove triangles not in the facet. // +// // +// This routine re-uses the two global arrays: caveshlist and caveshbdlist. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::scarveholes(int holes, REAL* holelist) +{ + face *parysh, searchsh, neighsh; + enum locateresult loc; + int i, j; + + // Get all triangles. Infect unprotected convex hull triangles. + smarktest(recentsh); + caveshlist->newindex((void **) &parysh); + *parysh = recentsh; + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + searchsh = *parysh; + searchsh.shver = 0; + for (j = 0; j < 3; j++) { + spivot(searchsh, neighsh); + // Is this side on the convex hull? + if (neighsh.sh != NULL) { + if (!smarktested(neighsh)) { + smarktest(neighsh); + caveshlist->newindex((void **) &parysh); + *parysh = neighsh; + } + } else { + // A hull side. Check if it is protected by a segment. + if (!isshsubseg(searchsh)) { + // Not protected. Save this face. + if (!sinfected(searchsh)) { + sinfect(searchsh); + caveshbdlist->newindex((void **) &parysh); + *parysh = searchsh; + } + } + } + senextself(searchsh); + } + } + + // Infect the triangles in the holes. + for (i = 0; i < 3 * holes; i += 3) { + searchsh = recentsh; + loc = slocate(&(holelist[i]), &searchsh, 1, 1, 0); + if (loc != OUTSIDE) { + sinfect(searchsh); + caveshbdlist->newindex((void **) &parysh); + *parysh = searchsh; + } + } + + // Find and infect all exterior triangles. + for (i = 0; i < caveshbdlist->objects; i++) { + parysh = (face *) fastlookup(caveshbdlist, i); + searchsh = *parysh; + searchsh.shver = 0; + for (j = 0; j < 3; j++) { + spivot(searchsh, neighsh); + if (neighsh.sh != NULL) { + if (!isshsubseg(searchsh)) { + if (!sinfected(neighsh)) { + sinfect(neighsh); + caveshbdlist->newindex((void **) &parysh); + *parysh = neighsh; + } + } else { + sdissolve(neighsh); // Disconnect a protected face. + } + } + senextself(searchsh); + } + } + + // Delete exterior triangles, unmark interior triangles. + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + if (sinfected(*parysh)) { + shellfacedealloc(subfaces, parysh->sh); + } else { + sunmarktest(*parysh); + } + } + + caveshlist->restart(); + caveshbdlist->restart(); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// triangulate() Create a CDT for the facet. // +// // +// All vertices of the triangulation have type FACETVERTEX. The actual type // +// of boundary vertices are set by the routine unifysements(). // +// // +// All segments created here will have a default marker '-1'. Some of these // +// segments will get their actual marker defined in 'edgemarkerlist'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::triangulate(int shmark, arraypool* ptlist, arraypool* conlist, + int holes, REAL* holelist) +{ + face searchsh, newsh, *parysh; + face newseg, *paryseg; + point pa, pb, pc, *ppt, *cons; + int iloc; + int i, j; + + if (b->verbose > 2) { + printf(" f%d: %ld vertices, %ld segments", shmark, ptlist->objects, + conlist->objects); + if (holes > 0) { + printf(", %d holes", holes); + } + printf(".\n"); + } + + if (ptlist->objects < 2l) { + // Not a segment or a facet. + return 1; + } else if (ptlist->objects == 2l) { + pa = * (point *) fastlookup(ptlist, 0); + pb = * (point *) fastlookup(ptlist, 1); + if (distance(pa, pb) > 0) { + // It is a single segment. + makeshellface(subsegs, &newseg); + setshvertices(newseg, pa, pb, NULL); + setshellmark(newseg, -1); + } + if (pointtype(pa) == VOLVERTEX) { + setpointtype(pa, FACETVERTEX); + } + if (pointtype(pb) == VOLVERTEX) { + setpointtype(pb, FACETVERTEX); + } + return 1; + } else if (ptlist->objects == 3) { + pa = * (point *) fastlookup(ptlist, 0); + pb = * (point *) fastlookup(ptlist, 1); + pc = * (point *) fastlookup(ptlist, 2); + } else { + // Calculate an above point of this facet. + if (!calculateabovepoint(ptlist, &pa, &pb, &pc)) { + if (!b->quiet) { + printf("Warning: Unable to triangulate facet #%d. Skipped!\n",shmark); + } + return 0; // The point set is degenerate. + } + } + + // Create an initial triangulation. + makeshellface(subfaces, &newsh); + setshvertices(newsh, pa, pb, pc); + setshellmark(newsh, shmark); + recentsh = newsh; + + if (pointtype(pa) == VOLVERTEX) { + setpointtype(pa, FACETVERTEX); + } + if (pointtype(pb) == VOLVERTEX) { + setpointtype(pb, FACETVERTEX); + } + if (pointtype(pc) == VOLVERTEX) { + setpointtype(pc, FACETVERTEX); + } + + // Are there area constraints? + if (b->quality && (in->facetconstraintlist != NULL)) { + for (i = 0; i < in->numberoffacetconstraints; i++) { + if (shmark == ((int) in->facetconstraintlist[i * 2])) { + REAL area = in->facetconstraintlist[i * 2 + 1]; + setareabound(newsh, area); + break; + } + } + } + + if (ptlist->objects == 3) { + // The triangulation only has one element. + for (i = 0; i < 3; i++) { + makeshellface(subsegs, &newseg); + setshvertices(newseg, sorg(newsh), sdest(newsh), NULL); + setshellmark(newseg, -1); + ssbond(newsh, newseg); + senextself(newsh); + } + return 1; + } + + // Triangulate the facet. It may not success (due to rounding error, or + // incorrect input data), use 'caveencshlist' and 'caveencseglist' are + // re-used to store all the newly created subfaces and segments. So we + // can clean them if the triangulation is not successful. + caveencshlist->newindex((void **) &parysh); + *parysh = newsh; + + // Incrementally build the triangulation. + pinfect(pa); + pinfect(pb); + pinfect(pc); + for (i = 0; i < ptlist->objects; i++) { + ppt = (point *) fastlookup(ptlist, i); + if (!pinfected(*ppt)) { + searchsh = recentsh; // Start from 'recentsh'. + iloc = (int) OUTSIDE; + // Insert the vertex. Use Bowyer-Watson algo. Round the location. + iloc = sinsertvertex(*ppt, &searchsh, NULL, iloc, 1, 1); + if (iloc != ((int) ONVERTEX)) { + // Point inserted successfully. + if (pointtype(*ppt) == VOLVERTEX) { + setpointtype(*ppt, FACETVERTEX); + } + // Save the set of new subfaces. + for (j = 0; j < caveshbdlist->objects; j++) { + // Get an old subface at edge [a, b]. + parysh = (face *) fastlookup(caveshbdlist, j); + spivot(*parysh, searchsh); // The new subface [a, b, p]. + // Do not save a deleted new face (degenerated). + if (searchsh.sh[3] != NULL) { + caveencshlist->newindex((void **) &parysh); + *parysh = searchsh; + } + } + // Delete all removed subfaces. + for (j = 0; j < caveshlist->objects; j++) { + parysh = (face *) fastlookup(caveshlist, j); + shellfacedealloc(subfaces, parysh->sh); + } + // Clear the global lists. + caveshbdlist->restart(); + caveshlist->restart(); + cavesegshlist->restart(); + } else { + // The facet triangulation is failed. + break; + } + } + } // i + puninfect(pa); + puninfect(pb); + puninfect(pc); + + if (i < ptlist->objects) { + //The facet triangulation is failed. Clean the new subfaces. + // There is no new segment be created yet. + if (!b->quiet) { + printf("Warning: Fail to triangulate facet #%d. Skipped!\n", shmark); + } + for (i = 0; i < caveencshlist->objects; i++) { + parysh = (face *) fastlookup(caveencshlist, i); + if (parysh->sh[3] != NULL) { + shellfacedealloc(subfaces, parysh->sh); + } + } + caveencshlist->restart(); + return 0; + } + + // Insert the segments. + for (i = 0; i < conlist->objects; i++) { + cons = (point *) fastlookup(conlist, i); + searchsh = recentsh; + iloc = (int) slocate(cons[0], &searchsh, 1, 1, 0); + if (iloc != (int) ONVERTEX) { + // Not found due to roundoff errors. Do a brute-force search. + subfaces->traversalinit(); + searchsh.sh = shellfacetraverse(subfaces); + while (searchsh.sh != NULL) { + // Only search the subface in the same facet. + if (shellmark(searchsh) == shmark) { + if ((point) searchsh.sh[3] == cons[0]) { + searchsh.shver = 0; break; + } else if ((point) searchsh.sh[4] == cons[0]) { + searchsh.shver = 2; break; + } else if ((point) searchsh.sh[5] == cons[0]) { + searchsh.shver = 4; break; + } + } + searchsh.sh = shellfacetraverse(subfaces); + } + } + // Recover the segment. Some edges may be flipped. + if (sscoutsegment(&searchsh, cons[1], 1, 1, 0) != SHAREEDGE) { + break; // Fail to recover a segment. + } + // Save this newseg. + sspivot(searchsh, newseg); + caveencseglist->newindex((void **) &paryseg); + *paryseg = newseg; + if (flipstack != NULL) { + // Recover locally Delaunay edges. + lawsonflip(); + } + } // i + + if (i < conlist->objects) { + if (!b->quiet) { + printf("Warning: Fail to recover a segment in facet #%d. Skipped!\n", + shmark); + } + for (i = 0; i < caveencshlist->objects; i++) { + parysh = (face *) fastlookup(caveencshlist, i); + if (parysh->sh[3] != NULL) { + shellfacedealloc(subfaces, parysh->sh); + } + } + for (i = 0; i < caveencseglist->objects; i++) { + paryseg = (face *) fastlookup(caveencseglist, i); + if (paryseg->sh[3] != NULL) { + shellfacedealloc(subsegs, paryseg->sh); + } + } + caveencshlist->restart(); + caveencseglist->restart(); + return 0; + } + + // Remove exterior and hole triangles. + scarveholes(holes, holelist); + + caveencshlist->restart(); + caveencseglist->restart(); + return 1; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// unifysegments() Remove redundant segments and create face links. // +// // +// After this routine, although segments are unique, but some of them may be // +// removed later by mergefacet(). All vertices still have type FACETVERTEX. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::unifysegments() +{ + badface *facelink = NULL, *newlinkitem, *f1, *f2; + face *facperverlist, sface; + face subsegloop, testseg; + point torg, tdest; + REAL ori1, ori2, ori3; + REAL n1[3], n2[3]; + REAL cosang, ang, ang_tol; + int *idx2faclist; + int idx, k, m; + + if (b->verbose > 1) { + printf(" Unifying segments.\n"); + } + // The limit dihedral angle that two facets are not overlapping. + ang_tol = b->facet_overlap_ang_tol / 180.0 * PI; + if (ang_tol < 0.0) ang_tol = 0.0; + + // Create a mapping from vertices to subfaces. + makepoint2submap(subfaces, idx2faclist, facperverlist); + + + subsegloop.shver = 0; + subsegs->traversalinit(); + subsegloop.sh = shellfacetraverse(subsegs); + while (subsegloop.sh != (shellface *) NULL) { + torg = sorg(subsegloop); + tdest = sdest(subsegloop); + + idx = pointmark(torg) - in->firstnumber; + // Loop through the set of subfaces containing 'torg'. Get all the + // subfaces containing the edge (torg, tdest). Save and order them + // in 'sfacelist', the ordering is defined by the right-hand rule + // with thumb points from torg to tdest. + for (k = idx2faclist[idx]; k < idx2faclist[idx + 1]; k++) { + sface = facperverlist[k]; + // The face may be deleted if it is a duplicated face. + if (sface.sh[3] == NULL) continue; + // Search the edge torg->tdest. + if (sdest(sface) != tdest) { + senext2self(sface); + sesymself(sface); + } + if (sdest(sface) != tdest) continue; + + // Save the face f in facelink. + if (flippool->items >= 2) { + f1 = facelink; + for (m = 0; m < flippool->items - 1; m++) { + f2 = f1->nextitem; + ori1 = orient3d(torg, tdest, sapex(f1->ss), sapex(f2->ss)); + ori2 = orient3d(torg, tdest, sapex(f1->ss), sapex(sface)); + if (ori1 > 0) { + // apex(f2) is below f1. + if (ori2 > 0) { + // apex(f) is below f1 (see Fig.1). + ori3 = orient3d(torg, tdest, sapex(f2->ss), sapex(sface)); + if (ori3 > 0) { + // apex(f) is below f2, insert it. + break; + } else if (ori3 < 0) { + // apex(f) is above f2, continue. + } else { // ori3 == 0; + // f is coplanar and codirection with f2. + report_overlapping_facets(&(f2->ss), &sface); + break; + } + } else if (ori2 < 0) { + // apex(f) is above f1 below f2, inset it (see Fig. 2). + break; + } else { // ori2 == 0; + // apex(f) is coplanar with f1 (see Fig. 5). + ori3 = orient3d(torg, tdest, sapex(f2->ss), sapex(sface)); + if (ori3 > 0) { + // apex(f) is below f2, insert it. + break; + } else { + // f is coplanar and codirection with f1. + report_overlapping_facets(&(f1->ss), &sface); + break; + } + } + } else if (ori1 < 0) { + // apex(f2) is above f1. + if (ori2 > 0) { + // apex(f) is below f1, continue (see Fig. 3). + } else if (ori2 < 0) { + // apex(f) is above f1 (see Fig.4). + ori3 = orient3d(torg, tdest, sapex(f2->ss), sapex(sface)); + if (ori3 > 0) { + // apex(f) is below f2, insert it. + break; + } else if (ori3 < 0) { + // apex(f) is above f2, continue. + } else { // ori3 == 0; + // f is coplanar and codirection with f2. + report_overlapping_facets(&(f2->ss), &sface); + break; + } + } else { // ori2 == 0; + // f is coplanar and with f1 (see Fig. 6). + ori3 = orient3d(torg, tdest, sapex(f2->ss), sapex(sface)); + if (ori3 > 0) { + // f is also codirection with f1. + report_overlapping_facets(&(f1->ss), &sface); + break; + } else { + // f is above f2, continue. + } + } + } else { // ori1 == 0; + // apex(f2) is coplanar with f1. By assumption, f1 is not + // coplanar and codirection with f2. + if (ori2 > 0) { + // apex(f) is below f1, continue (see Fig. 7). + } else if (ori2 < 0) { + // apex(f) is above f1, insert it (see Fig. 7). + break; + } else { // ori2 == 0. + // apex(f) is coplanar with f1 (see Fig. 8). + // f is either codirection with f1 or is codirection with f2. + facenormal(torg, tdest, sapex(f1->ss), n1, 1, NULL); + facenormal(torg, tdest, sapex(sface), n2, 1, NULL); + if (dot(n1, n2) > 0) { + report_overlapping_facets(&(f1->ss), &sface); + } else { + report_overlapping_facets(&(f2->ss), &sface); + } + break; + } + } + // Go to the next item; + f1 = f2; + } // for (m = 0; ...) + if (sface.sh[3] != NULL) { + // Insert sface between f1 and f2. + newlinkitem = (badface *) flippool->alloc(); + newlinkitem->ss = sface; + newlinkitem->nextitem = f1->nextitem; + f1->nextitem = newlinkitem; + } + } else if (flippool->items == 1) { + f1 = facelink; + // Make sure that f is not coplanar and codirection with f1. + ori1 = orient3d(torg, tdest, sapex(f1->ss), sapex(sface)); + if (ori1 == 0) { + // f is coplanar with f1 (see Fig. 8). + facenormal(torg, tdest, sapex(f1->ss), n1, 1, NULL); + facenormal(torg, tdest, sapex(sface), n2, 1, NULL); + if (dot(n1, n2) > 0) { + // The two faces are codirectional as well. + report_overlapping_facets(&(f1->ss), &sface); + } + } + // Add this face to link if it is not deleted. + if (sface.sh[3] != NULL) { + // Add this face into link. + newlinkitem = (badface *) flippool->alloc(); + newlinkitem->ss = sface; + newlinkitem->nextitem = NULL; + f1->nextitem = newlinkitem; + } + } else { + // The first face. + newlinkitem = (badface *) flippool->alloc(); + newlinkitem->ss = sface; + newlinkitem->nextitem = NULL; + facelink = newlinkitem; + } + } // for (k = idx2faclist[idx]; ...) + + + // Set the connection between this segment and faces containing it, + // at the same time, remove redundant segments. + f1 = facelink; + for (k = 0; k < flippool->items; k++) { + sspivot(f1->ss, testseg); + // If 'testseg' is not 'subsegloop' and is not dead, it is redundant. + if ((testseg.sh != subsegloop.sh) && (testseg.sh[3] != NULL)) { + shellfacedealloc(subsegs, testseg.sh); + } + // Bonds the subface and the segment together. + ssbond(f1->ss, subsegloop); + f1 = f1->nextitem; + } + + // Create the face ring at the segment. + if (flippool->items > 1) { + f1 = facelink; + for (k = 1; k <= flippool->items; k++) { + k < flippool->items ? f2 = f1->nextitem : f2 = facelink; + // Calculate the dihedral angle between the two facet. + facenormal(torg, tdest, sapex(f1->ss), n1, 1, NULL); + facenormal(torg, tdest, sapex(f2->ss), n2, 1, NULL); + cosang = dot(n1, n2) / (sqrt(dot(n1, n1)) * sqrt(dot(n2, n2))); + // Rounding. + if (cosang > 1.0) cosang = 1.0; + else if (cosang < -1.0) cosang = -1.0; + ang = acos(cosang); + if (ang < ang_tol) { + // Two facets are treated as overlapping each other. + report_overlapping_facets(&(f1->ss), &(f2->ss), ang); + } else { + // Record the smallest input dihedral angle. + if (ang < minfacetdihed) { + minfacetdihed = ang; + } + sbond1(f1->ss, f2->ss); + } + f1 = f2; + } + } + + flippool->restart(); + + // Are there length constraints? + if (b->quality && (in->segmentconstraintlist != (REAL *) NULL)) { + int e1, e2; + REAL len; + for (k = 0; k < in->numberofsegmentconstraints; k++) { + e1 = (int) in->segmentconstraintlist[k * 3]; + e2 = (int) in->segmentconstraintlist[k * 3 + 1]; + if (((pointmark(torg) == e1) && (pointmark(tdest) == e2)) || + ((pointmark(torg) == e2) && (pointmark(tdest) == e1))) { + len = in->segmentconstraintlist[k * 3 + 2]; + setareabound(subsegloop, len); + break; + } + } + } + + subsegloop.sh = shellfacetraverse(subsegs); + } + + delete [] idx2faclist; + delete [] facperverlist; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// identifyinputedges() Identify input edges. // +// // +// A set of input edges is provided in the 'in->edgelist'. We find these // +// edges in the surface mesh and make them segments of the mesh. // +// // +// It is possible that an input edge is not in any facet, i.e.,it is a float-// +// segment inside the volume. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::identifyinputedges(point *idx2verlist) +{ + face* shperverlist; + int* idx2shlist; + face searchsh, neighsh; + face segloop, checkseg, newseg; + point checkpt, pa = NULL, pb = NULL; + int *endpts; + int edgemarker; + int idx, i, j; + + int e1, e2; + REAL len; + + if (!b->quiet) { + printf("Inserting edges ...\n"); + } + + // Construct a map from points to subfaces. + makepoint2submap(subfaces, idx2shlist, shperverlist); + + // Process the set of input edges. + for (i = 0; i < in->numberofedges; i++) { + endpts = &(in->edgelist[(i << 1)]); + if (endpts[0] == endpts[1]) { + if (!b->quiet) { + printf("Warning: Edge #%d is degenerated. Skipped.\n", i); + } + continue; // Skip a degenerated edge. + } + // Recall that all existing segments have a default marker '-1'. + // We assign all identified segments a default marker '-2'. + edgemarker = in->edgemarkerlist ? in->edgemarkerlist[i] : -2; + + // Find a face contains the edge. + newseg.sh = NULL; + searchsh.sh = NULL; + idx = endpts[0] - in->firstnumber; + for (j = idx2shlist[idx]; j < idx2shlist[idx + 1]; j++) { + checkpt = sdest(shperverlist[j]); + if (pointmark(checkpt) == endpts[1]) { + searchsh = shperverlist[j]; + break; // Found. + } else { + checkpt = sapex(shperverlist[j]); + if (pointmark(checkpt) == endpts[1]) { + senext2(shperverlist[j], searchsh); + sesymself(searchsh); + break; + } + } + } // j + + if (searchsh.sh != NULL) { + // Check if this edge is already a segment of the mesh. + sspivot(searchsh, checkseg); + if (checkseg.sh != NULL) { + // This segment already exist. + newseg = checkseg; + } else { + // Create a new segment at this edge. + pa = sorg(searchsh); + pb = sdest(searchsh); + makeshellface(subsegs, &newseg); + setshvertices(newseg, pa, pb, NULL); + ssbond(searchsh, newseg); + spivot(searchsh, neighsh); + if (neighsh.sh != NULL) { + ssbond(neighsh, newseg); + } + } + } else { + // It is a dangling segment (not belong to any facets). + // Get the two endpoints of this segment. + pa = idx2verlist[endpts[0]]; + pb = idx2verlist[endpts[1]]; + if (pa == pb) { + if (!b->quiet) { + printf("Warning: Edge #%d is degenerated. Skipped.\n", i); + } + continue; + } + // Check if segment [a,b] already exists. + // TODO: Change the brute-force search. Slow! + point *ppt; + subsegs->traversalinit(); + segloop.sh = shellfacetraverse(subsegs); + while (segloop.sh != NULL) { + ppt = (point *) &(segloop.sh[3]); + if (((ppt[0] == pa) && (ppt[1] == pb)) || + ((ppt[0] == pb) && (ppt[1] == pa))) { + // Found! + newseg = segloop; + break; + } + segloop.sh = shellfacetraverse(subsegs); + } + if (newseg.sh == NULL) { + makeshellface(subsegs, &newseg); + setshvertices(newseg, pa, pb, NULL); + } + } + + setshellmark(newseg, edgemarker); + + if (b->quality && (in->segmentconstraintlist != (REAL *) NULL)) { + for (i = 0; i < in->numberofsegmentconstraints; i++) { + e1 = (int) in->segmentconstraintlist[i * 3]; + e2 = (int) in->segmentconstraintlist[i * 3 + 1]; + if (((pointmark(pa) == e1) && (pointmark(pb) == e2)) || + ((pointmark(pa) == e2) && (pointmark(pb) == e1))) { + len = in->segmentconstraintlist[i * 3 + 2]; + setareabound(newseg, len); + break; + } + } + } + } // i + + delete [] shperverlist; + delete [] idx2shlist; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// mergefacets() Merge adjacent facets. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::mergefacets() +{ + face parentsh, neighsh, neineish; + face segloop; + point pa, pb, pc, pd; + REAL n1[3], n2[3]; + REAL cosang, cosang_tol; + + + // Allocate an array to save calcaulated dihedral angles at segments. + arraypool *dihedangarray = new arraypool(sizeof(double), 10); + REAL *paryang = NULL; + + // First, remove coplanar segments. + // The dihedral angle bound for two different facets. + cosang_tol = cos(b->facet_separate_ang_tol / 180.0 * PI); + + subsegs->traversalinit(); + segloop.sh = shellfacetraverse(subsegs); + while (segloop.sh != (shellface *) NULL) { + // Only remove a segment if it has a marker '-1'. + if (shellmark(segloop) != -1) { + segloop.sh = shellfacetraverse(subsegs); + continue; + } + spivot(segloop, parentsh); + if (parentsh.sh != NULL) { + spivot(parentsh, neighsh); + if (neighsh.sh != NULL) { + spivot(neighsh, neineish); + if (neineish.sh == parentsh.sh) { + // Exactly two subfaces at this segment. + // Only merge them if they have the same boundary marker. + if (shellmark(parentsh) == shellmark(neighsh)) { + pa = sorg(segloop); + pb = sdest(segloop); + pc = sapex(parentsh); + pd = sapex(neighsh); + // Calculate the dihedral angle at the segment [a,b]. + facenormal(pa, pb, pc, n1, 1, NULL); + facenormal(pa, pb, pd, n2, 1, NULL); + cosang = dot(n1, n2) / (sqrt(dot(n1, n1)) * sqrt(dot(n2, n2))); + if (cosang < cosang_tol) { + ssdissolve(parentsh); + ssdissolve(neighsh); + shellfacedealloc(subsegs, segloop.sh); + // Add the edge to flip stack. + flipshpush(&parentsh); + } else { + // Save 'cosang' to avoid re-calculate it. + // Re-use the pointer at the first segment. + dihedangarray->newindex((void **) &paryang); + *paryang = cosang; + segloop.sh[6] = (shellface) paryang; + } + } + } // if (neineish.sh == parentsh.sh) + } + } + segloop.sh = shellfacetraverse(subsegs); + } + + // Second, remove ridge segments at small angles. + // The dihedral angle bound for two different facets. + cosang_tol = cos(b->facet_small_ang_tol / 180.0 * PI); + REAL cosang_sep_tol = cos((b->facet_separate_ang_tol - 5.0) / 180.0 * PI); + face shloop; + face seg1, seg2; + REAL cosang1, cosang2; + int i, j; + + subfaces->traversalinit(); + shloop.sh = shellfacetraverse(subfaces); + while (shloop.sh != (shellface *) NULL) { + for (i = 0; i < 3; i++) { + if (isshsubseg(shloop)) { + senext(shloop, neighsh); + if (isshsubseg(neighsh)) { + // Found two segments sharing at one vertex. + // Check if they form a small angle. + pa = sorg(shloop); + pb = sdest(shloop); + pc = sapex(shloop); + for (j = 0; j < 3; j++) n1[j] = pa[j] - pb[j]; + for (j = 0; j < 3; j++) n2[j] = pc[j] - pb[j]; + cosang = dot(n1, n2) / (sqrt(dot(n1, n1)) * sqrt(dot(n2, n2))); + if (cosang > cosang_tol) { + // Found a small angle. + segloop.sh = NULL; + sspivot(shloop, seg1); + sspivot(neighsh, seg2); + if (seg1.sh[6] != NULL) { + paryang = (REAL *) (seg1.sh[6]); + cosang1 = *paryang; + } else { + cosang1 = 1.0; // 0 degree; + } + if (seg2.sh[6] != NULL) { + paryang = (REAL *) (seg2.sh[6]); + cosang2 = *paryang; + } else { + cosang2 = 1.0; // 0 degree; + } + if (cosang1 < cosang_sep_tol) { + if (cosang2 < cosang_sep_tol) { + if (cosang1 < cosang2) { + segloop = seg1; + } else { + segloop = seg2; + } + } else { + segloop = seg1; + } + } else { + if (cosang2 < cosang_sep_tol) { + segloop = seg2; + } + } + if (segloop.sh != NULL) { + // Remove this segment. + segloop.shver = 0; + spivot(segloop, parentsh); + spivot(parentsh, neighsh); + ssdissolve(parentsh); + ssdissolve(neighsh); + shellfacedealloc(subsegs, segloop.sh); + // Add the edge to flip stack. + flipshpush(&parentsh); + break; + } + } + } // if (isshsubseg) + } // if (isshsubseg) + senextself(shloop); + } + shloop.sh = shellfacetraverse(subfaces); + } + + delete dihedangarray; + + if (flipstack != NULL) { + lawsonflip(); // Recover Delaunayness. + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// meshsurface() Create a surface mesh of the input PLC. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::meshsurface() +{ + arraypool *ptlist, *conlist; + point *idx2verlist; + point tstart, tend, *pnewpt, *cons; + tetgenio::facet *f; + tetgenio::polygon *p; + int end1, end2; + int shmark, i, j; + + if (!b->quiet) { + printf("Creating surface mesh ...\n"); + } + + // Create a map from indices to points. + makeindex2pointmap(idx2verlist); + + // Initialize arrays (block size: 2^8 = 256). + ptlist = new arraypool(sizeof(point *), 8); + conlist = new arraypool(2 * sizeof(point *), 8); + + // Loop the facet list, triangulate each facet. + for (shmark = 1; shmark <= in->numberoffacets; shmark++) { + + // Get a facet F. + f = &in->facetlist[shmark - 1]; + + // Process the duplicated points first, they are marked with type + // DUPLICATEDVERTEX. If p and q are duplicated, and p'index > q's, + // then p is substituted by q. + if (dupverts > 0l) { + // Loop all polygons of this facet. + for (i = 0; i < f->numberofpolygons; i++) { + p = &(f->polygonlist[i]); + // Loop other vertices of this polygon. + for (j = 0; j < p->numberofvertices; j++) { + end1 = p->vertexlist[j]; + tstart = idx2verlist[end1]; + if (pointtype(tstart) == DUPLICATEDVERTEX) { + // Reset the index of vertex-j. + tend = point2ppt(tstart); + end2 = pointmark(tend); + p->vertexlist[j] = end2; + } + } + } + } + + // Loop polygons of F, get the set of vertices and segments. + for (i = 0; i < f->numberofpolygons; i++) { + // Get a polygon. + p = &(f->polygonlist[i]); + // Get the first vertex. + end1 = p->vertexlist[0]; + if ((end1 < in->firstnumber) || + (end1 >= in->firstnumber + in->numberofpoints)) { + if (!b->quiet) { + printf("Warning: Invalid the 1st vertex %d of polygon", end1); + printf(" %d in facet %d.\n", i + 1, shmark); + } + continue; // Skip this polygon. + } + tstart = idx2verlist[end1]; + // Add tstart to V if it haven't been added yet. + if (!pinfected(tstart)) { + pinfect(tstart); + ptlist->newindex((void **) &pnewpt); + *pnewpt = tstart; + } + // Loop other vertices of this polygon. + for (j = 1; j <= p->numberofvertices; j++) { + // get a vertex. + if (j < p->numberofvertices) { + end2 = p->vertexlist[j]; + } else { + end2 = p->vertexlist[0]; // Form a loop from last to first. + } + if ((end2 < in->firstnumber) || + (end2 >= in->firstnumber + in->numberofpoints)) { + if (!b->quiet) { + printf("Warning: Invalid vertex %d in polygon %d", end2, i + 1); + printf(" in facet %d.\n", shmark); + } + } else { + if (end1 != end2) { + // 'end1' and 'end2' form a segment. + tend = idx2verlist[end2]; + // Add tstart to V if it haven't been added yet. + if (!pinfected(tend)) { + pinfect(tend); + ptlist->newindex((void **) &pnewpt); + *pnewpt = tend; + } + // Save the segment in S (conlist). + conlist->newindex((void **) &cons); + cons[0] = tstart; + cons[1] = tend; + // Set the start for next continuous segment. + end1 = end2; + tstart = tend; + } else { + // Two identical vertices mean an isolated vertex of F. + if (p->numberofvertices > 2) { + // This may be an error in the input, anyway, we can continue + // by simply skipping this segment. + if (!b->quiet) { + printf("Warning: Polygon %d has two identical verts", i + 1); + printf(" in facet %d.\n", shmark); + } + } + // Ignore this vertex. + } + } + // Is the polygon degenerate (a segment or a vertex)? + if (p->numberofvertices == 2) break; + } + } + // Unmark vertices. + for (i = 0; i < ptlist->objects; i++) { + pnewpt = (point *) fastlookup(ptlist, i); + puninfect(*pnewpt); + } + + // Triangulate F into a CDT. + // If in->facetmarklist is NULL, use the default marker -1. + triangulate(in->facetmarkerlist ? in->facetmarkerlist[shmark - 1] : -1, + ptlist, conlist, f->numberofholes, f->holelist); + + // Clear working lists. + ptlist->restart(); + conlist->restart(); + } + + if (!b->diagnose) { + // Remove redundant segments and build the face links. + unifysegments(); + if (in->numberofedges > 0) { + // There are input segments. Insert them. + identifyinputedges(idx2verlist); + } + if (!b->psc && !b->nomergefacet && + (!b->nobisect || (b->nobisect && !b->nobisect_nomerge))) { + // Merge coplanar facets. + mergefacets(); + } + } + + if (b->object == tetgenbehavior::STL) { + // Remove redundant vertices (for .stl input mesh). + jettisonnodes(); + } + + if (b->verbose) { + printf(" %ld (%ld) subfaces (segments).\n", subfaces->items, + subsegs->items); + } + + // The total number of iunput segments. + insegments = subsegs->items; + + delete [] idx2verlist; + delete ptlist; + delete conlist; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// interecursive() Recursively do intersection test on a set of triangles.// +// // +// Recursively split the set 'subfacearray' of subfaces into two sets using // +// a cut plane parallel to x-, or, y-, or z-axis. The split criteria are // +// follows. Assume the cut plane is H, and H+ denotes the left halfspace of // +// H, and H- denotes the right halfspace of H; and s be a subface: // +// // +// (1) If all points of s lie at H+, put it into left array; // +// (2) If all points of s lie at H-, put it into right array; // +// (3) If some points of s lie at H+ and some of lie at H-, or some // +// points lie on H, put it into both arraies. // +// // +// Partitions by x-axis if axis == '0'; by y-axis if axis == '1'; by z-axis // +// if axis == '2'. If current cut plane is parallel to the x-axis, the next // +// one will be parallel to y-axis, and the next one after the next is z-axis,// +// and then alternately return back to x-axis. // +// // +// Stop splitting when the number of triangles of the input array is not // +// decreased anymore. Do tests on the current set. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::interecursive(shellface** subfacearray, int arraysize, + int axis, REAL bxmin, REAL bxmax, REAL bymin, + REAL bymax, REAL bzmin, REAL bzmax, + int* internum) +{ + shellface **leftarray, **rightarray; + face sface1, sface2; + point p1, p2, p3; + point p4, p5, p6; + enum interresult intersect; + REAL split; + bool toleft, toright; + int leftsize, rightsize; + int i, j; + + if (b->verbose > 2) { + printf(" Recur %d faces. Bbox (%g, %g, %g),(%g, %g, %g). %s-axis\n", + arraysize, bxmin, bymin, bzmin, bxmax, bymax, bzmax, + axis == 0 ? "x" : (axis == 1 ? "y" : "z")); + } + + leftarray = new shellface*[arraysize]; + if (leftarray == NULL) { + terminatetetgen(this, 1); + } + rightarray = new shellface*[arraysize]; + if (rightarray == NULL) { + terminatetetgen(this, 1); + } + leftsize = rightsize = 0; + + if (axis == 0) { + // Split along x-axis. + split = 0.5 * (bxmin + bxmax); + } else if (axis == 1) { + // Split along y-axis. + split = 0.5 * (bymin + bymax); + } else { + // Split along z-axis. + split = 0.5 * (bzmin + bzmax); + } + + for (i = 0; i < arraysize; i++) { + sface1.sh = subfacearray[i]; + p1 = (point) sface1.sh[3]; + p2 = (point) sface1.sh[4]; + p3 = (point) sface1.sh[5]; + toleft = toright = false; + if (p1[axis] < split) { + toleft = true; + if (p2[axis] >= split || p3[axis] >= split) { + toright = true; + } + } else if (p1[axis] > split) { + toright = true; + if (p2[axis] <= split || p3[axis] <= split) { + toleft = true; + } + } else { + // p1[axis] == split; + toleft = true; + toright = true; + } + if (toleft) { + leftarray[leftsize] = sface1.sh; + leftsize++; + } + if (toright) { + rightarray[rightsize] = sface1.sh; + rightsize++; + } + } + + if (leftsize < arraysize && rightsize < arraysize) { + // Continue to partition the input set. Now 'subfacearray' has been + // split into two sets, it's memory can be freed. 'leftarray' and + // 'rightarray' will be freed in the next recursive (after they're + // partitioned again or performing tests). + delete [] subfacearray; + // Continue to split these two sets. + if (axis == 0) { + interecursive(leftarray, leftsize, 1, bxmin, split, bymin, bymax, + bzmin, bzmax, internum); + interecursive(rightarray, rightsize, 1, split, bxmax, bymin, bymax, + bzmin, bzmax, internum); + } else if (axis == 1) { + interecursive(leftarray, leftsize, 2, bxmin, bxmax, bymin, split, + bzmin, bzmax, internum); + interecursive(rightarray, rightsize, 2, bxmin, bxmax, split, bymax, + bzmin, bzmax, internum); + } else { + interecursive(leftarray, leftsize, 0, bxmin, bxmax, bymin, bymax, + bzmin, split, internum); + interecursive(rightarray, rightsize, 0, bxmin, bxmax, bymin, bymax, + split, bzmax, internum); + } + } else { + if (b->verbose > 1) { + printf(" Checking intersecting faces.\n"); + } + // Perform a brute-force compare on the set. + for (i = 0; i < arraysize; i++) { + sface1.sh = subfacearray[i]; + p1 = (point) sface1.sh[3]; + p2 = (point) sface1.sh[4]; + p3 = (point) sface1.sh[5]; + for (j = i + 1; j < arraysize; j++) { + sface2.sh = subfacearray[j]; + p4 = (point) sface2.sh[3]; + p5 = (point) sface2.sh[4]; + p6 = (point) sface2.sh[5]; + intersect = (enum interresult) tri_tri_inter(p1, p2, p3, p4, p5, p6); + if (intersect == INTERSECT || intersect == SHAREFACE) { + if (!b->quiet) { + if (intersect == INTERSECT) { + printf(" Facet #%d intersects facet #%d at triangles:\n", + shellmark(sface1), shellmark(sface2)); + printf(" (%4d, %4d, %4d) and (%4d, %4d, %4d)\n", + pointmark(p1), pointmark(p2), pointmark(p3), + pointmark(p4), pointmark(p5), pointmark(p6)); + } else { + printf(" Facet #%d duplicates facet #%d at triangle:\n", + shellmark(sface1), shellmark(sface2)); + printf(" (%4d, %4d, %4d) and (%4d, %4d, %4d)\n", + pointmark(p1), pointmark(p2), pointmark(p3), + pointmark(p4), pointmark(p5), pointmark(p6)); + } + } + // Increase the number of intersecting pairs. + (*internum)++; + // Infect these two faces (although they may already be infected). + sinfect(sface1); + sinfect(sface2); + } + } + } + // Don't forget to free all three arrays. No further partition. + delete [] leftarray; + delete [] rightarray; + delete [] subfacearray; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// detectinterfaces() Detect intersecting triangles. // +// // +// Given a set of triangles, find the pairs of intersecting triangles from // +// them. Here the set of triangles is in 'subfaces' which is a surface mesh // +// of a PLC (.poly or .smesh). // +// // +// To detect whether two triangles are intersecting is done by the routine // +// 'tri_tri_inter()'. The algorithm for the test is very simple and stable. // +// It is based on geometric orientation test which uses exact arithmetics. // +// // +// Use divide-and-conquer algorithm for reducing the number of intersection // +// tests. Start from the bounding box of the input point set, recursively // +// partition the box into smaller boxes, until the number of triangles in a // +// box is not decreased anymore. Then perform triangle-triangle tests on the // +// remaining set of triangles. The memory allocated in the input set is // +// freed immediately after it has been partitioned into two arrays. So it // +// can be re-used for the consequent partitions. // +// // +// On return, the pool 'subfaces' will be cleared, and only the intersecting // +// triangles remain for output (to a .face file). // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::detectinterfaces() +{ + shellface **subfacearray; + face shloop; + int internum; + int i; + + if (!b->quiet) { + printf("Detecting self-intersecting facets...\n"); + } + + // Construct a map from indices to subfaces; + subfacearray = new shellface*[subfaces->items]; + subfaces->traversalinit(); + shloop.sh = shellfacetraverse(subfaces); + i = 0; + while (shloop.sh != (shellface *) NULL) { + subfacearray[i] = shloop.sh; + shloop.sh = shellfacetraverse(subfaces); + i++; + } + + internum = 0; + // Recursively split the set of triangles into two sets using a cut plane + // parallel to x-, or, y-, or z-axis. Stop splitting when the number + // of subfaces is not decreasing anymore. Do tests on the current set. + interecursive(subfacearray, subfaces->items, 0, xmin, xmax, ymin, ymax, + zmin, zmax, &internum); + + if (!b->quiet) { + if (internum > 0) { + printf("\n!! Found %d pairs of faces are intersecting.\n\n", internum); + } else { + printf("\nNo faces are intersecting.\n\n"); + } + } + + if (internum > 0) { + // Traverse all subfaces, deallocate those have not been infected (they + // are not intersecting faces). Uninfect those have been infected. + // After this loop, only intersecting faces remain. + subfaces->traversalinit(); + shloop.sh = shellfacetraverse(subfaces); + while (shloop.sh != (shellface *) NULL) { + if (sinfected(shloop)) { + suninfect(shloop); + } else { + shellfacedealloc(subfaces, shloop.sh); + } + shloop.sh = shellfacetraverse(subfaces); + } + } else { + // Deallocate all subfaces. + subfaces->restart(); + } +} + +//// //// +//// //// +//// surface_cxx ////////////////////////////////////////////////////////////// + +//// constrained_cxx ////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// makesegmentendpointsmap() Create a map from a segment to its endpoints.// +// // +// The map is saved in the array 'segmentendpointslist'. The length of this // +// array is twice the number of segments. Each segment is assigned a unique // +// index (starting from 0). // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::makesegmentendpointsmap() +{ + arraypool *segptlist; + face segloop, prevseg, nextseg; + point eorg, edest, *parypt; + int segindex = 0, idx = 0; + int i; + + if (b->verbose > 0) { + printf(" Creating the segment-endpoints map.\n"); + } + + segptlist = new arraypool(2 * sizeof(point), 10); + + // A segment s may have been split into many subsegments. Operate the one + // which contains the origin of s. Then mark the rest of subsegments. + subsegs->traversalinit(); + segloop.sh = shellfacetraverse(subsegs); + segloop.shver = 0; + while (segloop.sh != NULL) { + senext2(segloop, prevseg); + spivotself(prevseg); + if (prevseg.sh == NULL) { + eorg = sorg(segloop); + edest = sdest(segloop); + setfacetindex(segloop, segindex); + senext(segloop, nextseg); + spivotself(nextseg); + while (nextseg.sh != NULL) { + setfacetindex(nextseg, segindex); + nextseg.shver = 0; + if (sorg(nextseg) != edest) sesymself(nextseg); + edest = sdest(nextseg); + // Go the next connected subsegment at edest. + senextself(nextseg); + spivotself(nextseg); + } + segptlist->newindex((void **) &parypt); + parypt[0] = eorg; + parypt[1] = edest; + segindex++; + } + segloop.sh = shellfacetraverse(subsegs); + } + + if (b->verbose) { + printf(" Found %ld segments.\n", segptlist->objects); + } + + segmentendpointslist = new point[segptlist->objects * 2]; + + totalworkmemory += (segptlist->objects * 2) * sizeof(point *); + + for (i = 0; i < segptlist->objects; i++) { + parypt = (point *) fastlookup(segptlist, i); + segmentendpointslist[idx++] = parypt[0]; + segmentendpointslist[idx++] = parypt[1]; + } + + delete segptlist; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// finddirection() Find the tet on the path from one point to another. // +// // +// The path starts from 'searchtet''s origin and ends at 'endpt'. On finish, // +// 'searchtet' contains a tet on the path, its origin does not change. // +// // +// The return value indicates one of the following cases (let 'searchtet' be // +// abcd, a is the origin of the path): // +// - ACROSSVERT, edge ab is collinear with the path; // +// - ACROSSEDGE, edge bc intersects with the path; // +// - ACROSSFACE, face bcd intersects with the path. // +// // +// WARNING: This routine is designed for convex triangulations, and will not // +// generally work after the holes and concavities have been carved. // +// // +/////////////////////////////////////////////////////////////////////////////// + +enum tetgenmesh::interresult + tetgenmesh::finddirection(triface* searchtet, point endpt) +{ + triface neightet; + point pa, pb, pc, pd; + enum {HMOVE, RMOVE, LMOVE} nextmove; + REAL hori, rori, lori; + int t1ver; + int s; + + // The origin is fixed. + pa = org(*searchtet); + if ((point) searchtet->tet[7] == dummypoint) { + // A hull tet. Choose the neighbor of its base face. + decode(searchtet->tet[3], *searchtet); + // Reset the origin to be pa. + if ((point) searchtet->tet[4] == pa) { + searchtet->ver = 11; + } else if ((point) searchtet->tet[5] == pa) { + searchtet->ver = 3; + } else if ((point) searchtet->tet[6] == pa) { + searchtet->ver = 7; + } else { + searchtet->ver = 0; + } + } + + pb = dest(*searchtet); + // Check whether the destination or apex is 'endpt'. + if (pb == endpt) { + // pa->pb is the search edge. + return ACROSSVERT; + } + + pc = apex(*searchtet); + if (pc == endpt) { + // pa->pc is the search edge. + eprevesymself(*searchtet); + return ACROSSVERT; + } + + // Walk through tets around pa until the right one is found. + while (1) { + + pd = oppo(*searchtet); + // Check whether the opposite vertex is 'endpt'. + if (pd == endpt) { + // pa->pd is the search edge. + esymself(*searchtet); + enextself(*searchtet); + return ACROSSVERT; + } + // Check if we have entered outside of the domain. + if (pd == dummypoint) { + // This is possible when the mesh is non-convex. + if (nonconvex) { + return ACROSSFACE; // return ACROSSSUB; // Hit a bounday. + } else { + terminatetetgen(this, 2); + } + } + + // Now assume that the base face abc coincides with the horizon plane, + // and d lies above the horizon. The search point 'endpt' may lie + // above or below the horizon. We test the orientations of 'endpt' + // with respect to three planes: abc (horizon), bad (right plane), + // and acd (left plane). + hori = orient3d(pa, pb, pc, endpt); + rori = orient3d(pb, pa, pd, endpt); + lori = orient3d(pa, pc, pd, endpt); + + // Now decide the tet to move. It is possible there are more than one + // tets are viable moves. Is so, randomly choose one. + if (hori > 0) { + if (rori > 0) { + if (lori > 0) { + // Any of the three neighbors is a viable move. + s = randomnation(3); + if (s == 0) { + nextmove = HMOVE; + } else if (s == 1) { + nextmove = RMOVE; + } else { + nextmove = LMOVE; + } + } else { + // Two tets, below horizon and below right, are viable. + if (randomnation(2)) { + nextmove = HMOVE; + } else { + nextmove = RMOVE; + } + } + } else { + if (lori > 0) { + // Two tets, below horizon and below left, are viable. + if (randomnation(2)) { + nextmove = HMOVE; + } else { + nextmove = LMOVE; + } + } else { + // The tet below horizon is chosen. + nextmove = HMOVE; + } + } + } else { + if (rori > 0) { + if (lori > 0) { + // Two tets, below right and below left, are viable. + if (randomnation(2)) { + nextmove = RMOVE; + } else { + nextmove = LMOVE; + } + } else { + // The tet below right is chosen. + nextmove = RMOVE; + } + } else { + if (lori > 0) { + // The tet below left is chosen. + nextmove = LMOVE; + } else { + // 'endpt' lies either on the plane(s) or across face bcd. + if (hori == 0) { + if (rori == 0) { + // pa->'endpt' is COLLINEAR with pa->pb. + return ACROSSVERT; + } + if (lori == 0) { + // pa->'endpt' is COLLINEAR with pa->pc. + eprevesymself(*searchtet); // [a,c,d] + return ACROSSVERT; + } + // pa->'endpt' crosses the edge pb->pc. + return ACROSSEDGE; + } + if (rori == 0) { + if (lori == 0) { + // pa->'endpt' is COLLINEAR with pa->pd. + esymself(*searchtet); // face bad. + enextself(*searchtet); // face [a,d,b] + return ACROSSVERT; + } + // pa->'endpt' crosses the edge pb->pd. + esymself(*searchtet); // face bad. + enextself(*searchtet); // face adb + return ACROSSEDGE; + } + if (lori == 0) { + // pa->'endpt' crosses the edge pc->pd. + eprevesymself(*searchtet); // [a,c,d] + return ACROSSEDGE; + } + // pa->'endpt' crosses the face bcd. + return ACROSSFACE; + } + } + } + + // Move to the next tet, fix pa as its origin. + if (nextmove == RMOVE) { + fnextself(*searchtet); + } else if (nextmove == LMOVE) { + eprevself(*searchtet); + fnextself(*searchtet); + enextself(*searchtet); + } else { // HMOVE + fsymself(*searchtet); + enextself(*searchtet); + } + pb = dest(*searchtet); + pc = apex(*searchtet); + + } // while (1) + +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// scoutsegment() Search an edge in the tetrahedralization. // +// // +// If the edge is found, it returns SHAREEDGE, and 'searchtet' returns the // +// edge from startpt to endpt. // +// // +// If the edge is missing, it returns either ACROSSEDGE or ACROSSFACE, which // +// indicates that the edge intersects an edge or a face. If 'refpt' is NULL,// +// 'searchtet' returns the edge or face. If 'refpt' is not NULL, it returns // +// a vertex which encroaches upon this edge, and 'searchtet' returns a tet // +// which containing 'refpt'. // +// // +// The parameter 'sedge' is used to report self-intersection. It is the // +// whose endpoints are 'startpt' and 'endpt'. It must not be a NULL. +// // +/////////////////////////////////////////////////////////////////////////////// + +enum tetgenmesh::interresult tetgenmesh::scoutsegment(point startpt,point endpt, + face *sedge, triface* searchtet, point* refpt, arraypool* intfacelist) +{ + point pd; + enum interresult dir; + int t1ver; + + if (b->verbose > 2) { + printf(" Scout seg (%d, %d).\n",pointmark(startpt),pointmark(endpt)); + } + + point2tetorg(startpt, *searchtet); + dir = finddirection(searchtet, endpt); + + if (dir == ACROSSVERT) { + pd = dest(*searchtet); + if (pd == endpt) { + if (issubseg(*searchtet)) { + report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + } + return SHAREEDGE; + } else { + // A point is on the path. + report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + return ACROSSVERT; + } + } + + // dir is either ACROSSEDGE or ACROSSFACE. + enextesymself(*searchtet); // Go to the opposite face. + fsymself(*searchtet); // Enter the adjacent tet. + + if (dir == ACROSSEDGE) { + // Check whether two segments are intersecting. + if (issubseg(*searchtet)) { + report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + } + } else if (dir == ACROSSFACE) { + if (checksubfaceflag) { + // Check whether a segment and a subface are intersecting. + if (issubface(*searchtet)) { + report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + } + } + } else { + terminatetetgen(this, 2); + } + + if (refpt == NULL) { + // Do not need a reference point. Return. + return dir; + } + + triface neightet, reftet; + point pa, pb, pc; + REAL angmax, ang; + int types[2], poss[4]; + int pos = 0, i, j; + + pa = org(*searchtet); + angmax = interiorangle(pa, startpt, endpt, NULL); + *refpt = pa; + pb = dest(*searchtet); + ang = interiorangle(pb, startpt, endpt, NULL); + if (ang > angmax) { + angmax = ang; + *refpt = pb; + } + pc = apex(*searchtet); + ang = interiorangle(pc, startpt, endpt, NULL); + if (ang > angmax) { + angmax = ang; + *refpt = pc; + } + reftet = *searchtet; // Save the tet containing the refpt. + + // Search intersecting faces along the segment. + while (1) { + + + pd = oppo(*searchtet); + + + // Stop if we meet 'endpt'. + if (pd == endpt) break; + + ang = interiorangle(pd, startpt, endpt, NULL); + if (ang > angmax) { + angmax = ang; + *refpt = pd; + reftet = *searchtet; + } + + // Find a face intersecting the segment. + if (dir == ACROSSFACE) { + // One of the three oppo faces in 'searchtet' intersects the segment. + neightet = *searchtet; + j = (neightet.ver & 3); // j is the current face number. + for (i = j + 1; i < j + 4; i++) { + neightet.ver = (i % 4); + pa = org(neightet); + pb = dest(neightet); + pc = apex(neightet); + pd = oppo(neightet); // The above point. + if (tri_edge_test(pa, pb, pc, startpt, endpt, pd, 1, types, poss)) { + dir = (enum interresult) types[0]; + pos = poss[0]; + break; + } else { + dir = DISJOINT; + pos = 0; + } + } + } else if (dir == ACROSSEDGE) { + // Check the two opposite faces (of the edge) in 'searchtet'. + for (i = 0; i < 2; i++) { + if (i == 0) { + enextesym(*searchtet, neightet); + } else { + eprevesym(*searchtet, neightet); + } + pa = org(neightet); + pb = dest(neightet); + pc = apex(neightet); + pd = oppo(neightet); // The above point. + if (tri_edge_test(pa, pb, pc, startpt, endpt, pd, 1, types, poss)) { + dir = (enum interresult) types[0]; + pos = poss[0]; + break; + } else { + dir = DISJOINT; + pos = 0; + } + } + if (dir == DISJOINT) { + // No intersection. Rotate to the next tet at the edge. + dir = ACROSSEDGE; + fnextself(*searchtet); + continue; + } + } + + if (dir == ACROSSVERT) { + // This segment passing a vertex. Choose it and return. + for (i = 0; i < pos; i++) { + enextself(neightet); + } + eprev(neightet, *searchtet); + // dest(*searchtet) lies on the segment. + report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + return ACROSSVERT; + } else if (dir == ACROSSEDGE) { + // Get the edge intersects with the segment. + for (i = 0; i < pos; i++) { + enextself(neightet); + } + } + // Go to the next tet. + fsym(neightet, *searchtet); + + if (dir == ACROSSEDGE) { + // Check whether two segments are intersecting. + if (issubseg(*searchtet)) { + report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + } + } else if (dir == ACROSSFACE) { + if (checksubfaceflag) { + // Check whether a segment and a subface are intersecting. + if (issubface(*searchtet)) { + report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + } + } + } else { + terminatetetgen(this, 2); + } + + } // while (1) + + // A valid reference point should inside the diametrial circumsphere of + // the missing segment, i.e., it encroaches upon it. + if (2.0 * angmax < PI) { + *refpt = NULL; + } + + + *searchtet = reftet; + return dir; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// getsteinerpointonsegment() Get a Steiner point on a segment. // +// // +// Return '1' if 'refpt' lies on an adjacent segment of this segment. Other- // +// wise, return '0'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::getsteinerptonsegment(face* seg, point refpt, point steinpt) +{ + point ei = sorg(*seg); + point ej = sdest(*seg); + int adjflag = 0, i; + + if (refpt != NULL) { + REAL L, L1, t; + + if (pointtype(refpt) == FREESEGVERTEX) { + face parentseg; + sdecode(point2sh(refpt), parentseg); + int sidx1 = getfacetindex(parentseg); + point far_pi = segmentendpointslist[sidx1 * 2]; + point far_pj = segmentendpointslist[sidx1 * 2 + 1]; + int sidx2 = getfacetindex(*seg); + point far_ei = segmentendpointslist[sidx2 * 2]; + point far_ej = segmentendpointslist[sidx2 * 2 + 1]; + if ((far_pi == far_ei) || (far_pj == far_ei)) { + // Create a Steiner point at the intersection of the segment + // [far_ei, far_ej] and the sphere centered at far_ei with + // radius |far_ei - refpt|. + L = distance(far_ei, far_ej); + L1 = distance(far_ei, refpt); + t = L1 / L; + for (i = 0; i < 3; i++) { + steinpt[i] = far_ei[i] + t * (far_ej[i] - far_ei[i]); + } + adjflag = 1; + } else if ((far_pi == far_ej) || (far_pj == far_ej)) { + L = distance(far_ei, far_ej); + L1 = distance(far_ej, refpt); + t = L1 / L; + for (i = 0; i < 3; i++) { + steinpt[i] = far_ej[i] + t * (far_ei[i] - far_ej[i]); + } + adjflag = 1; + } else { + // Cut the segment by the projection point of refpt. + projpt2edge(refpt, ei, ej, steinpt); + } + } else { + // Cut the segment by the projection point of refpt. + projpt2edge(refpt, ei, ej, steinpt); + } + + // Make sure that steinpt is not too close to ei and ej. + L = distance(ei, ej); + L1 = distance(steinpt, ei); + t = L1 / L; + if ((t < 0.2) || (t > 0.8)) { + // Split the point at the middle. + for (i = 0; i < 3; i++) { + steinpt[i] = ei[i] + 0.5 * (ej[i] - ei[i]); + } + } + } else { + // Split the point at the middle. + for (i = 0; i < 3; i++) { + steinpt[i] = ei[i] + 0.5 * (ej[i] - ei[i]); + } + } + + + return adjflag; +} + + + +/////////////////////////////////////////////////////////////////////////////// +// // +// delaunizesegments() Recover segments in a DT. // +// // +// All segments need to be recovered are in 'subsegstack' (Q). They will be // +// be recovered one by one (in a random order). // +// // +// Given a segment s in the Q, this routine first queries s in the DT, if s // +// matches an edge in DT, it is 'locked' at the edge. Otherwise, s is split // +// by inserting a new point p in both the DT and itself. The two new subseg- // +// ments of s are queued in Q. The process continues until Q is empty. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::delaunizesegments() +{ + triface searchtet, spintet; + face searchsh; + face sseg, *psseg; + point refpt, newpt; + enum interresult dir; + insertvertexflags ivf; + int t1ver; + + + ivf.bowywat = 1; // Use Bowyer-Watson insertion. + ivf.sloc = (int) ONEDGE; // on 'sseg'. + ivf.sbowywat = 1; // Use Bowyer-Watson insertion. + ivf.assignmeshsize = b->metric; + ivf.smlenflag = useinsertradius; // Return the closet mesh vertex. + + // Loop until 'subsegstack' is empty. + while (subsegstack->objects > 0l) { + // seglist is used as a stack. + subsegstack->objects--; + psseg = (face *) fastlookup(subsegstack, subsegstack->objects); + sseg = *psseg; + + // Check if this segment has been recovered. + sstpivot1(sseg, searchtet); + if (searchtet.tet != NULL) { + continue; // Not a missing segment. + } + + // Search the segment. + dir = scoutsegment(sorg(sseg), sdest(sseg), &sseg,&searchtet,&refpt,NULL); + + if (dir == SHAREEDGE) { + // Found this segment, insert it. + // Let the segment remember an adjacent tet. + sstbond1(sseg, searchtet); + // Bond the segment to all tets containing it. + spintet = searchtet; + do { + tssbond1(spintet, sseg); + fnextself(spintet); + } while (spintet.tet != searchtet.tet); + } else { + if ((dir == ACROSSFACE) || (dir == ACROSSEDGE)) { + // The segment is missing. Split it. + // Create a new point. + makepoint(&newpt, FREESEGVERTEX); + //setpointtype(newpt, FREESEGVERTEX); + getsteinerptonsegment(&sseg, refpt, newpt); + + // Start searching from 'searchtet'. + ivf.iloc = (int) OUTSIDE; + // Insert the new point into the tetrahedralization T. + // Missing segments and subfaces are queued for recovery. + // Note that T is convex (nonconvex = 0). + if (insertpoint(newpt, &searchtet, &searchsh, &sseg, &ivf)) { + // The new point has been inserted. + st_segref_count++; + if (steinerleft > 0) steinerleft--; + if (useinsertradius) { + save_segmentpoint_insradius(newpt, ivf.parentpt, ivf.smlen); + } + } else { + if (ivf.iloc == (int) NEARVERTEX) { + // The new point (in the segment) is very close to an existing + // vertex -- a small feature is detected. + point nearpt = org(searchtet); + if (pointtype(nearpt) == FREESEGVERTEX) { + face parentseg; + sdecode(point2sh(nearpt), parentseg); + point p1 = farsorg(sseg); + point p2 = farsdest(sseg); + point p3 = farsorg(parentseg); + point p4 = farsdest(parentseg); + printf("Two segments are very close to each other.\n"); + printf(" Segment 1: [%d, %d] #%d\n", pointmark(p1), + pointmark(p2), shellmark(sseg)); + printf(" Segment 2: [%d, %d] #%d\n", pointmark(p3), + pointmark(p4), shellmark(parentseg)); + terminatetetgen(this, 4); + } else { + terminatetetgen(this, 2); + } + } else if (ivf.iloc == (int) ONVERTEX) { + // The new point (in the segment) is coincident with an existing + // vertex -- a self-intersection is detected. + eprevself(searchtet); + report_selfint_edge(sorg(sseg), sdest(sseg), &sseg, &searchtet, + ACROSSVERT); + } else { + // An unknown case. Report a bug. + terminatetetgen(this, 2); + } + } + } else { + // An unknown case. Report a bug. + terminatetetgen(this, 2); + } + } + } // while +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// scoutsubface() Search subface in the tetrahedralization. // +// // +// 'searchsh' is searched in T. If it exists, it is 'locked' at the face in // +// T. 'searchtet' refers to the face. Otherwise, it is missing. // +// // +// The parameter 'shflag' indicates whether 'searchsh' is a boundary face or // +// not. It is possible that 'searchsh' is a temporarily subface that is used // +// as a cavity boundary face. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::scoutsubface(face* searchsh, triface* searchtet, int shflag) +{ + point pa = sorg(*searchsh); + point pb = sdest(*searchsh); + + // Get a tet whose origin is a. + point2tetorg(pa, *searchtet); + // Search the edge [a,b]. + enum interresult dir = finddirection(searchtet, pb); + if (dir == ACROSSVERT) { + // Check validity of a PLC. + if (dest(*searchtet) != pb) { + if (shflag) { + // A vertex lies on the search edge. + report_selfint_edge(pa, pb, searchsh, searchtet, dir); + } else { + terminatetetgen(this, 2); + } + } + int t1ver; + // The edge exists. Check if the face exists. + point pc = sapex(*searchsh); + // Searchtet holds edge [a,b]. Search a face with apex c. + triface spintet = *searchtet; + while (1) { + if (apex(spintet) == pc) { + // Found a face matching to 'searchsh'! + if (!issubface(spintet)) { + // Insert 'searchsh'. + tsbond(spintet, *searchsh); + fsymself(spintet); + sesymself(*searchsh); + tsbond(spintet, *searchsh); + *searchtet = spintet; + return 1; + } else { + terminatetetgen(this, 2); + } + } + fnextself(spintet); + if (spintet.tet == searchtet->tet) break; + } + } + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// formregion() Form the missing region of a missing subface. // +// // +// 'missh' is a missing subface. From it we form a missing region R which is // +// a connected region formed by a set of missing subfaces of a facet. // +// Comment: There should be no segment inside R. // +// // +// 'missingshs' returns the list of subfaces in R. All subfaces in this list // +// are oriented as the 'missh'. 'missingshbds' returns the list of boundary // +// edges (tetrahedral handles) of R. 'missingshverts' returns all vertices // +// of R. They are all pmarktested. // +// // +// Except the first one (which is 'missh') in 'missingshs', each subface in // +// this list represents an internal edge of R, i.e., it is missing in the // +// tetrahedralization. Since R may contain interior vertices, not all miss- // +// ing edges can be found by this way. // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::formregion(face* missh, arraypool* missingshs, + arraypool* missingshbds, arraypool* missingshverts) +{ + triface searchtet, spintet; + face neighsh, *parysh; + face neighseg, fakeseg; + point pa, pb, *parypt; + enum interresult dir; + int t1ver; + int i, j; + + smarktest(*missh); + missingshs->newindex((void **) &parysh); + *parysh = *missh; + + // Incrementally find other missing subfaces. + for (i = 0; i < missingshs->objects; i++) { + missh = (face *) fastlookup(missingshs, i); + for (j = 0; j < 3; j++) { + pa = sorg(*missh); + pb = sdest(*missh); + point2tetorg(pa, searchtet); + dir = finddirection(&searchtet, pb); + if (dir != ACROSSVERT) { + // This edge is missing. Its neighbor is a missing subface. + spivot(*missh, neighsh); + if (!smarktested(neighsh)) { + // Adjust the face orientation. + if (sorg(neighsh) != pb) sesymself(neighsh); + smarktest(neighsh); + missingshs->newindex((void **) &parysh); + *parysh = neighsh; + } + } else { + if (dest(searchtet) != pb) { + // Report a PLC problem. + report_selfint_edge(pa, pb, missh, &searchtet, dir); + } + } + // Collect the vertices of R. + if (!pmarktested(pa)) { + pmarktest(pa); + missingshverts->newindex((void **) &parypt); + *parypt = pa; + } + senextself(*missh); + } // j + } // i + + // Get the boundary edges of R. + for (i = 0; i < missingshs->objects; i++) { + missh = (face *) fastlookup(missingshs, i); + for (j = 0; j < 3; j++) { + spivot(*missh, neighsh); + if ((neighsh.sh == NULL) || !smarktested(neighsh)) { + // A boundary edge of R. + // Let the segment point to the adjacent tet. + point2tetorg(sorg(*missh), searchtet); + finddirection(&searchtet, sdest(*missh)); + missingshbds->newindex((void **) &parysh); + *parysh = *missh; + // Check if this edge is a segment. + sspivot(*missh, neighseg); + if (neighseg.sh == NULL) { + // Temporarily create a segment at this edge. + makeshellface(subsegs, &fakeseg); + setsorg(fakeseg, sorg(*missh)); + setsdest(fakeseg, sdest(*missh)); + sinfect(fakeseg); // Mark it as faked. + // Connect it to all tets at this edge. + spintet = searchtet; + while (1) { + tssbond1(spintet, fakeseg); + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + neighseg = fakeseg; + } + // Let the segment and the boundary edge point to each other. + ssbond(*missh, neighseg); + sstbond1(neighseg, searchtet); + } + senextself(*missh); + } // j + } // i + + + // Unmarktest collected missing subfaces. + for (i = 0; i < missingshs->objects; i++) { + parysh = (face *) fastlookup(missingshs, i); + sunmarktest(*parysh); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// scoutcrossedge() Search an edge that crosses the missing region. // +// // +// Return 1 if a crossing edge is found. It is returned by 'crosstet'. More- // +// over, the edge is oriented such that its origin lies below R. Return 0 // +// if no such edge is found. // +// // +// Assumption: All vertices of the missing region are marktested. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::scoutcrossedge(triface& crosstet, arraypool* missingshbds, + arraypool* missingshs) +{ + triface searchtet, spintet, neightet; + face oldsh, searchsh, *parysh; + face neighseg; + point pa, pb, pc, pd, pe; + REAL ori; + int types[2], poss[4]; + int searchflag, interflag; + int t1ver; + int i, j; + + searchflag = 0; + + // Search the first new subface to fill the region. + for (i = 0; i < missingshbds->objects && !searchflag; i++) { + parysh = (face *) fastlookup(missingshbds, i); + sspivot(*parysh, neighseg); + sstpivot1(neighseg, searchtet); + if (org(searchtet) != sorg(*parysh)) { + esymself(searchtet); + } + spintet = searchtet; + while (1) { + if (pmarktested(apex(spintet))) { + // A possible interior face. + neightet = spintet; + oldsh = *parysh; + // Try to recover an interior edge. + for (j = 0; j < 2; j++) { + enextself(neightet); + if (!issubseg(neightet)) { + if (j == 0) { + senext(oldsh, searchsh); + } else { + senext2(oldsh, searchsh); + sesymself(searchsh); + esymself(neightet); + } + // Calculate a lifted point. + pa = sorg(searchsh); + pb = sdest(searchsh); + pc = sapex(searchsh); + pd = dest(neightet); + calculateabovepoint4(pa, pb, pc, pd); + // The lifted point must lie above 'searchsh'. + ori = orient3d(pa, pb, pc, dummypoint); + if (ori > 0) { + sesymself(searchsh); + senextself(searchsh); + } else if (ori == 0) { + terminatetetgen(this, 2); + } + if (sscoutsegment(&searchsh,dest(neightet),0,0,1)==SHAREEDGE) { + // Insert a temp segment to protect the recovered edge. + face tmpseg; + makeshellface(subsegs, &tmpseg); + ssbond(searchsh, tmpseg); + spivotself(searchsh); + ssbond(searchsh, tmpseg); + // Recover locally Delaunay edges. + lawsonflip(); + // Delete the tmp segment. + spivot(tmpseg, searchsh); + ssdissolve(searchsh); + spivotself(searchsh); + ssdissolve(searchsh); + shellfacedealloc(subsegs, tmpseg.sh); + searchflag = 1; + } else { + // Undo the performed flips. + if (flipstack != NULL) { + lawsonflip(); + } + } + break; + } // if (!issubseg(neightet)) + } // j + if (searchflag) break; + } // if (pmarktested(apex(spintet))) + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + } // i + + if (searchflag) { + // Remove faked segments. + face checkseg; + // Remark: We should not use the array 'missingshbds', since the flips may + // change the subfaces. We search them from the subfaces in R. + for (i = 0; i < missingshs->objects; i++) { + parysh = (face *) fastlookup(missingshs, i); + oldsh = *parysh; + for (j = 0; j < 3; j++) { + if (isshsubseg(oldsh)) { + sspivot(oldsh, checkseg); + if (sinfected(checkseg)) { + // It's a faked segment. Delete it. + sstpivot1(checkseg, searchtet); + spintet = searchtet; + while (1) { + tssdissolve1(spintet); + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + shellfacedealloc(subsegs, checkseg.sh); + ssdissolve(oldsh); + } + } + senextself(oldsh); + } // j + } + + fillregioncount++; + + return 0; + } // if (i < missingshbds->objects) + + searchflag = -1; + + for (j = 0; j < missingshbds->objects && (searchflag == -1); j++) { + parysh = (face *) fastlookup(missingshbds, j); + sspivot(*parysh, neighseg); + sstpivot1(neighseg, searchtet); + interflag = 0; + // Let 'spintet' be [#,#,d,e] where [#,#] is the boundary edge of R. + spintet = searchtet; + while (1) { + pd = apex(spintet); + pe = oppo(spintet); + // Skip a hull edge. + if ((pd != dummypoint) && (pe != dummypoint)) { + // Skip an edge containing a vertex of R. + if (!pmarktested(pd) && !pmarktested(pe)) { + // Check if [d,e] intersects R. + for (i = 0; i < missingshs->objects && !interflag; i++) { + parysh = (face *) fastlookup(missingshs, i); + pa = sorg(*parysh); + pb = sdest(*parysh); + pc = sapex(*parysh); + interflag=tri_edge_test(pa, pb, pc, pd, pe, NULL, 1, types, poss); + if (interflag > 0) { + if (interflag == 2) { + // They intersect at a single point. + if ((types[0] == (int) ACROSSFACE) || + (types[0] == (int) ACROSSEDGE)) { + // Go to the crossing edge [d,e,#,#]. + edestoppo(spintet, crosstet); // // [d,e,#,#]. + if (issubseg(crosstet)) { + // It is a segment. Report a PLC problem. + report_selfint_face(pa, pb, pc, parysh, &crosstet, + interflag, types, poss); + } else { + triface chkface = crosstet; + while (1) { + if (issubface(chkface)) break; + fsymself(chkface); + if (chkface.tet == crosstet.tet) break; + } + if (issubface(chkface)) { + // Two subfaces are intersecting. + report_selfint_face(pa, pb, pc, parysh, &chkface, + interflag, types, poss); + } + } + // Adjust the edge such that d lies below [a,b,c]. + ori = orient3d(pa, pb, pc, pd); + if (ori < 0) { + esymself(crosstet); + } + searchflag = 1; + } else { + // An improper intersection type, ACROSSVERT, TOUCHFACE, + // TOUCHEDGE, SHAREVERT, ... + // Maybe it is due to a PLC problem. + report_selfint_face(pa, pb, pc, parysh, &crosstet, + interflag, types, poss); + } + } + break; + } // if (interflag > 0) + } + } + } + // Leave search at this bdry edge if an intersection is found. + if (interflag > 0) break; + // Go to the next tetrahedron. + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } // while (1) + } // j + + return searchflag; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// formcavity() Form the cavity of a missing region. // +// // +// The missing region R is formed by a set of missing subfaces 'missingshs'. // +// In the following, we assume R is horizontal and oriented. (All subfaces // +// of R are oriented in the same way.) 'searchtet' is a tetrahedron [d,e,#, // +// #] which intersects R in its interior, where the edge [d,e] intersects R, // +// and d lies below R. // +// // +// 'crosstets' returns the set of crossing tets. Every tet in it has the // +// form [d,e,#,#] where [d,e] is a crossing edge, and d lies below R. The // +// set of tets form the cavity C, which is divided into two parts by R, one // +// at top and one at bottom. 'topfaces' and 'botfaces' return the upper and // +// lower boundary faces of C. 'toppoints' contains vertices of 'crosstets' // +// in the top part of C, and so does 'botpoints'. Both 'toppoints' and // +// 'botpoints' contain vertices of R. // +// // +// Important: This routine assumes all vertices of the facet containing this // +// subface are marked, i.e., pmarktested(p) returns true. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenmesh::formcavity(triface* searchtet, arraypool* missingshs, + arraypool* crosstets, arraypool* topfaces, + arraypool* botfaces, arraypool* toppoints, + arraypool* botpoints) +{ + arraypool *crossedges; + triface spintet, neightet, chkface, *parytet; + face *parysh = NULL; + point pa, pd, pe, *parypt; + bool testflag, invalidflag; + int intflag, types[2], poss[4]; + int t1ver; + int i, j, k; + + // Temporarily re-use 'topfaces' for all crossing edges. + crossedges = topfaces; + + if (b->verbose > 2) { + printf(" Form the cavity of a missing region.\n"); + } + // Mark this edge to avoid testing it later. + markedge(*searchtet); + crossedges->newindex((void **) &parytet); + *parytet = *searchtet; + + invalidflag = 0; + // Collect all crossing tets. Each cross tet is saved in the standard + // form [d,e,#,#], where [d,e] is a crossing edge, d lies below R. + // NEITHER d NOR e is a vertex of R (!pmarktested). + for (i = 0; i < crossedges->objects && !invalidflag; i++) { + // Get a crossing edge [d,e,#,#]. + searchtet = (triface *) fastlookup(crossedges, i); + // Sort vertices into the bottom and top arrays. + pd = org(*searchtet); + if (!pinfected(pd)) { + pinfect(pd); + botpoints->newindex((void **) &parypt); + *parypt = pd; + } + pe = dest(*searchtet); + if (!pinfected(pe)) { + pinfect(pe); + toppoints->newindex((void **) &parypt); + *parypt = pe; + } + + // All tets sharing this edge are crossing tets. + spintet = *searchtet; + while (1) { + if (!infected(spintet)) { + infect(spintet); + crosstets->newindex((void **) &parytet); + *parytet = spintet; + } + // Go to the next crossing tet. + fnextself(spintet); + if (spintet.tet == searchtet->tet) break; + } // while (1) + + // Detect new crossing edges. + spintet = *searchtet; + while (1) { + // spintet is [d,e,a,#], where d lies below R, and e lies above R. + pa = apex(spintet); + if (pa != dummypoint) { + if (!pmarktested(pa)) { + // There exists a crossing edge, either [e,a] or [a,d]. First check + // if the crossing edge has already be added, i.e.,to check if one + // of the tetrahedron at this edge has been marked. + testflag = true; + for (j = 0; j < 2 && testflag; j++) { + if (j == 0) { + enext(spintet, neightet); + } else { + eprev(spintet, neightet); + } + while (1) { + if (edgemarked(neightet)) { + // This crossing edge has already been tested. Skip it. + testflag = false; + break; + } + fnextself(neightet); + if (neightet.tet == spintet.tet) break; + } + } // j + if (testflag) { + // Test if [e,a] or [a,d] intersects R. + // Do a brute-force search in the set of subfaces of R. Slow! + // Need to be improved! + pd = org(spintet); + pe = dest(spintet); + for (k = 0; k < missingshs->objects; k++) { + parysh = (face *) fastlookup(missingshs, k); + intflag = tri_edge_test(sorg(*parysh), sdest(*parysh), + sapex(*parysh), pe, pa, NULL, 1, types, poss); + if (intflag > 0) { + // Found intersection. 'a' lies below R. + if (intflag == 2) { + enext(spintet, neightet); + if ((types[0] == (int) ACROSSFACE) || + (types[0] == (int) ACROSSEDGE)) { + // Only this case is valid. + } else { + // A non-valid intersection. Maybe a PLC problem. + invalidflag = 1; + } + } else { + // Coplanar intersection. Maybe a PLC problem. + invalidflag = 1; + } + break; + } + intflag = tri_edge_test(sorg(*parysh), sdest(*parysh), + sapex(*parysh), pa, pd, NULL, 1, types, poss); + if (intflag > 0) { + // Found intersection. 'a' lies above R. + if (intflag == 2) { + eprev(spintet, neightet); + if ((types[0] == (int) ACROSSFACE) || + (types[0] == (int) ACROSSEDGE)) { + // Only this case is valid. + } else { + // A non-valid intersection. Maybe a PLC problem. + invalidflag = 1; + } + } else { + // Coplanar intersection. Maybe a PLC problem. + invalidflag = 1; + } + break; + } + } // k + if (k < missingshs->objects) { + // Found a pair of triangle - edge intersection. + if (invalidflag) { + break; // the while (1) loop + } + // Adjust the edge direction, so that its origin lies below R, + // and its destination lies above R. + esymself(neightet); + // This edge may be a segment. + if (issubseg(neightet)) { + report_selfint_face(sorg(*parysh), sdest(*parysh), + sapex(*parysh),parysh,&neightet,intflag,types,poss); + } + // Check if it is an edge of a subface. + chkface = neightet; + while (1) { + if (issubface(chkface)) break; + fsymself(chkface); + if (chkface.tet == neightet.tet) break; + } + if (issubface(chkface)) { + // Two subfaces are intersecting. + report_selfint_face(sorg(*parysh), sdest(*parysh), + sapex(*parysh),parysh,&chkface,intflag,types,poss); + } + + // Mark this edge to avoid testing it again. + markedge(neightet); + crossedges->newindex((void **) &parytet); + *parytet = neightet; + } else { + // No intersection is found. It may be a PLC problem. + invalidflag = 1; + break; // the while (1) loop + } // if (k == missingshs->objects) + } // if (testflag) + } + } // if (pa != dummypoint) + // Go to the next crossing tet. + fnextself(spintet); + if (spintet.tet == searchtet->tet) break; + } // while (1) + } // i + + // Unmark all marked edges. + for (i = 0; i < crossedges->objects; i++) { + searchtet = (triface *) fastlookup(crossedges, i); + unmarkedge(*searchtet); + } + crossedges->restart(); + + + if (invalidflag) { + // Unmark all collected tets. + for (i = 0; i < crosstets->objects; i++) { + searchtet = (triface *) fastlookup(crosstets, i); + uninfect(*searchtet); + } + // Unmark all collected vertices. + for (i = 0; i < botpoints->objects; i++) { + parypt = (point *) fastlookup(botpoints, i); + puninfect(*parypt); + } + for (i = 0; i < toppoints->objects; i++) { + parypt = (point *) fastlookup(toppoints, i); + puninfect(*parypt); + } + crosstets->restart(); + botpoints->restart(); + toppoints->restart(); + + // Randomly split an interior edge of R. + i = randomnation(missingshs->objects - 1); + recentsh = * (face *) fastlookup(missingshs, i); + return false; + } + + if (b->verbose > 2) { + printf(" Formed cavity: %ld (%ld) cross tets (edges).\n", + crosstets->objects, crossedges->objects); + } + + // Collect the top and bottom faces and the middle vertices. Since all top + // and bottom vertices have been infected. Uninfected vertices must be + // middle vertices (i.e., the vertices of R). + // NOTE 1: Hull tets may be collected. Process them as a normal one. + // NOTE 2: Some previously recovered subfaces may be completely inside the + // cavity. In such case, we remove these subfaces from the cavity and put + // them into 'subfacstack'. They will be recovered later. + // NOTE 3: Some segments may be completely inside the cavity, e.g., they + // attached to a subface which is inside the cavity. Such segments are + // put in 'subsegstack'. They will be recovered later. + // NOTE4 : The interior subfaces and segments mentioned in NOTE 2 and 3 + // are identified in the routine "carvecavity()". + + for (i = 0; i < crosstets->objects; i++) { + searchtet = (triface *) fastlookup(crosstets, i); + // searchtet is [d,e,a,b]. + eorgoppo(*searchtet, spintet); + fsym(spintet, neightet); // neightet is [a,b,e,#] + if (!infected(neightet)) { + // A top face. + topfaces->newindex((void **) &parytet); + *parytet = neightet; + } + edestoppo(*searchtet, spintet); + fsym(spintet, neightet); // neightet is [b,a,d,#] + if (!infected(neightet)) { + // A bottom face. + botfaces->newindex((void **) &parytet); + *parytet = neightet; + } + // Add middle vertices if there are (skip dummypoint). + pa = org(neightet); + if (!pinfected(pa)) { + if (pa != dummypoint) { + pinfect(pa); + botpoints->newindex((void **) &parypt); + *parypt = pa; + toppoints->newindex((void **) &parypt); + *parypt = pa; + } + } + pa = dest(neightet); + if (!pinfected(pa)) { + if (pa != dummypoint) { + pinfect(pa); + botpoints->newindex((void **) &parypt); + *parypt = pa; + toppoints->newindex((void **) &parypt); + *parypt = pa; + } + } + } // i + + // Uninfect all collected top, bottom, and middle vertices. + for (i = 0; i < toppoints->objects; i++) { + parypt = (point *) fastlookup(toppoints, i); + puninfect(*parypt); + } + for (i = 0; i < botpoints->objects; i++) { + parypt = (point *) fastlookup(botpoints, i); + puninfect(*parypt); + } + cavitycount++; + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// delaunizecavity() Fill a cavity by Delaunay tetrahedra. // +// // +// The cavity C to be tetrahedralized is the top or bottom part of a whole // +// cavity. 'cavfaces' contains the boundary faces of C. NOTE: faces in 'cav- // +// faces' do not form a closed polyhedron. The "open" side are subfaces of // +// the missing facet. These faces will be recovered later in fillcavity(). // +// // +// This routine first constructs the DT of the vertices. Then it identifies // +// the half boundary faces of the cavity in DT. Possiblely the cavity C will // +// be enlarged. // +// // +// The DT is returned in 'newtets'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::delaunizecavity(arraypool *cavpoints, arraypool *cavfaces, + arraypool *cavshells, arraypool *newtets, + arraypool *crosstets, arraypool *misfaces) +{ + triface searchtet, neightet, *parytet, *parytet1; + face tmpsh, *parysh; + point pa, pb, pc, pd, pt[3], *parypt; + insertvertexflags ivf; + REAL ori; + long baknum, bakhullsize; + int bakchecksubsegflag, bakchecksubfaceflag; + int t1ver; + int i, j; + + if (b->verbose > 2) { + printf(" Delaunizing cavity: %ld points, %ld faces.\n", + cavpoints->objects, cavfaces->objects); + } + // Remember the current number of crossing tets. It may be enlarged later. + baknum = crosstets->objects; + bakhullsize = hullsize; + bakchecksubsegflag = checksubsegflag; + bakchecksubfaceflag = checksubfaceflag; + hullsize = 0l; + checksubsegflag = 0; + checksubfaceflag = 0; + b->verbose--; // Suppress informations for creating Delaunay tetra. + b->plc = 0; // Do not check near vertices. + + ivf.bowywat = 1; // Use Bowyer-Watson algorithm. + + // Get four non-coplanar points (no dummypoint). + pa = pb = pc = NULL; + for (i = 0; i < cavfaces->objects; i++) { + parytet = (triface *) fastlookup(cavfaces, i); + parytet->ver = epivot[parytet->ver]; + if (apex(*parytet) != dummypoint) { + pa = org(*parytet); + pb = dest(*parytet); + pc = apex(*parytet); + break; + } + } + pd = NULL; + for (; i < cavfaces->objects; i++) { + parytet = (triface *) fastlookup(cavfaces, i); + pt[0] = org(*parytet); + pt[1] = dest(*parytet); + pt[2] = apex(*parytet); + for (j = 0; j < 3; j++) { + if (pt[j] != dummypoint) { // Do not include a hull point. + ori = orient3d(pa, pb, pc, pt[j]); + if (ori != 0) { + pd = pt[j]; + if (ori > 0) { // Swap pa and pb. + pt[j] = pa; pa = pb; pb = pt[j]; + } + break; + } + } + } + if (pd != NULL) break; + } + + // Create an init DT. + initialdelaunay(pa, pb, pc, pd); + + // Incrementally insert the vertices (duplicated vertices are ignored). + for (i = 0; i < cavpoints->objects; i++) { + pt[0] = * (point *) fastlookup(cavpoints, i); + searchtet = recenttet; + ivf.iloc = (int) OUTSIDE; + insertpoint(pt[0], &searchtet, NULL, NULL, &ivf); + } + + if (b->verbose > 2) { + printf(" Identifying %ld boundary faces of the cavity.\n", + cavfaces->objects); + } + + while (1) { + + // Identify boundary faces. Mark interior tets. Save missing faces. + for (i = 0; i < cavfaces->objects; i++) { + parytet = (triface *) fastlookup(cavfaces, i); + // Skip an interior face (due to the enlargement of the cavity). + if (infected(*parytet)) continue; + parytet->ver = epivot[parytet->ver]; + pt[0] = org(*parytet); + pt[1] = dest(*parytet); + pt[2] = apex(*parytet); + // Create a temp subface. + makeshellface(subfaces, &tmpsh); + setshvertices(tmpsh, pt[0], pt[1], pt[2]); + // Insert tmpsh in DT. + searchtet.tet = NULL; + if (scoutsubface(&tmpsh, &searchtet, 0)) { // shflag = 0 + // Inserted! 'tmpsh' must face toward the inside of the cavity. + // Remember the boundary tet (outside the cavity) in tmpsh + // (use the adjacent tet slot). + tmpsh.sh[0] = (shellface) encode(*parytet); + // Save this subface. + cavshells->newindex((void **) &parysh); + *parysh = tmpsh; + } + else { + // This boundary face is missing. + shellfacedealloc(subfaces, tmpsh.sh); + // Save this face in list. + misfaces->newindex((void **) &parytet1); + *parytet1 = *parytet; + } + } // i + + if (misfaces->objects > 0) { + if (b->verbose > 2) { + printf(" Enlarging the cavity. %ld missing bdry faces\n", + misfaces->objects); + } + + // Removing all temporary subfaces. + for (i = 0; i < cavshells->objects; i++) { + parysh = (face *) fastlookup(cavshells, i); + stpivot(*parysh, neightet); + tsdissolve(neightet); // Detach it from adj. tets. + fsymself(neightet); + tsdissolve(neightet); + shellfacedealloc(subfaces, parysh->sh); + } + cavshells->restart(); + + // Infect the points which are of the cavity. + for (i = 0; i < cavpoints->objects; i++) { + pt[0] = * (point *) fastlookup(cavpoints, i); + pinfect(pt[0]); // Mark it as inserted. + } + + // Enlarge the cavity. + for (i = 0; i < misfaces->objects; i++) { + // Get a missing face. + parytet = (triface *) fastlookup(misfaces, i); + if (!infected(*parytet)) { + // Put it into crossing tet list. + infect(*parytet); + crosstets->newindex((void **) &parytet1); + *parytet1 = *parytet; + // Insert the opposite point if it is not in DT. + pd = oppo(*parytet); + if (!pinfected(pd)) { + searchtet = recenttet; + ivf.iloc = (int) OUTSIDE; + insertpoint(pd, &searchtet, NULL, NULL, &ivf); + pinfect(pd); + cavpoints->newindex((void **) &parypt); + *parypt = pd; + } + // Add three opposite faces into the boundary list. + for (j = 0; j < 3; j++) { + esym(*parytet, neightet); + fsymself(neightet); + if (!infected(neightet)) { + cavfaces->newindex((void **) &parytet1); + *parytet1 = neightet; + } + enextself(*parytet); + } // j + } // if (!infected(parytet)) + } // i + + // Uninfect the points which are of the cavity. + for (i = 0; i < cavpoints->objects; i++) { + pt[0] = * (point *) fastlookup(cavpoints, i); + puninfect(pt[0]); + } + + misfaces->restart(); + continue; + } // if (misfaces->objects > 0) + + break; + + } // while (1) + + // Collect all tets of the DT. All new tets are marktested. + marktest(recenttet); + newtets->newindex((void **) &parytet); + *parytet = recenttet; + for (i = 0; i < newtets->objects; i++) { + searchtet = * (triface *) fastlookup(newtets, i); + for (j = 0; j < 4; j++) { + decode(searchtet.tet[j], neightet); + if (!marktested(neightet)) { + marktest(neightet); + newtets->newindex((void **) &parytet); + *parytet = neightet; + } + } + } + + cavpoints->restart(); + cavfaces->restart(); + + if (crosstets->objects > baknum) { + // The cavity has been enlarged. + cavityexpcount++; + } + + // Restore the original values. + hullsize = bakhullsize; + checksubsegflag = bakchecksubsegflag; + checksubfaceflag = bakchecksubfaceflag; + b->verbose++; + b->plc = 1; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// fillcavity() Fill new tets into the cavity. // +// // +// The new tets are stored in two disjoint sets(which share the same facet). // +// 'topfaces' and 'botfaces' are the boundaries of these two sets, respect- // +// ively. 'midfaces' is empty on input, and will store faces in the facet. // +// // +// Important: This routine assumes all vertices of the missing region R are // +// marktested, i.e., pmarktested(p) returns true. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenmesh::fillcavity(arraypool* topshells, arraypool* botshells, + arraypool* midfaces, arraypool* missingshs, + arraypool* topnewtets, arraypool* botnewtets, + triface* crossedge) +{ + arraypool *cavshells; + triface bdrytet, neightet, *parytet; + triface searchtet, spintet; + face *parysh; + face checkseg; + point pa, pb, pc; + bool mflag; + int t1ver; + int i, j; + + // Connect newtets to tets outside the cavity. These connections are needed + // for identifying the middle faces (which belong to R). + for (j = 0; j < 2; j++) { + cavshells = (j == 0 ? topshells : botshells); + if (cavshells != NULL) { + for (i = 0; i < cavshells->objects; i++) { + // Get a temp subface. + parysh = (face *) fastlookup(cavshells, i); + // Get the boundary tet outside the cavity (saved in sh[0]). + decode(parysh->sh[0], bdrytet); + pa = org(bdrytet); + pb = dest(bdrytet); + pc = apex(bdrytet); + // Get the adjacent new tet inside the cavity. + stpivot(*parysh, neightet); + // Mark neightet as an interior tet of this cavity. + infect(neightet); + // Connect the two tets (the old connections are replaced). + bond(bdrytet, neightet); + tsdissolve(neightet); // Clear the pointer to tmpsh. + // Update the point-to-tets map. + setpoint2tet(pa, (tetrahedron) neightet.tet); + setpoint2tet(pb, (tetrahedron) neightet.tet); + setpoint2tet(pc, (tetrahedron) neightet.tet); + } // i + } // if (cavshells != NULL) + } // j + + if (crossedge != NULL) { + // Glue top and bottom tets at their common facet. + triface toptet, bottet, spintet, *midface; + point pd, pe; + REAL ori; + int types[2], poss[4]; + int interflag; + int bflag; + + mflag = false; + pd = org(*crossedge); + pe = dest(*crossedge); + + // Search the first (middle) face in R. + // Since R may be non-convex, we must make sure that the face is in the + // interior of R. We search a face in 'topnewtets' whose three vertices + // are on R and it intersects 'crossedge' in its interior. Then search + // a matching face in 'botnewtets'. + for (i = 0; i < topnewtets->objects && !mflag; i++) { + searchtet = * (triface *) fastlookup(topnewtets, i); + for (searchtet.ver = 0; searchtet.ver < 4 && !mflag; searchtet.ver++) { + pa = org(searchtet); + if (pmarktested(pa)) { + pb = dest(searchtet); + if (pmarktested(pb)) { + pc = apex(searchtet); + if (pmarktested(pc)) { + // Check if this face intersects [d,e]. + interflag = tri_edge_test(pa,pb,pc,pd,pe,NULL,1,types,poss); + if (interflag == 2) { + // They intersect at a single point. Found. + toptet = searchtet; + // The face lies in the interior of R. + // Get the tet (in topnewtets) which lies above R. + ori = orient3d(pa, pb, pc, pd); + if (ori < 0) { + fsymself(toptet); + pa = org(toptet); + pb = dest(toptet); + } else if (ori == 0) { + terminatetetgen(this, 2); + } + // Search the face [b,a,c] in 'botnewtets'. + for (j = 0; j < botnewtets->objects; j++) { + neightet = * (triface *) fastlookup(botnewtets, j); + // Is neightet contains 'b'. + if ((point) neightet.tet[4] == pb) { + neightet.ver = 11; + } else if ((point) neightet.tet[5] == pb) { + neightet.ver = 3; + } else if ((point) neightet.tet[6] == pb) { + neightet.ver = 7; + } else if ((point) neightet.tet[7] == pb) { + neightet.ver = 0; + } else { + continue; + } + // Is the 'neightet' contains edge [b,a]. + if (dest(neightet) == pa) { + // 'neightet' is just the edge. + } else if (apex(neightet) == pa) { + eprevesymself(neightet); + } else if (oppo(neightet) == pa) { + esymself(neightet); + enextself(neightet); + } else { + continue; + } + // Is 'neightet' the face [b,a,c]. + if (apex(neightet) == pc) { + bottet = neightet; + mflag = true; + break; + } + } // j + } // if (interflag == 2) + } // pc + } // pb + } // pa + } // toptet.ver + } // i + + if (mflag) { + // Found a pair of matched faces in 'toptet' and 'bottet'. + bond(toptet, bottet); + // Both are interior tets. + infect(toptet); + infect(bottet); + // Add this face into search list. + markface(toptet); + midfaces->newindex((void **) &parytet); + *parytet = toptet; + } else { + // No pair of 'toptet' and 'bottet'. + toptet.tet = NULL; + // Randomly split an interior edge of R. + i = randomnation(missingshs->objects - 1); + recentsh = * (face *) fastlookup(missingshs, i); + } + + // Find other middle faces, connect top and bottom tets. + for (i = 0; i < midfaces->objects && mflag; i++) { + // Get a matched middle face [a, b, c] + midface = (triface *) fastlookup(midfaces, i); + // Check the neighbors at the edges of this face. + for (j = 0; j < 3 && mflag; j++) { + toptet = *midface; + bflag = false; + while (1) { + // Go to the next face in the same tet. + esymself(toptet); + pc = apex(toptet); + if (pmarktested(pc)) { + break; // Find a subface. + } + if (pc == dummypoint) { + terminatetetgen(this, 2); // Check this case. + break; // Find a subface. + } + // Go to the adjacent tet. + fsymself(toptet); + // Do we walk outside the cavity? + if (!marktested(toptet)) { + // Yes, the adjacent face is not a middle face. + bflag = true; break; + } + } + if (!bflag) { + if (!facemarked(toptet)) { + fsym(*midface, bottet); + spintet = bottet; + while (1) { + esymself(bottet); + pd = apex(bottet); + if (pd == pc) break; // Face matched. + fsymself(bottet); + if (bottet.tet == spintet.tet) { + // Not found a matched bottom face. + mflag = false; + break; + } + } // while (1) + if (mflag) { + if (marktested(bottet)) { + // Connect two tets together. + bond(toptet, bottet); + // Both are interior tets. + infect(toptet); + infect(bottet); + // Add this face into list. + markface(toptet); + midfaces->newindex((void **) &parytet); + *parytet = toptet; + } + else { + // The 'bottet' is not inside the cavity! + terminatetetgen(this, 2); // Check this case + } + } else { // mflag == false + // Adjust 'toptet' and 'bottet' to be the crossing edges. + fsym(*midface, bottet); + spintet = bottet; + while (1) { + esymself(bottet); + pd = apex(bottet); + if (pmarktested(pd)) { + // assert(pd != pc); + // Let 'toptet' be [a,b,c,#], and 'bottet' be [b,a,d,*]. + // Adjust 'toptet' and 'bottet' to be the crossing edges. + // Test orient3d(b,c,#,d). + ori = orient3d(dest(toptet), pc, oppo(toptet), pd); + if (ori < 0) { + // Edges [a,d] and [b,c] cross each other. + enextself(toptet); // [b,c] + enextself(bottet); // [a,d] + } else if (ori > 0) { + // Edges [a,c] and [b,d] cross each other. + eprevself(toptet); // [c,a] + eprevself(bottet); // [d,b] + } else { + // b,c,#,and d are coplanar!. + terminatetetgen(this, 2); //assert(0); + } + break; // Not matched + } + fsymself(bottet); + } + } // if (!mflag) + } // if (!facemarked(toptet)) + } // if (!bflag) + enextself(*midface); + } // j + } // i + + if (mflag) { + if (b->verbose > 2) { + printf(" Found %ld middle subfaces.\n", midfaces->objects); + } + face oldsh, newsh, casout, casin, neighsh; + + oldsh = * (face *) fastlookup(missingshs, 0); + + // Create new subfaces to fill the region R. + for (i = 0; i < midfaces->objects; i++) { + // Get a matched middle face [a, b, c] + midface = (triface *) fastlookup(midfaces, i); + unmarkface(*midface); + makeshellface(subfaces, &newsh); + setsorg(newsh, org(*midface)); + setsdest(newsh, dest(*midface)); + setsapex(newsh, apex(*midface)); + // The new subface gets its markers from the old one. + setshellmark(newsh, shellmark(oldsh)); + if (checkconstraints) { + setareabound(newsh, areabound(oldsh)); + } + if (useinsertradius) { + setfacetindex(newsh, getfacetindex(oldsh)); + } + // Connect the new subface to adjacent tets. + tsbond(*midface, newsh); + fsym(*midface, neightet); + sesymself(newsh); + tsbond(neightet, newsh); + } + + // Connect new subfaces together and to the bdry of R. + // Delete faked segments. + for (i = 0; i < midfaces->objects; i++) { + // Get a matched middle face [a, b, c] + midface = (triface *) fastlookup(midfaces, i); + for (j = 0; j < 3; j++) { + tspivot(*midface, newsh); + spivot(newsh, casout); + if (casout.sh == NULL) { + // Search its neighbor. + fnext(*midface, searchtet); + while (1) { + // (1) First check if this side is a bdry edge of R. + tsspivot1(searchtet, checkseg); + if (checkseg.sh != NULL) { + // It's a bdry edge of R. + // Get the old subface. + checkseg.shver = 0; + spivot(checkseg, oldsh); + if (sinfected(checkseg)) { + // It's a faked segment. Delete it. + spintet = searchtet; + while (1) { + tssdissolve1(spintet); + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + shellfacedealloc(subsegs, checkseg.sh); + ssdissolve(oldsh); + checkseg.sh = NULL; + } + spivot(oldsh, casout); + if (casout.sh != NULL) { + casin = casout; + if (checkseg.sh != NULL) { + // Make sure that the subface has the right ori at the + // segment. + checkseg.shver = 0; + if (sorg(newsh) != sorg(checkseg)) { + sesymself(newsh); + } + spivot(casin, neighsh); + while (neighsh.sh != oldsh.sh) { + casin = neighsh; + spivot(casin, neighsh); + } + } + sbond1(newsh, casout); + sbond1(casin, newsh); + } + if (checkseg.sh != NULL) { + ssbond(newsh, checkseg); + } + break; + } // if (checkseg.sh != NULL) + // (2) Second check if this side is an interior edge of R. + tspivot(searchtet, neighsh); + if (neighsh.sh != NULL) { + // Found an adjacent subface of newsh (an interior edge). + sbond(newsh, neighsh); + break; + } + fnextself(searchtet); + } // while (1) + } // if (casout.sh == NULL) + enextself(*midface); + } // j + } // i + + // Delete old subfaces. + for (i = 0; i < missingshs->objects; i++) { + parysh = (face *) fastlookup(missingshs, i); + shellfacedealloc(subfaces, parysh->sh); + } + } else { + if (toptet.tet != NULL) { + // Faces at top and bottom are not matched. + // Choose a Steiner point in R. + // Split one of the crossing edges. + pa = org(toptet); + pb = dest(toptet); + pc = org(bottet); + pd = dest(bottet); + // Search an edge in R which is either [a,b] or [c,d]. + // Reminder: Subfaces in this list 'missingshs', except the first + // one, represents an interior edge of R. + parysh = NULL; // Avoid a warning in MSVC + for (i = 1; i < missingshs->objects; i++) { + parysh = (face *) fastlookup(missingshs, i); + if (((sorg(*parysh) == pa) && (sdest(*parysh) == pb)) || + ((sorg(*parysh) == pb) && (sdest(*parysh) == pa))) break; + if (((sorg(*parysh) == pc) && (sdest(*parysh) == pd)) || + ((sorg(*parysh) == pd) && (sdest(*parysh) == pc))) break; + } + if (i < missingshs->objects) { + // Found. Return it. + recentsh = *parysh; + } else { + terminatetetgen(this, 2); //assert(0); + } + } else { + //terminatetetgen(this, 2); // Report a bug + } + } + + midfaces->restart(); + } else { + mflag = true; + } + + // Delete the temp subfaces. + for (j = 0; j < 2; j++) { + cavshells = (j == 0 ? topshells : botshells); + if (cavshells != NULL) { + for (i = 0; i < cavshells->objects; i++) { + parysh = (face *) fastlookup(cavshells, i); + shellfacedealloc(subfaces, parysh->sh); + } + } + } + + topshells->restart(); + if (botshells != NULL) { + botshells->restart(); + } + + return mflag; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// carvecavity() Delete old tets and outer new tets of the cavity. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::carvecavity(arraypool *crosstets, arraypool *topnewtets, + arraypool *botnewtets) +{ + arraypool *newtets; + shellface *sptr, *ssptr; + triface *parytet, *pnewtet, newtet, neightet, spintet; + face checksh, *parysh; + face checkseg, *paryseg; + int t1ver; + int i, j; + + if (b->verbose > 2) { + printf(" Carve cavity: %ld old tets.\n", crosstets->objects); + } + + // First process subfaces and segments which are adjacent to the cavity. + // They must be re-connected to new tets in the cavity. + // Comment: It is possible that some subfaces and segments are completely + // inside the cavity. This can happen even if the cavity is not enlarged. + // Before deleting the old tets, find and queue all interior subfaces + // and segments. They will be recovered later. 2010-05-06. + + // Collect all subfaces and segments which attached to the old tets. + for (i = 0; i < crosstets->objects; i++) { + parytet = (triface *) fastlookup(crosstets, i); + if ((sptr = (shellface*) parytet->tet[9]) != NULL) { + for (j = 0; j < 4; j++) { + if (sptr[j]) { + sdecode(sptr[j], checksh); + if (!sinfected(checksh)) { + sinfect(checksh); + cavetetshlist->newindex((void **) &parysh); + *parysh = checksh; + } + } + } // j + } + if ((ssptr = (shellface*) parytet->tet[8]) != NULL) { + for (j = 0; j < 6; j++) { + if (ssptr[j]) { + sdecode(ssptr[j], checkseg); + // Skip a deleted segment (was a faked segment) + if (checkseg.sh[3] != NULL) { + if (!sinfected(checkseg)) { + sinfect(checkseg); + cavetetseglist->newindex((void **) &paryseg); + *paryseg = checkseg; + } + } + } + } // j + } + } // i + + // Uninfect collected subfaces. + for (i = 0; i < cavetetshlist->objects; i++) { + parysh = (face *) fastlookup(cavetetshlist, i); + suninfect(*parysh); + } + // Uninfect collected segments. + for (i = 0; i < cavetetseglist->objects; i++) { + paryseg = (face *) fastlookup(cavetetseglist, i); + suninfect(*paryseg); + } + + // Connect subfaces to new tets. + for (i = 0; i < cavetetshlist->objects; i++) { + parysh = (face *) fastlookup(cavetetshlist, i); + // Get an adjacent tet at this subface. + stpivot(*parysh, neightet); + // Does this tet lie inside the cavity. + if (infected(neightet)) { + // Yes. Get the other adjacent tet at this subface. + sesymself(*parysh); + stpivot(*parysh, neightet); + // Does this tet lie inside the cavity. + if (infected(neightet)) { + checksh = *parysh; + stdissolve(checksh); + caveencshlist->newindex((void **) &parysh); + *parysh = checksh; + } + } + if (!infected(neightet)) { + // Found an outside tet. Re-connect this subface to a new tet. + fsym(neightet, newtet); + sesymself(*parysh); + tsbond(newtet, *parysh); + } + } // i + + + for (i = 0; i < cavetetseglist->objects; i++) { + checkseg = * (face *) fastlookup(cavetetseglist, i); + // Check if the segment is inside the cavity. + sstpivot1(checkseg, neightet); + spintet = neightet; + while (1) { + if (!infected(spintet)) { + // This segment is on the boundary of the cavity. + break; + } + fnextself(spintet); + if (spintet.tet == neightet.tet) { + sstdissolve1(checkseg); + caveencseglist->newindex((void **) &paryseg); + *paryseg = checkseg; + break; + } + } + if (!infected(spintet)) { + // A boundary segment. Connect this segment to the new tets. + sstbond1(checkseg, spintet); + neightet = spintet; + while (1) { + tssbond1(spintet, checkseg); + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + } + } // i + + + cavetetshlist->restart(); + cavetetseglist->restart(); + + // Delete the old tets in cavity. + for (i = 0; i < crosstets->objects; i++) { + parytet = (triface *) fastlookup(crosstets, i); + if (ishulltet(*parytet)) { + hullsize--; + } + tetrahedrondealloc(parytet->tet); + } + + crosstets->restart(); // crosstets will be re-used. + + // Collect new tets in cavity. Some new tets have already been found + // (and infected) in the fillcavity(). We first collect them. + for (j = 0; j < 2; j++) { + newtets = (j == 0 ? topnewtets : botnewtets); + if (newtets != NULL) { + for (i = 0; i < newtets->objects; i++) { + parytet = (triface *) fastlookup(newtets, i); + if (infected(*parytet)) { + crosstets->newindex((void **) &pnewtet); + *pnewtet = *parytet; + } + } // i + } + } // j + + // Now we collect all new tets in cavity. + for (i = 0; i < crosstets->objects; i++) { + parytet = (triface *) fastlookup(crosstets, i); + for (j = 0; j < 4; j++) { + decode(parytet->tet[j], neightet); + if (marktested(neightet)) { // Is it a new tet? + if (!infected(neightet)) { + // Find an interior tet. + //assert((point) neightet.tet[7] != dummypoint); // SELF_CHECK + infect(neightet); + crosstets->newindex((void **) &pnewtet); + *pnewtet = neightet; + } + } + } // j + } // i + + parytet = (triface *) fastlookup(crosstets, 0); + recenttet = *parytet; // Remember a live handle. + + // Delete outer new tets. + for (j = 0; j < 2; j++) { + newtets = (j == 0 ? topnewtets : botnewtets); + if (newtets != NULL) { + for (i = 0; i < newtets->objects; i++) { + parytet = (triface *) fastlookup(newtets, i); + if (infected(*parytet)) { + // This is an interior tet. + uninfect(*parytet); + unmarktest(*parytet); + if (ishulltet(*parytet)) { + hullsize++; + } + } else { + // An outer tet. Delete it. + tetrahedrondealloc(parytet->tet); + } + } + } + } + + crosstets->restart(); + topnewtets->restart(); + if (botnewtets != NULL) { + botnewtets->restart(); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// restorecavity() Reconnect old tets and delete new tets of the cavity. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::restorecavity(arraypool *crosstets, arraypool *topnewtets, + arraypool *botnewtets, arraypool *missingshbds) +{ + triface *parytet, neightet, spintet; + face *parysh; + face checkseg; + point *ppt; + int t1ver; + int i, j; + + // Reconnect crossing tets to cavity boundary. + for (i = 0; i < crosstets->objects; i++) { + parytet = (triface *) fastlookup(crosstets, i); + parytet->ver = 0; + for (parytet->ver = 0; parytet->ver < 4; parytet->ver++) { + fsym(*parytet, neightet); + if (!infected(neightet)) { + // Restore the old connections of tets. + bond(*parytet, neightet); + } + } + // Update the point-to-tet map. + parytet->ver = 0; + ppt = (point *) &(parytet->tet[4]); + for (j = 0; j < 4; j++) { + setpoint2tet(ppt[j], encode(*parytet)); + } + } + + // Uninfect all crossing tets. + for (i = 0; i < crosstets->objects; i++) { + parytet = (triface *) fastlookup(crosstets, i); + uninfect(*parytet); + } + + // Remember a live handle. + if (crosstets->objects > 0) { + recenttet = * (triface *) fastlookup(crosstets, 0); + } + + // Delete faked segments. + for (i = 0; i < missingshbds->objects; i++) { + parysh = (face *) fastlookup(missingshbds, i); + sspivot(*parysh, checkseg); + if (checkseg.sh[3] != NULL) { + if (sinfected(checkseg)) { + // It's a faked segment. Delete it. + sstpivot1(checkseg, neightet); + spintet = neightet; + while (1) { + tssdissolve1(spintet); + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + shellfacedealloc(subsegs, checkseg.sh); + ssdissolve(*parysh); + //checkseg.sh = NULL; + } + } + } // i + + // Delete new tets. + for (i = 0; i < topnewtets->objects; i++) { + parytet = (triface *) fastlookup(topnewtets, i); + tetrahedrondealloc(parytet->tet); + } + + if (botnewtets != NULL) { + for (i = 0; i < botnewtets->objects; i++) { + parytet = (triface *) fastlookup(botnewtets, i); + tetrahedrondealloc(parytet->tet); + } + } + + crosstets->restart(); + topnewtets->restart(); + if (botnewtets != NULL) { + botnewtets->restart(); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// flipcertify() Insert a crossing face into priority queue. // +// // +// A crossing face of a facet must have at least one top and one bottom ver- // +// tex of the facet. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::flipcertify(triface *chkface,badface **pqueue,point plane_pa, + point plane_pb, point plane_pc) +{ + badface *parybf, *prevbf, *nextbf; + triface neightet; + face checksh; + point p[5]; + REAL w[5]; + REAL insph, ori4; + int topi, boti; + int i; + + // Compute the flip time \tau. + fsym(*chkface, neightet); + + p[0] = org(*chkface); + p[1] = dest(*chkface); + p[2] = apex(*chkface); + p[3] = oppo(*chkface); + p[4] = oppo(neightet); + + // Check if the face is a crossing face. + topi = boti = 0; + for (i = 0; i < 3; i++) { + if (pmarktest2ed(p[i])) topi++; + if (pmarktest3ed(p[i])) boti++; + } + if ((topi == 0) || (boti == 0)) { + // It is not a crossing face. + // return; + for (i = 3; i < 5; i++) { + if (pmarktest2ed(p[i])) topi++; + if (pmarktest3ed(p[i])) boti++; + } + if ((topi == 0) || (boti == 0)) { + // The two tets sharing at this face are on one side of the facet. + // Check if this face is locally Delaunay (due to rounding error). + if ((p[3] != dummypoint) && (p[4] != dummypoint)) { + // Do not check it if it is a subface. + tspivot(*chkface, checksh); + if (checksh.sh == NULL) { + insph = insphere_s(p[1], p[0], p[2], p[3], p[4]); + if (insph > 0) { + // Add the face into queue. + if (b->verbose > 2) { + printf(" A locally non-Delanay face (%d, %d, %d)-%d,%d\n", + pointmark(p[0]), pointmark(p[1]), pointmark(p[2]), + pointmark(p[3]), pointmark(p[4])); + } + parybf = (badface *) flippool->alloc(); + parybf->key = 0.; // tau = 0, do immediately. + parybf->tt = *chkface; + parybf->forg = p[0]; + parybf->fdest = p[1]; + parybf->fapex = p[2]; + parybf->foppo = p[3]; + parybf->noppo = p[4]; + // Add it at the top of the priority queue. + if (*pqueue == NULL) { + *pqueue = parybf; + parybf->nextitem = NULL; + } else { + parybf->nextitem = *pqueue; + *pqueue = parybf; + } + } // if (insph > 0) + } // if (checksh.sh == NULL) + } + } + return; // Test: omit this face. + } + + // Decide the "height" for each point. + for (i = 0; i < 5; i++) { + if (pmarktest2ed(p[i])) { + // A top point has a positive weight. + w[i] = orient3dfast(plane_pa, plane_pb, plane_pc, p[i]); + if (w[i] < 0) w[i] = -w[i]; + } else { + w[i] = 0; + } + } + + insph = insphere(p[1], p[0], p[2], p[3], p[4]); + ori4 = orient4d(p[1], p[0], p[2], p[3], p[4], w[1], w[0], w[2], w[3], w[4]); + if (ori4 > 0) { + // Add the face into queue. + if (b->verbose > 2) { + printf(" Insert face (%d, %d, %d) - %d, %d\n", pointmark(p[0]), + pointmark(p[1]), pointmark(p[2]), pointmark(p[3]), pointmark(p[4])); + } + + parybf = (badface *) flippool->alloc(); + + parybf->key = -insph / ori4; + parybf->tt = *chkface; + parybf->forg = p[0]; + parybf->fdest = p[1]; + parybf->fapex = p[2]; + parybf->foppo = p[3]; + parybf->noppo = p[4]; + + // Push the face into priority queue. + //pq.push(bface); + if (*pqueue == NULL) { + *pqueue = parybf; + parybf->nextitem = NULL; + } else { + // Search an item whose key is larger or equal to current key. + prevbf = NULL; + nextbf = *pqueue; + //if (!b->flipinsert_random) { // Default use a priority queue. + // Insert the item into priority queue. + while (nextbf != NULL) { + if (nextbf->key < parybf->key) { + prevbf = nextbf; + nextbf = nextbf->nextitem; + } else { + break; + } + } + //} // if (!b->flipinsert_random) + // Insert the new item between prev and next items. + if (prevbf == NULL) { + *pqueue = parybf; + } else { + prevbf->nextitem = parybf; + } + parybf->nextitem = nextbf; + } + } else if (ori4 == 0) { + + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// flipinsertfacet() Insert a facet into a CDT by flips. // +// // +// The algorithm is described in Shewchuk's paper "Updating and Constructing // +// Constrained Delaunay and Constrained Regular Triangulations by Flips", in // +// Proc. 19th Ann. Symp. on Comput. Geom., 86--95, 2003. // +// // +// 'crosstets' contains the set of crossing tetrahedra (infected) of the // +// facet. 'toppoints' and 'botpoints' are points lies above and below the // +// facet, not on the facet. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::flipinsertfacet(arraypool *crosstets, arraypool *toppoints, + arraypool *botpoints, arraypool *midpoints) +{ + arraypool *crossfaces, *bfacearray; + triface fliptets[6], baktets[2], fliptet, newface; + triface neightet, *parytet; + badface *pqueue; + badface *popbf, bface; + point plane_pa, plane_pb, plane_pc; + point p1, p2, pd, pe; + point *parypt; + flipconstraints fc; + REAL ori[3]; + int convcount, copcount; + int flipflag, fcount; + int n, i; + long f23count, f32count, f44count; + long totalfcount; + + f23count = flip23count; + f32count = flip32count; + f44count = flip44count; + + // Get three affinely independent vertices in the missing region R. + calculateabovepoint(midpoints, &plane_pa, &plane_pb, &plane_pc); + + // Mark top and bottom points. Do not mark midpoints. + for (i = 0; i < toppoints->objects; i++) { + parypt = (point *) fastlookup(toppoints, i); + if (!pmarktested(*parypt)) { + pmarktest2(*parypt); + } + } + for (i = 0; i < botpoints->objects; i++) { + parypt = (point *) fastlookup(botpoints, i); + if (!pmarktested(*parypt)) { + pmarktest3(*parypt); + } + } + + // Collect crossing faces. + crossfaces = cavetetlist; // Re-use array 'cavetetlist'. + + // Each crossing face contains at least one bottom vertex and + // one top vertex. + for (i = 0; i < crosstets->objects; i++) { + parytet = (triface *) fastlookup(crosstets, i); + fliptet = *parytet; + for (fliptet.ver = 0; fliptet.ver < 4; fliptet.ver++) { + fsym(fliptet, neightet); + if (infected(neightet)) { // It is an interior face. + if (!marktested(neightet)) { // It is an unprocessed face. + crossfaces->newindex((void **) &parytet); + *parytet = fliptet; + } + } + } + marktest(fliptet); + } + + if (b->verbose > 1) { + printf(" Found %ld crossing faces.\n", crossfaces->objects); + } + + for (i = 0; i < crosstets->objects; i++) { + parytet = (triface *) fastlookup(crosstets, i); + unmarktest(*parytet); + uninfect(*parytet); + } + + // Initialize the priority queue. + pqueue = NULL; + + for (i = 0; i < crossfaces->objects; i++) { + parytet = (triface *) fastlookup(crossfaces, i); + flipcertify(parytet, &pqueue, plane_pa, plane_pb, plane_pc); + } + crossfaces->restart(); + + // The list for temporarily storing unflipable faces. + bfacearray = new arraypool(sizeof(triface), 4); + + + fcount = 0; // Count the number of flips. + + // Flip insert the facet. + while (pqueue != NULL) { + + // Pop a face from the priority queue. + popbf = pqueue; + bface = *popbf; + // Update the queue. + pqueue = pqueue->nextitem; + // Delete the popped item from the pool. + flippool->dealloc((void *) popbf); + + if (!isdeadtet(bface.tt)) { + if ((org(bface.tt) == bface.forg) && (dest(bface.tt) == bface.fdest) && + (apex(bface.tt) == bface.fapex) && (oppo(bface.tt) == bface.foppo)) { + // It is still a crossing face of R. + fliptet = bface.tt; + fsym(fliptet, neightet); + if (oppo(neightet) == bface.noppo) { + pd = oppo(fliptet); + pe = oppo(neightet); + + if (b->verbose > 2) { + printf(" Get face (%d, %d, %d) - %d, %d, tau = %.17g\n", + pointmark(bface.forg), pointmark(bface.fdest), + pointmark(bface.fapex), pointmark(bface.foppo), + pointmark(bface.noppo), bface.key); + } + flipflag = 0; + + // Check for which type of flip can we do. + convcount = 3; + copcount = 0; + for (i = 0; i < 3; i++) { + p1 = org(fliptet); + p2 = dest(fliptet); + ori[i] = orient3d(p1, p2, pd, pe); + if (ori[i] < 0) { + convcount--; + //break; + } else if (ori[i] == 0) { + convcount--; // Possible 4-to-4 flip. + copcount++; + //break; + } + enextself(fliptet); + } + + if (convcount == 3) { + // A 2-to-3 flip is found. + fliptets[0] = fliptet; // abcd, d may be the new vertex. + fliptets[1] = neightet; // bace. + flip23(fliptets, 1, &fc); + // Put the link faces into check list. + for (i = 0; i < 3; i++) { + eprevesym(fliptets[i], newface); + crossfaces->newindex((void **) &parytet); + *parytet = newface; + } + for (i = 0; i < 3; i++) { + enextesym(fliptets[i], newface); + crossfaces->newindex((void **) &parytet); + *parytet = newface; + } + flipflag = 1; + } else if (convcount == 2) { + //if (copcount <= 1) { + // A 3-to-2 or 4-to-4 may be possible. + // Get the edge which is locally non-convex or flat. + for (i = 0; i < 3; i++) { + if (ori[i] <= 0) break; + enextself(fliptet); + } + + // Collect tets sharing at this edge. + esym(fliptet, fliptets[0]); // [b,a,d,c] + n = 0; + do { + p1 = apex(fliptets[n]); + if (!(pmarktested(p1) || pmarktest2ed(p1) || pmarktest3ed(p1))) { + // This apex is not on the cavity. Hence the face does not + // lie inside the cavity. Do not flip this edge. + n = 1000; break; + } + fnext(fliptets[n], fliptets[n + 1]); + n++; + } while ((fliptets[n].tet != fliptet.tet) && (n < 5)); + + if (n == 3) { + // Found a 3-to-2 flip. + flip32(fliptets, 1, &fc); + // Put the link faces into check list. + for (i = 0; i < 3; i++) { + esym(fliptets[0], newface); + crossfaces->newindex((void **) &parytet); + *parytet = newface; + enextself(fliptets[0]); + } + for (i = 0; i < 3; i++) { + esym(fliptets[1], newface); + crossfaces->newindex((void **) &parytet); + *parytet = newface; + enextself(fliptets[1]); + } + flipflag = 1; + } else if (n == 4) { + if (copcount == 1) { + // Found a 4-to-4 flip. + // Let the six vertices are: a,b,c,d,e,f, where + // fliptets[0] = [b,a,d,c] + // [1] = [b,a,c,e] + // [2] = [b,a,e,f] + // [3] = [b,a,f,d] + // After the 4-to-4 flip, edge [a,b] is flipped, edge [e,d] + // is created. + // First do a 2-to-3 flip. + // Comment: This flip temporarily creates a degenerated + // tet (whose volume is zero). It will be removed by the + // followed 3-to-2 flip. + fliptets[0] = fliptet; // = [a,b,c,d], d is the new vertex. + // fliptets[1]; // = [b,a,c,e]. + baktets[0] = fliptets[2]; // = [b,a,e,f] + baktets[1] = fliptets[3]; // = [b,a,f,d] + // The flip may involve hull tets. + flip23(fliptets, 1, &fc); + // Put the "outer" link faces into check list. + // fliptets[0] = [e,d,a,b] => will be flipped, so + // [a,b,d] and [a,b,e] are not "outer" link faces. + for (i = 1; i < 3; i++) { + eprevesym(fliptets[i], newface); + crossfaces->newindex((void **) &parytet); + *parytet = newface; + } + for (i = 1; i < 3; i++) { + enextesym(fliptets[i], newface); + crossfaces->newindex((void **) &parytet); + *parytet = newface; + } + // Then do a 3-to-2 flip. + enextesymself(fliptets[0]); // fliptets[0] is [e,d,a,b]. + eprevself(fliptets[0]); // = [b,a,d,c], d is the new vertex. + fliptets[1] = baktets[0]; // = [b,a,e,f] + fliptets[2] = baktets[1]; // = [b,a,f,d] + flip32(fliptets, 1, &fc); + // Put the "outer" link faces into check list. + // fliptets[0] = [d,e,f,a] + // fliptets[1] = [e,d,f,b] + // Faces [a,b,d] and [a,b,e] are not "outer" link faces. + enextself(fliptets[0]); + for (i = 1; i < 3; i++) { + esym(fliptets[0], newface); + crossfaces->newindex((void **) &parytet); + *parytet = newface; + enextself(fliptets[0]); + } + enextself(fliptets[1]); + for (i = 1; i < 3; i++) { + esym(fliptets[1], newface); + crossfaces->newindex((void **) &parytet); + *parytet = newface; + enextself(fliptets[1]); + } + flip23count--; + flip32count--; + flip44count++; + flipflag = 1; + } + } + } else { + // There are more than 1 non-convex or coplanar cases. + flipflag = -1; // Ignore this face. + if (b->verbose > 2) { + printf(" Ignore face (%d, %d, %d) - %d, %d, tau = %.17g\n", + pointmark(bface.forg), pointmark(bface.fdest), + pointmark(bface.fapex), pointmark(bface.foppo), + pointmark(bface.noppo), bface.key); + } + } // if (convcount == 1) + + if (flipflag == 1) { + // Update the priority queue. + for (i = 0; i < crossfaces->objects; i++) { + parytet = (triface *) fastlookup(crossfaces, i); + flipcertify(parytet, &pqueue, plane_pa, plane_pb, plane_pc); + } + crossfaces->restart(); + if (1) { // if (!b->flipinsert_random) { + // Insert all queued unflipped faces. + for (i = 0; i < bfacearray->objects; i++) { + parytet = (triface *) fastlookup(bfacearray, i); + // This face may be changed. + if (!isdeadtet(*parytet)) { + flipcertify(parytet, &pqueue, plane_pa, plane_pb, plane_pc); + } + } + bfacearray->restart(); + } + fcount++; + } else if (flipflag == 0) { + // Queue an unflippable face. To process it later. + bfacearray->newindex((void **) &parytet); + *parytet = fliptet; + } + } // if (pe == bface.noppo) + } // if ((pa == bface.forg) && ...) + } // if (bface.tt != NULL) + + } // while (pqueue != NULL) + + if (bfacearray->objects > 0) { + if (fcount == 0) { + printf("!! No flip is found in %ld faces.\n", bfacearray->objects); + terminatetetgen(this, 2); //assert(0); + } + } + + delete bfacearray; + + // Un-mark top and bottom points. + for (i = 0; i < toppoints->objects; i++) { + parypt = (point *) fastlookup(toppoints, i); + punmarktest2(*parypt); + } + for (i = 0; i < botpoints->objects; i++) { + parypt = (point *) fastlookup(botpoints, i); + punmarktest3(*parypt); + } + + f23count = flip23count - f23count; + f32count = flip32count - f32count; + f44count = flip44count - f44count; + totalfcount = f23count + f32count + f44count; + if (b->verbose > 2) { + printf(" Total %ld flips. f23(%ld), f32(%ld), f44(%ld).\n", + totalfcount, f23count, f32count, f44count); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// insertpoint_cdt() Insert a new point into a CDT. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::insertpoint_cdt(point newpt, triface *searchtet, face *splitsh, + face *splitseg, insertvertexflags *ivf, + arraypool *cavpoints, arraypool *cavfaces, + arraypool *cavshells, arraypool *newtets, + arraypool *crosstets, arraypool *misfaces) +{ + triface neightet, *parytet; + face checksh, *parysh, *parysh1; + face *paryseg, *paryseg1; + point *parypt; + int t1ver; + int i; + + if (b->verbose > 2) { + printf(" Insert point %d into CDT\n", pointmark(newpt)); + } + + if (!insertpoint(newpt, searchtet, NULL, NULL, ivf)) { + // Point is not inserted. Check ivf->iloc for reason. + return 0; + } + + + for (i = 0; i < cavetetvertlist->objects; i++) { + cavpoints->newindex((void **) &parypt); + *parypt = * (point *) fastlookup(cavetetvertlist, i); + } + // Add the new point into the point list. + cavpoints->newindex((void **) &parypt); + *parypt = newpt; + + for (i = 0; i < cavebdrylist->objects; i++) { + cavfaces->newindex((void **) &parytet); + *parytet = * (triface *) fastlookup(cavebdrylist, i); + } + + for (i = 0; i < caveoldtetlist->objects; i++) { + crosstets->newindex((void **) &parytet); + *parytet = * (triface *) fastlookup(caveoldtetlist, i); + } + + cavetetvertlist->restart(); + cavebdrylist->restart(); + caveoldtetlist->restart(); + + // Insert the point using the cavity algorithm. + delaunizecavity(cavpoints, cavfaces, cavshells, newtets, crosstets, + misfaces); + fillcavity(cavshells, NULL, NULL, NULL, NULL, NULL, NULL); + carvecavity(crosstets, newtets, NULL); + + if ((splitsh != NULL) || (splitseg != NULL)) { + // Insert the point into the surface mesh. + sinsertvertex(newpt, splitsh, splitseg, ivf->sloc, ivf->sbowywat, 0); + + // Put all new subfaces into stack. + for (i = 0; i < caveshbdlist->objects; i++) { + // Get an old subface at edge [a, b]. + parysh = (face *) fastlookup(caveshbdlist, i); + spivot(*parysh, checksh); // The new subface [a, b, p]. + // Do not recover a deleted new face (degenerated). + if (checksh.sh[3] != NULL) { + subfacstack->newindex((void **) &parysh); + *parysh = checksh; + } + } + + if (splitseg != NULL) { + // Queue two new subsegments in C(p) for recovery. + for (i = 0; i < cavesegshlist->objects; i++) { + paryseg = (face *) fastlookup(cavesegshlist, i); + subsegstack->newindex((void **) &paryseg1); + *paryseg1 = *paryseg; + } + } // if (splitseg != NULL) + + // Delete the old subfaces in sC(p). + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + if (checksubfaceflag) { + // It is possible that this subface still connects to adjacent + // tets which are not in C(p). If so, clear connections in the + // adjacent tets at this subface. + stpivot(*parysh, neightet); + if (neightet.tet != NULL) { + if (neightet.tet[4] != NULL) { + // Found an adjacent tet. It must be not in C(p). + tsdissolve(neightet); + fsymself(neightet); + tsdissolve(neightet); + } + } + } + shellfacedealloc(subfaces, parysh->sh); + } + if (splitseg != NULL) { + // Delete the old segment in sC(p). + shellfacedealloc(subsegs, splitseg->sh); + } + + // Clear working lists. + caveshlist->restart(); + caveshbdlist->restart(); + cavesegshlist->restart(); + } // if ((splitsh != NULL) || (splitseg != NULL)) + + // Put all interior subfaces into stack for recovery. + // They were collected in carvecavity(). + // Note: Some collected subfaces may be deleted by sinsertvertex(). + for (i = 0; i < caveencshlist->objects; i++) { + parysh = (face *) fastlookup(caveencshlist, i); + if (parysh->sh[3] != NULL) { + subfacstack->newindex((void **) &parysh1); + *parysh1 = *parysh; + } + } + + // Put all interior segments into stack for recovery. + // They were collected in carvecavity(). + // Note: Some collected segments may be deleted by sinsertvertex(). + for (i = 0; i < caveencseglist->objects; i++) { + paryseg = (face *) fastlookup(caveencseglist, i); + if (paryseg->sh[3] != NULL) { + subsegstack->newindex((void **) &paryseg1); + *paryseg1 = *paryseg; + } + } + + caveencshlist->restart(); + caveencseglist->restart(); + + return 1; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// refineregion() Refine a missing region by inserting points. // +// // +// 'splitsh' represents an edge of the facet to be split. It must be not a // +// segment. +// // +// Assumption: The current mesh is a CDT and is convex. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::refineregion(face &splitsh, arraypool *cavpoints, + arraypool *cavfaces, arraypool *cavshells, + arraypool *newtets, arraypool *crosstets, + arraypool *misfaces) +{ + triface searchtet, spintet; + face splitseg, *paryseg; + point steinpt, pa, pb, refpt; + insertvertexflags ivf; + enum interresult dir; + long baknum = points->items; + int t1ver; + int i; + + // Do not split a segment. + for (i = 0; i < 3; i++) { + sspivot(splitsh, splitseg); + if (splitseg.sh == NULL) break; + senextself(splitsh); + } + + if (b->verbose > 2) { + printf(" Refining region at edge (%d, %d, %d).\n", + pointmark(sorg(splitsh)), pointmark(sdest(splitsh)), + pointmark(sapex(splitsh))); + } + + // Add the Steiner point at the barycenter of the face. + pa = sorg(splitsh); + pb = sdest(splitsh); + // Create a new point. + makepoint(&steinpt, FREEFACETVERTEX); + for (i = 0; i < 3; i++) { + steinpt[i] = 0.5 * (pa[i] + pb[i]); + } + + ivf.bowywat = 1; // Use the Bowyer-Watson algorrithm. + ivf.cdtflag = 1; // Only create the initial cavity. + ivf.sloc = (int) ONEDGE; + ivf.sbowywat = 1; + ivf.assignmeshsize = b->metric; + ivf.smlenflag = useinsertradius; // Return the closet mesh vertex. + + point2tetorg(pa, searchtet); // Start location from it. + ivf.iloc = (int) OUTSIDE; + + ivf.rejflag = 1; // Reject it if it encroaches upon any segment. + if (!insertpoint_cdt(steinpt, &searchtet, &splitsh, NULL, &ivf, cavpoints, + cavfaces, cavshells, newtets, crosstets, misfaces)) { + if (ivf.iloc == (int) ENCSEGMENT) { + pointdealloc(steinpt); + // Split an encroached segment. + i = randomnation(encseglist->objects); + paryseg = (face *) fastlookup(encseglist, i); + splitseg = *paryseg; + encseglist->restart(); + + // Split the segment. + pa = sorg(splitseg); + pb = sdest(splitseg); + // Create a new point. + makepoint(&steinpt, FREESEGVERTEX); + for (i = 0; i < 3; i++) { + steinpt[i] = 0.5 * (pa[i] + pb[i]); + } + point2tetorg(pa, searchtet); + ivf.iloc = (int) OUTSIDE; + ivf.rejflag = 0; + if (!insertpoint_cdt(steinpt, &searchtet, &splitsh, &splitseg, &ivf, + cavpoints, cavfaces, cavshells, newtets, + crosstets, misfaces)) { + terminatetetgen(this, 2); + } + if (useinsertradius) { + save_segmentpoint_insradius(steinpt, ivf.parentpt, ivf.smlen); + } + st_segref_count++; + if (steinerleft > 0) steinerleft--; + } else { + terminatetetgen(this, 2); // assert(0); + } + } else { + if (useinsertradius) { + save_facetpoint_insradius(steinpt, ivf.parentpt, ivf.smlen); + } + st_facref_count++; + if (steinerleft > 0) steinerleft--; + } + + while (subsegstack->objects > 0l) { + // seglist is used as a stack. + subsegstack->objects--; + paryseg = (face *) fastlookup(subsegstack, subsegstack->objects); + splitseg = *paryseg; + + // Check if this segment has been recovered. + sstpivot1(splitseg, searchtet); + if (searchtet.tet != NULL) continue; + + // Search the segment. + dir = scoutsegment(sorg(splitseg), sdest(splitseg), &splitseg, &searchtet, + &refpt, NULL); + if (dir == SHAREEDGE) { + // Found this segment, insert it. + // Let the segment remember an adjacent tet. + sstbond1(splitseg, searchtet); + // Bond the segment to all tets containing it. + spintet = searchtet; + do { + tssbond1(spintet, splitseg); + fnextself(spintet); + } while (spintet.tet != searchtet.tet); + } else { + if ((dir == ACROSSFACE) || (dir == ACROSSEDGE)) { + // Split the segment. + makepoint(&steinpt, FREESEGVERTEX); + getsteinerptonsegment(&splitseg, refpt, steinpt); + ivf.iloc = (int) OUTSIDE; + ivf.rejflag = 0; + if (!insertpoint_cdt(steinpt, &searchtet, &splitsh, &splitseg, &ivf, + cavpoints, cavfaces, cavshells, newtets, + crosstets, misfaces)) { + terminatetetgen(this, 2); + } + if (useinsertradius) { + save_segmentpoint_insradius(steinpt, ivf.parentpt, ivf.smlen); + } + st_segref_count++; + if (steinerleft > 0) steinerleft--; + } else { + terminatetetgen(this, 2); + } + } + } // while + + if (b->verbose > 2) { + printf(" Added %ld Steiner points.\n", points->items - baknum); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// constrainedfacets() Recover constrained facets in a CDT. // +// // +// All unrecovered subfaces are queued in 'subfacestack'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::constrainedfacets() +{ + arraypool *tg_crosstets, *tg_topnewtets, *tg_botnewtets; + arraypool *tg_topfaces, *tg_botfaces, *tg_midfaces; + arraypool *tg_topshells, *tg_botshells, *tg_facfaces; + arraypool *tg_toppoints, *tg_botpoints; + arraypool *tg_missingshs, *tg_missingshbds, *tg_missingshverts; + triface searchtet, neightet, crossedge; + face searchsh, *parysh, *parysh1; + face *paryseg; + point *parypt; + enum interresult dir; + int facetcount; + int success; + int t1ver; + int i, j; + + // Initialize arrays. + tg_crosstets = new arraypool(sizeof(triface), 10); + tg_topnewtets = new arraypool(sizeof(triface), 10); + tg_botnewtets = new arraypool(sizeof(triface), 10); + tg_topfaces = new arraypool(sizeof(triface), 10); + tg_botfaces = new arraypool(sizeof(triface), 10); + tg_midfaces = new arraypool(sizeof(triface), 10); + tg_toppoints = new arraypool(sizeof(point), 8); + tg_botpoints = new arraypool(sizeof(point), 8); + tg_facfaces = new arraypool(sizeof(face), 10); + tg_topshells = new arraypool(sizeof(face), 10); + tg_botshells = new arraypool(sizeof(face), 10); + tg_missingshs = new arraypool(sizeof(face), 10); + tg_missingshbds = new arraypool(sizeof(face), 10); + tg_missingshverts = new arraypool(sizeof(point), 8); + // This is a global array used by refineregion(). + encseglist = new arraypool(sizeof(face), 4); + + facetcount = 0; + + while (subfacstack->objects > 0l) { + + subfacstack->objects--; + parysh = (face *) fastlookup(subfacstack, subfacstack->objects); + searchsh = *parysh; + + if (searchsh.sh[3] == NULL) continue; // It is dead. + if (isshtet(searchsh)) continue; // It is recovered. + + // Collect all unrecovered subfaces which are co-facet. + smarktest(searchsh); + tg_facfaces->newindex((void **) &parysh); + *parysh = searchsh; + for (i = 0; i < tg_facfaces->objects; i++) { + parysh = (face *) fastlookup(tg_facfaces, i); + for (j = 0; j < 3; j++) { + if (!isshsubseg(*parysh)) { + spivot(*parysh, searchsh); + if (!smarktested(searchsh)) { + if (!isshtet(searchsh)) { + smarktest(searchsh); + tg_facfaces->newindex((void **) &parysh1); + *parysh1 = searchsh; + } + } + } + senextself(*parysh); + } // j + } // i + // Have found all facet subfaces. Unmark them. + for (i = 0; i < tg_facfaces->objects; i++) { + parysh = (face *) fastlookup(tg_facfaces, i); + sunmarktest(*parysh); + } + + if (b->verbose > 1) { + printf(" Recovering facet #%d: %ld subfaces.\n", facetcount + 1, + tg_facfaces->objects); + } + facetcount++; + + while (tg_facfaces->objects > 0l) { + + tg_facfaces->objects--; + parysh = (face *) fastlookup(tg_facfaces, tg_facfaces->objects); + searchsh = *parysh; + + if (searchsh.sh[3] == NULL) continue; // It is dead. + if (isshtet(searchsh)) continue; // It is recovered. + + searchtet.tet = NULL; + if (scoutsubface(&searchsh, &searchtet, 1)) continue; + + // The subface is missing. Form the missing region. + // Re-use 'tg_crosstets' for 'adjtets'. + formregion(&searchsh, tg_missingshs, tg_missingshbds, tg_missingshverts); + + int searchflag = scoutcrossedge(searchtet, tg_missingshbds, tg_missingshs); + if (searchflag > 0) { + // Save this crossing edge, will be used by fillcavity(). + crossedge = searchtet; + // Form a cavity of crossing tets. + success = formcavity(&searchtet, tg_missingshs, tg_crosstets, + tg_topfaces, tg_botfaces, tg_toppoints, + tg_botpoints); + if (success) { + if (!b->flipinsert) { + // Tetrahedralize the top part. Re-use 'tg_midfaces'. + delaunizecavity(tg_toppoints, tg_topfaces, tg_topshells, + tg_topnewtets, tg_crosstets, tg_midfaces); + // Tetrahedralize the bottom part. Re-use 'tg_midfaces'. + delaunizecavity(tg_botpoints, tg_botfaces, tg_botshells, + tg_botnewtets, tg_crosstets, tg_midfaces); + // Fill the cavity with new tets. + success = fillcavity(tg_topshells, tg_botshells, tg_midfaces, + tg_missingshs, tg_topnewtets, tg_botnewtets, + &crossedge); + if (success) { + // Cavity is remeshed. Delete old tets and outer new tets. + carvecavity(tg_crosstets, tg_topnewtets, tg_botnewtets); + } else { + restorecavity(tg_crosstets, tg_topnewtets, tg_botnewtets, + tg_missingshbds); + } + } else { + // Use the flip algorithm of Shewchuk to recover the subfaces. + flipinsertfacet(tg_crosstets, tg_toppoints, tg_botpoints, + tg_missingshverts); + // Put all subfaces in R back to tg_facfaces. + for (i = 0; i < tg_missingshs->objects; i++) { + parysh = (face *) fastlookup(tg_missingshs, i); + tg_facfaces->newindex((void **) &parysh1); + *parysh1 = *parysh; + } + success = 1; + // Clear working lists. + tg_crosstets->restart(); + tg_topfaces->restart(); + tg_botfaces->restart(); + tg_toppoints->restart(); + tg_botpoints->restart(); + } // b->flipinsert + + if (success) { + // Recover interior subfaces. + for (i = 0; i < caveencshlist->objects; i++) { + parysh = (face *) fastlookup(caveencshlist, i); + if (!scoutsubface(parysh, &searchtet, 1)) { + // Add this face at the end of the list, so it will be + // processed immediately. + tg_facfaces->newindex((void **) &parysh1); + *parysh1 = *parysh; + } + } + caveencshlist->restart(); + // Recover interior segments. This should always be recovered. + for (i = 0; i < caveencseglist->objects; i++) { + paryseg = (face *) fastlookup(caveencseglist, i); + dir = scoutsegment(sorg(*paryseg), sdest(*paryseg), paryseg, + &searchtet, NULL, NULL); + if (dir != SHAREEDGE) { + terminatetetgen(this, 2); + } + // Insert this segment. + // Let the segment remember an adjacent tet. + sstbond1(*paryseg, searchtet); + // Bond the segment to all tets containing it. + neightet = searchtet; + do { + tssbond1(neightet, *paryseg); + fnextself(neightet); + } while (neightet.tet != searchtet.tet); + } + caveencseglist->restart(); + } // success - remesh cavity + } // success - form cavity + else { + terminatetetgen(this, 2); // Report a bug. + } // Not success - form cavity + } else { + // Put all subfaces in R back to tg_facfaces. + for (i = 0; i < tg_missingshs->objects; i++) { + parysh = (face *) fastlookup(tg_missingshs, i); + tg_facfaces->newindex((void **) &parysh1); + *parysh1 = *parysh; + } + if (searchflag != -1) { + // Some edge(s) in the missing regions were flipped. + success = 1; + } else { + restorecavity(tg_crosstets, tg_topnewtets, tg_botnewtets, + tg_missingshbds); // Only remove fake segments. + // Choose an edge to split (set in recentsh) + recentsh = searchsh; + success = 0; // Do refineregion(); + } + } // if (scoutcrossedge) + + // Unmarktest all points of the missing region. + for (i = 0; i < tg_missingshverts->objects; i++) { + parypt = (point *) fastlookup(tg_missingshverts, i); + punmarktest(*parypt); + } + tg_missingshverts->restart(); + tg_missingshbds->restart(); + tg_missingshs->restart(); + + if (!success) { + // The missing region can not be recovered. Refine it. + refineregion(recentsh, tg_toppoints, tg_topfaces, tg_topshells, + tg_topnewtets, tg_crosstets, tg_midfaces); + } + } // while (tg_facfaces->objects) + + } // while ((subfacstack->objects) + + // Accumulate the dynamic memory. + totalworkmemory += (tg_crosstets->totalmemory + tg_topnewtets->totalmemory + + tg_botnewtets->totalmemory + tg_topfaces->totalmemory + + tg_botfaces->totalmemory + tg_midfaces->totalmemory + + tg_toppoints->totalmemory + tg_botpoints->totalmemory + + tg_facfaces->totalmemory + tg_topshells->totalmemory + + tg_botshells->totalmemory + tg_missingshs->totalmemory + + tg_missingshbds->totalmemory + + tg_missingshverts->totalmemory + + encseglist->totalmemory); + + // Delete arrays. + delete tg_crosstets; + delete tg_topnewtets; + delete tg_botnewtets; + delete tg_topfaces; + delete tg_botfaces; + delete tg_midfaces; + delete tg_toppoints; + delete tg_botpoints; + delete tg_facfaces; + delete tg_topshells; + delete tg_botshells; + delete tg_missingshs; + delete tg_missingshbds; + delete tg_missingshverts; + delete encseglist; + encseglist = NULL; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// constraineddelaunay() Create a constrained Delaunay tetrahedralization.// +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::constraineddelaunay(clock_t& tv) +{ + face searchsh, *parysh; + face searchseg, *paryseg; + int s, i; + + // Statistics. + long bakfillregioncount; + long bakcavitycount, bakcavityexpcount; + long bakseg_ref_count; + + if (!b->quiet) { + printf("Constrained Delaunay...\n"); + } + + makesegmentendpointsmap(); + makefacetverticesmap(); + + if (b->verbose) { + printf(" Delaunizing segments.\n"); + } + + checksubsegflag = 1; + + // Put all segments into the list (in random order). + subsegs->traversalinit(); + for (i = 0; i < subsegs->items; i++) { + s = randomnation(i + 1); + // Move the s-th seg to the i-th. + subsegstack->newindex((void **) &paryseg); + *paryseg = * (face *) fastlookup(subsegstack, s); + // Put i-th seg to be the s-th. + searchseg.sh = shellfacetraverse(subsegs); + //sinfect(searchseg); // Only save it once. + paryseg = (face *) fastlookup(subsegstack, s); + *paryseg = searchseg; + } + + // Recover non-Delaunay segments. + delaunizesegments(); + + if (b->verbose) { + printf(" Inserted %ld Steiner points.\n", st_segref_count); + } + + tv = clock(); + + if (b->verbose) { + printf(" Constraining facets.\n"); + } + + // Subfaces will be introduced. + checksubfaceflag = 1; + + bakfillregioncount = fillregioncount; + bakcavitycount = cavitycount; + bakcavityexpcount = cavityexpcount; + bakseg_ref_count = st_segref_count; + + // Randomly order the subfaces. + subfaces->traversalinit(); + for (i = 0; i < subfaces->items; i++) { + s = randomnation(i + 1); + // Move the s-th subface to the i-th. + subfacstack->newindex((void **) &parysh); + *parysh = * (face *) fastlookup(subfacstack, s); + // Put i-th subface to be the s-th. + searchsh.sh = shellfacetraverse(subfaces); + parysh = (face *) fastlookup(subfacstack, s); + *parysh = searchsh; + } + + // Recover facets. + constrainedfacets(); + + if (b->verbose) { + if (fillregioncount > bakfillregioncount) { + printf(" Remeshed %ld regions.\n", fillregioncount-bakfillregioncount); + } + if (cavitycount > bakcavitycount) { + printf(" Remeshed %ld cavities", cavitycount - bakcavitycount); + if (cavityexpcount - bakcavityexpcount) { + printf(" (%ld enlarged)", cavityexpcount - bakcavityexpcount); + } + printf(".\n"); + } + if (st_segref_count + st_facref_count - bakseg_ref_count > 0) { + printf(" Inserted %ld (%ld, %ld) refine points.\n", + st_segref_count + st_facref_count - bakseg_ref_count, + st_segref_count - bakseg_ref_count, st_facref_count); + } + } +} + +//// //// +//// //// +//// constrained_cxx ////////////////////////////////////////////////////////// + +//// steiner_cxx ////////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// checkflipeligibility() A call back function for boundary recovery. // +// // +// 'fliptype' indicates which elementary flip will be performed: 1 : 2-to-3, // +// and 2 : 3-to-2, respectively. // +// // +// 'pa, ..., pe' are the vertices involved in this flip, where [a,b,c] is // +// the flip face, and [d,e] is the flip edge. NOTE: 'pc' may be 'dummypoint',// +// other points must not be 'dummypoint'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checkflipeligibility(int fliptype, point pa, point pb, + point pc, point pd, point pe, + int level, int edgepivot, + flipconstraints* fc) +{ + point tmppts[3]; + enum interresult dir; + int types[2], poss[4]; + int intflag; + int rejflag = 0; + int i; + + if (fc->seg[0] != NULL) { + // A constraining edge is given (e.g., for edge recovery). + if (fliptype == 1) { + // A 2-to-3 flip: [a,b,c] => [e,d,a], [e,d,b], [e,d,c]. + tmppts[0] = pa; + tmppts[1] = pb; + tmppts[2] = pc; + for (i = 0; i < 3 && !rejflag; i++) { + if (tmppts[i] != dummypoint) { + // Test if the face [e,d,#] intersects the edge. + intflag = tri_edge_test(pe, pd, tmppts[i], fc->seg[0], fc->seg[1], + NULL, 1, types, poss); + if (intflag == 2) { + // They intersect at a single point. + dir = (enum interresult) types[0]; + if (dir == ACROSSFACE) { + // The interior of [e,d,#] intersect the segment. + rejflag = 1; + } else if (dir == ACROSSEDGE) { + if (poss[0] == 0) { + // The interior of [e,d] intersect the segment. + // Since [e,d] is the newly created edge. Reject this flip. + rejflag = 1; + } + } + } else if (intflag == 4) { + // They may intersect at either a point or a line segment. + dir = (enum interresult) types[0]; + if (dir == ACROSSEDGE) { + if (poss[0] == 0) { + // The interior of [e,d] intersect the segment. + // Since [e,d] is the newly created edge. Reject this flip. + rejflag = 1; + } + } + } + } // if (tmppts[0] != dummypoint) + } // i + } else if (fliptype == 2) { + // A 3-to-2 flip: [e,d,a], [e,d,b], [e,d,c] => [a,b,c] + if (pc != dummypoint) { + // Check if the new face [a,b,c] intersect the edge in its interior. + intflag = tri_edge_test(pa, pb, pc, fc->seg[0], fc->seg[1], NULL, + 1, types, poss); + if (intflag == 2) { + // They intersect at a single point. + dir = (enum interresult) types[0]; + if (dir == ACROSSFACE) { + // The interior of [a,b,c] intersect the segment. + rejflag = 1; // Do not flip. + } + } else if (intflag == 4) { + // [a,b,c] is coplanar with the edge. + dir = (enum interresult) types[0]; + if (dir == ACROSSEDGE) { + // The boundary of [a,b,c] intersect the segment. + rejflag = 1; // Do not flip. + } + } + } // if (pc != dummypoint) + } + } // if (fc->seg[0] != NULL) + + if ((fc->fac[0] != NULL) && !rejflag) { + // A constraining face is given (e.g., for face recovery). + if (fliptype == 1) { + // A 2-to-3 flip. + // Test if the new edge [e,d] intersects the face. + intflag = tri_edge_test(fc->fac[0], fc->fac[1], fc->fac[2], pe, pd, + NULL, 1, types, poss); + if (intflag == 2) { + // They intersect at a single point. + dir = (enum interresult) types[0]; + if (dir == ACROSSFACE) { + rejflag = 1; + } else if (dir == ACROSSEDGE) { + rejflag = 1; + } + } else if (intflag == 4) { + // The edge [e,d] is coplanar with the face. + // There may be two intersections. + for (i = 0; i < 2 && !rejflag; i++) { + dir = (enum interresult) types[i]; + if (dir == ACROSSFACE) { + rejflag = 1; + } else if (dir == ACROSSEDGE) { + rejflag = 1; + } + } + } + } // if (fliptype == 1) + } // if (fc->fac[0] != NULL) + + if ((fc->remvert != NULL) && !rejflag) { + // The vertex is going to be removed. Do not create a new edge which + // contains this vertex. + if (fliptype == 1) { + // A 2-to-3 flip. + if ((pd == fc->remvert) || (pe == fc->remvert)) { + rejflag = 1; + } + } + } + + if (fc->remove_large_angle && !rejflag) { + // Remove a large dihedral angle. Do not create a new small angle. + REAL cosmaxd = 0, diff; + if (fliptype == 1) { + // We assume that neither 'a' nor 'b' is dummypoint. + // A 2-to-3 flip: [a,b,c] => [e,d,a], [e,d,b], [e,d,c]. + // The new tet [e,d,a,b] will be flipped later. Only two new tets: + // [e,d,b,c] and [e,d,c,a] need to be checked. + if ((pc != dummypoint) && (pe != dummypoint) && (pd != dummypoint)) { + // Get the largest dihedral angle of [e,d,b,c]. + tetalldihedral(pe, pd, pb, pc, NULL, &cosmaxd, NULL); + diff = cosmaxd - fc->cosdihed_in; + if (fabs(diff/fc->cosdihed_in) < b->epsilon) diff = 0.0; // Rounding. + if (diff <= 0) { //if (cosmaxd <= fc->cosdihed_in) { + rejflag = 1; + } else { + // Record the largest new angle. + if (cosmaxd < fc->cosdihed_out) { + fc->cosdihed_out = cosmaxd; + } + // Get the largest dihedral angle of [e,d,c,a]. + tetalldihedral(pe, pd, pc, pa, NULL, &cosmaxd, NULL); + diff = cosmaxd - fc->cosdihed_in; + if (fabs(diff/fc->cosdihed_in) < b->epsilon) diff = 0.0; // Rounding. + if (diff <= 0) { //if (cosmaxd <= fc->cosdihed_in) { + rejflag = 1; + } else { + // Record the largest new angle. + if (cosmaxd < fc->cosdihed_out) { + fc->cosdihed_out = cosmaxd; + } + } + } + } // if (pc != dummypoint && ...) + } else if (fliptype == 2) { + // A 3-to-2 flip: [e,d,a], [e,d,b], [e,d,c] => [a,b,c] + // We assume that neither 'e' nor 'd' is dummypoint. + if (level == 0) { + // Both new tets [a,b,c,d] and [b,a,c,e] are new tets. + if ((pa != dummypoint) && (pb != dummypoint) && (pc != dummypoint)) { + // Get the largest dihedral angle of [a,b,c,d]. + tetalldihedral(pa, pb, pc, pd, NULL, &cosmaxd, NULL); + diff = cosmaxd - fc->cosdihed_in; + if (fabs(diff/fc->cosdihed_in) < b->epsilon) diff = 0.0; // Rounding + if (diff <= 0) { //if (cosmaxd <= fc->cosdihed_in) { + rejflag = 1; + } else { + // Record the largest new angle. + if (cosmaxd < fc->cosdihed_out) { + fc->cosdihed_out = cosmaxd; + } + // Get the largest dihedral angle of [b,a,c,e]. + tetalldihedral(pb, pa, pc, pe, NULL, &cosmaxd, NULL); + diff = cosmaxd - fc->cosdihed_in; + if (fabs(diff/fc->cosdihed_in) < b->epsilon) diff = 0.0;// Rounding + if (diff <= 0) { //if (cosmaxd <= fc->cosdihed_in) { + rejflag = 1; + } else { + // Record the largest new angle. + if (cosmaxd < fc->cosdihed_out) { + fc->cosdihed_out = cosmaxd; + } + } + } + } + } else { // level > 0 + if (edgepivot == 1) { + // The new tet [a,b,c,d] will be flipped. Only check [b,a,c,e]. + if ((pa != dummypoint) && (pb != dummypoint) && (pc != dummypoint)) { + // Get the largest dihedral angle of [b,a,c,e]. + tetalldihedral(pb, pa, pc, pe, NULL, &cosmaxd, NULL); + diff = cosmaxd - fc->cosdihed_in; + if (fabs(diff/fc->cosdihed_in) < b->epsilon) diff = 0.0;// Rounding + if (diff <= 0) { //if (cosmaxd <= fc->cosdihed_in) { + rejflag = 1; + } else { + // Record the largest new angle. + if (cosmaxd < fc->cosdihed_out) { + fc->cosdihed_out = cosmaxd; + } + } + } + } else { + // The new tet [b,a,c,e] will be flipped. Only check [a,b,c,d]. + if ((pa != dummypoint) && (pb != dummypoint) && (pc != dummypoint)) { + // Get the largest dihedral angle of [b,a,c,e]. + tetalldihedral(pa, pb, pc, pd, NULL, &cosmaxd, NULL); + diff = cosmaxd - fc->cosdihed_in; + if (fabs(diff/fc->cosdihed_in) < b->epsilon) diff = 0.0;// Rounding + if (diff <= 0) { //if (cosmaxd <= fc->cosdihed_in) { + rejflag = 1; + } else { + // Record the largest new angle. + if (cosmaxd < fc->cosdihed_out) { + fc->cosdihed_out = cosmaxd; + } + } + } + } // edgepivot + } // level + } + } + + return rejflag; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// removeedgebyflips() Attempt to remove an edge by flips. // +// // +// 'flipedge' is a non-convex or flat edge [a,b,#,#] to be removed. // +// // +// The return value is a positive integer, it indicates whether the edge is // +// removed or not. A value "2" means the edge is removed, otherwise, the // +// edge is not removed and the value (must >= 3) is the current number of // +// tets in the edge star. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::removeedgebyflips(triface *flipedge, flipconstraints* fc) +{ + triface *abtets, spintet; + int t1ver; + int n, nn, i; + + + if (checksubsegflag) { + // Do not flip a segment. + if (issubseg(*flipedge)) { + if (fc->collectencsegflag) { + face checkseg, *paryseg; + tsspivot1(*flipedge, checkseg); + if (!sinfected(checkseg)) { + // Queue this segment in list. + sinfect(checkseg); + caveencseglist->newindex((void **) &paryseg); + *paryseg = checkseg; + } + } + return 0; + } + } + + // Count the number of tets at edge [a,b]. + n = 0; + spintet = *flipedge; + while (1) { + n++; + fnextself(spintet); + if (spintet.tet == flipedge->tet) break; + } + if (n < 3) { + // It is only possible when the mesh contains inverted tetrahedra. + terminatetetgen(this, 2); // Report a bug + } + + if ((b->flipstarsize > 0) && (n > b->flipstarsize)) { + // The star size exceeds the limit. + return 0; // Do not flip it. + } + + // Allocate spaces. + abtets = new triface[n]; + // Collect the tets at edge [a,b]. + spintet = *flipedge; + i = 0; + while (1) { + abtets[i] = spintet; + setelemcounter(abtets[i], 1); + i++; + fnextself(spintet); + if (spintet.tet == flipedge->tet) break; + } + + + // Try to flip the edge (level = 0, edgepivot = 0). + nn = flipnm(abtets, n, 0, 0, fc); + + + if (nn > 2) { + // Edge is not flipped. Unmarktest the remaining tets in Star(ab). + for (i = 0; i < nn; i++) { + setelemcounter(abtets[i], 0); + } + // Restore the input edge (needed by Lawson's flip). + *flipedge = abtets[0]; + } + + // Release the temporary allocated spaces. + // NOTE: fc->unflip must be 0. + int bakunflip = fc->unflip; + fc->unflip = 0; + flipnm_post(abtets, n, nn, 0, fc); + fc->unflip = bakunflip; + + delete [] abtets; + + return nn; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// removefacebyflips() Remove a face by flips. // +// // +// Return 1 if the face is removed. Otherwise, return 0. // +// // +// ASSUMPTIONS: // +// - 'flipface' must not be a subface. // +// - 'flipface' must not be a hull face. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::removefacebyflips(triface *flipface, flipconstraints* fc) +{ + triface fliptets[3], flipedge; + point pa, pb, pc, pd, pe; + REAL ori; + int reducflag = 0; + + fliptets[0] = *flipface; + fsym(*flipface, fliptets[1]); + pa = org(fliptets[0]); + pb = dest(fliptets[0]); + pc = apex(fliptets[0]); + pd = oppo(fliptets[0]); + pe = oppo(fliptets[1]); + + ori = orient3d(pa, pb, pd, pe); + if (ori > 0) { + ori = orient3d(pb, pc, pd, pe); + if (ori > 0) { + ori = orient3d(pc, pa, pd, pe); + if (ori > 0) { + // Found a 2-to-3 flip. + reducflag = 1; + } else { + eprev(*flipface, flipedge); // [c,a] + } + } else { + enext(*flipface, flipedge); // [b,c] + } + } else { + flipedge = *flipface; // [a,b] + } + + if (reducflag) { + // A 2-to-3 flip is found. + flip23(fliptets, 0, fc); + return 1; + } else { + // Try to flip the selected edge of this face. + if (removeedgebyflips(&flipedge, fc) == 2) { + return 1; + } + } + + // Face is not removed. + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// recoveredge() Recover an edge in current tetrahedralization. // +// // +// If the edge is recovered, 'searchtet' returns a tet containing the edge. // +// // +// This edge may intersect a set of faces and edges in the mesh. All these // +// faces or edges are needed to be removed. // +// // +// If the parameter 'fullsearch' is set, it tries to flip any face or edge // +// that intersects the recovering edge. Otherwise, only the face or edge // +// which is visible by 'startpt' is tried. // +// // +// The parameter 'sedge' is used to report self-intersection. If it is not // +// a NULL, it is EITHER a segment OR a subface that contains this edge. // +// // +// Note that this routine assumes that the tetrahedralization is convex. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::recoveredgebyflips(point startpt, point endpt, face *sedge, + triface* searchtet, int fullsearch) +{ + flipconstraints fc; + enum interresult dir; + + fc.seg[0] = startpt; + fc.seg[1] = endpt; + fc.checkflipeligibility = 1; + + // The mainloop of the edge reocvery. + while (1) { // Loop I + + // Search the edge from 'startpt'. + point2tetorg(startpt, *searchtet); + dir = finddirection(searchtet, endpt); + if (dir == ACROSSVERT) { + if (dest(*searchtet) == endpt) { + return 1; // Edge is recovered. + } else { + if (sedge) { + return report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + } else { + return 0; + } + } + } + + // The edge is missing. + + // Try to remove the first intersecting face/edge. + enextesymself(*searchtet); // Go to the opposite face. + if (dir == ACROSSFACE) { + if (checksubfaceflag) { + if (issubface(*searchtet)) { + if (sedge) { + return report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + } else { + return 0; // Cannot flip a subface. + } + } + } + // Try to flip a crossing face. + if (removefacebyflips(searchtet, &fc)) { + continue; + } + } else if (dir == ACROSSEDGE) { + if (checksubsegflag) { + if (issubseg(*searchtet)) { + if (sedge) { + return report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + } else { + return 0; // Cannot flip a segment. + } + } + } + // Try to flip an intersecting edge. + if (removeedgebyflips(searchtet, &fc) == 2) { + continue; + } + } + + // The edge is missing. + + if (fullsearch) { + // Try to flip one of the faces/edges which intersects the edge. + triface neightet, spintet; + point pa, pb, pc, pd; + badface bakface; + enum interresult dir1; + int types[2], poss[4], pos = 0; + int success = 0; + int t1ver; + int i, j; + + // Loop through the sequence of intersecting faces/edges from + // 'startpt' to 'endpt'. + point2tetorg(startpt, *searchtet); + dir = finddirection(searchtet, endpt); + + // Go to the face/edge intersecting the searching edge. + enextesymself(*searchtet); // Go to the opposite face. + // This face/edge has been tried in previous step. + + while (1) { // Loop I-I + + // Find the next intersecting face/edge. + fsymself(*searchtet); + if (dir == ACROSSFACE) { + neightet = *searchtet; + j = (neightet.ver & 3); // j is the current face number. + for (i = j + 1; i < j + 4; i++) { + neightet.ver = (i % 4); + pa = org(neightet); + pb = dest(neightet); + pc = apex(neightet); + pd = oppo(neightet); // The above point. + if (tri_edge_test(pa,pb,pc,startpt,endpt, pd, 1, types, poss)) { + dir = (enum interresult) types[0]; + pos = poss[0]; + break; + } else { + dir = DISJOINT; + pos = 0; + } + } // i + // There must be an intersection face/edge. + if (dir == DISJOINT) { + terminatetetgen(this, 2); + } + } else if (dir == ACROSSEDGE) { + while (1) { // Loop I-I-I + // Check the two opposite faces (of the edge) in 'searchtet'. + for (i = 0; i < 2; i++) { + if (i == 0) { + enextesym(*searchtet, neightet); + } else { + eprevesym(*searchtet, neightet); + } + pa = org(neightet); + pb = dest(neightet); + pc = apex(neightet); + pd = oppo(neightet); // The above point. + if (tri_edge_test(pa,pb,pc,startpt,endpt,pd,1, types, poss)) { + dir = (enum interresult) types[0]; + pos = poss[0]; + break; // for loop + } else { + dir = DISJOINT; + pos = 0; + } + } // i + if (dir != DISJOINT) { + // Find an intersection face/edge. + break; // Loop I-I-I + } + // No intersection. Rotate to the next tet at the edge. + fnextself(*searchtet); + } // while (1) // Loop I-I-I + } else { + terminatetetgen(this, 2); // Report a bug + } + + // Adjust to the intersecting edge/vertex. + for (i = 0; i < pos; i++) { + enextself(neightet); + } + + if (dir == SHAREVERT) { + // Check if we have reached the 'endpt'. + pd = org(neightet); + if (pd == endpt) { + // Failed to recover the edge. + break; // Loop I-I + } else { + terminatetetgen(this, 2); // Report a bug + } + } + + // The next to be flipped face/edge. + *searchtet = neightet; + + // Bakup this face (tetrahedron). + bakface.forg = org(*searchtet); + bakface.fdest = dest(*searchtet); + bakface.fapex = apex(*searchtet); + bakface.foppo = oppo(*searchtet); + + // Try to flip this intersecting face/edge. + if (dir == ACROSSFACE) { + if (checksubfaceflag) { + if (issubface(*searchtet)) { + if (sedge) { + return report_selfint_edge(startpt,endpt,sedge,searchtet,dir); + } else { + return 0; // Cannot flip a subface. + } + } + } + if (removefacebyflips(searchtet, &fc)) { + success = 1; + break; // Loop I-I + } + } else if (dir == ACROSSEDGE) { + if (checksubsegflag) { + if (issubseg(*searchtet)) { + if (sedge) { + return report_selfint_edge(startpt,endpt,sedge,searchtet,dir); + } else { + return 0; // Cannot flip a segment. + } + } + } + if (removeedgebyflips(searchtet, &fc) == 2) { + success = 1; + break; // Loop I-I + } + } else if (dir == ACROSSVERT) { + if (sedge) { + //return report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + terminatetetgen(this, 2); + } else { + return 0; + } + } else { + terminatetetgen(this, 2); + } + + // The face/edge is not flipped. + if ((searchtet->tet == NULL) || + (org(*searchtet) != bakface.forg) || + (dest(*searchtet) != bakface.fdest) || + (apex(*searchtet) != bakface.fapex) || + (oppo(*searchtet) != bakface.foppo)) { + // 'searchtet' was flipped. We must restore it. + point2tetorg(bakface.forg, *searchtet); + dir1 = finddirection(searchtet, bakface.fdest); + if (dir1 == ACROSSVERT) { + if (dest(*searchtet) == bakface.fdest) { + spintet = *searchtet; + while (1) { + if (apex(spintet) == bakface.fapex) { + // Found the face. + *searchtet = spintet; + break; + } + fnextself(spintet); + if (spintet.tet == searchtet->tet) { + searchtet->tet = NULL; + break; // Not find. + } + } // while (1) + if (searchtet->tet != NULL) { + if (oppo(*searchtet) != bakface.foppo) { + fsymself(*searchtet); + if (oppo(*searchtet) != bakface.foppo) { + // The original (intersecting) tet has been flipped. + searchtet->tet = NULL; + break; // Not find. + } + } + } + } else { + searchtet->tet = NULL; // Not find. + } + } else { + searchtet->tet = NULL; // Not find. + } + if (searchtet->tet == NULL) { + success = 0; // This face/edge has been destroyed. + break; // Loop I-I + } + } + } // while (1) // Loop I-I + + if (success) { + // One of intersecting faces/edges is flipped. + continue; + } + + } // if (fullsearch) + + // The edge is missing. + break; // Loop I + + } // while (1) // Loop I + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// add_steinerpt_in_schoenhardtpoly() Insert a Steiner point in a Schoen- // +// hardt polyhedron. // +// // +// 'abtets' is an array of n tets which all share at the edge [a,b]. Let the // +// tets are [a,b,p0,p1], [a,b,p1,p2], ..., [a,b,p_(n-2),p_(n-1)]. Moreover, // +// the edge [p0,p_(n-1)] intersects all of the tets in 'abtets'. A special // +// case is that the edge [p0,p_(n-1)] is coplanar with the edge [a,b]. // +// Such set of tets arises when we want to recover an edge from 'p0' to 'p_ // +// (n-1)', and the number of tets at [a,b] can not be reduced by any flip. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::add_steinerpt_in_schoenhardtpoly(triface *abtets, int n, + int chkencflag) +{ + triface worktet, *parytet; + triface faketet1, faketet2; + point pc, pd, steinerpt; + insertvertexflags ivf; + optparameters opm; + REAL vcd[3], sampt[3], smtpt[3]; + REAL maxminvol = 0.0, minvol = 0.0, ori; + int success, maxidx = 0; + int it, i; + + + pc = apex(abtets[0]); // pc = p0 + pd = oppo(abtets[n-1]); // pd = p_(n-1) + + + // Find an optimial point in edge [c,d]. It is visible by all outer faces + // of 'abtets', and it maxmizes the min volume. + + // initialize the list of 2n boundary faces. + for (i = 0; i < n; i++) { + edestoppo(abtets[i], worktet); // [p_i,p_i+1,a] + cavetetlist->newindex((void **) &parytet); + *parytet = worktet; + eorgoppo(abtets[i], worktet); // [p_i+1,p_i,b] + cavetetlist->newindex((void **) &parytet); + *parytet = worktet; + } + + int N = 100; + REAL stepi = 0.01; + + // Search the point along the edge [c,d]. + for (i = 0; i < 3; i++) vcd[i] = pd[i] - pc[i]; + + // Sample N points in edge [c,d]. + for (it = 1; it < N; it++) { + for (i = 0; i < 3; i++) { + sampt[i] = pc[i] + (stepi * (double) it) * vcd[i]; + } + for (i = 0; i < cavetetlist->objects; i++) { + parytet = (triface *) fastlookup(cavetetlist, i); + ori = orient3d(dest(*parytet), org(*parytet), apex(*parytet), sampt); + if (i == 0) { + minvol = ori; + } else { + if (minvol > ori) minvol = ori; + } + } // i + if (it == 1) { + maxminvol = minvol; + maxidx = it; + } else { + if (maxminvol < minvol) { + maxminvol = minvol; + maxidx = it; + } + } + } // it + + if (maxminvol <= 0) { + cavetetlist->restart(); + return 0; + } + + for (i = 0; i < 3; i++) { + smtpt[i] = pc[i] + (stepi * (double) maxidx) * vcd[i]; + } + + // Create two faked tets to hold the two non-existing boundary faces: + // [d,c,a] and [c,d,b]. + maketetrahedron(&faketet1); + setvertices(faketet1, pd, pc, org(abtets[0]), dummypoint); + cavetetlist->newindex((void **) &parytet); + *parytet = faketet1; + maketetrahedron(&faketet2); + setvertices(faketet2, pc, pd, dest(abtets[0]), dummypoint); + cavetetlist->newindex((void **) &parytet); + *parytet = faketet2; + + // Point smooth options. + opm.max_min_volume = 1; + opm.numofsearchdirs = 20; + opm.searchstep = 0.001; + opm.maxiter = 100; // Limit the maximum iterations. + opm.initval = 0.0; // Initial volume is zero. + + // Try to relocate the point into the inside of the polyhedron. + success = smoothpoint(smtpt, cavetetlist, 1, &opm); + + if (success) { + while (opm.smthiter == 100) { + // It was relocated and the prescribed maximum iteration reached. + // Try to increase the search stepsize. + opm.searchstep *= 10.0; + //opm.maxiter = 100; // Limit the maximum iterations. + opm.initval = opm.imprval; + opm.smthiter = 0; // Init. + smoothpoint(smtpt, cavetetlist, 1, &opm); + } + } // if (success) + + // Delete the two faked tets. + tetrahedrondealloc(faketet1.tet); + tetrahedrondealloc(faketet2.tet); + + cavetetlist->restart(); + + if (!success) { + return 0; + } + + + // Insert the Steiner point. + makepoint(&steinerpt, FREEVOLVERTEX); + for (i = 0; i < 3; i++) steinerpt[i] = smtpt[i]; + + // Insert the created Steiner point. + for (i = 0; i < n; i++) { + infect(abtets[i]); + caveoldtetlist->newindex((void **) &parytet); + *parytet = abtets[i]; + } + worktet = abtets[0]; // No need point location. + ivf.iloc = (int) INSTAR; + ivf.chkencflag = chkencflag; + ivf.assignmeshsize = b->metric; + if (ivf.assignmeshsize) { + // Search the tet containing 'steinerpt' for size interpolation. + locate(steinerpt, &(abtets[0])); + worktet = abtets[0]; + } + + // Insert the new point into the tetrahedralization T. + // Note that T is convex (nonconvex = 0). + if (insertpoint(steinerpt, &worktet, NULL, NULL, &ivf)) { + // The vertex has been inserted. + st_volref_count++; + if (steinerleft > 0) steinerleft--; + return 1; + } else { + // Not inserted. + pointdealloc(steinerpt); + return 0; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// add_steinerpt_in_segment() Add a Steiner point inside a segment. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::add_steinerpt_in_segment(face* misseg, int searchlevel) +{ + triface searchtet; + face *paryseg, candseg; + point startpt, endpt, pc, pd; + flipconstraints fc; + enum interresult dir; + REAL P[3], Q[3], tp, tq; + REAL len, smlen = 0, split = 0, split_q = 0; + int success; + int i; + + startpt = sorg(*misseg); + endpt = sdest(*misseg); + + fc.seg[0] = startpt; + fc.seg[1] = endpt; + fc.checkflipeligibility = 1; + fc.collectencsegflag = 1; + + point2tetorg(startpt, searchtet); + dir = finddirection(&searchtet, endpt); + // Try to flip the first intersecting face/edge. + enextesymself(searchtet); // Go to the opposite face. + + int bak_fliplinklevel = b->fliplinklevel; + b->fliplinklevel = searchlevel; + + if (dir == ACROSSFACE) { + // A face is intersected with the segment. Try to flip it. + success = removefacebyflips(&searchtet, &fc); + } else if (dir == ACROSSEDGE) { + // An edge is intersected with the segment. Try to flip it. + success = removeedgebyflips(&searchtet, &fc); + } + + split = 0; + for (i = 0; i < caveencseglist->objects; i++) { + paryseg = (face *) fastlookup(caveencseglist, i); + suninfect(*paryseg); + // Calculate the shortest edge between the two lines. + pc = sorg(*paryseg); + pd = sdest(*paryseg); + tp = tq = 0; + if (linelineint(startpt, endpt, pc, pd, P, Q, &tp, &tq)) { + // Does the shortest edge lie between the two segments? + // Round tp and tq. + if ((tp > 0) && (tq < 1)) { + if (tp < 0.5) { + if (tp < (b->epsilon * 1e+3)) tp = 0.0; + } else { + if ((1.0 - tp) < (b->epsilon * 1e+3)) tp = 1.0; + } + } + if ((tp <= 0) || (tp >= 1)) continue; + if ((tq > 0) && (tq < 1)) { + if (tq < 0.5) { + if (tq < (b->epsilon * 1e+3)) tq = 0.0; + } else { + if ((1.0 - tq) < (b->epsilon * 1e+3)) tq = 1.0; + } + } + if ((tq <= 0) || (tq >= 1)) continue; + // It is a valid shortest edge. Calculate its length. + len = distance(P, Q); + if (split == 0) { + smlen = len; + split = tp; + split_q = tq; + candseg = *paryseg; + } else { + if (len < smlen) { + smlen = len; + split = tp; + split_q = tq; + candseg = *paryseg; + } + } + } + } + + caveencseglist->restart(); + b->fliplinklevel = bak_fliplinklevel; + + if (split == 0) { + // Found no crossing segment. + return 0; + } + + face splitsh; + face splitseg; + point steinerpt, *parypt; + insertvertexflags ivf; + + if (b->addsteiner_algo == 1) { + // Split the segment at the closest point to a near segment. + makepoint(&steinerpt, FREESEGVERTEX); + for (i = 0; i < 3; i++) { + steinerpt[i] = startpt[i] + split * (endpt[i] - startpt[i]); + } + } else { // b->addsteiner_algo == 2 + for (i = 0; i < 3; i++) { + P[i] = startpt[i] + split * (endpt[i] - startpt[i]); + } + pc = sorg(candseg); + pd = sdest(candseg); + for (i = 0; i < 3; i++) { + Q[i] = pc[i] + split_q * (pd[i] - pc[i]); + } + makepoint(&steinerpt, FREEVOLVERTEX); + for (i = 0; i < 3; i++) { + steinerpt[i] = 0.5 * (P[i] + Q[i]); + } + } + + // We need to locate the point. Start searching from 'searchtet'. + if (split < 0.5) { + point2tetorg(startpt, searchtet); + } else { + point2tetorg(endpt, searchtet); + } + if (b->addsteiner_algo == 1) { + splitseg = *misseg; + spivot(*misseg, splitsh); + } else { + splitsh.sh = NULL; + splitseg.sh = NULL; + } + ivf.iloc = (int) OUTSIDE; + ivf.bowywat = 1; + ivf.lawson = 0; + ivf.rejflag = 0; + ivf.chkencflag = 0; + ivf.sloc = (int) ONEDGE; + ivf.sbowywat = 1; + ivf.splitbdflag = 0; + ivf.validflag = 1; + ivf.respectbdflag = 1; + ivf.assignmeshsize = b->metric; + + if (!insertpoint(steinerpt, &searchtet, &splitsh, &splitseg, &ivf)) { + pointdealloc(steinerpt); + return 0; + } + + if (b->addsteiner_algo == 1) { + // Save this Steiner point (for removal). + // Re-use the array 'subvertstack'. + subvertstack->newindex((void **) &parypt); + *parypt = steinerpt; + st_segref_count++; + } else { // b->addsteiner_algo == 2 + // Queue the segment for recovery. + subsegstack->newindex((void **) &paryseg); + *paryseg = *misseg; + st_volref_count++; + } + if (steinerleft > 0) steinerleft--; + + return 1; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// addsteiner4recoversegment() Add a Steiner point for recovering a seg. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::addsteiner4recoversegment(face* misseg, int splitsegflag) +{ + triface *abtets, searchtet, spintet; + face splitsh; + face *paryseg; + point startpt, endpt; + point pa, pb, pd, steinerpt, *parypt; + enum interresult dir; + insertvertexflags ivf; + int types[2], poss[4]; + int n, endi, success; + int t1ver; + int i; + + startpt = sorg(*misseg); + if (pointtype(startpt) == FREESEGVERTEX) { + sesymself(*misseg); + startpt = sorg(*misseg); + } + endpt = sdest(*misseg); + + // Try to recover the edge by adding Steiner points. + point2tetorg(startpt, searchtet); + dir = finddirection(&searchtet, endpt); + enextself(searchtet); + + if (dir == ACROSSFACE) { + // The segment is crossing at least 3 faces. Find the common edge of + // the first 3 crossing faces. + esymself(searchtet); + fsym(searchtet, spintet); + pd = oppo(spintet); + for (i = 0; i < 3; i++) { + pa = org(spintet); + pb = dest(spintet); + if (tri_edge_test(pa, pb, pd, startpt, endpt, NULL, 1, types, poss)) { + break; // Found the edge. + } + enextself(spintet); + eprevself(searchtet); + } + esymself(searchtet); + } + + spintet = searchtet; + n = 0; endi = -1; + while (1) { + // Check if the endpt appears in the star. + if (apex(spintet) == endpt) { + endi = n; // Remember the position of endpt. + } + n++; // Count a tet in the star. + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + + if (endi > 0) { + // endpt is also in the edge star + // Get all tets in the edge star. + abtets = new triface[n]; + spintet = searchtet; + for (i = 0; i < n; i++) { + abtets[i] = spintet; + fnextself(spintet); + } + + success = 0; + + if (dir == ACROSSFACE) { + // Find a Steiner points inside the polyhedron. + if (add_steinerpt_in_schoenhardtpoly(abtets, endi, 0)) { + success = 1; + } + } else if (dir == ACROSSEDGE) { + // PLC check. + if (issubseg(searchtet)) { + terminatetetgen(this, 2); + } + if (n > 4) { + // In this case, 'abtets' is separated by the plane (containing the + // two intersecting edges) into two parts, P1 and P2, where P1 + // consists of 'endi' tets: abtets[0], abtets[1], ..., + // abtets[endi-1], and P2 consists of 'n - endi' tets: + // abtets[endi], abtets[endi+1], abtets[n-1]. + if (endi > 2) { // P1 + // There are at least 3 tets in the first part. + if (add_steinerpt_in_schoenhardtpoly(abtets, endi, 0)) { + success++; + } + } + if ((n - endi) > 2) { // P2 + // There are at least 3 tets in the first part. + if (add_steinerpt_in_schoenhardtpoly(&(abtets[endi]), n - endi, 0)) { + success++; + } + } + } else { + // In this case, a 4-to-4 flip should be re-cover the edge [c,d]. + // However, there will be invalid tets (either zero or negtive + // volume). Otherwise, [c,d] should already be recovered by the + // recoveredge() function. + terminatetetgen(this, 2); + } + } else { + terminatetetgen(this, 2); + } + + delete [] abtets; + + if (success) { + // Add the missing segment back to the recovering list. + subsegstack->newindex((void **) &paryseg); + *paryseg = *misseg; + return 1; + } + } // if (endi > 0) + + if (!splitsegflag) { + return 0; + } + + if (b->verbose > 2) { + printf(" Splitting segment (%d, %d)\n", pointmark(startpt), + pointmark(endpt)); + } + steinerpt = NULL; + + if (b->addsteiner_algo > 0) { // -Y/1 or -Y/2 + if (add_steinerpt_in_segment(misseg, 3)) { + return 1; + } + sesymself(*misseg); + if (add_steinerpt_in_segment(misseg, 3)) { + return 1; + } + sesymself(*misseg); + } + + + + + if (steinerpt == NULL) { + // Split the segment at its midpoint. + makepoint(&steinerpt, FREESEGVERTEX); + for (i = 0; i < 3; i++) { + steinerpt[i] = 0.5 * (startpt[i] + endpt[i]); + } + + // We need to locate the point. + spivot(*misseg, splitsh); + ivf.iloc = (int) OUTSIDE; + ivf.bowywat = 1; + ivf.lawson = 0; + ivf.rejflag = 0; + ivf.chkencflag = 0; + ivf.sloc = (int) ONEDGE; + ivf.sbowywat = 1; + ivf.splitbdflag = 0; + ivf.validflag = 1; + ivf.respectbdflag = 1; + ivf.assignmeshsize = b->metric; + if (!insertpoint(steinerpt, &searchtet, &splitsh, misseg, &ivf)) { + terminatetetgen(this, 2); + } + } // if (endi > 0) + + // Save this Steiner point (for removal). + // Re-use the array 'subvertstack'. + subvertstack->newindex((void **) &parypt); + *parypt = steinerpt; + + st_segref_count++; + if (steinerleft > 0) steinerleft--; + + return 1; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// recoversegments() Recover all segments. // +// // +// All segments need to be recovered are in 'subsegstack'. // +// // +// This routine first tries to recover each segment by only using flips. If // +// no flip is possible, and the flag 'steinerflag' is set, it then tries to // +// insert Steiner points near or in the segment. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::recoversegments(arraypool *misseglist, int fullsearch, + int steinerflag) +{ + triface searchtet, spintet; + face sseg, *paryseg; + point startpt, endpt; + int success; + int t1ver; + + long bak_inpoly_count = st_volref_count; + long bak_segref_count = st_segref_count; + + if (b->verbose > 1) { + printf(" Recover segments [%s level = %2d] #: %ld.\n", + (b->fliplinklevel > 0) ? "fixed" : "auto", + (b->fliplinklevel > 0) ? b->fliplinklevel : autofliplinklevel, + subsegstack->objects); + } + + // Loop until 'subsegstack' is empty. + while (subsegstack->objects > 0l) { + // seglist is used as a stack. + subsegstack->objects--; + paryseg = (face *) fastlookup(subsegstack, subsegstack->objects); + sseg = *paryseg; + + // Check if this segment has been recovered. + sstpivot1(sseg, searchtet); + if (searchtet.tet != NULL) { + continue; // Not a missing segment. + } + + startpt = sorg(sseg); + endpt = sdest(sseg); + + if (b->verbose > 2) { + printf(" Recover segment (%d, %d).\n", pointmark(startpt), + pointmark(endpt)); + } + + success = 0; + + if (recoveredgebyflips(startpt, endpt, &sseg, &searchtet, 0)) { + success = 1; + } else { + // Try to recover it from the other direction. + if (recoveredgebyflips(endpt, startpt, &sseg, &searchtet, 0)) { + success = 1; + } + } + + if (!success && fullsearch) { + if (recoveredgebyflips(startpt, endpt, &sseg, &searchtet, fullsearch)) { + success = 1; + } + } + + if (success) { + // Segment is recovered. Insert it. + // Let the segment remember an adjacent tet. + sstbond1(sseg, searchtet); + // Bond the segment to all tets containing it. + spintet = searchtet; + do { + tssbond1(spintet, sseg); + fnextself(spintet); + } while (spintet.tet != searchtet.tet); + } else { + if (steinerflag > 0) { + // Try to recover the segment but do not split it. + if (addsteiner4recoversegment(&sseg, 0)) { + success = 1; + } + if (!success && (steinerflag > 1)) { + // Split the segment. + addsteiner4recoversegment(&sseg, 1); + success = 1; + } + } + if (!success) { + if (misseglist != NULL) { + // Save this segment. + misseglist->newindex((void **) &paryseg); + *paryseg = sseg; + } + } + } + + } // while (subsegstack->objects > 0l) + + if (steinerflag) { + if (b->verbose > 1) { + // Report the number of added Steiner points. + if (st_volref_count > bak_inpoly_count) { + printf(" Add %ld Steiner points in volume.\n", + st_volref_count - bak_inpoly_count); + } + if (st_segref_count > bak_segref_count) { + printf(" Add %ld Steiner points in segments.\n", + st_segref_count - bak_segref_count); + } + } + } + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// recoverfacebyflips() Recover a face by flips. // +// // +// 'pa', 'pb', and 'pc' are the three vertices of this face. This routine // +// tries to recover it in the tetrahedral mesh. It is assumed that the three // +// edges, i.e., pa->pb, pb->pc, and pc->pa all exist. // +// // +// If the face is recovered, it is returned by 'searchtet'. // +// // +// If 'searchsh' is not NULL, it is a subface to be recovered. Its vertices // +// must be pa, pb, and pc. It is mainly used to check self-intersections. // +// Another use of this subface is to split it when a Steiner point is found // +// inside this subface. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::recoverfacebyflips(point pa, point pb, point pc, + face *searchsh, triface* searchtet) +{ + triface spintet, flipedge; + point pd, pe; + flipconstraints fc; + int types[2], poss[4], intflag; + int success; + int t1ver; + int i, j; + + + fc.fac[0] = pa; + fc.fac[1] = pb; + fc.fac[2] = pc; + fc.checkflipeligibility = 1; + success = 0; + + for (i = 0; i < 3 && !success; i++) { + while (1) { + // Get a tet containing the edge [a,b]. + point2tetorg(fc.fac[i], *searchtet); + finddirection(searchtet, fc.fac[(i+1)%3]); + // Search the face [a,b,c] + spintet = *searchtet; + while (1) { + if (apex(spintet) == fc.fac[(i+2)%3]) { + // Found the face. + *searchtet = spintet; + // Return the face [a,b,c]. + for (j = i; j > 0; j--) { + eprevself(*searchtet); + } + success = 1; + break; + } + fnextself(spintet); + if (spintet.tet == searchtet->tet) break; + } // while (1) + if (success) break; + // The face is missing. Try to recover it. + flipedge.tet = NULL; + // Find a crossing edge of this face. + spintet = *searchtet; + while (1) { + pd = apex(spintet); + pe = oppo(spintet); + if ((pd != dummypoint) && (pe != dummypoint)) { + // Check if [d,e] intersects [a,b,c] + intflag = tri_edge_test(pa, pb, pc, pd, pe, NULL, 1, types, poss); + if (intflag > 0) { + // By the assumption that all edges of the face exist, they can + // only intersect at a single point. + if (intflag == 2) { + // Go to the edge [d,e]. + edestoppo(spintet, flipedge); // [d,e,a,b] + if (searchsh != NULL) { + // Check the intersection type. + if ((types[0] == (int) ACROSSFACE) || + (types[0] == (int) ACROSSEDGE)) { + // Check if [e,d] is a segment. + if (issubseg(flipedge)) { + return report_selfint_face(pa, pb, pc, searchsh, &flipedge, + intflag, types, poss); + } else { + // Check if [e,d] is an edge of a subface. + triface chkface = flipedge; + while (1) { + if (issubface(chkface)) break; + fsymself(chkface); + if (chkface.tet == flipedge.tet) break; + } + if (issubface(chkface)) { + // Two subfaces are intersecting. + return report_selfint_face(pa, pb, pc,searchsh,&chkface, + intflag, types, poss); + } + } + } else if (types[0] == TOUCHFACE) { + // This is possible when a Steiner point was added on it. + point touchpt, *parypt; + if (poss[1] == 0) { + touchpt = pd; // pd is a coplanar vertex. + } else { + touchpt = pe; // pe is a coplanar vertex. + } + if (pointtype(touchpt) == FREEVOLVERTEX) { + // A volume Steiner point was added in this subface. + // Split this subface by this point. + face checksh, *parysh; + int siloc = (int) ONFACE; + int sbowat = 0; // Only split this subface. A 1-to-3 flip. + setpointtype(touchpt, FREEFACETVERTEX); + sinsertvertex(touchpt, searchsh, NULL, siloc, sbowat, 0); + st_volref_count--; + st_facref_count++; + // Queue this vertex for removal. + subvertstack->newindex((void **) &parypt); + *parypt = touchpt; + // Queue new subfaces for recovery. + // Put all new subfaces into stack for recovery. + for (i = 0; i < caveshbdlist->objects; i++) { + // Get an old subface at edge [a, b]. + parysh = (face *) fastlookup(caveshbdlist, i); + spivot(*parysh, checksh); // The new subface [a, b, p]. + // Do not recover a deleted new face (degenerated). + if (checksh.sh[3] != NULL) { + subfacstack->newindex((void **) &parysh); + *parysh = checksh; + } + } + // Delete the old subfaces in sC(p). + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + shellfacedealloc(subfaces, parysh->sh); + } + // Clear working lists. + caveshlist->restart(); + caveshbdlist->restart(); + cavesegshlist->restart(); + // We can return this function. + searchsh->sh = NULL; // It has been split. + return 1; + } else { + // Other cases may be due to a bug or a PLC error. + return report_selfint_face(pa, pb, pc, searchsh, &flipedge, + intflag, types, poss); + } + } else { + // The other intersection types: ACROSSVERT, TOUCHEDGE, + // SHAREVERTEX should not be possible or due to a PLC error. + return report_selfint_face(pa, pb, pc, searchsh, &flipedge, + intflag, types, poss); + } + } // if (searchsh != NULL) + } else { // intflag == 4. Coplanar case. + terminatetetgen(this, 2); + } + break; + } // if (intflag > 0) + } + fnextself(spintet); + if (spintet.tet == searchtet->tet) { + terminatetetgen(this, 2); + } + } // while (1) + // Try to flip the edge [d,e]. + if (removeedgebyflips(&flipedge, &fc) == 2) { + // A crossing edge is removed. + continue; + } + break; + } // while (1) + } // i + + return success; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// recoversubfaces() Recover all subfaces. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::recoversubfaces(arraypool *misshlist, int steinerflag) +{ + triface searchtet, neightet, spintet; + face searchsh, neighsh, neineish, *parysh; + face bdsegs[3]; + point startpt, endpt, apexpt, *parypt; + point steinerpt; + insertvertexflags ivf; + int success; + int t1ver; + int i, j; + + if (b->verbose > 1) { + printf(" Recover subfaces [%s level = %2d] #: %ld.\n", + (b->fliplinklevel > 0) ? "fixed" : "auto", + (b->fliplinklevel > 0) ? b->fliplinklevel : autofliplinklevel, + subfacstack->objects); + } + + // Loop until 'subfacstack' is empty. + while (subfacstack->objects > 0l) { + + subfacstack->objects--; + parysh = (face *) fastlookup(subfacstack, subfacstack->objects); + searchsh = *parysh; + + if (searchsh.sh[3] == NULL) continue; // Skip a dead subface. + + stpivot(searchsh, neightet); + if (neightet.tet != NULL) continue; // Skip a recovered subface. + + + if (b->verbose > 2) { + printf(" Recover subface (%d, %d, %d).\n",pointmark(sorg(searchsh)), + pointmark(sdest(searchsh)), pointmark(sapex(searchsh))); + } + + // The three edges of the face need to be existed first. + for (i = 0; i < 3; i++) { + sspivot(searchsh, bdsegs[i]); + if (bdsegs[i].sh != NULL) { + // The segment must exist. + sstpivot1(bdsegs[i], searchtet); + if (searchtet.tet == NULL) { + terminatetetgen(this, 2); + } + } else { + // This edge is not a segment (due to a Steiner point). + // Check whether it exists or not. + success = 0; + startpt = sorg(searchsh); + endpt = sdest(searchsh); + point2tetorg(startpt, searchtet); + finddirection(&searchtet, endpt); + if (dest(searchtet) == endpt) { + success = 1; + } else { + // The edge is missing. Try to recover it. + if (recoveredgebyflips(startpt, endpt, &searchsh, &searchtet, 0)) { + success = 1; + } else { + if (recoveredgebyflips(endpt, startpt, &searchsh, &searchtet, 0)) { + success = 1; + } + } + } + if (success) { + // Insert a temporary segment to protect this edge. + makeshellface(subsegs, &(bdsegs[i])); + setshvertices(bdsegs[i], startpt, endpt, NULL); + smarktest2(bdsegs[i]); // It's a temporary segment. + // Insert this segment into surface mesh. + ssbond(searchsh, bdsegs[i]); + spivot(searchsh, neighsh); + if (neighsh.sh != NULL) { + ssbond(neighsh, bdsegs[i]); + } + // Insert this segment into tetrahedralization. + sstbond1(bdsegs[i], searchtet); + // Bond the segment to all tets containing it. + spintet = searchtet; + do { + tssbond1(spintet, bdsegs[i]); + fnextself(spintet); + } while (spintet.tet != searchtet.tet); + } else { + // An edge of this subface is missing. Can't recover this subface. + // Delete any temporary segment that has been created. + for (j = (i - 1); j >= 0; j--) { + if (smarktest2ed(bdsegs[j])) { + spivot(bdsegs[j], neineish); + ssdissolve(neineish); + spivot(neineish, neighsh); + if (neighsh.sh != NULL) { + ssdissolve(neighsh); + } + sstpivot1(bdsegs[j], searchtet); + spintet = searchtet; + while (1) { + tssdissolve1(spintet); + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + shellfacedealloc(subsegs, bdsegs[j].sh); + } + } // j + if (steinerflag) { + // Add a Steiner point at the midpoint of this edge. + if (b->verbose > 2) { + printf(" Add a Steiner point in subedge (%d, %d).\n", + pointmark(startpt), pointmark(endpt)); + } + makepoint(&steinerpt, FREEFACETVERTEX); + for (j = 0; j < 3; j++) { + steinerpt[j] = 0.5 * (startpt[j] + endpt[j]); + } + + point2tetorg(startpt, searchtet); // Start from 'searchtet'. + ivf.iloc = (int) OUTSIDE; // Need point location. + ivf.bowywat = 1; + ivf.lawson = 0; + ivf.rejflag = 0; + ivf.chkencflag = 0; + ivf.sloc = (int) ONEDGE; + ivf.sbowywat = 1; // Allow flips in facet. + ivf.splitbdflag = 0; + ivf.validflag = 1; + ivf.respectbdflag = 1; + ivf.assignmeshsize = b->metric; + if (!insertpoint(steinerpt, &searchtet, &searchsh, NULL, &ivf)) { + terminatetetgen(this, 2); + } + // Save this Steiner point (for removal). + // Re-use the array 'subvertstack'. + subvertstack->newindex((void **) &parypt); + *parypt = steinerpt; + + st_facref_count++; + if (steinerleft > 0) steinerleft--; + } // if (steinerflag) + break; + } + } + senextself(searchsh); + } // i + + if (i == 3) { + // Recover the subface. + startpt = sorg(searchsh); + endpt = sdest(searchsh); + apexpt = sapex(searchsh); + + success = recoverfacebyflips(startpt,endpt,apexpt,&searchsh,&searchtet); + + // Delete any temporary segment that has been created. + for (j = 0; j < 3; j++) { + if (smarktest2ed(bdsegs[j])) { + spivot(bdsegs[j], neineish); + ssdissolve(neineish); + spivot(neineish, neighsh); + if (neighsh.sh != NULL) { + ssdissolve(neighsh); + } + sstpivot1(bdsegs[j], neightet); + spintet = neightet; + while (1) { + tssdissolve1(spintet); + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + shellfacedealloc(subsegs, bdsegs[j].sh); + } + } // j + + if (success) { + if (searchsh.sh != NULL) { + // Face is recovered. Insert it. + tsbond(searchtet, searchsh); + fsymself(searchtet); + sesymself(searchsh); + tsbond(searchtet, searchsh); + } + } else { + if (steinerflag) { + // Add a Steiner point at the barycenter of this subface. + if (b->verbose > 2) { + printf(" Add a Steiner point in subface (%d, %d, %d).\n", + pointmark(startpt), pointmark(endpt), pointmark(apexpt)); + } + makepoint(&steinerpt, FREEFACETVERTEX); + for (j = 0; j < 3; j++) { + steinerpt[j] = (startpt[j] + endpt[j] + apexpt[j]) / 3.0; + } + + point2tetorg(startpt, searchtet); // Start from 'searchtet'. + ivf.iloc = (int) OUTSIDE; // Need point location. + ivf.bowywat = 1; + ivf.lawson = 0; + ivf.rejflag = 0; + ivf.chkencflag = 0; + ivf.sloc = (int) ONFACE; + ivf.sbowywat = 1; // Allow flips in facet. + ivf.splitbdflag = 0; + ivf.validflag = 1; + ivf.respectbdflag = 1; + ivf.assignmeshsize = b->metric; + if (!insertpoint(steinerpt, &searchtet, &searchsh, NULL, &ivf)) { + terminatetetgen(this, 2); + } + // Save this Steiner point (for removal). + // Re-use the array 'subvertstack'. + subvertstack->newindex((void **) &parypt); + *parypt = steinerpt; + + st_facref_count++; + if (steinerleft > 0) steinerleft--; + } // if (steinerflag) + } + } else { + success = 0; + } + + if (!success) { + if (misshlist != NULL) { + // Save this subface. + misshlist->newindex((void **) &parysh); + *parysh = searchsh; + } + } + + } // while (subfacstack->objects > 0l) + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// getvertexstar() Return the star of a vertex. // +// // +// If the flag 'fullstar' is set, return the complete star of this vertex. // +// Otherwise, only a part of the star which is bounded by facets is returned.// +// // +// 'tetlist' returns the list of tets in the star of the vertex 'searchpt'. // +// Every tet in 'tetlist' is at the face opposing to 'searchpt'. // +// // +// 'vertlist' returns the list of vertices in the star (exclude 'searchpt'). // +// // +// 'shlist' returns the list of subfaces in the star. Each subface must face // +// to the interior of this star. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::getvertexstar(int fullstar, point searchpt, arraypool* tetlist, + arraypool* vertlist, arraypool* shlist) +{ + triface searchtet, neightet, *parytet; + face checksh, *parysh; + point pt, *parypt; + int collectflag; + int t1ver; + int i, j; + + point2tetorg(searchpt, searchtet); + + // Go to the opposite face (the link face) of the vertex. + enextesymself(searchtet); + //assert(oppo(searchtet) == searchpt); + infect(searchtet); // Collect this tet (link face). + tetlist->newindex((void **) &parytet); + *parytet = searchtet; + if (vertlist != NULL) { + // Collect three (link) vertices. + j = (searchtet.ver & 3); // The current vertex index. + for (i = 1; i < 4; i++) { + pt = (point) searchtet.tet[4 + ((j + i) % 4)]; + pinfect(pt); + vertlist->newindex((void **) &parypt); + *parypt = pt; + } + } + + collectflag = 1; + esym(searchtet, neightet); + if (issubface(neightet)) { + if (shlist != NULL) { + tspivot(neightet, checksh); + if (!sinfected(checksh)) { + // Collect this subface (link edge). + sinfected(checksh); + shlist->newindex((void **) &parysh); + *parysh = checksh; + } + } + if (!fullstar) { + collectflag = 0; + } + } + if (collectflag) { + fsymself(neightet); // Goto the adj tet of this face. + esymself(neightet); // Goto the oppo face of this vertex. + // assert(oppo(neightet) == searchpt); + infect(neightet); // Collect this tet (link face). + tetlist->newindex((void **) &parytet); + *parytet = neightet; + if (vertlist != NULL) { + // Collect its apex. + pt = apex(neightet); + pinfect(pt); + vertlist->newindex((void **) &parypt); + *parypt = pt; + } + } // if (collectflag) + + // Continue to collect all tets in the star. + for (i = 0; i < tetlist->objects; i++) { + searchtet = * (triface *) fastlookup(tetlist, i); + // Note that 'searchtet' is a face opposite to 'searchpt', and the neighbor + // tet at the current edge is already collected. + // Check the neighbors at the other two edges of this face. + for (j = 0; j < 2; j++) { + collectflag = 1; + enextself(searchtet); + esym(searchtet, neightet); + if (issubface(neightet)) { + if (shlist != NULL) { + tspivot(neightet, checksh); + if (!sinfected(checksh)) { + // Collect this subface (link edge). + sinfected(checksh); + shlist->newindex((void **) &parysh); + *parysh = checksh; + } + } + if (!fullstar) { + collectflag = 0; + } + } + if (collectflag) { + fsymself(neightet); + if (!infected(neightet)) { + esymself(neightet); // Go to the face opposite to 'searchpt'. + infect(neightet); + tetlist->newindex((void **) &parytet); + *parytet = neightet; + if (vertlist != NULL) { + // Check if a vertex is collected. + pt = apex(neightet); + if (!pinfected(pt)) { + pinfect(pt); + vertlist->newindex((void **) &parypt); + *parypt = pt; + } + } + } // if (!infected(neightet)) + } // if (collectflag) + } // j + } // i + + + // Uninfect the list of tets and vertices. + for (i = 0; i < tetlist->objects; i++) { + parytet = (triface *) fastlookup(tetlist, i); + uninfect(*parytet); + } + + if (vertlist != NULL) { + for (i = 0; i < vertlist->objects; i++) { + parypt = (point *) fastlookup(vertlist, i); + puninfect(*parypt); + } + } + + if (shlist != NULL) { + for (i = 0; i < shlist->objects; i++) { + parysh = (face *) fastlookup(shlist, i); + suninfect(*parysh); + } + } + + return (int) tetlist->objects; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// getedge() Get a tetrahedron having the two endpoints. // +// // +// The method here is to search the second vertex in the link faces of the // +// first vertex. The global array 'cavetetlist' is re-used for searching. // +// // +// This function is used for the case when the mesh is non-convex. Otherwise,// +// the function finddirection() should be faster than this. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::getedge(point e1, point e2, triface *tedge) +{ + triface searchtet, neightet, *parytet; + point pt; + int done; + int i, j; + + if (b->verbose > 2) { + printf(" Get edge from %d to %d.\n", pointmark(e1), pointmark(e2)); + } + + // Quickly check if 'tedge' is just this edge. + if (!isdeadtet(*tedge)) { + if (org(*tedge) == e1) { + if (dest(*tedge) == e2) { + return 1; + } + } else if (org(*tedge) == e2) { + if (dest(*tedge) == e1) { + esymself(*tedge); + return 1; + } + } + } + + // Search for the edge [e1, e2]. + point2tetorg(e1, *tedge); + finddirection(tedge, e2); + if (dest(*tedge) == e2) { + return 1; + } else { + // Search for the edge [e2, e1]. + point2tetorg(e2, *tedge); + finddirection(tedge, e1); + if (dest(*tedge) == e1) { + esymself(*tedge); + return 1; + } + } + + + // Go to the link face of e1. + point2tetorg(e1, searchtet); + enextesymself(searchtet); + arraypool *tetlist = cavebdrylist; + + // Search e2. + for (i = 0; i < 3; i++) { + pt = apex(searchtet); + if (pt == e2) { + // Found. 'searchtet' is [#,#,e2,e1]. + eorgoppo(searchtet, *tedge); // [e1,e2,#,#]. + return 1; + } + enextself(searchtet); + } + + // Get the adjacent link face at 'searchtet'. + fnext(searchtet, neightet); + esymself(neightet); + // assert(oppo(neightet) == e1); + pt = apex(neightet); + if (pt == e2) { + // Found. 'neightet' is [#,#,e2,e1]. + eorgoppo(neightet, *tedge); // [e1,e2,#,#]. + return 1; + } + + // Continue searching in the link face of e1. + infect(searchtet); + tetlist->newindex((void **) &parytet); + *parytet = searchtet; + infect(neightet); + tetlist->newindex((void **) &parytet); + *parytet = neightet; + + done = 0; + + for (i = 0; (i < tetlist->objects) && !done; i++) { + parytet = (triface *) fastlookup(tetlist, i); + searchtet = *parytet; + for (j = 0; (j < 2) && !done; j++) { + enextself(searchtet); + fnext(searchtet, neightet); + if (!infected(neightet)) { + esymself(neightet); + pt = apex(neightet); + if (pt == e2) { + // Found. 'neightet' is [#,#,e2,e1]. + eorgoppo(neightet, *tedge); + done = 1; + } else { + infect(neightet); + tetlist->newindex((void **) &parytet); + *parytet = neightet; + } + } + } // j + } // i + + // Uninfect the list of visited tets. + for (i = 0; i < tetlist->objects; i++) { + parytet = (triface *) fastlookup(tetlist, i); + uninfect(*parytet); + } + tetlist->restart(); + + return done; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// reduceedgesatvertex() Reduce the number of edges at a given vertex. // +// // +// 'endptlist' contains the endpoints of edges connecting at the vertex. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::reduceedgesatvertex(point startpt, arraypool* endptlist) +{ + triface searchtet; + point *pendpt, *parypt; + enum interresult dir; + flipconstraints fc; + int reduceflag; + int count; + int n, i, j; + + + fc.remvert = startpt; + fc.checkflipeligibility = 1; + + while (1) { + + count = 0; + + for (i = 0; i < endptlist->objects; i++) { + pendpt = (point *) fastlookup(endptlist, i); + if (*pendpt == dummypoint) { + continue; // Do not reduce a virtual edge. + } + reduceflag = 0; + // Find the edge. + if (nonconvex) { + if (getedge(startpt, *pendpt, &searchtet)) { + dir = ACROSSVERT; + } else { + // The edge does not exist (was flipped). + dir = INTERSECT; + } + } else { + point2tetorg(startpt, searchtet); + dir = finddirection(&searchtet, *pendpt); + } + if (dir == ACROSSVERT) { + if (dest(searchtet) == *pendpt) { + // Do not flip a segment. + if (!issubseg(searchtet)) { + n = removeedgebyflips(&searchtet, &fc); + if (n == 2) { + reduceflag = 1; + } + } + } + } else { + // The edge has been flipped. + reduceflag = 1; + } + if (reduceflag) { + count++; + // Move the last vertex into this slot. + j = endptlist->objects - 1; + parypt = (point *) fastlookup(endptlist, j); + *pendpt = *parypt; + endptlist->objects--; + i--; + } + } // i + + if (count == 0) { + // No edge is reduced. + break; + } + + } // while (1) + + return (int) endptlist->objects; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// removevertexbyflips() Remove a vertex by flips. // +// // +// This routine attempts to remove the given vertex 'rempt' (p) from the // +// tetrahedralization (T) by a sequence of flips. // +// // +// The algorithm used here is a simple edge reduce method. Suppose there are // +// n edges connected at p. We try to reduce the number of edges by flipping // +// any edge (not a segment) that is connecting at p. // +// // +// Unless T is a Delaunay tetrahedralization, there is no guarantee that 'p' // +// can be successfully removed. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::removevertexbyflips(point steinerpt) +{ + triface *fliptets = NULL, wrktets[4]; + triface searchtet, spintet, neightet; + face parentsh, spinsh, checksh; + face leftseg, rightseg, checkseg; + point lpt = NULL, rpt = NULL, apexpt; //, *parypt; + flipconstraints fc; + enum verttype vt; + enum locateresult loc; + int valence, removeflag; + int slawson; + int t1ver; + int n, i; + + vt = pointtype(steinerpt); + + + if (vt == FREESEGVERTEX) { + sdecode(point2sh(steinerpt), leftseg); + leftseg.shver = 0; + if (sdest(leftseg) == steinerpt) { + senext(leftseg, rightseg); + spivotself(rightseg); + rightseg.shver = 0; + } else { + rightseg = leftseg; + senext2(rightseg, leftseg); + spivotself(leftseg); + leftseg.shver = 0; + } + lpt = sorg(leftseg); + rpt = sdest(rightseg); + if (b->verbose > 2) { + printf(" Removing Steiner point %d in segment (%d, %d).\n", + pointmark(steinerpt), pointmark(lpt), pointmark(rpt)); + + } + } else if (vt == FREEFACETVERTEX) { + if (b->verbose > 2) { + printf(" Removing Steiner point %d in facet.\n", + pointmark(steinerpt)); + } + } else if (vt == FREEVOLVERTEX) { + if (b->verbose > 2) { + printf(" Removing Steiner point %d in volume.\n", + pointmark(steinerpt)); + } + } else if (vt == VOLVERTEX) { + if (b->verbose > 2) { + printf(" Removing a point %d in volume.\n", + pointmark(steinerpt)); + } + } else { + // It is not a Steiner point. + return 0; + } + + // Try to reduce the number of edges at 'p' by flips. + getvertexstar(1, steinerpt, cavetetlist, cavetetvertlist, NULL); + cavetetlist->restart(); // This list may be re-used. + if (cavetetvertlist->objects > 3l) { + valence = reduceedgesatvertex(steinerpt, cavetetvertlist); + } else { + valence = cavetetvertlist->objects; + } + cavetetvertlist->restart(); + + removeflag = 0; + + if (valence == 4) { + // Only 4 vertices (4 tets) left! 'p' is inside the convex hull of the 4 + // vertices. This case is due to that 'p' is not exactly on the segment. + point2tetorg(steinerpt, searchtet); + loc = INTETRAHEDRON; + removeflag = 1; + } else if (valence == 5) { + // There are 5 edges. + if (vt == FREESEGVERTEX) { + sstpivot1(leftseg, searchtet); + if (org(searchtet) != steinerpt) { + esymself(searchtet); + } + i = 0; // Count the numbe of tet at the edge [p,lpt]. + neightet.tet = NULL; // Init the face. + spintet = searchtet; + while (1) { + i++; + if (apex(spintet) == rpt) { + // Remember the face containing the edge [lpt, rpt]. + neightet = spintet; + } + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + if (i == 3) { + // This case has been checked below. + } else if (i == 4) { + // There are 4 tets sharing at [p,lpt]. There must be 4 tets sharing + // at [p,rpt]. There must be a face [p, lpt, rpt]. + if (apex(neightet) == rpt) { + // The edge (segment) has been already recovered! + // Check if a 6-to-2 flip is possible (to remove 'p'). + // Let 'searchtet' be [p,d,a,b] + esym(neightet, searchtet); + enextself(searchtet); + // Check if there are exactly three tets at edge [p,d]. + wrktets[0] = searchtet; // [p,d,a,b] + for (i = 0; i < 2; i++) { + fnext(wrktets[i], wrktets[i+1]); // [p,d,b,c], [p,d,c,a] + } + if (apex(wrktets[0]) == oppo(wrktets[2])) { + loc = ONFACE; + removeflag = 1; + } + } + } + } else if (vt == FREEFACETVERTEX) { + // It is possible to do a 6-to-2 flip to remove the vertex. + point2tetorg(steinerpt, searchtet); + // Get the three faces of 'searchtet' which share at p. + // All faces has p as origin. + wrktets[0] = searchtet; + wrktets[1] = searchtet; + esymself(wrktets[1]); + enextself(wrktets[1]); + wrktets[2] = searchtet; + eprevself(wrktets[2]); + esymself(wrktets[2]); + // All internal edges of the six tets have valance either 3 or 4. + // Get one edge which has valance 3. + searchtet.tet = NULL; + for (i = 0; i < 3; i++) { + spintet = wrktets[i]; + valence = 0; + while (1) { + valence++; + fnextself(spintet); + if (spintet.tet == wrktets[i].tet) break; + } + if (valence == 3) { + // Found the edge. + searchtet = wrktets[i]; + break; + } + } + // Note, we do not detach the three subfaces at p. + // They will be removed within a 4-to-1 flip. + loc = ONFACE; + removeflag = 1; + } + //removeflag = 1; + } + + if (!removeflag) { + if (vt == FREESEGVERTEX) { + // Check is it possible to recover the edge [lpt,rpt]. + // The condition to check is: Whether each tet containing 'leftseg' is + // adjacent to a tet containing 'rightseg'. + sstpivot1(leftseg, searchtet); + if (org(searchtet) != steinerpt) { + esymself(searchtet); + } + spintet = searchtet; + while (1) { + // Go to the bottom face of this tet. + eprev(spintet, neightet); + esymself(neightet); // [steinerpt, p1, p2, lpt] + // Get the adjacent tet. + fsymself(neightet); // [p1, steinerpt, p2, rpt] + if (oppo(neightet) != rpt) { + // Found a non-matching adjacent tet. + break; + } + { + // [2017-10-15] Check if the tet is inverted? + point chkp1 = org(neightet); + point chkp2 = apex(neightet); + REAL chkori = orient3d(rpt, lpt, chkp1, chkp2); + if (chkori >= 0.0) { + // Either inverted or degenerated. + break; + } + } + fnextself(spintet); + if (spintet.tet == searchtet.tet) { + // 'searchtet' is [p,d,p1,p2]. + loc = ONEDGE; + removeflag = 1; + break; + } + } + } // if (vt == FREESEGVERTEX) + } + + if (!removeflag) { + if (vt == FREESEGVERTEX) { + // Check if the edge [lpt, rpt] exists. + if (getedge(lpt, rpt, &searchtet)) { + // We have recovered this edge. Shift the vertex into the volume. + // We can recover this edge if the subfaces are not recovered yet. + if (!checksubfaceflag) { + // Remove the vertex from the surface mesh. + // This will re-create the segment [lpt, rpt] and re-triangulate + // all the facets at the segment. + // Detach the subsegments from their surrounding tets. + for (i = 0; i < 2; i++) { + checkseg = (i == 0) ? leftseg : rightseg; + sstpivot1(checkseg, neightet); + spintet = neightet; + while (1) { + tssdissolve1(spintet); + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + sstdissolve1(checkseg); + } // i + slawson = 1; // Do lawson flip after removal. + spivot(rightseg, parentsh); // 'rightseg' has p as its origin. + sremovevertex(steinerpt, &parentsh, &rightseg, slawson); + // Clear the list for new subfaces. + caveshbdlist->restart(); + // Insert the new segment. + sstbond1(rightseg, searchtet); + spintet = searchtet; + while (1) { + tssbond1(spintet, rightseg); + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + // The Steiner point has been shifted into the volume. + setpointtype(steinerpt, FREEVOLVERTEX); + st_segref_count--; + st_volref_count++; + return 1; + } // if (!checksubfaceflag) + } // if (getedge(...)) + } // if (vt == FREESEGVERTEX) + } // if (!removeflag) + + if (!removeflag) { + return 0; + } + + if (vt == FREESEGVERTEX) { + // Detach the subsegments from their surronding tets. + for (i = 0; i < 2; i++) { + checkseg = (i == 0) ? leftseg : rightseg; + sstpivot1(checkseg, neightet); + spintet = neightet; + while (1) { + tssdissolve1(spintet); + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + sstdissolve1(checkseg); + } // i + if (checksubfaceflag) { + // Detach the subfaces at the subsegments from their attached tets. + for (i = 0; i < 2; i++) { + checkseg = (i == 0) ? leftseg : rightseg; + spivot(checkseg, parentsh); + if (parentsh.sh != NULL) { + spinsh = parentsh; + while (1) { + stpivot(spinsh, neightet); + if (neightet.tet != NULL) { + tsdissolve(neightet); + } + sesymself(spinsh); + stpivot(spinsh, neightet); + if (neightet.tet != NULL) { + tsdissolve(neightet); + } + stdissolve(spinsh); + spivotself(spinsh); // Go to the next subface. + if (spinsh.sh == parentsh.sh) break; + } + } + } // i + } // if (checksubfaceflag) + } + + if (loc == INTETRAHEDRON) { + // Collect the four tets containing 'p'. + fliptets = new triface[4]; + fliptets[0] = searchtet; // [p,d,a,b] + for (i = 0; i < 2; i++) { + fnext(fliptets[i], fliptets[i+1]); // [p,d,b,c], [p,d,c,a] + } + eprev(fliptets[0], fliptets[3]); + fnextself(fliptets[3]); // it is [a,p,b,c] + eprevself(fliptets[3]); + esymself(fliptets[3]); // [a,b,c,p]. + // Remove p by a 4-to-1 flip. + //flip41(fliptets, 1, 0, 0); + /* + { // Do not flip if there are wrong number of subfaces inside. + // Check if there are three subfaces at 'p'. + triface newface; face flipshs[3]; + int spivot = 0, scount = 0; + for (i = 0; i < 3; i++) { + fnext(fliptets[3], newface); // [a,b,p,d],[b,c,p,d],[c,a,p,d]. + tspivot(newface, flipshs[i]); + if (flipshs[i].sh != NULL) { + spivot = i; // Remember this subface. + scount++; + } + enextself(fliptets[3]); + } + if (scount > 0) { + // There are three subfaces connecting at p. + // Only do flip if a 3-to-1 flip is possible at p at the bottom face. + if (scount != 3) { + // Wrong number of subfaces. Do not flip. + delete [] fliptets; + return 0; + } + // [2018-03-07] an old fix, not 100% safe. + // if (scount < 3) { + // // The new subface is one of {[a,b,d], [b,c,d], [c,a,d]}. + // // assert(scount == 1); // spivot >= 0 + // if (scount != 1) { + // // Wrong number of subfaces. Do not flip. + // delete [] fliptets; + // return 0; + // } + //} + } + } + */ + if (vt == FREEFACETVERTEX) { + // [2018-03-08] Check if the last 4-to-1 flip is valid. + // fliptets[0],[1],[2] are [p,d,a,b],[p,d,b,c],[p,d,c,a] + triface checktet, chkface; + for (i = 0; i < 3; i++) { + enext(fliptets[i], checktet); + esymself(checktet); // [a,d,b,p],[b,d,c,p],[c,d,a,p] + int scount = 0; int k; + for (k = 0; k < 3; k++) { + esym(checktet, chkface); + if (issubface(chkface)) scount++; + enextself(checktet); + } + if (scount == 3) { + break; // Found a tet which support a 3-to-1 flip. + } else if (scount == 2) { + // This is a strange configuration. Debug it. + // Do not do this flip. + delete [] fliptets; + return 0; + } + } + if (i == 3) { + // No tet in [p,d,a,b],[p,d,b,c],[p,d,c,a] support it. + int scount = 0; + for (i = 0; i < 3; i++) { + eprev(fliptets[i], checktet); + esymself(checktet); // [p,a,b,d],[p,b,c,d],[p,c,a,d] + if (issubface(chkface)) scount++; + } + if (scount != 3) { + // Do not do this flip. + delete [] fliptets; + return 0; + } + } + } // if (vt == FREEFACETVERTEX) + flip41(fliptets, 1, &fc); + //recenttet = fliptets[0]; + } else if (loc == ONFACE) { + // Let the original two tets be [a,b,c,d] and [b,a,c,e]. And p is in + // face [a,b,c]. Let 'searchtet' be the tet [p,d,a,b]. + // Collect the six tets containing 'p'. + fliptets = new triface[6]; + fliptets[0] = searchtet; // [p,d,a,b] + for (i = 0; i < 2; i++) { + fnext(fliptets[i], fliptets[i+1]); // [p,d,b,c], [p,d,c,a] + } + eprev(fliptets[0], fliptets[3]); + fnextself(fliptets[3]); // [a,p,b,e] + esymself(fliptets[3]); // [p,a,e,b] + eprevself(fliptets[3]); // [e,p,a,b] + for (i = 3; i < 5; i++) { + fnext(fliptets[i], fliptets[i+1]); // [e,p,b,c], [e,p,c,a] + } + if (vt == FREEFACETVERTEX) { + // We need to determine the location of three subfaces at p. + valence = 0; // Re-use it. + for (i = 3; i < 6; i++) { + if (issubface(fliptets[i])) valence++; + } + if (valence > 0) { + // We must do 3-to-2 flip in the upper part. We simply re-arrange + // the six tets. + for (i = 0; i < 3; i++) { + esym(fliptets[i+3], wrktets[i]); + esym(fliptets[i], fliptets[i+3]); + fliptets[i] = wrktets[i]; + } + // Swap the last two pairs, i.e., [1]<->[[2], and [4]<->[5] + wrktets[1] = fliptets[1]; + fliptets[1] = fliptets[2]; + fliptets[2] = wrktets[1]; + wrktets[1] = fliptets[4]; + fliptets[4] = fliptets[5]; + fliptets[5] = wrktets[1]; + } + // [2018-03-08] Check if the last 4-to-1 flip is valid. + // fliptets[0],[1],[2] are [p,d,a,b],[p,d,b,c],[p,d,c,a] + triface checktet, chkface; + for (i = 0; i < 3; i++) { + enext(fliptets[i], checktet); + esymself(checktet); // [a,d,b,p],[b,d,c,p],[c,d,a,p] + int scount = 0; int k; + for (k = 0; k < 3; k++) { + esym(checktet, chkface); + if (issubface(chkface)) scount++; + enextself(checktet); + } + if (scount == 3) { + break; // Found a tet which support a 3-to-1 flip. + } else if (scount == 2) { + // This is a strange configuration. Debug it. + // Do not do this flip. + delete [] fliptets; + return 0; + } + } + if (i == 3) { + // No tet in [p,d,a,b],[p,d,b,c],[p,d,c,a] support it. + int scount = 0; + for (i = 0; i < 3; i++) { + eprev(fliptets[i], checktet); + esymself(checktet); // [p,a,b,d],[p,b,c,d],[p,c,a,d] + if (issubface(chkface)) scount++; + } + if (scount != 3) { + // Do not do this flip. + delete [] fliptets; + return 0; + } + } + } // vt == FREEFACETVERTEX + // Remove p by a 6-to-2 flip, which is a combination of two flips: + // a 3-to-2 (deletes the edge [e,p]), and + // a 4-to-1 (deletes the vertex p). + // First do a 3-to-2 flip on [e,p,a,b],[e,p,b,c],[e,p,c,a]. It creates + // two new tets: [a,b,c,p] and [b,a,c,e]. The new tet [a,b,c,p] is + // degenerate (has zero volume). It will be deleted in the followed + // 4-to-1 flip. + //flip32(&(fliptets[3]), 1, 0, 0); + flip32(&(fliptets[3]), 1, &fc); + // Second do a 4-to-1 flip on [p,d,a,b],[p,d,b,c],[p,d,c,a],[a,b,c,p]. + // This creates a new tet [a,b,c,d]. + //flip41(fliptets, 1, 0, 0); + flip41(fliptets, 1, &fc); + //recenttet = fliptets[0]; + } else if (loc == ONEDGE) { + // Let the original edge be [e,d] and p is in [e,d]. Assume there are n + // tets sharing at edge [e,d] originally. We number the link vertices + // of [e,d]: p_0, p_1, ..., p_n-1. 'searchtet' is [p,d,p_0,p_1]. + // Count the number of tets at edge [e,p] and [p,d] (this is n). + n = 0; + spintet = searchtet; + while (1) { + n++; + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + // Collect the 2n tets containing 'p'. + fliptets = new triface[2 * n]; + fliptets[0] = searchtet; // [p,b,p_0,p_1] + for (i = 0; i < (n - 1); i++) { + fnext(fliptets[i], fliptets[i+1]); // [p,d,p_i,p_i+1]. + } + eprev(fliptets[0], fliptets[n]); + fnextself(fliptets[n]); // [p_0,p,p_1,e] + esymself(fliptets[n]); // [p,p_0,e,p_1] + eprevself(fliptets[n]); // [e,p,p_0,p_1] + for (i = n; i < (2 * n - 1); i++) { + fnext(fliptets[i], fliptets[i+1]); // [e,p,p_i,p_i+1]. + } + // Remove p by a 2n-to-n flip, it is a sequence of n flips: + // - Do a 2-to-3 flip on + // [p_0,p_1,p,d] and + // [p,p_1,p_0,e]. + // This produces: + // [e,d,p_0,p_1], + // [e,d,p_1,p] (degenerated), and + // [e,d,p,p_0] (degenerated). + wrktets[0] = fliptets[0]; // [p,d,p_0,p_1] + eprevself(wrktets[0]); // [p_0,p,d,p_1] + esymself(wrktets[0]); // [p,p_0,p_1,d] + enextself(wrktets[0]); // [p_0,p_1,p,d] [0] + wrktets[1] = fliptets[n]; // [e,p,p_0,p_1] + enextself(wrktets[1]); // [p,p_0,e,p_1] + esymself(wrktets[1]); // [p_0,p,p_1,e] + eprevself(wrktets[1]); // [p_1,p_0,p,e] [1] + //flip23(wrktets, 1, 0, 0); + flip23(wrktets, 1, &fc); + // Save the new tet [e,d,p,p_0] (degenerated). + fliptets[n] = wrktets[2]; + // Save the new tet [e,d,p_0,p_1]. + fliptets[0] = wrktets[0]; + // - Repeat from i = 1 to n-2: (n - 2) flips + // - Do a 3-to-2 flip on + // [p,p_i,d,e], + // [p,p_i,e,p_i+1], and + // [p,p_i,p_i+1,d]. + // This produces: + // [d,e,p_i+1,p_i], and + // [e,d,p_i+1,p] (degenerated). + for (i = 1; i < (n - 1); i++) { + wrktets[0] = wrktets[1]; // [e,d,p_i,p] (degenerated). + enextself(wrktets[0]); // [d,p_i,e,p] (...) + esymself(wrktets[0]); // [p_i,d,p,e] (...) + eprevself(wrktets[0]); // [p,p_i,d,e] (degenerated) [0]. + wrktets[1] = fliptets[n+i]; // [e,p,p_i,p_i+1] + enextself(wrktets[1]); // [p,p_i,e,p_i+1] [1] + wrktets[2] = fliptets[i]; // [p,d,p_i,p_i+1] + eprevself(wrktets[2]); // [p_i,p,d,p_i+1] + esymself(wrktets[2]); // [p,p_i,p_i+1,d] [2] + //flip32(wrktets, 1, 0, 0); + flip32(wrktets, 1, &fc); + // Save the new tet [e,d,p_i,p_i+1]. // FOR DEBUG ONLY + fliptets[i] = wrktets[0]; // [d,e,p_i+1,p_i] // FOR DEBUG ONLY + esymself(fliptets[i]); // [e,d,p_i,p_i+1] // FOR DEBUG ONLY + } + // - Do a 4-to-1 flip on + // [p,p_0,e,d], [d,e,p_0,p], + // [p,p_0,d,p_n-1], [e,p_n-1,p_0,p], + // [p,p_0,p_n-1,e], [p_0,p_n-1,d,p], and + // [e,d,p_n-1,p]. + // This produces + // [e,d,p_n-1,p_0] and + // deletes p. + wrktets[3] = wrktets[1]; // [e,d,p_n-1,p] (degenerated) [3] + wrktets[0] = fliptets[n]; // [e,d,p,p_0] (degenerated) + eprevself(wrktets[0]); // [p,e,d,p_0] (...) + esymself(wrktets[0]); // [e,p,p_0,d] (...) + enextself(wrktets[0]); // [p,p_0,e,d] (degenerated) [0] + wrktets[1] = fliptets[n-1]; // [p,d,p_n-1,p_0] + esymself(wrktets[1]); // [d,p,p_0,p_n-1] + enextself(wrktets[1]); // [p,p_0,d,p_n-1] [1] + wrktets[2] = fliptets[2*n-1]; // [e,p,p_n-1,p_0] + enextself(wrktets[2]); // [p_p_n-1,e,p_0] + esymself(wrktets[2]); // [p_n-1,p,p_0,e] + enextself(wrktets[2]); // [p,p_0,p_n-1,e] [2] + //flip41(wrktets, 1, 0, 0); + flip41(wrktets, 1, &fc); + // Save the new tet [e,d,p_n-1,p_0] // FOR DEBUG ONLY + fliptets[n-1] = wrktets[0]; // [e,d,p_n-1,p_0] // FOR DEBUG ONLY + //recenttet = fliptets[0]; + } + + delete [] fliptets; + + if (vt == FREESEGVERTEX) { + // Remove the vertex from the surface mesh. + // This will re-create the segment [lpt, rpt] and re-triangulate + // all the facets at the segment. + // Only do lawson flip when subfaces are not recovery yet. + slawson = (checksubfaceflag ? 0 : 1); + spivot(rightseg, parentsh); // 'rightseg' has p as its origin. + sremovevertex(steinerpt, &parentsh, &rightseg, slawson); + + // The original segment is returned in 'rightseg'. + rightseg.shver = 0; + // Insert the new segment. + point2tetorg(lpt, searchtet); + finddirection(&searchtet, rpt); + sstbond1(rightseg, searchtet); + spintet = searchtet; + while (1) { + tssbond1(spintet, rightseg); + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + + if (checksubfaceflag) { + // Insert subfaces at segment [lpt,rpt] into the tetrahedralization. + spivot(rightseg, parentsh); + if (parentsh.sh != NULL) { + spinsh = parentsh; + while (1) { + if (sorg(spinsh) != lpt) { + sesymself(spinsh); + } + apexpt = sapex(spinsh); + // Find the adjacent tet of [lpt,rpt,apexpt]; + spintet = searchtet; + while (1) { + if (apex(spintet) == apexpt) { + tsbond(spintet, spinsh); + sesymself(spinsh); // Get to another side of this face. + fsym(spintet, neightet); + tsbond(neightet, spinsh); + sesymself(spinsh); // Get back to the original side. + break; + } + fnextself(spintet); + } + spivotself(spinsh); + if (spinsh.sh == parentsh.sh) break; + } + } + } // if (checksubfaceflag) + + // Clear the set of new subfaces. + caveshbdlist->restart(); + } // if (vt == FREESEGVERTEX) + + // The point has been removed. + if (pointtype(steinerpt) != UNUSEDVERTEX) { + setpointtype(steinerpt, UNUSEDVERTEX); + unuverts++; + } + if (vt != VOLVERTEX) { + // Update the correspinding counters. + if (vt == FREESEGVERTEX) { + st_segref_count--; + } else if (vt == FREEFACETVERTEX) { + st_facref_count--; + } else if (vt == FREEVOLVERTEX) { + st_volref_count--; + } + if (steinerleft > 0) steinerleft++; + } + + return 1; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// suppressbdrysteinerpoint() Suppress a boundary Steiner point // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::suppressbdrysteinerpoint(point steinerpt) +{ + face parentsh, spinsh, *parysh; + face leftseg, rightseg; + point lpt = NULL, rpt = NULL; + int i; + + verttype vt = pointtype(steinerpt); + + if (vt == FREESEGVERTEX) { + sdecode(point2sh(steinerpt), leftseg); + leftseg.shver = 0; + if (sdest(leftseg) == steinerpt) { + senext(leftseg, rightseg); + spivotself(rightseg); + rightseg.shver = 0; + } else { + rightseg = leftseg; + senext2(rightseg, leftseg); + spivotself(leftseg); + leftseg.shver = 0; + } + lpt = sorg(leftseg); + rpt = sdest(rightseg); + if (b->verbose > 2) { + printf(" Suppressing Steiner point %d in segment (%d, %d).\n", + pointmark(steinerpt), pointmark(lpt), pointmark(rpt)); + } + // Get all subfaces at the left segment [lpt, steinerpt]. + spivot(leftseg, parentsh); + if (parentsh.sh != NULL) { + // It is not a dangling segment. + spinsh = parentsh; + while (1) { + cavesegshlist->newindex((void **) &parysh); + *parysh = spinsh; + // Orient the face consistently. + if (sorg(*parysh)!= sorg(parentsh)) sesymself(*parysh); + spivotself(spinsh); + if (spinsh.sh == NULL) break; + if (spinsh.sh == parentsh.sh) break; + } + } + if (cavesegshlist->objects < 2) { + // It is a single segment. Not handle it yet. + cavesegshlist->restart(); + return 0; + } + } else if (vt == FREEFACETVERTEX) { + if (b->verbose > 2) { + printf(" Suppressing Steiner point %d from facet.\n", + pointmark(steinerpt)); + } + sdecode(point2sh(steinerpt), parentsh); + // A facet Steiner point. There are exactly two sectors. + for (i = 0; i < 2; i++) { + cavesegshlist->newindex((void **) &parysh); + *parysh = parentsh; + sesymself(parentsh); + } + } else { + return 0; + } + + triface searchtet, neightet, *parytet; + point pa, pb, pc, pd; + REAL v1[3], v2[3], len, u; + + REAL startpt[3] = {0,}, samplept[3] = {0,}, candpt[3] = {0,}; + REAL ori, minvol, smallvol; + int samplesize; + int it, j, k; + + int n = (int) cavesegshlist->objects; + point *newsteiners = new point[n]; + for (i = 0; i < n; i++) newsteiners[i] = NULL; + + // Search for each sector an interior vertex. + for (i = 0; i < cavesegshlist->objects; i++) { + parysh = (face *) fastlookup(cavesegshlist, i); + stpivot(*parysh, searchtet); + // Skip it if it is outside. + if (ishulltet(searchtet)) continue; + // Get the "half-ball". Tets in 'cavetetlist' all contain 'steinerpt' as + // opposite. Subfaces in 'caveshlist' all contain 'steinerpt' as apex. + // Moreover, subfaces are oriented towards the interior of the ball. + setpoint2tet(steinerpt, encode(searchtet)); + getvertexstar(0, steinerpt, cavetetlist, NULL, caveshlist); + // Calculate the searching vector. + pa = sorg(*parysh); + pb = sdest(*parysh); + pc = sapex(*parysh); + facenormal(pa, pb, pc, v1, 1, NULL); + len = sqrt(dot(v1, v1)); + v1[0] /= len; + v1[1] /= len; + v1[2] /= len; + if (vt == FREESEGVERTEX) { + parysh = (face *) fastlookup(cavesegshlist, (i + 1) % n); + pd = sapex(*parysh); + facenormal(pb, pa, pd, v2, 1, NULL); + len = sqrt(dot(v2, v2)); + v2[0] /= len; + v2[1] /= len; + v2[2] /= len; + // Average the two vectors. + v1[0] = 0.5 * (v1[0] + v2[0]); + v1[1] = 0.5 * (v1[1] + v2[1]); + v1[2] = 0.5 * (v1[2] + v2[2]); + } + // Search the intersection of the ray starting from 'steinerpt' to + // the search direction 'v1' and the shell of the half-ball. + // - Construct an endpoint. + len = distance(pa, pb); + v2[0] = steinerpt[0] + len * v1[0]; + v2[1] = steinerpt[1] + len * v1[1]; + v2[2] = steinerpt[2] + len * v1[2]; + for (j = 0; j < cavetetlist->objects; j++) { + parytet = (triface *) fastlookup(cavetetlist, j); + pa = org(*parytet); + pb = dest(*parytet); + pc = apex(*parytet); + // Test if the ray startpt->v2 lies in the cone: where 'steinerpt' + // is the apex, and three sides are defined by the triangle + // [pa, pb, pc]. + ori = orient3d(steinerpt, pa, pb, v2); + if (ori >= 0) { + ori = orient3d(steinerpt, pb, pc, v2); + if (ori >= 0) { + ori = orient3d(steinerpt, pc, pa, v2); + if (ori >= 0) { + // Found! Calculate the intersection. + planelineint(pa, pb, pc, steinerpt, v2, startpt, &u); + break; + } + } + } + } // j + if (j == cavetetlist->objects) { + break; // There is no intersection!! Debug is needed. + } + // Close the ball by adding the subfaces. + for (j = 0; j < caveshlist->objects; j++) { + parysh = (face *) fastlookup(caveshlist, j); + stpivot(*parysh, neightet); + cavetetlist->newindex((void **) &parytet); + *parytet = neightet; + } + // Search a best point inside the segment [startpt, steinerpt]. + it = 0; + samplesize = 100; + v1[0] = steinerpt[0] - startpt[0]; + v1[1] = steinerpt[1] - startpt[1]; + v1[2] = steinerpt[2] - startpt[2]; + minvol = -1.0; + while (it < 3) { + for (j = 1; j < samplesize - 1; j++) { + samplept[0] = startpt[0] + ((REAL) j / (REAL) samplesize) * v1[0]; + samplept[1] = startpt[1] + ((REAL) j / (REAL) samplesize) * v1[1]; + samplept[2] = startpt[2] + ((REAL) j / (REAL) samplesize) * v1[2]; + // Find the minimum volume for 'samplept'. + smallvol = -1; + for (k = 0; k < cavetetlist->objects; k++) { + parytet = (triface *) fastlookup(cavetetlist, k); + pa = org(*parytet); + pb = dest(*parytet); + pc = apex(*parytet); + ori = orient3d(pb, pa, pc, samplept); + { + // [2017-10-15] Rounding + REAL lab = distance(pa, pb); + REAL lbc = distance(pb, pc); + REAL lca = distance(pc, pa); + REAL lv = (lab + lbc + lca) / 3.0; + REAL l3 = lv*lv*lv; + if (fabs(ori) / l3 < 1e-8) ori = 0.0; + } + if (ori <= 0) { + break; // An invalid tet. + } + if (smallvol == -1) { + smallvol = ori; + } else { + if (ori < smallvol) smallvol = ori; + } + } // k + if (k == cavetetlist->objects) { + // Found a valid point. Remember it. + if (minvol == -1.0) { + candpt[0] = samplept[0]; + candpt[1] = samplept[1]; + candpt[2] = samplept[2]; + minvol = smallvol; + } else { + if (minvol < smallvol) { + // It is a better location. Remember it. + candpt[0] = samplept[0]; + candpt[1] = samplept[1]; + candpt[2] = samplept[2]; + minvol = smallvol; + } else { + // No improvement of smallest volume. + // Since we are searching along the line [startpt, steinerpy], + // The smallest volume can only be decreased later. + break; + } + } + } + } // j + if (minvol > 0) break; + samplesize *= 10; + it++; + } // while (it < 3) + if (minvol == -1.0) { + // Failed to find a valid point. + cavetetlist->restart(); + caveshlist->restart(); + break; + } + // Create a new Steiner point inside this section. + makepoint(&(newsteiners[i]), FREEVOLVERTEX); + newsteiners[i][0] = candpt[0]; + newsteiners[i][1] = candpt[1]; + newsteiners[i][2] = candpt[2]; + cavetetlist->restart(); + caveshlist->restart(); + } // i + + if (i < cavesegshlist->objects) { + // Failed to suppress the vertex. + for (; i > 0; i--) { + if (newsteiners[i - 1] != NULL) { + pointdealloc(newsteiners[i - 1]); + } + } + delete [] newsteiners; + cavesegshlist->restart(); + return 0; + } + + // Remove p from the segment or the facet. + triface newtet, newface, spintet; + face newsh, neighsh; + face *splitseg, checkseg; + int slawson = 0; // Do not do flip afterword. + int t1ver; + + if (vt == FREESEGVERTEX) { + // Detach 'leftseg' and 'rightseg' from their adjacent tets. + // These two subsegments will be deleted. + sstpivot1(leftseg, neightet); + spintet = neightet; + while (1) { + tssdissolve1(spintet); + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + sstpivot1(rightseg, neightet); + spintet = neightet; + while (1) { + tssdissolve1(spintet); + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + } + + // Loop through all sectors bounded by facets at this segment. + // Within each sector, create a new Steiner point 'np', and replace 'p' + // by 'np' for all tets in this sector. + for (i = 0; i < cavesegshlist->objects; i++) { + parysh = (face *) fastlookup(cavesegshlist, i); + // 'parysh' is the face [lpt, steinerpt, #]. + stpivot(*parysh, neightet); + // Get all tets in this sector. + setpoint2tet(steinerpt, encode(neightet)); + getvertexstar(0, steinerpt, cavetetlist, NULL, caveshlist); + if (!ishulltet(neightet)) { + // Within each tet in the ball, replace 'p' by 'np'. + for (j = 0; j < cavetetlist->objects; j++) { + parytet = (triface *) fastlookup(cavetetlist, j); + setoppo(*parytet, newsteiners[i]); + } // j + // Point to a parent tet. + parytet = (triface *) fastlookup(cavetetlist, 0); + setpoint2tet(newsteiners[i], (tetrahedron) (parytet->tet)); + st_volref_count++; + if (steinerleft > 0) steinerleft--; + } + // Disconnect the set of boundary faces. They're temporarily open faces. + // They will be connected to the new tets after 'p' is removed. + for (j = 0; j < caveshlist->objects; j++) { + // Get a boundary face. + parysh = (face *) fastlookup(caveshlist, j); + stpivot(*parysh, neightet); + //assert(apex(neightet) == newpt); + // Clear the connection at this face. + dissolve(neightet); + tsdissolve(neightet); + } + // Clear the working lists. + cavetetlist->restart(); + caveshlist->restart(); + } // i + cavesegshlist->restart(); + + if (vt == FREESEGVERTEX) { + spivot(rightseg, parentsh); // 'rightseg' has p as its origin. + splitseg = &rightseg; + } else { + if (sdest(parentsh) == steinerpt) { + senextself(parentsh); + } else if (sapex(parentsh) == steinerpt) { + senext2self(parentsh); + } + splitseg = NULL; + } + sremovevertex(steinerpt, &parentsh, splitseg, slawson); + + if (vt == FREESEGVERTEX) { + // The original segment is returned in 'rightseg'. + rightseg.shver = 0; + } + + // For each new subface, create two new tets at each side of it. + // Both of the two new tets have its opposite be dummypoint. + for (i = 0; i < caveshbdlist->objects; i++) { + parysh = (face *) fastlookup(caveshbdlist, i); + sinfect(*parysh); // Mark it for connecting new tets. + newsh = *parysh; + pa = sorg(newsh); + pb = sdest(newsh); + pc = sapex(newsh); + maketetrahedron(&newtet); + maketetrahedron(&neightet); + setvertices(newtet, pa, pb, pc, dummypoint); + setvertices(neightet, pb, pa, pc, dummypoint); + bond(newtet, neightet); + tsbond(newtet, newsh); + sesymself(newsh); + tsbond(neightet, newsh); + } + // Temporarily increase the hullsize. + hullsize += (caveshbdlist->objects * 2l); + + if (vt == FREESEGVERTEX) { + // Connecting new tets at the recovered segment. + spivot(rightseg, parentsh); + spinsh = parentsh; + while (1) { + if (sorg(spinsh) != lpt) sesymself(spinsh); + // Get the new tet at this subface. + stpivot(spinsh, newtet); + tssbond1(newtet, rightseg); + // Go to the other face at this segment. + spivot(spinsh, neighsh); + if (sorg(neighsh) != lpt) sesymself(neighsh); + sesymself(neighsh); + stpivot(neighsh, neightet); + tssbond1(neightet, rightseg); + sstbond1(rightseg, neightet); + // Connecting two adjacent tets at this segment. + esymself(newtet); + esymself(neightet); + // Connect the two tets (at rightseg) together. + bond(newtet, neightet); + // Go to the next subface. + spivotself(spinsh); + if (spinsh.sh == parentsh.sh) break; + } + } + + // Connecting new tets at new subfaces together. + for (i = 0; i < caveshbdlist->objects; i++) { + parysh = (face *) fastlookup(caveshbdlist, i); + newsh = *parysh; + //assert(sinfected(newsh)); + // Each new subface contains two new tets. + for (k = 0; k < 2; k++) { + stpivot(newsh, newtet); + for (j = 0; j < 3; j++) { + // Check if this side is open. + esym(newtet, newface); + if (newface.tet[newface.ver & 3] == NULL) { + // An open face. Connect it to its adjacent tet. + sspivot(newsh, checkseg); + if (checkseg.sh != NULL) { + // A segment. It must not be the recovered segment. + tssbond1(newtet, checkseg); + sstbond1(checkseg, newtet); + } + spivot(newsh, neighsh); + if (neighsh.sh != NULL) { + // The adjacent subface exists. It's not a dangling segment. + if (sorg(neighsh) != sdest(newsh)) sesymself(neighsh); + stpivot(neighsh, neightet); + if (sinfected(neighsh)) { + esymself(neightet); + } else { + // Search for an open face at this edge. + spintet = neightet; + while (1) { + esym(spintet, searchtet); + fsym(searchtet, spintet); + if (spintet.tet == NULL) break; + } + // Found an open face at 'searchtet'. + neightet = searchtet; + } + } else { + // The edge (at 'newsh') is a dangling segment. + // Get an adjacent tet at this segment. + sstpivot1(checkseg, neightet); + if (org(neightet) != sdest(newsh)) esymself(neightet); + // Search for an open face at this edge. + spintet = neightet; + while (1) { + esym(spintet, searchtet); + fsym(searchtet, spintet); + if (spintet.tet == NULL) break; + } + // Found an open face at 'searchtet'. + neightet = searchtet; + } + pc = apex(newface); + if (apex(neightet) == steinerpt) { + // Exterior case. The 'neightet' is a hull tet which contain + // 'steinerpt'. It will be deleted after 'steinerpt' is removed. + caveoldtetlist->newindex((void **) &parytet); + *parytet = neightet; + // Connect newface to the adjacent hull tet of 'neightet', which + // has the same edge as 'newface', and does not has 'steinerpt'. + fnextself(neightet); + } else { + if (pc == dummypoint) { + if (apex(neightet) != dummypoint) { + setapex(newface, apex(neightet)); + // A hull tet has turned into an interior tet. + hullsize--; // Must update the hullsize. + } + } + } + bond(newface, neightet); + } // if (newface.tet[newface.ver & 3] == NULL) + enextself(newtet); + senextself(newsh); + } // j + sesymself(newsh); + } // k + } // i + + // Unmark all new subfaces. + for (i = 0; i < caveshbdlist->objects; i++) { + parysh = (face *) fastlookup(caveshbdlist, i); + suninfect(*parysh); + } + caveshbdlist->restart(); + + if (caveoldtetlist->objects > 0l) { + // Delete hull tets which contain 'steinerpt'. + for (i = 0; i < caveoldtetlist->objects; i++) { + parytet = (triface *) fastlookup(caveoldtetlist, i); + tetrahedrondealloc(parytet->tet); + } + // Must update the hullsize. + hullsize -= caveoldtetlist->objects; + caveoldtetlist->restart(); + } + + setpointtype(steinerpt, UNUSEDVERTEX); + unuverts++; + if (vt == FREESEGVERTEX) { + st_segref_count--; + } else { // vt == FREEFACETVERTEX + st_facref_count--; + } + if (steinerleft > 0) steinerleft++; // We've removed a Steiner points. + + + point *parypt; + int steinercount = 0; + + int bak_fliplinklevel = b->fliplinklevel; + b->fliplinklevel = 100000; // Unlimited flip level. + + // Try to remove newly added Steiner points. + for (i = 0; i < n; i++) { + if (newsteiners[i] != NULL) { + if (!removevertexbyflips(newsteiners[i])) { + if (b->supsteiner_level > 0) { // Not -Y/0 + // Save it in subvertstack for removal. + subvertstack->newindex((void **) &parypt); + *parypt = newsteiners[i]; + } + steinercount++; + } + } + } + + b->fliplinklevel = bak_fliplinklevel; + + if (steinercount > 0) { + if (b->verbose > 2) { + printf(" Added %d interior Steiner points.\n", steinercount); + } + } + + delete [] newsteiners; + + return 1; +} + + +/////////////////////////////////////////////////////////////////////////////// +// // +// suppresssteinerpoints() Suppress Steiner points. // +// // +// All Steiner points have been saved in 'subvertstack' in the routines // +// carveholes() and suppresssteinerpoint(). // +// Each Steiner point is either removed or shifted into the interior. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::suppresssteinerpoints() +{ + + if (!b->quiet) { + printf("Suppressing Steiner points ...\n"); + } + + point rempt, *parypt; + + int bak_fliplinklevel = b->fliplinklevel; + b->fliplinklevel = 100000; // Unlimited flip level. + int suppcount = 0, remcount = 0; + int i; + + // Try to suppress boundary Steiner points. + for (i = 0; i < subvertstack->objects; i++) { + parypt = (point *) fastlookup(subvertstack, i); + rempt = *parypt; + if (pointtype(rempt) != UNUSEDVERTEX) { + if ((pointtype(rempt) == FREESEGVERTEX) || + (pointtype(rempt) == FREEFACETVERTEX)) { + if (suppressbdrysteinerpoint(rempt)) { + suppcount++; + } + } + } + } // i + + if (suppcount > 0) { + if (b->verbose) { + printf(" Suppressed %d boundary Steiner points.\n", suppcount); + } + } + + if (b->supsteiner_level > 0) { // -Y/1 + for (i = 0; i < subvertstack->objects; i++) { + parypt = (point *) fastlookup(subvertstack, i); + rempt = *parypt; + if (pointtype(rempt) != UNUSEDVERTEX) { + if (pointtype(rempt) == FREEVOLVERTEX) { + if (removevertexbyflips(rempt)) { + remcount++; + } + } + } + } + } + + if (remcount > 0) { + if (b->verbose) { + printf(" Removed %d interior Steiner points.\n", remcount); + } + } + + b->fliplinklevel = bak_fliplinklevel; + + if (b->supsteiner_level > 1) { // -Y/2 + // Smooth interior Steiner points. + optparameters opm; + triface *parytet; + point *ppt; + REAL ori; + int smtcount, count, ivcount; + int nt, j; + + // Point smooth options. + opm.max_min_volume = 1; + opm.numofsearchdirs = 20; + opm.searchstep = 0.001; + opm.maxiter = 30; // Limit the maximum iterations. + + smtcount = 0; + + do { + + nt = 0; + + while (1) { + count = 0; + ivcount = 0; // Clear the inverted count. + + for (i = 0; i < subvertstack->objects; i++) { + parypt = (point *) fastlookup(subvertstack, i); + rempt = *parypt; + if (pointtype(rempt) == FREEVOLVERTEX) { + getvertexstar(1, rempt, cavetetlist, NULL, NULL); + // Calculate the initial smallest volume (maybe zero or negative). + for (j = 0; j < cavetetlist->objects; j++) { + parytet = (triface *) fastlookup(cavetetlist, j); + ppt = (point *) &(parytet->tet[4]); + ori = orient3dfast(ppt[1], ppt[0], ppt[2], ppt[3]); + if (j == 0) { + opm.initval = ori; + } else { + if (opm.initval > ori) opm.initval = ori; + } + } + if (smoothpoint(rempt, cavetetlist, 1, &opm)) { + count++; + } + if (opm.imprval <= 0.0) { + ivcount++; // The mesh contains inverted elements. + } + cavetetlist->restart(); + } + } // i + + smtcount += count; + + if (count == 0) { + // No point has been smoothed. + break; + } + + nt++; + if (nt > 2) { + break; // Already three iterations. + } + } // while + + if (ivcount > 0) { + // There are inverted elements! + if (opm.maxiter > 0) { + // Set unlimited smoothing steps. Try again. + opm.numofsearchdirs = 30; + opm.searchstep = 0.0001; + opm.maxiter = -1; + continue; + } + } + + break; + } while (1); // Additional loop for (ivcount > 0) + + if (ivcount > 0) { + printf("BUG Report! The mesh contain inverted elements.\n"); + } + + if (b->verbose) { + if (smtcount > 0) { + printf(" Smoothed %d Steiner points.\n", smtcount); + } + } + } // -Y2 + + subvertstack->restart(); + + return 1; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// recoverboundary() Recover segments and facets. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::recoverboundary(clock_t& tv) +{ + arraypool *misseglist, *misshlist; + arraypool *bdrysteinerptlist; + face searchsh, *parysh; + face searchseg, *paryseg; + point rempt, *parypt; + long ms; // The number of missing segments/subfaces. + int nit; // The number of iterations. + int s, i; + + // Counters. + long bak_segref_count, bak_facref_count, bak_volref_count; + + if (!b->quiet) { + printf("Recovering boundaries...\n"); + } + + + if (b->verbose) { + printf(" Recovering segments.\n"); + } + + // Segments will be introduced. + checksubsegflag = 1; + + misseglist = new arraypool(sizeof(face), 8); + bdrysteinerptlist = new arraypool(sizeof(point), 8); + + // In random order. + subsegs->traversalinit(); + for (i = 0; i < subsegs->items; i++) { + s = randomnation(i + 1); + // Move the s-th seg to the i-th. + subsegstack->newindex((void **) &paryseg); + *paryseg = * (face *) fastlookup(subsegstack, s); + // Put i-th seg to be the s-th. + searchseg.sh = shellfacetraverse(subsegs); + paryseg = (face *) fastlookup(subsegstack, s); + *paryseg = searchseg; + } + + // The init number of missing segments. + ms = subsegs->items; + nit = 0; + if (b->fliplinklevel < 0) { + autofliplinklevel = 1; // Init value. + } + + // First, trying to recover segments by only doing flips. + while (1) { + recoversegments(misseglist, 0, 0); + + if (misseglist->objects > 0) { + if (b->fliplinklevel >= 0) { + break; + } else { + if (misseglist->objects >= ms) { + nit++; + if (nit >= 3) { + //break; + // Do the last round with unbounded flip link level. + b->fliplinklevel = 100000; + } + } else { + ms = misseglist->objects; + if (nit > 0) { + nit--; + } + } + for (i = 0; i < misseglist->objects; i++) { + subsegstack->newindex((void **) &paryseg); + *paryseg = * (face *) fastlookup(misseglist, i); + } + misseglist->restart(); + autofliplinklevel+=b->fliplinklevelinc; + } + } else { + // All segments are recovered. + break; + } + } // while (1) + + if (b->verbose) { + printf(" %ld (%ld) segments are recovered (missing).\n", + subsegs->items - misseglist->objects, misseglist->objects); + } + + if (misseglist->objects > 0) { + // Second, trying to recover segments by doing more flips (fullsearch). + while (misseglist->objects > 0) { + ms = misseglist->objects; + for (i = 0; i < misseglist->objects; i++) { + subsegstack->newindex((void **) &paryseg); + *paryseg = * (face *) fastlookup(misseglist, i); + } + misseglist->restart(); + + recoversegments(misseglist, 1, 0); + + if (misseglist->objects < ms) { + // The number of missing segments is reduced. + continue; + } else { + break; + } + } + if (b->verbose) { + printf(" %ld (%ld) segments are recovered (missing).\n", + subsegs->items - misseglist->objects, misseglist->objects); + } + } + + if (misseglist->objects > 0) { + // Third, trying to recover segments by doing more flips (fullsearch) + // and adding Steiner points in the volume. + while (misseglist->objects > 0) { + ms = misseglist->objects; + for (i = 0; i < misseglist->objects; i++) { + subsegstack->newindex((void **) &paryseg); + *paryseg = * (face *) fastlookup(misseglist, i); + } + misseglist->restart(); + + recoversegments(misseglist, 1, 1); + + if (misseglist->objects < ms) { + // The number of missing segments is reduced. + continue; + } else { + break; + } + } + if (b->verbose) { + printf(" Added %ld Steiner points in volume.\n", st_volref_count); + } + } + + if (misseglist->objects > 0) { + // Last, trying to recover segments by doing more flips (fullsearch), + // and adding Steiner points in the volume, and splitting segments. + long bak_inpoly_count = st_volref_count; //st_inpoly_count; + for (i = 0; i < misseglist->objects; i++) { + subsegstack->newindex((void **) &paryseg); + *paryseg = * (face *) fastlookup(misseglist, i); + } + misseglist->restart(); + + recoversegments(misseglist, 1, 2); + + if (b->verbose) { + printf(" Added %ld Steiner points in segments.\n", st_segref_count); + if (st_volref_count > bak_inpoly_count) { + printf(" Added another %ld Steiner points in volume.\n", + st_volref_count - bak_inpoly_count); + } + } + } + + + if (st_segref_count > 0) { + // Try to remove the Steiner points added in segments. + bak_segref_count = st_segref_count; + bak_volref_count = st_volref_count; + for (i = 0; i < subvertstack->objects; i++) { + // Get the Steiner point. + parypt = (point *) fastlookup(subvertstack, i); + rempt = *parypt; + if (!removevertexbyflips(rempt)) { + // Save it in list. + bdrysteinerptlist->newindex((void **) &parypt); + *parypt = rempt; + } + } + if (b->verbose) { + if (st_segref_count < bak_segref_count) { + if (bak_volref_count < st_volref_count) { + printf(" Suppressed %ld Steiner points in segments.\n", + st_volref_count - bak_volref_count); + } + if ((st_segref_count + (st_volref_count - bak_volref_count)) < + bak_segref_count) { + printf(" Removed %ld Steiner points in segments.\n", + bak_segref_count - + (st_segref_count + (st_volref_count - bak_volref_count))); + } + } + } + subvertstack->restart(); + } + + + tv = clock(); + + if (b->verbose) { + printf(" Recovering facets.\n"); + } + + // Subfaces will be introduced. + checksubfaceflag = 1; + + misshlist = new arraypool(sizeof(face), 8); + + // Randomly order the subfaces. + subfaces->traversalinit(); + for (i = 0; i < subfaces->items; i++) { + s = randomnation(i + 1); + // Move the s-th subface to the i-th. + subfacstack->newindex((void **) &parysh); + *parysh = * (face *) fastlookup(subfacstack, s); + // Put i-th subface to be the s-th. + searchsh.sh = shellfacetraverse(subfaces); + parysh = (face *) fastlookup(subfacstack, s); + *parysh = searchsh; + } + + ms = subfaces->items; + nit = 0; + b->fliplinklevel = -1; // Init. + if (b->fliplinklevel < 0) { + autofliplinklevel = 1; // Init value. + } + + while (1) { + recoversubfaces(misshlist, 0); + + if (misshlist->objects > 0) { + if (b->fliplinklevel >= 0) { + break; + } else { + if (misshlist->objects >= ms) { + nit++; + if (nit >= 3) { + //break; + // Do the last round with unbounded flip link level. + b->fliplinklevel = 100000; + } + } else { + ms = misshlist->objects; + if (nit > 0) { + nit--; + } + } + for (i = 0; i < misshlist->objects; i++) { + subfacstack->newindex((void **) &parysh); + *parysh = * (face *) fastlookup(misshlist, i); + } + misshlist->restart(); + autofliplinklevel+=b->fliplinklevelinc; + } + } else { + // All subfaces are recovered. + break; + } + } // while (1) + + if (b->verbose) { + printf(" %ld (%ld) subfaces are recovered (missing).\n", + subfaces->items - misshlist->objects, misshlist->objects); + } + + if (misshlist->objects > 0) { + // There are missing subfaces. Add Steiner points. + for (i = 0; i < misshlist->objects; i++) { + subfacstack->newindex((void **) &parysh); + *parysh = * (face *) fastlookup(misshlist, i); + } + misshlist->restart(); + + recoversubfaces(NULL, 1); + + if (b->verbose) { + printf(" Added %ld Steiner points in facets.\n", st_facref_count); + } + } + + + if (st_facref_count > 0) { + // Try to remove the Steiner points added in facets. + bak_facref_count = st_facref_count; + for (i = 0; i < subvertstack->objects; i++) { + // Get the Steiner point. + parypt = (point *) fastlookup(subvertstack, i); + rempt = *parypt; + if (!removevertexbyflips(*parypt)) { + // Save it in list. + bdrysteinerptlist->newindex((void **) &parypt); + *parypt = rempt; + } + } + if (b->verbose) { + if (st_facref_count < bak_facref_count) { + printf(" Removed %ld Steiner points in facets.\n", + bak_facref_count - st_facref_count); + } + } + subvertstack->restart(); + } + + + if (bdrysteinerptlist->objects > 0) { + if (b->verbose) { + printf(" %ld Steiner points remained in boundary.\n", + bdrysteinerptlist->objects); + } + } // if + + + // Accumulate the dynamic memory. + totalworkmemory += (misseglist->totalmemory + misshlist->totalmemory + + bdrysteinerptlist->totalmemory); + + delete bdrysteinerptlist; + delete misseglist; + delete misshlist; +} + +//// //// +//// //// +//// steiner_cxx ////////////////////////////////////////////////////////////// + + +//// reconstruct_cxx ////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// carveholes() Remove tetrahedra not in the mesh domain. // +// // +/////////////////////////////////////////////////////////////////////////////// + + +void tetgenmesh::carveholes() +{ + arraypool *tetarray, *hullarray; + triface tetloop, neightet, *parytet, *parytet1; + triface *regiontets = NULL; + face checksh, *parysh; + face checkseg; + point ptloop, *parypt; + int t1ver; + int i, j, k; + + if (!b->quiet) { + if (b->convex) { + printf("Marking exterior tetrahedra ...\n"); + } else { + printf("Removing exterior tetrahedra ...\n"); + } + } + + // Initialize the pool of exterior tets. + tetarray = new arraypool(sizeof(triface), 10); + hullarray = new arraypool(sizeof(triface), 10); + + // Collect unprotected tets and hull tets. + tetrahedrons->traversalinit(); + tetloop.ver = 11; // The face opposite to dummypoint. + tetloop.tet = alltetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + if (ishulltet(tetloop)) { + // Is this side protected by a subface? + if (!issubface(tetloop)) { + // Collect an unprotected hull tet and tet. + infect(tetloop); + hullarray->newindex((void **) &parytet); + *parytet = tetloop; + // tetloop's face number is 11 & 3 = 3. + decode(tetloop.tet[3], neightet); + if (!infected(neightet)) { + infect(neightet); + tetarray->newindex((void **) &parytet); + *parytet = neightet; + } + } + } + tetloop.tet = alltetrahedrontraverse(); + } + + if (in->numberofholes > 0) { + // Mark as infected any tets inside volume holes. + for (i = 0; i < 3 * in->numberofholes; i += 3) { + // Search a tet containing the i-th hole point. + neightet.tet = NULL; + randomsample(&(in->holelist[i]), &neightet); + if (locate(&(in->holelist[i]), &neightet) != OUTSIDE) { + // The tet 'neightet' contain this point. + if (!infected(neightet)) { + infect(neightet); + tetarray->newindex((void **) &parytet); + *parytet = neightet; + // Add its adjacent tet if it is not protected. + if (!issubface(neightet)) { + decode(neightet.tet[neightet.ver & 3], tetloop); + if (!infected(tetloop)) { + infect(tetloop); + if (ishulltet(tetloop)) { + hullarray->newindex((void **) &parytet); + } else { + tetarray->newindex((void **) &parytet); + } + *parytet = tetloop; + } + } + else { + // It is protected. Check if its adjacent tet is a hull tet. + decode(neightet.tet[neightet.ver & 3], tetloop); + if (ishulltet(tetloop)) { + // It is hull tet, add it into the list. Moreover, the subface + // is dead, i.e., both sides are in exterior. + if (!infected(tetloop)) { + infect(tetloop); + hullarray->newindex((void **) &parytet); + *parytet = tetloop; + } + } + if (infected(tetloop)) { + // Both sides of this subface are in exterior. + tspivot(neightet, checksh); + sinfect(checksh); // Only queue it once. + subfacstack->newindex((void **) &parysh); + *parysh = checksh; + } + } + } // if (!infected(neightet)) + } else { + // A hole point locates outside of the convex hull. + if (!b->quiet) { + printf("Warning: The %d-th hole point ", i/3 + 1); + printf("lies outside the convex hull.\n"); + } + } + } // i + } // if (in->numberofholes > 0) + + if (b->hole_mesh && (b->hole_mesh_filename[0] != 0)) { + // A hole mesh (***.ele) is given. + //enum tetgenbehavior::objecttype object; + char filebasename[256]; + strcpy(filebasename, b->hole_mesh_filename); + //object = tetgenbehavior::MESH; + if (!strcmp(&filebasename[strlen(filebasename) - 4], ".ele")) { + filebasename[strlen(filebasename) - 4] = '\0'; + //object = tetgenbehavior::MESH; + } + bool hole_mesh_loaded = false; + tetgenio io; + if (io.load_node(filebasename)) { + if (io.load_tet(filebasename)) { + hole_mesh_loaded = true; + } + } + if (hole_mesh_loaded) { + if (b->verbose) { + printf(" Adding hole tets from the mesh %s\n", b->hole_mesh_filename); + } + int count = 0, hcount = 0, scount = 0; + int shift = io.firstnumber > 0 ? -1 : 0; + double *p1, *p2, *p3, *p4; + double searchpt[3]; + for (i = 0; i < io.numberoftetrahedra; i++) { + int *idx = &(io.tetrahedronlist[i * 4]); + p1 = &(io.pointlist[(idx[0]+shift)*3]); + p2 = &(io.pointlist[(idx[1]+shift)*3]); + p3 = &(io.pointlist[(idx[2]+shift)*3]); + p4 = &(io.pointlist[(idx[3]+shift)*3]); + for (j = 0; j < 3; j++) { + searchpt[j] = (p1[j]+p2[j]+p3[j]+p4[j])/4.; + } + // Search the point. + neightet.tet = NULL; + if (locate(searchpt, &neightet) != OUTSIDE) { + // The tet 'neightet' contain this point. + if (!infected(neightet)) { + infect(neightet); + tetarray->newindex((void **) &parytet); + *parytet = neightet; + count++; + // Add its adjacent tet if it is not protected. + if (!issubface(neightet)) { + decode(neightet.tet[neightet.ver & 3], tetloop); + if (!infected(tetloop)) { + infect(tetloop); + if (ishulltet(tetloop)) { + hullarray->newindex((void **) &parytet); + hcount++; + } else { + tetarray->newindex((void **) &parytet); + count++; + } + *parytet = tetloop; + } + } + else { + // It is protected. Check if its adjacent tet is a hull tet. + decode(neightet.tet[neightet.ver & 3], tetloop); + if (ishulltet(tetloop)) { + // It is hull tet, add it into the list. Moreover, the subface + // is dead, i.e., both sides are in exterior. + if (!infected(tetloop)) { + infect(tetloop); + hullarray->newindex((void **) &parytet); + *parytet = tetloop; + hcount++; + } + } + if (infected(tetloop)) { + // Both sides of this subface are in exterior. + tspivot(neightet, checksh); + sinfect(checksh); // Only queue it once. + subfacstack->newindex((void **) &parysh); + *parysh = checksh; + scount++; + } + } + } + } + } // i + if (b->verbose) { + printf(" Added %d hole tets, %d hull tet, %d hole subfaces\n", + count, hcount, scount); + } + } // if (hole_mesh_loaded) + } + + if (b->regionattrib && (in->numberofregions > 0)) { // -A option. + // Record the tetrahedra that contains the region points for assigning + // region attributes after the holes have been carved. + regiontets = new triface[in->numberofregions]; + // Mark as marktested any tetrahedra inside volume regions. + for (i = 0; i < 5 * in->numberofregions; i += 5) { + // Search a tet containing the i-th region point. + neightet.tet = NULL; + randomsample(&(in->regionlist[i]), &neightet); + if (locate(&(in->regionlist[i]), &neightet) != OUTSIDE) { + regiontets[i/5] = neightet; + } else { + if (!b->quiet) { + printf("Warning: The %d-th region point ", i/5+1); + printf("lies outside the convex hull.\n"); + } + regiontets[i/5].tet = NULL; + } + } + } + + // Collect all exterior tets (in concave place and in holes). + for (i = 0; i < tetarray->objects; i++) { + parytet = (triface *) fastlookup(tetarray, i); + j = (parytet->ver & 3); // j is the current face number. + // Check the other three adjacent tets. + for (k = 1; k < 4; k++) { + decode(parytet->tet[(j + k) % 4], neightet); + // neightet may be a hull tet. + if (!infected(neightet)) { + // Is neightet protected by a subface. + if (!issubface(neightet)) { + // Not proected. Collect it. (It must not be a hull tet). + infect(neightet); + tetarray->newindex((void **) &parytet1); + *parytet1 = neightet; + } else { + // Protected. Check if it is a hull tet. + if (ishulltet(neightet)) { + // A hull tet. Collect it. + infect(neightet); + hullarray->newindex((void **) &parytet1); + *parytet1 = neightet; + // Both sides of this subface are exterior. + tspivot(neightet, checksh); + // Queue this subface (to be deleted later). + sinfect(checksh); // Only queue it once. + subfacstack->newindex((void **) &parysh); + *parysh = checksh; + } + } + } else { + // Both sides of this face are in exterior. + // If there is a subface. It should be collected. + if (issubface(neightet)) { + tspivot(neightet, checksh); + if (!sinfected(checksh)) { + sinfect(checksh); + subfacstack->newindex((void **) &parysh); + *parysh = checksh; + } + } + } + } // j, k + } // i + + if (b->regionattrib && (in->numberofregions > 0)) { + // Re-check saved region tets to see if they lie outside. + for (i = 0; i < in->numberofregions; i++) { + if (infected(regiontets[i])) { + if (b->verbose) { + printf("Warning: The %d-th region point ", i+1); + printf("lies in the exterior of the domain.\n"); + } + regiontets[i].tet = NULL; + } + } + } + + // Collect vertices which point to infected tets. These vertices + // may get deleted after the removal of exterior tets. + // If -Y1 option is used, collect all Steiner points for removal. + // The lists 'cavetetvertlist' and 'subvertstack' are re-used. + points->traversalinit(); + ptloop = pointtraverse(); + while (ptloop != NULL) { + if ((pointtype(ptloop) != UNUSEDVERTEX) && + (pointtype(ptloop) != DUPLICATEDVERTEX)) { + decode(point2tet(ptloop), neightet); + if (infected(neightet)) { + cavetetvertlist->newindex((void **) &parypt); + *parypt = ptloop; + } + if (b->nobisect && (b->supsteiner_level > 0)) { // -Y/1 + // Queue it if it is a Steiner point. + if (pointmark(ptloop) > + (in->numberofpoints - (in->firstnumber ? 0 : 1))) { + subvertstack->newindex((void **) &parypt); + *parypt = ptloop; + } + } + } + ptloop = pointtraverse(); + } + + if (!b->convex && (tetarray->objects > 0l)) { // No -c option. + // Remove exterior tets. Hull tets are updated. + arraypool *newhullfacearray; + triface hulltet, casface; + face segloop, *paryseg; + point pa, pb, pc; + long delsegcount = 0l; + + // Collect segments which point to infected tets. Some segments + // may get deleted after the removal of exterior tets. + subsegs->traversalinit(); + segloop.sh = shellfacetraverse(subsegs); + while (segloop.sh != NULL) { + sstpivot1(segloop, neightet); + if (infected(neightet)) { + subsegstack->newindex((void **) &paryseg); + *paryseg = segloop; + } + segloop.sh = shellfacetraverse(subsegs); + } + + newhullfacearray = new arraypool(sizeof(triface), 10); + + // Create and save new hull tets. + for (i = 0; i < tetarray->objects; i++) { + parytet = (triface *) fastlookup(tetarray, i); + for (j = 0; j < 4; j++) { + decode(parytet->tet[j], tetloop); + if (!infected(tetloop)) { + // Found a new hull face (must be a subface). + tspivot(tetloop, checksh); + maketetrahedron(&hulltet); + pa = org(tetloop); + pb = dest(tetloop); + pc = apex(tetloop); + setvertices(hulltet, pb, pa, pc, dummypoint); + bond(tetloop, hulltet); + // Update the subface-to-tet map. + sesymself(checksh); + tsbond(hulltet, checksh); + // Update the segment-to-tet map. + for (k = 0; k < 3; k++) { + if (issubseg(tetloop)) { + tsspivot1(tetloop, checkseg); + tssbond1(hulltet, checkseg); + sstbond1(checkseg, hulltet); + } + enextself(tetloop); + eprevself(hulltet); + } + // Update the point-to-tet map. + setpoint2tet(pa, (tetrahedron) tetloop.tet); + setpoint2tet(pb, (tetrahedron) tetloop.tet); + setpoint2tet(pc, (tetrahedron) tetloop.tet); + // Save the exterior tet at this hull face. It still holds pointer + // to the adjacent interior tet. Use it to connect new hull tets. + newhullfacearray->newindex((void **) &parytet1); + parytet1->tet = parytet->tet; + parytet1->ver = j; + } // if (!infected(tetloop)) + } // j + } // i + + // Connect new hull tets. + for (i = 0; i < newhullfacearray->objects; i++) { + parytet = (triface *) fastlookup(newhullfacearray, i); + fsym(*parytet, neightet); + // Get the new hull tet. + fsym(neightet, hulltet); + for (j = 0; j < 3; j++) { + esym(hulltet, casface); + if (casface.tet[casface.ver & 3] == NULL) { + // Since the boundary of the domain may not be a manifold, we + // find the adjacent hull face by traversing the tets in the + // exterior (which are all infected tets). + neightet = *parytet; + while (1) { + fnextself(neightet); + if (!infected(neightet)) break; + } + if (!ishulltet(neightet)) { + // An interior tet. Get the new hull tet. + fsymself(neightet); + esymself(neightet); + } + // Bond them together. + bond(casface, neightet); + } + enextself(hulltet); + enextself(*parytet); + } // j + } // i + + if (subfacstack->objects > 0l) { + // Remove all subfaces which do not attach to any tetrahedron. + // Segments which are not attached to any subfaces and tets + // are deleted too. + face casingout, casingin; + + for (i = 0; i < subfacstack->objects; i++) { + parysh = (face *) fastlookup(subfacstack, i); + if (i == 0) { + if (b->verbose) { + printf("Warning: Removed an exterior face (%d, %d, %d) #%d\n", + pointmark(sorg(*parysh)), pointmark(sdest(*parysh)), + pointmark(sapex(*parysh)), shellmark(*parysh)); + } + } + // Dissolve this subface from face links. + for (j = 0; j < 3; j++) { + spivot(*parysh, casingout); + sspivot(*parysh, checkseg); + if (casingout.sh != NULL) { + casingin = casingout; + while (1) { + spivot(casingin, checksh); + if (checksh.sh == parysh->sh) break; + casingin = checksh; + } + if (casingin.sh != casingout.sh) { + // Update the link: ... -> casingin -> casingout ->... + sbond1(casingin, casingout); + } else { + // Only one subface at this edge is left. + sdissolve(casingout); + } + if (checkseg.sh != NULL) { + // Make sure the segment does not connect to a dead one. + ssbond(casingout, checkseg); + } + } else { + if (checkseg.sh != NULL) { + //if (checkseg.sh[3] != NULL) { + if (delsegcount == 0) { + if (b->verbose) { + printf("Warning: Removed an exterior segment (%d, %d) #%d\n", + pointmark(sorg(checkseg)), pointmark(sdest(checkseg)), + shellmark(checkseg)); + } + } + shellfacedealloc(subsegs, checkseg.sh); + delsegcount++; + } + } + senextself(*parysh); + } // j + // Delete this subface. + shellfacedealloc(subfaces, parysh->sh); + } // i + if (b->verbose) { + printf(" Deleted %ld subfaces.\n", subfacstack->objects); + } + subfacstack->restart(); + } // if (subfacstack->objects > 0l) + + if (subsegstack->objects > 0l) { + for (i = 0; i < subsegstack->objects; i++) { + paryseg = (face *) fastlookup(subsegstack, i); + if (paryseg->sh && (paryseg->sh[3] != NULL)) { + sstpivot1(*paryseg, neightet); + if (infected(neightet)) { + if (b->verbose) { + printf("Warning: Removed an exterior segment (%d, %d) #%d\n", + pointmark(sorg(*paryseg)), pointmark(sdest(*paryseg)), + shellmark(*paryseg)); + } + shellfacedealloc(subsegs, paryseg->sh); + delsegcount++; + } + } + } + subsegstack->restart(); + } // if (subsegstack->objects > 0l) + + if (delsegcount > 0) { + if (b->verbose) { + printf(" Deleted %ld segments.\n", delsegcount); + } + } + + if (cavetetvertlist->objects > 0l) { + // Some vertices may lie in exterior. Marke them as UNUSEDVERTEX. + long delvertcount = unuverts; + long delsteinercount = 0l; + + for (i = 0; i < cavetetvertlist->objects; i++) { + parypt = (point *) fastlookup(cavetetvertlist, i); + decode(point2tet(*parypt), neightet); + if (infected(neightet)) { + // Found an exterior vertex. + if (pointmark(*parypt) > + (in->numberofpoints - (in->firstnumber ? 0 : 1))) { + // A Steiner point. + if (pointtype(*parypt) == FREESEGVERTEX) { + st_segref_count--; + } else if (pointtype(*parypt) == FREEFACETVERTEX) { + st_facref_count--; + } else { + st_volref_count--; + } + delsteinercount++; + if (steinerleft > 0) steinerleft++; + } + setpointtype(*parypt, UNUSEDVERTEX); + unuverts++; + } + } + + if (b->verbose) { + if (unuverts > delvertcount) { + if (delsteinercount > 0l) { + if (unuverts > (delvertcount + delsteinercount)) { + printf(" Removed %ld exterior input vertices.\n", + unuverts - delvertcount - delsteinercount); + } + printf(" Removed %ld exterior Steiner vertices.\n", + delsteinercount); + } else { + printf(" Removed %ld exterior input vertices.\n", + unuverts - delvertcount); + } + } + } + cavetetvertlist->restart(); + // Comment: 'subvertstack' will be cleaned in routine + // suppresssteinerpoints(). + } // if (cavetetvertlist->objects > 0l) + + // Update the hull size. + hullsize += (newhullfacearray->objects - hullarray->objects); + + // Delete all exterior tets and old hull tets. + for (i = 0; i < tetarray->objects; i++) { + parytet = (triface *) fastlookup(tetarray, i); + tetrahedrondealloc(parytet->tet); + } + tetarray->restart(); + + for (i = 0; i < hullarray->objects; i++) { + parytet = (triface *) fastlookup(hullarray, i); + tetrahedrondealloc(parytet->tet); + } + hullarray->restart(); + + delete newhullfacearray; + } // if (!b->convex && (tetarray->objects > 0l)) + + if (b->convex && (tetarray->objects > 0l)) { // With -c option + // In this case, all exterior tets get a region marker '-1'. + int attrnum = numelemattrib - 1; + + for (i = 0; i < tetarray->objects; i++) { + parytet = (triface *) fastlookup(tetarray, i); + setelemattribute(parytet->tet, attrnum, -1); + } + tetarray->restart(); + + for (i = 0; i < hullarray->objects; i++) { + parytet = (triface *) fastlookup(hullarray, i); + uninfect(*parytet); + } + hullarray->restart(); + + if (subfacstack->objects > 0l) { + for (i = 0; i < subfacstack->objects; i++) { + parysh = (face *) fastlookup(subfacstack, i); + suninfect(*parysh); + } + subfacstack->restart(); + } + + if (cavetetvertlist->objects > 0l) { + cavetetvertlist->restart(); + } + } // if (b->convex && (tetarray->objects > 0l)) + + if (b->regionattrib) { // With -A option. + if (!b->quiet) { + printf("Spreading region attributes.\n"); + } + REAL volume; + int attr, maxattr = 0; // Choose a small number here. + int attrnum = numelemattrib - 1; + // Comment: The element region marker is at the end of the list of + // the element attributes. + int regioncount = 0; + + // If has user-defined region attributes. + if (in->numberofregions > 0) { + // Spread region attributes. + for (i = 0; i < 5 * in->numberofregions; i += 5) { + if (regiontets[i/5].tet != NULL) { + attr = (int) in->regionlist[i + 3]; + if (attr > maxattr) { + maxattr = attr; + } + volume = in->regionlist[i + 4]; + tetarray->restart(); // Re-use this array. + infect(regiontets[i/5]); + tetarray->newindex((void **) &parytet); + *parytet = regiontets[i/5]; + // Collect and set attrs for all tets of this region. + for (j = 0; j < tetarray->objects; j++) { + parytet = (triface *) fastlookup(tetarray, j); + tetloop = *parytet; + setelemattribute(tetloop.tet, attrnum, attr); + if (b->varvolume) { // If has -a option. + setvolumebound(tetloop.tet, volume); + } + for (k = 0; k < 4; k++) { + decode(tetloop.tet[k], neightet); + // Is the adjacent already checked? + if (!infected(neightet)) { + // Is this side protected by a subface? + if (!issubface(neightet)) { + infect(neightet); + tetarray->newindex((void **) &parytet); + *parytet = neightet; + } + } + } // k + } // j + regioncount++; + } // if (regiontets[i/5].tet != NULL) + } // i + } + + // Set attributes for all tetrahedra. + attr = maxattr + 1; + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + if (!infected(tetloop)) { + // An unmarked region. + tetarray->restart(); // Re-use this array. + infect(tetloop); + tetarray->newindex((void **) &parytet); + *parytet = tetloop; + // Find and mark all tets. + for (j = 0; j < tetarray->objects; j++) { + parytet = (triface *) fastlookup(tetarray, j); + tetloop = *parytet; + setelemattribute(tetloop.tet, attrnum, attr); + for (k = 0; k < 4; k++) { + decode(tetloop.tet[k], neightet); + // Is the adjacent tet already checked? + if (!infected(neightet)) { + // Is this side protected by a subface? + if (!issubface(neightet)) { + infect(neightet); + tetarray->newindex((void **) &parytet); + *parytet = neightet; + } + } + } // k + } // j + attr++; // Increase the attribute. + regioncount++; + } + tetloop.tet = tetrahedrontraverse(); + } + // Until here, every tet has a region attribute. + + // Uninfect processed tets. + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + uninfect(tetloop); + tetloop.tet = tetrahedrontraverse(); + } + + if (b->verbose) { + //assert(regioncount > 0); + if (regioncount > 1) { + printf(" Found %d subdomains.\n", regioncount); + } else { + printf(" Found %d domain.\n", regioncount); + } + } + } // if (b->regionattrib) + + if (regiontets != NULL) { + delete [] regiontets; + } + delete tetarray; + delete hullarray; + + if (!b->convex) { // No -c option + // The mesh is non-convex now. + nonconvex = 1; + + // Push all hull tets into 'flipstack'. + tetrahedrons->traversalinit(); + tetloop.ver = 11; // The face opposite to dummypoint. + tetloop.tet = alltetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + if ((point) tetloop.tet[7] == dummypoint) { + fsym(tetloop, neightet); + flippush(flipstack, &neightet); + } + tetloop.tet = alltetrahedrontraverse(); + } + + flipconstraints fc; + fc.enqflag = 2; + long sliver_peel_count = lawsonflip3d(&fc); + + if (sliver_peel_count > 0l) { + if (b->verbose) { + printf(" Removed %ld hull slivers.\n", sliver_peel_count); + } + } + unflipqueue->restart(); + } // if (!b->convex) +} + +// [2018-07-30] +// Search a face with given indices (i,j,k). +// This function is only called when the default fast search fails. +// It is possible when there are non-manifold edges on the hull. +// On finish, tetloop return this face if it exists, otherwise, return 0. +int tetgenmesh::search_face(point pi, point pj, point pk, triface &tetloop) +{ + pinfect(pi); + pinfect(pj); + pinfect(pk); + + int t1ver; + triface t, t1; + point *pts, toppo; + int pcount = 0; + + t.ver = t1.ver = 0; + tetrahedrons->traversalinit(); + t.tet = tetrahedrontraverse(); + while (t.tet != NULL) { + pts = (point *) t.tet; + pcount = 0; + if (pinfected(pts[4])) pcount++; + if (pinfected(pts[5])) pcount++; + if (pinfected(pts[6])) pcount++; + if (pinfected(pts[7])) pcount++; + + if (pcount == 3) { + // Found a tet containing this face. + for (t.ver = 0; t.ver < 4; t.ver++) { + toppo = oppo(t); + if (!pinfected(toppo)) break; + } + int ii; + for (ii = 0; ii < 3; ii++) { + if (org(t) == pi) break; + enextself(t); + } + if (dest(t) == pj) { + } else { + eprevself(t); + fsymself(t); + } + break; + } + t.tet = tetrahedrontraverse(); + } + + puninfect(pi); + puninfect(pj); + puninfect(pk); + + if (t.tet != NULL) { + tetloop = t; + return 1; + } else { + return 0; + } +} + +int tetgenmesh::search_edge(point p0, point p1, triface &tetloop) +{ + triface t; + int ii; + + tetrahedrons->traversalinit(); + t.tet = tetrahedrontraverse(); + while (t.tet != NULL) { + for (ii = 0; ii < 6; ii++) { + t.ver = edge2ver[ii]; + if (((org(t) == p0) && (dest(t) == p1)) || + ((org(t) == p1) && (dest(t) == p0))) { + // Found the tet. + tetloop = t; + return 1; + } + } + t.tet = tetrahedrontraverse(); + } + + tetloop.tet = NULL; + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// reconstructmesh() Reconstruct a tetrahedral mesh. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::reconstructmesh() +{ + tetrahedron *ver2tetarray; + point *idx2verlist; + triface tetloop, checktet, prevchktet; + triface hulltet, face1, face2; + tetrahedron tptr; + face subloop, neighsh, nextsh; + face segloop; + shellface sptr; + point p[4], q[3]; + REAL ori, attrib, volume; + REAL cosang_tol, cosang; + REAL n1[3], n2[3]; + int eextras, marker = 0; + int bondflag; + int t1ver; + int idx, i, j, k; + + if (!b->quiet) { + printf("Reconstructing mesh ...\n"); + } + + if (b->convex) { // -c option. + // Assume the mesh is convex. Exterior tets have region attribute -1. + if (!(in->numberoftetrahedronattributes > 0)) { + terminatetetgen(this, 2); + } + } else { + // Assume the mesh is non-convex. + nonconvex = 1; + } + + // Create a map from indices to vertices. + makeindex2pointmap(idx2verlist); + // 'idx2verlist' has length 'in->numberofpoints + 1'. + if (in->firstnumber == 1) { + idx2verlist[0] = dummypoint; // Let 0th-entry be dummypoint. + } + + // Allocate an array that maps each vertex to its adjacent tets. + ver2tetarray = new tetrahedron[in->numberofpoints + 1]; + unuverts = in->numberofpoints; // All vertices are unused yet. + //for (i = 0; i < in->numberofpoints + 1; i++) { + for (i = in->firstnumber; i < in->numberofpoints + in->firstnumber; i++) { + ver2tetarray[i] = NULL; + } + + // Create the tetrahedra and connect those that share a common face. + for (i = 0; i < in->numberoftetrahedra; i++) { + // Get the four vertices. + idx = i * in->numberofcorners; + for (j = 0; j < 4; j++) { + p[j] = idx2verlist[in->tetrahedronlist[idx++]]; + if (pointtype(p[j]) == UNUSEDVERTEX) { + setpointtype(p[j], VOLVERTEX); // initial type. + unuverts--; + } + } + // Check the orientation. + ori = orient3d(p[0], p[1], p[2], p[3]); + if (ori > 0.0) { + // Swap the first two vertices. + q[0] = p[0]; p[0] = p[1]; p[1] = q[0]; + } else if (ori == 0.0) { + if (!b->quiet) { + printf("Warning: Tet #%d is degenerate.\n", i + in->firstnumber); + } + } + // Create a new tetrahedron. + maketetrahedron(&tetloop); // tetloop.ver = 11. + setvertices(tetloop, p[0], p[1], p[2], p[3]); + // Set element attributes if they exist. + for (j = 0; j < in->numberoftetrahedronattributes; j++) { + idx = i * in->numberoftetrahedronattributes; + attrib = in->tetrahedronattributelist[idx + j]; + setelemattribute(tetloop.tet, j, attrib); + } + // If -a switch is used (with no number follows) Set a volume + // constraint if it exists. + if (b->varvolume) { + if (in->tetrahedronvolumelist != (REAL *) NULL) { + volume = in->tetrahedronvolumelist[i]; + } else { + volume = -1.0; + } + setvolumebound(tetloop.tet, volume); + } + // Try connecting this tet to others that share the common faces. + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + p[3] = oppo(tetloop); + // Look for other tets having this vertex. + idx = pointmark(p[3]); + tptr = ver2tetarray[idx]; + // Link the current tet to the next one in the stack. + tetloop.tet[8 + tetloop.ver] = tptr; + // Push the current tet onto the stack. + ver2tetarray[idx] = encode(tetloop); + decode(tptr, checktet); + if (checktet.tet != NULL) { + p[0] = org(tetloop); // a + p[1] = dest(tetloop); // b + p[2] = apex(tetloop); // c + prevchktet = tetloop; + do { + q[0] = org(checktet); // a' + q[1] = dest(checktet); // b' + q[2] = apex(checktet); // c' + // Check the three faces at 'd' in 'checktet'. + bondflag = 0; + for (j = 0; j < 3; j++) { + // Go to the face [b',a',d], or [c',b',d], or [a',c',d]. + esym(checktet, face2); + if (face2.tet[face2.ver & 3] == NULL) { + k = ((j + 1) % 3); + if (q[k] == p[0]) { // b', c', a' = a + if (q[j] == p[1]) { // a', b', c' = b + // [#,#,d] is matched to [b,a,d]. + esym(tetloop, face1); + bond(face1, face2); + bondflag++; + } + } + if (q[k] == p[1]) { // b',c',a' = b + if (q[j] == p[2]) { // a',b',c' = c + // [#,#,d] is matched to [c,b,d]. + enext(tetloop, face1); + esymself(face1); + bond(face1, face2); + bondflag++; + } + } + if (q[k] == p[2]) { // b',c',a' = c + if (q[j] == p[0]) { // a',b',c' = a + // [#,#,d] is matched to [a,c,d]. + eprev(tetloop, face1); + esymself(face1); + bond(face1, face2); + bondflag++; + } + } + } else { + bondflag++; + } + enextself(checktet); + } // j + // Go to the next tet in the link. + tptr = checktet.tet[8 + checktet.ver]; + if (bondflag == 3) { + // All three faces at d in 'checktet' have been connected. + // It can be removed from the link. + prevchktet.tet[8 + prevchktet.ver] = tptr; + } else { + // Bakup the previous tet in the link. + prevchktet = checktet; + } + decode(tptr, checktet); + } while (checktet.tet != NULL); + } // if (checktet.tet != NULL) + } // for (tetloop.ver = 0; ... + } // i + + // Remember a tet of the mesh. + recenttet = tetloop; + + // Create hull tets, create the point-to-tet map, and clean up the + // temporary spaces used in each tet. + hullsize = tetrahedrons->items; + + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + tptr = encode(tetloop); + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + if (tetloop.tet[tetloop.ver] == NULL) { + // Create a hull tet. + maketetrahedron(&hulltet); + p[0] = org(tetloop); + p[1] = dest(tetloop); + p[2] = apex(tetloop); + setvertices(hulltet, p[1], p[0], p[2], dummypoint); + bond(tetloop, hulltet); + // Try connecting this to others that share common hull edges. + for (j = 0; j < 3; j++) { + fsym(hulltet, face2); + while (1) { + if (face2.tet == NULL) break; + esymself(face2); + if (apex(face2) == dummypoint) break; + fsymself(face2); + } + if (face2.tet != NULL) { + // Found an adjacent hull tet. + esym(hulltet, face1); + bond(face1, face2); + } + enextself(hulltet); + } + } + // Create the point-to-tet map. + setpoint2tet((point) (tetloop.tet[4 + tetloop.ver]), tptr); + // Clean the temporary used space. + tetloop.tet[8 + tetloop.ver] = NULL; + } + tetloop.tet = tetrahedrontraverse(); + } + + hullsize = tetrahedrons->items - hullsize; + + // Subfaces will be inserted into the mesh. + if (in->trifacelist != NULL) { + // A .face file is given. It may contain boundary faces. Insert them. + for (i = 0; i < in->numberoftrifaces; i++) { + // Is it a subface? + if (in->trifacemarkerlist != NULL) { + marker = in->trifacemarkerlist[i]; + } else { + // Face markers are not available. Assume all of them are subfaces. + marker = -1; // The default marker. + } + if (marker != 0) { + idx = i * 3; + for (j = 0; j < 3; j++) { + p[j] = idx2verlist[in->trifacelist[idx++]]; + } + // Search the subface. + bondflag = 0; + neighsh.sh = NULL; + // Make sure all vertices are in the mesh. Avoid crash. + for (j = 0; j < 3; j++) { + decode(point2tet(p[j]), checktet); + if (checktet.tet == NULL) break; + } + if ((j == 3) && getedge(p[0], p[1], &checktet)) { + tetloop = checktet; + q[2] = apex(checktet); + while (1) { + if (apex(tetloop) == p[2]) { + // Found the face. + // Check if there exist a subface already? + tspivot(tetloop, neighsh); + if (neighsh.sh != NULL) { + // Found a duplicated subface. + // This happens when the mesh was generated by other mesher. + bondflag = 0; + } else { + bondflag = 1; + } + break; + } + fnextself(tetloop); + if (apex(tetloop) == q[2]) break; + } + } + if (!bondflag) { + if (neighsh.sh == NULL) { + if (b->verbose > 1) { + printf("Warning: Searching subface #%d [%d,%d,%d] mark=%d.\n", + i + in->firstnumber, pointmark(p[0]), pointmark(p[1]), + pointmark(p[2]), marker); + } + // Search it globally. + if (search_face(p[0], p[1], p[2], tetloop)) { + bondflag = 1; + } + } + } + if (bondflag) { + // Create a new subface. + makeshellface(subfaces, &subloop); + setshvertices(subloop, p[0], p[1], p[2]); + // Create the point-to-subface map. + sptr = sencode(subloop); + for (j = 0; j < 3; j++) { + setpointtype(p[j], FACETVERTEX); // initial type. + setpoint2sh(p[j], sptr); + } + setshellmark(subloop, marker); + // Insert the subface into the mesh. + tsbond(tetloop, subloop); + fsymself(tetloop); + sesymself(subloop); + tsbond(tetloop, subloop); + } else { + if (neighsh.sh != NULL) { + // The subface already exists. Only set its mark. + setshellmark(neighsh, marker); + } else { + if (!b->quiet) { + printf("Warning: Subface #%d [%d,%d,%d] mark=%d is not found.\n", + i + in->firstnumber, pointmark(p[0]), pointmark(p[1]), + pointmark(p[2]), marker); + } + } + } // if (bondflag) + } // if (marker != 0) + } // i + } // if (in->trifacelist) + + // Indentify subfaces from the mesh. + // Create subfaces for hull faces (if they're not subface yet) and + // interior faces which separate two different materials. + eextras = in->numberoftetrahedronattributes; + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + tspivot(tetloop, neighsh); + if (neighsh.sh == NULL) { + bondflag = 0; + fsym(tetloop, checktet); + if (ishulltet(checktet)) { + // A hull face. + if (!b->convex) { + bondflag = 1; // Insert a hull subface. + } + } else { + if (eextras > 0) { + if (elemattribute(tetloop.tet, eextras - 1) != + elemattribute(checktet.tet, eextras - 1)) { + bondflag = 1; // Insert an interior interface. + } + } + } + if (bondflag) { + // Create a new subface. + makeshellface(subfaces, &subloop); + p[0] = org(tetloop); + p[1] = dest(tetloop); + p[2] = apex(tetloop); + setshvertices(subloop, p[0], p[1], p[2]); + // Create the point-to-subface map. + sptr = sencode(subloop); + for (j = 0; j < 3; j++) { + setpointtype(p[j], FACETVERTEX); // initial type. + setpoint2sh(p[j], sptr); + } + setshellmark(subloop, -1); // Default marker. + // Insert the subface into the mesh. + tsbond(tetloop, subloop); + sesymself(subloop); + tsbond(checktet, subloop); + } // if (bondflag) + } // if (neighsh.sh == NULL) + } + tetloop.tet = tetrahedrontraverse(); + } + + // Connect subfaces together. + subfaces->traversalinit(); + subloop.shver = 0; + subloop.sh = shellfacetraverse(subfaces); + while (subloop.sh != (shellface *) NULL) { + for (i = 0; i < 3; i++) { + spivot(subloop, neighsh); + if (neighsh.sh == NULL) { + // Form a subface ring by linking all subfaces at this edge. + // Traversing all faces of the tets at this edge. + stpivot(subloop, tetloop); + q[2] = apex(tetloop); + neighsh = subloop; + while (1) { + fnextself(tetloop); + tspivot(tetloop, nextsh); + if (nextsh.sh != NULL) { + // Do not connect itself. + if (nextsh.sh != neighsh.sh) { + // Link neighsh <= nextsh. + sbond1(neighsh, nextsh); + neighsh = nextsh; + } + } + if (apex(tetloop) == q[2]) { + break; + } + } // while (1) + } // if (neighsh.sh == NULL) + senextself(subloop); + } + subloop.sh = shellfacetraverse(subfaces); + } + + + // Segments will be introduced. + if (in->edgelist != NULL) { + // A .edge file is given. It may contain boundary edges. Insert them. + for (i = 0; i < in->numberofedges; i++) { + // Is it a segment? + if (in->edgemarkerlist != NULL) { + marker = in->edgemarkerlist[i]; + } else { + // Edge markers are not available. Assume all of them are segments. + marker = -1; // Default marker. + } + if (marker != 0) { + // Insert a segment. + idx = i * 2; + for (j = 0; j < 2; j++) { + p[j] = idx2verlist[in->edgelist[idx++]]; + } + // Make sure all vertices are in the mesh. Avoid crash. + for (j = 0; j < 2; j++) { + decode(point2tet(p[j]), checktet); + if (checktet.tet == NULL) break; + } + // Search the segment. + bondflag = 0; + if (j == 2) { + if (getedge(p[0], p[1], &checktet)) { + bondflag = 1; + } else { + if (b->verbose > 1) { + printf("Warning: Searching segment #%d [%d,%d] mark=%d.\n", + i + in->firstnumber, pointmark(p[0]), pointmark(p[1]), marker); + } + // Search it globally. + if (search_edge(p[0], p[1], checktet)) { + bondflag = 1; + } + } + } + if (bondflag > 0) { + // Create a new segment. + makeshellface(subsegs, &segloop); + setshvertices(segloop, p[0], p[1], NULL); + // Create the point-to-segment map. + sptr = sencode(segloop); + for (j = 0; j < 2; j++) { + setpointtype(p[j], RIDGEVERTEX); // initial type. + setpoint2sh(p[j], sptr); + } + setshellmark(segloop, marker); + // Insert the segment into the mesh. + tetloop = checktet; + q[2] = apex(checktet); + subloop.sh = NULL; + while (1) { + tssbond1(tetloop, segloop); + tspivot(tetloop, subloop); + if (subloop.sh != NULL) { + ssbond1(subloop, segloop); + sbond1(segloop, subloop); + } + fnextself(tetloop); + if (apex(tetloop) == q[2]) break; + } // while (1) + // Remember an adjacent tet for this segment. + sstbond1(segloop, tetloop); + } else { + if (!b->quiet) { + printf("Warning: Segment #%d [%d,%d] is missing.\n", + i + in->firstnumber, pointmark(p[0]), pointmark(p[1])); + } + } + } // if (marker != 0) + } // i + } // if (in->edgelist) + + // Identify segments from the mesh. + // Create segments for non-manifold edges (which are shared by more + // than two subfaces), and for non-coplanar edges, i.e., two subfaces + // form an dihedral angle > 'b->facet_separate_ang_tol' (degree). + cosang_tol = cos(b->facet_separate_ang_tol / 180.0 * PI); + subfaces->traversalinit(); + subloop.shver = 0; + subloop.sh = shellfacetraverse(subfaces); + while (subloop.sh != (shellface *) NULL) { + for (i = 0; i < 3; i++) { + sspivot(subloop, segloop); + if (segloop.sh == NULL) { + // Check if this edge is a segment. + bondflag = 0; + // Counter the number of subfaces at this edge. + idx = 0; + nextsh = subloop; + while (1) { + idx++; + spivotself(nextsh); + if (nextsh.sh == subloop.sh) break; + } + if (idx != 2) { + // It's a non-manifold edge. Insert a segment. + p[0] = sorg(subloop); + p[1] = sdest(subloop); + bondflag = 1; + } else { + spivot(subloop, neighsh); + if (shellmark(subloop) != shellmark(neighsh)) { + // It's an interior interface. Insert a segment. + p[0] = sorg(subloop); + p[1] = sdest(subloop); + bondflag = 1; + } else { + if (!b->convex) { + // Check the dihedral angle formed by the two subfaces. + p[0] = sorg(subloop); + p[1] = sdest(subloop); + p[2] = sapex(subloop); + p[3] = sapex(neighsh); + facenormal(p[0], p[1], p[2], n1, 1, NULL); + facenormal(p[0], p[1], p[3], n2, 1, NULL); + cosang = dot(n1, n2) / (sqrt(dot(n1, n1)) * sqrt(dot(n2, n2))); + // Rounding. + if (cosang > 1.0) cosang = 1.0; + else if (cosang < -1.0) cosang = -1.0; + if (cosang > cosang_tol) { + bondflag = 1; + } + } + } + } + if (bondflag) { + // Create a new segment. + makeshellface(subsegs, &segloop); + setshvertices(segloop, p[0], p[1], NULL); + // Create the point-to-segment map. + sptr = sencode(segloop); + for (j = 0; j < 2; j++) { + setpointtype(p[j], RIDGEVERTEX); // initial type. + setpoint2sh(p[j], sptr); + } + setshellmark(segloop, -1); // Default marker. + // Insert the subface into the mesh. + stpivot(subloop, tetloop); + q[2] = apex(tetloop); + while (1) { + tssbond1(tetloop, segloop); + tspivot(tetloop, neighsh); + if (neighsh.sh != NULL) { + ssbond1(neighsh, segloop); + } + fnextself(tetloop); + if (apex(tetloop) == q[2]) break; + } // while (1) + // Remember an adjacent tet for this segment. + sstbond1(segloop, tetloop); + sbond1(segloop, subloop); + } // if (bondflag) + } // if (neighsh.sh == NULL) + senextself(subloop); + } // i + subloop.sh = shellfacetraverse(subfaces); + } + + // Remember the number of input segments. + insegments = subsegs->items; + + if (!b->nobisect || checkconstraints) { + // Mark Steiner points on segments and facets. + // - all vertices which remaining type FEACTVERTEX become + // Steiner points in facets (= FREEFACERVERTEX). + // - vertices on segment need to be checked. + face* segperverlist; + int* idx2seglist; + face parentseg, nextseg; + verttype vt; + REAL area, len, l1, l2; + int fmarker; + + makepoint2submap(subsegs, idx2seglist, segperverlist); + + points->traversalinit(); + point ptloop = pointtraverse(); + while (ptloop != NULL) { + vt = pointtype(ptloop); + if (vt == VOLVERTEX) { + setpointtype(ptloop, FREEVOLVERTEX); + st_volref_count++; + } else if (vt == FACETVERTEX) { + setpointtype(ptloop, FREEFACETVERTEX); + st_facref_count++; + } else if (vt == RIDGEVERTEX) { + idx = pointmark(ptloop) - in->firstnumber; + if ((idx2seglist[idx + 1] - idx2seglist[idx]) == 2) { + i = idx2seglist[idx]; + parentseg = segperverlist[i]; + nextseg = segperverlist[i + 1]; + sesymself(nextseg); + p[0] = sorg(nextseg); + p[1] = sdest(parentseg); + // Check if three points p[0], ptloop, p[2] are (nearly) collinear. + len = distance(p[0], p[1]); + l1 = distance(p[0], ptloop); + l2 = distance(ptloop, p[1]); + if (((l1 + l2 - len) / len) < b->epsilon) { + // They are (nearly) collinear. + setpointtype(ptloop, FREESEGVERTEX); + // Connect nextseg and parentseg together at ptloop. + senextself(nextseg); + senext2self(parentseg); + sbond(nextseg, parentseg); + st_segref_count++; + } + } + } + ptloop = pointtraverse(); + } + + // Are there area constraints? + if (b->quality && (in->facetconstraintlist != (REAL *) NULL)) { + // Set maximum area constraints on facets. + for (i = 0; i < in->numberoffacetconstraints; i++) { + fmarker = (int) in->facetconstraintlist[i * 2]; + area = in->facetconstraintlist[i * 2 + 1]; + subfaces->traversalinit(); + subloop.sh = shellfacetraverse(subfaces); + while (subloop.sh != NULL) { + if (shellmark(subloop) == fmarker) { + setareabound(subloop, area); + } + subloop.sh = shellfacetraverse(subfaces); + } + } + } + + // Are there length constraints? + if (b->quality && (in->segmentconstraintlist != (REAL *) NULL)) { + // Set maximum length constraints on segments. + int e1, e2; + for (i = 0; i < in->numberofsegmentconstraints; i++) { + e1 = (int) in->segmentconstraintlist[i * 3]; + e2 = (int) in->segmentconstraintlist[i * 3 + 1]; + len = in->segmentconstraintlist[i * 3 + 2]; + // Search for edge [e1, e2]. + idx = e1 - in->firstnumber; + for (j = idx2seglist[idx]; j < idx2seglist[idx + 1]; j++) { + parentseg = segperverlist[j]; + if (pointmark(sdest(parentseg)) == e2) { + setareabound(parentseg, len); + break; + } + } + } + } + + delete [] idx2seglist; + delete [] segperverlist; + } + + + // Set global flags. + checksubsegflag = 1; + checksubfaceflag = 1; + + delete [] idx2verlist; + delete [] ver2tetarray; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// scoutpoint() Search a point in mesh. // +// // +// This function searches the point in a mesh whose domain may be not convex.// +// In case of a convex domain, the locate() function is sufficient. // +// // +// If 'randflag' is used, randomly select a start searching tet. Otherwise, // +// start searching directly from 'searchtet'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::scoutpoint(point searchpt, triface *searchtet, int randflag) +{ + point pa, pb, pc, pd; + enum locateresult loc = OUTSIDE; + REAL vol, ori1, ori2 = 0, ori3 = 0, ori4 = 0; + int t1ver; + + + // Randomly select a good starting tet. + if (randflag) { + randomsample(searchpt, searchtet); + } else { + if (searchtet->tet == NULL) { + *searchtet = recenttet; + } + } + loc = locate(searchpt, searchtet); + + if (loc == OUTSIDE) { + if (b->convex) { // -c option + // The point lies outside of the convex hull. + return (int) loc; + } + // Test if it lies nearly on the hull face. + // Reuse vol, ori1. + pa = org(*searchtet); + pb = dest(*searchtet); + pc = apex(*searchtet); + vol = triarea(pa, pb, pc); + ori1 = orient3dfast(pa, pb, pc, searchpt); + if (fabs(ori1 / vol) < b->epsilon) { + loc = ONFACE; // On face (or on edge, or on vertex). + fsymself(*searchtet); + } + } + + if (loc != OUTSIDE) { + // Round the result of location. + pa = org(*searchtet); + pb = dest(*searchtet); + pc = apex(*searchtet); + pd = oppo(*searchtet); + vol = orient3dfast(pa, pb, pc, pd); + ori1 = orient3dfast(pa, pb, pc, searchpt); + ori2 = orient3dfast(pb, pa, pd, searchpt); + ori3 = orient3dfast(pc, pb, pd, searchpt); + ori4 = orient3dfast(pa, pc, pd, searchpt); + if (fabs(ori1 / vol) < b->epsilon) ori1 = 0; + if (fabs(ori2 / vol) < b->epsilon) ori2 = 0; + if (fabs(ori3 / vol) < b->epsilon) ori3 = 0; + if (fabs(ori4 / vol) < b->epsilon) ori4 = 0; + } else { // if (loc == OUTSIDE) { + // Do a brute force search for the point (with rounding). + tetrahedrons->traversalinit(); + searchtet->tet = tetrahedrontraverse(); + while (searchtet->tet != NULL) { + pa = org(*searchtet); + pb = dest(*searchtet); + pc = apex(*searchtet); + pd = oppo(*searchtet); + + vol = orient3dfast(pa, pb, pc, pd); + if (vol < 0) { + ori1 = orient3dfast(pa, pb, pc, searchpt); + if (fabs(ori1 / vol) < b->epsilon) ori1 = 0; // Rounding. + if (ori1 <= 0) { + ori2 = orient3dfast(pb, pa, pd, searchpt); + if (fabs(ori2 / vol) < b->epsilon) ori2 = 0; + if (ori2 <= 0) { + ori3 = orient3dfast(pc, pb, pd, searchpt); + if (fabs(ori3 / vol) < b->epsilon) ori3 = 0; + if (ori3 <= 0) { + ori4 = orient3dfast(pa, pc, pd, searchpt); + if (fabs(ori4 / vol) < b->epsilon) ori4 = 0; + if (ori4 <= 0) { + // Found the tet. Return its location. + break; + } // ori4 + } // ori3 + } // ori2 + } // ori1 + } + + searchtet->tet = tetrahedrontraverse(); + } // while (searchtet->tet != NULL) + nonregularcount++; // Re-use this counter. + } + + if (searchtet->tet != NULL) { + // Return the point location. + if (ori1 == 0) { // on face [a,b,c] + if (ori2 == 0) { // on edge [a,b]. + if (ori3 == 0) { // on vertex [b]. + enextself(*searchtet); // [b,c,a,d] + loc = ONVERTEX; + } else { + if (ori4 == 0) { // on vertex [a] + loc = ONVERTEX; // [a,b,c,d] + } else { + loc = ONEDGE; // [a,b,c,d] + } + } + } else { // ori2 != 0 + if (ori3 == 0) { // on edge [b,c] + if (ori4 == 0) { // on vertex [c] + eprevself(*searchtet); // [c,a,b,d] + loc = ONVERTEX; + } else { + enextself(*searchtet); // [b,c,a,d] + loc = ONEDGE; + } + } else { // ori3 != 0 + if (ori4 == 0) { // on edge [c,a] + eprevself(*searchtet); // [c,a,b,d] + loc = ONEDGE; + } else { + loc = ONFACE; + } + } + } + } else { // ori1 != 0 + if (ori2 == 0) { // on face [b,a,d] + esymself(*searchtet); // [b,a,d,c] + if (ori3 == 0) { // on edge [b,d] + eprevself(*searchtet); // [d,b,a,c] + if (ori4 == 0) { // on vertex [d] + loc = ONVERTEX; + } else { + loc = ONEDGE; + } + } else { // ori3 != 0 + if (ori4 == 0) { // on edge [a,d] + enextself(*searchtet); // [a,d,b,c] + loc = ONEDGE; + } else { + loc = ONFACE; + } + } + } else { // ori2 != 0 + if (ori3 == 0) { // on face [c,b,d] + enextself(*searchtet); + esymself(*searchtet); + if (ori4 == 0) { // on edge [c,d] + eprevself(*searchtet); + loc = ONEDGE; + } else { + loc = ONFACE; + } + } else { + if (ori4 == 0) { // on face [a,c,d] + eprevself(*searchtet); + esymself(*searchtet); + loc = ONFACE; + } else { // inside tet [a,b,c,d] + loc = INTETRAHEDRON; + } // ori4 + } // ori3 + } // ori2 + } // ori1 + } else { + loc = OUTSIDE; + } + + return (int) loc; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// getpointmeshsize() Interpolate the mesh size at given point. // +// // +// 'iloc' indicates the location of the point w.r.t. 'searchtet'. The size // +// is obtained by linear interpolation on the vertices of the tet. // +// // +/////////////////////////////////////////////////////////////////////////////// + +REAL tetgenmesh::getpointmeshsize(point searchpt, triface *searchtet, int iloc) +{ + point *pts, pa, pb, pc; + REAL volume, vol[4], wei[4]; + REAL size; + int i; + + size = 0; + + if (iloc == (int) INTETRAHEDRON) { + pts = (point *) &(searchtet->tet[4]); + // Only do interpolation if all vertices have non-zero sizes. + if ((pts[0][pointmtrindex] > 0) && (pts[1][pointmtrindex] > 0) && + (pts[2][pointmtrindex] > 0) && (pts[3][pointmtrindex] > 0)) { + // P1 interpolation. + volume = orient3dfast(pts[0], pts[1], pts[2], pts[3]); + vol[0] = orient3dfast(searchpt, pts[1], pts[2], pts[3]); + vol[1] = orient3dfast(pts[0], searchpt, pts[2], pts[3]); + vol[2] = orient3dfast(pts[0], pts[1], searchpt, pts[3]); + vol[3] = orient3dfast(pts[0], pts[1], pts[2], searchpt); + for (i = 0; i < 4; i++) { + wei[i] = fabs(vol[i] / volume); + size += (wei[i] * pts[i][pointmtrindex]); + } + } + } else if (iloc == (int) ONFACE) { + pa = org(*searchtet); + pb = dest(*searchtet); + pc = apex(*searchtet); + if ((pa[pointmtrindex] > 0) && (pb[pointmtrindex] > 0) && + (pc[pointmtrindex] > 0)) { + volume = triarea(pa, pb, pc); + vol[0] = triarea(searchpt, pb, pc); + vol[1] = triarea(pa, searchpt, pc); + vol[2] = triarea(pa, pb, searchpt); + size = (vol[0] / volume) * pa[pointmtrindex] + + (vol[1] / volume) * pb[pointmtrindex] + + (vol[2] / volume) * pc[pointmtrindex]; + } + } else if (iloc == (int) ONEDGE) { + pa = org(*searchtet); + pb = dest(*searchtet); + if ((pa[pointmtrindex] > 0) && (pb[pointmtrindex] > 0)) { + volume = distance(pa, pb); + vol[0] = distance(searchpt, pb); + vol[1] = distance(pa, searchpt); + size = (vol[0] / volume) * pa[pointmtrindex] + + (vol[1] / volume) * pb[pointmtrindex]; + } + } else if (iloc == (int) ONVERTEX) { + pa = org(*searchtet); + if (pa[pointmtrindex] > 0) { + size = pa[pointmtrindex]; + } + } + + return size; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// interpolatemeshsize() Interpolate the mesh size from a background mesh // +// (source) to the current mesh (destination). // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::interpolatemeshsize() +{ + triface searchtet; + point ploop; + REAL minval = 0.0, maxval = 0.0; + int iloc; + int count; + + if (!b->quiet) { + printf("Interpolating mesh size ...\n"); + } + + long bak_nonregularcount = nonregularcount; + nonregularcount = 0l; // Count the number of (slow) global searches. + long baksmaples = bgm->samples; + bgm->samples = 3l; + count = 0; // Count the number of interpolated points. + + // Interpolate sizes for all points in the current mesh. + points->traversalinit(); + ploop = pointtraverse(); + while (ploop != NULL) { + // Search a tet in bgm which containing this point. + searchtet.tet = NULL; + iloc = bgm->scoutpoint(ploop, &searchtet, 1); // randflag = 1 + if (iloc != (int) OUTSIDE) { + // Interpolate the mesh size. + ploop[pointmtrindex] = bgm->getpointmeshsize(ploop, &searchtet, iloc); + setpoint2bgmtet(ploop, bgm->encode(searchtet)); + if (count == 0) { + // This is the first interpolated point. + minval = maxval = ploop[pointmtrindex]; + } else { + if (ploop[pointmtrindex] < minval) { + minval = ploop[pointmtrindex]; + } + if (ploop[pointmtrindex] > maxval) { + maxval = ploop[pointmtrindex]; + } + } + count++; + } else { + if (!b->quiet) { + printf("Warnning: Failed to locate point %d in source mesh.\n", + pointmark(ploop)); + } + } + ploop = pointtraverse(); + } + + if (b->verbose) { + printf(" Interoplated %d points.\n", count); + if (nonregularcount > 0l) { + printf(" Performed %ld brute-force searches.\n", nonregularcount); + } + printf(" Size rangle [%.17g, %.17g].\n", minval, maxval); + } + + bgm->samples = baksmaples; + nonregularcount = bak_nonregularcount; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// insertconstrainedpoints() Insert a list of points into the mesh. // +// // +// Assumption: The bounding box of the insert point set should be no larger // +// than the bounding box of the mesh. (Required by point sorting). // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::insertconstrainedpoints(point *insertarray, int arylen, + int rejflag) +{ + triface searchtet, spintet; + face splitsh; + face splitseg; + insertvertexflags ivf; + flipconstraints fc; + int randflag = 0; + int t1ver; + int i; + + if (b->verbose) { + printf(" Inserting %d constrained points\n", arylen); + } + + if (b->no_sort) { // -b/1 option. + if (b->verbose) { + printf(" Using the input order.\n"); + } + } else { + if (b->verbose) { + printf(" Permuting vertices.\n"); + } + point swappoint; + int randindex; + srand(arylen); + for (i = 0; i < arylen; i++) { + randindex = rand() % (i + 1); + swappoint = insertarray[i]; + insertarray[i] = insertarray[randindex]; + insertarray[randindex] = swappoint; + } + if (b->brio_hilbert) { // -b1 option + if (b->verbose) { + printf(" Sorting vertices.\n"); + } + hilbert_init(in->mesh_dim); + int ngroup = 0; + brio_multiscale_sort(insertarray, arylen, b->brio_threshold, + b->brio_ratio, &ngroup); + } else { // -b0 option. + randflag = 1; + } // if (!b->brio_hilbert) + } // if (!b->no_sort) + + long bak_nonregularcount = nonregularcount; + nonregularcount = 0l; + long baksmaples = samples; + samples = 3l; // Use at least 3 samples. Updated in randomsample(). + + long bak_seg_count = st_segref_count; + long bak_fac_count = st_facref_count; + long bak_vol_count = st_volref_count; + + // Initialize the insertion parameters. + if (b->incrflip) { // -l option + // Use incremental flip algorithm. + ivf.bowywat = 0; + ivf.lawson = 1; + ivf.validflag = 0; // No need to validate the cavity. + fc.enqflag = 2; + } else { + // Use Bowyer-Watson algorithm. + ivf.bowywat = 1; + ivf.lawson = 0; + ivf.validflag = 1; // Validate the B-W cavity. + } + ivf.rejflag = rejflag; + ivf.chkencflag = 0; + ivf.sloc = (int) INSTAR; + ivf.sbowywat = 3; + ivf.splitbdflag = 1; + ivf.respectbdflag = 1; + ivf.assignmeshsize = b->metric; + + encseglist = new arraypool(sizeof(face), 8); + encshlist = new arraypool(sizeof(badface), 8); + + // Insert the points. + for (i = 0; i < arylen; i++) { + // Find the location of the inserted point. + // Do not use 'recenttet', since the mesh may be non-convex. + searchtet.tet = NULL; + ivf.iloc = scoutpoint(insertarray[i], &searchtet, randflag); + + // Decide the right type for this point. + setpointtype(insertarray[i], FREEVOLVERTEX); // Default. + splitsh.sh = NULL; + splitseg.sh = NULL; + if (ivf.iloc == (int) ONEDGE) { + if (issubseg(searchtet)) { + tsspivot1(searchtet, splitseg); + setpointtype(insertarray[i], FREESEGVERTEX); + //ivf.rejflag = 0; + } else { + // Check if it is a subface edge. + spintet = searchtet; + while (1) { + if (issubface(spintet)) { + tspivot(spintet, splitsh); + setpointtype(insertarray[i], FREEFACETVERTEX); + //ivf.rejflag |= 1; + break; + } + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + } + } else if (ivf.iloc == (int) ONFACE) { + if (issubface(searchtet)) { + tspivot(searchtet, splitsh); + setpointtype(insertarray[i], FREEFACETVERTEX); + //ivf.rejflag |= 1; + } + } + + // Now insert the point. + if (insertpoint(insertarray[i], &searchtet, &splitsh, &splitseg, &ivf)) { + if (flipstack != NULL) { + // There are queued faces. Use flips to recover Delaunayness. + lawsonflip3d(&fc); + // There may be unflippable edges. Ignore them. + unflipqueue->restart(); + } + // Update the Steiner counters. + if (pointtype(insertarray[i]) == FREESEGVERTEX) { + st_segref_count++; + } else if (pointtype(insertarray[i]) == FREEFACETVERTEX) { + st_facref_count++; + } else { + st_volref_count++; + } + } else { + // Point is not inserted. + //pointdealloc(insertarray[i]); + setpointtype(insertarray[i], UNUSEDVERTEX); + unuverts++; + encseglist->restart(); + encshlist->restart(); + } + } // i + + delete encseglist; + delete encshlist; + + if (b->verbose) { + printf(" Inserted %ld (%ld, %ld, %ld) vertices.\n", + st_segref_count + st_facref_count + st_volref_count - + (bak_seg_count + bak_fac_count + bak_vol_count), + st_segref_count - bak_seg_count, st_facref_count - bak_fac_count, + st_volref_count - bak_vol_count); + if (nonregularcount > 0l) { + printf(" Performed %ld brute-force searches.\n", nonregularcount); + } + } + + nonregularcount = bak_nonregularcount; + samples = baksmaples; +} + +void tetgenmesh::insertconstrainedpoints(tetgenio *addio) +{ + point *insertarray, newpt; + REAL x, y, z, w; + int index, attribindex, mtrindex; + int arylen, i, j; + + if (!b->quiet) { + printf("Inserting constrained points ...\n"); + } + + insertarray = new point[addio->numberofpoints]; + arylen = 0; + index = 0; + attribindex = 0; + mtrindex = 0; + + for (i = 0; i < addio->numberofpoints; i++) { + x = addio->pointlist[index++]; + y = addio->pointlist[index++]; + z = addio->pointlist[index++]; + // Test if this point lies inside the bounding box. + if ((x < xmin) || (x > xmax) || (y < ymin) || (y > ymax) || + (z < zmin) || (z > zmax)) { + if (b->verbose) { + printf("Warning: Point #%d lies outside the bounding box. Ignored\n", + i + in->firstnumber); + } + continue; + } + makepoint(&newpt, UNUSEDVERTEX); + newpt[0] = x; + newpt[1] = y; + newpt[2] = z; + // Read the point attributes. (Including point weights.) + for (j = 0; j < addio->numberofpointattributes; j++) { + newpt[3 + j] = addio->pointattributelist[attribindex++]; + } + // Read the point metric tensor. + for (j = 0; j < addio->numberofpointmtrs; j++) { + newpt[pointmtrindex + j] = addio->pointmtrlist[mtrindex++]; + } + if (b->weighted) { // -w option + if (addio->numberofpointattributes > 0) { + // The first point attribute is its weight. + w = newpt[3]; + } else { + // No given weight available. Default choose the maximum + // absolute value among its coordinates. + w = fabs(x); + if (w < fabs(y)) w = fabs(y); + if (w < fabs(z)) w = fabs(z); + } + if (b->weighted_param == 0) { + newpt[3] = x * x + y * y + z * z - w; // Weighted DT. + } else { // -w1 option + newpt[3] = w; // Regular tetrahedralization. + } + } + insertarray[arylen] = newpt; + arylen++; + } // i + + // Insert the points. + int rejflag = 0; // Do not check encroachment. + if (b->metric) { // -m option. + rejflag |= 4; // Reject it if it lies in some protecting balls. + } + + insertconstrainedpoints(insertarray, arylen, rejflag); + + delete [] insertarray; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// meshcoarsening() Deleting (selected) vertices. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::collectremovepoints(arraypool *remptlist) +{ + point ptloop, *parypt; + verttype vt; + + // If a mesh sizing function is given. Collect vertices whose mesh size + // is greater than its smallest edge length. + if (b->metric) { // -m option + REAL len, smlen; + int i; + points->traversalinit(); + ptloop = pointtraverse(); + while (ptloop != NULL) { + // Do not remove a boundary vertex + vt = pointtype(ptloop); + if ((vt == RIDGEVERTEX) || (vt == ACUTEVERTEX) || (vt == FACETVERTEX) || + (vt == FREEFACETVERTEX) || (vt == FREESEGVERTEX) || (vt == UNUSEDVERTEX)) { + ptloop = pointtraverse(); + continue; + } + if (ptloop[pointmtrindex] > 0) { + // Get the smallest edge length at this vertex. + getvertexstar(1, ptloop, cavetetlist, cavetetvertlist, NULL); + parypt = (point *) fastlookup(cavetetvertlist, 0); + smlen = distance(ptloop, *parypt); + for (i = 1; i < cavetetvertlist->objects; i++) { + parypt = (point *) fastlookup(cavetetvertlist, i); + len = distance(ptloop, *parypt); + if (len < smlen) { + smlen = len; + } + } + cavetetvertlist->restart(); + cavetetlist->restart(); + if (smlen < ptloop[pointmtrindex]) { + pinfect(ptloop); + remptlist->newindex((void **) &parypt); + *parypt = ptloop; + } + } + ptloop = pointtraverse(); + } + if (b->verbose > 1) { + printf(" Coarsen %ld oversized points.\n", remptlist->objects); + } + } + + // If 'in->pointmarkerlist' exists, Collect vertices with markers '-1'. + if (in->pointmarkerlist != NULL) { + long bak_count = remptlist->objects; + points->traversalinit(); + ptloop = pointtraverse(); + int index = 0; + while (ptloop != NULL) { + if (index < in->numberofpoints) { + if (in->pointmarkerlist[index] == -1) { + pinfect(ptloop); + remptlist->newindex((void **) &parypt); + *parypt = ptloop; + } + } else { + // Remaining are not input points. Stop here. + break; + } + index++; + ptloop = pointtraverse(); + } + if (b->verbose > 1) { + printf(" Coarsen %ld marked points.\n", remptlist->objects - bak_count); + } + } // if (in->pointmarkerlist != NULL) + + if (b->coarsen_param > 0) { // -R1/# + // Remove a coarsen_percent number of interior points. + if (b->verbose > 1) { + printf(" Coarsen %g percent of interior points.\n", + b->coarsen_percent * 100.0); + } + arraypool *intptlist = new arraypool(sizeof(point *), 10); + // Count the total number of interior points. + points->traversalinit(); + ptloop = pointtraverse(); + while (ptloop != NULL) { + vt = pointtype(ptloop); + if ((vt == VOLVERTEX) || (vt == FREEVOLVERTEX) || + (vt == FREEFACETVERTEX) || (vt == FREESEGVERTEX)) { + intptlist->newindex((void **) &parypt); + *parypt = ptloop; + } + ptloop = pointtraverse(); + } + if (intptlist->objects > 0l) { + // Sort the list of points randomly. + point *parypt_i, swappt; + int randindex, i; + srand(intptlist->objects); + for (i = 0; i < intptlist->objects; i++) { + randindex = rand() % (i + 1); // randomnation(i + 1); + parypt_i = (point *) fastlookup(intptlist, i); + parypt = (point *) fastlookup(intptlist, randindex); + // Swap this two points. + swappt = *parypt_i; + *parypt_i = *parypt; + *parypt = swappt; + } + int remcount = (int) ((REAL) intptlist->objects * b->coarsen_percent); + // Return the first remcount points. + for (i = 0; i < remcount; i++) { + parypt_i = (point *) fastlookup(intptlist, i); + if (!pinfected(*parypt_i)) { + pinfected(*parypt_i); + remptlist->newindex((void **) &parypt); + *parypt = *parypt_i; + } + } + } + delete intptlist; + } + + // Unmark all collected vertices. + for (int i = 0; i < remptlist->objects; i++) { + parypt = (point *) fastlookup(remptlist, i); + puninfect(*parypt); + } +} + +void tetgenmesh::meshcoarsening() +{ + arraypool *remptlist; + + if (!b->quiet) { + printf("Mesh coarsening ...\n"); + } + + // Collect the set of points to be removed + remptlist = new arraypool(sizeof(point *), 10); + collectremovepoints(remptlist); + + if (remptlist->objects == 0l) { + delete remptlist; + return; + } + + if (b->verbose) { + if (remptlist->objects > 0l) { + printf(" Removing %ld points...\n", remptlist->objects); + } + } + + point *parypt, *plastpt; + long ms = remptlist->objects; + int nit = 0; + int bak_fliplinklevel = b->fliplinklevel; + b->fliplinklevel = -1; + autofliplinklevel = 1; // Init value. + int i; + + while (1) { + + if (b->verbose > 1) { + printf(" Removing points [%s level = %2d] #: %ld.\n", + (b->fliplinklevel > 0) ? "fixed" : "auto", + (b->fliplinklevel > 0) ? b->fliplinklevel : autofliplinklevel, + remptlist->objects); + } + + // Remove the list of points. + for (i = 0; i < remptlist->objects; i++) { + parypt = (point *) fastlookup(remptlist, i); + if (removevertexbyflips(*parypt)) { + // Move the last entry to the current place. + plastpt = (point *) fastlookup(remptlist, remptlist->objects - 1); + *parypt = *plastpt; + remptlist->objects--; + i--; + } + } + + if (remptlist->objects > 0l) { + if (b->fliplinklevel >= 0) { + break; // We have tried all levels. + } + if (remptlist->objects == ms) { + nit++; + if (nit >= 3) { + // Do the last round with unbounded flip link level. + b->fliplinklevel = 100000; + } + } else { + ms = remptlist->objects; + if (nit > 0) { + nit--; + } + } + autofliplinklevel+=b->fliplinklevelinc; + } else { + // All points are removed. + break; + } + } // while (1) + + if (remptlist->objects > 0l) { + if (b->verbose) { + printf(" %ld points are not removed !\n", remptlist->objects); + } + } + + b->fliplinklevel = bak_fliplinklevel; + delete remptlist; +} + +//// //// +//// //// +//// reconstruct_cxx ////////////////////////////////////////////////////////// + +//// refine_cxx /////////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// makefacetverticesmap() Create a map from facet to its vertices. // +// // +// All facets will be indexed (starting from 0). The map is saved in two // +// global arrays: 'idx2facetlist' and 'facetverticeslist'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::makefacetverticesmap() +{ + arraypool *facetvertexlist, *vertlist, **paryvertlist; + face subloop, neighsh, *parysh, *parysh1; + point pa, *ppt, *parypt; + verttype vt; + int facetindex, totalvertices; + int i, j, k; + + if (b->verbose) { + printf(" Creating the facet vertices map.\n"); + } + + facetvertexlist = new arraypool(sizeof(arraypool *), 10); + facetindex = totalvertices = 0; + + subfaces->traversalinit(); + subloop.sh = shellfacetraverse(subfaces); + while (subloop.sh != NULL) { + if (!sinfected(subloop)) { + // A new facet. Create its vertices list. + vertlist = new arraypool(sizeof(point *), 8); + ppt = (point *) &(subloop.sh[3]); + for (k = 0; k < 3; k++) { + vt = pointtype(ppt[k]); + if ((vt != FREESEGVERTEX) && (vt != FREEFACETVERTEX)) { + pinfect(ppt[k]); + vertlist->newindex((void **) &parypt); + *parypt = ppt[k]; + } + } + sinfect(subloop); + caveshlist->newindex((void **) &parysh); + *parysh = subloop; + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + setfacetindex(*parysh, facetindex); + for (j = 0; j < 3; j++) { + if (!isshsubseg(*parysh)) { + spivot(*parysh, neighsh); + if (!sinfected(neighsh)) { + pa = sapex(neighsh); + if (!pinfected(pa)) { + vt = pointtype(pa); + if ((vt != FREESEGVERTEX) && (vt != FREEFACETVERTEX)) { + pinfect(pa); + vertlist->newindex((void **) &parypt); + *parypt = pa; + } + } + sinfect(neighsh); + caveshlist->newindex((void **) &parysh1); + *parysh1 = neighsh; + } + } + senextself(*parysh); + } + } // i + totalvertices += (int) vertlist->objects; + // Uninfect facet vertices. + for (k = 0; k < vertlist->objects; k++) { + parypt = (point *) fastlookup(vertlist, k); + puninfect(*parypt); + } + caveshlist->restart(); + // Save this vertex list. + facetvertexlist->newindex((void **) &paryvertlist); + *paryvertlist = vertlist; + facetindex++; + } + subloop.sh = shellfacetraverse(subfaces); + } + + // All subfaces are infected. Uninfect them. + subfaces->traversalinit(); + subloop.sh = shellfacetraverse(subfaces); + while (subloop.sh != NULL) { + suninfect(subloop); + subloop.sh = shellfacetraverse(subfaces); + } + + if (b->verbose) { + printf(" Found %ld facets.\n", facetvertexlist->objects); + } + + idx2facetlist = new int[facetindex + 1]; + facetverticeslist = new point[totalvertices]; + + totalworkmemory += ((facetindex + 1) * sizeof(int) + + totalvertices * sizeof(point *)); + + idx2facetlist[0] = 0; + for (i = 0, k = 0; i < facetindex; i++) { + paryvertlist = (arraypool **) fastlookup(facetvertexlist, i); + vertlist = *paryvertlist; + idx2facetlist[i + 1] = (idx2facetlist[i] + (int) vertlist->objects); + for (j = 0; j < vertlist->objects; j++) { + parypt = (point *) fastlookup(vertlist, j); + facetverticeslist[k] = *parypt; + k++; + } + } + + // Free the lists. + for (i = 0; i < facetvertexlist->objects; i++) { + paryvertlist = (arraypool **) fastlookup(facetvertexlist, i); + vertlist = *paryvertlist; + delete vertlist; + } + delete facetvertexlist; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// Check whether two segments, or a segment and a facet, or two facets are // +// adjacent to each other. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::segsegadjacent(face *seg1, face *seg2) +{ + int segidx1 = getfacetindex(*seg1); + int segidx2 = getfacetindex(*seg2); + + if (segidx1 == segidx2) return 0; + + point pa1 = segmentendpointslist[segidx1 * 2]; + point pb1 = segmentendpointslist[segidx1 * 2 + 1]; + point pa2 = segmentendpointslist[segidx2 * 2]; + point pb2 = segmentendpointslist[segidx2 * 2 + 1]; + + if ((pa1 == pa2) || (pa1 == pb2) || (pb1 == pa2) || (pb1 == pb2)) { + return 1; + } + return 0; +} + +int tetgenmesh::segfacetadjacent(face *subseg, face *subsh) +{ + int segidx = getfacetindex(*subseg); + point pa = segmentendpointslist[segidx * 2]; + point pb = segmentendpointslist[segidx * 2 + 1]; + + pinfect(pa); + pinfect(pb); + + int fidx = getfacetindex(*subsh); + int count = 0, i; + + for (i = idx2facetlist[fidx]; i < idx2facetlist[fidx+1]; i++) { + if (pinfected(facetverticeslist[i])) count++; + } + + puninfect(pa); + puninfect(pb); + + return count == 1; +} + +int tetgenmesh::facetfacetadjacent(face *subsh1, face *subsh2) +{ + int count = 0, i; + + int fidx1 = getfacetindex(*subsh1); + int fidx2 = getfacetindex(*subsh2); + + if (fidx1 == fidx2) return 0; + + for (i = idx2facetlist[fidx1]; i < idx2facetlist[fidx1+1]; i++) { + pinfect(facetverticeslist[i]); + } + + for (i = idx2facetlist[fidx2]; i < idx2facetlist[fidx2+1]; i++) { + if (pinfected(facetverticeslist[i])) count++; + } + + // Uninfect the vertices. + for (i = idx2facetlist[fidx1]; i < idx2facetlist[fidx1+1]; i++) { + puninfect(facetverticeslist[i]); + } + + return count > 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// save_segmentpoint_insradius(), save_facetpoint_insradius() // +// // +// Determine and save the relaxed insertion radius of a Steiner point on a // +// segment or a facet. By default, it is the closet distance to the parent // +// point of this Steiner point. But may be larger than it. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::save_segmentpoint_insradius(point segpt,point parentpt,REAL r) +{ + REAL rv = r, rp; + if (pointtype(parentpt) == FREESEGVERTEX) { + face parentseg1, parentseg2; + sdecode(point2sh(segpt), parentseg1); + sdecode(point2sh(parentpt), parentseg2); + if (segsegadjacent(&parentseg1, &parentseg2)) { + rp = getpointinsradius(parentpt); + if (rv < rp) { + // The relaxed insertion radius of 'newpt'. + rv = rp; + } + } + } else if (pointtype(parentpt) == FREEFACETVERTEX) { + face parentseg, parentsh; + sdecode(point2sh(segpt), parentseg); + sdecode(point2sh(parentpt), parentsh); + if (segfacetadjacent(&parentseg, &parentsh)) { + rp = getpointinsradius(parentpt); + if ((sqrt(2.0) * rv) < rp) { // if (rv < rp) { + // The relaxed insertion radius of 'newpt'. + rv = rp / sqrt(2.0); // rv = rp; + } + } + } + setpointinsradius(segpt, rv); +} + +void tetgenmesh::save_facetpoint_insradius(point facpt,point parentpt,REAL r) +{ + REAL rv = r, rp; + if (pointtype(parentpt) == FREESEGVERTEX) { + face parentseg, parentsh; + sdecode(point2sh(parentpt), parentseg); + sdecode(point2sh(facpt), parentsh); + if (segfacetadjacent(&parentseg, &parentsh)) { + rp = getpointinsradius(parentpt); + if (rv < (sqrt(2.0) * rp)) { + rv = sqrt(2.0) * rp; // The relaxed insertion radius of 'newpt'. + } + } + } else if (pointtype(parentpt) == FREEFACETVERTEX) { + face parentsh1, parentsh2; + sdecode(point2sh(parentpt), parentsh1); + sdecode(point2sh(facpt), parentsh2); + if (facetfacetadjacent(&parentsh1, &parentsh2)) { + rp = getpointinsradius(parentpt); + if (rv < rp) { + rv = rp; // The relaxed insertion radius of 'newpt'. + } + } + } + setpointinsradius(facpt, rv); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// enqueuesubface() Queue a subface or a subsegment for encroachment chk. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::enqueuesubface(memorypool *pool, face *chkface) +{ + if (!smarktest2ed(*chkface)) { + smarktest2(*chkface); // Only queue it once. + face *queface = (face *) pool->alloc(); + *queface = *chkface; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// enqueuetetrahedron() Queue a tetrahedron for quality check. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::enqueuetetrahedron(triface *chktet) +{ + if (!marktest2ed(*chktet)) { + marktest2(*chktet); // Only queue it once. + triface *quetet = (triface *) badtetrahedrons->alloc(); + *quetet = *chktet; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// checkseg4encroach() Check if an edge is encroached upon by a point. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checkseg4encroach(point pa, point pb, point checkpt) +{ + // Check if the point lies inside the diametrical sphere of this seg. + REAL v1[3], v2[3]; + + v1[0] = pa[0] - checkpt[0]; + v1[1] = pa[1] - checkpt[1]; + v1[2] = pa[2] - checkpt[2]; + v2[0] = pb[0] - checkpt[0]; + v2[1] = pb[1] - checkpt[1]; + v2[2] = pb[2] - checkpt[2]; + + if (dot(v1, v2) < 0) { + // Inside. + if (b->metric) { // -m option. + if ((pa[pointmtrindex] > 0) && (pb[pointmtrindex] > 0)) { + // The projection of 'checkpt' lies inside the segment [a,b]. + REAL prjpt[3], u, v, t; + projpt2edge(checkpt, pa, pb, prjpt); + // Interoplate the mesh size at the location 'prjpt'. + u = distance(pa, pb); + v = distance(pa, prjpt); + t = v / u; + // 'u' is the mesh size at 'prjpt' + u = pa[pointmtrindex] + t * (pb[pointmtrindex] - pa[pointmtrindex]); + v = distance(checkpt, prjpt); + if (v < u) { + return 1; // Encroached prot-ball! + } + } else { + return 1; // NO protecting ball. Encroached. + } + } else { + return 1; // Inside! Encroached. + } + } + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// checkseg4split() Check if we need to split a segment. // +// // +// A segment needs to be split if it is in the following case: // +// (1) It is encroached by an existing vertex. // +// (2) It has bad quality (too long). // +// (3) Its length is larger than the mesh sizes at its endpoints. // +// // +// Return 1 if it needs to be split, otherwise, return 0. 'pencpt' returns // +// an encroaching point if there exists. 'qflag' returns '1' if the segment // +// has a length larger than the desired edge length. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checkseg4split(face *chkseg, point& encpt, int& qflag) +{ + REAL ccent[3], len, r; + int i; + + point forg = sorg(*chkseg); + point fdest = sdest(*chkseg); + + // Initialize the return values. + encpt = NULL; + qflag = 0; + + len = distance(forg, fdest); + r = 0.5 * len; + for (i = 0; i < 3; i++) { + ccent[i] = 0.5 * (forg[i] + fdest[i]); + } + + // First check its quality. + if (checkconstraints && (areabound(*chkseg) > 0.0)) { + if (len > areabound(*chkseg)) { + qflag = 1; + return 1; + } + } + + if (b->fixedvolume) { + if ((len * len * len) > b->maxvolume) { + qflag = 1; + return 1; + } + } + + if (b->metric) { // -m option. Check mesh size. + // Check if the ccent lies outside one of the prot.balls at vertices. + if (((forg[pointmtrindex] > 0) && (r > forg[pointmtrindex])) || + ((fdest[pointmtrindex]) > 0 && (r > fdest[pointmtrindex]))) { + qflag = 1; // Enforce mesh size. + return 1; + } + } + + + // Second check if it is encroached. + // Comment: There may exist more than one encroaching points of this segment. + // The 'encpt' returns the one which is closet to it. + triface searchtet, spintet; + point eapex; + REAL d, diff, smdist = 0; + int t1ver; + + sstpivot1(*chkseg, searchtet); + spintet = searchtet; + while (1) { + eapex = apex(spintet); + if (eapex != dummypoint) { + d = distance(ccent, eapex); + diff = d - r; + if (fabs(diff) / r < b->epsilon) diff = 0.0; // Rounding. + if (diff < 0) { + // This segment is encroached by eapex. + if (useinsertradius) { + if (encpt == NULL) { + encpt = eapex; + smdist = d; + } else { + // Choose the closet encroaching point. + if (d < smdist) { + encpt = eapex; + smdist = d; + } + } + } else { + encpt = eapex; + break; + } + } + } + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } // while (1) + + if (encpt != NULL) { + return 1; + } + + return 0; // No need to split it. +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// splitsegment() Split a segment. // +// // +// The segment 'splitseg' is intended to be split. It will be split if it // +// is in one of the following cases: // +// (1) It is encroached by an existing vertex 'encpt != NULL'; or // +// (2) It is in bad quality 'qflag == 1'; or // +// (3) Its length is larger than the mesh sizes at its endpoints. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::splitsegment(face *splitseg, point encpt, REAL rrp, + point encpt1, point encpt2, int qflag, + int chkencflag) +{ + + if (!qflag && smarktest3ed(*splitseg)) { + // Do not try to re-split a marked segment. + return 0; + } + + if (b->nobisect) { // With -Y option. + // Only split this segment if it is allowed to be split. + if (checkconstraints) { + // Check if it has a non-zero length bound. + if (areabound(*splitseg) == 0) { + // It is not allowed. However, if all of facets containing this seg + // is allowed to be split, we still split it. + face parentsh, spinsh; + //splitseg.shver = 0; + spivot(*splitseg, parentsh); + if (parentsh.sh == NULL) { + return 0; // A dangling segment. Do not split it. + } + spinsh = parentsh; + while (1) { + if (areabound(spinsh) == 0) break; + spivotself(spinsh); + if (spinsh.sh == parentsh.sh) break; + if (spinsh.sh == NULL) break; // It belongs to only one facet. + } + if ((!spinsh.sh) || (areabound(spinsh) == 0)) { + // All facets at this seg are not allowed to be split. + return 0; // Do not split it. + } + } + } else { + return 0; // Do not split this segment. + } + } // if (b->nobisect) + + triface searchtet; + face searchsh; + point newpt; + insertvertexflags ivf; + + makepoint(&newpt, FREESEGVERTEX); + getsteinerptonsegment(splitseg, encpt, newpt); + + if (!qflag && !b->cdtrefine) { + // Do not insert the point if it encroaches upon an adjacent segment. + face parentsh; + spivot(*splitseg, parentsh); + if (parentsh.sh != NULL) { + face spinsh, neighsh; + face neighseg; + spinsh = parentsh; + while (1) { + for (int i = 0; i < 2; i++) { + if (i == 0) { + senext(spinsh, neighsh); + } else { + senext2(spinsh, neighsh); + } + if (isshsubseg(neighsh)) { + sspivot(neighsh, neighseg); + if (checkseg4encroach(sorg(neighseg), sdest(neighseg), newpt)) { + pointdealloc(newpt); + return 0; // Do not split this segment. + } + } + } // i + spivotself(spinsh); + if (spinsh.sh == NULL) break; + if (spinsh.sh == parentsh.sh) break; + } // while (1) + } + } + + // Split the segment by the Bowyer-Watson algorithm. + sstpivot1(*splitseg, searchtet); + ivf.iloc = (int) ONEDGE; + ivf.bowywat = 3; // Use Bowyer-Watson, preserve subsegments and subfaces; + ivf.validflag = 1; // Validate the B-W cavity. + ivf.lawson = 2; // Do flips to recover Delaunayness. + ivf.rejflag = 0; // Do not check encroachment of new segments/facets. + if (b->metric) { + ivf.rejflag |= 4; // Do check encroachment of protecting balls. + } + ivf.chkencflag = chkencflag; + ivf.sloc = (int) INSTAR; // ivf.iloc; + ivf.sbowywat = 3; // ivf.bowywat; // Surface mesh options. + ivf.splitbdflag = 1; + ivf.respectbdflag = 1; + ivf.assignmeshsize = b->metric; + ivf.smlenflag = useinsertradius; // Return the closet mesh vertex. + + + if (insertpoint(newpt, &searchtet, &searchsh, splitseg, &ivf)) { + st_segref_count++; + if (steinerleft > 0) steinerleft--; + if (useinsertradius) { + save_segmentpoint_insradius(newpt, ivf.parentpt, ivf.smlen); + } + if (flipstack != NULL) { + flipconstraints fc; + fc.chkencflag = chkencflag; + fc.enqflag = 2; + lawsonflip3d(&fc); + unflipqueue->restart(); + } + return 1; + } else { + // Point is not inserted. + if (ivf.iloc == (int) NEARVERTEX) { + terminatetetgen(this, 2); + } + pointdealloc(newpt); + // Mark this segment to avoid splitting in the future. + smarktest3(*splitseg); + return 0; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// repairencsegs() Repair encroached (sub) segments. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::repairencsegs(int chkencflag) +{ + face *bface; + point encpt = NULL; + int qflag = 0; + + // Loop until the pool 'badsubsegs' is empty. Note that steinerleft == -1 + // if an unlimited number of Steiner points is allowed. + while ((badsubsegs->items > 0) && (steinerleft != 0)) { + badsubsegs->traversalinit(); + bface = (face *) badsubsegs->traverse(); + while ((bface != NULL) && (steinerleft != 0)) { + // Skip a deleleted element. + if (bface->shver >= 0) { + // A queued segment may have been deleted (split). + if ((bface->sh != NULL) && (bface->sh[3] != NULL)) { + // A queued segment may have been processed. + if (smarktest2ed(*bface)) { + sunmarktest2(*bface); + if (checkseg4split(bface, encpt, qflag)) { + splitsegment(bface, encpt, 0, NULL, NULL, qflag, chkencflag); + } + } + } + // Remove this entry from list. + bface->shver = -1; // Signal it as a deleted element. + badsubsegs->dealloc((void *) bface); + } + bface = (face *) badsubsegs->traverse(); + } + } + + if (badsubsegs->items > 0) { + if (b->verbose) { + printf("The desired number of Steiner points is reached.\n"); + } + badsubsegs->traversalinit(); + bface = (face *) badsubsegs->traverse(); + while (bface != NULL) { + // Skip a deleleted element. + if (bface->shver >= 0) { + if ((bface->sh != NULL) && (bface->sh[3] != NULL)) { + if (smarktest2ed(*bface)) { + sunmarktest2(*bface); + } + } + } + bface = (face *) badsubsegs->traverse(); + } + badsubsegs->restart(); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// checkfac4encroach() Check if a subface is encroached by a point. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checkfac4encroach(point pa, point pb, point pc, point checkpt, + REAL* cent, REAL* r) +{ + REAL rd, len; + int encroached = 0; + + circumsphere(pa, pb, pc, NULL, cent, &rd); + if (rd == 0) { + terminatetetgen(this, 2); + } + + if (b->use_equatorial_lens) { + REAL normal[3], fcenter[3]; + REAL xta, yta, zta; + REAL multiplier; + + fcenter[0] = cent[0] - pc[0]; + fcenter[1] = cent[1] - pc[1]; + fcenter[2] = cent[2] - pc[2]; + + // Get the normal of the oriented face [a->b->c], without normalized. + facenormal(pa, pb, pc, normal, 1, NULL); + multiplier = 0.985 * sqrt((fcenter[0]*fcenter[0] + fcenter[1]*fcenter[1] + + fcenter[2]*fcenter[2]) / + (3.0 * (normal[0] * normal[0] + normal[1] * normal[1] + + normal[2] * normal[2]))); + xta = checkpt[0] - pc[0]; + yta = checkpt[1] - pc[1]; + zta = checkpt[2] - pc[2]; + // Make sure that the normal is pointing to "checkpt". + if ((xta * normal[0] + yta * normal[1] + zta * normal[2]) < 0) { + // Reverse the normal direction. + normal[0] = -normal[0]; + normal[1] = -normal[1]; + normal[2] = -normal[2]; + } + + if (xta * xta + yta * yta + zta * zta <= + 2.0 * (xta * (fcenter[0] - multiplier * normal[0]) + + yta * (fcenter[1] - multiplier * normal[1]) + + zta * (fcenter[2] - multiplier * normal[2]))) { + encroached = 1; + } + } else { + len = distance(cent, checkpt); + if ((fabs(len - rd) / rd) < b->epsilon) len = rd; // Rounding. + if (len < rd) { + encroached = 1; + } + } + + if (encroached) { + // The point lies inside the circumsphere of this face. + if (b->metric) { // -m option. + if ((pa[pointmtrindex] > 0) && (pb[pointmtrindex] > 0) && + (pc[pointmtrindex] > 0)) { + // Get the projection of 'checkpt' in the plane of pa, pb, and pc. + REAL prjpt[3], n[3]; + REAL a, a1, a2, a3; + projpt2face(checkpt, pa, pb, pc, prjpt); + // Get the face area of [a,b,c]. + facenormal(pa, pb, pc, n, 1, NULL); + a = sqrt(dot(n,n)); + // Get the face areas of [a,b,p], [b,c,p], and [c,a,p]. + facenormal(pa, pb, prjpt, n, 1, NULL); + a1 = sqrt(dot(n,n)); + facenormal(pb, pc, prjpt, n, 1, NULL); + a2 = sqrt(dot(n,n)); + facenormal(pc, pa, prjpt, n, 1, NULL); + a3 = sqrt(dot(n,n)); + if ((fabs(a1 + a2 + a3 - a) / a) < b->epsilon) { + // This face contains the projection. + // Get the mesh size at the location of the projection point. + rd = a1 / a * pc[pointmtrindex] + + a2 / a * pa[pointmtrindex] + + a3 / a * pb[pointmtrindex]; + len = distance(prjpt, checkpt); + if (len < rd) { + return 1; // Encroached. + } + } + } else { + return 1; // No protecting ball. Encroached. + } + } else { + *r = rd; + return 1; // Encroached. + } + } + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// checkfac4split() Check if a subface needs to be split. // +// // +// A subface needs to be split if it is in the following case: // +// (1) It is encroached by an existing vertex. // +// (2) It has bad quality (has a small angle, -q). // +// (3) It's area is larger than a prescribed value (.var). // +// // +// Return 1 if it needs to be split, otherwise, return 0. // +// 'chkfac' represents its longest edge. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checkfac4split(face *chkfac, point& encpt, int& qflag, + REAL *cent) +{ + point pa, pb, pc; + REAL area, rd, len; + REAL A[4][4], rhs[4], D; + int indx[4]; + int i; + + encpt = NULL; + qflag = 0; + + pa = sorg(*chkfac); + pb = sdest(*chkfac); + pc = sapex(*chkfac); + + // Compute the coefficient matrix A (3x3). + A[0][0] = pb[0] - pa[0]; + A[0][1] = pb[1] - pa[1]; + A[0][2] = pb[2] - pa[2]; // vector V1 (pa->pb) + A[1][0] = pc[0] - pa[0]; + A[1][1] = pc[1] - pa[1]; + A[1][2] = pc[2] - pa[2]; // vector V2 (pa->pc) + cross(A[0], A[1], A[2]); // vector V3 (V1 X V2) + + area = 0.5 * sqrt(dot(A[2], A[2])); // The area of [a,b,c]. + + // Compute the right hand side vector b (3x1). + rhs[0] = 0.5 * dot(A[0], A[0]); // edge [a,b] + rhs[1] = 0.5 * dot(A[1], A[1]); // edge [a,c] + rhs[2] = 0.0; + + // Solve the 3 by 3 equations use LU decomposition with partial + // pivoting and backward and forward substitute. + if (!lu_decmp(A, 3, indx, &D, 0)) { + // A degenerate triangle. + terminatetetgen(this, 2); + } + + lu_solve(A, 3, indx, rhs, 0); + cent[0] = pa[0] + rhs[0]; + cent[1] = pa[1] + rhs[1]; + cent[2] = pa[2] + rhs[2]; + rd = sqrt(rhs[0] * rhs[0] + rhs[1] * rhs[1] + rhs[2] * rhs[2]); + + if (checkconstraints && (areabound(*chkfac) > 0.0)) { + // Check if the subface has too big area. + if (area > areabound(*chkfac)) { + qflag = 1; + return 1; + } + } + + if (b->fixedvolume) { + if ((area * sqrt(area)) > b->maxvolume) { + qflag = 1; + return 1; + } + } + + if (b->varvolume) { + triface adjtet; + REAL volbnd; + int t1ver; + + stpivot(*chkfac, adjtet); + if (!ishulltet(adjtet)) { + volbnd = volumebound(adjtet.tet); + if ((volbnd > 0) && (area * sqrt(area)) > volbnd) { + qflag = 1; + return 1; + } + } + fsymself(adjtet); + if (!ishulltet(adjtet)) { + volbnd = volumebound(adjtet.tet); + if ((volbnd > 0) && (area * sqrt(area)) > volbnd) { + qflag = 1; + return 1; + } + } + } + + if (b->metric) { // -m option. Check mesh size. + // Check if the ccent lies outside one of the prot.balls at vertices. + if (((pa[pointmtrindex] > 0) && (rd > pa[pointmtrindex])) || + ((pb[pointmtrindex] > 0) && (rd > pb[pointmtrindex])) || + ((pc[pointmtrindex] > 0) && (rd > pc[pointmtrindex]))) { + qflag = 1; // Enforce mesh size. + return 1; + } + } + + triface searchtet; + REAL smlen = 0; + + // Check if this subface is locally encroached. + for (i = 0; i < 2; i++) { + stpivot(*chkfac, searchtet); + if (!ishulltet(searchtet)) { + int encroached = 0; + + len = distance(oppo(searchtet), cent); + if ((fabs(len - rd) / rd) < b->epsilon) len = rd;// Rounding. + + if (b->use_equatorial_lens) { + point tettapex = oppo(searchtet); + REAL normal[3], fcenter[3]; + REAL xta, yta, zta; + REAL multiplier; + // Get the normal of the oriented face [a->b->c], without normalized. + point fa = org(searchtet); + point fb = dest(searchtet); + point fc = apex(searchtet); + + fcenter[0] = cent[0] - fc[0]; + fcenter[1] = cent[1] - fc[1]; + fcenter[2] = cent[2] - fc[2]; + + facenormal(fa, fb, fc, normal, 1, NULL); + multiplier = 0.985 * sqrt((fcenter[0]*fcenter[0] + fcenter[1]*fcenter[1] + + fcenter[2]*fcenter[2]) / + (3.0 * (normal[0] * normal[0] + normal[1] * normal[1] + + normal[2] * normal[2]))); + xta = tettapex[0] - fc[0]; + yta = tettapex[1] - fc[1]; + zta = tettapex[2] - fc[2]; + if (xta * xta + yta * yta + zta * zta <= + 2.0 * (xta * (fcenter[0] - multiplier * normal[0]) + + yta * (fcenter[1] - multiplier * normal[1]) + + zta * (fcenter[2] - multiplier * normal[2]))) { + encroached = 1; + } + } else { + if (len < rd) { + encroached = 1; + } + } + + if (encroached) { + if (smlen == 0) { + smlen = len; + encpt = oppo(searchtet); + } else { + if (len < smlen) { + smlen = len; + encpt = oppo(searchtet); + } + } + //return 1; + } + } + sesymself(*chkfac); + } + + return encpt != NULL; //return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// splitsubface() Split a subface. // +// // +// The subface may be encroached, or in bad-quality. It is split at its cir- // +// cumcenter ('ccent'). Do not split it if 'ccent' encroaches upon any seg- // +// ment. Instead, one of the encroached segments is split. It is possible // +// that none of the encroached segments can be split. // +// // +// The return value indicates whether a new point is inserted (> 0) or not // +// (= 0). Furthermore, it is inserted on an encroached segment (= 1) or // +// in-side the facet (= 2). // +// // +// 'encpt' is a vertex encroaching upon this subface, i.e., it causes the // +// split of this subface. If 'encpt' is NULL, then the cause of the split // +// this subface is a rejected tet circumcenter 'p', and 'encpt1' is the // +// parent of 'p'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::splitsubface(face *splitfac, point encpt, point encpt1, + int qflag, REAL *ccent, int chkencflag) +{ + + if (!qflag && smarktest3ed(*splitfac)) { + // Do not try to re-split a marked subface. + return 0; + } + + if (b->nobisect) { // With -Y option. + if (checkconstraints) { + // Only split if it is allowed to be split. + // Check if this facet has a non-zero constraint. + if (areabound(*splitfac) == 0) { + return 0; // Do not split it. + } + } else { + return 0; + } + } // if (b->nobisect) + + if (useinsertradius) { + if (encpt != NULL) { + REAL rp; // Insertion radius of newpt. + REAL rv = distance(encpt, ccent); + if (pointtype(encpt) == FREESEGVERTEX) { + face parentseg; + sdecode(point2sh(encpt), parentseg); + if (segfacetadjacent(&parentseg, splitfac)) { + rp = getpointinsradius(encpt); + if (rv < (sqrt(2.0) * rp)) { + // This insertion may cause no termination. + return 0; // Reject the insertion of newpt. + } + } + } else if (pointtype(encpt) == FREEFACETVERTEX) { + face parentsh; + sdecode(point2sh(encpt), parentsh); + if (facetfacetadjacent(&parentsh, splitfac)) { + rp = getpointinsradius(encpt); + if (rv < rp) { + return 0; // Reject the insertion of newpt. + } + } + } + } + } // if (useinsertradius) + + face searchsh; + insertvertexflags ivf; + point newpt; + int i; + + // Initialize the inserting point. + makepoint(&newpt, FREEFACETVERTEX); + // Split the subface at its circumcenter. + for (i = 0; i < 3; i++) newpt[i] = ccent[i]; + + // Search a subface which contains 'newpt'. + searchsh = *splitfac; + // Calculate an above point. It lies above the plane containing + // the subface [a,b,c], and save it in dummypoint. Moreover, + // the vector cent->dummypoint is the normal of the plane. + calculateabovepoint4(newpt, sorg(*splitfac), sdest(*splitfac), + sapex(*splitfac)); + // Parameters: 'aflag' = 1, - above point exists. + // 'cflag' = 0, - non-convex, check co-planarity of the result. + // 'rflag' = 0, - no need to round the locating result. + ivf.iloc = (int) slocate(newpt, &searchsh, 1, 0, 0); + + if (!((ivf.iloc == (int) ONFACE) || (ivf.iloc == (int) ONEDGE))) { + // Point location failed. + pointdealloc(newpt); + // Mark this subface to avoid splitting in the future. + smarktest3(*splitfac); + return 0; + } + + + triface searchtet; + + // Insert the point. + stpivot(searchsh, searchtet); + ivf.bowywat = 3; // Use Bowyer-Watson. Preserve subsegments and subfaces; + ivf.lawson = 2; + ivf.rejflag = 1; // Do check the encroachment of segments. + if (b->metric) { + ivf.rejflag |= 4; // Do check encroachment of protecting balls. + } + ivf.chkencflag = chkencflag; + ivf.sloc = (int) INSTAR; // ivf.iloc; + ivf.sbowywat = 3; // ivf.bowywat; + ivf.splitbdflag = 1; + ivf.validflag = 1; + ivf.respectbdflag = 1; + ivf.assignmeshsize = b->metric; + ivf.refineflag = 2; + ivf.refinesh = *splitfac; + ivf.smlenflag = useinsertradius; // Update the insertion radius. + + + if (insertpoint(newpt, &searchtet, &searchsh, NULL, &ivf)) { + st_facref_count++; + if (steinerleft > 0) steinerleft--; + if (useinsertradius) { + save_facetpoint_insradius(newpt, ivf.parentpt, ivf.smlen); + } // if (useinsertradius) + if (flipstack != NULL) { + flipconstraints fc; + fc.chkencflag = chkencflag; + fc.enqflag = 2; + lawsonflip3d(&fc); + unflipqueue->restart(); + } + return 1; + } else { + // Point was not inserted. + pointdealloc(newpt); + if (ivf.iloc == (int) ENCSEGMENT) { + // Select an encroached segment and split it. + face *paryseg; + int splitflag = 0; + for (i = 0; i < encseglist->objects; i++) { + paryseg = (face *) fastlookup(encseglist, i); + if (splitsegment(paryseg, NULL, 0.0, encpt, encpt1, qflag, + chkencflag | 1)) { + splitflag = 1; // A point is inserted on a segment. + break; + } + } // i + encseglist->restart(); + if (splitflag) { + // Some segments may need to be repaired. + if (badsubsegs->items > 0) { + repairencsegs(chkencflag | 1); + } + return 1; + } + } else { + if (ivf.iloc == (int) NEARVERTEX) { + terminatetetgen(this, 2); + } + } + // Mark this subface to avoid splitting in the future. + smarktest3(*splitfac); + return 0; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// repairencfacs() Repair encroached subfaces. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::repairencfacs(int chkencflag) +{ + face *bface; + point encpt = NULL; + int qflag = 0; + REAL ccent[3]; + + // Loop until the pool 'badsubfacs' is empty. Note that steinerleft == -1 + // if an unlimited number of Steiner points is allowed. + while ((badsubfacs->items > 0) && (steinerleft != 0)) { + badsubfacs->traversalinit(); + bface = (face *) badsubfacs->traverse(); + while ((bface != NULL) && (steinerleft != 0)) { + // Skip a deleted element. + if (bface->shver >= 0) { + // A queued subface may have been deleted (split). + if ((bface->sh != NULL) && (bface->sh[3] != NULL)) { + // A queued subface may have been processed. + if (smarktest2ed(*bface)) { + sunmarktest2(*bface); + if (checkfac4split(bface, encpt, qflag, ccent)) { + splitsubface(bface, encpt, NULL, qflag, ccent, chkencflag); + } + } + } + bface->shver = -1; // Signal it as a deleted element. + badsubfacs->dealloc((void *) bface); // Remove this entry from list. + } + bface = (face *) badsubfacs->traverse(); + } + } + + if (badsubfacs->items > 0) { + if (steinerleft == 0) { + if (b->verbose) { + printf("The desired number of Steiner points is reached.\n"); + } + } else { + terminatetetgen(this, 2); + } + badsubfacs->traversalinit(); + bface = (face *) badsubfacs->traverse(); + while (bface != NULL) { + // Skip a deleted element. + if (bface->shver >= 0) { + if ((bface->sh != NULL) && (bface->sh[3] != NULL)) { + if (smarktest2ed(*bface)) { + sunmarktest2(*bface); + } + } + } + bface = (face *) badsubfacs->traverse(); + } + badsubfacs->restart(); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// checktet4split() Check if the tet needs to be split. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checktet4split(triface *chktet, int &qflag, REAL *ccent) +{ + point pa, pb, pc, pd, *ppt; + REAL vda[3], vdb[3], vdc[3]; + REAL vab[3], vbc[3], vca[3]; + REAL N[4][3], L[4], cosd[6], elen[6]; + REAL maxcosd, vol, volbnd, smlen = 0, rd; + REAL A[4][4], rhs[4], D; + int indx[4]; + int i, j; + + if (b->convex) { // -c + // Skip this tet if it lies in the exterior. + if (elemattribute(chktet->tet, numelemattrib - 1) == -1.0) { + return 0; + } + } + + qflag = 0; + + pd = (point) chktet->tet[7]; + if (pd == dummypoint) { + return 0; // Do not split a hull tet. + } + + pa = (point) chktet->tet[4]; + pb = (point) chktet->tet[5]; + pc = (point) chktet->tet[6]; + + // Get the edge vectors vda: d->a, vdb: d->b, vdc: d->c. + // Set the matrix A = [vda, vdb, vdc]^T. + for (i = 0; i < 3; i++) A[0][i] = vda[i] = pa[i] - pd[i]; + for (i = 0; i < 3; i++) A[1][i] = vdb[i] = pb[i] - pd[i]; + for (i = 0; i < 3; i++) A[2][i] = vdc[i] = pc[i] - pd[i]; + + // Get the other edge vectors. + for (i = 0; i < 3; i++) vab[i] = pb[i] - pa[i]; + for (i = 0; i < 3; i++) vbc[i] = pc[i] - pb[i]; + for (i = 0; i < 3; i++) vca[i] = pa[i] - pc[i]; + + if (!lu_decmp(A, 3, indx, &D, 0)) { + // A degenerated tet (vol = 0). + // This is possible due to the use of exact arithmetic. We temporarily + // leave this tet. It should be fixed by mesh optimization. + return 0; + } + + // Check volume if '-a#' and '-a' options are used. + if (b->varvolume || b->fixedvolume) { + vol = fabs(A[indx[0]][0] * A[indx[1]][1] * A[indx[2]][2]) / 6.0; + if (b->fixedvolume) { + if (vol > b->maxvolume) { + qflag = 1; + } + } + if (!qflag && b->varvolume) { + volbnd = volumebound(chktet->tet); + if ((volbnd > 0.0) && (vol > volbnd)) { + qflag = 1; + } + } + if (qflag == 1) { + // Calculate the circumcenter of this tet. + rhs[0] = 0.5 * dot(vda, vda); + rhs[1] = 0.5 * dot(vdb, vdb); + rhs[2] = 0.5 * dot(vdc, vdc); + lu_solve(A, 3, indx, rhs, 0); + for (i = 0; i < 3; i++) ccent[i] = pd[i] + rhs[i]; + return 1; + } + } + + if (b->metric) { // -m option. Check mesh size. + // Calculate the circumradius of this tet. + rhs[0] = 0.5 * dot(vda, vda); + rhs[1] = 0.5 * dot(vdb, vdb); + rhs[2] = 0.5 * dot(vdc, vdc); + lu_solve(A, 3, indx, rhs, 0); + for (i = 0; i < 3; i++) ccent[i] = pd[i] + rhs[i]; + rd = sqrt(dot(rhs, rhs)); + // Check if the ccent lies outside one of the prot.balls at vertices. + ppt = (point *) &(chktet->tet[4]); + for (i = 0; i < 4; i++) { + if (ppt[i][pointmtrindex] > 0) { + if (rd > ppt[i][pointmtrindex]) { + qflag = 1; // Enforce mesh size. + return 1; + } + } + } + } + + if (in->tetunsuitable != NULL) { + // Execute the user-defined meshing sizing evaluation. + if ((*(in->tetunsuitable))(pa, pb, pc, pd, NULL, 0)) { + // Calculate the circumcenter of this tet. + rhs[0] = 0.5 * dot(vda, vda); + rhs[1] = 0.5 * dot(vdb, vdb); + rhs[2] = 0.5 * dot(vdc, vdc); + lu_solve(A, 3, indx, rhs, 0); + for (i = 0; i < 3; i++) ccent[i] = pd[i] + rhs[i]; + return 1; + } + } + + if (useinsertradius) { + // Do not split this tet if the shortest edge is shorter than the + // insertion radius of one of its endpoints. + triface checkedge; + point e1, e2; + REAL rrv, smrrv; + + // Get the shortest edge of this tet. + checkedge.tet = chktet->tet; + for (i = 0; i < 6; i++) { + checkedge.ver = edge2ver[i]; + e1 = org(checkedge); + e2 = dest(checkedge); + elen[i] = distance(e1, e2); + if (i == 0) { + smlen = elen[i]; + j = 0; + } else { + if (elen[i] < smlen) { + smlen = elen[i]; + j = i; + } + } + } + // Check if the edge is too short. + checkedge.ver = edge2ver[j]; + // Get the smallest rrv of e1 and e2. + // Note: if rrv of e1 and e2 is zero. Do not use it. + e1 = org(checkedge); + smrrv = getpointinsradius(e1); + e2 = dest(checkedge); + rrv = getpointinsradius(e2); + if (rrv > 0) { + if (smrrv > 0) { + if (rrv < smrrv) { + smrrv = rrv; + } + } else { + smrrv = rrv; + } + } + if (smrrv > 0) { + // To avoid rounding error, round smrrv before doing comparison. + if ((fabs(smrrv - smlen) / smlen) < b->epsilon) { + smrrv = smlen; + } + if (smrrv > smlen) { + return 0; + } + } + } // if (useinsertradius) + + // Check the radius-edge ratio. Set by -q#. + if (b->minratio > 0) { + // Calculate the circumcenter and radius of this tet. + rhs[0] = 0.5 * dot(vda, vda); + rhs[1] = 0.5 * dot(vdb, vdb); + rhs[2] = 0.5 * dot(vdc, vdc); + lu_solve(A, 3, indx, rhs, 0); + for (i = 0; i < 3; i++) ccent[i] = pd[i] + rhs[i]; + rd = sqrt(dot(rhs, rhs)); + if (!useinsertradius) { + // Calculate the shortest edge length. + elen[0] = dot(vda, vda); + elen[1] = dot(vdb, vdb); + elen[2] = dot(vdc, vdc); + elen[3] = dot(vab, vab); + elen[4] = dot(vbc, vbc); + elen[5] = dot(vca, vca); + smlen = elen[0]; //sidx = 0; + for (i = 1; i < 6; i++) { + if (smlen > elen[i]) { + smlen = elen[i]; //sidx = i; + } + } + smlen = sqrt(smlen); + } + D = rd / smlen; + if (D > b->minratio) { + // A bad radius-edge ratio. + return 1; + } + } + + // Check the minimum dihedral angle. Set by -qq#. + if (b->mindihedral > 0) { + // Compute the 4 face normals (N[0], ..., N[3]). + for (j = 0; j < 3; j++) { + for (i = 0; i < 3; i++) N[j][i] = 0.0; + N[j][j] = 1.0; // Positive means the inside direction + lu_solve(A, 3, indx, N[j], 0); + } + for (i = 0; i < 3; i++) N[3][i] = - N[0][i] - N[1][i] - N[2][i]; + // Normalize the normals. + for (i = 0; i < 4; i++) { + L[i] = sqrt(dot(N[i], N[i])); + if (L[i] == 0) { + terminatetetgen(this, 2); + } + for (j = 0; j < 3; j++) N[i][j] /= L[i]; + } + // Calculate the six dihedral angles. + cosd[0] = -dot(N[0], N[1]); // Edge cd, bd, bc. + cosd[1] = -dot(N[0], N[2]); + cosd[2] = -dot(N[0], N[3]); + cosd[3] = -dot(N[1], N[2]); // Edge ad, ac + cosd[4] = -dot(N[1], N[3]); + cosd[5] = -dot(N[2], N[3]); // Edge ab + // Get the smallest dihedral angle. + //maxcosd = mincosd = cosd[0]; + maxcosd = cosd[0]; + for (i = 1; i < 6; i++) { + //if (cosd[i] > maxcosd) maxcosd = cosd[i]; + maxcosd = (cosd[i] > maxcosd ? cosd[i] : maxcosd); + //mincosd = (cosd[i] < mincosd ? cosd[i] : maxcosd); + } + if (maxcosd > cosmindihed) { + // Calculate the circumcenter of this tet. + // A bad dihedral angle. + //if ((b->quality & 1) == 0) { + rhs[0] = 0.5 * dot(vda, vda); + rhs[1] = 0.5 * dot(vdb, vdb); + rhs[2] = 0.5 * dot(vdc, vdc); + lu_solve(A, 3, indx, rhs, 0); + for (i = 0; i < 3; i++) ccent[i] = pd[i] + rhs[i]; + //*rd = sqrt(dot(rhs, rhs)); + //} + return 1; + } + } + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// splittetrahedron() Split a tetrahedron. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::splittetrahedron(triface* splittet, int qflag, REAL *ccent, + int chkencflag) +{ + triface searchtet; + face *paryseg; + point newpt, *ppt; + badface *bface; + insertvertexflags ivf; + int splitflag = 0; + int i; + + + + REAL rv = 0.; // Insertion radius of 'newpt'. + + makepoint(&newpt, FREEVOLVERTEX); + for (i = 0; i < 3; i++) newpt[i] = ccent[i]; + + + // Locate the new point. Starting from an interior point 'q' of the + // splittet. We perform a walk from q to the 'newpt', stop walking + // either we hit a subface or enter OUTSIDE. + searchtet = *splittet; + ivf.iloc = (int) OUTSIDE; + ivf.iloc = locate(newpt, &searchtet, 1); // 'chkencflag' = 1. + + if ((ivf.iloc == (int) OUTSIDE) || (ivf.iloc == (int) ENCSUBFACE)) { + // The circumcenter 'c' is not visible from 'q' (the interior of the tet). +// iffalse + if (b->verbose > 2) { + printf(" New point %d is blocked by a polygon.\n", pointmark(newpt)); + } +// \fi + pointdealloc(newpt); // Do not insert this vertex. + if (b->nobisect) return 0; // -Y option. + // There must be a polygon that blocks the visibility. + // Search a subpolygon that contains the proj(c). + face searchsh; + REAL prjpt[3]; + locateresult sloc = OUTSIDE; + tspivot(searchtet, searchsh); + ppt = (point *) &(searchsh.sh[3]); + projpt2face(ccent, ppt[0], ppt[1], ppt[2], prjpt); + // Locate proj(c) on polygon. + sloc = slocate(prjpt, &searchsh, 0, 0, 1); + if ((sloc == ONEDGE) || (sloc == ONFACE)) { + // Found a subface/edge containing proj(c). + // Check if 'c' encoraches upon this subface. + REAL fcent[3], r = 0; + ppt = (point *) &(searchsh.sh[3]); + if (checkfac4encroach(ppt[0], ppt[1], ppt[2], ccent, fcent, &r)) { + // Encroached. Split this subface. + splitflag = splitsubface(&searchsh, NULL, org(*splittet), qflag, + fcent, chkencflag | 2); + if (splitflag) { + // Some subfaces may need to be repaired. + repairencfacs(chkencflag | 2); + } + } + } + else if ((sloc == OUTSIDE) || (sloc == ENCSEGMENT)) { + // Hit a segment. We should split it. + // To be done... + // printf("hit segment, split it.\n"); // For debug only + } + if (splitflag) { + // Queue the tet if it is still alive. + if ((splittet->tet != NULL) && (splittet->tet[4] != NULL)) { + enqueuetetrahedron(splittet); + } + } + return splitflag; + } + + + + // Use Bowyer-Watson algorithm. Preserve subsegments and subfaces; + ivf.bowywat = 3; + ivf.lawson = 2; + ivf.rejflag = 3; // Do check for encroached segments and subfaces. + if (b->metric) { + ivf.rejflag |= 4; // Reject it if it lies in some protecting balls. + } + ivf.chkencflag = chkencflag; + ivf.sloc = ivf.sbowywat = 0; // No use. + ivf.splitbdflag = 0; // No use. + ivf.validflag = 1; + ivf.respectbdflag = 1; + ivf.assignmeshsize = b->metric; + + ivf.refineflag = 1; + ivf.refinetet = *splittet; + if (useinsertradius) { + // Need to save insertion radius for this new point. + ivf.smlenflag = 1; // Return the shortest edge length after inserting + // the new vertex. [2016-09-19] + } + + + if (insertpoint(newpt, &searchtet, NULL, NULL, &ivf)) { + // Vertex is inserted. + st_volref_count++; + if (steinerleft > 0) steinerleft--; + if (useinsertradius) { + setpointinsradius(newpt, ivf.smlen); + setpoint2ppt(newpt, ivf.parentpt); + } + if (flipstack != NULL) { + flipconstraints fc; + fc.chkencflag = chkencflag; + fc.enqflag = 2; + lawsonflip3d(&fc); + unflipqueue->restart(); + } + return 1; + } else { + // Point is not inserted. + pointdealloc(newpt); + // Check if there are encroached segments/subfaces. + if (ivf.iloc == (int) ENCSEGMENT) { + if (!b->nobisect || checkconstraints) { + // Select an encroached segment and split it. + for (i = 0; i < encseglist->objects; i++) { + paryseg = (face *) fastlookup(encseglist, i); + if (splitsegment(paryseg, NULL, rv, org(*splittet), NULL, qflag, + chkencflag | 3)) { + splitflag = 1; // A point is inserted on a segment. + break; + } + } + } // if (!b->nobisect) + encseglist->restart(); + if (splitflag) { + // Some segments may need to be repaired. + if (badsubsegs->items > 0) { + repairencsegs(chkencflag | 3); + } + // Some subfaces may need to be repaired. + if (badsubfacs->items > 0) { + repairencfacs(chkencflag | 2); + } + } + } else if (ivf.iloc == (int) ENCSUBFACE) { + if (!b->nobisect || checkconstraints) { + // Select an encroached subface and split it. + for (i = 0; i < encshlist->objects; i++) { + bface = (badface *) fastlookup(encshlist, i); + if (splitsubface(&(bface->ss), NULL, org(*splittet), qflag, + bface->cent, chkencflag | 2)){ + splitflag = 1; // A point is inserted on a subface or a segment. + break; + } + } + } // if (!b->nobisect) + encshlist->restart(); + if (splitflag) { + // Some subfaces may need to be repaired. + if (badsubfacs->items > 0) { + repairencfacs(chkencflag | 2); + } + } + } else { + if (ivf.iloc == (int) NEARVERTEX) { + terminatetetgen(this, 2); + } + } + if (splitflag) { + // Queue the tet if it is still alive. + if ((splittet->tet != NULL) && (splittet->tet[4] != NULL)) { + enqueuetetrahedron(splittet); + } + } else { + //assert(0); // If no small angle, why can this happen? + } + return splitflag; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// repairbadtets() Repair bad quality tetrahedra. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::repairbadtets(int chkencflag) +{ + triface *bface; + REAL ccent[3]; + int qflag = 0; + + + // Loop until the pool 'badsubfacs' is empty. Note that steinerleft == -1 + // if an unlimited number of Steiner points is allowed. + while ((badtetrahedrons->items > 0) && (steinerleft != 0)) { + badtetrahedrons->traversalinit(); + bface = (triface *) badtetrahedrons->traverse(); + while ((bface != NULL) && (steinerleft != 0)) { + // Skip a deleted element. + if (bface->ver >= 0) { + // A queued tet may have been deleted. + if (!isdeadtet(*bface)) { + // A queued tet may have been processed. + if (marktest2ed(*bface)) { + unmarktest2(*bface); + if (checktet4split(bface, qflag, ccent)) { + splittetrahedron(bface, qflag, ccent, chkencflag); + } + } + } + bface->ver = -1; // Signal it as a deleted element. + badtetrahedrons->dealloc((void *) bface); + } + bface = (triface *) badtetrahedrons->traverse(); + } + } + + if (badtetrahedrons->items > 0) { + if (steinerleft == 0) { + if (b->verbose) { + printf("The desired number of Steiner points is reached.\n"); + } + } else { + terminatetetgen(this, 2); // Unknown case. + } + // Unmark all queued tet. + badtetrahedrons->traversalinit(); + bface = (triface *) badtetrahedrons->traverse(); + while (bface != NULL) { + // Skip a deleted element. + if (bface->ver >= 0) { + if (!isdeadtet(*bface)) { + if (marktest2ed(*bface)) { + unmarktest2(*bface); + } + } + } + bface = (triface *) badtetrahedrons->traverse(); + } + // Clear the pool. + badtetrahedrons->restart(); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// delaunayrefinement() Refine the mesh by Delaunay refinement. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::delaunayrefinement() +{ + triface checktet; + face checksh; + face checkseg; + long steinercount; + int chkencflag; + + long bak_segref_count, bak_facref_count, bak_volref_count; + long bak_flipcount = flip23count + flip32count + flip44count; + + if (!b->quiet) { + printf("Refining mesh...\n"); + } + + if (b->verbose) { + printf(" Min radius-edge ratio = %g.\n", b->minratio); + printf(" Min dihedral angle = %g.\n", b->mindihedral); + //printf(" Min Edge length = %g.\n", b->minedgelength); + } + + steinerleft = b->steinerleft; // Upperbound of # Steiner points (by -S#). + if (steinerleft > 0) { + // Check if we've already used up the given number of Steiner points. + steinercount = st_segref_count + st_facref_count + st_volref_count; + if (steinercount < steinerleft) { + steinerleft -= steinercount; + } else { + if (!b->quiet) { + printf("\nWarning: "); + printf("The desired number of Steiner points (%d) has reached.\n\n", + b->steinerleft); + } + return; // No more Steiner points. + } + } + + if (useinsertradius) { + if ((b->plc && b->nobisect) || b->refine) { // '-pY' or '-r' option. + makesegmentendpointsmap(); + makefacetverticesmap(); + } + } + + + encseglist = new arraypool(sizeof(face), 8); + encshlist = new arraypool(sizeof(badface), 8); + + + //if (!b->nobisect) { // if no '-Y' option + if (!b->nobisect || checkconstraints) { + if (b->verbose) { + printf(" Splitting encroached subsegments.\n"); + } + + chkencflag = 1; // Only check encroaching subsegments. + steinercount = points->items; + + // Initialize the pool of encroached subsegments. + badsubsegs = new memorypool(sizeof(face), b->shellfaceperblock, + sizeof(void *), 0); + + // Add all segments into the pool. + subsegs->traversalinit(); + checkseg.sh = shellfacetraverse(subsegs); + while (checkseg.sh != (shellface *) NULL) { + enqueuesubface(badsubsegs, &checkseg); + checkseg.sh = shellfacetraverse(subsegs); + } + + // Split all encroached segments. + repairencsegs(chkencflag); + + if (b->verbose) { + printf(" Added %ld Steiner points.\n", points->items - steinercount); + } + + if (b->reflevel > 1) { // '-D2' option + if (b->verbose) { + printf(" Splitting encroached subfaces.\n"); + } + + chkencflag = 2; // Only check encroaching subfaces. + steinercount = points->items; + bak_segref_count = st_segref_count; + bak_facref_count = st_facref_count; + + // Initialize the pool of encroached subfaces. + badsubfacs = new memorypool(sizeof(face), b->shellfaceperblock, + sizeof(void *), 0); + + // Add all subfaces into the pool. + subfaces->traversalinit(); + checksh.sh = shellfacetraverse(subfaces); + while (checksh.sh != (shellface *) NULL) { + enqueuesubface(badsubfacs, &checksh); + checksh.sh = shellfacetraverse(subfaces); + } + + // Split all encroached subfaces. + repairencfacs(chkencflag); + + if (b->verbose) { + printf(" Added %ld (%ld,%ld) Steiner points.\n", + points->items-steinercount, st_segref_count-bak_segref_count, + st_facref_count-bak_facref_count); + } + } // if (b->reflevel > 1) + } // if (!b->nobisect) + + if (b->reflevel > 2) { // '-D3' option (The default option) + if (b->verbose) { + printf(" Splitting bad quality tets.\n"); + } + + chkencflag = 4; // Only check tetrahedra. + steinercount = points->items; + bak_segref_count = st_segref_count; + bak_facref_count = st_facref_count; + bak_volref_count = st_volref_count; + + // The cosine value of the min dihedral angle (-qq) for tetrahedra. + cosmindihed = cos(b->mindihedral / 180.0 * PI); + + // Initialize the pool of bad quality tetrahedra. + badtetrahedrons = new memorypool(sizeof(triface), b->tetrahedraperblock, + sizeof(void *), 0); + // Add all tetrahedra (no hull tets) into the pool. + tetrahedrons->traversalinit(); + checktet.tet = tetrahedrontraverse(); + while (checktet.tet != NULL) { + enqueuetetrahedron(&checktet); + checktet.tet = tetrahedrontraverse(); + } + + // Split all bad quality tetrahedra. + repairbadtets(chkencflag); + + if (b->verbose) { + printf(" Added %ld (%ld,%ld,%ld) Steiner points.\n", + points->items - steinercount, + st_segref_count - bak_segref_count, + st_facref_count - bak_facref_count, + st_volref_count - bak_volref_count); + } + } // if (b->reflevel > 2) + + if (b->verbose) { + if (flip23count + flip32count + flip44count > bak_flipcount) { + printf(" Performed %ld flips.\n", flip23count + flip32count + + flip44count - bak_flipcount); + } + } + + if (steinerleft == 0) { + if (!b->quiet) { + printf("\nWarnning: "); + printf("The desired number of Steiner points (%d) is reached.\n\n", + b->steinerleft); + } + } + + + delete encseglist; + delete encshlist; + encseglist = NULL; + encshlist = NULL; + + if (!b->nobisect || checkconstraints) { + totalworkmemory += (badsubsegs->maxitems * badsubsegs->itembytes); + delete badsubsegs; + badsubsegs = NULL; + if (b->reflevel > 1) { + totalworkmemory += (badsubfacs->maxitems * badsubfacs->itembytes); + delete badsubfacs; + badsubfacs = NULL; + } + } + if (b->reflevel > 2) { + totalworkmemory += (badtetrahedrons->maxitems*badtetrahedrons->itembytes); + delete badtetrahedrons; + badtetrahedrons = NULL; + } +} + +//// //// +//// //// +//// refine_cxx /////////////////////////////////////////////////////////////// + +//// optimize_cxx ///////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// lawsonflip3d() A three-dimensional Lawson's algorithm. // +// // +/////////////////////////////////////////////////////////////////////////////// + +long tetgenmesh::lawsonflip3d(flipconstraints *fc) +{ + triface fliptets[5], neightet, hulltet; + face checksh, casingout; + badface *popface, *bface; + point pd, pe, *pts; + REAL sign, ori; + REAL vol, len3; + long flipcount, totalcount = 0l; + long sliver_peels = 0l; + int t1ver; + int i; + + + while (1) { + + if (b->verbose > 2) { + printf(" Lawson flip %ld faces.\n", flippool->items); + } + flipcount = 0l; + + while (flipstack != (badface *) NULL) { + // Pop a face from the stack. + popface = flipstack; + fliptets[0] = popface->tt; + flipstack = flipstack->nextitem; // The next top item in stack. + flippool->dealloc((void *) popface); + + // Skip it if it is a dead tet (destroyed by previous flips). + if (isdeadtet(fliptets[0])) continue; + // Skip it if it is not the same tet as we saved. + if (!facemarked(fliptets[0])) continue; + + unmarkface(fliptets[0]); + + if (ishulltet(fliptets[0])) continue; + + fsym(fliptets[0], fliptets[1]); + if (ishulltet(fliptets[1])) { + if (nonconvex) { + // Check if 'fliptets[0]' it is a hull sliver. + tspivot(fliptets[0], checksh); + for (i = 0; i < 3; i++) { + if (!isshsubseg(checksh)) { + spivot(checksh, casingout); + //assert(casingout.sh != NULL); + if (sorg(checksh) != sdest(casingout)) sesymself(casingout); + stpivot(casingout, neightet); + if (neightet.tet == fliptets[0].tet) { + // Found a hull sliver 'neightet'. Let it be [e,d,a,b], where + // [e,d,a] and [d,e,b] are hull faces. + edestoppo(neightet, hulltet); // [a,b,e,d] + fsymself(hulltet); // [b,a,e,#] + if (oppo(hulltet) == dummypoint) { + pe = org(neightet); + if ((pointtype(pe) == FREEFACETVERTEX) || + (pointtype(pe) == FREESEGVERTEX)) { + removevertexbyflips(pe); + } + } else { + eorgoppo(neightet, hulltet); // [b,a,d,e] + fsymself(hulltet); // [a,b,d,#] + if (oppo(hulltet) == dummypoint) { + pd = dest(neightet); + if ((pointtype(pd) == FREEFACETVERTEX) || + (pointtype(pd) == FREESEGVERTEX)) { + removevertexbyflips(pd); + } + } else { + // Perform a 3-to-2 flip to remove the sliver. + fliptets[0] = neightet; // [e,d,a,b] + fnext(fliptets[0], fliptets[1]); // [e,d,b,c] + fnext(fliptets[1], fliptets[2]); // [e,d,c,a] + flip32(fliptets, 1, fc); + // Update counters. + flip32count--; + flip22count--; + sliver_peels++; + if (fc->remove_ndelaunay_edge) { + // Update the volume (must be decreased). + //assert(fc->tetprism_vol_sum <= 0); + tetprism_vol_sum += fc->tetprism_vol_sum; + fc->tetprism_vol_sum = 0.0; // Clear it. + } + } + } + break; + } // if (neightet.tet == fliptets[0].tet) + } // if (!isshsubseg(checksh)) + senextself(checksh); + } // i + } // if (nonconvex) + continue; + } + + if (checksubfaceflag) { + // Do not flip if it is a subface. + if (issubface(fliptets[0])) continue; + } + + // Test whether the face is locally Delaunay or not. + pts = (point *) fliptets[1].tet; + sign = insphere_s(pts[4], pts[5], pts[6], pts[7], oppo(fliptets[0])); + + if (sign < 0) { + // A non-Delaunay face. Try to flip it. + pd = oppo(fliptets[0]); + pe = oppo(fliptets[1]); + + // Use the length of the edge [d,e] as a reference to determine + // a nearly degenerated new tet. + len3 = distance(pd, pe); + len3 = (len3 * len3 * len3); + int round_flag = 0; // [2017-10-20] + // Check the convexity of its three edges. Stop checking either a + // locally non-convex edge (ori < 0) or a flat edge (ori = 0) is + // encountered, and 'fliptet' represents that edge. + for (i = 0; i < 3; i++) { + ori = orient3d(org(fliptets[0]), dest(fliptets[0]), pd, pe); + if (ori > 0) { + // Avoid creating a nearly degenerated new tet at boundary. + // Re-use fliptets[2], fliptets[3]; + esym(fliptets[0], fliptets[2]); + esym(fliptets[1], fliptets[3]); + if (issubface(fliptets[2]) || issubface(fliptets[3])) { + vol = orient3dfast(org(fliptets[0]), dest(fliptets[0]), pd, pe); + if ((fabs(vol) / len3) < b->epsilon) { + ori = 0.0; // Do rounding. + round_flag = 1; // [2017-10-20] + } + } + } // Rounding check + if (ori <= 0) break; + enextself(fliptets[0]); + eprevself(fliptets[1]); + } + + if (ori > 0) { + // A 2-to-3 flip is found. + // [0] [a,b,c,d], + // [1] [b,a,c,e]. no dummypoint. + flip23(fliptets, 0, fc); + flipcount++; + if (fc->remove_ndelaunay_edge) { + // Update the volume (must be decreased). + //assert(fc->tetprism_vol_sum <= 0); + tetprism_vol_sum += fc->tetprism_vol_sum; + fc->tetprism_vol_sum = 0.0; // Clear it. + } + continue; + } else { // ori <= 0 + // The edge ('fliptets[0]' = [a',b',c',d]) is non-convex or flat, + // where the edge [a',b'] is one of [a,b], [b,c], and [c,a]. + if (checksubsegflag) { + // Do not flip if it is a segment. + if (issubseg(fliptets[0])) continue; + } + // Check if there are three or four tets sharing at this edge. + esymself(fliptets[0]); // [b,a,d,c] + for (i = 0; i < 3; i++) { + fnext(fliptets[i], fliptets[i+1]); + } + if (fliptets[3].tet == fliptets[0].tet) { + // A 3-to-2 flip is found. (No hull tet.) + flip32(fliptets, 0, fc); + flipcount++; + if (fc->remove_ndelaunay_edge) { + // Update the volume (must be decreased). + //assert(fc->tetprism_vol_sum <= 0); + tetprism_vol_sum += fc->tetprism_vol_sum; + fc->tetprism_vol_sum = 0.0; // Clear it. + } + continue; + } else { + // There are more than 3 tets at this edge. + fnext(fliptets[3], fliptets[4]); + if (fliptets[4].tet == fliptets[0].tet) { + // There are exactly 4 tets at this edge. + if (round_flag == 1) { + continue; // [2017-10-20] + } + if (nonconvex) { + if (apex(fliptets[3]) == dummypoint) { + // This edge is locally non-convex on the hull. + // It can be removed by a 4-to-4 flip. + ori = 0; + } + } // if (nonconvex) + if (ori == 0) { + // A 4-to-4 flip is found. (Two hull tets may be involved.) + // Current tets in 'fliptets': + // [0] [b,a,d,c] (d may be newpt) + // [1] [b,a,c,e] + // [2] [b,a,e,f] (f may be dummypoint) + // [3] [b,a,f,d] + esymself(fliptets[0]); // [a,b,c,d] + // A 2-to-3 flip replaces face [a,b,c] by edge [e,d]. + // This creates a degenerate tet [e,d,a,b] (tmpfliptets[0]). + // It will be removed by the followed 3-to-2 flip. + flip23(fliptets, 0, fc); // No hull tet. + fnext(fliptets[3], fliptets[1]); + fnext(fliptets[1], fliptets[2]); + // Current tets in 'fliptets': + // [0] [...] + // [1] [b,a,d,e] (degenerated, d may be new point). + // [2] [b,a,e,f] (f may be dummypoint) + // [3] [b,a,f,d] + // A 3-to-2 flip replaces edge [b,a] by face [d,e,f]. + // Hull tets may be involved (f may be dummypoint). + flip32(&(fliptets[1]), (apex(fliptets[3]) == dummypoint), fc); + flipcount++; + flip23count--; + flip32count--; + flip44count++; + if (fc->remove_ndelaunay_edge) { + // Update the volume (must be decreased). + //assert(fc->tetprism_vol_sum <= 0); + tetprism_vol_sum += fc->tetprism_vol_sum; + fc->tetprism_vol_sum = 0.0; // Clear it. + } + /////// Debug + //if (checkmesh(0) > 0) { + // assert(0); + //} + continue; + } // if (ori == 0) + } + } + } // if (ori <= 0) + + // This non-Delaunay face is unflippable. Save it. + unflipqueue->newindex((void **) &bface); + bface->tt = fliptets[0]; + bface->forg = org(fliptets[0]); + bface->fdest = dest(fliptets[0]); + bface->fapex = apex(fliptets[0]); + } // if (sign < 0) + } // while (flipstack) + + if (b->verbose > 2) { + if (flipcount > 0) { + printf(" Performed %ld flips.\n", flipcount); + } + } + // Accumulate the counter of flips. + totalcount += flipcount; + + // Return if no unflippable faces left. + if (unflipqueue->objects == 0l) break; + // Return if no flip has been performed. + if (flipcount == 0l) break; + + // Try to flip the unflippable faces. + for (i = 0; i < unflipqueue->objects; i++) { + bface = (badface *) fastlookup(unflipqueue, i); + if (!isdeadtet(bface->tt) && + (org(bface->tt) == bface->forg) && + (dest(bface->tt) == bface->fdest) && + (apex(bface->tt) == bface->fapex)) { + flippush(flipstack, &(bface->tt)); + } + } + unflipqueue->restart(); + + } // while (1) + + if (b->verbose > 2) { + if (totalcount > 0) { + printf(" Performed %ld flips.\n", totalcount); + } + if (sliver_peels > 0) { + printf(" Removed %ld hull slivers.\n", sliver_peels); + } + if (unflipqueue->objects > 0l) { + printf(" %ld unflippable edges remained.\n", unflipqueue->objects); + } + } + + return totalcount + sliver_peels; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// recoverdelaunay() Recovery the locally Delaunay property. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::recoverdelaunay() +{ + arraypool *flipqueue, *nextflipqueue, *swapqueue; + triface tetloop, neightet, *parytet; + badface *bface, *parybface; + point *ppt; + flipconstraints fc; + int i, j; + + if (!b->quiet) { + printf("Recovering Delaunayness...\n"); + } + + tetprism_vol_sum = 0.0; // Initialize it. + + // Put all interior faces of the mesh into 'flipstack'. + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != NULL) { + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + decode(tetloop.tet[tetloop.ver], neightet); + if (!facemarked(neightet)) { + flippush(flipstack, &tetloop); + } + } + ppt = (point *) &(tetloop.tet[4]); + tetprism_vol_sum += tetprismvol(ppt[0], ppt[1], ppt[2], ppt[3]); + tetloop.tet = tetrahedrontraverse(); + } + + // Calulate a relatively lower bound for small improvement. + // Used to avoid rounding error in volume calculation. + fc.bak_tetprism_vol = tetprism_vol_sum * b->epsilon * 1e-3; + + if (b->verbose) { + printf(" Initial obj = %.17g\n", tetprism_vol_sum); + } + + if (b->verbose > 1) { + printf(" Recover Delaunay [Lawson] : %ld\n", flippool->items); + } + + // First only use the basic Lawson's flip. + fc.remove_ndelaunay_edge = 1; + fc.enqflag = 2; + + lawsonflip3d(&fc); + + if (b->verbose > 1) { + printf(" obj (after Lawson) = %.17g\n", tetprism_vol_sum); + } + + if (unflipqueue->objects == 0l) { + return; // The mesh is Delaunay. + } + + fc.unflip = 1; // Unflip if the edge is not flipped. + fc.collectnewtets = 1; // new tets are returned in 'cavetetlist'. + fc.enqflag = 0; + + autofliplinklevel = 1; // Init level. + b->fliplinklevel = -1; // No fixed level. + + // For efficiency reason, we limit the maximium size of the edge star. + int bakmaxflipstarsize = b->flipstarsize; + b->flipstarsize = 10; // default + + flipqueue = new arraypool(sizeof(badface), 10); + nextflipqueue = new arraypool(sizeof(badface), 10); + + // Swap the two flip queues. + swapqueue = flipqueue; + flipqueue = unflipqueue; + unflipqueue = swapqueue; + + while (flipqueue->objects > 0l) { + + if (b->verbose > 1) { + printf(" Recover Delaunay [level = %2d] #: %ld.\n", + autofliplinklevel, flipqueue->objects); + } + + for (i = 0; i < flipqueue->objects; i++) { + bface = (badface *) fastlookup(flipqueue, i); + if (getedge(bface->forg, bface->fdest, &bface->tt)) { + if (removeedgebyflips(&(bface->tt), &fc) == 2) { + tetprism_vol_sum += fc.tetprism_vol_sum; + fc.tetprism_vol_sum = 0.0; // Clear it. + // Queue new faces for flips. + for (j = 0; j < cavetetlist->objects; j++) { + parytet = (triface *) fastlookup(cavetetlist, j); + // A queued new tet may be dead. + if (!isdeadtet(*parytet)) { + for (parytet->ver = 0; parytet->ver < 4; parytet->ver++) { + // Avoid queue a face twice. + decode(parytet->tet[parytet->ver], neightet); + if (!facemarked(neightet)) { + flippush(flipstack, parytet); + } + } // parytet->ver + } + } // j + cavetetlist->restart(); + // Remove locally non-Delaunay faces. New non-Delaunay edges + // may be found. They are saved in 'unflipqueue'. + fc.enqflag = 2; + lawsonflip3d(&fc); + fc.enqflag = 0; + // There may be unflipable faces. Add them in flipqueue. + for (j = 0; j < unflipqueue->objects; j++) { + bface = (badface *) fastlookup(unflipqueue, j); + flipqueue->newindex((void **) &parybface); + *parybface = *bface; + } + unflipqueue->restart(); + } else { + // Unable to remove this edge. Save it. + nextflipqueue->newindex((void **) &parybface); + *parybface = *bface; + // Normally, it should be zero. + //assert(fc.tetprism_vol_sum == 0.0); + // However, due to rounding errors, a tiny value may appear. + fc.tetprism_vol_sum = 0.0; + } + } + } // i + + if (b->verbose > 1) { + printf(" obj (after level %d) = %.17g.\n", autofliplinklevel, + tetprism_vol_sum); + } + flipqueue->restart(); + + // Swap the two flip queues. + swapqueue = flipqueue; + flipqueue = nextflipqueue; + nextflipqueue = swapqueue; + + if (flipqueue->objects > 0l) { + // default 'b->delmaxfliplevel' is 1. + if (autofliplinklevel >= b->delmaxfliplevel) { + // For efficiency reason, we do not search too far. + break; + } + autofliplinklevel+=b->fliplinklevelinc; + } + } // while (flipqueue->objects > 0l) + + if (flipqueue->objects > 0l) { + if (b->verbose > 1) { + printf(" %ld non-Delaunay edges remained.\n", flipqueue->objects); + } + } + + if (b->verbose) { + printf(" Final obj = %.17g\n", tetprism_vol_sum); + } + + b->flipstarsize = bakmaxflipstarsize; + delete flipqueue; + delete nextflipqueue; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// gettetrahedron() Get a tetrahedron which have the given vertices. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::gettetrahedron(point pa, point pb, point pc, point pd, + triface *searchtet) +{ + triface spintet; + int t1ver; + + if (getedge(pa, pb, searchtet)) { + spintet = *searchtet; + while (1) { + if (apex(spintet) == pc) { + *searchtet = spintet; + break; + } + fnextself(spintet); + if (spintet.tet == searchtet->tet) break; + } + if (apex(*searchtet) == pc) { + if (oppo(*searchtet) == pd) { + return 1; + } else { + fsymself(*searchtet); + if (oppo(*searchtet) == pd) { + return 1; + } + } + } + } + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// improvequalitybyflips() Improve the mesh quality by flips. // +// // +/////////////////////////////////////////////////////////////////////////////// + +long tetgenmesh::improvequalitybyflips() +{ + arraypool *flipqueue, *nextflipqueue, *swapqueue; + badface *bface, *parybface; + triface *parytet; + point *ppt; + flipconstraints fc; + REAL *cosdd, ncosdd[6], maxdd; + long totalremcount, remcount; + int remflag; + int n, i, j, k; + + //assert(unflipqueue->objects > 0l); + flipqueue = new arraypool(sizeof(badface), 10); + nextflipqueue = new arraypool(sizeof(badface), 10); + + // Backup flip edge options. + int bakautofliplinklevel = autofliplinklevel; + int bakfliplinklevel = b->fliplinklevel; + int bakmaxflipstarsize = b->flipstarsize; + + // Set flip edge options. + autofliplinklevel = 1; + b->fliplinklevel = -1; + b->flipstarsize = 10; // b->optmaxflipstarsize; + + fc.remove_large_angle = 1; + fc.unflip = 1; + fc.collectnewtets = 1; + fc.checkflipeligibility = 1; + + totalremcount = 0l; + + // Swap the two flip queues. + swapqueue = flipqueue; + flipqueue = unflipqueue; + unflipqueue = swapqueue; + + while (flipqueue->objects > 0l) { + + remcount = 0l; + + while (flipqueue->objects > 0l) { + if (b->verbose > 1) { + printf(" Improving mesh qualiy by flips [%d]#: %ld.\n", + autofliplinklevel, flipqueue->objects); + } + + for (k = 0; k < flipqueue->objects; k++) { + bface = (badface *) fastlookup(flipqueue, k); + if (gettetrahedron(bface->forg, bface->fdest, bface->fapex, + bface->foppo, &bface->tt)) { + //assert(!ishulltet(bface->tt)); + // There are bad dihedral angles in this tet. + if (bface->tt.ver != 11) { + // The dihedral angles are permuted. + // Here we simply re-compute them. Slow!!. + ppt = (point *) & (bface->tt.tet[4]); + tetalldihedral(ppt[0], ppt[1], ppt[2], ppt[3], bface->cent, + &bface->key, NULL); + bface->forg = ppt[0]; + bface->fdest = ppt[1]; + bface->fapex = ppt[2]; + bface->foppo = ppt[3]; + bface->tt.ver = 11; + } + if (bface->key == 0) { + // Re-comput the quality values. Due to smoothing operations. + ppt = (point *) & (bface->tt.tet[4]); + tetalldihedral(ppt[0], ppt[1], ppt[2], ppt[3], bface->cent, + &bface->key, NULL); + } + cosdd = bface->cent; + remflag = 0; + for (i = 0; (i < 6) && !remflag; i++) { + if (cosdd[i] < cosmaxdihed) { + // Found a large dihedral angle. + bface->tt.ver = edge2ver[i]; // Go to the edge. + fc.cosdihed_in = cosdd[i]; + fc.cosdihed_out = 0.0; // 90 degree. + n = removeedgebyflips(&(bface->tt), &fc); + if (n == 2) { + // Edge is flipped. + remflag = 1; + if (fc.cosdihed_out < cosmaxdihed) { + // Queue new bad tets for further improvements. + for (j = 0; j < cavetetlist->objects; j++) { + parytet = (triface *) fastlookup(cavetetlist, j); + if (!isdeadtet(*parytet)) { + ppt = (point *) & (parytet->tet[4]); + // Do not test a hull tet. + if (ppt[3] != dummypoint) { + tetalldihedral(ppt[0], ppt[1], ppt[2], ppt[3], ncosdd, + &maxdd, NULL); + if (maxdd < cosmaxdihed) { + // There are bad dihedral angles in this tet. + nextflipqueue->newindex((void **) &parybface); + parybface->tt.tet = parytet->tet; + parybface->tt.ver = 11; + parybface->forg = ppt[0]; + parybface->fdest = ppt[1]; + parybface->fapex = ppt[2]; + parybface->foppo = ppt[3]; + parybface->key = maxdd; + for (n = 0; n < 6; n++) { + parybface->cent[n] = ncosdd[n]; + } + } + } // if (ppt[3] != dummypoint) + } + } // j + } // if (fc.cosdihed_out < cosmaxdihed) + cavetetlist->restart(); + remcount++; + } + } + } // i + if (!remflag) { + // An unremoved bad tet. Queue it again. + unflipqueue->newindex((void **) &parybface); + *parybface = *bface; + } + } // if (gettetrahedron(...)) + } // k + + flipqueue->restart(); + + // Swap the two flip queues. + swapqueue = flipqueue; + flipqueue = nextflipqueue; + nextflipqueue = swapqueue; + } // while (flipqueues->objects > 0) + + if (b->verbose > 1) { + printf(" Removed %ld bad tets.\n", remcount); + } + totalremcount += remcount; + + if (unflipqueue->objects > 0l) { + //if (autofliplinklevel >= b->optmaxfliplevel) { + if (autofliplinklevel >= b->optlevel) { + break; + } + autofliplinklevel+=b->fliplinklevelinc; + //b->flipstarsize = 10 + (1 << (b->optlevel - 1)); + } + + // Swap the two flip queues. + swapqueue = flipqueue; + flipqueue = unflipqueue; + unflipqueue = swapqueue; + } // while (flipqueues->objects > 0) + + // Restore original flip edge options. + autofliplinklevel = bakautofliplinklevel; + b->fliplinklevel = bakfliplinklevel; + b->flipstarsize = bakmaxflipstarsize; + + delete flipqueue; + delete nextflipqueue; + + return totalremcount; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// smoothpoint() Moving a vertex to improve the mesh quality. // +// // +// 'smtpt' (p) is a point to be smoothed. Generally, it is a Steiner point. // +// It may be not a vertex of the mesh. // +// // +// This routine tries to move 'p' inside its star until a selected objective // +// function over all tetrahedra in the star is improved. The function may be // +// the some quality measures, i.e., aspect ratio, maximum dihedral angel, or // +// simply the volume of the tetrahedra. // +// // +// 'linkfacelist' contains the list of link faces of 'p'. Since a link face // +// has two orientations, ccw or cw, with respect to 'p'. 'ccw' indicates // +// the orientation is ccw (1) or not (0). // +// // +// 'opm' is a structure contains the parameters of the objective function. // +// It is needed by the evaluation of the function value. // +// // +// The return value indicates weather the point is smoothed or not. // +// // +// ASSUMPTION: This routine assumes that all link faces are true faces, i.e, // +// no face has 'dummypoint' as its vertex. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::smoothpoint(point smtpt, arraypool *linkfacelist, int ccw, + optparameters *opm) +{ + triface *parytet, *parytet1, swaptet; + point pa, pb, pc; + REAL fcent[3], startpt[3], nextpt[3], bestpt[3]; + REAL oldval, minval = 0.0, val; + REAL maxcosd; // oldang, newang; + REAL ori, diff; + int numdirs, iter; + int i, j, k; + + // Decide the number of moving directions. + numdirs = (int) linkfacelist->objects; + if (numdirs > opm->numofsearchdirs) { + numdirs = opm->numofsearchdirs; // Maximum search directions. + } + + // Set the initial value. + opm->imprval = opm->initval; + iter = 0; + + for (i = 0; i < 3; i++) { + bestpt[i] = startpt[i] = smtpt[i]; + } + + // Iterate until the obj function is not improved. + while (1) { + + // Find the best next location. + oldval = opm->imprval; + + for (i = 0; i < numdirs; i++) { + // Randomly pick a link face (0 <= k <= objects - i - 1). + k = (int) randomnation(linkfacelist->objects - i); + parytet = (triface *) fastlookup(linkfacelist, k); + // Calculate a new position from 'p' to the center of this face. + pa = org(*parytet); + pb = dest(*parytet); + pc = apex(*parytet); + for (j = 0; j < 3; j++) { + fcent[j] = (pa[j] + pb[j] + pc[j]) / 3.0; + } + for (j = 0; j < 3; j++) { + nextpt[j] = startpt[j] + opm->searchstep * (fcent[j] - startpt[j]); + } + // Calculate the largest minimum function value for the new location. + for (j = 0; j < linkfacelist->objects; j++) { + parytet = (triface *) fastlookup(linkfacelist, j); + if (ccw) { + pa = org(*parytet); + pb = dest(*parytet); + } else { + pb = org(*parytet); + pa = dest(*parytet); + } + pc = apex(*parytet); + ori = orient3d(pa, pb, pc, nextpt); + if (ori < 0.0) { + // Calcuate the objective function value. + if (opm->max_min_volume) { + //val = -ori; + val = - orient3dfast(pa, pb, pc, nextpt); + } else if (opm->min_max_aspectratio) { + val = 1.0 / tetaspectratio(pa, pb, pc, nextpt); + } else if (opm->min_max_dihedangle) { + tetalldihedral(pa, pb, pc, nextpt, NULL, &maxcosd, NULL); + if (maxcosd < -1) maxcosd = -1.0; // Rounding. + val = maxcosd + 1.0; // Make it be positive. + } else { + // Unknown objective function. + val = 0.0; + } + } else { // ori >= 0.0; + // An invalid new tet. + // This may happen if the mesh contains inverted elements. + if (opm->max_min_volume) { + //val = -ori; + val = - orient3dfast(pa, pb, pc, nextpt); + } else { + // Discard this point. + break; // j + } + } // if (ori >= 0.0) + // Stop looping when the object value is not improved. + if (val <= opm->imprval) { + break; // j + } else { + // Remember the smallest improved value. + if (j == 0) { + minval = val; + } else { + minval = (val < minval) ? val : minval; + } + } + } // j + if (j == linkfacelist->objects) { + // The function value has been improved. + opm->imprval = minval; + // Save the new location of the point. + for (j = 0; j < 3; j++) bestpt[j] = nextpt[j]; + } + // Swap k-th and (object-i-1)-th entries. + j = linkfacelist->objects - i - 1; + parytet = (triface *) fastlookup(linkfacelist, k); + parytet1 = (triface *) fastlookup(linkfacelist, j); + swaptet = *parytet1; + *parytet1 = *parytet; + *parytet = swaptet; + } // i + + diff = opm->imprval - oldval; + if (diff > 0.0) { + // Is the function value improved effectively? + if (opm->max_min_volume) { + //if ((diff / oldval) < b->epsilon) diff = 0.0; + } else if (opm->min_max_aspectratio) { + if ((diff / oldval) < 1e-3) diff = 0.0; + } else if (opm->min_max_dihedangle) { + //oldang = acos(oldval - 1.0); + //newang = acos(opm->imprval - 1.0); + //if ((oldang - newang) < 0.00174) diff = 0.0; // about 0.1 degree. + } else { + // Unknown objective function. + terminatetetgen(this, 2); + } + } + + if (diff > 0.0) { + // Yes, move p to the new location and continue. + for (j = 0; j < 3; j++) startpt[j] = bestpt[j]; + iter++; + if ((opm->maxiter > 0) && (iter >= opm->maxiter)) { + // Maximum smoothing iterations reached. + break; + } + } else { + break; + } + + } // while (1) + + if (iter > 0) { + // The point has been smoothed. + opm->smthiter = iter; // Remember the number of iterations. + // The point has been smoothed. Update it to its new position. + for (i = 0; i < 3; i++) smtpt[i] = startpt[i]; + } + + return iter; +} + + +/////////////////////////////////////////////////////////////////////////////// +// // +// improvequalitysmoothing() Improve mesh quality by smoothing. // +// // +/////////////////////////////////////////////////////////////////////////////// + +long tetgenmesh::improvequalitybysmoothing(optparameters *opm) +{ + arraypool *flipqueue, *swapqueue; + triface *parytet; + badface *bface, *parybface; + point *ppt; + long totalsmtcount, smtcount; + int smtflag; + int iter, i, j, k; + + //assert(unflipqueue->objects > 0l); + flipqueue = new arraypool(sizeof(badface), 10); + + // Swap the two flip queues. + swapqueue = flipqueue; + flipqueue = unflipqueue; + unflipqueue = swapqueue; + + totalsmtcount = 0l; + iter = 0; + + while (flipqueue->objects > 0l) { + + smtcount = 0l; + + if (b->verbose > 1) { + printf(" Improving mesh quality by smoothing [%d]#: %ld.\n", + iter, flipqueue->objects); + } + + for (k = 0; k < flipqueue->objects; k++) { + bface = (badface *) fastlookup(flipqueue, k); + if (gettetrahedron(bface->forg, bface->fdest, bface->fapex, + bface->foppo, &bface->tt)) { + // Operate on it if it is not in 'unflipqueue'. + if (!marktested(bface->tt)) { + // Here we simply re-compute the quality. Since other smoothing + // operation may have moved the vertices of this tet. + ppt = (point *) & (bface->tt.tet[4]); + tetalldihedral(ppt[0], ppt[1], ppt[2], ppt[3], bface->cent, + &bface->key, NULL); + if (bface->key < cossmtdihed) { // if (maxdd < cosslidihed) { + // It is a sliver. Try to smooth its vertices. + smtflag = 0; + opm->initval = bface->key + 1.0; + for (i = 0; (i < 4) && !smtflag; i++) { + if (pointtype(ppt[i]) == FREEVOLVERTEX) { + getvertexstar(1, ppt[i], cavetetlist, NULL, NULL); + opm->searchstep = 0.001; // Search step size + smtflag = smoothpoint(ppt[i], cavetetlist, 1, opm); + if (smtflag) { + while (opm->smthiter == opm->maxiter) { + opm->searchstep *= 10.0; // Increase the step size. + opm->initval = opm->imprval; + opm->smthiter = 0; // reset + smoothpoint(ppt[i], cavetetlist, 1, opm); + } + // This tet is modifed. + smtcount++; + if ((opm->imprval - 1.0) < cossmtdihed) { + // There are slivers in new tets. Queue them. + for (j = 0; j < cavetetlist->objects; j++) { + parytet = (triface *) fastlookup(cavetetlist, j); + // Operate it if it is not in 'unflipqueue'. + if (!marktested(*parytet)) { + // Evaluate its quality. + // Re-use ppt, bface->key, bface->cent. + ppt = (point *) & (parytet->tet[4]); + tetalldihedral(ppt[0], ppt[1], ppt[2], ppt[3], + bface->cent, &bface->key, NULL); + if (bface->key < cossmtdihed) { + // A new sliver. Queue it. + marktest(*parytet); // It is in unflipqueue. + unflipqueue->newindex((void **) &parybface); + parybface->tt = *parytet; + parybface->forg = ppt[0]; + parybface->fdest = ppt[1]; + parybface->fapex = ppt[2]; + parybface->foppo = ppt[3]; + parybface->tt.ver = 11; + parybface->key = 0.0; + } + } + } // j + } // if ((opm->imprval - 1.0) < cossmtdihed) + } // if (smtflag) + cavetetlist->restart(); + } // if (pointtype(ppt[i]) == FREEVOLVERTEX) + } // i + if (!smtflag) { + // Didn't smooth. Queue it again. + marktest(bface->tt); // It is in unflipqueue. + unflipqueue->newindex((void **) &parybface); + parybface->tt = bface->tt; + parybface->forg = ppt[0]; + parybface->fdest = ppt[1]; + parybface->fapex = ppt[2]; + parybface->foppo = ppt[3]; + parybface->tt.ver = 11; + parybface->key = 0.0; + } + } // if (maxdd < cosslidihed) + } // if (!marktested(...)) + } // if (gettetrahedron(...)) + } // k + + flipqueue->restart(); + + // Unmark the tets in unflipqueue. + for (i = 0; i < unflipqueue->objects; i++) { + bface = (badface *) fastlookup(unflipqueue, i); + unmarktest(bface->tt); + } + + if (b->verbose > 1) { + printf(" Smooth %ld points.\n", smtcount); + } + totalsmtcount += smtcount; + + if (smtcount == 0l) { + // No point has been smoothed. + break; + } else { + iter++; + if (iter == 2) { //if (iter >= b->optpasses) { + break; + } + } + + // Swap the two flip queues. + swapqueue = flipqueue; + flipqueue = unflipqueue; + unflipqueue = swapqueue; + } // while + + delete flipqueue; + + return totalsmtcount; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// splitsliver() Split a sliver. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::splitsliver(triface *slitet, REAL cosd, int chkencflag) +{ + triface *abtets; + triface searchtet, spintet, *parytet; + point pa, pb, steinerpt; + optparameters opm; + insertvertexflags ivf; + REAL smtpt[3], midpt[3]; + int success; + int t1ver; + int n, i; + + // 'slitet' is [c,d,a,b], where [c,d] has a big dihedral angle. + // Go to the opposite edge [a,b]. + edestoppo(*slitet, searchtet); // [a,b,c,d]. + + // Do not split a segment. + if (issubseg(searchtet)) { + return 0; + } + + // Count the number of tets shared at [a,b]. + // Do not split it if it is a hull edge. + spintet = searchtet; + n = 0; + while (1) { + if (ishulltet(spintet)) break; + n++; + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + if (ishulltet(spintet)) { + return 0; // It is a hull edge. + } + + // Get all tets at edge [a,b]. + abtets = new triface[n]; + spintet = searchtet; + for (i = 0; i < n; i++) { + abtets[i] = spintet; + fnextself(spintet); + } + + // Initialize the list of 2n boundary faces. + for (i = 0; i < n; i++) { + eprev(abtets[i], searchtet); + esymself(searchtet); // [a,p_i,p_i+1]. + cavetetlist->newindex((void **) &parytet); + *parytet = searchtet; + enext(abtets[i], searchtet); + esymself(searchtet); // [p_i,b,p_i+1]. + cavetetlist->newindex((void **) &parytet); + *parytet = searchtet; + } + + // Init the Steiner point at the midpoint of edge [a,b]. + pa = org(abtets[0]); + pb = dest(abtets[0]); + for (i = 0; i < 3; i++) { + smtpt[i] = midpt[i] = 0.5 * (pa[i] + pb[i]); + } + + // Point smooth options. + opm.min_max_dihedangle = 1; + opm.initval = cosd + 1.0; // Initial volume is zero. + opm.numofsearchdirs = 20; + opm.searchstep = 0.001; + opm.maxiter = 100; // Limit the maximum iterations. + + success = smoothpoint(smtpt, cavetetlist, 1, &opm); + + if (success) { + while (opm.smthiter == opm.maxiter) { + // It was relocated and the prescribed maximum iteration reached. + // Try to increase the search stepsize. + opm.searchstep *= 10.0; + //opm.maxiter = 100; // Limit the maximum iterations. + opm.initval = opm.imprval; + opm.smthiter = 0; // Init. + smoothpoint(smtpt, cavetetlist, 1, &opm); + } + } // if (success) + + cavetetlist->restart(); + + if (!success) { + delete [] abtets; + return 0; + } + + + // Insert the Steiner point. + makepoint(&steinerpt, FREEVOLVERTEX); + for (i = 0; i < 3; i++) steinerpt[i] = smtpt[i]; + + // Insert the created Steiner point. + for (i = 0; i < n; i++) { + infect(abtets[i]); + caveoldtetlist->newindex((void **) &parytet); + *parytet = abtets[i]; + } + + searchtet = abtets[0]; // No need point location. + if (b->metric) { + locate(steinerpt, &searchtet); // For size interpolation. + } + + delete [] abtets; + + ivf.iloc = (int) INSTAR; + ivf.chkencflag = chkencflag; + ivf.assignmeshsize = b->metric; + + + if (insertpoint(steinerpt, &searchtet, NULL, NULL, &ivf)) { + // The vertex has been inserted. + st_volref_count++; + if (steinerleft > 0) steinerleft--; + return 1; + } else { + // The Steiner point is too close to an existing vertex. Reject it. + pointdealloc(steinerpt); + return 0; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// removeslivers() Remove slivers by adding Steiner points. // +// // +/////////////////////////////////////////////////////////////////////////////// + +long tetgenmesh::removeslivers(int chkencflag) +{ + arraypool *flipqueue, *swapqueue; + badface *bface, *parybface; + triface slitet, *parytet; + point *ppt; + REAL cosdd[6], maxcosd; + long totalsptcount, sptcount; + int iter, i, j, k; + + //assert(unflipqueue->objects > 0l); + flipqueue = new arraypool(sizeof(badface), 10); + + // Swap the two flip queues. + swapqueue = flipqueue; + flipqueue = unflipqueue; + unflipqueue = swapqueue; + + totalsptcount = 0l; + iter = 0; + + while ((flipqueue->objects > 0l) && (steinerleft != 0)) { + + sptcount = 0l; + + if (b->verbose > 1) { + printf(" Splitting bad quality tets [%d]#: %ld.\n", + iter, flipqueue->objects); + } + + for (k = 0; (k < flipqueue->objects) && (steinerleft != 0); k++) { + bface = (badface *) fastlookup(flipqueue, k); + if (gettetrahedron(bface->forg, bface->fdest, bface->fapex, + bface->foppo, &bface->tt)) { + if ((bface->key == 0) || (bface->tt.ver != 11)) { + // Here we need to re-compute the quality. Since other smoothing + // operation may have moved the vertices of this tet. + ppt = (point *) & (bface->tt.tet[4]); + tetalldihedral(ppt[0], ppt[1], ppt[2], ppt[3], bface->cent, + &bface->key, NULL); + } + if (bface->key < cosslidihed) { + // It is a sliver. Try to split it. + slitet.tet = bface->tt.tet; + //cosdd = bface->cent; + for (j = 0; j < 6; j++) { + if (bface->cent[j] < cosslidihed) { + // Found a large dihedral angle. + slitet.ver = edge2ver[j]; // Go to the edge. + if (splitsliver(&slitet, bface->cent[j], chkencflag)) { + sptcount++; + break; + } + } + } // j + if (j < 6) { + // A sliver is split. Queue new slivers. + badtetrahedrons->traversalinit(); + parytet = (triface *) badtetrahedrons->traverse(); + while (parytet != NULL) { + unmarktest2(*parytet); + ppt = (point *) & (parytet->tet[4]); + tetalldihedral(ppt[0], ppt[1], ppt[2], ppt[3], cosdd, + &maxcosd, NULL); + if (maxcosd < cosslidihed) { + // A new sliver. Queue it. + unflipqueue->newindex((void **) &parybface); + parybface->forg = ppt[0]; + parybface->fdest = ppt[1]; + parybface->fapex = ppt[2]; + parybface->foppo = ppt[3]; + parybface->tt.tet = parytet->tet; + parybface->tt.ver = 11; + parybface->key = maxcosd; + for (i = 0; i < 6; i++) { + parybface->cent[i] = cosdd[i]; + } + } + parytet = (triface *) badtetrahedrons->traverse(); + } + badtetrahedrons->restart(); + } else { + // Didn't split. Queue it again. + unflipqueue->newindex((void **) &parybface); + *parybface = *bface; + } // if (j == 6) + } // if (bface->key < cosslidihed) + } // if (gettetrahedron(...)) + } // k + + flipqueue->restart(); + + if (b->verbose > 1) { + printf(" Split %ld tets.\n", sptcount); + } + totalsptcount += sptcount; + + if (sptcount == 0l) { + // No point has been smoothed. + break; + } else { + iter++; + if (iter == 2) { //if (iter >= b->optpasses) { + break; + } + } + + // Swap the two flip queues. + swapqueue = flipqueue; + flipqueue = unflipqueue; + unflipqueue = swapqueue; + } // while + + delete flipqueue; + + return totalsptcount; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// optimizemesh() Optimize mesh for specified objective functions. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::optimizemesh() +{ + badface *parybface; + triface checktet; + point *ppt; + int optpasses; + optparameters opm; + REAL ncosdd[6], maxdd; + long totalremcount, remcount; + long totalsmtcount, smtcount; + long totalsptcount, sptcount; + int chkencflag; + int iter; + int n; + + if (!b->quiet) { + printf("Optimizing mesh...\n"); + } + + optpasses = ((1 << b->optlevel) - 1); + + if (b->verbose) { + printf(" Optimization level = %d.\n", b->optlevel); + printf(" Optimization scheme = %d.\n", b->optscheme); + printf(" Number of iteration = %d.\n", optpasses); + printf(" Min_Max dihed angle = %g.\n", b->optmaxdihedral); + } + + totalsmtcount = totalsptcount = totalremcount = 0l; + + cosmaxdihed = cos(b->optmaxdihedral / 180.0 * PI); + cossmtdihed = cos(b->optminsmtdihed / 180.0 * PI); + cosslidihed = cos(b->optminslidihed / 180.0 * PI); + + int attrnum = numelemattrib - 1; + + // Put all bad tetrahedra into array. + tetrahedrons->traversalinit(); + checktet.tet = tetrahedrontraverse(); + while (checktet.tet != NULL) { + if (b->convex) { // -c + // Skip this tet if it lies in the exterior. + if (elemattribute(checktet.tet, attrnum) == -1.0) { + checktet.tet = tetrahedrontraverse(); + continue; + } + } + ppt = (point *) & (checktet.tet[4]); + tetalldihedral(ppt[0], ppt[1], ppt[2], ppt[3], ncosdd, &maxdd, NULL); + if (maxdd < cosmaxdihed) { + // There are bad dihedral angles in this tet. + unflipqueue->newindex((void **) &parybface); + parybface->tt.tet = checktet.tet; + parybface->tt.ver = 11; + parybface->forg = ppt[0]; + parybface->fdest = ppt[1]; + parybface->fapex = ppt[2]; + parybface->foppo = ppt[3]; + parybface->key = maxdd; + for (n = 0; n < 6; n++) { + parybface->cent[n] = ncosdd[n]; + } + } + checktet.tet = tetrahedrontraverse(); + } + + totalremcount = improvequalitybyflips(); + + if ((unflipqueue->objects > 0l) && + ((b->optscheme & 2) || (b->optscheme & 4))) { + // The pool is only used by removeslivers(). + badtetrahedrons = new memorypool(sizeof(triface), b->tetrahedraperblock, + sizeof(void *), 0); + + // Smoothing options. + opm.min_max_dihedangle = 1; + opm.numofsearchdirs = 10; + // opm.searchstep = 0.001; + opm.maxiter = 30; // Limit the maximum iterations. + //opm.checkencflag = 4; // Queue affected tets after smoothing. + chkencflag = 4; // Queue affected tets after splitting a sliver. + iter = 0; + + while (iter < optpasses) { + smtcount = sptcount = remcount = 0l; + if (b->optscheme & 2) { + smtcount += improvequalitybysmoothing(&opm); + totalsmtcount += smtcount; + if (smtcount > 0l) { + remcount = improvequalitybyflips(); + totalremcount += remcount; + } + } + if (unflipqueue->objects > 0l) { + if (b->optscheme & 4) { + sptcount += removeslivers(chkencflag); + totalsptcount += sptcount; + if (sptcount > 0l) { + remcount = improvequalitybyflips(); + totalremcount += remcount; + } + } + } + if (unflipqueue->objects > 0l) { + if (remcount > 0l) { + iter++; + } else { + break; + } + } else { + break; + } + } // while (iter) + + delete badtetrahedrons; + badtetrahedrons = NULL; + } + + if (unflipqueue->objects > 0l) { + if (b->verbose > 1) { + printf(" %ld bad tets remained.\n", unflipqueue->objects); + } + unflipqueue->restart(); + } + + if (b->verbose) { + if (totalremcount > 0l) { + printf(" Removed %ld edges.\n", totalremcount); + } + if (totalsmtcount > 0l) { + printf(" Smoothed %ld points.\n", totalsmtcount); + } + if (totalsptcount > 0l) { + printf(" Split %ld slivers.\n", totalsptcount); + } + } +} + +//// //// +//// //// +//// optimize_cxx ///////////////////////////////////////////////////////////// + +//// meshstat_cxx ///////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// printfcomma() Print a (large) number with the 'thousands separator'. // +// // +// The following code was simply copied from "stackoverflow". // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::printfcomma(unsigned long n) +{ + unsigned long n2 = 0; + int scale = 1; + while (n >= 1000) { + n2 = n2 + scale * (n % 1000); + n /= 1000; + scale *= 1000; + } + printf ("%ld", n); + while (scale != 1) { + scale /= 1000; + n = n2 / scale; + n2 = n2 % scale; + printf (",%03ld", n); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// checkmesh() Test the mesh for topological consistency. // +// // +// If 'topoflag' is set, only check the topological connection of the mesh, // +// i.e., do not report degenerated or inverted elements. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checkmesh(int topoflag) +{ + triface tetloop, neightet, symtet; + point pa, pb, pc, pd; + REAL ori; + int horrors, i; + + if (!b->quiet) { + printf(" Checking consistency of mesh...\n"); + } + + horrors = 0; + tetloop.ver = 0; + // Run through the list of tetrahedra, checking each one. + tetrahedrons->traversalinit(); + tetloop.tet = alltetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + // Check all four faces of the tetrahedron. + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + pa = org(tetloop); + pb = dest(tetloop); + pc = apex(tetloop); + pd = oppo(tetloop); + if (tetloop.ver == 0) { // Only test for inversion once. + if (!ishulltet(tetloop)) { // Only do test if it is not a hull tet. + if (!topoflag) { + ori = orient3d(pa, pb, pc, pd); + if (ori >= 0.0) { + printf(" !! !! %s ", ori > 0.0 ? "Inverted" : "Degenerated"); + printf(" (%d, %d, %d, %d) (ori = %.17g)\n", pointmark(pa), + pointmark(pb), pointmark(pc), pointmark(pd), ori); + horrors++; + } + } + } + if (infected(tetloop)) { + // This may be a bug. Report it. + printf(" !! (%d, %d, %d, %d) is infected.\n", pointmark(pa), + pointmark(pb), pointmark(pc), pointmark(pd)); + horrors++; + } + if (marktested(tetloop)) { + // This may be a bug. Report it. + printf(" !! (%d, %d, %d, %d) is marked.\n", pointmark(pa), + pointmark(pb), pointmark(pc), pointmark(pd)); + horrors++; + } + } + if (tetloop.tet[tetloop.ver] == NULL) { + printf(" !! !! No neighbor at face (%d, %d, %d).\n", pointmark(pa), + pointmark(pb), pointmark(pc)); + horrors++; + } else { + // Find the neighboring tetrahedron on this face. + fsym(tetloop, neightet); + if (neightet.tet != NULL) { + // Check that the tetrahedron's neighbor knows it's a neighbor. + fsym(neightet, symtet); + if ((tetloop.tet != symtet.tet) || (tetloop.ver != symtet.ver)) { + printf(" !! !! Asymmetric tetra-tetra bond:\n"); + if (tetloop.tet == symtet.tet) { + printf(" (Right tetrahedron, wrong orientation)\n"); + } + printf(" First: (%d, %d, %d, %d)\n", pointmark(pa), + pointmark(pb), pointmark(pc), pointmark(pd)); + printf(" Second: (%d, %d, %d, %d)\n", pointmark(org(neightet)), + pointmark(dest(neightet)), pointmark(apex(neightet)), + pointmark(oppo(neightet))); + horrors++; + } + // Check if they have the same edge (the bond() operation). + if ((org(neightet) != pb) || (dest(neightet) != pa)) { + printf(" !! !! Wrong edge-edge bond:\n"); + printf(" First: (%d, %d, %d, %d)\n", pointmark(pa), + pointmark(pb), pointmark(pc), pointmark(pd)); + printf(" Second: (%d, %d, %d, %d)\n", pointmark(org(neightet)), + pointmark(dest(neightet)), pointmark(apex(neightet)), + pointmark(oppo(neightet))); + horrors++; + } + // Check if they have the same apex. + if (apex(neightet) != pc) { + printf(" !! !! Wrong face-face bond:\n"); + printf(" First: (%d, %d, %d, %d)\n", pointmark(pa), + pointmark(pb), pointmark(pc), pointmark(pd)); + printf(" Second: (%d, %d, %d, %d)\n", pointmark(org(neightet)), + pointmark(dest(neightet)), pointmark(apex(neightet)), + pointmark(oppo(neightet))); + horrors++; + } + // Check if they have the same opposite. + if (oppo(neightet) == pd) { + printf(" !! !! Two identical tetra:\n"); + printf(" First: (%d, %d, %d, %d)\n", pointmark(pa), + pointmark(pb), pointmark(pc), pointmark(pd)); + printf(" Second: (%d, %d, %d, %d)\n", pointmark(org(neightet)), + pointmark(dest(neightet)), pointmark(apex(neightet)), + pointmark(oppo(neightet))); + horrors++; + } + } else { + printf(" !! !! Tet-face has no neighbor (%d, %d, %d) - %d:\n", + pointmark(pa), pointmark(pb), pointmark(pc), pointmark(pd)); + horrors++; + } + } + if (facemarked(tetloop)) { + // This may be a bug. Report it. + printf(" !! tetface (%d, %d, %d) %d is marked.\n", pointmark(pa), + pointmark(pb), pointmark(pc), pointmark(pd)); + } + } + // Check the six edges of this tet. + for (i = 0; i < 6; i++) { + tetloop.ver = edge2ver[i]; + if (edgemarked(tetloop)) { + // This may be a bug. Report it. + printf(" !! tetedge (%d, %d) %d, %d is marked.\n", + pointmark(org(tetloop)), pointmark(dest(tetloop)), + pointmark(apex(tetloop)), pointmark(oppo(tetloop))); + } + } + tetloop.tet = alltetrahedrontraverse(); + } + if (horrors == 0) { + if (!b->quiet) { + printf(" In my studied opinion, the mesh appears to be consistent.\n"); + } + } else { + printf(" !! !! !! !! %d %s witnessed.\n", horrors, + horrors > 1 ? "abnormity" : "abnormities"); + } + + return horrors; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// checkshells() Test the boundary mesh for topological consistency. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checkshells() +{ + triface neightet, symtet; + face shloop, spinsh, nextsh; + face checkseg; + point pa, pb; + int bakcount; + int horrors, i; + + if (!b->quiet) { + printf(" Checking consistency of the mesh boundary...\n"); + } + horrors = 0; + + void **bakpathblock = subfaces->pathblock; + void *bakpathitem = subfaces->pathitem; + int bakpathitemsleft = subfaces->pathitemsleft; + int bakalignbytes = subfaces->alignbytes; + + subfaces->traversalinit(); + shloop.sh = shellfacetraverse(subfaces); + while (shloop.sh != NULL) { + shloop.shver = 0; + for (i = 0; i < 3; i++) { + // Check the face ring at this edge. + pa = sorg(shloop); + pb = sdest(shloop); + spinsh = shloop; + spivot(spinsh, nextsh); + bakcount = horrors; + while ((nextsh.sh != NULL) && (nextsh.sh != shloop.sh)) { + if (nextsh.sh[3] == NULL) { + printf(" !! !! Wrong subface-subface connection (Dead subface).\n"); + printf(" First: x%lx (%d, %d, %d).\n", (uintptr_t) spinsh.sh, + pointmark(sorg(spinsh)), pointmark(sdest(spinsh)), + pointmark(sapex(spinsh))); + printf(" Second: x%lx (DEAD)\n", (uintptr_t) nextsh.sh); + horrors++; + break; + } + // check if they have the same edge. + if (!(((sorg(nextsh) == pa) && (sdest(nextsh) == pb)) || + ((sorg(nextsh) == pb) && (sdest(nextsh) == pa)))) { + printf(" !! !! Wrong subface-subface connection.\n"); + printf(" First: x%lx (%d, %d, %d).\n", (uintptr_t) spinsh.sh, + pointmark(sorg(spinsh)), pointmark(sdest(spinsh)), + pointmark(sapex(spinsh))); + printf(" Scond: x%lx (%d, %d, %d).\n", (uintptr_t) nextsh.sh, + pointmark(sorg(nextsh)), pointmark(sdest(nextsh)), + pointmark(sapex(nextsh))); + horrors++; + break; + } + // Check they should not have the same apex. + if (sapex(nextsh) == sapex(spinsh)) { + printf(" !! !! Existing two duplicated subfaces.\n"); + printf(" First: x%lx (%d, %d, %d).\n", (uintptr_t) spinsh.sh, + pointmark(sorg(spinsh)), pointmark(sdest(spinsh)), + pointmark(sapex(spinsh))); + printf(" Scond: x%lx (%d, %d, %d).\n", (uintptr_t) nextsh.sh, + pointmark(sorg(nextsh)), pointmark(sdest(nextsh)), + pointmark(sapex(nextsh))); + horrors++; + break; + } + spinsh = nextsh; + spivot(spinsh, nextsh); + } + // Check subface-subseg bond. + sspivot(shloop, checkseg); + if (checkseg.sh != NULL) { + if (checkseg.sh[3] == NULL) { + printf(" !! !! Wrong subface-subseg connection (Dead subseg).\n"); + printf(" Sub: x%lx (%d, %d, %d).\n", (uintptr_t) shloop.sh, + pointmark(sorg(shloop)), pointmark(sdest(shloop)), + pointmark(sapex(shloop))); + printf(" Sub: x%lx (Dead)\n", (uintptr_t) checkseg.sh); + horrors++; + } else { + if (!(((sorg(checkseg) == pa) && (sdest(checkseg) == pb)) || + ((sorg(checkseg) == pb) && (sdest(checkseg) == pa)))) { + printf(" !! !! Wrong subface-subseg connection.\n"); + printf(" Sub: x%lx (%d, %d, %d).\n", (uintptr_t) shloop.sh, + pointmark(sorg(shloop)), pointmark(sdest(shloop)), + pointmark(sapex(shloop))); + printf(" Seg: x%lx (%d, %d).\n", (uintptr_t) checkseg.sh, + pointmark(sorg(checkseg)), pointmark(sdest(checkseg))); + horrors++; + } + } + } + if (horrors > bakcount) break; // An error detected. + senextself(shloop); + } + // Check tet-subface connection. + stpivot(shloop, neightet); + if (neightet.tet != NULL) { + if (neightet.tet[4] == NULL) { + printf(" !! !! Wrong sub-to-tet connection (Dead tet)\n"); + printf(" Sub: x%lx (%d, %d, %d).\n", (uintptr_t) shloop.sh, + pointmark(sorg(shloop)), pointmark(sdest(shloop)), + pointmark(sapex(shloop))); + printf(" Tet: x%lx (DEAD)\n", (uintptr_t) neightet.tet); + horrors++; + } else { + if (!((sorg(shloop) == org(neightet)) && + (sdest(shloop) == dest(neightet)))) { + printf(" !! !! Wrong sub-to-tet connection\n"); + printf(" Sub: x%lx (%d, %d, %d).\n", (uintptr_t) shloop.sh, + pointmark(sorg(shloop)), pointmark(sdest(shloop)), + pointmark(sapex(shloop))); + printf(" Tet: x%lx (%d, %d, %d, %d).\n", + (uintptr_t) neightet.tet, pointmark(org(neightet)), + pointmark(dest(neightet)), pointmark(apex(neightet)), + pointmark(oppo(neightet))); + horrors++; + } + tspivot(neightet, spinsh); + if (!((sorg(spinsh) == org(neightet)) && + (sdest(spinsh) == dest(neightet)))) { + printf(" !! !! Wrong tet-sub connection.\n"); + printf(" Sub: x%lx (%d, %d, %d).\n", (uintptr_t) spinsh.sh, + pointmark(sorg(spinsh)), pointmark(sdest(spinsh)), + pointmark(sapex(spinsh))); + printf(" Tet: x%lx (%d, %d, %d, %d).\n", + (uintptr_t) neightet.tet, pointmark(org(neightet)), + pointmark(dest(neightet)), pointmark(apex(neightet)), + pointmark(oppo(neightet))); + horrors++; + } + fsym(neightet, symtet); + tspivot(symtet, spinsh); + if (spinsh.sh != NULL) { + if (!((sorg(spinsh) == org(symtet)) && + (sdest(spinsh) == dest(symtet)))) { + printf(" !! !! Wrong tet-sub connection.\n"); + printf(" Sub: x%lx (%d, %d, %d).\n", (uintptr_t) spinsh.sh, + pointmark(sorg(spinsh)), pointmark(sdest(spinsh)), + pointmark(sapex(spinsh))); + printf(" Tet: x%lx (%d, %d, %d, %d).\n", + (uintptr_t) symtet.tet, pointmark(org(symtet)), + pointmark(dest(symtet)), pointmark(apex(symtet)), + pointmark(oppo(symtet))); + horrors++; + } + } else { + printf(" Warning: Broken tet-sub-tet connection.\n"); + } + } + } + if (sinfected(shloop)) { + // This may be a bug. report it. + printf(" !! A infected subface: (%d, %d, %d).\n", + pointmark(sorg(shloop)), pointmark(sdest(shloop)), + pointmark(sapex(shloop))); + } + if (smarktested(shloop)) { + // This may be a bug. report it. + printf(" !! A marked subface: (%d, %d, %d).\n", pointmark(sorg(shloop)), + pointmark(sdest(shloop)), pointmark(sapex(shloop))); + } + shloop.sh = shellfacetraverse(subfaces); + } + + if (horrors == 0) { + if (!b->quiet) { + printf(" Mesh boundaries connected correctly.\n"); + } + } else { + printf(" !! !! !! !! %d boundary connection viewed with horror.\n", + horrors); + } + + subfaces->pathblock = bakpathblock; + subfaces->pathitem = bakpathitem; + subfaces->pathitemsleft = bakpathitemsleft; + subfaces->alignbytes = bakalignbytes; + + return horrors; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// checksegments() Check the connections between tetrahedra and segments. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checksegments() +{ + triface tetloop, neightet, spintet; + shellface *segs; + face neighsh, spinsh, checksh; + face sseg, checkseg; + point pa, pb; + int miscount; + int t1ver; + int horrors, i; + + + if (!b->quiet) { + printf(" Checking tet->seg connections...\n"); + } + + horrors = 0; + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != NULL) { + // Loop the six edges of the tet. + if (tetloop.tet[8] != NULL) { + segs = (shellface *) tetloop.tet[8]; + for (i = 0; i < 6; i++) { + sdecode(segs[i], sseg); + if (sseg.sh != NULL) { + // Get the edge of the tet. + tetloop.ver = edge2ver[i]; + // Check if they are the same edge. + pa = (point) sseg.sh[3]; + pb = (point) sseg.sh[4]; + if (!(((org(tetloop) == pa) && (dest(tetloop) == pb)) || + ((org(tetloop) == pb) && (dest(tetloop) == pa)))) { + printf(" !! Wrong tet-seg connection.\n"); + printf(" Tet: x%lx (%d, %d, %d, %d) - Seg: x%lx (%d, %d).\n", + (uintptr_t) tetloop.tet, pointmark(org(tetloop)), + pointmark(dest(tetloop)), pointmark(apex(tetloop)), + pointmark(oppo(tetloop)), (uintptr_t) sseg.sh, + pointmark(pa), pointmark(pb)); + horrors++; + } else { + // Loop all tets sharing at this edge. + neightet = tetloop; + do { + tsspivot1(neightet, checkseg); + if (checkseg.sh != sseg.sh) { + printf(" !! Wrong tet->seg connection.\n"); + printf(" Tet: x%lx (%d, %d, %d, %d) - ", + (uintptr_t) neightet.tet, pointmark(org(neightet)), + pointmark(dest(neightet)), pointmark(apex(neightet)), + pointmark(oppo(neightet))); + if (checkseg.sh != NULL) { + printf("Seg x%lx (%d, %d).\n", (uintptr_t) checkseg.sh, + pointmark(sorg(checkseg)),pointmark(sdest(checkseg))); + } else { + printf("Seg: NULL.\n"); + } + horrors++; + } + fnextself(neightet); + } while (neightet.tet != tetloop.tet); + } + // Check the seg->tet pointer. + sstpivot1(sseg, neightet); + if (neightet.tet == NULL) { + printf(" !! Wrong seg->tet connection (A NULL tet).\n"); + horrors++; + } else { + if (!(((org(neightet) == pa) && (dest(neightet) == pb)) || + ((org(neightet) == pb) && (dest(neightet) == pa)))) { + printf(" !! Wrong seg->tet connection (Wrong edge).\n"); + printf(" Tet: x%lx (%d, %d, %d, %d) - Seg: x%lx (%d, %d).\n", + (uintptr_t) neightet.tet, pointmark(org(neightet)), + pointmark(dest(neightet)), pointmark(apex(neightet)), + pointmark(oppo(neightet)), (uintptr_t) sseg.sh, + pointmark(pa), pointmark(pb)); + horrors++; + } + } + } + } + } + // Loop the six edge of this tet. + neightet.tet = tetloop.tet; + for (i = 0; i < 6; i++) { + neightet.ver = edge2ver[i]; + if (edgemarked(neightet)) { + // A possible bug. Report it. + printf(" !! A marked edge: (%d, %d, %d, %d) -- x%lx %d.\n", + pointmark(org(neightet)), pointmark(dest(neightet)), + pointmark(apex(neightet)), pointmark(oppo(neightet)), + (uintptr_t) neightet.tet, neightet.ver); + // Check if all tets at the edge are marked. + spintet = neightet; + while (1) { + fnextself(spintet); + if (!edgemarked(spintet)) { + printf(" !! !! An unmarked edge (%d, %d, %d, %d) -- x%lx %d.\n", + pointmark(org(spintet)), pointmark(dest(spintet)), + pointmark(apex(spintet)), pointmark(oppo(spintet)), + (uintptr_t) spintet.tet, spintet.ver); + horrors++; + } + if (spintet.tet == neightet.tet) break; + } + } + } + tetloop.tet = tetrahedrontraverse(); + } + + if (!b->quiet) { + printf(" Checking seg->tet connections...\n"); + } + + miscount = 0; // Count the number of unrecovered segments. + subsegs->traversalinit(); + sseg.shver = 0; + sseg.sh = shellfacetraverse(subsegs); + while (sseg.sh != NULL) { + pa = sorg(sseg); + pb = sdest(sseg); + spivot(sseg, neighsh); + if (neighsh.sh != NULL) { + spinsh = neighsh; + while (1) { + // Check seg-subface bond. + if (((sorg(spinsh) == pa) && (sdest(spinsh) == pb)) || + ((sorg(spinsh) == pb) && (sdest(spinsh) == pa))) { + // Keep the same rotate direction. + //if (sorg(spinsh) != pa) { + // sesymself(spinsh); + // printf(" !! Wrong ori at subface (%d, %d, %d) -- x%lx %d\n", + // pointmark(sorg(spinsh)), pointmark(sdest(spinsh)), + // pointmark(sapex(spinsh)), (uintptr_t) spinsh.sh, + // spinsh.shver); + // horrors++; + //} + stpivot(spinsh, spintet); + if (spintet.tet != NULL) { + // Check if all tets at this segment. + while (1) { + tsspivot1(spintet, checkseg); + if (checkseg.sh == NULL) { + printf(" !! !! No seg at tet (%d, %d, %d, %d) -- x%lx %d\n", + pointmark(org(spintet)), pointmark(dest(spintet)), + pointmark(apex(spintet)), pointmark(oppo(spintet)), + (uintptr_t) spintet.tet, spintet.ver); + horrors++; + } + if (checkseg.sh != sseg.sh) { + printf(" !! !! Wrong seg (%d, %d) at tet (%d, %d, %d, %d)\n", + pointmark(sorg(checkseg)), pointmark(sdest(checkseg)), + pointmark(org(spintet)), pointmark(dest(spintet)), + pointmark(apex(spintet)), pointmark(oppo(spintet))); + horrors++; + } + fnextself(spintet); + // Stop at the next subface. + tspivot(spintet, checksh); + if (checksh.sh != NULL) break; + } // while (1) + } + } else { + printf(" !! Wrong seg-subface (%d, %d, %d) -- x%lx %d connect\n", + pointmark(sorg(spinsh)), pointmark(sdest(spinsh)), + pointmark(sapex(spinsh)), (uintptr_t) spinsh.sh, + spinsh.shver); + horrors++; + break; + } // if pa, pb + spivotself(spinsh); + if (spinsh.sh == NULL) break; // A dangling segment. + if (spinsh.sh == neighsh.sh) break; + } // while (1) + } // if (neighsh.sh != NULL) + // Count the number of "un-recovered" segments. + sstpivot1(sseg, neightet); + if (neightet.tet == NULL) { + miscount++; + } + sseg.sh = shellfacetraverse(subsegs); + } + + if (!b->quiet) { + printf(" Checking seg->seg connections...\n"); + } + + points->traversalinit(); + pa = pointtraverse(); + while (pa != NULL) { + if (pointtype(pa) == FREESEGVERTEX) { + // There should be two subsegments connected at 'pa'. + // Get a subsegment containing 'pa'. + sdecode(point2sh(pa), sseg); + if ((sseg.sh == NULL) || sseg.sh[3] == NULL) { + printf(" !! Dead point-to-seg pointer at point %d.\n", + pointmark(pa)); + horrors++; + } else { + sseg.shver = 0; + if (sorg(sseg) != pa) { + if (sdest(sseg) != pa) { + printf(" !! Wrong point-to-seg pointer at point %d.\n", + pointmark(pa)); + horrors++; + } else { + // Find the next subsegment at 'pa'. + senext(sseg, checkseg); + if ((checkseg.sh == NULL) || (checkseg.sh[3] == NULL)) { + printf(" !! Dead seg-seg connection at point %d.\n", + pointmark(pa)); + horrors++; + } else { + spivotself(checkseg); + checkseg.shver = 0; + if ((sorg(checkseg) != pa) && (sdest(checkseg) != pa)) { + printf(" !! Wrong seg-seg connection at point %d.\n", + pointmark(pa)); + horrors++; + } + } + } + } else { + // Find the previous subsegment at 'pa'. + senext2(sseg, checkseg); + if ((checkseg.sh == NULL) || (checkseg.sh[3] == NULL)) { + printf(" !! Dead seg-seg connection at point %d.\n", + pointmark(pa)); + horrors++; + } else { + spivotself(checkseg); + checkseg.shver = 0; + if ((sorg(checkseg) != pa) && (sdest(checkseg) != pa)) { + printf(" !! Wrong seg-seg connection at point %d.\n", + pointmark(pa)); + horrors++; + } + } + } + } + } + pa = pointtraverse(); + } + + if (horrors == 0) { + printf(" Segments are connected properly.\n"); + } else { + printf(" !! !! !! !! Found %d missing connections.\n", horrors); + } + if (miscount > 0) { + printf(" !! !! Found %d missing segments.\n", miscount); + } + + return horrors; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// checkdelaunay() Ensure that the mesh is (constrained) Delaunay. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checkdelaunay(int perturb) +{ + triface tetloop; + triface symtet; + face checksh; + point pa, pb, pc, pd, pe; + REAL sign; + int ndcount; // Count the non-locally Delaunay faces. + int horrors; + + if (!b->quiet) { + printf(" Checking Delaunay property of the mesh...\n"); + } + + ndcount = 0; + horrors = 0; + tetloop.ver = 0; + // Run through the list of triangles, checking each one. + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + // Check all four faces of the tetrahedron. + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + fsym(tetloop, symtet); + // Only do test if its adjoining tet is not a hull tet or its pointer + // is larger (to ensure that each pair isn't tested twice). + if (((point) symtet.tet[7] != dummypoint)&&(tetloop.tet < symtet.tet)) { + pa = org(tetloop); + pb = dest(tetloop); + pc = apex(tetloop); + pd = oppo(tetloop); + pe = oppo(symtet); + if (perturb) { + sign = insphere_s(pa, pb, pc, pd, pe); + } else { + sign = insphere(pa, pb, pc, pd, pe); + } + if (sign < 0.0) { + ndcount++; + if (checksubfaceflag) { + tspivot(tetloop, checksh); + } + if (checksh.sh == NULL) { + printf(" !! Non-locally Delaunay (%d, %d, %d) - %d, %d\n", + pointmark(pa), pointmark(pb), pointmark(pc), pointmark(pd), + pointmark(pe)); + horrors++; + } + } + } + } + tetloop.tet = tetrahedrontraverse(); + } + + if (horrors == 0) { + if (!b->quiet) { + if (ndcount > 0) { + printf(" The mesh is constrained Delaunay.\n"); + } else { + printf(" The mesh is Delaunay.\n"); + } + } + } else { + printf(" !! !! !! !! Found %d non-Delaunay faces.\n", horrors); + } + + return horrors; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// Check if the current tetrahedralization is (constrained) regular. // +// // +// The parameter 'type' determines which regularity should be checked: // +// - 0: check the Delaunay property. // +// - 1: check the Delaunay property with symbolic perturbation. // +// - 2: check the regular property, the weights are stored in p[3]. // +// - 3: check the regular property with symbolic perturbation. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checkregular(int type) +{ + triface tetloop; + triface symtet; + face checksh; + point p[5]; + REAL sign; + int ndcount; // Count the non-locally Delaunay faces. + int horrors; + + if (!b->quiet) { + printf(" Checking %s %s property of the mesh...\n", + (type & 2) == 0 ? "Delaunay" : "regular", + (type & 1) == 0 ? " " : "(s)"); + } + + // Make sure orient3d(p[1], p[0], p[2], p[3]) > 0; + // Hence if (insphere(p[1], p[0], p[2], p[3], p[4]) > 0) means that + // p[4] lies inside the circumsphere of p[1], p[0], p[2], p[3]. + // The same if orient4d(p[1], p[0], p[2], p[3], p[4]) > 0 means that + // p[4] lies below the oriented hyperplane passing through + // p[1], p[0], p[2], p[3]. + + ndcount = 0; + horrors = 0; + tetloop.ver = 0; + // Run through the list of triangles, checking each one. + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + // Check all four faces of the tetrahedron. + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + fsym(tetloop, symtet); + // Only do test if its adjoining tet is not a hull tet or its pointer + // is larger (to ensure that each pair isn't tested twice). + if (((point) symtet.tet[7] != dummypoint)&&(tetloop.tet < symtet.tet)) { + p[0] = org(tetloop); // pa + p[1] = dest(tetloop); // pb + p[2] = apex(tetloop); // pc + p[3] = oppo(tetloop); // pd + p[4] = oppo(symtet); // pe + + if (type == 0) { + sign = insphere(p[1], p[0], p[2], p[3], p[4]); + } else if (type == 1) { + sign = insphere_s(p[1], p[0], p[2], p[3], p[4]); + } else if (type == 2) { + sign = orient4d(p[1], p[0], p[2], p[3], p[4], + p[1][3], p[0][3], p[2][3], p[3][3], p[4][3]); + } else { // type == 3 + sign = orient4d_s(p[1], p[0], p[2], p[3], p[4], + p[1][3], p[0][3], p[2][3], p[3][3], p[4][3]); + } + + if (sign > 0.0) { + ndcount++; + if (checksubfaceflag) { + tspivot(tetloop, checksh); + } + if (checksh.sh == NULL) { + printf(" !! Non-locally %s (%d, %d, %d) - %d, %d\n", + (type & 2) == 0 ? "Delaunay" : "regular", + pointmark(p[0]), pointmark(p[1]), pointmark(p[2]), + pointmark(p[3]), pointmark(p[4])); + horrors++; + } + } + } + } + tetloop.tet = tetrahedrontraverse(); + } + + if (horrors == 0) { + if (!b->quiet) { + if (ndcount > 0) { + printf(" The mesh is constrained %s.\n", + (type & 2) == 0 ? "Delaunay" : "regular"); + } else { + printf(" The mesh is %s.\n", (type & 2) == 0 ? "Delaunay" : "regular"); + } + } + } else { + printf(" !! !! !! !! Found %d non-%s faces.\n", horrors, + (type & 2) == 0 ? "Delaunay" : "regular"); + } + + return horrors; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// checkconforming() Ensure that the mesh is conforming Delaunay. // +// // +// If 'flag' is 1, only check subsegments. If 'flag' is 2, check subfaces. // +// If 'flag' is 3, check both subsegments and subfaces. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checkconforming(int flag) +{ + triface searchtet, neightet, spintet; + face shloop; + face segloop; + point eorg, edest, eapex, pa, pb, pc; + REAL cent[3], radius, dist, diff, rd, len; + bool enq; + int encsubsegs, encsubfaces; + int t1ver; + int i; + + REAL A[4][4], rhs[4], D; + int indx[4]; + REAL elen[3]; + + encsubsegs = 0; + + if (flag & 1) { + if (!b->quiet) { + printf(" Checking conforming property of segments...\n"); + } + encsubsegs = 0; + + // Run through the list of subsegments, check each one. + subsegs->traversalinit(); + segloop.sh = shellfacetraverse(subsegs); + while (segloop.sh != (shellface *) NULL) { + eorg = (point) segloop.sh[3]; + edest = (point) segloop.sh[4]; + radius = 0.5 * distance(eorg, edest); + for (i = 0; i < 3; i++) cent[i] = 0.5 * (eorg[i] + edest[i]); + + enq = false; + sstpivot1(segloop, neightet); + if (neightet.tet != NULL) { + spintet = neightet; + while (1) { + eapex= apex(spintet); + if (eapex != dummypoint) { + dist = distance(eapex, cent); + diff = dist - radius; + if (fabs(diff) / radius <= b->epsilon) diff = 0.0; // Rounding. + if (diff < 0) { + enq = true; break; + } + } + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + } + if (enq) { + printf(" !! !! Non-conforming segment: (%d, %d)\n", + pointmark(eorg), pointmark(edest)); + encsubsegs++; + } + segloop.sh = shellfacetraverse(subsegs); + } + + if (encsubsegs == 0) { + if (!b->quiet) { + printf(" The segments are conforming Delaunay.\n"); + } + } else { + printf(" !! !! %d subsegments are non-conforming.\n", encsubsegs); + } + } // if (flag & 1) + + encsubfaces = 0; + + if (flag & 2) { + if (!b->quiet) { + printf(" Checking conforming property of subfaces...\n"); + } + + // Run through the list of subfaces, check each one. + subfaces->traversalinit(); + shloop.sh = shellfacetraverse(subfaces); + while (shloop.sh != (shellface *) NULL) { + pa = (point) shloop.sh[3]; + pb = (point) shloop.sh[4]; + pc = (point) shloop.sh[5]; + + // Compute the coefficient matrix A (3x3). + A[0][0] = pb[0] - pa[0]; + A[0][1] = pb[1] - pa[1]; + A[0][2] = pb[2] - pa[2]; // vector V1 (pa->pb) + A[1][0] = pc[0] - pa[0]; + A[1][1] = pc[1] - pa[1]; + A[1][2] = pc[2] - pa[2]; // vector V2 (pa->pc) + cross(A[0], A[1], A[2]); // vector V3 (V1 X V2) + + // Compute the right hand side vector b (3x1). + elen[0] = dot(A[0], A[0]); + elen[1] = dot(A[1], A[1]); + rhs[0] = 0.5 * elen[0]; + rhs[1] = 0.5 * elen[1]; + rhs[2] = 0.0; + + if (lu_decmp(A, 3, indx, &D, 0)) { + lu_solve(A, 3, indx, rhs, 0); + cent[0] = pa[0] + rhs[0]; + cent[1] = pa[1] + rhs[1]; + cent[2] = pa[2] + rhs[2]; + rd = sqrt(rhs[0] * rhs[0] + rhs[1] * rhs[1] + rhs[2] * rhs[2]); + + // Check if this subface is encroached. + for (i = 0; i < 2; i++) { + stpivot(shloop, searchtet); + if (!ishulltet(searchtet)) { + len = distance(oppo(searchtet), cent); + if ((fabs(len - rd) / rd) < b->epsilon) len = rd; // Rounding. + if (len < rd) { + printf(" !! !! Non-conforming subface: (%d, %d, %d)\n", + pointmark(pa), pointmark(pb), pointmark(pc)); + encsubfaces++; + enq = true; break; + } + } + sesymself(shloop); + } + } + shloop.sh = shellfacetraverse(subfaces); + } + + if (encsubfaces == 0) { + if (!b->quiet) { + printf(" The subfaces are conforming Delaunay.\n"); + } + } else { + printf(" !! !! %d subfaces are non-conforming.\n", encsubfaces); + } + } // if (flag & 2) + + return encsubsegs + encsubfaces; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// qualitystatistics() Print statistics about the quality of the mesh. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::qualitystatistics() +{ + triface tetloop, neightet; + point p[4]; + char sbuf[128]; + REAL radiusratiotable[12]; + REAL aspectratiotable[12]; + REAL A[4][4], rhs[4], D; + REAL V[6][3], N[4][3], H[4]; // edge-vectors, face-normals, face-heights. + REAL edgelength[6], alldihed[6], faceangle[3]; + REAL shortest, longest; + REAL smallestvolume, biggestvolume; + REAL smallestratio, biggestratio; + REAL smallestradiusratio, biggestradiusratio; // radius-edge ratio. + REAL smallestdiangle, biggestdiangle; + REAL smallestfaangle, biggestfaangle; + REAL total_tet_vol, total_tetprism_vol; + REAL tetvol, minaltitude; + REAL cirradius, minheightinv; // insradius; + REAL shortlen, longlen; + REAL tetaspect, tetradius; + REAL smalldiangle, bigdiangle; + REAL smallfaangle, bigfaangle; + unsigned long radiustable[12]; + unsigned long aspecttable[16]; + unsigned long dihedangletable[18]; + unsigned long faceangletable[18]; + int indx[4]; + int radiusindex; + int aspectindex; + int tendegree; + int i, j; + // Report the tet which has the biggest radius-edge ratio. + triface biggestradiusratiotet; + + printf("Mesh quality statistics:\n\n"); + + shortlen = longlen = 0.0; + smalldiangle = bigdiangle = 0.0; + total_tet_vol = 0.0; + total_tetprism_vol = 0.0; + + radiusratiotable[0] = 0.707; radiusratiotable[1] = 1.0; + radiusratiotable[2] = 1.1; radiusratiotable[3] = 1.2; + radiusratiotable[4] = 1.4; radiusratiotable[5] = 1.6; + radiusratiotable[6] = 1.8; radiusratiotable[7] = 2.0; + radiusratiotable[8] = 2.5; radiusratiotable[9] = 3.0; + radiusratiotable[10] = 10.0; radiusratiotable[11] = 0.0; + + aspectratiotable[0] = 1.5; aspectratiotable[1] = 2.0; + aspectratiotable[2] = 2.5; aspectratiotable[3] = 3.0; + aspectratiotable[4] = 4.0; aspectratiotable[5] = 6.0; + aspectratiotable[6] = 10.0; aspectratiotable[7] = 15.0; + aspectratiotable[8] = 25.0; aspectratiotable[9] = 50.0; + aspectratiotable[10] = 100.0; aspectratiotable[11] = 0.0; + + for (i = 0; i < 12; i++) radiustable[i] = 0l; + for (i = 0; i < 12; i++) aspecttable[i] = 0l; + for (i = 0; i < 18; i++) dihedangletable[i] = 0l; + for (i = 0; i < 18; i++) faceangletable[i] = 0l; + + minaltitude = xmax - xmin + ymax - ymin + zmax - zmin; + minaltitude = minaltitude * minaltitude; + shortest = minaltitude; + longest = 0.0; + smallestvolume = minaltitude; + biggestvolume = 0.0; + smallestratio = smallestradiusratio = 1e+16; // minaltitude; + biggestratio = biggestradiusratio = 0.0; + smallestdiangle = smallestfaangle = 180.0; + biggestdiangle = biggestfaangle = 0.0; + + + int attrnum = numelemattrib - 1; + + // Loop all elements, calculate quality parameters for each element. + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + + if (b->convex) { + // Skip tets in the exterior. + if (elemattribute(tetloop.tet, attrnum) == -1.0) { + tetloop.tet = tetrahedrontraverse(); + continue; + } + } + + // Get four vertices: p0, p1, p2, p3. + for (i = 0; i < 4; i++) p[i] = (point) tetloop.tet[4 + i]; + + // Get the tet volume. + tetvol = orient3dfast(p[1], p[0], p[2], p[3]) / 6.0; + total_tet_vol += tetvol; + total_tetprism_vol += tetprismvol(p[0], p[1], p[2], p[3]); + + // Calculate the largest and smallest volume. + if (tetvol < smallestvolume) { + smallestvolume = tetvol; + } + if (tetvol > biggestvolume) { + biggestvolume = tetvol; + } + + // Set the edge vectors: V[0], ..., V[5] + for (i = 0; i < 3; i++) V[0][i] = p[0][i] - p[3][i]; // V[0]: p3->p0. + for (i = 0; i < 3; i++) V[1][i] = p[1][i] - p[3][i]; // V[1]: p3->p1. + for (i = 0; i < 3; i++) V[2][i] = p[2][i] - p[3][i]; // V[2]: p3->p2. + for (i = 0; i < 3; i++) V[3][i] = p[1][i] - p[0][i]; // V[3]: p0->p1. + for (i = 0; i < 3; i++) V[4][i] = p[2][i] - p[1][i]; // V[4]: p1->p2. + for (i = 0; i < 3; i++) V[5][i] = p[0][i] - p[2][i]; // V[5]: p2->p0. + + // Get the squares of the edge lengths. + for (i = 0; i < 6; i++) edgelength[i] = dot(V[i], V[i]); + + // Calculate the longest and shortest edge length. + for (i = 0; i < 6; i++) { + if (i == 0) { + shortlen = longlen = edgelength[i]; + } else { + shortlen = edgelength[i] < shortlen ? edgelength[i] : shortlen; + longlen = edgelength[i] > longlen ? edgelength[i] : longlen; + } + if (edgelength[i] > longest) { + longest = edgelength[i]; + } + if (edgelength[i] < shortest) { + shortest = edgelength[i]; + } + } + + // Set the matrix A = [V[0], V[1], V[2]]^T. + for (j = 0; j < 3; j++) { + for (i = 0; i < 3; i++) A[j][i] = V[j][i]; + } + + // Decompose A just once. + if (lu_decmp(A, 3, indx, &D, 0)) { + // Get the three faces normals. + for (j = 0; j < 3; j++) { + for (i = 0; i < 3; i++) rhs[i] = 0.0; + rhs[j] = 1.0; // Positive means the inside direction + lu_solve(A, 3, indx, rhs, 0); + for (i = 0; i < 3; i++) N[j][i] = rhs[i]; + } + // Get the fourth face normal by summing up the first three. + for (i = 0; i < 3; i++) N[3][i] = - N[0][i] - N[1][i] - N[2][i]; + // Get the radius of the circumsphere. + for (i = 0; i < 3; i++) rhs[i] = 0.5 * dot(V[i], V[i]); + lu_solve(A, 3, indx, rhs, 0); + cirradius = sqrt(dot(rhs, rhs)); + // Normalize the face normals. + for (i = 0; i < 4; i++) { + // H[i] is the inverse of height of its corresponding face. + H[i] = sqrt(dot(N[i], N[i])); + for (j = 0; j < 3; j++) N[i][j] /= H[i]; + } + // Get the radius of the inscribed sphere. + // insradius = 1.0 / (H[0] + H[1] + H[2] + H[3]); + // Get the biggest H[i] (corresponding to the smallest height). + minheightinv = H[0]; + for (i = 1; i < 4; i++) { + if (H[i] > minheightinv) minheightinv = H[i]; + } + } else { + // A nearly degenerated tet. + if (tetvol <= 0.0) { + printf(" !! Warning: A %s tet (%d,%d,%d,%d).\n", + tetvol < 0 ? "inverted" : "degenerated", pointmark(p[0]), + pointmark(p[1]), pointmark(p[2]), pointmark(p[3])); + // Skip it. + tetloop.tet = tetrahedrontraverse(); + continue; + } + // Calculate the four face normals. + facenormal(p[2], p[1], p[3], N[0], 1, NULL); + facenormal(p[0], p[2], p[3], N[1], 1, NULL); + facenormal(p[1], p[0], p[3], N[2], 1, NULL); + facenormal(p[0], p[1], p[2], N[3], 1, NULL); + // Normalize the face normals. + for (i = 0; i < 4; i++) { + // H[i] is the twice of the area of the face. + H[i] = sqrt(dot(N[i], N[i])); + for (j = 0; j < 3; j++) N[i][j] /= H[i]; + } + // Get the biggest H[i] / tetvol (corresponding to the smallest height). + minheightinv = (H[0] / tetvol); + for (i = 1; i < 4; i++) { + if ((H[i] / tetvol) > minheightinv) minheightinv = (H[i] / tetvol); + } + // Let the circumradius to be the half of its longest edge length. + cirradius = 0.5 * sqrt(longlen); + } + + // Get the dihedrals (in degree) at each edges. + j = 0; + for (i = 1; i < 4; i++) { + alldihed[j] = -dot(N[0], N[i]); // Edge cd, bd, bc. + if (alldihed[j] < -1.0) alldihed[j] = -1; // Rounding. + else if (alldihed[j] > 1.0) alldihed[j] = 1; + alldihed[j] = acos(alldihed[j]) / PI * 180.0; + j++; + } + for (i = 2; i < 4; i++) { + alldihed[j] = -dot(N[1], N[i]); // Edge ad, ac. + if (alldihed[j] < -1.0) alldihed[j] = -1; // Rounding. + else if (alldihed[j] > 1.0) alldihed[j] = 1; + alldihed[j] = acos(alldihed[j]) / PI * 180.0; + j++; + } + alldihed[j] = -dot(N[2], N[3]); // Edge ab. + if (alldihed[j] < -1.0) alldihed[j] = -1; // Rounding. + else if (alldihed[j] > 1.0) alldihed[j] = 1; + alldihed[j] = acos(alldihed[j]) / PI * 180.0; + + // Calculate the largest and smallest dihedral angles. + for (i = 0; i < 6; i++) { + if (i == 0) { + smalldiangle = bigdiangle = alldihed[i]; + } else { + smalldiangle = alldihed[i] < smalldiangle ? alldihed[i] : smalldiangle; + bigdiangle = alldihed[i] > bigdiangle ? alldihed[i] : bigdiangle; + } + if (alldihed[i] < smallestdiangle) { + smallestdiangle = alldihed[i]; + } + if (alldihed[i] > biggestdiangle) { + biggestdiangle = alldihed[i]; + } + // Accumulate the corresponding number in the dihedral angle histogram. + if (alldihed[i] < 5.0) { + tendegree = 0; + } else if (alldihed[i] >= 5.0 && alldihed[i] < 10.0) { + tendegree = 1; + } else if (alldihed[i] >= 80.0 && alldihed[i] < 110.0) { + tendegree = 9; // Angles between 80 to 110 degree are in one entry. + } else if (alldihed[i] >= 170.0 && alldihed[i] < 175.0) { + tendegree = 16; + } else if (alldihed[i] >= 175.0) { + tendegree = 17; + } else { + tendegree = (int) (alldihed[i] / 10.); + if (alldihed[i] < 80.0) { + tendegree++; // In the left column. + } else { + tendegree--; // In the right column. + } + } + dihedangletable[tendegree]++; + } + + + + // Calculate the largest and smallest face angles. + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + fsym(tetloop, neightet); + // Only do the calulation once for a face. + if (((point) neightet.tet[7] == dummypoint) || + (tetloop.tet < neightet.tet)) { + p[0] = org(tetloop); + p[1] = dest(tetloop); + p[2] = apex(tetloop); + faceangle[0] = interiorangle(p[0], p[1], p[2], NULL); + faceangle[1] = interiorangle(p[1], p[2], p[0], NULL); + faceangle[2] = PI - (faceangle[0] + faceangle[1]); + // Translate angles into degrees. + for (i = 0; i < 3; i++) { + faceangle[i] = (faceangle[i] * 180.0) / PI; + } + // Calculate the largest and smallest face angles. + for (i = 0; i < 3; i++) { + if (i == 0) { + smallfaangle = bigfaangle = faceangle[i]; + } else { + smallfaangle = faceangle[i] < smallfaangle ? + faceangle[i] : smallfaangle; + bigfaangle = faceangle[i] > bigfaangle ? faceangle[i] : bigfaangle; + } + if (faceangle[i] < smallestfaangle) { + smallestfaangle = faceangle[i]; + } + if (faceangle[i] > biggestfaangle) { + biggestfaangle = faceangle[i]; + } + tendegree = (int) (faceangle[i] / 10.); + faceangletable[tendegree]++; + } + } + } + + // Calculate aspect ratio and radius-edge ratio for this element. + tetradius = cirradius / sqrt(shortlen); + if (tetradius < smallestradiusratio) { + smallestradiusratio = tetradius; + } + if (tetradius > biggestradiusratio) { + biggestradiusratio = tetradius; + biggestradiusratiotet.tet = tetloop.tet; + } + // tetaspect = sqrt(longlen) / (2.0 * insradius); + tetaspect = sqrt(longlen) * minheightinv; + // Remember the largest and smallest aspect ratio. + if (tetaspect < smallestratio) { + smallestratio = tetaspect; + } + if (tetaspect > biggestratio) { + biggestratio = tetaspect; + } + // Accumulate the corresponding number in the aspect ratio histogram. + aspectindex = 0; + while ((tetaspect > aspectratiotable[aspectindex]) && (aspectindex < 11)) { + aspectindex++; + } + aspecttable[aspectindex]++; + radiusindex = 0; + while ((tetradius > radiusratiotable[radiusindex]) && (radiusindex < 11)) { + radiusindex++; + } + radiustable[radiusindex]++; + + tetloop.tet = tetrahedrontraverse(); + } + + shortest = sqrt(shortest); + longest = sqrt(longest); + minaltitude = sqrt(minaltitude); + + printf(" Smallest volume: %16.5g | Largest volume: %16.5g\n", + smallestvolume, biggestvolume); + printf(" Shortest edge: %16.5g | Longest edge: %16.5g\n", + shortest, longest); + printf(" Smallest asp.ratio: %13.5g | Largest asp.ratio: %13.5g\n", + smallestratio, biggestratio); + sprintf(sbuf, "%.17g", biggestfaangle); + if (strlen(sbuf) > 8) { + sbuf[8] = '\0'; + } + printf(" Smallest facangle: %14.5g | Largest facangle: %s\n", + smallestfaangle, sbuf); + sprintf(sbuf, "%.17g", biggestdiangle); + if (strlen(sbuf) > 8) { + sbuf[8] = '\0'; + } + printf(" Smallest dihedral: %14.5g | Largest dihedral: %s\n\n", + smallestdiangle, sbuf); + + printf(" Aspect ratio histogram:\n"); + printf(" < %-6.6g : %8ld | %6.6g - %-6.6g : %8ld\n", + aspectratiotable[0], aspecttable[0], aspectratiotable[5], + aspectratiotable[6], aspecttable[6]); + for (i = 1; i < 5; i++) { + printf(" %6.6g - %-6.6g : %8ld | %6.6g - %-6.6g : %8ld\n", + aspectratiotable[i - 1], aspectratiotable[i], aspecttable[i], + aspectratiotable[i + 5], aspectratiotable[i + 6], + aspecttable[i + 6]); + } + printf(" %6.6g - %-6.6g : %8ld | %6.6g - : %8ld\n", + aspectratiotable[4], aspectratiotable[5], aspecttable[5], + aspectratiotable[10], aspecttable[11]); + printf(" (A tetrahedron's aspect ratio is its longest edge length"); + printf(" divided by its\n"); + printf(" smallest side height)\n\n"); + + printf(" Face angle histogram:\n"); + for (i = 0; i < 9; i++) { + printf(" %3d - %3d degrees: %8ld | %3d - %3d degrees: %8ld\n", + i * 10, i * 10 + 10, faceangletable[i], + i * 10 + 90, i * 10 + 100, faceangletable[i + 9]); + } + if (minfaceang != PI) { + printf(" Minimum input face angle is %g (degree).\n", + minfaceang / PI * 180.0); + } + printf("\n"); + + printf(" Dihedral angle histogram:\n"); + // Print the three two rows: + printf(" %3d - %2d degrees: %8ld | %3d - %3d degrees: %8ld\n", + 0, 5, dihedangletable[0], 80, 110, dihedangletable[9]); + printf(" %3d - %2d degrees: %8ld | %3d - %3d degrees: %8ld\n", + 5, 10, dihedangletable[1], 110, 120, dihedangletable[10]); + // Print the third to seventh rows. + for (i = 2; i < 7; i++) { + printf(" %3d - %2d degrees: %8ld | %3d - %3d degrees: %8ld\n", + (i - 1) * 10, (i - 1) * 10 + 10, dihedangletable[i], + (i - 1) * 10 + 110, (i - 1) * 10 + 120, dihedangletable[i + 9]); + } + // Print the last two rows. + printf(" %3d - %2d degrees: %8ld | %3d - %3d degrees: %8ld\n", + 60, 70, dihedangletable[7], 170, 175, dihedangletable[16]); + printf(" %3d - %2d degrees: %8ld | %3d - %3d degrees: %8ld\n", + 70, 80, dihedangletable[8], 175, 180, dihedangletable[17]); + if (minfacetdihed != PI) { + printf(" Minimum input dihedral angle is %g (degree).\n", + minfacetdihed / PI * 180.0); + } + printf("\n"); + + printf("\n"); +} + + +/////////////////////////////////////////////////////////////////////////////// +// // +// memorystatistics() Report the memory usage. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::memorystatistics() +{ + printf("Memory usage statistics:\n\n"); + + // Count the number of blocks of tetrahedra. + int tetblocks = 0; + tetrahedrons->pathblock = tetrahedrons->firstblock; + while (tetrahedrons->pathblock != NULL) { + tetblocks++; + tetrahedrons->pathblock = (void **) *(tetrahedrons->pathblock); + } + + // Calculate the total memory (in bytes) used by storing meshes. + unsigned long totalmeshmemory = 0l, totalt2shmemory = 0l; + totalmeshmemory = points->maxitems * points->itembytes + + tetrahedrons->maxitems * tetrahedrons->itembytes; + if (b->plc || b->refine) { + totalmeshmemory += (subfaces->maxitems * subfaces->itembytes + + subsegs->maxitems * subsegs->itembytes); + totalt2shmemory = (tet2subpool->maxitems * tet2subpool->itembytes + + tet2segpool->maxitems * tet2segpool->itembytes); + } + + unsigned long totalalgomemory = 0l; + totalalgomemory = cavetetlist->totalmemory + cavebdrylist->totalmemory + + caveoldtetlist->totalmemory + + flippool->maxitems * flippool->itembytes; + if (b->plc || b->refine) { + totalalgomemory += (subsegstack->totalmemory + subfacstack->totalmemory + + subvertstack->totalmemory + + caveshlist->totalmemory + caveshbdlist->totalmemory + + cavesegshlist->totalmemory + + cavetetshlist->totalmemory + + cavetetseglist->totalmemory + + caveencshlist->totalmemory + + caveencseglist->totalmemory + + cavetetvertlist->totalmemory + + unflipqueue->totalmemory); + } + + printf(" Maximum number of tetrahedra: %ld\n", tetrahedrons->maxitems); + printf(" Maximum number of tet blocks (blocksize = %d): %d\n", + b->tetrahedraperblock, tetblocks); + /* + if (b->plc || b->refine) { + printf(" Approximate memory for tetrahedral mesh (bytes): %ld\n", + totalmeshmemory); + + printf(" Approximate memory for extra pointers (bytes): %ld\n", + totalt2shmemory); + } else { + printf(" Approximate memory for tetrahedralization (bytes): %ld\n", + totalmeshmemory); + } + printf(" Approximate memory for algorithms (bytes): %ld\n", + totalalgomemory); + printf(" Approximate memory for working arrays (bytes): %ld\n", + totalworkmemory); + printf(" Approximate total used memory (bytes): %ld\n", + totalmeshmemory + totalt2shmemory + totalalgomemory + + totalworkmemory); + */ + if (b->plc || b->refine) { + printf(" Approximate memory for tetrahedral mesh (bytes): "); + printfcomma(totalmeshmemory); printf("\n"); + + printf(" Approximate memory for extra pointers (bytes): "); + printfcomma(totalt2shmemory); printf("\n"); + } else { + printf(" Approximate memory for tetrahedralization (bytes): "); + printfcomma(totalmeshmemory); printf("\n"); + } + printf(" Approximate memory for algorithms (bytes): "); + printfcomma(totalalgomemory); printf("\n"); + printf(" Approximate memory for working arrays (bytes): "); + printfcomma(totalworkmemory); printf("\n"); + printf(" Approximate total used memory (bytes): "); + printfcomma(totalmeshmemory + totalt2shmemory + totalalgomemory + + totalworkmemory); + printf("\n"); + + printf("\n"); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// statistics() Print all sorts of cool facts. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::statistics() +{ + long tetnumber, facenumber; + + printf("\nStatistics:\n\n"); + printf(" Input points: %d\n", in->numberofpoints); + if (b->refine) { + printf(" Input tetrahedra: %d\n", in->numberoftetrahedra); + if (in->numberoftrifaces > 0) { + printf(" Input triangles: %d\n", in->numberoftrifaces); + } + if (in->numberofedges > 0) { + printf(" Input edges: %d\n", in->numberofedges); + } + } else if (b->plc) { + printf(" Input facets: %d\n", in->numberoffacets); + printf(" Input segments: %ld\n", insegments); + if (in->numberofedges > 0) { + printf(" Input edges: %d\n", in->numberofedges); + } + printf(" Input holes: %d\n", in->numberofholes); + printf(" Input regions: %d\n", in->numberofregions); + } + + tetnumber = tetrahedrons->items - hullsize; + facenumber = (tetnumber * 4l + hullsize) / 2l; + + if (b->weighted) { // -w option + printf("\n Mesh points: %ld\n", points->items - nonregularcount); + } else { + printf("\n Mesh points: %ld\n", points->items); + } + printf(" Mesh tetrahedra: %ld\n", tetnumber); + printf(" Mesh faces: %ld\n", facenumber); + if (meshedges > 0l) { + printf(" Mesh edges: %ld\n", meshedges); + } else { + if (!nonconvex) { + long vsize = points->items - dupverts - unuverts; + if (b->weighted) vsize -= nonregularcount; + meshedges = vsize + facenumber - tetnumber - 1; + printf(" Mesh edges: %ld\n", meshedges); + } + } + + if (b->plc || b->refine) { + printf(" Mesh faces on exterior boundary: %ld\n", hullsize); + if (meshhulledges > 0l) { + printf(" Mesh edges on exterior boundary: %ld\n", meshhulledges); + } + printf(" Mesh faces on input facets: %ld\n", subfaces->items); + printf(" Mesh edges on input segments: %ld\n", subsegs->items); + if (st_facref_count > 0l) { + printf(" Steiner points on input facets: %ld\n", st_facref_count); + } + if (st_segref_count > 0l) { + printf(" Steiner points on input segments: %ld\n", st_segref_count); + } + if (st_volref_count > 0l) { + printf(" Steiner points inside domain: %ld\n", st_volref_count); + } + } else { + printf(" Convex hull faces: %ld\n", hullsize); + if (meshhulledges > 0l) { + printf(" Convex hull edges: %ld\n", meshhulledges); + } + } + if (b->weighted) { // -w option + printf(" Skipped non-regular points: %ld\n", nonregularcount); + } + printf("\n"); + + + if (b->verbose > 0) { + if (b->plc || b->refine) { // -p or -r + if (tetrahedrons->items > 0l) { + qualitystatistics(); + } + } + if (tetrahedrons->items > 0l) { + memorystatistics(); + } + } +} + +//// //// +//// //// +//// meshstat_cxx ///////////////////////////////////////////////////////////// + +//// output_cxx /////////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// jettisonnodes() Jettison unused or duplicated vertices. // +// // +// Unused points are those input points which are outside the mesh domain or // +// have no connection (isolated) to the mesh. Duplicated points exist for // +// example if the input PLC is read from a .stl mesh file (marked during the // +// Delaunay tetrahedralization step. This routine remove these points from // +// points list. All existing points are reindexed. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::jettisonnodes() +{ + point pointloop; + bool jetflag; + int oldidx, newidx; + int remcount; + + if (!b->quiet) { + printf("Jettisoning redundant points.\n"); + } + + points->traversalinit(); + pointloop = pointtraverse(); + oldidx = newidx = 0; // in->firstnumber; + remcount = 0; + while (pointloop != (point) NULL) { + jetflag = (pointtype(pointloop) == DUPLICATEDVERTEX) || + (pointtype(pointloop) == UNUSEDVERTEX); + if (jetflag) { + // It is a duplicated or unused point, delete it. + pointdealloc(pointloop); + remcount++; + } else { + // Re-index it. + setpointmark(pointloop, newidx + in->firstnumber); + if (in->pointmarkerlist != (int *) NULL) { + if (oldidx < in->numberofpoints) { + // Re-index the point marker as well. + in->pointmarkerlist[newidx] = in->pointmarkerlist[oldidx]; + } + } + newidx++; + } + oldidx++; + pointloop = pointtraverse(); + } + if (b->verbose) { + printf(" %ld duplicated vertices are removed.\n", dupverts); + printf(" %ld unused vertices are removed.\n", unuverts); + } + dupverts = 0l; + unuverts = 0l; + + // The following line ensures that dead items in the pool of nodes cannot + // be allocated for the new created nodes. This ensures that the input + // nodes will occur earlier in the output files, and have lower indices. + points->deaditemstack = (void *) NULL; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// highorder() Create extra nodes for quadratic subparametric elements. // +// // +// 'highordertable' is an array (size = numberoftetrahedra * 6) for storing // +// high-order nodes of each tetrahedron. This routine is used only when -o2 // +// switch is used. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::highorder() +{ + triface tetloop, worktet, spintet; + point *extralist, *adjextralist; + point torg, tdest, newpoint; + int highorderindex; + int t1ver; + int i, j; + + if (!b->quiet) { + printf("Adding vertices for second-order tetrahedra.\n"); + } + + // Initialize the 'highordertable'. + highordertable = new point[tetrahedrons->items * 6]; + if (highordertable == (point *) NULL) { + terminatetetgen(this, 1); + } + + // This will overwrite the slot for element markers. + highorderindex = 11; + + // The following line ensures that dead items in the pool of nodes cannot + // be allocated for the extra nodes associated with high order elements. + // This ensures that the primary nodes (at the corners of elements) will + // occur earlier in the output files, and have lower indices, than the + // extra nodes. + points->deaditemstack = (void *) NULL; + + // Assign an entry for each tetrahedron to find its extra nodes. At the + // mean while, initialize all extra nodes be NULL. + i = 0; + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + tetloop.tet[highorderindex] = (tetrahedron) &highordertable[i]; + for (j = 0; j < 6; j++) { + highordertable[i + j] = (point) NULL; + } + i += 6; + tetloop.tet = tetrahedrontraverse(); + } + + // To create a unique node on each edge. Loop over all tetrahedra, and + // look at the six edges of each tetrahedron. If the extra node in + // the tetrahedron corresponding to this edge is NULL, create a node + // for this edge, at the same time, set the new node into the extra + // node lists of all other tetrahedra sharing this edge. + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + // Get the list of extra nodes. + extralist = (point *) tetloop.tet[highorderindex]; + worktet.tet = tetloop.tet; + for (i = 0; i < 6; i++) { + if (extralist[i] == (point) NULL) { + // Go to the ith-edge. + worktet.ver = edge2ver[i]; + // Create a new point in the middle of this edge. + torg = org(worktet); + tdest = dest(worktet); + makepoint(&newpoint, FREEVOLVERTEX); + for (j = 0; j < 3 + numpointattrib; j++) { + newpoint[j] = 0.5 * (torg[j] + tdest[j]); + } + // Interpolate its metrics. + for (j = 0; j < in->numberofpointmtrs; j++) { + newpoint[pointmtrindex + j] = + 0.5 * (torg[pointmtrindex + j] + tdest[pointmtrindex + j]); + } + // Set this point into all extra node lists at this edge. + spintet = worktet; + while (1) { + if (!ishulltet(spintet)) { + adjextralist = (point *) spintet.tet[highorderindex]; + adjextralist[ver2edge[spintet.ver]] = newpoint; + } + fnextself(spintet); + if (spintet.tet == worktet.tet) break; + } + } // if (!extralist[i]) + } // i + tetloop.tet = tetrahedrontraverse(); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// indexelements() Index all tetrahedra. // +// // +// Many output functions require that the tetrahedra are indexed. This // +// routine is called when -E option is used. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::indexelements() +{ + triface worktet; + int eindex = b->zeroindex ? 0 : in->firstnumber; // firstindex; + tetrahedrons->traversalinit(); + worktet.tet = tetrahedrontraverse(); + while (worktet.tet != NULL) { + setelemindex(worktet.tet, eindex); + eindex++; + if (b->metric) { // -m option + // Update the point-to-tet map, so that every point is pointing + // to a real tet, not a fictious one. Used by .p2t file. + tetrahedron tptr = encode(worktet); + for (int i = 0; i < 4; i++) { + setpoint2tet((point) (worktet.tet[4 + i]), tptr); + } + } + worktet.tet = tetrahedrontraverse(); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// numberedges() Count the number of edges, save in "meshedges". // +// // +// This routine is called when '-p' or '-r', and '-E' options are used. The // +// total number of edges depends on the genus of the input surface mesh. // +// // +// NOTE: This routine must be called after outelements(). So all elements // +// have been indexed. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::numberedges() +{ + triface worktet, spintet; + int ishulledge; + int t1ver; + int i; + + meshedges = meshhulledges = 0l; + + tetrahedrons->traversalinit(); + worktet.tet = tetrahedrontraverse(); + while (worktet.tet != NULL) { + for (i = 0; i < 6; i++) { + worktet.ver = edge2ver[i]; + ishulledge = 0; + fnext(worktet, spintet); + do { + if (!ishulltet(spintet)) { + if (elemindex(spintet.tet) < elemindex(worktet.tet)) break; + } else { + ishulledge = 1; + } + fnextself(spintet); + } while (spintet.tet != worktet.tet); + if (spintet.tet == worktet.tet) { + meshedges++; + if (ishulledge) meshhulledges++; + } + } + infect(worktet); + worktet.tet = tetrahedrontraverse(); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outnodes() Output the points to a .node file or a tetgenio structure. // +// // +// Note: each point has already been numbered on input (the first index is // +// 'in->firstnumber'). // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outnodes(tetgenio* out) +{ + FILE *outfile = NULL; + char outnodefilename[FILENAMESIZE]; + face parentsh; + point pointloop; + int nextras, bmark, marker = 0, weightDT = 0; + int coordindex, attribindex; + int pointnumber, firstindex; + int index, i; + + if (out == (tetgenio *) NULL) { + strcpy(outnodefilename, b->outfilename); + strcat(outnodefilename, ".node"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", outnodefilename); + } else { + printf("Writing nodes.\n"); + } + } + + nextras = numpointattrib; + if (b->weighted) { // -w + if (b->weighted_param == 0) weightDT = 1; // Weighted DT. + } + + bmark = !b->nobound && in->pointmarkerlist; + + if (out == (tetgenio *) NULL) { + outfile = fopen(outnodefilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", outnodefilename); + terminatetetgen(this, 1); + } + // Number of points, number of dimensions, number of point attributes, + // and number of boundary markers (zero or one). + fprintf(outfile, "%ld %d %d %d\n", points->items, 3, nextras, bmark); + } else { + // Allocate space for 'pointlist'; + out->pointlist = new REAL[points->items * 3]; + if (out->pointlist == (REAL *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + // Allocate space for 'pointattributelist' if necessary; + if (nextras > 0) { + out->pointattributelist = new REAL[points->items * nextras]; + if (out->pointattributelist == (REAL *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + } + // Allocate space for 'pointmarkerlist' if necessary; + if (bmark) { + out->pointmarkerlist = new int[points->items]; + if (out->pointmarkerlist == (int *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + } + if (b->psc) { + out->pointparamlist = new tetgenio::pointparam[points->items]; + if (out->pointparamlist == NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + } + out->numberofpoints = points->items; + out->numberofpointattributes = nextras; + coordindex = 0; + attribindex = 0; + } + + // Determine the first index (0 or 1). + firstindex = b->zeroindex ? 0 : in->firstnumber; + + points->traversalinit(); + pointloop = pointtraverse(); + pointnumber = firstindex; // in->firstnumber; + index = 0; + while (pointloop != (point) NULL) { + if (bmark) { + // Default the vertex has a zero marker. + marker = 0; + // Is it an input vertex? + if (index < in->numberofpoints) { + // Input point's marker is directly copied to output. + marker = in->pointmarkerlist[index]; + } else { + if ((pointtype(pointloop) == FREESEGVERTEX) || + (pointtype(pointloop) == FREEFACETVERTEX)) { + sdecode(point2sh(pointloop), parentsh); + if (parentsh.sh != NULL) { + marker = shellmark(parentsh); + } + } // if (pointtype(...)) + } + } + if (out == (tetgenio *) NULL) { + // Point number, x, y and z coordinates. + fprintf(outfile, "%4d %.17g %.17g %.17g", pointnumber, + pointloop[0], pointloop[1], pointloop[2]); + for (i = 0; i < nextras; i++) { + // Write an attribute. + if ((i == 0) && weightDT) { + fprintf(outfile, " %.17g", pointloop[0] * pointloop[0] + + pointloop[1] * pointloop[1] + pointloop[2] * pointloop[2] + - pointloop[3 + i]); + } else { + fprintf(outfile, " %.17g", pointloop[3 + i]); + } + } + if (bmark) { + // Write the boundary marker. + fprintf(outfile, " %d", marker); + } + if (b->psc) { + fprintf(outfile, " %.8g %.8g %d", pointgeomuv(pointloop, 0), + pointgeomuv(pointloop, 1), pointgeomtag(pointloop)); + if (pointtype(pointloop) == RIDGEVERTEX) { + fprintf(outfile, " 0"); + } else if (pointtype(pointloop) == ACUTEVERTEX) { + fprintf(outfile, " 0"); + } else if (pointtype(pointloop) == FREESEGVERTEX) { + fprintf(outfile, " 1"); + } else if (pointtype(pointloop) == FREEFACETVERTEX) { + fprintf(outfile, " 2"); + } else if (pointtype(pointloop) == FREEVOLVERTEX) { + fprintf(outfile, " 3"); + } else { + fprintf(outfile, " -1"); // Unknown type. + } + } + fprintf(outfile, "\n"); + } else { + // X, y, and z coordinates. + out->pointlist[coordindex++] = pointloop[0]; + out->pointlist[coordindex++] = pointloop[1]; + out->pointlist[coordindex++] = pointloop[2]; + // Point attributes. + for (i = 0; i < nextras; i++) { + // Output an attribute. + if ((i == 0) && weightDT) { + out->pointattributelist[attribindex++] = + pointloop[0] * pointloop[0] + pointloop[1] * pointloop[1] + + pointloop[2] * pointloop[2] - pointloop[3 + i]; + } else { + out->pointattributelist[attribindex++] = pointloop[3 + i]; + } + } + if (bmark) { + // Output the boundary marker. + out->pointmarkerlist[index] = marker; + } + if (b->psc) { + out->pointparamlist[index].uv[0] = pointgeomuv(pointloop, 0); + out->pointparamlist[index].uv[1] = pointgeomuv(pointloop, 1); + out->pointparamlist[index].tag = pointgeomtag(pointloop); + if (pointtype(pointloop) == RIDGEVERTEX) { + out->pointparamlist[index].type = 0; + } else if (pointtype(pointloop) == ACUTEVERTEX) { + out->pointparamlist[index].type = 0; + } else if (pointtype(pointloop) == FREESEGVERTEX) { + out->pointparamlist[index].type = 1; + } else if (pointtype(pointloop) == FREEFACETVERTEX) { + out->pointparamlist[index].type = 2; + } else if (pointtype(pointloop) == FREEVOLVERTEX) { + out->pointparamlist[index].type = 3; + } else { + out->pointparamlist[index].type = -1; // Unknown type. + } + } + } + pointloop = pointtraverse(); + pointnumber++; + index++; + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outmetrics() Output the metric to a file (*.mtr) or a tetgenio obj. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outmetrics(tetgenio* out) +{ + FILE *outfile = NULL; + char outmtrfilename[FILENAMESIZE]; + point ptloop; + int mtrindex = 0; + int i; + int msize = (sizeoftensor - useinsertradius); + if (msize == 0) { + return; + } + + if (out == (tetgenio *) NULL) { + strcpy(outmtrfilename, b->outfilename); + strcat(outmtrfilename, ".mtr"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", outmtrfilename); + } else { + printf("Writing metrics.\n"); + } + } + + if (out == (tetgenio *) NULL) { + outfile = fopen(outmtrfilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", outmtrfilename); + terminatetetgen(this, 3); + } + // Number of points, number of point metrices, + fprintf(outfile, "%ld %d\n", points->items, msize); + } else { + // Allocate space for 'pointmtrlist'. + out->numberofpointmtrs = msize; + out->pointmtrlist = new REAL[points->items * msize]; + if (out->pointmtrlist == (REAL *) NULL) { + terminatetetgen(this, 1); + } + } + + points->traversalinit(); + ptloop = pointtraverse(); + while (ptloop != (point) NULL) { + if (out == (tetgenio *) NULL) { + for (i = 0; i < msize; i++) { + fprintf(outfile, " %-16.8e", ptloop[pointmtrindex + i]); + } + fprintf(outfile, "\n"); + } else { + for (i = 0; i < msize; i++) { + out->pointmtrlist[mtrindex++] = ptloop[pointmtrindex + i]; + } + } + ptloop = pointtraverse(); + } + + // Output the point-to-tet map. + if (out == (tetgenio *) NULL) { + strcpy(outmtrfilename, b->outfilename); + strcat(outmtrfilename, ".p2t"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", outmtrfilename); + } else { + printf("Writing point-to-tet map.\n"); + } + } + + if (out == (tetgenio *) NULL) { + outfile = fopen(outmtrfilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", outmtrfilename); + terminatetetgen(this, 3); + } + // Number of points, + //fprintf(outfile, "%ld\n", points->items); + } else { + // Allocate space for 'point2tetlist'. + out->point2tetlist = new int[points->items]; + if (out->point2tetlist == (int *) NULL) { + terminatetetgen(this, 1); + } + } + + // The list of tetrahedra must be indexed. + if (bgm != NULL) { + bgm->indexelements(); + } + // Determine the first index (0 or 1). + int firstindex = b->zeroindex ? 0 : in->firstnumber; + int pointindex = firstindex; + i = 0; + + triface parenttet; + points->traversalinit(); + ptloop = pointtraverse(); + while (ptloop != (point) NULL) { + if (bgm != NULL) { + bgm->decode(point2bgmtet(ptloop), parenttet); + } else { + decode(point2tet(ptloop), parenttet); + } + if (out == (tetgenio *) NULL) { + fprintf(outfile, "%d %d\n", pointindex, elemindex(parenttet.tet)); + } else { + out->point2tetlist[i] = elemindex(parenttet.tet); + } + pointindex++; + i++; + ptloop = pointtraverse(); + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outelements() Output the tetrahedra to an .ele file or a tetgenio // +// structure. // +// // +// This routine also indexes all tetrahedra (exclusing hull tets) (from in-> // +// firstnumber). The total number of mesh edges is counted in 'meshedges'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outelements(tetgenio* out) +{ + FILE *outfile = NULL; + char outelefilename[FILENAMESIZE]; + tetrahedron* tptr; + point p1, p2, p3, p4; + point *extralist; + REAL *talist = NULL; + int *tlist = NULL; + long ntets; + int firstindex, shift; + int pointindex, attribindex; + int highorderindex = 11; + int elementnumber; + int eextras; + int i; + + if (out == (tetgenio *) NULL) { + strcpy(outelefilename, b->outfilename); + strcat(outelefilename, ".ele"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", outelefilename); + } else { + printf("Writing elements.\n"); + } + } + + // The number of tets excluding hull tets. + ntets = tetrahedrons->items - hullsize; + + eextras = numelemattrib; + if (out == (tetgenio *) NULL) { + outfile = fopen(outelefilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", outelefilename); + terminatetetgen(this, 1); + } + // Number of tetras, points per tetra, attributes per tetra. + fprintf(outfile, "%ld %d %d\n", ntets, b->order == 1 ? 4 : 10, eextras); + } else { + // Allocate memory for output tetrahedra. + out->tetrahedronlist = new int[ntets * (b->order == 1 ? 4 : 10)]; + if (out->tetrahedronlist == (int *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + // Allocate memory for output tetrahedron attributes if necessary. + if (eextras > 0) { + out->tetrahedronattributelist = new REAL[ntets * eextras]; + if (out->tetrahedronattributelist == (REAL *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + } + out->numberoftetrahedra = ntets; + out->numberofcorners = b->order == 1 ? 4 : 10; + out->numberoftetrahedronattributes = eextras; + tlist = out->tetrahedronlist; + talist = out->tetrahedronattributelist; + pointindex = 0; + attribindex = 0; + } + + // Determine the first index (0 or 1). + firstindex = b->zeroindex ? 0 : in->firstnumber; + shift = 0; // Default no shift. + if ((in->firstnumber == 1) && (firstindex == 0)) { + shift = 1; // Shift the output indices by 1. + } + + tetrahedrons->traversalinit(); + tptr = tetrahedrontraverse(); + elementnumber = firstindex; // in->firstnumber; + while (tptr != (tetrahedron *) NULL) { + if (!b->reversetetori) { + p1 = (point) tptr[4]; + p2 = (point) tptr[5]; + } else { + p1 = (point) tptr[5]; + p2 = (point) tptr[4]; + } + p3 = (point) tptr[6]; + p4 = (point) tptr[7]; + if (out == (tetgenio *) NULL) { + // Tetrahedron number, indices for four points. + fprintf(outfile, "%5d %5d %5d %5d %5d", elementnumber, + pointmark(p1) - shift, pointmark(p2) - shift, + pointmark(p3) - shift, pointmark(p4) - shift); + if (b->order == 2) { + extralist = (point *) tptr[highorderindex]; + // indices for six extra points. + fprintf(outfile, " %5d %5d %5d %5d %5d %5d", + pointmark(extralist[0]) - shift, pointmark(extralist[1]) - shift, + pointmark(extralist[2]) - shift, pointmark(extralist[3]) - shift, + pointmark(extralist[4]) - shift, pointmark(extralist[5]) - shift); + } + for (i = 0; i < eextras; i++) { + fprintf(outfile, " %.17g", elemattribute(tptr, i)); + } + fprintf(outfile, "\n"); + } else { + tlist[pointindex++] = pointmark(p1) - shift; + tlist[pointindex++] = pointmark(p2) - shift; + tlist[pointindex++] = pointmark(p3) - shift; + tlist[pointindex++] = pointmark(p4) - shift; + if (b->order == 2) { + extralist = (point *) tptr[highorderindex]; + tlist[pointindex++] = pointmark(extralist[0]) - shift; + tlist[pointindex++] = pointmark(extralist[1]) - shift; + tlist[pointindex++] = pointmark(extralist[2]) - shift; + tlist[pointindex++] = pointmark(extralist[3]) - shift; + tlist[pointindex++] = pointmark(extralist[4]) - shift; + tlist[pointindex++] = pointmark(extralist[5]) - shift; + } + for (i = 0; i < eextras; i++) { + talist[attribindex++] = elemattribute(tptr, i); + } + } + // Remember the index of this element (for counting edges). + setelemindex(tptr, elementnumber); + if (b->metric) { // -m option + // Update the point-to-tet map, so that every point is pointing + // to a real tet, not a fictious one. Used by .p2t file. + for (int i = 0; i < 4; i++) { + setpoint2tet((point) (tptr[4 + i]), (tetrahedron) tptr); + } + } + tptr = tetrahedrontraverse(); + elementnumber++; + } + + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outfaces() Output all faces to a .face file or a tetgenio object. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outfaces(tetgenio* out) +{ + FILE *outfile = NULL; + char facefilename[FILENAMESIZE]; + triface tface, tsymface; + face checkmark; + point torg, tdest, tapex; + long ntets, faces; + int *elist = NULL, *emlist = NULL; + int neigh1 = 0, neigh2 = 0; + int marker = 0; + int firstindex, shift; + int facenumber; + int index = 0; + + // For -o2 option. + triface workface; + point *extralist, pp[3] = {0,0,0}; + int highorderindex = 11; + int o2index = 0, i; + + // For -nn option. + int *tet2facelist = NULL; + int tidx; + + if (out == (tetgenio *) NULL) { + strcpy(facefilename, b->outfilename); + strcat(facefilename, ".face"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", facefilename); + } else { + printf("Writing faces.\n"); + } + } + + ntets = tetrahedrons->items - hullsize; + faces = (ntets * 4l + hullsize) / 2l; + + if (out == (tetgenio *) NULL) { + outfile = fopen(facefilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", facefilename); + terminatetetgen(this, 1); + } + fprintf(outfile, "%ld %d\n", faces, !b->nobound); + } else { + // Allocate memory for 'trifacelist'. + out->trifacelist = new int[faces * 3]; + if (out->trifacelist == (int *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + if (b->order == 2) { + out->o2facelist = new int[faces * 3]; + } + // Allocate memory for 'trifacemarkerlist' if necessary. + if (!b->nobound) { + out->trifacemarkerlist = new int[faces]; + if (out->trifacemarkerlist == (int *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + } + if (b->neighout > 1) { + // '-nn' switch. + out->face2tetlist = new int[faces * 2]; + if (out->face2tetlist == (int *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + } + out->numberoftrifaces = faces; + elist = out->trifacelist; + emlist = out->trifacemarkerlist; + } + + if (b->neighout > 1) { // -nn option + // Output the tetrahedron-to-face map. + tet2facelist = new int[ntets * 4]; + } + + // Determine the first index (0 or 1). + firstindex = b->zeroindex ? 0 : in->firstnumber; + shift = 0; // Default no shiftment. + if ((in->firstnumber == 1) && (firstindex == 0)) { + shift = 1; // Shift the output indices by 1. + } + + tetrahedrons->traversalinit(); + tface.tet = tetrahedrontraverse(); + facenumber = firstindex; // in->firstnumber; + // To loop over the set of faces, loop over all tetrahedra, and look at + // the four faces of each one. If its adjacent tet is a hull tet, + // operate on the face, otherwise, operate on the face only if the + // current tet has a smaller index than its neighbor. + while (tface.tet != (tetrahedron *) NULL) { + for (tface.ver = 0; tface.ver < 4; tface.ver ++) { + fsym(tface, tsymface); + if (ishulltet(tsymface) || + (elemindex(tface.tet) < elemindex(tsymface.tet))) { + torg = org(tface); + tdest = dest(tface); + tapex = apex(tface); + if (b->order == 2) { // -o2 + // Get the three extra vertices on edges. + extralist = (point *) (tface.tet[highorderindex]); + // The extra vertices are on edges opposite the corners. + enext(tface, workface); + for (i = 0; i < 3; i++) { + pp[i] = extralist[ver2edge[workface.ver]]; + enextself(workface); + } + } + if (!b->nobound) { + // Get the boundary marker of this face. + if (b->plc || b->refine) { + // Shell face is used. + tspivot(tface, checkmark); + if (checkmark.sh == NULL) { + marker = 0; // It is an inner face. It's marker is 0. + } else { + marker = shellmark(checkmark); + } + } else { + // Shell face is not used, only distinguish outer and inner face. + marker = (int) ishulltet(tsymface); + } + } + if (b->neighout > 1) { + // '-nn' switch. Output adjacent tets indices. + if (!ishulltet(tface)) { + neigh1 = elemindex(tface.tet); + } else { + neigh1 = -1; + } + if (!ishulltet(tsymface)) { + neigh2 = elemindex(tsymface.tet); + } else { + neigh2 = -1; + } + // Fill the tetrahedron-to-face map. + tidx = elemindex(tface.tet) - firstindex; + tet2facelist[tidx * 4 + tface.ver] = facenumber; + if (!ishulltet(tsymface)) { + tidx = elemindex(tsymface.tet) - firstindex; + tet2facelist[tidx * 4 + (tsymface.ver & 3)] = facenumber; + } + } + if (out == (tetgenio *) NULL) { + // Face number, indices of three vertices. + fprintf(outfile, "%5d %4d %4d %4d", facenumber, + pointmark(torg) - shift, pointmark(tdest) - shift, + pointmark(tapex) - shift); + if (b->order == 2) { // -o2 + fprintf(outfile, " %4d %4d %4d", pointmark(pp[0]) - shift, + pointmark(pp[1]) - shift, pointmark(pp[2]) - shift); + } + if (!b->nobound) { + // Output a boundary marker. + fprintf(outfile, " %d", marker); + } + if (b->neighout > 1) { + fprintf(outfile, " %5d %5d", neigh1, neigh2); + } + fprintf(outfile, "\n"); + } else { + // Output indices of three vertices. + elist[index++] = pointmark(torg) - shift; + elist[index++] = pointmark(tdest) - shift; + elist[index++] = pointmark(tapex) - shift; + if (b->order == 2) { // -o2 + out->o2facelist[o2index++] = pointmark(pp[0]) - shift; + out->o2facelist[o2index++] = pointmark(pp[1]) - shift; + out->o2facelist[o2index++] = pointmark(pp[2]) - shift; + } + if (!b->nobound) { + emlist[facenumber - in->firstnumber] = marker; + } + if (b->neighout > 1) { + out->face2tetlist[(facenumber - in->firstnumber) * 2] = neigh1; + out->face2tetlist[(facenumber - in->firstnumber) * 2 + 1] = neigh2; + } + } + facenumber++; + } + } + tface.tet = tetrahedrontraverse(); + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } + + if (b->neighout > 1) { // -nn option + // Output the tetrahedron-to-face map. + if (out == (tetgenio *) NULL) { + strcpy(facefilename, b->outfilename); + strcat(facefilename, ".t2f"); + } + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", facefilename); + } else { + printf("Writing tetrahedron-to-face map.\n"); + } + } + if (out == (tetgenio *) NULL) { + outfile = fopen(facefilename, "w"); + for (tidx = 0; tidx < ntets; tidx++) { + index = tidx * 4; + fprintf(outfile, "%4d %d %d %d %d\n", tidx + in->firstnumber, + tet2facelist[index], tet2facelist[index+1], + tet2facelist[index+2], tet2facelist[index+3]); + } + fclose(outfile); + delete [] tet2facelist; + } else { + // Simply copy the address of the list to the output. + out->tet2facelist = tet2facelist; + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outhullfaces() Output hull faces to a .face file or a tetgenio object. // +// // +// The normal of each face is pointing to the outside of the domain. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outhullfaces(tetgenio* out) +{ + FILE *outfile = NULL; + char facefilename[FILENAMESIZE]; + triface hulltet; + point torg, tdest, tapex; + int *elist = NULL; + int firstindex, shift; + int facenumber; + int index; + + if (out == (tetgenio *) NULL) { + strcpy(facefilename, b->outfilename); + strcat(facefilename, ".face"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", facefilename); + } else { + printf("Writing faces.\n"); + } + } + + if (out == (tetgenio *) NULL) { + outfile = fopen(facefilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", facefilename); + terminatetetgen(this, 1); + } + fprintf(outfile, "%ld 0\n", hullsize); + } else { + // Allocate memory for 'trifacelist'. + out->trifacelist = new int[hullsize * 3]; + if (out->trifacelist == (int *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + out->numberoftrifaces = hullsize; + elist = out->trifacelist; + index = 0; + } + + // Determine the first index (0 or 1). + firstindex = b->zeroindex ? 0 : in->firstnumber; + shift = 0; // Default no shiftment. + if ((in->firstnumber == 1) && (firstindex == 0)) { + shift = 1; // Shift the output indices by 1. + } + + tetrahedrons->traversalinit(); + hulltet.tet = alltetrahedrontraverse(); + facenumber = firstindex; + while (hulltet.tet != (tetrahedron *) NULL) { + if (ishulltet(hulltet)) { + torg = (point) hulltet.tet[4]; + tdest = (point) hulltet.tet[5]; + tapex = (point) hulltet.tet[6]; + if (out == (tetgenio *) NULL) { + // Face number, indices of three vertices. + fprintf(outfile, "%5d %4d %4d %4d", facenumber, + pointmark(torg) - shift, pointmark(tdest) - shift, + pointmark(tapex) - shift); + fprintf(outfile, "\n"); + } else { + // Output indices of three vertices. + elist[index++] = pointmark(torg) - shift; + elist[index++] = pointmark(tdest) - shift; + elist[index++] = pointmark(tapex) - shift; + } + facenumber++; + } + hulltet.tet = alltetrahedrontraverse(); + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outsubfaces() Output subfaces (i.e. boundary faces) to a .face file or // +// a tetgenio structure. // +// // +// The boundary faces are found in 'subfaces'. For listing triangle vertices // +// in the same sense for all triangles in the mesh, the direction determined // +// by right-hand rule is pointer to the inside of the volume. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outsubfaces(tetgenio* out) +{ + FILE *outfile = NULL; + char facefilename[FILENAMESIZE]; + int *elist = NULL; + int *emlist = NULL; + int index = 0, index1 = 0, index2 = 0; + triface abuttingtet; + face faceloop; + point torg, tdest, tapex; + int marker = 0; + int firstindex, shift; + int neigh1 = 0, neigh2 = 0; + int facenumber; + + // For -o2 option. + triface workface; + point *extralist, pp[3] = {0,0,0}; + int highorderindex = 11; + int o2index = 0, i; + + int t1ver; // used by fsymself() + + if (out == (tetgenio *) NULL) { + strcpy(facefilename, b->outfilename); + strcat(facefilename, ".face"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", facefilename); + } else { + printf("Writing faces.\n"); + } + } + + if (out == (tetgenio *) NULL) { + outfile = fopen(facefilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", facefilename); + terminatetetgen(this, 3); + } + // Number of subfaces. + fprintf(outfile, "%ld %d\n", subfaces->items, !b->nobound); + } else { + // Allocate memory for 'trifacelist'. + out->trifacelist = new int[subfaces->items * 3]; + if (out->trifacelist == (int *) NULL) { + terminatetetgen(this, 1); + } + if (b->order == 2) { + out->o2facelist = new int[subfaces->items * 3]; + } + if (!b->nobound) { + // Allocate memory for 'trifacemarkerlist'. + out->trifacemarkerlist = new int[subfaces->items]; + if (out->trifacemarkerlist == (int *) NULL) { + terminatetetgen(this, 1); + } + } + if (b->neighout > 1) { + // '-nn' switch. + out->face2tetlist = new int[subfaces->items * 2]; + if (out->face2tetlist == (int *) NULL) { + terminatetetgen(this, 1); + } + } + out->numberoftrifaces = subfaces->items; + elist = out->trifacelist; + emlist = out->trifacemarkerlist; + } + + // Determine the first index (0 or 1). + firstindex = b->zeroindex ? 0 : in->firstnumber; + shift = 0; // Default no shiftment. + if ((in->firstnumber == 1) && (firstindex == 0)) { + shift = 1; // Shift the output indices by 1. + } + + subfaces->traversalinit(); + faceloop.sh = shellfacetraverse(subfaces); + facenumber = firstindex; // in->firstnumber; + while (faceloop.sh != (shellface *) NULL) { + stpivot(faceloop, abuttingtet); + // If there is a tetrahedron containing this subface, orient it so + // that the normal of this face points to inside of the volume by + // right-hand rule. + if (abuttingtet.tet != NULL) { + if (ishulltet(abuttingtet)) { + fsymself(abuttingtet); + } + } + if (abuttingtet.tet != NULL) { + torg = org(abuttingtet); + tdest = dest(abuttingtet); + tapex = apex(abuttingtet); + if (b->order == 2) { // -o2 + // Get the three extra vertices on edges. + extralist = (point *) (abuttingtet.tet[highorderindex]); + workface = abuttingtet; + for (i = 0; i < 3; i++) { + pp[i] = extralist[ver2edge[workface.ver]]; + enextself(workface); + } + } + } else { + // This may happen when only a surface mesh be generated. + torg = sorg(faceloop); + tdest = sdest(faceloop); + tapex = sapex(faceloop); + if (b->order == 2) { // -o2 + // There is no extra node list available. + pp[0] = torg; + pp[1] = tdest; + pp[2] = tapex; + } + } + if (!b->nobound) { + marker = shellmark(faceloop); + } + if (b->neighout > 1) { + // '-nn' switch. Output adjacent tets indices. + neigh1 = -1; + neigh2 = -1; + stpivot(faceloop, abuttingtet); + if (abuttingtet.tet != NULL) { + if (!ishulltet(abuttingtet)) { + neigh1 = elemindex(abuttingtet.tet); + } + fsymself(abuttingtet); + if (!ishulltet(abuttingtet)) { + neigh2 = elemindex(abuttingtet.tet); + } + } + } + if (out == (tetgenio *) NULL) { + fprintf(outfile, "%5d %4d %4d %4d", facenumber, + pointmark(torg) - shift, pointmark(tdest) - shift, + pointmark(tapex) - shift); + if (b->order == 2) { // -o2 + fprintf(outfile, " %4d %4d %4d", pointmark(pp[0]) - shift, + pointmark(pp[1]) - shift, pointmark(pp[2]) - shift); + } + if (!b->nobound) { + fprintf(outfile, " %d", marker); + } + if (b->neighout > 1) { + fprintf(outfile, " %5d %5d", neigh1, neigh2); + } + fprintf(outfile, "\n"); + } else { + // Output three vertices of this face; + elist[index++] = pointmark(torg) - shift; + elist[index++] = pointmark(tdest) - shift; + elist[index++] = pointmark(tapex) - shift; + if (b->order == 2) { // -o2 + out->o2facelist[o2index++] = pointmark(pp[0]) - shift; + out->o2facelist[o2index++] = pointmark(pp[1]) - shift; + out->o2facelist[o2index++] = pointmark(pp[2]) - shift; + } + if (!b->nobound) { + emlist[index1++] = marker; + } + if (b->neighout > 1) { + out->face2tetlist[index2++] = neigh1; + out->face2tetlist[index2++] = neigh2; + } + } + facenumber++; + faceloop.sh = shellfacetraverse(subfaces); + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outedges() Output all edges to a .edge file or a tetgenio object. // +// // +// Note: This routine must be called after outelements(), so that the total // +// number of edges 'meshedges' has been counted. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outedges(tetgenio* out) +{ + FILE *outfile = NULL; + char edgefilename[FILENAMESIZE]; + triface tetloop, worktet, spintet; + face checkseg; + point torg, tdest; + int ishulledge; + int firstindex, shift; + int edgenumber, marker; + int index = 0, index1 = 0, index2 = 0; + int t1ver; + int i; + + // For -o2 option. + point *extralist, pp = NULL; + int highorderindex = 11; + int o2index = 0; + + // For -nn option. + int *tet2edgelist = NULL; + int tidx; + + if (out == (tetgenio *) NULL) { + strcpy(edgefilename, b->outfilename); + strcat(edgefilename, ".edge"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", edgefilename); + } else { + printf("Writing edges.\n"); + } + } + + if (meshedges == 0l) { + if (nonconvex) { + numberedges(); // Count the edges. + } else { + // Use Euler's characteristic to get the numbe of edges. + // It states V - E + F - C = 1, hence E = V + F - C - 1. + long tsize = tetrahedrons->items - hullsize; + long fsize = (tsize * 4l + hullsize) / 2l; + long vsize = points->items - dupverts - unuverts; + if (b->weighted) vsize -= nonregularcount; + meshedges = vsize + fsize - tsize - 1; + } + } + meshhulledges = 0l; // It will be counted. + + if (out == (tetgenio *) NULL) { + outfile = fopen(edgefilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", edgefilename); + terminatetetgen(this, 1); + } + // Write the number of edges, boundary markers (0 or 1). + fprintf(outfile, "%ld %d\n", meshedges, !b->nobound); + } else { + // Allocate memory for 'edgelist'. + out->numberofedges = meshedges; + out->edgelist = new int[meshedges * 2]; + if (out->edgelist == (int *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + if (b->order == 2) { // -o2 switch + out->o2edgelist = new int[meshedges]; + } + if (!b->nobound) { + out->edgemarkerlist = new int[meshedges]; + } + if (b->neighout > 1) { // '-nn' switch. + out->edge2tetlist = new int[meshedges]; + } + } + + if (b->neighout > 1) { // -nn option + // Output the tetrahedron-to-edge map. + long tsize = tetrahedrons->items - hullsize; + tet2edgelist = new int[tsize * 6]; + } + + // Determine the first index (0 or 1). + firstindex = b->zeroindex ? 0 : in->firstnumber; + shift = 0; // Default no shiftment. + if ((in->firstnumber == 1) && (firstindex == 0)) { + shift = 1; // Shift (reduce) the output indices by 1. + } + + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + edgenumber = firstindex; // in->firstnumber; + while (tetloop.tet != (tetrahedron *) NULL) { + // Count the number of Voronoi faces. + worktet.tet = tetloop.tet; + for (i = 0; i < 6; i++) { + worktet.ver = edge2ver[i]; + ishulledge = 0; + fnext(worktet, spintet); + do { + if (!ishulltet(spintet)) { + if (elemindex(spintet.tet) < elemindex(worktet.tet)) break; + } else { + ishulledge = 1; + } + fnextself(spintet); + } while (spintet.tet != worktet.tet); + if (spintet.tet == worktet.tet) { + // Found a new edge. + if (ishulledge) meshhulledges++; + torg = org(worktet); + tdest = dest(worktet); + if (b->order == 2) { // -o2 + // Get the extra vertex on this edge. + extralist = (point *) worktet.tet[highorderindex]; + pp = extralist[ver2edge[worktet.ver]]; + } + if (out == (tetgenio *) NULL) { + fprintf(outfile, "%5d %4d %4d", edgenumber, + pointmark(torg) - shift, pointmark(tdest) - shift); + if (b->order == 2) { // -o2 + fprintf(outfile, " %4d", pointmark(pp) - shift); + } + } else { + // Output three vertices of this face; + out->edgelist[index++] = pointmark(torg) - shift; + out->edgelist[index++] = pointmark(tdest) - shift; + if (b->order == 2) { // -o2 + out->o2edgelist[o2index++] = pointmark(pp) - shift; + } + } + if (!b->nobound) { + if (b->plc || b->refine) { + // Check if the edge is a segment. + tsspivot1(worktet, checkseg); + if (checkseg.sh != NULL) { + marker = shellmark(checkseg); + } else { + marker = 0; // It's not a segment. + } + } else { + // Mark it if it is a hull edge. + marker = ishulledge ? 1 : 0; + } + if (out == (tetgenio *) NULL) { + fprintf(outfile, " %d", marker); + } else { + out->edgemarkerlist[index1++] = marker; + } + } + if (b->neighout > 1) { // '-nn' switch. + if (out == (tetgenio *) NULL) { + fprintf(outfile, " %d", elemindex(tetloop.tet)); + } else { + out->edge2tetlist[index2++] = elemindex(tetloop.tet); + } + // Fill the tetrahedron-to-edge map. + spintet = worktet; + while (1) { + if (!ishulltet(spintet)) { + tidx = elemindex(spintet.tet) - firstindex; + tet2edgelist[tidx * 6 + ver2edge[spintet.ver]] = edgenumber; + } + fnextself(spintet); + if (spintet.tet == worktet.tet) break; + } + } + if (out == (tetgenio *) NULL) { + fprintf(outfile, "\n"); + } + edgenumber++; + } + } + tetloop.tet = tetrahedrontraverse(); + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } + + if (b->neighout > 1) { // -nn option + long tsize = tetrahedrons->items - hullsize; + + if (b->facesout) { // -f option + // Build the face-to-edge map (use the tet-to-edge map). + long fsize = (tsize * 4l + hullsize) / 2l; + int *face2edgelist = new int[fsize * 3]; + + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + int facenumber = 0; // firstindex; // in->firstnumber; + while (tetloop.tet != (tetrahedron *) NULL) { + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + fsym(tetloop, spintet); + if (ishulltet(spintet) || + (elemindex(tetloop.tet) < elemindex(spintet.tet))) { + // The three edges of this face are ordered such that the + // first edge is opposite to the first vertex of this face + // that appears in the .face file, and so on. + tidx = elemindex(tetloop.tet) - firstindex; + worktet = tetloop; + for (i = 0; i < 3; i++) { + enextself(worktet); // The edge opposite to vertex i. + int eidx = tet2edgelist[tidx * 6 + ver2edge[worktet.ver]]; + face2edgelist[facenumber * 3 + i] = eidx; + } + facenumber++; + } + } + tetloop.tet = tetrahedrontraverse(); + } + + // Output the face-to-edge map. + if (out == (tetgenio *) NULL) { + strcpy(edgefilename, b->outfilename); + strcat(edgefilename, ".f2e"); + } + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", edgefilename); + } else { + printf("Writing face-to-edge map.\n"); + } + } + if (out == (tetgenio *) NULL) { + outfile = fopen(edgefilename, "w"); + for (tidx = 0; tidx < fsize; tidx++) { // Re-use `tidx' + i = tidx * 3; + fprintf(outfile, "%4d %d %d %d\n", tidx + in->firstnumber, + face2edgelist[i], face2edgelist[i+1], face2edgelist[i+2]); + } + fclose(outfile); + delete [] face2edgelist; + } else { + // Simply copy the address of the list to the output. + out->face2edgelist = face2edgelist; + } + } // if (b->facesout) + + // Output the tetrahedron-to-edge map. + if (out == (tetgenio *) NULL) { + strcpy(edgefilename, b->outfilename); + strcat(edgefilename, ".t2e"); + } + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", edgefilename); + } else { + printf("Writing tetrahedron-to-edge map.\n"); + } + } + if (out == (tetgenio *) NULL) { + outfile = fopen(edgefilename, "w"); + for (tidx = 0; tidx < tsize; tidx++) { + i = tidx * 6; + fprintf(outfile, "%4d %d %d %d %d %d %d\n", tidx + in->firstnumber, + tet2edgelist[i], tet2edgelist[i+1], tet2edgelist[i+2], + tet2edgelist[i+3], tet2edgelist[i+4], tet2edgelist[i+5]); + } + fclose(outfile); + delete [] tet2edgelist; + } else { + // Simply copy the address of the list to the output. + out->tet2edgelist = tet2edgelist; + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outsubsegments() Output segments to a .edge file or a structure. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outsubsegments(tetgenio* out) +{ + FILE *outfile = NULL; + char edgefilename[FILENAMESIZE]; + int *elist = NULL; + int index, i; + face edgeloop; + point torg, tdest; + int firstindex, shift; + int marker; + int edgenumber; + + // For -o2 option. + triface workface, spintet; + point *extralist, pp = NULL; + int highorderindex = 11; + int o2index = 0; + + // For -nn option. + int neigh = -1; + int index2 = 0; + + int t1ver; // used by fsymself() + + if (out == (tetgenio *) NULL) { + strcpy(edgefilename, b->outfilename); + strcat(edgefilename, ".edge"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", edgefilename); + } else { + printf("Writing edges.\n"); + } + } + + if (out == (tetgenio *) NULL) { + outfile = fopen(edgefilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", edgefilename); + terminatetetgen(this, 3); + } + // Number of subsegments. + fprintf(outfile, "%ld 1\n", subsegs->items); + } else { + // Allocate memory for 'edgelist'. + out->edgelist = new int[subsegs->items * (b->order == 1 ? 2 : 3)]; + if (out->edgelist == (int *) NULL) { + terminatetetgen(this, 1); + } + if (b->order == 2) { + out->o2edgelist = new int[subsegs->items]; + } + out->edgemarkerlist = new int[subsegs->items]; + if (out->edgemarkerlist == (int *) NULL) { + terminatetetgen(this, 1); + } + if (b->neighout > 1) { + out->edge2tetlist = new int[subsegs->items]; + } + out->numberofedges = subsegs->items; + elist = out->edgelist; + } + + // Determine the first index (0 or 1). + firstindex = b->zeroindex ? 0 : in->firstnumber; + shift = 0; // Default no shiftment. + if ((in->firstnumber == 1) && (firstindex == 0)) { + shift = 1; // Shift the output indices by 1. + } + index = 0; + i = 0; + + subsegs->traversalinit(); + edgeloop.sh = shellfacetraverse(subsegs); + edgenumber = firstindex; // in->firstnumber; + while (edgeloop.sh != (shellface *) NULL) { + torg = sorg(edgeloop); + tdest = sdest(edgeloop); + if ((b->order == 2) || (b->neighout > 1)) { + sstpivot1(edgeloop, workface); + if (workface.tet != NULL) { + // We must find a non-hull tet. + if (ishulltet(workface)) { + spintet = workface; + while (1) { + fnextself(spintet); + if (!ishulltet(spintet)) break; + if (spintet.tet == workface.tet) break; + } + workface = spintet; + } + } + } + if (b->order == 2) { // -o2 + // Get the extra vertex on this edge. + if (workface.tet != NULL) { + extralist = (point *) workface.tet[highorderindex]; + pp = extralist[ver2edge[workface.ver]]; + } else { + pp = torg; // There is no extra node available. + } + } + if (b->neighout > 1) { // -nn + if (workface.tet != NULL) { + neigh = elemindex(workface.tet); + } else { + neigh = -1; + } + } + marker = shellmark(edgeloop); + if (marker == 0) { + marker = 1; // Default marker of a boundary edge is 1. + } + if (out == (tetgenio *) NULL) { + fprintf(outfile, "%5d %4d %4d", edgenumber, + pointmark(torg) - shift, pointmark(tdest) - shift); + if (b->order == 2) { // -o2 + fprintf(outfile, " %4d", pointmark(pp) - shift); + } + fprintf(outfile, " %d", marker); + if (b->neighout > 1) { // -nn + fprintf(outfile, " %4d", neigh); + } + fprintf(outfile, "\n"); + } else { + // Output three vertices of this face; + elist[index++] = pointmark(torg) - shift; + elist[index++] = pointmark(tdest) - shift; + if (b->order == 2) { // -o2 + out->o2edgelist[o2index++] = pointmark(pp) - shift; + } + out->edgemarkerlist[i++] = marker; + if (b->neighout > 1) { // -nn + out->edge2tetlist[index2++] = neigh; + } + } + edgenumber++; + edgeloop.sh = shellfacetraverse(subsegs); + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outneighbors() Output tet neighbors to a .neigh file or a structure. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outneighbors(tetgenio* out) +{ + FILE *outfile = NULL; + char neighborfilename[FILENAMESIZE]; + int *nlist = NULL; + int index = 0; + triface tetloop, tetsym; + int neighbori[4]; + int firstindex; + int elementnumber; + long ntets; + + if (out == (tetgenio *) NULL) { + strcpy(neighborfilename, b->outfilename); + strcat(neighborfilename, ".neigh"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", neighborfilename); + } else { + printf("Writing neighbors.\n"); + } + } + + ntets = tetrahedrons->items - hullsize; + + if (out == (tetgenio *) NULL) { + outfile = fopen(neighborfilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", neighborfilename); + terminatetetgen(this, 1); + } + // Number of tetrahedra, four faces per tetrahedron. + fprintf(outfile, "%ld %d\n", ntets, 4); + } else { + // Allocate memory for 'neighborlist'. + out->neighborlist = new int[ntets * 4]; + if (out->neighborlist == (int *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + nlist = out->neighborlist; + } + + // Determine the first index (0 or 1). + firstindex = b->zeroindex ? 0 : in->firstnumber; + + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + elementnumber = firstindex; // in->firstnumber; + while (tetloop.tet != (tetrahedron *) NULL) { + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + fsym(tetloop, tetsym); + if (!ishulltet(tetsym)) { + neighbori[tetloop.ver] = elemindex(tetsym.tet); + } else { + neighbori[tetloop.ver] = -1; + } + } + if (out == (tetgenio *) NULL) { + // Tetrahedra number, neighboring tetrahedron numbers. + fprintf(outfile, "%4d %4d %4d %4d %4d\n", elementnumber, + neighbori[0], neighbori[1], neighbori[2], neighbori[3]); + } else { + nlist[index++] = neighbori[0]; + nlist[index++] = neighbori[1]; + nlist[index++] = neighbori[2]; + nlist[index++] = neighbori[3]; + } + tetloop.tet = tetrahedrontraverse(); + elementnumber++; + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outvoronoi() Output the Voronoi diagram to .v.node, .v.edge, v.face, // +// and .v.cell. // +// // +// The Voronoi diagram is the geometric dual of the Delaunay triangulation. // +// The Voronoi vertices are the circumcenters of Delaunay tetrahedra. Each // +// Voronoi edge connects two Voronoi vertices at two sides of a common Dela- // +// unay face. At a face of convex hull, it becomes a ray (goto the infinity).// +// A Voronoi face is the convex hull of all Voronoi vertices around a common // +// Delaunay edge. It is a closed polygon for any internal Delaunay edge. At a// +// ridge, it is unbounded. Each Voronoi cell is the convex hull of all Vor- // +// onoi vertices around a common Delaunay vertex. It is a polytope for any // +// internal Delaunay vertex. It is an unbounded polyhedron for a Delaunay // +// vertex belonging to the convex hull. // +// // +// NOTE: This routine is only used when the input is only a set of point. // +// Comment: Special thanks to Victor Liu for finding and fixing few bugs. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outvoronoi(tetgenio* out) +{ + FILE *outfile = NULL; + char outfilename[FILENAMESIZE]; + tetgenio::voroedge *vedge = NULL; + tetgenio::vorofacet *vfacet = NULL; + arraypool *tetlist, *ptlist; + triface tetloop, worktet, spintet, firsttet; + point pt[4], ploop, neipt; + REAL ccent[3], infvec[3], vec1[3], vec2[3], L; + long ntets, faces, edges; + int *indexarray, *fidxs, *eidxs; + int arraysize, *vertarray = NULL; + int vpointcount, vedgecount, vfacecount, tcount; + int ishullvert, ishullface; + int index, shift, end1, end2; + int i, j; + + int t1ver; // used by fsymself() + + // Output Voronoi vertices to .v.node file. + if (out == (tetgenio *) NULL) { + strcpy(outfilename, b->outfilename); + strcat(outfilename, ".v.node"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", outfilename); + } else { + printf("Writing Voronoi vertices.\n"); + } + } + + // Determine the first index (0 or 1). + shift = (b->zeroindex ? 0 : in->firstnumber); + + // Each face and edge of the tetrahedral mesh will be indexed for indexing + // the Voronoi edges and facets. Indices of faces and edges are saved in + // each tetrahedron (including hull tets). + + // Allocate the total space once. + indexarray = new int[tetrahedrons->items * 10]; + + // Allocate space (10 integers) into each tetrahedron. It re-uses the slot + // for element markers, flags. + i = 0; + tetrahedrons->traversalinit(); + tetloop.tet = alltetrahedrontraverse(); + while (tetloop.tet != NULL) { + tetloop.tet[11] = (tetrahedron) &(indexarray[i * 10]); + i++; + tetloop.tet = alltetrahedrontraverse(); + } + + // The number of tetrahedra (excluding hull tets) (Voronoi vertices). + ntets = tetrahedrons->items - hullsize; + // The number of Delaunay faces (Voronoi edges). + faces = (4l * ntets + hullsize) / 2l; + // The number of Delaunay edges (Voronoi faces). + long vsize = points->items - dupverts - unuverts; + if (b->weighted) vsize -= nonregularcount; + if (!nonconvex) { + edges = vsize + faces - ntets - 1; + } else { + if (meshedges == 0l) { + numberedges(); // Count edges. + } + edges = meshedges; + } + + if (out == (tetgenio *) NULL) { + outfile = fopen(outfilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", outfilename); + terminatetetgen(this, 3); + } + // Number of voronoi points, 3 dim, no attributes, no marker. + fprintf(outfile, "%ld 3 0 0\n", ntets); + } else { + // Allocate space for 'vpointlist'. + out->numberofvpoints = (int) ntets; + out->vpointlist = new REAL[out->numberofvpoints * 3]; + if (out->vpointlist == (REAL *) NULL) { + terminatetetgen(this, 1); + } + } + + // Output Voronoi vertices (the circumcenters of tetrahedra). + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + vpointcount = 0; // The (internal) v-index always starts from 0. + index = 0; + while (tetloop.tet != (tetrahedron *) NULL) { + for (i = 0; i < 4; i++) { + pt[i] = (point) tetloop.tet[4 + i]; + setpoint2tet(pt[i], encode(tetloop)); + } + if (b->weighted) { + orthosphere(pt[0], pt[1], pt[2], pt[3], pt[0][3], pt[1][3], pt[2][3], + pt[3][3], ccent, NULL); + } else { + circumsphere(pt[0], pt[1], pt[2], pt[3], ccent, NULL); + } + if (out == (tetgenio *) NULL) { + fprintf(outfile, "%4d %16.8e %16.8e %16.8e\n", vpointcount + shift, + ccent[0], ccent[1], ccent[2]); + } else { + out->vpointlist[index++] = ccent[0]; + out->vpointlist[index++] = ccent[1]; + out->vpointlist[index++] = ccent[2]; + } + setelemindex(tetloop.tet, vpointcount); + vpointcount++; + tetloop.tet = tetrahedrontraverse(); + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } + + // Output Voronoi edges to .v.edge file. + if (out == (tetgenio *) NULL) { + strcpy(outfilename, b->outfilename); + strcat(outfilename, ".v.edge"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", outfilename); + } else { + printf("Writing Voronoi edges.\n"); + } + } + + if (out == (tetgenio *) NULL) { + outfile = fopen(outfilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", outfilename); + terminatetetgen(this, 3); + } + // Number of Voronoi edges, no marker. + fprintf(outfile, "%ld 0\n", faces); + } else { + // Allocate space for 'vpointlist'. + out->numberofvedges = (int) faces; + out->vedgelist = new tetgenio::voroedge[out->numberofvedges]; + } + + // Output the Voronoi edges. + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + vedgecount = 0; // D-Face (V-edge) index (from zero). + index = 0; // The Delaunay-face index. + while (tetloop.tet != (tetrahedron *) NULL) { + // Count the number of Voronoi edges. Look at the four faces of each + // tetrahedron. Count the face if the tetrahedron's index is + // smaller than its neighbor's or the neighbor is outside. + end1 = elemindex(tetloop.tet); + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + fsym(tetloop, worktet); + if (ishulltet(worktet) || + (elemindex(tetloop.tet) < elemindex(worktet.tet))) { + // Found a Voronoi edge. Operate on it. + if (out == (tetgenio *) NULL) { + fprintf(outfile, "%4d %4d", vedgecount + shift, end1 + shift); + } else { + vedge = &(out->vedgelist[index++]); + vedge->v1 = end1 + shift; + } + if (!ishulltet(worktet)) { + end2 = elemindex(worktet.tet); + } else { + end2 = -1; + } + // Note that end2 may be -1 (worktet.tet is outside). + if (end2 == -1) { + // Calculate the out normal of this hull face. + pt[0] = dest(worktet); + pt[1] = org(worktet); + pt[2] = apex(worktet); + for (j = 0; j < 3; j++) vec1[j] = pt[1][j] - pt[0][j]; + for (j = 0; j < 3; j++) vec2[j] = pt[2][j] - pt[0][j]; + cross(vec1, vec2, infvec); + // Normalize it. + L = sqrt(infvec[0] * infvec[0] + infvec[1] * infvec[1] + + infvec[2] * infvec[2]); + if (L > 0) for (j = 0; j < 3; j++) infvec[j] /= L; + if (out == (tetgenio *) NULL) { + fprintf(outfile, " -1"); + fprintf(outfile, " %g %g %g\n", infvec[0], infvec[1], infvec[2]); + } else { + vedge->v2 = -1; + vedge->vnormal[0] = infvec[0]; + vedge->vnormal[1] = infvec[1]; + vedge->vnormal[2] = infvec[2]; + } + } else { + if (out == (tetgenio *) NULL) { + fprintf(outfile, " %4d\n", end2 + shift); + } else { + vedge->v2 = end2 + shift; + vedge->vnormal[0] = 0.0; + vedge->vnormal[1] = 0.0; + vedge->vnormal[2] = 0.0; + } + } + // Save the V-edge index in this tet and its neighbor. + fidxs = (int *) (tetloop.tet[11]); + fidxs[tetloop.ver] = vedgecount; + fidxs = (int *) (worktet.tet[11]); + fidxs[worktet.ver & 3] = vedgecount; + vedgecount++; + } + } // tetloop.ver + tetloop.tet = tetrahedrontraverse(); + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } + + // Output Voronoi faces to .v.face file. + if (out == (tetgenio *) NULL) { + strcpy(outfilename, b->outfilename); + strcat(outfilename, ".v.face"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", outfilename); + } else { + printf("Writing Voronoi faces.\n"); + } + } + + if (out == (tetgenio *) NULL) { + outfile = fopen(outfilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", outfilename); + terminatetetgen(this, 3); + } + // Number of Voronoi faces. + fprintf(outfile, "%ld 0\n", edges); + } else { + out->numberofvfacets = edges; + out->vfacetlist = new tetgenio::vorofacet[out->numberofvfacets]; + if (out->vfacetlist == (tetgenio::vorofacet *) NULL) { + terminatetetgen(this, 1); + } + } + + // Output the Voronoi facets. + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + vfacecount = 0; // D-edge (V-facet) index (from zero). + while (tetloop.tet != (tetrahedron *) NULL) { + // Count the number of Voronoi faces. Look at the six edges of each + // tetrahedron. Count the edge only if the tetrahedron's index is + // smaller than those of all other tetrahedra that share the edge. + worktet.tet = tetloop.tet; + for (i = 0; i < 6; i++) { + worktet.ver = edge2ver[i]; + // Count the number of faces at this edge. If the edge is a hull edge, + // the face containing dummypoint is also counted. + //ishulledge = 0; // Is it a hull edge. + tcount = 0; + firsttet = worktet; + spintet = worktet; + while (1) { + tcount++; + fnextself(spintet); + if (spintet.tet == worktet.tet) break; + if (!ishulltet(spintet)) { + if (elemindex(spintet.tet) < elemindex(worktet.tet)) break; + } else { + //ishulledge = 1; + if (apex(spintet) == dummypoint) { + // We make this V-edge appear in the end of the edge list. + fnext(spintet, firsttet); + } + } + } // while (1) + if (spintet.tet == worktet.tet) { + // Found a Voronoi facet. Operate on it. + pt[0] = org(worktet); + pt[1] = dest(worktet); + end1 = pointmark(pt[0]) - in->firstnumber; // V-cell index + end2 = pointmark(pt[1]) - in->firstnumber; + if (out == (tetgenio *) NULL) { + fprintf(outfile, "%4d %4d %4d %-2d ", vfacecount + shift, + end1 + shift, end2 + shift, tcount); + } else { + vfacet = &(out->vfacetlist[vfacecount]); + vfacet->c1 = end1 + shift; + vfacet->c2 = end2 + shift; + vfacet->elist = new int[tcount + 1]; + vfacet->elist[0] = tcount; + index = 1; + } + // Output V-edges of this V-facet. + spintet = firsttet; //worktet; + while (1) { + fidxs = (int *) (spintet.tet[11]); + if (apex(spintet) != dummypoint) { + vedgecount = fidxs[spintet.ver & 3]; + ishullface = 0; + } else { + ishullface = 1; // It's not a real face. + } + if (out == (tetgenio *) NULL) { + fprintf(outfile, " %d", !ishullface ? (vedgecount + shift) : -1); + } else { + vfacet->elist[index++] = !ishullface ? (vedgecount + shift) : -1; + } + // Save the V-facet index in this tet at this edge. + eidxs = &(fidxs[4]); + eidxs[ver2edge[spintet.ver]] = vfacecount; + // Go to the next face. + fnextself(spintet); + if (spintet.tet == firsttet.tet) break; + } // while (1) + if (out == (tetgenio *) NULL) { + fprintf(outfile, "\n"); + } + vfacecount++; + } // if (spintet.tet == worktet.tet) + } // if (i = 0; i < 6; i++) + tetloop.tet = tetrahedrontraverse(); + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } + + // Output Voronoi cells to .v.cell file. + if (out == (tetgenio *) NULL) { + strcpy(outfilename, b->outfilename); + strcat(outfilename, ".v.cell"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", outfilename); + } else { + printf("Writing Voronoi cells.\n"); + } + } + + if (out == (tetgenio *) NULL) { + outfile = fopen(outfilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", outfilename); + terminatetetgen(this, 3); + } + // Number of Voronoi cells. + fprintf(outfile, "%ld\n", points->items - unuverts - dupverts); + } else { + out->numberofvcells = points->items - unuverts - dupverts; + out->vcelllist = new int*[out->numberofvcells]; + if (out->vcelllist == (int **) NULL) { + terminatetetgen(this, 1); + } + } + + // Output Voronoi cells. + tetlist = cavetetlist; + ptlist = cavetetvertlist; + points->traversalinit(); + ploop = pointtraverse(); + vpointcount = 0; + while (ploop != (point) NULL) { + if ((pointtype(ploop) != UNUSEDVERTEX) && + (pointtype(ploop) != DUPLICATEDVERTEX) && + (pointtype(ploop) != NREGULARVERTEX)) { + getvertexstar(1, ploop, tetlist, ptlist, NULL); + // Mark all vertices. Check if it is a hull vertex. + ishullvert = 0; + for (i = 0; i < ptlist->objects; i++) { + neipt = * (point *) fastlookup(ptlist, i); + if (neipt != dummypoint) { + pinfect(neipt); + } else { + ishullvert = 1; + } + } + tcount = (int) ptlist->objects; + if (out == (tetgenio *) NULL) { + fprintf(outfile, "%4d %-2d ", vpointcount + shift, tcount); + } else { + arraysize = tcount; + vertarray = new int[arraysize + 1]; + out->vcelllist[vpointcount] = vertarray; + vertarray[0] = tcount; + index = 1; + } + // List Voronoi facets bounding this cell. + for (i = 0; i < tetlist->objects; i++) { + worktet = * (triface *) fastlookup(tetlist, i); + // Let 'worktet' be [a,b,c,d] where d = ploop. + for (j = 0; j < 3; j++) { + neipt = org(worktet); // neipt is a, or b, or c + // Skip the dummypoint. + if (neipt != dummypoint) { + if (pinfected(neipt)) { + // It's not processed yet. + puninfect(neipt); + // Go to the DT edge [a,d], or [b,d], or [c,d]. + esym(worktet, spintet); + enextself(spintet); + // Get the V-face dual to this edge. + eidxs = (int *) spintet.tet[11]; + vfacecount = eidxs[4 + ver2edge[spintet.ver]]; + if (out == (tetgenio *) NULL) { + fprintf(outfile, " %d", vfacecount + shift); + } else { + vertarray[index++] = vfacecount + shift; + } + } + } + enextself(worktet); + } // j + } // i + if (ishullvert) { + // Add a hull facet (-1) to the facet list. + if (out == (tetgenio *) NULL) { + fprintf(outfile, " -1"); + } else { + vertarray[index++] = -1; + } + } + if (out == (tetgenio *) NULL) { + fprintf(outfile, "\n"); + } + tetlist->restart(); + ptlist->restart(); + vpointcount++; + } + ploop = pointtraverse(); + } + + // Delete the space for face/edge indices. + delete [] indexarray; + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outsmesh() Write surface mesh to a .smesh file, which can be read and // +// tetrahedralized by TetGen. // +// // +// You can specify a filename (without suffix) in 'smfilename'. If you don't // +// supply a filename (let smfilename be NULL), the default name stored in // +// 'tetgenbehavior' will be used. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outsmesh(char* smfilename) +{ + FILE *outfile; + char nodfilename[FILENAMESIZE]; + char smefilename[FILENAMESIZE]; + face faceloop; + point p1, p2, p3; + int firstindex, shift; + int bmark; + int marker; + int i; + + if (smfilename != (char *) NULL && smfilename[0] != '\0') { + strcpy(smefilename, smfilename); + } else if (b->outfilename[0] != '\0') { + strcpy(smefilename, b->outfilename); + } else { + strcpy(smefilename, "unnamed"); + } + strcpy(nodfilename, smefilename); + strcat(smefilename, ".smesh"); + strcat(nodfilename, ".node"); + + if (!b->quiet) { + printf("Writing %s.\n", smefilename); + } + outfile = fopen(smefilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", smefilename); + return; + } + + // Determine the first index (0 or 1). + firstindex = b->zeroindex ? 0 : in->firstnumber; + shift = 0; // Default no shiftment. + if ((in->firstnumber == 1) && (firstindex == 0)) { + shift = 1; // Shift the output indices by 1. + } + + fprintf(outfile, "# %s. TetGen's input file.\n", smefilename); + fprintf(outfile, "\n# part 1: node list.\n"); + fprintf(outfile, "0 3 0 0 # nodes are found in %s.\n", nodfilename); + + marker = 0; // avoid compile warning. + bmark = !b->nobound && (in->facetmarkerlist || in->trifacemarkerlist); + + fprintf(outfile, "\n# part 2: facet list.\n"); + // Number of facets, boundary marker. + fprintf(outfile, "%ld %d\n", subfaces->items, bmark); + + subfaces->traversalinit(); + faceloop.sh = shellfacetraverse(subfaces); + while (faceloop.sh != (shellface *) NULL) { + p1 = sorg(faceloop); + p2 = sdest(faceloop); + p3 = sapex(faceloop); + if (bmark) { + marker = shellmark(faceloop); + } + fprintf(outfile, "3 %4d %4d %4d", pointmark(p1) - shift, + pointmark(p2) - shift, pointmark(p3) - shift); + if (bmark) { + fprintf(outfile, " %d", marker); + } + fprintf(outfile, "\n"); + faceloop.sh = shellfacetraverse(subfaces); + } + + // Copy input holelist. + fprintf(outfile, "\n# part 3: hole list.\n"); + fprintf(outfile, "%d\n", in->numberofholes); + for (i = 0; i < in->numberofholes; i++) { + fprintf(outfile, "%d %g %g %g\n", i + in->firstnumber, + in->holelist[i * 3], in->holelist[i * 3 + 1], + in->holelist[i * 3 + 2]); + } + + // Copy input regionlist. + fprintf(outfile, "\n# part 4: region list.\n"); + fprintf(outfile, "%d\n", in->numberofregions); + for (i = 0; i < in->numberofregions; i++) { + fprintf(outfile, "%d %g %g %g %d %g\n", i + in->firstnumber, + in->regionlist[i * 5], in->regionlist[i * 5 + 1], + in->regionlist[i * 5 + 2], (int) in->regionlist[i * 5 + 3], + in->regionlist[i * 5 + 4]); + } + + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outmesh2medit() Write mesh to a .mesh file, which can be read and // +// rendered by Medit (a free mesh viewer from INRIA). // +// // +// You can specify a filename (without suffix) in 'mfilename'. If you don't // +// supply a filename (let mfilename be NULL), the default name stored in // +// 'tetgenbehavior' will be used. The output file will have the suffix .mesh.// +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outmesh2medit(char* mfilename) +{ + FILE *outfile; + char mefilename[FILENAMESIZE]; + tetrahedron* tetptr; + triface tface, tsymface; + face segloop, checkmark; + point ptloop, p1, p2, p3, p4; + long ntets, faces; + int pointnumber; + int marker; + int i; + + if (mfilename != (char *) NULL && mfilename[0] != '\0') { + strcpy(mefilename, mfilename); + } else if (b->outfilename[0] != '\0') { + strcpy(mefilename, b->outfilename); + } else { + strcpy(mefilename, "unnamed"); + } + strcat(mefilename, ".mesh"); + + if (!b->quiet) { + printf("Writing %s.\n", mefilename); + } + outfile = fopen(mefilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", mefilename); + return; + } + + fprintf(outfile, "MeshVersionFormatted 1\n"); + fprintf(outfile, "\n"); + fprintf(outfile, "Dimension\n"); + fprintf(outfile, "3\n"); + fprintf(outfile, "\n"); + + fprintf(outfile, "\n# Set of mesh vertices\n"); + fprintf(outfile, "Vertices\n"); + fprintf(outfile, "%ld\n", points->items); + + points->traversalinit(); + ptloop = pointtraverse(); + pointnumber = 1; // Medit need start number form 1. + while (ptloop != (point) NULL) { + // Point coordinates. + fprintf(outfile, "%.17g %.17g %.17g", ptloop[0], ptloop[1], ptloop[2]); + if (in->numberofpointattributes > 0) { + // Write an attribute, ignore others if more than one. + fprintf(outfile, " %.17g\n", ptloop[3]); + } else { + fprintf(outfile, " 0\n"); + } + setpointmark(ptloop, pointnumber); + ptloop = pointtraverse(); + pointnumber++; + } + + // Compute the number of faces. + ntets = tetrahedrons->items - hullsize; + faces = (ntets * 4l + hullsize) / 2l; + + fprintf(outfile, "\n# Set of Triangles\n"); + fprintf(outfile, "Triangles\n"); + fprintf(outfile, "%ld\n", faces); + + tetrahedrons->traversalinit(); + tface.tet = tetrahedrontraverse(); + while (tface.tet != (tetrahedron *) NULL) { + for (tface.ver = 0; tface.ver < 4; tface.ver ++) { + fsym(tface, tsymface); + if (ishulltet(tsymface) || + (elemindex(tface.tet) < elemindex(tsymface.tet))) { + p1 = org (tface); + p2 = dest(tface); + p3 = apex(tface); + fprintf(outfile, "%5d %5d %5d", + pointmark(p1), pointmark(p2), pointmark(p3)); + // Check if it is a subface. + tspivot(tface, checkmark); + if (checkmark.sh == NULL) { + marker = 0; // It is an inner face. It's marker is 0. + } else { + marker = shellmark(checkmark); + } + fprintf(outfile, " %d\n", marker); + } + } + tface.tet = tetrahedrontraverse(); + } + + fprintf(outfile, "\n# Set of Tetrahedra\n"); + fprintf(outfile, "Tetrahedra\n"); + fprintf(outfile, "%ld\n", ntets); + + tetrahedrons->traversalinit(); + tetptr = tetrahedrontraverse(); + while (tetptr != (tetrahedron *) NULL) { + if (!b->reversetetori) { + p1 = (point) tetptr[4]; + p2 = (point) tetptr[5]; + } else { + p1 = (point) tetptr[5]; + p2 = (point) tetptr[4]; + } + p3 = (point) tetptr[6]; + p4 = (point) tetptr[7]; + fprintf(outfile, "%5d %5d %5d %5d", + pointmark(p1), pointmark(p2), pointmark(p3), pointmark(p4)); + if (numelemattrib > 0) { + fprintf(outfile, " %.17g", elemattribute(tetptr, 0)); + } else { + fprintf(outfile, " 0"); + } + fprintf(outfile, "\n"); + tetptr = tetrahedrontraverse(); + } + + fprintf(outfile, "\nCorners\n"); + fprintf(outfile, "%d\n", in->numberofpoints); + + for (i = 0; i < in->numberofpoints; i++) { + fprintf(outfile, "%4d\n", i + 1); + } + + if (b->plc || b->refine) { + fprintf(outfile, "\nEdges\n"); + fprintf(outfile, "%ld\n", subsegs->items); + + subsegs->traversalinit(); + segloop.sh = shellfacetraverse(subsegs); + while (segloop.sh != (shellface *) NULL) { + p1 = sorg(segloop); + p2 = sdest(segloop); + fprintf(outfile, "%5d %5d", pointmark(p1), pointmark(p2)); + marker = shellmark(segloop); + fprintf(outfile, " %d\n", marker); + segloop.sh = shellfacetraverse(subsegs); + } + } + + fprintf(outfile, "\nEnd\n"); + fclose(outfile); +} + + + + + +/////////////////////////////////////////////////////////////////////////////// +// // +// outmesh2vtk() Save mesh to file in VTK Legacy format. // +// // +// This function was contributed by Bryn Llyod from ETH, 2007. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outmesh2vtk(char* ofilename) +{ + FILE *outfile; + char vtkfilename[FILENAMESIZE]; + point pointloop, p1, p2, p3, p4; + tetrahedron* tptr; + double x, y, z; + int n1, n2, n3, n4; + int nnodes = 4; + int celltype = 10; + + if (b->order == 2) { + printf(" Write VTK not implemented for order 2 elements \n"); + return; + } + + int NEL = tetrahedrons->items - hullsize; + int NN = points->items; + + if (ofilename != (char *) NULL && ofilename[0] != '\0') { + strcpy(vtkfilename, ofilename); + } else if (b->outfilename[0] != '\0') { + strcpy(vtkfilename, b->outfilename); + } else { + strcpy(vtkfilename, "unnamed"); + } + strcat(vtkfilename, ".vtk"); + + if (!b->quiet) { + printf("Writing %s.\n", vtkfilename); + } + outfile = fopen(vtkfilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", vtkfilename); + return; + } + + //always write big endian + //bool ImALittleEndian = !testIsBigEndian(); + + fprintf(outfile, "# vtk DataFile Version 2.0\n"); + fprintf(outfile, "Unstructured Grid\n"); + fprintf(outfile, "ASCII\n"); // BINARY + fprintf(outfile, "DATASET UNSTRUCTURED_GRID\n"); + fprintf(outfile, "POINTS %d double\n", NN); + + points->traversalinit(); + pointloop = pointtraverse(); + for(int id=0; idtraversalinit(); + tptr = tetrahedrontraverse(); + //elementnumber = firstindex; // in->firstnumber; + while (tptr != (tetrahedron *) NULL) { + if (!b->reversetetori) { + p1 = (point) tptr[4]; + p2 = (point) tptr[5]; + } else { + p1 = (point) tptr[5]; + p2 = (point) tptr[4]; + } + p3 = (point) tptr[6]; + p4 = (point) tptr[7]; + n1 = pointmark(p1) - in->firstnumber; + n2 = pointmark(p2) - in->firstnumber; + n3 = pointmark(p3) - in->firstnumber; + n4 = pointmark(p4) - in->firstnumber; + fprintf(outfile, "%d %4d %4d %4d %4d\n", nnodes, n1, n2, n3, n4); + tptr = tetrahedrontraverse(); + } + fprintf(outfile, "\n"); + + fprintf(outfile, "CELL_TYPES %d\n", NEL); + for(int tid=0; tid 0) { + // Output tetrahedra region attributes. + fprintf(outfile, "CELL_DATA %d\n", NEL); + fprintf(outfile, "SCALARS cell_scalars int 1\n"); + fprintf(outfile, "LOOKUP_TABLE default\n"); + tetrahedrons->traversalinit(); + tptr = tetrahedrontraverse(); + while (tptr != (tetrahedron *) NULL) { + fprintf(outfile, "%d\n", (int) elemattribute(tptr, numelemattrib - 1)); + tptr = tetrahedrontraverse(); + } + fprintf(outfile, "\n"); + } + + fclose(outfile); +} + +//// //// +//// //// +//// output_cxx /////////////////////////////////////////////////////////////// + +//// main_cxx ///////////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetrahedralize() The interface for users using TetGen library to // +// generate tetrahedral meshes with all features. // +// // +// The sequence is roughly as follows. Many of these steps can be skipped, // +// depending on the command line switches. // +// // +// - Initialize constants and parse the command line. // +// - Read the vertices from a file and either // +// - tetrahedralize them (no -r), or // +// - read an old mesh from files and reconstruct it (-r). // +// - Insert the boundary segments and facets (-p or -Y). // +// - Read the holes (-p), regional attributes (-pA), and regional volume // +// constraints (-pa). Carve the holes and concavities, and spread the // +// regional attributes and volume constraints. // +// - Enforce the constraints on minimum quality bound (-q) and maximum // +// volume (-a), and a mesh size function (-m). // +// - Optimize the mesh wrt. specified quality measures (-O and -o). // +// - Write the output files and print the statistics. // +// - Check the consistency of the mesh (-C). // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetrahedralize(tetgenbehavior *b, tetgenio *in, tetgenio *out, + tetgenio *addin, tetgenio *bgmin) +{ + tetgenmesh m; + clock_t tv[12], ts[5]; // Timing informations (defined in time.h) + REAL cps = (REAL) CLOCKS_PER_SEC; + + tv[0] = clock(); + + m.b = b; + m.in = in; + m.addin = addin; + + if (b->metric && bgmin && (bgmin->numberofpoints > 0)) { + m.bgm = new tetgenmesh(); // Create an empty background mesh. + m.bgm->b = b; + m.bgm->in = bgmin; + } + + m.initializepools(); + m.transfernodes(); + + exactinit(b->verbose, b->noexact, b->nostaticfilter, + m.xmax - m.xmin, m.ymax - m.ymin, m.zmax - m.zmin); + + tv[1] = clock(); + + if (b->refine) { // -r + m.reconstructmesh(); + } else { // -p + m.incrementaldelaunay(ts[0]); + } + + tv[2] = clock(); + + if (!b->quiet) { + if (b->refine) { + printf("Mesh reconstruction seconds: %g\n", ((REAL)(tv[2]-tv[1])) / cps); + } else { + printf("Delaunay seconds: %g\n", ((REAL)(tv[2]-tv[1])) / cps); + if (b->verbose) { + printf(" Point sorting seconds: %g\n", ((REAL)(ts[0]-tv[1])) / cps); + + } + } + } + + if (b->plc && !b->refine) { // -p + m.meshsurface(); + + ts[0] = clock(); + + if (!b->quiet) { + printf("Surface mesh seconds: %g\n", ((REAL)(ts[0]-tv[2])) / cps); + } + + if (b->diagnose) { // -d + m.detectinterfaces(); + + ts[1] = clock(); + + if (!b->quiet) { + printf("Self-intersection seconds: %g\n", ((REAL)(ts[1]-ts[0])) / cps); + } + + // Only output when self-intersecting faces exist. + if (m.subfaces->items > 0l) { + m.outnodes(out); + m.outsubfaces(out); + } + + return; + } + } + + + tv[3] = clock(); + + if ((b->metric) && (m.bgm != NULL)) { // -m + m.bgm->initializepools(); + m.bgm->transfernodes(); + m.bgm->reconstructmesh(); + + ts[0] = clock(); + + if (!b->quiet) { + printf("Background mesh reconstruct seconds: %g\n", + ((REAL)(ts[0] - tv[3])) / cps); + } + + if (b->metric) { // -m + m.interpolatemeshsize(); + + ts[1] = clock(); + + if (!b->quiet) { + printf("Size interpolating seconds: %g\n",((REAL)(ts[1]-ts[0])) / cps); + } + } + } + + tv[4] = clock(); + + if (b->plc && !b->refine) { // -p + if (b->nobisect) { // -Y + m.recoverboundary(ts[0]); + } else { + m.constraineddelaunay(ts[0]); + } + + ts[1] = clock(); + + if (!b->quiet) { + if (b->nobisect) { + printf("Boundary recovery "); + } else { + printf("Constrained Delaunay "); + } + printf("seconds: %g\n", ((REAL)(ts[1] - tv[4])) / cps); + if (b->verbose) { + printf(" Segment recovery seconds: %g\n",((REAL)(ts[0]-tv[4]))/ cps); + printf(" Facet recovery seconds: %g\n", ((REAL)(ts[1]-ts[0])) / cps); + } + } + + m.carveholes(); + + ts[2] = clock(); + + if (!b->quiet) { + printf("Exterior tets removal seconds: %g\n",((REAL)(ts[2]-ts[1]))/cps); + } + + if (b->nobisect) { // -Y + if (m.subvertstack->objects > 0l) { + m.suppresssteinerpoints(); + + ts[3] = clock(); + + if (!b->quiet) { + printf("Steiner suppression seconds: %g\n", + ((REAL)(ts[3]-ts[2]))/cps); + } + } + } + } + + tv[5] = clock(); + + if (b->coarsen) { // -R + m.meshcoarsening(); + } + + tv[6] = clock(); + + if (!b->quiet) { + if (b->coarsen) { + printf("Mesh coarsening seconds: %g\n", ((REAL)(tv[6] - tv[5])) / cps); + } + } + + if ((b->plc && b->nobisect) || b->coarsen) { + m.recoverdelaunay(); + } + + tv[7] = clock(); + + if (!b->quiet) { + if ((b->plc && b->nobisect) || b->coarsen) { + printf("Delaunay recovery seconds: %g\n", ((REAL)(tv[7] - tv[6]))/cps); + } + } + + if ((b->plc || b->refine) && b->insertaddpoints) { // -i + if ((addin != NULL) && (addin->numberofpoints > 0)) { + m.insertconstrainedpoints(addin); + } + } + + tv[8] = clock(); + + if (!b->quiet) { + if ((b->plc || b->refine) && b->insertaddpoints) { // -i + if ((addin != NULL) && (addin->numberofpoints > 0)) { + printf("Constrained points seconds: %g\n", ((REAL)(tv[8]-tv[7]))/cps); + } + } + } + + if (b->quality) { + m.delaunayrefinement(); + } + + tv[9] = clock(); + + if (!b->quiet) { + if (b->quality) { + printf("Refinement seconds: %g\n", ((REAL)(tv[9] - tv[8])) / cps); + } + } + + if ((b->plc || b->refine) && (b->optlevel > 0)) { + m.optimizemesh(); + } + + tv[10] = clock(); + + if (!b->quiet) { + if ((b->plc || b->refine) && (b->optlevel > 0)) { + printf("Optimization seconds: %g\n", ((REAL)(tv[10] - tv[9])) / cps); + } + } + + + if (!b->nojettison && ((m.dupverts > 0) || (m.unuverts > 0) + || (b->refine && (in->numberofcorners == 10)))) { + m.jettisonnodes(); + } + + if ((b->order == 2) && !b->convex) { + m.highorder(); + } + + if (!b->quiet) { + printf("\n"); + } + + if (out != (tetgenio *) NULL) { + out->firstnumber = in->firstnumber; + out->mesh_dim = in->mesh_dim; + } + + if (b->nonodewritten || b->noiterationnum) { + if (!b->quiet) { + printf("NOT writing a .node file.\n"); + } + } else { + m.outnodes(out); + } + + if (b->noelewritten) { + if (!b->quiet) { + printf("NOT writing an .ele file.\n"); + } + m.indexelements(); + } else { + if (m.tetrahedrons->items > 0l) { + m.outelements(out); + } + } + + if (b->nofacewritten) { + if (!b->quiet) { + printf("NOT writing an .face file.\n"); + } + } else { + if (b->facesout) { + if (m.tetrahedrons->items > 0l) { + m.outfaces(out); // Output all faces. + } + } else { + if (b->plc || b->refine) { + if (m.subfaces->items > 0l) { + m.outsubfaces(out); // Output boundary faces. + } + } else { + if (m.tetrahedrons->items > 0l) { + m.outhullfaces(out); // Output convex hull faces. + } + } + } + } + + + if (b->nofacewritten) { + if (!b->quiet) { + printf("NOT writing an .edge file.\n"); + } + } else { + if (b->edgesout) { // -e + m.outedges(out); // output all mesh edges. + } else { + if (b->plc || b->refine) { + m.outsubsegments(out); // output subsegments. + } + } + } + + if ((b->plc || b->refine) && b->metric) { // -m + m.outmetrics(out); + } + + if (!out && b->plc && + ((b->object == tetgenbehavior::OFF) || + (b->object == tetgenbehavior::PLY) || + (b->object == tetgenbehavior::STL))) { + m.outsmesh(b->outfilename); + } + + if (!out && b->meditview) { + m.outmesh2medit(b->outfilename); + } + + + if (!out && b->vtkview) { + m.outmesh2vtk(b->outfilename); + } + + if (b->neighout) { + m.outneighbors(out); + } + + if (b->voroout) { + m.outvoronoi(out); + } + + + tv[11] = clock(); + + if (!b->quiet) { + printf("\nOutput seconds: %g\n", ((REAL)(tv[11] - tv[10])) / cps); + printf("Total running seconds: %g\n", ((REAL)(tv[11] - tv[0])) / cps); + } + + if (b->docheck) { + m.checkmesh(0); + if (b->plc || b->refine) { + m.checkshells(); + m.checksegments(); + } + if (b->docheck > 1) { + m.checkdelaunay(); + } + } + + if (!b->quiet) { + m.statistics(); + } +} + +#ifndef TETLIBRARY + +/////////////////////////////////////////////////////////////////////////////// +// // +// main() The command line interface of TetGen. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int main(int argc, char *argv[]) + +#else // with TETLIBRARY + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetrahedralize() The library interface of TetGen. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetrahedralize(char *switches, tetgenio *in, tetgenio *out, + tetgenio *addin, tetgenio *bgmin) + +#endif // not TETLIBRARY + +{ + tetgenbehavior b; + +#ifndef TETLIBRARY + + tetgenio in, addin, bgmin; + + if (!b.parse_commandline(argc, argv)) { + terminatetetgen(NULL, 10); + } + + // Read input files. + if (b.refine) { // -r + if (!in.load_tetmesh(b.infilename, (int) b.object)) { + terminatetetgen(NULL, 10); + } + } else { // -p + if (!in.load_plc(b.infilename, (int) b.object)) { + terminatetetgen(NULL, 10); + } + } + if (b.insertaddpoints) { // -i + // Try to read a .a.node file. + addin.load_node(b.addinfilename); + } + if (b.metric) { // -m + // Try to read a background mesh in files .b.node, .b.ele. + bgmin.load_tetmesh(b.bgmeshfilename, (int) b.object); + } + + tetrahedralize(&b, &in, NULL, &addin, &bgmin); + + return 0; + +#else // with TETLIBRARY + + if (!b.parse_commandline(switches)) { + terminatetetgen(NULL, 10); + } + tetrahedralize(&b, in, out, addin, bgmin); + +#endif // not TETLIBRARY +} + +//// //// +//// //// +//// main_cxx ///////////////////////////////////////////////////////////////// + diff --git a/src/lib/tetgen.h b/src/lib/tetgen.h new file mode 100644 index 0000000..7c9ec18 --- /dev/null +++ b/src/lib/tetgen.h @@ -0,0 +1,3438 @@ +/////////////////////////////////////////////////////////////////////////////// +// // +// TetGen // +// // +// A Quality Tetrahedral Mesh Generator and A 3D Delaunay Triangulator // +// // +// Version 1.5 // +// August 18, 2018 // +// // +// Copyright (C) 2002--2018 // +// // +// TetGen is freely available through the website: http://www.tetgen.org. // +// It may be copied, modified, and redistributed for non-commercial use. // +// Please consult the file LICENSE for the detailed copyright notices. // +// // +/////////////////////////////////////////////////////////////////////////////// + + +#ifndef tetgenH +#define tetgenH + +// To compile TetGen as a library instead of an executable program, define +// the TETLIBRARY symbol. + +#define TETLIBRARY + + +// TetGen default uses the double precision (64 bit) for a real number. +// Alternatively, one can use the single precision (32 bit) 'float' if the +// memory is limited. + +#define REAL double // #define REAL float + +// Maximum number of characters in a file name (including the null). + +#define FILENAMESIZE 1024 + +// Maximum number of chars in a line read from a file (including the null). + +#define INPUTLINESIZE 2048 + +// TetGen only uses the C standard library. + +#include +#include +#include +#include +#include + +// The types 'intptr_t' and 'uintptr_t' are signed and unsigned integer types, +// respectively. They are guaranteed to be the same width as a pointer. +// They are defined in by the C99 Standard. However, Microsoft +// Visual C++ 2003 -- 2008 (Visual C++ 7.1 - 9) doesn't ship with this header +// file. In such case, we can define them by ourself. +// Update (learned from Stack Overflow): Visual Studio 2010 and Visual C++ 2010 +// Express both have stdint.h + +// The following piece of code was provided by Steven Johnson (MIT). Define the +// symbol _MSC_VER if you are using Microsoft Visual C++. Moreover, define +// the _WIN64 symbol if you are running TetGen on Win64 systems. + +#ifdef _MSC_VER // Microsoft Visual C++ +# ifdef _WIN64 + typedef __int64 intptr_t; + typedef unsigned __int64 uintptr_t; +# else // not _WIN64 + typedef int intptr_t; + typedef unsigned int uintptr_t; +# endif +#else // not Visual C++ +# include +#endif + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetgenio // +// // +// A structure for transferring data into and out of TetGen's mesh structure,// +// 'tetgenmesh' (declared below). // +// // +// The input of TetGen is either a 3D point set, or a 3D piecewise linear // +// complex (PLC), or a tetrahedral mesh. Depending on the input object and // +// the specified options, the output of TetGen is either a Delaunay (or wei- // +// ghted Delaunay) tetrahedralization, or a constrained (Delaunay) tetrahed- // +// ralization, or a quality tetrahedral mesh. // +// // +// A piecewise linear complex (PLC) represents a 3D polyhedral domain with // +// possibly internal boundaries(subdomains). It is introduced in [Miller et // +// al, 1996]. Basically it is a set of "cells", i.e., vertices, edges, poly- // +// gons, and polyhedra, and the intersection of any two of its cells is the // +// union of other cells of it. // +// // +// TetGen uses a set of files to describe the inputs and outputs. Each file // +// is identified from its file extension (.node, .ele, .face, .edge, etc). // +// // +// The 'tetgenio' structure is a collection of arrays of data, i.e., points, // +// facets, tetrahedra, and so forth. It contains functions to read and write // +// (input and output) files of TetGen as well as other supported mesh files. // +// // +// Once an object of tetgenio is declared, no array is created. One has to // +// allocate enough memory for them. On deletion of this object, the memory // +// occupied by these arrays needs to be freed. The routine deinitialize() // +// will be automatically called. It frees the memory for an array if it is // +// not a NULL. Note that it assumes that the memory is allocated by the C++ // +// "new" operator. Otherwise, the user is responsible to free them and all // +// pointers must be NULL before the call of the destructor. // +// // +/////////////////////////////////////////////////////////////////////////////// + +class tetgenio { + +public: + + // A "polygon" describes a simple polygon (no holes). It is not necessarily + // convex. Each polygon contains a number of corners (points) and the same + // number of sides (edges). The points of the polygon must be given in + // either counterclockwise or clockwise order and they form a ring, so + // every two consecutive points forms an edge of the polygon. + typedef struct { + int *vertexlist; + int numberofvertices; + } polygon; + + // A "facet" describes a polygonal region possibly with holes, edges, and + // points floating in it. Each facet consists of a list of polygons and + // a list of hole points (which lie strictly inside holes). + typedef struct { + polygon *polygonlist; + int numberofpolygons; + REAL *holelist; + int numberofholes; + } facet; + + // A "voroedge" is an edge of the Voronoi diagram. It corresponds to a + // Delaunay face. Each voroedge is either a line segment connecting + // two Voronoi vertices or a ray starting from a Voronoi vertex to an + // "infinite vertex". 'v1' and 'v2' are two indices pointing to the + // list of Voronoi vertices. 'v1' must be non-negative, while 'v2' may + // be -1 if it is a ray, in this case, the unit normal of this ray is + // given in 'vnormal'. + typedef struct { + int v1, v2; + REAL vnormal[3]; + } voroedge; + + // A "vorofacet" is an facet of the Voronoi diagram. It corresponds to a + // Delaunay edge. Each Voronoi facet is a convex polygon formed by a + // list of Voronoi edges, it may not be closed. 'c1' and 'c2' are two + // indices pointing into the list of Voronoi cells, i.e., the two cells + // share this facet. 'elist' is an array of indices pointing into the + // list of Voronoi edges, 'elist[0]' saves the number of Voronoi edges + // (including rays) of this facet. + typedef struct { + int c1, c2; + int *elist; + } vorofacet; + + + // Additional parameters associated with an input (or mesh) vertex. + // These informations are provided by CAD libraries. + typedef struct { + REAL uv[2]; + int tag; + int type; // 0, 1, or 2. + } pointparam; + + // Callback functions for meshing PSCs. + typedef REAL (* GetVertexParamOnEdge)(void*, int, int); + typedef void (* GetSteinerOnEdge)(void*, int, REAL, REAL*); + typedef void (* GetVertexParamOnFace)(void*, int, int, REAL*); + typedef void (* GetEdgeSteinerParamOnFace)(void*, int, REAL, int, REAL*); + typedef void (* GetSteinerOnFace)(void*, int, REAL*, REAL*); + + // A callback function for mesh refinement. + typedef bool (* TetSizeFunc)(REAL*, REAL*, REAL*, REAL*, REAL*, REAL); + + // Items are numbered starting from 'firstnumber' (0 or 1), default is 0. + int firstnumber; + + // Dimension of the mesh (2 or 3), default is 3. + int mesh_dim; + + // Does the lines in .node file contain index or not, default is 1. + int useindex; + + // 'pointlist': An array of point coordinates. The first point's x + // coordinate is at index [0] and its y coordinate at index [1], its + // z coordinate is at index [2], followed by the coordinates of the + // remaining points. Each point occupies three REALs. + // 'pointattributelist': An array of point attributes. Each point's + // attributes occupy 'numberofpointattributes' REALs. + // 'pointmtrlist': An array of metric tensors at points. Each point's + // tensor occupies 'numberofpointmtr' REALs. + // 'pointmarkerlist': An array of point markers; one integer per point. + // 'point2tetlist': An array of tetrahedra indices; one integer per point. + REAL *pointlist; + REAL *pointattributelist; + REAL *pointmtrlist; + int *pointmarkerlist; + int *point2tetlist; + pointparam *pointparamlist; + int numberofpoints; + int numberofpointattributes; + int numberofpointmtrs; + + // 'tetrahedronlist': An array of tetrahedron corners. The first + // tetrahedron's first corner is at index [0], followed by its other + // corners, followed by six nodes on the edges of the tetrahedron if the + // second order option (-o2) is applied. Each tetrahedron occupies + // 'numberofcorners' ints. The second order nodes are ouput only. + // 'tetrahedronattributelist': An array of tetrahedron attributes. Each + // tetrahedron's attributes occupy 'numberoftetrahedronattributes' REALs. + // 'tetrahedronvolumelist': An array of constraints, i.e. tetrahedron's + // volume; one REAL per element. Input only. + // 'neighborlist': An array of tetrahedron neighbors; 4 ints per element. + // 'tet2facelist': An array of tetrahedron face indices; 4 ints per element. + // 'tet2edgelist': An array of tetrahedron edge indices; 6 ints per element. + int *tetrahedronlist; + REAL *tetrahedronattributelist; + REAL *tetrahedronvolumelist; + int *neighborlist; + int *tet2facelist; + int *tet2edgelist; + int numberoftetrahedra; + int numberofcorners; + int numberoftetrahedronattributes; + + // 'facetlist': An array of facets. Each entry is a structure of facet. + // 'facetmarkerlist': An array of facet markers; one int per facet. + facet *facetlist; + int *facetmarkerlist; + int numberoffacets; + + // 'holelist': An array of holes (in volume). Each hole is given by a + // seed (point) which lies strictly inside it. The first seed's x, y and z + // coordinates are at indices [0], [1] and [2], followed by the + // remaining seeds. Three REALs per hole. + REAL *holelist; + int numberofholes; + + // 'regionlist': An array of regions (subdomains). Each region is given by + // a seed (point) which lies strictly inside it. The first seed's x, y and + // z coordinates are at indices [0], [1] and [2], followed by the regional + // attribute at index [3], followed by the maximum volume at index [4]. + // Five REALs per region. + // Note that each regional attribute is used only if you select the 'A' + // switch, and each volume constraint is used only if you select the + // 'a' switch (with no number following). + REAL *regionlist; + int numberofregions; + + // 'facetconstraintlist': An array of facet constraints. Each constraint + // specifies a maximum area bound on the subfaces of that facet. The + // first facet constraint is given by a facet marker at index [0] and its + // maximum area bound at index [1], followed by the remaining facet con- + // straints. Two REALs per facet constraint. Note: the facet marker is + // actually an integer. + REAL *facetconstraintlist; + int numberoffacetconstraints; + + // 'segmentconstraintlist': An array of segment constraints. Each constraint + // specifies a maximum length bound on the subsegments of that segment. + // The first constraint is given by the two endpoints of the segment at + // index [0] and [1], and the maximum length bound at index [2], followed + // by the remaining segment constraints. Three REALs per constraint. + // Note the segment endpoints are actually integers. + REAL *segmentconstraintlist; + int numberofsegmentconstraints; + + + // 'trifacelist': An array of face (triangle) corners. The first face's + // three corners are at indices [0], [1] and [2], followed by the remaining + // faces. Three ints per face. + // 'trifacemarkerlist': An array of face markers; one int per face. + // 'o2facelist': An array of second order nodes (on the edges) of the face. + // It is output only if the second order option (-o2) is applied. The + // first face's three second order nodes are at [0], [1], and [2], + // followed by the remaining faces. Three ints per face. + // 'face2tetlist': An array of tetrahedra indices; 2 ints per face. + // 'face2edgelist': An array of edge indices; 3 ints per face. + int *trifacelist; + int *trifacemarkerlist; + int *o2facelist; + int *face2tetlist; + int *face2edgelist; + int numberoftrifaces; + + // 'edgelist': An array of edge endpoints. The first edge's endpoints + // are at indices [0] and [1], followed by the remaining edges. + // Two ints per edge. + // 'edgemarkerlist': An array of edge markers; one int per edge. + // 'o2edgelist': An array of midpoints of edges. It is output only if the + // second order option (-o2) is applied. One int per edge. + // 'edge2tetlist': An array of tetrahedra indices. One int per edge. + int *edgelist; + int *edgemarkerlist; + int *o2edgelist; + int *edge2tetlist; + int numberofedges; + + // 'vpointlist': An array of Voronoi vertex coordinates (like pointlist). + // 'vedgelist': An array of Voronoi edges. Each entry is a 'voroedge'. + // 'vfacetlist': An array of Voronoi facets. Each entry is a 'vorofacet'. + // 'vcelllist': An array of Voronoi cells. Each entry is an array of + // indices pointing into 'vfacetlist'. The 0th entry is used to store + // the length of this array. + REAL *vpointlist; + voroedge *vedgelist; + vorofacet *vfacetlist; + int **vcelllist; + int numberofvpoints; + int numberofvedges; + int numberofvfacets; + int numberofvcells; + + + // Variable (and callback functions) for meshing PSCs. + void *geomhandle; + GetVertexParamOnEdge getvertexparamonedge; + GetSteinerOnEdge getsteineronedge; + GetVertexParamOnFace getvertexparamonface; + GetEdgeSteinerParamOnFace getedgesteinerparamonface; + GetSteinerOnFace getsteineronface; + + // A callback function. + TetSizeFunc tetunsuitable; + + // Input & output routines. + bool load_node_call(FILE* infile, int markers, int uvflag, char*); + bool load_node(char*); + bool load_edge(char*); + bool load_face(char*); + bool load_tet(char*); + bool load_vol(char*); + bool load_var(char*); + bool load_mtr(char*); + bool load_pbc(char*); + bool load_poly(char*); + bool load_off(char*); + bool load_ply(char*); + bool load_stl(char*); + bool load_vtk(char*); + bool load_medit(char*, int); + bool load_neumesh(char*, int); + bool load_plc(char*, int); + bool load_tetmesh(char*, int); + void save_nodes(char*); + void save_elements(char*); + void save_faces(char*); + void save_edges(char*); + void save_neighbors(char*); + void save_poly(char*); + void save_faces2smesh(char*); + + // Read line and parse string functions. + char *readline(char* string, FILE* infile, int *linenumber); + char *findnextfield(char* string); + char *readnumberline(char* string, FILE* infile, char* infilename); + char *findnextnumber(char* string); + + static void init(polygon* p) { + p->vertexlist = (int *) NULL; + p->numberofvertices = 0; + } + + static void init(facet* f) { + f->polygonlist = (polygon *) NULL; + f->numberofpolygons = 0; + f->holelist = (REAL *) NULL; + f->numberofholes = 0; + } + + // Initialize routine. + void initialize() + { + firstnumber = 0; + mesh_dim = 3; + useindex = 1; + + pointlist = (REAL *) NULL; + pointattributelist = (REAL *) NULL; + pointmtrlist = (REAL *) NULL; + pointmarkerlist = (int *) NULL; + point2tetlist = (int *) NULL; + pointparamlist = (pointparam *) NULL; + numberofpoints = 0; + numberofpointattributes = 0; + numberofpointmtrs = 0; + + tetrahedronlist = (int *) NULL; + tetrahedronattributelist = (REAL *) NULL; + tetrahedronvolumelist = (REAL *) NULL; + neighborlist = (int *) NULL; + tet2facelist = (int *) NULL; + tet2edgelist = (int *) NULL; + numberoftetrahedra = 0; + numberofcorners = 4; + numberoftetrahedronattributes = 0; + + trifacelist = (int *) NULL; + trifacemarkerlist = (int *) NULL; + o2facelist = (int *) NULL; + face2tetlist = (int *) NULL; + face2edgelist = (int *) NULL; + numberoftrifaces = 0; + + edgelist = (int *) NULL; + edgemarkerlist = (int *) NULL; + o2edgelist = (int *) NULL; + edge2tetlist = (int *) NULL; + numberofedges = 0; + + facetlist = (facet *) NULL; + facetmarkerlist = (int *) NULL; + numberoffacets = 0; + + holelist = (REAL *) NULL; + numberofholes = 0; + + regionlist = (REAL *) NULL; + numberofregions = 0; + + facetconstraintlist = (REAL *) NULL; + numberoffacetconstraints = 0; + segmentconstraintlist = (REAL *) NULL; + numberofsegmentconstraints = 0; + + + vpointlist = (REAL *) NULL; + vedgelist = (voroedge *) NULL; + vfacetlist = (vorofacet *) NULL; + vcelllist = (int **) NULL; + numberofvpoints = 0; + numberofvedges = 0; + numberofvfacets = 0; + numberofvcells = 0; + + + tetunsuitable = NULL; + + geomhandle = NULL; + getvertexparamonedge = NULL; + getsteineronedge = NULL; + getvertexparamonface = NULL; + getedgesteinerparamonface = NULL; + getsteineronface = NULL; + } + + // Free the memory allocated in 'tetgenio'. Note that it assumes that the + // memory was allocated by the "new" operator (C++). + void deinitialize() + { + int i, j; + + if (pointlist != (REAL *) NULL) { + delete [] pointlist; + } + if (pointattributelist != (REAL *) NULL) { + delete [] pointattributelist; + } + if (pointmtrlist != (REAL *) NULL) { + delete [] pointmtrlist; + } + if (pointmarkerlist != (int *) NULL) { + delete [] pointmarkerlist; + } + if (point2tetlist != (int *) NULL) { + delete [] point2tetlist; + } + if (pointparamlist != (pointparam *) NULL) { + delete [] pointparamlist; + } + + if (tetrahedronlist != (int *) NULL) { + delete [] tetrahedronlist; + } + if (tetrahedronattributelist != (REAL *) NULL) { + delete [] tetrahedronattributelist; + } + if (tetrahedronvolumelist != (REAL *) NULL) { + delete [] tetrahedronvolumelist; + } + if (neighborlist != (int *) NULL) { + delete [] neighborlist; + } + if (tet2facelist != (int *) NULL) { + delete [] tet2facelist; + } + if (tet2edgelist != (int *) NULL) { + delete [] tet2edgelist; + } + + if (trifacelist != (int *) NULL) { + delete [] trifacelist; + } + if (trifacemarkerlist != (int *) NULL) { + delete [] trifacemarkerlist; + } + if (o2facelist != (int *) NULL) { + delete [] o2facelist; + } + if (face2tetlist != (int *) NULL) { + delete [] face2tetlist; + } + if (face2edgelist != (int *) NULL) { + delete [] face2edgelist; + } + + if (edgelist != (int *) NULL) { + delete [] edgelist; + } + if (edgemarkerlist != (int *) NULL) { + delete [] edgemarkerlist; + } + if (o2edgelist != (int *) NULL) { + delete [] o2edgelist; + } + if (edge2tetlist != (int *) NULL) { + delete [] edge2tetlist; + } + + if (facetlist != (facet *) NULL) { + facet *f; + polygon *p; + for (i = 0; i < numberoffacets; i++) { + f = &facetlist[i]; + for (j = 0; j < f->numberofpolygons; j++) { + p = &f->polygonlist[j]; + delete [] p->vertexlist; + } + delete [] f->polygonlist; + if (f->holelist != (REAL *) NULL) { + delete [] f->holelist; + } + } + delete [] facetlist; + } + if (facetmarkerlist != (int *) NULL) { + delete [] facetmarkerlist; + } + + if (holelist != (REAL *) NULL) { + delete [] holelist; + } + if (regionlist != (REAL *) NULL) { + delete [] regionlist; + } + if (facetconstraintlist != (REAL *) NULL) { + delete [] facetconstraintlist; + } + if (segmentconstraintlist != (REAL *) NULL) { + delete [] segmentconstraintlist; + } + if (vpointlist != (REAL *) NULL) { + delete [] vpointlist; + } + if (vedgelist != (voroedge *) NULL) { + delete [] vedgelist; + } + if (vfacetlist != (vorofacet *) NULL) { + for (i = 0; i < numberofvfacets; i++) { + delete [] vfacetlist[i].elist; + } + delete [] vfacetlist; + } + if (vcelllist != (int **) NULL) { + for (i = 0; i < numberofvcells; i++) { + delete [] vcelllist[i]; + } + delete [] vcelllist; + } + } + + // Constructor & destructor. + tetgenio() {initialize();} + ~tetgenio() {deinitialize();} + +}; // class tetgenio + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetgenbehavior // +// // +// A structure for maintaining the switches and parameters used by TetGen's // +// mesh data structure and algorithms. // +// // +// All switches and parameters are initialized with default values. They can // +// be set by the command line arguments (a list of strings) of TetGen. // +// // +// NOTE: Some of the switches are incompatible. While some may depend on // +// other switches. The routine parse_commandline() sets the switches from // +// the command line (a list of strings) and checks the consistency of the // +// applied switches. // +// // +/////////////////////////////////////////////////////////////////////////////// + +class tetgenbehavior { + +public: + + // Switches of TetGen. + int plc; // '-p', 0. + int psc; // '-s', 0. + int refine; // '-r', 0. + int quality; // '-q', 0. + int nobisect; // '-Y', 0. + int coarsen; // '-R', 0. + int weighted; // '-w', 0. + int brio_hilbert; // '-b', 1. + int incrflip; // '-l', 0. + int flipinsert; // '-L', 0. + int metric; // '-m', 0. + int varvolume; // '-a', 0. + int fixedvolume; // '-a', 0. + int regionattrib; // '-A', 0. + int cdtrefine; // '-D', 0. + int use_equatorial_lens; // '-Dl', 0. + int insertaddpoints; // '-i', 0. + int diagnose; // '-d', 0. + int convex; // '-c', 0. + int nomergefacet; // '-M', 0. + int nomergevertex; // '-M', 0. + int noexact; // '-X', 0. + int nostaticfilter; // '-X', 0. + int zeroindex; // '-z', 0. + int facesout; // '-f', 0. + int edgesout; // '-e', 0. + int neighout; // '-n', 0. + int voroout; // '-v', 0. + int meditview; // '-g', 0. + int vtkview; // '-k', 0. + int nobound; // '-B', 0. + int nonodewritten; // '-N', 0. + int noelewritten; // '-E', 0. + int nofacewritten; // '-F', 0. + int noiterationnum; // '-I', 0. + int nojettison; // '-J', 0. + int docheck; // '-C', 0. + int quiet; // '-Q', 0. + int verbose; // '-V', 0. + + // Parameters of TetGen. + int vertexperblock; // '-x', 4092. + int tetrahedraperblock; // '-x', 8188. + int shellfaceperblock; // '-x', 2044. + int nobisect_nomerge; // '-Y', 1. + int supsteiner_level; // '-Y/', 2. + int addsteiner_algo; // '-Y//', 1. + int coarsen_param; // '-R', 0. + int weighted_param; // '-w', 0. + int fliplinklevel; // -1. + int flipstarsize; // -1. + int fliplinklevelinc; // 1. + int reflevel; // '-D', 3. + int optlevel; // '-O', 2. + int optscheme; // '-O', 7. + int delmaxfliplevel; // 1. + int order; // '-o', 1. + int reversetetori; // '-o/', 0. + int steinerleft; // '-S', 0. + int no_sort; // 0. + int hilbert_order; // '-b///', 52. + int hilbert_limit; // '-b//' 8. + int brio_threshold; // '-b' 64. + REAL brio_ratio; // '-b/' 0.125. + REAL facet_separate_ang_tol; // '-p', 179.9. + REAL facet_overlap_ang_tol; // '-p/', 0.1. + REAL facet_small_ang_tol; // '-p//', 15.0. + REAL maxvolume; // '-a', -1.0. + REAL minratio; // '-q', 0.0. + REAL mindihedral; // '-q', 5.0. + REAL optmaxdihedral; // 165.0. + REAL optminsmtdihed; // 179.0. + REAL optminslidihed; // 179.0. + REAL epsilon; // '-T', 1.0e-8. + REAL coarsen_percent; // -R1/#, 1.0. + + // Strings of command line arguments and input/output file names. + char commandline[1024]; + char infilename[1024]; + char outfilename[1024]; + char addinfilename[1024]; + char bgmeshfilename[1024]; + + // Read an additional tetrahedral mesh and treat it as holes [2018-07-30]. + int hole_mesh; // '-H', 0. + char hole_mesh_filename[1024]; + int apply_flow_bc; // '-K', 0. + + // The input object of TetGen. They are recognized by either the input + // file extensions or by the specified options. + // Currently the following objects are supported: + // - NODES, a list of nodes (.node); + // - POLY, a piecewise linear complex (.poly or .smesh); + // - OFF, a polyhedron (.off, Geomview's file format); + // - PLY, a polyhedron (.ply, file format from gatech, only ASCII); + // - STL, a surface mesh (.stl, stereolithography format); + // - MEDIT, a surface mesh (.mesh, Medit's file format); + // - MESH, a tetrahedral mesh (.ele). + // If no extension is available, the imposed command line switch + // (-p or -r) implies the object. + enum objecttype {NODES, POLY, OFF, PLY, STL, MEDIT, VTK, MESH, NEU_MESH} object; + + + void syntax(); + void usage(); + + // Command line parse routine. + bool parse_commandline(int argc, char **argv); + bool parse_commandline(char *switches) { + return parse_commandline(0, &switches); + } + + // Initialize all variables. + tetgenbehavior() + { + plc = 0; + psc = 0; + refine = 0; + quality = 0; + nobisect = 0; + coarsen = 0; + metric = 0; + weighted = 0; + brio_hilbert = 1; + incrflip = 0; + flipinsert = 0; + varvolume = 0; + fixedvolume = 0; + noexact = 0; + nostaticfilter = 0; + insertaddpoints = 0; + regionattrib = 0; + cdtrefine = 0; + use_equatorial_lens = 0; // -Dl + diagnose = 0; + convex = 0; + zeroindex = 0; + facesout = 0; + edgesout = 0; + neighout = 0; + voroout = 0; + meditview = 0; + vtkview = 0; + nobound = 0; + nonodewritten = 0; + noelewritten = 0; + nofacewritten = 0; + noiterationnum = 0; + nomergefacet = 0; + nomergevertex = 0; + nojettison = 0; + docheck = 0; + quiet = 0; + verbose = 0; + + vertexperblock = 4092; + tetrahedraperblock = 8188; + shellfaceperblock = 4092; + nobisect_nomerge = 1; + supsteiner_level = 2; + addsteiner_algo = 1; + coarsen_param = 0; + weighted_param = 0; + fliplinklevel = -1; + flipstarsize = -1; + fliplinklevelinc = 1; + reflevel = 3; + optscheme = 7; + optlevel = 2; + delmaxfliplevel = 1; + order = 1; + reversetetori = 0; + steinerleft = -1; + no_sort = 0; + hilbert_order = 52; //-1; + hilbert_limit = 8; + brio_threshold = 64; + brio_ratio = 0.125; + facet_separate_ang_tol = 179.9; + facet_overlap_ang_tol = 0.1; + facet_small_ang_tol = 15.0; + maxvolume = -1.0; + minratio = 2.0; + mindihedral = 0.0; + optmaxdihedral = 165.00; + optminsmtdihed = 179.00; + optminslidihed = 179.00; + epsilon = 1.0e-8; + coarsen_percent = 1.0; + object = NODES; + + commandline[0] = '\0'; + infilename[0] = '\0'; + outfilename[0] = '\0'; + addinfilename[0] = '\0'; + bgmeshfilename[0] = '\0'; + + hole_mesh = 0; + hole_mesh_filename[0] = '\0'; + apply_flow_bc = 0; + + } + +}; // class tetgenbehavior + +/////////////////////////////////////////////////////////////////////////////// +// // +// Robust Geometric predicates // +// // +// Geometric predicates are simple tests of spatial relations of a set of d- // +// dimensional points, such as the orientation test and the point-in-sphere // +// test. Each of these tests is performed by evaluating the sign of a deter- // +// minant of a matrix whose entries are the coordinates of these points. If // +// the computation is performed by using the floating-point numbers, e.g., // +// the single or double precision numbers in C/C++, roundoff error may cause // +// an incorrect result. This may either lead to a wrong result or eventually // +// lead to a failure of the program. Computing the predicates exactly will // +// avoid the error and make the program robust. // +// // +// The following routines are the robust geometric predicates for 3D orient- // +// ation test and point-in-sphere test. They were implemented by Shewchuk. // +// The source code are generously provided by him in the public domain, // +// http://www.cs.cmu.edu/~quake/robust.html. predicates.cxx is a C++ version // +// of the original C code. // +// // +// The original predicates of Shewchuk only use "dynamic filters", i.e., it // +// computes the error at run time step by step. TetGen first adds a "static // +// filter" in each predicate. It estimates the maximal possible error in all // +// cases. So it can safely and quickly answer many easy cases. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void exactinit(int, int, int, REAL, REAL, REAL); +REAL orient3d(REAL *pa, REAL *pb, REAL *pc, REAL *pd); +REAL insphere(REAL *pa, REAL *pb, REAL *pc, REAL *pd, REAL *pe); +REAL orient4d(REAL *pa, REAL *pb, REAL *pc, REAL *pd, REAL *pe, + REAL ah, REAL bh, REAL ch, REAL dh, REAL eh); + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetgenmesh // +// // +// A structure for creating and updating tetrahedral meshes. // +// // +/////////////////////////////////////////////////////////////////////////////// + +class tetgenmesh { + +public: + +/////////////////////////////////////////////////////////////////////////////// +// // +// Mesh data structure // +// // +// A tetrahedral mesh T of a 3D piecewise linear complex (PLC) X is a 3D // +// simplicial complex whose underlying space is equal to the space of X. T // +// contains a 2D subcomplex S which is a triangular mesh of the boundary of // +// X. S contains a 1D subcomplex L which is a linear mesh of the boundary of // +// S. Faces and edges in S and L are respectively called subfaces and segme- // +// nts to distinguish them from others in T. // +// // +// TetGen stores the tetrahedra and vertices of T. The basic structure of a // +// tetrahedron contains pointers to its vertices and adjacent tetrahedra. A // +// vertex stores its x-, y-, and z-coordinates, and a pointer to a tetrahed- // +// ron containing it. Both tetrahedra and vertices may contain user data. // +// // +// Each face of T belongs to either two tetrahedra or one tetrahedron. In // +// the latter case, the face is an exterior boundary face of T. TetGen adds // +// fictitious tetrahedra (one-to-one) at such faces, and connects them to an // +// "infinite vertex" (which has no geometric coordinates). One can imagine // +// such a vertex lies in 4D space and is visible by all exterior boundary // +// faces. The extended set of tetrahedra (including the infinite vertex) is // +// a tetrahedralization of a 3-pseudomanifold without boundary. It has the // +// property that every face is shared by exactly two tetrahedra. // +// // +// The current version of TetGen stores explicitly the subfaces and segments // +// (which are in surface mesh S and the linear mesh L), respectively. Extra // +// pointers are allocated in tetrahedra and subfaces to point each others. // +// // +/////////////////////////////////////////////////////////////////////////////// + + // The tetrahedron data structure. It includes the following fields: + // - a list of four adjoining tetrahedra; + // - a list of four vertices; + // - a pointer to a list of four subfaces (optional, for -p switch); + // - a pointer to a list of six segments (optional, for -p switch); + // - a list of user-defined floating-point attributes (optional); + // - a volume constraint (optional, for -a switch); + // - an integer of element marker (and flags); + // The structure of a tetrahedron is an array of pointers. Its actual size + // (the length of the array) is determined at runtime. + + typedef REAL **tetrahedron; + + // The subface data structure. It includes the following fields: + // - a list of three adjoining subfaces; + // - a list of three vertices; + // - a list of three adjoining segments; + // - two adjoining tetrahedra; + // - an area constraint (optional, for -q switch); + // - an integer for boundary marker; + // - an integer for type, flags, etc. + + typedef REAL **shellface; + + // The point data structure. It includes the following fields: + // - x, y and z coordinates; + // - a list of user-defined point attributes (optional); + // - u, v coordinates (optional, for -s switch); + // - a metric tensor (optional, for -q or -m switch); + // - a pointer to an adjacent tetrahedron; + // - a pointer to a parent (or a duplicate) point; + // - a pointer to an adjacent subface or segment (optional, -p switch); + // - a pointer to a tet in background mesh (optional, for -m switch); + // - an integer for boundary marker (point index); + // - an integer for point type (and flags). + // - an integer for geometry tag (optional, for -s switch). + // The structure of a point is an array of REALs. Its acutal size is + // determined at the runtime. + + typedef REAL *point; + +/////////////////////////////////////////////////////////////////////////////// +// // +// Handles // +// // +// Navigation and manipulation in a tetrahedralization are accomplished by // +// operating on structures referred as ``handles". A handle is a pair (t,v), // +// where t is a pointer to a tetrahedron, and v is a 4-bit integer, in the // +// range from 0 to 11. v is called the ``version'' of a tetrahedron, it rep- // +// resents a directed edge of a specific face of the tetrahedron. // +// // +// There are 12 even permutations of the four vertices, each of them corres- // +// ponds to a directed edge (a version) of the tetrahedron. The 12 versions // +// can be grouped into 4 distinct ``edge rings'' in 4 ``oriented faces'' of // +// this tetrahedron. One can encode each version (a directed edge) into a // +// 4-bit integer such that the two upper bits encode the index (from 0 to 2) // +// of this edge in the edge ring, and the two lower bits encode the index ( // +// from 0 to 3) of the oriented face which contains this edge. // +// // +// The four vertices of a tetrahedron are indexed from 0 to 3 (according to // +// their storage in the data structure). Give each face the same index as // +// the node opposite it in the tetrahedron. Denote the edge connecting face // +// i to face j as i/j. We number the twelve versions as follows: // +// // +// | edge 0 edge 1 edge 2 // +// --------|-------------------------------- // +// face 0 | 0 (0/1) 4 (0/3) 8 (0/2) // +// face 1 | 1 (1/2) 5 (1/3) 9 (1/0) // +// face 2 | 2 (2/3) 6 (2/1) 10 (2/0) // +// face 3 | 3 (3/0) 7 (3/1) 11 (3/2) // +// // +// Similarly, navigation and manipulation in a (boundary) triangulation are // +// done by using handles of triangles. Each handle is a pair (s, v), where s // +// is a pointer to a triangle, and v is a version in the range from 0 to 5. // +// Each version corresponds to a directed edge of this triangle. // +// // +// Number the three vertices of a triangle from 0 to 2 (according to their // +// storage in the data structure). Give each edge the same index as the node // +// opposite it in the triangle. The six versions of a triangle are: // +// // +// | edge 0 edge 1 edge 2 // +// ---------------|-------------------------- // +// ccw orieation | 0 2 4 // +// cw orieation | 1 3 5 // +// // +// In the following, a 'triface' is a handle of tetrahedron, and a 'face' is // +// a handle of a triangle. // +// // +/////////////////////////////////////////////////////////////////////////////// + + class triface { + public: + tetrahedron *tet; + int ver; // Range from 0 to 11. + triface() : tet(0), ver(0) {} + triface& operator=(const triface& t) { + tet = t.tet; ver = t.ver; + return *this; + } + }; + + class face { + public: + shellface *sh; + int shver; // Range from 0 to 5. + face() : sh(0), shver(0) {} + face& operator=(const face& s) { + sh = s.sh; shver = s.shver; + return *this; + } + }; + +/////////////////////////////////////////////////////////////////////////////// +// // +// Arraypool // +// // +// A dynamic linear array. (It is written by J. Shewchuk) // +// // +// Each arraypool contains an array of pointers to a number of blocks. Each // +// block contains the same fixed number of objects. Each index of the array // +// addresses a particular object in the pool. The most significant bits add- // +// ress the index of the block containing the object. The less significant // +// bits address this object within the block. // +// // +// 'objectbytes' is the size of one object in blocks; 'log2objectsperblock' // +// is the base-2 logarithm of 'objectsperblock'; 'objects' counts the number // +// of allocated objects; 'totalmemory' is the total memory in bytes. // +// // +/////////////////////////////////////////////////////////////////////////////// + + class arraypool { + + public: + + int objectbytes; + int objectsperblock; + int log2objectsperblock; + int objectsperblockmark; + int toparraylen; + char **toparray; + long objects; + unsigned long totalmemory; + + void restart(); + void poolinit(int sizeofobject, int log2objperblk); + char* getblock(int objectindex); + void* lookup(int objectindex); + int newindex(void **newptr); + + arraypool(int sizeofobject, int log2objperblk); + ~arraypool(); + }; + +// fastlookup() -- A fast, unsafe operation. Return the pointer to the object +// with a given index. Note: The object's block must have been allocated, +// i.e., by the function newindex(). + +#define fastlookup(pool, index) \ + (void *) ((pool)->toparray[(index) >> (pool)->log2objectsperblock] + \ + ((index) & (pool)->objectsperblockmark) * (pool)->objectbytes) + +/////////////////////////////////////////////////////////////////////////////// +// // +// Memorypool // +// // +// A structure for memory allocation. (It is written by J. Shewchuk) // +// // +// 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. // +// // +/////////////////////////////////////////////////////////////////////////////// + + class memorypool { + + public: + + void **firstblock, **nowblock; + void *nextitem; + void *deaditemstack; + void **pathblock; + void *pathitem; + int alignbytes; + int itembytes, itemwords; + int itemsperblock; + long items, maxitems; + int unallocateditems; + int pathitemsleft; + + memorypool(); + memorypool(int, int, int, int); + ~memorypool(); + + void poolinit(int, int, int, int); + void restart(); + void *alloc(); + void dealloc(void*); + void traversalinit(); + void *traverse(); + }; + +/////////////////////////////////////////////////////////////////////////////// +// // +// badface // +// // +// Despite of its name, a 'badface' can be used to represent one of the // +// following objects: // +// - a face of a tetrahedron which is (possibly) non-Delaunay; // +// - an encroached subsegment or subface; // +// - a bad-quality tetrahedron, i.e, has too large radius-edge ratio; // +// - a sliver, i.e., has good radius-edge ratio but nearly zero volume; // +// - a recently flipped face (saved for undoing the flip later). // +// // +/////////////////////////////////////////////////////////////////////////////// + + class badface { + public: + triface tt; + face ss; + REAL key, cent[6]; // circumcenter or cos(dihedral angles) at 6 edges. + point forg, fdest, fapex, foppo, noppo; + badface *nextitem; + badface() : key(0), forg(0), fdest(0), fapex(0), foppo(0), noppo(0), + nextitem(0) {} + }; + +/////////////////////////////////////////////////////////////////////////////// +// // +// insertvertexflags // +// // +// A collection of flags that pass to the routine insertvertex(). // +// // +/////////////////////////////////////////////////////////////////////////////// + + class insertvertexflags { + + public: + + int iloc; // input/output. + int bowywat, lawson; + int splitbdflag, validflag, respectbdflag; + int rejflag, chkencflag, cdtflag; + int assignmeshsize; + int sloc, sbowywat; + + // Used by Delaunay refinement. + int refineflag; // 0, 1, 2, 3 + triface refinetet; + face refinesh; + int smlenflag; // for useinsertradius. + REAL smlen; // for useinsertradius. + point parentpt; + + insertvertexflags() { + iloc = bowywat = lawson = 0; + splitbdflag = validflag = respectbdflag = 0; + rejflag = chkencflag = cdtflag = 0; + assignmeshsize = 0; + sloc = sbowywat = 0; + + refineflag = 0; + refinetet.tet = NULL; + refinesh.sh = NULL; + smlenflag = 0; + smlen = 0.0; + } + }; + +/////////////////////////////////////////////////////////////////////////////// +// // +// flipconstraints // +// // +// A structure of a collection of data (options and parameters) which pass // +// to the edge flip function flipnm(). // +// // +/////////////////////////////////////////////////////////////////////////////// + + class flipconstraints { + + public: + + // Elementary flip flags. + int enqflag; // (= flipflag) + int chkencflag; + + // Control flags + int unflip; // Undo the performed flips. + int collectnewtets; // Collect the new tets created by flips. + int collectencsegflag; + + // Optimization flags. + int remove_ndelaunay_edge; // Remove a non-Delaunay edge. + REAL bak_tetprism_vol; // The value to be minimized. + REAL tetprism_vol_sum; + int remove_large_angle; // Remove a large dihedral angle at edge. + REAL cosdihed_in; // The input cosine of the dihedral angle (> 0). + REAL cosdihed_out; // The improved cosine of the dihedral angle. + + // Boundary recovery flags. + int checkflipeligibility; + point seg[2]; // A constraining edge to be recovered. + point fac[3]; // A constraining face to be recovered. + point remvert; // A vertex to be removed. + + + flipconstraints() { + enqflag = 0; + chkencflag = 0; + + unflip = 0; + collectnewtets = 0; + collectencsegflag = 0; + + remove_ndelaunay_edge = 0; + bak_tetprism_vol = 0.0; + tetprism_vol_sum = 0.0; + remove_large_angle = 0; + cosdihed_in = 0.0; + cosdihed_out = 0.0; + + checkflipeligibility = 0; + seg[0] = NULL; + fac[0] = NULL; + remvert = NULL; + } + }; + +/////////////////////////////////////////////////////////////////////////////// +// // +// optparameters // +// // +// Optimization options and parameters. // +// // +/////////////////////////////////////////////////////////////////////////////// + + class optparameters { + + public: + + // The one of goals of optimization. + int max_min_volume; // Maximize the minimum volume. + int min_max_aspectratio; // Minimize the maximum aspect ratio. + int min_max_dihedangle; // Minimize the maximum dihedral angle. + + // The initial and improved value. + REAL initval, imprval; + + int numofsearchdirs; + REAL searchstep; + int maxiter; // Maximum smoothing iterations (disabled by -1). + int smthiter; // Performed iterations. + + + optparameters() { + max_min_volume = 0; + min_max_aspectratio = 0; + min_max_dihedangle = 0; + + initval = imprval = 0.0; + + numofsearchdirs = 10; + searchstep = 0.01; + maxiter = -1; // Unlimited smoothing iterations. + smthiter = 0; + + } + }; + + +/////////////////////////////////////////////////////////////////////////////// +// // +// Labels (enumeration declarations) used by TetGen. // +// // +/////////////////////////////////////////////////////////////////////////////// + + // Labels that signify the type of a vertex. + enum verttype {UNUSEDVERTEX, DUPLICATEDVERTEX, RIDGEVERTEX, ACUTEVERTEX, + FACETVERTEX, VOLVERTEX, FREESEGVERTEX, FREEFACETVERTEX, + FREEVOLVERTEX, NREGULARVERTEX, DEADVERTEX}; + + // Labels that signify the result of triangle-triangle intersection test. + enum interresult {DISJOINT, INTERSECT, SHAREVERT, SHAREEDGE, SHAREFACE, + TOUCHEDGE, TOUCHFACE, ACROSSVERT, ACROSSEDGE, ACROSSFACE}; + + // Labels that signify the result of point location. + enum locateresult {UNKNOWN, OUTSIDE, INTETRAHEDRON, ONFACE, ONEDGE, ONVERTEX, + ENCVERTEX, ENCSEGMENT, ENCSUBFACE, NEARVERTEX, NONREGULAR, + INSTAR, BADELEMENT}; + +/////////////////////////////////////////////////////////////////////////////// +// // +// Variables of TetGen // +// // +/////////////////////////////////////////////////////////////////////////////// + + // Pointer to the input data (a set of nodes, a PLC, or a mesh). + tetgenio *in, *addin; + + // Pointer to the switches and parameters. + tetgenbehavior *b; + + // Pointer to a background mesh (contains size specification map). + tetgenmesh *bgm; + + // Memorypools to store mesh elements (points, tetrahedra, subfaces, and + // segments) and extra pointers between tetrahedra, subfaces, and segments. + memorypool *tetrahedrons, *subfaces, *subsegs, *points; + memorypool *tet2subpool, *tet2segpool; + + // Memorypools to store bad-quality (or encroached) elements. + memorypool *badtetrahedrons, *badsubfacs, *badsubsegs; + + // A memorypool to store faces to be flipped. + memorypool *flippool; + arraypool *unflipqueue; + badface *flipstack; + + // Arrays used for point insertion (the Bowyer-Watson algorithm). + arraypool *cavetetlist, *cavebdrylist, *caveoldtetlist; + arraypool *cavetetshlist, *cavetetseglist, *cavetetvertlist; + arraypool *caveencshlist, *caveencseglist; + arraypool *caveshlist, *caveshbdlist, *cavesegshlist; + + // Stacks used for CDT construction and boundary recovery. + arraypool *subsegstack, *subfacstack, *subvertstack; + + // Arrays of encroached segments and subfaces (for mesh refinement). + arraypool *encseglist, *encshlist; + + // The map between facets to their vertices (for mesh refinement). + int *idx2facetlist; + point *facetverticeslist; + + // The map between segments to their endpoints (for mesh refinement). + point *segmentendpointslist; + + // The infinite vertex. + point dummypoint; + // The recently visited tetrahedron, subface. + triface recenttet; + face recentsh; + + // PI is the ratio of a circle's circumference to its diameter. + static REAL PI; + + // Array (size = numberoftetrahedra * 6) for storing high-order nodes of + // tetrahedra (only used when -o2 switch is selected). + point *highordertable; + + // Various variables. + int numpointattrib; // Number of point attributes. + int numelemattrib; // Number of tetrahedron attributes. + int sizeoftensor; // Number of REALs per metric tensor. + int pointmtrindex; // Index to find the metric tensor of a point. + int pointparamindex; // Index to find the u,v coordinates of a point. + int point2simindex; // Index to find a simplex adjacent to a point. + int pointmarkindex; // Index to find boundary marker of a point. + int pointinsradiusindex; // Index to find the insertion radius of a point. + int elemattribindex; // Index to find attributes of a tetrahedron. + int volumeboundindex; // Index to find volume bound of a tetrahedron. + int elemmarkerindex; // Index to find marker of a tetrahedron. + int shmarkindex; // Index to find boundary marker of a subface. + int areaboundindex; // Index to find area bound of a subface. + int checksubsegflag; // Are there segments in the tetrahedralization yet? + int checksubfaceflag; // Are there subfaces in the tetrahedralization yet? + int checkconstraints; // Are there variant (node, seg, facet) constraints? + int nonconvex; // Is current mesh non-convex? + int autofliplinklevel; // The increase of link levels, default is 1. + int useinsertradius; // Save the insertion radius for Steiner points. + long samples; // Number of random samples for point location. + unsigned long randomseed; // Current random number seed. + REAL cosmaxdihed, cosmindihed; // The cosine values of max/min dihedral. + REAL cossmtdihed; // The cosine value of a bad dihedral to be smoothed. + REAL cosslidihed; // The cosine value of the max dihedral of a sliver. + REAL minfaceang, minfacetdihed; // The minimum input (dihedral) angles. + REAL tetprism_vol_sum; // The total volume of tetrahedral-prisms (in 4D). + REAL longest; // The longest possible edge length. + REAL minedgelength; // = longest * b->epsion. + REAL xmax, xmin, ymax, ymin, zmax, zmin; // Bounding box of points. + + // Counters. + long insegments; // Number of input segments. + long hullsize; // Number of exterior boundary faces. + long meshedges; // Number of mesh edges. + long meshhulledges; // Number of boundary mesh edges. + long steinerleft; // Number of Steiner points not yet used. + long dupverts; // Are there duplicated vertices? + long unuverts; // Are there unused vertices? + long nonregularcount; // Are there non-regular vertices? + long st_segref_count, st_facref_count, st_volref_count; // Steiner points. + long fillregioncount, cavitycount, cavityexpcount; + long flip14count, flip26count, flipn2ncount; + long flip23count, flip32count, flip44count, flip41count; + long flip31count, flip22count; + unsigned long totalworkmemory; // Total memory used by working arrays. + + +/////////////////////////////////////////////////////////////////////////////// +// // +// Mesh manipulation primitives // +// // +/////////////////////////////////////////////////////////////////////////////// + + // Fast lookup tables for mesh manipulation primitives. + static int bondtbl[12][12], fsymtbl[12][12]; + static int esymtbl[12], enexttbl[12], eprevtbl[12]; + static int enextesymtbl[12], eprevesymtbl[12]; + static int eorgoppotbl[12], edestoppotbl[12]; + static int facepivot1[12], facepivot2[12][12]; + static int orgpivot[12], destpivot[12], apexpivot[12], oppopivot[12]; + static int tsbondtbl[12][6], stbondtbl[12][6]; + static int tspivottbl[12][6], stpivottbl[12][6]; + static int ver2edge[12], edge2ver[6], epivot[12]; + static int sorgpivot [6], sdestpivot[6], sapexpivot[6]; + static int snextpivot[6]; + + void inittables(); + + // Primitives for tetrahedra. + inline tetrahedron encode(triface& t); + inline tetrahedron encode2(tetrahedron* ptr, int ver); + inline void decode(tetrahedron ptr, triface& t); + inline void bond(triface& t1, triface& t2); + inline void dissolve(triface& t); + inline void esym(triface& t1, triface& t2); + inline void esymself(triface& t); + inline void enext(triface& t1, triface& t2); + inline void enextself(triface& t); + inline void eprev(triface& t1, triface& t2); + inline void eprevself(triface& t); + inline void enextesym(triface& t1, triface& t2); + inline void enextesymself(triface& t); + inline void eprevesym(triface& t1, triface& t2); + inline void eprevesymself(triface& t); + inline void eorgoppo(triface& t1, triface& t2); + inline void eorgoppoself(triface& t); + inline void edestoppo(triface& t1, triface& t2); + inline void edestoppoself(triface& t); + inline void fsym(triface& t1, triface& t2); + inline void fsymself(triface& t); + inline void fnext(triface& t1, triface& t2); + inline void fnextself(triface& t); + inline point org (triface& t); + inline point dest(triface& t); + inline point apex(triface& t); + inline point oppo(triface& t); + inline void setorg (triface& t, point p); + inline void setdest(triface& t, point p); + inline void setapex(triface& t, point p); + inline void setoppo(triface& t, point p); + inline REAL elemattribute(tetrahedron* ptr, int attnum); + inline void setelemattribute(tetrahedron* ptr, int attnum, REAL value); + inline REAL volumebound(tetrahedron* ptr); + inline void setvolumebound(tetrahedron* ptr, REAL value); + inline int elemindex(tetrahedron* ptr); + inline void setelemindex(tetrahedron* ptr, int value); + inline int elemmarker(tetrahedron* ptr); + inline void setelemmarker(tetrahedron* ptr, int value); + inline void infect(triface& t); + inline void uninfect(triface& t); + inline bool infected(triface& t); + inline void marktest(triface& t); + inline void unmarktest(triface& t); + inline bool marktested(triface& t); + inline void markface(triface& t); + inline void unmarkface(triface& t); + inline bool facemarked(triface& t); + inline void markedge(triface& t); + inline void unmarkedge(triface& t); + inline bool edgemarked(triface& t); + inline void marktest2(triface& t); + inline void unmarktest2(triface& t); + inline bool marktest2ed(triface& t); + inline int elemcounter(triface& t); + inline void setelemcounter(triface& t, int value); + inline void increaseelemcounter(triface& t); + inline void decreaseelemcounter(triface& t); + inline bool ishulltet(triface& t); + inline bool isdeadtet(triface& t); + + // Primitives for subfaces and subsegments. + inline void sdecode(shellface sptr, face& s); + inline shellface sencode(face& s); + inline shellface sencode2(shellface *sh, int shver); + inline void spivot(face& s1, face& s2); + inline void spivotself(face& s); + inline void sbond(face& s1, face& s2); + inline void sbond1(face& s1, face& s2); + inline void sdissolve(face& s); + inline point sorg(face& s); + inline point sdest(face& s); + inline point sapex(face& s); + inline void setsorg(face& s, point pointptr); + inline void setsdest(face& s, point pointptr); + inline void setsapex(face& s, point pointptr); + inline void sesym(face& s1, face& s2); + inline void sesymself(face& s); + inline void senext(face& s1, face& s2); + inline void senextself(face& s); + inline void senext2(face& s1, face& s2); + inline void senext2self(face& s); + inline REAL areabound(face& s); + inline void setareabound(face& s, REAL value); + inline int shellmark(face& s); + inline void setshellmark(face& s, int value); + inline void sinfect(face& s); + inline void suninfect(face& s); + inline bool sinfected(face& s); + inline void smarktest(face& s); + inline void sunmarktest(face& s); + inline bool smarktested(face& s); + inline void smarktest2(face& s); + inline void sunmarktest2(face& s); + inline bool smarktest2ed(face& s); + inline void smarktest3(face& s); + inline void sunmarktest3(face& s); + inline bool smarktest3ed(face& s); + inline void setfacetindex(face& f, int value); + inline int getfacetindex(face& f); + + // Primitives for interacting tetrahedra and subfaces. + inline void tsbond(triface& t, face& s); + inline void tsdissolve(triface& t); + inline void stdissolve(face& s); + inline void tspivot(triface& t, face& s); + inline void stpivot(face& s, triface& t); + + // Primitives for interacting tetrahedra and segments. + inline void tssbond1(triface& t, face& seg); + inline void sstbond1(face& s, triface& t); + inline void tssdissolve1(triface& t); + inline void sstdissolve1(face& s); + inline void tsspivot1(triface& t, face& s); + inline void sstpivot1(face& s, triface& t); + + // Primitives for interacting subfaces and segments. + inline void ssbond(face& s, face& edge); + inline void ssbond1(face& s, face& edge); + inline void ssdissolve(face& s); + inline void sspivot(face& s, face& edge); + + // Primitives for points. + inline int pointmark(point pt); + inline void setpointmark(point pt, int value); + inline enum verttype pointtype(point pt); + inline void setpointtype(point pt, enum verttype value); + inline int pointgeomtag(point pt); + inline void setpointgeomtag(point pt, int value); + inline REAL pointgeomuv(point pt, int i); + inline void setpointgeomuv(point pt, int i, REAL value); + inline void pinfect(point pt); + inline void puninfect(point pt); + inline bool pinfected(point pt); + inline void pmarktest(point pt); + inline void punmarktest(point pt); + inline bool pmarktested(point pt); + inline void pmarktest2(point pt); + inline void punmarktest2(point pt); + inline bool pmarktest2ed(point pt); + inline void pmarktest3(point pt); + inline void punmarktest3(point pt); + inline bool pmarktest3ed(point pt); + inline tetrahedron point2tet(point pt); + inline void setpoint2tet(point pt, tetrahedron value); + inline shellface point2sh(point pt); + inline void setpoint2sh(point pt, shellface value); + inline point point2ppt(point pt); + inline void setpoint2ppt(point pt, point value); + inline tetrahedron point2bgmtet(point pt); + inline void setpoint2bgmtet(point pt, tetrahedron value); + inline void setpointinsradius(point pt, REAL value); + inline REAL getpointinsradius(point pt); + inline bool issteinerpoint(point pt); + + // Advanced primitives. + inline void point2tetorg(point pt, triface& t); + inline void point2shorg(point pa, face& s); + inline point farsorg(face& seg); + inline point farsdest(face& seg); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Memory managment // +// // +/////////////////////////////////////////////////////////////////////////////// + + void tetrahedrondealloc(tetrahedron*); + tetrahedron *tetrahedrontraverse(); + tetrahedron *alltetrahedrontraverse(); + void shellfacedealloc(memorypool*, shellface*); + shellface *shellfacetraverse(memorypool*); + void pointdealloc(point); + point pointtraverse(); + + void makeindex2pointmap(point*&); + void makepoint2submap(memorypool*, int*&, face*&); + void maketetrahedron(triface*); + void makeshellface(memorypool*, face*); + void makepoint(point*, enum verttype); + + void initializepools(); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Advanced geometric predicates and calculations // +// // +// TetGen uses a simplified symbolic perturbation scheme from Edelsbrunner, // +// et al [*]. Hence the point-in-sphere test never returns a zero. The idea // +// is to perturb the weights of vertices in the fourth dimension. TetGen // +// uses the indices of the vertices decide the amount of perturbation. It is // +// implemented in the routine insphere_s(). +// // +// The routine tri_edge_test() determines whether or not a triangle and an // +// edge intersect in 3D. If they intersect, their intersection type is also // +// reported. This test is a combination of n 3D orientation tests (n is bet- // +// ween 3 and 9). It uses the robust orient3d() test to make the branch dec- // +// isions. The routine tri_tri_test() determines whether or not two triang- // +// les intersect in 3D. It also uses the robust orient3d() test. // +// // +// There are a number of routines to calculate geometrical quantities, e.g., // +// circumcenters, angles, dihedral angles, face normals, face areas, etc. // +// They are so far done by the default floating-point arithmetics which are // +// non-robust. They should be improved in the future. // +// // +/////////////////////////////////////////////////////////////////////////////// + + // Symbolic perturbations (robust) + REAL insphere_s(REAL*, REAL*, REAL*, REAL*, REAL*); + REAL orient4d_s(REAL*, REAL*, REAL*, REAL*, REAL*, + REAL, REAL, REAL, REAL, REAL); + + // Triangle-edge intersection test (robust) + int tri_edge_2d(point, point, point, point, point, point, int, int*, int*); + int tri_edge_tail(point, point, point, point, point, point, REAL, REAL, int, + int*, int*); + int tri_edge_test(point, point, point, point, point, point, int, int*, int*); + + // Triangle-triangle intersection test (robust) + int tri_edge_inter_tail(point, point, point, point, point, REAL, REAL); + int tri_tri_inter(point, point, point, point, point, point); + + // Linear algebra functions + inline REAL dot(REAL* v1, REAL* v2); + inline void cross(REAL* v1, REAL* v2, REAL* n); + bool lu_decmp(REAL lu[4][4], int n, int* ps, REAL* d, int N); + void lu_solve(REAL lu[4][4], int n, int* ps, REAL* b, int N); + + // An embedded 2-dimensional geometric predicate (non-robust) + REAL incircle3d(point pa, point pb, point pc, point pd); + + // Geometric calculations (non-robust) + REAL orient3dfast(REAL *pa, REAL *pb, REAL *pc, REAL *pd); + inline REAL norm2(REAL x, REAL y, REAL z); + inline REAL distance(REAL* p1, REAL* p2); + void facenormal(point pa, point pb, point pc, REAL *n, int pivot, REAL *lav); + REAL shortdistance(REAL* p, REAL* e1, REAL* e2); + REAL triarea(REAL* pa, REAL* pb, REAL* pc); + REAL interiorangle(REAL* o, REAL* p1, REAL* p2, REAL* n); + void projpt2edge(REAL* p, REAL* e1, REAL* e2, REAL* prj); + void projpt2face(REAL* p, REAL* f1, REAL* f2, REAL* f3, REAL* prj); + bool tetalldihedral(point, point, point, point, REAL*, REAL*, REAL*); + void tetallnormal(point, point, point, point, REAL N[4][3], REAL* volume); + REAL tetaspectratio(point, point, point, point); + bool circumsphere(REAL*, REAL*, REAL*, REAL*, REAL* cent, REAL* radius); + bool orthosphere(REAL*,REAL*,REAL*,REAL*,REAL,REAL,REAL,REAL,REAL*,REAL*); + void tetcircumcenter(point tetorg, point tetdest, point tetfapex, + point tettapex, REAL *circumcenter, REAL *radius); + void planelineint(REAL*, REAL*, REAL*, REAL*, REAL*, REAL*, REAL*); + int linelineint(REAL*, REAL*, REAL*, REAL*, REAL*, REAL*, REAL*, REAL*); + REAL tetprismvol(REAL* pa, REAL* pb, REAL* pc, REAL* pd); + bool calculateabovepoint(arraypool*, point*, point*, point*); + void calculateabovepoint4(point, point, point, point); + + // PLC error reports. + void report_overlapping_facets(face*, face*, REAL dihedang = 0.0); + int report_selfint_edge(point, point, face* sedge, triface* searchtet, + enum interresult); + int report_selfint_face(point, point, point, face* sface, triface* iedge, + int intflag, int* types, int* poss); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Local mesh transformations // +// // +// A local transformation replaces a small set of tetrahedra with another // +// set of tetrahedra which fills the same space and the same boundaries. // +// In 3D, the most simplest local transformations are the elementary flips // +// performed within the convex hull of five vertices: 2-to-3, 3-to-2, 1-to-4,// +// and 4-to-1 flips, where the numbers indicate the number of tetrahedra // +// before and after each flip. The 1-to-4 and 4-to-1 flip involve inserting // +// or deleting a vertex, respectively. // +// There are complex local transformations which can be decomposed as a // +// combination of elementary flips. For example,a 4-to-4 flip which replaces // +// two coplanar edges can be regarded by a 2-to-3 flip and a 3-to-2 flip. // +// Note that the first 2-to-3 flip will temporarily create a degenerate tet- // +// rahedron which is removed immediately by the followed 3-to-2 flip. More // +// generally, a n-to-m flip, where n > 3, m = (n - 2) * 2, which removes an // +// edge can be done by first performing a sequence of (n - 3) 2-to-3 flips // +// followed by a 3-to-2 flip. // +// // +// The routines flip23(), flip32(), and flip41() perform the three element- // +// ray flips. The flip14() is available inside the routine insertpoint(). // +// // +// The routines flipnm() and flipnm_post() implement a generalized edge flip // +// algorithm which uses a combination of elementary flips. // +// // +// The routine insertpoint() implements a variant of Bowyer-Watson's cavity // +// algorithm to insert a vertex. It works for arbitrary tetrahedralization, // +// either Delaunay, or constrained Delaunay, or non-Delaunay. // +// // +/////////////////////////////////////////////////////////////////////////////// + + // The elementary flips. + void flip23(triface*, int, flipconstraints* fc); + void flip32(triface*, int, flipconstraints* fc); + void flip41(triface*, int, flipconstraints* fc); + + // A generalized edge flip. + int flipnm(triface*, int n, int level, int, flipconstraints* fc); + int flipnm_post(triface*, int n, int nn, int, flipconstraints* fc); + + // Point insertion. + int insertpoint(point, triface*, face*, face*, insertvertexflags*); + void insertpoint_abort(face*, insertvertexflags*); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Delaunay tetrahedralization // +// // +// The routine incrementaldelaunay() implemented two incremental algorithms // +// for constructing Delaunay tetrahedralizations (DTs): the Bowyer-Watson // +// (B-W) algorithm and the incremental flip algorithm of Edelsbrunner and // +// Shah, "Incremental topological flipping works for regular triangulation," // +// Algorithmica, 15:233-241, 1996. // +// // +// The routine incrementalflip() implements the flip algorithm of [Edelsbru- // +// nner and Shah, 1996]. It flips a queue of locally non-Delaunay faces (in // +// an arbitrary order). The success is guaranteed when the Delaunay tetrah- // +// edralization is constructed incrementally by adding one vertex at a time. // +// // +// The routine locate() finds a tetrahedron contains a new point in current // +// DT. It uses a simple stochastic walk algorithm: starting from an arbitr- // +// ary tetrahedron in DT, it finds the destination by visit one tetrahedron // +// at a time, randomly chooses a tetrahedron if there are more than one // +// choices. This algorithm terminates due to Edelsbrunner's acyclic theorem. // +// Choose a good starting tetrahedron is crucial to the speed of the walk. // +// TetGen originally uses the "jump-and-walk" algorithm of Muecke, E.P., // +// Saias, I., and Zhu, B. "Fast Randomized Point Location Without Preproces- // +// sing." In Proceedings of the 12th ACM Symposium on Computational Geometry,// +// 274-283, 1996. It first randomly samples several tetrahedra in the DT // +// and then choosing the closet one to start walking. // +// The above algorithm slows download dramatically as the number of points // +// grows -- reported in Amenta, N., Choi, S. and Rote, G., "Incremental // +// construction con {BRIO}," In Proceedings of 19th ACM Symposium on // +// Computational Geometry, 211-219, 2003. On the other hand, Liu and // +// Snoeyink showed that the point location can be made in constant time if // +// the points are pre-sorted so that the nearby points in space have nearby // +// indices, then adding the points in this order. They sorted the points // +// along the 3D Hilbert curve. // +// // +// The routine hilbert_sort3() sorts a set of 3D points along the 3D Hilbert // +// curve. It recursively splits a point set according to the Hilbert indices // +// mapped to the subboxes of the bounding box of the point set. // +// The Hilbert indices is calculated by Butz's algorithm in 1971. A nice // +// exposition of this algorithm can be found in the paper of Hamilton, C., // +// "Compact Hilbert Indices", Technical Report CS-2006-07, Computer Science, // +// Dalhousie University, 2006 (the Section 2). My implementation also refer- // +// enced Steven Witham's implementation of "Hilbert walk" (hopefully, it is // +// still available at: http://www.tiac.net/~sw/2008/10/Hilbert/). // +// // +// TetGen sorts the points using the method in the paper of Boissonnat,J.-D.,// +// Devillers, O. and Hornus, S. "Incremental Construction of the Delaunay // +// Triangulation and the Delaunay Graph in Medium Dimension," In Proceedings // +// of the 25th ACM Symposium on Computational Geometry, 2009. // +// It first randomly sorts the points into subgroups using the Biased Rand-// +// omized Insertion Ordering (BRIO) of Amenta et al 2003, then sorts the // +// points in each subgroup along the 3D Hilbert curve. Inserting points in // +// this order ensures a randomized "sprinkling" of the points over the // +// domain, while sorting of each subset ensures locality. // +// // +/////////////////////////////////////////////////////////////////////////////// + + void transfernodes(); + + // Point sorting. + int transgc[8][3][8], tsb1mod3[8]; + void hilbert_init(int n); + int hilbert_split(point* vertexarray, int arraysize, int gc0, int gc1, + REAL, REAL, REAL, REAL, REAL, REAL); + void hilbert_sort3(point* vertexarray, int arraysize, int e, int d, + REAL, REAL, REAL, REAL, REAL, REAL, int depth); + void brio_multiscale_sort(point*,int,int threshold,REAL ratio,int* depth); + + // Point location. + unsigned long randomnation(unsigned int choices); + void randomsample(point searchpt, triface *searchtet); + enum locateresult locate(point searchpt, triface *searchtet, + int chkencflag = 0); + + // Incremental flips. + void flippush(badface*&, triface*); + int incrementalflip(point newpt, int, flipconstraints *fc); + + // Incremental Delaunay construction. + void initialdelaunay(point pa, point pb, point pc, point pd); + void incrementaldelaunay(clock_t&); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Surface triangulation // +// // +/////////////////////////////////////////////////////////////////////////////// + + void flipshpush(face*); + void flip22(face*, int, int); + void flip31(face*, int); + long lawsonflip(); + int sinsertvertex(point newpt, face*, face*, int iloc, int bowywat, int); + int sremovevertex(point delpt, face*, face*, int lawson); + + enum locateresult slocate(point, face*, int, int, int); + enum interresult sscoutsegment(face*, point, int, int, int); + void scarveholes(int, REAL*); + int triangulate(int, arraypool*, arraypool*, int, REAL*); + + void unifysegments(); + void identifyinputedges(point*); + void mergefacets(); + void removesmallangles(); + void meshsurface(); + + void interecursive(shellface** subfacearray, int arraysize, int axis, + REAL, REAL, REAL, REAL, REAL, REAL, int* internum); + void detectinterfaces(); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Constrained Delaunay tetrahedralization // +// // +// A constrained Delaunay tetrahedralization (CDT) is a variation of a Dela- // +// unay tetrahedralization (DT) that is constrained to respect the boundary // +// of a 3D PLC (domain). In a CDT of a 3D PLC, every vertex or edge of the // +// PLC is also a vertex or an edge of the CDT, every polygon of the PLC is a // +// union of triangles of the CDT. A crucial difference between a CDT and a // +// DT is that triangles in the PLC's polygons are not required to be locally // +// Delaunay, which frees the CDT to better respect the PLC's polygons. CDTs // +// have optimal properties similar to those of DTs. // +// // +// Steiner Points and Steiner CDTs. It is known that even a simple 3D polyh- // +// edron may not have a tetrahedralization which only uses its own vertices. // +// Some extra points, so-called "Steiner points" are needed in order to form // +// a tetrahedralization of such polyhedron. It is true for tetrahedralizing // +// a 3D PLC as well. A Steiner CDT of a 3D PLC is a CDT containing Steiner // +// points. The CDT algorithms of TetGen in general create Steiner CDTs. // +// Almost all of the Steiner points are added in the edges of the PLC. They // +// guarantee the existence of a CDT of the modified PLC. // +// // +// The routine constraineddelaunay() starts from a DT of the vertices of a // +// PLC and creates a (Steiner) CDT of the PLC (including Steiner points). It // +// is constructed by two steps, (1) segment recovery and (2) facet (polygon) // +// recovery. Each step is accomplished by its own algorithm. // +// // +// The routine delaunizesegments() implements the segment recovery algorithm // +// of Si, H. and Gaertner, K. "Meshing Piecewise Linear Complexes by Constr- // +// ained Delaunay Tetrahedralizations," In Proceedings of the 14th Internat- // +// ional Meshing Roundtable, 147--163, 2005. It adds Steiner points into // +// non-Delaunay segments until all subsegments appear together in a DT. The // +// running time of this algorithm is proportional to the number of added // +// Steiner points. // +// // +// There are two incremental facet recovery algorithms: the cavity re-trian- // +// gulation algorithm of Si, H. and Gaertner, K. "3D Boundary Recovery by // +// Constrained Delaunay Tetrahedralization," International Journal for Numer-// +// ical Methods in Engineering, 85:1341-1364, 2011, and the flip algorithm // +// of Shewchuk, J. "Updating and Constructing Constrained Delaunay and // +// Constrained Regular Triangulations by Flips." In Proceedings of the 19th // +// ACM Symposium on Computational Geometry, 86-95, 2003. // +// // +// It is guaranteed in theory, no Steiner point is needed in both algorithms // +// However, a facet with non-coplanar vertices might cause the additions of // +// Steiner points. It is discussed in the paper of Si, H., and Shewchuk, J.,// +// "Incrementally Constructing and Updating Constrained Delaunay // +// Tetrahedralizations with Finite Precision Coordinates." In Proceedings of // +// the 21th International Meshing Roundtable, 2012. // +// // +// Our implementation of the facet recovery algorithms recover a "missing // +// region" at a time. Each missing region is a subset of connected interiors // +// of a polygon. The routine formcavity() creates the cavity of crossing // +// tetrahedra of the missing region. // +// // +// The cavity re-triangulation algorithm is implemented by three subroutines,// +// delaunizecavity(), fillcavity(), and carvecavity(). Since it may fail due // +// to non-coplanar vertices, the subroutine restorecavity() is used to rest- // +// ore the original cavity. // +// // +// The routine flipinsertfacet() implements the flip algorithm. The subrout- // +// ine flipcertify() is used to maintain the priority queue of flips. // +// // +// The routine refineregion() is called when the facet recovery algorithm // +// fail to recover a missing region. It inserts Steiner points to refine the // +// missing region. In order to avoid inserting Steiner points very close to // +// existing segments. The classical encroachment rules of the Delaunay // +// refinement algorithm are used to choose the Steiner points. // +// // +// The routine constrainedfacets() does the facet recovery by using either // +// the cavity re-triangulation algorithm (default) or the flip algorithm. It // +// results a CDT of the (modified) PLC (including Steiner points). // +// // +/////////////////////////////////////////////////////////////////////////////// + + void makesegmentendpointsmap(); + + enum interresult finddirection(triface* searchtet, point endpt); + enum interresult scoutsegment(point, point, face*, triface*, point*, + arraypool*); + int getsteinerptonsegment(face* seg, point refpt, point steinpt); + void delaunizesegments(); + + int scoutsubface(face* searchsh,triface* searchtet,int shflag); + void formregion(face*, arraypool*, arraypool*, arraypool*); + int scoutcrossedge(triface& crosstet, arraypool*, arraypool*); + bool formcavity(triface*, arraypool*, arraypool*, arraypool*, arraypool*, + arraypool*, arraypool*); + // Facet recovery by cavity re-triangulation [Si and Gaertner 2011]. + void delaunizecavity(arraypool*, arraypool*, arraypool*, arraypool*, + arraypool*, arraypool*); + bool fillcavity(arraypool*, arraypool*, arraypool*, arraypool*, + arraypool*, arraypool*, triface* crossedge); + void carvecavity(arraypool*, arraypool*, arraypool*); + void restorecavity(arraypool*, arraypool*, arraypool*, arraypool*); + // Facet recovery by flips [Shewchuk 2003]. + void flipcertify(triface *chkface, badface **pqueue, point, point, point); + void flipinsertfacet(arraypool*, arraypool*, arraypool*, arraypool*); + + int insertpoint_cdt(point, triface*, face*, face*, insertvertexflags*, + arraypool*, arraypool*, arraypool*, arraypool*, + arraypool*, arraypool*); + void refineregion(face&, arraypool*, arraypool*, arraypool*, arraypool*, + arraypool*, arraypool*); + void constrainedfacets(); + + void constraineddelaunay(clock_t&); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Constrained tetrahedralizations. // +// // +/////////////////////////////////////////////////////////////////////////////// + + int checkflipeligibility(int fliptype, point, point, point, point, point, + int level, int edgepivot, flipconstraints* fc); + + int removeedgebyflips(triface*, flipconstraints*); + int removefacebyflips(triface*, flipconstraints*); + + int recoveredgebyflips(point, point, face*, triface*, int fullsearch); + int add_steinerpt_in_schoenhardtpoly(triface*, int, int chkencflag); + int add_steinerpt_in_segment(face*, int searchlevel); + int addsteiner4recoversegment(face*, int); + int recoversegments(arraypool*, int fullsearch, int steinerflag); + + int recoverfacebyflips(point, point, point, face*, triface*); + int recoversubfaces(arraypool*, int steinerflag); + + int getvertexstar(int, point searchpt, arraypool*, arraypool*, arraypool*); + int getedge(point, point, triface*); + int reduceedgesatvertex(point startpt, arraypool* endptlist); + int removevertexbyflips(point steinerpt); + + int suppressbdrysteinerpoint(point steinerpt); + int suppresssteinerpoints(); + + void recoverboundary(clock_t&); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Mesh reconstruction // +// // +/////////////////////////////////////////////////////////////////////////////// + + void carveholes(); + + void reconstructmesh(); + + int search_face(point p0, point p1, point p2, triface &tetloop); + int search_edge(point p0, point p1, triface &tetloop); + int scoutpoint(point, triface*, int randflag); + REAL getpointmeshsize(point, triface*, int iloc); + void interpolatemeshsize(); + void out_points_to_cells_map(); // in flow_main() + + void insertconstrainedpoints(point *insertarray, int arylen, int rejflag); + void insertconstrainedpoints(tetgenio *addio); + + void collectremovepoints(arraypool *remptlist); + void meshcoarsening(); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Mesh refinement // +// // +// The purpose of mesh refinement is to obtain a tetrahedral mesh with well- // +// -shaped tetrahedra and appropriate mesh size. It is necessary to insert // +// new Steiner points to achieve this property. The questions are (1) how to // +// choose the Steiner points? and (2) how to insert them? // +// // +// Delaunay refinement is a technique first developed by Chew [1989] and // +// Ruppert [1993, 1995] to generate quality triangular meshes in the plane. // +// It provides guarantee on the smallest angle of the triangles. Rupper's // +// algorithm guarantees that the mesh is size-optimal (to within a constant // +// factor) among all meshes with the same quality. // +// Shewchuk generalized Ruppert's algorithm into 3D in his PhD thesis // +// [Shewchuk 1997]. A short version of his algorithm appears in "Tetrahedral // +// Mesh Generation by Delaunay Refinement," In Proceedings of the 14th ACM // +// Symposium on Computational Geometry, 86-95, 1998. It guarantees that all // +// tetrahedra of the output mesh have a "radius-edge ratio" (equivalent to // +// the minimal face angle) bounded. However, it does not remove slivers, a // +// type of very flat tetrahedra which can have no small face angles but have // +// very small (and large) dihedral angles. Moreover, it may not terminate if // +// the input PLC contains "sharp features", e.g., two edges (or two facets) // +// meet at an acute angle (or dihedral angle). // +// // +// TetGen uses the basic Delaunay refinement scheme to insert Steiner points.// +// While it always maintains a constrained Delaunay mesh. The algorithm is // +// described in Si, H., "Adaptive Constrained Delaunay Mesh Generation," // +// International Journal for Numerical Methods in Engineering, 75:856-880. // +// This algorithm always terminates and sharp features are easily preserved. // +// The mesh has good quality (same as Shewchuk's Delaunay refinement algori- // +// thm) in the bulk of the mesh domain. Moreover, it supports the generation // +// of adaptive mesh according to a (isotropic) mesh sizing function. // +// // +/////////////////////////////////////////////////////////////////////////////// + + void makefacetverticesmap(); + int segsegadjacent(face *, face *); + int segfacetadjacent(face *checkseg, face *checksh); + int facetfacetadjacent(face *, face *); + void save_segmentpoint_insradius(point segpt, point parentpt, REAL r); + void save_facetpoint_insradius(point facpt, point parentpt, REAL r); + void enqueuesubface(memorypool*, face*); + void enqueuetetrahedron(triface*); + + int checkseg4encroach(point pa, point pb, point checkpt); + int checkseg4split(face *chkseg, point&, int&); + int splitsegment(face *splitseg, point encpt, REAL, point, point, int, int); + void repairencsegs(int chkencflag); + + int checkfac4encroach(point, point, point, point checkpt, REAL*, REAL*); + int checkfac4split(face *chkfac, point& encpt, int& qflag, REAL *ccent); + int splitsubface(face *splitfac, point, point, int qflag, REAL *ccent, int); + void repairencfacs(int chkencflag); + + int checktet4split(triface *chktet, int& qflag, REAL *ccent); + int splittetrahedron(triface* splittet,int qflag,REAL *ccent, int); + void repairbadtets(int chkencflag); + + void delaunayrefinement(); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Mesh optimization // +// // +/////////////////////////////////////////////////////////////////////////////// + + long lawsonflip3d(flipconstraints *fc); + void recoverdelaunay(); + + int gettetrahedron(point, point, point, point, triface *); + long improvequalitybyflips(); + + int smoothpoint(point smtpt, arraypool*, int ccw, optparameters *opm); + long improvequalitybysmoothing(optparameters *opm); + + int splitsliver(triface *, REAL, int); + long removeslivers(int); + + void optimizemesh(); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Mesh check and statistics // +// // +/////////////////////////////////////////////////////////////////////////////// + + // Mesh validations. + int checkmesh(int topoflag); + int checkshells(); + int checksegments(); + int checkdelaunay(int perturb = 1); + int checkregular(int); + int checkconforming(int); + + // Mesh statistics. + void printfcomma(unsigned long n); + void qualitystatistics(); + void memorystatistics(); + void statistics(); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Mesh output // +// // +/////////////////////////////////////////////////////////////////////////////// + + void jettisonnodes(); + void highorder(); + void indexelements(); + void numberedges(); + void outnodes(tetgenio*); + void outmetrics(tetgenio*); + void outelements(tetgenio*); + void outfaces(tetgenio*); + void outhullfaces(tetgenio*); + void outsubfaces(tetgenio*); + void outedges(tetgenio*); + void outsubsegments(tetgenio*); + void outneighbors(tetgenio*); + void outvoronoi(tetgenio*); + void outsmesh(char*); + void outmesh2medit(char*); + void outmesh2vtk(char*); + + + + +/////////////////////////////////////////////////////////////////////////////// +// // +// Constructor & destructor // +// // +/////////////////////////////////////////////////////////////////////////////// + + void initializetetgenmesh() + { + in = addin = NULL; + b = NULL; + bgm = NULL; + + tetrahedrons = subfaces = subsegs = points = NULL; + badtetrahedrons = badsubfacs = badsubsegs = NULL; + tet2segpool = tet2subpool = NULL; + flippool = NULL; + + dummypoint = NULL; + flipstack = NULL; + unflipqueue = NULL; + + cavetetlist = cavebdrylist = caveoldtetlist = NULL; + cavetetshlist = cavetetseglist = cavetetvertlist = NULL; + caveencshlist = caveencseglist = NULL; + caveshlist = caveshbdlist = cavesegshlist = NULL; + + subsegstack = subfacstack = subvertstack = NULL; + encseglist = encshlist = NULL; + idx2facetlist = NULL; + facetverticeslist = NULL; + segmentendpointslist = NULL; + + highordertable = NULL; + + numpointattrib = numelemattrib = 0; + sizeoftensor = 0; + pointmtrindex = 0; + pointparamindex = 0; + pointmarkindex = 0; + point2simindex = 0; + pointinsradiusindex = 0; + elemattribindex = 0; + volumeboundindex = 0; + shmarkindex = 0; + areaboundindex = 0; + checksubsegflag = 0; + checksubfaceflag = 0; + checkconstraints = 0; + nonconvex = 0; + autofliplinklevel = 1; + useinsertradius = 0; + samples = 0l; + randomseed = 1l; + minfaceang = minfacetdihed = PI; + tetprism_vol_sum = 0.0; + longest = minedgelength = 0.0; + xmax = xmin = ymax = ymin = zmax = zmin = 0.0; + + insegments = 0l; + hullsize = 0l; + meshedges = meshhulledges = 0l; + steinerleft = -1; + dupverts = 0l; + unuverts = 0l; + nonregularcount = 0l; + st_segref_count = st_facref_count = st_volref_count = 0l; + fillregioncount = cavitycount = cavityexpcount = 0l; + flip14count = flip26count = flipn2ncount = 0l; + flip23count = flip32count = flip44count = flip41count = 0l; + flip22count = flip31count = 0l; + totalworkmemory = 0l; + + + } // tetgenmesh() + + void freememory() + { + if (bgm != NULL) { + delete bgm; + } + + if (points != (memorypool *) NULL) { + delete points; + delete [] dummypoint; + } + if (tetrahedrons != (memorypool *) NULL) { + delete tetrahedrons; + } + if (subfaces != (memorypool *) NULL) { + delete subfaces; + delete subsegs; + } + if (tet2segpool != NULL) { + delete tet2segpool; + delete tet2subpool; + } + + if (badtetrahedrons) { + delete badtetrahedrons; + } + if (badsubfacs) { + delete badsubfacs; + } + if (badsubsegs) { + delete badsubsegs; + } + if (encseglist) { + delete encseglist; + } + if (encshlist) { + delete encshlist; + } + + if (flippool != NULL) { + delete flippool; + delete unflipqueue; + } + + if (cavetetlist != NULL) { + delete cavetetlist; + delete cavebdrylist; + delete caveoldtetlist; + delete cavetetvertlist; + } + + if (caveshlist != NULL) { + delete caveshlist; + delete caveshbdlist; + delete cavesegshlist; + delete cavetetshlist; + delete cavetetseglist; + delete caveencshlist; + delete caveencseglist; + } + + if (subsegstack != NULL) { + delete subsegstack; + delete subfacstack; + delete subvertstack; + } + + if (idx2facetlist != NULL) { + delete [] idx2facetlist; + delete [] facetverticeslist; + } + + if (segmentendpointslist != NULL) { + delete [] segmentendpointslist; + } + + if (highordertable != NULL) { + delete [] highordertable; + } + + initializetetgenmesh(); + } + + tetgenmesh() + { + initializetetgenmesh(); + } + + ~tetgenmesh() + { + freememory(); + } // ~tetgenmesh() + +}; // End of class tetgenmesh. + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetrahedralize() Interface for using TetGen's library to generate // +// Delaunay tetrahedralizations, constrained Delaunay // +// tetrahedralizations, quality tetrahedral meshes. // +// // +// 'in' is an object of 'tetgenio' which contains a PLC you want to tetrahed-// +// ralize or a previously generated tetrahedral mesh you want to refine. It // +// must not be a NULL. 'out' is another object of 'tetgenio' for storing the // +// generated tetrahedral mesh. It can be a NULL. If so, the output will be // +// saved to file(s). If 'bgmin' != NULL, it contains a background mesh which // +// defines a mesh size function. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetrahedralize(tetgenbehavior *b, tetgenio *in, tetgenio *out, + tetgenio *addin = NULL, tetgenio *bgmin = NULL); + +#ifdef TETLIBRARY +void tetrahedralize(char *switches, tetgenio *in, tetgenio *out, + tetgenio *addin = NULL, tetgenio *bgmin = NULL); +#endif // #ifdef TETLIBRARY + +/////////////////////////////////////////////////////////////////////////////// +// // +// terminatetetgen() Terminate TetGen with a given exit code. // +// // +/////////////////////////////////////////////////////////////////////////////// + +// selfint_event, a structure to report self-intersections. +// +// - e_type, report the type of self-intersections, +// it may be one of: +// 0, reserved. +// 1, two edges intersect, +// 2, an edge and a triangle intersect, +// 3, two triangles intersect, +// 4, two edges are overlapping, +// 5, an edge and a triangle are overlapping, +// 6, two triangles are overlapping, +// 7, a vertex lies in an edge, +// 8, a vertex lies in a facet, + +class selfint_event { +public: + int e_type; + int f_marker1; // Tag of the 1st facet. + int s_marker1; // Tag of the 1st segment. + int f_vertices1[3]; + int f_marker2; // Tag of the 2nd facet. + int s_marker2; // Tag of the 2nd segment. + int f_vertices2[3]; + REAL int_point[3]; + selfint_event() { + e_type = 0; + f_marker1 = f_marker2 = 0; + s_marker1 = s_marker2 = 0; + } +}; + +static selfint_event sevent; + +inline void terminatetetgen(tetgenmesh *m, int x) +{ +#ifdef TETLIBRARY + throw x; +#else + switch (x) { + case 1: // Out of memory. + printf("Error: Out of memory.\n"); + break; + case 2: // Encounter an internal error. + printf("Please report this bug to Hang.Si@wias-berlin.de. Include\n"); + printf(" the message above, your input data set, and the exact\n"); + printf(" command line you used to run this program, thank you.\n"); + break; + case 3: + printf("A self-intersection was detected. Program stopped.\n"); + printf("Hint: use -d option to detect all self-intersections.\n"); + break; + case 4: + printf("A very small input feature size was detected. Program stopped.\n"); + if (m) { + printf("Hint: use -T option to set a smaller tolerance. Current is %g\n", + m->b->epsilon); + } + break; + case 5: + printf("Two very close input facets were detected. Program stopped.\n"); + printf("Hint: use -Y option to avoid adding Steiner points in boundary.\n"); + break; + case 10: + printf("An input error was detected. Program stopped.\n"); + break; + } // switch (x) + exit(x); +#endif // #ifdef TETLIBRARY +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// Primitives for tetrahedra // +// // +/////////////////////////////////////////////////////////////////////////////// + +// encode() compress a handle into a single pointer. It relies on the +// assumption that all addresses of tetrahedra are aligned to sixteen- +// byte boundaries, so that the last four significant bits are zero. + +inline tetgenmesh::tetrahedron tetgenmesh::encode(triface& t) { + return (tetrahedron) ((uintptr_t) (t).tet | (uintptr_t) (t).ver); +} + +inline tetgenmesh::tetrahedron tetgenmesh::encode2(tetrahedron* ptr, int ver) { + return (tetrahedron) ((uintptr_t) (ptr) | (uintptr_t) (ver)); +} + +// decode() converts a pointer to a handle. The version is extracted from +// the four least significant bits of the pointer. + +inline void tetgenmesh::decode(tetrahedron ptr, triface& t) { + (t).ver = (int) ((uintptr_t) (ptr) & (uintptr_t) 15); + (t).tet = (tetrahedron *) ((uintptr_t) (ptr) ^ (uintptr_t) (t).ver); +} + +// bond() connects two tetrahedra together. (t1,v1) and (t2,v2) must +// refer to the same face and the same edge. + +inline void tetgenmesh::bond(triface& t1, triface& t2) { + t1.tet[t1.ver & 3] = encode2(t2.tet, bondtbl[t1.ver][t2.ver]); + t2.tet[t2.ver & 3] = encode2(t1.tet, bondtbl[t2.ver][t1.ver]); +} + + +// dissolve() a bond (from one side). + +inline void tetgenmesh::dissolve(triface& t) { + t.tet[t.ver & 3] = NULL; +} + +// enext() finds the next edge (counterclockwise) in the same face. + +inline void tetgenmesh::enext(triface& t1, triface& t2) { + t2.tet = t1.tet; + t2.ver = enexttbl[t1.ver]; +} + +inline void tetgenmesh::enextself(triface& t) { + t.ver = enexttbl[t.ver]; +} + +// eprev() finds the next edge (clockwise) in the same face. + +inline void tetgenmesh::eprev(triface& t1, triface& t2) { + t2.tet = t1.tet; + t2.ver = eprevtbl[t1.ver]; +} + +inline void tetgenmesh::eprevself(triface& t) { + t.ver = eprevtbl[t.ver]; +} + +// esym() finds the reversed edge. It is in the other face of the +// same tetrahedron. + +inline void tetgenmesh::esym(triface& t1, triface& t2) { + (t2).tet = (t1).tet; + (t2).ver = esymtbl[(t1).ver]; +} + +inline void tetgenmesh::esymself(triface& t) { + (t).ver = esymtbl[(t).ver]; +} + +// enextesym() finds the reversed edge of the next edge. It is in the other +// face of the same tetrahedron. It is the combination esym() * enext(). + +inline void tetgenmesh::enextesym(triface& t1, triface& t2) { + t2.tet = t1.tet; + t2.ver = enextesymtbl[t1.ver]; +} + +inline void tetgenmesh::enextesymself(triface& t) { + t.ver = enextesymtbl[t.ver]; +} + +// eprevesym() finds the reversed edge of the previous edge. + +inline void tetgenmesh::eprevesym(triface& t1, triface& t2) { + t2.tet = t1.tet; + t2.ver = eprevesymtbl[t1.ver]; +} + +inline void tetgenmesh::eprevesymself(triface& t) { + t.ver = eprevesymtbl[t.ver]; +} + +// eorgoppo() Finds the opposite face of the origin of the current edge. +// Return the opposite edge of the current edge. + +inline void tetgenmesh::eorgoppo(triface& t1, triface& t2) { + t2.tet = t1.tet; + t2.ver = eorgoppotbl[t1.ver]; +} + +inline void tetgenmesh::eorgoppoself(triface& t) { + t.ver = eorgoppotbl[t.ver]; +} + +// edestoppo() Finds the opposite face of the destination of the current +// edge. Return the opposite edge of the current edge. + +inline void tetgenmesh::edestoppo(triface& t1, triface& t2) { + t2.tet = t1.tet; + t2.ver = edestoppotbl[t1.ver]; +} + +inline void tetgenmesh::edestoppoself(triface& t) { + t.ver = edestoppotbl[t.ver]; +} + +// fsym() finds the adjacent tetrahedron at the same face and the same edge. + +inline void tetgenmesh::fsym(triface& t1, triface& t2) { + decode((t1).tet[(t1).ver & 3], t2); + t2.ver = fsymtbl[t1.ver][t2.ver]; +} + + +#define fsymself(t) \ + t1ver = (t).ver; \ + decode((t).tet[(t).ver & 3], (t));\ + (t).ver = fsymtbl[t1ver][(t).ver] + +// fnext() finds the next face while rotating about an edge according to +// a right-hand rule. The face is in the adjacent tetrahedron. It is +// the combination: fsym() * esym(). + +inline void tetgenmesh::fnext(triface& t1, triface& t2) { + decode(t1.tet[facepivot1[t1.ver]], t2); + t2.ver = facepivot2[t1.ver][t2.ver]; +} + + +#define fnextself(t) \ + t1ver = (t).ver; \ + decode((t).tet[facepivot1[(t).ver]], (t)); \ + (t).ver = facepivot2[t1ver][(t).ver] + + +// The following primtives get or set the origin, destination, face apex, +// or face opposite of an ordered tetrahedron. + +inline tetgenmesh::point tetgenmesh::org(triface& t) { + return (point) (t).tet[orgpivot[(t).ver]]; +} + +inline tetgenmesh::point tetgenmesh:: dest(triface& t) { + return (point) (t).tet[destpivot[(t).ver]]; +} + +inline tetgenmesh::point tetgenmesh:: apex(triface& t) { + return (point) (t).tet[apexpivot[(t).ver]]; +} + +inline tetgenmesh::point tetgenmesh:: oppo(triface& t) { + return (point) (t).tet[oppopivot[(t).ver]]; +} + +inline void tetgenmesh:: setorg(triface& t, point p) { + (t).tet[orgpivot[(t).ver]] = (tetrahedron) (p); +} + +inline void tetgenmesh:: setdest(triface& t, point p) { + (t).tet[destpivot[(t).ver]] = (tetrahedron) (p); +} + +inline void tetgenmesh:: setapex(triface& t, point p) { + (t).tet[apexpivot[(t).ver]] = (tetrahedron) (p); +} + +inline void tetgenmesh:: setoppo(triface& t, point p) { + (t).tet[oppopivot[(t).ver]] = (tetrahedron) (p); +} + +#define setvertices(t, torg, tdest, tapex, toppo) \ + (t).tet[orgpivot[(t).ver]] = (tetrahedron) (torg);\ + (t).tet[destpivot[(t).ver]] = (tetrahedron) (tdest); \ + (t).tet[apexpivot[(t).ver]] = (tetrahedron) (tapex); \ + (t).tet[oppopivot[(t).ver]] = (tetrahedron) (toppo) + +// Check or set a tetrahedron's attributes. + +inline REAL tetgenmesh::elemattribute(tetrahedron* ptr, int attnum) { + return ((REAL *) (ptr))[elemattribindex + attnum]; +} + +inline void tetgenmesh::setelemattribute(tetrahedron* ptr, int attnum, + REAL value) { + ((REAL *) (ptr))[elemattribindex + attnum] = value; +} + +// Check or set a tetrahedron's maximum volume bound. + +inline REAL tetgenmesh::volumebound(tetrahedron* ptr) { + return ((REAL *) (ptr))[volumeboundindex]; +} + +inline void tetgenmesh::setvolumebound(tetrahedron* ptr, REAL value) { + ((REAL *) (ptr))[volumeboundindex] = value; +} + +// Get or set a tetrahedron's index (only used for output). +// These two routines use the reserved slot ptr[10]. + +inline int tetgenmesh::elemindex(tetrahedron* ptr) { + int *iptr = (int *) &(ptr[10]); + return iptr[0]; +} + +inline void tetgenmesh::setelemindex(tetrahedron* ptr, int value) { + int *iptr = (int *) &(ptr[10]); + iptr[0] = value; +} + +// Get or set a tetrahedron's marker. +// Set 'value = 0' cleans all the face/edge flags. + +inline int tetgenmesh::elemmarker(tetrahedron* ptr) { + return ((int *) (ptr))[elemmarkerindex]; +} + +inline void tetgenmesh::setelemmarker(tetrahedron* ptr, int value) { + ((int *) (ptr))[elemmarkerindex] = value; +} + +// infect(), infected(), uninfect() -- primitives to flag or unflag a +// tetrahedron. The last bit of the element marker is flagged (1) +// or unflagged (0). + +inline void tetgenmesh::infect(triface& t) { + ((int *) (t.tet))[elemmarkerindex] |= 1; +} + +inline void tetgenmesh::uninfect(triface& t) { + ((int *) (t.tet))[elemmarkerindex] &= ~1; +} + +inline bool tetgenmesh::infected(triface& t) { + return (((int *) (t.tet))[elemmarkerindex] & 1) != 0; +} + +// marktest(), marktested(), unmarktest() -- primitives to flag or unflag a +// tetrahedron. Use the second lowerest bit of the element marker. + +inline void tetgenmesh::marktest(triface& t) { + ((int *) (t.tet))[elemmarkerindex] |= 2; +} + +inline void tetgenmesh::unmarktest(triface& t) { + ((int *) (t.tet))[elemmarkerindex] &= ~2; +} + +inline bool tetgenmesh::marktested(triface& t) { + return (((int *) (t.tet))[elemmarkerindex] & 2) != 0; +} + +// markface(), unmarkface(), facemarked() -- primitives to flag or unflag a +// face of a tetrahedron. From the last 3rd to 6th bits are used for +// face markers, e.g., the last third bit corresponds to loc = 0. + +inline void tetgenmesh::markface(triface& t) { + ((int *) (t.tet))[elemmarkerindex] |= (4 << (t.ver & 3)); +} + +inline void tetgenmesh::unmarkface(triface& t) { + ((int *) (t.tet))[elemmarkerindex] &= ~(4 << (t.ver & 3)); +} + +inline bool tetgenmesh::facemarked(triface& t) { + return (((int *) (t.tet))[elemmarkerindex] & (4 << (t.ver & 3))) != 0; +} + +// markedge(), unmarkedge(), edgemarked() -- primitives to flag or unflag an +// edge of a tetrahedron. From the last 7th to 12th bits are used for +// edge markers, e.g., the last 7th bit corresponds to the 0th edge, etc. +// Remark: The last 7th bit is marked by 2^6 = 64. + +inline void tetgenmesh::markedge(triface& t) { + ((int *) (t.tet))[elemmarkerindex] |= (int) (64 << ver2edge[(t).ver]); +} + +inline void tetgenmesh::unmarkedge(triface& t) { + ((int *) (t.tet))[elemmarkerindex] &= ~(int) (64 << ver2edge[(t).ver]); +} + +inline bool tetgenmesh::edgemarked(triface& t) { + return (((int *) (t.tet))[elemmarkerindex] & + (int) (64 << ver2edge[(t).ver])) != 0; +} + +// marktest2(), unmarktest2(), marktest2ed() -- primitives to flag and unflag +// a tetrahedron. The 13th bit (2^12 = 4096) is used for this flag. + +inline void tetgenmesh::marktest2(triface& t) { + ((int *) (t.tet))[elemmarkerindex] |= (int) (4096); +} + +inline void tetgenmesh::unmarktest2(triface& t) { + ((int *) (t.tet))[elemmarkerindex] &= ~(int) (4096); +} + +inline bool tetgenmesh::marktest2ed(triface& t) { + return (((int *) (t.tet))[elemmarkerindex] & (int) (4096)) != 0; +} + +// elemcounter(), setelemcounter() -- primitives to read or ser a (small) +// integer counter in this tet. It is saved from the 16th bit. On 32 bit +// system, the range of the counter is [0, 2^15 = 32768]. + +inline int tetgenmesh::elemcounter(triface& t) { + return (((int *) (t.tet))[elemmarkerindex]) >> 16; +} + +inline void tetgenmesh::setelemcounter(triface& t, int value) { + int c = ((int *) (t.tet))[elemmarkerindex]; + // Clear the old counter while keep the other flags. + c &= 65535; // sum_{i=0^15} 2^i + c |= (value << 16); + ((int *) (t.tet))[elemmarkerindex] = c; +} + +inline void tetgenmesh::increaseelemcounter(triface& t) { + int c = elemcounter(t); + setelemcounter(t, c + 1); +} + +inline void tetgenmesh::decreaseelemcounter(triface& t) { + int c = elemcounter(t); + setelemcounter(t, c - 1); +} + +// ishulltet() tests if t is a hull tetrahedron. + +inline bool tetgenmesh::ishulltet(triface& t) { + return (point) (t).tet[7] == dummypoint; +} + +// isdeadtet() tests if t is a tetrahedron is dead. + +inline bool tetgenmesh::isdeadtet(triface& t) { + return ((t.tet == NULL) || (t.tet[4] == NULL)); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// Primitives for subfaces and subsegments // +// // +/////////////////////////////////////////////////////////////////////////////// + +// Each subface contains three pointers to its neighboring subfaces, with +// edge versions. To save memory, both information are kept in a single +// pointer. To make this possible, all subfaces are aligned to eight-byte +// boundaries, so that the last three bits of each pointer are zeros. An +// edge version (in the range 0 to 5) is compressed into the last three +// bits of each pointer by 'sencode()'. 'sdecode()' decodes a pointer, +// extracting an edge version and a pointer to the beginning of a subface. + +inline void tetgenmesh::sdecode(shellface sptr, face& s) { + s.shver = (int) ((uintptr_t) (sptr) & (uintptr_t) 7); + s.sh = (shellface *) ((uintptr_t) (sptr) ^ (uintptr_t) (s.shver)); +} + +inline tetgenmesh::shellface tetgenmesh::sencode(face& s) { + return (shellface) ((uintptr_t) s.sh | (uintptr_t) s.shver); +} + +inline tetgenmesh::shellface tetgenmesh::sencode2(shellface *sh, int shver) { + return (shellface) ((uintptr_t) sh | (uintptr_t) shver); +} + +// sbond() bonds two subfaces (s1) and (s2) together. s1 and s2 must refer +// to the same edge. No requirement is needed on their orientations. + +inline void tetgenmesh::sbond(face& s1, face& s2) +{ + s1.sh[s1.shver >> 1] = sencode(s2); + s2.sh[s2.shver >> 1] = sencode(s1); +} + +// sbond1() bonds s1 <== s2, i.e., after bonding, s1 is pointing to s2, +// but s2 is not pointing to s1. s1 and s2 must refer to the same edge. +// No requirement is needed on their orientations. + +inline void tetgenmesh::sbond1(face& s1, face& s2) +{ + s1.sh[s1.shver >> 1] = sencode(s2); +} + +// Dissolve a subface bond (from one side). Note that the other subface +// will still think it's connected to this subface. + +inline void tetgenmesh::sdissolve(face& s) +{ + s.sh[s.shver >> 1] = NULL; +} + +// spivot() finds the adjacent subface (s2) for a given subface (s1). +// s1 and s2 share at the same edge. + +inline void tetgenmesh::spivot(face& s1, face& s2) +{ + shellface sptr = s1.sh[s1.shver >> 1]; + sdecode(sptr, s2); +} + +inline void tetgenmesh::spivotself(face& s) +{ + shellface sptr = s.sh[s.shver >> 1]; + sdecode(sptr, s); +} + +// These primitives determine or set the origin, destination, or apex +// of a subface with respect to the edge version. + +inline tetgenmesh::point tetgenmesh::sorg(face& s) +{ + return (point) s.sh[sorgpivot[s.shver]]; +} + +inline tetgenmesh::point tetgenmesh::sdest(face& s) +{ + return (point) s.sh[sdestpivot[s.shver]]; +} + +inline tetgenmesh::point tetgenmesh::sapex(face& s) +{ + return (point) s.sh[sapexpivot[s.shver]]; +} + +inline void tetgenmesh::setsorg(face& s, point pointptr) +{ + s.sh[sorgpivot[s.shver]] = (shellface) pointptr; +} + +inline void tetgenmesh::setsdest(face& s, point pointptr) +{ + s.sh[sdestpivot[s.shver]] = (shellface) pointptr; +} + +inline void tetgenmesh::setsapex(face& s, point pointptr) +{ + s.sh[sapexpivot[s.shver]] = (shellface) pointptr; +} + +#define setshvertices(s, pa, pb, pc)\ + setsorg(s, pa);\ + setsdest(s, pb);\ + setsapex(s, pc) + +// sesym() reserves the direction of the lead edge. + +inline void tetgenmesh::sesym(face& s1, face& s2) +{ + s2.sh = s1.sh; + s2.shver = (s1.shver ^ 1); // Inverse the last bit. +} + +inline void tetgenmesh::sesymself(face& s) +{ + s.shver ^= 1; +} + +// senext() finds the next edge (counterclockwise) in the same orientation +// of this face. + +inline void tetgenmesh::senext(face& s1, face& s2) +{ + s2.sh = s1.sh; + s2.shver = snextpivot[s1.shver]; +} + +inline void tetgenmesh::senextself(face& s) +{ + s.shver = snextpivot[s.shver]; +} + +inline void tetgenmesh::senext2(face& s1, face& s2) +{ + s2.sh = s1.sh; + s2.shver = snextpivot[snextpivot[s1.shver]]; +} + +inline void tetgenmesh::senext2self(face& s) +{ + s.shver = snextpivot[snextpivot[s.shver]]; +} + + +// Check or set a subface's maximum area bound. + +inline REAL tetgenmesh::areabound(face& s) +{ + return ((REAL *) (s.sh))[areaboundindex]; +} + +inline void tetgenmesh::setareabound(face& s, REAL value) +{ + ((REAL *) (s.sh))[areaboundindex] = value; +} + +// These two primitives read or set a shell marker. Shell markers are used +// to hold user boundary information. + +inline int tetgenmesh::shellmark(face& s) +{ + return ((int *) (s.sh))[shmarkindex]; +} + +inline void tetgenmesh::setshellmark(face& s, int value) +{ + ((int *) (s.sh))[shmarkindex] = value; +} + + + +// sinfect(), sinfected(), suninfect() -- primitives to flag or unflag a +// subface. The last bit of ((int *) ((s).sh))[shmarkindex+1] is flagged. + +inline void tetgenmesh::sinfect(face& s) +{ + ((int *) ((s).sh))[shmarkindex+1] = + (((int *) ((s).sh))[shmarkindex+1] | (int) 1); +} + +inline void tetgenmesh::suninfect(face& s) +{ + ((int *) ((s).sh))[shmarkindex+1] = + (((int *) ((s).sh))[shmarkindex+1] & ~(int) 1); +} + +// Test a subface for viral infection. + +inline bool tetgenmesh::sinfected(face& s) +{ + return (((int *) ((s).sh))[shmarkindex+1] & (int) 1) != 0; +} + +// smarktest(), smarktested(), sunmarktest() -- primitives to flag or unflag +// a subface. The last 2nd bit of the integer is flagged. + +inline void tetgenmesh::smarktest(face& s) +{ + ((int *) ((s).sh))[shmarkindex+1] = + (((int *)((s).sh))[shmarkindex+1] | (int) 2); +} + +inline void tetgenmesh::sunmarktest(face& s) +{ + ((int *) ((s).sh))[shmarkindex+1] = + (((int *)((s).sh))[shmarkindex+1] & ~(int)2); +} + +inline bool tetgenmesh::smarktested(face& s) +{ + return ((((int *) ((s).sh))[shmarkindex+1] & (int) 2) != 0); +} + +// smarktest2(), smarktest2ed(), sunmarktest2() -- primitives to flag or +// unflag a subface. The last 3rd bit of the integer is flagged. + +inline void tetgenmesh::smarktest2(face& s) +{ + ((int *) ((s).sh))[shmarkindex+1] = + (((int *)((s).sh))[shmarkindex+1] | (int) 4); +} + +inline void tetgenmesh::sunmarktest2(face& s) +{ + ((int *) ((s).sh))[shmarkindex+1] = + (((int *)((s).sh))[shmarkindex+1] & ~(int)4); +} + +inline bool tetgenmesh::smarktest2ed(face& s) +{ + return ((((int *) ((s).sh))[shmarkindex+1] & (int) 4) != 0); +} + +// The last 4th bit of ((int *) ((s).sh))[shmarkindex+1] is flagged. + +inline void tetgenmesh::smarktest3(face& s) +{ + ((int *) ((s).sh))[shmarkindex+1] = + (((int *)((s).sh))[shmarkindex+1] | (int) 8); +} + +inline void tetgenmesh::sunmarktest3(face& s) +{ + ((int *) ((s).sh))[shmarkindex+1] = + (((int *)((s).sh))[shmarkindex+1] & ~(int)8); +} + +inline bool tetgenmesh::smarktest3ed(face& s) +{ + return ((((int *) ((s).sh))[shmarkindex+1] & (int) 8) != 0); +} + + +// Each facet has a unique index (automatically indexed). Starting from '0'. +// We save this index in the same field of the shell type. + +inline void tetgenmesh::setfacetindex(face& s, int value) +{ + ((int *) (s.sh))[shmarkindex + 2] = value; +} + +inline int tetgenmesh::getfacetindex(face& s) +{ + return ((int *) (s.sh))[shmarkindex + 2]; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// Primitives for interacting between tetrahedra and subfaces // +// // +/////////////////////////////////////////////////////////////////////////////// + +// tsbond() bond a tetrahedron (t) and a subface (s) together. +// Note that t and s must be the same face and the same edge. Moreover, +// t and s have the same orientation. +// Since the edge number in t and in s can be any number in {0,1,2}. We bond +// the edge in s which corresponds to t's 0th edge, and vice versa. + +inline void tetgenmesh::tsbond(triface& t, face& s) +{ + if ((t).tet[9] == NULL) { + // Allocate space for this tet. + (t).tet[9] = (tetrahedron) tet2subpool->alloc(); + // Initialize. + for (int i = 0; i < 4; i++) { + ((shellface *) (t).tet[9])[i] = NULL; + } + } + // Bond t <== s. + ((shellface *) (t).tet[9])[(t).ver & 3] = + sencode2((s).sh, tsbondtbl[t.ver][s.shver]); + // Bond s <== t. + s.sh[9 + ((s).shver & 1)] = + (shellface) encode2((t).tet, stbondtbl[t.ver][s.shver]); +} + +// tspivot() finds a subface (s) abutting on the given tetrahdera (t). +// Return s.sh = NULL if there is no subface at t. Otherwise, return +// the subface s, and s and t must be at the same edge wth the same +// orientation. + +inline void tetgenmesh::tspivot(triface& t, face& s) +{ + if ((t).tet[9] == NULL) { + (s).sh = NULL; + return; + } + // Get the attached subface s. + sdecode(((shellface *) (t).tet[9])[(t).ver & 3], (s)); + (s).shver = tspivottbl[t.ver][s.shver]; +} + +// Quickly check if the handle (t, v) is a subface. +#define issubface(t) \ + ((t).tet[9] && ((t).tet[9])[(t).ver & 3]) + +// stpivot() finds a tetrahedron (t) abutting a given subface (s). +// Return the t (if it exists) with the same edge and the same +// orientation of s. + +inline void tetgenmesh::stpivot(face& s, triface& t) +{ + decode((tetrahedron) s.sh[9 + (s.shver & 1)], t); + if ((t).tet == NULL) { + return; + } + (t).ver = stpivottbl[t.ver][s.shver]; +} + +// Quickly check if this subface is attached to a tetrahedron. + +#define isshtet(s) \ + ((s).sh[9 + ((s).shver & 1)]) + +// tsdissolve() dissolve a bond (from the tetrahedron side). + +inline void tetgenmesh::tsdissolve(triface& t) +{ + if ((t).tet[9] != NULL) { + ((shellface *) (t).tet[9])[(t).ver & 3] = NULL; + } +} + +// stdissolve() dissolve a bond (from the subface side). + +inline void tetgenmesh::stdissolve(face& s) +{ + (s).sh[9] = NULL; + (s).sh[10] = NULL; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// Primitives for interacting between subfaces and segments // +// // +/////////////////////////////////////////////////////////////////////////////// + +// ssbond() bond a subface to a subsegment. + +inline void tetgenmesh::ssbond(face& s, face& edge) +{ + s.sh[6 + (s.shver >> 1)] = sencode(edge); + edge.sh[0] = sencode(s); +} + +inline void tetgenmesh::ssbond1(face& s, face& edge) +{ + s.sh[6 + (s.shver >> 1)] = sencode(edge); + //edge.sh[0] = sencode(s); +} + +// ssdisolve() dissolve a bond (from the subface side) + +inline void tetgenmesh::ssdissolve(face& s) +{ + s.sh[6 + (s.shver >> 1)] = NULL; +} + +// sspivot() finds a subsegment abutting a subface. + +inline void tetgenmesh::sspivot(face& s, face& edge) +{ + sdecode((shellface) s.sh[6 + (s.shver >> 1)], edge); +} + +// Quickly check if the edge is a subsegment. + +#define isshsubseg(s) \ + ((s).sh[6 + ((s).shver >> 1)]) + +/////////////////////////////////////////////////////////////////////////////// +// // +// Primitives for interacting between tetrahedra and segments // +// // +/////////////////////////////////////////////////////////////////////////////// + +inline void tetgenmesh::tssbond1(triface& t, face& s) +{ + if ((t).tet[8] == NULL) { + // Allocate space for this tet. + (t).tet[8] = (tetrahedron) tet2segpool->alloc(); + // Initialization. + for (int i = 0; i < 6; i++) { + ((shellface *) (t).tet[8])[i] = NULL; + } + } + ((shellface *) (t).tet[8])[ver2edge[(t).ver]] = sencode((s)); +} + +inline void tetgenmesh::sstbond1(face& s, triface& t) +{ + ((tetrahedron *) (s).sh)[9] = encode(t); +} + +inline void tetgenmesh::tssdissolve1(triface& t) +{ + if ((t).tet[8] != NULL) { + ((shellface *) (t).tet[8])[ver2edge[(t).ver]] = NULL; + } +} + +inline void tetgenmesh::sstdissolve1(face& s) +{ + ((tetrahedron *) (s).sh)[9] = NULL; +} + +inline void tetgenmesh::tsspivot1(triface& t, face& s) +{ + if ((t).tet[8] != NULL) { + sdecode(((shellface *) (t).tet[8])[ver2edge[(t).ver]], s); + } else { + (s).sh = NULL; + } +} + +// Quickly check whether 't' is a segment or not. + +#define issubseg(t) \ + ((t).tet[8] && ((t).tet[8])[ver2edge[(t).ver]]) + +inline void tetgenmesh::sstpivot1(face& s, triface& t) +{ + decode((tetrahedron) s.sh[9], t); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// Primitives for points // +// // +/////////////////////////////////////////////////////////////////////////////// + +inline int tetgenmesh::pointmark(point pt) { + return ((int *) (pt))[pointmarkindex]; +} + +inline void tetgenmesh::setpointmark(point pt, int value) { + ((int *) (pt))[pointmarkindex] = value; +} + + +// These two primitives set and read the type of the point. + +inline enum tetgenmesh::verttype tetgenmesh::pointtype(point pt) { + return (enum verttype) (((int *) (pt))[pointmarkindex + 1] >> (int) 8); +} + +inline void tetgenmesh::setpointtype(point pt, enum verttype value) { + ((int *) (pt))[pointmarkindex + 1] = + ((int) value << 8) + (((int *) (pt))[pointmarkindex + 1] & (int) 255); +} + +// Read and set the geometry tag of the point (used by -s option). + +inline int tetgenmesh::pointgeomtag(point pt) { + return ((int *) (pt))[pointmarkindex + 2]; +} + +inline void tetgenmesh::setpointgeomtag(point pt, int value) { + ((int *) (pt))[pointmarkindex + 2] = value; +} + +// Read and set the u,v coordinates of the point (used by -s option). + +inline REAL tetgenmesh::pointgeomuv(point pt, int i) { + return pt[pointparamindex + i]; +} + +inline void tetgenmesh::setpointgeomuv(point pt, int i, REAL value) { + pt[pointparamindex + i] = value; +} + +// pinfect(), puninfect(), pinfected() -- primitives to flag or unflag +// a point. The last bit of the integer '[pointindex+1]' is flagged. + +inline void tetgenmesh::pinfect(point pt) { + ((int *) (pt))[pointmarkindex + 1] |= (int) 1; +} + +inline void tetgenmesh::puninfect(point pt) { + ((int *) (pt))[pointmarkindex + 1] &= ~(int) 1; +} + +inline bool tetgenmesh::pinfected(point pt) { + return (((int *) (pt))[pointmarkindex + 1] & (int) 1) != 0; +} + +// pmarktest(), punmarktest(), pmarktested() -- more primitives to +// flag or unflag a point. + +inline void tetgenmesh::pmarktest(point pt) { + ((int *) (pt))[pointmarkindex + 1] |= (int) 2; +} + +inline void tetgenmesh::punmarktest(point pt) { + ((int *) (pt))[pointmarkindex + 1] &= ~(int) 2; +} + +inline bool tetgenmesh::pmarktested(point pt) { + return (((int *) (pt))[pointmarkindex + 1] & (int) 2) != 0; +} + +inline void tetgenmesh::pmarktest2(point pt) { + ((int *) (pt))[pointmarkindex + 1] |= (int) 4; +} + +inline void tetgenmesh::punmarktest2(point pt) { + ((int *) (pt))[pointmarkindex + 1] &= ~(int) 4; +} + +inline bool tetgenmesh::pmarktest2ed(point pt) { + return (((int *) (pt))[pointmarkindex + 1] & (int) 4) != 0; +} + +inline void tetgenmesh::pmarktest3(point pt) { + ((int *) (pt))[pointmarkindex + 1] |= (int) 8; +} + +inline void tetgenmesh::punmarktest3(point pt) { + ((int *) (pt))[pointmarkindex + 1] &= ~(int) 8; +} + +inline bool tetgenmesh::pmarktest3ed(point pt) { + return (((int *) (pt))[pointmarkindex + 1] & (int) 8) != 0; +} + +// These following primitives set and read a pointer to a tetrahedron +// a subface/subsegment, a point, or a tet of background mesh. + +inline tetgenmesh::tetrahedron tetgenmesh::point2tet(point pt) { + return ((tetrahedron *) (pt))[point2simindex]; +} + +inline void tetgenmesh::setpoint2tet(point pt, tetrahedron value) { + ((tetrahedron *) (pt))[point2simindex] = value; +} + +inline tetgenmesh::point tetgenmesh::point2ppt(point pt) { + return (point) ((tetrahedron *) (pt))[point2simindex + 1]; +} + +inline void tetgenmesh::setpoint2ppt(point pt, point value) { + ((tetrahedron *) (pt))[point2simindex + 1] = (tetrahedron) value; +} + +inline tetgenmesh::shellface tetgenmesh::point2sh(point pt) { + return (shellface) ((tetrahedron *) (pt))[point2simindex + 2]; +} + +inline void tetgenmesh::setpoint2sh(point pt, shellface value) { + ((tetrahedron *) (pt))[point2simindex + 2] = (tetrahedron) value; +} + + +inline tetgenmesh::tetrahedron tetgenmesh::point2bgmtet(point pt) { + return ((tetrahedron *) (pt))[point2simindex + 3]; +} + +inline void tetgenmesh::setpoint2bgmtet(point pt, tetrahedron value) { + ((tetrahedron *) (pt))[point2simindex + 3] = value; +} + + +// The primitives for saving and getting the insertion radius. +inline void tetgenmesh::setpointinsradius(point pt, REAL value) +{ + pt[pointinsradiusindex] = value; +} + +inline REAL tetgenmesh::getpointinsradius(point pt) +{ + return pt[pointinsradiusindex]; +} + +inline bool tetgenmesh::issteinerpoint(point pt) { + return (pointtype(pt) == FREESEGVERTEX) || (pointtype(pt) == FREEFACETVERTEX) + || (pointtype(pt) == FREEVOLVERTEX); +} + +// point2tetorg() Get the tetrahedron whose origin is the point. + +inline void tetgenmesh::point2tetorg(point pa, triface& searchtet) +{ + decode(point2tet(pa), searchtet); + if ((point) searchtet.tet[4] == pa) { + searchtet.ver = 11; + } else if ((point) searchtet.tet[5] == pa) { + searchtet.ver = 3; + } else if ((point) searchtet.tet[6] == pa) { + searchtet.ver = 7; + } else { + searchtet.ver = 0; + } +} + +// point2shorg() Get the subface/segment whose origin is the point. + +inline void tetgenmesh::point2shorg(point pa, face& searchsh) +{ + sdecode(point2sh(pa), searchsh); + if ((point) searchsh.sh[3] == pa) { + searchsh.shver = 0; + } else if ((point) searchsh.sh[4] == pa) { + searchsh.shver = (searchsh.sh[5] != NULL ? 2 : 1); + } else { + searchsh.shver = 4; + } +} + +// farsorg() Return the origin of the subsegment. +// farsdest() Return the destination of the subsegment. + +inline tetgenmesh::point tetgenmesh::farsorg(face& s) +{ + face travesh, neighsh; + + travesh = s; + while (1) { + senext2(travesh, neighsh); + spivotself(neighsh); + if (neighsh.sh == NULL) break; + if (sorg(neighsh) != sorg(travesh)) sesymself(neighsh); + senext2(neighsh, travesh); + } + return sorg(travesh); +} + +inline tetgenmesh::point tetgenmesh::farsdest(face& s) +{ + face travesh, neighsh; + + travesh = s; + while (1) { + senext(travesh, neighsh); + spivotself(neighsh); + if (neighsh.sh == NULL) break; + if (sdest(neighsh) != sdest(travesh)) sesymself(neighsh); + senext(neighsh, travesh); + } + return sdest(travesh); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// Linear algebra operators. // +// // +/////////////////////////////////////////////////////////////////////////////// + +// dot() returns the dot product: v1 dot v2. +inline REAL tetgenmesh::dot(REAL* v1, REAL* v2) +{ + return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]; +} + +// cross() computes the cross product: n = v1 cross v2. +inline void tetgenmesh::cross(REAL* v1, REAL* v2, REAL* n) +{ + n[0] = v1[1] * v2[2] - v2[1] * v1[2]; + n[1] = -(v1[0] * v2[2] - v2[0] * v1[2]); + n[2] = v1[0] * v2[1] - v2[0] * v1[1]; +} + +// distance() computes the Euclidean distance between two points. +inline REAL tetgenmesh::distance(REAL* p1, REAL* p2) +{ + return sqrt((p2[0] - p1[0]) * (p2[0] - p1[0]) + + (p2[1] - p1[1]) * (p2[1] - p1[1]) + + (p2[2] - p1[2]) * (p2[2] - p1[2])); +} + +inline REAL tetgenmesh::norm2(REAL x, REAL y, REAL z) +{ + return (x) * (x) + (y) * (y) + (z) * (z); +} + + + +#endif // #ifndef tetgenH + diff --git a/src/sample/tetcall.cxx b/src/sample/tetcall.cxx new file mode 100644 index 0000000..2e91200 --- /dev/null +++ b/src/sample/tetcall.cxx @@ -0,0 +1,198 @@ +/////////////////////////////////////////////////////////////////////////////// +// // +// tetcall.cxx // +// // +// An example of how to call TetGen from another program by using the data // +// type "tetgenio" and function "tetrahedralize()" of TetGen libaray. // +// // +// In order to run this example, you need the library of TetGen, you can get // +// the source code as well as the user's manul of TetGen from: // +// // +// http://tetgen.berlios.de/index.html // +// // +// Section 2 of the user's manual contains the information of how to compile // +// TetGen into a libaray. // +// // +// The geometry used in this example (illustrated in Section 3.3 .1, Figure // +// 12 of the user's manual) is a rectangluar bar consists of 8 points and 6 // +// facets (which are all rectangles). In additional, there are two boundary // +// markers defined on its facets. // +// // +// This code illustrates the following basic steps: // +// - at first create an input object "in", and set data of the geometry // +// into it. // +// - then call function "tetrahedralize()" to create a quality mesh of the // +// geometry with output in another object "out". // +// In addition, It outputs the geometry in the object "in" into two files // +// (barin.node and barin.poly), and outputs the mesh in the object "out" // +// into three files (barout.node, barout.ele, and barout.face). These files // +// can be visualized by TetView. // +// // +// To compile this code into an executable program, do the following steps: // +// - compile TetGen into a library named "libtet.a" (see Section 2.1 of // +// the user's manula for compiling); // +// - Save this file into the same directory in which you have the files // +// "tetgen.h" and "libtet.a"; // +// - compile it using the following command: // +// // +// g++ -o test tetcall.cxx -L./ -ltet // +// // +// which will result an executable program named "test". // +// // +// Please send your quesions, comments to Hang Si // +// // +/////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +// // +// main() Create and refine a mesh using TetGen library. // +// // +/////////////////////////////////////////////////////////////////////////////// + +#include "../lib/tetgen.h" // Defined tetgenio, tetrahedralize(). + +int main(int argc, char *argv[]) +{ + tetgenio in, out; + tetgenio::facet *f; + tetgenio::polygon *p; + int i; + + // All indices start from 1. + in.firstnumber = 1; + + in.numberofpoints = 8; + in.pointlist = new REAL[in.numberofpoints * 3]; + in.pointlist[0] = 0; // node 1. + in.pointlist[1] = 0; + in.pointlist[2] = 0; + in.pointlist[3] = 2; // node 2. + in.pointlist[4] = 0; + in.pointlist[5] = 0; + in.pointlist[6] = 2; // node 3. + in.pointlist[7] = 2; + in.pointlist[8] = 0; + in.pointlist[9] = 0; // node 4. + in.pointlist[10] = 2; + in.pointlist[11] = 0; + // Set node 5, 6, 7, 8. + for (i = 4; i < 8; i++) { + in.pointlist[i * 3] = in.pointlist[(i - 4) * 3]; + in.pointlist[i * 3 + 1] = in.pointlist[(i - 4) * 3 + 1]; + in.pointlist[i * 3 + 2] = 12; + } + + in.numberoffacets = 6; + in.facetlist = new tetgenio::facet[in.numberoffacets]; + in.facetmarkerlist = new int[in.numberoffacets]; + + // Facet 1. The leftmost facet. + f = &in.facetlist[0]; + f->numberofpolygons = 1; + f->polygonlist = new tetgenio::polygon[f->numberofpolygons]; + f->numberofholes = 0; + f->holelist = NULL; + p = &f->polygonlist[0]; + p->numberofvertices = 4; + p->vertexlist = new int[p->numberofvertices]; + p->vertexlist[0] = 1; + p->vertexlist[1] = 2; + p->vertexlist[2] = 3; + p->vertexlist[3] = 4; + + // Facet 2. The rightmost facet. + f = &in.facetlist[1]; + f->numberofpolygons = 1; + f->polygonlist = new tetgenio::polygon[f->numberofpolygons]; + f->numberofholes = 0; + f->holelist = NULL; + p = &f->polygonlist[0]; + p->numberofvertices = 4; + p->vertexlist = new int[p->numberofvertices]; + p->vertexlist[0] = 5; + p->vertexlist[1] = 6; + p->vertexlist[2] = 7; + p->vertexlist[3] = 8; + + // Facet 3. The bottom facet. + f = &in.facetlist[2]; + f->numberofpolygons = 1; + f->polygonlist = new tetgenio::polygon[f->numberofpolygons]; + f->numberofholes = 0; + f->holelist = NULL; + p = &f->polygonlist[0]; + p->numberofvertices = 4; + p->vertexlist = new int[p->numberofvertices]; + p->vertexlist[0] = 1; + p->vertexlist[1] = 5; + p->vertexlist[2] = 6; + p->vertexlist[3] = 2; + + // Facet 4. The back facet. + f = &in.facetlist[3]; + f->numberofpolygons = 1; + f->polygonlist = new tetgenio::polygon[f->numberofpolygons]; + f->numberofholes = 0; + f->holelist = NULL; + p = &f->polygonlist[0]; + p->numberofvertices = 4; + p->vertexlist = new int[p->numberofvertices]; + p->vertexlist[0] = 2; + p->vertexlist[1] = 6; + p->vertexlist[2] = 7; + p->vertexlist[3] = 3; + + // Facet 5. The top facet. + f = &in.facetlist[4]; + f->numberofpolygons = 1; + f->polygonlist = new tetgenio::polygon[f->numberofpolygons]; + f->numberofholes = 0; + f->holelist = NULL; + p = &f->polygonlist[0]; + p->numberofvertices = 4; + p->vertexlist = new int[p->numberofvertices]; + p->vertexlist[0] = 3; + p->vertexlist[1] = 7; + p->vertexlist[2] = 8; + p->vertexlist[3] = 4; + + // Facet 6. The front facet. + f = &in.facetlist[5]; + f->numberofpolygons = 1; + f->polygonlist = new tetgenio::polygon[f->numberofpolygons]; + f->numberofholes = 0; + f->holelist = NULL; + p = &f->polygonlist[0]; + p->numberofvertices = 4; + p->vertexlist = new int[p->numberofvertices]; + p->vertexlist[0] = 4; + p->vertexlist[1] = 8; + p->vertexlist[2] = 5; + p->vertexlist[3] = 1; + + // Set 'in.facetmarkerlist' + + in.facetmarkerlist[0] = -1; + in.facetmarkerlist[1] = -2; + in.facetmarkerlist[2] = 0; + in.facetmarkerlist[3] = 0; + in.facetmarkerlist[4] = 0; + in.facetmarkerlist[5] = 0; + + // Output the PLC to files 'barin.node' and 'barin.poly'. + in.save_nodes("barin"); + in.save_poly("barin"); + + // Tetrahedralize the PLC. Switches are chosen to read a PLC (p), + // do quality mesh generation (q) with a specified quality bound + // (1.414), and apply a maximum volume constraint (a0.1). + + tetrahedralize("pq1.414a0.1", &in, &out); + + // Output mesh to files 'barout.node', 'barout.ele' and 'barout.face'. + out.save_nodes("barout"); + out.save_elements("barout"); + out.save_faces("barout"); + + return 0; +} \ No newline at end of file diff --git a/src/tool/predicates.cxx b/src/tool/predicates.cxx new file mode 100644 index 0000000..5a7a48e --- /dev/null +++ b/src/tool/predicates.cxx @@ -0,0 +1,4702 @@ +/*****************************************************************************/ +/* */ +/* Routines for Arbitrary Precision Floating-point Arithmetic */ +/* and Fast Robust Geometric Predicates */ +/* (predicates.c) */ +/* */ +/* May 18, 1996 */ +/* */ +/* Placed in the public domain by */ +/* Jonathan Richard Shewchuk */ +/* School of Computer Science */ +/* Carnegie Mellon University */ +/* 5000 Forbes Avenue */ +/* Pittsburgh, Pennsylvania 15213-3891 */ +/* jrs@cs.cmu.edu */ +/* */ +/* This file contains C implementation of algorithms for exact addition */ +/* and multiplication of floating-point numbers, and predicates for */ +/* robustly performing the orientation and incircle tests used in */ +/* computational geometry. The algorithms and underlying theory are */ +/* described in Jonathan Richard Shewchuk. "Adaptive Precision Floating- */ +/* Point Arithmetic and Fast Robust Geometric Predicates." Technical */ +/* Report CMU-CS-96-140, School of Computer Science, Carnegie Mellon */ +/* University, Pittsburgh, Pennsylvania, May 1996. (Submitted to */ +/* Discrete & Computational Geometry.) */ +/* */ +/* This file, the paper listed above, and other information are available */ +/* from the Web page http://www.cs.cmu.edu/~quake/robust.html . */ +/* */ +/*****************************************************************************/ + +/*****************************************************************************/ +/* */ +/* Using this code: */ +/* */ +/* First, read the short or long version of the paper (from the Web page */ +/* above). */ +/* */ +/* Be sure to call exactinit() once, before calling any of the arithmetic */ +/* functions or geometric predicates. Also be sure to turn on the */ +/* optimizer when compiling this file. */ +/* */ +/* */ +/* Several geometric predicates are defined. Their parameters are all */ +/* points. Each point is an array of two or three floating-point */ +/* numbers. The geometric predicates, described in the papers, are */ +/* */ +/* orient2d(pa, pb, pc) */ +/* orient2dfast(pa, pb, pc) */ +/* orient3d(pa, pb, pc, pd) */ +/* orient3dfast(pa, pb, pc, pd) */ +/* incircle(pa, pb, pc, pd) */ +/* incirclefast(pa, pb, pc, pd) */ +/* insphere(pa, pb, pc, pd, pe) */ +/* inspherefast(pa, pb, pc, pd, pe) */ +/* */ +/* Those with suffix "fast" are approximate, non-robust versions. Those */ +/* without the suffix are adaptive precision, robust versions. There */ +/* are also versions with the suffices "exact" and "slow", which are */ +/* non-adaptive, exact arithmetic versions, which I use only for timings */ +/* in my arithmetic papers. */ +/* */ +/* */ +/* An expansion is represented by an array of floating-point numbers, */ +/* sorted from smallest to largest magnitude (possibly with interspersed */ +/* zeros). The length of each expansion is stored as a separate integer, */ +/* and each arithmetic function returns an integer which is the length */ +/* of the expansion it created. */ +/* */ +/* Several arithmetic functions are defined. Their parameters are */ +/* */ +/* e, f Input expansions */ +/* elen, flen Lengths of input expansions (must be >= 1) */ +/* h Output expansion */ +/* b Input scalar */ +/* */ +/* The arithmetic functions are */ +/* */ +/* grow_expansion(elen, e, b, h) */ +/* grow_expansion_zeroelim(elen, e, b, h) */ +/* expansion_sum(elen, e, flen, f, h) */ +/* expansion_sum_zeroelim1(elen, e, flen, f, h) */ +/* expansion_sum_zeroelim2(elen, e, flen, f, h) */ +/* fast_expansion_sum(elen, e, flen, f, h) */ +/* fast_expansion_sum_zeroelim(elen, e, flen, f, h) */ +/* linear_expansion_sum(elen, e, flen, f, h) */ +/* linear_expansion_sum_zeroelim(elen, e, flen, f, h) */ +/* scale_expansion(elen, e, b, h) */ +/* scale_expansion_zeroelim(elen, e, b, h) */ +/* compress(elen, e, h) */ +/* */ +/* All of these are described in the long version of the paper; some are */ +/* described in the short version. All return an integer that is the */ +/* length of h. Those with suffix _zeroelim perform zero elimination, */ +/* and are recommended over their counterparts. The procedure */ +/* fast_expansion_sum_zeroelim() (or linear_expansion_sum_zeroelim() on */ +/* processors that do not use the round-to-even tiebreaking rule) is */ +/* recommended over expansion_sum_zeroelim(). Each procedure has a */ +/* little note next to it (in the code below) that tells you whether or */ +/* not the output expansion may be the same array as one of the input */ +/* expansions. */ +/* */ +/* */ +/* If you look around below, you'll also find macros for a bunch of */ +/* simple unrolled arithmetic operations, and procedures for printing */ +/* expansions (commented out because they don't work with all C */ +/* compilers) and for generating random floating-point numbers whose */ +/* significand bits are all random. Most of the macros have undocumented */ +/* requirements that certain of their parameters should not be the same */ +/* variable; for safety, better to make sure all the parameters are */ +/* distinct variables. Feel free to send email to jrs@cs.cmu.edu if you */ +/* have questions. */ +/* */ +/*****************************************************************************/ + +#include +#include +#include +#ifdef CPU86 +#include +#endif /* CPU86 */ +#ifdef LINUX +#include +#endif /* LINUX */ + +#include "tetgen.h" // Defines the symbol REAL (float or double). + +#ifdef USE_CGAL_PREDICATES + #include + typedef CGAL::Exact_predicates_inexact_constructions_kernel cgalEpick; + typedef cgalEpick::Point_3 Point; + cgalEpick cgal_pred_obj; +#endif // #ifdef USE_CGAL_PREDICATES + +/* On some machines, the exact arithmetic routines might be defeated by the */ +/* use of internal extended precision floating-point registers. Sometimes */ +/* this problem can be fixed by defining certain values to be volatile, */ +/* thus forcing them to be stored to memory and rounded off. This isn't */ +/* a great solution, though, as it slows the arithmetic down. */ +/* */ +/* To try this out, write "#define INEXACT volatile" below. Normally, */ +/* however, INEXACT should be defined to be nothing. ("#define INEXACT".) */ + +#define INEXACT /* Nothing */ +/* #define INEXACT volatile */ + +/* #define REAL double */ /* float or double */ +#define REALPRINT doubleprint +#define REALRAND doublerand +#define NARROWRAND narrowdoublerand +#define UNIFORMRAND uniformdoublerand + +/* Which of the following two methods of finding the absolute values is */ +/* fastest is compiler-dependent. A few compilers can inline and optimize */ +/* the fabs() call; but most will incur the overhead of a function call, */ +/* which is disastrously slow. A faster way on IEEE machines might be to */ +/* mask the appropriate bit, but that's difficult to do in C. */ + +//#define Absolute(a) ((a) >= 0.0 ? (a) : -(a)) +#define Absolute(a) fabs(a) + +/* Many of the operations are broken up into two pieces, a main part that */ +/* performs an approximate operation, and a "tail" that computes the */ +/* roundoff error of that operation. */ +/* */ +/* The operations Fast_Two_Sum(), Fast_Two_Diff(), Two_Sum(), Two_Diff(), */ +/* Split(), and Two_Product() are all implemented as described in the */ +/* reference. Each of these macros requires certain variables to be */ +/* defined in the calling routine. The variables `bvirt', `c', `abig', */ +/* `_i', `_j', `_k', `_l', `_m', and `_n' are declared `INEXACT' because */ +/* they store the result of an operation that may incur roundoff error. */ +/* The input parameter `x' (or the highest numbered `x_' parameter) must */ +/* also be declared `INEXACT'. */ + +#define Fast_Two_Sum_Tail(a, b, x, y) \ + bvirt = x - a; \ + y = b - bvirt + +#define Fast_Two_Sum(a, b, x, y) \ + x = (REAL) (a + b); \ + Fast_Two_Sum_Tail(a, b, x, y) + +#define Fast_Two_Diff_Tail(a, b, x, y) \ + bvirt = a - x; \ + y = bvirt - b + +#define Fast_Two_Diff(a, b, x, y) \ + x = (REAL) (a - b); \ + Fast_Two_Diff_Tail(a, b, x, y) + +#define Two_Sum_Tail(a, b, x, y) \ + bvirt = (REAL) (x - a); \ + avirt = x - bvirt; \ + bround = b - bvirt; \ + around = a - avirt; \ + y = around + bround + +#define Two_Sum(a, b, x, y) \ + x = (REAL) (a + b); \ + Two_Sum_Tail(a, b, x, y) + +#define Two_Diff_Tail(a, b, x, y) \ + bvirt = (REAL) (a - x); \ + avirt = x + bvirt; \ + bround = bvirt - b; \ + around = a - avirt; \ + y = around + bround + +#define Two_Diff(a, b, x, y) \ + x = (REAL) (a - b); \ + Two_Diff_Tail(a, b, x, y) + +#define Split(a, ahi, alo) \ + c = (REAL) (splitter * a); \ + abig = (REAL) (c - a); \ + ahi = c - abig; \ + alo = a - ahi + +#define Two_Product_Tail(a, b, x, y) \ + Split(a, ahi, alo); \ + Split(b, bhi, blo); \ + err1 = x - (ahi * bhi); \ + err2 = err1 - (alo * bhi); \ + err3 = err2 - (ahi * blo); \ + y = (alo * blo) - err3 + +#define Two_Product(a, b, x, y) \ + x = (REAL) (a * b); \ + Two_Product_Tail(a, b, x, y) + +/* Two_Product_Presplit() is Two_Product() where one of the inputs has */ +/* already been split. Avoids redundant splitting. */ + +#define Two_Product_Presplit(a, b, bhi, blo, x, y) \ + x = (REAL) (a * b); \ + Split(a, ahi, alo); \ + err1 = x - (ahi * bhi); \ + err2 = err1 - (alo * bhi); \ + err3 = err2 - (ahi * blo); \ + y = (alo * blo) - err3 + +/* Two_Product_2Presplit() is Two_Product() where both of the inputs have */ +/* already been split. Avoids redundant splitting. */ + +#define Two_Product_2Presplit(a, ahi, alo, b, bhi, blo, x, y) \ + x = (REAL) (a * b); \ + err1 = x - (ahi * bhi); \ + err2 = err1 - (alo * bhi); \ + err3 = err2 - (ahi * blo); \ + y = (alo * blo) - err3 + +/* Square() can be done more quickly than Two_Product(). */ + +#define Square_Tail(a, x, y) \ + Split(a, ahi, alo); \ + err1 = x - (ahi * ahi); \ + err3 = err1 - ((ahi + ahi) * alo); \ + y = (alo * alo) - err3 + +#define Square(a, x, y) \ + x = (REAL) (a * a); \ + Square_Tail(a, x, y) + +/* Macros for summing expansions of various fixed lengths. These are all */ +/* unrolled versions of Expansion_Sum(). */ + +#define Two_One_Sum(a1, a0, b, x2, x1, x0) \ + Two_Sum(a0, b , _i, x0); \ + Two_Sum(a1, _i, x2, x1) + +#define Two_One_Diff(a1, a0, b, x2, x1, x0) \ + Two_Diff(a0, b , _i, x0); \ + Two_Sum( a1, _i, x2, x1) + +#define Two_Two_Sum(a1, a0, b1, b0, x3, x2, x1, x0) \ + Two_One_Sum(a1, a0, b0, _j, _0, x0); \ + Two_One_Sum(_j, _0, b1, x3, x2, x1) + +#define Two_Two_Diff(a1, a0, b1, b0, x3, x2, x1, x0) \ + Two_One_Diff(a1, a0, b0, _j, _0, x0); \ + Two_One_Diff(_j, _0, b1, x3, x2, x1) + +#define Four_One_Sum(a3, a2, a1, a0, b, x4, x3, x2, x1, x0) \ + Two_One_Sum(a1, a0, b , _j, x1, x0); \ + Two_One_Sum(a3, a2, _j, x4, x3, x2) + +#define Four_Two_Sum(a3, a2, a1, a0, b1, b0, x5, x4, x3, x2, x1, x0) \ + Four_One_Sum(a3, a2, a1, a0, b0, _k, _2, _1, _0, x0); \ + Four_One_Sum(_k, _2, _1, _0, b1, x5, x4, x3, x2, x1) + +#define Four_Four_Sum(a3, a2, a1, a0, b4, b3, b1, b0, x7, x6, x5, x4, x3, x2, \ + x1, x0) \ + Four_Two_Sum(a3, a2, a1, a0, b1, b0, _l, _2, _1, _0, x1, x0); \ + Four_Two_Sum(_l, _2, _1, _0, b4, b3, x7, x6, x5, x4, x3, x2) + +#define Eight_One_Sum(a7, a6, a5, a4, a3, a2, a1, a0, b, x8, x7, x6, x5, x4, \ + x3, x2, x1, x0) \ + Four_One_Sum(a3, a2, a1, a0, b , _j, x3, x2, x1, x0); \ + Four_One_Sum(a7, a6, a5, a4, _j, x8, x7, x6, x5, x4) + +#define Eight_Two_Sum(a7, a6, a5, a4, a3, a2, a1, a0, b1, b0, x9, x8, x7, \ + x6, x5, x4, x3, x2, x1, x0) \ + Eight_One_Sum(a7, a6, a5, a4, a3, a2, a1, a0, b0, _k, _6, _5, _4, _3, _2, \ + _1, _0, x0); \ + Eight_One_Sum(_k, _6, _5, _4, _3, _2, _1, _0, b1, x9, x8, x7, x6, x5, x4, \ + x3, x2, x1) + +#define Eight_Four_Sum(a7, a6, a5, a4, a3, a2, a1, a0, b4, b3, b1, b0, x11, \ + x10, x9, x8, x7, x6, x5, x4, x3, x2, x1, x0) \ + Eight_Two_Sum(a7, a6, a5, a4, a3, a2, a1, a0, b1, b0, _l, _6, _5, _4, _3, \ + _2, _1, _0, x1, x0); \ + Eight_Two_Sum(_l, _6, _5, _4, _3, _2, _1, _0, b4, b3, x11, x10, x9, x8, \ + x7, x6, x5, x4, x3, x2) + +/* Macros for multiplying expansions of various fixed lengths. */ + +#define Two_One_Product(a1, a0, b, x3, x2, x1, x0) \ + Split(b, bhi, blo); \ + Two_Product_Presplit(a0, b, bhi, blo, _i, x0); \ + Two_Product_Presplit(a1, b, bhi, blo, _j, _0); \ + Two_Sum(_i, _0, _k, x1); \ + Fast_Two_Sum(_j, _k, x3, x2) + +#define Four_One_Product(a3, a2, a1, a0, b, x7, x6, x5, x4, x3, x2, x1, x0) \ + Split(b, bhi, blo); \ + Two_Product_Presplit(a0, b, bhi, blo, _i, x0); \ + Two_Product_Presplit(a1, b, bhi, blo, _j, _0); \ + Two_Sum(_i, _0, _k, x1); \ + Fast_Two_Sum(_j, _k, _i, x2); \ + Two_Product_Presplit(a2, b, bhi, blo, _j, _0); \ + Two_Sum(_i, _0, _k, x3); \ + Fast_Two_Sum(_j, _k, _i, x4); \ + Two_Product_Presplit(a3, b, bhi, blo, _j, _0); \ + Two_Sum(_i, _0, _k, x5); \ + Fast_Two_Sum(_j, _k, x7, x6) + +#define Two_Two_Product(a1, a0, b1, b0, x7, x6, x5, x4, x3, x2, x1, x0) \ + Split(a0, a0hi, a0lo); \ + Split(b0, bhi, blo); \ + Two_Product_2Presplit(a0, a0hi, a0lo, b0, bhi, blo, _i, x0); \ + Split(a1, a1hi, a1lo); \ + Two_Product_2Presplit(a1, a1hi, a1lo, b0, bhi, blo, _j, _0); \ + Two_Sum(_i, _0, _k, _1); \ + Fast_Two_Sum(_j, _k, _l, _2); \ + Split(b1, bhi, blo); \ + Two_Product_2Presplit(a0, a0hi, a0lo, b1, bhi, blo, _i, _0); \ + Two_Sum(_1, _0, _k, x1); \ + Two_Sum(_2, _k, _j, _1); \ + Two_Sum(_l, _j, _m, _2); \ + Two_Product_2Presplit(a1, a1hi, a1lo, b1, bhi, blo, _j, _0); \ + Two_Sum(_i, _0, _n, _0); \ + Two_Sum(_1, _0, _i, x2); \ + Two_Sum(_2, _i, _k, _1); \ + Two_Sum(_m, _k, _l, _2); \ + Two_Sum(_j, _n, _k, _0); \ + Two_Sum(_1, _0, _j, x3); \ + Two_Sum(_2, _j, _i, _1); \ + Two_Sum(_l, _i, _m, _2); \ + Two_Sum(_1, _k, _i, x4); \ + Two_Sum(_2, _i, _k, x5); \ + Two_Sum(_m, _k, x7, x6) + +/* An expansion of length two can be squared more quickly than finding the */ +/* product of two different expansions of length two, and the result is */ +/* guaranteed to have no more than six (rather than eight) components. */ + +#define Two_Square(a1, a0, x5, x4, x3, x2, x1, x0) \ + Square(a0, _j, x0); \ + _0 = a0 + a0; \ + Two_Product(a1, _0, _k, _1); \ + Two_One_Sum(_k, _1, _j, _l, _2, x1); \ + Square(a1, _j, _1); \ + Two_Two_Sum(_j, _1, _l, _2, x5, x4, x3, x2) + +/* splitter = 2^ceiling(p / 2) + 1. Used to split floats in half. */ +static REAL splitter; +static REAL epsilon; /* = 2^(-p). Used to estimate roundoff errors. */ +/* A set of coefficients used to calculate maximum roundoff errors. */ +static REAL resulterrbound; +static REAL ccwerrboundA, ccwerrboundB, ccwerrboundC; +static REAL o3derrboundA, o3derrboundB, o3derrboundC; +static REAL iccerrboundA, iccerrboundB, iccerrboundC; +static REAL isperrboundA, isperrboundB, isperrboundC; + +// Options to choose types of geometric computtaions. +// Added by H. Si, 2012-08-23. +static int _use_inexact_arith; // -X option. +static int _use_static_filter; // Default option, disable it by -X1 + +// Static filters for orient3d() and insphere(). +// They are pre-calcualted and set in exactinit(). +// Added by H. Si, 2012-08-23. +static REAL o3dstaticfilter; +static REAL ispstaticfilter; + + + +// The following codes were part of "IEEE 754 floating-point test software" +// http://www.math.utah.edu/~beebe/software/ieee/ +// The original program was "fpinfo2.c". + +double fppow2(int n) +{ + double x, power; + x = (n < 0) ? ((double)1.0/(double)2.0) : (double)2.0; + n = (n < 0) ? -n : n; + power = (double)1.0; + while (n-- > 0) + power *= x; + return (power); +} + +#ifdef SINGLE + +float fstore(float x) +{ + return (x); +} + +int test_float(int verbose) +{ + float x; + int pass = 1; + + //(void)printf("float:\n"); + + if (verbose) { + (void)printf(" sizeof(float) = %2u\n", (unsigned int)sizeof(float)); +#ifdef CPU86 // + (void)printf(" FLT_MANT_DIG = %2d\n", FLT_MANT_DIG); +#endif + } + + x = (float)1.0; + while (fstore((float)1.0 + x/(float)2.0) != (float)1.0) + x /= (float)2.0; + if (verbose) + (void)printf(" machine epsilon = %13.5e ", x); + + if (x == (float)fppow2(-23)) { + if (verbose) + (void)printf("[IEEE 754 32-bit macheps]\n"); + } else { + (void)printf("[not IEEE 754 conformant] !!\n"); + pass = 0; + } + + x = (float)1.0; + while (fstore(x / (float)2.0) != (float)0.0) + x /= (float)2.0; + if (verbose) + (void)printf(" smallest positive number = %13.5e ", x); + + if (x == (float)fppow2(-149)) { + if (verbose) + (void)printf("[smallest 32-bit subnormal]\n"); + } else if (x == (float)fppow2(-126)) { + if (verbose) + (void)printf("[smallest 32-bit normal]\n"); + } else { + (void)printf("[not IEEE 754 conformant] !!\n"); + pass = 0; + } + + return pass; +} + +# else + +double dstore(double x) +{ + return (x); +} + +int test_double(int verbose) +{ + double x; + int pass = 1; + + // (void)printf("double:\n"); + if (verbose) { + (void)printf(" sizeof(double) = %2u\n", (unsigned int)sizeof(double)); +#ifdef CPU86 // + (void)printf(" DBL_MANT_DIG = %2d\n", DBL_MANT_DIG); +#endif + } + + x = 1.0; + while (dstore(1.0 + x/2.0) != 1.0) + x /= 2.0; + if (verbose) + (void)printf(" machine epsilon = %13.5le ", x); + + if (x == (double)fppow2(-52)) { + if (verbose) + (void)printf("[IEEE 754 64-bit macheps]\n"); + } else { + (void)printf("[not IEEE 754 conformant] !!\n"); + pass = 0; + } + + x = 1.0; + while (dstore(x / 2.0) != 0.0) + x /= 2.0; + //if (verbose) + // (void)printf(" smallest positive number = %13.5le ", x); + + if (x == (double)fppow2(-1074)) { + //if (verbose) + // (void)printf("[smallest 64-bit subnormal]\n"); + } else if (x == (double)fppow2(-1022)) { + //if (verbose) + // (void)printf("[smallest 64-bit normal]\n"); + } else { + (void)printf("[not IEEE 754 conformant] !!\n"); + pass = 0; + } + + return pass; +} + +#endif + +/*****************************************************************************/ +/* */ +/* exactinit() Initialize the variables used for exact arithmetic. */ +/* */ +/* `epsilon' is the largest power of two such that 1.0 + epsilon = 1.0 in */ +/* floating-point arithmetic. `epsilon' bounds the relative roundoff */ +/* error. It is used for floating-point error analysis. */ +/* */ +/* `splitter' is used to split floating-point numbers into two half- */ +/* length significands for exact multiplication. */ +/* */ +/* I imagine that a highly optimizing compiler might be too smart for its */ +/* own good, and somehow cause this routine to fail, if it pretends that */ +/* floating-point arithmetic is too much like real arithmetic. */ +/* */ +/* Don't change this routine unless you fully understand it. */ +/* */ +/*****************************************************************************/ + +void exactinit(int verbose, int noexact, int nofilter, REAL maxx, REAL maxy, + REAL maxz) +{ + REAL half; + REAL check, lastcheck; + int every_other; +#ifdef LINUX + int cword; +#endif /* LINUX */ + +#ifdef CPU86 +#ifdef SINGLE + _control87(_PC_24, _MCW_PC); /* Set FPU control word for single precision. */ +#else /* not SINGLE */ + _control87(_PC_53, _MCW_PC); /* Set FPU control word for double precision. */ +#endif /* not SINGLE */ +#endif /* CPU86 */ +#ifdef LINUX +#ifdef SINGLE + /* cword = 4223; */ + cword = 4210; /* set FPU control word for single precision */ +#else /* not SINGLE */ + /* cword = 4735; */ + cword = 4722; /* set FPU control word for double precision */ +#endif /* not SINGLE */ + _FPU_SETCW(cword); +#endif /* LINUX */ + + if (verbose) { + printf(" Initializing robust predicates.\n"); + } + +#ifdef USE_CGAL_PREDICATES + if (cgal_pred_obj.Has_static_filters) { + printf(" Use static filter.\n"); + } else { + printf(" No static filter.\n"); + } +#endif // USE_CGAL_PREDICATES + +#ifdef SINGLE + test_float(verbose); +#else + test_double(verbose); +#endif + + every_other = 1; + half = 0.5; + epsilon = 1.0; + splitter = 1.0; + check = 1.0; + /* Repeatedly divide `epsilon' by two until it is too small to add to */ + /* one without causing roundoff. (Also check if the sum is equal to */ + /* the previous sum, for machines that round up instead of using exact */ + /* rounding. Not that this library will work on such machines anyway. */ + do { + lastcheck = check; + epsilon *= half; + if (every_other) { + splitter *= 2.0; + } + every_other = !every_other; + check = 1.0 + epsilon; + } while ((check != 1.0) && (check != lastcheck)); + splitter += 1.0; + + /* Error bounds for orientation and incircle tests. */ + resulterrbound = (3.0 + 8.0 * epsilon) * epsilon; + ccwerrboundA = (3.0 + 16.0 * epsilon) * epsilon; + ccwerrboundB = (2.0 + 12.0 * epsilon) * epsilon; + ccwerrboundC = (9.0 + 64.0 * epsilon) * epsilon * epsilon; + o3derrboundA = (7.0 + 56.0 * epsilon) * epsilon; + o3derrboundB = (3.0 + 28.0 * epsilon) * epsilon; + o3derrboundC = (26.0 + 288.0 * epsilon) * epsilon * epsilon; + iccerrboundA = (10.0 + 96.0 * epsilon) * epsilon; + iccerrboundB = (4.0 + 48.0 * epsilon) * epsilon; + iccerrboundC = (44.0 + 576.0 * epsilon) * epsilon * epsilon; + isperrboundA = (16.0 + 224.0 * epsilon) * epsilon; + isperrboundB = (5.0 + 72.0 * epsilon) * epsilon; + isperrboundC = (71.0 + 1408.0 * epsilon) * epsilon * epsilon; + + // Set TetGen options. Added by H. Si, 2012-08-23. + _use_inexact_arith = noexact; + _use_static_filter = !nofilter; + + // Calculate the two static filters for orient3d() and insphere() tests. + // Added by H. Si, 2012-08-23. + + // Sort maxx < maxy < maxz. Re-use 'half' for swapping. + if (maxx > maxz) { + half = maxx; maxx = maxz; maxz = half; + } + if (maxy > maxz) { + half = maxy; maxy = maxz; maxz = half; + } + else if (maxy < maxx) { + half = maxy; maxy = maxx; maxx = half; + } + + o3dstaticfilter = 5.1107127829973299e-15 * maxx * maxy * maxz; + ispstaticfilter = 1.2466136531027298e-13 * maxx * maxy * maxz * (maxz * maxz); + +} + +/*****************************************************************************/ +/* */ +/* grow_expansion() Add a scalar to an expansion. */ +/* */ +/* Sets h = e + b. See the long version of my paper for details. */ +/* */ +/* Maintains the nonoverlapping property. If round-to-even is used (as */ +/* with IEEE 754), maintains the strongly nonoverlapping and nonadjacent */ +/* properties as well. (That is, if e has one of these properties, so */ +/* will h.) */ +/* */ +/*****************************************************************************/ + +int grow_expansion(int elen, REAL *e, REAL b, REAL *h) +/* e and h can be the same. */ +{ + REAL Q; + INEXACT REAL Qnew; + int eindex; + REAL enow; + INEXACT REAL bvirt; + REAL avirt, bround, around; + + Q = b; + for (eindex = 0; eindex < elen; eindex++) { + enow = e[eindex]; + Two_Sum(Q, enow, Qnew, h[eindex]); + Q = Qnew; + } + h[eindex] = Q; + return eindex + 1; +} + +/*****************************************************************************/ +/* */ +/* grow_expansion_zeroelim() Add a scalar to an expansion, eliminating */ +/* zero components from the output expansion. */ +/* */ +/* Sets h = e + b. See the long version of my paper for details. */ +/* */ +/* Maintains the nonoverlapping property. If round-to-even is used (as */ +/* with IEEE 754), maintains the strongly nonoverlapping and nonadjacent */ +/* properties as well. (That is, if e has one of these properties, so */ +/* will h.) */ +/* */ +/*****************************************************************************/ + +int grow_expansion_zeroelim(int elen, REAL *e, REAL b, REAL *h) +/* e and h can be the same. */ +{ + REAL Q, hh; + INEXACT REAL Qnew; + int eindex, hindex; + REAL enow; + INEXACT REAL bvirt; + REAL avirt, bround, around; + + hindex = 0; + Q = b; + for (eindex = 0; eindex < elen; eindex++) { + enow = e[eindex]; + Two_Sum(Q, enow, Qnew, hh); + Q = Qnew; + if (hh != 0.0) { + h[hindex++] = hh; + } + } + if ((Q != 0.0) || (hindex == 0)) { + h[hindex++] = Q; + } + return hindex; +} + +/*****************************************************************************/ +/* */ +/* expansion_sum() Sum two expansions. */ +/* */ +/* Sets h = e + f. See the long version of my paper for details. */ +/* */ +/* Maintains the nonoverlapping property. If round-to-even is used (as */ +/* with IEEE 754), maintains the nonadjacent property as well. (That is, */ +/* if e has one of these properties, so will h.) Does NOT maintain the */ +/* strongly nonoverlapping property. */ +/* */ +/*****************************************************************************/ + +int expansion_sum(int elen, REAL *e, int flen, REAL *f, REAL *h) +/* e and h can be the same, but f and h cannot. */ +{ + REAL Q; + INEXACT REAL Qnew; + int findex, hindex, hlast; + REAL hnow; + INEXACT REAL bvirt; + REAL avirt, bround, around; + + Q = f[0]; + for (hindex = 0; hindex < elen; hindex++) { + hnow = e[hindex]; + Two_Sum(Q, hnow, Qnew, h[hindex]); + Q = Qnew; + } + h[hindex] = Q; + hlast = hindex; + for (findex = 1; findex < flen; findex++) { + Q = f[findex]; + for (hindex = findex; hindex <= hlast; hindex++) { + hnow = h[hindex]; + Two_Sum(Q, hnow, Qnew, h[hindex]); + Q = Qnew; + } + h[++hlast] = Q; + } + return hlast + 1; +} + +/*****************************************************************************/ +/* */ +/* expansion_sum_zeroelim1() Sum two expansions, eliminating zero */ +/* components from the output expansion. */ +/* */ +/* Sets h = e + f. See the long version of my paper for details. */ +/* */ +/* Maintains the nonoverlapping property. If round-to-even is used (as */ +/* with IEEE 754), maintains the nonadjacent property as well. (That is, */ +/* if e has one of these properties, so will h.) Does NOT maintain the */ +/* strongly nonoverlapping property. */ +/* */ +/*****************************************************************************/ + +int expansion_sum_zeroelim1(int elen, REAL *e, int flen, REAL *f, REAL *h) +/* e and h can be the same, but f and h cannot. */ +{ + REAL Q; + INEXACT REAL Qnew; + int index, findex, hindex, hlast; + REAL hnow; + INEXACT REAL bvirt; + REAL avirt, bround, around; + + Q = f[0]; + for (hindex = 0; hindex < elen; hindex++) { + hnow = e[hindex]; + Two_Sum(Q, hnow, Qnew, h[hindex]); + Q = Qnew; + } + h[hindex] = Q; + hlast = hindex; + for (findex = 1; findex < flen; findex++) { + Q = f[findex]; + for (hindex = findex; hindex <= hlast; hindex++) { + hnow = h[hindex]; + Two_Sum(Q, hnow, Qnew, h[hindex]); + Q = Qnew; + } + h[++hlast] = Q; + } + hindex = -1; + for (index = 0; index <= hlast; index++) { + hnow = h[index]; + if (hnow != 0.0) { + h[++hindex] = hnow; + } + } + if (hindex == -1) { + return 1; + } else { + return hindex + 1; + } +} + +/*****************************************************************************/ +/* */ +/* expansion_sum_zeroelim2() Sum two expansions, eliminating zero */ +/* components from the output expansion. */ +/* */ +/* Sets h = e + f. See the long version of my paper for details. */ +/* */ +/* Maintains the nonoverlapping property. If round-to-even is used (as */ +/* with IEEE 754), maintains the nonadjacent property as well. (That is, */ +/* if e has one of these properties, so will h.) Does NOT maintain the */ +/* strongly nonoverlapping property. */ +/* */ +/*****************************************************************************/ + +int expansion_sum_zeroelim2(int elen, REAL *e, int flen, REAL *f, REAL *h) +/* e and h can be the same, but f and h cannot. */ +{ + REAL Q, hh; + INEXACT REAL Qnew; + int eindex, findex, hindex, hlast; + REAL enow; + INEXACT REAL bvirt; + REAL avirt, bround, around; + + hindex = 0; + Q = f[0]; + for (eindex = 0; eindex < elen; eindex++) { + enow = e[eindex]; + Two_Sum(Q, enow, Qnew, hh); + Q = Qnew; + if (hh != 0.0) { + h[hindex++] = hh; + } + } + h[hindex] = Q; + hlast = hindex; + for (findex = 1; findex < flen; findex++) { + hindex = 0; + Q = f[findex]; + for (eindex = 0; eindex <= hlast; eindex++) { + enow = h[eindex]; + Two_Sum(Q, enow, Qnew, hh); + Q = Qnew; + if (hh != 0) { + h[hindex++] = hh; + } + } + h[hindex] = Q; + hlast = hindex; + } + return hlast + 1; +} + +/*****************************************************************************/ +/* */ +/* fast_expansion_sum() Sum two expansions. */ +/* */ +/* Sets h = e + f. See the long version of my paper for details. */ +/* */ +/* If round-to-even is used (as with IEEE 754), maintains the strongly */ +/* nonoverlapping property. (That is, if e is strongly nonoverlapping, h */ +/* will be also.) Does NOT maintain the nonoverlapping or nonadjacent */ +/* properties. */ +/* */ +/*****************************************************************************/ + +int fast_expansion_sum(int elen, REAL *e, int flen, REAL *f, REAL *h) +/* h cannot be e or f. */ +{ + REAL Q; + INEXACT REAL Qnew; + INEXACT REAL bvirt; + REAL avirt, bround, around; + int eindex, findex, hindex; + REAL enow, fnow; + + enow = e[0]; + fnow = f[0]; + eindex = findex = 0; + if ((fnow > enow) == (fnow > -enow)) { + Q = enow; + enow = e[++eindex]; + } else { + Q = fnow; + fnow = f[++findex]; + } + hindex = 0; + if ((eindex < elen) && (findex < flen)) { + if ((fnow > enow) == (fnow > -enow)) { + Fast_Two_Sum(enow, Q, Qnew, h[0]); + enow = e[++eindex]; + } else { + Fast_Two_Sum(fnow, Q, Qnew, h[0]); + fnow = f[++findex]; + } + Q = Qnew; + hindex = 1; + while ((eindex < elen) && (findex < flen)) { + if ((fnow > enow) == (fnow > -enow)) { + Two_Sum(Q, enow, Qnew, h[hindex]); + enow = e[++eindex]; + } else { + Two_Sum(Q, fnow, Qnew, h[hindex]); + fnow = f[++findex]; + } + Q = Qnew; + hindex++; + } + } + while (eindex < elen) { + Two_Sum(Q, enow, Qnew, h[hindex]); + enow = e[++eindex]; + Q = Qnew; + hindex++; + } + while (findex < flen) { + Two_Sum(Q, fnow, Qnew, h[hindex]); + fnow = f[++findex]; + Q = Qnew; + hindex++; + } + h[hindex] = Q; + return hindex + 1; +} + +/*****************************************************************************/ +/* */ +/* fast_expansion_sum_zeroelim() Sum two expansions, eliminating zero */ +/* components from the output expansion. */ +/* */ +/* Sets h = e + f. See the long version of my paper for details. */ +/* */ +/* If round-to-even is used (as with IEEE 754), maintains the strongly */ +/* nonoverlapping property. (That is, if e is strongly nonoverlapping, h */ +/* will be also.) Does NOT maintain the nonoverlapping or nonadjacent */ +/* properties. */ +/* */ +/*****************************************************************************/ + +int fast_expansion_sum_zeroelim(int elen, REAL *e, int flen, REAL *f, REAL *h) +/* h cannot be e or f. */ +{ + REAL Q; + INEXACT REAL Qnew; + INEXACT REAL hh; + INEXACT REAL bvirt; + REAL avirt, bround, around; + int eindex, findex, hindex; + REAL enow, fnow; + + enow = e[0]; + fnow = f[0]; + eindex = findex = 0; + if ((fnow > enow) == (fnow > -enow)) { + Q = enow; + enow = e[++eindex]; + } else { + Q = fnow; + fnow = f[++findex]; + } + hindex = 0; + if ((eindex < elen) && (findex < flen)) { + if ((fnow > enow) == (fnow > -enow)) { + Fast_Two_Sum(enow, Q, Qnew, hh); + enow = e[++eindex]; + } else { + Fast_Two_Sum(fnow, Q, Qnew, hh); + fnow = f[++findex]; + } + Q = Qnew; + if (hh != 0.0) { + h[hindex++] = hh; + } + while ((eindex < elen) && (findex < flen)) { + if ((fnow > enow) == (fnow > -enow)) { + Two_Sum(Q, enow, Qnew, hh); + enow = e[++eindex]; + } else { + Two_Sum(Q, fnow, Qnew, hh); + fnow = f[++findex]; + } + Q = Qnew; + if (hh != 0.0) { + h[hindex++] = hh; + } + } + } + while (eindex < elen) { + Two_Sum(Q, enow, Qnew, hh); + enow = e[++eindex]; + Q = Qnew; + if (hh != 0.0) { + h[hindex++] = hh; + } + } + while (findex < flen) { + Two_Sum(Q, fnow, Qnew, hh); + fnow = f[++findex]; + Q = Qnew; + if (hh != 0.0) { + h[hindex++] = hh; + } + } + if ((Q != 0.0) || (hindex == 0)) { + h[hindex++] = Q; + } + return hindex; +} + +/*****************************************************************************/ +/* */ +/* linear_expansion_sum() Sum two expansions. */ +/* */ +/* Sets h = e + f. See either version of my paper for details. */ +/* */ +/* Maintains the nonoverlapping property. (That is, if e is */ +/* nonoverlapping, h will be also.) */ +/* */ +/*****************************************************************************/ + +int linear_expansion_sum(int elen, REAL *e, int flen, REAL *f, REAL *h) +/* h cannot be e or f. */ +{ + REAL Q, q; + INEXACT REAL Qnew; + INEXACT REAL R; + INEXACT REAL bvirt; + REAL avirt, bround, around; + int eindex, findex, hindex; + REAL enow, fnow; + REAL g0; + + enow = e[0]; + fnow = f[0]; + eindex = findex = 0; + if ((fnow > enow) == (fnow > -enow)) { + g0 = enow; + enow = e[++eindex]; + } else { + g0 = fnow; + fnow = f[++findex]; + } + if ((eindex < elen) && ((findex >= flen) + || ((fnow > enow) == (fnow > -enow)))) { + Fast_Two_Sum(enow, g0, Qnew, q); + enow = e[++eindex]; + } else { + Fast_Two_Sum(fnow, g0, Qnew, q); + fnow = f[++findex]; + } + Q = Qnew; + for (hindex = 0; hindex < elen + flen - 2; hindex++) { + if ((eindex < elen) && ((findex >= flen) + || ((fnow > enow) == (fnow > -enow)))) { + Fast_Two_Sum(enow, q, R, h[hindex]); + enow = e[++eindex]; + } else { + Fast_Two_Sum(fnow, q, R, h[hindex]); + fnow = f[++findex]; + } + Two_Sum(Q, R, Qnew, q); + Q = Qnew; + } + h[hindex] = q; + h[hindex + 1] = Q; + return hindex + 2; +} + +/*****************************************************************************/ +/* */ +/* linear_expansion_sum_zeroelim() Sum two expansions, eliminating zero */ +/* components from the output expansion. */ +/* */ +/* Sets h = e + f. See either version of my paper for details. */ +/* */ +/* Maintains the nonoverlapping property. (That is, if e is */ +/* nonoverlapping, h will be also.) */ +/* */ +/*****************************************************************************/ + +int linear_expansion_sum_zeroelim(int elen, REAL *e, int flen, REAL *f, + REAL *h) +/* h cannot be e or f. */ +{ + REAL Q, q, hh; + INEXACT REAL Qnew; + INEXACT REAL R; + INEXACT REAL bvirt; + REAL avirt, bround, around; + int eindex, findex, hindex; + int count; + REAL enow, fnow; + REAL g0; + + enow = e[0]; + fnow = f[0]; + eindex = findex = 0; + hindex = 0; + if ((fnow > enow) == (fnow > -enow)) { + g0 = enow; + enow = e[++eindex]; + } else { + g0 = fnow; + fnow = f[++findex]; + } + if ((eindex < elen) && ((findex >= flen) + || ((fnow > enow) == (fnow > -enow)))) { + Fast_Two_Sum(enow, g0, Qnew, q); + enow = e[++eindex]; + } else { + Fast_Two_Sum(fnow, g0, Qnew, q); + fnow = f[++findex]; + } + Q = Qnew; + for (count = 2; count < elen + flen; count++) { + if ((eindex < elen) && ((findex >= flen) + || ((fnow > enow) == (fnow > -enow)))) { + Fast_Two_Sum(enow, q, R, hh); + enow = e[++eindex]; + } else { + Fast_Two_Sum(fnow, q, R, hh); + fnow = f[++findex]; + } + Two_Sum(Q, R, Qnew, q); + Q = Qnew; + if (hh != 0) { + h[hindex++] = hh; + } + } + if (q != 0) { + h[hindex++] = q; + } + if ((Q != 0.0) || (hindex == 0)) { + h[hindex++] = Q; + } + return hindex; +} + +/*****************************************************************************/ +/* */ +/* scale_expansion() Multiply an expansion by a scalar. */ +/* */ +/* Sets h = be. See either version of my paper for details. */ +/* */ +/* Maintains the nonoverlapping property. If round-to-even is used (as */ +/* with IEEE 754), maintains the strongly nonoverlapping and nonadjacent */ +/* properties as well. (That is, if e has one of these properties, so */ +/* will h.) */ +/* */ +/*****************************************************************************/ + +int scale_expansion(int elen, REAL *e, REAL b, REAL *h) +/* e and h cannot be the same. */ +{ + INEXACT REAL Q; + INEXACT REAL sum; + INEXACT REAL product1; + REAL product0; + int eindex, hindex; + REAL enow; + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + + Split(b, bhi, blo); + Two_Product_Presplit(e[0], b, bhi, blo, Q, h[0]); + hindex = 1; + for (eindex = 1; eindex < elen; eindex++) { + enow = e[eindex]; + Two_Product_Presplit(enow, b, bhi, blo, product1, product0); + Two_Sum(Q, product0, sum, h[hindex]); + hindex++; + Two_Sum(product1, sum, Q, h[hindex]); + hindex++; + } + h[hindex] = Q; + return elen + elen; +} + +/*****************************************************************************/ +/* */ +/* scale_expansion_zeroelim() Multiply an expansion by a scalar, */ +/* eliminating zero components from the */ +/* output expansion. */ +/* */ +/* Sets h = be. See either version of my paper for details. */ +/* */ +/* Maintains the nonoverlapping property. If round-to-even is used (as */ +/* with IEEE 754), maintains the strongly nonoverlapping and nonadjacent */ +/* properties as well. (That is, if e has one of these properties, so */ +/* will h.) */ +/* */ +/*****************************************************************************/ + +int scale_expansion_zeroelim(int elen, REAL *e, REAL b, REAL *h) +/* e and h cannot be the same. */ +{ + INEXACT REAL Q, sum; + REAL hh; + INEXACT REAL product1; + REAL product0; + int eindex, hindex; + REAL enow; + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + + Split(b, bhi, blo); + Two_Product_Presplit(e[0], b, bhi, blo, Q, hh); + hindex = 0; + if (hh != 0) { + h[hindex++] = hh; + } + for (eindex = 1; eindex < elen; eindex++) { + enow = e[eindex]; + Two_Product_Presplit(enow, b, bhi, blo, product1, product0); + Two_Sum(Q, product0, sum, hh); + if (hh != 0) { + h[hindex++] = hh; + } + Fast_Two_Sum(product1, sum, Q, hh); + if (hh != 0) { + h[hindex++] = hh; + } + } + if ((Q != 0.0) || (hindex == 0)) { + h[hindex++] = Q; + } + return hindex; +} + +/*****************************************************************************/ +/* */ +/* compress() Compress an expansion. */ +/* */ +/* See the long version of my paper for details. */ +/* */ +/* Maintains the nonoverlapping property. If round-to-even is used (as */ +/* with IEEE 754), then any nonoverlapping expansion is converted to a */ +/* nonadjacent expansion. */ +/* */ +/*****************************************************************************/ + +int compress(int elen, REAL *e, REAL *h) +/* e and h may be the same. */ +{ + REAL Q, q; + INEXACT REAL Qnew; + int eindex, hindex; + INEXACT REAL bvirt; + REAL enow, hnow; + int top, bottom; + + bottom = elen - 1; + Q = e[bottom]; + for (eindex = elen - 2; eindex >= 0; eindex--) { + enow = e[eindex]; + Fast_Two_Sum(Q, enow, Qnew, q); + if (q != 0) { + h[bottom--] = Qnew; + Q = q; + } else { + Q = Qnew; + } + } + top = 0; + for (hindex = bottom + 1; hindex < elen; hindex++) { + hnow = h[hindex]; + Fast_Two_Sum(hnow, Q, Qnew, q); + if (q != 0) { + h[top++] = q; + } + Q = Qnew; + } + h[top] = Q; + return top + 1; +} + +/*****************************************************************************/ +/* */ +/* estimate() Produce a one-word estimate of an expansion's value. */ +/* */ +/* See either version of my paper for details. */ +/* */ +/*****************************************************************************/ + +REAL estimate(int elen, REAL *e) +{ + REAL Q; + int eindex; + + Q = e[0]; + for (eindex = 1; eindex < elen; eindex++) { + Q += e[eindex]; + } + return Q; +} + +/*****************************************************************************/ +/* */ +/* orient2dfast() Approximate 2D orientation test. Nonrobust. */ +/* orient2dexact() Exact 2D orientation test. Robust. */ +/* orient2dslow() Another exact 2D orientation test. Robust. */ +/* orient2d() Adaptive exact 2D orientation test. Robust. */ +/* */ +/* Return a positive value if the points pa, pb, and pc occur */ +/* in counterclockwise order; a negative value if they occur */ +/* in clockwise order; and zero if they are collinear. The */ +/* result is also a rough approximation of twice the signed */ +/* area of the triangle defined by the three points. */ +/* */ +/* Only the first and last routine should be used; the middle two are for */ +/* timings. */ +/* */ +/* The last three use exact arithmetic to ensure a correct answer. The */ +/* result returned is the determinant of a matrix. In orient2d() only, */ +/* this determinant is computed adaptively, in the sense that exact */ +/* arithmetic is used only to the degree it is needed to ensure that the */ +/* returned value has the correct sign. Hence, orient2d() is usually quite */ +/* fast, but will run more slowly when the input points are collinear or */ +/* nearly so. */ +/* */ +/*****************************************************************************/ + +REAL orient2dfast(REAL *pa, REAL *pb, REAL *pc) +{ + REAL acx, bcx, acy, bcy; + + acx = pa[0] - pc[0]; + bcx = pb[0] - pc[0]; + acy = pa[1] - pc[1]; + bcy = pb[1] - pc[1]; + return acx * bcy - acy * bcx; +} + +REAL orient2dexact(REAL *pa, REAL *pb, REAL *pc) +{ + INEXACT REAL axby1, axcy1, bxcy1, bxay1, cxay1, cxby1; + REAL axby0, axcy0, bxcy0, bxay0, cxay0, cxby0; + REAL aterms[4], bterms[4], cterms[4]; + INEXACT REAL aterms3, bterms3, cterms3; + REAL v[8], w[12]; + int vlength, wlength; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j; + REAL _0; + + Two_Product(pa[0], pb[1], axby1, axby0); + Two_Product(pa[0], pc[1], axcy1, axcy0); + Two_Two_Diff(axby1, axby0, axcy1, axcy0, + aterms3, aterms[2], aterms[1], aterms[0]); + aterms[3] = aterms3; + + Two_Product(pb[0], pc[1], bxcy1, bxcy0); + Two_Product(pb[0], pa[1], bxay1, bxay0); + Two_Two_Diff(bxcy1, bxcy0, bxay1, bxay0, + bterms3, bterms[2], bterms[1], bterms[0]); + bterms[3] = bterms3; + + Two_Product(pc[0], pa[1], cxay1, cxay0); + Two_Product(pc[0], pb[1], cxby1, cxby0); + Two_Two_Diff(cxay1, cxay0, cxby1, cxby0, + cterms3, cterms[2], cterms[1], cterms[0]); + cterms[3] = cterms3; + + vlength = fast_expansion_sum_zeroelim(4, aterms, 4, bterms, v); + wlength = fast_expansion_sum_zeroelim(vlength, v, 4, cterms, w); + + return w[wlength - 1]; +} + +REAL orient2dslow(REAL *pa, REAL *pb, REAL *pc) +{ + INEXACT REAL acx, acy, bcx, bcy; + REAL acxtail, acytail; + REAL bcxtail, bcytail; + REAL negate, negatetail; + REAL axby[8], bxay[8]; + INEXACT REAL axby7, bxay7; + REAL deter[16]; + int deterlen; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL a0hi, a0lo, a1hi, a1lo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j, _k, _l, _m, _n; + REAL _0, _1, _2; + + Two_Diff(pa[0], pc[0], acx, acxtail); + Two_Diff(pa[1], pc[1], acy, acytail); + Two_Diff(pb[0], pc[0], bcx, bcxtail); + Two_Diff(pb[1], pc[1], bcy, bcytail); + + Two_Two_Product(acx, acxtail, bcy, bcytail, + axby7, axby[6], axby[5], axby[4], + axby[3], axby[2], axby[1], axby[0]); + axby[7] = axby7; + negate = -acy; + negatetail = -acytail; + Two_Two_Product(bcx, bcxtail, negate, negatetail, + bxay7, bxay[6], bxay[5], bxay[4], + bxay[3], bxay[2], bxay[1], bxay[0]); + bxay[7] = bxay7; + + deterlen = fast_expansion_sum_zeroelim(8, axby, 8, bxay, deter); + + return deter[deterlen - 1]; +} + +REAL orient2dadapt(REAL *pa, REAL *pb, REAL *pc, REAL detsum) +{ + INEXACT REAL acx, acy, bcx, bcy; + REAL acxtail, acytail, bcxtail, bcytail; + INEXACT REAL detleft, detright; + REAL detlefttail, detrighttail; + REAL det, errbound; + REAL B[4], C1[8], C2[12], D[16]; + INEXACT REAL B3; + int C1length, C2length, Dlength; + REAL u[4]; + INEXACT REAL u3; + INEXACT REAL s1, t1; + REAL s0, t0; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j; + REAL _0; + + acx = (REAL) (pa[0] - pc[0]); + bcx = (REAL) (pb[0] - pc[0]); + acy = (REAL) (pa[1] - pc[1]); + bcy = (REAL) (pb[1] - pc[1]); + + Two_Product(acx, bcy, detleft, detlefttail); + Two_Product(acy, bcx, detright, detrighttail); + + Two_Two_Diff(detleft, detlefttail, detright, detrighttail, + B3, B[2], B[1], B[0]); + B[3] = B3; + + det = estimate(4, B); + errbound = ccwerrboundB * detsum; + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + Two_Diff_Tail(pa[0], pc[0], acx, acxtail); + Two_Diff_Tail(pb[0], pc[0], bcx, bcxtail); + Two_Diff_Tail(pa[1], pc[1], acy, acytail); + Two_Diff_Tail(pb[1], pc[1], bcy, bcytail); + + if ((acxtail == 0.0) && (acytail == 0.0) + && (bcxtail == 0.0) && (bcytail == 0.0)) { + return det; + } + + errbound = ccwerrboundC * detsum + resulterrbound * Absolute(det); + det += (acx * bcytail + bcy * acxtail) + - (acy * bcxtail + bcx * acytail); + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + Two_Product(acxtail, bcy, s1, s0); + Two_Product(acytail, bcx, t1, t0); + Two_Two_Diff(s1, s0, t1, t0, u3, u[2], u[1], u[0]); + u[3] = u3; + C1length = fast_expansion_sum_zeroelim(4, B, 4, u, C1); + + Two_Product(acx, bcytail, s1, s0); + Two_Product(acy, bcxtail, t1, t0); + Two_Two_Diff(s1, s0, t1, t0, u3, u[2], u[1], u[0]); + u[3] = u3; + C2length = fast_expansion_sum_zeroelim(C1length, C1, 4, u, C2); + + Two_Product(acxtail, bcytail, s1, s0); + Two_Product(acytail, bcxtail, t1, t0); + Two_Two_Diff(s1, s0, t1, t0, u3, u[2], u[1], u[0]); + u[3] = u3; + Dlength = fast_expansion_sum_zeroelim(C2length, C2, 4, u, D); + + return(D[Dlength - 1]); +} + +REAL orient2d(REAL *pa, REAL *pb, REAL *pc) +{ + REAL detleft, detright, det; + REAL detsum, errbound; + + detleft = (pa[0] - pc[0]) * (pb[1] - pc[1]); + detright = (pa[1] - pc[1]) * (pb[0] - pc[0]); + det = detleft - detright; + + if (detleft > 0.0) { + if (detright <= 0.0) { + return det; + } else { + detsum = detleft + detright; + } + } else if (detleft < 0.0) { + if (detright >= 0.0) { + return det; + } else { + detsum = -detleft - detright; + } + } else { + return det; + } + + errbound = ccwerrboundA * detsum; + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + return orient2dadapt(pa, pb, pc, detsum); +} + +/*****************************************************************************/ +/* */ +/* orient3dfast() Approximate 3D orientation test. Nonrobust. */ +/* orient3dexact() Exact 3D orientation test. Robust. */ +/* orient3dslow() Another exact 3D orientation test. Robust. */ +/* orient3d() Adaptive exact 3D orientation test. Robust. */ +/* */ +/* Return a positive value if the point pd lies below the */ +/* plane passing through pa, pb, and pc; "below" is defined so */ +/* that pa, pb, and pc appear in counterclockwise order when */ +/* viewed from above the plane. Returns a negative value if */ +/* pd lies above the plane. Returns zero if the points are */ +/* coplanar. The result is also a rough approximation of six */ +/* times the signed volume of the tetrahedron defined by the */ +/* four points. */ +/* */ +/* Only the first and last routine should be used; the middle two are for */ +/* timings. */ +/* */ +/* The last three use exact arithmetic to ensure a correct answer. The */ +/* result returned is the determinant of a matrix. In orient3d() only, */ +/* this determinant is computed adaptively, in the sense that exact */ +/* arithmetic is used only to the degree it is needed to ensure that the */ +/* returned value has the correct sign. Hence, orient3d() is usually quite */ +/* fast, but will run more slowly when the input points are coplanar or */ +/* nearly so. */ +/* */ +/*****************************************************************************/ + +REAL orient3dfast(REAL *pa, REAL *pb, REAL *pc, REAL *pd) +{ + REAL adx, bdx, cdx; + REAL ady, bdy, cdy; + REAL adz, bdz, cdz; + + adx = pa[0] - pd[0]; + bdx = pb[0] - pd[0]; + cdx = pc[0] - pd[0]; + ady = pa[1] - pd[1]; + bdy = pb[1] - pd[1]; + cdy = pc[1] - pd[1]; + adz = pa[2] - pd[2]; + bdz = pb[2] - pd[2]; + cdz = pc[2] - pd[2]; + + return adx * (bdy * cdz - bdz * cdy) + + bdx * (cdy * adz - cdz * ady) + + cdx * (ady * bdz - adz * bdy); +} + +REAL orient3dexact(REAL *pa, REAL *pb, REAL *pc, REAL *pd) +{ + INEXACT REAL axby1, bxcy1, cxdy1, dxay1, axcy1, bxdy1; + INEXACT REAL bxay1, cxby1, dxcy1, axdy1, cxay1, dxby1; + REAL axby0, bxcy0, cxdy0, dxay0, axcy0, bxdy0; + REAL bxay0, cxby0, dxcy0, axdy0, cxay0, dxby0; + REAL ab[4], bc[4], cd[4], da[4], ac[4], bd[4]; + REAL temp8[8]; + int templen; + REAL abc[12], bcd[12], cda[12], dab[12]; + int abclen, bcdlen, cdalen, dablen; + REAL adet[24], bdet[24], cdet[24], ddet[24]; + int alen, blen, clen, dlen; + REAL abdet[48], cddet[48]; + int ablen, cdlen; + REAL deter[96]; + int deterlen; + int i; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j; + REAL _0; + + Two_Product(pa[0], pb[1], axby1, axby0); + Two_Product(pb[0], pa[1], bxay1, bxay0); + Two_Two_Diff(axby1, axby0, bxay1, bxay0, ab[3], ab[2], ab[1], ab[0]); + + Two_Product(pb[0], pc[1], bxcy1, bxcy0); + Two_Product(pc[0], pb[1], cxby1, cxby0); + Two_Two_Diff(bxcy1, bxcy0, cxby1, cxby0, bc[3], bc[2], bc[1], bc[0]); + + Two_Product(pc[0], pd[1], cxdy1, cxdy0); + Two_Product(pd[0], pc[1], dxcy1, dxcy0); + Two_Two_Diff(cxdy1, cxdy0, dxcy1, dxcy0, cd[3], cd[2], cd[1], cd[0]); + + Two_Product(pd[0], pa[1], dxay1, dxay0); + Two_Product(pa[0], pd[1], axdy1, axdy0); + Two_Two_Diff(dxay1, dxay0, axdy1, axdy0, da[3], da[2], da[1], da[0]); + + Two_Product(pa[0], pc[1], axcy1, axcy0); + Two_Product(pc[0], pa[1], cxay1, cxay0); + Two_Two_Diff(axcy1, axcy0, cxay1, cxay0, ac[3], ac[2], ac[1], ac[0]); + + Two_Product(pb[0], pd[1], bxdy1, bxdy0); + Two_Product(pd[0], pb[1], dxby1, dxby0); + Two_Two_Diff(bxdy1, bxdy0, dxby1, dxby0, bd[3], bd[2], bd[1], bd[0]); + + templen = fast_expansion_sum_zeroelim(4, cd, 4, da, temp8); + cdalen = fast_expansion_sum_zeroelim(templen, temp8, 4, ac, cda); + templen = fast_expansion_sum_zeroelim(4, da, 4, ab, temp8); + dablen = fast_expansion_sum_zeroelim(templen, temp8, 4, bd, dab); + for (i = 0; i < 4; i++) { + bd[i] = -bd[i]; + ac[i] = -ac[i]; + } + templen = fast_expansion_sum_zeroelim(4, ab, 4, bc, temp8); + abclen = fast_expansion_sum_zeroelim(templen, temp8, 4, ac, abc); + templen = fast_expansion_sum_zeroelim(4, bc, 4, cd, temp8); + bcdlen = fast_expansion_sum_zeroelim(templen, temp8, 4, bd, bcd); + + alen = scale_expansion_zeroelim(bcdlen, bcd, pa[2], adet); + blen = scale_expansion_zeroelim(cdalen, cda, -pb[2], bdet); + clen = scale_expansion_zeroelim(dablen, dab, pc[2], cdet); + dlen = scale_expansion_zeroelim(abclen, abc, -pd[2], ddet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + cdlen = fast_expansion_sum_zeroelim(clen, cdet, dlen, ddet, cddet); + deterlen = fast_expansion_sum_zeroelim(ablen, abdet, cdlen, cddet, deter); + + return deter[deterlen - 1]; +} + +REAL orient3dslow(REAL *pa, REAL *pb, REAL *pc, REAL *pd) +{ + INEXACT REAL adx, ady, adz, bdx, bdy, bdz, cdx, cdy, cdz; + REAL adxtail, adytail, adztail; + REAL bdxtail, bdytail, bdztail; + REAL cdxtail, cdytail, cdztail; + REAL negate, negatetail; + INEXACT REAL axby7, bxcy7, axcy7, bxay7, cxby7, cxay7; + REAL axby[8], bxcy[8], axcy[8], bxay[8], cxby[8], cxay[8]; + REAL temp16[16], temp32[32], temp32t[32]; + int temp16len, temp32len, temp32tlen; + REAL adet[64], bdet[64], cdet[64]; + int alen, blen, clen; + REAL abdet[128]; + int ablen; + REAL deter[192]; + int deterlen; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL a0hi, a0lo, a1hi, a1lo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j, _k, _l, _m, _n; + REAL _0, _1, _2; + + Two_Diff(pa[0], pd[0], adx, adxtail); + Two_Diff(pa[1], pd[1], ady, adytail); + Two_Diff(pa[2], pd[2], adz, adztail); + Two_Diff(pb[0], pd[0], bdx, bdxtail); + Two_Diff(pb[1], pd[1], bdy, bdytail); + Two_Diff(pb[2], pd[2], bdz, bdztail); + Two_Diff(pc[0], pd[0], cdx, cdxtail); + Two_Diff(pc[1], pd[1], cdy, cdytail); + Two_Diff(pc[2], pd[2], cdz, cdztail); + + Two_Two_Product(adx, adxtail, bdy, bdytail, + axby7, axby[6], axby[5], axby[4], + axby[3], axby[2], axby[1], axby[0]); + axby[7] = axby7; + negate = -ady; + negatetail = -adytail; + Two_Two_Product(bdx, bdxtail, negate, negatetail, + bxay7, bxay[6], bxay[5], bxay[4], + bxay[3], bxay[2], bxay[1], bxay[0]); + bxay[7] = bxay7; + Two_Two_Product(bdx, bdxtail, cdy, cdytail, + bxcy7, bxcy[6], bxcy[5], bxcy[4], + bxcy[3], bxcy[2], bxcy[1], bxcy[0]); + bxcy[7] = bxcy7; + negate = -bdy; + negatetail = -bdytail; + Two_Two_Product(cdx, cdxtail, negate, negatetail, + cxby7, cxby[6], cxby[5], cxby[4], + cxby[3], cxby[2], cxby[1], cxby[0]); + cxby[7] = cxby7; + Two_Two_Product(cdx, cdxtail, ady, adytail, + cxay7, cxay[6], cxay[5], cxay[4], + cxay[3], cxay[2], cxay[1], cxay[0]); + cxay[7] = cxay7; + negate = -cdy; + negatetail = -cdytail; + Two_Two_Product(adx, adxtail, negate, negatetail, + axcy7, axcy[6], axcy[5], axcy[4], + axcy[3], axcy[2], axcy[1], axcy[0]); + axcy[7] = axcy7; + + temp16len = fast_expansion_sum_zeroelim(8, bxcy, 8, cxby, temp16); + temp32len = scale_expansion_zeroelim(temp16len, temp16, adz, temp32); + temp32tlen = scale_expansion_zeroelim(temp16len, temp16, adztail, temp32t); + alen = fast_expansion_sum_zeroelim(temp32len, temp32, temp32tlen, temp32t, + adet); + + temp16len = fast_expansion_sum_zeroelim(8, cxay, 8, axcy, temp16); + temp32len = scale_expansion_zeroelim(temp16len, temp16, bdz, temp32); + temp32tlen = scale_expansion_zeroelim(temp16len, temp16, bdztail, temp32t); + blen = fast_expansion_sum_zeroelim(temp32len, temp32, temp32tlen, temp32t, + bdet); + + temp16len = fast_expansion_sum_zeroelim(8, axby, 8, bxay, temp16); + temp32len = scale_expansion_zeroelim(temp16len, temp16, cdz, temp32); + temp32tlen = scale_expansion_zeroelim(temp16len, temp16, cdztail, temp32t); + clen = fast_expansion_sum_zeroelim(temp32len, temp32, temp32tlen, temp32t, + cdet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + deterlen = fast_expansion_sum_zeroelim(ablen, abdet, clen, cdet, deter); + + return deter[deterlen - 1]; +} + +REAL orient3dadapt(REAL *pa, REAL *pb, REAL *pc, REAL *pd, REAL permanent) +{ + INEXACT REAL adx, bdx, cdx, ady, bdy, cdy, adz, bdz, cdz; + REAL det, errbound; + + INEXACT REAL bdxcdy1, cdxbdy1, cdxady1, adxcdy1, adxbdy1, bdxady1; + REAL bdxcdy0, cdxbdy0, cdxady0, adxcdy0, adxbdy0, bdxady0; + REAL bc[4], ca[4], ab[4]; + INEXACT REAL bc3, ca3, ab3; + REAL adet[8], bdet[8], cdet[8]; + int alen, blen, clen; + REAL abdet[16]; + int ablen; + REAL *finnow, *finother, *finswap; + REAL fin1[192], fin2[192]; + int finlength; + + + REAL adxtail, bdxtail, cdxtail; + REAL adytail, bdytail, cdytail; + REAL adztail, bdztail, cdztail; + INEXACT REAL at_blarge, at_clarge; + INEXACT REAL bt_clarge, bt_alarge; + INEXACT REAL ct_alarge, ct_blarge; + REAL at_b[4], at_c[4], bt_c[4], bt_a[4], ct_a[4], ct_b[4]; + int at_blen, at_clen, bt_clen, bt_alen, ct_alen, ct_blen; + INEXACT REAL bdxt_cdy1, cdxt_bdy1, cdxt_ady1; + INEXACT REAL adxt_cdy1, adxt_bdy1, bdxt_ady1; + REAL bdxt_cdy0, cdxt_bdy0, cdxt_ady0; + REAL adxt_cdy0, adxt_bdy0, bdxt_ady0; + INEXACT REAL bdyt_cdx1, cdyt_bdx1, cdyt_adx1; + INEXACT REAL adyt_cdx1, adyt_bdx1, bdyt_adx1; + REAL bdyt_cdx0, cdyt_bdx0, cdyt_adx0; + REAL adyt_cdx0, adyt_bdx0, bdyt_adx0; + REAL bct[8], cat[8], abt[8]; + int bctlen, catlen, abtlen; + INEXACT REAL bdxt_cdyt1, cdxt_bdyt1, cdxt_adyt1; + INEXACT REAL adxt_cdyt1, adxt_bdyt1, bdxt_adyt1; + REAL bdxt_cdyt0, cdxt_bdyt0, cdxt_adyt0; + REAL adxt_cdyt0, adxt_bdyt0, bdxt_adyt0; + REAL u[4], v[12], w[16]; + INEXACT REAL u3; + int vlength, wlength; + REAL negate; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j, _k; + REAL _0; + + + adx = (REAL) (pa[0] - pd[0]); + bdx = (REAL) (pb[0] - pd[0]); + cdx = (REAL) (pc[0] - pd[0]); + ady = (REAL) (pa[1] - pd[1]); + bdy = (REAL) (pb[1] - pd[1]); + cdy = (REAL) (pc[1] - pd[1]); + adz = (REAL) (pa[2] - pd[2]); + bdz = (REAL) (pb[2] - pd[2]); + cdz = (REAL) (pc[2] - pd[2]); + + Two_Product(bdx, cdy, bdxcdy1, bdxcdy0); + Two_Product(cdx, bdy, cdxbdy1, cdxbdy0); + Two_Two_Diff(bdxcdy1, bdxcdy0, cdxbdy1, cdxbdy0, bc3, bc[2], bc[1], bc[0]); + bc[3] = bc3; + alen = scale_expansion_zeroelim(4, bc, adz, adet); + + Two_Product(cdx, ady, cdxady1, cdxady0); + Two_Product(adx, cdy, adxcdy1, adxcdy0); + Two_Two_Diff(cdxady1, cdxady0, adxcdy1, adxcdy0, ca3, ca[2], ca[1], ca[0]); + ca[3] = ca3; + blen = scale_expansion_zeroelim(4, ca, bdz, bdet); + + Two_Product(adx, bdy, adxbdy1, adxbdy0); + Two_Product(bdx, ady, bdxady1, bdxady0); + Two_Two_Diff(adxbdy1, adxbdy0, bdxady1, bdxady0, ab3, ab[2], ab[1], ab[0]); + ab[3] = ab3; + clen = scale_expansion_zeroelim(4, ab, cdz, cdet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + finlength = fast_expansion_sum_zeroelim(ablen, abdet, clen, cdet, fin1); + + det = estimate(finlength, fin1); + errbound = o3derrboundB * permanent; + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + Two_Diff_Tail(pa[0], pd[0], adx, adxtail); + Two_Diff_Tail(pb[0], pd[0], bdx, bdxtail); + Two_Diff_Tail(pc[0], pd[0], cdx, cdxtail); + Two_Diff_Tail(pa[1], pd[1], ady, adytail); + Two_Diff_Tail(pb[1], pd[1], bdy, bdytail); + Two_Diff_Tail(pc[1], pd[1], cdy, cdytail); + Two_Diff_Tail(pa[2], pd[2], adz, adztail); + Two_Diff_Tail(pb[2], pd[2], bdz, bdztail); + Two_Diff_Tail(pc[2], pd[2], cdz, cdztail); + + if ((adxtail == 0.0) && (bdxtail == 0.0) && (cdxtail == 0.0) + && (adytail == 0.0) && (bdytail == 0.0) && (cdytail == 0.0) + && (adztail == 0.0) && (bdztail == 0.0) && (cdztail == 0.0)) { + return det; + } + + errbound = o3derrboundC * permanent + resulterrbound * Absolute(det); + det += (adz * ((bdx * cdytail + cdy * bdxtail) + - (bdy * cdxtail + cdx * bdytail)) + + adztail * (bdx * cdy - bdy * cdx)) + + (bdz * ((cdx * adytail + ady * cdxtail) + - (cdy * adxtail + adx * cdytail)) + + bdztail * (cdx * ady - cdy * adx)) + + (cdz * ((adx * bdytail + bdy * adxtail) + - (ady * bdxtail + bdx * adytail)) + + cdztail * (adx * bdy - ady * bdx)); + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + finnow = fin1; + finother = fin2; + + if (adxtail == 0.0) { + if (adytail == 0.0) { + at_b[0] = 0.0; + at_blen = 1; + at_c[0] = 0.0; + at_clen = 1; + } else { + negate = -adytail; + Two_Product(negate, bdx, at_blarge, at_b[0]); + at_b[1] = at_blarge; + at_blen = 2; + Two_Product(adytail, cdx, at_clarge, at_c[0]); + at_c[1] = at_clarge; + at_clen = 2; + } + } else { + if (adytail == 0.0) { + Two_Product(adxtail, bdy, at_blarge, at_b[0]); + at_b[1] = at_blarge; + at_blen = 2; + negate = -adxtail; + Two_Product(negate, cdy, at_clarge, at_c[0]); + at_c[1] = at_clarge; + at_clen = 2; + } else { + Two_Product(adxtail, bdy, adxt_bdy1, adxt_bdy0); + Two_Product(adytail, bdx, adyt_bdx1, adyt_bdx0); + Two_Two_Diff(adxt_bdy1, adxt_bdy0, adyt_bdx1, adyt_bdx0, + at_blarge, at_b[2], at_b[1], at_b[0]); + at_b[3] = at_blarge; + at_blen = 4; + Two_Product(adytail, cdx, adyt_cdx1, adyt_cdx0); + Two_Product(adxtail, cdy, adxt_cdy1, adxt_cdy0); + Two_Two_Diff(adyt_cdx1, adyt_cdx0, adxt_cdy1, adxt_cdy0, + at_clarge, at_c[2], at_c[1], at_c[0]); + at_c[3] = at_clarge; + at_clen = 4; + } + } + if (bdxtail == 0.0) { + if (bdytail == 0.0) { + bt_c[0] = 0.0; + bt_clen = 1; + bt_a[0] = 0.0; + bt_alen = 1; + } else { + negate = -bdytail; + Two_Product(negate, cdx, bt_clarge, bt_c[0]); + bt_c[1] = bt_clarge; + bt_clen = 2; + Two_Product(bdytail, adx, bt_alarge, bt_a[0]); + bt_a[1] = bt_alarge; + bt_alen = 2; + } + } else { + if (bdytail == 0.0) { + Two_Product(bdxtail, cdy, bt_clarge, bt_c[0]); + bt_c[1] = bt_clarge; + bt_clen = 2; + negate = -bdxtail; + Two_Product(negate, ady, bt_alarge, bt_a[0]); + bt_a[1] = bt_alarge; + bt_alen = 2; + } else { + Two_Product(bdxtail, cdy, bdxt_cdy1, bdxt_cdy0); + Two_Product(bdytail, cdx, bdyt_cdx1, bdyt_cdx0); + Two_Two_Diff(bdxt_cdy1, bdxt_cdy0, bdyt_cdx1, bdyt_cdx0, + bt_clarge, bt_c[2], bt_c[1], bt_c[0]); + bt_c[3] = bt_clarge; + bt_clen = 4; + Two_Product(bdytail, adx, bdyt_adx1, bdyt_adx0); + Two_Product(bdxtail, ady, bdxt_ady1, bdxt_ady0); + Two_Two_Diff(bdyt_adx1, bdyt_adx0, bdxt_ady1, bdxt_ady0, + bt_alarge, bt_a[2], bt_a[1], bt_a[0]); + bt_a[3] = bt_alarge; + bt_alen = 4; + } + } + if (cdxtail == 0.0) { + if (cdytail == 0.0) { + ct_a[0] = 0.0; + ct_alen = 1; + ct_b[0] = 0.0; + ct_blen = 1; + } else { + negate = -cdytail; + Two_Product(negate, adx, ct_alarge, ct_a[0]); + ct_a[1] = ct_alarge; + ct_alen = 2; + Two_Product(cdytail, bdx, ct_blarge, ct_b[0]); + ct_b[1] = ct_blarge; + ct_blen = 2; + } + } else { + if (cdytail == 0.0) { + Two_Product(cdxtail, ady, ct_alarge, ct_a[0]); + ct_a[1] = ct_alarge; + ct_alen = 2; + negate = -cdxtail; + Two_Product(negate, bdy, ct_blarge, ct_b[0]); + ct_b[1] = ct_blarge; + ct_blen = 2; + } else { + Two_Product(cdxtail, ady, cdxt_ady1, cdxt_ady0); + Two_Product(cdytail, adx, cdyt_adx1, cdyt_adx0); + Two_Two_Diff(cdxt_ady1, cdxt_ady0, cdyt_adx1, cdyt_adx0, + ct_alarge, ct_a[2], ct_a[1], ct_a[0]); + ct_a[3] = ct_alarge; + ct_alen = 4; + Two_Product(cdytail, bdx, cdyt_bdx1, cdyt_bdx0); + Two_Product(cdxtail, bdy, cdxt_bdy1, cdxt_bdy0); + Two_Two_Diff(cdyt_bdx1, cdyt_bdx0, cdxt_bdy1, cdxt_bdy0, + ct_blarge, ct_b[2], ct_b[1], ct_b[0]); + ct_b[3] = ct_blarge; + ct_blen = 4; + } + } + + bctlen = fast_expansion_sum_zeroelim(bt_clen, bt_c, ct_blen, ct_b, bct); + wlength = scale_expansion_zeroelim(bctlen, bct, adz, w); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, wlength, w, + finother); + finswap = finnow; finnow = finother; finother = finswap; + + catlen = fast_expansion_sum_zeroelim(ct_alen, ct_a, at_clen, at_c, cat); + wlength = scale_expansion_zeroelim(catlen, cat, bdz, w); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, wlength, w, + finother); + finswap = finnow; finnow = finother; finother = finswap; + + abtlen = fast_expansion_sum_zeroelim(at_blen, at_b, bt_alen, bt_a, abt); + wlength = scale_expansion_zeroelim(abtlen, abt, cdz, w); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, wlength, w, + finother); + finswap = finnow; finnow = finother; finother = finswap; + + if (adztail != 0.0) { + vlength = scale_expansion_zeroelim(4, bc, adztail, v); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, vlength, v, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (bdztail != 0.0) { + vlength = scale_expansion_zeroelim(4, ca, bdztail, v); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, vlength, v, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (cdztail != 0.0) { + vlength = scale_expansion_zeroelim(4, ab, cdztail, v); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, vlength, v, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + + if (adxtail != 0.0) { + if (bdytail != 0.0) { + Two_Product(adxtail, bdytail, adxt_bdyt1, adxt_bdyt0); + Two_One_Product(adxt_bdyt1, adxt_bdyt0, cdz, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + if (cdztail != 0.0) { + Two_One_Product(adxt_bdyt1, adxt_bdyt0, cdztail, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + } + if (cdytail != 0.0) { + negate = -adxtail; + Two_Product(negate, cdytail, adxt_cdyt1, adxt_cdyt0); + Two_One_Product(adxt_cdyt1, adxt_cdyt0, bdz, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + if (bdztail != 0.0) { + Two_One_Product(adxt_cdyt1, adxt_cdyt0, bdztail, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + } + } + if (bdxtail != 0.0) { + if (cdytail != 0.0) { + Two_Product(bdxtail, cdytail, bdxt_cdyt1, bdxt_cdyt0); + Two_One_Product(bdxt_cdyt1, bdxt_cdyt0, adz, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + if (adztail != 0.0) { + Two_One_Product(bdxt_cdyt1, bdxt_cdyt0, adztail, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + } + if (adytail != 0.0) { + negate = -bdxtail; + Two_Product(negate, adytail, bdxt_adyt1, bdxt_adyt0); + Two_One_Product(bdxt_adyt1, bdxt_adyt0, cdz, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + if (cdztail != 0.0) { + Two_One_Product(bdxt_adyt1, bdxt_adyt0, cdztail, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + } + } + if (cdxtail != 0.0) { + if (adytail != 0.0) { + Two_Product(cdxtail, adytail, cdxt_adyt1, cdxt_adyt0); + Two_One_Product(cdxt_adyt1, cdxt_adyt0, bdz, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + if (bdztail != 0.0) { + Two_One_Product(cdxt_adyt1, cdxt_adyt0, bdztail, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + } + if (bdytail != 0.0) { + negate = -cdxtail; + Two_Product(negate, bdytail, cdxt_bdyt1, cdxt_bdyt0); + Two_One_Product(cdxt_bdyt1, cdxt_bdyt0, adz, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + if (adztail != 0.0) { + Two_One_Product(cdxt_bdyt1, cdxt_bdyt0, adztail, u3, u[2], u[1], u[0]); + u[3] = u3; + finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + } + } + + if (adztail != 0.0) { + wlength = scale_expansion_zeroelim(bctlen, bct, adztail, w); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, wlength, w, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (bdztail != 0.0) { + wlength = scale_expansion_zeroelim(catlen, cat, bdztail, w); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, wlength, w, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (cdztail != 0.0) { + wlength = scale_expansion_zeroelim(abtlen, abt, cdztail, w); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, wlength, w, + finother); + finswap = finnow; finnow = finother; finother = finswap; + } + + return finnow[finlength - 1]; +} + +#ifdef USE_CGAL_PREDICATES + +REAL orient3d(REAL *pa, REAL *pb, REAL *pc, REAL *pd) +{ + return (REAL) + - cgal_pred_obj.orientation_3_object() + (Point(pa[0], pa[1], pa[2]), + Point(pb[0], pb[1], pb[2]), + Point(pc[0], pc[1], pc[2]), + Point(pd[0], pd[1], pd[2])); +} + +#else + +REAL orient3d(REAL *pa, REAL *pb, REAL *pc, REAL *pd) +{ + REAL adx, bdx, cdx, ady, bdy, cdy, adz, bdz, cdz; + REAL bdxcdy, cdxbdy, cdxady, adxcdy, adxbdy, bdxady; + REAL det; + + + adx = pa[0] - pd[0]; + ady = pa[1] - pd[1]; + adz = pa[2] - pd[2]; + bdx = pb[0] - pd[0]; + bdy = pb[1] - pd[1]; + bdz = pb[2] - pd[2]; + cdx = pc[0] - pd[0]; + cdy = pc[1] - pd[1]; + cdz = pc[2] - pd[2]; + + bdxcdy = bdx * cdy; + cdxbdy = cdx * bdy; + + cdxady = cdx * ady; + adxcdy = adx * cdy; + + adxbdy = adx * bdy; + bdxady = bdx * ady; + + det = adz * (bdxcdy - cdxbdy) + + bdz * (cdxady - adxcdy) + + cdz * (adxbdy - bdxady); + + if (_use_inexact_arith) { + return det; + } + + if (_use_static_filter) { + //if (fabs(det) > o3dstaticfilter) return det; + if (det > o3dstaticfilter) return det; + if (det < -o3dstaticfilter) return det; + } + + + REAL permanent, errbound; + + permanent = (Absolute(bdxcdy) + Absolute(cdxbdy)) * Absolute(adz) + + (Absolute(cdxady) + Absolute(adxcdy)) * Absolute(bdz) + + (Absolute(adxbdy) + Absolute(bdxady)) * Absolute(cdz); + errbound = o3derrboundA * permanent; + if ((det > errbound) || (-det > errbound)) { + return det; + } + + return orient3dadapt(pa, pb, pc, pd, permanent); +} + +#endif // #ifdef USE_CGAL_PREDICATES + +/*****************************************************************************/ +/* */ +/* incirclefast() Approximate 2D incircle test. Nonrobust. */ +/* incircleexact() Exact 2D incircle test. Robust. */ +/* incircleslow() Another exact 2D incircle test. Robust. */ +/* incircle() Adaptive exact 2D incircle test. Robust. */ +/* */ +/* Return a positive value if the point pd lies inside the */ +/* circle passing through pa, pb, and pc; a negative value if */ +/* it lies outside; and zero if the four points are cocircular.*/ +/* The points pa, pb, and pc must be in counterclockwise */ +/* order, or the sign of the result will be reversed. */ +/* */ +/* Only the first and last routine should be used; the middle two are for */ +/* timings. */ +/* */ +/* The last three use exact arithmetic to ensure a correct answer. The */ +/* result returned is the determinant of a matrix. In incircle() only, */ +/* this determinant is computed adaptively, in the sense that exact */ +/* arithmetic is used only to the degree it is needed to ensure that the */ +/* returned value has the correct sign. Hence, incircle() is usually quite */ +/* fast, but will run more slowly when the input points are cocircular or */ +/* nearly so. */ +/* */ +/*****************************************************************************/ + +REAL incirclefast(REAL *pa, REAL *pb, REAL *pc, REAL *pd) +{ + REAL adx, ady, bdx, bdy, cdx, cdy; + REAL abdet, bcdet, cadet; + REAL alift, blift, clift; + + adx = pa[0] - pd[0]; + ady = pa[1] - pd[1]; + bdx = pb[0] - pd[0]; + bdy = pb[1] - pd[1]; + cdx = pc[0] - pd[0]; + cdy = pc[1] - pd[1]; + + abdet = adx * bdy - bdx * ady; + bcdet = bdx * cdy - cdx * bdy; + cadet = cdx * ady - adx * cdy; + alift = adx * adx + ady * ady; + blift = bdx * bdx + bdy * bdy; + clift = cdx * cdx + cdy * cdy; + + return alift * bcdet + blift * cadet + clift * abdet; +} + +REAL incircleexact(REAL *pa, REAL *pb, REAL *pc, REAL *pd) +{ + INEXACT REAL axby1, bxcy1, cxdy1, dxay1, axcy1, bxdy1; + INEXACT REAL bxay1, cxby1, dxcy1, axdy1, cxay1, dxby1; + REAL axby0, bxcy0, cxdy0, dxay0, axcy0, bxdy0; + REAL bxay0, cxby0, dxcy0, axdy0, cxay0, dxby0; + REAL ab[4], bc[4], cd[4], da[4], ac[4], bd[4]; + REAL temp8[8]; + int templen; + REAL abc[12], bcd[12], cda[12], dab[12]; + int abclen, bcdlen, cdalen, dablen; + REAL det24x[24], det24y[24], det48x[48], det48y[48]; + int xlen, ylen; + REAL adet[96], bdet[96], cdet[96], ddet[96]; + int alen, blen, clen, dlen; + REAL abdet[192], cddet[192]; + int ablen, cdlen; + REAL deter[384]; + int deterlen; + int i; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j; + REAL _0; + + Two_Product(pa[0], pb[1], axby1, axby0); + Two_Product(pb[0], pa[1], bxay1, bxay0); + Two_Two_Diff(axby1, axby0, bxay1, bxay0, ab[3], ab[2], ab[1], ab[0]); + + Two_Product(pb[0], pc[1], bxcy1, bxcy0); + Two_Product(pc[0], pb[1], cxby1, cxby0); + Two_Two_Diff(bxcy1, bxcy0, cxby1, cxby0, bc[3], bc[2], bc[1], bc[0]); + + Two_Product(pc[0], pd[1], cxdy1, cxdy0); + Two_Product(pd[0], pc[1], dxcy1, dxcy0); + Two_Two_Diff(cxdy1, cxdy0, dxcy1, dxcy0, cd[3], cd[2], cd[1], cd[0]); + + Two_Product(pd[0], pa[1], dxay1, dxay0); + Two_Product(pa[0], pd[1], axdy1, axdy0); + Two_Two_Diff(dxay1, dxay0, axdy1, axdy0, da[3], da[2], da[1], da[0]); + + Two_Product(pa[0], pc[1], axcy1, axcy0); + Two_Product(pc[0], pa[1], cxay1, cxay0); + Two_Two_Diff(axcy1, axcy0, cxay1, cxay0, ac[3], ac[2], ac[1], ac[0]); + + Two_Product(pb[0], pd[1], bxdy1, bxdy0); + Two_Product(pd[0], pb[1], dxby1, dxby0); + Two_Two_Diff(bxdy1, bxdy0, dxby1, dxby0, bd[3], bd[2], bd[1], bd[0]); + + templen = fast_expansion_sum_zeroelim(4, cd, 4, da, temp8); + cdalen = fast_expansion_sum_zeroelim(templen, temp8, 4, ac, cda); + templen = fast_expansion_sum_zeroelim(4, da, 4, ab, temp8); + dablen = fast_expansion_sum_zeroelim(templen, temp8, 4, bd, dab); + for (i = 0; i < 4; i++) { + bd[i] = -bd[i]; + ac[i] = -ac[i]; + } + templen = fast_expansion_sum_zeroelim(4, ab, 4, bc, temp8); + abclen = fast_expansion_sum_zeroelim(templen, temp8, 4, ac, abc); + templen = fast_expansion_sum_zeroelim(4, bc, 4, cd, temp8); + bcdlen = fast_expansion_sum_zeroelim(templen, temp8, 4, bd, bcd); + + xlen = scale_expansion_zeroelim(bcdlen, bcd, pa[0], det24x); + xlen = scale_expansion_zeroelim(xlen, det24x, pa[0], det48x); + ylen = scale_expansion_zeroelim(bcdlen, bcd, pa[1], det24y); + ylen = scale_expansion_zeroelim(ylen, det24y, pa[1], det48y); + alen = fast_expansion_sum_zeroelim(xlen, det48x, ylen, det48y, adet); + + xlen = scale_expansion_zeroelim(cdalen, cda, pb[0], det24x); + xlen = scale_expansion_zeroelim(xlen, det24x, -pb[0], det48x); + ylen = scale_expansion_zeroelim(cdalen, cda, pb[1], det24y); + ylen = scale_expansion_zeroelim(ylen, det24y, -pb[1], det48y); + blen = fast_expansion_sum_zeroelim(xlen, det48x, ylen, det48y, bdet); + + xlen = scale_expansion_zeroelim(dablen, dab, pc[0], det24x); + xlen = scale_expansion_zeroelim(xlen, det24x, pc[0], det48x); + ylen = scale_expansion_zeroelim(dablen, dab, pc[1], det24y); + ylen = scale_expansion_zeroelim(ylen, det24y, pc[1], det48y); + clen = fast_expansion_sum_zeroelim(xlen, det48x, ylen, det48y, cdet); + + xlen = scale_expansion_zeroelim(abclen, abc, pd[0], det24x); + xlen = scale_expansion_zeroelim(xlen, det24x, -pd[0], det48x); + ylen = scale_expansion_zeroelim(abclen, abc, pd[1], det24y); + ylen = scale_expansion_zeroelim(ylen, det24y, -pd[1], det48y); + dlen = fast_expansion_sum_zeroelim(xlen, det48x, ylen, det48y, ddet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + cdlen = fast_expansion_sum_zeroelim(clen, cdet, dlen, ddet, cddet); + deterlen = fast_expansion_sum_zeroelim(ablen, abdet, cdlen, cddet, deter); + + return deter[deterlen - 1]; +} + +REAL incircleslow(REAL *pa, REAL *pb, REAL *pc, REAL *pd) +{ + INEXACT REAL adx, bdx, cdx, ady, bdy, cdy; + REAL adxtail, bdxtail, cdxtail; + REAL adytail, bdytail, cdytail; + REAL negate, negatetail; + INEXACT REAL axby7, bxcy7, axcy7, bxay7, cxby7, cxay7; + REAL axby[8], bxcy[8], axcy[8], bxay[8], cxby[8], cxay[8]; + REAL temp16[16]; + int temp16len; + REAL detx[32], detxx[64], detxt[32], detxxt[64], detxtxt[64]; + int xlen, xxlen, xtlen, xxtlen, xtxtlen; + REAL x1[128], x2[192]; + int x1len, x2len; + REAL dety[32], detyy[64], detyt[32], detyyt[64], detytyt[64]; + int ylen, yylen, ytlen, yytlen, ytytlen; + REAL y1[128], y2[192]; + int y1len, y2len; + REAL adet[384], bdet[384], cdet[384], abdet[768], deter[1152]; + int alen, blen, clen, ablen, deterlen; + int i; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL a0hi, a0lo, a1hi, a1lo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j, _k, _l, _m, _n; + REAL _0, _1, _2; + + Two_Diff(pa[0], pd[0], adx, adxtail); + Two_Diff(pa[1], pd[1], ady, adytail); + Two_Diff(pb[0], pd[0], bdx, bdxtail); + Two_Diff(pb[1], pd[1], bdy, bdytail); + Two_Diff(pc[0], pd[0], cdx, cdxtail); + Two_Diff(pc[1], pd[1], cdy, cdytail); + + Two_Two_Product(adx, adxtail, bdy, bdytail, + axby7, axby[6], axby[5], axby[4], + axby[3], axby[2], axby[1], axby[0]); + axby[7] = axby7; + negate = -ady; + negatetail = -adytail; + Two_Two_Product(bdx, bdxtail, negate, negatetail, + bxay7, bxay[6], bxay[5], bxay[4], + bxay[3], bxay[2], bxay[1], bxay[0]); + bxay[7] = bxay7; + Two_Two_Product(bdx, bdxtail, cdy, cdytail, + bxcy7, bxcy[6], bxcy[5], bxcy[4], + bxcy[3], bxcy[2], bxcy[1], bxcy[0]); + bxcy[7] = bxcy7; + negate = -bdy; + negatetail = -bdytail; + Two_Two_Product(cdx, cdxtail, negate, negatetail, + cxby7, cxby[6], cxby[5], cxby[4], + cxby[3], cxby[2], cxby[1], cxby[0]); + cxby[7] = cxby7; + Two_Two_Product(cdx, cdxtail, ady, adytail, + cxay7, cxay[6], cxay[5], cxay[4], + cxay[3], cxay[2], cxay[1], cxay[0]); + cxay[7] = cxay7; + negate = -cdy; + negatetail = -cdytail; + Two_Two_Product(adx, adxtail, negate, negatetail, + axcy7, axcy[6], axcy[5], axcy[4], + axcy[3], axcy[2], axcy[1], axcy[0]); + axcy[7] = axcy7; + + + temp16len = fast_expansion_sum_zeroelim(8, bxcy, 8, cxby, temp16); + + xlen = scale_expansion_zeroelim(temp16len, temp16, adx, detx); + xxlen = scale_expansion_zeroelim(xlen, detx, adx, detxx); + xtlen = scale_expansion_zeroelim(temp16len, temp16, adxtail, detxt); + xxtlen = scale_expansion_zeroelim(xtlen, detxt, adx, detxxt); + for (i = 0; i < xxtlen; i++) { + detxxt[i] *= 2.0; + } + xtxtlen = scale_expansion_zeroelim(xtlen, detxt, adxtail, detxtxt); + x1len = fast_expansion_sum_zeroelim(xxlen, detxx, xxtlen, detxxt, x1); + x2len = fast_expansion_sum_zeroelim(x1len, x1, xtxtlen, detxtxt, x2); + + ylen = scale_expansion_zeroelim(temp16len, temp16, ady, dety); + yylen = scale_expansion_zeroelim(ylen, dety, ady, detyy); + ytlen = scale_expansion_zeroelim(temp16len, temp16, adytail, detyt); + yytlen = scale_expansion_zeroelim(ytlen, detyt, ady, detyyt); + for (i = 0; i < yytlen; i++) { + detyyt[i] *= 2.0; + } + ytytlen = scale_expansion_zeroelim(ytlen, detyt, adytail, detytyt); + y1len = fast_expansion_sum_zeroelim(yylen, detyy, yytlen, detyyt, y1); + y2len = fast_expansion_sum_zeroelim(y1len, y1, ytytlen, detytyt, y2); + + alen = fast_expansion_sum_zeroelim(x2len, x2, y2len, y2, adet); + + + temp16len = fast_expansion_sum_zeroelim(8, cxay, 8, axcy, temp16); + + xlen = scale_expansion_zeroelim(temp16len, temp16, bdx, detx); + xxlen = scale_expansion_zeroelim(xlen, detx, bdx, detxx); + xtlen = scale_expansion_zeroelim(temp16len, temp16, bdxtail, detxt); + xxtlen = scale_expansion_zeroelim(xtlen, detxt, bdx, detxxt); + for (i = 0; i < xxtlen; i++) { + detxxt[i] *= 2.0; + } + xtxtlen = scale_expansion_zeroelim(xtlen, detxt, bdxtail, detxtxt); + x1len = fast_expansion_sum_zeroelim(xxlen, detxx, xxtlen, detxxt, x1); + x2len = fast_expansion_sum_zeroelim(x1len, x1, xtxtlen, detxtxt, x2); + + ylen = scale_expansion_zeroelim(temp16len, temp16, bdy, dety); + yylen = scale_expansion_zeroelim(ylen, dety, bdy, detyy); + ytlen = scale_expansion_zeroelim(temp16len, temp16, bdytail, detyt); + yytlen = scale_expansion_zeroelim(ytlen, detyt, bdy, detyyt); + for (i = 0; i < yytlen; i++) { + detyyt[i] *= 2.0; + } + ytytlen = scale_expansion_zeroelim(ytlen, detyt, bdytail, detytyt); + y1len = fast_expansion_sum_zeroelim(yylen, detyy, yytlen, detyyt, y1); + y2len = fast_expansion_sum_zeroelim(y1len, y1, ytytlen, detytyt, y2); + + blen = fast_expansion_sum_zeroelim(x2len, x2, y2len, y2, bdet); + + + temp16len = fast_expansion_sum_zeroelim(8, axby, 8, bxay, temp16); + + xlen = scale_expansion_zeroelim(temp16len, temp16, cdx, detx); + xxlen = scale_expansion_zeroelim(xlen, detx, cdx, detxx); + xtlen = scale_expansion_zeroelim(temp16len, temp16, cdxtail, detxt); + xxtlen = scale_expansion_zeroelim(xtlen, detxt, cdx, detxxt); + for (i = 0; i < xxtlen; i++) { + detxxt[i] *= 2.0; + } + xtxtlen = scale_expansion_zeroelim(xtlen, detxt, cdxtail, detxtxt); + x1len = fast_expansion_sum_zeroelim(xxlen, detxx, xxtlen, detxxt, x1); + x2len = fast_expansion_sum_zeroelim(x1len, x1, xtxtlen, detxtxt, x2); + + ylen = scale_expansion_zeroelim(temp16len, temp16, cdy, dety); + yylen = scale_expansion_zeroelim(ylen, dety, cdy, detyy); + ytlen = scale_expansion_zeroelim(temp16len, temp16, cdytail, detyt); + yytlen = scale_expansion_zeroelim(ytlen, detyt, cdy, detyyt); + for (i = 0; i < yytlen; i++) { + detyyt[i] *= 2.0; + } + ytytlen = scale_expansion_zeroelim(ytlen, detyt, cdytail, detytyt); + y1len = fast_expansion_sum_zeroelim(yylen, detyy, yytlen, detyyt, y1); + y2len = fast_expansion_sum_zeroelim(y1len, y1, ytytlen, detytyt, y2); + + clen = fast_expansion_sum_zeroelim(x2len, x2, y2len, y2, cdet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + deterlen = fast_expansion_sum_zeroelim(ablen, abdet, clen, cdet, deter); + + return deter[deterlen - 1]; +} + +REAL incircleadapt(REAL *pa, REAL *pb, REAL *pc, REAL *pd, REAL permanent) +{ + INEXACT REAL adx, bdx, cdx, ady, bdy, cdy; + REAL det, errbound; + + INEXACT REAL bdxcdy1, cdxbdy1, cdxady1, adxcdy1, adxbdy1, bdxady1; + REAL bdxcdy0, cdxbdy0, cdxady0, adxcdy0, adxbdy0, bdxady0; + REAL bc[4], ca[4], ab[4]; + INEXACT REAL bc3, ca3, ab3; + REAL axbc[8], axxbc[16], aybc[8], ayybc[16], adet[32]; + int axbclen, axxbclen, aybclen, ayybclen, alen; + REAL bxca[8], bxxca[16], byca[8], byyca[16], bdet[32]; + int bxcalen, bxxcalen, bycalen, byycalen, blen; + REAL cxab[8], cxxab[16], cyab[8], cyyab[16], cdet[32]; + int cxablen, cxxablen, cyablen, cyyablen, clen; + REAL abdet[64]; + int ablen; + REAL fin1[1152], fin2[1152]; + REAL *finnow, *finother, *finswap; + int finlength; + + REAL adxtail, bdxtail, cdxtail, adytail, bdytail, cdytail; + INEXACT REAL adxadx1, adyady1, bdxbdx1, bdybdy1, cdxcdx1, cdycdy1; + REAL adxadx0, adyady0, bdxbdx0, bdybdy0, cdxcdx0, cdycdy0; + REAL aa[4], bb[4], cc[4]; + INEXACT REAL aa3, bb3, cc3; + INEXACT REAL ti1, tj1; + REAL ti0, tj0; + REAL u[4], v[4]; + INEXACT REAL u3, v3; + REAL temp8[8], temp16a[16], temp16b[16], temp16c[16]; + REAL temp32a[32], temp32b[32], temp48[48], temp64[64]; + int temp8len, temp16alen, temp16blen, temp16clen; + int temp32alen, temp32blen, temp48len, temp64len; + REAL axtbb[8], axtcc[8], aytbb[8], aytcc[8]; + int axtbblen, axtcclen, aytbblen, aytcclen; + REAL bxtaa[8], bxtcc[8], bytaa[8], bytcc[8]; + int bxtaalen, bxtcclen, bytaalen, bytcclen; + REAL cxtaa[8], cxtbb[8], cytaa[8], cytbb[8]; + int cxtaalen, cxtbblen, cytaalen, cytbblen; + REAL axtbc[8], aytbc[8], bxtca[8], bytca[8], cxtab[8], cytab[8]; + int axtbclen, aytbclen, bxtcalen, bytcalen, cxtablen, cytablen; + REAL axtbct[16], aytbct[16], bxtcat[16], bytcat[16], cxtabt[16], cytabt[16]; + int axtbctlen, aytbctlen, bxtcatlen, bytcatlen, cxtabtlen, cytabtlen; + REAL axtbctt[8], aytbctt[8], bxtcatt[8]; + REAL bytcatt[8], cxtabtt[8], cytabtt[8]; + int axtbcttlen, aytbcttlen, bxtcattlen, bytcattlen, cxtabttlen, cytabttlen; + REAL abt[8], bct[8], cat[8]; + int abtlen, bctlen, catlen; + REAL abtt[4], bctt[4], catt[4]; + int abttlen, bcttlen, cattlen; + INEXACT REAL abtt3, bctt3, catt3; + REAL negate; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j; + REAL _0; + + // Avoid compiler warnings. H. Si, 2012-02-16. + axtbclen = aytbclen = bxtcalen = bytcalen = cxtablen = cytablen = 0; + + adx = (REAL) (pa[0] - pd[0]); + bdx = (REAL) (pb[0] - pd[0]); + cdx = (REAL) (pc[0] - pd[0]); + ady = (REAL) (pa[1] - pd[1]); + bdy = (REAL) (pb[1] - pd[1]); + cdy = (REAL) (pc[1] - pd[1]); + + Two_Product(bdx, cdy, bdxcdy1, bdxcdy0); + Two_Product(cdx, bdy, cdxbdy1, cdxbdy0); + Two_Two_Diff(bdxcdy1, bdxcdy0, cdxbdy1, cdxbdy0, bc3, bc[2], bc[1], bc[0]); + bc[3] = bc3; + axbclen = scale_expansion_zeroelim(4, bc, adx, axbc); + axxbclen = scale_expansion_zeroelim(axbclen, axbc, adx, axxbc); + aybclen = scale_expansion_zeroelim(4, bc, ady, aybc); + ayybclen = scale_expansion_zeroelim(aybclen, aybc, ady, ayybc); + alen = fast_expansion_sum_zeroelim(axxbclen, axxbc, ayybclen, ayybc, adet); + + Two_Product(cdx, ady, cdxady1, cdxady0); + Two_Product(adx, cdy, adxcdy1, adxcdy0); + Two_Two_Diff(cdxady1, cdxady0, adxcdy1, adxcdy0, ca3, ca[2], ca[1], ca[0]); + ca[3] = ca3; + bxcalen = scale_expansion_zeroelim(4, ca, bdx, bxca); + bxxcalen = scale_expansion_zeroelim(bxcalen, bxca, bdx, bxxca); + bycalen = scale_expansion_zeroelim(4, ca, bdy, byca); + byycalen = scale_expansion_zeroelim(bycalen, byca, bdy, byyca); + blen = fast_expansion_sum_zeroelim(bxxcalen, bxxca, byycalen, byyca, bdet); + + Two_Product(adx, bdy, adxbdy1, adxbdy0); + Two_Product(bdx, ady, bdxady1, bdxady0); + Two_Two_Diff(adxbdy1, adxbdy0, bdxady1, bdxady0, ab3, ab[2], ab[1], ab[0]); + ab[3] = ab3; + cxablen = scale_expansion_zeroelim(4, ab, cdx, cxab); + cxxablen = scale_expansion_zeroelim(cxablen, cxab, cdx, cxxab); + cyablen = scale_expansion_zeroelim(4, ab, cdy, cyab); + cyyablen = scale_expansion_zeroelim(cyablen, cyab, cdy, cyyab); + clen = fast_expansion_sum_zeroelim(cxxablen, cxxab, cyyablen, cyyab, cdet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + finlength = fast_expansion_sum_zeroelim(ablen, abdet, clen, cdet, fin1); + + det = estimate(finlength, fin1); + errbound = iccerrboundB * permanent; + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + Two_Diff_Tail(pa[0], pd[0], adx, adxtail); + Two_Diff_Tail(pa[1], pd[1], ady, adytail); + Two_Diff_Tail(pb[0], pd[0], bdx, bdxtail); + Two_Diff_Tail(pb[1], pd[1], bdy, bdytail); + Two_Diff_Tail(pc[0], pd[0], cdx, cdxtail); + Two_Diff_Tail(pc[1], pd[1], cdy, cdytail); + if ((adxtail == 0.0) && (bdxtail == 0.0) && (cdxtail == 0.0) + && (adytail == 0.0) && (bdytail == 0.0) && (cdytail == 0.0)) { + return det; + } + + errbound = iccerrboundC * permanent + resulterrbound * Absolute(det); + det += ((adx * adx + ady * ady) * ((bdx * cdytail + cdy * bdxtail) + - (bdy * cdxtail + cdx * bdytail)) + + 2.0 * (adx * adxtail + ady * adytail) * (bdx * cdy - bdy * cdx)) + + ((bdx * bdx + bdy * bdy) * ((cdx * adytail + ady * cdxtail) + - (cdy * adxtail + adx * cdytail)) + + 2.0 * (bdx * bdxtail + bdy * bdytail) * (cdx * ady - cdy * adx)) + + ((cdx * cdx + cdy * cdy) * ((adx * bdytail + bdy * adxtail) + - (ady * bdxtail + bdx * adytail)) + + 2.0 * (cdx * cdxtail + cdy * cdytail) * (adx * bdy - ady * bdx)); + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + finnow = fin1; + finother = fin2; + + if ((bdxtail != 0.0) || (bdytail != 0.0) + || (cdxtail != 0.0) || (cdytail != 0.0)) { + Square(adx, adxadx1, adxadx0); + Square(ady, adyady1, adyady0); + Two_Two_Sum(adxadx1, adxadx0, adyady1, adyady0, aa3, aa[2], aa[1], aa[0]); + aa[3] = aa3; + } + if ((cdxtail != 0.0) || (cdytail != 0.0) + || (adxtail != 0.0) || (adytail != 0.0)) { + Square(bdx, bdxbdx1, bdxbdx0); + Square(bdy, bdybdy1, bdybdy0); + Two_Two_Sum(bdxbdx1, bdxbdx0, bdybdy1, bdybdy0, bb3, bb[2], bb[1], bb[0]); + bb[3] = bb3; + } + if ((adxtail != 0.0) || (adytail != 0.0) + || (bdxtail != 0.0) || (bdytail != 0.0)) { + Square(cdx, cdxcdx1, cdxcdx0); + Square(cdy, cdycdy1, cdycdy0); + Two_Two_Sum(cdxcdx1, cdxcdx0, cdycdy1, cdycdy0, cc3, cc[2], cc[1], cc[0]); + cc[3] = cc3; + } + + if (adxtail != 0.0) { + axtbclen = scale_expansion_zeroelim(4, bc, adxtail, axtbc); + temp16alen = scale_expansion_zeroelim(axtbclen, axtbc, 2.0 * adx, + temp16a); + + axtcclen = scale_expansion_zeroelim(4, cc, adxtail, axtcc); + temp16blen = scale_expansion_zeroelim(axtcclen, axtcc, bdy, temp16b); + + axtbblen = scale_expansion_zeroelim(4, bb, adxtail, axtbb); + temp16clen = scale_expansion_zeroelim(axtbblen, axtbb, -cdy, temp16c); + + temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (adytail != 0.0) { + aytbclen = scale_expansion_zeroelim(4, bc, adytail, aytbc); + temp16alen = scale_expansion_zeroelim(aytbclen, aytbc, 2.0 * ady, + temp16a); + + aytbblen = scale_expansion_zeroelim(4, bb, adytail, aytbb); + temp16blen = scale_expansion_zeroelim(aytbblen, aytbb, cdx, temp16b); + + aytcclen = scale_expansion_zeroelim(4, cc, adytail, aytcc); + temp16clen = scale_expansion_zeroelim(aytcclen, aytcc, -bdx, temp16c); + + temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (bdxtail != 0.0) { + bxtcalen = scale_expansion_zeroelim(4, ca, bdxtail, bxtca); + temp16alen = scale_expansion_zeroelim(bxtcalen, bxtca, 2.0 * bdx, + temp16a); + + bxtaalen = scale_expansion_zeroelim(4, aa, bdxtail, bxtaa); + temp16blen = scale_expansion_zeroelim(bxtaalen, bxtaa, cdy, temp16b); + + bxtcclen = scale_expansion_zeroelim(4, cc, bdxtail, bxtcc); + temp16clen = scale_expansion_zeroelim(bxtcclen, bxtcc, -ady, temp16c); + + temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (bdytail != 0.0) { + bytcalen = scale_expansion_zeroelim(4, ca, bdytail, bytca); + temp16alen = scale_expansion_zeroelim(bytcalen, bytca, 2.0 * bdy, + temp16a); + + bytcclen = scale_expansion_zeroelim(4, cc, bdytail, bytcc); + temp16blen = scale_expansion_zeroelim(bytcclen, bytcc, adx, temp16b); + + bytaalen = scale_expansion_zeroelim(4, aa, bdytail, bytaa); + temp16clen = scale_expansion_zeroelim(bytaalen, bytaa, -cdx, temp16c); + + temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (cdxtail != 0.0) { + cxtablen = scale_expansion_zeroelim(4, ab, cdxtail, cxtab); + temp16alen = scale_expansion_zeroelim(cxtablen, cxtab, 2.0 * cdx, + temp16a); + + cxtbblen = scale_expansion_zeroelim(4, bb, cdxtail, cxtbb); + temp16blen = scale_expansion_zeroelim(cxtbblen, cxtbb, ady, temp16b); + + cxtaalen = scale_expansion_zeroelim(4, aa, cdxtail, cxtaa); + temp16clen = scale_expansion_zeroelim(cxtaalen, cxtaa, -bdy, temp16c); + + temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (cdytail != 0.0) { + cytablen = scale_expansion_zeroelim(4, ab, cdytail, cytab); + temp16alen = scale_expansion_zeroelim(cytablen, cytab, 2.0 * cdy, + temp16a); + + cytaalen = scale_expansion_zeroelim(4, aa, cdytail, cytaa); + temp16blen = scale_expansion_zeroelim(cytaalen, cytaa, bdx, temp16b); + + cytbblen = scale_expansion_zeroelim(4, bb, cdytail, cytbb); + temp16clen = scale_expansion_zeroelim(cytbblen, cytbb, -adx, temp16c); + + temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + + if ((adxtail != 0.0) || (adytail != 0.0)) { + if ((bdxtail != 0.0) || (bdytail != 0.0) + || (cdxtail != 0.0) || (cdytail != 0.0)) { + Two_Product(bdxtail, cdy, ti1, ti0); + Two_Product(bdx, cdytail, tj1, tj0); + Two_Two_Sum(ti1, ti0, tj1, tj0, u3, u[2], u[1], u[0]); + u[3] = u3; + negate = -bdy; + Two_Product(cdxtail, negate, ti1, ti0); + negate = -bdytail; + Two_Product(cdx, negate, tj1, tj0); + Two_Two_Sum(ti1, ti0, tj1, tj0, v3, v[2], v[1], v[0]); + v[3] = v3; + bctlen = fast_expansion_sum_zeroelim(4, u, 4, v, bct); + + Two_Product(bdxtail, cdytail, ti1, ti0); + Two_Product(cdxtail, bdytail, tj1, tj0); + Two_Two_Diff(ti1, ti0, tj1, tj0, bctt3, bctt[2], bctt[1], bctt[0]); + bctt[3] = bctt3; + bcttlen = 4; + } else { + bct[0] = 0.0; + bctlen = 1; + bctt[0] = 0.0; + bcttlen = 1; + } + + if (adxtail != 0.0) { + temp16alen = scale_expansion_zeroelim(axtbclen, axtbc, adxtail, temp16a); + axtbctlen = scale_expansion_zeroelim(bctlen, bct, adxtail, axtbct); + temp32alen = scale_expansion_zeroelim(axtbctlen, axtbct, 2.0 * adx, + temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + if (bdytail != 0.0) { + temp8len = scale_expansion_zeroelim(4, cc, adxtail, temp8); + temp16alen = scale_expansion_zeroelim(temp8len, temp8, bdytail, + temp16a); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, + temp16a, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (cdytail != 0.0) { + temp8len = scale_expansion_zeroelim(4, bb, -adxtail, temp8); + temp16alen = scale_expansion_zeroelim(temp8len, temp8, cdytail, + temp16a); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, + temp16a, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + + temp32alen = scale_expansion_zeroelim(axtbctlen, axtbct, adxtail, + temp32a); + axtbcttlen = scale_expansion_zeroelim(bcttlen, bctt, adxtail, axtbctt); + temp16alen = scale_expansion_zeroelim(axtbcttlen, axtbctt, 2.0 * adx, + temp16a); + temp16blen = scale_expansion_zeroelim(axtbcttlen, axtbctt, adxtail, + temp16b); + temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32b); + temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, + temp64, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (adytail != 0.0) { + temp16alen = scale_expansion_zeroelim(aytbclen, aytbc, adytail, temp16a); + aytbctlen = scale_expansion_zeroelim(bctlen, bct, adytail, aytbct); + temp32alen = scale_expansion_zeroelim(aytbctlen, aytbct, 2.0 * ady, + temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + + + temp32alen = scale_expansion_zeroelim(aytbctlen, aytbct, adytail, + temp32a); + aytbcttlen = scale_expansion_zeroelim(bcttlen, bctt, adytail, aytbctt); + temp16alen = scale_expansion_zeroelim(aytbcttlen, aytbctt, 2.0 * ady, + temp16a); + temp16blen = scale_expansion_zeroelim(aytbcttlen, aytbctt, adytail, + temp16b); + temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32b); + temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, + temp64, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + } + if ((bdxtail != 0.0) || (bdytail != 0.0)) { + if ((cdxtail != 0.0) || (cdytail != 0.0) + || (adxtail != 0.0) || (adytail != 0.0)) { + Two_Product(cdxtail, ady, ti1, ti0); + Two_Product(cdx, adytail, tj1, tj0); + Two_Two_Sum(ti1, ti0, tj1, tj0, u3, u[2], u[1], u[0]); + u[3] = u3; + negate = -cdy; + Two_Product(adxtail, negate, ti1, ti0); + negate = -cdytail; + Two_Product(adx, negate, tj1, tj0); + Two_Two_Sum(ti1, ti0, tj1, tj0, v3, v[2], v[1], v[0]); + v[3] = v3; + catlen = fast_expansion_sum_zeroelim(4, u, 4, v, cat); + + Two_Product(cdxtail, adytail, ti1, ti0); + Two_Product(adxtail, cdytail, tj1, tj0); + Two_Two_Diff(ti1, ti0, tj1, tj0, catt3, catt[2], catt[1], catt[0]); + catt[3] = catt3; + cattlen = 4; + } else { + cat[0] = 0.0; + catlen = 1; + catt[0] = 0.0; + cattlen = 1; + } + + if (bdxtail != 0.0) { + temp16alen = scale_expansion_zeroelim(bxtcalen, bxtca, bdxtail, temp16a); + bxtcatlen = scale_expansion_zeroelim(catlen, cat, bdxtail, bxtcat); + temp32alen = scale_expansion_zeroelim(bxtcatlen, bxtcat, 2.0 * bdx, + temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + if (cdytail != 0.0) { + temp8len = scale_expansion_zeroelim(4, aa, bdxtail, temp8); + temp16alen = scale_expansion_zeroelim(temp8len, temp8, cdytail, + temp16a); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, + temp16a, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (adytail != 0.0) { + temp8len = scale_expansion_zeroelim(4, cc, -bdxtail, temp8); + temp16alen = scale_expansion_zeroelim(temp8len, temp8, adytail, + temp16a); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, + temp16a, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + + temp32alen = scale_expansion_zeroelim(bxtcatlen, bxtcat, bdxtail, + temp32a); + bxtcattlen = scale_expansion_zeroelim(cattlen, catt, bdxtail, bxtcatt); + temp16alen = scale_expansion_zeroelim(bxtcattlen, bxtcatt, 2.0 * bdx, + temp16a); + temp16blen = scale_expansion_zeroelim(bxtcattlen, bxtcatt, bdxtail, + temp16b); + temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32b); + temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, + temp64, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (bdytail != 0.0) { + temp16alen = scale_expansion_zeroelim(bytcalen, bytca, bdytail, temp16a); + bytcatlen = scale_expansion_zeroelim(catlen, cat, bdytail, bytcat); + temp32alen = scale_expansion_zeroelim(bytcatlen, bytcat, 2.0 * bdy, + temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + + + temp32alen = scale_expansion_zeroelim(bytcatlen, bytcat, bdytail, + temp32a); + bytcattlen = scale_expansion_zeroelim(cattlen, catt, bdytail, bytcatt); + temp16alen = scale_expansion_zeroelim(bytcattlen, bytcatt, 2.0 * bdy, + temp16a); + temp16blen = scale_expansion_zeroelim(bytcattlen, bytcatt, bdytail, + temp16b); + temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32b); + temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, + temp64, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + } + if ((cdxtail != 0.0) || (cdytail != 0.0)) { + if ((adxtail != 0.0) || (adytail != 0.0) + || (bdxtail != 0.0) || (bdytail != 0.0)) { + Two_Product(adxtail, bdy, ti1, ti0); + Two_Product(adx, bdytail, tj1, tj0); + Two_Two_Sum(ti1, ti0, tj1, tj0, u3, u[2], u[1], u[0]); + u[3] = u3; + negate = -ady; + Two_Product(bdxtail, negate, ti1, ti0); + negate = -adytail; + Two_Product(bdx, negate, tj1, tj0); + Two_Two_Sum(ti1, ti0, tj1, tj0, v3, v[2], v[1], v[0]); + v[3] = v3; + abtlen = fast_expansion_sum_zeroelim(4, u, 4, v, abt); + + Two_Product(adxtail, bdytail, ti1, ti0); + Two_Product(bdxtail, adytail, tj1, tj0); + Two_Two_Diff(ti1, ti0, tj1, tj0, abtt3, abtt[2], abtt[1], abtt[0]); + abtt[3] = abtt3; + abttlen = 4; + } else { + abt[0] = 0.0; + abtlen = 1; + abtt[0] = 0.0; + abttlen = 1; + } + + if (cdxtail != 0.0) { + temp16alen = scale_expansion_zeroelim(cxtablen, cxtab, cdxtail, temp16a); + cxtabtlen = scale_expansion_zeroelim(abtlen, abt, cdxtail, cxtabt); + temp32alen = scale_expansion_zeroelim(cxtabtlen, cxtabt, 2.0 * cdx, + temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + if (adytail != 0.0) { + temp8len = scale_expansion_zeroelim(4, bb, cdxtail, temp8); + temp16alen = scale_expansion_zeroelim(temp8len, temp8, adytail, + temp16a); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, + temp16a, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (bdytail != 0.0) { + temp8len = scale_expansion_zeroelim(4, aa, -cdxtail, temp8); + temp16alen = scale_expansion_zeroelim(temp8len, temp8, bdytail, + temp16a); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, + temp16a, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + + temp32alen = scale_expansion_zeroelim(cxtabtlen, cxtabt, cdxtail, + temp32a); + cxtabttlen = scale_expansion_zeroelim(abttlen, abtt, cdxtail, cxtabtt); + temp16alen = scale_expansion_zeroelim(cxtabttlen, cxtabtt, 2.0 * cdx, + temp16a); + temp16blen = scale_expansion_zeroelim(cxtabttlen, cxtabtt, cdxtail, + temp16b); + temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32b); + temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, + temp64, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + if (cdytail != 0.0) { + temp16alen = scale_expansion_zeroelim(cytablen, cytab, cdytail, temp16a); + cytabtlen = scale_expansion_zeroelim(abtlen, abt, cdytail, cytabt); + temp32alen = scale_expansion_zeroelim(cytabtlen, cytabt, 2.0 * cdy, + temp32a); + temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp32alen, temp32a, temp48); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, + temp48, finother); + finswap = finnow; finnow = finother; finother = finswap; + + + temp32alen = scale_expansion_zeroelim(cytabtlen, cytabt, cdytail, + temp32a); + cytabttlen = scale_expansion_zeroelim(abttlen, abtt, cdytail, cytabtt); + temp16alen = scale_expansion_zeroelim(cytabttlen, cytabtt, 2.0 * cdy, + temp16a); + temp16blen = scale_expansion_zeroelim(cytabttlen, cytabtt, cdytail, + temp16b); + temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, + temp16blen, temp16b, temp32b); + temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64); + finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, + temp64, finother); + finswap = finnow; finnow = finother; finother = finswap; + } + } + + return finnow[finlength - 1]; +} + +REAL incircle(REAL *pa, REAL *pb, REAL *pc, REAL *pd) +{ + REAL adx, bdx, cdx, ady, bdy, cdy; + REAL bdxcdy, cdxbdy, cdxady, adxcdy, adxbdy, bdxady; + REAL alift, blift, clift; + REAL det; + REAL permanent, errbound; + + adx = pa[0] - pd[0]; + bdx = pb[0] - pd[0]; + cdx = pc[0] - pd[0]; + ady = pa[1] - pd[1]; + bdy = pb[1] - pd[1]; + cdy = pc[1] - pd[1]; + + bdxcdy = bdx * cdy; + cdxbdy = cdx * bdy; + alift = adx * adx + ady * ady; + + cdxady = cdx * ady; + adxcdy = adx * cdy; + blift = bdx * bdx + bdy * bdy; + + adxbdy = adx * bdy; + bdxady = bdx * ady; + clift = cdx * cdx + cdy * cdy; + + det = alift * (bdxcdy - cdxbdy) + + blift * (cdxady - adxcdy) + + clift * (adxbdy - bdxady); + + permanent = (Absolute(bdxcdy) + Absolute(cdxbdy)) * alift + + (Absolute(cdxady) + Absolute(adxcdy)) * blift + + (Absolute(adxbdy) + Absolute(bdxady)) * clift; + errbound = iccerrboundA * permanent; + if ((det > errbound) || (-det > errbound)) { + return det; + } + + return incircleadapt(pa, pb, pc, pd, permanent); +} + +/*****************************************************************************/ +/* */ +/* inspherefast() Approximate 3D insphere test. Nonrobust. */ +/* insphereexact() Exact 3D insphere test. Robust. */ +/* insphereslow() Another exact 3D insphere test. Robust. */ +/* insphere() Adaptive exact 3D insphere test. Robust. */ +/* */ +/* Return a positive value if the point pe lies inside the */ +/* sphere passing through pa, pb, pc, and pd; a negative value */ +/* if it lies outside; and zero if the five points are */ +/* cospherical. The points pa, pb, pc, and pd must be ordered */ +/* so that they have a positive orientation (as defined by */ +/* orient3d()), or the sign of the result will be reversed. */ +/* */ +/* Only the first and last routine should be used; the middle two are for */ +/* timings. */ +/* */ +/* The last three use exact arithmetic to ensure a correct answer. The */ +/* result returned is the determinant of a matrix. In insphere() only, */ +/* this determinant is computed adaptively, in the sense that exact */ +/* arithmetic is used only to the degree it is needed to ensure that the */ +/* returned value has the correct sign. Hence, insphere() is usually quite */ +/* fast, but will run more slowly when the input points are cospherical or */ +/* nearly so. */ +/* */ +/*****************************************************************************/ + +REAL inspherefast(REAL *pa, REAL *pb, REAL *pc, REAL *pd, REAL *pe) +{ + REAL aex, bex, cex, dex; + REAL aey, bey, cey, dey; + REAL aez, bez, cez, dez; + REAL alift, blift, clift, dlift; + REAL ab, bc, cd, da, ac, bd; + REAL abc, bcd, cda, dab; + + aex = pa[0] - pe[0]; + bex = pb[0] - pe[0]; + cex = pc[0] - pe[0]; + dex = pd[0] - pe[0]; + aey = pa[1] - pe[1]; + bey = pb[1] - pe[1]; + cey = pc[1] - pe[1]; + dey = pd[1] - pe[1]; + aez = pa[2] - pe[2]; + bez = pb[2] - pe[2]; + cez = pc[2] - pe[2]; + dez = pd[2] - pe[2]; + + ab = aex * bey - bex * aey; + bc = bex * cey - cex * bey; + cd = cex * dey - dex * cey; + da = dex * aey - aex * dey; + + ac = aex * cey - cex * aey; + bd = bex * dey - dex * bey; + + abc = aez * bc - bez * ac + cez * ab; + bcd = bez * cd - cez * bd + dez * bc; + cda = cez * da + dez * ac + aez * cd; + dab = dez * ab + aez * bd + bez * da; + + alift = aex * aex + aey * aey + aez * aez; + blift = bex * bex + bey * bey + bez * bez; + clift = cex * cex + cey * cey + cez * cez; + dlift = dex * dex + dey * dey + dez * dez; + + return (dlift * abc - clift * dab) + (blift * cda - alift * bcd); +} + +REAL insphereexact(REAL *pa, REAL *pb, REAL *pc, REAL *pd, REAL *pe) +{ + INEXACT REAL axby1, bxcy1, cxdy1, dxey1, exay1; + INEXACT REAL bxay1, cxby1, dxcy1, exdy1, axey1; + INEXACT REAL axcy1, bxdy1, cxey1, dxay1, exby1; + INEXACT REAL cxay1, dxby1, excy1, axdy1, bxey1; + REAL axby0, bxcy0, cxdy0, dxey0, exay0; + REAL bxay0, cxby0, dxcy0, exdy0, axey0; + REAL axcy0, bxdy0, cxey0, dxay0, exby0; + REAL cxay0, dxby0, excy0, axdy0, bxey0; + REAL ab[4], bc[4], cd[4], de[4], ea[4]; + REAL ac[4], bd[4], ce[4], da[4], eb[4]; + REAL temp8a[8], temp8b[8], temp16[16]; + int temp8alen, temp8blen, temp16len; + REAL abc[24], bcd[24], cde[24], dea[24], eab[24]; + REAL abd[24], bce[24], cda[24], deb[24], eac[24]; + int abclen, bcdlen, cdelen, dealen, eablen; + int abdlen, bcelen, cdalen, deblen, eaclen; + REAL temp48a[48], temp48b[48]; + int temp48alen, temp48blen; + REAL abcd[96], bcde[96], cdea[96], deab[96], eabc[96]; + int abcdlen, bcdelen, cdealen, deablen, eabclen; + REAL temp192[192]; + REAL det384x[384], det384y[384], det384z[384]; + int xlen, ylen, zlen; + REAL detxy[768]; + int xylen; + REAL adet[1152], bdet[1152], cdet[1152], ddet[1152], edet[1152]; + int alen, blen, clen, dlen, elen; + REAL abdet[2304], cddet[2304], cdedet[3456]; + int ablen, cdlen; + REAL deter[5760]; + int deterlen; + int i; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j; + REAL _0; + + + Two_Product(pa[0], pb[1], axby1, axby0); + Two_Product(pb[0], pa[1], bxay1, bxay0); + Two_Two_Diff(axby1, axby0, bxay1, bxay0, ab[3], ab[2], ab[1], ab[0]); + + Two_Product(pb[0], pc[1], bxcy1, bxcy0); + Two_Product(pc[0], pb[1], cxby1, cxby0); + Two_Two_Diff(bxcy1, bxcy0, cxby1, cxby0, bc[3], bc[2], bc[1], bc[0]); + + Two_Product(pc[0], pd[1], cxdy1, cxdy0); + Two_Product(pd[0], pc[1], dxcy1, dxcy0); + Two_Two_Diff(cxdy1, cxdy0, dxcy1, dxcy0, cd[3], cd[2], cd[1], cd[0]); + + Two_Product(pd[0], pe[1], dxey1, dxey0); + Two_Product(pe[0], pd[1], exdy1, exdy0); + Two_Two_Diff(dxey1, dxey0, exdy1, exdy0, de[3], de[2], de[1], de[0]); + + Two_Product(pe[0], pa[1], exay1, exay0); + Two_Product(pa[0], pe[1], axey1, axey0); + Two_Two_Diff(exay1, exay0, axey1, axey0, ea[3], ea[2], ea[1], ea[0]); + + Two_Product(pa[0], pc[1], axcy1, axcy0); + Two_Product(pc[0], pa[1], cxay1, cxay0); + Two_Two_Diff(axcy1, axcy0, cxay1, cxay0, ac[3], ac[2], ac[1], ac[0]); + + Two_Product(pb[0], pd[1], bxdy1, bxdy0); + Two_Product(pd[0], pb[1], dxby1, dxby0); + Two_Two_Diff(bxdy1, bxdy0, dxby1, dxby0, bd[3], bd[2], bd[1], bd[0]); + + Two_Product(pc[0], pe[1], cxey1, cxey0); + Two_Product(pe[0], pc[1], excy1, excy0); + Two_Two_Diff(cxey1, cxey0, excy1, excy0, ce[3], ce[2], ce[1], ce[0]); + + Two_Product(pd[0], pa[1], dxay1, dxay0); + Two_Product(pa[0], pd[1], axdy1, axdy0); + Two_Two_Diff(dxay1, dxay0, axdy1, axdy0, da[3], da[2], da[1], da[0]); + + Two_Product(pe[0], pb[1], exby1, exby0); + Two_Product(pb[0], pe[1], bxey1, bxey0); + Two_Two_Diff(exby1, exby0, bxey1, bxey0, eb[3], eb[2], eb[1], eb[0]); + + temp8alen = scale_expansion_zeroelim(4, bc, pa[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, ac, -pb[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, ab, pc[2], temp8a); + abclen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + abc); + + temp8alen = scale_expansion_zeroelim(4, cd, pb[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, bd, -pc[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, bc, pd[2], temp8a); + bcdlen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + bcd); + + temp8alen = scale_expansion_zeroelim(4, de, pc[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, ce, -pd[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, cd, pe[2], temp8a); + cdelen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + cde); + + temp8alen = scale_expansion_zeroelim(4, ea, pd[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, da, -pe[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, de, pa[2], temp8a); + dealen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + dea); + + temp8alen = scale_expansion_zeroelim(4, ab, pe[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, eb, -pa[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, ea, pb[2], temp8a); + eablen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + eab); + + temp8alen = scale_expansion_zeroelim(4, bd, pa[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, da, pb[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, ab, pd[2], temp8a); + abdlen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + abd); + + temp8alen = scale_expansion_zeroelim(4, ce, pb[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, eb, pc[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, bc, pe[2], temp8a); + bcelen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + bce); + + temp8alen = scale_expansion_zeroelim(4, da, pc[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, ac, pd[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, cd, pa[2], temp8a); + cdalen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + cda); + + temp8alen = scale_expansion_zeroelim(4, eb, pd[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, bd, pe[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, de, pb[2], temp8a); + deblen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + deb); + + temp8alen = scale_expansion_zeroelim(4, ac, pe[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, ce, pa[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, ea, pc[2], temp8a); + eaclen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + eac); + + temp48alen = fast_expansion_sum_zeroelim(cdelen, cde, bcelen, bce, temp48a); + temp48blen = fast_expansion_sum_zeroelim(deblen, deb, bcdlen, bcd, temp48b); + for (i = 0; i < temp48blen; i++) { + temp48b[i] = -temp48b[i]; + } + bcdelen = fast_expansion_sum_zeroelim(temp48alen, temp48a, + temp48blen, temp48b, bcde); + xlen = scale_expansion_zeroelim(bcdelen, bcde, pa[0], temp192); + xlen = scale_expansion_zeroelim(xlen, temp192, pa[0], det384x); + ylen = scale_expansion_zeroelim(bcdelen, bcde, pa[1], temp192); + ylen = scale_expansion_zeroelim(ylen, temp192, pa[1], det384y); + zlen = scale_expansion_zeroelim(bcdelen, bcde, pa[2], temp192); + zlen = scale_expansion_zeroelim(zlen, temp192, pa[2], det384z); + xylen = fast_expansion_sum_zeroelim(xlen, det384x, ylen, det384y, detxy); + alen = fast_expansion_sum_zeroelim(xylen, detxy, zlen, det384z, adet); + + temp48alen = fast_expansion_sum_zeroelim(dealen, dea, cdalen, cda, temp48a); + temp48blen = fast_expansion_sum_zeroelim(eaclen, eac, cdelen, cde, temp48b); + for (i = 0; i < temp48blen; i++) { + temp48b[i] = -temp48b[i]; + } + cdealen = fast_expansion_sum_zeroelim(temp48alen, temp48a, + temp48blen, temp48b, cdea); + xlen = scale_expansion_zeroelim(cdealen, cdea, pb[0], temp192); + xlen = scale_expansion_zeroelim(xlen, temp192, pb[0], det384x); + ylen = scale_expansion_zeroelim(cdealen, cdea, pb[1], temp192); + ylen = scale_expansion_zeroelim(ylen, temp192, pb[1], det384y); + zlen = scale_expansion_zeroelim(cdealen, cdea, pb[2], temp192); + zlen = scale_expansion_zeroelim(zlen, temp192, pb[2], det384z); + xylen = fast_expansion_sum_zeroelim(xlen, det384x, ylen, det384y, detxy); + blen = fast_expansion_sum_zeroelim(xylen, detxy, zlen, det384z, bdet); + + temp48alen = fast_expansion_sum_zeroelim(eablen, eab, deblen, deb, temp48a); + temp48blen = fast_expansion_sum_zeroelim(abdlen, abd, dealen, dea, temp48b); + for (i = 0; i < temp48blen; i++) { + temp48b[i] = -temp48b[i]; + } + deablen = fast_expansion_sum_zeroelim(temp48alen, temp48a, + temp48blen, temp48b, deab); + xlen = scale_expansion_zeroelim(deablen, deab, pc[0], temp192); + xlen = scale_expansion_zeroelim(xlen, temp192, pc[0], det384x); + ylen = scale_expansion_zeroelim(deablen, deab, pc[1], temp192); + ylen = scale_expansion_zeroelim(ylen, temp192, pc[1], det384y); + zlen = scale_expansion_zeroelim(deablen, deab, pc[2], temp192); + zlen = scale_expansion_zeroelim(zlen, temp192, pc[2], det384z); + xylen = fast_expansion_sum_zeroelim(xlen, det384x, ylen, det384y, detxy); + clen = fast_expansion_sum_zeroelim(xylen, detxy, zlen, det384z, cdet); + + temp48alen = fast_expansion_sum_zeroelim(abclen, abc, eaclen, eac, temp48a); + temp48blen = fast_expansion_sum_zeroelim(bcelen, bce, eablen, eab, temp48b); + for (i = 0; i < temp48blen; i++) { + temp48b[i] = -temp48b[i]; + } + eabclen = fast_expansion_sum_zeroelim(temp48alen, temp48a, + temp48blen, temp48b, eabc); + xlen = scale_expansion_zeroelim(eabclen, eabc, pd[0], temp192); + xlen = scale_expansion_zeroelim(xlen, temp192, pd[0], det384x); + ylen = scale_expansion_zeroelim(eabclen, eabc, pd[1], temp192); + ylen = scale_expansion_zeroelim(ylen, temp192, pd[1], det384y); + zlen = scale_expansion_zeroelim(eabclen, eabc, pd[2], temp192); + zlen = scale_expansion_zeroelim(zlen, temp192, pd[2], det384z); + xylen = fast_expansion_sum_zeroelim(xlen, det384x, ylen, det384y, detxy); + dlen = fast_expansion_sum_zeroelim(xylen, detxy, zlen, det384z, ddet); + + temp48alen = fast_expansion_sum_zeroelim(bcdlen, bcd, abdlen, abd, temp48a); + temp48blen = fast_expansion_sum_zeroelim(cdalen, cda, abclen, abc, temp48b); + for (i = 0; i < temp48blen; i++) { + temp48b[i] = -temp48b[i]; + } + abcdlen = fast_expansion_sum_zeroelim(temp48alen, temp48a, + temp48blen, temp48b, abcd); + xlen = scale_expansion_zeroelim(abcdlen, abcd, pe[0], temp192); + xlen = scale_expansion_zeroelim(xlen, temp192, pe[0], det384x); + ylen = scale_expansion_zeroelim(abcdlen, abcd, pe[1], temp192); + ylen = scale_expansion_zeroelim(ylen, temp192, pe[1], det384y); + zlen = scale_expansion_zeroelim(abcdlen, abcd, pe[2], temp192); + zlen = scale_expansion_zeroelim(zlen, temp192, pe[2], det384z); + xylen = fast_expansion_sum_zeroelim(xlen, det384x, ylen, det384y, detxy); + elen = fast_expansion_sum_zeroelim(xylen, detxy, zlen, det384z, edet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + cdlen = fast_expansion_sum_zeroelim(clen, cdet, dlen, ddet, cddet); + cdelen = fast_expansion_sum_zeroelim(cdlen, cddet, elen, edet, cdedet); + deterlen = fast_expansion_sum_zeroelim(ablen, abdet, cdelen, cdedet, deter); + + return deter[deterlen - 1]; +} + +REAL insphereslow(REAL *pa, REAL *pb, REAL *pc, REAL *pd, REAL *pe) +{ + INEXACT REAL aex, bex, cex, dex, aey, bey, cey, dey, aez, bez, cez, dez; + REAL aextail, bextail, cextail, dextail; + REAL aeytail, beytail, ceytail, deytail; + REAL aeztail, beztail, ceztail, deztail; + REAL negate, negatetail; + INEXACT REAL axby7, bxcy7, cxdy7, dxay7, axcy7, bxdy7; + INEXACT REAL bxay7, cxby7, dxcy7, axdy7, cxay7, dxby7; + REAL axby[8], bxcy[8], cxdy[8], dxay[8], axcy[8], bxdy[8]; + REAL bxay[8], cxby[8], dxcy[8], axdy[8], cxay[8], dxby[8]; + REAL ab[16], bc[16], cd[16], da[16], ac[16], bd[16]; + int ablen, bclen, cdlen, dalen, aclen, bdlen; + REAL temp32a[32], temp32b[32], temp64a[64], temp64b[64], temp64c[64]; + int temp32alen, temp32blen, temp64alen, temp64blen, temp64clen; + REAL temp128[128], temp192[192]; + int temp128len, temp192len; + REAL detx[384], detxx[768], detxt[384], detxxt[768], detxtxt[768]; + int xlen, xxlen, xtlen, xxtlen, xtxtlen; + REAL x1[1536], x2[2304]; + int x1len, x2len; + REAL dety[384], detyy[768], detyt[384], detyyt[768], detytyt[768]; + int ylen, yylen, ytlen, yytlen, ytytlen; + REAL y1[1536], y2[2304]; + int y1len, y2len; + REAL detz[384], detzz[768], detzt[384], detzzt[768], detztzt[768]; + int zlen, zzlen, ztlen, zztlen, ztztlen; + REAL z1[1536], z2[2304]; + int z1len, z2len; + REAL detxy[4608]; + int xylen; + REAL adet[6912], bdet[6912], cdet[6912], ddet[6912]; + int alen, blen, clen, dlen; + REAL abdet[13824], cddet[13824], deter[27648]; + int deterlen; + int i; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL a0hi, a0lo, a1hi, a1lo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j, _k, _l, _m, _n; + REAL _0, _1, _2; + + Two_Diff(pa[0], pe[0], aex, aextail); + Two_Diff(pa[1], pe[1], aey, aeytail); + Two_Diff(pa[2], pe[2], aez, aeztail); + Two_Diff(pb[0], pe[0], bex, bextail); + Two_Diff(pb[1], pe[1], bey, beytail); + Two_Diff(pb[2], pe[2], bez, beztail); + Two_Diff(pc[0], pe[0], cex, cextail); + Two_Diff(pc[1], pe[1], cey, ceytail); + Two_Diff(pc[2], pe[2], cez, ceztail); + Two_Diff(pd[0], pe[0], dex, dextail); + Two_Diff(pd[1], pe[1], dey, deytail); + Two_Diff(pd[2], pe[2], dez, deztail); + + Two_Two_Product(aex, aextail, bey, beytail, + axby7, axby[6], axby[5], axby[4], + axby[3], axby[2], axby[1], axby[0]); + axby[7] = axby7; + negate = -aey; + negatetail = -aeytail; + Two_Two_Product(bex, bextail, negate, negatetail, + bxay7, bxay[6], bxay[5], bxay[4], + bxay[3], bxay[2], bxay[1], bxay[0]); + bxay[7] = bxay7; + ablen = fast_expansion_sum_zeroelim(8, axby, 8, bxay, ab); + Two_Two_Product(bex, bextail, cey, ceytail, + bxcy7, bxcy[6], bxcy[5], bxcy[4], + bxcy[3], bxcy[2], bxcy[1], bxcy[0]); + bxcy[7] = bxcy7; + negate = -bey; + negatetail = -beytail; + Two_Two_Product(cex, cextail, negate, negatetail, + cxby7, cxby[6], cxby[5], cxby[4], + cxby[3], cxby[2], cxby[1], cxby[0]); + cxby[7] = cxby7; + bclen = fast_expansion_sum_zeroelim(8, bxcy, 8, cxby, bc); + Two_Two_Product(cex, cextail, dey, deytail, + cxdy7, cxdy[6], cxdy[5], cxdy[4], + cxdy[3], cxdy[2], cxdy[1], cxdy[0]); + cxdy[7] = cxdy7; + negate = -cey; + negatetail = -ceytail; + Two_Two_Product(dex, dextail, negate, negatetail, + dxcy7, dxcy[6], dxcy[5], dxcy[4], + dxcy[3], dxcy[2], dxcy[1], dxcy[0]); + dxcy[7] = dxcy7; + cdlen = fast_expansion_sum_zeroelim(8, cxdy, 8, dxcy, cd); + Two_Two_Product(dex, dextail, aey, aeytail, + dxay7, dxay[6], dxay[5], dxay[4], + dxay[3], dxay[2], dxay[1], dxay[0]); + dxay[7] = dxay7; + negate = -dey; + negatetail = -deytail; + Two_Two_Product(aex, aextail, negate, negatetail, + axdy7, axdy[6], axdy[5], axdy[4], + axdy[3], axdy[2], axdy[1], axdy[0]); + axdy[7] = axdy7; + dalen = fast_expansion_sum_zeroelim(8, dxay, 8, axdy, da); + Two_Two_Product(aex, aextail, cey, ceytail, + axcy7, axcy[6], axcy[5], axcy[4], + axcy[3], axcy[2], axcy[1], axcy[0]); + axcy[7] = axcy7; + negate = -aey; + negatetail = -aeytail; + Two_Two_Product(cex, cextail, negate, negatetail, + cxay7, cxay[6], cxay[5], cxay[4], + cxay[3], cxay[2], cxay[1], cxay[0]); + cxay[7] = cxay7; + aclen = fast_expansion_sum_zeroelim(8, axcy, 8, cxay, ac); + Two_Two_Product(bex, bextail, dey, deytail, + bxdy7, bxdy[6], bxdy[5], bxdy[4], + bxdy[3], bxdy[2], bxdy[1], bxdy[0]); + bxdy[7] = bxdy7; + negate = -bey; + negatetail = -beytail; + Two_Two_Product(dex, dextail, negate, negatetail, + dxby7, dxby[6], dxby[5], dxby[4], + dxby[3], dxby[2], dxby[1], dxby[0]); + dxby[7] = dxby7; + bdlen = fast_expansion_sum_zeroelim(8, bxdy, 8, dxby, bd); + + temp32alen = scale_expansion_zeroelim(cdlen, cd, -bez, temp32a); + temp32blen = scale_expansion_zeroelim(cdlen, cd, -beztail, temp32b); + temp64alen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64a); + temp32alen = scale_expansion_zeroelim(bdlen, bd, cez, temp32a); + temp32blen = scale_expansion_zeroelim(bdlen, bd, ceztail, temp32b); + temp64blen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64b); + temp32alen = scale_expansion_zeroelim(bclen, bc, -dez, temp32a); + temp32blen = scale_expansion_zeroelim(bclen, bc, -deztail, temp32b); + temp64clen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64c); + temp128len = fast_expansion_sum_zeroelim(temp64alen, temp64a, + temp64blen, temp64b, temp128); + temp192len = fast_expansion_sum_zeroelim(temp64clen, temp64c, + temp128len, temp128, temp192); + xlen = scale_expansion_zeroelim(temp192len, temp192, aex, detx); + xxlen = scale_expansion_zeroelim(xlen, detx, aex, detxx); + xtlen = scale_expansion_zeroelim(temp192len, temp192, aextail, detxt); + xxtlen = scale_expansion_zeroelim(xtlen, detxt, aex, detxxt); + for (i = 0; i < xxtlen; i++) { + detxxt[i] *= 2.0; + } + xtxtlen = scale_expansion_zeroelim(xtlen, detxt, aextail, detxtxt); + x1len = fast_expansion_sum_zeroelim(xxlen, detxx, xxtlen, detxxt, x1); + x2len = fast_expansion_sum_zeroelim(x1len, x1, xtxtlen, detxtxt, x2); + ylen = scale_expansion_zeroelim(temp192len, temp192, aey, dety); + yylen = scale_expansion_zeroelim(ylen, dety, aey, detyy); + ytlen = scale_expansion_zeroelim(temp192len, temp192, aeytail, detyt); + yytlen = scale_expansion_zeroelim(ytlen, detyt, aey, detyyt); + for (i = 0; i < yytlen; i++) { + detyyt[i] *= 2.0; + } + ytytlen = scale_expansion_zeroelim(ytlen, detyt, aeytail, detytyt); + y1len = fast_expansion_sum_zeroelim(yylen, detyy, yytlen, detyyt, y1); + y2len = fast_expansion_sum_zeroelim(y1len, y1, ytytlen, detytyt, y2); + zlen = scale_expansion_zeroelim(temp192len, temp192, aez, detz); + zzlen = scale_expansion_zeroelim(zlen, detz, aez, detzz); + ztlen = scale_expansion_zeroelim(temp192len, temp192, aeztail, detzt); + zztlen = scale_expansion_zeroelim(ztlen, detzt, aez, detzzt); + for (i = 0; i < zztlen; i++) { + detzzt[i] *= 2.0; + } + ztztlen = scale_expansion_zeroelim(ztlen, detzt, aeztail, detztzt); + z1len = fast_expansion_sum_zeroelim(zzlen, detzz, zztlen, detzzt, z1); + z2len = fast_expansion_sum_zeroelim(z1len, z1, ztztlen, detztzt, z2); + xylen = fast_expansion_sum_zeroelim(x2len, x2, y2len, y2, detxy); + alen = fast_expansion_sum_zeroelim(z2len, z2, xylen, detxy, adet); + + temp32alen = scale_expansion_zeroelim(dalen, da, cez, temp32a); + temp32blen = scale_expansion_zeroelim(dalen, da, ceztail, temp32b); + temp64alen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64a); + temp32alen = scale_expansion_zeroelim(aclen, ac, dez, temp32a); + temp32blen = scale_expansion_zeroelim(aclen, ac, deztail, temp32b); + temp64blen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64b); + temp32alen = scale_expansion_zeroelim(cdlen, cd, aez, temp32a); + temp32blen = scale_expansion_zeroelim(cdlen, cd, aeztail, temp32b); + temp64clen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64c); + temp128len = fast_expansion_sum_zeroelim(temp64alen, temp64a, + temp64blen, temp64b, temp128); + temp192len = fast_expansion_sum_zeroelim(temp64clen, temp64c, + temp128len, temp128, temp192); + xlen = scale_expansion_zeroelim(temp192len, temp192, bex, detx); + xxlen = scale_expansion_zeroelim(xlen, detx, bex, detxx); + xtlen = scale_expansion_zeroelim(temp192len, temp192, bextail, detxt); + xxtlen = scale_expansion_zeroelim(xtlen, detxt, bex, detxxt); + for (i = 0; i < xxtlen; i++) { + detxxt[i] *= 2.0; + } + xtxtlen = scale_expansion_zeroelim(xtlen, detxt, bextail, detxtxt); + x1len = fast_expansion_sum_zeroelim(xxlen, detxx, xxtlen, detxxt, x1); + x2len = fast_expansion_sum_zeroelim(x1len, x1, xtxtlen, detxtxt, x2); + ylen = scale_expansion_zeroelim(temp192len, temp192, bey, dety); + yylen = scale_expansion_zeroelim(ylen, dety, bey, detyy); + ytlen = scale_expansion_zeroelim(temp192len, temp192, beytail, detyt); + yytlen = scale_expansion_zeroelim(ytlen, detyt, bey, detyyt); + for (i = 0; i < yytlen; i++) { + detyyt[i] *= 2.0; + } + ytytlen = scale_expansion_zeroelim(ytlen, detyt, beytail, detytyt); + y1len = fast_expansion_sum_zeroelim(yylen, detyy, yytlen, detyyt, y1); + y2len = fast_expansion_sum_zeroelim(y1len, y1, ytytlen, detytyt, y2); + zlen = scale_expansion_zeroelim(temp192len, temp192, bez, detz); + zzlen = scale_expansion_zeroelim(zlen, detz, bez, detzz); + ztlen = scale_expansion_zeroelim(temp192len, temp192, beztail, detzt); + zztlen = scale_expansion_zeroelim(ztlen, detzt, bez, detzzt); + for (i = 0; i < zztlen; i++) { + detzzt[i] *= 2.0; + } + ztztlen = scale_expansion_zeroelim(ztlen, detzt, beztail, detztzt); + z1len = fast_expansion_sum_zeroelim(zzlen, detzz, zztlen, detzzt, z1); + z2len = fast_expansion_sum_zeroelim(z1len, z1, ztztlen, detztzt, z2); + xylen = fast_expansion_sum_zeroelim(x2len, x2, y2len, y2, detxy); + blen = fast_expansion_sum_zeroelim(z2len, z2, xylen, detxy, bdet); + + temp32alen = scale_expansion_zeroelim(ablen, ab, -dez, temp32a); + temp32blen = scale_expansion_zeroelim(ablen, ab, -deztail, temp32b); + temp64alen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64a); + temp32alen = scale_expansion_zeroelim(bdlen, bd, -aez, temp32a); + temp32blen = scale_expansion_zeroelim(bdlen, bd, -aeztail, temp32b); + temp64blen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64b); + temp32alen = scale_expansion_zeroelim(dalen, da, -bez, temp32a); + temp32blen = scale_expansion_zeroelim(dalen, da, -beztail, temp32b); + temp64clen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64c); + temp128len = fast_expansion_sum_zeroelim(temp64alen, temp64a, + temp64blen, temp64b, temp128); + temp192len = fast_expansion_sum_zeroelim(temp64clen, temp64c, + temp128len, temp128, temp192); + xlen = scale_expansion_zeroelim(temp192len, temp192, cex, detx); + xxlen = scale_expansion_zeroelim(xlen, detx, cex, detxx); + xtlen = scale_expansion_zeroelim(temp192len, temp192, cextail, detxt); + xxtlen = scale_expansion_zeroelim(xtlen, detxt, cex, detxxt); + for (i = 0; i < xxtlen; i++) { + detxxt[i] *= 2.0; + } + xtxtlen = scale_expansion_zeroelim(xtlen, detxt, cextail, detxtxt); + x1len = fast_expansion_sum_zeroelim(xxlen, detxx, xxtlen, detxxt, x1); + x2len = fast_expansion_sum_zeroelim(x1len, x1, xtxtlen, detxtxt, x2); + ylen = scale_expansion_zeroelim(temp192len, temp192, cey, dety); + yylen = scale_expansion_zeroelim(ylen, dety, cey, detyy); + ytlen = scale_expansion_zeroelim(temp192len, temp192, ceytail, detyt); + yytlen = scale_expansion_zeroelim(ytlen, detyt, cey, detyyt); + for (i = 0; i < yytlen; i++) { + detyyt[i] *= 2.0; + } + ytytlen = scale_expansion_zeroelim(ytlen, detyt, ceytail, detytyt); + y1len = fast_expansion_sum_zeroelim(yylen, detyy, yytlen, detyyt, y1); + y2len = fast_expansion_sum_zeroelim(y1len, y1, ytytlen, detytyt, y2); + zlen = scale_expansion_zeroelim(temp192len, temp192, cez, detz); + zzlen = scale_expansion_zeroelim(zlen, detz, cez, detzz); + ztlen = scale_expansion_zeroelim(temp192len, temp192, ceztail, detzt); + zztlen = scale_expansion_zeroelim(ztlen, detzt, cez, detzzt); + for (i = 0; i < zztlen; i++) { + detzzt[i] *= 2.0; + } + ztztlen = scale_expansion_zeroelim(ztlen, detzt, ceztail, detztzt); + z1len = fast_expansion_sum_zeroelim(zzlen, detzz, zztlen, detzzt, z1); + z2len = fast_expansion_sum_zeroelim(z1len, z1, ztztlen, detztzt, z2); + xylen = fast_expansion_sum_zeroelim(x2len, x2, y2len, y2, detxy); + clen = fast_expansion_sum_zeroelim(z2len, z2, xylen, detxy, cdet); + + temp32alen = scale_expansion_zeroelim(bclen, bc, aez, temp32a); + temp32blen = scale_expansion_zeroelim(bclen, bc, aeztail, temp32b); + temp64alen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64a); + temp32alen = scale_expansion_zeroelim(aclen, ac, -bez, temp32a); + temp32blen = scale_expansion_zeroelim(aclen, ac, -beztail, temp32b); + temp64blen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64b); + temp32alen = scale_expansion_zeroelim(ablen, ab, cez, temp32a); + temp32blen = scale_expansion_zeroelim(ablen, ab, ceztail, temp32b); + temp64clen = fast_expansion_sum_zeroelim(temp32alen, temp32a, + temp32blen, temp32b, temp64c); + temp128len = fast_expansion_sum_zeroelim(temp64alen, temp64a, + temp64blen, temp64b, temp128); + temp192len = fast_expansion_sum_zeroelim(temp64clen, temp64c, + temp128len, temp128, temp192); + xlen = scale_expansion_zeroelim(temp192len, temp192, dex, detx); + xxlen = scale_expansion_zeroelim(xlen, detx, dex, detxx); + xtlen = scale_expansion_zeroelim(temp192len, temp192, dextail, detxt); + xxtlen = scale_expansion_zeroelim(xtlen, detxt, dex, detxxt); + for (i = 0; i < xxtlen; i++) { + detxxt[i] *= 2.0; + } + xtxtlen = scale_expansion_zeroelim(xtlen, detxt, dextail, detxtxt); + x1len = fast_expansion_sum_zeroelim(xxlen, detxx, xxtlen, detxxt, x1); + x2len = fast_expansion_sum_zeroelim(x1len, x1, xtxtlen, detxtxt, x2); + ylen = scale_expansion_zeroelim(temp192len, temp192, dey, dety); + yylen = scale_expansion_zeroelim(ylen, dety, dey, detyy); + ytlen = scale_expansion_zeroelim(temp192len, temp192, deytail, detyt); + yytlen = scale_expansion_zeroelim(ytlen, detyt, dey, detyyt); + for (i = 0; i < yytlen; i++) { + detyyt[i] *= 2.0; + } + ytytlen = scale_expansion_zeroelim(ytlen, detyt, deytail, detytyt); + y1len = fast_expansion_sum_zeroelim(yylen, detyy, yytlen, detyyt, y1); + y2len = fast_expansion_sum_zeroelim(y1len, y1, ytytlen, detytyt, y2); + zlen = scale_expansion_zeroelim(temp192len, temp192, dez, detz); + zzlen = scale_expansion_zeroelim(zlen, detz, dez, detzz); + ztlen = scale_expansion_zeroelim(temp192len, temp192, deztail, detzt); + zztlen = scale_expansion_zeroelim(ztlen, detzt, dez, detzzt); + for (i = 0; i < zztlen; i++) { + detzzt[i] *= 2.0; + } + ztztlen = scale_expansion_zeroelim(ztlen, detzt, deztail, detztzt); + z1len = fast_expansion_sum_zeroelim(zzlen, detzz, zztlen, detzzt, z1); + z2len = fast_expansion_sum_zeroelim(z1len, z1, ztztlen, detztzt, z2); + xylen = fast_expansion_sum_zeroelim(x2len, x2, y2len, y2, detxy); + dlen = fast_expansion_sum_zeroelim(z2len, z2, xylen, detxy, ddet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + cdlen = fast_expansion_sum_zeroelim(clen, cdet, dlen, ddet, cddet); + deterlen = fast_expansion_sum_zeroelim(ablen, abdet, cdlen, cddet, deter); + + return deter[deterlen - 1]; +} + +REAL insphereadapt(REAL *pa, REAL *pb, REAL *pc, REAL *pd, REAL *pe, + REAL permanent) +{ + INEXACT REAL aex, bex, cex, dex, aey, bey, cey, dey, aez, bez, cez, dez; + REAL det, errbound; + + INEXACT REAL aexbey1, bexaey1, bexcey1, cexbey1; + INEXACT REAL cexdey1, dexcey1, dexaey1, aexdey1; + INEXACT REAL aexcey1, cexaey1, bexdey1, dexbey1; + REAL aexbey0, bexaey0, bexcey0, cexbey0; + REAL cexdey0, dexcey0, dexaey0, aexdey0; + REAL aexcey0, cexaey0, bexdey0, dexbey0; + REAL ab[4], bc[4], cd[4], da[4], ac[4], bd[4]; + INEXACT REAL ab3, bc3, cd3, da3, ac3, bd3; + REAL abeps, bceps, cdeps, daeps, aceps, bdeps; + REAL temp8a[8], temp8b[8], temp8c[8], temp16[16], temp24[24], temp48[48]; + int temp8alen, temp8blen, temp8clen, temp16len, temp24len, temp48len; + REAL xdet[96], ydet[96], zdet[96], xydet[192]; + int xlen, ylen, zlen, xylen; + REAL adet[288], bdet[288], cdet[288], ddet[288]; + int alen, blen, clen, dlen; + REAL abdet[576], cddet[576]; + int ablen, cdlen; + REAL fin1[1152]; + int finlength; + + REAL aextail, bextail, cextail, dextail; + REAL aeytail, beytail, ceytail, deytail; + REAL aeztail, beztail, ceztail, deztail; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j; + REAL _0; + + + aex = (REAL) (pa[0] - pe[0]); + bex = (REAL) (pb[0] - pe[0]); + cex = (REAL) (pc[0] - pe[0]); + dex = (REAL) (pd[0] - pe[0]); + aey = (REAL) (pa[1] - pe[1]); + bey = (REAL) (pb[1] - pe[1]); + cey = (REAL) (pc[1] - pe[1]); + dey = (REAL) (pd[1] - pe[1]); + aez = (REAL) (pa[2] - pe[2]); + bez = (REAL) (pb[2] - pe[2]); + cez = (REAL) (pc[2] - pe[2]); + dez = (REAL) (pd[2] - pe[2]); + + Two_Product(aex, bey, aexbey1, aexbey0); + Two_Product(bex, aey, bexaey1, bexaey0); + Two_Two_Diff(aexbey1, aexbey0, bexaey1, bexaey0, ab3, ab[2], ab[1], ab[0]); + ab[3] = ab3; + + Two_Product(bex, cey, bexcey1, bexcey0); + Two_Product(cex, bey, cexbey1, cexbey0); + Two_Two_Diff(bexcey1, bexcey0, cexbey1, cexbey0, bc3, bc[2], bc[1], bc[0]); + bc[3] = bc3; + + Two_Product(cex, dey, cexdey1, cexdey0); + Two_Product(dex, cey, dexcey1, dexcey0); + Two_Two_Diff(cexdey1, cexdey0, dexcey1, dexcey0, cd3, cd[2], cd[1], cd[0]); + cd[3] = cd3; + + Two_Product(dex, aey, dexaey1, dexaey0); + Two_Product(aex, dey, aexdey1, aexdey0); + Two_Two_Diff(dexaey1, dexaey0, aexdey1, aexdey0, da3, da[2], da[1], da[0]); + da[3] = da3; + + Two_Product(aex, cey, aexcey1, aexcey0); + Two_Product(cex, aey, cexaey1, cexaey0); + Two_Two_Diff(aexcey1, aexcey0, cexaey1, cexaey0, ac3, ac[2], ac[1], ac[0]); + ac[3] = ac3; + + Two_Product(bex, dey, bexdey1, bexdey0); + Two_Product(dex, bey, dexbey1, dexbey0); + Two_Two_Diff(bexdey1, bexdey0, dexbey1, dexbey0, bd3, bd[2], bd[1], bd[0]); + bd[3] = bd3; + + temp8alen = scale_expansion_zeroelim(4, cd, bez, temp8a); + temp8blen = scale_expansion_zeroelim(4, bd, -cez, temp8b); + temp8clen = scale_expansion_zeroelim(4, bc, dez, temp8c); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, + temp8blen, temp8b, temp16); + temp24len = fast_expansion_sum_zeroelim(temp8clen, temp8c, + temp16len, temp16, temp24); + temp48len = scale_expansion_zeroelim(temp24len, temp24, aex, temp48); + xlen = scale_expansion_zeroelim(temp48len, temp48, -aex, xdet); + temp48len = scale_expansion_zeroelim(temp24len, temp24, aey, temp48); + ylen = scale_expansion_zeroelim(temp48len, temp48, -aey, ydet); + temp48len = scale_expansion_zeroelim(temp24len, temp24, aez, temp48); + zlen = scale_expansion_zeroelim(temp48len, temp48, -aez, zdet); + xylen = fast_expansion_sum_zeroelim(xlen, xdet, ylen, ydet, xydet); + alen = fast_expansion_sum_zeroelim(xylen, xydet, zlen, zdet, adet); + + temp8alen = scale_expansion_zeroelim(4, da, cez, temp8a); + temp8blen = scale_expansion_zeroelim(4, ac, dez, temp8b); + temp8clen = scale_expansion_zeroelim(4, cd, aez, temp8c); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, + temp8blen, temp8b, temp16); + temp24len = fast_expansion_sum_zeroelim(temp8clen, temp8c, + temp16len, temp16, temp24); + temp48len = scale_expansion_zeroelim(temp24len, temp24, bex, temp48); + xlen = scale_expansion_zeroelim(temp48len, temp48, bex, xdet); + temp48len = scale_expansion_zeroelim(temp24len, temp24, bey, temp48); + ylen = scale_expansion_zeroelim(temp48len, temp48, bey, ydet); + temp48len = scale_expansion_zeroelim(temp24len, temp24, bez, temp48); + zlen = scale_expansion_zeroelim(temp48len, temp48, bez, zdet); + xylen = fast_expansion_sum_zeroelim(xlen, xdet, ylen, ydet, xydet); + blen = fast_expansion_sum_zeroelim(xylen, xydet, zlen, zdet, bdet); + + temp8alen = scale_expansion_zeroelim(4, ab, dez, temp8a); + temp8blen = scale_expansion_zeroelim(4, bd, aez, temp8b); + temp8clen = scale_expansion_zeroelim(4, da, bez, temp8c); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, + temp8blen, temp8b, temp16); + temp24len = fast_expansion_sum_zeroelim(temp8clen, temp8c, + temp16len, temp16, temp24); + temp48len = scale_expansion_zeroelim(temp24len, temp24, cex, temp48); + xlen = scale_expansion_zeroelim(temp48len, temp48, -cex, xdet); + temp48len = scale_expansion_zeroelim(temp24len, temp24, cey, temp48); + ylen = scale_expansion_zeroelim(temp48len, temp48, -cey, ydet); + temp48len = scale_expansion_zeroelim(temp24len, temp24, cez, temp48); + zlen = scale_expansion_zeroelim(temp48len, temp48, -cez, zdet); + xylen = fast_expansion_sum_zeroelim(xlen, xdet, ylen, ydet, xydet); + clen = fast_expansion_sum_zeroelim(xylen, xydet, zlen, zdet, cdet); + + temp8alen = scale_expansion_zeroelim(4, bc, aez, temp8a); + temp8blen = scale_expansion_zeroelim(4, ac, -bez, temp8b); + temp8clen = scale_expansion_zeroelim(4, ab, cez, temp8c); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, + temp8blen, temp8b, temp16); + temp24len = fast_expansion_sum_zeroelim(temp8clen, temp8c, + temp16len, temp16, temp24); + temp48len = scale_expansion_zeroelim(temp24len, temp24, dex, temp48); + xlen = scale_expansion_zeroelim(temp48len, temp48, dex, xdet); + temp48len = scale_expansion_zeroelim(temp24len, temp24, dey, temp48); + ylen = scale_expansion_zeroelim(temp48len, temp48, dey, ydet); + temp48len = scale_expansion_zeroelim(temp24len, temp24, dez, temp48); + zlen = scale_expansion_zeroelim(temp48len, temp48, dez, zdet); + xylen = fast_expansion_sum_zeroelim(xlen, xdet, ylen, ydet, xydet); + dlen = fast_expansion_sum_zeroelim(xylen, xydet, zlen, zdet, ddet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + cdlen = fast_expansion_sum_zeroelim(clen, cdet, dlen, ddet, cddet); + finlength = fast_expansion_sum_zeroelim(ablen, abdet, cdlen, cddet, fin1); + + det = estimate(finlength, fin1); + errbound = isperrboundB * permanent; + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + Two_Diff_Tail(pa[0], pe[0], aex, aextail); + Two_Diff_Tail(pa[1], pe[1], aey, aeytail); + Two_Diff_Tail(pa[2], pe[2], aez, aeztail); + Two_Diff_Tail(pb[0], pe[0], bex, bextail); + Two_Diff_Tail(pb[1], pe[1], bey, beytail); + Two_Diff_Tail(pb[2], pe[2], bez, beztail); + Two_Diff_Tail(pc[0], pe[0], cex, cextail); + Two_Diff_Tail(pc[1], pe[1], cey, ceytail); + Two_Diff_Tail(pc[2], pe[2], cez, ceztail); + Two_Diff_Tail(pd[0], pe[0], dex, dextail); + Two_Diff_Tail(pd[1], pe[1], dey, deytail); + Two_Diff_Tail(pd[2], pe[2], dez, deztail); + if ((aextail == 0.0) && (aeytail == 0.0) && (aeztail == 0.0) + && (bextail == 0.0) && (beytail == 0.0) && (beztail == 0.0) + && (cextail == 0.0) && (ceytail == 0.0) && (ceztail == 0.0) + && (dextail == 0.0) && (deytail == 0.0) && (deztail == 0.0)) { + return det; + } + + errbound = isperrboundC * permanent + resulterrbound * Absolute(det); + abeps = (aex * beytail + bey * aextail) + - (aey * bextail + bex * aeytail); + bceps = (bex * ceytail + cey * bextail) + - (bey * cextail + cex * beytail); + cdeps = (cex * deytail + dey * cextail) + - (cey * dextail + dex * ceytail); + daeps = (dex * aeytail + aey * dextail) + - (dey * aextail + aex * deytail); + aceps = (aex * ceytail + cey * aextail) + - (aey * cextail + cex * aeytail); + bdeps = (bex * deytail + dey * bextail) + - (bey * dextail + dex * beytail); + det += (((bex * bex + bey * bey + bez * bez) + * ((cez * daeps + dez * aceps + aez * cdeps) + + (ceztail * da3 + deztail * ac3 + aeztail * cd3)) + + (dex * dex + dey * dey + dez * dez) + * ((aez * bceps - bez * aceps + cez * abeps) + + (aeztail * bc3 - beztail * ac3 + ceztail * ab3))) + - ((aex * aex + aey * aey + aez * aez) + * ((bez * cdeps - cez * bdeps + dez * bceps) + + (beztail * cd3 - ceztail * bd3 + deztail * bc3)) + + (cex * cex + cey * cey + cez * cez) + * ((dez * abeps + aez * bdeps + bez * daeps) + + (deztail * ab3 + aeztail * bd3 + beztail * da3)))) + + 2.0 * (((bex * bextail + bey * beytail + bez * beztail) + * (cez * da3 + dez * ac3 + aez * cd3) + + (dex * dextail + dey * deytail + dez * deztail) + * (aez * bc3 - bez * ac3 + cez * ab3)) + - ((aex * aextail + aey * aeytail + aez * aeztail) + * (bez * cd3 - cez * bd3 + dez * bc3) + + (cex * cextail + cey * ceytail + cez * ceztail) + * (dez * ab3 + aez * bd3 + bez * da3))); + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + return insphereexact(pa, pb, pc, pd, pe); +} + +#ifdef USE_CGAL_PREDICATES + +REAL insphere(REAL *pa, REAL *pb, REAL *pc, REAL *pd, REAL *pe) +{ + return (REAL) + - cgal_pred_obj.side_of_oriented_sphere_3_object() + (Point(pa[0], pa[1], pa[2]), + Point(pb[0], pb[1], pb[2]), + Point(pc[0], pc[1], pc[2]), + Point(pd[0], pd[1], pd[2]), + Point(pe[0], pe[1], pe[2])); +} + +#else + +REAL insphere(REAL *pa, REAL *pb, REAL *pc, REAL *pd, REAL *pe) +{ + REAL aex, bex, cex, dex; + REAL aey, bey, cey, dey; + REAL aez, bez, cez, dez; + REAL aexbey, bexaey, bexcey, cexbey, cexdey, dexcey, dexaey, aexdey; + REAL aexcey, cexaey, bexdey, dexbey; + REAL alift, blift, clift, dlift; + REAL ab, bc, cd, da, ac, bd; + REAL abc, bcd, cda, dab; + REAL det; + + + aex = pa[0] - pe[0]; + bex = pb[0] - pe[0]; + cex = pc[0] - pe[0]; + dex = pd[0] - pe[0]; + aey = pa[1] - pe[1]; + bey = pb[1] - pe[1]; + cey = pc[1] - pe[1]; + dey = pd[1] - pe[1]; + aez = pa[2] - pe[2]; + bez = pb[2] - pe[2]; + cez = pc[2] - pe[2]; + dez = pd[2] - pe[2]; + + aexbey = aex * bey; + bexaey = bex * aey; + ab = aexbey - bexaey; + bexcey = bex * cey; + cexbey = cex * bey; + bc = bexcey - cexbey; + cexdey = cex * dey; + dexcey = dex * cey; + cd = cexdey - dexcey; + dexaey = dex * aey; + aexdey = aex * dey; + da = dexaey - aexdey; + + aexcey = aex * cey; + cexaey = cex * aey; + ac = aexcey - cexaey; + bexdey = bex * dey; + dexbey = dex * bey; + bd = bexdey - dexbey; + + abc = aez * bc - bez * ac + cez * ab; + bcd = bez * cd - cez * bd + dez * bc; + cda = cez * da + dez * ac + aez * cd; + dab = dez * ab + aez * bd + bez * da; + + alift = aex * aex + aey * aey + aez * aez; + blift = bex * bex + bey * bey + bez * bez; + clift = cex * cex + cey * cey + cez * cez; + dlift = dex * dex + dey * dey + dez * dez; + + det = (dlift * abc - clift * dab) + (blift * cda - alift * bcd); + + if (_use_inexact_arith) { + return det; + } + + if (_use_static_filter) { + if (fabs(det) > ispstaticfilter) return det; + //if (det > ispstaticfilter) return det; + //if (det < minus_ispstaticfilter) return det; + + } + + REAL aezplus, bezplus, cezplus, dezplus; + REAL aexbeyplus, bexaeyplus, bexceyplus, cexbeyplus; + REAL cexdeyplus, dexceyplus, dexaeyplus, aexdeyplus; + REAL aexceyplus, cexaeyplus, bexdeyplus, dexbeyplus; + REAL permanent, errbound; + + aezplus = Absolute(aez); + bezplus = Absolute(bez); + cezplus = Absolute(cez); + dezplus = Absolute(dez); + aexbeyplus = Absolute(aexbey); + bexaeyplus = Absolute(bexaey); + bexceyplus = Absolute(bexcey); + cexbeyplus = Absolute(cexbey); + cexdeyplus = Absolute(cexdey); + dexceyplus = Absolute(dexcey); + dexaeyplus = Absolute(dexaey); + aexdeyplus = Absolute(aexdey); + aexceyplus = Absolute(aexcey); + cexaeyplus = Absolute(cexaey); + bexdeyplus = Absolute(bexdey); + dexbeyplus = Absolute(dexbey); + permanent = ((cexdeyplus + dexceyplus) * bezplus + + (dexbeyplus + bexdeyplus) * cezplus + + (bexceyplus + cexbeyplus) * dezplus) + * alift + + ((dexaeyplus + aexdeyplus) * cezplus + + (aexceyplus + cexaeyplus) * dezplus + + (cexdeyplus + dexceyplus) * aezplus) + * blift + + ((aexbeyplus + bexaeyplus) * dezplus + + (bexdeyplus + dexbeyplus) * aezplus + + (dexaeyplus + aexdeyplus) * bezplus) + * clift + + ((bexceyplus + cexbeyplus) * aezplus + + (cexaeyplus + aexceyplus) * bezplus + + (aexbeyplus + bexaeyplus) * cezplus) + * dlift; + errbound = isperrboundA * permanent; + if ((det > errbound) || (-det > errbound)) { + return det; + } + + return insphereadapt(pa, pb, pc, pd, pe, permanent); +} + +#endif // #ifdef USE_CGAL_PREDICATES + +/*****************************************************************************/ +/* */ +/* orient4d() Return a positive value if the point pe lies above the */ +/* hyperplane passing through pa, pb, pc, and pd; "above" is */ +/* defined in a manner best found by trial-and-error. Returns */ +/* a negative value if pe lies below the hyperplane. Returns */ +/* zero if the points are co-hyperplanar (not affinely */ +/* independent). The result is also a rough approximation of */ +/* 24 times the signed volume of the 4-simplex defined by the */ +/* five points. */ +/* */ +/* Uses exact arithmetic if necessary to ensure a correct answer. The */ +/* result returned is the determinant of a matrix. This determinant is */ +/* computed adaptively, in the sense that exact arithmetic is used only to */ +/* the degree it is needed to ensure that the returned value has the */ +/* correct sign. Hence, orient4d() is usually quite fast, but will run */ +/* more slowly when the input points are hyper-coplanar or nearly so. */ +/* */ +/* See my Robust Predicates paper for details. */ +/* */ +/*****************************************************************************/ + +REAL orient4dexact(REAL* pa, REAL* pb, REAL* pc, REAL* pd, REAL* pe, + REAL aheight, REAL bheight, REAL cheight, REAL dheight, + REAL eheight) +{ + INEXACT REAL axby1, bxcy1, cxdy1, dxey1, exay1; + INEXACT REAL bxay1, cxby1, dxcy1, exdy1, axey1; + INEXACT REAL axcy1, bxdy1, cxey1, dxay1, exby1; + INEXACT REAL cxay1, dxby1, excy1, axdy1, bxey1; + REAL axby0, bxcy0, cxdy0, dxey0, exay0; + REAL bxay0, cxby0, dxcy0, exdy0, axey0; + REAL axcy0, bxdy0, cxey0, dxay0, exby0; + REAL cxay0, dxby0, excy0, axdy0, bxey0; + REAL ab[4], bc[4], cd[4], de[4], ea[4]; + REAL ac[4], bd[4], ce[4], da[4], eb[4]; + REAL temp8a[8], temp8b[8], temp16[16]; + int temp8alen, temp8blen, temp16len; + REAL abc[24], bcd[24], cde[24], dea[24], eab[24]; + REAL abd[24], bce[24], cda[24], deb[24], eac[24]; + int abclen, bcdlen, cdelen, dealen, eablen; + int abdlen, bcelen, cdalen, deblen, eaclen; + REAL temp48a[48], temp48b[48]; + int temp48alen, temp48blen; + REAL abcd[96], bcde[96], cdea[96], deab[96], eabc[96]; + int abcdlen, bcdelen, cdealen, deablen, eabclen; + REAL adet[192], bdet[192], cdet[192], ddet[192], edet[192]; + int alen, blen, clen, dlen, elen; + REAL abdet[384], cddet[384], cdedet[576]; + int ablen, cdlen; + REAL deter[960]; + int deterlen; + int i; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j; + REAL _0; + + + Two_Product(pa[0], pb[1], axby1, axby0); + Two_Product(pb[0], pa[1], bxay1, bxay0); + Two_Two_Diff(axby1, axby0, bxay1, bxay0, ab[3], ab[2], ab[1], ab[0]); + + Two_Product(pb[0], pc[1], bxcy1, bxcy0); + Two_Product(pc[0], pb[1], cxby1, cxby0); + Two_Two_Diff(bxcy1, bxcy0, cxby1, cxby0, bc[3], bc[2], bc[1], bc[0]); + + Two_Product(pc[0], pd[1], cxdy1, cxdy0); + Two_Product(pd[0], pc[1], dxcy1, dxcy0); + Two_Two_Diff(cxdy1, cxdy0, dxcy1, dxcy0, cd[3], cd[2], cd[1], cd[0]); + + Two_Product(pd[0], pe[1], dxey1, dxey0); + Two_Product(pe[0], pd[1], exdy1, exdy0); + Two_Two_Diff(dxey1, dxey0, exdy1, exdy0, de[3], de[2], de[1], de[0]); + + Two_Product(pe[0], pa[1], exay1, exay0); + Two_Product(pa[0], pe[1], axey1, axey0); + Two_Two_Diff(exay1, exay0, axey1, axey0, ea[3], ea[2], ea[1], ea[0]); + + Two_Product(pa[0], pc[1], axcy1, axcy0); + Two_Product(pc[0], pa[1], cxay1, cxay0); + Two_Two_Diff(axcy1, axcy0, cxay1, cxay0, ac[3], ac[2], ac[1], ac[0]); + + Two_Product(pb[0], pd[1], bxdy1, bxdy0); + Two_Product(pd[0], pb[1], dxby1, dxby0); + Two_Two_Diff(bxdy1, bxdy0, dxby1, dxby0, bd[3], bd[2], bd[1], bd[0]); + + Two_Product(pc[0], pe[1], cxey1, cxey0); + Two_Product(pe[0], pc[1], excy1, excy0); + Two_Two_Diff(cxey1, cxey0, excy1, excy0, ce[3], ce[2], ce[1], ce[0]); + + Two_Product(pd[0], pa[1], dxay1, dxay0); + Two_Product(pa[0], pd[1], axdy1, axdy0); + Two_Two_Diff(dxay1, dxay0, axdy1, axdy0, da[3], da[2], da[1], da[0]); + + Two_Product(pe[0], pb[1], exby1, exby0); + Two_Product(pb[0], pe[1], bxey1, bxey0); + Two_Two_Diff(exby1, exby0, bxey1, bxey0, eb[3], eb[2], eb[1], eb[0]); + + temp8alen = scale_expansion_zeroelim(4, bc, pa[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, ac, -pb[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, ab, pc[2], temp8a); + abclen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + abc); + + temp8alen = scale_expansion_zeroelim(4, cd, pb[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, bd, -pc[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, bc, pd[2], temp8a); + bcdlen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + bcd); + + temp8alen = scale_expansion_zeroelim(4, de, pc[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, ce, -pd[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, cd, pe[2], temp8a); + cdelen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + cde); + + temp8alen = scale_expansion_zeroelim(4, ea, pd[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, da, -pe[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, de, pa[2], temp8a); + dealen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + dea); + + temp8alen = scale_expansion_zeroelim(4, ab, pe[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, eb, -pa[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, ea, pb[2], temp8a); + eablen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + eab); + + temp8alen = scale_expansion_zeroelim(4, bd, pa[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, da, pb[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, ab, pd[2], temp8a); + abdlen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + abd); + + temp8alen = scale_expansion_zeroelim(4, ce, pb[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, eb, pc[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, bc, pe[2], temp8a); + bcelen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + bce); + + temp8alen = scale_expansion_zeroelim(4, da, pc[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, ac, pd[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, cd, pa[2], temp8a); + cdalen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + cda); + + temp8alen = scale_expansion_zeroelim(4, eb, pd[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, bd, pe[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, de, pb[2], temp8a); + deblen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + deb); + + temp8alen = scale_expansion_zeroelim(4, ac, pe[2], temp8a); + temp8blen = scale_expansion_zeroelim(4, ce, pa[2], temp8b); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, + temp16); + temp8alen = scale_expansion_zeroelim(4, ea, pc[2], temp8a); + eaclen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, + eac); + + temp48alen = fast_expansion_sum_zeroelim(cdelen, cde, bcelen, bce, temp48a); + temp48blen = fast_expansion_sum_zeroelim(deblen, deb, bcdlen, bcd, temp48b); + for (i = 0; i < temp48blen; i++) { + temp48b[i] = -temp48b[i]; + } + bcdelen = fast_expansion_sum_zeroelim(temp48alen, temp48a, + temp48blen, temp48b, bcde); + alen = scale_expansion_zeroelim(bcdelen, bcde, aheight, adet); + + temp48alen = fast_expansion_sum_zeroelim(dealen, dea, cdalen, cda, temp48a); + temp48blen = fast_expansion_sum_zeroelim(eaclen, eac, cdelen, cde, temp48b); + for (i = 0; i < temp48blen; i++) { + temp48b[i] = -temp48b[i]; + } + cdealen = fast_expansion_sum_zeroelim(temp48alen, temp48a, + temp48blen, temp48b, cdea); + blen = scale_expansion_zeroelim(cdealen, cdea, bheight, bdet); + + temp48alen = fast_expansion_sum_zeroelim(eablen, eab, deblen, deb, temp48a); + temp48blen = fast_expansion_sum_zeroelim(abdlen, abd, dealen, dea, temp48b); + for (i = 0; i < temp48blen; i++) { + temp48b[i] = -temp48b[i]; + } + deablen = fast_expansion_sum_zeroelim(temp48alen, temp48a, + temp48blen, temp48b, deab); + clen = scale_expansion_zeroelim(deablen, deab, cheight, cdet); + + temp48alen = fast_expansion_sum_zeroelim(abclen, abc, eaclen, eac, temp48a); + temp48blen = fast_expansion_sum_zeroelim(bcelen, bce, eablen, eab, temp48b); + for (i = 0; i < temp48blen; i++) { + temp48b[i] = -temp48b[i]; + } + eabclen = fast_expansion_sum_zeroelim(temp48alen, temp48a, + temp48blen, temp48b, eabc); + dlen = scale_expansion_zeroelim(eabclen, eabc, dheight, ddet); + + temp48alen = fast_expansion_sum_zeroelim(bcdlen, bcd, abdlen, abd, temp48a); + temp48blen = fast_expansion_sum_zeroelim(cdalen, cda, abclen, abc, temp48b); + for (i = 0; i < temp48blen; i++) { + temp48b[i] = -temp48b[i]; + } + abcdlen = fast_expansion_sum_zeroelim(temp48alen, temp48a, + temp48blen, temp48b, abcd); + elen = scale_expansion_zeroelim(abcdlen, abcd, eheight, edet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + cdlen = fast_expansion_sum_zeroelim(clen, cdet, dlen, ddet, cddet); + cdelen = fast_expansion_sum_zeroelim(cdlen, cddet, elen, edet, cdedet); + deterlen = fast_expansion_sum_zeroelim(ablen, abdet, cdelen, cdedet, deter); + + return deter[deterlen - 1]; +} + +REAL orient4dadapt(REAL* pa, REAL* pb, REAL* pc, REAL* pd, REAL* pe, + REAL aheight, REAL bheight, REAL cheight, REAL dheight, + REAL eheight, REAL permanent) +{ + INEXACT REAL aex, bex, cex, dex, aey, bey, cey, dey, aez, bez, cez, dez; + INEXACT REAL aeheight, beheight, ceheight, deheight; + REAL det, errbound; + + INEXACT REAL aexbey1, bexaey1, bexcey1, cexbey1; + INEXACT REAL cexdey1, dexcey1, dexaey1, aexdey1; + INEXACT REAL aexcey1, cexaey1, bexdey1, dexbey1; + REAL aexbey0, bexaey0, bexcey0, cexbey0; + REAL cexdey0, dexcey0, dexaey0, aexdey0; + REAL aexcey0, cexaey0, bexdey0, dexbey0; + REAL ab[4], bc[4], cd[4], da[4], ac[4], bd[4]; + INEXACT REAL ab3, bc3, cd3, da3, ac3, bd3; + REAL abeps, bceps, cdeps, daeps, aceps, bdeps; + REAL temp8a[8], temp8b[8], temp8c[8], temp16[16], temp24[24]; + int temp8alen, temp8blen, temp8clen, temp16len, temp24len; + REAL adet[48], bdet[48], cdet[48], ddet[48]; + int alen, blen, clen, dlen; + REAL abdet[96], cddet[96]; + int ablen, cdlen; + REAL fin1[192]; + int finlength; + + REAL aextail, bextail, cextail, dextail; + REAL aeytail, beytail, ceytail, deytail; + REAL aeztail, beztail, ceztail, deztail; + REAL aeheighttail, beheighttail, ceheighttail, deheighttail; + + INEXACT REAL bvirt; + REAL avirt, bround, around; + INEXACT REAL c; + INEXACT REAL abig; + REAL ahi, alo, bhi, blo; + REAL err1, err2, err3; + INEXACT REAL _i, _j; + REAL _0; + + + aex = (REAL) (pa[0] - pe[0]); + bex = (REAL) (pb[0] - pe[0]); + cex = (REAL) (pc[0] - pe[0]); + dex = (REAL) (pd[0] - pe[0]); + aey = (REAL) (pa[1] - pe[1]); + bey = (REAL) (pb[1] - pe[1]); + cey = (REAL) (pc[1] - pe[1]); + dey = (REAL) (pd[1] - pe[1]); + aez = (REAL) (pa[2] - pe[2]); + bez = (REAL) (pb[2] - pe[2]); + cez = (REAL) (pc[2] - pe[2]); + dez = (REAL) (pd[2] - pe[2]); + aeheight = (REAL) (aheight - eheight); + beheight = (REAL) (bheight - eheight); + ceheight = (REAL) (cheight - eheight); + deheight = (REAL) (dheight - eheight); + + Two_Product(aex, bey, aexbey1, aexbey0); + Two_Product(bex, aey, bexaey1, bexaey0); + Two_Two_Diff(aexbey1, aexbey0, bexaey1, bexaey0, ab3, ab[2], ab[1], ab[0]); + ab[3] = ab3; + + Two_Product(bex, cey, bexcey1, bexcey0); + Two_Product(cex, bey, cexbey1, cexbey0); + Two_Two_Diff(bexcey1, bexcey0, cexbey1, cexbey0, bc3, bc[2], bc[1], bc[0]); + bc[3] = bc3; + + Two_Product(cex, dey, cexdey1, cexdey0); + Two_Product(dex, cey, dexcey1, dexcey0); + Two_Two_Diff(cexdey1, cexdey0, dexcey1, dexcey0, cd3, cd[2], cd[1], cd[0]); + cd[3] = cd3; + + Two_Product(dex, aey, dexaey1, dexaey0); + Two_Product(aex, dey, aexdey1, aexdey0); + Two_Two_Diff(dexaey1, dexaey0, aexdey1, aexdey0, da3, da[2], da[1], da[0]); + da[3] = da3; + + Two_Product(aex, cey, aexcey1, aexcey0); + Two_Product(cex, aey, cexaey1, cexaey0); + Two_Two_Diff(aexcey1, aexcey0, cexaey1, cexaey0, ac3, ac[2], ac[1], ac[0]); + ac[3] = ac3; + + Two_Product(bex, dey, bexdey1, bexdey0); + Two_Product(dex, bey, dexbey1, dexbey0); + Two_Two_Diff(bexdey1, bexdey0, dexbey1, dexbey0, bd3, bd[2], bd[1], bd[0]); + bd[3] = bd3; + + temp8alen = scale_expansion_zeroelim(4, cd, bez, temp8a); + temp8blen = scale_expansion_zeroelim(4, bd, -cez, temp8b); + temp8clen = scale_expansion_zeroelim(4, bc, dez, temp8c); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, + temp8blen, temp8b, temp16); + temp24len = fast_expansion_sum_zeroelim(temp8clen, temp8c, + temp16len, temp16, temp24); + alen = scale_expansion_zeroelim(temp24len, temp24, -aeheight, adet); + + temp8alen = scale_expansion_zeroelim(4, da, cez, temp8a); + temp8blen = scale_expansion_zeroelim(4, ac, dez, temp8b); + temp8clen = scale_expansion_zeroelim(4, cd, aez, temp8c); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, + temp8blen, temp8b, temp16); + temp24len = fast_expansion_sum_zeroelim(temp8clen, temp8c, + temp16len, temp16, temp24); + blen = scale_expansion_zeroelim(temp24len, temp24, beheight, bdet); + + temp8alen = scale_expansion_zeroelim(4, ab, dez, temp8a); + temp8blen = scale_expansion_zeroelim(4, bd, aez, temp8b); + temp8clen = scale_expansion_zeroelim(4, da, bez, temp8c); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, + temp8blen, temp8b, temp16); + temp24len = fast_expansion_sum_zeroelim(temp8clen, temp8c, + temp16len, temp16, temp24); + clen = scale_expansion_zeroelim(temp24len, temp24, -ceheight, cdet); + + temp8alen = scale_expansion_zeroelim(4, bc, aez, temp8a); + temp8blen = scale_expansion_zeroelim(4, ac, -bez, temp8b); + temp8clen = scale_expansion_zeroelim(4, ab, cez, temp8c); + temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, + temp8blen, temp8b, temp16); + temp24len = fast_expansion_sum_zeroelim(temp8clen, temp8c, + temp16len, temp16, temp24); + dlen = scale_expansion_zeroelim(temp24len, temp24, deheight, ddet); + + ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); + cdlen = fast_expansion_sum_zeroelim(clen, cdet, dlen, ddet, cddet); + finlength = fast_expansion_sum_zeroelim(ablen, abdet, cdlen, cddet, fin1); + + det = estimate(finlength, fin1); + errbound = isperrboundB * permanent; + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + Two_Diff_Tail(pa[0], pe[0], aex, aextail); + Two_Diff_Tail(pa[1], pe[1], aey, aeytail); + Two_Diff_Tail(pa[2], pe[2], aez, aeztail); + Two_Diff_Tail(aheight, eheight, aeheight, aeheighttail); + Two_Diff_Tail(pb[0], pe[0], bex, bextail); + Two_Diff_Tail(pb[1], pe[1], bey, beytail); + Two_Diff_Tail(pb[2], pe[2], bez, beztail); + Two_Diff_Tail(bheight, eheight, beheight, beheighttail); + Two_Diff_Tail(pc[0], pe[0], cex, cextail); + Two_Diff_Tail(pc[1], pe[1], cey, ceytail); + Two_Diff_Tail(pc[2], pe[2], cez, ceztail); + Two_Diff_Tail(cheight, eheight, ceheight, ceheighttail); + Two_Diff_Tail(pd[0], pe[0], dex, dextail); + Two_Diff_Tail(pd[1], pe[1], dey, deytail); + Two_Diff_Tail(pd[2], pe[2], dez, deztail); + Two_Diff_Tail(dheight, eheight, deheight, deheighttail); + if ((aextail == 0.0) && (aeytail == 0.0) && (aeztail == 0.0) + && (bextail == 0.0) && (beytail == 0.0) && (beztail == 0.0) + && (cextail == 0.0) && (ceytail == 0.0) && (ceztail == 0.0) + && (dextail == 0.0) && (deytail == 0.0) && (deztail == 0.0) + && (aeheighttail == 0.0) && (beheighttail == 0.0) + && (ceheighttail == 0.0) && (deheighttail == 0.0)) { + return det; + } + + errbound = isperrboundC * permanent + resulterrbound * Absolute(det); + abeps = (aex * beytail + bey * aextail) + - (aey * bextail + bex * aeytail); + bceps = (bex * ceytail + cey * bextail) + - (bey * cextail + cex * beytail); + cdeps = (cex * deytail + dey * cextail) + - (cey * dextail + dex * ceytail); + daeps = (dex * aeytail + aey * dextail) + - (dey * aextail + aex * deytail); + aceps = (aex * ceytail + cey * aextail) + - (aey * cextail + cex * aeytail); + bdeps = (bex * deytail + dey * bextail) + - (bey * dextail + dex * beytail); + det += ((beheight + * ((cez * daeps + dez * aceps + aez * cdeps) + + (ceztail * da3 + deztail * ac3 + aeztail * cd3)) + + deheight + * ((aez * bceps - bez * aceps + cez * abeps) + + (aeztail * bc3 - beztail * ac3 + ceztail * ab3))) + - (aeheight + * ((bez * cdeps - cez * bdeps + dez * bceps) + + (beztail * cd3 - ceztail * bd3 + deztail * bc3)) + + ceheight + * ((dez * abeps + aez * bdeps + bez * daeps) + + (deztail * ab3 + aeztail * bd3 + beztail * da3)))) + + ((beheighttail * (cez * da3 + dez * ac3 + aez * cd3) + + deheighttail * (aez * bc3 - bez * ac3 + cez * ab3)) + - (aeheighttail * (bez * cd3 - cez * bd3 + dez * bc3) + + ceheighttail * (dez * ab3 + aez * bd3 + bez * da3))); + if ((det >= errbound) || (-det >= errbound)) { + return det; + } + + return orient4dexact(pa, pb, pc, pd, pe, + aheight, bheight, cheight, dheight, eheight); +} + +REAL orient4d(REAL* pa, REAL* pb, REAL* pc, REAL* pd, REAL* pe, + REAL aheight, REAL bheight, REAL cheight, REAL dheight, + REAL eheight) +{ + REAL aex, bex, cex, dex; + REAL aey, bey, cey, dey; + REAL aez, bez, cez, dez; + REAL aexbey, bexaey, bexcey, cexbey, cexdey, dexcey, dexaey, aexdey; + REAL aexcey, cexaey, bexdey, dexbey; + REAL aeheight, beheight, ceheight, deheight; + REAL ab, bc, cd, da, ac, bd; + REAL abc, bcd, cda, dab; + REAL aezplus, bezplus, cezplus, dezplus; + REAL aexbeyplus, bexaeyplus, bexceyplus, cexbeyplus; + REAL cexdeyplus, dexceyplus, dexaeyplus, aexdeyplus; + REAL aexceyplus, cexaeyplus, bexdeyplus, dexbeyplus; + REAL det; + REAL permanent, errbound; + + + aex = pa[0] - pe[0]; + bex = pb[0] - pe[0]; + cex = pc[0] - pe[0]; + dex = pd[0] - pe[0]; + aey = pa[1] - pe[1]; + bey = pb[1] - pe[1]; + cey = pc[1] - pe[1]; + dey = pd[1] - pe[1]; + aez = pa[2] - pe[2]; + bez = pb[2] - pe[2]; + cez = pc[2] - pe[2]; + dez = pd[2] - pe[2]; + aeheight = aheight - eheight; + beheight = bheight - eheight; + ceheight = cheight - eheight; + deheight = dheight - eheight; + + aexbey = aex * bey; + bexaey = bex * aey; + ab = aexbey - bexaey; + bexcey = bex * cey; + cexbey = cex * bey; + bc = bexcey - cexbey; + cexdey = cex * dey; + dexcey = dex * cey; + cd = cexdey - dexcey; + dexaey = dex * aey; + aexdey = aex * dey; + da = dexaey - aexdey; + + aexcey = aex * cey; + cexaey = cex * aey; + ac = aexcey - cexaey; + bexdey = bex * dey; + dexbey = dex * bey; + bd = bexdey - dexbey; + + abc = aez * bc - bez * ac + cez * ab; + bcd = bez * cd - cez * bd + dez * bc; + cda = cez * da + dez * ac + aez * cd; + dab = dez * ab + aez * bd + bez * da; + + det = (deheight * abc - ceheight * dab) + (beheight * cda - aeheight * bcd); + + aezplus = Absolute(aez); + bezplus = Absolute(bez); + cezplus = Absolute(cez); + dezplus = Absolute(dez); + aexbeyplus = Absolute(aexbey); + bexaeyplus = Absolute(bexaey); + bexceyplus = Absolute(bexcey); + cexbeyplus = Absolute(cexbey); + cexdeyplus = Absolute(cexdey); + dexceyplus = Absolute(dexcey); + dexaeyplus = Absolute(dexaey); + aexdeyplus = Absolute(aexdey); + aexceyplus = Absolute(aexcey); + cexaeyplus = Absolute(cexaey); + bexdeyplus = Absolute(bexdey); + dexbeyplus = Absolute(dexbey); + permanent = ((cexdeyplus + dexceyplus) * bezplus + + (dexbeyplus + bexdeyplus) * cezplus + + (bexceyplus + cexbeyplus) * dezplus) + * Absolute(aeheight) + + ((dexaeyplus + aexdeyplus) * cezplus + + (aexceyplus + cexaeyplus) * dezplus + + (cexdeyplus + dexceyplus) * aezplus) + * Absolute(beheight) + + ((aexbeyplus + bexaeyplus) * dezplus + + (bexdeyplus + dexbeyplus) * aezplus + + (dexaeyplus + aexdeyplus) * bezplus) + * Absolute(ceheight) + + ((bexceyplus + cexbeyplus) * aezplus + + (cexaeyplus + aexceyplus) * bezplus + + (aexbeyplus + bexaeyplus) * cezplus) + * Absolute(deheight); + errbound = isperrboundA * permanent; + if ((det > errbound) || (-det > errbound)) { + return det; + } + + return orient4dadapt(pa, pb, pc, pd, pe, + aheight, bheight, cheight, dheight, eheight, permanent); +} + + + diff --git a/src/tool/tetgen.cxx b/src/tool/tetgen.cxx new file mode 100644 index 0000000..599b2e1 --- /dev/null +++ b/src/tool/tetgen.cxx @@ -0,0 +1,32520 @@ +/////////////////////////////////////////////////////////////////////////////// +// // +// TetGen // +// // +// A Quality Tetrahedral Mesh Generator and A 3D Delaunay Triangulator // +// // +// Version 1.5 // +// August 18, 2018 // +// // +// Copyright (C) 2002--2018 // +// // +// TetGen is freely available through the website: http://www.tetgen.org. // +// It may be copied, modified, and redistributed for non-commercial use. // +// Please consult the file LICENSE for the detailed copyright notices. // +// // +/////////////////////////////////////////////////////////////////////////////// + +#include "tetgen.h" + +//// io_cxx /////////////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_node_call() Read a list of points from a file. // +// // +// 'infile' is the file handle contains the node list. It may point to a // +// .node, or .poly or .smesh file. 'markers' indicates each node contains an // +// additional marker (integer) or not. 'uvflag' indicates each node contains // +// u,v coordinates or not. It is reuqired by a PSC. 'infilename' is the name // +// of the file being read, it is only used in error messages. // +// // +// The 'firstnumber' (0 or 1) is automatically determined by the number of // +// the first index of the first point. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_node_call(FILE* infile, int markers, int uvflag, + char* infilename) +{ + char inputline[INPUTLINESIZE]; + char *stringptr; + REAL x, y, z, attrib; + int firstnode, currentmarker; + int index, attribindex; + int i, j; + + // Initialize 'pointlist', 'pointattributelist', and 'pointmarkerlist'. + pointlist = new REAL[numberofpoints * 3]; + if (pointlist == (REAL *) NULL) { + terminatetetgen(NULL, 1); + } + if (numberofpointattributes > 0) { + pointattributelist = new REAL[numberofpoints * numberofpointattributes]; + if (pointattributelist == (REAL *) NULL) { + terminatetetgen(NULL, 1); + } + } + if (markers) { + pointmarkerlist = new int[numberofpoints]; + if (pointmarkerlist == (int *) NULL) { + terminatetetgen(NULL, 1); + } + } + if (uvflag) { + pointparamlist = new pointparam[numberofpoints]; + if (pointparamlist == NULL) { + terminatetetgen(NULL, 1); + } + } + + // Read the point section. + index = 0; + attribindex = 0; + for (i = 0; i < numberofpoints; i++) { + stringptr = readnumberline(inputline, infile, infilename); + if (useindex) { + if (i == 0) { + firstnode = (int) strtol (stringptr, &stringptr, 0); + if ((firstnode == 0) || (firstnode == 1)) { + firstnumber = firstnode; + } + } + stringptr = findnextnumber(stringptr); + } // if (useindex) + if (*stringptr == '\0') { + printf("Error: Point %d has no x coordinate.\n", firstnumber + i); + break; + } + x = (REAL) strtod(stringptr, &stringptr); + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Point %d has no y coordinate.\n", firstnumber + i); + break; + } + y = (REAL) strtod(stringptr, &stringptr); + if (mesh_dim == 3) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Point %d has no z coordinate.\n", firstnumber + i); + break; + } + z = (REAL) strtod(stringptr, &stringptr); + } else { + z = 0.0; // mesh_dim == 2; + } + pointlist[index++] = x; + pointlist[index++] = y; + pointlist[index++] = z; + // Read the point attributes. + for (j = 0; j < numberofpointattributes; j++) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + attrib = 0.0; + } else { + attrib = (REAL) strtod(stringptr, &stringptr); + } + pointattributelist[attribindex++] = attrib; + } + if (markers) { + // Read a point marker. + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + currentmarker = 0; + } else { + currentmarker = (int) strtol (stringptr, &stringptr, 0); + } + pointmarkerlist[i] = currentmarker; + } + if (uvflag) { + // Read point paramteters. + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Point %d has no uv[0].\n", firstnumber + i); + break; + } + pointparamlist[i].uv[0] = (REAL) strtod(stringptr, &stringptr); + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Point %d has no uv[1].\n", firstnumber + i); + break; + } + pointparamlist[i].uv[1] = (REAL) strtod(stringptr, &stringptr); + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Point %d has no tag.\n", firstnumber + i); + break; + } + pointparamlist[i].tag = (int) strtol (stringptr, &stringptr, 0); + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Point %d has no type.\n", firstnumber + i); + break; + } + pointparamlist[i].type = (int) strtol (stringptr, &stringptr, 0); + if ((pointparamlist[i].type < 0) || (pointparamlist[i].type > 2)) { + printf("Error: Point %d has an invalid type.\n", firstnumber + i); + break; + } + } + } + if (i < numberofpoints) { + // Failed to read points due to some error. + delete [] pointlist; + pointlist = (REAL *) NULL; + if (markers) { + delete [] pointmarkerlist; + pointmarkerlist = (int *) NULL; + } + if (numberofpointattributes > 0) { + delete [] pointattributelist; + pointattributelist = (REAL *) NULL; + } + if (uvflag) { + delete [] pointparamlist; + pointparamlist = NULL; + } + numberofpoints = 0; + return false; + } + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_node() Load a list of points from a .node file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_node(char* filebasename) +{ + FILE *infile; + char innodefilename[FILENAMESIZE]; + char inputline[INPUTLINESIZE]; + char *stringptr; + bool okflag; + int markers; + int uvflag; // for psc input. + + // Assembling the actual file names we want to open. + strcpy(innodefilename, filebasename); + strcat(innodefilename, ".node"); + + // Try to open a .node file. + infile = fopen(innodefilename, "r"); + if (infile == (FILE *) NULL) { + printf(" Cannot access file %s.\n", innodefilename); + return false; + } + printf("Opening %s.\n", innodefilename); + + // Set initial flags. + mesh_dim = 3; + numberofpointattributes = 0; // no point attribute. + markers = 0; // no boundary marker. + uvflag = 0; // no uv parameters (required by a PSC). + + // Read the first line of the file. + stringptr = readnumberline(inputline, infile, innodefilename); + // Does this file contain an index column? + stringptr = strstr(inputline, "rbox"); + if (stringptr == NULL) { + // Read number of points, number of dimensions, number of point + // attributes, and number of boundary markers. + stringptr = inputline; + numberofpoints = (int) strtol (stringptr, &stringptr, 0); + stringptr = findnextnumber(stringptr); + if (*stringptr != '\0') { + mesh_dim = (int) strtol (stringptr, &stringptr, 0); + } + stringptr = findnextnumber(stringptr); + if (*stringptr != '\0') { + numberofpointattributes = (int) strtol (stringptr, &stringptr, 0); + } + stringptr = findnextnumber(stringptr); + if (*stringptr != '\0') { + markers = (int) strtol (stringptr, &stringptr, 0); + } + stringptr = findnextnumber(stringptr); + if (*stringptr != '\0') { + uvflag = (int) strtol (stringptr, &stringptr, 0); + } + } else { + // It is a rbox (qhull) input file. + stringptr = inputline; + // Get the dimension. + mesh_dim = (int) strtol (stringptr, &stringptr, 0); + // Get the number of points. + stringptr = readnumberline(inputline, infile, innodefilename); + numberofpoints = (int) strtol (stringptr, &stringptr, 0); + // There is no index column. + useindex = 0; + } + + // Load the list of nodes. + okflag = load_node_call(infile, markers, uvflag, innodefilename); + + fclose(infile); + return okflag; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_edge() Load a list of edges from a .edge file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_edge(char* filebasename) +{ + FILE *infile; + char inedgefilename[FILENAMESIZE]; + char inputline[INPUTLINESIZE]; + char *stringptr; + int markers, corner; + int index; + int i, j; + + strcpy(inedgefilename, filebasename); + strcat(inedgefilename, ".edge"); + + infile = fopen(inedgefilename, "r"); + if (infile != (FILE *) NULL) { + printf("Opening %s.\n", inedgefilename); + } else { + //printf(" Cannot access file %s.\n", inedgefilename); + return false; + } + + // Read number of boundary edges. + stringptr = readnumberline(inputline, infile, inedgefilename); + numberofedges = (int) strtol (stringptr, &stringptr, 0); + if (numberofedges > 0) { + edgelist = new int[numberofedges * 2]; + if (edgelist == (int *) NULL) { + terminatetetgen(NULL, 1); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + markers = 0; // Default value. + } else { + markers = (int) strtol (stringptr, &stringptr, 0); + } + if (markers > 0) { + edgemarkerlist = new int[numberofedges]; + } + } + + // Read the list of edges. + index = 0; + for (i = 0; i < numberofedges; i++) { + // Read edge index and the edge's two endpoints. + stringptr = readnumberline(inputline, infile, inedgefilename); + for (j = 0; j < 2; j++) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Edge %d is missing vertex %d in %s.\n", + i + firstnumber, j + 1, inedgefilename); + terminatetetgen(NULL, 1); + } + corner = (int) strtol(stringptr, &stringptr, 0); + if (corner < firstnumber || corner >= numberofpoints + firstnumber) { + printf("Error: Edge %d has an invalid vertex index.\n", + i + firstnumber); + terminatetetgen(NULL, 1); + } + edgelist[index++] = corner; + } + if (numberofcorners == 10) { + // Skip an extra vertex (generated by a previous -o2 option). + stringptr = findnextnumber(stringptr); + } + // Read the edge marker if it has. + if (markers) { + stringptr = findnextnumber(stringptr); + edgemarkerlist[i] = (int) strtol(stringptr, &stringptr, 0); + } + } + + fclose(infile); + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_face() Load a list of faces (triangles) from a .face file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_face(char* filebasename) +{ + FILE *infile; + char infilename[FILENAMESIZE]; + char inputline[INPUTLINESIZE]; + char *stringptr; + REAL attrib; + int markers, corner; + int index; + int i, j; + + strcpy(infilename, filebasename); + strcat(infilename, ".face"); + + infile = fopen(infilename, "r"); + if (infile != (FILE *) NULL) { + printf("Opening %s.\n", infilename); + } else { + return false; + } + + // Read number of faces, boundary markers. + stringptr = readnumberline(inputline, infile, infilename); + numberoftrifaces = (int) strtol (stringptr, &stringptr, 0); + stringptr = findnextnumber(stringptr); + if (mesh_dim == 2) { + // Skip a number. + stringptr = findnextnumber(stringptr); + } + if (*stringptr == '\0') { + markers = 0; // Default there is no marker per face. + } else { + markers = (int) strtol (stringptr, &stringptr, 0); + } + if (numberoftrifaces > 0) { + trifacelist = new int[numberoftrifaces * 3]; + if (trifacelist == (int *) NULL) { + terminatetetgen(NULL, 1); + } + if (markers) { + trifacemarkerlist = new int[numberoftrifaces]; + if (trifacemarkerlist == (int *) NULL) { + terminatetetgen(NULL, 1); + } + } + } + + // Read the list of faces. + index = 0; + for (i = 0; i < numberoftrifaces; i++) { + // Read face index and the face's three corners. + stringptr = readnumberline(inputline, infile, infilename); + for (j = 0; j < 3; j++) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Face %d is missing vertex %d in %s.\n", + i + firstnumber, j + 1, infilename); + terminatetetgen(NULL, 1); + } + corner = (int) strtol(stringptr, &stringptr, 0); + if (corner < firstnumber || corner >= numberofpoints + firstnumber) { + printf("Error: Face %d has an invalid vertex index.\n", + i + firstnumber); + terminatetetgen(NULL, 1); + } + trifacelist[index++] = corner; + } + if (numberofcorners == 10) { + // Skip 3 extra vertices (generated by a previous -o2 option). + for (j = 0; j < 3; j++) { + stringptr = findnextnumber(stringptr); + } + } + // Read the boundary marker if it exists. + if (markers) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + attrib = 0.0; + } else { + attrib = (REAL) strtod(stringptr, &stringptr); + } + trifacemarkerlist[i] = (int) attrib; + } + } + + fclose(infile); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_tet() Load a list of tetrahedra from a .ele file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_tet(char* filebasename) +{ + FILE *infile; + char infilename[FILENAMESIZE]; + char inputline[INPUTLINESIZE]; + char *stringptr; + REAL attrib; + int corner; + int index, attribindex; + int i, j; + + strcpy(infilename, filebasename); + strcat(infilename, ".ele"); + + infile = fopen(infilename, "r"); + if (infile != (FILE *) NULL) { + printf("Opening %s.\n", infilename); + } else { + return false; + } + + // Read number of elements, number of corners (4 or 10), number of + // element attributes. + stringptr = readnumberline(inputline, infile, infilename); + numberoftetrahedra = (int) strtol (stringptr, &stringptr, 0); + if (numberoftetrahedra <= 0) { + printf("Error: Invalid number of tetrahedra.\n"); + fclose(infile); + return false; + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + numberofcorners = 4; // Default read 4 nodes per element. + } else { + numberofcorners = (int) strtol(stringptr, &stringptr, 0); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + numberoftetrahedronattributes = 0; // Default no attribute. + } else { + numberoftetrahedronattributes = (int) strtol(stringptr, &stringptr, 0); + } + if (numberofcorners != 4 && numberofcorners != 10) { + printf("Error: Wrong number of corners %d (should be 4 or 10).\n", + numberofcorners); + fclose(infile); + return false; + } + + // Allocate memory for tetrahedra. + tetrahedronlist = new int[numberoftetrahedra * numberofcorners]; + if (tetrahedronlist == (int *) NULL) { + terminatetetgen(NULL, 1); + } + // Allocate memory for output tetrahedron attributes if necessary. + if (numberoftetrahedronattributes > 0) { + tetrahedronattributelist = new REAL[numberoftetrahedra * + numberoftetrahedronattributes]; + if (tetrahedronattributelist == (REAL *) NULL) { + terminatetetgen(NULL, 1); + } + } + + // Read the list of tetrahedra. + index = 0; + attribindex = 0; + for (i = 0; i < numberoftetrahedra; i++) { + // Read tetrahedron index and the tetrahedron's corners. + stringptr = readnumberline(inputline, infile, infilename); + for (j = 0; j < numberofcorners; j++) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Tetrahedron %d is missing vertex %d in %s.\n", + i + firstnumber, j + 1, infilename); + terminatetetgen(NULL, 1); + } + corner = (int) strtol(stringptr, &stringptr, 0); + if (corner < firstnumber || corner >= numberofpoints + firstnumber) { + printf("Error: Tetrahedron %d has an invalid vertex index.\n", + i + firstnumber); + terminatetetgen(NULL, 1); + } + tetrahedronlist[index++] = corner; + } + // Read the tetrahedron's attributes. + for (j = 0; j < numberoftetrahedronattributes; j++) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + attrib = 0.0; + } else { + attrib = (REAL) strtod(stringptr, &stringptr); + } + tetrahedronattributelist[attribindex++] = attrib; + } + } + + fclose(infile); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_vol() Load a list of volume constraints from a .vol file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_vol(char* filebasename) +{ + FILE *infile; + char inelefilename[FILENAMESIZE]; + char infilename[FILENAMESIZE]; + char inputline[INPUTLINESIZE]; + char *stringptr; + REAL volume; + int volelements; + int i; + + strcpy(infilename, filebasename); + strcat(infilename, ".vol"); + + infile = fopen(infilename, "r"); + if (infile != (FILE *) NULL) { + printf("Opening %s.\n", infilename); + } else { + return false; + } + + // Read number of tetrahedra. + stringptr = readnumberline(inputline, infile, infilename); + volelements = (int) strtol (stringptr, &stringptr, 0); + if (volelements != numberoftetrahedra) { + strcpy(inelefilename, filebasename); + strcat(infilename, ".ele"); + printf("Warning: %s and %s disagree on number of tetrahedra.\n", + inelefilename, infilename); + fclose(infile); + return false; + } + + tetrahedronvolumelist = new REAL[volelements]; + if (tetrahedronvolumelist == (REAL *) NULL) { + terminatetetgen(NULL, 1); + } + + // Read the list of volume constraints. + for (i = 0; i < volelements; i++) { + stringptr = readnumberline(inputline, infile, infilename); + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + volume = -1.0; // No constraint on this tetrahedron. + } else { + volume = (REAL) strtod(stringptr, &stringptr); + } + tetrahedronvolumelist[i] = volume; + } + + fclose(infile); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_var() Load constraints applied on facets, segments, and nodes // +// from a .var file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_var(char* filebasename) +{ + FILE *infile; + char varfilename[FILENAMESIZE]; + char inputline[INPUTLINESIZE]; + char *stringptr; + int index; + int i; + + // Variant constraints are saved in file "filename.var". + strcpy(varfilename, filebasename); + strcat(varfilename, ".var"); + infile = fopen(varfilename, "r"); + if (infile != (FILE *) NULL) { + printf("Opening %s.\n", varfilename); + } else { + return false; + } + + // Read the facet constraint section. + stringptr = readnumberline(inputline, infile, varfilename); + if (stringptr == NULL) { + // No region list, return. + fclose(infile); + return true; + } + if (*stringptr != '\0') { + numberoffacetconstraints = (int) strtol (stringptr, &stringptr, 0); + } else { + numberoffacetconstraints = 0; + } + if (numberoffacetconstraints > 0) { + // Initialize 'facetconstraintlist'. + facetconstraintlist = new REAL[numberoffacetconstraints * 2]; + index = 0; + for (i = 0; i < numberoffacetconstraints; i++) { + stringptr = readnumberline(inputline, infile, varfilename); + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: facet constraint %d has no facet marker.\n", + firstnumber + i); + break; + } else { + facetconstraintlist[index++] = (REAL) strtod(stringptr, &stringptr); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: facet constraint %d has no maximum area bound.\n", + firstnumber + i); + break; + } else { + facetconstraintlist[index++] = (REAL) strtod(stringptr, &stringptr); + } + } + if (i < numberoffacetconstraints) { + // This must be caused by an error. + fclose(infile); + return false; + } + } + + // Read the segment constraint section. + stringptr = readnumberline(inputline, infile, varfilename); + if (stringptr == NULL) { + // No segment list, return. + fclose(infile); + return true; + } + if (*stringptr != '\0') { + numberofsegmentconstraints = (int) strtol (stringptr, &stringptr, 0); + } else { + numberofsegmentconstraints = 0; + } + if (numberofsegmentconstraints > 0) { + // Initialize 'segmentconstraintlist'. + segmentconstraintlist = new REAL[numberofsegmentconstraints * 3]; + index = 0; + for (i = 0; i < numberofsegmentconstraints; i++) { + stringptr = readnumberline(inputline, infile, varfilename); + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: segment constraint %d has no frist endpoint.\n", + firstnumber + i); + break; + } else { + segmentconstraintlist[index++] = (REAL) strtod(stringptr, &stringptr); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: segment constraint %d has no second endpoint.\n", + firstnumber + i); + break; + } else { + segmentconstraintlist[index++] = (REAL) strtod(stringptr, &stringptr); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: segment constraint %d has no maximum length bound.\n", + firstnumber + i); + break; + } else { + segmentconstraintlist[index++] = (REAL) strtod(stringptr, &stringptr); + } + } + if (i < numberofsegmentconstraints) { + // This must be caused by an error. + fclose(infile); + return false; + } + } + + fclose(infile); + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_mtr() Load a size specification map from a .mtr file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_mtr(char* filebasename) +{ + FILE *infile; + char mtrfilename[FILENAMESIZE]; + char inputline[INPUTLINESIZE]; + char *stringptr; + REAL mtr; + int ptnum; + int mtrindex; + int i, j; + + strcpy(mtrfilename, filebasename); + strcat(mtrfilename, ".mtr"); + infile = fopen(mtrfilename, "r"); + if (infile != (FILE *) NULL) { + printf("Opening %s.\n", mtrfilename); + } else { + return false; + } + + // Read the number of points. + stringptr = readnumberline(inputline, infile, mtrfilename); + ptnum = (int) strtol (stringptr, &stringptr, 0); + if (ptnum != numberofpoints) { + printf(" !! Point numbers are not equal. Ignored.\n"); + fclose(infile); + return false; + } + // Read the number of columns (1, 3, or 6). + stringptr = findnextnumber(stringptr); // Skip number of points. + if (*stringptr != '\0') { + numberofpointmtrs = (int) strtol (stringptr, &stringptr, 0); + } + if ((numberofpointmtrs != 1) && (numberofpointmtrs != 3) && + (numberofpointmtrs != 6)) { + // Column number doesn't match. + numberofpointmtrs = 0; + printf(" !! Metric size does not match (1, 3, or 6). Ignored.\n"); + fclose(infile); + return false; + } + + // Allocate space for pointmtrlist. + pointmtrlist = new REAL[numberofpoints * numberofpointmtrs]; + if (pointmtrlist == (REAL *) NULL) { + terminatetetgen(NULL, 1); + } + mtrindex = 0; + for (i = 0; i < numberofpoints; i++) { + // Read metrics. + stringptr = readnumberline(inputline, infile, mtrfilename); + for (j = 0; j < numberofpointmtrs; j++) { + if (*stringptr == '\0') { + printf("Error: Metric %d is missing value #%d in %s.\n", + i + firstnumber, j + 1, mtrfilename); + terminatetetgen(NULL, 1); + } + mtr = (REAL) strtod(stringptr, &stringptr); + pointmtrlist[mtrindex++] = mtr; + stringptr = findnextnumber(stringptr); + } + } + + fclose(infile); + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_poly() Load a PL complex from a .poly or a .smesh file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_poly(char* filebasename) +{ + FILE *infile; + char inpolyfilename[FILENAMESIZE]; + char insmeshfilename[FILENAMESIZE]; + char inputline[INPUTLINESIZE]; + char *stringptr, *infilename; + int smesh, markers, uvflag, currentmarker; + int index; + int i, j, k; + + // Assembling the actual file names we want to open. + strcpy(inpolyfilename, filebasename); + strcpy(insmeshfilename, filebasename); + strcat(inpolyfilename, ".poly"); + strcat(insmeshfilename, ".smesh"); + + // First assume it is a .poly file. + smesh = 0; + // Try to open a .poly file. + infile = fopen(inpolyfilename, "r"); + if (infile == (FILE *) NULL) { + // .poly doesn't exist! Try to open a .smesh file. + infile = fopen(insmeshfilename, "r"); + if (infile == (FILE *) NULL) { + printf(" Cannot access file %s and %s.\n", + inpolyfilename, insmeshfilename); + return false; + } else { + printf("Opening %s.\n", insmeshfilename); + infilename = insmeshfilename; + } + smesh = 1; + } else { + printf("Opening %s.\n", inpolyfilename); + infilename = inpolyfilename; + } + + // Initialize the default values. + mesh_dim = 3; // Three-dimensional coordinates. + numberofpointattributes = 0; // no point attribute. + markers = 0; // no boundary marker. + uvflag = 0; // no uv parameters (required by a PSC). + + // Read number of points, number of dimensions, number of point + // attributes, and number of boundary markers. + stringptr = readnumberline(inputline, infile, infilename); + numberofpoints = (int) strtol (stringptr, &stringptr, 0); + stringptr = findnextnumber(stringptr); + if (*stringptr != '\0') { + mesh_dim = (int) strtol (stringptr, &stringptr, 0); + } + stringptr = findnextnumber(stringptr); + if (*stringptr != '\0') { + numberofpointattributes = (int) strtol (stringptr, &stringptr, 0); + } + stringptr = findnextnumber(stringptr); + if (*stringptr != '\0') { + markers = (int) strtol (stringptr, &stringptr, 0); + } + if (*stringptr != '\0') { + uvflag = (int) strtol (stringptr, &stringptr, 0); + } + + if (numberofpoints > 0) { + // Load the list of nodes. + if (!load_node_call(infile, markers, uvflag, infilename)) { + fclose(infile); + return false; + } + } else { + // If the .poly or .smesh file claims there are zero points, that + // means the points should be read from a separate .node file. + if (!load_node(filebasename)) { + fclose(infile); + return false; + } + } + + if ((mesh_dim != 3) && (mesh_dim != 2)) { + printf("Input error: TetGen only works for 2D & 3D point sets.\n"); + fclose(infile); + return false; + } + if (numberofpoints < (mesh_dim + 1)) { + printf("Input error: TetGen needs at least %d points.\n", mesh_dim + 1); + fclose(infile); + return false; + } + + facet *f; + polygon *p; + + if (mesh_dim == 3) { + + // Read number of facets and number of boundary markers. + stringptr = readnumberline(inputline, infile, infilename); + if (stringptr == NULL) { + // No facet list, return. + fclose(infile); + return true; + } + numberoffacets = (int) strtol (stringptr, &stringptr, 0); + if (numberoffacets <= 0) { + // No facet list, return. + fclose(infile); + return true; + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + markers = 0; // no boundary marker. + } else { + markers = (int) strtol (stringptr, &stringptr, 0); + } + + // Initialize the 'facetlist', 'facetmarkerlist'. + facetlist = new facet[numberoffacets]; + if (markers == 1) { + facetmarkerlist = new int[numberoffacets]; + } + + // Read data into 'facetlist', 'facetmarkerlist'. + if (smesh == 0) { + // Facets are in .poly file format. + for (i = 1; i <= numberoffacets; i++) { + f = &(facetlist[i - 1]); + init(f); + f->numberofholes = 0; + currentmarker = 0; + // Read number of polygons, number of holes, and a boundary marker. + stringptr = readnumberline(inputline, infile, infilename); + f->numberofpolygons = (int) strtol (stringptr, &stringptr, 0); + stringptr = findnextnumber(stringptr); + if (*stringptr != '\0') { + f->numberofholes = (int) strtol (stringptr, &stringptr, 0); + if (markers == 1) { + stringptr = findnextnumber(stringptr); + if (*stringptr != '\0') { + currentmarker = (int) strtol(stringptr, &stringptr, 0); + } + } + } + // Initialize facetmarker if it needs. + if (markers == 1) { + facetmarkerlist[i - 1] = currentmarker; + } + // Each facet should has at least one polygon. + if (f->numberofpolygons <= 0) { + printf("Error: Wrong number of polygon in %d facet.\n", i); + break; + } + // Initialize the 'f->polygonlist'. + f->polygonlist = new polygon[f->numberofpolygons]; + // Go through all polygons, read in their vertices. + for (j = 1; j <= f->numberofpolygons; j++) { + p = &(f->polygonlist[j - 1]); + init(p); + // Read number of vertices of this polygon. + stringptr = readnumberline(inputline, infile, infilename); + p->numberofvertices = (int) strtol(stringptr, &stringptr, 0); + if (p->numberofvertices < 1) { + printf("Error: Wrong polygon %d in facet %d\n", j, i); + break; + } + // Initialize 'p->vertexlist'. + p->vertexlist = new int[p->numberofvertices]; + // Read all vertices of this polygon. + for (k = 1; k <= p->numberofvertices; k++) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + // Try to load another non-empty line and continue to read the + // rest of vertices. + stringptr = readnumberline(inputline, infile, infilename); + if (*stringptr == '\0') { + printf("Error: Missing %d endpoints of polygon %d in facet %d", + p->numberofvertices - k, j, i); + break; + } + } + p->vertexlist[k - 1] = (int) strtol (stringptr, &stringptr, 0); + } + } + if (j <= f->numberofpolygons) { + // This must be caused by an error. However, there're j - 1 + // polygons have been read. Reset the 'f->numberofpolygon'. + if (j == 1) { + // This is the first polygon. + delete [] f->polygonlist; + } + f->numberofpolygons = j - 1; + // No hole will be read even it exists. + f->numberofholes = 0; + break; + } + // If this facet has hole pints defined, read them. + if (f->numberofholes > 0) { + // Initialize 'f->holelist'. + f->holelist = new REAL[f->numberofholes * 3]; + // Read the holes' coordinates. + index = 0; + for (j = 1; j <= f->numberofholes; j++) { + stringptr = readnumberline(inputline, infile, infilename); + for (k = 1; k <= 3; k++) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Hole %d in facet %d has no coordinates", j, i); + break; + } + f->holelist[index++] = (REAL) strtod (stringptr, &stringptr); + } + if (k <= 3) { + // This must be caused by an error. + break; + } + } + if (j <= f->numberofholes) { + // This must be caused by an error. + break; + } + } + } + if (i <= numberoffacets) { + // This must be caused by an error. + numberoffacets = i - 1; + fclose(infile); + return false; + } + } else { // poly == 0 + // Read the facets from a .smesh file. + for (i = 1; i <= numberoffacets; i++) { + f = &(facetlist[i - 1]); + init(f); + // Initialize 'f->facetlist'. In a .smesh file, each facetlist only + // contains exactly one polygon, no hole. + f->numberofpolygons = 1; + f->polygonlist = new polygon[f->numberofpolygons]; + p = &(f->polygonlist[0]); + init(p); + // Read number of vertices of this polygon. + stringptr = readnumberline(inputline, infile, insmeshfilename); + p->numberofvertices = (int) strtol (stringptr, &stringptr, 0); + if (p->numberofvertices < 1) { + printf("Error: Wrong number of vertex in facet %d\n", i); + break; + } + // Initialize 'p->vertexlist'. + p->vertexlist = new int[p->numberofvertices]; + for (k = 1; k <= p->numberofvertices; k++) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + // Try to load another non-empty line and continue to read the + // rest of vertices. + stringptr = readnumberline(inputline, infile, infilename); + if (*stringptr == '\0') { + printf("Error: Missing %d endpoints in facet %d", + p->numberofvertices - k, i); + break; + } + } + p->vertexlist[k - 1] = (int) strtol (stringptr, &stringptr, 0); + } + if (k <= p->numberofvertices) { + // This must be caused by an error. + break; + } + // Read facet's boundary marker at last. + if (markers == 1) { + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + currentmarker = 0; + } else { + currentmarker = (int) strtol(stringptr, &stringptr, 0); + } + facetmarkerlist[i - 1] = currentmarker; + } + } + if (i <= numberoffacets) { + // This must be caused by an error. + numberoffacets = i - 1; + fclose(infile); + return false; + } + } + + // Read the hole section. + stringptr = readnumberline(inputline, infile, infilename); + if (stringptr == NULL) { + // No hole list, return. + fclose(infile); + return true; + } + if (*stringptr != '\0') { + numberofholes = (int) strtol (stringptr, &stringptr, 0); + } else { + numberofholes = 0; + } + if (numberofholes > 0) { + // Initialize 'holelist'. + holelist = new REAL[numberofholes * 3]; + for (i = 0; i < 3 * numberofholes; i += 3) { + stringptr = readnumberline(inputline, infile, infilename); + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Hole %d has no x coord.\n", firstnumber + (i / 3)); + break; + } else { + holelist[i] = (REAL) strtod(stringptr, &stringptr); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Hole %d has no y coord.\n", firstnumber + (i / 3)); + break; + } else { + holelist[i + 1] = (REAL) strtod(stringptr, &stringptr); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Hole %d has no z coord.\n", firstnumber + (i / 3)); + break; + } else { + holelist[i + 2] = (REAL) strtod(stringptr, &stringptr); + } + } + if (i < 3 * numberofholes) { + // This must be caused by an error. + fclose(infile); + return false; + } + } + + // Read the region section. The 'region' section is optional, if we + // don't reach the end-of-file, try read it in. + stringptr = readnumberline(inputline, infile, NULL); + if (stringptr != (char *) NULL && *stringptr != '\0') { + numberofregions = (int) strtol (stringptr, &stringptr, 0); + } else { + numberofregions = 0; + } + if (numberofregions > 0) { + // Initialize 'regionlist'. + regionlist = new REAL[numberofregions * 5]; + index = 0; + for (i = 0; i < numberofregions; i++) { + stringptr = readnumberline(inputline, infile, infilename); + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Region %d has no x coordinate.\n", firstnumber + i); + break; + } else { + regionlist[index++] = (REAL) strtod(stringptr, &stringptr); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Region %d has no y coordinate.\n", firstnumber + i); + break; + } else { + regionlist[index++] = (REAL) strtod(stringptr, &stringptr); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Region %d has no z coordinate.\n", firstnumber + i); + break; + } else { + regionlist[index++] = (REAL) strtod(stringptr, &stringptr); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + printf("Error: Region %d has no region attrib.\n", firstnumber + i); + break; + } else { + regionlist[index++] = (REAL) strtod(stringptr, &stringptr); + } + stringptr = findnextnumber(stringptr); + if (*stringptr == '\0') { + regionlist[index] = regionlist[index - 1]; + } else { + regionlist[index] = (REAL) strtod(stringptr, &stringptr); + } + index++; + } + if (i < numberofregions) { + // This must be caused by an error. + fclose(infile); + return false; + } + } + + } + + // End of reading poly/smesh file. + fclose(infile); + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_off() Load a polyhedron from a .off file. // +// // +// The .off format is one of file formats of the Geomview, an interactive // +// program for viewing and manipulating geometric objects. More information // +// is available form: http://www.geomview.org. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_off(char* filebasename) +{ + FILE *fp; + tetgenio::facet *f; + tetgenio::polygon *p; + char infilename[FILENAMESIZE]; + char buffer[INPUTLINESIZE]; + char *bufferp; + double *coord; + int nverts = 0, iverts = 0; + int nfaces = 0, ifaces = 0; + int nedges = 0; + int line_count = 0, i; + + // Default, the off file's index is from '0'. We check it by remembering the + // smallest index we found in the file. It should be either 0 or 1. + int smallestidx = 0; + + strncpy(infilename, filebasename, 1024 - 1); + infilename[FILENAMESIZE - 1] = '\0'; + if (infilename[0] == '\0') { + printf("Error: No filename.\n"); + return false; + } + if (strcmp(&infilename[strlen(infilename) - 4], ".off") != 0) { + strcat(infilename, ".off"); + } + + if (!(fp = fopen(infilename, "r"))) { + printf(" Unable to open file %s\n", infilename); + return false; + } + printf("Opening %s.\n", infilename); + + while ((bufferp = readline(buffer, fp, &line_count)) != NULL) { + // Check section + if (nverts == 0) { + // Read header + bufferp = strstr(bufferp, "OFF"); + if (bufferp != NULL) { + // Read mesh counts + bufferp = findnextnumber(bufferp); // Skip field "OFF". + if (*bufferp == '\0') { + // Read a non-empty line. + bufferp = readline(buffer, fp, &line_count); + } + if ((sscanf(bufferp, "%d%d%d", &nverts, &nfaces, &nedges) != 3) + || (nverts == 0)) { + printf("Syntax error reading header on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + // Allocate memory for 'tetgenio' + if (nverts > 0) { + numberofpoints = nverts; + pointlist = new REAL[nverts * 3]; + smallestidx = nverts + 1; // A bigger enough number. + } + if (nfaces > 0) { + numberoffacets = nfaces; + facetlist = new tetgenio::facet[nfaces]; + } + } + } else if (iverts < nverts) { + // Read vertex coordinates + coord = &pointlist[iverts * 3]; + for (i = 0; i < 3; i++) { + if (*bufferp == '\0') { + printf("Syntax error reading vertex coords on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + coord[i] = (REAL) strtod(bufferp, &bufferp); + bufferp = findnextnumber(bufferp); + } + iverts++; + } else if (ifaces < nfaces) { + // Get next face + f = &facetlist[ifaces]; + init(f); + // In .off format, each facet has one polygon, no hole. + f->numberofpolygons = 1; + f->polygonlist = new tetgenio::polygon[1]; + p = &f->polygonlist[0]; + init(p); + // Read the number of vertices, it should be greater than 0. + p->numberofvertices = (int) strtol(bufferp, &bufferp, 0); + if (p->numberofvertices == 0) { + printf("Syntax error reading polygon on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + // Allocate memory for face vertices + p->vertexlist = new int[p->numberofvertices]; + for (i = 0; i < p->numberofvertices; i++) { + bufferp = findnextnumber(bufferp); + if (*bufferp == '\0') { + printf("Syntax error reading polygon on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + p->vertexlist[i] = (int) strtol(bufferp, &bufferp, 0); + // Detect the smallest index. + if (p->vertexlist[i] < smallestidx) { + smallestidx = p->vertexlist[i]; + } + } + ifaces++; + } else { + // Should never get here + printf("Found extra text starting at line %d in file %s\n", line_count, + infilename); + break; + } + } + + // Close file + fclose(fp); + + // Decide the firstnumber of the index. + if (smallestidx == 0) { + firstnumber = 0; + } else if (smallestidx == 1) { + firstnumber = 1; + } else { + printf("A wrong smallest index (%d) was detected in file %s\n", + smallestidx, infilename); + return false; + } + + if (iverts != nverts) { + printf("Expected %d vertices, but read only %d vertices in file %s\n", + nverts, iverts, infilename); + return false; + } + if (ifaces != nfaces) { + printf("Expected %d faces, but read only %d faces in file %s\n", + nfaces, ifaces, infilename); + return false; + } + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_ply() Load a polyhedron from a .ply file. // +// // +// This is a simplified version of reading .ply files, which only reads the // +// set of vertices and the set of faces. Other informations (such as color, // +// material, texture, etc) in .ply file are ignored. Complete routines for // +// reading and writing ,ply files are available from: http://www.cc.gatech. // +// edu/projects/large_models/ply.html. Except the header section, ply file // +// format has exactly the same format for listing vertices and polygons as // +// off file format. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_ply(char* filebasename) +{ + FILE *fp; + tetgenio::facet *f; + tetgenio::polygon *p; + char infilename[FILENAMESIZE]; + char buffer[INPUTLINESIZE]; + char *bufferp, *str; + double *coord; + int endheader = 0, format = 0; + int nverts = 0, iverts = 0; + int nfaces = 0, ifaces = 0; + int line_count = 0, i; + + // Default, the ply file's index is from '0'. We check it by remembering the + // smallest index we found in the file. It should be either 0 or 1. + int smallestidx = 0; + + strncpy(infilename, filebasename, FILENAMESIZE - 1); + infilename[FILENAMESIZE - 1] = '\0'; + if (infilename[0] == '\0') { + printf("Error: No filename.\n"); + return false; + } + if (strcmp(&infilename[strlen(infilename) - 4], ".ply") != 0) { + strcat(infilename, ".ply"); + } + + if (!(fp = fopen(infilename, "r"))) { + printf("Error: Unable to open file %s\n", infilename); + return false; + } + printf("Opening %s.\n", infilename); + + while ((bufferp = readline(buffer, fp, &line_count)) != NULL) { + if (!endheader) { + // Find if it is the keyword "end_header". + str = strstr(bufferp, "end_header"); + // strstr() is case sensitive. + if (!str) str = strstr(bufferp, "End_header"); + if (!str) str = strstr(bufferp, "End_Header"); + if (str) { + // This is the end of the header section. + endheader = 1; + continue; + } + // Parse the number of vertices and the number of faces. + if (nverts == 0 || nfaces == 0) { + // Find if it si the keyword "element". + str = strstr(bufferp, "element"); + if (!str) str = strstr(bufferp, "Element"); + if (str) { + bufferp = findnextfield(str); + if (*bufferp == '\0') { + printf("Syntax error reading element type on line%d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + if (nverts == 0) { + // Find if it is the keyword "vertex". + str = strstr(bufferp, "vertex"); + if (!str) str = strstr(bufferp, "Vertex"); + if (str) { + bufferp = findnextnumber(str); + if (*bufferp == '\0') { + printf("Syntax error reading vertex number on line"); + printf(" %d in file %s\n", line_count, infilename); + fclose(fp); + return false; + } + nverts = (int) strtol(bufferp, &bufferp, 0); + // Allocate memory for 'tetgenio' + if (nverts > 0) { + numberofpoints = nverts; + pointlist = new REAL[nverts * 3]; + smallestidx = nverts + 1; // A big enough index. + } + } + } + if (nfaces == 0) { + // Find if it is the keyword "face". + str = strstr(bufferp, "face"); + if (!str) str = strstr(bufferp, "Face"); + if (str) { + bufferp = findnextnumber(str); + if (*bufferp == '\0') { + printf("Syntax error reading face number on line"); + printf(" %d in file %s\n", line_count, infilename); + fclose(fp); + return false; + } + nfaces = (int) strtol(bufferp, &bufferp, 0); + // Allocate memory for 'tetgenio' + if (nfaces > 0) { + numberoffacets = nfaces; + facetlist = new tetgenio::facet[nfaces]; + } + } + } + } // It is not the string "element". + } + if (format == 0) { + // Find the keyword "format". + str = strstr(bufferp, "format"); + if (!str) str = strstr(bufferp, "Format"); + if (str) { + format = 1; + bufferp = findnextfield(str); + // Find if it is the string "ascii". + str = strstr(bufferp, "ascii"); + if (!str) str = strstr(bufferp, "ASCII"); + if (!str) { + printf("This routine only reads ascii format of ply files.\n"); + printf("Hint: You can convert the binary to ascii format by\n"); + printf(" using the provided ply tools:\n"); + printf(" ply2ascii < %s > ascii_%s\n", infilename, infilename); + fclose(fp); + return false; + } + } + } + } else if (iverts < nverts) { + // Read vertex coordinates + coord = &pointlist[iverts * 3]; + for (i = 0; i < 3; i++) { + if (*bufferp == '\0') { + printf("Syntax error reading vertex coords on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + coord[i] = (REAL) strtod(bufferp, &bufferp); + bufferp = findnextnumber(bufferp); + } + iverts++; + } else if (ifaces < nfaces) { + // Get next face + f = &facetlist[ifaces]; + init(f); + // In .off format, each facet has one polygon, no hole. + f->numberofpolygons = 1; + f->polygonlist = new tetgenio::polygon[1]; + p = &f->polygonlist[0]; + init(p); + // Read the number of vertices, it should be greater than 0. + p->numberofvertices = (int) strtol(bufferp, &bufferp, 0); + if (p->numberofvertices == 0) { + printf("Syntax error reading polygon on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + // Allocate memory for face vertices + p->vertexlist = new int[p->numberofvertices]; + for (i = 0; i < p->numberofvertices; i++) { + bufferp = findnextnumber(bufferp); + if (*bufferp == '\0') { + printf("Syntax error reading polygon on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + p->vertexlist[i] = (int) strtol(bufferp, &bufferp, 0); + if (p->vertexlist[i] < smallestidx) { + smallestidx = p->vertexlist[i]; + } + } + ifaces++; + } else { + // Should never get here + printf("Found extra text starting at line %d in file %s\n", line_count, + infilename); + break; + } + } + + // Close file + fclose(fp); + + // Decide the firstnumber of the index. + if (smallestidx == 0) { + firstnumber = 0; + } else if (smallestidx == 1) { + firstnumber = 1; + } else { + printf("A wrong smallest index (%d) was detected in file %s\n", + smallestidx, infilename); + return false; + } + + if (iverts != nverts) { + printf("Expected %d vertices, but read only %d vertices in file %s\n", + nverts, iverts, infilename); + return false; + } + if (ifaces != nfaces) { + printf("Expected %d faces, but read only %d faces in file %s\n", + nfaces, ifaces, infilename); + return false; + } + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_stl() Load a surface mesh from a .stl file. // +// // +// The .stl or stereolithography format is an ASCII or binary file used in // +// manufacturing. It is a list of the triangular surfaces that describe a // +// computer generated solid model. This is the standard input for most rapid // +// prototyping machines. // +// // +// Comment: A .stl file many contain many duplicated points. They will be // +// unified during the Delaunay tetrahedralization process. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void SwapBytes(char *array, int size, int n) +{ + char *x = new char[size]; + for(int i = 0; i < n; i++) { + char *a = &array[i * size]; + memcpy(x, a, size); + for(int c = 0; c < size; c++) + a[size - 1 - c] = x[c]; + } + delete [] x; +} + +bool tetgenio::load_stl(char* filebasename) +{ + FILE *fp; + tetgenmesh::arraypool *plist; + tetgenio::facet *f; + tetgenio::polygon *p; + char infilename[FILENAMESIZE]; + char buffer[INPUTLINESIZE]; + char *bufferp, *str; + double *coord; + int solid = 0; + int nverts = 0, iverts = 0; + int nfaces = 0; + int line_count = 0, i; + + strncpy(infilename, filebasename, FILENAMESIZE - 1); + infilename[FILENAMESIZE - 1] = '\0'; + if (infilename[0] == '\0') { + printf("Error: No filename.\n"); + return false; + } + if (strcmp(&infilename[strlen(infilename) - 4], ".stl") != 0) { + strcat(infilename, ".stl"); + } + + if (!(fp = fopen(infilename, "rb"))) { + printf("Error: Unable to open file %s\n", infilename); + return false; + } + printf("Opening %s.\n", infilename); + + // "solid", or binary data header + if(!fgets(buffer, sizeof(buffer), fp)){ fclose(fp); return 0; } + bool binary = strncmp(buffer, "solid", 5) && strncmp(buffer, "SOLID", 5); + + // STL file has no number of points available. Use a list to read points. + plist = new tetgenmesh::arraypool(sizeof(double) * 3, 10); + + if(!binary){ + solid = 1; + while ((bufferp = readline(buffer, fp, &line_count)) != NULL) { + // The ASCII .stl file must start with the lower case keyword solid and + // end with endsolid. + if (solid == 0) { + // Read header + bufferp = strstr(bufferp, "solid"); + if (bufferp != NULL) { + solid = 1; + } + } else { + // We're inside the block of the solid. + str = bufferp; + // Is this the end of the solid. + bufferp = strstr(bufferp, "endsolid"); + if (bufferp != NULL) { + solid = 0; + } else { + // Read the XYZ coordinates if it is a vertex. + bufferp = str; + bufferp = strstr(bufferp, "vertex"); + if (bufferp != NULL) { + plist->newindex((void **) &coord); + for (i = 0; i < 3; i++) { + bufferp = findnextnumber(bufferp); + if (*bufferp == '\0') { + printf("Syntax error reading vertex coords on line %d\n", + line_count); + delete plist; + fclose(fp); + return false; + } + coord[i] = (REAL) strtod(bufferp, &bufferp); + } + } + } + } + } + } // if(!binary) + + else { + rewind(fp); + while(!feof(fp)) { + char header[80]; + if(!fread(header, sizeof(char), 80, fp)) break; + unsigned int nfacets = 0; + size_t ret = fread(&nfacets, sizeof(unsigned int), 1, fp); + bool swap = false; + if(nfacets > 100000000){ + //Msg::Info("Swapping bytes from binary file"); + swap = true; + SwapBytes((char*)&nfacets, sizeof(unsigned int), 1); + } + if(ret && nfacets){ + //points.resize(points.size() + 1); + char *data = new char[nfacets * 50 * sizeof(char)]; + ret = fread(data, sizeof(char), nfacets * 50, fp); + if(ret == nfacets * 50){ + for(unsigned int i = 0; i < nfacets; i++) { + float *xyz = (float *)&data[i * 50 * sizeof(char)]; + if(swap) SwapBytes((char*)xyz, sizeof(float), 12); + for(int j = 0; j < 3; j++){ + //SPoint3 p(xyz[3 + 3 * j], xyz[3 + 3 * j + 1], xyz[3 + 3 * j + 2]); + //points.back().push_back(p); + //bbox += p; + plist->newindex((void **) &coord); + coord[0] = xyz[3 + 3 * j]; + coord[1] = xyz[3 + 3 * j + 1]; + coord[2] = xyz[3 + 3 * j + 2]; + } + } + } + delete [] data; + } + } // while (!feof(fp)) + } // binary + + fclose(fp); + + nverts = (int) plist->objects; + // nverts should be an integer times 3 (every 3 vertices denote a face). + if (nverts == 0 || (nverts % 3 != 0)) { + printf("Error: Wrong number of vertices in file %s.\n", infilename); + delete plist; + return false; + } + numberofpoints = nverts; + pointlist = new REAL[nverts * 3]; + for (i = 0; i < nverts; i++) { + coord = (double *) fastlookup(plist, i); + iverts = i * 3; + pointlist[iverts] = (REAL) coord[0]; + pointlist[iverts + 1] = (REAL) coord[1]; + pointlist[iverts + 2] = (REAL) coord[2]; + } + + nfaces = (int) (nverts / 3); + numberoffacets = nfaces; + facetlist = new tetgenio::facet[nfaces]; + + // Default use '1' as the array starting index. + firstnumber = 1; + iverts = firstnumber; + for (i = 0; i < nfaces; i++) { + f = &facetlist[i]; + init(f); + // In .stl format, each facet has one polygon, no hole. + f->numberofpolygons = 1; + f->polygonlist = new tetgenio::polygon[1]; + p = &f->polygonlist[0]; + init(p); + // Each polygon has three vertices. + p->numberofvertices = 3; + p->vertexlist = new int[p->numberofvertices]; + p->vertexlist[0] = iverts; + p->vertexlist[1] = iverts + 1; + p->vertexlist[2] = iverts + 2; + iverts += 3; + } + + delete plist; + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_medit() Load a surface mesh from a .mesh file. // +// // +// The .mesh format is the file format of Medit, a user-friendly interactive // +// mesh viewer program. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_medit(char* filebasename, int istetmesh) +{ + FILE *fp; + tetgenio::facet *tmpflist, *f; + tetgenio::polygon *p; + char infilename[FILENAMESIZE]; + char buffer[INPUTLINESIZE]; + char *bufferp, *str; + double *coord; + int *tmpfmlist; + int dimension = 0; + int nverts = 0; + int nfaces = 0; + int ntets = 0; + int line_count = 0; + int corners = 0; // 3 (triangle) or 4 (quad). + int *plist; + int i, j; + + int smallestidx = 0; + + strncpy(infilename, filebasename, FILENAMESIZE - 1); + infilename[FILENAMESIZE - 1] = '\0'; + if (infilename[0] == '\0') { + printf("Error: No filename.\n"); + return false; + } + if (strcmp(&infilename[strlen(infilename) - 5], ".mesh") != 0) { + strcat(infilename, ".mesh"); + } + + if (!(fp = fopen(infilename, "r"))) { + printf("Error: Unable to open file %s\n", infilename); + return false; + } + printf("Opening %s.\n", infilename); + + while ((bufferp = readline(buffer, fp, &line_count)) != NULL) { + if (*bufferp == '#') continue; // A comment line is skipped. + if (dimension == 0) { + // Find if it is the keyword "Dimension". + str = strstr(bufferp, "Dimension"); + if (!str) str = strstr(bufferp, "dimension"); + if (!str) str = strstr(bufferp, "DIMENSION"); + if (str) { + // Read the dimensions + bufferp = findnextnumber(str); // Skip field "Dimension". + if (*bufferp == '\0') { + // Read a non-empty line. + bufferp = readline(buffer, fp, &line_count); + } + dimension = (int) strtol(bufferp, &bufferp, 0); + if (dimension != 2 && dimension != 3) { + printf("Unknown dimension in file on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + mesh_dim = dimension; + } + } + if (nverts == 0) { + // Find if it is the keyword "Vertices". + str = strstr(bufferp, "Vertices"); + if (!str) str = strstr(bufferp, "vertices"); + if (!str) str = strstr(bufferp, "VERTICES"); + if (str) { + // Read the number of vertices. + bufferp = findnextnumber(str); // Skip field "Vertices". + if (*bufferp == '\0') { + // Read a non-empty line. + bufferp = readline(buffer, fp, &line_count); + } + nverts = (int) strtol(bufferp, &bufferp, 0); + // Initialize the smallest index. + smallestidx = nverts + 1; + // Allocate memory for 'tetgenio' + if (nverts > 0) { + numberofpoints = nverts; + pointlist = new REAL[nverts * 3]; + } + // Read the follwoing node list. + for (i = 0; i < nverts; i++) { + bufferp = readline(buffer, fp, &line_count); + if (bufferp == NULL) { + printf("Unexpected end of file on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + // Read vertex coordinates + coord = &pointlist[i * 3]; + for (j = 0; j < 3; j++) { + if (*bufferp == '\0') { + printf("Syntax error reading vertex coords on line"); + printf(" %d in file %s\n", line_count, infilename); + fclose(fp); + return false; + } + if ((j < 2) || (dimension == 3)) { + coord[j] = (REAL) strtod(bufferp, &bufferp); + } else { + coord[j] = 0.0; + } + bufferp = findnextnumber(bufferp); + } + } + continue; + } + } + if (ntets == 0) { + // Find if it is the keyword "Tetrahedra" + corners = 0; + str = strstr(bufferp, "Tetrahedra"); + if (!str) str = strstr(bufferp, "tetrahedra"); + if (!str) str = strstr(bufferp, "TETRAHEDRA"); + if (str) { + corners = 4; + } + if (corners == 4) { + // Read the number of tetrahedra + bufferp = findnextnumber(str); // Skip field "Tetrahedra". + if (*bufferp == '\0') { + // Read a non-empty line. + bufferp = readline(buffer, fp, &line_count); + } + ntets = strtol(bufferp, &bufferp, 0); + if (ntets > 0) { + // It is a tetrahedral mesh. + numberoftetrahedra = ntets; + numberofcorners = 4; + numberoftetrahedronattributes = 1; + tetrahedronlist = new int[ntets * 4]; + tetrahedronattributelist = new REAL[ntets]; + } + } // if (corners == 4) + // Read the list of tetrahedra. + for (i = 0; i < numberoftetrahedra; i++) { + plist = &(tetrahedronlist[i * 4]); + bufferp = readline(buffer, fp, &line_count); + if (bufferp == NULL) { + printf("Unexpected end of file on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + // Read the vertices of the tet. + for (j = 0; j < corners; j++) { + if (*bufferp == '\0') { + printf("Syntax error reading face on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + plist[j] = (int) strtol(bufferp, &bufferp, 0); + // Remember the smallest index. + if (plist[j] < smallestidx) smallestidx = plist[j]; + bufferp = findnextnumber(bufferp); + } + // Read the attribute of the tet if it exists. + tetrahedronattributelist[i] = 0; + if (*bufferp != '\0') { + tetrahedronattributelist[i] = (REAL) strtol(bufferp, &bufferp, 0); + } + } // i + } // Tetrahedra + if (nfaces == 0) { + // Find if it is the keyword "Triangles" or "Quadrilaterals". + corners = 0; + str = strstr(bufferp, "Triangles"); + if (!str) str = strstr(bufferp, "triangles"); + if (!str) str = strstr(bufferp, "TRIANGLES"); + if (str) { + corners = 3; + } else { + str = strstr(bufferp, "Quadrilaterals"); + if (!str) str = strstr(bufferp, "quadrilaterals"); + if (!str) str = strstr(bufferp, "QUADRILATERALS"); + if (str) { + corners = 4; + } + } + if (corners == 3 || corners == 4) { + // Read the number of triangles (or quadrilaterals). + bufferp = findnextnumber(str); // Skip field "Triangles". + if (*bufferp == '\0') { + // Read a non-empty line. + bufferp = readline(buffer, fp, &line_count); + } + nfaces = strtol(bufferp, &bufferp, 0); + // Allocate memory for 'tetgenio' + if (nfaces > 0) { + if (!istetmesh) { + // It is a PLC surface mesh. + if (numberoffacets > 0) { + // facetlist has already been allocated. Enlarge arrays. + // This happens when the surface mesh contains mixed cells. + tmpflist = new tetgenio::facet[numberoffacets + nfaces]; + tmpfmlist = new int[numberoffacets + nfaces]; + // Copy the data of old arrays into new arrays. + for (i = 0; i < numberoffacets; i++) { + f = &(tmpflist[i]); + tetgenio::init(f); + *f = facetlist[i]; + tmpfmlist[i] = facetmarkerlist[i]; + } + // Release old arrays. + delete [] facetlist; + delete [] facetmarkerlist; + // Remember the new arrays. + facetlist = tmpflist; + facetmarkerlist = tmpfmlist; + } else { + // This is the first time to allocate facetlist. + facetlist = new tetgenio::facet[nfaces]; + facetmarkerlist = new int[nfaces]; + } + } else { + if (corners == 3) { + // It is a surface mesh of a tetrahedral mesh. + numberoftrifaces = nfaces; + trifacelist = new int[nfaces * 3]; + trifacemarkerlist = new int[nfaces]; + } + } + } // if (nfaces > 0) + // Read the following list of faces. + if (!istetmesh) { + for (i = numberoffacets; i < numberoffacets + nfaces; i++) { + bufferp = readline(buffer, fp, &line_count); + if (bufferp == NULL) { + printf("Unexpected end of file on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + f = &facetlist[i]; + tetgenio::init(f); + // In .mesh format, each facet has one polygon, no hole. + f->numberofpolygons = 1; + f->polygonlist = new tetgenio::polygon[1]; + p = &f->polygonlist[0]; + tetgenio::init(p); + p->numberofvertices = corners; + // Allocate memory for face vertices + p->vertexlist = new int[p->numberofvertices]; + // Read the vertices of the face. + for (j = 0; j < corners; j++) { + if (*bufferp == '\0') { + printf("Syntax error reading face on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + p->vertexlist[j] = (int) strtol(bufferp, &bufferp, 0); + // Remember the smallest index. + if (p->vertexlist[j] < smallestidx) { + smallestidx = p->vertexlist[j]; + } + bufferp = findnextnumber(bufferp); + } + // Read the marker of the face if it exists. + facetmarkerlist[i] = 0; + if (*bufferp != '\0') { + facetmarkerlist[i] = (int) strtol(bufferp, &bufferp, 0); + } + } + // Have read in a list of triangles/quads. + numberoffacets += nfaces; + nfaces = 0; + } else { + // It is a surface mesh of a tetrahedral mesh. + if (corners == 3) { + for (i = 0; i < numberoftrifaces; i++) { + plist = &(trifacelist[i * 3]); + bufferp = readline(buffer, fp, &line_count); + if (bufferp == NULL) { + printf("Unexpected end of file on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + // Read the vertices of the face. + for (j = 0; j < corners; j++) { + if (*bufferp == '\0') { + printf("Syntax error reading face on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + plist[j] = (int) strtol(bufferp, &bufferp, 0); + // Remember the smallest index. + if (plist[j] < smallestidx) { + smallestidx = plist[j]; + } + bufferp = findnextnumber(bufferp); + } + // Read the marker of the face if it exists. + trifacemarkerlist[i] = 0; + if (*bufferp != '\0') { + trifacemarkerlist[i] = (int) strtol(bufferp, &bufferp, 0); + } + } // i + } // if (corners == 3) + } // if (b->refine) + } // if (corners == 3 || corners == 4) + } + } + + // Close file + fclose(fp); + + // Decide the firstnumber of the index. + if (smallestidx == 0) { + firstnumber = 0; + } else if (smallestidx == 1) { + firstnumber = 1; + } else { + printf("A wrong smallest index (%d) was detected in file %s\n", + smallestidx, infilename); + return false; + } + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_vtk() Load VTK surface mesh from file (.vtk ascii or binary). // +// // +// This function is contributed by: Bryn Lloyd, Computer Vision Laboratory, // +// ETH, Zuerich. May 7, 2007. // +// // +/////////////////////////////////////////////////////////////////////////////// + +// Two inline functions used in read/write VTK files. + +void swapBytes(unsigned char* var, int size) +{ + int i = 0; + int j = size - 1; + char c; + + while (i < j) { + c = var[i]; var[i] = var[j]; var[j] = c; + i++, j--; + } +} + +bool testIsBigEndian() +{ + short word = 0x4321; + if((*(char *)& word) != 0x21) + return true; + else + return false; +} + +bool tetgenio::load_vtk(char* filebasename) +{ + FILE *fp; + tetgenio::facet *f; + tetgenio::polygon *p; + char infilename[FILENAMESIZE]; + char line[INPUTLINESIZE]; + char mode[128], id[256], fmt[64]; + char *bufferp; + double *coord; + float _x, _y, _z; + int nverts = 0; + int nfaces = 0; + int line_count = 0; + int dummy; + int id1, id2, id3; + int nn = -1; + int nn_old = -1; + int i, j; + bool ImALittleEndian = !testIsBigEndian(); + + int smallestidx = 0; + + strncpy(infilename, filebasename, FILENAMESIZE - 1); + infilename[FILENAMESIZE - 1] = '\0'; + if (infilename[0] == '\0') { + printf("Error: No filename.\n"); + return false; + } + if (strcmp(&infilename[strlen(infilename) - 4], ".vtk") != 0) { + strcat(infilename, ".vtk"); + } + if (!(fp = fopen(infilename, "r"))) { + printf("Error: Unable to open file %s\n", infilename); + return false; + } + printf("Opening %s.\n", infilename); + + // Default uses the index starts from '0'. + firstnumber = 0; + strcpy(mode, "BINARY"); + + while((bufferp = readline(line, fp, &line_count)) != NULL) { + if(strlen(line) == 0) continue; + //swallow lines beginning with a comment sign or white space + if(line[0] == '#' || line[0]=='\n' || line[0] == 10 || line[0] == 13 || + line[0] == 32) continue; + + sscanf(line, "%s", id); + if(!strcmp(id, "ASCII")) { + strcpy(mode, "ASCII"); + } + + if(!strcmp(id, "POINTS")) { + sscanf(line, "%s %d %s", id, &nverts, fmt); + if (nverts > 0) { + numberofpoints = nverts; + pointlist = new REAL[nverts * 3]; + smallestidx = nverts + 1; + } + + if(!strcmp(mode, "BINARY")) { + for(i = 0; i < nverts; i++) { + coord = &pointlist[i * 3]; + if(!strcmp(fmt, "double")) { + fread((char*)(&(coord[0])), sizeof(double), 1, fp); + fread((char*)(&(coord[1])), sizeof(double), 1, fp); + fread((char*)(&(coord[2])), sizeof(double), 1, fp); + if(ImALittleEndian){ + swapBytes((unsigned char *) &(coord[0]), sizeof(coord[0])); + swapBytes((unsigned char *) &(coord[1]), sizeof(coord[1])); + swapBytes((unsigned char *) &(coord[2]), sizeof(coord[2])); + } + } else if(!strcmp(fmt, "float")) { + fread((char*)(&_x), sizeof(float), 1, fp); + fread((char*)(&_y), sizeof(float), 1, fp); + fread((char*)(&_z), sizeof(float), 1, fp); + if(ImALittleEndian){ + swapBytes((unsigned char *) &_x, sizeof(_x)); + swapBytes((unsigned char *) &_y, sizeof(_y)); + swapBytes((unsigned char *) &_z, sizeof(_z)); + } + coord[0] = double(_x); + coord[1] = double(_y); + coord[2] = double(_z); + } else { + printf("Error: Only float or double formats are supported!\n"); + return false; + } + } + } else if(!strcmp(mode, "ASCII")) { + for(i = 0; i < nverts; i++){ + bufferp = readline(line, fp, &line_count); + if (bufferp == NULL) { + printf("Unexpected end of file on line %d in file %s\n", + line_count, infilename); + fclose(fp); + return false; + } + // Read vertex coordinates + coord = &pointlist[i * 3]; + for (j = 0; j < 3; j++) { + if (*bufferp == '\0') { + printf("Syntax error reading vertex coords on line"); + printf(" %d in file %s\n", line_count, infilename); + fclose(fp); + return false; + } + coord[j] = (REAL) strtod(bufferp, &bufferp); + bufferp = findnextnumber(bufferp); + } + } + } + continue; + } + + if(!strcmp(id, "POLYGONS")) { + sscanf(line, "%s %d %d", id, &nfaces, &dummy); + if (nfaces > 0) { + numberoffacets = nfaces; + facetlist = new tetgenio::facet[nfaces]; + } + + if(!strcmp(mode, "BINARY")) { + for(i = 0; i < nfaces; i++){ + fread((char*)(&nn), sizeof(int), 1, fp); + if(ImALittleEndian){ + swapBytes((unsigned char *) &nn, sizeof(nn)); + } + if (i == 0) + nn_old = nn; + if (nn != nn_old) { + printf("Error: No mixed cells are allowed.\n"); + return false; + } + + if(nn == 3){ + fread((char*)(&id1), sizeof(int), 1, fp); + fread((char*)(&id2), sizeof(int), 1, fp); + fread((char*)(&id3), sizeof(int), 1, fp); + if(ImALittleEndian){ + swapBytes((unsigned char *) &id1, sizeof(id1)); + swapBytes((unsigned char *) &id2, sizeof(id2)); + swapBytes((unsigned char *) &id3, sizeof(id3)); + } + f = &facetlist[i]; + init(f); + // In .off format, each facet has one polygon, no hole. + f->numberofpolygons = 1; + f->polygonlist = new tetgenio::polygon[1]; + p = &f->polygonlist[0]; + init(p); + // Set number of vertices + p->numberofvertices = 3; + // Allocate memory for face vertices + p->vertexlist = new int[p->numberofvertices]; + p->vertexlist[0] = id1; + p->vertexlist[1] = id2; + p->vertexlist[2] = id3; + // Detect the smallest index. + for (j = 0; j < 3; j++) { + if (p->vertexlist[j] < smallestidx) { + smallestidx = p->vertexlist[j]; + } + } + } else { + printf("Error: Only triangles are supported\n"); + return false; + } + } + } else if(!strcmp(mode, "ASCII")) { + for(i = 0; i < nfaces; i++) { + bufferp = readline(line, fp, &line_count); + nn = (int) strtol(bufferp, &bufferp, 0); + if (i == 0) + nn_old = nn; + if (nn != nn_old) { + printf("Error: No mixed cells are allowed.\n"); + return false; + } + + if (nn == 3) { + bufferp = findnextnumber(bufferp); // Skip the first field. + id1 = (int) strtol(bufferp, &bufferp, 0); + bufferp = findnextnumber(bufferp); + id2 = (int) strtol(bufferp, &bufferp, 0); + bufferp = findnextnumber(bufferp); + id3 = (int) strtol(bufferp, &bufferp, 0); + f = &facetlist[i]; + init(f); + // In .off format, each facet has one polygon, no hole. + f->numberofpolygons = 1; + f->polygonlist = new tetgenio::polygon[1]; + p = &f->polygonlist[0]; + init(p); + // Set number of vertices + p->numberofvertices = 3; + // Allocate memory for face vertices + p->vertexlist = new int[p->numberofvertices]; + p->vertexlist[0] = id1; + p->vertexlist[1] = id2; + p->vertexlist[2] = id3; + // Detect the smallest index. + for (j = 0; j < 3; j++) { + if (p->vertexlist[j] < smallestidx) { + smallestidx = p->vertexlist[j]; + } + } + } else { + printf("Error: Only triangles are supported.\n"); + return false; + } + } + } + + fclose(fp); + + // Decide the firstnumber of the index. + if (smallestidx == 0) { + firstnumber = 0; + } else if (smallestidx == 1) { + firstnumber = 1; + } else { + printf("A wrong smallest index (%d) was detected in file %s\n", + smallestidx, infilename); + return false; + } + + return true; + } + + if(!strcmp(id,"LINES") || !strcmp(id,"CELLS")){ + printf("Warning: load_vtk(): cannot read formats LINES, CELLS.\n"); + } + } // while () + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_plc() Load a piecewise linear complex from file(s). // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_plc(char* filebasename, int object) +{ + bool success; + + if (object == (int) tetgenbehavior::NODES) { + success = load_node(filebasename); + } else if (object == (int) tetgenbehavior::POLY) { + success = load_poly(filebasename); + } else if (object == (int) tetgenbehavior::OFF) { + success = load_off(filebasename); + } else if (object == (int) tetgenbehavior::PLY) { + success = load_ply(filebasename); + } else if (object == (int) tetgenbehavior::STL) { + success = load_stl(filebasename); + } else if (object == (int) tetgenbehavior::MEDIT) { + success = load_medit(filebasename, 0); + } else if (object == (int) tetgenbehavior::VTK) { + success = load_vtk(filebasename); + } else { + success = load_poly(filebasename); + } + + if (success) { + // Try to load the following files (.edge, .var, .mtr). + load_edge(filebasename); + load_var(filebasename); + load_mtr(filebasename); + } + + return success; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// load_mesh() Load a tetrahedral mesh from file(s). // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenio::load_tetmesh(char* filebasename, int object) +{ + bool success; + + if (object == (int) tetgenbehavior::MEDIT) { + success = load_medit(filebasename, 1); + } else if (object == (int) tetgenbehavior::NEU_MESH) { + //success = load_neumesh(filebasename, 1); + } else { + success = load_node(filebasename); + if (success) { + success = load_tet(filebasename); + } + if (success) { + // Try to load the following files (.face, .edge, .vol). + load_face(filebasename); + load_edge(filebasename); + load_vol(filebasename); + } + } + + //if (success) { + // Try to load the following files (.var, .mtr). + load_var(filebasename); + load_mtr(filebasename); + //} + + return success; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// save_nodes() Save points to a .node file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenio::save_nodes(char* filebasename) +{ + FILE *fout; + char outnodefilename[FILENAMESIZE]; + char outmtrfilename[FILENAMESIZE]; + int i, j; + + sprintf(outnodefilename, "%s.node", filebasename); + printf("Saving nodes to %s\n", outnodefilename); + fout = fopen(outnodefilename, "w"); + fprintf(fout, "%d %d %d %d\n", numberofpoints, mesh_dim, + numberofpointattributes, pointmarkerlist != NULL ? 1 : 0); + for (i = 0; i < numberofpoints; i++) { + if (mesh_dim == 2) { + fprintf(fout, "%d %.16g %.16g", i + firstnumber, pointlist[i * 3], + pointlist[i * 3 + 1]); + } else { + fprintf(fout, "%d %.16g %.16g %.16g", i + firstnumber, + pointlist[i * 3], pointlist[i * 3 + 1], pointlist[i * 3 + 2]); + } + for (j = 0; j < numberofpointattributes; j++) { + fprintf(fout, " %.16g", + pointattributelist[i * numberofpointattributes + j]); + } + if (pointmarkerlist != NULL) { + fprintf(fout, " %d", pointmarkerlist[i]); + } + fprintf(fout, "\n"); + } + fclose(fout); + + // If the point metrics exist, output them to a .mtr file. + if ((numberofpointmtrs > 0) && (pointmtrlist != (REAL *) NULL)) { + sprintf(outmtrfilename, "%s.mtr", filebasename); + printf("Saving metrics to %s\n", outmtrfilename); + fout = fopen(outmtrfilename, "w"); + fprintf(fout, "%d %d\n", numberofpoints, numberofpointmtrs); + for (i = 0; i < numberofpoints; i++) { + for (j = 0; j < numberofpointmtrs; j++) { + fprintf(fout, "%.16g ", pointmtrlist[i * numberofpointmtrs + j]); + } + fprintf(fout, "\n"); + } + fclose(fout); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// save_elements() Save elements to a .ele file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenio::save_elements(char* filebasename) +{ + FILE *fout; + char outelefilename[FILENAMESIZE]; + int i, j; + + sprintf(outelefilename, "%s.ele", filebasename); + printf("Saving elements to %s\n", outelefilename); + fout = fopen(outelefilename, "w"); + if (mesh_dim == 3) { + fprintf(fout, "%d %d %d\n", numberoftetrahedra, numberofcorners, + numberoftetrahedronattributes); + for (i = 0; i < numberoftetrahedra; i++) { + fprintf(fout, "%d", i + firstnumber); + for (j = 0; j < numberofcorners; j++) { + fprintf(fout, " %5d", tetrahedronlist[i * numberofcorners + j]); + } + for (j = 0; j < numberoftetrahedronattributes; j++) { + fprintf(fout, " %g", + tetrahedronattributelist[i * numberoftetrahedronattributes + j]); + } + fprintf(fout, "\n"); + } + } else { + // Save a two-dimensional mesh. + fprintf(fout, "%d %d %d\n",numberoftrifaces,3,trifacemarkerlist ? 1 : 0); + for (i = 0; i < numberoftrifaces; i++) { + fprintf(fout, "%d", i + firstnumber); + for (j = 0; j < 3; j++) { + fprintf(fout, " %5d", trifacelist[i * 3 + j]); + } + if (trifacemarkerlist != NULL) { + fprintf(fout, " %d", trifacemarkerlist[i]); + } + fprintf(fout, "\n"); + } + } + + fclose(fout); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// save_faces() Save faces to a .face file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenio::save_faces(char* filebasename) +{ + FILE *fout; + char outfacefilename[FILENAMESIZE]; + int i; + + sprintf(outfacefilename, "%s.face", filebasename); + printf("Saving faces to %s\n", outfacefilename); + fout = fopen(outfacefilename, "w"); + fprintf(fout, "%d %d\n", numberoftrifaces, + trifacemarkerlist != NULL ? 1 : 0); + for (i = 0; i < numberoftrifaces; i++) { + fprintf(fout, "%d %5d %5d %5d", i + firstnumber, trifacelist[i * 3], + trifacelist[i * 3 + 1], trifacelist[i * 3 + 2]); + if (trifacemarkerlist != NULL) { + fprintf(fout, " %d", trifacemarkerlist[i]); + } + fprintf(fout, "\n"); + } + + fclose(fout); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// save_edges() Save egdes to a .edge file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenio::save_edges(char* filebasename) +{ + FILE *fout; + char outedgefilename[FILENAMESIZE]; + int i; + + sprintf(outedgefilename, "%s.edge", filebasename); + printf("Saving edges to %s\n", outedgefilename); + fout = fopen(outedgefilename, "w"); + fprintf(fout, "%d %d\n", numberofedges, edgemarkerlist != NULL ? 1 : 0); + for (i = 0; i < numberofedges; i++) { + fprintf(fout, "%d %4d %4d", i + firstnumber, edgelist[i * 2], + edgelist[i * 2 + 1]); + if (edgemarkerlist != NULL) { + fprintf(fout, " %d", edgemarkerlist[i]); + } + fprintf(fout, "\n"); + } + + fclose(fout); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// save_neighbors() Save egdes to a .neigh file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenio::save_neighbors(char* filebasename) +{ + FILE *fout; + char outneighborfilename[FILENAMESIZE]; + int i; + + sprintf(outneighborfilename, "%s.neigh", filebasename); + printf("Saving neighbors to %s\n", outneighborfilename); + fout = fopen(outneighborfilename, "w"); + fprintf(fout, "%d %d\n", numberoftetrahedra, mesh_dim + 1); + for (i = 0; i < numberoftetrahedra; i++) { + if (mesh_dim == 2) { + fprintf(fout, "%d %5d %5d %5d", i + firstnumber, neighborlist[i * 3], + neighborlist[i * 3 + 1], neighborlist[i * 3 + 2]); + } else { + fprintf(fout, "%d %5d %5d %5d %5d", i + firstnumber, + neighborlist[i * 4], neighborlist[i * 4 + 1], + neighborlist[i * 4 + 2], neighborlist[i * 4 + 3]); + } + fprintf(fout, "\n"); + } + + fclose(fout); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// save_poly() Save segments or facets to a .poly file. // +// // +// It only save the facets, holes and regions. No .node file is saved. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenio::save_poly(char* filebasename) +{ + FILE *fout; + facet *f; + polygon *p; + char outpolyfilename[FILENAMESIZE]; + int i, j, k; + + sprintf(outpolyfilename, "%s.poly", filebasename); + printf("Saving poly to %s\n", outpolyfilename); + fout = fopen(outpolyfilename, "w"); + + // The zero indicates that the vertices are in a separate .node file. + // Followed by number of dimensions, number of vertex attributes, + // and number of boundary markers (zero or one). + fprintf(fout, "%d %d %d %d\n", 0, mesh_dim, numberofpointattributes, + pointmarkerlist != NULL ? 1 : 0); + + // Save segments or facets. + if (mesh_dim == 2) { + // Number of segments, number of boundary markers (zero or one). + fprintf(fout, "%d %d\n", numberofedges, edgemarkerlist != NULL ? 1 : 0); + for (i = 0; i < numberofedges; i++) { + fprintf(fout, "%d %4d %4d", i + firstnumber, edgelist[i * 2], + edgelist[i * 2 + 1]); + if (edgemarkerlist != NULL) { + fprintf(fout, " %d", edgemarkerlist[i]); + } + fprintf(fout, "\n"); + } + } else { + // Number of facets, number of boundary markers (zero or one). + fprintf(fout, "%d %d\n", numberoffacets, facetmarkerlist != NULL ? 1 : 0); + for (i = 0; i < numberoffacets; i++) { + f = &(facetlist[i]); + fprintf(fout, "%d %d %d # %d\n", f->numberofpolygons,f->numberofholes, + facetmarkerlist != NULL ? facetmarkerlist[i] : 0, i + firstnumber); + // Output polygons of this facet. + for (j = 0; j < f->numberofpolygons; j++) { + p = &(f->polygonlist[j]); + fprintf(fout, "%d ", p->numberofvertices); + for (k = 0; k < p->numberofvertices; k++) { + if (((k + 1) % 10) == 0) { + fprintf(fout, "\n "); + } + fprintf(fout, " %d", p->vertexlist[k]); + } + fprintf(fout, "\n"); + } + // Output holes of this facet. + for (j = 0; j < f->numberofholes; j++) { + fprintf(fout, "%d %.12g %.12g %.12g\n", j + firstnumber, + f->holelist[j * 3], f->holelist[j * 3 + 1], f->holelist[j * 3 + 2]); + } + } + } + + // Save holes. + fprintf(fout, "%d\n", numberofholes); + for (i = 0; i < numberofholes; i++) { + // Output x, y coordinates. + fprintf(fout, "%d %.12g %.12g", i + firstnumber, holelist[i * mesh_dim], + holelist[i * mesh_dim + 1]); + if (mesh_dim == 3) { + // Output z coordinate. + fprintf(fout, " %.12g", holelist[i * mesh_dim + 2]); + } + fprintf(fout, "\n"); + } + + // Save regions. + fprintf(fout, "%d\n", numberofregions); + for (i = 0; i < numberofregions; i++) { + if (mesh_dim == 2) { + // Output the index, x, y coordinates, attribute (region number) + // and maximum area constraint (maybe -1). + fprintf(fout, "%d %.12g %.12g %.12g %.12g\n", i + firstnumber, + regionlist[i * 4], regionlist[i * 4 + 1], + regionlist[i * 4 + 2], regionlist[i * 4 + 3]); + } else { + // Output the index, x, y, z coordinates, attribute (region number) + // and maximum volume constraint (maybe -1). + fprintf(fout, "%d %.12g %.12g %.12g %.12g %.12g\n", i + firstnumber, + regionlist[i * 5], regionlist[i * 5 + 1], + regionlist[i * 5 + 2], regionlist[i * 5 + 3], + regionlist[i * 5 + 4]); + } + } + + fclose(fout); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// save_faces2smesh() Save triangular faces to a .smesh file. // +// // +// It only save the facets. No holes and regions. No .node file. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenio::save_faces2smesh(char* filebasename) +{ + FILE *fout; + char outsmeshfilename[FILENAMESIZE]; + int i, j; + + sprintf(outsmeshfilename, "%s.smesh", filebasename); + printf("Saving faces to %s\n", outsmeshfilename); + fout = fopen(outsmeshfilename, "w"); + + // The zero indicates that the vertices are in a separate .node file. + // Followed by number of dimensions, number of vertex attributes, + // and number of boundary markers (zero or one). + fprintf(fout, "%d %d %d %d\n", 0, mesh_dim, numberofpointattributes, + pointmarkerlist != NULL ? 1 : 0); + + // Number of facets, number of boundary markers (zero or one). + fprintf(fout, "%d %d\n", numberoftrifaces, + trifacemarkerlist != NULL ? 1 : 0); + + // Output triangular facets. + for (i = 0; i < numberoftrifaces; i++) { + j = i * 3; + fprintf(fout, "3 %d %d %d", trifacelist[j], trifacelist[j + 1], + trifacelist[j + 2]); + if (trifacemarkerlist != NULL) { + fprintf(fout, " %d", trifacemarkerlist[i]); + } + fprintf(fout, "\n"); + } + + // No holes and regions. + fprintf(fout, "0\n"); + fprintf(fout, "0\n"); + + fclose(fout); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// readline() Read a nonempty line from a file. // +// // +// A line is considered "nonempty" if it contains something more than white // +// spaces. If a line is considered empty, it will be dropped and the next // +// line will be read, this process ends until reaching the end-of-file or a // +// non-empty line. Return NULL if it is the end-of-file, otherwise, return // +// a pointer to the first non-whitespace character of the line. // +// // +/////////////////////////////////////////////////////////////////////////////// + +char* tetgenio::readline(char *string, FILE *infile, int *linenumber) +{ + char *result; + + // Search for a non-empty line. + do { + result = fgets(string, INPUTLINESIZE - 1, infile); + if (linenumber) (*linenumber)++; + if (result == (char *) NULL) { + return (char *) NULL; + } + // Skip white spaces. + while ((*result == ' ') || (*result == '\t')) result++; + // If it's end of line, read another line and try again. + } while ((*result == '\0') || (*result == '\r') || (*result == '\n')); + return result; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// findnextfield() Find the next field of a string. // +// // +// Jumps past the current field by searching for whitespace or a comma, then // +// jumps past the whitespace or the comma to find the next field. // +// // +/////////////////////////////////////////////////////////////////////////////// + +char* tetgenio::findnextfield(char *string) +{ + char *result; + + result = string; + // Skip the current field. Stop upon reaching whitespace or a comma. + while ((*result != '\0') && (*result != ' ') && (*result != '\t') && + (*result != ',') && (*result != ';')) { + result++; + } + // Now skip the whitespace or the comma, stop at anything else that looks + // like a character, or the end of a line. + while ((*result == ' ') || (*result == '\t') || (*result == ',') || + (*result == ';')) { + result++; + } + return result; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// readnumberline() Read a nonempty number line from a file. // +// // +// A line is considered "nonempty" if it contains something that looks like // +// a number. Comments (prefaced by `#') are ignored. // +// // +/////////////////////////////////////////////////////////////////////////////// + +char* tetgenio::readnumberline(char *string, FILE *infile, char *infilename) +{ + char *result; + + // Search for something that looks like a number. + do { + result = fgets(string, INPUTLINESIZE, infile); + if (result == (char *) NULL) { + return result; + } + // Skip anything that doesn't look like a number, a comment, + // or the end of a line. + while ((*result != '\0') && (*result != '#') + && (*result != '.') && (*result != '+') && (*result != '-') + && ((*result < '0') || (*result > '9'))) { + result++; + } + // If it's a comment or end of line, read another line and try again. + } while ((*result == '#') || (*result == '\0')); + return result; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// findnextnumber() Find the next field of a number string. // +// // +// Jumps past the current field by searching for whitespace or a comma, then // +// jumps past the whitespace or the comma to find the next field that looks // +// like a number. // +// // +/////////////////////////////////////////////////////////////////////////////// + +char* tetgenio::findnextnumber(char *string) +{ + char *result; + + result = string; + // Skip the current field. Stop upon reaching whitespace or a comma. + while ((*result != '\0') && (*result != '#') && (*result != ' ') && + (*result != '\t') && (*result != ',')) { + result++; + } + // Now skip the whitespace and anything else that doesn't look like a + // number, a comment, or the end of a line. + while ((*result != '\0') && (*result != '#') + && (*result != '.') && (*result != '+') && (*result != '-') + && ((*result < '0') || (*result > '9'))) { + result++; + } + // Check for a comment (prefixed with `#'). + if (*result == '#') { + *result = '\0'; + } + return result; +} + +//// //// +//// //// +//// io_cxx /////////////////////////////////////////////////////////////////// + + +//// behavior_cxx ///////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// syntax() Print list of command line switches. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenbehavior::syntax() +{ + printf(" tetgen [-pYrq_Aa_miO_S_T_XMwcdzfenvgkJBNEFICQVh] input_file\n"); + printf(" -p Tetrahedralizes a piecewise linear complex (PLC).\n"); + printf(" -Y Preserves the input surface mesh (does not modify it).\n"); + printf(" -r Reconstructs a previously generated mesh.\n"); + printf(" -q Refines mesh (to improve mesh quality).\n"); + printf(" -R Mesh coarsening (to reduce the mesh elements).\n"); + printf(" -A Assigns attributes to tetrahedra in different regions.\n"); + printf(" -a Applies a maximum tetrahedron volume constraint.\n"); + printf(" -m Applies a mesh sizing function.\n"); + printf(" -i Inserts a list of additional points.\n"); + printf(" -O Specifies the level of mesh optimization.\n"); + printf(" -S Specifies maximum number of added points.\n"); + printf(" -T Sets a tolerance for coplanar test (default 1e-8).\n"); + printf(" -X Suppresses use of exact arithmetic.\n"); + printf(" -M No merge of coplanar facets or very close vertices.\n"); + printf(" -w Generates weighted Delaunay (regular) triangulation.\n"); + printf(" -c Retains the convex hull of the PLC.\n"); + printf(" -d Detects self-intersections of facets of the PLC.\n"); + printf(" -z Numbers all output items starting from zero.\n"); + printf(" -f Outputs all faces to .face file.\n"); + printf(" -e Outputs all edges to .edge file.\n"); + printf(" -n Outputs tetrahedra neighbors to .neigh file.\n"); + printf(" -v Outputs Voronoi diagram to files.\n"); + printf(" -g Outputs mesh to .mesh file for viewing by Medit.\n"); + printf(" -k Outputs mesh to .vtk file for viewing by Paraview.\n"); + printf(" -J No jettison of unused vertices from output .node file.\n"); + printf(" -B Suppresses output of boundary information.\n"); + printf(" -N Suppresses output of .node file.\n"); + printf(" -E Suppresses output of .ele file.\n"); + printf(" -F Suppresses output of .face and .edge file.\n"); + printf(" -I Suppresses mesh iteration numbers.\n"); + printf(" -C Checks the consistency of the final mesh.\n"); + printf(" -Q Quiet: No terminal output except errors.\n"); + printf(" -V Verbose: Detailed information, more terminal output.\n"); + printf(" -h Help: A brief instruction for using TetGen.\n"); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// usage() Print a brief instruction for using TetGen. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenbehavior::usage() +{ + printf("TetGen\n"); + printf("A Quality Tetrahedral Mesh Generator and 3D Delaunay "); + printf("Triangulator\n"); + printf("Version 1.5\n"); + printf("August 18, 2018\n"); + printf("\n"); + printf("Copyright (C) 2002 - 2018\n"); + printf("\n"); + printf("What Can TetGen Do?\n"); + printf("\n"); + printf(" TetGen generates Delaunay tetrahedralizations, constrained\n"); + printf(" Delaunay tetrahedralizations, and quality tetrahedral meshes.\n"); + printf("\n"); + printf("Command Line Syntax:\n"); + printf("\n"); + printf(" Below is the basic command line syntax of TetGen with a list of "); + printf("short\n"); + printf(" descriptions. Underscores indicate that numbers may optionally\n"); + printf(" follow certain switches. Do not leave any space between a "); + printf("switch\n"); + printf(" and its numeric parameter. \'input_file\' contains input data\n"); + printf(" depending on the switches you supplied which may be a "); + printf(" piecewise\n"); + printf(" linear complex or a list of nodes. File formats and detailed\n"); + printf(" description of command line switches are found in user's "); + printf("manual.\n"); + printf("\n"); + syntax(); + printf("\n"); + printf("Examples of How to Use TetGen:\n"); + printf("\n"); + printf(" \'tetgen object\' reads vertices from object.node, and writes "); + printf("their\n Delaunay tetrahedralization to object.1.node, "); + printf("object.1.ele\n (tetrahedra), and object.1.face"); + printf(" (convex hull faces).\n"); + printf("\n"); + printf(" \'tetgen -p object\' reads a PLC from object.poly or object."); + printf("smesh (and\n possibly object.node) and writes its constrained "); + printf("Delaunay\n tetrahedralization to object.1.node, object.1.ele, "); + printf("object.1.face,\n"); + printf(" (boundary faces) and object.1.edge (boundary edges).\n"); + printf("\n"); + printf(" \'tetgen -pq1.414a.1 object\' reads a PLC from object.poly or\n"); + printf(" object.smesh (and possibly object.node), generates a mesh "); + printf("whose\n tetrahedra have radius-edge ratio smaller than 1.414 and "); + printf("have volume\n of 0.1 or less, and writes the mesh to "); + printf("object.1.node, object.1.ele,\n object.1.face, and object.1.edge\n"); + printf("\n"); + printf("Please send bugs/comments to Hang Si \n"); + terminatetetgen(NULL, 0); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// parse_commandline() Read the command line, identify switches, and set // +// up options and file names. // +// // +// 'argc' and 'argv' are the same parameters passed to the function main() // +// of a C/C++ program. They together represent the command line user invoked // +// from an environment in which TetGen is running. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenbehavior::parse_commandline(int argc, char **argv) +{ + int startindex; + int increment; + int meshnumber; + int i, j, k; + char workstring[1024]; + + // First determine the input style of the switches. + if (argc == 0) { + startindex = 0; // Switches are given without a dash. + argc = 1; // For running the following for-loop once. + commandline[0] = '\0'; + } else { + startindex = 1; + strcpy(commandline, argv[0]); + strcat(commandline, " "); + } + + for (i = startindex; i < argc; i++) { + // Remember the command line for output. + strcat(commandline, argv[i]); + strcat(commandline, " "); + if (startindex == 1) { + // Is this string a filename? + if (argv[i][0] != '-') { + strncpy(infilename, argv[i], 1024 - 1); + infilename[1024 - 1] = '\0'; + continue; + } + } + // Parse the individual switch from the string. + for (j = startindex; argv[i][j] != '\0'; j++) { + if (argv[i][j] == 'p') { + plc = 1; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + facet_separate_ang_tol = (REAL) strtod(workstring, (char **) NULL); + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.') || (argv[i][j + 1] == 'e') || + (argv[i][j + 1] == '-') || (argv[i][j + 1] == '+')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + facet_overlap_ang_tol = (REAL) strtod(workstring, (char **) NULL); + } + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + facet_small_ang_tol = (REAL) strtod(workstring, (char **) NULL); + } + } + } else if (argv[i][j] == 's') { + psc = 1; + } else if (argv[i][j] == 'Y') { + nobisect = 1; + if ((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) { + nobisect_nomerge = (argv[i][j + 1] - '0'); + j++; + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if ((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) { + supsteiner_level = (argv[i][j + 1] - '0'); + j++; + } + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if ((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) { + addsteiner_algo = (argv[i][j + 1] - '0'); + j++; + } + } + } else if (argv[i][j] == 'r') { + refine = 1; + } else if (argv[i][j] == 'q') { + quality = 1; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + minratio = (REAL) strtod(workstring, (char **) NULL); + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + mindihedral = (REAL) strtod(workstring, (char **) NULL); + } + } + } else if (argv[i][j] == 'R') { + coarsen = 1; + if ((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) { + coarsen_param = (argv[i][j + 1] - '0'); + j++; + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + coarsen_percent = (REAL) strtod(workstring, (char **) NULL); + } + } + } else if (argv[i][j] == 'w') { + weighted = 1; + if ((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) { + weighted_param = (argv[i][j + 1] - '0'); + j++; + } + } else if (argv[i][j] == 'b') { + // -b(brio_threshold/brio_ratio/hilbert_limit/hilbert_order) + brio_hilbert = 1; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + brio_threshold = (int) strtol(workstring, (char **) &workstring, 0); + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + brio_ratio = (REAL) strtod(workstring, (char **) NULL); + } + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.') || (argv[i][j + 1] == '-')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.') || (argv[i][j + 1] == '-')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + hilbert_limit = (int) strtol(workstring, (char **) &workstring, 0); + } + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.') || (argv[i][j + 1] == '-')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.') || (argv[i][j + 1] == '-')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + hilbert_order = (REAL) strtod(workstring, (char **) NULL); + } + } + if (brio_threshold == 0) { // -b0 + brio_hilbert = 0; // Turn off BRIO-Hilbert sorting. + } + if (brio_ratio >= 1.0) { // -b/1 + no_sort = 1; + brio_hilbert = 0; // Turn off BRIO-Hilbert sorting. + } + } else if (argv[i][j] == 'l') { + incrflip = 1; + } else if (argv[i][j] == 'L') { + flipinsert = 1; + } else if (argv[i][j] == 'm') { + metric = 1; + } else if (argv[i][j] == 'a') { + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + fixedvolume = 1; + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.') || (argv[i][j + 1] == 'e') || + (argv[i][j + 1] == '-') || (argv[i][j + 1] == '+')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + maxvolume = (REAL) strtod(workstring, (char **) NULL); + } else { + varvolume = 1; + } + } else if (argv[i][j] == 'A') { + regionattrib = 1; + } else if (argv[i][j] == 'D') { + cdtrefine = 1; + if (argv[i][j + 1] == 'l') { + use_equatorial_lens = 1; + } else if ((argv[i][j + 1] >= '1') && (argv[i][j + 1] <= '3')) { + reflevel = (argv[i][j + 1] - '1') + 1; + j++; + } + } else if (argv[i][j] == 'i') { + insertaddpoints = 1; + } else if (argv[i][j] == 'd') { + diagnose = 1; + } else if (argv[i][j] == 'c') { + convex = 1; + } else if (argv[i][j] == 'M') { + nomergefacet = 1; + nomergevertex = 1; + if ((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '1')) { + nomergefacet = (argv[i][j + 1] - '0'); + j++; + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if ((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '1')) { + nomergevertex = (argv[i][j + 1] - '0'); + j++; + } + } + } else if (argv[i][j] == 'X') { + if (argv[i][j + 1] == '1') { + nostaticfilter = 1; + j++; + } else { + noexact = 1; + } + } else if (argv[i][j] == 'z') { + if (argv[i][j + 1] == '1') { // -z1 + reversetetori = 1; + j++; + } else { + zeroindex = 1; // -z + } + } else if (argv[i][j] == 'f') { + facesout++; + } else if (argv[i][j] == 'e') { + edgesout++; + } else if (argv[i][j] == 'n') { + neighout++; + } else if (argv[i][j] == 'v') { + voroout = 1; + } else if (argv[i][j] == 'g') { + meditview = 1; + } else if (argv[i][j] == 'k') { + vtkview = 1; + } else if (argv[i][j] == 'J') { + nojettison = 1; + } else if (argv[i][j] == 'B') { + nobound = 1; + } else if (argv[i][j] == 'N') { + nonodewritten = 1; + } else if (argv[i][j] == 'E') { + noelewritten = 1; + } else if (argv[i][j] == 'F') { + nofacewritten = 1; + } else if (argv[i][j] == 'I') { + noiterationnum = 1; + } else if (argv[i][j] == 'S') { + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.') || (argv[i][j + 1] == 'e') || + (argv[i][j + 1] == '-') || (argv[i][j + 1] == '+')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + steinerleft = (int) strtol(workstring, (char **) NULL, 0); + } + } else if (argv[i][j] == 'o') { + if (argv[i][j + 1] == '2') { + order = 2; + j++; + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + optmaxdihedral = (REAL) strtod(workstring, (char **) NULL); + } + } + } else if (argv[i][j] == 'O') { + if ((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) { + optlevel = (argv[i][j + 1] - '0'); + j++; + } + if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { + j++; + if ((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '7')) { + optscheme = (argv[i][j + 1] - '0'); + j++; + } + } + } else if (argv[i][j] == 'T') { + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.') || (argv[i][j + 1] == 'e') || + (argv[i][j + 1] == '-') || (argv[i][j + 1] == '+')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + epsilon = (REAL) strtod(workstring, (char **) NULL); + } + } else if (argv[i][j] == 'C') { + docheck++; + } else if (argv[i][j] == 'Q') { + quiet = 1; + } else if (argv[i][j] == 'V') { + verbose++; + } else if (argv[i][j] == 'x') { + if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.')) { + k = 0; + while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || + (argv[i][j + 1] == '.') || (argv[i][j + 1] == 'e') || + (argv[i][j + 1] == '-') || (argv[i][j + 1] == '+')) { + j++; + workstring[k] = argv[i][j]; + k++; + } + workstring[k] = '\0'; + tetrahedraperblock = (int) strtol(workstring, (char **) NULL, 0); + if (tetrahedraperblock > 8188) { + vertexperblock = tetrahedraperblock / 2; + shellfaceperblock = vertexperblock / 2; + } else { + tetrahedraperblock = 8188; + } + } + } else if (argv[i][j] == 'H') { + if (argv[i+1][0] != '-') { + hole_mesh = 1; + // It is a filename following by -H + strncpy(hole_mesh_filename, argv[i+1], 1024 - 1); + hole_mesh_filename[1024 - 1] = '\0'; + i++; // Skip the next string. + break; // j + } + } else if (argv[i][j] == 'K') { + apply_flow_bc = 1; + } else if ((argv[i][j] == 'h') || // (argv[i][j] == 'H') + (argv[i][j] == '?')) { + usage(); + } else { + printf("Warning: Unknown switch -%c.\n", argv[i][j]); + } + } + } + + if (startindex == 0) { + // Set a temporary filename for debugging output. + strcpy(infilename, "tetgen-tmpfile"); + } else { + if (infilename[0] == '\0') { + // No input file name. Print the syntax and exit. + syntax(); + terminatetetgen(NULL, 0); + } + // Recognize the object from file extension if it is available. + if (!strcmp(&infilename[strlen(infilename) - 5], ".node")) { + infilename[strlen(infilename) - 5] = '\0'; + object = NODES; + } else if (!strcmp(&infilename[strlen(infilename) - 5], ".poly")) { + infilename[strlen(infilename) - 5] = '\0'; + object = POLY; + plc = 1; + } else if (!strcmp(&infilename[strlen(infilename) - 6], ".smesh")) { + infilename[strlen(infilename) - 6] = '\0'; + object = POLY; + plc = 1; + } else if (!strcmp(&infilename[strlen(infilename) - 4], ".off")) { + infilename[strlen(infilename) - 4] = '\0'; + object = OFF; + plc = 1; + } else if (!strcmp(&infilename[strlen(infilename) - 4], ".ply")) { + infilename[strlen(infilename) - 4] = '\0'; + object = PLY; + plc = 1; + } else if (!strcmp(&infilename[strlen(infilename) - 4], ".stl")) { + infilename[strlen(infilename) - 4] = '\0'; + object = STL; + plc = 1; + } else if (!strcmp(&infilename[strlen(infilename) - 5], ".mesh")) { + infilename[strlen(infilename) - 5] = '\0'; + object = MEDIT; + if (!refine) plc = 1; + } else if (!strcmp(&infilename[strlen(infilename) - 4], ".vtk")) { + infilename[strlen(infilename) - 4] = '\0'; + object = VTK; + plc = 1; + } else if (!strcmp(&infilename[strlen(infilename) - 4], ".ele")) { + infilename[strlen(infilename) - 4] = '\0'; + object = MESH; + refine = 1; + } else if (!strcmp(&infilename[strlen(infilename) - 4], ".neu")) { + infilename[strlen(infilename) - 4] = '\0'; + object = NEU_MESH; + refine = 1; + } + } + + if (nobisect && (!plc && !refine)) { // -Y + plc = 1; // Default -p option. + } + if (quality && (!plc && !refine)) { // -q + plc = 1; // Default -p option. + } + if (diagnose && !plc) { // -d + plc = 1; + } + if (refine && !quality) { // -r only + // Reconstruct a mesh, no mesh optimization. + optlevel = 0; + } + if (insertaddpoints && (optlevel == 0)) { // with -i option + optlevel = 2; + } + if (coarsen && (optlevel == 0)) { // with -R option + optlevel = 2; + } + + // Detect improper combinations of switches. + if ((refine || plc) && weighted) { + printf("Error: Switches -w cannot use together with -p or -r.\n"); + return false; + } + + if (convex) { // -c + if (plc && !regionattrib) { + // -A (region attribute) is needed for marking exterior tets (-1). + regionattrib = 1; + } + } + + // Note: -A must not used together with -r option. + // Be careful not to add an extra attribute to each element unless the + // input supports it (PLC in, but not refining a preexisting mesh). + if (refine || !plc) { + regionattrib = 0; + } + // Be careful not to allocate space for element area constraints that + // will never be assigned any value (other than the default -1.0). + if (!refine && !plc) { + varvolume = 0; + } + // If '-a' or '-aa' is in use, enable '-q' option too. + if (fixedvolume || varvolume) { + if (quality == 0) { + quality = 1; + if (!plc && !refine) { + plc = 1; // enable -p. + } + } + } + // No user-specified dihedral angle bound. Use default ones. + if (!quality) { + if (optmaxdihedral < 179.0) { + if (nobisect) { // with -Y option + optmaxdihedral = 179.0; + } else { // -p only + optmaxdihedral = 179.999; + } + } + if (optminsmtdihed < 179.999) { + optminsmtdihed = 179.999; + } + if (optminslidihed < 179.999) { + optminslidihed = 179.999; + } + } + + increment = 0; + strcpy(workstring, infilename); + j = 1; + while (workstring[j] != '\0') { + if ((workstring[j] == '.') && (workstring[j + 1] != '\0')) { + increment = j + 1; + } + j++; + } + meshnumber = 0; + if (increment > 0) { + j = increment; + do { + if ((workstring[j] >= '0') && (workstring[j] <= '9')) { + meshnumber = meshnumber * 10 + (int) (workstring[j] - '0'); + } else { + increment = 0; + } + j++; + } while (workstring[j] != '\0'); + } + if (noiterationnum) { + strcpy(outfilename, infilename); + } else if (increment == 0) { + strcpy(outfilename, infilename); + strcat(outfilename, ".1"); + } else { + workstring[increment] = '%'; + workstring[increment + 1] = 'd'; + workstring[increment + 2] = '\0'; + sprintf(outfilename, workstring, meshnumber + 1); + } + // Additional input file name has the end ".a". + strcpy(addinfilename, infilename); + strcat(addinfilename, ".a"); + // Background filename has the form "*.b.ele", "*.b.node", ... + strcpy(bgmeshfilename, infilename); + strcat(bgmeshfilename, ".b"); + + return true; +} + +//// //// +//// //// +//// behavior_cxx ///////////////////////////////////////////////////////////// + +//// mempool_cxx ////////////////////////////////////////////////////////////// +//// //// +//// //// + +// Initialize fast lookup tables for mesh maniplulation primitives. + +int tetgenmesh::bondtbl[12][12] = {{0,},}; +int tetgenmesh::enexttbl[12] = {0,}; +int tetgenmesh::eprevtbl[12] = {0,}; +int tetgenmesh::enextesymtbl[12] = {0,}; +int tetgenmesh::eprevesymtbl[12] = {0,}; +int tetgenmesh::eorgoppotbl[12] = {0,}; +int tetgenmesh::edestoppotbl[12] = {0,}; +int tetgenmesh::fsymtbl[12][12] = {{0,},}; +int tetgenmesh::facepivot1[12] = {0,}; +int tetgenmesh::facepivot2[12][12] = {{0,},}; +int tetgenmesh::tsbondtbl[12][6] = {{0,},}; +int tetgenmesh::stbondtbl[12][6] = {{0,},}; +int tetgenmesh::tspivottbl[12][6] = {{0,},}; +int tetgenmesh::stpivottbl[12][6] = {{0,},}; + +// Table 'esymtbl' takes an directed edge (version) as input, returns the +// inversed edge (version) of it. + +int tetgenmesh::esymtbl[12] = {9, 6, 11, 4, 3, 7, 1, 5, 10, 0, 8, 2}; + +// The following four tables give the 12 permutations of the set {0,1,2,3}. +// An offset 4 is added to each element for a direct access of the points +// in the tetrahedron data structure. + +int tetgenmesh:: orgpivot[12] = {7, 7, 5, 5, 6, 4, 4, 6, 5, 6, 7, 4}; +int tetgenmesh::destpivot[12] = {6, 4, 4, 6, 5, 6, 7, 4, 7, 7, 5, 5}; +int tetgenmesh::apexpivot[12] = {5, 6, 7, 4, 7, 7, 5, 5, 6, 4, 4, 6}; +int tetgenmesh::oppopivot[12] = {4, 5, 6, 7, 4, 5, 6, 7, 4, 5, 6, 7}; + +// The twelve versions correspond to six undirected edges. The following two +// tables map a version to an undirected edge and vice versa. + +int tetgenmesh::ver2edge[12] = {0, 1, 2, 3, 3, 5, 1, 5, 4, 0, 4, 2}; +int tetgenmesh::edge2ver[ 6] = {0, 1, 2, 3, 8, 5}; + +// Edge versions whose apex or opposite may be dummypoint. + +int tetgenmesh::epivot[12] = {4, 5, 2, 11, 4, 5, 2, 11, 4, 5, 2, 11}; + + +// Table 'snextpivot' takes an edge version as input, returns the next edge +// version in the same edge ring. + +int tetgenmesh::snextpivot[6] = {2, 5, 4, 1, 0, 3}; + +// The following three tables give the 6 permutations of the set {0,1,2}. +// An offset 3 is added to each element for a direct access of the points +// in the triangle data structure. + +int tetgenmesh::sorgpivot [6] = {3, 4, 4, 5, 5, 3}; +int tetgenmesh::sdestpivot[6] = {4, 3, 5, 4, 3, 5}; +int tetgenmesh::sapexpivot[6] = {5, 5, 3, 3, 4, 4}; + +/////////////////////////////////////////////////////////////////////////////// +// // +// inittable() Initialize the look-up tables. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::inittables() +{ + int soffset, toffset; + int i, j; + + + // i = t1.ver; j = t2.ver; + for (i = 0; i < 12; i++) { + for (j = 0; j < 12; j++) { + bondtbl[i][j] = (j & 3) + (((i & 12) + (j & 12)) % 12); + } + } + + + // i = t1.ver; j = t2.ver + for (i = 0; i < 12; i++) { + for (j = 0; j < 12; j++) { + fsymtbl[i][j] = (j + 12 - (i & 12)) % 12; + } + } + + + for (i = 0; i < 12; i++) { + facepivot1[i] = (esymtbl[i] & 3); + } + + for (i = 0; i < 12; i++) { + for (j = 0; j < 12; j++) { + facepivot2[i][j] = fsymtbl[esymtbl[i]][j]; + } + } + + for (i = 0; i < 12; i++) { + enexttbl[i] = (i + 4) % 12; + eprevtbl[i] = (i + 8) % 12; + } + + for (i = 0; i < 12; i++) { + enextesymtbl[i] = esymtbl[enexttbl[i]]; + eprevesymtbl[i] = esymtbl[eprevtbl[i]]; + } + + for (i = 0; i < 12; i++) { + eorgoppotbl [i] = eprevtbl[esymtbl[enexttbl[i]]]; + edestoppotbl[i] = enexttbl[esymtbl[eprevtbl[i]]]; + } + + // i = t.ver, j = s.shver + for (i = 0; i < 12; i++) { + for (j = 0; j < 6; j++) { + if ((j & 1) == 0) { + soffset = (6 - ((i & 12) >> 1)) % 6; + toffset = (12 - ((j & 6) << 1)) % 12; + } else { + soffset = (i & 12) >> 1; + toffset = (j & 6) << 1; + } + tsbondtbl[i][j] = (j & 1) + (((j & 6) + soffset) % 6); + stbondtbl[i][j] = (i & 3) + (((i & 12) + toffset) % 12); + } + } + + + // i = t.ver, j = s.shver + for (i = 0; i < 12; i++) { + for (j = 0; j < 6; j++) { + if ((j & 1) == 0) { + soffset = (i & 12) >> 1; + toffset = (j & 6) << 1; + } else { + soffset = (6 - ((i & 12) >> 1)) % 6; + toffset = (12 - ((j & 6) << 1)) % 12; + } + tspivottbl[i][j] = (j & 1) + (((j & 6) + soffset) % 6); + stpivottbl[i][j] = (i & 3) + (((i & 12) + toffset) % 12); + } + } +} + + +/////////////////////////////////////////////////////////////////////////////// +// // +// restart() Deallocate all objects in this pool. // +// // +// The pool returns to a fresh state, like after it was initialized, except // +// that no memory is freed to the operating system. Rather, the previously // +// allocated blocks are ready to be used. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::arraypool::restart() +{ + objects = 0l; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// poolinit() Initialize an arraypool for allocation of objects. // +// // +// Before the pool may be used, it must be initialized by this procedure. // +// After initialization, memory can be allocated and freed in this pool. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::arraypool::poolinit(int sizeofobject, int log2objperblk) +{ + // Each object must be at least one byte long. + objectbytes = sizeofobject > 1 ? sizeofobject : 1; + + log2objectsperblock = log2objperblk; + // Compute the number of objects in each block. + objectsperblock = ((int) 1) << log2objectsperblock; + objectsperblockmark = objectsperblock - 1; + + // No memory has been allocated. + totalmemory = 0l; + // The top array has not been allocated yet. + toparray = (char **) NULL; + toparraylen = 0; + + // Ready all indices to be allocated. + restart(); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// arraypool() The constructor and destructor. // +// // +/////////////////////////////////////////////////////////////////////////////// + +tetgenmesh::arraypool::arraypool(int sizeofobject, int log2objperblk) +{ + poolinit(sizeofobject, log2objperblk); +} + +tetgenmesh::arraypool::~arraypool() +{ + int i; + + // Has anything been allocated at all? + if (toparray != (char **) NULL) { + // Walk through the top array. + for (i = 0; i < toparraylen; i++) { + // Check every pointer; NULLs may be scattered randomly. + if (toparray[i] != (char *) NULL) { + // Free an allocated block. + free((void *) toparray[i]); + } + } + // Free the top array. + free((void *) toparray); + } + + // The top array is no longer allocated. + toparray = (char **) NULL; + toparraylen = 0; + objects = 0; + totalmemory = 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// getblock() Return (and perhaps create) the block containing the object // +// with a given index. // +// // +// This function takes care of allocating or resizing the top array if nece- // +// ssary, and of allocating the block if it hasn't yet been allocated. // +// // +// Return a pointer to the beginning of the block (NOT the object). // +// // +/////////////////////////////////////////////////////////////////////////////// + +char* tetgenmesh::arraypool::getblock(int objectindex) +{ + char **newarray; + char *block; + int newsize; + int topindex; + int i; + + // Compute the index in the top array (upper bits). + topindex = objectindex >> log2objectsperblock; + // Does the top array need to be allocated or resized? + if (toparray == (char **) NULL) { + // Allocate the top array big enough to hold 'topindex', and NULL out + // its contents. + newsize = topindex + 128; + toparray = (char **) malloc((size_t) (newsize * sizeof(char *))); + toparraylen = newsize; + for (i = 0; i < newsize; i++) { + toparray[i] = (char *) NULL; + } + // Account for the memory. + totalmemory = newsize * (uintptr_t) sizeof(char *); + } else if (topindex >= toparraylen) { + // Resize the top array, making sure it holds 'topindex'. + newsize = 3 * toparraylen; + if (topindex >= newsize) { + newsize = topindex + 128; + } + // Allocate the new array, copy the contents, NULL out the rest, and + // free the old array. + newarray = (char **) malloc((size_t) (newsize * sizeof(char *))); + for (i = 0; i < toparraylen; i++) { + newarray[i] = toparray[i]; + } + for (i = toparraylen; i < newsize; i++) { + newarray[i] = (char *) NULL; + } + free(toparray); + // Account for the memory. + totalmemory += (newsize - toparraylen) * sizeof(char *); + toparray = newarray; + toparraylen = newsize; + } + + // Find the block, or learn that it hasn't been allocated yet. + block = toparray[topindex]; + if (block == (char *) NULL) { + // Allocate a block at this index. + block = (char *) malloc((size_t) (objectsperblock * objectbytes)); + toparray[topindex] = block; + // Account for the memory. + totalmemory += objectsperblock * objectbytes; + } + + // Return a pointer to the block. + return block; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// lookup() Return the pointer to the object with a given index, or NULL // +// if the object's block doesn't exist yet. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void* tetgenmesh::arraypool::lookup(int objectindex) +{ + char *block; + int topindex; + + // Has the top array been allocated yet? + if (toparray == (char **) NULL) { + return (void *) NULL; + } + + // Compute the index in the top array (upper bits). + topindex = objectindex >> log2objectsperblock; + // Does the top index fit in the top array? + if (topindex >= toparraylen) { + return (void *) NULL; + } + + // Find the block, or learn that it hasn't been allocated yet. + block = toparray[topindex]; + if (block == (char *) NULL) { + return (void *) NULL; + } + + // Compute a pointer to the object with the given index. Note that + // 'objectsperblock' is a power of two, so the & operation is a bit mask + // that preserves the lower bits. + return (void *)(block + (objectindex & (objectsperblock - 1)) * objectbytes); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// newindex() Allocate space for a fresh object from the pool. // +// // +// 'newptr' returns a pointer to the new object (it must not be a NULL). // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::arraypool::newindex(void **newptr) +{ + // Allocate an object at index 'firstvirgin'. + int newindex = objects; + *newptr = (void *) (getblock(objects) + + (objects & (objectsperblock - 1)) * objectbytes); + objects++; + + return newindex; +} + + +/////////////////////////////////////////////////////////////////////////////// +// // +// memorypool() The constructors of memorypool. // +// // +/////////////////////////////////////////////////////////////////////////////// + +tetgenmesh::memorypool::memorypool() +{ + firstblock = nowblock = (void **) NULL; + nextitem = (void *) NULL; + deaditemstack = (void *) NULL; + pathblock = (void **) NULL; + pathitem = (void *) NULL; + alignbytes = 0; + itembytes = itemwords = 0; + itemsperblock = 0; + items = maxitems = 0l; + unallocateditems = 0; + pathitemsleft = 0; +} + +tetgenmesh::memorypool::memorypool(int bytecount, int itemcount, int wsize, + int alignment) +{ + poolinit(bytecount, itemcount, wsize, alignment); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// ~memorypool() Free to the operating system all memory taken by a pool. // +// // +/////////////////////////////////////////////////////////////////////////////// + +tetgenmesh::memorypool::~memorypool() +{ + while (firstblock != (void **) NULL) { + nowblock = (void **) *(firstblock); + free(firstblock); + firstblock = nowblock; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// poolinit() Initialize a pool of memory for allocation of items. // +// // +// A `pool' is created whose records have size at least `bytecount'. Items // +// will be allocated in `itemcount'-item blocks. Each item is assumed to be // +// a collection of words, and either pointers or floating-point values are // +// assumed to be the "primary" word type. (The "primary" word type is used // +// to determine alignment of items.) If `alignment' isn't zero, all items // +// will be `alignment'-byte aligned in memory. `alignment' must be either a // +// multiple or a factor of the primary word size; powers of two are safe. // +// `alignment' is normally used to create a few unused bits at the bottom of // +// each item's pointer, in which information may be stored. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::memorypool::poolinit(int bytecount,int itemcount,int wordsize, + int alignment) +{ + // Find the proper alignment, which must be at least as large as: + // - The parameter `alignment'. + // - The primary word type, to avoid unaligned accesses. + // - sizeof(void *), so the stack of dead items can be maintained + // without unaligned accesses. + if (alignment > wordsize) { + alignbytes = alignment; + } else { + alignbytes = wordsize; + } + if ((int) sizeof(void *) > alignbytes) { + alignbytes = (int) sizeof(void *); + } + itemwords = ((bytecount + alignbytes - 1) / alignbytes) + * (alignbytes / wordsize); + itembytes = itemwords * wordsize; + itemsperblock = itemcount; + + // Allocate a block of items. Space for `itemsperblock' items and one + // pointer (to point to the next block) are allocated, as well as space + // to ensure alignment of the items. + firstblock = (void **) malloc(itemsperblock * itembytes + sizeof(void *) + + alignbytes); + if (firstblock == (void **) NULL) { + terminatetetgen(NULL, 1); + } + // Set the next block pointer to NULL. + *(firstblock) = (void *) NULL; + restart(); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// restart() Deallocate all items in this pool. // +// // +// The pool is returned to its starting state, except that no memory is // +// freed to the operating system. Rather, the previously allocated blocks // +// are ready to be reused. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::memorypool::restart() +{ + uintptr_t alignptr; + + items = 0; + maxitems = 0; + + // Set the currently active block. + nowblock = firstblock; + // Find the first item in the pool. Increment by the size of (void *). + alignptr = (uintptr_t) (nowblock + 1); + // Align the item on an `alignbytes'-byte boundary. + nextitem = (void *) + (alignptr + (uintptr_t) alignbytes - + (alignptr % (uintptr_t) alignbytes)); + // There are lots of unallocated items left in this block. + unallocateditems = itemsperblock; + // The stack of deallocated items is empty. + deaditemstack = (void *) NULL; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// alloc() Allocate space for an item. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void* tetgenmesh::memorypool::alloc() +{ + void *newitem; + void **newblock; + uintptr_t alignptr; + + // First check the linked list of dead items. If the list is not + // empty, allocate an item from the list rather than a fresh one. + if (deaditemstack != (void *) NULL) { + newitem = deaditemstack; // Take first item in list. + deaditemstack = * (void **) deaditemstack; + } else { + // Check if there are any free items left in the current block. + if (unallocateditems == 0) { + // Check if another block must be allocated. + if (*nowblock == (void *) NULL) { + // Allocate a new block of items, pointed to by the previous block. + newblock = (void **) malloc(itemsperblock * itembytes + sizeof(void *) + + alignbytes); + if (newblock == (void **) NULL) { + terminatetetgen(NULL, 1); + } + *nowblock = (void *) newblock; + // The next block pointer is NULL. + *newblock = (void *) NULL; + } + // Move to the new block. + nowblock = (void **) *nowblock; + // Find the first item in the block. + // Increment by the size of (void *). + alignptr = (uintptr_t) (nowblock + 1); + // Align the item on an `alignbytes'-byte boundary. + nextitem = (void *) + (alignptr + (uintptr_t) alignbytes - + (alignptr % (uintptr_t) alignbytes)); + // There are lots of unallocated items left in this block. + unallocateditems = itemsperblock; + } + // Allocate a new item. + newitem = nextitem; + // Advance `nextitem' pointer to next free item in block. + nextitem = (void *) ((uintptr_t) nextitem + itembytes); + unallocateditems--; + maxitems++; + } + items++; + return newitem; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// dealloc() Deallocate space for an item. // +// // +// The deallocated space is stored in a queue for later reuse. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::memorypool::dealloc(void *dyingitem) +{ + // Push freshly killed item onto stack. + *((void **) dyingitem) = deaditemstack; + deaditemstack = dyingitem; + items--; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// traversalinit() Prepare to traverse the entire list of items. // +// // +// This routine is used in conjunction with traverse(). // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::memorypool::traversalinit() +{ + uintptr_t alignptr; + + // Begin the traversal in the first block. + pathblock = firstblock; + // Find the first item in the block. Increment by the size of (void *). + alignptr = (uintptr_t) (pathblock + 1); + // Align with item on an `alignbytes'-byte boundary. + pathitem = (void *) + (alignptr + (uintptr_t) alignbytes - + (alignptr % (uintptr_t) alignbytes)); + // Set the number of items left in the current block. + pathitemsleft = itemsperblock; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// traverse() Find the next item in the list. // +// // +// This routine is used in conjunction with traversalinit(). Be forewarned // +// that this routine successively returns all items in the list, including // +// deallocated ones on the deaditemqueue. It's up to you to figure out which // +// ones are actually dead. It can usually be done more space-efficiently by // +// a routine that knows something about the structure of the item. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void* tetgenmesh::memorypool::traverse() +{ + void *newitem; + uintptr_t alignptr; + + // Stop upon exhausting the list of items. + if (pathitem == nextitem) { + return (void *) NULL; + } + // Check whether any untraversed items remain in the current block. + if (pathitemsleft == 0) { + // Find the next block. + pathblock = (void **) *pathblock; + // Find the first item in the block. Increment by the size of (void *). + alignptr = (uintptr_t) (pathblock + 1); + // Align with item on an `alignbytes'-byte boundary. + pathitem = (void *) + (alignptr + (uintptr_t) alignbytes - + (alignptr % (uintptr_t) alignbytes)); + // Set the number of items left in the current block. + pathitemsleft = itemsperblock; + } + newitem = pathitem; + // Find the next item in the block. + pathitem = (void *) ((uintptr_t) pathitem + itembytes); + pathitemsleft--; + return newitem; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// makeindex2pointmap() Create a map from index to vertices. // +// // +// 'idx2verlist' returns the created map. Traverse all vertices, a pointer // +// to each vertex is set into the array. The pointer to the first vertex is // +// saved in 'idx2verlist[in->firstnumber]'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::makeindex2pointmap(point*& idx2verlist) +{ + point pointloop; + int idx; + + if (b->verbose > 1) { + printf(" Constructing mapping from indices to points.\n"); + } + + idx2verlist = new point[points->items + 1]; + + points->traversalinit(); + pointloop = pointtraverse(); + idx = in->firstnumber; + while (pointloop != (point) NULL) { + idx2verlist[idx++] = pointloop; + pointloop = pointtraverse(); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// makesubfacemap() Create a map from vertex to subfaces incident at it. // +// // +// The map is returned in two arrays 'idx2faclist' and 'facperverlist'. All // +// subfaces incident at i-th vertex (i is counted from 0) are found in the // +// array facperverlist[j], where idx2faclist[i] <= j < idx2faclist[i + 1]. // +// Each entry in facperverlist[j] is a subface whose origin is the vertex. // +// // +// NOTE: These two arrays will be created inside this routine, don't forget // +// to free them after using. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::makepoint2submap(memorypool* pool, int*& idx2faclist, + face*& facperverlist) +{ + face shloop; + int i, j, k; + + if (b->verbose > 1) { + printf(" Making a map from points to subfaces.\n"); + } + + // Initialize 'idx2faclist'. + idx2faclist = new int[points->items + 1]; + for (i = 0; i < points->items + 1; i++) idx2faclist[i] = 0; + + // Loop all subfaces, counter the number of subfaces incident at a vertex. + pool->traversalinit(); + shloop.sh = shellfacetraverse(pool); + while (shloop.sh != (shellface *) NULL) { + // Increment the number of incident subfaces for each vertex. + j = pointmark((point) shloop.sh[3]) - in->firstnumber; + idx2faclist[j]++; + j = pointmark((point) shloop.sh[4]) - in->firstnumber; + idx2faclist[j]++; + // Skip the third corner if it is a segment. + if (shloop.sh[5] != NULL) { + j = pointmark((point) shloop.sh[5]) - in->firstnumber; + idx2faclist[j]++; + } + shloop.sh = shellfacetraverse(pool); + } + + // Calculate the total length of array 'facperverlist'. + j = idx2faclist[0]; + idx2faclist[0] = 0; // Array starts from 0 element. + for (i = 0; i < points->items; i++) { + k = idx2faclist[i + 1]; + idx2faclist[i + 1] = idx2faclist[i] + j; + j = k; + } + + // The total length is in the last unit of idx2faclist. + facperverlist = new face[idx2faclist[i]]; + + // Loop all subfaces again, remember the subfaces at each vertex. + pool->traversalinit(); + shloop.sh = shellfacetraverse(pool); + while (shloop.sh != (shellface *) NULL) { + j = pointmark((point) shloop.sh[3]) - in->firstnumber; + shloop.shver = 0; // save the origin. + facperverlist[idx2faclist[j]] = shloop; + idx2faclist[j]++; + // Is it a subface or a subsegment? + if (shloop.sh[5] != NULL) { + j = pointmark((point) shloop.sh[4]) - in->firstnumber; + shloop.shver = 2; // save the origin. + facperverlist[idx2faclist[j]] = shloop; + idx2faclist[j]++; + j = pointmark((point) shloop.sh[5]) - in->firstnumber; + shloop.shver = 4; // save the origin. + facperverlist[idx2faclist[j]] = shloop; + idx2faclist[j]++; + } else { + j = pointmark((point) shloop.sh[4]) - in->firstnumber; + shloop.shver = 1; // save the origin. + facperverlist[idx2faclist[j]] = shloop; + idx2faclist[j]++; + } + shloop.sh = shellfacetraverse(pool); + } + + // Contents in 'idx2faclist' are shifted, now shift them back. + for (i = points->items - 1; i >= 0; i--) { + idx2faclist[i + 1] = idx2faclist[i]; + } + idx2faclist[0] = 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetrahedrondealloc() Deallocate space for a tet., marking it dead. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::tetrahedrondealloc(tetrahedron *dyingtetrahedron) +{ + // Set tetrahedron's vertices to NULL. This makes it possible to detect + // dead tetrahedra when traversing the list of all tetrahedra. + dyingtetrahedron[4] = (tetrahedron) NULL; + + // Dealloc the space to subfaces/subsegments. + if (dyingtetrahedron[8] != NULL) { + tet2segpool->dealloc((shellface *) dyingtetrahedron[8]); + } + if (dyingtetrahedron[9] != NULL) { + tet2subpool->dealloc((shellface *) dyingtetrahedron[9]); + } + + tetrahedrons->dealloc((void *) dyingtetrahedron); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetrahedrontraverse() Traverse the tetrahedra, skipping dead ones. // +// // +/////////////////////////////////////////////////////////////////////////////// + +tetgenmesh::tetrahedron* tetgenmesh::tetrahedrontraverse() +{ + tetrahedron *newtetrahedron; + + do { + newtetrahedron = (tetrahedron *) tetrahedrons->traverse(); + if (newtetrahedron == (tetrahedron *) NULL) { + return (tetrahedron *) NULL; + } + } while ((newtetrahedron[4] == (tetrahedron) NULL) || + ((point) newtetrahedron[7] == dummypoint)); + return newtetrahedron; +} + +tetgenmesh::tetrahedron* tetgenmesh::alltetrahedrontraverse() +{ + tetrahedron *newtetrahedron; + + do { + newtetrahedron = (tetrahedron *) tetrahedrons->traverse(); + if (newtetrahedron == (tetrahedron *) NULL) { + return (tetrahedron *) NULL; + } + } while (newtetrahedron[4] == (tetrahedron) NULL); // Skip dead ones. + return newtetrahedron; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// shellfacedealloc() Deallocate space for a shellface, marking it dead. // +// Used both for dealloc a subface and subsegment. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::shellfacedealloc(memorypool *pool, shellface *dyingsh) +{ + // Set shellface's vertices to NULL. This makes it possible to detect dead + // shellfaces when traversing the list of all shellfaces. + dyingsh[3] = (shellface) NULL; + pool->dealloc((void *) dyingsh); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// shellfacetraverse() Traverse the subfaces, skipping dead ones. Used // +// for both subfaces and subsegments pool traverse. // +// // +/////////////////////////////////////////////////////////////////////////////// + +tetgenmesh::shellface* tetgenmesh::shellfacetraverse(memorypool *pool) +{ + shellface *newshellface; + + do { + newshellface = (shellface *) pool->traverse(); + if (newshellface == (shellface *) NULL) { + return (shellface *) NULL; + } + } while (newshellface[3] == (shellface) NULL); // Skip dead ones. + return newshellface; +} + + +/////////////////////////////////////////////////////////////////////////////// +// // +// pointdealloc() Deallocate space for a point, marking it dead. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::pointdealloc(point dyingpoint) +{ + // Mark the point as dead. This makes it possible to detect dead points + // when traversing the list of all points. + setpointtype(dyingpoint, DEADVERTEX); + points->dealloc((void *) dyingpoint); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// pointtraverse() Traverse the points, skipping dead ones. // +// // +/////////////////////////////////////////////////////////////////////////////// + +tetgenmesh::point tetgenmesh::pointtraverse() +{ + point newpoint; + + do { + newpoint = (point) points->traverse(); + if (newpoint == (point) NULL) { + return (point) NULL; + } + } while (pointtype(newpoint) == DEADVERTEX); // Skip dead ones. + return newpoint; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// maketetrahedron() Create a new tetrahedron. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::maketetrahedron(triface *newtet) +{ + newtet->tet = (tetrahedron *) tetrahedrons->alloc(); + + // Initialize the four adjoining tetrahedra to be "outer space". + newtet->tet[0] = NULL; + newtet->tet[1] = NULL; + newtet->tet[2] = NULL; + newtet->tet[3] = NULL; + // Four NULL vertices. + newtet->tet[4] = NULL; + newtet->tet[5] = NULL; + newtet->tet[6] = NULL; + newtet->tet[7] = NULL; + // No attached segments and subfaces yet. + newtet->tet[8] = NULL; + newtet->tet[9] = NULL; + // Initialize the marker (clear all flags). + setelemmarker(newtet->tet, 0); + for (int i = 0; i < numelemattrib; i++) { + setelemattribute(newtet->tet, i, 0.0); + } + if (b->varvolume) { + setvolumebound(newtet->tet, -1.0); + } + + // Initialize the version to be Zero. + newtet->ver = 11; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// makeshellface() Create a new shellface with version zero. Used for // +// both subfaces and subsegments. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::makeshellface(memorypool *pool, face *newface) +{ + newface->sh = (shellface *) pool->alloc(); + + // No adjointing subfaces. + newface->sh[0] = NULL; + newface->sh[1] = NULL; + newface->sh[2] = NULL; + // Three NULL vertices. + newface->sh[3] = NULL; + newface->sh[4] = NULL; + newface->sh[5] = NULL; + // No adjoining subsegments. + newface->sh[6] = NULL; + newface->sh[7] = NULL; + newface->sh[8] = NULL; + // No adjoining tetrahedra. + newface->sh[9] = NULL; + newface->sh[10] = NULL; + if (checkconstraints) { + // Initialize the maximum area bound. + setareabound(*newface, 0.0); + } + // Set the boundary marker to zero. + setshellmark(*newface, 0); + // Clear the infection and marktest bits. + ((int *) (newface->sh))[shmarkindex + 1] = 0; + if (useinsertradius) { + setfacetindex(*newface, 0); + } + + newface->shver = 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// makepoint() Create a new point. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::makepoint(point* pnewpoint, enum verttype vtype) +{ + int i; + + *pnewpoint = (point) points->alloc(); + + // Initialize the point attributes. + for (i = 0; i < numpointattrib; i++) { + (*pnewpoint)[3 + i] = 0.0; + } + // Initialize the metric tensor. + for (i = 0; i < sizeoftensor; i++) { + (*pnewpoint)[pointmtrindex + i] = 0.0; + } + setpoint2tet(*pnewpoint, NULL); + setpoint2ppt(*pnewpoint, NULL); + if (b->plc || b->refine) { + // Initialize the point-to-simplex field. + setpoint2sh(*pnewpoint, NULL); + if (b->metric && (bgm != NULL)) { + setpoint2bgmtet(*pnewpoint, NULL); + } + } + // Initialize the point marker (starting from in->firstnumber). + setpointmark(*pnewpoint, (int) (points->items) - (!in->firstnumber)); + // Clear all flags. + ((int *) (*pnewpoint))[pointmarkindex + 1] = 0; + // Initialize (set) the point type. + setpointtype(*pnewpoint, vtype); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// initializepools() Calculate the sizes of the point, tetrahedron, and // +// subface. Initialize their memory pools. // +// // +// This routine also computes the indices 'pointmarkindex', 'point2simindex',// +// 'point2pbcptindex', 'elemattribindex', and 'volumeboundindex'. They are // +// used to find values within each point and tetrahedron, respectively. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::initializepools() +{ + int pointsize = 0, elesize = 0, shsize = 0; + int i; + + if (b->verbose) { + printf(" Initializing memorypools.\n"); + printf(" tetrahedron per block: %d.\n", b->tetrahedraperblock); + } + + inittables(); + + // There are three input point lists available, which are in, addin, + // and bgm->in. These point lists may have different number of + // attributes. Decide the maximum number. + numpointattrib = in->numberofpointattributes; + if (bgm != NULL) { + if (bgm->in->numberofpointattributes > numpointattrib) { + numpointattrib = bgm->in->numberofpointattributes; + } + } + if (addin != NULL) { + if (addin->numberofpointattributes > numpointattrib) { + numpointattrib = addin->numberofpointattributes; + } + } + if (b->weighted || b->flipinsert) { // -w or -L. + // The internal number of point attribute needs to be at least 1 + // (for storing point weights). + if (numpointattrib == 0) { + numpointattrib = 1; + } + } + + // Default varconstraint = 0; + if (in->segmentconstraintlist || in->facetconstraintlist) { + checkconstraints = 1; + } + if (b->plc || b->refine) { + // Save the insertion radius for Steiner points if boundaries + // are allowed be split. + if (!b->nobisect || checkconstraints) { + useinsertradius = 1; + } + } + + // The index within each point at which its metric tensor is found. + // Each vertex has three coordinates. + if (b->psc) { + // '-s' option (PSC), the u,v coordinates are provided. + pointmtrindex = 5 + numpointattrib; + // The index within each point at which its u, v coordinates are found. + // Comment: They are saved after the list of point attributes. + pointparamindex = pointmtrindex - 2; + } else { + pointmtrindex = 3 + numpointattrib; + } + // For '-m' option. A tensor field is provided (*.mtr or *.b.mtr file). + if (b->metric) { + // Decide the size (1, 3, or 6) of the metric tensor. + if (bgm != (tetgenmesh *) NULL) { + // A background mesh is allocated. It may not exist though. + sizeoftensor = (bgm->in != (tetgenio *) NULL) ? + bgm->in->numberofpointmtrs : in->numberofpointmtrs; + } else { + // No given background mesh - Itself is a background mesh. + sizeoftensor = in->numberofpointmtrs; + } + // Make sure sizeoftensor is at least 1. + sizeoftensor = (sizeoftensor > 0) ? sizeoftensor : 1; + } else { + // For '-q' option. Make sure to have space for saving a scalar value. + sizeoftensor = b->quality ? 1 : 0; + } + if (useinsertradius) { + // Increase a space (REAL) for saving point insertion radius, it is + // saved directly after the metric. + sizeoftensor++; + } + pointinsradiusindex = pointmtrindex + sizeoftensor - 1; + // The index within each point at which an element pointer is found, where + // the index is measured in pointers. Ensure the index is aligned to a + // sizeof(tetrahedron)-byte address. + point2simindex = ((pointmtrindex + sizeoftensor) * sizeof(REAL) + + sizeof(tetrahedron) - 1) / sizeof(tetrahedron); + if (b->plc || b->refine || b->voroout) { + // Increase the point size by three pointers, which are: + // - a pointer to a tet, read by point2tet(); + // - a pointer to a parent point, read by point2ppt()). + // - a pointer to a subface or segment, read by point2sh(); + if (b->metric && (bgm != (tetgenmesh *) NULL)) { + // Increase one pointer into the background mesh, point2bgmtet(). + pointsize = (point2simindex + 4) * sizeof(tetrahedron); + } else { + pointsize = (point2simindex + 3) * sizeof(tetrahedron); + } + } else { + // Increase the point size by two pointer, which are: + // - a pointer to a tet, read by point2tet(); + // - a pointer to a parent point, read by point2ppt()). -- Used by btree. + pointsize = (point2simindex + 2) * sizeof(tetrahedron); + } + // The index within each point at which the boundary marker is found, + // Ensure the point marker is aligned to a sizeof(int)-byte address. + pointmarkindex = (pointsize + sizeof(int) - 1) / sizeof(int); + // Now point size is the ints (indicated by pointmarkindex) plus: + // - an integer for boundary marker; + // - an integer for vertex type; + // - an integer for geometry tag (optional, -s option). + pointsize = (pointmarkindex + 2 + (b->psc ? 1 : 0)) * sizeof(tetrahedron); + + // Initialize the pool of vertices. + points = new memorypool(pointsize, b->vertexperblock, sizeof(REAL), 0); + + if (b->verbose) { + printf(" Size of a point: %d bytes.\n", points->itembytes); + } + + // Initialize the infinite vertex. + dummypoint = (point) new char[pointsize]; + // Initialize all fields of this point. + dummypoint[0] = 0.0; + dummypoint[1] = 0.0; + dummypoint[2] = 0.0; + for (i = 0; i < numpointattrib; i++) { + dummypoint[3 + i] = 0.0; + } + // Initialize the metric tensor. + for (i = 0; i < sizeoftensor; i++) { + dummypoint[pointmtrindex + i] = 0.0; + } + setpoint2tet(dummypoint, NULL); + setpoint2ppt(dummypoint, NULL); + if (b->plc || b->psc || b->refine) { + // Initialize the point-to-simplex field. + setpoint2sh(dummypoint, NULL); + if (b->metric && (bgm != NULL)) { + setpoint2bgmtet(dummypoint, NULL); + } + } + // Initialize the point marker (starting from in->firstnumber). + setpointmark(dummypoint, -1); // The unique marker for dummypoint. + // Clear all flags. + ((int *) (dummypoint))[pointmarkindex + 1] = 0; + // Initialize (set) the point type. + setpointtype(dummypoint, UNUSEDVERTEX); // Does not matter. + + // The number of bytes occupied by a tetrahedron is varying by the user- + // specified options. The contents of the first 12 pointers are listed + // in the following table: + // [0] |__ neighbor at f0 __| + // [1] |__ neighbor at f1 __| + // [2] |__ neighbor at f2 __| + // [3] |__ neighbor at f3 __| + // [4] |_____ vertex p0 ____| + // [5] |_____ vertex p1 ____| + // [6] |_____ vertex p2 ____| + // [7] |_____ vertex p3 ____| + // [8] |__ segments array __| (used by -p) + // [9] |__ subfaces array __| (used by -p) + // [10] |_____ reserved _____| + // [11] |___ elem marker ____| (used as an integer) + + elesize = 12 * sizeof(tetrahedron); + + // The index to find the element markers. An integer containing varies + // flags and element counter. + if (!(sizeof(int) <= sizeof(tetrahedron)) || + ((sizeof(tetrahedron) % sizeof(int)))) { + terminatetetgen(this, 2); + } + elemmarkerindex = (elesize - sizeof(tetrahedron)) / sizeof(int); + + // The actual number of element attributes. Note that if the + // `b->regionattrib' flag is set, an additional attribute will be added. + numelemattrib = in->numberoftetrahedronattributes + (b->regionattrib > 0); + + // The index within each element at which its attributes are found, where + // the index is measured in REALs. + elemattribindex = (elesize + sizeof(REAL) - 1) / sizeof(REAL); + // The index within each element at which the maximum volume bound is + // found, where the index is measured in REALs. + volumeboundindex = elemattribindex + numelemattrib; + // If element attributes or an constraint are needed, increase the number + // of bytes occupied by an element. + if (b->varvolume) { + elesize = (volumeboundindex + 1) * sizeof(REAL); + } else if (numelemattrib > 0) { + elesize = volumeboundindex * sizeof(REAL); + } + + + // Having determined the memory size of an element, initialize the pool. + tetrahedrons = new memorypool(elesize, b->tetrahedraperblock, sizeof(void *), + 16); + + if (b->verbose) { + printf(" Size of a tetrahedron: %d (%d) bytes.\n", elesize, + tetrahedrons->itembytes); + } + + if (b->plc || b->refine) { // if (b->useshelles) { + // The number of bytes occupied by a subface. The list of pointers + // stored in a subface are: three to other subfaces, three to corners, + // three to subsegments, two to tetrahedra. + shsize = 11 * sizeof(shellface); + // The index within each subface at which the maximum area bound is + // found, where the index is measured in REALs. + areaboundindex = (shsize + sizeof(REAL) - 1) / sizeof(REAL); + // If -q switch is in use, increase the number of bytes occupied by + // a subface for saving maximum area bound. + if (checkconstraints) { + shsize = (areaboundindex + 1) * sizeof(REAL); + } else { + shsize = areaboundindex * sizeof(REAL); + } + // The index within subface at which the facet marker is found. Ensure + // the marker is aligned to a sizeof(int)-byte address. + shmarkindex = (shsize + sizeof(int) - 1) / sizeof(int); + // Increase the number of bytes by two or three integers, one for facet + // marker, one for shellface type and flags, and optionally one + // for storing facet index (for mesh refinement). + shsize = (shmarkindex + 2 + useinsertradius) * sizeof(shellface); + + // Initialize the pool of subfaces. Each subface record is eight-byte + // aligned so it has room to store an edge version (from 0 to 5) in + // the least three bits. + subfaces = new memorypool(shsize, b->shellfaceperblock, sizeof(void *), 8); + + if (b->verbose) { + printf(" Size of a shellface: %d (%d) bytes.\n", shsize, + subfaces->itembytes); + } + + // Initialize the pool of subsegments. The subsegment's record is same + // with subface. + subsegs = new memorypool(shsize, b->shellfaceperblock, sizeof(void *), 8); + + // Initialize the pool for tet-subseg connections. + tet2segpool = new memorypool(6 * sizeof(shellface), b->shellfaceperblock, + sizeof(void *), 0); + // Initialize the pool for tet-subface connections. + tet2subpool = new memorypool(4 * sizeof(shellface), b->shellfaceperblock, + sizeof(void *), 0); + + // Initialize arraypools for segment & facet recovery. + subsegstack = new arraypool(sizeof(face), 10); + subfacstack = new arraypool(sizeof(face), 10); + subvertstack = new arraypool(sizeof(point), 8); + + // Initialize arraypools for surface point insertion/deletion. + caveshlist = new arraypool(sizeof(face), 8); + caveshbdlist = new arraypool(sizeof(face), 8); + cavesegshlist = new arraypool(sizeof(face), 4); + + cavetetshlist = new arraypool(sizeof(face), 8); + cavetetseglist = new arraypool(sizeof(face), 8); + caveencshlist = new arraypool(sizeof(face), 8); + caveencseglist = new arraypool(sizeof(face), 8); + } + + // Initialize the pools for flips. + flippool = new memorypool(sizeof(badface), 1024, sizeof(void *), 0); + unflipqueue = new arraypool(sizeof(badface), 10); + + // Initialize the arraypools for point insertion. + cavetetlist = new arraypool(sizeof(triface), 10); + cavebdrylist = new arraypool(sizeof(triface), 10); + caveoldtetlist = new arraypool(sizeof(triface), 10); + cavetetvertlist = new arraypool(sizeof(point), 10); +} + +//// //// +//// //// +//// mempool_cxx ////////////////////////////////////////////////////////////// + +//// geom_cxx ///////////////////////////////////////////////////////////////// +//// //// +//// //// + +// PI is the ratio of a circle's circumference to its diameter. +REAL tetgenmesh::PI = 3.14159265358979323846264338327950288419716939937510582; + +/////////////////////////////////////////////////////////////////////////////// +// // +// insphere_s() Insphere test with symbolic perturbation. // +// // +// Given four points pa, pb, pc, and pd, test if the point pe lies inside or // +// outside the circumscribed sphere of the four points. // +// // +// Here we assume that the 3d orientation of the point sequence {pa, pb, pc, // +// pd} is positive (NOT zero), i.e., pd lies above the plane passing through // +// points pa, pb, and pc. Otherwise, the returned sign is flipped. // +// // +// Return a positive value (> 0) if pe lies inside, a negative value (< 0) // +// if pe lies outside the sphere, the returned value will not be zero. // +// // +/////////////////////////////////////////////////////////////////////////////// + +REAL tetgenmesh::insphere_s(REAL* pa, REAL* pb, REAL* pc, REAL* pd, REAL* pe) +{ + REAL sign; + + sign = insphere(pa, pb, pc, pd, pe); + if (sign != 0.0) { + return sign; + } + + // Symbolic perturbation. + point pt[5], swappt; + REAL oriA, oriB; + int swaps, count; + int n, i; + + pt[0] = pa; + pt[1] = pb; + pt[2] = pc; + pt[3] = pd; + pt[4] = pe; + + // Sort the five points such that their indices are in the increasing + // order. An optimized bubble sort algorithm is used, i.e., it has + // the worst case O(n^2) runtime, but it is usually much faster. + swaps = 0; // Record the total number of swaps. + n = 5; + do { + count = 0; + n = n - 1; + for (i = 0; i < n; i++) { + if (pointmark(pt[i]) > pointmark(pt[i+1])) { + swappt = pt[i]; pt[i] = pt[i+1]; pt[i+1] = swappt; + count++; + } + } + swaps += count; + } while (count > 0); // Continue if some points are swapped. + + oriA = orient3d(pt[1], pt[2], pt[3], pt[4]); + if (oriA != 0.0) { + // Flip the sign if there are odd number of swaps. + if ((swaps % 2) != 0) oriA = -oriA; + return oriA; + } + + oriB = -orient3d(pt[0], pt[2], pt[3], pt[4]); + if (oriB == 0.0) { + terminatetetgen(this, 2); + } + // Flip the sign if there are odd number of swaps. + if ((swaps % 2) != 0) oriB = -oriB; + return oriB; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// orient4d_s() 4d orientation test with symbolic perturbation. // +// // +// Given four lifted points pa', pb', pc', and pd' in R^4,test if the lifted // +// point pe' in R^4 lies below or above the hyperplane passing through the // +// four points pa', pb', pc', and pd'. // +// // +// Here we assume that the 3d orientation of the point sequence {pa, pb, pc, // +// pd} is positive (NOT zero), i.e., pd lies above the plane passing through // +// the points pa, pb, and pc. Otherwise, the returned sign is flipped. // +// // +// Return a positive value (> 0) if pe' lies below, a negative value (< 0) // +// if pe' lies above the hyperplane, the returned value should not be zero. // +// // +/////////////////////////////////////////////////////////////////////////////// + +REAL tetgenmesh::orient4d_s(REAL* pa, REAL* pb, REAL* pc, REAL* pd, REAL* pe, + REAL aheight, REAL bheight, REAL cheight, + REAL dheight, REAL eheight) +{ + REAL sign; + + sign = orient4d(pa, pb, pc, pd, pe, + aheight, bheight, cheight, dheight, eheight); + if (sign != 0.0) { + return sign; + } + + // Symbolic perturbation. + point pt[5], swappt; + REAL oriA, oriB; + int swaps, count; + int n, i; + + pt[0] = pa; + pt[1] = pb; + pt[2] = pc; + pt[3] = pd; + pt[4] = pe; + + // Sort the five points such that their indices are in the increasing + // order. An optimized bubble sort algorithm is used, i.e., it has + // the worst case O(n^2) runtime, but it is usually much faster. + swaps = 0; // Record the total number of swaps. + n = 5; + do { + count = 0; + n = n - 1; + for (i = 0; i < n; i++) { + if (pointmark(pt[i]) > pointmark(pt[i+1])) { + swappt = pt[i]; pt[i] = pt[i+1]; pt[i+1] = swappt; + count++; + } + } + swaps += count; + } while (count > 0); // Continue if some points are swapped. + + oriA = orient3d(pt[1], pt[2], pt[3], pt[4]); + if (oriA != 0.0) { + // Flip the sign if there are odd number of swaps. + if ((swaps % 2) != 0) oriA = -oriA; + return oriA; + } + + oriB = -orient3d(pt[0], pt[2], pt[3], pt[4]); + if (oriB == 0.0) { + terminatetetgen(this, 2); + } + // Flip the sign if there are odd number of swaps. + if ((swaps % 2) != 0) oriB = -oriB; + return oriB; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// tri_edge_test() Triangle-edge intersection test. // +// // +// This routine takes a triangle T (with vertices A, B, C) and an edge E (P, // +// Q) in 3D, and tests if they intersect each other. // +// // +// If the point 'R' is not NULL, it lies strictly above the plane defined by // +// A, B, C. It is used in test when T and E are coplanar. // +// // +// If T and E intersect each other, they may intersect in different ways. If // +// 'level' > 0, their intersection type will be reported 'types' and 'pos'. // +// // +// The return value indicates one of the following cases: // +// - 0, T and E are disjoint. // +// - 1, T and E intersect each other. // +// - 2, T and E are not coplanar. They intersect at a single point. // +// - 4, T and E are coplanar. They intersect at a single point or a line // +// segment (if types[1] != DISJOINT). // +// // +/////////////////////////////////////////////////////////////////////////////// + +#define SETVECTOR3(V, a0, a1, a2) (V)[0] = (a0); (V)[1] = (a1); (V)[2] = (a2) + +#define SWAP2(a0, a1, tmp) (tmp) = (a0); (a0) = (a1); (a1) = (tmp) + +int tetgenmesh::tri_edge_2d(point A, point B, point C, point P, point Q, + point R, int level, int *types, int *pos) +{ + point U[3], V[3]; // The permuted vectors of points. + int pu[3], pv[3]; // The original positions of points. + REAL abovept[3]; + REAL sA, sB, sC; + REAL s1, s2, s3, s4; + int z1; + + if (R == NULL) { + // Calculate a lift point. + if (1) { + REAL n[3], len; + // Calculate a lift point, saved in dummypoint. + facenormal(A, B, C, n, 1, NULL); + len = sqrt(dot(n, n)); + if (len != 0) { + n[0] /= len; + n[1] /= len; + n[2] /= len; + len = distance(A, B); + len += distance(B, C); + len += distance(C, A); + len /= 3.0; + R = abovept; //dummypoint; + R[0] = A[0] + len * n[0]; + R[1] = A[1] + len * n[1]; + R[2] = A[2] + len * n[2]; + } else { + // The triangle [A,B,C] is (nearly) degenerate, i.e., it is (close) + // to a line. We need a line-line intersection test. + // !!! A non-save return value.!!! + return 0; // DISJOINT + } + } + } + + // Test A's, B's, and C's orientations wrt plane PQR. + sA = orient3d(P, Q, R, A); + sB = orient3d(P, Q, R, B); + sC = orient3d(P, Q, R, C); + + + if (sA < 0) { + if (sB < 0) { + if (sC < 0) { // (---). + return 0; + } else { + if (sC > 0) { // (--+). + // All points are in the right positions. + SETVECTOR3(U, A, B, C); // I3 + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 0, 1, 2); + z1 = 0; + } else { // (--0). + SETVECTOR3(U, A, B, C); // I3 + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 0, 1, 2); + z1 = 1; + } + } + } else { + if (sB > 0) { + if (sC < 0) { // (-+-). + SETVECTOR3(U, C, A, B); // PT = ST + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 2, 0, 1); + SETVECTOR3(pv, 0, 1, 2); + z1 = 0; + } else { + if (sC > 0) { // (-++). + SETVECTOR3(U, B, C, A); // PT = ST x ST + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 1, 2, 0); + SETVECTOR3(pv, 1, 0, 2); + z1 = 0; + } else { // (-+0). + SETVECTOR3(U, C, A, B); // PT = ST + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 2, 0, 1); + SETVECTOR3(pv, 0, 1, 2); + z1 = 2; + } + } + } else { + if (sC < 0) { // (-0-). + SETVECTOR3(U, C, A, B); // PT = ST + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 2, 0, 1); + SETVECTOR3(pv, 0, 1, 2); + z1 = 1; + } else { + if (sC > 0) { // (-0+). + SETVECTOR3(U, B, C, A); // PT = ST x ST + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 1, 2, 0); + SETVECTOR3(pv, 1, 0, 2); + z1 = 2; + } else { // (-00). + SETVECTOR3(U, B, C, A); // PT = ST x ST + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 1, 2, 0); + SETVECTOR3(pv, 1, 0, 2); + z1 = 3; + } + } + } + } + } else { + if (sA > 0) { + if (sB < 0) { + if (sC < 0) { // (+--). + SETVECTOR3(U, B, C, A); // PT = ST x ST + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 1, 2, 0); + SETVECTOR3(pv, 0, 1, 2); + z1 = 0; + } else { + if (sC > 0) { // (+-+). + SETVECTOR3(U, C, A, B); // PT = ST + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 2, 0, 1); + SETVECTOR3(pv, 1, 0, 2); + z1 = 0; + } else { // (+-0). + SETVECTOR3(U, C, A, B); // PT = ST + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 2, 0, 1); + SETVECTOR3(pv, 1, 0, 2); + z1 = 2; + } + } + } else { + if (sB > 0) { + if (sC < 0) { // (++-). + SETVECTOR3(U, A, B, C); // I3 + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 1, 0, 2); + z1 = 0; + } else { + if (sC > 0) { // (+++). + return 0; + } else { // (++0). + SETVECTOR3(U, A, B, C); // I3 + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 1, 0, 2); + z1 = 1; + } + } + } else { // (+0#) + if (sC < 0) { // (+0-). + SETVECTOR3(U, B, C, A); // PT = ST x ST + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 1, 2, 0); + SETVECTOR3(pv, 0, 1, 2); + z1 = 2; + } else { + if (sC > 0) { // (+0+). + SETVECTOR3(U, C, A, B); // PT = ST + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 2, 0, 1); + SETVECTOR3(pv, 1, 0, 2); + z1 = 1; + } else { // (+00). + SETVECTOR3(U, B, C, A); // PT = ST x ST + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 1, 2, 0); + SETVECTOR3(pv, 0, 1, 2); + z1 = 3; + } + } + } + } + } else { + if (sB < 0) { + if (sC < 0) { // (0--). + SETVECTOR3(U, B, C, A); // PT = ST x ST + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 1, 2, 0); + SETVECTOR3(pv, 0, 1, 2); + z1 = 1; + } else { + if (sC > 0) { // (0-+). + SETVECTOR3(U, A, B, C); // I3 + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 0, 1, 2); + z1 = 2; + } else { // (0-0). + SETVECTOR3(U, C, A, B); // PT = ST + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 2, 0, 1); + SETVECTOR3(pv, 1, 0, 2); + z1 = 3; + } + } + } else { + if (sB > 0) { + if (sC < 0) { // (0+-). + SETVECTOR3(U, A, B, C); // I3 + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 1, 0, 2); + z1 = 2; + } else { + if (sC > 0) { // (0++). + SETVECTOR3(U, B, C, A); // PT = ST x ST + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 1, 2, 0); + SETVECTOR3(pv, 1, 0, 2); + z1 = 1; + } else { // (0+0). + SETVECTOR3(U, C, A, B); // PT = ST + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 2, 0, 1); + SETVECTOR3(pv, 0, 1, 2); + z1 = 3; + } + } + } else { // (00#) + if (sC < 0) { // (00-). + SETVECTOR3(U, A, B, C); // I3 + SETVECTOR3(V, Q, P, R); // PL = SL + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 1, 0, 2); + z1 = 3; + } else { + if (sC > 0) { // (00+). + SETVECTOR3(U, A, B, C); // I3 + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 0, 1, 2); + z1 = 3; + } else { // (000) + // Not possible unless ABC is degenerate. + // Avoiding compiler warnings. + SETVECTOR3(U, A, B, C); // I3 + SETVECTOR3(V, P, Q, R); // I2 + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 0, 1, 2); + z1 = 4; + } + } + } + } + } + } + + s1 = orient3d(U[0], U[2], R, V[1]); // A, C, R, Q + s2 = orient3d(U[1], U[2], R, V[0]); // B, C, R, P + + if (s1 > 0) { + return 0; + } + if (s2 < 0) { + return 0; + } + + if (level == 0) { + return 1; // They are intersected. + } + + + if (z1 == 1) { + if (s1 == 0) { // (0###) + // C = Q. + types[0] = (int) SHAREVERT; + pos[0] = pu[2]; // C + pos[1] = pv[1]; // Q + types[1] = (int) DISJOINT; + } else { + if (s2 == 0) { // (#0##) + // C = P. + types[0] = (int) SHAREVERT; + pos[0] = pu[2]; // C + pos[1] = pv[0]; // P + types[1] = (int) DISJOINT; + } else { // (-+##) + // C in [P, Q]. + types[0] = (int) ACROSSVERT; + pos[0] = pu[2]; // C + pos[1] = pv[0]; // [P, Q] + types[1] = (int) DISJOINT; + } + } + return 4; + } + + s3 = orient3d(U[0], U[2], R, V[0]); // A, C, R, P + s4 = orient3d(U[1], U[2], R, V[1]); // B, C, R, Q + + if (z1 == 0) { // (tritri-03) + if (s1 < 0) { + if (s3 > 0) { + if (s4 > 0) { + // [P, Q] overlaps [k, l] (-+++). + types[0] = (int) ACROSSEDGE; + pos[0] = pu[2]; // [C, A] + pos[1] = pv[0]; // [P, Q] + types[1] = (int) TOUCHFACE; + pos[2] = 3; // [A, B, C] + pos[3] = pv[1]; // Q + } else { + if (s4 == 0) { + // Q = l, [P, Q] contains [k, l] (-++0). + types[0] = (int) ACROSSEDGE; + pos[0] = pu[2]; // [C, A] + pos[1] = pv[0]; // [P, Q] + types[1] = (int) TOUCHEDGE; + pos[2] = pu[1]; // [B, C] + pos[3] = pv[1]; // Q + } else { // s4 < 0 + // [P, Q] contains [k, l] (-++-). + types[0] = (int) ACROSSEDGE; + pos[0] = pu[2]; // [C, A] + pos[1] = pv[0]; // [P, Q] + types[1] = (int) ACROSSEDGE; + pos[2] = pu[1]; // [B, C] + pos[3] = pv[0]; // [P, Q] + } + } + } else { + if (s3 == 0) { + if (s4 > 0) { + // P = k, [P, Q] in [k, l] (-+0+). + types[0] = (int) TOUCHEDGE; + pos[0] = pu[2]; // [C, A] + pos[1] = pv[0]; // P + types[1] = (int) TOUCHFACE; + pos[2] = 3; // [A, B, C] + pos[3] = pv[1]; // Q + } else { + if (s4 == 0) { + // [P, Q] = [k, l] (-+00). + types[0] = (int) TOUCHEDGE; + pos[0] = pu[2]; // [C, A] + pos[1] = pv[0]; // P + types[1] = (int) TOUCHEDGE; + pos[2] = pu[1]; // [B, C] + pos[3] = pv[1]; // Q + } else { + // P = k, [P, Q] contains [k, l] (-+0-). + types[0] = (int) TOUCHEDGE; + pos[0] = pu[2]; // [C, A] + pos[1] = pv[0]; // P + types[1] = (int) ACROSSEDGE; + pos[2] = pu[1]; // [B, C] + pos[3] = pv[0]; // [P, Q] + } + } + } else { // s3 < 0 + if (s2 > 0) { + if (s4 > 0) { + // [P, Q] in [k, l] (-+-+). + types[0] = (int) TOUCHFACE; + pos[0] = 3; // [A, B, C] + pos[1] = pv[0]; // P + types[1] = (int) TOUCHFACE; + pos[2] = 3; // [A, B, C] + pos[3] = pv[1]; // Q + } else { + if (s4 == 0) { + // Q = l, [P, Q] in [k, l] (-+-0). + types[0] = (int) TOUCHFACE; + pos[0] = 3; // [A, B, C] + pos[1] = pv[0]; // P + types[1] = (int) TOUCHEDGE; + pos[2] = pu[1]; // [B, C] + pos[3] = pv[1]; // Q + } else { // s4 < 0 + // [P, Q] overlaps [k, l] (-+--). + types[0] = (int) TOUCHFACE; + pos[0] = 3; // [A, B, C] + pos[1] = pv[0]; // P + types[1] = (int) ACROSSEDGE; + pos[2] = pu[1]; // [B, C] + pos[3] = pv[0]; // [P, Q] + } + } + } else { // s2 == 0 + // P = l (#0##). + types[0] = (int) TOUCHEDGE; + pos[0] = pu[1]; // [B, C] + pos[1] = pv[0]; // P + types[1] = (int) DISJOINT; + } + } + } + } else { // s1 == 0 + // Q = k (0####) + types[0] = (int) TOUCHEDGE; + pos[0] = pu[2]; // [C, A] + pos[1] = pv[1]; // Q + types[1] = (int) DISJOINT; + } + } else if (z1 == 2) { // (tritri-23) + if (s1 < 0) { + if (s3 > 0) { + if (s4 > 0) { + // [P, Q] overlaps [A, l] (-+++). + types[0] = (int) ACROSSVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // [P, Q] + types[1] = (int) TOUCHFACE; + pos[2] = 3; // [A, B, C] + pos[3] = pv[1]; // Q + } else { + if (s4 == 0) { + // Q = l, [P, Q] contains [A, l] (-++0). + types[0] = (int) ACROSSVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // [P, Q] + types[1] = (int) TOUCHEDGE; + pos[2] = pu[1]; // [B, C] + pos[3] = pv[1]; // Q + } else { // s4 < 0 + // [P, Q] contains [A, l] (-++-). + types[0] = (int) ACROSSVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // [P, Q] + types[1] = (int) ACROSSEDGE; + pos[2] = pu[1]; // [B, C] + pos[3] = pv[0]; // [P, Q] + } + } + } else { + if (s3 == 0) { + if (s4 > 0) { + // P = A, [P, Q] in [A, l] (-+0+). + types[0] = (int) SHAREVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // P + types[1] = (int) TOUCHFACE; + pos[2] = 3; // [A, B, C] + pos[3] = pv[1]; // Q + } else { + if (s4 == 0) { + // [P, Q] = [A, l] (-+00). + types[0] = (int) SHAREVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // P + types[1] = (int) TOUCHEDGE; + pos[2] = pu[1]; // [B, C] + pos[3] = pv[1]; // Q + } else { // s4 < 0 + // Q = l, [P, Q] in [A, l] (-+0-). + types[0] = (int) SHAREVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // P + types[1] = (int) ACROSSEDGE; + pos[2] = pu[1]; // [B, C] + pos[3] = pv[0]; // [P, Q] + } + } + } else { // s3 < 0 + if (s2 > 0) { + if (s4 > 0) { + // [P, Q] in [A, l] (-+-+). + types[0] = (int) TOUCHFACE; + pos[0] = 3; // [A, B, C] + pos[1] = pv[0]; // P + types[0] = (int) TOUCHFACE; + pos[0] = 3; // [A, B, C] + pos[1] = pv[1]; // Q + } else { + if (s4 == 0) { + // Q = l, [P, Q] in [A, l] (-+-0). + types[0] = (int) TOUCHFACE; + pos[0] = 3; // [A, B, C] + pos[1] = pv[0]; // P + types[0] = (int) TOUCHEDGE; + pos[0] = pu[1]; // [B, C] + pos[1] = pv[1]; // Q + } else { // s4 < 0 + // [P, Q] overlaps [A, l] (-+--). + types[0] = (int) TOUCHFACE; + pos[0] = 3; // [A, B, C] + pos[1] = pv[0]; // P + types[0] = (int) ACROSSEDGE; + pos[0] = pu[1]; // [B, C] + pos[1] = pv[0]; // [P, Q] + } + } + } else { // s2 == 0 + // P = l (#0##). + types[0] = (int) TOUCHEDGE; + pos[0] = pu[1]; // [B, C] + pos[1] = pv[0]; // P + types[1] = (int) DISJOINT; + } + } + } + } else { // s1 == 0 + // Q = A (0###). + types[0] = (int) SHAREVERT; + pos[0] = pu[0]; // A + pos[1] = pv[1]; // Q + types[1] = (int) DISJOINT; + } + } else if (z1 == 3) { // (tritri-33) + if (s1 < 0) { + if (s3 > 0) { + if (s4 > 0) { + // [P, Q] overlaps [A, B] (-+++). + types[0] = (int) ACROSSVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // [P, Q] + types[1] = (int) TOUCHEDGE; + pos[2] = pu[0]; // [A, B] + pos[3] = pv[1]; // Q + } else { + if (s4 == 0) { + // Q = B, [P, Q] contains [A, B] (-++0). + types[0] = (int) ACROSSVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // [P, Q] + types[1] = (int) SHAREVERT; + pos[2] = pu[1]; // B + pos[3] = pv[1]; // Q + } else { // s4 < 0 + // [P, Q] contains [A, B] (-++-). + types[0] = (int) ACROSSVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // [P, Q] + types[1] = (int) ACROSSVERT; + pos[2] = pu[1]; // B + pos[3] = pv[0]; // [P, Q] + } + } + } else { + if (s3 == 0) { + if (s4 > 0) { + // P = A, [P, Q] in [A, B] (-+0+). + types[0] = (int) SHAREVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // P + types[1] = (int) TOUCHEDGE; + pos[2] = pu[0]; // [A, B] + pos[3] = pv[1]; // Q + } else { + if (s4 == 0) { + // [P, Q] = [A, B] (-+00). + types[0] = (int) SHAREEDGE; + pos[0] = pu[0]; // [A, B] + pos[1] = pv[0]; // [P, Q] + types[1] = (int) DISJOINT; + } else { // s4 < 0 + // P= A, [P, Q] in [A, B] (-+0-). + types[0] = (int) SHAREVERT; + pos[0] = pu[0]; // A + pos[1] = pv[0]; // P + types[1] = (int) ACROSSVERT; + pos[2] = pu[1]; // B + pos[3] = pv[0]; // [P, Q] + } + } + } else { // s3 < 0 + if (s2 > 0) { + if (s4 > 0) { + // [P, Q] in [A, B] (-+-+). + types[0] = (int) TOUCHEDGE; + pos[0] = pu[0]; // [A, B] + pos[1] = pv[0]; // P + types[1] = (int) TOUCHEDGE; + pos[2] = pu[0]; // [A, B] + pos[3] = pv[1]; // Q + } else { + if (s4 == 0) { + // Q = B, [P, Q] in [A, B] (-+-0). + types[0] = (int) TOUCHEDGE; + pos[0] = pu[0]; // [A, B] + pos[1] = pv[0]; // P + types[1] = (int) SHAREVERT; + pos[2] = pu[1]; // B + pos[3] = pv[1]; // Q + } else { // s4 < 0 + // [P, Q] overlaps [A, B] (-+--). + types[0] = (int) TOUCHEDGE; + pos[0] = pu[0]; // [A, B] + pos[1] = pv[0]; // P + types[1] = (int) ACROSSVERT; + pos[2] = pu[1]; // B + pos[3] = pv[0]; // [P, Q] + } + } + } else { // s2 == 0 + // P = B (#0##). + types[0] = (int) SHAREVERT; + pos[0] = pu[1]; // B + pos[1] = pv[0]; // P + types[1] = (int) DISJOINT; + } + } + } + } else { // s1 == 0 + // Q = A (0###). + types[0] = (int) SHAREVERT; + pos[0] = pu[0]; // A + pos[1] = pv[1]; // Q + types[1] = (int) DISJOINT; + } + } + + return 4; +} + +int tetgenmesh::tri_edge_tail(point A,point B,point C,point P,point Q,point R, + REAL sP,REAL sQ,int level,int *types,int *pos) +{ + point U[3], V[3]; //, Ptmp; + int pu[3], pv[3]; //, itmp; + REAL s1, s2, s3; + int z1; + + + if (sP < 0) { + if (sQ < 0) { // (--) disjoint + return 0; + } else { + if (sQ > 0) { // (-+) + SETVECTOR3(U, A, B, C); + SETVECTOR3(V, P, Q, R); + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 0, 1, 2); + z1 = 0; + } else { // (-0) + SETVECTOR3(U, A, B, C); + SETVECTOR3(V, P, Q, R); + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 0, 1, 2); + z1 = 1; + } + } + } else { + if (sP > 0) { // (+-) + if (sQ < 0) { + SETVECTOR3(U, A, B, C); + SETVECTOR3(V, Q, P, R); // P and Q are flipped. + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 1, 0, 2); + z1 = 0; + } else { + if (sQ > 0) { // (++) disjoint + return 0; + } else { // (+0) + SETVECTOR3(U, B, A, C); // A and B are flipped. + SETVECTOR3(V, P, Q, R); + SETVECTOR3(pu, 1, 0, 2); + SETVECTOR3(pv, 0, 1, 2); + z1 = 1; + } + } + } else { // sP == 0 + if (sQ < 0) { // (0-) + SETVECTOR3(U, A, B, C); + SETVECTOR3(V, Q, P, R); // P and Q are flipped. + SETVECTOR3(pu, 0, 1, 2); + SETVECTOR3(pv, 1, 0, 2); + z1 = 1; + } else { + if (sQ > 0) { // (0+) + SETVECTOR3(U, B, A, C); // A and B are flipped. + SETVECTOR3(V, Q, P, R); // P and Q are flipped. + SETVECTOR3(pu, 1, 0, 2); + SETVECTOR3(pv, 1, 0, 2); + z1 = 1; + } else { // (00) + // A, B, C, P, and Q are coplanar. + z1 = 2; + } + } + } + } + + if (z1 == 2) { + // The triangle and the edge are coplanar. + return tri_edge_2d(A, B, C, P, Q, R, level, types, pos); + } + + s1 = orient3d(U[0], U[1], V[0], V[1]); + if (s1 < 0) { + return 0; + } + + s2 = orient3d(U[1], U[2], V[0], V[1]); + if (s2 < 0) { + return 0; + } + + s3 = orient3d(U[2], U[0], V[0], V[1]); + if (s3 < 0) { + return 0; + } + + if (level == 0) { + return 1; // The are intersected. + } + + types[1] = (int) DISJOINT; // No second intersection point. + + if (z1 == 0) { + if (s1 > 0) { + if (s2 > 0) { + if (s3 > 0) { // (+++) + // [P, Q] passes interior of [A, B, C]. + types[0] = (int) ACROSSFACE; + pos[0] = 3; // interior of [A, B, C] + pos[1] = 0; // [P, Q] + } else { // s3 == 0 (++0) + // [P, Q] intersects [C, A]. + types[0] = (int) ACROSSEDGE; + pos[0] = pu[2]; // [C, A] + pos[1] = 0; // [P, Q] + } + } else { // s2 == 0 + if (s3 > 0) { // (+0+) + // [P, Q] intersects [B, C]. + types[0] = (int) ACROSSEDGE; + pos[0] = pu[1]; // [B, C] + pos[1] = 0; // [P, Q] + } else { // s3 == 0 (+00) + // [P, Q] passes C. + types[0] = (int) ACROSSVERT; + pos[0] = pu[2]; // C + pos[1] = 0; // [P, Q] + } + } + } else { // s1 == 0 + if (s2 > 0) { + if (s3 > 0) { // (0++) + // [P, Q] intersects [A, B]. + types[0] = (int) ACROSSEDGE; + pos[0] = pu[0]; // [A, B] + pos[1] = 0; // [P, Q] + } else { // s3 == 0 (0+0) + // [P, Q] passes A. + types[0] = (int) ACROSSVERT; + pos[0] = pu[0]; // A + pos[1] = 0; // [P, Q] + } + } else { // s2 == 0 + if (s3 > 0) { // (00+) + // [P, Q] passes B. + types[0] = (int) ACROSSVERT; + pos[0] = pu[1]; // B + pos[1] = 0; // [P, Q] + } + } + } + } else { // z1 == 1 + if (s1 > 0) { + if (s2 > 0) { + if (s3 > 0) { // (+++) + // Q lies in [A, B, C]. + types[0] = (int) TOUCHFACE; + pos[0] = 0; // [A, B, C] + pos[1] = pv[1]; // Q + } else { // s3 == 0 (++0) + // Q lies on [C, A]. + types[0] = (int) TOUCHEDGE; + pos[0] = pu[2]; // [C, A] + pos[1] = pv[1]; // Q + } + } else { // s2 == 0 + if (s3 > 0) { // (+0+) + // Q lies on [B, C]. + types[0] = (int) TOUCHEDGE; + pos[0] = pu[1]; // [B, C] + pos[1] = pv[1]; // Q + } else { // s3 == 0 (+00) + // Q = C. + types[0] = (int) SHAREVERT; + pos[0] = pu[2]; // C + pos[1] = pv[1]; // Q + } + } + } else { // s1 == 0 + if (s2 > 0) { + if (s3 > 0) { // (0++) + // Q lies on [A, B]. + types[0] = (int) TOUCHEDGE; + pos[0] = pu[0]; // [A, B] + pos[1] = pv[1]; // Q + } else { // s3 == 0 (0+0) + // Q = A. + types[0] = (int) SHAREVERT; + pos[0] = pu[0]; // A + pos[1] = pv[1]; // Q + } + } else { // s2 == 0 + if (s3 > 0) { // (00+) + // Q = B. + types[0] = (int) SHAREVERT; + pos[0] = pu[1]; // B + pos[1] = pv[1]; // Q + } + } + } + } + + // T and E intersect in a single point. + return 2; +} + +int tetgenmesh::tri_edge_test(point A, point B, point C, point P, point Q, + point R, int level, int *types, int *pos) +{ + REAL sP, sQ; + + // Test the locations of P and Q with respect to ABC. + sP = orient3d(A, B, C, P); + sQ = orient3d(A, B, C, Q); + + return tri_edge_tail(A, B, C, P, Q, R, sP, sQ, level, types, pos); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// tri_tri_inter() Test whether two triangle (abc) and (opq) are // +// intersecting or not. // +// // +// Return 0 if they are disjoint. Otherwise, return 1. 'type' returns one of // +// the four cases: SHAREVERTEX, SHAREEDGE, SHAREFACE, and INTERSECT. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::tri_edge_inter_tail(REAL* A, REAL* B, REAL* C, REAL* P, + REAL* Q, REAL s_p, REAL s_q) +{ + int types[2], pos[4]; + int ni; // =0, 2, 4 + + ni = tri_edge_tail(A, B, C, P, Q, NULL, s_p, s_q, 1, types, pos); + + if (ni > 0) { + if (ni == 2) { + // Get the intersection type. + if (types[0] == (int) SHAREVERT) { + return (int) SHAREVERT; + } else { + return (int) INTERSECT; + } + } else if (ni == 4) { + // There may be two intersections. + if (types[0] == (int) SHAREVERT) { + if (types[1] == (int) DISJOINT) { + return (int) SHAREVERT; + } else { + return (int) INTERSECT; + } + } else { + if (types[0] == (int) SHAREEDGE) { + return (int) SHAREEDGE; + } else { + return (int) INTERSECT; + } + } + } + } + + return (int) DISJOINT; +} + +int tetgenmesh::tri_tri_inter(REAL* A,REAL* B,REAL* C,REAL* O,REAL* P,REAL* Q) +{ + REAL s_o, s_p, s_q; + REAL s_a, s_b, s_c; + + s_o = orient3d(A, B, C, O); + s_p = orient3d(A, B, C, P); + s_q = orient3d(A, B, C, Q); + if ((s_o * s_p > 0.0) && (s_o * s_q > 0.0)) { + // o, p, q are all in the same halfspace of ABC. + return 0; // DISJOINT; + } + + s_a = orient3d(O, P, Q, A); + s_b = orient3d(O, P, Q, B); + s_c = orient3d(O, P, Q, C); + if ((s_a * s_b > 0.0) && (s_a * s_c > 0.0)) { + // a, b, c are all in the same halfspace of OPQ. + return 0; // DISJOINT; + } + + int abcop, abcpq, abcqo; + int shareedge = 0; + + abcop = tri_edge_inter_tail(A, B, C, O, P, s_o, s_p); + if (abcop == (int) INTERSECT) { + return (int) INTERSECT; + } else if (abcop == (int) SHAREEDGE) { + shareedge++; + } + abcpq = tri_edge_inter_tail(A, B, C, P, Q, s_p, s_q); + if (abcpq == (int) INTERSECT) { + return (int) INTERSECT; + } else if (abcpq == (int) SHAREEDGE) { + shareedge++; + } + abcqo = tri_edge_inter_tail(A, B, C, Q, O, s_q, s_o); + if (abcqo == (int) INTERSECT) { + return (int) INTERSECT; + } else if (abcqo == (int) SHAREEDGE) { + shareedge++; + } + if (shareedge == 3) { + // opq are coincident with abc. + return (int) SHAREFACE; + } + + // Continue to detect whether opq and abc are intersecting or not. + int opqab, opqbc, opqca; + + opqab = tri_edge_inter_tail(O, P, Q, A, B, s_a, s_b); + if (opqab == (int) INTERSECT) { + return (int) INTERSECT; + } + opqbc = tri_edge_inter_tail(O, P, Q, B, C, s_b, s_c); + if (opqbc == (int) INTERSECT) { + return (int) INTERSECT; + } + opqca = tri_edge_inter_tail(O, P, Q, C, A, s_c, s_a); + if (opqca == (int) INTERSECT) { + return (int) INTERSECT; + } + + // At this point, two triangles are not intersecting and not coincident. + // They may be share an edge, or share a vertex, or disjoint. + if (abcop == (int) SHAREEDGE) { + // op is coincident with an edge of abc. + return (int) SHAREEDGE; + } + if (abcpq == (int) SHAREEDGE) { + // pq is coincident with an edge of abc. + return (int) SHAREEDGE; + } + if (abcqo == (int) SHAREEDGE) { + // qo is coincident with an edge of abc. + return (int) SHAREEDGE; + } + + // They may share a vertex or disjoint. + if (abcop == (int) SHAREVERT) { + return (int) SHAREVERT; + } + if (abcpq == (int) SHAREVERT) { + // q is the coincident vertex. + return (int) SHAREVERT; + } + + // They are disjoint. + return (int) DISJOINT; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// lu_decmp() Compute the LU decomposition of a matrix. // +// // +// Compute the LU decomposition of a (non-singular) square matrix A using // +// partial pivoting and implicit row exchanges. The result is: // +// A = P * L * U, // +// where P is a permutation matrix, L is unit lower triangular, and U is // +// upper triangular. The factored form of A is used in combination with // +// 'lu_solve()' to solve linear equations: Ax = b, or invert a matrix. // +// // +// The inputs are a square matrix 'lu[N..n+N-1][N..n+N-1]', it's size is 'n'.// +// On output, 'lu' is replaced by the LU decomposition of a rowwise permuta- // +// tion of itself, 'ps[N..n+N-1]' is an output vector that records the row // +// permutation effected by the partial pivoting, effectively, 'ps' array // +// tells the user what the permutation matrix P is; 'd' is output as +1/-1 // +// depending on whether the number of row interchanges was even or odd, // +// respectively. // +// // +// Return true if the LU decomposition is successfully computed, otherwise, // +// return false in case that A is a singular matrix. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenmesh::lu_decmp(REAL lu[4][4], int n, int* ps, REAL* d, int N) +{ + REAL scales[4]; + REAL pivot, biggest, mult, tempf; + int pivotindex = 0; + int i, j, k; + + *d = 1.0; // No row interchanges yet. + + for (i = N; i < n + N; i++) { // For each row. + // Find the largest element in each row for row equilibration + biggest = 0.0; + for (j = N; j < n + N; j++) + if (biggest < (tempf = fabs(lu[i][j]))) + biggest = tempf; + if (biggest != 0.0) + scales[i] = 1.0 / biggest; + else { + scales[i] = 0.0; + return false; // Zero row: singular matrix. + } + ps[i] = i; // Initialize pivot sequence. + } + + for (k = N; k < n + N - 1; k++) { // For each column. + // Find the largest element in each column to pivot around. + biggest = 0.0; + for (i = k; i < n + N; i++) { + if (biggest < (tempf = fabs(lu[ps[i]][k]) * scales[ps[i]])) { + biggest = tempf; + pivotindex = i; + } + } + if (biggest == 0.0) { + return false; // Zero column: singular matrix. + } + if (pivotindex != k) { // Update pivot sequence. + j = ps[k]; + ps[k] = ps[pivotindex]; + ps[pivotindex] = j; + *d = -(*d); // ...and change the parity of d. + } + + // Pivot, eliminating an extra variable each time + pivot = lu[ps[k]][k]; + for (i = k + 1; i < n + N; i++) { + lu[ps[i]][k] = mult = lu[ps[i]][k] / pivot; + if (mult != 0.0) { + for (j = k + 1; j < n + N; j++) + lu[ps[i]][j] -= mult * lu[ps[k]][j]; + } + } + } + + // (lu[ps[n + N - 1]][n + N - 1] == 0.0) ==> A is singular. + return lu[ps[n + N - 1]][n + N - 1] != 0.0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// lu_solve() Solves the linear equation: Ax = b, after the matrix A // +// has been decomposed into the lower and upper triangular // +// matrices L and U, where A = LU. // +// // +// 'lu[N..n+N-1][N..n+N-1]' is input, not as the matrix 'A' but rather as // +// its LU decomposition, computed by the routine 'lu_decmp'; 'ps[N..n+N-1]' // +// is input as the permutation vector returned by 'lu_decmp'; 'b[N..n+N-1]' // +// is input as the right-hand side vector, and returns with the solution // +// vector. 'lu', 'n', and 'ps' are not modified by this routine and can be // +// left in place for successive calls with different right-hand sides 'b'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::lu_solve(REAL lu[4][4], int n, int* ps, REAL* b, int N) +{ + int i, j; + REAL X[4], dot; + + for (i = N; i < n + N; i++) X[i] = 0.0; + + // Vector reduction using U triangular matrix. + for (i = N; i < n + N; i++) { + dot = 0.0; + for (j = N; j < i + N; j++) + dot += lu[ps[i]][j] * X[j]; + X[i] = b[ps[i]] - dot; + } + + // Back substitution, in L triangular matrix. + for (i = n + N - 1; i >= N; i--) { + dot = 0.0; + for (j = i + 1; j < n + N; j++) + dot += lu[ps[i]][j] * X[j]; + X[i] = (X[i] - dot) / lu[ps[i]][i]; + } + + for (i = N; i < n + N; i++) b[i] = X[i]; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// incircle3d() 3D in-circle test. // +// // +// Return a negative value if pd is inside the circumcircle of the triangle // +// pa, pb, and pc. // +// // +// IMPORTANT: It assumes that [a,b] is the common edge, i.e., the two input // +// triangles are [a,b,c] and [b,a,d]. // +// // +/////////////////////////////////////////////////////////////////////////////// + +REAL tetgenmesh::incircle3d(point pa, point pb, point pc, point pd) +{ + REAL area2[2], n1[3], n2[3], c[3]; + REAL sign, r, d; + + // Calculate the areas of the two triangles [a, b, c] and [b, a, d]. + facenormal(pa, pb, pc, n1, 1, NULL); + area2[0] = dot(n1, n1); + facenormal(pb, pa, pd, n2, 1, NULL); + area2[1] = dot(n2, n2); + + if (area2[0] > area2[1]) { + // Choose [a, b, c] as the base triangle. + circumsphere(pa, pb, pc, NULL, c, &r); + d = distance(c, pd); + } else { + // Choose [b, a, d] as the base triangle. + if (area2[1] > 0) { + circumsphere(pb, pa, pd, NULL, c, &r); + d = distance(c, pc); + } else { + // The four points are collinear. This case only happens on the boundary. + return 0; // Return "not inside". + } + } + + sign = d - r; + if (fabs(sign) / r < b->epsilon) { + sign = 0; + } + + return sign; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// facenormal() Calculate the normal of the face. // +// // +// The normal of the face abc can be calculated by the cross product of 2 of // +// its 3 edge vectors. A better choice of two edge vectors will reduce the // +// numerical error during the calculation. Burdakov proved that the optimal // +// basis problem is equivalent to the minimum spanning tree problem with the // +// edge length be the functional, see Burdakov, "A greedy algorithm for the // +// optimal basis problem", BIT 37:3 (1997), 591-599. If 'pivot' > 0, the two // +// short edges in abc are chosen for the calculation. // +// // +// If 'lav' is not NULL and if 'pivot' is set, the average edge length of // +// the edges of the face [a,b,c] is returned. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::facenormal(point pa, point pb, point pc, REAL *n, int pivot, + REAL* lav) +{ + REAL v1[3], v2[3], v3[3], *pv1, *pv2; + REAL L1, L2, L3; + + v1[0] = pb[0] - pa[0]; // edge vector v1: a->b + v1[1] = pb[1] - pa[1]; + v1[2] = pb[2] - pa[2]; + v2[0] = pa[0] - pc[0]; // edge vector v2: c->a + v2[1] = pa[1] - pc[1]; + v2[2] = pa[2] - pc[2]; + + // Default, normal is calculated by: v1 x (-v2) (see Fig. fnormal). + if (pivot > 0) { + // Choose edge vectors by Burdakov's algorithm. + v3[0] = pc[0] - pb[0]; // edge vector v3: b->c + v3[1] = pc[1] - pb[1]; + v3[2] = pc[2] - pb[2]; + L1 = dot(v1, v1); + L2 = dot(v2, v2); + L3 = dot(v3, v3); + // Sort the three edge lengths. + if (L1 < L2) { + if (L2 < L3) { + pv1 = v1; pv2 = v2; // n = v1 x (-v2). + } else { + pv1 = v3; pv2 = v1; // n = v3 x (-v1). + } + } else { + if (L1 < L3) { + pv1 = v1; pv2 = v2; // n = v1 x (-v2). + } else { + pv1 = v2; pv2 = v3; // n = v2 x (-v3). + } + } + if (lav) { + // return the average edge length. + *lav = (sqrt(L1) + sqrt(L2) + sqrt(L3)) / 3.0; + } + } else { + pv1 = v1; pv2 = v2; // n = v1 x (-v2). + } + + // Calculate the face normal. + cross(pv1, pv2, n); + // Inverse the direction; + n[0] = -n[0]; + n[1] = -n[1]; + n[2] = -n[2]; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// shortdistance() Returns the shortest distance from point p to a line // +// defined by two points e1 and e2. // +// // +// First compute the projection length l_p of the vector v1 = p - e1 along // +// the vector v2 = e2 - e1. Then Pythagoras' Theorem is used to compute the // +// shortest distance. // +// // +// This routine allows that p is collinear with the line. In this case, the // +// return value is zero. The two points e1 and e2 should not be identical. // +// // +/////////////////////////////////////////////////////////////////////////////// + +REAL tetgenmesh::shortdistance(REAL* p, REAL* e1, REAL* e2) +{ + REAL v1[3], v2[3]; + REAL len, l_p; + + v1[0] = e2[0] - e1[0]; + v1[1] = e2[1] - e1[1]; + v1[2] = e2[2] - e1[2]; + v2[0] = p[0] - e1[0]; + v2[1] = p[1] - e1[1]; + v2[2] = p[2] - e1[2]; + + len = sqrt(dot(v1, v1)); + + v1[0] /= len; + v1[1] /= len; + v1[2] /= len; + l_p = dot(v1, v2); + + return sqrt(dot(v2, v2) - l_p * l_p); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// triarea() Return the area of a triangle. // +// // +/////////////////////////////////////////////////////////////////////////////// + +REAL tetgenmesh::triarea(REAL* pa, REAL* pb, REAL* pc) +{ + REAL A[4][4]; + + // Compute the coefficient matrix A (3x3). + A[0][0] = pb[0] - pa[0]; + A[0][1] = pb[1] - pa[1]; + A[0][2] = pb[2] - pa[2]; // vector V1 (pa->pb) + A[1][0] = pc[0] - pa[0]; + A[1][1] = pc[1] - pa[1]; + A[1][2] = pc[2] - pa[2]; // vector V2 (pa->pc) + + cross(A[0], A[1], A[2]); // vector V3 (V1 X V2) + + return 0.5 * sqrt(dot(A[2], A[2])); // The area of [a,b,c]. +} + +REAL tetgenmesh::orient3dfast(REAL *pa, REAL *pb, REAL *pc, REAL *pd) +{ + REAL adx, bdx, cdx; + REAL ady, bdy, cdy; + REAL adz, bdz, cdz; + + adx = pa[0] - pd[0]; + bdx = pb[0] - pd[0]; + cdx = pc[0] - pd[0]; + ady = pa[1] - pd[1]; + bdy = pb[1] - pd[1]; + cdy = pc[1] - pd[1]; + adz = pa[2] - pd[2]; + bdz = pb[2] - pd[2]; + cdz = pc[2] - pd[2]; + + return adx * (bdy * cdz - bdz * cdy) + + bdx * (cdy * adz - cdz * ady) + + cdx * (ady * bdz - adz * bdy); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// interiorangle() Return the interior angle (0 - 2 * PI) between vectors // +// o->p1 and o->p2. // +// // +// 'n' is the normal of the plane containing face (o, p1, p2). The interior // +// angle is the total angle rotating from o->p1 around n to o->p2. Exchange // +// the position of p1 and p2 will get the complement angle of the other one. // +// i.e., interiorangle(o, p1, p2) = 2 * PI - interiorangle(o, p2, p1). Set // +// 'n' be NULL if you only want the interior angle between 0 - PI. // +// // +/////////////////////////////////////////////////////////////////////////////// + +REAL tetgenmesh::interiorangle(REAL* o, REAL* p1, REAL* p2, REAL* n) +{ + REAL v1[3], v2[3], np[3]; + REAL theta, costheta, lenlen; + REAL ori, len1, len2; + + // Get the interior angle (0 - PI) between o->p1, and o->p2. + v1[0] = p1[0] - o[0]; + v1[1] = p1[1] - o[1]; + v1[2] = p1[2] - o[2]; + v2[0] = p2[0] - o[0]; + v2[1] = p2[1] - o[1]; + v2[2] = p2[2] - o[2]; + len1 = sqrt(dot(v1, v1)); + len2 = sqrt(dot(v2, v2)); + lenlen = len1 * len2; + + costheta = dot(v1, v2) / lenlen; + if (costheta > 1.0) { + costheta = 1.0; // Roundoff. + } else if (costheta < -1.0) { + costheta = -1.0; // Roundoff. + } + theta = acos(costheta); + if (n != NULL) { + // Get a point above the face (o, p1, p2); + np[0] = o[0] + n[0]; + np[1] = o[1] + n[1]; + np[2] = o[2] + n[2]; + // Adjust theta (0 - 2 * PI). + ori = orient3d(p1, o, np, p2); + if (ori > 0.0) { + theta = 2 * PI - theta; + } + } + + return theta; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// projpt2edge() Return the projection point from a point to an edge. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::projpt2edge(REAL* p, REAL* e1, REAL* e2, REAL* prj) +{ + REAL v1[3], v2[3]; + REAL len, l_p; + + v1[0] = e2[0] - e1[0]; + v1[1] = e2[1] - e1[1]; + v1[2] = e2[2] - e1[2]; + v2[0] = p[0] - e1[0]; + v2[1] = p[1] - e1[1]; + v2[2] = p[2] - e1[2]; + + len = sqrt(dot(v1, v1)); + v1[0] /= len; + v1[1] /= len; + v1[2] /= len; + l_p = dot(v1, v2); + + prj[0] = e1[0] + l_p * v1[0]; + prj[1] = e1[1] + l_p * v1[1]; + prj[2] = e1[2] + l_p * v1[2]; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// projpt2face() Return the projection point from a point to a face. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::projpt2face(REAL* p, REAL* f1, REAL* f2, REAL* f3, REAL* prj) +{ + REAL fnormal[3], v1[3]; + REAL len, dist; + + // Get the unit face normal. + facenormal(f1, f2, f3, fnormal, 1, NULL); + len = sqrt(fnormal[0]*fnormal[0] + fnormal[1]*fnormal[1] + + fnormal[2]*fnormal[2]); + fnormal[0] /= len; + fnormal[1] /= len; + fnormal[2] /= len; + // Get the vector v1 = |p - f1|. + v1[0] = p[0] - f1[0]; + v1[1] = p[1] - f1[1]; + v1[2] = p[2] - f1[2]; + // Get the project distance. + dist = dot(fnormal, v1); + + // Get the project point. + prj[0] = p[0] - dist * fnormal[0]; + prj[1] = p[1] - dist * fnormal[1]; + prj[2] = p[2] - dist * fnormal[2]; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetalldihedral() Get all (six) dihedral angles of a tet. // +// // +// If 'cosdd' is not NULL, it returns the cosines of the 6 dihedral angles, // +// the edge indices are given in the global array 'edge2ver'. If 'cosmaxd' // +// (or 'cosmind') is not NULL, it returns the cosine of the maximal (or // +// minimal) dihedral angle. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenmesh::tetalldihedral(point pa, point pb, point pc, point pd, + REAL* cosdd, REAL* cosmaxd, REAL* cosmind) +{ + REAL N[4][3], vol, cosd, len; + int f1 = 0, f2 = 0, i, j; + + vol = 0; // Check if the tet is valid or not. + + // Get four normals of faces of the tet. + tetallnormal(pa, pb, pc, pd, N, &vol); + + if (vol > 0) { + // Normalize the normals. + for (i = 0; i < 4; i++) { + len = sqrt(dot(N[i], N[i])); + if (len != 0.0) { + for (j = 0; j < 3; j++) N[i][j] /= len; + } else { + // There are degeneracies, such as duplicated vertices. + vol = 0; //assert(0); + } + } + } + + if (vol <= 0) { // if (vol == 0.0) { + // A degenerated tet or an inverted tet. + facenormal(pc, pb, pd, N[0], 1, NULL); + facenormal(pa, pc, pd, N[1], 1, NULL); + facenormal(pb, pa, pd, N[2], 1, NULL); + facenormal(pa, pb, pc, N[3], 1, NULL); + // Normalize the normals. + for (i = 0; i < 4; i++) { + len = sqrt(dot(N[i], N[i])); + if (len != 0.0) { + for (j = 0; j < 3; j++) N[i][j] /= len; + } else { + // There are degeneracies, such as duplicated vertices. + break; // Not a valid normal. + } + } + if (i < 4) { + // Do not calculate dihedral angles. + // Set all angles be 0 degree. There will be no quality optimization for + // this tet! Use volume optimization to correct it. + if (cosdd != NULL) { + for (i = 0; i < 6; i++) { + cosdd[i] = -1.0; // 180 degree. + } + } + // This tet has zero volume. + if (cosmaxd != NULL) { + *cosmaxd = -1.0; // 180 degree. + } + if (cosmind != NULL) { + *cosmind = -1.0; // 180 degree. + } + return false; + } + } + + // Calculate the cosine of the dihedral angles of the edges. + for (i = 0; i < 6; i++) { + switch (i) { + case 0: f1 = 0; f2 = 1; break; // [c,d]. + case 1: f1 = 1; f2 = 2; break; // [a,d]. + case 2: f1 = 2; f2 = 3; break; // [a,b]. + case 3: f1 = 0; f2 = 3; break; // [b,c]. + case 4: f1 = 2; f2 = 0; break; // [b,d]. + case 5: f1 = 1; f2 = 3; break; // [a,c]. + } + cosd = -dot(N[f1], N[f2]); + if (cosd < -1.0) cosd = -1.0; // Rounding. + if (cosd > 1.0) cosd = 1.0; // Rounding. + if (cosdd) cosdd[i] = cosd; + if (cosmaxd || cosmind) { + if (i == 0) { + if (cosmaxd) *cosmaxd = cosd; + if (cosmind) *cosmind = cosd; + } else { + if (cosmaxd) *cosmaxd = cosd < *cosmaxd ? cosd : *cosmaxd; + if (cosmind) *cosmind = cosd > *cosmind ? cosd : *cosmind; + } + } + } + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetallnormal() Get the in-normals of the four faces of a given tet. // +// // +// Let tet be abcd. N[4][3] returns the four normals, which are: N[0] cbd, // +// N[1] acd, N[2] bad, N[3] abc (exactly corresponding to the face indices // +// of the mesh data structure). These normals are unnormalized. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::tetallnormal(point pa, point pb, point pc, point pd, + REAL N[4][3], REAL* volume) +{ + REAL A[4][4], rhs[4], D; + int indx[4]; + int i, j; + + // get the entries of A[3][3]. + for (i = 0; i < 3; i++) A[0][i] = pa[i] - pd[i]; // d->a vec + for (i = 0; i < 3; i++) A[1][i] = pb[i] - pd[i]; // d->b vec + for (i = 0; i < 3; i++) A[2][i] = pc[i] - pd[i]; // d->c vec + + // Compute the inverse of matrix A, to get 3 normals of the 4 faces. + if (lu_decmp(A, 3, indx, &D, 0)) { // Decompose the matrix just once. + if (volume != NULL) { + // Get the volume of the tet. + *volume = fabs((A[indx[0]][0] * A[indx[1]][1] * A[indx[2]][2])) / 6.0; + } + for (j = 0; j < 3; j++) { + for (i = 0; i < 3; i++) rhs[i] = 0.0; + rhs[j] = 1.0; // Positive means the inside direction + lu_solve(A, 3, indx, rhs, 0); + for (i = 0; i < 3; i++) N[j][i] = rhs[i]; + } + // Get the fourth normal by summing up the first three. + for (i = 0; i < 3; i++) N[3][i] = - N[0][i] - N[1][i] - N[2][i]; + } else { + // The tet is degenerated. + if (volume != NULL) { + *volume = 0; + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetaspectratio() Calculate the aspect ratio of the tetrahedron. // +// // +// The aspect ratio of a tet is L/h, where L is the longest edge length, and // +// h is the shortest height of the tet. // +// // +/////////////////////////////////////////////////////////////////////////////// + +REAL tetgenmesh::tetaspectratio(point pa, point pb, point pc, point pd) +{ + REAL V[6][3], edgelength[6], longlen; + REAL vda[3], vdb[3], vdc[3]; + REAL N[4][3], A[4][4], rhs[4], D; + REAL H[4], volume, minheightinv; + int indx[4]; + int i, j; + + // Set the edge vectors: V[0], ..., V[5] + for (i = 0; i < 3; i++) V[0][i] = pa[i] - pd[i]; + for (i = 0; i < 3; i++) V[1][i] = pb[i] - pd[i]; + for (i = 0; i < 3; i++) V[2][i] = pc[i] - pd[i]; + for (i = 0; i < 3; i++) V[3][i] = pb[i] - pa[i]; + for (i = 0; i < 3; i++) V[4][i] = pc[i] - pb[i]; + for (i = 0; i < 3; i++) V[5][i] = pa[i] - pc[i]; + + // Get the squares of the edge lengths. + for (i = 0; i < 6; i++) edgelength[i] = dot(V[i], V[i]); + + // Calculate the longest and shortest edge length. + longlen = edgelength[0]; + for (i = 1; i < 6; i++) { + longlen = edgelength[i] > longlen ? edgelength[i] : longlen; + } + + // Set the matrix A = [vda, vdb, vdc]^T. + for (i = 0; i < 3; i++) A[0][i] = vda[i] = pa[i] - pd[i]; + for (i = 0; i < 3; i++) A[1][i] = vdb[i] = pb[i] - pd[i]; + for (i = 0; i < 3; i++) A[2][i] = vdc[i] = pc[i] - pd[i]; + // Lu-decompose the matrix A. + lu_decmp(A, 3, indx, &D, 0); + // Get the volume of abcd. + volume = (A[indx[0]][0] * A[indx[1]][1] * A[indx[2]][2]) / 6.0; + // Check if it is zero. + if (volume == 0.0) return 1.0e+200; // A degenerate tet. + + // Compute the 4 face normals (N[0], ..., N[3]). + for (j = 0; j < 3; j++) { + for (i = 0; i < 3; i++) rhs[i] = 0.0; + rhs[j] = 1.0; // Positive means the inside direction + lu_solve(A, 3, indx, rhs, 0); + for (i = 0; i < 3; i++) N[j][i] = rhs[i]; + } + // Get the fourth normal by summing up the first three. + for (i = 0; i < 3; i++) N[3][i] = - N[0][i] - N[1][i] - N[2][i]; + // Normalized the normals. + for (i = 0; i < 4; i++) { + // H[i] is the inverse of the height of its corresponding face. + H[i] = sqrt(dot(N[i], N[i])); + // if (H[i] > 0.0) { + // for (j = 0; j < 3; j++) N[i][j] /= H[i]; + // } + } + // Get the radius of the inscribed sphere. + // insradius = 1.0 / (H[0] + H[1] + H[2] + H[3]); + // Get the biggest H[i] (corresponding to the smallest height). + minheightinv = H[0]; + for (i = 1; i < 4; i++) { + if (H[i] > minheightinv) minheightinv = H[i]; + } + + return sqrt(longlen) * minheightinv; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// circumsphere() Calculate the smallest circumsphere (center and radius) // +// of the given three or four points. // +// // +// The circumsphere of four points (a tetrahedron) is unique if they are not // +// degenerate. If 'pd = NULL', the smallest circumsphere of three points is // +// the diametral sphere of the triangle if they are not degenerate. // +// // +// Return TRUE if the input points are not degenerate and the circumcenter // +// and circumradius are returned in 'cent' and 'radius' respectively if they // +// are not NULLs. Otherwise, return FALSE, the four points are co-planar. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenmesh::circumsphere(REAL* pa, REAL* pb, REAL* pc, REAL* pd, + REAL* cent, REAL* radius) +{ + REAL A[4][4], rhs[4], D; + int indx[4]; + + // Compute the coefficient matrix A (3x3). + A[0][0] = pb[0] - pa[0]; + A[0][1] = pb[1] - pa[1]; + A[0][2] = pb[2] - pa[2]; + A[1][0] = pc[0] - pa[0]; + A[1][1] = pc[1] - pa[1]; + A[1][2] = pc[2] - pa[2]; + if (pd != NULL) { + A[2][0] = pd[0] - pa[0]; + A[2][1] = pd[1] - pa[1]; + A[2][2] = pd[2] - pa[2]; + } else { + cross(A[0], A[1], A[2]); + } + + // Compute the right hand side vector b (3x1). + rhs[0] = 0.5 * dot(A[0], A[0]); + rhs[1] = 0.5 * dot(A[1], A[1]); + if (pd != NULL) { + rhs[2] = 0.5 * dot(A[2], A[2]); + } else { + rhs[2] = 0.0; + } + + // Solve the 3 by 3 equations use LU decomposition with partial pivoting + // and backward and forward substitute.. + if (!lu_decmp(A, 3, indx, &D, 0)) { + if (radius != (REAL *) NULL) *radius = 0.0; + return false; + } + lu_solve(A, 3, indx, rhs, 0); + if (cent != (REAL *) NULL) { + cent[0] = pa[0] + rhs[0]; + cent[1] = pa[1] + rhs[1]; + cent[2] = pa[2] + rhs[2]; + } + if (radius != (REAL *) NULL) { + *radius = sqrt(rhs[0] * rhs[0] + rhs[1] * rhs[1] + rhs[2] * rhs[2]); + } + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// orthosphere() Calulcate the orthosphere of four weighted points. // +// // +// A weighted point (p, P^2) can be interpreted as a sphere centered at the // +// point 'p' with a radius 'P'. The 'height' of 'p' is pheight = p[0]^2 + // +// p[1]^2 + p[2]^2 - P^2. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenmesh::orthosphere(REAL* pa, REAL* pb, REAL* pc, REAL* pd, + REAL aheight, REAL bheight, REAL cheight, + REAL dheight, REAL* orthocent, REAL* radius) +{ + REAL A[4][4], rhs[4], D; + int indx[4]; + + // Set the coefficient matrix A (4 x 4). + A[0][0] = 1.0; A[0][1] = pa[0]; A[0][2] = pa[1]; A[0][3] = pa[2]; + A[1][0] = 1.0; A[1][1] = pb[0]; A[1][2] = pb[1]; A[1][3] = pb[2]; + A[2][0] = 1.0; A[2][1] = pc[0]; A[2][2] = pc[1]; A[2][3] = pc[2]; + A[3][0] = 1.0; A[3][1] = pd[0]; A[3][2] = pd[1]; A[3][3] = pd[2]; + + // Set the right hand side vector (4 x 1). + rhs[0] = 0.5 * aheight; + rhs[1] = 0.5 * bheight; + rhs[2] = 0.5 * cheight; + rhs[3] = 0.5 * dheight; + + // Solve the 4 by 4 equations use LU decomposition with partial pivoting + // and backward and forward substitute.. + if (!lu_decmp(A, 4, indx, &D, 0)) { + if (radius != (REAL *) NULL) *radius = 0.0; + return false; + } + lu_solve(A, 4, indx, rhs, 0); + + if (orthocent != (REAL *) NULL) { + orthocent[0] = rhs[1]; + orthocent[1] = rhs[2]; + orthocent[2] = rhs[3]; + } + if (radius != (REAL *) NULL) { + // rhs[0] = - rheight / 2; + // rheight = - 2 * rhs[0]; + // = r[0]^2 + r[1]^2 + r[2]^2 - radius^2 + // radius^2 = r[0]^2 + r[1]^2 + r[2]^2 -rheight + // = r[0]^2 + r[1]^2 + r[2]^2 + 2 * rhs[0] + *radius = sqrt(rhs[1] * rhs[1] + rhs[2] * rhs[2] + rhs[3] * rhs[3] + + 2.0 * rhs[0]); + } + return true; +} + +void tetgenmesh::tetcircumcenter(point tetorg, point tetdest, point tetfapex, + point tettapex, REAL *circumcenter, REAL *radius) +{ + REAL xot, yot, zot, xdt, ydt, zdt, xft, yft, zft; + REAL otlength, dtlength, ftlength; + REAL xcrossdf, ycrossdf, zcrossdf; + REAL xcrossfo, ycrossfo, zcrossfo; + REAL xcrossod, ycrossod, zcrossod; + REAL denominator; + REAL xct, yct, zct; + + //tetcircumcentercount++; + + /* Use coordinates relative to the apex of the tetrahedron. */ + xot = tetorg[0] - tettapex[0]; + yot = tetorg[1] - tettapex[1]; + zot = tetorg[2] - tettapex[2]; + xdt = tetdest[0] - tettapex[0]; + ydt = tetdest[1] - tettapex[1]; + zdt = tetdest[2] - tettapex[2]; + xft = tetfapex[0] - tettapex[0]; + yft = tetfapex[1] - tettapex[1]; + zft = tetfapex[2] - tettapex[2]; + /* Squares of lengths of the origin, destination, and face apex edges. */ + otlength = xot * xot + yot * yot + zot * zot; + dtlength = xdt * xdt + ydt * ydt + zdt * zdt; + ftlength = xft * xft + yft * yft + zft * zft; + /* Cross products of the origin, destination, and face apex vectors. */ + xcrossdf = ydt * zft - yft * zdt; + ycrossdf = zdt * xft - zft * xdt; + zcrossdf = xdt * yft - xft * ydt; + xcrossfo = yft * zot - yot * zft; + ycrossfo = zft * xot - zot * xft; + zcrossfo = xft * yot - xot * yft; + xcrossod = yot * zdt - ydt * zot; + ycrossod = zot * xdt - zdt * xot; + zcrossod = xot * ydt - xdt * yot; + + /* Calculate the denominator of all the formulae. */ + //if (noexact) { + // denominator = 0.5 / (xot * xcrossdf + yot * ycrossdf + zot * zcrossdf); + //} else { + /* Use the orient3d() routine to ensure a positive (and */ + /* reasonably accurate) result, avoiding any possibility */ + /* of division by zero. */ + denominator = 0.5 / orient3d(tetorg, tetdest, tetfapex, tettapex); + /* Don't count the above as an orientation test. */ + //orientcount--; + //} + + /* Calculate offset (from apex) of circumcenter. */ + xct = (otlength * xcrossdf + dtlength * xcrossfo + ftlength * xcrossod) * + denominator; + yct = (otlength * ycrossdf + dtlength * ycrossfo + ftlength * ycrossod) * + denominator; + zct = (otlength * zcrossdf + dtlength * zcrossfo + ftlength * zcrossod) * + denominator; + + circumcenter[0] = xct + tettapex[0]; + circumcenter[1] = yct + tettapex[1]; + circumcenter[2] = zct + tettapex[2]; + + if (radius != NULL) { + *radius = sqrt(xct * xct + yct * yct + zct * zct); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// planelineint() Calculate the intersection of a line and a plane. // +// // +// The equation of a plane (points P are on the plane with normal N and P3 // +// on the plane) can be written as: N dot (P - P3) = 0. The equation of the // +// line (points P on the line passing through P1 and P2) can be written as: // +// P = P1 + u (P2 - P1). The intersection of these two occurs when: // +// N dot (P1 + u (P2 - P1)) = N dot P3. // +// Solving for u gives: // +// N dot (P3 - P1) // +// u = ------------------. // +// N dot (P2 - P1) // +// If the denominator is 0 then N (the normal to the plane) is perpendicular // +// to the line. Thus the line is either parallel to the plane and there are // +// no solutions or the line is on the plane in which case there are an infi- // +// nite number of solutions. // +// // +// The plane is given by three points pa, pb, and pc, e1 and e2 defines the // +// line. If u is non-zero, The intersection point (if exists) returns in ip. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::planelineint(REAL* pa, REAL* pb, REAL* pc, REAL* e1, REAL* e2, + REAL* ip, REAL* u) +{ + REAL n[3], det, det1; + + // Calculate N. + facenormal(pa, pb, pc, n, 1, NULL); + // Calculate N dot (e2 - e1). + det = n[0] * (e2[0] - e1[0]) + n[1] * (e2[1] - e1[1]) + + n[2] * (e2[2] - e1[2]); + if (det != 0.0) { + // Calculate N dot (pa - e1) + det1 = n[0] * (pa[0] - e1[0]) + n[1] * (pa[1] - e1[1]) + + n[2] * (pa[2] - e1[2]); + *u = det1 / det; + ip[0] = e1[0] + *u * (e2[0] - e1[0]); + ip[1] = e1[1] + *u * (e2[1] - e1[1]); + ip[2] = e1[2] + *u * (e2[2] - e1[2]); + } else { + *u = 0.0; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// linelineint() Calculate the intersection(s) of two line segments. // +// // +// Calculate the line segment [P, Q] that is the shortest route between two // +// lines from A to B and C to D. Calculate also the values of tp and tq // +// where: P = A + tp (B - A), and Q = C + tq (D - C). // +// // +// Return 1 if the line segment exists. Otherwise, return 0. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::linelineint(REAL* A, REAL* B, REAL* C, REAL* D, REAL* P, + REAL* Q, REAL* tp, REAL* tq) +{ + REAL vab[3], vcd[3], vca[3]; + REAL vab_vab, vcd_vcd, vab_vcd; + REAL vca_vab, vca_vcd; + REAL det, eps; + int i; + + for (i = 0; i < 3; i++) { + vab[i] = B[i] - A[i]; + vcd[i] = D[i] - C[i]; + vca[i] = A[i] - C[i]; + } + + vab_vab = dot(vab, vab); + vcd_vcd = dot(vcd, vcd); + vab_vcd = dot(vab, vcd); + + det = vab_vab * vcd_vcd - vab_vcd * vab_vcd; + // Round the result. + eps = det / (fabs(vab_vab * vcd_vcd) + fabs(vab_vcd * vab_vcd)); + if (eps < b->epsilon) { + return 0; + } + + vca_vab = dot(vca, vab); + vca_vcd = dot(vca, vcd); + + *tp = (vcd_vcd * (- vca_vab) + vab_vcd * vca_vcd) / det; + *tq = (vab_vcd * (- vca_vab) + vab_vab * vca_vcd) / det; + + for (i = 0; i < 3; i++) P[i] = A[i] + (*tp) * vab[i]; + for (i = 0; i < 3; i++) Q[i] = C[i] + (*tq) * vcd[i]; + + return 1; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetprismvol() Calculate the volume of a tetrahedral prism in 4D. // +// // +// A tetrahedral prism is a convex uniform polychoron (four dimensional poly-// +// tope). It has 6 polyhedral cells: 2 tetrahedra connected by 4 triangular // +// prisms. It has 14 faces: 8 triangular and 6 square. It has 16 edges and 8 // +// vertices. (Wikipedia). // +// // +// Let 'p0', ..., 'p3' be four affinely independent points in R^3. They form // +// the lower tetrahedral facet of the prism. The top tetrahedral facet is // +// formed by four vertices, 'p4', ..., 'p7' in R^4, which is obtained by // +// lifting each vertex of the lower facet into R^4 by a weight (height). A // +// canonical choice of the weights is the square of Euclidean norm of of the // +// points (vectors). // +// // +// // +// The return value is (4!) 24 times of the volume of the tetrahedral prism. // +// // +/////////////////////////////////////////////////////////////////////////////// + +REAL tetgenmesh::tetprismvol(REAL* p0, REAL* p1, REAL* p2, REAL* p3) +{ + REAL *p4, *p5, *p6, *p7; + REAL w4, w5, w6, w7; + REAL vol[4]; + + p4 = p0; + p5 = p1; + p6 = p2; + p7 = p3; + + // TO DO: these weights can be pre-calculated! + w4 = dot(p0, p0); + w5 = dot(p1, p1); + w6 = dot(p2, p2); + w7 = dot(p3, p3); + + // Calculate the volume of the tet-prism. + vol[0] = orient4d(p5, p6, p4, p3, p7, w5, w6, w4, 0, w7); + vol[1] = orient4d(p3, p6, p2, p0, p1, 0, w6, 0, 0, 0); + vol[2] = orient4d(p4, p6, p3, p0, p1, w4, w6, 0, 0, 0); + vol[3] = orient4d(p6, p5, p4, p3, p1, w6, w5, w4, 0, 0); + + return fabs(vol[0]) + fabs(vol[1]) + fabs(vol[2]) + fabs(vol[3]); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// calculateabovepoint() Calculate a point above a facet in 'dummypoint'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenmesh::calculateabovepoint(arraypool *facpoints, point *ppa, + point *ppb, point *ppc) +{ + point *ppt, pa, pb, pc; + REAL v1[3], v2[3], n[3]; + REAL lab, len, A, area; + REAL x, y, z; + int i; + + ppt = (point *) fastlookup(facpoints, 0); + pa = *ppt; // a is the first point. + pb = pc = NULL; // Avoid compiler warnings. + + // Get a point b s.t. the length of [a, b] is maximal. + lab = 0; + for (i = 1; i < facpoints->objects; i++) { + ppt = (point *) fastlookup(facpoints, i); + x = (*ppt)[0] - pa[0]; + y = (*ppt)[1] - pa[1]; + z = (*ppt)[2] - pa[2]; + len = x * x + y * y + z * z; + if (len > lab) { + lab = len; + pb = *ppt; + } + } + lab = sqrt(lab); + if (lab == 0) { + if (!b->quiet) { + printf("Warning: All points of a facet are coincident with %d.\n", + pointmark(pa)); + } + return false; + } + + // Get a point c s.t. the area of [a, b, c] is maximal. + v1[0] = pb[0] - pa[0]; + v1[1] = pb[1] - pa[1]; + v1[2] = pb[2] - pa[2]; + A = 0; + for (i = 1; i < facpoints->objects; i++) { + ppt = (point *) fastlookup(facpoints, i); + v2[0] = (*ppt)[0] - pa[0]; + v2[1] = (*ppt)[1] - pa[1]; + v2[2] = (*ppt)[2] - pa[2]; + cross(v1, v2, n); + area = dot(n, n); + if (area > A) { + A = area; + pc = *ppt; + } + } + if (A == 0) { + // All points are collinear. No above point. + if (!b->quiet) { + printf("Warning: All points of a facet are collinaer with [%d, %d].\n", + pointmark(pa), pointmark(pb)); + } + return false; + } + + // Calculate an above point of this facet. + facenormal(pa, pb, pc, n, 1, NULL); + len = sqrt(dot(n, n)); + n[0] /= len; + n[1] /= len; + n[2] /= len; + lab /= 2.0; // Half the maximal length. + dummypoint[0] = pa[0] + lab * n[0]; + dummypoint[1] = pa[1] + lab * n[1]; + dummypoint[2] = pa[2] + lab * n[2]; + + if (ppa != NULL) { + // Return the three points. + *ppa = pa; + *ppb = pb; + *ppc = pc; + } + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// Calculate an above point. It lies above the plane containing the subface // +// [a,b,c], and save it in dummypoint. Moreover, the vector pa->dummypoint // +// is the normal of the plane. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::calculateabovepoint4(point pa, point pb, point pc, point pd) +{ + REAL n1[3], n2[3], *norm; + REAL len, len1, len2; + + // Select a base. + facenormal(pa, pb, pc, n1, 1, NULL); + len1 = sqrt(dot(n1, n1)); + facenormal(pa, pb, pd, n2, 1, NULL); + len2 = sqrt(dot(n2, n2)); + if (len1 > len2) { + norm = n1; + len = len1; + } else { + norm = n2; + len = len2; + } + norm[0] /= len; + norm[1] /= len; + norm[2] /= len; + len = distance(pa, pb); + dummypoint[0] = pa[0] + len * norm[0]; + dummypoint[1] = pa[1] + len * norm[1]; + dummypoint[2] = pa[2] + len * norm[2]; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// report_overlapping_facets() Report two overlapping facets. // +// // +// Two subfaces, f1 [a, b, c] and f2 [a, b, d], share the same edge [a, b]. // +// 'dihedang' is the dihedral angle between these two facets. It must less // +// than the variable 'b->facet_overlap_angle_tol'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::report_overlapping_facets(face *f1, face *f2, REAL dihedang) +{ + point pa, pb, pc, pd; + + pa = sorg(*f1); + pb = sdest(*f1); + pc = sapex(*f1); + pd = sapex(*f2); + + if (pc != pd) { + printf("Found two %s self-intersecting facets.\n", + dihedang > 0 ? "nearly" : "exactly"); + printf(" 1st: [%d, %d, %d] #%d\n", + pointmark(pa), pointmark(pb), pointmark(pc), shellmark(*f1)); + printf(" 2nd: [%d, %d, %d] #%d\n", + pointmark(pa), pointmark(pb), pointmark(pd), shellmark(*f2)); + if (dihedang > 0) { + printf("The dihedral angle between them is %g degree.\n", + dihedang / PI * 180.0); + printf("Hint: You may use -p/# to decrease the dihedral angle"); + printf(" tolerance %g (degree).\n", b->facet_overlap_ang_tol); + } + } else { + if (shellmark(*f1) != shellmark(*f2)) { + // Two identical faces from two different facet. + printf("Found two overlapping facets.\n"); + } else { + printf("Found two duplicated facets.\n"); + } + printf(" 1st: [%d, %d, %d] #%d\n", + pointmark(pa), pointmark(pb), pointmark(pc), shellmark(*f1)); + printf(" 2nd: [%d, %d, %d] #%d\n", + pointmark(pa), pointmark(pb), pointmark(pd), shellmark(*f2)); + } + + // Return the information + sevent.e_type = 6; + sevent.f_marker1 = shellmark(*f1); + sevent.f_vertices1[0] = pointmark(pa); + sevent.f_vertices1[1] = pointmark(pb); + sevent.f_vertices1[2] = pointmark(pc); + sevent.f_marker2 = shellmark(*f2); + sevent.f_vertices2[0] = pointmark(pa); + sevent.f_vertices2[1] = pointmark(pb); + sevent.f_vertices2[2] = pointmark(pd); + + terminatetetgen(this, 3); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// report_selfint_edge() Report a self-intersection at an edge. // +// // +// The edge 'e1'->'e2' and the tetrahedron 'itet' intersect. 'dir' indicates // +// that the edge intersects the tet at its origin vertex (ACROSSVERTEX), or // +// its current face (ACROSSFACE), or its current edge (ACROSSEDGE). // +// If 'iedge' is not NULL, it is either a segment or a subface that contains // +// the edge 'e1'->'e2'. It is used to report the geometry entity. // +// // +// Since it is a self-intersection, the vertex, edge or face of 'itet' that // +// is intersecting with this edge must be an input vertex, a segment, or a // +// subface, respectively. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::report_selfint_edge(point e1, point e2, face *iedge, + triface* itet, enum interresult dir) +{ + point forg = NULL, fdest = NULL, fapex = NULL; + int etype = 0, geomtag = 0, facemark = 0; + + if (iedge != NULL) { + if (iedge->sh[5] != NULL) { + etype = 2; // A subface + forg = e1; + fdest = e2; + fapex = sapex(*iedge); + facemark = shellmark(*iedge); + } else { + etype = 1; // A segment + forg = farsorg(*iedge); + fdest = farsdest(*iedge); + // Get a facet containing this segment. + face parentsh; + spivot(*iedge, parentsh); + if (parentsh.sh != NULL) { + facemark = shellmark(parentsh); + } + } + geomtag = shellmark(*iedge); + } + + if (dir == SHAREEDGE) { + // Two edges (segments) are coincide. + face colseg; + tsspivot1(*itet, colseg); + if (etype == 1) { + if (colseg.sh != iedge->sh) { + face parentsh; + spivot(colseg, parentsh); + printf("PLC Error: Two segments are overlapping.\n"); + printf(" Segment 1: [%d, %d] #%d (%d)\n", pointmark(sorg(colseg)), + pointmark(sdest(colseg)), shellmark(colseg), + parentsh.sh ? shellmark(parentsh) : 0); + printf(" Segment 2: [%d, %d] #%d (%d)\n", pointmark(forg), + pointmark(fdest), geomtag, facemark); + sevent.e_type = 4; + sevent.f_marker1 = (parentsh.sh ? shellmark(parentsh) : 0); + sevent.s_marker1 = shellmark(colseg); + sevent.f_vertices1[0] = pointmark( sorg(colseg)); + sevent.f_vertices1[1] = pointmark(sdest(colseg)); + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = facemark; + sevent.s_marker2 = geomtag; + sevent.f_vertices2[0] = pointmark(forg); + sevent.f_vertices2[1] = pointmark(fdest); + sevent.f_vertices2[2] = 0; + } else { + // Two identical segments. Why report it? + terminatetetgen(this, 2); + } + } else if (etype == 2) { + printf("PLC Error: A segment lies in a facet.\n"); + printf(" Segment: [%d, %d] #%d\n", pointmark(sorg(colseg)), + pointmark(sdest(colseg)), shellmark(colseg)); + printf(" Facet: [%d,%d,%d] #%d\n", pointmark(forg), + pointmark(fdest), pointmark(fapex), geomtag); + sevent.e_type = 5; + sevent.f_marker1 = 0; + sevent.s_marker1 = shellmark(colseg); + sevent.f_vertices1[0] = pointmark( sorg(colseg)); + sevent.f_vertices1[1] = pointmark(sdest(colseg)); + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = geomtag; + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(forg); + sevent.f_vertices2[1] = pointmark(fdest); + sevent.f_vertices2[2] = pointmark(fapex); + } + } else if (dir == SHAREFACE) { + // Two triangles (subfaces) are coincide. + face colface; + tspivot(*itet, colface); + if (etype == 2) { + if (colface.sh != iedge->sh) { + printf("PLC Error: Two facets are overlapping.\n"); + printf(" Facet 1: [%d,%d,%d] #%d\n", pointmark(forg), + pointmark(fdest), pointmark(fapex), geomtag); + printf(" Facet 2: [%d,%d,%d] #%d\n", pointmark(sorg(colface)), + pointmark(sdest(colface)), pointmark(sapex(colface)), + shellmark(colface)); + sevent.e_type = 6; + sevent.f_marker1 = geomtag; + sevent.s_marker1 = 0; + sevent.f_vertices1[0] = pointmark(forg); + sevent.f_vertices1[1] = pointmark(fdest); + sevent.f_vertices1[2] = pointmark(fapex); + sevent.f_marker2 = shellmark(colface); + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(sorg(colface)); + sevent.f_vertices2[1] = pointmark(sdest(colface)); + sevent.f_vertices2[2] = pointmark(sapex(colface)); + } else { + // Two identical subfaces. Why report it? + terminatetetgen(this, 2); + } + } else { + terminatetetgen(this, 2); + } + } else if (dir == ACROSSVERT) { + point pp = dest(*itet); + if ((pointtype(pp) == RIDGEVERTEX) || (pointtype(pp) == FACETVERTEX) + || (pointtype(pp) == VOLVERTEX)) { + if (etype == 1) { + printf("PLC Error: A vertex lies in a segment.\n"); + printf(" Vertex: [%d] (%g,%g,%g).\n",pointmark(pp),pp[0],pp[1],pp[2]); + printf(" Segment: [%d, %d] #%d (%d)\n", pointmark(forg), + pointmark(fdest), geomtag, facemark); + sevent.e_type = 7; + sevent.f_marker1 = 0; + sevent.s_marker1 = 0; + sevent.f_vertices1[0] = pointmark(pp); + sevent.f_vertices1[1] = 0; + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = facemark; + sevent.s_marker2 = geomtag; + sevent.f_vertices2[0] = pointmark(forg); + sevent.f_vertices2[1] = pointmark(fdest); + sevent.f_vertices2[2] = 0; + sevent.int_point[0] = pp[0]; + sevent.int_point[1] = pp[1]; + sevent.int_point[2] = pp[2]; + } else if (etype == 2) { + printf("PLC Error: A vertex lies in a facet.\n"); + printf(" Vertex: [%d] (%g,%g,%g).\n",pointmark(pp),pp[0],pp[1],pp[2]); + printf(" Facet: [%d,%d,%d] #%d\n", pointmark(forg), pointmark(fdest), + pointmark(fapex), geomtag); + sevent.e_type = 8; + sevent.f_marker1 = 0; + sevent.s_marker1 = 0; + sevent.f_vertices1[0] = pointmark(pp); + sevent.f_vertices1[1] = 0; + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = geomtag; + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(forg); + sevent.f_vertices2[1] = pointmark(fdest); + sevent.f_vertices2[2] = pointmark(fapex); + sevent.int_point[0] = pp[0]; + sevent.int_point[1] = pp[1]; + sevent.int_point[2] = pp[2]; + } + } else if (pointtype(pp) == FREESEGVERTEX) { + face parentseg, parentsh; + sdecode(point2sh(pp), parentseg); + spivot(parentseg, parentsh); + if (parentseg.sh != NULL) { + point p1 = farsorg(parentseg); + point p2 = farsdest(parentseg); + if (etype == 1) { + printf("PLC Error: Two segments intersect at point (%g,%g,%g).\n", + pp[0], pp[1], pp[2]); + printf(" Segment 1: [%d, %d], #%d (%d)\n", pointmark(forg), + pointmark(fdest), geomtag, facemark); + printf(" Segment 2: [%d, %d], #%d (%d)\n", pointmark(p1), + pointmark(p2), shellmark(parentseg), + parentsh.sh ? shellmark(parentsh) : 0); + sevent.e_type = 1; + sevent.f_marker1 = facemark; + sevent.s_marker1 = geomtag; + sevent.f_vertices1[0] = pointmark(forg); + sevent.f_vertices1[1] = pointmark(fdest); + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = (parentsh.sh ? shellmark(parentsh) : 0); + sevent.s_marker2 = shellmark(parentseg); + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = 0; + sevent.int_point[0] = pp[0]; + sevent.int_point[1] = pp[1]; + sevent.int_point[2] = pp[2]; + } else if (etype == 2) { + printf("PLC Error: A segment and a facet intersect at point"); + printf(" (%g,%g,%g).\n", pp[0], pp[1], pp[2]); + printf(" Segment: [%d, %d], #%d (%d)\n", pointmark(p1), + pointmark(p2), shellmark(parentseg), + parentsh.sh ? shellmark(parentsh) : 0); + printf(" Facet: [%d,%d,%d] #%d\n", pointmark(forg), + pointmark(fdest), pointmark(fapex), geomtag); + sevent.e_type = 2; + sevent.f_marker1 = (parentsh.sh ? shellmark(parentsh) : 0); + sevent.s_marker1 = shellmark(parentseg); + sevent.f_vertices1[0] = pointmark(p1); + sevent.f_vertices1[1] = pointmark(p2); + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = geomtag; + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(forg); + sevent.f_vertices2[1] = pointmark(fdest); + sevent.f_vertices2[2] = pointmark(fapex); + sevent.int_point[0] = pp[0]; + sevent.int_point[1] = pp[1]; + sevent.int_point[2] = pp[2]; + } + } else { + terminatetetgen(this, 2); // Report a bug. + } + } else if (pointtype(pp) == FREEFACETVERTEX) { + face parentsh; + sdecode(point2sh(pp), parentsh); + if (parentsh.sh != NULL) { + point p1 = sorg(parentsh); + point p2 = sdest(parentsh); + point p3 = sapex(parentsh); + if (etype == 1) { + printf("PLC Error: A segment and a facet intersect at point"); + printf(" (%g,%g,%g).\n", pp[0], pp[1], pp[2]); + printf(" Segment : [%d, %d], #%d (%d)\n", pointmark(forg), + pointmark(fdest), geomtag, facemark); + printf(" Facet : [%d, %d, %d] #%d.\n", pointmark(p1), + pointmark(p2), pointmark(p3), shellmark(parentsh)); + sevent.e_type = 2; + sevent.f_marker1 = facemark; + sevent.s_marker1 = geomtag; + sevent.f_vertices1[0] = pointmark(forg); + sevent.f_vertices1[1] = pointmark(fdest); + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = shellmark(parentsh); + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = pointmark(p3); + sevent.int_point[0] = pp[0]; + sevent.int_point[1] = pp[1]; + sevent.int_point[2] = pp[2]; + } else if (etype == 2) { + printf("PLC Error: Two facets intersect at point (%g,%g,%g).\n", + pp[0], pp[1], pp[2]); + printf(" Facet 1: [%d, %d, %d] #%d.\n", pointmark(forg), + pointmark(fdest), pointmark(fapex), geomtag); + printf(" Facet 2: [%d, %d, %d] #%d.\n", pointmark(p1), + pointmark(p2), pointmark(p3), shellmark(parentsh)); + sevent.e_type = 3; + sevent.f_marker1 = geomtag; + sevent.s_marker1 = 0; + sevent.f_vertices1[0] = pointmark(forg); + sevent.f_vertices1[1] = pointmark(fdest); + sevent.f_vertices1[2] = pointmark(fapex); + sevent.f_marker2 = shellmark(parentsh); + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = pointmark(p3); + sevent.int_point[0] = pp[0]; + sevent.int_point[1] = pp[1]; + sevent.int_point[2] = pp[2]; + } + } else { + terminatetetgen(this, 2); // Report a bug. + } + } else if (pointtype(pp) == FREEVOLVERTEX) { + // This is not a PLC error. + // We should shift the vertex. + // not down yet. + terminatetetgen(this, 2); // Report a bug. + } else { + terminatetetgen(this, 2); // Report a bug. + } + terminatetetgen(this, 3); + } else if (dir == ACROSSEDGE) { + if (issubseg(*itet)) { + face checkseg; + tsspivot1(*itet, checkseg); + face parentsh; + spivot(checkseg, parentsh); + // Calulcate the intersecting point. + point p1 = sorg(checkseg); + point p2 = sdest(checkseg); + REAL P[3], Q[3], tp = 0, tq = 0; + linelineint(e1, e2, p1, p2, P, Q, &tp, &tq); + if (etype == 1) { + printf("PLC Error: Two segments intersect at point (%g,%g,%g).\n", + P[0], P[1], P[2]); + printf(" Segment 1: [%d, %d] #%d (%d)\n", pointmark(forg), + pointmark(fdest), geomtag, facemark); + printf(" Segment 2: [%d, %d] #%d (%d)\n", pointmark(p1), + pointmark(p2), shellmark(checkseg), + parentsh.sh ? shellmark(parentsh) : 0); + sevent.e_type = 1; + sevent.f_marker1 = facemark; + sevent.s_marker1 = geomtag; + sevent.f_vertices1[0] = pointmark(forg); + sevent.f_vertices1[1] = pointmark(fdest); + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = (parentsh.sh ? shellmark(parentsh) : 0); + sevent.s_marker2 = shellmark(checkseg); + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = 0; + sevent.int_point[0] = P[0]; + sevent.int_point[1] = P[1]; + sevent.int_point[2] = P[2]; + } else if (etype == 2) { + printf("PLC Error: A segment and a facet intersect at point"); + printf(" (%g,%g,%g).\n", P[0], P[1], P[2]); + printf(" Segment: [%d, %d] #%d (%d)\n", pointmark(p1), + pointmark(p2), shellmark(checkseg), + parentsh.sh ? shellmark(parentsh) : 0); + printf(" Facet: [%d, %d, %d] #%d.\n", pointmark(forg), + pointmark(fdest), pointmark(fapex), geomtag); + sevent.e_type = 2; + sevent.f_marker1 = (parentsh.sh ? shellmark(parentsh) : 0); + sevent.s_marker1 = shellmark(checkseg); + sevent.f_vertices1[0] = pointmark(p1); + sevent.f_vertices1[1] = pointmark(p2); + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = geomtag; + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(forg); + sevent.f_vertices2[1] = pointmark(fdest); + sevent.f_vertices2[2] = pointmark(fapex); + sevent.int_point[0] = P[0]; + sevent.int_point[1] = P[1]; + sevent.int_point[2] = P[2]; + } + terminatetetgen(this, 3); + } + } else if (dir == ACROSSFACE) { + if (issubface(*itet)) { + face checksh; + tspivot(*itet, checksh); + point p1 = sorg(checksh); + point p2 = sdest(checksh); + point p3 = sapex(checksh); + REAL ip[3], u = 0; + planelineint(p1, p2, p3, e1, e2, ip, &u); + if (etype == 1) { + printf("PLC Error: A segment and a facet intersect at point"); + printf(" (%g,%g,%g).\n", ip[0], ip[1], ip[2]); + printf(" Segment: [%d, %d] #%d (%d)\n", pointmark(forg), + pointmark(fdest), geomtag, facemark); + printf(" Facet: [%d, %d, %d] #%d.\n", pointmark(p1), + pointmark(p2), pointmark(p3), shellmark(checksh)); + sevent.e_type = 2; + sevent.f_marker1 = facemark; + sevent.s_marker1 = geomtag; + sevent.f_vertices1[0] = pointmark(forg); + sevent.f_vertices1[1] = pointmark(fdest); + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = shellmark(checksh); + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = pointmark(p3); + sevent.int_point[0] = ip[0]; + sevent.int_point[1] = ip[1]; + sevent.int_point[2] = ip[2]; + } else if (etype == 2) { + printf("PLC Error: Two facets intersect at point (%g,%g,%g).\n", + ip[0], ip[1], ip[2]); + printf(" Facet 1: [%d, %d, %d] #%d.\n", pointmark(forg), + pointmark(fdest), pointmark(fapex), geomtag); + printf(" Facet 2: [%d, %d, %d] #%d.\n", pointmark(p1), + pointmark(p2), pointmark(p3), shellmark(checksh)); + sevent.e_type = 3; + sevent.f_marker1 = geomtag; + sevent.s_marker1 = 0; + sevent.f_vertices1[0] = pointmark(forg); + sevent.f_vertices1[1] = pointmark(fdest); + sevent.f_vertices1[2] = pointmark(fapex); + sevent.f_marker2 = shellmark(checksh); + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = pointmark(p3); + sevent.int_point[0] = ip[0]; + sevent.int_point[1] = ip[1]; + sevent.int_point[2] = ip[2]; + } + terminatetetgen(this, 3); + } + } else { + // An unknown 'dir'. + terminatetetgen(this, 2); + } + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// report_selfint_face() Report a self-intersection at a facet. // +// // +// The triangle with vertices 'p1', 'p2', and 'p3' intersects with the edge // +// of the tetrahedra 'iedge'. The intersection type is reported by 'intflag',// +// 'types', and 'poss'. // +// // +// This routine ASSUMES (1) the triangle (p1,p2,p3) must belong to a facet, // +// 'sface' is a subface of the same facet; and (2) 'iedge' must be either a // +// segment or an edge of another facet. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::report_selfint_face(point p1, point p2, point p3, face* sface, + triface* iedge, int intflag, int* types, int* poss) +{ + face iface; + point e1 = NULL, e2 = NULL, e3 = NULL; + int etype = 0, geomtag = 0, facemark = 0; + + geomtag = shellmark(*sface); + + if (issubface(*iedge)) { + tspivot(*iedge, iface); + e1 = sorg(iface); + e2 = sdest(iface); + e3 = sapex(iface); + etype = 2; + facemark = geomtag; + } else if (issubseg(*iedge)) { + tsspivot1(*iedge, iface); + e1 = farsorg(iface); + e2 = farsdest(iface); + etype = 1; + face parentsh; + spivot(iface, parentsh); + facemark = shellmark(parentsh); + } else { + terminatetetgen(this, 2); + } + + if (intflag == 2) { + // The triangle and the edge intersect only at one point. + REAL ip[3], u = 0; + planelineint(p1, p2, p3, e1, e2, ip, &u); + if ((types[0] == (int) ACROSSFACE) || + (types[0] == (int) ACROSSEDGE)) { + // The triangle and the edge intersect in their interiors. + if (etype == 1) { + printf("PLC Error: A segment and a facet intersect at point"); + printf(" (%g,%g,%g).\n", ip[0], ip[1], ip[2]); + printf(" Segment: [%d,%d] #%d (%d)\n", pointmark(e1), pointmark(e2), + shellmark(iface), facemark); + printf(" Facet: [%d,%d,%d] #%d\n", pointmark(p1), + pointmark(p2), pointmark(p3), geomtag); + sevent.e_type = 2; + sevent.f_marker1 = facemark; + sevent.s_marker1 = shellmark(iface); + sevent.f_vertices1[0] = pointmark(e1); + sevent.f_vertices1[1] = pointmark(e2); + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = geomtag; + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = pointmark(p3); + sevent.int_point[0] = ip[0]; + sevent.int_point[1] = ip[1]; + sevent.int_point[2] = ip[2]; + } else { + printf("PLC Error: Two facets intersect at point"); + printf(" (%g,%g,%g).\n", ip[0], ip[1], ip[2]); + printf(" Facet 1: [%d,%d,%d] #%d\n", pointmark(e1), pointmark(e2), + pointmark(sorg(iface)), shellmark(iface)); + printf(" Facet 2: [%d,%d,%d] #%d\n", pointmark(p1), + pointmark(p2), pointmark(p3), geomtag); + sevent.e_type = 3; + sevent.f_marker1 = shellmark(iface); + sevent.s_marker1 = 0; + sevent.f_vertices1[0] = pointmark(e1); + sevent.f_vertices1[1] = pointmark(e2); + sevent.f_vertices1[2] = pointmark(sorg(iface)); + sevent.f_marker2 = geomtag; + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = pointmark(p3); + sevent.int_point[0] = ip[0]; + sevent.int_point[1] = ip[1]; + sevent.int_point[2] = ip[2]; + } + } else if (types[0] == (int) ACROSSVERT) { + // A vertex of the triangle and the edge intersect. + point crosspt = NULL; + if (poss[0] == 0) { + crosspt = p1; + } else if (poss[0] == 1) { + crosspt = p2; + } else if (poss[0] == 2) { + crosspt = p3; + } else { + terminatetetgen(this, 2); + } + if (!issteinerpoint(crosspt)) { + if (etype == 1) { + printf("PLC Error: A vertex and a segment intersect at (%g,%g,%g)\n", + crosspt[0], crosspt[1], crosspt[2]); + printf(" Vertex: #%d\n", pointmark(crosspt)); + printf(" Segment: [%d,%d] #%d (%d)\n", pointmark(e1), pointmark(e2), + shellmark(iface), facemark); + sevent.e_type = 7; + sevent.f_marker1 = 0; + sevent.s_marker1 = 0; + sevent.f_vertices1[0] = pointmark(crosspt); + sevent.f_vertices1[1] = 0; + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = facemark; + sevent.s_marker2 = shellmark(iface); + sevent.f_vertices2[0] = pointmark(e1); + sevent.f_vertices2[1] = pointmark(e2); + sevent.f_vertices2[2] = 0; + sevent.int_point[0] = crosspt[0]; + sevent.int_point[1] = crosspt[1]; + sevent.int_point[2] = crosspt[2]; + } else { + printf("PLC Error: A vertex and a facet intersect at (%g,%g,%g)\n", + crosspt[0], crosspt[1], crosspt[2]); + printf(" Vertex: #%d\n", pointmark(crosspt)); + printf(" Facet: [%d,%d,%d] #%d\n", pointmark(p1), + pointmark(p2), pointmark(p3), geomtag); + sevent.e_type = 8; + sevent.f_marker1 = 0; + sevent.s_marker1 = 0; + sevent.f_vertices1[0] = pointmark(crosspt); + sevent.f_vertices1[1] = 0; + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = geomtag; + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = pointmark(p3); + sevent.int_point[0] = crosspt[0]; + sevent.int_point[1] = crosspt[1]; + sevent.int_point[2] = crosspt[2]; + } + } else { + // It is a Steiner point. To be processed. + terminatetetgen(this, 2); + } + } else if ((types[0] == (int) TOUCHFACE) || + (types[0] == (int) TOUCHEDGE)) { + // The triangle and a vertex of the edge intersect. + point touchpt = NULL; + if (poss[1] == 0) { + touchpt = org(*iedge); + } else if (poss[1] == 1) { + touchpt = dest(*iedge); + } else { + terminatetetgen(this, 2); + } + if (!issteinerpoint(touchpt)) { + printf("PLC Error: A vertex and a facet intersect at (%g,%g,%g)\n", + touchpt[0], touchpt[1], touchpt[2]); + printf(" Vertex: #%d\n", pointmark(touchpt)); + printf(" Facet: [%d,%d,%d] #%d\n", pointmark(p1), + pointmark(p2), pointmark(p3), geomtag); + sevent.e_type = 8; + sevent.f_marker1 = 0; + sevent.s_marker1 = 0; + sevent.f_vertices1[0] = pointmark(touchpt); + sevent.f_vertices1[1] = 0; + sevent.f_vertices1[2] = 0; + sevent.f_marker2 = geomtag; + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = pointmark(p3); + sevent.int_point[0] = touchpt[0]; + sevent.int_point[1] = touchpt[1]; + sevent.int_point[2] = touchpt[2]; + } else { + // It is a Steiner point. To be processed. + terminatetetgen(this, 2); + } + } else if (types[0] == (int) SHAREVERT) { + terminatetetgen(this, 2); + } else { + terminatetetgen(this, 2); + } + } else if (intflag == 4) { + if (types[0] == (int) SHAREFACE) { + printf("PLC Error: Two facets are overlapping.\n"); + printf(" Facet 1: [%d,%d,%d] #%d\n", pointmark(e1), + pointmark(e2), pointmark(e3), facemark); + printf(" Facet 2: [%d,%d,%d] #%d\n", pointmark(p1), + pointmark(p2), pointmark(p3), geomtag); + sevent.e_type = 6; + sevent.f_marker1 = facemark; + sevent.s_marker1 = 0; + sevent.f_vertices1[0] = pointmark(e1); + sevent.f_vertices1[1] = pointmark(e2); + sevent.f_vertices1[2] = pointmark(e3); + sevent.f_marker2 = geomtag; + sevent.s_marker2 = 0; + sevent.f_vertices2[0] = pointmark(p1); + sevent.f_vertices2[1] = pointmark(p2); + sevent.f_vertices2[2] = pointmark(p3); + } else { + terminatetetgen(this, 2); + } + } else { + terminatetetgen(this, 2); + } + + terminatetetgen(this, 3); + return 0; +} + +//// //// +//// //// +//// geom_cxx ///////////////////////////////////////////////////////////////// + +//// flip_cxx ///////////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// flip23() Perform a 2-to-3 flip (face-to-edge flip). // +// // +// 'fliptets' is an array of three tets (handles), where the [0] and [1] are // +// [a,b,c,d] and [b,a,c,e]. The three new tets: [e,d,a,b], [e,d,b,c], and // +// [e,d,c,a] are returned in [0], [1], and [2] of 'fliptets'. As a result, // +// The face [a,b,c] is removed, and the edge [d,e] is created. // +// // +// If 'hullflag' > 0, hull tets may be involved in this flip, i.e., one of // +// the five vertices may be 'dummypoint'. There are two canonical cases: // +// (1) d is 'dummypoint', then all three new tets are hull tets. If e is // +// 'dummypoint', we reconfigure e to d, i.e., turn it up-side down. // +// (2) c is 'dummypoint', then two new tets: [e,d,b,c] and [e,d,c,a], are // +// hull tets. If a or b is 'dummypoint', we reconfigure it to c, i.e., // +// rotate the three input tets counterclockwisely (right-hand rule) // +// until a or b is in c's position. // +// // +// If 'fc->enqflag' is set, convex hull faces will be queued for flipping. // +// In particular, if 'fc->enqflag' is 1, it is called by incrementalflip() // +// after the insertion of a new point. It is assumed that 'd' is the new // +// point. IN this case, only link faces of 'd' are queued. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::flip23(triface* fliptets, int hullflag, flipconstraints *fc) +{ + triface topcastets[3], botcastets[3]; + triface newface, casface; + point pa, pb, pc, pd, pe; + REAL attrib, volume; + int dummyflag = 0; // range = {-1, 0, 1, 2}. + int i; + + if (hullflag > 0) { + // Check if e is dummypoint. + if (oppo(fliptets[1]) == dummypoint) { + // Swap the two old tets. + newface = fliptets[0]; + fliptets[0] = fliptets[1]; + fliptets[1] = newface; + dummyflag = -1; // d is dummypoint. + } else { + // Check if either a or b is dummypoint. + if (org(fliptets[0]) == dummypoint) { + dummyflag = 1; // a is dummypoint. + enextself(fliptets[0]); + eprevself(fliptets[1]); + } else if (dest(fliptets[0]) == dummypoint) { + dummyflag = 2; // b is dummypoint. + eprevself(fliptets[0]); + enextself(fliptets[1]); + } else { + dummyflag = 0; // either c or d may be dummypoint. + } + } + } + + pa = org(fliptets[0]); + pb = dest(fliptets[0]); + pc = apex(fliptets[0]); + pd = oppo(fliptets[0]); + pe = oppo(fliptets[1]); + + flip23count++; + + // Get the outer boundary faces. + for (i = 0; i < 3; i++) { + fnext(fliptets[0], topcastets[i]); + enextself(fliptets[0]); + } + for (i = 0; i < 3; i++) { + fnext(fliptets[1], botcastets[i]); + eprevself(fliptets[1]); + } + + // Re-use fliptets[0] and fliptets[1]. + fliptets[0].ver = 11; + fliptets[1].ver = 11; + setelemmarker(fliptets[0].tet, 0); // Clear all flags. + setelemmarker(fliptets[1].tet, 0); + // NOTE: the element attributes and volume constraint remain unchanged. + if (checksubsegflag) { + // Dealloc the space to subsegments. + if (fliptets[0].tet[8] != NULL) { + tet2segpool->dealloc((shellface *) fliptets[0].tet[8]); + fliptets[0].tet[8] = NULL; + } + if (fliptets[1].tet[8] != NULL) { + tet2segpool->dealloc((shellface *) fliptets[1].tet[8]); + fliptets[1].tet[8] = NULL; + } + } + if (checksubfaceflag) { + // Dealloc the space to subfaces. + if (fliptets[0].tet[9] != NULL) { + tet2subpool->dealloc((shellface *) fliptets[0].tet[9]); + fliptets[0].tet[9] = NULL; + } + if (fliptets[1].tet[9] != NULL) { + tet2subpool->dealloc((shellface *) fliptets[1].tet[9]); + fliptets[1].tet[9] = NULL; + } + } + // Create a new tet. + maketetrahedron(&(fliptets[2])); + // The new tet have the same attributes from the old tet. + for (i = 0; i < numelemattrib; i++) { + attrib = elemattribute(fliptets[0].tet, i); + setelemattribute(fliptets[2].tet, i, attrib); + } + if (b->varvolume) { + volume = volumebound(fliptets[0].tet); + setvolumebound(fliptets[2].tet, volume); + } + + if (hullflag > 0) { + // Check if d is dummytet. + if (pd != dummypoint) { + setvertices(fliptets[0], pe, pd, pa, pb); // [e,d,a,b] * + setvertices(fliptets[1], pe, pd, pb, pc); // [e,d,b,c] * + // Check if c is dummypoint. + if (pc != dummypoint) { + setvertices(fliptets[2], pe, pd, pc, pa); // [e,d,c,a] * + } else { + setvertices(fliptets[2], pd, pe, pa, pc); // [d,e,a,c] + esymself(fliptets[2]); // [e,d,c,a] * + } + // The hullsize does not change. + } else { + // d is dummypoint. + setvertices(fliptets[0], pa, pb, pe, pd); // [a,b,e,d] + setvertices(fliptets[1], pb, pc, pe, pd); // [b,c,e,d] + setvertices(fliptets[2], pc, pa, pe, pd); // [c,a,e,d] + // Adjust the faces to [e,d,a,b], [e,d,b,c], [e,d,c,a] * + for (i = 0; i < 3; i++) { + eprevesymself(fliptets[i]); + enextself(fliptets[i]); + } + // We deleted one hull tet, and created three hull tets. + hullsize += 2; + } + } else { + setvertices(fliptets[0], pe, pd, pa, pb); // [e,d,a,b] * + setvertices(fliptets[1], pe, pd, pb, pc); // [e,d,b,c] * + setvertices(fliptets[2], pe, pd, pc, pa); // [e,d,c,a] * + } + + if (fc->remove_ndelaunay_edge) { // calc_tetprism_vol + REAL volneg[2], volpos[3], vol_diff; + if (pd != dummypoint) { + if (pc != dummypoint) { + volpos[0] = tetprismvol(pe, pd, pa, pb); + volpos[1] = tetprismvol(pe, pd, pb, pc); + volpos[2] = tetprismvol(pe, pd, pc, pa); + volneg[0] = tetprismvol(pa, pb, pc, pd); + volneg[1] = tetprismvol(pb, pa, pc, pe); + } else { // pc == dummypoint + volpos[0] = tetprismvol(pe, pd, pa, pb); + volpos[1] = 0.; + volpos[2] = 0.; + volneg[0] = 0.; + volneg[1] = 0.; + } + } else { // pd == dummypoint. + volpos[0] = 0.; + volpos[1] = 0.; + volpos[2] = 0.; + volneg[0] = 0.; + volneg[1] = tetprismvol(pb, pa, pc, pe); + } + vol_diff = volpos[0] + volpos[1] + volpos[2] - volneg[0] - volneg[1]; + fc->tetprism_vol_sum += vol_diff; // Update the total sum. + } + + // Bond three new tets together. + for (i = 0; i < 3; i++) { + esym(fliptets[i], newface); + bond(newface, fliptets[(i + 1) % 3]); + } + // Bond to top outer boundary faces (at [a,b,c,d]). + for (i = 0; i < 3; i++) { + eorgoppo(fliptets[i], newface); // At edges [b,a], [c,b], [a,c]. + bond(newface, topcastets[i]); + } + // Bond bottom outer boundary faces (at [b,a,c,e]). + for (i = 0; i < 3; i++) { + edestoppo(fliptets[i], newface); // At edges [a,b], [b,c], [c,a]. + bond(newface, botcastets[i]); + } + + if (checksubsegflag) { + // Bond subsegments if there are. + // Each new tet has 5 edges to be checked (except the edge [e,d]). + face checkseg; + // The middle three: [a,b], [b,c], [c,a]. + for (i = 0; i < 3; i++) { + if (issubseg(topcastets[i])) { + tsspivot1(topcastets[i], checkseg); + eorgoppo(fliptets[i], newface); + tssbond1(newface, checkseg); + sstbond1(checkseg, newface); + if (fc->chkencflag & 1) { + enqueuesubface(badsubsegs, &checkseg); + } + } + } + // The top three: [d,a], [d,b], [d,c]. Two tets per edge. + for (i = 0; i < 3; i++) { + eprev(topcastets[i], casface); + if (issubseg(casface)) { + tsspivot1(casface, checkseg); + enext(fliptets[i], newface); + tssbond1(newface, checkseg); + sstbond1(checkseg, newface); + esym(fliptets[(i + 2) % 3], newface); + eprevself(newface); + tssbond1(newface, checkseg); + sstbond1(checkseg, newface); + if (fc->chkencflag & 1) { + enqueuesubface(badsubsegs, &checkseg); + } + } + } + // The bot three: [a,e], [b,e], [c,e]. Two tets per edge. + for (i = 0; i < 3; i++) { + enext(botcastets[i], casface); + if (issubseg(casface)) { + tsspivot1(casface, checkseg); + eprev(fliptets[i], newface); + tssbond1(newface, checkseg); + sstbond1(checkseg, newface); + esym(fliptets[(i + 2) % 3], newface); + enextself(newface); + tssbond1(newface, checkseg); + sstbond1(checkseg, newface); + if (fc->chkencflag & 1) { + enqueuesubface(badsubsegs, &checkseg); + } + } + } + } // if (checksubsegflag) + + if (checksubfaceflag) { + // Bond 6 subfaces if there are. + face checksh; + for (i = 0; i < 3; i++) { + if (issubface(topcastets[i])) { + tspivot(topcastets[i], checksh); + eorgoppo(fliptets[i], newface); + sesymself(checksh); + tsbond(newface, checksh); + if (fc->chkencflag & 2) { + enqueuesubface(badsubfacs, &checksh); + } + } + } + for (i = 0; i < 3; i++) { + if (issubface(botcastets[i])) { + tspivot(botcastets[i], checksh); + edestoppo(fliptets[i], newface); + sesymself(checksh); + tsbond(newface, checksh); + if (fc->chkencflag & 2) { + enqueuesubface(badsubfacs, &checksh); + } + } + } + } // if (checksubfaceflag) + + if (fc->chkencflag & 4) { + // Put three new tets into check list. + for (i = 0; i < 3; i++) { + enqueuetetrahedron(&(fliptets[i])); + } + } + + // Update the point-to-tet map. + setpoint2tet(pa, (tetrahedron) fliptets[0].tet); + setpoint2tet(pb, (tetrahedron) fliptets[0].tet); + setpoint2tet(pc, (tetrahedron) fliptets[1].tet); + setpoint2tet(pd, (tetrahedron) fliptets[0].tet); + setpoint2tet(pe, (tetrahedron) fliptets[0].tet); + + if (hullflag > 0) { + if (dummyflag != 0) { + // Restore the original position of the points (for flipnm()). + if (dummyflag == -1) { + // Reverse the edge. + for (i = 0; i < 3; i++) { + esymself(fliptets[i]); + } + // Swap the last two new tets. + newface = fliptets[1]; + fliptets[1] = fliptets[2]; + fliptets[2] = newface; + } else { + // either a or b were swapped. + if (dummyflag == 1) { + // a is dummypoint. + newface = fliptets[0]; + fliptets[0] = fliptets[2]; + fliptets[2] = fliptets[1]; + fliptets[1] = newface; + } else { // dummyflag == 2 + // b is dummypoint. + newface = fliptets[0]; + fliptets[0] = fliptets[1]; + fliptets[1] = fliptets[2]; + fliptets[2] = newface; + } + } + } + } + + if (fc->enqflag > 0) { + // Queue faces which may be locally non-Delaunay. + for (i = 0; i < 3; i++) { + eprevesym(fliptets[i], newface); + flippush(flipstack, &newface); + } + if (fc->enqflag > 1) { + for (i = 0; i < 3; i++) { + enextesym(fliptets[i], newface); + flippush(flipstack, &newface); + } + } + } + + recenttet = fliptets[0]; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// flip32() Perform a 3-to-2 flip (edge-to-face flip). // +// // +// 'fliptets' is an array of three tets (handles), which are [e,d,a,b], // +// [e,d,b,c], and [e,d,c,a]. The two new tets: [a,b,c,d] and [b,a,c,e] are // +// returned in [0] and [1] of 'fliptets'. As a result, the edge [e,d] is // +// replaced by the face [a,b,c]. // +// // +// If 'hullflag' > 0, hull tets may be involved in this flip, i.e., one of // +// the five vertices may be 'dummypoint'. There are two canonical cases: // +// (1) d is 'dummypoint', then [a,b,c,d] is hull tet. If e is 'dummypoint',// +// we reconfigure e to d, i.e., turnover it. // +// (2) c is 'dummypoint' then both [a,b,c,d] and [b,a,c,e] are hull tets. // +// If a or b is 'dummypoint', we reconfigure it to c, i.e., rotate the // +// three old tets counterclockwisely (right-hand rule) until a or b // +// is in c's position. // +// // +// If 'fc->enqflag' is set, convex hull faces will be queued for flipping. // +// In particular, if 'fc->enqflag' is 1, it is called by incrementalflip() // +// after the insertion of a new point. It is assumed that 'a' is the new // +// point. In this case, only link faces of 'a' are queued. // +// // +// If 'checksubfaceflag' is on (global variable), and assume [e,d] is not a // +// segment. There may be two (interior) subfaces sharing at [e,d], which are // +// [e,d,p] and [e,d,q], where the pair (p,q) may be either (a,b), or (b,c), // +// or (c,a) In such case, a 2-to-2 flip is performed on these two subfaces // +// and two new subfaces [p,q,e] and [p,q,d] are created. They are inserted // +// back into the tetrahedralization. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::flip32(triface* fliptets, int hullflag, flipconstraints *fc) +{ + triface topcastets[3], botcastets[3]; + triface newface, casface; + face flipshs[3]; + face checkseg; + point pa, pb, pc, pd, pe; + REAL attrib, volume; + int dummyflag = 0; // Rangle = {-1, 0, 1, 2} + int spivot = -1, scount = 0; // for flip22() + int t1ver; + int i, j; + + if (hullflag > 0) { + // Check if e is 'dummypoint'. + if (org(fliptets[0]) == dummypoint) { + // Reverse the edge. + for (i = 0; i < 3; i++) { + esymself(fliptets[i]); + } + // Swap the last two tets. + newface = fliptets[1]; + fliptets[1] = fliptets[2]; + fliptets[2] = newface; + dummyflag = -1; // e is dummypoint. + } else { + // Check if a or b is the 'dummypoint'. + if (apex(fliptets[0]) == dummypoint) { + dummyflag = 1; // a is dummypoint. + newface = fliptets[0]; + fliptets[0] = fliptets[1]; + fliptets[1] = fliptets[2]; + fliptets[2] = newface; + } else if (apex(fliptets[1]) == dummypoint) { + dummyflag = 2; // b is dummypoint. + newface = fliptets[0]; + fliptets[0] = fliptets[2]; + fliptets[2] = fliptets[1]; + fliptets[1] = newface; + } else { + dummyflag = 0; // either c or d may be dummypoint. + } + } + } + + pa = apex(fliptets[0]); + pb = apex(fliptets[1]); + pc = apex(fliptets[2]); + pd = dest(fliptets[0]); + pe = org(fliptets[0]); + + flip32count++; + + // Get the outer boundary faces. + for (i = 0; i < 3; i++) { + eorgoppo(fliptets[i], casface); + fsym(casface, topcastets[i]); + } + for (i = 0; i < 3; i++) { + edestoppo(fliptets[i], casface); + fsym(casface, botcastets[i]); + } + + if (checksubfaceflag) { + // Check if there are interior subfaces at the edge [e,d]. + for (i = 0; i < 3; i++) { + tspivot(fliptets[i], flipshs[i]); + if (flipshs[i].sh != NULL) { + // Found an interior subface. + stdissolve(flipshs[i]); // Disconnect the sub-tet bond. + scount++; + } else { + spivot = i; + } + } + } + + // Re-use fliptets[0] and fliptets[1]. + fliptets[0].ver = 11; + fliptets[1].ver = 11; + setelemmarker(fliptets[0].tet, 0); // Clear all flags. + setelemmarker(fliptets[1].tet, 0); + if (checksubsegflag) { + // Dealloc the space to subsegments. + if (fliptets[0].tet[8] != NULL) { + tet2segpool->dealloc((shellface *) fliptets[0].tet[8]); + fliptets[0].tet[8] = NULL; + } + if (fliptets[1].tet[8] != NULL) { + tet2segpool->dealloc((shellface *) fliptets[1].tet[8]); + fliptets[1].tet[8] = NULL; + } + } + if (checksubfaceflag) { + // Dealloc the space to subfaces. + if (fliptets[0].tet[9] != NULL) { + tet2subpool->dealloc((shellface *) fliptets[0].tet[9]); + fliptets[0].tet[9] = NULL; + } + if (fliptets[1].tet[9] != NULL) { + tet2subpool->dealloc((shellface *) fliptets[1].tet[9]); + fliptets[1].tet[9] = NULL; + } + } + if (checksubfaceflag) { + if (scount > 0) { + // The element attributes and volume constraint must be set correctly. + // There are two subfaces involved in this flip. The three tets are + // separated into two different regions, one may be exterior. The + // first region has two tets, and the second region has only one. + // The two created tets must be in the same region as the first region. + // The element attributes and volume constraint must be set correctly. + //assert(spivot != -1); + // The tet fliptets[spivot] is in the first region. + for (j = 0; j < 2; j++) { + for (i = 0; i < numelemattrib; i++) { + attrib = elemattribute(fliptets[spivot].tet, i); + setelemattribute(fliptets[j].tet, i, attrib); + } + if (b->varvolume) { + volume = volumebound(fliptets[spivot].tet); + setvolumebound(fliptets[j].tet, volume); + } + } + } + } + // Delete an old tet. + tetrahedrondealloc(fliptets[2].tet); + + if (hullflag > 0) { + // Check if c is dummypointc. + if (pc != dummypoint) { + // Check if d is dummypoint. + if (pd != dummypoint) { + // No hull tet is involved. + } else { + // We deleted three hull tets, and created one hull tet. + hullsize -= 2; + } + setvertices(fliptets[0], pa, pb, pc, pd); + setvertices(fliptets[1], pb, pa, pc, pe); + } else { + // c is dummypoint. The two new tets are hull tets. + setvertices(fliptets[0], pb, pa, pd, pc); + setvertices(fliptets[1], pa, pb, pe, pc); + // Adjust badc -> abcd. + esymself(fliptets[0]); + // Adjust abec -> bace. + esymself(fliptets[1]); + // The hullsize does not change. + } + } else { + setvertices(fliptets[0], pa, pb, pc, pd); + setvertices(fliptets[1], pb, pa, pc, pe); + } + + if (fc->remove_ndelaunay_edge) { // calc_tetprism_vol + REAL volneg[3], volpos[2], vol_diff; + if (pc != dummypoint) { + if (pd != dummypoint) { + volneg[0] = tetprismvol(pe, pd, pa, pb); + volneg[1] = tetprismvol(pe, pd, pb, pc); + volneg[2] = tetprismvol(pe, pd, pc, pa); + volpos[0] = tetprismvol(pa, pb, pc, pd); + volpos[1] = tetprismvol(pb, pa, pc, pe); + } else { // pd == dummypoint + volneg[0] = 0.; + volneg[1] = 0.; + volneg[2] = 0.; + volpos[0] = 0.; + volpos[1] = tetprismvol(pb, pa, pc, pe); + } + } else { // pc == dummypoint. + volneg[0] = tetprismvol(pe, pd, pa, pb); + volneg[1] = 0.; + volneg[2] = 0.; + volpos[0] = 0.; + volpos[1] = 0.; + } + vol_diff = volpos[0] + volpos[1] - volneg[0] - volneg[1] - volneg[2]; + fc->tetprism_vol_sum += vol_diff; // Update the total sum. + } + + // Bond abcd <==> bace. + bond(fliptets[0], fliptets[1]); + // Bond new faces to top outer boundary faces (at abcd). + for (i = 0; i < 3; i++) { + esym(fliptets[0], newface); + bond(newface, topcastets[i]); + enextself(fliptets[0]); + } + // Bond new faces to bottom outer boundary faces (at bace). + for (i = 0; i < 3; i++) { + esym(fliptets[1], newface); + bond(newface, botcastets[i]); + eprevself(fliptets[1]); + } + + if (checksubsegflag) { + // Bond 9 segments to new (flipped) tets. + for (i = 0; i < 3; i++) { // edges a->b, b->c, c->a. + if (issubseg(topcastets[i])) { + tsspivot1(topcastets[i], checkseg); + tssbond1(fliptets[0], checkseg); + sstbond1(checkseg, fliptets[0]); + tssbond1(fliptets[1], checkseg); + sstbond1(checkseg, fliptets[1]); + if (fc->chkencflag & 1) { + enqueuesubface(badsubsegs, &checkseg); + } + } + enextself(fliptets[0]); + eprevself(fliptets[1]); + } + // The three top edges. + for (i = 0; i < 3; i++) { // edges b->d, c->d, a->d. + esym(fliptets[0], newface); + eprevself(newface); + enext(topcastets[i], casface); + if (issubseg(casface)) { + tsspivot1(casface, checkseg); + tssbond1(newface, checkseg); + sstbond1(checkseg, newface); + if (fc->chkencflag & 1) { + enqueuesubface(badsubsegs, &checkseg); + } + } + enextself(fliptets[0]); + } + // The three bot edges. + for (i = 0; i < 3; i++) { // edges b<-e, c<-e, a<-e. + esym(fliptets[1], newface); + enextself(newface); + eprev(botcastets[i], casface); + if (issubseg(casface)) { + tsspivot1(casface, checkseg); + tssbond1(newface, checkseg); + sstbond1(checkseg, newface); + if (fc->chkencflag & 1) { + enqueuesubface(badsubsegs, &checkseg); + } + } + eprevself(fliptets[1]); + } + } // if (checksubsegflag) + + if (checksubfaceflag) { + face checksh; + // Bond the top three casing subfaces. + for (i = 0; i < 3; i++) { // At edges [b,a], [c,b], [a,c] + if (issubface(topcastets[i])) { + tspivot(topcastets[i], checksh); + esym(fliptets[0], newface); + sesymself(checksh); + tsbond(newface, checksh); + if (fc->chkencflag & 2) { + enqueuesubface(badsubfacs, &checksh); + } + } + enextself(fliptets[0]); + } + // Bond the bottom three casing subfaces. + for (i = 0; i < 3; i++) { // At edges [a,b], [b,c], [c,a] + if (issubface(botcastets[i])) { + tspivot(botcastets[i], checksh); + esym(fliptets[1], newface); + sesymself(checksh); + tsbond(newface, checksh); + if (fc->chkencflag & 2) { + enqueuesubface(badsubfacs, &checksh); + } + } + eprevself(fliptets[1]); + } + + if (scount > 0) { + face flipfaces[2]; + // Perform a 2-to-2 flip in subfaces. + flipfaces[0] = flipshs[(spivot + 1) % 3]; + flipfaces[1] = flipshs[(spivot + 2) % 3]; + sesymself(flipfaces[1]); + flip22(flipfaces, 0, fc->chkencflag); + // Connect the flipped subfaces to flipped tets. + // First go to the corresponding flipping edge. + // Re-use top- and botcastets[0]. + topcastets[0] = fliptets[0]; + botcastets[0] = fliptets[1]; + for (i = 0; i < ((spivot + 1) % 3); i++) { + enextself(topcastets[0]); + eprevself(botcastets[0]); + } + // Connect the top subface to the top tets. + esymself(topcastets[0]); + sesymself(flipfaces[0]); + // Check if there already exists a subface. + tspivot(topcastets[0], checksh); + if (checksh.sh == NULL) { + tsbond(topcastets[0], flipfaces[0]); + fsymself(topcastets[0]); + sesymself(flipfaces[0]); + tsbond(topcastets[0], flipfaces[0]); + } else { + // An invalid 2-to-2 flip. Report a bug. + terminatetetgen(this, 2); + } + // Connect the bot subface to the bottom tets. + esymself(botcastets[0]); + sesymself(flipfaces[1]); + // Check if there already exists a subface. + tspivot(botcastets[0], checksh); + if (checksh.sh == NULL) { + tsbond(botcastets[0], flipfaces[1]); + fsymself(botcastets[0]); + sesymself(flipfaces[1]); + tsbond(botcastets[0], flipfaces[1]); + } else { + // An invalid 2-to-2 flip. Report a bug. + terminatetetgen(this, 2); + } + } // if (scount > 0) + } // if (checksubfaceflag) + + if (fc->chkencflag & 4) { + // Put two new tets into check list. + for (i = 0; i < 2; i++) { + enqueuetetrahedron(&(fliptets[i])); + } + } + + setpoint2tet(pa, (tetrahedron) fliptets[0].tet); + setpoint2tet(pb, (tetrahedron) fliptets[0].tet); + setpoint2tet(pc, (tetrahedron) fliptets[0].tet); + setpoint2tet(pd, (tetrahedron) fliptets[0].tet); + setpoint2tet(pe, (tetrahedron) fliptets[1].tet); + + if (hullflag > 0) { + if (dummyflag != 0) { + // Restore the original position of the points (for flipnm()). + if (dummyflag == -1) { + // e were dummypoint. Swap the two new tets. + newface = fliptets[0]; + fliptets[0] = fliptets[1]; + fliptets[1] = newface; + } else { + // a or b was dummypoint. + if (dummyflag == 1) { + eprevself(fliptets[0]); + enextself(fliptets[1]); + } else { // dummyflag == 2 + enextself(fliptets[0]); + eprevself(fliptets[1]); + } + } + } + } + + if (fc->enqflag > 0) { + // Queue faces which may be locally non-Delaunay. + // pa = org(fliptets[0]); // 'a' may be a new vertex. + enextesym(fliptets[0], newface); + flippush(flipstack, &newface); + eprevesym(fliptets[1], newface); + flippush(flipstack, &newface); + if (fc->enqflag > 1) { + //pb = dest(fliptets[0]); + eprevesym(fliptets[0], newface); + flippush(flipstack, &newface); + enextesym(fliptets[1], newface); + flippush(flipstack, &newface); + //pc = apex(fliptets[0]); + esym(fliptets[0], newface); + flippush(flipstack, &newface); + esym(fliptets[1], newface); + flippush(flipstack, &newface); + } + } + + recenttet = fliptets[0]; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// flip41() Perform a 4-to-1 flip (Remove a vertex). // +// // +// 'fliptets' is an array of four tetrahedra in the star of the removing // +// vertex 'p'. Let the four vertices in the star of p be a, b, c, and d. The // +// four tets in 'fliptets' are: [p,d,a,b], [p,d,b,c], [p,d,c,a], and [a,b,c, // +// p]. On return, 'fliptets[0]' is the new tet [a,b,c,d]. // +// // +// If 'hullflag' is set (> 0), one of the five vertices may be 'dummypoint'. // +// The 'hullsize' may be changed. Note that p may be dummypoint. In this // +// case, four hull tets are replaced by one real tet. // +// // +// If 'checksubface' flag is set (>0), it is possible that there are three // +// interior subfaces connecting at p. If so, a 3-to-1 flip is performed to // +// to remove p from the surface triangulation. // +// // +// If it is called by the routine incrementalflip(), we assume that d is the // +// newly inserted vertex. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::flip41(triface* fliptets, int hullflag, flipconstraints *fc) +{ + triface topcastets[3], botcastet; + triface newface, neightet; + face flipshs[4]; + point pa, pb, pc, pd, pp; + int dummyflag = 0; // in {0, 1, 2, 3, 4} + int spivot = -1, scount = 0; + int t1ver; + int i; + + pa = org(fliptets[3]); + pb = dest(fliptets[3]); + pc = apex(fliptets[3]); + pd = dest(fliptets[0]); + pp = org(fliptets[0]); // The removing vertex. + + flip41count++; + + // Get the outer boundary faces. + for (i = 0; i < 3; i++) { + enext(fliptets[i], topcastets[i]); + fnextself(topcastets[i]); // [d,a,b,#], [d,b,c,#], [d,c,a,#] + enextself(topcastets[i]); // [a,b,d,#], [b,c,d,#], [c,a,d,#] + } + fsym(fliptets[3], botcastet); // [b,a,c,#] + + if (checksubfaceflag) { + // Check if there are three subfaces at 'p'. + // Re-use 'newface'. + for (i = 0; i < 3; i++) { + fnext(fliptets[3], newface); // [a,b,p,d],[b,c,p,d],[c,a,p,d]. + tspivot(newface, flipshs[i]); + if (flipshs[i].sh != NULL) { + spivot = i; // Remember this subface. + scount++; + } + enextself(fliptets[3]); + } + if (scount > 0) { + // There are three subfaces connecting at p. + if (scount < 3) { + // The new subface is one of {[a,b,d], [b,c,d], [c,a,d]}. + // Go to the tet containing the three subfaces. + fsym(topcastets[spivot], neightet); + // Get the three subfaces connecting at p. + for (i = 0; i < 3; i++) { + esym(neightet, newface); + tspivot(newface, flipshs[i]); + eprevself(neightet); + } + } else { + spivot = 3; // The new subface is [a,b,c]. + } + } + } // if (checksubfaceflag) + + + // Re-use fliptets[0] for [a,b,c,d]. + fliptets[0].ver = 11; + setelemmarker(fliptets[0].tet, 0); // Clean all flags. + // NOTE: the element attributes and volume constraint remain unchanged. + if (checksubsegflag) { + // Dealloc the space to subsegments. + if (fliptets[0].tet[8] != NULL) { + tet2segpool->dealloc((shellface *) fliptets[0].tet[8]); + fliptets[0].tet[8] = NULL; + } + } + if (checksubfaceflag) { + // Dealloc the space to subfaces. + if (fliptets[0].tet[9] != NULL) { + tet2subpool->dealloc((shellface *) fliptets[0].tet[9]); + fliptets[0].tet[9] = NULL; + } + } + // Delete the other three tets. + for (i = 1; i < 4; i++) { + tetrahedrondealloc(fliptets[i].tet); + } + + if (pp != dummypoint) { + // Mark the point pp as unused. + setpointtype(pp, UNUSEDVERTEX); + unuverts++; + } + + // Create the new tet [a,b,c,d]. + if (hullflag > 0) { + // One of the five vertices may be 'dummypoint'. + if (pa == dummypoint) { + // pa is dummypoint. + setvertices(fliptets[0], pc, pb, pd, pa); + esymself(fliptets[0]); // [b,c,a,d] + eprevself(fliptets[0]); // [a,b,c,d] + dummyflag = 1; + } else if (pb == dummypoint) { + setvertices(fliptets[0], pa, pc, pd, pb); + esymself(fliptets[0]); // [c,a,b,d] + enextself(fliptets[0]); // [a,b,c,d] + dummyflag = 2; + } else if (pc == dummypoint) { + setvertices(fliptets[0], pb, pa, pd, pc); + esymself(fliptets[0]); // [a,b,c,d] + dummyflag = 3; + } else if (pd == dummypoint) { + setvertices(fliptets[0], pa, pb, pc, pd); + dummyflag = 4; + } else { + setvertices(fliptets[0], pa, pb, pc, pd); + if (pp == dummypoint) { + dummyflag = -1; + } else { + dummyflag = 0; + } + } + if (dummyflag > 0) { + // We deleted 3 hull tets, and create 1 hull tet. + hullsize -= 2; + } else if (dummyflag < 0) { + // We deleted 4 hull tets. + hullsize -= 4; + // meshedges does not change. + } + } else { + setvertices(fliptets[0], pa, pb, pc, pd); + } + + if (fc->remove_ndelaunay_edge) { // calc_tetprism_vol + REAL volneg[4], volpos[1], vol_diff; + if (dummyflag > 0) { + if (pa == dummypoint) { + volneg[0] = 0.; + volneg[1] = tetprismvol(pp, pd, pb, pc); + volneg[2] = 0.; + volneg[3] = 0.; + } else if (pb == dummypoint) { + volneg[0] = 0.; + volneg[1] = 0.; + volneg[2] = tetprismvol(pp, pd, pc, pa); + volneg[3] = 0.; + } else if (pc == dummypoint) { + volneg[0] = tetprismvol(pp, pd, pa, pb); + volneg[1] = 0.; + volneg[2] = 0.; + volneg[3] = 0.; + } else { // pd == dummypoint + volneg[0] = 0.; + volneg[1] = 0.; + volneg[2] = 0.; + volneg[3] = tetprismvol(pa, pb, pc, pp); + } + volpos[0] = 0.; + } else if (dummyflag < 0) { + volneg[0] = 0.; + volneg[1] = 0.; + volneg[2] = 0.; + volneg[3] = 0.; + volpos[0] = tetprismvol(pa, pb, pc, pd); + } else { + volneg[0] = tetprismvol(pp, pd, pa, pb); + volneg[1] = tetprismvol(pp, pd, pb, pc); + volneg[2] = tetprismvol(pp, pd, pc, pa); + volneg[3] = tetprismvol(pa, pb, pc, pp); + volpos[0] = tetprismvol(pa, pb, pc, pd); + } + vol_diff = volpos[0] - volneg[0] - volneg[1] - volneg[2] - volneg[3]; + fc->tetprism_vol_sum += vol_diff; // Update the total sum. + } + + // Bond the new tet to adjacent tets. + for (i = 0; i < 3; i++) { + esym(fliptets[0], newface); // At faces [b,a,d], [c,b,d], [a,c,d]. + bond(newface, topcastets[i]); + enextself(fliptets[0]); + } + bond(fliptets[0], botcastet); + + if (checksubsegflag) { + face checkseg; + // Bond 6 segments (at edges of [a,b,c,d]) if there there are. + for (i = 0; i < 3; i++) { + eprev(topcastets[i], newface); // At edges [d,a],[d,b],[d,c]. + if (issubseg(newface)) { + tsspivot1(newface, checkseg); + esym(fliptets[0], newface); + enextself(newface); // At edges [a,d], [b,d], [c,d]. + tssbond1(newface, checkseg); + sstbond1(checkseg, newface); + if (fc->chkencflag & 1) { + enqueuesubface(badsubsegs, &checkseg); + } + } + enextself(fliptets[0]); + } + for (i = 0; i < 3; i++) { + if (issubseg(topcastets[i])) { + tsspivot1(topcastets[i], checkseg); // At edges [a,b],[b,c],[c,a]. + tssbond1(fliptets[0], checkseg); + sstbond1(checkseg, fliptets[0]); + if (fc->chkencflag & 1) { + enqueuesubface(badsubsegs, &checkseg); + } + } + enextself(fliptets[0]); + } + } + + if (checksubfaceflag) { + face checksh; + // Bond 4 subfaces (at faces of [a,b,c,d]) if there are. + for (i = 0; i < 3; i++) { + if (issubface(topcastets[i])) { + tspivot(topcastets[i], checksh); // At faces [a,b,d],[b,c,d],[c,a,d] + esym(fliptets[0], newface); // At faces [b,a,d],[c,b,d],[a,c,d] + sesymself(checksh); + tsbond(newface, checksh); + if (fc->chkencflag & 2) { + enqueuesubface(badsubfacs, &checksh); + } + } + enextself(fliptets[0]); + } + if (issubface(botcastet)) { + tspivot(botcastet, checksh); // At face [b,a,c] + sesymself(checksh); + tsbond(fliptets[0], checksh); + if (fc->chkencflag & 2) { + enqueuesubface(badsubfacs, &checksh); + } + } + + if (spivot >= 0) { + // Perform a 3-to-1 flip in surface triangulation. + // Depending on the value of 'spivot', the three subfaces are: + // - 0: [a,b,p], [b,d,p], [d,a,p] + // - 1: [b,c,p], [c,d,p], [d,b,p] + // - 2: [c,a,p], [a,d,p], [d,c,p] + // - 3: [a,b,p], [b,c,p], [c,a,p] + // Adjust the three subfaces such that their origins are p, i.e., + // - 3: [p,a,b], [p,b,c], [p,c,a]. (Required by the flip31()). + for (i = 0; i < 3; i++) { + senext2self(flipshs[i]); + } + flip31(flipshs, 0); + // Delete the three old subfaces. + for (i = 0; i < 3; i++) { + shellfacedealloc(subfaces, flipshs[i].sh); + } + if (spivot < 3) { + // // Bond the new subface to the new tet [a,b,c,d]. + tsbond(topcastets[spivot], flipshs[3]); + fsym(topcastets[spivot], newface); + sesym(flipshs[3], checksh); + tsbond(newface, checksh); + } else { + // Bound the new subface [a,b,c] to the new tet [a,b,c,d]. + tsbond(fliptets[0], flipshs[3]); + fsym(fliptets[0], newface); + sesym(flipshs[3], checksh); + tsbond(newface, checksh); + } + } // if (spivot > 0) + } // if (checksubfaceflag) + + if (fc->chkencflag & 4) { + enqueuetetrahedron(&(fliptets[0])); + } + + // Update the point-to-tet map. + setpoint2tet(pa, (tetrahedron) fliptets[0].tet); + setpoint2tet(pb, (tetrahedron) fliptets[0].tet); + setpoint2tet(pc, (tetrahedron) fliptets[0].tet); + setpoint2tet(pd, (tetrahedron) fliptets[0].tet); + + if (fc->enqflag > 0) { + // Queue faces which may be locally non-Delaunay. + flippush(flipstack, &(fliptets[0])); // [a,b,c] (opposite to new point). + if (fc->enqflag > 1) { + for (i = 0; i < 3; i++) { + esym(fliptets[0], newface); + flippush(flipstack, &newface); + enextself(fliptets[0]); + } + } + } + + recenttet = fliptets[0]; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// flipnm() Flip an edge through a sequence of elementary flips. // +// // +// 'abtets' is an array of 'n' tets in the star of edge [a,b].These tets are // +// ordered in a counterclockwise cycle with respect to the vector a->b, i.e.,// +// use the right-hand rule. // +// // +// 'level' (>= 0) indicates the current link level. If 'level > 0', we are // +// flipping a link edge of an edge [a',b'], and 'abedgepivot' indicates // +// which link edge, i.e., [c',b'] or [a',c'], is [a,b] These two parameters // +// allow us to determine the new tets after a 3-to-2 flip, i.e., tets that // +// do not inside the reduced star of edge [a',b']. // +// // +// If the flag 'fc->unflip' is set, this routine un-does the flips performed // +// in flipnm([a,b]) so that the mesh is returned to its original state // +// before doing the flipnm([a,b]) operation. // +// // +// The return value is an integer nn, where nn <= n. If nn is 2, then the // +// edge is flipped. The first and the second tets in 'abtets' are new tets. // +// Otherwise, nn > 2, the edge is not flipped, and nn is the number of tets // +// in the current star of [a,b]. // +// // +// ASSUMPTIONS: // +// - Neither a nor b is 'dummypoint'. // +// - [a,b] must not be a segment. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::flipnm(triface* abtets, int n, int level, int abedgepivot, + flipconstraints* fc) +{ + triface fliptets[3], spintet, flipedge; + triface *tmpabtets, *parytet; + point pa, pb, pc, pd, pe, pf; + REAL ori; + int hullflag, hulledgeflag; + int reducflag, rejflag; + int reflexlinkedgecount; + int edgepivot; + int n1, nn; + int t1ver; + int i, j; + + pa = org(abtets[0]); + pb = dest(abtets[0]); + + if (n > 3) { + // Try to reduce the size of the Star(ab) by flipping a face in it. + reflexlinkedgecount = 0; + + for (i = 0; i < n; i++) { + // Let the face of 'abtets[i]' be [a,b,c]. + if (checksubfaceflag) { + if (issubface(abtets[i])) { + continue; // Skip a subface. + } + } + // Do not flip this face if it is involved in two Stars. + if ((elemcounter(abtets[i]) > 1) || + (elemcounter(abtets[(i - 1 + n) % n]) > 1)) { + continue; + } + + pc = apex(abtets[i]); + pd = apex(abtets[(i + 1) % n]); + pe = apex(abtets[(i - 1 + n) % n]); + if ((pd == dummypoint) || (pe == dummypoint)) { + continue; // [a,b,c] is a hull face. + } + + + // Decide whether [a,b,c] is flippable or not. + reducflag = 0; + + hullflag = (pc == dummypoint); // pc may be dummypoint. + hulledgeflag = 0; + if (hullflag == 0) { + ori = orient3d(pb, pc, pd, pe); // Is [b,c] locally convex? + if (ori > 0) { + ori = orient3d(pc, pa, pd, pe); // Is [c,a] locally convex? + if (ori > 0) { + // Test if [a,b] is locally convex OR flat. + ori = orient3d(pa, pb, pd, pe); + if (ori > 0) { + // Found a 2-to-3 flip: [a,b,c] => [e,d] + reducflag = 1; + } else if (ori == 0) { + // [a,b] is flat. + if (n == 4) { + // The "flat" tet can be removed immediately by a 3-to-2 flip. + reducflag = 1; + // Check if [e,d] is a hull edge. + pf = apex(abtets[(i + 2) % n]); + hulledgeflag = (pf == dummypoint); + } + } + } + } + if (!reducflag) { + reflexlinkedgecount++; + } + } else { + // 'c' is dummypoint. + if (n == 4) { + // Let the vertex opposite to 'c' is 'f'. + // A 4-to-4 flip is possible if the two tets [d,e,f,a] and [e,d,f,b] + // are valid tets. + // Note: When the mesh is not convex, it is possible that [a,b] is + // locally non-convex (at hull faces [a,b,e] and [b,a,d]). + // In this case, an edge flip [a,b] to [e,d] is still possible. + pf = apex(abtets[(i + 2) % n]); + ori = orient3d(pd, pe, pf, pa); + if (ori < 0) { + ori = orient3d(pe, pd, pf, pb); + if (ori < 0) { + // Found a 4-to-4 flip: [a,b] => [e,d] + reducflag = 1; + ori = 0; // Signal as a 4-to-4 flip (like a co-planar case). + hulledgeflag = 1; // [e,d] is a hull edge. + } + } + } + } // if (hullflag) + + if (reducflag) { + if (nonconvex && hulledgeflag) { + // We will create a hull edge [e,d]. Make sure it does not exist. + if (getedge(pe, pd, &spintet)) { + // The 2-to-3 flip is not a topological valid flip. + reducflag = 0; + } + } + } + + if (reducflag) { + // [a,b,c] could be removed by a 2-to-3 flip. + rejflag = 0; + if (fc->checkflipeligibility) { + // Check if the flip can be performed. + rejflag = checkflipeligibility(1, pa, pb, pc, pd, pe, level, + abedgepivot, fc); + } + if (!rejflag) { + // Do flip: [a,b,c] => [e,d]. + fliptets[0] = abtets[i]; + fsym(fliptets[0], fliptets[1]); // abtets[i-1]. + flip23(fliptets, hullflag, fc); + + // Shrink the array 'abtets', maintain the original order. + // Two tets 'abtets[i-1] ([a,b,e,c])' and 'abtets[i] ([a,b,c,d])' + // are flipped, i.e., they do not in Star(ab) anymore. + // 'fliptets[0]' ([e,d,a,b]) is in Star(ab), it is saved in + // 'abtets[i-1]' (adjust it to be [a,b,e,d]), see below: + // + // before after + // [0] |___________| [0] |___________| + // ... |___________| ... |___________| + // [i-1] |_[a,b,e,c]_| [i-1] |_[a,b,e,d]_| + // [i] |_[a,b,c,d]_| --> [i] |_[a,b,d,#]_| + // [i+1] |_[a,b,d,#]_| [i+1] |_[a,b,#,*]_| + // ... |___________| ... |___________| + // [n-2] |___________| [n-2] |___________| + // [n-1] |___________| [n-1] |_[i]_2-t-3_| + // + edestoppoself(fliptets[0]); // [a,b,e,d] + // Increase the counter of this new tet (it is in Star(ab)). + increaseelemcounter(fliptets[0]); + abtets[(i - 1 + n) % n] = fliptets[0]; + for (j = i; j < n - 1; j++) { + abtets[j] = abtets[j + 1]; // Upshift + } + // The last entry 'abtets[n-1]' is empty. It is used in two ways: + // (i) it remembers the vertex 'c' (in 'abtets[n-1].tet'), and + // (ii) it remembers the position [i] where this flip took place. + // These information let us to either undo this flip or recover + // the original edge link (for collecting new created tets). + abtets[n - 1].tet = (tetrahedron *) pc; + abtets[n - 1].ver = 0; // Clear it. + // 'abtets[n - 1].ver' is in range [0,11] -- only uses 4 bits. + // Use the 5th bit in 'abtets[n - 1].ver' to signal a 2-to-3 flip. + abtets[n - 1].ver |= (1 << 4); + // The poisition [i] of this flip is saved above the 7th bit. + abtets[n - 1].ver |= (i << 6); + + if (fc->collectnewtets) { + // Push the two new tets [e,d,b,c] and [e,d,c,a] into a stack. + // Re-use the global array 'cavetetlist'. + for (j = 1; j < 3; j++) { + cavetetlist->newindex((void **) &parytet); + *parytet = fliptets[j]; // fliptets[1], fliptets[2]. + } + } + + // Star(ab) is reduced. Try to flip the edge [a,b]. + nn = flipnm(abtets, n - 1, level, abedgepivot, fc); + + if (nn == 2) { + // The edge has been flipped. + return nn; + } else { // if (nn > 2) + // The edge is not flipped. + if (fc->unflip || (ori == 0)) { + // Undo the previous 2-to-3 flip, i.e., do a 3-to-2 flip to + // transform [e,d] => [a,b,c]. + // 'ori == 0' means that the previous flip created a degenerated + // tet. It must be removed. + // Remember that 'abtets[i-1]' is [a,b,e,d]. We can use it to + // find another two tets [e,d,b,c] and [e,d,c,a]. + fliptets[0] = abtets[(i-1 + (n-1)) % (n-1)]; // [a,b,e,d] + edestoppoself(fliptets[0]); // [e,d,a,b] + fnext(fliptets[0], fliptets[1]); // [1] is [e,d,b,c] + fnext(fliptets[1], fliptets[2]); // [2] is [e,d,c,a] + // Restore the two original tets in Star(ab). + flip32(fliptets, hullflag, fc); + // Marktest the two restored tets in Star(ab). + for (j = 0; j < 2; j++) { + increaseelemcounter(fliptets[j]); + } + // Expand the array 'abtets', maintain the original order. + for (j = n - 2; j>= i; j--) { + abtets[j + 1] = abtets[j]; // Downshift + } + // Insert the two new tets 'fliptets[0]' [a,b,c,d] and + // 'fliptets[1]' [b,a,c,e] into the (i-1)-th and i-th entries, + // respectively. + esym(fliptets[1], abtets[(i - 1 + n) % n]); // [a,b,e,c] + abtets[i] = fliptets[0]; // [a,b,c,d] + nn++; + if (fc->collectnewtets) { + // Pop two (flipped) tets from the stack. + cavetetlist->objects -= 2; + } + } // if (unflip || (ori == 0)) + } // if (nn > 2) + + if (!fc->unflip) { + // The flips are not reversed. The current Star(ab) can not be + // further reduced. Return its current size (# of tets). + return nn; + } + // unflip is set. + // Continue the search for flips. + } + } // if (reducflag) + } // i + + // The Star(ab) is not reduced. + if (reflexlinkedgecount > 0) { + // There are reflex edges in the Link(ab). + if (((b->fliplinklevel < 0) && (level < autofliplinklevel)) || + ((b->fliplinklevel >= 0) && (level < b->fliplinklevel))) { + // Try to reduce the Star(ab) by flipping a reflex edge in Link(ab). + for (i = 0; i < n; i++) { + // Do not flip this face [a,b,c] if there are two Stars involved. + if ((elemcounter(abtets[i]) > 1) || + (elemcounter(abtets[(i - 1 + n) % n]) > 1)) { + continue; + } + pc = apex(abtets[i]); + if (pc == dummypoint) { + continue; // [a,b] is a hull edge. + } + pd = apex(abtets[(i + 1) % n]); + pe = apex(abtets[(i - 1 + n) % n]); + if ((pd == dummypoint) || (pe == dummypoint)) { + continue; // [a,b,c] is a hull face. + } + + + edgepivot = 0; // No edge is selected yet. + + // Test if [b,c] is locally convex or flat. + ori = orient3d(pb, pc, pd, pe); + if (ori <= 0) { + // Select the edge [c,b]. + enext(abtets[i], flipedge); // [b,c,a,d] + edgepivot = 1; + } + if (!edgepivot) { + // Test if [c,a] is locally convex or flat. + ori = orient3d(pc, pa, pd, pe); + if (ori <= 0) { + // Select the edge [a,c]. + eprev(abtets[i], flipedge); // [c,a,b,d]. + edgepivot = 2; + } + } + + if (!edgepivot) continue; + + // An edge is selected. + if (checksubsegflag) { + // Do not flip it if it is a segment. + if (issubseg(flipedge)) { + if (fc->collectencsegflag) { + face checkseg, *paryseg; + tsspivot1(flipedge, checkseg); + if (!sinfected(checkseg)) { + // Queue this segment in list. + sinfect(checkseg); + caveencseglist->newindex((void **) &paryseg); + *paryseg = checkseg; + } + } + continue; + } + } + + // Try to flip the selected edge ([c,b] or [a,c]). + esymself(flipedge); + // Count the number of tets at the edge. + n1 = 0; + j = 0; // Sum of the star counters. + spintet = flipedge; + while (1) { + n1++; + j += (elemcounter(spintet)); + fnextself(spintet); + if (spintet.tet == flipedge.tet) break; + } + if (n1 < 3) { + // This is only possible when the mesh contains inverted + // elements. Reprot a bug. + terminatetetgen(this, 2); + } + if (j > 2) { + // The Star(flipedge) overlaps other Stars. + continue; // Do not flip this edge. + } + + if ((b->flipstarsize > 0) && (n1 > b->flipstarsize)) { + // The star size exceeds the given limit. + continue; // Do not flip it. + } + + // Allocate spaces for Star(flipedge). + tmpabtets = new triface[n1]; + // Form the Star(flipedge). + j = 0; + spintet = flipedge; + while (1) { + tmpabtets[j] = spintet; + // Increase the star counter of this tet. + increaseelemcounter(tmpabtets[j]); + j++; + fnextself(spintet); + if (spintet.tet == flipedge.tet) break; + } + + // Try to flip the selected edge away. + nn = flipnm(tmpabtets, n1, level + 1, edgepivot, fc); + + if (nn == 2) { + // The edge is flipped. Star(ab) is reduced. + // Shrink the array 'abtets', maintain the original order. + if (edgepivot == 1) { + // 'tmpabtets[0]' is [d,a,e,b] => contains [a,b]. + spintet = tmpabtets[0]; // [d,a,e,b] + enextself(spintet); + esymself(spintet); + enextself(spintet); // [a,b,e,d] + } else { + // 'tmpabtets[1]' is [b,d,e,a] => contains [a,b]. + spintet = tmpabtets[1]; // [b,d,e,a] + eprevself(spintet); + esymself(spintet); + eprevself(spintet); // [a,b,e,d] + } // edgepivot == 2 + increaseelemcounter(spintet); // It is in Star(ab). + // Put the new tet at [i-1]-th entry. + abtets[(i - 1 + n) % n] = spintet; + for (j = i; j < n - 1; j++) { + abtets[j] = abtets[j + 1]; // Upshift + } + // Remember the flips in the last entry of the array 'abtets'. + // They can be used to recover the flipped edge. + abtets[n - 1].tet = (tetrahedron *) tmpabtets; // The star(fedge). + abtets[n - 1].ver = 0; // Clear it. + // Use the 1st and 2nd bit to save 'edgepivot' (1 or 2). + abtets[n - 1].ver |= edgepivot; + // Use the 6th bit to signal this n1-to-m1 flip. + abtets[n - 1].ver |= (1 << 5); + // The poisition [i] of this flip is saved from 7th to 19th bit. + abtets[n - 1].ver |= (i << 6); + // The size of the star 'n1' is saved from 20th bit. + abtets[n - 1].ver |= (n1 << 19); + + // Remember the flipped link vertex 'c'. It can be used to recover + // the original edge link of [a,b], and to collect new tets. + tmpabtets[0].tet = (tetrahedron *) pc; + tmpabtets[0].ver = (1 << 5); // Flag it as a vertex handle. + + // Continue to flip the edge [a,b]. + nn = flipnm(abtets, n - 1, level, abedgepivot, fc); + + if (nn == 2) { + // The edge has been flipped. + return nn; + } else { // if (nn > 2) { + // The edge is not flipped. + if (fc->unflip) { + // Recover the flipped edge ([c,b] or [a,c]). + // The sequence of flips are saved in 'tmpabtets'. + // abtets[(i-1) % (n-1)] is [a,b,e,d], i.e., the tet created by + // the flipping of edge [c,b] or [a,c].It must still exist in + // Star(ab). It is the start tet to recover the flipped edge. + if (edgepivot == 1) { + // The flip edge is [c,b]. + tmpabtets[0] = abtets[((i-1)+(n-1))%(n-1)]; // [a,b,e,d] + eprevself(tmpabtets[0]); + esymself(tmpabtets[0]); + eprevself(tmpabtets[0]); // [d,a,e,b] + fsym(tmpabtets[0], tmpabtets[1]); // [a,d,e,c] + } else { + // The flip edge is [a,c]. + tmpabtets[1] = abtets[((i-1)+(n-1))%(n-1)]; // [a,b,e,d] + enextself(tmpabtets[1]); + esymself(tmpabtets[1]); + enextself(tmpabtets[1]); // [b,d,e,a] + fsym(tmpabtets[1], tmpabtets[0]); // [d,b,e,c] + } // if (edgepivot == 2) + + // Recover the flipped edge ([c,b] or [a,c]). + flipnm_post(tmpabtets, n1, 2, edgepivot, fc); + + // Insert the two recovered tets into Star(ab). + for (j = n - 2; j >= i; j--) { + abtets[j + 1] = abtets[j]; // Downshift + } + if (edgepivot == 1) { + // tmpabtets[0] is [c,b,d,a] ==> contains [a,b] + // tmpabtets[1] is [c,b,a,e] ==> contains [a,b] + // tmpabtets[2] is [c,b,e,d] + fliptets[0] = tmpabtets[1]; + enextself(fliptets[0]); + esymself(fliptets[0]); // [a,b,e,c] + fliptets[1] = tmpabtets[0]; + esymself(fliptets[1]); + eprevself(fliptets[1]); // [a,b,c,d] + } else { + // tmpabtets[0] is [a,c,d,b] ==> contains [a,b] + // tmpabtets[1] is [a,c,b,e] ==> contains [a,b] + // tmpabtets[2] is [a,c,e,d] + fliptets[0] = tmpabtets[1]; + eprevself(fliptets[0]); + esymself(fliptets[0]); // [a,b,e,c] + fliptets[1] = tmpabtets[0]; + esymself(fliptets[1]); + enextself(fliptets[1]); // [a,b,c,d] + } // edgepivot == 2 + for (j = 0; j < 2; j++) { + increaseelemcounter(fliptets[j]); + } + // Insert the two recovered tets into Star(ab). + abtets[(i - 1 + n) % n] = fliptets[0]; + abtets[i] = fliptets[1]; + nn++; + // Release the allocated spaces. + delete [] tmpabtets; + } // if (unflip) + } // if (nn > 2) + + if (!fc->unflip) { + // The flips are not reversed. The current Star(ab) can not be + // further reduced. Return its size (# of tets). + return nn; + } + // unflip is set. + // Continue the search for flips. + } else { + // The selected edge is not flipped. + if (!fc->unflip) { + // Release the memory used in this attempted flip. + flipnm_post(tmpabtets, n1, nn, edgepivot, fc); + } + // Decrease the star counters of tets in Star(flipedge). + for (j = 0; j < nn; j++) { + decreaseelemcounter(tmpabtets[j]); + } + // Release the allocated spaces. + delete [] tmpabtets; + } + } // i + } // if (level...) + } // if (reflexlinkedgecount > 0) + } else { + // Check if a 3-to-2 flip is possible. + // Let the three apexes be c, d,and e. Hull tets may be involved. If so, + // we rearrange them such that the vertex e is dummypoint. + hullflag = 0; + + if (apex(abtets[0]) == dummypoint) { + pc = apex(abtets[1]); + pd = apex(abtets[2]); + pe = apex(abtets[0]); + hullflag = 1; + } else if (apex(abtets[1]) == dummypoint) { + pc = apex(abtets[2]); + pd = apex(abtets[0]); + pe = apex(abtets[1]); + hullflag = 2; + } else { + pc = apex(abtets[0]); + pd = apex(abtets[1]); + pe = apex(abtets[2]); + hullflag = (pe == dummypoint) ? 3 : 0; + } + + reducflag = 0; + rejflag = 0; + + + if (hullflag == 0) { + // Make sure that no inverted tet will be created, i.e. the new tets + // [d,c,e,a] and [c,d,e,b] must be valid tets. + ori = orient3d(pd, pc, pe, pa); + if (ori < 0) { + ori = orient3d(pc, pd, pe, pb); + if (ori < 0) { + reducflag = 1; + } + } + } else { + // [a,b] is a hull edge. + // Note: This can happen when it is in the middle of a 4-to-4 flip. + // Note: [a,b] may even be a non-convex hull edge. + if (!nonconvex) { + // The mesh is convex, only do flip if it is a coplanar hull edge. + ori = orient3d(pa, pb, pc, pd); + if (ori == 0) { + reducflag = 1; + } + } else { // nonconvex + reducflag = 1; + } + if (reducflag == 1) { + // [a,b], [a,b,c] and [a,b,d] are on the convex hull. + // Make sure that no inverted tet will be created. + point searchpt = NULL, chkpt; + REAL bigvol = 0.0, ori1, ori2; + // Search an interior vertex which is an apex of edge [c,d]. + // In principle, it can be arbitrary interior vertex. To avoid + // numerical issue, we choose the vertex which belongs to a tet + // 't' at edge [c,d] and 't' has the biggest volume. + fliptets[0] = abtets[hullflag % 3]; // [a,b,c,d]. + eorgoppoself(fliptets[0]); // [d,c,b,a] + spintet = fliptets[0]; + while (1) { + fnextself(spintet); + chkpt = oppo(spintet); + if (chkpt == pb) break; + if ((chkpt != dummypoint) && (apex(spintet) != dummypoint)) { + ori = -orient3d(pd, pc, apex(spintet), chkpt); + if (ori > bigvol) { + bigvol = ori; + searchpt = chkpt; + } + } + } + if (searchpt != NULL) { + // Now valid the configuration. + ori1 = orient3d(pd, pc, searchpt, pa); + ori2 = orient3d(pd, pc, searchpt, pb); + if (ori1 * ori2 >= 0.0) { + reducflag = 0; // Not valid. + } else { + ori1 = orient3d(pa, pb, searchpt, pc); + ori2 = orient3d(pa, pb, searchpt, pd); + if (ori1 * ori2 >= 0.0) { + reducflag = 0; // Not valid. + } + } + } else { + // No valid searchpt is found. + reducflag = 0; // Do not flip it. + } + } // if (reducflag == 1) + } // if (hullflag == 1) + + if (reducflag) { + // A 3-to-2 flip is possible. + if (checksubfaceflag) { + // This edge (must not be a segment) can be flipped ONLY IF it belongs + // to either 0 or 2 subfaces. In the latter case, a 2-to-2 flip in + // the surface mesh will be automatically performed within the + // 3-to-2 flip. + nn = 0; + edgepivot = -1; // Re-use it. + for (j = 0; j < 3; j++) { + if (issubface(abtets[j])) { + nn++; // Found a subface. + } else { + edgepivot = j; + } + } + if (nn == 1) { + // Found only 1 subface containing this edge. This can happen in + // the boundary recovery phase. The neighbor subface is not yet + // recovered. This edge should not be flipped at this moment. + rejflag = 1; + } else if (nn == 2) { + // Found two subfaces. A 2-to-2 flip is possible. Validate it. + // Below we check if the two faces [p,q,a] and [p,q,b] are subfaces. + eorgoppo(abtets[(edgepivot + 1) % 3], spintet); // [q,p,b,a] + if (issubface(spintet)) { + rejflag = 1; // Conflict to a 2-to-2 flip. + } else { + esymself(spintet); + if (issubface(spintet)) { + rejflag = 1; // Conflict to a 2-to-2 flip. + } + } + } else if (nn == 3) { + // Report a bug. + terminatetetgen(this, 2); + } + } + if (!rejflag && fc->checkflipeligibility) { + // Here we must exchange 'a' and 'b'. Since in the check... function, + // we assume the following point sequence, 'a,b,c,d,e', where + // the face [a,b,c] will be flipped and the edge [e,d] will be + // created. The two new tets are [a,b,c,d] and [b,a,c,e]. + rejflag = checkflipeligibility(2, pc, pd, pe, pb, pa, level, + abedgepivot, fc); + } + if (!rejflag) { + // Do flip: [a,b] => [c,d,e] + flip32(abtets, hullflag, fc); + if (fc->remove_ndelaunay_edge) { + if (level == 0) { + // It is the desired removing edge. Check if we have improved + // the objective function. + if ((fc->tetprism_vol_sum >= 0.0) || + (fabs(fc->tetprism_vol_sum) < fc->bak_tetprism_vol)) { + // No improvement! flip back: [c,d,e] => [a,b]. + flip23(abtets, hullflag, fc); + // Increase the element counter -- They are in cavity. + for (j = 0; j < 3; j++) { + increaseelemcounter(abtets[j]); + } + return 3; + } + } // if (level == 0) + } + if (fc->collectnewtets) { + // Collect new tets. + if (level == 0) { + // Push the two new tets into stack. + for (j = 0; j < 2; j++) { + cavetetlist->newindex((void **) &parytet); + *parytet = abtets[j]; + } + } else { + // Only one of the new tets is collected. The other one is inside + // the reduced edge star. 'abedgepivot' is either '1' or '2'. + cavetetlist->newindex((void **) &parytet); + if (abedgepivot == 1) { // [c,b] + *parytet = abtets[1]; + } else { + *parytet = abtets[0]; + } + } + } // if (fc->collectnewtets) + return 2; + } + } // if (reducflag) + } // if (n == 3) + + // The current (reduced) Star size. + return n; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// flipnm_post() Post process a n-to-m flip. // +// // +// IMPORTANT: This routine only works when there is no other flip operation // +// is done after flipnm([a,b]) which attempts to remove an edge [a,b]. // +// // +// 'abtets' is an array of 'n' (>= 3) tets which are in the original star of // +// [a,b] before flipnm([a,b]). 'nn' (< n) is the value returned by flipnm. // +// If 'nn == 2', the edge [a,b] has been flipped. 'abtets[0]' and 'abtets[1]'// +// are [c,d,e,b] and [d,c,e,a], i.e., a 2-to-3 flip can recover the edge [a, // +// b] and its initial Star([a,b]). If 'nn >= 3' edge [a,b] still exists in // +// current mesh and 'nn' is the current number of tets in Star([a,b]). // +// // +// Each 'abtets[i]', where nn <= i < n, saves either a 2-to-3 flip or a // +// flipnm([p1,p2]) operation ([p1,p2] != [a,b]) which created the tet // +// 'abtets[t-1]', where '0 <= t <= i'. These information can be used to // +// undo the flips performed in flipnm([a,b]) or to collect new tets created // +// by the flipnm([a,b]) operation. // +// // +// Default, this routine only walks through the flips and frees the spaces // +// allocated during the flipnm([a,b]) operation. // +// // +// If the flag 'fc->unflip' is set, this routine un-does the flips performed // +// in flipnm([a,b]) so that the mesh is returned to its original state // +// before doing the flipnm([a,b]) operation. // +// // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::flipnm_post(triface* abtets, int n, int nn, int abedgepivot, + flipconstraints* fc) +{ + triface fliptets[3], flipface; + triface *tmpabtets; + int fliptype; + int edgepivot; + int t, n1; + int i, j; + + + if (nn == 2) { + // The edge [a,b] has been flipped. + // 'abtets[0]' is [c,d,e,b] or [#,#,#,b]. + // 'abtets[1]' is [d,c,e,a] or [#,#,#,a]. + if (fc->unflip) { + // Do a 2-to-3 flip to recover the edge [a,b]. There may be hull tets. + flip23(abtets, 1, fc); + if (fc->collectnewtets) { + // Pop up new (flipped) tets from the stack. + if (abedgepivot == 0) { + // Two new tets were collected. + cavetetlist->objects -= 2; + } else { + // Only one of the two new tets was collected. + cavetetlist->objects -= 1; + } + } + } + // The initial size of Star(ab) is 3. + nn++; + } + + // Walk through the performed flips. + for (i = nn; i < n; i++) { + // At the beginning of each step 'i', the size of the Star([a,b]) is 'i'. + // At the end of this step, the size of the Star([a,b]) is 'i+1'. + // The sizes of the Link([a,b]) are the same. + fliptype = ((abtets[i].ver >> 4) & 3); // 0, 1, or 2. + if (fliptype == 1) { + // It was a 2-to-3 flip: [a,b,c]->[e,d]. + t = (abtets[i].ver >> 6); + if (fc->unflip) { + if (b->verbose > 2) { + printf(" Recover a 2-to-3 flip at f[%d].\n", t); + } + // 'abtets[(t-1)%i]' is the tet [a,b,e,d] in current Star(ab), i.e., + // it is created by a 2-to-3 flip [a,b,c] => [e,d]. + fliptets[0] = abtets[((t - 1) + i) % i]; // [a,b,e,d] + eprevself(fliptets[0]); + esymself(fliptets[0]); + enextself(fliptets[0]); // [e,d,a,b] + fnext(fliptets[0], fliptets[1]); // [e,d,b,c] + fnext(fliptets[1], fliptets[2]); // [e,d,c,a] + // Do a 3-to-2 flip: [e,d] => [a,b,c]. + // NOTE: hull tets may be invloved. + flip32(fliptets, 1, fc); + // Expand the array 'abtets', maintain the original order. + // The new array length is (i+1). + for (j = i - 1; j >= t; j--) { + abtets[j + 1] = abtets[j]; // Downshift + } + // The tet abtets[(t-1)%i] is deleted. Insert the two new tets + // 'fliptets[0]' [a,b,c,d] and 'fliptets[1]' [b,a,c,e] into + // the (t-1)-th and t-th entries, respectively. + esym(fliptets[1], abtets[((t-1) + (i+1)) % (i+1)]); // [a,b,e,c] + abtets[t] = fliptets[0]; // [a,b,c,d] + if (fc->collectnewtets) { + // Pop up two (flipped) tets from the stack. + cavetetlist->objects -= 2; + } + } + } else if (fliptype == 2) { + tmpabtets = (triface *) (abtets[i].tet); + n1 = ((abtets[i].ver >> 19) & 8191); // \sum_{i=0^12}{2^i} = 8191 + edgepivot = (abtets[i].ver & 3); + t = ((abtets[i].ver >> 6) & 8191); + if (fc->unflip) { + if (b->verbose > 2) { + printf(" Recover a %d-to-m flip at e[%d] of f[%d].\n", n1, + edgepivot, t); + } + // Recover the flipped edge ([c,b] or [a,c]). + // abtets[(t - 1 + i) % i] is [a,b,e,d], i.e., the tet created by + // the flipping of edge [c,b] or [a,c]. It must still exist in + // Star(ab). Use it to recover the flipped edge. + if (edgepivot == 1) { + // The flip edge is [c,b]. + tmpabtets[0] = abtets[(t - 1 + i) % i]; // [a,b,e,d] + eprevself(tmpabtets[0]); + esymself(tmpabtets[0]); + eprevself(tmpabtets[0]); // [d,a,e,b] + fsym(tmpabtets[0], tmpabtets[1]); // [a,d,e,c] + } else { + // The flip edge is [a,c]. + tmpabtets[1] = abtets[(t - 1 + i) % i]; // [a,b,e,d] + enextself(tmpabtets[1]); + esymself(tmpabtets[1]); + enextself(tmpabtets[1]); // [b,d,e,a] + fsym(tmpabtets[1], tmpabtets[0]); // [d,b,e,c] + } // if (edgepivot == 2) + + // Do a n1-to-m1 flip to recover the flipped edge ([c,b] or [a,c]). + flipnm_post(tmpabtets, n1, 2, edgepivot, fc); + + // Insert the two recovered tets into the original Star(ab). + for (j = i - 1; j >= t; j--) { + abtets[j + 1] = abtets[j]; // Downshift + } + if (edgepivot == 1) { + // tmpabtets[0] is [c,b,d,a] ==> contains [a,b] + // tmpabtets[1] is [c,b,a,e] ==> contains [a,b] + // tmpabtets[2] is [c,b,e,d] + fliptets[0] = tmpabtets[1]; + enextself(fliptets[0]); + esymself(fliptets[0]); // [a,b,e,c] + fliptets[1] = tmpabtets[0]; + esymself(fliptets[1]); + eprevself(fliptets[1]); // [a,b,c,d] + } else { + // tmpabtets[0] is [a,c,d,b] ==> contains [a,b] + // tmpabtets[1] is [a,c,b,e] ==> contains [a,b] + // tmpabtets[2] is [a,c,e,d] + fliptets[0] = tmpabtets[1]; + eprevself(fliptets[0]); + esymself(fliptets[0]); // [a,b,e,c] + fliptets[1] = tmpabtets[0]; + esymself(fliptets[1]); + enextself(fliptets[1]); // [a,b,c,d] + } // edgepivot == 2 + // Insert the two recovered tets into Star(ab). + abtets[((t-1) + (i+1)) % (i+1)] = fliptets[0]; + abtets[t] = fliptets[1]; + } + else { + // Only free the spaces. + flipnm_post(tmpabtets, n1, 2, edgepivot, fc); + } // if (!unflip) + if (b->verbose > 2) { + printf(" Release %d spaces at f[%d].\n", n1, i); + } + delete [] tmpabtets; + } + } // i + + return 1; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// insertpoint() Insert a point into current tetrahedralization. // +// // +// The Bowyer-Watson (B-W) algorithm is used to add a new point p into the // +// tetrahedralization T. It first finds a "cavity", denoted as C, in T, C // +// consists of tetrahedra in T that "conflict" with p. If T is a Delaunay // +// tetrahedralization, then all boundary faces (triangles) of C are visible // +// by p, i.e.,C is star-shaped. We can insert p into T by first deleting all // +// tetrahedra in C, then creating new tetrahedra formed by boundary faces of // +// C and p. If T is not a DT, then C may be not star-shaped. It must be // +// modified so that it becomes star-shaped. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::insertpoint(point insertpt, triface *searchtet, face *splitsh, + face *splitseg, insertvertexflags *ivf) +{ + arraypool *swaplist; + triface *cavetet, spintet, neightet, neineitet, *parytet; + triface oldtet, newtet, newneitet; + face checksh, neighsh, *parysh; + face checkseg, *paryseg; + point *pts, pa, pb, pc, *parypt; + enum locateresult loc = OUTSIDE; + REAL sign, ori; + REAL attrib, volume; + bool enqflag; + int t1ver; + int i, j, k, s; + + if (b->verbose > 2) { + printf(" Insert point %d\n", pointmark(insertpt)); + } + + // Locate the point. + if (searchtet->tet != NULL) { + loc = (enum locateresult) ivf->iloc; + } + + if (loc == OUTSIDE) { + if (searchtet->tet == NULL) { + if (!b->weighted) { + randomsample(insertpt, searchtet); + } else { + // Weighted DT. There may exist dangling vertex. + *searchtet = recenttet; + } + } + // Locate the point. + loc = locate(insertpt, searchtet); + } + + ivf->iloc = (int) loc; // The return value. + + if (b->weighted) { + if (loc != OUTSIDE) { + // Check if this vertex is regular. + pts = (point *) searchtet->tet; + sign = orient4d_s(pts[4], pts[5], pts[6], pts[7], insertpt, + pts[4][3], pts[5][3], pts[6][3], pts[7][3], + insertpt[3]); + if (sign > 0) { + // This new vertex lies above the lower hull. Do not insert it. + ivf->iloc = (int) NONREGULAR; + return 0; + } + } + } + + // Create the initial cavity C(p) which contains all tetrahedra that + // intersect p. It may include 1, 2, or n tetrahedra. + // If p lies on a segment or subface, also create the initial sub-cavity + // sC(p) which contains all subfaces (and segment) which intersect p. + + if (loc == OUTSIDE) { + flip14count++; + // The current hull will be enlarged. + // Add four adjacent boundary tets into list. + for (i = 0; i < 4; i++) { + decode(searchtet->tet[i], neightet); + neightet.ver = epivot[neightet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neightet; + } + infect(*searchtet); + caveoldtetlist->newindex((void **) &parytet); + *parytet = *searchtet; + } else if (loc == INTETRAHEDRON) { + flip14count++; + // Add four adjacent boundary tets into list. + for (i = 0; i < 4; i++) { + decode(searchtet->tet[i], neightet); + neightet.ver = epivot[neightet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neightet; + } + infect(*searchtet); + caveoldtetlist->newindex((void **) &parytet); + *parytet = *searchtet; + } else if (loc == ONFACE) { + flip26count++; + // Add six adjacent boundary tets into list. + j = (searchtet->ver & 3); // The current face number. + for (i = 1; i < 4; i++) { + decode(searchtet->tet[(j + i) % 4], neightet); + neightet.ver = epivot[neightet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neightet; + } + decode(searchtet->tet[j], spintet); + j = (spintet.ver & 3); // The current face number. + for (i = 1; i < 4; i++) { + decode(spintet.tet[(j + i) % 4], neightet); + neightet.ver = epivot[neightet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neightet; + } + infect(spintet); + caveoldtetlist->newindex((void **) &parytet); + *parytet = spintet; + infect(*searchtet); + caveoldtetlist->newindex((void **) &parytet); + *parytet = *searchtet; + + if (ivf->splitbdflag) { + if ((splitsh != NULL) && (splitsh->sh != NULL)) { + // Create the initial sub-cavity sC(p). + smarktest(*splitsh); + caveshlist->newindex((void **) &parysh); + *parysh = *splitsh; + } + } // if (splitbdflag) + } else if (loc == ONEDGE) { + flipn2ncount++; + // Add all adjacent boundary tets into list. + spintet = *searchtet; + while (1) { + eorgoppo(spintet, neightet); + decode(neightet.tet[neightet.ver & 3], neightet); + neightet.ver = epivot[neightet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neightet; + edestoppo(spintet, neightet); + decode(neightet.tet[neightet.ver & 3], neightet); + neightet.ver = epivot[neightet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neightet; + infect(spintet); + caveoldtetlist->newindex((void **) &parytet); + *parytet = spintet; + fnextself(spintet); + if (spintet.tet == searchtet->tet) break; + } // while (1) + + if (ivf->splitbdflag) { + // Create the initial sub-cavity sC(p). + if ((splitseg != NULL) && (splitseg->sh != NULL)) { + smarktest(*splitseg); + splitseg->shver = 0; + spivot(*splitseg, *splitsh); + } + if (splitsh != NULL) { + if (splitsh->sh != NULL) { + // Collect all subfaces share at this edge. + pa = sorg(*splitsh); + neighsh = *splitsh; + while (1) { + // Adjust the origin of its edge to be 'pa'. + if (sorg(neighsh) != pa) { + sesymself(neighsh); + } + // Add this face into list (in B-W cavity). + smarktest(neighsh); + caveshlist->newindex((void **) &parysh); + *parysh = neighsh; + // Add this face into face-at-splitedge list. + cavesegshlist->newindex((void **) &parysh); + *parysh = neighsh; + // Go to the next face at the edge. + spivotself(neighsh); + // Stop if all faces at the edge have been visited. + if (neighsh.sh == splitsh->sh) break; + if (neighsh.sh == NULL) break; + } // while (1) + } // if (not a dangling segment) + } + } // if (splitbdflag) + } else if (loc == INSTAR) { + // We assume that all tets in the star are given in 'caveoldtetlist', + // and they are all infected. + // Collect the boundary faces of the star. + for (i = 0; i < caveoldtetlist->objects; i++) { + cavetet = (triface *) fastlookup(caveoldtetlist, i); + // Check its 4 neighbor tets. + for (j = 0; j < 4; j++) { + decode(cavetet->tet[j], neightet); + if (!infected(neightet)) { + // It's a boundary face. + neightet.ver = epivot[neightet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neightet; + } + } + } + } else if (loc == ONVERTEX) { + // The point already exist. Do nothing and return. + return 0; + } + + + if (ivf->assignmeshsize) { + // Assign mesh size for the new point. + if (bgm != NULL) { + // Interpolate the mesh size from the background mesh. + bgm->decode(point2bgmtet(org(*searchtet)), neightet); + int bgmloc = (int) bgm->scoutpoint(insertpt, &neightet, 0); + if (bgmloc != (int) OUTSIDE) { + insertpt[pointmtrindex] = + bgm->getpointmeshsize(insertpt, &neightet, bgmloc); + setpoint2bgmtet(insertpt, bgm->encode(neightet)); + } + } else { + insertpt[pointmtrindex] = getpointmeshsize(insertpt,searchtet,(int)loc); + } + } // if (assignmeshsize) + + if (ivf->bowywat) { + // Update the cavity C(p) using the Bowyer-Watson algorithm. + swaplist = cavetetlist; + cavetetlist = cavebdrylist; + cavebdrylist = swaplist; + for (i = 0; i < cavetetlist->objects; i++) { + // 'cavetet' is an adjacent tet at outside of the cavity. + cavetet = (triface *) fastlookup(cavetetlist, i); + // The tet may be tested and included in the (enlarged) cavity. + if (!infected(*cavetet)) { + // Check for two possible cases for this tet: + // (1) It is a cavity tet, or + // (2) it is a cavity boundary face. + enqflag = false; + if (!marktested(*cavetet)) { + // Do Delaunay (in-sphere) test. + pts = (point *) cavetet->tet; + if (pts[7] != dummypoint) { + // A volume tet. Operate on it. + if (b->weighted) { + sign = orient4d_s(pts[4], pts[5], pts[6], pts[7], insertpt, + pts[4][3], pts[5][3], pts[6][3], pts[7][3], + insertpt[3]); + } else { + sign = insphere_s(pts[4], pts[5], pts[6], pts[7], insertpt); + } + enqflag = (sign < 0.0); + } else { + if (!nonconvex) { + // Test if this hull face is visible by the new point. + ori = orient3d(pts[4], pts[5], pts[6], insertpt); + if (ori < 0) { + // A visible hull face. + // Include it in the cavity. The convex hull will be enlarged. + enqflag = true; + } else if (ori == 0.0) { + // A coplanar hull face. We need to test if this hull face is + // Delaunay or not. We test if the adjacent tet (not faked) + // of this hull face is Delaunay or not. + decode(cavetet->tet[3], neineitet); + if (!infected(neineitet)) { + if (!marktested(neineitet)) { + // Do Delaunay test on this tet. + pts = (point *) neineitet.tet; + if (b->weighted) { + sign = orient4d_s(pts[4],pts[5],pts[6],pts[7], insertpt, + pts[4][3], pts[5][3], pts[6][3], + pts[7][3], insertpt[3]); + } else { + sign = insphere_s(pts[4],pts[5],pts[6],pts[7], insertpt); + } + enqflag = (sign < 0.0); + } + } else { + // The adjacent tet is non-Delaunay. The hull face is non- + // Delaunay as well. Include it in the cavity. + enqflag = true; + } // if (!infected(neineitet)) + } // if (ori == 0.0) + } else { + // A hull face (must be a subface). + // We FIRST include it in the initial cavity if the adjacent tet + // (not faked) of this hull face is not Delaunay wrt p. + // Whether it belongs to the final cavity will be determined + // during the validation process. 'validflag'. + decode(cavetet->tet[3], neineitet); + if (!infected(neineitet)) { + if (!marktested(neineitet)) { + // Do Delaunay test on this tet. + pts = (point *) neineitet.tet; + if (b->weighted) { + sign = orient4d_s(pts[4],pts[5],pts[6],pts[7], insertpt, + pts[4][3], pts[5][3], pts[6][3], + pts[7][3], insertpt[3]); + } else { + sign = insphere_s(pts[4],pts[5],pts[6],pts[7], insertpt); + } + enqflag = (sign < 0.0); + } + } else { + // The adjacent tet is non-Delaunay. The hull face is non- + // Delaunay as well. Include it in the cavity. + enqflag = true; + } // if (infected(neineitet)) + } // if (nonconvex) + } // if (pts[7] != dummypoint) + marktest(*cavetet); // Only test it once. + } // if (!marktested(*cavetet)) + + if (enqflag) { + // Found a tet in the cavity. Put other three faces in check list. + k = (cavetet->ver & 3); // The current face number + for (j = 1; j < 4; j++) { + decode(cavetet->tet[(j + k) % 4], neightet); + cavetetlist->newindex((void **) &parytet); + *parytet = neightet; + } + infect(*cavetet); + caveoldtetlist->newindex((void **) &parytet); + *parytet = *cavetet; + } else { + // Found a boundary face of the cavity. + cavetet->ver = epivot[cavetet->ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = *cavetet; + } + } // if (!infected(*cavetet)) + } // i + + cavetetlist->restart(); // Clear the working list. + } // if (ivf->bowywat) + + if (checksubsegflag) { + // Collect all segments of C(p). + shellface *ssptr; + for (i = 0; i < caveoldtetlist->objects; i++) { + cavetet = (triface *) fastlookup(caveoldtetlist, i); + if ((ssptr = (shellface*) cavetet->tet[8]) != NULL) { + for (j = 0; j < 6; j++) { + if (ssptr[j]) { + sdecode(ssptr[j], checkseg); + if (!sinfected(checkseg)) { + sinfect(checkseg); + cavetetseglist->newindex((void **) &paryseg); + *paryseg = checkseg; + } + } + } // j + } + } // i + // Uninfect collected segments. + for (i = 0; i < cavetetseglist->objects; i++) { + paryseg = (face *) fastlookup(cavetetseglist, i); + suninfect(*paryseg); + } + + if (ivf->rejflag & 1) { + // Reject this point if it encroaches upon any segment. + face *paryseg1; + for (i = 0; i < cavetetseglist->objects; i++) { + paryseg1 = (face *) fastlookup(cavetetseglist, i); + if (checkseg4encroach((point) paryseg1->sh[3], (point) paryseg1->sh[4], + insertpt)) { + encseglist->newindex((void **) &paryseg); + *paryseg = *paryseg1; + } + } // i + if ((ivf->rejflag & 1) && (encseglist->objects > 0)) { + insertpoint_abort(splitseg, ivf); + ivf->iloc = (int) ENCSEGMENT; + return 0; + } + } + } // if (checksubsegflag) + + if (checksubfaceflag) { + // Collect all subfaces of C(p). + shellface *sptr; + for (i = 0; i < caveoldtetlist->objects; i++) { + cavetet = (triface *) fastlookup(caveoldtetlist, i); + if ((sptr = (shellface*) cavetet->tet[9]) != NULL) { + for (j = 0; j < 4; j++) { + if (sptr[j]) { + sdecode(sptr[j], checksh); + if (!sinfected(checksh)) { + sinfect(checksh); + cavetetshlist->newindex((void **) &parysh); + *parysh = checksh; + } + } + } // j + } + } // i + // Uninfect collected subfaces. + for (i = 0; i < cavetetshlist->objects; i++) { + parysh = (face *) fastlookup(cavetetshlist, i); + suninfect(*parysh); + } + + if (ivf->rejflag & 2) { + REAL rd, cent[3]; + badface *bface; + // Reject this point if it encroaches upon any subface. + for (i = 0; i < cavetetshlist->objects; i++) { + parysh = (face *) fastlookup(cavetetshlist, i); + if (checkfac4encroach((point) parysh->sh[3], (point) parysh->sh[4], + (point) parysh->sh[5], insertpt, cent, &rd)) { + encshlist->newindex((void **) &bface); + bface->ss = *parysh; + bface->forg = (point) parysh->sh[3]; // Not a dad one. + for (j = 0; j < 3; j++) bface->cent[j] = cent[j]; + bface->key = rd; + } + } + if (encshlist->objects > 0) { + insertpoint_abort(splitseg, ivf); + ivf->iloc = (int) ENCSUBFACE; + return 0; + } + } + } // if (checksubfaceflag) + + if ((ivf->iloc == (int) OUTSIDE) && ivf->refineflag) { + // The vertex lies outside of the domain. And it does not encroach + // upon any boundary segment or subface. Do not insert it. + insertpoint_abort(splitseg, ivf); + return 0; + } + + if (ivf->splitbdflag) { + // The new point locates in surface mesh. Update the sC(p). + // We have already 'smarktested' the subfaces which directly intersect + // with p in 'caveshlist'. From them, we 'smarktest' their neighboring + // subfaces which are included in C(p). Do not across a segment. + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + checksh = *parysh; + for (j = 0; j < 3; j++) { + if (!isshsubseg(checksh)) { + spivot(checksh, neighsh); + if (!smarktested(neighsh)) { + stpivot(neighsh, neightet); + if (infected(neightet)) { + fsymself(neightet); + if (infected(neightet)) { + // This subface is inside C(p). + // Check if its diametrical circumsphere encloses 'p'. + // The purpose of this check is to avoid forming invalid + // subcavity in surface mesh. + sign = incircle3d(sorg(neighsh), sdest(neighsh), + sapex(neighsh), insertpt); + if (sign < 0) { + smarktest(neighsh); + caveshlist->newindex((void **) &parysh); + *parysh = neighsh; + } + } + } + } + } + senextself(checksh); + } // j + } // i + } // if (ivf->splitbdflag) + + if (ivf->validflag) { + // Validate C(p) and update it if it is not star-shaped. + int cutcount = 0; + + if (ivf->respectbdflag) { + // The initial cavity may include subfaces which are not on the facets + // being splitting. Find them and make them as boundary of C(p). + // Comment: We have already 'smarktested' the subfaces in sC(p). They + // are completely inside C(p). + for (i = 0; i < cavetetshlist->objects; i++) { + parysh = (face *) fastlookup(cavetetshlist, i); + stpivot(*parysh, neightet); + if (infected(neightet)) { + fsymself(neightet); + if (infected(neightet)) { + // Found a subface inside C(p). + if (!smarktested(*parysh)) { + // It is possible that this face is a boundary subface. + // Check if it is a hull face. + //assert(apex(neightet) != dummypoint); + if (oppo(neightet) != dummypoint) { + fsymself(neightet); + } + if (oppo(neightet) != dummypoint) { + ori = orient3d(org(neightet), dest(neightet), apex(neightet), + insertpt); + if (ori < 0) { + // A visible face, get its neighbor face. + fsymself(neightet); + ori = -ori; // It must be invisible by p. + } + } else { + // A hull tet. It needs to be cut. + ori = 1; + } + // Cut this tet if it is either invisible by or coplanar with p. + if (ori >= 0) { + uninfect(neightet); + unmarktest(neightet); + cutcount++; + neightet.ver = epivot[neightet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neightet; + // Add three new faces to find new boundaries. + for (j = 0; j < 3; j++) { + esym(neightet, neineitet); + neineitet.ver = epivot[neineitet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neineitet; + enextself(neightet); + } + } // if (ori >= 0) + } + } + } + } // i + + // The initial cavity may include segments in its interior. We need to + // Update the cavity so that these segments are on the boundary of + // the cavity. + for (i = 0; i < cavetetseglist->objects; i++) { + paryseg = (face *) fastlookup(cavetetseglist, i); + // Check this segment if it is not a splitting segment. + if (!smarktested(*paryseg)) { + sstpivot1(*paryseg, neightet); + spintet = neightet; + while (1) { + if (!infected(spintet)) break; + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + if (infected(spintet)) { + // Find an adjacent tet at this segment such that both faces + // at this segment are not visible by p. + pa = org(neightet); + pb = dest(neightet); + spintet = neightet; + j = 0; + while (1) { + // Check if this face is visible by p. + pc = apex(spintet); + if (pc != dummypoint) { + ori = orient3d(pa, pb, pc, insertpt); + if (ori >= 0) { + // Not visible. Check another face in this tet. + esym(spintet, neineitet); + pc = apex(neineitet); + if (pc != dummypoint) { + ori = orient3d(pb, pa, pc, insertpt); + if (ori >= 0) { + // Not visible. Found this face. + j = 1; // Flag that it is found. + break; + } + } + } + } + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + if (j == 0) { + // Not found such a face. + terminatetetgen(this, 2); + } + neightet = spintet; + if (b->verbose > 3) { + printf(" Cut tet (%d, %d, %d, %d)\n", + pointmark(org(neightet)), pointmark(dest(neightet)), + pointmark(apex(neightet)), pointmark(oppo(neightet))); + } + uninfect(neightet); + unmarktest(neightet); + cutcount++; + neightet.ver = epivot[neightet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neightet; + // Add three new faces to find new boundaries. + for (j = 0; j < 3; j++) { + esym(neightet, neineitet); + neineitet.ver = epivot[neineitet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neineitet; + enextself(neightet); + } + } + } + } // i + } // if (ivf->respectbdflag) + + // Update the cavity by removing invisible faces until it is star-shaped. + for (i = 0; i < cavebdrylist->objects; i++) { + cavetet = (triface *) fastlookup(cavebdrylist, i); + // 'cavetet' is an exterior tet adjacent to the cavity. + // Check if its neighbor is inside C(p). + fsym(*cavetet, neightet); + if (infected(neightet)) { + if (apex(*cavetet) != dummypoint) { + // It is a cavity boundary face. Check its visibility. + if (oppo(neightet) != dummypoint) { + // Check if this face is visible by the new point. + if (issubface(neightet)) { + // We should only create a new tet that has a reasonable volume. + // Re-use 'volume' and 'attrib'. + pa = org(*cavetet); + pb = dest(*cavetet); + pc = apex(*cavetet); + volume = orient3dfast(pa, pb, pc, insertpt); + attrib = distance(pa, pb) * distance(pb, pc) * distance(pc, pa); + if ((fabs(volume) / attrib) < b->epsilon) { + ori = 0.0; + } else { + ori = orient3d(pa, pb, pc, insertpt); + } + } else { + ori = orient3d(org(*cavetet), dest(*cavetet), apex(*cavetet), + insertpt); + } + enqflag = (ori > 0); + // Comment: if ori == 0 (coplanar case), we also cut the tet. + } else { + // It is a hull face. And its adjacent tet (at inside of the + // domain) has been cut from the cavity. Cut it as well. + //assert(nonconvex); + enqflag = false; + } + } else { + enqflag = true; // A hull edge. + } + if (enqflag) { + // This face is valid, save it. + cavetetlist->newindex((void **) &parytet); + *parytet = *cavetet; + } else { + uninfect(neightet); + unmarktest(neightet); + cutcount++; + // Add three new faces to find new boundaries. + for (j = 0; j < 3; j++) { + esym(neightet, neineitet); + neineitet.ver = epivot[neineitet.ver]; + cavebdrylist->newindex((void **) &parytet); + *parytet = neineitet; + enextself(neightet); + } + // 'cavetet' is not on the cavity boundary anymore. + unmarktest(*cavetet); + } + } else { + // 'cavetet' is not on the cavity boundary anymore. + unmarktest(*cavetet); + } + } // i + + if (cutcount > 0) { + // The cavity has been updated. + // Update the cavity boundary faces. + cavebdrylist->restart(); + for (i = 0; i < cavetetlist->objects; i++) { + cavetet = (triface *) fastlookup(cavetetlist, i); + // 'cavetet' was an exterior tet adjacent to the cavity. + fsym(*cavetet, neightet); + if (infected(neightet)) { + // It is a cavity boundary face. + cavebdrylist->newindex((void **) &parytet); + *parytet = *cavetet; + } else { + // Not a cavity boundary face. + unmarktest(*cavetet); + } + } + + // Update the list of old tets. + cavetetlist->restart(); + for (i = 0; i < caveoldtetlist->objects; i++) { + cavetet = (triface *) fastlookup(caveoldtetlist, i); + if (infected(*cavetet)) { + cavetetlist->newindex((void **) &parytet); + *parytet = *cavetet; + } + } + // Swap 'cavetetlist' and 'caveoldtetlist'. + swaplist = caveoldtetlist; + caveoldtetlist = cavetetlist; + cavetetlist = swaplist; + + // The cavity should contain at least one tet. + if (caveoldtetlist->objects == 0l) { + insertpoint_abort(splitseg, ivf); + ivf->iloc = (int) BADELEMENT; + return 0; + } + + if (ivf->splitbdflag) { + int cutshcount = 0; + // Update the sub-cavity sC(p). + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + if (smarktested(*parysh)) { + enqflag = false; + stpivot(*parysh, neightet); + if (infected(neightet)) { + fsymself(neightet); + if (infected(neightet)) { + enqflag = true; + } + } + if (!enqflag) { + sunmarktest(*parysh); + // Use the last entry of this array to fill this entry. + j = caveshlist->objects - 1; + checksh = * (face *) fastlookup(caveshlist, j); + *parysh = checksh; + cutshcount++; + caveshlist->objects--; // The list is shrinked. + i--; + } + } + } + + if (cutshcount > 0) { + i = 0; // Count the number of invalid subfaces/segments. + // Valid the updated sub-cavity sC(p). + if (loc == ONFACE) { + if ((splitsh != NULL) && (splitsh->sh != NULL)) { + // The to-be split subface should be in sC(p). + if (!smarktested(*splitsh)) i++; + } + } else if (loc == ONEDGE) { + if ((splitseg != NULL) && (splitseg->sh != NULL)) { + // The to-be split segment should be in sC(p). + if (!smarktested(*splitseg)) i++; + } + if ((splitsh != NULL) && (splitsh->sh != NULL)) { + // All subfaces at this edge should be in sC(p). + pa = sorg(*splitsh); + neighsh = *splitsh; + while (1) { + // Adjust the origin of its edge to be 'pa'. + if (sorg(neighsh) != pa) { + sesymself(neighsh); + } + // Add this face into list (in B-W cavity). + if (!smarktested(neighsh)) i++; + // Go to the next face at the edge. + spivotself(neighsh); + // Stop if all faces at the edge have been visited. + if (neighsh.sh == splitsh->sh) break; + if (neighsh.sh == NULL) break; + } // while (1) + } + } + + if (i > 0) { + // The updated sC(p) is invalid. Do not insert this vertex. + insertpoint_abort(splitseg, ivf); + ivf->iloc = (int) BADELEMENT; + return 0; + } + } // if (cutshcount > 0) + } // if (ivf->splitbdflag) + } // if (cutcount > 0) + + } // if (ivf->validflag) + + if (ivf->refineflag) { + // The new point is inserted by Delaunay refinement, i.e., it is the + // circumcenter of a tetrahedron, or a subface, or a segment. + // Do not insert this point if the tetrahedron, or subface, or segment + // is not inside the final cavity. + if (((ivf->refineflag == 1) && !infected(ivf->refinetet)) || + ((ivf->refineflag == 2) && !smarktested(ivf->refinesh))) { + insertpoint_abort(splitseg, ivf); + ivf->iloc = (int) BADELEMENT; + return 0; + } + } // if (ivf->refineflag) + + if (b->plc && (loc != INSTAR)) { + // Reject the new point if it lies too close to an existing point (b->plc), + // or it lies inside a protecting ball of near vertex (ivf->rejflag & 4). + // Collect the list of vertices of the initial cavity. + if (loc == OUTSIDE) { + pts = (point *) &(searchtet->tet[4]); + for (i = 0; i < 3; i++) { + cavetetvertlist->newindex((void **) &parypt); + *parypt = pts[i]; + } + } else if (loc == INTETRAHEDRON) { + pts = (point *) &(searchtet->tet[4]); + for (i = 0; i < 4; i++) { + cavetetvertlist->newindex((void **) &parypt); + *parypt = pts[i]; + } + } else if (loc == ONFACE) { + pts = (point *) &(searchtet->tet[4]); + for (i = 0; i < 3; i++) { + cavetetvertlist->newindex((void **) &parypt); + *parypt = pts[i]; + } + if (pts[3] != dummypoint) { + cavetetvertlist->newindex((void **) &parypt); + *parypt = pts[3]; + } + fsym(*searchtet, spintet); + if (oppo(spintet) != dummypoint) { + cavetetvertlist->newindex((void **) &parypt); + *parypt = oppo(spintet); + } + } else if (loc == ONEDGE) { + spintet = *searchtet; + cavetetvertlist->newindex((void **) &parypt); + *parypt = org(spintet); + cavetetvertlist->newindex((void **) &parypt); + *parypt = dest(spintet); + while (1) { + if (apex(spintet) != dummypoint) { + cavetetvertlist->newindex((void **) &parypt); + *parypt = apex(spintet); + } + fnextself(spintet); + if (spintet.tet == searchtet->tet) break; + } + } + + int rejptflag = (ivf->rejflag & 4); + REAL rd; + pts = NULL; + + for (i = 0; i < cavetetvertlist->objects; i++) { + parypt = (point *) fastlookup(cavetetvertlist, i); + rd = distance(*parypt, insertpt); + // Is the point very close to an existing point? + if (rd < minedgelength) { + pts = parypt; + loc = NEARVERTEX; + break; + } + if (rejptflag) { + // Is the point encroaches upon an existing point? + if (rd < (0.5 * (*parypt)[pointmtrindex])) { + pts = parypt; + loc = ENCVERTEX; + break; + } + } + } + cavetetvertlist->restart(); // Clear the work list. + + if (pts != NULL) { + // The point is either too close to an existing vertex (NEARVERTEX) + // or encroaches upon (inside the protecting ball) of that vertex. + if (loc == NEARVERTEX) { + if (!issteinerpoint(insertpt) && b->nomergevertex) { // -M0/1 option. + // 'insertpt' is an input vertex. + // In this case, we still insert this vertex. Issue a warning. + if (!b->quiet) { + printf("Warning: Two points, %d and %d, are very close.\n", + pointmark(insertpt), pointmark(*pts)); + printf(" Creating a very short edge (len = %g) (< %g).\n", + rd, minedgelength); + printf(" You may try a smaller tolerance (-T) (current is %g)\n", + b->epsilon); + printf(" to avoid this warning.\n"); + } + } else { + point2tetorg(*pts, *searchtet); + insertpoint_abort(splitseg, ivf); + ivf->iloc = (int) loc; + return 0; + } + } else { // loc == ENCVERTEX + // The point lies inside the protection ball. + point2tetorg(*pts, *searchtet); + insertpoint_abort(splitseg, ivf); + ivf->iloc = (int) loc; + return 0; + } + } + } // if (b->plc && (loc != INSTAR)) + + if (b->weighted || ivf->cdtflag || ivf->smlenflag + ) { + // There may be other vertices inside C(p). We need to find them. + // Collect all vertices of C(p). + for (i = 0; i < caveoldtetlist->objects; i++) { + cavetet = (triface *) fastlookup(caveoldtetlist, i); + //assert(infected(*cavetet)); + pts = (point *) &(cavetet->tet[4]); + for (j = 0; j < 4; j++) { + if (pts[j] != dummypoint) { + if (!pinfected(pts[j])) { + pinfect(pts[j]); + cavetetvertlist->newindex((void **) &parypt); + *parypt = pts[j]; + } + } + } // j + } // i + // Uninfect all collected (cavity) vertices. + for (i = 0; i < cavetetvertlist->objects; i++) { + parypt = (point *) fastlookup(cavetetvertlist, i); + puninfect(*parypt); + } + if (ivf->smlenflag) { + REAL len; + // Get the length of the shortest edge connecting to 'newpt'. + parypt = (point *) fastlookup(cavetetvertlist, 0); + ivf->smlen = distance(*parypt, insertpt); + ivf->parentpt = *parypt; + for (i = 1; i < cavetetvertlist->objects; i++) { + parypt = (point *) fastlookup(cavetetvertlist, i); + len = distance(*parypt, insertpt); + if (len < ivf->smlen) { + ivf->smlen = len; + ivf->parentpt = *parypt; + } + } + } + } + + + if (ivf->cdtflag) { + // Unmark tets. + for (i = 0; i < caveoldtetlist->objects; i++) { + cavetet = (triface *) fastlookup(caveoldtetlist, i); + unmarktest(*cavetet); + } + for (i = 0; i < cavebdrylist->objects; i++) { + cavetet = (triface *) fastlookup(cavebdrylist, i); + unmarktest(*cavetet); + } + // Clean up arrays which are not needed. + cavetetlist->restart(); + if (checksubsegflag) { + cavetetseglist->restart(); + } + if (checksubfaceflag) { + cavetetshlist->restart(); + } + return 1; + } + + // Before re-mesh C(p). Process the segments and subfaces which are on the + // boundary of C(p). Make sure that each such segment or subface is + // connecting to a tet outside C(p). So we can re-connect them to the + // new tets inside the C(p) later. + + if (checksubsegflag) { + for (i = 0; i < cavetetseglist->objects; i++) { + paryseg = (face *) fastlookup(cavetetseglist, i); + // Operate on it if it is not the splitting segment, i.e., in sC(p). + if (!smarktested(*paryseg)) { + // Check if the segment is inside the cavity. + // 'j' counts the num of adjacent tets of this seg. + // 'k' counts the num of adjacent tets which are 'sinfected'. + j = k = 0; + sstpivot1(*paryseg, neightet); + spintet = neightet; + while (1) { + j++; + if (!infected(spintet)) { + neineitet = spintet; // An outer tet. Remember it. + } else { + k++; // An in tet. + } + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + // assert(j > 0); + if (k == 0) { + // The segment is not connect to C(p) anymore. Remove it by + // Replacing it by the last entry of this list. + s = cavetetseglist->objects - 1; + checkseg = * (face *) fastlookup(cavetetseglist, s); + *paryseg = checkseg; + cavetetseglist->objects--; + i--; + } else if (k < j) { + // The segment is on the boundary of C(p). + sstbond1(*paryseg, neineitet); + } else { // k == j + // The segment is inside C(p). + if (!ivf->splitbdflag) { + checkseg = *paryseg; + sinfect(checkseg); // Flag it as an interior segment. + caveencseglist->newindex((void **) &paryseg); + *paryseg = checkseg; + } else { + //assert(0); // Not possible. + terminatetetgen(this, 2); + } + } + } else { + // assert(smarktested(*paryseg)); + // Flag it as an interior segment. Do not queue it, since it will + // be deleted after the segment splitting. + sinfect(*paryseg); + } + } // i + } // if (checksubsegflag) + + if (checksubfaceflag) { + for (i = 0; i < cavetetshlist->objects; i++) { + parysh = (face *) fastlookup(cavetetshlist, i); + // Operate on it if it is not inside the sub-cavity sC(p). + if (!smarktested(*parysh)) { + // Check if this subface is inside the cavity. + k = 0; + for (j = 0; j < 2; j++) { + stpivot(*parysh, neightet); + if (!infected(neightet)) { + checksh = *parysh; // Remember this side. + } else { + k++; + } + sesymself(*parysh); + } + if (k == 0) { + // The subface is not connected to C(p). Remove it. + s = cavetetshlist->objects - 1; + checksh = * (face *) fastlookup(cavetetshlist, s); + *parysh = checksh; + cavetetshlist->objects--; + i--; + } else if (k == 1) { + // This side is the outer boundary of C(p). + *parysh = checksh; + } else { // k == 2 + if (!ivf->splitbdflag) { + checksh = *parysh; + sinfect(checksh); // Flag it. + caveencshlist->newindex((void **) &parysh); + *parysh = checksh; + } else { + //assert(0); // Not possible. + terminatetetgen(this, 2); + } + } + } else { + // assert(smarktested(*parysh)); + // Flag it as an interior subface. Do not queue it. It will be + // deleted after the facet point insertion. + sinfect(*parysh); + } + } // i + } // if (checksubfaceflag) + + // Create new tetrahedra to fill the cavity. + + for (i = 0; i < cavebdrylist->objects; i++) { + cavetet = (triface *) fastlookup(cavebdrylist, i); + neightet = *cavetet; + unmarktest(neightet); // Unmark it. + // Get the oldtet (inside the cavity). + fsym(neightet, oldtet); + if (apex(neightet) != dummypoint) { + // Create a new tet in the cavity. + maketetrahedron(&newtet); + setorg(newtet, dest(neightet)); + setdest(newtet, org(neightet)); + setapex(newtet, apex(neightet)); + setoppo(newtet, insertpt); + } else { + // Create a new hull tet. + hullsize++; + maketetrahedron(&newtet); + setorg(newtet, org(neightet)); + setdest(newtet, dest(neightet)); + setapex(newtet, insertpt); + setoppo(newtet, dummypoint); // It must opposite to face 3. + // Adjust back to the cavity bounday face. + esymself(newtet); + } + // The new tet inherits attribtes from the old tet. + for (j = 0; j < numelemattrib; j++) { + attrib = elemattribute(oldtet.tet, j); + setelemattribute(newtet.tet, j, attrib); + } + if (b->varvolume) { + volume = volumebound(oldtet.tet); + setvolumebound(newtet.tet, volume); + } + // Connect newtet <==> neightet, this also disconnect the old bond. + bond(newtet, neightet); + // oldtet still connects to neightet. + *cavetet = oldtet; // *cavetet = newtet; + } // i + + // Set a handle for speeding point location. + recenttet = newtet; + //setpoint2tet(insertpt, encode(newtet)); + setpoint2tet(insertpt, (tetrahedron) (newtet.tet)); + + // Re-use this list to save new interior cavity faces. + cavetetlist->restart(); + + // Connect adjacent new tetrahedra together. + for (i = 0; i < cavebdrylist->objects; i++) { + cavetet = (triface *) fastlookup(cavebdrylist, i); + // cavtet is an oldtet, get the newtet at this face. + oldtet = *cavetet; + fsym(oldtet, neightet); + fsym(neightet, newtet); + // Comment: oldtet and newtet must be at the same directed edge. + // Connect the three other faces of this newtet. + for (j = 0; j < 3; j++) { + esym(newtet, neightet); // Go to the face. + if (neightet.tet[neightet.ver & 3] == NULL) { + // Find the adjacent face of this newtet. + spintet = oldtet; + while (1) { + fnextself(spintet); + if (!infected(spintet)) break; + } + fsym(spintet, newneitet); + esymself(newneitet); + bond(neightet, newneitet); + if (ivf->lawson > 1) { + cavetetlist->newindex((void **) &parytet); + *parytet = neightet; + } + } + //setpoint2tet(org(newtet), encode(newtet)); + setpoint2tet(org(newtet), (tetrahedron) (newtet.tet)); + enextself(newtet); + enextself(oldtet); + } + *cavetet = newtet; // Save the new tet. + } // i + + if (checksubfaceflag) { + // Connect subfaces on the boundary of the cavity to the new tets. + for (i = 0; i < cavetetshlist->objects; i++) { + parysh = (face *) fastlookup(cavetetshlist, i); + // Connect it if it is not a missing subface. + if (!sinfected(*parysh)) { + stpivot(*parysh, neightet); + fsym(neightet, spintet); + sesymself(*parysh); + tsbond(spintet, *parysh); + } + } + } + + if (checksubsegflag) { + // Connect segments on the boundary of the cavity to the new tets. + for (i = 0; i < cavetetseglist->objects; i++) { + paryseg = (face *) fastlookup(cavetetseglist, i); + // Connect it if it is not a missing segment. + if (!sinfected(*paryseg)) { + sstpivot1(*paryseg, neightet); + spintet = neightet; + while (1) { + tssbond1(spintet, *paryseg); + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + } + } + } + + if (((splitsh != NULL) && (splitsh->sh != NULL)) || + ((splitseg != NULL) && (splitseg->sh != NULL))) { + // Split a subface or a segment. + sinsertvertex(insertpt, splitsh, splitseg, ivf->sloc, ivf->sbowywat, 0); + } + + if (checksubfaceflag) { + if (ivf->splitbdflag) { + // Recover new subfaces in C(p). + for (i = 0; i < caveshbdlist->objects; i++) { + // Get an old subface at edge [a, b]. + parysh = (face *) fastlookup(caveshbdlist, i); + spivot(*parysh, checksh); // The new subface [a, b, p]. + // Do not recover a deleted new face (degenerated). + if (checksh.sh[3] != NULL) { + // Note that the old subface still connects to adjacent old tets + // of C(p), which still connect to the tets outside C(p). + stpivot(*parysh, neightet); + // Find the adjacent tet containing the edge [a,b] outside C(p). + spintet = neightet; + while (1) { + fnextself(spintet); + if (!infected(spintet)) break; + } + // The adjacent tet connects to a new tet in C(p). + fsym(spintet, neightet); + // Find the tet containing the face [a, b, p]. + spintet = neightet; + while (1) { + fnextself(spintet); + if (apex(spintet) == insertpt) break; + } + // Adjust the edge direction in spintet and checksh. + if (sorg(checksh) != org(spintet)) { + sesymself(checksh); + } + // Connect the subface to two adjacent tets. + tsbond(spintet, checksh); + fsymself(spintet); + sesymself(checksh); + tsbond(spintet, checksh); + } // if (checksh.sh[3] != NULL) + } + } else { + // The Boundary recovery phase. + // Put all new subfaces into stack for recovery. + for (i = 0; i < caveshbdlist->objects; i++) { + // Get an old subface at edge [a, b]. + parysh = (face *) fastlookup(caveshbdlist, i); + spivot(*parysh, checksh); // The new subface [a, b, p]. + // Do not recover a deleted new face (degenerated). + if (checksh.sh[3] != NULL) { + subfacstack->newindex((void **) &parysh); + *parysh = checksh; + } + } + // Put all interior subfaces into stack for recovery. + for (i = 0; i < caveencshlist->objects; i++) { + parysh = (face *) fastlookup(caveencshlist, i); + // Some subfaces inside C(p) might be split in sinsertvertex(). + // Only queue those faces which are not split. + if (!smarktested(*parysh)) { + checksh = *parysh; + suninfect(checksh); + stdissolve(checksh); // Detach connections to old tets. + subfacstack->newindex((void **) &parysh); + *parysh = checksh; + } + } + } + } // if (checksubfaceflag) + + if (checksubsegflag) { + if (ivf->splitbdflag) { + if (splitseg != NULL) { + // Recover the two new subsegments in C(p). + for (i = 0; i < cavesegshlist->objects; i++) { + paryseg = (face *) fastlookup(cavesegshlist, i); + // Insert this subsegment into C(p). + checkseg = *paryseg; + // Get the adjacent new subface. + checkseg.shver = 0; + spivot(checkseg, checksh); + if (checksh.sh != NULL) { + // Get the adjacent new tetrahedron. + stpivot(checksh, neightet); + } else { + // It's a dangling segment. + point2tetorg(sorg(checkseg), neightet); + finddirection(&neightet, sdest(checkseg)); + } + sstbond1(checkseg, neightet); + spintet = neightet; + while (1) { + tssbond1(spintet, checkseg); + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + } + } // if (splitseg != NULL) + } else { + // The Boundary Recovery Phase. + // Queue missing segments in C(p) for recovery. + if (splitseg != NULL) { + // Queue two new subsegments in C(p) for recovery. + for (i = 0; i < cavesegshlist->objects; i++) { + paryseg = (face *) fastlookup(cavesegshlist, i); + checkseg = *paryseg; + //sstdissolve1(checkseg); // It has not been connected yet. + s = randomnation(subsegstack->objects + 1); + subsegstack->newindex((void **) &paryseg); + *paryseg = * (face *) fastlookup(subsegstack, s); + paryseg = (face *) fastlookup(subsegstack, s); + *paryseg = checkseg; + } + } // if (splitseg != NULL) + for (i = 0; i < caveencseglist->objects; i++) { + paryseg = (face *) fastlookup(caveencseglist, i); + if (!smarktested(*paryseg)) { // It may be split. + checkseg = *paryseg; + suninfect(checkseg); + sstdissolve1(checkseg); // Detach connections to old tets. + s = randomnation(subsegstack->objects + 1); + subsegstack->newindex((void **) &paryseg); + *paryseg = * (face *) fastlookup(subsegstack, s); + paryseg = (face *) fastlookup(subsegstack, s); + *paryseg = checkseg; + } + } + } + } // if (checksubsegflag) + + if (b->weighted + ) { + // Some vertices may be completed inside the cavity. They must be + // detected and added to recovering list. + // Since every "live" vertex must contain a pointer to a non-dead + // tetrahedron, we can check for each vertex this pointer. + for (i = 0; i < cavetetvertlist->objects; i++) { + pts = (point *) fastlookup(cavetetvertlist, i); + decode(point2tet(*pts), *searchtet); + if (infected(*searchtet)) { + if (b->weighted) { + if (b->verbose > 1) { + printf(" Point #%d is non-regular after the insertion of #%d.\n", + pointmark(*pts), pointmark(insertpt)); + } + setpointtype(*pts, NREGULARVERTEX); + nonregularcount++; + } + } + } + } + + if (ivf->chkencflag & 1) { + // Queue all segment outside C(p). + for (i = 0; i < cavetetseglist->objects; i++) { + paryseg = (face *) fastlookup(cavetetseglist, i); + // Skip if it is the split segment. + if (!sinfected(*paryseg)) { + enqueuesubface(badsubsegs, paryseg); + } + } + if (splitseg != NULL) { + // Queue the two new subsegments inside C(p). + for (i = 0; i < cavesegshlist->objects; i++) { + paryseg = (face *) fastlookup(cavesegshlist, i); + enqueuesubface(badsubsegs, paryseg); + } + } + } // if (chkencflag & 1) + + if (ivf->chkencflag & 2) { + // Queue all subfaces outside C(p). + for (i = 0; i < cavetetshlist->objects; i++) { + parysh = (face *) fastlookup(cavetetshlist, i); + // Skip if it is a split subface. + if (!sinfected(*parysh)) { + enqueuesubface(badsubfacs, parysh); + } + } + // Queue all new subfaces inside C(p). + for (i = 0; i < caveshbdlist->objects; i++) { + // Get an old subface at edge [a, b]. + parysh = (face *) fastlookup(caveshbdlist, i); + spivot(*parysh, checksh); // checksh is a new subface [a, b, p]. + // Do not recover a deleted new face (degenerated). + if (checksh.sh[3] != NULL) { + enqueuesubface(badsubfacs, &checksh); + } + } + } // if (chkencflag & 2) + + if (ivf->chkencflag & 4) { + // Queue all new tetrahedra in C(p). + for (i = 0; i < cavebdrylist->objects; i++) { + cavetet = (triface *) fastlookup(cavebdrylist, i); + enqueuetetrahedron(cavetet); + } + } + + // C(p) is re-meshed successfully. + + // Delete the old tets in C(p). + for (i = 0; i < caveoldtetlist->objects; i++) { + searchtet = (triface *) fastlookup(caveoldtetlist, i); + if (ishulltet(*searchtet)) { + hullsize--; + } + tetrahedrondealloc(searchtet->tet); + } + + if (((splitsh != NULL) && (splitsh->sh != NULL)) || + ((splitseg != NULL) && (splitseg->sh != NULL))) { + // Delete the old subfaces in sC(p). + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + if (checksubfaceflag) {//if (bowywat == 2) { + // It is possible that this subface still connects to adjacent + // tets which are not in C(p). If so, clear connections in the + // adjacent tets at this subface. + stpivot(*parysh, neightet); + if (neightet.tet != NULL) { + if (neightet.tet[4] != NULL) { + // Found an adjacent tet. It must be not in C(p). + tsdissolve(neightet); + fsymself(neightet); + tsdissolve(neightet); + } + } + } + shellfacedealloc(subfaces, parysh->sh); + } + if ((splitseg != NULL) && (splitseg->sh != NULL)) { + // Delete the old segment in sC(p). + shellfacedealloc(subsegs, splitseg->sh); + } + } + + if (ivf->lawson) { + for (i = 0; i < cavebdrylist->objects; i++) { + searchtet = (triface *) fastlookup(cavebdrylist, i); + flippush(flipstack, searchtet); + } + if (ivf->lawson > 1) { + for (i = 0; i < cavetetlist->objects; i++) { + searchtet = (triface *) fastlookup(cavetetlist, i); + flippush(flipstack, searchtet); + } + } + } + + + // Clean the working lists. + + caveoldtetlist->restart(); + cavebdrylist->restart(); + cavetetlist->restart(); + + if (checksubsegflag) { + cavetetseglist->restart(); + caveencseglist->restart(); + } + + if (checksubfaceflag) { + cavetetshlist->restart(); + caveencshlist->restart(); + } + + if (b->weighted || ivf->smlenflag + ) { + cavetetvertlist->restart(); + } + + if (((splitsh != NULL) && (splitsh->sh != NULL)) || + ((splitseg != NULL) && (splitseg->sh != NULL))) { + caveshlist->restart(); + caveshbdlist->restart(); + cavesegshlist->restart(); + } + + return 1; // Point is inserted. +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// insertpoint_abort() Abort the insertion of a new vertex. // +// // +// The cavity will be restored. All working lists are cleared. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::insertpoint_abort(face *splitseg, insertvertexflags *ivf) +{ + triface *cavetet; + face *parysh; + int i; + + for (i = 0; i < caveoldtetlist->objects; i++) { + cavetet = (triface *) fastlookup(caveoldtetlist, i); + uninfect(*cavetet); + unmarktest(*cavetet); + } + for (i = 0; i < cavebdrylist->objects; i++) { + cavetet = (triface *) fastlookup(cavebdrylist, i); + unmarktest(*cavetet); + } + cavetetlist->restart(); + cavebdrylist->restart(); + caveoldtetlist->restart(); + cavetetseglist->restart(); + cavetetshlist->restart(); + if (ivf->splitbdflag) { + if ((splitseg != NULL) && (splitseg->sh != NULL)) { + sunmarktest(*splitseg); + } + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + sunmarktest(*parysh); + } + caveshlist->restart(); + cavesegshlist->restart(); + } +} + +//// //// +//// //// +//// flip_cxx ///////////////////////////////////////////////////////////////// + +//// delaunay_cxx ///////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// transfernodes() Read the vertices from the input (tetgenio). // +// // +// Transferring all points from input ('in->pointlist') to TetGen's 'points'.// +// All points are indexed (the first point index is 'in->firstnumber'). Each // +// point's type is initialized as UNUSEDVERTEX. The bounding box (xmax, xmin,// +// ...) and the diameter (longest) of the point set are calculated. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::transfernodes() +{ + point pointloop; + REAL x, y, z, w; + int coordindex; + int attribindex; + int mtrindex; + int i, j; + + // Read the points. + coordindex = 0; + attribindex = 0; + mtrindex = 0; + for (i = 0; i < in->numberofpoints; i++) { + makepoint(&pointloop, UNUSEDVERTEX); + // Read the point coordinates. + x = pointloop[0] = in->pointlist[coordindex++]; + y = pointloop[1] = in->pointlist[coordindex++]; + z = pointloop[2] = in->pointlist[coordindex++]; + // Read the point attributes. (Including point weights.) + for (j = 0; j < in->numberofpointattributes; j++) { + pointloop[3 + j] = in->pointattributelist[attribindex++]; + } + // Read the point metric tensor. + for (j = 0; j < in->numberofpointmtrs; j++) { + pointloop[pointmtrindex + j] = in->pointmtrlist[mtrindex++]; + } + if (b->weighted) { // -w option + if (in->numberofpointattributes > 0) { + // The first point attribute is its weight. + //w = in->pointattributelist[in->numberofpointattributes * i]; + w = pointloop[3]; + } else { + // No given weight available. Default choose the maximum + // absolute value among its coordinates. + w = fabs(x); + if (w < fabs(y)) w = fabs(y); + if (w < fabs(z)) w = fabs(z); + } + if (b->weighted_param == 0) { + pointloop[3] = x * x + y * y + z * z - w; // Weighted DT. + } else { // -w1 option + pointloop[3] = w; // Regular tetrahedralization. + } + } + // Determine the smallest and largest x, y and z coordinates. + if (i == 0) { + xmin = xmax = x; + ymin = ymax = y; + zmin = zmax = z; + } else { + xmin = (x < xmin) ? x : xmin; + xmax = (x > xmax) ? x : xmax; + ymin = (y < ymin) ? y : ymin; + ymax = (y > ymax) ? y : ymax; + zmin = (z < zmin) ? z : zmin; + zmax = (z > zmax) ? z : zmax; + } + if (b->psc) { + // Read the geometry parameters. + setpointgeomuv(pointloop, 0, in->pointparamlist[i].uv[0]); + setpointgeomuv(pointloop, 1, in->pointparamlist[i].uv[1]); + setpointgeomtag(pointloop, in->pointparamlist[i].tag); + if (in->pointparamlist[i].type == 0) { + setpointtype(pointloop, RIDGEVERTEX); + } else if (in->pointparamlist[i].type == 1) { + setpointtype(pointloop, FREESEGVERTEX); + } else if (in->pointparamlist[i].type == 2) { + setpointtype(pointloop, FREEFACETVERTEX); + } else if (in->pointparamlist[i].type == 3) { + setpointtype(pointloop, FREEVOLVERTEX); + } + } + } + + // 'longest' is the largest possible edge length formed by input vertices. + x = xmax - xmin; + y = ymax - ymin; + z = zmax - zmin; + longest = sqrt(x * x + y * y + z * z); + if (longest == 0.0) { + printf("Error: The point set is trivial.\n"); + terminatetetgen(this, 10); + } + // Two identical points are distinguished by 'minedgelength'. + minedgelength = longest * b->epsilon; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// hilbert_init() Initialize the Gray code permutation table. // +// // +// The table 'transgc' has 8 x 3 x 8 entries. It contains all possible Gray // +// code sequences traveled by the 1st order Hilbert curve in 3 dimensions. // +// The first column is the Gray code of the entry point of the curve, and // +// the second column is the direction (0, 1, or 2, 0 means the x-axis) where // +// the exit point of curve lies. // +// // +// The table 'tsb1mod3' contains the numbers of trailing set '1' bits of the // +// indices from 0 to 7, modulo by '3'. The code for generating this table is // +// from: http://graphics.stanford.edu/~seander/bithacks.html. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::hilbert_init(int n) +{ + int gc[8], N, mask, travel_bit; + int e, d, f, k, g; + int v, c; + int i; + + N = (n == 2) ? 4 : 8; + mask = (n == 2) ? 3 : 7; + + // Generate the Gray code sequence. + for (i = 0; i < N; i++) { + gc[i] = i ^ (i >> 1); + } + + for (e = 0; e < N; e++) { + for (d = 0; d < n; d++) { + // Calculate the end point (f). + f = e ^ (1 << d); // Toggle the d-th bit of 'e'. + // travel_bit = 2**p, the bit we want to travel. + travel_bit = e ^ f; + for (i = 0; i < N; i++) { + // // Rotate gc[i] left by (p + 1) % n bits. + k = gc[i] * (travel_bit * 2); + g = ((k | (k / N)) & mask); + // Calculate the permuted Gray code by xor with the start point (e). + transgc[e][d][i] = (g ^ e); + } + } // d + } // e + + // Count the consecutive '1' bits (trailing) on the right. + tsb1mod3[0] = 0; + for (i = 1; i < N; i++) { + v = ~i; // Count the 0s. + v = (v ^ (v - 1)) >> 1; // Set v's trailing 0s to 1s and zero rest + for (c = 0; v; c++) { + v >>= 1; + } + tsb1mod3[i] = c % n; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// hilbert_sort3() Sort points using the 3d Hilbert curve. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::hilbert_split(point* vertexarray,int arraysize,int gc0,int gc1, + REAL bxmin, REAL bxmax, REAL bymin, REAL bymax, + REAL bzmin, REAL bzmax) +{ + point swapvert; + int axis, d; + REAL split; + int i, j; + + + // Find the current splitting axis. 'axis' is a value 0, or 1, or 2, which + // correspoding to x-, or y- or z-axis. + axis = (gc0 ^ gc1) >> 1; + + // Calulate the split position along the axis. + if (axis == 0) { + split = 0.5 * (bxmin + bxmax); + } else if (axis == 1) { + split = 0.5 * (bymin + bymax); + } else { // == 2 + split = 0.5 * (bzmin + bzmax); + } + + // Find the direction (+1 or -1) of the axis. If 'd' is +1, the direction + // of the axis is to the positive of the axis, otherwise, it is -1. + d = ((gc0 & (1< 0) { + do { + for (; i < arraysize; i++) { + if (vertexarray[i][axis] >= split) break; + } + for (; j >= 0; j--) { + if (vertexarray[j][axis] < split) break; + } + // Is the partition finished? + if (i == (j + 1)) break; + // Swap i-th and j-th vertices. + swapvert = vertexarray[i]; + vertexarray[i] = vertexarray[j]; + vertexarray[j] = swapvert; + // Continue patitioning the array; + } while (true); + } else { + do { + for (; i < arraysize; i++) { + if (vertexarray[i][axis] <= split) break; + } + for (; j >= 0; j--) { + if (vertexarray[j][axis] > split) break; + } + // Is the partition finished? + if (i == (j + 1)) break; + // Swap i-th and j-th vertices. + swapvert = vertexarray[i]; + vertexarray[i] = vertexarray[j]; + vertexarray[j] = swapvert; + // Continue patitioning the array; + } while (true); + } + + return i; +} + +void tetgenmesh::hilbert_sort3(point* vertexarray, int arraysize, int e, int d, + REAL bxmin, REAL bxmax, REAL bymin, REAL bymax, + REAL bzmin, REAL bzmax, int depth) +{ + REAL x1, x2, y1, y2, z1, z2; + int p[9], w, e_w, d_w, k, ei, di; + int n = 3, mask = 7; + + p[0] = 0; + p[8] = arraysize; + + // Sort the points according to the 1st order Hilbert curve in 3d. + p[4] = hilbert_split(vertexarray, p[8], transgc[e][d][3], transgc[e][d][4], + bxmin, bxmax, bymin, bymax, bzmin, bzmax); + p[2] = hilbert_split(vertexarray, p[4], transgc[e][d][1], transgc[e][d][2], + bxmin, bxmax, bymin, bymax, bzmin, bzmax); + p[1] = hilbert_split(vertexarray, p[2], transgc[e][d][0], transgc[e][d][1], + bxmin, bxmax, bymin, bymax, bzmin, bzmax); + p[3] = hilbert_split(&(vertexarray[p[2]]), p[4] - p[2], + transgc[e][d][2], transgc[e][d][3], + bxmin, bxmax, bymin, bymax, bzmin, bzmax) + p[2]; + p[6] = hilbert_split(&(vertexarray[p[4]]), p[8] - p[4], + transgc[e][d][5], transgc[e][d][6], + bxmin, bxmax, bymin, bymax, bzmin, bzmax) + p[4]; + p[5] = hilbert_split(&(vertexarray[p[4]]), p[6] - p[4], + transgc[e][d][4], transgc[e][d][5], + bxmin, bxmax, bymin, bymax, bzmin, bzmax) + p[4]; + p[7] = hilbert_split(&(vertexarray[p[6]]), p[8] - p[6], + transgc[e][d][6], transgc[e][d][7], + bxmin, bxmax, bymin, bymax, bzmin, bzmax) + p[6]; + + if (b->hilbert_order > 0) { + // A maximum order is prescribed. + if ((depth + 1) == b->hilbert_order) { + // The maximum prescribed order is reached. + return; + } + } + + // Recursively sort the points in sub-boxes. + for (w = 0; w < 8; w++) { + // w is the local Hilbert index (NOT Gray code). + // Sort into the sub-box either there are more than 2 points in it, or + // the prescribed order of the curve is not reached yet. + //if ((p[w+1] - p[w] > b->hilbert_limit) || (b->hilbert_order > 0)) { + if ((p[w+1] - p[w]) > b->hilbert_limit) { + // Calculcate the start point (ei) of the curve in this sub-box. + // update e = e ^ (e(w) left_rotate (d+1)). + if (w == 0) { + e_w = 0; + } else { + // calculate e(w) = gc(2 * floor((w - 1) / 2)). + k = 2 * ((w - 1) / 2); + e_w = k ^ (k >> 1); // = gc(k). + } + k = e_w; + e_w = ((k << (d+1)) & mask) | ((k >> (n-d-1)) & mask); + ei = e ^ e_w; + // Calulcate the direction (di) of the curve in this sub-box. + // update d = (d + d(w) + 1) % n + if (w == 0) { + d_w = 0; + } else { + d_w = ((w % 2) == 0) ? tsb1mod3[w - 1] : tsb1mod3[w]; + } + di = (d + d_w + 1) % n; + // Calculate the bounding box of the sub-box. + if (transgc[e][d][w] & 1) { // x-axis + x1 = 0.5 * (bxmin + bxmax); + x2 = bxmax; + } else { + x1 = bxmin; + x2 = 0.5 * (bxmin + bxmax); + } + if (transgc[e][d][w] & 2) { // y-axis + y1 = 0.5 * (bymin + bymax); + y2 = bymax; + } else { + y1 = bymin; + y2 = 0.5 * (bymin + bymax); + } + if (transgc[e][d][w] & 4) { // z-axis + z1 = 0.5 * (bzmin + bzmax); + z2 = bzmax; + } else { + z1 = bzmin; + z2 = 0.5 * (bzmin + bzmax); + } + hilbert_sort3(&(vertexarray[p[w]]), p[w+1] - p[w], ei, di, + x1, x2, y1, y2, z1, z2, depth+1); + } // if (p[w+1] - p[w] > 1) + } // w +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// brio_multiscale_sort() Sort the points using BRIO and Hilbert curve. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::brio_multiscale_sort(point* vertexarray, int arraysize, + int threshold, REAL ratio, int *depth) +{ + int middle; + + middle = 0; + if (arraysize >= threshold) { + (*depth)++; + middle = arraysize * ratio; + brio_multiscale_sort(vertexarray, middle, threshold, ratio, depth); + } + // Sort the right-array (rnd-th round) using the Hilbert curve. + hilbert_sort3(&(vertexarray[middle]), arraysize - middle, 0, 0, // e, d + xmin, xmax, ymin, ymax, zmin, zmax, 0); // depth. +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// randomnation() Generate a random number between 0 and 'choices' - 1. // +// // +/////////////////////////////////////////////////////////////////////////////// + +unsigned long tetgenmesh::randomnation(unsigned int choices) +{ + unsigned long newrandom; + + if (choices >= 714025l) { + newrandom = (randomseed * 1366l + 150889l) % 714025l; + randomseed = (newrandom * 1366l + 150889l) % 714025l; + newrandom = newrandom * (choices / 714025l) + randomseed; + if (newrandom >= choices) { + return newrandom - choices; + } else { + return newrandom; + } + } else { + randomseed = (randomseed * 1366l + 150889l) % 714025l; + return randomseed % choices; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// randomsample() Randomly sample the tetrahedra for point loation. // +// // +// Searching begins from one of handles: the input 'searchtet', a recently // +// encountered tetrahedron 'recenttet', or from one chosen from a random // +// sample. The choice is made by determining which one's origin is closest // +// to the point we are searching for. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::randomsample(point searchpt,triface *searchtet) +{ + tetrahedron *firsttet, *tetptr; + point torg; + void **sampleblock; + uintptr_t alignptr; + long sampleblocks, samplesperblock, samplenum; + long tetblocks, i, j; + REAL searchdist, dist; + + if (b->verbose > 2) { + printf(" Random sampling tetrahedra for searching point %d.\n", + pointmark(searchpt)); + } + + if (!nonconvex) { + if (searchtet->tet == NULL) { + // A null tet. Choose the recenttet as the starting tet. + *searchtet = recenttet; + } + + // 'searchtet' should be a valid tetrahedron. Choose the base face + // whose vertices must not be 'dummypoint'. + searchtet->ver = 3; + // Record the distance from its origin to the searching point. + torg = org(*searchtet); + searchdist = (searchpt[0] - torg[0]) * (searchpt[0] - torg[0]) + + (searchpt[1] - torg[1]) * (searchpt[1] - torg[1]) + + (searchpt[2] - torg[2]) * (searchpt[2] - torg[2]); + + // If a recently encountered tetrahedron has been recorded and has not + // been deallocated, test it as a good starting point. + if (recenttet.tet != searchtet->tet) { + recenttet.ver = 3; + torg = org(recenttet); + dist = (searchpt[0] - torg[0]) * (searchpt[0] - torg[0]) + + (searchpt[1] - torg[1]) * (searchpt[1] - torg[1]) + + (searchpt[2] - torg[2]) * (searchpt[2] - torg[2]); + if (dist < searchdist) { + *searchtet = recenttet; + searchdist = dist; + } + } + } else { + // The mesh is non-convex. Do not use 'recenttet'. + searchdist = longest; + } + + // Select "good" candidate using k random samples, taking the closest one. + // The number of random samples taken is proportional to the fourth root + // of the number of tetrahedra in the mesh. + while (samples * samples * samples * samples < tetrahedrons->items) { + samples++; + } + // Find how much blocks in current tet pool. + tetblocks = (tetrahedrons->maxitems + b->tetrahedraperblock - 1) + / b->tetrahedraperblock; + // Find the average samples per block. Each block at least have 1 sample. + samplesperblock = 1 + (samples / tetblocks); + sampleblocks = samples / samplesperblock; + sampleblock = tetrahedrons->firstblock; + for (i = 0; i < sampleblocks; i++) { + alignptr = (uintptr_t) (sampleblock + 1); + firsttet = (tetrahedron *) + (alignptr + (uintptr_t) tetrahedrons->alignbytes + - (alignptr % (uintptr_t) tetrahedrons->alignbytes)); + for (j = 0; j < samplesperblock; j++) { + if (i == tetblocks - 1) { + // This is the last block. + samplenum = randomnation((int) + (tetrahedrons->maxitems - (i * b->tetrahedraperblock))); + } else { + samplenum = randomnation(b->tetrahedraperblock); + } + tetptr = (tetrahedron *) + (firsttet + (samplenum * tetrahedrons->itemwords)); + torg = (point) tetptr[4]; + if (torg != (point) NULL) { + dist = (searchpt[0] - torg[0]) * (searchpt[0] - torg[0]) + + (searchpt[1] - torg[1]) * (searchpt[1] - torg[1]) + + (searchpt[2] - torg[2]) * (searchpt[2] - torg[2]); + if (dist < searchdist) { + searchtet->tet = tetptr; + searchtet->ver = 11; // torg = org(t); + searchdist = dist; + } + } else { + // A dead tet. Re-sample it. + if (i != tetblocks - 1) j--; + } + } + sampleblock = (void **) *sampleblock; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// locate() Find a tetrahedron containing a given point. // +// // +// Begins its search from 'searchtet', assume there is a line segment L from // +// a vertex of 'searchtet' to the query point 'searchpt', and simply walk // +// towards 'searchpt' by traversing all faces intersected by L. // +// // +// On completion, 'searchtet' is a tetrahedron that contains 'searchpt'. The // +// returned value indicates one of the following cases: // +// - ONVERTEX, the search point lies on the origin of 'searchtet'. // +// - ONEDGE, the search point lies on an edge of 'searchtet'. // +// - ONFACE, the search point lies on a face of 'searchtet'. // +// - INTET, the search point lies in the interior of 'searchtet'. // +// - OUTSIDE, the search point lies outside the mesh. 'searchtet' is a // +// hull face which is visible by the search point. // +// // +// WARNING: This routine is designed for convex triangulations, and will not // +// generally work after the holes and concavities have been carved. // +// // +/////////////////////////////////////////////////////////////////////////////// + +enum tetgenmesh::locateresult + tetgenmesh::locate(point searchpt, triface* searchtet, int chkencflag) +{ + point torg, tdest, tapex, toppo; + enum {ORGMOVE, DESTMOVE, APEXMOVE} nextmove; + REAL ori, oriorg, oridest, oriapex; + enum locateresult loc = OUTSIDE; + int t1ver; + int s; + + torg = tdest = tapex = toppo = NULL; + + if (searchtet->tet == NULL) { + // A null tet. Choose the recenttet as the starting tet. + searchtet->tet = recenttet.tet; + } + + // Check if we are in the outside of the convex hull. + if (ishulltet(*searchtet)) { + // Get its adjacent tet (inside the hull). + searchtet->ver = 3; + fsymself(*searchtet); + } + + // Let searchtet be the face such that 'searchpt' lies above to it. + for (searchtet->ver = 0; searchtet->ver < 4; searchtet->ver++) { + torg = org(*searchtet); + tdest = dest(*searchtet); + tapex = apex(*searchtet); + ori = orient3d(torg, tdest, tapex, searchpt); + if (ori < 0.0) break; + } + if (searchtet->ver == 4) { + terminatetetgen(this, 2); + } + + // Walk through tetrahedra to locate the point. + while (true) { + + toppo = oppo(*searchtet); + + // Check if the vertex is we seek. + if (toppo == searchpt) { + // Adjust the origin of searchtet to be searchpt. + esymself(*searchtet); + eprevself(*searchtet); + loc = ONVERTEX; // return ONVERTEX; + break; + } + + // We enter from one of serarchtet's faces, which face do we exit? + oriorg = orient3d(tdest, tapex, toppo, searchpt); + oridest = orient3d(tapex, torg, toppo, searchpt); + oriapex = orient3d(torg, tdest, toppo, searchpt); + + // Now decide which face to move. It is possible there are more than one + // faces are viable moves. If so, randomly choose one. + if (oriorg < 0) { + if (oridest < 0) { + if (oriapex < 0) { + // All three faces are possible. + s = randomnation(3); // 's' is in {0,1,2}. + if (s == 0) { + nextmove = ORGMOVE; + } else if (s == 1) { + nextmove = DESTMOVE; + } else { + nextmove = APEXMOVE; + } + } else { + // Two faces, opposite to origin and destination, are viable. + //s = randomnation(2); // 's' is in {0,1}. + if (randomnation(2)) { + nextmove = ORGMOVE; + } else { + nextmove = DESTMOVE; + } + } + } else { + if (oriapex < 0) { + // Two faces, opposite to origin and apex, are viable. + //s = randomnation(2); // 's' is in {0,1}. + if (randomnation(2)) { + nextmove = ORGMOVE; + } else { + nextmove = APEXMOVE; + } + } else { + // Only the face opposite to origin is viable. + nextmove = ORGMOVE; + } + } + } else { + if (oridest < 0) { + if (oriapex < 0) { + // Two faces, opposite to destination and apex, are viable. + //s = randomnation(2); // 's' is in {0,1}. + if (randomnation(2)) { + nextmove = DESTMOVE; + } else { + nextmove = APEXMOVE; + } + } else { + // Only the face opposite to destination is viable. + nextmove = DESTMOVE; + } + } else { + if (oriapex < 0) { + // Only the face opposite to apex is viable. + nextmove = APEXMOVE; + } else { + // The point we seek must be on the boundary of or inside this + // tetrahedron. Check for boundary cases. + if (oriorg == 0) { + // Go to the face opposite to origin. + enextesymself(*searchtet); + if (oridest == 0) { + eprevself(*searchtet); // edge oppo->apex + if (oriapex == 0) { + // oppo is duplicated with p. + loc = ONVERTEX; // return ONVERTEX; + break; + } + loc = ONEDGE; // return ONEDGE; + break; + } + if (oriapex == 0) { + enextself(*searchtet); // edge dest->oppo + loc = ONEDGE; // return ONEDGE; + break; + } + loc = ONFACE; // return ONFACE; + break; + } + if (oridest == 0) { + // Go to the face opposite to destination. + eprevesymself(*searchtet); + if (oriapex == 0) { + eprevself(*searchtet); // edge oppo->org + loc = ONEDGE; // return ONEDGE; + break; + } + loc = ONFACE; // return ONFACE; + break; + } + if (oriapex == 0) { + // Go to the face opposite to apex + esymself(*searchtet); + loc = ONFACE; // return ONFACE; + break; + } + loc = INTETRAHEDRON; // return INTETRAHEDRON; + break; + } + } + } + + // Move to the selected face. + if (nextmove == ORGMOVE) { + enextesymself(*searchtet); + } else if (nextmove == DESTMOVE) { + eprevesymself(*searchtet); + } else { + esymself(*searchtet); + } + if (chkencflag) { + // Check if we are walking across a subface. + if (issubface(*searchtet)) { + loc = ENCSUBFACE; + break; + } + } + // Move to the adjacent tetrahedron (maybe a hull tetrahedron). + fsymself(*searchtet); + if (oppo(*searchtet) == dummypoint) { + loc = OUTSIDE; // return OUTSIDE; + break; + } + + // Retreat the three vertices of the base face. + torg = org(*searchtet); + tdest = dest(*searchtet); + tapex = apex(*searchtet); + + } // while (true) + + return loc; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// flippush() Push a face (possibly will be flipped) into flipstack. // +// // +// The face is marked. The flag is used to check the validity of the face on // +// its popup. Some other flips may change it already. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::flippush(badface*& fstack, triface* flipface) +{ + if (!facemarked(*flipface)) { + badface *newflipface = (badface *) flippool->alloc(); + newflipface->tt = *flipface; + markface(newflipface->tt); + // Push this face into stack. + newflipface->nextitem = fstack; + fstack = newflipface; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// incrementalflip() Incrementally flipping to construct DT. // +// // +// Faces need to be checked for flipping are already queued in 'flipstack'. // +// Return the total number of performed flips. // +// // +// Comment: This routine should be only used in the incremental Delaunay // +// construction. In other cases, lawsonflip3d() should be used. // +// // +// If the new point lies outside of the convex hull ('hullflag' is set). The // +// incremental flip algorithm still works as usual. However, we must ensure // +// that every flip (2-to-3 or 3-to-2) does not create a duplicated (existing)// +// edge or face. Otherwise, the underlying space of the triangulation becomes// +// non-manifold and it is not possible to flip further. // +// Thanks to Joerg Rambau and Frank Lutz for helping in this issue. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::incrementalflip(point newpt, int hullflag, flipconstraints *fc) +{ + badface *popface; + triface fliptets[5], *parytet; + point *pts, *parypt, pe; + REAL sign, ori; + int flipcount = 0; + int t1ver; + int i; + + if (b->verbose > 2) { + printf(" Lawson flip (%ld faces).\n", flippool->items); + } + + if (hullflag) { + // 'newpt' lies in the outside of the convex hull. + // Mark all hull vertices which are connecting to it. + popface = flipstack; + while (popface != NULL) { + pts = (point *) popface->tt.tet; + for (i = 4; i < 8; i++) { + if ((pts[i] != newpt) && (pts[i] != dummypoint)) { + if (!pinfected(pts[i])) { + pinfect(pts[i]); + cavetetvertlist->newindex((void **) &parypt); + *parypt = pts[i]; + } + } + } + popface = popface->nextitem; + } + } + + // Loop until the queue is empty. + while (flipstack != NULL) { + + // Pop a face from the stack. + popface = flipstack; + fliptets[0] = popface->tt; + flipstack = flipstack->nextitem; // The next top item in stack. + flippool->dealloc((void *) popface); + + // Skip it if it is a dead tet (destroyed by previous flips). + if (isdeadtet(fliptets[0])) continue; + // Skip it if it is not the same tet as we saved. + if (!facemarked(fliptets[0])) continue; + + unmarkface(fliptets[0]); + + if ((point) fliptets[0].tet[7] == dummypoint) { + // It must be a hull edge. + fliptets[0].ver = epivot[fliptets[0].ver]; + // A hull edge. The current convex hull may be enlarged. + fsym(fliptets[0], fliptets[1]); + pts = (point *) fliptets[1].tet; + ori = orient3d(pts[4], pts[5], pts[6], newpt); + if (ori < 0) { + // Visible. The convex hull will be enlarged. + // Decide which flip (2-to-3, 3-to-2, or 4-to-1) to use. + // Check if the tet [a,c,e,d] or [c,b,e,d] exists. + enext(fliptets[1], fliptets[2]); + eprev(fliptets[1], fliptets[3]); + fnextself(fliptets[2]); // [a,c,e,*] + fnextself(fliptets[3]); // [c,b,e,*] + if (oppo(fliptets[2]) == newpt) { + if (oppo(fliptets[3]) == newpt) { + // Both tets exist! A 4-to-1 flip is found. + terminatetetgen(this, 2); // Report a bug. + } else { + esym(fliptets[2], fliptets[0]); + fnext(fliptets[0], fliptets[1]); + fnext(fliptets[1], fliptets[2]); + // Perform a 3-to-2 flip. Replace edge [c,a] by face [d,e,b]. + // This corresponds to my standard labels, where edge [e,d] is + // repalced by face [a,b,c], and a is the new vertex. + // [0] [c,a,d,e] (d = newpt) + // [1] [c,a,e,b] (c = dummypoint) + // [2] [c,a,b,d] + flip32(fliptets, 1, fc); + } + } else { + if (oppo(fliptets[3]) == newpt) { + fnext(fliptets[3], fliptets[0]); + fnext(fliptets[0], fliptets[1]); + fnext(fliptets[1], fliptets[2]); + // Perform a 3-to-2 flip. Replace edge [c,b] by face [d,a,e]. + // [0] [c,b,d,a] (d = newpt) + // [1] [c,b,a,e] (c = dummypoint) + // [2] [c,b,e,d] + flip32(fliptets, 1, fc); + } else { + if (hullflag) { + // Reject this flip if pe is already marked. + pe = oppo(fliptets[1]); + if (!pinfected(pe)) { + pinfect(pe); + cavetetvertlist->newindex((void **) &parypt); + *parypt = pe; + // Perform a 2-to-3 flip. + flip23(fliptets, 1, fc); + } else { + // Reject this flip. + flipcount--; + } + } else { + // Perform a 2-to-3 flip. Replace face [a,b,c] by edge [e,d]. + // [0] [a,b,c,d], d = newpt. + // [1] [b,a,c,e], c = dummypoint. + flip23(fliptets, 1, fc); + } + } + } + flipcount++; + } + continue; + } // if (dummypoint) + + fsym(fliptets[0], fliptets[1]); + if ((point) fliptets[1].tet[7] == dummypoint) { + // A hull face is locally Delaunay. + continue; + } + // Check if the adjacent tet has already been tested. + if (marktested(fliptets[1])) { + // It has been tested and it is Delaunay. + continue; + } + + // Test whether the face is locally Delaunay or not. + pts = (point *) fliptets[1].tet; + if (b->weighted) { + sign = orient4d_s(pts[4], pts[5], pts[6], pts[7], newpt, + pts[4][3], pts[5][3], pts[6][3], pts[7][3], + newpt[3]); + } else { + sign = insphere_s(pts[4], pts[5], pts[6], pts[7], newpt); + } + + + if (sign < 0) { + point pd = newpt; + point pe = oppo(fliptets[1]); + // Check the convexity of its three edges. Stop checking either a + // locally non-convex edge (ori < 0) or a flat edge (ori = 0) is + // encountered, and 'fliptet' represents that edge. + for (i = 0; i < 3; i++) { + ori = orient3d(org(fliptets[0]), dest(fliptets[0]), pd, pe); + if (ori <= 0) break; + enextself(fliptets[0]); + } + if (ori > 0) { + // A 2-to-3 flip is found. + // [0] [a,b,c,d], + // [1] [b,a,c,e]. no dummypoint. + flip23(fliptets, 0, fc); + flipcount++; + } else { // ori <= 0 + // The edge ('fliptets[0]' = [a',b',c',d]) is non-convex or flat, + // where the edge [a',b'] is one of [a,b], [b,c], and [c,a]. + // Check if there are three or four tets sharing at this edge. + esymself(fliptets[0]); // [b,a,d,c] + for (i = 0; i < 3; i++) { + fnext(fliptets[i], fliptets[i+1]); + } + if (fliptets[3].tet == fliptets[0].tet) { + // A 3-to-2 flip is found. (No hull tet.) + flip32(fliptets, 0, fc); + flipcount++; + } else { + // There are more than 3 tets at this edge. + fnext(fliptets[3], fliptets[4]); + if (fliptets[4].tet == fliptets[0].tet) { + if (ori == 0) { + // A 4-to-4 flip is found. (Two hull tets may be involved.) + // Current tets in 'fliptets': + // [0] [b,a,d,c] (d may be newpt) + // [1] [b,a,c,e] + // [2] [b,a,e,f] (f may be dummypoint) + // [3] [b,a,f,d] + esymself(fliptets[0]); // [a,b,c,d] + // A 2-to-3 flip replaces face [a,b,c] by edge [e,d]. + // This creates a degenerate tet [e,d,a,b] (tmpfliptets[0]). + // It will be removed by the followed 3-to-2 flip. + flip23(fliptets, 0, fc); // No hull tet. + fnext(fliptets[3], fliptets[1]); + fnext(fliptets[1], fliptets[2]); + // Current tets in 'fliptets': + // [0] [...] + // [1] [b,a,d,e] (degenerated, d may be new point). + // [2] [b,a,e,f] (f may be dummypoint) + // [3] [b,a,f,d] + // A 3-to-2 flip replaces edge [b,a] by face [d,e,f]. + // Hull tets may be involved (f may be dummypoint). + flip32(&(fliptets[1]), (apex(fliptets[3]) == dummypoint), fc); + flipcount++; + } + } + } + } // ori + } else { + // The adjacent tet is Delaunay. Mark it to avoid testing it again. + marktest(fliptets[1]); + // Save it for unmarking it later. + cavebdrylist->newindex((void **) &parytet); + *parytet = fliptets[1]; + } + + } // while (flipstack) + + // Unmark saved tetrahedra. + for (i = 0; i < cavebdrylist->objects; i++) { + parytet = (triface *) fastlookup(cavebdrylist, i); + unmarktest(*parytet); + } + cavebdrylist->restart(); + + if (hullflag) { + // Unmark infected vertices. + for (i = 0; i < cavetetvertlist->objects; i++) { + parypt = (point *) fastlookup(cavetetvertlist, i); + puninfect(*parypt); + } + cavetetvertlist->restart(); + } + + + return flipcount; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// initialdelaunay() Create an initial Delaunay tetrahedralization. // +// // +// The tetrahedralization contains only one tetrahedron abcd, and four hull // +// tetrahedra. The points pa, pb, pc, and pd must be linearly independent. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::initialdelaunay(point pa, point pb, point pc, point pd) +{ + triface firsttet, tetopa, tetopb, tetopc, tetopd; + triface worktet, worktet1; + + if (b->verbose > 2) { + printf(" Create init tet (%d, %d, %d, %d)\n", pointmark(pa), + pointmark(pb), pointmark(pc), pointmark(pd)); + } + + // Create the first tetrahedron. + maketetrahedron(&firsttet); + setvertices(firsttet, pa, pb, pc, pd); + // Create four hull tetrahedra. + maketetrahedron(&tetopa); + setvertices(tetopa, pb, pc, pd, dummypoint); + maketetrahedron(&tetopb); + setvertices(tetopb, pc, pa, pd, dummypoint); + maketetrahedron(&tetopc); + setvertices(tetopc, pa, pb, pd, dummypoint); + maketetrahedron(&tetopd); + setvertices(tetopd, pb, pa, pc, dummypoint); + hullsize += 4; + + // Connect hull tetrahedra to firsttet (at four faces of firsttet). + bond(firsttet, tetopd); + esym(firsttet, worktet); + bond(worktet, tetopc); // ab + enextesym(firsttet, worktet); + bond(worktet, tetopa); // bc + eprevesym(firsttet, worktet); + bond(worktet, tetopb); // ca + + // Connect hull tetrahedra together (at six edges of firsttet). + esym(tetopc, worktet); + esym(tetopd, worktet1); + bond(worktet, worktet1); // ab + esym(tetopa, worktet); + eprevesym(tetopd, worktet1); + bond(worktet, worktet1); // bc + esym(tetopb, worktet); + enextesym(tetopd, worktet1); + bond(worktet, worktet1); // ca + eprevesym(tetopc, worktet); + enextesym(tetopb, worktet1); + bond(worktet, worktet1); // da + eprevesym(tetopa, worktet); + enextesym(tetopc, worktet1); + bond(worktet, worktet1); // db + eprevesym(tetopb, worktet); + enextesym(tetopa, worktet1); + bond(worktet, worktet1); // dc + + // Set the vertex type. + if (pointtype(pa) == UNUSEDVERTEX) { + setpointtype(pa, VOLVERTEX); + } + if (pointtype(pb) == UNUSEDVERTEX) { + setpointtype(pb, VOLVERTEX); + } + if (pointtype(pc) == UNUSEDVERTEX) { + setpointtype(pc, VOLVERTEX); + } + if (pointtype(pd) == UNUSEDVERTEX) { + setpointtype(pd, VOLVERTEX); + } + + setpoint2tet(pa, encode(firsttet)); + setpoint2tet(pb, encode(firsttet)); + setpoint2tet(pc, encode(firsttet)); + setpoint2tet(pd, encode(firsttet)); + + // Remember the first tetrahedron. + recenttet = firsttet; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// incrementaldelaunay() Create a Delaunay tetrahedralization by // +// the incremental approach. // +// // +/////////////////////////////////////////////////////////////////////////////// + + +void tetgenmesh::incrementaldelaunay(clock_t& tv) +{ + triface searchtet; + point *permutarray, swapvertex; + REAL v1[3], v2[3], n[3]; + REAL bboxsize, bboxsize2, bboxsize3, ori; + int randindex; + int ngroup = 0; + int i, j; + + if (!b->quiet) { + printf("Delaunizing vertices...\n"); + } + + // Form a random permuation (uniformly at random) of the set of vertices. + permutarray = new point[in->numberofpoints]; + points->traversalinit(); + + if (b->no_sort) { + if (b->verbose) { + printf(" Using the input order.\n"); + } + for (i = 0; i < in->numberofpoints; i++) { + permutarray[i] = (point) points->traverse(); + } + } else { + if (b->verbose) { + printf(" Permuting vertices.\n"); + } + srand(in->numberofpoints); + for (i = 0; i < in->numberofpoints; i++) { + randindex = rand() % (i + 1); // randomnation(i + 1); + permutarray[i] = permutarray[randindex]; + permutarray[randindex] = (point) points->traverse(); + } + if (b->brio_hilbert) { // -b option + if (b->verbose) { + printf(" Sorting vertices.\n"); + } + hilbert_init(in->mesh_dim); + brio_multiscale_sort(permutarray, in->numberofpoints, b->brio_threshold, + b->brio_ratio, &ngroup); + } + } + + tv = clock(); // Remember the time for sorting points. + + // Calculate the diagonal size of its bounding box. + bboxsize = sqrt(norm2(xmax - xmin, ymax - ymin, zmax - zmin)); + bboxsize2 = bboxsize * bboxsize; + bboxsize3 = bboxsize2 * bboxsize; + + // Make sure the second vertex is not identical with the first one. + i = 1; + while ((distance(permutarray[0],permutarray[i])/bboxsize)epsilon) { + i++; + if (i == in->numberofpoints - 1) { + printf("Exception: All vertices are (nearly) identical (Tol = %g).\n", + b->epsilon); + terminatetetgen(this, 10); + } + } + if (i > 1) { + // Swap to move the non-identical vertex from index i to index 1. + swapvertex = permutarray[i]; + permutarray[i] = permutarray[1]; + permutarray[1] = swapvertex; + } + + // Make sure the third vertex is not collinear with the first two. + // Acknowledgement: Thanks Jan Pomplun for his correction by using + // epsilon^2 and epsilon^3 (instead of epsilon). 2013-08-15. + i = 2; + for (j = 0; j < 3; j++) { + v1[j] = permutarray[1][j] - permutarray[0][j]; + v2[j] = permutarray[i][j] - permutarray[0][j]; + } + cross(v1, v2, n); + while ((sqrt(norm2(n[0], n[1], n[2])) / bboxsize2) < b->epsilon) { + i++; + if (i == in->numberofpoints - 1) { + printf("Exception: All vertices are (nearly) collinear (Tol = %g).\n", + b->epsilon); + terminatetetgen(this, 10); + } + for (j = 0; j < 3; j++) { + v2[j] = permutarray[i][j] - permutarray[0][j]; + } + cross(v1, v2, n); + } + if (i > 2) { + // Swap to move the non-identical vertex from index i to index 1. + swapvertex = permutarray[i]; + permutarray[i] = permutarray[2]; + permutarray[2] = swapvertex; + } + + // Make sure the fourth vertex is not coplanar with the first three. + i = 3; + ori = orient3dfast(permutarray[0], permutarray[1], permutarray[2], + permutarray[i]); + while ((fabs(ori) / bboxsize3) < b->epsilon) { + i++; + if (i == in->numberofpoints) { + printf("Exception: All vertices are coplanar (Tol = %g).\n", + b->epsilon); + terminatetetgen(this, 10); + } + ori = orient3dfast(permutarray[0], permutarray[1], permutarray[2], + permutarray[i]); + } + if (i > 3) { + // Swap to move the non-identical vertex from index i to index 1. + swapvertex = permutarray[i]; + permutarray[i] = permutarray[3]; + permutarray[3] = swapvertex; + } + + // Orient the first four vertices in permutarray so that they follow the + // right-hand rule. + if (ori > 0.0) { + // Swap the first two vertices. + swapvertex = permutarray[0]; + permutarray[0] = permutarray[1]; + permutarray[1] = swapvertex; + } + + // Create the initial Delaunay tetrahedralization. + initialdelaunay(permutarray[0], permutarray[1], permutarray[2], + permutarray[3]); + + if (b->verbose) { + printf(" Incrementally inserting vertices.\n"); + } + insertvertexflags ivf; + flipconstraints fc; + + // Choose algorithm: Bowyer-Watson (default) or Incremental Flip + if (b->incrflip) { + ivf.bowywat = 0; + ivf.lawson = 1; + fc.enqflag = 1; + } else { + ivf.bowywat = 1; + ivf.lawson = 0; + } + + + for (i = 4; i < in->numberofpoints; i++) { + if (pointtype(permutarray[i]) == UNUSEDVERTEX) { + setpointtype(permutarray[i], VOLVERTEX); + } + if (b->brio_hilbert || b->no_sort) { // -b or -b/1 + // Start the last updated tet. + searchtet.tet = recenttet.tet; + } else { // -b0 + // Randomly choose the starting tet for point location. + searchtet.tet = NULL; + } + ivf.iloc = (int) OUTSIDE; + // Insert the vertex. + if (insertpoint(permutarray[i], &searchtet, NULL, NULL, &ivf)) { + if (flipstack != NULL) { + // Perform flip to recover Delaunayness. + incrementalflip(permutarray[i], (ivf.iloc == (int) OUTSIDE), &fc); + } + } else { + if (ivf.iloc == (int) ONVERTEX) { + // The point already exists. Mark it and do nothing on it. + swapvertex = org(searchtet); + if (b->object != tetgenbehavior::STL) { + if (!b->quiet) { + printf("Warning: Point #%d is coincident with #%d. Ignored!\n", + pointmark(permutarray[i]), pointmark(swapvertex)); + } + } + setpoint2ppt(permutarray[i], swapvertex); + setpointtype(permutarray[i], DUPLICATEDVERTEX); + dupverts++; + } else if (ivf.iloc == (int) NEARVERTEX) { + swapvertex = org(searchtet); + if (!b->quiet) { + printf("Warning: Point %d is replaced by point %d.\n", + pointmark(permutarray[i]), pointmark(swapvertex)); + printf(" Avoid creating a very short edge (len = %g) (< %g).\n", + permutarray[i][3], minedgelength); + printf(" You may try a smaller tolerance (-T) (current is %g)\n", + b->epsilon); + printf(" or use the option -M0/1 to avoid such replacement.\n"); + } + // Remember it is a duplicated point. + setpoint2ppt(permutarray[i], swapvertex); + setpointtype(permutarray[i], DUPLICATEDVERTEX); + dupverts++; + } else if (ivf.iloc == (int) NONREGULAR) { + // The point is non-regular. Skipped. + if (b->verbose) { + printf(" Point #%d is non-regular, skipped.\n", + pointmark(permutarray[i])); + } + setpointtype(permutarray[i], NREGULARVERTEX); + nonregularcount++; + } + } + } + + + + delete [] permutarray; +} + +//// //// +//// //// +//// delaunay_cxx ///////////////////////////////////////////////////////////// + +//// surface_cxx ////////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// flipshpush() Push a facet edge into flip stack. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::flipshpush(face* flipedge) +{ + badface *newflipface; + + newflipface = (badface *) flippool->alloc(); + newflipface->ss = *flipedge; + newflipface->forg = sorg(*flipedge); + newflipface->fdest = sdest(*flipedge); + newflipface->nextitem = flipstack; + flipstack = newflipface; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// flip22() Perform a 2-to-2 flip in surface mesh. // +// // +// 'flipfaces' is an array of two subfaces. On input, they are [a,b,c] and // +// [b,a,d]. On output, they are [c,d,b] and [d,c,a]. As a result, edge [a,b] // +// is replaced by edge [c,d]. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::flip22(face* flipfaces, int flipflag, int chkencflag) +{ + face bdedges[4], outfaces[4], infaces[4]; + face bdsegs[4]; + face checkface; + point pa, pb, pc, pd; + int i; + + pa = sorg(flipfaces[0]); + pb = sdest(flipfaces[0]); + pc = sapex(flipfaces[0]); + pd = sapex(flipfaces[1]); + + if (sorg(flipfaces[1]) != pb) { + sesymself(flipfaces[1]); + } + + flip22count++; + + // Collect the four boundary edges. + senext(flipfaces[0], bdedges[0]); + senext2(flipfaces[0], bdedges[1]); + senext(flipfaces[1], bdedges[2]); + senext2(flipfaces[1], bdedges[3]); + + // Collect outer boundary faces. + for (i = 0; i < 4; i++) { + spivot(bdedges[i], outfaces[i]); + infaces[i] = outfaces[i]; + sspivot(bdedges[i], bdsegs[i]); + if (outfaces[i].sh != NULL) { + if (isshsubseg(bdedges[i])) { + spivot(infaces[i], checkface); + while (checkface.sh != bdedges[i].sh) { + infaces[i] = checkface; + spivot(infaces[i], checkface); + } + } + } + } + + // The flags set in these two subfaces do not change. + // Shellmark does not change. + // area constraint does not change. + + // Transform [a,b,c] -> [c,d,b]. + setshvertices(flipfaces[0], pc, pd, pb); + // Transform [b,a,d] -> [d,c,a]. + setshvertices(flipfaces[1], pd, pc, pa); + + // Update the point-to-subface map. + if (pointtype(pa) == FREEFACETVERTEX) { + setpoint2sh(pa, sencode(flipfaces[1])); + } + if (pointtype(pb) == FREEFACETVERTEX) { + setpoint2sh(pb, sencode(flipfaces[0])); + } + if (pointtype(pc) == FREEFACETVERTEX) { + setpoint2sh(pc, sencode(flipfaces[0])); + } + if (pointtype(pd) == FREEFACETVERTEX) { + setpoint2sh(pd, sencode(flipfaces[0])); + } + + // Reconnect boundary edges to outer boundary faces. + for (i = 0; i < 4; i++) { + if (outfaces[(3 + i) % 4].sh != NULL) { + // Make sure that the subface has the ori as the segment. + if (bdsegs[(3 + i) % 4].sh != NULL) { + bdsegs[(3 + i) % 4].shver = 0; + if (sorg(bdedges[i]) != sorg(bdsegs[(3 + i) % 4])) { + sesymself(bdedges[i]); + } + } + sbond1(bdedges[i], outfaces[(3 + i) % 4]); + sbond1(infaces[(3 + i) % 4], bdedges[i]); + } else { + sdissolve(bdedges[i]); + } + if (bdsegs[(3 + i) % 4].sh != NULL) { + ssbond(bdedges[i], bdsegs[(3 + i) % 4]); + if (chkencflag & 1) { + // Queue this segment for encroaching check. + enqueuesubface(badsubsegs, &(bdsegs[(3 + i) % 4])); + } + } else { + ssdissolve(bdedges[i]); + } + } + + if (chkencflag & 2) { + // Queue the flipped subfaces for quality/encroaching checks. + for (i = 0; i < 2; i++) { + enqueuesubface(badsubfacs, &(flipfaces[i])); + } + } + + recentsh = flipfaces[0]; + + if (flipflag) { + // Put the boundary edges into flip stack. + for (i = 0; i < 4; i++) { + flipshpush(&(bdedges[i])); + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// flip31() Remove a vertex by transforming 3-to-1 subfaces. // +// // +// 'flipfaces' is an array of subfaces. Its length is at least 4. On input, // +// the first three faces are: [p,a,b], [p,b,c], and [p,c,a]. This routine // +// replaces them by one face [a,b,c], it is returned in flipfaces[3]. // +// // +// NOTE: The three old subfaces are not deleted within this routine. They // +// still hold pointers to their adjacent subfaces. These informations are // +// needed by the routine 'sremovevertex()' for recovering a segment. // +// The caller of this routine must delete the old subfaces after their uses. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::flip31(face* flipfaces, int flipflag) +{ + face bdedges[3], outfaces[3], infaces[3]; + face bdsegs[3]; + face checkface; + point pa, pb, pc; + int i; + + pa = sdest(flipfaces[0]); + pb = sdest(flipfaces[1]); + pc = sdest(flipfaces[2]); + + flip31count++; + + // Collect all infos at the three boundary edges. + for (i = 0; i < 3; i++) { + senext(flipfaces[i], bdedges[i]); + spivot(bdedges[i], outfaces[i]); + infaces[i] = outfaces[i]; + sspivot(bdedges[i], bdsegs[i]); + if (outfaces[i].sh != NULL) { + if (isshsubseg(bdedges[i])) { + spivot(infaces[i], checkface); + while (checkface.sh != bdedges[i].sh) { + infaces[i] = checkface; + spivot(infaces[i], checkface); + } + } + } + } // i + + // Create a new subface. + makeshellface(subfaces, &(flipfaces[3])); + setshvertices(flipfaces[3], pa, pb,pc); + setshellmark(flipfaces[3], shellmark(flipfaces[0])); + if (checkconstraints) { + //area = areabound(flipfaces[0]); + setareabound(flipfaces[3], areabound(flipfaces[0])); + } + if (useinsertradius) { + setfacetindex(flipfaces[3], getfacetindex(flipfaces[0])); + } + + // Update the point-to-subface map. + if (pointtype(pa) == FREEFACETVERTEX) { + setpoint2sh(pa, sencode(flipfaces[3])); + } + if (pointtype(pb) == FREEFACETVERTEX) { + setpoint2sh(pb, sencode(flipfaces[3])); + } + if (pointtype(pc) == FREEFACETVERTEX) { + setpoint2sh(pc, sencode(flipfaces[3])); + } + + // Update the three new boundary edges. + bdedges[0] = flipfaces[3]; // [a,b] + senext(flipfaces[3], bdedges[1]); // [b,c] + senext2(flipfaces[3], bdedges[2]); // [c,a] + + // Reconnect boundary edges to outer boundary faces. + for (i = 0; i < 3; i++) { + if (outfaces[i].sh != NULL) { + // Make sure that the subface has the ori as the segment. + if (bdsegs[i].sh != NULL) { + bdsegs[i].shver = 0; + if (sorg(bdedges[i]) != sorg(bdsegs[i])) { + sesymself(bdedges[i]); + } + } + sbond1(bdedges[i], outfaces[i]); + sbond1(infaces[i], bdedges[i]); + } + if (bdsegs[i].sh != NULL) { + ssbond(bdedges[i], bdsegs[i]); + } + } + + recentsh = flipfaces[3]; + + if (flipflag) { + // Put the boundary edges into flip stack. + for (i = 0; i < 3; i++) { + flipshpush(&(bdedges[i])); + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// lawsonflip() Flip non-locally Delaunay edges. // +// // +/////////////////////////////////////////////////////////////////////////////// + +long tetgenmesh::lawsonflip() +{ + badface *popface; + face flipfaces[2]; + point pa, pb, pc, pd; + REAL sign; + long flipcount = 0; + + if (b->verbose > 2) { + printf(" Lawson flip %ld edges.\n", flippool->items); + } + + while (flipstack != (badface *) NULL) { + + // Pop an edge from the stack. + popface = flipstack; + flipfaces[0] = popface->ss; + pa = popface->forg; + pb = popface->fdest; + flipstack = popface->nextitem; // The next top item in stack. + flippool->dealloc((void *) popface); + + // Skip it if it is dead. + if (flipfaces[0].sh[3] == NULL) continue; + // Skip it if it is not the same edge as we saved. + if ((sorg(flipfaces[0]) != pa) || (sdest(flipfaces[0]) != pb)) continue; + // Skip it if it is a subsegment. + if (isshsubseg(flipfaces[0])) continue; + + // Get the adjacent face. + spivot(flipfaces[0], flipfaces[1]); + if (flipfaces[1].sh == NULL) continue; // Skip a hull edge. + pc = sapex(flipfaces[0]); + pd = sapex(flipfaces[1]); + + sign = incircle3d(pa, pb, pc, pd); + + if (sign < 0) { + // It is non-locally Delaunay. Flip it. + flip22(flipfaces, 1, 0); + flipcount++; + } + } + + if (b->verbose > 2) { + printf(" Performed %ld flips.\n", flipcount); + } + + return flipcount; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// sinsertvertex() Insert a vertex into a triangulation of a facet. // +// // +// This function uses three global arrays: 'caveshlist', 'caveshbdlist', and // +// 'caveshseglist'. On return, 'caveshlist' contains old subfaces in C(p), // +// 'caveshbdlist' contains new subfaces in C(p). If the new point lies on a // +// segment, 'cavesegshlist' returns the two new subsegments. // +// // +// 'iloc' suggests the location of the point. If it is OUTSIDE, this routine // +// will first locate the point. It starts searching from 'searchsh' or 'rec- // +// entsh' if 'searchsh' is NULL. // +// // +// If 'bowywat' is set (1), the Bowyer-Watson algorithm is used to insert // +// the vertex. Otherwise, only insert the vertex in the initial cavity. // +// // +// If 'iloc' is 'INSTAR', this means the cavity of this vertex was already // +// provided in the list 'caveshlist'. // +// // +// If 'splitseg' is not NULL, the new vertex lies on the segment and it will // +// be split. 'iloc' must be either 'ONEDGE' or 'INSTAR'. // +// // +// 'rflag' (rounding) is a parameter passed to slocate() function. If it is // +// set, after the location of the point is found, either ONEDGE or ONFACE, // +// round the result using an epsilon. // +// // +// NOTE: the old subfaces in C(p) are not deleted. They're needed in case we // +// want to remove the new point immediately. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::sinsertvertex(point insertpt, face *searchsh, face *splitseg, + int iloc, int bowywat, int rflag) +{ + face cavesh, neighsh, *parysh; + face newsh, casout, casin; + face checkseg; + point pa, pb; + enum locateresult loc = OUTSIDE; + REAL sign, ori; + int i, j; + + if (b->verbose > 2) { + printf(" Insert facet point %d.\n", pointmark(insertpt)); + } + + if (bowywat == 3) { + loc = INSTAR; + } + + if ((splitseg != NULL) && (splitseg->sh != NULL)) { + // A segment is going to be split, no point location. + spivot(*splitseg, *searchsh); + if (loc != INSTAR) loc = ONEDGE; + } else { + if (loc != INSTAR) loc = (enum locateresult) iloc; + if (loc == OUTSIDE) { + // Do point location in surface mesh. + if (searchsh->sh == NULL) { + *searchsh = recentsh; + } + // Search the vertex. An above point must be provided ('aflag' = 1). + loc = slocate(insertpt, searchsh, 1, 1, rflag); + } + } + + + // Form the initial sC(p). + if (loc == ONFACE) { + // Add the face into list (in B-W cavity). + smarktest(*searchsh); + caveshlist->newindex((void **) &parysh); + *parysh = *searchsh; + } else if (loc == ONEDGE) { + if ((splitseg != NULL) && (splitseg->sh != NULL)) { + splitseg->shver = 0; + pa = sorg(*splitseg); + } else { + pa = sorg(*searchsh); + } + if (searchsh->sh != NULL) { + // Collect all subfaces share at this edge. + neighsh = *searchsh; + while (1) { + // Adjust the origin of its edge to be 'pa'. + if (sorg(neighsh) != pa) sesymself(neighsh); + // Add this face into list (in B-W cavity). + smarktest(neighsh); + caveshlist->newindex((void **) &parysh); + *parysh = neighsh; + // Add this face into face-at-splitedge list. + cavesegshlist->newindex((void **) &parysh); + *parysh = neighsh; + // Go to the next face at the edge. + spivotself(neighsh); + // Stop if all faces at the edge have been visited. + if (neighsh.sh == searchsh->sh) break; + if (neighsh.sh == NULL) break; + } + } // If (not a non-dangling segment). + } else if (loc == ONVERTEX) { + return (int) loc; + } else if (loc == OUTSIDE) { + // Comment: This should only happen during the surface meshing step. + // Enlarge the convex hull of the triangulation by including p. + // An above point of the facet is set in 'dummypoint' to replace + // orient2d tests by orient3d tests. + // Imagine that the current edge a->b (in 'searchsh') is horizontal in a + // plane, and a->b is directed from left to right, p lies above a->b. + // Find the right-most edge of the triangulation which is visible by p. + neighsh = *searchsh; + while (1) { + senext2self(neighsh); + spivot(neighsh, casout); + if (casout.sh == NULL) { + // A convex hull edge. Is it visible by p. + ori = orient3d(sorg(neighsh), sdest(neighsh), dummypoint, insertpt); + if (ori < 0) { + *searchsh = neighsh; // Visible, update 'searchsh'. + } else { + break; // 'searchsh' is the right-most visible edge. + } + } else { + if (sorg(casout) != sdest(neighsh)) sesymself(casout); + neighsh = casout; + } + } + // Create new triangles for all visible edges of p (from right to left). + casin.sh = NULL; // No adjacent face at right. + pa = sorg(*searchsh); + pb = sdest(*searchsh); + while (1) { + // Create a new subface on top of the (visible) edge. + makeshellface(subfaces, &newsh); + setshvertices(newsh, pb, pa, insertpt); + setshellmark(newsh, shellmark(*searchsh)); + if (checkconstraints) { + //area = areabound(*searchsh); + setareabound(newsh, areabound(*searchsh)); + } + if (useinsertradius) { + setfacetindex(newsh, getfacetindex(*searchsh)); + } + // Connect the new subface to the bottom subfaces. + sbond1(newsh, *searchsh); + sbond1(*searchsh, newsh); + // Connect the new subface to its right-adjacent subface. + if (casin.sh != NULL) { + senext(newsh, casout); + sbond1(casout, casin); + sbond1(casin, casout); + } + // The left-adjacent subface has not been created yet. + senext2(newsh, casin); + // Add the new face into list (inside the B-W cavity). + smarktest(newsh); + caveshlist->newindex((void **) &parysh); + *parysh = newsh; + // Move to the convex hull edge at the left of 'searchsh'. + neighsh = *searchsh; + while (1) { + senextself(neighsh); + spivot(neighsh, casout); + if (casout.sh == NULL) { + *searchsh = neighsh; + break; + } + if (sorg(casout) != sdest(neighsh)) sesymself(casout); + neighsh = casout; + } + // A convex hull edge. Is it visible by p. + pa = sorg(*searchsh); + pb = sdest(*searchsh); + ori = orient3d(pa, pb, dummypoint, insertpt); + // Finish the process if p is not visible by the hull edge. + if (ori >= 0) break; + } + } else if (loc == INSTAR) { + // Under this case, the sub-cavity sC(p) has already been formed in + // insertvertex(). + } + + // Form the Bowyer-Watson cavity sC(p). + for (i = 0; i < caveshlist->objects; i++) { + cavesh = * (face *) fastlookup(caveshlist, i); + for (j = 0; j < 3; j++) { + if (!isshsubseg(cavesh)) { + spivot(cavesh, neighsh); + if (neighsh.sh != NULL) { + // The adjacent face exists. + if (!smarktested(neighsh)) { + if (bowywat) { + if (loc == INSTAR) { // if (bowywat > 2) { + // It must be a boundary edge. + sign = 1; + } else { + // Check if this subface is connected to adjacent tet(s). + if (!isshtet(neighsh)) { + // Check if the subface is non-Delaunay wrt. the new pt. + sign = incircle3d(sorg(neighsh), sdest(neighsh), + sapex(neighsh), insertpt); + } else { + // It is connected to an adjacent tet. A boundary edge. + sign = 1; + } + } + if (sign < 0) { + // Add the adjacent face in list (in B-W cavity). + smarktest(neighsh); + caveshlist->newindex((void **) &parysh); + *parysh = neighsh; + } + } else { + sign = 1; // A boundary edge. + } + } else { + sign = -1; // Not a boundary edge. + } + } else { + // No adjacent face. It is a hull edge. + if (loc == OUTSIDE) { + // It is a boundary edge if it does not contain p. + if ((sorg(cavesh) == insertpt) || (sdest(cavesh) == insertpt)) { + sign = -1; // Not a boundary edge. + } else { + sign = 1; // A boundary edge. + } + } else { + sign = 1; // A boundary edge. + } + } + } else { + // Do not across a segment. It is a boundary edge. + sign = 1; + } + if (sign >= 0) { + // Add a boundary edge. + caveshbdlist->newindex((void **) &parysh); + *parysh = cavesh; + } + senextself(cavesh); + } // j + } // i + + + // Creating new subfaces. + for (i = 0; i < caveshbdlist->objects; i++) { + parysh = (face *) fastlookup(caveshbdlist, i); + sspivot(*parysh, checkseg); + if ((parysh->shver & 01) != 0) sesymself(*parysh); + pa = sorg(*parysh); + pb = sdest(*parysh); + // Create a new subface. + makeshellface(subfaces, &newsh); + setshvertices(newsh, pa, pb, insertpt); + setshellmark(newsh, shellmark(*parysh)); + if (checkconstraints) { + //area = areabound(*parysh); + setareabound(newsh, areabound(*parysh)); + } + if (useinsertradius) { + setfacetindex(newsh, getfacetindex(*parysh)); + } + // Update the point-to-subface map. + if (pointtype(pa) == FREEFACETVERTEX) { + setpoint2sh(pa, sencode(newsh)); + } + if (pointtype(pb) == FREEFACETVERTEX) { + setpoint2sh(pb, sencode(newsh)); + } + // Connect newsh to outer subfaces. + spivot(*parysh, casout); + if (casout.sh != NULL) { + casin = casout; + if (checkseg.sh != NULL) { + // Make sure that newsh has the right ori at this segment. + checkseg.shver = 0; + if (sorg(newsh) != sorg(checkseg)) { + sesymself(newsh); + sesymself(*parysh); // This side should also be inverse. + } + spivot(casin, neighsh); + while (neighsh.sh != parysh->sh) { + casin = neighsh; + spivot(casin, neighsh); + } + } + sbond1(newsh, casout); + sbond1(casin, newsh); + } + if (checkseg.sh != NULL) { + ssbond(newsh, checkseg); + } + // Connect oldsh <== newsh (for connecting adjacent new subfaces). + // *parysh and newsh point to the same edge and the same ori. + sbond1(*parysh, newsh); + } + + if (newsh.sh != NULL) { + // Set a handle for searching. + recentsh = newsh; + } + + // Update the point-to-subface map. + if (pointtype(insertpt) == FREEFACETVERTEX) { + setpoint2sh(insertpt, sencode(newsh)); + } + + // Connect adjacent new subfaces together. + for (i = 0; i < caveshbdlist->objects; i++) { + // Get an old subface at edge [a, b]. + parysh = (face *) fastlookup(caveshbdlist, i); + spivot(*parysh, newsh); // The new subface [a, b, p]. + senextself(newsh); // At edge [b, p]. + spivot(newsh, neighsh); + if (neighsh.sh == NULL) { + // Find the adjacent new subface at edge [b, p]. + pb = sdest(*parysh); + neighsh = *parysh; + while (1) { + senextself(neighsh); + spivotself(neighsh); + if (neighsh.sh == NULL) break; + if (!smarktested(neighsh)) break; + if (sdest(neighsh) != pb) sesymself(neighsh); + } + if (neighsh.sh != NULL) { + // Now 'neighsh' is a new subface at edge [b, #]. + if (sorg(neighsh) != pb) sesymself(neighsh); + senext2self(neighsh); // Go to the open edge [p, b]. + sbond(newsh, neighsh); + } + } + spivot(*parysh, newsh); // The new subface [a, b, p]. + senext2self(newsh); // At edge [p, a]. + spivot(newsh, neighsh); + if (neighsh.sh == NULL) { + // Find the adjacent new subface at edge [p, a]. + pa = sorg(*parysh); + neighsh = *parysh; + while (1) { + senext2self(neighsh); + spivotself(neighsh); + if (neighsh.sh == NULL) break; + if (!smarktested(neighsh)) break; + if (sorg(neighsh) != pa) sesymself(neighsh); + } + if (neighsh.sh != NULL) { + // Now 'neighsh' is a new subface at edge [#, a]. + if (sdest(neighsh) != pa) sesymself(neighsh); + senextself(neighsh); // Go to the open edge [a, p]. + sbond(newsh, neighsh); + } + } + } + + if ((loc == ONEDGE) || ((splitseg != NULL) && (splitseg->sh != NULL)) + || (cavesegshlist->objects > 0l)) { + // An edge is being split. We distinguish two cases: + // (1) the edge is not on the boundary of the cavity; + // (2) the edge is on the boundary of the cavity. + // In case (2), the edge is either a segment or a hull edge. There are + // degenerated new faces in the cavity. They must be removed. + face aseg, bseg, aoutseg, boutseg; + + for (i = 0; i < cavesegshlist->objects; i++) { + // Get the saved old subface. + parysh = (face *) fastlookup(cavesegshlist, i); + // Get a possible new degenerated subface. + spivot(*parysh, cavesh); + if (sapex(cavesh) == insertpt) { + // Found a degenerated new subface, i.e., case (2). + if (cavesegshlist->objects > 1) { + // There are more than one subface share at this edge. + j = (i + 1) % (int) cavesegshlist->objects; + parysh = (face *) fastlookup(cavesegshlist, j); + spivot(*parysh, neighsh); + // Adjust cavesh and neighsh both at edge a->b, and has p as apex. + if (sorg(neighsh) != sorg(cavesh)) { + sesymself(neighsh); + } + // Connect adjacent faces at two other edges of cavesh and neighsh. + // As a result, the two degenerated new faces are squeezed from the + // new triangulation of the cavity. Note that the squeezed faces + // still hold the adjacent informations which will be used in + // re-connecting subsegments (if they exist). + for (j = 0; j < 2; j++) { + senextself(cavesh); + senextself(neighsh); + spivot(cavesh, newsh); + spivot(neighsh, casout); + sbond1(newsh, casout); // newsh <- casout. + } + } else { + // There is only one subface containing this edge [a,b]. Squeeze the + // degenerated new face [a,b,c] by disconnecting it from its two + // adjacent subfaces at edges [b,c] and [c,a]. Note that the face + // [a,b,c] still hold the connection to them. + for (j = 0; j < 2; j++) { + senextself(cavesh); + spivot(cavesh, newsh); + sdissolve(newsh); + } + } + //recentsh = newsh; + // Update the point-to-subface map. + if (pointtype(insertpt) == FREEFACETVERTEX) { + setpoint2sh(insertpt, sencode(newsh)); + } + } + } + + if ((splitseg != NULL) && (splitseg->sh != NULL)) { + if (loc != INSTAR) { // if (bowywat < 3) { + smarktest(*splitseg); // Mark it as being processed. + } + + aseg = *splitseg; + pa = sorg(*splitseg); + pb = sdest(*splitseg); + + // Insert the new point p. + makeshellface(subsegs, &aseg); + makeshellface(subsegs, &bseg); + + setshvertices(aseg, pa, insertpt, NULL); + setshvertices(bseg, insertpt, pb, NULL); + setshellmark(aseg, shellmark(*splitseg)); + setshellmark(bseg, shellmark(*splitseg)); + if (checkconstraints) { + setareabound(aseg, areabound(*splitseg)); + setareabound(bseg, areabound(*splitseg)); + } + if (useinsertradius) { + setfacetindex(aseg, getfacetindex(*splitseg)); + setfacetindex(bseg, getfacetindex(*splitseg)); + } + + // Connect [#, a]<->[a, p]. + senext2(*splitseg, boutseg); // Temporarily use boutseg. + spivotself(boutseg); + if (boutseg.sh != NULL) { + senext2(aseg, aoutseg); + sbond(boutseg, aoutseg); + } + // Connect [p, b]<->[b, #]. + senext(*splitseg, aoutseg); + spivotself(aoutseg); + if (aoutseg.sh != NULL) { + senext(bseg, boutseg); + sbond(boutseg, aoutseg); + } + // Connect [a, p] <-> [p, b]. + senext(aseg, aoutseg); + senext2(bseg, boutseg); + sbond(aoutseg, boutseg); + + // Connect subsegs [a, p] and [p, b] to adjacent new subfaces. + // Although the degenerated new faces have been squeezed. They still + // hold the connections to the actual new faces. + for (i = 0; i < cavesegshlist->objects; i++) { + parysh = (face *) fastlookup(cavesegshlist, i); + spivot(*parysh, neighsh); + // neighsh is a degenerated new face. + if (sorg(neighsh) != pa) { + sesymself(neighsh); + } + senext2(neighsh, newsh); + spivotself(newsh); // The edge [p, a] in newsh + ssbond(newsh, aseg); + senext(neighsh, newsh); + spivotself(newsh); // The edge [b, p] in newsh + ssbond(newsh, bseg); + } + + + // Let the point remember the segment it lies on. + if (pointtype(insertpt) == FREESEGVERTEX) { + setpoint2sh(insertpt, sencode(aseg)); + } + // Update the point-to-seg map. + if (pointtype(pa) == FREESEGVERTEX) { + setpoint2sh(pa, sencode(aseg)); + } + if (pointtype(pb) == FREESEGVERTEX) { + setpoint2sh(pb, sencode(bseg)); + } + } // if ((splitseg != NULL) && (splitseg->sh != NULL)) + + // Delete all degenerated new faces. + for (i = 0; i < cavesegshlist->objects; i++) { + parysh = (face *) fastlookup(cavesegshlist, i); + spivotself(*parysh); + if (sapex(*parysh) == insertpt) { + shellfacedealloc(subfaces, parysh->sh); + } + } + cavesegshlist->restart(); + + if ((splitseg != NULL) && (splitseg->sh != NULL)) { + // Return the two new subsegments (for further process). + // Re-use 'cavesegshlist'. + cavesegshlist->newindex((void **) &parysh); + *parysh = aseg; + cavesegshlist->newindex((void **) &parysh); + *parysh = bseg; + } + } // if (loc == ONEDGE) + + + return (int) loc; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// sremovevertex() Remove a vertex from the surface mesh. // +// // +// 'delpt' (p) is the vertex to be removed. If 'parentseg' is not NULL, p is // +// a segment vertex, and the origin of 'parentseg' is p. Otherwise, p is a // +// facet vertex, and the origin of 'parentsh' is p. // +// // +// Within each facet, we first use a sequence of 2-to-2 flips to flip any // +// edge at p, finally use a 3-to-1 flip to remove p. // +// // +// All new created subfaces are returned in the global array 'caveshbdlist'. // +// The new segment (when p is on segment) is returned in 'parentseg'. // +// // +// If 'lawson' > 0, the Lawson flip algorithm is used to recover Delaunay- // +// ness after p is removed. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::sremovevertex(point delpt, face* parentsh, face* parentseg, + int lawson) +{ + face flipfaces[4], spinsh, *parysh; + point pa, pb, pc, pd; + REAL ori1, ori2; + int it, i, j; + + if (parentseg != NULL) { + // 'delpt' (p) should be a Steiner point inserted in a segment [a,b], + // where 'parentseg' should be [p,b]. Find the segment [a,p]. + face startsh, neighsh, nextsh; + face abseg, prevseg, checkseg; + face adjseg1, adjseg2; + face fakesh; + senext2(*parentseg, prevseg); + spivotself(prevseg); + prevseg.shver = 0; + // Restore the original segment [a,b]. + pa = sorg(prevseg); + pb = sdest(*parentseg); + if (b->verbose > 2) { + printf(" Remove vertex %d from segment [%d, %d].\n", + pointmark(delpt), pointmark(pa), pointmark(pb)); + } + makeshellface(subsegs, &abseg); + setshvertices(abseg, pa, pb, NULL); + setshellmark(abseg, shellmark(*parentseg)); + if (checkconstraints) { + setareabound(abseg, areabound(*parentseg)); + } + if (useinsertradius) { + setfacetindex(abseg, getfacetindex(*parentseg)); + } + // Connect [#, a]<->[a, b]. + senext2(prevseg, adjseg1); + spivotself(adjseg1); + if (adjseg1.sh != NULL) { + adjseg1.shver = 0; + senextself(adjseg1); + senext2(abseg, adjseg2); + sbond(adjseg1, adjseg2); + } + // Connect [a, b]<->[b, #]. + senext(*parentseg, adjseg1); + spivotself(adjseg1); + if (adjseg1.sh != NULL) { + adjseg1.shver = 0; + senext2self(adjseg1); + senext(abseg, adjseg2); + sbond(adjseg1, adjseg2); + } + // Update the point-to-segment map. + setpoint2sh(pa, sencode(abseg)); + setpoint2sh(pb, sencode(abseg)); + + // Get the faces in face ring at segment [p, b]. + // Re-use array 'caveshlist'. + spivot(*parentseg, *parentsh); + if (parentsh->sh != NULL) { + spinsh = *parentsh; + while (1) { + // Save this face in list. + caveshlist->newindex((void **) &parysh); + *parysh = spinsh; + // Go to the next face in the ring. + spivotself(spinsh); + if (spinsh.sh == NULL) { + break; // It is possible there is only one facet. + } + if (spinsh.sh == parentsh->sh) break; + } + } + + // Create the face ring of the new segment [a,b]. Each face in the ring + // is [a,b,p] (degenerated!). It will be removed (automatically). + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + startsh = *parysh; + if (sorg(startsh) != delpt) { + sesymself(startsh); + } + // startsh is [p, b, #1], find the subface [a, p, #2]. + neighsh = startsh; + while (1) { + senext2self(neighsh); + sspivot(neighsh, checkseg); + if (checkseg.sh != NULL) { + // It must be the segment [a, p]. + break; + } + spivotself(neighsh); + if (sorg(neighsh) != delpt) sesymself(neighsh); + } + // Now neighsh is [a, p, #2]. + if (neighsh.sh != startsh.sh) { + // Detach the two subsegments [a,p] and [p,b] from subfaces. + ssdissolve(startsh); + ssdissolve(neighsh); + // Create a degenerated subface [a,b,p]. It is used to: (1) hold the + // new segment [a,b]; (2) connect to the two adjacent subfaces + // [p,b,#] and [a,p,#]. + makeshellface(subfaces, &fakesh); + setshvertices(fakesh, pa, pb, delpt); + setshellmark(fakesh, shellmark(startsh)); + // Connect fakesh to the segment [a,b]. + ssbond(fakesh, abseg); + // Connect fakesh to adjacent subfaces: [p,b,#1] and [a,p,#2]. + senext(fakesh, nextsh); + sbond(nextsh, startsh); + senext2(fakesh, nextsh); + sbond(nextsh, neighsh); + smarktest(fakesh); // Mark it as faked. + } else { + // Special case. There exists already a degenerated face [a,b,p]! + // There is no need to create a faked subface here. + senext2self(neighsh); // [a,b,p] + // Since we will re-connect the face ring using the faked subfaces. + // We put the adjacent face of [a,b,p] to the list. + spivot(neighsh, startsh); // The original adjacent subface. + if (sorg(startsh) != pa) sesymself(startsh); + sdissolve(startsh); + // Connect fakesh to the segment [a,b]. + ssbond(startsh, abseg); + fakesh = startsh; // Do not mark it! + // Delete the degenerated subface. + shellfacedealloc(subfaces, neighsh.sh); + } + // Save the fakesh in list (for re-creating the face ring). + cavesegshlist->newindex((void **) &parysh); + *parysh = fakesh; + } // i + caveshlist->restart(); + + // Re-create the face ring. + if (cavesegshlist->objects > 1) { + for (i = 0; i < cavesegshlist->objects; i++) { + parysh = (face *) fastlookup(cavesegshlist, i); + fakesh = *parysh; + // Get the next face in the ring. + j = (i + 1) % cavesegshlist->objects; + parysh = (face *) fastlookup(cavesegshlist, j); + nextsh = *parysh; + sbond1(fakesh, nextsh); + } + } + + // Delete the two subsegments containing p. + shellfacedealloc(subsegs, parentseg->sh); + shellfacedealloc(subsegs, prevseg.sh); + // Return the new segment. + *parentseg = abseg; + } else { + // p is inside the surface. + if (b->verbose > 2) { + printf(" Remove vertex %d from surface.\n", pointmark(delpt)); + } + // Let 'delpt' be its apex. + senextself(*parentsh); + // For unifying the code, we add parentsh to list. + cavesegshlist->newindex((void **) &parysh); + *parysh = *parentsh; + } + + // Remove the point (p). + + for (it = 0; it < cavesegshlist->objects; it++) { + parentsh = (face *) fastlookup(cavesegshlist, it); // [a,b,p] + senextself(*parentsh); // [b,p,a]. + spivotself(*parentsh); + if (sorg(*parentsh) != delpt) sesymself(*parentsh); + // now parentsh is [p,b,#]. + if (sorg(*parentsh) != delpt) { + // The vertex has already been removed in above special case. + continue; + } + + while (1) { + // Initialize the flip edge list. Re-use 'caveshlist'. + spinsh = *parentsh; // [p, b, #] + while (1) { + caveshlist->newindex((void **) &parysh); + *parysh = spinsh; + senext2self(spinsh); + spivotself(spinsh); + if (spinsh.sh == parentsh->sh) break; + if (sorg(spinsh) != delpt) sesymself(spinsh); + } // while (1) + + if (caveshlist->objects == 3) { + // Delete the point by a 3-to-1 flip. + for (i = 0; i < 3; i++) { + parysh = (face *) fastlookup(caveshlist, i); + flipfaces[i] = *parysh; + } + flip31(flipfaces, lawson); + for (i = 0; i < 3; i++) { + shellfacedealloc(subfaces, flipfaces[i].sh); + } + caveshlist->restart(); + // Save the new subface. + caveshbdlist->newindex((void **) &parysh); + *parysh = flipfaces[3]; + // The vertex is removed. + break; + } + + // Search an edge to flip. + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + flipfaces[0] = *parysh; + spivot(flipfaces[0], flipfaces[1]); + if (sorg(flipfaces[0]) != sdest(flipfaces[1])) + sesymself(flipfaces[1]); + // Skip this edge if it belongs to a faked subface. + if (!smarktested(flipfaces[0]) && !smarktested(flipfaces[1])) { + pa = sorg(flipfaces[0]); + pb = sdest(flipfaces[0]); + pc = sapex(flipfaces[0]); + pd = sapex(flipfaces[1]); + calculateabovepoint4(pa, pb, pc, pd); + // Check if a 2-to-2 flip is possible. + ori1 = orient3d(pc, pd, dummypoint, pa); + ori2 = orient3d(pc, pd, dummypoint, pb); + if (ori1 * ori2 < 0) { + // A 2-to-2 flip is found. + flip22(flipfaces, lawson, 0); + // The i-th edge is flipped. The i-th and (i-1)-th subfaces are + // changed. The 'flipfaces[1]' contains p as its apex. + senext2(flipfaces[1], *parentsh); + // Save the new subface. + caveshbdlist->newindex((void **) &parysh); + *parysh = flipfaces[0]; + break; + } + } // + } // i + + if (i == caveshlist->objects) { + // Do a flip22 and a flip31 to remove p. + parysh = (face *) fastlookup(caveshlist, 0); + flipfaces[0] = *parysh; + spivot(flipfaces[0], flipfaces[1]); + if (sorg(flipfaces[0]) != sdest(flipfaces[1])) { + sesymself(flipfaces[1]); + } + flip22(flipfaces, lawson, 0); + senext2(flipfaces[1], *parentsh); + // Save the new subface. + caveshbdlist->newindex((void **) &parysh); + *parysh = flipfaces[0]; + } + + // The edge list at p are changed. + caveshlist->restart(); + } // while (1) + + } // it + + cavesegshlist->restart(); + + if (b->verbose > 2) { + printf(" Created %ld new subfaces.\n", caveshbdlist->objects); + } + + + if (lawson) { + lawsonflip(); + } + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// slocate() Locate a point in a surface triangulation. // +// // +// Staring the search from 'searchsh'(it should not be NULL). Perform a line // +// walk search for a subface containing the point (p). // +// // +// If 'aflag' is set, the 'dummypoint' is pre-calculated so that it lies // +// above the 'searchsh' in its current orientation. The test if c is CCW to // +// the line a->b can be done by the test if c is below the oriented plane // +// a->b->dummypoint. // +// // +// If 'cflag' is not TRUE, the triangulation may not be convex. Stop search // +// when a segment is met and return OUTSIDE. // +// // +// If 'rflag' (rounding) is set, after the location of the point is found, // +// either ONEDGE or ONFACE, round the result using an epsilon. // +// // +// The returned value indicates the following cases: // +// - ONVERTEX, p is the origin of 'searchsh'. // +// - ONEDGE, p lies on the edge of 'searchsh'. // +// - ONFACE, p lies in the interior of 'searchsh'. // +// - OUTSIDE, p lies outside of the triangulation, p is on the left-hand // +// side of the edge 'searchsh'(s), i.e., org(s), dest(s), p are CW. // +// // +/////////////////////////////////////////////////////////////////////////////// + +enum tetgenmesh::locateresult tetgenmesh::slocate(point searchpt, + face* searchsh, int aflag, int cflag, int rflag) +{ + face neighsh; + point pa, pb, pc; + enum locateresult loc; + enum {MOVE_BC, MOVE_CA} nextmove; + REAL ori, ori_bc, ori_ca; + int i; + + pa = sorg(*searchsh); + pb = sdest(*searchsh); + pc = sapex(*searchsh); + + if (!aflag) { + // No above point is given. Calculate an above point for this facet. + calculateabovepoint4(pa, pb, pc, searchpt); + } + + // 'dummypoint' is given. Make sure it is above [a,b,c] + ori = orient3d(pa, pb, pc, dummypoint); + if (ori > 0) { + sesymself(*searchsh); // Reverse the face orientation. + } else if (ori == 0.0) { + // This case should not happen theoretically. But... + return UNKNOWN; + } + + // Find an edge of the face s.t. p lies on its right-hand side (CCW). + for (i = 0; i < 3; i++) { + pa = sorg(*searchsh); + pb = sdest(*searchsh); + ori = orient3d(pa, pb, dummypoint, searchpt); + if (ori > 0) break; + senextself(*searchsh); + } + if (i == 3) { + return UNKNOWN; + } + + pc = sapex(*searchsh); + + if (pc == searchpt) { + senext2self(*searchsh); + return ONVERTEX; + } + + while (1) { + + ori_bc = orient3d(pb, pc, dummypoint, searchpt); + ori_ca = orient3d(pc, pa, dummypoint, searchpt); + + if (ori_bc < 0) { + if (ori_ca < 0) { // (--) + // Any of the edges is a viable move. + if (randomnation(2)) { + nextmove = MOVE_CA; + } else { + nextmove = MOVE_BC; + } + } else { // (-#) + // Edge [b, c] is viable. + nextmove = MOVE_BC; + } + } else { + if (ori_ca < 0) { // (#-) + // Edge [c, a] is viable. + nextmove = MOVE_CA; + } else { + if (ori_bc > 0) { + if (ori_ca > 0) { // (++) + loc = ONFACE; // Inside [a, b, c]. + break; + } else { // (+0) + senext2self(*searchsh); // On edge [c, a]. + loc = ONEDGE; + break; + } + } else { // ori_bc == 0 + if (ori_ca > 0) { // (0+) + senextself(*searchsh); // On edge [b, c]. + loc = ONEDGE; + break; + } else { // (00) + // p is coincident with vertex c. + senext2self(*searchsh); + return ONVERTEX; + } + } + } + } + + // Move to the next face. + if (nextmove == MOVE_BC) { + senextself(*searchsh); + } else { + senext2self(*searchsh); + } + if (!cflag) { + // NON-convex case. Check if we will cross a boundary. + if (isshsubseg(*searchsh)) { + return ENCSEGMENT; + } + } + spivot(*searchsh, neighsh); + if (neighsh.sh == NULL) { + return OUTSIDE; // A hull edge. + } + // Adjust the edge orientation. + if (sorg(neighsh) != sdest(*searchsh)) { + sesymself(neighsh); + } + + // Update the newly discovered face and its endpoints. + *searchsh = neighsh; + pa = sorg(*searchsh); + pb = sdest(*searchsh); + pc = sapex(*searchsh); + + if (pc == searchpt) { + senext2self(*searchsh); + return ONVERTEX; + } + + } // while (1) + + // assert(loc == ONFACE || loc == ONEDGE); + + + if (rflag) { + // Round the locate result before return. + REAL n[3], area_abc, area_abp, area_bcp, area_cap; + + pa = sorg(*searchsh); + pb = sdest(*searchsh); + pc = sapex(*searchsh); + + facenormal(pa, pb, pc, n, 1, NULL); + area_abc = sqrt(dot(n, n)); + + facenormal(pb, pc, searchpt, n, 1, NULL); + area_bcp = sqrt(dot(n, n)); + if ((area_bcp / area_abc) < b->epsilon) { + area_bcp = 0; // Rounding. + } + + facenormal(pc, pa, searchpt, n, 1, NULL); + area_cap = sqrt(dot(n, n)); + if ((area_cap / area_abc) < b->epsilon) { + area_cap = 0; // Rounding + } + + if ((loc == ONFACE) || (loc == OUTSIDE)) { + facenormal(pa, pb, searchpt, n, 1, NULL); + area_abp = sqrt(dot(n, n)); + if ((area_abp / area_abc) < b->epsilon) { + area_abp = 0; // Rounding + } + } else { // loc == ONEDGE + area_abp = 0; + } + + if (area_abp == 0) { + if (area_bcp == 0) { + senextself(*searchsh); + loc = ONVERTEX; // p is close to b. + } else { + if (area_cap == 0) { + loc = ONVERTEX; // p is close to a. + } else { + loc = ONEDGE; // p is on edge [a,b]. + } + } + } else if (area_bcp == 0) { + if (area_cap == 0) { + senext2self(*searchsh); + loc = ONVERTEX; // p is close to c. + } else { + senextself(*searchsh); + loc = ONEDGE; // p is on edge [b,c]. + } + } else if (area_cap == 0) { + senext2self(*searchsh); + loc = ONEDGE; // p is on edge [c,a]. + } else { + loc = ONFACE; // p is on face [a,b,c]. + } + } // if (rflag) + + return loc; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// sscoutsegment() Look for a segment in the surface triangulation. // +// // +// The segment is given by the origin of 'searchsh' and 'endpt'. // +// // +// If an edge in T is found matching this segment, the segment is "locked" // +// in T at the edge. Otherwise, flip the first edge in T that the segment // +// crosses. Continue the search from the flipped face. // +// // +// This routine uses 'orisent3d' to determine the search direction. It uses // +// 'dummypoint' as the 'lifted point' in 3d, and it assumes that it (dummy- // +// point) lies above the 'searchsh' (w.r.t the Right-hand rule). // +// // +/////////////////////////////////////////////////////////////////////////////// + +enum tetgenmesh::interresult tetgenmesh::sscoutsegment(face *searchsh, + point endpt, int insertsegflag, int reporterrorflag, int chkencflag) +{ + face flipshs[2], neighsh; + point startpt, pa, pb, pc, pd; + enum interresult dir; + enum {MOVE_AB, MOVE_CA} nextmove; + REAL ori_ab, ori_ca, len; + + pc = NULL; // Avoid warnings from MSVC + // The origin of 'searchsh' is fixed. + startpt = sorg(*searchsh); + nextmove = MOVE_AB; // Avoid compiler warning. + + if (b->verbose > 2) { + printf(" Scout segment (%d, %d).\n", pointmark(startpt), + pointmark(endpt)); + } + len = distance(startpt, endpt); + + // Search an edge in 'searchsh' on the path of this segment. + while (1) { + + pb = sdest(*searchsh); + if (pb == endpt) { + dir = SHAREEDGE; // Found! + break; + } + + pc = sapex(*searchsh); + if (pc == endpt) { + senext2self(*searchsh); + sesymself(*searchsh); + dir = SHAREEDGE; // Found! + break; + } + + + // Round the results. + if ((sqrt(triarea(startpt, pb, endpt)) / len) < b->epsilon) { + ori_ab = 0.0; + } else { + ori_ab = orient3d(startpt, pb, dummypoint, endpt); + } + if ((sqrt(triarea(pc, startpt, endpt)) / len) < b->epsilon) { + ori_ca = 0.0; + } else { + ori_ca = orient3d(pc, startpt, dummypoint, endpt); + } + + if (ori_ab < 0) { + if (ori_ca < 0) { // (--) + // Both sides are viable moves. + if (randomnation(2)) { + nextmove = MOVE_CA; + } else { + nextmove = MOVE_AB; + } + } else { // (-#) + nextmove = MOVE_AB; + } + } else { + if (ori_ca < 0) { // (#-) + nextmove = MOVE_CA; + } else { + if (ori_ab > 0) { + if (ori_ca > 0) { // (++) + // The segment intersects with edge [b, c]. + dir = ACROSSEDGE; + break; + } else { // (+0) + // The segment collinear with edge [c, a]. + senext2self(*searchsh); + sesymself(*searchsh); + dir = ACROSSVERT; + break; + } + } else { + if (ori_ca > 0) { // (0+) + // The segment is collinear with edge [a, b]. + dir = ACROSSVERT; + break; + } else { // (00) + // startpt == endpt. Not possible. + terminatetetgen(this, 2); + } + } + } + } + + // Move 'searchsh' to the next face, keep the origin unchanged. + if (nextmove == MOVE_AB) { + if (chkencflag) { + // Do not cross boundary. + if (isshsubseg(*searchsh)) { + return ACROSSEDGE; // ACROSS_SEG + } + } + spivot(*searchsh, neighsh); + if (neighsh.sh != NULL) { + if (sorg(neighsh) != pb) sesymself(neighsh); + senext(neighsh, *searchsh); + } else { + // This side (startpt->pb) is outside. It is caused by rounding error. + // Try the next side, i.e., (pc->startpt). + senext2(*searchsh, neighsh); + if (chkencflag) { + // Do not cross boundary. + if (isshsubseg(neighsh)) { + *searchsh = neighsh; + return ACROSSEDGE; // ACROSS_SEG + } + } + spivotself(neighsh); + if (sdest(neighsh) != pc) sesymself(neighsh); + *searchsh = neighsh; + } + } else { // MOVE_CA + senext2(*searchsh, neighsh); + if (chkencflag) { + // Do not cross boundary. + if (isshsubseg(neighsh)) { + *searchsh = neighsh; + return ACROSSEDGE; // ACROSS_SEG + } + } + spivotself(neighsh); + if (neighsh.sh != NULL) { + if (sdest(neighsh) != pc) sesymself(neighsh); + *searchsh = neighsh; + } else { + // The same reason as above. + // Try the next side, i.e., (startpt->pb). + if (chkencflag) { + // Do not cross boundary. + if (isshsubseg(*searchsh)) { + return ACROSSEDGE; // ACROSS_SEG + } + } + spivot(*searchsh, neighsh); + if (sorg(neighsh) != pb) sesymself(neighsh); + senext(neighsh, *searchsh); + } + } + } // while + + if (dir == SHAREEDGE) { + if (insertsegflag) { + // Insert the segment into the triangulation. + face newseg; + makeshellface(subsegs, &newseg); + setshvertices(newseg, startpt, endpt, NULL); + // Set the default segment marker. + setshellmark(newseg, -1); + ssbond(*searchsh, newseg); + spivot(*searchsh, neighsh); + if (neighsh.sh != NULL) { + ssbond(neighsh, newseg); + } + } + return dir; + } + + if (dir == ACROSSVERT) { + // A point is found collinear with this segment. + if (reporterrorflag) { + point pp = sdest(*searchsh); + printf("PLC Error: A vertex lies in a segment in facet #%d.\n", + shellmark(*searchsh)); + printf(" Vertex: [%d] (%g,%g,%g).\n",pointmark(pp),pp[0],pp[1],pp[2]); + printf(" Segment: [%d, %d]\n", pointmark(startpt), pointmark(endpt)); + } + return dir; + } + + if (dir == ACROSSEDGE) { + // Edge [b, c] intersects with the segment. + senext(*searchsh, flipshs[0]); + if (isshsubseg(flipshs[0])) { + if (reporterrorflag) { + REAL P[3], Q[3], tp = 0, tq = 0; + linelineint(startpt, endpt, pb, pc, P, Q, &tp, &tq); + printf("PLC Error: Two segments intersect at point (%g,%g,%g),", + P[0], P[1], P[2]); + printf(" in facet #%d.\n", shellmark(*searchsh)); + printf(" Segment 1: [%d, %d]\n", pointmark(pb), pointmark(pc)); + printf(" Segment 2: [%d, %d]\n", pointmark(startpt),pointmark(endpt)); + } + return dir; // ACROSS_SEG + } + // Flip edge [b, c], queue unflipped edges (for Delaunay checks). + spivot(flipshs[0], flipshs[1]); + if (sorg(flipshs[1]) != sdest(flipshs[0])) sesymself(flipshs[1]); + flip22(flipshs, 1, 0); + // The flip may create an inverted triangle, check it. + pa = sapex(flipshs[1]); + pb = sapex(flipshs[0]); + pc = sorg(flipshs[0]); + pd = sdest(flipshs[0]); + // Check if pa and pb are on the different sides of [pc, pd]. + // Re-use ori_ab, ori_ca for the tests. + ori_ab = orient3d(pc, pd, dummypoint, pb); + ori_ca = orient3d(pd, pc, dummypoint, pa); + if (ori_ab <= 0) { + flipshpush(&(flipshs[0])); + } else if (ori_ca <= 0) { + flipshpush(&(flipshs[1])); + } + // Set 'searchsh' s.t. its origin is 'startpt'. + *searchsh = flipshs[0]; + } + + return sscoutsegment(searchsh, endpt, insertsegflag, reporterrorflag, + chkencflag); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// scarveholes() Remove triangles not in the facet. // +// // +// This routine re-uses the two global arrays: caveshlist and caveshbdlist. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::scarveholes(int holes, REAL* holelist) +{ + face *parysh, searchsh, neighsh; + enum locateresult loc; + int i, j; + + // Get all triangles. Infect unprotected convex hull triangles. + smarktest(recentsh); + caveshlist->newindex((void **) &parysh); + *parysh = recentsh; + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + searchsh = *parysh; + searchsh.shver = 0; + for (j = 0; j < 3; j++) { + spivot(searchsh, neighsh); + // Is this side on the convex hull? + if (neighsh.sh != NULL) { + if (!smarktested(neighsh)) { + smarktest(neighsh); + caveshlist->newindex((void **) &parysh); + *parysh = neighsh; + } + } else { + // A hull side. Check if it is protected by a segment. + if (!isshsubseg(searchsh)) { + // Not protected. Save this face. + if (!sinfected(searchsh)) { + sinfect(searchsh); + caveshbdlist->newindex((void **) &parysh); + *parysh = searchsh; + } + } + } + senextself(searchsh); + } + } + + // Infect the triangles in the holes. + for (i = 0; i < 3 * holes; i += 3) { + searchsh = recentsh; + loc = slocate(&(holelist[i]), &searchsh, 1, 1, 0); + if (loc != OUTSIDE) { + sinfect(searchsh); + caveshbdlist->newindex((void **) &parysh); + *parysh = searchsh; + } + } + + // Find and infect all exterior triangles. + for (i = 0; i < caveshbdlist->objects; i++) { + parysh = (face *) fastlookup(caveshbdlist, i); + searchsh = *parysh; + searchsh.shver = 0; + for (j = 0; j < 3; j++) { + spivot(searchsh, neighsh); + if (neighsh.sh != NULL) { + if (!isshsubseg(searchsh)) { + if (!sinfected(neighsh)) { + sinfect(neighsh); + caveshbdlist->newindex((void **) &parysh); + *parysh = neighsh; + } + } else { + sdissolve(neighsh); // Disconnect a protected face. + } + } + senextself(searchsh); + } + } + + // Delete exterior triangles, unmark interior triangles. + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + if (sinfected(*parysh)) { + shellfacedealloc(subfaces, parysh->sh); + } else { + sunmarktest(*parysh); + } + } + + caveshlist->restart(); + caveshbdlist->restart(); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// triangulate() Create a CDT for the facet. // +// // +// All vertices of the triangulation have type FACETVERTEX. The actual type // +// of boundary vertices are set by the routine unifysements(). // +// // +// All segments created here will have a default marker '-1'. Some of these // +// segments will get their actual marker defined in 'edgemarkerlist'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::triangulate(int shmark, arraypool* ptlist, arraypool* conlist, + int holes, REAL* holelist) +{ + face searchsh, newsh, *parysh; + face newseg, *paryseg; + point pa, pb, pc, *ppt, *cons; + int iloc; + int i, j; + + if (b->verbose > 2) { + printf(" f%d: %ld vertices, %ld segments", shmark, ptlist->objects, + conlist->objects); + if (holes > 0) { + printf(", %d holes", holes); + } + printf(".\n"); + } + + if (ptlist->objects < 2l) { + // Not a segment or a facet. + return 1; + } else if (ptlist->objects == 2l) { + pa = * (point *) fastlookup(ptlist, 0); + pb = * (point *) fastlookup(ptlist, 1); + if (distance(pa, pb) > 0) { + // It is a single segment. + makeshellface(subsegs, &newseg); + setshvertices(newseg, pa, pb, NULL); + setshellmark(newseg, -1); + } + if (pointtype(pa) == VOLVERTEX) { + setpointtype(pa, FACETVERTEX); + } + if (pointtype(pb) == VOLVERTEX) { + setpointtype(pb, FACETVERTEX); + } + return 1; + } else if (ptlist->objects == 3) { + pa = * (point *) fastlookup(ptlist, 0); + pb = * (point *) fastlookup(ptlist, 1); + pc = * (point *) fastlookup(ptlist, 2); + } else { + // Calculate an above point of this facet. + if (!calculateabovepoint(ptlist, &pa, &pb, &pc)) { + if (!b->quiet) { + printf("Warning: Unable to triangulate facet #%d. Skipped!\n",shmark); + } + return 0; // The point set is degenerate. + } + } + + // Create an initial triangulation. + makeshellface(subfaces, &newsh); + setshvertices(newsh, pa, pb, pc); + setshellmark(newsh, shmark); + recentsh = newsh; + + if (pointtype(pa) == VOLVERTEX) { + setpointtype(pa, FACETVERTEX); + } + if (pointtype(pb) == VOLVERTEX) { + setpointtype(pb, FACETVERTEX); + } + if (pointtype(pc) == VOLVERTEX) { + setpointtype(pc, FACETVERTEX); + } + + // Are there area constraints? + if (b->quality && (in->facetconstraintlist != NULL)) { + for (i = 0; i < in->numberoffacetconstraints; i++) { + if (shmark == ((int) in->facetconstraintlist[i * 2])) { + REAL area = in->facetconstraintlist[i * 2 + 1]; + setareabound(newsh, area); + break; + } + } + } + + if (ptlist->objects == 3) { + // The triangulation only has one element. + for (i = 0; i < 3; i++) { + makeshellface(subsegs, &newseg); + setshvertices(newseg, sorg(newsh), sdest(newsh), NULL); + setshellmark(newseg, -1); + ssbond(newsh, newseg); + senextself(newsh); + } + return 1; + } + + // Triangulate the facet. It may not success (due to rounding error, or + // incorrect input data), use 'caveencshlist' and 'caveencseglist' are + // re-used to store all the newly created subfaces and segments. So we + // can clean them if the triangulation is not successful. + caveencshlist->newindex((void **) &parysh); + *parysh = newsh; + + // Incrementally build the triangulation. + pinfect(pa); + pinfect(pb); + pinfect(pc); + for (i = 0; i < ptlist->objects; i++) { + ppt = (point *) fastlookup(ptlist, i); + if (!pinfected(*ppt)) { + searchsh = recentsh; // Start from 'recentsh'. + iloc = (int) OUTSIDE; + // Insert the vertex. Use Bowyer-Watson algo. Round the location. + iloc = sinsertvertex(*ppt, &searchsh, NULL, iloc, 1, 1); + if (iloc != ((int) ONVERTEX)) { + // Point inserted successfully. + if (pointtype(*ppt) == VOLVERTEX) { + setpointtype(*ppt, FACETVERTEX); + } + // Save the set of new subfaces. + for (j = 0; j < caveshbdlist->objects; j++) { + // Get an old subface at edge [a, b]. + parysh = (face *) fastlookup(caveshbdlist, j); + spivot(*parysh, searchsh); // The new subface [a, b, p]. + // Do not save a deleted new face (degenerated). + if (searchsh.sh[3] != NULL) { + caveencshlist->newindex((void **) &parysh); + *parysh = searchsh; + } + } + // Delete all removed subfaces. + for (j = 0; j < caveshlist->objects; j++) { + parysh = (face *) fastlookup(caveshlist, j); + shellfacedealloc(subfaces, parysh->sh); + } + // Clear the global lists. + caveshbdlist->restart(); + caveshlist->restart(); + cavesegshlist->restart(); + } else { + // The facet triangulation is failed. + break; + } + } + } // i + puninfect(pa); + puninfect(pb); + puninfect(pc); + + if (i < ptlist->objects) { + //The facet triangulation is failed. Clean the new subfaces. + // There is no new segment be created yet. + if (!b->quiet) { + printf("Warning: Fail to triangulate facet #%d. Skipped!\n", shmark); + } + for (i = 0; i < caveencshlist->objects; i++) { + parysh = (face *) fastlookup(caveencshlist, i); + if (parysh->sh[3] != NULL) { + shellfacedealloc(subfaces, parysh->sh); + } + } + caveencshlist->restart(); + return 0; + } + + // Insert the segments. + for (i = 0; i < conlist->objects; i++) { + cons = (point *) fastlookup(conlist, i); + searchsh = recentsh; + iloc = (int) slocate(cons[0], &searchsh, 1, 1, 0); + if (iloc != (int) ONVERTEX) { + // Not found due to roundoff errors. Do a brute-force search. + subfaces->traversalinit(); + searchsh.sh = shellfacetraverse(subfaces); + while (searchsh.sh != NULL) { + // Only search the subface in the same facet. + if (shellmark(searchsh) == shmark) { + if ((point) searchsh.sh[3] == cons[0]) { + searchsh.shver = 0; break; + } else if ((point) searchsh.sh[4] == cons[0]) { + searchsh.shver = 2; break; + } else if ((point) searchsh.sh[5] == cons[0]) { + searchsh.shver = 4; break; + } + } + searchsh.sh = shellfacetraverse(subfaces); + } + } + // Recover the segment. Some edges may be flipped. + if (sscoutsegment(&searchsh, cons[1], 1, 1, 0) != SHAREEDGE) { + break; // Fail to recover a segment. + } + // Save this newseg. + sspivot(searchsh, newseg); + caveencseglist->newindex((void **) &paryseg); + *paryseg = newseg; + if (flipstack != NULL) { + // Recover locally Delaunay edges. + lawsonflip(); + } + } // i + + if (i < conlist->objects) { + if (!b->quiet) { + printf("Warning: Fail to recover a segment in facet #%d. Skipped!\n", + shmark); + } + for (i = 0; i < caveencshlist->objects; i++) { + parysh = (face *) fastlookup(caveencshlist, i); + if (parysh->sh[3] != NULL) { + shellfacedealloc(subfaces, parysh->sh); + } + } + for (i = 0; i < caveencseglist->objects; i++) { + paryseg = (face *) fastlookup(caveencseglist, i); + if (paryseg->sh[3] != NULL) { + shellfacedealloc(subsegs, paryseg->sh); + } + } + caveencshlist->restart(); + caveencseglist->restart(); + return 0; + } + + // Remove exterior and hole triangles. + scarveholes(holes, holelist); + + caveencshlist->restart(); + caveencseglist->restart(); + return 1; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// unifysegments() Remove redundant segments and create face links. // +// // +// After this routine, although segments are unique, but some of them may be // +// removed later by mergefacet(). All vertices still have type FACETVERTEX. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::unifysegments() +{ + badface *facelink = NULL, *newlinkitem, *f1, *f2; + face *facperverlist, sface; + face subsegloop, testseg; + point torg, tdest; + REAL ori1, ori2, ori3; + REAL n1[3], n2[3]; + REAL cosang, ang, ang_tol; + int *idx2faclist; + int idx, k, m; + + if (b->verbose > 1) { + printf(" Unifying segments.\n"); + } + // The limit dihedral angle that two facets are not overlapping. + ang_tol = b->facet_overlap_ang_tol / 180.0 * PI; + if (ang_tol < 0.0) ang_tol = 0.0; + + // Create a mapping from vertices to subfaces. + makepoint2submap(subfaces, idx2faclist, facperverlist); + + + subsegloop.shver = 0; + subsegs->traversalinit(); + subsegloop.sh = shellfacetraverse(subsegs); + while (subsegloop.sh != (shellface *) NULL) { + torg = sorg(subsegloop); + tdest = sdest(subsegloop); + + idx = pointmark(torg) - in->firstnumber; + // Loop through the set of subfaces containing 'torg'. Get all the + // subfaces containing the edge (torg, tdest). Save and order them + // in 'sfacelist', the ordering is defined by the right-hand rule + // with thumb points from torg to tdest. + for (k = idx2faclist[idx]; k < idx2faclist[idx + 1]; k++) { + sface = facperverlist[k]; + // The face may be deleted if it is a duplicated face. + if (sface.sh[3] == NULL) continue; + // Search the edge torg->tdest. + if (sdest(sface) != tdest) { + senext2self(sface); + sesymself(sface); + } + if (sdest(sface) != tdest) continue; + + // Save the face f in facelink. + if (flippool->items >= 2) { + f1 = facelink; + for (m = 0; m < flippool->items - 1; m++) { + f2 = f1->nextitem; + ori1 = orient3d(torg, tdest, sapex(f1->ss), sapex(f2->ss)); + ori2 = orient3d(torg, tdest, sapex(f1->ss), sapex(sface)); + if (ori1 > 0) { + // apex(f2) is below f1. + if (ori2 > 0) { + // apex(f) is below f1 (see Fig.1). + ori3 = orient3d(torg, tdest, sapex(f2->ss), sapex(sface)); + if (ori3 > 0) { + // apex(f) is below f2, insert it. + break; + } else if (ori3 < 0) { + // apex(f) is above f2, continue. + } else { // ori3 == 0; + // f is coplanar and codirection with f2. + report_overlapping_facets(&(f2->ss), &sface); + break; + } + } else if (ori2 < 0) { + // apex(f) is above f1 below f2, inset it (see Fig. 2). + break; + } else { // ori2 == 0; + // apex(f) is coplanar with f1 (see Fig. 5). + ori3 = orient3d(torg, tdest, sapex(f2->ss), sapex(sface)); + if (ori3 > 0) { + // apex(f) is below f2, insert it. + break; + } else { + // f is coplanar and codirection with f1. + report_overlapping_facets(&(f1->ss), &sface); + break; + } + } + } else if (ori1 < 0) { + // apex(f2) is above f1. + if (ori2 > 0) { + // apex(f) is below f1, continue (see Fig. 3). + } else if (ori2 < 0) { + // apex(f) is above f1 (see Fig.4). + ori3 = orient3d(torg, tdest, sapex(f2->ss), sapex(sface)); + if (ori3 > 0) { + // apex(f) is below f2, insert it. + break; + } else if (ori3 < 0) { + // apex(f) is above f2, continue. + } else { // ori3 == 0; + // f is coplanar and codirection with f2. + report_overlapping_facets(&(f2->ss), &sface); + break; + } + } else { // ori2 == 0; + // f is coplanar and with f1 (see Fig. 6). + ori3 = orient3d(torg, tdest, sapex(f2->ss), sapex(sface)); + if (ori3 > 0) { + // f is also codirection with f1. + report_overlapping_facets(&(f1->ss), &sface); + break; + } else { + // f is above f2, continue. + } + } + } else { // ori1 == 0; + // apex(f2) is coplanar with f1. By assumption, f1 is not + // coplanar and codirection with f2. + if (ori2 > 0) { + // apex(f) is below f1, continue (see Fig. 7). + } else if (ori2 < 0) { + // apex(f) is above f1, insert it (see Fig. 7). + break; + } else { // ori2 == 0. + // apex(f) is coplanar with f1 (see Fig. 8). + // f is either codirection with f1 or is codirection with f2. + facenormal(torg, tdest, sapex(f1->ss), n1, 1, NULL); + facenormal(torg, tdest, sapex(sface), n2, 1, NULL); + if (dot(n1, n2) > 0) { + report_overlapping_facets(&(f1->ss), &sface); + } else { + report_overlapping_facets(&(f2->ss), &sface); + } + break; + } + } + // Go to the next item; + f1 = f2; + } // for (m = 0; ...) + if (sface.sh[3] != NULL) { + // Insert sface between f1 and f2. + newlinkitem = (badface *) flippool->alloc(); + newlinkitem->ss = sface; + newlinkitem->nextitem = f1->nextitem; + f1->nextitem = newlinkitem; + } + } else if (flippool->items == 1) { + f1 = facelink; + // Make sure that f is not coplanar and codirection with f1. + ori1 = orient3d(torg, tdest, sapex(f1->ss), sapex(sface)); + if (ori1 == 0) { + // f is coplanar with f1 (see Fig. 8). + facenormal(torg, tdest, sapex(f1->ss), n1, 1, NULL); + facenormal(torg, tdest, sapex(sface), n2, 1, NULL); + if (dot(n1, n2) > 0) { + // The two faces are codirectional as well. + report_overlapping_facets(&(f1->ss), &sface); + } + } + // Add this face to link if it is not deleted. + if (sface.sh[3] != NULL) { + // Add this face into link. + newlinkitem = (badface *) flippool->alloc(); + newlinkitem->ss = sface; + newlinkitem->nextitem = NULL; + f1->nextitem = newlinkitem; + } + } else { + // The first face. + newlinkitem = (badface *) flippool->alloc(); + newlinkitem->ss = sface; + newlinkitem->nextitem = NULL; + facelink = newlinkitem; + } + } // for (k = idx2faclist[idx]; ...) + + + // Set the connection between this segment and faces containing it, + // at the same time, remove redundant segments. + f1 = facelink; + for (k = 0; k < flippool->items; k++) { + sspivot(f1->ss, testseg); + // If 'testseg' is not 'subsegloop' and is not dead, it is redundant. + if ((testseg.sh != subsegloop.sh) && (testseg.sh[3] != NULL)) { + shellfacedealloc(subsegs, testseg.sh); + } + // Bonds the subface and the segment together. + ssbond(f1->ss, subsegloop); + f1 = f1->nextitem; + } + + // Create the face ring at the segment. + if (flippool->items > 1) { + f1 = facelink; + for (k = 1; k <= flippool->items; k++) { + k < flippool->items ? f2 = f1->nextitem : f2 = facelink; + // Calculate the dihedral angle between the two facet. + facenormal(torg, tdest, sapex(f1->ss), n1, 1, NULL); + facenormal(torg, tdest, sapex(f2->ss), n2, 1, NULL); + cosang = dot(n1, n2) / (sqrt(dot(n1, n1)) * sqrt(dot(n2, n2))); + // Rounding. + if (cosang > 1.0) cosang = 1.0; + else if (cosang < -1.0) cosang = -1.0; + ang = acos(cosang); + if (ang < ang_tol) { + // Two facets are treated as overlapping each other. + report_overlapping_facets(&(f1->ss), &(f2->ss), ang); + } else { + // Record the smallest input dihedral angle. + if (ang < minfacetdihed) { + minfacetdihed = ang; + } + sbond1(f1->ss, f2->ss); + } + f1 = f2; + } + } + + flippool->restart(); + + // Are there length constraints? + if (b->quality && (in->segmentconstraintlist != (REAL *) NULL)) { + int e1, e2; + REAL len; + for (k = 0; k < in->numberofsegmentconstraints; k++) { + e1 = (int) in->segmentconstraintlist[k * 3]; + e2 = (int) in->segmentconstraintlist[k * 3 + 1]; + if (((pointmark(torg) == e1) && (pointmark(tdest) == e2)) || + ((pointmark(torg) == e2) && (pointmark(tdest) == e1))) { + len = in->segmentconstraintlist[k * 3 + 2]; + setareabound(subsegloop, len); + break; + } + } + } + + subsegloop.sh = shellfacetraverse(subsegs); + } + + delete [] idx2faclist; + delete [] facperverlist; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// identifyinputedges() Identify input edges. // +// // +// A set of input edges is provided in the 'in->edgelist'. We find these // +// edges in the surface mesh and make them segments of the mesh. // +// // +// It is possible that an input edge is not in any facet, i.e.,it is a float-// +// segment inside the volume. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::identifyinputedges(point *idx2verlist) +{ + face* shperverlist; + int* idx2shlist; + face searchsh, neighsh; + face segloop, checkseg, newseg; + point checkpt, pa = NULL, pb = NULL; + int *endpts; + int edgemarker; + int idx, i, j; + + int e1, e2; + REAL len; + + if (!b->quiet) { + printf("Inserting edges ...\n"); + } + + // Construct a map from points to subfaces. + makepoint2submap(subfaces, idx2shlist, shperverlist); + + // Process the set of input edges. + for (i = 0; i < in->numberofedges; i++) { + endpts = &(in->edgelist[(i << 1)]); + if (endpts[0] == endpts[1]) { + if (!b->quiet) { + printf("Warning: Edge #%d is degenerated. Skipped.\n", i); + } + continue; // Skip a degenerated edge. + } + // Recall that all existing segments have a default marker '-1'. + // We assign all identified segments a default marker '-2'. + edgemarker = in->edgemarkerlist ? in->edgemarkerlist[i] : -2; + + // Find a face contains the edge. + newseg.sh = NULL; + searchsh.sh = NULL; + idx = endpts[0] - in->firstnumber; + for (j = idx2shlist[idx]; j < idx2shlist[idx + 1]; j++) { + checkpt = sdest(shperverlist[j]); + if (pointmark(checkpt) == endpts[1]) { + searchsh = shperverlist[j]; + break; // Found. + } else { + checkpt = sapex(shperverlist[j]); + if (pointmark(checkpt) == endpts[1]) { + senext2(shperverlist[j], searchsh); + sesymself(searchsh); + break; + } + } + } // j + + if (searchsh.sh != NULL) { + // Check if this edge is already a segment of the mesh. + sspivot(searchsh, checkseg); + if (checkseg.sh != NULL) { + // This segment already exist. + newseg = checkseg; + } else { + // Create a new segment at this edge. + pa = sorg(searchsh); + pb = sdest(searchsh); + makeshellface(subsegs, &newseg); + setshvertices(newseg, pa, pb, NULL); + ssbond(searchsh, newseg); + spivot(searchsh, neighsh); + if (neighsh.sh != NULL) { + ssbond(neighsh, newseg); + } + } + } else { + // It is a dangling segment (not belong to any facets). + // Get the two endpoints of this segment. + pa = idx2verlist[endpts[0]]; + pb = idx2verlist[endpts[1]]; + if (pa == pb) { + if (!b->quiet) { + printf("Warning: Edge #%d is degenerated. Skipped.\n", i); + } + continue; + } + // Check if segment [a,b] already exists. + // TODO: Change the brute-force search. Slow! + point *ppt; + subsegs->traversalinit(); + segloop.sh = shellfacetraverse(subsegs); + while (segloop.sh != NULL) { + ppt = (point *) &(segloop.sh[3]); + if (((ppt[0] == pa) && (ppt[1] == pb)) || + ((ppt[0] == pb) && (ppt[1] == pa))) { + // Found! + newseg = segloop; + break; + } + segloop.sh = shellfacetraverse(subsegs); + } + if (newseg.sh == NULL) { + makeshellface(subsegs, &newseg); + setshvertices(newseg, pa, pb, NULL); + } + } + + setshellmark(newseg, edgemarker); + + if (b->quality && (in->segmentconstraintlist != (REAL *) NULL)) { + for (i = 0; i < in->numberofsegmentconstraints; i++) { + e1 = (int) in->segmentconstraintlist[i * 3]; + e2 = (int) in->segmentconstraintlist[i * 3 + 1]; + if (((pointmark(pa) == e1) && (pointmark(pb) == e2)) || + ((pointmark(pa) == e2) && (pointmark(pb) == e1))) { + len = in->segmentconstraintlist[i * 3 + 2]; + setareabound(newseg, len); + break; + } + } + } + } // i + + delete [] shperverlist; + delete [] idx2shlist; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// mergefacets() Merge adjacent facets. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::mergefacets() +{ + face parentsh, neighsh, neineish; + face segloop; + point pa, pb, pc, pd; + REAL n1[3], n2[3]; + REAL cosang, cosang_tol; + + + // Allocate an array to save calcaulated dihedral angles at segments. + arraypool *dihedangarray = new arraypool(sizeof(double), 10); + REAL *paryang = NULL; + + // First, remove coplanar segments. + // The dihedral angle bound for two different facets. + cosang_tol = cos(b->facet_separate_ang_tol / 180.0 * PI); + + subsegs->traversalinit(); + segloop.sh = shellfacetraverse(subsegs); + while (segloop.sh != (shellface *) NULL) { + // Only remove a segment if it has a marker '-1'. + if (shellmark(segloop) != -1) { + segloop.sh = shellfacetraverse(subsegs); + continue; + } + spivot(segloop, parentsh); + if (parentsh.sh != NULL) { + spivot(parentsh, neighsh); + if (neighsh.sh != NULL) { + spivot(neighsh, neineish); + if (neineish.sh == parentsh.sh) { + // Exactly two subfaces at this segment. + // Only merge them if they have the same boundary marker. + if (shellmark(parentsh) == shellmark(neighsh)) { + pa = sorg(segloop); + pb = sdest(segloop); + pc = sapex(parentsh); + pd = sapex(neighsh); + // Calculate the dihedral angle at the segment [a,b]. + facenormal(pa, pb, pc, n1, 1, NULL); + facenormal(pa, pb, pd, n2, 1, NULL); + cosang = dot(n1, n2) / (sqrt(dot(n1, n1)) * sqrt(dot(n2, n2))); + if (cosang < cosang_tol) { + ssdissolve(parentsh); + ssdissolve(neighsh); + shellfacedealloc(subsegs, segloop.sh); + // Add the edge to flip stack. + flipshpush(&parentsh); + } else { + // Save 'cosang' to avoid re-calculate it. + // Re-use the pointer at the first segment. + dihedangarray->newindex((void **) &paryang); + *paryang = cosang; + segloop.sh[6] = (shellface) paryang; + } + } + } // if (neineish.sh == parentsh.sh) + } + } + segloop.sh = shellfacetraverse(subsegs); + } + + // Second, remove ridge segments at small angles. + // The dihedral angle bound for two different facets. + cosang_tol = cos(b->facet_small_ang_tol / 180.0 * PI); + REAL cosang_sep_tol = cos((b->facet_separate_ang_tol - 5.0) / 180.0 * PI); + face shloop; + face seg1, seg2; + REAL cosang1, cosang2; + int i, j; + + subfaces->traversalinit(); + shloop.sh = shellfacetraverse(subfaces); + while (shloop.sh != (shellface *) NULL) { + for (i = 0; i < 3; i++) { + if (isshsubseg(shloop)) { + senext(shloop, neighsh); + if (isshsubseg(neighsh)) { + // Found two segments sharing at one vertex. + // Check if they form a small angle. + pa = sorg(shloop); + pb = sdest(shloop); + pc = sapex(shloop); + for (j = 0; j < 3; j++) n1[j] = pa[j] - pb[j]; + for (j = 0; j < 3; j++) n2[j] = pc[j] - pb[j]; + cosang = dot(n1, n2) / (sqrt(dot(n1, n1)) * sqrt(dot(n2, n2))); + if (cosang > cosang_tol) { + // Found a small angle. + segloop.sh = NULL; + sspivot(shloop, seg1); + sspivot(neighsh, seg2); + if (seg1.sh[6] != NULL) { + paryang = (REAL *) (seg1.sh[6]); + cosang1 = *paryang; + } else { + cosang1 = 1.0; // 0 degree; + } + if (seg2.sh[6] != NULL) { + paryang = (REAL *) (seg2.sh[6]); + cosang2 = *paryang; + } else { + cosang2 = 1.0; // 0 degree; + } + if (cosang1 < cosang_sep_tol) { + if (cosang2 < cosang_sep_tol) { + if (cosang1 < cosang2) { + segloop = seg1; + } else { + segloop = seg2; + } + } else { + segloop = seg1; + } + } else { + if (cosang2 < cosang_sep_tol) { + segloop = seg2; + } + } + if (segloop.sh != NULL) { + // Remove this segment. + segloop.shver = 0; + spivot(segloop, parentsh); + spivot(parentsh, neighsh); + ssdissolve(parentsh); + ssdissolve(neighsh); + shellfacedealloc(subsegs, segloop.sh); + // Add the edge to flip stack. + flipshpush(&parentsh); + break; + } + } + } // if (isshsubseg) + } // if (isshsubseg) + senextself(shloop); + } + shloop.sh = shellfacetraverse(subfaces); + } + + delete dihedangarray; + + if (flipstack != NULL) { + lawsonflip(); // Recover Delaunayness. + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// meshsurface() Create a surface mesh of the input PLC. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::meshsurface() +{ + arraypool *ptlist, *conlist; + point *idx2verlist; + point tstart, tend, *pnewpt, *cons; + tetgenio::facet *f; + tetgenio::polygon *p; + int end1, end2; + int shmark, i, j; + + if (!b->quiet) { + printf("Creating surface mesh ...\n"); + } + + // Create a map from indices to points. + makeindex2pointmap(idx2verlist); + + // Initialize arrays (block size: 2^8 = 256). + ptlist = new arraypool(sizeof(point *), 8); + conlist = new arraypool(2 * sizeof(point *), 8); + + // Loop the facet list, triangulate each facet. + for (shmark = 1; shmark <= in->numberoffacets; shmark++) { + + // Get a facet F. + f = &in->facetlist[shmark - 1]; + + // Process the duplicated points first, they are marked with type + // DUPLICATEDVERTEX. If p and q are duplicated, and p'index > q's, + // then p is substituted by q. + if (dupverts > 0l) { + // Loop all polygons of this facet. + for (i = 0; i < f->numberofpolygons; i++) { + p = &(f->polygonlist[i]); + // Loop other vertices of this polygon. + for (j = 0; j < p->numberofvertices; j++) { + end1 = p->vertexlist[j]; + tstart = idx2verlist[end1]; + if (pointtype(tstart) == DUPLICATEDVERTEX) { + // Reset the index of vertex-j. + tend = point2ppt(tstart); + end2 = pointmark(tend); + p->vertexlist[j] = end2; + } + } + } + } + + // Loop polygons of F, get the set of vertices and segments. + for (i = 0; i < f->numberofpolygons; i++) { + // Get a polygon. + p = &(f->polygonlist[i]); + // Get the first vertex. + end1 = p->vertexlist[0]; + if ((end1 < in->firstnumber) || + (end1 >= in->firstnumber + in->numberofpoints)) { + if (!b->quiet) { + printf("Warning: Invalid the 1st vertex %d of polygon", end1); + printf(" %d in facet %d.\n", i + 1, shmark); + } + continue; // Skip this polygon. + } + tstart = idx2verlist[end1]; + // Add tstart to V if it haven't been added yet. + if (!pinfected(tstart)) { + pinfect(tstart); + ptlist->newindex((void **) &pnewpt); + *pnewpt = tstart; + } + // Loop other vertices of this polygon. + for (j = 1; j <= p->numberofvertices; j++) { + // get a vertex. + if (j < p->numberofvertices) { + end2 = p->vertexlist[j]; + } else { + end2 = p->vertexlist[0]; // Form a loop from last to first. + } + if ((end2 < in->firstnumber) || + (end2 >= in->firstnumber + in->numberofpoints)) { + if (!b->quiet) { + printf("Warning: Invalid vertex %d in polygon %d", end2, i + 1); + printf(" in facet %d.\n", shmark); + } + } else { + if (end1 != end2) { + // 'end1' and 'end2' form a segment. + tend = idx2verlist[end2]; + // Add tstart to V if it haven't been added yet. + if (!pinfected(tend)) { + pinfect(tend); + ptlist->newindex((void **) &pnewpt); + *pnewpt = tend; + } + // Save the segment in S (conlist). + conlist->newindex((void **) &cons); + cons[0] = tstart; + cons[1] = tend; + // Set the start for next continuous segment. + end1 = end2; + tstart = tend; + } else { + // Two identical vertices mean an isolated vertex of F. + if (p->numberofvertices > 2) { + // This may be an error in the input, anyway, we can continue + // by simply skipping this segment. + if (!b->quiet) { + printf("Warning: Polygon %d has two identical verts", i + 1); + printf(" in facet %d.\n", shmark); + } + } + // Ignore this vertex. + } + } + // Is the polygon degenerate (a segment or a vertex)? + if (p->numberofvertices == 2) break; + } + } + // Unmark vertices. + for (i = 0; i < ptlist->objects; i++) { + pnewpt = (point *) fastlookup(ptlist, i); + puninfect(*pnewpt); + } + + // Triangulate F into a CDT. + // If in->facetmarklist is NULL, use the default marker -1. + triangulate(in->facetmarkerlist ? in->facetmarkerlist[shmark - 1] : -1, + ptlist, conlist, f->numberofholes, f->holelist); + + // Clear working lists. + ptlist->restart(); + conlist->restart(); + } + + if (!b->diagnose) { + // Remove redundant segments and build the face links. + unifysegments(); + if (in->numberofedges > 0) { + // There are input segments. Insert them. + identifyinputedges(idx2verlist); + } + if (!b->psc && !b->nomergefacet && + (!b->nobisect || (b->nobisect && !b->nobisect_nomerge))) { + // Merge coplanar facets. + mergefacets(); + } + } + + if (b->object == tetgenbehavior::STL) { + // Remove redundant vertices (for .stl input mesh). + jettisonnodes(); + } + + if (b->verbose) { + printf(" %ld (%ld) subfaces (segments).\n", subfaces->items, + subsegs->items); + } + + // The total number of iunput segments. + insegments = subsegs->items; + + delete [] idx2verlist; + delete ptlist; + delete conlist; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// interecursive() Recursively do intersection test on a set of triangles.// +// // +// Recursively split the set 'subfacearray' of subfaces into two sets using // +// a cut plane parallel to x-, or, y-, or z-axis. The split criteria are // +// follows. Assume the cut plane is H, and H+ denotes the left halfspace of // +// H, and H- denotes the right halfspace of H; and s be a subface: // +// // +// (1) If all points of s lie at H+, put it into left array; // +// (2) If all points of s lie at H-, put it into right array; // +// (3) If some points of s lie at H+ and some of lie at H-, or some // +// points lie on H, put it into both arraies. // +// // +// Partitions by x-axis if axis == '0'; by y-axis if axis == '1'; by z-axis // +// if axis == '2'. If current cut plane is parallel to the x-axis, the next // +// one will be parallel to y-axis, and the next one after the next is z-axis,// +// and then alternately return back to x-axis. // +// // +// Stop splitting when the number of triangles of the input array is not // +// decreased anymore. Do tests on the current set. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::interecursive(shellface** subfacearray, int arraysize, + int axis, REAL bxmin, REAL bxmax, REAL bymin, + REAL bymax, REAL bzmin, REAL bzmax, + int* internum) +{ + shellface **leftarray, **rightarray; + face sface1, sface2; + point p1, p2, p3; + point p4, p5, p6; + enum interresult intersect; + REAL split; + bool toleft, toright; + int leftsize, rightsize; + int i, j; + + if (b->verbose > 2) { + printf(" Recur %d faces. Bbox (%g, %g, %g),(%g, %g, %g). %s-axis\n", + arraysize, bxmin, bymin, bzmin, bxmax, bymax, bzmax, + axis == 0 ? "x" : (axis == 1 ? "y" : "z")); + } + + leftarray = new shellface*[arraysize]; + if (leftarray == NULL) { + terminatetetgen(this, 1); + } + rightarray = new shellface*[arraysize]; + if (rightarray == NULL) { + terminatetetgen(this, 1); + } + leftsize = rightsize = 0; + + if (axis == 0) { + // Split along x-axis. + split = 0.5 * (bxmin + bxmax); + } else if (axis == 1) { + // Split along y-axis. + split = 0.5 * (bymin + bymax); + } else { + // Split along z-axis. + split = 0.5 * (bzmin + bzmax); + } + + for (i = 0; i < arraysize; i++) { + sface1.sh = subfacearray[i]; + p1 = (point) sface1.sh[3]; + p2 = (point) sface1.sh[4]; + p3 = (point) sface1.sh[5]; + toleft = toright = false; + if (p1[axis] < split) { + toleft = true; + if (p2[axis] >= split || p3[axis] >= split) { + toright = true; + } + } else if (p1[axis] > split) { + toright = true; + if (p2[axis] <= split || p3[axis] <= split) { + toleft = true; + } + } else { + // p1[axis] == split; + toleft = true; + toright = true; + } + if (toleft) { + leftarray[leftsize] = sface1.sh; + leftsize++; + } + if (toright) { + rightarray[rightsize] = sface1.sh; + rightsize++; + } + } + + if (leftsize < arraysize && rightsize < arraysize) { + // Continue to partition the input set. Now 'subfacearray' has been + // split into two sets, it's memory can be freed. 'leftarray' and + // 'rightarray' will be freed in the next recursive (after they're + // partitioned again or performing tests). + delete [] subfacearray; + // Continue to split these two sets. + if (axis == 0) { + interecursive(leftarray, leftsize, 1, bxmin, split, bymin, bymax, + bzmin, bzmax, internum); + interecursive(rightarray, rightsize, 1, split, bxmax, bymin, bymax, + bzmin, bzmax, internum); + } else if (axis == 1) { + interecursive(leftarray, leftsize, 2, bxmin, bxmax, bymin, split, + bzmin, bzmax, internum); + interecursive(rightarray, rightsize, 2, bxmin, bxmax, split, bymax, + bzmin, bzmax, internum); + } else { + interecursive(leftarray, leftsize, 0, bxmin, bxmax, bymin, bymax, + bzmin, split, internum); + interecursive(rightarray, rightsize, 0, bxmin, bxmax, bymin, bymax, + split, bzmax, internum); + } + } else { + if (b->verbose > 1) { + printf(" Checking intersecting faces.\n"); + } + // Perform a brute-force compare on the set. + for (i = 0; i < arraysize; i++) { + sface1.sh = subfacearray[i]; + p1 = (point) sface1.sh[3]; + p2 = (point) sface1.sh[4]; + p3 = (point) sface1.sh[5]; + for (j = i + 1; j < arraysize; j++) { + sface2.sh = subfacearray[j]; + p4 = (point) sface2.sh[3]; + p5 = (point) sface2.sh[4]; + p6 = (point) sface2.sh[5]; + intersect = (enum interresult) tri_tri_inter(p1, p2, p3, p4, p5, p6); + if (intersect == INTERSECT || intersect == SHAREFACE) { + if (!b->quiet) { + if (intersect == INTERSECT) { + printf(" Facet #%d intersects facet #%d at triangles:\n", + shellmark(sface1), shellmark(sface2)); + printf(" (%4d, %4d, %4d) and (%4d, %4d, %4d)\n", + pointmark(p1), pointmark(p2), pointmark(p3), + pointmark(p4), pointmark(p5), pointmark(p6)); + } else { + printf(" Facet #%d duplicates facet #%d at triangle:\n", + shellmark(sface1), shellmark(sface2)); + printf(" (%4d, %4d, %4d) and (%4d, %4d, %4d)\n", + pointmark(p1), pointmark(p2), pointmark(p3), + pointmark(p4), pointmark(p5), pointmark(p6)); + } + } + // Increase the number of intersecting pairs. + (*internum)++; + // Infect these two faces (although they may already be infected). + sinfect(sface1); + sinfect(sface2); + } + } + } + // Don't forget to free all three arrays. No further partition. + delete [] leftarray; + delete [] rightarray; + delete [] subfacearray; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// detectinterfaces() Detect intersecting triangles. // +// // +// Given a set of triangles, find the pairs of intersecting triangles from // +// them. Here the set of triangles is in 'subfaces' which is a surface mesh // +// of a PLC (.poly or .smesh). // +// // +// To detect whether two triangles are intersecting is done by the routine // +// 'tri_tri_inter()'. The algorithm for the test is very simple and stable. // +// It is based on geometric orientation test which uses exact arithmetics. // +// // +// Use divide-and-conquer algorithm for reducing the number of intersection // +// tests. Start from the bounding box of the input point set, recursively // +// partition the box into smaller boxes, until the number of triangles in a // +// box is not decreased anymore. Then perform triangle-triangle tests on the // +// remaining set of triangles. The memory allocated in the input set is // +// freed immediately after it has been partitioned into two arrays. So it // +// can be re-used for the consequent partitions. // +// // +// On return, the pool 'subfaces' will be cleared, and only the intersecting // +// triangles remain for output (to a .face file). // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::detectinterfaces() +{ + shellface **subfacearray; + face shloop; + int internum; + int i; + + if (!b->quiet) { + printf("Detecting self-intersecting facets...\n"); + } + + // Construct a map from indices to subfaces; + subfacearray = new shellface*[subfaces->items]; + subfaces->traversalinit(); + shloop.sh = shellfacetraverse(subfaces); + i = 0; + while (shloop.sh != (shellface *) NULL) { + subfacearray[i] = shloop.sh; + shloop.sh = shellfacetraverse(subfaces); + i++; + } + + internum = 0; + // Recursively split the set of triangles into two sets using a cut plane + // parallel to x-, or, y-, or z-axis. Stop splitting when the number + // of subfaces is not decreasing anymore. Do tests on the current set. + interecursive(subfacearray, subfaces->items, 0, xmin, xmax, ymin, ymax, + zmin, zmax, &internum); + + if (!b->quiet) { + if (internum > 0) { + printf("\n!! Found %d pairs of faces are intersecting.\n\n", internum); + } else { + printf("\nNo faces are intersecting.\n\n"); + } + } + + if (internum > 0) { + // Traverse all subfaces, deallocate those have not been infected (they + // are not intersecting faces). Uninfect those have been infected. + // After this loop, only intersecting faces remain. + subfaces->traversalinit(); + shloop.sh = shellfacetraverse(subfaces); + while (shloop.sh != (shellface *) NULL) { + if (sinfected(shloop)) { + suninfect(shloop); + } else { + shellfacedealloc(subfaces, shloop.sh); + } + shloop.sh = shellfacetraverse(subfaces); + } + } else { + // Deallocate all subfaces. + subfaces->restart(); + } +} + +//// //// +//// //// +//// surface_cxx ////////////////////////////////////////////////////////////// + +//// constrained_cxx ////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// makesegmentendpointsmap() Create a map from a segment to its endpoints.// +// // +// The map is saved in the array 'segmentendpointslist'. The length of this // +// array is twice the number of segments. Each segment is assigned a unique // +// index (starting from 0). // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::makesegmentendpointsmap() +{ + arraypool *segptlist; + face segloop, prevseg, nextseg; + point eorg, edest, *parypt; + int segindex = 0, idx = 0; + int i; + + if (b->verbose > 0) { + printf(" Creating the segment-endpoints map.\n"); + } + + segptlist = new arraypool(2 * sizeof(point), 10); + + // A segment s may have been split into many subsegments. Operate the one + // which contains the origin of s. Then mark the rest of subsegments. + subsegs->traversalinit(); + segloop.sh = shellfacetraverse(subsegs); + segloop.shver = 0; + while (segloop.sh != NULL) { + senext2(segloop, prevseg); + spivotself(prevseg); + if (prevseg.sh == NULL) { + eorg = sorg(segloop); + edest = sdest(segloop); + setfacetindex(segloop, segindex); + senext(segloop, nextseg); + spivotself(nextseg); + while (nextseg.sh != NULL) { + setfacetindex(nextseg, segindex); + nextseg.shver = 0; + if (sorg(nextseg) != edest) sesymself(nextseg); + edest = sdest(nextseg); + // Go the next connected subsegment at edest. + senextself(nextseg); + spivotself(nextseg); + } + segptlist->newindex((void **) &parypt); + parypt[0] = eorg; + parypt[1] = edest; + segindex++; + } + segloop.sh = shellfacetraverse(subsegs); + } + + if (b->verbose) { + printf(" Found %ld segments.\n", segptlist->objects); + } + + segmentendpointslist = new point[segptlist->objects * 2]; + + totalworkmemory += (segptlist->objects * 2) * sizeof(point *); + + for (i = 0; i < segptlist->objects; i++) { + parypt = (point *) fastlookup(segptlist, i); + segmentendpointslist[idx++] = parypt[0]; + segmentendpointslist[idx++] = parypt[1]; + } + + delete segptlist; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// finddirection() Find the tet on the path from one point to another. // +// // +// The path starts from 'searchtet''s origin and ends at 'endpt'. On finish, // +// 'searchtet' contains a tet on the path, its origin does not change. // +// // +// The return value indicates one of the following cases (let 'searchtet' be // +// abcd, a is the origin of the path): // +// - ACROSSVERT, edge ab is collinear with the path; // +// - ACROSSEDGE, edge bc intersects with the path; // +// - ACROSSFACE, face bcd intersects with the path. // +// // +// WARNING: This routine is designed for convex triangulations, and will not // +// generally work after the holes and concavities have been carved. // +// // +/////////////////////////////////////////////////////////////////////////////// + +enum tetgenmesh::interresult + tetgenmesh::finddirection(triface* searchtet, point endpt) +{ + triface neightet; + point pa, pb, pc, pd; + enum {HMOVE, RMOVE, LMOVE} nextmove; + REAL hori, rori, lori; + int t1ver; + int s; + + // The origin is fixed. + pa = org(*searchtet); + if ((point) searchtet->tet[7] == dummypoint) { + // A hull tet. Choose the neighbor of its base face. + decode(searchtet->tet[3], *searchtet); + // Reset the origin to be pa. + if ((point) searchtet->tet[4] == pa) { + searchtet->ver = 11; + } else if ((point) searchtet->tet[5] == pa) { + searchtet->ver = 3; + } else if ((point) searchtet->tet[6] == pa) { + searchtet->ver = 7; + } else { + searchtet->ver = 0; + } + } + + pb = dest(*searchtet); + // Check whether the destination or apex is 'endpt'. + if (pb == endpt) { + // pa->pb is the search edge. + return ACROSSVERT; + } + + pc = apex(*searchtet); + if (pc == endpt) { + // pa->pc is the search edge. + eprevesymself(*searchtet); + return ACROSSVERT; + } + + // Walk through tets around pa until the right one is found. + while (1) { + + pd = oppo(*searchtet); + // Check whether the opposite vertex is 'endpt'. + if (pd == endpt) { + // pa->pd is the search edge. + esymself(*searchtet); + enextself(*searchtet); + return ACROSSVERT; + } + // Check if we have entered outside of the domain. + if (pd == dummypoint) { + // This is possible when the mesh is non-convex. + if (nonconvex) { + return ACROSSFACE; // return ACROSSSUB; // Hit a bounday. + } else { + terminatetetgen(this, 2); + } + } + + // Now assume that the base face abc coincides with the horizon plane, + // and d lies above the horizon. The search point 'endpt' may lie + // above or below the horizon. We test the orientations of 'endpt' + // with respect to three planes: abc (horizon), bad (right plane), + // and acd (left plane). + hori = orient3d(pa, pb, pc, endpt); + rori = orient3d(pb, pa, pd, endpt); + lori = orient3d(pa, pc, pd, endpt); + + // Now decide the tet to move. It is possible there are more than one + // tets are viable moves. Is so, randomly choose one. + if (hori > 0) { + if (rori > 0) { + if (lori > 0) { + // Any of the three neighbors is a viable move. + s = randomnation(3); + if (s == 0) { + nextmove = HMOVE; + } else if (s == 1) { + nextmove = RMOVE; + } else { + nextmove = LMOVE; + } + } else { + // Two tets, below horizon and below right, are viable. + if (randomnation(2)) { + nextmove = HMOVE; + } else { + nextmove = RMOVE; + } + } + } else { + if (lori > 0) { + // Two tets, below horizon and below left, are viable. + if (randomnation(2)) { + nextmove = HMOVE; + } else { + nextmove = LMOVE; + } + } else { + // The tet below horizon is chosen. + nextmove = HMOVE; + } + } + } else { + if (rori > 0) { + if (lori > 0) { + // Two tets, below right and below left, are viable. + if (randomnation(2)) { + nextmove = RMOVE; + } else { + nextmove = LMOVE; + } + } else { + // The tet below right is chosen. + nextmove = RMOVE; + } + } else { + if (lori > 0) { + // The tet below left is chosen. + nextmove = LMOVE; + } else { + // 'endpt' lies either on the plane(s) or across face bcd. + if (hori == 0) { + if (rori == 0) { + // pa->'endpt' is COLLINEAR with pa->pb. + return ACROSSVERT; + } + if (lori == 0) { + // pa->'endpt' is COLLINEAR with pa->pc. + eprevesymself(*searchtet); // [a,c,d] + return ACROSSVERT; + } + // pa->'endpt' crosses the edge pb->pc. + return ACROSSEDGE; + } + if (rori == 0) { + if (lori == 0) { + // pa->'endpt' is COLLINEAR with pa->pd. + esymself(*searchtet); // face bad. + enextself(*searchtet); // face [a,d,b] + return ACROSSVERT; + } + // pa->'endpt' crosses the edge pb->pd. + esymself(*searchtet); // face bad. + enextself(*searchtet); // face adb + return ACROSSEDGE; + } + if (lori == 0) { + // pa->'endpt' crosses the edge pc->pd. + eprevesymself(*searchtet); // [a,c,d] + return ACROSSEDGE; + } + // pa->'endpt' crosses the face bcd. + return ACROSSFACE; + } + } + } + + // Move to the next tet, fix pa as its origin. + if (nextmove == RMOVE) { + fnextself(*searchtet); + } else if (nextmove == LMOVE) { + eprevself(*searchtet); + fnextself(*searchtet); + enextself(*searchtet); + } else { // HMOVE + fsymself(*searchtet); + enextself(*searchtet); + } + pb = dest(*searchtet); + pc = apex(*searchtet); + + } // while (1) + +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// scoutsegment() Search an edge in the tetrahedralization. // +// // +// If the edge is found, it returns SHAREEDGE, and 'searchtet' returns the // +// edge from startpt to endpt. // +// // +// If the edge is missing, it returns either ACROSSEDGE or ACROSSFACE, which // +// indicates that the edge intersects an edge or a face. If 'refpt' is NULL,// +// 'searchtet' returns the edge or face. If 'refpt' is not NULL, it returns // +// a vertex which encroaches upon this edge, and 'searchtet' returns a tet // +// which containing 'refpt'. // +// // +// The parameter 'sedge' is used to report self-intersection. It is the // +// whose endpoints are 'startpt' and 'endpt'. It must not be a NULL. +// // +/////////////////////////////////////////////////////////////////////////////// + +enum tetgenmesh::interresult tetgenmesh::scoutsegment(point startpt,point endpt, + face *sedge, triface* searchtet, point* refpt, arraypool* intfacelist) +{ + point pd; + enum interresult dir; + int t1ver; + + if (b->verbose > 2) { + printf(" Scout seg (%d, %d).\n",pointmark(startpt),pointmark(endpt)); + } + + point2tetorg(startpt, *searchtet); + dir = finddirection(searchtet, endpt); + + if (dir == ACROSSVERT) { + pd = dest(*searchtet); + if (pd == endpt) { + if (issubseg(*searchtet)) { + report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + } + return SHAREEDGE; + } else { + // A point is on the path. + report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + return ACROSSVERT; + } + } + + // dir is either ACROSSEDGE or ACROSSFACE. + enextesymself(*searchtet); // Go to the opposite face. + fsymself(*searchtet); // Enter the adjacent tet. + + if (dir == ACROSSEDGE) { + // Check whether two segments are intersecting. + if (issubseg(*searchtet)) { + report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + } + } else if (dir == ACROSSFACE) { + if (checksubfaceflag) { + // Check whether a segment and a subface are intersecting. + if (issubface(*searchtet)) { + report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + } + } + } else { + terminatetetgen(this, 2); + } + + if (refpt == NULL) { + // Do not need a reference point. Return. + return dir; + } + + triface neightet, reftet; + point pa, pb, pc; + REAL angmax, ang; + int types[2], poss[4]; + int pos = 0, i, j; + + pa = org(*searchtet); + angmax = interiorangle(pa, startpt, endpt, NULL); + *refpt = pa; + pb = dest(*searchtet); + ang = interiorangle(pb, startpt, endpt, NULL); + if (ang > angmax) { + angmax = ang; + *refpt = pb; + } + pc = apex(*searchtet); + ang = interiorangle(pc, startpt, endpt, NULL); + if (ang > angmax) { + angmax = ang; + *refpt = pc; + } + reftet = *searchtet; // Save the tet containing the refpt. + + // Search intersecting faces along the segment. + while (1) { + + + pd = oppo(*searchtet); + + + // Stop if we meet 'endpt'. + if (pd == endpt) break; + + ang = interiorangle(pd, startpt, endpt, NULL); + if (ang > angmax) { + angmax = ang; + *refpt = pd; + reftet = *searchtet; + } + + // Find a face intersecting the segment. + if (dir == ACROSSFACE) { + // One of the three oppo faces in 'searchtet' intersects the segment. + neightet = *searchtet; + j = (neightet.ver & 3); // j is the current face number. + for (i = j + 1; i < j + 4; i++) { + neightet.ver = (i % 4); + pa = org(neightet); + pb = dest(neightet); + pc = apex(neightet); + pd = oppo(neightet); // The above point. + if (tri_edge_test(pa, pb, pc, startpt, endpt, pd, 1, types, poss)) { + dir = (enum interresult) types[0]; + pos = poss[0]; + break; + } else { + dir = DISJOINT; + pos = 0; + } + } + } else if (dir == ACROSSEDGE) { + // Check the two opposite faces (of the edge) in 'searchtet'. + for (i = 0; i < 2; i++) { + if (i == 0) { + enextesym(*searchtet, neightet); + } else { + eprevesym(*searchtet, neightet); + } + pa = org(neightet); + pb = dest(neightet); + pc = apex(neightet); + pd = oppo(neightet); // The above point. + if (tri_edge_test(pa, pb, pc, startpt, endpt, pd, 1, types, poss)) { + dir = (enum interresult) types[0]; + pos = poss[0]; + break; + } else { + dir = DISJOINT; + pos = 0; + } + } + if (dir == DISJOINT) { + // No intersection. Rotate to the next tet at the edge. + dir = ACROSSEDGE; + fnextself(*searchtet); + continue; + } + } + + if (dir == ACROSSVERT) { + // This segment passing a vertex. Choose it and return. + for (i = 0; i < pos; i++) { + enextself(neightet); + } + eprev(neightet, *searchtet); + // dest(*searchtet) lies on the segment. + report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + return ACROSSVERT; + } else if (dir == ACROSSEDGE) { + // Get the edge intersects with the segment. + for (i = 0; i < pos; i++) { + enextself(neightet); + } + } + // Go to the next tet. + fsym(neightet, *searchtet); + + if (dir == ACROSSEDGE) { + // Check whether two segments are intersecting. + if (issubseg(*searchtet)) { + report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + } + } else if (dir == ACROSSFACE) { + if (checksubfaceflag) { + // Check whether a segment and a subface are intersecting. + if (issubface(*searchtet)) { + report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + } + } + } else { + terminatetetgen(this, 2); + } + + } // while (1) + + // A valid reference point should inside the diametrial circumsphere of + // the missing segment, i.e., it encroaches upon it. + if (2.0 * angmax < PI) { + *refpt = NULL; + } + + + *searchtet = reftet; + return dir; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// getsteinerpointonsegment() Get a Steiner point on a segment. // +// // +// Return '1' if 'refpt' lies on an adjacent segment of this segment. Other- // +// wise, return '0'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::getsteinerptonsegment(face* seg, point refpt, point steinpt) +{ + point ei = sorg(*seg); + point ej = sdest(*seg); + int adjflag = 0, i; + + if (refpt != NULL) { + REAL L, L1, t; + + if (pointtype(refpt) == FREESEGVERTEX) { + face parentseg; + sdecode(point2sh(refpt), parentseg); + int sidx1 = getfacetindex(parentseg); + point far_pi = segmentendpointslist[sidx1 * 2]; + point far_pj = segmentendpointslist[sidx1 * 2 + 1]; + int sidx2 = getfacetindex(*seg); + point far_ei = segmentendpointslist[sidx2 * 2]; + point far_ej = segmentendpointslist[sidx2 * 2 + 1]; + if ((far_pi == far_ei) || (far_pj == far_ei)) { + // Create a Steiner point at the intersection of the segment + // [far_ei, far_ej] and the sphere centered at far_ei with + // radius |far_ei - refpt|. + L = distance(far_ei, far_ej); + L1 = distance(far_ei, refpt); + t = L1 / L; + for (i = 0; i < 3; i++) { + steinpt[i] = far_ei[i] + t * (far_ej[i] - far_ei[i]); + } + adjflag = 1; + } else if ((far_pi == far_ej) || (far_pj == far_ej)) { + L = distance(far_ei, far_ej); + L1 = distance(far_ej, refpt); + t = L1 / L; + for (i = 0; i < 3; i++) { + steinpt[i] = far_ej[i] + t * (far_ei[i] - far_ej[i]); + } + adjflag = 1; + } else { + // Cut the segment by the projection point of refpt. + projpt2edge(refpt, ei, ej, steinpt); + } + } else { + // Cut the segment by the projection point of refpt. + projpt2edge(refpt, ei, ej, steinpt); + } + + // Make sure that steinpt is not too close to ei and ej. + L = distance(ei, ej); + L1 = distance(steinpt, ei); + t = L1 / L; + if ((t < 0.2) || (t > 0.8)) { + // Split the point at the middle. + for (i = 0; i < 3; i++) { + steinpt[i] = ei[i] + 0.5 * (ej[i] - ei[i]); + } + } + } else { + // Split the point at the middle. + for (i = 0; i < 3; i++) { + steinpt[i] = ei[i] + 0.5 * (ej[i] - ei[i]); + } + } + + + return adjflag; +} + + + +/////////////////////////////////////////////////////////////////////////////// +// // +// delaunizesegments() Recover segments in a DT. // +// // +// All segments need to be recovered are in 'subsegstack' (Q). They will be // +// be recovered one by one (in a random order). // +// // +// Given a segment s in the Q, this routine first queries s in the DT, if s // +// matches an edge in DT, it is 'locked' at the edge. Otherwise, s is split // +// by inserting a new point p in both the DT and itself. The two new subseg- // +// ments of s are queued in Q. The process continues until Q is empty. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::delaunizesegments() +{ + triface searchtet, spintet; + face searchsh; + face sseg, *psseg; + point refpt, newpt; + enum interresult dir; + insertvertexflags ivf; + int t1ver; + + + ivf.bowywat = 1; // Use Bowyer-Watson insertion. + ivf.sloc = (int) ONEDGE; // on 'sseg'. + ivf.sbowywat = 1; // Use Bowyer-Watson insertion. + ivf.assignmeshsize = b->metric; + ivf.smlenflag = useinsertradius; // Return the closet mesh vertex. + + // Loop until 'subsegstack' is empty. + while (subsegstack->objects > 0l) { + // seglist is used as a stack. + subsegstack->objects--; + psseg = (face *) fastlookup(subsegstack, subsegstack->objects); + sseg = *psseg; + + // Check if this segment has been recovered. + sstpivot1(sseg, searchtet); + if (searchtet.tet != NULL) { + continue; // Not a missing segment. + } + + // Search the segment. + dir = scoutsegment(sorg(sseg), sdest(sseg), &sseg,&searchtet,&refpt,NULL); + + if (dir == SHAREEDGE) { + // Found this segment, insert it. + // Let the segment remember an adjacent tet. + sstbond1(sseg, searchtet); + // Bond the segment to all tets containing it. + spintet = searchtet; + do { + tssbond1(spintet, sseg); + fnextself(spintet); + } while (spintet.tet != searchtet.tet); + } else { + if ((dir == ACROSSFACE) || (dir == ACROSSEDGE)) { + // The segment is missing. Split it. + // Create a new point. + makepoint(&newpt, FREESEGVERTEX); + //setpointtype(newpt, FREESEGVERTEX); + getsteinerptonsegment(&sseg, refpt, newpt); + + // Start searching from 'searchtet'. + ivf.iloc = (int) OUTSIDE; + // Insert the new point into the tetrahedralization T. + // Missing segments and subfaces are queued for recovery. + // Note that T is convex (nonconvex = 0). + if (insertpoint(newpt, &searchtet, &searchsh, &sseg, &ivf)) { + // The new point has been inserted. + st_segref_count++; + if (steinerleft > 0) steinerleft--; + if (useinsertradius) { + save_segmentpoint_insradius(newpt, ivf.parentpt, ivf.smlen); + } + } else { + if (ivf.iloc == (int) NEARVERTEX) { + // The new point (in the segment) is very close to an existing + // vertex -- a small feature is detected. + point nearpt = org(searchtet); + if (pointtype(nearpt) == FREESEGVERTEX) { + face parentseg; + sdecode(point2sh(nearpt), parentseg); + point p1 = farsorg(sseg); + point p2 = farsdest(sseg); + point p3 = farsorg(parentseg); + point p4 = farsdest(parentseg); + printf("Two segments are very close to each other.\n"); + printf(" Segment 1: [%d, %d] #%d\n", pointmark(p1), + pointmark(p2), shellmark(sseg)); + printf(" Segment 2: [%d, %d] #%d\n", pointmark(p3), + pointmark(p4), shellmark(parentseg)); + terminatetetgen(this, 4); + } else { + terminatetetgen(this, 2); + } + } else if (ivf.iloc == (int) ONVERTEX) { + // The new point (in the segment) is coincident with an existing + // vertex -- a self-intersection is detected. + eprevself(searchtet); + report_selfint_edge(sorg(sseg), sdest(sseg), &sseg, &searchtet, + ACROSSVERT); + } else { + // An unknown case. Report a bug. + terminatetetgen(this, 2); + } + } + } else { + // An unknown case. Report a bug. + terminatetetgen(this, 2); + } + } + } // while +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// scoutsubface() Search subface in the tetrahedralization. // +// // +// 'searchsh' is searched in T. If it exists, it is 'locked' at the face in // +// T. 'searchtet' refers to the face. Otherwise, it is missing. // +// // +// The parameter 'shflag' indicates whether 'searchsh' is a boundary face or // +// not. It is possible that 'searchsh' is a temporarily subface that is used // +// as a cavity boundary face. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::scoutsubface(face* searchsh, triface* searchtet, int shflag) +{ + point pa = sorg(*searchsh); + point pb = sdest(*searchsh); + + // Get a tet whose origin is a. + point2tetorg(pa, *searchtet); + // Search the edge [a,b]. + enum interresult dir = finddirection(searchtet, pb); + if (dir == ACROSSVERT) { + // Check validity of a PLC. + if (dest(*searchtet) != pb) { + if (shflag) { + // A vertex lies on the search edge. + report_selfint_edge(pa, pb, searchsh, searchtet, dir); + } else { + terminatetetgen(this, 2); + } + } + int t1ver; + // The edge exists. Check if the face exists. + point pc = sapex(*searchsh); + // Searchtet holds edge [a,b]. Search a face with apex c. + triface spintet = *searchtet; + while (1) { + if (apex(spintet) == pc) { + // Found a face matching to 'searchsh'! + if (!issubface(spintet)) { + // Insert 'searchsh'. + tsbond(spintet, *searchsh); + fsymself(spintet); + sesymself(*searchsh); + tsbond(spintet, *searchsh); + *searchtet = spintet; + return 1; + } else { + terminatetetgen(this, 2); + } + } + fnextself(spintet); + if (spintet.tet == searchtet->tet) break; + } + } + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// formregion() Form the missing region of a missing subface. // +// // +// 'missh' is a missing subface. From it we form a missing region R which is // +// a connected region formed by a set of missing subfaces of a facet. // +// Comment: There should be no segment inside R. // +// // +// 'missingshs' returns the list of subfaces in R. All subfaces in this list // +// are oriented as the 'missh'. 'missingshbds' returns the list of boundary // +// edges (tetrahedral handles) of R. 'missingshverts' returns all vertices // +// of R. They are all pmarktested. // +// // +// Except the first one (which is 'missh') in 'missingshs', each subface in // +// this list represents an internal edge of R, i.e., it is missing in the // +// tetrahedralization. Since R may contain interior vertices, not all miss- // +// ing edges can be found by this way. // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::formregion(face* missh, arraypool* missingshs, + arraypool* missingshbds, arraypool* missingshverts) +{ + triface searchtet, spintet; + face neighsh, *parysh; + face neighseg, fakeseg; + point pa, pb, *parypt; + enum interresult dir; + int t1ver; + int i, j; + + smarktest(*missh); + missingshs->newindex((void **) &parysh); + *parysh = *missh; + + // Incrementally find other missing subfaces. + for (i = 0; i < missingshs->objects; i++) { + missh = (face *) fastlookup(missingshs, i); + for (j = 0; j < 3; j++) { + pa = sorg(*missh); + pb = sdest(*missh); + point2tetorg(pa, searchtet); + dir = finddirection(&searchtet, pb); + if (dir != ACROSSVERT) { + // This edge is missing. Its neighbor is a missing subface. + spivot(*missh, neighsh); + if (!smarktested(neighsh)) { + // Adjust the face orientation. + if (sorg(neighsh) != pb) sesymself(neighsh); + smarktest(neighsh); + missingshs->newindex((void **) &parysh); + *parysh = neighsh; + } + } else { + if (dest(searchtet) != pb) { + // Report a PLC problem. + report_selfint_edge(pa, pb, missh, &searchtet, dir); + } + } + // Collect the vertices of R. + if (!pmarktested(pa)) { + pmarktest(pa); + missingshverts->newindex((void **) &parypt); + *parypt = pa; + } + senextself(*missh); + } // j + } // i + + // Get the boundary edges of R. + for (i = 0; i < missingshs->objects; i++) { + missh = (face *) fastlookup(missingshs, i); + for (j = 0; j < 3; j++) { + spivot(*missh, neighsh); + if ((neighsh.sh == NULL) || !smarktested(neighsh)) { + // A boundary edge of R. + // Let the segment point to the adjacent tet. + point2tetorg(sorg(*missh), searchtet); + finddirection(&searchtet, sdest(*missh)); + missingshbds->newindex((void **) &parysh); + *parysh = *missh; + // Check if this edge is a segment. + sspivot(*missh, neighseg); + if (neighseg.sh == NULL) { + // Temporarily create a segment at this edge. + makeshellface(subsegs, &fakeseg); + setsorg(fakeseg, sorg(*missh)); + setsdest(fakeseg, sdest(*missh)); + sinfect(fakeseg); // Mark it as faked. + // Connect it to all tets at this edge. + spintet = searchtet; + while (1) { + tssbond1(spintet, fakeseg); + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + neighseg = fakeseg; + } + // Let the segment and the boundary edge point to each other. + ssbond(*missh, neighseg); + sstbond1(neighseg, searchtet); + } + senextself(*missh); + } // j + } // i + + + // Unmarktest collected missing subfaces. + for (i = 0; i < missingshs->objects; i++) { + parysh = (face *) fastlookup(missingshs, i); + sunmarktest(*parysh); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// scoutcrossedge() Search an edge that crosses the missing region. // +// // +// Return 1 if a crossing edge is found. It is returned by 'crosstet'. More- // +// over, the edge is oriented such that its origin lies below R. Return 0 // +// if no such edge is found. // +// // +// Assumption: All vertices of the missing region are marktested. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::scoutcrossedge(triface& crosstet, arraypool* missingshbds, + arraypool* missingshs) +{ + triface searchtet, spintet, neightet; + face oldsh, searchsh, *parysh; + face neighseg; + point pa, pb, pc, pd, pe; + REAL ori; + int types[2], poss[4]; + int searchflag, interflag; + int t1ver; + int i, j; + + searchflag = 0; + + // Search the first new subface to fill the region. + for (i = 0; i < missingshbds->objects && !searchflag; i++) { + parysh = (face *) fastlookup(missingshbds, i); + sspivot(*parysh, neighseg); + sstpivot1(neighseg, searchtet); + if (org(searchtet) != sorg(*parysh)) { + esymself(searchtet); + } + spintet = searchtet; + while (1) { + if (pmarktested(apex(spintet))) { + // A possible interior face. + neightet = spintet; + oldsh = *parysh; + // Try to recover an interior edge. + for (j = 0; j < 2; j++) { + enextself(neightet); + if (!issubseg(neightet)) { + if (j == 0) { + senext(oldsh, searchsh); + } else { + senext2(oldsh, searchsh); + sesymself(searchsh); + esymself(neightet); + } + // Calculate a lifted point. + pa = sorg(searchsh); + pb = sdest(searchsh); + pc = sapex(searchsh); + pd = dest(neightet); + calculateabovepoint4(pa, pb, pc, pd); + // The lifted point must lie above 'searchsh'. + ori = orient3d(pa, pb, pc, dummypoint); + if (ori > 0) { + sesymself(searchsh); + senextself(searchsh); + } else if (ori == 0) { + terminatetetgen(this, 2); + } + if (sscoutsegment(&searchsh,dest(neightet),0,0,1)==SHAREEDGE) { + // Insert a temp segment to protect the recovered edge. + face tmpseg; + makeshellface(subsegs, &tmpseg); + ssbond(searchsh, tmpseg); + spivotself(searchsh); + ssbond(searchsh, tmpseg); + // Recover locally Delaunay edges. + lawsonflip(); + // Delete the tmp segment. + spivot(tmpseg, searchsh); + ssdissolve(searchsh); + spivotself(searchsh); + ssdissolve(searchsh); + shellfacedealloc(subsegs, tmpseg.sh); + searchflag = 1; + } else { + // Undo the performed flips. + if (flipstack != NULL) { + lawsonflip(); + } + } + break; + } // if (!issubseg(neightet)) + } // j + if (searchflag) break; + } // if (pmarktested(apex(spintet))) + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + } // i + + if (searchflag) { + // Remove faked segments. + face checkseg; + // Remark: We should not use the array 'missingshbds', since the flips may + // change the subfaces. We search them from the subfaces in R. + for (i = 0; i < missingshs->objects; i++) { + parysh = (face *) fastlookup(missingshs, i); + oldsh = *parysh; + for (j = 0; j < 3; j++) { + if (isshsubseg(oldsh)) { + sspivot(oldsh, checkseg); + if (sinfected(checkseg)) { + // It's a faked segment. Delete it. + sstpivot1(checkseg, searchtet); + spintet = searchtet; + while (1) { + tssdissolve1(spintet); + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + shellfacedealloc(subsegs, checkseg.sh); + ssdissolve(oldsh); + } + } + senextself(oldsh); + } // j + } + + fillregioncount++; + + return 0; + } // if (i < missingshbds->objects) + + searchflag = -1; + + for (j = 0; j < missingshbds->objects && (searchflag == -1); j++) { + parysh = (face *) fastlookup(missingshbds, j); + sspivot(*parysh, neighseg); + sstpivot1(neighseg, searchtet); + interflag = 0; + // Let 'spintet' be [#,#,d,e] where [#,#] is the boundary edge of R. + spintet = searchtet; + while (1) { + pd = apex(spintet); + pe = oppo(spintet); + // Skip a hull edge. + if ((pd != dummypoint) && (pe != dummypoint)) { + // Skip an edge containing a vertex of R. + if (!pmarktested(pd) && !pmarktested(pe)) { + // Check if [d,e] intersects R. + for (i = 0; i < missingshs->objects && !interflag; i++) { + parysh = (face *) fastlookup(missingshs, i); + pa = sorg(*parysh); + pb = sdest(*parysh); + pc = sapex(*parysh); + interflag=tri_edge_test(pa, pb, pc, pd, pe, NULL, 1, types, poss); + if (interflag > 0) { + if (interflag == 2) { + // They intersect at a single point. + if ((types[0] == (int) ACROSSFACE) || + (types[0] == (int) ACROSSEDGE)) { + // Go to the crossing edge [d,e,#,#]. + edestoppo(spintet, crosstet); // // [d,e,#,#]. + if (issubseg(crosstet)) { + // It is a segment. Report a PLC problem. + report_selfint_face(pa, pb, pc, parysh, &crosstet, + interflag, types, poss); + } else { + triface chkface = crosstet; + while (1) { + if (issubface(chkface)) break; + fsymself(chkface); + if (chkface.tet == crosstet.tet) break; + } + if (issubface(chkface)) { + // Two subfaces are intersecting. + report_selfint_face(pa, pb, pc, parysh, &chkface, + interflag, types, poss); + } + } + // Adjust the edge such that d lies below [a,b,c]. + ori = orient3d(pa, pb, pc, pd); + if (ori < 0) { + esymself(crosstet); + } + searchflag = 1; + } else { + // An improper intersection type, ACROSSVERT, TOUCHFACE, + // TOUCHEDGE, SHAREVERT, ... + // Maybe it is due to a PLC problem. + report_selfint_face(pa, pb, pc, parysh, &crosstet, + interflag, types, poss); + } + } + break; + } // if (interflag > 0) + } + } + } + // Leave search at this bdry edge if an intersection is found. + if (interflag > 0) break; + // Go to the next tetrahedron. + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } // while (1) + } // j + + return searchflag; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// formcavity() Form the cavity of a missing region. // +// // +// The missing region R is formed by a set of missing subfaces 'missingshs'. // +// In the following, we assume R is horizontal and oriented. (All subfaces // +// of R are oriented in the same way.) 'searchtet' is a tetrahedron [d,e,#, // +// #] which intersects R in its interior, where the edge [d,e] intersects R, // +// and d lies below R. // +// // +// 'crosstets' returns the set of crossing tets. Every tet in it has the // +// form [d,e,#,#] where [d,e] is a crossing edge, and d lies below R. The // +// set of tets form the cavity C, which is divided into two parts by R, one // +// at top and one at bottom. 'topfaces' and 'botfaces' return the upper and // +// lower boundary faces of C. 'toppoints' contains vertices of 'crosstets' // +// in the top part of C, and so does 'botpoints'. Both 'toppoints' and // +// 'botpoints' contain vertices of R. // +// // +// Important: This routine assumes all vertices of the facet containing this // +// subface are marked, i.e., pmarktested(p) returns true. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenmesh::formcavity(triface* searchtet, arraypool* missingshs, + arraypool* crosstets, arraypool* topfaces, + arraypool* botfaces, arraypool* toppoints, + arraypool* botpoints) +{ + arraypool *crossedges; + triface spintet, neightet, chkface, *parytet; + face *parysh = NULL; + point pa, pd, pe, *parypt; + bool testflag, invalidflag; + int intflag, types[2], poss[4]; + int t1ver; + int i, j, k; + + // Temporarily re-use 'topfaces' for all crossing edges. + crossedges = topfaces; + + if (b->verbose > 2) { + printf(" Form the cavity of a missing region.\n"); + } + // Mark this edge to avoid testing it later. + markedge(*searchtet); + crossedges->newindex((void **) &parytet); + *parytet = *searchtet; + + invalidflag = 0; + // Collect all crossing tets. Each cross tet is saved in the standard + // form [d,e,#,#], where [d,e] is a crossing edge, d lies below R. + // NEITHER d NOR e is a vertex of R (!pmarktested). + for (i = 0; i < crossedges->objects && !invalidflag; i++) { + // Get a crossing edge [d,e,#,#]. + searchtet = (triface *) fastlookup(crossedges, i); + // Sort vertices into the bottom and top arrays. + pd = org(*searchtet); + if (!pinfected(pd)) { + pinfect(pd); + botpoints->newindex((void **) &parypt); + *parypt = pd; + } + pe = dest(*searchtet); + if (!pinfected(pe)) { + pinfect(pe); + toppoints->newindex((void **) &parypt); + *parypt = pe; + } + + // All tets sharing this edge are crossing tets. + spintet = *searchtet; + while (1) { + if (!infected(spintet)) { + infect(spintet); + crosstets->newindex((void **) &parytet); + *parytet = spintet; + } + // Go to the next crossing tet. + fnextself(spintet); + if (spintet.tet == searchtet->tet) break; + } // while (1) + + // Detect new crossing edges. + spintet = *searchtet; + while (1) { + // spintet is [d,e,a,#], where d lies below R, and e lies above R. + pa = apex(spintet); + if (pa != dummypoint) { + if (!pmarktested(pa)) { + // There exists a crossing edge, either [e,a] or [a,d]. First check + // if the crossing edge has already be added, i.e.,to check if one + // of the tetrahedron at this edge has been marked. + testflag = true; + for (j = 0; j < 2 && testflag; j++) { + if (j == 0) { + enext(spintet, neightet); + } else { + eprev(spintet, neightet); + } + while (1) { + if (edgemarked(neightet)) { + // This crossing edge has already been tested. Skip it. + testflag = false; + break; + } + fnextself(neightet); + if (neightet.tet == spintet.tet) break; + } + } // j + if (testflag) { + // Test if [e,a] or [a,d] intersects R. + // Do a brute-force search in the set of subfaces of R. Slow! + // Need to be improved! + pd = org(spintet); + pe = dest(spintet); + for (k = 0; k < missingshs->objects; k++) { + parysh = (face *) fastlookup(missingshs, k); + intflag = tri_edge_test(sorg(*parysh), sdest(*parysh), + sapex(*parysh), pe, pa, NULL, 1, types, poss); + if (intflag > 0) { + // Found intersection. 'a' lies below R. + if (intflag == 2) { + enext(spintet, neightet); + if ((types[0] == (int) ACROSSFACE) || + (types[0] == (int) ACROSSEDGE)) { + // Only this case is valid. + } else { + // A non-valid intersection. Maybe a PLC problem. + invalidflag = 1; + } + } else { + // Coplanar intersection. Maybe a PLC problem. + invalidflag = 1; + } + break; + } + intflag = tri_edge_test(sorg(*parysh), sdest(*parysh), + sapex(*parysh), pa, pd, NULL, 1, types, poss); + if (intflag > 0) { + // Found intersection. 'a' lies above R. + if (intflag == 2) { + eprev(spintet, neightet); + if ((types[0] == (int) ACROSSFACE) || + (types[0] == (int) ACROSSEDGE)) { + // Only this case is valid. + } else { + // A non-valid intersection. Maybe a PLC problem. + invalidflag = 1; + } + } else { + // Coplanar intersection. Maybe a PLC problem. + invalidflag = 1; + } + break; + } + } // k + if (k < missingshs->objects) { + // Found a pair of triangle - edge intersection. + if (invalidflag) { + break; // the while (1) loop + } + // Adjust the edge direction, so that its origin lies below R, + // and its destination lies above R. + esymself(neightet); + // This edge may be a segment. + if (issubseg(neightet)) { + report_selfint_face(sorg(*parysh), sdest(*parysh), + sapex(*parysh),parysh,&neightet,intflag,types,poss); + } + // Check if it is an edge of a subface. + chkface = neightet; + while (1) { + if (issubface(chkface)) break; + fsymself(chkface); + if (chkface.tet == neightet.tet) break; + } + if (issubface(chkface)) { + // Two subfaces are intersecting. + report_selfint_face(sorg(*parysh), sdest(*parysh), + sapex(*parysh),parysh,&chkface,intflag,types,poss); + } + + // Mark this edge to avoid testing it again. + markedge(neightet); + crossedges->newindex((void **) &parytet); + *parytet = neightet; + } else { + // No intersection is found. It may be a PLC problem. + invalidflag = 1; + break; // the while (1) loop + } // if (k == missingshs->objects) + } // if (testflag) + } + } // if (pa != dummypoint) + // Go to the next crossing tet. + fnextself(spintet); + if (spintet.tet == searchtet->tet) break; + } // while (1) + } // i + + // Unmark all marked edges. + for (i = 0; i < crossedges->objects; i++) { + searchtet = (triface *) fastlookup(crossedges, i); + unmarkedge(*searchtet); + } + crossedges->restart(); + + + if (invalidflag) { + // Unmark all collected tets. + for (i = 0; i < crosstets->objects; i++) { + searchtet = (triface *) fastlookup(crosstets, i); + uninfect(*searchtet); + } + // Unmark all collected vertices. + for (i = 0; i < botpoints->objects; i++) { + parypt = (point *) fastlookup(botpoints, i); + puninfect(*parypt); + } + for (i = 0; i < toppoints->objects; i++) { + parypt = (point *) fastlookup(toppoints, i); + puninfect(*parypt); + } + crosstets->restart(); + botpoints->restart(); + toppoints->restart(); + + // Randomly split an interior edge of R. + i = randomnation(missingshs->objects - 1); + recentsh = * (face *) fastlookup(missingshs, i); + return false; + } + + if (b->verbose > 2) { + printf(" Formed cavity: %ld (%ld) cross tets (edges).\n", + crosstets->objects, crossedges->objects); + } + + // Collect the top and bottom faces and the middle vertices. Since all top + // and bottom vertices have been infected. Uninfected vertices must be + // middle vertices (i.e., the vertices of R). + // NOTE 1: Hull tets may be collected. Process them as a normal one. + // NOTE 2: Some previously recovered subfaces may be completely inside the + // cavity. In such case, we remove these subfaces from the cavity and put + // them into 'subfacstack'. They will be recovered later. + // NOTE 3: Some segments may be completely inside the cavity, e.g., they + // attached to a subface which is inside the cavity. Such segments are + // put in 'subsegstack'. They will be recovered later. + // NOTE4 : The interior subfaces and segments mentioned in NOTE 2 and 3 + // are identified in the routine "carvecavity()". + + for (i = 0; i < crosstets->objects; i++) { + searchtet = (triface *) fastlookup(crosstets, i); + // searchtet is [d,e,a,b]. + eorgoppo(*searchtet, spintet); + fsym(spintet, neightet); // neightet is [a,b,e,#] + if (!infected(neightet)) { + // A top face. + topfaces->newindex((void **) &parytet); + *parytet = neightet; + } + edestoppo(*searchtet, spintet); + fsym(spintet, neightet); // neightet is [b,a,d,#] + if (!infected(neightet)) { + // A bottom face. + botfaces->newindex((void **) &parytet); + *parytet = neightet; + } + // Add middle vertices if there are (skip dummypoint). + pa = org(neightet); + if (!pinfected(pa)) { + if (pa != dummypoint) { + pinfect(pa); + botpoints->newindex((void **) &parypt); + *parypt = pa; + toppoints->newindex((void **) &parypt); + *parypt = pa; + } + } + pa = dest(neightet); + if (!pinfected(pa)) { + if (pa != dummypoint) { + pinfect(pa); + botpoints->newindex((void **) &parypt); + *parypt = pa; + toppoints->newindex((void **) &parypt); + *parypt = pa; + } + } + } // i + + // Uninfect all collected top, bottom, and middle vertices. + for (i = 0; i < toppoints->objects; i++) { + parypt = (point *) fastlookup(toppoints, i); + puninfect(*parypt); + } + for (i = 0; i < botpoints->objects; i++) { + parypt = (point *) fastlookup(botpoints, i); + puninfect(*parypt); + } + cavitycount++; + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// delaunizecavity() Fill a cavity by Delaunay tetrahedra. // +// // +// The cavity C to be tetrahedralized is the top or bottom part of a whole // +// cavity. 'cavfaces' contains the boundary faces of C. NOTE: faces in 'cav- // +// faces' do not form a closed polyhedron. The "open" side are subfaces of // +// the missing facet. These faces will be recovered later in fillcavity(). // +// // +// This routine first constructs the DT of the vertices. Then it identifies // +// the half boundary faces of the cavity in DT. Possiblely the cavity C will // +// be enlarged. // +// // +// The DT is returned in 'newtets'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::delaunizecavity(arraypool *cavpoints, arraypool *cavfaces, + arraypool *cavshells, arraypool *newtets, + arraypool *crosstets, arraypool *misfaces) +{ + triface searchtet, neightet, *parytet, *parytet1; + face tmpsh, *parysh; + point pa, pb, pc, pd, pt[3], *parypt; + insertvertexflags ivf; + REAL ori; + long baknum, bakhullsize; + int bakchecksubsegflag, bakchecksubfaceflag; + int t1ver; + int i, j; + + if (b->verbose > 2) { + printf(" Delaunizing cavity: %ld points, %ld faces.\n", + cavpoints->objects, cavfaces->objects); + } + // Remember the current number of crossing tets. It may be enlarged later. + baknum = crosstets->objects; + bakhullsize = hullsize; + bakchecksubsegflag = checksubsegflag; + bakchecksubfaceflag = checksubfaceflag; + hullsize = 0l; + checksubsegflag = 0; + checksubfaceflag = 0; + b->verbose--; // Suppress informations for creating Delaunay tetra. + b->plc = 0; // Do not check near vertices. + + ivf.bowywat = 1; // Use Bowyer-Watson algorithm. + + // Get four non-coplanar points (no dummypoint). + pa = pb = pc = NULL; + for (i = 0; i < cavfaces->objects; i++) { + parytet = (triface *) fastlookup(cavfaces, i); + parytet->ver = epivot[parytet->ver]; + if (apex(*parytet) != dummypoint) { + pa = org(*parytet); + pb = dest(*parytet); + pc = apex(*parytet); + break; + } + } + pd = NULL; + for (; i < cavfaces->objects; i++) { + parytet = (triface *) fastlookup(cavfaces, i); + pt[0] = org(*parytet); + pt[1] = dest(*parytet); + pt[2] = apex(*parytet); + for (j = 0; j < 3; j++) { + if (pt[j] != dummypoint) { // Do not include a hull point. + ori = orient3d(pa, pb, pc, pt[j]); + if (ori != 0) { + pd = pt[j]; + if (ori > 0) { // Swap pa and pb. + pt[j] = pa; pa = pb; pb = pt[j]; + } + break; + } + } + } + if (pd != NULL) break; + } + + // Create an init DT. + initialdelaunay(pa, pb, pc, pd); + + // Incrementally insert the vertices (duplicated vertices are ignored). + for (i = 0; i < cavpoints->objects; i++) { + pt[0] = * (point *) fastlookup(cavpoints, i); + searchtet = recenttet; + ivf.iloc = (int) OUTSIDE; + insertpoint(pt[0], &searchtet, NULL, NULL, &ivf); + } + + if (b->verbose > 2) { + printf(" Identifying %ld boundary faces of the cavity.\n", + cavfaces->objects); + } + + while (1) { + + // Identify boundary faces. Mark interior tets. Save missing faces. + for (i = 0; i < cavfaces->objects; i++) { + parytet = (triface *) fastlookup(cavfaces, i); + // Skip an interior face (due to the enlargement of the cavity). + if (infected(*parytet)) continue; + parytet->ver = epivot[parytet->ver]; + pt[0] = org(*parytet); + pt[1] = dest(*parytet); + pt[2] = apex(*parytet); + // Create a temp subface. + makeshellface(subfaces, &tmpsh); + setshvertices(tmpsh, pt[0], pt[1], pt[2]); + // Insert tmpsh in DT. + searchtet.tet = NULL; + if (scoutsubface(&tmpsh, &searchtet, 0)) { // shflag = 0 + // Inserted! 'tmpsh' must face toward the inside of the cavity. + // Remember the boundary tet (outside the cavity) in tmpsh + // (use the adjacent tet slot). + tmpsh.sh[0] = (shellface) encode(*parytet); + // Save this subface. + cavshells->newindex((void **) &parysh); + *parysh = tmpsh; + } + else { + // This boundary face is missing. + shellfacedealloc(subfaces, tmpsh.sh); + // Save this face in list. + misfaces->newindex((void **) &parytet1); + *parytet1 = *parytet; + } + } // i + + if (misfaces->objects > 0) { + if (b->verbose > 2) { + printf(" Enlarging the cavity. %ld missing bdry faces\n", + misfaces->objects); + } + + // Removing all temporary subfaces. + for (i = 0; i < cavshells->objects; i++) { + parysh = (face *) fastlookup(cavshells, i); + stpivot(*parysh, neightet); + tsdissolve(neightet); // Detach it from adj. tets. + fsymself(neightet); + tsdissolve(neightet); + shellfacedealloc(subfaces, parysh->sh); + } + cavshells->restart(); + + // Infect the points which are of the cavity. + for (i = 0; i < cavpoints->objects; i++) { + pt[0] = * (point *) fastlookup(cavpoints, i); + pinfect(pt[0]); // Mark it as inserted. + } + + // Enlarge the cavity. + for (i = 0; i < misfaces->objects; i++) { + // Get a missing face. + parytet = (triface *) fastlookup(misfaces, i); + if (!infected(*parytet)) { + // Put it into crossing tet list. + infect(*parytet); + crosstets->newindex((void **) &parytet1); + *parytet1 = *parytet; + // Insert the opposite point if it is not in DT. + pd = oppo(*parytet); + if (!pinfected(pd)) { + searchtet = recenttet; + ivf.iloc = (int) OUTSIDE; + insertpoint(pd, &searchtet, NULL, NULL, &ivf); + pinfect(pd); + cavpoints->newindex((void **) &parypt); + *parypt = pd; + } + // Add three opposite faces into the boundary list. + for (j = 0; j < 3; j++) { + esym(*parytet, neightet); + fsymself(neightet); + if (!infected(neightet)) { + cavfaces->newindex((void **) &parytet1); + *parytet1 = neightet; + } + enextself(*parytet); + } // j + } // if (!infected(parytet)) + } // i + + // Uninfect the points which are of the cavity. + for (i = 0; i < cavpoints->objects; i++) { + pt[0] = * (point *) fastlookup(cavpoints, i); + puninfect(pt[0]); + } + + misfaces->restart(); + continue; + } // if (misfaces->objects > 0) + + break; + + } // while (1) + + // Collect all tets of the DT. All new tets are marktested. + marktest(recenttet); + newtets->newindex((void **) &parytet); + *parytet = recenttet; + for (i = 0; i < newtets->objects; i++) { + searchtet = * (triface *) fastlookup(newtets, i); + for (j = 0; j < 4; j++) { + decode(searchtet.tet[j], neightet); + if (!marktested(neightet)) { + marktest(neightet); + newtets->newindex((void **) &parytet); + *parytet = neightet; + } + } + } + + cavpoints->restart(); + cavfaces->restart(); + + if (crosstets->objects > baknum) { + // The cavity has been enlarged. + cavityexpcount++; + } + + // Restore the original values. + hullsize = bakhullsize; + checksubsegflag = bakchecksubsegflag; + checksubfaceflag = bakchecksubfaceflag; + b->verbose++; + b->plc = 1; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// fillcavity() Fill new tets into the cavity. // +// // +// The new tets are stored in two disjoint sets(which share the same facet). // +// 'topfaces' and 'botfaces' are the boundaries of these two sets, respect- // +// ively. 'midfaces' is empty on input, and will store faces in the facet. // +// // +// Important: This routine assumes all vertices of the missing region R are // +// marktested, i.e., pmarktested(p) returns true. // +// // +/////////////////////////////////////////////////////////////////////////////// + +bool tetgenmesh::fillcavity(arraypool* topshells, arraypool* botshells, + arraypool* midfaces, arraypool* missingshs, + arraypool* topnewtets, arraypool* botnewtets, + triface* crossedge) +{ + arraypool *cavshells; + triface bdrytet, neightet, *parytet; + triface searchtet, spintet; + face *parysh; + face checkseg; + point pa, pb, pc; + bool mflag; + int t1ver; + int i, j; + + // Connect newtets to tets outside the cavity. These connections are needed + // for identifying the middle faces (which belong to R). + for (j = 0; j < 2; j++) { + cavshells = (j == 0 ? topshells : botshells); + if (cavshells != NULL) { + for (i = 0; i < cavshells->objects; i++) { + // Get a temp subface. + parysh = (face *) fastlookup(cavshells, i); + // Get the boundary tet outside the cavity (saved in sh[0]). + decode(parysh->sh[0], bdrytet); + pa = org(bdrytet); + pb = dest(bdrytet); + pc = apex(bdrytet); + // Get the adjacent new tet inside the cavity. + stpivot(*parysh, neightet); + // Mark neightet as an interior tet of this cavity. + infect(neightet); + // Connect the two tets (the old connections are replaced). + bond(bdrytet, neightet); + tsdissolve(neightet); // Clear the pointer to tmpsh. + // Update the point-to-tets map. + setpoint2tet(pa, (tetrahedron) neightet.tet); + setpoint2tet(pb, (tetrahedron) neightet.tet); + setpoint2tet(pc, (tetrahedron) neightet.tet); + } // i + } // if (cavshells != NULL) + } // j + + if (crossedge != NULL) { + // Glue top and bottom tets at their common facet. + triface toptet, bottet, spintet, *midface; + point pd, pe; + REAL ori; + int types[2], poss[4]; + int interflag; + int bflag; + + mflag = false; + pd = org(*crossedge); + pe = dest(*crossedge); + + // Search the first (middle) face in R. + // Since R may be non-convex, we must make sure that the face is in the + // interior of R. We search a face in 'topnewtets' whose three vertices + // are on R and it intersects 'crossedge' in its interior. Then search + // a matching face in 'botnewtets'. + for (i = 0; i < topnewtets->objects && !mflag; i++) { + searchtet = * (triface *) fastlookup(topnewtets, i); + for (searchtet.ver = 0; searchtet.ver < 4 && !mflag; searchtet.ver++) { + pa = org(searchtet); + if (pmarktested(pa)) { + pb = dest(searchtet); + if (pmarktested(pb)) { + pc = apex(searchtet); + if (pmarktested(pc)) { + // Check if this face intersects [d,e]. + interflag = tri_edge_test(pa,pb,pc,pd,pe,NULL,1,types,poss); + if (interflag == 2) { + // They intersect at a single point. Found. + toptet = searchtet; + // The face lies in the interior of R. + // Get the tet (in topnewtets) which lies above R. + ori = orient3d(pa, pb, pc, pd); + if (ori < 0) { + fsymself(toptet); + pa = org(toptet); + pb = dest(toptet); + } else if (ori == 0) { + terminatetetgen(this, 2); + } + // Search the face [b,a,c] in 'botnewtets'. + for (j = 0; j < botnewtets->objects; j++) { + neightet = * (triface *) fastlookup(botnewtets, j); + // Is neightet contains 'b'. + if ((point) neightet.tet[4] == pb) { + neightet.ver = 11; + } else if ((point) neightet.tet[5] == pb) { + neightet.ver = 3; + } else if ((point) neightet.tet[6] == pb) { + neightet.ver = 7; + } else if ((point) neightet.tet[7] == pb) { + neightet.ver = 0; + } else { + continue; + } + // Is the 'neightet' contains edge [b,a]. + if (dest(neightet) == pa) { + // 'neightet' is just the edge. + } else if (apex(neightet) == pa) { + eprevesymself(neightet); + } else if (oppo(neightet) == pa) { + esymself(neightet); + enextself(neightet); + } else { + continue; + } + // Is 'neightet' the face [b,a,c]. + if (apex(neightet) == pc) { + bottet = neightet; + mflag = true; + break; + } + } // j + } // if (interflag == 2) + } // pc + } // pb + } // pa + } // toptet.ver + } // i + + if (mflag) { + // Found a pair of matched faces in 'toptet' and 'bottet'. + bond(toptet, bottet); + // Both are interior tets. + infect(toptet); + infect(bottet); + // Add this face into search list. + markface(toptet); + midfaces->newindex((void **) &parytet); + *parytet = toptet; + } else { + // No pair of 'toptet' and 'bottet'. + toptet.tet = NULL; + // Randomly split an interior edge of R. + i = randomnation(missingshs->objects - 1); + recentsh = * (face *) fastlookup(missingshs, i); + } + + // Find other middle faces, connect top and bottom tets. + for (i = 0; i < midfaces->objects && mflag; i++) { + // Get a matched middle face [a, b, c] + midface = (triface *) fastlookup(midfaces, i); + // Check the neighbors at the edges of this face. + for (j = 0; j < 3 && mflag; j++) { + toptet = *midface; + bflag = false; + while (1) { + // Go to the next face in the same tet. + esymself(toptet); + pc = apex(toptet); + if (pmarktested(pc)) { + break; // Find a subface. + } + if (pc == dummypoint) { + terminatetetgen(this, 2); // Check this case. + break; // Find a subface. + } + // Go to the adjacent tet. + fsymself(toptet); + // Do we walk outside the cavity? + if (!marktested(toptet)) { + // Yes, the adjacent face is not a middle face. + bflag = true; break; + } + } + if (!bflag) { + if (!facemarked(toptet)) { + fsym(*midface, bottet); + spintet = bottet; + while (1) { + esymself(bottet); + pd = apex(bottet); + if (pd == pc) break; // Face matched. + fsymself(bottet); + if (bottet.tet == spintet.tet) { + // Not found a matched bottom face. + mflag = false; + break; + } + } // while (1) + if (mflag) { + if (marktested(bottet)) { + // Connect two tets together. + bond(toptet, bottet); + // Both are interior tets. + infect(toptet); + infect(bottet); + // Add this face into list. + markface(toptet); + midfaces->newindex((void **) &parytet); + *parytet = toptet; + } + else { + // The 'bottet' is not inside the cavity! + terminatetetgen(this, 2); // Check this case + } + } else { // mflag == false + // Adjust 'toptet' and 'bottet' to be the crossing edges. + fsym(*midface, bottet); + spintet = bottet; + while (1) { + esymself(bottet); + pd = apex(bottet); + if (pmarktested(pd)) { + // assert(pd != pc); + // Let 'toptet' be [a,b,c,#], and 'bottet' be [b,a,d,*]. + // Adjust 'toptet' and 'bottet' to be the crossing edges. + // Test orient3d(b,c,#,d). + ori = orient3d(dest(toptet), pc, oppo(toptet), pd); + if (ori < 0) { + // Edges [a,d] and [b,c] cross each other. + enextself(toptet); // [b,c] + enextself(bottet); // [a,d] + } else if (ori > 0) { + // Edges [a,c] and [b,d] cross each other. + eprevself(toptet); // [c,a] + eprevself(bottet); // [d,b] + } else { + // b,c,#,and d are coplanar!. + terminatetetgen(this, 2); //assert(0); + } + break; // Not matched + } + fsymself(bottet); + } + } // if (!mflag) + } // if (!facemarked(toptet)) + } // if (!bflag) + enextself(*midface); + } // j + } // i + + if (mflag) { + if (b->verbose > 2) { + printf(" Found %ld middle subfaces.\n", midfaces->objects); + } + face oldsh, newsh, casout, casin, neighsh; + + oldsh = * (face *) fastlookup(missingshs, 0); + + // Create new subfaces to fill the region R. + for (i = 0; i < midfaces->objects; i++) { + // Get a matched middle face [a, b, c] + midface = (triface *) fastlookup(midfaces, i); + unmarkface(*midface); + makeshellface(subfaces, &newsh); + setsorg(newsh, org(*midface)); + setsdest(newsh, dest(*midface)); + setsapex(newsh, apex(*midface)); + // The new subface gets its markers from the old one. + setshellmark(newsh, shellmark(oldsh)); + if (checkconstraints) { + setareabound(newsh, areabound(oldsh)); + } + if (useinsertradius) { + setfacetindex(newsh, getfacetindex(oldsh)); + } + // Connect the new subface to adjacent tets. + tsbond(*midface, newsh); + fsym(*midface, neightet); + sesymself(newsh); + tsbond(neightet, newsh); + } + + // Connect new subfaces together and to the bdry of R. + // Delete faked segments. + for (i = 0; i < midfaces->objects; i++) { + // Get a matched middle face [a, b, c] + midface = (triface *) fastlookup(midfaces, i); + for (j = 0; j < 3; j++) { + tspivot(*midface, newsh); + spivot(newsh, casout); + if (casout.sh == NULL) { + // Search its neighbor. + fnext(*midface, searchtet); + while (1) { + // (1) First check if this side is a bdry edge of R. + tsspivot1(searchtet, checkseg); + if (checkseg.sh != NULL) { + // It's a bdry edge of R. + // Get the old subface. + checkseg.shver = 0; + spivot(checkseg, oldsh); + if (sinfected(checkseg)) { + // It's a faked segment. Delete it. + spintet = searchtet; + while (1) { + tssdissolve1(spintet); + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + shellfacedealloc(subsegs, checkseg.sh); + ssdissolve(oldsh); + checkseg.sh = NULL; + } + spivot(oldsh, casout); + if (casout.sh != NULL) { + casin = casout; + if (checkseg.sh != NULL) { + // Make sure that the subface has the right ori at the + // segment. + checkseg.shver = 0; + if (sorg(newsh) != sorg(checkseg)) { + sesymself(newsh); + } + spivot(casin, neighsh); + while (neighsh.sh != oldsh.sh) { + casin = neighsh; + spivot(casin, neighsh); + } + } + sbond1(newsh, casout); + sbond1(casin, newsh); + } + if (checkseg.sh != NULL) { + ssbond(newsh, checkseg); + } + break; + } // if (checkseg.sh != NULL) + // (2) Second check if this side is an interior edge of R. + tspivot(searchtet, neighsh); + if (neighsh.sh != NULL) { + // Found an adjacent subface of newsh (an interior edge). + sbond(newsh, neighsh); + break; + } + fnextself(searchtet); + } // while (1) + } // if (casout.sh == NULL) + enextself(*midface); + } // j + } // i + + // Delete old subfaces. + for (i = 0; i < missingshs->objects; i++) { + parysh = (face *) fastlookup(missingshs, i); + shellfacedealloc(subfaces, parysh->sh); + } + } else { + if (toptet.tet != NULL) { + // Faces at top and bottom are not matched. + // Choose a Steiner point in R. + // Split one of the crossing edges. + pa = org(toptet); + pb = dest(toptet); + pc = org(bottet); + pd = dest(bottet); + // Search an edge in R which is either [a,b] or [c,d]. + // Reminder: Subfaces in this list 'missingshs', except the first + // one, represents an interior edge of R. + parysh = NULL; // Avoid a warning in MSVC + for (i = 1; i < missingshs->objects; i++) { + parysh = (face *) fastlookup(missingshs, i); + if (((sorg(*parysh) == pa) && (sdest(*parysh) == pb)) || + ((sorg(*parysh) == pb) && (sdest(*parysh) == pa))) break; + if (((sorg(*parysh) == pc) && (sdest(*parysh) == pd)) || + ((sorg(*parysh) == pd) && (sdest(*parysh) == pc))) break; + } + if (i < missingshs->objects) { + // Found. Return it. + recentsh = *parysh; + } else { + terminatetetgen(this, 2); //assert(0); + } + } else { + //terminatetetgen(this, 2); // Report a bug + } + } + + midfaces->restart(); + } else { + mflag = true; + } + + // Delete the temp subfaces. + for (j = 0; j < 2; j++) { + cavshells = (j == 0 ? topshells : botshells); + if (cavshells != NULL) { + for (i = 0; i < cavshells->objects; i++) { + parysh = (face *) fastlookup(cavshells, i); + shellfacedealloc(subfaces, parysh->sh); + } + } + } + + topshells->restart(); + if (botshells != NULL) { + botshells->restart(); + } + + return mflag; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// carvecavity() Delete old tets and outer new tets of the cavity. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::carvecavity(arraypool *crosstets, arraypool *topnewtets, + arraypool *botnewtets) +{ + arraypool *newtets; + shellface *sptr, *ssptr; + triface *parytet, *pnewtet, newtet, neightet, spintet; + face checksh, *parysh; + face checkseg, *paryseg; + int t1ver; + int i, j; + + if (b->verbose > 2) { + printf(" Carve cavity: %ld old tets.\n", crosstets->objects); + } + + // First process subfaces and segments which are adjacent to the cavity. + // They must be re-connected to new tets in the cavity. + // Comment: It is possible that some subfaces and segments are completely + // inside the cavity. This can happen even if the cavity is not enlarged. + // Before deleting the old tets, find and queue all interior subfaces + // and segments. They will be recovered later. 2010-05-06. + + // Collect all subfaces and segments which attached to the old tets. + for (i = 0; i < crosstets->objects; i++) { + parytet = (triface *) fastlookup(crosstets, i); + if ((sptr = (shellface*) parytet->tet[9]) != NULL) { + for (j = 0; j < 4; j++) { + if (sptr[j]) { + sdecode(sptr[j], checksh); + if (!sinfected(checksh)) { + sinfect(checksh); + cavetetshlist->newindex((void **) &parysh); + *parysh = checksh; + } + } + } // j + } + if ((ssptr = (shellface*) parytet->tet[8]) != NULL) { + for (j = 0; j < 6; j++) { + if (ssptr[j]) { + sdecode(ssptr[j], checkseg); + // Skip a deleted segment (was a faked segment) + if (checkseg.sh[3] != NULL) { + if (!sinfected(checkseg)) { + sinfect(checkseg); + cavetetseglist->newindex((void **) &paryseg); + *paryseg = checkseg; + } + } + } + } // j + } + } // i + + // Uninfect collected subfaces. + for (i = 0; i < cavetetshlist->objects; i++) { + parysh = (face *) fastlookup(cavetetshlist, i); + suninfect(*parysh); + } + // Uninfect collected segments. + for (i = 0; i < cavetetseglist->objects; i++) { + paryseg = (face *) fastlookup(cavetetseglist, i); + suninfect(*paryseg); + } + + // Connect subfaces to new tets. + for (i = 0; i < cavetetshlist->objects; i++) { + parysh = (face *) fastlookup(cavetetshlist, i); + // Get an adjacent tet at this subface. + stpivot(*parysh, neightet); + // Does this tet lie inside the cavity. + if (infected(neightet)) { + // Yes. Get the other adjacent tet at this subface. + sesymself(*parysh); + stpivot(*parysh, neightet); + // Does this tet lie inside the cavity. + if (infected(neightet)) { + checksh = *parysh; + stdissolve(checksh); + caveencshlist->newindex((void **) &parysh); + *parysh = checksh; + } + } + if (!infected(neightet)) { + // Found an outside tet. Re-connect this subface to a new tet. + fsym(neightet, newtet); + sesymself(*parysh); + tsbond(newtet, *parysh); + } + } // i + + + for (i = 0; i < cavetetseglist->objects; i++) { + checkseg = * (face *) fastlookup(cavetetseglist, i); + // Check if the segment is inside the cavity. + sstpivot1(checkseg, neightet); + spintet = neightet; + while (1) { + if (!infected(spintet)) { + // This segment is on the boundary of the cavity. + break; + } + fnextself(spintet); + if (spintet.tet == neightet.tet) { + sstdissolve1(checkseg); + caveencseglist->newindex((void **) &paryseg); + *paryseg = checkseg; + break; + } + } + if (!infected(spintet)) { + // A boundary segment. Connect this segment to the new tets. + sstbond1(checkseg, spintet); + neightet = spintet; + while (1) { + tssbond1(spintet, checkseg); + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + } + } // i + + + cavetetshlist->restart(); + cavetetseglist->restart(); + + // Delete the old tets in cavity. + for (i = 0; i < crosstets->objects; i++) { + parytet = (triface *) fastlookup(crosstets, i); + if (ishulltet(*parytet)) { + hullsize--; + } + tetrahedrondealloc(parytet->tet); + } + + crosstets->restart(); // crosstets will be re-used. + + // Collect new tets in cavity. Some new tets have already been found + // (and infected) in the fillcavity(). We first collect them. + for (j = 0; j < 2; j++) { + newtets = (j == 0 ? topnewtets : botnewtets); + if (newtets != NULL) { + for (i = 0; i < newtets->objects; i++) { + parytet = (triface *) fastlookup(newtets, i); + if (infected(*parytet)) { + crosstets->newindex((void **) &pnewtet); + *pnewtet = *parytet; + } + } // i + } + } // j + + // Now we collect all new tets in cavity. + for (i = 0; i < crosstets->objects; i++) { + parytet = (triface *) fastlookup(crosstets, i); + for (j = 0; j < 4; j++) { + decode(parytet->tet[j], neightet); + if (marktested(neightet)) { // Is it a new tet? + if (!infected(neightet)) { + // Find an interior tet. + //assert((point) neightet.tet[7] != dummypoint); // SELF_CHECK + infect(neightet); + crosstets->newindex((void **) &pnewtet); + *pnewtet = neightet; + } + } + } // j + } // i + + parytet = (triface *) fastlookup(crosstets, 0); + recenttet = *parytet; // Remember a live handle. + + // Delete outer new tets. + for (j = 0; j < 2; j++) { + newtets = (j == 0 ? topnewtets : botnewtets); + if (newtets != NULL) { + for (i = 0; i < newtets->objects; i++) { + parytet = (triface *) fastlookup(newtets, i); + if (infected(*parytet)) { + // This is an interior tet. + uninfect(*parytet); + unmarktest(*parytet); + if (ishulltet(*parytet)) { + hullsize++; + } + } else { + // An outer tet. Delete it. + tetrahedrondealloc(parytet->tet); + } + } + } + } + + crosstets->restart(); + topnewtets->restart(); + if (botnewtets != NULL) { + botnewtets->restart(); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// restorecavity() Reconnect old tets and delete new tets of the cavity. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::restorecavity(arraypool *crosstets, arraypool *topnewtets, + arraypool *botnewtets, arraypool *missingshbds) +{ + triface *parytet, neightet, spintet; + face *parysh; + face checkseg; + point *ppt; + int t1ver; + int i, j; + + // Reconnect crossing tets to cavity boundary. + for (i = 0; i < crosstets->objects; i++) { + parytet = (triface *) fastlookup(crosstets, i); + parytet->ver = 0; + for (parytet->ver = 0; parytet->ver < 4; parytet->ver++) { + fsym(*parytet, neightet); + if (!infected(neightet)) { + // Restore the old connections of tets. + bond(*parytet, neightet); + } + } + // Update the point-to-tet map. + parytet->ver = 0; + ppt = (point *) &(parytet->tet[4]); + for (j = 0; j < 4; j++) { + setpoint2tet(ppt[j], encode(*parytet)); + } + } + + // Uninfect all crossing tets. + for (i = 0; i < crosstets->objects; i++) { + parytet = (triface *) fastlookup(crosstets, i); + uninfect(*parytet); + } + + // Remember a live handle. + if (crosstets->objects > 0) { + recenttet = * (triface *) fastlookup(crosstets, 0); + } + + // Delete faked segments. + for (i = 0; i < missingshbds->objects; i++) { + parysh = (face *) fastlookup(missingshbds, i); + sspivot(*parysh, checkseg); + if (checkseg.sh[3] != NULL) { + if (sinfected(checkseg)) { + // It's a faked segment. Delete it. + sstpivot1(checkseg, neightet); + spintet = neightet; + while (1) { + tssdissolve1(spintet); + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + shellfacedealloc(subsegs, checkseg.sh); + ssdissolve(*parysh); + //checkseg.sh = NULL; + } + } + } // i + + // Delete new tets. + for (i = 0; i < topnewtets->objects; i++) { + parytet = (triface *) fastlookup(topnewtets, i); + tetrahedrondealloc(parytet->tet); + } + + if (botnewtets != NULL) { + for (i = 0; i < botnewtets->objects; i++) { + parytet = (triface *) fastlookup(botnewtets, i); + tetrahedrondealloc(parytet->tet); + } + } + + crosstets->restart(); + topnewtets->restart(); + if (botnewtets != NULL) { + botnewtets->restart(); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// flipcertify() Insert a crossing face into priority queue. // +// // +// A crossing face of a facet must have at least one top and one bottom ver- // +// tex of the facet. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::flipcertify(triface *chkface,badface **pqueue,point plane_pa, + point plane_pb, point plane_pc) +{ + badface *parybf, *prevbf, *nextbf; + triface neightet; + face checksh; + point p[5]; + REAL w[5]; + REAL insph, ori4; + int topi, boti; + int i; + + // Compute the flip time \tau. + fsym(*chkface, neightet); + + p[0] = org(*chkface); + p[1] = dest(*chkface); + p[2] = apex(*chkface); + p[3] = oppo(*chkface); + p[4] = oppo(neightet); + + // Check if the face is a crossing face. + topi = boti = 0; + for (i = 0; i < 3; i++) { + if (pmarktest2ed(p[i])) topi++; + if (pmarktest3ed(p[i])) boti++; + } + if ((topi == 0) || (boti == 0)) { + // It is not a crossing face. + // return; + for (i = 3; i < 5; i++) { + if (pmarktest2ed(p[i])) topi++; + if (pmarktest3ed(p[i])) boti++; + } + if ((topi == 0) || (boti == 0)) { + // The two tets sharing at this face are on one side of the facet. + // Check if this face is locally Delaunay (due to rounding error). + if ((p[3] != dummypoint) && (p[4] != dummypoint)) { + // Do not check it if it is a subface. + tspivot(*chkface, checksh); + if (checksh.sh == NULL) { + insph = insphere_s(p[1], p[0], p[2], p[3], p[4]); + if (insph > 0) { + // Add the face into queue. + if (b->verbose > 2) { + printf(" A locally non-Delanay face (%d, %d, %d)-%d,%d\n", + pointmark(p[0]), pointmark(p[1]), pointmark(p[2]), + pointmark(p[3]), pointmark(p[4])); + } + parybf = (badface *) flippool->alloc(); + parybf->key = 0.; // tau = 0, do immediately. + parybf->tt = *chkface; + parybf->forg = p[0]; + parybf->fdest = p[1]; + parybf->fapex = p[2]; + parybf->foppo = p[3]; + parybf->noppo = p[4]; + // Add it at the top of the priority queue. + if (*pqueue == NULL) { + *pqueue = parybf; + parybf->nextitem = NULL; + } else { + parybf->nextitem = *pqueue; + *pqueue = parybf; + } + } // if (insph > 0) + } // if (checksh.sh == NULL) + } + } + return; // Test: omit this face. + } + + // Decide the "height" for each point. + for (i = 0; i < 5; i++) { + if (pmarktest2ed(p[i])) { + // A top point has a positive weight. + w[i] = orient3dfast(plane_pa, plane_pb, plane_pc, p[i]); + if (w[i] < 0) w[i] = -w[i]; + } else { + w[i] = 0; + } + } + + insph = insphere(p[1], p[0], p[2], p[3], p[4]); + ori4 = orient4d(p[1], p[0], p[2], p[3], p[4], w[1], w[0], w[2], w[3], w[4]); + if (ori4 > 0) { + // Add the face into queue. + if (b->verbose > 2) { + printf(" Insert face (%d, %d, %d) - %d, %d\n", pointmark(p[0]), + pointmark(p[1]), pointmark(p[2]), pointmark(p[3]), pointmark(p[4])); + } + + parybf = (badface *) flippool->alloc(); + + parybf->key = -insph / ori4; + parybf->tt = *chkface; + parybf->forg = p[0]; + parybf->fdest = p[1]; + parybf->fapex = p[2]; + parybf->foppo = p[3]; + parybf->noppo = p[4]; + + // Push the face into priority queue. + //pq.push(bface); + if (*pqueue == NULL) { + *pqueue = parybf; + parybf->nextitem = NULL; + } else { + // Search an item whose key is larger or equal to current key. + prevbf = NULL; + nextbf = *pqueue; + //if (!b->flipinsert_random) { // Default use a priority queue. + // Insert the item into priority queue. + while (nextbf != NULL) { + if (nextbf->key < parybf->key) { + prevbf = nextbf; + nextbf = nextbf->nextitem; + } else { + break; + } + } + //} // if (!b->flipinsert_random) + // Insert the new item between prev and next items. + if (prevbf == NULL) { + *pqueue = parybf; + } else { + prevbf->nextitem = parybf; + } + parybf->nextitem = nextbf; + } + } else if (ori4 == 0) { + + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// flipinsertfacet() Insert a facet into a CDT by flips. // +// // +// The algorithm is described in Shewchuk's paper "Updating and Constructing // +// Constrained Delaunay and Constrained Regular Triangulations by Flips", in // +// Proc. 19th Ann. Symp. on Comput. Geom., 86--95, 2003. // +// // +// 'crosstets' contains the set of crossing tetrahedra (infected) of the // +// facet. 'toppoints' and 'botpoints' are points lies above and below the // +// facet, not on the facet. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::flipinsertfacet(arraypool *crosstets, arraypool *toppoints, + arraypool *botpoints, arraypool *midpoints) +{ + arraypool *crossfaces, *bfacearray; + triface fliptets[6], baktets[2], fliptet, newface; + triface neightet, *parytet; + badface *pqueue; + badface *popbf, bface; + point plane_pa, plane_pb, plane_pc; + point p1, p2, pd, pe; + point *parypt; + flipconstraints fc; + REAL ori[3]; + int convcount, copcount; + int flipflag, fcount; + int n, i; + long f23count, f32count, f44count; + long totalfcount; + + f23count = flip23count; + f32count = flip32count; + f44count = flip44count; + + // Get three affinely independent vertices in the missing region R. + calculateabovepoint(midpoints, &plane_pa, &plane_pb, &plane_pc); + + // Mark top and bottom points. Do not mark midpoints. + for (i = 0; i < toppoints->objects; i++) { + parypt = (point *) fastlookup(toppoints, i); + if (!pmarktested(*parypt)) { + pmarktest2(*parypt); + } + } + for (i = 0; i < botpoints->objects; i++) { + parypt = (point *) fastlookup(botpoints, i); + if (!pmarktested(*parypt)) { + pmarktest3(*parypt); + } + } + + // Collect crossing faces. + crossfaces = cavetetlist; // Re-use array 'cavetetlist'. + + // Each crossing face contains at least one bottom vertex and + // one top vertex. + for (i = 0; i < crosstets->objects; i++) { + parytet = (triface *) fastlookup(crosstets, i); + fliptet = *parytet; + for (fliptet.ver = 0; fliptet.ver < 4; fliptet.ver++) { + fsym(fliptet, neightet); + if (infected(neightet)) { // It is an interior face. + if (!marktested(neightet)) { // It is an unprocessed face. + crossfaces->newindex((void **) &parytet); + *parytet = fliptet; + } + } + } + marktest(fliptet); + } + + if (b->verbose > 1) { + printf(" Found %ld crossing faces.\n", crossfaces->objects); + } + + for (i = 0; i < crosstets->objects; i++) { + parytet = (triface *) fastlookup(crosstets, i); + unmarktest(*parytet); + uninfect(*parytet); + } + + // Initialize the priority queue. + pqueue = NULL; + + for (i = 0; i < crossfaces->objects; i++) { + parytet = (triface *) fastlookup(crossfaces, i); + flipcertify(parytet, &pqueue, plane_pa, plane_pb, plane_pc); + } + crossfaces->restart(); + + // The list for temporarily storing unflipable faces. + bfacearray = new arraypool(sizeof(triface), 4); + + + fcount = 0; // Count the number of flips. + + // Flip insert the facet. + while (pqueue != NULL) { + + // Pop a face from the priority queue. + popbf = pqueue; + bface = *popbf; + // Update the queue. + pqueue = pqueue->nextitem; + // Delete the popped item from the pool. + flippool->dealloc((void *) popbf); + + if (!isdeadtet(bface.tt)) { + if ((org(bface.tt) == bface.forg) && (dest(bface.tt) == bface.fdest) && + (apex(bface.tt) == bface.fapex) && (oppo(bface.tt) == bface.foppo)) { + // It is still a crossing face of R. + fliptet = bface.tt; + fsym(fliptet, neightet); + if (oppo(neightet) == bface.noppo) { + pd = oppo(fliptet); + pe = oppo(neightet); + + if (b->verbose > 2) { + printf(" Get face (%d, %d, %d) - %d, %d, tau = %.17g\n", + pointmark(bface.forg), pointmark(bface.fdest), + pointmark(bface.fapex), pointmark(bface.foppo), + pointmark(bface.noppo), bface.key); + } + flipflag = 0; + + // Check for which type of flip can we do. + convcount = 3; + copcount = 0; + for (i = 0; i < 3; i++) { + p1 = org(fliptet); + p2 = dest(fliptet); + ori[i] = orient3d(p1, p2, pd, pe); + if (ori[i] < 0) { + convcount--; + //break; + } else if (ori[i] == 0) { + convcount--; // Possible 4-to-4 flip. + copcount++; + //break; + } + enextself(fliptet); + } + + if (convcount == 3) { + // A 2-to-3 flip is found. + fliptets[0] = fliptet; // abcd, d may be the new vertex. + fliptets[1] = neightet; // bace. + flip23(fliptets, 1, &fc); + // Put the link faces into check list. + for (i = 0; i < 3; i++) { + eprevesym(fliptets[i], newface); + crossfaces->newindex((void **) &parytet); + *parytet = newface; + } + for (i = 0; i < 3; i++) { + enextesym(fliptets[i], newface); + crossfaces->newindex((void **) &parytet); + *parytet = newface; + } + flipflag = 1; + } else if (convcount == 2) { + //if (copcount <= 1) { + // A 3-to-2 or 4-to-4 may be possible. + // Get the edge which is locally non-convex or flat. + for (i = 0; i < 3; i++) { + if (ori[i] <= 0) break; + enextself(fliptet); + } + + // Collect tets sharing at this edge. + esym(fliptet, fliptets[0]); // [b,a,d,c] + n = 0; + do { + p1 = apex(fliptets[n]); + if (!(pmarktested(p1) || pmarktest2ed(p1) || pmarktest3ed(p1))) { + // This apex is not on the cavity. Hence the face does not + // lie inside the cavity. Do not flip this edge. + n = 1000; break; + } + fnext(fliptets[n], fliptets[n + 1]); + n++; + } while ((fliptets[n].tet != fliptet.tet) && (n < 5)); + + if (n == 3) { + // Found a 3-to-2 flip. + flip32(fliptets, 1, &fc); + // Put the link faces into check list. + for (i = 0; i < 3; i++) { + esym(fliptets[0], newface); + crossfaces->newindex((void **) &parytet); + *parytet = newface; + enextself(fliptets[0]); + } + for (i = 0; i < 3; i++) { + esym(fliptets[1], newface); + crossfaces->newindex((void **) &parytet); + *parytet = newface; + enextself(fliptets[1]); + } + flipflag = 1; + } else if (n == 4) { + if (copcount == 1) { + // Found a 4-to-4 flip. + // Let the six vertices are: a,b,c,d,e,f, where + // fliptets[0] = [b,a,d,c] + // [1] = [b,a,c,e] + // [2] = [b,a,e,f] + // [3] = [b,a,f,d] + // After the 4-to-4 flip, edge [a,b] is flipped, edge [e,d] + // is created. + // First do a 2-to-3 flip. + // Comment: This flip temporarily creates a degenerated + // tet (whose volume is zero). It will be removed by the + // followed 3-to-2 flip. + fliptets[0] = fliptet; // = [a,b,c,d], d is the new vertex. + // fliptets[1]; // = [b,a,c,e]. + baktets[0] = fliptets[2]; // = [b,a,e,f] + baktets[1] = fliptets[3]; // = [b,a,f,d] + // The flip may involve hull tets. + flip23(fliptets, 1, &fc); + // Put the "outer" link faces into check list. + // fliptets[0] = [e,d,a,b] => will be flipped, so + // [a,b,d] and [a,b,e] are not "outer" link faces. + for (i = 1; i < 3; i++) { + eprevesym(fliptets[i], newface); + crossfaces->newindex((void **) &parytet); + *parytet = newface; + } + for (i = 1; i < 3; i++) { + enextesym(fliptets[i], newface); + crossfaces->newindex((void **) &parytet); + *parytet = newface; + } + // Then do a 3-to-2 flip. + enextesymself(fliptets[0]); // fliptets[0] is [e,d,a,b]. + eprevself(fliptets[0]); // = [b,a,d,c], d is the new vertex. + fliptets[1] = baktets[0]; // = [b,a,e,f] + fliptets[2] = baktets[1]; // = [b,a,f,d] + flip32(fliptets, 1, &fc); + // Put the "outer" link faces into check list. + // fliptets[0] = [d,e,f,a] + // fliptets[1] = [e,d,f,b] + // Faces [a,b,d] and [a,b,e] are not "outer" link faces. + enextself(fliptets[0]); + for (i = 1; i < 3; i++) { + esym(fliptets[0], newface); + crossfaces->newindex((void **) &parytet); + *parytet = newface; + enextself(fliptets[0]); + } + enextself(fliptets[1]); + for (i = 1; i < 3; i++) { + esym(fliptets[1], newface); + crossfaces->newindex((void **) &parytet); + *parytet = newface; + enextself(fliptets[1]); + } + flip23count--; + flip32count--; + flip44count++; + flipflag = 1; + } + } + } else { + // There are more than 1 non-convex or coplanar cases. + flipflag = -1; // Ignore this face. + if (b->verbose > 2) { + printf(" Ignore face (%d, %d, %d) - %d, %d, tau = %.17g\n", + pointmark(bface.forg), pointmark(bface.fdest), + pointmark(bface.fapex), pointmark(bface.foppo), + pointmark(bface.noppo), bface.key); + } + } // if (convcount == 1) + + if (flipflag == 1) { + // Update the priority queue. + for (i = 0; i < crossfaces->objects; i++) { + parytet = (triface *) fastlookup(crossfaces, i); + flipcertify(parytet, &pqueue, plane_pa, plane_pb, plane_pc); + } + crossfaces->restart(); + if (1) { // if (!b->flipinsert_random) { + // Insert all queued unflipped faces. + for (i = 0; i < bfacearray->objects; i++) { + parytet = (triface *) fastlookup(bfacearray, i); + // This face may be changed. + if (!isdeadtet(*parytet)) { + flipcertify(parytet, &pqueue, plane_pa, plane_pb, plane_pc); + } + } + bfacearray->restart(); + } + fcount++; + } else if (flipflag == 0) { + // Queue an unflippable face. To process it later. + bfacearray->newindex((void **) &parytet); + *parytet = fliptet; + } + } // if (pe == bface.noppo) + } // if ((pa == bface.forg) && ...) + } // if (bface.tt != NULL) + + } // while (pqueue != NULL) + + if (bfacearray->objects > 0) { + if (fcount == 0) { + printf("!! No flip is found in %ld faces.\n", bfacearray->objects); + terminatetetgen(this, 2); //assert(0); + } + } + + delete bfacearray; + + // Un-mark top and bottom points. + for (i = 0; i < toppoints->objects; i++) { + parypt = (point *) fastlookup(toppoints, i); + punmarktest2(*parypt); + } + for (i = 0; i < botpoints->objects; i++) { + parypt = (point *) fastlookup(botpoints, i); + punmarktest3(*parypt); + } + + f23count = flip23count - f23count; + f32count = flip32count - f32count; + f44count = flip44count - f44count; + totalfcount = f23count + f32count + f44count; + if (b->verbose > 2) { + printf(" Total %ld flips. f23(%ld), f32(%ld), f44(%ld).\n", + totalfcount, f23count, f32count, f44count); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// insertpoint_cdt() Insert a new point into a CDT. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::insertpoint_cdt(point newpt, triface *searchtet, face *splitsh, + face *splitseg, insertvertexflags *ivf, + arraypool *cavpoints, arraypool *cavfaces, + arraypool *cavshells, arraypool *newtets, + arraypool *crosstets, arraypool *misfaces) +{ + triface neightet, *parytet; + face checksh, *parysh, *parysh1; + face *paryseg, *paryseg1; + point *parypt; + int t1ver; + int i; + + if (b->verbose > 2) { + printf(" Insert point %d into CDT\n", pointmark(newpt)); + } + + if (!insertpoint(newpt, searchtet, NULL, NULL, ivf)) { + // Point is not inserted. Check ivf->iloc for reason. + return 0; + } + + + for (i = 0; i < cavetetvertlist->objects; i++) { + cavpoints->newindex((void **) &parypt); + *parypt = * (point *) fastlookup(cavetetvertlist, i); + } + // Add the new point into the point list. + cavpoints->newindex((void **) &parypt); + *parypt = newpt; + + for (i = 0; i < cavebdrylist->objects; i++) { + cavfaces->newindex((void **) &parytet); + *parytet = * (triface *) fastlookup(cavebdrylist, i); + } + + for (i = 0; i < caveoldtetlist->objects; i++) { + crosstets->newindex((void **) &parytet); + *parytet = * (triface *) fastlookup(caveoldtetlist, i); + } + + cavetetvertlist->restart(); + cavebdrylist->restart(); + caveoldtetlist->restart(); + + // Insert the point using the cavity algorithm. + delaunizecavity(cavpoints, cavfaces, cavshells, newtets, crosstets, + misfaces); + fillcavity(cavshells, NULL, NULL, NULL, NULL, NULL, NULL); + carvecavity(crosstets, newtets, NULL); + + if ((splitsh != NULL) || (splitseg != NULL)) { + // Insert the point into the surface mesh. + sinsertvertex(newpt, splitsh, splitseg, ivf->sloc, ivf->sbowywat, 0); + + // Put all new subfaces into stack. + for (i = 0; i < caveshbdlist->objects; i++) { + // Get an old subface at edge [a, b]. + parysh = (face *) fastlookup(caveshbdlist, i); + spivot(*parysh, checksh); // The new subface [a, b, p]. + // Do not recover a deleted new face (degenerated). + if (checksh.sh[3] != NULL) { + subfacstack->newindex((void **) &parysh); + *parysh = checksh; + } + } + + if (splitseg != NULL) { + // Queue two new subsegments in C(p) for recovery. + for (i = 0; i < cavesegshlist->objects; i++) { + paryseg = (face *) fastlookup(cavesegshlist, i); + subsegstack->newindex((void **) &paryseg1); + *paryseg1 = *paryseg; + } + } // if (splitseg != NULL) + + // Delete the old subfaces in sC(p). + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + if (checksubfaceflag) { + // It is possible that this subface still connects to adjacent + // tets which are not in C(p). If so, clear connections in the + // adjacent tets at this subface. + stpivot(*parysh, neightet); + if (neightet.tet != NULL) { + if (neightet.tet[4] != NULL) { + // Found an adjacent tet. It must be not in C(p). + tsdissolve(neightet); + fsymself(neightet); + tsdissolve(neightet); + } + } + } + shellfacedealloc(subfaces, parysh->sh); + } + if (splitseg != NULL) { + // Delete the old segment in sC(p). + shellfacedealloc(subsegs, splitseg->sh); + } + + // Clear working lists. + caveshlist->restart(); + caveshbdlist->restart(); + cavesegshlist->restart(); + } // if ((splitsh != NULL) || (splitseg != NULL)) + + // Put all interior subfaces into stack for recovery. + // They were collected in carvecavity(). + // Note: Some collected subfaces may be deleted by sinsertvertex(). + for (i = 0; i < caveencshlist->objects; i++) { + parysh = (face *) fastlookup(caveencshlist, i); + if (parysh->sh[3] != NULL) { + subfacstack->newindex((void **) &parysh1); + *parysh1 = *parysh; + } + } + + // Put all interior segments into stack for recovery. + // They were collected in carvecavity(). + // Note: Some collected segments may be deleted by sinsertvertex(). + for (i = 0; i < caveencseglist->objects; i++) { + paryseg = (face *) fastlookup(caveencseglist, i); + if (paryseg->sh[3] != NULL) { + subsegstack->newindex((void **) &paryseg1); + *paryseg1 = *paryseg; + } + } + + caveencshlist->restart(); + caveencseglist->restart(); + + return 1; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// refineregion() Refine a missing region by inserting points. // +// // +// 'splitsh' represents an edge of the facet to be split. It must be not a // +// segment. +// // +// Assumption: The current mesh is a CDT and is convex. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::refineregion(face &splitsh, arraypool *cavpoints, + arraypool *cavfaces, arraypool *cavshells, + arraypool *newtets, arraypool *crosstets, + arraypool *misfaces) +{ + triface searchtet, spintet; + face splitseg, *paryseg; + point steinpt, pa, pb, refpt; + insertvertexflags ivf; + enum interresult dir; + long baknum = points->items; + int t1ver; + int i; + + // Do not split a segment. + for (i = 0; i < 3; i++) { + sspivot(splitsh, splitseg); + if (splitseg.sh == NULL) break; + senextself(splitsh); + } + + if (b->verbose > 2) { + printf(" Refining region at edge (%d, %d, %d).\n", + pointmark(sorg(splitsh)), pointmark(sdest(splitsh)), + pointmark(sapex(splitsh))); + } + + // Add the Steiner point at the barycenter of the face. + pa = sorg(splitsh); + pb = sdest(splitsh); + // Create a new point. + makepoint(&steinpt, FREEFACETVERTEX); + for (i = 0; i < 3; i++) { + steinpt[i] = 0.5 * (pa[i] + pb[i]); + } + + ivf.bowywat = 1; // Use the Bowyer-Watson algorrithm. + ivf.cdtflag = 1; // Only create the initial cavity. + ivf.sloc = (int) ONEDGE; + ivf.sbowywat = 1; + ivf.assignmeshsize = b->metric; + ivf.smlenflag = useinsertradius; // Return the closet mesh vertex. + + point2tetorg(pa, searchtet); // Start location from it. + ivf.iloc = (int) OUTSIDE; + + ivf.rejflag = 1; // Reject it if it encroaches upon any segment. + if (!insertpoint_cdt(steinpt, &searchtet, &splitsh, NULL, &ivf, cavpoints, + cavfaces, cavshells, newtets, crosstets, misfaces)) { + if (ivf.iloc == (int) ENCSEGMENT) { + pointdealloc(steinpt); + // Split an encroached segment. + i = randomnation(encseglist->objects); + paryseg = (face *) fastlookup(encseglist, i); + splitseg = *paryseg; + encseglist->restart(); + + // Split the segment. + pa = sorg(splitseg); + pb = sdest(splitseg); + // Create a new point. + makepoint(&steinpt, FREESEGVERTEX); + for (i = 0; i < 3; i++) { + steinpt[i] = 0.5 * (pa[i] + pb[i]); + } + point2tetorg(pa, searchtet); + ivf.iloc = (int) OUTSIDE; + ivf.rejflag = 0; + if (!insertpoint_cdt(steinpt, &searchtet, &splitsh, &splitseg, &ivf, + cavpoints, cavfaces, cavshells, newtets, + crosstets, misfaces)) { + terminatetetgen(this, 2); + } + if (useinsertradius) { + save_segmentpoint_insradius(steinpt, ivf.parentpt, ivf.smlen); + } + st_segref_count++; + if (steinerleft > 0) steinerleft--; + } else { + terminatetetgen(this, 2); // assert(0); + } + } else { + if (useinsertradius) { + save_facetpoint_insradius(steinpt, ivf.parentpt, ivf.smlen); + } + st_facref_count++; + if (steinerleft > 0) steinerleft--; + } + + while (subsegstack->objects > 0l) { + // seglist is used as a stack. + subsegstack->objects--; + paryseg = (face *) fastlookup(subsegstack, subsegstack->objects); + splitseg = *paryseg; + + // Check if this segment has been recovered. + sstpivot1(splitseg, searchtet); + if (searchtet.tet != NULL) continue; + + // Search the segment. + dir = scoutsegment(sorg(splitseg), sdest(splitseg), &splitseg, &searchtet, + &refpt, NULL); + if (dir == SHAREEDGE) { + // Found this segment, insert it. + // Let the segment remember an adjacent tet. + sstbond1(splitseg, searchtet); + // Bond the segment to all tets containing it. + spintet = searchtet; + do { + tssbond1(spintet, splitseg); + fnextself(spintet); + } while (spintet.tet != searchtet.tet); + } else { + if ((dir == ACROSSFACE) || (dir == ACROSSEDGE)) { + // Split the segment. + makepoint(&steinpt, FREESEGVERTEX); + getsteinerptonsegment(&splitseg, refpt, steinpt); + ivf.iloc = (int) OUTSIDE; + ivf.rejflag = 0; + if (!insertpoint_cdt(steinpt, &searchtet, &splitsh, &splitseg, &ivf, + cavpoints, cavfaces, cavshells, newtets, + crosstets, misfaces)) { + terminatetetgen(this, 2); + } + if (useinsertradius) { + save_segmentpoint_insradius(steinpt, ivf.parentpt, ivf.smlen); + } + st_segref_count++; + if (steinerleft > 0) steinerleft--; + } else { + terminatetetgen(this, 2); + } + } + } // while + + if (b->verbose > 2) { + printf(" Added %ld Steiner points.\n", points->items - baknum); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// constrainedfacets() Recover constrained facets in a CDT. // +// // +// All unrecovered subfaces are queued in 'subfacestack'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::constrainedfacets() +{ + arraypool *tg_crosstets, *tg_topnewtets, *tg_botnewtets; + arraypool *tg_topfaces, *tg_botfaces, *tg_midfaces; + arraypool *tg_topshells, *tg_botshells, *tg_facfaces; + arraypool *tg_toppoints, *tg_botpoints; + arraypool *tg_missingshs, *tg_missingshbds, *tg_missingshverts; + triface searchtet, neightet, crossedge; + face searchsh, *parysh, *parysh1; + face *paryseg; + point *parypt; + enum interresult dir; + int facetcount; + int success; + int t1ver; + int i, j; + + // Initialize arrays. + tg_crosstets = new arraypool(sizeof(triface), 10); + tg_topnewtets = new arraypool(sizeof(triface), 10); + tg_botnewtets = new arraypool(sizeof(triface), 10); + tg_topfaces = new arraypool(sizeof(triface), 10); + tg_botfaces = new arraypool(sizeof(triface), 10); + tg_midfaces = new arraypool(sizeof(triface), 10); + tg_toppoints = new arraypool(sizeof(point), 8); + tg_botpoints = new arraypool(sizeof(point), 8); + tg_facfaces = new arraypool(sizeof(face), 10); + tg_topshells = new arraypool(sizeof(face), 10); + tg_botshells = new arraypool(sizeof(face), 10); + tg_missingshs = new arraypool(sizeof(face), 10); + tg_missingshbds = new arraypool(sizeof(face), 10); + tg_missingshverts = new arraypool(sizeof(point), 8); + // This is a global array used by refineregion(). + encseglist = new arraypool(sizeof(face), 4); + + facetcount = 0; + + while (subfacstack->objects > 0l) { + + subfacstack->objects--; + parysh = (face *) fastlookup(subfacstack, subfacstack->objects); + searchsh = *parysh; + + if (searchsh.sh[3] == NULL) continue; // It is dead. + if (isshtet(searchsh)) continue; // It is recovered. + + // Collect all unrecovered subfaces which are co-facet. + smarktest(searchsh); + tg_facfaces->newindex((void **) &parysh); + *parysh = searchsh; + for (i = 0; i < tg_facfaces->objects; i++) { + parysh = (face *) fastlookup(tg_facfaces, i); + for (j = 0; j < 3; j++) { + if (!isshsubseg(*parysh)) { + spivot(*parysh, searchsh); + if (!smarktested(searchsh)) { + if (!isshtet(searchsh)) { + smarktest(searchsh); + tg_facfaces->newindex((void **) &parysh1); + *parysh1 = searchsh; + } + } + } + senextself(*parysh); + } // j + } // i + // Have found all facet subfaces. Unmark them. + for (i = 0; i < tg_facfaces->objects; i++) { + parysh = (face *) fastlookup(tg_facfaces, i); + sunmarktest(*parysh); + } + + if (b->verbose > 1) { + printf(" Recovering facet #%d: %ld subfaces.\n", facetcount + 1, + tg_facfaces->objects); + } + facetcount++; + + while (tg_facfaces->objects > 0l) { + + tg_facfaces->objects--; + parysh = (face *) fastlookup(tg_facfaces, tg_facfaces->objects); + searchsh = *parysh; + + if (searchsh.sh[3] == NULL) continue; // It is dead. + if (isshtet(searchsh)) continue; // It is recovered. + + searchtet.tet = NULL; + if (scoutsubface(&searchsh, &searchtet, 1)) continue; + + // The subface is missing. Form the missing region. + // Re-use 'tg_crosstets' for 'adjtets'. + formregion(&searchsh, tg_missingshs, tg_missingshbds, tg_missingshverts); + + int searchflag = scoutcrossedge(searchtet, tg_missingshbds, tg_missingshs); + if (searchflag > 0) { + // Save this crossing edge, will be used by fillcavity(). + crossedge = searchtet; + // Form a cavity of crossing tets. + success = formcavity(&searchtet, tg_missingshs, tg_crosstets, + tg_topfaces, tg_botfaces, tg_toppoints, + tg_botpoints); + if (success) { + if (!b->flipinsert) { + // Tetrahedralize the top part. Re-use 'tg_midfaces'. + delaunizecavity(tg_toppoints, tg_topfaces, tg_topshells, + tg_topnewtets, tg_crosstets, tg_midfaces); + // Tetrahedralize the bottom part. Re-use 'tg_midfaces'. + delaunizecavity(tg_botpoints, tg_botfaces, tg_botshells, + tg_botnewtets, tg_crosstets, tg_midfaces); + // Fill the cavity with new tets. + success = fillcavity(tg_topshells, tg_botshells, tg_midfaces, + tg_missingshs, tg_topnewtets, tg_botnewtets, + &crossedge); + if (success) { + // Cavity is remeshed. Delete old tets and outer new tets. + carvecavity(tg_crosstets, tg_topnewtets, tg_botnewtets); + } else { + restorecavity(tg_crosstets, tg_topnewtets, tg_botnewtets, + tg_missingshbds); + } + } else { + // Use the flip algorithm of Shewchuk to recover the subfaces. + flipinsertfacet(tg_crosstets, tg_toppoints, tg_botpoints, + tg_missingshverts); + // Put all subfaces in R back to tg_facfaces. + for (i = 0; i < tg_missingshs->objects; i++) { + parysh = (face *) fastlookup(tg_missingshs, i); + tg_facfaces->newindex((void **) &parysh1); + *parysh1 = *parysh; + } + success = 1; + // Clear working lists. + tg_crosstets->restart(); + tg_topfaces->restart(); + tg_botfaces->restart(); + tg_toppoints->restart(); + tg_botpoints->restart(); + } // b->flipinsert + + if (success) { + // Recover interior subfaces. + for (i = 0; i < caveencshlist->objects; i++) { + parysh = (face *) fastlookup(caveencshlist, i); + if (!scoutsubface(parysh, &searchtet, 1)) { + // Add this face at the end of the list, so it will be + // processed immediately. + tg_facfaces->newindex((void **) &parysh1); + *parysh1 = *parysh; + } + } + caveencshlist->restart(); + // Recover interior segments. This should always be recovered. + for (i = 0; i < caveencseglist->objects; i++) { + paryseg = (face *) fastlookup(caveencseglist, i); + dir = scoutsegment(sorg(*paryseg), sdest(*paryseg), paryseg, + &searchtet, NULL, NULL); + if (dir != SHAREEDGE) { + terminatetetgen(this, 2); + } + // Insert this segment. + // Let the segment remember an adjacent tet. + sstbond1(*paryseg, searchtet); + // Bond the segment to all tets containing it. + neightet = searchtet; + do { + tssbond1(neightet, *paryseg); + fnextself(neightet); + } while (neightet.tet != searchtet.tet); + } + caveencseglist->restart(); + } // success - remesh cavity + } // success - form cavity + else { + terminatetetgen(this, 2); // Report a bug. + } // Not success - form cavity + } else { + // Put all subfaces in R back to tg_facfaces. + for (i = 0; i < tg_missingshs->objects; i++) { + parysh = (face *) fastlookup(tg_missingshs, i); + tg_facfaces->newindex((void **) &parysh1); + *parysh1 = *parysh; + } + if (searchflag != -1) { + // Some edge(s) in the missing regions were flipped. + success = 1; + } else { + restorecavity(tg_crosstets, tg_topnewtets, tg_botnewtets, + tg_missingshbds); // Only remove fake segments. + // Choose an edge to split (set in recentsh) + recentsh = searchsh; + success = 0; // Do refineregion(); + } + } // if (scoutcrossedge) + + // Unmarktest all points of the missing region. + for (i = 0; i < tg_missingshverts->objects; i++) { + parypt = (point *) fastlookup(tg_missingshverts, i); + punmarktest(*parypt); + } + tg_missingshverts->restart(); + tg_missingshbds->restart(); + tg_missingshs->restart(); + + if (!success) { + // The missing region can not be recovered. Refine it. + refineregion(recentsh, tg_toppoints, tg_topfaces, tg_topshells, + tg_topnewtets, tg_crosstets, tg_midfaces); + } + } // while (tg_facfaces->objects) + + } // while ((subfacstack->objects) + + // Accumulate the dynamic memory. + totalworkmemory += (tg_crosstets->totalmemory + tg_topnewtets->totalmemory + + tg_botnewtets->totalmemory + tg_topfaces->totalmemory + + tg_botfaces->totalmemory + tg_midfaces->totalmemory + + tg_toppoints->totalmemory + tg_botpoints->totalmemory + + tg_facfaces->totalmemory + tg_topshells->totalmemory + + tg_botshells->totalmemory + tg_missingshs->totalmemory + + tg_missingshbds->totalmemory + + tg_missingshverts->totalmemory + + encseglist->totalmemory); + + // Delete arrays. + delete tg_crosstets; + delete tg_topnewtets; + delete tg_botnewtets; + delete tg_topfaces; + delete tg_botfaces; + delete tg_midfaces; + delete tg_toppoints; + delete tg_botpoints; + delete tg_facfaces; + delete tg_topshells; + delete tg_botshells; + delete tg_missingshs; + delete tg_missingshbds; + delete tg_missingshverts; + delete encseglist; + encseglist = NULL; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// constraineddelaunay() Create a constrained Delaunay tetrahedralization.// +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::constraineddelaunay(clock_t& tv) +{ + face searchsh, *parysh; + face searchseg, *paryseg; + int s, i; + + // Statistics. + long bakfillregioncount; + long bakcavitycount, bakcavityexpcount; + long bakseg_ref_count; + + if (!b->quiet) { + printf("Constrained Delaunay...\n"); + } + + makesegmentendpointsmap(); + makefacetverticesmap(); + + if (b->verbose) { + printf(" Delaunizing segments.\n"); + } + + checksubsegflag = 1; + + // Put all segments into the list (in random order). + subsegs->traversalinit(); + for (i = 0; i < subsegs->items; i++) { + s = randomnation(i + 1); + // Move the s-th seg to the i-th. + subsegstack->newindex((void **) &paryseg); + *paryseg = * (face *) fastlookup(subsegstack, s); + // Put i-th seg to be the s-th. + searchseg.sh = shellfacetraverse(subsegs); + //sinfect(searchseg); // Only save it once. + paryseg = (face *) fastlookup(subsegstack, s); + *paryseg = searchseg; + } + + // Recover non-Delaunay segments. + delaunizesegments(); + + if (b->verbose) { + printf(" Inserted %ld Steiner points.\n", st_segref_count); + } + + tv = clock(); + + if (b->verbose) { + printf(" Constraining facets.\n"); + } + + // Subfaces will be introduced. + checksubfaceflag = 1; + + bakfillregioncount = fillregioncount; + bakcavitycount = cavitycount; + bakcavityexpcount = cavityexpcount; + bakseg_ref_count = st_segref_count; + + // Randomly order the subfaces. + subfaces->traversalinit(); + for (i = 0; i < subfaces->items; i++) { + s = randomnation(i + 1); + // Move the s-th subface to the i-th. + subfacstack->newindex((void **) &parysh); + *parysh = * (face *) fastlookup(subfacstack, s); + // Put i-th subface to be the s-th. + searchsh.sh = shellfacetraverse(subfaces); + parysh = (face *) fastlookup(subfacstack, s); + *parysh = searchsh; + } + + // Recover facets. + constrainedfacets(); + + if (b->verbose) { + if (fillregioncount > bakfillregioncount) { + printf(" Remeshed %ld regions.\n", fillregioncount-bakfillregioncount); + } + if (cavitycount > bakcavitycount) { + printf(" Remeshed %ld cavities", cavitycount - bakcavitycount); + if (cavityexpcount - bakcavityexpcount) { + printf(" (%ld enlarged)", cavityexpcount - bakcavityexpcount); + } + printf(".\n"); + } + if (st_segref_count + st_facref_count - bakseg_ref_count > 0) { + printf(" Inserted %ld (%ld, %ld) refine points.\n", + st_segref_count + st_facref_count - bakseg_ref_count, + st_segref_count - bakseg_ref_count, st_facref_count); + } + } +} + +//// //// +//// //// +//// constrained_cxx ////////////////////////////////////////////////////////// + +//// steiner_cxx ////////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// checkflipeligibility() A call back function for boundary recovery. // +// // +// 'fliptype' indicates which elementary flip will be performed: 1 : 2-to-3, // +// and 2 : 3-to-2, respectively. // +// // +// 'pa, ..., pe' are the vertices involved in this flip, where [a,b,c] is // +// the flip face, and [d,e] is the flip edge. NOTE: 'pc' may be 'dummypoint',// +// other points must not be 'dummypoint'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checkflipeligibility(int fliptype, point pa, point pb, + point pc, point pd, point pe, + int level, int edgepivot, + flipconstraints* fc) +{ + point tmppts[3]; + enum interresult dir; + int types[2], poss[4]; + int intflag; + int rejflag = 0; + int i; + + if (fc->seg[0] != NULL) { + // A constraining edge is given (e.g., for edge recovery). + if (fliptype == 1) { + // A 2-to-3 flip: [a,b,c] => [e,d,a], [e,d,b], [e,d,c]. + tmppts[0] = pa; + tmppts[1] = pb; + tmppts[2] = pc; + for (i = 0; i < 3 && !rejflag; i++) { + if (tmppts[i] != dummypoint) { + // Test if the face [e,d,#] intersects the edge. + intflag = tri_edge_test(pe, pd, tmppts[i], fc->seg[0], fc->seg[1], + NULL, 1, types, poss); + if (intflag == 2) { + // They intersect at a single point. + dir = (enum interresult) types[0]; + if (dir == ACROSSFACE) { + // The interior of [e,d,#] intersect the segment. + rejflag = 1; + } else if (dir == ACROSSEDGE) { + if (poss[0] == 0) { + // The interior of [e,d] intersect the segment. + // Since [e,d] is the newly created edge. Reject this flip. + rejflag = 1; + } + } + } else if (intflag == 4) { + // They may intersect at either a point or a line segment. + dir = (enum interresult) types[0]; + if (dir == ACROSSEDGE) { + if (poss[0] == 0) { + // The interior of [e,d] intersect the segment. + // Since [e,d] is the newly created edge. Reject this flip. + rejflag = 1; + } + } + } + } // if (tmppts[0] != dummypoint) + } // i + } else if (fliptype == 2) { + // A 3-to-2 flip: [e,d,a], [e,d,b], [e,d,c] => [a,b,c] + if (pc != dummypoint) { + // Check if the new face [a,b,c] intersect the edge in its interior. + intflag = tri_edge_test(pa, pb, pc, fc->seg[0], fc->seg[1], NULL, + 1, types, poss); + if (intflag == 2) { + // They intersect at a single point. + dir = (enum interresult) types[0]; + if (dir == ACROSSFACE) { + // The interior of [a,b,c] intersect the segment. + rejflag = 1; // Do not flip. + } + } else if (intflag == 4) { + // [a,b,c] is coplanar with the edge. + dir = (enum interresult) types[0]; + if (dir == ACROSSEDGE) { + // The boundary of [a,b,c] intersect the segment. + rejflag = 1; // Do not flip. + } + } + } // if (pc != dummypoint) + } + } // if (fc->seg[0] != NULL) + + if ((fc->fac[0] != NULL) && !rejflag) { + // A constraining face is given (e.g., for face recovery). + if (fliptype == 1) { + // A 2-to-3 flip. + // Test if the new edge [e,d] intersects the face. + intflag = tri_edge_test(fc->fac[0], fc->fac[1], fc->fac[2], pe, pd, + NULL, 1, types, poss); + if (intflag == 2) { + // They intersect at a single point. + dir = (enum interresult) types[0]; + if (dir == ACROSSFACE) { + rejflag = 1; + } else if (dir == ACROSSEDGE) { + rejflag = 1; + } + } else if (intflag == 4) { + // The edge [e,d] is coplanar with the face. + // There may be two intersections. + for (i = 0; i < 2 && !rejflag; i++) { + dir = (enum interresult) types[i]; + if (dir == ACROSSFACE) { + rejflag = 1; + } else if (dir == ACROSSEDGE) { + rejflag = 1; + } + } + } + } // if (fliptype == 1) + } // if (fc->fac[0] != NULL) + + if ((fc->remvert != NULL) && !rejflag) { + // The vertex is going to be removed. Do not create a new edge which + // contains this vertex. + if (fliptype == 1) { + // A 2-to-3 flip. + if ((pd == fc->remvert) || (pe == fc->remvert)) { + rejflag = 1; + } + } + } + + if (fc->remove_large_angle && !rejflag) { + // Remove a large dihedral angle. Do not create a new small angle. + REAL cosmaxd = 0, diff; + if (fliptype == 1) { + // We assume that neither 'a' nor 'b' is dummypoint. + // A 2-to-3 flip: [a,b,c] => [e,d,a], [e,d,b], [e,d,c]. + // The new tet [e,d,a,b] will be flipped later. Only two new tets: + // [e,d,b,c] and [e,d,c,a] need to be checked. + if ((pc != dummypoint) && (pe != dummypoint) && (pd != dummypoint)) { + // Get the largest dihedral angle of [e,d,b,c]. + tetalldihedral(pe, pd, pb, pc, NULL, &cosmaxd, NULL); + diff = cosmaxd - fc->cosdihed_in; + if (fabs(diff/fc->cosdihed_in) < b->epsilon) diff = 0.0; // Rounding. + if (diff <= 0) { //if (cosmaxd <= fc->cosdihed_in) { + rejflag = 1; + } else { + // Record the largest new angle. + if (cosmaxd < fc->cosdihed_out) { + fc->cosdihed_out = cosmaxd; + } + // Get the largest dihedral angle of [e,d,c,a]. + tetalldihedral(pe, pd, pc, pa, NULL, &cosmaxd, NULL); + diff = cosmaxd - fc->cosdihed_in; + if (fabs(diff/fc->cosdihed_in) < b->epsilon) diff = 0.0; // Rounding. + if (diff <= 0) { //if (cosmaxd <= fc->cosdihed_in) { + rejflag = 1; + } else { + // Record the largest new angle. + if (cosmaxd < fc->cosdihed_out) { + fc->cosdihed_out = cosmaxd; + } + } + } + } // if (pc != dummypoint && ...) + } else if (fliptype == 2) { + // A 3-to-2 flip: [e,d,a], [e,d,b], [e,d,c] => [a,b,c] + // We assume that neither 'e' nor 'd' is dummypoint. + if (level == 0) { + // Both new tets [a,b,c,d] and [b,a,c,e] are new tets. + if ((pa != dummypoint) && (pb != dummypoint) && (pc != dummypoint)) { + // Get the largest dihedral angle of [a,b,c,d]. + tetalldihedral(pa, pb, pc, pd, NULL, &cosmaxd, NULL); + diff = cosmaxd - fc->cosdihed_in; + if (fabs(diff/fc->cosdihed_in) < b->epsilon) diff = 0.0; // Rounding + if (diff <= 0) { //if (cosmaxd <= fc->cosdihed_in) { + rejflag = 1; + } else { + // Record the largest new angle. + if (cosmaxd < fc->cosdihed_out) { + fc->cosdihed_out = cosmaxd; + } + // Get the largest dihedral angle of [b,a,c,e]. + tetalldihedral(pb, pa, pc, pe, NULL, &cosmaxd, NULL); + diff = cosmaxd - fc->cosdihed_in; + if (fabs(diff/fc->cosdihed_in) < b->epsilon) diff = 0.0;// Rounding + if (diff <= 0) { //if (cosmaxd <= fc->cosdihed_in) { + rejflag = 1; + } else { + // Record the largest new angle. + if (cosmaxd < fc->cosdihed_out) { + fc->cosdihed_out = cosmaxd; + } + } + } + } + } else { // level > 0 + if (edgepivot == 1) { + // The new tet [a,b,c,d] will be flipped. Only check [b,a,c,e]. + if ((pa != dummypoint) && (pb != dummypoint) && (pc != dummypoint)) { + // Get the largest dihedral angle of [b,a,c,e]. + tetalldihedral(pb, pa, pc, pe, NULL, &cosmaxd, NULL); + diff = cosmaxd - fc->cosdihed_in; + if (fabs(diff/fc->cosdihed_in) < b->epsilon) diff = 0.0;// Rounding + if (diff <= 0) { //if (cosmaxd <= fc->cosdihed_in) { + rejflag = 1; + } else { + // Record the largest new angle. + if (cosmaxd < fc->cosdihed_out) { + fc->cosdihed_out = cosmaxd; + } + } + } + } else { + // The new tet [b,a,c,e] will be flipped. Only check [a,b,c,d]. + if ((pa != dummypoint) && (pb != dummypoint) && (pc != dummypoint)) { + // Get the largest dihedral angle of [b,a,c,e]. + tetalldihedral(pa, pb, pc, pd, NULL, &cosmaxd, NULL); + diff = cosmaxd - fc->cosdihed_in; + if (fabs(diff/fc->cosdihed_in) < b->epsilon) diff = 0.0;// Rounding + if (diff <= 0) { //if (cosmaxd <= fc->cosdihed_in) { + rejflag = 1; + } else { + // Record the largest new angle. + if (cosmaxd < fc->cosdihed_out) { + fc->cosdihed_out = cosmaxd; + } + } + } + } // edgepivot + } // level + } + } + + return rejflag; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// removeedgebyflips() Attempt to remove an edge by flips. // +// // +// 'flipedge' is a non-convex or flat edge [a,b,#,#] to be removed. // +// // +// The return value is a positive integer, it indicates whether the edge is // +// removed or not. A value "2" means the edge is removed, otherwise, the // +// edge is not removed and the value (must >= 3) is the current number of // +// tets in the edge star. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::removeedgebyflips(triface *flipedge, flipconstraints* fc) +{ + triface *abtets, spintet; + int t1ver; + int n, nn, i; + + + if (checksubsegflag) { + // Do not flip a segment. + if (issubseg(*flipedge)) { + if (fc->collectencsegflag) { + face checkseg, *paryseg; + tsspivot1(*flipedge, checkseg); + if (!sinfected(checkseg)) { + // Queue this segment in list. + sinfect(checkseg); + caveencseglist->newindex((void **) &paryseg); + *paryseg = checkseg; + } + } + return 0; + } + } + + // Count the number of tets at edge [a,b]. + n = 0; + spintet = *flipedge; + while (1) { + n++; + fnextself(spintet); + if (spintet.tet == flipedge->tet) break; + } + if (n < 3) { + // It is only possible when the mesh contains inverted tetrahedra. + terminatetetgen(this, 2); // Report a bug + } + + if ((b->flipstarsize > 0) && (n > b->flipstarsize)) { + // The star size exceeds the limit. + return 0; // Do not flip it. + } + + // Allocate spaces. + abtets = new triface[n]; + // Collect the tets at edge [a,b]. + spintet = *flipedge; + i = 0; + while (1) { + abtets[i] = spintet; + setelemcounter(abtets[i], 1); + i++; + fnextself(spintet); + if (spintet.tet == flipedge->tet) break; + } + + + // Try to flip the edge (level = 0, edgepivot = 0). + nn = flipnm(abtets, n, 0, 0, fc); + + + if (nn > 2) { + // Edge is not flipped. Unmarktest the remaining tets in Star(ab). + for (i = 0; i < nn; i++) { + setelemcounter(abtets[i], 0); + } + // Restore the input edge (needed by Lawson's flip). + *flipedge = abtets[0]; + } + + // Release the temporary allocated spaces. + // NOTE: fc->unflip must be 0. + int bakunflip = fc->unflip; + fc->unflip = 0; + flipnm_post(abtets, n, nn, 0, fc); + fc->unflip = bakunflip; + + delete [] abtets; + + return nn; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// removefacebyflips() Remove a face by flips. // +// // +// Return 1 if the face is removed. Otherwise, return 0. // +// // +// ASSUMPTIONS: // +// - 'flipface' must not be a subface. // +// - 'flipface' must not be a hull face. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::removefacebyflips(triface *flipface, flipconstraints* fc) +{ + triface fliptets[3], flipedge; + point pa, pb, pc, pd, pe; + REAL ori; + int reducflag = 0; + + fliptets[0] = *flipface; + fsym(*flipface, fliptets[1]); + pa = org(fliptets[0]); + pb = dest(fliptets[0]); + pc = apex(fliptets[0]); + pd = oppo(fliptets[0]); + pe = oppo(fliptets[1]); + + ori = orient3d(pa, pb, pd, pe); + if (ori > 0) { + ori = orient3d(pb, pc, pd, pe); + if (ori > 0) { + ori = orient3d(pc, pa, pd, pe); + if (ori > 0) { + // Found a 2-to-3 flip. + reducflag = 1; + } else { + eprev(*flipface, flipedge); // [c,a] + } + } else { + enext(*flipface, flipedge); // [b,c] + } + } else { + flipedge = *flipface; // [a,b] + } + + if (reducflag) { + // A 2-to-3 flip is found. + flip23(fliptets, 0, fc); + return 1; + } else { + // Try to flip the selected edge of this face. + if (removeedgebyflips(&flipedge, fc) == 2) { + return 1; + } + } + + // Face is not removed. + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// recoveredge() Recover an edge in current tetrahedralization. // +// // +// If the edge is recovered, 'searchtet' returns a tet containing the edge. // +// // +// This edge may intersect a set of faces and edges in the mesh. All these // +// faces or edges are needed to be removed. // +// // +// If the parameter 'fullsearch' is set, it tries to flip any face or edge // +// that intersects the recovering edge. Otherwise, only the face or edge // +// which is visible by 'startpt' is tried. // +// // +// The parameter 'sedge' is used to report self-intersection. If it is not // +// a NULL, it is EITHER a segment OR a subface that contains this edge. // +// // +// Note that this routine assumes that the tetrahedralization is convex. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::recoveredgebyflips(point startpt, point endpt, face *sedge, + triface* searchtet, int fullsearch) +{ + flipconstraints fc; + enum interresult dir; + + fc.seg[0] = startpt; + fc.seg[1] = endpt; + fc.checkflipeligibility = 1; + + // The mainloop of the edge reocvery. + while (1) { // Loop I + + // Search the edge from 'startpt'. + point2tetorg(startpt, *searchtet); + dir = finddirection(searchtet, endpt); + if (dir == ACROSSVERT) { + if (dest(*searchtet) == endpt) { + return 1; // Edge is recovered. + } else { + if (sedge) { + return report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + } else { + return 0; + } + } + } + + // The edge is missing. + + // Try to remove the first intersecting face/edge. + enextesymself(*searchtet); // Go to the opposite face. + if (dir == ACROSSFACE) { + if (checksubfaceflag) { + if (issubface(*searchtet)) { + if (sedge) { + return report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + } else { + return 0; // Cannot flip a subface. + } + } + } + // Try to flip a crossing face. + if (removefacebyflips(searchtet, &fc)) { + continue; + } + } else if (dir == ACROSSEDGE) { + if (checksubsegflag) { + if (issubseg(*searchtet)) { + if (sedge) { + return report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + } else { + return 0; // Cannot flip a segment. + } + } + } + // Try to flip an intersecting edge. + if (removeedgebyflips(searchtet, &fc) == 2) { + continue; + } + } + + // The edge is missing. + + if (fullsearch) { + // Try to flip one of the faces/edges which intersects the edge. + triface neightet, spintet; + point pa, pb, pc, pd; + badface bakface; + enum interresult dir1; + int types[2], poss[4], pos = 0; + int success = 0; + int t1ver; + int i, j; + + // Loop through the sequence of intersecting faces/edges from + // 'startpt' to 'endpt'. + point2tetorg(startpt, *searchtet); + dir = finddirection(searchtet, endpt); + + // Go to the face/edge intersecting the searching edge. + enextesymself(*searchtet); // Go to the opposite face. + // This face/edge has been tried in previous step. + + while (1) { // Loop I-I + + // Find the next intersecting face/edge. + fsymself(*searchtet); + if (dir == ACROSSFACE) { + neightet = *searchtet; + j = (neightet.ver & 3); // j is the current face number. + for (i = j + 1; i < j + 4; i++) { + neightet.ver = (i % 4); + pa = org(neightet); + pb = dest(neightet); + pc = apex(neightet); + pd = oppo(neightet); // The above point. + if (tri_edge_test(pa,pb,pc,startpt,endpt, pd, 1, types, poss)) { + dir = (enum interresult) types[0]; + pos = poss[0]; + break; + } else { + dir = DISJOINT; + pos = 0; + } + } // i + // There must be an intersection face/edge. + if (dir == DISJOINT) { + terminatetetgen(this, 2); + } + } else if (dir == ACROSSEDGE) { + while (1) { // Loop I-I-I + // Check the two opposite faces (of the edge) in 'searchtet'. + for (i = 0; i < 2; i++) { + if (i == 0) { + enextesym(*searchtet, neightet); + } else { + eprevesym(*searchtet, neightet); + } + pa = org(neightet); + pb = dest(neightet); + pc = apex(neightet); + pd = oppo(neightet); // The above point. + if (tri_edge_test(pa,pb,pc,startpt,endpt,pd,1, types, poss)) { + dir = (enum interresult) types[0]; + pos = poss[0]; + break; // for loop + } else { + dir = DISJOINT; + pos = 0; + } + } // i + if (dir != DISJOINT) { + // Find an intersection face/edge. + break; // Loop I-I-I + } + // No intersection. Rotate to the next tet at the edge. + fnextself(*searchtet); + } // while (1) // Loop I-I-I + } else { + terminatetetgen(this, 2); // Report a bug + } + + // Adjust to the intersecting edge/vertex. + for (i = 0; i < pos; i++) { + enextself(neightet); + } + + if (dir == SHAREVERT) { + // Check if we have reached the 'endpt'. + pd = org(neightet); + if (pd == endpt) { + // Failed to recover the edge. + break; // Loop I-I + } else { + terminatetetgen(this, 2); // Report a bug + } + } + + // The next to be flipped face/edge. + *searchtet = neightet; + + // Bakup this face (tetrahedron). + bakface.forg = org(*searchtet); + bakface.fdest = dest(*searchtet); + bakface.fapex = apex(*searchtet); + bakface.foppo = oppo(*searchtet); + + // Try to flip this intersecting face/edge. + if (dir == ACROSSFACE) { + if (checksubfaceflag) { + if (issubface(*searchtet)) { + if (sedge) { + return report_selfint_edge(startpt,endpt,sedge,searchtet,dir); + } else { + return 0; // Cannot flip a subface. + } + } + } + if (removefacebyflips(searchtet, &fc)) { + success = 1; + break; // Loop I-I + } + } else if (dir == ACROSSEDGE) { + if (checksubsegflag) { + if (issubseg(*searchtet)) { + if (sedge) { + return report_selfint_edge(startpt,endpt,sedge,searchtet,dir); + } else { + return 0; // Cannot flip a segment. + } + } + } + if (removeedgebyflips(searchtet, &fc) == 2) { + success = 1; + break; // Loop I-I + } + } else if (dir == ACROSSVERT) { + if (sedge) { + //return report_selfint_edge(startpt, endpt, sedge, searchtet, dir); + terminatetetgen(this, 2); + } else { + return 0; + } + } else { + terminatetetgen(this, 2); + } + + // The face/edge is not flipped. + if ((searchtet->tet == NULL) || + (org(*searchtet) != bakface.forg) || + (dest(*searchtet) != bakface.fdest) || + (apex(*searchtet) != bakface.fapex) || + (oppo(*searchtet) != bakface.foppo)) { + // 'searchtet' was flipped. We must restore it. + point2tetorg(bakface.forg, *searchtet); + dir1 = finddirection(searchtet, bakface.fdest); + if (dir1 == ACROSSVERT) { + if (dest(*searchtet) == bakface.fdest) { + spintet = *searchtet; + while (1) { + if (apex(spintet) == bakface.fapex) { + // Found the face. + *searchtet = spintet; + break; + } + fnextself(spintet); + if (spintet.tet == searchtet->tet) { + searchtet->tet = NULL; + break; // Not find. + } + } // while (1) + if (searchtet->tet != NULL) { + if (oppo(*searchtet) != bakface.foppo) { + fsymself(*searchtet); + if (oppo(*searchtet) != bakface.foppo) { + // The original (intersecting) tet has been flipped. + searchtet->tet = NULL; + break; // Not find. + } + } + } + } else { + searchtet->tet = NULL; // Not find. + } + } else { + searchtet->tet = NULL; // Not find. + } + if (searchtet->tet == NULL) { + success = 0; // This face/edge has been destroyed. + break; // Loop I-I + } + } + } // while (1) // Loop I-I + + if (success) { + // One of intersecting faces/edges is flipped. + continue; + } + + } // if (fullsearch) + + // The edge is missing. + break; // Loop I + + } // while (1) // Loop I + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// add_steinerpt_in_schoenhardtpoly() Insert a Steiner point in a Schoen- // +// hardt polyhedron. // +// // +// 'abtets' is an array of n tets which all share at the edge [a,b]. Let the // +// tets are [a,b,p0,p1], [a,b,p1,p2], ..., [a,b,p_(n-2),p_(n-1)]. Moreover, // +// the edge [p0,p_(n-1)] intersects all of the tets in 'abtets'. A special // +// case is that the edge [p0,p_(n-1)] is coplanar with the edge [a,b]. // +// Such set of tets arises when we want to recover an edge from 'p0' to 'p_ // +// (n-1)', and the number of tets at [a,b] can not be reduced by any flip. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::add_steinerpt_in_schoenhardtpoly(triface *abtets, int n, + int chkencflag) +{ + triface worktet, *parytet; + triface faketet1, faketet2; + point pc, pd, steinerpt; + insertvertexflags ivf; + optparameters opm; + REAL vcd[3], sampt[3], smtpt[3]; + REAL maxminvol = 0.0, minvol = 0.0, ori; + int success, maxidx = 0; + int it, i; + + + pc = apex(abtets[0]); // pc = p0 + pd = oppo(abtets[n-1]); // pd = p_(n-1) + + + // Find an optimial point in edge [c,d]. It is visible by all outer faces + // of 'abtets', and it maxmizes the min volume. + + // initialize the list of 2n boundary faces. + for (i = 0; i < n; i++) { + edestoppo(abtets[i], worktet); // [p_i,p_i+1,a] + cavetetlist->newindex((void **) &parytet); + *parytet = worktet; + eorgoppo(abtets[i], worktet); // [p_i+1,p_i,b] + cavetetlist->newindex((void **) &parytet); + *parytet = worktet; + } + + int N = 100; + REAL stepi = 0.01; + + // Search the point along the edge [c,d]. + for (i = 0; i < 3; i++) vcd[i] = pd[i] - pc[i]; + + // Sample N points in edge [c,d]. + for (it = 1; it < N; it++) { + for (i = 0; i < 3; i++) { + sampt[i] = pc[i] + (stepi * (double) it) * vcd[i]; + } + for (i = 0; i < cavetetlist->objects; i++) { + parytet = (triface *) fastlookup(cavetetlist, i); + ori = orient3d(dest(*parytet), org(*parytet), apex(*parytet), sampt); + if (i == 0) { + minvol = ori; + } else { + if (minvol > ori) minvol = ori; + } + } // i + if (it == 1) { + maxminvol = minvol; + maxidx = it; + } else { + if (maxminvol < minvol) { + maxminvol = minvol; + maxidx = it; + } + } + } // it + + if (maxminvol <= 0) { + cavetetlist->restart(); + return 0; + } + + for (i = 0; i < 3; i++) { + smtpt[i] = pc[i] + (stepi * (double) maxidx) * vcd[i]; + } + + // Create two faked tets to hold the two non-existing boundary faces: + // [d,c,a] and [c,d,b]. + maketetrahedron(&faketet1); + setvertices(faketet1, pd, pc, org(abtets[0]), dummypoint); + cavetetlist->newindex((void **) &parytet); + *parytet = faketet1; + maketetrahedron(&faketet2); + setvertices(faketet2, pc, pd, dest(abtets[0]), dummypoint); + cavetetlist->newindex((void **) &parytet); + *parytet = faketet2; + + // Point smooth options. + opm.max_min_volume = 1; + opm.numofsearchdirs = 20; + opm.searchstep = 0.001; + opm.maxiter = 100; // Limit the maximum iterations. + opm.initval = 0.0; // Initial volume is zero. + + // Try to relocate the point into the inside of the polyhedron. + success = smoothpoint(smtpt, cavetetlist, 1, &opm); + + if (success) { + while (opm.smthiter == 100) { + // It was relocated and the prescribed maximum iteration reached. + // Try to increase the search stepsize. + opm.searchstep *= 10.0; + //opm.maxiter = 100; // Limit the maximum iterations. + opm.initval = opm.imprval; + opm.smthiter = 0; // Init. + smoothpoint(smtpt, cavetetlist, 1, &opm); + } + } // if (success) + + // Delete the two faked tets. + tetrahedrondealloc(faketet1.tet); + tetrahedrondealloc(faketet2.tet); + + cavetetlist->restart(); + + if (!success) { + return 0; + } + + + // Insert the Steiner point. + makepoint(&steinerpt, FREEVOLVERTEX); + for (i = 0; i < 3; i++) steinerpt[i] = smtpt[i]; + + // Insert the created Steiner point. + for (i = 0; i < n; i++) { + infect(abtets[i]); + caveoldtetlist->newindex((void **) &parytet); + *parytet = abtets[i]; + } + worktet = abtets[0]; // No need point location. + ivf.iloc = (int) INSTAR; + ivf.chkencflag = chkencflag; + ivf.assignmeshsize = b->metric; + if (ivf.assignmeshsize) { + // Search the tet containing 'steinerpt' for size interpolation. + locate(steinerpt, &(abtets[0])); + worktet = abtets[0]; + } + + // Insert the new point into the tetrahedralization T. + // Note that T is convex (nonconvex = 0). + if (insertpoint(steinerpt, &worktet, NULL, NULL, &ivf)) { + // The vertex has been inserted. + st_volref_count++; + if (steinerleft > 0) steinerleft--; + return 1; + } else { + // Not inserted. + pointdealloc(steinerpt); + return 0; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// add_steinerpt_in_segment() Add a Steiner point inside a segment. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::add_steinerpt_in_segment(face* misseg, int searchlevel) +{ + triface searchtet; + face *paryseg, candseg; + point startpt, endpt, pc, pd; + flipconstraints fc; + enum interresult dir; + REAL P[3], Q[3], tp, tq; + REAL len, smlen = 0, split = 0, split_q = 0; + int success; + int i; + + startpt = sorg(*misseg); + endpt = sdest(*misseg); + + fc.seg[0] = startpt; + fc.seg[1] = endpt; + fc.checkflipeligibility = 1; + fc.collectencsegflag = 1; + + point2tetorg(startpt, searchtet); + dir = finddirection(&searchtet, endpt); + // Try to flip the first intersecting face/edge. + enextesymself(searchtet); // Go to the opposite face. + + int bak_fliplinklevel = b->fliplinklevel; + b->fliplinklevel = searchlevel; + + if (dir == ACROSSFACE) { + // A face is intersected with the segment. Try to flip it. + success = removefacebyflips(&searchtet, &fc); + } else if (dir == ACROSSEDGE) { + // An edge is intersected with the segment. Try to flip it. + success = removeedgebyflips(&searchtet, &fc); + } + + split = 0; + for (i = 0; i < caveencseglist->objects; i++) { + paryseg = (face *) fastlookup(caveencseglist, i); + suninfect(*paryseg); + // Calculate the shortest edge between the two lines. + pc = sorg(*paryseg); + pd = sdest(*paryseg); + tp = tq = 0; + if (linelineint(startpt, endpt, pc, pd, P, Q, &tp, &tq)) { + // Does the shortest edge lie between the two segments? + // Round tp and tq. + if ((tp > 0) && (tq < 1)) { + if (tp < 0.5) { + if (tp < (b->epsilon * 1e+3)) tp = 0.0; + } else { + if ((1.0 - tp) < (b->epsilon * 1e+3)) tp = 1.0; + } + } + if ((tp <= 0) || (tp >= 1)) continue; + if ((tq > 0) && (tq < 1)) { + if (tq < 0.5) { + if (tq < (b->epsilon * 1e+3)) tq = 0.0; + } else { + if ((1.0 - tq) < (b->epsilon * 1e+3)) tq = 1.0; + } + } + if ((tq <= 0) || (tq >= 1)) continue; + // It is a valid shortest edge. Calculate its length. + len = distance(P, Q); + if (split == 0) { + smlen = len; + split = tp; + split_q = tq; + candseg = *paryseg; + } else { + if (len < smlen) { + smlen = len; + split = tp; + split_q = tq; + candseg = *paryseg; + } + } + } + } + + caveencseglist->restart(); + b->fliplinklevel = bak_fliplinklevel; + + if (split == 0) { + // Found no crossing segment. + return 0; + } + + face splitsh; + face splitseg; + point steinerpt, *parypt; + insertvertexflags ivf; + + if (b->addsteiner_algo == 1) { + // Split the segment at the closest point to a near segment. + makepoint(&steinerpt, FREESEGVERTEX); + for (i = 0; i < 3; i++) { + steinerpt[i] = startpt[i] + split * (endpt[i] - startpt[i]); + } + } else { // b->addsteiner_algo == 2 + for (i = 0; i < 3; i++) { + P[i] = startpt[i] + split * (endpt[i] - startpt[i]); + } + pc = sorg(candseg); + pd = sdest(candseg); + for (i = 0; i < 3; i++) { + Q[i] = pc[i] + split_q * (pd[i] - pc[i]); + } + makepoint(&steinerpt, FREEVOLVERTEX); + for (i = 0; i < 3; i++) { + steinerpt[i] = 0.5 * (P[i] + Q[i]); + } + } + + // We need to locate the point. Start searching from 'searchtet'. + if (split < 0.5) { + point2tetorg(startpt, searchtet); + } else { + point2tetorg(endpt, searchtet); + } + if (b->addsteiner_algo == 1) { + splitseg = *misseg; + spivot(*misseg, splitsh); + } else { + splitsh.sh = NULL; + splitseg.sh = NULL; + } + ivf.iloc = (int) OUTSIDE; + ivf.bowywat = 1; + ivf.lawson = 0; + ivf.rejflag = 0; + ivf.chkencflag = 0; + ivf.sloc = (int) ONEDGE; + ivf.sbowywat = 1; + ivf.splitbdflag = 0; + ivf.validflag = 1; + ivf.respectbdflag = 1; + ivf.assignmeshsize = b->metric; + + if (!insertpoint(steinerpt, &searchtet, &splitsh, &splitseg, &ivf)) { + pointdealloc(steinerpt); + return 0; + } + + if (b->addsteiner_algo == 1) { + // Save this Steiner point (for removal). + // Re-use the array 'subvertstack'. + subvertstack->newindex((void **) &parypt); + *parypt = steinerpt; + st_segref_count++; + } else { // b->addsteiner_algo == 2 + // Queue the segment for recovery. + subsegstack->newindex((void **) &paryseg); + *paryseg = *misseg; + st_volref_count++; + } + if (steinerleft > 0) steinerleft--; + + return 1; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// addsteiner4recoversegment() Add a Steiner point for recovering a seg. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::addsteiner4recoversegment(face* misseg, int splitsegflag) +{ + triface *abtets, searchtet, spintet; + face splitsh; + face *paryseg; + point startpt, endpt; + point pa, pb, pd, steinerpt, *parypt; + enum interresult dir; + insertvertexflags ivf; + int types[2], poss[4]; + int n, endi, success; + int t1ver; + int i; + + startpt = sorg(*misseg); + if (pointtype(startpt) == FREESEGVERTEX) { + sesymself(*misseg); + startpt = sorg(*misseg); + } + endpt = sdest(*misseg); + + // Try to recover the edge by adding Steiner points. + point2tetorg(startpt, searchtet); + dir = finddirection(&searchtet, endpt); + enextself(searchtet); + + if (dir == ACROSSFACE) { + // The segment is crossing at least 3 faces. Find the common edge of + // the first 3 crossing faces. + esymself(searchtet); + fsym(searchtet, spintet); + pd = oppo(spintet); + for (i = 0; i < 3; i++) { + pa = org(spintet); + pb = dest(spintet); + if (tri_edge_test(pa, pb, pd, startpt, endpt, NULL, 1, types, poss)) { + break; // Found the edge. + } + enextself(spintet); + eprevself(searchtet); + } + esymself(searchtet); + } + + spintet = searchtet; + n = 0; endi = -1; + while (1) { + // Check if the endpt appears in the star. + if (apex(spintet) == endpt) { + endi = n; // Remember the position of endpt. + } + n++; // Count a tet in the star. + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + + if (endi > 0) { + // endpt is also in the edge star + // Get all tets in the edge star. + abtets = new triface[n]; + spintet = searchtet; + for (i = 0; i < n; i++) { + abtets[i] = spintet; + fnextself(spintet); + } + + success = 0; + + if (dir == ACROSSFACE) { + // Find a Steiner points inside the polyhedron. + if (add_steinerpt_in_schoenhardtpoly(abtets, endi, 0)) { + success = 1; + } + } else if (dir == ACROSSEDGE) { + // PLC check. + if (issubseg(searchtet)) { + terminatetetgen(this, 2); + } + if (n > 4) { + // In this case, 'abtets' is separated by the plane (containing the + // two intersecting edges) into two parts, P1 and P2, where P1 + // consists of 'endi' tets: abtets[0], abtets[1], ..., + // abtets[endi-1], and P2 consists of 'n - endi' tets: + // abtets[endi], abtets[endi+1], abtets[n-1]. + if (endi > 2) { // P1 + // There are at least 3 tets in the first part. + if (add_steinerpt_in_schoenhardtpoly(abtets, endi, 0)) { + success++; + } + } + if ((n - endi) > 2) { // P2 + // There are at least 3 tets in the first part. + if (add_steinerpt_in_schoenhardtpoly(&(abtets[endi]), n - endi, 0)) { + success++; + } + } + } else { + // In this case, a 4-to-4 flip should be re-cover the edge [c,d]. + // However, there will be invalid tets (either zero or negtive + // volume). Otherwise, [c,d] should already be recovered by the + // recoveredge() function. + terminatetetgen(this, 2); + } + } else { + terminatetetgen(this, 2); + } + + delete [] abtets; + + if (success) { + // Add the missing segment back to the recovering list. + subsegstack->newindex((void **) &paryseg); + *paryseg = *misseg; + return 1; + } + } // if (endi > 0) + + if (!splitsegflag) { + return 0; + } + + if (b->verbose > 2) { + printf(" Splitting segment (%d, %d)\n", pointmark(startpt), + pointmark(endpt)); + } + steinerpt = NULL; + + if (b->addsteiner_algo > 0) { // -Y/1 or -Y/2 + if (add_steinerpt_in_segment(misseg, 3)) { + return 1; + } + sesymself(*misseg); + if (add_steinerpt_in_segment(misseg, 3)) { + return 1; + } + sesymself(*misseg); + } + + + + + if (steinerpt == NULL) { + // Split the segment at its midpoint. + makepoint(&steinerpt, FREESEGVERTEX); + for (i = 0; i < 3; i++) { + steinerpt[i] = 0.5 * (startpt[i] + endpt[i]); + } + + // We need to locate the point. + spivot(*misseg, splitsh); + ivf.iloc = (int) OUTSIDE; + ivf.bowywat = 1; + ivf.lawson = 0; + ivf.rejflag = 0; + ivf.chkencflag = 0; + ivf.sloc = (int) ONEDGE; + ivf.sbowywat = 1; + ivf.splitbdflag = 0; + ivf.validflag = 1; + ivf.respectbdflag = 1; + ivf.assignmeshsize = b->metric; + if (!insertpoint(steinerpt, &searchtet, &splitsh, misseg, &ivf)) { + terminatetetgen(this, 2); + } + } // if (endi > 0) + + // Save this Steiner point (for removal). + // Re-use the array 'subvertstack'. + subvertstack->newindex((void **) &parypt); + *parypt = steinerpt; + + st_segref_count++; + if (steinerleft > 0) steinerleft--; + + return 1; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// recoversegments() Recover all segments. // +// // +// All segments need to be recovered are in 'subsegstack'. // +// // +// This routine first tries to recover each segment by only using flips. If // +// no flip is possible, and the flag 'steinerflag' is set, it then tries to // +// insert Steiner points near or in the segment. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::recoversegments(arraypool *misseglist, int fullsearch, + int steinerflag) +{ + triface searchtet, spintet; + face sseg, *paryseg; + point startpt, endpt; + int success; + int t1ver; + + long bak_inpoly_count = st_volref_count; + long bak_segref_count = st_segref_count; + + if (b->verbose > 1) { + printf(" Recover segments [%s level = %2d] #: %ld.\n", + (b->fliplinklevel > 0) ? "fixed" : "auto", + (b->fliplinklevel > 0) ? b->fliplinklevel : autofliplinklevel, + subsegstack->objects); + } + + // Loop until 'subsegstack' is empty. + while (subsegstack->objects > 0l) { + // seglist is used as a stack. + subsegstack->objects--; + paryseg = (face *) fastlookup(subsegstack, subsegstack->objects); + sseg = *paryseg; + + // Check if this segment has been recovered. + sstpivot1(sseg, searchtet); + if (searchtet.tet != NULL) { + continue; // Not a missing segment. + } + + startpt = sorg(sseg); + endpt = sdest(sseg); + + if (b->verbose > 2) { + printf(" Recover segment (%d, %d).\n", pointmark(startpt), + pointmark(endpt)); + } + + success = 0; + + if (recoveredgebyflips(startpt, endpt, &sseg, &searchtet, 0)) { + success = 1; + } else { + // Try to recover it from the other direction. + if (recoveredgebyflips(endpt, startpt, &sseg, &searchtet, 0)) { + success = 1; + } + } + + if (!success && fullsearch) { + if (recoveredgebyflips(startpt, endpt, &sseg, &searchtet, fullsearch)) { + success = 1; + } + } + + if (success) { + // Segment is recovered. Insert it. + // Let the segment remember an adjacent tet. + sstbond1(sseg, searchtet); + // Bond the segment to all tets containing it. + spintet = searchtet; + do { + tssbond1(spintet, sseg); + fnextself(spintet); + } while (spintet.tet != searchtet.tet); + } else { + if (steinerflag > 0) { + // Try to recover the segment but do not split it. + if (addsteiner4recoversegment(&sseg, 0)) { + success = 1; + } + if (!success && (steinerflag > 1)) { + // Split the segment. + addsteiner4recoversegment(&sseg, 1); + success = 1; + } + } + if (!success) { + if (misseglist != NULL) { + // Save this segment. + misseglist->newindex((void **) &paryseg); + *paryseg = sseg; + } + } + } + + } // while (subsegstack->objects > 0l) + + if (steinerflag) { + if (b->verbose > 1) { + // Report the number of added Steiner points. + if (st_volref_count > bak_inpoly_count) { + printf(" Add %ld Steiner points in volume.\n", + st_volref_count - bak_inpoly_count); + } + if (st_segref_count > bak_segref_count) { + printf(" Add %ld Steiner points in segments.\n", + st_segref_count - bak_segref_count); + } + } + } + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// recoverfacebyflips() Recover a face by flips. // +// // +// 'pa', 'pb', and 'pc' are the three vertices of this face. This routine // +// tries to recover it in the tetrahedral mesh. It is assumed that the three // +// edges, i.e., pa->pb, pb->pc, and pc->pa all exist. // +// // +// If the face is recovered, it is returned by 'searchtet'. // +// // +// If 'searchsh' is not NULL, it is a subface to be recovered. Its vertices // +// must be pa, pb, and pc. It is mainly used to check self-intersections. // +// Another use of this subface is to split it when a Steiner point is found // +// inside this subface. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::recoverfacebyflips(point pa, point pb, point pc, + face *searchsh, triface* searchtet) +{ + triface spintet, flipedge; + point pd, pe; + flipconstraints fc; + int types[2], poss[4], intflag; + int success; + int t1ver; + int i, j; + + + fc.fac[0] = pa; + fc.fac[1] = pb; + fc.fac[2] = pc; + fc.checkflipeligibility = 1; + success = 0; + + for (i = 0; i < 3 && !success; i++) { + while (1) { + // Get a tet containing the edge [a,b]. + point2tetorg(fc.fac[i], *searchtet); + finddirection(searchtet, fc.fac[(i+1)%3]); + // Search the face [a,b,c] + spintet = *searchtet; + while (1) { + if (apex(spintet) == fc.fac[(i+2)%3]) { + // Found the face. + *searchtet = spintet; + // Return the face [a,b,c]. + for (j = i; j > 0; j--) { + eprevself(*searchtet); + } + success = 1; + break; + } + fnextself(spintet); + if (spintet.tet == searchtet->tet) break; + } // while (1) + if (success) break; + // The face is missing. Try to recover it. + flipedge.tet = NULL; + // Find a crossing edge of this face. + spintet = *searchtet; + while (1) { + pd = apex(spintet); + pe = oppo(spintet); + if ((pd != dummypoint) && (pe != dummypoint)) { + // Check if [d,e] intersects [a,b,c] + intflag = tri_edge_test(pa, pb, pc, pd, pe, NULL, 1, types, poss); + if (intflag > 0) { + // By the assumption that all edges of the face exist, they can + // only intersect at a single point. + if (intflag == 2) { + // Go to the edge [d,e]. + edestoppo(spintet, flipedge); // [d,e,a,b] + if (searchsh != NULL) { + // Check the intersection type. + if ((types[0] == (int) ACROSSFACE) || + (types[0] == (int) ACROSSEDGE)) { + // Check if [e,d] is a segment. + if (issubseg(flipedge)) { + return report_selfint_face(pa, pb, pc, searchsh, &flipedge, + intflag, types, poss); + } else { + // Check if [e,d] is an edge of a subface. + triface chkface = flipedge; + while (1) { + if (issubface(chkface)) break; + fsymself(chkface); + if (chkface.tet == flipedge.tet) break; + } + if (issubface(chkface)) { + // Two subfaces are intersecting. + return report_selfint_face(pa, pb, pc,searchsh,&chkface, + intflag, types, poss); + } + } + } else if (types[0] == TOUCHFACE) { + // This is possible when a Steiner point was added on it. + point touchpt, *parypt; + if (poss[1] == 0) { + touchpt = pd; // pd is a coplanar vertex. + } else { + touchpt = pe; // pe is a coplanar vertex. + } + if (pointtype(touchpt) == FREEVOLVERTEX) { + // A volume Steiner point was added in this subface. + // Split this subface by this point. + face checksh, *parysh; + int siloc = (int) ONFACE; + int sbowat = 0; // Only split this subface. A 1-to-3 flip. + setpointtype(touchpt, FREEFACETVERTEX); + sinsertvertex(touchpt, searchsh, NULL, siloc, sbowat, 0); + st_volref_count--; + st_facref_count++; + // Queue this vertex for removal. + subvertstack->newindex((void **) &parypt); + *parypt = touchpt; + // Queue new subfaces for recovery. + // Put all new subfaces into stack for recovery. + for (i = 0; i < caveshbdlist->objects; i++) { + // Get an old subface at edge [a, b]. + parysh = (face *) fastlookup(caveshbdlist, i); + spivot(*parysh, checksh); // The new subface [a, b, p]. + // Do not recover a deleted new face (degenerated). + if (checksh.sh[3] != NULL) { + subfacstack->newindex((void **) &parysh); + *parysh = checksh; + } + } + // Delete the old subfaces in sC(p). + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + shellfacedealloc(subfaces, parysh->sh); + } + // Clear working lists. + caveshlist->restart(); + caveshbdlist->restart(); + cavesegshlist->restart(); + // We can return this function. + searchsh->sh = NULL; // It has been split. + return 1; + } else { + // Other cases may be due to a bug or a PLC error. + return report_selfint_face(pa, pb, pc, searchsh, &flipedge, + intflag, types, poss); + } + } else { + // The other intersection types: ACROSSVERT, TOUCHEDGE, + // SHAREVERTEX should not be possible or due to a PLC error. + return report_selfint_face(pa, pb, pc, searchsh, &flipedge, + intflag, types, poss); + } + } // if (searchsh != NULL) + } else { // intflag == 4. Coplanar case. + terminatetetgen(this, 2); + } + break; + } // if (intflag > 0) + } + fnextself(spintet); + if (spintet.tet == searchtet->tet) { + terminatetetgen(this, 2); + } + } // while (1) + // Try to flip the edge [d,e]. + if (removeedgebyflips(&flipedge, &fc) == 2) { + // A crossing edge is removed. + continue; + } + break; + } // while (1) + } // i + + return success; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// recoversubfaces() Recover all subfaces. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::recoversubfaces(arraypool *misshlist, int steinerflag) +{ + triface searchtet, neightet, spintet; + face searchsh, neighsh, neineish, *parysh; + face bdsegs[3]; + point startpt, endpt, apexpt, *parypt; + point steinerpt; + insertvertexflags ivf; + int success; + int t1ver; + int i, j; + + if (b->verbose > 1) { + printf(" Recover subfaces [%s level = %2d] #: %ld.\n", + (b->fliplinklevel > 0) ? "fixed" : "auto", + (b->fliplinklevel > 0) ? b->fliplinklevel : autofliplinklevel, + subfacstack->objects); + } + + // Loop until 'subfacstack' is empty. + while (subfacstack->objects > 0l) { + + subfacstack->objects--; + parysh = (face *) fastlookup(subfacstack, subfacstack->objects); + searchsh = *parysh; + + if (searchsh.sh[3] == NULL) continue; // Skip a dead subface. + + stpivot(searchsh, neightet); + if (neightet.tet != NULL) continue; // Skip a recovered subface. + + + if (b->verbose > 2) { + printf(" Recover subface (%d, %d, %d).\n",pointmark(sorg(searchsh)), + pointmark(sdest(searchsh)), pointmark(sapex(searchsh))); + } + + // The three edges of the face need to be existed first. + for (i = 0; i < 3; i++) { + sspivot(searchsh, bdsegs[i]); + if (bdsegs[i].sh != NULL) { + // The segment must exist. + sstpivot1(bdsegs[i], searchtet); + if (searchtet.tet == NULL) { + terminatetetgen(this, 2); + } + } else { + // This edge is not a segment (due to a Steiner point). + // Check whether it exists or not. + success = 0; + startpt = sorg(searchsh); + endpt = sdest(searchsh); + point2tetorg(startpt, searchtet); + finddirection(&searchtet, endpt); + if (dest(searchtet) == endpt) { + success = 1; + } else { + // The edge is missing. Try to recover it. + if (recoveredgebyflips(startpt, endpt, &searchsh, &searchtet, 0)) { + success = 1; + } else { + if (recoveredgebyflips(endpt, startpt, &searchsh, &searchtet, 0)) { + success = 1; + } + } + } + if (success) { + // Insert a temporary segment to protect this edge. + makeshellface(subsegs, &(bdsegs[i])); + setshvertices(bdsegs[i], startpt, endpt, NULL); + smarktest2(bdsegs[i]); // It's a temporary segment. + // Insert this segment into surface mesh. + ssbond(searchsh, bdsegs[i]); + spivot(searchsh, neighsh); + if (neighsh.sh != NULL) { + ssbond(neighsh, bdsegs[i]); + } + // Insert this segment into tetrahedralization. + sstbond1(bdsegs[i], searchtet); + // Bond the segment to all tets containing it. + spintet = searchtet; + do { + tssbond1(spintet, bdsegs[i]); + fnextself(spintet); + } while (spintet.tet != searchtet.tet); + } else { + // An edge of this subface is missing. Can't recover this subface. + // Delete any temporary segment that has been created. + for (j = (i - 1); j >= 0; j--) { + if (smarktest2ed(bdsegs[j])) { + spivot(bdsegs[j], neineish); + ssdissolve(neineish); + spivot(neineish, neighsh); + if (neighsh.sh != NULL) { + ssdissolve(neighsh); + } + sstpivot1(bdsegs[j], searchtet); + spintet = searchtet; + while (1) { + tssdissolve1(spintet); + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + shellfacedealloc(subsegs, bdsegs[j].sh); + } + } // j + if (steinerflag) { + // Add a Steiner point at the midpoint of this edge. + if (b->verbose > 2) { + printf(" Add a Steiner point in subedge (%d, %d).\n", + pointmark(startpt), pointmark(endpt)); + } + makepoint(&steinerpt, FREEFACETVERTEX); + for (j = 0; j < 3; j++) { + steinerpt[j] = 0.5 * (startpt[j] + endpt[j]); + } + + point2tetorg(startpt, searchtet); // Start from 'searchtet'. + ivf.iloc = (int) OUTSIDE; // Need point location. + ivf.bowywat = 1; + ivf.lawson = 0; + ivf.rejflag = 0; + ivf.chkencflag = 0; + ivf.sloc = (int) ONEDGE; + ivf.sbowywat = 1; // Allow flips in facet. + ivf.splitbdflag = 0; + ivf.validflag = 1; + ivf.respectbdflag = 1; + ivf.assignmeshsize = b->metric; + if (!insertpoint(steinerpt, &searchtet, &searchsh, NULL, &ivf)) { + terminatetetgen(this, 2); + } + // Save this Steiner point (for removal). + // Re-use the array 'subvertstack'. + subvertstack->newindex((void **) &parypt); + *parypt = steinerpt; + + st_facref_count++; + if (steinerleft > 0) steinerleft--; + } // if (steinerflag) + break; + } + } + senextself(searchsh); + } // i + + if (i == 3) { + // Recover the subface. + startpt = sorg(searchsh); + endpt = sdest(searchsh); + apexpt = sapex(searchsh); + + success = recoverfacebyflips(startpt,endpt,apexpt,&searchsh,&searchtet); + + // Delete any temporary segment that has been created. + for (j = 0; j < 3; j++) { + if (smarktest2ed(bdsegs[j])) { + spivot(bdsegs[j], neineish); + ssdissolve(neineish); + spivot(neineish, neighsh); + if (neighsh.sh != NULL) { + ssdissolve(neighsh); + } + sstpivot1(bdsegs[j], neightet); + spintet = neightet; + while (1) { + tssdissolve1(spintet); + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + shellfacedealloc(subsegs, bdsegs[j].sh); + } + } // j + + if (success) { + if (searchsh.sh != NULL) { + // Face is recovered. Insert it. + tsbond(searchtet, searchsh); + fsymself(searchtet); + sesymself(searchsh); + tsbond(searchtet, searchsh); + } + } else { + if (steinerflag) { + // Add a Steiner point at the barycenter of this subface. + if (b->verbose > 2) { + printf(" Add a Steiner point in subface (%d, %d, %d).\n", + pointmark(startpt), pointmark(endpt), pointmark(apexpt)); + } + makepoint(&steinerpt, FREEFACETVERTEX); + for (j = 0; j < 3; j++) { + steinerpt[j] = (startpt[j] + endpt[j] + apexpt[j]) / 3.0; + } + + point2tetorg(startpt, searchtet); // Start from 'searchtet'. + ivf.iloc = (int) OUTSIDE; // Need point location. + ivf.bowywat = 1; + ivf.lawson = 0; + ivf.rejflag = 0; + ivf.chkencflag = 0; + ivf.sloc = (int) ONFACE; + ivf.sbowywat = 1; // Allow flips in facet. + ivf.splitbdflag = 0; + ivf.validflag = 1; + ivf.respectbdflag = 1; + ivf.assignmeshsize = b->metric; + if (!insertpoint(steinerpt, &searchtet, &searchsh, NULL, &ivf)) { + terminatetetgen(this, 2); + } + // Save this Steiner point (for removal). + // Re-use the array 'subvertstack'. + subvertstack->newindex((void **) &parypt); + *parypt = steinerpt; + + st_facref_count++; + if (steinerleft > 0) steinerleft--; + } // if (steinerflag) + } + } else { + success = 0; + } + + if (!success) { + if (misshlist != NULL) { + // Save this subface. + misshlist->newindex((void **) &parysh); + *parysh = searchsh; + } + } + + } // while (subfacstack->objects > 0l) + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// getvertexstar() Return the star of a vertex. // +// // +// If the flag 'fullstar' is set, return the complete star of this vertex. // +// Otherwise, only a part of the star which is bounded by facets is returned.// +// // +// 'tetlist' returns the list of tets in the star of the vertex 'searchpt'. // +// Every tet in 'tetlist' is at the face opposing to 'searchpt'. // +// // +// 'vertlist' returns the list of vertices in the star (exclude 'searchpt'). // +// // +// 'shlist' returns the list of subfaces in the star. Each subface must face // +// to the interior of this star. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::getvertexstar(int fullstar, point searchpt, arraypool* tetlist, + arraypool* vertlist, arraypool* shlist) +{ + triface searchtet, neightet, *parytet; + face checksh, *parysh; + point pt, *parypt; + int collectflag; + int t1ver; + int i, j; + + point2tetorg(searchpt, searchtet); + + // Go to the opposite face (the link face) of the vertex. + enextesymself(searchtet); + //assert(oppo(searchtet) == searchpt); + infect(searchtet); // Collect this tet (link face). + tetlist->newindex((void **) &parytet); + *parytet = searchtet; + if (vertlist != NULL) { + // Collect three (link) vertices. + j = (searchtet.ver & 3); // The current vertex index. + for (i = 1; i < 4; i++) { + pt = (point) searchtet.tet[4 + ((j + i) % 4)]; + pinfect(pt); + vertlist->newindex((void **) &parypt); + *parypt = pt; + } + } + + collectflag = 1; + esym(searchtet, neightet); + if (issubface(neightet)) { + if (shlist != NULL) { + tspivot(neightet, checksh); + if (!sinfected(checksh)) { + // Collect this subface (link edge). + sinfected(checksh); + shlist->newindex((void **) &parysh); + *parysh = checksh; + } + } + if (!fullstar) { + collectflag = 0; + } + } + if (collectflag) { + fsymself(neightet); // Goto the adj tet of this face. + esymself(neightet); // Goto the oppo face of this vertex. + // assert(oppo(neightet) == searchpt); + infect(neightet); // Collect this tet (link face). + tetlist->newindex((void **) &parytet); + *parytet = neightet; + if (vertlist != NULL) { + // Collect its apex. + pt = apex(neightet); + pinfect(pt); + vertlist->newindex((void **) &parypt); + *parypt = pt; + } + } // if (collectflag) + + // Continue to collect all tets in the star. + for (i = 0; i < tetlist->objects; i++) { + searchtet = * (triface *) fastlookup(tetlist, i); + // Note that 'searchtet' is a face opposite to 'searchpt', and the neighbor + // tet at the current edge is already collected. + // Check the neighbors at the other two edges of this face. + for (j = 0; j < 2; j++) { + collectflag = 1; + enextself(searchtet); + esym(searchtet, neightet); + if (issubface(neightet)) { + if (shlist != NULL) { + tspivot(neightet, checksh); + if (!sinfected(checksh)) { + // Collect this subface (link edge). + sinfected(checksh); + shlist->newindex((void **) &parysh); + *parysh = checksh; + } + } + if (!fullstar) { + collectflag = 0; + } + } + if (collectflag) { + fsymself(neightet); + if (!infected(neightet)) { + esymself(neightet); // Go to the face opposite to 'searchpt'. + infect(neightet); + tetlist->newindex((void **) &parytet); + *parytet = neightet; + if (vertlist != NULL) { + // Check if a vertex is collected. + pt = apex(neightet); + if (!pinfected(pt)) { + pinfect(pt); + vertlist->newindex((void **) &parypt); + *parypt = pt; + } + } + } // if (!infected(neightet)) + } // if (collectflag) + } // j + } // i + + + // Uninfect the list of tets and vertices. + for (i = 0; i < tetlist->objects; i++) { + parytet = (triface *) fastlookup(tetlist, i); + uninfect(*parytet); + } + + if (vertlist != NULL) { + for (i = 0; i < vertlist->objects; i++) { + parypt = (point *) fastlookup(vertlist, i); + puninfect(*parypt); + } + } + + if (shlist != NULL) { + for (i = 0; i < shlist->objects; i++) { + parysh = (face *) fastlookup(shlist, i); + suninfect(*parysh); + } + } + + return (int) tetlist->objects; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// getedge() Get a tetrahedron having the two endpoints. // +// // +// The method here is to search the second vertex in the link faces of the // +// first vertex. The global array 'cavetetlist' is re-used for searching. // +// // +// This function is used for the case when the mesh is non-convex. Otherwise,// +// the function finddirection() should be faster than this. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::getedge(point e1, point e2, triface *tedge) +{ + triface searchtet, neightet, *parytet; + point pt; + int done; + int i, j; + + if (b->verbose > 2) { + printf(" Get edge from %d to %d.\n", pointmark(e1), pointmark(e2)); + } + + // Quickly check if 'tedge' is just this edge. + if (!isdeadtet(*tedge)) { + if (org(*tedge) == e1) { + if (dest(*tedge) == e2) { + return 1; + } + } else if (org(*tedge) == e2) { + if (dest(*tedge) == e1) { + esymself(*tedge); + return 1; + } + } + } + + // Search for the edge [e1, e2]. + point2tetorg(e1, *tedge); + finddirection(tedge, e2); + if (dest(*tedge) == e2) { + return 1; + } else { + // Search for the edge [e2, e1]. + point2tetorg(e2, *tedge); + finddirection(tedge, e1); + if (dest(*tedge) == e1) { + esymself(*tedge); + return 1; + } + } + + + // Go to the link face of e1. + point2tetorg(e1, searchtet); + enextesymself(searchtet); + arraypool *tetlist = cavebdrylist; + + // Search e2. + for (i = 0; i < 3; i++) { + pt = apex(searchtet); + if (pt == e2) { + // Found. 'searchtet' is [#,#,e2,e1]. + eorgoppo(searchtet, *tedge); // [e1,e2,#,#]. + return 1; + } + enextself(searchtet); + } + + // Get the adjacent link face at 'searchtet'. + fnext(searchtet, neightet); + esymself(neightet); + // assert(oppo(neightet) == e1); + pt = apex(neightet); + if (pt == e2) { + // Found. 'neightet' is [#,#,e2,e1]. + eorgoppo(neightet, *tedge); // [e1,e2,#,#]. + return 1; + } + + // Continue searching in the link face of e1. + infect(searchtet); + tetlist->newindex((void **) &parytet); + *parytet = searchtet; + infect(neightet); + tetlist->newindex((void **) &parytet); + *parytet = neightet; + + done = 0; + + for (i = 0; (i < tetlist->objects) && !done; i++) { + parytet = (triface *) fastlookup(tetlist, i); + searchtet = *parytet; + for (j = 0; (j < 2) && !done; j++) { + enextself(searchtet); + fnext(searchtet, neightet); + if (!infected(neightet)) { + esymself(neightet); + pt = apex(neightet); + if (pt == e2) { + // Found. 'neightet' is [#,#,e2,e1]. + eorgoppo(neightet, *tedge); + done = 1; + } else { + infect(neightet); + tetlist->newindex((void **) &parytet); + *parytet = neightet; + } + } + } // j + } // i + + // Uninfect the list of visited tets. + for (i = 0; i < tetlist->objects; i++) { + parytet = (triface *) fastlookup(tetlist, i); + uninfect(*parytet); + } + tetlist->restart(); + + return done; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// reduceedgesatvertex() Reduce the number of edges at a given vertex. // +// // +// 'endptlist' contains the endpoints of edges connecting at the vertex. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::reduceedgesatvertex(point startpt, arraypool* endptlist) +{ + triface searchtet; + point *pendpt, *parypt; + enum interresult dir; + flipconstraints fc; + int reduceflag; + int count; + int n, i, j; + + + fc.remvert = startpt; + fc.checkflipeligibility = 1; + + while (1) { + + count = 0; + + for (i = 0; i < endptlist->objects; i++) { + pendpt = (point *) fastlookup(endptlist, i); + if (*pendpt == dummypoint) { + continue; // Do not reduce a virtual edge. + } + reduceflag = 0; + // Find the edge. + if (nonconvex) { + if (getedge(startpt, *pendpt, &searchtet)) { + dir = ACROSSVERT; + } else { + // The edge does not exist (was flipped). + dir = INTERSECT; + } + } else { + point2tetorg(startpt, searchtet); + dir = finddirection(&searchtet, *pendpt); + } + if (dir == ACROSSVERT) { + if (dest(searchtet) == *pendpt) { + // Do not flip a segment. + if (!issubseg(searchtet)) { + n = removeedgebyflips(&searchtet, &fc); + if (n == 2) { + reduceflag = 1; + } + } + } + } else { + // The edge has been flipped. + reduceflag = 1; + } + if (reduceflag) { + count++; + // Move the last vertex into this slot. + j = endptlist->objects - 1; + parypt = (point *) fastlookup(endptlist, j); + *pendpt = *parypt; + endptlist->objects--; + i--; + } + } // i + + if (count == 0) { + // No edge is reduced. + break; + } + + } // while (1) + + return (int) endptlist->objects; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// removevertexbyflips() Remove a vertex by flips. // +// // +// This routine attempts to remove the given vertex 'rempt' (p) from the // +// tetrahedralization (T) by a sequence of flips. // +// // +// The algorithm used here is a simple edge reduce method. Suppose there are // +// n edges connected at p. We try to reduce the number of edges by flipping // +// any edge (not a segment) that is connecting at p. // +// // +// Unless T is a Delaunay tetrahedralization, there is no guarantee that 'p' // +// can be successfully removed. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::removevertexbyflips(point steinerpt) +{ + triface *fliptets = NULL, wrktets[4]; + triface searchtet, spintet, neightet; + face parentsh, spinsh, checksh; + face leftseg, rightseg, checkseg; + point lpt = NULL, rpt = NULL, apexpt; //, *parypt; + flipconstraints fc; + enum verttype vt; + enum locateresult loc; + int valence, removeflag; + int slawson; + int t1ver; + int n, i; + + vt = pointtype(steinerpt); + + + if (vt == FREESEGVERTEX) { + sdecode(point2sh(steinerpt), leftseg); + leftseg.shver = 0; + if (sdest(leftseg) == steinerpt) { + senext(leftseg, rightseg); + spivotself(rightseg); + rightseg.shver = 0; + } else { + rightseg = leftseg; + senext2(rightseg, leftseg); + spivotself(leftseg); + leftseg.shver = 0; + } + lpt = sorg(leftseg); + rpt = sdest(rightseg); + if (b->verbose > 2) { + printf(" Removing Steiner point %d in segment (%d, %d).\n", + pointmark(steinerpt), pointmark(lpt), pointmark(rpt)); + + } + } else if (vt == FREEFACETVERTEX) { + if (b->verbose > 2) { + printf(" Removing Steiner point %d in facet.\n", + pointmark(steinerpt)); + } + } else if (vt == FREEVOLVERTEX) { + if (b->verbose > 2) { + printf(" Removing Steiner point %d in volume.\n", + pointmark(steinerpt)); + } + } else if (vt == VOLVERTEX) { + if (b->verbose > 2) { + printf(" Removing a point %d in volume.\n", + pointmark(steinerpt)); + } + } else { + // It is not a Steiner point. + return 0; + } + + // Try to reduce the number of edges at 'p' by flips. + getvertexstar(1, steinerpt, cavetetlist, cavetetvertlist, NULL); + cavetetlist->restart(); // This list may be re-used. + if (cavetetvertlist->objects > 3l) { + valence = reduceedgesatvertex(steinerpt, cavetetvertlist); + } else { + valence = cavetetvertlist->objects; + } + cavetetvertlist->restart(); + + removeflag = 0; + + if (valence == 4) { + // Only 4 vertices (4 tets) left! 'p' is inside the convex hull of the 4 + // vertices. This case is due to that 'p' is not exactly on the segment. + point2tetorg(steinerpt, searchtet); + loc = INTETRAHEDRON; + removeflag = 1; + } else if (valence == 5) { + // There are 5 edges. + if (vt == FREESEGVERTEX) { + sstpivot1(leftseg, searchtet); + if (org(searchtet) != steinerpt) { + esymself(searchtet); + } + i = 0; // Count the numbe of tet at the edge [p,lpt]. + neightet.tet = NULL; // Init the face. + spintet = searchtet; + while (1) { + i++; + if (apex(spintet) == rpt) { + // Remember the face containing the edge [lpt, rpt]. + neightet = spintet; + } + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + if (i == 3) { + // This case has been checked below. + } else if (i == 4) { + // There are 4 tets sharing at [p,lpt]. There must be 4 tets sharing + // at [p,rpt]. There must be a face [p, lpt, rpt]. + if (apex(neightet) == rpt) { + // The edge (segment) has been already recovered! + // Check if a 6-to-2 flip is possible (to remove 'p'). + // Let 'searchtet' be [p,d,a,b] + esym(neightet, searchtet); + enextself(searchtet); + // Check if there are exactly three tets at edge [p,d]. + wrktets[0] = searchtet; // [p,d,a,b] + for (i = 0; i < 2; i++) { + fnext(wrktets[i], wrktets[i+1]); // [p,d,b,c], [p,d,c,a] + } + if (apex(wrktets[0]) == oppo(wrktets[2])) { + loc = ONFACE; + removeflag = 1; + } + } + } + } else if (vt == FREEFACETVERTEX) { + // It is possible to do a 6-to-2 flip to remove the vertex. + point2tetorg(steinerpt, searchtet); + // Get the three faces of 'searchtet' which share at p. + // All faces has p as origin. + wrktets[0] = searchtet; + wrktets[1] = searchtet; + esymself(wrktets[1]); + enextself(wrktets[1]); + wrktets[2] = searchtet; + eprevself(wrktets[2]); + esymself(wrktets[2]); + // All internal edges of the six tets have valance either 3 or 4. + // Get one edge which has valance 3. + searchtet.tet = NULL; + for (i = 0; i < 3; i++) { + spintet = wrktets[i]; + valence = 0; + while (1) { + valence++; + fnextself(spintet); + if (spintet.tet == wrktets[i].tet) break; + } + if (valence == 3) { + // Found the edge. + searchtet = wrktets[i]; + break; + } + } + // Note, we do not detach the three subfaces at p. + // They will be removed within a 4-to-1 flip. + loc = ONFACE; + removeflag = 1; + } + //removeflag = 1; + } + + if (!removeflag) { + if (vt == FREESEGVERTEX) { + // Check is it possible to recover the edge [lpt,rpt]. + // The condition to check is: Whether each tet containing 'leftseg' is + // adjacent to a tet containing 'rightseg'. + sstpivot1(leftseg, searchtet); + if (org(searchtet) != steinerpt) { + esymself(searchtet); + } + spintet = searchtet; + while (1) { + // Go to the bottom face of this tet. + eprev(spintet, neightet); + esymself(neightet); // [steinerpt, p1, p2, lpt] + // Get the adjacent tet. + fsymself(neightet); // [p1, steinerpt, p2, rpt] + if (oppo(neightet) != rpt) { + // Found a non-matching adjacent tet. + break; + } + { + // [2017-10-15] Check if the tet is inverted? + point chkp1 = org(neightet); + point chkp2 = apex(neightet); + REAL chkori = orient3d(rpt, lpt, chkp1, chkp2); + if (chkori >= 0.0) { + // Either inverted or degenerated. + break; + } + } + fnextself(spintet); + if (spintet.tet == searchtet.tet) { + // 'searchtet' is [p,d,p1,p2]. + loc = ONEDGE; + removeflag = 1; + break; + } + } + } // if (vt == FREESEGVERTEX) + } + + if (!removeflag) { + if (vt == FREESEGVERTEX) { + // Check if the edge [lpt, rpt] exists. + if (getedge(lpt, rpt, &searchtet)) { + // We have recovered this edge. Shift the vertex into the volume. + // We can recover this edge if the subfaces are not recovered yet. + if (!checksubfaceflag) { + // Remove the vertex from the surface mesh. + // This will re-create the segment [lpt, rpt] and re-triangulate + // all the facets at the segment. + // Detach the subsegments from their surrounding tets. + for (i = 0; i < 2; i++) { + checkseg = (i == 0) ? leftseg : rightseg; + sstpivot1(checkseg, neightet); + spintet = neightet; + while (1) { + tssdissolve1(spintet); + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + sstdissolve1(checkseg); + } // i + slawson = 1; // Do lawson flip after removal. + spivot(rightseg, parentsh); // 'rightseg' has p as its origin. + sremovevertex(steinerpt, &parentsh, &rightseg, slawson); + // Clear the list for new subfaces. + caveshbdlist->restart(); + // Insert the new segment. + sstbond1(rightseg, searchtet); + spintet = searchtet; + while (1) { + tssbond1(spintet, rightseg); + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + // The Steiner point has been shifted into the volume. + setpointtype(steinerpt, FREEVOLVERTEX); + st_segref_count--; + st_volref_count++; + return 1; + } // if (!checksubfaceflag) + } // if (getedge(...)) + } // if (vt == FREESEGVERTEX) + } // if (!removeflag) + + if (!removeflag) { + return 0; + } + + if (vt == FREESEGVERTEX) { + // Detach the subsegments from their surronding tets. + for (i = 0; i < 2; i++) { + checkseg = (i == 0) ? leftseg : rightseg; + sstpivot1(checkseg, neightet); + spintet = neightet; + while (1) { + tssdissolve1(spintet); + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + sstdissolve1(checkseg); + } // i + if (checksubfaceflag) { + // Detach the subfaces at the subsegments from their attached tets. + for (i = 0; i < 2; i++) { + checkseg = (i == 0) ? leftseg : rightseg; + spivot(checkseg, parentsh); + if (parentsh.sh != NULL) { + spinsh = parentsh; + while (1) { + stpivot(spinsh, neightet); + if (neightet.tet != NULL) { + tsdissolve(neightet); + } + sesymself(spinsh); + stpivot(spinsh, neightet); + if (neightet.tet != NULL) { + tsdissolve(neightet); + } + stdissolve(spinsh); + spivotself(spinsh); // Go to the next subface. + if (spinsh.sh == parentsh.sh) break; + } + } + } // i + } // if (checksubfaceflag) + } + + if (loc == INTETRAHEDRON) { + // Collect the four tets containing 'p'. + fliptets = new triface[4]; + fliptets[0] = searchtet; // [p,d,a,b] + for (i = 0; i < 2; i++) { + fnext(fliptets[i], fliptets[i+1]); // [p,d,b,c], [p,d,c,a] + } + eprev(fliptets[0], fliptets[3]); + fnextself(fliptets[3]); // it is [a,p,b,c] + eprevself(fliptets[3]); + esymself(fliptets[3]); // [a,b,c,p]. + // Remove p by a 4-to-1 flip. + //flip41(fliptets, 1, 0, 0); + /* + { // Do not flip if there are wrong number of subfaces inside. + // Check if there are three subfaces at 'p'. + triface newface; face flipshs[3]; + int spivot = 0, scount = 0; + for (i = 0; i < 3; i++) { + fnext(fliptets[3], newface); // [a,b,p,d],[b,c,p,d],[c,a,p,d]. + tspivot(newface, flipshs[i]); + if (flipshs[i].sh != NULL) { + spivot = i; // Remember this subface. + scount++; + } + enextself(fliptets[3]); + } + if (scount > 0) { + // There are three subfaces connecting at p. + // Only do flip if a 3-to-1 flip is possible at p at the bottom face. + if (scount != 3) { + // Wrong number of subfaces. Do not flip. + delete [] fliptets; + return 0; + } + // [2018-03-07] an old fix, not 100% safe. + // if (scount < 3) { + // // The new subface is one of {[a,b,d], [b,c,d], [c,a,d]}. + // // assert(scount == 1); // spivot >= 0 + // if (scount != 1) { + // // Wrong number of subfaces. Do not flip. + // delete [] fliptets; + // return 0; + // } + //} + } + } + */ + if (vt == FREEFACETVERTEX) { + // [2018-03-08] Check if the last 4-to-1 flip is valid. + // fliptets[0],[1],[2] are [p,d,a,b],[p,d,b,c],[p,d,c,a] + triface checktet, chkface; + for (i = 0; i < 3; i++) { + enext(fliptets[i], checktet); + esymself(checktet); // [a,d,b,p],[b,d,c,p],[c,d,a,p] + int scount = 0; int k; + for (k = 0; k < 3; k++) { + esym(checktet, chkface); + if (issubface(chkface)) scount++; + enextself(checktet); + } + if (scount == 3) { + break; // Found a tet which support a 3-to-1 flip. + } else if (scount == 2) { + // This is a strange configuration. Debug it. + // Do not do this flip. + delete [] fliptets; + return 0; + } + } + if (i == 3) { + // No tet in [p,d,a,b],[p,d,b,c],[p,d,c,a] support it. + int scount = 0; + for (i = 0; i < 3; i++) { + eprev(fliptets[i], checktet); + esymself(checktet); // [p,a,b,d],[p,b,c,d],[p,c,a,d] + if (issubface(chkface)) scount++; + } + if (scount != 3) { + // Do not do this flip. + delete [] fliptets; + return 0; + } + } + } // if (vt == FREEFACETVERTEX) + flip41(fliptets, 1, &fc); + //recenttet = fliptets[0]; + } else if (loc == ONFACE) { + // Let the original two tets be [a,b,c,d] and [b,a,c,e]. And p is in + // face [a,b,c]. Let 'searchtet' be the tet [p,d,a,b]. + // Collect the six tets containing 'p'. + fliptets = new triface[6]; + fliptets[0] = searchtet; // [p,d,a,b] + for (i = 0; i < 2; i++) { + fnext(fliptets[i], fliptets[i+1]); // [p,d,b,c], [p,d,c,a] + } + eprev(fliptets[0], fliptets[3]); + fnextself(fliptets[3]); // [a,p,b,e] + esymself(fliptets[3]); // [p,a,e,b] + eprevself(fliptets[3]); // [e,p,a,b] + for (i = 3; i < 5; i++) { + fnext(fliptets[i], fliptets[i+1]); // [e,p,b,c], [e,p,c,a] + } + if (vt == FREEFACETVERTEX) { + // We need to determine the location of three subfaces at p. + valence = 0; // Re-use it. + for (i = 3; i < 6; i++) { + if (issubface(fliptets[i])) valence++; + } + if (valence > 0) { + // We must do 3-to-2 flip in the upper part. We simply re-arrange + // the six tets. + for (i = 0; i < 3; i++) { + esym(fliptets[i+3], wrktets[i]); + esym(fliptets[i], fliptets[i+3]); + fliptets[i] = wrktets[i]; + } + // Swap the last two pairs, i.e., [1]<->[[2], and [4]<->[5] + wrktets[1] = fliptets[1]; + fliptets[1] = fliptets[2]; + fliptets[2] = wrktets[1]; + wrktets[1] = fliptets[4]; + fliptets[4] = fliptets[5]; + fliptets[5] = wrktets[1]; + } + // [2018-03-08] Check if the last 4-to-1 flip is valid. + // fliptets[0],[1],[2] are [p,d,a,b],[p,d,b,c],[p,d,c,a] + triface checktet, chkface; + for (i = 0; i < 3; i++) { + enext(fliptets[i], checktet); + esymself(checktet); // [a,d,b,p],[b,d,c,p],[c,d,a,p] + int scount = 0; int k; + for (k = 0; k < 3; k++) { + esym(checktet, chkface); + if (issubface(chkface)) scount++; + enextself(checktet); + } + if (scount == 3) { + break; // Found a tet which support a 3-to-1 flip. + } else if (scount == 2) { + // This is a strange configuration. Debug it. + // Do not do this flip. + delete [] fliptets; + return 0; + } + } + if (i == 3) { + // No tet in [p,d,a,b],[p,d,b,c],[p,d,c,a] support it. + int scount = 0; + for (i = 0; i < 3; i++) { + eprev(fliptets[i], checktet); + esymself(checktet); // [p,a,b,d],[p,b,c,d],[p,c,a,d] + if (issubface(chkface)) scount++; + } + if (scount != 3) { + // Do not do this flip. + delete [] fliptets; + return 0; + } + } + } // vt == FREEFACETVERTEX + // Remove p by a 6-to-2 flip, which is a combination of two flips: + // a 3-to-2 (deletes the edge [e,p]), and + // a 4-to-1 (deletes the vertex p). + // First do a 3-to-2 flip on [e,p,a,b],[e,p,b,c],[e,p,c,a]. It creates + // two new tets: [a,b,c,p] and [b,a,c,e]. The new tet [a,b,c,p] is + // degenerate (has zero volume). It will be deleted in the followed + // 4-to-1 flip. + //flip32(&(fliptets[3]), 1, 0, 0); + flip32(&(fliptets[3]), 1, &fc); + // Second do a 4-to-1 flip on [p,d,a,b],[p,d,b,c],[p,d,c,a],[a,b,c,p]. + // This creates a new tet [a,b,c,d]. + //flip41(fliptets, 1, 0, 0); + flip41(fliptets, 1, &fc); + //recenttet = fliptets[0]; + } else if (loc == ONEDGE) { + // Let the original edge be [e,d] and p is in [e,d]. Assume there are n + // tets sharing at edge [e,d] originally. We number the link vertices + // of [e,d]: p_0, p_1, ..., p_n-1. 'searchtet' is [p,d,p_0,p_1]. + // Count the number of tets at edge [e,p] and [p,d] (this is n). + n = 0; + spintet = searchtet; + while (1) { + n++; + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + // Collect the 2n tets containing 'p'. + fliptets = new triface[2 * n]; + fliptets[0] = searchtet; // [p,b,p_0,p_1] + for (i = 0; i < (n - 1); i++) { + fnext(fliptets[i], fliptets[i+1]); // [p,d,p_i,p_i+1]. + } + eprev(fliptets[0], fliptets[n]); + fnextself(fliptets[n]); // [p_0,p,p_1,e] + esymself(fliptets[n]); // [p,p_0,e,p_1] + eprevself(fliptets[n]); // [e,p,p_0,p_1] + for (i = n; i < (2 * n - 1); i++) { + fnext(fliptets[i], fliptets[i+1]); // [e,p,p_i,p_i+1]. + } + // Remove p by a 2n-to-n flip, it is a sequence of n flips: + // - Do a 2-to-3 flip on + // [p_0,p_1,p,d] and + // [p,p_1,p_0,e]. + // This produces: + // [e,d,p_0,p_1], + // [e,d,p_1,p] (degenerated), and + // [e,d,p,p_0] (degenerated). + wrktets[0] = fliptets[0]; // [p,d,p_0,p_1] + eprevself(wrktets[0]); // [p_0,p,d,p_1] + esymself(wrktets[0]); // [p,p_0,p_1,d] + enextself(wrktets[0]); // [p_0,p_1,p,d] [0] + wrktets[1] = fliptets[n]; // [e,p,p_0,p_1] + enextself(wrktets[1]); // [p,p_0,e,p_1] + esymself(wrktets[1]); // [p_0,p,p_1,e] + eprevself(wrktets[1]); // [p_1,p_0,p,e] [1] + //flip23(wrktets, 1, 0, 0); + flip23(wrktets, 1, &fc); + // Save the new tet [e,d,p,p_0] (degenerated). + fliptets[n] = wrktets[2]; + // Save the new tet [e,d,p_0,p_1]. + fliptets[0] = wrktets[0]; + // - Repeat from i = 1 to n-2: (n - 2) flips + // - Do a 3-to-2 flip on + // [p,p_i,d,e], + // [p,p_i,e,p_i+1], and + // [p,p_i,p_i+1,d]. + // This produces: + // [d,e,p_i+1,p_i], and + // [e,d,p_i+1,p] (degenerated). + for (i = 1; i < (n - 1); i++) { + wrktets[0] = wrktets[1]; // [e,d,p_i,p] (degenerated). + enextself(wrktets[0]); // [d,p_i,e,p] (...) + esymself(wrktets[0]); // [p_i,d,p,e] (...) + eprevself(wrktets[0]); // [p,p_i,d,e] (degenerated) [0]. + wrktets[1] = fliptets[n+i]; // [e,p,p_i,p_i+1] + enextself(wrktets[1]); // [p,p_i,e,p_i+1] [1] + wrktets[2] = fliptets[i]; // [p,d,p_i,p_i+1] + eprevself(wrktets[2]); // [p_i,p,d,p_i+1] + esymself(wrktets[2]); // [p,p_i,p_i+1,d] [2] + //flip32(wrktets, 1, 0, 0); + flip32(wrktets, 1, &fc); + // Save the new tet [e,d,p_i,p_i+1]. // FOR DEBUG ONLY + fliptets[i] = wrktets[0]; // [d,e,p_i+1,p_i] // FOR DEBUG ONLY + esymself(fliptets[i]); // [e,d,p_i,p_i+1] // FOR DEBUG ONLY + } + // - Do a 4-to-1 flip on + // [p,p_0,e,d], [d,e,p_0,p], + // [p,p_0,d,p_n-1], [e,p_n-1,p_0,p], + // [p,p_0,p_n-1,e], [p_0,p_n-1,d,p], and + // [e,d,p_n-1,p]. + // This produces + // [e,d,p_n-1,p_0] and + // deletes p. + wrktets[3] = wrktets[1]; // [e,d,p_n-1,p] (degenerated) [3] + wrktets[0] = fliptets[n]; // [e,d,p,p_0] (degenerated) + eprevself(wrktets[0]); // [p,e,d,p_0] (...) + esymself(wrktets[0]); // [e,p,p_0,d] (...) + enextself(wrktets[0]); // [p,p_0,e,d] (degenerated) [0] + wrktets[1] = fliptets[n-1]; // [p,d,p_n-1,p_0] + esymself(wrktets[1]); // [d,p,p_0,p_n-1] + enextself(wrktets[1]); // [p,p_0,d,p_n-1] [1] + wrktets[2] = fliptets[2*n-1]; // [e,p,p_n-1,p_0] + enextself(wrktets[2]); // [p_p_n-1,e,p_0] + esymself(wrktets[2]); // [p_n-1,p,p_0,e] + enextself(wrktets[2]); // [p,p_0,p_n-1,e] [2] + //flip41(wrktets, 1, 0, 0); + flip41(wrktets, 1, &fc); + // Save the new tet [e,d,p_n-1,p_0] // FOR DEBUG ONLY + fliptets[n-1] = wrktets[0]; // [e,d,p_n-1,p_0] // FOR DEBUG ONLY + //recenttet = fliptets[0]; + } + + delete [] fliptets; + + if (vt == FREESEGVERTEX) { + // Remove the vertex from the surface mesh. + // This will re-create the segment [lpt, rpt] and re-triangulate + // all the facets at the segment. + // Only do lawson flip when subfaces are not recovery yet. + slawson = (checksubfaceflag ? 0 : 1); + spivot(rightseg, parentsh); // 'rightseg' has p as its origin. + sremovevertex(steinerpt, &parentsh, &rightseg, slawson); + + // The original segment is returned in 'rightseg'. + rightseg.shver = 0; + // Insert the new segment. + point2tetorg(lpt, searchtet); + finddirection(&searchtet, rpt); + sstbond1(rightseg, searchtet); + spintet = searchtet; + while (1) { + tssbond1(spintet, rightseg); + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + + if (checksubfaceflag) { + // Insert subfaces at segment [lpt,rpt] into the tetrahedralization. + spivot(rightseg, parentsh); + if (parentsh.sh != NULL) { + spinsh = parentsh; + while (1) { + if (sorg(spinsh) != lpt) { + sesymself(spinsh); + } + apexpt = sapex(spinsh); + // Find the adjacent tet of [lpt,rpt,apexpt]; + spintet = searchtet; + while (1) { + if (apex(spintet) == apexpt) { + tsbond(spintet, spinsh); + sesymself(spinsh); // Get to another side of this face. + fsym(spintet, neightet); + tsbond(neightet, spinsh); + sesymself(spinsh); // Get back to the original side. + break; + } + fnextself(spintet); + } + spivotself(spinsh); + if (spinsh.sh == parentsh.sh) break; + } + } + } // if (checksubfaceflag) + + // Clear the set of new subfaces. + caveshbdlist->restart(); + } // if (vt == FREESEGVERTEX) + + // The point has been removed. + if (pointtype(steinerpt) != UNUSEDVERTEX) { + setpointtype(steinerpt, UNUSEDVERTEX); + unuverts++; + } + if (vt != VOLVERTEX) { + // Update the correspinding counters. + if (vt == FREESEGVERTEX) { + st_segref_count--; + } else if (vt == FREEFACETVERTEX) { + st_facref_count--; + } else if (vt == FREEVOLVERTEX) { + st_volref_count--; + } + if (steinerleft > 0) steinerleft++; + } + + return 1; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// suppressbdrysteinerpoint() Suppress a boundary Steiner point // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::suppressbdrysteinerpoint(point steinerpt) +{ + face parentsh, spinsh, *parysh; + face leftseg, rightseg; + point lpt = NULL, rpt = NULL; + int i; + + verttype vt = pointtype(steinerpt); + + if (vt == FREESEGVERTEX) { + sdecode(point2sh(steinerpt), leftseg); + leftseg.shver = 0; + if (sdest(leftseg) == steinerpt) { + senext(leftseg, rightseg); + spivotself(rightseg); + rightseg.shver = 0; + } else { + rightseg = leftseg; + senext2(rightseg, leftseg); + spivotself(leftseg); + leftseg.shver = 0; + } + lpt = sorg(leftseg); + rpt = sdest(rightseg); + if (b->verbose > 2) { + printf(" Suppressing Steiner point %d in segment (%d, %d).\n", + pointmark(steinerpt), pointmark(lpt), pointmark(rpt)); + } + // Get all subfaces at the left segment [lpt, steinerpt]. + spivot(leftseg, parentsh); + if (parentsh.sh != NULL) { + // It is not a dangling segment. + spinsh = parentsh; + while (1) { + cavesegshlist->newindex((void **) &parysh); + *parysh = spinsh; + // Orient the face consistently. + if (sorg(*parysh)!= sorg(parentsh)) sesymself(*parysh); + spivotself(spinsh); + if (spinsh.sh == NULL) break; + if (spinsh.sh == parentsh.sh) break; + } + } + if (cavesegshlist->objects < 2) { + // It is a single segment. Not handle it yet. + cavesegshlist->restart(); + return 0; + } + } else if (vt == FREEFACETVERTEX) { + if (b->verbose > 2) { + printf(" Suppressing Steiner point %d from facet.\n", + pointmark(steinerpt)); + } + sdecode(point2sh(steinerpt), parentsh); + // A facet Steiner point. There are exactly two sectors. + for (i = 0; i < 2; i++) { + cavesegshlist->newindex((void **) &parysh); + *parysh = parentsh; + sesymself(parentsh); + } + } else { + return 0; + } + + triface searchtet, neightet, *parytet; + point pa, pb, pc, pd; + REAL v1[3], v2[3], len, u; + + REAL startpt[3] = {0,}, samplept[3] = {0,}, candpt[3] = {0,}; + REAL ori, minvol, smallvol; + int samplesize; + int it, j, k; + + int n = (int) cavesegshlist->objects; + point *newsteiners = new point[n]; + for (i = 0; i < n; i++) newsteiners[i] = NULL; + + // Search for each sector an interior vertex. + for (i = 0; i < cavesegshlist->objects; i++) { + parysh = (face *) fastlookup(cavesegshlist, i); + stpivot(*parysh, searchtet); + // Skip it if it is outside. + if (ishulltet(searchtet)) continue; + // Get the "half-ball". Tets in 'cavetetlist' all contain 'steinerpt' as + // opposite. Subfaces in 'caveshlist' all contain 'steinerpt' as apex. + // Moreover, subfaces are oriented towards the interior of the ball. + setpoint2tet(steinerpt, encode(searchtet)); + getvertexstar(0, steinerpt, cavetetlist, NULL, caveshlist); + // Calculate the searching vector. + pa = sorg(*parysh); + pb = sdest(*parysh); + pc = sapex(*parysh); + facenormal(pa, pb, pc, v1, 1, NULL); + len = sqrt(dot(v1, v1)); + v1[0] /= len; + v1[1] /= len; + v1[2] /= len; + if (vt == FREESEGVERTEX) { + parysh = (face *) fastlookup(cavesegshlist, (i + 1) % n); + pd = sapex(*parysh); + facenormal(pb, pa, pd, v2, 1, NULL); + len = sqrt(dot(v2, v2)); + v2[0] /= len; + v2[1] /= len; + v2[2] /= len; + // Average the two vectors. + v1[0] = 0.5 * (v1[0] + v2[0]); + v1[1] = 0.5 * (v1[1] + v2[1]); + v1[2] = 0.5 * (v1[2] + v2[2]); + } + // Search the intersection of the ray starting from 'steinerpt' to + // the search direction 'v1' and the shell of the half-ball. + // - Construct an endpoint. + len = distance(pa, pb); + v2[0] = steinerpt[0] + len * v1[0]; + v2[1] = steinerpt[1] + len * v1[1]; + v2[2] = steinerpt[2] + len * v1[2]; + for (j = 0; j < cavetetlist->objects; j++) { + parytet = (triface *) fastlookup(cavetetlist, j); + pa = org(*parytet); + pb = dest(*parytet); + pc = apex(*parytet); + // Test if the ray startpt->v2 lies in the cone: where 'steinerpt' + // is the apex, and three sides are defined by the triangle + // [pa, pb, pc]. + ori = orient3d(steinerpt, pa, pb, v2); + if (ori >= 0) { + ori = orient3d(steinerpt, pb, pc, v2); + if (ori >= 0) { + ori = orient3d(steinerpt, pc, pa, v2); + if (ori >= 0) { + // Found! Calculate the intersection. + planelineint(pa, pb, pc, steinerpt, v2, startpt, &u); + break; + } + } + } + } // j + if (j == cavetetlist->objects) { + break; // There is no intersection!! Debug is needed. + } + // Close the ball by adding the subfaces. + for (j = 0; j < caveshlist->objects; j++) { + parysh = (face *) fastlookup(caveshlist, j); + stpivot(*parysh, neightet); + cavetetlist->newindex((void **) &parytet); + *parytet = neightet; + } + // Search a best point inside the segment [startpt, steinerpt]. + it = 0; + samplesize = 100; + v1[0] = steinerpt[0] - startpt[0]; + v1[1] = steinerpt[1] - startpt[1]; + v1[2] = steinerpt[2] - startpt[2]; + minvol = -1.0; + while (it < 3) { + for (j = 1; j < samplesize - 1; j++) { + samplept[0] = startpt[0] + ((REAL) j / (REAL) samplesize) * v1[0]; + samplept[1] = startpt[1] + ((REAL) j / (REAL) samplesize) * v1[1]; + samplept[2] = startpt[2] + ((REAL) j / (REAL) samplesize) * v1[2]; + // Find the minimum volume for 'samplept'. + smallvol = -1; + for (k = 0; k < cavetetlist->objects; k++) { + parytet = (triface *) fastlookup(cavetetlist, k); + pa = org(*parytet); + pb = dest(*parytet); + pc = apex(*parytet); + ori = orient3d(pb, pa, pc, samplept); + { + // [2017-10-15] Rounding + REAL lab = distance(pa, pb); + REAL lbc = distance(pb, pc); + REAL lca = distance(pc, pa); + REAL lv = (lab + lbc + lca) / 3.0; + REAL l3 = lv*lv*lv; + if (fabs(ori) / l3 < 1e-8) ori = 0.0; + } + if (ori <= 0) { + break; // An invalid tet. + } + if (smallvol == -1) { + smallvol = ori; + } else { + if (ori < smallvol) smallvol = ori; + } + } // k + if (k == cavetetlist->objects) { + // Found a valid point. Remember it. + if (minvol == -1.0) { + candpt[0] = samplept[0]; + candpt[1] = samplept[1]; + candpt[2] = samplept[2]; + minvol = smallvol; + } else { + if (minvol < smallvol) { + // It is a better location. Remember it. + candpt[0] = samplept[0]; + candpt[1] = samplept[1]; + candpt[2] = samplept[2]; + minvol = smallvol; + } else { + // No improvement of smallest volume. + // Since we are searching along the line [startpt, steinerpy], + // The smallest volume can only be decreased later. + break; + } + } + } + } // j + if (minvol > 0) break; + samplesize *= 10; + it++; + } // while (it < 3) + if (minvol == -1.0) { + // Failed to find a valid point. + cavetetlist->restart(); + caveshlist->restart(); + break; + } + // Create a new Steiner point inside this section. + makepoint(&(newsteiners[i]), FREEVOLVERTEX); + newsteiners[i][0] = candpt[0]; + newsteiners[i][1] = candpt[1]; + newsteiners[i][2] = candpt[2]; + cavetetlist->restart(); + caveshlist->restart(); + } // i + + if (i < cavesegshlist->objects) { + // Failed to suppress the vertex. + for (; i > 0; i--) { + if (newsteiners[i - 1] != NULL) { + pointdealloc(newsteiners[i - 1]); + } + } + delete [] newsteiners; + cavesegshlist->restart(); + return 0; + } + + // Remove p from the segment or the facet. + triface newtet, newface, spintet; + face newsh, neighsh; + face *splitseg, checkseg; + int slawson = 0; // Do not do flip afterword. + int t1ver; + + if (vt == FREESEGVERTEX) { + // Detach 'leftseg' and 'rightseg' from their adjacent tets. + // These two subsegments will be deleted. + sstpivot1(leftseg, neightet); + spintet = neightet; + while (1) { + tssdissolve1(spintet); + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + sstpivot1(rightseg, neightet); + spintet = neightet; + while (1) { + tssdissolve1(spintet); + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + } + + // Loop through all sectors bounded by facets at this segment. + // Within each sector, create a new Steiner point 'np', and replace 'p' + // by 'np' for all tets in this sector. + for (i = 0; i < cavesegshlist->objects; i++) { + parysh = (face *) fastlookup(cavesegshlist, i); + // 'parysh' is the face [lpt, steinerpt, #]. + stpivot(*parysh, neightet); + // Get all tets in this sector. + setpoint2tet(steinerpt, encode(neightet)); + getvertexstar(0, steinerpt, cavetetlist, NULL, caveshlist); + if (!ishulltet(neightet)) { + // Within each tet in the ball, replace 'p' by 'np'. + for (j = 0; j < cavetetlist->objects; j++) { + parytet = (triface *) fastlookup(cavetetlist, j); + setoppo(*parytet, newsteiners[i]); + } // j + // Point to a parent tet. + parytet = (triface *) fastlookup(cavetetlist, 0); + setpoint2tet(newsteiners[i], (tetrahedron) (parytet->tet)); + st_volref_count++; + if (steinerleft > 0) steinerleft--; + } + // Disconnect the set of boundary faces. They're temporarily open faces. + // They will be connected to the new tets after 'p' is removed. + for (j = 0; j < caveshlist->objects; j++) { + // Get a boundary face. + parysh = (face *) fastlookup(caveshlist, j); + stpivot(*parysh, neightet); + //assert(apex(neightet) == newpt); + // Clear the connection at this face. + dissolve(neightet); + tsdissolve(neightet); + } + // Clear the working lists. + cavetetlist->restart(); + caveshlist->restart(); + } // i + cavesegshlist->restart(); + + if (vt == FREESEGVERTEX) { + spivot(rightseg, parentsh); // 'rightseg' has p as its origin. + splitseg = &rightseg; + } else { + if (sdest(parentsh) == steinerpt) { + senextself(parentsh); + } else if (sapex(parentsh) == steinerpt) { + senext2self(parentsh); + } + splitseg = NULL; + } + sremovevertex(steinerpt, &parentsh, splitseg, slawson); + + if (vt == FREESEGVERTEX) { + // The original segment is returned in 'rightseg'. + rightseg.shver = 0; + } + + // For each new subface, create two new tets at each side of it. + // Both of the two new tets have its opposite be dummypoint. + for (i = 0; i < caveshbdlist->objects; i++) { + parysh = (face *) fastlookup(caveshbdlist, i); + sinfect(*parysh); // Mark it for connecting new tets. + newsh = *parysh; + pa = sorg(newsh); + pb = sdest(newsh); + pc = sapex(newsh); + maketetrahedron(&newtet); + maketetrahedron(&neightet); + setvertices(newtet, pa, pb, pc, dummypoint); + setvertices(neightet, pb, pa, pc, dummypoint); + bond(newtet, neightet); + tsbond(newtet, newsh); + sesymself(newsh); + tsbond(neightet, newsh); + } + // Temporarily increase the hullsize. + hullsize += (caveshbdlist->objects * 2l); + + if (vt == FREESEGVERTEX) { + // Connecting new tets at the recovered segment. + spivot(rightseg, parentsh); + spinsh = parentsh; + while (1) { + if (sorg(spinsh) != lpt) sesymself(spinsh); + // Get the new tet at this subface. + stpivot(spinsh, newtet); + tssbond1(newtet, rightseg); + // Go to the other face at this segment. + spivot(spinsh, neighsh); + if (sorg(neighsh) != lpt) sesymself(neighsh); + sesymself(neighsh); + stpivot(neighsh, neightet); + tssbond1(neightet, rightseg); + sstbond1(rightseg, neightet); + // Connecting two adjacent tets at this segment. + esymself(newtet); + esymself(neightet); + // Connect the two tets (at rightseg) together. + bond(newtet, neightet); + // Go to the next subface. + spivotself(spinsh); + if (spinsh.sh == parentsh.sh) break; + } + } + + // Connecting new tets at new subfaces together. + for (i = 0; i < caveshbdlist->objects; i++) { + parysh = (face *) fastlookup(caveshbdlist, i); + newsh = *parysh; + //assert(sinfected(newsh)); + // Each new subface contains two new tets. + for (k = 0; k < 2; k++) { + stpivot(newsh, newtet); + for (j = 0; j < 3; j++) { + // Check if this side is open. + esym(newtet, newface); + if (newface.tet[newface.ver & 3] == NULL) { + // An open face. Connect it to its adjacent tet. + sspivot(newsh, checkseg); + if (checkseg.sh != NULL) { + // A segment. It must not be the recovered segment. + tssbond1(newtet, checkseg); + sstbond1(checkseg, newtet); + } + spivot(newsh, neighsh); + if (neighsh.sh != NULL) { + // The adjacent subface exists. It's not a dangling segment. + if (sorg(neighsh) != sdest(newsh)) sesymself(neighsh); + stpivot(neighsh, neightet); + if (sinfected(neighsh)) { + esymself(neightet); + } else { + // Search for an open face at this edge. + spintet = neightet; + while (1) { + esym(spintet, searchtet); + fsym(searchtet, spintet); + if (spintet.tet == NULL) break; + } + // Found an open face at 'searchtet'. + neightet = searchtet; + } + } else { + // The edge (at 'newsh') is a dangling segment. + // Get an adjacent tet at this segment. + sstpivot1(checkseg, neightet); + if (org(neightet) != sdest(newsh)) esymself(neightet); + // Search for an open face at this edge. + spintet = neightet; + while (1) { + esym(spintet, searchtet); + fsym(searchtet, spintet); + if (spintet.tet == NULL) break; + } + // Found an open face at 'searchtet'. + neightet = searchtet; + } + pc = apex(newface); + if (apex(neightet) == steinerpt) { + // Exterior case. The 'neightet' is a hull tet which contain + // 'steinerpt'. It will be deleted after 'steinerpt' is removed. + caveoldtetlist->newindex((void **) &parytet); + *parytet = neightet; + // Connect newface to the adjacent hull tet of 'neightet', which + // has the same edge as 'newface', and does not has 'steinerpt'. + fnextself(neightet); + } else { + if (pc == dummypoint) { + if (apex(neightet) != dummypoint) { + setapex(newface, apex(neightet)); + // A hull tet has turned into an interior tet. + hullsize--; // Must update the hullsize. + } + } + } + bond(newface, neightet); + } // if (newface.tet[newface.ver & 3] == NULL) + enextself(newtet); + senextself(newsh); + } // j + sesymself(newsh); + } // k + } // i + + // Unmark all new subfaces. + for (i = 0; i < caveshbdlist->objects; i++) { + parysh = (face *) fastlookup(caveshbdlist, i); + suninfect(*parysh); + } + caveshbdlist->restart(); + + if (caveoldtetlist->objects > 0l) { + // Delete hull tets which contain 'steinerpt'. + for (i = 0; i < caveoldtetlist->objects; i++) { + parytet = (triface *) fastlookup(caveoldtetlist, i); + tetrahedrondealloc(parytet->tet); + } + // Must update the hullsize. + hullsize -= caveoldtetlist->objects; + caveoldtetlist->restart(); + } + + setpointtype(steinerpt, UNUSEDVERTEX); + unuverts++; + if (vt == FREESEGVERTEX) { + st_segref_count--; + } else { // vt == FREEFACETVERTEX + st_facref_count--; + } + if (steinerleft > 0) steinerleft++; // We've removed a Steiner points. + + + point *parypt; + int steinercount = 0; + + int bak_fliplinklevel = b->fliplinklevel; + b->fliplinklevel = 100000; // Unlimited flip level. + + // Try to remove newly added Steiner points. + for (i = 0; i < n; i++) { + if (newsteiners[i] != NULL) { + if (!removevertexbyflips(newsteiners[i])) { + if (b->supsteiner_level > 0) { // Not -Y/0 + // Save it in subvertstack for removal. + subvertstack->newindex((void **) &parypt); + *parypt = newsteiners[i]; + } + steinercount++; + } + } + } + + b->fliplinklevel = bak_fliplinklevel; + + if (steinercount > 0) { + if (b->verbose > 2) { + printf(" Added %d interior Steiner points.\n", steinercount); + } + } + + delete [] newsteiners; + + return 1; +} + + +/////////////////////////////////////////////////////////////////////////////// +// // +// suppresssteinerpoints() Suppress Steiner points. // +// // +// All Steiner points have been saved in 'subvertstack' in the routines // +// carveholes() and suppresssteinerpoint(). // +// Each Steiner point is either removed or shifted into the interior. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::suppresssteinerpoints() +{ + + if (!b->quiet) { + printf("Suppressing Steiner points ...\n"); + } + + point rempt, *parypt; + + int bak_fliplinklevel = b->fliplinklevel; + b->fliplinklevel = 100000; // Unlimited flip level. + int suppcount = 0, remcount = 0; + int i; + + // Try to suppress boundary Steiner points. + for (i = 0; i < subvertstack->objects; i++) { + parypt = (point *) fastlookup(subvertstack, i); + rempt = *parypt; + if (pointtype(rempt) != UNUSEDVERTEX) { + if ((pointtype(rempt) == FREESEGVERTEX) || + (pointtype(rempt) == FREEFACETVERTEX)) { + if (suppressbdrysteinerpoint(rempt)) { + suppcount++; + } + } + } + } // i + + if (suppcount > 0) { + if (b->verbose) { + printf(" Suppressed %d boundary Steiner points.\n", suppcount); + } + } + + if (b->supsteiner_level > 0) { // -Y/1 + for (i = 0; i < subvertstack->objects; i++) { + parypt = (point *) fastlookup(subvertstack, i); + rempt = *parypt; + if (pointtype(rempt) != UNUSEDVERTEX) { + if (pointtype(rempt) == FREEVOLVERTEX) { + if (removevertexbyflips(rempt)) { + remcount++; + } + } + } + } + } + + if (remcount > 0) { + if (b->verbose) { + printf(" Removed %d interior Steiner points.\n", remcount); + } + } + + b->fliplinklevel = bak_fliplinklevel; + + if (b->supsteiner_level > 1) { // -Y/2 + // Smooth interior Steiner points. + optparameters opm; + triface *parytet; + point *ppt; + REAL ori; + int smtcount, count, ivcount; + int nt, j; + + // Point smooth options. + opm.max_min_volume = 1; + opm.numofsearchdirs = 20; + opm.searchstep = 0.001; + opm.maxiter = 30; // Limit the maximum iterations. + + smtcount = 0; + + do { + + nt = 0; + + while (1) { + count = 0; + ivcount = 0; // Clear the inverted count. + + for (i = 0; i < subvertstack->objects; i++) { + parypt = (point *) fastlookup(subvertstack, i); + rempt = *parypt; + if (pointtype(rempt) == FREEVOLVERTEX) { + getvertexstar(1, rempt, cavetetlist, NULL, NULL); + // Calculate the initial smallest volume (maybe zero or negative). + for (j = 0; j < cavetetlist->objects; j++) { + parytet = (triface *) fastlookup(cavetetlist, j); + ppt = (point *) &(parytet->tet[4]); + ori = orient3dfast(ppt[1], ppt[0], ppt[2], ppt[3]); + if (j == 0) { + opm.initval = ori; + } else { + if (opm.initval > ori) opm.initval = ori; + } + } + if (smoothpoint(rempt, cavetetlist, 1, &opm)) { + count++; + } + if (opm.imprval <= 0.0) { + ivcount++; // The mesh contains inverted elements. + } + cavetetlist->restart(); + } + } // i + + smtcount += count; + + if (count == 0) { + // No point has been smoothed. + break; + } + + nt++; + if (nt > 2) { + break; // Already three iterations. + } + } // while + + if (ivcount > 0) { + // There are inverted elements! + if (opm.maxiter > 0) { + // Set unlimited smoothing steps. Try again. + opm.numofsearchdirs = 30; + opm.searchstep = 0.0001; + opm.maxiter = -1; + continue; + } + } + + break; + } while (1); // Additional loop for (ivcount > 0) + + if (ivcount > 0) { + printf("BUG Report! The mesh contain inverted elements.\n"); + } + + if (b->verbose) { + if (smtcount > 0) { + printf(" Smoothed %d Steiner points.\n", smtcount); + } + } + } // -Y2 + + subvertstack->restart(); + + return 1; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// recoverboundary() Recover segments and facets. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::recoverboundary(clock_t& tv) +{ + arraypool *misseglist, *misshlist; + arraypool *bdrysteinerptlist; + face searchsh, *parysh; + face searchseg, *paryseg; + point rempt, *parypt; + long ms; // The number of missing segments/subfaces. + int nit; // The number of iterations. + int s, i; + + // Counters. + long bak_segref_count, bak_facref_count, bak_volref_count; + + if (!b->quiet) { + printf("Recovering boundaries...\n"); + } + + + if (b->verbose) { + printf(" Recovering segments.\n"); + } + + // Segments will be introduced. + checksubsegflag = 1; + + misseglist = new arraypool(sizeof(face), 8); + bdrysteinerptlist = new arraypool(sizeof(point), 8); + + // In random order. + subsegs->traversalinit(); + for (i = 0; i < subsegs->items; i++) { + s = randomnation(i + 1); + // Move the s-th seg to the i-th. + subsegstack->newindex((void **) &paryseg); + *paryseg = * (face *) fastlookup(subsegstack, s); + // Put i-th seg to be the s-th. + searchseg.sh = shellfacetraverse(subsegs); + paryseg = (face *) fastlookup(subsegstack, s); + *paryseg = searchseg; + } + + // The init number of missing segments. + ms = subsegs->items; + nit = 0; + if (b->fliplinklevel < 0) { + autofliplinklevel = 1; // Init value. + } + + // First, trying to recover segments by only doing flips. + while (1) { + recoversegments(misseglist, 0, 0); + + if (misseglist->objects > 0) { + if (b->fliplinklevel >= 0) { + break; + } else { + if (misseglist->objects >= ms) { + nit++; + if (nit >= 3) { + //break; + // Do the last round with unbounded flip link level. + b->fliplinklevel = 100000; + } + } else { + ms = misseglist->objects; + if (nit > 0) { + nit--; + } + } + for (i = 0; i < misseglist->objects; i++) { + subsegstack->newindex((void **) &paryseg); + *paryseg = * (face *) fastlookup(misseglist, i); + } + misseglist->restart(); + autofliplinklevel+=b->fliplinklevelinc; + } + } else { + // All segments are recovered. + break; + } + } // while (1) + + if (b->verbose) { + printf(" %ld (%ld) segments are recovered (missing).\n", + subsegs->items - misseglist->objects, misseglist->objects); + } + + if (misseglist->objects > 0) { + // Second, trying to recover segments by doing more flips (fullsearch). + while (misseglist->objects > 0) { + ms = misseglist->objects; + for (i = 0; i < misseglist->objects; i++) { + subsegstack->newindex((void **) &paryseg); + *paryseg = * (face *) fastlookup(misseglist, i); + } + misseglist->restart(); + + recoversegments(misseglist, 1, 0); + + if (misseglist->objects < ms) { + // The number of missing segments is reduced. + continue; + } else { + break; + } + } + if (b->verbose) { + printf(" %ld (%ld) segments are recovered (missing).\n", + subsegs->items - misseglist->objects, misseglist->objects); + } + } + + if (misseglist->objects > 0) { + // Third, trying to recover segments by doing more flips (fullsearch) + // and adding Steiner points in the volume. + while (misseglist->objects > 0) { + ms = misseglist->objects; + for (i = 0; i < misseglist->objects; i++) { + subsegstack->newindex((void **) &paryseg); + *paryseg = * (face *) fastlookup(misseglist, i); + } + misseglist->restart(); + + recoversegments(misseglist, 1, 1); + + if (misseglist->objects < ms) { + // The number of missing segments is reduced. + continue; + } else { + break; + } + } + if (b->verbose) { + printf(" Added %ld Steiner points in volume.\n", st_volref_count); + } + } + + if (misseglist->objects > 0) { + // Last, trying to recover segments by doing more flips (fullsearch), + // and adding Steiner points in the volume, and splitting segments. + long bak_inpoly_count = st_volref_count; //st_inpoly_count; + for (i = 0; i < misseglist->objects; i++) { + subsegstack->newindex((void **) &paryseg); + *paryseg = * (face *) fastlookup(misseglist, i); + } + misseglist->restart(); + + recoversegments(misseglist, 1, 2); + + if (b->verbose) { + printf(" Added %ld Steiner points in segments.\n", st_segref_count); + if (st_volref_count > bak_inpoly_count) { + printf(" Added another %ld Steiner points in volume.\n", + st_volref_count - bak_inpoly_count); + } + } + } + + + if (st_segref_count > 0) { + // Try to remove the Steiner points added in segments. + bak_segref_count = st_segref_count; + bak_volref_count = st_volref_count; + for (i = 0; i < subvertstack->objects; i++) { + // Get the Steiner point. + parypt = (point *) fastlookup(subvertstack, i); + rempt = *parypt; + if (!removevertexbyflips(rempt)) { + // Save it in list. + bdrysteinerptlist->newindex((void **) &parypt); + *parypt = rempt; + } + } + if (b->verbose) { + if (st_segref_count < bak_segref_count) { + if (bak_volref_count < st_volref_count) { + printf(" Suppressed %ld Steiner points in segments.\n", + st_volref_count - bak_volref_count); + } + if ((st_segref_count + (st_volref_count - bak_volref_count)) < + bak_segref_count) { + printf(" Removed %ld Steiner points in segments.\n", + bak_segref_count - + (st_segref_count + (st_volref_count - bak_volref_count))); + } + } + } + subvertstack->restart(); + } + + + tv = clock(); + + if (b->verbose) { + printf(" Recovering facets.\n"); + } + + // Subfaces will be introduced. + checksubfaceflag = 1; + + misshlist = new arraypool(sizeof(face), 8); + + // Randomly order the subfaces. + subfaces->traversalinit(); + for (i = 0; i < subfaces->items; i++) { + s = randomnation(i + 1); + // Move the s-th subface to the i-th. + subfacstack->newindex((void **) &parysh); + *parysh = * (face *) fastlookup(subfacstack, s); + // Put i-th subface to be the s-th. + searchsh.sh = shellfacetraverse(subfaces); + parysh = (face *) fastlookup(subfacstack, s); + *parysh = searchsh; + } + + ms = subfaces->items; + nit = 0; + b->fliplinklevel = -1; // Init. + if (b->fliplinklevel < 0) { + autofliplinklevel = 1; // Init value. + } + + while (1) { + recoversubfaces(misshlist, 0); + + if (misshlist->objects > 0) { + if (b->fliplinklevel >= 0) { + break; + } else { + if (misshlist->objects >= ms) { + nit++; + if (nit >= 3) { + //break; + // Do the last round with unbounded flip link level. + b->fliplinklevel = 100000; + } + } else { + ms = misshlist->objects; + if (nit > 0) { + nit--; + } + } + for (i = 0; i < misshlist->objects; i++) { + subfacstack->newindex((void **) &parysh); + *parysh = * (face *) fastlookup(misshlist, i); + } + misshlist->restart(); + autofliplinklevel+=b->fliplinklevelinc; + } + } else { + // All subfaces are recovered. + break; + } + } // while (1) + + if (b->verbose) { + printf(" %ld (%ld) subfaces are recovered (missing).\n", + subfaces->items - misshlist->objects, misshlist->objects); + } + + if (misshlist->objects > 0) { + // There are missing subfaces. Add Steiner points. + for (i = 0; i < misshlist->objects; i++) { + subfacstack->newindex((void **) &parysh); + *parysh = * (face *) fastlookup(misshlist, i); + } + misshlist->restart(); + + recoversubfaces(NULL, 1); + + if (b->verbose) { + printf(" Added %ld Steiner points in facets.\n", st_facref_count); + } + } + + + if (st_facref_count > 0) { + // Try to remove the Steiner points added in facets. + bak_facref_count = st_facref_count; + for (i = 0; i < subvertstack->objects; i++) { + // Get the Steiner point. + parypt = (point *) fastlookup(subvertstack, i); + rempt = *parypt; + if (!removevertexbyflips(*parypt)) { + // Save it in list. + bdrysteinerptlist->newindex((void **) &parypt); + *parypt = rempt; + } + } + if (b->verbose) { + if (st_facref_count < bak_facref_count) { + printf(" Removed %ld Steiner points in facets.\n", + bak_facref_count - st_facref_count); + } + } + subvertstack->restart(); + } + + + if (bdrysteinerptlist->objects > 0) { + if (b->verbose) { + printf(" %ld Steiner points remained in boundary.\n", + bdrysteinerptlist->objects); + } + } // if + + + // Accumulate the dynamic memory. + totalworkmemory += (misseglist->totalmemory + misshlist->totalmemory + + bdrysteinerptlist->totalmemory); + + delete bdrysteinerptlist; + delete misseglist; + delete misshlist; +} + +//// //// +//// //// +//// steiner_cxx ////////////////////////////////////////////////////////////// + + +//// reconstruct_cxx ////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// carveholes() Remove tetrahedra not in the mesh domain. // +// // +/////////////////////////////////////////////////////////////////////////////// + + +void tetgenmesh::carveholes() +{ + arraypool *tetarray, *hullarray; + triface tetloop, neightet, *parytet, *parytet1; + triface *regiontets = NULL; + face checksh, *parysh; + face checkseg; + point ptloop, *parypt; + int t1ver; + int i, j, k; + + if (!b->quiet) { + if (b->convex) { + printf("Marking exterior tetrahedra ...\n"); + } else { + printf("Removing exterior tetrahedra ...\n"); + } + } + + // Initialize the pool of exterior tets. + tetarray = new arraypool(sizeof(triface), 10); + hullarray = new arraypool(sizeof(triface), 10); + + // Collect unprotected tets and hull tets. + tetrahedrons->traversalinit(); + tetloop.ver = 11; // The face opposite to dummypoint. + tetloop.tet = alltetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + if (ishulltet(tetloop)) { + // Is this side protected by a subface? + if (!issubface(tetloop)) { + // Collect an unprotected hull tet and tet. + infect(tetloop); + hullarray->newindex((void **) &parytet); + *parytet = tetloop; + // tetloop's face number is 11 & 3 = 3. + decode(tetloop.tet[3], neightet); + if (!infected(neightet)) { + infect(neightet); + tetarray->newindex((void **) &parytet); + *parytet = neightet; + } + } + } + tetloop.tet = alltetrahedrontraverse(); + } + + if (in->numberofholes > 0) { + // Mark as infected any tets inside volume holes. + for (i = 0; i < 3 * in->numberofholes; i += 3) { + // Search a tet containing the i-th hole point. + neightet.tet = NULL; + randomsample(&(in->holelist[i]), &neightet); + if (locate(&(in->holelist[i]), &neightet) != OUTSIDE) { + // The tet 'neightet' contain this point. + if (!infected(neightet)) { + infect(neightet); + tetarray->newindex((void **) &parytet); + *parytet = neightet; + // Add its adjacent tet if it is not protected. + if (!issubface(neightet)) { + decode(neightet.tet[neightet.ver & 3], tetloop); + if (!infected(tetloop)) { + infect(tetloop); + if (ishulltet(tetloop)) { + hullarray->newindex((void **) &parytet); + } else { + tetarray->newindex((void **) &parytet); + } + *parytet = tetloop; + } + } + else { + // It is protected. Check if its adjacent tet is a hull tet. + decode(neightet.tet[neightet.ver & 3], tetloop); + if (ishulltet(tetloop)) { + // It is hull tet, add it into the list. Moreover, the subface + // is dead, i.e., both sides are in exterior. + if (!infected(tetloop)) { + infect(tetloop); + hullarray->newindex((void **) &parytet); + *parytet = tetloop; + } + } + if (infected(tetloop)) { + // Both sides of this subface are in exterior. + tspivot(neightet, checksh); + sinfect(checksh); // Only queue it once. + subfacstack->newindex((void **) &parysh); + *parysh = checksh; + } + } + } // if (!infected(neightet)) + } else { + // A hole point locates outside of the convex hull. + if (!b->quiet) { + printf("Warning: The %d-th hole point ", i/3 + 1); + printf("lies outside the convex hull.\n"); + } + } + } // i + } // if (in->numberofholes > 0) + + if (b->hole_mesh && (b->hole_mesh_filename[0] != 0)) { + // A hole mesh (***.ele) is given. + //enum tetgenbehavior::objecttype object; + char filebasename[256]; + strcpy(filebasename, b->hole_mesh_filename); + //object = tetgenbehavior::MESH; + if (!strcmp(&filebasename[strlen(filebasename) - 4], ".ele")) { + filebasename[strlen(filebasename) - 4] = '\0'; + //object = tetgenbehavior::MESH; + } + bool hole_mesh_loaded = false; + tetgenio io; + if (io.load_node(filebasename)) { + if (io.load_tet(filebasename)) { + hole_mesh_loaded = true; + } + } + if (hole_mesh_loaded) { + if (b->verbose) { + printf(" Adding hole tets from the mesh %s\n", b->hole_mesh_filename); + } + int count = 0, hcount = 0, scount = 0; + int shift = io.firstnumber > 0 ? -1 : 0; + double *p1, *p2, *p3, *p4; + double searchpt[3]; + for (i = 0; i < io.numberoftetrahedra; i++) { + int *idx = &(io.tetrahedronlist[i * 4]); + p1 = &(io.pointlist[(idx[0]+shift)*3]); + p2 = &(io.pointlist[(idx[1]+shift)*3]); + p3 = &(io.pointlist[(idx[2]+shift)*3]); + p4 = &(io.pointlist[(idx[3]+shift)*3]); + for (j = 0; j < 3; j++) { + searchpt[j] = (p1[j]+p2[j]+p3[j]+p4[j])/4.; + } + // Search the point. + neightet.tet = NULL; + if (locate(searchpt, &neightet) != OUTSIDE) { + // The tet 'neightet' contain this point. + if (!infected(neightet)) { + infect(neightet); + tetarray->newindex((void **) &parytet); + *parytet = neightet; + count++; + // Add its adjacent tet if it is not protected. + if (!issubface(neightet)) { + decode(neightet.tet[neightet.ver & 3], tetloop); + if (!infected(tetloop)) { + infect(tetloop); + if (ishulltet(tetloop)) { + hullarray->newindex((void **) &parytet); + hcount++; + } else { + tetarray->newindex((void **) &parytet); + count++; + } + *parytet = tetloop; + } + } + else { + // It is protected. Check if its adjacent tet is a hull tet. + decode(neightet.tet[neightet.ver & 3], tetloop); + if (ishulltet(tetloop)) { + // It is hull tet, add it into the list. Moreover, the subface + // is dead, i.e., both sides are in exterior. + if (!infected(tetloop)) { + infect(tetloop); + hullarray->newindex((void **) &parytet); + *parytet = tetloop; + hcount++; + } + } + if (infected(tetloop)) { + // Both sides of this subface are in exterior. + tspivot(neightet, checksh); + sinfect(checksh); // Only queue it once. + subfacstack->newindex((void **) &parysh); + *parysh = checksh; + scount++; + } + } + } + } + } // i + if (b->verbose) { + printf(" Added %d hole tets, %d hull tet, %d hole subfaces\n", + count, hcount, scount); + } + } // if (hole_mesh_loaded) + } + + if (b->regionattrib && (in->numberofregions > 0)) { // -A option. + // Record the tetrahedra that contains the region points for assigning + // region attributes after the holes have been carved. + regiontets = new triface[in->numberofregions]; + // Mark as marktested any tetrahedra inside volume regions. + for (i = 0; i < 5 * in->numberofregions; i += 5) { + // Search a tet containing the i-th region point. + neightet.tet = NULL; + randomsample(&(in->regionlist[i]), &neightet); + if (locate(&(in->regionlist[i]), &neightet) != OUTSIDE) { + regiontets[i/5] = neightet; + } else { + if (!b->quiet) { + printf("Warning: The %d-th region point ", i/5+1); + printf("lies outside the convex hull.\n"); + } + regiontets[i/5].tet = NULL; + } + } + } + + // Collect all exterior tets (in concave place and in holes). + for (i = 0; i < tetarray->objects; i++) { + parytet = (triface *) fastlookup(tetarray, i); + j = (parytet->ver & 3); // j is the current face number. + // Check the other three adjacent tets. + for (k = 1; k < 4; k++) { + decode(parytet->tet[(j + k) % 4], neightet); + // neightet may be a hull tet. + if (!infected(neightet)) { + // Is neightet protected by a subface. + if (!issubface(neightet)) { + // Not proected. Collect it. (It must not be a hull tet). + infect(neightet); + tetarray->newindex((void **) &parytet1); + *parytet1 = neightet; + } else { + // Protected. Check if it is a hull tet. + if (ishulltet(neightet)) { + // A hull tet. Collect it. + infect(neightet); + hullarray->newindex((void **) &parytet1); + *parytet1 = neightet; + // Both sides of this subface are exterior. + tspivot(neightet, checksh); + // Queue this subface (to be deleted later). + sinfect(checksh); // Only queue it once. + subfacstack->newindex((void **) &parysh); + *parysh = checksh; + } + } + } else { + // Both sides of this face are in exterior. + // If there is a subface. It should be collected. + if (issubface(neightet)) { + tspivot(neightet, checksh); + if (!sinfected(checksh)) { + sinfect(checksh); + subfacstack->newindex((void **) &parysh); + *parysh = checksh; + } + } + } + } // j, k + } // i + + if (b->regionattrib && (in->numberofregions > 0)) { + // Re-check saved region tets to see if they lie outside. + for (i = 0; i < in->numberofregions; i++) { + if (infected(regiontets[i])) { + if (b->verbose) { + printf("Warning: The %d-th region point ", i+1); + printf("lies in the exterior of the domain.\n"); + } + regiontets[i].tet = NULL; + } + } + } + + // Collect vertices which point to infected tets. These vertices + // may get deleted after the removal of exterior tets. + // If -Y1 option is used, collect all Steiner points for removal. + // The lists 'cavetetvertlist' and 'subvertstack' are re-used. + points->traversalinit(); + ptloop = pointtraverse(); + while (ptloop != NULL) { + if ((pointtype(ptloop) != UNUSEDVERTEX) && + (pointtype(ptloop) != DUPLICATEDVERTEX)) { + decode(point2tet(ptloop), neightet); + if (infected(neightet)) { + cavetetvertlist->newindex((void **) &parypt); + *parypt = ptloop; + } + if (b->nobisect && (b->supsteiner_level > 0)) { // -Y/1 + // Queue it if it is a Steiner point. + if (pointmark(ptloop) > + (in->numberofpoints - (in->firstnumber ? 0 : 1))) { + subvertstack->newindex((void **) &parypt); + *parypt = ptloop; + } + } + } + ptloop = pointtraverse(); + } + + if (!b->convex && (tetarray->objects > 0l)) { // No -c option. + // Remove exterior tets. Hull tets are updated. + arraypool *newhullfacearray; + triface hulltet, casface; + face segloop, *paryseg; + point pa, pb, pc; + long delsegcount = 0l; + + // Collect segments which point to infected tets. Some segments + // may get deleted after the removal of exterior tets. + subsegs->traversalinit(); + segloop.sh = shellfacetraverse(subsegs); + while (segloop.sh != NULL) { + sstpivot1(segloop, neightet); + if (infected(neightet)) { + subsegstack->newindex((void **) &paryseg); + *paryseg = segloop; + } + segloop.sh = shellfacetraverse(subsegs); + } + + newhullfacearray = new arraypool(sizeof(triface), 10); + + // Create and save new hull tets. + for (i = 0; i < tetarray->objects; i++) { + parytet = (triface *) fastlookup(tetarray, i); + for (j = 0; j < 4; j++) { + decode(parytet->tet[j], tetloop); + if (!infected(tetloop)) { + // Found a new hull face (must be a subface). + tspivot(tetloop, checksh); + maketetrahedron(&hulltet); + pa = org(tetloop); + pb = dest(tetloop); + pc = apex(tetloop); + setvertices(hulltet, pb, pa, pc, dummypoint); + bond(tetloop, hulltet); + // Update the subface-to-tet map. + sesymself(checksh); + tsbond(hulltet, checksh); + // Update the segment-to-tet map. + for (k = 0; k < 3; k++) { + if (issubseg(tetloop)) { + tsspivot1(tetloop, checkseg); + tssbond1(hulltet, checkseg); + sstbond1(checkseg, hulltet); + } + enextself(tetloop); + eprevself(hulltet); + } + // Update the point-to-tet map. + setpoint2tet(pa, (tetrahedron) tetloop.tet); + setpoint2tet(pb, (tetrahedron) tetloop.tet); + setpoint2tet(pc, (tetrahedron) tetloop.tet); + // Save the exterior tet at this hull face. It still holds pointer + // to the adjacent interior tet. Use it to connect new hull tets. + newhullfacearray->newindex((void **) &parytet1); + parytet1->tet = parytet->tet; + parytet1->ver = j; + } // if (!infected(tetloop)) + } // j + } // i + + // Connect new hull tets. + for (i = 0; i < newhullfacearray->objects; i++) { + parytet = (triface *) fastlookup(newhullfacearray, i); + fsym(*parytet, neightet); + // Get the new hull tet. + fsym(neightet, hulltet); + for (j = 0; j < 3; j++) { + esym(hulltet, casface); + if (casface.tet[casface.ver & 3] == NULL) { + // Since the boundary of the domain may not be a manifold, we + // find the adjacent hull face by traversing the tets in the + // exterior (which are all infected tets). + neightet = *parytet; + while (1) { + fnextself(neightet); + if (!infected(neightet)) break; + } + if (!ishulltet(neightet)) { + // An interior tet. Get the new hull tet. + fsymself(neightet); + esymself(neightet); + } + // Bond them together. + bond(casface, neightet); + } + enextself(hulltet); + enextself(*parytet); + } // j + } // i + + if (subfacstack->objects > 0l) { + // Remove all subfaces which do not attach to any tetrahedron. + // Segments which are not attached to any subfaces and tets + // are deleted too. + face casingout, casingin; + + for (i = 0; i < subfacstack->objects; i++) { + parysh = (face *) fastlookup(subfacstack, i); + if (i == 0) { + if (b->verbose) { + printf("Warning: Removed an exterior face (%d, %d, %d) #%d\n", + pointmark(sorg(*parysh)), pointmark(sdest(*parysh)), + pointmark(sapex(*parysh)), shellmark(*parysh)); + } + } + // Dissolve this subface from face links. + for (j = 0; j < 3; j++) { + spivot(*parysh, casingout); + sspivot(*parysh, checkseg); + if (casingout.sh != NULL) { + casingin = casingout; + while (1) { + spivot(casingin, checksh); + if (checksh.sh == parysh->sh) break; + casingin = checksh; + } + if (casingin.sh != casingout.sh) { + // Update the link: ... -> casingin -> casingout ->... + sbond1(casingin, casingout); + } else { + // Only one subface at this edge is left. + sdissolve(casingout); + } + if (checkseg.sh != NULL) { + // Make sure the segment does not connect to a dead one. + ssbond(casingout, checkseg); + } + } else { + if (checkseg.sh != NULL) { + //if (checkseg.sh[3] != NULL) { + if (delsegcount == 0) { + if (b->verbose) { + printf("Warning: Removed an exterior segment (%d, %d) #%d\n", + pointmark(sorg(checkseg)), pointmark(sdest(checkseg)), + shellmark(checkseg)); + } + } + shellfacedealloc(subsegs, checkseg.sh); + delsegcount++; + } + } + senextself(*parysh); + } // j + // Delete this subface. + shellfacedealloc(subfaces, parysh->sh); + } // i + if (b->verbose) { + printf(" Deleted %ld subfaces.\n", subfacstack->objects); + } + subfacstack->restart(); + } // if (subfacstack->objects > 0l) + + if (subsegstack->objects > 0l) { + for (i = 0; i < subsegstack->objects; i++) { + paryseg = (face *) fastlookup(subsegstack, i); + if (paryseg->sh && (paryseg->sh[3] != NULL)) { + sstpivot1(*paryseg, neightet); + if (infected(neightet)) { + if (b->verbose) { + printf("Warning: Removed an exterior segment (%d, %d) #%d\n", + pointmark(sorg(*paryseg)), pointmark(sdest(*paryseg)), + shellmark(*paryseg)); + } + shellfacedealloc(subsegs, paryseg->sh); + delsegcount++; + } + } + } + subsegstack->restart(); + } // if (subsegstack->objects > 0l) + + if (delsegcount > 0) { + if (b->verbose) { + printf(" Deleted %ld segments.\n", delsegcount); + } + } + + if (cavetetvertlist->objects > 0l) { + // Some vertices may lie in exterior. Marke them as UNUSEDVERTEX. + long delvertcount = unuverts; + long delsteinercount = 0l; + + for (i = 0; i < cavetetvertlist->objects; i++) { + parypt = (point *) fastlookup(cavetetvertlist, i); + decode(point2tet(*parypt), neightet); + if (infected(neightet)) { + // Found an exterior vertex. + if (pointmark(*parypt) > + (in->numberofpoints - (in->firstnumber ? 0 : 1))) { + // A Steiner point. + if (pointtype(*parypt) == FREESEGVERTEX) { + st_segref_count--; + } else if (pointtype(*parypt) == FREEFACETVERTEX) { + st_facref_count--; + } else { + st_volref_count--; + } + delsteinercount++; + if (steinerleft > 0) steinerleft++; + } + setpointtype(*parypt, UNUSEDVERTEX); + unuverts++; + } + } + + if (b->verbose) { + if (unuverts > delvertcount) { + if (delsteinercount > 0l) { + if (unuverts > (delvertcount + delsteinercount)) { + printf(" Removed %ld exterior input vertices.\n", + unuverts - delvertcount - delsteinercount); + } + printf(" Removed %ld exterior Steiner vertices.\n", + delsteinercount); + } else { + printf(" Removed %ld exterior input vertices.\n", + unuverts - delvertcount); + } + } + } + cavetetvertlist->restart(); + // Comment: 'subvertstack' will be cleaned in routine + // suppresssteinerpoints(). + } // if (cavetetvertlist->objects > 0l) + + // Update the hull size. + hullsize += (newhullfacearray->objects - hullarray->objects); + + // Delete all exterior tets and old hull tets. + for (i = 0; i < tetarray->objects; i++) { + parytet = (triface *) fastlookup(tetarray, i); + tetrahedrondealloc(parytet->tet); + } + tetarray->restart(); + + for (i = 0; i < hullarray->objects; i++) { + parytet = (triface *) fastlookup(hullarray, i); + tetrahedrondealloc(parytet->tet); + } + hullarray->restart(); + + delete newhullfacearray; + } // if (!b->convex && (tetarray->objects > 0l)) + + if (b->convex && (tetarray->objects > 0l)) { // With -c option + // In this case, all exterior tets get a region marker '-1'. + int attrnum = numelemattrib - 1; + + for (i = 0; i < tetarray->objects; i++) { + parytet = (triface *) fastlookup(tetarray, i); + setelemattribute(parytet->tet, attrnum, -1); + } + tetarray->restart(); + + for (i = 0; i < hullarray->objects; i++) { + parytet = (triface *) fastlookup(hullarray, i); + uninfect(*parytet); + } + hullarray->restart(); + + if (subfacstack->objects > 0l) { + for (i = 0; i < subfacstack->objects; i++) { + parysh = (face *) fastlookup(subfacstack, i); + suninfect(*parysh); + } + subfacstack->restart(); + } + + if (cavetetvertlist->objects > 0l) { + cavetetvertlist->restart(); + } + } // if (b->convex && (tetarray->objects > 0l)) + + if (b->regionattrib) { // With -A option. + if (!b->quiet) { + printf("Spreading region attributes.\n"); + } + REAL volume; + int attr, maxattr = 0; // Choose a small number here. + int attrnum = numelemattrib - 1; + // Comment: The element region marker is at the end of the list of + // the element attributes. + int regioncount = 0; + + // If has user-defined region attributes. + if (in->numberofregions > 0) { + // Spread region attributes. + for (i = 0; i < 5 * in->numberofregions; i += 5) { + if (regiontets[i/5].tet != NULL) { + attr = (int) in->regionlist[i + 3]; + if (attr > maxattr) { + maxattr = attr; + } + volume = in->regionlist[i + 4]; + tetarray->restart(); // Re-use this array. + infect(regiontets[i/5]); + tetarray->newindex((void **) &parytet); + *parytet = regiontets[i/5]; + // Collect and set attrs for all tets of this region. + for (j = 0; j < tetarray->objects; j++) { + parytet = (triface *) fastlookup(tetarray, j); + tetloop = *parytet; + setelemattribute(tetloop.tet, attrnum, attr); + if (b->varvolume) { // If has -a option. + setvolumebound(tetloop.tet, volume); + } + for (k = 0; k < 4; k++) { + decode(tetloop.tet[k], neightet); + // Is the adjacent already checked? + if (!infected(neightet)) { + // Is this side protected by a subface? + if (!issubface(neightet)) { + infect(neightet); + tetarray->newindex((void **) &parytet); + *parytet = neightet; + } + } + } // k + } // j + regioncount++; + } // if (regiontets[i/5].tet != NULL) + } // i + } + + // Set attributes for all tetrahedra. + attr = maxattr + 1; + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + if (!infected(tetloop)) { + // An unmarked region. + tetarray->restart(); // Re-use this array. + infect(tetloop); + tetarray->newindex((void **) &parytet); + *parytet = tetloop; + // Find and mark all tets. + for (j = 0; j < tetarray->objects; j++) { + parytet = (triface *) fastlookup(tetarray, j); + tetloop = *parytet; + setelemattribute(tetloop.tet, attrnum, attr); + for (k = 0; k < 4; k++) { + decode(tetloop.tet[k], neightet); + // Is the adjacent tet already checked? + if (!infected(neightet)) { + // Is this side protected by a subface? + if (!issubface(neightet)) { + infect(neightet); + tetarray->newindex((void **) &parytet); + *parytet = neightet; + } + } + } // k + } // j + attr++; // Increase the attribute. + regioncount++; + } + tetloop.tet = tetrahedrontraverse(); + } + // Until here, every tet has a region attribute. + + // Uninfect processed tets. + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + uninfect(tetloop); + tetloop.tet = tetrahedrontraverse(); + } + + if (b->verbose) { + //assert(regioncount > 0); + if (regioncount > 1) { + printf(" Found %d subdomains.\n", regioncount); + } else { + printf(" Found %d domain.\n", regioncount); + } + } + } // if (b->regionattrib) + + if (regiontets != NULL) { + delete [] regiontets; + } + delete tetarray; + delete hullarray; + + if (!b->convex) { // No -c option + // The mesh is non-convex now. + nonconvex = 1; + + // Push all hull tets into 'flipstack'. + tetrahedrons->traversalinit(); + tetloop.ver = 11; // The face opposite to dummypoint. + tetloop.tet = alltetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + if ((point) tetloop.tet[7] == dummypoint) { + fsym(tetloop, neightet); + flippush(flipstack, &neightet); + } + tetloop.tet = alltetrahedrontraverse(); + } + + flipconstraints fc; + fc.enqflag = 2; + long sliver_peel_count = lawsonflip3d(&fc); + + if (sliver_peel_count > 0l) { + if (b->verbose) { + printf(" Removed %ld hull slivers.\n", sliver_peel_count); + } + } + unflipqueue->restart(); + } // if (!b->convex) +} + +// [2018-07-30] +// Search a face with given indices (i,j,k). +// This function is only called when the default fast search fails. +// It is possible when there are non-manifold edges on the hull. +// On finish, tetloop return this face if it exists, otherwise, return 0. +int tetgenmesh::search_face(point pi, point pj, point pk, triface &tetloop) +{ + pinfect(pi); + pinfect(pj); + pinfect(pk); + + int t1ver; + triface t, t1; + point *pts, toppo; + int pcount = 0; + + t.ver = t1.ver = 0; + tetrahedrons->traversalinit(); + t.tet = tetrahedrontraverse(); + while (t.tet != NULL) { + pts = (point *) t.tet; + pcount = 0; + if (pinfected(pts[4])) pcount++; + if (pinfected(pts[5])) pcount++; + if (pinfected(pts[6])) pcount++; + if (pinfected(pts[7])) pcount++; + + if (pcount == 3) { + // Found a tet containing this face. + for (t.ver = 0; t.ver < 4; t.ver++) { + toppo = oppo(t); + if (!pinfected(toppo)) break; + } + int ii; + for (ii = 0; ii < 3; ii++) { + if (org(t) == pi) break; + enextself(t); + } + if (dest(t) == pj) { + } else { + eprevself(t); + fsymself(t); + } + break; + } + t.tet = tetrahedrontraverse(); + } + + puninfect(pi); + puninfect(pj); + puninfect(pk); + + if (t.tet != NULL) { + tetloop = t; + return 1; + } else { + return 0; + } +} + +int tetgenmesh::search_edge(point p0, point p1, triface &tetloop) +{ + triface t; + int ii; + + tetrahedrons->traversalinit(); + t.tet = tetrahedrontraverse(); + while (t.tet != NULL) { + for (ii = 0; ii < 6; ii++) { + t.ver = edge2ver[ii]; + if (((org(t) == p0) && (dest(t) == p1)) || + ((org(t) == p1) && (dest(t) == p0))) { + // Found the tet. + tetloop = t; + return 1; + } + } + t.tet = tetrahedrontraverse(); + } + + tetloop.tet = NULL; + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// reconstructmesh() Reconstruct a tetrahedral mesh. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::reconstructmesh() +{ + tetrahedron *ver2tetarray; + point *idx2verlist; + triface tetloop, checktet, prevchktet; + triface hulltet, face1, face2; + tetrahedron tptr; + face subloop, neighsh, nextsh; + face segloop; + shellface sptr; + point p[4], q[3]; + REAL ori, attrib, volume; + REAL cosang_tol, cosang; + REAL n1[3], n2[3]; + int eextras, marker = 0; + int bondflag; + int t1ver; + int idx, i, j, k; + + if (!b->quiet) { + printf("Reconstructing mesh ...\n"); + } + + if (b->convex) { // -c option. + // Assume the mesh is convex. Exterior tets have region attribute -1. + if (!(in->numberoftetrahedronattributes > 0)) { + terminatetetgen(this, 2); + } + } else { + // Assume the mesh is non-convex. + nonconvex = 1; + } + + // Create a map from indices to vertices. + makeindex2pointmap(idx2verlist); + // 'idx2verlist' has length 'in->numberofpoints + 1'. + if (in->firstnumber == 1) { + idx2verlist[0] = dummypoint; // Let 0th-entry be dummypoint. + } + + // Allocate an array that maps each vertex to its adjacent tets. + ver2tetarray = new tetrahedron[in->numberofpoints + 1]; + unuverts = in->numberofpoints; // All vertices are unused yet. + //for (i = 0; i < in->numberofpoints + 1; i++) { + for (i = in->firstnumber; i < in->numberofpoints + in->firstnumber; i++) { + ver2tetarray[i] = NULL; + } + + // Create the tetrahedra and connect those that share a common face. + for (i = 0; i < in->numberoftetrahedra; i++) { + // Get the four vertices. + idx = i * in->numberofcorners; + for (j = 0; j < 4; j++) { + p[j] = idx2verlist[in->tetrahedronlist[idx++]]; + if (pointtype(p[j]) == UNUSEDVERTEX) { + setpointtype(p[j], VOLVERTEX); // initial type. + unuverts--; + } + } + // Check the orientation. + ori = orient3d(p[0], p[1], p[2], p[3]); + if (ori > 0.0) { + // Swap the first two vertices. + q[0] = p[0]; p[0] = p[1]; p[1] = q[0]; + } else if (ori == 0.0) { + if (!b->quiet) { + printf("Warning: Tet #%d is degenerate.\n", i + in->firstnumber); + } + } + // Create a new tetrahedron. + maketetrahedron(&tetloop); // tetloop.ver = 11. + setvertices(tetloop, p[0], p[1], p[2], p[3]); + // Set element attributes if they exist. + for (j = 0; j < in->numberoftetrahedronattributes; j++) { + idx = i * in->numberoftetrahedronattributes; + attrib = in->tetrahedronattributelist[idx + j]; + setelemattribute(tetloop.tet, j, attrib); + } + // If -a switch is used (with no number follows) Set a volume + // constraint if it exists. + if (b->varvolume) { + if (in->tetrahedronvolumelist != (REAL *) NULL) { + volume = in->tetrahedronvolumelist[i]; + } else { + volume = -1.0; + } + setvolumebound(tetloop.tet, volume); + } + // Try connecting this tet to others that share the common faces. + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + p[3] = oppo(tetloop); + // Look for other tets having this vertex. + idx = pointmark(p[3]); + tptr = ver2tetarray[idx]; + // Link the current tet to the next one in the stack. + tetloop.tet[8 + tetloop.ver] = tptr; + // Push the current tet onto the stack. + ver2tetarray[idx] = encode(tetloop); + decode(tptr, checktet); + if (checktet.tet != NULL) { + p[0] = org(tetloop); // a + p[1] = dest(tetloop); // b + p[2] = apex(tetloop); // c + prevchktet = tetloop; + do { + q[0] = org(checktet); // a' + q[1] = dest(checktet); // b' + q[2] = apex(checktet); // c' + // Check the three faces at 'd' in 'checktet'. + bondflag = 0; + for (j = 0; j < 3; j++) { + // Go to the face [b',a',d], or [c',b',d], or [a',c',d]. + esym(checktet, face2); + if (face2.tet[face2.ver & 3] == NULL) { + k = ((j + 1) % 3); + if (q[k] == p[0]) { // b', c', a' = a + if (q[j] == p[1]) { // a', b', c' = b + // [#,#,d] is matched to [b,a,d]. + esym(tetloop, face1); + bond(face1, face2); + bondflag++; + } + } + if (q[k] == p[1]) { // b',c',a' = b + if (q[j] == p[2]) { // a',b',c' = c + // [#,#,d] is matched to [c,b,d]. + enext(tetloop, face1); + esymself(face1); + bond(face1, face2); + bondflag++; + } + } + if (q[k] == p[2]) { // b',c',a' = c + if (q[j] == p[0]) { // a',b',c' = a + // [#,#,d] is matched to [a,c,d]. + eprev(tetloop, face1); + esymself(face1); + bond(face1, face2); + bondflag++; + } + } + } else { + bondflag++; + } + enextself(checktet); + } // j + // Go to the next tet in the link. + tptr = checktet.tet[8 + checktet.ver]; + if (bondflag == 3) { + // All three faces at d in 'checktet' have been connected. + // It can be removed from the link. + prevchktet.tet[8 + prevchktet.ver] = tptr; + } else { + // Bakup the previous tet in the link. + prevchktet = checktet; + } + decode(tptr, checktet); + } while (checktet.tet != NULL); + } // if (checktet.tet != NULL) + } // for (tetloop.ver = 0; ... + } // i + + // Remember a tet of the mesh. + recenttet = tetloop; + + // Create hull tets, create the point-to-tet map, and clean up the + // temporary spaces used in each tet. + hullsize = tetrahedrons->items; + + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + tptr = encode(tetloop); + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + if (tetloop.tet[tetloop.ver] == NULL) { + // Create a hull tet. + maketetrahedron(&hulltet); + p[0] = org(tetloop); + p[1] = dest(tetloop); + p[2] = apex(tetloop); + setvertices(hulltet, p[1], p[0], p[2], dummypoint); + bond(tetloop, hulltet); + // Try connecting this to others that share common hull edges. + for (j = 0; j < 3; j++) { + fsym(hulltet, face2); + while (1) { + if (face2.tet == NULL) break; + esymself(face2); + if (apex(face2) == dummypoint) break; + fsymself(face2); + } + if (face2.tet != NULL) { + // Found an adjacent hull tet. + esym(hulltet, face1); + bond(face1, face2); + } + enextself(hulltet); + } + } + // Create the point-to-tet map. + setpoint2tet((point) (tetloop.tet[4 + tetloop.ver]), tptr); + // Clean the temporary used space. + tetloop.tet[8 + tetloop.ver] = NULL; + } + tetloop.tet = tetrahedrontraverse(); + } + + hullsize = tetrahedrons->items - hullsize; + + // Subfaces will be inserted into the mesh. + if (in->trifacelist != NULL) { + // A .face file is given. It may contain boundary faces. Insert them. + for (i = 0; i < in->numberoftrifaces; i++) { + // Is it a subface? + if (in->trifacemarkerlist != NULL) { + marker = in->trifacemarkerlist[i]; + } else { + // Face markers are not available. Assume all of them are subfaces. + marker = -1; // The default marker. + } + if (marker != 0) { + idx = i * 3; + for (j = 0; j < 3; j++) { + p[j] = idx2verlist[in->trifacelist[idx++]]; + } + // Search the subface. + bondflag = 0; + neighsh.sh = NULL; + // Make sure all vertices are in the mesh. Avoid crash. + for (j = 0; j < 3; j++) { + decode(point2tet(p[j]), checktet); + if (checktet.tet == NULL) break; + } + if ((j == 3) && getedge(p[0], p[1], &checktet)) { + tetloop = checktet; + q[2] = apex(checktet); + while (1) { + if (apex(tetloop) == p[2]) { + // Found the face. + // Check if there exist a subface already? + tspivot(tetloop, neighsh); + if (neighsh.sh != NULL) { + // Found a duplicated subface. + // This happens when the mesh was generated by other mesher. + bondflag = 0; + } else { + bondflag = 1; + } + break; + } + fnextself(tetloop); + if (apex(tetloop) == q[2]) break; + } + } + if (!bondflag) { + if (neighsh.sh == NULL) { + if (b->verbose > 1) { + printf("Warning: Searching subface #%d [%d,%d,%d] mark=%d.\n", + i + in->firstnumber, pointmark(p[0]), pointmark(p[1]), + pointmark(p[2]), marker); + } + // Search it globally. + if (search_face(p[0], p[1], p[2], tetloop)) { + bondflag = 1; + } + } + } + if (bondflag) { + // Create a new subface. + makeshellface(subfaces, &subloop); + setshvertices(subloop, p[0], p[1], p[2]); + // Create the point-to-subface map. + sptr = sencode(subloop); + for (j = 0; j < 3; j++) { + setpointtype(p[j], FACETVERTEX); // initial type. + setpoint2sh(p[j], sptr); + } + setshellmark(subloop, marker); + // Insert the subface into the mesh. + tsbond(tetloop, subloop); + fsymself(tetloop); + sesymself(subloop); + tsbond(tetloop, subloop); + } else { + if (neighsh.sh != NULL) { + // The subface already exists. Only set its mark. + setshellmark(neighsh, marker); + } else { + if (!b->quiet) { + printf("Warning: Subface #%d [%d,%d,%d] mark=%d is not found.\n", + i + in->firstnumber, pointmark(p[0]), pointmark(p[1]), + pointmark(p[2]), marker); + } + } + } // if (bondflag) + } // if (marker != 0) + } // i + } // if (in->trifacelist) + + // Indentify subfaces from the mesh. + // Create subfaces for hull faces (if they're not subface yet) and + // interior faces which separate two different materials. + eextras = in->numberoftetrahedronattributes; + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + tspivot(tetloop, neighsh); + if (neighsh.sh == NULL) { + bondflag = 0; + fsym(tetloop, checktet); + if (ishulltet(checktet)) { + // A hull face. + if (!b->convex) { + bondflag = 1; // Insert a hull subface. + } + } else { + if (eextras > 0) { + if (elemattribute(tetloop.tet, eextras - 1) != + elemattribute(checktet.tet, eextras - 1)) { + bondflag = 1; // Insert an interior interface. + } + } + } + if (bondflag) { + // Create a new subface. + makeshellface(subfaces, &subloop); + p[0] = org(tetloop); + p[1] = dest(tetloop); + p[2] = apex(tetloop); + setshvertices(subloop, p[0], p[1], p[2]); + // Create the point-to-subface map. + sptr = sencode(subloop); + for (j = 0; j < 3; j++) { + setpointtype(p[j], FACETVERTEX); // initial type. + setpoint2sh(p[j], sptr); + } + setshellmark(subloop, -1); // Default marker. + // Insert the subface into the mesh. + tsbond(tetloop, subloop); + sesymself(subloop); + tsbond(checktet, subloop); + } // if (bondflag) + } // if (neighsh.sh == NULL) + } + tetloop.tet = tetrahedrontraverse(); + } + + // Connect subfaces together. + subfaces->traversalinit(); + subloop.shver = 0; + subloop.sh = shellfacetraverse(subfaces); + while (subloop.sh != (shellface *) NULL) { + for (i = 0; i < 3; i++) { + spivot(subloop, neighsh); + if (neighsh.sh == NULL) { + // Form a subface ring by linking all subfaces at this edge. + // Traversing all faces of the tets at this edge. + stpivot(subloop, tetloop); + q[2] = apex(tetloop); + neighsh = subloop; + while (1) { + fnextself(tetloop); + tspivot(tetloop, nextsh); + if (nextsh.sh != NULL) { + // Do not connect itself. + if (nextsh.sh != neighsh.sh) { + // Link neighsh <= nextsh. + sbond1(neighsh, nextsh); + neighsh = nextsh; + } + } + if (apex(tetloop) == q[2]) { + break; + } + } // while (1) + } // if (neighsh.sh == NULL) + senextself(subloop); + } + subloop.sh = shellfacetraverse(subfaces); + } + + + // Segments will be introduced. + if (in->edgelist != NULL) { + // A .edge file is given. It may contain boundary edges. Insert them. + for (i = 0; i < in->numberofedges; i++) { + // Is it a segment? + if (in->edgemarkerlist != NULL) { + marker = in->edgemarkerlist[i]; + } else { + // Edge markers are not available. Assume all of them are segments. + marker = -1; // Default marker. + } + if (marker != 0) { + // Insert a segment. + idx = i * 2; + for (j = 0; j < 2; j++) { + p[j] = idx2verlist[in->edgelist[idx++]]; + } + // Make sure all vertices are in the mesh. Avoid crash. + for (j = 0; j < 2; j++) { + decode(point2tet(p[j]), checktet); + if (checktet.tet == NULL) break; + } + // Search the segment. + bondflag = 0; + if (j == 2) { + if (getedge(p[0], p[1], &checktet)) { + bondflag = 1; + } else { + if (b->verbose > 1) { + printf("Warning: Searching segment #%d [%d,%d] mark=%d.\n", + i + in->firstnumber, pointmark(p[0]), pointmark(p[1]), marker); + } + // Search it globally. + if (search_edge(p[0], p[1], checktet)) { + bondflag = 1; + } + } + } + if (bondflag > 0) { + // Create a new segment. + makeshellface(subsegs, &segloop); + setshvertices(segloop, p[0], p[1], NULL); + // Create the point-to-segment map. + sptr = sencode(segloop); + for (j = 0; j < 2; j++) { + setpointtype(p[j], RIDGEVERTEX); // initial type. + setpoint2sh(p[j], sptr); + } + setshellmark(segloop, marker); + // Insert the segment into the mesh. + tetloop = checktet; + q[2] = apex(checktet); + subloop.sh = NULL; + while (1) { + tssbond1(tetloop, segloop); + tspivot(tetloop, subloop); + if (subloop.sh != NULL) { + ssbond1(subloop, segloop); + sbond1(segloop, subloop); + } + fnextself(tetloop); + if (apex(tetloop) == q[2]) break; + } // while (1) + // Remember an adjacent tet for this segment. + sstbond1(segloop, tetloop); + } else { + if (!b->quiet) { + printf("Warning: Segment #%d [%d,%d] is missing.\n", + i + in->firstnumber, pointmark(p[0]), pointmark(p[1])); + } + } + } // if (marker != 0) + } // i + } // if (in->edgelist) + + // Identify segments from the mesh. + // Create segments for non-manifold edges (which are shared by more + // than two subfaces), and for non-coplanar edges, i.e., two subfaces + // form an dihedral angle > 'b->facet_separate_ang_tol' (degree). + cosang_tol = cos(b->facet_separate_ang_tol / 180.0 * PI); + subfaces->traversalinit(); + subloop.shver = 0; + subloop.sh = shellfacetraverse(subfaces); + while (subloop.sh != (shellface *) NULL) { + for (i = 0; i < 3; i++) { + sspivot(subloop, segloop); + if (segloop.sh == NULL) { + // Check if this edge is a segment. + bondflag = 0; + // Counter the number of subfaces at this edge. + idx = 0; + nextsh = subloop; + while (1) { + idx++; + spivotself(nextsh); + if (nextsh.sh == subloop.sh) break; + } + if (idx != 2) { + // It's a non-manifold edge. Insert a segment. + p[0] = sorg(subloop); + p[1] = sdest(subloop); + bondflag = 1; + } else { + spivot(subloop, neighsh); + if (shellmark(subloop) != shellmark(neighsh)) { + // It's an interior interface. Insert a segment. + p[0] = sorg(subloop); + p[1] = sdest(subloop); + bondflag = 1; + } else { + if (!b->convex) { + // Check the dihedral angle formed by the two subfaces. + p[0] = sorg(subloop); + p[1] = sdest(subloop); + p[2] = sapex(subloop); + p[3] = sapex(neighsh); + facenormal(p[0], p[1], p[2], n1, 1, NULL); + facenormal(p[0], p[1], p[3], n2, 1, NULL); + cosang = dot(n1, n2) / (sqrt(dot(n1, n1)) * sqrt(dot(n2, n2))); + // Rounding. + if (cosang > 1.0) cosang = 1.0; + else if (cosang < -1.0) cosang = -1.0; + if (cosang > cosang_tol) { + bondflag = 1; + } + } + } + } + if (bondflag) { + // Create a new segment. + makeshellface(subsegs, &segloop); + setshvertices(segloop, p[0], p[1], NULL); + // Create the point-to-segment map. + sptr = sencode(segloop); + for (j = 0; j < 2; j++) { + setpointtype(p[j], RIDGEVERTEX); // initial type. + setpoint2sh(p[j], sptr); + } + setshellmark(segloop, -1); // Default marker. + // Insert the subface into the mesh. + stpivot(subloop, tetloop); + q[2] = apex(tetloop); + while (1) { + tssbond1(tetloop, segloop); + tspivot(tetloop, neighsh); + if (neighsh.sh != NULL) { + ssbond1(neighsh, segloop); + } + fnextself(tetloop); + if (apex(tetloop) == q[2]) break; + } // while (1) + // Remember an adjacent tet for this segment. + sstbond1(segloop, tetloop); + sbond1(segloop, subloop); + } // if (bondflag) + } // if (neighsh.sh == NULL) + senextself(subloop); + } // i + subloop.sh = shellfacetraverse(subfaces); + } + + // Remember the number of input segments. + insegments = subsegs->items; + + if (!b->nobisect || checkconstraints) { + // Mark Steiner points on segments and facets. + // - all vertices which remaining type FEACTVERTEX become + // Steiner points in facets (= FREEFACERVERTEX). + // - vertices on segment need to be checked. + face* segperverlist; + int* idx2seglist; + face parentseg, nextseg; + verttype vt; + REAL area, len, l1, l2; + int fmarker; + + makepoint2submap(subsegs, idx2seglist, segperverlist); + + points->traversalinit(); + point ptloop = pointtraverse(); + while (ptloop != NULL) { + vt = pointtype(ptloop); + if (vt == VOLVERTEX) { + setpointtype(ptloop, FREEVOLVERTEX); + st_volref_count++; + } else if (vt == FACETVERTEX) { + setpointtype(ptloop, FREEFACETVERTEX); + st_facref_count++; + } else if (vt == RIDGEVERTEX) { + idx = pointmark(ptloop) - in->firstnumber; + if ((idx2seglist[idx + 1] - idx2seglist[idx]) == 2) { + i = idx2seglist[idx]; + parentseg = segperverlist[i]; + nextseg = segperverlist[i + 1]; + sesymself(nextseg); + p[0] = sorg(nextseg); + p[1] = sdest(parentseg); + // Check if three points p[0], ptloop, p[2] are (nearly) collinear. + len = distance(p[0], p[1]); + l1 = distance(p[0], ptloop); + l2 = distance(ptloop, p[1]); + if (((l1 + l2 - len) / len) < b->epsilon) { + // They are (nearly) collinear. + setpointtype(ptloop, FREESEGVERTEX); + // Connect nextseg and parentseg together at ptloop. + senextself(nextseg); + senext2self(parentseg); + sbond(nextseg, parentseg); + st_segref_count++; + } + } + } + ptloop = pointtraverse(); + } + + // Are there area constraints? + if (b->quality && (in->facetconstraintlist != (REAL *) NULL)) { + // Set maximum area constraints on facets. + for (i = 0; i < in->numberoffacetconstraints; i++) { + fmarker = (int) in->facetconstraintlist[i * 2]; + area = in->facetconstraintlist[i * 2 + 1]; + subfaces->traversalinit(); + subloop.sh = shellfacetraverse(subfaces); + while (subloop.sh != NULL) { + if (shellmark(subloop) == fmarker) { + setareabound(subloop, area); + } + subloop.sh = shellfacetraverse(subfaces); + } + } + } + + // Are there length constraints? + if (b->quality && (in->segmentconstraintlist != (REAL *) NULL)) { + // Set maximum length constraints on segments. + int e1, e2; + for (i = 0; i < in->numberofsegmentconstraints; i++) { + e1 = (int) in->segmentconstraintlist[i * 3]; + e2 = (int) in->segmentconstraintlist[i * 3 + 1]; + len = in->segmentconstraintlist[i * 3 + 2]; + // Search for edge [e1, e2]. + idx = e1 - in->firstnumber; + for (j = idx2seglist[idx]; j < idx2seglist[idx + 1]; j++) { + parentseg = segperverlist[j]; + if (pointmark(sdest(parentseg)) == e2) { + setareabound(parentseg, len); + break; + } + } + } + } + + delete [] idx2seglist; + delete [] segperverlist; + } + + + // Set global flags. + checksubsegflag = 1; + checksubfaceflag = 1; + + delete [] idx2verlist; + delete [] ver2tetarray; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// scoutpoint() Search a point in mesh. // +// // +// This function searches the point in a mesh whose domain may be not convex.// +// In case of a convex domain, the locate() function is sufficient. // +// // +// If 'randflag' is used, randomly select a start searching tet. Otherwise, // +// start searching directly from 'searchtet'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::scoutpoint(point searchpt, triface *searchtet, int randflag) +{ + point pa, pb, pc, pd; + enum locateresult loc = OUTSIDE; + REAL vol, ori1, ori2 = 0, ori3 = 0, ori4 = 0; + int t1ver; + + + // Randomly select a good starting tet. + if (randflag) { + randomsample(searchpt, searchtet); + } else { + if (searchtet->tet == NULL) { + *searchtet = recenttet; + } + } + loc = locate(searchpt, searchtet); + + if (loc == OUTSIDE) { + if (b->convex) { // -c option + // The point lies outside of the convex hull. + return (int) loc; + } + // Test if it lies nearly on the hull face. + // Reuse vol, ori1. + pa = org(*searchtet); + pb = dest(*searchtet); + pc = apex(*searchtet); + vol = triarea(pa, pb, pc); + ori1 = orient3dfast(pa, pb, pc, searchpt); + if (fabs(ori1 / vol) < b->epsilon) { + loc = ONFACE; // On face (or on edge, or on vertex). + fsymself(*searchtet); + } + } + + if (loc != OUTSIDE) { + // Round the result of location. + pa = org(*searchtet); + pb = dest(*searchtet); + pc = apex(*searchtet); + pd = oppo(*searchtet); + vol = orient3dfast(pa, pb, pc, pd); + ori1 = orient3dfast(pa, pb, pc, searchpt); + ori2 = orient3dfast(pb, pa, pd, searchpt); + ori3 = orient3dfast(pc, pb, pd, searchpt); + ori4 = orient3dfast(pa, pc, pd, searchpt); + if (fabs(ori1 / vol) < b->epsilon) ori1 = 0; + if (fabs(ori2 / vol) < b->epsilon) ori2 = 0; + if (fabs(ori3 / vol) < b->epsilon) ori3 = 0; + if (fabs(ori4 / vol) < b->epsilon) ori4 = 0; + } else { // if (loc == OUTSIDE) { + // Do a brute force search for the point (with rounding). + tetrahedrons->traversalinit(); + searchtet->tet = tetrahedrontraverse(); + while (searchtet->tet != NULL) { + pa = org(*searchtet); + pb = dest(*searchtet); + pc = apex(*searchtet); + pd = oppo(*searchtet); + + vol = orient3dfast(pa, pb, pc, pd); + if (vol < 0) { + ori1 = orient3dfast(pa, pb, pc, searchpt); + if (fabs(ori1 / vol) < b->epsilon) ori1 = 0; // Rounding. + if (ori1 <= 0) { + ori2 = orient3dfast(pb, pa, pd, searchpt); + if (fabs(ori2 / vol) < b->epsilon) ori2 = 0; + if (ori2 <= 0) { + ori3 = orient3dfast(pc, pb, pd, searchpt); + if (fabs(ori3 / vol) < b->epsilon) ori3 = 0; + if (ori3 <= 0) { + ori4 = orient3dfast(pa, pc, pd, searchpt); + if (fabs(ori4 / vol) < b->epsilon) ori4 = 0; + if (ori4 <= 0) { + // Found the tet. Return its location. + break; + } // ori4 + } // ori3 + } // ori2 + } // ori1 + } + + searchtet->tet = tetrahedrontraverse(); + } // while (searchtet->tet != NULL) + nonregularcount++; // Re-use this counter. + } + + if (searchtet->tet != NULL) { + // Return the point location. + if (ori1 == 0) { // on face [a,b,c] + if (ori2 == 0) { // on edge [a,b]. + if (ori3 == 0) { // on vertex [b]. + enextself(*searchtet); // [b,c,a,d] + loc = ONVERTEX; + } else { + if (ori4 == 0) { // on vertex [a] + loc = ONVERTEX; // [a,b,c,d] + } else { + loc = ONEDGE; // [a,b,c,d] + } + } + } else { // ori2 != 0 + if (ori3 == 0) { // on edge [b,c] + if (ori4 == 0) { // on vertex [c] + eprevself(*searchtet); // [c,a,b,d] + loc = ONVERTEX; + } else { + enextself(*searchtet); // [b,c,a,d] + loc = ONEDGE; + } + } else { // ori3 != 0 + if (ori4 == 0) { // on edge [c,a] + eprevself(*searchtet); // [c,a,b,d] + loc = ONEDGE; + } else { + loc = ONFACE; + } + } + } + } else { // ori1 != 0 + if (ori2 == 0) { // on face [b,a,d] + esymself(*searchtet); // [b,a,d,c] + if (ori3 == 0) { // on edge [b,d] + eprevself(*searchtet); // [d,b,a,c] + if (ori4 == 0) { // on vertex [d] + loc = ONVERTEX; + } else { + loc = ONEDGE; + } + } else { // ori3 != 0 + if (ori4 == 0) { // on edge [a,d] + enextself(*searchtet); // [a,d,b,c] + loc = ONEDGE; + } else { + loc = ONFACE; + } + } + } else { // ori2 != 0 + if (ori3 == 0) { // on face [c,b,d] + enextself(*searchtet); + esymself(*searchtet); + if (ori4 == 0) { // on edge [c,d] + eprevself(*searchtet); + loc = ONEDGE; + } else { + loc = ONFACE; + } + } else { + if (ori4 == 0) { // on face [a,c,d] + eprevself(*searchtet); + esymself(*searchtet); + loc = ONFACE; + } else { // inside tet [a,b,c,d] + loc = INTETRAHEDRON; + } // ori4 + } // ori3 + } // ori2 + } // ori1 + } else { + loc = OUTSIDE; + } + + return (int) loc; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// getpointmeshsize() Interpolate the mesh size at given point. // +// // +// 'iloc' indicates the location of the point w.r.t. 'searchtet'. The size // +// is obtained by linear interpolation on the vertices of the tet. // +// // +/////////////////////////////////////////////////////////////////////////////// + +REAL tetgenmesh::getpointmeshsize(point searchpt, triface *searchtet, int iloc) +{ + point *pts, pa, pb, pc; + REAL volume, vol[4], wei[4]; + REAL size; + int i; + + size = 0; + + if (iloc == (int) INTETRAHEDRON) { + pts = (point *) &(searchtet->tet[4]); + // Only do interpolation if all vertices have non-zero sizes. + if ((pts[0][pointmtrindex] > 0) && (pts[1][pointmtrindex] > 0) && + (pts[2][pointmtrindex] > 0) && (pts[3][pointmtrindex] > 0)) { + // P1 interpolation. + volume = orient3dfast(pts[0], pts[1], pts[2], pts[3]); + vol[0] = orient3dfast(searchpt, pts[1], pts[2], pts[3]); + vol[1] = orient3dfast(pts[0], searchpt, pts[2], pts[3]); + vol[2] = orient3dfast(pts[0], pts[1], searchpt, pts[3]); + vol[3] = orient3dfast(pts[0], pts[1], pts[2], searchpt); + for (i = 0; i < 4; i++) { + wei[i] = fabs(vol[i] / volume); + size += (wei[i] * pts[i][pointmtrindex]); + } + } + } else if (iloc == (int) ONFACE) { + pa = org(*searchtet); + pb = dest(*searchtet); + pc = apex(*searchtet); + if ((pa[pointmtrindex] > 0) && (pb[pointmtrindex] > 0) && + (pc[pointmtrindex] > 0)) { + volume = triarea(pa, pb, pc); + vol[0] = triarea(searchpt, pb, pc); + vol[1] = triarea(pa, searchpt, pc); + vol[2] = triarea(pa, pb, searchpt); + size = (vol[0] / volume) * pa[pointmtrindex] + + (vol[1] / volume) * pb[pointmtrindex] + + (vol[2] / volume) * pc[pointmtrindex]; + } + } else if (iloc == (int) ONEDGE) { + pa = org(*searchtet); + pb = dest(*searchtet); + if ((pa[pointmtrindex] > 0) && (pb[pointmtrindex] > 0)) { + volume = distance(pa, pb); + vol[0] = distance(searchpt, pb); + vol[1] = distance(pa, searchpt); + size = (vol[0] / volume) * pa[pointmtrindex] + + (vol[1] / volume) * pb[pointmtrindex]; + } + } else if (iloc == (int) ONVERTEX) { + pa = org(*searchtet); + if (pa[pointmtrindex] > 0) { + size = pa[pointmtrindex]; + } + } + + return size; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// interpolatemeshsize() Interpolate the mesh size from a background mesh // +// (source) to the current mesh (destination). // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::interpolatemeshsize() +{ + triface searchtet; + point ploop; + REAL minval = 0.0, maxval = 0.0; + int iloc; + int count; + + if (!b->quiet) { + printf("Interpolating mesh size ...\n"); + } + + long bak_nonregularcount = nonregularcount; + nonregularcount = 0l; // Count the number of (slow) global searches. + long baksmaples = bgm->samples; + bgm->samples = 3l; + count = 0; // Count the number of interpolated points. + + // Interpolate sizes for all points in the current mesh. + points->traversalinit(); + ploop = pointtraverse(); + while (ploop != NULL) { + // Search a tet in bgm which containing this point. + searchtet.tet = NULL; + iloc = bgm->scoutpoint(ploop, &searchtet, 1); // randflag = 1 + if (iloc != (int) OUTSIDE) { + // Interpolate the mesh size. + ploop[pointmtrindex] = bgm->getpointmeshsize(ploop, &searchtet, iloc); + setpoint2bgmtet(ploop, bgm->encode(searchtet)); + if (count == 0) { + // This is the first interpolated point. + minval = maxval = ploop[pointmtrindex]; + } else { + if (ploop[pointmtrindex] < minval) { + minval = ploop[pointmtrindex]; + } + if (ploop[pointmtrindex] > maxval) { + maxval = ploop[pointmtrindex]; + } + } + count++; + } else { + if (!b->quiet) { + printf("Warnning: Failed to locate point %d in source mesh.\n", + pointmark(ploop)); + } + } + ploop = pointtraverse(); + } + + if (b->verbose) { + printf(" Interoplated %d points.\n", count); + if (nonregularcount > 0l) { + printf(" Performed %ld brute-force searches.\n", nonregularcount); + } + printf(" Size rangle [%.17g, %.17g].\n", minval, maxval); + } + + bgm->samples = baksmaples; + nonregularcount = bak_nonregularcount; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// insertconstrainedpoints() Insert a list of points into the mesh. // +// // +// Assumption: The bounding box of the insert point set should be no larger // +// than the bounding box of the mesh. (Required by point sorting). // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::insertconstrainedpoints(point *insertarray, int arylen, + int rejflag) +{ + triface searchtet, spintet; + face splitsh; + face splitseg; + insertvertexflags ivf; + flipconstraints fc; + int randflag = 0; + int t1ver; + int i; + + if (b->verbose) { + printf(" Inserting %d constrained points\n", arylen); + } + + if (b->no_sort) { // -b/1 option. + if (b->verbose) { + printf(" Using the input order.\n"); + } + } else { + if (b->verbose) { + printf(" Permuting vertices.\n"); + } + point swappoint; + int randindex; + srand(arylen); + for (i = 0; i < arylen; i++) { + randindex = rand() % (i + 1); + swappoint = insertarray[i]; + insertarray[i] = insertarray[randindex]; + insertarray[randindex] = swappoint; + } + if (b->brio_hilbert) { // -b1 option + if (b->verbose) { + printf(" Sorting vertices.\n"); + } + hilbert_init(in->mesh_dim); + int ngroup = 0; + brio_multiscale_sort(insertarray, arylen, b->brio_threshold, + b->brio_ratio, &ngroup); + } else { // -b0 option. + randflag = 1; + } // if (!b->brio_hilbert) + } // if (!b->no_sort) + + long bak_nonregularcount = nonregularcount; + nonregularcount = 0l; + long baksmaples = samples; + samples = 3l; // Use at least 3 samples. Updated in randomsample(). + + long bak_seg_count = st_segref_count; + long bak_fac_count = st_facref_count; + long bak_vol_count = st_volref_count; + + // Initialize the insertion parameters. + if (b->incrflip) { // -l option + // Use incremental flip algorithm. + ivf.bowywat = 0; + ivf.lawson = 1; + ivf.validflag = 0; // No need to validate the cavity. + fc.enqflag = 2; + } else { + // Use Bowyer-Watson algorithm. + ivf.bowywat = 1; + ivf.lawson = 0; + ivf.validflag = 1; // Validate the B-W cavity. + } + ivf.rejflag = rejflag; + ivf.chkencflag = 0; + ivf.sloc = (int) INSTAR; + ivf.sbowywat = 3; + ivf.splitbdflag = 1; + ivf.respectbdflag = 1; + ivf.assignmeshsize = b->metric; + + encseglist = new arraypool(sizeof(face), 8); + encshlist = new arraypool(sizeof(badface), 8); + + // Insert the points. + for (i = 0; i < arylen; i++) { + // Find the location of the inserted point. + // Do not use 'recenttet', since the mesh may be non-convex. + searchtet.tet = NULL; + ivf.iloc = scoutpoint(insertarray[i], &searchtet, randflag); + + // Decide the right type for this point. + setpointtype(insertarray[i], FREEVOLVERTEX); // Default. + splitsh.sh = NULL; + splitseg.sh = NULL; + if (ivf.iloc == (int) ONEDGE) { + if (issubseg(searchtet)) { + tsspivot1(searchtet, splitseg); + setpointtype(insertarray[i], FREESEGVERTEX); + //ivf.rejflag = 0; + } else { + // Check if it is a subface edge. + spintet = searchtet; + while (1) { + if (issubface(spintet)) { + tspivot(spintet, splitsh); + setpointtype(insertarray[i], FREEFACETVERTEX); + //ivf.rejflag |= 1; + break; + } + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + } + } else if (ivf.iloc == (int) ONFACE) { + if (issubface(searchtet)) { + tspivot(searchtet, splitsh); + setpointtype(insertarray[i], FREEFACETVERTEX); + //ivf.rejflag |= 1; + } + } + + // Now insert the point. + if (insertpoint(insertarray[i], &searchtet, &splitsh, &splitseg, &ivf)) { + if (flipstack != NULL) { + // There are queued faces. Use flips to recover Delaunayness. + lawsonflip3d(&fc); + // There may be unflippable edges. Ignore them. + unflipqueue->restart(); + } + // Update the Steiner counters. + if (pointtype(insertarray[i]) == FREESEGVERTEX) { + st_segref_count++; + } else if (pointtype(insertarray[i]) == FREEFACETVERTEX) { + st_facref_count++; + } else { + st_volref_count++; + } + } else { + // Point is not inserted. + //pointdealloc(insertarray[i]); + setpointtype(insertarray[i], UNUSEDVERTEX); + unuverts++; + encseglist->restart(); + encshlist->restart(); + } + } // i + + delete encseglist; + delete encshlist; + + if (b->verbose) { + printf(" Inserted %ld (%ld, %ld, %ld) vertices.\n", + st_segref_count + st_facref_count + st_volref_count - + (bak_seg_count + bak_fac_count + bak_vol_count), + st_segref_count - bak_seg_count, st_facref_count - bak_fac_count, + st_volref_count - bak_vol_count); + if (nonregularcount > 0l) { + printf(" Performed %ld brute-force searches.\n", nonregularcount); + } + } + + nonregularcount = bak_nonregularcount; + samples = baksmaples; +} + +void tetgenmesh::insertconstrainedpoints(tetgenio *addio) +{ + point *insertarray, newpt; + REAL x, y, z, w; + int index, attribindex, mtrindex; + int arylen, i, j; + + if (!b->quiet) { + printf("Inserting constrained points ...\n"); + } + + insertarray = new point[addio->numberofpoints]; + arylen = 0; + index = 0; + attribindex = 0; + mtrindex = 0; + + for (i = 0; i < addio->numberofpoints; i++) { + x = addio->pointlist[index++]; + y = addio->pointlist[index++]; + z = addio->pointlist[index++]; + // Test if this point lies inside the bounding box. + if ((x < xmin) || (x > xmax) || (y < ymin) || (y > ymax) || + (z < zmin) || (z > zmax)) { + if (b->verbose) { + printf("Warning: Point #%d lies outside the bounding box. Ignored\n", + i + in->firstnumber); + } + continue; + } + makepoint(&newpt, UNUSEDVERTEX); + newpt[0] = x; + newpt[1] = y; + newpt[2] = z; + // Read the point attributes. (Including point weights.) + for (j = 0; j < addio->numberofpointattributes; j++) { + newpt[3 + j] = addio->pointattributelist[attribindex++]; + } + // Read the point metric tensor. + for (j = 0; j < addio->numberofpointmtrs; j++) { + newpt[pointmtrindex + j] = addio->pointmtrlist[mtrindex++]; + } + if (b->weighted) { // -w option + if (addio->numberofpointattributes > 0) { + // The first point attribute is its weight. + w = newpt[3]; + } else { + // No given weight available. Default choose the maximum + // absolute value among its coordinates. + w = fabs(x); + if (w < fabs(y)) w = fabs(y); + if (w < fabs(z)) w = fabs(z); + } + if (b->weighted_param == 0) { + newpt[3] = x * x + y * y + z * z - w; // Weighted DT. + } else { // -w1 option + newpt[3] = w; // Regular tetrahedralization. + } + } + insertarray[arylen] = newpt; + arylen++; + } // i + + // Insert the points. + int rejflag = 0; // Do not check encroachment. + if (b->metric) { // -m option. + rejflag |= 4; // Reject it if it lies in some protecting balls. + } + + insertconstrainedpoints(insertarray, arylen, rejflag); + + delete [] insertarray; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// meshcoarsening() Deleting (selected) vertices. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::collectremovepoints(arraypool *remptlist) +{ + point ptloop, *parypt; + verttype vt; + + // If a mesh sizing function is given. Collect vertices whose mesh size + // is greater than its smallest edge length. + if (b->metric) { // -m option + REAL len, smlen; + int i; + points->traversalinit(); + ptloop = pointtraverse(); + while (ptloop != NULL) { + // Do not remove a boundary vertex + vt = pointtype(ptloop); + if ((vt == RIDGEVERTEX) || (vt == ACUTEVERTEX) || (vt == FACETVERTEX) || + (vt == FREEFACETVERTEX) || (vt == FREESEGVERTEX) || (vt == UNUSEDVERTEX)) { + ptloop = pointtraverse(); + continue; + } + if (ptloop[pointmtrindex] > 0) { + // Get the smallest edge length at this vertex. + getvertexstar(1, ptloop, cavetetlist, cavetetvertlist, NULL); + parypt = (point *) fastlookup(cavetetvertlist, 0); + smlen = distance(ptloop, *parypt); + for (i = 1; i < cavetetvertlist->objects; i++) { + parypt = (point *) fastlookup(cavetetvertlist, i); + len = distance(ptloop, *parypt); + if (len < smlen) { + smlen = len; + } + } + cavetetvertlist->restart(); + cavetetlist->restart(); + if (smlen < ptloop[pointmtrindex]) { + pinfect(ptloop); + remptlist->newindex((void **) &parypt); + *parypt = ptloop; + } + } + ptloop = pointtraverse(); + } + if (b->verbose > 1) { + printf(" Coarsen %ld oversized points.\n", remptlist->objects); + } + } + + // If 'in->pointmarkerlist' exists, Collect vertices with markers '-1'. + if (in->pointmarkerlist != NULL) { + long bak_count = remptlist->objects; + points->traversalinit(); + ptloop = pointtraverse(); + int index = 0; + while (ptloop != NULL) { + if (index < in->numberofpoints) { + if (in->pointmarkerlist[index] == -1) { + pinfect(ptloop); + remptlist->newindex((void **) &parypt); + *parypt = ptloop; + } + } else { + // Remaining are not input points. Stop here. + break; + } + index++; + ptloop = pointtraverse(); + } + if (b->verbose > 1) { + printf(" Coarsen %ld marked points.\n", remptlist->objects - bak_count); + } + } // if (in->pointmarkerlist != NULL) + + if (b->coarsen_param > 0) { // -R1/# + // Remove a coarsen_percent number of interior points. + if (b->verbose > 1) { + printf(" Coarsen %g percent of interior points.\n", + b->coarsen_percent * 100.0); + } + arraypool *intptlist = new arraypool(sizeof(point *), 10); + // Count the total number of interior points. + points->traversalinit(); + ptloop = pointtraverse(); + while (ptloop != NULL) { + vt = pointtype(ptloop); + if ((vt == VOLVERTEX) || (vt == FREEVOLVERTEX) || + (vt == FREEFACETVERTEX) || (vt == FREESEGVERTEX)) { + intptlist->newindex((void **) &parypt); + *parypt = ptloop; + } + ptloop = pointtraverse(); + } + if (intptlist->objects > 0l) { + // Sort the list of points randomly. + point *parypt_i, swappt; + int randindex, i; + srand(intptlist->objects); + for (i = 0; i < intptlist->objects; i++) { + randindex = rand() % (i + 1); // randomnation(i + 1); + parypt_i = (point *) fastlookup(intptlist, i); + parypt = (point *) fastlookup(intptlist, randindex); + // Swap this two points. + swappt = *parypt_i; + *parypt_i = *parypt; + *parypt = swappt; + } + int remcount = (int) ((REAL) intptlist->objects * b->coarsen_percent); + // Return the first remcount points. + for (i = 0; i < remcount; i++) { + parypt_i = (point *) fastlookup(intptlist, i); + if (!pinfected(*parypt_i)) { + pinfected(*parypt_i); + remptlist->newindex((void **) &parypt); + *parypt = *parypt_i; + } + } + } + delete intptlist; + } + + // Unmark all collected vertices. + for (int i = 0; i < remptlist->objects; i++) { + parypt = (point *) fastlookup(remptlist, i); + puninfect(*parypt); + } +} + +void tetgenmesh::meshcoarsening() +{ + arraypool *remptlist; + + if (!b->quiet) { + printf("Mesh coarsening ...\n"); + } + + // Collect the set of points to be removed + remptlist = new arraypool(sizeof(point *), 10); + collectremovepoints(remptlist); + + if (remptlist->objects == 0l) { + delete remptlist; + return; + } + + if (b->verbose) { + if (remptlist->objects > 0l) { + printf(" Removing %ld points...\n", remptlist->objects); + } + } + + point *parypt, *plastpt; + long ms = remptlist->objects; + int nit = 0; + int bak_fliplinklevel = b->fliplinklevel; + b->fliplinklevel = -1; + autofliplinklevel = 1; // Init value. + int i; + + while (1) { + + if (b->verbose > 1) { + printf(" Removing points [%s level = %2d] #: %ld.\n", + (b->fliplinklevel > 0) ? "fixed" : "auto", + (b->fliplinklevel > 0) ? b->fliplinklevel : autofliplinklevel, + remptlist->objects); + } + + // Remove the list of points. + for (i = 0; i < remptlist->objects; i++) { + parypt = (point *) fastlookup(remptlist, i); + if (removevertexbyflips(*parypt)) { + // Move the last entry to the current place. + plastpt = (point *) fastlookup(remptlist, remptlist->objects - 1); + *parypt = *plastpt; + remptlist->objects--; + i--; + } + } + + if (remptlist->objects > 0l) { + if (b->fliplinklevel >= 0) { + break; // We have tried all levels. + } + if (remptlist->objects == ms) { + nit++; + if (nit >= 3) { + // Do the last round with unbounded flip link level. + b->fliplinklevel = 100000; + } + } else { + ms = remptlist->objects; + if (nit > 0) { + nit--; + } + } + autofliplinklevel+=b->fliplinklevelinc; + } else { + // All points are removed. + break; + } + } // while (1) + + if (remptlist->objects > 0l) { + if (b->verbose) { + printf(" %ld points are not removed !\n", remptlist->objects); + } + } + + b->fliplinklevel = bak_fliplinklevel; + delete remptlist; +} + +//// //// +//// //// +//// reconstruct_cxx ////////////////////////////////////////////////////////// + +//// refine_cxx /////////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// makefacetverticesmap() Create a map from facet to its vertices. // +// // +// All facets will be indexed (starting from 0). The map is saved in two // +// global arrays: 'idx2facetlist' and 'facetverticeslist'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::makefacetverticesmap() +{ + arraypool *facetvertexlist, *vertlist, **paryvertlist; + face subloop, neighsh, *parysh, *parysh1; + point pa, *ppt, *parypt; + verttype vt; + int facetindex, totalvertices; + int i, j, k; + + if (b->verbose) { + printf(" Creating the facet vertices map.\n"); + } + + facetvertexlist = new arraypool(sizeof(arraypool *), 10); + facetindex = totalvertices = 0; + + subfaces->traversalinit(); + subloop.sh = shellfacetraverse(subfaces); + while (subloop.sh != NULL) { + if (!sinfected(subloop)) { + // A new facet. Create its vertices list. + vertlist = new arraypool(sizeof(point *), 8); + ppt = (point *) &(subloop.sh[3]); + for (k = 0; k < 3; k++) { + vt = pointtype(ppt[k]); + if ((vt != FREESEGVERTEX) && (vt != FREEFACETVERTEX)) { + pinfect(ppt[k]); + vertlist->newindex((void **) &parypt); + *parypt = ppt[k]; + } + } + sinfect(subloop); + caveshlist->newindex((void **) &parysh); + *parysh = subloop; + for (i = 0; i < caveshlist->objects; i++) { + parysh = (face *) fastlookup(caveshlist, i); + setfacetindex(*parysh, facetindex); + for (j = 0; j < 3; j++) { + if (!isshsubseg(*parysh)) { + spivot(*parysh, neighsh); + if (!sinfected(neighsh)) { + pa = sapex(neighsh); + if (!pinfected(pa)) { + vt = pointtype(pa); + if ((vt != FREESEGVERTEX) && (vt != FREEFACETVERTEX)) { + pinfect(pa); + vertlist->newindex((void **) &parypt); + *parypt = pa; + } + } + sinfect(neighsh); + caveshlist->newindex((void **) &parysh1); + *parysh1 = neighsh; + } + } + senextself(*parysh); + } + } // i + totalvertices += (int) vertlist->objects; + // Uninfect facet vertices. + for (k = 0; k < vertlist->objects; k++) { + parypt = (point *) fastlookup(vertlist, k); + puninfect(*parypt); + } + caveshlist->restart(); + // Save this vertex list. + facetvertexlist->newindex((void **) &paryvertlist); + *paryvertlist = vertlist; + facetindex++; + } + subloop.sh = shellfacetraverse(subfaces); + } + + // All subfaces are infected. Uninfect them. + subfaces->traversalinit(); + subloop.sh = shellfacetraverse(subfaces); + while (subloop.sh != NULL) { + suninfect(subloop); + subloop.sh = shellfacetraverse(subfaces); + } + + if (b->verbose) { + printf(" Found %ld facets.\n", facetvertexlist->objects); + } + + idx2facetlist = new int[facetindex + 1]; + facetverticeslist = new point[totalvertices]; + + totalworkmemory += ((facetindex + 1) * sizeof(int) + + totalvertices * sizeof(point *)); + + idx2facetlist[0] = 0; + for (i = 0, k = 0; i < facetindex; i++) { + paryvertlist = (arraypool **) fastlookup(facetvertexlist, i); + vertlist = *paryvertlist; + idx2facetlist[i + 1] = (idx2facetlist[i] + (int) vertlist->objects); + for (j = 0; j < vertlist->objects; j++) { + parypt = (point *) fastlookup(vertlist, j); + facetverticeslist[k] = *parypt; + k++; + } + } + + // Free the lists. + for (i = 0; i < facetvertexlist->objects; i++) { + paryvertlist = (arraypool **) fastlookup(facetvertexlist, i); + vertlist = *paryvertlist; + delete vertlist; + } + delete facetvertexlist; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// Check whether two segments, or a segment and a facet, or two facets are // +// adjacent to each other. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::segsegadjacent(face *seg1, face *seg2) +{ + int segidx1 = getfacetindex(*seg1); + int segidx2 = getfacetindex(*seg2); + + if (segidx1 == segidx2) return 0; + + point pa1 = segmentendpointslist[segidx1 * 2]; + point pb1 = segmentendpointslist[segidx1 * 2 + 1]; + point pa2 = segmentendpointslist[segidx2 * 2]; + point pb2 = segmentendpointslist[segidx2 * 2 + 1]; + + if ((pa1 == pa2) || (pa1 == pb2) || (pb1 == pa2) || (pb1 == pb2)) { + return 1; + } + return 0; +} + +int tetgenmesh::segfacetadjacent(face *subseg, face *subsh) +{ + int segidx = getfacetindex(*subseg); + point pa = segmentendpointslist[segidx * 2]; + point pb = segmentendpointslist[segidx * 2 + 1]; + + pinfect(pa); + pinfect(pb); + + int fidx = getfacetindex(*subsh); + int count = 0, i; + + for (i = idx2facetlist[fidx]; i < idx2facetlist[fidx+1]; i++) { + if (pinfected(facetverticeslist[i])) count++; + } + + puninfect(pa); + puninfect(pb); + + return count == 1; +} + +int tetgenmesh::facetfacetadjacent(face *subsh1, face *subsh2) +{ + int count = 0, i; + + int fidx1 = getfacetindex(*subsh1); + int fidx2 = getfacetindex(*subsh2); + + if (fidx1 == fidx2) return 0; + + for (i = idx2facetlist[fidx1]; i < idx2facetlist[fidx1+1]; i++) { + pinfect(facetverticeslist[i]); + } + + for (i = idx2facetlist[fidx2]; i < idx2facetlist[fidx2+1]; i++) { + if (pinfected(facetverticeslist[i])) count++; + } + + // Uninfect the vertices. + for (i = idx2facetlist[fidx1]; i < idx2facetlist[fidx1+1]; i++) { + puninfect(facetverticeslist[i]); + } + + return count > 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// save_segmentpoint_insradius(), save_facetpoint_insradius() // +// // +// Determine and save the relaxed insertion radius of a Steiner point on a // +// segment or a facet. By default, it is the closet distance to the parent // +// point of this Steiner point. But may be larger than it. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::save_segmentpoint_insradius(point segpt,point parentpt,REAL r) +{ + REAL rv = r, rp; + if (pointtype(parentpt) == FREESEGVERTEX) { + face parentseg1, parentseg2; + sdecode(point2sh(segpt), parentseg1); + sdecode(point2sh(parentpt), parentseg2); + if (segsegadjacent(&parentseg1, &parentseg2)) { + rp = getpointinsradius(parentpt); + if (rv < rp) { + // The relaxed insertion radius of 'newpt'. + rv = rp; + } + } + } else if (pointtype(parentpt) == FREEFACETVERTEX) { + face parentseg, parentsh; + sdecode(point2sh(segpt), parentseg); + sdecode(point2sh(parentpt), parentsh); + if (segfacetadjacent(&parentseg, &parentsh)) { + rp = getpointinsradius(parentpt); + if ((sqrt(2.0) * rv) < rp) { // if (rv < rp) { + // The relaxed insertion radius of 'newpt'. + rv = rp / sqrt(2.0); // rv = rp; + } + } + } + setpointinsradius(segpt, rv); +} + +void tetgenmesh::save_facetpoint_insradius(point facpt,point parentpt,REAL r) +{ + REAL rv = r, rp; + if (pointtype(parentpt) == FREESEGVERTEX) { + face parentseg, parentsh; + sdecode(point2sh(parentpt), parentseg); + sdecode(point2sh(facpt), parentsh); + if (segfacetadjacent(&parentseg, &parentsh)) { + rp = getpointinsradius(parentpt); + if (rv < (sqrt(2.0) * rp)) { + rv = sqrt(2.0) * rp; // The relaxed insertion radius of 'newpt'. + } + } + } else if (pointtype(parentpt) == FREEFACETVERTEX) { + face parentsh1, parentsh2; + sdecode(point2sh(parentpt), parentsh1); + sdecode(point2sh(facpt), parentsh2); + if (facetfacetadjacent(&parentsh1, &parentsh2)) { + rp = getpointinsradius(parentpt); + if (rv < rp) { + rv = rp; // The relaxed insertion radius of 'newpt'. + } + } + } + setpointinsradius(facpt, rv); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// enqueuesubface() Queue a subface or a subsegment for encroachment chk. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::enqueuesubface(memorypool *pool, face *chkface) +{ + if (!smarktest2ed(*chkface)) { + smarktest2(*chkface); // Only queue it once. + face *queface = (face *) pool->alloc(); + *queface = *chkface; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// enqueuetetrahedron() Queue a tetrahedron for quality check. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::enqueuetetrahedron(triface *chktet) +{ + if (!marktest2ed(*chktet)) { + marktest2(*chktet); // Only queue it once. + triface *quetet = (triface *) badtetrahedrons->alloc(); + *quetet = *chktet; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// checkseg4encroach() Check if an edge is encroached upon by a point. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checkseg4encroach(point pa, point pb, point checkpt) +{ + // Check if the point lies inside the diametrical sphere of this seg. + REAL v1[3], v2[3]; + + v1[0] = pa[0] - checkpt[0]; + v1[1] = pa[1] - checkpt[1]; + v1[2] = pa[2] - checkpt[2]; + v2[0] = pb[0] - checkpt[0]; + v2[1] = pb[1] - checkpt[1]; + v2[2] = pb[2] - checkpt[2]; + + if (dot(v1, v2) < 0) { + // Inside. + if (b->metric) { // -m option. + if ((pa[pointmtrindex] > 0) && (pb[pointmtrindex] > 0)) { + // The projection of 'checkpt' lies inside the segment [a,b]. + REAL prjpt[3], u, v, t; + projpt2edge(checkpt, pa, pb, prjpt); + // Interoplate the mesh size at the location 'prjpt'. + u = distance(pa, pb); + v = distance(pa, prjpt); + t = v / u; + // 'u' is the mesh size at 'prjpt' + u = pa[pointmtrindex] + t * (pb[pointmtrindex] - pa[pointmtrindex]); + v = distance(checkpt, prjpt); + if (v < u) { + return 1; // Encroached prot-ball! + } + } else { + return 1; // NO protecting ball. Encroached. + } + } else { + return 1; // Inside! Encroached. + } + } + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// checkseg4split() Check if we need to split a segment. // +// // +// A segment needs to be split if it is in the following case: // +// (1) It is encroached by an existing vertex. // +// (2) It has bad quality (too long). // +// (3) Its length is larger than the mesh sizes at its endpoints. // +// // +// Return 1 if it needs to be split, otherwise, return 0. 'pencpt' returns // +// an encroaching point if there exists. 'qflag' returns '1' if the segment // +// has a length larger than the desired edge length. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checkseg4split(face *chkseg, point& encpt, int& qflag) +{ + REAL ccent[3], len, r; + int i; + + point forg = sorg(*chkseg); + point fdest = sdest(*chkseg); + + // Initialize the return values. + encpt = NULL; + qflag = 0; + + len = distance(forg, fdest); + r = 0.5 * len; + for (i = 0; i < 3; i++) { + ccent[i] = 0.5 * (forg[i] + fdest[i]); + } + + // First check its quality. + if (checkconstraints && (areabound(*chkseg) > 0.0)) { + if (len > areabound(*chkseg)) { + qflag = 1; + return 1; + } + } + + if (b->fixedvolume) { + if ((len * len * len) > b->maxvolume) { + qflag = 1; + return 1; + } + } + + if (b->metric) { // -m option. Check mesh size. + // Check if the ccent lies outside one of the prot.balls at vertices. + if (((forg[pointmtrindex] > 0) && (r > forg[pointmtrindex])) || + ((fdest[pointmtrindex]) > 0 && (r > fdest[pointmtrindex]))) { + qflag = 1; // Enforce mesh size. + return 1; + } + } + + + // Second check if it is encroached. + // Comment: There may exist more than one encroaching points of this segment. + // The 'encpt' returns the one which is closet to it. + triface searchtet, spintet; + point eapex; + REAL d, diff, smdist = 0; + int t1ver; + + sstpivot1(*chkseg, searchtet); + spintet = searchtet; + while (1) { + eapex = apex(spintet); + if (eapex != dummypoint) { + d = distance(ccent, eapex); + diff = d - r; + if (fabs(diff) / r < b->epsilon) diff = 0.0; // Rounding. + if (diff < 0) { + // This segment is encroached by eapex. + if (useinsertradius) { + if (encpt == NULL) { + encpt = eapex; + smdist = d; + } else { + // Choose the closet encroaching point. + if (d < smdist) { + encpt = eapex; + smdist = d; + } + } + } else { + encpt = eapex; + break; + } + } + } + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } // while (1) + + if (encpt != NULL) { + return 1; + } + + return 0; // No need to split it. +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// splitsegment() Split a segment. // +// // +// The segment 'splitseg' is intended to be split. It will be split if it // +// is in one of the following cases: // +// (1) It is encroached by an existing vertex 'encpt != NULL'; or // +// (2) It is in bad quality 'qflag == 1'; or // +// (3) Its length is larger than the mesh sizes at its endpoints. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::splitsegment(face *splitseg, point encpt, REAL rrp, + point encpt1, point encpt2, int qflag, + int chkencflag) +{ + + if (!qflag && smarktest3ed(*splitseg)) { + // Do not try to re-split a marked segment. + return 0; + } + + if (b->nobisect) { // With -Y option. + // Only split this segment if it is allowed to be split. + if (checkconstraints) { + // Check if it has a non-zero length bound. + if (areabound(*splitseg) == 0) { + // It is not allowed. However, if all of facets containing this seg + // is allowed to be split, we still split it. + face parentsh, spinsh; + //splitseg.shver = 0; + spivot(*splitseg, parentsh); + if (parentsh.sh == NULL) { + return 0; // A dangling segment. Do not split it. + } + spinsh = parentsh; + while (1) { + if (areabound(spinsh) == 0) break; + spivotself(spinsh); + if (spinsh.sh == parentsh.sh) break; + if (spinsh.sh == NULL) break; // It belongs to only one facet. + } + if ((!spinsh.sh) || (areabound(spinsh) == 0)) { + // All facets at this seg are not allowed to be split. + return 0; // Do not split it. + } + } + } else { + return 0; // Do not split this segment. + } + } // if (b->nobisect) + + triface searchtet; + face searchsh; + point newpt; + insertvertexflags ivf; + + makepoint(&newpt, FREESEGVERTEX); + getsteinerptonsegment(splitseg, encpt, newpt); + + if (!qflag && !b->cdtrefine) { + // Do not insert the point if it encroaches upon an adjacent segment. + face parentsh; + spivot(*splitseg, parentsh); + if (parentsh.sh != NULL) { + face spinsh, neighsh; + face neighseg; + spinsh = parentsh; + while (1) { + for (int i = 0; i < 2; i++) { + if (i == 0) { + senext(spinsh, neighsh); + } else { + senext2(spinsh, neighsh); + } + if (isshsubseg(neighsh)) { + sspivot(neighsh, neighseg); + if (checkseg4encroach(sorg(neighseg), sdest(neighseg), newpt)) { + pointdealloc(newpt); + return 0; // Do not split this segment. + } + } + } // i + spivotself(spinsh); + if (spinsh.sh == NULL) break; + if (spinsh.sh == parentsh.sh) break; + } // while (1) + } + } + + // Split the segment by the Bowyer-Watson algorithm. + sstpivot1(*splitseg, searchtet); + ivf.iloc = (int) ONEDGE; + ivf.bowywat = 3; // Use Bowyer-Watson, preserve subsegments and subfaces; + ivf.validflag = 1; // Validate the B-W cavity. + ivf.lawson = 2; // Do flips to recover Delaunayness. + ivf.rejflag = 0; // Do not check encroachment of new segments/facets. + if (b->metric) { + ivf.rejflag |= 4; // Do check encroachment of protecting balls. + } + ivf.chkencflag = chkencflag; + ivf.sloc = (int) INSTAR; // ivf.iloc; + ivf.sbowywat = 3; // ivf.bowywat; // Surface mesh options. + ivf.splitbdflag = 1; + ivf.respectbdflag = 1; + ivf.assignmeshsize = b->metric; + ivf.smlenflag = useinsertradius; // Return the closet mesh vertex. + + + if (insertpoint(newpt, &searchtet, &searchsh, splitseg, &ivf)) { + st_segref_count++; + if (steinerleft > 0) steinerleft--; + if (useinsertradius) { + save_segmentpoint_insradius(newpt, ivf.parentpt, ivf.smlen); + } + if (flipstack != NULL) { + flipconstraints fc; + fc.chkencflag = chkencflag; + fc.enqflag = 2; + lawsonflip3d(&fc); + unflipqueue->restart(); + } + return 1; + } else { + // Point is not inserted. + if (ivf.iloc == (int) NEARVERTEX) { + terminatetetgen(this, 2); + } + pointdealloc(newpt); + // Mark this segment to avoid splitting in the future. + smarktest3(*splitseg); + return 0; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// repairencsegs() Repair encroached (sub) segments. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::repairencsegs(int chkencflag) +{ + face *bface; + point encpt = NULL; + int qflag = 0; + + // Loop until the pool 'badsubsegs' is empty. Note that steinerleft == -1 + // if an unlimited number of Steiner points is allowed. + while ((badsubsegs->items > 0) && (steinerleft != 0)) { + badsubsegs->traversalinit(); + bface = (face *) badsubsegs->traverse(); + while ((bface != NULL) && (steinerleft != 0)) { + // Skip a deleleted element. + if (bface->shver >= 0) { + // A queued segment may have been deleted (split). + if ((bface->sh != NULL) && (bface->sh[3] != NULL)) { + // A queued segment may have been processed. + if (smarktest2ed(*bface)) { + sunmarktest2(*bface); + if (checkseg4split(bface, encpt, qflag)) { + splitsegment(bface, encpt, 0, NULL, NULL, qflag, chkencflag); + } + } + } + // Remove this entry from list. + bface->shver = -1; // Signal it as a deleted element. + badsubsegs->dealloc((void *) bface); + } + bface = (face *) badsubsegs->traverse(); + } + } + + if (badsubsegs->items > 0) { + if (b->verbose) { + printf("The desired number of Steiner points is reached.\n"); + } + badsubsegs->traversalinit(); + bface = (face *) badsubsegs->traverse(); + while (bface != NULL) { + // Skip a deleleted element. + if (bface->shver >= 0) { + if ((bface->sh != NULL) && (bface->sh[3] != NULL)) { + if (smarktest2ed(*bface)) { + sunmarktest2(*bface); + } + } + } + bface = (face *) badsubsegs->traverse(); + } + badsubsegs->restart(); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// checkfac4encroach() Check if a subface is encroached by a point. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checkfac4encroach(point pa, point pb, point pc, point checkpt, + REAL* cent, REAL* r) +{ + REAL rd, len; + int encroached = 0; + + circumsphere(pa, pb, pc, NULL, cent, &rd); + if (rd == 0) { + terminatetetgen(this, 2); + } + + if (b->use_equatorial_lens) { + REAL normal[3], fcenter[3]; + REAL xta, yta, zta; + REAL multiplier; + + fcenter[0] = cent[0] - pc[0]; + fcenter[1] = cent[1] - pc[1]; + fcenter[2] = cent[2] - pc[2]; + + // Get the normal of the oriented face [a->b->c], without normalized. + facenormal(pa, pb, pc, normal, 1, NULL); + multiplier = 0.985 * sqrt((fcenter[0]*fcenter[0] + fcenter[1]*fcenter[1] + + fcenter[2]*fcenter[2]) / + (3.0 * (normal[0] * normal[0] + normal[1] * normal[1] + + normal[2] * normal[2]))); + xta = checkpt[0] - pc[0]; + yta = checkpt[1] - pc[1]; + zta = checkpt[2] - pc[2]; + // Make sure that the normal is pointing to "checkpt". + if ((xta * normal[0] + yta * normal[1] + zta * normal[2]) < 0) { + // Reverse the normal direction. + normal[0] = -normal[0]; + normal[1] = -normal[1]; + normal[2] = -normal[2]; + } + + if (xta * xta + yta * yta + zta * zta <= + 2.0 * (xta * (fcenter[0] - multiplier * normal[0]) + + yta * (fcenter[1] - multiplier * normal[1]) + + zta * (fcenter[2] - multiplier * normal[2]))) { + encroached = 1; + } + } else { + len = distance(cent, checkpt); + if ((fabs(len - rd) / rd) < b->epsilon) len = rd; // Rounding. + if (len < rd) { + encroached = 1; + } + } + + if (encroached) { + // The point lies inside the circumsphere of this face. + if (b->metric) { // -m option. + if ((pa[pointmtrindex] > 0) && (pb[pointmtrindex] > 0) && + (pc[pointmtrindex] > 0)) { + // Get the projection of 'checkpt' in the plane of pa, pb, and pc. + REAL prjpt[3], n[3]; + REAL a, a1, a2, a3; + projpt2face(checkpt, pa, pb, pc, prjpt); + // Get the face area of [a,b,c]. + facenormal(pa, pb, pc, n, 1, NULL); + a = sqrt(dot(n,n)); + // Get the face areas of [a,b,p], [b,c,p], and [c,a,p]. + facenormal(pa, pb, prjpt, n, 1, NULL); + a1 = sqrt(dot(n,n)); + facenormal(pb, pc, prjpt, n, 1, NULL); + a2 = sqrt(dot(n,n)); + facenormal(pc, pa, prjpt, n, 1, NULL); + a3 = sqrt(dot(n,n)); + if ((fabs(a1 + a2 + a3 - a) / a) < b->epsilon) { + // This face contains the projection. + // Get the mesh size at the location of the projection point. + rd = a1 / a * pc[pointmtrindex] + + a2 / a * pa[pointmtrindex] + + a3 / a * pb[pointmtrindex]; + len = distance(prjpt, checkpt); + if (len < rd) { + return 1; // Encroached. + } + } + } else { + return 1; // No protecting ball. Encroached. + } + } else { + *r = rd; + return 1; // Encroached. + } + } + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// checkfac4split() Check if a subface needs to be split. // +// // +// A subface needs to be split if it is in the following case: // +// (1) It is encroached by an existing vertex. // +// (2) It has bad quality (has a small angle, -q). // +// (3) It's area is larger than a prescribed value (.var). // +// // +// Return 1 if it needs to be split, otherwise, return 0. // +// 'chkfac' represents its longest edge. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checkfac4split(face *chkfac, point& encpt, int& qflag, + REAL *cent) +{ + point pa, pb, pc; + REAL area, rd, len; + REAL A[4][4], rhs[4], D; + int indx[4]; + int i; + + encpt = NULL; + qflag = 0; + + pa = sorg(*chkfac); + pb = sdest(*chkfac); + pc = sapex(*chkfac); + + // Compute the coefficient matrix A (3x3). + A[0][0] = pb[0] - pa[0]; + A[0][1] = pb[1] - pa[1]; + A[0][2] = pb[2] - pa[2]; // vector V1 (pa->pb) + A[1][0] = pc[0] - pa[0]; + A[1][1] = pc[1] - pa[1]; + A[1][2] = pc[2] - pa[2]; // vector V2 (pa->pc) + cross(A[0], A[1], A[2]); // vector V3 (V1 X V2) + + area = 0.5 * sqrt(dot(A[2], A[2])); // The area of [a,b,c]. + + // Compute the right hand side vector b (3x1). + rhs[0] = 0.5 * dot(A[0], A[0]); // edge [a,b] + rhs[1] = 0.5 * dot(A[1], A[1]); // edge [a,c] + rhs[2] = 0.0; + + // Solve the 3 by 3 equations use LU decomposition with partial + // pivoting and backward and forward substitute. + if (!lu_decmp(A, 3, indx, &D, 0)) { + // A degenerate triangle. + terminatetetgen(this, 2); + } + + lu_solve(A, 3, indx, rhs, 0); + cent[0] = pa[0] + rhs[0]; + cent[1] = pa[1] + rhs[1]; + cent[2] = pa[2] + rhs[2]; + rd = sqrt(rhs[0] * rhs[0] + rhs[1] * rhs[1] + rhs[2] * rhs[2]); + + if (checkconstraints && (areabound(*chkfac) > 0.0)) { + // Check if the subface has too big area. + if (area > areabound(*chkfac)) { + qflag = 1; + return 1; + } + } + + if (b->fixedvolume) { + if ((area * sqrt(area)) > b->maxvolume) { + qflag = 1; + return 1; + } + } + + if (b->varvolume) { + triface adjtet; + REAL volbnd; + int t1ver; + + stpivot(*chkfac, adjtet); + if (!ishulltet(adjtet)) { + volbnd = volumebound(adjtet.tet); + if ((volbnd > 0) && (area * sqrt(area)) > volbnd) { + qflag = 1; + return 1; + } + } + fsymself(adjtet); + if (!ishulltet(adjtet)) { + volbnd = volumebound(adjtet.tet); + if ((volbnd > 0) && (area * sqrt(area)) > volbnd) { + qflag = 1; + return 1; + } + } + } + + if (b->metric) { // -m option. Check mesh size. + // Check if the ccent lies outside one of the prot.balls at vertices. + if (((pa[pointmtrindex] > 0) && (rd > pa[pointmtrindex])) || + ((pb[pointmtrindex] > 0) && (rd > pb[pointmtrindex])) || + ((pc[pointmtrindex] > 0) && (rd > pc[pointmtrindex]))) { + qflag = 1; // Enforce mesh size. + return 1; + } + } + + triface searchtet; + REAL smlen = 0; + + // Check if this subface is locally encroached. + for (i = 0; i < 2; i++) { + stpivot(*chkfac, searchtet); + if (!ishulltet(searchtet)) { + int encroached = 0; + + len = distance(oppo(searchtet), cent); + if ((fabs(len - rd) / rd) < b->epsilon) len = rd;// Rounding. + + if (b->use_equatorial_lens) { + point tettapex = oppo(searchtet); + REAL normal[3], fcenter[3]; + REAL xta, yta, zta; + REAL multiplier; + // Get the normal of the oriented face [a->b->c], without normalized. + point fa = org(searchtet); + point fb = dest(searchtet); + point fc = apex(searchtet); + + fcenter[0] = cent[0] - fc[0]; + fcenter[1] = cent[1] - fc[1]; + fcenter[2] = cent[2] - fc[2]; + + facenormal(fa, fb, fc, normal, 1, NULL); + multiplier = 0.985 * sqrt((fcenter[0]*fcenter[0] + fcenter[1]*fcenter[1] + + fcenter[2]*fcenter[2]) / + (3.0 * (normal[0] * normal[0] + normal[1] * normal[1] + + normal[2] * normal[2]))); + xta = tettapex[0] - fc[0]; + yta = tettapex[1] - fc[1]; + zta = tettapex[2] - fc[2]; + if (xta * xta + yta * yta + zta * zta <= + 2.0 * (xta * (fcenter[0] - multiplier * normal[0]) + + yta * (fcenter[1] - multiplier * normal[1]) + + zta * (fcenter[2] - multiplier * normal[2]))) { + encroached = 1; + } + } else { + if (len < rd) { + encroached = 1; + } + } + + if (encroached) { + if (smlen == 0) { + smlen = len; + encpt = oppo(searchtet); + } else { + if (len < smlen) { + smlen = len; + encpt = oppo(searchtet); + } + } + //return 1; + } + } + sesymself(*chkfac); + } + + return encpt != NULL; //return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// splitsubface() Split a subface. // +// // +// The subface may be encroached, or in bad-quality. It is split at its cir- // +// cumcenter ('ccent'). Do not split it if 'ccent' encroaches upon any seg- // +// ment. Instead, one of the encroached segments is split. It is possible // +// that none of the encroached segments can be split. // +// // +// The return value indicates whether a new point is inserted (> 0) or not // +// (= 0). Furthermore, it is inserted on an encroached segment (= 1) or // +// in-side the facet (= 2). // +// // +// 'encpt' is a vertex encroaching upon this subface, i.e., it causes the // +// split of this subface. If 'encpt' is NULL, then the cause of the split // +// this subface is a rejected tet circumcenter 'p', and 'encpt1' is the // +// parent of 'p'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::splitsubface(face *splitfac, point encpt, point encpt1, + int qflag, REAL *ccent, int chkencflag) +{ + + if (!qflag && smarktest3ed(*splitfac)) { + // Do not try to re-split a marked subface. + return 0; + } + + if (b->nobisect) { // With -Y option. + if (checkconstraints) { + // Only split if it is allowed to be split. + // Check if this facet has a non-zero constraint. + if (areabound(*splitfac) == 0) { + return 0; // Do not split it. + } + } else { + return 0; + } + } // if (b->nobisect) + + if (useinsertradius) { + if (encpt != NULL) { + REAL rp; // Insertion radius of newpt. + REAL rv = distance(encpt, ccent); + if (pointtype(encpt) == FREESEGVERTEX) { + face parentseg; + sdecode(point2sh(encpt), parentseg); + if (segfacetadjacent(&parentseg, splitfac)) { + rp = getpointinsradius(encpt); + if (rv < (sqrt(2.0) * rp)) { + // This insertion may cause no termination. + return 0; // Reject the insertion of newpt. + } + } + } else if (pointtype(encpt) == FREEFACETVERTEX) { + face parentsh; + sdecode(point2sh(encpt), parentsh); + if (facetfacetadjacent(&parentsh, splitfac)) { + rp = getpointinsradius(encpt); + if (rv < rp) { + return 0; // Reject the insertion of newpt. + } + } + } + } + } // if (useinsertradius) + + face searchsh; + insertvertexflags ivf; + point newpt; + int i; + + // Initialize the inserting point. + makepoint(&newpt, FREEFACETVERTEX); + // Split the subface at its circumcenter. + for (i = 0; i < 3; i++) newpt[i] = ccent[i]; + + // Search a subface which contains 'newpt'. + searchsh = *splitfac; + // Calculate an above point. It lies above the plane containing + // the subface [a,b,c], and save it in dummypoint. Moreover, + // the vector cent->dummypoint is the normal of the plane. + calculateabovepoint4(newpt, sorg(*splitfac), sdest(*splitfac), + sapex(*splitfac)); + // Parameters: 'aflag' = 1, - above point exists. + // 'cflag' = 0, - non-convex, check co-planarity of the result. + // 'rflag' = 0, - no need to round the locating result. + ivf.iloc = (int) slocate(newpt, &searchsh, 1, 0, 0); + + if (!((ivf.iloc == (int) ONFACE) || (ivf.iloc == (int) ONEDGE))) { + // Point location failed. + pointdealloc(newpt); + // Mark this subface to avoid splitting in the future. + smarktest3(*splitfac); + return 0; + } + + + triface searchtet; + + // Insert the point. + stpivot(searchsh, searchtet); + ivf.bowywat = 3; // Use Bowyer-Watson. Preserve subsegments and subfaces; + ivf.lawson = 2; + ivf.rejflag = 1; // Do check the encroachment of segments. + if (b->metric) { + ivf.rejflag |= 4; // Do check encroachment of protecting balls. + } + ivf.chkencflag = chkencflag; + ivf.sloc = (int) INSTAR; // ivf.iloc; + ivf.sbowywat = 3; // ivf.bowywat; + ivf.splitbdflag = 1; + ivf.validflag = 1; + ivf.respectbdflag = 1; + ivf.assignmeshsize = b->metric; + ivf.refineflag = 2; + ivf.refinesh = *splitfac; + ivf.smlenflag = useinsertradius; // Update the insertion radius. + + + if (insertpoint(newpt, &searchtet, &searchsh, NULL, &ivf)) { + st_facref_count++; + if (steinerleft > 0) steinerleft--; + if (useinsertradius) { + save_facetpoint_insradius(newpt, ivf.parentpt, ivf.smlen); + } // if (useinsertradius) + if (flipstack != NULL) { + flipconstraints fc; + fc.chkencflag = chkencflag; + fc.enqflag = 2; + lawsonflip3d(&fc); + unflipqueue->restart(); + } + return 1; + } else { + // Point was not inserted. + pointdealloc(newpt); + if (ivf.iloc == (int) ENCSEGMENT) { + // Select an encroached segment and split it. + face *paryseg; + int splitflag = 0; + for (i = 0; i < encseglist->objects; i++) { + paryseg = (face *) fastlookup(encseglist, i); + if (splitsegment(paryseg, NULL, 0.0, encpt, encpt1, qflag, + chkencflag | 1)) { + splitflag = 1; // A point is inserted on a segment. + break; + } + } // i + encseglist->restart(); + if (splitflag) { + // Some segments may need to be repaired. + if (badsubsegs->items > 0) { + repairencsegs(chkencflag | 1); + } + return 1; + } + } else { + if (ivf.iloc == (int) NEARVERTEX) { + terminatetetgen(this, 2); + } + } + // Mark this subface to avoid splitting in the future. + smarktest3(*splitfac); + return 0; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// repairencfacs() Repair encroached subfaces. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::repairencfacs(int chkencflag) +{ + face *bface; + point encpt = NULL; + int qflag = 0; + REAL ccent[3]; + + // Loop until the pool 'badsubfacs' is empty. Note that steinerleft == -1 + // if an unlimited number of Steiner points is allowed. + while ((badsubfacs->items > 0) && (steinerleft != 0)) { + badsubfacs->traversalinit(); + bface = (face *) badsubfacs->traverse(); + while ((bface != NULL) && (steinerleft != 0)) { + // Skip a deleted element. + if (bface->shver >= 0) { + // A queued subface may have been deleted (split). + if ((bface->sh != NULL) && (bface->sh[3] != NULL)) { + // A queued subface may have been processed. + if (smarktest2ed(*bface)) { + sunmarktest2(*bface); + if (checkfac4split(bface, encpt, qflag, ccent)) { + splitsubface(bface, encpt, NULL, qflag, ccent, chkencflag); + } + } + } + bface->shver = -1; // Signal it as a deleted element. + badsubfacs->dealloc((void *) bface); // Remove this entry from list. + } + bface = (face *) badsubfacs->traverse(); + } + } + + if (badsubfacs->items > 0) { + if (steinerleft == 0) { + if (b->verbose) { + printf("The desired number of Steiner points is reached.\n"); + } + } else { + terminatetetgen(this, 2); + } + badsubfacs->traversalinit(); + bface = (face *) badsubfacs->traverse(); + while (bface != NULL) { + // Skip a deleted element. + if (bface->shver >= 0) { + if ((bface->sh != NULL) && (bface->sh[3] != NULL)) { + if (smarktest2ed(*bface)) { + sunmarktest2(*bface); + } + } + } + bface = (face *) badsubfacs->traverse(); + } + badsubfacs->restart(); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// checktet4split() Check if the tet needs to be split. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checktet4split(triface *chktet, int &qflag, REAL *ccent) +{ + point pa, pb, pc, pd, *ppt; + REAL vda[3], vdb[3], vdc[3]; + REAL vab[3], vbc[3], vca[3]; + REAL N[4][3], L[4], cosd[6], elen[6]; + REAL maxcosd, vol, volbnd, smlen = 0, rd; + REAL A[4][4], rhs[4], D; + int indx[4]; + int i, j; + + if (b->convex) { // -c + // Skip this tet if it lies in the exterior. + if (elemattribute(chktet->tet, numelemattrib - 1) == -1.0) { + return 0; + } + } + + qflag = 0; + + pd = (point) chktet->tet[7]; + if (pd == dummypoint) { + return 0; // Do not split a hull tet. + } + + pa = (point) chktet->tet[4]; + pb = (point) chktet->tet[5]; + pc = (point) chktet->tet[6]; + + // Get the edge vectors vda: d->a, vdb: d->b, vdc: d->c. + // Set the matrix A = [vda, vdb, vdc]^T. + for (i = 0; i < 3; i++) A[0][i] = vda[i] = pa[i] - pd[i]; + for (i = 0; i < 3; i++) A[1][i] = vdb[i] = pb[i] - pd[i]; + for (i = 0; i < 3; i++) A[2][i] = vdc[i] = pc[i] - pd[i]; + + // Get the other edge vectors. + for (i = 0; i < 3; i++) vab[i] = pb[i] - pa[i]; + for (i = 0; i < 3; i++) vbc[i] = pc[i] - pb[i]; + for (i = 0; i < 3; i++) vca[i] = pa[i] - pc[i]; + + if (!lu_decmp(A, 3, indx, &D, 0)) { + // A degenerated tet (vol = 0). + // This is possible due to the use of exact arithmetic. We temporarily + // leave this tet. It should be fixed by mesh optimization. + return 0; + } + + // Check volume if '-a#' and '-a' options are used. + if (b->varvolume || b->fixedvolume) { + vol = fabs(A[indx[0]][0] * A[indx[1]][1] * A[indx[2]][2]) / 6.0; + if (b->fixedvolume) { + if (vol > b->maxvolume) { + qflag = 1; + } + } + if (!qflag && b->varvolume) { + volbnd = volumebound(chktet->tet); + if ((volbnd > 0.0) && (vol > volbnd)) { + qflag = 1; + } + } + if (qflag == 1) { + // Calculate the circumcenter of this tet. + rhs[0] = 0.5 * dot(vda, vda); + rhs[1] = 0.5 * dot(vdb, vdb); + rhs[2] = 0.5 * dot(vdc, vdc); + lu_solve(A, 3, indx, rhs, 0); + for (i = 0; i < 3; i++) ccent[i] = pd[i] + rhs[i]; + return 1; + } + } + + if (b->metric) { // -m option. Check mesh size. + // Calculate the circumradius of this tet. + rhs[0] = 0.5 * dot(vda, vda); + rhs[1] = 0.5 * dot(vdb, vdb); + rhs[2] = 0.5 * dot(vdc, vdc); + lu_solve(A, 3, indx, rhs, 0); + for (i = 0; i < 3; i++) ccent[i] = pd[i] + rhs[i]; + rd = sqrt(dot(rhs, rhs)); + // Check if the ccent lies outside one of the prot.balls at vertices. + ppt = (point *) &(chktet->tet[4]); + for (i = 0; i < 4; i++) { + if (ppt[i][pointmtrindex] > 0) { + if (rd > ppt[i][pointmtrindex]) { + qflag = 1; // Enforce mesh size. + return 1; + } + } + } + } + + if (in->tetunsuitable != NULL) { + // Execute the user-defined meshing sizing evaluation. + if ((*(in->tetunsuitable))(pa, pb, pc, pd, NULL, 0)) { + // Calculate the circumcenter of this tet. + rhs[0] = 0.5 * dot(vda, vda); + rhs[1] = 0.5 * dot(vdb, vdb); + rhs[2] = 0.5 * dot(vdc, vdc); + lu_solve(A, 3, indx, rhs, 0); + for (i = 0; i < 3; i++) ccent[i] = pd[i] + rhs[i]; + return 1; + } + } + + if (useinsertradius) { + // Do not split this tet if the shortest edge is shorter than the + // insertion radius of one of its endpoints. + triface checkedge; + point e1, e2; + REAL rrv, smrrv; + + // Get the shortest edge of this tet. + checkedge.tet = chktet->tet; + for (i = 0; i < 6; i++) { + checkedge.ver = edge2ver[i]; + e1 = org(checkedge); + e2 = dest(checkedge); + elen[i] = distance(e1, e2); + if (i == 0) { + smlen = elen[i]; + j = 0; + } else { + if (elen[i] < smlen) { + smlen = elen[i]; + j = i; + } + } + } + // Check if the edge is too short. + checkedge.ver = edge2ver[j]; + // Get the smallest rrv of e1 and e2. + // Note: if rrv of e1 and e2 is zero. Do not use it. + e1 = org(checkedge); + smrrv = getpointinsradius(e1); + e2 = dest(checkedge); + rrv = getpointinsradius(e2); + if (rrv > 0) { + if (smrrv > 0) { + if (rrv < smrrv) { + smrrv = rrv; + } + } else { + smrrv = rrv; + } + } + if (smrrv > 0) { + // To avoid rounding error, round smrrv before doing comparison. + if ((fabs(smrrv - smlen) / smlen) < b->epsilon) { + smrrv = smlen; + } + if (smrrv > smlen) { + return 0; + } + } + } // if (useinsertradius) + + // Check the radius-edge ratio. Set by -q#. + if (b->minratio > 0) { + // Calculate the circumcenter and radius of this tet. + rhs[0] = 0.5 * dot(vda, vda); + rhs[1] = 0.5 * dot(vdb, vdb); + rhs[2] = 0.5 * dot(vdc, vdc); + lu_solve(A, 3, indx, rhs, 0); + for (i = 0; i < 3; i++) ccent[i] = pd[i] + rhs[i]; + rd = sqrt(dot(rhs, rhs)); + if (!useinsertradius) { + // Calculate the shortest edge length. + elen[0] = dot(vda, vda); + elen[1] = dot(vdb, vdb); + elen[2] = dot(vdc, vdc); + elen[3] = dot(vab, vab); + elen[4] = dot(vbc, vbc); + elen[5] = dot(vca, vca); + smlen = elen[0]; //sidx = 0; + for (i = 1; i < 6; i++) { + if (smlen > elen[i]) { + smlen = elen[i]; //sidx = i; + } + } + smlen = sqrt(smlen); + } + D = rd / smlen; + if (D > b->minratio) { + // A bad radius-edge ratio. + return 1; + } + } + + // Check the minimum dihedral angle. Set by -qq#. + if (b->mindihedral > 0) { + // Compute the 4 face normals (N[0], ..., N[3]). + for (j = 0; j < 3; j++) { + for (i = 0; i < 3; i++) N[j][i] = 0.0; + N[j][j] = 1.0; // Positive means the inside direction + lu_solve(A, 3, indx, N[j], 0); + } + for (i = 0; i < 3; i++) N[3][i] = - N[0][i] - N[1][i] - N[2][i]; + // Normalize the normals. + for (i = 0; i < 4; i++) { + L[i] = sqrt(dot(N[i], N[i])); + if (L[i] == 0) { + terminatetetgen(this, 2); + } + for (j = 0; j < 3; j++) N[i][j] /= L[i]; + } + // Calculate the six dihedral angles. + cosd[0] = -dot(N[0], N[1]); // Edge cd, bd, bc. + cosd[1] = -dot(N[0], N[2]); + cosd[2] = -dot(N[0], N[3]); + cosd[3] = -dot(N[1], N[2]); // Edge ad, ac + cosd[4] = -dot(N[1], N[3]); + cosd[5] = -dot(N[2], N[3]); // Edge ab + // Get the smallest dihedral angle. + //maxcosd = mincosd = cosd[0]; + maxcosd = cosd[0]; + for (i = 1; i < 6; i++) { + //if (cosd[i] > maxcosd) maxcosd = cosd[i]; + maxcosd = (cosd[i] > maxcosd ? cosd[i] : maxcosd); + //mincosd = (cosd[i] < mincosd ? cosd[i] : maxcosd); + } + if (maxcosd > cosmindihed) { + // Calculate the circumcenter of this tet. + // A bad dihedral angle. + //if ((b->quality & 1) == 0) { + rhs[0] = 0.5 * dot(vda, vda); + rhs[1] = 0.5 * dot(vdb, vdb); + rhs[2] = 0.5 * dot(vdc, vdc); + lu_solve(A, 3, indx, rhs, 0); + for (i = 0; i < 3; i++) ccent[i] = pd[i] + rhs[i]; + //*rd = sqrt(dot(rhs, rhs)); + //} + return 1; + } + } + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// splittetrahedron() Split a tetrahedron. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::splittetrahedron(triface* splittet, int qflag, REAL *ccent, + int chkencflag) +{ + triface searchtet; + face *paryseg; + point newpt, *ppt; + badface *bface; + insertvertexflags ivf; + int splitflag = 0; + int i; + + + + REAL rv = 0.; // Insertion radius of 'newpt'. + + makepoint(&newpt, FREEVOLVERTEX); + for (i = 0; i < 3; i++) newpt[i] = ccent[i]; + + + // Locate the new point. Starting from an interior point 'q' of the + // splittet. We perform a walk from q to the 'newpt', stop walking + // either we hit a subface or enter OUTSIDE. + searchtet = *splittet; + ivf.iloc = (int) OUTSIDE; + ivf.iloc = locate(newpt, &searchtet, 1); // 'chkencflag' = 1. + + if ((ivf.iloc == (int) OUTSIDE) || (ivf.iloc == (int) ENCSUBFACE)) { + // The circumcenter 'c' is not visible from 'q' (the interior of the tet). +// iffalse + if (b->verbose > 2) { + printf(" New point %d is blocked by a polygon.\n", pointmark(newpt)); + } +// \fi + pointdealloc(newpt); // Do not insert this vertex. + if (b->nobisect) return 0; // -Y option. + // There must be a polygon that blocks the visibility. + // Search a subpolygon that contains the proj(c). + face searchsh; + REAL prjpt[3]; + locateresult sloc = OUTSIDE; + tspivot(searchtet, searchsh); + ppt = (point *) &(searchsh.sh[3]); + projpt2face(ccent, ppt[0], ppt[1], ppt[2], prjpt); + // Locate proj(c) on polygon. + sloc = slocate(prjpt, &searchsh, 0, 0, 1); + if ((sloc == ONEDGE) || (sloc == ONFACE)) { + // Found a subface/edge containing proj(c). + // Check if 'c' encoraches upon this subface. + REAL fcent[3], r = 0; + ppt = (point *) &(searchsh.sh[3]); + if (checkfac4encroach(ppt[0], ppt[1], ppt[2], ccent, fcent, &r)) { + // Encroached. Split this subface. + splitflag = splitsubface(&searchsh, NULL, org(*splittet), qflag, + fcent, chkencflag | 2); + if (splitflag) { + // Some subfaces may need to be repaired. + repairencfacs(chkencflag | 2); + } + } + } + else if ((sloc == OUTSIDE) || (sloc == ENCSEGMENT)) { + // Hit a segment. We should split it. + // To be done... + // printf("hit segment, split it.\n"); // For debug only + } + if (splitflag) { + // Queue the tet if it is still alive. + if ((splittet->tet != NULL) && (splittet->tet[4] != NULL)) { + enqueuetetrahedron(splittet); + } + } + return splitflag; + } + + + + // Use Bowyer-Watson algorithm. Preserve subsegments and subfaces; + ivf.bowywat = 3; + ivf.lawson = 2; + ivf.rejflag = 3; // Do check for encroached segments and subfaces. + if (b->metric) { + ivf.rejflag |= 4; // Reject it if it lies in some protecting balls. + } + ivf.chkencflag = chkencflag; + ivf.sloc = ivf.sbowywat = 0; // No use. + ivf.splitbdflag = 0; // No use. + ivf.validflag = 1; + ivf.respectbdflag = 1; + ivf.assignmeshsize = b->metric; + + ivf.refineflag = 1; + ivf.refinetet = *splittet; + if (useinsertradius) { + // Need to save insertion radius for this new point. + ivf.smlenflag = 1; // Return the shortest edge length after inserting + // the new vertex. [2016-09-19] + } + + + if (insertpoint(newpt, &searchtet, NULL, NULL, &ivf)) { + // Vertex is inserted. + st_volref_count++; + if (steinerleft > 0) steinerleft--; + if (useinsertradius) { + setpointinsradius(newpt, ivf.smlen); + setpoint2ppt(newpt, ivf.parentpt); + } + if (flipstack != NULL) { + flipconstraints fc; + fc.chkencflag = chkencflag; + fc.enqflag = 2; + lawsonflip3d(&fc); + unflipqueue->restart(); + } + return 1; + } else { + // Point is not inserted. + pointdealloc(newpt); + // Check if there are encroached segments/subfaces. + if (ivf.iloc == (int) ENCSEGMENT) { + if (!b->nobisect || checkconstraints) { + // Select an encroached segment and split it. + for (i = 0; i < encseglist->objects; i++) { + paryseg = (face *) fastlookup(encseglist, i); + if (splitsegment(paryseg, NULL, rv, org(*splittet), NULL, qflag, + chkencflag | 3)) { + splitflag = 1; // A point is inserted on a segment. + break; + } + } + } // if (!b->nobisect) + encseglist->restart(); + if (splitflag) { + // Some segments may need to be repaired. + if (badsubsegs->items > 0) { + repairencsegs(chkencflag | 3); + } + // Some subfaces may need to be repaired. + if (badsubfacs->items > 0) { + repairencfacs(chkencflag | 2); + } + } + } else if (ivf.iloc == (int) ENCSUBFACE) { + if (!b->nobisect || checkconstraints) { + // Select an encroached subface and split it. + for (i = 0; i < encshlist->objects; i++) { + bface = (badface *) fastlookup(encshlist, i); + if (splitsubface(&(bface->ss), NULL, org(*splittet), qflag, + bface->cent, chkencflag | 2)){ + splitflag = 1; // A point is inserted on a subface or a segment. + break; + } + } + } // if (!b->nobisect) + encshlist->restart(); + if (splitflag) { + // Some subfaces may need to be repaired. + if (badsubfacs->items > 0) { + repairencfacs(chkencflag | 2); + } + } + } else { + if (ivf.iloc == (int) NEARVERTEX) { + terminatetetgen(this, 2); + } + } + if (splitflag) { + // Queue the tet if it is still alive. + if ((splittet->tet != NULL) && (splittet->tet[4] != NULL)) { + enqueuetetrahedron(splittet); + } + } else { + //assert(0); // If no small angle, why can this happen? + } + return splitflag; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// repairbadtets() Repair bad quality tetrahedra. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::repairbadtets(int chkencflag) +{ + triface *bface; + REAL ccent[3]; + int qflag = 0; + + + // Loop until the pool 'badsubfacs' is empty. Note that steinerleft == -1 + // if an unlimited number of Steiner points is allowed. + while ((badtetrahedrons->items > 0) && (steinerleft != 0)) { + badtetrahedrons->traversalinit(); + bface = (triface *) badtetrahedrons->traverse(); + while ((bface != NULL) && (steinerleft != 0)) { + // Skip a deleted element. + if (bface->ver >= 0) { + // A queued tet may have been deleted. + if (!isdeadtet(*bface)) { + // A queued tet may have been processed. + if (marktest2ed(*bface)) { + unmarktest2(*bface); + if (checktet4split(bface, qflag, ccent)) { + splittetrahedron(bface, qflag, ccent, chkencflag); + } + } + } + bface->ver = -1; // Signal it as a deleted element. + badtetrahedrons->dealloc((void *) bface); + } + bface = (triface *) badtetrahedrons->traverse(); + } + } + + if (badtetrahedrons->items > 0) { + if (steinerleft == 0) { + if (b->verbose) { + printf("The desired number of Steiner points is reached.\n"); + } + } else { + terminatetetgen(this, 2); // Unknown case. + } + // Unmark all queued tet. + badtetrahedrons->traversalinit(); + bface = (triface *) badtetrahedrons->traverse(); + while (bface != NULL) { + // Skip a deleted element. + if (bface->ver >= 0) { + if (!isdeadtet(*bface)) { + if (marktest2ed(*bface)) { + unmarktest2(*bface); + } + } + } + bface = (triface *) badtetrahedrons->traverse(); + } + // Clear the pool. + badtetrahedrons->restart(); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// delaunayrefinement() Refine the mesh by Delaunay refinement. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::delaunayrefinement() +{ + triface checktet; + face checksh; + face checkseg; + long steinercount; + int chkencflag; + + long bak_segref_count, bak_facref_count, bak_volref_count; + long bak_flipcount = flip23count + flip32count + flip44count; + + if (!b->quiet) { + printf("Refining mesh...\n"); + } + + if (b->verbose) { + printf(" Min radius-edge ratio = %g.\n", b->minratio); + printf(" Min dihedral angle = %g.\n", b->mindihedral); + //printf(" Min Edge length = %g.\n", b->minedgelength); + } + + steinerleft = b->steinerleft; // Upperbound of # Steiner points (by -S#). + if (steinerleft > 0) { + // Check if we've already used up the given number of Steiner points. + steinercount = st_segref_count + st_facref_count + st_volref_count; + if (steinercount < steinerleft) { + steinerleft -= steinercount; + } else { + if (!b->quiet) { + printf("\nWarning: "); + printf("The desired number of Steiner points (%d) has reached.\n\n", + b->steinerleft); + } + return; // No more Steiner points. + } + } + + if (useinsertradius) { + if ((b->plc && b->nobisect) || b->refine) { // '-pY' or '-r' option. + makesegmentendpointsmap(); + makefacetverticesmap(); + } + } + + + encseglist = new arraypool(sizeof(face), 8); + encshlist = new arraypool(sizeof(badface), 8); + + + //if (!b->nobisect) { // if no '-Y' option + if (!b->nobisect || checkconstraints) { + if (b->verbose) { + printf(" Splitting encroached subsegments.\n"); + } + + chkencflag = 1; // Only check encroaching subsegments. + steinercount = points->items; + + // Initialize the pool of encroached subsegments. + badsubsegs = new memorypool(sizeof(face), b->shellfaceperblock, + sizeof(void *), 0); + + // Add all segments into the pool. + subsegs->traversalinit(); + checkseg.sh = shellfacetraverse(subsegs); + while (checkseg.sh != (shellface *) NULL) { + enqueuesubface(badsubsegs, &checkseg); + checkseg.sh = shellfacetraverse(subsegs); + } + + // Split all encroached segments. + repairencsegs(chkencflag); + + if (b->verbose) { + printf(" Added %ld Steiner points.\n", points->items - steinercount); + } + + if (b->reflevel > 1) { // '-D2' option + if (b->verbose) { + printf(" Splitting encroached subfaces.\n"); + } + + chkencflag = 2; // Only check encroaching subfaces. + steinercount = points->items; + bak_segref_count = st_segref_count; + bak_facref_count = st_facref_count; + + // Initialize the pool of encroached subfaces. + badsubfacs = new memorypool(sizeof(face), b->shellfaceperblock, + sizeof(void *), 0); + + // Add all subfaces into the pool. + subfaces->traversalinit(); + checksh.sh = shellfacetraverse(subfaces); + while (checksh.sh != (shellface *) NULL) { + enqueuesubface(badsubfacs, &checksh); + checksh.sh = shellfacetraverse(subfaces); + } + + // Split all encroached subfaces. + repairencfacs(chkencflag); + + if (b->verbose) { + printf(" Added %ld (%ld,%ld) Steiner points.\n", + points->items-steinercount, st_segref_count-bak_segref_count, + st_facref_count-bak_facref_count); + } + } // if (b->reflevel > 1) + } // if (!b->nobisect) + + if (b->reflevel > 2) { // '-D3' option (The default option) + if (b->verbose) { + printf(" Splitting bad quality tets.\n"); + } + + chkencflag = 4; // Only check tetrahedra. + steinercount = points->items; + bak_segref_count = st_segref_count; + bak_facref_count = st_facref_count; + bak_volref_count = st_volref_count; + + // The cosine value of the min dihedral angle (-qq) for tetrahedra. + cosmindihed = cos(b->mindihedral / 180.0 * PI); + + // Initialize the pool of bad quality tetrahedra. + badtetrahedrons = new memorypool(sizeof(triface), b->tetrahedraperblock, + sizeof(void *), 0); + // Add all tetrahedra (no hull tets) into the pool. + tetrahedrons->traversalinit(); + checktet.tet = tetrahedrontraverse(); + while (checktet.tet != NULL) { + enqueuetetrahedron(&checktet); + checktet.tet = tetrahedrontraverse(); + } + + // Split all bad quality tetrahedra. + repairbadtets(chkencflag); + + if (b->verbose) { + printf(" Added %ld (%ld,%ld,%ld) Steiner points.\n", + points->items - steinercount, + st_segref_count - bak_segref_count, + st_facref_count - bak_facref_count, + st_volref_count - bak_volref_count); + } + } // if (b->reflevel > 2) + + if (b->verbose) { + if (flip23count + flip32count + flip44count > bak_flipcount) { + printf(" Performed %ld flips.\n", flip23count + flip32count + + flip44count - bak_flipcount); + } + } + + if (steinerleft == 0) { + if (!b->quiet) { + printf("\nWarnning: "); + printf("The desired number of Steiner points (%d) is reached.\n\n", + b->steinerleft); + } + } + + + delete encseglist; + delete encshlist; + encseglist = NULL; + encshlist = NULL; + + if (!b->nobisect || checkconstraints) { + totalworkmemory += (badsubsegs->maxitems * badsubsegs->itembytes); + delete badsubsegs; + badsubsegs = NULL; + if (b->reflevel > 1) { + totalworkmemory += (badsubfacs->maxitems * badsubfacs->itembytes); + delete badsubfacs; + badsubfacs = NULL; + } + } + if (b->reflevel > 2) { + totalworkmemory += (badtetrahedrons->maxitems*badtetrahedrons->itembytes); + delete badtetrahedrons; + badtetrahedrons = NULL; + } +} + +//// //// +//// //// +//// refine_cxx /////////////////////////////////////////////////////////////// + +//// optimize_cxx ///////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// lawsonflip3d() A three-dimensional Lawson's algorithm. // +// // +/////////////////////////////////////////////////////////////////////////////// + +long tetgenmesh::lawsonflip3d(flipconstraints *fc) +{ + triface fliptets[5], neightet, hulltet; + face checksh, casingout; + badface *popface, *bface; + point pd, pe, *pts; + REAL sign, ori; + REAL vol, len3; + long flipcount, totalcount = 0l; + long sliver_peels = 0l; + int t1ver; + int i; + + + while (1) { + + if (b->verbose > 2) { + printf(" Lawson flip %ld faces.\n", flippool->items); + } + flipcount = 0l; + + while (flipstack != (badface *) NULL) { + // Pop a face from the stack. + popface = flipstack; + fliptets[0] = popface->tt; + flipstack = flipstack->nextitem; // The next top item in stack. + flippool->dealloc((void *) popface); + + // Skip it if it is a dead tet (destroyed by previous flips). + if (isdeadtet(fliptets[0])) continue; + // Skip it if it is not the same tet as we saved. + if (!facemarked(fliptets[0])) continue; + + unmarkface(fliptets[0]); + + if (ishulltet(fliptets[0])) continue; + + fsym(fliptets[0], fliptets[1]); + if (ishulltet(fliptets[1])) { + if (nonconvex) { + // Check if 'fliptets[0]' it is a hull sliver. + tspivot(fliptets[0], checksh); + for (i = 0; i < 3; i++) { + if (!isshsubseg(checksh)) { + spivot(checksh, casingout); + //assert(casingout.sh != NULL); + if (sorg(checksh) != sdest(casingout)) sesymself(casingout); + stpivot(casingout, neightet); + if (neightet.tet == fliptets[0].tet) { + // Found a hull sliver 'neightet'. Let it be [e,d,a,b], where + // [e,d,a] and [d,e,b] are hull faces. + edestoppo(neightet, hulltet); // [a,b,e,d] + fsymself(hulltet); // [b,a,e,#] + if (oppo(hulltet) == dummypoint) { + pe = org(neightet); + if ((pointtype(pe) == FREEFACETVERTEX) || + (pointtype(pe) == FREESEGVERTEX)) { + removevertexbyflips(pe); + } + } else { + eorgoppo(neightet, hulltet); // [b,a,d,e] + fsymself(hulltet); // [a,b,d,#] + if (oppo(hulltet) == dummypoint) { + pd = dest(neightet); + if ((pointtype(pd) == FREEFACETVERTEX) || + (pointtype(pd) == FREESEGVERTEX)) { + removevertexbyflips(pd); + } + } else { + // Perform a 3-to-2 flip to remove the sliver. + fliptets[0] = neightet; // [e,d,a,b] + fnext(fliptets[0], fliptets[1]); // [e,d,b,c] + fnext(fliptets[1], fliptets[2]); // [e,d,c,a] + flip32(fliptets, 1, fc); + // Update counters. + flip32count--; + flip22count--; + sliver_peels++; + if (fc->remove_ndelaunay_edge) { + // Update the volume (must be decreased). + //assert(fc->tetprism_vol_sum <= 0); + tetprism_vol_sum += fc->tetprism_vol_sum; + fc->tetprism_vol_sum = 0.0; // Clear it. + } + } + } + break; + } // if (neightet.tet == fliptets[0].tet) + } // if (!isshsubseg(checksh)) + senextself(checksh); + } // i + } // if (nonconvex) + continue; + } + + if (checksubfaceflag) { + // Do not flip if it is a subface. + if (issubface(fliptets[0])) continue; + } + + // Test whether the face is locally Delaunay or not. + pts = (point *) fliptets[1].tet; + sign = insphere_s(pts[4], pts[5], pts[6], pts[7], oppo(fliptets[0])); + + if (sign < 0) { + // A non-Delaunay face. Try to flip it. + pd = oppo(fliptets[0]); + pe = oppo(fliptets[1]); + + // Use the length of the edge [d,e] as a reference to determine + // a nearly degenerated new tet. + len3 = distance(pd, pe); + len3 = (len3 * len3 * len3); + int round_flag = 0; // [2017-10-20] + // Check the convexity of its three edges. Stop checking either a + // locally non-convex edge (ori < 0) or a flat edge (ori = 0) is + // encountered, and 'fliptet' represents that edge. + for (i = 0; i < 3; i++) { + ori = orient3d(org(fliptets[0]), dest(fliptets[0]), pd, pe); + if (ori > 0) { + // Avoid creating a nearly degenerated new tet at boundary. + // Re-use fliptets[2], fliptets[3]; + esym(fliptets[0], fliptets[2]); + esym(fliptets[1], fliptets[3]); + if (issubface(fliptets[2]) || issubface(fliptets[3])) { + vol = orient3dfast(org(fliptets[0]), dest(fliptets[0]), pd, pe); + if ((fabs(vol) / len3) < b->epsilon) { + ori = 0.0; // Do rounding. + round_flag = 1; // [2017-10-20] + } + } + } // Rounding check + if (ori <= 0) break; + enextself(fliptets[0]); + eprevself(fliptets[1]); + } + + if (ori > 0) { + // A 2-to-3 flip is found. + // [0] [a,b,c,d], + // [1] [b,a,c,e]. no dummypoint. + flip23(fliptets, 0, fc); + flipcount++; + if (fc->remove_ndelaunay_edge) { + // Update the volume (must be decreased). + //assert(fc->tetprism_vol_sum <= 0); + tetprism_vol_sum += fc->tetprism_vol_sum; + fc->tetprism_vol_sum = 0.0; // Clear it. + } + continue; + } else { // ori <= 0 + // The edge ('fliptets[0]' = [a',b',c',d]) is non-convex or flat, + // where the edge [a',b'] is one of [a,b], [b,c], and [c,a]. + if (checksubsegflag) { + // Do not flip if it is a segment. + if (issubseg(fliptets[0])) continue; + } + // Check if there are three or four tets sharing at this edge. + esymself(fliptets[0]); // [b,a,d,c] + for (i = 0; i < 3; i++) { + fnext(fliptets[i], fliptets[i+1]); + } + if (fliptets[3].tet == fliptets[0].tet) { + // A 3-to-2 flip is found. (No hull tet.) + flip32(fliptets, 0, fc); + flipcount++; + if (fc->remove_ndelaunay_edge) { + // Update the volume (must be decreased). + //assert(fc->tetprism_vol_sum <= 0); + tetprism_vol_sum += fc->tetprism_vol_sum; + fc->tetprism_vol_sum = 0.0; // Clear it. + } + continue; + } else { + // There are more than 3 tets at this edge. + fnext(fliptets[3], fliptets[4]); + if (fliptets[4].tet == fliptets[0].tet) { + // There are exactly 4 tets at this edge. + if (round_flag == 1) { + continue; // [2017-10-20] + } + if (nonconvex) { + if (apex(fliptets[3]) == dummypoint) { + // This edge is locally non-convex on the hull. + // It can be removed by a 4-to-4 flip. + ori = 0; + } + } // if (nonconvex) + if (ori == 0) { + // A 4-to-4 flip is found. (Two hull tets may be involved.) + // Current tets in 'fliptets': + // [0] [b,a,d,c] (d may be newpt) + // [1] [b,a,c,e] + // [2] [b,a,e,f] (f may be dummypoint) + // [3] [b,a,f,d] + esymself(fliptets[0]); // [a,b,c,d] + // A 2-to-3 flip replaces face [a,b,c] by edge [e,d]. + // This creates a degenerate tet [e,d,a,b] (tmpfliptets[0]). + // It will be removed by the followed 3-to-2 flip. + flip23(fliptets, 0, fc); // No hull tet. + fnext(fliptets[3], fliptets[1]); + fnext(fliptets[1], fliptets[2]); + // Current tets in 'fliptets': + // [0] [...] + // [1] [b,a,d,e] (degenerated, d may be new point). + // [2] [b,a,e,f] (f may be dummypoint) + // [3] [b,a,f,d] + // A 3-to-2 flip replaces edge [b,a] by face [d,e,f]. + // Hull tets may be involved (f may be dummypoint). + flip32(&(fliptets[1]), (apex(fliptets[3]) == dummypoint), fc); + flipcount++; + flip23count--; + flip32count--; + flip44count++; + if (fc->remove_ndelaunay_edge) { + // Update the volume (must be decreased). + //assert(fc->tetprism_vol_sum <= 0); + tetprism_vol_sum += fc->tetprism_vol_sum; + fc->tetprism_vol_sum = 0.0; // Clear it. + } + /////// Debug + //if (checkmesh(0) > 0) { + // assert(0); + //} + continue; + } // if (ori == 0) + } + } + } // if (ori <= 0) + + // This non-Delaunay face is unflippable. Save it. + unflipqueue->newindex((void **) &bface); + bface->tt = fliptets[0]; + bface->forg = org(fliptets[0]); + bface->fdest = dest(fliptets[0]); + bface->fapex = apex(fliptets[0]); + } // if (sign < 0) + } // while (flipstack) + + if (b->verbose > 2) { + if (flipcount > 0) { + printf(" Performed %ld flips.\n", flipcount); + } + } + // Accumulate the counter of flips. + totalcount += flipcount; + + // Return if no unflippable faces left. + if (unflipqueue->objects == 0l) break; + // Return if no flip has been performed. + if (flipcount == 0l) break; + + // Try to flip the unflippable faces. + for (i = 0; i < unflipqueue->objects; i++) { + bface = (badface *) fastlookup(unflipqueue, i); + if (!isdeadtet(bface->tt) && + (org(bface->tt) == bface->forg) && + (dest(bface->tt) == bface->fdest) && + (apex(bface->tt) == bface->fapex)) { + flippush(flipstack, &(bface->tt)); + } + } + unflipqueue->restart(); + + } // while (1) + + if (b->verbose > 2) { + if (totalcount > 0) { + printf(" Performed %ld flips.\n", totalcount); + } + if (sliver_peels > 0) { + printf(" Removed %ld hull slivers.\n", sliver_peels); + } + if (unflipqueue->objects > 0l) { + printf(" %ld unflippable edges remained.\n", unflipqueue->objects); + } + } + + return totalcount + sliver_peels; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// recoverdelaunay() Recovery the locally Delaunay property. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::recoverdelaunay() +{ + arraypool *flipqueue, *nextflipqueue, *swapqueue; + triface tetloop, neightet, *parytet; + badface *bface, *parybface; + point *ppt; + flipconstraints fc; + int i, j; + + if (!b->quiet) { + printf("Recovering Delaunayness...\n"); + } + + tetprism_vol_sum = 0.0; // Initialize it. + + // Put all interior faces of the mesh into 'flipstack'. + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != NULL) { + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + decode(tetloop.tet[tetloop.ver], neightet); + if (!facemarked(neightet)) { + flippush(flipstack, &tetloop); + } + } + ppt = (point *) &(tetloop.tet[4]); + tetprism_vol_sum += tetprismvol(ppt[0], ppt[1], ppt[2], ppt[3]); + tetloop.tet = tetrahedrontraverse(); + } + + // Calulate a relatively lower bound for small improvement. + // Used to avoid rounding error in volume calculation. + fc.bak_tetprism_vol = tetprism_vol_sum * b->epsilon * 1e-3; + + if (b->verbose) { + printf(" Initial obj = %.17g\n", tetprism_vol_sum); + } + + if (b->verbose > 1) { + printf(" Recover Delaunay [Lawson] : %ld\n", flippool->items); + } + + // First only use the basic Lawson's flip. + fc.remove_ndelaunay_edge = 1; + fc.enqflag = 2; + + lawsonflip3d(&fc); + + if (b->verbose > 1) { + printf(" obj (after Lawson) = %.17g\n", tetprism_vol_sum); + } + + if (unflipqueue->objects == 0l) { + return; // The mesh is Delaunay. + } + + fc.unflip = 1; // Unflip if the edge is not flipped. + fc.collectnewtets = 1; // new tets are returned in 'cavetetlist'. + fc.enqflag = 0; + + autofliplinklevel = 1; // Init level. + b->fliplinklevel = -1; // No fixed level. + + // For efficiency reason, we limit the maximium size of the edge star. + int bakmaxflipstarsize = b->flipstarsize; + b->flipstarsize = 10; // default + + flipqueue = new arraypool(sizeof(badface), 10); + nextflipqueue = new arraypool(sizeof(badface), 10); + + // Swap the two flip queues. + swapqueue = flipqueue; + flipqueue = unflipqueue; + unflipqueue = swapqueue; + + while (flipqueue->objects > 0l) { + + if (b->verbose > 1) { + printf(" Recover Delaunay [level = %2d] #: %ld.\n", + autofliplinklevel, flipqueue->objects); + } + + for (i = 0; i < flipqueue->objects; i++) { + bface = (badface *) fastlookup(flipqueue, i); + if (getedge(bface->forg, bface->fdest, &bface->tt)) { + if (removeedgebyflips(&(bface->tt), &fc) == 2) { + tetprism_vol_sum += fc.tetprism_vol_sum; + fc.tetprism_vol_sum = 0.0; // Clear it. + // Queue new faces for flips. + for (j = 0; j < cavetetlist->objects; j++) { + parytet = (triface *) fastlookup(cavetetlist, j); + // A queued new tet may be dead. + if (!isdeadtet(*parytet)) { + for (parytet->ver = 0; parytet->ver < 4; parytet->ver++) { + // Avoid queue a face twice. + decode(parytet->tet[parytet->ver], neightet); + if (!facemarked(neightet)) { + flippush(flipstack, parytet); + } + } // parytet->ver + } + } // j + cavetetlist->restart(); + // Remove locally non-Delaunay faces. New non-Delaunay edges + // may be found. They are saved in 'unflipqueue'. + fc.enqflag = 2; + lawsonflip3d(&fc); + fc.enqflag = 0; + // There may be unflipable faces. Add them in flipqueue. + for (j = 0; j < unflipqueue->objects; j++) { + bface = (badface *) fastlookup(unflipqueue, j); + flipqueue->newindex((void **) &parybface); + *parybface = *bface; + } + unflipqueue->restart(); + } else { + // Unable to remove this edge. Save it. + nextflipqueue->newindex((void **) &parybface); + *parybface = *bface; + // Normally, it should be zero. + //assert(fc.tetprism_vol_sum == 0.0); + // However, due to rounding errors, a tiny value may appear. + fc.tetprism_vol_sum = 0.0; + } + } + } // i + + if (b->verbose > 1) { + printf(" obj (after level %d) = %.17g.\n", autofliplinklevel, + tetprism_vol_sum); + } + flipqueue->restart(); + + // Swap the two flip queues. + swapqueue = flipqueue; + flipqueue = nextflipqueue; + nextflipqueue = swapqueue; + + if (flipqueue->objects > 0l) { + // default 'b->delmaxfliplevel' is 1. + if (autofliplinklevel >= b->delmaxfliplevel) { + // For efficiency reason, we do not search too far. + break; + } + autofliplinklevel+=b->fliplinklevelinc; + } + } // while (flipqueue->objects > 0l) + + if (flipqueue->objects > 0l) { + if (b->verbose > 1) { + printf(" %ld non-Delaunay edges remained.\n", flipqueue->objects); + } + } + + if (b->verbose) { + printf(" Final obj = %.17g\n", tetprism_vol_sum); + } + + b->flipstarsize = bakmaxflipstarsize; + delete flipqueue; + delete nextflipqueue; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// gettetrahedron() Get a tetrahedron which have the given vertices. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::gettetrahedron(point pa, point pb, point pc, point pd, + triface *searchtet) +{ + triface spintet; + int t1ver; + + if (getedge(pa, pb, searchtet)) { + spintet = *searchtet; + while (1) { + if (apex(spintet) == pc) { + *searchtet = spintet; + break; + } + fnextself(spintet); + if (spintet.tet == searchtet->tet) break; + } + if (apex(*searchtet) == pc) { + if (oppo(*searchtet) == pd) { + return 1; + } else { + fsymself(*searchtet); + if (oppo(*searchtet) == pd) { + return 1; + } + } + } + } + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// improvequalitybyflips() Improve the mesh quality by flips. // +// // +/////////////////////////////////////////////////////////////////////////////// + +long tetgenmesh::improvequalitybyflips() +{ + arraypool *flipqueue, *nextflipqueue, *swapqueue; + badface *bface, *parybface; + triface *parytet; + point *ppt; + flipconstraints fc; + REAL *cosdd, ncosdd[6], maxdd; + long totalremcount, remcount; + int remflag; + int n, i, j, k; + + //assert(unflipqueue->objects > 0l); + flipqueue = new arraypool(sizeof(badface), 10); + nextflipqueue = new arraypool(sizeof(badface), 10); + + // Backup flip edge options. + int bakautofliplinklevel = autofliplinklevel; + int bakfliplinklevel = b->fliplinklevel; + int bakmaxflipstarsize = b->flipstarsize; + + // Set flip edge options. + autofliplinklevel = 1; + b->fliplinklevel = -1; + b->flipstarsize = 10; // b->optmaxflipstarsize; + + fc.remove_large_angle = 1; + fc.unflip = 1; + fc.collectnewtets = 1; + fc.checkflipeligibility = 1; + + totalremcount = 0l; + + // Swap the two flip queues. + swapqueue = flipqueue; + flipqueue = unflipqueue; + unflipqueue = swapqueue; + + while (flipqueue->objects > 0l) { + + remcount = 0l; + + while (flipqueue->objects > 0l) { + if (b->verbose > 1) { + printf(" Improving mesh qualiy by flips [%d]#: %ld.\n", + autofliplinklevel, flipqueue->objects); + } + + for (k = 0; k < flipqueue->objects; k++) { + bface = (badface *) fastlookup(flipqueue, k); + if (gettetrahedron(bface->forg, bface->fdest, bface->fapex, + bface->foppo, &bface->tt)) { + //assert(!ishulltet(bface->tt)); + // There are bad dihedral angles in this tet. + if (bface->tt.ver != 11) { + // The dihedral angles are permuted. + // Here we simply re-compute them. Slow!!. + ppt = (point *) & (bface->tt.tet[4]); + tetalldihedral(ppt[0], ppt[1], ppt[2], ppt[3], bface->cent, + &bface->key, NULL); + bface->forg = ppt[0]; + bface->fdest = ppt[1]; + bface->fapex = ppt[2]; + bface->foppo = ppt[3]; + bface->tt.ver = 11; + } + if (bface->key == 0) { + // Re-comput the quality values. Due to smoothing operations. + ppt = (point *) & (bface->tt.tet[4]); + tetalldihedral(ppt[0], ppt[1], ppt[2], ppt[3], bface->cent, + &bface->key, NULL); + } + cosdd = bface->cent; + remflag = 0; + for (i = 0; (i < 6) && !remflag; i++) { + if (cosdd[i] < cosmaxdihed) { + // Found a large dihedral angle. + bface->tt.ver = edge2ver[i]; // Go to the edge. + fc.cosdihed_in = cosdd[i]; + fc.cosdihed_out = 0.0; // 90 degree. + n = removeedgebyflips(&(bface->tt), &fc); + if (n == 2) { + // Edge is flipped. + remflag = 1; + if (fc.cosdihed_out < cosmaxdihed) { + // Queue new bad tets for further improvements. + for (j = 0; j < cavetetlist->objects; j++) { + parytet = (triface *) fastlookup(cavetetlist, j); + if (!isdeadtet(*parytet)) { + ppt = (point *) & (parytet->tet[4]); + // Do not test a hull tet. + if (ppt[3] != dummypoint) { + tetalldihedral(ppt[0], ppt[1], ppt[2], ppt[3], ncosdd, + &maxdd, NULL); + if (maxdd < cosmaxdihed) { + // There are bad dihedral angles in this tet. + nextflipqueue->newindex((void **) &parybface); + parybface->tt.tet = parytet->tet; + parybface->tt.ver = 11; + parybface->forg = ppt[0]; + parybface->fdest = ppt[1]; + parybface->fapex = ppt[2]; + parybface->foppo = ppt[3]; + parybface->key = maxdd; + for (n = 0; n < 6; n++) { + parybface->cent[n] = ncosdd[n]; + } + } + } // if (ppt[3] != dummypoint) + } + } // j + } // if (fc.cosdihed_out < cosmaxdihed) + cavetetlist->restart(); + remcount++; + } + } + } // i + if (!remflag) { + // An unremoved bad tet. Queue it again. + unflipqueue->newindex((void **) &parybface); + *parybface = *bface; + } + } // if (gettetrahedron(...)) + } // k + + flipqueue->restart(); + + // Swap the two flip queues. + swapqueue = flipqueue; + flipqueue = nextflipqueue; + nextflipqueue = swapqueue; + } // while (flipqueues->objects > 0) + + if (b->verbose > 1) { + printf(" Removed %ld bad tets.\n", remcount); + } + totalremcount += remcount; + + if (unflipqueue->objects > 0l) { + //if (autofliplinklevel >= b->optmaxfliplevel) { + if (autofliplinklevel >= b->optlevel) { + break; + } + autofliplinklevel+=b->fliplinklevelinc; + //b->flipstarsize = 10 + (1 << (b->optlevel - 1)); + } + + // Swap the two flip queues. + swapqueue = flipqueue; + flipqueue = unflipqueue; + unflipqueue = swapqueue; + } // while (flipqueues->objects > 0) + + // Restore original flip edge options. + autofliplinklevel = bakautofliplinklevel; + b->fliplinklevel = bakfliplinklevel; + b->flipstarsize = bakmaxflipstarsize; + + delete flipqueue; + delete nextflipqueue; + + return totalremcount; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// smoothpoint() Moving a vertex to improve the mesh quality. // +// // +// 'smtpt' (p) is a point to be smoothed. Generally, it is a Steiner point. // +// It may be not a vertex of the mesh. // +// // +// This routine tries to move 'p' inside its star until a selected objective // +// function over all tetrahedra in the star is improved. The function may be // +// the some quality measures, i.e., aspect ratio, maximum dihedral angel, or // +// simply the volume of the tetrahedra. // +// // +// 'linkfacelist' contains the list of link faces of 'p'. Since a link face // +// has two orientations, ccw or cw, with respect to 'p'. 'ccw' indicates // +// the orientation is ccw (1) or not (0). // +// // +// 'opm' is a structure contains the parameters of the objective function. // +// It is needed by the evaluation of the function value. // +// // +// The return value indicates weather the point is smoothed or not. // +// // +// ASSUMPTION: This routine assumes that all link faces are true faces, i.e, // +// no face has 'dummypoint' as its vertex. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::smoothpoint(point smtpt, arraypool *linkfacelist, int ccw, + optparameters *opm) +{ + triface *parytet, *parytet1, swaptet; + point pa, pb, pc; + REAL fcent[3], startpt[3], nextpt[3], bestpt[3]; + REAL oldval, minval = 0.0, val; + REAL maxcosd; // oldang, newang; + REAL ori, diff; + int numdirs, iter; + int i, j, k; + + // Decide the number of moving directions. + numdirs = (int) linkfacelist->objects; + if (numdirs > opm->numofsearchdirs) { + numdirs = opm->numofsearchdirs; // Maximum search directions. + } + + // Set the initial value. + opm->imprval = opm->initval; + iter = 0; + + for (i = 0; i < 3; i++) { + bestpt[i] = startpt[i] = smtpt[i]; + } + + // Iterate until the obj function is not improved. + while (1) { + + // Find the best next location. + oldval = opm->imprval; + + for (i = 0; i < numdirs; i++) { + // Randomly pick a link face (0 <= k <= objects - i - 1). + k = (int) randomnation(linkfacelist->objects - i); + parytet = (triface *) fastlookup(linkfacelist, k); + // Calculate a new position from 'p' to the center of this face. + pa = org(*parytet); + pb = dest(*parytet); + pc = apex(*parytet); + for (j = 0; j < 3; j++) { + fcent[j] = (pa[j] + pb[j] + pc[j]) / 3.0; + } + for (j = 0; j < 3; j++) { + nextpt[j] = startpt[j] + opm->searchstep * (fcent[j] - startpt[j]); + } + // Calculate the largest minimum function value for the new location. + for (j = 0; j < linkfacelist->objects; j++) { + parytet = (triface *) fastlookup(linkfacelist, j); + if (ccw) { + pa = org(*parytet); + pb = dest(*parytet); + } else { + pb = org(*parytet); + pa = dest(*parytet); + } + pc = apex(*parytet); + ori = orient3d(pa, pb, pc, nextpt); + if (ori < 0.0) { + // Calcuate the objective function value. + if (opm->max_min_volume) { + //val = -ori; + val = - orient3dfast(pa, pb, pc, nextpt); + } else if (opm->min_max_aspectratio) { + val = 1.0 / tetaspectratio(pa, pb, pc, nextpt); + } else if (opm->min_max_dihedangle) { + tetalldihedral(pa, pb, pc, nextpt, NULL, &maxcosd, NULL); + if (maxcosd < -1) maxcosd = -1.0; // Rounding. + val = maxcosd + 1.0; // Make it be positive. + } else { + // Unknown objective function. + val = 0.0; + } + } else { // ori >= 0.0; + // An invalid new tet. + // This may happen if the mesh contains inverted elements. + if (opm->max_min_volume) { + //val = -ori; + val = - orient3dfast(pa, pb, pc, nextpt); + } else { + // Discard this point. + break; // j + } + } // if (ori >= 0.0) + // Stop looping when the object value is not improved. + if (val <= opm->imprval) { + break; // j + } else { + // Remember the smallest improved value. + if (j == 0) { + minval = val; + } else { + minval = (val < minval) ? val : minval; + } + } + } // j + if (j == linkfacelist->objects) { + // The function value has been improved. + opm->imprval = minval; + // Save the new location of the point. + for (j = 0; j < 3; j++) bestpt[j] = nextpt[j]; + } + // Swap k-th and (object-i-1)-th entries. + j = linkfacelist->objects - i - 1; + parytet = (triface *) fastlookup(linkfacelist, k); + parytet1 = (triface *) fastlookup(linkfacelist, j); + swaptet = *parytet1; + *parytet1 = *parytet; + *parytet = swaptet; + } // i + + diff = opm->imprval - oldval; + if (diff > 0.0) { + // Is the function value improved effectively? + if (opm->max_min_volume) { + //if ((diff / oldval) < b->epsilon) diff = 0.0; + } else if (opm->min_max_aspectratio) { + if ((diff / oldval) < 1e-3) diff = 0.0; + } else if (opm->min_max_dihedangle) { + //oldang = acos(oldval - 1.0); + //newang = acos(opm->imprval - 1.0); + //if ((oldang - newang) < 0.00174) diff = 0.0; // about 0.1 degree. + } else { + // Unknown objective function. + terminatetetgen(this, 2); + } + } + + if (diff > 0.0) { + // Yes, move p to the new location and continue. + for (j = 0; j < 3; j++) startpt[j] = bestpt[j]; + iter++; + if ((opm->maxiter > 0) && (iter >= opm->maxiter)) { + // Maximum smoothing iterations reached. + break; + } + } else { + break; + } + + } // while (1) + + if (iter > 0) { + // The point has been smoothed. + opm->smthiter = iter; // Remember the number of iterations. + // The point has been smoothed. Update it to its new position. + for (i = 0; i < 3; i++) smtpt[i] = startpt[i]; + } + + return iter; +} + + +/////////////////////////////////////////////////////////////////////////////// +// // +// improvequalitysmoothing() Improve mesh quality by smoothing. // +// // +/////////////////////////////////////////////////////////////////////////////// + +long tetgenmesh::improvequalitybysmoothing(optparameters *opm) +{ + arraypool *flipqueue, *swapqueue; + triface *parytet; + badface *bface, *parybface; + point *ppt; + long totalsmtcount, smtcount; + int smtflag; + int iter, i, j, k; + + //assert(unflipqueue->objects > 0l); + flipqueue = new arraypool(sizeof(badface), 10); + + // Swap the two flip queues. + swapqueue = flipqueue; + flipqueue = unflipqueue; + unflipqueue = swapqueue; + + totalsmtcount = 0l; + iter = 0; + + while (flipqueue->objects > 0l) { + + smtcount = 0l; + + if (b->verbose > 1) { + printf(" Improving mesh quality by smoothing [%d]#: %ld.\n", + iter, flipqueue->objects); + } + + for (k = 0; k < flipqueue->objects; k++) { + bface = (badface *) fastlookup(flipqueue, k); + if (gettetrahedron(bface->forg, bface->fdest, bface->fapex, + bface->foppo, &bface->tt)) { + // Operate on it if it is not in 'unflipqueue'. + if (!marktested(bface->tt)) { + // Here we simply re-compute the quality. Since other smoothing + // operation may have moved the vertices of this tet. + ppt = (point *) & (bface->tt.tet[4]); + tetalldihedral(ppt[0], ppt[1], ppt[2], ppt[3], bface->cent, + &bface->key, NULL); + if (bface->key < cossmtdihed) { // if (maxdd < cosslidihed) { + // It is a sliver. Try to smooth its vertices. + smtflag = 0; + opm->initval = bface->key + 1.0; + for (i = 0; (i < 4) && !smtflag; i++) { + if (pointtype(ppt[i]) == FREEVOLVERTEX) { + getvertexstar(1, ppt[i], cavetetlist, NULL, NULL); + opm->searchstep = 0.001; // Search step size + smtflag = smoothpoint(ppt[i], cavetetlist, 1, opm); + if (smtflag) { + while (opm->smthiter == opm->maxiter) { + opm->searchstep *= 10.0; // Increase the step size. + opm->initval = opm->imprval; + opm->smthiter = 0; // reset + smoothpoint(ppt[i], cavetetlist, 1, opm); + } + // This tet is modifed. + smtcount++; + if ((opm->imprval - 1.0) < cossmtdihed) { + // There are slivers in new tets. Queue them. + for (j = 0; j < cavetetlist->objects; j++) { + parytet = (triface *) fastlookup(cavetetlist, j); + // Operate it if it is not in 'unflipqueue'. + if (!marktested(*parytet)) { + // Evaluate its quality. + // Re-use ppt, bface->key, bface->cent. + ppt = (point *) & (parytet->tet[4]); + tetalldihedral(ppt[0], ppt[1], ppt[2], ppt[3], + bface->cent, &bface->key, NULL); + if (bface->key < cossmtdihed) { + // A new sliver. Queue it. + marktest(*parytet); // It is in unflipqueue. + unflipqueue->newindex((void **) &parybface); + parybface->tt = *parytet; + parybface->forg = ppt[0]; + parybface->fdest = ppt[1]; + parybface->fapex = ppt[2]; + parybface->foppo = ppt[3]; + parybface->tt.ver = 11; + parybface->key = 0.0; + } + } + } // j + } // if ((opm->imprval - 1.0) < cossmtdihed) + } // if (smtflag) + cavetetlist->restart(); + } // if (pointtype(ppt[i]) == FREEVOLVERTEX) + } // i + if (!smtflag) { + // Didn't smooth. Queue it again. + marktest(bface->tt); // It is in unflipqueue. + unflipqueue->newindex((void **) &parybface); + parybface->tt = bface->tt; + parybface->forg = ppt[0]; + parybface->fdest = ppt[1]; + parybface->fapex = ppt[2]; + parybface->foppo = ppt[3]; + parybface->tt.ver = 11; + parybface->key = 0.0; + } + } // if (maxdd < cosslidihed) + } // if (!marktested(...)) + } // if (gettetrahedron(...)) + } // k + + flipqueue->restart(); + + // Unmark the tets in unflipqueue. + for (i = 0; i < unflipqueue->objects; i++) { + bface = (badface *) fastlookup(unflipqueue, i); + unmarktest(bface->tt); + } + + if (b->verbose > 1) { + printf(" Smooth %ld points.\n", smtcount); + } + totalsmtcount += smtcount; + + if (smtcount == 0l) { + // No point has been smoothed. + break; + } else { + iter++; + if (iter == 2) { //if (iter >= b->optpasses) { + break; + } + } + + // Swap the two flip queues. + swapqueue = flipqueue; + flipqueue = unflipqueue; + unflipqueue = swapqueue; + } // while + + delete flipqueue; + + return totalsmtcount; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// splitsliver() Split a sliver. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::splitsliver(triface *slitet, REAL cosd, int chkencflag) +{ + triface *abtets; + triface searchtet, spintet, *parytet; + point pa, pb, steinerpt; + optparameters opm; + insertvertexflags ivf; + REAL smtpt[3], midpt[3]; + int success; + int t1ver; + int n, i; + + // 'slitet' is [c,d,a,b], where [c,d] has a big dihedral angle. + // Go to the opposite edge [a,b]. + edestoppo(*slitet, searchtet); // [a,b,c,d]. + + // Do not split a segment. + if (issubseg(searchtet)) { + return 0; + } + + // Count the number of tets shared at [a,b]. + // Do not split it if it is a hull edge. + spintet = searchtet; + n = 0; + while (1) { + if (ishulltet(spintet)) break; + n++; + fnextself(spintet); + if (spintet.tet == searchtet.tet) break; + } + if (ishulltet(spintet)) { + return 0; // It is a hull edge. + } + + // Get all tets at edge [a,b]. + abtets = new triface[n]; + spintet = searchtet; + for (i = 0; i < n; i++) { + abtets[i] = spintet; + fnextself(spintet); + } + + // Initialize the list of 2n boundary faces. + for (i = 0; i < n; i++) { + eprev(abtets[i], searchtet); + esymself(searchtet); // [a,p_i,p_i+1]. + cavetetlist->newindex((void **) &parytet); + *parytet = searchtet; + enext(abtets[i], searchtet); + esymself(searchtet); // [p_i,b,p_i+1]. + cavetetlist->newindex((void **) &parytet); + *parytet = searchtet; + } + + // Init the Steiner point at the midpoint of edge [a,b]. + pa = org(abtets[0]); + pb = dest(abtets[0]); + for (i = 0; i < 3; i++) { + smtpt[i] = midpt[i] = 0.5 * (pa[i] + pb[i]); + } + + // Point smooth options. + opm.min_max_dihedangle = 1; + opm.initval = cosd + 1.0; // Initial volume is zero. + opm.numofsearchdirs = 20; + opm.searchstep = 0.001; + opm.maxiter = 100; // Limit the maximum iterations. + + success = smoothpoint(smtpt, cavetetlist, 1, &opm); + + if (success) { + while (opm.smthiter == opm.maxiter) { + // It was relocated and the prescribed maximum iteration reached. + // Try to increase the search stepsize. + opm.searchstep *= 10.0; + //opm.maxiter = 100; // Limit the maximum iterations. + opm.initval = opm.imprval; + opm.smthiter = 0; // Init. + smoothpoint(smtpt, cavetetlist, 1, &opm); + } + } // if (success) + + cavetetlist->restart(); + + if (!success) { + delete [] abtets; + return 0; + } + + + // Insert the Steiner point. + makepoint(&steinerpt, FREEVOLVERTEX); + for (i = 0; i < 3; i++) steinerpt[i] = smtpt[i]; + + // Insert the created Steiner point. + for (i = 0; i < n; i++) { + infect(abtets[i]); + caveoldtetlist->newindex((void **) &parytet); + *parytet = abtets[i]; + } + + searchtet = abtets[0]; // No need point location. + if (b->metric) { + locate(steinerpt, &searchtet); // For size interpolation. + } + + delete [] abtets; + + ivf.iloc = (int) INSTAR; + ivf.chkencflag = chkencflag; + ivf.assignmeshsize = b->metric; + + + if (insertpoint(steinerpt, &searchtet, NULL, NULL, &ivf)) { + // The vertex has been inserted. + st_volref_count++; + if (steinerleft > 0) steinerleft--; + return 1; + } else { + // The Steiner point is too close to an existing vertex. Reject it. + pointdealloc(steinerpt); + return 0; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// removeslivers() Remove slivers by adding Steiner points. // +// // +/////////////////////////////////////////////////////////////////////////////// + +long tetgenmesh::removeslivers(int chkencflag) +{ + arraypool *flipqueue, *swapqueue; + badface *bface, *parybface; + triface slitet, *parytet; + point *ppt; + REAL cosdd[6], maxcosd; + long totalsptcount, sptcount; + int iter, i, j, k; + + //assert(unflipqueue->objects > 0l); + flipqueue = new arraypool(sizeof(badface), 10); + + // Swap the two flip queues. + swapqueue = flipqueue; + flipqueue = unflipqueue; + unflipqueue = swapqueue; + + totalsptcount = 0l; + iter = 0; + + while ((flipqueue->objects > 0l) && (steinerleft != 0)) { + + sptcount = 0l; + + if (b->verbose > 1) { + printf(" Splitting bad quality tets [%d]#: %ld.\n", + iter, flipqueue->objects); + } + + for (k = 0; (k < flipqueue->objects) && (steinerleft != 0); k++) { + bface = (badface *) fastlookup(flipqueue, k); + if (gettetrahedron(bface->forg, bface->fdest, bface->fapex, + bface->foppo, &bface->tt)) { + if ((bface->key == 0) || (bface->tt.ver != 11)) { + // Here we need to re-compute the quality. Since other smoothing + // operation may have moved the vertices of this tet. + ppt = (point *) & (bface->tt.tet[4]); + tetalldihedral(ppt[0], ppt[1], ppt[2], ppt[3], bface->cent, + &bface->key, NULL); + } + if (bface->key < cosslidihed) { + // It is a sliver. Try to split it. + slitet.tet = bface->tt.tet; + //cosdd = bface->cent; + for (j = 0; j < 6; j++) { + if (bface->cent[j] < cosslidihed) { + // Found a large dihedral angle. + slitet.ver = edge2ver[j]; // Go to the edge. + if (splitsliver(&slitet, bface->cent[j], chkencflag)) { + sptcount++; + break; + } + } + } // j + if (j < 6) { + // A sliver is split. Queue new slivers. + badtetrahedrons->traversalinit(); + parytet = (triface *) badtetrahedrons->traverse(); + while (parytet != NULL) { + unmarktest2(*parytet); + ppt = (point *) & (parytet->tet[4]); + tetalldihedral(ppt[0], ppt[1], ppt[2], ppt[3], cosdd, + &maxcosd, NULL); + if (maxcosd < cosslidihed) { + // A new sliver. Queue it. + unflipqueue->newindex((void **) &parybface); + parybface->forg = ppt[0]; + parybface->fdest = ppt[1]; + parybface->fapex = ppt[2]; + parybface->foppo = ppt[3]; + parybface->tt.tet = parytet->tet; + parybface->tt.ver = 11; + parybface->key = maxcosd; + for (i = 0; i < 6; i++) { + parybface->cent[i] = cosdd[i]; + } + } + parytet = (triface *) badtetrahedrons->traverse(); + } + badtetrahedrons->restart(); + } else { + // Didn't split. Queue it again. + unflipqueue->newindex((void **) &parybface); + *parybface = *bface; + } // if (j == 6) + } // if (bface->key < cosslidihed) + } // if (gettetrahedron(...)) + } // k + + flipqueue->restart(); + + if (b->verbose > 1) { + printf(" Split %ld tets.\n", sptcount); + } + totalsptcount += sptcount; + + if (sptcount == 0l) { + // No point has been smoothed. + break; + } else { + iter++; + if (iter == 2) { //if (iter >= b->optpasses) { + break; + } + } + + // Swap the two flip queues. + swapqueue = flipqueue; + flipqueue = unflipqueue; + unflipqueue = swapqueue; + } // while + + delete flipqueue; + + return totalsptcount; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// optimizemesh() Optimize mesh for specified objective functions. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::optimizemesh() +{ + badface *parybface; + triface checktet; + point *ppt; + int optpasses; + optparameters opm; + REAL ncosdd[6], maxdd; + long totalremcount, remcount; + long totalsmtcount, smtcount; + long totalsptcount, sptcount; + int chkencflag; + int iter; + int n; + + if (!b->quiet) { + printf("Optimizing mesh...\n"); + } + + optpasses = ((1 << b->optlevel) - 1); + + if (b->verbose) { + printf(" Optimization level = %d.\n", b->optlevel); + printf(" Optimization scheme = %d.\n", b->optscheme); + printf(" Number of iteration = %d.\n", optpasses); + printf(" Min_Max dihed angle = %g.\n", b->optmaxdihedral); + } + + totalsmtcount = totalsptcount = totalremcount = 0l; + + cosmaxdihed = cos(b->optmaxdihedral / 180.0 * PI); + cossmtdihed = cos(b->optminsmtdihed / 180.0 * PI); + cosslidihed = cos(b->optminslidihed / 180.0 * PI); + + int attrnum = numelemattrib - 1; + + // Put all bad tetrahedra into array. + tetrahedrons->traversalinit(); + checktet.tet = tetrahedrontraverse(); + while (checktet.tet != NULL) { + if (b->convex) { // -c + // Skip this tet if it lies in the exterior. + if (elemattribute(checktet.tet, attrnum) == -1.0) { + checktet.tet = tetrahedrontraverse(); + continue; + } + } + ppt = (point *) & (checktet.tet[4]); + tetalldihedral(ppt[0], ppt[1], ppt[2], ppt[3], ncosdd, &maxdd, NULL); + if (maxdd < cosmaxdihed) { + // There are bad dihedral angles in this tet. + unflipqueue->newindex((void **) &parybface); + parybface->tt.tet = checktet.tet; + parybface->tt.ver = 11; + parybface->forg = ppt[0]; + parybface->fdest = ppt[1]; + parybface->fapex = ppt[2]; + parybface->foppo = ppt[3]; + parybface->key = maxdd; + for (n = 0; n < 6; n++) { + parybface->cent[n] = ncosdd[n]; + } + } + checktet.tet = tetrahedrontraverse(); + } + + totalremcount = improvequalitybyflips(); + + if ((unflipqueue->objects > 0l) && + ((b->optscheme & 2) || (b->optscheme & 4))) { + // The pool is only used by removeslivers(). + badtetrahedrons = new memorypool(sizeof(triface), b->tetrahedraperblock, + sizeof(void *), 0); + + // Smoothing options. + opm.min_max_dihedangle = 1; + opm.numofsearchdirs = 10; + // opm.searchstep = 0.001; + opm.maxiter = 30; // Limit the maximum iterations. + //opm.checkencflag = 4; // Queue affected tets after smoothing. + chkencflag = 4; // Queue affected tets after splitting a sliver. + iter = 0; + + while (iter < optpasses) { + smtcount = sptcount = remcount = 0l; + if (b->optscheme & 2) { + smtcount += improvequalitybysmoothing(&opm); + totalsmtcount += smtcount; + if (smtcount > 0l) { + remcount = improvequalitybyflips(); + totalremcount += remcount; + } + } + if (unflipqueue->objects > 0l) { + if (b->optscheme & 4) { + sptcount += removeslivers(chkencflag); + totalsptcount += sptcount; + if (sptcount > 0l) { + remcount = improvequalitybyflips(); + totalremcount += remcount; + } + } + } + if (unflipqueue->objects > 0l) { + if (remcount > 0l) { + iter++; + } else { + break; + } + } else { + break; + } + } // while (iter) + + delete badtetrahedrons; + badtetrahedrons = NULL; + } + + if (unflipqueue->objects > 0l) { + if (b->verbose > 1) { + printf(" %ld bad tets remained.\n", unflipqueue->objects); + } + unflipqueue->restart(); + } + + if (b->verbose) { + if (totalremcount > 0l) { + printf(" Removed %ld edges.\n", totalremcount); + } + if (totalsmtcount > 0l) { + printf(" Smoothed %ld points.\n", totalsmtcount); + } + if (totalsptcount > 0l) { + printf(" Split %ld slivers.\n", totalsptcount); + } + } +} + +//// //// +//// //// +//// optimize_cxx ///////////////////////////////////////////////////////////// + +//// meshstat_cxx ///////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// printfcomma() Print a (large) number with the 'thousands separator'. // +// // +// The following code was simply copied from "stackoverflow". // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::printfcomma(unsigned long n) +{ + unsigned long n2 = 0; + int scale = 1; + while (n >= 1000) { + n2 = n2 + scale * (n % 1000); + n /= 1000; + scale *= 1000; + } + printf ("%ld", n); + while (scale != 1) { + scale /= 1000; + n = n2 / scale; + n2 = n2 % scale; + printf (",%03ld", n); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// checkmesh() Test the mesh for topological consistency. // +// // +// If 'topoflag' is set, only check the topological connection of the mesh, // +// i.e., do not report degenerated or inverted elements. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checkmesh(int topoflag) +{ + triface tetloop, neightet, symtet; + point pa, pb, pc, pd; + REAL ori; + int horrors, i; + + if (!b->quiet) { + printf(" Checking consistency of mesh...\n"); + } + + horrors = 0; + tetloop.ver = 0; + // Run through the list of tetrahedra, checking each one. + tetrahedrons->traversalinit(); + tetloop.tet = alltetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + // Check all four faces of the tetrahedron. + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + pa = org(tetloop); + pb = dest(tetloop); + pc = apex(tetloop); + pd = oppo(tetloop); + if (tetloop.ver == 0) { // Only test for inversion once. + if (!ishulltet(tetloop)) { // Only do test if it is not a hull tet. + if (!topoflag) { + ori = orient3d(pa, pb, pc, pd); + if (ori >= 0.0) { + printf(" !! !! %s ", ori > 0.0 ? "Inverted" : "Degenerated"); + printf(" (%d, %d, %d, %d) (ori = %.17g)\n", pointmark(pa), + pointmark(pb), pointmark(pc), pointmark(pd), ori); + horrors++; + } + } + } + if (infected(tetloop)) { + // This may be a bug. Report it. + printf(" !! (%d, %d, %d, %d) is infected.\n", pointmark(pa), + pointmark(pb), pointmark(pc), pointmark(pd)); + horrors++; + } + if (marktested(tetloop)) { + // This may be a bug. Report it. + printf(" !! (%d, %d, %d, %d) is marked.\n", pointmark(pa), + pointmark(pb), pointmark(pc), pointmark(pd)); + horrors++; + } + } + if (tetloop.tet[tetloop.ver] == NULL) { + printf(" !! !! No neighbor at face (%d, %d, %d).\n", pointmark(pa), + pointmark(pb), pointmark(pc)); + horrors++; + } else { + // Find the neighboring tetrahedron on this face. + fsym(tetloop, neightet); + if (neightet.tet != NULL) { + // Check that the tetrahedron's neighbor knows it's a neighbor. + fsym(neightet, symtet); + if ((tetloop.tet != symtet.tet) || (tetloop.ver != symtet.ver)) { + printf(" !! !! Asymmetric tetra-tetra bond:\n"); + if (tetloop.tet == symtet.tet) { + printf(" (Right tetrahedron, wrong orientation)\n"); + } + printf(" First: (%d, %d, %d, %d)\n", pointmark(pa), + pointmark(pb), pointmark(pc), pointmark(pd)); + printf(" Second: (%d, %d, %d, %d)\n", pointmark(org(neightet)), + pointmark(dest(neightet)), pointmark(apex(neightet)), + pointmark(oppo(neightet))); + horrors++; + } + // Check if they have the same edge (the bond() operation). + if ((org(neightet) != pb) || (dest(neightet) != pa)) { + printf(" !! !! Wrong edge-edge bond:\n"); + printf(" First: (%d, %d, %d, %d)\n", pointmark(pa), + pointmark(pb), pointmark(pc), pointmark(pd)); + printf(" Second: (%d, %d, %d, %d)\n", pointmark(org(neightet)), + pointmark(dest(neightet)), pointmark(apex(neightet)), + pointmark(oppo(neightet))); + horrors++; + } + // Check if they have the same apex. + if (apex(neightet) != pc) { + printf(" !! !! Wrong face-face bond:\n"); + printf(" First: (%d, %d, %d, %d)\n", pointmark(pa), + pointmark(pb), pointmark(pc), pointmark(pd)); + printf(" Second: (%d, %d, %d, %d)\n", pointmark(org(neightet)), + pointmark(dest(neightet)), pointmark(apex(neightet)), + pointmark(oppo(neightet))); + horrors++; + } + // Check if they have the same opposite. + if (oppo(neightet) == pd) { + printf(" !! !! Two identical tetra:\n"); + printf(" First: (%d, %d, %d, %d)\n", pointmark(pa), + pointmark(pb), pointmark(pc), pointmark(pd)); + printf(" Second: (%d, %d, %d, %d)\n", pointmark(org(neightet)), + pointmark(dest(neightet)), pointmark(apex(neightet)), + pointmark(oppo(neightet))); + horrors++; + } + } else { + printf(" !! !! Tet-face has no neighbor (%d, %d, %d) - %d:\n", + pointmark(pa), pointmark(pb), pointmark(pc), pointmark(pd)); + horrors++; + } + } + if (facemarked(tetloop)) { + // This may be a bug. Report it. + printf(" !! tetface (%d, %d, %d) %d is marked.\n", pointmark(pa), + pointmark(pb), pointmark(pc), pointmark(pd)); + } + } + // Check the six edges of this tet. + for (i = 0; i < 6; i++) { + tetloop.ver = edge2ver[i]; + if (edgemarked(tetloop)) { + // This may be a bug. Report it. + printf(" !! tetedge (%d, %d) %d, %d is marked.\n", + pointmark(org(tetloop)), pointmark(dest(tetloop)), + pointmark(apex(tetloop)), pointmark(oppo(tetloop))); + } + } + tetloop.tet = alltetrahedrontraverse(); + } + if (horrors == 0) { + if (!b->quiet) { + printf(" In my studied opinion, the mesh appears to be consistent.\n"); + } + } else { + printf(" !! !! !! !! %d %s witnessed.\n", horrors, + horrors > 1 ? "abnormity" : "abnormities"); + } + + return horrors; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// checkshells() Test the boundary mesh for topological consistency. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checkshells() +{ + triface neightet, symtet; + face shloop, spinsh, nextsh; + face checkseg; + point pa, pb; + int bakcount; + int horrors, i; + + if (!b->quiet) { + printf(" Checking consistency of the mesh boundary...\n"); + } + horrors = 0; + + void **bakpathblock = subfaces->pathblock; + void *bakpathitem = subfaces->pathitem; + int bakpathitemsleft = subfaces->pathitemsleft; + int bakalignbytes = subfaces->alignbytes; + + subfaces->traversalinit(); + shloop.sh = shellfacetraverse(subfaces); + while (shloop.sh != NULL) { + shloop.shver = 0; + for (i = 0; i < 3; i++) { + // Check the face ring at this edge. + pa = sorg(shloop); + pb = sdest(shloop); + spinsh = shloop; + spivot(spinsh, nextsh); + bakcount = horrors; + while ((nextsh.sh != NULL) && (nextsh.sh != shloop.sh)) { + if (nextsh.sh[3] == NULL) { + printf(" !! !! Wrong subface-subface connection (Dead subface).\n"); + printf(" First: x%lx (%d, %d, %d).\n", (uintptr_t) spinsh.sh, + pointmark(sorg(spinsh)), pointmark(sdest(spinsh)), + pointmark(sapex(spinsh))); + printf(" Second: x%lx (DEAD)\n", (uintptr_t) nextsh.sh); + horrors++; + break; + } + // check if they have the same edge. + if (!(((sorg(nextsh) == pa) && (sdest(nextsh) == pb)) || + ((sorg(nextsh) == pb) && (sdest(nextsh) == pa)))) { + printf(" !! !! Wrong subface-subface connection.\n"); + printf(" First: x%lx (%d, %d, %d).\n", (uintptr_t) spinsh.sh, + pointmark(sorg(spinsh)), pointmark(sdest(spinsh)), + pointmark(sapex(spinsh))); + printf(" Scond: x%lx (%d, %d, %d).\n", (uintptr_t) nextsh.sh, + pointmark(sorg(nextsh)), pointmark(sdest(nextsh)), + pointmark(sapex(nextsh))); + horrors++; + break; + } + // Check they should not have the same apex. + if (sapex(nextsh) == sapex(spinsh)) { + printf(" !! !! Existing two duplicated subfaces.\n"); + printf(" First: x%lx (%d, %d, %d).\n", (uintptr_t) spinsh.sh, + pointmark(sorg(spinsh)), pointmark(sdest(spinsh)), + pointmark(sapex(spinsh))); + printf(" Scond: x%lx (%d, %d, %d).\n", (uintptr_t) nextsh.sh, + pointmark(sorg(nextsh)), pointmark(sdest(nextsh)), + pointmark(sapex(nextsh))); + horrors++; + break; + } + spinsh = nextsh; + spivot(spinsh, nextsh); + } + // Check subface-subseg bond. + sspivot(shloop, checkseg); + if (checkseg.sh != NULL) { + if (checkseg.sh[3] == NULL) { + printf(" !! !! Wrong subface-subseg connection (Dead subseg).\n"); + printf(" Sub: x%lx (%d, %d, %d).\n", (uintptr_t) shloop.sh, + pointmark(sorg(shloop)), pointmark(sdest(shloop)), + pointmark(sapex(shloop))); + printf(" Sub: x%lx (Dead)\n", (uintptr_t) checkseg.sh); + horrors++; + } else { + if (!(((sorg(checkseg) == pa) && (sdest(checkseg) == pb)) || + ((sorg(checkseg) == pb) && (sdest(checkseg) == pa)))) { + printf(" !! !! Wrong subface-subseg connection.\n"); + printf(" Sub: x%lx (%d, %d, %d).\n", (uintptr_t) shloop.sh, + pointmark(sorg(shloop)), pointmark(sdest(shloop)), + pointmark(sapex(shloop))); + printf(" Seg: x%lx (%d, %d).\n", (uintptr_t) checkseg.sh, + pointmark(sorg(checkseg)), pointmark(sdest(checkseg))); + horrors++; + } + } + } + if (horrors > bakcount) break; // An error detected. + senextself(shloop); + } + // Check tet-subface connection. + stpivot(shloop, neightet); + if (neightet.tet != NULL) { + if (neightet.tet[4] == NULL) { + printf(" !! !! Wrong sub-to-tet connection (Dead tet)\n"); + printf(" Sub: x%lx (%d, %d, %d).\n", (uintptr_t) shloop.sh, + pointmark(sorg(shloop)), pointmark(sdest(shloop)), + pointmark(sapex(shloop))); + printf(" Tet: x%lx (DEAD)\n", (uintptr_t) neightet.tet); + horrors++; + } else { + if (!((sorg(shloop) == org(neightet)) && + (sdest(shloop) == dest(neightet)))) { + printf(" !! !! Wrong sub-to-tet connection\n"); + printf(" Sub: x%lx (%d, %d, %d).\n", (uintptr_t) shloop.sh, + pointmark(sorg(shloop)), pointmark(sdest(shloop)), + pointmark(sapex(shloop))); + printf(" Tet: x%lx (%d, %d, %d, %d).\n", + (uintptr_t) neightet.tet, pointmark(org(neightet)), + pointmark(dest(neightet)), pointmark(apex(neightet)), + pointmark(oppo(neightet))); + horrors++; + } + tspivot(neightet, spinsh); + if (!((sorg(spinsh) == org(neightet)) && + (sdest(spinsh) == dest(neightet)))) { + printf(" !! !! Wrong tet-sub connection.\n"); + printf(" Sub: x%lx (%d, %d, %d).\n", (uintptr_t) spinsh.sh, + pointmark(sorg(spinsh)), pointmark(sdest(spinsh)), + pointmark(sapex(spinsh))); + printf(" Tet: x%lx (%d, %d, %d, %d).\n", + (uintptr_t) neightet.tet, pointmark(org(neightet)), + pointmark(dest(neightet)), pointmark(apex(neightet)), + pointmark(oppo(neightet))); + horrors++; + } + fsym(neightet, symtet); + tspivot(symtet, spinsh); + if (spinsh.sh != NULL) { + if (!((sorg(spinsh) == org(symtet)) && + (sdest(spinsh) == dest(symtet)))) { + printf(" !! !! Wrong tet-sub connection.\n"); + printf(" Sub: x%lx (%d, %d, %d).\n", (uintptr_t) spinsh.sh, + pointmark(sorg(spinsh)), pointmark(sdest(spinsh)), + pointmark(sapex(spinsh))); + printf(" Tet: x%lx (%d, %d, %d, %d).\n", + (uintptr_t) symtet.tet, pointmark(org(symtet)), + pointmark(dest(symtet)), pointmark(apex(symtet)), + pointmark(oppo(symtet))); + horrors++; + } + } else { + printf(" Warning: Broken tet-sub-tet connection.\n"); + } + } + } + if (sinfected(shloop)) { + // This may be a bug. report it. + printf(" !! A infected subface: (%d, %d, %d).\n", + pointmark(sorg(shloop)), pointmark(sdest(shloop)), + pointmark(sapex(shloop))); + } + if (smarktested(shloop)) { + // This may be a bug. report it. + printf(" !! A marked subface: (%d, %d, %d).\n", pointmark(sorg(shloop)), + pointmark(sdest(shloop)), pointmark(sapex(shloop))); + } + shloop.sh = shellfacetraverse(subfaces); + } + + if (horrors == 0) { + if (!b->quiet) { + printf(" Mesh boundaries connected correctly.\n"); + } + } else { + printf(" !! !! !! !! %d boundary connection viewed with horror.\n", + horrors); + } + + subfaces->pathblock = bakpathblock; + subfaces->pathitem = bakpathitem; + subfaces->pathitemsleft = bakpathitemsleft; + subfaces->alignbytes = bakalignbytes; + + return horrors; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// checksegments() Check the connections between tetrahedra and segments. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checksegments() +{ + triface tetloop, neightet, spintet; + shellface *segs; + face neighsh, spinsh, checksh; + face sseg, checkseg; + point pa, pb; + int miscount; + int t1ver; + int horrors, i; + + + if (!b->quiet) { + printf(" Checking tet->seg connections...\n"); + } + + horrors = 0; + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != NULL) { + // Loop the six edges of the tet. + if (tetloop.tet[8] != NULL) { + segs = (shellface *) tetloop.tet[8]; + for (i = 0; i < 6; i++) { + sdecode(segs[i], sseg); + if (sseg.sh != NULL) { + // Get the edge of the tet. + tetloop.ver = edge2ver[i]; + // Check if they are the same edge. + pa = (point) sseg.sh[3]; + pb = (point) sseg.sh[4]; + if (!(((org(tetloop) == pa) && (dest(tetloop) == pb)) || + ((org(tetloop) == pb) && (dest(tetloop) == pa)))) { + printf(" !! Wrong tet-seg connection.\n"); + printf(" Tet: x%lx (%d, %d, %d, %d) - Seg: x%lx (%d, %d).\n", + (uintptr_t) tetloop.tet, pointmark(org(tetloop)), + pointmark(dest(tetloop)), pointmark(apex(tetloop)), + pointmark(oppo(tetloop)), (uintptr_t) sseg.sh, + pointmark(pa), pointmark(pb)); + horrors++; + } else { + // Loop all tets sharing at this edge. + neightet = tetloop; + do { + tsspivot1(neightet, checkseg); + if (checkseg.sh != sseg.sh) { + printf(" !! Wrong tet->seg connection.\n"); + printf(" Tet: x%lx (%d, %d, %d, %d) - ", + (uintptr_t) neightet.tet, pointmark(org(neightet)), + pointmark(dest(neightet)), pointmark(apex(neightet)), + pointmark(oppo(neightet))); + if (checkseg.sh != NULL) { + printf("Seg x%lx (%d, %d).\n", (uintptr_t) checkseg.sh, + pointmark(sorg(checkseg)),pointmark(sdest(checkseg))); + } else { + printf("Seg: NULL.\n"); + } + horrors++; + } + fnextself(neightet); + } while (neightet.tet != tetloop.tet); + } + // Check the seg->tet pointer. + sstpivot1(sseg, neightet); + if (neightet.tet == NULL) { + printf(" !! Wrong seg->tet connection (A NULL tet).\n"); + horrors++; + } else { + if (!(((org(neightet) == pa) && (dest(neightet) == pb)) || + ((org(neightet) == pb) && (dest(neightet) == pa)))) { + printf(" !! Wrong seg->tet connection (Wrong edge).\n"); + printf(" Tet: x%lx (%d, %d, %d, %d) - Seg: x%lx (%d, %d).\n", + (uintptr_t) neightet.tet, pointmark(org(neightet)), + pointmark(dest(neightet)), pointmark(apex(neightet)), + pointmark(oppo(neightet)), (uintptr_t) sseg.sh, + pointmark(pa), pointmark(pb)); + horrors++; + } + } + } + } + } + // Loop the six edge of this tet. + neightet.tet = tetloop.tet; + for (i = 0; i < 6; i++) { + neightet.ver = edge2ver[i]; + if (edgemarked(neightet)) { + // A possible bug. Report it. + printf(" !! A marked edge: (%d, %d, %d, %d) -- x%lx %d.\n", + pointmark(org(neightet)), pointmark(dest(neightet)), + pointmark(apex(neightet)), pointmark(oppo(neightet)), + (uintptr_t) neightet.tet, neightet.ver); + // Check if all tets at the edge are marked. + spintet = neightet; + while (1) { + fnextself(spintet); + if (!edgemarked(spintet)) { + printf(" !! !! An unmarked edge (%d, %d, %d, %d) -- x%lx %d.\n", + pointmark(org(spintet)), pointmark(dest(spintet)), + pointmark(apex(spintet)), pointmark(oppo(spintet)), + (uintptr_t) spintet.tet, spintet.ver); + horrors++; + } + if (spintet.tet == neightet.tet) break; + } + } + } + tetloop.tet = tetrahedrontraverse(); + } + + if (!b->quiet) { + printf(" Checking seg->tet connections...\n"); + } + + miscount = 0; // Count the number of unrecovered segments. + subsegs->traversalinit(); + sseg.shver = 0; + sseg.sh = shellfacetraverse(subsegs); + while (sseg.sh != NULL) { + pa = sorg(sseg); + pb = sdest(sseg); + spivot(sseg, neighsh); + if (neighsh.sh != NULL) { + spinsh = neighsh; + while (1) { + // Check seg-subface bond. + if (((sorg(spinsh) == pa) && (sdest(spinsh) == pb)) || + ((sorg(spinsh) == pb) && (sdest(spinsh) == pa))) { + // Keep the same rotate direction. + //if (sorg(spinsh) != pa) { + // sesymself(spinsh); + // printf(" !! Wrong ori at subface (%d, %d, %d) -- x%lx %d\n", + // pointmark(sorg(spinsh)), pointmark(sdest(spinsh)), + // pointmark(sapex(spinsh)), (uintptr_t) spinsh.sh, + // spinsh.shver); + // horrors++; + //} + stpivot(spinsh, spintet); + if (spintet.tet != NULL) { + // Check if all tets at this segment. + while (1) { + tsspivot1(spintet, checkseg); + if (checkseg.sh == NULL) { + printf(" !! !! No seg at tet (%d, %d, %d, %d) -- x%lx %d\n", + pointmark(org(spintet)), pointmark(dest(spintet)), + pointmark(apex(spintet)), pointmark(oppo(spintet)), + (uintptr_t) spintet.tet, spintet.ver); + horrors++; + } + if (checkseg.sh != sseg.sh) { + printf(" !! !! Wrong seg (%d, %d) at tet (%d, %d, %d, %d)\n", + pointmark(sorg(checkseg)), pointmark(sdest(checkseg)), + pointmark(org(spintet)), pointmark(dest(spintet)), + pointmark(apex(spintet)), pointmark(oppo(spintet))); + horrors++; + } + fnextself(spintet); + // Stop at the next subface. + tspivot(spintet, checksh); + if (checksh.sh != NULL) break; + } // while (1) + } + } else { + printf(" !! Wrong seg-subface (%d, %d, %d) -- x%lx %d connect\n", + pointmark(sorg(spinsh)), pointmark(sdest(spinsh)), + pointmark(sapex(spinsh)), (uintptr_t) spinsh.sh, + spinsh.shver); + horrors++; + break; + } // if pa, pb + spivotself(spinsh); + if (spinsh.sh == NULL) break; // A dangling segment. + if (spinsh.sh == neighsh.sh) break; + } // while (1) + } // if (neighsh.sh != NULL) + // Count the number of "un-recovered" segments. + sstpivot1(sseg, neightet); + if (neightet.tet == NULL) { + miscount++; + } + sseg.sh = shellfacetraverse(subsegs); + } + + if (!b->quiet) { + printf(" Checking seg->seg connections...\n"); + } + + points->traversalinit(); + pa = pointtraverse(); + while (pa != NULL) { + if (pointtype(pa) == FREESEGVERTEX) { + // There should be two subsegments connected at 'pa'. + // Get a subsegment containing 'pa'. + sdecode(point2sh(pa), sseg); + if ((sseg.sh == NULL) || sseg.sh[3] == NULL) { + printf(" !! Dead point-to-seg pointer at point %d.\n", + pointmark(pa)); + horrors++; + } else { + sseg.shver = 0; + if (sorg(sseg) != pa) { + if (sdest(sseg) != pa) { + printf(" !! Wrong point-to-seg pointer at point %d.\n", + pointmark(pa)); + horrors++; + } else { + // Find the next subsegment at 'pa'. + senext(sseg, checkseg); + if ((checkseg.sh == NULL) || (checkseg.sh[3] == NULL)) { + printf(" !! Dead seg-seg connection at point %d.\n", + pointmark(pa)); + horrors++; + } else { + spivotself(checkseg); + checkseg.shver = 0; + if ((sorg(checkseg) != pa) && (sdest(checkseg) != pa)) { + printf(" !! Wrong seg-seg connection at point %d.\n", + pointmark(pa)); + horrors++; + } + } + } + } else { + // Find the previous subsegment at 'pa'. + senext2(sseg, checkseg); + if ((checkseg.sh == NULL) || (checkseg.sh[3] == NULL)) { + printf(" !! Dead seg-seg connection at point %d.\n", + pointmark(pa)); + horrors++; + } else { + spivotself(checkseg); + checkseg.shver = 0; + if ((sorg(checkseg) != pa) && (sdest(checkseg) != pa)) { + printf(" !! Wrong seg-seg connection at point %d.\n", + pointmark(pa)); + horrors++; + } + } + } + } + } + pa = pointtraverse(); + } + + if (horrors == 0) { + printf(" Segments are connected properly.\n"); + } else { + printf(" !! !! !! !! Found %d missing connections.\n", horrors); + } + if (miscount > 0) { + printf(" !! !! Found %d missing segments.\n", miscount); + } + + return horrors; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// checkdelaunay() Ensure that the mesh is (constrained) Delaunay. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checkdelaunay(int perturb) +{ + triface tetloop; + triface symtet; + face checksh; + point pa, pb, pc, pd, pe; + REAL sign; + int ndcount; // Count the non-locally Delaunay faces. + int horrors; + + if (!b->quiet) { + printf(" Checking Delaunay property of the mesh...\n"); + } + + ndcount = 0; + horrors = 0; + tetloop.ver = 0; + // Run through the list of triangles, checking each one. + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + // Check all four faces of the tetrahedron. + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + fsym(tetloop, symtet); + // Only do test if its adjoining tet is not a hull tet or its pointer + // is larger (to ensure that each pair isn't tested twice). + if (((point) symtet.tet[7] != dummypoint)&&(tetloop.tet < symtet.tet)) { + pa = org(tetloop); + pb = dest(tetloop); + pc = apex(tetloop); + pd = oppo(tetloop); + pe = oppo(symtet); + if (perturb) { + sign = insphere_s(pa, pb, pc, pd, pe); + } else { + sign = insphere(pa, pb, pc, pd, pe); + } + if (sign < 0.0) { + ndcount++; + if (checksubfaceflag) { + tspivot(tetloop, checksh); + } + if (checksh.sh == NULL) { + printf(" !! Non-locally Delaunay (%d, %d, %d) - %d, %d\n", + pointmark(pa), pointmark(pb), pointmark(pc), pointmark(pd), + pointmark(pe)); + horrors++; + } + } + } + } + tetloop.tet = tetrahedrontraverse(); + } + + if (horrors == 0) { + if (!b->quiet) { + if (ndcount > 0) { + printf(" The mesh is constrained Delaunay.\n"); + } else { + printf(" The mesh is Delaunay.\n"); + } + } + } else { + printf(" !! !! !! !! Found %d non-Delaunay faces.\n", horrors); + } + + return horrors; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// Check if the current tetrahedralization is (constrained) regular. // +// // +// The parameter 'type' determines which regularity should be checked: // +// - 0: check the Delaunay property. // +// - 1: check the Delaunay property with symbolic perturbation. // +// - 2: check the regular property, the weights are stored in p[3]. // +// - 3: check the regular property with symbolic perturbation. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checkregular(int type) +{ + triface tetloop; + triface symtet; + face checksh; + point p[5]; + REAL sign; + int ndcount; // Count the non-locally Delaunay faces. + int horrors; + + if (!b->quiet) { + printf(" Checking %s %s property of the mesh...\n", + (type & 2) == 0 ? "Delaunay" : "regular", + (type & 1) == 0 ? " " : "(s)"); + } + + // Make sure orient3d(p[1], p[0], p[2], p[3]) > 0; + // Hence if (insphere(p[1], p[0], p[2], p[3], p[4]) > 0) means that + // p[4] lies inside the circumsphere of p[1], p[0], p[2], p[3]. + // The same if orient4d(p[1], p[0], p[2], p[3], p[4]) > 0 means that + // p[4] lies below the oriented hyperplane passing through + // p[1], p[0], p[2], p[3]. + + ndcount = 0; + horrors = 0; + tetloop.ver = 0; + // Run through the list of triangles, checking each one. + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + // Check all four faces of the tetrahedron. + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + fsym(tetloop, symtet); + // Only do test if its adjoining tet is not a hull tet or its pointer + // is larger (to ensure that each pair isn't tested twice). + if (((point) symtet.tet[7] != dummypoint)&&(tetloop.tet < symtet.tet)) { + p[0] = org(tetloop); // pa + p[1] = dest(tetloop); // pb + p[2] = apex(tetloop); // pc + p[3] = oppo(tetloop); // pd + p[4] = oppo(symtet); // pe + + if (type == 0) { + sign = insphere(p[1], p[0], p[2], p[3], p[4]); + } else if (type == 1) { + sign = insphere_s(p[1], p[0], p[2], p[3], p[4]); + } else if (type == 2) { + sign = orient4d(p[1], p[0], p[2], p[3], p[4], + p[1][3], p[0][3], p[2][3], p[3][3], p[4][3]); + } else { // type == 3 + sign = orient4d_s(p[1], p[0], p[2], p[3], p[4], + p[1][3], p[0][3], p[2][3], p[3][3], p[4][3]); + } + + if (sign > 0.0) { + ndcount++; + if (checksubfaceflag) { + tspivot(tetloop, checksh); + } + if (checksh.sh == NULL) { + printf(" !! Non-locally %s (%d, %d, %d) - %d, %d\n", + (type & 2) == 0 ? "Delaunay" : "regular", + pointmark(p[0]), pointmark(p[1]), pointmark(p[2]), + pointmark(p[3]), pointmark(p[4])); + horrors++; + } + } + } + } + tetloop.tet = tetrahedrontraverse(); + } + + if (horrors == 0) { + if (!b->quiet) { + if (ndcount > 0) { + printf(" The mesh is constrained %s.\n", + (type & 2) == 0 ? "Delaunay" : "regular"); + } else { + printf(" The mesh is %s.\n", (type & 2) == 0 ? "Delaunay" : "regular"); + } + } + } else { + printf(" !! !! !! !! Found %d non-%s faces.\n", horrors, + (type & 2) == 0 ? "Delaunay" : "regular"); + } + + return horrors; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// checkconforming() Ensure that the mesh is conforming Delaunay. // +// // +// If 'flag' is 1, only check subsegments. If 'flag' is 2, check subfaces. // +// If 'flag' is 3, check both subsegments and subfaces. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int tetgenmesh::checkconforming(int flag) +{ + triface searchtet, neightet, spintet; + face shloop; + face segloop; + point eorg, edest, eapex, pa, pb, pc; + REAL cent[3], radius, dist, diff, rd, len; + bool enq; + int encsubsegs, encsubfaces; + int t1ver; + int i; + + REAL A[4][4], rhs[4], D; + int indx[4]; + REAL elen[3]; + + encsubsegs = 0; + + if (flag & 1) { + if (!b->quiet) { + printf(" Checking conforming property of segments...\n"); + } + encsubsegs = 0; + + // Run through the list of subsegments, check each one. + subsegs->traversalinit(); + segloop.sh = shellfacetraverse(subsegs); + while (segloop.sh != (shellface *) NULL) { + eorg = (point) segloop.sh[3]; + edest = (point) segloop.sh[4]; + radius = 0.5 * distance(eorg, edest); + for (i = 0; i < 3; i++) cent[i] = 0.5 * (eorg[i] + edest[i]); + + enq = false; + sstpivot1(segloop, neightet); + if (neightet.tet != NULL) { + spintet = neightet; + while (1) { + eapex= apex(spintet); + if (eapex != dummypoint) { + dist = distance(eapex, cent); + diff = dist - radius; + if (fabs(diff) / radius <= b->epsilon) diff = 0.0; // Rounding. + if (diff < 0) { + enq = true; break; + } + } + fnextself(spintet); + if (spintet.tet == neightet.tet) break; + } + } + if (enq) { + printf(" !! !! Non-conforming segment: (%d, %d)\n", + pointmark(eorg), pointmark(edest)); + encsubsegs++; + } + segloop.sh = shellfacetraverse(subsegs); + } + + if (encsubsegs == 0) { + if (!b->quiet) { + printf(" The segments are conforming Delaunay.\n"); + } + } else { + printf(" !! !! %d subsegments are non-conforming.\n", encsubsegs); + } + } // if (flag & 1) + + encsubfaces = 0; + + if (flag & 2) { + if (!b->quiet) { + printf(" Checking conforming property of subfaces...\n"); + } + + // Run through the list of subfaces, check each one. + subfaces->traversalinit(); + shloop.sh = shellfacetraverse(subfaces); + while (shloop.sh != (shellface *) NULL) { + pa = (point) shloop.sh[3]; + pb = (point) shloop.sh[4]; + pc = (point) shloop.sh[5]; + + // Compute the coefficient matrix A (3x3). + A[0][0] = pb[0] - pa[0]; + A[0][1] = pb[1] - pa[1]; + A[0][2] = pb[2] - pa[2]; // vector V1 (pa->pb) + A[1][0] = pc[0] - pa[0]; + A[1][1] = pc[1] - pa[1]; + A[1][2] = pc[2] - pa[2]; // vector V2 (pa->pc) + cross(A[0], A[1], A[2]); // vector V3 (V1 X V2) + + // Compute the right hand side vector b (3x1). + elen[0] = dot(A[0], A[0]); + elen[1] = dot(A[1], A[1]); + rhs[0] = 0.5 * elen[0]; + rhs[1] = 0.5 * elen[1]; + rhs[2] = 0.0; + + if (lu_decmp(A, 3, indx, &D, 0)) { + lu_solve(A, 3, indx, rhs, 0); + cent[0] = pa[0] + rhs[0]; + cent[1] = pa[1] + rhs[1]; + cent[2] = pa[2] + rhs[2]; + rd = sqrt(rhs[0] * rhs[0] + rhs[1] * rhs[1] + rhs[2] * rhs[2]); + + // Check if this subface is encroached. + for (i = 0; i < 2; i++) { + stpivot(shloop, searchtet); + if (!ishulltet(searchtet)) { + len = distance(oppo(searchtet), cent); + if ((fabs(len - rd) / rd) < b->epsilon) len = rd; // Rounding. + if (len < rd) { + printf(" !! !! Non-conforming subface: (%d, %d, %d)\n", + pointmark(pa), pointmark(pb), pointmark(pc)); + encsubfaces++; + enq = true; break; + } + } + sesymself(shloop); + } + } + shloop.sh = shellfacetraverse(subfaces); + } + + if (encsubfaces == 0) { + if (!b->quiet) { + printf(" The subfaces are conforming Delaunay.\n"); + } + } else { + printf(" !! !! %d subfaces are non-conforming.\n", encsubfaces); + } + } // if (flag & 2) + + return encsubsegs + encsubfaces; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// qualitystatistics() Print statistics about the quality of the mesh. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::qualitystatistics() +{ + triface tetloop, neightet; + point p[4]; + char sbuf[128]; + REAL radiusratiotable[12]; + REAL aspectratiotable[12]; + REAL A[4][4], rhs[4], D; + REAL V[6][3], N[4][3], H[4]; // edge-vectors, face-normals, face-heights. + REAL edgelength[6], alldihed[6], faceangle[3]; + REAL shortest, longest; + REAL smallestvolume, biggestvolume; + REAL smallestratio, biggestratio; + REAL smallestradiusratio, biggestradiusratio; // radius-edge ratio. + REAL smallestdiangle, biggestdiangle; + REAL smallestfaangle, biggestfaangle; + REAL total_tet_vol, total_tetprism_vol; + REAL tetvol, minaltitude; + REAL cirradius, minheightinv; // insradius; + REAL shortlen, longlen; + REAL tetaspect, tetradius; + REAL smalldiangle, bigdiangle; + REAL smallfaangle, bigfaangle; + unsigned long radiustable[12]; + unsigned long aspecttable[16]; + unsigned long dihedangletable[18]; + unsigned long faceangletable[18]; + int indx[4]; + int radiusindex; + int aspectindex; + int tendegree; + int i, j; + // Report the tet which has the biggest radius-edge ratio. + triface biggestradiusratiotet; + + printf("Mesh quality statistics:\n\n"); + + shortlen = longlen = 0.0; + smalldiangle = bigdiangle = 0.0; + total_tet_vol = 0.0; + total_tetprism_vol = 0.0; + + radiusratiotable[0] = 0.707; radiusratiotable[1] = 1.0; + radiusratiotable[2] = 1.1; radiusratiotable[3] = 1.2; + radiusratiotable[4] = 1.4; radiusratiotable[5] = 1.6; + radiusratiotable[6] = 1.8; radiusratiotable[7] = 2.0; + radiusratiotable[8] = 2.5; radiusratiotable[9] = 3.0; + radiusratiotable[10] = 10.0; radiusratiotable[11] = 0.0; + + aspectratiotable[0] = 1.5; aspectratiotable[1] = 2.0; + aspectratiotable[2] = 2.5; aspectratiotable[3] = 3.0; + aspectratiotable[4] = 4.0; aspectratiotable[5] = 6.0; + aspectratiotable[6] = 10.0; aspectratiotable[7] = 15.0; + aspectratiotable[8] = 25.0; aspectratiotable[9] = 50.0; + aspectratiotable[10] = 100.0; aspectratiotable[11] = 0.0; + + for (i = 0; i < 12; i++) radiustable[i] = 0l; + for (i = 0; i < 12; i++) aspecttable[i] = 0l; + for (i = 0; i < 18; i++) dihedangletable[i] = 0l; + for (i = 0; i < 18; i++) faceangletable[i] = 0l; + + minaltitude = xmax - xmin + ymax - ymin + zmax - zmin; + minaltitude = minaltitude * minaltitude; + shortest = minaltitude; + longest = 0.0; + smallestvolume = minaltitude; + biggestvolume = 0.0; + smallestratio = smallestradiusratio = 1e+16; // minaltitude; + biggestratio = biggestradiusratio = 0.0; + smallestdiangle = smallestfaangle = 180.0; + biggestdiangle = biggestfaangle = 0.0; + + + int attrnum = numelemattrib - 1; + + // Loop all elements, calculate quality parameters for each element. + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + + if (b->convex) { + // Skip tets in the exterior. + if (elemattribute(tetloop.tet, attrnum) == -1.0) { + tetloop.tet = tetrahedrontraverse(); + continue; + } + } + + // Get four vertices: p0, p1, p2, p3. + for (i = 0; i < 4; i++) p[i] = (point) tetloop.tet[4 + i]; + + // Get the tet volume. + tetvol = orient3dfast(p[1], p[0], p[2], p[3]) / 6.0; + total_tet_vol += tetvol; + total_tetprism_vol += tetprismvol(p[0], p[1], p[2], p[3]); + + // Calculate the largest and smallest volume. + if (tetvol < smallestvolume) { + smallestvolume = tetvol; + } + if (tetvol > biggestvolume) { + biggestvolume = tetvol; + } + + // Set the edge vectors: V[0], ..., V[5] + for (i = 0; i < 3; i++) V[0][i] = p[0][i] - p[3][i]; // V[0]: p3->p0. + for (i = 0; i < 3; i++) V[1][i] = p[1][i] - p[3][i]; // V[1]: p3->p1. + for (i = 0; i < 3; i++) V[2][i] = p[2][i] - p[3][i]; // V[2]: p3->p2. + for (i = 0; i < 3; i++) V[3][i] = p[1][i] - p[0][i]; // V[3]: p0->p1. + for (i = 0; i < 3; i++) V[4][i] = p[2][i] - p[1][i]; // V[4]: p1->p2. + for (i = 0; i < 3; i++) V[5][i] = p[0][i] - p[2][i]; // V[5]: p2->p0. + + // Get the squares of the edge lengths. + for (i = 0; i < 6; i++) edgelength[i] = dot(V[i], V[i]); + + // Calculate the longest and shortest edge length. + for (i = 0; i < 6; i++) { + if (i == 0) { + shortlen = longlen = edgelength[i]; + } else { + shortlen = edgelength[i] < shortlen ? edgelength[i] : shortlen; + longlen = edgelength[i] > longlen ? edgelength[i] : longlen; + } + if (edgelength[i] > longest) { + longest = edgelength[i]; + } + if (edgelength[i] < shortest) { + shortest = edgelength[i]; + } + } + + // Set the matrix A = [V[0], V[1], V[2]]^T. + for (j = 0; j < 3; j++) { + for (i = 0; i < 3; i++) A[j][i] = V[j][i]; + } + + // Decompose A just once. + if (lu_decmp(A, 3, indx, &D, 0)) { + // Get the three faces normals. + for (j = 0; j < 3; j++) { + for (i = 0; i < 3; i++) rhs[i] = 0.0; + rhs[j] = 1.0; // Positive means the inside direction + lu_solve(A, 3, indx, rhs, 0); + for (i = 0; i < 3; i++) N[j][i] = rhs[i]; + } + // Get the fourth face normal by summing up the first three. + for (i = 0; i < 3; i++) N[3][i] = - N[0][i] - N[1][i] - N[2][i]; + // Get the radius of the circumsphere. + for (i = 0; i < 3; i++) rhs[i] = 0.5 * dot(V[i], V[i]); + lu_solve(A, 3, indx, rhs, 0); + cirradius = sqrt(dot(rhs, rhs)); + // Normalize the face normals. + for (i = 0; i < 4; i++) { + // H[i] is the inverse of height of its corresponding face. + H[i] = sqrt(dot(N[i], N[i])); + for (j = 0; j < 3; j++) N[i][j] /= H[i]; + } + // Get the radius of the inscribed sphere. + // insradius = 1.0 / (H[0] + H[1] + H[2] + H[3]); + // Get the biggest H[i] (corresponding to the smallest height). + minheightinv = H[0]; + for (i = 1; i < 4; i++) { + if (H[i] > minheightinv) minheightinv = H[i]; + } + } else { + // A nearly degenerated tet. + if (tetvol <= 0.0) { + printf(" !! Warning: A %s tet (%d,%d,%d,%d).\n", + tetvol < 0 ? "inverted" : "degenerated", pointmark(p[0]), + pointmark(p[1]), pointmark(p[2]), pointmark(p[3])); + // Skip it. + tetloop.tet = tetrahedrontraverse(); + continue; + } + // Calculate the four face normals. + facenormal(p[2], p[1], p[3], N[0], 1, NULL); + facenormal(p[0], p[2], p[3], N[1], 1, NULL); + facenormal(p[1], p[0], p[3], N[2], 1, NULL); + facenormal(p[0], p[1], p[2], N[3], 1, NULL); + // Normalize the face normals. + for (i = 0; i < 4; i++) { + // H[i] is the twice of the area of the face. + H[i] = sqrt(dot(N[i], N[i])); + for (j = 0; j < 3; j++) N[i][j] /= H[i]; + } + // Get the biggest H[i] / tetvol (corresponding to the smallest height). + minheightinv = (H[0] / tetvol); + for (i = 1; i < 4; i++) { + if ((H[i] / tetvol) > minheightinv) minheightinv = (H[i] / tetvol); + } + // Let the circumradius to be the half of its longest edge length. + cirradius = 0.5 * sqrt(longlen); + } + + // Get the dihedrals (in degree) at each edges. + j = 0; + for (i = 1; i < 4; i++) { + alldihed[j] = -dot(N[0], N[i]); // Edge cd, bd, bc. + if (alldihed[j] < -1.0) alldihed[j] = -1; // Rounding. + else if (alldihed[j] > 1.0) alldihed[j] = 1; + alldihed[j] = acos(alldihed[j]) / PI * 180.0; + j++; + } + for (i = 2; i < 4; i++) { + alldihed[j] = -dot(N[1], N[i]); // Edge ad, ac. + if (alldihed[j] < -1.0) alldihed[j] = -1; // Rounding. + else if (alldihed[j] > 1.0) alldihed[j] = 1; + alldihed[j] = acos(alldihed[j]) / PI * 180.0; + j++; + } + alldihed[j] = -dot(N[2], N[3]); // Edge ab. + if (alldihed[j] < -1.0) alldihed[j] = -1; // Rounding. + else if (alldihed[j] > 1.0) alldihed[j] = 1; + alldihed[j] = acos(alldihed[j]) / PI * 180.0; + + // Calculate the largest and smallest dihedral angles. + for (i = 0; i < 6; i++) { + if (i == 0) { + smalldiangle = bigdiangle = alldihed[i]; + } else { + smalldiangle = alldihed[i] < smalldiangle ? alldihed[i] : smalldiangle; + bigdiangle = alldihed[i] > bigdiangle ? alldihed[i] : bigdiangle; + } + if (alldihed[i] < smallestdiangle) { + smallestdiangle = alldihed[i]; + } + if (alldihed[i] > biggestdiangle) { + biggestdiangle = alldihed[i]; + } + // Accumulate the corresponding number in the dihedral angle histogram. + if (alldihed[i] < 5.0) { + tendegree = 0; + } else if (alldihed[i] >= 5.0 && alldihed[i] < 10.0) { + tendegree = 1; + } else if (alldihed[i] >= 80.0 && alldihed[i] < 110.0) { + tendegree = 9; // Angles between 80 to 110 degree are in one entry. + } else if (alldihed[i] >= 170.0 && alldihed[i] < 175.0) { + tendegree = 16; + } else if (alldihed[i] >= 175.0) { + tendegree = 17; + } else { + tendegree = (int) (alldihed[i] / 10.); + if (alldihed[i] < 80.0) { + tendegree++; // In the left column. + } else { + tendegree--; // In the right column. + } + } + dihedangletable[tendegree]++; + } + + + + // Calculate the largest and smallest face angles. + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + fsym(tetloop, neightet); + // Only do the calulation once for a face. + if (((point) neightet.tet[7] == dummypoint) || + (tetloop.tet < neightet.tet)) { + p[0] = org(tetloop); + p[1] = dest(tetloop); + p[2] = apex(tetloop); + faceangle[0] = interiorangle(p[0], p[1], p[2], NULL); + faceangle[1] = interiorangle(p[1], p[2], p[0], NULL); + faceangle[2] = PI - (faceangle[0] + faceangle[1]); + // Translate angles into degrees. + for (i = 0; i < 3; i++) { + faceangle[i] = (faceangle[i] * 180.0) / PI; + } + // Calculate the largest and smallest face angles. + for (i = 0; i < 3; i++) { + if (i == 0) { + smallfaangle = bigfaangle = faceangle[i]; + } else { + smallfaangle = faceangle[i] < smallfaangle ? + faceangle[i] : smallfaangle; + bigfaangle = faceangle[i] > bigfaangle ? faceangle[i] : bigfaangle; + } + if (faceangle[i] < smallestfaangle) { + smallestfaangle = faceangle[i]; + } + if (faceangle[i] > biggestfaangle) { + biggestfaangle = faceangle[i]; + } + tendegree = (int) (faceangle[i] / 10.); + faceangletable[tendegree]++; + } + } + } + + // Calculate aspect ratio and radius-edge ratio for this element. + tetradius = cirradius / sqrt(shortlen); + if (tetradius < smallestradiusratio) { + smallestradiusratio = tetradius; + } + if (tetradius > biggestradiusratio) { + biggestradiusratio = tetradius; + biggestradiusratiotet.tet = tetloop.tet; + } + // tetaspect = sqrt(longlen) / (2.0 * insradius); + tetaspect = sqrt(longlen) * minheightinv; + // Remember the largest and smallest aspect ratio. + if (tetaspect < smallestratio) { + smallestratio = tetaspect; + } + if (tetaspect > biggestratio) { + biggestratio = tetaspect; + } + // Accumulate the corresponding number in the aspect ratio histogram. + aspectindex = 0; + while ((tetaspect > aspectratiotable[aspectindex]) && (aspectindex < 11)) { + aspectindex++; + } + aspecttable[aspectindex]++; + radiusindex = 0; + while ((tetradius > radiusratiotable[radiusindex]) && (radiusindex < 11)) { + radiusindex++; + } + radiustable[radiusindex]++; + + tetloop.tet = tetrahedrontraverse(); + } + + shortest = sqrt(shortest); + longest = sqrt(longest); + minaltitude = sqrt(minaltitude); + + printf(" Smallest volume: %16.5g | Largest volume: %16.5g\n", + smallestvolume, biggestvolume); + printf(" Shortest edge: %16.5g | Longest edge: %16.5g\n", + shortest, longest); + printf(" Smallest asp.ratio: %13.5g | Largest asp.ratio: %13.5g\n", + smallestratio, biggestratio); + sprintf(sbuf, "%.17g", biggestfaangle); + if (strlen(sbuf) > 8) { + sbuf[8] = '\0'; + } + printf(" Smallest facangle: %14.5g | Largest facangle: %s\n", + smallestfaangle, sbuf); + sprintf(sbuf, "%.17g", biggestdiangle); + if (strlen(sbuf) > 8) { + sbuf[8] = '\0'; + } + printf(" Smallest dihedral: %14.5g | Largest dihedral: %s\n\n", + smallestdiangle, sbuf); + + printf(" Aspect ratio histogram:\n"); + printf(" < %-6.6g : %8ld | %6.6g - %-6.6g : %8ld\n", + aspectratiotable[0], aspecttable[0], aspectratiotable[5], + aspectratiotable[6], aspecttable[6]); + for (i = 1; i < 5; i++) { + printf(" %6.6g - %-6.6g : %8ld | %6.6g - %-6.6g : %8ld\n", + aspectratiotable[i - 1], aspectratiotable[i], aspecttable[i], + aspectratiotable[i + 5], aspectratiotable[i + 6], + aspecttable[i + 6]); + } + printf(" %6.6g - %-6.6g : %8ld | %6.6g - : %8ld\n", + aspectratiotable[4], aspectratiotable[5], aspecttable[5], + aspectratiotable[10], aspecttable[11]); + printf(" (A tetrahedron's aspect ratio is its longest edge length"); + printf(" divided by its\n"); + printf(" smallest side height)\n\n"); + + printf(" Face angle histogram:\n"); + for (i = 0; i < 9; i++) { + printf(" %3d - %3d degrees: %8ld | %3d - %3d degrees: %8ld\n", + i * 10, i * 10 + 10, faceangletable[i], + i * 10 + 90, i * 10 + 100, faceangletable[i + 9]); + } + if (minfaceang != PI) { + printf(" Minimum input face angle is %g (degree).\n", + minfaceang / PI * 180.0); + } + printf("\n"); + + printf(" Dihedral angle histogram:\n"); + // Print the three two rows: + printf(" %3d - %2d degrees: %8ld | %3d - %3d degrees: %8ld\n", + 0, 5, dihedangletable[0], 80, 110, dihedangletable[9]); + printf(" %3d - %2d degrees: %8ld | %3d - %3d degrees: %8ld\n", + 5, 10, dihedangletable[1], 110, 120, dihedangletable[10]); + // Print the third to seventh rows. + for (i = 2; i < 7; i++) { + printf(" %3d - %2d degrees: %8ld | %3d - %3d degrees: %8ld\n", + (i - 1) * 10, (i - 1) * 10 + 10, dihedangletable[i], + (i - 1) * 10 + 110, (i - 1) * 10 + 120, dihedangletable[i + 9]); + } + // Print the last two rows. + printf(" %3d - %2d degrees: %8ld | %3d - %3d degrees: %8ld\n", + 60, 70, dihedangletable[7], 170, 175, dihedangletable[16]); + printf(" %3d - %2d degrees: %8ld | %3d - %3d degrees: %8ld\n", + 70, 80, dihedangletable[8], 175, 180, dihedangletable[17]); + if (minfacetdihed != PI) { + printf(" Minimum input dihedral angle is %g (degree).\n", + minfacetdihed / PI * 180.0); + } + printf("\n"); + + printf("\n"); +} + + +/////////////////////////////////////////////////////////////////////////////// +// // +// memorystatistics() Report the memory usage. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::memorystatistics() +{ + printf("Memory usage statistics:\n\n"); + + // Count the number of blocks of tetrahedra. + int tetblocks = 0; + tetrahedrons->pathblock = tetrahedrons->firstblock; + while (tetrahedrons->pathblock != NULL) { + tetblocks++; + tetrahedrons->pathblock = (void **) *(tetrahedrons->pathblock); + } + + // Calculate the total memory (in bytes) used by storing meshes. + unsigned long totalmeshmemory = 0l, totalt2shmemory = 0l; + totalmeshmemory = points->maxitems * points->itembytes + + tetrahedrons->maxitems * tetrahedrons->itembytes; + if (b->plc || b->refine) { + totalmeshmemory += (subfaces->maxitems * subfaces->itembytes + + subsegs->maxitems * subsegs->itembytes); + totalt2shmemory = (tet2subpool->maxitems * tet2subpool->itembytes + + tet2segpool->maxitems * tet2segpool->itembytes); + } + + unsigned long totalalgomemory = 0l; + totalalgomemory = cavetetlist->totalmemory + cavebdrylist->totalmemory + + caveoldtetlist->totalmemory + + flippool->maxitems * flippool->itembytes; + if (b->plc || b->refine) { + totalalgomemory += (subsegstack->totalmemory + subfacstack->totalmemory + + subvertstack->totalmemory + + caveshlist->totalmemory + caveshbdlist->totalmemory + + cavesegshlist->totalmemory + + cavetetshlist->totalmemory + + cavetetseglist->totalmemory + + caveencshlist->totalmemory + + caveencseglist->totalmemory + + cavetetvertlist->totalmemory + + unflipqueue->totalmemory); + } + + printf(" Maximum number of tetrahedra: %ld\n", tetrahedrons->maxitems); + printf(" Maximum number of tet blocks (blocksize = %d): %d\n", + b->tetrahedraperblock, tetblocks); + /* + if (b->plc || b->refine) { + printf(" Approximate memory for tetrahedral mesh (bytes): %ld\n", + totalmeshmemory); + + printf(" Approximate memory for extra pointers (bytes): %ld\n", + totalt2shmemory); + } else { + printf(" Approximate memory for tetrahedralization (bytes): %ld\n", + totalmeshmemory); + } + printf(" Approximate memory for algorithms (bytes): %ld\n", + totalalgomemory); + printf(" Approximate memory for working arrays (bytes): %ld\n", + totalworkmemory); + printf(" Approximate total used memory (bytes): %ld\n", + totalmeshmemory + totalt2shmemory + totalalgomemory + + totalworkmemory); + */ + if (b->plc || b->refine) { + printf(" Approximate memory for tetrahedral mesh (bytes): "); + printfcomma(totalmeshmemory); printf("\n"); + + printf(" Approximate memory for extra pointers (bytes): "); + printfcomma(totalt2shmemory); printf("\n"); + } else { + printf(" Approximate memory for tetrahedralization (bytes): "); + printfcomma(totalmeshmemory); printf("\n"); + } + printf(" Approximate memory for algorithms (bytes): "); + printfcomma(totalalgomemory); printf("\n"); + printf(" Approximate memory for working arrays (bytes): "); + printfcomma(totalworkmemory); printf("\n"); + printf(" Approximate total used memory (bytes): "); + printfcomma(totalmeshmemory + totalt2shmemory + totalalgomemory + + totalworkmemory); + printf("\n"); + + printf("\n"); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// statistics() Print all sorts of cool facts. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::statistics() +{ + long tetnumber, facenumber; + + printf("\nStatistics:\n\n"); + printf(" Input points: %d\n", in->numberofpoints); + if (b->refine) { + printf(" Input tetrahedra: %d\n", in->numberoftetrahedra); + if (in->numberoftrifaces > 0) { + printf(" Input triangles: %d\n", in->numberoftrifaces); + } + if (in->numberofedges > 0) { + printf(" Input edges: %d\n", in->numberofedges); + } + } else if (b->plc) { + printf(" Input facets: %d\n", in->numberoffacets); + printf(" Input segments: %ld\n", insegments); + if (in->numberofedges > 0) { + printf(" Input edges: %d\n", in->numberofedges); + } + printf(" Input holes: %d\n", in->numberofholes); + printf(" Input regions: %d\n", in->numberofregions); + } + + tetnumber = tetrahedrons->items - hullsize; + facenumber = (tetnumber * 4l + hullsize) / 2l; + + if (b->weighted) { // -w option + printf("\n Mesh points: %ld\n", points->items - nonregularcount); + } else { + printf("\n Mesh points: %ld\n", points->items); + } + printf(" Mesh tetrahedra: %ld\n", tetnumber); + printf(" Mesh faces: %ld\n", facenumber); + if (meshedges > 0l) { + printf(" Mesh edges: %ld\n", meshedges); + } else { + if (!nonconvex) { + long vsize = points->items - dupverts - unuverts; + if (b->weighted) vsize -= nonregularcount; + meshedges = vsize + facenumber - tetnumber - 1; + printf(" Mesh edges: %ld\n", meshedges); + } + } + + if (b->plc || b->refine) { + printf(" Mesh faces on exterior boundary: %ld\n", hullsize); + if (meshhulledges > 0l) { + printf(" Mesh edges on exterior boundary: %ld\n", meshhulledges); + } + printf(" Mesh faces on input facets: %ld\n", subfaces->items); + printf(" Mesh edges on input segments: %ld\n", subsegs->items); + if (st_facref_count > 0l) { + printf(" Steiner points on input facets: %ld\n", st_facref_count); + } + if (st_segref_count > 0l) { + printf(" Steiner points on input segments: %ld\n", st_segref_count); + } + if (st_volref_count > 0l) { + printf(" Steiner points inside domain: %ld\n", st_volref_count); + } + } else { + printf(" Convex hull faces: %ld\n", hullsize); + if (meshhulledges > 0l) { + printf(" Convex hull edges: %ld\n", meshhulledges); + } + } + if (b->weighted) { // -w option + printf(" Skipped non-regular points: %ld\n", nonregularcount); + } + printf("\n"); + + + if (b->verbose > 0) { + if (b->plc || b->refine) { // -p or -r + if (tetrahedrons->items > 0l) { + qualitystatistics(); + } + } + if (tetrahedrons->items > 0l) { + memorystatistics(); + } + } +} + +//// //// +//// //// +//// meshstat_cxx ///////////////////////////////////////////////////////////// + +//// output_cxx /////////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// jettisonnodes() Jettison unused or duplicated vertices. // +// // +// Unused points are those input points which are outside the mesh domain or // +// have no connection (isolated) to the mesh. Duplicated points exist for // +// example if the input PLC is read from a .stl mesh file (marked during the // +// Delaunay tetrahedralization step. This routine remove these points from // +// points list. All existing points are reindexed. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::jettisonnodes() +{ + point pointloop; + bool jetflag; + int oldidx, newidx; + int remcount; + + if (!b->quiet) { + printf("Jettisoning redundant points.\n"); + } + + points->traversalinit(); + pointloop = pointtraverse(); + oldidx = newidx = 0; // in->firstnumber; + remcount = 0; + while (pointloop != (point) NULL) { + jetflag = (pointtype(pointloop) == DUPLICATEDVERTEX) || + (pointtype(pointloop) == UNUSEDVERTEX); + if (jetflag) { + // It is a duplicated or unused point, delete it. + pointdealloc(pointloop); + remcount++; + } else { + // Re-index it. + setpointmark(pointloop, newidx + in->firstnumber); + if (in->pointmarkerlist != (int *) NULL) { + if (oldidx < in->numberofpoints) { + // Re-index the point marker as well. + in->pointmarkerlist[newidx] = in->pointmarkerlist[oldidx]; + } + } + newidx++; + } + oldidx++; + pointloop = pointtraverse(); + } + if (b->verbose) { + printf(" %ld duplicated vertices are removed.\n", dupverts); + printf(" %ld unused vertices are removed.\n", unuverts); + } + dupverts = 0l; + unuverts = 0l; + + // The following line ensures that dead items in the pool of nodes cannot + // be allocated for the new created nodes. This ensures that the input + // nodes will occur earlier in the output files, and have lower indices. + points->deaditemstack = (void *) NULL; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// highorder() Create extra nodes for quadratic subparametric elements. // +// // +// 'highordertable' is an array (size = numberoftetrahedra * 6) for storing // +// high-order nodes of each tetrahedron. This routine is used only when -o2 // +// switch is used. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::highorder() +{ + triface tetloop, worktet, spintet; + point *extralist, *adjextralist; + point torg, tdest, newpoint; + int highorderindex; + int t1ver; + int i, j; + + if (!b->quiet) { + printf("Adding vertices for second-order tetrahedra.\n"); + } + + // Initialize the 'highordertable'. + highordertable = new point[tetrahedrons->items * 6]; + if (highordertable == (point *) NULL) { + terminatetetgen(this, 1); + } + + // This will overwrite the slot for element markers. + highorderindex = 11; + + // The following line ensures that dead items in the pool of nodes cannot + // be allocated for the extra nodes associated with high order elements. + // This ensures that the primary nodes (at the corners of elements) will + // occur earlier in the output files, and have lower indices, than the + // extra nodes. + points->deaditemstack = (void *) NULL; + + // Assign an entry for each tetrahedron to find its extra nodes. At the + // mean while, initialize all extra nodes be NULL. + i = 0; + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + tetloop.tet[highorderindex] = (tetrahedron) &highordertable[i]; + for (j = 0; j < 6; j++) { + highordertable[i + j] = (point) NULL; + } + i += 6; + tetloop.tet = tetrahedrontraverse(); + } + + // To create a unique node on each edge. Loop over all tetrahedra, and + // look at the six edges of each tetrahedron. If the extra node in + // the tetrahedron corresponding to this edge is NULL, create a node + // for this edge, at the same time, set the new node into the extra + // node lists of all other tetrahedra sharing this edge. + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + while (tetloop.tet != (tetrahedron *) NULL) { + // Get the list of extra nodes. + extralist = (point *) tetloop.tet[highorderindex]; + worktet.tet = tetloop.tet; + for (i = 0; i < 6; i++) { + if (extralist[i] == (point) NULL) { + // Go to the ith-edge. + worktet.ver = edge2ver[i]; + // Create a new point in the middle of this edge. + torg = org(worktet); + tdest = dest(worktet); + makepoint(&newpoint, FREEVOLVERTEX); + for (j = 0; j < 3 + numpointattrib; j++) { + newpoint[j] = 0.5 * (torg[j] + tdest[j]); + } + // Interpolate its metrics. + for (j = 0; j < in->numberofpointmtrs; j++) { + newpoint[pointmtrindex + j] = + 0.5 * (torg[pointmtrindex + j] + tdest[pointmtrindex + j]); + } + // Set this point into all extra node lists at this edge. + spintet = worktet; + while (1) { + if (!ishulltet(spintet)) { + adjextralist = (point *) spintet.tet[highorderindex]; + adjextralist[ver2edge[spintet.ver]] = newpoint; + } + fnextself(spintet); + if (spintet.tet == worktet.tet) break; + } + } // if (!extralist[i]) + } // i + tetloop.tet = tetrahedrontraverse(); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// indexelements() Index all tetrahedra. // +// // +// Many output functions require that the tetrahedra are indexed. This // +// routine is called when -E option is used. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::indexelements() +{ + triface worktet; + int eindex = b->zeroindex ? 0 : in->firstnumber; // firstindex; + tetrahedrons->traversalinit(); + worktet.tet = tetrahedrontraverse(); + while (worktet.tet != NULL) { + setelemindex(worktet.tet, eindex); + eindex++; + if (b->metric) { // -m option + // Update the point-to-tet map, so that every point is pointing + // to a real tet, not a fictious one. Used by .p2t file. + tetrahedron tptr = encode(worktet); + for (int i = 0; i < 4; i++) { + setpoint2tet((point) (worktet.tet[4 + i]), tptr); + } + } + worktet.tet = tetrahedrontraverse(); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// numberedges() Count the number of edges, save in "meshedges". // +// // +// This routine is called when '-p' or '-r', and '-E' options are used. The // +// total number of edges depends on the genus of the input surface mesh. // +// // +// NOTE: This routine must be called after outelements(). So all elements // +// have been indexed. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::numberedges() +{ + triface worktet, spintet; + int ishulledge; + int t1ver; + int i; + + meshedges = meshhulledges = 0l; + + tetrahedrons->traversalinit(); + worktet.tet = tetrahedrontraverse(); + while (worktet.tet != NULL) { + for (i = 0; i < 6; i++) { + worktet.ver = edge2ver[i]; + ishulledge = 0; + fnext(worktet, spintet); + do { + if (!ishulltet(spintet)) { + if (elemindex(spintet.tet) < elemindex(worktet.tet)) break; + } else { + ishulledge = 1; + } + fnextself(spintet); + } while (spintet.tet != worktet.tet); + if (spintet.tet == worktet.tet) { + meshedges++; + if (ishulledge) meshhulledges++; + } + } + infect(worktet); + worktet.tet = tetrahedrontraverse(); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outnodes() Output the points to a .node file or a tetgenio structure. // +// // +// Note: each point has already been numbered on input (the first index is // +// 'in->firstnumber'). // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outnodes(tetgenio* out) +{ + FILE *outfile = NULL; + char outnodefilename[FILENAMESIZE]; + face parentsh; + point pointloop; + int nextras, bmark, marker = 0, weightDT = 0; + int coordindex, attribindex; + int pointnumber, firstindex; + int index, i; + + if (out == (tetgenio *) NULL) { + strcpy(outnodefilename, b->outfilename); + strcat(outnodefilename, ".node"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", outnodefilename); + } else { + printf("Writing nodes.\n"); + } + } + + nextras = numpointattrib; + if (b->weighted) { // -w + if (b->weighted_param == 0) weightDT = 1; // Weighted DT. + } + + bmark = !b->nobound && in->pointmarkerlist; + + if (out == (tetgenio *) NULL) { + outfile = fopen(outnodefilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", outnodefilename); + terminatetetgen(this, 1); + } + // Number of points, number of dimensions, number of point attributes, + // and number of boundary markers (zero or one). + fprintf(outfile, "%ld %d %d %d\n", points->items, 3, nextras, bmark); + } else { + // Allocate space for 'pointlist'; + out->pointlist = new REAL[points->items * 3]; + if (out->pointlist == (REAL *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + // Allocate space for 'pointattributelist' if necessary; + if (nextras > 0) { + out->pointattributelist = new REAL[points->items * nextras]; + if (out->pointattributelist == (REAL *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + } + // Allocate space for 'pointmarkerlist' if necessary; + if (bmark) { + out->pointmarkerlist = new int[points->items]; + if (out->pointmarkerlist == (int *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + } + if (b->psc) { + out->pointparamlist = new tetgenio::pointparam[points->items]; + if (out->pointparamlist == NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + } + out->numberofpoints = points->items; + out->numberofpointattributes = nextras; + coordindex = 0; + attribindex = 0; + } + + // Determine the first index (0 or 1). + firstindex = b->zeroindex ? 0 : in->firstnumber; + + points->traversalinit(); + pointloop = pointtraverse(); + pointnumber = firstindex; // in->firstnumber; + index = 0; + while (pointloop != (point) NULL) { + if (bmark) { + // Default the vertex has a zero marker. + marker = 0; + // Is it an input vertex? + if (index < in->numberofpoints) { + // Input point's marker is directly copied to output. + marker = in->pointmarkerlist[index]; + } else { + if ((pointtype(pointloop) == FREESEGVERTEX) || + (pointtype(pointloop) == FREEFACETVERTEX)) { + sdecode(point2sh(pointloop), parentsh); + if (parentsh.sh != NULL) { + marker = shellmark(parentsh); + } + } // if (pointtype(...)) + } + } + if (out == (tetgenio *) NULL) { + // Point number, x, y and z coordinates. + fprintf(outfile, "%4d %.17g %.17g %.17g", pointnumber, + pointloop[0], pointloop[1], pointloop[2]); + for (i = 0; i < nextras; i++) { + // Write an attribute. + if ((i == 0) && weightDT) { + fprintf(outfile, " %.17g", pointloop[0] * pointloop[0] + + pointloop[1] * pointloop[1] + pointloop[2] * pointloop[2] + - pointloop[3 + i]); + } else { + fprintf(outfile, " %.17g", pointloop[3 + i]); + } + } + if (bmark) { + // Write the boundary marker. + fprintf(outfile, " %d", marker); + } + if (b->psc) { + fprintf(outfile, " %.8g %.8g %d", pointgeomuv(pointloop, 0), + pointgeomuv(pointloop, 1), pointgeomtag(pointloop)); + if (pointtype(pointloop) == RIDGEVERTEX) { + fprintf(outfile, " 0"); + } else if (pointtype(pointloop) == ACUTEVERTEX) { + fprintf(outfile, " 0"); + } else if (pointtype(pointloop) == FREESEGVERTEX) { + fprintf(outfile, " 1"); + } else if (pointtype(pointloop) == FREEFACETVERTEX) { + fprintf(outfile, " 2"); + } else if (pointtype(pointloop) == FREEVOLVERTEX) { + fprintf(outfile, " 3"); + } else { + fprintf(outfile, " -1"); // Unknown type. + } + } + fprintf(outfile, "\n"); + } else { + // X, y, and z coordinates. + out->pointlist[coordindex++] = pointloop[0]; + out->pointlist[coordindex++] = pointloop[1]; + out->pointlist[coordindex++] = pointloop[2]; + // Point attributes. + for (i = 0; i < nextras; i++) { + // Output an attribute. + if ((i == 0) && weightDT) { + out->pointattributelist[attribindex++] = + pointloop[0] * pointloop[0] + pointloop[1] * pointloop[1] + + pointloop[2] * pointloop[2] - pointloop[3 + i]; + } else { + out->pointattributelist[attribindex++] = pointloop[3 + i]; + } + } + if (bmark) { + // Output the boundary marker. + out->pointmarkerlist[index] = marker; + } + if (b->psc) { + out->pointparamlist[index].uv[0] = pointgeomuv(pointloop, 0); + out->pointparamlist[index].uv[1] = pointgeomuv(pointloop, 1); + out->pointparamlist[index].tag = pointgeomtag(pointloop); + if (pointtype(pointloop) == RIDGEVERTEX) { + out->pointparamlist[index].type = 0; + } else if (pointtype(pointloop) == ACUTEVERTEX) { + out->pointparamlist[index].type = 0; + } else if (pointtype(pointloop) == FREESEGVERTEX) { + out->pointparamlist[index].type = 1; + } else if (pointtype(pointloop) == FREEFACETVERTEX) { + out->pointparamlist[index].type = 2; + } else if (pointtype(pointloop) == FREEVOLVERTEX) { + out->pointparamlist[index].type = 3; + } else { + out->pointparamlist[index].type = -1; // Unknown type. + } + } + } + pointloop = pointtraverse(); + pointnumber++; + index++; + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outmetrics() Output the metric to a file (*.mtr) or a tetgenio obj. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outmetrics(tetgenio* out) +{ + FILE *outfile = NULL; + char outmtrfilename[FILENAMESIZE]; + point ptloop; + int mtrindex = 0; + int i; + int msize = (sizeoftensor - useinsertradius); + if (msize == 0) { + return; + } + + if (out == (tetgenio *) NULL) { + strcpy(outmtrfilename, b->outfilename); + strcat(outmtrfilename, ".mtr"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", outmtrfilename); + } else { + printf("Writing metrics.\n"); + } + } + + if (out == (tetgenio *) NULL) { + outfile = fopen(outmtrfilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", outmtrfilename); + terminatetetgen(this, 3); + } + // Number of points, number of point metrices, + fprintf(outfile, "%ld %d\n", points->items, msize); + } else { + // Allocate space for 'pointmtrlist'. + out->numberofpointmtrs = msize; + out->pointmtrlist = new REAL[points->items * msize]; + if (out->pointmtrlist == (REAL *) NULL) { + terminatetetgen(this, 1); + } + } + + points->traversalinit(); + ptloop = pointtraverse(); + while (ptloop != (point) NULL) { + if (out == (tetgenio *) NULL) { + for (i = 0; i < msize; i++) { + fprintf(outfile, " %-16.8e", ptloop[pointmtrindex + i]); + } + fprintf(outfile, "\n"); + } else { + for (i = 0; i < msize; i++) { + out->pointmtrlist[mtrindex++] = ptloop[pointmtrindex + i]; + } + } + ptloop = pointtraverse(); + } + + // Output the point-to-tet map. + if (out == (tetgenio *) NULL) { + strcpy(outmtrfilename, b->outfilename); + strcat(outmtrfilename, ".p2t"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", outmtrfilename); + } else { + printf("Writing point-to-tet map.\n"); + } + } + + if (out == (tetgenio *) NULL) { + outfile = fopen(outmtrfilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", outmtrfilename); + terminatetetgen(this, 3); + } + // Number of points, + //fprintf(outfile, "%ld\n", points->items); + } else { + // Allocate space for 'point2tetlist'. + out->point2tetlist = new int[points->items]; + if (out->point2tetlist == (int *) NULL) { + terminatetetgen(this, 1); + } + } + + // The list of tetrahedra must be indexed. + if (bgm != NULL) { + bgm->indexelements(); + } + // Determine the first index (0 or 1). + int firstindex = b->zeroindex ? 0 : in->firstnumber; + int pointindex = firstindex; + i = 0; + + triface parenttet; + points->traversalinit(); + ptloop = pointtraverse(); + while (ptloop != (point) NULL) { + if (bgm != NULL) { + bgm->decode(point2bgmtet(ptloop), parenttet); + } else { + decode(point2tet(ptloop), parenttet); + } + if (out == (tetgenio *) NULL) { + fprintf(outfile, "%d %d\n", pointindex, elemindex(parenttet.tet)); + } else { + out->point2tetlist[i] = elemindex(parenttet.tet); + } + pointindex++; + i++; + ptloop = pointtraverse(); + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outelements() Output the tetrahedra to an .ele file or a tetgenio // +// structure. // +// // +// This routine also indexes all tetrahedra (exclusing hull tets) (from in-> // +// firstnumber). The total number of mesh edges is counted in 'meshedges'. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outelements(tetgenio* out) +{ + FILE *outfile = NULL; + char outelefilename[FILENAMESIZE]; + tetrahedron* tptr; + point p1, p2, p3, p4; + point *extralist; + REAL *talist = NULL; + int *tlist = NULL; + long ntets; + int firstindex, shift; + int pointindex, attribindex; + int highorderindex = 11; + int elementnumber; + int eextras; + int i; + + if (out == (tetgenio *) NULL) { + strcpy(outelefilename, b->outfilename); + strcat(outelefilename, ".ele"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", outelefilename); + } else { + printf("Writing elements.\n"); + } + } + + // The number of tets excluding hull tets. + ntets = tetrahedrons->items - hullsize; + + eextras = numelemattrib; + if (out == (tetgenio *) NULL) { + outfile = fopen(outelefilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", outelefilename); + terminatetetgen(this, 1); + } + // Number of tetras, points per tetra, attributes per tetra. + fprintf(outfile, "%ld %d %d\n", ntets, b->order == 1 ? 4 : 10, eextras); + } else { + // Allocate memory for output tetrahedra. + out->tetrahedronlist = new int[ntets * (b->order == 1 ? 4 : 10)]; + if (out->tetrahedronlist == (int *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + // Allocate memory for output tetrahedron attributes if necessary. + if (eextras > 0) { + out->tetrahedronattributelist = new REAL[ntets * eextras]; + if (out->tetrahedronattributelist == (REAL *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + } + out->numberoftetrahedra = ntets; + out->numberofcorners = b->order == 1 ? 4 : 10; + out->numberoftetrahedronattributes = eextras; + tlist = out->tetrahedronlist; + talist = out->tetrahedronattributelist; + pointindex = 0; + attribindex = 0; + } + + // Determine the first index (0 or 1). + firstindex = b->zeroindex ? 0 : in->firstnumber; + shift = 0; // Default no shift. + if ((in->firstnumber == 1) && (firstindex == 0)) { + shift = 1; // Shift the output indices by 1. + } + + tetrahedrons->traversalinit(); + tptr = tetrahedrontraverse(); + elementnumber = firstindex; // in->firstnumber; + while (tptr != (tetrahedron *) NULL) { + if (!b->reversetetori) { + p1 = (point) tptr[4]; + p2 = (point) tptr[5]; + } else { + p1 = (point) tptr[5]; + p2 = (point) tptr[4]; + } + p3 = (point) tptr[6]; + p4 = (point) tptr[7]; + if (out == (tetgenio *) NULL) { + // Tetrahedron number, indices for four points. + fprintf(outfile, "%5d %5d %5d %5d %5d", elementnumber, + pointmark(p1) - shift, pointmark(p2) - shift, + pointmark(p3) - shift, pointmark(p4) - shift); + if (b->order == 2) { + extralist = (point *) tptr[highorderindex]; + // indices for six extra points. + fprintf(outfile, " %5d %5d %5d %5d %5d %5d", + pointmark(extralist[0]) - shift, pointmark(extralist[1]) - shift, + pointmark(extralist[2]) - shift, pointmark(extralist[3]) - shift, + pointmark(extralist[4]) - shift, pointmark(extralist[5]) - shift); + } + for (i = 0; i < eextras; i++) { + fprintf(outfile, " %.17g", elemattribute(tptr, i)); + } + fprintf(outfile, "\n"); + } else { + tlist[pointindex++] = pointmark(p1) - shift; + tlist[pointindex++] = pointmark(p2) - shift; + tlist[pointindex++] = pointmark(p3) - shift; + tlist[pointindex++] = pointmark(p4) - shift; + if (b->order == 2) { + extralist = (point *) tptr[highorderindex]; + tlist[pointindex++] = pointmark(extralist[0]) - shift; + tlist[pointindex++] = pointmark(extralist[1]) - shift; + tlist[pointindex++] = pointmark(extralist[2]) - shift; + tlist[pointindex++] = pointmark(extralist[3]) - shift; + tlist[pointindex++] = pointmark(extralist[4]) - shift; + tlist[pointindex++] = pointmark(extralist[5]) - shift; + } + for (i = 0; i < eextras; i++) { + talist[attribindex++] = elemattribute(tptr, i); + } + } + // Remember the index of this element (for counting edges). + setelemindex(tptr, elementnumber); + if (b->metric) { // -m option + // Update the point-to-tet map, so that every point is pointing + // to a real tet, not a fictious one. Used by .p2t file. + for (int i = 0; i < 4; i++) { + setpoint2tet((point) (tptr[4 + i]), (tetrahedron) tptr); + } + } + tptr = tetrahedrontraverse(); + elementnumber++; + } + + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outfaces() Output all faces to a .face file or a tetgenio object. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outfaces(tetgenio* out) +{ + FILE *outfile = NULL; + char facefilename[FILENAMESIZE]; + triface tface, tsymface; + face checkmark; + point torg, tdest, tapex; + long ntets, faces; + int *elist = NULL, *emlist = NULL; + int neigh1 = 0, neigh2 = 0; + int marker = 0; + int firstindex, shift; + int facenumber; + int index = 0; + + // For -o2 option. + triface workface; + point *extralist, pp[3] = {0,0,0}; + int highorderindex = 11; + int o2index = 0, i; + + // For -nn option. + int *tet2facelist = NULL; + int tidx; + + if (out == (tetgenio *) NULL) { + strcpy(facefilename, b->outfilename); + strcat(facefilename, ".face"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", facefilename); + } else { + printf("Writing faces.\n"); + } + } + + ntets = tetrahedrons->items - hullsize; + faces = (ntets * 4l + hullsize) / 2l; + + if (out == (tetgenio *) NULL) { + outfile = fopen(facefilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", facefilename); + terminatetetgen(this, 1); + } + fprintf(outfile, "%ld %d\n", faces, !b->nobound); + } else { + // Allocate memory for 'trifacelist'. + out->trifacelist = new int[faces * 3]; + if (out->trifacelist == (int *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + if (b->order == 2) { + out->o2facelist = new int[faces * 3]; + } + // Allocate memory for 'trifacemarkerlist' if necessary. + if (!b->nobound) { + out->trifacemarkerlist = new int[faces]; + if (out->trifacemarkerlist == (int *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + } + if (b->neighout > 1) { + // '-nn' switch. + out->face2tetlist = new int[faces * 2]; + if (out->face2tetlist == (int *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + } + out->numberoftrifaces = faces; + elist = out->trifacelist; + emlist = out->trifacemarkerlist; + } + + if (b->neighout > 1) { // -nn option + // Output the tetrahedron-to-face map. + tet2facelist = new int[ntets * 4]; + } + + // Determine the first index (0 or 1). + firstindex = b->zeroindex ? 0 : in->firstnumber; + shift = 0; // Default no shiftment. + if ((in->firstnumber == 1) && (firstindex == 0)) { + shift = 1; // Shift the output indices by 1. + } + + tetrahedrons->traversalinit(); + tface.tet = tetrahedrontraverse(); + facenumber = firstindex; // in->firstnumber; + // To loop over the set of faces, loop over all tetrahedra, and look at + // the four faces of each one. If its adjacent tet is a hull tet, + // operate on the face, otherwise, operate on the face only if the + // current tet has a smaller index than its neighbor. + while (tface.tet != (tetrahedron *) NULL) { + for (tface.ver = 0; tface.ver < 4; tface.ver ++) { + fsym(tface, tsymface); + if (ishulltet(tsymface) || + (elemindex(tface.tet) < elemindex(tsymface.tet))) { + torg = org(tface); + tdest = dest(tface); + tapex = apex(tface); + if (b->order == 2) { // -o2 + // Get the three extra vertices on edges. + extralist = (point *) (tface.tet[highorderindex]); + // The extra vertices are on edges opposite the corners. + enext(tface, workface); + for (i = 0; i < 3; i++) { + pp[i] = extralist[ver2edge[workface.ver]]; + enextself(workface); + } + } + if (!b->nobound) { + // Get the boundary marker of this face. + if (b->plc || b->refine) { + // Shell face is used. + tspivot(tface, checkmark); + if (checkmark.sh == NULL) { + marker = 0; // It is an inner face. It's marker is 0. + } else { + marker = shellmark(checkmark); + } + } else { + // Shell face is not used, only distinguish outer and inner face. + marker = (int) ishulltet(tsymface); + } + } + if (b->neighout > 1) { + // '-nn' switch. Output adjacent tets indices. + if (!ishulltet(tface)) { + neigh1 = elemindex(tface.tet); + } else { + neigh1 = -1; + } + if (!ishulltet(tsymface)) { + neigh2 = elemindex(tsymface.tet); + } else { + neigh2 = -1; + } + // Fill the tetrahedron-to-face map. + tidx = elemindex(tface.tet) - firstindex; + tet2facelist[tidx * 4 + tface.ver] = facenumber; + if (!ishulltet(tsymface)) { + tidx = elemindex(tsymface.tet) - firstindex; + tet2facelist[tidx * 4 + (tsymface.ver & 3)] = facenumber; + } + } + if (out == (tetgenio *) NULL) { + // Face number, indices of three vertices. + fprintf(outfile, "%5d %4d %4d %4d", facenumber, + pointmark(torg) - shift, pointmark(tdest) - shift, + pointmark(tapex) - shift); + if (b->order == 2) { // -o2 + fprintf(outfile, " %4d %4d %4d", pointmark(pp[0]) - shift, + pointmark(pp[1]) - shift, pointmark(pp[2]) - shift); + } + if (!b->nobound) { + // Output a boundary marker. + fprintf(outfile, " %d", marker); + } + if (b->neighout > 1) { + fprintf(outfile, " %5d %5d", neigh1, neigh2); + } + fprintf(outfile, "\n"); + } else { + // Output indices of three vertices. + elist[index++] = pointmark(torg) - shift; + elist[index++] = pointmark(tdest) - shift; + elist[index++] = pointmark(tapex) - shift; + if (b->order == 2) { // -o2 + out->o2facelist[o2index++] = pointmark(pp[0]) - shift; + out->o2facelist[o2index++] = pointmark(pp[1]) - shift; + out->o2facelist[o2index++] = pointmark(pp[2]) - shift; + } + if (!b->nobound) { + emlist[facenumber - in->firstnumber] = marker; + } + if (b->neighout > 1) { + out->face2tetlist[(facenumber - in->firstnumber) * 2] = neigh1; + out->face2tetlist[(facenumber - in->firstnumber) * 2 + 1] = neigh2; + } + } + facenumber++; + } + } + tface.tet = tetrahedrontraverse(); + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } + + if (b->neighout > 1) { // -nn option + // Output the tetrahedron-to-face map. + if (out == (tetgenio *) NULL) { + strcpy(facefilename, b->outfilename); + strcat(facefilename, ".t2f"); + } + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", facefilename); + } else { + printf("Writing tetrahedron-to-face map.\n"); + } + } + if (out == (tetgenio *) NULL) { + outfile = fopen(facefilename, "w"); + for (tidx = 0; tidx < ntets; tidx++) { + index = tidx * 4; + fprintf(outfile, "%4d %d %d %d %d\n", tidx + in->firstnumber, + tet2facelist[index], tet2facelist[index+1], + tet2facelist[index+2], tet2facelist[index+3]); + } + fclose(outfile); + delete [] tet2facelist; + } else { + // Simply copy the address of the list to the output. + out->tet2facelist = tet2facelist; + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outhullfaces() Output hull faces to a .face file or a tetgenio object. // +// // +// The normal of each face is pointing to the outside of the domain. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outhullfaces(tetgenio* out) +{ + FILE *outfile = NULL; + char facefilename[FILENAMESIZE]; + triface hulltet; + point torg, tdest, tapex; + int *elist = NULL; + int firstindex, shift; + int facenumber; + int index; + + if (out == (tetgenio *) NULL) { + strcpy(facefilename, b->outfilename); + strcat(facefilename, ".face"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", facefilename); + } else { + printf("Writing faces.\n"); + } + } + + if (out == (tetgenio *) NULL) { + outfile = fopen(facefilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", facefilename); + terminatetetgen(this, 1); + } + fprintf(outfile, "%ld 0\n", hullsize); + } else { + // Allocate memory for 'trifacelist'. + out->trifacelist = new int[hullsize * 3]; + if (out->trifacelist == (int *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + out->numberoftrifaces = hullsize; + elist = out->trifacelist; + index = 0; + } + + // Determine the first index (0 or 1). + firstindex = b->zeroindex ? 0 : in->firstnumber; + shift = 0; // Default no shiftment. + if ((in->firstnumber == 1) && (firstindex == 0)) { + shift = 1; // Shift the output indices by 1. + } + + tetrahedrons->traversalinit(); + hulltet.tet = alltetrahedrontraverse(); + facenumber = firstindex; + while (hulltet.tet != (tetrahedron *) NULL) { + if (ishulltet(hulltet)) { + torg = (point) hulltet.tet[4]; + tdest = (point) hulltet.tet[5]; + tapex = (point) hulltet.tet[6]; + if (out == (tetgenio *) NULL) { + // Face number, indices of three vertices. + fprintf(outfile, "%5d %4d %4d %4d", facenumber, + pointmark(torg) - shift, pointmark(tdest) - shift, + pointmark(tapex) - shift); + fprintf(outfile, "\n"); + } else { + // Output indices of three vertices. + elist[index++] = pointmark(torg) - shift; + elist[index++] = pointmark(tdest) - shift; + elist[index++] = pointmark(tapex) - shift; + } + facenumber++; + } + hulltet.tet = alltetrahedrontraverse(); + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outsubfaces() Output subfaces (i.e. boundary faces) to a .face file or // +// a tetgenio structure. // +// // +// The boundary faces are found in 'subfaces'. For listing triangle vertices // +// in the same sense for all triangles in the mesh, the direction determined // +// by right-hand rule is pointer to the inside of the volume. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outsubfaces(tetgenio* out) +{ + FILE *outfile = NULL; + char facefilename[FILENAMESIZE]; + int *elist = NULL; + int *emlist = NULL; + int index = 0, index1 = 0, index2 = 0; + triface abuttingtet; + face faceloop; + point torg, tdest, tapex; + int marker = 0; + int firstindex, shift; + int neigh1 = 0, neigh2 = 0; + int facenumber; + + // For -o2 option. + triface workface; + point *extralist, pp[3] = {0,0,0}; + int highorderindex = 11; + int o2index = 0, i; + + int t1ver; // used by fsymself() + + if (out == (tetgenio *) NULL) { + strcpy(facefilename, b->outfilename); + strcat(facefilename, ".face"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", facefilename); + } else { + printf("Writing faces.\n"); + } + } + + if (out == (tetgenio *) NULL) { + outfile = fopen(facefilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", facefilename); + terminatetetgen(this, 3); + } + // Number of subfaces. + fprintf(outfile, "%ld %d\n", subfaces->items, !b->nobound); + } else { + // Allocate memory for 'trifacelist'. + out->trifacelist = new int[subfaces->items * 3]; + if (out->trifacelist == (int *) NULL) { + terminatetetgen(this, 1); + } + if (b->order == 2) { + out->o2facelist = new int[subfaces->items * 3]; + } + if (!b->nobound) { + // Allocate memory for 'trifacemarkerlist'. + out->trifacemarkerlist = new int[subfaces->items]; + if (out->trifacemarkerlist == (int *) NULL) { + terminatetetgen(this, 1); + } + } + if (b->neighout > 1) { + // '-nn' switch. + out->face2tetlist = new int[subfaces->items * 2]; + if (out->face2tetlist == (int *) NULL) { + terminatetetgen(this, 1); + } + } + out->numberoftrifaces = subfaces->items; + elist = out->trifacelist; + emlist = out->trifacemarkerlist; + } + + // Determine the first index (0 or 1). + firstindex = b->zeroindex ? 0 : in->firstnumber; + shift = 0; // Default no shiftment. + if ((in->firstnumber == 1) && (firstindex == 0)) { + shift = 1; // Shift the output indices by 1. + } + + subfaces->traversalinit(); + faceloop.sh = shellfacetraverse(subfaces); + facenumber = firstindex; // in->firstnumber; + while (faceloop.sh != (shellface *) NULL) { + stpivot(faceloop, abuttingtet); + // If there is a tetrahedron containing this subface, orient it so + // that the normal of this face points to inside of the volume by + // right-hand rule. + if (abuttingtet.tet != NULL) { + if (ishulltet(abuttingtet)) { + fsymself(abuttingtet); + } + } + if (abuttingtet.tet != NULL) { + torg = org(abuttingtet); + tdest = dest(abuttingtet); + tapex = apex(abuttingtet); + if (b->order == 2) { // -o2 + // Get the three extra vertices on edges. + extralist = (point *) (abuttingtet.tet[highorderindex]); + workface = abuttingtet; + for (i = 0; i < 3; i++) { + pp[i] = extralist[ver2edge[workface.ver]]; + enextself(workface); + } + } + } else { + // This may happen when only a surface mesh be generated. + torg = sorg(faceloop); + tdest = sdest(faceloop); + tapex = sapex(faceloop); + if (b->order == 2) { // -o2 + // There is no extra node list available. + pp[0] = torg; + pp[1] = tdest; + pp[2] = tapex; + } + } + if (!b->nobound) { + marker = shellmark(faceloop); + } + if (b->neighout > 1) { + // '-nn' switch. Output adjacent tets indices. + neigh1 = -1; + neigh2 = -1; + stpivot(faceloop, abuttingtet); + if (abuttingtet.tet != NULL) { + if (!ishulltet(abuttingtet)) { + neigh1 = elemindex(abuttingtet.tet); + } + fsymself(abuttingtet); + if (!ishulltet(abuttingtet)) { + neigh2 = elemindex(abuttingtet.tet); + } + } + } + if (out == (tetgenio *) NULL) { + fprintf(outfile, "%5d %4d %4d %4d", facenumber, + pointmark(torg) - shift, pointmark(tdest) - shift, + pointmark(tapex) - shift); + if (b->order == 2) { // -o2 + fprintf(outfile, " %4d %4d %4d", pointmark(pp[0]) - shift, + pointmark(pp[1]) - shift, pointmark(pp[2]) - shift); + } + if (!b->nobound) { + fprintf(outfile, " %d", marker); + } + if (b->neighout > 1) { + fprintf(outfile, " %5d %5d", neigh1, neigh2); + } + fprintf(outfile, "\n"); + } else { + // Output three vertices of this face; + elist[index++] = pointmark(torg) - shift; + elist[index++] = pointmark(tdest) - shift; + elist[index++] = pointmark(tapex) - shift; + if (b->order == 2) { // -o2 + out->o2facelist[o2index++] = pointmark(pp[0]) - shift; + out->o2facelist[o2index++] = pointmark(pp[1]) - shift; + out->o2facelist[o2index++] = pointmark(pp[2]) - shift; + } + if (!b->nobound) { + emlist[index1++] = marker; + } + if (b->neighout > 1) { + out->face2tetlist[index2++] = neigh1; + out->face2tetlist[index2++] = neigh2; + } + } + facenumber++; + faceloop.sh = shellfacetraverse(subfaces); + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outedges() Output all edges to a .edge file or a tetgenio object. // +// // +// Note: This routine must be called after outelements(), so that the total // +// number of edges 'meshedges' has been counted. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outedges(tetgenio* out) +{ + FILE *outfile = NULL; + char edgefilename[FILENAMESIZE]; + triface tetloop, worktet, spintet; + face checkseg; + point torg, tdest; + int ishulledge; + int firstindex, shift; + int edgenumber, marker; + int index = 0, index1 = 0, index2 = 0; + int t1ver; + int i; + + // For -o2 option. + point *extralist, pp = NULL; + int highorderindex = 11; + int o2index = 0; + + // For -nn option. + int *tet2edgelist = NULL; + int tidx; + + if (out == (tetgenio *) NULL) { + strcpy(edgefilename, b->outfilename); + strcat(edgefilename, ".edge"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", edgefilename); + } else { + printf("Writing edges.\n"); + } + } + + if (meshedges == 0l) { + if (nonconvex) { + numberedges(); // Count the edges. + } else { + // Use Euler's characteristic to get the numbe of edges. + // It states V - E + F - C = 1, hence E = V + F - C - 1. + long tsize = tetrahedrons->items - hullsize; + long fsize = (tsize * 4l + hullsize) / 2l; + long vsize = points->items - dupverts - unuverts; + if (b->weighted) vsize -= nonregularcount; + meshedges = vsize + fsize - tsize - 1; + } + } + meshhulledges = 0l; // It will be counted. + + if (out == (tetgenio *) NULL) { + outfile = fopen(edgefilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", edgefilename); + terminatetetgen(this, 1); + } + // Write the number of edges, boundary markers (0 or 1). + fprintf(outfile, "%ld %d\n", meshedges, !b->nobound); + } else { + // Allocate memory for 'edgelist'. + out->numberofedges = meshedges; + out->edgelist = new int[meshedges * 2]; + if (out->edgelist == (int *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + if (b->order == 2) { // -o2 switch + out->o2edgelist = new int[meshedges]; + } + if (!b->nobound) { + out->edgemarkerlist = new int[meshedges]; + } + if (b->neighout > 1) { // '-nn' switch. + out->edge2tetlist = new int[meshedges]; + } + } + + if (b->neighout > 1) { // -nn option + // Output the tetrahedron-to-edge map. + long tsize = tetrahedrons->items - hullsize; + tet2edgelist = new int[tsize * 6]; + } + + // Determine the first index (0 or 1). + firstindex = b->zeroindex ? 0 : in->firstnumber; + shift = 0; // Default no shiftment. + if ((in->firstnumber == 1) && (firstindex == 0)) { + shift = 1; // Shift (reduce) the output indices by 1. + } + + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + edgenumber = firstindex; // in->firstnumber; + while (tetloop.tet != (tetrahedron *) NULL) { + // Count the number of Voronoi faces. + worktet.tet = tetloop.tet; + for (i = 0; i < 6; i++) { + worktet.ver = edge2ver[i]; + ishulledge = 0; + fnext(worktet, spintet); + do { + if (!ishulltet(spintet)) { + if (elemindex(spintet.tet) < elemindex(worktet.tet)) break; + } else { + ishulledge = 1; + } + fnextself(spintet); + } while (spintet.tet != worktet.tet); + if (spintet.tet == worktet.tet) { + // Found a new edge. + if (ishulledge) meshhulledges++; + torg = org(worktet); + tdest = dest(worktet); + if (b->order == 2) { // -o2 + // Get the extra vertex on this edge. + extralist = (point *) worktet.tet[highorderindex]; + pp = extralist[ver2edge[worktet.ver]]; + } + if (out == (tetgenio *) NULL) { + fprintf(outfile, "%5d %4d %4d", edgenumber, + pointmark(torg) - shift, pointmark(tdest) - shift); + if (b->order == 2) { // -o2 + fprintf(outfile, " %4d", pointmark(pp) - shift); + } + } else { + // Output three vertices of this face; + out->edgelist[index++] = pointmark(torg) - shift; + out->edgelist[index++] = pointmark(tdest) - shift; + if (b->order == 2) { // -o2 + out->o2edgelist[o2index++] = pointmark(pp) - shift; + } + } + if (!b->nobound) { + if (b->plc || b->refine) { + // Check if the edge is a segment. + tsspivot1(worktet, checkseg); + if (checkseg.sh != NULL) { + marker = shellmark(checkseg); + } else { + marker = 0; // It's not a segment. + } + } else { + // Mark it if it is a hull edge. + marker = ishulledge ? 1 : 0; + } + if (out == (tetgenio *) NULL) { + fprintf(outfile, " %d", marker); + } else { + out->edgemarkerlist[index1++] = marker; + } + } + if (b->neighout > 1) { // '-nn' switch. + if (out == (tetgenio *) NULL) { + fprintf(outfile, " %d", elemindex(tetloop.tet)); + } else { + out->edge2tetlist[index2++] = elemindex(tetloop.tet); + } + // Fill the tetrahedron-to-edge map. + spintet = worktet; + while (1) { + if (!ishulltet(spintet)) { + tidx = elemindex(spintet.tet) - firstindex; + tet2edgelist[tidx * 6 + ver2edge[spintet.ver]] = edgenumber; + } + fnextself(spintet); + if (spintet.tet == worktet.tet) break; + } + } + if (out == (tetgenio *) NULL) { + fprintf(outfile, "\n"); + } + edgenumber++; + } + } + tetloop.tet = tetrahedrontraverse(); + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } + + if (b->neighout > 1) { // -nn option + long tsize = tetrahedrons->items - hullsize; + + if (b->facesout) { // -f option + // Build the face-to-edge map (use the tet-to-edge map). + long fsize = (tsize * 4l + hullsize) / 2l; + int *face2edgelist = new int[fsize * 3]; + + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + int facenumber = 0; // firstindex; // in->firstnumber; + while (tetloop.tet != (tetrahedron *) NULL) { + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + fsym(tetloop, spintet); + if (ishulltet(spintet) || + (elemindex(tetloop.tet) < elemindex(spintet.tet))) { + // The three edges of this face are ordered such that the + // first edge is opposite to the first vertex of this face + // that appears in the .face file, and so on. + tidx = elemindex(tetloop.tet) - firstindex; + worktet = tetloop; + for (i = 0; i < 3; i++) { + enextself(worktet); // The edge opposite to vertex i. + int eidx = tet2edgelist[tidx * 6 + ver2edge[worktet.ver]]; + face2edgelist[facenumber * 3 + i] = eidx; + } + facenumber++; + } + } + tetloop.tet = tetrahedrontraverse(); + } + + // Output the face-to-edge map. + if (out == (tetgenio *) NULL) { + strcpy(edgefilename, b->outfilename); + strcat(edgefilename, ".f2e"); + } + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", edgefilename); + } else { + printf("Writing face-to-edge map.\n"); + } + } + if (out == (tetgenio *) NULL) { + outfile = fopen(edgefilename, "w"); + for (tidx = 0; tidx < fsize; tidx++) { // Re-use `tidx' + i = tidx * 3; + fprintf(outfile, "%4d %d %d %d\n", tidx + in->firstnumber, + face2edgelist[i], face2edgelist[i+1], face2edgelist[i+2]); + } + fclose(outfile); + delete [] face2edgelist; + } else { + // Simply copy the address of the list to the output. + out->face2edgelist = face2edgelist; + } + } // if (b->facesout) + + // Output the tetrahedron-to-edge map. + if (out == (tetgenio *) NULL) { + strcpy(edgefilename, b->outfilename); + strcat(edgefilename, ".t2e"); + } + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", edgefilename); + } else { + printf("Writing tetrahedron-to-edge map.\n"); + } + } + if (out == (tetgenio *) NULL) { + outfile = fopen(edgefilename, "w"); + for (tidx = 0; tidx < tsize; tidx++) { + i = tidx * 6; + fprintf(outfile, "%4d %d %d %d %d %d %d\n", tidx + in->firstnumber, + tet2edgelist[i], tet2edgelist[i+1], tet2edgelist[i+2], + tet2edgelist[i+3], tet2edgelist[i+4], tet2edgelist[i+5]); + } + fclose(outfile); + delete [] tet2edgelist; + } else { + // Simply copy the address of the list to the output. + out->tet2edgelist = tet2edgelist; + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outsubsegments() Output segments to a .edge file or a structure. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outsubsegments(tetgenio* out) +{ + FILE *outfile = NULL; + char edgefilename[FILENAMESIZE]; + int *elist = NULL; + int index, i; + face edgeloop; + point torg, tdest; + int firstindex, shift; + int marker; + int edgenumber; + + // For -o2 option. + triface workface, spintet; + point *extralist, pp = NULL; + int highorderindex = 11; + int o2index = 0; + + // For -nn option. + int neigh = -1; + int index2 = 0; + + int t1ver; // used by fsymself() + + if (out == (tetgenio *) NULL) { + strcpy(edgefilename, b->outfilename); + strcat(edgefilename, ".edge"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", edgefilename); + } else { + printf("Writing edges.\n"); + } + } + + if (out == (tetgenio *) NULL) { + outfile = fopen(edgefilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", edgefilename); + terminatetetgen(this, 3); + } + // Number of subsegments. + fprintf(outfile, "%ld 1\n", subsegs->items); + } else { + // Allocate memory for 'edgelist'. + out->edgelist = new int[subsegs->items * (b->order == 1 ? 2 : 3)]; + if (out->edgelist == (int *) NULL) { + terminatetetgen(this, 1); + } + if (b->order == 2) { + out->o2edgelist = new int[subsegs->items]; + } + out->edgemarkerlist = new int[subsegs->items]; + if (out->edgemarkerlist == (int *) NULL) { + terminatetetgen(this, 1); + } + if (b->neighout > 1) { + out->edge2tetlist = new int[subsegs->items]; + } + out->numberofedges = subsegs->items; + elist = out->edgelist; + } + + // Determine the first index (0 or 1). + firstindex = b->zeroindex ? 0 : in->firstnumber; + shift = 0; // Default no shiftment. + if ((in->firstnumber == 1) && (firstindex == 0)) { + shift = 1; // Shift the output indices by 1. + } + index = 0; + i = 0; + + subsegs->traversalinit(); + edgeloop.sh = shellfacetraverse(subsegs); + edgenumber = firstindex; // in->firstnumber; + while (edgeloop.sh != (shellface *) NULL) { + torg = sorg(edgeloop); + tdest = sdest(edgeloop); + if ((b->order == 2) || (b->neighout > 1)) { + sstpivot1(edgeloop, workface); + if (workface.tet != NULL) { + // We must find a non-hull tet. + if (ishulltet(workface)) { + spintet = workface; + while (1) { + fnextself(spintet); + if (!ishulltet(spintet)) break; + if (spintet.tet == workface.tet) break; + } + workface = spintet; + } + } + } + if (b->order == 2) { // -o2 + // Get the extra vertex on this edge. + if (workface.tet != NULL) { + extralist = (point *) workface.tet[highorderindex]; + pp = extralist[ver2edge[workface.ver]]; + } else { + pp = torg; // There is no extra node available. + } + } + if (b->neighout > 1) { // -nn + if (workface.tet != NULL) { + neigh = elemindex(workface.tet); + } else { + neigh = -1; + } + } + marker = shellmark(edgeloop); + if (marker == 0) { + marker = 1; // Default marker of a boundary edge is 1. + } + if (out == (tetgenio *) NULL) { + fprintf(outfile, "%5d %4d %4d", edgenumber, + pointmark(torg) - shift, pointmark(tdest) - shift); + if (b->order == 2) { // -o2 + fprintf(outfile, " %4d", pointmark(pp) - shift); + } + fprintf(outfile, " %d", marker); + if (b->neighout > 1) { // -nn + fprintf(outfile, " %4d", neigh); + } + fprintf(outfile, "\n"); + } else { + // Output three vertices of this face; + elist[index++] = pointmark(torg) - shift; + elist[index++] = pointmark(tdest) - shift; + if (b->order == 2) { // -o2 + out->o2edgelist[o2index++] = pointmark(pp) - shift; + } + out->edgemarkerlist[i++] = marker; + if (b->neighout > 1) { // -nn + out->edge2tetlist[index2++] = neigh; + } + } + edgenumber++; + edgeloop.sh = shellfacetraverse(subsegs); + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outneighbors() Output tet neighbors to a .neigh file or a structure. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outneighbors(tetgenio* out) +{ + FILE *outfile = NULL; + char neighborfilename[FILENAMESIZE]; + int *nlist = NULL; + int index = 0; + triface tetloop, tetsym; + int neighbori[4]; + int firstindex; + int elementnumber; + long ntets; + + if (out == (tetgenio *) NULL) { + strcpy(neighborfilename, b->outfilename); + strcat(neighborfilename, ".neigh"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", neighborfilename); + } else { + printf("Writing neighbors.\n"); + } + } + + ntets = tetrahedrons->items - hullsize; + + if (out == (tetgenio *) NULL) { + outfile = fopen(neighborfilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", neighborfilename); + terminatetetgen(this, 1); + } + // Number of tetrahedra, four faces per tetrahedron. + fprintf(outfile, "%ld %d\n", ntets, 4); + } else { + // Allocate memory for 'neighborlist'. + out->neighborlist = new int[ntets * 4]; + if (out->neighborlist == (int *) NULL) { + printf("Error: Out of memory.\n"); + terminatetetgen(this, 1); + } + nlist = out->neighborlist; + } + + // Determine the first index (0 or 1). + firstindex = b->zeroindex ? 0 : in->firstnumber; + + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + elementnumber = firstindex; // in->firstnumber; + while (tetloop.tet != (tetrahedron *) NULL) { + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + fsym(tetloop, tetsym); + if (!ishulltet(tetsym)) { + neighbori[tetloop.ver] = elemindex(tetsym.tet); + } else { + neighbori[tetloop.ver] = -1; + } + } + if (out == (tetgenio *) NULL) { + // Tetrahedra number, neighboring tetrahedron numbers. + fprintf(outfile, "%4d %4d %4d %4d %4d\n", elementnumber, + neighbori[0], neighbori[1], neighbori[2], neighbori[3]); + } else { + nlist[index++] = neighbori[0]; + nlist[index++] = neighbori[1]; + nlist[index++] = neighbori[2]; + nlist[index++] = neighbori[3]; + } + tetloop.tet = tetrahedrontraverse(); + elementnumber++; + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outvoronoi() Output the Voronoi diagram to .v.node, .v.edge, v.face, // +// and .v.cell. // +// // +// The Voronoi diagram is the geometric dual of the Delaunay triangulation. // +// The Voronoi vertices are the circumcenters of Delaunay tetrahedra. Each // +// Voronoi edge connects two Voronoi vertices at two sides of a common Dela- // +// unay face. At a face of convex hull, it becomes a ray (goto the infinity).// +// A Voronoi face is the convex hull of all Voronoi vertices around a common // +// Delaunay edge. It is a closed polygon for any internal Delaunay edge. At a// +// ridge, it is unbounded. Each Voronoi cell is the convex hull of all Vor- // +// onoi vertices around a common Delaunay vertex. It is a polytope for any // +// internal Delaunay vertex. It is an unbounded polyhedron for a Delaunay // +// vertex belonging to the convex hull. // +// // +// NOTE: This routine is only used when the input is only a set of point. // +// Comment: Special thanks to Victor Liu for finding and fixing few bugs. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outvoronoi(tetgenio* out) +{ + FILE *outfile = NULL; + char outfilename[FILENAMESIZE]; + tetgenio::voroedge *vedge = NULL; + tetgenio::vorofacet *vfacet = NULL; + arraypool *tetlist, *ptlist; + triface tetloop, worktet, spintet, firsttet; + point pt[4], ploop, neipt; + REAL ccent[3], infvec[3], vec1[3], vec2[3], L; + long ntets, faces, edges; + int *indexarray, *fidxs, *eidxs; + int arraysize, *vertarray = NULL; + int vpointcount, vedgecount, vfacecount, tcount; + int ishullvert, ishullface; + int index, shift, end1, end2; + int i, j; + + int t1ver; // used by fsymself() + + // Output Voronoi vertices to .v.node file. + if (out == (tetgenio *) NULL) { + strcpy(outfilename, b->outfilename); + strcat(outfilename, ".v.node"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", outfilename); + } else { + printf("Writing Voronoi vertices.\n"); + } + } + + // Determine the first index (0 or 1). + shift = (b->zeroindex ? 0 : in->firstnumber); + + // Each face and edge of the tetrahedral mesh will be indexed for indexing + // the Voronoi edges and facets. Indices of faces and edges are saved in + // each tetrahedron (including hull tets). + + // Allocate the total space once. + indexarray = new int[tetrahedrons->items * 10]; + + // Allocate space (10 integers) into each tetrahedron. It re-uses the slot + // for element markers, flags. + i = 0; + tetrahedrons->traversalinit(); + tetloop.tet = alltetrahedrontraverse(); + while (tetloop.tet != NULL) { + tetloop.tet[11] = (tetrahedron) &(indexarray[i * 10]); + i++; + tetloop.tet = alltetrahedrontraverse(); + } + + // The number of tetrahedra (excluding hull tets) (Voronoi vertices). + ntets = tetrahedrons->items - hullsize; + // The number of Delaunay faces (Voronoi edges). + faces = (4l * ntets + hullsize) / 2l; + // The number of Delaunay edges (Voronoi faces). + long vsize = points->items - dupverts - unuverts; + if (b->weighted) vsize -= nonregularcount; + if (!nonconvex) { + edges = vsize + faces - ntets - 1; + } else { + if (meshedges == 0l) { + numberedges(); // Count edges. + } + edges = meshedges; + } + + if (out == (tetgenio *) NULL) { + outfile = fopen(outfilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", outfilename); + terminatetetgen(this, 3); + } + // Number of voronoi points, 3 dim, no attributes, no marker. + fprintf(outfile, "%ld 3 0 0\n", ntets); + } else { + // Allocate space for 'vpointlist'. + out->numberofvpoints = (int) ntets; + out->vpointlist = new REAL[out->numberofvpoints * 3]; + if (out->vpointlist == (REAL *) NULL) { + terminatetetgen(this, 1); + } + } + + // Output Voronoi vertices (the circumcenters of tetrahedra). + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + vpointcount = 0; // The (internal) v-index always starts from 0. + index = 0; + while (tetloop.tet != (tetrahedron *) NULL) { + for (i = 0; i < 4; i++) { + pt[i] = (point) tetloop.tet[4 + i]; + setpoint2tet(pt[i], encode(tetloop)); + } + if (b->weighted) { + orthosphere(pt[0], pt[1], pt[2], pt[3], pt[0][3], pt[1][3], pt[2][3], + pt[3][3], ccent, NULL); + } else { + circumsphere(pt[0], pt[1], pt[2], pt[3], ccent, NULL); + } + if (out == (tetgenio *) NULL) { + fprintf(outfile, "%4d %16.8e %16.8e %16.8e\n", vpointcount + shift, + ccent[0], ccent[1], ccent[2]); + } else { + out->vpointlist[index++] = ccent[0]; + out->vpointlist[index++] = ccent[1]; + out->vpointlist[index++] = ccent[2]; + } + setelemindex(tetloop.tet, vpointcount); + vpointcount++; + tetloop.tet = tetrahedrontraverse(); + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } + + // Output Voronoi edges to .v.edge file. + if (out == (tetgenio *) NULL) { + strcpy(outfilename, b->outfilename); + strcat(outfilename, ".v.edge"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", outfilename); + } else { + printf("Writing Voronoi edges.\n"); + } + } + + if (out == (tetgenio *) NULL) { + outfile = fopen(outfilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", outfilename); + terminatetetgen(this, 3); + } + // Number of Voronoi edges, no marker. + fprintf(outfile, "%ld 0\n", faces); + } else { + // Allocate space for 'vpointlist'. + out->numberofvedges = (int) faces; + out->vedgelist = new tetgenio::voroedge[out->numberofvedges]; + } + + // Output the Voronoi edges. + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + vedgecount = 0; // D-Face (V-edge) index (from zero). + index = 0; // The Delaunay-face index. + while (tetloop.tet != (tetrahedron *) NULL) { + // Count the number of Voronoi edges. Look at the four faces of each + // tetrahedron. Count the face if the tetrahedron's index is + // smaller than its neighbor's or the neighbor is outside. + end1 = elemindex(tetloop.tet); + for (tetloop.ver = 0; tetloop.ver < 4; tetloop.ver++) { + fsym(tetloop, worktet); + if (ishulltet(worktet) || + (elemindex(tetloop.tet) < elemindex(worktet.tet))) { + // Found a Voronoi edge. Operate on it. + if (out == (tetgenio *) NULL) { + fprintf(outfile, "%4d %4d", vedgecount + shift, end1 + shift); + } else { + vedge = &(out->vedgelist[index++]); + vedge->v1 = end1 + shift; + } + if (!ishulltet(worktet)) { + end2 = elemindex(worktet.tet); + } else { + end2 = -1; + } + // Note that end2 may be -1 (worktet.tet is outside). + if (end2 == -1) { + // Calculate the out normal of this hull face. + pt[0] = dest(worktet); + pt[1] = org(worktet); + pt[2] = apex(worktet); + for (j = 0; j < 3; j++) vec1[j] = pt[1][j] - pt[0][j]; + for (j = 0; j < 3; j++) vec2[j] = pt[2][j] - pt[0][j]; + cross(vec1, vec2, infvec); + // Normalize it. + L = sqrt(infvec[0] * infvec[0] + infvec[1] * infvec[1] + + infvec[2] * infvec[2]); + if (L > 0) for (j = 0; j < 3; j++) infvec[j] /= L; + if (out == (tetgenio *) NULL) { + fprintf(outfile, " -1"); + fprintf(outfile, " %g %g %g\n", infvec[0], infvec[1], infvec[2]); + } else { + vedge->v2 = -1; + vedge->vnormal[0] = infvec[0]; + vedge->vnormal[1] = infvec[1]; + vedge->vnormal[2] = infvec[2]; + } + } else { + if (out == (tetgenio *) NULL) { + fprintf(outfile, " %4d\n", end2 + shift); + } else { + vedge->v2 = end2 + shift; + vedge->vnormal[0] = 0.0; + vedge->vnormal[1] = 0.0; + vedge->vnormal[2] = 0.0; + } + } + // Save the V-edge index in this tet and its neighbor. + fidxs = (int *) (tetloop.tet[11]); + fidxs[tetloop.ver] = vedgecount; + fidxs = (int *) (worktet.tet[11]); + fidxs[worktet.ver & 3] = vedgecount; + vedgecount++; + } + } // tetloop.ver + tetloop.tet = tetrahedrontraverse(); + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } + + // Output Voronoi faces to .v.face file. + if (out == (tetgenio *) NULL) { + strcpy(outfilename, b->outfilename); + strcat(outfilename, ".v.face"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", outfilename); + } else { + printf("Writing Voronoi faces.\n"); + } + } + + if (out == (tetgenio *) NULL) { + outfile = fopen(outfilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", outfilename); + terminatetetgen(this, 3); + } + // Number of Voronoi faces. + fprintf(outfile, "%ld 0\n", edges); + } else { + out->numberofvfacets = edges; + out->vfacetlist = new tetgenio::vorofacet[out->numberofvfacets]; + if (out->vfacetlist == (tetgenio::vorofacet *) NULL) { + terminatetetgen(this, 1); + } + } + + // Output the Voronoi facets. + tetrahedrons->traversalinit(); + tetloop.tet = tetrahedrontraverse(); + vfacecount = 0; // D-edge (V-facet) index (from zero). + while (tetloop.tet != (tetrahedron *) NULL) { + // Count the number of Voronoi faces. Look at the six edges of each + // tetrahedron. Count the edge only if the tetrahedron's index is + // smaller than those of all other tetrahedra that share the edge. + worktet.tet = tetloop.tet; + for (i = 0; i < 6; i++) { + worktet.ver = edge2ver[i]; + // Count the number of faces at this edge. If the edge is a hull edge, + // the face containing dummypoint is also counted. + //ishulledge = 0; // Is it a hull edge. + tcount = 0; + firsttet = worktet; + spintet = worktet; + while (1) { + tcount++; + fnextself(spintet); + if (spintet.tet == worktet.tet) break; + if (!ishulltet(spintet)) { + if (elemindex(spintet.tet) < elemindex(worktet.tet)) break; + } else { + //ishulledge = 1; + if (apex(spintet) == dummypoint) { + // We make this V-edge appear in the end of the edge list. + fnext(spintet, firsttet); + } + } + } // while (1) + if (spintet.tet == worktet.tet) { + // Found a Voronoi facet. Operate on it. + pt[0] = org(worktet); + pt[1] = dest(worktet); + end1 = pointmark(pt[0]) - in->firstnumber; // V-cell index + end2 = pointmark(pt[1]) - in->firstnumber; + if (out == (tetgenio *) NULL) { + fprintf(outfile, "%4d %4d %4d %-2d ", vfacecount + shift, + end1 + shift, end2 + shift, tcount); + } else { + vfacet = &(out->vfacetlist[vfacecount]); + vfacet->c1 = end1 + shift; + vfacet->c2 = end2 + shift; + vfacet->elist = new int[tcount + 1]; + vfacet->elist[0] = tcount; + index = 1; + } + // Output V-edges of this V-facet. + spintet = firsttet; //worktet; + while (1) { + fidxs = (int *) (spintet.tet[11]); + if (apex(spintet) != dummypoint) { + vedgecount = fidxs[spintet.ver & 3]; + ishullface = 0; + } else { + ishullface = 1; // It's not a real face. + } + if (out == (tetgenio *) NULL) { + fprintf(outfile, " %d", !ishullface ? (vedgecount + shift) : -1); + } else { + vfacet->elist[index++] = !ishullface ? (vedgecount + shift) : -1; + } + // Save the V-facet index in this tet at this edge. + eidxs = &(fidxs[4]); + eidxs[ver2edge[spintet.ver]] = vfacecount; + // Go to the next face. + fnextself(spintet); + if (spintet.tet == firsttet.tet) break; + } // while (1) + if (out == (tetgenio *) NULL) { + fprintf(outfile, "\n"); + } + vfacecount++; + } // if (spintet.tet == worktet.tet) + } // if (i = 0; i < 6; i++) + tetloop.tet = tetrahedrontraverse(); + } + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } + + // Output Voronoi cells to .v.cell file. + if (out == (tetgenio *) NULL) { + strcpy(outfilename, b->outfilename); + strcat(outfilename, ".v.cell"); + } + + if (!b->quiet) { + if (out == (tetgenio *) NULL) { + printf("Writing %s.\n", outfilename); + } else { + printf("Writing Voronoi cells.\n"); + } + } + + if (out == (tetgenio *) NULL) { + outfile = fopen(outfilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", outfilename); + terminatetetgen(this, 3); + } + // Number of Voronoi cells. + fprintf(outfile, "%ld\n", points->items - unuverts - dupverts); + } else { + out->numberofvcells = points->items - unuverts - dupverts; + out->vcelllist = new int*[out->numberofvcells]; + if (out->vcelllist == (int **) NULL) { + terminatetetgen(this, 1); + } + } + + // Output Voronoi cells. + tetlist = cavetetlist; + ptlist = cavetetvertlist; + points->traversalinit(); + ploop = pointtraverse(); + vpointcount = 0; + while (ploop != (point) NULL) { + if ((pointtype(ploop) != UNUSEDVERTEX) && + (pointtype(ploop) != DUPLICATEDVERTEX) && + (pointtype(ploop) != NREGULARVERTEX)) { + getvertexstar(1, ploop, tetlist, ptlist, NULL); + // Mark all vertices. Check if it is a hull vertex. + ishullvert = 0; + for (i = 0; i < ptlist->objects; i++) { + neipt = * (point *) fastlookup(ptlist, i); + if (neipt != dummypoint) { + pinfect(neipt); + } else { + ishullvert = 1; + } + } + tcount = (int) ptlist->objects; + if (out == (tetgenio *) NULL) { + fprintf(outfile, "%4d %-2d ", vpointcount + shift, tcount); + } else { + arraysize = tcount; + vertarray = new int[arraysize + 1]; + out->vcelllist[vpointcount] = vertarray; + vertarray[0] = tcount; + index = 1; + } + // List Voronoi facets bounding this cell. + for (i = 0; i < tetlist->objects; i++) { + worktet = * (triface *) fastlookup(tetlist, i); + // Let 'worktet' be [a,b,c,d] where d = ploop. + for (j = 0; j < 3; j++) { + neipt = org(worktet); // neipt is a, or b, or c + // Skip the dummypoint. + if (neipt != dummypoint) { + if (pinfected(neipt)) { + // It's not processed yet. + puninfect(neipt); + // Go to the DT edge [a,d], or [b,d], or [c,d]. + esym(worktet, spintet); + enextself(spintet); + // Get the V-face dual to this edge. + eidxs = (int *) spintet.tet[11]; + vfacecount = eidxs[4 + ver2edge[spintet.ver]]; + if (out == (tetgenio *) NULL) { + fprintf(outfile, " %d", vfacecount + shift); + } else { + vertarray[index++] = vfacecount + shift; + } + } + } + enextself(worktet); + } // j + } // i + if (ishullvert) { + // Add a hull facet (-1) to the facet list. + if (out == (tetgenio *) NULL) { + fprintf(outfile, " -1"); + } else { + vertarray[index++] = -1; + } + } + if (out == (tetgenio *) NULL) { + fprintf(outfile, "\n"); + } + tetlist->restart(); + ptlist->restart(); + vpointcount++; + } + ploop = pointtraverse(); + } + + // Delete the space for face/edge indices. + delete [] indexarray; + + if (out == (tetgenio *) NULL) { + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outsmesh() Write surface mesh to a .smesh file, which can be read and // +// tetrahedralized by TetGen. // +// // +// You can specify a filename (without suffix) in 'smfilename'. If you don't // +// supply a filename (let smfilename be NULL), the default name stored in // +// 'tetgenbehavior' will be used. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outsmesh(char* smfilename) +{ + FILE *outfile; + char nodfilename[FILENAMESIZE]; + char smefilename[FILENAMESIZE]; + face faceloop; + point p1, p2, p3; + int firstindex, shift; + int bmark; + int marker; + int i; + + if (smfilename != (char *) NULL && smfilename[0] != '\0') { + strcpy(smefilename, smfilename); + } else if (b->outfilename[0] != '\0') { + strcpy(smefilename, b->outfilename); + } else { + strcpy(smefilename, "unnamed"); + } + strcpy(nodfilename, smefilename); + strcat(smefilename, ".smesh"); + strcat(nodfilename, ".node"); + + if (!b->quiet) { + printf("Writing %s.\n", smefilename); + } + outfile = fopen(smefilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", smefilename); + return; + } + + // Determine the first index (0 or 1). + firstindex = b->zeroindex ? 0 : in->firstnumber; + shift = 0; // Default no shiftment. + if ((in->firstnumber == 1) && (firstindex == 0)) { + shift = 1; // Shift the output indices by 1. + } + + fprintf(outfile, "# %s. TetGen's input file.\n", smefilename); + fprintf(outfile, "\n# part 1: node list.\n"); + fprintf(outfile, "0 3 0 0 # nodes are found in %s.\n", nodfilename); + + marker = 0; // avoid compile warning. + bmark = !b->nobound && (in->facetmarkerlist || in->trifacemarkerlist); + + fprintf(outfile, "\n# part 2: facet list.\n"); + // Number of facets, boundary marker. + fprintf(outfile, "%ld %d\n", subfaces->items, bmark); + + subfaces->traversalinit(); + faceloop.sh = shellfacetraverse(subfaces); + while (faceloop.sh != (shellface *) NULL) { + p1 = sorg(faceloop); + p2 = sdest(faceloop); + p3 = sapex(faceloop); + if (bmark) { + marker = shellmark(faceloop); + } + fprintf(outfile, "3 %4d %4d %4d", pointmark(p1) - shift, + pointmark(p2) - shift, pointmark(p3) - shift); + if (bmark) { + fprintf(outfile, " %d", marker); + } + fprintf(outfile, "\n"); + faceloop.sh = shellfacetraverse(subfaces); + } + + // Copy input holelist. + fprintf(outfile, "\n# part 3: hole list.\n"); + fprintf(outfile, "%d\n", in->numberofholes); + for (i = 0; i < in->numberofholes; i++) { + fprintf(outfile, "%d %g %g %g\n", i + in->firstnumber, + in->holelist[i * 3], in->holelist[i * 3 + 1], + in->holelist[i * 3 + 2]); + } + + // Copy input regionlist. + fprintf(outfile, "\n# part 4: region list.\n"); + fprintf(outfile, "%d\n", in->numberofregions); + for (i = 0; i < in->numberofregions; i++) { + fprintf(outfile, "%d %g %g %g %d %g\n", i + in->firstnumber, + in->regionlist[i * 5], in->regionlist[i * 5 + 1], + in->regionlist[i * 5 + 2], (int) in->regionlist[i * 5 + 3], + in->regionlist[i * 5 + 4]); + } + + fprintf(outfile, "# Generated by %s\n", b->commandline); + fclose(outfile); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// outmesh2medit() Write mesh to a .mesh file, which can be read and // +// rendered by Medit (a free mesh viewer from INRIA). // +// // +// You can specify a filename (without suffix) in 'mfilename'. If you don't // +// supply a filename (let mfilename be NULL), the default name stored in // +// 'tetgenbehavior' will be used. The output file will have the suffix .mesh.// +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outmesh2medit(char* mfilename) +{ + FILE *outfile; + char mefilename[FILENAMESIZE]; + tetrahedron* tetptr; + triface tface, tsymface; + face segloop, checkmark; + point ptloop, p1, p2, p3, p4; + long ntets, faces; + int pointnumber; + int marker; + int i; + + if (mfilename != (char *) NULL && mfilename[0] != '\0') { + strcpy(mefilename, mfilename); + } else if (b->outfilename[0] != '\0') { + strcpy(mefilename, b->outfilename); + } else { + strcpy(mefilename, "unnamed"); + } + strcat(mefilename, ".mesh"); + + if (!b->quiet) { + printf("Writing %s.\n", mefilename); + } + outfile = fopen(mefilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", mefilename); + return; + } + + fprintf(outfile, "MeshVersionFormatted 1\n"); + fprintf(outfile, "\n"); + fprintf(outfile, "Dimension\n"); + fprintf(outfile, "3\n"); + fprintf(outfile, "\n"); + + fprintf(outfile, "\n# Set of mesh vertices\n"); + fprintf(outfile, "Vertices\n"); + fprintf(outfile, "%ld\n", points->items); + + points->traversalinit(); + ptloop = pointtraverse(); + pointnumber = 1; // Medit need start number form 1. + while (ptloop != (point) NULL) { + // Point coordinates. + fprintf(outfile, "%.17g %.17g %.17g", ptloop[0], ptloop[1], ptloop[2]); + if (in->numberofpointattributes > 0) { + // Write an attribute, ignore others if more than one. + fprintf(outfile, " %.17g\n", ptloop[3]); + } else { + fprintf(outfile, " 0\n"); + } + setpointmark(ptloop, pointnumber); + ptloop = pointtraverse(); + pointnumber++; + } + + // Compute the number of faces. + ntets = tetrahedrons->items - hullsize; + faces = (ntets * 4l + hullsize) / 2l; + + fprintf(outfile, "\n# Set of Triangles\n"); + fprintf(outfile, "Triangles\n"); + fprintf(outfile, "%ld\n", faces); + + tetrahedrons->traversalinit(); + tface.tet = tetrahedrontraverse(); + while (tface.tet != (tetrahedron *) NULL) { + for (tface.ver = 0; tface.ver < 4; tface.ver ++) { + fsym(tface, tsymface); + if (ishulltet(tsymface) || + (elemindex(tface.tet) < elemindex(tsymface.tet))) { + p1 = org (tface); + p2 = dest(tface); + p3 = apex(tface); + fprintf(outfile, "%5d %5d %5d", + pointmark(p1), pointmark(p2), pointmark(p3)); + // Check if it is a subface. + tspivot(tface, checkmark); + if (checkmark.sh == NULL) { + marker = 0; // It is an inner face. It's marker is 0. + } else { + marker = shellmark(checkmark); + } + fprintf(outfile, " %d\n", marker); + } + } + tface.tet = tetrahedrontraverse(); + } + + fprintf(outfile, "\n# Set of Tetrahedra\n"); + fprintf(outfile, "Tetrahedra\n"); + fprintf(outfile, "%ld\n", ntets); + + tetrahedrons->traversalinit(); + tetptr = tetrahedrontraverse(); + while (tetptr != (tetrahedron *) NULL) { + if (!b->reversetetori) { + p1 = (point) tetptr[4]; + p2 = (point) tetptr[5]; + } else { + p1 = (point) tetptr[5]; + p2 = (point) tetptr[4]; + } + p3 = (point) tetptr[6]; + p4 = (point) tetptr[7]; + fprintf(outfile, "%5d %5d %5d %5d", + pointmark(p1), pointmark(p2), pointmark(p3), pointmark(p4)); + if (numelemattrib > 0) { + fprintf(outfile, " %.17g", elemattribute(tetptr, 0)); + } else { + fprintf(outfile, " 0"); + } + fprintf(outfile, "\n"); + tetptr = tetrahedrontraverse(); + } + + fprintf(outfile, "\nCorners\n"); + fprintf(outfile, "%d\n", in->numberofpoints); + + for (i = 0; i < in->numberofpoints; i++) { + fprintf(outfile, "%4d\n", i + 1); + } + + if (b->plc || b->refine) { + fprintf(outfile, "\nEdges\n"); + fprintf(outfile, "%ld\n", subsegs->items); + + subsegs->traversalinit(); + segloop.sh = shellfacetraverse(subsegs); + while (segloop.sh != (shellface *) NULL) { + p1 = sorg(segloop); + p2 = sdest(segloop); + fprintf(outfile, "%5d %5d", pointmark(p1), pointmark(p2)); + marker = shellmark(segloop); + fprintf(outfile, " %d\n", marker); + segloop.sh = shellfacetraverse(subsegs); + } + } + + fprintf(outfile, "\nEnd\n"); + fclose(outfile); +} + + + + + +/////////////////////////////////////////////////////////////////////////////// +// // +// outmesh2vtk() Save mesh to file in VTK Legacy format. // +// // +// This function was contributed by Bryn Llyod from ETH, 2007. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetgenmesh::outmesh2vtk(char* ofilename) +{ + FILE *outfile; + char vtkfilename[FILENAMESIZE]; + point pointloop, p1, p2, p3, p4; + tetrahedron* tptr; + double x, y, z; + int n1, n2, n3, n4; + int nnodes = 4; + int celltype = 10; + + if (b->order == 2) { + printf(" Write VTK not implemented for order 2 elements \n"); + return; + } + + int NEL = tetrahedrons->items - hullsize; + int NN = points->items; + + if (ofilename != (char *) NULL && ofilename[0] != '\0') { + strcpy(vtkfilename, ofilename); + } else if (b->outfilename[0] != '\0') { + strcpy(vtkfilename, b->outfilename); + } else { + strcpy(vtkfilename, "unnamed"); + } + strcat(vtkfilename, ".vtk"); + + if (!b->quiet) { + printf("Writing %s.\n", vtkfilename); + } + outfile = fopen(vtkfilename, "w"); + if (outfile == (FILE *) NULL) { + printf("File I/O Error: Cannot create file %s.\n", vtkfilename); + return; + } + + //always write big endian + //bool ImALittleEndian = !testIsBigEndian(); + + fprintf(outfile, "# vtk DataFile Version 2.0\n"); + fprintf(outfile, "Unstructured Grid\n"); + fprintf(outfile, "ASCII\n"); // BINARY + fprintf(outfile, "DATASET UNSTRUCTURED_GRID\n"); + fprintf(outfile, "POINTS %d double\n", NN); + + points->traversalinit(); + pointloop = pointtraverse(); + for(int id=0; idtraversalinit(); + tptr = tetrahedrontraverse(); + //elementnumber = firstindex; // in->firstnumber; + while (tptr != (tetrahedron *) NULL) { + if (!b->reversetetori) { + p1 = (point) tptr[4]; + p2 = (point) tptr[5]; + } else { + p1 = (point) tptr[5]; + p2 = (point) tptr[4]; + } + p3 = (point) tptr[6]; + p4 = (point) tptr[7]; + n1 = pointmark(p1) - in->firstnumber; + n2 = pointmark(p2) - in->firstnumber; + n3 = pointmark(p3) - in->firstnumber; + n4 = pointmark(p4) - in->firstnumber; + fprintf(outfile, "%d %4d %4d %4d %4d\n", nnodes, n1, n2, n3, n4); + tptr = tetrahedrontraverse(); + } + fprintf(outfile, "\n"); + + fprintf(outfile, "CELL_TYPES %d\n", NEL); + for(int tid=0; tid 0) { + // Output tetrahedra region attributes. + fprintf(outfile, "CELL_DATA %d\n", NEL); + fprintf(outfile, "SCALARS cell_scalars int 1\n"); + fprintf(outfile, "LOOKUP_TABLE default\n"); + tetrahedrons->traversalinit(); + tptr = tetrahedrontraverse(); + while (tptr != (tetrahedron *) NULL) { + fprintf(outfile, "%d\n", (int) elemattribute(tptr, numelemattrib - 1)); + tptr = tetrahedrontraverse(); + } + fprintf(outfile, "\n"); + } + + fclose(outfile); +} + +//// //// +//// //// +//// output_cxx /////////////////////////////////////////////////////////////// + +//// main_cxx ///////////////////////////////////////////////////////////////// +//// //// +//// //// + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetrahedralize() The interface for users using TetGen library to // +// generate tetrahedral meshes with all features. // +// // +// The sequence is roughly as follows. Many of these steps can be skipped, // +// depending on the command line switches. // +// // +// - Initialize constants and parse the command line. // +// - Read the vertices from a file and either // +// - tetrahedralize them (no -r), or // +// - read an old mesh from files and reconstruct it (-r). // +// - Insert the boundary segments and facets (-p or -Y). // +// - Read the holes (-p), regional attributes (-pA), and regional volume // +// constraints (-pa). Carve the holes and concavities, and spread the // +// regional attributes and volume constraints. // +// - Enforce the constraints on minimum quality bound (-q) and maximum // +// volume (-a), and a mesh size function (-m). // +// - Optimize the mesh wrt. specified quality measures (-O and -o). // +// - Write the output files and print the statistics. // +// - Check the consistency of the mesh (-C). // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetrahedralize(tetgenbehavior *b, tetgenio *in, tetgenio *out, + tetgenio *addin, tetgenio *bgmin) +{ + tetgenmesh m; + clock_t tv[12], ts[5]; // Timing informations (defined in time.h) + REAL cps = (REAL) CLOCKS_PER_SEC; + + tv[0] = clock(); + + m.b = b; + m.in = in; + m.addin = addin; + + if (b->metric && bgmin && (bgmin->numberofpoints > 0)) { + m.bgm = new tetgenmesh(); // Create an empty background mesh. + m.bgm->b = b; + m.bgm->in = bgmin; + } + + m.initializepools(); + m.transfernodes(); + + exactinit(b->verbose, b->noexact, b->nostaticfilter, + m.xmax - m.xmin, m.ymax - m.ymin, m.zmax - m.zmin); + + tv[1] = clock(); + + if (b->refine) { // -r + m.reconstructmesh(); + } else { // -p + m.incrementaldelaunay(ts[0]); + } + + tv[2] = clock(); + + if (!b->quiet) { + if (b->refine) { + printf("Mesh reconstruction seconds: %g\n", ((REAL)(tv[2]-tv[1])) / cps); + } else { + printf("Delaunay seconds: %g\n", ((REAL)(tv[2]-tv[1])) / cps); + if (b->verbose) { + printf(" Point sorting seconds: %g\n", ((REAL)(ts[0]-tv[1])) / cps); + + } + } + } + + if (b->plc && !b->refine) { // -p + m.meshsurface(); + + ts[0] = clock(); + + if (!b->quiet) { + printf("Surface mesh seconds: %g\n", ((REAL)(ts[0]-tv[2])) / cps); + } + + if (b->diagnose) { // -d + m.detectinterfaces(); + + ts[1] = clock(); + + if (!b->quiet) { + printf("Self-intersection seconds: %g\n", ((REAL)(ts[1]-ts[0])) / cps); + } + + // Only output when self-intersecting faces exist. + if (m.subfaces->items > 0l) { + m.outnodes(out); + m.outsubfaces(out); + } + + return; + } + } + + + tv[3] = clock(); + + if ((b->metric) && (m.bgm != NULL)) { // -m + m.bgm->initializepools(); + m.bgm->transfernodes(); + m.bgm->reconstructmesh(); + + ts[0] = clock(); + + if (!b->quiet) { + printf("Background mesh reconstruct seconds: %g\n", + ((REAL)(ts[0] - tv[3])) / cps); + } + + if (b->metric) { // -m + m.interpolatemeshsize(); + + ts[1] = clock(); + + if (!b->quiet) { + printf("Size interpolating seconds: %g\n",((REAL)(ts[1]-ts[0])) / cps); + } + } + } + + tv[4] = clock(); + + if (b->plc && !b->refine) { // -p + if (b->nobisect) { // -Y + m.recoverboundary(ts[0]); + } else { + m.constraineddelaunay(ts[0]); + } + + ts[1] = clock(); + + if (!b->quiet) { + if (b->nobisect) { + printf("Boundary recovery "); + } else { + printf("Constrained Delaunay "); + } + printf("seconds: %g\n", ((REAL)(ts[1] - tv[4])) / cps); + if (b->verbose) { + printf(" Segment recovery seconds: %g\n",((REAL)(ts[0]-tv[4]))/ cps); + printf(" Facet recovery seconds: %g\n", ((REAL)(ts[1]-ts[0])) / cps); + } + } + + m.carveholes(); + + ts[2] = clock(); + + if (!b->quiet) { + printf("Exterior tets removal seconds: %g\n",((REAL)(ts[2]-ts[1]))/cps); + } + + if (b->nobisect) { // -Y + if (m.subvertstack->objects > 0l) { + m.suppresssteinerpoints(); + + ts[3] = clock(); + + if (!b->quiet) { + printf("Steiner suppression seconds: %g\n", + ((REAL)(ts[3]-ts[2]))/cps); + } + } + } + } + + tv[5] = clock(); + + if (b->coarsen) { // -R + m.meshcoarsening(); + } + + tv[6] = clock(); + + if (!b->quiet) { + if (b->coarsen) { + printf("Mesh coarsening seconds: %g\n", ((REAL)(tv[6] - tv[5])) / cps); + } + } + + if ((b->plc && b->nobisect) || b->coarsen) { + m.recoverdelaunay(); + } + + tv[7] = clock(); + + if (!b->quiet) { + if ((b->plc && b->nobisect) || b->coarsen) { + printf("Delaunay recovery seconds: %g\n", ((REAL)(tv[7] - tv[6]))/cps); + } + } + + if ((b->plc || b->refine) && b->insertaddpoints) { // -i + if ((addin != NULL) && (addin->numberofpoints > 0)) { + m.insertconstrainedpoints(addin); + } + } + + tv[8] = clock(); + + if (!b->quiet) { + if ((b->plc || b->refine) && b->insertaddpoints) { // -i + if ((addin != NULL) && (addin->numberofpoints > 0)) { + printf("Constrained points seconds: %g\n", ((REAL)(tv[8]-tv[7]))/cps); + } + } + } + + if (b->quality) { + m.delaunayrefinement(); + } + + tv[9] = clock(); + + if (!b->quiet) { + if (b->quality) { + printf("Refinement seconds: %g\n", ((REAL)(tv[9] - tv[8])) / cps); + } + } + + if ((b->plc || b->refine) && (b->optlevel > 0)) { + m.optimizemesh(); + } + + tv[10] = clock(); + + if (!b->quiet) { + if ((b->plc || b->refine) && (b->optlevel > 0)) { + printf("Optimization seconds: %g\n", ((REAL)(tv[10] - tv[9])) / cps); + } + } + + + if (!b->nojettison && ((m.dupverts > 0) || (m.unuverts > 0) + || (b->refine && (in->numberofcorners == 10)))) { + m.jettisonnodes(); + } + + if ((b->order == 2) && !b->convex) { + m.highorder(); + } + + if (!b->quiet) { + printf("\n"); + } + + if (out != (tetgenio *) NULL) { + out->firstnumber = in->firstnumber; + out->mesh_dim = in->mesh_dim; + } + + if (b->nonodewritten || b->noiterationnum) { + if (!b->quiet) { + printf("NOT writing a .node file.\n"); + } + } else { + m.outnodes(out); + } + + if (b->noelewritten) { + if (!b->quiet) { + printf("NOT writing an .ele file.\n"); + } + m.indexelements(); + } else { + if (m.tetrahedrons->items > 0l) { + m.outelements(out); + } + } + + if (b->nofacewritten) { + if (!b->quiet) { + printf("NOT writing an .face file.\n"); + } + } else { + if (b->facesout) { + if (m.tetrahedrons->items > 0l) { + m.outfaces(out); // Output all faces. + } + } else { + if (b->plc || b->refine) { + if (m.subfaces->items > 0l) { + m.outsubfaces(out); // Output boundary faces. + } + } else { + if (m.tetrahedrons->items > 0l) { + m.outhullfaces(out); // Output convex hull faces. + } + } + } + } + + + if (b->nofacewritten) { + if (!b->quiet) { + printf("NOT writing an .edge file.\n"); + } + } else { + if (b->edgesout) { // -e + m.outedges(out); // output all mesh edges. + } else { + if (b->plc || b->refine) { + m.outsubsegments(out); // output subsegments. + } + } + } + + if ((b->plc || b->refine) && b->metric) { // -m + m.outmetrics(out); + } + + if (!out && b->plc && + ((b->object == tetgenbehavior::OFF) || + (b->object == tetgenbehavior::PLY) || + (b->object == tetgenbehavior::STL))) { + m.outsmesh(b->outfilename); + } + + if (!out && b->meditview) { + m.outmesh2medit(b->outfilename); + } + + + if (!out && b->vtkview) { + m.outmesh2vtk(b->outfilename); + } + + if (b->neighout) { + m.outneighbors(out); + } + + if (b->voroout) { + m.outvoronoi(out); + } + + + tv[11] = clock(); + + if (!b->quiet) { + printf("\nOutput seconds: %g\n", ((REAL)(tv[11] - tv[10])) / cps); + printf("Total running seconds: %g\n", ((REAL)(tv[11] - tv[0])) / cps); + } + + if (b->docheck) { + m.checkmesh(0); + if (b->plc || b->refine) { + m.checkshells(); + m.checksegments(); + } + if (b->docheck > 1) { + m.checkdelaunay(); + } + } + + if (!b->quiet) { + m.statistics(); + } +} + +#ifndef TETLIBRARY + +/////////////////////////////////////////////////////////////////////////////// +// // +// main() The command line interface of TetGen. // +// // +/////////////////////////////////////////////////////////////////////////////// + +int main(int argc, char *argv[]) + +#else // with TETLIBRARY + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetrahedralize() The library interface of TetGen. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetrahedralize(char *switches, tetgenio *in, tetgenio *out, + tetgenio *addin, tetgenio *bgmin) + +#endif // not TETLIBRARY + +{ + tetgenbehavior b; + +#ifndef TETLIBRARY + + tetgenio in, addin, bgmin; + + if (!b.parse_commandline(argc, argv)) { + terminatetetgen(NULL, 10); + } + + // Read input files. + if (b.refine) { // -r + if (!in.load_tetmesh(b.infilename, (int) b.object)) { + terminatetetgen(NULL, 10); + } + } else { // -p + if (!in.load_plc(b.infilename, (int) b.object)) { + terminatetetgen(NULL, 10); + } + } + if (b.insertaddpoints) { // -i + // Try to read a .a.node file. + addin.load_node(b.addinfilename); + } + if (b.metric) { // -m + // Try to read a background mesh in files .b.node, .b.ele. + bgmin.load_tetmesh(b.bgmeshfilename, (int) b.object); + } + + tetrahedralize(&b, &in, NULL, &addin, &bgmin); + + return 0; + +#else // with TETLIBRARY + + if (!b.parse_commandline(switches)) { + terminatetetgen(NULL, 10); + } + tetrahedralize(&b, in, out, addin, bgmin); + +#endif // not TETLIBRARY +} + +//// //// +//// //// +//// main_cxx ///////////////////////////////////////////////////////////////// + diff --git a/src/tool/tetgen.h b/src/tool/tetgen.h new file mode 100644 index 0000000..11a4cda --- /dev/null +++ b/src/tool/tetgen.h @@ -0,0 +1,3438 @@ +/////////////////////////////////////////////////////////////////////////////// +// // +// TetGen // +// // +// A Quality Tetrahedral Mesh Generator and A 3D Delaunay Triangulator // +// // +// Version 1.5 // +// August 18, 2018 // +// // +// Copyright (C) 2002--2018 // +// // +// TetGen is freely available through the website: http://www.tetgen.org. // +// It may be copied, modified, and redistributed for non-commercial use. // +// Please consult the file LICENSE for the detailed copyright notices. // +// // +/////////////////////////////////////////////////////////////////////////////// + + +#ifndef tetgenH +#define tetgenH + +// To compile TetGen as a library instead of an executable program, define +// the TETLIBRARY symbol. + +//#define TETLIBRARY + + +// TetGen default uses the double precision (64 bit) for a real number. +// Alternatively, one can use the single precision (32 bit) 'float' if the +// memory is limited. + +#define REAL double // #define REAL float + +// Maximum number of characters in a file name (including the null). + +#define FILENAMESIZE 1024 + +// Maximum number of chars in a line read from a file (including the null). + +#define INPUTLINESIZE 2048 + +// TetGen only uses the C standard library. + +#include +#include +#include +#include +#include + +// The types 'intptr_t' and 'uintptr_t' are signed and unsigned integer types, +// respectively. They are guaranteed to be the same width as a pointer. +// They are defined in by the C99 Standard. However, Microsoft +// Visual C++ 2003 -- 2008 (Visual C++ 7.1 - 9) doesn't ship with this header +// file. In such case, we can define them by ourself. +// Update (learned from Stack Overflow): Visual Studio 2010 and Visual C++ 2010 +// Express both have stdint.h + +// The following piece of code was provided by Steven Johnson (MIT). Define the +// symbol _MSC_VER if you are using Microsoft Visual C++. Moreover, define +// the _WIN64 symbol if you are running TetGen on Win64 systems. + +#ifdef _MSC_VER // Microsoft Visual C++ +# ifdef _WIN64 + typedef __int64 intptr_t; + typedef unsigned __int64 uintptr_t; +# else // not _WIN64 + typedef int intptr_t; + typedef unsigned int uintptr_t; +# endif +#else // not Visual C++ +# include +#endif + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetgenio // +// // +// A structure for transferring data into and out of TetGen's mesh structure,// +// 'tetgenmesh' (declared below). // +// // +// The input of TetGen is either a 3D point set, or a 3D piecewise linear // +// complex (PLC), or a tetrahedral mesh. Depending on the input object and // +// the specified options, the output of TetGen is either a Delaunay (or wei- // +// ghted Delaunay) tetrahedralization, or a constrained (Delaunay) tetrahed- // +// ralization, or a quality tetrahedral mesh. // +// // +// A piecewise linear complex (PLC) represents a 3D polyhedral domain with // +// possibly internal boundaries(subdomains). It is introduced in [Miller et // +// al, 1996]. Basically it is a set of "cells", i.e., vertices, edges, poly- // +// gons, and polyhedra, and the intersection of any two of its cells is the // +// union of other cells of it. // +// // +// TetGen uses a set of files to describe the inputs and outputs. Each file // +// is identified from its file extension (.node, .ele, .face, .edge, etc). // +// // +// The 'tetgenio' structure is a collection of arrays of data, i.e., points, // +// facets, tetrahedra, and so forth. It contains functions to read and write // +// (input and output) files of TetGen as well as other supported mesh files. // +// // +// Once an object of tetgenio is declared, no array is created. One has to // +// allocate enough memory for them. On deletion of this object, the memory // +// occupied by these arrays needs to be freed. The routine deinitialize() // +// will be automatically called. It frees the memory for an array if it is // +// not a NULL. Note that it assumes that the memory is allocated by the C++ // +// "new" operator. Otherwise, the user is responsible to free them and all // +// pointers must be NULL before the call of the destructor. // +// // +/////////////////////////////////////////////////////////////////////////////// + +class tetgenio { + +public: + + // A "polygon" describes a simple polygon (no holes). It is not necessarily + // convex. Each polygon contains a number of corners (points) and the same + // number of sides (edges). The points of the polygon must be given in + // either counterclockwise or clockwise order and they form a ring, so + // every two consecutive points forms an edge of the polygon. + typedef struct { + int *vertexlist; + int numberofvertices; + } polygon; + + // A "facet" describes a polygonal region possibly with holes, edges, and + // points floating in it. Each facet consists of a list of polygons and + // a list of hole points (which lie strictly inside holes). + typedef struct { + polygon *polygonlist; + int numberofpolygons; + REAL *holelist; + int numberofholes; + } facet; + + // A "voroedge" is an edge of the Voronoi diagram. It corresponds to a + // Delaunay face. Each voroedge is either a line segment connecting + // two Voronoi vertices or a ray starting from a Voronoi vertex to an + // "infinite vertex". 'v1' and 'v2' are two indices pointing to the + // list of Voronoi vertices. 'v1' must be non-negative, while 'v2' may + // be -1 if it is a ray, in this case, the unit normal of this ray is + // given in 'vnormal'. + typedef struct { + int v1, v2; + REAL vnormal[3]; + } voroedge; + + // A "vorofacet" is an facet of the Voronoi diagram. It corresponds to a + // Delaunay edge. Each Voronoi facet is a convex polygon formed by a + // list of Voronoi edges, it may not be closed. 'c1' and 'c2' are two + // indices pointing into the list of Voronoi cells, i.e., the two cells + // share this facet. 'elist' is an array of indices pointing into the + // list of Voronoi edges, 'elist[0]' saves the number of Voronoi edges + // (including rays) of this facet. + typedef struct { + int c1, c2; + int *elist; + } vorofacet; + + + // Additional parameters associated with an input (or mesh) vertex. + // These informations are provided by CAD libraries. + typedef struct { + REAL uv[2]; + int tag; + int type; // 0, 1, or 2. + } pointparam; + + // Callback functions for meshing PSCs. + typedef REAL (* GetVertexParamOnEdge)(void*, int, int); + typedef void (* GetSteinerOnEdge)(void*, int, REAL, REAL*); + typedef void (* GetVertexParamOnFace)(void*, int, int, REAL*); + typedef void (* GetEdgeSteinerParamOnFace)(void*, int, REAL, int, REAL*); + typedef void (* GetSteinerOnFace)(void*, int, REAL*, REAL*); + + // A callback function for mesh refinement. + typedef bool (* TetSizeFunc)(REAL*, REAL*, REAL*, REAL*, REAL*, REAL); + + // Items are numbered starting from 'firstnumber' (0 or 1), default is 0. + int firstnumber; + + // Dimension of the mesh (2 or 3), default is 3. + int mesh_dim; + + // Does the lines in .node file contain index or not, default is 1. + int useindex; + + // 'pointlist': An array of point coordinates. The first point's x + // coordinate is at index [0] and its y coordinate at index [1], its + // z coordinate is at index [2], followed by the coordinates of the + // remaining points. Each point occupies three REALs. + // 'pointattributelist': An array of point attributes. Each point's + // attributes occupy 'numberofpointattributes' REALs. + // 'pointmtrlist': An array of metric tensors at points. Each point's + // tensor occupies 'numberofpointmtr' REALs. + // 'pointmarkerlist': An array of point markers; one integer per point. + // 'point2tetlist': An array of tetrahedra indices; one integer per point. + REAL *pointlist; + REAL *pointattributelist; + REAL *pointmtrlist; + int *pointmarkerlist; + int *point2tetlist; + pointparam *pointparamlist; + int numberofpoints; + int numberofpointattributes; + int numberofpointmtrs; + + // 'tetrahedronlist': An array of tetrahedron corners. The first + // tetrahedron's first corner is at index [0], followed by its other + // corners, followed by six nodes on the edges of the tetrahedron if the + // second order option (-o2) is applied. Each tetrahedron occupies + // 'numberofcorners' ints. The second order nodes are ouput only. + // 'tetrahedronattributelist': An array of tetrahedron attributes. Each + // tetrahedron's attributes occupy 'numberoftetrahedronattributes' REALs. + // 'tetrahedronvolumelist': An array of constraints, i.e. tetrahedron's + // volume; one REAL per element. Input only. + // 'neighborlist': An array of tetrahedron neighbors; 4 ints per element. + // 'tet2facelist': An array of tetrahedron face indices; 4 ints per element. + // 'tet2edgelist': An array of tetrahedron edge indices; 6 ints per element. + int *tetrahedronlist; + REAL *tetrahedronattributelist; + REAL *tetrahedronvolumelist; + int *neighborlist; + int *tet2facelist; + int *tet2edgelist; + int numberoftetrahedra; + int numberofcorners; + int numberoftetrahedronattributes; + + // 'facetlist': An array of facets. Each entry is a structure of facet. + // 'facetmarkerlist': An array of facet markers; one int per facet. + facet *facetlist; + int *facetmarkerlist; + int numberoffacets; + + // 'holelist': An array of holes (in volume). Each hole is given by a + // seed (point) which lies strictly inside it. The first seed's x, y and z + // coordinates are at indices [0], [1] and [2], followed by the + // remaining seeds. Three REALs per hole. + REAL *holelist; + int numberofholes; + + // 'regionlist': An array of regions (subdomains). Each region is given by + // a seed (point) which lies strictly inside it. The first seed's x, y and + // z coordinates are at indices [0], [1] and [2], followed by the regional + // attribute at index [3], followed by the maximum volume at index [4]. + // Five REALs per region. + // Note that each regional attribute is used only if you select the 'A' + // switch, and each volume constraint is used only if you select the + // 'a' switch (with no number following). + REAL *regionlist; + int numberofregions; + + // 'facetconstraintlist': An array of facet constraints. Each constraint + // specifies a maximum area bound on the subfaces of that facet. The + // first facet constraint is given by a facet marker at index [0] and its + // maximum area bound at index [1], followed by the remaining facet con- + // straints. Two REALs per facet constraint. Note: the facet marker is + // actually an integer. + REAL *facetconstraintlist; + int numberoffacetconstraints; + + // 'segmentconstraintlist': An array of segment constraints. Each constraint + // specifies a maximum length bound on the subsegments of that segment. + // The first constraint is given by the two endpoints of the segment at + // index [0] and [1], and the maximum length bound at index [2], followed + // by the remaining segment constraints. Three REALs per constraint. + // Note the segment endpoints are actually integers. + REAL *segmentconstraintlist; + int numberofsegmentconstraints; + + + // 'trifacelist': An array of face (triangle) corners. The first face's + // three corners are at indices [0], [1] and [2], followed by the remaining + // faces. Three ints per face. + // 'trifacemarkerlist': An array of face markers; one int per face. + // 'o2facelist': An array of second order nodes (on the edges) of the face. + // It is output only if the second order option (-o2) is applied. The + // first face's three second order nodes are at [0], [1], and [2], + // followed by the remaining faces. Three ints per face. + // 'face2tetlist': An array of tetrahedra indices; 2 ints per face. + // 'face2edgelist': An array of edge indices; 3 ints per face. + int *trifacelist; + int *trifacemarkerlist; + int *o2facelist; + int *face2tetlist; + int *face2edgelist; + int numberoftrifaces; + + // 'edgelist': An array of edge endpoints. The first edge's endpoints + // are at indices [0] and [1], followed by the remaining edges. + // Two ints per edge. + // 'edgemarkerlist': An array of edge markers; one int per edge. + // 'o2edgelist': An array of midpoints of edges. It is output only if the + // second order option (-o2) is applied. One int per edge. + // 'edge2tetlist': An array of tetrahedra indices. One int per edge. + int *edgelist; + int *edgemarkerlist; + int *o2edgelist; + int *edge2tetlist; + int numberofedges; + + // 'vpointlist': An array of Voronoi vertex coordinates (like pointlist). + // 'vedgelist': An array of Voronoi edges. Each entry is a 'voroedge'. + // 'vfacetlist': An array of Voronoi facets. Each entry is a 'vorofacet'. + // 'vcelllist': An array of Voronoi cells. Each entry is an array of + // indices pointing into 'vfacetlist'. The 0th entry is used to store + // the length of this array. + REAL *vpointlist; + voroedge *vedgelist; + vorofacet *vfacetlist; + int **vcelllist; + int numberofvpoints; + int numberofvedges; + int numberofvfacets; + int numberofvcells; + + + // Variable (and callback functions) for meshing PSCs. + void *geomhandle; + GetVertexParamOnEdge getvertexparamonedge; + GetSteinerOnEdge getsteineronedge; + GetVertexParamOnFace getvertexparamonface; + GetEdgeSteinerParamOnFace getedgesteinerparamonface; + GetSteinerOnFace getsteineronface; + + // A callback function. + TetSizeFunc tetunsuitable; + + // Input & output routines. + bool load_node_call(FILE* infile, int markers, int uvflag, char*); + bool load_node(char*); + bool load_edge(char*); + bool load_face(char*); + bool load_tet(char*); + bool load_vol(char*); + bool load_var(char*); + bool load_mtr(char*); + bool load_pbc(char*); + bool load_poly(char*); + bool load_off(char*); + bool load_ply(char*); + bool load_stl(char*); + bool load_vtk(char*); + bool load_medit(char*, int); + bool load_neumesh(char*, int); + bool load_plc(char*, int); + bool load_tetmesh(char*, int); + void save_nodes(char*); + void save_elements(char*); + void save_faces(char*); + void save_edges(char*); + void save_neighbors(char*); + void save_poly(char*); + void save_faces2smesh(char*); + + // Read line and parse string functions. + char *readline(char* string, FILE* infile, int *linenumber); + char *findnextfield(char* string); + char *readnumberline(char* string, FILE* infile, char* infilename); + char *findnextnumber(char* string); + + static void init(polygon* p) { + p->vertexlist = (int *) NULL; + p->numberofvertices = 0; + } + + static void init(facet* f) { + f->polygonlist = (polygon *) NULL; + f->numberofpolygons = 0; + f->holelist = (REAL *) NULL; + f->numberofholes = 0; + } + + // Initialize routine. + void initialize() + { + firstnumber = 0; + mesh_dim = 3; + useindex = 1; + + pointlist = (REAL *) NULL; + pointattributelist = (REAL *) NULL; + pointmtrlist = (REAL *) NULL; + pointmarkerlist = (int *) NULL; + point2tetlist = (int *) NULL; + pointparamlist = (pointparam *) NULL; + numberofpoints = 0; + numberofpointattributes = 0; + numberofpointmtrs = 0; + + tetrahedronlist = (int *) NULL; + tetrahedronattributelist = (REAL *) NULL; + tetrahedronvolumelist = (REAL *) NULL; + neighborlist = (int *) NULL; + tet2facelist = (int *) NULL; + tet2edgelist = (int *) NULL; + numberoftetrahedra = 0; + numberofcorners = 4; + numberoftetrahedronattributes = 0; + + trifacelist = (int *) NULL; + trifacemarkerlist = (int *) NULL; + o2facelist = (int *) NULL; + face2tetlist = (int *) NULL; + face2edgelist = (int *) NULL; + numberoftrifaces = 0; + + edgelist = (int *) NULL; + edgemarkerlist = (int *) NULL; + o2edgelist = (int *) NULL; + edge2tetlist = (int *) NULL; + numberofedges = 0; + + facetlist = (facet *) NULL; + facetmarkerlist = (int *) NULL; + numberoffacets = 0; + + holelist = (REAL *) NULL; + numberofholes = 0; + + regionlist = (REAL *) NULL; + numberofregions = 0; + + facetconstraintlist = (REAL *) NULL; + numberoffacetconstraints = 0; + segmentconstraintlist = (REAL *) NULL; + numberofsegmentconstraints = 0; + + + vpointlist = (REAL *) NULL; + vedgelist = (voroedge *) NULL; + vfacetlist = (vorofacet *) NULL; + vcelllist = (int **) NULL; + numberofvpoints = 0; + numberofvedges = 0; + numberofvfacets = 0; + numberofvcells = 0; + + + tetunsuitable = NULL; + + geomhandle = NULL; + getvertexparamonedge = NULL; + getsteineronedge = NULL; + getvertexparamonface = NULL; + getedgesteinerparamonface = NULL; + getsteineronface = NULL; + } + + // Free the memory allocated in 'tetgenio'. Note that it assumes that the + // memory was allocated by the "new" operator (C++). + void deinitialize() + { + int i, j; + + if (pointlist != (REAL *) NULL) { + delete [] pointlist; + } + if (pointattributelist != (REAL *) NULL) { + delete [] pointattributelist; + } + if (pointmtrlist != (REAL *) NULL) { + delete [] pointmtrlist; + } + if (pointmarkerlist != (int *) NULL) { + delete [] pointmarkerlist; + } + if (point2tetlist != (int *) NULL) { + delete [] point2tetlist; + } + if (pointparamlist != (pointparam *) NULL) { + delete [] pointparamlist; + } + + if (tetrahedronlist != (int *) NULL) { + delete [] tetrahedronlist; + } + if (tetrahedronattributelist != (REAL *) NULL) { + delete [] tetrahedronattributelist; + } + if (tetrahedronvolumelist != (REAL *) NULL) { + delete [] tetrahedronvolumelist; + } + if (neighborlist != (int *) NULL) { + delete [] neighborlist; + } + if (tet2facelist != (int *) NULL) { + delete [] tet2facelist; + } + if (tet2edgelist != (int *) NULL) { + delete [] tet2edgelist; + } + + if (trifacelist != (int *) NULL) { + delete [] trifacelist; + } + if (trifacemarkerlist != (int *) NULL) { + delete [] trifacemarkerlist; + } + if (o2facelist != (int *) NULL) { + delete [] o2facelist; + } + if (face2tetlist != (int *) NULL) { + delete [] face2tetlist; + } + if (face2edgelist != (int *) NULL) { + delete [] face2edgelist; + } + + if (edgelist != (int *) NULL) { + delete [] edgelist; + } + if (edgemarkerlist != (int *) NULL) { + delete [] edgemarkerlist; + } + if (o2edgelist != (int *) NULL) { + delete [] o2edgelist; + } + if (edge2tetlist != (int *) NULL) { + delete [] edge2tetlist; + } + + if (facetlist != (facet *) NULL) { + facet *f; + polygon *p; + for (i = 0; i < numberoffacets; i++) { + f = &facetlist[i]; + for (j = 0; j < f->numberofpolygons; j++) { + p = &f->polygonlist[j]; + delete [] p->vertexlist; + } + delete [] f->polygonlist; + if (f->holelist != (REAL *) NULL) { + delete [] f->holelist; + } + } + delete [] facetlist; + } + if (facetmarkerlist != (int *) NULL) { + delete [] facetmarkerlist; + } + + if (holelist != (REAL *) NULL) { + delete [] holelist; + } + if (regionlist != (REAL *) NULL) { + delete [] regionlist; + } + if (facetconstraintlist != (REAL *) NULL) { + delete [] facetconstraintlist; + } + if (segmentconstraintlist != (REAL *) NULL) { + delete [] segmentconstraintlist; + } + if (vpointlist != (REAL *) NULL) { + delete [] vpointlist; + } + if (vedgelist != (voroedge *) NULL) { + delete [] vedgelist; + } + if (vfacetlist != (vorofacet *) NULL) { + for (i = 0; i < numberofvfacets; i++) { + delete [] vfacetlist[i].elist; + } + delete [] vfacetlist; + } + if (vcelllist != (int **) NULL) { + for (i = 0; i < numberofvcells; i++) { + delete [] vcelllist[i]; + } + delete [] vcelllist; + } + } + + // Constructor & destructor. + tetgenio() {initialize();} + ~tetgenio() {deinitialize();} + +}; // class tetgenio + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetgenbehavior // +// // +// A structure for maintaining the switches and parameters used by TetGen's // +// mesh data structure and algorithms. // +// // +// All switches and parameters are initialized with default values. They can // +// be set by the command line arguments (a list of strings) of TetGen. // +// // +// NOTE: Some of the switches are incompatible. While some may depend on // +// other switches. The routine parse_commandline() sets the switches from // +// the command line (a list of strings) and checks the consistency of the // +// applied switches. // +// // +/////////////////////////////////////////////////////////////////////////////// + +class tetgenbehavior { + +public: + + // Switches of TetGen. + int plc; // '-p', 0. + int psc; // '-s', 0. + int refine; // '-r', 0. + int quality; // '-q', 0. + int nobisect; // '-Y', 0. + int coarsen; // '-R', 0. + int weighted; // '-w', 0. + int brio_hilbert; // '-b', 1. + int incrflip; // '-l', 0. + int flipinsert; // '-L', 0. + int metric; // '-m', 0. + int varvolume; // '-a', 0. + int fixedvolume; // '-a', 0. + int regionattrib; // '-A', 0. + int cdtrefine; // '-D', 0. + int use_equatorial_lens; // '-Dl', 0. + int insertaddpoints; // '-i', 0. + int diagnose; // '-d', 0. + int convex; // '-c', 0. + int nomergefacet; // '-M', 0. + int nomergevertex; // '-M', 0. + int noexact; // '-X', 0. + int nostaticfilter; // '-X', 0. + int zeroindex; // '-z', 0. + int facesout; // '-f', 0. + int edgesout; // '-e', 0. + int neighout; // '-n', 0. + int voroout; // '-v', 0. + int meditview; // '-g', 0. + int vtkview; // '-k', 0. + int nobound; // '-B', 0. + int nonodewritten; // '-N', 0. + int noelewritten; // '-E', 0. + int nofacewritten; // '-F', 0. + int noiterationnum; // '-I', 0. + int nojettison; // '-J', 0. + int docheck; // '-C', 0. + int quiet; // '-Q', 0. + int verbose; // '-V', 0. + + // Parameters of TetGen. + int vertexperblock; // '-x', 4092. + int tetrahedraperblock; // '-x', 8188. + int shellfaceperblock; // '-x', 2044. + int nobisect_nomerge; // '-Y', 1. + int supsteiner_level; // '-Y/', 2. + int addsteiner_algo; // '-Y//', 1. + int coarsen_param; // '-R', 0. + int weighted_param; // '-w', 0. + int fliplinklevel; // -1. + int flipstarsize; // -1. + int fliplinklevelinc; // 1. + int reflevel; // '-D', 3. + int optlevel; // '-O', 2. + int optscheme; // '-O', 7. + int delmaxfliplevel; // 1. + int order; // '-o', 1. + int reversetetori; // '-o/', 0. + int steinerleft; // '-S', 0. + int no_sort; // 0. + int hilbert_order; // '-b///', 52. + int hilbert_limit; // '-b//' 8. + int brio_threshold; // '-b' 64. + REAL brio_ratio; // '-b/' 0.125. + REAL facet_separate_ang_tol; // '-p', 179.9. + REAL facet_overlap_ang_tol; // '-p/', 0.1. + REAL facet_small_ang_tol; // '-p//', 15.0. + REAL maxvolume; // '-a', -1.0. + REAL minratio; // '-q', 0.0. + REAL mindihedral; // '-q', 5.0. + REAL optmaxdihedral; // 165.0. + REAL optminsmtdihed; // 179.0. + REAL optminslidihed; // 179.0. + REAL epsilon; // '-T', 1.0e-8. + REAL coarsen_percent; // -R1/#, 1.0. + + // Strings of command line arguments and input/output file names. + char commandline[1024]; + char infilename[1024]; + char outfilename[1024]; + char addinfilename[1024]; + char bgmeshfilename[1024]; + + // Read an additional tetrahedral mesh and treat it as holes [2018-07-30]. + int hole_mesh; // '-H', 0. + char hole_mesh_filename[1024]; + int apply_flow_bc; // '-K', 0. + + // The input object of TetGen. They are recognized by either the input + // file extensions or by the specified options. + // Currently the following objects are supported: + // - NODES, a list of nodes (.node); + // - POLY, a piecewise linear complex (.poly or .smesh); + // - OFF, a polyhedron (.off, Geomview's file format); + // - PLY, a polyhedron (.ply, file format from gatech, only ASCII); + // - STL, a surface mesh (.stl, stereolithography format); + // - MEDIT, a surface mesh (.mesh, Medit's file format); + // - MESH, a tetrahedral mesh (.ele). + // If no extension is available, the imposed command line switch + // (-p or -r) implies the object. + enum objecttype {NODES, POLY, OFF, PLY, STL, MEDIT, VTK, MESH, NEU_MESH} object; + + + void syntax(); + void usage(); + + // Command line parse routine. + bool parse_commandline(int argc, char **argv); + bool parse_commandline(char *switches) { + return parse_commandline(0, &switches); + } + + // Initialize all variables. + tetgenbehavior() + { + plc = 0; + psc = 0; + refine = 0; + quality = 0; + nobisect = 0; + coarsen = 0; + metric = 0; + weighted = 0; + brio_hilbert = 1; + incrflip = 0; + flipinsert = 0; + varvolume = 0; + fixedvolume = 0; + noexact = 0; + nostaticfilter = 0; + insertaddpoints = 0; + regionattrib = 0; + cdtrefine = 0; + use_equatorial_lens = 0; // -Dl + diagnose = 0; + convex = 0; + zeroindex = 0; + facesout = 0; + edgesout = 0; + neighout = 0; + voroout = 0; + meditview = 0; + vtkview = 0; + nobound = 0; + nonodewritten = 0; + noelewritten = 0; + nofacewritten = 0; + noiterationnum = 0; + nomergefacet = 0; + nomergevertex = 0; + nojettison = 0; + docheck = 0; + quiet = 0; + verbose = 0; + + vertexperblock = 4092; + tetrahedraperblock = 8188; + shellfaceperblock = 4092; + nobisect_nomerge = 1; + supsteiner_level = 2; + addsteiner_algo = 1; + coarsen_param = 0; + weighted_param = 0; + fliplinklevel = -1; + flipstarsize = -1; + fliplinklevelinc = 1; + reflevel = 3; + optscheme = 7; + optlevel = 2; + delmaxfliplevel = 1; + order = 1; + reversetetori = 0; + steinerleft = -1; + no_sort = 0; + hilbert_order = 52; //-1; + hilbert_limit = 8; + brio_threshold = 64; + brio_ratio = 0.125; + facet_separate_ang_tol = 179.9; + facet_overlap_ang_tol = 0.1; + facet_small_ang_tol = 15.0; + maxvolume = -1.0; + minratio = 2.0; + mindihedral = 0.0; + optmaxdihedral = 165.00; + optminsmtdihed = 179.00; + optminslidihed = 179.00; + epsilon = 1.0e-8; + coarsen_percent = 1.0; + object = NODES; + + commandline[0] = '\0'; + infilename[0] = '\0'; + outfilename[0] = '\0'; + addinfilename[0] = '\0'; + bgmeshfilename[0] = '\0'; + + hole_mesh = 0; + hole_mesh_filename[0] = '\0'; + apply_flow_bc = 0; + + } + +}; // class tetgenbehavior + +/////////////////////////////////////////////////////////////////////////////// +// // +// Robust Geometric predicates // +// // +// Geometric predicates are simple tests of spatial relations of a set of d- // +// dimensional points, such as the orientation test and the point-in-sphere // +// test. Each of these tests is performed by evaluating the sign of a deter- // +// minant of a matrix whose entries are the coordinates of these points. If // +// the computation is performed by using the floating-point numbers, e.g., // +// the single or double precision numbers in C/C++, roundoff error may cause // +// an incorrect result. This may either lead to a wrong result or eventually // +// lead to a failure of the program. Computing the predicates exactly will // +// avoid the error and make the program robust. // +// // +// The following routines are the robust geometric predicates for 3D orient- // +// ation test and point-in-sphere test. They were implemented by Shewchuk. // +// The source code are generously provided by him in the public domain, // +// http://www.cs.cmu.edu/~quake/robust.html. predicates.cxx is a C++ version // +// of the original C code. // +// // +// The original predicates of Shewchuk only use "dynamic filters", i.e., it // +// computes the error at run time step by step. TetGen first adds a "static // +// filter" in each predicate. It estimates the maximal possible error in all // +// cases. So it can safely and quickly answer many easy cases. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void exactinit(int, int, int, REAL, REAL, REAL); +REAL orient3d(REAL *pa, REAL *pb, REAL *pc, REAL *pd); +REAL insphere(REAL *pa, REAL *pb, REAL *pc, REAL *pd, REAL *pe); +REAL orient4d(REAL *pa, REAL *pb, REAL *pc, REAL *pd, REAL *pe, + REAL ah, REAL bh, REAL ch, REAL dh, REAL eh); + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetgenmesh // +// // +// A structure for creating and updating tetrahedral meshes. // +// // +/////////////////////////////////////////////////////////////////////////////// + +class tetgenmesh { + +public: + +/////////////////////////////////////////////////////////////////////////////// +// // +// Mesh data structure // +// // +// A tetrahedral mesh T of a 3D piecewise linear complex (PLC) X is a 3D // +// simplicial complex whose underlying space is equal to the space of X. T // +// contains a 2D subcomplex S which is a triangular mesh of the boundary of // +// X. S contains a 1D subcomplex L which is a linear mesh of the boundary of // +// S. Faces and edges in S and L are respectively called subfaces and segme- // +// nts to distinguish them from others in T. // +// // +// TetGen stores the tetrahedra and vertices of T. The basic structure of a // +// tetrahedron contains pointers to its vertices and adjacent tetrahedra. A // +// vertex stores its x-, y-, and z-coordinates, and a pointer to a tetrahed- // +// ron containing it. Both tetrahedra and vertices may contain user data. // +// // +// Each face of T belongs to either two tetrahedra or one tetrahedron. In // +// the latter case, the face is an exterior boundary face of T. TetGen adds // +// fictitious tetrahedra (one-to-one) at such faces, and connects them to an // +// "infinite vertex" (which has no geometric coordinates). One can imagine // +// such a vertex lies in 4D space and is visible by all exterior boundary // +// faces. The extended set of tetrahedra (including the infinite vertex) is // +// a tetrahedralization of a 3-pseudomanifold without boundary. It has the // +// property that every face is shared by exactly two tetrahedra. // +// // +// The current version of TetGen stores explicitly the subfaces and segments // +// (which are in surface mesh S and the linear mesh L), respectively. Extra // +// pointers are allocated in tetrahedra and subfaces to point each others. // +// // +/////////////////////////////////////////////////////////////////////////////// + + // The tetrahedron data structure. It includes the following fields: + // - a list of four adjoining tetrahedra; + // - a list of four vertices; + // - a pointer to a list of four subfaces (optional, for -p switch); + // - a pointer to a list of six segments (optional, for -p switch); + // - a list of user-defined floating-point attributes (optional); + // - a volume constraint (optional, for -a switch); + // - an integer of element marker (and flags); + // The structure of a tetrahedron is an array of pointers. Its actual size + // (the length of the array) is determined at runtime. + + typedef REAL **tetrahedron; + + // The subface data structure. It includes the following fields: + // - a list of three adjoining subfaces; + // - a list of three vertices; + // - a list of three adjoining segments; + // - two adjoining tetrahedra; + // - an area constraint (optional, for -q switch); + // - an integer for boundary marker; + // - an integer for type, flags, etc. + + typedef REAL **shellface; + + // The point data structure. It includes the following fields: + // - x, y and z coordinates; + // - a list of user-defined point attributes (optional); + // - u, v coordinates (optional, for -s switch); + // - a metric tensor (optional, for -q or -m switch); + // - a pointer to an adjacent tetrahedron; + // - a pointer to a parent (or a duplicate) point; + // - a pointer to an adjacent subface or segment (optional, -p switch); + // - a pointer to a tet in background mesh (optional, for -m switch); + // - an integer for boundary marker (point index); + // - an integer for point type (and flags). + // - an integer for geometry tag (optional, for -s switch). + // The structure of a point is an array of REALs. Its acutal size is + // determined at the runtime. + + typedef REAL *point; + +/////////////////////////////////////////////////////////////////////////////// +// // +// Handles // +// // +// Navigation and manipulation in a tetrahedralization are accomplished by // +// operating on structures referred as ``handles". A handle is a pair (t,v), // +// where t is a pointer to a tetrahedron, and v is a 4-bit integer, in the // +// range from 0 to 11. v is called the ``version'' of a tetrahedron, it rep- // +// resents a directed edge of a specific face of the tetrahedron. // +// // +// There are 12 even permutations of the four vertices, each of them corres- // +// ponds to a directed edge (a version) of the tetrahedron. The 12 versions // +// can be grouped into 4 distinct ``edge rings'' in 4 ``oriented faces'' of // +// this tetrahedron. One can encode each version (a directed edge) into a // +// 4-bit integer such that the two upper bits encode the index (from 0 to 2) // +// of this edge in the edge ring, and the two lower bits encode the index ( // +// from 0 to 3) of the oriented face which contains this edge. // +// // +// The four vertices of a tetrahedron are indexed from 0 to 3 (according to // +// their storage in the data structure). Give each face the same index as // +// the node opposite it in the tetrahedron. Denote the edge connecting face // +// i to face j as i/j. We number the twelve versions as follows: // +// // +// | edge 0 edge 1 edge 2 // +// --------|-------------------------------- // +// face 0 | 0 (0/1) 4 (0/3) 8 (0/2) // +// face 1 | 1 (1/2) 5 (1/3) 9 (1/0) // +// face 2 | 2 (2/3) 6 (2/1) 10 (2/0) // +// face 3 | 3 (3/0) 7 (3/1) 11 (3/2) // +// // +// Similarly, navigation and manipulation in a (boundary) triangulation are // +// done by using handles of triangles. Each handle is a pair (s, v), where s // +// is a pointer to a triangle, and v is a version in the range from 0 to 5. // +// Each version corresponds to a directed edge of this triangle. // +// // +// Number the three vertices of a triangle from 0 to 2 (according to their // +// storage in the data structure). Give each edge the same index as the node // +// opposite it in the triangle. The six versions of a triangle are: // +// // +// | edge 0 edge 1 edge 2 // +// ---------------|-------------------------- // +// ccw orieation | 0 2 4 // +// cw orieation | 1 3 5 // +// // +// In the following, a 'triface' is a handle of tetrahedron, and a 'face' is // +// a handle of a triangle. // +// // +/////////////////////////////////////////////////////////////////////////////// + + class triface { + public: + tetrahedron *tet; + int ver; // Range from 0 to 11. + triface() : tet(0), ver(0) {} + triface& operator=(const triface& t) { + tet = t.tet; ver = t.ver; + return *this; + } + }; + + class face { + public: + shellface *sh; + int shver; // Range from 0 to 5. + face() : sh(0), shver(0) {} + face& operator=(const face& s) { + sh = s.sh; shver = s.shver; + return *this; + } + }; + +/////////////////////////////////////////////////////////////////////////////// +// // +// Arraypool // +// // +// A dynamic linear array. (It is written by J. Shewchuk) // +// // +// Each arraypool contains an array of pointers to a number of blocks. Each // +// block contains the same fixed number of objects. Each index of the array // +// addresses a particular object in the pool. The most significant bits add- // +// ress the index of the block containing the object. The less significant // +// bits address this object within the block. // +// // +// 'objectbytes' is the size of one object in blocks; 'log2objectsperblock' // +// is the base-2 logarithm of 'objectsperblock'; 'objects' counts the number // +// of allocated objects; 'totalmemory' is the total memory in bytes. // +// // +/////////////////////////////////////////////////////////////////////////////// + + class arraypool { + + public: + + int objectbytes; + int objectsperblock; + int log2objectsperblock; + int objectsperblockmark; + int toparraylen; + char **toparray; + long objects; + unsigned long totalmemory; + + void restart(); + void poolinit(int sizeofobject, int log2objperblk); + char* getblock(int objectindex); + void* lookup(int objectindex); + int newindex(void **newptr); + + arraypool(int sizeofobject, int log2objperblk); + ~arraypool(); + }; + +// fastlookup() -- A fast, unsafe operation. Return the pointer to the object +// with a given index. Note: The object's block must have been allocated, +// i.e., by the function newindex(). + +#define fastlookup(pool, index) \ + (void *) ((pool)->toparray[(index) >> (pool)->log2objectsperblock] + \ + ((index) & (pool)->objectsperblockmark) * (pool)->objectbytes) + +/////////////////////////////////////////////////////////////////////////////// +// // +// Memorypool // +// // +// A structure for memory allocation. (It is written by J. Shewchuk) // +// // +// 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. // +// // +/////////////////////////////////////////////////////////////////////////////// + + class memorypool { + + public: + + void **firstblock, **nowblock; + void *nextitem; + void *deaditemstack; + void **pathblock; + void *pathitem; + int alignbytes; + int itembytes, itemwords; + int itemsperblock; + long items, maxitems; + int unallocateditems; + int pathitemsleft; + + memorypool(); + memorypool(int, int, int, int); + ~memorypool(); + + void poolinit(int, int, int, int); + void restart(); + void *alloc(); + void dealloc(void*); + void traversalinit(); + void *traverse(); + }; + +/////////////////////////////////////////////////////////////////////////////// +// // +// badface // +// // +// Despite of its name, a 'badface' can be used to represent one of the // +// following objects: // +// - a face of a tetrahedron which is (possibly) non-Delaunay; // +// - an encroached subsegment or subface; // +// - a bad-quality tetrahedron, i.e, has too large radius-edge ratio; // +// - a sliver, i.e., has good radius-edge ratio but nearly zero volume; // +// - a recently flipped face (saved for undoing the flip later). // +// // +/////////////////////////////////////////////////////////////////////////////// + + class badface { + public: + triface tt; + face ss; + REAL key, cent[6]; // circumcenter or cos(dihedral angles) at 6 edges. + point forg, fdest, fapex, foppo, noppo; + badface *nextitem; + badface() : key(0), forg(0), fdest(0), fapex(0), foppo(0), noppo(0), + nextitem(0) {} + }; + +/////////////////////////////////////////////////////////////////////////////// +// // +// insertvertexflags // +// // +// A collection of flags that pass to the routine insertvertex(). // +// // +/////////////////////////////////////////////////////////////////////////////// + + class insertvertexflags { + + public: + + int iloc; // input/output. + int bowywat, lawson; + int splitbdflag, validflag, respectbdflag; + int rejflag, chkencflag, cdtflag; + int assignmeshsize; + int sloc, sbowywat; + + // Used by Delaunay refinement. + int refineflag; // 0, 1, 2, 3 + triface refinetet; + face refinesh; + int smlenflag; // for useinsertradius. + REAL smlen; // for useinsertradius. + point parentpt; + + insertvertexflags() { + iloc = bowywat = lawson = 0; + splitbdflag = validflag = respectbdflag = 0; + rejflag = chkencflag = cdtflag = 0; + assignmeshsize = 0; + sloc = sbowywat = 0; + + refineflag = 0; + refinetet.tet = NULL; + refinesh.sh = NULL; + smlenflag = 0; + smlen = 0.0; + } + }; + +/////////////////////////////////////////////////////////////////////////////// +// // +// flipconstraints // +// // +// A structure of a collection of data (options and parameters) which pass // +// to the edge flip function flipnm(). // +// // +/////////////////////////////////////////////////////////////////////////////// + + class flipconstraints { + + public: + + // Elementary flip flags. + int enqflag; // (= flipflag) + int chkencflag; + + // Control flags + int unflip; // Undo the performed flips. + int collectnewtets; // Collect the new tets created by flips. + int collectencsegflag; + + // Optimization flags. + int remove_ndelaunay_edge; // Remove a non-Delaunay edge. + REAL bak_tetprism_vol; // The value to be minimized. + REAL tetprism_vol_sum; + int remove_large_angle; // Remove a large dihedral angle at edge. + REAL cosdihed_in; // The input cosine of the dihedral angle (> 0). + REAL cosdihed_out; // The improved cosine of the dihedral angle. + + // Boundary recovery flags. + int checkflipeligibility; + point seg[2]; // A constraining edge to be recovered. + point fac[3]; // A constraining face to be recovered. + point remvert; // A vertex to be removed. + + + flipconstraints() { + enqflag = 0; + chkencflag = 0; + + unflip = 0; + collectnewtets = 0; + collectencsegflag = 0; + + remove_ndelaunay_edge = 0; + bak_tetprism_vol = 0.0; + tetprism_vol_sum = 0.0; + remove_large_angle = 0; + cosdihed_in = 0.0; + cosdihed_out = 0.0; + + checkflipeligibility = 0; + seg[0] = NULL; + fac[0] = NULL; + remvert = NULL; + } + }; + +/////////////////////////////////////////////////////////////////////////////// +// // +// optparameters // +// // +// Optimization options and parameters. // +// // +/////////////////////////////////////////////////////////////////////////////// + + class optparameters { + + public: + + // The one of goals of optimization. + int max_min_volume; // Maximize the minimum volume. + int min_max_aspectratio; // Minimize the maximum aspect ratio. + int min_max_dihedangle; // Minimize the maximum dihedral angle. + + // The initial and improved value. + REAL initval, imprval; + + int numofsearchdirs; + REAL searchstep; + int maxiter; // Maximum smoothing iterations (disabled by -1). + int smthiter; // Performed iterations. + + + optparameters() { + max_min_volume = 0; + min_max_aspectratio = 0; + min_max_dihedangle = 0; + + initval = imprval = 0.0; + + numofsearchdirs = 10; + searchstep = 0.01; + maxiter = -1; // Unlimited smoothing iterations. + smthiter = 0; + + } + }; + + +/////////////////////////////////////////////////////////////////////////////// +// // +// Labels (enumeration declarations) used by TetGen. // +// // +/////////////////////////////////////////////////////////////////////////////// + + // Labels that signify the type of a vertex. + enum verttype {UNUSEDVERTEX, DUPLICATEDVERTEX, RIDGEVERTEX, ACUTEVERTEX, + FACETVERTEX, VOLVERTEX, FREESEGVERTEX, FREEFACETVERTEX, + FREEVOLVERTEX, NREGULARVERTEX, DEADVERTEX}; + + // Labels that signify the result of triangle-triangle intersection test. + enum interresult {DISJOINT, INTERSECT, SHAREVERT, SHAREEDGE, SHAREFACE, + TOUCHEDGE, TOUCHFACE, ACROSSVERT, ACROSSEDGE, ACROSSFACE}; + + // Labels that signify the result of point location. + enum locateresult {UNKNOWN, OUTSIDE, INTETRAHEDRON, ONFACE, ONEDGE, ONVERTEX, + ENCVERTEX, ENCSEGMENT, ENCSUBFACE, NEARVERTEX, NONREGULAR, + INSTAR, BADELEMENT}; + +/////////////////////////////////////////////////////////////////////////////// +// // +// Variables of TetGen // +// // +/////////////////////////////////////////////////////////////////////////////// + + // Pointer to the input data (a set of nodes, a PLC, or a mesh). + tetgenio *in, *addin; + + // Pointer to the switches and parameters. + tetgenbehavior *b; + + // Pointer to a background mesh (contains size specification map). + tetgenmesh *bgm; + + // Memorypools to store mesh elements (points, tetrahedra, subfaces, and + // segments) and extra pointers between tetrahedra, subfaces, and segments. + memorypool *tetrahedrons, *subfaces, *subsegs, *points; + memorypool *tet2subpool, *tet2segpool; + + // Memorypools to store bad-quality (or encroached) elements. + memorypool *badtetrahedrons, *badsubfacs, *badsubsegs; + + // A memorypool to store faces to be flipped. + memorypool *flippool; + arraypool *unflipqueue; + badface *flipstack; + + // Arrays used for point insertion (the Bowyer-Watson algorithm). + arraypool *cavetetlist, *cavebdrylist, *caveoldtetlist; + arraypool *cavetetshlist, *cavetetseglist, *cavetetvertlist; + arraypool *caveencshlist, *caveencseglist; + arraypool *caveshlist, *caveshbdlist, *cavesegshlist; + + // Stacks used for CDT construction and boundary recovery. + arraypool *subsegstack, *subfacstack, *subvertstack; + + // Arrays of encroached segments and subfaces (for mesh refinement). + arraypool *encseglist, *encshlist; + + // The map between facets to their vertices (for mesh refinement). + int *idx2facetlist; + point *facetverticeslist; + + // The map between segments to their endpoints (for mesh refinement). + point *segmentendpointslist; + + // The infinite vertex. + point dummypoint; + // The recently visited tetrahedron, subface. + triface recenttet; + face recentsh; + + // PI is the ratio of a circle's circumference to its diameter. + static REAL PI; + + // Array (size = numberoftetrahedra * 6) for storing high-order nodes of + // tetrahedra (only used when -o2 switch is selected). + point *highordertable; + + // Various variables. + int numpointattrib; // Number of point attributes. + int numelemattrib; // Number of tetrahedron attributes. + int sizeoftensor; // Number of REALs per metric tensor. + int pointmtrindex; // Index to find the metric tensor of a point. + int pointparamindex; // Index to find the u,v coordinates of a point. + int point2simindex; // Index to find a simplex adjacent to a point. + int pointmarkindex; // Index to find boundary marker of a point. + int pointinsradiusindex; // Index to find the insertion radius of a point. + int elemattribindex; // Index to find attributes of a tetrahedron. + int volumeboundindex; // Index to find volume bound of a tetrahedron. + int elemmarkerindex; // Index to find marker of a tetrahedron. + int shmarkindex; // Index to find boundary marker of a subface. + int areaboundindex; // Index to find area bound of a subface. + int checksubsegflag; // Are there segments in the tetrahedralization yet? + int checksubfaceflag; // Are there subfaces in the tetrahedralization yet? + int checkconstraints; // Are there variant (node, seg, facet) constraints? + int nonconvex; // Is current mesh non-convex? + int autofliplinklevel; // The increase of link levels, default is 1. + int useinsertradius; // Save the insertion radius for Steiner points. + long samples; // Number of random samples for point location. + unsigned long randomseed; // Current random number seed. + REAL cosmaxdihed, cosmindihed; // The cosine values of max/min dihedral. + REAL cossmtdihed; // The cosine value of a bad dihedral to be smoothed. + REAL cosslidihed; // The cosine value of the max dihedral of a sliver. + REAL minfaceang, minfacetdihed; // The minimum input (dihedral) angles. + REAL tetprism_vol_sum; // The total volume of tetrahedral-prisms (in 4D). + REAL longest; // The longest possible edge length. + REAL minedgelength; // = longest * b->epsion. + REAL xmax, xmin, ymax, ymin, zmax, zmin; // Bounding box of points. + + // Counters. + long insegments; // Number of input segments. + long hullsize; // Number of exterior boundary faces. + long meshedges; // Number of mesh edges. + long meshhulledges; // Number of boundary mesh edges. + long steinerleft; // Number of Steiner points not yet used. + long dupverts; // Are there duplicated vertices? + long unuverts; // Are there unused vertices? + long nonregularcount; // Are there non-regular vertices? + long st_segref_count, st_facref_count, st_volref_count; // Steiner points. + long fillregioncount, cavitycount, cavityexpcount; + long flip14count, flip26count, flipn2ncount; + long flip23count, flip32count, flip44count, flip41count; + long flip31count, flip22count; + unsigned long totalworkmemory; // Total memory used by working arrays. + + +/////////////////////////////////////////////////////////////////////////////// +// // +// Mesh manipulation primitives // +// // +/////////////////////////////////////////////////////////////////////////////// + + // Fast lookup tables for mesh manipulation primitives. + static int bondtbl[12][12], fsymtbl[12][12]; + static int esymtbl[12], enexttbl[12], eprevtbl[12]; + static int enextesymtbl[12], eprevesymtbl[12]; + static int eorgoppotbl[12], edestoppotbl[12]; + static int facepivot1[12], facepivot2[12][12]; + static int orgpivot[12], destpivot[12], apexpivot[12], oppopivot[12]; + static int tsbondtbl[12][6], stbondtbl[12][6]; + static int tspivottbl[12][6], stpivottbl[12][6]; + static int ver2edge[12], edge2ver[6], epivot[12]; + static int sorgpivot [6], sdestpivot[6], sapexpivot[6]; + static int snextpivot[6]; + + void inittables(); + + // Primitives for tetrahedra. + inline tetrahedron encode(triface& t); + inline tetrahedron encode2(tetrahedron* ptr, int ver); + inline void decode(tetrahedron ptr, triface& t); + inline void bond(triface& t1, triface& t2); + inline void dissolve(triface& t); + inline void esym(triface& t1, triface& t2); + inline void esymself(triface& t); + inline void enext(triface& t1, triface& t2); + inline void enextself(triface& t); + inline void eprev(triface& t1, triface& t2); + inline void eprevself(triface& t); + inline void enextesym(triface& t1, triface& t2); + inline void enextesymself(triface& t); + inline void eprevesym(triface& t1, triface& t2); + inline void eprevesymself(triface& t); + inline void eorgoppo(triface& t1, triface& t2); + inline void eorgoppoself(triface& t); + inline void edestoppo(triface& t1, triface& t2); + inline void edestoppoself(triface& t); + inline void fsym(triface& t1, triface& t2); + inline void fsymself(triface& t); + inline void fnext(triface& t1, triface& t2); + inline void fnextself(triface& t); + inline point org (triface& t); + inline point dest(triface& t); + inline point apex(triface& t); + inline point oppo(triface& t); + inline void setorg (triface& t, point p); + inline void setdest(triface& t, point p); + inline void setapex(triface& t, point p); + inline void setoppo(triface& t, point p); + inline REAL elemattribute(tetrahedron* ptr, int attnum); + inline void setelemattribute(tetrahedron* ptr, int attnum, REAL value); + inline REAL volumebound(tetrahedron* ptr); + inline void setvolumebound(tetrahedron* ptr, REAL value); + inline int elemindex(tetrahedron* ptr); + inline void setelemindex(tetrahedron* ptr, int value); + inline int elemmarker(tetrahedron* ptr); + inline void setelemmarker(tetrahedron* ptr, int value); + inline void infect(triface& t); + inline void uninfect(triface& t); + inline bool infected(triface& t); + inline void marktest(triface& t); + inline void unmarktest(triface& t); + inline bool marktested(triface& t); + inline void markface(triface& t); + inline void unmarkface(triface& t); + inline bool facemarked(triface& t); + inline void markedge(triface& t); + inline void unmarkedge(triface& t); + inline bool edgemarked(triface& t); + inline void marktest2(triface& t); + inline void unmarktest2(triface& t); + inline bool marktest2ed(triface& t); + inline int elemcounter(triface& t); + inline void setelemcounter(triface& t, int value); + inline void increaseelemcounter(triface& t); + inline void decreaseelemcounter(triface& t); + inline bool ishulltet(triface& t); + inline bool isdeadtet(triface& t); + + // Primitives for subfaces and subsegments. + inline void sdecode(shellface sptr, face& s); + inline shellface sencode(face& s); + inline shellface sencode2(shellface *sh, int shver); + inline void spivot(face& s1, face& s2); + inline void spivotself(face& s); + inline void sbond(face& s1, face& s2); + inline void sbond1(face& s1, face& s2); + inline void sdissolve(face& s); + inline point sorg(face& s); + inline point sdest(face& s); + inline point sapex(face& s); + inline void setsorg(face& s, point pointptr); + inline void setsdest(face& s, point pointptr); + inline void setsapex(face& s, point pointptr); + inline void sesym(face& s1, face& s2); + inline void sesymself(face& s); + inline void senext(face& s1, face& s2); + inline void senextself(face& s); + inline void senext2(face& s1, face& s2); + inline void senext2self(face& s); + inline REAL areabound(face& s); + inline void setareabound(face& s, REAL value); + inline int shellmark(face& s); + inline void setshellmark(face& s, int value); + inline void sinfect(face& s); + inline void suninfect(face& s); + inline bool sinfected(face& s); + inline void smarktest(face& s); + inline void sunmarktest(face& s); + inline bool smarktested(face& s); + inline void smarktest2(face& s); + inline void sunmarktest2(face& s); + inline bool smarktest2ed(face& s); + inline void smarktest3(face& s); + inline void sunmarktest3(face& s); + inline bool smarktest3ed(face& s); + inline void setfacetindex(face& f, int value); + inline int getfacetindex(face& f); + + // Primitives for interacting tetrahedra and subfaces. + inline void tsbond(triface& t, face& s); + inline void tsdissolve(triface& t); + inline void stdissolve(face& s); + inline void tspivot(triface& t, face& s); + inline void stpivot(face& s, triface& t); + + // Primitives for interacting tetrahedra and segments. + inline void tssbond1(triface& t, face& seg); + inline void sstbond1(face& s, triface& t); + inline void tssdissolve1(triface& t); + inline void sstdissolve1(face& s); + inline void tsspivot1(triface& t, face& s); + inline void sstpivot1(face& s, triface& t); + + // Primitives for interacting subfaces and segments. + inline void ssbond(face& s, face& edge); + inline void ssbond1(face& s, face& edge); + inline void ssdissolve(face& s); + inline void sspivot(face& s, face& edge); + + // Primitives for points. + inline int pointmark(point pt); + inline void setpointmark(point pt, int value); + inline enum verttype pointtype(point pt); + inline void setpointtype(point pt, enum verttype value); + inline int pointgeomtag(point pt); + inline void setpointgeomtag(point pt, int value); + inline REAL pointgeomuv(point pt, int i); + inline void setpointgeomuv(point pt, int i, REAL value); + inline void pinfect(point pt); + inline void puninfect(point pt); + inline bool pinfected(point pt); + inline void pmarktest(point pt); + inline void punmarktest(point pt); + inline bool pmarktested(point pt); + inline void pmarktest2(point pt); + inline void punmarktest2(point pt); + inline bool pmarktest2ed(point pt); + inline void pmarktest3(point pt); + inline void punmarktest3(point pt); + inline bool pmarktest3ed(point pt); + inline tetrahedron point2tet(point pt); + inline void setpoint2tet(point pt, tetrahedron value); + inline shellface point2sh(point pt); + inline void setpoint2sh(point pt, shellface value); + inline point point2ppt(point pt); + inline void setpoint2ppt(point pt, point value); + inline tetrahedron point2bgmtet(point pt); + inline void setpoint2bgmtet(point pt, tetrahedron value); + inline void setpointinsradius(point pt, REAL value); + inline REAL getpointinsradius(point pt); + inline bool issteinerpoint(point pt); + + // Advanced primitives. + inline void point2tetorg(point pt, triface& t); + inline void point2shorg(point pa, face& s); + inline point farsorg(face& seg); + inline point farsdest(face& seg); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Memory managment // +// // +/////////////////////////////////////////////////////////////////////////////// + + void tetrahedrondealloc(tetrahedron*); + tetrahedron *tetrahedrontraverse(); + tetrahedron *alltetrahedrontraverse(); + void shellfacedealloc(memorypool*, shellface*); + shellface *shellfacetraverse(memorypool*); + void pointdealloc(point); + point pointtraverse(); + + void makeindex2pointmap(point*&); + void makepoint2submap(memorypool*, int*&, face*&); + void maketetrahedron(triface*); + void makeshellface(memorypool*, face*); + void makepoint(point*, enum verttype); + + void initializepools(); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Advanced geometric predicates and calculations // +// // +// TetGen uses a simplified symbolic perturbation scheme from Edelsbrunner, // +// et al [*]. Hence the point-in-sphere test never returns a zero. The idea // +// is to perturb the weights of vertices in the fourth dimension. TetGen // +// uses the indices of the vertices decide the amount of perturbation. It is // +// implemented in the routine insphere_s(). +// // +// The routine tri_edge_test() determines whether or not a triangle and an // +// edge intersect in 3D. If they intersect, their intersection type is also // +// reported. This test is a combination of n 3D orientation tests (n is bet- // +// ween 3 and 9). It uses the robust orient3d() test to make the branch dec- // +// isions. The routine tri_tri_test() determines whether or not two triang- // +// les intersect in 3D. It also uses the robust orient3d() test. // +// // +// There are a number of routines to calculate geometrical quantities, e.g., // +// circumcenters, angles, dihedral angles, face normals, face areas, etc. // +// They are so far done by the default floating-point arithmetics which are // +// non-robust. They should be improved in the future. // +// // +/////////////////////////////////////////////////////////////////////////////// + + // Symbolic perturbations (robust) + REAL insphere_s(REAL*, REAL*, REAL*, REAL*, REAL*); + REAL orient4d_s(REAL*, REAL*, REAL*, REAL*, REAL*, + REAL, REAL, REAL, REAL, REAL); + + // Triangle-edge intersection test (robust) + int tri_edge_2d(point, point, point, point, point, point, int, int*, int*); + int tri_edge_tail(point, point, point, point, point, point, REAL, REAL, int, + int*, int*); + int tri_edge_test(point, point, point, point, point, point, int, int*, int*); + + // Triangle-triangle intersection test (robust) + int tri_edge_inter_tail(point, point, point, point, point, REAL, REAL); + int tri_tri_inter(point, point, point, point, point, point); + + // Linear algebra functions + inline REAL dot(REAL* v1, REAL* v2); + inline void cross(REAL* v1, REAL* v2, REAL* n); + bool lu_decmp(REAL lu[4][4], int n, int* ps, REAL* d, int N); + void lu_solve(REAL lu[4][4], int n, int* ps, REAL* b, int N); + + // An embedded 2-dimensional geometric predicate (non-robust) + REAL incircle3d(point pa, point pb, point pc, point pd); + + // Geometric calculations (non-robust) + REAL orient3dfast(REAL *pa, REAL *pb, REAL *pc, REAL *pd); + inline REAL norm2(REAL x, REAL y, REAL z); + inline REAL distance(REAL* p1, REAL* p2); + void facenormal(point pa, point pb, point pc, REAL *n, int pivot, REAL *lav); + REAL shortdistance(REAL* p, REAL* e1, REAL* e2); + REAL triarea(REAL* pa, REAL* pb, REAL* pc); + REAL interiorangle(REAL* o, REAL* p1, REAL* p2, REAL* n); + void projpt2edge(REAL* p, REAL* e1, REAL* e2, REAL* prj); + void projpt2face(REAL* p, REAL* f1, REAL* f2, REAL* f3, REAL* prj); + bool tetalldihedral(point, point, point, point, REAL*, REAL*, REAL*); + void tetallnormal(point, point, point, point, REAL N[4][3], REAL* volume); + REAL tetaspectratio(point, point, point, point); + bool circumsphere(REAL*, REAL*, REAL*, REAL*, REAL* cent, REAL* radius); + bool orthosphere(REAL*,REAL*,REAL*,REAL*,REAL,REAL,REAL,REAL,REAL*,REAL*); + void tetcircumcenter(point tetorg, point tetdest, point tetfapex, + point tettapex, REAL *circumcenter, REAL *radius); + void planelineint(REAL*, REAL*, REAL*, REAL*, REAL*, REAL*, REAL*); + int linelineint(REAL*, REAL*, REAL*, REAL*, REAL*, REAL*, REAL*, REAL*); + REAL tetprismvol(REAL* pa, REAL* pb, REAL* pc, REAL* pd); + bool calculateabovepoint(arraypool*, point*, point*, point*); + void calculateabovepoint4(point, point, point, point); + + // PLC error reports. + void report_overlapping_facets(face*, face*, REAL dihedang = 0.0); + int report_selfint_edge(point, point, face* sedge, triface* searchtet, + enum interresult); + int report_selfint_face(point, point, point, face* sface, triface* iedge, + int intflag, int* types, int* poss); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Local mesh transformations // +// // +// A local transformation replaces a small set of tetrahedra with another // +// set of tetrahedra which fills the same space and the same boundaries. // +// In 3D, the most simplest local transformations are the elementary flips // +// performed within the convex hull of five vertices: 2-to-3, 3-to-2, 1-to-4,// +// and 4-to-1 flips, where the numbers indicate the number of tetrahedra // +// before and after each flip. The 1-to-4 and 4-to-1 flip involve inserting // +// or deleting a vertex, respectively. // +// There are complex local transformations which can be decomposed as a // +// combination of elementary flips. For example,a 4-to-4 flip which replaces // +// two coplanar edges can be regarded by a 2-to-3 flip and a 3-to-2 flip. // +// Note that the first 2-to-3 flip will temporarily create a degenerate tet- // +// rahedron which is removed immediately by the followed 3-to-2 flip. More // +// generally, a n-to-m flip, where n > 3, m = (n - 2) * 2, which removes an // +// edge can be done by first performing a sequence of (n - 3) 2-to-3 flips // +// followed by a 3-to-2 flip. // +// // +// The routines flip23(), flip32(), and flip41() perform the three element- // +// ray flips. The flip14() is available inside the routine insertpoint(). // +// // +// The routines flipnm() and flipnm_post() implement a generalized edge flip // +// algorithm which uses a combination of elementary flips. // +// // +// The routine insertpoint() implements a variant of Bowyer-Watson's cavity // +// algorithm to insert a vertex. It works for arbitrary tetrahedralization, // +// either Delaunay, or constrained Delaunay, or non-Delaunay. // +// // +/////////////////////////////////////////////////////////////////////////////// + + // The elementary flips. + void flip23(triface*, int, flipconstraints* fc); + void flip32(triface*, int, flipconstraints* fc); + void flip41(triface*, int, flipconstraints* fc); + + // A generalized edge flip. + int flipnm(triface*, int n, int level, int, flipconstraints* fc); + int flipnm_post(triface*, int n, int nn, int, flipconstraints* fc); + + // Point insertion. + int insertpoint(point, triface*, face*, face*, insertvertexflags*); + void insertpoint_abort(face*, insertvertexflags*); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Delaunay tetrahedralization // +// // +// The routine incrementaldelaunay() implemented two incremental algorithms // +// for constructing Delaunay tetrahedralizations (DTs): the Bowyer-Watson // +// (B-W) algorithm and the incremental flip algorithm of Edelsbrunner and // +// Shah, "Incremental topological flipping works for regular triangulation," // +// Algorithmica, 15:233-241, 1996. // +// // +// The routine incrementalflip() implements the flip algorithm of [Edelsbru- // +// nner and Shah, 1996]. It flips a queue of locally non-Delaunay faces (in // +// an arbitrary order). The success is guaranteed when the Delaunay tetrah- // +// edralization is constructed incrementally by adding one vertex at a time. // +// // +// The routine locate() finds a tetrahedron contains a new point in current // +// DT. It uses a simple stochastic walk algorithm: starting from an arbitr- // +// ary tetrahedron in DT, it finds the destination by visit one tetrahedron // +// at a time, randomly chooses a tetrahedron if there are more than one // +// choices. This algorithm terminates due to Edelsbrunner's acyclic theorem. // +// Choose a good starting tetrahedron is crucial to the speed of the walk. // +// TetGen originally uses the "jump-and-walk" algorithm of Muecke, E.P., // +// Saias, I., and Zhu, B. "Fast Randomized Point Location Without Preproces- // +// sing." In Proceedings of the 12th ACM Symposium on Computational Geometry,// +// 274-283, 1996. It first randomly samples several tetrahedra in the DT // +// and then choosing the closet one to start walking. // +// The above algorithm slows download dramatically as the number of points // +// grows -- reported in Amenta, N., Choi, S. and Rote, G., "Incremental // +// construction con {BRIO}," In Proceedings of 19th ACM Symposium on // +// Computational Geometry, 211-219, 2003. On the other hand, Liu and // +// Snoeyink showed that the point location can be made in constant time if // +// the points are pre-sorted so that the nearby points in space have nearby // +// indices, then adding the points in this order. They sorted the points // +// along the 3D Hilbert curve. // +// // +// The routine hilbert_sort3() sorts a set of 3D points along the 3D Hilbert // +// curve. It recursively splits a point set according to the Hilbert indices // +// mapped to the subboxes of the bounding box of the point set. // +// The Hilbert indices is calculated by Butz's algorithm in 1971. A nice // +// exposition of this algorithm can be found in the paper of Hamilton, C., // +// "Compact Hilbert Indices", Technical Report CS-2006-07, Computer Science, // +// Dalhousie University, 2006 (the Section 2). My implementation also refer- // +// enced Steven Witham's implementation of "Hilbert walk" (hopefully, it is // +// still available at: http://www.tiac.net/~sw/2008/10/Hilbert/). // +// // +// TetGen sorts the points using the method in the paper of Boissonnat,J.-D.,// +// Devillers, O. and Hornus, S. "Incremental Construction of the Delaunay // +// Triangulation and the Delaunay Graph in Medium Dimension," In Proceedings // +// of the 25th ACM Symposium on Computational Geometry, 2009. // +// It first randomly sorts the points into subgroups using the Biased Rand-// +// omized Insertion Ordering (BRIO) of Amenta et al 2003, then sorts the // +// points in each subgroup along the 3D Hilbert curve. Inserting points in // +// this order ensures a randomized "sprinkling" of the points over the // +// domain, while sorting of each subset ensures locality. // +// // +/////////////////////////////////////////////////////////////////////////////// + + void transfernodes(); + + // Point sorting. + int transgc[8][3][8], tsb1mod3[8]; + void hilbert_init(int n); + int hilbert_split(point* vertexarray, int arraysize, int gc0, int gc1, + REAL, REAL, REAL, REAL, REAL, REAL); + void hilbert_sort3(point* vertexarray, int arraysize, int e, int d, + REAL, REAL, REAL, REAL, REAL, REAL, int depth); + void brio_multiscale_sort(point*,int,int threshold,REAL ratio,int* depth); + + // Point location. + unsigned long randomnation(unsigned int choices); + void randomsample(point searchpt, triface *searchtet); + enum locateresult locate(point searchpt, triface *searchtet, + int chkencflag = 0); + + // Incremental flips. + void flippush(badface*&, triface*); + int incrementalflip(point newpt, int, flipconstraints *fc); + + // Incremental Delaunay construction. + void initialdelaunay(point pa, point pb, point pc, point pd); + void incrementaldelaunay(clock_t&); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Surface triangulation // +// // +/////////////////////////////////////////////////////////////////////////////// + + void flipshpush(face*); + void flip22(face*, int, int); + void flip31(face*, int); + long lawsonflip(); + int sinsertvertex(point newpt, face*, face*, int iloc, int bowywat, int); + int sremovevertex(point delpt, face*, face*, int lawson); + + enum locateresult slocate(point, face*, int, int, int); + enum interresult sscoutsegment(face*, point, int, int, int); + void scarveholes(int, REAL*); + int triangulate(int, arraypool*, arraypool*, int, REAL*); + + void unifysegments(); + void identifyinputedges(point*); + void mergefacets(); + void removesmallangles(); + void meshsurface(); + + void interecursive(shellface** subfacearray, int arraysize, int axis, + REAL, REAL, REAL, REAL, REAL, REAL, int* internum); + void detectinterfaces(); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Constrained Delaunay tetrahedralization // +// // +// A constrained Delaunay tetrahedralization (CDT) is a variation of a Dela- // +// unay tetrahedralization (DT) that is constrained to respect the boundary // +// of a 3D PLC (domain). In a CDT of a 3D PLC, every vertex or edge of the // +// PLC is also a vertex or an edge of the CDT, every polygon of the PLC is a // +// union of triangles of the CDT. A crucial difference between a CDT and a // +// DT is that triangles in the PLC's polygons are not required to be locally // +// Delaunay, which frees the CDT to better respect the PLC's polygons. CDTs // +// have optimal properties similar to those of DTs. // +// // +// Steiner Points and Steiner CDTs. It is known that even a simple 3D polyh- // +// edron may not have a tetrahedralization which only uses its own vertices. // +// Some extra points, so-called "Steiner points" are needed in order to form // +// a tetrahedralization of such polyhedron. It is true for tetrahedralizing // +// a 3D PLC as well. A Steiner CDT of a 3D PLC is a CDT containing Steiner // +// points. The CDT algorithms of TetGen in general create Steiner CDTs. // +// Almost all of the Steiner points are added in the edges of the PLC. They // +// guarantee the existence of a CDT of the modified PLC. // +// // +// The routine constraineddelaunay() starts from a DT of the vertices of a // +// PLC and creates a (Steiner) CDT of the PLC (including Steiner points). It // +// is constructed by two steps, (1) segment recovery and (2) facet (polygon) // +// recovery. Each step is accomplished by its own algorithm. // +// // +// The routine delaunizesegments() implements the segment recovery algorithm // +// of Si, H. and Gaertner, K. "Meshing Piecewise Linear Complexes by Constr- // +// ained Delaunay Tetrahedralizations," In Proceedings of the 14th Internat- // +// ional Meshing Roundtable, 147--163, 2005. It adds Steiner points into // +// non-Delaunay segments until all subsegments appear together in a DT. The // +// running time of this algorithm is proportional to the number of added // +// Steiner points. // +// // +// There are two incremental facet recovery algorithms: the cavity re-trian- // +// gulation algorithm of Si, H. and Gaertner, K. "3D Boundary Recovery by // +// Constrained Delaunay Tetrahedralization," International Journal for Numer-// +// ical Methods in Engineering, 85:1341-1364, 2011, and the flip algorithm // +// of Shewchuk, J. "Updating and Constructing Constrained Delaunay and // +// Constrained Regular Triangulations by Flips." In Proceedings of the 19th // +// ACM Symposium on Computational Geometry, 86-95, 2003. // +// // +// It is guaranteed in theory, no Steiner point is needed in both algorithms // +// However, a facet with non-coplanar vertices might cause the additions of // +// Steiner points. It is discussed in the paper of Si, H., and Shewchuk, J.,// +// "Incrementally Constructing and Updating Constrained Delaunay // +// Tetrahedralizations with Finite Precision Coordinates." In Proceedings of // +// the 21th International Meshing Roundtable, 2012. // +// // +// Our implementation of the facet recovery algorithms recover a "missing // +// region" at a time. Each missing region is a subset of connected interiors // +// of a polygon. The routine formcavity() creates the cavity of crossing // +// tetrahedra of the missing region. // +// // +// The cavity re-triangulation algorithm is implemented by three subroutines,// +// delaunizecavity(), fillcavity(), and carvecavity(). Since it may fail due // +// to non-coplanar vertices, the subroutine restorecavity() is used to rest- // +// ore the original cavity. // +// // +// The routine flipinsertfacet() implements the flip algorithm. The subrout- // +// ine flipcertify() is used to maintain the priority queue of flips. // +// // +// The routine refineregion() is called when the facet recovery algorithm // +// fail to recover a missing region. It inserts Steiner points to refine the // +// missing region. In order to avoid inserting Steiner points very close to // +// existing segments. The classical encroachment rules of the Delaunay // +// refinement algorithm are used to choose the Steiner points. // +// // +// The routine constrainedfacets() does the facet recovery by using either // +// the cavity re-triangulation algorithm (default) or the flip algorithm. It // +// results a CDT of the (modified) PLC (including Steiner points). // +// // +/////////////////////////////////////////////////////////////////////////////// + + void makesegmentendpointsmap(); + + enum interresult finddirection(triface* searchtet, point endpt); + enum interresult scoutsegment(point, point, face*, triface*, point*, + arraypool*); + int getsteinerptonsegment(face* seg, point refpt, point steinpt); + void delaunizesegments(); + + int scoutsubface(face* searchsh,triface* searchtet,int shflag); + void formregion(face*, arraypool*, arraypool*, arraypool*); + int scoutcrossedge(triface& crosstet, arraypool*, arraypool*); + bool formcavity(triface*, arraypool*, arraypool*, arraypool*, arraypool*, + arraypool*, arraypool*); + // Facet recovery by cavity re-triangulation [Si and Gaertner 2011]. + void delaunizecavity(arraypool*, arraypool*, arraypool*, arraypool*, + arraypool*, arraypool*); + bool fillcavity(arraypool*, arraypool*, arraypool*, arraypool*, + arraypool*, arraypool*, triface* crossedge); + void carvecavity(arraypool*, arraypool*, arraypool*); + void restorecavity(arraypool*, arraypool*, arraypool*, arraypool*); + // Facet recovery by flips [Shewchuk 2003]. + void flipcertify(triface *chkface, badface **pqueue, point, point, point); + void flipinsertfacet(arraypool*, arraypool*, arraypool*, arraypool*); + + int insertpoint_cdt(point, triface*, face*, face*, insertvertexflags*, + arraypool*, arraypool*, arraypool*, arraypool*, + arraypool*, arraypool*); + void refineregion(face&, arraypool*, arraypool*, arraypool*, arraypool*, + arraypool*, arraypool*); + void constrainedfacets(); + + void constraineddelaunay(clock_t&); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Constrained tetrahedralizations. // +// // +/////////////////////////////////////////////////////////////////////////////// + + int checkflipeligibility(int fliptype, point, point, point, point, point, + int level, int edgepivot, flipconstraints* fc); + + int removeedgebyflips(triface*, flipconstraints*); + int removefacebyflips(triface*, flipconstraints*); + + int recoveredgebyflips(point, point, face*, triface*, int fullsearch); + int add_steinerpt_in_schoenhardtpoly(triface*, int, int chkencflag); + int add_steinerpt_in_segment(face*, int searchlevel); + int addsteiner4recoversegment(face*, int); + int recoversegments(arraypool*, int fullsearch, int steinerflag); + + int recoverfacebyflips(point, point, point, face*, triface*); + int recoversubfaces(arraypool*, int steinerflag); + + int getvertexstar(int, point searchpt, arraypool*, arraypool*, arraypool*); + int getedge(point, point, triface*); + int reduceedgesatvertex(point startpt, arraypool* endptlist); + int removevertexbyflips(point steinerpt); + + int suppressbdrysteinerpoint(point steinerpt); + int suppresssteinerpoints(); + + void recoverboundary(clock_t&); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Mesh reconstruction // +// // +/////////////////////////////////////////////////////////////////////////////// + + void carveholes(); + + void reconstructmesh(); + + int search_face(point p0, point p1, point p2, triface &tetloop); + int search_edge(point p0, point p1, triface &tetloop); + int scoutpoint(point, triface*, int randflag); + REAL getpointmeshsize(point, triface*, int iloc); + void interpolatemeshsize(); + void out_points_to_cells_map(); // in flow_main() + + void insertconstrainedpoints(point *insertarray, int arylen, int rejflag); + void insertconstrainedpoints(tetgenio *addio); + + void collectremovepoints(arraypool *remptlist); + void meshcoarsening(); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Mesh refinement // +// // +// The purpose of mesh refinement is to obtain a tetrahedral mesh with well- // +// -shaped tetrahedra and appropriate mesh size. It is necessary to insert // +// new Steiner points to achieve this property. The questions are (1) how to // +// choose the Steiner points? and (2) how to insert them? // +// // +// Delaunay refinement is a technique first developed by Chew [1989] and // +// Ruppert [1993, 1995] to generate quality triangular meshes in the plane. // +// It provides guarantee on the smallest angle of the triangles. Rupper's // +// algorithm guarantees that the mesh is size-optimal (to within a constant // +// factor) among all meshes with the same quality. // +// Shewchuk generalized Ruppert's algorithm into 3D in his PhD thesis // +// [Shewchuk 1997]. A short version of his algorithm appears in "Tetrahedral // +// Mesh Generation by Delaunay Refinement," In Proceedings of the 14th ACM // +// Symposium on Computational Geometry, 86-95, 1998. It guarantees that all // +// tetrahedra of the output mesh have a "radius-edge ratio" (equivalent to // +// the minimal face angle) bounded. However, it does not remove slivers, a // +// type of very flat tetrahedra which can have no small face angles but have // +// very small (and large) dihedral angles. Moreover, it may not terminate if // +// the input PLC contains "sharp features", e.g., two edges (or two facets) // +// meet at an acute angle (or dihedral angle). // +// // +// TetGen uses the basic Delaunay refinement scheme to insert Steiner points.// +// While it always maintains a constrained Delaunay mesh. The algorithm is // +// described in Si, H., "Adaptive Constrained Delaunay Mesh Generation," // +// International Journal for Numerical Methods in Engineering, 75:856-880. // +// This algorithm always terminates and sharp features are easily preserved. // +// The mesh has good quality (same as Shewchuk's Delaunay refinement algori- // +// thm) in the bulk of the mesh domain. Moreover, it supports the generation // +// of adaptive mesh according to a (isotropic) mesh sizing function. // +// // +/////////////////////////////////////////////////////////////////////////////// + + void makefacetverticesmap(); + int segsegadjacent(face *, face *); + int segfacetadjacent(face *checkseg, face *checksh); + int facetfacetadjacent(face *, face *); + void save_segmentpoint_insradius(point segpt, point parentpt, REAL r); + void save_facetpoint_insradius(point facpt, point parentpt, REAL r); + void enqueuesubface(memorypool*, face*); + void enqueuetetrahedron(triface*); + + int checkseg4encroach(point pa, point pb, point checkpt); + int checkseg4split(face *chkseg, point&, int&); + int splitsegment(face *splitseg, point encpt, REAL, point, point, int, int); + void repairencsegs(int chkencflag); + + int checkfac4encroach(point, point, point, point checkpt, REAL*, REAL*); + int checkfac4split(face *chkfac, point& encpt, int& qflag, REAL *ccent); + int splitsubface(face *splitfac, point, point, int qflag, REAL *ccent, int); + void repairencfacs(int chkencflag); + + int checktet4split(triface *chktet, int& qflag, REAL *ccent); + int splittetrahedron(triface* splittet,int qflag,REAL *ccent, int); + void repairbadtets(int chkencflag); + + void delaunayrefinement(); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Mesh optimization // +// // +/////////////////////////////////////////////////////////////////////////////// + + long lawsonflip3d(flipconstraints *fc); + void recoverdelaunay(); + + int gettetrahedron(point, point, point, point, triface *); + long improvequalitybyflips(); + + int smoothpoint(point smtpt, arraypool*, int ccw, optparameters *opm); + long improvequalitybysmoothing(optparameters *opm); + + int splitsliver(triface *, REAL, int); + long removeslivers(int); + + void optimizemesh(); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Mesh check and statistics // +// // +/////////////////////////////////////////////////////////////////////////////// + + // Mesh validations. + int checkmesh(int topoflag); + int checkshells(); + int checksegments(); + int checkdelaunay(int perturb = 1); + int checkregular(int); + int checkconforming(int); + + // Mesh statistics. + void printfcomma(unsigned long n); + void qualitystatistics(); + void memorystatistics(); + void statistics(); + +/////////////////////////////////////////////////////////////////////////////// +// // +// Mesh output // +// // +/////////////////////////////////////////////////////////////////////////////// + + void jettisonnodes(); + void highorder(); + void indexelements(); + void numberedges(); + void outnodes(tetgenio*); + void outmetrics(tetgenio*); + void outelements(tetgenio*); + void outfaces(tetgenio*); + void outhullfaces(tetgenio*); + void outsubfaces(tetgenio*); + void outedges(tetgenio*); + void outsubsegments(tetgenio*); + void outneighbors(tetgenio*); + void outvoronoi(tetgenio*); + void outsmesh(char*); + void outmesh2medit(char*); + void outmesh2vtk(char*); + + + + +/////////////////////////////////////////////////////////////////////////////// +// // +// Constructor & destructor // +// // +/////////////////////////////////////////////////////////////////////////////// + + void initializetetgenmesh() + { + in = addin = NULL; + b = NULL; + bgm = NULL; + + tetrahedrons = subfaces = subsegs = points = NULL; + badtetrahedrons = badsubfacs = badsubsegs = NULL; + tet2segpool = tet2subpool = NULL; + flippool = NULL; + + dummypoint = NULL; + flipstack = NULL; + unflipqueue = NULL; + + cavetetlist = cavebdrylist = caveoldtetlist = NULL; + cavetetshlist = cavetetseglist = cavetetvertlist = NULL; + caveencshlist = caveencseglist = NULL; + caveshlist = caveshbdlist = cavesegshlist = NULL; + + subsegstack = subfacstack = subvertstack = NULL; + encseglist = encshlist = NULL; + idx2facetlist = NULL; + facetverticeslist = NULL; + segmentendpointslist = NULL; + + highordertable = NULL; + + numpointattrib = numelemattrib = 0; + sizeoftensor = 0; + pointmtrindex = 0; + pointparamindex = 0; + pointmarkindex = 0; + point2simindex = 0; + pointinsradiusindex = 0; + elemattribindex = 0; + volumeboundindex = 0; + shmarkindex = 0; + areaboundindex = 0; + checksubsegflag = 0; + checksubfaceflag = 0; + checkconstraints = 0; + nonconvex = 0; + autofliplinklevel = 1; + useinsertradius = 0; + samples = 0l; + randomseed = 1l; + minfaceang = minfacetdihed = PI; + tetprism_vol_sum = 0.0; + longest = minedgelength = 0.0; + xmax = xmin = ymax = ymin = zmax = zmin = 0.0; + + insegments = 0l; + hullsize = 0l; + meshedges = meshhulledges = 0l; + steinerleft = -1; + dupverts = 0l; + unuverts = 0l; + nonregularcount = 0l; + st_segref_count = st_facref_count = st_volref_count = 0l; + fillregioncount = cavitycount = cavityexpcount = 0l; + flip14count = flip26count = flipn2ncount = 0l; + flip23count = flip32count = flip44count = flip41count = 0l; + flip22count = flip31count = 0l; + totalworkmemory = 0l; + + + } // tetgenmesh() + + void freememory() + { + if (bgm != NULL) { + delete bgm; + } + + if (points != (memorypool *) NULL) { + delete points; + delete [] dummypoint; + } + if (tetrahedrons != (memorypool *) NULL) { + delete tetrahedrons; + } + if (subfaces != (memorypool *) NULL) { + delete subfaces; + delete subsegs; + } + if (tet2segpool != NULL) { + delete tet2segpool; + delete tet2subpool; + } + + if (badtetrahedrons) { + delete badtetrahedrons; + } + if (badsubfacs) { + delete badsubfacs; + } + if (badsubsegs) { + delete badsubsegs; + } + if (encseglist) { + delete encseglist; + } + if (encshlist) { + delete encshlist; + } + + if (flippool != NULL) { + delete flippool; + delete unflipqueue; + } + + if (cavetetlist != NULL) { + delete cavetetlist; + delete cavebdrylist; + delete caveoldtetlist; + delete cavetetvertlist; + } + + if (caveshlist != NULL) { + delete caveshlist; + delete caveshbdlist; + delete cavesegshlist; + delete cavetetshlist; + delete cavetetseglist; + delete caveencshlist; + delete caveencseglist; + } + + if (subsegstack != NULL) { + delete subsegstack; + delete subfacstack; + delete subvertstack; + } + + if (idx2facetlist != NULL) { + delete [] idx2facetlist; + delete [] facetverticeslist; + } + + if (segmentendpointslist != NULL) { + delete [] segmentendpointslist; + } + + if (highordertable != NULL) { + delete [] highordertable; + } + + initializetetgenmesh(); + } + + tetgenmesh() + { + initializetetgenmesh(); + } + + ~tetgenmesh() + { + freememory(); + } // ~tetgenmesh() + +}; // End of class tetgenmesh. + +/////////////////////////////////////////////////////////////////////////////// +// // +// tetrahedralize() Interface for using TetGen's library to generate // +// Delaunay tetrahedralizations, constrained Delaunay // +// tetrahedralizations, quality tetrahedral meshes. // +// // +// 'in' is an object of 'tetgenio' which contains a PLC you want to tetrahed-// +// ralize or a previously generated tetrahedral mesh you want to refine. It // +// must not be a NULL. 'out' is another object of 'tetgenio' for storing the // +// generated tetrahedral mesh. It can be a NULL. If so, the output will be // +// saved to file(s). If 'bgmin' != NULL, it contains a background mesh which // +// defines a mesh size function. // +// // +/////////////////////////////////////////////////////////////////////////////// + +void tetrahedralize(tetgenbehavior *b, tetgenio *in, tetgenio *out, + tetgenio *addin = NULL, tetgenio *bgmin = NULL); + +#ifdef TETLIBRARY +void tetrahedralize(char *switches, tetgenio *in, tetgenio *out, + tetgenio *addin = NULL, tetgenio *bgmin = NULL); +#endif // #ifdef TETLIBRARY + +/////////////////////////////////////////////////////////////////////////////// +// // +// terminatetetgen() Terminate TetGen with a given exit code. // +// // +/////////////////////////////////////////////////////////////////////////////// + +// selfint_event, a structure to report self-intersections. +// +// - e_type, report the type of self-intersections, +// it may be one of: +// 0, reserved. +// 1, two edges intersect, +// 2, an edge and a triangle intersect, +// 3, two triangles intersect, +// 4, two edges are overlapping, +// 5, an edge and a triangle are overlapping, +// 6, two triangles are overlapping, +// 7, a vertex lies in an edge, +// 8, a vertex lies in a facet, + +class selfint_event { +public: + int e_type; + int f_marker1; // Tag of the 1st facet. + int s_marker1; // Tag of the 1st segment. + int f_vertices1[3]; + int f_marker2; // Tag of the 2nd facet. + int s_marker2; // Tag of the 2nd segment. + int f_vertices2[3]; + REAL int_point[3]; + selfint_event() { + e_type = 0; + f_marker1 = f_marker2 = 0; + s_marker1 = s_marker2 = 0; + } +}; + +static selfint_event sevent; + +inline void terminatetetgen(tetgenmesh *m, int x) +{ +#ifdef TETLIBRARY + throw x; +#else + switch (x) { + case 1: // Out of memory. + printf("Error: Out of memory.\n"); + break; + case 2: // Encounter an internal error. + printf("Please report this bug to Hang.Si@wias-berlin.de. Include\n"); + printf(" the message above, your input data set, and the exact\n"); + printf(" command line you used to run this program, thank you.\n"); + break; + case 3: + printf("A self-intersection was detected. Program stopped.\n"); + printf("Hint: use -d option to detect all self-intersections.\n"); + break; + case 4: + printf("A very small input feature size was detected. Program stopped.\n"); + if (m) { + printf("Hint: use -T option to set a smaller tolerance. Current is %g\n", + m->b->epsilon); + } + break; + case 5: + printf("Two very close input facets were detected. Program stopped.\n"); + printf("Hint: use -Y option to avoid adding Steiner points in boundary.\n"); + break; + case 10: + printf("An input error was detected. Program stopped.\n"); + break; + } // switch (x) + exit(x); +#endif // #ifdef TETLIBRARY +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// Primitives for tetrahedra // +// // +/////////////////////////////////////////////////////////////////////////////// + +// encode() compress a handle into a single pointer. It relies on the +// assumption that all addresses of tetrahedra are aligned to sixteen- +// byte boundaries, so that the last four significant bits are zero. + +inline tetgenmesh::tetrahedron tetgenmesh::encode(triface& t) { + return (tetrahedron) ((uintptr_t) (t).tet | (uintptr_t) (t).ver); +} + +inline tetgenmesh::tetrahedron tetgenmesh::encode2(tetrahedron* ptr, int ver) { + return (tetrahedron) ((uintptr_t) (ptr) | (uintptr_t) (ver)); +} + +// decode() converts a pointer to a handle. The version is extracted from +// the four least significant bits of the pointer. + +inline void tetgenmesh::decode(tetrahedron ptr, triface& t) { + (t).ver = (int) ((uintptr_t) (ptr) & (uintptr_t) 15); + (t).tet = (tetrahedron *) ((uintptr_t) (ptr) ^ (uintptr_t) (t).ver); +} + +// bond() connects two tetrahedra together. (t1,v1) and (t2,v2) must +// refer to the same face and the same edge. + +inline void tetgenmesh::bond(triface& t1, triface& t2) { + t1.tet[t1.ver & 3] = encode2(t2.tet, bondtbl[t1.ver][t2.ver]); + t2.tet[t2.ver & 3] = encode2(t1.tet, bondtbl[t2.ver][t1.ver]); +} + + +// dissolve() a bond (from one side). + +inline void tetgenmesh::dissolve(triface& t) { + t.tet[t.ver & 3] = NULL; +} + +// enext() finds the next edge (counterclockwise) in the same face. + +inline void tetgenmesh::enext(triface& t1, triface& t2) { + t2.tet = t1.tet; + t2.ver = enexttbl[t1.ver]; +} + +inline void tetgenmesh::enextself(triface& t) { + t.ver = enexttbl[t.ver]; +} + +// eprev() finds the next edge (clockwise) in the same face. + +inline void tetgenmesh::eprev(triface& t1, triface& t2) { + t2.tet = t1.tet; + t2.ver = eprevtbl[t1.ver]; +} + +inline void tetgenmesh::eprevself(triface& t) { + t.ver = eprevtbl[t.ver]; +} + +// esym() finds the reversed edge. It is in the other face of the +// same tetrahedron. + +inline void tetgenmesh::esym(triface& t1, triface& t2) { + (t2).tet = (t1).tet; + (t2).ver = esymtbl[(t1).ver]; +} + +inline void tetgenmesh::esymself(triface& t) { + (t).ver = esymtbl[(t).ver]; +} + +// enextesym() finds the reversed edge of the next edge. It is in the other +// face of the same tetrahedron. It is the combination esym() * enext(). + +inline void tetgenmesh::enextesym(triface& t1, triface& t2) { + t2.tet = t1.tet; + t2.ver = enextesymtbl[t1.ver]; +} + +inline void tetgenmesh::enextesymself(triface& t) { + t.ver = enextesymtbl[t.ver]; +} + +// eprevesym() finds the reversed edge of the previous edge. + +inline void tetgenmesh::eprevesym(triface& t1, triface& t2) { + t2.tet = t1.tet; + t2.ver = eprevesymtbl[t1.ver]; +} + +inline void tetgenmesh::eprevesymself(triface& t) { + t.ver = eprevesymtbl[t.ver]; +} + +// eorgoppo() Finds the opposite face of the origin of the current edge. +// Return the opposite edge of the current edge. + +inline void tetgenmesh::eorgoppo(triface& t1, triface& t2) { + t2.tet = t1.tet; + t2.ver = eorgoppotbl[t1.ver]; +} + +inline void tetgenmesh::eorgoppoself(triface& t) { + t.ver = eorgoppotbl[t.ver]; +} + +// edestoppo() Finds the opposite face of the destination of the current +// edge. Return the opposite edge of the current edge. + +inline void tetgenmesh::edestoppo(triface& t1, triface& t2) { + t2.tet = t1.tet; + t2.ver = edestoppotbl[t1.ver]; +} + +inline void tetgenmesh::edestoppoself(triface& t) { + t.ver = edestoppotbl[t.ver]; +} + +// fsym() finds the adjacent tetrahedron at the same face and the same edge. + +inline void tetgenmesh::fsym(triface& t1, triface& t2) { + decode((t1).tet[(t1).ver & 3], t2); + t2.ver = fsymtbl[t1.ver][t2.ver]; +} + + +#define fsymself(t) \ + t1ver = (t).ver; \ + decode((t).tet[(t).ver & 3], (t));\ + (t).ver = fsymtbl[t1ver][(t).ver] + +// fnext() finds the next face while rotating about an edge according to +// a right-hand rule. The face is in the adjacent tetrahedron. It is +// the combination: fsym() * esym(). + +inline void tetgenmesh::fnext(triface& t1, triface& t2) { + decode(t1.tet[facepivot1[t1.ver]], t2); + t2.ver = facepivot2[t1.ver][t2.ver]; +} + + +#define fnextself(t) \ + t1ver = (t).ver; \ + decode((t).tet[facepivot1[(t).ver]], (t)); \ + (t).ver = facepivot2[t1ver][(t).ver] + + +// The following primtives get or set the origin, destination, face apex, +// or face opposite of an ordered tetrahedron. + +inline tetgenmesh::point tetgenmesh::org(triface& t) { + return (point) (t).tet[orgpivot[(t).ver]]; +} + +inline tetgenmesh::point tetgenmesh:: dest(triface& t) { + return (point) (t).tet[destpivot[(t).ver]]; +} + +inline tetgenmesh::point tetgenmesh:: apex(triface& t) { + return (point) (t).tet[apexpivot[(t).ver]]; +} + +inline tetgenmesh::point tetgenmesh:: oppo(triface& t) { + return (point) (t).tet[oppopivot[(t).ver]]; +} + +inline void tetgenmesh:: setorg(triface& t, point p) { + (t).tet[orgpivot[(t).ver]] = (tetrahedron) (p); +} + +inline void tetgenmesh:: setdest(triface& t, point p) { + (t).tet[destpivot[(t).ver]] = (tetrahedron) (p); +} + +inline void tetgenmesh:: setapex(triface& t, point p) { + (t).tet[apexpivot[(t).ver]] = (tetrahedron) (p); +} + +inline void tetgenmesh:: setoppo(triface& t, point p) { + (t).tet[oppopivot[(t).ver]] = (tetrahedron) (p); +} + +#define setvertices(t, torg, tdest, tapex, toppo) \ + (t).tet[orgpivot[(t).ver]] = (tetrahedron) (torg);\ + (t).tet[destpivot[(t).ver]] = (tetrahedron) (tdest); \ + (t).tet[apexpivot[(t).ver]] = (tetrahedron) (tapex); \ + (t).tet[oppopivot[(t).ver]] = (tetrahedron) (toppo) + +// Check or set a tetrahedron's attributes. + +inline REAL tetgenmesh::elemattribute(tetrahedron* ptr, int attnum) { + return ((REAL *) (ptr))[elemattribindex + attnum]; +} + +inline void tetgenmesh::setelemattribute(tetrahedron* ptr, int attnum, + REAL value) { + ((REAL *) (ptr))[elemattribindex + attnum] = value; +} + +// Check or set a tetrahedron's maximum volume bound. + +inline REAL tetgenmesh::volumebound(tetrahedron* ptr) { + return ((REAL *) (ptr))[volumeboundindex]; +} + +inline void tetgenmesh::setvolumebound(tetrahedron* ptr, REAL value) { + ((REAL *) (ptr))[volumeboundindex] = value; +} + +// Get or set a tetrahedron's index (only used for output). +// These two routines use the reserved slot ptr[10]. + +inline int tetgenmesh::elemindex(tetrahedron* ptr) { + int *iptr = (int *) &(ptr[10]); + return iptr[0]; +} + +inline void tetgenmesh::setelemindex(tetrahedron* ptr, int value) { + int *iptr = (int *) &(ptr[10]); + iptr[0] = value; +} + +// Get or set a tetrahedron's marker. +// Set 'value = 0' cleans all the face/edge flags. + +inline int tetgenmesh::elemmarker(tetrahedron* ptr) { + return ((int *) (ptr))[elemmarkerindex]; +} + +inline void tetgenmesh::setelemmarker(tetrahedron* ptr, int value) { + ((int *) (ptr))[elemmarkerindex] = value; +} + +// infect(), infected(), uninfect() -- primitives to flag or unflag a +// tetrahedron. The last bit of the element marker is flagged (1) +// or unflagged (0). + +inline void tetgenmesh::infect(triface& t) { + ((int *) (t.tet))[elemmarkerindex] |= 1; +} + +inline void tetgenmesh::uninfect(triface& t) { + ((int *) (t.tet))[elemmarkerindex] &= ~1; +} + +inline bool tetgenmesh::infected(triface& t) { + return (((int *) (t.tet))[elemmarkerindex] & 1) != 0; +} + +// marktest(), marktested(), unmarktest() -- primitives to flag or unflag a +// tetrahedron. Use the second lowerest bit of the element marker. + +inline void tetgenmesh::marktest(triface& t) { + ((int *) (t.tet))[elemmarkerindex] |= 2; +} + +inline void tetgenmesh::unmarktest(triface& t) { + ((int *) (t.tet))[elemmarkerindex] &= ~2; +} + +inline bool tetgenmesh::marktested(triface& t) { + return (((int *) (t.tet))[elemmarkerindex] & 2) != 0; +} + +// markface(), unmarkface(), facemarked() -- primitives to flag or unflag a +// face of a tetrahedron. From the last 3rd to 6th bits are used for +// face markers, e.g., the last third bit corresponds to loc = 0. + +inline void tetgenmesh::markface(triface& t) { + ((int *) (t.tet))[elemmarkerindex] |= (4 << (t.ver & 3)); +} + +inline void tetgenmesh::unmarkface(triface& t) { + ((int *) (t.tet))[elemmarkerindex] &= ~(4 << (t.ver & 3)); +} + +inline bool tetgenmesh::facemarked(triface& t) { + return (((int *) (t.tet))[elemmarkerindex] & (4 << (t.ver & 3))) != 0; +} + +// markedge(), unmarkedge(), edgemarked() -- primitives to flag or unflag an +// edge of a tetrahedron. From the last 7th to 12th bits are used for +// edge markers, e.g., the last 7th bit corresponds to the 0th edge, etc. +// Remark: The last 7th bit is marked by 2^6 = 64. + +inline void tetgenmesh::markedge(triface& t) { + ((int *) (t.tet))[elemmarkerindex] |= (int) (64 << ver2edge[(t).ver]); +} + +inline void tetgenmesh::unmarkedge(triface& t) { + ((int *) (t.tet))[elemmarkerindex] &= ~(int) (64 << ver2edge[(t).ver]); +} + +inline bool tetgenmesh::edgemarked(triface& t) { + return (((int *) (t.tet))[elemmarkerindex] & + (int) (64 << ver2edge[(t).ver])) != 0; +} + +// marktest2(), unmarktest2(), marktest2ed() -- primitives to flag and unflag +// a tetrahedron. The 13th bit (2^12 = 4096) is used for this flag. + +inline void tetgenmesh::marktest2(triface& t) { + ((int *) (t.tet))[elemmarkerindex] |= (int) (4096); +} + +inline void tetgenmesh::unmarktest2(triface& t) { + ((int *) (t.tet))[elemmarkerindex] &= ~(int) (4096); +} + +inline bool tetgenmesh::marktest2ed(triface& t) { + return (((int *) (t.tet))[elemmarkerindex] & (int) (4096)) != 0; +} + +// elemcounter(), setelemcounter() -- primitives to read or ser a (small) +// integer counter in this tet. It is saved from the 16th bit. On 32 bit +// system, the range of the counter is [0, 2^15 = 32768]. + +inline int tetgenmesh::elemcounter(triface& t) { + return (((int *) (t.tet))[elemmarkerindex]) >> 16; +} + +inline void tetgenmesh::setelemcounter(triface& t, int value) { + int c = ((int *) (t.tet))[elemmarkerindex]; + // Clear the old counter while keep the other flags. + c &= 65535; // sum_{i=0^15} 2^i + c |= (value << 16); + ((int *) (t.tet))[elemmarkerindex] = c; +} + +inline void tetgenmesh::increaseelemcounter(triface& t) { + int c = elemcounter(t); + setelemcounter(t, c + 1); +} + +inline void tetgenmesh::decreaseelemcounter(triface& t) { + int c = elemcounter(t); + setelemcounter(t, c - 1); +} + +// ishulltet() tests if t is a hull tetrahedron. + +inline bool tetgenmesh::ishulltet(triface& t) { + return (point) (t).tet[7] == dummypoint; +} + +// isdeadtet() tests if t is a tetrahedron is dead. + +inline bool tetgenmesh::isdeadtet(triface& t) { + return ((t.tet == NULL) || (t.tet[4] == NULL)); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// Primitives for subfaces and subsegments // +// // +/////////////////////////////////////////////////////////////////////////////// + +// Each subface contains three pointers to its neighboring subfaces, with +// edge versions. To save memory, both information are kept in a single +// pointer. To make this possible, all subfaces are aligned to eight-byte +// boundaries, so that the last three bits of each pointer are zeros. An +// edge version (in the range 0 to 5) is compressed into the last three +// bits of each pointer by 'sencode()'. 'sdecode()' decodes a pointer, +// extracting an edge version and a pointer to the beginning of a subface. + +inline void tetgenmesh::sdecode(shellface sptr, face& s) { + s.shver = (int) ((uintptr_t) (sptr) & (uintptr_t) 7); + s.sh = (shellface *) ((uintptr_t) (sptr) ^ (uintptr_t) (s.shver)); +} + +inline tetgenmesh::shellface tetgenmesh::sencode(face& s) { + return (shellface) ((uintptr_t) s.sh | (uintptr_t) s.shver); +} + +inline tetgenmesh::shellface tetgenmesh::sencode2(shellface *sh, int shver) { + return (shellface) ((uintptr_t) sh | (uintptr_t) shver); +} + +// sbond() bonds two subfaces (s1) and (s2) together. s1 and s2 must refer +// to the same edge. No requirement is needed on their orientations. + +inline void tetgenmesh::sbond(face& s1, face& s2) +{ + s1.sh[s1.shver >> 1] = sencode(s2); + s2.sh[s2.shver >> 1] = sencode(s1); +} + +// sbond1() bonds s1 <== s2, i.e., after bonding, s1 is pointing to s2, +// but s2 is not pointing to s1. s1 and s2 must refer to the same edge. +// No requirement is needed on their orientations. + +inline void tetgenmesh::sbond1(face& s1, face& s2) +{ + s1.sh[s1.shver >> 1] = sencode(s2); +} + +// Dissolve a subface bond (from one side). Note that the other subface +// will still think it's connected to this subface. + +inline void tetgenmesh::sdissolve(face& s) +{ + s.sh[s.shver >> 1] = NULL; +} + +// spivot() finds the adjacent subface (s2) for a given subface (s1). +// s1 and s2 share at the same edge. + +inline void tetgenmesh::spivot(face& s1, face& s2) +{ + shellface sptr = s1.sh[s1.shver >> 1]; + sdecode(sptr, s2); +} + +inline void tetgenmesh::spivotself(face& s) +{ + shellface sptr = s.sh[s.shver >> 1]; + sdecode(sptr, s); +} + +// These primitives determine or set the origin, destination, or apex +// of a subface with respect to the edge version. + +inline tetgenmesh::point tetgenmesh::sorg(face& s) +{ + return (point) s.sh[sorgpivot[s.shver]]; +} + +inline tetgenmesh::point tetgenmesh::sdest(face& s) +{ + return (point) s.sh[sdestpivot[s.shver]]; +} + +inline tetgenmesh::point tetgenmesh::sapex(face& s) +{ + return (point) s.sh[sapexpivot[s.shver]]; +} + +inline void tetgenmesh::setsorg(face& s, point pointptr) +{ + s.sh[sorgpivot[s.shver]] = (shellface) pointptr; +} + +inline void tetgenmesh::setsdest(face& s, point pointptr) +{ + s.sh[sdestpivot[s.shver]] = (shellface) pointptr; +} + +inline void tetgenmesh::setsapex(face& s, point pointptr) +{ + s.sh[sapexpivot[s.shver]] = (shellface) pointptr; +} + +#define setshvertices(s, pa, pb, pc)\ + setsorg(s, pa);\ + setsdest(s, pb);\ + setsapex(s, pc) + +// sesym() reserves the direction of the lead edge. + +inline void tetgenmesh::sesym(face& s1, face& s2) +{ + s2.sh = s1.sh; + s2.shver = (s1.shver ^ 1); // Inverse the last bit. +} + +inline void tetgenmesh::sesymself(face& s) +{ + s.shver ^= 1; +} + +// senext() finds the next edge (counterclockwise) in the same orientation +// of this face. + +inline void tetgenmesh::senext(face& s1, face& s2) +{ + s2.sh = s1.sh; + s2.shver = snextpivot[s1.shver]; +} + +inline void tetgenmesh::senextself(face& s) +{ + s.shver = snextpivot[s.shver]; +} + +inline void tetgenmesh::senext2(face& s1, face& s2) +{ + s2.sh = s1.sh; + s2.shver = snextpivot[snextpivot[s1.shver]]; +} + +inline void tetgenmesh::senext2self(face& s) +{ + s.shver = snextpivot[snextpivot[s.shver]]; +} + + +// Check or set a subface's maximum area bound. + +inline REAL tetgenmesh::areabound(face& s) +{ + return ((REAL *) (s.sh))[areaboundindex]; +} + +inline void tetgenmesh::setareabound(face& s, REAL value) +{ + ((REAL *) (s.sh))[areaboundindex] = value; +} + +// These two primitives read or set a shell marker. Shell markers are used +// to hold user boundary information. + +inline int tetgenmesh::shellmark(face& s) +{ + return ((int *) (s.sh))[shmarkindex]; +} + +inline void tetgenmesh::setshellmark(face& s, int value) +{ + ((int *) (s.sh))[shmarkindex] = value; +} + + + +// sinfect(), sinfected(), suninfect() -- primitives to flag or unflag a +// subface. The last bit of ((int *) ((s).sh))[shmarkindex+1] is flagged. + +inline void tetgenmesh::sinfect(face& s) +{ + ((int *) ((s).sh))[shmarkindex+1] = + (((int *) ((s).sh))[shmarkindex+1] | (int) 1); +} + +inline void tetgenmesh::suninfect(face& s) +{ + ((int *) ((s).sh))[shmarkindex+1] = + (((int *) ((s).sh))[shmarkindex+1] & ~(int) 1); +} + +// Test a subface for viral infection. + +inline bool tetgenmesh::sinfected(face& s) +{ + return (((int *) ((s).sh))[shmarkindex+1] & (int) 1) != 0; +} + +// smarktest(), smarktested(), sunmarktest() -- primitives to flag or unflag +// a subface. The last 2nd bit of the integer is flagged. + +inline void tetgenmesh::smarktest(face& s) +{ + ((int *) ((s).sh))[shmarkindex+1] = + (((int *)((s).sh))[shmarkindex+1] | (int) 2); +} + +inline void tetgenmesh::sunmarktest(face& s) +{ + ((int *) ((s).sh))[shmarkindex+1] = + (((int *)((s).sh))[shmarkindex+1] & ~(int)2); +} + +inline bool tetgenmesh::smarktested(face& s) +{ + return ((((int *) ((s).sh))[shmarkindex+1] & (int) 2) != 0); +} + +// smarktest2(), smarktest2ed(), sunmarktest2() -- primitives to flag or +// unflag a subface. The last 3rd bit of the integer is flagged. + +inline void tetgenmesh::smarktest2(face& s) +{ + ((int *) ((s).sh))[shmarkindex+1] = + (((int *)((s).sh))[shmarkindex+1] | (int) 4); +} + +inline void tetgenmesh::sunmarktest2(face& s) +{ + ((int *) ((s).sh))[shmarkindex+1] = + (((int *)((s).sh))[shmarkindex+1] & ~(int)4); +} + +inline bool tetgenmesh::smarktest2ed(face& s) +{ + return ((((int *) ((s).sh))[shmarkindex+1] & (int) 4) != 0); +} + +// The last 4th bit of ((int *) ((s).sh))[shmarkindex+1] is flagged. + +inline void tetgenmesh::smarktest3(face& s) +{ + ((int *) ((s).sh))[shmarkindex+1] = + (((int *)((s).sh))[shmarkindex+1] | (int) 8); +} + +inline void tetgenmesh::sunmarktest3(face& s) +{ + ((int *) ((s).sh))[shmarkindex+1] = + (((int *)((s).sh))[shmarkindex+1] & ~(int)8); +} + +inline bool tetgenmesh::smarktest3ed(face& s) +{ + return ((((int *) ((s).sh))[shmarkindex+1] & (int) 8) != 0); +} + + +// Each facet has a unique index (automatically indexed). Starting from '0'. +// We save this index in the same field of the shell type. + +inline void tetgenmesh::setfacetindex(face& s, int value) +{ + ((int *) (s.sh))[shmarkindex + 2] = value; +} + +inline int tetgenmesh::getfacetindex(face& s) +{ + return ((int *) (s.sh))[shmarkindex + 2]; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// Primitives for interacting between tetrahedra and subfaces // +// // +/////////////////////////////////////////////////////////////////////////////// + +// tsbond() bond a tetrahedron (t) and a subface (s) together. +// Note that t and s must be the same face and the same edge. Moreover, +// t and s have the same orientation. +// Since the edge number in t and in s can be any number in {0,1,2}. We bond +// the edge in s which corresponds to t's 0th edge, and vice versa. + +inline void tetgenmesh::tsbond(triface& t, face& s) +{ + if ((t).tet[9] == NULL) { + // Allocate space for this tet. + (t).tet[9] = (tetrahedron) tet2subpool->alloc(); + // Initialize. + for (int i = 0; i < 4; i++) { + ((shellface *) (t).tet[9])[i] = NULL; + } + } + // Bond t <== s. + ((shellface *) (t).tet[9])[(t).ver & 3] = + sencode2((s).sh, tsbondtbl[t.ver][s.shver]); + // Bond s <== t. + s.sh[9 + ((s).shver & 1)] = + (shellface) encode2((t).tet, stbondtbl[t.ver][s.shver]); +} + +// tspivot() finds a subface (s) abutting on the given tetrahdera (t). +// Return s.sh = NULL if there is no subface at t. Otherwise, return +// the subface s, and s and t must be at the same edge wth the same +// orientation. + +inline void tetgenmesh::tspivot(triface& t, face& s) +{ + if ((t).tet[9] == NULL) { + (s).sh = NULL; + return; + } + // Get the attached subface s. + sdecode(((shellface *) (t).tet[9])[(t).ver & 3], (s)); + (s).shver = tspivottbl[t.ver][s.shver]; +} + +// Quickly check if the handle (t, v) is a subface. +#define issubface(t) \ + ((t).tet[9] && ((t).tet[9])[(t).ver & 3]) + +// stpivot() finds a tetrahedron (t) abutting a given subface (s). +// Return the t (if it exists) with the same edge and the same +// orientation of s. + +inline void tetgenmesh::stpivot(face& s, triface& t) +{ + decode((tetrahedron) s.sh[9 + (s.shver & 1)], t); + if ((t).tet == NULL) { + return; + } + (t).ver = stpivottbl[t.ver][s.shver]; +} + +// Quickly check if this subface is attached to a tetrahedron. + +#define isshtet(s) \ + ((s).sh[9 + ((s).shver & 1)]) + +// tsdissolve() dissolve a bond (from the tetrahedron side). + +inline void tetgenmesh::tsdissolve(triface& t) +{ + if ((t).tet[9] != NULL) { + ((shellface *) (t).tet[9])[(t).ver & 3] = NULL; + } +} + +// stdissolve() dissolve a bond (from the subface side). + +inline void tetgenmesh::stdissolve(face& s) +{ + (s).sh[9] = NULL; + (s).sh[10] = NULL; +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// Primitives for interacting between subfaces and segments // +// // +/////////////////////////////////////////////////////////////////////////////// + +// ssbond() bond a subface to a subsegment. + +inline void tetgenmesh::ssbond(face& s, face& edge) +{ + s.sh[6 + (s.shver >> 1)] = sencode(edge); + edge.sh[0] = sencode(s); +} + +inline void tetgenmesh::ssbond1(face& s, face& edge) +{ + s.sh[6 + (s.shver >> 1)] = sencode(edge); + //edge.sh[0] = sencode(s); +} + +// ssdisolve() dissolve a bond (from the subface side) + +inline void tetgenmesh::ssdissolve(face& s) +{ + s.sh[6 + (s.shver >> 1)] = NULL; +} + +// sspivot() finds a subsegment abutting a subface. + +inline void tetgenmesh::sspivot(face& s, face& edge) +{ + sdecode((shellface) s.sh[6 + (s.shver >> 1)], edge); +} + +// Quickly check if the edge is a subsegment. + +#define isshsubseg(s) \ + ((s).sh[6 + ((s).shver >> 1)]) + +/////////////////////////////////////////////////////////////////////////////// +// // +// Primitives for interacting between tetrahedra and segments // +// // +/////////////////////////////////////////////////////////////////////////////// + +inline void tetgenmesh::tssbond1(triface& t, face& s) +{ + if ((t).tet[8] == NULL) { + // Allocate space for this tet. + (t).tet[8] = (tetrahedron) tet2segpool->alloc(); + // Initialization. + for (int i = 0; i < 6; i++) { + ((shellface *) (t).tet[8])[i] = NULL; + } + } + ((shellface *) (t).tet[8])[ver2edge[(t).ver]] = sencode((s)); +} + +inline void tetgenmesh::sstbond1(face& s, triface& t) +{ + ((tetrahedron *) (s).sh)[9] = encode(t); +} + +inline void tetgenmesh::tssdissolve1(triface& t) +{ + if ((t).tet[8] != NULL) { + ((shellface *) (t).tet[8])[ver2edge[(t).ver]] = NULL; + } +} + +inline void tetgenmesh::sstdissolve1(face& s) +{ + ((tetrahedron *) (s).sh)[9] = NULL; +} + +inline void tetgenmesh::tsspivot1(triface& t, face& s) +{ + if ((t).tet[8] != NULL) { + sdecode(((shellface *) (t).tet[8])[ver2edge[(t).ver]], s); + } else { + (s).sh = NULL; + } +} + +// Quickly check whether 't' is a segment or not. + +#define issubseg(t) \ + ((t).tet[8] && ((t).tet[8])[ver2edge[(t).ver]]) + +inline void tetgenmesh::sstpivot1(face& s, triface& t) +{ + decode((tetrahedron) s.sh[9], t); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// Primitives for points // +// // +/////////////////////////////////////////////////////////////////////////////// + +inline int tetgenmesh::pointmark(point pt) { + return ((int *) (pt))[pointmarkindex]; +} + +inline void tetgenmesh::setpointmark(point pt, int value) { + ((int *) (pt))[pointmarkindex] = value; +} + + +// These two primitives set and read the type of the point. + +inline enum tetgenmesh::verttype tetgenmesh::pointtype(point pt) { + return (enum verttype) (((int *) (pt))[pointmarkindex + 1] >> (int) 8); +} + +inline void tetgenmesh::setpointtype(point pt, enum verttype value) { + ((int *) (pt))[pointmarkindex + 1] = + ((int) value << 8) + (((int *) (pt))[pointmarkindex + 1] & (int) 255); +} + +// Read and set the geometry tag of the point (used by -s option). + +inline int tetgenmesh::pointgeomtag(point pt) { + return ((int *) (pt))[pointmarkindex + 2]; +} + +inline void tetgenmesh::setpointgeomtag(point pt, int value) { + ((int *) (pt))[pointmarkindex + 2] = value; +} + +// Read and set the u,v coordinates of the point (used by -s option). + +inline REAL tetgenmesh::pointgeomuv(point pt, int i) { + return pt[pointparamindex + i]; +} + +inline void tetgenmesh::setpointgeomuv(point pt, int i, REAL value) { + pt[pointparamindex + i] = value; +} + +// pinfect(), puninfect(), pinfected() -- primitives to flag or unflag +// a point. The last bit of the integer '[pointindex+1]' is flagged. + +inline void tetgenmesh::pinfect(point pt) { + ((int *) (pt))[pointmarkindex + 1] |= (int) 1; +} + +inline void tetgenmesh::puninfect(point pt) { + ((int *) (pt))[pointmarkindex + 1] &= ~(int) 1; +} + +inline bool tetgenmesh::pinfected(point pt) { + return (((int *) (pt))[pointmarkindex + 1] & (int) 1) != 0; +} + +// pmarktest(), punmarktest(), pmarktested() -- more primitives to +// flag or unflag a point. + +inline void tetgenmesh::pmarktest(point pt) { + ((int *) (pt))[pointmarkindex + 1] |= (int) 2; +} + +inline void tetgenmesh::punmarktest(point pt) { + ((int *) (pt))[pointmarkindex + 1] &= ~(int) 2; +} + +inline bool tetgenmesh::pmarktested(point pt) { + return (((int *) (pt))[pointmarkindex + 1] & (int) 2) != 0; +} + +inline void tetgenmesh::pmarktest2(point pt) { + ((int *) (pt))[pointmarkindex + 1] |= (int) 4; +} + +inline void tetgenmesh::punmarktest2(point pt) { + ((int *) (pt))[pointmarkindex + 1] &= ~(int) 4; +} + +inline bool tetgenmesh::pmarktest2ed(point pt) { + return (((int *) (pt))[pointmarkindex + 1] & (int) 4) != 0; +} + +inline void tetgenmesh::pmarktest3(point pt) { + ((int *) (pt))[pointmarkindex + 1] |= (int) 8; +} + +inline void tetgenmesh::punmarktest3(point pt) { + ((int *) (pt))[pointmarkindex + 1] &= ~(int) 8; +} + +inline bool tetgenmesh::pmarktest3ed(point pt) { + return (((int *) (pt))[pointmarkindex + 1] & (int) 8) != 0; +} + +// These following primitives set and read a pointer to a tetrahedron +// a subface/subsegment, a point, or a tet of background mesh. + +inline tetgenmesh::tetrahedron tetgenmesh::point2tet(point pt) { + return ((tetrahedron *) (pt))[point2simindex]; +} + +inline void tetgenmesh::setpoint2tet(point pt, tetrahedron value) { + ((tetrahedron *) (pt))[point2simindex] = value; +} + +inline tetgenmesh::point tetgenmesh::point2ppt(point pt) { + return (point) ((tetrahedron *) (pt))[point2simindex + 1]; +} + +inline void tetgenmesh::setpoint2ppt(point pt, point value) { + ((tetrahedron *) (pt))[point2simindex + 1] = (tetrahedron) value; +} + +inline tetgenmesh::shellface tetgenmesh::point2sh(point pt) { + return (shellface) ((tetrahedron *) (pt))[point2simindex + 2]; +} + +inline void tetgenmesh::setpoint2sh(point pt, shellface value) { + ((tetrahedron *) (pt))[point2simindex + 2] = (tetrahedron) value; +} + + +inline tetgenmesh::tetrahedron tetgenmesh::point2bgmtet(point pt) { + return ((tetrahedron *) (pt))[point2simindex + 3]; +} + +inline void tetgenmesh::setpoint2bgmtet(point pt, tetrahedron value) { + ((tetrahedron *) (pt))[point2simindex + 3] = value; +} + + +// The primitives for saving and getting the insertion radius. +inline void tetgenmesh::setpointinsradius(point pt, REAL value) +{ + pt[pointinsradiusindex] = value; +} + +inline REAL tetgenmesh::getpointinsradius(point pt) +{ + return pt[pointinsradiusindex]; +} + +inline bool tetgenmesh::issteinerpoint(point pt) { + return (pointtype(pt) == FREESEGVERTEX) || (pointtype(pt) == FREEFACETVERTEX) + || (pointtype(pt) == FREEVOLVERTEX); +} + +// point2tetorg() Get the tetrahedron whose origin is the point. + +inline void tetgenmesh::point2tetorg(point pa, triface& searchtet) +{ + decode(point2tet(pa), searchtet); + if ((point) searchtet.tet[4] == pa) { + searchtet.ver = 11; + } else if ((point) searchtet.tet[5] == pa) { + searchtet.ver = 3; + } else if ((point) searchtet.tet[6] == pa) { + searchtet.ver = 7; + } else { + searchtet.ver = 0; + } +} + +// point2shorg() Get the subface/segment whose origin is the point. + +inline void tetgenmesh::point2shorg(point pa, face& searchsh) +{ + sdecode(point2sh(pa), searchsh); + if ((point) searchsh.sh[3] == pa) { + searchsh.shver = 0; + } else if ((point) searchsh.sh[4] == pa) { + searchsh.shver = (searchsh.sh[5] != NULL ? 2 : 1); + } else { + searchsh.shver = 4; + } +} + +// farsorg() Return the origin of the subsegment. +// farsdest() Return the destination of the subsegment. + +inline tetgenmesh::point tetgenmesh::farsorg(face& s) +{ + face travesh, neighsh; + + travesh = s; + while (1) { + senext2(travesh, neighsh); + spivotself(neighsh); + if (neighsh.sh == NULL) break; + if (sorg(neighsh) != sorg(travesh)) sesymself(neighsh); + senext2(neighsh, travesh); + } + return sorg(travesh); +} + +inline tetgenmesh::point tetgenmesh::farsdest(face& s) +{ + face travesh, neighsh; + + travesh = s; + while (1) { + senext(travesh, neighsh); + spivotself(neighsh); + if (neighsh.sh == NULL) break; + if (sdest(neighsh) != sdest(travesh)) sesymself(neighsh); + senext(neighsh, travesh); + } + return sdest(travesh); +} + +/////////////////////////////////////////////////////////////////////////////// +// // +// Linear algebra operators. // +// // +/////////////////////////////////////////////////////////////////////////////// + +// dot() returns the dot product: v1 dot v2. +inline REAL tetgenmesh::dot(REAL* v1, REAL* v2) +{ + return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]; +} + +// cross() computes the cross product: n = v1 cross v2. +inline void tetgenmesh::cross(REAL* v1, REAL* v2, REAL* n) +{ + n[0] = v1[1] * v2[2] - v2[1] * v1[2]; + n[1] = -(v1[0] * v2[2] - v2[0] * v1[2]); + n[2] = v1[0] * v2[1] - v2[0] * v1[1]; +} + +// distance() computes the Euclidean distance between two points. +inline REAL tetgenmesh::distance(REAL* p1, REAL* p2) +{ + return sqrt((p2[0] - p1[0]) * (p2[0] - p1[0]) + + (p2[1] - p1[1]) * (p2[1] - p1[1]) + + (p2[2] - p1[2]) * (p2[2] - p1[2])); +} + +inline REAL tetgenmesh::norm2(REAL x, REAL y, REAL z) +{ + return (x) * (x) + (y) * (y) + (z) * (z); +} + + + +#endif // #ifndef tetgenH + diff --git a/tetgen_manual.pdf b/tetgen_manual.pdf new file mode 100644 index 0000000000000000000000000000000000000000..016ca0f60865062180701b70afc739413c1df761 GIT binary patch literal 3952041 zcmeGFWmFvN)&&ZqL4!-M;7)+X-90!23GVK$!QI{6HMqM=Z~`Q_Td)vZE(EgoKJtxo z&i?V;`;L)H=&sS#H6Q7&TI-o>uGPfS0zz*9)b!BA-5Vzxd->lp#=3i<8S!ZGEVPZG zIXLiW#P!S#Yz^_49$u2gqY*MPwbiqJcsA9t)f3RuvC!4SC zj?9bDGOCDDSK&k1B7Qz>Ne~d=fszve3>Uz^`l^pioC$*R!+`Jo$~y}yr0jlw>gh9M zC&tz+{>Ch3PzluHMQ2QXT}<;Ph3HP2pSMAFzghwNZGSrm|PmN88k|uhJK`%O4Qr zQe+WcW&0XzHcpv`kqkSDJ%-ftjaaI*#hl!mT=LqA&1JjPHL<~}Roh0b5`xO*Tw^%C zoJA35WComRgYjTv4AFK0pYxSW=U!=YG4~gwu-^ObLZ@ z^ZkCfr6Zd+7IN+?(*#^pHN&+$OJN8AH3qkM0_OZ=wxWZ08G=4Rzh<{2dy^%;REo+M zc7?TOzCwu%d{b0dUjb|+dnyMmWAwHr&@yfPM_rQz8|6-_Ss^*We^g zigxVS!6)9dRbZ_(*pPMC?#H^w_8a8D5QYhK>07K;%23rxAFR@oY^uaqZ-s(ow4z4i1b#(} zAU$*l#X3ZbrkO~PC2J{@u4_lEpzN9R1r`=ZXkq63BW13L^V3D7xv@xWGAhqjF{;vSo~fhq=a-T z+9kYmhCvP4opov-$d_HI>>OZ-g#K}NT)&*XvG?QTLf@ILjY}iU6}kwHo4IWR+_RQ| zXU9xR$VGt*S5JsVrIcFZ+kVN6iTWqS;LCpWnczMkl}V;JGmCyQ+v!c@w>BWWkc@sX zvy1lLSvBzE>RX2CU)-&5B}N&xz|^)lq-ynIkeD>N^F^cq~udkawcPWBs*Dj|X_{%tP@XPrR2dV_y@qkL$zuT{40s#gE1pxyE2Y+k^*zMss5Evpj z5l5r=~y8%+7sTSzTM-*xcIQ**!k_e){9={NnQJ zaa<4c`82GD$ET6~)3^{H#svZf1_}o8I4)oihsS{X|N4C99xdBHx&}Y(*`xUbFtRfLVfY?x=`TC{?1~=D+FLTCE)fIeSI+D3jvU+n-cOD92OB(%C8zTP z(4l2QWt9-Db(fo-qtY=~>k6<)2q=hs|FD4PMWQTxdswNOG8)Ume=(Wg; zCIM}nlTA)uq=*C2q9kezZ;@o02GR+lU>pRVfB-?pbh9>F!v$Zm8m0j`<{7L9fdz_c z=ONA{7;S9#>t7vL$z5s#C}X-LRstNwM^CF^!)Vbx$}Qpqfr*vP5)C82m12MUru=!+ z@Um@g>9xDuEoZ;;^}Az|{n0eukTm5b)BO^f7BrwUqW8%-Rjsk_fU3=2@NBGD2x?tu zpAXY3A6_w$LSVS3nxGikX#lzTvP##BLiAg30`U`q5}9*5gShRfAON8ITbm6_Bg<{V z>74Jju5e*ggUnaNc?sk;&tSuKt%v&5Gyy$5J>2-vFn#EfbftCZG$oClm>pi3sKd&?k3TO|1U<5)G&*d0N!7B>yqD+2i z&Qn5L%tlBx@2d=mF+7GBx4>>bhzTH*S}$jTYCYyYvSULEcMdHJIHIONptpZr5vxbz zf~)I9U%@&8qVm<~jE3athXfrLQi8-f7T}9eA_7LlH;E+30Vxzrih#?(Y6umHv|0y! z;h(9M@CvOLW6fVVWJOy+>$A2P?R0`pf`T~uCX+q_z2~J@uJ&|Ao)T#Zw>=aSVshx4 zZUxP7O_h)F6`-?P`|Q|oeeD>l*p}|~uT<&G8Oy-x;AcXbJodU?u8WJn5xOi9d1AGvyr?mO8VM&!3x4zfo360+D`g&asWPH;JPl&_ zC~oN(G7=OiF>FD;IZ0Nr1|BCKC;nX7mj&iiN<|5csqdv)1l+{jXoREbJm5DYR1E$>}R9n3NT(9iW}0 z9jNWS%Ge`A+#KZ@Rfi;1$g}ftf;bl+lW#KDX`;SbqMGfC-WOUNVdk9c$>^P)Q{3&A zQz$)RJ(Ufz4eSlfjjBP}7oD`47xc0ixgpUZO(Egm88#b6*G9iGl^dzwHmaG~|M59qIbC}5` zlU|yh(0Y2lkC`?hax z>`7`L7top{n?}#z&Iqnat^p97{*L}FaObnO_GC>yZqtZ++bi`W$02JFq%NctlcM=c zsmdedBQHm?VPMgZ(5K$KvL3fusmHdCq}HVl(QvfPoO<^)cJ2M%)v&}&=$3uAS@*&$ z=iF`mH6{F8_(+t#Yn~Sx~OyQL*v7IE;g<}u23%IR{PdsH<}Br zTaa7(tA+0~M_X4j*HU0CU?ou7&^cg2Uir@s8=?xsHqrANcNrT-#NNFI)J^=78Ky`ZW0OapXe734n=#5<{&g6+#@(G zEFtJ37%%uXUWrP%YF#MgeF$D2CmJpmstb|5b>aEM!dw5f{Z;6-18REJxT^gx)-@Z2 zL!)I88Xd}36tA&xah4G71CcumH^j?MH5wc?z-FSG{I8?7dMUR;kJT>pZX&_reJXv% z1>(Ea0(C^oL{UZ8K%{tUmhCDvPCVBOV|Hn3qKk8R9{q2@)2tVeWX;Q=Ok^R z>0-#HA`nm%}koW(O9DNbgitlyLnb|?NrB!noL*jpK<%D8gTKv*w*P-Yl$^K?CF z-FygV;QPR}JEK0MgPlRE{hi-U2jhVWT&eHpGS#mQk`8JejVnJ|_rlHa%tYpnhJ=Pf z^{|%AgBGV`GGsosY8qA@Zuasu@X4&Syctn}Gwm@&HT|}rUsY=SHJ(6y{D=0?YS5|_ z@qEhIE zDps2CM&Y{Q)pP}wEn?-y!qfS?IlG>i;YphYUz*{5ch3z%b=Izyv+ zE7q*~EN+*7@Vg)v??}^UH(Y?R;IkgD_Fdo}ronQ|IR&{D?U3H4pVf}N4|<>ZdH!=? zZ4Q%>i@3|uj>lvw&IryM?&N#d(~z^oq^d!Kx1*6Gs42;;=??BEe7(NM!GY-hY>KvA zjn(TDsbwF_7Kc3J%hit?tP8)kT;IHlFE%J+RbzKcb!++NcN_ZobyHfL#=g7JPR*fN z%Z_E$ZQNRESSz^O)|J{d&Ei?3+eX-ZDi&z)i>m|bR+oGAdCncT#oKX+LU?uVVP}?G z!&{yGwJcI-DT=fr?$X=oiy8gGmec)=8O_nE0E2M9dVZSw*voRMF7VO9QA(j|plOp;f$k%d@x4TDvBiQ`)~nBFW?Q=3 z>yr*fhk5xyi^Z+nXP&p2*E*+tkvscR7gDk5q1+CxP&X%zBxd@XOXoh{um9Cw{pp52 zx~6nYfIrBrpIpl0iw|6pC_g`+mW`e+9^i=(`h(4(qx&~b?GqvNAL(UEc}RIOc}r*+ z+A(@sT6suO1zLuwDh5VISy~{zS6^qx1V%gi#XBaHM!Wk}@re|9xpO9zfD5=JcnRs{ z&B*e$jC(w7-0Cx<}sXmk<8mFm!a!)Y=~u-OmC4g`4?NpX*k35W))dd|{%5N{im>YtnyG4mLNj& zsN$&=6Ua+?PAMx;Sf4--NN;m62rV6_4k0S0{8(un~}TGO#S=)iPTcB7Lv$6Y6*W5V6IFmn*RkQS zEIb)`F8T%<@Zo(qrIJ-P!>Q)Wd%__{;8jkdw$+Rm4!^YK!&I?f*4D;S?i?+SP zjka$cy$bRhxAkMg<{oQs;YDc2WoA53HJW&oi7tY(q%je-?{IHcp$biC5+LP^=u1k@f!kHa#+$ zw_Fy7%8!x|wAS(Jc?;H0gvV*xZHYX*r`85S8T<+!#L)61bwP}i1CHYL*@Y%PW>d(;|s zGT?kaq&$?F(71$k#c^fxWmzyb3f!q6(obRL)l@WN-8%SsH}DSR%-IUcEfEfOP9Zx~ znKUWA#Wvw$j*)y`f{@qJ9JyT@z0i0(eF8t;6x4r<2^2i3yy-vvWRu~sxu`QT(Tpd* znx2icLZh1#Qo*z;1Y7RpQ1(Sag;A#tT3iipyD&37V@4Woc!_lvC zaC?zR*%=A7hs|Q!$;29%%#bh}uW_4_YxwADnEI?mtYvO7gbhwupj9)Vs4{U%_CiDtqkL!)Q}y%sZd|T2nz9L$0Euy!3!k-f$gH< zS2M;7MrLY;y_S{wsYU;R?F6M=mt{NrpbOhfQX`zY!j8G2T*PInYZVv&V9h#6!h)Va zq7{@+?NtRuM8j%Z5ck^~j3`?Xb}`wS9eY(LBT80y16pDxJ`V z@DFH5)(%kX0i-)va{Syc-*KLi2Byo0XCX~X8P~>g$R|j&;cUkq(v~PkuE)ChuojC% z2^D`S%qDkiU%{g*X{K4SYF9(R-J(<8Y3UQ$VA8}VTT$ksBujaVKod2#lQ4wIR2XYJ zV=gHJ!k{*+Ohbb%)=AN!=PHp**A+vux}aQ4qLZWW;%gFKCyhRJGn0iBsH4@nyV9{{ z>dRQLTp-?UzP6k)6>8Oj5w&(TU>cqh!M*pROk!j-!*$sP$!s9AO84MRpD5RH&b{F$ z)=*MH@`;XTGYzN)Y2M^|QPD|Kq$v&^OuoKEN~KzZXi46`4-or-+~BG%UoCwhM$xoE z_Nh@Xm_x0GX&-Wb+8v5>Sjh14Y{tvRq}3*Q(|8YFlD?rPq~l>aa))z zxl5CCYtg~3QC9M!wV%1{WZG&G=fu=CLZA(02f1^HviC+C5mOvJXf9>h#X`vw_M{F$ zM3Cx*buYm?>IkOX3++3Kgb(>8#|AMM$%? z-wecbs`bMbwj~z%BBW{F94Hq`Xn|IT}jklHH zNN*91q7HU7+*EDHzvokkDYRQubyyh2(44yZmW7RSQAEW_(>`ui%0J1h+>v<;q0|u* zrCcDvkdGB&E=8-lnLOmNT8I+F3A}NcqU0ronX~x=Z$@AR9aqhd>2|^F+xKuJC2emO zG{7KIPmRZc^XYO~vmyOdR2~dc$CwQhjC8|WvVCUe4}0HCTmup(dvEY*_CBI;Gk+Y@ zql%F|f#lI80|D`NtS1g?8gX8NSc9@e;2|SN@gpDT3(Zg!v2-lTYF=`dst7!X`au?Fl317QkwhBCoHrud zFaF3sgerc*{*&Lq@Q0-MQ7ir1@A&O^{PsIwVSnp>e}^g_?C0-L#s9fb#ZPGuQn^Gs+9-zh)prXpuTMJ#``UAL7yuaF!n4XP4x?uauiM0yu1E@~BZ zzkk1TO>4zhp%mp3(1H*I2ADrzbOSvKY%xfmoiT|!A`(SW(V&;HB$w|+x^eg>dqg3n z90^HX8C6=hFSWM>hHQEpdE37F{ni{cH>yYKlX=esN@ySIHH6ANs*YyA#pi5t+7#Id zajmcRL8|XmiS$sCyd?5iqJ5DP&f|AXwe`aoRw}7TYywc(i=$E~(eA+|I<&vMyyI9= ztIIP@!U!VdWOrt2iI_i$P68%y^u+30~ zoUsfuYDPKo9o42`0TJs|e^Hr~ZOQjxmNmuk`JA;8b$p_Bx3495`4_G3i_k?5*;iBZ!xAPYX6LVCU+X@BadAu^3Gz$a58?|#!x4I`Me%)L`hZ!f z7-|kLqO3&)lOtrpDw4n(%AC(D_8_^-L+DlaJxL*bH_odA6*J7bVy{L(P_})mZxyrz zhGpkuBgL)cx_6~H3N?z&3JfNTYm4_?(h;KvD8b$06RvDtkvOYJSH|*>T_tbRQzcx2 za6z|}Eb3iX-NJ=VXIQK#?@h214ho_Gr61h|IIFypAHhmd8a)|9>vrY5eAM6}8=Z{z znl|%FMP1*M(j@gY`Q>CvELbywr8u+KI~SCX6S74&#DC`1Pm9n^kij`vv%2a&Sblwu zA%*ycIW(s^9bQz`zqqQ zok!qD6eCPZ;B^VTIpk4eoNHQ2qQh20K2%la(gI`#LJlH-f@?dj_%Lsru3#yRIBqTZ z5<1~jJTB!Z6o$85hKht;8pWIqn_b-!^DAfKnetVRPEalfBmGH*?;8Tb6LKN8E?OFD zDR^mwG({+2rj~}?VCJ920|xnE+D_S--E_5vP3K^xZ1eM_0!qgU6#dD(#!?*1wR@2ns{XEsi zgzvhA&(!vng^P_+%vC=-b`r}ih*k1qB88I-Y7{s#MzBD(Ack5sQJ~d&^ad(TWUfTN z|690llQrHGzji5?-t*BPEeeABI7K3tp-`th{9tI2p?3NG9N&Z$9e#i|h`H))zfPq| zx;k!{zEO|!xB%FTcUbA^bU6iBdAyVr@ftpn`hi1W)T8E=E{ovm&5={QR71)w-y3Vag!bMKLa)|H)%fvk z#{ym|xs({yR$4E9W7WYG z%`YjM=}i7EUpdt4u#{xB%o|<5?TlPtvAm{h{B)pTLn*RXNgPHL?!yqqQjnpYs}=8! zKSnfg1!5JSe(I}UDlYw{l82T1KxvrBQn)#(^dJvB3U~@aoNO7o9}zWCb>oK$19I5d zZZ!n-QeH2WYSvb*d2CZ5F+=0|3Dw+^&h_iC8J10nww8tbJ1!Cp)#8 zA|@KO+Sf#8#x)Eh#PN~)VoWA^4vx$J#nQpAI#T47b}w=YpQp({$x-GApq6XE!&9dH zfY1e#WJsUT0p%K&(>cvm&|CK=Xw+Zk^NO!i77JVa59YU34y%Kiv*K>mG?#*NP1C?B zahAT>OI9b6g-wypC?6(kuN9h#)IUwxtckw#Pw3l14ZRO-kaW@&C>?JOuN3qN0*?&W zQ}pRrAvO~1_b{s`w$TkrEN-s19Kt4@^FC0o7Zie8J;jf-xR`~Ed{aN;qf(0v`}(XS z24JAAZ??q(lLLASMYDR;v(YSC@5V)?xa%6^rNu8+kA_17vM)% zgT%;n**SnCoa6aLdz`Z87n`Yp- zgX{y{REkVNg}`J7;Md$!OnaeQj;qgiouREE@um{n!#`SQF7kiZbKQ}1bKDbu)Z4#CL& z_SM>CZmjQzEmpIy(^vxgi;*&a%<^GJl~+I*P!MTzhoPr`uztVxma4>{pihocZ2*nG zP?=q#Y06l}Z(o}-Qh}ofyp%TxJ71NQcrQImy+Y63jX=su7`S6hlLx)DEIA)Od9$iD zi|Lg$wPp{vHW5!3aClGgRTwR}Bu%gqWym4(SW^Jf`4Q*NVrfLXY)BMWXgN0fl5I24>qW%~u^b7zoT>R?!i@ib{tF!6|guNV;K_3x+IptwW8aAMn8wLRj;Gz{_lx z(RdwwJ+~d%*f^GW74?Epdoqvnk>CZpD?M^O!ir-IATc0-;TQHHeCo|l?v^Tal4Jjs zZ~N(gKRW7kEG#U);%*H8t2mh9pT)sHUH$)saeGeSXLwHhf6@vwKM{F<5^z7;`9+=m z7X;j2GWh?H4L_#s<2|SC|3f_RXWNh9DtHV}%3+2lQk3DT8w^i$AmbBN$M_UoWPA!N zGCnP17@y{W@o5wfDftgUM`*?;6vihM#wQe}Clsb96s9K>rY97pClsb96sD)XF#SY< zW_m(ldO~4-LScSFVSYkkenMe>LScSFc_^Fk7yxB{>dPOh^`A5RYeJu6pv+I$5A*b! zi~KE{{wy>)rg<^tSV@)yLK5xZT%cyofY$h#5&AiOm zf+6yskA0K>P=Lo97;t;lV$Sf<8J#oB$ zFE0MXT~!?tt)e8GHy$A2FOzPSQ(Q+84{4Pi`HNdzVyS zGE^;3Q8}sj?NlzrKG6WfeR*JWQ@^#f*WsO}^Jtt&5`LYAYqvlUv|Q?kcE;>oGSR|F zz2jS~anR7N?};3MS}h^JWNndVa#$rst+yo5`YE?C?(|mm^J}uGMrkv^s?Z7NEYxk( z4vJ`r%rMsMlk+eb3k;kbALMjLfCQ2`sQF1?fmSgVvW1oN1=ad;3n%F0!WJlYE0f73 zM&N=F$QBO8)0+DOM>M{3eq20h42Yhdr|e91OPLLk+2kn^w@Y#Dc6cXGgj%mJZ0|<( zvZG$3fgb+tiIJ6dQ_=+TYPY?2R$cda;}iXd`b!~5d!nuDNCAkx0g2`30zsMOZ<6iKXD(;&VaeQRti&(uVtE6tpZ)h3#Wp!DqR=RfO_I73h? ztcT4^F0kIl7w-Hxlb9tbfePIvD0a;0&)q%n9fn2Qnpxuw20AaXq&Zrhz?-mva`e3( z`&Je6&yEhQCv*+2efkuGE;6Nw73rkk}Kv-NGqY!hFlH&Ncv8xAujpnOZQkh?#$oe|r4+OS+qQ*ka zy>PD=303SZj$#?;4mqwtMkp0Nx2``h;uUkQo|4qfZtXi@g!Y}Feta6$R-q@zI+ z3FG_Krneum1@Z-ru{W(w)#(y!S0d8(l+N z772VD9%UWB*7OTSo#)Q_jlC3-i=-deOB;(NDLQ1%AZuhZMO0BTF2=N zov%dhE%WMa{W4rv7hH3$28khlOPKtA3yJ*_6`tbOl6(wPh-%7&gUoM>r7`f+n37Vq z_Zpt#(y2dzzb7V>5_l-upfG{(xAu(wWAtj}?`oSwfOc|MQeR`=g&!MyzMM?gC}Y27rF&L8?L0d%DcY#lARuBN``qJOvTkpdV#{?Cz-+t-c zSFna2^;)D84?d8lUJT`BrNTaGE% zSTYh^y6e%iM4VcWGtJaO>1((fmzzTiWfV#qSL+&OXV!gi(VNfzpjVC{jE@-mF1jM_ z2)p7^AxpS8Zw#+Ng)*^Oq-I>lq*HYPQyg$1$%xS^^-?M2;tWTFUoUg3=eAijfo%9y zbg#^MTrScTncBijWk{8%qaeJD%nt?uC}?ch5ujzR(8%w3bMiTQHQ@UASV%DE-f~k& zttFTjRm-@r2$e0f*jLSc5d#IEm=4l@y|JZehGbmz1Kxw6aZ1qRjT?!oqHI^8m+{21PYZ|$L*NJ?h^2bL@^WRX)LP0Q7FE2u4o`c zi>Y=1pb#{iIF-~aW%X6g>L9a2K&<1i={5?48)GU5wGdU6lWm-5F%(TV6sFMCy2xx| znZD7Y383h{X|PV0=H$v-#>l zdQwrZ#sjGHQ9mtek_jkX^|W2e%-ehnFV)GqaxXObY_-?5I(*wJ4~3p}j(h)xC`Be& z-MeEXsB1*nDtU+Gg>))4u0#pqfwkdB6=l&yQ`!BJ&fx;LPPT9=X{!@Qo4VGtI)b|& zt7pbd0>r>SBzuw6#nn4lC*ViZ5IWyk>9=gW`qt+~x8A<8tp|=Vjc4G)g)_oz6c)P9 z!9$%8qn*iUG#VA)y!5H=-tPn94<*w9W5(K=7QTDl(+k)=O4IK<5iLldazAjcA~MKh zkg9~lhDx!zqPnW5U@!%WM#yK7Igt^s;&8hp+ZImz@7bWP;8$i;LO!fjhgQQo7*a*i zaDb?lALGNg%thGPEm{!_)f+(AmBvyWqWCimxr|kC$@!klvXmrnR3O`x${z#q)pgO@ zdv~SO?!}NO)JRHjQjcSZ1w&GNuCe_@PUgD&1;oGL`x5HmoZ|Haw{zbxmd0|uaP}wC zKCjQ}PTKXi(zAreo$sIpeAA&GfkD4r`+8#V3CUub^im##n5Qpl;Z zC;FY;gCj}lRc;sic7(j%x83YUl^v`c2RG3gvTs4^a}BMa1E9a$<$Xq4#D z0$+Bs_jYM!PD=5@>gihTUWms;uynyOQh%i8aO@AK)c1fgL6ZxSLPrpBdz4M?!W|8#e%YZhV@2T>{#oHz=ky9kmm8qYvh%6duh>5w3%{p za)Gd!6DX_W*96RfN~z1h(damz71k2_ew6OC1v*7mvAujfXmE;I6zlj_lw28X4a*heW&34W2+qG))d zELQdrj^LxcN$`)#GcE z2w-tb<37hT!5b#5@!Pi2$w1P=1Vi!K*W{9bb_3`{rMnVAe_hOPA+HtW(nV2gkO*A?QT9)_$Eh#&KUj%ul>?%x)a`*7(tE zKl_7DlM8acesdx$-6hzTcbvbmvfdYD+TEw)M)qEEcTLb))_?}Zdu0EGltCZ(@C%w7 zL1BcJ98>hp@t8M=D=J~!D*fyG;idM=KK`Pp#%{BTl{H*3SB`nJwq`k_>DW1Uk}ec; zinMe`lkaGoD5yOjA?3x$G7 zYi}%Py6!=Hdh~Xn4D*1o7;*Syx?-~-c624NJ87elymw6ni>BYF?Mzjk?60uODw6h* zYYAF5uZJ@Ux=XKwqH)L7aVFElT!kfw%&Wu{TTx{~L)R-WNb?xQ(m4FZzJWE9q4_n)A4rA-BKxmfW9G5-J%Ub{&2tAt)sYfq`R^{y9DJ1qe`;^ zrR7>t*+;Zx@{`)B&mOAGfAe9N;XCITYK;+x(5BkyV|mzPg58EsSn1H*Efck% z-IP*pe#v8!rj=-`G_0b9UA&DUJ3s>4Vk=unZPe{kfZ}(b4d$DTUqrRtra#7Fx1b|+ z@|u)}?Q7!bJ%q}a=JtOjsedla9#?Sm40MdYNNScx?(-LQ`QOMwS)QdPf5<|At^xlB zNzL*PBsJh?TJF!>lINPQKO6ehv%k+$vpy8M{kb6h2bTJ0k~7~`n0lTeVPH*Cs@{}VX!{2)T~b^tWPMcPbdJ|Cl~Sq@2h!`4@1ZQRnVB}*dq-PaYbIZe_2YKeB)jB&i$WXu zxA3WoLiSt}$l8f-+jSE!U#b`w4M45;@?ONEv*v!#$ER>h$}6-ELI5r zsPK)EC8UCSPHgOmT=~RQ8t1}DTG+mmWNn3i89q;T%FS^B+kwQ}q5-Ex%@g+(hng$V z)KW-FIV>Hvnnsiyzk(XB&*Rk+o~4)_d7#oNw@@(^oQ0H@@Ua48nI`h+Um6dsPzWuG zy<8!ZT_&fwG7UsTsCQ%YEH)4k`&&3F@xz%rW?Bh|uKk*0QYKKUGj}1>!x0k+>U7d4 z%AF`s7yu`5Wx5;8f)3g$Y_#|udVyjHi$SskU|4cWP{l~1N@lgJkzj;$#2R9x@7Hv4 z4&hCekswQUKRR5uo{bcid57LfDn;5jXysP-K)m;UGt9A7H^F1PgK&OC`j0Q2jpRQhAQ3%2jk4-v2zVL^8|dcN7N&G(}nWu=+9=OZlL=BQWf3JL+diG_sXM8>ced_QTV-6_Ewi!|nn?Io zEIzk0=dbW;r7Htsr0KT_wJ?kwtgu5}<=EcXumOlpQytx6j45$eTif!*w4mMx3$-^! zLK}No*Gg&xwwtZYMwO=XF~yh>Gs?ZyA{$ai!+(cbG5~eSsdp_~X5Td-DjkwdF6ss! z4@D8!@FFFkmP%eet}qnz)RllC>ZRGtO}X`Lr_bxLFXGEkVy8A_GMH;4^=!6UUdU5X zc#3kCdXlgoR4_+Ek7;0GUg2XmAeMj&bcV6XWRULV4k8m;2HeDz+2;dFm2C2TvOjuL zzVJ(R$ccqb9rp?Q9Mj%A7e2@Jg|YaG1`LBa4t9(saS!rdYJJWd$Ideuv!!>gf~oAQ z;rc+2M~n)?jnsyVa%CkTV++pMRjd%9oQ8VlK`}SXrTRLB-zmTaI)A9^^6U&*772FA zy^(m)k>=w8s*%_M_*Gyb$liXTa*uu@rQG5<1ecny2jfb=_r(_UGQV85u4KCu`pQ&o zDvz;r)OhYfbDO%wK&gBt)kGsR*D`z$?$_UJ#}+Xf#m^r5 zzU&mjz#rmB1IftttK`Lq!X{`iOq5n?HdPGts}6>8uPxGVZOQ-<2Ps-Bn@j0{3T95( zG_O)-;hiS20Xa0<5u&*p6_0SYIFfJY*--SHSIz15yb?wbUtU-Sa^-%b7n6=t234B--Ub~cam;l>i}TQD z5*@A0Ex_^L!O&ZhWs(EtiA6#qVBd`d*281#0NU(Zb$MT}W`xN?F9CAqh^!k#-k9mb zJByB#B$}dh+0rq=z(brPRVHF-;!nxF=EdwEqD-B90c%ifO)#_>eaA%SM*arQ+Q*~* zE!t8HZ7>T$=uRvyXhQkLG7n=@Z4I#JRCR9cKrlOMbs2wV;mLPau_Sq-6GR=p9*Q;- zlEW->z$-^b!9%Owy>(vKlkw;%eg&(+p-eB^l^-Az#W791^u0L7z`EMlZ2m93#Vue0 zxp)k#)67tGzSo|-3Rm;)sfW%^UUh-zgVgXhipJXO8ZB<%HMFV$^uNCjp9wtVFYagc zQzaD6UuR*^w;_){bv$GXUIa^jW1lGrUvDk7Ho>NG?r=chuTh<3B_AI#k1cWfzVM#u( zNA!ZQoDqplZuX_TR*;X!0S+Wg4@+N>kldOpb|Mf;;w!85k#=}1RR1RSmep13n3qe& zzS)x#YS;h_;9`&9L^JYNQQ*c0f#6hLsDpb1ap8OrRCUe;Z2Kg}lQG+$+H)u0BC<9a zQI(42c#p{vTxLM*3(k3r4NnJ0!sS&{Yh@u?VzqP54yHi|?H9bMN?0So@lzG0#>w)s zEeInTBr0IA4l|F1^*-@U80CHa36lPM2qFi>U8RWRwB1L;(08e$Bp$n0=q1Nc$%$$! z+zy{%AZb>hB3RYozqK~F!~nfLniwRxJe^vu@VP2nYmeN#ysS{0*HxO{|N7|*!ukOn z;l%ccYlnq?RWtQaM}m65LaOXC9}!UQQoDtw7O7ZqP>@)5V=;mB1Vgk}9Hg^wN_Ga0 zDIp~|!W$1AAQ;COQMu2ruwXx68biK~W{q@6tfQO_CBiB*v?SfN8F4F z_J-s|*k{>J*=XJfP&1*rVvw=Xjs{0jTcYK+h=lZ9WlGk4m80J%R(_-oqpHapA*oJM zLGc&z2WbTB)5eqe_#*Yz{tRC0h zByax?QL+h2o)s$l1%JTj_YBPHL+DlH~37E&Y`n&E&bOgO7EZhn={ zP+*ai$y`Xg=44Suu%TOm@W*_Le9I~bizAX8dR4*osDvLF4g881Ss1lS4r^;PQhxh7 znkYRqT^=@uEa?%gLRc>i#$>^8UuF=#p|mcV*X!C($cY%q_96)Zx26pj2eDAT1c7bEZIM)G32$XqsVZoIh#TK_FYsEKeF)t?CZ3TG< zp}!j9S$2Jv{>J2Dpv#~8I+FTGpT+gCcT4Krd9+?Xl2BZ0fXgK`obv2amb#o2KV5!9 zxx|JZ3Os~z!%p9FP$C;kzg4=O=!;ueA4Lelp{@*q2agh~EP8U+RqI?WEjHfA3r{_6 zfWC|md<&EfgqEYpB`yJ|CP-IRWhPJ3o8C|at~t01T+V^s0N}uJ^&AH4&vOH{8EDtN zIN|8%6q$`_8ylvsB%A=ab5uQ@>F6?@q;8|TT#lG*s1Se2Oi|?ao$ez@p_p*|i7*SF z3YCTe&@t%| za?$8pis0~(0L?<5BcQWUI^Gwnj~O#QxAzaqRp%J1xzdIV))J7U@5oshi%8(&rgO0Y#r-zgY|Qu5-< z#0QsFMFj7)PqC5wox>bl#ZO(JL6>=ELx$PIbDHrv!-?}H77mfasVQ271V)8AA}Q&> zyh`_9l^LxMf_9{Us1ryWGGSt%(CPpEHL7Rhk#v>#qFrAfo&}SfRe`b(Pawt_64vg6n3erVNA+!-QhNG96^Urtb|e>vxZqy zOf=h<*xJ_n;83M{l;6qA*lEzpXsJAdZf?g!adY0FLO>}x;x^oV zcJY0-M}s?@Id{fq6kFp4Pz9nGD}H6bvH;+byFZKUqe|58`|N6pYTc}73e}nW4B$>VXt}LhaS7f0yy>- ztCq@f+UwBZ=pHV~65=M0VnYs_CFoiBu=IhDTn6shxoHn^jZ$HY~@NvtY~KlQ=R(eqP6*Bp$X z!KhT$ujg^I8?lHGyp&tyyZ*aIzf7Y0da9GvwA|kQy>$}|@eESsSLuvT2(I)h#3S=< z+W4tFmDBvb4L+y}>-4UX)}D*ipXBkI0gNYXHW=k5l)x+lL;nH}L}7q~ z0QeOT6WX>ovvZ!?fTkF^vVl=4oucxkOPemQ$$?jD>A11jq_h-w51 zwOJI15ZG$#c1Zk4N6tmhGLG#%SJ)rpxtP7$yJD$Svzz-8C^A-hKnHE|+0E98?&7B# z-;hvhE()$tG%4uX@##s>q39gt`muqT(SAV~G_W-$?>o|Y+%yO&e;>Nl?N#vZwc)6ED5!@zSL@*X(OkO3aAaOcpCj|v zT~Wt~Y88e;aCu{q?W}IO*vmCWfdn0&D?$w$0VQbQ7fDebkceZ10y=LL&GA+NJ}+TX-C4`Ew=YYLYG>Ci3DtKc6Kg zkAJ}pv+x(urlUj6INR4IoA3m!m6Cf1m~98N1>YY8w#Wn(_FOlr6d)4tpmINZ_^9LY zwCHT52&<;pdG?y>A&>38Z}PoAjneaZJ;q(6damW|XVM+hd3n1y*k!8JR*Vv@C|_<* zTj5{je$hqdh18n3%pVmHH`5?a6N>Z*O}g8_!Fmbq>MOR}J`i22*+avY(oJ7VR_}8B z{tK6rhn+JmS&3S&>;+k`9SYKF$*dldUec%sB)&xn^3gr|7&a}S`%@o<(r;yo??*7z zJmHGr>$?D9^sAzzZ*5QTuH5*eth^KosfKG^TTyn@Y`>7ZZ+u^4eGMHOWfb`Jr7quH zhFPqH*jaWfvIo>}ZX$dM&L3YB<$P8@r<@Rw$ZpE><#(ZqrC#^AYSbZ)xEU0+Gtlok z1@hbhV0S!5V&zBP?u{Z%ZPzQTtgyHlB{&@fS_wu)fKLUV|cKs#vB1yml@`mh4et)JP8_ayt5+?Y>7HLOAe6dfE!(;(rEnu~d(ce7O zVVPR4pq?G(R@-WXfQ;te3^=$Hgn|FPG;~(7=ZgMlBO|3FU+9)QN;cFkSexu*h%l$^ zbh)lh>VRryDcs{Q`GrDaYp;e*N=rlAEMHBNNJ|ZCMbeYCTCP2OVF?AE+Q-LZ7>QaP zeo1gv?4_-~GZe#cMU(y7QM3PjPHGNOLIQ64$3H^4-C zTwuCu-1D6rJX$p&vHt|nGBSS=r9-{smdph=uRdX=)ZMX&$f_}98BTswM+1-J&yk#K zh2dqGwVJAeChxY09Td=*;$hmMPqY!I9-3tKi9Hwz$YWjAO~S%=<-UR~s-Zqi7c=?^ zv3I#ToeNk=XDMOOyI9xV9B>7%t0JPK{YXB_R{OG$IFO zLgrM&0?|FKnu`IM7YQKJ@{) z5i?R&H2N_w!=VV0UkhEuq1v&EgtC-caa3~qkc?|X<`n3eAPjC6MCb*qs5SKyl>3bjwF87!p!S^g12?c7e;J#*p49m`a?$v0rF_t)!v0ZuxX$UQr-952)6s}kIz~s7e+mNqU6j9a`T&9cL*(FN`iG(UN9N$8kLqvk z>VJYXe;4?l;{5~C{Lw%7H%RkukmlbY&A&k!z`p>Be_OQuTlci!|9@HojDJ^Xf7NpT z4W#*7(dYkG_x%}0^8W&c`uU+|wR)BC z;kj%5O82S#B=k(5?fZ@0(z(mv{axt2Sj{^_qxSP}wzCr7`L4H`dm@5xxe#fojz&WS0<&nN%>fU4Y;*ClIp_(b^7 z^^~u!%%eo@e6zH%ac?*aGXycKy?t-^C1?7)?S`f8ze}x_cg5MlNq&44$=!(X{KYoO4+(4=i?y>7( zAs+$oi`ZWC&z@oCk5{i4Y#z$gmWO7#tlJeR5oP?HvPGS&f6A{gLVy(rHDk#dO`#N3 z51`9Tudk97@WaMK2sL?QG}AAhb%mDSbbXA!mTtJs=O3`&AY`0aA480`>T}_X<$*-_ zWF%Jay(){nW1f>SQ@AO&3ZkUMkmQmc=qwT|3u&~11wS)l@5#+#9Anmesx7Yo3?2!{ zZ%pNop2(yTDds z`AQX6y&7FV8Up~iG#Q%`Cj(_7d_Eg8feP^9JpUwR95G`ejI00@Fr0-75p-1Vhcga{ zHf!7V)6KcU*X~|FE53xN?`_{IBlcX8Eo_+?&6t>_gc-WGjx4e|SYJybTn~HDw}lHZ z8-S;!0Wc4kgw{S?x-4yPT{18VD6KR(iVFIZh5Hk)a`Zg_%L6+* zpt}hC<0MaAxM2DkLzhTXm{y=UEk0f70{fuXeG*V{0;~q$o2~tCx$vnnP@s_|FCpIs zaIFNSZN~*QaMV_UAF)RK3nG26V>SEQ4U_xSVbaXx7|OX~%Dj-2h%v~WNzX_T=~kN0 z6tvc5Wc*LX?!%qI1I$uj)H?Yt$mh(?N9~S?XOu4k$1|+>QT6-;ZKFPq1K;JA{Umm@ z@mWqDSY2?hi-;H$B)P`j#06;!fU^;1kw3uh^K2!NPC~pnx&}Id8%2X++tO z^%#&&0h%XDEXC155GW9+ESTWMM~tG&frJp77j1Rf`#EMPtK&PE*aJ3x-=xDi&JO4D z6E%Qw`kcT+h@O{Fn@C-D@+y=fB53TnQItrt&aa0g7+tW4ZL>HY#QM8OEf!J9cn(`j~yN!bTXu?N&xrD z-c@Pp2pyv&3@Nc(sUfLX0c>JV45V4M#k5lv2X^n9BWNfB z(VoCqYl&zhQW1b=@?5C-W(__1f=1!y^@HN*#5IZx!d&}PVW3B@Onfl_638)2)si3I zJv6}r!e$DQIk*C>epAEVJio?&8Uy<+!nznAQQPI0-?8K}E*cdWt?C%6HZxG5?}`O| z19n1DKRyHZ95k54NpxU_itK2v2Ei2t?GY?a{40KpwIp!B&rB;W$=i!Sx|`zQ3pYle z%Dv)*t9Ptlevwp8S{%%56aqzxg4vA1!csk>l;SVzr25{r7&J+B4@w>3j2M4^hK<#n zNQ)pLyPd-8lOI4Rak-u_@s5ITE$n5Kae}S};uWL#gjl=cwPc>k8rPC(R2vl1B8h=6 zxeQT8;*jqxXNW86z}J|UGX5zMnY!GoMF^9)b*C%@)U-=tNUEEsmY{7jPSDH%7$T+w zwXZiAVFMTyuvYo_r~XGy-t_SRDJT!Ci?^vD+l6~@KUQIaOJny zchwZ&*)eYUI2gvpAeP{((HdwWJ_%fY#*cQW#v%Mz6F}lPK-3{7D}Cpf4kmYWg4t6L zQ|bVC&^Wj3QX&Kt@m-8vVFnctckh;8|9-@otR$#!M5o7rzLarXmSx+wGm8}+Izi&s z$}r0=v}b=BIGt4a(CVfAp}aPx4rdzIYyqf%`7=7MJTOhDZv=&b|0*a$Wd|(3`AgoE zyazfiT)@m{CAa-qr3N8F#)qIIw3spF4gE6~#9AyF3fmw<2CcZOvUNZ}jhF!}xQ`xn ziOotNjVFSpMfL^_!zZ%+8~bTEHU`XflFcOsA-fo5@`p zx37LX(IeJU>2SRi&?>1wSdk<9D=2QFr-&V_m$)6aAd(ei&M`HPzJl8yiUbsChuF2Y z#b=IY<`DIvAQ+(KqC2Gmi&;KB)Stfde$Irjzsv%MH0i;>4k1Pz#ggw{CklygiK^Aw z$J20W7#XH^jSA|7(Z456!7y$30ge-|5(piChf+k<@Kk#!e8?Vk=_(-X#xWB2c@{!= zH;SCWxYXj4e_4Q;HT`yrh^w0Id{;rl_yRg0(|L;5iBxIIAD8z-qrtK-y56;sxIt(f z$x#UyC-9U@2q9$dnV$s$;a8Yzbc!#~PNAGO{K+t)r16Ugay(DKabK;5NZkz>O5Zd~ z5^CRD*l+53SL}Oi{Y>aba2!{YgK5JQX^#F`MrRcMd{&Pt{5rpoY!_n+)i^U$)I@W& z9`q}H1z3`S{DIdlC63auedNr~60m9_E(RmPk6!eP_gCx^n>)(j8(4tv;p;gL8K^d# zQ5vLGu}Vp1J(xXc%%IEuW1~C9LO*V1njEo$C1CvXp#;kV^pU{I&y%PM%0UE#T#(26 z7K~pkV1lnWqi~V=<|7+B_h>7`Xzgd$^Y~s^A|k9gqJMvtlII$ELo^7bEK@A~eUAhs&JkIi<^&pwcuPAh zDR2p%mr2H9!ycl@9jS+tBw3?v;Vt@zhng-C*NwC{CmBKmoVD2N6JHi>WVuLfGN5^$$x0fq--Q`9ks`?83q0NeKX zpcqglbNbMwdcZoNssQfBs1ma4JIo8;Pjz#1ISm_^(o!4###vGv6W6i=``-Z-71$11 zLuPL*Oe!TmDPE_-M3xLI-I;nF$b1nhe`EBc+almi<6yv04Ug7lGk`kHJvKQme$N6B zQmp!88E9Dpp*aAgIb7`7vYWtn@#TO<&}XDkjJ!DpY9)98Q^h$80+|n3e}z8KfbeT8 zbeI98-Yz1JWLiDB3sxcY{SRdU7NXCs$Hseotv$khtVC%h={5W;)$$k&Wh3){-BfzE%rQSbW4a3(FKIkY%& zT@*cfD$H8x@d75TE%{eY7`x&-#2vRptqRhb+DvUyT2!O7@Jz@cs6hpRI8MEF>H1bD z5*JdpZz!M0OlE6gL-HMe0S&NKzuT?Ke9072vldbMfmt8#GiWFUCYN5-nsKD!FE6N9 zia^*zO@RP)lqYQi3A85X#?!6wi2I!7lO%#Ks@cZE$*U|d1a94GO{84eP06t z2!-l`G3PI<#vAIzu;ZUz%0M_Df*`VpH1gBU!US&;$kow8(vagC1{{k)Drg4}XBxLc zHl`PT`b)m>ss&S~2(2bEBv(|8`!RVRDIC&aORn~o{$h(M8B{UgcnUPcVdU0JGX{-{ zmt6j_6}Ut^#9zDyH1Gn|15IFgU~oJV`sG4aQ+Y{7W^$uHEmeAXYV;A%{Lh~%MQ5Ll z5aSBy(IKh|IIkX8_?1mO(<@vZcq+b$UP}cj1Fu6#tG`;9Cz~KfR?XlaUH`J4_jg_w z-a#W!_6qWk;SV;neMT4Nf&-77ut5iBwlGWHPl)sUXbXkR^qO0h33CPrI#!XWPolE( z29)E|MnO3dF3>Ybr&1#XM4=7W$tFKU7}OGpnG1safamWO@YlX4j#xd}2leAmM9!7A z&%TDf2uAAVpAQr7qtG(@qRG!PApzRnn-Ou^=hW7M_1mQ$ZvL&FJpZtTzs0PG3qq_S zr%lNYo#Iwg(Z{wo9ZXe@a@aUFP!T&C{-X`q7Al%Vc#5#k!oVPigL$3esD>w^R%SOO zXsq{FLuh|{n(75wb$3Y^7Nak-T+o*iLy<2td95)WJM zfDO!6QgKw%ya(;Kr1 zZ`lC|o6l4Uh5G$K)Z^J}3CfQx@^@Je)9Gnw^!}`Vi7QGTQKNflN6W1QPv5Yt5G=r= zIg`|xU?H7oSOL_)yXhQTEfnQ+3Ns+s;01UF>sN#-Qm0Zo(oi50#IX@@3TwU*b{$R; zdm@i~e1DX+WXcad7mnZIppI`BD zmaQ|i$%S9X125YGq|}%byW!q zV94l$tg7`F52gKxI@{59%I-QSTE6&~-^tNTsB%>9O2`A!jAhGS*H9~Bcm6|az6Mi$ zqNBbY77|me5=Pa$z;W`FY#x?$1cW(8_X62-@(Q;(D_+`**~>QMX_RKo)x~wXkjj4{32+iH zTtA$s(*1_$?~>tfj9)k#=-XbhIrpY_zZZdz4E-G#I&tQa)c`%z3GU|!NH~cNfzPvs zXIOZruPHkS3&W3hY+&pQ57B}?yosj4aCmOb1NC;NhvgNVIOjLG$0sf4kl&$;vWocX z_6@=BXOqusgnfd9IAaT|fc0=~jwQ{p4@o6qjmZ423|`AbQrKvai2xbo<|k1G#zfIW z)pnAx=9icrdGTp+XG$gFrG>g5{dkHEc~Mnwo~DxV+NdG5^SM}c9j)(gqtBU>u0;Cc{VqzIN2rT;2GAHM zi7=SDTOJXH4m_VoHoQDWEvy4Ht|pLcPNsy-C|c6T!Z!70u8Vt0!8$RCA{lf7UC&L?o&A!f^c>)d=gKg8DNA@gU% z^`B*c&+wUoe(hs6Dm@No6-lk3x{yd|RWnGSxm4#CuWNgG#(^;bZ$S% z^hY_GbWv;`OsL~%R|Q6=q`wp384~hzbZOG|iE^ z9=_G!(RXcyUyJb>uk@UUvquOAgtp-K5(_5pQtlUwZM|+Kw&GKgpZku|;FJ9;Op+z+ zc6%Pe=3{Ad@0e-C90y%68SA`iNMl~bnFlTzl}&B%ZuPSVjUi}3gKuh!y2|Y^tTov4 zHeD4#ziNGp$k`qo7L}9L*0^@Ry}dZR@1ONP^R1PYbCW+g+sS6j*35-HxiL`HL*3aKDmNM%qF|d>cXG}mz z-bpXZNCL1Z%rTMXJYDPXPNbOA%yJEBsNeKu&a7o)x_YS^>K~*jleFEg zq!qYFp;50$fWG7JEj}%Y;ozqi2(R!m0?DD2 z$xK#jirV>1vF%TS5l+n4H1UJNqcNnsK1tuc*vJIUkP`pNgDgf9Q`5OIdt~u6I-B>= z$-nMAO-FV_XU^AvKGPt4(X&-@$jZ7@Y47tdo#Sy|R-wd(@K)`iEoN4hezA+edvQ4o zdLU10;1<_eFpSZ0dO@CrR39<4t`?4`k+j5r z_H1Kl`qEh9zQ4-E3A^&s?~yaglrYWkfLH*!EH8kMlXdj13}|JVWaMM9&YhNz=WE7z zQW05BkP=z^CIBjs)z{VOQ;|lBjvZ?n!6A_5VyvA}XAlDu2t$EZkF1=2jN;ouco`bm zDF8a}&5Jfuw*L#)k>mg#yluTo!I)UmK~I^Oi=NdOES1fz<}zOLo%wo@l>}K82YSAt z6{&W>g}BF?TIPU1(3KrFM~wG{%N$~HTKg-MEQ-|eIG8#lOs)U2PCD4l-LYK2WLao{8io@REY@Qj-}*0^zVxVx=0-Q(-H(Wq*Aag6Tv5S#j5KENdV=w}f=t&@ zrg9_vkTcU=v?{l$v?^acm}d(q%c zo?(Bjca2rvI!!sAk}5vCOL0hDaJi+Y>6xrkV!LqZ@Ny=REVfXoc|NrRkqiELV8c2& zF|OadA*7|0Z%r#(<37IF^NReBa1i_ z>O~Y4d_i~(%KG0;QU#J}zx`&mdm4~h)#{6b${*f2V^jOQ`EWk47QXb}8~t$o?npM| z_(qPryM5q_MAUuQGMdSz0<5RNd`t(%j7X0Z{oNkN)JcZ z9I^yTdkGQKA@qCbq$SNj(NYXT_x!@=S!93sN6zFr&m(=?i+IU)so-3WYX}>W6!oK@ zz`lP{08#4b;itN4mL3YWz01P5XTFV11&$&83!eFYE7jpc(kDitfWsX6^^zc0t?8{^ zgwp#*Rxef+$?9iThZ4K(+@8=>RDoL$8j+LMYWwd6SK$DgK1b8>VYPMf^03Kmb5FUK9NA9-+{ z@U2^~E?uLlF(q)dbpwQbTFdTqcbJg5kwksSk`QYJj$%wFqs(IX-Oe2B0K33@wH-gF zKOgp}E+X0gs`K&s#*hF?nxuh~N6k{5bg<^cd6;FFYiS@Q{!>fhbarRVGtw)phP<7+ zOP6Zu_bo|t1RS05(Se({4V5H;C1`~l4$Zlt>q}nFvx3T2s>O+%8%>v3=edI{b{CY4 z{3fjyY;-a(ne*5Z)`hsg);%2Rg-Eu3lqtJ@Od&U{A_mJMSP4On+Qh8bLB*U}($u>4 z#2?dOS|BSY3|oA=v_9v+h3*VFb*U9W1FrI@Tc+S;5G7|kWs%EpV6J)gHoTquRK+GS zlBzMoMBj`5oQZ&8wJncNtiM`b|+X`?~Ms)XHE^dddC86rg`6>Eq+^jK6=K6^iDzoBRn zUUKNfo&qh!naH>J3u(L01CdlTD(#<=L)e?iV9Itk)+;J`>94PR-DCj$Za}4?g__S1-xGiw8W-?pM&%tkEW= zm1~VxS{pcs3q^$Yz$RjiVjlG(1_cQ(KEjww5f2A8qc3 zoJF7UjJ4~e0`bgEN9HIsiRbvpX%`Z2zZTeP;z>mYn>4G5;*O#}VRr{Zc4bVNlT7c7(G6JZp@>X2dq=5 zc8rcYGUk#rhVYdblw5CZ`Z1Fi*(IX8{;Ss+0!g}hr`zds!Oe;wHCAXCC6PiCS;S^{ zr|w8H=kPvybQaDejr;rK(fL@h+6EaJ5~rs4&KC}y0It2I`dM9x&ra^Jna16en1>lw zzISeexoh=}90ZIIMA(|v%c2K?lcuvXbUMs?&hY_43brL;X<3qD9Jj4*q%Et4Mz_Na z7$hp2k9>PqY&_4F-=XhS4`i7ffh=;S-HObeeEysongi32wYJkg&&C}i0tYVp578v4 z$FDveEj_|7LXb*_Gfv~08RxZQg__RUk9yacM} z@-9kY^+i!2u|hvp(xO88u%}A!Q!A56Q(qvlgSuHrk5uLw?4+u7%6fc>L8H#E{&9~2 z*u0D4BO<&lep`-ct)lmZYEhC`SOj4vt@#?47^3@qT+3bx*Sq|5V^o~*kwU7~l@Z%bm{H^Hlzcm-Ir1Vj*e+WoN)meykhdqAq^{g};j)9Q9cT#4rJ>Os zf;QfxS6!%h)J~e`Pfhy1FQ0$>w3x+-n0z}4k{$Bde)Gh0@x>DyLffsyepg{WNp$_( zsqC{w{$5f#2y0iO zh=Q-)5^CtIjl>?p^L{)xbCPcC`1!5|!Wa1SncwMpGJYq8vu$oACJlbHb_-9(O_+J= z&W23kb|PFRuMLN03hU)e3*8B>4#y2vOXG^1=0p@ezbR=3`D?Lj#l~o-Y%|gOUXiPS zZ+VSo%f<1g>?}6vrvDM1U3W9kVt{*MW%CFJIkhq6}Lk&fT&vKuh+nA`NfPtN)C~m6er?Tg0r&e82 z!>D@!xoyRgP!kL&u!7@pbM#!KDLc=lsL;wfwiPw7BX_-y?K)1Q{^1fmR5~(zbQM)r zBB`XK9;LGoz5sv!4Z3(H1V>l(ww|MUM&)ET8~mv0r!=-hd^kIn@h9@R4bo3y*+}!+ zHzeqzT|Nj2bANRBc2rZreSfOgwOiVJuNug_Q2vdOE%H|J_miXkYdfnKoK3WeJyXOIJ0}~M zNjLV(%Cv5M1t~@fB34I<%`iiLY;5&W2qekY9eQ`x>zGd|D2g&Y22y`(yv+6j`hHjP z(=5@83T5)bkaX@QoVTZ+vWTOfC&7k}`&7?h&{H1BiOwvRsl|7G?sR>sjDzF^G?s~! zy^83G=EA%xJ_Y$^sFzI^HCOhp^!Jw8nDNL9wDkU({z9a?6+Na;80|YxC0Pp_Yo1od z6*f2eXVoYG?;oZKfGSpIaDIJ9i-APEe58a!X2emS>PVsoBFExQu{hTo9D`-hWlT+Y zj$EtecRE9BUyugPN)tS*(rd+mVc7S(cR+_tVEO+*vHsiM>@Q9f2MgnW>g@dOg!T_p z>VKeEGyd^NqgOO`v~_kcG4JN!EY7)BYh@|E)3nU!{HjBd>qT z_rD@p3)x!PIw;xc8yW+-xqQxd)#MB;j18TD^h(YKPJi3cNm%Qf8UyK7 z&5fMQK7z^wq!%|fH#KttGJO!yKhA)E0{;=y{|J|$xs#*3v4fDUwVkbv@keag|I^?{ zSV&pe*wEI<82CY>cXVF?yfC3ycW!TWF3o`0+M{EHO7_~v`~L5luo{(oos zKJ|aF&Gi4lHvcB<1KyYahi1;djOP9uA^cyC27k2={-dt@&t?I=oV*N>@vl1RkD&nL z-$nrcv^xG(RsL`C#~VA<6X}NIHy?a>`%$P8=5d|2Pa}aa&4O{Xkn;fC4qFc) zagQMmZQvo3t}17&y25>YAHs&Y!iMCDMz4z$2GJQA;wQc5mzf9$M?|QwQzfWB)eZ6^W7(aM8 z@qWJDZa6!u_5QtmLf`d#mfQ8TQ(Dvgem*$aluLxPcsBc>yDXP_HtYLpWl7Za7DHsS zTAF*D`?52d>+@oDb8;5?-g8^Ef5B(w>`buxCHr&f!6?V)<3mdiPM@aNOHWbT#_rdv zN3Rv4rqtJ~Czod3$-#AZ&vl;7&!wxz&%LRu@21b|_qSd=S%?Q`xgW*k^Ify`eI_;J zNb7yI<63cV)b$9i!;D7Cuy|Q2J!ng4QPXbvYl=U>RVzxTIAX>#e zPHj2{&3n~xxw3z5KcoKX4`x@)u=IRMnRv9|=M%(c_ z$H)bKREFk@6D!eC)&rSO+hl>=g83c9bL#q?zWcL>Sg+;HoNc9E-BVdm4nXZDn=@?mWp@j{ zp5cR1pdAN6&clOeX5m{kN>kXi{;bM6;I_SN4z!Jj2;jz{m8;Lfw%vC)i^!h&dI!Fv z#U9YR_f+3*FX6?ZLyxP{WhbG^zOV-?J7@dbfm7%NR0kN{wdBNG{et1i6Yd5nZh#@? zZGQ8F_0dsTaj)u3k0Adl&uU6pm!)tnhy3%XmPdOct~*=im88op2rcWLLGo>92=wXV z&8?efGxp3i#a);rTP|~(-U;PJB-oC&JC%c_z^nCV$bA9`q`qgHZaVBph2!Iers&+) zBzo(03_)$@%wG0@xL;3AiH#h7b*a7U@t%(Z+i1m}|l#jx8!UY(%j(h9!D{OUqa_2rh;yU%pW6?~`nQ^$xl(Pg`H zXFH*`Q04Ne(Qn62f~UGuSQDn}FE&sva2O*{m_JI2xea05EpvA4es~Dxj ztQcz#2Y#G~YS0D zRDR>-x6t+CtgGCv0od^$VFR*rki;m9m|n&q=9jz7)G&nZR^4b2OD~`6zw8S_41JKs zAzl%AG7_n>(87^28fJRTr#rX!UUb~-U$ehr`sj8m+iU>Q&vg!_pbs9NX~do4;O%|7 zyU#D6lLszFFGxSuX#A=IZ9U%=>u`5yWRNlgkh8m7mB7RI<O23ZqvPA^PUBq zq{fzPv_h(NBft{)>+I$V`8pQ%x(Ry@P%{PuJq0wcjw(#rK{octU z{stl5)!ui8*G?a?;S<{Ao6;yYB!0Jg>RKi&zEfa$roP8qq4@Ro_#)0o;r2MSVgLc4 zHC?G>7DVIW$;-3($x8d{+Qqglsd4?s6F2i|fW05+vvhDAG%PdV#CRSx{H`>+VwWad%nqqS^`dmJAK-tFzMoF>p7UdLj@) z4DSlXyhG34)9$nRlfEDQ#T7Fm$8VsmTvzY7O3POP*tqHaF)qQ^-_6_P0a34=j~Rni zINdK>cz%=z)GJ=PUT0iVIag*+SZ>Da!k5OQa^h-QKy6aHkEcL_kJ|78&1+)UdAAF@s~^S z6;tr!JyFH`oL&9mvk8}eQlqAMUDr4*=5GAh89?97Trjcu*0T_*M~S@Rq3+XpscZ9d z2hD;8a_g$k#%J9};}|`jI*1vZ02*pQ2bwD0twTIG9<8t2YgZ@L#FVJ6ftj_*B!1qb z*DIjV0TRok^(K%OtwVJR7o99Vs>06DVWPEFi5f%R^57+-f^kQsWPz6ZbD z(W}uJYtXM10yPGNj*}4Fh9yc{I@pedwSSOk6rIn9CD`b+>?XI=hx37)FqYwLN2W3N zVeK#-uD>^&*k4!a^90h6j5~Yon|w$3KAp8J|Ba{e!B5g>6{Y4l*IAhdM z_ahy>YHe%f-*2rU7;_muRIm(P`0W(-^{LU9#fw1R>1S^0u9$ zfXFTCcZ1iRwk`9-Wj{;Wb90C8cpzpncyzyW8jCQSex(2`|1%Kj&?ggep^Ahx>W(tp z!UgqudM{UqmbcBgEYI6etM+qRpmbFwZ5j>yFR$;B%-_w`jxB@8-H>1qjs|I&#wG@3 z@*28vp=Dw`(`{9`JLm0@B6-iTqelW|UCVr)v$^ltN!bR-BAM$Qw~1hEva-~-6u#?% zTB$_U*L$W|_yodfAtvmbRPA^#4ZphJ=&C@HkmD_~A<-`xruV z4HFmbjpO-Wr>14hLnsaQ8ZLJ=;`$7tJ$7}TbGyv23 zmBjD5v#NT37hn+O8(0JGv_#aSokOGsy*Xu%h&xW}Iy7L?ioA9+?G-FxW;0j(`nBm8 zWgR{Hm7Rai41OEVqhkSD`J0&IC{?&gnY#;+EYP05hwru=aQm|g)UB{i^m?_RH;Qo= z1dU-K;sjM^hg13~ebd=&ACZfwI=H#VQYQ520?hJDK10qSu@voCaBUhhRy7;4Y=|^6 z9Ck0yb{7~}CO?bkyEhE|*mk?9yRY9^n+yZ8FvkYG`#G!u3_8GftzjAotd8Wj5Qg8FWVsdcaBAen+&!dm0WTYOS@ft?#TgW71G#~ z-$FPbEs~+xMz|CC^c|9DBd)`hGdx=Z61nwk+XDzioFV+@n8Ynrw|0r&N>uM0lfale zMTqqobC@@D3`GqG99a-_3(FqJDd%KC4MWR_q~s726blo}L%K z`f+js9g#RI@6-_Wol{UhbIndJ+x`t;;=pT|=@E~MGO4;~>$nwo$1y`eh+@$Ya`i~y z5+$XEvM*l4c&c!)G#*bvN;<~Sm2KEwIffg}5L+b8KNX}ro|90PI*OD^=q@=qZ-$bg zU2Qfg$gCwifp=#(ZG8S5iB@v!lEw3z3zQ_L1!m510z#u@zy3FBk*$V?`kqz*dnv&% zCA+RwD1MN#rRqCO_-??Uh>Tz?`y@nzr|AmcaUTl3Pr~c7J57-G1YSR~E;pMU86#*+ zT&qBDI71FX2-i42OIFMFH+ixU00EW71%QDTI_wqw2tyX+Je&wvk0cgLTJ&-7E^3dc zb~yOlxW0v4RWW{?Y2?j*WW?(A;9u;Ij$nheO7RN#Qz$|ne%j&0`$uNjl4_kB%}H#q zv1w-XcoAa*sYpkES8!8^@3^FxB+Ue(C-d9nXP~{)_|MkOCtxx8S91{Ng4ygi8pZX9 z1Xz8IJLczB=b&lX^l(WJS&DU?FU%xGnEpn%Ofc{5DkK-z{VMJ7sZv%@xk-slXO8or zi#Zjl6~W~liap!sJVobEoVk+pK&A{1$`^G zwy_@oCOp?LwEoXy)2u$r@jBahgXAP|qxiU&aa_X*Sgeg)nk&_De$rkn8r+d1LsJ7N z#bi$FXMRcF4@YRuzZ1xY!}+hi#-yQ@{$BvBKvTa4S?+dMgNN4OzByFS9qNY;_qZop zPlGxB(SrO(TTo>|xAR={H@JFq~7N!J3J~6N5&TUgGVwZw8OC&q(H`fNp8Lw%QGuB$MT8_ zz9}j=2Of0148EBl^YId2rei+R@)0423v{pjp+B%Y>HR0HN-=N9O4P)L2|SW_3iWEk zMxl!jd&XV4Cs!5?mcV#@6<>SAlg68cpvC(-+lh%1jOb7iiyT&q}8*u&f z(VfDk2r8&5Lm6dC8sic;`<)WQfV~D<{jw%g;Y&Wi3aOzz}r>vPa-vFgg?oG4|zNZM#$-&mMg|5NDb0;x&?4HI=85 zeFWH0bdX4?HM)fE$Fs&Thws`HyFGFdnnci+Xv5jmEOMktJiD7#LWZRrnW*fFwwr(z z58ElkhQL1Ead$4q9a~{y4ZBBwQxphHf?MQh+s-qLe;_=-#mi2GM#4(_ zsi=&kUcvGQ;&0o~g(>|1IiLDSPd!_gdx}RE~xTqBDp+oK-;F~&?MJLN|h}tRM(^#H16B3=hvU4qyh;e zCKb*U`nr8}y-ORrVlyipO7b5M#!gkAXl+z|dVuNa|S8AqmpmDewe`AUsvd z${xQ^17fs@7f2=U_GdfljYW$`%=^64PSJMt<^S6-l9!_C{A7Jzj zZ>RjdLSMQ3zTHUov2Z=C0X5d_Rk?t1R2d5)6*g^i1fI`b%${9>M#6YOT&pGbJo+6l za7rU#)s8V1x!l2njbDfZffFThkrPLsCXy?^8~AYs0)MAQCzcns)DP%R5wqw=vDxT& z$q+3NNsBhe4~)7vZn%XxuK~D+?V<`+2`2xsNT$Z3LE?R9T!4PJqXnP`HJeB)>b9%d zK*EU#p&}x?oEV-{icSO!N;uu+IR(ARhA))Wq~YaEnQ~6b!IU9fRRA&#ckv#G z*CVbFub(4xEiOR%@t*{h*RC;;!YA2vm}3!x#{W*o7P;n#>YriDV$h(SdcDB2se5n+ zT|F}jih0`3Qd+bt>Rlx4{w79FK0NJSvULRxupcjoT^2wViK427@+FgViQ_Xq$tlD$j>@sDoJCq=hWY3|C`AAU55Xb9IM<{}`^Co3Q8R2e`z%xZy3 z<0iCjKoguWAd9Hu?U5D}CSm*|gjBWN{jTmD+PME{8@GygWGEPdo@$PA0NWTrf6x5E=)qJhGdgS{L+TQOpVks8%2O-G}kI^_5q~+tazz>^5z9eo`VgR{GAt*Kt9R^9vg#)cn;Y_Y{8lX5@KSS#D z4WQ!#;-z_}dWy*qoB{OVYNjW8U59bLLZbl^2%H84u{Va2OVnPY!58SHG6k`7loR8H z{-b!IP~l3fP`#2UX*a=w&2SVtDS}H2K<>e8drKPt#W0n{AyW3llrF-$Gy8sEM20!C z5D}8}14FH(rHAF7MJ*)@FpkHl=%>g648z4-`oK~aU>yHog|Eb&mBT`e(tLdQ|2(CH zh7Yu#gl|cCFlW7dMwG?MPKA%$Okc_1&?NATI)vXIjJ}dyWp2df2^&J8I9^8ITx|j* zg4wIACH5j)8cx;72I)vN+UmCC|GLXrIo{txW$pxTF>Qk?WzTKJz}}w--vj${r&SeX z2is}x``x`bHX&5}Sm-7AQHcp7rrH-#H1eJ1Z!A|W4e^GWs#vnKE$dN16p=KgKWIAq z9TTHS7)if))f*Wmw8By90Iq))tD`_t9`9lo7%=t&u#tImcF|FwV<>8$WEV3=A6Q0? z(w;_h5<*!_ho5!hCA?t8lQd?oYj;;WC9%o!qp6G%eKd)ZuDm-jOdGG+p=h(DzPsPW znx>kTPEB)`P0l$i-<`sPQ`ArL#e1(FCZlk;e@z6%GSwAdpk|92N?SP#tNDbm$k>^# z)`Lnze+-TohDSI;HXN>8c2`cOia@?DD$eRv7dS6Sk8MZJS!YRMT3Gts^_>Er4Wa7 z9eBfe3){ozoil=fNaA0wP*3@ImN!i0K%Aq}$h->WDbcV7nCuzes=LODAPdg;z`;xI z2b@5Sri+>fsUFjv^{XJFcBY-Xw?TC> zLV0gvEzFUQW9zaZbh*%Veii2$Fohc|`JP_v;l;y6N zi2@k~PI}8hn6SciDsJOnEr~Wt?(7od_z~W`A<@?mC-6jQa)se4h;ck?40EjCHFJ=p zBm3sP+~)CQeT|6lSwmAE56l(VBx=(gi@@2WJdmaaQ%LAlO-ebmB6O^=vpM22Rzj5U z93`z7WggH$4`o1ev*2<@MCMC$5lmW7wD=^LGO zU9UQuD=xMDUL9FYkAa-odp|+;FoCE3;^>IkFIE*0@%7h4Jgx zNZA`HIF@vc)#)LpxzbVPRu!!F09Zakrun5q{j7i6jG?OR!Q7!SlSN2O);u;F~o zTjoE?3?zU@n?+Oghzyt~0H#6+0o98V&-)IP<}fjn&sSyL!RyG*cCT$hOi!fhN~#OP zLBB9V-Svwc4AY5seH1vrx2%T^bn8&D8#=gPynYKW^VLea-WWItl8;GtIYYzFCNIym7{Ejx0n_yYmWi+kyLL zA;$4WKHVG+@uB8}5l5G4(|jzIm#ZC&I5-4u0U?m0`DVm{aI`k@h@13*n`)&mFxaa) z05Y0y_cQU!R@hdeK-IYu>xd|mxYPX?(6wBqWuhe|oSDQb| zhU})}_>qd@Q)B^78Db6c<8D{nB#k+7JWC9&l?d>`!;; zH>Ml=j}~_tWy_GMV1f!*>cXu^@&#!lDTjzcpF^GyaK=-a$<=>g6RfjHC%Q5BI^!=; zWMarA8d(Hrg15Uz?XJA`R>U*0B5WziXF9xS+lXwnMKUo?fY62eYu;bABPZuWqE}B% z2{sl8nd<({o?HPo--xHmWx&;uT5i|0TvSbY7>rx-uA1rryd0a2<0T5#>hP2J-Rw0j z-*voZt+AiOcimt7U=< zKi>FD`Xd&Ovd8deX@g!A!pkQ3C8R303cVv07^kbE(Hu$Xk4>cz<^v&ar2=468T%n0 zMyH5z*>Jd6+lKzUXpqcTQva4tCxjbP0dCK=iW)8dAcxj*ydd^-WC>-)jngGXr716@ zWJ#;*9YqbPXLOo6|vS18DVg99fH9EWU4rKJg}x#^N-imgk_5x!--lu=!H zB&e2C^NcVJDn<5cqVmc~a5B&`jf#+;c|UR(F0xx^-y@I^2K4`jZrqnT@7772VlaBR zmoP^~pO;vJ-qOU*m7|E_liFj3^b4MXftXn{><}bEowZaF-fMzm7z)V^dESw+D;9EB zdo3X#7BI^&&pFD!GzPJT%Zc|`#4fNdT{FQEV;L`e#lXDa^VcDRs#n;vAi|t&X5P%= zsT+4>?agJk6nibE-76gJka%##FCv3#0vHe3g52Z8g)Bg2DRJ@urm^7h{0^y=MWQQ? zujEf1Y(EE=B4#S}?tI`6?4H%Xl)t1?+5uzD(1DsI-5<8_nQqs1DZGeimye{Kb-IEl z@}D3=xa$+Shk%5sneu4)IHWU6TgAbEk|{~s9&*TBYga$Sk*(qFcB?KMc=1a(s#SM0 zlmlBvoQ8I8Zy?v)4g_9s$0gB(w2_HBZ`P)HtfpFJBf^}sSN`8Xbx@);1Ts3lQ7J5% zMT=Ffu+c33al7K#THr76u zWRzLsb|_HwVrILe;$AKAhb?j{vA0Jo77?pvfW~5F{ENjRVtFGGRS*a8$x=^6!S{<= zttypQR_FphGmp|?AWI-nT5@q=g#0B_NpWwaJQj|)19IBi{qlE|JQVLYtPbb1OYgHD zuNUvPcnpJw%_12HMacp#hq7EBbyjVM536>=U>#Wik#@Ng-E1X$nL>;fY!>C>_(!`w za)p#Y`306MChHa5;6%3d&i=w0zGq%(D~4Sv-a^tYU-acl=jM|7!Lg#Dh^rH%EGn6ICm& zIt_8U>o7;doOx5fYHg^}HJ1VYuD0$(ven~PDjRjmJC#1bbIrS%#GEM?e1F^tbF^KL z+_i((j-m%|X^ilokikf}WUjDD0`O{J!p3pys3C`y=kX$Ml48)%r3!E9;*AGbep{UE zaL2d3^k{sd_dOVM>(T|X=mT@?#sjgRA`5UTP3Ae-ay}8qn?gPBnxDmR+z>bxl&yn3 zsN{O~2(o)sD~bhCbz_eNB6xpONM7vA9FosCyYYFTq@i2OQj>O*^E2w%^znF!nRO2N z=~2e}Pp@%;KXHyM#K;goh5Z!gNUt$iA_xYwAAF{W9LlKBPty>?cp!#39Ad8k4Dly0 zj9z&1*p>#bLUK#PKxu}d5j!%6nKWcQJYBWsEJq8;0jt?X;5O^i4^o7z$fVq(x6AchAb;v5ynUyMq?Dd~2ts6?qr6{p1i zz>{}yMRWkvXU%lxD z9w?D(Xo%D5TWIoo>nOu ztp^_6vr#AEWM zWm;lXGVoZ<dR!1nmXCu)p&G6{ynZ|@T<39_^0+zdNgQE6eEpq7ds}yc(;4~B zn=5caxtEhhS@1@Rs0jjqheJ9*R3;|sWuRWBonK@i^jP4Ja7PoCMglai{I)3)d)>IIzWI;Tb$KAj zz^gRGFkXA^-3RrC#%Y@)Rt}3j5kR-bXLrK0LPH`f{GYRTm#D&VYwp|R?oy^}3@xZY zLd>2GXSW^412N1ox9vfSB~mQb4zZEPDap+971+RoM5psBY7-D`3fIYFSP zaA)@&$FD~5DZsUkoH%~Hl|rH+X@tmZHH{*f;E}iBWiAAFum>XHLf|sBC_;6@bTnv? zhU?);?pNPV_69FXDi6riP7QOa(8jWuuJ!qFa8N*TI8t*d)>g8Z0E$^bBM8q8El!yf z1@+|~S~=zk@MvsL(q2tRLrZ(1HxQaL#-g$;wVG>5kdg|gg^`VRIa#ryvNmZqgzC-! zI#j1^poutte`@cisKoxF1qjEvsnW?L&dy7)mC{FNDr_b^_Ifplt3p8_W!1yes`AW{ z{EWz?@3%UON#}Y)(F*#-c=#isu4j3X1zaTPO@_I}X=Rq3EKUn5@2{2_fLVq++3hl% zKfXVlh;sHo2v{h`8%62DW0KI6#w=@%@^mpjMMiizUM4f~1D+sSemG`#O!m@;ZveMk zEi-`qcvjsXR~q0{D_d*4mGOhuk2vz%HAii_mnsUCV+Zl1HoBQ|<+!HYA@;)sZ%%EJ zf5E$!F$-OIED;Zs<|R~E9hx1PBUOvzDG{LvPUjst;=++;*#{$kjCVZuSkTT}A`_&; z;xVgFXm{4zuv8V34VWQHLzB+lL4Kgbl1qx!n=d32yjX~aUD?gxH()t5FndlyjuZ%p zqa8R7gyzn9F`T1iSdb;lD;Y_mnhCv~tO%JpIXL-U@Nx)29tRdaEX&8U>@tT^WYS$U z3}t%^ZJIRpxcdpSOPuKXn;we`5xlGtNK%vdZS!x+{d)}L{_@*V}q zL}5Et#fNXVKmYJS^ht0;Ih4wBI5yoq-g5LqpU>nw+OYco_HcndJ7C&tx92nc$?|kC%vD0RnUYxQbh-E z3YdO_%HxcG*&Vq@O4a_-{gDEu-9(m^Inj9^7d@K0IUJ&eT8=16(#$aEOk2aUC7ag8 znBrYvh|C6v21=+Wk<;jlwJ*OqMvx%7U#1XiDSS#Nmk(HgmS zYGYe*9Mmc4v#<@sj}$Te;93`fEZXSGN=LWcVI(czxGrLbuNTyObGyZxrUl-nnDZ{^scIinn`FrM_ zgv*y0$IBS+rpO?>P7$j?kx=D|sghhve1Bg_m?OQ$-q$i+bQ)k-5D@z*@&Nmw1OR(S zLmFT|TwCsE$O4==0brAeRH_+)EHx*^CXN2Wcw>`5!cF>yDDyl;M^>EP^$aUtNzoI3 z&l-iocHJu!&Lq0RTHke5AJO&Zls-7@d9QkSWooL468sQPn=C(51n*?0OQGQJ2x%jA zWIgeRCUqL@ebZ9WByldc4iLCm?$}xYMW`OEp%Rs}RJ>O6^rnW}%J`$9U&h3=BWMPN zxeJ(OUg9q2lW{x{!yH*uifj>*T*-O+;exj=Bo+J*Ql94&v*m{v$8-6;7bSg$J6Su( z!yV7qn>T7LTZ`j4#V|*9jYs8=DWh#Cw})i*S|uQk=NQ8r*)>iaD4&FxzuiYHnm+CH zQo@PuchEG6S?s#E4$}fBj-SqvJ;$lSw-Uj_aP~awc34h==zE$NY>JrtT|w2e1#pyPdi|y z9KZN82`_l)+mS=|tkq-54R)bBhR9oK|D1>In)szD20VPh<6k--@a0O%`8S)?4kt_` zIGx_GL+l(viq)aim1P=`jILZFOg+%8S;Sp@aUJzBxiWrcH3}+ddJnAK( z47$fbu#VNl`!#LB^4Wd6y^scXh<)fqCtPZLN43gI{%u#qR{vKX}m1C852)w4C-L&*~$Yy!5jImu*4FlzulrVVZH-TVfZvWAB}BdqZ`j{eBIYK&l#NEcn_@7 zl7sUavm0>>F4fo#jgA~~l!%s7ONs@?9-Ecdd$ZD~Xv5hgk^v2pZO__xuP|FQR-!A~ z6`m5Jc}8F;rPiDa5}|pzhs#MCIU2LA`4MPzLl_1cEl`O#p)kepOvwsbAbNlmJt=nwIcOD8 z5+@ff#~4|@vwc*az@Hmt39Z=h`jS{C$+tX0B-=KQ=gWiS-ylr~V~UgINpvNn)8YmU z;^1XtC@4ak88PjWsV=ONqm2e4`bP6VJ6S74Ix8?N)J64Tu<}9Bj?ktg8T7CXgRypy z*cv>b^Y~hVk!Na&ztHT#DtwK0FMi{IAxYV~=IT*9dhj6SX%9;VXS?x+OuHTUHbEvb zT2<Bp0_Epd;n`H5HIW>xr_nXcZw%qepE-8C;J}(<17C;T3T=Kk)T=`XRJzeRz(Vb_N z$mJX&Dxp=km$EkK_He~k5W(ZrWF@yRMFqgIfjmUwQS0ME3-77k=hQcAWG|sb_807& zZ>S2Ye0701_5jq9Di|%EVc4FrRkC^AcS-IvQqkBUCb$476Sy(%zwr@X+uik?SMW{#Zbar_wzu484WYb%U)Zr;Sdr(e+Nna@*UqQ?#P7TX&u* zEoX9(X-2ni_L^eSi3COONXtTuB=*tD1+mn|1UN zNe-FISh_OZ?Bx>c|G$wUuU-iz&2FT)NOBDs&N5XkQ+jDw$yL7I{lA`xMjwIK$c zqp-}~X2s2NwB@86h8u_MX2@bp+~KF7h*g^&Fy?wrH*LUh5LNd$^aHAVX*SzWFG${=o51t&KU$?E#19-T>f74j}c zh;wDd2`mrebv-i=->I$whlEy58wkp7nHjs3eh`w-a2%9nF)=(8_(T-&!u960Sa^e5 zH5Tm7pfDN_F^$aRe&QGi7l=)9T=+E|qK*rQj7Fo_9~I4H9#_ugn$`(xY>Dq3>8oS4 z-^Nm}mP}zqjJ-9X@SJ~<*9AwRasbgw2(_K@ap^owS7BYaYVp*XPY}I>@6u`Tf72sW zm!?{h;0pwHH7cZ@k+`i^tkPB3j9|Bd1-_XBlRcY9l{kWShqdBt-^x$ybuW&aG8Ib~ zVb|BQ#j)V}M6`^tOBGhf9!7J_I>oONy_5(!5dOJu?^oRBcuIBqUCJ3Zuv~O2!W70E zM4Mw%=g2}NxB#l`N#Ic;2rP+^Ek4{)^-~&RKVI(IFh>?5{!tL0@>HHF(c9(g>?X?> z2zHks+8l5@pChwIQ*|dw)q9%|QEl@THiZR&GNZ!Cb$!qq&8QeeH!Gc>)~G-XOh@$> znLyqrYx;_T`i3I^Aag*}-lvm2%`jYu-%HNA`4^c4n0+}&WDpCIbpyRquB#W&0? z&*ll}kSgFJgIn|*WN{P9VBCSvQ}xCp^o_uP2_bq6dR&`=1{;l*yW+Ot&*M z#l~cApSRRmsaGA~ma_=cCc}6j_ETg59!@AL1ny-U;_cxS2j%?T?DsIo+t+xInCR9x zPNQ2cxraTrRKK=HpTpNERR&jCF*bw~=8aI9T#-(Q9r!#}h1#v??%@yA!QL z{^W$}7NCE^!%pgSU~sjFM8Fcflz66X1AmAfc_?8(Z zy$Fb$hUnud)^|bz;;a)@39|O`2WV1U4MK0qMTJn(P>fwGgAnl(FT-v_Z9_7zNHe8E1$G#dBX z-4yIIjFc%Ub!4O@Qae0JgK#~`M(|LfCs;K9Fgn!Pv>MZsN{WZ|3tO(}NH3|EUel1r zm;P=dx)iU~IWnBU))>MFtnrFN0p;h8`stp%oHiE612N2zU1Ritlc$V<34Nmqq+yN5 z&im%am@|`&h1jKKvRGY7bpRa!9CRt%onvxvG z194@9I9^M%{j*mS$IoBSGO3~+eG0E7gq%7`SnFX(!_X8N^Tg;H+(Z< zlu9Wk)N9eD=1gc;&E@w=8OlLaFuE0#?>h%rV<%(*T zlio2;N*nrdOF`qFXg zIP4L$N{K>{lFeVkC$xT)aK-jf9HkoFO=rV8qg`ax;!J15#X?XJl>jd;fXvr|nqaNA z^*WD&ku00(X#KDGh{{2g4YsAJOrk!f66i?oR#ZT|OzR0p;(medM2h=hrmmr{xkQgB z)i2HBlWUu5YIki@Xl|Me6p0+>NJNn+;#zhhbQ&F0*eku?Fzq4=<8>tN1l#nHmL|g{ zM{9WqMCxf6CX5hg!k-Tuh3ehWOuQH;zp#x^J$ZHPU*@o$TU^eOEKp(VV?i1~S?^2q2?LKh*y4nIqKU!box&@MLTW?GK+VZ%-`XsF+K%(mXc#goPKG62oi32F`i6(b!L z0cRn`@q^5&s!$eUR3d;lYdtNOS#kV&MP+auw?JPw+3c<>rPWg#Q`*}+oiX|?TdDVL zWY-wS193LOzWipQ;{tpP$xqoe#__Ci);Y3#jrC>*J#Vn^Jh+`*V;n!wOr0YQkvGC9 zI;AvQjye=hSozqhYq4Bt=h6+=dzxzo*)QS4zj z_K1aCDrrmN9&(j5EX-jA6p^c#JPEyFUMdV2`ffguS^g*+?0hX9iVlh*>J~|=yIJ)* zW!s0H0)>`vc(+P*G~1n(1(SwINRi4~CFT%hC+Ns%`76EfUuS2{niP#Bl}E?p5lR52 zvM55RSWK!jtALkO6#DVnbOnss$S*}fR1P8WV_|IW2>ao{ z8$n+WYz^&86D;Ffg5~<{y7LFs-pl<5rKmbClLt8I@Wc{VI+$XtdqO9vd$Hibgihid zzH8;?+RH;`x~n6o*oYFGETrfx!`KMs@L8rgjFNf|1vp?M@~>a@*a~0wdcu~`7}yln zD>rD!3s%VcEHjR%IJLA^bTA4YbcYEIo5jQ<9Hy3IWnj&G@1#Rt<_t@_~{(J z#^$`4L}9!UfD&iz;Xo4G6=;F1Dd4krq7-jCdHOiPJMS!JZXfkc65>7fIhZ>KTl+vC z+rif6_Oa6Mh+MvLS?KP%e!h9%+qb#WX_9EhE_uYrTT8Qk_X7SnNA~{Fh+qLQcRx;zr%te=T*54}{sFIiORDFoCmLM@DzGvftB=@0-x-XNs6nWNX8%lEN<~v? zPh*#Q$i~u$e%^`FbEb&)o9F9dEF2EV9|g%To=V9lvKZt=MY8!r6|Z`zk?6OB+PKI> zP(r?;4DwKwoFMw1M=G^ya*^Q49uKfUJj*6A67z$na2P$51}Q(7`Wn8u6{FFR&hDV6 zvVeG?YH6}*u#b$4x@kL4qMtNaVly&vv@98bSAF3yDI7J&xeP$>VA!mlVatOr9>7C2 zR68aXcs+XOMv?%i+*b&MqxM(hP@`}|>JxK#Nm)keK~EI2>qaF6 zXL65i{k%hyVY%*0@6vnCn~pvRmBQy)`*OzN(Arpo)WOa}bDd%{(kc2lP8Q-Me_WTX z+rDh;9GM-9RYnVOy_Ooa-02+IHAbOlyH=|;s8QWm#L<@Dvk8bBui1{q8{W?plz`FL zrF5)PSV(Ce!g2osj>BTq3|6UUG`6DAB{+^@2Me?IFmT(0wTDq^{Xt0}mXAh-F6&*& zdwjKh!utAKk60s!{T$g7MK_I}+jmcpi*sbx$gZci{+?<^fS+C84CTCkBFah|bY_ij zcYrwq>ilPq_|Gf)ydH$^Wf6lfun5(B0|N6^Sq*rDB~}pGH}%j|@`GE! zCoE&!#;An+8M3=t#xGWQ;&VQo&+@9fMq|q+y+fxPP%;6B_RoC;QGkXmFJ-P0`Nb1AuCJ!~u7m>| z9n4895gVGF=K$28mHH+ilfqFvP#T2u$yPmO&@sZ(~ z3O^*BS_{Y&Pc;#4%YX7i|wdUJ`*6VSWfEqZ}74-1gJK zOQ+@KK4t=YsI%}_ygnqyG6~g%L_v<*gWNeBY8Kn4sYdg6zkH2xJO{Bd9jXtLv+4II z@i0a96sLQp}Y@Lg{#i2lHRGZWx> zym*be4bv=c;-z}DX=^$F`Uo_dy`P#qInYg&;_oP7XA7iA7$bRI-e^wNB263) zTmZXMhKxe0L{r2Wyv>^#Hzk#P=?$1AQ&8PmK(b#uDtGCBq#>Hhur_1ay~A>Q3Z zG=@Lr*;gLbFgNwcg$E_@91|`)RCHx#N#E2%ANW)+#6E76K!|Irf|z$P%!Oxv_p%Gz zixY9b+cPI)7dWvq+6#}}-RdvL>kUW*+~QPHWYWovPfWCxkfD(!l`#AfvwcMuP{7dM zmjLT6NCZBz!NZ;d9mQpcpK&R&@(C)PDHMrLl?#uO?VI1#4wig5!fSS33MI*VLa2cY z!+S#4J#+Oax1Op~J7@xVeyEcr4>2W+S%^NZN(Q3bd+7*1fD7fv5HB&m6K)icL1BTD zCDjb=j1u)7Rk^5)M+OPuTIy@SAl+UCq8Z^vN!IRW6nh=72I0q@d zw617SyLXTV6A8%K=b%E$a zc`Ebny=8L9AO`o~bdHKTFKR-Bpbt2L%{nppDvpE`mDr4PB-Jc&`}jmod$A;StoJs@ znf*`ow)c0K#yK*?XeUZfQVbG>v$=mE!uzigH0b82cQkZ!P&0>twHt;)aO5MXXQ}#4 z*~(06AW66*6e)5tbVm>?Y*>;6Hl^HYiH+qLg*Lc{hi|FeBjZPWpz4RUeM0s`<9LJE z&C&MX;srAliY}lhzN}dSZ{<`D<+&kB1R)t*`{&x+sjqKdiJ97eNMjez!mzxOehfkA zG;@Bye)Pcas)e3~H^W2TKani(sq7l379Z8NXmT_-xYAuvVkmcrVfbTvZ}378|HiA( zxV|YdM6Pf(SZyt_W@)ra#>5(v_KJdJ89?Y<(2_-*)TuZflJ>gKE$L9;tHs;iUzZPa z_;I$q&PzDbNfdRr-P0XHoK0~%Lig|ruE$P9^n-}w^%m11dHK!vugn?vJ)9r;c)KDN zkPxzqX$y?ZRJ_fyr!c8$Ey7rodCKth_eB}bCEQLo?iY2O1GFqyU6%E~l%=7@-!31J6p|V6U~{~s z*yGfB9vEi!K&t{*8KM}jD{ybo(CvyQW?ziWXV)0VKQjE5UpkpPqx=epiOPJU@_Hvs zdRLl5#_@tUo*}#AY4|RNpRy3+crlPZ>m&;?+Ff8yP+qbS<9LX>x6R7E$e--*Qgg;M zKz3q7LBU^T_OO!qWG+cpGaDIqB4&eBF*V%3Dbret937sl#RK1Ho`|CZc)ZeSytE}N zLcFwp@Z7>>7$#;KSI!st9f>zw>1lrAJ+I8^7{q=&%(Tq0fsepna^WOn_y`098;9M9l~ z$<|-$3)nOT7?62|ghD8QWV||4qMsZ{D7Cd{3Oom{wEUbUIc4}U-kZ64?LLlwIx9jx7wWQ*3D9cD{CjP~C(u;Dzj-scdOkzVtzhGZXB%AO@9D+q%d z9YCphq>SYe87(7q!_7d3g4oZIUSklxK%|5Q2lSSfa1>hP4aqoO^wU#Rc8wF$bZtO4 zjz>JKGoGXWO83(HA+vjq4r#m((xvr|Mk(HTh5aMk zk4PjOFE@*m5t5^uJ*WX1Sj=nr!HOLosg97t@X8u@<_MZUhGhpU zh;jUMjx5>D5%POGGvXZSH3s+QI*s1WF<1l=0@TQ(@YUuEzD6+z@0bhOBL7WCL|T~f z#-}4nhVcfqxsVr4{6bAimLrO*?`Hb*(1e@*T_IlYQB9v?5;#% z+82493CZJ6r2yk12alB?TUh?AxD8=>EA>Q1;5xm-X3XyjHhJmj^3_IX3Rpz1N7C)k znbas<5-aC)kK=(j>#!N~@tLqRM5L@f3@zemUec@T0c&1~B|<#f!Zx^7Z#OF;p(M<| zNks0>SRMpgDL==XPW?vvRP!D1TgzEZUnG-}Dl@wu)GCSi?fGKosPooq6;?xXExm;% zQligzU}*>ICkvrdKyHcwMiMD8^3r%Mjcg>6Dd_TUlAWiM3+)4HM@1@X!cPCIzZ?(+ zw0_u^V|s$KgCc${|9gz?a7nPXGuD9nxig1qG}jfQ*Soj>UpxP+|- zs=m<_)#8beKE{%#q0na>3wUF?%S$+~ydC78;c|=BaZ++SV@RLDBhXPcxE@n88~k{n z{NB}~7mYV+qO609NovYswQP4;Q?ChAanB>n>&D!XG6qSz+Y+d5FEB7Q}vz zEW{bd`7D=P#fewQUsG6uBx^L?_(pcub9`q`S{_vpK_-E53A$GpmSN$LUj!S&^bki7 zy`dP8jUWq05A5c3AeU7X_`9r{`g$@u6unJ-MNyt*Ao?wg-8Z^}bz!PFUJ%DK`1+LA zMYsUQ$;r|h!XnDt0IikXTSp^jT>uw_5jEVCvr?4rQlw3;E#d7>Gm#;LlgsYW-X4VF zF@y-2Dph~<5+)X=l1nVh#NU%z8Zy*PM0=81M)fk;TNsZOhms?RDy8U(j;6!%SNki;kIQu>QyWwbEIWf4Xwqk^7iZ*y zx8us9=frVNc4{|67GR9nt=GL`kxh&0y}4c#iL5kgLZK*iW@FDugXQ$oj~0dZ@Ec|} z2{Ge?!zR5QRRe(SN@aC)u8H}7* zfD(_R_DMKVFzd}vsQ9}SY(htDUgjPVLf)4U`Lw7ZzQcQMAoQ5zy#N9OkjFrcl*yxV zw=+4ls;TIsj}!=Cqtzf~?qFx6+lelYwD(kDSKj z4Ju8;FnOicSr(oWLU=12k{b2_n{XzU{1J^t@ob%(0H;f z+fT^>dS^s5M8%5xLHOs!_50KaV@`O6&d6@l_bs9XY4&i(7N?z8nGH6=tvvj6|8{o&YIwE-p^?ZnyP4hn^{X`v6RKq~l zK6feYRtw`f?lQ-w)&XVE-&}tIk;r`t&cHOpe!S;C%_Q0{BPgwLnyU2vZm_7FRrDWF zbS9M>oZ)3lb=oAC15OTxVhEx!BS0uJ$Mb5U88o6AO(GRh!t+l_#bjzHt+hAfc-9@l zgqce>PCvCldQ{KL_%I$+4|7bfXhwI$QL8Arc@oI3H}wfet=A8!-ISiRLVdzhd)TWn z6KP#nezQALRGV;ss*kW-TtAW|B=l|tFr^++rVDW+U3%Jdk!vC<$!iUbI9>v1>e89; z$e?$M<=wo&*6oDo2T9O7uRQ%_Jd*Yz<~@f7NE;}8GaWCQ%JYzekwwHX9NlQ8#zBWy zG;r<~$2eYGqo1Q?6_H{l_S?c-y*MsEFn3A;uLwqNK4F*SmhK zUJ$=A9ez|VD6dSDk@vm5xQ?nt;+yy{j$`7ZVxjmS?)aB;I64zQ3BJJW9YsH%aBHsY zy;WFczp^iiySux)ySuwI?$)@wySvl4G*07A;|`5O;|`6xGtcb*+I#Kuo%?dndbm$F zFb5f_RE?^Pd{kyq`Gsc>lR#5W5OQLNhE~vXc3RA~d^hq76)*2=@JFg;pkP|FKT((y zr$=^-`K>1qfE_dE5IAgPp_|&J{wgbP6)TABUGscjThX9Oswsj6-!cP-Mx=7qv6^Cb z4$DQy99^6{X&W_NxH2$Ijk?->4Z~&9m^p(y5wJdvNuj4jxRhy@0K5Hjawyj4jWL$j z`JFuA1@EXmV=t@3oaHf*t0ZDB&xF_3hAGCp+5^RoY>-i&*Z-)s_F;OWlLd8aD<0a> z(q%AnpOlJ%LgHSF78BxF7}6@%wbW4`FE~ZeTCcE;B~0945XOlu^8xLjg{g2HGOZ@O z(ObP}yx4YflPd1!2do)|)Og1~v@v^%;5LmBRf!7SP~tJ6LNe5Y>&ju$r(b<(%Vcn> z>W9B-0K7A)v$|o=2uU+Y93^Cv#PFroh|@+(G$%ev{Tq#tQpEM zsihw3dSUl<^W<&IK3-tO7Vxcieis+2#US>rh)OS6)0>FN8*yJ~J6kFc8LTkd% z`1)8TB#e6|jU_?0cO({yy`+0*A?c<;z?b0Y3Y_p-W6$+DI=1i)AqsIQG?=UvI2Z=T zQMlHhJzI0*G3e+Fq6k7=IngKZUT8t0LJ(3izu~rS@Wb$w?-#i`B$)5&yl@K)!9{>j zG=UUz!xP%rPzeK1{|v72cxQth?uRhAI!0SC8ZX}WibhqvNXp8TECy~4Z04u1vxRo{ z7iS;f3HZRP*otW>MIVJvUJiG#`ts`y{+A9HZ-y?K-s3><*iU&{WF|cLpOz zzcB<2#mfE6dsXyNj zblW_1eYhM_%c{YsLXTQgj?jn){Gub8chck%H9w|G;@&Ao)kdvlo{V<*GgIABN{h}J z6_au?E&PCS>bY$IPWv)RkH$6WBRg^OYzk%j%MRVPDxM(H-OlQ4U4!dy`Z%neO#CE! zF^pf=xgG{eW)M8IRE>K5$rh}uRhZ7IUI%GR^4Ktvg3g|+EjxHz)Zo#^=FPDUQpqZd zNvWv#9XtY*YpKE*d?iudQtxY~O{EW&1&kCi_7T4D(6#fU-&ZiA(TGM2m${LXD3i&H zsm6X+2$#!p#9>GCMXM4~9{j56IXRM?nMg)wo?Cj(wgo)zc=xLek@DLzdr*)K=v6wt zml*On`#v}?MR#cJVwS-cbBn7vo5qfyBsXVj1SMeFA|IT(^@z@^eLjgyA8Mi>3}&cF z7U%CRO?ISXvkO+S(#xsj8P~B9Vx20$+#Gjp;k@BZ7;L#pN+}$XqFkl5s zZ-(im9lx>UuF;qEZZncoOAV7kJ?&>-?kd*G>X=w zzNa|%nRU%QX_;ZGl&rY+;Nglf5{-N<{sGf=7qh#3EqHFh%nYhsoTH9lzfsDwUIn zdB6R3;C28tzp|(y$|*R_RjbZd98xEMvpAJzklGFrcnWo{iER&tqIjMtv3r%M@X!_1 z`uOpqi7{|!QH;zCGrz9b1_BAg+-?GSb%80L6yf6LtAXixe<4Mp0U@^QF<5}5N9k1f z^OC1Erm>!2{Q^^t6!qB+B1+A^exX^{s}tAR>*UdJz#MMa(v7ArZ2vS z##V8uf$W=vqeIyW&c7yljY`EG^d1sNyKtGXJGg?yn*l*g1NP#jrLLlTYIOPqpg&Z4 zQ_XSwpfBY#9+kwY^s-X?&*K zSTVG(rT^iRYS(U4N0dKY_?`=~LOwW8M7GrS+t{z8J$n+;P&<~p<#~@_?Jlq5I(=)G z7h5|~l{<-LIt*X2+?ImvYTAk4%RL-CO_T;?7Q<=GLpmQSX@AUt6pt+0V> zlE65G@F*B)*GsL{15)>J^zci!9k7eL8n%SU@o?UG+q{Sr%W+HI*iuwaii^KNzy30S zZ#NC_8fDtcdY>@gTBi6Du*;?}t$N9jy=B+)it6b0;MuWaK#qJ}s8>I)=g&SDcjYi9hJcRhb zz4`2!bcZe%t9o?KICOI*Vk2sD+!~@W4ctoeHx8L}fv4R%Q+MwhDhh;>=@qehn6vFtwaVA-Zn#GP)i?!JQ^Hg)x6H}V0{%uN$4uhxVP0J?XYu-R+p`FDI<=>ta!K13T zS9OO%-G$_8PD)fqchBdPK(j`nP;2$9{=hu5YnujulS7FZj9J17MTee4(x(44YN4UWI6w=-PEcNl5R*^EpXZtpyDCTRwfcJ|bt9V+xY!zELD_Ks@ z??>w%tl?Y71HTyS11@RFo!MW?7_vICt2ZJG+5&TEM{^CG;X2;l-C2lYE6@!e$rmP*zIgD8Ueee?;m6QOgH@X7BPVl!kaZ zyX-z`AJR)a@vvQ>Bsg+R;q`gIYq@7$E=mA0O4I_l?=UWKsI64?+XbzDX||>)dmGxh z!nb`(kN5CX2OcFx4L&6Yl!rN1I7xKoj2^v8{vk=nU{@)4CElxuCfTGPWDBDecxmt8;FsdYn=0OMP}{S zHZW!-j%;JLRPzNSJysK;i)Vk-x|);3uurqj8Xn7w=f$kIAP8+WLwIFQCmERuf6f{7 zkvU*8hmtWyST?4=1$CcZ?7x2BD#jE)6shMxXl2OIdb>-JveD_~skx%|ZP7-{qrllk z)=0EkCs^mXh%*>OQ@M*ZS3sFp_#}9w+!rdXk4i!KS}dP=BaY|fyohn)U`aF^1d?iLegPk z3T14v2s`{-#fAlc8EjE=qmG#}TgeZ?UlIc0%+)bKs7_QJZ%v9Q^3d<`j#~pa6er|F z+1!COOl35SX}N|5Vz|JN;*;?-RAqi#P7^B4R3-oKZf>3$xtkOcf4tsqHUJZg86Sx2 zD8kWS=TU2n7xUCTIwr(5|YB1DB;p z{XBg|VxG;3)Za$YeazfT*3HTr(n1xL#8viM-x)DAj&4dvaseCA+NB=W8=1&KPf8W} zikoO6<_V^?oyN{zdgD;KgheEU+CMPl!&rU#rydF$(l znH5#>zGAE$xA#jvmRJ_KZ~2@rxGb$%P)3tg8Hk?6(ygy&S0NDViQt*$dzyh6hpq*7 z4`9;@bzhJ#456D@pajdRE<9`%TC9xzzQTCvgAP+QCQqN$tQaf~Z& z-#y_hkAxj-S?)Y~6*2nqne#8va8^nf~gY0 zx9fAt$Iolaxms01iyK{eiiM*L#!-X@B3Dd5on0HYD4_uMD#nvzuh7PY(cZG0LX$rA z{>hTD*U91DMIO_aFEA-oHpbrb=tXI zMIP$mXWa(NIV;^d(XvdyfeRBbM{;+`lG2DYQn+`tgnx1%Miekv$@lnikP$z2@J073Wz?aiN}bDet!k`jy|~7-N9^d9JVD@XxyU8 zP$5qo1_z0y41*#w5zHde_)e zuJkKhY7S_FC4*F3JHvXuEfU?K=9%PRn)p8T#%K51T)sGDbPNV6+k?F?2$2WwdULb` z-)7*S^>z#HpSTknU4G^T?>UqMDsFb)UshJ-N~)wfvKPS4PHI_;-ciV1qME0riqytx z%&GCH$%@N|=y)|}yXoOGlS)aAhq+tEuNzk~HKiTHRdY>AP3{}ZFnqiZHWs7;JP0|5%^W@-R~)o$9fc)pKF@suYc*4rjRFl!&q%Xa+T zU{+#QD=QR=HLd_S9@0RA4UBnL0~z01(!wJ_{&^dHZg2<#_b^8P!%t;N{&iB2_GQD@ zZFn4f(^6@wR558pFyQy303RS=Q?GCfX z-i~x{Xo?6a`15e0U%e=)*1W>pv&cg~k${`@1M#>T$^1y%VwvDrw+NwVMn$N;wV3HJ znHg}o4FmF692*Q-hMOsgcT3H-nUy_~B(-%9+|C**}WM{#<*|x*+9&Cdo;irB_+u@A}!FYM{!9lp~ zmhn9IZ>wzfIx|`69nB7Nl}E45hRp^}JKQ2yw8dVNZDu>c~Wj95Z!sT^(rO zir=!VeIuBawo$!|lb$RjZlXpBmX_8`rN7!2$riwdw2OdguN` zCUnrRzEchwa`U(e%cB?;^m9XJuig25d{2L7o#T3@jVabjPIL20zIXyGfmRs#UX;Ef z#tIcEDY~fNa1TErEq-#(PozAKS2 zWbR7|mtzrGw#LXA`y=%S+|CQ&+Xdb4)IE$!V_Gl8YQhm%IXGOp00v6_%xCO*bHaPl zmbG7BFgip}bmWy<1Q18ACSnf-AXTJkUnl2q=0|BhD|5z@#GJrnjtrl`5F=?*mx_*; zPs|BwceAIS9`9Di2P-!cd7E7@@oy5*OgX`cB9MaC@?%{6h4fwET^5fsJZ2aI&eYZ2 z;GxK9X0Qdo?B&6fVp4@WP$eA8XAOFOz}YyQKcJ(P#c_y=Bz_NJlyk(?E+TG|Wj(j< ziFxOmh%-!;2J_~%km4M9+#Xi@^C|9!-^%^96ai3b%l5!4^C)=Q9A2TuN?`-_w3!;g zKwH|-I+2w`w7lTnk^HrdQ!{CMtv!a$3+p)a2X*5)`u-ir8xU9&H%uqUIda2`W$_MW zT9t*3W*>-grHLnIxL|KUMi9qKUc6T026nX)rX<2Jm&iT|L*(5Il?=CjFUIedZsj0 zMyho4cPan}Q{=_$Xk#cl_jI&go2?|Jobyqr;J$9q%fYgYEb6I@9`X%{a(aAiP|X^& z@~RVRePtM~r9_CdjQNLgoRV{BaxmV-o1Se*xO45U_&JgjHJ`mw39|3(5DxDyh5@cW zdgX^Aqc&2M%jtb%DV`o9_UCQQd{Ls9_V2MO(BvLT3~=YQw{LX9K#+t{UcdPI7_lYk zEzFF4OCH^N_$pW*w!~_hnrJ`2riAjz*+tB%=o6%Fa{qFZ?gIs3V7yx)FG(*yvXSD7 zHGNjW4wc}y^Jt#VA7*|=zaYF0!-xn^4JL>B&%ib5h?UBfb_i{vfcsO;xPgrAIwX62 z{fC7hlpFhq(cwU_IpB1QRLuLKdUAEt1}r97G2Pzd&kr&q)Mc18Oc%v(Bn8#;&BMF* zo%1fQ4NRrReO;bo~nXw{C9Uk@Df?r-8->L zln(Ic5m%}-jd|PaC}+pXiP_ut=p)-@IHgPX2}|}Vrw5 z%!%ABExJJ!b?c%u){@iUQ$xidPnIt2EBof7+)lc$ZNvt^{g{+kL$FzcKE5}r^^!DN zS_53LJxoS@c*1g~axuYRcRf5`!sjBr>TB97I#`=2lG+itW}pm>9eC?d2o{P?y?y*> z{pgu88LXO~F%6^y1BNk`TRRkT>$OR!#vfpH#O&zFwc$9{gw2UKxQ&wFWutOwGVR*f zxv-8IZp93%D-S-9Dv>B?U)75b2wSw|I3O6yLlN{te}O=%p9qS9RKK&<2lTig!9)=7&f zZ4S{M&ASGb+(*B&e!`Fhofw=~26UxX{HiQP1SU*JG|#32uw;~0;HgOvp9J=D=^_bT zyX@55k~V(nuQ08?>KL@F8Y`+_!LRhNZp;hxQG#d%rt!`R=XfRGeq1J$v~(irCbFV> z1XK`~`NIu6XJj!B&iIf=KbZ>RCQ7Y{Ac<$oQMN|vlrh|5WazE7b-Ay}&=R6g8Y2Qy zfgx6|x%8#^&T0AU{%|2#J)xrJWRl*;86)F^6~w~24G5dsQ>pSI(DQ^v9Gmw%rD(}E zag_FB92AGF2(JR!8SkW2-;tQLYl5I-ZkR+k3A4(9fxbYlY=_qe5pxo}F61_~~7UQnst&0fK+-H(K#(g2WC1>37!Ds9l%8&-TgE|shJOA(v5S*T6C5yPO z{P-Ggl5meljUf=rI+@8cXs#s|$AeG@CCSut+G~k>j=XF&xBj{Qn7H2eBC?7)5fmuj zQze}GlN3XEq5VL@@bzDi9@u=@z{9OtJ`NvGfoD+Jy}bmy-RpgZRvW+FQv*Jr-#%LX zUsH%l@{b1}PgMX%fya@P7H!_I#zxN-+c)4UQh^(wKUshHzm5Qo;PD3)gx8Q2ZXT@g z5kGrB2R+}N_%2$N0aM8BGYB=o#!+Yut;&H%(E5EPf%A*+(?^x@pZsrZpSkTJjoR_X z0a#Gi3y-JF?+M}`FRi%CtF7uY)fdGG3CGwKuhD{PlI7FC%@?LK0ztOw+lW6WAFqT3 zI_Jns$I(l6YQm`*!~p@V_B!2;*6=NZf9sHrVewnQw0lWYpV$ZNExwQdK{O zPSqqRmxi@3q~>|&-z*_H`*jvL9&$Ih9O?7D1ee}Fj=Svs{hKbXJ36C)js;(dD(jct zHg(?QQRzt|znV6-P7+GlodkH5>ws9}g3qsjwTN}Xi^00n$CHD{i8fXz54Tj?*QJFk z5`rWE^rx8@H<+NW#JyeFZ5@&7=Ap^{*%>O#K*&ixGz@l!dX-3V~@QuWklz^ZyO0*7~680HmvIP16fRk zDv0Oeid6QE`9vIEcpvKVE%ETm1ngp)GqE3Z?o4ba=JCqC2y+XW1-vBg_R3u-EAGSp z!;x^*?@_Q$`Rw;ayxqk%y&vFG!QhTy(rX#}>dVRC(lokvSr`1{pud>Mw%>GrlkJVO zpOc55RKRxNG?;{k@DHcYoowNq)5MDfVgC=kgafBT3U_HQ#8x!Y_vi)`5}EM6eQF`U zyWxUfbnzpO;e>~gUkl24@PPXV?Cp<7!$tP- zuNn+%s%P$3GyRNN* z0wCf7P|a1_H>Z00pu8P*v4*`(l+adD?|$!hAd=Xs{;|k3rCjE>4Rb-fskiat?sU)= z2K=}X7=thi7#J$BrTkq%=>FpPkzoF;PinXTc@Mo&ozdVOPp_j6=_CI#6i*+_w3h>T zB3XtZLt*e~4%isuVF%9=)p^B*kjg1F;Q(x|)`Cv6I!FG=GZYcl^Fe2Rpxyhs zUJ4>;PVo9=boM8IpV3=AR4BrZ$Wyj$>)b^8K^{@#G>z@~$C!z}_)%aRo1gG^^WF>rm;n!AbD z(*KyK9(f8xpr=-0;RH1XU+pt-+I$4?A>?b`*O-UGC}np#bQvcSzQ}jd)j{*=ugqC& z3q2j33U_n0y<`5-v^g&&`i0}V&XY&VuUpP3VEf?AnLwTz3Nuv9L<*Ll= z=V;v#^9SiNWw!^ypSSMOT~<$|+zR1dmndqvw_)zrIrq!ChuOUu*>F+t;B}cR2XR#c{yCZOQn=@6^U$%$vym{UiN?v{{6YiZ?9c_D|lP~MNn+ePvu z_I+sr%YhYO;qXCz#3zvwls}m2x?!!Z2QT=(l9K&t1x&Y2NBY1L9*%F=cV+jW%N`Tj zz$UidmD~%o-a!7T_l(@vF(=MYTUykVzCCVj z>1o@a8G0hw?xtef?_=0;UDz+U!_2i)qPfZ6I^kP`AuZFnV+YTpUOE$+K1D3aH#1N3s!5VFjbeRGTb~9;f%BT zfQrwIxdCaO8?%1I(~|;pu&pdqv`ltSrK$k!PgNaBi^_)vz&L|nUsEL@A_dLmVjNJAsi{-`T8OG z5qSl;-*oJKN4WQSjn9KX8X-`=!9#c=rfbEd*P!U&S8f&)_AeQqd#22vsk;qk1 zDt_-#O%dhLSWqTO4*l!}`Pi7d@CDTOy5zsgk1k#XCS@u=*#NeWEMl%CC12kS#I2$A zPNx8v$gLZQp?x8!7WxLGHL2!E^=FJUbs%R5ZPx%MDO)rZ6g$Fd4RAmJsA}evtoc_;U%<#PdtcZ9{5hKlZJIIiBnqmQO)R7vI0FBShLnw=l zZ=J>1{=VnfzxwB~`2+2Cs=!_&YPs?vLj;@7O@W(eag{%va19*F{(J?PxY0I+*2@I4 z`CA@u2`FCPlX6o*r(;aOe2*zdOo*7pKMJ_Z6eH?;>5mePJWPQqKW#?O3JH;@x_iF9 zk$e;(BCEZG_xC(97P9k}c5Q!M8aFQkUoZ68Bz<`G@Jo>!?D`zmFPgF^$K|OmqII0a(%58RzSe)n zJKRUyb+K4cWrf8>h#JbK?P~xbJOj)x8U1c=m?vT~Z%wbqt5}a+i<}=_5vP4Diinxm zdcRbnWi(ikkEbZI7^UYyUu>bZs4Gh-XEZtXugYs%0wSlS zT?z&V=={&qMUXg7#Kk{Exv{mERm_;K54ey8E&3#AV=GaVtOnGyeusDr$j?@C8u~^x(LE(iH z%x`LMGbZ6@gD)cM7MbLa;yU8vMbE2H8XylzEwCVqjMg};@2Uxqfg~6lA4vKyjUVAi zi{V$B`&GrzTRW~so-m5{F2$ZU;GEz-;zuv+WMZi~bp{NlS547d2Oydr>r~8%M5+=@p(7g4# zGJ$A!zq_U*{6`DYNGx=K!0%Di_ntjMWG`*(8+M~%Yijj#el>6zwPSPIVa*O=Mhm52 zm3?(gDnXuzf;Ckwn}$At1nz3{2)6|yCFjij^q00k_OADBp>+x1ig-|zK~RO@VlfrE z;1?I6w1P?(W_`_3c=_S0%mc{Xks8%PC`;*NBoT;P)XZ$rNqJ2)w$x z0|~-O3%-P-{GKlaaM1g5BR24rOXGkK7N2D=4F|$nzrB8KytfLIX9RJHiOFXVC9Sqi zLNAly35x)k{k;qAJ*C0Tr-0sqqS>47Fj_3IyL;iutLwT~gRg=$69M6pYk_n88DGR2 zASrWyoAK(FuCs|hhajXCBuQGSNtb=eFFgoNu%Zx@6;CG?@^Ct*9avOXHwh7IO;{E3 ziP7m+mcZ43k{cW6E2!8^Lx#eOyjVc`N_e zbmys>7&2Ug%hN|JW5nz|T;s@f<`!$l#vL|fd>z3@ZRGIvfi2+)x=o3;pezyB#M@r5 zJ@8QhP^Aq+R~W}(G(YisM<-A8`BN%vg6mGp?m`}bOE%DIO^_QjyI{afV5u;}|8`IN zNJ=L#wt%PO*+Y3Dk}-5Ubjk4`u)UWsJF9nw zW<{MN8%N|aslj=@hC7VFV{v+>QoB2)t1hEn4RjSg&`KW1JGpqyLAhdMhuM#|`(or7 zmTpycl~`5Uk62$L?B}zlEut*vNqp?Yh?$KD`kGVvekagba~}>lMn&57xcf53a9lk> zkY21(>GwNd6-Xfnu9WR>^90GzWOO<_zfQy{ek)L zqw;GxB=$Q+F&NT#BUl?kGj0md&glm7ae=E^6g5}-7 zKW~gZ*CDu)iZF{szr}8C8g)PppSB@F(OOC)QM=0t%e^I~2axd9LTULPxXzj3Eyq(3 zJU{Z7B}LNWY%8_$<7uJ=-nA5E47DD&qEt2*Z>Y-k6Zbyv#^xyBe{gRHGCn1Kgrb#Z z=rd5JV+4`~yvBY*ZE1o~XoFvy`@k(lWPJ|Op%l#WNK4(D;{B|8!oFJ7cBLtIO`|3n zjw|IWijib;Z@7R~QrumX3||+>tL+oSfNnI)+Po#7(UZ;U_P3~&MEe}MW8B4xx&HXW zUII<|!@q&KZ$VC(XYK1qb^~#MX)ui$Jpw%|jWfkQxZ%%;W3(aAYc%u1X+kVkUdVmT z8B4s`U*JN7g5Sl43G&;@SK8zm?p3m1#Bn9@xpg~4wKvJ&gj^Ccz^$!{L>j}FBLtWT z0r2+;P|CZKAe%!ct43hD8#~O%2Q-v0M8{bM`%;HPL{%wP8>U*NNWTNK2S4d=NK&X; z20m?5g16m&ydovs8tq#=c75sYT?rheY1oc8m|vZ)`W+{Y5GdoERuuJt4bcQTfcCX0 z{znzau!}ecip(Q4=R`!jao3JoFxs$?L?vW+Xpp5@`(43g4zagQ2UuH`a}B3g}P8& zK7=TIfdq?cn@F3YCVGqxtoTDnyRH5AeZs2tU%J>T%I(X60u(%QgMP)S+*1cN|Orr#tG3`EVH$-z}9Rtnfl|k+GLLB0(3A6~3 zjysJ*ybsCHhPq$27NOT6FpdCZXF9kKLiz-&9<;ENT#{HnUz$GijBKUsUREAgz>ocT zhc%d}a;y?P=E|~^5<)RDUua_d6xv|55YF$kl>uZ(6DfV4R;3AC;W858zZ?obXs8Sq z)8W5WE^TJ>?$05|REi#dk1?(4aN8?xs-nHC-|ryy{`OR5ATCIJbdFTT9Zn*8`qH!| zvxTL~z7AsTra~14`|c^0C6+f`qWemCa=(DQ&*pn!@;_>POySr zt*MvtX)P6|ucDdR%ibeRbE)GQ0sDD_{Atx*_Obo*es(Ft>FwV4ElgwH2p{D8c%XF> zT((UTWiT!;5JeY=is8nfR;c@w!J7O+7e=JWZ5zAP{)1HodHLInJO>M3q?$b_AFFZ@m>YORyWnt(g+mNyNQ_lMrbE(A zCtyen@YW|;k?uAcn%8qiStzE>@J-wKxXIO;yJO0f85TA~bo1)Adc|DFnAV)Dimzc* zkN>_1b0+LgSJS+V>#|08@+xyStp!!#@Or-ndex*dfOH148YX76mM#8ZWF`$4Ji;+tT#ATE+G zoc~BH>h!Fyb%MB*z6tSaQp?GOJ8JmkNu7#^YiBMc#V$bkdpJ(lsJ{t_`r{jY$+XUC z+#$#;k7yGS;$F5sAGGD{K~QDgtm!(JX+@u*kr4d{YW=D-gGNFD#<#LV@1PzJsnnHJ zFiYBL2_CQdZtd^%HUwYaSWs=$0&QOw(7uI7n6cX4nIgTl^to+t@=%vH zzDqucCAfboc*#gVAA6L`K4(cCD)3jyG9xsUt<86obbMP=ThU9Xj#xAU+`HEk-p0^- zrpaq^>EIEylxRJDTg^9biu96!Q7~O8wWgM=VMT-&k`Iebak1v&=3`c8fX3%ywA7HD ztVUNZ5i2&1+`8(^S3;BCaF)AmuIMXBh+Ns%2J16HxZ+f9Jcm52BKpRut`rYjk$*^{ zatRu9_Z#&DH?loXS^t?)G_?z92Fcmpy0tYONAl7cQxRa zB_lCjT*tI`gJCjjVjQfDP*lQN%0fq{G-{{Go80V!I8v zr9r&2!2G))I#lYQ%VC9z5EdkfOSmP|w;LFyco{uuCvJ0X{Ul0ID(FH~s8CV)p;r5a z4pK7JQGXyNy~|`6+Fs-o+J;jeWoV!GNMQ%NyWG>}GXtni1@558 z+Tozc^@a4E>7B0O)rO?UJjuuk{LVC7IbL5!(y=V)P@FD7TcR$a_GVCUJF0qoz|cGm zG9WK{VyIZ_c)`W}NUpR8{5q1p!ZQ{uTRI)LEc9DRj`NU)A|b6VaXFVmKoikYh(p_1 zRT&t6)upl@%wgWF)nK`U>XAR-s`Q@`vYae7j91i>nL-P-Q=KcI%LLT3-V#x5gd|7F zeV6-=A47&9DyPs`7Ito?q7HrH>zun#W4;jWQk(^X7S8uw=nL_(zF3~yoj&DSxWx*c zbno!oEPHKLfrO$?_xIIg`?%psva&JZQ5HU-mkenOF?Ibf8htqIZ|8hVH?(L8UpT)1 z=ocPX4&-Z=mC?FLcDc(1(+rUB!JzT!(K->F#T_NVop!& zrB`$GU00DFPplS%7t1S-%h8*wnhe`qj9vSkFwi zr*0&E2~OH;QCf((rw8q}GDL)G&)rM}5v3Tad5|lZh2^qlE=ECza=b)Iz6lBG@=%`C z&JhKpBp1CT(|SG@z#3|3l*d-m(6-LH}Dr{?pQb8&VG_ z>R^8W1;YQXz{y--%(f9YcI@7Dk4ef)RpD_A&Kxmg2i|NGH@d&?JP)2|k0ZY0d= z?xt@4^dDLKe>#x1jrrf&JZvP)G8Q&g)@~$hoLv9=y8`yff7vHy14P%ca1nR3cXD+2 z+v#{nn5As&+$>y3m?gwDBrMDv%`HfPw)|I@2CM>hKv3kQWTikrK|w%dfIlFBT@VFH zFB?k`5Jg20IuH;L7!c4%8xRO!4p;>Q5BLEA0WSmv0SEpC{aaQD_HSxyA^3mi|5gS{ zy8z))v37KGbhUPLB4KA@0pSsoRfPB}4VeDPQ~r}hStN{GO9W|zI1Pf$I)4@m0Q>|& zg#ij_1qUSq0Ye1^M+F58fe-_q2?_d7`iBj80R;nxfP{jEfrWzyR%k&10RsgG2ZI2I zg#7y$P=6pD1OgQjjg(as3SHF%n#>u4EjYOdhFt7NKc?E;H3hq=O9(6+7B&tp9wiku z4J{o9Cl@ylFQ2%Cq?ELbtem=rrk3^>9bGeX3rj0&o3E~J?jD|A-aesW;SrHh(J?8h zY3Ui6S=l+oC8cHM72hkX8k?G1THD$?ItK=ahDS!n#wX?%7MGS+R@Z*-?(H8O9vz>Y z{<*omyMK6mdVYERYZtIR|78~N`Y+4=54%u-c7Z`afI~q4wF?x?^RMBk5Rjy-P-vp6 z&?e64WNg7O7-GpqKl)+G+10KwORBmzvv7`0|yR2rtmy+Q|-vvw7E$TF*ur0r9Zy2D(*T0cCqFB{Gr{dZ5D|m1beTqH5Rn8PBRsT8rTpx?fznNII1%jc zVA6#XhljGOb91Opa45$ykSBsSKx9H=8J9uO3r^?rzDF8AQ6l6SK1e-O;lxaEkRwEp z+C=K)Bk)3N(8DA6TS}Nnv6^&DVtf#1IuJOz65Ar2tT31%u*#@Wgk+c4EYgiU0;Ywv zxolj-cKDeRfG4rM)7^X|yFKZMr27fpaULraf zTIE`9~R|J%ukO7UeXH>BuwcCix8}-S=8Xr9a#y< zW7wCmNqCvyRj56@qM*=Q2s0^tj6>Hw(uminiusK%9NSnR^SR702zbeEnp85vy=}*dgaA9K@I6tVsvbC4wdeXf!hk5iTB@`9w}8FvUHVXsPbv68*w z#5Vn4&R{X5d&6pV95fK7IP|*oGDGbmATIp^&zaCeh0rXbL@2>vyb~b$N#OYCy2i+Q zFnN>_if~p3!3;FBLG4fbJby|st>YmQ4no{`*zxP|Q`ta?>xgwCAIHKGAAa@v-}-x( zyb=`kg6!7^BP780gAibgae%u`QilKPC0IocQo|*f4D#y6vKk||LSbxkAA;gYXuePU zIv!5{>|#KEmXt}}3MrC1T!@oEx_*$K+DQ?c2bYVDEBczm(7{EUrwT!E;NsX}r*K9+ zo9y^O+%gl{n(!3h*F9qDhc`k`e3^$Rh>Ink7!XXWN|QB@ zx5Xtk`D#k-R3G(f;!i&ysYQ7WZ{d=K)KPWco74&p;Mg71NwY$$O^Zy!4T|0ySmdVm zO42Fc0bRgPd=X7F3XS1AM1cBEA0m{%Y8<8`&;fBshA%|J9N2cJJ|p$`GKqvkx)RGX znQ;|@lL3xDQ6rMSg7Uop{w^81gfUb=a>FSo4!58Sm2qE5#8O)|9#zia_k8Q{**4-8Mf2w|-kdR~A?_`jlH|mf zl03ZG4`-r@eNHS!jz9+W>=J5sfhQHeQFbVc^S~x+KPhUhu;lYGWx~O{-JwEOJ6t9N zE^xD~fzj+;X70P{nDP-NW(p#ou%yVP zw>iUv4^Q<%Y}8)SbUD`Vl>;Z&<_Xq#m9S=fqkD8#V_~W3Ae_-Z{})~77@SMgwdvT_ ziIa0;+qP}nww)8(cw*bOZQHh;%z5kmW@@UY=3jUJ+SOIN_gYu2zHSinP_$w6ELVm~ zl1XSMc@j|-C`Ob_l9@d|0N8w*^B;~{MiF4rF;X4zABCv$WHxX4D(tdtghB$`ClXKz zH|3FGFCaI9@L%QTKh|HbiNA9_6|2ewl&#*j9dAkl7UeDJ^%b+?0GxlZA?hGAlIh5U z-4KC597#kJ6+-B9#zIBJ?aH%u=!Kg7>5g+#(=>?+Y-dfqo(NOG_FUOZ76!BT)8X*CJbkbM@iN zLt^(D*uymjF6=_uLu-R)?b3c`KL(QNBXxoeV1~@ma~6l68Ih)un1*r~U8m7u1dHg` zsWYa8nCKfyha~Ig7$mQ9T2nQ{Rt$6xWz;RKf?s00LSFQ}*YVZ1um@D^YPKTV{*~+7 za$v=e898XUgY)LqjY{3CxSeu`*NtV{FS(O)C)kEbACr9NBrr6_eMFkc{ix(_J zRWxK!5Ku;D5eBUUz8Zwj&%`9$j#E}lG)_REkIXX$86!GLj2ufoRCOd+6VE2Gi{m*Y ze9IOr!Bo5?&qhNqAtec__g9oH%U@KCQJn6B*^=^*C{lFM_ubUrPAE%X{JWUEc(oX` zsI+Lc7`pfyJGxk|q2O&c-&|Xhw+hhwS5=NnqC@tgs7qB|m0rPK6-rfH0f{P!QkmjX zjXlp^XD`0LHa{c3D8Ixo>5pEWxI@!E{t(6xRYX_BfaJO4vLvtMon*S?L=r0%3wf4O zd=hQ^xonh=MmMq#J2N5lQ^qla;xaXV#ZWos1>WknTZ$_nM@a)4r6!975>L~HKr zjN;MzozfHU3+@Z}i$y4LZ*-UbHHsw4Qk3X`^PsFezr2W2%O%FL&NBHNd5NkV)H1?S z)e_iJyJ^UB$#TlFWie!tWhra1V9{w&t^7uMUEz2Hthah7=n zZuZc^x42F00bp8#p)#QvS&&?&QuY+RY*Hm)1Ak?)9=`r}eQAB9slx>dj|wkFwt3nz zYk*US)6ON@d958}3%wn_eZ@uZOlJOJ1@% zsJ2%>w2vbwKteOIlk|>MMVgcQj7(^AcA0+JK5x%<0Ab)akx>B>QTQB20h1``Fz4|1 zaQZM#lpN+urg_F|Mwm2f8i3hja?!LteQk1TvSCs{NoYY{DgBIgVWN1zblDWzw8#{4 z>N=Auy(6|XWT0VmI}vr>zdPo{Vzu{XA}F^ zp7q6~Q?+Y1M=~#q`*}i{j8cwFLndijv(dWEFPT&<+6kR??Qdrnr{s3l*5?k5)}l5W zr;elQBmArG`L9mMA*1#YlvveRw(RQcx9m_JzZb{b@%#0gr4ySgn%nJzui25w(2ItN zl8w}}%;S$_yOx|Xf|Z)#8#6yAziz*(AEIYtSJIB`FK14xcIWrGvli3(k%%it(m&W<1{`g!bC@cLmZiqsc23S zPSHdm)DUQD16ayDPteR>XW8&{-MfT!f;%>z;owzsp>?~CXO`4dT>ox#+a$MzcQeN~ z+ivy<>IB**-A3)^^8@YC+a*#bb5FWX?56Fa8z3|C5$&0kQz!Z7s|;(7$TkTvy`J<= zMo(^HyAX0!eD1^j3upwG)`hT3d9$vtx6r?249Y6fo@L)~_#J!-ShO~>B2Hvxtt8ce z|MXqPt&Q@gKB2v0DF5ozjceT%&-2V{tt}XBHW!&I*x%i+`IP|c0lOh7EtQh|NNq^B z-h`>eZRfCo@<3uD<(V2nz11RZp|M;~Af-`sA*tt`@~9z|uCO*=ADR>D?VAfwprz?) z+O&F`rW>Ub*3;Hya2ZNLzoB|X|3#&dtde}AdatVcIe#`WrRS@j+AnxWd{lsHeiR(w5$oSE6IZmrR9w57VY zJbiw)1lfXRt5tWkubhy}i7PWx5aooJc!}KsY)xcmzmjlb^_8q!QFx}X& zA(#EavE$kIAow8i5;;QKrfYd=f5!e^FcB+8*P(0Mx$jzZRz9+nVzs>@tNqg9`!2d0 zO++#`UUj|kx#8nhf5ZJzwp+5-A+<-+z2Ck5RSp?~X!*_ZrU%)f z(-Hdu_U!zL`|_|A+8HY6JN9v;W4BiGs8@lX&Ru@tbZvEoc-`~vzI?DvmOwTDdel?) z(|lDnwQ%G6^3!Exf2@DQbk>0ASLt2-<9!opLAM@~ABx{O>A~??zTfnH;bXVC)7T^9 z`C;zf$F<%u;1|`qjQV<|F&uW?Y;ifkTEf_{+~AOznu3!Pyaz- z2_Ydt11A$>!v8jJiiH1%WHQqK-< z^#;?FfsQ&c-d<`}Jl=u*WYbDSZDlBv7>&!!v&ea5)BMZhg*P1E%}p#=eSL%qcc}G0 z*(Yyhr8F@LG$F7t>3PS}joMDt_e+C{j$KTLPQ&`W-e+~DtJCUpg^$;&b<4<7!%Br7 z_eY-2QiYjb&GJ^_QUhNNuUGS8I}bjaOqP~fnG3u-%a37GbxvhA{>z9=kLFKC&W22b z=FhRl=lejS%7R_{(tC@lV3FQh?11H$pYL0tghsYc`oG3y+`bSA?g{XR1$mIQZ9U z{&wRn8w1S|DJ+N(@s{rzD`HDeq)#z@Sj-w*;u39!!7F;{V{er^iEi$u0RB!mJk*ltLr8zhKwmi}j-+#jS!T>D!B>Ub(v+DL# z<>mI(>Ae8&WTX7Ex(u5Q#g$itD7SFk<^6uZ-kwzgf4FA#QZFj&kZI6k*)W9_TGk3V z?zvG5#dFz(rdwSpN1^$WC~Vhz8>nW`Z`0YSI00k+GW9JG^E+EDDpm=%mNxY9x1cjr zG_B{n##GtCNxW``8ZF;y4qc);fKANMzxr<7G2cWYiwN8(+rCCbI<2iS9ao)uME_iN z7Uw7wgmcSu^*SZNH%|>}zsi$F$v<>gemHxxW~^qI%oZtKL2k61l2&wggYJ-r*6c7lab27xgqi82^yGfb^W zB)_%Sdj2w>Hta--Fy(7!Vtx(b5C3F|#%5BgN28?c%H50jk=@*NC%$F(ZUnm_Uvu*; zcK+4mKFItRP5ZZ{9}fZtKGtnSvV@_Ra8X{`d)DIu6+SZOwg4HjtmFf*M^5q;dkvh@s(+0zM&@~7g&!0 zW$eaO^~}C5kKiVs!n!ry{ZU@JT5@dMizPihZGu}>d$jpf65dO6SZhT``4;Q`vFVEV zcIJWX^L)u@M>Hb^OR%?@W6mx~#pyr)@{r(b(f8YV{n4=UG9e-%kB*&ieBEDkIWnmj z|1r}m2COOlB}8gLYs#o{gf}||;mKWZjN|hbgX)MGzN!*zgyD5A+fCwWpHKGzUROM) z@$!zGsDmB56|o@3PYa5rr^*RFhN28SU6{{cTXoWE_USj@UD=qCRGMeTy1&Y=0o&}_LM=)+?1iCa;Y>EZ=@*-3B9R37ayFR+{<8 zzlu`$J=>mrO?W9Z8^&-;K)+l?aI1c+RibVhld525h95;lIncS*NTMioiAqMPb_rpXHS&b|8m^&M&lE=ah?EDnktQ zjpHf|5^?DX@??lsowq?g62K@sAW5&aEMZ)LAdLk5x0JlXYoMeO1(O(M1u8@ceiep< z&5fc3bJ35!F$jm(^pZLbxP`PR+e}gI0`BO_d=G4k%FwSA`h*|pg#;XWJ?I!2BM7^p zA!btIL4+k^Y@_fb!DtIyjOJW*T_h%*0^v09rvmG=VUPqlqiedRhBB3O4A#*bxI7e^ z_>jaYBU%NnoDpqR{p{ZyndLEUi7Pbmf3(rRb4(eRI|!Sqg0D%|QLvN_=&V(w+f|v; z^xv#mZ4|SGP@Rhh_ERmYr)sz?ac=Aun{ z#(HvRR6n~Yk(h4^(1r$5lbgf`m-+ACWB4R1YUn3fp%cZskI+kR+dTEyGS;m?S*3eT z>?h`E53Oq>=`JRa*J}Yy4k|6Q2o*kxO69ZFF3kxmF=l`V*DSd-0A1;rqVxPBGjpd@e|_ z>YgvXXFi@7y+2%Y_;FE3x+KD|p2=0&;935F`aN5tRpxYwgX{V=eP?H7eOZ2a!#xir zN){1x-m86Hg-O>uf!gc7b@lXkB}UvZE%GVwCVVs)>0)d~If& zRXa=AWADBmylUPc8r?x1#$~F-WV)A&I``PJKTE8govl>?wf+aF%5Jhq7C5ZOk13}M zmRCV8itlkbcFdGZR2+GI7|~_yd%<8!6tocZr+P&UbPga(09A;O3%9af=x5Gc^L-$- zsyp{+gKdP<7>ENSRj&(P7O)G{kh-$4@aFSH&u_dQe)D)exQR1iwMUTyAXDPW1T|&W zD41#v$jM9^x$PlpXHh@?`Ki6rxxWPVHAXFNA#8;6qWen`Y$#2-=JQ8JyxDA(%@*P3 z!cxS!vLXxURmbijY;fc1ttgbrY_bAMllBoTP9POcJdj23+AQd%cSS0&qA@3io3?w>yyl#IB>#&{a=s1B-L$xQ|pLOd!?k?#lkp%I$n9r3AnIJLJQEBcg z<-2IKZZ2l{U6JC401dGqH0d>5z(It02`z;Iz1(ax9|j!qLh16^fZ)R1B&} z8#AHeCVrfX3xdD{wYV!um?4(Lul1es1((XKO(2E-V0TU0iW{^|b zye2rcnz3ixL{fwp<+8h2*F)0wvfztaL!JAb;(4Hq-xk^)XtBAa-sG z+4s4m4$E?9;XZ=x8Nrn@kH0?CHF@d9K1(;jiVlaSgN8W;OIl${?1||D$2%wrquwR!uzHS4H3|fY8 zy+4i-TznZ2BBSQ^ts8}_Q_0|b{nnAMbVD7-qyp#2CklBiJOOd6It&~6708Z)yLs<} zi{0+QW=~RDsJ(a5b@RjSbl^&*hD2^n!(os*X{?u^uLI1o_9feqeAhPG z^HZ=$J%%c2sB3eE)kT&gcd28#t~*ri>+#vh5KHTk=J$fD|t05}l#a>TIgN?UQ*8 z1kuzEt&bKm@^|u~Y9&sBuD%UzDemjskk|r0zs+~~TvDuNFeGn7DtguFmVaIeE+V~j z7QtLMYxM_bTNq4wI+`n>@w@`#gZFX|vabe(oSk^^QpJRwuX>*^QQmxAufj}C&wHP# z6{;oF)`DMOtU5A~5Ka0pp7ny_sr#t0slqxSQp4<$kd zz{C{k&%yofwlBh}A06ei7Nx(o$dXSh1uo7n6p%`~ncfHbOrzZkU!+(qjc`iI9>>eY zBB!p-;6Rt_d$Y{m>FBdR!RY-krZo0fS#7zQOr4nn^jXVnC3SJ}K@W!!I68woLmvPi zGkHZF*mxM*2JD%Xr$87JK|9HSl`SJ1(oc{UaHSmxmKyEY2>%+mG|V(|NNCX)+-*0K zdmdaOnDj$B8!IDatySW)zw=1PQX)k2S#$d)r(*revic8o&z zWeO*K?N5K32O^bHE`kIDQ)*T~K=`yhMk7zsjXP3ZQgtp!W2wa z$q)hJ+)z8lCT$24j6|j*Ws>}pR*u(-Q{K0< zj9~xnt}x|ExRj&i2$`l7P_^u&vC7qvU^SWB$$1IJ``ESxlGelpT{is zL(Gw|wsvTz3xGw`Us8Ks9`7R&9``k4DZTt>&{9v_sPB5IMATRQFJN(jCU>FK%z7=# ztba(mLj_xOa`53LLm0+)`c@Mm^{=^A49$A!YVPX4f$;uVCQ5%Rpth`dlfzcZ<>Rgl ze2lm`$>b))LRwYI1v9SwNLx~HCiLLO2D4ZMHWemQiqwA|DxWx}sH;Brw|Ar35m=`k zj?#j=!rNe)NY(r2EJ%&}>#-^ufT|hlYI|C)=BP=t%3!_p_LwSvt@Y&9eEHd21hd8D zTI!O0-Bse0aIm}5%NNB#doEW(9=P|t4$Q(gmB5U8?I1DU^l?&w;he*?Q*NH+B-B2P ze6tnvsIyni`=fao2)cGed_H-oCfM<{Ue`bPkYru_Ygp{r3#C4DeVnZq;cBQEx^I)g zRmywOp~!JnQ+#n6Vth5*(PFdd?rkyTB<0oU&P zvDFFUFELm^<$<|Cl~-y6Mx$1-2aZ-4hw+l`#?+ahlGBab4D!cV7)+Vd6WhU~6CTr8 zh)kqhV#Ch_v)jScPow+7>2}F9)~>I<+E`w39G`841EHuKa=|qHr;Dowq^-P*hD3;J zn!&OPW3|T>o-Yw7y^54ih`?!nbT0SO-~A_o1*@BZZPkmC7Br&ZjE^iF1l=6TIJXNB zl#C&QL||eM3HEN9BXA*VE&hVv=7)b5iRF|}yy~5!|K-SXN-K}5ul$}}xsjh<02@kh-c)eIfZfQw;&l7C0wyC)?5p8ZYUM(n0g$OS0u;q8s zdCDws70e1Hg&jcms-CdLtg9s2>y}XCF!Zdjm`^S%P_CLr%9cir56_&7>3v4fP{*F7 zDY2MA$CA~SZilh)TCi9b;sYEp2yJ?&v;sC8gu3XZrr^!OCqk~$fwvq}S}&LFLS{r{7^6nC5wYT5R8iQ^b*aBB&g=yN+dU8YpAzXWY7c|Fj;M#`y~mJipI zZvn02rMB3W0mE&`$kGpBCEDf{G_hgS0$Nx%iO4>TQqtaFf7K5EoHlFY;A=c1)3RBm zKn80pIN*3%@V6X7Y{?&%-xgM=XUME=TW7}rQj-ERCY9{Bk47j>Ibx&9Ftt@_QHQ{* zb~`U-3aMq4#~Yj&^QF5c{@u8VBm@yD?2_z%U2A$^GkFYniu?)PK($+kPqkP*Fl7dW z?zl3DiWuujSz`^Qqz!UD`gUi{( zQ|U~`bT6HdX)c z1~K=>C3|)t7dJ*EIjYUyYvQtquJXs>DS#!;tJ4bs^LiC5_T*zJCQ56wH6~CNlAT2e zfsoJZ*Gq-=JZ15~kS8erxFG$ZVeO0j(8HI1(8?$~r~fCQ15>irvo&TkHwh!k0iV8d zj7s8LYRG++R=zR{c79w>)KH2#BKuN*5TmuR!kY)4%~GOr4=IUetyb?R|+SoIXO?&%&2ksA;`GAs8FyzQ6a<3?kAKySP}%A^N65R zW3YNI-mogDVkIICK^~{`{9ej`0HQ_PBGf@E=CLuQlT^}`SjG@Bm$w!LslV)Hb%eMQ zdM?HcO(AlYDo1t^DjpH)?$Srxr7gqXz5W`nKcW#6fEZ0n=~vi&unUf5VV9lb1Stf) z0DEvN?JDQ8Sl}}1-k1z7EJrf}uHlu?Y06r6NQcyR$VR8MKROu{to>V?VN4PUTAGSs zI682UC;Xsu(tY-oBFN!8;u!K0A!y=XGMj zU0L;)1fzZ=j1N?3v!+rdKZk|OesmA{zkmZgDHzD;7;z#EqlX6`sU*`J7UHE+s0w|% z1}KhT_ZV8jyp>htS9An=5!QFYCPmK>F}%oszej@l^C9pE2W*mPN!V|#ISi^a z&@2=YT^ zA^W^GG#1H+tzh*OCP8>VXl7fHo8Y(mo2jok3JsvU3^8#~$a@23wvfu)w)hPrv-a_Z zG-dB?rV~?4#tAbg=3%5k$Qy|;c?SNK`}v z>JXc}Dd-5_{^&fOkTgn(W07lZ!FDp`awk}Gpf!1u$dS;DDK*(!{kyQ{j!Lf zYhc(D1DhqkUnpnWV05}F0$d}E5t&mK4xizl6ska~HVCI+g_sB_2y|!ZnKjKZ z65AQ}VEWL`$Ua;c+)dnZa?giP02iiY0>>be?YcgKLy~M89@+6My$>U#XG3U6`fWY( zO51NH>H17g)~j%z0%8XFeirOP255B}6jKiXLhC3>yzKBISEL#)GPi82c?AiB}4^XQcvWnpN|?`u*8QlIw(2u6a8ucErHf|&A*SIf+Jvx#i5c;Ek) zgknL4^p8OJ&F4ixt*Hx25Fds64iYcGe}9=df;YxbYhZ1#_227*=v z7NIqlVJS6U8RDafXR(O>9toCIXk3mHL0j-F@CeOvyub{3~?H;6fIu>YX0G17SElZhy(lRl`DXm={ zIlB7WI19E+Aew0BW7Dv;ZHZU9YOx5#15vWI!uV$?h*n|>NT$lW<3LH32#j_8Y%RuF z1x2L+ zwE)y_A&{(1wa>4OIIKumi3}o7SRCC7Avi+`Rjs@;6eq3W_g`ME5yULUQ%;=j3>fx<$}{Ov}0In79Ot)mDJCeh2@>(s3f9*;Pi zHy^JGbl!urLZ@hl+d0Lavwa*fL|s|p&K?!Gui_xroxp0Q>tdl|@HQ?^X-24>!PEv@ zp( zWb)8yn=|B1J%aho&J{c<@n`y3;$0KlSj^IP;*_2DayYI6*DsGq73+1Nb}K+V(NFu{ z!P+ugZ$OMsLkV#ce8Y)R>?6#`B#v+K%{^C%TF%7%RdAl@%*dMKm_vZY2NunpP95ucJd9h5Ge~BTz=Fd3=r1Ypa`l6C{$(J^yYbXA8MC}0! zbm@U@wUA4G4@U0v>hA%|X)>ERDepfT6&x$0v-9t+b-aumrF0rw>p=K5#D$?H*2Vy7 zL*-wXWSSc|yo~U!Uz1p_?Hi;3%ooQ zeTkXL4rbRD_6@R4E*$-WRhXj}>k zJ(60t1F4o^wADQEwN9`NP;6hkRZztEt2xD7mH0s-AWzg9FGo6L>eJpxC+q%eAgaeb z0hkd=Gl)O8jKKu>98~)--P8pO+`%5JM0=IE_^F1_--*=HmmZGjQkKvnfSAdPN_|NQ z+%@>t#6Qh%vKO_Q8$CyW4>!Lm&@2gMsK5tC0MpeOLx2e$kmZoedIGTeiW4@PLOOb% z?MnhXvYJDaYT?*9`Eqc%R@IM7smfghXMX+{(iuE|^(VD%GMg+%gdmks=4tdX$M4eO zrS`(;V@e?v=E?WDzqX9J$C+EaD=_99`2CYLt~lhjW>oscYfab~>Qe5jM}`$wxJey% z4jSF4R!3|h(EG#)jI+Z+;p+MkN5@778205Pl8kWCsr5i>|fN+=@WuXgzBlT#kUCIJU{*xKJ%0Eh1+ z053BRw>3>L#47s4?;FV4hU||l3g}N;(8SZ3(x>TGJB+ePBk#xhpOO=MnFMxGhmwon zRq=y9vNs8f#2JC4P9ksE0mQXM9%RGen5qF$)|>5B;~RtJ3sc#)GUJaJuCVlvJ5*By zyUaLtMTQ7a7a4zJmPq9Q@o@OSJe0z!yQ*5%&fDV zrIHNr8grksq0J;{(nS?A3DtYSfNhB7Le_n6r}P0*rSpxMerxClyD66C+rJ+);~nba z8z=KYv*Q=?*4yu{k6&8pPo|B23Xha_Ir+o3-(KZ)FC? zfSe~|;UKo9DpPo6sQGvJ{NAP_5$TH=kv24q`E|Y=rBoHSY*(OOVd+4W^uZilT zsHKl{fMyuDC|FtRjad!)%jF~ze*%K&2->GtE*?%2^N958QB#VieJU1~A}8Ifr_8$> z=P=J4SDD3cMX_-HLAdx|&h|}1H8=(5opIK|PNbs%1)|s<(aRA+A#OU|4z7Lw_95r5 z)87l7AQ!DoPQAl8M%Y2A8J*6T?+CEK$xGG8w;!x0&r7yN#oqyCoLTQ76nys8VHd7o z?hoV0FCPT@B-h$|U764qd}Gg5t+jh@+`{iLTeM7{-^ZU}X17G4)!nju!?EJdfiDje zduO-D`|bq#*==`@>7%D5A7-gBZZREei-%~$n>-nNyI79g+LMg98H+L&wtd#?0EOVG znna2|sQue=S1_S*jtyBr>RI6xLJPi}&NoaZ6d-%Q(ywVs%Y07wCKc};jy`%i)%o&J z^76w?EhphU<(|vlVp4Xqg8nBufYbAzK7 z794&pV$8d#clvUMyA{|la{wmUtJWcC!-IAqH`+a~6X?M=Irac-o&~ywKGo6hL$=z7 zSg>!G$novi4w_?6>&hZcIz^E=+~GQH#O)6BhY_fA93Rqd#v>>*d<`cCc8xjm1|Qb< zP;%kq+yIL)49z>ArMJ`gFT#mg{fYLIs>R*46?c*tzlQocX-TwM2 zi^Irw7+iuFkkSPJML`JfCaSbGKvLMTxY|Z$sivemz*G}M59w^V0?&NJ{br-=Q-8T@OCDvXgrxYG zttFZ{DT7q9w{xB27@zN-roq?@Z}g_?o`Eq_47So8z7RImV&4C$AN^n@?f-_U8L%TMcN zT+7sw#j|DXojSS~PH|X<_gAJ=WH=6??KK}-V9${;Z(?#EYJ+2{6F3CRtPxLHbk@Sj zY7PbNVHWEQ$jWM^-*ZzOv}d5Q9iMxDxtD>nM3BVsTCRqnLeTW`KHCDstbJkVMZNFd z*J_LEj`S~Gh*(86o!fB!k~oK$#KbSVy&rCKWHE_Nr*ukp#eBr_JK8OJL!~X;uNjK{ z`Adf+H>7IX&EsxaVNNW9UF{GYDph_eJxyDzOZ1(}Gz&x;VKoq3cnELv!K=5)dxc}s!;1<0AnaIl@SHi2! z?d*e4ma@hcSc75=48p`^umyS7Z;S0$-AM|f8HPBNms9Zv_uK2=YizmGWpU|qPFa$w zOU}2)&up-t?xZoZjzUq9bl|>@A4a1q?Bclk{{6h$^b3D%n+AC&@PE58B%yM^v-g5O zXfx?o-%t^4VfJCxx@u0#j9#KSbrpsHk03RmM!j=DDl8K~^n!?)9>g~6Z%**e`Q{Xa z=3LK`9Ww)ucq6U3zrRLy#nlam^KHm1>a{_IvR*~m%dn<|{xs5Y-%#3PM zBQasB)b)BBPo#P#3u;rXJ^izMuWnON*0eQ)IgJ2hF8(1xJEBd%m->&G-k_4BcEhlS zyor^S&eIS)2o2J46e)tOWgElf)Bq|Mzg3q&%;p=n&3XkjL@o2j=`s zQ1X_i{Y;nDYvZS6KM{JnA}T$d5q3mdVc-$bjYVQskk!sa zV!Aj1z=#RRh2=e^_JlsNEu?D}PCPgrSHp!u5IEfi-{-yj^UQ#96?U|%H;%UKlml)I z@)5UuT7y5?W|=#?b` zzfk)#3CczT8#H2$I`3zpp+`!VGI4*fg!acX8P?cb!S&Ld9eTHwe;PYX7Xw=a<66XH z3bBJz-eR99V&2G3>*MUXG#2hc^1>IK3G2#r`++u+sPrY$^Zv#2%+7Wdju4)xGqd+3 z=Kv^vUcy?2qD$ML7A?2T^B!E zC~SCUC1)NM~)Rmerqas-Uz!v)0%IxFNl`nW>=PE?xn zOPiWyTkK+*{APv^B4!%w@0g(4a`seKhv4I8yZjpgTOiM9Pa(Y0_7DU2x z#-a|#aFi5&Hd~62$(Lp8a_pNXw$nFrI=UH@CMsGx6f1Qn{BFzPG9lsa&}cgX&Ftr4mIP8$~}N@fPH5IP{*GSchrRwG!3!b zqhlGpf*Zgmx<7P9?Bx8$4-wALd*L=b7L=o^BSIST zn{S>wV?aKg0>Rh@+Xz#r`xqckL?cI8$S^n(qXE)23h;IgghNxB4VufF4e0hnEyjs@ z|Ft$Y<}BV{K-Q|}=V;?i{EOo&J}e_IG^{M6jCu%y9v%%oH@*CKn5R`p8$}=SHU`@* zCF3~!d<(+(2H`?AEEw<@1~=Ht8NP+OUrca3NxbiB>VkeJ2yBohg)#$vK~L%tBKu<9 zH#-dZ(&MAQ16@_^DL|CIZqM3QNVOsUPt)jJTUsCP#u-!k_yOovWZ`B;)Tz4>v~2 zkQnv!ja%2rc$=1VFmDO`-QUkk6NjEXjXw}t2*AiqMJ!> zdon9q_{Fo{jIcZY{(WcIiEoI6OO5{J9v0W3Mp0Tc0>UQka1r4#<#@VXEOB&ho}f5olMZJ zE9ndH-;@>Y)PwJbUh{}2BAALir2G9ON>Q^5plyhu+QM3fisAbC5h3L`dHWwJ2LhP( zlzAbeh1iOUp1yg=6@-*&8G~rL6YV&z+20voV%4j_uoQk>;k-%{ zjcnETy}t=%yr35IyN)$^D#R|t#U8;&RiWUSGz;%a1lC?vgk(V97!8flufZZ<5QAW> zL5;Z~%^A84*hux)gP8<5XyJeI+M@KZ(LQM6D#H zOC0boaT)TG?9_&<>UJpd`cJ_J1 zUtTZQMXYIS>cAU!^B;S%*?yh}cVOW;TfcX2h!t}$z|}-yUZ=NYHBuI!`kSH)a8l{| zFNN{FSRo`z+(&;o5L_Hj(e%HQ!s(f%>0?&YFgi~sGG5rfxfkZ7DnzMb;gu}BOr{Dm zD7y7N#v9XnP3IpoI<^4LYL_%whymV6{gv)A>bR{!=jQ5RxN<231M5=g<%EY7NfqNs zX!*plb?YeLmQp--WJ!szdu*t0cjKzCd-6256I0U6k8u02f%c{&s%$xblGdVKhBj*XuStb|+gvYC}WW0Hh_ z>ASwUM?i=jMrvN9+B#Op>aEkIZ4pPzCv!yn<4*bnJn=Q6=N}{4Sd|1cTa(>w0840ISbY&W;rQ_{f~A3&H%g` zrcLg24c+qBvzX2MDJmYaNR%s)MxZIAQI;c#R@=fQ9~lH>1nzTzp=8I0TV_bdxg^ZL z$g|@M$`rYy{4e(2Dmsp4Yp}GKnVFeO%uE(DGc!vTGcz;GVrFJ$Sr%GgF|#a&)`$1r z>A$=GnR%I6>w8jGrB+7fsjP~~h<)}sJfs#FYG|}xNw)v)l$2S3XMe}t_sMu?gu2{{ zHB8V_qgL?qbHzbaV`Gh_B@tBUfV~J9wAl)gAo)V%!68vj@KaEfkt3Y3G#)rPb_eV2 zO|iSRCi(Y5d6kTDLfKo`-kSmgsgvzy&BX~^u;pC*8400v$|y=<);YzB1e0ot?Ih-bb=JS`ds46uE&b*H=Uck8||MaNx za#)mOo3G7T)0!56U0R-Wu{eXK{U;FxYF#9X#Y%ZX`}qcbhEPRF$wS76e&ny7wndt_ zfp-ICt-SnJy;*sQ@j3+C=y?8S{f53KrH5ECP51V-yjr~bM-}4M%8a=%hbGOv_WC;q z#$ev&N{Ju~l9r?__%52>ch zTe8tKuhQ*2N0I<`$wjew2n?s~Tp{$z{n$6t8wu7UAG|s@R#-Pcefz`@P{_6$ak@@4$OuvWnx5NE! zRfvE46n{G=^G5&x|2kc!j}!dcW5~n|{cl!A0Q*M^f8GWkEpUGP=iedtUsxfPKVrf7 z_ti78d>roYSpVAx{`(#AN3Jpe@J9=Pk8Axcgn*A$|M>ey*#4Ed{QG_L*In{g=JH1r z{tWy-4#s~RjQ=;e>qu$HDmN{T~P8r}zIaJ2L+Z2P5G34(+#I?mrxizmHh{ z>ihn%Q~xb+{xA;95Hiw#4D$Z1hyCc~|25?MyR-ar%<}(A+NcVpth9vQb+JcAgt#v# z5W+ZvDNpDJYXDDpLm2j18W>av(m)=OqDb98qJTI6MM7aPU;$bJ4^aV^G6I?dqo|a! zNqq<^)K{-o==ojqz2=wR;>3^pET?-;yUmZabU)l-^l(thPlPIIRCjPj!?aQ1U;Fl! zBB#a>nS_Oa9Re9;MxT!#pmpy-K=syY``fxR-q{7D!y#{i^3Og=D5RQ20Ja)%s#Q3M znPMP_*nVCEI6lcUhB>ujWhsX(0sHMa)eo-Bf-|gvg$ZDff}rIAIr{-If~oeRb9^%U z3E%0@4+)M$2u=%x8waZBk4X#Ru8&6vI;79M{9#(tm4`VNB;kP8?3J`f*Z!o|%Q_2j z9w5jFoa66si7ibGDI{i$WFi7GCmMwaGl*_LSRKZW92P{xB*Bvq1{qIFil7mTN@5~G zrWpO5grArqu3?m{2%{|;mZ)$vchobhy{5SQYQ!} zNU$Gs3s0;+i3!^@nA6BdopiYGTit>>lxjHMU`CznDL7kDv{7zYy$D?a*j)H1F+C|c zaw-Z;_}(Dbw!^l&A%R2CLxu=(S-i9aJSo2-ELD1Ag0j%6j3seXqKD)_5fmW3Qm~n@ zBQ9{v+L631t~1dq%`3z!n@7lphK%GZjS0;j2^tMq(s(L$Di^7X=5hOXqcX_|;GwW> z5vXE&D$XRu&vaj-9g_h<=}D?dZ1Jw~F>$gfx)eG@>y+NQPdT?zSXfxzSmNpOSlyGF z>CovU01T55;|+!6(tTw)OI+5-_HYlsRoN~XZz>uZE7}u!9GXn34#{TSyR1`?l@`Zw z$3;h4&gwPnHtIIhwiCyhJ*sQ5Yw1U_>$dB?>yh1>@mMN()F?C_v}NcDv~pBgN?1y1 zN@|)_N^qKD>J&06%H66#6>9m_8fRGx_4GXJywkEt1>G9$3NKxEk>Dc3 zf__CwRVvj-!LQ;b+A5MRIhIMs&fl&5p5VysHmd~RxQB5!nQ^llPeh&?JjYCR!6v7YCwVlJc7X4CrGEgb#EO z))@c`aSwqDaf_l9gDoU2#1qpIvx}06DvV~wY{BGbQeZbo-_2l2TVqaUbzzoauVU)5 z5Ca&ceN8)K>oASU_>oSLu9mLXBtUmc_ki9(=Rp^q5|bh{fjt34Q;s%I{iD3ka#VAQ zYnE%Xedy^CcYw3bsd@4!<0jlz9Ann%$jv6n`o-qjX4U$wk+o%SS#@P2i-vp2>^!5b z%1LjsA#EhH#cYF)+oS``73Y-ely8-LIr0qWOdJmuZyV2*6P8gKlPC&#SX8{AFmwld zBr)b9>ogmX9mDk@ZQIM*_8NU0^GbZ|d~CW2)w$JKreB~BtY%sIvgBPIXzO8X-Gbc` zdJcZBeb042BF$_HxM93$gIE_nby(YpE=fF~o^fReNUc$eSBq^)a4T~AdJjV2ohyK$Sz%peZ1ma;pdxyPNh zlCSV7T1k`0cqE-A*D^RVc2ksdScdO+)vonOpUEy{d=inf90~Ut2sLMusFSgCJ%mb0 zrIB2VkBX`!PS7;MphW|ZWRHH#j|>5Ax5JVeIfz*mL%%p(OarE#$gL=Uuy#;CpIw*k zji^#qBUT?yGtI1|-Eb^X+&?ETf1VzX;pyshaTl>0-3^sYtClS2wCH)}I>H+-!na zlB|)^xR>JN?V){Ncsl%L1GWlg1ryS9^;(=SUoEfAQQPM}uwhqc_qcgyoz>xRFf1p! zRxmMiyM4WlK$ev-vAN=IBTi{Z%H9f`6uS~9Tr{b>6diHI#$zdsTeQkZ|zV*Ul zt)i>t%f++zi+4-8cSWXEl-2ls;+@%ruQHCxk6*ky&re)a?c43K5J3>&2qAc>TMXc`P4TShR{+TJ<=%&*?sQeLaP%!NIVtx79s@IX*dyJ?&vdWM}*m>3K3{ z(|3mP;a8L1(D97@Qghhd|9TCfiD2o&`rKqO>vQ=%Zb|-r;4;)LlyhLlXX4>(K%$Ri zMSL&TgpPyr`UbPI!(?4BA`u!*lgP@r>`&z-#RJRqzf8!yp6SyT-NR z&Yr*8jjoGykTlPi>?eoxBy2{3aXuA=#`zOCNUxLp2h*~)z%rt9)6q1jUd;h5YLl(k?XD6&3 z?m!!i!a;o(Fk#3-!M=7*>OIDDAZRxNj3I&fW-8%bc+fK1w#kdMD(K)Pd00>Yp_i*u zD3A75eV%?;c3ziK(h(AP9sl4k*2)$~Nf3Yf83Aw|Q={)^Ntj-v+bu7Xv`kbaxH|Yj zzBb7mK|MybEVPh=;4FzM3Bq)gbpyCqKZc(`M4dx^2xj!y+L1swyAp^vvifEAqJbzG zteqBwpdRxAz)@(uyhI7!N;KFKNsQ4x2A>1xw9Wg@=6QTIF0HXXBrrfQU#kijlX1UH+4zR~h~nmPh+* zSx^QdL7XO^|^W7D|eE;rg2NfXDP4)`u4J*qNdc<&q zpg+ve1OD{s)y;#T3)>^dWiMM9qVX-^PRh?!eQR*&sFbgg^&Gs3#;(CMrA$J(n<}ZP z$aXc8L3jK>n+`Acn!aozb2q%Wt2MNR=#cf(J8*)Fg3o_3nali_sSm)(_^-L#-={qP zm^%A6&EN0C{eRc|G5w7yZxandK&lHa}d=65iV3J;h$WesR@{CWFIqk@A(g$XTU%bI=)iFnHE3awr#eD z`s%(pJRa<+sZF@l>DI7MRJ2Ug)4JMd(Jj45^>F9d9Pc%sV>WB)dTYP!ETksfPgLAb zuurIHBw<8Oth=^o>*&ySShjJkonP?tY@EfmAl&CNq@=nu=~Uxy{HU37{8fV?`>!Ysw3NsNn#jgX^5j28WVmgnS=^CMY#!%R8Hs;B1%|Hef&tKPSYow($qtv9}6U}~aPZMeGj4(`yUq_!}8B<(JpNe52S zo+Gv)SDkG8gZY7>dYh>6W}WIhp>I5Surh&Zf{KRSzog{v`YzxLLkUDR2Gp6tV2r@- zOCp2mdtLl^?g%O?3=|3I>(0sCs--+Q8Ia-x1?8h-i^5 zn8+_7&97=dtyJqUsBLn9g3Gw`k6e3bp}90^fzMzV*hn_?z)hv-SVykA>SUA+&$Me9 zl}|Y~(0o{#XkCm{>(mzl+fEATkPbWhmUOhNT{D9Q!q@chkfg(>N$5L-9HW1|58A*r zw4yn)^ywLGvcbyK(nQtY^G!=j&Fj~74a-S$n!q1(l5F(0m#>3P$VRo6BasM6BAX4x zy9b<^DCLh_*xnPsd(MxQYgFDrT<*eUU@nqNAcXF~LF#>`3Q56eM+Qyfhk?FNk0T>f(f$?c^&}E3a3GhFko;Y-yXi*(jodQZMe;H9M9#qT z`CU&GsMFI>8HOGPT%D2bmTN~rRry|VStRx^JkPD6V^&8?DYZ(|P|17=nb7_%=~GJ& z%Fb-GoFnZz11n#q8qqLv3O zW^Rj7UH@72C@3kH{xq(}qj^E_%F$mGI6JDhi`G)<6If0j^m41pI(5QY!jW~#a*1ns z?1X3>hX)5%&O7yUGjFeWU&d-id8xY7%~ns*EAA=r2Rpmio|@wZB=9L4ES)DjA?_CS z1Of?vroqkn7BA)6i+Nnz-|s!>%PO2?A@fx5yQrLESF+Ai?T0>TIHm@3aCaR=v~R!{ z(`276*j?S8%IG-L9j9Wn7~cjTi~E_omdfa$P&Ut$|MljW!VEZrq$MfCSBNqR;wWsdL+isA?n&Q1Ff5I>Em9DSd)l?4W^c0dB#AO zpDCHAnxn}qSXs<(H%TKKzb=w?rAz8vnA;_d-@JP>W{YQ#GVH+IY7i#3p?%$)nYN8w zua;>**&ajdFN=D#XjWD=nX}j{UzYC_DNY`2#h=u{*elk`au73VqGB^1F?veml^5w0 zO4|bmIjMo^@HH8RNtkyw17B*UZbsu`7ek++3Rd8ILd|cT_|=>#dmb>>6ERkvVyZg4 z&4yF=B}JzCv|1zRp@9<{miBm^lk+_`pYamJ*9;-2F5fYfS)K#yNOt>$5|P@U2S>Kt zMXeFKR3q@9Uo!BcHruu(Qxo4#K^&nUE}CTJArnHSxan8NI^{N1Fa1;{&Y36i2klfP zr;LUnC5?r>>Sb5ba}#kfh%Vi73c+`eJhBF<9p#hC(VZasUs*&;gWCygf-@rSrtG^z z$DG2|nRs9i@}T=m>v7TPl06vA#w~PwBE~c2hv8(oay0q`8poY{Q(E;}cQdudXli&H zgmK=~kW=#QS{P`egF%WImxjr-kJ2u!B)0iziDP41aJ23Q@E5q5*coJ1$fMTuBpO{p zH%O|>=bcIxq-D{{Hl%frB9|X8K3@wcR@LJ9|{$EU0L7(Uv{Nh>hx@HgOQsODY*}KuOHMgO@p#LQ8>yJWV*~KTNJ1$9C4! zug#7r>(X@>QBgcZ zA6r@P{TFSGR1xas6RUS=aWytL-fzrl47>LzMh68J9puIauO}gjEi!2oW2&#aSo~_k zyRIc)a@IXFcy65D8kqmw7UJ6*b?kQK`ZH69hfG~Yd zx)uh&rZz@xg`YOw2|OM!Q9#gBc@0~22y0b#>-{RtO_$B#%jOMjdmOkKBer#s>Ea6w zb``F?m$w^xQQl{uKcPcgEuA~`=7#HaT9rtCW2j5cxco*Xh_&)L7w2x0J=JG1;KWtD zfc>M!eE;(+*w=BB3h;6MhC-vWX$(UNrq-{C{C)Q1v6;yVfs*I#?t3DG7$8VBd;BwZ zhWkLGm!1vkujpn}?;XVO-9b0en&8x|VyYkqRWBZ^2kdYv?GfMWX5aQC$TvTtc zxhSkMkd1JWWl;U8g(_!^=x9Ael*WtD%=*N$?8fA@qFA=QZ1vXp)7rnaMgQH zRMBJgd})>A=Q~4qCICqc?FiLkHLwYS&ZiP<;LEO*rSoSZr=S~toUAWj?#SZ|yxvZA zQsF;Hof1p(p9)$nU;JSUP2N^MkB@LH@#ttuP-Xe~)aJ7SLz~)Vh3(8Wp$Oe zk()%qY9bs|hwwP7kF-perVf~K{#P_d#_vZ;9-)&TiPY7LGyuv|jb++F(|fl>npg5X zsN&1dR&RTT1`ToTRndCP+Q_JSbX&ybK}5B>#BL@VXwfTip3n$R-8(E~Ne-niS);t7 zLk8CQGC=Rs&Q90?(jyy7>W@Oo72Cg9ZrI2?=-rCjZox1+J}K=@1Hv@6g?L$ZoTftF#@sqd*+nhXQc>~t3Nsp=7A7WJoR3+thNNR_$&L6@L7sH0 z#{>$a;LMX(LrhJx!UT1Jt#L%|CR76lI=6jchOv8Bu@*Yn_#Souh_LcdCiRp|3#oMggLpxHl8FDk=Rr1CfIHvq9omKf?e zgu+scd?7ZNYxWqI9?T!Itep?h8AysN6#LAZzbi%j&E4a{xuxemcSs-l zX>gd$O{;!N2E-s@PYppF%TB4mDY5x2Bu7(`kzfiE5BoFyuSz%DW4iMl#_Lg$=rVEq zC&MBdZ=+%?>Xt2(jV&H)9ivcOwo{@!rRF?K0YFFw=e5waxJ;9aT#>n z901qmM#_$m{rM0u>njwdko1HetcsuUKOET*966i4*DJ^BHk3OEtm zQt8?xAmB)M4aKEtp6y4%Lx}Z3-G3-$W~O&~b35ihbT&b-d&%yPl(_?8Q)$tVmxXlm z32AB2vrS|}-7LPZ9DT$Y0+sV&5%o%OI2l~dokV*2C=$4AGrMMnPq0}Q2E=((F_2RH zqXviC+1I_5hfX6&m1lxY)7UCQ(5PE7f&i~JMzo%z+zeg6dxS~lGbylV8(>;Vur*=q zKH770$Stl|{@Q@@JB%1Vwob=|^8t>-D#m6RksSkLSb zNnvYZapRZJ?O5J;-c^J)=;!=68-Cj)pcRHN=mBFnqh^w1)a2@Aayy-S|3{ZE=z4k{ zCV6wLdIU{SYI_w<3>2_4BrqsiG}9G%-Jku;*Gw>7`=e89qePar+R0Wak5KI6VrIr+ zs6pzZpF557^qFy!Qb2#y*icHCPzuV0I2^ySgOTem?xmG64|{wXO9W<}_ik33jGR}& zrA5IsDMy7f&>ZI2Ni=xjQRY;m2!m1)o>5dWDp?}EV`NB5#lMc%td+j9Yi6SmAoFeSl#CSOH9B476F-B@roSS>?|-Si)v4%N(e%n+y98MkAt&&B$(Fgo zDGOpqxe@ml`r%Fz`u)Nk;WZqYyS24?dCD_Gi8cDoW>bBO5sMRnWGM=R|XStw4 zSzZmRx*EBnI-#KY8;p)gbNje08q<_L(PQ%Y5mgRs5SQLnMcNoNAut!uaKK9!x-+{J zWE0q1_8JgD>ZSBa$uHy_!$Vj>gAKwA@a`}|hkY4B`H^4Ab+8px)@6I;kr@2T-k6$tBBk1qksp|$|TK7=fe61$iO6m8${>lN;kT}%x zT&Loa*HLfQl9?xLhDsM(_ihBEqA}>q(*B!Y_!gRJ-;xi$-|-+M6@5vFxzl9w@_fIu zf4$OdpKjcFleJW8fGTG5bNlptzNhQm%NwzbjY`~zdnex=K0_~O?4kW4b`|&4M5MuN z$)!W7z+z-Wn*f?IKkM+Qs4{H|_7{(3X7l*o(7;y1TtSQ7eJ=ul_fLcJL|J%(U}pghfK5$+Smz>6YEc~f%uV+(pBQ! z{F1$qkltzuMZ+_4q29&~S5Oh1?;;!xVWKh04NmL!jRx2ijxULPR(L&>ZacEB6QVJ_ z-!gbKM>WG@kgm;A7Q<*wN71cA(iKJ9vdu=%7=@tCNN81$Y6l3#<44A@{AAhki{ejb z4=>#vaupKhfo!#Lk7ecQGSP!Njlti+^nqtevwoWRrH4d$^dX;uYf!q7f)8S5pzFRS zU%M9e@qp3n?lE&S|9tr@+g@ENi}uC(j$@<)!3QD}ji8BMmSZ3SDZU@tQ9s4Rc#4OE zz9%jY7tv60Y!IaPyLB9ff-}Dc$9SnLb5&X$it4WZz^&*HA+pR|u4KlLEE^v8G^gxh z$AK26Gh^4~{hQ2@y^!`0WNv$hXoV=R!Ih`D!1~4-W?X59S(jqGU`C+Z$+4V- z8P8P|&GGU3W7JcKQF-v3DFZ1@%ri)wY%o762k6IV7}T-j(R<49R{`r;YEbw&5%xq%aZ3qt@&e1c3u_Oo>3tvQR_o zr7Hyit%$S%=VW9}787FmFhHHfFt!=NtXWM5K|Vcl&?|JLdeGEQ;4nzjs{B1V&Pf%W zZn}L?+f*}4ZQt^e6GTmE9-a);)XZs{darwuAl;~_BEj;D+cFz}D3!`*N>kUGl_@hy zkP>rw1->Kv@}JXe&pt!^*@I2eo4{IwXztn_GaD>50dMAyu(XFSrD0&SAD%j550GCJ zfr+ui&VDVIA})afPI8C(7R3$7LhxP6IJ6F(A zOgTE{`2$u(YiKmC)1iP!LAu1>ExsdX)^K1XHlP^g-|3%?T|})LL#7843hs@ra{59= zPm>Jdib?PX1MXO70=>uzHOf1e+8A-^NP$>dW2I z=5gReeR3(qp`i_F|QrT`M_X##?G*JXFYlmwBqblT735Os1)ObceuMhF6IDSFpRU& z9>-2^$zHxD;UYTr7)7hrSYbaBYy=&QGD#d#&CRN!bxKmnJn%rN?@qOO?cK$IBp4zr zq(AH^fdR37XH;p6L=0anRvVyD!sCY}!5faxa$+z2JZ_Xv`T@L0PSQo*r`*H~M&JXn z5$op6BP^Lm_&*AqjkA-Wcd;bPL@rP6_+8 zl->Q9T@y}1Q`|NP5qi`yzd@lb`R%ELN>i%DCRy;1j~8P#I?MkW0xs^stGBQ{kWJ3O=3XPfagFus+QU913Xgrg!6saMK0&-T)Kvvm!=VbqFxQYxX zAJ6PIk%2b&w8`XN25x2!wVaD!wPd=Z26SzFM^;#KCzp5rp0e<@8|Pyn*OpPYsoa0E{5aq zVqKu~5zK3N*)i&d5yunm8c3A4L)Vt+c(C@cd1~r`h@(B&D@eJoa66GZ@g8~NZg;j zwyU|-Vj=Ah!#51Cw95CV(Y_rnYD@O`{sU4PDaj=K+kB2>p%_Zd1jZ+!*feD1~P;S4ce4lIo(B(DnuHF+R$Q8SG^ z@X#i3z&zD;7={NF0v1qPAbGTF^wifSihN&u!8290|EuMV-xec&TcKbB062cz|Jyd; z1Finoy2T%$ll<>h)a4Bvf2)Yj#P%n{q-f$~=i+E&;`D)Y|4AkP3swJp_2d5us?Piu z3jGJF&iV&k{O?@VZ*BdxuJXS^)&CtT{|}7(zoMppr?>xu&}RCm`~D}?`~iReMNt2S zZhs)}%>UZQ{ITzE{Q2X>@7w|_w--7bnHER(9SpH}b z!14#y4Pg0=Gy9;nS^oG~04#sd>HwBMscx1(scx1(scx3vPahh<@<*WmMR)%m>c0Z} z*Mb%6-<e$ zk8C3}c`I+JpM3a5fmMdew?|h;g*b?Lc=}_v9D4Pheb3)l-w#q>8BdpX98M8lCT0dW z&SpZt^2;2&Zq?o~Y~J_yK3*vC-!k|fx=lpB?e+ZfeZS6MoNqrL$=7t-@c7h~;k$GZ zg7K<$VzJKfdXB?~e`nP5T$1{Dq^EnkQ=j|1?#l|9{5H*(^|AH*Bzmw=;Yw7x`hHvR zF7rj{VY(#fe#Pf{Rsf!)e-yd1`zxD?8627yu*mwVUm3};Xmf3 zR*P@^Y`~S{*VH`UsJHY8c^di-`8M$8#g`Rp<$ZYQpl(*|z+vNwE$#yCu)wVj$ukY@25b^SQm{b`8RcC1zy6$Fw|6xa1jllNLY`4OVoFC5PBGYeN4oJn~08%pKo(h!wpB%$wkMd@z?}DvnsrVkaCCjI+0v0th)wjP(58 zWZvmCnU?tznM5w^vk29#u^~(ic_d6_u|;}+TKBfYnT6i8hsu)IIpDliKD+Zp@`ka# z=ZvKc81NGb++20?S2KUlnwftC?GEask;u#>+3v_WVAIM*KuOM#{`$3dAY!|}znF`$ zt55%pBmYDoq!7HR5;MTyFas652&3A9KPN7;63lpwfb7de86(;toM?$Fm@p_j;yh#D zlmTb7z~?iN?M7}D1(ASQs143X9=G(NkdmX_5?*YFC+ZWlw^ffV8 z1jt7DAV1j9n^N$N?g_&>a-hBrOZ?6%_=smoe-Lc{@Sm2D>;@n|oacVIbLE;mMLcqx z-FW1*vrQch<1ix=n{wQwm)PG$R|S`)<-X2U_f0>~Ti~^%8GD5?$2mWm#)LAv8Vjo| zII0Q@8c<6_U2smO#!9PZ_GDr>CD6m)FlM^Pl;wu|swVNdC+->gq{ivnHo0kx!YgkE z8Rf)gyd~hVzlHZi5-;dH9G~RTYe5{~Jjr`@=fVSM`@-R;+0&fxA&s)2O0ea$l+m<9 zP#UbilfoR;+KSYw86pNsgp?}9Z4ZK{yjZ4XmFSmK(zjN=MU?M)6?QV}#9nY_u{ZH= zUr?;o3K1N13b${sMX90~q8c%?K`Z#N-vG|iyHx`zufMZ{QoF7M9zWlYbz0lT3q*Ex zmL3ZVc;()j+*BYXEiPG`jCSmKV;!gMMKdwzT1)#l&>BQnz$M;vw_#o}?g62gC4=y(v`An;&`G6{06M?XU2^b7!w*m?(rJ0zLkK1rEFtp*-VWf zmk=_7EE{AEM~Btc;-&@yPeKBXfLpwE_a!_Amo00)l8L;MsX$o;VG!fszIxhmKm+%h zeR;m}bFH+28{Fjxs@*K)HMAwxvkYRsUywl~x*-IarG}-c2&xnHRH!CHshq^_Ywt&d z=j)*K)nf@7U?_*_+oSyaE4DHZd>K1Z{qY&@&_1il!jvuM8Rx?kG&Krc7*ErgV z%W$h=G3p3UOdY`%QDF#3$EDa*#bTpIVjg@3Ny`KHn+FW!Q~!hUuWdvNotsZ1&)9lj&CdxZHnvI-n3_5GSsb7t%j-z zLIW|A;5i7PyT%V&G%coaiUUM!Mb4m$(e`-+R6^hrmi&`nihKM@b+}$sE5wx2pcP+v z;6u|+X7jsmg_%bVXc zfc)_W;(4Y^Mau@- zF98&fS_KMy>L#JK#!c9>>zufro;MCyBU0$307{5+AseGGI|u%5(gr0UnBeQ5|BxwJ z8wdHzK-sxUY*q)8ek2~5F-v_YrzxmKnz%R<2|TKFTVy*HH;oWvBSmZMYyNIM;=}? z@t@j0#ePd2Ma56g4Tz%Mlys4C+#O&-ju*Z-5_gPDNh5XHNZcKcae+!>R4+B{ArGL{ za#eKCEYEL3`N+SRt$`^tSR(Q`td|ZfBCzfY%Sfg;8*j;85Y*?j1VDA{v17A&^C=vuKqo1~n~2n-$;5uHY$u+2zfyhzM8AzAdUzy@%xa*@Vf8*kG<` z-ShmA>(9!vn#f7OMUW^zj|Z}d&MZHBT%_K(#Z;5}p$f(+yW+g`n&Z-#EPP+L2L?4I z16#H-CyH)?$U;hLK4{*4C6|%uF1ct_fx**H0cnd|SgD_k)bcy&N z(-@;Tz_|Ra&BM;0helE^pK?nVao2N!4+9?o#vH~)nFQswn~J#m=bLOK!)~m1@%Dka zj)_+BjI@zpBO-ANBIFZRVMl^f7=Al#;szXaeZbdHB2Glqz6H@%?=znK(97@X`F{NR z62i6Cq_w=+vIz)aTr?`Tso%wb?Vlj_f>PQ(ijWu}*TKmM7BJiGHznwWmtHmgTIAT2 z_^eLSVQ}3i=zkwt#4C5UF5MEHd~Yxot8;xm$#*_EZBe`7W*9=dacfpt+gx=0Oad<} zS*ZWIG7(>easr~5MFZNma!fSdD1nTN+znO`c)t`V5gLmTiZ1kk(&3>_e0Ir-DO6iI zVLnH{;@8Aa1bPzGhmAn;BeHT3nwZTHXPJXO?i0keBVo*FIpjALw~a}wx(Xj23zyWe z%QR`LlZgq-fOHlQSYU6~2qA?y%q6E~dU0R;mE68=8SHw;b|}KTbt@&WVK*f2STin6 zj{pK#5^%sc`)fEHr{a^2kgPFxV^1V0q##-$2(~d;R#d(-XdL4fMMEfk#3hg9iV!zgvM#Lj|ZS4|eba%?h^$!YllDRdN+Tbh{G{yu{cc0>pKklNxiPjMylLLgJ4BCD^da#NFzpQU~uSiL%JUI-z2-RL`Lgp1+ zsoc?J>9%VwDH(hHh#9!Pi9zn5=j){^8_B3cad(5Jw4a7Y6-C`ciL!l4R%MUGrh0~K z6ldbf&osk~C+0_Lc+sFTHDbo`{3tlYRqQjV%)&t0`9LLk^gIPj%!q9m@7%Bm$=r{U zWG5)YUSI>{#P^S*?%{^cIpfxd$P%=Au@sHXmeG}r9G+0UNG@=*n0hV&IyfwS-(<|j z9&Cjb7s~TdivyJ1AHeO0cS<-EI4O)Yiff07=u)H12m++fl0tH# zp%*c)TUU4{`jS=qR?yEZ5XaOm@|LZ|<|)lt6LtsV_F#tj9S$71p>jSoF6c^6435WV zNy!H6p>j5-G{l)89nF8Nf146rT8!d_j-Y1~$4!9LV$^~oxYx!k zsN_{nQ9iojKq_kpv(_3RLaFrZm-rM1r7cM;Guu<0MWo4b#iIlm-3nWwgT(H2pmVGm zk5Hy7x*09r16LAETIi)L)#4 zGNNNnG-aVbj51sTJMvwvkn$}R%vx({3V1lhse!GHX5Cs*s2QBmz~ll~uEBQ&!@1-& z(`%qDy=N_9!&wDqNmBktt8B&!xtxf_tEO4c)YIHXjGEo4fwfM_x4mI!OP>@hU2`8H z#k#Eu8y_>yXZc9^*X4Fu6p8NX=IVx6%0fO#QK4@V2a7H#S_J5)$O2=I+cj)BYGC8u zG`HrQR&vM+zr1Nq2g6DB!D?G!_)EMaRl|WA3WchKlo7N0%rYl`h*qsx_y6P|uV3u8 zNnR%tm`W%PYKlkAnaJn$bf{<>q_(}Q1pc;{l4yEAs1m!HkdRcnOSA;AU&I3#Fo`u0 zM&-JbP)G1qP`df}=~~5=6Ddg_1QW4W6+}{Q+=>PYw-<0BDnEM6P_JZ_=ZEo`!p6l^ zG)l^vkY~6KQ{*vqXR8u{A`Elm5AA|4=cr1mAC-SHwmjo#2%m8?CC*f8Ov ze=m~-)v(nWbVb7lCg5w523RAgPw+tlVk*69tT-ua9Cam2OsO*s>X)gmk}M$2HT; zeoN~vS#VsjA8ICNW3|SJRA*oHjPEqw$C`3O!G?^p=FYt8V+||IDD{@=4UeR2Y^+U+!pv?xKiJrSIs4%>%yxDA>t->*oi^zt1?Z=}j zngw09+^S*3N0y;)lXzEtxh2}($0Kc<_-oV@HI?`I&F;Bv;4Zq;IqDv|^EsJGTXRKw z(5|hrL2s|cJN2{qvr5}Y*0V|-#JUMV8^!uv1+t=Z!`&j%S86?cg;ni?m50anZKXG? zFg*}z0@?oA3rKJgPIc!#28t%lW(Vp1!jIqdo7+miS7?;yd9J(yR3Uw83f;dRQBo7J z$)Q5&_4XcejPB63MzV9R2f?WHvRnMVb^N$C^yC|YucIFWg%4a715ER0c_&YxV32yV zo~WDy7NC+(iM2gD!jr^R1CD)UK)D*mz01+%f>tQNjv$ikA-M*|WW~7mL8L=J|B%eP zJwNkO6xv<8_EPMX{^`O8HIp57O{sWm8ZY11ufWc8bm3x?xTfcHeoQAvp`tt+k`Pus zEM_+YbL~CV#G9KDcf0J)SgPHf;{MP^+i*!lxM!~je0``u)O&nXi;QA;0{QXn=5@uD z{TymLA>vFr!6LBiB0xQn-+MISp30lZB5X+<(-O!+ckQrE&N2ZU_Y2b;@M_I*ndU`$kC|zU6;hEJ z3%e4o#te9R?jMoPqu!A@F4n#%$`ST)1$YO1acmjWTzYRBuODBdFhe1>IJydKWzdsOGbIH(zh^=a<1iLWa{PGXkP zbFXcdD1r^5+cS$%2NALDyU%^)IbEoa3&clWXq_+8n2OG144m|Ya`z2x3bJ+4M^)8F z`n%Gc_;y%=1kAMW74-GEf)>Ay_(Yao>qxS5xW0Tlb8{*t##l0sv0czrxIOZ=2kM&k zR<5zVybdyVwql^=DbpG&wL5q87(s{y8l|J;HrYm9gR)>l ze(Xq}e$n2B6q%J3Oo2@)X@tj2XXko`t&N@Qk1R;kyt7P+6AYOV182_Lg8E4?oO(3j zj(4rza9bVzF%f<9^=slxV~JzVRedm4c3N=~zAI&b4i*xRl}N}pXFoic^XS?oLSa*k zyyXW62}}TgLD4fqR*Swlc6+ul0CDkoGBjR4j27~vAdD3;P*Yp9;irPTsXYvcCM`Pc zJt!7;9P%ec8VI5Z5va&>&IK~;W^LKE29N|bJ>&vcNrnD|W4hwbC&l%;#)lspoufLR za|g#d3oooKQv(q(s=~ab&eEK&nI3xYVj^fGtWT1h^x!4truJ3X=&yt%Plu*K+eV9H z3b}#x0uPb1?`Kysg6iAtk&zWeFhU61p2CJgdUr|-C&^%dgm@Cd1>gtYsbJjYkf9v6 z;%H}chV=Yfxh2(YV?kM2z^=N#TY@-hQ1T3!@Y%~Hrn3BTf}nE((xo8t;KWS6=K$vH zUm;gp-HA>EfVzaA8!n7|->aB%3e9J8qGoWS7I^gDsEU=NjWbEiqwevWqY#iIt|Sc& zF2hJ5;!mPl>AdPjCo^Z-Sd51*Fmn6$TJ$(?>guozG)ePMx1ESqKRHI1 zO_r)fd^Px4hDIjtRo=2HZ@!e{w63v~V}wwb%o`p6S644mJ1>fuMR$_h&aSZ z&nQdvZ6rU9b?QMt>)WW1)_n{K`oBA zLS#~V+{F#R?u_b}5!F?hb2S&eTst7{C{`O;<{TThUpMj9hYnjs zQ&F*E&ggCQUw+WMyjfm*@{qEW%+qk{SVm(H&au9zeaxHP>-`_>y<>DGf7kaJ+h)h= z*tVT?)Hz8y>e#mJq+{E*ZQC8&wkChw*LBZav*wv+&6`>4epTn3I;U!%UHaAj*5|u5 zYeNqlkg+288xsk0#=dZp3%Vwu_rd%uK>Eqqk|ii8(MKp9352r*Zs3{=`FLi4LkbT} zg~NCvG&Mp;RIDYnMt|cIj8fWpC@J4WzySN%S#yn#{8jxdUjbyQwuwlo?btztCPHu% z0>d64KeC`ko9C`t2S>_)PWr6W>T6=(R$SdJ^4oel{QA%0nW9R)JIk$FQpMnd{W&#A ziaBl8%VLE%_|_b~Q>(psWRugLCR}1K0_60UlthEWpX%jKL?}5)kKRO3a2P11X&#&G zIS@W=a2C1(?cak{F%|P53w;{hUS9}XQncZ7lB~{scIy(@Pm4~B+ceyNP%B=#_i%s` z?TVCI1oYmq4GDraKXmvAfK>V6i>fZ|)i>P^MCuS9lf#7r*Ra=1A+-jfid*6082{j8 zYdWGKV%L%Sg_7`dHHCs<_`w45!G1#eLd~SQ!aA_s9O*8fVoB99?V5>vD`uPTOtU3m zyvC6aDb?i^rKaW}cXT6wXk;0Z7NzHnynzf9*hCk}2A;NMGbu081WAN6ZwLYGb9ld? z&!Hf-cDzqnNC)VB_GSz+m!9|ymyU%j({%=n%^_%pB=XH{)VoVWPv7ye&bk87ckIgK z;8#pIow-6Lqvo`{zp6u=z+ZNH6asQVPh^^?Ojf42{zrBD=y&3Jt|VUIVB66GwMl@l zz4)0@Y_LGH^G;H&lKCa&jStMRw`M##$yLZ?||pogz` z(?1>2bp37DJSg8ONS~tKVzDrsf?~!f2Mc3YFSWUQbNBpcSqo|je$&%|DNfKCM@Rqc zBw{ckKNm;rH@n+pA$^D)_?20zNczBRcGB!Um_vBu_sen(q~vLnkK(@GFgU^&5XuLh zJ*-tP)@l2m6Vz4c?MklhIn$r-T#)t~?yKYka8(9GD_qfq%Ueq;R1q@44~7Tt6+Z19 z%ooJpf!WfoLei&nO_oJ=Vo69Dl*{XFU%of%?%?#@1T!1n@&F7a)E#`uFqYv1d6S)a zWs!)@uzPD-3r8r=yy&?N>lGE&j z!a13HWM89 z!}&+*9K9Lgo*y)tDzO7Jm>RY`02J+1i(i=7sH#|8nVDqyu&b=BxSi>YFu_7T-AqYC z%X~I~3_K2Ws%#b6O{@j7cC26+0>xK$$_HBv3)3(Y4fL^Y zPqZT*ieINLGvvSp9ztJGhQqd4ks*Nyk~g5!hcR07H!3K9wS$P6W?8||8m>>R_z zA-NHW0)6{=7L>GGW{p5;#T9yAQ1e=hdzn-0L21X~8?;A!wYwDNV%|D7Q!jE)nA)0A zTquo7s%>>?_bD1y7z&nM4W^eO6)}(31cWN`HW?W5m-Uw@SNDUc3u_cKGro`|BRoWpy6DD zA>lg)M=K*&j+ z_hKc8^rcaG#Dt;_giUxNElwzOS=`h|D0U>G4oiXBG>gO360)&3vNoU~)ZXxE%8g)= zqmU5Mi{w{p{Z9~7KgKkY7-^8E$6Q8E*bOLf4saERpTwMlr!aK(_X%N z-!hMm%@q%jc$md`Y4hgjw>K;9Jd;~{9;e~sbxEy2W6rA!Q^5rNui{_f;ZzWuMw)U4 zklB(tZQyqO>T{C0?HX^94W0!YpuS4dxWbot&!%J5r0qbpH!5@aFug8=;j9=-V||0o z7ihY#v<7P&Hhf|euz>>M&LwsHFjES%>l#slcGFoApsBiYRD@;jo(vFB(e2@)++PM0 z`K!SA=Z)_Y1^71$#Rs%;HKr(KbqM~)UWlzOI^Xh9Dy)zA_+npyy=$nDn2Vk%(g82iv+^2y=_IJ@NRh#2sR9Sl0Jr0C(`lD4n@ei8Z9@JFhs!=-r0wm4P9);7x)B6 zZSJ_&s>OlxMlx|{kftaX&IlWzk#Fy@Nt?1{I4K&<9i$$5d3hw3TkIz`aTX#kj4Adxe5#nofKLiBiNuVj@X{UTe%Y)f{Cq~g~T%c+D~?@`^5p0{>_Dt}bfVFbK>$RiD8PO9zlUcY#V(^;3_ zpmcVL+tPY^Uv#z^+-AKndg)#m(RNFuAMjuKEZT67qx1J*)=w3A zKKKbfUXpcQkI0-7cpnlC;G@b@6Q;PV&m24PU+H@yA=ed23p>UVz+6iU<$SH(RAK+w z(JFB7gOf!ES6K$`Vd{^AHK)c;a5MU_{`JuHAiw9TvkV9R!Cfb0@#0t zv+`0e(AOJBjD?<E@LWPE)#-g*JabpU zSNR4uDlKm%kDvJ4x5}M$XthPrmGo;Q17kC^IV<`PVDj$92lYZ6RMTOn6OyoczEsWF zwpw*CsH+k!qwUV9XT8!u*K}C=IqZ77V*!nA2JTbQYBe~j{Vl~xm~p!&NR)DrTCD^& z@KtsG{JyLBn>55q8J_45c9o;MeQ6V9?Gc=qanu>FT@vgz_-~7>B0y-rSf8t@ayv%B z8E~X51N@Rx;2;?oRn>de8u^HuMRXy7=7Kswy2VqE9K5 z@mE^nc;kZ8O!Q5t1Qri>j1|+Vq)6l)P6l)GokD?4a!U@|U`B9kG#=00h4B)vqK9eH z!gJ7*`yg68INOy$KCYw3Hi;6PaEv8i5~*FdF7AsY_Tvbp{F*RHmNF{#CWGLuuxa*& zsA6pSSRQmpb4_Gc1D1|+@^NT+zI;h&(r+POlhR&q2svd2e#6 ziS8*hEr`=B|X6L>R*i2mdFo-}Pm!7J%2+DSx?T$52NM0ymC+w`Xj zgDWSaxOPl<%XYFUOR4K`_`Fkht!n&U(aO1-Y}Ouk{hiO(N9Y48@jtv=@6OLYJbfU$ zwAxv{42RZN;%bk~U`(^zR+;2ZZrXEuL41ZEzy9J&iGv-*ygN{dVLtxe24@nQh>T!G z2dn2X?3mWFHhHnRSHF_|9TLMJO5Ku)p64ZwS@qMp0%w_Wwf!xJab*y0C89=No7lN< z;$W42Kx*Nr)rxdm`NEN(tDe9znJ1+AJYbmzyN1AuzoYZ*`iOSN{tmG7=d+)_1X9y*-Vc%MEd#?~mA*A|%IRVIJnwdl;Y|CugfUGVgWh_#o?N_Y-ML-L|HXIsfKA1SHYZPc?0@FnpN%(=ezmqM!&(#bB9&ENel4V^5PY>Gf##q6KUHT~{ zmf9XOH0l9!3;|>UTkyk)@|3-IY3qrv z(&ed8Ma{c5;-RTK@xckT_9e_jwu99v%4(LxU~<2HW>}u&2{j^1D zFaO#Yx(D6ZNp6uX7qFu>MBMjMGhy!kOa1WsjDANq^4kcZa9E$%&A>PMm&*Y)C33}> z?Vbl>fJ%K8F;1P0;?)37p22<3TB@3*c0Z2>KdS|6OOFO`^2Ce6c}0`~r-g;a{6$V2 z3@&d9<9*w2gI*`ZS(Xk{StD}2U3X^0`y%$VC7A8CL~dI{q4I;i5I7o21s)*U*Jo6^ zz55$n*FEWoNdfIX-qMfbfw%G0#zx%5&7$?+o*4BD+k;V+>&u}j+9_gZ8^5K{@cfPn zRC>0gEWBKUGVA){1jmiY2U=YXY`Su>yF$cQx^0Yh`F|$RmQjGlP82%8(?&Zlt+eJN zxx;(8kx+T>N8gTt{cc71h1- z^ykCuN>=Gl2r(|*T|tw|ooBiG_^C~76L2iNWsASb9b#R!*(vw4VmT{u0_QoCrCCsx zW)Ho!sxkFi#;bs*qY1GVG89K%QE9CyP_TAvQ4CeU%{w5fkF%jh@$s=^kxr~X05I*< zZ)nx2#3YWOAv~u&ZFJuC73fiPHao)Xfmr}dq3zhK*V&e8bge1cRLWn*uCJjsSuMUc zfLw}y)?ij+X(;DiBw&6-r}PX@*-lH4r%p)n%ymPNlZ|B=TTP`!QV*sptI?8s$(4))tOFISpU?6M2`#t$iWf@Qp=y_{ZO~$ zbL7$x!C96Ql1XX1BV zsPpWMqbWTiQfeW3f_fH(hlh*1-=5?L9-qyvDCzLR^*sjcu*|i}cJfuvIyR~?81^mu zgzsM#zY*c}ZnJuMqMq=@HOXi^nV1+d_k5R;yi#Gx51%emSvqBKr9+~59ZM3+5Sc}i zr4gw&u|Y#2V8|BI%U0(NFpL9N9o%H%M&q=sXN@&_`!TucK@Hl@Q+bn|nCspkCW9Bg zgQlM&NJhtgrbT8>gg8$g!|xUR8ntlUu{r+$H!(QyvC$qoEehjtaz?eY#X(Z&{HRWH z05~+nl~=>@+%Uh)jZD)zz@(-F3|;||A(qs`PWrjx%s_FqD>~@z#0*?ju<+$PkcB_! ziePmzPHz=>lO-ijY4d2ZHPThNLolZRzDVKsU#?;3e_a-Y!-VL2uPYCacowLNwB^$& z;t=TD!z91<{c+x!NAa}fL@e-l8KFstGFV*GsOi?YpgzF8g39S(-P;e5^AUS6{Jl z*7`_)F!imSdX(SYWIj90QxivYt_7g1FLEj2x5zk=de~;W&7e8!!dk#Wt5XFH`^#IJ zn{(p*PzbLz5AFz6HH>B}Cq-Iq6RnRqKWY#D)*+!W>+ZT+GHoW2W!NvxUBVLkKC zcmf95;Ce*Y#h_eB?tUcnID-21QUOgmoQ56sJA<)hSmzEX>Sn0`R0X2f6+K8P0b*0$ z+FB+VUWTLdNGxhCBza0YVS%A=!Ps+^z%Uhk5_$cMG;3LdO8=)}@7DF+hT|c?f?+OL zyy9iObCaqo@uLbFgg_qtgdNCU>j5wWg=Bt(z$pI>=N#?w8{VKybn z!Goxic#aZC@=M~X>-iyJE)A6O#WAv}M6>ozOv!I5wBN;5r&@V{Mxm3wA1_k`PCj@a z>tHJx0f}&xZy1a#wy~tm8)kmzh{D;xhLxQc4a}i3`xa!VqWBGOO+uzDbtv-l@x_E& z=#5Jpg!Qw*I9OA&ejJXUqUn7RRoGqkx>XcdI1U(h@w|EVH@|1gQtWu~s^FRIiS?Pm zG*raZ+dmO{%$02u6;^5$Q1ra7J~>eJY>L(HvL4w-RgWdVzp>m0OK)MlAwjHQ=~tE_ zfTQEEhPKptutdP^QHCR5Yk^fo`TJ!1Z1=V6W@UP?%_9AFXMm&8xSjk!q#ivQ`41p4 z>p#dZBNHb(+kcV3tpDD@;D3<>X8nsg{kNu7f1)-2J0vjc-(IQ8f04j!|FkjsSA75O zu=;;T0t;K2TiGgE>*^a2{=xPL+kIlX9RJ|TcAvoQUo`J0Z%hAQ{T%-6(k1@q%)j8; zKj!{BQq1&8^!~#syL>iiVr2j8dw&qZe^bDJGCK#1Hu1-em{Tm zpZMfY68PU?;6L;7Hw?`BH`L4e*S}z5{VOUaw!a|Zf5E+fX7B$D_p<$0)c*tb{tw*y zKXC8=z`g$i_x=yu``143M;`uv*ShJ?3)=q$?q&ODc=PXYFWcV(mH#KWH$HXMa#zAO z@Zt&0-$Mxm@S8Z6Miu)qfVY)x;4r|g3dFo?2R0(_JfVE{u!uxsHpft(KABg0U=~Yp=IESzdy+ z4{FZuRc7xEoH&#{)<7#N?_WGdrHgtx*5fDH_d4Sd_b&L>c(m7e+B>v9KWe-riwdWH zImB+;hOu<_(r(2>ws@ZCRg=yj#$DQT@R zeb!pO(?V}}Ar2jP@t=D?!kAdx+lP&^2vAtxeyH`hKqjWoURD{ZmDYccOk_I^9VaLY zsL($9yx%ez?VCL;luyPpl4 zvYk--$>%CYPCxn!t+quqK<#=Ys-glfsAQLtwcyOp$rPzG6U9}UrPP=;sx+?R4{ygN z0JmQdJ8?BpF>>@|XK#JHYP=S#1w5cSU$g2lp^Ua8hSytRCwsSRaxU?Bz?~9-#0o9_ zvP|uIvAs#+c)<~r-I73K+q)UhM|2MBLcylDmQL|o7sb3P%HXWoeB8dF58&BQV<+(b z$=B!hi_**P6OINKGQKxsvSwe%o^h}v^`)>6Y{s4X)#Or)oO5!&c40U%WsKoW-brrH(6W;c69jaK18Ylo%hw(@NPr5Q?ToERSe{fpK-NR<^ z0Y-x6OjxEEYzlJtJRHYfD*9=mH!-YEjO<%&U60u4rI0jaQg{I;72hhdbs7n3Flb1mi>tNX=S^0i!+W5XcUxa_DVHh{7@uDW1CL&0&&wUw|`sr(a{Fr7fWri>$hF8c8Of^Xs z4J||r;=rCmZmyH|Dqrgd$o-X%TDrFfM#;M)H6TG~kVjF2L@7oZNQQ@^jZzbWMO8#d zh9}-MekX%KP|lgmR1XP)Pp9|At4gozXBDbh5g* zItW=kT(HrLMU*ipYCZ-zfSf2V@6;ICS8W4`dsWR@K2IqLKv9W#Ke)F#jl_uR5| zuyZQBWWt>KwtZ;Rv=%dR9=T@=oPJ}U&G{WBPRJPNsLhZ&J=?6&Y%;$}D`|sjui85&Ei%g|3t# zC~L1EXZR7E%^bvjoHa-bC(?;K@on&3@;Z;odml&i^r%*iAm~LcQx$X~A>lTs95ThJ zE!y=8eT_OcfW=OOnBMh(6o&i-EoyWXNi8{Yo^(gvCJisM)f0Yro!z1ncD{mBj%7Wg zUT#%yrMz9|eX>#8IyWS@T#xmc2pom~EcJWWLuKNFywg~e<~F~p*E)f7bCnogC`c!V zX)R%D2ggz6Ey^9<5()n=dNqVc%%Z~?yc z4SogQjJMAyb_#7mWN#GX|5I$P8fsHEkelAup+tX5%URF4m>QX@);l- zGCU+XJjJmb+1<0B10X8Wd2>MxC5YMffZweSL!Z5-_BUoT<{fwNSI^>yX3SSh&Q8D} z63|Wuf-JNGh>csuI%4&*U;(Ny24_?AF<&G<>2KR5RD|gt-@A|olZSfkLy09CvO(~hiNHcC~C4p9kXUV}Mr1)mW(YVN-v$6{gNNc%!^uozZi2kD}D50CW}dzeQXOiJH5oXd-jvz%?CZu*!MLV&xIVxibgiY&k=Jw^CKj)j`X z>-s`~f9|p|)bo?>B^I(ok8szi)&%CgPCw7%#KEONGtiKQfMC^KORi3NgI%UKOrO4( zu0HJfJ4v_H7P&mWPo246_lcujM^$6Qm1vgYg37~RVyG<2XB7=NT(OEdf4}@FoYrF#+;@lX}%Osy+(oS?0OHb?Fm-yu}u~2WmKKfXtaS#P~AA>Zk5x3?p*H%*p6Wg zn$E6C8VBDI4VSSCLwh5jEZpMOH?_OsbxvP?EJUW#ceMP#2XEx0@^ z%OfjuFfq2jXbKs_ob2-AMAs?)*ai;PypP-9SFx&TG544n;i49jUSlT9{-N*km#u5R zE*r*WV$(Kuogdi^F|Vx#9{Rk(NA$SQVDSBvgP|l_XVQMU

|YP!I$O_KAWa&s+Q-l4yQ5qIH@u#oZ*_mNAJDV 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

7ensi)l91DD47DRl(yqBg>8Rjeld6p?A{LXxt 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%0DbTdqTI<~ccQFa%l5rO%&tz{w-sCOx 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 z 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¨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

^9JM(FHbsI)y-CB#kjPrFybK#en~^E?v$+e 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 VO8@76ZwFa!*M; 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%0DYp-*xj~Z6v$V`D{vCc>_t-XJ?!~&E8=I52>DXM} zKuow0%`7N8vw!t={PpZOO6C;zRAe~d2S46*J#I4*CQDd&eHC|XGmQ88Kl^jM1<9uS zj~o5-vFw49>;E1P8Al3=%adBhoL@hbDM3*$TUSH!;o^1Wex<*)1?e|J%y8LK1^GfD zgExXAMM@!2BGntVpM(_RcCod4AQK{@!!}#K3-7;Q%iw=9;enZZP@Q5deBVv04 z{xnt=`ySpJO*&M~NMLc%^uF&~id^_Sf>+vI&z1*1k`ghq)^E&u&QsI!fC^P>C@C?( zzn{;AKX5QBIvl-JFpU4tJ3ax_7$yk_6y~3Heo9_w`7;J30C!_^uO%O)i2lkn_uQ)3 zzlig8lZpwl1_7a`ex1hZVxI+lA9-*HO7ncA7u|5~up;eT`8YsuZSWf= zL*E0%F&Ss4Fy!!ZUrq$BOyGMG$R|7F!a?OF$dDj!_U^vyvaT%}w0@Q2aP4l@VkNmC zZj9pSZLkSsw0!<5Wb%x6DHAC9CmUd*-R%BJP-54^*Py} zFxJ!UJUeqgPAcn|tA` zl;!oi>v`DGY9bGVJ4)i#g-&8(#8Y8rB3WP)7MUi`w|;?oyqaqp;+;O(uWqj~_>Y{LbftL&E?j4fC;#~oq6)2?4_ zPs~VH-;^_B1OVr+ldgybcswF?XSz>C?rq&}hpNIR8m!!{6 z$%;c0|8z)rZB@`}_iAr?zTHSfsO&luHY&RF3o4oaZ+BbBiNg!``JPxFTgSj8x{Jk6 z`jjPuw_uvn#7Q);sh*_7WSE?nqclTl_3VqVXKh2CY_U~g0Zog|-vWS^T>6+djc)0} zERR7NPtn*C=A4X_4rXn(@8FT4y=1pEcOja0ba)_6=54OhrP@#5n~o2)KMX!~%2|A! zi&mNkkM+EP^usqw7Gz4a6=b6I`?E$X|K6+)Z=L?(-DSx0XL{en=cB}z%iX#W_#%YC zj^0DVj51rGVjA+q6V@e^t6XFh2MN&zXKeeXpFhNs2wUCv&Ek@nv#f;J*eRF ztXP8bm3o&7_FLcS&CWgqo2@J4-uMWWJ<69IwHsEQLO@J6-mDF8e$_RtB29jp{?1G6 z&8R^5A$Uku=w4U(kw8T)YBXY@RMhzY=AoV4jX4*_f<}s6u;nuGbA8Zc!#KaKC3~}AB_V3sRY#xI!8Ejyi^^SjbQ(@A&+&*>yBK*N2ic^J zM-#c4C6_ychrk=p_x)zl;5q@~L;S#MP@i$nDV8G#Va*Gjhgj;$p*}_&F=*(|E@U>gYxv?X|H>;_{I74bN_b}0M^|_ z8;_-TslYT35&Tu%4Rah_w?5i&V+tZ}v|>0#gl1w+O~izYQB(FT<*IFr((8NCz~AJT zUeZw@V?9$P!t$Q*rL-9S{U{7R@W_nOUM4c)S+3ay4?x5#!w5ONh+}y+^06RyQZnOuvmM(Jh6hGUwI* zOBJ2uE&;|?Z0~n2I{oEzv@sD|2ivbpz9b0D$WrAw8P)x6*GR8wL(Mfqpm0yNo1fey z8NWu>Er&^PP(ulQ0$-8yk?m&y{gV6A=*t=yY5Ol{j3Uq8HCO9;P`Q1$9#V*j<9E?iUtV@1dypC5AY zx?nj6GK@4E*_AwEuYX{@<9Y=FU@?uZBlj*RD3pYJ~2TSqrTVYOz3=0p#Fc2n7m% zJ7n}Ao;ilSbWc>=)R-3-LKdO1eKCfYp!_pJ*to3JaL`s_*AKcHkQq)1?Kt1?h$G_@LMPtERv zp{Iuw!;UVuF<(#1hEM#{mhZ_XmuNBM`S**(x1O|uzlOl89hr}-umd?pu55hy@aL0BFdeskKS1AKMnZd@3l_B#R!iq>)4xX8alE(9(B^-Kq%S zry|1hdJk@=c!qPmKbqKuxo*+eizREscHufvLw5;hG>@xI%MR=y7Z`6FSHPfuvJn6% zA!wFhZ=e`dhO9kOP%=MtT#B~+v3NCP7PuV>>Gz!{7yIU{|4-#y4`D#gS+JqI4JO~F z?Ey$CalS%JoNuT~k?il_aS-#Nr#rFEQ<-`uAKr5t{$qer&-<6Y*y(OH^Ct}>J!4y8 z2AB`-uO)DnaiKNKlnV$H*2GKCMHknajxB!)D+?DO6xUh%8&#%OLml9-NadTJU!z4J z2%u(Lthh$*n+{KKNK41Cr)wdK=QE$b0iV!Pxu`nikcw!SK7kzv%7kvO7Z9|%|JJ6R zZj_PQ(7`Uyn}d^2lP>Q+L0U?9xrLrOcYGjX)g|+Gf*8>m^=uY{P=quD=VdX-M2RX76VxSbGS9} zMzDC$Nd>E85jP1{@bTff|F`~I)q8($dj4zm92)@@WG01QxBd@%@#wAFie1p1ZckHS^fGW z*qb97A!*A$)GEcKNion%D_H|!+Z%<&+v=bVe^^ywjgMX&Jn0aEh_9rIbQoqRkZ0|M z`VEG}{^Wml6ABjjqUW*w{!N#?hsy3d&qd;<~?f6&zQ0G?5`KO&PGzf~8DjPy%|HDaw#nPeCoXMFMZ zd&6FD55+_M2@sD~?H9uHXaelG7K1-SS@7|BYLl4|9Bh_@J4;|8SupBBp$QOJ`2 z-Ds83&fKf35@~PR5-D)#h+gSNSfE zBWpl_SLd;Kz0aNOuIlQZJ5ovYGFMJ(lQUMGJU&EFtRDQ=YN%S?g(6ivwCarg-q%x~ zEr>%AUR$t*qZ=Su+V7xOBM%iyIMxXMcwGfDBgC(MD3iW8{U#@mI>)~xR`R1(fLgdU zz||S8e~t9s*ir1b&2ONeeDU$XC71wHdC|Z7TS6ZA+%Z$8J`|jzCy9L+%`sg_$ZK38;)kXq+u@}(&e$B?z zjsze~0PSRLQKJe_Bb=osaTSIz5)odgSj3b8Ly{s*P&|_i9D*2|-3s6%V>7x|L!8bp zO%bm1M|_<(Ex7sit2)TWiwcgZa@76lH<1bS+>pE21jB@f_kLa!6p)U+zzKY%rO?|# zIt`CUXwV*0`X?I!Y$ciGjq*%{U`M}_byN7;T2#X9CH7*fnjR9nbtNxk|4>4B?t^CJ z0v(c!L4?yBrw}o)=85FGZp&VuGw3Uz ze`{G$BOp$+AQQYsf-Ut<7RJ!W6fXX#HMe+ssCkeVG5`r?d$EfNAyMVR2JVJ(pW6Q3*v`>Ew%LkS2ibWU zs-AdXDf*kZT$YRVvstGOa|fPy?_LkCYQb+a@BhN6KWw|VLu%gl3C8PvhLXh=&W1VS zKdF!9G#-TN@~B@f2=sbkQ2=0Qp)OTVIB^W=fI`6W3hBRzsOr}r`T@XCZxSFbYE+LQ z^)c*B3dVNx#ucsw)u1`)NI`HUYlUk$e#Y1UK5nwy&N%o^atWlUxgCQR9QAr%)sC92 zKUDjyS#`Eyg4-=p^W8~weQBeuG&VMM9;{H7rT}=-2&pnB!2|!*`{Ie>0Lk>D$_W%F zVY3x!cYRaIbf*rok%ur8s;$q>H1*P6zY`Pb!oJ8fA#KZ7kHiX_M??Rde1JBO|fly{`M z^~-5ymp4tS=hi_nHPt=Xu}LFZ$>9mp%g`;JU*BYAIj#dr({p8SW%qixp|$>jTMy1> zy1mD$|6`oO#Pc2#5gWI~vg46m=fGf33i#G}UblWq{e!O_-y{Q1ItKx!sxaiV;O47y zBI~Fo#F>@GqD|+U>BP%z^$1-Id?V5vMWZ^eSGw$Z;d5n*RnAS)=!98texc({JdE!jF|DL zwj5)zv2c*N@>4o8YF=o>g#D2!;M!F#y6|xm@Pnbi;st>16(JxlM+~0sxqsV5gpuuz zlAX#vilR8QJtg8Zr@lQ}*J>qEKR;FbR{*JQ|(&DlSV25h~MSFhgeNCMQ8Mq4IXV?b^SvY+dQ7s41$<;x;_X2Z9`TQM%Yh8I^Q zxbZxJ$K)fV-ep6SzjYF$i$P;b4$bwGOY|I;=>P1bz3_uq1Pa#+If)d3Kl-q$aiSxN zlaWwE#J}#8KYp!QjyAk|l)A-hZF11ifxjG~dNoj#%CSS|iwv%w7v2Tk(EReMb>Cuc zE~e81+B5ybdY75md~3AYDw>YO91(1dmPawn5O(F2X=68`G@5F@lOlL&I zyI=lL23hXT~^aat=}uX1nwRFXK9-EKgZHZk$KX_HwPk`lz_8I z81`C<-K+-Z$j*zSvYNRI&MZA+yCL}TTk}e)7rLV7P4*Th-)Rpyc>y~TBWsAir&wYin*b>4J8u=HG2^om$x+#Ni{NV>(5l#^hVWViocFQ*P!iiXYb_v z*Zb*(VNs9^1^ia)w}sONd#@7!ShgggVHo*V#(Fpy@QYUbnXu;AIa^a55dd~_cO-?& zw{84zt&UXsp7oq=E%<&sdCGwFaB+0zFx92!4qAN%Qzfm{_AwR3$Mozwg_by8ZWREUS4IXG_dhT_dREMo!96bd|$C3*^1?aCdssQ4Y z&a!P=B3|Pp-+FcB@Ca9d8rh|ANzT|-wr0=U#0Lz=PIp;{Er%m@S&xy~vpT+F12NAb zIr*39VNV1IOD!*5^Oy;1)WVeir6G0N3Prek!&<6Gb|i9lTBKU$O~Q5Nh#8u=d0Tiq z_^xs4Qqu_rNV@cBL?VmV6D01`r>*qZ$?s-%r5w6L~ynW99M+j;1NS@2iz6(VxgWt=3;enmHBQ)My*Oa!Jh$k)OF- zlCZu7L4+9OwxWcl*xQ0t?+p5)4+dBa`84_l7|v}NYak3B%I8_u7}0QzV@$Twk=FTsIoeVh%8+fogC;wbfLR8@!a zDcxyR;KS-?E+;FM2R!J8l_~6xe!uK(!GwqQ!tNl-F&3|jYVjfYh}K^d{|%g52*&e| zIPk5mxUJ|aj5tZ1&d&slw%{uYKx#q(YvrbP+~%S|?x}PF)MTXI6fe%?#FYLaeCWEl zyxj4_mICk{gC|Qh?T@p;H|&r4^ZO*HSrc=d2bqqw_7=Zamob&#KEFb|y~WS|*hx`e-r7JUEf7uG*^mFHH6uc#u- z5o(ELzTzX@M!)cXWT_7bOUiu|4dAl+pwWLci90xB$O|a?zQ)d;sknhWRD`Nib?x%K zdkyL;6?TN#XShnm8l4W)PUeh;tHq4-Qmf|bQ}URfvaWc!p{?cq;XHcRNFLpAThNF@ zK?nTVq#3~So@UvYI9%1QFACkh5iyouKtE4=b|+b%X3(0n04~VAH2hQLBiQLgICF#2+Nx8?<%Lun=R`eyHN@b#n;D$UU+ipghedtnPio1qBmzcIK%8c zHo%Bx)Sm>1^kD%9!<-b(PYXX>aB_P~A;-a$cM332XYS>?m7{5J4t58H1}2YQ!yj=Y z7`^WC=sQ()@P9+9My$x1Tqi);zeYSgO%Dfs_$vn+`mHTDXOXS|*-{uvdIPvY>2KKy zlmjd~F0C+9?%ydE&0|dmD^HE*FRjW{?+LcabHU5wjF^v0i6wsr;7fHwTU3{|T;3b@ zLlhb$?ixxa_2`NB5vXkmYk@R?(@+vgf3;?%rNrt1A`Cc_ehev5`Tn)S<02GRsn!#i zM6*FoHBgpJbpU2eaJeh~Q8E{P+iOoxh-oYh9Ld9I`?%hIV=I?B6Y5YfRqu^qr=QO} z%4-Y&;%}|y>Z_1>s$p_11r3|Vr()g;c8bBWO^*Nibnbj&z1afS-7i*-*W$tYy@`tz zETA+5(s|)4*5I3Cur6bUg>!pdHx>+ACV@gBhqN^ zHQ!Y(zoDvrJ6whOAhmviPnurkhLS`_YfnIFU%mg0gjocSq6%b$0E@8cFzlC^HsbI5 z*nt|3E(}A@tiUF^5=?lO@4UW5=VYql?B4Gc@25OG?$>Jl5OCoJXlBgYe&^+&I@Nya9+K%+@XqMsX`uMYSBCAPdr*9Rn>Ce?-?JO3T&81MZYDD30G z-m{^&ss|$H;4df|3eue@`2b)D#d%w3jh1b&YTo94db(S9_loO;G~-MZFiBX^VhsP) z3jhC@dh>87+qiwavS(~5Yqk_Zb|G6)q?Ck^b+R)dGKLA+MrAEzCka_%ER7hu>|01? z8U~TFj2U4pWBFa4_kEAw_pj$Tdj4?Fbzj%#K0oJqe$I>IF(hh&{Ao7Wg7}&=;UJwn z8^S}VNzzn)>+-MH&^%4+sb`XmlM#i&!>b3?K0zOkHEVh^LII)DWk_>_n#+`Wm3mr{< zXkT7CGOoHJ(RYhD-v-_B5#}uAaI_SacR~KC_0o{8z3DNODMG>o)1IsDjTxkpE^rgE zN?P2I-VWy%PaovQ1g2ktPvL#kU=FCQOx}@iN(hNP4VVL|LxdilAtc~>xKgvAn%KZP z9KdU67nsncC3A!UyRMd>P43;J=A`vO%z3S(Vs2RV!4=%hPrrI>@)YLQKXXDg;pDA< z_x_e%>~d2oEz_CTkO3dzXTk*1qn?IwCEqDJGB|cyQI(-x!2+|q8eqfN6&YZgO6Wm* zpoN(ZElHwrHwB3nUb)x!f>bg_BzDl@yl}aOt`q{XqQYq`p347|DW%h z6VgL*-rUMy%^Tl55H7Fdw7n;$QAeK?uzE$? z>f`r?rcc~*YJ1LQjsdbVR**|&Bj zBgT>T+hJbLT%^_eEb@W^Ybs35F|BG|Pqc0;H=6|~hv+T>tSIW~XxcAj{!t5&f7z*V zYxi`Xld7X6td+<3;0K-=k14C-lp9RBc~!S+Di{9S8P-bjKR>PEWZLYX{wzc*Iql>3 zRsIU}#q9la3;VI6=hx!q1Hm55nVU$vzqnnXrtf*Siy3NFv^z+5aeRVCLXpI9meqE$ zZ!>OhDp(>V8P@p!|KG{ciX4J320q_vKo9gBecdKFa}RUO4!wgsr~#Bv2(FNa5gXt2 zy$O0uk-CaAksJ2(9bex1;oFpS84?UYrluLG!2O`o0DDy!0$d$UbSq14+8D z*d~{$K&%MW^tP6JRpvgt+7GXC_Nq|VDc~EX2W1-k{e2^t{3Vp^m(_jG3^{diGQp<~ zm`!_Ra28g#w#UvQtXV1#d%fMRwaLBBJx2SUn0k7}8f};D5BW>9Z;;Phj&3YGYV_m} z)m4jjD`4H6u8zDtbv7?a4KRt=N8{IBgB#V7eCi6Cwvs8tjKKJ1xx;Uhb0O9*TrUy} zd5bv@)QBy*tsdmPLiookXiI~ic#q z)H<+V*36;~w|QH(x0fpe$lawoTIm!vLKS(TPM!&Qz^x>TBwJc8_>0UyJZH7G z&F=$sA7MUIAqV;FyYCsAHBiwP~^n(>M>$<)06xThvSX{tm6Teac+9yOTp6Z zSo6*Eh{PZI?MZCJiD(y8&wx^69s6FlE)DOlh5!cPs|Qx?#g5b8fk#_(!v;dVu`H}A zy8il$@5nDI>LY0(FJSf4NHA0WN}a9^T~_hk7>dukI?NxRn5UM^3<#l3Szs}?wLXToD{i5jBznQ zR7&i1JA|nIWFubiV0L&qv&BAQTodw{WBSr1FDBPxNEel&A&(Zkj@Io|3X;#SWoXVk zx}GZ-!#d7{7B>m=WbS#<)$OcDE$ttSNUSqt6*atzwE7}tgYKWwjwE4cL#%YU@7tw< z4yG5ha>_WJhY)MusaV!2)g|w>T+V|z`IfWr4!F_XU;F2ont4`aDBi6)XuIiOURqR* zWns;hraaqxnFR7K<$J}gPl22XYe2Tc2Hu)Y7>d8dSGskK<0COoz*KvkpuY$DjS45t zu8Jo=JKh|p9#92w-sMsEaX#{bcj9~PgC%0#uKcu%8~(q#+^QLjQIcIhzRAlFs^6N> z6jr;th7Ft=g2gnl%wE*#U~jB-3*ihE#-*X$RRq=-)`ywUmRCrPt0VhXz4XpsCB(`U z;j<-nsSnAbQiMG6lhR*3%>FM_wwE3$MV2e?QQJJ^Bb(f?lXvZmyRN(XGRZn(`IMDK zm*YSEoPYWZwcS-N=nM##yf*4nMduq<3v?UpPi;f9et5T269X*KWeP^y{pu9fHl49> zFf*~{8rgJ3Ao6*fIajp+9dGVWi;_+D_Va{4s7Zi9?w}MiVEiAxdbXz~9ZS&-HaOFG z&w#Vv>1^u9gzQ|Bo_R|Q=K}{j26AmIcwY*B(2S+30=CC@`{A2J)4T3!>lS7G7_OfEE75HN+LJK>j%&In-J8`^qs}YC0Ul1DZJeBigJHY z)s#RHM~58*tzTA{s(Btqu?>X(ED(|LxVo@ey}t$mbUw2CMt``HO|t9oY$ei2Y$5}e zVhDEMC>XCxkADFKa6#YP@4ct`?nA`oQrJ#~{DWXPDv)CHa)+oag6l)?D}=d_ukdZk zN%$EMrm?B~fWOIFER(HO=gfN#`=F`HcRDC5trxduEH`6!_p{ARt6<;Ghy3>@N_zU%3O2-j z-JZ*t?GgN4NWr)KOG@#xZ?n9qFkbPHy`4X|nOltLiL!6@c7_!_{mQ@6-Z~BoZKFse z*S2QS(V@GV`&K1u1l=8atofM})YR%DA(Fo!uB^nU`&|C+F?b;S^!O%=ZB93hP6p)9Qn9t1aDX{&c|=Ij*g;Y#ZL+&$ z){9B0McWC<a%9v(%s1?5FM9*fPmgV%U^medZ5IVL?bNKz5$`3wG*5oy~v6Mrm zdwVcpuOAOe3M*CLziKpV$o-or+IV*I)EI2c zEOE;P2sN{V0^21w-ZZ`{dcGxuC(-8X4w8d8+|?^nejd!_Hj8G$P^k~n$1P@|HK=! z9^JY91z(h?P3V-Bs$U~kE&t*_qe5keCNuAyo~2d(UKryJ4MgAewUHeYEMCL$s+0DZ zKYv*@rBf2=oecYO)Ts^INhjB@T0WHKzSne2X83(1KEZk(FC4t`9_G`s@LoYw{1)s$ zUZ_%oksJ~Utgzp9&YLNwu-yn5y*DBGKR^A;>RXZ@OByT_`fzCKJVw3^Fyq|q^1)rf z^tj)fJ@nL{?gQ^dWE62C5u}dT_KlaNj#`s7hm~qFvi@wCV)J3#Du5lgFi3$|l)j=g zEgd5N{Pbzs`;(47rWuURDI{yzSQg!0c(3ExfIP@!_Y|NtRSM1WKh1}={!M25pws)E z&ENcf>GMI>NaU~>(c7&q_zYGVJY&Ut{ zF8++fW-!9ur4PjLLsdk@J;dy>D8rN$yh=S;? zyI8~ulO~C|r-xHFaaw2VNhu>V&KK6BT^QU2Cwso?!lu19eO1bNE-j7V&MO>pq2X`47=ZAH z-^V*o-^V9087*+kCpGjr^PFCkJ`W=YgTHTqKqE28384+k7NLlj9orx3(kDJnDT&n< zn^p%AiV}Rg|3(gk`bY`B-TeUCUA}bM`B|YKm#XYe{<#eH7P}JBW+G(1iEOw%UMb+j zWDl#(1!d>rr*#~!mY$t}#{@WBwQBbs*Bym%cr=|;8Fc(m)(8qRTYa7EDPeX;OL&m+ z%c3{888w-zh33XTC6zECd*G3Qr$13koRRJ-PF;}2a*jKFw_K6aLLPp%5FG}2&Pk{v zF%NLCY*is-$S8U3W&Mi%?ZX2~p&|Q@(Jx}J$tEf0ladzzM;>B%-t#{Vd8-@b^_{gYu9S^IeWTK^-z}!dLhrp>j!e*j%Z7S(_IiDWOwtc5sdemj6(1X7e#{=w`* zgqH7h?o(D%0cXBjy0y_rGkR?v90bu@GgVDmu9}pDfBH5rN3;69_~!D@3XDmC`YW;Q zN(hY&baetd6=f9ZkO#EZOkpy5?FH#gGOG%k!eiIQnrR?H{YM9>M(I-d%OdPnG_-W> zj!`dVQvt7l;0?Dv_Hv%5Uo`q59WMN-cCdYr+{>a0k!I%BU4QYU(V$?ve1(480h zQ*>%&7o~V+gUyL^dr^A6Lth1dDiiNG?Kb5!S66pDBL+&#JMcLBmSv7)vqM^b+n4f@ z-BVkKplC9uOFu7oe$O@hl!JEq!ojuD(EXRs2MMoKX9Lg4bdU`TQ~)Q1n$9)I2&iA~ z3Rp{EOt9TLL5N-lsd0py2BcNsKFmM0-tS>oq;3xx%J_2e9x;Gc%6MB13!l z#5+jXd5`Cj&KKPDPWww4xWspSRABFU>U5gNYDTcG=F%@w4C{K+g?I^-a#KH=e*L#V zjd35LSvIkdQOmgkeA}z~3(}bc(=*+DFCTOe0DJQtA zugsmE96v_%j_*F`G~117@!nr6lo$K^dH7)U4K^v)kl8JG(Oqam6(M-K|a472q| z{WroS8yQ!UTXkg6%pdmH_P>a!JdS-{HHCp9UA3L=`xqA}0@@kiYU{*6{hN8t*{J`P zDP3?77?7R5d}hEHLNlTf4%7JOr-#|D3< zPT`wZ2k9=9>dFulFW2CPHXHBP95x5A6)^6Xe)ecN4rP&GPJ*H7BLdc*}6 z>)bsf$L84GAkaE_R+YUVBK*{w+#B!L_Mk%_SJuu6n4~9l3B*9J0r=u;Y~Y=PmU0kR zfv&g0cgip*k}86O%{_&fYhUnSFbb_{kddLc`FQKMLU^FQd7cVbk|Qt3FQH3UWMykE z5Vu%IzBhTU=-s7lHE+G1tWzUw9x4u=?63VR{80}6ogo>7$b6Q@uU3g?a;h`RzA;Ck zIZtG~X15L+il`Q1rrdaPLzafQHuiR15tqwy_ z(ptO9GbjP$DB~`~bh82?jrgb9E^cw~ud3&OF>^dDrP9}(Dq$J@ng#f*Bz<8QpP-e3XEqWxkqn`c{d_y}Q2(mu}@*%h3 z`vY^zjHNmrXJO!VY#I4Yaj^G46Acr_5cC>p%+KQKTBejAs5Cnv8L9hW<=?kSmElJk zxv}UJR=}TgL6#AU0>lbeAhUbgr ziW#>6mSHvTF8P*jPy$k>h~Ev&{ubo+trYCW&I*ZV|C)OC3C8u73zJAWI+9VkOZ;AE z2rfd{)n6Z%hZ65id_tO|bwO_@M2H50o`!6tmSr0_a4Y_$D~o{Px`XjyhKGM>yfE;5 zYEDSCbjqBh zahDxA9Y5A-dN%II6)Mq<7pg))j>)2Q<7JE+x=%_nxXY;vexUdD&bynIZQx`AN7DRx z!UZ}t^<>ul&XR$9ujpP0BCMy{LDd zj|&*+g2y?v{tRhXy5?&@X^x|G>o`SsGGcB&wF8|#{}C;BkmJ~>#Rx`A`c^*mn#n=& z*575i?QlAq>H*g`S8lupDC=G?yhG$Xn}5>AJXEW60AgBi%yGfUrLoCj;M*myt>`iX zK}Y(>m!jZtmQ{A@A`joB=3B&%3gX?3`#U}?!qUyTT_V^|M*X->n41Fb0OUjyT=D!7 zDZSpIWb-Seg)<&Go_{ZvSgifOPg#%WI?u5Q`#!#6=e?6QIDk%cTM zT}5HbXgajAcei3UVrs)YDzK{U1%+s*mif)j?Pwhl6FKs{`0qUkU}U{XpDV8XxJTQC z_UNdN*fe@V>O4EB0%)JVwaPdo#w3FGQ_cV;h!Lz)2TpE9pp`v$edPMj4o9py<>Un( zNbGs*#CNxPq_nN>*?x5V67F0$ognu5cCCuMFG&^&c~vwefs=Fny72g8COAm^Kmi~Q z*>h7PQYU{KQw`Pyl#O#(n8~Oz9S`-DWKibtU?K+v{I|kn-5n$DWJRns9XXQH?q5R| zdEa(5z7;fuZi#lzo491dkG?-=>r9mR|9e2x0UUnx0hk?5E8VAtFPY6|&OVU_wh7k{ zW#y;uw}IZmfXz9PcSOP1oO*ukD`$MTK^NR^1IHRUCd|WH=tHOS^QL&MQ{!<$XKB86 z{AkvMyPlU|;bMe|tAS%k8%q5QyO~!-+fmUwvdFE0+Gky%Nh1kHgQuNo?e3?nhW$1N z04B}o!C}JY?_%8>pbZz{^l&TQ$4;L?Ps6&yYz02b6-4A!S7UP-oR{|DAWxA|GtEtN z6}M0(Hg~Ef*2P43yf)e!ynx0dTMa;J-@AC}S3{-TE<1-L1S;C-Bf!5Ml|JyF>`u7H zvAK{~wDDX=zep+x42sLNlNVbHJ_`}}SI(`QncI)$HbI}~z^S<6Y^s|RZLd)2__z;7 zTxSfsyv;CHJ0^U}IECTZ$;*UKP$W-(yNFIt_jFvw*-)oyrTKc(;9S8w`DVe=$}g7q z=Q5s!G-k=4cEvuKTDI(u0{{sg`(Mo&c);FxC{$*{m{+Y$M}zA=i0D3u3ZgW}!LEJy=pQ#Et>&FX3Nv7Vx5hmyB zb0Qy5iu`Qons@Wiw&ZSo1C>-qmgDbVIJV6_TDs=xCMOs58|^8jyy{V$PGXo4@(nk_ zqw-hSmR0jhtV=G*GFy|)9nf*Pk8Y!?MdZg@Wl!Zn8-nrgaFQWXUG6`72GD$?DUP1b zjXu0@Up57jfqF#La{SbWO>E^ALc|SFg2VgV2O30Vs>TjpPY#fzQ~o*KtNqVgzMo^W zFAK&wkeI}e2~3r!rHrwI20W4N`b}Y%6yDQM3>+W6cMpN&%nIS9@p7$O3Tgsf2nl~p zef)-uac~Xa9e0ZY^K@i>-g)Gl(B{`8NiqxNg851d70aYfYqZ(Y5d!^w?r?cxS4{!9 zHhxsEL~z#dSAJ)&(HC7XUHEIC4k%}lxP$FMANJ;kl#l%07*@HWJ*ulHVPRH%x#ajKq`TaU>V~Q(E|}i z%lXfEF}M7+aFW;EVPP!n(5z`%;93Ga(nZ{C?QJ@V*Rck7fsvnX=?1G8Ubuc$aU3`v z;sswi|Gg@}cT4H3gujIg==vcp7$?4GrVnFz+j$He)2h?ZcFZCMPFDO6aZ>t`HKT&l zUe!aTL_)V$V^F-rS@j3h8kZ<*gNmbqmYb;hF~0*_|5oNy##(cLRZ$e^wpoVk;!vm9?w8gEph>SYN}A_aO*<5sH} zt$ZMOaQDRclRiPbm)?h(`v>%1b>bk4i8o^n z&;U>x4>SWs8C{0ctSHTAW-T=-KFxd8_?F#LC>G`N-Ny}0u30txm|zDpo4ehCQq`y% zj10~aKe4j#H=&{jF!r==3g4zek}{$|*y!$IoWl55u|ydTkUC%>ash zlO@zQIc+?&QWWg;N1>$PEsHj>vq7AA63G@HQXM$L^ygW58%ZJi_o;N!Ib~uXbN@>8 z)(-n#RvSnJ&wb9lt0vjf|lYE${8a#5mJDT`?C52Io%hYcWy6BzWHwwJ6aOa{g}{6zOq?*_N*g9iW2HKVoP3`HXSdP7DS8R7(5nJw5s`oRjyTk~!cW zqfpUQwNkt9O~4CD^opP?953sjWeo%I&>QZG72mskcz1=7%ujGJid#MF@kb4U9s}^P zds+C*%DEne@$04vng9C|3SM@(S97%Evb&sG@D&Ln$Uy0sP)%4V?<@2roD815u|N?h z#kZ)V%6Nc0@VAGZ54=yh9F8xjX7F1KUmkWA!Ww^5B>m|+W>4pwceWdfVm7W!JI8dv z!QPSfXd;KmQlfj0gd-YEjU&k?$jmK1e_GXUs$tuZBQY^MWv$J@Q**8G`X-TVlDLCi zxJajGW-3J>##9W_^WuJJi8J+9i*}UB&8%A(^Ap#rTJ>HqB%X*q#=76Xg>oU;D)r~u zm9hxR-@4$2oKAbBbOHoFwj?K(( zlY_4yM~kV*IG`sr6tHz*0NjC}fR(=!ZPX)T%0nqES3coX(?l-D1CIhvXh5mb9=i+h z_)hq)>*1eD8uJW9m}O{NS9SqM(m#a~1aJP-6|y$)nY^4ACfk|zbXdN$^_^PI`}nVA zNrBAf<-oeQPZd=%^96+G!kEc)I!Is+5X%&k1)eIypQ@*ww5WwZCd3?$JA|B9ql#~n za!DoFili32Tncl>3`^^ngUf(@N^7g4A7fP#;=M{O%*&&T_aJEY1y!m`KU^`l7Z9yZ z5BVf&h*df@aZB+RI-J!b$~OuYRj(9*gY}jzoGm%TkDtg2o7Rw3p4m6lEe)KR-rFed z01;um3{inxh{?vBW%~|l=1oma(td-Xi>7D!%cO}vpH1rM+1CHJ};R>`&Gv zsIqsolj>McB3A4C=xp#*Myw;Z;DLnn^QKWB-Wj)>ZcTt*1Lfw(i7nH?s`o!u2Ykn* zd)FMzhR?PQ8&f|b>x4bsj+hpgO~$T@HzM1&T6}`nlk*^&HA2;5;NJU0amtrLLCi1% zvh()OtZ5lV0`E>{=}>2Pd~i#@d+OfJB6Un$v-5z z$l`P}!ui70bcnQ|sHio|apg4zOm**PXvRIyCW9W(Wldv?GShfn0gTSKxbgB%)VFqn zMK*7h{QdY*HJtm&oN==*9UW_h>fC>G?kYe5yj)N|J(JA-Y_-YBI6|_N0VB`epZ*c~ z@A_w`=Is7pV(523`J92DdsZFAh!LRV-uPMLZrqueDnQP`*}t?_DOXxY;qUnb?#=14 zw}w74miUkqJ^(IJT6lm)w9%auV94Z!oOylyhCkjuG7xNfkDIH>(5(2;t?yn+{v|{k zoEKyuL`nb3vJkQCm$C+EYL!sO3B&CDFP1BaG%avNLp+DiFXh`ph{=^B{JC(^vkMLY z=#8I9^n~usGY<-&f_m6$sqX}#W&COme8e~1?zie1^%iC#veQ@pjqvIBrV{9TMs&H0 z((5TPW2?8#*ev_}aOP4WE$`aC2w>bmT5{Q72l?Iul&jh;0Kt174(;l7KY8^jrPq^a zOi|bp5c+036Yg67`SC@aQWEU|`6m}N{^kqy7Ow;xyS^L=LB>on-6 z#@9>t0|Z$#I*7`0e_2JwxDNKP?>!REpV){+th1G+Ipliq7=_%YD{MCRm$Ves4PDs&6Nnm6E2Ilkc%!P~w zPI}=UA_M@S_Q6COErS}^xcEJ}yHDw1BOf|l8rQ|w&Lon(U>|GCt1zTh* z>5oAPsW+-zynHzB-EPG3&6I~&QD9oAzZ#%@<7SeBqi2NNpzowO(iJ!+Y`vtv$eU z)LZ1kg1IE>Y56Ok{;1~fTl2G*fmtc#aHgq#h0hMUW?zwLzJCHxeoo<#U~ynn2Tp;R zwdPL1Js)Tb3lWtuZj}uE!ug~B(izFq2UMpj?Jg{Y&oxGDPoQOgyjmzw*NMLRPok$@ z#7m{?A}PjqzgszKg4e{43sI=g9|kJ%G-if?IaL1WISli2R>E=Cq5nhu$Dnj z=F5I5S^6j1rD!cQg^ojC6;^qiHV}{qftR@d2u?l9(TcoyPjr4kiio{J3EPf|H*h^U z2e!tse80ZsI3DHTIA`Wl+TyXlPtdVl&U)>?OxVx6IisP3#KfYSHjIzR01umV*{38= zU_s@j7uq#;f2{Lr_&kia^fpn>yTf!VVmY)YF42jU3O#{Tp~<#r@y`Mn`eJL1S6#ldg#CfHj+Su6&^x^A8*yI>5$}^fayq!USgHSGv!jK!3uC)vhrD+IB!(cRTv{fq z#@Ow4s!@E-Zz5#u@W;r0M9Dta*z+xN*r9P_-LTcB;dJEm&}*u!fLYxt*9afIv$MK% z2n=HDvcOie6P(WvY=$w*3Eb&IYDb=%M}5qFYVv$H&t239qOGtSnofSBizl>DF9Vpz zwiLE9(K+QCcIyI8JbC6|RX`azqPhX`0Nlq6f_c^*)LqHavO}AggR23K$mIsWJ}e6x z%xwA3=+Yo+|Fke}ui?8@ZzA@e;B^pSj*gYUPky9nf&f#(&HM0-6{V6Y{-@5kwGR

5D2y4` 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�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%0AX># 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 z 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

?FyA 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%0DrU0s1W(29OX=?V}srgW8v7MvW< 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

wrv00~2JA6okgEec;S&(X#%V(g z4-}P$?*Ga7ou;-O9#G&Z z8;wvwnMcU|=Gf}KP8e4jHPT3&FfdifuuBM6xsLe!Nky@C>(lqs&(9j4=;=53bzXQ- zUD`EXn)taM%H!{31s(sX1;cd2?^Uk)!w+tb;DkTM^z^TPb4mIXs<(T|ICoB}lll9< z>=~C)v8+v({{;tP7uL*4zqmRwhYafNl;yp%n8&{|Wr#A$@KMpxy43}K&Mj>^wUysg zcA!L;w0zbr$xMHA!~yGxPw7l>-XY^Mm_st2?E2Mq7((s7d zq=IntgReXEBwziIm(sRZU0QSB1(*vzOMRy$$Ct5HE(MyL9&=_#ZOi{xxO(EC?=AZ5 zD@%J?rg`@VM$c5Dg2NG8H!%={YjK>DWzKvpS}wEpDdDF6$pfoBMAA$HU%7~$O2Wge ztVf}$`2rmeT~+M1run&OlT-=nqS?!_n|qlio|)#?pxqC%X6`ed$%z4Vr}qTT-#+?H zSO_eCva1OGxuJLaLRty}UGd-f{bQ0}&UQ<0&$B(Le`sTN5;7;4rbr(KcQn=ZBFXB;1GJY;K`^;BjaY$%w!gbZP%dzOBgqHPHZn}3!gkI`W>&qu?+xj%9!*nX z`=~@$6Q{im_)(G}uyxML4jZrK&tFn$c|wsG_wX!iPOSD*2S?mqF{8G-gQbT4Qd0`P z6tj}6^9BJ-^?$zkVeeRaNc?8q(2Bo#fr%D=s;!|uO`XJmG*%dtg%;o>2xLd9HPIG3NK@|3p~10$ zRK+c$IsN!8eILdbl6t%&7ARt_!19MXrC(W($c{%=DVv5^5Svb4i(%% z-Ldy~`QZy9-JEE->UrEW&!99kysSA{tbDexULpD_l>0pnWU4Am!5X;BV^SiL@JCJZ z6gr^!noatoW%iL=$Wu2S#~OW~&ngdj^6GZq)XUYK5W98X8!kFF^`?E)pS0aQ-Lskb@zKruo!&H6>0`wgT3F}9=NivcC$w^XKir?n={;Hfi!1KSYqIFZ zI42jrji*{x7_VOR_fZMF%`@%*#=H*eY8xJKjup#9&duu;&hMTkOnnpq`h|i)Qw$(XFC}998G=8b(wb_P{S@{VG$0;u0j!V%vaXZSES{i;|=4||_48eInlF6_u@{Fj| z11B&I^+zkS-HPTs-(G--EJ^t^jxMwAz@uZ*gkMOW9lICQhp2A9?Uc&zvy{%^jc8+7 zpWay7scAZ5GS5A?=zqPkNu~nkoCL->8665)3&sZN%TlWkNi9m_16Ei*{gZJ_erTnP zmJr{@cFEM}ZL9p>h1aX7n(@~y$%)!WW;-Bn>K!X5o}S8=K{`VBic$L)1e$dHKphIW z)~g}*y$BLT4%E>*=kteY>ej=MYV7+r3I5JDJSmy1H2tad-_tbB;JSYSF@F=T)Z7@< zXnFnAGI9vFhitmjVWxI8NC&h)l22y+@f#5;ze^dKIkP{$MQRcJnt#cXa*O%9tyQWa<7KaI{@3k(YyXZXTWl_) z=FunMnJSR>*EG_>OTt5GY(9`-CQ~e%CPSCbPDu>Dx&xPhAYt}T^|MiSmkaM`r9wx zWJfSS+0hJi|Hbb9*uV)dfl-CUM!uGewu6p}HlJAjLRLPGC3I6?H z5dEpFeV-@udg7+64v*xj4(m_e{2Lp>WVGYuj2Q&bd@_jiFORSX#9D&4HH6fkupOCJ zba{)x%twpN4*{}L;*;v{7(H^2c>4}B8Q?%i4Lbi*5`N>#8I4oVXb>j}DP|-|kS`ya z#4v7|d7r@0hnKP~{PHBno#qi0_2W1wFk`RVk$=|yyf}IM*M-sU;$i)dSgr?aZnF)PPmk-ADYmdj&(on8wHh|PThMUNl0=|ylPeeHG2xJROpjDp=C@l zf(bC&w)@%9UeJ&qSixpmy#*T`omAELHroS`gwE0L$^;Rb?fslDNzM_);P++)&SOk z8vLnxKNI(r4C5Z_JB9$sMH#eLjYlr4*1h<>rt~+3-3clPH zJCocTSf-}QZ4|#-LlGmT6LtkZX+S4BS5!>F?v(DZ`#2guEpK-G!Q+`uLAS%r`K!!k z64RN_;r8qs=oZXJf3ItC;m*`Xx#ui7O-v46b+ka#lAsP3+Bpmyzr7mDNd^dF*~N4#?%p0`JCf*4g#h`#1Y z$RvmxIr!}*?&_B`S=TuFd#oxdFiM7JN|z{4 z+)-FPJ=AA>y{nORhE0GZrfINK5Hk3k->TlSc7i{lozl?1ycdk6Dv`vYE*8NeZ7hwvHQ>X|BGm@Yln6Ts* zAk8(u-Z(>6;3oIid}FkCNV5bJOR3BJq_db{LFfx(c%IGUWt${^LI8LJUB(WMFrtvS znVx>gW0Tv9deesk&m7~C`_?){OCx_fdW;?OjVgF+~ zEaj||{&#OV4gLnZ_YCynvUA&JlsP!`7k(qn7~QmF{X8OjwMHh3R_S>Y$xY(LH6w>X z*LgMyxY^gzgqThEvo19l4Bc}hhR7F`LQl#SJL$0F7=Tf8k|dkR!SfRVkISHc7xWJe zkN@|XCtgsK-Fg}FqRJC`u59&~P43Y4LfEc+hXZKp+T%su|L`L9>VD24D<>pbwgX{v?go}cU6cF$R>0TF!1rO(uy_ld_t9z^Yb_Ro$L3b3EXPgao6sR)10 zzE)-qowa&HdrbVyv`Je?&R=x+fNuQC z#Gq98t9peXm_Y0ZUlLBX7|KhtDOaA;kZ-gh+G9`DuJ0zyY$@-y$YdFT{`m@k0Ngx! z#vb^Xl66WDnAUumCa(T;qg*#L#JpP6>dCksyFbb^4=7Z7{b{hDqI&}Ag)D}w%kRIj z>59tu$mRsuO6j_d+c{&dsn8T_)e2xO7WG}E-w6I9dnbhDU}g*o!*2@+YuneO(KaxkAiV#E(^P>qw^@NovyV zv_Y#0P4hU3w$k-msZR~0nTewyVU^ttEfFLlKt2N|wjY#5r?oHcY#)> z51qD8qhiW|!EZ~=^X12CZR=25*L`*3OuEaQ*3)oqvmlwrEmiVtT*x3t1hTp#tk75g zM*gOem74(jS^8haAFk|bhq&8X7A8k58ixpH3O&B8Drm?XFgaUm$qfp$hXv50nMCD* z*Ny^(DX_;_FzT(LDg~{}r|*n*YFC@Z4-5Wh>NlpY4X6O)^6O(v*-(`~_6}c7&x^({ zh?Qs5-6KAcoHgCwubryN`Izf7K8UNtkfLw%)uR*De!E)ajrUXLB_&$e4K?S?u_YV_ zT4zYUNgcKjd{s3}x}p&#eF0A%3EHep^WDAZ-TvjAReRo+>FF42W;RCyY!PVv^Ui~` zfjLU5ZMML2EuV0_^O6c1_;5eiiK+c;W^`?|PrIZ;>{koaN0hzVBU{l8*7z$rYG?&W zXY7(*3B~TR5mmueWE1RK*!>6yhyinXHgUtJ-m%ZHkBdjcEYxBpTYEQ2x4q4dSitq@ zR(iG9o6qK=D8GhzoRcihBa9v150bN(7HIFT-vZA(Bw=kmYi|=~YzU!|pinyQ;%1cc zAx;ic{bVET#x~!J%EFS9{Fm~aeuna98}>4T$boYG5J@oM_$wijYs9Px)8sv*OVS+w zyPL39!fKRcJtDY(&oKVaap+E z3T@?yQ*1y=7?_p*a@HSeW^@Q&Iv-7TI0+uWevOJG}Pi z*x&6Dp3*sIiSWYNZs`?yDU7^`ftA4}Xyr(7m~C@9_ZcP?IVJgdlF#g%hP-Wm%&q4U zV!i%hqT{-zQyq$<@)%Motmul_gcq#x0fKH#@EUmckZ~(fe8Ddz>sd_i)28_&dGpZ^ z_*Aj)cXK_@x3H_^F zyXVcE&;0t_=#@F^t43i)JZ|@1d?K)pq}Vxw;I8nITjA_(62?LfrZ0xz4DX&gY!Cxd@W$8%(sG~7jY&jni&?(liKLVJV$ z)BPcb;m=n1@7$H&AM0jz@BmYF-U!?TK>-*qQ8az&>e1hjht8b z{z+Qe^DE4Ixbu1zr~!yJS(46nFwGBseplB)-#eZ5vg<4C zuqo-)kMkL6g7kR)-7oglqZdjtwSwh|64H94Qckh3QHDC;M380+5-b1kf!X?Lyzn0J zPZQP8)pxt;?H;wlupbKxwjm-xqNeby=4E-)Cto8oJY=9XR&JB2_YlC+c-N)kcOb@4 zZsx*Hs)=ukCHV~afHmE>QK+_^yvK0(B^P@V;gJE~z_6CnJdr6d$*wft%2K!@o@kr zik;&o`&Pn{&bChTl z))Ms+)LWX{Z0=2q&P^5ib+_f?(5-YX2wK+wNwD*^e%@?R}~7TQMYk>TEd&lhFdh1)3IdM+5>P zl=Mw8p_wH^&0)a=oLt{Fjy!ca20p|)yK>le;gUj3CDelqrv|H9YPE2sCOynVKleCI z@wuXgQtuInClpW-ZSEps+=MHoSGFV*^n?9j-?%irj)`+CoqRC=J~9>eD06_F2$qVz zQu0~S0y<7JB0^gPO@1?y99D#viUJ6qq-9=DDir*)ph6lliR+>aK@Kd^;rQ2F&yqb~ zJA&$^yi~LJ6kJ<$n70wVyrTrqW*kI@Xu!K1XU9-EmUYV_KGGuVU=WV(bFXhW zWYt%vt7}1qXTZo5C#b>RIqbXFPlk0>QdnhSy$Qt!SI@-WbcC)<7mJJ!znHUC+$lJk zDH+w5+=c12UL8DwSiN`xpxOSsEOyrAWF^nl+3oYQ5vj>j0=lBCv1rVvP~y$V0;tcK z0<&T7#;0X4^2_oCRsrr|mL2;Np#RfATJAd5i6>ryb|Um^0|>Mf6c?po46NLoTt+{9 zqM7~GR{D(yRT^XS^MFV}GbtyQ{FI49rG}X{_{Sw;q4s}dT}x7JJpsNA2V!i9`F=U=|F$13B1qs zS4f&lR|1NoFCI`J@#<&Z4{lx-tXBehlDzE+sQtD-p|W)Eb4+mj6{TIZLjT?WO#80z zwnppYJsE+7aO(ohI8ib)dokkvXPH;cYQAB^5t)FryMOmY} z^|aOaQ=su1nN5c-`#;eVaX0Jk%zd!x;rAJwQ<_Uuq$$I8-c%ZRtuZ=EW8ZWqwj4?1 zp(rc3ZMs8s3?^x>*kx0gui$xnE7?=ADq^arA9+G@r%C(~{iWj0-yj-J#ZyiwzVc^v zqAUz;m{Fev6Kfr2-1oL;jYYCdOw)=oc&?k!Ec}RqVR#)eus;Lp-aFGQJVCqViUON zZE)(}`2PK_x;62lDZfm0Z_|Q&>)A&uvOJM6oA#VoMVMEf;Di;KYEp6LQ8$?xp)v-k zfUQqIm^@8|tw{+e76}wFE+&kjD6XB*Nvrqg$YP2S;g%s5Ob>|nDZ=Wfk1}(xkVBzA z9QbC~I4sy@HaTtg8kr>a8HGdeC5%BA?-KazBxm1|8-k8oR2K4_L$q57oe^{op~e7pSo1DyEmMJsqs$dd<*36lhmP0799b5|rg zh8edRy8BaiNf0604X#(!jWnMB%10{Gsh6{FJNl3**O_yjq+jZA@sk zK?~A*>FurHZqZnk?w0~G#g5<);L&vu;bSPR!7l9NMfws6Mk*7Z-+hvINtF)-iBD*( z{CDI|^v^0N@x;s}G6w@~O%i7=B9UhQbmZlN1c8|+y}4+c1xwb4WjkyD7r@S{eaLx4 zk`9&!>cdSDvzOqecG#NbyR#3x3)9@~v^|CKaj!yBachm7O&qa4q)=HN4ywoCOIViz zeLU&y{XmHzbqt_FA7!vikJYxwkM{lWOzyCU6}2JX5CUpp2Sj`Bs%R!H$>VlX|j}K-TG` zGXz=CsR?#!Lz#sj&q&1Wcwdz;{od`jvk4q7A8XV(w97wSF^VN?GFavkqoYCcI{iF& zYSo!^d~sIfce*y>*dJ2yUXr*(dApOn5Rg#l4&O1nAY;>6^Xi8ppbgZY<+lT=W~!Vi zQt@#y>QPYabt|)Hk+DKp?T$&g5(Zu-NS4ZpG>*rt`9ZgISv+G&>%#a9Y@;zUh-^oF z>e`F2rXo|mJmutiCto06jFC5?E{M>3w63Q;KjV9DQZhxdfti7Ge0bRvU-d$kt79wO zp42@3L0aY*Df)4fJr(JqbH`zqE(1$TT*LUN1{|fDr`f+JR(2 zB^D)TNc3Or=pi-&UGFhGFYkgOb@&^yGyFei!4}BgyFAPPW-JNlSuwg5&gqKc3E*vM z9hWlLtBF`h_QZO+6dZF1E|JaWS$%t*FVddeVT$&A$Lnz1Yf=ZrhKb;PE34$vGn%N@3bn4fPmk;P0^@7<5#tlz@z+ac>JI8YAM6g^NY^pBd@$0?_$+OV9J=eIX$3Wit{|0vxeN-!QRtOb)lH4q| z-$}0_tnfX4>$A3>hl>!}#1M^OHJkMmte;z)6eK=bvNe#jOBA$3K$ChWZ*9c-}RLgD~=6_k^0e-a%HdZ>8c9tL2of)!fW9 zZ*VTXx%5{`63}wDG_>sd{`2l^L0Ww~2}kPY0z=^xD%_@DfEI{cXqx(U{cV`-MB?P$ zP%0sb3>E9Z3bll%;~u~Qv9@JU*8e^=>~5#Vv^sstK$N_tx!Z>5^t}C$tHb1>jr1c( z9%vuiP0io(P-uFV5-)Jq8-a#aW)T#k1-7%+;z*}z>tY2NW-0^bH#uhI4N@%cpd;>D zQ+v}(%W|z=wBNapxtw@l+Ap^%K9|8TKaLnx`)L~&1$TMzk_w;ZCMwaV`kcS+1ix{@ zM&`G>W-u-j#c)CFH5Vsve!mQFC-T~~PU!4;zXFPH@1IUE6mj8M8|LxZk~g4WjiG$d zWBv*~8n3yUkbImP@RS@kp;j*mu4IO;$*bdai%)-_zAHd{82N>!!fc0hee0GKQx#)Hc+K z}HV^d#qp6%#twFJ)qP9{LkdYS~r5Q(Cjset*cq z1$T*Ax3l*)PaGczqvGXye*KVuRp&NdZbO^wGXy2@UzEC&v2Z`$!)fum^60Cs91v!R zdizdbtNm(Ng1L|d_%(tmU47q_n~{j7Tw(rI4OMC65JT)NQu5{xP32izKRV9PR2RZtE z6=-vDU-o_cjvV&8-Tl0!3RK+iB0gY^fCSd4{Lh(EpBY2=;YnDe(Ts3wMhEXIqkSxO ze_fCK1)6Y=kv@y=`Qg96RBVVB$$W9|<4mX!SxAZ_jGQ=N*N-Z^EPB!qt?u18S3-( zN0e_8fR(Ud<}%N?_8kGPP&TxG=kri{4H|b|S|6ZDDzqPsuNYsAqmI$Jq0Y%jqLTi} zsS!r5XTEpdU4}5O!$Gr8_Vf|^tC>^RFwKBY`0W`e@s`peTgHa1YBH9$y-2=~Ub7jB zv!jA}$it+vrq32@nuyzc=N?FkJf2qeR##2=qgznN%HK95{ZbhER~0$^r!E=$#|L8U z-ILCEp(^jmm&37xj7YFx!V@$vI(8JtaM8O7mGZ4hM?}0A%6XA+V<=WNvmR`)|C+lZeTO)^~0|FiAN9hNU2dx{{hrf}zH5wt@=4EQbNo&^Cek0bu(3gw4!|8OqG zJVSx3jD;Vrmvm4V`IlCCo}Z#t1)6?~k{3djTvwCH-L*q8(J}rH;~gexbM*1xo(a#+Wf*X%2j`Y=xsA(j{df*Ck`XUrr5LvRR-p*C1qV4jq-Dh+ezPZHiF!n+-c2p} z#moIYb&E&;jy0c<{V5fGD*NNDpZ?h&ey5K>$Id4)CQdt;oi1`>oQR_R4%<^+6`i$HA83$r%>dD|wR_w`fzIb?mpKDE$QG>v@nd z#U@IZN8jpE6G`1-#|ib(g}+}ZUmN4V3sHFd3AbXq_g}&N9`I>*op;EP7PZD|AIUgk zkpinxD$q^E^D|q8wHp5P9@buWpHvrl71+E5k$DSSn^D@Iu7ZVEvaYyarl>Z#AsZ6S zxA?H4BM^cR9>s^myxyUOT3@|5zt30Vmix3T=oDL|G_;btf!A-*sz8+8%nmDY;BJZ* zw=9B$_nlZW{tK;J9?PQ2Ji20yP)oT7c3AnLziAz@w7meW3wV{Sq1_|#Ts-m-ZEaGb zY9}`x0z~T@x(r`dC}9MrYT3#6?e45!q4-R^yFb_8mkBM{nkpCS3Qotp?|X_AIFwb^ zdRbu-0^ZA#7_m0}ibeftyRWr+&5IQtpVm9Ctv%$0;W0~1pj>c+j@bPNBdGiti{~ea zzzAcPT2rp9>LSNeb=kzg3h85%hsqOoBKb|N30i%Djnb#V(xpi6>*110Zz>v`R5!;! zuDAT&-+8kESg$?d=lcB|M#Uf-xIIV_A3(y_*9nH~f9t^++Y{8*^(7O{imdsAp&gF5 zFQ3x%b#o2v2_ik@Pq3!;=ngGO^-T*zqlf+o(eX$ovF(sb>g9p+52dE+Tuu z!tuKM5bZzEIG))LT=8lzCbG00%N1FQfb=7HDNj)4MZIL-=ovqy%kCKkJ6Eg;U-AD( z(Ruh&{rz$L;^N+{d#{=8UZb+EP05~FDJ%1uWnW~JeO>#a@y$-5NW{&^4EI`vj54$C zB~;d>;uhui`TYm?@ww-7KIgpNuh;XH@bINkO!TWBfkgm(K6(@rjx_w z2_WC~k?N%hm2Np>nT1g>pe0IJqF+PLG#FxQugn}g&s6t4TeL{9UxJuuf!iPs1sSWi z!S%qqSNAIBH^mZNB1!t1(Xg&x`a^4D;o@d;# z0n)3lo(F&HOvXdThJ11kRCUZarPWCx@UgA%=0Jyei zFbl)87Wn*(=cN>9g7};u{#N|w67Xh;@6z*O0Z!t}m#2-km9D~^D^aAM;(>g(B%y5C(1857x>_)kCTp9=R)VgV^{FeVKHN!`5rrU zib5yeS6o*ISF>-XE&|700dR_kV5TSgxwpwdpwR*&`%&>iyY;K@!ox=u?@Ft^aY89jrSwEd2E#qsT#hf|`OYx#AH zsyCUgh3tGk18%6k6@S4ZX@!eXMo3BF3;IT6q@O8%vN!lb-CZ%B1uw9vn@f_`jtHW( zApFW5-t<#_CBjm-VyWrOh5ozMIZE#QjNy*&a4pOd3YdZ-BhxBBj&+p*3fkM$_t17 zb_C&S1`>ZJTFNQUNDS7sG+Gat-9jI(`Tz^@_%13z>93o_XngbkWl$gB+#WDc{}${A z@9j!sgPK_XR5nPE?|N*fnzeBmx36aROyIu3)lwNyq!>H?j(WVw^y{(WD{Z?sFB~q{ z3!eHGRA-s35nlL0sWy#x0wfscjG>l5K2 zuxyNkHe|z+tOaskfB=>Tbk5~(_QQb%|8*MS#}Qpcr^>h%{@gbzU%bEzp%;2ff8`oE zaXB%1Zp%M+I#P{-98M}9-bDjV>IkoS2)89X?eIb)xXB>d2xy5%o+;x@LWrknkt}IvD%f+$Mymzqma`O{q*PeRdC5j{A6Zi)XYannryx~ByVdP~fBJTZw zE1ck=z2>Y?fQ)KQ`XDUc_33RBVf~F3QHg8A@7ogKfUaU>CH;AbK3&XRPdqPxk*oSP zf92H~4czowC~^2l4;)#}Ck{vuNl z-Q#ln@IELZ^9mLYxk`a~mYuWz_Cw6(p)23Rl@5XncU|sQQ^W(Votr@JxO@mAi_i zGULfc$`4L=gY9F9!ARJszhJKvX~|R-H}5737n`WTz&&9nLiLyvM~K<26n(T&8#B`h zLY&?ICPi$s|I~g$!}di8?UFf`pDF^KDe+Gw^lVnx8|=CKn%$!a>wKKty~wn9sSHl_M0Nm~)pSH01~n6_au_k3gNhCb=!&9RmlC^& zMGi_j$6^HolTP`k`7fThBIMFii4?U_W7i9AsvU0qJR^@?uComGV`fz5_IT91_J>xopW^q~k|z zT2(@|;)XS%tJuFd$`oI)u50CX$Tnvhzs~I8d~!cFUNEd@)3+rWN!CXnwJ87}lxz=w zpzS2G(3u^|(hKuU_%15(rQpXSPL*si7nUV0lRypFsCR`e@0}7z#mK2y3Wk!+e|9$s z>|Kv6EP0f94{{x7sSxLTWw+u02ODNYUYke;p|Dkc$v3&RwW#q>_v4ILVDA(?dSR*` z(&tH>(&o^DP0m7RekUFyvahk+?7Ba&{%GlD_x4ujnw$1)I6ty98x8{y;1=y_BnGrw zzqpeFj#WO1^aLWh*!Z5kG8km}%UFQu7gB#a&l;_`fu}Wsd!+@|K*V69Kah~}R2I1a zU_^HQt3(F+d7&k-YJbG5hBj=NVf=rZfObtF9L0)LKV%fHj1uZ0#Q`<5_2H zIx2U35_8sVDUag0&#c7Ao(^8ldh(kfI;ySP7W#H`&j8pS4()Zwz=vEDFdeS#efai9 z*hCQUHuPBtQ0`&4OXuF)u5y<8R^K}iWl5YtO7`w;2&R-xz~P(BuE!z z9o$TS%&T0&=}()2^`6t{D7LgM_dyz2r^ytd?a2)aHPfY{{BT>&*5D_e0p6&wD@1p$ zb1Ae~S;#*Y=)c0xqE5#R*8t;yeBR>WjCh<<~*cbm*8w0yoBC z!dQ+5>*v<3virh9vV8(Z4fG42=cjIIF%T~7mw?mREAQS4UB{m*7Hqk$?lLiu*yGQKAtLGK=N zn80gcoIgn)pcZ%9{~PSRT}iU@61i*SoI-gn+y~x{lNhQ((x2~^Aqfu{tc6Y*3u>5P zRiBkZlk9!0Fbm;z2$Hka_5QGqIJN|Rv{YfTRVT;-KY2UmU*or{I3tUW0q|8e#6 z7aw&7BUEl_R99TnsM00vOtg@ip0@q!R|J_UUYUW$AiTURqi%?I)kkr&Ns#P3Pp~H* zlxjK$_vG1STTk&UebbwYkFkth3;SkxE=X0TX3M}_fdzCUOyiU?X^b_cSNW~Z7(1mu zwGm7Oynr?U8tj4B3nj{EwOmW-8{ovwKl#A^OladvdH((zCAO0Xn&D=V zan1fBpXz$F3-xJu+6O#+##rDCVGRwSK$KkZw-lh9fFmm#W8{mv_vELBwh@f5b8npV zvK-yC<=m>a)mwMrKF^#rMC{%536bXD@g}U-cL!o{iz0IGZ^{m=$(B{?qJRBof2h z+Qe7tcF3Qa2knMnmZx7tkJfX{l%?auk4%X!I04Vh-_@>kf0P=5MYjPw_ zq->nA`p~%~jCJp~a5Z`7VmJ$_j=+r<{uW$rQu+acdAV;p=fVS=hDP9A5rL*ZEPq+y zk02Y`$0uW8?;b~phf9VzP5$3xEZj1!hD>;f35sNgj9i6nHE_R)={kICQ* zLT?`h$8$9?(mz$VEkuxAgye+wS%Unwr)ylfsXMUUZFr9??g-XhRn+DNkmOj&3<{i+ z2{Hf2k+{Em1Zhwc;C^>m^V{5ETy-m{b~_7W%bu31>n&-dM_SBd1{?u!ePB;6AX{)>A4J_TdM=_EzQn7#9S6u+H+XwvwC9$aJ?35y%T1^ zd&oHXw9q3jK;u8W0yJ^kX0dgM;I8B4N&nx0sUqw|tNt^eX?yp#7OQXDG`ffO?Wl{J1)p#O7bo#})^&CPi0CzAYH7ek$ zTl)&tB1*E`<8iv9OT$W=9}!euQt28`j}Yz%&eFHCZdb59{wfOyxa0L-PYmP+Gt7u> zeOLEF7TQ!Zw>abOffkG~Z{jZCwhxFZcn>|>?pD;vD}7=cZ`5$P2HR&b412CW3TF?1 zPFUYoILEMgy*;ZvqC=vuW&WuRTl*PgEU=b&phVLCk$98Cp(uLGb-)cyT z1BdZ_j!M3jPlndVc~@Q-US)@FL@x3?z+6yZ5-Kv1)|;&>WmYJJ9jVw@5On|jrmy8i z1T`m7-kUxhxCRKOO!QA`AG#jfI-|PSXvgik5bwG7uCPU^!piaeP8(WtmHN!A!W4CZ zhiU?_F(smshB(?~o(O{%OePYCSr<%c(|`;JlJ2g1{QT$o;!8&z^+=UW_rU zslX4(9#eHjHxL#UmmD;P>@vhEQhdP~3PXTRy##e_i-;63tRWlTMJaNy_?!%hFAJ#Qb|i3^ z38;=mWKHLd39!E6*$sjgM*;ql7fTx?pED)d1kJ*gbOblyXN=P#{g}NPYz01h4Mc)B z4t`^AurSh;EPSl6HVfA6F6Qb>j~38^$1(H)E2FKl{OLltC!UQeP3i;}omFAdhSl&}kd%GKO!s`KHFG;?j@F25o^r zYITGo!6-Nd?GnU8iIH8KVVcZBm z$F}yBD5sm%%|k5=aweQhx`}(}xifKw!a)|n=+1ZBwl8IcMchGZ(&N>JM!`dJB3}|G zL_;b@eicOQ2B7l-Zt7P^#C^70EQ9a^I$Gpc5|&j{waq9-y3J(p=0zj98ytne#IT7R zgKOJB1@gF6zck4Y!2y**zNiTdt}_)qtj;f}Wn2m{VZ^jSK&4rle1iu{Tk!?eZbAPU zN7-$a7Yi0?dAHPouWwq{-2zIXh4`r<-aoHlXb(-R1o1Ql?s0AfBoLIEuZtbx27a^AJ9;kP3JleB8h{8ETY||GR+_z(6GbuKg8JVS_dOAO@kkm8zm4riE@;^9w|@^CdkFk@*?eB6t7J0XOGJ%>~c zaHUsbyj#e{?CKs<}*E2LcNVI(~So+0JaJVi|D@4K( z^`hq_^B#Ch#8>RTl{L3#Ia?NU>qHJ@$xLwt+HtS)sx@fMvC8lra38|mc}4btguzGu zu%LllF2D!xGkTVMF6kRmLCUE)T=A@evBn<}#Au)FDP>fY#LB*s4=fS}tPZT)P|OTj z@W63HVoI}Ny@N#~iFJ6Rtq2n2Ev*F^+}v6H5$bHi9q{={h9!2_CbUNTte<{X9l*90 zYmPk^4djpxqrMUjyr2GYn4uH!cYV_JVpu7GaABkzuJy#-A_alf-Sa@oo$6&xJ`J5ss8Qyn z`nM+jZLodtm8ErN#m>`0Nu7`gsp%aJ)vem+WNC(c#S~sHcyf9tz5xv#TN!zIQw+(T z)S069uUMM#9<8#pFny0X%~Kpa(E=Il+zNI~q^*q{u%1Fy9uK|wrKykpm;dWII8>lp z3Xlmjjq0Eg#%;RX<$HC)!_MGJjYt8Qkmo{15oK&!@Fr}^%s2`u(A2~$$PQ;Am%p{l z*d>G}I;aFOy=ES&;J@)GT)v{oMdimeYyItu&It_Q>kqGclR{x~a8V=dGl)qCqX5{0 zTSUB0i2!o|MQG8zIQV)Ub**s?IW#D)VFn@=h<4V|@R(Z4g*E4{3Kzbw!z_MQ}}WMOzdI+f;+(`8NTsYQLHx#$bX@VHRSdC5&ITYuz%$M&<= z!CkWG5yVDtF@tyT>U_Tz)cP7J@DpY`8-S*{67+KNIeuQ$i^!?(xnmHSiXz{g2 zfUn=X zbIfV};__&r8K?v!&c3a%!22QU0jAr#gEll}TiR^G&y)o4RvOM!@FpJd_T zQL>W_id1#SkVc8bmOz?TZEAIQnbw$})orF0?Kb?7Bv+>eIAJRXPIpW!udq_aW@G5L3BQb;$c1 z^A-&jO(S{-Rg_hj>A+g&sCxR92(qMYhjGr$gF750!4 z=F1P}fBD$YQVi5%nN5N-2QB@q*yOtJ_H0Z^1UQQQcOQd_k?Pe~gho9tvtBD;tq_nd z1Yb`SnQH*Z|K(&^zkedf=ZVPzl@rHCIu~DY3+?`dU1B6q`4NN~ZVHSVh>T04K&jb~ ze~X*Xy60ZI=m|7Q12K?Yo}~oB`%Qn_DDK6ShiEuImHx*JqLR?F=G*Nm+|9pb{plHDQjd9G|DoDSMSGP_R=5g?`aGG z6`oYmMzIGyk%-~K)SJ$kW?*=(1!Ys(tq(?~A#Ni@1{Jj++$Sw!9h-&0_mF%q<+_ne zORY3b5t%0GxkufyLwl1ZMQr|!yl%zCEJI+mp z7t1Pm+}E_h8q%G?+{?#*dF`}scGpStEwQeBdOx5Lo65>J=w-4k_{9X>93$0zqggWr z^nu^_^UP|M)=poz{-@1AQ9%-j8wJ@re8CP6gp68je%L#uHYOjazm|!a08{f?9Mm zYeW1_pnY|Q-yHbm3k@4*4-$bf%H(vu4=m))ZTTP*D_Xr#^MbqXN=Fu>fHaPA5vCvn z4-DvbFM$I5iuaiG_8$-rFzpV<;F|>HJ2}mnv;mV<1dfgRP_T5w-~3<)b^?9k91DfY zd;EeZg1gv94AMTaaswWKkI2HP7^{#+JK|{D##+_Z=RC9v6Re%dCWR+wmtc$c+_FOd z6$nH?KHz;FDV%>IGYA>V*IIiGx)lFa%r;H{^#%W!2)J1=lTR^l726Hkh5;Mlk4ySA zV|F1*rBsI3!D4{mVJHVygP-+~Jvx3Gw=eVzK{@5MhokSXQUxo_TzbtJrJ&IB2gQ{Un>n5~yYHLh9+V)O@T57^&U^;MUrY??Sz_u6*CaS z+$QO}DDJa-h@4@F<*s%GZ_G2rI1^}c%810BlZ3eQB<-s4)y_}W_-o8QA*MJhtfnFK zI>Pc6FR|plC@iQD+Q6_pjd@%{D2qRwXQ<^Ve1{}BbIWnvuhdge_jMN{%@h8koS}$` zvR7t3J4hc&7h8bHrCi668enOE9~+nvgU}*0EPQ%LL)LWQ5ldwn=rs5JEy2+C)F|j-(R#ZZH=*FN`3%D44`fTM2I)vYp9Ez4 z`hS7qqM`0emH_`qoh;fQKdD5&j4E9imFm_Vbp>C&z~+gQ2jF1fz#Yee@b9}l<=giS zG)eK2eu3{pS$h90jA3}emG&o}4PiGPx+(3se3w*r5T^*| z-DGUisJcN3xM^FQp&GATOCQ> zzYa=P57|8ExGNq$Jsvl&!Y9GBe9DdV2ASS!h)y^xZtEwrXa3nSfy_V{dxAm>yj7BP z69A(m{JV3qx(f&)`GQsHXwn_)M`zr_kCpj~v;aV45Z+h(z$=$$!N6zr_j`qZRC%J8 z;|F~r`)g=^Ix!E!b%hvu>&p}3X(7m6CjgMxmU+AxPQEb%J20pefVi+|YWL@|Fo{}w zpG{C~Dquqoiu%*eCq+YbQfO+BZbm&B^DF*qJ$kvwiqk@bPcaaX~9a zffJVA`9maD_BM(t@7D_TbnEx^sNw^xp??jWI1Rwp)8PHeDyKU=e>M6~7Sik}y4h9U zTnq{7CUdX|^)$Udt3Hk?O5^8~%1OH2t>xEER-M5=T8E*$yWmP0t?qG>4xPJOXY*{X zY`g#23b*0uyZxM`IYZW?f*EW0uUWy;HiZ7CLN$dzAcc$CzQcXPnU$09K|-Q~?H|B` z^1IM~oorvG(hSeRAQoO2bB{b(7vLs@Qp;1!lK5RHM_uWcgOGyv((g4Md3u*%hP(f$ zT{1*}Fi$$lL2q16ru~BG@oA2qf+3uEsD!&n(^t(Critfyh0qPAZT5yBCh3?P zddI%tXmvGt6v6^qR6C5}_eCsD=HMh_a85S=&}8umA@FH;9G=?p=O6Sl^unxm!FXaB zL@}|xA<60A_V~or)e})LvS30l@5&rKy#IX0GzTLKZl zu8ZGskkoVqvQnj3L8^Q&=%NUbLy4am38AnwG+qL;dCy$;hxhwR)kkQLDJ!h~&%g1XGngI2(xQKJgG20IT*DdD8c(!f*7Ze(;yrd4 zCpN?)!(h!)^0i8n=1*%+1JW^;5u6l5Tpqlefix5tAVF?r0lZA=KzE4aO+SQ~DS~|K z9?Mpxpn>Mt(Bj|UY9z&n$%U@{{(^i4SzXN;r7y_0VI>R!)*h)+R)I$Z6^Rzoza?pwJA*1KGn`^nZ% z{BvzVq}qn;UP=>4j5{ua775h>>`nATpbjSpz6);1u*7+ayPNadg4a@;vkO`4pz58E zDIm?~ZT{$SIY&Iauox(2sL+R%=S(8il_%?MhBKGxNFH{L9?3$a9RGclA!R1D7=0st zi2x4lPjZ1d_8xH1WCX596`kb|RkZ)A0wsYXhU|4ktQUq%}68!5P?kjf!%HY(h*mb{x(<^uvk(==SyD~JkcyaOs#%}92 zQVQ^-$KNgK3g`P83IZHCIWZ6r>cvhSqQ_5KAVqc~hspOsNN#C>Ga z6im7V(f|ZD)jq~q5P(zuI@h2|566Xt#C$MelE7u66E0Rrz2Wn?ZRT2Aa9fZABGtn) ziSXP~dfXZ3YDNAQ-UzfhR4%q2hA5`7Q4+NB%zU;}cNpjM>nnb|BY% zM}dj{eaOSHQ_1Gt$Fegkc#0wZA!R`s&I(>z|0Z|w^vi({H{dDFy+&a*q7eX`0q8`o zyA90I%x;K_&Hn{<;;M#I#qXd4oTM7b>hl~KlNjir_8BnjtPo&AgHex4W)$T;{vhD_ z;K0&Hj&y`OzZ8l3n9bu}EnG-1?aFc43P>{uFR5Aa_xxZfH|cAfL~k{8*^piZ-cvLK zQ5XILj(q2cs)hTaBwv&`z-n!tVn}4Zb5N=Wt z$nd2>#KcPx!mX-CFU-|m5qQyteqV65CQt9*Qm?4P)k<}arm<^8Wp+;Trrw5^S6N2d zFok&+Jcc7YqK}+rYLrk9n9Vf6rm+() zoC+=v_J(DpIJ4Ia4{R$uo=kDiNZwkwhF_pLLG6{HEo7G|7M(3w1KdPBl`EVDEfwYB ziXIG()sGrDK&HRKY7yt`(XHnM4F^?nwrf5E-hkus)(ZjTXEhLqk)e2xke>ncF;K+i zS8b1#1xxGR0ET+e0w#8xN5Q29zrY)Js59$nU@`Hy5oz3rf28+~*>JfC{opO6IFbG! zXr-VjMZkhwL;5uBiUP>`L3B)zUpmFX1w3MjZFRo2$f@Xw6oVYUqsR7s` zee|1ihr$1s1}g5-N`%2NjMU)J@0yG5Er78XMp{_g&ZiImTyMS%l*v9P&BaV-VRj1e zPFhC#k`&>uFN0s28;{vuNqzca`&w5VoN7eSmHgH>76;czLTP7Gdwd8=?EBecwDg=UDHH zmXH0T4&kFdaDx*};*-1$00tH_diGP=_U@P4JdOkQh&XxH@}u4x9D@~tx-q3C9a^Lq zDRnkP>w*3CnjW*?%BkFA7VYcruPamlcW?`Qwo74-9$l4`GA$XyD9|Anla29%Y(Ws7 z_EyuCOyPqrJA?=JNTK0{#%H|K?86tuBISs@HY30}3Or>PG%PD)}A&i6C z&$mVko)&ZiM?>GRtaSxJ${1KkkPl2YU^dH(Sw;RiTHKjdeNH!${C!epY^QvrZ#?=p zr2>^Er(k|E^#<~WfI~qucbzvQHN;pAGmL2*pzaLJ3-k*9Zqp(Ysnk0%wy1Y`^$K`H z0rxlKIX~)fCM5+U!OliKwZgOh(EnkMyVMJ#&UQyJqoEt&f}#HX{&rUa{yr%lMu!P^ z5bz|C86{8V++_cxBI`n9&T|#q9***KYsw?zbo|ht&*uD)#VYU z8yN_!$FI2gt6%(BB0W)YhSnAVQshq{UTgSC5cMT{>k#`VzB*EBXkby}u~EcpBx5Y9 z_Fa(1l>upY)>;J%Iuvs~Q%R?Itt6>xXKgf5+qHii^?B2@71SdNe$t%}n1v7c^qyl; zNs3Kyqe6Xfv}8lckT3_;UDR*cWeKq;>VZB6>zW$%br)*ci zlm{6U5{HyY(dP>eK9!9$F}7CB@yn2{=Zh#*nVBV~4~XTOx4ai8xtnI(4erY0{{Ges z5x461N&RH>G@g}`9SjELn-8c4`>zUO+^PU4=CXpug7r4yunE@93?2LlFN?KqG>WO| zzj90R1<8riui-2;G%e?8I*h!bnUC677VfekzHxt|f;&x3d~q-1`Ab1h=L~1(+HMpo zOvHF2prX`2BsLitCGIoeoLQ=P0rieoCI zSbn;GHF?tL_fop!B^DO_SFdRK%c|hgfHQY(eve3e2Q4ue`&2X%r62jJAoyXX@|VPk zj8KKu2N-!1x}xYECg-fH{f#qImgpa|qM2cq%Zgoz&m*FDFfSaQZ6?3koBI!KisDfs{OG!r^o7u9572 z{=K}N#;bL2mAMEIRTNnKmVo`W{#I_r1HSi@t7WBVlh>J#Eb|~`aL#A@%Mj?sbJr8< zxbN?aGJ@dQyLgDnCx+h594z%14@&p~Pe|1k*iEdzl@w9fSxTwh!zQG)z777xuf=(D z#lJTO6{jod)LCg(Uq0sNQ%BM#itfG6fnb$rB`JU-cNJr7j?^ZNDVb>MD?syE^4`Au zTX<-RpT8Kxi=#-BnD+~fdpOx?Z1NBJR%cSKJ1A)kX8Al)HSJEeVvc%Mfctd_>TcFfmF4=wr(~>g`@#ulyS=%|J&P|egmav?$-L0f3(5M2Rr7nh5U;T zYlnFBo2T7@vnI_75~Nx}ucqqL%#*l+jD|Eo35>CVh*IS^5nVu}$kY87^Y&cChU)7Q z2X;P^Mwf_2XzcY1cAxj`Z-16)dyj_l4X6O!u$3g?jL5W`uM^a9Z|F7`THj)#kaNM3 z0(A#HDrBbtWZ_xso4B*-TztV^nysP_t%baV)IX$zf~$kg;8m(W97<2O{8)l%2+$rN zHfim>PQ{Ew8OIDpKfv6{$k6@q_g}Dz9Ql5S?BglB9A(67<2mB-&o&e`+UZ|Tf{hUD^?H)%m~Gm zfU8p>_?3bAOUl&;v*H3xY3w~a)p)G&BIQEqXX%dRrp%0{Caa&9dZMZT&W(*@xWDwo zS;yN*C$<0t^;rfx$?T_Z_U4l(u7)ejAqBoFrBfBF8JIJQ_diJb+yJvSrD+_di$uO1 zVBefow{tRH%sCTsJY+(AB*2?biP41s=685is@_-r@Y>)PG4H}WY!*lw459^LR_P5S z+H-KAlz|DZ{fV=LW&UZh=O#=;ZtL|>$rbdYg{dy@Dq5cz!C8^?wQB;7qC^-JN>3C$+;?Q5y5* z>cbpXe>%%ZXcqd~6(UT%*Bpx$28)eqz0{CQ!6-uaRu@1U2A`!1sTTP&3Py#occpM* z^QKOqyj#LI*3bB&;#9aLa6Qpwp25Gw^s&oR69ITg*}nbx!%0NlI%LijDuI&df-k>v zeELznf?mJ_A1(eQm#Ge~QvmLP(jP1A7x;(1H)pDbjS0N6+Nr!FD4mwFbcG#l^M5x}wCK1<6sL`0pp#B$c(R zcJU9ymXEA)GKdL4GgYez%ex1&Z8X5yQDH_{M-0X?YIRn<$m=<{{q_gU<`(eOUPGH$Ip4;AOVuw%Ll&Rso}x45`I)ftA-1J8F>8F1Xzz zeQ!bUO3c}NDaJdHYUP%(;czuF!)#E=(^QN+^WJ%4Q8$6g2C#rW+x(%>7w!b&9T#_b zeYc*B8emwjD9zy&dfEEQtAc8eQt zoS(`T=sb|^{zW73r*Lq)@k&}C*f4!keOVXq_e6ZW|LM@HEXa2$&sXAe_&L+Y?_wU; zzRTtc_1^A*c^Pr{n#?LOY#7gol9QEX{5|{XFECQL5po%7Hr>XYAAbNQUkUQQ4ECx9 zs>^gc>~YlgpP%9V;`Catwzm!}(WQC_IsDtgs_HFYG9rH`B@e5viawQ$W1gX`0> z3&WGdYqZw`mxb=XYVqA4asHt0H=Zl+%N6}@crHbKN`4BHA}lN9Y?&>q8TC5#=>g|2 z4rX;yHB8dlaJ3-Xg2SG$&2s!jrMhb9yS$39JEgcUdA8__Vz-a9J(TOsv@h` z2N9(WIv@Aq73ZM^9TCINNX>9_B5cfjhABVw&xpe_L%gktCo6T#>gF@aJ1q=ji!ZO9 z!EGUP0T_1mZW>qBjdgH*mhB5?pQ-fwhQYS+c0(8Z&hb=U`- z(liYUx#RRNo)r1c8)`Dl{Pj`3d$DWFts0ObVO^^QK#68byLof>-yIT-vpU^ggR!vT z3Vst5TFQLWV8!*_970Y8u-G44e#^TOKS0y{dmT;)Muy_7OgS$EIei#@A@FPddQDWq z)YAf(bW`dpsDn+2-7GdYQf!QUNci<+>7{GZ!VMMS#T>rXYnOR^rNiXYzqKIB^YsMi ze58%Lpsqx%>d9;0eD7eNP#6U?R21%GU?=saTA>-I7qz5gn9z^}*Fbo}_|w0al4%n4 zmpC-UofO#|sh^v)U;Mb^6;ye{_g6J|5AOPQ!xABPmW6D<&kdFOZ>lr6Ie58c+P7?0 zYG+dQ88G!3D*k*aP@a7DVotPkDznnfpi9@D7nccH_;~l#N>*Kc#W46|N1w=tvP73# z;S399a@8-?K~vDMu57@}Tm*jTk>;J22T|`)IqH6Hdvx{xi;Al@1cLQ0P(1z4lRtUe zqO<`3VH%a0SP^soombVY181FBg(SRhI*!O1%{gn=e%<5pT(V&$*MT-J)YIJQP4fK@ zU^g^m?1)Qwk*(#v`^4Z4SU`Yp_Elq(92W}vPF0+vz)`T->iHg$s6y*8xqS5q57B5Ma2luFC z{moydv=R3VjgT!n8p|XqTB1?-p?yNU(?e+_aJoi4? zHCP3BBDjCEoc*Rl>IBJm8OkuHD-(wO>I=uj+TM%)lfhTM01q6r z(P(r#_@VKeOsujth{Z|^_ahWyP1K5ws+$6~QOR0+6i05lTn(we0IoLoGyJ%>&>rF6 z?^F2pkAvN=eY<|B-_M+|U9rw|+$KARI!TuSYxN3Zo#Y4%#tl-{)|1X?T|qMnO2fN> z^W_SB$0bt)fAss+!f*=4eT;!BaxL#=2nY?`ZKbG#w$>w5Zx_3GWpqso&^L7{5& z%@rwp;-8FJtG`x~PJ$=)E4WXAx%_ftN$wpPuDApuVTm(zxsdcSbdQ@=R~ z)2MrS-}UGjA+vSm1Iz0+cZ8-p@8-4$Gw@cC(^zDygE#6d{ZRlWBEU{)QX2#xG1%3A zLXBGnFEDquDr{aM><}DFDs@Af(4NEFZ!EmfK zVDXgm9p`Q1jq3TWC*OR(A#!hDT}1&mBKb43XtsL)9%HzylKEyLYNc~%aQ#i}<%4#^ z;Wv#@=Z>o`m%|c&kG$k(^!~oZtXYi%{?D@mA(zw%Ogl7q)d-UW#6FTMV=x3$e+kY*P1itRjcM7pe zDt}&@ObUE(u&b%CDUN(!4;!nQ$mkUO3BLs1YRIV^YNDIY?*IvAyM-U9WvHgBHvF%p>T^#c4r+BusZE-t4?4QzMAsSO!sXaFugE4)xIzd3DUDKg{`p+W)|9x-WjHd_$= zx`nAF4D9(?l!opbip3Qqn{it_^-j+dq%eE-3NLw}bjbUT1Z3mqPx!SJj8nDS!iN{3 zYA!c!>P=dj1vCoI*El#{dBr$kmE|@tr#tM^Q)(3|!Ijfm+x3tmWNQ5V zoZ8NFLEn@QiVf=m{kx*Q0XaRoog2Qellj}^BQDA#P8)DUbuL31d~oxM3oUld3m+PO zR_6O}ZK5Bd5ZT*iT=roB8U4HBsD1d-|eU_#V5p80Bxo)WN<)=YKc-URUl_$YsS zIXQ9c6D(8+B!A!xO7zn17@S9*mtQo*gsHW{$@Z-DTQ^+>X#INj*Qtwno<%C8k%JC# z{$H%%i2hT_9>}{f2v<^zFe!FKgcAE7#&c+A$b^+#%`C8V1nr(OTfB;^AsGV*H_A}o z3rvMLdBh7B4YR)YKqo3U4jy!gly5L+PT9H2y(3)rnWwAYDoN4U<^^Gv9(y6B_LMR$8kdR1*x`<-1M)Ty`3C>Gfe z_Wo|@kAov*yiC#mF?_w4QunX6Uoqc3VdLhllyxb&K4#({vpCrUyYkGI{36()`J9Z7mHPfQ=j2>&>4k_lGnacOCAF^e^rL@Vo5nJi z$=r3yhc?8vSKdX?DV@1_hmOpH&Kv8>DIr3ec=-YIne(CcD7Li3G;tJ5e{xze+tTRM zDB4FUx;|W+A&zwAGc=_3+oY*jJmC^|x;TRl6OkX!N>+0eKcV^kZM9z%0H$Kuw33yR zGrO_r_kEeO_JUAEV*X8Df3Yvx>6urE*>xZjmeXuZl>Up?qkduaT+Ol1H#cI^7ccnf ziIXiakqV3LA&Zv85kiKqO@u{VQJ?34%YQXLvQjYe<}t7Io4!8#u~@5$G#SJAGbx=6L=OwwY{6WASud;K(?P;CNLj2U19Ty^{@chc8wq{KqED^~8X#!+o;h z$e#B48$3Y|@Mm=Aqez)pFGslxebimHSFn? zdNDcJteU%a&){S=;Oq&i?GCs6Jm z^_#i>7EgEa;y=>9VKdwczn2FVqWCz)Zd49Gp0oOeb$;tFNGj!gSgJ?g0Hw1eD(0iM zk>X^?=TKwjAudbsv2(7527>xOj?Tm%s`q{4gTWc=jCJhHShG!b*>`1&${u6i_ej~t zkX^`9Bq<`>NVW(w*6gyDZ4fQQloB7x?|gs%zi8 ze%u%Im~M=_XEN~enj5NP$^s`e$TSSB|5C90G)%wOT0w_%J@$sO@dKF`1O|W70HKI8 zoyKi*!i^ljq1ylb{H?lwp_%B^s+0f%tqgxFxOlTj%?d?1O0$2H%H|w0gS{PLX*c z6TtIFZ!&Gpe3=~I)6N>yld^(~KsB{mU7ia5zzEmr!%(*>(#s8UZa}&kGX=)k!wpia z4kkddTJ(=h*S#&Ou95rX19?_a;wyw`iR&5~uiD4#h*_}<%K}-2<{BGGTEUWZb>9oK zADQE>1Z8cxt0scdWs?-5rv=7@^L+7_3>Ow` zJVyU-q|i@d>KT8JziK`cUYXw9u>ZCJ<+qr9*MMXj-@DsAhXT=nbN@}IP*->`q*ofI zeSPCpKQxUp3iMI~1smMStA-_l`k>F&83YaMN{o<#vY2*WipXTilA!7jcPFVL)m<%T zX9wClylCkO1-xCriwaA{*VHww-{`h~vKdEP93ZP&dM^EFGywCEWT;1Uujt!fA2ol! z`z;WAs67Hsec@|~s|am*qJYc+gU9|3pu6~#O7p++(bm%NI0GZfv-Q>Aq(9J5KTy}e zMY3mDFxYo4kSt`oR4wUJV5`VpW(ivLpgAIO;&TlCXX_V)=bLG0IMkYUu6pr3 zEeT>U$JZx<%Kb+32P+phpAMEDPAW38q*vzKz5R9rrFQAn!{>&1hqa^gzIO>3c@9Zg zy~p~X{xsGRH*q6KD(6BzRP`D_;OIE;XI`DyW7mW%WDMM1|B=(iGQJmwQiBH?upZH)nrN1MqQ@*}qQs|%^F#MF z%V1dTyh+lCljz(Pf>OtwL2Rg~u0QcGEuEmK0Cv3DOpJb9_#r7_lV%$w7*PqmW@Sg z0(3ok7!j^FY;LhBj=~_Or?xn`+c2{UjL6~vI^8nG-@GbL{^`Mc{nfOGviE06Lh^qE z7rQW22`d8{X}fb*w;|f7vZAfV&E>%AL+q!b?Z3b`TtWKv=6CZSyx75ER(D*|{5qi5 zjsWsKs6`vKIX`P&k;o7sjg>1jOj&;B~Iupo-~1dXGgU=>n&HSBb4Z-{DN=KI7p7aM=F2GRYZ#3~#tytuj8K3vIcdzQ8H zZvuq2brx2ZEDzZkW|i_Nn?yxEnzsCE7|cP}r#wsh@J-bWL{J(L{a!z*O99?vm#9bR zRV;a;l%M+r+KZFZ_b&O8Bjk_KD*{Tv7u8f$`)EtJ1J3ebLpTt1|C4X^#pua53VbH= z(^*%F3u)Is6nn*_AIs@JqPcM?{Bq!!A|7g@tgK#T$3^X*6$Uw`G1a#z-1r(aiwaASU(pWzD<=h z`R7Kvrs5r4$lm((lSE_9XM0u~GY)jGh1x8;Rks+7YuF&O_}=R()wf?Q*2D@q8nCOf z!LS~YzQ}7}Dx^WO1pa^rY!pe6hN0)W58eDQHt?dW&##YR$ym6e4L0a1%_6pZfkxnRPs#vF=5b|CW^cwgU+f`)8@_Nl|f97soxxZ zh~32?xcbz3A$6f9zo7X$6(vmXY-7%|c(iW(wve(6_t@ecF_k7E z6!X@&dPRCxXin&rDlSCY7yj;f&dt>W1py@!wz&B$Vq%FUbmVX2uje%F1XooQqC8FtqpM!qFcE`kJR$=UVRE zo-!02Y@R6<(PWoNJdt+aBW-sUK(ECp63~c+^HL2U+qwKy=T~eMurOE#LguMesLy4= zdDv2#0q$)DT@@QiTxPQZ_D4yV@Jkgo_?MF-? zYUw-UoBq`CQo(LHQZ_jTBt@zwwr3K#Hcrhb`OsP8tN1En+H+#Gg-x>S__k7JsPm}b zjS@MMWhEl83}DAihl_*0wZkftiu5J;xOKASL~=N-UCq6=KDv3aUvf{A-%VUka7}(p z-z?*BM_LhSqDocvEmO|+mi&u6rJVnsCySecIZVQVYkZARB_ze6HcV>Pi5baM2Z)5mzSk0W{QnTI-D8TtcTW24~3NF!X$#I zK0Lyn00rT$X8*HZWPW#ujn*RmBh_kW$W?Rm~mfhxjd`EF7wEG_&?4;Cma=J_AUV3p92$Fe+Np+brg%bZzVSOoG z#W~=4=A5EC`nV0Q(D@m{4Ia2?8ALU7QKINCUhF&Nr|vQKJ1Grl(w9(kKpFAmV>1Yi z+ckX)p9FA5S@*(Oa%MaqVa&`u7}M*QFA4*6x45v+-zk*04-iDvY#Q|JZ(nYu7=5w` z(8y9tDNcsTK;l0_OZ)WIEbxZ*#eYOg*p;aE6*K|w7s`EI;<#A{=>}rH+uTh?H}+T^ zhzt7)Bsi0}vaNu)Z3tGIHzyxrlRz1jF%#_nHZ{He_A+N%qh`g#=vqceCx(N#2c#rKA}7QDy$~T z^`ttHffY=%;+IHNJ*(6Yx?`2BrFy3QW8pDh_?P2zUTlRqcM_%GO*svT+jT0Pd`b;k z6wPq0y>~lu>xln#ns8Rry#R_4`@C6Byq$swXp8$2Pz1k%FVJuH$hjYxb}vR#pF8{( z$lHkUI%4nhgo||fTu?I63qcf&^#~&NUKalikyw&RUOkg9=|?z8n563S4(1_wXqp4KI|rFS2WnV}t}SDS9@T?MwUWxR3y~sS=JcBjFn+qLVwG zl0mo`J1LZezRHOQ2Mb~h{0Dr3*G$4+e%+V_E1?uRH8&( z5FD((H(d_lCRIlZkp~b`n`y4DZMvTYL>)kY$b?_01)FMvJRCWYpUK z3WqA7mWsph_A2&E|6_=H=>-)z1o?g_4dUI7&ALJ2{cY$+{&*Kk8VoM>h%)#PyyVfn zI&=_nuEJMC%oa~4NZTh&5T*`t()+rZ72(cj3K5UR(qF-YdP==DhygG`>a%$BCwpre zr1#`^U?uxbUMN%76#QEvuRZg_{92SNiSxlZY$eXhQ@dN(kNNtF5S0*OBOjzwvx&4G z;e5!@fBvT(_Y z?l=^S$jo`-n1Wo+M<*_d%FS7+SQ6hdg-JsrED}L^ z4p~+HlS>xUnSo3#E$R4DFKX$MGt(WeA>2#JXAInJhQ$Edx9dxlK8u@(asK7=_O_kw zZ$inAA-}h$19R8^KJcJ!0D@#9ag00s!{3i3{M8;Amw?8LEik!M^Ma;78(EgbKJ(x2 zyNMKkF?VLns5H(jWlHYyidAA03oyhRN|nXr!rPtif*bj@!^l=ZHw%0g<9rhFdDd^i zt*QD)#GjK;Lxg4zbLkaLOO1#WEBbt6{YvS(78ns0oYpvv8hx_vfagEf`&!K}O;|bJ zsl{l7Z}vcoR;n2?oi8hb5QUt+C6u|?(Dg5CH=EiESzkOPKX7aNxU(;Qw(1hMqgC2zD!?ev}p@P9P3fw5vGdK&} zf0H2ybLkCfb@+H@r#JqN#iAkd&-P|)UL)CD*5~Q=jwiJ z_2PPC{&cxUZ_VggEmSCLfX`3XF`?-McBWvx;3J#STz@8(t5rMe zYGxEJx9KqqBI{(5#<|X)RqOSsX09~x;4c)(>)c+*M=XG_!iM6Q@rEaYplK^G@f|{} z1Z1vnrzT;hax@JMqKmN`>`V<$H+{A#oiXb4#-oOsjXS!GG@k(%BcHii+2w-z6~TML zhBFTA=7Uu$;!~p@r%AV!3?)EPY4Yb=f)_QR!s0|p$U5nU)-S(K7uv*xI}Y(%qNIa+ zbm!mkgbgoE(B1D&i>Y=k1&Sg=lAm~K8y?5g$l$ixehNpkk;RGkH%~1>DRsj!-na&m zrj`wvlej)*rhaq!X~CDvl{f1k_2UstjJG}4FSF|*pCZdB4@qTv~ zJcX+E-9y37e18V^hM|}bBnJE`5hmg&godJuf!x;~+$@8c`(I(KLB z2DuKyOU<^1q%!-uw~_fX!XIfn(8$7n*M%ISYVvk!SFJFjNFsdy$9LEf%b;2C4zCQ4 z@n2c|6l>@VS@`&w4Yo(6z`ZxiNiY^-BL6w`Wj03WOi?H3%m(Lb9f&Wtj$ozISji-; zf0P8p9$>~O<#`p5xB@MK^S%3;oPu^yAQ-QUK zrK^)zLVtyo|E(a}32_qD{6Dw<4|leA_VM1fE@cWkJ_)qb&mF;;iZbam^f!x3e-@HN zJ8GJYE{A%65$i=bn-%i;2=+#sNdzK+J zGN_jeDTO{6Ha1OW#>Q_d3hon`J2{DO^34z`zayE0Eld1Y;DWGy zs#?*W>UU+F^QO8F+4UYe>MKG1>c|wo8z`-yxn4CGaKA1Vy=0tmSX9B=$KmGv zG~XYNUBtq>-!v0%xLw9vcm_7&;bj6t9X;z*l%3xzEmP%@2vp9e(Krk&6{686)%Of& zoiGkY%KKa|>@@LBDIfC(F0j2p+1|<+%jbuQ4=7Cyh4i+%G*2kr1M+P^PfEtC4z_L) z(g%<|58O-Fo%zOVxpg3V{B~9hc3MbMi%sDCyu?Fm{zy$F{CW& zupevkjo-;>x}r0&?tXd7L>Ih3j;>uiYU#NheWA6Jr9t`Q$nU&;zYq>|6k+01BA>0= zCH>pJBb@2pqRzNHaAq&-o#{6kBTs^E_&oWm@}`S6@uX+)bC!7`n3F1XRt-H=$k_l} zf3YIrYy!k4Venq+3g4O4s`uqLOOfgoA^yj3p-XHyD2*~w2$@?nrj*(zdmMGioS!Bv zmpdg*jy`{&l%e}PFy!F{!p8-9MSBrOO|LtW9FLNuoaiR?+nzIBUwD1xWB9W~^SFaK zM$--a5A)D#;8a}(iv-GRF_W+7x4A+i0X`x!5EKv)^e`u0(?OZxT0W3=#1uCp7?B|K zSMo&wb?6m}Lm-r%sJOp+ZGZa1!MFbM*PzeA2J2b?;7xF)92%D+xx=2GUc%HL-4WjKA*ejT=16C_yUVk6Y$Mu3#IQc4h=PTFuw1$V4;312rhyf7XuLTaSy2fkdcO5O4L-g$^HF!A%(vAUR#( z-QYAy3PgPlATOLT2%jNy^4oV358R-oQI}HiS=520iHj#G4HYfA0)LxQ%Q#wp*okTZe|4BP-kontw5Rm$HJ$d<-k!?hzhBRk<(zKs<)FJpS!& ztj|`TR5=``vq+{6Rf9>2%BIK+EWNw)UX$WeuzEO-~7qmiJbzjYgQovTQO53sp@{-b*GpAmsqZBVQFNL$xL|NX7S zO5Zxtl70S7@5u~ok)!bA=(&PtP03>zM#C`pS#xgd8}GQhfBe+S>Xx&Q$c4G~h&?6{ zUYHg9tm}6?L+G$Pn|JDmsaMl92{Efv>fzIe`4CoWe(0`uDr=M=Zo&u;*x^zLnS@`( z#`e2@YSVUCGk1NIZJ`nxJXF~O+0fHL{!_^$XgbPPacj)RWBOYy-l1syIFR%0-2l#u z7iwsKdqol7tghURQ}&AZ`=fN$CHg63e8+PUr`ufc36k(034Fe19w)b)d+<~J_LIver7#eSv%$v!Gd_)S+vg!cEwGM7BVjt1l7Dc(*%g7~vf zw1m-Lo4to4i5BKZfQ9;o-uKD4oFPLW#Mpb?f)$2p9|g;-?)H9wMj|UEs<=p-c(T zC1zt+v-m{X+CAloJ}9J>9tU`tNW!=T`C$c#8BQl=V^-GH=|ARydV1by?Du0x1~57(=T^X0LY=%+nw*o)cJ<7@l6?F zge<|T_f&8yI@xG1ypd^-+%fU2)9-_@8RS!$u})c;wgKghUY z6JB4bShjTOnK^pY`VGp=zs@~u84&M7mHgtuZ3+2&XD3@NNUL`}%CvfCM00KK)$hfd z;ng!csHnqJ*%$+g!hW2U_DLCOTu<}-3?W$Q2CgNEnqGSL#yWbSgMHEVAq%u=XXgs6?G zJze~(E@T6vSjMlPHiQfY*!TSH5kB@zG+}kqoub+?bGS@V4}`*0@LNN#*vr6iZmT#G z_tW1>?FiF!YzxVBgL;zsH4-7>!-sxPFuXjwE^H@Aaw^z_v~G;*OU!84rrPZpZ!L@J z%2WK0?P#lLh^DCMr>LS=^^(tRX*P2=bPkC_!RQXD3+~Kh9^ww#F*&u`_>g+Y>D?tR z=mFSpobI{_As8MPLCP;nckpMvWnm_Z ztN~TicGI~FbU!Kxf^ws=B40qZ`pWfvm|$VESL7Gm)0E62zEeFIF8?pYMw*EZfq7dhv5ofC%2g0ZPjaEetStRQ9=8mz98d&6|pmE zvAtaZ77dIv^ZpKI(q19(4gPzbRX$DEqa*`SffvU%R7S&v94>eUDJ6WMMPA@1$4{aK zVkLth2{um@UP6{%hWZirue@^mZ{kkd4f~?UXFZE+R8*At`QFdMqTrfhRVB(16%)bu z!EExe5p&v{3g{{hf@Z1jPka|vbGY)-G#|U=Z|FQ(`zYipL#$D#O|2@G>RSF|;l}B~ zE7~vHc*jGiPI5vG1DhIr=GhjGc#R3G?+A>Y_J)eMn17gQZCvqvtj>~g5chHlB^dX3 zT__2A@ME2xbPbnlpISnrsYs-bHUOO~e&WGkLV;ZE!|X3$evCY;Ij$5$B4`kkFhco~ zs>-33hS^W}zH8ES2`{M^WL&x>YG3Csb}+>X7(8tdA+aP>XS)6v&{3{FJXgY zc>`<*!X*gAxVdK??k34kRu-bd+z2_%Q^rg1GD&A)?@PURb7Efx4xnl$f2}*E*`QN~ z$5D_qG4NFrm*4&v$7EE1 zwatJtO##(ElOzRaCU`@mBr8|WQ93FL>P|5XJ-%rmQ$+3s(U*p=MTgqKT;Bl0~*CQg{ruETOVu{0r)#&wQ~Q zFFYx~ed&i-KNOkpnq99$9IM+U^gP(8- zzKtBLusQS5!TyPy#3pCcbpG`Sk{`MZdvlr-cM~5OBlpy1Ky{CkD(!<$wt2iPyHjJ; zNd_g6aD!*ANXx-w=BPQRU1{A3iX}x07Rf2ba*vuJ*V%b0I3k$(qGR; z$uRI9kQe1jqc@d)Rqr}G{Sg$uK8Ta({X&d26gyU-TC<>}8%K*q!*I;bkgP#qfREH% zZVMhTrF5qtiv*X%Hf1Pu-{<6k%fAr2Tc6|tq-WT(EH&GwT+IkKTJ(5Kn9LZv0PmX_ z3cJeqyoV^J^IfR?*ufF>55z1*9gJm`!Ya-T(I>y95CU4i`CNNBX_rgs2MZ2ZuezK!ETOig8-6E+7X4=L$;*i@2y_FxO4<# zdQCDXG}wc8?DiX=B6Y*)xYjD2}8lPF(li(G4(SWyPW>*JKAl zU$k=y-!sX&x3x`q6Xt&cecFtaGFXV;ae8Gijf`{erOilN#N_7-uCa*u4kjud@jfk* zlYxH3Q=X1IVB}z}A)%#ekDg zt40|8sseEjqNlCjaLHFT>F4P4P1z8erA6;^0CoZ8>+!BpH`3848u$ow08sRC1Pcbp zsp}L)Iz(-{AH1-JxMq@nH?03`VL-v>n&=Th)J05qJ1#G_j`L|F34?Af6m zX;&z9`L0(3rd@4KieG`a6~_cK+J9I0(N ze{)Y6FkT#4ZimbWB!bgDZEEr}a{^7b70#*!fhLw6+HFX+I3>{SGlA6x{C$DQi#3qtj78a1u1)%nyl62$5iBX7W? zs#-}S?c*G7;60HbQU-a!se=1pWpk}^lUZ={KL*GF*o4S<<{@z$O|{^rWyDGMzvbbD z)5Clxf`a@K{+p!LIpc9)=W(ZD37BlY_!B?Em<#P<-v?#4h!pW(@Q!@(JHT<;$QCdv z4OPW|7pSBx*Kg2y|Vv5^sE#=GBjTSyOstFZYY5)Tv*TXUf0*m|n zs+iZzFoV&k!L@dvN2J%z4i(*bBk}jvy~XXqsb??16tp|c+Rur75;8%`4d~-8Frh~f zyrru3;u(~AJkbp1MF9+>fmO>dwDagD&zjY{YN-@|ys{O&Q2D`RLMH41`Uc(ivHH%R z^(?zqFqTYBbO|F{I6{HVF^%jFrD?!W8TabczX<4i_`g-6g>pU{SYIaA*%>y|6IFM( zCsHUE|Nn4t58H7t| zJ4)^#_%lN5tl*rJ^Q1?160jH`}$Ec91{!qMv`NxXuXjo2s|+614H=Oxxhx?R9d9)%lXG4uUKZwM}Eq@HmxHnUCRMw z3a9GC=921vIy~z)9zSb1{;s43>0!Zr-u2rNa%YT}y>2&7mFt`&d4_r;0xr}u>Em$6 zTL~jxWh`HyXeO|XUAX<{OS!WIX&-f*Cg#m_!5L6N4Eb>l8)Hm|&YO`*;nDCofh)JJCo<)|<%4hv{@YWv1?aA_1)cgCmI#?zYK0@}G9T$YghZOBHaGBlLaa zSwU(jZ6`f#Z8Z@_X+^}QAy{IAn)cPs($6ZNsDo8@%pqUxW5G>RT*xhtPPQ!A%;1U@ zJwgtwvBI+0rI{O5P)gB8q1#4ZLic6aHKdv-U?S8HS92w1I%0}i?(I86=vV(uyM1J< znFBGp)p_Wd!y?s zq6>)8TQta4!lSkjqv+8C#VO~vKeCZqCc8;T!WvvUzd7Q2ns1X#Al+k7p*F6);fM%O z4!UYgwoR3;enwz~#hpc>0lh{3Dj<6e~~6|U5^0Yw12o23hU#jpcy zkIM4544rjr-cD>5O8v!>!41NV3_DENf2T-jSOfNXXmUv41t}}^gQe( zm?xON#1l1n6|FfC3F*E}5$}Ov8n^yY-7F^&fW`}&VrqdQz3WO~v^|!45BjX9Xg+6I ziMa?Cg=606Xer~B!F37~F>K@VxnQR52Y2;}dc&*UF@b~JF?t-_5lll3-(~5SuMqAV zx|nz_@H4h~M%UZLc=%Z0{*qXD#_dAmTJR!eyjiUCr&9sZvf+Z(d$KN&o;46j6mOAq zj;4bU&qGoDR)0{Mw8!@BvGvd=Sgy@mKAOx<}ZOe-7IeI20G zJdsRveFOBy(U+xVb`uSn$25%D+zlPNsO!U*HETpKXq$8d=)C^1&)ZM#WXe-gV2!>+ z{81=Qw(AYOPPj4XTYbhr`E7~2{Ubp9IOhDvA6?3#E+w7mHXuYrX@hAy;;aY=REcp3 zt1002CT+uUQt&$u{D?L72y8Z25`%82*%Q^p@c-%9W-PS_-kU zj`z@ngBV8GKhmP5w>`8gSB(ez5M-7fi{ga7*s!eZ3#%bi5Je2j?!4`d#Ob=I00;gi zSP{#Xrh@1V;Uy!`&4=60jPRI`RDNMwbR_s++1~ZXO`aXhyvZI337O)4fgv zy!pW4)YW20FTAx|q^m{pk3ipIEioCfHr#Y4?I7;pPZ>D^6$>RUi`zrCw!gNkdJtAmq5P{t_=P*PP#X}fri}SX>l2x<1kSOGWnDq)(CNV+V zQ1&s)p?=WDClA|#=WfpV$9={O;wqFb+>H^HW$dMD zLXlJ9s0}FJFm=gxmaZ+*`AKz~PA+Pt_@H*p3m!pu-gpxXv z5A^syHJJ9GF~}nL1wAyA*^L98+5$v1MV4lCJy^*t%|&NpN;l+jGf*KS#8H~a65*vb zo%L52)6yUv_|Q~h{x5I(en zkI>RrA^pX}gUg=6i0)TU-Oyqx+YP9__Al2z@D8^{a;tyzX-~o^*iZiq$f$T~c*cgk z*ea9o%cMRy#obz1AM>_{edYLZ3DC;kGxjryHMRny$rg+3{VLLfpGE{mm6!#n>{vUA zfXhR}oMPdO$@vXMo73)uATV$@nL1__Y9Xf`eLSvlJKEj#^c#JT4TA{Cuq@z?_#trJ zJM9oAlw^dHVRKU6G`?M|C%biv#k127)ADY8iMVw0R-IPYtLYJ=OWz2lpT3nTa_A`Z&xpCWXNX6X9XF%~KWA2q7pptcZbc zvOerU@N28tn@{(HoZNXmoEUBSrJjJc`pH~$uu6&H({2?1#A|rc0BeFI4smK9O_s&A z)E@5Ycgq|EZd^s|Q&rRbfv&Hx==?%u0m%GorUCys;Z=pDq_hXTO>!Tt>PyfxG>`mqzGc?ZYXeZ>iQd)xTa~!W#0D{lCNmAq{En1g!WYQVKhA7 zKc#eDux?(3h34SfqtcyTvjtM0g&8c#eX`$!nx*KB^cCI522v43#$TkcZzQy;AXJuo zwEN>kkTa$5*xy5{oU9_;7ujMxQqO-gZD8A$4`@mX;_9i_SByiwTT$RY%c_DubZkT) z->fKRweKl|7HqtElPLJzrqS=>eo$xy)Ap12PkH|AZY{mm6J%vZrbL($tPu!7@ZYrW zWPaLx`+QUWpF0P`d+wUHL^cLbpzgt)B!WU2Sw0zy@BI!~;!P6g!%vt9cf<)XVED55t2p}5NuIC{?gzKMYcH&saz`S}MKtB1D+!Pn&AWC%o_v+R8QAleG^Nl5*MyQj>*T3UF+L;4p37WzyeiRK> zR0*VgOwIY-?@WXqh1n}wmh>)=`vW~?LiBh@h5DL4NbjjPhU64xCq6Xg(}TINpM4u1 zz%+ey{`Xm(}9NrBUUE;-_R@7+TG$FLg9K@@h z&{nRW_x!w!K^un(*P{Y&iO?&+tI|Vp4li@X4rhM@NugPrXN+r83J`L!F+#hXT&Mb5 z(7k}H^KVP1=bZpc2YHg=_KLSVLud)MgG|4unoo{kUvV89EQVybUm>tN8!Z*jW|2Ee zA~=s;tn#(<^nY#dh=sm|riWrJq71+(m)uZOj6n1A(;BU2zjx`Vu_6bEqcC#BCZ{)7 znAw}Q{B5qH{dXNNUkIZcBrxU2ySt}ZZ?~;e1h8Wjzl`C1@{j9@J0h>MxJupBC$1wQ z>uDP^CZeyEU$J8Ertx)P%kJ|v0v>Ar8!!cgCditg!6*<|IsDAO!RXi@Z+QIVJvhB! zZcnTei3X{B(n`;21;Y*O((a7Jn~9F%F@U(w&?8R}nIW@&8F#}8)G7$qyXuG|*O<=* z4q!z{^dArT3cIFxGUtGCXbAdhtE`c5+q!YRCSDe3lHbn47HmA*3za7oE^|F$;}<{X zfN3XTwRjQG-uKRiXfXdQ0Ou+#w4&}-uGx2M>biZd(Ji1Qnn{+iYR*+#rn`ZtK$4o~ zC!~NGXY!fa8X|Rl%wkB5KthDXkH>Rluan(g7cM(&Bex8*i|86YVR&W(cIm^7t-CmQ7(Lh?w;~ zGQIGvVBrF&5j|PV!JJQoRB@sEY(hoKMERy)vh_UOw}!-;;OJp%R+LdN(cGL1-@5>4 ze`LwTI_1_ZwHKq4PsTB%m8$v&Aas-j!^6-k7y+BGp5*tZc#Ba5@(jSnH-XcC& zd{}NalKcJ0L2=KolvYF|M5v)3G^w|WwQ-ZLi5^#jpVGsheX!K*`*e!|>a*bKEVgto z_F;Cv`O%U8rrF=Y%c?>mclk)MD*}=J$O0$m=WV|GtHK>od|^LLXyu?9gbVK`T&c0} zdf~+MP{ter|7-T~U|)Xo*jA&3!?FCiB2${@)|A^ z*7K&Pr!yTuaOIhVM3c(gkYF9^kB)-#qq2^=i)gxS-1P%d{Msa-5qNgFuUd-}dH#-t zzDBbV7nJ@gl~eyMkH2ftvmmh!&zN5a|AJ4{%`Bb?PM1V>OA-8*pKBHR|S@vw?G&m8EwBA**7i~1O*3h&(V zay|z3B3;o{;j{$e3k|;O?&z!fr7D$+Sf(q7-(yvy9)>&&ML1?o5AuhfWcz?+_m5nM zcR=G={4#Yhy6lDl2sgujun~b7UvZ656zKrplRMfL+8c2Xu||Q@v&Uu?!b!}_T+1|+ zY@x4VrKykWX+lg^l_;;zWOUkOxG#zzw?n}#Dvdi(#%&0ZjFj+~!#Ul46=F>A^!K5Q z8sjWquO}zl&TW)V&&=oiRVNBN{Fx+FLC=v?*8YUK;xYv&kp=Tgs`t9P9d>YR|^bwXSHZC9f#2-CwN_P8`ggu)K z_r+8w;!dKidrwL7DcU$k4=})0_4S1EE62)DU{{oo2zsQPyAtUwl$(!guZxdYXI-=QJq{W)WcliV1@N^db{(#@L>`L9yWE{K10uGuY!|b=x>>N zw8G}*{o$R(eY1hMAH3vNgt1N=2mkVG1Ut@kovc}IjEz43cLtj5|_KbW7xSBZLlesuAIo|1z z40<>!+%-xX3h|}PT#osc1pTwYiY!WjCQI|e0u3H>c*J>O4|HCpmxv-yuVVL1_%2eP zyRM0i3VmYWrB@k9?YCcl~q*JxIZ5toVvy zs9Og-3o2G3JPT30n)AaX(IWmaR+MRh1tECtzQIeX;Y=Pgf_-fS)bW6^l7It>6( zO2ymhx7`gTuK(h#Bp^mxx6&Etf*(LWPi4A}Vt^r6Rtgp^4(T^8$u052UhlCi2J_RiIj|Ne8~5sU?E%uSI=F`@)} zAfvw_lC^FF+C3Bmt&ANAPsVn8nd83Wg^z})Jt!YZMwB3H_=d;_)k&;>lYPIw z8k&hMd>tDu8{5o1$wwri?w;vc({iJ50rtdAC6;-@n zCRqahh)$z-LxgU%;hku7^1|h#MZ^fjYBb=mxTMPx&q{s#AGm|T=jZOsm!a!fV@L*x zSQ<5F&4&9GW_$+Z7{4tGx8{Ll%dXo;1XUXZ{WZgr$25=oaiG0_QtXHLMvDfh4EE9)-_AlO;doXtY#<)vwZQN z)whCLz~YW#5rpPS3HI-YkB<1MgUf^;Ji*;`MBUYBDq(9N`wBIW8ghc zp?eY}+m`0BaJO!mXtkkO0;HTRtBUIX2>b4EHov&P(t*7A*z?snF3MrQmA%^A5k7_KaLesK_x92~#vv3`S{x!Ga*t$CT zB=eMpII_VENcswhEbZ4ZpD%iT7MNY>7Q|7t3yhPQ_#Ok36qv<7zy`d5T%a7JTyzvM3XxdLW9+i|TrKv(L&r4qsVAaHLnL-V(S%g!IM*@6FL$m`t|RMK~_ za|l{u(8zucHE2Mx#UcW(OPR7_GY4=gWlt9Dxyy=yS};?l*AU6+fj2D>A&38hd)^0A z9eEMq@_VZ-xdzt)AWJvE#;-h6l^`p(2&KMojf>tU5ii+Fq+vhofC zj|0}{PxQ`So-WA3As3ObKps;|`zH%GLzFLw;vT2 z-8|l9zVY!e#fE(IW*Q6#0e!y`M&aOJTClOrRX!NZdFx zc2YuvQpUzc!M&VNs&z!ZL$8*3qzwv_Sr6c#vjwhiASt`LSL@Nc+wewEl+XpBb8c{v zx-+kmu7C8(6+LQjAE_?9-{Q}R+BC}1O^qnpN+k-BX!0v~EKhATNO6f7_>A1I9sUw( zD8a@!N=EuHxeUI)b@P}eN#S=%4sU)e>`FoJRAdcEZ;QzQQuoQ{nI_wvNLd@MNcbQL zA%$WkURFu~|8U;B)%?UDDN05nwFzvYHugy1B2WR%yOFD%{_9<<+Pzw=6pr@|B!6Iv zUuki{G&N%8SKptT2*H=69|I^}f4p@?Iyi>kpuixwYs^)#QY-%=yRAZqwmRY{KX~0+ zTB1hzVzTu@8652SJ!>L_TATXiH9zn^%+pHqkN=}YNjHZaU@LtRtlw9m0PK-6AHMBd zpTwH9Y?Kou3Z#o}Z=dZbYP=&@yMuw{BZhBCx4%ZOMTvehG8x<-e8HD$mJ+0nD_6l) zl1*c!A!LaT3I`ngXzGfrp?l^6Ix6?3?xa#NWNT^U4JH@SIy6FZa<9E ze;ymaMXice?~3;q#@>^RD$BsU&J=C!oMszYx^eZP;2)*yx^bFeQhS@#_b-j-r_T$8 z@6TdhSc3yEmSZO|4AX{^R$V!SHy@M1%FcQu$}cKGt%B4q9<%TB2ZB>(E#12!0p!JH z3TM6s{Tci=?87EM5t^+AdkZ!4tgCz(^wm7AutH6-gUh>H&-Oh}8v3)~xHexd+b>3>2p7>$DC;Mko9g!vGO0{nNzV~^>p8`Tb0vOp_j!Z_(= z-NW-zQJfZ4VyXiK{?_CrZ{KAm+X(w2>TexhUy`0{vh|f73#kFdIATHg^mE!@=URR& zKZqGijE61y;;#z%&3}9D;1`RoOU=}Dq4SVKK2}JG%UfIYAL+~T@=WQ(OOgK&9djr? zHK-b~DaFukX@&3h?>vZFX&%z2A}9gOSny1y(RNKIw3v{Ld>?4hl;w%o-xmU6slA3M zWNN*`P4t#KCdMPOkJDCa{y1g1)YojkNdW;=>M`k?o$XJrmUr&IVSB!0dIP6J zw(}4cvaU1jdB|=jYWGNz94>8_O7{~=U|9>LSs^{DK;cv~L+OqlxgdNNn;9m2zJw0Z zpk$`oYx!|k)13dZ$%cFU5iCOcGAQ1C{$)Rm6DoWKv~5W_en%xeRaUMK?Mz{JkN)Z{ zFDr~bqYYp*H%tx&5dl4=;d+X@HR%=egin zsa?I$9e51-n6iCV4BM-Xd2am8-u=m_7M_9(kh$GhCAvE$IrFS8PUX1~Vk1crwD@$# zK+UjF{5j0DM!dgr^O;Z>FTR6*8!d?2e+W@bdekXlq5g}p$LOdd&Yb9;c4&u)Rw4WO zvyq`5oij`R=BbZ1>4G?Wo;NJko9$kvGQ6&0I)j3PM%ao~cUz-x(7;#Sn+aFlW_nytdg3 zHW>vp>CpnCiN=>iG zOwu+?=~iza7!PV=!UD7RD+VC4?XZ12AS-}N4o|W|ghq4wAsK+n?xQ?t*`1K5_#S>c z4;TLFkqhz&a%qL>N9o^&ZslgrJ{xWcN)jJ-`*$Ou;*6I@Lkn%|^?q%}&=kncIsucE zJi-#Ob-;~4i{GJKXnLU2>yMbk+>p4G7i=uR^Y^8ceyi(-Y!3^9=6iZ%BURC)fk!QS zU9bZ&^8o)lPCx8n54TDy2u<2S@Qah`>%q^NT1t@4R|Fb#eP*XtpDMaObm%%Gpew6e z^?LymiO1Q+9q$m)(Ah&Qn1>QGbz~9B8hK@#Dh#gXA~^Lu2oo=){xj~NqUIS)Wd^!K#E^(j?I*Evb5U478VFe8KoeN14}MdWHcp4qbz(|vS% zv*dnOnGr?~Z~k|YIpPlMWtsk&H)E$oWFOJd#GxegDlg>p#xk@D6c?`wKAB$CA$CCA`vBfhDiR%+`B6cTAD&R2(C3uG zt|FU(UI{B`h>0cllKy3{E@la(e)`Ya>{n7K9DgXK$qbgQyQUhxdgtN#j;3}>n|S0) z1N%l8dRN}~eJv?g$HAbCc%OcsU*da!23`;!;h;WvQ5R{Joh9_|zIbkmjm6K5A>Wj9 zKrv#Gh{iq8!NgU+nXDzCn{>FwT&cWKg|ri|MTzfv&B>5;U_1T7Z?wKBLh7+L1IWNZ9o@-?yg!*`e^O$Cl9g^O z%n-mBSv1E7EP~u0hJ2&h4*d?N^MnL^GZbF?4zC?UicFqlatSb(wP2)c|N1BVW?UFyrnM&JVg^)}+CV87vD5t`bWgXx#$@D$q=cL5|CEvh8_>PwZRv$G%$#eIK= z^fouUDH?Vw-7HlbBfu&K@cU?B)Tz4Y&)HY}|26$7WW;&p5@OM-uL_V|l6`G;dz|If ze_ooWMjgjaxR03;r9XO~vxRzv;5AKZ56K`b^}tfgq_ZF!Y!n6?6!OA-AOPNw`nLVv z8mR9XqJQt$i}Dc{_E8{sslk;P=s4Hv=Hffz))^=OWvBKEUObU^)tV|_pQZDq8HLc~ zRd%4?5g>s868Co^dvl()UVVL;eiWQAYmB)%#H?A}Yt~pl6S(M+-ZD)~L23M&DfO9c zzEdz?b{Rji3N8@nFg^ch)CfrN9=yhG3?SIo%EDkwR+k^^cw! zmqE4#h689GLWf1jTYHl4FnGeKlcMmME}%~P1jfS*O-~7+OL|BIuI9zoJ$h4b2^lh@ z7^31>Q@Kh48WlhpI@8{fD4i?{%rQ(*4#Mc?;+aM?!lt7DvI$G0S^9$M&+lAuKR-#( ze=*sAxJ5qEr8*&=&=-IIy?&CkFFeHqk9 zMviOc3JAEhW`M}mi{-?9;&D(-S{xvayU|Wyx7t}EvXcz_sUyW$7IZD-Jt?(8zm~kJ zjP<<^xt7%HBaPg}>Rr4QuEov1`!wGJvLoL-mwbQR(vp638=}F4lxU!E=JXwHOZ+NMP@+5y7IC|rirE}Ecl_UB}WYmpe?c!s44o2P2h{c_c@Js#1;oo{V z=M(g;oI1owmrimx{NfWMKH&Y-E7;Y`L)qcqt6KN!u+7ao^Bg0I|8|ZW4);lkcs>i` z{#t76OC<@86d{H2HW!H0D5<7O$dM`+a;OhRIEf$ZtYRJ4XL;YBGh*)zQH^tS5Qj8D zidXUp{8+$V9aUp*#JD?e$Fb!B zSOxniBh2$wKkapHK|ISMJC2{#j#ckc$g>Zw1grWGaPQmlir@f+fxJ$xCY1B)hfwq* zpzFu_m!81Ac16^VEaSftkc;lFO5bKkDlEV12bV*Jxxk}TJgG-*!T@IXLStgfiWW5g z$;IACDWn3jT1d8JiJ>1c0sk@Fp+~{-i5<+G@rLWnTw-~9Oi$1pf&~5-EE6~>qd!o$dt@=^a{?0>>N9LVgYdb+} znQZjVU0s~pMv1>T`bgKjh(`0C@v`1q+@)MgCXj^+vIe!}TrBq9=VNN~2qKzJ9@Xsn zuJkcslw)P&kV9peGDNzmk{`S33<&pxfiLzR3SOA!VOAuGS=vvDs%$sJr2q<>(2#yA zlO&}n+$yb<>(^RUkpLc-id6Ed&7(}}Nvk3dV;BG*Yv4At8wMW%P~ZsKxFcwsDA%wk z7ARkJ-22zs1_3}7P+ovL7o+gyLrF|g_9 z0P8nDmLu*~w4PF^-E2^pG>EJ|_c6O+<26{hC|Z*dh#>DKR3Nu_?c?dh2JvQngG@Wj zb&9w=WcaZp**UBp#!a-CNx#yAMO_e)VKeySsKAL3z}Y~dncjr08HA4Wj&_ZmeR>Lr_{7qT&@2i_uwrw4ruko(p`X5?fLN}<)%&V* zi?K8bw;^96A>S#cQdt{-Ge$~Op;1R;Am#&dQ(qzHq7ZM&Q;ODh4^TcBr@yMD6U3e$ zYRd9XziwN4NXS6KO@F;J>?=9SQN{)6Ea!yM?|%x9L+f4$J~w%p zLcz_wO*Fz2Gb6xif0qOso$*y;gf0u|GN)d{qL6+tL-tLcf?KZ-mh1irbr8e0z1stI zhHn8(O0!aR;V3>_$C$P)DZVcma-FD-0~Ghhlek8tUl)b)DG^1c9)n(OKH%t*2Epam zdP$T3s@3XHh*?kyA%*B)j3MIk@B6UX_+s+O0OczcvttOO3(L&6y{9;!Yfj?N)Y z@%)(h^X-l*VBQ(09`HA(_P2=BOPPhsXO3mG6dZNC<9RIbvlQ}lpp2YHDtN- z6%n^pgwpt?dp;t`lW!?v-Ur=3t9x#8I#fFsaOd=9ItP|JFZUzTE&m(jA)uR1OPlD? zsSB*i3$mnngFdozkSb0YWN@JeHh=wKl?do?+n}xz-f^ckP5CMEI}lTojwgTVUe-Et zF*?%igtd)!(GR}Ly+?4n=icWsMT!kN1e>IP$bJw^%Jf5!m1)`lKU0gFABlt+9@Fe{ zz|7GybCgJyHJYS%hJY>92$4Zx%BmGw9Gk&QjUJXuKplyKPHwKjyJ{M%`%C~p-k}bf zM+_UCR)jKS&9X%Pc)`xc@nOWw{sn&-myD^BUGU9d2?I|Re)CXtU=CdzyTfTV65v`s z19lMNMzRc36GOy-OFzy5_~sbFzdvY;eSS51XCm5% zanK?9H+f;bDR zC_7o7nnfupZNiDw@{7kzfba7bC{Z|oyb6pIIlIzk`v zQZja{l*Y}etzNLVgm8XjXJ8m=Xd?7pG)@oT7Ag`wgcKvY9ut}J)K#Uyk{mm;Ch0KXzzLGAxy&4HD_r-{O-dA z%295w9d0G|PlD_tdC06#!LkK`yF-4Wa3vtxZ&sDTPOoPpAO>loBaQ`x71z(b5ZIV5rI|0C=RaW{edYYym%#p6~gAN@{j105ILL)sfBWUjOp4>0_T~p%A_-?3dJjC{4v?0q zprlFy7wBZMf>=K?YGmR-vgAcRA*z){fN~g)eM7W=l>jkRCB9ld?1$*4u)uN?f3%%I zLloE9o4@LQMY{KiB_H`$S?wWu(0ygdqkbU=>f&1po+4ILtUb-5nfBm$znE{0uRMgI z`HxjWjd|bHF;N^r9>Z=)!X|!;pOO$U5>)hD!*Vz`G4?nF_7rNC^a<3&AcUPt83@Og zkywvpP`1BF=tz{5MQpnWoo>E!6@n>@)1(ywg9 zdcNV8+D^j;UVkzMO1}8as8cF>l99g+%UIAxR+S5}seUAIS`IDIDTIu^s>KyGwYQ#l zDA{P_Vr-Hk&^{mV%XI13U_%W&x-OWC?Qnp(d}45DAfCuaGDbkoxj2h(EX_Z2>LqFh zl(8WPqsib>(yYQ&l*~F3&4A=Sn$&hk|5`RLSh0ORW10%fmEka?lN}c&9`)uc(>k&U z5_l6vV~$R7T5@8+pM8E8>Pf0s)7pdZ8hJLs`X37I)405p4#WJzTl?>HFO-_U-L7ox z0l5OP()iTH&&R9naa(kg?qgU`Vth3yWo;+%d~dJ3tYNlaZJBSRV6wq^Fa(5#?^Bwp z7M|X42M=UrJ~^bR7ac6Y_$^mx`y)Qss^_r29oh;B>QE8?CVo-6wQ80^Bgd;MFl&L~ zQ-k+OG;z@&+@{h&n&($1vrFNE*spP4@1pnB#MoPPu~^I00dgs-(E$iEA^qK&lbSI` zLaCQ#P3Yxbnn;we_Aqk*IO@`aKOcpRyvh9pyTSLMb_MS?g{2IEQ`4N8yws)8&`P2> zI!P{cJt1jr{^~+_UqFxh9o38ol(SD|s}8^{P=@YlxahreZnlnNCR=6Y1i&ESBhRp* zD*NOGqF7z+QqLETbQ8313wYM~BcZK=sB_J2v=$!-=-1@bpL`iBzk%&SRCt zSIwUxv6?Tb!`9bdta+C415}c{(AZW-|M7?Mnfv%ZqCz9*hwyp5vfd>XsQy~nsGE?d zcJ*q5!({DIWdKQMJiUVZUR;2X%HHoE^dAXIk^9=mLbyZ%dmJxtGy%lH(E30L!6ENH zqox>#SxQ_g^Kc9sKn-y!4opYlZ}t48Ayp!$G6?;W38XlHI4I;$$U*X-G*7Qjj|G=| z>N#{7PMzHg%{O^D3W-d*WIux-U}Sx5SQ3MX^Nn5x`wVp^{rsa)2jP!dkvmAy z4|zRR>w{vf{ZmCi^lRysaA?o4R%O!lkAXB|LpJ|{8~vQ&FZ4}QBw$wxo`q?k3A$iB z(fAYJyMbXOx#pV=aE%!7(x1;;EMdjefa3o1w-QI@VWzns52u_1Rf7t|_r-t2+XHe1kaz#x-L^j7bt~ZPxrL{;b>hht1QW%g;*#@}eXf#eR{TYa4 z4OwRR!iaf_@q%O{bKbBkM5E>O1}&`ZJMH)A(;k(uLK%2;f_xMdd+1B+UcR~$cl0Dz zwnNkN7X$owuG`+N0D&7)GEL_p8Leoj0tAYs&?UyVq=*5i;%kjxqF19oetv}fi#O~e zN=a8A(ZjPEd=SD)bP&LF5Y=hz8<2$Hyr8MiarIrD(Fj}y;4J%<8Ofs}vl%`O>nJ)1 zio8>QlPyByDlbMo1kUXtJUWfn$BZc^(W1q1gkBh+xCb-8(wd<}^6f*f$H^RhnFH7C zDC94)HR_r}=RL;HV9vjD65jlMK=_Ovvrj$>X0alT)=iE-Rhw1PN;UnF@36(S^!1&6 zgYqfX5VNU6j^`>A= z9+Wz3lunyLvu^rAcwVjoK&#ggVH+apXr!(sZ)bY23%=hrv0q!x{ z^?mXV?r+=5YGc_LlMY?e7;-c`?-j(AZ(pMielaxD%a95C1UgZ=5eRd}^J5*XJZMWl z#+=`OS_$Ui$1<+<(dKnS4qoyCNegKy7XWs@68P|V73Nl*QC|Hq#c4Y?MDKlJ3Fq?0 zXmh5noH$BsAJW_IFORPDxX&d+-|B@72Qf7gNon+v>@cC@jU-=4!k|~}3Zu1vHFmD<0dz$_lmUQ%gvIfYK{#d2U-u0oY=Z<1wvde+n{Jfi$x6r2!sA zhD%az+YZeHBnbfNLg@=`-5u=+qde~0#e_Ywj3;H6=gp&1)BH-tdXf>P{HzrHkT@gq z!`BN*Tbbap${Y7x)4HG>;QC;TMXk`pfFD4289FXw4ymFzB3(_nuhvgrs1wa=fJ&gb z?Oli@FH^Os8NqKYLL+nak7VJa`xKOc13J<$TDsQ5=gt9$FQ*{4uchE7vXINnAQ}y4 zbT|743BA0(pRy6OclD3-k__X5H1ai^O36CeFmE5YAZ^~?AohUK2ZF`DKm&Oq0GR2! zQ;2Hj=VEe(mHzG=r9bNnOjuue5cNM_{{5=-$^ISqV@Swv0vxiE6S|_$L-B)@m3AF{ zm^&c5O@V+-2PhV!_O&s-`FVo>6^J)qW+Bk!&=giWrsdpD{6!kf`!zbSx`SA_FYBmj z2XehPe)o$E=#cj!D@Hyejn)b=EDCOb#DTPe{5}SJ;gG>+?%w@k1>VrEy`#+k zN>7{h%`N>t1_ISkls;y$i|0KRJc&Z8@y-&dER%LV@&H}4QLSRJd#jsehN(uyY(~8A?&29p!%M_8RiPz^Z@kL-3qMrJhuy586c1<>! zy_1TUWtK%Tgh~cZ;8&5n;sVT<4y0d(NM3b>wS9~LyTR7p@X%c&0lJ`}F+%R*UAe+K zh1-27HaIm0^u76nlWpkHpk8ngS!U=9`meY2=;JJ=d>xH)%J{A{pzg^8Z~S{CaqfH8 zHUMXQT?<#F2cTJPsV7!zR~?gK^n>#TkTu~d5irNdV=!k(l|XrssVjf43Q5I5cIaWM zU+OW-a$`00U1Z%u!MAx66-XQ55ePPvk2MV&*qb;`F|-N`zu{uOwAaH?FBIu_ z#Nc>8dOaJG$dm(%xzClSd{fo%CSTX7VB~k%8j6DN%7ncrrD@A=l+qOGKgp&YS*qTf zWcz@10p%=DpoV~(w8|02o)54yr20(xCACCEIPCMLYJdB58UJAa);x=FRuQUxPLIfWJ64A?)xPW8l#OWax+QW|3n%wsT9)=F7Jz*>dnT zI?ef}IIQg{%+Z<5i6u8ytLq8>dB<=u8)15>?(vLHF$%Vv%F-Z;d#0=p90f|`Z3>MF z1N4V^W~)5HpLju+Y1?$+(!1ZHTUOs)>0nZ(T|8JJCqC&F$eCpG`$F*BL&af{Y){IG zDk+~o{W@>fk7R8l);9|3h9Oei^grjWoe2~?C$#`I0&2NmL2g0xgFj&c7eVnOAA*Yd zZzBwq{I>Z8{`t%fJqeyFGQX?%v~;X;1~f~VqTbPyT4K49i@Z|(w;-8Hj@|(!u2IDy zZh|fD%uV3O!a_*$>k9zt8v{j8Is4o10_&@RWUsb}T#sH^-#n-Gp72GXtvnnaQ1 zWVEPCD0ucspl1KPH%7FB0IY-?6zJ_lON~~-R=}+M)FP@<2av!&#no4ymsmPzRBHRc zWBUZR`rB)TgrS|M(-yMl_)NFvH<=e)Rn=3Le|$z}%y~`Oyv+q!Avtb0F$`*jYsNtH zVi+{BZcgUGo%F*Z0lIc=jy|LVyU}P614w`)7wBN3fwcUO7&5&==wifIkH2ZlO&X+u zfG#585j6`sis&j0sc^zyp>5xH*)X=l5jMi- z-C#Kunuqs7QzQ6Tp!H@h#lGMWk_rJx2HQY7LJwbEJes9A@0H1KwMf1U$v+Eg`kKtQkrUU^D#$ zr)fB_TqEkQ4t2E-u1~#nvL>XG5_w^blMmc#1UPvqPY`XlG0Kz4XCjkYH@9J zFHl_Z-C%Y%YbUy@R2;rcRKlsU8Cd*gUHJkjhu?u8XZ2J>7J);uF*9%VlX)~AXK)jZ z6jFOMm2`UooR_{D66_rs``!3k$-l+vj=40-gZs1jA}4?-!6sTab@jKM3^jW7Kpf}8 zd%+?*R{1iALgPV&VN;cCV8MBkhfg0&EgR$ZK3PugpzTZUiYMz9F)R4{E=PXXI|Sur z)*u`9C+sW@n@3j z0mon^z35(!NLYe*9ky>E7nOQ+30d?X(>fw0z%ln8JS)vVzqa~}<<>V`rTDqnF6WjC{;yOvApaa^dj9dQb;;+ds%bR}ieU*)L zRNz9tRbQmb3uW8&j`>yN2o1p--dyIZYRF2;xMmQ$@JZ`}VJbEupQt3@*le8y%aX(c zV+@I5CG(0qn^yy~%&S3BEp?Kb;25Qm*9NRO>vWe?#rIGa6T-<)utBKpCfsV@=!;57Ec~ySb?U zi*~XY0L6s`ayL8#cTa@YDh|;%KnK<2eab*fIsoD$aIEIhgu@i#Mz4O^*GYY?lv(|w zjTijDVYI>>J@FtCQXg%bIA0gH`f0W9b&nE7EEB^@wWI>z{dY&dRW-F?hqo&$oiQ7#66 z-M|LAQ&&YRAq6~HH`B=m{xmT3_|h*^$($am#--LOLtckUp2wsc%aHG}J%l8NGN3;0 zxR1s5*z`vxST0upr-mWx-sxio$y`3{xs`7w*eo@m?@9X4j1E!sNO9z1H+N@SirYVh7zL@9)``5WSv9L@>Ssenr% ze>1NVkbI6VY|-GU-5utfWb+=mshmxqNy=L{PZb|yZRP_^wqYyKHF7mEP-~_BNy7~E zYw3{V|2+i<2i09+}0 zOq4f1>G#RvnmgzSl?v#wIy!!USH6>zF=EnY(l}j}6IQ)hU@S1MAVrH;<9N z7{AxIAEHLGE&}^OVV-nuNzLwqkG#kFM&BW05+!}La?$F-zQ_hO!D2Mt?n~8?N3*;p zhqk75*PNk4)QL(j-pcY~a#8A5NU#NHrS1ZX4!XnIZxSc{Gxn#^K)9ukmMJN2>gVY^ zGMb9O_BsO(iKcuJyVg5%C7960b~7E&wftyk0#<;{C+Ptxj-0rHF|n1mRo8#QaXDe*h^(HWIZdm#eSnZs5iZT)6JV;=MDPy*%52buuSvS_xX#qNx?ghl2yx-pFron z&^#tpg}W4+tluD^^B{|)?-z?>HH>CExj{1EgG}4qA{+ZbG4R0En{b1qlnr=uFET0F z&_~Hr)Xx9!A?|VNt807td>o}$uxD8KT`yG7fA>P%{V5e>6?qZ7|J_rPy&;46zr#xZ zJFKS0D{bl(>=W+Gt01ck4Bq0Ewz(JT#VhS#;qLF{5zZ@Z9pN7Se@2XgP(Hu|_I{rK zJzG(kSNf)xpO0@iuY$Z1ue4EcxYym#kU&(p7iIX}2;hmjA%P)xtwT{BUc3r&|9uYN zwRQZ$!z{h->V^b`h6H;Bhw}n64g3Ousle@jbM?GDLOi{AH8d#y_nSl$?Y~-W4|;30 z^RnUbRLZ+<&+n5(K_BXwsr}XVbkGmqFf%@&fvgdeuwyo*=KpH3gh2AfuY9w}PqLl7 z!HY*os!Knz*l_KMt?Q7XVg4I;4_?iF-mxobagO*|RjkPm58KMVYMpQnIEepoK6K8? zEqUadY)GZ%Ncccpz#QE*QcwE-89G#_s#uBDjp6)IPx^(piOKP->|WPM>}z7GSvpnA zBUiTN4JD0l%ns4~=WEY5apYgM3U;pB90|D-bR=`pw*)$WyKwDnU^VYEvtDHx6e)Y! zcktY_R{mvN|D~u(FYd}%*?&^p6=>4m|e#!c!mAq5onXXOt2M<+6^e$VC-uCuL3~HKPM%x`G zk>3h)+;MK0WS|L{OMZ|N=&bgD;QCUlGt!7&OVYBv4RZhv1JNOoC7@G$%|tp1%) zw-=;Zx^0lt|L{yuC-~A}8}e~%{xyBxGdL?{FUP~ zClgC^o?#W_a?Ser>P~a76S90G>KSkN>eHFo->?2|^2o2AFtc`wCziZ^c~U=gg=Z8E z*;1NS8hE;?(X^Q!_h&M)YNp1|{_E1a*p;gSlEEe7u=G*Sdba&m{(S)}W#hZKne3IH zS7XHzd)c@HR_mGjQfhIXgSPk8Du-@|K1(MJg1v4wdE?q}2Rd{-&hcRIXZEJ4#!r}6 z;o#|<$+S@6sl*&=_DOk-fdL=+w(PxvnXwIw)NSOnkB}w9uCL9|O*<_Sl~uOE+)(1W zI>wp=HFDm@8A@v(?eB`iZ(I4NxHmh#)0@m2OR;TQow;^syzXLaTgN9I&VleRwmDk;~b=D&Y`pSgxf1P*85o{~LDaS2V&h#?PeClPT^m56D^Z zOpgW^KYUpxaL107eg5`KDw8|kJGQ^ZPd~$T-XhY^5bHwk296AVx+?OH+FSa&Z?5UgUvE+ zyV#pyj;)OYXfsvomE9bRAoCY^*^wr1`@N1&aa-M`(c8L5(M)%VL)O&r^9A8E8aK&X z{9<0nftQS`irKHjlEXO7qwV(4H<=nYYWSR>KF|YCO4m&HGB%$H5@p!O{A@orGAftL4ya;$ur|$~U$Zcy>QdT>Y(SqUp_3JP>h01^GJR*{8+rA3d^jQSm6jk^J?!Bj(Ol_;yWmV8pbd)%t^x zWtxZ;Q$O~>B*mYOS^eQE1JtW?RibWzM*kwcGD;i%-$FOlYaaiz*YUOYo6`?$Ti4HdGHN{Ecef6sEg?|qy4#cv z2t}Q>iq#HGY@PM#$~UOxW1a{3{WxE$#+BP8ap;2@U5}WW;9T=VHXG1J=kKpp;Nz3m zSC=Q@UMXg}4RsaXf!2Gb(!M-G2PxJP0UsoOv!Qc7dkvO&Y>>p#Yr_|Z@V14*KP(-* zw%>b#ZsQ-mpIn6Auw*H{+o0xLI(B5O%kJ>n@#2ZSq~_yOVf;VFn~$)s7%T-FzpT(( zgtt>Ak<=<|j6W!!Hxm6mOQW}YTcpLflGN|!vt@E}v&!Az>N4%O$x2f-`KIimQAVY| z3Zvv@{YuA9{q7dar{>jEJq-KDRHPzW>lmIq?F`{((u0Y`Sl;^p7{mX*eZJ6TseVf0 z=BQnUwkCci6=73lm~dcZMce3~Nu#T33-M%WYHi~``GgMVG}UIS)mMLa^+Nm$CIzc2 z(3X9-VywFa8~5*H#6q2^^F+f!fc$*eld(n91d_H@m#=Kw`a4IqZZCUf_{k#Mjqbw0 znoXbXz31Io=eRvR%v6u$lI@xcBd`43O!XE~N7rtvFKIema`-?^u<_lh;~FtDnu%^C ze4XLx?Fe~Ib-%MFe`C|?#u90++?E)=S|vq#cD=mau=tn}$Dl^yj=8-jAGd9|B368w zgPVq^H{vIIx1#ic4WeOto{*!SwcJxlrb^)>Iam-NLp_TE{D zyoZ5ZMcOl=$#0!mEI*;NIc)uOxchA!NxmiC zly0aMAM~T_=Lvet{MRq>Z!%+NQiBdx8wPtSCY6JM7|-)<(?+S|sc@Zab7vn5%|-SftjDKXsp_S8GQ674qn}PB5!M*f!?JDsveqoR%&a|K8B{&+DoY6Z zZFPP-`+jLSQ*`7jSIw7U<7oY6db0g_Z}j<7yXRYn^0z+u#-2``Qas<=tP^ysCEdND zFB(O@-t_Yr|L3BOTuo9h}10$eG2u747iuq(ytaKuoS-TaLr#c#no$`T4<%riK>-h}f1H zWlj%<%bG*BTj~{^w$AJ9y|YPmH|Kl>AJp5io5Y9;%Q;xFHB>OZGq)-Yw~&iqdU?{# z_La8rAFrqvy^G)r%MZrtb-7a?`+3bj56Vikh9(o)xIS#NtAt;t+Xxj7$~5rMG>_Z# znjh8TD|!q`%Lg-L8>tpFa9oe%N7Z`;#oSI-c$s#R^5}KacO-I(RIGJNAIsa&UA{LZ zF~ZkPO+pPli^Y{3j2f;7a#W4=w|8j)a{(F8wy`Z?d8OK|5GRbN1d-ZER!gWMr8?+o^Gjib&F81A4}f=OJ6R znAxwun`ypA(^ik(3dsUVt*z6q{j*!|)1n92O^$^xgsw9*Ti4b7Oq2PJJ>?xLXNj!O z<|>2?gMfcZR4^Z5GA1#;ly;}C=8U)z29hk}kUGJw`XEP$RCRaMEG*#nI>n#^{ z%uIKqhBka!ziN9KR6{=~^_RuXDHSen#(v(ZbEA2=u82W}y)brU6LWFa>7)Ff`XoN_ zG`MK;1I0YCZ9QFetKQ3LBfpZm#`#9}6wk>IVaMIQGQSuzAsf3A5psfhEtl*!-m<*? z_;~G|Vs$^&9^by?0xGjL2m6}-Rt&}byN#4USWqE|ot1TEXvPr{xB~7C>Z|Fro^17t4&cg#G43qb0?Yi0m1W`RXZSG7|Nxb_NlL|kb z2tTda{YTxV`AFT$F)4_(F{kl2Mti1icz9#BQB-Zd6T9!Y`K8K2rSMs9ZH=k@3%y6; z~)xv3l76=sV%a9;y&hRIQgQaO|2Pwetui)iu32eHQ{A8 zRbICB*6fK!{&NwqcLZ4mqwet-1V5nfq`QT_c#Ol$SY?%Z8L)6aY<%eKNI3MH+! zs2YYy2YFqGW%};D#+fI5MguiNQ~{Cl`H0ze^Jp7Qxd5LSw-(kH3%CY1$L3m2oByAwHrpkrU!Od&)9jnxuQe0zfZ#~HXU!*(Q%dam@I^g8EeLN zJgf9L&^`-RvR%>I4fYv5%_sHOY&j_sjgEAMW$o!tCT-<%`t!BAI#=EKw#3k7*=grV z=TgS?<)T^L6sPhetT~^m(XaQJ9Ca6wZwQ4AzNI!sy~w&T`U8P3LH*k~uQrp? z1~aiVoFD&(qU(%j>*2z!U0bcvmf8|~uc9^)io~wkd(|$r_f`b4Y9=IB?NOsBDn=2} ze<`gkF7X`-B?eP|QUz zQY`X^X)`4pR~N}&&E|l>n}#t!Rf<8*Xv|Wn_`1|*%M!X3oTTU<>b2Mwt1}#97>|5y zP{g1U05_Z`2{6WZIc2j%FZ1K{56G6e-kAS-9ZgOo2d*{{zJn1VCTK zVZzdk7)e_g%;cdijJjZb{!8W_)9ZRxRU&HwziPNgTI$nBg4vqA;z6RkMLNunXuw=E z$CXW9F9D@thIBHyD>K2mP`pr~y=Gq3#Pi{E*`xVdY+oME+*F0%t#FgspDVG8YClkYiU1|xXx z)ocs4Tv^V1bOW)e7_*`x$x^kT&ZkSv^QB>dKEYW}bt-1YtcO_qmIa#qs{K(mvH2|F zIp25>;8yQICiOF8L0c=W93JDyait^z8}hH?`@rbvS_#tEa^!@eG6KYxOh&$$yt3Lh zM5JXjr~h&M)VxDA7X!>8Jeg5jsc_$GC@HqJ;I1^#6(iCWa&2|2R(R~=d1Ng0R?s$# z9J&9LHDwB=nXf}rHA#s2_1aU@=n)SPW%B2cHroTdYPe}|ci}F?ZtR0WWVb!lgF*~w zVup_iS=>X({pI)FXQ8?n;<8qxR5*zAK6P}|zP_5WJ5&%Y&cjyk8nW@C4)8Dfj6HHxhzoe>6-*Dec;tv6Gr1@HHqeT}c1%gE;lz`Ii-WJxD4 zzwA+9p?4vh^o$UFHP2~2D_kL1w~!9L`0g5L4h+&^$kta)@Mm`!E3O%8GmHB9AX{1R zP_wbu_hKsBg0L5C_xZGysq$;eo3Nz_^oP>J$8dI28i4FOnrs0;EwW7oEPSwNPdV}S zKXnCz4z-5)!m1`=P*BDDa&r3l7co_{Y60I(*B|XN)X(Mdxes!!laW^>5*JF0{P=pg z2v9ZQtwQEi$C^5%7M0>O%7Be`CC6Urd43kPr#vVcaqz#V*y+e_I4e^m{`WJ-r-&-S zR-F&`Lr%_eFkcS4ZL<;2_3n|e6|~un{LhL^dpXRn>i=n;0&Yd2xGvts~?hbLh&`LK#I&0v?n71?_OAQF)<3y?3I) z=}^}x)04-<$0J^e*81d63$(Y=)Wy z!7Pj0;9Ob_8x4P3)VIpOMfAxB-u@@2-ZHl5pIa|mjLknnOFRMykI@t|$Z{Cm zV}Fe8Xz?Lk#*Ery+u_sy8woCJPGK`xaNufoM zr)X(@NhPx5fEE+*Wkl~hg@+YJruG5oc3ewIsr7KFU%n_kans!;f%e|d{`4C@Z=t>n z>zF6k`2Mo4XFj`QI8T#BL#<+-4nPpJhwT~Jm7z-sMi4)$=DKFeb$VsCH1t--bD7_1!c+tIrFB$}c+Cd# zJJt}BfzMYa^0v40OfNn&zhl%@Y$%@loTE-#zw3ZDz*{*)~WoU>9L*zzdj zI9S%iT#HVe4c9AEhWVvBRyRLjODl*wZsxX{pae^g|!S8*_4*%E3~ zM9i2EE?{x$52M)y#n~~9W>ZXbH0?{6XnM7HmK+6hTx}&mdH&)K>fofa|BOiD^xJ)i z%_`Z++&ZSuy;J}ZWFpk+goZ%gKvs+5bcbrU2}H>6B}GPe7X?2&A5m-!NOnIGeJXy; zqPv+9=~KZD;VAtp;aUtdzp)>P(Mi%ad$j=XEe zh^{7jwoeMX2)hE+-d?vVcxy%s;c_90W>KU~8|#KQj+{!Re!9Z&jL;(>G8vouX2p6;F^g-9EyO3-(F)FeCy8(Q-#sLXYDxA;yW zSMXosxsT;i1Zq%@Pc~FBr_tNHFi3AxF&-q$IR3;U@a2#+a0f&~->vi*oHVYh+^=g` z^Zfj0Sr3cJt@5xenpK<>G1_K4bkHo0+a67J_e~01wI|uG$+q{_8*bWMAM)~Aq!WDI zLhqaZU6DRntL8Uv?ghYzxb7!kgTj6y{3>Op{$D{KKJ3Xz+H%d)VEvX-9ey`h#0Rjk z9jWnCPMQiGa0tIvv*sg%#1WFWf2wYrt-pP{wQqby5EhLFh5|@;$Sx<9EQ70(BJOo{t2-vlc-GJb=y&fS zIF}4eky-6CNXWw0s+13@uR%J`aO*=;H+99GDinG3diD=m3>?u%43)m4lKEc4X5)Qb zn%Z`chd*IAz0L!qYu1~*HJTatxc-GaE=bK#I=i-s%sZ}JP0S#^DpAb)T3{!OKY}s!f$Qx{J*l3^lx|R`_ z@x~|JB&UI+d}jYSz20|uY_H3IyM**)ZdS~5=^LV)a6o3>!cxCUN|`Pu9U^v9Akg$d zIxUVoQau4aSLzT4Qa^pnxV-Dy4FoGF2dZua*kc%LvGrI{C2z-`rjL+qC!?nN{`T(q zx_xFVI!dzKDrSqW##nSRBtCV`G-&s=heLG(+n9dIs&0cWxO?l^8z8aSIIqW{yQ)8P zayu%!5Mg3|y8NC!GW~gXBX%H$oTLoLB32>oleQB6viDqG`MKNlAH#?j!Aa_2HW}dz z#-U^LRTYZmw}O_eXv~p{=GdObKa|8sO=TP^KfFJAE~n{v^vB|%vPH4O!+wdW){PiE z`{?__`!7E;Tg~gV7aJ(+>W{4voeP#_$eU3^VnRg!*<0Ozms02~v_&su?QDc964e>* zd2!sQF*0ltxxfq0fy`boMCjiLqyvKNC(^a0GLupN2?EPceJ3GT>GL++d9AfxDnjq% zP_YJM4$60_kr;Faoz428h5VDNd^sBxT)e1Z)1l(%aa8(m^_3GvWT;*({)9nlyF)rr z+3>-Qclh=5gXl4qX&;J8aqTEyGlF%lQC~ZCQSXO`U?RHweDF{07?Y}`M}B;n_urTQ zT*IjE6^D_vzK z9^{VO2RIRGBL($mGoAuHW;i!v#QdpAj-ydRiX0Xktzxl&e*4&)XARRP@n4#6=Xc#UFE|cy%p8as8s5ke3Hm4xWgmAs-8~~zu3U|6?oqH z%Oi;z1hA>dh@y~Lr}w19F)tiw5>rquMh`6K4zfuW^e`Lejt0=xIJL<;t1?fDfplbb z&PT)>c%E!-8=Px`;Ah(^68cv6w20dNw#>7di;tk*GcGA4B7b^xIc?TqScMj`g$kqU zIX?Q8z;2{7l|zuHT+*~=Wz|6udqhI2-GM>-!EiC5>dh$|MELJwS<5{efDvvQumX!) zHF*vV4gLB(iJ?$pVOL0bex$g?@xwP>n}(vsJZFe2EQl4nm0q2L(MB$wIO>Ynt7teU zzNN(exLQ`(!OUZxhu?4}lNTiI#YxzZuNF4*f(_j52@0AvE>AP$Hx%zVP(H0uwOB~M zwi)mCbo0*iG^0YX>o+TWq^?lC{mlnif%J@>=KsaPBL!Sq4y=)VYQj7>N#*{qg+`di^hNeh;dgWrF_x;Wx^nI8q z+cVDAJJL<^DzUSH)1mF%aN0?)s*gs?_(DF#kBBqKXCNv?6(I7o zsj~}l=6k(L**Ow823?Q1G%v>bitM>t5tFoR`8)=DklW6ej5)i{Sg%p(R$rB1aPhor z^Q>g4#FV|1JE~7UpCaK!bTPSXDzruW)YuW~0UiNV+5ro~G-1vTVdOP`ivfRDcD@Sw ze`{FFXG9FOy(^jf;f7R8o)USp?Lz-hsB5kZ64~?k$HXE(_Co6}pLBj@`h9U3&NnM@$#} z=e=E!>TsK0gJG6%zRkoy{z|*_GerO$Kwg4YRKk2>22;|I-xya{Gh~ zbpAE!42zAy}O14=z`whpV~E`PVUSnH!`N@?^r>*3lSxA!AxXrp+$l5%Ok zTIrx`%jgNPM$RF%G3dTtIHiI}X(sP0l5pY?TQIZQDcI59+n0SgaSJe0yjXg%s~%WG zF{Ac*^~GzWN#dXC6cXLgPv6((bRAybi@1|N>^Tk^^M|%rng)aT@tRt0_Gl}S^WLmA zVgLz+U(K)bKZu^Vxq~({-ajC4HX}+NP(&TG&B7vTPe7)6M&8zqV5f-%T@ix`69o>7 z;h#p5_rFdYc&)Khoi_uT?tLr1Fe7}%->`t2{K6QKVLvqe#S^c-2RQ7uB?~^2;rZ;Y z{>CiG{cyu+n;2$r$kWm4)lVYT?;6=wf#W}V7M&$v zLRx1dM6(+7Z@@4_p$KJeW465iro{eANhSFVCX=>AJ+==(?7usT3XpRkxK{7oh2?Z}z%eaou`2@DELp2NbXo)`BqVgz*~pD8H_qcec7V~r zrwELx+G8@I+5}8avL5d3b6*2vrn;e9YJQ?%sA{fIU9FizTLxKuqCo2maZl`)$e2o} za=0Iw2*ACZ^KV-~#EH?o2iHav{)B%6BF5E9?0fv!Nzbf?wJ_Qr=cCWAuBQPf2Ke2k z^+71sve5dVygw;Rjq7h+DEnYUws>is%0svPSlm}<1@VZKf+#SR)Ek#=doOvA*Rt$} zELET#WzknrOS32JqL@_U9Da^E^f^xk!np)Td+H&gyh*~ltBYd2af+BdOg~})y_ZFt zAV&Zle|oM+YOC9XJ5*dS#NreXo1aTPSw#hQdLEzir9G0ICE)dxjRyEvs}n8t1kp9F zi889$H3kjt98$@pcz1*={NS2tF#&Hrh#wGB$&LJVefjTKslDQtW-w2Hhdj(r&nNL!Y$#i0HrcbF{in(-4>P(Pv51R8^Q2?<2PEoT5gE zVIca?YqLYl)4MWtD+OebojC+Mr0Mef5$~0|0>qo3@Pp99JrJq*U86Y%HWb;t5wP4^ zxs?v!c)dR&2xCbz*T_gfJ#v2Kgpyd+7BUE@&8xeT+c3yJFZ&b3ndAu`#}8Jlv}~~= z+0PkARKA5;eTZj$62TU!uv;>=T%7-{wbTk8c3vQdJ0ZN9_$<1@y#BVM;Bj%5PswzV zas5w*1tWo|7?Zsg<@qdzH|39XkURzy2tigv7?o+KvE|`Ih#$IhGIK*eh$>;ingaZY zdM6W*N#&UXb_h#SQZ}-ZGADkX3V=NnDd*BQ%Zs1cb9NJbu!ycz6SHyf02MANBrFV_ zlwis2&j!-i zl&VVHwGaimz$Vxg)T>x;WzC81=RKPO3OVEdQY|mI2g$U`8=zN@YK>m5%=ga=sGFyL zjGHLPm&5fmx$;_^tr~Q%t$(E&=n|CnXCMT-dmGMjiiMi=*js%*iuUe}!@t<>Lg)Lh zDtH)KN=q8(r3n33AR`~RJ-9OjD={>xkP=s3KM4lU&N5yT3hznEkzRRo7^>XMz&e=O!>%hcFHgDp029MCqo_i*fEtvb}SO+IWZXVEO^eh{-o z?&86H=QMp|cl!^GJ@lAGqarQaOGv67K!Oj^QxDkC6sr72!Ap6}k;-m>dg0!U9fF>i z?1#b4Z+^>vWq&OwwAIVf^4SOO@^2p;)Tyd4qQ;N3y#kUrMqSW@{pb>+j%Q!m*xjYD z=_KLa2u+21+gov{*Hq;`LxdBxJ1y*?{_2I0b(>T-J+at!=*{f@t~g1eU26!=e$6zL z{#Vb!U%#O>^O+1uyAye1O0A-YeW&9Oe}u?ke<1U($rKYiASeM4O>?L4yrn4kG#)#{ zohOzj*I-)aBI58x*CuhD3kpICWNlKKnFA6>vu&+PZtsTfG=YQsxXf+li?Uz`f#(px zJ-AQFN?=t}A3&u>41Cp?@~gyIzw{CL?6whGHH^n?ttEL->x4ynx^2?S)LI&jK}m8W zNj-wBF3e3VT)Y`&$Z{0SUeSVxJ-H@w>P6G^Oz%P&K9jKqeoMWmKPE+J zDG=TOufJ5BdGG5aYf*58m!MRlNdSHdwKfPKFg?|0)_{JKxtfnRgziVp{t-f$&eH&7&;-%FG z8d+?&j%{#%ET1(wq|gFh1TDhBF@?Z~t``_oI8bCPaw2wOhYx4GI*q9sALo4p^ ziKTo+Tvy4=Msh45X=+XohT0-n*Og4VLR=)au5_wWMwYC+Z?QXF# zCt=S=I-s~stAh}5hS`M*CP1#kybkeIL=R$JfE<|ss@A5VDT_!`8jK9-Iatffw*ez_F1 zPaVEAR4pNcWMYu&+DP`4sg8f{YE}=iXYbzgrtGx@>=>^Px@B@9i)FoL8-*k^-?Vq2 zN-Q#2hNq=#k~ab`?srsE^PdJ@gsh%OBB$_Fc0j|^l+W!;+u6!at`_}FnQ)JB6Q_Wo zMmHDV#Vuhl9<*uhSsaF^&~Wj>8z#_sz>9=NsT=QE0+OCmBDh6ncLcp{#GF0e3o*k$ zxl}52HyEMrhfK&sQ+Opu+l2^}C1Me#GqnI^isBC^MJ=JmGT25hMrNv-_SiK2JM%}3kW{N?pbIbf-1Q+;1I#4t%&CR!-_ zuioRkRvz{4LxN_OCuE8s^d#udrl?u7r^T1@cWr98zd^D@Z7&GVuQ#5ry-Lo0WsaeE z1A$PQ1QCxgI2UERg9Q+Okxi*_bBk%RC44iuxkSE(r+0>2#ZR>A9qt!DSan~p8$c+<7`AL2V;$JW7CBYX?NDJ*fSrsFkKVkBvsD!ez z($wdb6(~0lY}FUP{*wV83*%U}j3=z}1(7h*YVF?U@@I`D#(dp5RzMrkrz79XpVRkr zpVYjYj|W(N6Fs>;s|~MjO1R0r!(^a`l8~wS#N?o@1D3jcZ>9j@ERuLu3S-Hu{niUW zg$LN&3`*CIdbmOI9lwzN&S~iYX1ZgG*hF=JKI1z-q0bFx2M362_FR|oe?(vh)wj0T zeP!Qkh?qmEw7~5O2)P8nL@_0H(yP>BI?*6#B^9dv32XN<@=o)fB^*=1AudzbN2q$O z81ZkN)0J~?#gDTx)55`{eLGh}T8Bf@p=Utqta?W<&&Sz26nv!r0{620v&8RYSS%zX z?*sGi85j{nFnR7aC`oHAaVjg;=dT5%%W;$trtF}TqX|}VXJ>g+;5Hx$^o+T7kQysn zO%<@17*Th0(DrDy;~y*Xux1~!jFSNmpb1I#gkM{sv$pWXQWu|@x@M<8lX!6hBiBzT z2}Jk4?mD@f?2U9^-)0o*Tn^3AAVoWdu%P!}noggU>2pw>EC@j{%F<3vw z2)mXKj|_zWTs9CO#Jt;piG$4t@w8(Ti~UpAzPQ`V8^T5Jl<0>0_0y}w~BOA z$|g`>Q%w2S#xhFr2c;5My%iR9x7pB<==-91+pF&S1s7RbeuTdvJU%o>$Rp~$vQ*RMxM$90 zD{c&!7PAQdqPSD$k6v{f4Emm`Z2>`FrR5Dyzt_nZtA>AZTMR;qAWIg?3_^497qgVHTa^XE5i=qET zwM!xFPBg09mQf24ZftX91DU7?32O~2Oy(}V?pLc6FOUA6dJlb)&iXgnwHr9C)gk*O zEqv&Es)bJhW+)Mr_7K^pzsc}lbf!`Y9gu-f>GcJ$_fxvcg|P|M#}kRdEF$TRIO|RR z@X3M~rL|8`n-Dfi)`IZQL3K^EkG$a~pYYnk(w4|?l-T+|Z&j#jN8A1wkGLe4T%yoG zuL*+ZvPP%O8_RR=FD(A@A*6K56A||>AZ^(KSD_^Bs(+A)C)l#cJIJ5V5Th5Tq2vi! zg~X75^bnQYHLoLqvTcM}sh7XTQ0@laL^FUVd5#A1%_ztKU>>0hokr8W$m)a~e~f?& zEwnS9QW|xN^iCfMG0ZY&Jsqae&uHY)07+B5;yRdx2*J5?mjqUHC8DvnN;U`M+})5K zuEYdXx-;n5gE#*nE%Ru+`Jq-*-s9}Xu-X5vv4x_BG>=Tq)|#6h7|PV!auqG#VKXH> zlJ!lsA;iwZ&XlgKPN?RRZs$AQa(u{e#&*Y|o91P>zt;q!a%SB%gM1+6i44N((q5h- zJVt7p9%@+|`elJ>x8J}0U(I0t$!hq?z6T|2zJL`+79B3zfFV*}(=kMW_zQvSC9NhY z7Qp`6+Kc8a2B^33u4q~3zupM}#L&Do#KZh8k5;wn11)=FG`M(LXkcePObqOup2Md^*aYvQ`calV(k7PV^3}_+lDlH-9JE1 z+`#8~|6W77AYY!ifFda%4Fl0X55IFJnK+_%d#Hnbn#mTFAl}cX@HXY|GSoQcc`u4u z%74SsxfP)K8+zlMty%)^TG1R)0GsU19<)({^Alg)yPnFDS|HmnMFa4+>`V;!5#VXg z%V+0XFUwQE3hzhcRVDlb`e|v;H$P0QY&Hh(0}E*Rd~)SK$MoOn!mU6p4(18kC)~(> z-;3@tDFmI>NrHQpzz>mOAVQ1tPwOD8QE=d||GR>EpCI$m#Qf}t!_GsG>|YC8Z3|(8 z?BFzP3;I@><>Uez!OKHiz=(h~=CT&b2W2*+;fcc^zjYNEd2}aAm@0>jj!H}P0Rowa z^NO%NQ#zzsO^%dM&2NvL^+AT4;1KY>u>wU=t_n0J7DH!m+JX4s(*~>&%sud|_|VYh z9m!N)V$Jmif)msI(u>NA${Z|NIZ04fSs5FS2yTo(WttfOKNb5qxV^Zc1$RO$gtQEm zFYm-q+D2PL{%f1Wy!a=;$O%`lFM5dTDRbBlBdF$c$kZ8^f2?Ad`UM-SYZ*Es(T_R#=>G0Z?TeXom~?VgawDsyER>iJkO(FJL{TfvViW>wlLZ zhi5!nqGyZOaujSU2g362*9jU8^S873>$AC%O%&+?8my|X8>L8@`K!sn%XQHanf-Cc~?=*gViIt()Gg`45X6lG7u~2;fY|6ZAAy@Zu7IbzA z*y;X7utjh=Kc{#kE`d``yPwN)H@%jK7n!3=sqajUPed`l_V)XIQf2v96*=YOZ#)OlK(GOLy1T5)=yevKIdu zoXEJ|k*yzYd%=0Lo(Skb-fRxI`1Yt-!6Pp^rcksKA&8!&`^fekjfJ}Ye-uG7?a7qb zLqv_1fyj`C0|Sc?d~_h$xkjAbwMbJa-0X7G^x=!l4S#v1YTfEaH)jGwH`5uX)&tBy z%hgjE&ttPjS#pw09IRkO*f4V|_%;0j6TGsI^VhEKsC2M&wO`d&2`#!Kq&Ap@y~8QN zu`oo?W_UgWSH}Z??qqf^!T62F*(2-?5bUXsK3$pBIH-8#G%&|nqXQ-e!sJz7iM?~= zZI{7yVtgM&Liv$v?OTN$_s+ZcJmL^`Kq~AmmXww*nW1&k7kYVetwFN_(7-&`Ny0x3Kg20c2~eggka*H{I+7X1qGsZ zSFdvt7FfD^t6$Mql`lz#MDT54rcWQ^JhMCBikQ(RltNxZ9Kv2zi^aM}JWD-bYC739 z5@&eBGM zh+#qVWp$C_h}VB-oj8AMQtpqVd@ABmoWBBMfa(gCg(6=7jtaypRSS%&RY2_-leDA@ zqjy3{hZWTMY8x;^Y1;8!WhxR_Dz>x-Drsus9Q5I$zzgU8jXOaIuAim}5SOV)zpAo9 z7txQE7tVjD#NzOM3dX>RFd0e2AoS0f<*6LFRmu66Lpwm2;HJxl4YncWb{Dd4hY9ZW z2L5;YDDt-k5z1z@zW?pbrFtO^JJj1?)!=!}&2P>XTJX6cr|NYyjN@0UueU*=-%Q)5 z(+7~x4Q@3oI;wZ`Gj%|>@o5Cae!6|vOM>rQh6Rk5CetjxTsbfv{`<}Iq$U$ z5>Oj+2Nwjq8P`A41(2)c|Fb%lAybylkZVwL_VfkweGf*6J1JnTPEkx*ix0>k#H@R; zJ&KNN^;{9`B5%`5c5YSuiHZ^N$&VZ5Vidk}woQKOF%uxd6Mm5bTfq-k`M}qDZlUl( zq)31jpTdV*h{kz-&q%~7NUvy;M_PE|YE_e77Ca)rjo1XEw2au~%D6i{_JS;Xls^Yh zj%gIHF|Bo3Y<%R;|2qUVN5}ir-C7igf`i0NJJ07NYObE8wmgP(V>7U70AZ`$J_#A~ zmQuYmE+I>(i4J0@!^F4q#p8@$8{B`rX)INsZD9#D;#%Dc7$s+sQa})2#m90Yh)h=; zcIn{c_%I?An*w-Xb32POEGR4Sh?u9j!@ZB#&>43Zd0d%Y6?EI9RXZv@;c&U;@G>fT01D(~Bj9q&lCkP&SS#;6= zS3FmDCh+IJt$=ND`@S37>_;8GD`jF(^-L2*Vr@l=Q{Prn zne)Br(A&J1`TN@tw1ox&0=wG-J4Wz3tAQh>E2)4RDw`oJJ6Iv3 zXvM;6wBc*G^SnZDS||?{gdBn$w~+D$uj}oD(m?AVZ~S|>)>W++wk_dmp{br+r{4ydIG>`0_Yb`)b zy#9>}EB;kbwZ>GR*?^*ZT1bP`{IZ0kQGaIsPefKOLqo|^BaUX(IdyK029G~srsXjL z&9uLbN}HaK71Y8yZjW7Pp5?u{vi_03COa@dr4@pCu8WtDUQrJXSxkGhmC#x&iXI@G27 zFm0{!fJXZe3|e8zHoxi>`6fP6G86Gy((e-w(x0N|3Es%vorW>~Ns#a$OE%}doxGNx zOU0=}M6>0FA&TN!!C!ZI-iMG;x_Ib)gatb;dWXJyYE4o7nGy@g!#GSH)t(^F5MTy^ zC`itzn%TU+DJ=Mb`aYN(+4Ub=vhyYy%w`vMf8(>&l_({yHdS|dJP2$c%!WX}EB7DY z_O+8j3^FO+Hy6Q_w^eKTwQEA6965>FpPhdMl$ETc1HPjq_-eFGKh$3HTy8)H24Os& zV7v}qZ`0J-?v`?X?!4P7E zF7=qMxGlbrw6cN;&T5nu6}qXB1>3}oN;hKgG%xL~B3qv^ z7WeFn2-dM8wHo~a5-9df6t8Bx5{=gp!oP-e2{e1y8SfrQS90{x4;kWjaR+>UE*K@e z2oG!Z1vmfZ6yH3Y0<6clU*5GSIKzc5<&L1n>qZ9h;~>68J_`I>;MI?Girhx!KrvpL zt;X$x|3cL-21-8JBIiV5`eY>kg1Ai*&?3g=EmmJyb@qw{8?H`&wn=OTKz^ehnpjTP zatleP2uM-yh>`5(UH ztk?vwOn=^-B7viN`f`I85-6GUF)~(=kwuuoAIy}@`ElL+)a*f(AeUvlh1Rx>25uoc z(ZjZ`IAUl4b{`V&Up!gyy80ve2?^pAu&rqDIj_e?Obfk1wQ>LXHe!G&d3&{)e!I;cHuRCf6SX|wUftH zAqvb@v?CyXEZAke`7Z?drgRx4J~Ab+t9gqst%Si5<5E78lp;9^Gg@p*Epan4(0MQM zIPoRSsv^PFE{#&&DR;s@LfE`ju(jJ#zbs!jU_4HYnIA1fZQ}&*yO}=Rz+ARHAS?|)QLhmI5 zB_u#7F9v1C>UOx&R1hw!vD4=+TXVX~_|@aFdWT9UkHBK%{4};!F{^9F--_>qAx6pU zsp;FSRMV8TTL4@SC6#Qt^&`C1i{Y_{Slx|P{+M_05K99wxp01ief6Efw?u^k@_kPX zd>1IO2?02!28rrFCPyn&r5sK;jX`%|X5p`)$Lxn`ja=5e zdawFnmjUcrB$AuY_pRw>S}(be7*c<}3wt*v#1a8Y)2}@ZPnWG|ebqSq83hm-m!Ls5 zSLViW3o;`$pqZ@7B1sqcCEtn@8OAq|Uxuv6TfG^`GCrWXlBrb}JP43LbeTsqTuOF` z@25fEs~gXgnDcvub5L_RXpFs{WxW=RzLbW|rBzGMilDsZ8skC-twuB0P%i4BiNX(z z%Ey6aAy5h+Z+bj{(UB5mo1X|-S^YZIAA*!d(mNN)45YIPwz49WyutfKtNOGgl?CzJ zjmG$L7&kgu0OamaYf~OL4;#(Djv!CV(!aJk+0>_lXFk4LBv(T>bfOoErMkV1r=?+R z70+vLk34iKqhd8#WVvy&7vVi-_qqHl{VRRM&JTEwfo zWM4{lcnV%gvR-wZ#6IXr!zMWt#c<7bg8yC=KCgatzRr=F7tBoz2>=Qyt+i+^9kHaQ zP-nMxHnbhq8=xbA(gjJIewZ;br3(J<$?u5T-`dB%A7?jT5HqKex!CUjE{$8ISh~z@vg?+#xnciPNr`TX(_^~xnMhTIQS5Cp-X1S?9W&EXqC<+=V z;}|u0F9V=(L&Fzcs};l#)KM)Fl<_f)`t^q$i^U(O-9C1s;(o3yA}3*{-5Z>J_*XSh z;iQYVTAV9^@p}fxnu>52haCg@{DxMi@#3w4Nap&TFT2T;3`-9nP_|j(vPVQfxcu8^ z@971n*0o&$VL=5wR=P4YrM^>jY(>-hyE>PCK)7<)@1W}K&gfU|3fUx?@GDn#HtYX4;?R@Yu{ieEzZ$81|KskyV_hc%tQB2 z*yV56A}(#@u?hHX)thrMm?}a_1oUma_n%fd;Hsq;|M9h;sG;v0)R!+h?!K5ef|0}V zNvA6(_mTbr8GwkP*R?s%k5&m;8VJ3>1WZ%q6Y!KriOabm$CU1?zOm|>KNE+sC0TT-{u#L8I!80wB`$5Z^7g+Vrr=0JU<(FEZkJ+5 zVVd{b)YH!^Pxb~;voA_mT9&mNu&h}V{d137n^s+JWHf)2mdxEUS_!D6f1Odg($z$o zFb#Y`44#+K)Y(Jf0U<& zZ;UV;de@!T+zjVIucd|wuEDaB*WRZt#+zi(r}Wl#+#$xAPK7NW?CSnkQ3-@CR5k_K zru8pGbnqcQ!C-U6b7|Mb2T$9bE5|pUmsXeSAl2PgcB(pGKf`M2Kb+wy*)$jzP3K%& zmz4*$)lb6_LhVw_H9ZL}Qq0J%EFxqL)>TCVJd9UozLG)cfJ5JtRHYIf{Pi7%a%P7S zG5&V>QP;1~mx!u)6$*I-CaaO#6pRHjvS(FVsIM?>weY#i{`e*s5W-8FHWvf<`|y!T z+DN8}-o1+(?zl|H0f6-G8h^{ugFP+1`f2%o=t>a2**d8*aIDRvF!lfAU{%ekS-T9t zy~ojpAa~7S%{1UPjbSNT(M%|O{*Lgr*) zaU`!U1o4?0CQ`U4D(*m?M0nd1YS_NS`|@90ksxoxg-wXw=eumlJhp{x@>gc^GPN}W zMEOxI-%$aIuXU`J2T@{RmpvD{TI~V(DG?ZJgo=ErniAAzZ4}Dd(K4J(_;TO_PZc?K z&MlhbqpkM-o(BMz&S^cV!GG+6b5CcPyv7D2e_V+MM&A5c2dB8p%OJ?X>k!tOhsYg# zNaS`PQ4OQ%tFSt`&5-g0zyP)LZMC|oO147A0~9vn-O;jOZ_iq6n`CE8`s-CG7j*Jj zn^M9HSq(}cD)E_$kWFEufd6d^aER2M+|dF9UcfPk>%1;6upiiVMFq+!u1RJT3k+uV zD`BS-y_Yz=GCw4Ic|!@&w!@ATd)#fYJ-y1^fjz!T3UOB?v2Ho)_sszZNqeXpe=E^8 zx`%tKV@;iuf$KcNggK%sh6;-yN>~mR)^HNoszHrXhK9Fc3f`*znY&|;u5*)IxM-2b zm2+(ZKtao30Yw8*D7dAMg`3W1wtH}C<{~_jV~HsFgdT&m$p$W{I765=mXCWl(!|m| z_2WrrFQM2(5fZ;94QOHvybF2=JvaIs9>XE-yvz@u<|ft1{OLwy$CoYUHhmf-Nt;C8s#l-DAd@$@Ge5nGui+9h z;TN7UuWI_^eBT43vA3@@duCPp&_+B@ORvSqn3`QvrD%|G5QmG1op^|>Eb{Z)Ii8w< z%xLtI_+}i$2i&a0S2Ni5HN3%06ZR0=7oP6iPw1G+i==s%9BlKOb-8 zwKEfpdcp74G;(+QdjUs1xUV+XL(tMt&(wO>H_GXAosXBwOfpDwtGlREigXKG`4}hQ z-Vo~tF4rU?%Zb6-_y4S0IyC)L6Gsf5nD&R?uRzYrRahSH8)U&n4Zjsnrq9DTz5@jF zMt*HGDL)b)={!4mT~?xKXD%bruGB{ZDSf@C<}mR>)`8Ws!jV*;k(<*h4i0GkkPhf_ zvUA|;v2ryzMwgq#DrFWS`h zM-&G<%olXISeh?1$P_x|>Sb6#+++u4<9YtHP_5RBjrt%Lo}Zn|_{OIk{^O8{3*b_jBy1bV((R*CN&R`4;RU#QpoOVTF7zKo0qLvob5S2P=U54qrP*^#W`# z3dqP_-)AEL3Firt%?XG1%Ua+VMvZ1QFoQ6pS8HFqFx%D|3Nrq#Qzzj(wRYd-DQv!_ ziUX76w@8geT$De3EiO}2(RPa)w#D?P1UP>&LcV1zV{3rU&HMu5$7jU<(NEH)b=$>EYJZ@V^%mCf zxLY?`z}=awvsB{RGhRvkE*bS5aA^rQYs&te%-55Xug~1kP1aZo5{|-@r0Wg4FV~FQ z$=MSo7V9FD`6MW;$F^ZCJ}2qi0gDfaWXwlu^ZKM%i{6b&Ll6T0ZiEz+OOx@xtM?7g zqtu;zi}vxKpw~?MwEZWywdwhBblI0GBlo%=UjSbm_YH!|nye!RfHrVUfs5m4sKd{` zXAKvlFgfB0t|y)vzsRx%-2~Wzv<9InGrhttD&hT}`y)~IK$C9<%BgeF^S?f|37YPw z+jVcMbbg;FXgM=B#y&(pg*WN1B(Afd8hw_xmwXNpEhUqqg32Lmg=?+N@w7Bc&a87e zq>0Xi?=%!nCuN)h;WbUafdGR@1<1gw6^Sc8kJSVB1ZkzK;DbXU6svKZ$%8AE5K7%~ zJY#?2oKi$^*$ujc%JgY;2eS6ClGBhJDXCDRal5KK>}1}S8u9IvqWGKBGe`EFe58xb zKcoCPv`>=dZhs$8Q9sIz8EN~8*3)LVenvX{a_Ps*EAK##Ol?9JXzETLu*aPS$BgnR zeX-)y7P<56e7!vUVZ(o)xDusoo{kE2luvNe+a2XW?iK1)FiN2>!yna6YvSvy?$@mRpSa~7G!_5jV*uc zpxbztF)`T={nNuD4`(?`ifFKAKDi7sKXeRZM)AJI1g?WJZ&Ot+jYbiVM100Y=x1kp zqyDVj{o2{7%VnC(f&_mHI>f_r65MT8c|@*b%RDq|C&9ZQsE2_N*FvQ^_LKj+Qpw%A zqo!-ZK;1`O?TskpWjBk>)NgCF60)5TKt>7K__YdMX}eL(`k{UrQhxq7zJ#D%_Qz=7 zpnGqrFf4%Jz0k`HhmUSNWh>TaaqN%uRu)@0L#lPuqULv`_4Xt^Rhv6*oaD~x`F5xO z-sk(lJAzDG4ZOhWm$a6_2x%$@OD255fGNx! zvJww4ziQtJctdy-5e5lh2X8)?(QUZMKy_NmK1H_&0uZGI5nQoa4w~$lvK|cj8$usI zOg)CfeLfYH37?V^=Xj9%`;9L`oia5X4`0t{@&sWUC*={v z6#=g3ebm=W*^-VLVvGetP8X!;Jss}R~t=(pe~-*rC;Fy(hhjZ*zJF#78EJj;q9IRVl9-|1Serz_RKsvZ%n zH&uus?pIPj4AG1T({Fq8w`L*?>F=`i6_3$PcHJf8}Qxi0&v?<(>J*|_4VZz3Bc%y3;D~frnE4&I(vWn(8t?K z&~eY;3XRE?oPswH0@JN4Ax5y4Qc)pOz5q%p#FU6@<6m`#{zET2SJqnpDrPfhjn!!{ z!C%k7%uC8YvfTk2GJOhd(}LAnFaTe(WCEcfHUi@%4d8_^x*OMCtTZjAO>=B;u%fP( zVs&1tRUV0)E;U>Kt6#Yql&oOa-!jpKqmoRwn3xfjREZIYZ04FvSN+1WQ5uL%P5bH1 zXE#q3FNg;fYD4HU)U!=?dx!FahtCqDqT$CN-#nJM4+w!G;aJ3*Tl?L90cH7rum8NY z{@_MUi%3>C=o$+y!e+9iX?Z{$%QCI6c&~VfFec>F%>T}fJhpV0KK$?aC)w;UL2J~A z)9NMrSrdt?KX>HMVk4(VQ?I`=YOhum5_@D8(IW1w zEDXX-qUa8atJV;NftDuo%$J-(VKGGm{Z+Bn&Pmarry{n;3jLG0kvd^0${n%0SD->_ zedK-PU%49{>L|_p=`N7ff_J`P-$i`;P7_TlPy~|E`)kC}P`b#G3WL_FZ~}X!b&XXf zHigd5=P-ozKhtW}ILl8HDLnEZko)WM^jQN5!L4_Pqj4?IN9-Yx6dE}S?$J42X&kvZ z+|#h!e~F}D=}>#hXB`l1=LVrK%eM*_|9UgydL4gb{4ICkq>oiEZTr8+3hS*HW1j{w za#uZglcOhacGcnui&+0L-HhES?o0hAcZXv8&|VOan1r}kkN{v@&OdT0%dvI*nu9As z>IlFDnb4CKF}n*!O&*y_oWMW&CKFHXZf7$j={t{n( z#go+1WQ|dXgm7!8;YW z$4bV3?*eOet!6cXAD!GBWt`FTI!*0Q^~&Z?-Rj<+{Kp=_fAr6yK@lMDk}7-R?yYhSu1HnWl4Rvq(DMXO zb(tw8Jm0xT_Xs;t|MH&)JhC=iIQKjbC#5QqG{0gzjjTSLhYnKoL7T<0D$a*DKAo!S zUaSozj(HjOHH%wz+5A~}Tt0ZG@ni`F9h{kyRJpfOnQSWVS*nFdPJKg=X~%Yz|8r%hDj31Tk3G$Jz`yd}rp+r@y~2W38Fej*#*6&}_&$tu4t6ftuUQya<)Ae$W(a(pT8nSFbA)SD5JF$yfEZJ^dZ} zPbl9A7hZ%%m|v!>wsUk6ebk*Q4y##PxQ1TNUbK?buCdJqE9N9^dA5-y*vf?&pLPo5 zS|#azsT@8^c!cLRn1wD;9-^=lJkGfg!l`&$a^lgpSwR?5zQI^X@^kL?Zi`iu!`q#y2HBb(y@zFE~^^=ku z;6spEGQ#%eudwzT?|&gE0j)_}#WPqc1M=OY-EYWgOnIaek=<0cYXB;n#+?@63PYVY zklubS`vT$tW$_q~+Kse(InAMkwcO{TNi({iy>~uQaYEhzu(^-xSlpp0{r*V3f0WMm zPcy1clDplNEss~V_qj=s22_6{8!rhnG9fd1W3+y)W8GAE%&W84djGR1{paH}ahkHV zliYj}Chf>%1Xoq&m)eEFw(lonI}2E$?-%Jwy5Tj|EoifoUkhsgKEgMQi}W-yl)GXY z??XH=wC;YO>?I?>SpP}%X4-=$DBIEW(`=kkFWnVUZk16ZjS)NDOMqkjGs*kn@or<` zyKE2KA#rG@q^}5m106>%v&tL;gm(zKX8yk41gO7yF)pzKatC4dJneP0@|=VHk7nMn z{wy}cnT}2*XMbU*TbmEnXy$>Z%TUSf&)KK{1kPl(ow45(fUf*v9Ypgl%Foj26tu=2 z1{lqldv2?2_Xd-3$pB~t&4cQvmHOY)x{im3sCwI9Vgq-J%2)GAs z%s=}1zzdkvY#YQ^zVf%{EgWwbUr__T>)Om(fOIXk8|DvOTxXjUWT*OcvlKWG5VL{a&+j&HlDj^6&8M*A&bZ$cg6A$8WQ)C2c_j9*(#~w`2Tqs=e;PgDU;G6uy*1>W4ELAtBQt`&W z*Mu6j0l0R>-=RyNuOU8=@&dA#cY;nQ+5Q4;#{++XXZV>I-+u&o>>NFOAXf^qM7#=N zCaZ1iJ{K+6yohLt)5Zi*Pkxh?OgiPGbRcJ-PcrM8lX@_UUek)2w*K@vw6m*#MN-XU z_ovGWriyt;pWAs)&7)vsvuS1N!CLvilw(ad5BP0|8H(l{{NPhPI{kk6IqQcl&JfkyR6*vlPk_chX3JPpiP{ z=Sdkd{CT~R2wx0;J2RhHjr(<5yt@ntgg|_3g)#7^I6aPu!*l#KTuZOc0fkAZk)(a4i1Y~H6qIp8v->{_x z9bZKJ*B^xIme-NP_hRyOrw}8CE4J@lkENC8=%7LrbT(HX~ zOjOQTZria~xW9XjWGlZjY)Y^^B6B54+|@07f->u~=d^IQ%v1n13Y{mY z!o_p7EF^E*9rj1*wHKdTng3IGQcJ?=$glg0 z<~EY@#z+yY)~WBNKNnY{+Q7~Md1W9W;8a-$_us3iCsQ>yCda*s{X-Bj6dPg$=uu`d zd0doboL-X-hk1I(i*pNIW_Jk~C`v}SX2TVn{FwnCp!$udfQxMMF{#6n<;kDm<)D+E zcM#Lej3)kiZIiv?rn(SfRS9oKW)sN@B&a97_%+J*EY5RqXznat9(NkU(FlMW@<6}P zdFV3%;3CwxIZ?G_=WG6S{e0A`X-wgYQ}~JANw@^h(Ede$Ol}_f`j8pXOtMeDps-h* zIg!DG0;h!9)z-X%)CtJS@WG{aslz$OV9BD{l#v{^hS3Y3Kb`V4k=agq?2Z|HA3`UK z*brncT&dN|Qk8lo8zw;u$X~fjDkeqpBlbM;=RN(K=X$T?>Y?!Wi(6d-WJtEX9ACU# z$Bq16kIlbP#GHiQZtc~KZFBbxrFohx{D|JUJY;w5L{X=8SMIwP6crkkg9K0iT2Mp5G$NRgSNhE1HM42K@2K2}$$EvIdF}?*< zZ`mi>vtI3NtbLLBEx}MiZ83BVB?-yM2$>jpADZ>W)gY6_`QfWwIs8z>%ccSb{4;z! z<%dmf@HTL&S>#Ym4}4dbI27IEMNF^Gw9F6WI)-Ssud{pabKd~$F{k8kCPdZYrLJ5? z#QWs7ZmaTEgacE=ABZE`V(&FMsp_e-smMh)>z;}`f5j#dNzeI9uf7%i?PADrOxQA^ z{us}W8L{2f6TH~*pQt1>7omo@ugd4<^&QjN-^_K%hmiRp@v3G9$*5>WznL}ep-fHe z9qy8YRNNE2g>=M!M2V%cN>M9)Q2+7K$6gLhf4(9xdG_DKfD`ZUNh5q#q&1qxQ&0`> z-?!ss=LX$T!I+R2i}yqyZu>03S!p91sq1(>m1 ztN;BnHGp6bO@Fk#t-k>u9l%YefiOnIO6N(Dwnj1s{TL1_1R+qYn>{8|vDe*r4YrF9}>H^(uM+red}siB}DF9y|M!}Z)Xmj=KOIltbE)z4QZ>!Y3pWvi9+vI!AsVc2NL`4pXv8DiS356c zenmSm+3z}JnUF8{Fu9TEob>B^M8!T@aM;W+NmNN8lQg$`+PX{|`t>BAq*$4(xXBmR zKT+VWzT$e9*!J?2E9V^U!^r0ow%s8u0(kdfSqDK!X<9BzlmQsX*FLE_5+Tp-5d`w6 zcj4ik(z;*71RnZ$=ZN5Y{RMQ*PT~pt1Zy#{=Yqs3m_=7V)$Fb-2MG0bO`G#&2N?8)-xR`LjqmVrrmNYfrF4@=K&iXBtHe{b=s_Tb6*IH7y%DLfM5AJnbAEuiXZf za7!CIS4M^+HEme&5NPd67ixM5N^5B!h)M4rN_h2ku`HU;sPlJ#<#5O3)r>wGa~eAIF`SC@q~S2XldQroC^{7y^-Hm2 zmp24ECNpuMADUVg*4Wd#5C7Oe&fNOZN)9p!1e}Jsa8Z9R`UCCckBG{X&Yd~%8D;_Yk+zaGVwv?n6Yz>QEwgc%6Hl1f=DrzQAaq?>1k%2cTHic z3qm{I%vnB03jX~N^sCNF0!mN3XZPtPVdXqX^rXk037&}H#0BCX{IzxAfv!sDjpVbT zPWqagr+%DdY!nBVzp?{|UPe4`cIdBf`&1T)3+2&F#%n8Z>-_}h z!$$MAhAEO59@_LF5`H<}Rg$`^3mH0Cr>XL8D+r`_il3a$K*z@ajuXK3yzwG9xm{y0 zXJP3Y!FA;p3yF^AwEa(O!#`B=ReWM==$kS0(Pg15 zxg55g&vvh@HBM68`p9tDM6GIO38N&`2;0P+C8D|*6 zx-gI?X^5^=6Xi#y%Wx8{*9Tn}QZrSojGn^Q9OG*UD8Fv9?SoG|<5*a~^*X=F*S^BZ zTy0%QEKOp@3#=@C&DQSMR6G0FHkk(*8qQ$(@x^$FxBH(1>1nNarAFv<4PyX1Ka+k& z=P%7iw_(?>PX%NfL(z!1GpjRp4!`DXj8ab!f0LF?m|rt#i&ngeMp|yrS9y^ywL+Kk zDJ(Q2uezeTBa{B2e?iAkDJ@SRsM&$oLiivJwp{jYeV>@naW?25-osr_Y&5im9f2 zeU3tzkuCzGl2jAJ$0>vZC>fiBFmvH2uIAnG%HgX~KOsvmNzqPYV$hXTw>=UwTc&Y&qO&XETk3%1$O^T{4C|8m(vV5W|b0+T{doHG-Fflm+ zo8_{;Or=U$;jhPO;djLxaJ0`j8%QAYKf?GE*z?popZVswjL&fpr#JIDM0Gxrf?tSF z?`UBojonWX0#~t)?#U)tOX#cqqi}{cQkG$+TBiAeq=sVI>80fR1P6wyW>48{Uwk(v z!RPf6hWUi+!sohEQBds&(1G#2F4n_>2(-ZT8lDO^7F=@njeLDo5HprDqhz`cExHRy zB5dZa>Ck~T3zv;}5rLM1abNb?arj1MMI^o&GGQ$9}{Lg|Ex8VCSyfJP^&OWhm?}@s*+$X0fxY zo4jw_Xzv!(FVrT(fInWkZC$@7t$|qR-l&nuWak8MC@kExTh(#;Mnd*0>`3uwE64`B zC@hB6PLEpN5xD-^6Pn&AzA*N`+d4Orf7eMrC-=$QUce(_H4ipqR*oyMW|dV?_2%SU zJy=tg184k=u>Un6q^X&Cixom5247@p4a^ zP{F(uiT*7Y!fjo4W&80+Rv(MN+@0RKKDKMO9FprUXy z_Qh50=quVN$0NZB^IiPm`|n$N`aH1=zg`NE19LdKyTF9% z-f7{Al-w*3SHO6=C~yi`LrJpHa^!_K$yG9PX%lgc{DL<%y_7 z0mg6Or=VyMoOsFm)n!KpSD9p@rNt!t)8Tp1*fL8WV(w#-hkQpy9G%UoytkWWsuV21 z(aXV&2LCjFuh!N#!~yEDZ$h-1$>hj3AJhB?rQLGzX$_fcdjngqPmy&$G&lYWEn@;P z6G|iQ3>bk1vj6bCDGg>0<+YWv`}AqQ<#c_RW5=rXAwF_jXQi`_5pP5ZA2M!6XslQsok-*@Xcs8V>Ly>gdd6qvCM2&^pKqpGhu8h42V;?QB6lT{16@oEqL)sm=h}3$5s3eVqs8O z){EhCh0gAr6BA-J`?34-rQ%BXSnl-nyNW(DHy?Tgm1YViDaqiGBCX2#*DDe(S-xSz zt+Z?Yr$&pn!|?)Lgb7xwd&)U+87hB<5;=@cDqG%6QJR8hJc*U9#?GHcw*zN}o`C36 zx3Y!_poJ&vvnl<{PXY~^Jtibn>VMc_TIUvjA|($drfYW&?N>M>BTU>>P=4aX+s>4_ zA4XxssCcxQG0Gy22Z1K){A#sn+kV{)u1t!sZV6EE$Qkv2)-EsdlV)qsEYy#DwExJ~ zZDP|me@vr=CJowfWWuvvgt)sBV`4F4Bt#i>zr6B*K;C`o2 zF+m4b{Y3vA_tr(0hv!8y;!P3vBcVm(W$rMug9K z%zCi>)V&l#Nc)d+f2%CAp$=NJd+{1p#m1}H307D|-6WMxw8UI4J82xye8x^^%_ zQ%dK{q7o{oqJArtP|J#^Q)gpA0ndH_Drqi6t6-IFFZ+V43Exic$(0qHQhu~5mbPxw zOeyXrecb@{JSlC&{8u~DNRLu0kOMK21Wq_WNn+SNNq7{gfFd_J^q0Ib4YR}cF74Bu zDW3!%LyOlo2gY?O#yN=Wsx(cH*SUI0n2|e2d$-v@6+>mO6+XBZpnv+!spf6Rv(Pk3 zHoTk=7@$W*a~`V z6*={D#^87J8b2%j;1IX5t8^}hu}8NW0Fhs4{XB7(rtiF72652Ex3>EpZc@I zi&&6X-aWvWqQUWqu~N4CQfUJhNxu8Ft#&0NIb)>maK%zpLbf z%+-q-X&K3q`1AiwFK!106@xS1d0~7L_<#GO(He2h=PAC_DR4~iXAmMf^>Fp=&Euz6 zr|VzY^C!Baw3r__^n=>C?*Yx5R^=vnMm-&v55%iDjigvg$_nY2iluV8;HxK2`@hug z(=IQ=X$SIFn+#`JJi+aKdx735Kj|sC&r_d&&_iIU;4&G#S697xR;^)r?xAsl!lpmX zf1vU;#+6CORTQN&K)CF2KP>kjnlbY;+G&Mk7!+4<;H`!$qZmP~j8MlM0XzmbpJ}A0 z-;@%5KYHNyhJupBhwW=urCL>stjZI*)`BA2W;f$^BI?n)Ntgpob!E$my;kLi0v%QW~CZO$*-a(#BTZ5J{*5!#E?M_I+P zK8~kxGEz~G%EWUNaW$x~Q44w^Q8&JCA-}xpO>qCE>6xub(L@xhMrC{_oFAoP$2acP{SSpNwyETx{NPG2rLZd( z{5IHdRHs)Rpn?oK^tT0W5_xUgY+sA%?2#wPQkjarrks=k}qw zJjQN3gIOkZV&dO6#+kN?tqV+q*2buPygPx$@uI?*ATy4~FVlWsAK*-y#1{#61HR+d49{+7@Z*a@{PVnSb}^&d**cJL7aqx125GNciOSI3aw^ zhGS?qhFt(!z>Euy_!#lZP(gmTAH7JuRS5sKrJgJQ{|!j?RW>4*X|3t>VHfaDLRV^CEI;0XMiJq_+*EzzS0VYi%H zna~HnwHnxC%jII^u`tt;;sIl}u8h5{>71j9;JFeXRs< zMNY@oEc^+n&A4Eotr%9d;NM41Rm3v}+!7Kniv|6G-)b4W0@)}7kJ|oS??g7R<8LuO zHY{+g>HX<{RiismKez>PSM>w>eue_S_s6va4FBNMzd!ZFKFqBcTI5G<@hH9jV*bc3 zgoAV|hmHU~p=T&3?2@};vh-l19j4I6Ohn58u+t>5v8n7AP3`7TPr_TUCxBHV^I$@i~gD6Cu)K{VgZTv#T8P zeyl=E>^0$jyOl-I5Qo3hGQ|sME zkfyCfqP{s!&|JrM;sAH4B`gSv!%Z~GEPN0u5w0iGzD)CSQkwvjyMSrvnqe(nCPz5q zu+O0x=?Ywua89lH5pVqbpWV#8!rPrZw6mxd4o(%DHacefY0F~=RZI+FffbsWFjBA^ z+oZGkjUXCfuDq*mW^EH6Z6Wbrhk>iAc@Eh`ok#kCACY_&LjxCHkj7NNCP4oQog;;2wu{$@-8q!n+Z3&N@!wp@0N^Nm6Re#K7e4 zCN_s8k;gRfPL`W&Pvrk}cCu-HA1k(QiVkFfnUP{JMTE9OucJ9K4Pi>5O*VJC&C@=5Z~nZrigc3DaAYp^`lGBS)^dw^#Xs# zly~8+zHi}V4k&kirXMzW9;82FgxDkLMt2W}GIu5sYQ5uhat(u<=)bv0N-Qr<+`}(!vRx5F%AhY4eKV zESVJEE&tFUwK(CcL_zaCsc8&bCb7BfMmgr?kch+L1JrrtBn*#mib)o}5Inly+aa6x zl#>ZoM8>wBMN9z=9ZmK$4UNnww-ihVl&24^1hhyII|{}L*0|>1ju1Pmu+21XHm&?0 zX2N$w@}~RY(a#fX;_Et#-t}9D%Qibr>-#-M%%)}BnH6c49N52Sz~ju0kNQByKvZT? z>e8QHWafyiVKnwpq=kPX3$_YTBljTTH6CsXyLgk3iR_1E7D}l4W@9Fm`af6k>av{K z>8AQP!7+mGA&Z;OqXi}wm-o#Mkfd3D$4Vd#?W4M6WW1yeojE(*=fq3U@BMkjg)lU< zGP;Xz&RMJjF(6XVY9}Xel&~JCq4Wl(W+m7kcsYnLDfl0Eqsfm14{v$Zj3%N7KVO;~ zJh5>t>cgANIh_-x1`gazSIKSXpE9ThzQ^@bN-Ed&(1*tlV+g^6k*T0OVRx7$t`iwb zG;u=gAmi9prM3I-5u;L*F?t!TIIV9(^!|S9aWyN)Amm5I*SVCdEahNEnv{yC& zY05>4_zb05aIqk!Z1xUHWL1h_|OKVxbfCB&4vH zg3ViA5W6LIo1$rVj|q(DlGX=_i5KvE<(az+ zR)^vS{2&<{Ls0ag-bxkgy1@}<7*D-Myx9<62AD7oJ?p>0$x`y=dD+=7DIuCA3+a4+ z?y)08QY!vf1v^G5Kk}REsn5w75hL|Fjr6y!pavpClB7y%-UaaAS>Xe-;48Cx*}zJJ zznayBgIM#;eC}E(e1rrf2BeQizm2ar{dsIH#ufy|y+v3^l$c}Z4sgI|@l%Y^lE>zG z#QioI=kkS<&jjyjZ`ysP?j8TlPN&!>jU3Vr4z#BTEf&xN(UoG>TXfC z#d9&mzR2E&{K&(IaU&4thx^TI&_7S zZBLi+Y&xOA*g@=Z0`GVW%yK$a=eOBC=zDI2@`=rf4NBFXsb+n9mK+m$cnIty&^C*o zI2V1#j*Un9>yR8XrwR#W=y`c;GJt}qYtiHKTW&+d9#R7^U zXjojqZ*0a9>d4rJ871IZ4!wzWX#m|378sEevR7OQLCJZ4OGd4{ie2qe6w_I7pWn@e zdoV?&ooNeNFcWQobQ>&SGDG%+RzC!gU((zs=<~jPnJ)dCes7#z9Ns~$2z~picHxz2-Awpgr}u&rt_5FVIz;!xiF~ zh8rk28q;NL)A_@@m03+c4S{VPk)=wF9 z4A06_6z%#J%!@9G?R{wX!&9^8Od#S6feuhTV${fyFrY(u*8d&zz4&sJMvl6esEkU8 zL2Bhoop_Z(^|ogL4r1R~>@K{YG=C$&|9-uTmH^>`je-hf=8P<2?zHeHx$9bn9rsZI zFO`#wA@k9g9VXI44SAO8#ho~i4)O`|Y*z$7^xa?b-vDK`Evw+gopOce@Ugg>fP;8J za;kRLn$OvBB&hqk8sX9%$wJTi?&ilghPG@HrJ$f)z7Ops!Zmv}`bty!I;v z|J^uvG4x-%VzgmWw)qC%hCo0k~s2t+IDvMtXv`S%1uL+fu}lJ zPulfqYqJT@w#E6wk{++MY%5OPw7Uez4Xu>hJD z*iN(!xnt)6+J^_apB?%Ba$!EyuIo}*={A=6n#_Fc|kI!;k=5T$*VY9sTr~t&wuvr+Y{|dSk=pE884zoy0JAf`LQ6qUvePm ztUs9?YKduP7~om}@EB2wzfj5>=DKGm#%RX0%?Q@jQ}ML@sRGF)x~W? zSimKPM7HwcOeZ#+7N`7=9Lfw_|M9kn&PqiT&44E;AO2=+MnbSD!9=05|7LqHSYGk1 z!YyzEdCgM3e(6V(lLwV?-{N}s#$nS)>y3YS)WiFPsz`c@M&r1t4V9jjM%-xK82<;$aHr57^7#<;&@oUwBh^fkH75q_`fiEOaGOWuDZjl7 zyjwXdW%A=H7iT8r!zbB%xC%OJc3^>Np_kI#utT9|eu;dUY89`4ZX3$s`sY6RfX=(QcF`%mRcuWYyd3k31@=6(D z$n>c(jLz$%f*UJ#P9(}o^rRw<38GdjSWOlMv3UMB91ts6GIE{t3}O?N11WAF&{J88 z5d5IKY4YXID@|M4!o>bNJ1E@>gO)BV)$qJj^IaxfkiDha*TrAw3w{e9MCXj0SyyZ2 zMk;jdXel!w0!A-Zw`PV-__|$dsSW+wnsD#bhJSzb$T)uBDhHsVyg%1k416Yh9E>0b zIZ?MO2$xE?ubh}JGLuBbAUq1Y?HF^0{K-C(%94pd_yS`?WTFT*l6{cvZ!Ay4sH?C4 zX#7R(_m`ku%awjlIm31S-glR(6Oaigh;WYR?WsszRlUc+5n53JUVwl62LF?z!_7w~ z7lm#Z1sN<2P=c0z=544u{nY7dYM7W*+ff_5Y$dl|7^-a~a375CXF7>(yjclprT^@q~QhQyKc%UW)zRs0M*7V!j090iqEbkXMsoUqfrnk+&%ib_oA~B z8@4|k?>%~XXV)b5lJBS0`U;!E2JBsmxG z?=2hM_COl_d8vFNL#@y_qT!r!wO8!Qu%e;aKNnmRFzUTq+VgU*h{~6n7x)Tv^e^0Vzeag9@O)2M-Lnqj|rd z?)Vr~ZOGd|J0;^F4?|i7yDJfDNV&o*|6$lwc{VAB{Wf16e@L1W{GYAfR zao9~r?W|Lt3cRb9=pJ4SEMhdS(H6cd$Tv7cU|I^sYzkAf3HluzfRqsyb`FTdDUX~H zE9_hB*yd*qh(J_{^gKCPEK%Ad$`mV>xAdu{r=#*8m@*9;LBVZc(Vq3h7k0f}mo zX@2#Qu(qCV6&Ze2f7c}_swMnV>G`qCu}oQ+?v%QOx8oj+vtJ8;b$uwWCytmRz%01pZH4MX7Y&|rD+eN=6)(m5oY)%ZdkpgbQxz0XfOy+m zVpjf>SKam5gIO2kzamBbjaDzri>IV~<^qf}0uMU5f=Qi(PD48}=xC3S;|iVva)H+G zeyhv>d-beHQ)2cHTm0Nkv}iVW4kL+|?!eXP4Z;kz??ZSsRJM0w+Hhfj0nP2s(2l)> ze>S045iD*KqRdjB@xtXQq5I$V1fyB*8`cWqo7*-EF0cb+HCR%?6BcoP3}s$!{p^=` z8&8%Brm6u_fz#xM&dO^jV@Kkvh1B_CXtvtOYQxRstEg{z&184F+&m)7N5nOtZ;uZg zO^G67_(dfk0-E;JI>WX?dk72hwgRxCBdCL*Io?su)&Y3XaXaXeU6?efd&|>8i?$KZ~@OkNacz1< zi7vF?-s1S#B4e``kM^hpjK!Ht?LK#Xh5y6?0+R-(`VjF&_bc|)1SMCuIx<=0?_M({ zqMY!nm2ODQ9XddnT<0Cm(HWda|2qts2zAZ*N5i1L`sXexRXcdh*E!c;@-X{xGrB6# zSV&1Xqjo?E==XDZ*9Qb1J##A!ta&2G4(xn{7&)^6G^ujsjzW$O4*t{x;z!UH5qcD0 z>y0TxJE-E20Uy#Ry_ED3ufX~U`+qL}_4(j-H)7<~k8LWwgw4u*pcR!Dq%-@Q` zjA_;+4lLN6xu>#5RXscWwR8h`d`MTUY$JD~9G-b#A(h8-c>IZJMe_=xDZKMDg=n+c zJGCthrR?3JwR>qasQB6_B7#rjObG8#cl~6h22@xw2A7q@?S`2?AYRi8NG=P&T>j24 z_}S}8!bEayY39!sJy<~XVR#dP>U=$u*|&u^AsX-pEBpXBpy+>qQpl6V(D9K-~ZhGw$dU2*D@$G}x8m7qmrt@s2E$Sj#%)N@Oc7Mpwc%D_mjr&@&7 zVl|ZjiP|;iJiIx-T>@;*kn3n=hrHzT5VK=X)F=p^dj}qE<@@C8#;pMS-i#x2#y?xgN}gTF#05m+*EqJCC^0+cA|^iIUF6JGnClsDF^9_N zTS$tMNfIYis8sURDRF5Z)4Qa|x+j=x5j~|8$oJ-|>(Svq?{G+LLdX#4tsuoUO zgw$t72(@?ql2VG_;Ho z*6WA0k)3rO)w8QeKY4V!%_1^N^hC&s=zxwPYF4$ykZlXTvdaF84Sob~j{3fEE1z>{vn26)Qnb{eLm}qQRf8DNL!b z03kUk|HsjJ_*41+Z@h&Mg|f?@96e4!IrBO-ey9jK# zisC1HHzG;|{mn7Dvq61@+p@;V+{|=yW{YH5vXzuG%|dkYc!Zyw*aYjC5s%N(#LDF; zZAK$b{?%(5Wfji*vyB5to${T(4ST6DiPboIPn27J{M+w4~?uMcJSD7y6C_1 zHQO5>T6@2$_3e`dt%t6x{heDB7E2!J!T$PunOJ4c02a8|N$#0%3rlF_OF1>QGDGFV zU+V<#BJgl|i7Cu|JM%4NY7eq%$u6Asuz%`#6Ams@&s-r?Tdss_>fK%4{rJA;dG-KE zC#5AKstu*{AE`&lmE!PyI|G}YFOu<=r_iGAt_|xD@K`Vgg-mz z4DxdIZ}jP~t^lWL8{xCzG5+TQ?|>2KM(VV*r4KAVaaaoU1=ZAWj++5F9gl%&k0x_; zx!$5HmhIl<`0=n)?Gnl|Qp(cbpZ5?0@FH^N4}{<4f@MsCp#z|IXh>G=vk3z-XW!fO z;mw7O4Q`@Lbmb2}PzSPvnYb3M^Xq5wa3)QiDUzO{Wn_Gs7n;RdZZTChCJJo~HX{SD z=l<_XWr(@tvCBn!YXYuVeyl-*R+Qc7mBw|j`O51@F31oWzi5AFVM{Z!m47SiXv$2v zyXfCfP;5I{=j>-KvqWI<=oJR%L_Pl7`c%nP02)1#Vg>eVl6~JyCy@pv-*{DLXTI^# zbEC?vb_9$sCC`4?vXppNi`|)*lOHJA3MXaMZRX^(y`PHeLV6X_J$JM?7q>RrXG_Xv z6SI@yawFzsM|p=A5(f!4C}(%WyP~=>EWIFWmk^=htmNq^W}-EMmE4GxM`u7vlyDoF z++m^7t2*P^=BRn`l97Nn`EhJ9Ub^mb5K%_gFg{hj%9At@ug;^2`X^$Ezd$NQ+RE6< z9ibsB8!MaW+fO+@)k@2wWIn{AeewG)blk*(&)Cj2+)`|0hPkTpw7}?b3VdLbH$pDm zWNl9f3)NAc*^ zhoznW_(Y*D5GqgO`=eitS&7xf>R9>d1kx)={A<)&3FtJ&$lmGvh%+^;FAQ1K_h?#H zwPH`|)417BY(w=oXZ-6j+=O+Gy%Vcn4lnOtD;jqNf%NLjiDsbu814FE?y<)oxXaSC zG%O=a^8Q_l?(4idvEbTo-vu`I;z3x7u&iy(_~42aAFw<~7DQ}wjW@&rvc%&T_U%*9 zIn4J)U8}G`oI=tD4zOLQW3TcOuVvkE3lY#NxCAPNT&!$wl*>98JEhw$MS>;C-dOyc zY^U2h^zxzZ+oTWAv(qWIhf(`|_8PxrN!Td=SbPuh9#jYSeka>(RNE=OrY=857xUgC z4-o2DX+Q2HS-Yo@7wEL*SGGOtmD!S7_ssX~?=mTaY>!QLYUk1FLF z^BwPzFgGRYjX!Fy7K~ro0`~ozSPP@3lx8^xHWumAPnQ`edqOf_FER z6Eu*ny=-&HX5*E3)5-?wD{Q?rLN04aM|~1r?>bAZ-1kA%2a(L>P&I7F19RL&K4jK*2KV)PdLV*}Z2-*ZymS!Z zx>D=5-*t2WrhF!yw%cpj_XI7R(L-zj(o<)E2=_)AiK?uDp=4*%%uzn2%B|Y(0J*Zn zkWoSYB*bdIBG4;Q_HTgL(E841%=;5M%{`d#W=jSNeLbQfAN#x|KKeD>ftI7q{{!jX>OE+g$ajz4Cu7whB`tB^N88t4;@Ff&O z3TBo^A*MQk2c}{w%8@Y=wptUKyWTrQPH3c@2{@{aA2p2gKvINQLyzo!)L5aT1ou0H z593^wpO?lp^9MSVhNZG$1wMB<91cJdzs4r(y^=q2j-kA_#r;^@yhZoEK!Tmrx|&OH z03Yb{fRCsqrzXvMZ1XQ?A14MAo25kdpSqlF#=+a%70@`O_IlBh<>rMssT3MjjH)rS z>;iYPXH}H!Ar4-Nk(6H{aRxUkJAR+|SH{|!6q7ryLTl53`iJ!Jz`2Sb$;k_)ew zY3Z%(aVJw6z9|us&q&AZMQa4!)^5Wh1g}W*PJ_XF1GBea?F#Q%Y-~cc>g2_IySCDB zJW$Xee1A@q85w`i`Wca^WHjlpxZLwVH{wzVoA2RE+a$f4Ihz)bd=M@Z2U7m3X%eSE z{!|Q#O}R0j^0d`iVd16Z8|y->{D2JXVEM=~%9hMTmP2)qeA4)b)-C;a+fo1)eg}e^ z>CeOlWm;@o(K2ZQ`6BtPUC2Z~AG!c;)U0D&aA26;!Sk>xzLU6ox!42o?6y9;oBL7; z#sn1Y%tji?@sEn*$qyTTGPvuCoYHnvq}%}FF1{E`kYDYjHAW^U6A(Kgp%~cIW&g>g z38!O&_P|<}XZDQ9-*3b*}ay|J5}rtLP8kz-RF(n%No z*np}jKiGRAs(x|lb4F#Sz$U~Zj~3pkl!5*J`xX(H$C;v2;yl<0$aVg^o~ueaT-KFo7=62RkM{&nDR$=qT#w(li+p;v3NQG9tZGR+zVDP+xa@)?d=6#g8p-zdsH_9&X=Z#K>*1R(x@`lq+<*R%eBGBuX(n z>ByA`e|JDMUWdmsG(Wa9%89Y(jPG#gejMGtHWVMx{rf>dZpZTz@6<^qu}=h9s6Cur zA49!t2#CpYQBI%G+YmJS`<(tl9OjSSOpX9^e79Sz)>3bZ@dLOZBl;`kCz zzr%TI2d(GhgDb)yRCd4!Z4|ygz;bt*dc*0@)FWS)GYiFf1rB@>hwhhB$VFQWr);mI z{9luSP6wlHIe&aWgP4oKNPFmZiUURC;`6`pPPptfRp3Z^dI(Ni({!Z<+F`)zEx2Kp zG)C*>>V&;$JiIlxJ+~S>?`&rwE~38Tu+ubA!P=(!m>ZEL4du+A>Hm%mFH;6@zd>FK z80BFDp&s9o3Q^EzCo0@EYY}557L%h(l*Gg>Kgm6`r(LlJE0r&fG+u2Kj%Ft5wslOJ z+Q9~KeP3*f#1FACI_nvQ8%hTtdse4HAevdSu=Su_X{o$AjN+GUVzJfWTF0uh;@dR5+TxeY5G-x_1Ld8$&sTo0ZJ?t;52kpsxz5k{a_`JNZb-9 zf-47`JR$_NwmV0BWUg!3&3Euv-=XW_xi3MpzD%*gyU9Am;ASU30kxIYG*AVz4I+0& zoFhvd`=2z*cDXt;XrI3zO3`uFzfOr|w1UCu@tEo&pzfudRtEH*?Vr887kUYwLUuf~ zFWB}kAa0!@`utT4Fi65YUI>C_#Mq5R{zPVtbuEjRDNr)$!0}1nMMCO71i!{9%u)b* zmLxf(P-U;kfgiGb`WD#Si}wQY_*1GN4z{o*0C_>Hr`dF$C0HC=1p2_%L=hI-_KuhhM2({aQ7 zts0M6NR&nw%Do$R%Rl~@ghiPoaT6VEC*wh!JGR=h1?9bI!+Qg%AxBF2UoRR zJb>8iB(soqYdf4UeJS0W_Ap?&p+J+6yk=w$$dREDQ){^|ZzPYhNA}^q@zEp+TDPH# zoF=TOkJe1-_tR3d%SCRV+_8x#s|Q+;erw`lq~hTHAlm{T7Re*RFydt5ZS^JGhWZ8X zS)8_|SS#t(kPP^4{+It6M?e?~l^=O3Nr6rEPL?oqVLMXk4yJLPWgokD`R{jRL7*>+ z7~&iDHe#o~@R#aeL|d1V%&bnHZ#+7%RR{oQcknn1_q(T;>#I7|7EX*;W`_iP|(-h6#A-(^&zm{)h zsbA@<=B$%#xYg632CRwW+f1?O#&cL~XtYEm@^eL3JTb}^@$x<`N9(CCO zZWsHaqoI=d?sVF1oE}+jC83%St0f~}tML+L-(`q_ zgwKX-%;LcPRJ03aDiN&Qd{u14zWm=+OmBm(aA-O2-KK{cMHfCz%iL282b%`&F+X@4 z(F%ccTFI!?!?+CR>-+4n=`u_Re|+z%hblD&V)^^~m)nAqBfwA9Cj$eZw;ST!FFxB8 z_jv&0oslns{%EK)L1#<9{(HZCRdv=pac_|hY$Pj_JuA)SgymPn$odZ!k%64pLS_=U zl@C#{dO|)Ec_9$kUrK^vlFONgI(WEo6TiyJ&j}`-K~F`d;`Nd&Eq3LP0>|wwd;9w8-22p`d{vo9W`aua4H9^<)+~c14otTFEJsI7Oa$>C8>1~QLw6-MC;hnW+n-dZOShK4Jx;{bHt*0 zDqNJXKem)_uUrF>3-#6Kx8CCO9PkS0zh>sMV*P7oYVwtcu#V3cf{Jj9N$D31fjJ)_@LV|mdxamFk4+OTcvd5h$gMHj@$pEWUJ=oP$~ z@KM8jkuyIMYyCGNB!ZP5s;#kMp_1LtNdzxdBIZAMvv+{Pel3t6PjJ6R8IlEfIEW4Y z-(+--pxGTv6opc(_Ey1 zA&lcA?QY)z&>@7fiHlWCASB@2t;G*H+i6gY+Ua%^aLnAF(+}tYat`C{RyTRnIze`r z*s$F-{O9jm+YuH>Yn^=qtlxmd`)m1r9-Db0nKaPNOFUwY&dE=KPVBcle87OD2ij+{ z{VIM1M&2pP))ybw_wc1eCBwneFu?stEF&`Z|D_L)&F4D!U&JrWuSKqv$cz2B%lk!U z*3YgtOW=64MEc8GIUo>zN6r|c84N8KJ7cfr44in#mwoNV&*)37t^y zN03qh+|2Gk+HTtBxn|ipQ{Nr-U={SD6W%$+K+n@VkO{vLp{m3o+JQj62ggFE1Xtw` z8n+|>l6;C}w9{4B&RfVC-qji;y^a0w=i*H>y~*ERo#T)6h>R}FB&B}`G#F+gV^;Xe zeXdK6yGS@G2%}kYD8ZY*lVKzkpWV6^`GbB9dz^7nasjIy?;9)Q_ZE2VI*=&CL_zZ( z=fF5vqbJl1%2Xv^ke){?URuBEN-1Ri45@Wt>DZEsj=4LTBw*F#UoPVXA7EJSUj#6J zkyB!X&X=^^Z(H_RGNd-^o!I}8EKwH0o3;kh73J4UJ)P|k*Own8{l24TtZ%G$*7JAV zSf*_ka@ytzTxZ}mXQB%8T@~o3)zgnSu^a7ZNiV2kfFzW*qf4&7QlV1OgB)S*FvV7- z5V`lUrECbeyCYz@@m3Z1fVTO3(J+-6u_(Qz@LX@PL&?wv+Y@m=pjXMK+k{ehGiP$3 z&=jheLFKF&oD-ydE?L?wQIJ_+21Vnei;<2+7oi3BtTd0{miLa-_N#f>v+N4vX-s@@ z$UO%^t$d$6gQpBxBFSm!+4*XT8_zNFEkFIVTMIwBK~aV`Y`Yq?XPxZuqmKNRnHDr& zuQ+#!6k6#PveOnHybUVKeBVp-9FcAog&IRWA8W9Z%3{I`9{SIy!6Dvmgu^meQg_Iv<)^hW9^ysE1n|pYqHAM`R zQV~a=Y>+43oS%5hOwWaImKjrzz_DSE7W8DTJvk@wK|>?>o> z4QbME@?}_~@zs^?BkFS8+3~Y}0;Vf12w1;+3o5x zy@0Q}7l-dJp`!~aSs$`%vy@1g7SWQU`J*}PHs*~NNZwBi3)Q^P@$gE93LkIjxpdQ` z{H?9k8!e?u)A{r7D~!)C1o}Addu79A3m_=ouU02nct@Ew-QtRS+NOGG=9lPGtqFyz zPp)?<)FlNy>opqU0*?zpvigd7q*2sUOxC{=qjrO%ZGsc_KTG{``Ws|Z)qYIB;YkhP*LoX}YzjTmAKlK< zvY!%fuK6RsxI|E$qvK=%&&mVkZQl>*r{)&>o|Y^$V#9&cIv16RVMivE?>Db0rIB6C`)+j* z_sZcCXFP6sDfRr21XI-?6qY(YunE*TV*C%MN`1dskeH?!Vt;b3%J@~p6(`SsZ}a*B z9si!WGBOMQZDIAH`B;Y2`qwv}Z~ABX`h%>p@;h+kjnhXfiQprnKfTZH-G3YDLQMhr zg`r+j&Lj4Y3TVz6XKBkl2l5m~ry5G$Wj&Y9I%p1=_2)!XgfZ(NB5y~Z!ET7kGg)Vt zy+C@vg7zo)@Frw=Lx^-mNI1dJ^LFdB_6zy$ygVc-DFkfQeg<>fQ+(TEeOnJb)J1)9 z74<#F6M=2@&v!-a|C+Tf}->!D2eYTDv6M9emi-BHfnw>|WTY@!Mog!oe7 z!AAgJU202?`h4_D`$azD#ukiB?)8>|0YMJ?*C5IDji60XT6cj{!_|>7;|j`qnQV9Z zb2fy`wH(8Yrd)xh?p85<1}`a*LAPW5i4?QJRSUd?R}Cyr-r~;ZlKNDE)f5Scqg8Mj z12s#Q2^+OrHA4tDJ1h`6CRx!1UUCov zTwrDfOycF@s#w09uMd^bsMPd)|%p69`iEYp#@^+JZ_!k-1mV;T?}54qC32+o(u0M-x7PtBV&<~ z!kMF4S6wD!J0tPv$S-v7l8)_JOtqHN>y0c@Qzac$H~?eZv0S@|2=ecs|MpOw8RPTC z5?Z~wWALxp3F>s2!KQQ{{@Kcj(}7Z%D~gstm^ur$RGTs!4oB?#YLqPHFIvU*Exm2M z7kyhh?<|pW4IWP6EPO3_*KA=+3(B5{lj0R>UZ@yFEuH((L$|}YAMy7^P)&v8yIrC4 z(?k73(3g;Sw_58?MolHci|+5*w8yKXM$ipvW&1W3DK`9(7h=$&zJ%VTnlP}Ci-=~4 zNDhaL6|nti-9YE0gD>jM7dX*lvBBxZ0SBSzIYzXX_y9_N1ZvSy9>F6c*%m-_yBEp7 zjIH(2E_g=kE5}3%dlbPDiMbx1`ByMxx;dPOh?%i@$>A^Dt`xIW@Yj8KqOry=y>xu8uKyCd zN%OAvn%=EX33G~M9yV)aC+zIeCwCra1?B?(bPTxzq*i%}5)ktM1Xww;E5)LjN*f9_ zO-8rc{F~pH{H1u?3la<3%?nGkb3>?&0HRDDb6+M+BesP#pFhm?d{w*heU4Ua3j zgGMuoiN?^9fU7MISu91Ae9t%Nq+E|aU%Xzt%6FVK9KC)yzCxvMW8GHdNu*tvc|A8lo{#W(Q#dTV zfHD8o+PsXoRVS(C7FLWk(j@G@7GWa(2ymfbKfW>rjy`5)w%PbQfF1+4nzt21X1Pe( zGM8&91hQ@P^{d9q3;(%MTRnvvcDcl6AKfSRCW2w+)B*de#dzDY!3aUfP)2daWvNJ*`L(SPM`bgr&@ z(;#&Ar6ljj8?3pU`v%WF&t#w5?ti>a0mj}_HTrIELvqUs9iF_@!By0KB6oA<#ePw? zmn}*fF8s=5rTIBs}FkuZ0_C$QRW+(%uLZC8+#69j+-$c*jg!8MhO39 z=D7Hkvj8k>y{zAoX48fjWzmSlZ`sda{7rg#p~%#tXqD?JGi^G|Bo@S6_~IC=-a?&1hz=kY6M>G8hqngp z`%*#0V0MDa#-~tuaS9h+&la?{7+OzWWHn;tu2W>xOZtd97%hO zpBEFk)`*_x5n)UGfqcS8VD}6Sn`2;AUMj@32i#Y@A9fWyDbzVDCdpF9@f7u`?%S)p zH$a!A4-4%BCG5^flId`k&6}ygYx_feyk*DTtdVyxRYoI?t42Q*g+Bd#x^w98rs;w9 zOJk@Yt<7>6h(;sAn6s9~bwG+?9|C;8ZKroo`wB|A^(hR5CkPhZ8PK)$44Z7rI$cHH zyU|oaOhK4Yw2n9S``1#EEFl+afB$|)Hf&TAhIl@=gQFP$4aqP0nS%n`2l6-E@fFx? zXldeX-}B*O{FsTW`ETm)%N-9O8zz1{)A2${xh6Z5)kR2 z!P}~Pl`M+b5H4-jZMhfqK+em=%v_KbTT0RVw;>_`+_3Wl!e6GtfU2&B-jjcw@+}}j z$Ce{tnPQ=-9i1hTjqZw?<~x*CWUBb;uu4lG8H=t9>%A(LkG=B^!% zIH5-EsJyv@!f=-`77`cY=&x7)aVZ@`m7M0uDq--JH_HnuS6Eg5^$Q(vb3OsVZY&FxYEt&m+ zT(?IwC(-0Vr|F$_h@akGq}zW)BW35X5W8pK46=sueja}KSKG<%oYD~sGFon}0Z@NuC;@f`md zWJ3^Cei03R<}>{TF+&#D>uxd$nDs2Lq6QZ7yk!JQn~PWLkUA3<)AZnI81-ANm?=oh9j zp%wc$i`Nb4W$$L?T1F9wWIW|04Y8TO>L15&NBEGX=2+ zKk-QdaFWlExK=$K0{vPWcy5%%L{Vj-PQ&;P%ADOiI)T|3;?qyo6t`2D0QEC$RhhnB zLIi(}dmSl@bF`wWAL*oHTMuB+H6Wp&Bn3}3O9B3xs6iv1f(Ja8fVGanQ54lpTXs{tisMC^huQ2vNocB zQ+tE5f76eEZzx3zd=S)~mB3QeCMOMQ$r}#0%h-Pn=u>;w6!#8az|9G4i1F{dH@nCW z4xX3zQoi1Tnzj?pG!-u)Bi{2X6Vey}D!U;u`;%Z@Uox_shd4YgB53uJQWn##`y2V% zJ{Bj50r@9UHdY3N!P!$BO{BUWECzj{Z1rqr+2NC|m! z44uXB5o%h#Z?I+}Y-CON@vW|(7>k=UhS5?-fG<@NwS9wRgQGlC9&YPQFBZAOL>n5o zL`yaFGzjxR?%B{X+9umFpbs8Vf{jl8d=TcAOk%XSOvKVU6ZRWJlArOFSCE0!$Sa5` z)C`7Vs*zPjVK1)VbWoUJZc^B}f(&4W$cg1HmLHxEFKDS_FSW(OeSOhFyuuaiWrj;9 zRedh>+C@H)OqD~qNXbuUC<-W;c_<>h*cn2z-2a)5P9n?7(BFEeEIk7vMGzN=@bujN zX)liaLb){T;*}SOY*CJ40UG-t3_dW&TrQG3Q>uia-U)NNZ}+Ei%~&R1Rr9kj9F9QX z7mnV)R*NJ^6aLz9{yA%r>-n2mFV3k+kDXo zTB$D(^u~1LhN^AEDxwUZKv$jszX9!hA>1g!LxD&(}R! z-h0b0xI^nZS4Lk#x93-140F80d*k3jH9oLzPp}NDatRAm(5d910K@I@y`pi{-h28@ ztDpyo2eMbBOGHkm77}lMgh>SC9oP;bI)~LN3~<0w-R?w~ldH#KSpqIuuI~+iT$eb& z6S-xEEJJ)Scgd~yPidFv>mV_FZ7)^KcC5ZJ602K1j%R*FG7$#BTSBEyPahzYD zj?C<;6|6Z)#WBMtigW{V_{)huH}49e`!Ps8Ii`fSbeXS+@X*JyB@Ni~ySk^jiwotX zSEu@`)3jiOaS^sxGg5|3yB*lhiP)uEP^S$pciXH|^w@Rtf4od5#qXkM1%C-R;j@)o z)AyU~v$Q_RmPy8aNk=^;b=~&6?h_Q!u~jS7xaF&}Xqq>yJZ9n5d-`?lBaLt=!z^qm z383tBy04F8`xZ{V{rO{bJ!169p3z?W{YWo^K*{jA$N1%@%kuHm+YW6HD3$!sJbF9Q z6Aq_Q|4jD}BP>W!-g+y=-|seDtw1Z``V=mxU+Z+<=Zd)?NbI|$i>-ANxI3H0HVEd( zm-5zaL2>H%4dV8Tfm$|m`Ruj_W%-F8@6Wo?Qmx|A-Wo@f$kv{KhCp`sHRQG10$=WC z-w`^HC=%@hy(IDendomDya`T^MzIy0Wl&3anVT@A`?p({i-~cU;oaJ^We7>YbvA=X zpdywR6tJ1ab#-nvSrs=PS4P-{Nt#IusE_~)QE0=c#^J@V%f#SeyhY6N&08wX^mKC2 z{*B#K^6l0gOiddZBpdAlsaErHn)N4tE`_W6etdLm#FCAgM5be%wa19J*lV)r*a^*y zlpxyVP%2C@fg=B*33NMBiP2H5FuG5$S8npj920X*%AscHrlaOnM)$REZMI$szY%CHeZd z?XL|}tyfwAOvBJd^xi`rep4PE*Ob9dTw^foY_RRFNg&JRE2yvfp?PrLq~X@YShU?0 z!JkMM6d9?8GHqRJ_Ju5Xf1N~kLD`_qGB#sT#&NWEdf{xM2&iRYlU-WNNv4Qe7yHMA zNmWe?5w?c&FbCodLHi$3lnbPjt4noSpMDjBf}1k=!TJ2;W3+|IJ&T`E0Gn z{TKRnjYO~U=0?6l`7r1KG2*FwM01P}`Ip!mADU*pc4A}N?>04FNW7<7qn8z>(laMx zkM+8PjS5@Z@L%Jk2NrwjC*maXJ?W>&^weZ`p?jC>{tz3@4y68KG%Iy*Y3S!>-YZ)MZ^Buy5bAlVvoBS z6Dx)A0#9{e=viRTkAb`m(Ijd>wZ7?_c zl}R@z3dS(rS`4EFM!h0=Ag$^rLfDX*(zznJU%1*{$z1#+&aJy=qL0B>D=H`h1eD{v z7oaGe8wfYZ05!D($q#^Rq(klZzExysSpaNm_`>$P%88($&Nz>RiwsxEf2K7t5Ev(R zam=FwRdhQ}pfB)s zf>o?%8wZw6H}^Kg&eUU{O)&vXtX2O&kPqwtJxR@^+P{`c~E-N8GW@3 zq@s8|>eltbqCH?0FXKU4E)znk)OY|e@H4WVGo=eFrB?=OIMz|#%ZDlW z#!B6K_GKnJ=5^u36f=!LCX~?sn_yQ!4(B!rw*Fm?5AR$yanKj9cwO+9+HZ(m>a?&` zP^-GmXCe4L%j8;q&*I@^JY(%7YGl@K1ppho`zox7aJXD zEL33@qIX7y+;#Zz8qy-+v!2UEr?o!<+3VduTPa^BfzP>9GF~TX=yR!V+$D;N1hlyh z^l)P3fg3za6~pWGwd0YTSc&B_kr0-Bcg(kB*9*%1DN%6jVwT~--e*S!&l{_)fcvO; z=cSC_h^V*kr;;uhFLx|JT%(5;GVNml96A@lStFmC74EA9DEyIjl3R&$4=_9hig;jSw^-s|{2IDL;CZJQ1;Kn1-HylzSb4ftHcP z@2S4!*PoYjc=Y((Gn6st@W>0=JAZ@x%2XN}4B^a|fuc^rdh-^j_gFR~H{|p33mfQ_ z#9ejTiL!&%u_`G+@ZY(IF^;CA=C(gMi}>^L*&F)Tn-43^ zm?|pBZ3xj$dIOFbF&PX{%2fIweM>jU@dxPpYRQfI{gC^9plTE!$7Hu75%cs9}) z=$x4&ep=_##Z!uP`Ge4md3c&-?yuPzyq)cvXS}URr%Gbc#oJ%$fowGAvsx_BvT`vJ zlVm1FjL9YC;o5-xOAw?Dal)hbXmPLbZ%VTz+pFGFRGG>$U#6~lt+tm}{t769M=H|> zIJHkByq|KA+LgkVf==yDLgqHpK&n0d%~4(SK#of`&-+^{rc%!8^?4QvmOoH#0ot36 z1hMIbe8lDdMje|wF=ZSzFUMoZMkF0%%HhG!Pc%scMgLvs<;@$az$|;mlX>eu;CpTa zJ-S7%u%Gk)2aWFCIwh6wdY5g!L?d-j0qo?d5UMJ;pq>)u& ze3>Fs&Q+@JS_LfXEj+~04`)lM-k8(GI2+AT>E8X%y{5+3HtLIxUitG0IIXtsE3|EG z=r4alFflbwA4rn9dim+f1d##-wH8yxdC>|p;li~!|6SwbkK0yWVm8X0`Hog$Cm1l0 zxo`IHluyHF=T97jmx==3X8Z12q@91h2mDC_qoobEMiB)W97C30Z=J4+d(D*VCG8op>cak=0XadqGNcBqpAI>> zQH=B6rh7V`1D7}9hp*nd=Lm*wFMpY&Syn#b2nPI&g<9IjIxi&~-}&vyMwG0jhJMD4 zeo?(5Wm~gk`MCN55pOuY;)K{|Z$}!_{40E@_p)iT@<+*IyPWAxRrr@}($L)1<`{_T z{6@XI1gq%LZ)5#ZbuWW(`<}w3HN~UM{$f)n`G#jPzh=)4AKH95i*N&b90eiIm5LCq z*X^Yxt}UDo>kF*t)p69m87o5^$k3_259T2{Oy;}`xj^E_yY{{clSTctc)9a(>z(xE z*>b=(mI7q1@_-@F+2CWDZtd5VzcCM&1V~FgO5P{TgxOQjqf%ysFI$C39y1LODUb`4 za^Z5BY<1%*%J73hlGsFB?ww;8H?GU^+)R`B_ROO9{>lauK==9bUNuXdj0@vEc5GKq z?bA-~(^ZP#3QwiLM{4mwmnV)T#Fsb!^>W4|Ze5}KRzHl76fgE#HyYshE7t4d|W<=?R3 z1A_{n%g_*ANrtSSoWA)TSMbWn6qyruy|Nm1Ut`YSML;i&RLS1Z7y00K>aX1^D5Kg7 z6{jZKD~t{AAfs6aqg$J;kaEgJVO4XDl><8|)PE(&O}nkFjcZK2_WJGgzJL8aK=MuI z!`9@xSn7|tfNC`Yu|e+W8gqp(G6|T+iW+5yNG&f1AL6F=g3lgRi$LX ztB-k;rJzgoGbzE=;o1DUw2ZlXPpHkmbY_F`c1kYF5obJskp)WE0%*k6*N*1v1G~7f zk$Ah%H+i(r)1rQ#dqzFH{F9FB2>}!!$htCN^1>1fqBE|g6QOxdgge-IAE!1AmVq`G zDAny|Flx5%MFaFz_J;^Nj9tR#vOS(sZ`c~{%Q8mEEioM|^WpJ7;S2eS;*C1b&R8DV zeA}+S>s^r*$ZI^oL6lS?9e%FIH`V&-Ebms3w~Dq`HwH;}v}3P}AloR<_vs`9#@bOK-189_h%f!Hf9|bMo5Xr2VuW7D z8)2nePCgY)-C3H(iKsW`dj!uaKP}w-`!UDFC#XVe6&Gbs-0KE-=4lTN+p)M})+m;Y zE3MbB%>QomO?Ispyr_S}$SrBp`l?UL4>+KHKBmZ>yp!3Uq-ti@#fGfwgj7W{!c+9zchak>0F z%^u5F<`bO|9x}wtnAap!i$i^0hLLcETL8MOxgE(G^*#T)+yCoPuPZA+H&naC{V;8^ z&>WnRx%tDw(YtzJXdcqWI^jIc=9tFxiS@UK<30}Vi78hD5=_tFo8D!lUq zI!Dq5r}y)@2BYo?IcqDP`jX)!si?tLYX8sTa@Co{;V1YS2rn_GKS3vg8_}hdPbvG4 zv9w-i?+0Ynq#);q`X^_PcY-5o-aj$=FnES0Sgw767F*as-dQ4#_n@yz!$s9!sA}?* zFDh+*XGd6(A9ropFZ@{+C%=g#P7fiM#G#akmMl63<6}{C9-+Wzsb~U;F6YJRD+4H9 zMYedO^^Xr8IT%?Kvu34?c{F%f6)IMC*w60Eey10Titm09&>cN}i{x-$8RgNbWH>Zj zN>6Xgle1uKDU;(FNyC_{2D~#aK&Q;=|Mn{j(ttLIFrE?Zw1`h|r2=H!LiM8_SB$!_ z@=EwFo3_`M1G$~vTzuEKsP_u$MTavUE4O`OjkGA%h8Pl5ZlyrnBn{HYci4&Mlp#W3 z!b1{EncMZJ4$;rvu>G58jgeEXdNNsTowm$Awt2MH>lh^hVR0~h95r=k>^Ud1_ItSn zGm9Ljj4@G20wVSdST<@s_yI}6l%2=|;Y{Tq)M!4Yx>5EYKvk_qhDPs9&HS!dyjn%P z?=GZu)B|_|!_IU=2A+|(1FYDHiJ*!Nr{>M^X+gM{eMt91IVR(y(_)hx_wwRF>G@BT zp9H;n#p>{)k|)Z_>cJzJi0&uv4X}{@O;(zzb<*AG5W`mnkJpgWy_uE(| z=g-=`!YI2jC2SK-l@O197a?vH*B!4gTlL(k`wqMX7{f^$$Z`#_QFBfeS=^0^CT$r4 z137qe=UtWt!st^7Y+T2Ef`=qXkUieenh85Yy0eu?R+mmo#j6l?!PcIwC$~2zQqDLp z8MP}t;UFqq*Cl@2Vuqf@G=2HZ4nPx;*B&?28x;n)kKcL}tcy5>`i{P3Z@`(TH`Vqk zkSGOJJ?-vvr!_B@K~ph<>ikj1`bA}q*PKunEe*+@H|^xk0gqn{8o?&S#$M4JA=oCr z@KsS;%NZ;m*}sfq%>K9fmtPlEAoTkgJG|UrkJ-=XDFth#)1@2upuM9br_VkG*tp@Vv?c2dO#ZU#Z3&Q$Zr?+`uk2aqXOu9ibUm6V~0l6ToM+h)oM5xLWf~^EZ z=hhb;N-4=gzb_&D_tUzN`66-)+gCKNpLwQ8taIqDhNW1tQ6TDPi}{H}lp94TQRCgd zK8#mLwK|r_>X6D&-DD#gPL;0$_HB+bHL@wH(KFqI!V4kQMq;Gf+&Bgwv=*#ZqA4E6C+qgYfkA+q5!_Scxlv;+qM?YRvu6G>lk)6 z(tlwg*L~OJ|0p^Sf2#j4j<+a#ghC>tjErmV8F5_~caSZzLu8a0l1*{x(&burS{3r8 zke!vd*G@>ry`tn=*ZSSxe{di7aqs8zKJW8-J)dqGjRc;J1RrXG|D!p=Z*7IM3dbD2 zm3QqrXo@?L8^8RPz1@MLugF&r2*-yH9y~0JrmW}T2A5UP2khgAeq$M9StMcPhsx{I z&doM0p7f|>6&#jEz}2GkFRCKUY?DNpCMCwFoImi(#xKxHda<3Vca4YcpsmaJxQgM`mhU41($k^im{i==U-Ge_q^U49ieIItP!2`ojUqovyA11&PL#CBfN{y#&?ed&I7 zMtI#N>jT7D>a5Ct34TVnjVoi!CXc?qY8W+zTk1V9zxR|-swL%QNoOLk*Wl!_CoXBu z;rU}UzO`ll8Ca<+l&-C$7a{~`?WE0)Z*cl)2A*l1933ia>Sc0a`{=)k`XP+Hb|Z?l zJgs5JWz@EZ>GnFdWZCD@z}0;9S7di!E%POygRa%Bh;!egoTxH}{l!eZz&Aj)BKD17d*HP!nt3!lp~Jta=K zAAY8_tgPlu-*uf^pF#84r6AetLe)FHV~wAo3A~Yp3=s&2Y_I*h+y@{l8HPGt7^zPf z7{%n}%0@STvJ#yho9nEHSP?e0?|Y%$<)t9Uiw!X+P$Aus_Y@8pdGG1*#FyU((n$eN ztfQi=88JRqXi)Zta$|-tRaCk|G^ky3r^@zuQ9AT6_Hky@-jf8OmOSel=VZ+ogmRdt z5JykTMU_u03{>Os{$GilW%Ax`WM$F}AG7J_=bzoF&&%B%(%gYMnD?1X#5Rxl9hdR> zs!t1P$a0JwX@w?+UD{(1E2U#+?>@=Rp=*X{BfgHEl!vW0^n{^JLd+*2Eru>AS<_`> zesI%6`#is+ljHl2C?V1#SsP2M6zzY#;ZM*?$}^rHP4nu8!R)x&XMLOB19ozoW?HH6 zgMD)gv19w~%=Eybkz7QQY+*_sYT)QY(+%7T?F`kX<=}`1%4OXy7sZOT=J7VA2FY;X zX9Dgwhg`iJhemHx5@!Y`P(MgG3@^!XQ4~~YWO_Nv`|g{fnK?_4OGw5!=@8)#@^iZf z?!{(GS$^tY3HifH=|&yMo0um`l4sF66}3CRE4<EvfKs2~4#0CmdT%_p?+E^_=DLi6h4?8|x@uyjE*SRP6oU#mK#ZYm_fMxE# z`@8fzI@pPBvM(@MG*L+R@m~M_@oIi$x;2!F-vVh2Xz?`~HZL?F6DiME4GcVr8lgkK z&=Tb%iIf-Wv$oa%ZKT;9Cx+G)XL~IxDgN2sEoIeM#WJ>_pf~nct^+tQ!P^V4&>7Sw z;_C$}D{0Ly2c)Js{3HH!+BPbsR0tX#mbCDQ*qHXFY1V*u31#47R%ezBx5GGEb*;c8 z&ti+#*{q&Mdsy#Ou|AfT<@Wvf-a}=D1A4ock45hr;oQf^HM)Y9cm3L}_dO4UJX9{F z*@8c{otm1;Fj-#tQ1V{mj0-aE9JGXb9y>O6VTe^1s7yG>ta{%%trRFfM^-J}WU%(z zv1C&0&Knk(C(-AE{`zMlk*B}AbPJ&t$!(2?uehIXKGl(Y`@2SIk=2nvk%=m&aURb0T zT9jw5rS^a~l(hz-$x-9Ovh&7UO#CcXz=jK)v^LpIq3NgiLU=}5Uy<#sRc8Kkw0DuO zw97bcdK2ZudCJf$LmK!dkC)iUCdYxb?Y8s}%R3b~UATOiQmd8UI>qlwQ+*Qw6BM%M zt+*n`Iw=RK8j$E|$l*JNrM{eipNH}Q{}z$kS`^K$U6!&+jlN4dBj=Pbtr=Q=?^&cqIN%0m31GpN77TuA-oGdWm6pgiJ~$fy zCD@VoeqZ)oZjNv=mc5-Zk~`K( ze!We49(2u&4Jv5rM{WSf8`cYg;E$b8^e1u63|q(#0n!f*r%T~t+ncX?izk54#l=Mv z(ZsPBl`XT2$hC!l?uMKW`}o1<`_01F@9Va*NF;U(U=b*19VIqry zC^k-)m+bEQ`sy02l)XB?HQRfWp#of2l9m^2%@`GPENvOJ=W$TQ&FNol9AzGjdbFpo z6|RhF<9Z~<2u7LNs`~?vMaV0R+|MkhYrCPTO%f&aK>x)ZgVNF;8bHzL-;qE5DuHu; z1-eKPaJ*?_KA#bj+vA=yhqnbXk|H7tOT#vUPp|=KK$hkU$PzKV@pJoq*@{)0xxtyZ zWriuyB|gxyR(3=l2a(nGO3OVe`)2XG0o5D)@Vxqm+`G9qJHA@dJF3pi`myI{NhkRl zUNylOsg6JvRcnJx(n1H1%R0FFd09@*M<4YfRm3M|0?^T$T32K@wYE?^0UNDxkwdBX z0{)yYe_n#bKDar2(+lm9%cu3RR-T7x^z3ar7As$s8G_Sl=%?X2i@t~C0S9I3g)F$- zPNwD#IY3;Eo;{`=Ru(nzNi{QnWYYB`lW(FUa#LEbj~vOOj`(VF4&PNWR#mks`iz9# zUB6!V=j;2yc2}#XT9JJS359F0h&E#hKspE#aFtqy_C>fr14i{9&0JCuhlcTq;Z1RWr{ug z!O@>wWDj*xDRTPPCgaj`iO!?XRfR4?KiJ?HiZk7Q`=|5rA`IfY8aC(2D1tz_XSnQj z_(e-MM5OTY7K?Vzn7oDOF@L=uC_wUGe=V~1Kslzg8~5|N>CH@LQf38pS#j?PiOkXB zU->Zn-xc8^Xdp@Qg8Dye19_k&m^7FUM7ItaKpFekgsXlMWfgx*WU$&8BhvZiW6GZ_ z!Yynl-En>7Y~Pm$LM{AUAIkW1YC4%p6MBV97t>3AM)ZK{DW_h(3hNh|Fsd+YE%jD^*E-QSZIc*nvpLzXHxLyDZl!}a>uuLO>gV;YTx1?MB(KfR-N?aT<^}WT(Nol zIdFSN3XS3lP!zpKGJQI!R>3GypGrp>$N#(4BZHm}&{{6X)=gC#a;gpgR(0$xnBwu7rD~txatIk z%Y%*sA)PR-w+$~N3V7dOUphj&+|x_5Ly@Nl!1-yk-eEe*= zd=+A&mAG5MIBlns?5l3LD2a$5jG!ic?%f(Yp3t`;<1R+iAR^y2oxIQ}Ouu{&F*<%( zP8jq~9%O5M8g)K$6w>>7leyy*@B}(mF`|6WJ2bt$X&dco042F?Z0#62`B*p|{lHeI zb5ps28lk}Gl;ZNAJJFIign;dTx~`CE+Q1rI)^7~i2Y}!M?kF|oH!RbtaV_7o#)473 zzi3`b0~V@c7O{T#iF2}{>BtEysFFNTg9Q35@{N41!H^&*Za;fP&oA3}$o6C8>->mt zHEoLYZU>)8V^P#GADjc5uEFKMVOvhkkH8J&@Y&y_NS9WaQnd< z)kMOz6Mb{=S*y&Gt7QO@H<0K<%tI|JtxQMDc5CGIPAN?_I%~w;$<)Xl)SJKc|o+FD_ zt#DnzO~E>|2s_2{bX&Nx^|HOusVxX^?OBDrK9$r*QwQWy<2xI_T|>sDGHyQT}njmnZkEtn_rODt>-{AmW@w|EgM{8IxiHG9{eo(B#JeGegcJl*0C$ zLAP#N3`Y;kk9x7T}TMJx!!e42NE=SYd7k`dUo}k(bB?SJuMfnYOyUI za{9*Ea5b3O?z6BjpZPvUvlE%XudPTd)j93x=>OKI4auRE*Pm2sVRLk5)^%YotP|3s zR+;sHuzS`D{~iBF0HSmJL9TO_^w|3DaE=gG`;q(ppV#3Ug*f(EZ>?+pl$SK$FsxONYMwv%a>{gN1KLMrS##s z@&0cV=B-PRpWAIpo$k{aD#ZL-*k3P3`offifQwJMp0RxhuyL~FYHgDa1dQ7Z+L5)_ zwo@+3EQF5uN$q5aOi1NKG2MH$8 zCax|)DRkG%IunoC`^d=T39A7Cv^=)5ajHoKtEn|^+3y7UOJOD; z74LbMb+J)jB~f5t&IDbfj7A04&(tS5yG+m5#oSZ`+P@A4z1~E9uaUv1bo@EVq())9 z8u}DGTHI$`<0-Xr_EI@8eROxzj^Jn|-|e;&0!>Zyvoi3jlpmf_W-&f!Wf22|%Oh)F zuKc~$G7)-y?1jv&#jcfmFfwI)(Rs-e%$7;LGiSeCDr*CTmOns z{$eD3{Xb9}yYo5LA**4=yH!i8c%|(DAmSl<1me~afHWP}ZQwEjFRfA|UxcYv%9u{l zyT6R)kG_8CMBiAeUqOqfms$4W9Lgg&Va?lRfX9zWC!d1=CG4~9<4ae-qTJZC`NOdf zXfC-Vff8k5mP}byY*+1aq~U<>8PH;wC1u)C6zFvwc=-8oX`#+4c{SXS;yuWhQztfi zJw2!i+fZN?RVTME8N^+K+$})7+tO?s69nApSxkZCZ1(IPgp4`8`^eVlRoWE~AaOw%><;oXSN0JC)+a*(uA=xK{~;Wp^C~pV3w0yP!3fV+l)(wX%PF2yz3tInG#XMg$Y-Q*XY$Q+0G^Hh+R2qeY?TX z;rjlZo?MN%0&=_m{P?g$`~2HrswJGf@Xsmg`)#CLM4--EP6zl4oU z6XnaDvR)g53;~WxPirBVb|Zm=-v%vIrIWbKHG6hg3B%K68NbP`7H@ zPa;Ic@_;fx(&Meri;ozV9~`Og=U*H$2>EI`eVjtuwk4ehYaojt;UD_u+23*6A8_DM z3zl~wE%VCq_YN-{cWz>_b)Qg1)PEP4-1a}sb>FLgC!%lbNmV1S@hyeX#5ze3;CD2@ zg?n^gu$9xZqw;347U&{+2(s}o+zuk2lOTg)jKO$r{ttyAVY#*y4N6%jwy!;J+2eSi z=-hIJ{0+!=FH9K*r}|`7_2eX@gRC?~S-)w}bRd#RkUpMTP}Of&j9zLeFr|#lu8L9! z?!rymqN!uyQ3Hh5u)?u9Ityg|XbrFOUq(@h>r*X_;?NGk5LbGvNDVGHUMI4QuL=Q= zyFaiD70oeJFvYmj|4bJ^o@ZXyjGY2;?J2WebHgMgkMyPBnT6!0CSIi+q$fH)Q>pe~ z#%i4fa@sn3693u6v&r5b+3Ya0xK)~W5uoihpqbI67I+YGZmy=YRz6B;|-nl95vyeQJDy;KqT z9O(#VLK~^o4k$pg=t`FC%E@Zuu}-DTo87BFuS}_ZY+(OtMUC+5rq!Jm1=-L|F-*ex z^JOn+o=0P2H*i;^y%KHi6poc)OG<0k@o5x3lCZ5Ksx3<;+G6pnb6iasd8@0FrZC^x z*CB;VKWMex|DZGsiC5eEPJU@)$sGRO9cc2aK`n4U)`@8Utu~1I$8yv0Ho0j2rD1F~ zpNgomCtk*bwS4V?G49kSpNUw-%OgR!O!~wwS`jUo#YSN<2IFqGyu7?CV<6B~Qr1~u zRGi9>4SMn?y7f70<**ErbK8`vYWGS({`jDz=;!YI31^nNkw^|2IaZAhD#v7Iqh!xe zq<|VZsM}FRCFQhQWZM|B?Wk37TWOa`qH|RPTZjSzDaxA5bn;FO``i%D(R};D05O35 zEtg=*jel$v`UzKat@7lm-UWP0oXJdG*Fbn9z7!h&=f{BsR7Pia;zgozmz1j_FN!w( z0}32E6r${Y(GNNlt}63aVrrx6&J`N@VR4-e3G4+Dwf@~)?SO0CC?vy1GFSO-V?zrpzcaQJ=Rn9%KW;TY+_ zx<54}5ZH?NE<{7zjR?5+_ZJVJr*^gMWlFe_ORpglx=)!!l~=d+MyR@0A;v_oXMOgE z@-&SDkpHxj6y|ZM@rWEuk3e0aoW7)6ABYD?1ZPL+;Ce=cj{J$8jB$b=%L=!AH^Gn` zm;N*+X!Y!hn_Tahuk{qnDqtmXFp^IQN04Ine|nsE!Dq-B3a7r_{AMc|)wiX5Xp zYJDDtMmqRHV4h})eu01M0`O6QH21EPD=dtxtv$Hu$p?y&|7{MxHY1`{Cmt|o!-`{dit`W*nF)GdsE=992Q496Mio2X)1ydvIBFC|1aib7L}(J;7_wH3$2Laq~@)z<2-21IP%v0`}Fi)4=9jPHbyO( zaYHc6c`BZvMgCWl?U)qWSso+OzjY(XsV_+H;{2W0AHB$lLnO#I3w2fGNaqjN|7N*7 z*QjbuiM!<3q3ByIIEeKRV@fHnL!kl z0`K7_Un4lxI1-qyTfAQw=$8yB*dpembXsbioUGPINxoj7cVMmoDfCxC(whHU?5Ir< zlvI>j!oYQeFWx3rc}+tk>}Msp$$CK>&9mWs@NcR~v(HdxTo6NcPj*agk=M<>4R4$-DPbasbaukm4j7pQrj?!RKh?-!w0>V4tXL;jcG1(jy^OmG1l zK~=ZPS*uR|tl^ojTDVloR&`4;TfZkmVBc_M|E#|8UHcl-yoi@x`lfQsWmps5rX=DU zq)e4#WIXhl&@;PY`mY-O`$;Ro9xS-|z}a)*sea5QnZ2v=%BUX>R)mBql%+rJYFs^3c^(c|Wf z?~9BcF!7i@a=*tUS@i4p;Kv4|{4GSDL?n%sk9<-qgGJlSdVN|zc2rHPzpKwWYPDEqK_n1DVDGHW zy*@r+blyO7eO4VX#YfEH>WcN)$KlPgg4#2~W46a@uY&<3?y`i5pW=nKu#KUn{4qWJ z3N6gYvI8C~j?=GaGFIa*DBAu_p>=TWHsOzJn06ZLIPja%LwFl`kik=JBT6w~*kQLEfI(73w{jf6jVyIZDO2->rPIr9whjo%wQpI;-*amV{B_E6UM(CFmIaQ4_qLHJ#k^w64R~W+IP)5q+d!af`mWYZe$AO+3iRZNvyKSl7{N$ zoA|!F;D`f#Sk04nsoGr#l~<^O0(Go@ zdno-$Y<|iLC@$0Qj_m_>MxZYKJWN^4C(5IaRkXsfWm>mjD-?Cl3KV$5X&1b)J&V~x z2KaA2qMND6+fBYDvab6{?p%Y`);>%vc1XDy%n`^xr(SS;`8=uD8!cc&bn2`ZYQ(<(7dU@4>RGlZ(`DSRj|-}?8c2bft1TlJ8Wyg}Ge6B<8>K8~hvQ|Vr9F#w zvo6t5FUpj5tfl!&5uYPyi}9s#hXy~n&?SSV9hp<_?U8N4F*=g_vWPgWyCfLBe+SrI z-q0GCN4gZQb**{u4zTAem4l&TUq`Jd?Tu^zTr_uNL_8Q_BO*#a<5Ct*Ikg6YJ3X^>_ zbkBoVZATk;@a@0tU&Jsm`J@|_@Yh#*;ydX%(uqj~g-2(Si9+TUP>Z=kh9r9QuiQX# zTAq^BfBgvk#e$%{{{&la2vt=7BEC0dA_eH4Fiwmm3)**b;$4XRi0hmGvSHLG+Ed9|)E4o`$IlT>f7Q zQI)+7E0_tGCu?Q1n-DV`R{EyUL|?Bw@4CF%$9q|7&vhb=?3VYPuDuzW7S(qVW(jw8 zBvN;IyW-r5gLBV{2=_y@k8d9^+?Mgl+{29wo4rM2QRi1qlI_sv_KLrzFI*DSnfWs$ zK!Ly|cFR9+ym&|)Sh|3};{GZvtfT&YIqe5G>5A+AO_imOy1_z#o^=(2;Xvt{vQO!` zlR5LENa90adrdL)zAO%Xro1EU=U5=P!^|!AdYv0GyWj864p;5)+B4MI3+u+NTw0tT zj?kZnc2;H!vV}Xu~WP`=3Wb6L4<+8f;4S$xsjl}Xx z?QDXjdgH%r`Z%jYJ}irklRFe(_RSnwB@nth&gZD#WgyU@(5@b}E--(Hj2( zJGyNq=-I-!n-oE<+|vP<(Oj!2Y!`-tjz=Lo@*sKa|LIIDk} zqV|{q>pQAurqzMQ_*SO!^jCEWweMz|51!Jy3?y@ka!;HuRWbt&qF6Chn_^u>CSFFd z40r3oNO}&D*X~X+uBaqHde(|pTW19p&joUeVySA}KK>WO#yp>7n@1{#WxFkX`C|z_ zHCSf6g~xE$WwEI6#4Cr>8pZnUpH7%SXVu!~Gr=GgkMD|NM#J~+2tuPzkkb^6Sc>PN z*cDE%=?fE2tSYL~zTdL@Dwk-pTZy=S!BbFy#EM0T*e;v77M-w6^1Mtpq8!rtz3&qh z6V)rw?AWP)4!NSgg7X0YssCOxTq9*&jF80*xS9gLPbTD@W692!`ISJ;yZ%5n(nY55 z3`!|Yn{g%L$k>@g+Cp8!Q=Y^goha;^A(+&3aIWi?HZ{1Saw-^6_u!ttIRl#{SQHQo zm_dpYTuu2&SrK19o9y%>@3@0rjIKXR$P;KHUX_U0Pm=z;tJzVf+Tg77+;~~6p*}%X z1tmUX*#k`#06#Bhoco-x8a>o^N;tHe$~8RG>nCm@-$`GfNM z&>F?1q)})?cR2p@vWQpHY_HW?2$)i&fGj8hg57dTTse%?Fi|-)J89hup!QL4eB55z zALA|MYP{z(5tsFF%RM<#EX zuLz5TH%zpyl)Z6$o+H&y)8%TGnYO^|j?vB{<4LWW{2TJP_|>aV%|QGmw_bMKIw2;$ zcfLye*4;F_8c&Wt04OnZm4wVpzXagjWW@~a+bnl0$NuBE7xei%U-}pm>Eap2R}Ccm z(>$5%kSXN^=O`_+2Q$Pz4YzOue*W6$X0fcU#;rv&-%~x}gg`xnV}|-DAnvfI^uY@; zCST`ebL7vhgZ`+2nDo&Ef)f zHxl_ZfTOZ~Z+aw1sTF{qWUK|VWKjCo^*At5Df@~}9#s2dZl&?S*gxiglGZp+DyGe- zks$@YKTwNcFDxkf#t$7AuIv`?JBw`~U;Nsu%F+EIOhE8+Sg>YTO{VS>9*a@99XDrR227BDQsY@05~F<7c2@F~hK zI}S`7s%kbHt$rd=TF(t+qFg5lGZw)o?_b;K0Oa*VP*FGF2>nKPs{JWe=L>}bXL!!S zKwve!tRnisL6< zn|nVfWtlhq5$%(H&$gm@+_SjKW$Hb}bJrA8>K(Bk-&oc8P@tTKZ?27~gh`tt#wxSM z;&RDSdRBj6HF?druwz(xhs6l!B3AeDDh^p?oz*%{rd_Xik5=k;etd0h@8#HeQ1Au+ z`_z7l7G~@4$?;@+nZS_~sIZXU(?$tm;Emm>I)}Q0SBx4-O|y4xIjD&Q*OR7L30WZV z=d#TMzaVNW^lv7qX>d1Vu>=*am>qeYAPQ6)fZi80eX*;0xvQUDKu4xOy!ykMxPpy1*1K1U09 zvaqh^;|x!bmWL62dgNsHp0U@B@Vp)vG>V52ywi*|(Ub@Nu>ve#Yum!6q{(Rf{~@ve zAc$VnQsowvUhW-1)!@9tGd5U8mOsaaVHGPPBW0a5Kx|+BEg-+O#<9Ya1|O-awyR4) z%$+a?YbAVd?{K5%*k|f|1X$nI-V8}dul0bT%}ix8MPwG4W$f)w3jX3LhpRt<*pAy< zl<71-L$6;35MMwbFcSHqcl>bg3;WXCG~7g|?n42DK;gmeLCO3i2>{$h|JpG#6D=%* zP|3&m-Mslxnfxu#2Zyt7rSgA_jZcsaZRu+$F-SvFQ$>((?4H5hvl!mcp$tD>+XS3a zxQ1dyDZfb8yrSo5N^-Q;5^GYw=FyW+-S6N-AyrHg1MD7mvSem)*v5p05(QYO(vr|q zCRk$5+XvNyd!3@=X41%?JK-4(>Ss&#g5d0*VIM|-;PVRnQ2vdrCh$Bq@P`~x zabSXDxj3{5v?lT%!_O^uyXV_!+?veuk7!!V^SJURzOIe!-A4>ulq?0~&xv z6wtPDYVSL&^ux&BFBonm9422rrL#jOS3k2zQu#|! zpAI3SVSldzn~+hD8XA;}Uv^ST9}oYR(b~>n)IgzB3qR9N)%mI>3{1+*B}aLi4SS^< z;UBJn%_HG532wAKK1?JMl_eK-kin0a=~r9QZX-imX`lKJ4>*$z9Z~7$)by&};{D7xu+`fdh?3}I@4mUX z)yOyv)I@9Tc0WZBgQvVhxt^zHDaB??&=~|FeTBYYkXABjPxm&6NhVuVYbOtKP;lKF z+rg)o3^Negz{J(i>_LYmGM<7mmjIdwzL<{X-B?dIv(5(l<7FBJD6Qmu3bU_%HBicV zC&yI(v81Sy9y1o(aIL+lTa0AAZT_mdXWVLYHc;E+tAT_!i|L6^{0Dz?p#5Ju8-^KP zKWU>4!1U$ak;gg#6+LC0DG|yzV65dXJM>}iPr@&n5J*v)S_-qoXZW*XvItt^hueq< zE3IV3_>pefZm7T7oIA0su%sN@0ShI5hMbO4cI$6QHHnHyUGK2zw5olW-thvX?{xH{ zLHnNF$H$LUQhG;^IAmvmG8GX&!Di#BIH?c)(U0eOAZrIQU(PKuL+#b7{tAQE_x0VQ zCU;LpWd9!gxK5b0QHr1yW_yYv-4;G{q|dBn_z zM@?yYYYj3+p(U|()5ho6lk4nzGS4)&{bT=?*eR6K<{??3&DlAJi}wGWe{b3Ht`^(N z;vUiL7*;DwX~Om^TPo0+;@EX_FbnT?8ota%dNjblviRY>jHw`I$f`=fJd5xP@iu?# z%_F*|(siN?$NCImd(wmYM{zrq4Zqh%ldnTxCKaLe3oqAqxsB6?g^nYfAo}w9o?{6j zgx?l2X_L54BqK$6yWIZ|pXu?3qT3Z7a2YNj2Ug%==56^OuYR88J65S8N?Lsr_kS*i z6bA`BwX<&&^ch!sS?0KM71D35)@PmMqqI}{SE!?5R#7rfqqz2+UwO!dD_ivTATT_0 z(ubsk49zJ1ere|}qo+5ClR}hZM+!-gfqx`$Iae@hYA(emQouTU61_+dO*^x5f-Hg3 znNRj)7XGrdev7{xe{sD4`IFWtl}vJT$CQ6+!{Y1gSk#71aKl6fN!gwH=J4!9W%VRE zlOG)Ot$W0RzhWgniNl!9oci_r0#kecqAnumostmJCt83qN-|uRFn2b3e*vD#%Uszz zorF!e7oO~wM7*2C@0(ZjuQ4j5Sav&7l;z;#(mih0F}w`&x=oY_Hir%39z(&zKh!D~ z#$AzV<-u+pZP1U+!*1gG0;HYWf(&aG`){>>4LGv@413NBt)s<0cfCUp1M!Uak|WC` z32VM&vWPfg`P4<_5eJrNvIYd#V4!AIN%uHlQmHSLm%hDrw$)6%eW_|%;2Q;;KV|oT zNwYqE7B>a2EJ?Vb5g>UN-!=CJsg8GNSld6i&!B{$#}+;*Mij=0Inxa2aF&IU z#r0%u+xWFdxup2uVfitEwg2Dh(I#xuTo>>dHRD zqSA}9efE?5imkc|rwMXdS>-oxX4)1Mb;>HV7l3z9N=nAY#rQZjO^ffAbAWVu9Xt52 z>ILwR0M&xTkVh=Bbd4&o8vwWYQ2uyP6#Gtl|1HX}Q?H*<5IHy=?-(p^ub_p|8-N)_ zC&z@<+{EVil|6bf4XJz%yVWx#q6DYFVe}nwW&tEeNz0F*%R|(ZF$0QS| z-D~dsH)C{~tDX}y=R9VTn8+GYCP2?43^n*Og%g6!b0ghMus^mm5Lr3V{F%wH**38^e3T;ph~SJW9v#Aquxc6 z%7Ei#6>#g9)lt0Q6Fo;hA=1yV>e9_bg64P*cX1xcaeZkg)>0J5h3kI$oje%(HFa91 z3h#K=cKHyq@Sx?{b6{6)VkDR#!4AYBg<2Pcn2ko8!?serRqpmDe4mh<{gjP*^>g7O z_SqDxoNAXByhSQS+q+>#SFSM|3?lJ?@(sFZVNo+kP8$k0$g0QA#vXLB!ePO>h+)`r zL;gq^W6Lprninr(^Ymm}OBMU$zG+-+>!;lJ-;g1Plu?zp=4co3LN zX-7Q1Bg}9>;0+*lMKG(rgTWe2x3%?G3j{U4J8f0d+399*Sg%N1ZZIrqt&bG<1eYD!nN)VU6Nq7Dg3KbDw4HEF~03v)KA=e zaBuW07yno78U{%HwSsl1f3!@KzM4iLus)r5EN!c;#DQl>=tGO`!KAm!MS*xG8K3&} zpF_Krhb{+Wc`;+8>yO2v=-Nh}j@F}Jib*5gVJ$J)!7_p9U0n@;zQu{u)L<9d?{VS-RN^(?1>`Fjs49H9hP zK`0=_@h66E+nhKyJUz+MUf6u&uP|Op4M%OM_*ebpz@m*^{i<4d4~2;VwdqAb70oq} zGg}wQ9~otmi#TmNb?YR*f`bm2)o)AqUn?l%3QKAt2%!ewQ1qzhR(S~s{_DVomnp-c zQ&;P7;B~Q%kx#ESjD{ss+!rz(kS*vOlyAv%i)&quMn><`l5JR%WtuS_yA`1vJ+Bks ztuUFKpPpUaszz1EdD3c?*4E)2Uyz)@Bnvj`9vdSqP&D3#)L#m<4>_>VA2B;_|HUUL zQtAliSTM6{LbR-wHrUxL@3j-`{lHn2jSrQo-2%}0$-d>)$v219l_0$8xD3PK!Gs-! za^$&?g5Q;}LV+kYE0?_~&kjCD6U88e&SC_#5md7(J9x~*6zA-~T;EZ1j4rEDPQPpU zhkIp;G%9xG8e^+GR_(TWv5B4kqfi55{$#z+@SW~-;FV zEUvv%09qu#;!-b<6Y{^i@?oDv@A(2hNnzlW3+%TrU5Hztv6CEsO%5TlFOPZovl2vo z|NrSfwe`9wWfkmRw4y5BX*E;-p2}P5PHl{1cn|iE-ckuNFJ-Sv9g7nfsA|8};1E@crx2$o=%?y46wBUx_4|>yVd>S2}&E^^Tfkd zVfId$m&ArE{m*SUUUuh@Hw#?*!MDi-HzJ-(rS_du>mh##=$6NelE^Uoq45Lt{>Px! zA$5!#_S#x*0nomE<;LrFfu}>%Tf6?UDmgJ}wy7fAU~s@IF6?F->M?3J5+!Hl@qZcS6P%U(%eu!O_nq zk6sD=r^?*+vo5>Y>fxq>?X-Wg(kZXjo7~1mgsQQ>iwp5xLCrA#MQG2kFCz>sSopU| zrPBCaa6u8oWZ=q%0|Ud`hp zu>>s<hKU7K0>T%Wnc{W^AbIpj;YCnN-XIgBHMxb^jjvP%I zCvl8OVAE0CIAiL(K!{uD?vVL(Rn~rHY4tu~iu<(h6o1M5KyBH3RD>Zrn}mOWmO1IH z|Il|vpFcIiXI)TY{`}B#XwvE6(ymGFRNNP!21n06*R#X`>nNo@vjf!oQr5ZB; zrtV%hy!2Wnu-6`|FhCI4f@6|A_7U+z^-e2Ev~HvprW9_?{XRD<69@%*oi9F;4dn%K zh`tg^l+*gh|Mb&+ejVY%CknHgbKfneZCKI<&iaM;C?~B}v(??h_v{AN%G%j-o?0x1 z(L>HHW5briY#dQPEE+h zaLLa#tLO?{0G{FN=ciOtyEs$PQ0>jvBjFD7e0*j#7XOHvWW2t1`8J#3m8(_K9O($C z#$sRuz|Q7S5Avyv5m(+Re$|Wc4Q)yF<5AYqE7p&w#`5TfM4gdI(P!^yxKUhv{py=h zVNW53PE`J%R^7YpcB7pwHY6AvoJ8fqCrjB+6PFuo!*lr593^CS&3NvNo4O2FhjyWF} zrGOiw9Z`w?o4+ftM|{|6BYB`LS*jtsWgu1ZTv=Jd*EHMsACkp4Xy_A}QZw)*XZSN> zXe8VAzNiheWKgj=bP1jAA-IrRhwS$!v6SVxK2C#28NCH0Lp%o@=PpCz*Q?o`KpT4| z6vI)Z0;B7CE?h6^*SE>5SwGaH*VPc|@Y%nwD{~!|gnX=5Zx7xJz&CyK*+1+mq_k#u z5F=T@!H?T%G?Dp)uD(?hym%#I{`b~l#ZAov6Y=Z9P%BUt zAyVH#zYy{?HpNU0lPr}+A>#Z+v)+KTwSSP^Zu|Ne`bRlfj-PYoX2@+o=dP(zz9(yc z{#F0Dw;@Xcb9en#L4kw*_{7PhqiW^)ub+B^WRc1SfuJtD%(1HncNQu;+BSl&@3n#z zSF^?9CSay#J}kVdmfJS+-FuyS)9UBdCWCvk?9e56MW!A;BU~5$3lAv9y+v7gUdl>p z>F`|G&_vN2G8J7;mT6G>MI3os(iQ6eQM~S-FuMen4X3PqrtV{$BR%|K$b^OW{Am@A zbgXnd1J@MEX;6K>`e`DKBdMqShF&*qD}i!Gwa}e<{PLokN$lMaZKd&I>2|H~TSTQ~ zlD#l=#9B|qYYAbB7`iO{E$m14eHHlEXb)M&sNOXh9A$%dr5HBL<3rYaiBYijo=>px z-l{*?@&~yH(S?U+F=_Lhi<;q`WE3&$W3eegeyLhmf~Z{==1vzJug{)Q_q5*$QO9cpF_-IxEI0v}I=%T~zUX0$=L~AsasHE`6%X^n ziiOv@691#`~3cbeIB2E-tX7z^?W^#iCqWhb*s1}!(JXV)2pq;aS&eOYF?lv z)Lf5)ivbPli=k)eoVIGYmqwEoFQc39BB9H}yB~-7PeWoUok_q&0auuLIlG!bvw9?G zos7Pvs#KZXH%l~G1V$UYz_3-KpmE`yKN0LFrCg1oQwz7F^^GU5=OMmNed8?FghpQz zx>-dsqa(0jsvTECiY}Q@j0qiJf&4o^3__7iqwUv%YkPv@%yE}9H8i@H%?RTTq$(f1 zQ9&Dha7L%wh^!^6^MAt^HK- z2joujcna+on&V3O^G83{`RF^5)cx~S5rt#o3K83aG;rGOn^$KKpSz6;9<$BHUIwGO zm~hyR#x^Z4)RJPrjVD?=ga|liBOM!vAWe^D7D;Cd_m>P*BUO_RFOz7%HF^ntqb}$2iE9!40lhM zb#jj8?B=#VrsWak$$~hUW$W>p-Ql_B-Ne5N5EEvQs|%2Jf%>3%hyy1zSoa1}&ZW?1R8 zVbn^$%Js9povhiqwzt<#X#wWpBTIa^WLlNxwbx#=4kqUeKV8*z1-S%b+ush_EEeSf z59=@pF#V}qIhk?=q#F;$4LW{U*eOL0!`FX6?Ug})49tXJ!kt}Fq_?028s=G>k*;R& z%*iK%n1ak6<)^)w_Y7Bh`gOo8kZQ63gQ^5Q4p4M+L>rAdE&e;pQH5yZPi| zXC+;FyMnT|D%1nE?FhlP^e{v(eI866RQeE)>gqF(mmy1Wf_aDB@!x3*P+TZDP1($_upH<$X|^@LZ}=7k&g*-uR1g-Sh&c)#M+KVd zIu9&^$%5E-dR}rD_H2@v0(y*zv8Tw+HvUBH( z+u%UVNsEdp3BrIXw~s%DLppUN;XZOtf%JeZ@_=G&KgiTPnGUw0lV-$-gZ@%jf-bXb z?(EW@ijgR3EPOz#l*N7aJrlHoRRzlUOefd!S5HS~C((RVwG1n`7>?|%MD#(EhDG)_ zFky`s1a%zX4rH79_%uRp$twJJqPBi@`C(iAGR7gb5+nChI$9jkQh=l>P$Z>$LM;1~ zq;%!-i~h3)+UPY2!JS2OVYT4aUCU~nd4m(q(n%0W@NI#41~a&0)-sB~uu8x!EL-{} zZ&~fR!uafxE+OV^?gjNmJc0IssB;DZHDa;3abELL@8%H_e(tNy%F#(oZnID6`-5Dx zuNoze^i)Wwc~P+jWbeoNQ)JAZ%^gjXmp9$-DNyK3kC9K^JMqsR=2c4&@?rJ`4Sz(T zbK75+T5nrR8Zh$B6a*c)$4>?}rpMQ>O-r5xgDeyW5<*6SjRDvTS&H)eV8{tVHBjgB~xb~KH6~4|LKkV7AV)~h`L9nBc z0X|Z|!N$sd=-J9kRKfN1lzHM$OA*;LycE(XFw`B)<7>jtXUDo-S{H^Ux@RLvpXtw8 z#^&2QAMGJ}hL#%FoxD8|Lw?Sx41TUE>J}Xeu>e+$&~VSkHEAb+Zun!PG!y@`uw=K8g~Lxq~hcl^Ht{OPrnZAgYn zArUdy-MHKx+K4EU9rd45w&9pil=T^qCSF&P8melLT93-f5FTmy+K8e%9*668xZL2My;t*3Nm&~1Yz$d{LlxkE=%eEKcs~%r z;9NWo%rl^>&dDQ}sXBL0t4@#l`z(HZ`25dzohwP7Bw`cH&s8$HN`33@J2we(E`{

Gs<#!kDohJ>BCzLn%QBt?crGJhm$i~4c4W~Ps>~yq=qLlZD|3`8=VqoH? z&g&PLbO&9$_6^4-{Qjpfx$QV#ESy<{+|zFpAXS0fs*vueKBnLxX{*HtYYBUGhfvWT z9NtpSl5SexUaUN2yqpiQ@+Aasxm~*HUmRR6^S1sLd~V0LUMm^ou4F3w>mPm_B^+db zeQGF(oNjsT_Da+}?$p1owp^Z6My-1xb3+8S>@%8w@8iF8-x>Eyi0VV6{3kB`y*?&$ z^*tiS%X94!ov3_rDQkfn;L-<)_8bFQG4QUykEAqGEpY_s`a@y9i!DjP~bwy;e>- z6s#r6WF0M1)G?9+AIKt@2C-DYye#|$IZtcUL=|yX{}N2o#~rsAGru;d5_`nP`;*Vc z&N;n21ss;M!DG&RfqPTRi6li$vYhnA#%en|IH~H7Dwmx!O4nZQr;JAVsMZU|_%0kZ8%I2CGQq^kerW-a+7I;;$5bl)+3m^JI`~M6lxBu5#mO zVVJMce{?+$H!B{|^=A))f);}bP`I-Y0KEr7lc1$gGK~YS>DLmDonMPx(#!H{idRKF zrgMJq6oZC=te9on1edw;3f`5;Wvj{6((LQ6WPMwn(nXQx59)j{#sZ}6-$i5WCnfb- zqY!QdBm+j!vL&zJ+0ja?Kmrrp=-?Tq6tPUBQB;$Fs`AK>l`rYTNB9;Px?ObOv2he?6WdhFr0Q)MbT^GNy;bZP#~l zG$_CAIO$;mDxB3YUK|vGu!nc!<4faYJAh-{QW}q)(0rEtqiMu7~$vd@^Ti`H(^XiCq zXGP6K6bO*Iz{QR40&5u3v#3feN}?j$M`cu|lU0r9l45JHIo4RKj&OIloOa+!lpm%> zjyyfBU@NX!@{uWsjHF4az6u(OQwLr=_v>bW_vLSBzKOq-?hnUvs>qW9_5O@odMMAj zuM()ddzg((h;`(e&_B_N`TEAvZzJi#{VTy0&uGGQZDUUrPI@w}u*mDmFYy)=>*a^b zJ-CK=f7K^71t5;obbScnv?$7WLL2;u%X>cZrID8$#y(ThzRCTtY|0Aeg!};R`wEdk z?I(a%_tw3P$JL?HPexV!HS6Ai^e!T;q z(Nz%g7=B{M5ZLzenkVz#=P^2C?3?=eqeJ!)OafH(*?>u!!9#u#iCD&|{3IiIWC3k> z`)NR>XZkHFW^3yn`buq-hj5x2(4lymQniG8Ui=slaK&vwEx-;VN*^n}g$p%``@^Dq zfESAiMmG-GcswLd!C*b3oN#UuH{aex=<+%@IjnI(({bhdYP9$wtMEOf;~1t-Q{I!o znu}mpQVboQ(!2D=DvYZ$kj{064U;AUIT<*ZdPL^jaM6E5yIaz+WfVy%Yh7o7Tc$9q zYvEzy(|xs{lv{W{j8*$f=<=p{e4 zmRhTU{?ED+`69)BC|qd92{OG2A>9drarIv4AAF0I9;p!a4XTH`HEjFKH9p(lL=s3XVulX%{TYbpLL zD?!>wBZGjsHCYAKLA&fbfR_^A#`jXz| zbAKj`V*i^H`dyjbAfi3#N2sxAy~kYIsiAqgAm_=yn0=Yr8rFMbH;vX_MYpR?t;uSZ zMLjdTGGBn$)9)}PtC51$D(%4apjX_-rAk9Xa?@1$K#B-nRYix?i+VIANB`)M{7a1f z%&9k^xue;)ML2+X6y{G5JjVNK%Ay(#!BXW+941;TLSHQZ2_z5vd3v=VF#VO+i^kYZ zcV2^SHx$Y2See)=tyF6+b zJnSJ_GGTU8#G(R3B2r_khv{KNZw<%j>x1n1{L;^nh+s?_5o)(2kL#p_=ZuL1b2|%w zNQFqyfK-)Z#iG)kj4;qgh2D$sHkU0Cu8hF9K?Z_c(mB|_oc%;HwFjJ$d&fTQM(J>? zL#s*K*?~p*jl>BpT-{q$@VrU}zhlV4tXa$_hC)EzEB9I-Ovkhh205?U7juoc(c1S@&k*JclaKbHZlhh;?fz04>qn!* zsXTA5T+{&FBJU^ipsk-#Yqc7(uw_&eoiD_ss_!6?ZJ7=zxL+h z$*(&F8u9O+^4QjP|Hf^jkEmj%y{(R|e`CB&snV&oOlwfk_|>oQZpD|d_xgevR zA)i-HNXx~@eIpH_v%tTduZ5L|VwJQD`S#?2CE<>nli<-`KWO_p49_nJIzEbTPg{9* zgr4Od0kW9(BU{xs-2S~1otuoCue7cYwVJCw_c(+8m^O5oG9itm`nZ(T#bDsA=k7#b z`{n#+-d0OL@QQKX!&2Q>-lH9VF9hCM%Mk?vzDFI-5o_lhMlGw{FxCfjW`a7jNubql z3Pp4NN_P^|%DRVY{bSeKF-F?@!+O3v(8KhyTZge0*J?;no{Kw`8#`e!kG;p2wf9oA z=SF$xt01q>IRvU}T!>jT^rup^GKknwP05BVYsZHK1N9!nC*M=QE;w+Wt|Yi-n`o`i zGty9xMYKME_cDkr)5W_y{iDp71jv&rIC-Hs zA>N4|&P&1!DMG?xTbmKhMw7macH8SUHtK=;r*3RtrBw+roL2I#I#hbN!rW{M{n<%; zz!(ynf@Y%kIi`x}_nA7zgcj)LFR5B-hKFUW5kzZ7&sD$e2JwjJ`G@{og z0dxKWx?mHgrwFS?{5D4K^hR}i54AeYep7k!@tQdgNcYdJBl97RObhoPe$1e}*8^No zneqr_Dz$S#?LH!v`85gRs!j~mT0eB+l4vBFB5WVpZa{6HiD-BuM3IKJeVdNNMn7Oa z?HhY~3+}BCW>6d${;5;u1g7-c%z-l0bU6I4f)SB0_6+GyWuoUv<9VySl$N7-+KaPz zJuVSI6ne3|Dw)Cya}vFr2G2{CxPDAr=fu}Cp}G2o;`mgcXvFHg90eKA@+fRft(bE9@o94K((8Tl=u~)4>MXN~j&( zthI;rh%QPOMrND~Gp$xE@;5PZF827q?5;N+3()h+PF7BCi#Oyg(P~Fvx-j`<=Ya@8=`g>(u(QV36j&=7IC(z zJzFt#4UF{kS>&BMV9$?VMi(QGdT-S_|fF3QD0!8;{d>jo?%xjnN@%fwnj z(r{kH`ggC>M3C7#Lzi_0s`a>gI_(MVdU5D_R3|GQCtHbTGABVgHT&O*wp;?SZn&e5 z6?jOXBJ+G#gtyh6scz!U4B~2hfT+GU>4i3Ddg^fvFb}Bh%5~n+`)G6(zpmk+3C8gn z?L7Q4>>XiqW+3t1aTSvv2*`?exgWe73~g-aHj~JX%!+oIJwM-hC~WfEaZR;nmnmB7 ziY5F%OJKeP4)F>*o4^kn7s_s3I?y^_8q*V;dmQtPPOmV2&2MPJ!-M;Yz#Rm-8j#YXOe+ zWWC05f0LXB$fUoNQNm9fu8Oro2TekY5rwn93Q0TQZ9Lr;RjsJ5A0VVn9aN=~+I{SRsq6TDAJA>Frm{=OV?a*w4Iqtkv`5qlEP!tQJ$M)3Mt6y3F z{-YmHJ$X=+BJ51PCt7QTT;B3O-u>8)T8YQ^J{kz6NIk=HXGgXHgzz*1&~PkjR#%WM z!qlYtPb_cV==bKEe9sK=UV_JJFI$Q9olVl`DKXP_K6o8pX#V8e9b0&@PtHdE^p^;e zC(ZnKE-~|qo`^E`AnP|q19yj3b!z^cB6op6z#v8LDT3iuJag`RmlU;eYi`XB6hvKE za-@GoZ4Up|!v$H;Po$s@li5~g!CC~>3o0>t2Ed{Gmpye^&$TCl_M7gEotxesGP^f* zasQ`L*c_8(*@$Bt0p2suK0vfCC!9 zlfjg}zf!RAY~kW=C`aXwi2e1?>Z#j@wfIU@R;yL6G~6*LX3ijdRUMJzN8wP4o8Zl& zQPN0V7k;%}Ndg%NvMUt;JD<*Oe^U5j&6Dp(s!SEPFblEP^Ron2uY0MMOfj7B?GrVe z>srR6nPPaz*b66p8GkA0^k3=V2+*D-;JdURo8^#P6LA{j5&3!aOoDy1%OiFX9so8 z%AER02BfmM)djFapU>QrU7W;@wX&Wtg$uXhIXJbH1i%@9v_grs^!mJ(Zub3OoD=?q zeBQl|&@r!K7kqrmjq2Wd^Tq9ruBwOc-3oj3s#bN#=)8V;ax&8jK3W6+u2AVM@pach z4-iAHx8~B`k>Z`OV7|~j%1=g<-8Mao=gkWUIT+7=LV=~LHEk#Z;ftp6*#VtPl@_{G zO|W*FCL;xd&)Z00(VxOrU=*Cwa8x}t=Y5KgSUP1&|Ex&ypgvF^|2IkQr`fZ;_KEg| z*t*=zTrsi-G|)XPAuc3)4p+-hDQSNMv93C~!^nMqfJU{SH?7W7EKmef`V6mT(N7Kp zcUssG*va!O9)GGRV^F0{j1Ja&SJ+de>~wIOCbYRKK?bP#S6>fQO2fu28p?zr*ZLCP zL#|5NHAR7qF}OfeQCBDv97^Y{(C33-?FId%&*$B(OKUdj!oftjfCN*mjKZI&5==%w z=E?#q1V1)4vFBIOoo8;iLijQU`JhLRaqjCL&+4Q@>7Whs!Q%9d;T zSnlu`Ibp%eqQEzUxF4y?m{K8tx-{zr6)KFs-Mao8M+e>NmhR52*_5SInzmfEC*Olj z*YASQy*QmjdIWTcjwt7?xK?%KKS}yP^MJ;}NJ-uO=;Yrz91@X?MYnn`L?8OozumsD zINLzaAdxn58Dw(aGx^~qtaEtfy9~>Jx@(Hi{HH$#Y1=YDx?=A0^ zBrUzz5OP`PG+q8MBuR`k>1GLxHOCdl!R3SNPdG=ag0M(;J^W3qEMS8liocy-NI*80 ztAljVkpP$nJo1f|*TM)B8Zu5OuUbONN z+Sf$P(FG|vrX6uw+~D{Dntim`Gxd6vtis$4+i0N_iV0(T<(oM;$A(ps`qcKer9w5x z6XB!GJCrbE4YFoJ7%Y~eDeY^rS%C-rSegh1#n#SFKSieHhJ`B2bWozj8r7xxkw}e- z2h_`YWkDiZJTKg}>~Cb^!Q|5xg#*aHOhG-9S66RJCKk>E1M4}#5sO*^`kpWG`^uvq z%o-ad+ZJnXrJ|4%__KVKf4HS(TZG2@oLc;_uhSHVr03kw_rTtF@55Y*;#-p z9Dwk}A+dYH9o94B4B3~oh974mq~QP9KUmK07nrO!(byDb7SdnJc-yPYX$y|*Dp4pss@z~FEXuhUjGigjV8w`8_Sd=Ld-Kc>75XV%QfJw+CD$J z!Nx{sFw5T{AR!uMyiWeA#_K=OAMKKJLMq2J1*fs@nWdNX$+uEysgU0-a7t2N)p>z{ zY9N=cw>xXT|IXZKbMt7#w##n)nf(uRxio~6y1Rl#llR~DTE z#%%U_>xOSWnL1e86EV!3$VGk`0B2+F`KT;5GyC!=B(^jGRC+vS${0J}&UJc|&)a-l zzinR(S#)mn8@Q$F60sL8-Pl!R#z6#B;A{8lS4$x;BVHc;^P3x)vj%DR3orQv^ECmu zdPkfxFPX4k(l-6PbIv0Zj?fc!ZLTL$Af(E_c|6L#7%34-t{pdNp2gIKnXgU{Qp|Nk zo4j#BHmaC`U-zj$NUsBo8G`gG8M5>exM0D9CZ{b#*@^7XURD7)d&sDzf=U=YZ* zJ5OR0T-P}6V=Tg_Wq|os@5uoR@0qaw!ZyWGU1?ovK$K8X27G;ags<^9z0r+QuVZjm zkLbJD()b_wc}pT#D2ge_bo_pKVqGO=f%NwBHE^VK_V7$Z!_q1HrZHp@+Hs&DkfG;keRXnQjILaK_gU=Dbd$ui(Fe5h-NoLx4SZ4YAI~{Z;30G% zAIwRb+gO6*v_XmrL|*_{4A4$?oz}2NY{Et{?%8ly!4*{06n?c4cele*18!?no7`_3 zeCIl>Dj*~pA+%IE5Us|V9VjDhu<_2HZf9Jv{Enku&4c>Clf$TosAxDQQ5Kbey9oCP zlWtUqih+IV=2(nJd0~oK$<_UD2FqTN&C@B92gvF3L)4c}Z*V9ts~%+q+2NTxUJae7_`4ngKn}q2BBP=C9d> znm(!;L_cOmaE+3UOqUE&u7iCK4+!C%i21~%40|fCCJ^Br2RodL+c6olx2>hG6q>F{ zj)vP92SzNumE8Erh`>tH$KKaBfd4M&vD2HDZej^9KoCR}o_}_^zvK6L=d=sTM=#Qv z@t2Y*Z?8W%YOtJWkdh2pImSI}`g`-~1y%UfKHq2RR)$r~DqiSY6pzrh@#zJ^<<_5Obo7^Xud+?;GS|G`m1!*x?g@~Z!gpd!W%r`k`P1T+hB(xQ+fGH$ixA?J z6WqArKE+~vkJeQ$nvBYLiYw80s_g$bDC1ye?IY>$juT|1GpO03AC%{-2Oe^p~VhMmEachE z0PCClEBeP|`Xi(Az16tQTd`P$enY|99cV2Y8#rS*2 z$G7DM)b`!=u4Vxu)Luxt4MKJs4eK)i+PF8HhxgbuJLek>Ue)`UsNHUE{eZSu4rV{5 zQ-Jr7SOm7R=Fj31G3F5Iym>xIp;V}vV{)i*^`Oa0rJ*+&;KFHkGsZ>gx3DJhmUCA9 zAOJNj+4JY1$7Bucoz7z0DVza1DhxVm8@B~~sUHteKF8-Y$IE@&*Ex`GhctG#P z{U*`$g|ChCQIc4KZ`q6}ap{`W6$ecxsiqDoxw(#^1InxNBxVKfs)ea8D=UM!ZS>(d zDdqOWx#-|Rs(H+_m2-I?ytR`*ani>s|LLE~E6JSVqhX))lM(jEmbhr@dE-8K*`M3^ zF|go_fn_*VF}qn7jI|HA+5iI`WZ%9vrPJ* zQI!Fd{;L4bBOkhOw~ie7>fzv~ZHeajoroTLFV>`~)PUDHTK_9f;lo99tl2@*k9w6h znxW>-FiYPh^mVKM5k%85)s z3XwIO2eZi{rz?Kc2k6legNL?i<0r;5$I(86cT2Pa`L{&SrJse$xS&Xr((Wiu@$wZ_ zjX~ENH+i6332Ee!?UOuB!*gpf9NUS1x7*J5;yNCc_ΖrF%wFm>YvdBC|+0Frb9 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%0D2cl9XwC-cADezwO>8_LJ^6WdbhI=BfZ~xTm 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⁣HUyhE*Ct>B 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 z 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

EXfRedW${lsY*j$LfK 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�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%0DLJup; zj6-mMv=XO|WAVCUzr2er_P$)C&@>(T7x$Gnhu)vK^~qws#UD9u=2h0ciD=0y#d0$} z#pi0W?lWsChJTEld2x7M(Js^XmtFo@4lnz_duSD6K_eDX@_x*&enhRJq1xR zz}88t1h65VH|ov6;c6McQ8I@*mc4jiHwUB3kZuWw)&)!EkzrbQM{R_L!zu;pv{r^< z?5MFbAucd6YK;1El;U~0%Y`T@;zQptqN#v*qNvo6SyrW2bX+)fhrIr-P|SQy3DvZIijsiG8dg-?RW0|4+vi zUhIKcyXP8l@tR{Ap|2d1xDG)m8_J1*)8=N02gubU{Y;rLnDA|p{N&2%gwE|Zly&G% zN`)h7*y(aA`X0zH9c;TEnM&_gwEb_HYhEqOM)mpQznMpWlfuQnn#w4hVi}=t1pt)~ zP1&7&f|G&ZKt_2^1j#C)x7IsOvIlh7Z$e~4Vpn^sd!T-b|FQPfZ*6o@x41hLcc%mh z5~R4hQyN;JxNC7M?!hVUP75@_wYa;qxO)r5DW%Ar_q*S7|APAyc@FcOnM}^i-e<41 z*OIDS+V7jncvsv$UXG)dk49@X$?SUNeW&95KGkvZ@WXL^K#xi zo-?{}YQ4(N*WWt&78=EgB2uNhcmy|2%6H0%K_j?r1qbX_VvMmAQV-SFzf|`=08Ew$ za8e--R&T!2^ZZvSiCcsM9nV4lbYu1Wl)0vnlDN>LUb9cc5Sz0Eh-$(+?5#j?SHAN# zF;MA`2Mb4w=$=_QyyBPHdeiLUA6Ausr8`hY+N%rpN#PgA4g0|qmJ|JKcSPSVB_cl@ z|CC&asV30wiM5*u?{dNh33@g1!A6c+*fBz6j25Z90s^1^unMeumYR*zWan6HJgmv2 zB>AQ2=qHJ9inp5Sp1ycHAz=59aRid!zBW!th1^k9OZUW-e1f#CcWX3n9~^o(-PRcYVas)dfqTMe*_jPCSsMv*&#C;Oru)wpA6|!&U zQ1&9D!D(uwHm}1l5y{VrTP0AO}XVgDc~3RfB2wf75Cca{t}X$*>8dZlg4S0Qxs2QvE1m z8W6UZ$8R9kU9ez%+$9Y6Fb_mg)^KsKGbPBlb1LtEFL6e{b^wGT*feQ+0R%8L-C_-< zF3_*1s8m5B#Fis7nPO+-i8ZTUnHvMOutgi-Ze&yn@KH7VttB{0_iW*RWq_DP-|N*T zXge`#rUHCbJ5?sNtn|R$KMM)c?L=4_?yj~c%SU*0fu8QhPPe2LK^j_+oP6I2nqKSS znhSKucsBudrB3Et$8~&AWK*FOClj>4Nj0P=&EqB+hHb*(ZRJ{xXz)d*07RfJlvP08RlwFnMZ*z{_YV0gO_$=V>B2QI*JHdb-@sIo))71SoV zXn>taYwA&bczBg;4HM~MiZJkHIQqXhr1bkd^ve#Gk_b3_=GNNVoN^dc3kn*xTt)laNV`4NiGo2kIK4qHLE70X4F}o2J7Z_Ue&sO~@viY|thqp_i zsohED5I95j({XYdR*69hxg#nK6hu=WAIk?!AV)v>1PQ$C* z22FtwaA7{^`XDaCD{RU~e0M&tFX5OEY%)$WZH7ZsWD3FarmJUS^hf;VonG0tw6s! z-cL83rFEnyocs{KVVFt`wTQ=qa#&e_DEM}uM@^rClyBlr>!way=(jS4c7o=@z;c=9 zfNJl0xQeE6K@*o!TDX!LfA3RkAzp078h@^yw!*;}*oI1SDj_~$QT;^nVF8@MD_XfE zmY{7t3}Z!bU(zIM>5(SwU|rNPgm(Qa#PTjFqxxZI@gaQouxC-Bqb&gjK#aj<2bmS0 z=odzoNUsE(B6HkvcR3jG1)R*$REiF|0LvTUlB2bDtlC)WB|ir>WXn3${d>Kn#G9PL z!mII7_+~}5IIZQoq~PbdKtd0+%76J0G)mEHId1K-1jmlw*PAdBQ?fq*dxcZj&)yR8 z3BRjU5Vg7uKZKa7w{PzgAZZ+)bLSX(1b~=j-1?{rxhFN{^z2U6_AG&ub8-=tC+ke7 z@2`D$21YR$DSlcsyW}S?Pl={viY?aY3HFs>!WhfAW=*fN>@)zqu(FY2=28&=*ka~Q zV_y=kN|9&Cqq`e0A;fe@Y5Nr(t|oH8XL|yGgS4o}KfmJ^BZiIUo0BBBfYwuLP0BZR z4%GNpeX@(ExKu-^ocL3+s>r5;Yd?Y zIn^uvGzq7sHmm)8^bDA}1FKJ-D^U`L(k(2z!r~p(Moy+0_!ha;(*3D+6|b`sRFmDU zP99byrAdqHWfR(I^IZQm*d(PjOZ>V6V{dBw!d9Ft@8!2Bn6$`EY%+~HW7;W8lGo~_ z%x;mC1{kSy6N%rhB6jNV-Q?OJai?` z+HJA3x2;X+QQd+4h+ zCGRTbs;1B)AwinFW+oj2a~!Xz#y($PSF&5HS{4PGNs^?bXFR5ox091#V*B-(=c&$d zmd~SS%6p4bCX&?=vgp6;At@=6&j*qX!o-&|m6)HTM3>}m&0{uZVz=_FqIGFvhk9X^ znWo}{LZA0?;_G+iS+ai0!AG)nKff?={Wmv5zI@|*eJop!n+UtBa#>adkU9V&C3j>% zu~Ok)R|vP&6tT=;njQIQlfIWZ-V~KHe_{|u`8^C(dEGiU3gD{P=;SjC51pDYP@Vz1 zCk;x!*p+B`PeSU1)>F*ks}}f@9Fg3l;<9^HE}c=4l97^sw&OwWD1DZ~fPzVNY=bYC z$$a0$!XD+T?q)ubzB{M={62ywuJr*ME6l@-FE&4)eJ|b5{%Ols-qq#w*sBw=vBSz5 zS1=V7G*XAm2_f!UsBFye z#g>gxf~S=9x*?vA(zS#O+vRdrg#-}E#B*0wd!7QS6yIXiMPZ100WbS#Ot8A9)!}Sq zlmYG4+Xf?CTE|%L8^y1uB-WC`A6ZCEUZfo-8rf@&jP#xu@bgSVi^Y7W4Bfc8cQG;5 zU}(o_j=~R>&aPdEjHTYgk_9YI>1@fZtw0O0mbDw-kFgna{);^qOD#`@#qWSfCcr9- z=pH>!Nx38vZD8x{Cge)V85@tl+sewpnQiw=4xTI zu&D-3aA9cR;JT|u6{HyH3A#RWi=Ji3)5zJ{wdv7g=kZFJcn8wix{c-fkBNGkP-o+Y z_9J*@@#P<0vhKJKpEXsn-PaT&Y;2tMfhja?-;JsK^)bysWlxy*JkIx zF*hB-$Ec;EAJT5iXtZ`gHHNgY|BS?X!<8QO$vqsBYDPEX-SE8(;aS37*uqLYRVh5d2K+Pi@4oKCj834&StyPZZD&9{lS+$#ONHOOdXZ=Rl zx2ki+M!S@h!LH0w8&q1G4QL-vyT9AtHm17A(FZ4lF`?)LJgQ%{qmX9AIFZ`>UI$gS zF5a#hNEEip;9^$?=`Ld;HKr&G?+xQg7asguU(A4pnzMI^xOO#$_UoNx$NV!31?7OZ zsbe9P!HJu_Th=x!oe3s`B$K?2?pIPAauLVHEWaP4h*wh=k zUc3INIlJ&!tc+4t-?j%{g-S=siCJY8R9v?j_*W-o2S3kw{VL#MIrGeuogj4RV2(%K z+p`gg%i(^O!rU>Z_hFX*UJ96`8;V*8hYLb{bapF4TW<%8^?zQTtjveUV@@ql78;@z zQHtv68!d5BiZWe&3GbH149Lt;n_=!A*)$rW<*HopJ7}Vct#A_p4AdS)!K$`M%tQM| zJSiz<${L0^i*ilRMo6l|xAD3Si6o>-ZYvQaJRebF2tc10X|HF40Mi@1j-F~xeg_UN z{z1DURfJiy+OTi5U$uuEG5erxb8hCV*JU<=4Elt8qjv3D{2oH26xDx+rt2(H&u5!j ze^pj=$)H6$dZH#{)ADm{!G=%wsRNB&dv;8;pzTX5vp-Pp)j*zT#ccFb6%VbRMPy=2qmYNvN7pRsVcFW`L_g+{X&j@}Q<`G|_-804DZrh#3)jI(xhLk=&Ze@G2_~chV-|B*=#(X< zIs#TbTTL!%T!gRJ+`+7@(WLu6hXUVf1>fo@r>FY8ZxaRqC;#Do%HL1h8*j75jFIBC z6&ooef4^UOZFFAfny%=qw9Dfo|>K4;MkFqQk$K@X-soyoUacgky%f$oYIICB6mS?z<`>b-h%O<~SJPr~IQ@DT8`5LI5&;&7#*f2z-k zR3Ien=ZnOF#P=#Fm;oIU{ROQ{E&{B3>Bl@-4uxkN%Ib1TSqmHJ5J9e=!jM+_g$RXG zm5+C6{ZO@bBP-g_-TEPwX#${250-@XhUNRym(l#b{*HycvWC7X%V`2$jaI8T>pZp)7Aktok%OBdv)h4(!+Kc_T&3f>`>0Cuk5%ypd#MHhrg~zH(ZEO#(myN z2~kfBtclIB6@Z8~D&#eSXGB%*pw1L7-@h$gj;pk13kx{VP{piH{Eqd1a-FVU$hi37|c9vS-;Uh9ZRCXqH?Y9__V$Tl+eY_VnGB zDE{j(A%}_zE81z6?PvBjqMKhJ@14@|VN@$`JybQXqq{4FZ4~s#|3qJ&cigF-gY+*a z$}lxQDWd*S`)S=q4%m!((k~ZPFqPMg3B55%N|@J*J;;9(?eiJ(JSF+Y%fpW{o0V|{ zxf?f6PNyV_%H`R1UNRINbU&TCTCP0r%QfCVVjPn*FvaWeHqlBfQZESbEmg8HUtfoQ z;QwtXLDn^-5@x5yFV-EC15cSaZf)Z{vm9>+MDl_>wOU>4ioW#T6%)}6cvJy8bD&q zOj)Y5+$x)8*1+Y}Ld{kKlJbcTwdsg*3N^;dSslBA5x!pwcA{^@nFRG4{vOx=WwG7Y zhUm|kA5c{O{(!K47{va`202TdHtd{%ZH??4EIDepc{QkODgZ?gLI}PTTIWw}z!`&x zwNQLhWF6nkpyc2;p$Yr?9kwx_fMh*Z$@urcvHPZHFFSSdZE|Y<@rNC^>3Z-dVwn+6 zVxX+!{2_z@0#jWm|Y$SG+?(L`g#w>u^I zU)rYtGXAke{%@$GrTd+sl_X7Cr@tvf>@PqbUi@U4j+X!mV5p2u-{(jyW7=^rWSplm;hF{~*rja1ZrO-zLu zgEyP>$I0^%v99T#$OL)&9b&a-;VKKtCS`eN(*%%?3wKJNUfr`+xq!{|EOx7jsicKm zdz!5XUIuPvOU=37LyJO@e>>N!?+RbDbJE{4lxC&G-WeMU9{!OEPE*5g|MK6R-&$D}J3~02e{B9L!S&^2Cg5cTRc#yY{d3$>;Xa$d1Va#Sz*C1qZXk zIW%I#XIr;|9KBc=u#HLyU0v9kXJeywUzJagh;70A=uip|iue>WG;T9~O#(68nyanxHTfY4veMuH+Wj zLwXiTMXo}9Qb_%gpQN#~%h*2x_A%AMc)XroR9RaJ6+64BLT9C7h)C=oQKLtD_1T5F zww;sE#rx7I)9(QN{J33rfhe8_5cas#IF4c$tlAiZh$Az z`>$P1Od#-8pv8CP$K+1VA>+IMqHPO`Z6xRRE@VJ1^_zYy5{Q=8h;j ziVde7jld!|r8!fV9X-@NfnwR+&aYSQES!PCxEWhd;dnNcgy#boqTh~Prrh@cgx0(>4(zf**O)9+MD~9VT@x4=rlyZ zPA1H(nj`aGm=Pz}v10+MQ#@RweMH|ahW(XngkM-gi4ZL)7J5Td#~bw<19^tly2;ji zUOFDxZo$YyL}}~yuIbt~1*~kZz}g!8^%Ca@bI>?jb}rs>k&U#d#tZOY?#+LJ-9&=` zlZ%AiIZfAthj|WFU9Mu6oFsvf+8x??{2rWrft<19T{B~fgi#luhVu2D@~a<>7*e-? zWh1HB0j~4A%>89y0rBb!4^tMl6>M+)23ug^l5koITBPO>Q`Ju#f%Qp!__?}AQb3jt zar;Y)#y;uY$)utL?`F#}T5uV!5bdRa6n*<--vo`LpmcxCP}I=#?_j}JPR1KBwd&eM zT`&4HA`uSdJ27vNUXgFG(}Ve|@Jc#V>{+<6?tLA`_1jNsb6uixvuZ|(DS7nF;Hp-Z zZ}xNlDseNc98dC_(Cr9cLyzJ~38PpC2B%Ep6oL;pRcok`{lu=e`jEl4(w~ZlS(PFz zHG>SQb2kj?=l#h)8y|py)#=j3K!q9puD&PmMJPCx7g{5|A*h^Ey zYfur&;b8aqON_T_MFAV+>R_;w?BbTYe^sn6KA<|Ov`fdfCo~j&Amr#IT9G*k* zGO!!tAYs;8a#vrp@2Q<5>U;g#@m68g#h!_fFbuB~4f2$6^4h_yELEWWlO7SJ^maE2 z?!v@KOr{LL@sgcfl=1AQ)b0(Xi^S6N_>}n~J*#)iw-5i-k9Nv0u1#v_9ck)ho{A2D zuaIB`C5zzc`wHo3Kz3S7WQGhWJJWVh^yGUqwGg}^ViD!rDp~V9SV?f-&W|2}?3UGVxgQ()ryr4+TUIjj22@$Dxnq0- z6gHuEzv?+02%z7Jc`q+4Tpp;P%mPg=59WzfNrLD2J{U#&G{3Fs_>M$Thp9xTdfYJ* z1>N#OckyU#xBh<){W`&W2;OzekioHbvGVZzU~TUF-zQfK2OKeo03(?3zfVE}Li}R? zZ&*m=e}^R`82L1;U2Hw=7{!D{fk8b+J_A2DYeqh(wuOVWr6(hwzL$mP|BR?Qo7)2a zcw=t`94#Qi&&a1@ZEtJm$tVO&$EWJzY5l>?)ydq`8prd47jU4wtCQ;oeK&JUYexS6 zomyYh+{2MkOql=wo=MK$(?iGlgS@M=o2!epizlNfBcGDJ6EG3*_rIAGtSw!wtZ}5I zaQ^pu`68dL`!%w?_TxPN=ejZWHni0gC4n7Th|kX*iHt}QS#k2MYTgUo-SHxKxdJNF zywpw##U3vA7-~fpQ5lh$pn#&o*noiFQz7ua9n4wKtvo(UmT7+!!V3 zN9PL*4z6*o|KKnZxvy@v6n>k(#(^EaAkwJV6DVLAK_5TVOg+XYAXro4)rp^W5O5HzA%f=UIgT+^&I(luz9A9(ksrTBgWhJzft7q)&_b zg_j$(j+uxH6QX$&#-lwkO~O}QDDwX3c0HsKd_lKb4k)3@Y zDmRG6o14a&5?ak=HZ8`)*PlR@%4Y{JijXx>-(mIzl)$lcu6fwS*B`)@%9GDHM>1yD zABYoM@iRuXo(lJ`W7a!SaB*FSZnFwIFmh2NofloDw)qP0)BnVp7g~D&6Fw|eDku1& z*HbcyubUGC>`IJu{K~&t1JfU037xzcaV!f45s1@HS#datYABDs2?>#r>CU##v&Hrw z2cg6-l|9p;Jp|(;0(C1+k6)O5MM@x-im0ENVJIubj)xOiPbxKm;blcej~#yEh|P8t{H#VZX(OHrK9CuUb`V z^T|aoMc4`ivUntv%Z3Z`4;kRe%Semj-P0Oe-FN9=uI&WtI2&f#_x{rODxEOei@`Dt za_5CXeK{Vtz?3y~kAJR`Yq=P&UGdRO51Hm#kEh;g;=^IKQK{J&wt9oVZe1;%v%Kvl zfFv;3W&bSir_rwZiWt$nj!5Ej)fDpd?|&7&*_69XOH5ou=g4A9P%GP|#zcS%yEbXp z^6^)Qt4J2LlN)eCg+q;#B4SoSDC0xyG1ON(cXstE$Tp(flDa05q`zZ+QtA|jJHBlD zc>1GuvtkI5e({c+{PT~iyQF*X=f}m(i^i+EU%pdwYzb6tSh9=N`MTzQ;}r>;j9mUQ zde@8&V4xS(1;o9e`0T9|v47IA!3}p>y?0igAJx%bq+LteBv7{%!pP&3GhRwu{`MQG zDZ|ee1U1WJA&(~b!<$-y`5TcRCp?2RQ z@WSomDGyDY^fG2qQ`kv_k>j^P-dFYV)5vM@fxNBM=4isxqK|y+Al(5^fd!9WnvU|T zhd(y%+nTZro4>9ztgut8w=%N4B037)99;qq(_88#bX|Qb1YC1Z@47Mc$LXdNOiBL$ zgp5Bfi+*DJ=6!s}-@37p2=r+G+jqD1i?)gg{b+r2DvUS+rysu>!%Jkfm7dL=H?A2e ziJcSS2Ho2Yg#SQH! zq8Sr}ZZ(^mVx8LD?ErPWwSuQJ&%@H*@~}JO{VE0Fc~t(8$&EQ(;mDR{hi0ecIs%V`BG;%^64)j3RN`6z1n3e;UzukkdP+>cx~U6GSpmXCEG)_I>bwtb)EV-a!BrwsHVSyV`bfQ+SFO(MrMJUw zT)ceyf7TJcJ?jI(_#z(eZqic`kx?$svRLGFku8U79@CMQuy7pl)uiWhWujMi6*Q4c zU!Hx|P&?wgZ1Zk2&xN7_C(EAJwy-lvA6{0b4=zbqk$(-VLJh(D+#7Hlp5Wi7{IM^k zDqQK?QrX9MGTNzOlezQ`%?G0jo1LZjC2hSZR`=TYJl&SrMpAT&j1Oj^=pq*x7zO+) zM7?JgG`BMhyo$jVxgydALR{zpsa@xo*U}@Dh$DOJveEKjkX3^IoHF~_Hj%=KTk+YY z+V*Dp&KQ=O{jbP*_#m%9h~ifdVDa*m662OFW^^C^>;5MLPiDlkE22ga#;$ZkjMcGWs zpg%=05iA_$202KbaAev;3eOblVLou=QFfj7nNHk4d40yW>ZKqL3;eBkg0r@ODR#Du zcq+2vRP3nT>?Cq7BjodlQB=MuvBC z&Q;;HlpP?@=Pg4@z1@O`((bl)tE%Krgb&8%hyJ%^4 zs(YI)POEfRx6!Eq#kejQtD4vm-WlxMPWP)+5m{(&2#++vE~}7LQUC%o1K(AWwZeP` z5hzs20lY<{6GD;j=-a&xOP4t|F(TxTDTkBb}{Qb9k^OScuF2#r|>+S_FvHvY~Q zhfBu|qF9A>^`w|oX1!{I5#x5=xhZ{Mgt}2>Oke!%tNE76fQ{&pQ^LYRbD_5Q>fA>X zuSm;aR_SK$@O?0^WbM+0U`QPm7uLm8ShHA2BeCr<)n3;rQ}vXDC2pbN-KffYx2q34 z7heIzJ{POgmDR|w9?eMW!#O=C#~KVQP@spOedRR4o3t13`a0{X#X~g{k|JaQ}LZn4+ujt=7@uO(?e#vZ;>ul_?=xOTgoZk%eCMVy(asHJt zBNngns+ViXIEffXE94c|RzOoLwV6lgpvI7}g2zoMu`H^{-`c0sKA0OHu@O5}JcA-u z-X&#<57BsbWjAgvoT#4aL{ZCp1O+WuBnX$rI~5C|`UuLB2BpHJ)H;r^2jpaUeJ{Nh zzFmIGeg9`gTjVMR%q;w9#Ezz}M6nSa=0Jpa`0=%yhNe2Uo^-d|lz|iG^kg`Q`~yFo z0%N-v2?TDWU;B0{?vZXp1Xvg0Qr}xrBWBE7Daza!&CpiAnEstr0oe^JDw$mn9MloY zfZnw@7b!WAoUo?JLI&5l`36O0*#~)_zYFXRUj8`9ixjK|CdkJ?!TrcL#sW-3L_}X^ zQS3Rd)8MjxI%Dd#A8mTOGwrF#_;B$Bd%QW}9SzTqsg@R}D8mVVl1_uR@ZaxztA|ya zGH=eiUKV(O&Nolev869laeXabLi-B|Lh2d1(ia zd!+5R;)6SIdEA9W*nDfjD$!be3 zHA9PFEb;j5Da{Rgl>a|Xl)i8skf&^g>LgC@4&5y_CK56Wxr^=eMlEnUm#!OfyEpG| z5IyO{zLYlPsXGMsh~1u&tKtIZRpHA6?*V(W&c;UkmA~473{I~QBZ5!O#)9UmW???q zy>f0c_`>;kH)wCq>B%F@%NlJrrR2wtu;3?aZLwsHgjgw)SZbpok^4E=>e5h8$ojIo z1%DA(&D}>ytgkVZ0(kuV{KSQk>N`7MQ2U2Y?5J~3O~^ror5okoJ&kNsk*A5e*^zLa z5a`Ck(7U>>gWLY-vmt;gLinS$LlEAzHI~$QGAPof9FQ6CtBu4k#2%7W5ah`?Bd?Sr z8;brGiXXLzn#K3#fNeQq(582FlLYs(-xW>w03ta@*xM!seVP|LHfA5OpQ+We>Tz&< z_9I)!-at(87p!k*luwji$^ZUaC%Kks!WNY055dzC>ZN&`JSD>U=W&$3@0{OqymU+O zGksSqe_l}9RDYcE0o40s$0GaVp0GsaSq#SooeWb51ukQ zdqa^Z%p0A{2U3qF?4VYiMKy`*P{uop&`d=MZ4JO8CmHZG&}ati8B@(_(HDEV+&3g z$r~{e-So}2WxyLPu9%Jm5hO?GgqF~^T@)C46ULUZ5d8nH>myRdi&t0WVQ&y)s}oHGL+h?kH&=Dl8)o$JA7(Y4ukje4ksEg0WT{ywQqfMWkzvzb?q`o2J;-x?rM!+<|b zx2&fiDRkqexLeK=f0883lUTM(x6YBhzs!8rCL3&UJV+?4 zTHO_){qTl9BMk59E2^R>0dCI@M;bBiC9(jmdiLwMM!D=rohlQ2mc}<|ad=N&WkWof zC_+w90=kv&81a+DKE=ZsjeYuf12>0Rh$g;|Q{^#lz~oiZ@g$9!xI;V4X>_>BZ9n%# z3SaFn5=Ta^ZX5NJZw8#nI%F9kjX$A^kK5GtIx)}P_i9m+*YE0u%Ui>~m?Nv3Lw%@R z)Y)UoUt|N(6WOqTp_5+G*LDB88yEETxqnc|V$yfr~Z8Gp0y2UuGydV|Y>jU@8rgN1VdS%4T&+rNCo5Y;|DA&~hyq9ypoM z^$;Q%3o9A#EObfqg!C1ETQULh9bBiRnDO0^eQ5bMIs%5k2&a%P$J5tauu6Di!93Ik zJ4(+DVdJV@(A)ZrhYJf_ZATzSPN4;?K|}ETieaUg2-7?$0aHeQw9gkY+~OGg5@Jng z2?EUCx@JBN(u+790og~ISBuh0Qg6%oBC{_Q;q7X+%v1~?shEp-KC~9^_gnN^D@H(@ zU5ZCl40NXdyiu^3&BDVUU;WyJ8bX;1H(O<8aWndca2F+NNwMfSt3fOg^%f>^O{t({ zWSAZ>#4DxoO>_Un?K$jh`1C7@l4tj#u# zAU?A}D*@8ekCryE27)f21Fv05t~P=3t8u=9_i*L2!(kn#fj(H^(>@>9%F|J?P-94W=kaIPN>MA(@pMoMsQ??nq?x~ zz#0bMV#6M;={8XTT%&UgekkW|PrG}H(RtdHD)OTjHvNpLBof4O=!51bqZL*AY@@N| zNAJPndpL2EQBY^@5+G9uE}{6C3X_X~ZjoB|;<{pS;F8azZ?WN$ZwYHPUZu~g!6NMx-hX*BeYiom~H67mb|2`o&6@x{q6 z^X#x3kxxgMtY&Rnqfrxm9?>eV0x1Sr-s6N%2#|sJIJ=L+6=DcgLy8D5nC<-HNv+jL{^ z)0L99DLPf|AQkoo>inqMO7v_ZP|Nx)+Xx5+*CmX_NhQjK&KqSkgiM7y2E9{8r+J5& z--(o5(r3y4Jb&?JZV%T=3_Co8z$qqj^CkOUIROk>&qke#>l56WV+MLZhe#%qWQ0&s zp0<96!WpSrADj8tiP&(43XGg~rQrYOqT26hh~4rq8$gNx^C(+wYk{UwNDKZNSHm# zcmbD0GwQdB8zWXrTF77xyB3b`Xp;5rkXK3V`)&ein~YW0=Sw=DwK1p$qrPejlM%-mp9>A2i9_F8vU%A~i_He9MdE#L zL#$^uAA$a3K!H1s-}0)22osB?R|6|?SzV0P5RH5gZKK=rQ>tNSKM0Vy%b0jjyt~K@(UXJ7x0780SCiajdOJ zMfT5L5qwsK_kYmjfKKsr-%X&u0yk_OOGEMBbseZLHQIlx=>7pML;=hl zh=|rzGNFvKLaFg1APY`{zXEec2?&}jxzyl?46kL+)bDL2~@ zG`Jd2a9c7lvGMuduM})5CgR^kzxGOSqDc3tM*XtjjT)TS@#SoUC4xe$s*T@pktj2)DCVlxJECRHN&ouC5$7WH;ogEW&Mx|K3$@!f&+z{l()=1E4Fi*~JPIcApuEqX0 z6}S2#8By^fs_fKv#7m(`eA-Q@+Qkr z)L`pDqxK{rw;~C#)-jD!bF#MBrd@Lvf#O-&M3jH-#X{%r4Y^ljJaH3k#ns0~>YZeX z{)m?_{Tn%6u+~gfxJJ#106rr&(9=^Ze{xEq9zHRFz+#7whRC3NfS5<4%Cggr*U@eA zto~7oEUy|+N?`NuV`fBivH4SP`H!nMzw`Ro?Zv+BzdZQN$+yw6cF<&PDdNwJcA`P8 z3PWO4HhTHV3UQdV%qL0}VyM&Ak@;=3CAO!z1Rka^M=8En(7E!T2{d&?ftfu%L1Lqx zI~1U_+Y_+&<$5Wm0B z_4!3WkeSb{pc)9Di_SWu*udg5M);LA%Qvt_g0pJWeOlO1TP?3=%bmN=Ezj_#!O@Ac_vM5RKEKPbTg>% zbNFR^{HQO2R{WmSPKmgAN{8#hzP!!F*eYXPoZ+?Q+1`2A|Ev=w(0SAjecAO^IjFzh z8dwAI<@sdVZ{01CAt|QJdKwvfCGf5C-E*UKmT?e(Erk=-xrPoF>fHST*--h32wH6G zl?bSFl6xQn8}=;t`9!KgQl$U3^uS(g>^^IHx)24W;tYm*UkCl=Poks@^msFpPeyX( zS-9ZmlW*BZI3R=YSVn3!zF=c$1MN(hU%L*Sw zl3!p2DxE;0M)OT2NjTPji>y!gRFH#@*PszRe$vG40T( z4Fi(Vh`~?5&vq`DD)EVOciY!U4C*B0^r#?Dc!^T19ADG>(SKo2E|Vn7NTB@1zz#EN z+72g(ld}LOHhv^Md0y}$Y>=I~?0qo5z3(CZ2^5E-gi3emRaZ7!A(@%nq#OOFx6)je zzJhHk1>?L<>9bIO09wXuElt0FegFg%AwRy?=@;79YAi#tS(KV?;q39GU^YAPo#;K%B<*xmZwV##Im=eF^3o+X+F zzie-?q|l0ZSz*)Z6#aW%5refa7!x`bRI?4UA`4v#-`=0Ji=ZD%7@X|w62VjNk2FKc z<&3oCH|3e15Ep2J3rqwm=`EU{j4EQ#a}eP^X4ygT#^AbnF=ZUskgOgO@yq$dXs(xC z{%t5U`4TvW?Xk}fD9Cm!8fs2G&7ZfRvB{nB=X<6QLu?=M$ z7pmYf5>yXGr(xJO84yx0#~$|`hd0h{T$;Yh5Viu>M&LayS>6xtR1F}-`>(&%JpW$P z-8UCb{eUiNuBu=9@#qc_cljgT*euM_dAD~*l{?D^Hcy^m_*sOE14PHoewUc~sx3J) z@xx>UTLSjRc!Hue)fWQf;iUbMX$ub=`a<7F*tXiYv5U#J5$v?mgQ{vL10Xc8?RLDFDpzdINndD56Yu9GhVRr0S@Kf#*z z4HPBkqw2ZrCML25!Ld%r1;YilEZWht=961F`Vy5IGXUR^4?`d&Ad0BpggDU=-Lsxuz z|7t0eU|;va$u=!=-~$yeM5TBd&I4wJg8THeFyH>Lyx$37(2B`?5mNr`r8u(OmdV|S zc4DZ8GL(M$+ZgDop)?xt!h`Ao)myRKw_D@pHgGqP!w#bHPKNg-zhr|@Xfhejb#LLC zRLN=8YzHVOEax*vn}N0t|joZl5cuT`9|4t){Y1V z$CGZR|Bswp^%&g60UR3n-R$AIs~>A~pYrO|XL(5VyEgQo3h(M6vuTrlc|@TNOivrZ zhJNOw6iHF-6sUyW2MhlE6d@Gi{Dawzk9wt@lnWD>A1VS z0FbZ8xNAlzP`v7pxJgPrOr^r`ff zcwdRSJAk49l4HqHT6c{ zqEbQ&9SmK1lh8s3rAZGW2E>4XNeD%dj!2c>By&g%qKX)$`Ga{WPxieslr@xH627 zjQe#4HC$8urQqw9&}>#%ecxm$YwmXSaCjT?Wt%+uqYN(TszKQ%feCIIp`iW*J^Ztm ze?Z_Y(-cMvH^P%Z`w}mjk)1{}K<>a`+I-N$kmvm+VVX0k3uZCB1vK3 zlMT_==s3RDlSZl#dU6~p5Wq{HulVz>CoF54%6aC!Wy@&RDQGSKY)8dcfAFxfet5D< zXzG(OQh>IPH0pr)F4F1G;+^qX@`5ea+wW5+aOOQtKN?e;j#ra1zJ82!z-P*ybhocT0b*?nr}s3E#202aD~I0ZuT1}jL9fhl81h@{ zlzpd8Ce2>5Jm~uocEcqq0^-^5W*qDf(p)b zD=gSky5=u+&9|hD>b@6xfXzQ+RvpFPAU>KCwDQlec|1V@^Xc`4+3q+@9K|xl zHl{5fhYHV((k05J+ThXt|1EK2q*J>-ND(@ytMJWzt`fL&b&f-?gBt|hEPH0R=HxzQC?0KkaP1^N@C#*8O3FKzhjxLBE*ewP5HzKd zP59GFoqaaFQxVi`i$8q!JxP}6)n*`(pX1|*tLP#)*VTVv?M7o^E7HMVpSo=(#qoUc z-)mZII77DqjTf273>gV&$4LC>m5e-0TT2R>ZXr|Oa;!_>bns!CnO%O}Ec3^M=T>in zHuC+`*^mB5icUF-iy&Y|YdXs~xr*|DGr}?E92Cf^w|g=E`TH`AP;DANekcJPwk%t6 zhx|^@q|7_VvAX*)O9Kg}JH6ppA7zytAqS~7#hYv&nqL^FTC3A*{ zt6g4nsoO6yx6bJAC<}_~EQ{bmo;G9z;5x2O|IvCw5~C!e24uhKB`?Csn3S|VVGw?? z0TUWX=JFJR{Ugd7|Gbmx1{0pYp6& z%+M{Y6daun^(W7dcq}RQt}!4+|2>!{B`H|FG#3-kGQogJ@M1#v5b2 z5WF>QmM(g>)qdzt^UOoI`1#_aIUsrUXVwr`K~tCT)02UO@kTT$B(Xk6_-kkRr|PWj3mA8#}HA<>_kKw&`|(V zt7BLg84e*+KMcV3)<3ErqrwZo@%K|h8C#m-TKnnqX>E|FQ(g)+ACr@$qgKc@#!}s+ zlVDw+WztuBwO?gk>r{Nst7_ih^0sMh?8;~DYpX93#gwC`X4lb)?_BoE_#p)3*xk83 z6@_;l*|WmIZBMUdqH+j+_0enBFyUds_3c4zPQ$vgArslait=Lt^az5rK6#dyFWo;l zYkm$hyS)Sp2$HW)SLzo%K)zIp`?_Cl`t@VG<9$dqTJSu4c$NM0>~m_7+o%N;tNT;3(B}EC=)}OgXy6_Yuda zP7HQcVYOYmx{tuASe#3G@0}6=6!B;EJdE=nlqtIN?beG68HGjgei1HNmI^M#pJjh! z^IYrakN8kcK4;0|BFX@cXr$AkpN{Q$$0~kx1o{No`r_M4ad55kN2VYA;sSoZA3R<` z=mh<#V!-mV#DXMbZKDt6Qa8v$WZ!23AO@8W>-&6a_^D3s5IF-OFQuFM z1uK5gz>FrDpEH0DH!gzm@8WekXZiiRUr_V|Tf2Z&cAhozc#1>$vWXSvD&^Pa*4^8& zsF8#`NFy_oGV^SwPRC>s+Gj7E6>8eO{N8@rRrmSeMDWSw1ML9Z0~IusqD4%#r;QZe zWEm3c@`0xy7xV)`#vSMW>1tzZ4G#}@>+1Gm`Vim))_ z0|FFzAOug)eeifMH{4Q>y<_BS%cepsC^Q+64dkhY(e0w3gmHadyJZ6K)Hh`T?t%fX zkVixlIkd!GTdqM`)C=&5eHxBWf<#=;&Klw@MPA0S!1F9*dXO;SYZ-@)64rYuSucd* z*D5!;O?wx3X$vNNKtOyfm)c*HVj(txDlBQ2?O`JcyB2cQCHa*fqkrzPW5t0))ES4f zeux*YFTup6W4cJsfXJ(i!B{rkn!w_gm2z{D5AxymKz6%;VxDak3`!1Wxqq}0HEWr4 z#`Tn6^8;H9)x6XNxph?#QR?Wn=Bg78ZI=dgFpMR8P zMK8S z>|m(U(dYp24SvCZ^pQ@tHy;=4B9)MR6Vb<4dT~D5#SlU{L~svU`?+fNXowbJL(8z1 zmbAM=WQwZwj0po`x#2^@>+%@P4&J)utIZjXPzeB^fr=JUvqL>i538PL79lA{L&3jU0q|W>Ekh_QiyAu}c@FbzMqJu!oVvIV< z`F3%hOdOur{#!UanU_8@j1XlL5w4{W6fC(G-bwYojJ3UU?(((%2^oiTc3un8fF@{o zTS2fBQTpoFSlw{XJE<`ST=0sNGPX2UKEcw1 zd_ny`cjV^JUIV1a>x6J>H^s1V>WuwdWfflJ=E~y9``KW1aYd+(I4Asm+-KWcS;9TB zzc4Axk)VO^9xq$WQi~p`;kAwUAg4TT)=fVerj%cA zVs0bkSMTW^@ZT&R`*rHNDqPlXoti*ZlY6l`mNE|?KYa@VQWnjZE5_6x};ovwp4D@Wd*pm{WtK?_DV;8&NXHXMxsl%p4sKwn_}FFcz}^$kAD?< zCuXLHD8`!5xKus58hPnr`@lLpeD}fIQ^c&BrR|dc$RmrZ*?G1m`bXUHpu~r^4t%;Z zBv9$gPh*I{0kFo=$FDUn7G1ue9Q-fVE)yBnUSNy_dPD8;uW-U-EarERtTZhz>sr5n z{)SOER6mZ>d^x|dvDi-jNExEd`lhU#S*TRkDur5CChV@U#L$r1pv6Vs$?p7FD%%n{ z9r0pvtPR|9py(|vj6cub`gJ?C=P|6R*iQk1jP}ddb2K%ifbZtxR ze;@*6W0TLqDVKk&{i)`uT;wowD^)aaU}EEL!nhzK#3!sVT|XCDCCj4VSOkOe)te(e zb~E4XiMN09gx3*+Yp%CD)@Ff(*|$#7ICk1`9=MWrlUDa}gG-sY@TH}@<8#B7rU{>z zt4n>Ng|%Ojf%CD{9RlR`4Qsu1F8Z%54!mtPuY=3c@$&{@e@P)v0ebM404X*V1TRdl zFoODxGK-dip&Yv(h=uemKiKtBDmuDF-Udap1UjB5@&tsyrTv~G)(Bmt4a3mB8kP$^ z6D{$kGO>G@ZulI(Jw&GeuF;S_2EPt^UNy~!3{4iF>N^(abTHC|vosfT;`IcPC?fY)L$ zG*qJ~vQM;f+6TUyuZ!NozaqPBg^+0vv1Ge^*faI)etki;R6zL0eF74|L{TE#%enn9z;0hYJ^^e>UE~mJC1hrrF4- zaTFC??nY&4c`@msyiZ2;@6+UCv&f)HAq$jUI;;i$ZxnLh(lHG^Y&++Dp!SFN@$Emn zzG_Mluy96ZY>zfu*Xd^&==-S?^XT7^x|GGZYiU-4L8t)%5VMP8R*x#Wh?AB~tP3^F z!Z{wx?hD%9sty2$e;~-5W?xdG;F&gdP&90#7h@0PTt?%t$<-jF5s`aKgWOuFGmVd@K z+(@-Zpu=nS$gEtRh_Bqx1NuAuJt#GoUq^)2%q>F~JsXZ3daFGMaCWjn&!okZK=Ivi!_*@Ud9 z*P-m6Vn^$~ZS=U2XQHaNM7ZH2wDGN!H~UgP-HNfyJ?%o*ZNZsKDfO(hlMh^zh_#DLMFqh%lz7LiQu8o=-{RhvNC`eZr%< z!e-pIz{4g2kblRYjCgzM*zF-S<}WL+mYD*GTTE_|tDNxFMKw(NS`N80+l6n#)wBS%JOKb0^O zRV33~cSEtAtRE308+c!rt)LdQ(2l9@W@WT3fAC*gsCd;{HI&E(9s@SklGn;Y*QpFU z3axp2k5@kAWej6f2beQVV-bN+Y~(MhI08s0im-#cRF^lFO2<@*51SH`Iceq9u8v!V zsyEvacm#-C9sxm7m3%MJ1}oK}4!2mDOVq2ht=SbDyc74frn*!6$v+9%h1GOqX+C|; zf8N9z1{z4_tm%9C09Fkc;X?w2@hbIHQ0F62eFiqVD@EctxTi;-TjOWyJ#?3uq-g}l z*MtEo(v?O@;?B~)e^lc3!g>nqwm)H`a;YIzqXvH@ql}=bbqW*(unV1DsgQJ1+V^#zCGPZgn&7(9X&fU?hT5F1iSvxH@8W%#Z< zwtE1sUP_cvqTqA<$;)VXpBkP7{J!|c8eLoS?Y84&YjVnyvg`35^@zwMQjr-aP-dtP zlg<`vO}DT5+%S{{@^3fcL6XBduiN7g=>~ZbKWP9dSP_cHXxq|SZf3Cs55uCKLR6l~S!%!dt(3^Jgz(^Aq-yFSa^X+br+}pBr%L2cbo7 zH@gNs6JTr#_`C1e}4B3S(sb*;-hslFzw8mz3ZjdA&-R}8kTpDF=uTy>r4T| zc=`aa?rh(b6gaxW7u7$*5(?u*&-*p133YdgRhnRr^>t99_ z#9kl+CLcQsjguyAGM*8pijdS2hsTsd?a6)OXndP*pws*MTj)*FF;?UHI zU_K#s_9cC{JRkr_~kW8zdZ5`JG{O5elK5PjFO&#GGRlb`&-Q+9ecAjz_pF%;G#hwPi*Ix|3FWuL^ zBW<2)Nr*JZIFPQewfjVtQi^lKn-b-}z-aS>GHelq$nT7O>s^TN?a{~s2;sEFPl7m% zY@h~1>@r=n-KR=fc~5vIoJL``(2e=lDv6jwa^YiTm#P_#kwW6rZ-2$)C+|~)g63ay zgHyuJz(IA9;%x>{E8#B;_;I5eEc2P0{>NLeXzJ`qBJJ)+>60UIAJ!0u;@06Cfpq~K zBzTc5ns}+GmgPP|q~DV_adcGisi~2|HZ*xDK__DOz9|u>g)QG-OtRqF{_T~sY(o1> z{QuqtmM3&PWFU$+%3)9%)fx11~;)l)nUk_j+lT-aa?zCD*OgCh{WiV3iw&8FKvc`M>QiBR7JTuwE(i5s-r_slQ!Ic(mEgHg?`~;L z_nZS>1iyb0DO{dTbcA$jhXl`5Q5eAvm<=6Fh&#bpu7+P1>TNw27-QL$@@-dr8Ym!i z*uaamd(=yHb*9E|3&zXAIc`ICkJ=3r_$yj&{UNLV%FEz#^2YYt(}bj+X2;*fm1k09 zEKfj+^^SOqv%704>v3@k(VxgfweN`Js|^L&aaeHO*X4ZsZozX3{z4ptuXE%0_D<@6 zsn0axa7>yejO?US%>?;!T|2>^!_E+x@xCR|Ae;VM+InJCL(t_|GyoSBlq{P^xk*3; zZwZPMJ(StG&bs~L?nxxOAmqRnIx8-iIr7JkloUnT93ly*!hZG^?h$3jj$w>}0J#o1 z+Ljgnro=pJV|c315AdAQJy`LTY14G`D$DeP9{!iRPQ@_7&WKLfgMFR$@EIZ#N*qFm zdE{Zzv5vsvuZQc-P#<&>e9%30=6 zPlOXF6oGTS+}ovuR_WcO@RgMqh$>BG4immRn5pp0oszW`Eufavcy%Tj03<-9Jm>#eB zkAci{;E*jdkNlo^5JN@3kYQK}%c)H#1NeBgW3`}ZnetPw;Xq%>&8|&lAh5#7EhJi` zZuHeX8xwp0&IxUHk?dRY0NvLQfY(8gH$^rc4C)$BF+NXzL}QO9=C`t~wT+a`n@qt? zpbxD0q3n?}XZe7b#%rBQpH33gG;iIRF~5gM$I5k*R*JsP@GNLOf%C&y zv2}LGzzEt=*XGufql!{0DTES?InwpL1X+g!KQU~mhvui=ke3#+Lz>e$7)T&f{hbN3 z4={E;q;|h^>)nhyw4G%tc1qG+54e+QKM{qsXcmMy!HLFwGMjfAn@Gob@wdz0@2Tht zTlzvZMV@Y^YSiNn=z6|xc1(^Y9!yF=C^-^!d7=kO9ii*O6ySBXdtTIb+Sy+I;;wHbbM_Npm-l!rn|{q^4j!g2qwe+jNxRn)%i9PF+aP4s z`sAoVo~0M6C=F_NVa?X=btjs-mHld0k)@^O;JLd0Z;7^b?q_?lae-WdX4f_NpVzPj zaz*9lqz=WNooPBW*>!#0TR3<(I3!%)6FAUa@@H~yGDG|2$8|s4*N?PJ;MIhi10TD? z!#n#=`$C4-cGTZp&(5w#(M2Qo7JR8}{tNBd{>`r`}l3R@Uv z5q#2fIzRa&0rD}%c!Ae;TG9p-pJYUO;xg;((cuiKxKca}y-fwa^%Q0Jg$@5=zysP` zJsX^2si-9Z11q+No3WQhWMcbBvCNQUE<|rUNCYSfyoIZ6Ci(U&WdNMZTsLy=jj9CS zs0zY$0B^YPT|O^p+71n*QvpQ}>?uU;9K;Da0VxP0XwOy{!>(l4-c~)q)EG$x21)k$ z>OZH1h4yR$)w>2|j}&B)p~lj-zfc@o+ks?|(#`HKlDa>g4n%K3%h+FMTp*{7wS?GU z0^ugi3DjU{R2&TVL-rVRa{wlqk*Oei$AM#aJCG7zbqfHfb7cDEmOyprEJpX1XN$5+ zM$ks`#2Lv=1qq921%2@o0bK0Jul~^U!3*+ko}p5iKgJ&6Zwcls5GjxyU`0NF6E0(Z z^aMHV?9fm7N%JMYbf~Znjm%1|Kbsl^Zy!m&R@Ny@5wb2~hk)``Q@67HPpFmCi9MdI zV&*z}2hd$n1eED3$4Fgrj-%MMqR5Qu$J>Sy3$d}+Ie772-EOls!+UqE9>GKa{vbZz zOy{0A4UpO2GM~;y3O3cqK(T$VqZw6tgK})lQ&oUf-Py!}1GOA$_J)^QtG@Y~0AhSk z-M7$ZR5y&o0Cl>twB$w32mOkg-NCOixQ>TceI~?u2L*p(?_vDPf!clgqFWn$*zxU-^~TmBAJ^Fn zS0_7BGUS_<3z3@xgCqm|k=+i^aGZ@%9H<2=CQ#2LV)0UYP;>IIFOK^pe0u88>BNTgW$XmL3d%UB-w5w(Ic-2Hc4;?oED{Qus_eO<% zCeWQ+zgyjbyN#o@6*XJDDb34ZAWI?00!ex7~I_p19uEAYz{kFB*aa|`YSw?13##z!C4aqaW>C&KOE z!e#7vCv&Pj`-4^prTt8{KzT(&IO6-4TzeF-np4BWrr^n}d@Q%TIrjA*v`CVGv*$kA zYl5BVp%uM|RDMQR-^T!$J1X+PYPRLCPyhocT5l}CG`Q!Mp3nVfxK$&Zc2 zMf!&Z+r5HO+C(0UDiY-xSix=TVT>?-4527XVIn=!Fi8qm;`kFcdO38~aapB)xOw0uqr z9+WnSmP~nK40L{U|31lHb}j2*{sXJox?uKS_Hde^fNo4pH$mI3@epe)Z0P_!P#o}5 zcp8Lss@S42#;R@sbovUarXWfd?MZJnpS)@8mm80Z2HkJZW}iaG-WWJrPbY{+hT@zd`h$x@!Xj zabrgOve8cS!FjVwe$lQgX8WbFZRmUbW*|Wb+_RT)oG^=f*SAqh1_fo=h&GzWBgrd_ zVBKDUHqkvYXhx^^UX;cmxd{l`T86-g(Dh%7a`ytqtWjF9JR#0`<*~_vP!P5wiFTl0 z+}IY{Oe0eKz!}qz?OG)lIPDHNM2n9uC%vJFkarw}Mn;7Xzq5pJo<{&mbnoxWNyz$5 z)|60MaS=AihyfRjgU~Ir;v9;*IdJhia}nJ3#h!jp2G~W5(){=AwP_xb5h)XoCz<2N z3^=oVpp|-)KsG(?e#z^rL;RP}thYQ0-yam^(5vz)O+Y*bRn+DBQST1eq%65EJq6#aOX>Ae;u;fQZ^2}f>9r4ZxB65IA+CkwZb-)B=P;)*@&H$La`5q^6`8!Bl z9w#fqzGBO5smJXgy7ni01HbEw^TyXdY;u;#i*77`otASxm+}2cOpmc%I`(rq`HL~7 zgmDKoPA@b^iD?(>T6<^dX%-c|c~0ErrpOh9l?x7gWwtDU^#&9@u>V2+%-(Q0_G)K$ zqxJ&K&}S<}5#vsnR7Uwt7=^U+rHP){cY1J@7PRqgTSjjcRdJTQ3i*;vklC+J-1xh5 z2k7hDg0t80`Jd&9>!K0v_oPzeJHtr~!!&oCiI!WeMpBG2z@99^qTGLULl1j^9{XE+ zViR!KSEMjtjI4U*u*%5plWlE`oJ$MqHW$tgpqc9K9B3HVq8Kr57!F77+0@^7)HL}j zT?9r$a}v&ikJ`*=rpZ2AG8rOhYONBmrlF2 zx^|W>2R{^zg(P*=c~7X?fozj$hoqy|0jwftn!`}mjk0dQV*YgSk>HE-smnc;vFNFj zk4&FpSYi_<;D>(-f^5SxO&u)j#X`U5h=99G=$8}A1Rp(*26R<&Kuy`bYjQ(ncNr8O zVP1XalFGYB3t49wisWU$(n#<2>#*~SCtH#d2vD;rQx#B69Hh|h_xaj*v4;X2mSs%^ zzK&Um@U_sl0_+1AewXp>a)ssjL0tzL4wy%TKycx3oMs_l8r-wc*G`gk@MsO)YqDt% zLOi5em=j{D<3;Na4htA1VAe6Ria*BH z{u^@bWB@ z=AMyqmNGMC5;G}U%2#2Fr7&R6SCruBmrlnFKI;Ju@^y_t4^|6;H=pGws+%jROl738 zQL+%L|D7fUM2Z0gQ)%}qcxw7WjaBB>@KF=7AFd;4vwCDU_Xm0-TgV+b4DJM2t=vW? zg|P+uG639)3|Z7h$6YR>tb$m@ySxgLZ=0y74N6J|Q;ALKCnL7+n|4eMqr39&VrvGp zuT3baWU1C00J=8!(d}D}jO;P?97-I}0Uu}=d1t|^=$36P3 z6!ko+uV})HRs^1hQ_DmswePPhgUULza^Ag-4;(XR-YTq8;Ds@=PS>`C+L2@73GISu_L+ zZr`Av4V|A*J2fLdf~T@A;~H&9fzRF3Pw7clnvI}WPGvhR&4Zi0+5(z)?a52WUHh<9RNC!U;Ah_(C8*(u z;+61J5jA?XSo^DA41Q^qkv~29q}0T*%%8+Wn2@p2lF3-U{RSg>Y@~w#<9Ah^F?M3Q zsHM|-BXxs(9xGU;_BZKr8e2U5_?9oF9;soJ$qsVJ6 z@g*d&XXfQ3T>it~gN!zSWM=7c%<#oA4%@WWVVwRddcb^~hH zITWKvpx>HYL>rtjt5kjtO|FZ#r-$Xz8KHj0*Ro6nd)wLyJO0x-guyNY15Z6OkRR_y z#2Wiby||g1av}fOW{K|+o*$-r&{a&d7R0;?m`QI#b>_s=V)z9GoZuA8@}C)#VNBos zOAbfXyk9W+re{;fe?&!R9`Lyo%WmYw7o4vI4`~!`_Dntiu0z%5RxUNbiKI%@O5g&| zJ-HW+Tb7%qkwkZY*go6&KpoEl?%39$GYD${f?+BlvY2PdPJ_@pSTU4;-bL_{GBmk7bJ#oCcI|GR+;eirX@Y ze{SU+y^NYhjc4UqI2%C=<{FRPLHL!_`x4jEEs&uR5X7(u`~^Q$`BJvWl$n~kpNeFA zmMXZn-+)L3rp{?PE2%&u+rchFSG{TA9=Q>i1#AJF%;d}n!0VnkHyyZu4DVPPjFi{W z2f5s%(X4_tOfLQ=+{lv&IXgoV`EtW)-|6K+D#{|Z+u~_W(Bt5gqG9bRNSO9h`f;lJ zq|h!6VrKzb9~rPB$OgFul(Y4lqy&%-w4-?{WTDwwFPUsZaaDQ!MobHXCU*t!jDo!` zO;3cL^WdavL$j9%RO&n>`IHd^zy6E)OZ%rU)NUtFz+pRDOepdZ&1(svnuW&OEPqxP zVp8IkW-BwO;~AM+vwBR(A=wktQ5<71ooGr2b(=IMTaTkJ?@n0nqP0Za_*V3Qf)+IO z*Ol9_u(9i7;iZHSNv@p5G_XFSR`jX-j*n)UY#s>}GF6-@0Y?mPwl zy5#Cs(A=gjn24G$w4T3f8e1Rnv-drkL%AwYdH4^l{}o4h!r^(4J^*SSkC2q+19Onv^UAoMovrQ)~n{Bo+^*dE)6ZTXhl z^$jf1QOn&GMB^*DlsG~c@gQlNifj0@V*o+z&%eIsA2KG;mdN&oU+ukgGcDZ3^xr?5 z2;ooXYD8ggvgwF~i8o0h-zTWq8CdepKdJ8eQ*A!JSU)|mqXSoNchYPAOuomA_k$5G z7p(4jp&`+_Vg@ri;f8BZfcKkTzOVZ~w-4A(-BvE=iQ0JlM-u(|rNm7tsWGcGw8XWd zw2W55K^PAu<)uia^Mw{RsQ1Z!u|9h(`{RNB4x=D2{hw2%V<3#P(<`W zTD0H`)*Mg$3kHS;<#H{HaiY3^r+h8;0s6cEaUt&Win@Adq9IMkN<^Fe)4Hi_*5;Sv^4+@lx&7LmDpL5R&dsm7xBtMFI_a;Cm|jhRYopqTw!hR~`a&fMLsd3Z`l3mORr+dc$>F z8#$$WAv7&HDaQR^5I6lZgz4Ucf?}Copt`4XMYCp>sj2Yi$hh@d_p0cfAkxA25WOm; zG6i0Kb`zHP*;v2%a5fVc!R`)L^N=&ETc4TUa)Ei4MpEy6)$3mS`(MRvr3h5sTb80u zQBb^B^YBTc#~Q(XmfATN(3ABhFks|99{6HjZV$#<#zy zX@^pSfDZmlI{Lmr>9c9XlPFUU=(HipHy2~!M3YxQl3mNDQ&JX5W-mvHi64<_d7a&> z!4Szbvry6KR3&i(oLx0=j42oJo&fQ->|_-P(I;aHNoaQXc`#|`JgVHy?A*a&sv5${ z%&}2|MlpAcX;posr&-7yJ131*DHIkDwV>wF{E#^zR)1o$V0re_#G6o$p78AYZVI%A z(@Y~njfV*IF4VlGX_~L#kNu;#4VID!!a=)`u*V#;CsHVv%18n7Eb1N<@}h;J{5D;m zpn-y54~An!e%c%K0_OS)kUbcYsM+J=*e}x6nZv($aLNgi;c1;)iL!47y<(~6qQ3qD zDp=J}M9itEz&1x`{8hE%diG*W&P!94(Y}P9bTcPIe|ZmUB+%J6#X?5h>PYf>*;!yR z={!%*+S=xal51H}QH>WrIIaT!o&T-;{mS0d;w9&!+0FLVbZzWYEz$HzSYl_m3+LvE z__)H1E-HUcOpuc$*nGaXt@&{X_k`R>VDbPU^Yb>bC|*_kMWh zK$NB4J~5qKi9` zJW4f6+$!!!2iNjaCTRiX!h34F;+6zp&Gp64$W$dzW4fZ+nBg`d-=Q6hh#5uw1Z~lG)9LMW#`luh9x{FfJ7Woz|D-ZCzMRfRg6-t^ptpTry!@UAJdfd7n;BiA){u7EeXFdXPWrkd zi|`?!Jhi%8fPN3vxq5Re+qc)gn<6>XPLqQ&e8>2Jq`7?+R=m{LC!OZh8wV@_DQNr& zQ!;U#DTnD%+oH+w08fqrFFrOYK#uG1Cn5jLtDJeR`Nco7@zK+$Gb<&C{evGO94mGM zic6c71y>>b7XIZQKDGk}V(yh4$74%HH&i52^sKfC9Vy!sVF&Yv7?tJ=tF}{x6i)LH z|5h0DkS?3`2@r~m%VKpLejAGyXbqGhfU<<)-weyXTO17Ev)XKt&> zP?<|{;hWQEeet;> z9V_yop&6Tf35rT)q21fdh(W)SED$1&DV|vHi=JGS(Lk6xR>_1(=fkF|1hv}Oi(b(} zf1*4UO52k|mZq-rN#*PNNs@`~;SAC*{Lhy{LHB{yh$-cH&v_K3UsjM=QU5aKba@uz z%Q(amvUc0&IwLt9;3I*vtr|6=G?s5@8E>T=eUrFabNjYocio4*pRuH*PPd+WK#!Z> z2nxEH`jaQ*GGm%HM(F^BsQp%Sy!3~nguL_cnV!F2hwv%G{{(A0_yB^=fWn;#49kj3 zu?5lPGymtN;i=qUniMvlXcn^<6@Xb8=cz{J6HJ-4p!b3YpN)TUZEl{(K6-vqvFGi+ z$*mJECNuWxTeW{uUIJ9FQEQS7`pe<-7cBLydOz*vIZ4py%QrLXANS2!X? zQ)cb9N!JpazrJ$y>|6ZDuYEVVhEzx%Bv>S?x)Ee*sPP18Yc_~0ZI0I}e)(Nt<_tPPbi#7^g z(}5OM0C0Z^ai6NAo;aZRH#0FrxNnYuUbk?b+@Ug+2t!C3luv7kylh|nysnB`lzcv2 zOQzQIEZVM5+j-hYq&)A{odG^E7U2uw&3h73RJ}FkQ_IFU&s3hS2OmPCk{a(1Tb{D` z_Lutvr=!l`bTMN~~ zA;8dCA4ZlN3oQ;zj|%fts{ga6-K5=(t&#UNO5|pZE4{;4(#12g^Bvhj_B4@UeCOi# z+Y7J7?t?vV@9Fe|2cOOoe~-T3+f*A)*b1Nd;Ai|weUdbi%$T6Xq1Xp7uOTC@TcfUl z{y(P@Pi@J{$))W$S-5!bg{bi?uquVS1h_^|z5M8&&a+2_k!|_AkgEcCCVAgD)Rb{3 z2vXIg0cu^sjAu)3A1V4;&0-gdbR84OzjExL6)|=xZ-VX0dEM#h)b>w9JRvm1C zK+bV&YsQSk?ry35ettsZ1rMuVKjm#uyIqh<3E$HDf}yzYkA+QMp~fzFC^6+=BL^rCr)A(# zc5w<*fUDfqa9IpjuY{(?W7^ZW`?C3tA2^g%oKf4|2Bmf|7_LKY%~6&{EnM<`6=5Aa zIWEhQb@-k8PovVj%G%o(8@M)RL0_tzgQuQei>qG>BiO7=JttgXJAiBYj>82_`r7(k zF!%u(Y}z3a)F&g;Q9T>Q_OaXM*shMS_#=(!R7&oW!}!~a+_%>%J3^O-h4w2%&4|ll z1~0v^CcHX&O0dy_vE!PUzcdvqR_i?U<-BS?n&D6(5cD9^$yA1eV{az=#Ia1z{hsf^ zJW#Z3#4C^!dp8-zk#&-y+~fSP@5#@_Mgl3Jz0 zxBfMx9#sdaCL=iboc$mD?x?@H)KH>{(b{xS6#<6>2E`) zM)OtoWznu*gum}^M|YzJ-SOA(F;Dg zT=@jD_)OYLYVp{3GVIC|UsFZ*XK+t4`7`MY_pQE3y@0Rh&5KO-c}c;qL5-o`s;g0P zPkyzz={GDd5g+a@kaoOL6UXyRH2pqtdLX%M*A$zc$(R0DVL@)9>f?;>&7aSEO3`sD zzg$`c=Sl?f+{PfI`-Z@f~yy#Ffo8P_|O{usZ&-yhH${r7@BO0tl?u#g@v zJ6;v!3#)Y&(-3?5H~8q)JIx(jl99xNfWLFTtBoZ_7GFgF{D`*Fbey7C@aRKSgPzW- zdVbH{u?M@7Y%QQYGY~@t`!6nf9}Z|Y4?TMbcho1DUvpnvpeSFWC%DVBf_$VdmOlpm zj7n1XRSic-*($g4z6oHs96$_2HBVd*`jkCKaceKW8R-DRKN-na7i|rkwkS1^*!r5kk##;R(%S1jY%_={HLuAGS$a?x_u}@7Rz*=2<@K@s)@lwbz6lbM zosgdkfPolcP{ndP!O`~TwCm%VdD6K0rqO)c`Y&<4hYvsBmcCrNaBo4yJ^th(WtbbA zz33_Y*UM_HU~$1NU~A-`d+TMw{->tC^`|JdhhO8LZb);zeY2fQBWmR?%oAd+@UKgh zdl(cG6u|UvH)noUWJ^d2J>fn8#t$#>#R>9!R%1I`nd!JZ%26}9I-+y0!(J%Ar%WFc zaoUv5Zo2d1C-dFgS2sW3WEc8TZ$N4P%7{BJ>ZsMBVl(X!&a9T(x9#yt@_3TT}Q=VI56-1BAo)I2V>$U!PmeV`$a#NQZ>kpipXBFvh zc{=P?^(c!~Q!$Vf5c|SsI?wuQIcGcxkk?&1z`x<&rU>EdWAE2FQfLDw5d*C&*HS!eP2!R%n@eoZQytMsm6r`mw>O& zD$d@_>&pSmK>p^uII--ElhG{8Z{Y-Gb{F4)CtewJp3j86oV99u$Dm#Q&@we7xtql>bi(m~} z{XRut}~GB@9S3)l-M<5 z*4ApRgcvnid+)~h*)#U0ReKYo)QG6Pcd3?|4M7RDSB;?5YN=K!<@xsiyvnO@?!D)n z`?=?Q&bj9@u#zw>FW-*%`#3lc3i6*yZWj7PMwk6J%w}v(o}{*fvJT{)?+V>H6^Cz0 z0Oc#Mk8KzS9tl4^)N=erJ(0Hy<;-FxVbg&2ZPaBlHojmcSzEDQw|%*O z86;=Iz{<8ovwV;f?l&T=Nxmd$NXMly($51^OE!&Jh{Ni|`GHbKIGt`AeyNE`ky4}R zj-(RwiaBQ;FIcs&7_i^xQ5-+s@W|S3bt%m&ehRdVk!0tGTx@pM_dalNr|)aHaW77M z+v=X^EfDrjb(lnuc7ocreOfV)0_bmxHa?)j=9vR?#7U+MZVaf)9Z213en&+z_~uj8 z8PYb^eRB4TD$x_Ws|K1C-#>?4shf^G|3>66|Ap&ez|;Bvh{Z_2Od*q7 z#b0eqN*8O2SG0Ix4+kxbRti#wu9Op^SX!^rLIhM4yUJ(l)wVY!)e(L zMOx*hKo{!L!FfL`8*gG&tQmi5x0omCl1VHZZ>E0?X=WO&^0uke>`p|A39>J+j*$)2 zr(D8qQ0*dLh?U(`B7T=FW89pLO=7A*Y zKVQ?u-C@W3PwDy;gu#}Kgp#B8qCZK$sI-LCswnR>`C6EfvU-?elLXD(* z=@Z;;Mqs~N>B9odIS66BdNpoLM4*h^m-Bab8AN(I& z^WS?z6|)<;@Nnn>;^b!B}As}Q@{iNjNnO*zNrwh*>=y>Sw&eS!+wo(#yc#w839l9f1TQ@3*UufC4Wi> zb~yoiGVbn#754JOqn}I*98QZFpzI@V~>~P^LFzWIUqa=e`BWN{S?9uv{MBM7-*ivwh7YvB@qxF2w=YD~;kX z4H2jQc=y8}V^qYQ7Dnz@$2~0FaF(2v7=0y$1%P^nAjJsXQ@T5?d3QD$bd3T zLtKPL%Z?Dy@hq0%Z8@43^Y&7lQr*|PlfsL3X3`SQ#&v1S%3U4YhZBfn>t9Hbh?@sj}FXhcUSurR&F8QL&)2a10;ePNEKYIZz>7%tiBdu zY=Vrq>o_`~Yj>Th{BIc#fgY0!NspBO zLtM8(3Y;|5kkPw1`<9laJ*u6C2#k;OHn9PPNUe+Pu%;S?K#QrkLc0V%(pg)!(Bmeg zMWvM=#{OzirOb-KgcqK4X+I)1SCigPS2~uu>9M_&8<4a&%?AJIH@x6!uSWkRC*8RF z5v;X;H+2r-qByy(-bP)uzH{+!A%>h)U}%OxBN%am1KH>dLV z!0g<+s@lAgdKwgsH@T|DzaY0c8-58u6keOt$3=G@1+3E+<20c<;tSlBYP$l?13B0f zfnQOFYDKB={5;2uf0#~pB23LCtqdW-4A)0Djk8DtlHp$ME}bd zBE*|cNj``XGq4vO$v1kR0)9iGYRbFm4dTOX$OBzTPLA0pQmO5Yu9gW^KM_+uRA8Ec>g#5!&&j^t9^Yf(LHKbBgNV&L~p{ zNlN=~L-T}O0CZ+j``7cHqe)`fvvC_uC|1pEvZ!)O2VjD8sh?fRfsmcF7Gryi0%L(uR$qa5QDB0c@I!=`GAqFGuv65PZOo174J!ik; z+2WnB^+n=JOoYv`DVc6~`0jlQh$bTlm>7c^eO;J>2e?+bbi_=OjXk&xcWa0qZ#H|D zgd2f{mzFR}<(h7OO1%Fg#%Oc-So@3)&rhx_%KBdUk(Q6Cg_e)!2Mzn%=SMe=N1Lf` z&HD7^_)Fp!ozJ@8?2PwnG3Y@pjU2p55iqR>^6pltHHMu@yGNrD>!)-&pJm+O{*4=# zyDl_Auj?=&H%ftLhwNxII>qex+LMPW2#egXR{la>1~Yi3>zEYVyTeNnbyszX?Rg@0 z7`%f*LKXRSu(pKt(nvU1@CgLM@aj!gDOqW}G+^P1DW`bu8Ulx#7$z z7yMdt+};;Aq6sZ9oxYNd92V{DaGE*)KN@63*zA)ab{rGna@sr z@AH*R^iiPhd+;g~;w^f+{lqtxiM=3`s`)5Ha(4agl7Cl#pRWAq!c|k=FM?HEe$?N3 z20_}vRKAbTxp(OksJ;QXk61RtN3Z*Y#IJFB&I)}!vitk%rVG%8Z_wl8<6?9`>G3QH z11ifaTX%}6E_0Dkh(B8tf7VCMa2-qDJ5yZX{SV>XM6N8%c4Z{xpS5tjvU_Pr3{Pps z-r5gtd?;7NHuKrzUOK!;R}iAE8%?#|?3Cd(g=jt{D@aHLAX7mrRL@W#DyFbAAA~ZFRi5Ceu%Lda0t|2lpk8y5? z{84pG32%FH(XUyAaw5ZZ&yPA9j0Di#@+y=p6gv;ca|}c@H^5t{atYCr)+nR9OZgO ztP(Q7ElUHKlLvo7(tnp8&(^qCcHA4Bp2NSd2uc^|p&F>{)4m|c0ly6X2*0J70Q(t5 zqW$jpSG8R@!Ep0MPD(!VXg|U1mc8xd!1L2nLNePC+w|J#8}69h`S8ui5lx;X)%OvD zSEm+V$kHHu5W#uqglo3J)0i<42WdH%tbw9_!cqNu<-J1~r|^szV$6T^b#n2KDs{}^ zwU^p1P9MrdyZ*RQ5_**X)k3$AtF(? z{>IKye2NRK&0+i0SSoEqE2O2a`JTuUfpt~Ww$ZMW5PW+Z!e6E%5+o_?L+sDh_n#Ac z;bGf%&kfQ7heqLx^Paqh#VeCCMl5%Z>y3n>k2+AP6*xlS*>6?MJM6K}48gdcjAlYj zz%0h!0~=w6TIs`8IXWtlYQ3n@LcUwxQ4IOyO;Ws7y?ts2o_dG>OTaQGOwaKt;~HN} ze`;^S380H1&)zQfPEd(>thS=(QfAgqA625W$(^ziQ}UQC$7@f=i62ZM?cLv_&$=gi z^J<*M*vmN!bR`_L*W+kj6?p`G)Xni74GjSJ<@?nm`cR`7wwqeg-N>3F#wM-}+LZQJfSJVQTamU2%Wc*V zh+ULQiFoG1034A+(m#RH^1)n*aH`0oXQn@<3?)TrM-!^1#*_G^-df(h`ryq8N6idy z>^+%i4l$dqWb@jr$q#IsnI{qumHUmx0(wmG?TI7(h}PJce9hHYUWixaHOtqhJD)|NloAN><4Pa$4b^`27xg4=GzZ%%;E~= zKR}$bWFnYE1&&+iYt)z}JV->C_#vA8Lv;RvZjdxa#Rgl!{l2M$lm;T$WkL!%{jL$n>E8P`5KJdRzyZ*B2wwdQBf_N4f*g;YD(u}W4A zPC~g$oVy=OxRYC#PfVTQf*lU&aQ=nNfOt?u-l*YkSIXi0$!aXWa1F#U}PDfJ^*D&(H6QfVfnZA4~1 zzwo!2&f+#@}KemIr~;p6bisRD)hmBW_<0^3<9 zxNWwVMF|$e0B&wp)icD^xf#uAKcH1A%t31D30m8OY%us2{nlSW+$h_C^ zm|j)Fz8nvlN!0`}{(1%Z{kh~b)yE14f*R1g@MigW1T57~JxjKPYb-}0xkuwyIi#O} zcL7eF#lHmJFT0g2dKdqh%i8-a6|O%4wI3xiB*YN6Ahj64WX=ovX%NB5OVl6dVg~z z?%wwFx1DVF=65V4PPYkBP^5JR+Ac{grcJd*laFJK&XQNE=_^mmz2|cD_@R{9nFI$; zDw*FE9SGZmgt=|>?3xl=J;1|QjW?UuLv~nEic%;3_$GOv+tR^d;EqC8K$5JF*x6E( z+(0Es@~Y{d2X$&O(EpZvBt_?as?DaUdxy25J;mV)hmGwg_I+mn~b$EuGp!1PWQ_a?cZViqNm1VkWh_HXJ1(0`cHoJO}RgVJNLU|rIb)vt{L_rcO8&^ z^r$lDJDTb~9>w1{sL~Ss1VruJyjfnk#a3DwmsZ|nHxuBU{CVOQ9Jf4P5GuYNU?_Q( ztQK6b2&dh0WWDy19CE&DxKZHFIL}dg`@aK(a1x^XA&VmgGJAIuAR)%VL|!>#Fb8$_ zFG&JU3Aeq%$#$Lsp+vMaGH&iqiv4c(?c;a2ttfGI>z{x<*6nz7z4I9vU5q?~>aqXn*Nh4AJdD)xO4xNC$Zux?X8 zy6fg#6FlQ&x-LI#>f73DR-!Mk>f*C;CsQky%R#mu&AT1Fcx-@gR>7vmn03BGSAZ85{NV|?Hcu}p^mN37(ma8Hsi%z)E;N{* z-ZADDZ0X3?empXMFZ_3t-CKN9tEYkPO8~_+#67~k06ZJ*y~(3e5SxCcd-jVQF z`y{=WK1()iaNQ_q!3F+%goNO;`Oh$y8bf*-=~ziCG^<1xiD-3H+^VEoy zkBge7ile0ALKJj_h(;PYZoC~QAF4fH$3I7p=?B(>bQiomFIBc$b~EJzHJi9cMmaKz);x3of|Niu$BAOP<0| zjeSB@*^1Ts5URi`XR_&%jzmk7l!LyPgAE=V?3OcVK|jK8ftD7_A)l36kvKs}ftN>P zi!>1}@1)rLS36Y9pn1JU{Co7xwBhWhEvyN0{iC+xu;v&~34hd-!A-s87E(SA#v>ro zJ?LdE@!a8uY70D9&B}NEF?-}lAa&EDW{7B!Wj|=n;ozj)i5clj<6Kn23-WfvuSFM0 z{Z2@S8SlM{oZ%))6orhgf*w#tM`eN!LGcebj$M$y*jJhiY ztRg917GHO?%o;Hi4Zs^=U=_aohs2CP{!aLUe8W`a*L zq#EZfQ*->S+}G1ccg_`cG5I%Ypkddpa_P5}uil^Zdx17ZCiJ0MLsOy<{cS%3pyPH0OIjQ!GtTKM?z0pXi zUy1(7_aJ>lOi~apa#}qD@QCfVfQ#dlO+xb(hIjDtqr(uHcuZ9(ne?U6Ho6S`jT_~@ ztd1$4l>09Ki9!HUW5}(5ozk_O*f)|C0C?Rc6f)Ye*$f%}=A0wy7=d|6)sB@+lj)8e z(|}d5lG%V^{mPJiv+7Do3-{ljO87+dxaBHps{ZEa*7U351CrE`p8^u6kv{isAmK7A zJs<5eIbOMs-_Oq{G~YCx#SnaU($ZE{k4JPK9==t==U7*1*02`+ivhN?d>g}D)q>u|aXrC& zjQZoCVBXUu?GCGSUbPeH1 z-u~5h)i8lLY;vKxYmJq0hVMH|$+kL&A^nGk%z=Ku_tk2!w;i~DyS5mFI16-`(Sh1J z48pmT;)5zj!9Qw`scA2j!UOiU_S~aim=y zLMNUSc|<1_3dJ=fEC`^BJgyTa$6!GkIcasDjT~OWxelDVAc@*kvxx3AwA6}^sfsSL zZ7%%N9S7#RW4GS@yE8MoP^tMdqz34ujnU;$11?{XhaKJFdKR4p`j0qTd{=-d;n%>m zKCO9t)~i7K+pqiwXJZKi3@B4Hp1sa*RjyGIx zFkNKst{+{0FmH@^Xs0IQeAiLBTaU`7*_sY#1_BkYJ~itq3hIekK|q8@_`j@r!6B#E zZMv!~v!~1_hl#116W0PYdkRnY^W58i%Hk7TG@y-Wfyo&> zEQrzNgj%0{JKwstuSQO9^Ntd}S6rF|fq3DrFs>3qV`jwbG&zISl1hh5pUUd01AC-0 z%U!?>OT?znx>MnZqnW+?fp7-_dw0L@0}t#{!+%1TqsN}Mc{+Skjnnr>D0n-hYJ3~r zIRUt?a9-j*{(Ie<{fYSrz1b`m5;9uo_WcJ!H1FYelk_p<(`AS z?NqV5lC8H0O=6uR`#(pV2?A^8rH+bRR&Q^4-eYz-dCGP?FBJqEx-Mi8_#54N@>FuI z$S{X+8^24fNn9^>fh(swi#K2VuH6{6EgAf--!V5uv(yTuPF znn1|a`vcLmFs$>on0~2pvYqylB@thYC6O}BP3|+>4uz=pFr1fg#8MNVD<$IQO)54B zKVcxLO|qIiLtMUy3R{Bwu=|HtGAp-+pE!uRXffbzVa=QA(;-G;6URoRdTz67i`>tOI& z74YR;EnrMg!jK&I{80>Vyvv6Tl7~S{-@kb7Os5dBofSPirrW_JIhR9Tk&pL&l27!7 zZ;8qR!*GySq!6zkRaby=r99sTG&;$q2uv1#-aUQ8gbiET3!GVRnr;q5>C2elSKJh-G zt9l+Ma2<>xvzio}9GF=U&tqu)D^tacKgrVe(I$JeTN-Bop^3yY4L_OIg%+}BpMb_c zeGb@Yb%TjI{lmg+d!N(E=G_FCM<_mS5Ts0f9#>&>a9Ux6In*XJbI8Mrx)g1H7!J^* zdMk8U12=|fhNM3od1r~1IK5zv*w+CLqlH>=m{nbe)5g%bTC}AFc|{9xNk9uZwI#Mz zc^~F@)8`L8zAXqbyZyb~^Jp+q2k>9OGYGgc>_c>)G`$Fg->`_t%MA}3V7Urh)CFJU z&}**=E0K+8JshElp2Xk4#x5?P)eaVN$p<^Jn#@RTQhQt2kQ*iuknP6zE*}_dGRmMc zk3#S^|EFK3M{XG6gofCE$58w9cJc7%$}v65DBT{t=_co76^Gg8P}udaZDpMgs^4q5 z6D~g(2?t#m36Gz4`z&a6BNak}|8U99Ye0Ky!WCo-uJ)l;Z*c0EYRS860Bvd_8BrRA zF7mW_WK1a;vMWcu7I-3|(=AKSw#7!_<#s0{T_r5V8Okww__w<@_dBSe;xzG{#8ln zKb^i^)9F)0Lh66@(SwVcLwc5EU(n;%?aqhDDQxR5J=pU02~gaVe#d-VQJt14?yDRx zw&VY0@o)Tt)0o-+oox&Mc1C(w$RogcdY8~H3}e=W&XHd=eKNp~H&{0U{+c@&nh`U&1kJjEtG)h`WPc|1&)DgrQZ_6Jc?J#r+%-;=}c~lrWi{3e(n> zUY1XWF?B3*{4=Q?rFPhlY0UvQMJI>TZtjrCqy*BL|G&9UCSZAAqA!Steg16qx_QBK zHCSIgwKodjL0b|nhl%%Xqje;9djq%S7u(E1EohUsg>ncn6UmXd7KP|On>zaU`CREL zCjYK3oC3}QXb z*aBSFjgyXKMvzZYCPruDMPe98dhSss_0~xl9>SIEPQAQtb}B_ zjsvej%#f!{-MX20bgh{Tu1Bx$L*4meWKWJffhZRwh%QQAlQoW!9HknEnMIu@_2tkc z9yVUS*MifC@83)SQXI>mOR)E`;A_&h?w*lN<%!+9ii1U46^ z$4~qoi8wg;WW$~`3>c^eyxr`^kD8PBXf0?st$;Bl<$0veBfOM#)p3H$G(SX6%D7QR zVMBzggjCU9&d4Wb?9n%}B!r^s;j6zup8lUGA|2|8U{(j)%r+>kv@jpZsH}K9xb<}r zb|n*b|#3N#|QS&!aJQge`0c$2RTzUVzPF;meSn-G|(P7rHe`!eLF zQh{je?javRV_Q{9>6k3@I}tMi^ToIqHQ}nf66DTik~qB@NMK%n;?>FFD4ason;Uk< z?O>xzo1)-KyhDo21}yzj+mDtYYK|<iy%_Y zHxt%aKl@+O)WYbaM9KLnRDzxWyYxaCb{P@AvX@gn+pOTa3cGsz#n97gUT7Y0ejx=( zV}rAaNrxJDO(LE9LEMsRsK3d!^=S~R(MN&dYzURp)}VqE+ex}mq%3eqj^E>t`M6WZ zigATXm2o_~XM1JE%S`2w+ggXPF2{Yl%TlNQ3)G+9`l-{l9#yFNlK1Oh+#cJ{T6133 zD-qRa7O+4D)HqrfIywUDp)*@RCf7`s@JA>A6+6D4@#5@B3w6c&*GQ>zSuk}nZ(A(- zmC9!KBL?<@bH_aQy9yg^Oj-`T7s@D`uep~+WMmO{51r4KFK##UpI_vAX=k+j`%+gl z|K~pb%F;z#q6hNoTU>REIqvka;3<$quH4TWe`Wr#>gaWf8;lLeQv{Pfo6Q!0yi(us zi{ETh{ci?7GCWCVNd@t}CA#b;dUZ$#TMjLZN76gAPN|fQs|k#UMIlY>NY^g)se}Gh zM)>tHUhISrHU=*ao$djeehzK3lza4^2T0Kgh)Y>oG#=kZ2)E=#PbEHBcE~+CTuDLe z_Qak}S|q7CMmx0fS07gtZx!?o>a2(`v|{}zw74xEalPuLz5`=>Rwz&b_3(L_7FP&VVx?WQnN^E7}i&<4zU$RkSw4zU$ zStx!{%u;&po$@83tgP}mBIcQ^=qi`>Lf`cPMLIkNDFFcD&on%@YZrvo(BM3JFz6!L zH;Mc6bbR(exx-uK@Z48+qiz54qK{!%dX%1(cPVR`+FGeC2O|1g?JWyuffs0SFUxw} zhz|6+?eDeg*|olliwAD7)QXq;7LzoHvQ+49{e9OviN*0Qo&cVMV8ryO$CYM{nRLMO z%=Fo?sABCqOYP`wJ5-&3tTBMI4*zP^lW8L!&E4Rl1RL8lb?m8i0bmTJTUR z)s)N+Jw%)62~_ix{s&&g5CXy?womCYTO3-AU=>1Yr+ZUPbv=KF|EMb}R226oD&dS< z-^{xm9Ek`{R;#;t;J8Dk$C&m&=+nr1%sLh-M<4JH1uef0OC?ND)5?8nn^t=SFtF^xl8t zIQ_!?#`4#VZc6W0wr?BIcp!7#6P06tRl%ACK5!8lP8+yfctu^5O0&~n^w%HVH}ur* za#lJx==H_#&A{L1PqD)eaz82jq{u7t5G89rlwk!Sh1=x<%JE5Ro#Cqq<~raFANS`H;Yr{55v8&uF&vp$Hcy%J-J?2njb)sg?CjIHenJ zxBGL^etOecnjqydIX9sCKjMs}TV*D|x@s{JJ*I+XyQwT8lnq(_tu=yx%QJUFe@K(R zIHvUcTX?oa>*NrXOPz1fxR{Opd8Fge%8;+ocsw%DMWXH$6e|U^!XEogFXFqtFxbHJ zdZ;>2aRBO_N2?tP?BsF=Fxz2>%ygGF16zq9$^x#2o2R=+XsoSbtHUM5I9@*DDC4S! z7>YHlvka0%3GyFQ$USPMardF|Wb3`SJdT9~rb+^%P38dpIEFI+OJ7S`n5f8kZGoKJ zZr@+q+lkSL`fPX(BWsp>dy|^C8_%bOR2uhjpRV^rdty8%zd1Yqrc2YfKRt?<9(3jV z_{I_gUoH}*k4YV*Pcd~-L@<_e=g_o!-!RhUYb{rE8k2bP(mmSIR>LHxR;k z04bWU-i9l!f-@iqK*&_J@YMIU&V7k{TGG_)@4wn6-LJL#%gr^(EyC?!SiUJD5ypRm z%-#>k@k2(6$K^#o!gyjL>q2C(esc2D6mJ|q*X3!Mt7)p+B)^4ucpoJ79*lB{_}!`t z{d!v0nU%Ig6Q=UGg|ULg^&`K(DKa3sp0{@LE{Xq(mfiR!nfucp)-7ZZ_9^Xur(3#h zl|NfIfBiT}F_k~qc%PdWc6KseefZbTSQKO%BEWsMpwppNCA|G5fM6pxDzw6F%OOQE zluTKB{xQMpka0}p?BvIfDM3{qkz^IjE@=TF_>&&P#C-c~;#h(=R}L?U22_DHJ67EZ z_TajKkHiR(4))-De3L!qTA zS=^f;QRr!ugnj<2v6%U8<-)BHOWVvReFwEsu}(1 zBn)`r^B6CZtR2$D1Z7;DqQ5Rr>w+n^m1-L7{$|k1-vnD0!yy29V9$Btrz|1I4itb( z4vMpF_5}P>Sc~JMj_os9@O}pX6?iOK|42xTnd_y{S50x_RU)|cI8+!nZr<{6rI`cZ zJ6Qy$br z5s$=kVm7Okdvj}Abz;X9^iF2^{{7LM^V5FkC^_fwl0Ps17U&6CIg~0F2EvnU367@$ z*nNl`UrIS!i3Zurk)vOdLCx+4Szo@Cnybyj<%Q=%qp%Kdk&ku-?yI`*X8|G{--q_A zwDL%3Ny9VhLc&g5dJdxUqmiAvYC==W0{QiZ=8}3BLc>-u5US;?zj$oWE&2W}|1l@W z{Exf1pK8mJx$MAgh{FlLOIf4U(QD(($+cCL=KzHWE_jmbT-5U{7HMS7q!u3(!d>ON zbnD_;tUw-VgVL1VWsG@aoT*$&QM33Vg~%faZ*#R8?67x7@(twsWU8MQPX^lM7>)l` zE5l|N^RuF$(^0QXA`RcDuG^cd3K%vB*+@q1I$-5kUf?#OfjW@|%eaTMHb%Z2VxKij zEhbC*?J{=ge(A8OY_3M3q3+9%4CxYwy(`u95|hc#Ku_;O_g|DQy?*#b^?vG)8FJ5l z$40RgK122dWM)7XVAxKp;{IgL(1WZG|=qQo*t7f1>wKe z`L1Ks+^73%a-Fh$7YfDJjy#Dt9X8A&q4@#R1@6cfN!6j8F!d(OO~rPZh_m7=4d{^7 z$-c8h8O*WBVJiRTIEiB;-^x~vj5q<82iT*NL>I-Uuo^t9z-*e_$X)-Yi-d$ayy^MF zd%d%i03pdY|4!!1y`{DEw7L^pNIc67~H zbW=xXTWiLZWe(KHEIw&&l0+eJhry^7wf0;ACNYB$4X>9XE4>vYz(36gsa}*~f0b!1 zQc9;U4I2>~bX^4)uMs%;Y4 z80Srjkp-*io})06R@}vnYDvqcvTYX{@4wOcosVG^oUjWYxa13p@&fJPUlwyAJV()Q zcdsW~^4pK6@NJIepf{c~9$SNv+b@$G+dbFX0;>9+(2vmQbOLVO!{D)l zLkZ26s6Qjl)>O@ko?5fE@Tv%Np9kvBS-Z~F=rYDa_%hL>V}!)ILyx?T;;L4TIcTZhJ1F*$Y7FmJ;*T)89uACa*Wtf zQw}zra~i)1Or)I^7W($4taY}*3!mCdiZ5s|KwKfGs={%`z|y|i`?Bw`&WF^f3H>N~$DC`vE7H z*AK4mATjIjCxAHup1#tyK(eu} z){Q-o(52n;%4{xau(Ki$2z^py&(_FP(OXI?x z|0aEUp*h4}&Km5+{rdy!AGIl_DRN5r zr|UCSx1tykD{5L#dRnSlAWjuY3*W6|%HKEQRk)?aK1d7ZYS4Y`T(K)4I=}U_grg>O zdz;g-^Y=hn?-f^(Z17m$K>p9o*XOXPz+Sy+`3-s4fp3TaM}9xK3KFNj794W^UeZfT zUsG)t^hOq_<`3(%+aL5UercCfUJy&?^3r|a&gK@xEF2{Ys@_Jn+(Cv}g{I}jBgn=s z2*7sjH*UfX{HeFc;A)>D;~fm84LU>roGB*z1&}abjGX;1WN~gy#{-%5s&X2-x~R}w z<06i-K3?C%Rm}ZxcJK2oi5$9*=;QtSca5{YkUDZcyv))2X=YvJrtYd37&0mvESRA5 zQgwo^>#L1zwG?l@f2TPL-Ga!l-%?d87s&VW8(F6z)xZNA#hM0SX&FA+|}O=0pmUb?m$LIg!nIq4;~qs`v=DK(l;x^TzRBydm&_WOm&V$L4ri^ ztXj85C!xV{Q&e1C|F8KQB4-*)l!qF+LMx8W`DM&{0`ne(K;ROoQzB%@aQT|d-6;K` z6J~ctWw@SarTL}S?3QiIUu7Q;yDSC28O%t4KfZD%Qil{qU8+1X+&z|mQ}4yt4+3Ki z9TUmQ6&L%{LdptUc>%lVLgiz?oWqZgnB>lH;c~aWlu=~qfmr+ONI%&z!Sx(go+h~b zFp3@Y5`pUylqA^9PPX*fS1(g`Y8=$la9PK{Y1N?=7gjm=*QO>UfX7>U{3zxT&{ob-U+?!xr@QaBgN8`qW><}z zLa$QCAXr*4r%EwY;TQDTCz`tL)g`$EzCu5VDBq=<>&?PvLHyl9q9(UKXXdRBOzS3( z;bt#C5b!|~xiShlwwiarC_S~Zbt?X{fEaH@z!*~@CLqVV;*-xM=PC0wbieLZ4y6SD z*NW<8v2Ao0$+xxoTFqr>C$X0{_gZqCT!KIV(BSy9` z?$szp%Mq$4_pqnqE4(2dZ6zYr8ZfOZz&%KBDiu? z9W|fE@OtwOLWDj1;v#+RRoS+R^Ct3Y2w0>axrzChe|CP7QQ4a%$84`p{to~Lvl`uE zjq$aJM@#14ulc7Rf8C*!H)ZdVAufWfiBr)c>;qMDQw$mA8lA!>#$?(BUTNq2qALNz z2-xKrq{y#!+ta-(psPAF?XvHVfm6$bAuU}x`9GIH0`?KEA^i?4ca3u8bX&`)S7732 z_77xWEAMb*hy7!2pBQhR)t2HGHR&^N2gIMO0*CM~y~_AMCxSMkqBrwZYx6&)tT&VL zJdq}nC@?*7i19;};cNncb)?EY{n=eA3C0N8TomU&ASbio0MdnIOf`T^#q#ghoqtb| zmdk3gb=15K8`qOpc|oiK%hJ;Z`TV>sS;ZFa{X|z)w1w_TF$T6e9mC2m3i}U)TwjwW0DR zQpn@=Yy8Y+YG3fmST$bX}FZ;uVcb^SuN?EfeY2nWuoqIY7cNkZ1 z<$VOCZgw2t&(}%>`(a%VoEu$IDo(jFp^n?J#-+}FB1R`PUf&SnFZ0%cd#>i*rTuo) zBd|0`M9Y9-1O)ADFl3w>x+hT;n~HNYUSo2VbJ-xmhasp?3$ytAvBpaO!%b`pzqaZO zaaG2c$F4xlwuH5-V78a6qg35?FX!r(PW$zIax2Fd=hBiVYAcgVa^p>PU>->tOa@xp zKB{S9Pf(~%f_JPML7;??w?15 zS1w0HpBp%QP#6_O);jc4%Z&`$m=G_S8pYV6u0sr}JDTEypx>2A40@t7`P)zClSk=x zyF|&T>r6^3J99ZjBiDHa#s-XJYSe@UZ-E`dh;zDgYdp26uI`7P`NlH5r;J zvf5IOO6wL5CHgMoZGhjQ_P*?x=Ei5zTOKeEl&lQTY({(zy0U0VNQ~xup00OAbUeCd z=;wV1(|;I(H{RRZB=|fzmb(EwZ3GioVIT1@2d^*GbWA1H_To653DruUqUjbVEhY@`88vxcpZ0)}H#V=fh>ydQ&AdmF?s8jD3?eL$Gn*TsWrA z)I*jT6Gqe#Lh2eIHyoLajTpXZ!6*hfbY-}bfz#q&y|)~r$c|8YVe-sZgOTW+IVT~$ z!={rB*9Oa{1-K#YPhiYSLOv1)8+1p8rP|l8H!W~QG#t=k>7zKZF~Jj~%4WvQ6Us@I z&mgoC0)-RO%`l=j8mJHH-6MZQ3DS*ySBEPk0Tw;f1qEkv;%Q;22nw>cCGjdDp0?r=Axj|sVn2(hvK9T7$ z!!S4@6$dQg-3MU%@;+n1J=7voBn`Zer_(@_Mv6AI3IJcOesB6mBSmSNiD=pjw`e&y z&+Gy&y=3fiNaA3!%;2OGz92jA_ryw06_Mq<#{pC`@4hpWhZpJa_yFrO#F?ki+u-Vm zRpo@zz5WOThb|m{#M)vWOQ_6>?3j+?k1*Jft4xWI)QUf8XaI4WAp|?MBmrA7p zhC+^9(=+z79=<#q0=7AGRv1?uZl;S7;T?1gV5kbA&p}cKElhPH4&(+DvOOlE4Ho&IRs=m zWQI|S1@`r_PIc!QNPmI^u|#nI!iTwFSSV!3NrEq8(an?%E7401DQ=O%4%PwpB?T8P z#qhz`zi~eZTs2DSVqpzGZ(y)k0~WPBuc|BW%B<2651r%)lMTPfGD#7+=-MLIoQzp+ z2O_w^KvaFJ6a&KqL#Bpf%tm1f(Iwm*Az^X|MM5(|ZMOn*7K~fzw6I?S) z&xfTG=Z=JGlm=I^u0WNz-}h4i>5aIK&ZlSmeQ#^J_)^@OsUGx%XmIp~OfmFkp>IJ$ z2m^E&W*8@;kpKY7=9?e8)0DhxIZ;SrsAn7uQtfymQl$j`wvRUG{(?Ne$4xTb-F5@7 zh-?}rz+1|Tk9@AyycwzoixkM1GH^95_|^u6>uR!)su z=|V1{)%LAIdsve*bVB%Y#64M?r93sX2D_=&P4fU<;9@xg6WBEYIwx&E&@ET-+J&vVfGl_Z7sdfoIyIJDiAw9YT76FVeqr}1V z^*XU)XmTQ5qBJ2?!O#(oGStrbZNF^}HI9PQRt{+x zFv4>b>@95i_kOQ(L^5v8k} z>DA==HrrvuqNI4Ldfk}n4i}BYJn4ZJGGNQl`6#gB2*FOx>jvgtA!y)1YQaF|AeA=K~mWyDHjocx#3o*?J|6{T4V`&KTe*Zl2u z^spSBLJf$))W(EnJ4fYf6Jw@zi^JSiNZN-LcNlMf<`h;O#1k;-Ue;3 zZ~&?6?OuJIr*UMbkuC9T%d7*5J*!|uvT7XVvMO3oN9u?m9+4zrI!OoukKtQ z@SXP%Oj7=2krokvY1d08`4v8~9flFRN-QFAIho{^&Zr$BF=`qK%cEx#JbV3P4=6=d z<5e7y1rA_{644rL_~bNGXY?5?zubfAVi4y>_gp{6i|Rp zPWqjik#M0esjTFqlrk|pe@IS}5gmMHxn^LZNs9I7i^co+*nq5jXZQu6xZJF4P-cq5 z%Nvp`^yqmq(7gIRliknft=JJ_o+Y)t=Z$~|#9lJyFIoUoXCvNGMU~GI> z!vI@+80TWAwt}1eraFj}ZA5a~sJ%E(hHVNztg>+s>0y_dj%G$p85JO49e{)e@U4YH zj;mno@20A}GfE>m&uD>1Vz}M*crCK_y#Fjn<4EYep{f$x&ZkdN7ca)P%%r7~;E<>h z%CVV*lfYf|ki*FhRz;V_H7=a8T>eP< zEa9s!LH&#oLW*oT3LwG@8XeV&F2?T3Rl^*nVTLE)M zB~~z4=<^>;j3~$}_p4`!`<4q<%XD>FGiHD`r06C`2&9SDm5`u|#mq&^b%!uV_Tgo7 z;%CROf8&kn5@p4U?%?|*7ron;8A%?TK?!xm{%YJ@0JuMP-8MtY)&~>GbyG=mRuq-3 zL^hl|Jh#6c37hgW`|7n4dfp6*ysxSZ2<5rgMK9IhT6_3)ANG-ny(i*=)e>hx!N7+? zl(?G46~eIO6zQ9niFjtDF&Pqpt*i_y&5>a%)S!^7iE9<-s`81$p&b=t3ng8hk>$mU zUXemWYrW{a6O-;Jb3pA?R>lT2;8_%97O@f?o@>`lm8HKM{wBP~Lix-9Yq*qGV{#;g zV8|-kdA~USP2Q=$7t#0R!_`Zr$gzq{u=h!m8WaFt7knl6#w2gmLt&u9;5ho=tnOi` zd@~>Gdzk2TTmA5SiAB*G0^iNXdc!>bO)TxsdwCf%^DxKi=9V^5;J(JFFRl6wdFEvmnqyr z_NYe_gKVcYu&P&HR6WUGlziB^4y~U@T7;)&ta_f#zY-qk&7w(3*{qR__Zih^@bGx3 z8}|BG(Pcgnnn&$h_k#OHPYjVDuQg+^2C)Dt&B(P2U>w0Smv$J{R*f3!Z*;^Ljq9A` z7Z@;;QnTHhmZ5TMuD}GcbkF`;=Ex=;73xfH6-IJ2^u-x_!Hf!aB$Cqc1Fu?qPr5Jt z#rIhj!!_8#bQyMP_wYN*4kdO35`Z&=>FS=RYpx{fdzYRm|C|#@2636GZ3{Owa;wKi z2e>j+qcD?&45Ic3Dcr8RQ->Um0&z@ss8_0bYacXE@=-dR%A=TNgMv7Qv7p=!H4Ix7 z9JEz^UEPw{Nt!Wn#dLs4gBuQZD^E>&GMd-QPqPpcb~`PZ#o zc4+lYF;s64Nm)Cy!z6Cqq<9k)X(}Srgd*W*o!!O*$m0$WHNARsg(>BH?q%x03an^j z%0>-s2_df|zZ)eD-?;rF1Hfcbm||_6i6s+SOeV*`+N$Trxx}Yxk>N`rAGDA+%J*kX zbbW=3Rd$;MF-G4Z_t}R0UJty(_(G3$YT<}jm7+ocr~+4rbDdODqviE=aQ#!hsG8H6 z@lq4&>I{oapoy4T@VraIGF@;tz-N=ZwAGraZpn^n^|t1L>RhzgLqukUIl+&8*7W)W z)yOO$4D4;c4;G;DQZwk%S`s$&3(I~Vi@0j`o)F~?A15Ewu;LSOSKAu~g8)wjdek?s zOuC`yxALml+RN)qmoz9ybS7V=T}d(rZ4B_#NJiCG(ZnO;OgJj;*!NDc#bb|Ap8-Kv z9n#BOUuCLKO-Gd%coW71O@rBdJ2yTx^rHYY@p9xs1D~y!W6dR<``!pxN=8TPx)YdV zHcT9z1?#GmkFKg(8+5O~xGV$4c_3QuXEoW}XtZR}V}y4yfT!we#-d7=t9Vk?tG^PF zlLwCKr%qM%6q`2Du$j)M7#1Su&Ph_X;`=!OMx$*m{F&Ra-4QD(N`t9t&kJzy_upzL z+)Xseokk|BI{<2ZcR^=(8sGVx#F2dt{Gtdf?`X@?4#?%2LCx$zFo@k`7xha0wKKS^ z9htkSqs+|JM3y*jMefO!SJsl9AA@DvoHh}gWVdRbtAGruPkD1mMsBlb?Hf7%R6k82 zMOZ0HX5-H?ThFj_0CNlG45fd1*^&nqEiu_ocm7T`^0E1Hp`=lR<=)1ysFH4|ea!k7QCBjCaGKC5C zJp?oD-gO17PD;7~6DLXd0)^5-@fi=h?cOeQs~u-g7h0bpV!JTKp@`Z9STLjCQ(r!W z9xAtB7=2wJpcmcZ2kqboPp$NZc`{*!Y zi~*Islok^gE*XgF=I7mkeMTj%-D@wR{U!du8&Tfzvh%J~y38D1ea8%yW6y$O+18Z0 zLc>yhr8WLz0Qt@cctnX*Un$bV=DRF(?cwh@n6Q}+&4nfqEQO4D`fqSWWNt@yms<2l zHf|UY;DzUr^10>8I4C(TTkdDkDJB_4u)L4c^QBQ)b)r*L)K6G7YOVF1gg0OU_uuS! z!OFKI@Qg5#(VoAY3E=w*$9^r32aE}alS+5TXWrFcK#p+zkkCT1novCU|1d@}ul zfrKrf0ak=ugJShnbs^)}xIxPMu;2Z3RdGxhnY-p|9|43JJ-qji<55wG!8(4wY3HhS z8jbt*jcQIs*b2~lA%r5zPvyRH->**&G2bL5rnt)w1l{ORZ!&#bzeq=la)Kj3rzM-K&k$guGo`MeE zWYmJgd;`;FM9cSW$av0W7Vqs1kW7GcT@|`xF*LGdWh~>NvyWC9Bv8J6@6Hg;z6U;y zq^=M>nR&yev;=IfsIcIZ2m!XQj_u(AAO@x*N?t{GC*{__H`+gIIHIfZvmWZ0uwSoz zA31u)0j`LNoDxvxNL?(t%o4>@-W>*&74VIe02c|2Y@chUM)mqrNYi{jz(&|0ir->x~0s-Yg)Dm*xgy2v=wgI9Ha8>-KN+L>g5nNf_ zdggB*xZ4_VMxxR547y_7*4kUD)tl6=f`5Cqu5Dl+*bRP*vHWij=0V;F_mTq?|H85L zFK5-i99y$8u`>PX*qZ&X99whz=Z>v8h!{oeZS0+t9Sn_4VHibC-7JkwC7cXBi5R8q zTuhxD>}?EPOo?2aTuq4>g)Lp26-=E(>}?(F?M&@lh`5Lt#Vu_BmjOP1UMFg5Y;R&p z#Lo}&yPIwg;FHh5@IXL7{ROX;_6VF2f`+{Tz@QLtSWE_gAN*Yjzk0$s3sd?hz^<78 z)w}zzj{Q>!*x5P$Q~?g=zwqtO!SX-y?autKzTN+~Re%}zcNH*)NBmm_{#O5gx%FX! zf?ifSTmDt||JkX3>;5eN=>9+V7WjFRmzRi9#?;Q-#e#^NgYAFR{r|764gR;g|KB6P zzcl#Yqu+m-0&KY&WH?m2|CJ8>?AgER0Ovn+fa9-pfb%yU_;)jsQms`d+!18o&HCjL za{3xKb2EF#-9AUO5o)nWypl_#QY9kbqz32!5a7!1Z`aj5Vw+aQ^>A9dw%~|j z=XY&<=GU96rdqXQa-`qW-ml2C4sh8jH_io4nzr|@lTPmSdQP=we133j)1)RQ`O~-t zwe}}id(cJ!ND_^x?g=#OSBB`mW8(G(?sD^-XMDGNdES@zCg2MtvX#<_A3NcTrZ3qz zKVrIK4_;d~=LBmNMscmsyREJa81>}xG5G8HNZJvatyYi5=?eJko!Sv%%+&KVpJD#k z9Tw1MTpAhScv`Qnj;P_uC1|Qr$<5LkFA z@_`{sv$!$?txFwy_Gx1%I!~N@8S5RsXnTGPG*byJTyZ*qJ6F54U6TBz5yYvT-E`u#pJxIhMk4-TQ9ep8t;Cy&r$_98BaC6KU!a@FA!o0-DsoZ2&2zId8ry&Y8PNmQtW^cX~+@DgzLsSG9ZoK~2 z4{o4CwvjdCyiF0SSgF*&9GG7bw-(8QpN#PCJ?!XuI4v@efq#TH9-0$uz(+lCo97BX zi0@XSioqUV;Zv4zZlT2H9oAQe&~@akWz+I+*7Sy&tPp`U8=5IbKk6^B8mT%4HS1<^ zBW$Nd-=j0##81J1oy6%A4$$X3&E+|uplpBF5R8sRlefceG!B}DaPZW5HOd7OhYZ4o ze=MU?f)|&jjSrOe$E&)w05OtIUOWejL-_tx(UK%DLhs52!sv)*su}^Ff;m8akPPA$ z3I^W;f4`J^Zu~na4+nNs5;htwLD%kX2_#~~SoMd3;=2f9b9B7f0zrF?RnV(TL0Jv+_Nj>2$j!1u@D$F^m4d5~~sl$<}aQttF}1?o5|w0jku zGlOb;N|5x-rnVw0fXeMNE5TbK;(*JbNI?=*&d)-8XN$1P=%}EKg(kd%OjSSe z0jTJaOuN&Y{ZkZMk~cE+r~*8hggt|LRrpQ{XFZzfUFPLJ>vw%o5`TVV#V+B`aQLTV zGwArnE@vAe&w_-8!|ZNqgJ>XCMOFyZN{v3Ng+w!?DHnPym4Qb36|C%NS){W^6I0qG zbA@V+jOw)%td@!hmE7;~U~$UVLxd_dE!GX=m`8U^24#sX#}(G_`y!~B*3k0S0`2vL z#!==1V*w?iMAhxfBZ9yV;Q5XN5s)MW%q#dN(jLF7-4{b+jD1r$g8sdt(Ff%TBZYkS zJ^ta2tKaESO_7C?v5a*NLxF54nhy*wR&mfhY)-MkFfNOFy2Lc_w}E+eUikYyka3V# z+M499ihdxb6g;yC2K1>NniC829A$|&GL47IQh^74G; z%@b;$RyTyRN*;iNQSDq$%QkT5a@gBmwzLQ=&wY>3#s(+c?c1eAv0PG*s`O4TRK*l# zhXBcXAYO$S2Q`V0%-%HY&AH?u-LW>|!y=9W&h8`Ea(t9FIt;R}V7=+HnitwMX3$P1 zYR?r&NTM1?#Y#31K6OEUC7H{~meaCugK~FyovFTfCBnDnFJQP`~GTc2ISu0`-eQWQ~z7HkoT)E2Tv zLv}r^vyopuve(4Ln8X_7rJX2lGS?Ju%kNr{55S}G>49!-3orn6eL0|CnhMZ}#s%&& zR6ctH_kkY}DP)_zsklSy6oB#Yx`PN+%r}^Lz>eTNK4PvKgGU}VPrGmsrCNIMI1A`N zhQ#fs*d~8;KlQqhdBG*)9y1RIQ*3d0DWTm8$A%s(Uaq~o@RP;t=7|8Z}kt!-$gWiom$OVF$?1aZW zJ(}jYnxok8qngE7m{cxOz8EjaS1xRyt=>r#{d%TllxF}O<0JXGK6a}hV2JYgG)^Mi zpmtd<`%HHP4uY@pd?>WmXEHVTn>BQHy^o()N%ml@FWQ6Ca*GzceY*83RVw7ukcb;1 zz6y52BF#rhDW}X-va>REM|g;1gib;e{U<@!d33k%i82A3y6N($Bc zCU!JJ1We;@mG^B$-n26(=su&~@8rLe&h#eg0OPmUy-cmc`NAp%9eb+_Dm3H9vW|K~ z3D=EMQ7Ry4>*+ugj4s#_DT*y|J%TQ|A2JwVT=t`0)=U?QU@zYzKNaznnA-w(&blb& zdHU0g>T=wq@Dg9b5L|4Fb8N+tvp@(;&E3>IHiJ#$8NYZcej61Y%gRjKA0|v#JOADw z-R^anCnG3^n>-!Wa37Sq_^_qS2iv@Iiz)w~4V5;fH10&m=jk=uKI~yDLtxgT zeGwc)>+QJk1}0|}?iQKT08i%|c0(xKF_66j+Fo}6?EYtIN5}W1Uy<^2-QDw+{VPP? z$)yFC+|7EBYAZ-4(K{>K1^VpL+6lo%HFUoFYFD{SPRSUkI0A2O@yMRWOyx#8BcHEb zjkB_l8#aD?E8E{!sFWTZ5_UM-hV?8LMqv?pZSm5C8{9B3aM`t#1iRea7W zrX{eLxhb$xe9^v%S59{dc#M!#s%lmr!&8dRvAiFpMG6!q{wo8C1iQ|*&q0Fw?%ZpL zaeEorcT7C@iIXe4ZvAz-mQ9kTvCgIX7mGc64hKj#CjZ^Dz39%BS7wEAE%YLGuPFL} znF80Hd5-Z#nABeX{RwnG17=0fG%=}(c`L@q_y#YLf6bR0w1vg?houTW^{ua;du7gIl%U97BZ|JYWMgZ-b@T`Haq08CiH(EQiC z(@#8@o8|Y750y-v?OmOWO`QSI1lMoNG7)MMxfs0$0h*8PjW&17dKd=x5 zCwpUMQx_s_K%qp%0kKRyT!;YahyyYv`U#e(c(QU3v9bP^%Fk~^%zpys+<<(4rVax* z4>-%r@%v&@#gmPQ`6u8AC@{Ju=3@C1o@8PFSA?GV_X7MsLGhv@D*pwDe_MXr0z#4& zml6j827r;0fIpzOZ6Fyj4@)y3AX!-;8UR8G1q2*!2?Pc>`iWQK0A4^qpasA{pny-{ zpXUld{`|G20Q8UJpBDpCI|1TSu&{Trceb#1AYx@;0^$;uk_G#j8X){SCjWJaG>;#% z5)ae_b{GJiaeOcA_tp!93*Ry z3K|9$aKT3;AP`_sP!KRsaPXhm0Q&-d2LeL|M_bS`~PDxEm&&bRwDlRE4E3c@mYHI%Qv8A=Gy`z6%aA~ z-2B4g((=mJ?Qc8ZclY)W4v#J_udZ)y@9rNSf64`@&)>uXy#FTI|0NePKrRq4FiS76-WdKbuV~v!Aelv)9z@kp2L(^X90K7!WKZ@NCyvP3 zj3s{OJ$0v8^?5&CS;xRZu9XG}F=^J^StZxqd1L)({Am4nLP9^`W06Hee~vlKx2Kiv zRyPxEB#DW5xD+k$-bWsj^YDqyn(@m7iTxbiNP$cfPJAIQ*Hy01(VPu=FwK;kVFO&S zt%h^BP^MY@YvU(LL3C|bFVYD?=h(pN4z}h@T!G}^XYFFM;2+T+jxKq|UeRC*ps@K% zqTkBYVTBn2sx0P)z5tDE{U{4ZQa)xtKG5XUDT&T6q&~j+0AW#OCFadT7fo~a#AEwJ z%or~HabIgeFR8oJ>j@Ohx{6|IW6kbV{m#Afg%cH8Ug4yp%PCj!Ca90X{f946ho9Gd z+gCd~NpE+K?crSor*E;g-^!F7TdQZ>vu~=w>L%7)7ns+v1Nm;Q#25^BTX-q>X3wW? zoIdK?Eq1=#;_&K|d(VECoh4w+NPG#HS|P##(`KDK&j?tqqZ?uCki*=>-4g8V8qcdRKQTN9=Cf>uJL3iRMT(^KPHJeB7^v|EO>xd`{ZG z`SJQeb-dyUVx@z>77oR?o8oACcYrB}3?BuS8}Fd7##y~pOWdW#w8YH;?&|!qAc_dO zDGH4nqK4E|llVZG*s(CdU<($y>A{IM6(m}N+GL+JIX}i`921r<>2lW4fK`c~M>6yh zS@Pj1P?bXv+fgj;@%sc6hWvzNMVjLURKf&I=GgN%(VIkx=t7Z9Dkv3G;2M?F9aaFq zRJxS6d+hpm`lx-HcLAmb_fGV=iy`3Ad+Yq( zKOMLQD|6EX;@fJBVQA{dXenXLIf1323epZ>dYwo;2`w)3xVBH-6ioXNRDOtRg2K4Q zAY7Fm0zA(pYJUA%T2G`Hmxs{3A4PjA_;}W>R7*|5Txd+`l_*xG*4*;8JZ%a*!nO`C z1hmjIl4|yb$)*m=O5!#6pf(S0t9SbXoI4xUxw$~T!Xu*e9ZoB_kul@CI`aye5Xz#o z2N#cqWf?DL>wWhGt~HWuwxWt;GD7;Tr@zvv1z@WBn-kvuNYWfI&Ma1@2q(DTh#zL8>a=bRTt z1j9tSX)eXv($A_%_-3%dR-POEIu|RI5gJ6La`vLu2|x+Gn1poHkIIP_gDO@kwgK`; zQcm@Gt%Cwx6jH)$=AxPj1yH^+3KPQMBrCRF!%keRQ%|lA6*!c&WsB!fu|i3FL9iUC z%!EKu!$GC7_DE!p5T^)z(e~k)=F^E29pk#1Wz($u(s1@-<@7#Ryf1w~wQVKXVln~T zqwk+&CyOD#5Iab6Ro$~;6%HLfabVk8nJGi!M1H2Bps0*Y&-gLo)^3Bt#sRAdI%afs z-K1q-pyF~RIxfMb7kXrn#~jsf!2!*tBpGzy8=pG+5sLPQ6|bOh?13+|$~Mv+LL%(6 zr{FoS`o3!*h?4?Fy@-S7k3l|UT~Hi>7~}XUFsp*wv(?J?)Wo33;`veG}5{Bixrw*;9Pallv_E87jy^$KZzA)YI&w z@ayQT;JG3jhuj(jq4rbo@68BN63oP714gj&*T`Q8@@PA9k5`#A$EYZBBzLIiJ^;Bl zL?!j7Y+c9JI?EE1oiNL;dB(`NXAuY*ryJ|48@sr|?_9xdL-D@PAl*%%y5K8;+tRhd zUV^EdfIiM4L5dmZ%>8nzTa(*(uEL&;t7UdG6=~Aqo}im^BMnh;<@AvumaP>e1alA zC@yRaRMBti{tO?}L}INFlH-Vmq%M;8G zT^_wp_hrcuay@;94*@xf``KL%A+(NexGZzcDC0{9I^5t zXJq^zQ>v48|a(K0D{^`e2f< z7Rg(EnF_ZLJIRO=wM7V*|E8a6kUrm)(0l-nT;Cr-wkDkEWvfg|Hy_@tzr(^txPdl1OVQ1vR3E-WP|`Q!bJ zBaHUkfm1Xz0ga-I$AWKiPNXuAa^v#lkn($%c9>#4H(n4uL!#3DQI;Rjik6z^q-#2U z>B9&RJ`A6f83sq;#D!xn<8!GCuPjM~U;V~rc-91*Rk=3FUc*=0pXsTv#2xtg4QTia zE*@-Nbq=Yj30m#$GoAarIkE+gTZum1Ka|#l67o2DM>1t5;NjooWzu3lUFT1p_SnOCh=|Fm9CjJ`?+_@OI9f_=*T z9H-Cf^@u#;U6|B-hZaK4p7|F;L%YRyQ~I$LjkDq_q=fYyHif0&qTr|G#KgwBlcxC% z8We3{LIxjVB20aU&DRHnFasqA^Am_(FI>YqAQh=>KufxUG`l;>0tp>^Av-5ox8cH~ z1X`Tudg=9Q5YhcY7*Fo_eh|GHb_p_~;e=z%66tZSvX_hmB#n0ItaFm zrrA&(t-2cuujjHegw?>uSzX%%1>51z5e{WI!#078FFLsPK)dm|1#Ht1)El<+4VCz| zRa+qVO#{@>;5@SJJ{ICk4+0F$WNY8tG=r>&@C`gSS`6Z^W~F~{V^}zt|G}B${Aa@0 ze-pLh{GCwq57g?{-1a{}tvG*TX8(d({Yv|P8MXRrqzV9G{RwCND{A$tlz)`z4^|NX zjr$$#`WvU`x~_adixu-0($%ZGOGBOsMR05!GA@qe%e(2%h>n3 zndsl4R<+s_PHT(E>pQd!cxsVQdcm2MHE8KMT)U$!{kh-4=@n7%qevA?2p{BaU+B5Z zJJ0&SAm!FoTKbf%nFx7Fiw2B=I5uPx5<;0$o zQr}g` zk@v~l@l#RBaYtpA-#b-~>uc0@2K7(DCYx{zEgHF$M@tX$VP4DSmD=9DqpPsqAfGrr z4sf-@V$0#xG0PRGDn4BT*S=s`H=cYc*ISLKv?}2{CE0G#@V!h_ey*&vyqNn6CHD=6 zjzOKbKjziiDwnbv9lm=+GCRiS8kldMr(TZbc?DJQZnH1UWxC5}@R#~^7`|9YJBhT%Jv z><;=h&nJhCAD!+3x@*V!pVl^Y^w$DTS7sc1Jev|BAkue)SC6aK-IV2|By@mO^lQA% z5d{LbD)Ve0h}l^ekMIJ>>wLovAEhSz2a$m-*3>EflXfN1lN zX4aT_G1|+xqd0ausPAl>MaYAjjHzMMA+2+HDK&!Hftf2JYL>9I&5h;^B)8-IR z25<^@m;@yek*OPs#VRX8zdoAh&Fvn8IWnCGsG@vZ?5x8%+V0KI5BxxV7|FK<2g(5} zWD(Zh0X|=1O2fHlM}KaRNHKJuNFiCkfhszN9Hh!serC{VkD|?tydZ)h8=Nb127W^T z0UFl=PY)e6Qe|aP<=QQ$sR7jECbUf{?Q0+Nt__Jue2r=Gs-892aS4ndO?P6vmQ<(u zw0f$8dI@!!$8j&xIiLfKI#UqQrIy(d;fLlo(M&kVFaV_S_OKpY9dvb$_Y zbCXXI#i}kdPr>&L53$Z646_$r`3c$fa3x@abU|9U;5p3>DRC6*LfBDTjhXG7lf_4a zcg{)|5th7Op zw0{sD+=t`e4$P3$3|Z$1FlP1?HBEv>MuBlP3Ks@*AYc)^1WS=n4R4w0(mY>$m;r4h zLQ)-V+9eb{HZ#t{gOt}vSeI*kUW9o@Qqfu*n7=%T74}qW)AX~haW3*P*$|UAsj~%(FO#{5u38CeUzt=_E}7B z8(1ClixQjMEXTKUTuLUNg52#Ez`Z2LBGv9#%O9z-uM11etZ!T$|ybVaS)F(}&4{ZgK zN3Pc*IHtN`w<9!QnpuOxwZC&=AI)&uOJuhS*E3qW7P6PgVL0QdB$%$$#`(x=o&5Qg zql6m~fr)D}d#o*Epfy7OrYxt4g(pI6um=+Ml4p=8+P(?K49^oxZL<{;xbf`dwF;hP zCp(1+lsCwYD}1^nMwuZ*hmVQ_f;la|LCS5Wg{pX#?X#NQZP>pa~u)iZq|Nzg12b3Lv*7@j7jFEf~I*GJnvC31+-cfqYzC!vC6 zyGU?lNz$kD6y?;&Bqnom-_L{qK+?n&}5E#Qon*(~3Pqz%r}RSmCUzn)&;7!;P0*=7?Hes1Z8oq`GD zQaw*#=>d2|n1cB-;$DDVp$aAb);}9wZhZ?nW3XOR2wJdE}F=9}-@Uc({ zUPuo_Wjwu-mYJF}$=-A&W8O=O9vy;2a)$}N(cW{TMs2C+0)D9oUNP=M^5x^UN|a+S5S2U2(?jEHx4-9CYg|cgF;&TRw$zSa)!F$%4+U|W%~ zt>>qB841))=kYf@>kzAA-c>9bQ@y?&Ay3;uLMX|v@G%T1aMR2Ck+ikqy@I#m8d&(d z-o=SGGS~EdsS$46q*1oPPNtq(x%J?yoqOO{cC?2B0+WDox7I7l0 z+1rlw;oLh5>>--pSPVJGlHqCpBJCUcQLmLCLDn#BNon_&gzZ>MC>?UU;7-oP@DJJ7 zP=aeU#Oh8{(W9}0a+^l|&s~yNAt{mArA!xopEvr_w!rY-IeN z6Nx@JryVC%p(r$M^-l{nOx+6+jet=>qIx^p)m3!t@p^deP!cpX*;GO@emp6w&(d|@ zDs*AQyR`E+R;5#P1V>6Xhs!|RSXT=VXJ`)-41A~5EwZ`BuZqXmrH38V6z;0R2+L@y z=QSz@x1|ae3HtShvkmLAARbb&!16>3uKOaCV!`TD_58k1=;j{zxH_&SkfWEHvO?&NcjG}Hpf_wFbqWyCA)8> z_c`*&L$!8~z<`DsqH*MK^hu%HX%uo}Wi!eJNwpK@3SLesuLxL(2w>__Y^H(SL@<8a zPW>o`iqDjSAu5@brTz5?!_OdLg}Y)f;+||F!;3PMa2WDBHdWu!z$g6Pz=uflSQ=b} zsglW9>b+Ea!I?E1YQ8kqg=Ao`L@c%pANdKMh)yt&q z)UHsaKyiBYqM;}~j$#fq3|TpWYa{j0C1B#~HIfqexJLvz$VxO# z+w8%rzp6$t`mp-t z=FT5s;U?`93txz=45B7b+No1=$9Pi)5c7uwQ<+b}ujD;n=>- zbQdf(mh*rQG^s`Ii|e`?#~lB({>3J z^J$+pPcP0g&ryhF@GH4=i#N|0>+S0q1cEN_hhjhVfMCwM_QW0NWnOc-r$VVZk9~VFZhZ?XT67 z%EEbwAf;`a>-9;+j7q{K`p|}el3Y{u;4i|=vN2gWvU40ot2$Yk2ruq>n7pg83uus@ za_ny9N7AVTsbt5EzEgoCjxrgg2}2^Mfrx)YlAVmKo*C5CAbZ*uxQt4$#%Z0$)I2_- z3MzctWDkdDCduj35IF_|aPDugoETP*K@fSlRz1 z&2s)h?fs1t``;q*a{bO<{U>wC??lx9Hi=ir&d&ZP`_+E&1D8^0&3*Z)?fl){;Ls*MD0}qW=G9E%`N|{T$`~#ahDkhYjVQIlf%K zKQ8m{tRI8LoMTB;?tw{>jJta zL!WB|uv>Yk3#`VAo^uIh%OQ6(rvA5&EoS;8UnFB58zg;i7P z(o7I0ZFEdT`li5geIO7bJsoP?VLq;yoDZjWiUt804en87pB1k`m$N>j=@c^(0#zRd zh%<{EF~|`r)cq(L6RVR|S5`+&bwHqT6nm7Ks~9K~FT8Ka2y!dmJT!>u}kUBaeD=c~lUYj^z4kO5c1 z$miWqOG0GwvZMKDdB-Q83(M4O^tvb4*;LmuIbN$Z6(h8DDol<;Jg!0$M!^Szdvp^h z^3;q(taI^ry>SGML0aFi@|Yjrx~DaQP+>KB70W3D`iMJlbPCL<+%puS{||d_8C*x2 zY>SGSnVFfHnVBtFjF!dB%*@OdOBPwo%q&^V%xtlq-QAw)nduud=iC!7?uqcPUAuPd zs;?rdDs!z|x$;>P%#$q$*N()jV>@n%Cd<4wW_6arh}>0L#OkO`-74d*WT8-=#S{v1 zA;X9}r9y5*f1+mK?Vxio3H<6nnE`%b3bA>j8(Ah|Z#c>vhWVWm3Dj9b;9aGb)sxeDDCt~c#+ zVhsYA0gz9X8O!ZrNb6G7lkla_T#jl2BfSk~8M24ly40mxHg#%zm7QYO|2{dvP~j}n z1cD+fh(3(J%;eIyXf`6O&|Z?74g&)EgN1-{rM0Ub-}2#-c#lw<-Y+kVoQ zy61N1Vcg*uT0zcXs~KJtYe2>tEhk^PMUz$pFr0Sqn6)@{0Bws+2wgdMa(k2n@Q!m- zLPUzGfRLq~x#R@l&>PsE1X?>at%k*}sJ&hLsP96xt0st!t8Lzm!k#@sR~8z`8J?XR z#3rJCwsf?OD)qsr(UkyP_8rlas&z_38eZ?}*?CMZlUn7dd_-?EyiH0X!-NFkKHR!8 z1<g99zEb?SPY}6f6N&75)vAmT=4=-y`_HF z7QR~hG^Z%vZIjZ%&I}x_8;DBhGx2yA6x+t^o9>B#{|sxBqC1y^MAxOr!3ES3vj`Fwjqr2*Bq0EEENp^} zOn*tQAY-={j(!|R1P!#nY`@UfcjHwW*u$mgck#7~yBHpqi-06)@ebOHC3j?47G_~c znk!gppM~pm0|5cz(q!}fEi?4nv{W5O*iO!CpfH;uo7>Dc`tW4IF(hiv6#$I4ITLwF zE;opG(Vn99A7MmreNbPN;|8+!^Ae<1@tP>Q{Y7BnbZUD^76qysqQVj3q7BhD<9j(4 zKl-|U!1R+P`pT&T9+0q;!Gqmc@zO5ZDYeOsnlA27;v`H%p%zxh+vo-z@^t$;%M^6J-^Bs#^XU#6HPBX{txbLyLWkTsdCEsNV2dCt zjxg+yYfu1oz(QM6{jAi^1^@HTSbWDVc;#N0b>K7es=#D;wsNVuUC(%S9bgB>Vxen{ z;ngwuCtTML`ZN+BT6(PP8=j1x+-@JYMnV^9ecpc+eYg24GSg)~$-YdwF=FnD5r#%8 zjoh49ZlGnA;Ey?mzIelBqKK^8KsQ{N4jA=7gDv=>F!>F$-eTCoUR=1iBt};i-pZ!ijx8AGJ>VHo{5s7cXp7L2goNGE3|}~tc28oOO9q$1!JE~vgFZY z=o3VJbc{OQn~N`_KB^-@WH_chS(yRMSw4>1WsL$W{w6$txqu+DlDoBfM*2SP8N-DH zIMcOKzOiWX%10|+g)+vr=?SQj_p#QI5f~&-wu(x1j{a5sm2frk0*!;(6Dw4)gSqm( zfNna>1L%i)Y+kcn+%Q;j6+2Hj^cfuL1Ih4J>f~#JF1%;bCc@m{BEaSsVrI8r!y|Aj z=}9zJDO|J)wk~)=9`FY=9V_^elO{nPOjnD^?5j@s5zN&$k+?uCFS8uW6;Y5KENnLhSx8&C&>PwR8xqW#RT%*uA!JsRkOQMVVf$fL^UCpO;p;v?0Rvga>M6!CAs@&j*sLS+; zW>wZ8Q-QFTuLlW(Qa14m!J)k_G0txRmWVv3w;)yZfxar1>^3Ox9b+w11>aFREXtQ> zBuW%`Y)^#jnos5w`97MavtvCFD}3UprqyVVk(iF_aW* zbKOL35L9}sv>)JHISs{J3!Pc8KLrM(6}Q&dM3|H}1N%uFB(gw<_UN@1GpIK(EmXjf z5mh=4-w5WCxCOGXL8wJs?MVl0%%2T<^z+Vww~OFI-D`{M5}1`>`anf6ypQ=n!$o)P z(BS>~5~oJ8|8pd*7KhOK0hE5ng=H{9e%Vtc#0$;Q;n@7_RuVF&b%Tu}TOgY3J)Seo z(}y*qv9Wu|9Ep0sxhIq(Yo}VM-Ax|^22k|SR?n4TKA3bR7 z0)~8Qx}DcO=O$&R?!GhhO5>y1i&!tn_Pms%pB9#e7FWt^gwsp}Yt_&@n|{NPR4Fr{ z(UZ^U53P(|gKo;sSz-Je6#&=Y4hh4%fgjc>J@DWxg}(KtL~9Dr|3b`2cqE zw2|6RpIMU~hi=fWNqr1*z;mmAbx6jW6CKzY?N8dNw9GusUr zkByCL&A9Kv&y*|`&yE{kjnbu@Kf8Knq_hb1i^BB=>)l(qe;hQgZSL<>B{!mN$0x-F z5SvhK_Br*hxqj`lEs|XJJX$pjgy&cyOM1@VxWSG`*x1ar+W64vP{i*vb0fK>1r7hG zr8bmmIdDw7k`L~5hY$DkG}grzEeJ_wB_0#f2@rw_N|{K#ziV9fy%TTi%E)mclG<%w z^!`ylB8SWKg_HoZ>0PInv!Fzn!sRtLh72Wf6^t+tB0aq2DvU|g2)P{Z5tStD0zOhkafHAR2YI5Z zH0xo(b-`*pU)a!AsYH=4av!%6=HPs=H>3~ZXd!q&laN`0KAyNmgi!oO@{R*1iw5_RSaEr;=knOv~hFseyx4&%uUb`Vuw=ybAP}Y@P zRMf?-dUhY124NCFa4ZuHB?cxqSuKukn={E?A}InKDAQLO%~il8E?zHz0M{plLDMUA z>>dz>^B5ZkqHDg*Bl|oP5D1Ey^AVsg1%#o~fXo}uHb;q?hrovrnq$u!1|XRKp2a$% zu14;&4ItM<)#>{johta^6r#md*+DF7%xB9gyo5)1ArHQ#9IH<&FHTUMa{#c zwHBA`V9&_$i>o23;biU&gvojDVj*U3ha#0;NY1U}X4&ZLXx=sIG-{mV#&&2jDN(!! zMz$~b0Ozm5Uh*11b;Hu1jBGi-F(DV0Yab>v#qd!Xv%|vIH;K17li9WpDiSI?*a3y{ zjl=wAg}NKgQYUrAJgmU4UaI;cb$W++{}>Q4P-zn+w5uX%iI7|b_jw%Byf50ucWaCO zAr5(mx*IKJdMVcgF@0}7Br!C8;u6I6fHMw+p!W z2r)*2F@s6RW9AA^X!e-h!K4jzAWL#uR8n!HONs}KW1fI07KdT1lYVEqqC=cG?TYgb zI420;vJxaR|IHBo7ol<`2$w<_54V`gxhz*SS%PdcX9JTebH1L&MhllbcF`t}Cw@3w zSC_viulz=O{NP7em^fJeUK{vtc%*RrQB3)JdF3~j<-gHw!tuLo_0Q#$KdW2+lXA*` z=8^K3PAI=sTK>{J<)4ZxKMPZT=8!mld8B;zOZnxI^2;OTcaxM~^^;%qlVA0dzx($5 zuj@AXEuj5N{e<&pkLo|fzCYSc|6Tp0LhGG1_5iBax^A_Aufgv8_G)HZvl-xA)2!$* z8RJvJj&Gqvc#sGc5$*u(BlFAB`t&)s{hm#70R zlH|2@6xzC9jnlU2qr#_K;Fc@SZ7Su-8xCuS#Iw;3jbcr7Tw~?dNI9*&ISK1rtReDg zEY#;#@gjgEAa=eRsnAUqc`mn*4ZYV(X<-_pdn3!I8?(G%I%|8xBG#=RFIps_^Ku1L zv(ZM6iwL&E>yq<%pwgDE{oLLnG19MUeh0t!Vfs7K`W50xz22hp)j+@owGlg*dwtLt z!5v~e=GtYvC%N;&kn7>YRaK76g6n2jsj@ygG3Rcj95cDVF-ci>r`mLRuasf}Yc%Ll z*X}LPh8ihv-c`FpyTuHfLM%w4dg)c41KYaNF+<#pRL4#O~y{3Ycda zAQcH{P1Dx$lK$xz+O>hzZ_GNfplc1jf5_4ME_{84UB$W<7&~XHC=a1Qcb6Ofo=H- zA=LQpT+xdYsI5|G%F$feMO}STjDpx{@_e2he?5#8qLrMhL({6>n**KgN_90kxGI?% zN`0epZM{8p{WCh0mp$D{v#{gVvhc#XCuN`%!K0fe^BYdsalNCgGhSc73rACFZ*xh> zcQWt|8I+LFXw>tJ>KtDtO?A^lxrp_svoOkMjDzl+Zkj4sv(t?_x)qo^QI{j)x!Z7u z{p_>eOHEbkdy;(Q5E`ava5Y=O9+3c_#;tc6-?+2HaRHM%t-G}e?O|;$IbhHk!NO6) zkRGcELXEbsVyk?c?{gbB%cj3%s=Jy6M6t$UUKdMAMa}iMm+1r>P!HY`O!qiu*R$?C zA^}TE89_gD8rhA6Z6KyYj8Kor#ANlVyjB(Vu{MnZw?>h+d=bc+Vck=Q2&&2v6v6<& z+QtWjn2sN2izPaoT2V_*q`p4#*ZEzt%z2L0PI=Rk~HuD%`7!#A{+1; zb55!_Y7Q+*b( zyiOBbm9~Vf4+FpkJ3sG1Yt#Yb!}RGPHH+f6HH*w7Zzx-J{AY6 z7mI_cF%KgKe0qz6Q{ZeYJeMFNxY<2NwR%MKN7EXTR!6fXA>8S7(F9w;sV`hY?3wLLzO{wDu~n23PR=^ z;9X3^_xeDDZ2}}8AZ|_KUPf6Yaq3CwknfG!qjgF}0xmclmz>8=u98?M1sOTsKoxR* zOP1o?W;$U;@L1?cW~9+;H{+4;QFcs?(0qh*2Vs?{fj`(71F~VZHJ>mdYLZQR14jB4 z%mO25Md;};OV>2Iu_yPl(5NrSLFWYeG+dhtl5zZmfFt3yM#dlpzuYfZ4@N~IG$ z*0Sxx6dV}hwP~|g2EL2tdIE8z!~YiE+7B!d7|SvYDiEZI4j!>q^L0QF5xfJ^pXA-j zXXngk6IakpSc7@U_D)^(%Utz#9hN&VStcNJ?l2#3fSY1+i|Re-fR4hjt(x~PK*f2t zzJlts&A1~d{x_eKF)RLfty@$bB3Y9g@E^Hj#?rGO;-2V zm{~{#VNF@hL}at&2S=q++4{pS=RHXhFu1D-jol^iFPloT!r<<4yG;Qad?k9XjRk>i zmiPfKyplC!?tn9)v8zFYp2Qz=TQgr>f-eAq|I3F#Fkt(b)_c7HQ$noDBWK=t%ziYA z&5h-TP3JEpXy#uR=1$3dXFy%2Hk%6N4llV?s`1D-re=B!@gLk&ZtravgX*dKi>O2A zWvsu(T@*}Zt*uNHsgIgI(VA+c=(}@w*gal&&L10wS~JnEMdy{l8G%;|8cbvdt7He5 zT^jka9h)mQ3~o(i=~FQ7gg+QG<#`#4Eys7QV!dRyk`JmZ5k??rq#WwI0?YE_$PR<~ z!ew*G#bB&^6U91{DA~NaVWI9Vs%&|deuz?lgi0tM!R9K8`J$~;4IVW!=Hw=y9mgx8 zllyv3N6?Mq1`zAWt+UueZ8>)}jO4ULuuY(Mjq zZ&$Svs+NpL$0rx_QIU(6s{#8@nzOuF`|yk>y_a@hR_Kb@N4!&2>c6sS)9kaWoABzX z(OSCGPN;T8@C^)vK{>*|@2(qM^&~^^^J|f>+`pnBn=ESCyz3DVzf$xiWdjXN>a5@4 ze6fVRU&50;i&!m2~tFFq!jTn6%%{^<&jPGWY*Sn6%#({bNnvWy+kti?BF3 ze`gc_E?55TQhqM{54kcU1H=CX-v;%kse#}9ihs9>`Q=Ic%aiz*C-Gl67XR`j{>fwg z`Sbs2KIfOa%l|sP@*ffHN1Xe!VEOy*zi=h~zW4XWqklWVwnA&jYFiAe{hHDROF^P} zbgA)%0N4nNSJ1DYK#-c88(gdKBWTTm+Q{LVYqo1a)1Kzli?^yRG9_bICpc=j>RbB^ z{#N!D{3ZWaTdHZ6v8`LOB&CG;QjR`d4fKT(hm2#Ofnk>y6y1sriPq?^-!2_9jJhlH z)Q#Ww4>gqCC#tc@t+B{Yv^;8D+vAa2^Q+fYhk1v7Xw%UZ`)ElR=EG^1@-6u#HUdA~j;wddgLvUkUmw)wq133*KB_qgba=ZqSHO?G7}l2Y3q=V7 zDG3P@wS*8&1Wvoci|*6`qky=@wRyiipRF2zs6kg;Z>J{6MNEw^2;nvJ4nK}F+v(( zRs&R8=CWBR>0IB;_s&}2!60R?qd}}}%USCJ{$CdjLYI`FKajiNZuo}*30I(vDcNfE zGQTq^+QP|;DWWLQiXf&IHKD7?m9s?&S6t9G3T*2Q;uFf=;N>&>U(bj70zN! z#)^HV7=i-$F5IaaIYm3XhK9WQ#$bShF3JGhR5MvJhY{b5V~r5C@db3sN)w4S6{#dO zNm~3;(s&?G)t;jv5Ya)w~zaE`)_foP2*n}otghYJ_mw&I4FHo?^0Cad@ z0+iqyx-}>Ldcd~?4_gMQtnTq^x^jx1BB23DW6z-eT|5H4bK3J%j)zg`1RoWUg1iji zIcah2s5~vMcTq=5kaLSRBioONE=C!atMI!zAARuFq#T^A(|9|mwsw3c#D=WPG&V{0 zE!vg8h+7x{J5$F2dzFNB!VdxQkFpbPK7y&|_bLNEAWD=H<kFFaKq99nv8P0F5HRwu1Am)_CitZ6J1Pk2*^U@nh|*kj z8H2L@9rOWtqQbTS`GwkfFQuSh1;Aio`Q6a=J0{$3p=NaXsdXmcz|&(lxNugjv1%7> z@pKkx@0KZ2ky1F>ZW_z)=kGL`C_-JZy@loG>LmE6F9$FLymbN6 zPsj)#=9H40L`lV%VuUUzs1V)`8YAQ$#)7H! z3@eTYVTl4Hxh01>-kTpt+dj&ClnVs7mglG3@o-c|=`Ckk>o29O&k%O;3PXL4eY(gn%fp)ee6`2pp4&iix!Kjf9eK z9VqJi^9Icq_l1edOuGv>CWXe%Vwc`!5Owny!Bq@lQ*e@Fv{PzYh{#PoxNBoB%_5Ag zzd<>UwTn(KU&IYis{MLGKU+lL>Fv71sJCALg@;ejr@$l|0Aa`>25yqsR%8Ou2H^fN zA&^Z;Oxad4Z$YLa;?@V$TC8e&VEgjnc5bdnK081fC6ALwd)1oJp-E_6hVw4Os1-SV zLgLo&GPk)pr9uXJLV|Rd2f8>I5Vg1u>!`;uEOfrxv#WqcpFTvb72fe(4K~Jm7ye!0 zT1gr+c>^HPtWCGu`M`!2TqP!Zmkmrn7e`z0u*<_RrABFWSTV@)qa5yxl`~HFc*7O7 zMzMF;X7K|aXQ_K|3tmq0$ffB@7+Xiwc! zIQ00s9hgXL?qM{O)Gk`q5esT0gq$*%uSykz=+B=!j}>?K!=(sY)Wj2{eCsPNlR3WHNDcg~AL0id$Z$ z5IyIFuOj<;FM&6*5{v|44Dq!geso+cNsXT+o5wa%&l6$)qay^Zr!|kqxLr9C6FtwU z=17xFs=vJfrwsOuboE$4P7G~d0m3I`o;*-Y=<^$CUWsTaUUt3XOS`og)HH@bkTNYh zv(dA1puX)srRdxVrZQE+a;w~IDnDg7+e4T9X|&ds*gVN0Tt5uH)|{09N=1=-AY%R3 z>=jpZz+xl4(AditQF}q^*kh-=oo*n5!%01#U}$3elBfWTM52?MT?}nB`5h&mBHc=u zNQ+9JMx5^!{b1;zH@1pQ#zkREsD|PK-TTl}fsG-K?C+-Up=9-AjAKmtH(%VD6h6hs zmvR>aYh8mzd`6?N)1Tpw?U>pA>M-Q+nc1{&K+O`g5Jntd=&!<<8H89aQYy=npgg(gpdpIP4Ge?dBDHfuSVdQk z#9;^U%C#wqI0YsXtHjxaZ2cyO-=-Cto0M;2kXF6;NCZkNie`4%j*TI_vU1kf-UOV* zAJ6VFMIa4b5~!%iAa`c^2E!714st&n*jxy2B|$7JL2jNAsTHTC>S2c?bXsRqOT^4Z z;{4S&9YuQonU19=NqdlCFh>&mQ!$2}BGkTQa)`RdZIqLF*4%yqN9sj>IKILqu2cbp zbXH`j84?S+Bfh9<880lNax7oKJY-)gnNkq+;b;>4{svHl5CU%*&hnND33R6kueug@Rli46s@!ck|y^G5Ln|= zD)GqCtG-MVGB*lP*_pH_PEvY<2D-$lc3FPAm-Iw;8t~|)pem5}HcZ_NNTi+&yq~Z? z9hUc)2cBWt4@-74>LSH&&>7RE8WSbv_Mg+Rj-q*35JelC(_qwZ2|LvIqHGTAv{6`l zJVol(*ab1;sk-oRw+^(WO_S)J)F1~td`oK`kk!Efx>w98Tf4{flQ;Ai<2kx`T9ND_ z+`xu;Zw}mzL+v>{>6sr8CAcFPR6BQ8P9=nU*6H%~SjG44tBs0Vns{C}w?Cm`O}`Bm z|Ef)zkzs<>zNSmz;|O#RaSTwIHV+a2y*vCGJVUDw)oY|n0!)frt;1rx7!)@2No%rM z=x0nU?K@-i45NlNQB_)jrG?rFH;DF=y?ga2z(Khvb}uOyY>-`}(4c$o^DNKT4Z$kp z;yrsIC0yC7OI{8V#-T&wTdGmx-9wD?R%#c=7$(6J;0em=9IuGiHqwMK{ue+&C z>+j08KhF1)*ZQ9$pQA7a+5}P)i-$%}`2Se`{tcnB4LQO|ev<->N7Z?Q1_CmV^pCAGH-ANF+OH_-a{7cUx zv*4*hVG3X?6_(#Sv%Yxko8HD4z*BW*j_lg|%op`|{-&_4G3+M@m3Ep7iGDvw!n$wB zqEb2ZcAr^mL?kmW)7_NE(4gOY-s`O#gy7l^;SSkPPq_t|TZXb83Ect)hA z`r11*|GvDl`P&^=c&4K)Yp4KaMggcjNJBM{vfl=G$1Yte15z+$%w92cnqf*Px<(y& zHLi3G(Y7m512Q&^tz`^XjU~Vez}Ybep;Vj>Ly=)JvifaY5B5c~a0oDuwDfz4)%Zi` zY0J<-&%{P;JDnX~+pPNVJ=T;F-<$eT!f`4}1xi) zF-*FgO=tKiGLHM6F$MweWr<3QXewJjj`w0tr_VNOdpysbjIfBmR?DFANbj;ebzYR^ z6H`nAVLHf276yWy9>2R<;!H$nG?Aw+Hk)sXoz5a0u;Bp)^g6MnbTY z;L6bh*%S*mbEEaabr^fZ66;!e{O*l-8ccyDFgApxx`0!$qR1s2)n5OGE*CcyGU;(S zayO6X{S6LLit@dm`10!`No`ED1cQ!E1rvRrdih`!k%vcA&Pb^YbLKA3r=fvpme@?O zLQgz!gXRL;Mx_`=12df&+Mc&mZtSS{srTZ! zipqQ`4h0m7TJvqaSQ4>Fo+v}2+bQlh$eCa;uBE&WH4KrSGc;v=tE8#9ie}s3dX1E` z@Xy0Tq27e8WU@?$;XR%4@G>@6XYTB=0x=Bh<9%`)ylJeTG5HZpb>ir@yoXw)f_ zHT$RI7Wnj<#0S#XY5Xh7T41?)UkY6>LHlpYS0dBV-|jCx)G+O|zV7Ff?wipOwaH(N zSzKOPh>FzJSc{E_U6HwU9?9LLO?3kVN`MD^>E+Q;u)-it-!)cFWnt#GX0LVBoAmgY z2FI4Cfm2Wz?USILP(qLMagRls&w9QgeRuWtIIXl=@xB+EsQk-on_o4HIt`|&8j1{Bv8lr^jlzo zL=)Y0jsb=w?*|-0Y%xbj0akbc&E@-0^@OL`QScZNY_TTFYrp+c z*m;JyKA-gbSP|15*DTx(qbBh_8z*kL!u;4-%C*YLk<;FW;CLX?Lfz&8;#8^kdJtx+ zb)Q;3wF!V8s-Im-lm;XVoe(X~x2u1AI!_YB-HW8**^O?k?K8s=^@R`A!C!T5eV}6D zjWFiMD^$^zIfrmxe?UEYXLWu6VVL%S*q055$RX<*Wv)dQe3gG`<-~e_i-xD3xGR$UYw8zby%%#*Zopx@CarDPU2fS%bFgacc#`* z?k71I0zYCh^<&PQ2t*X)vh*HAAak}SmGTu{cI2Bl#_nkYO|a?UCT{v?*Nw7x9v@!! z1`}~Z#HUm0;jBS-7ul<1){|f?29s5+>8;~7mw&{l?vG@@IV-y8G91()K60ynZF!IF z|43TJ{HTA0!$QRJ{dNQ_ZnPx)E8NcbQ$oYY&iuFLv+ptV&$X_CPp?tg&qe=`C6Cp6CZ7cNHMulf%g zqyLVD-!Dx43se6Z)BR7-`TzL!7pDG+qyPN*3se8X)IaWr|3OUsBclC?z5j%%|Dpk# zk%8$CMd-ilLhDNzv6>M;3Hs(0rb%cTJCn+6zo#TZDq!r3fE1@Gs*^Bm4lKD6?t6EN zN$$kcg={S4S89dB&iU5#aBaO_O@9*AMvVbJ-el5;iVTE<$aMDBY+`XLGx z+DVBA^37XKW-(wF%Pb)>)0W1Y+rTii_v+i+mec$B-J@Flhlg!rdxKs&jmxQlJEi?T zFLO~e%c6{m#9b|p1{Q<9ZwyJ-u6gfw*YLPN0^`h&1vo5~levzS_&F~jmEtdgN6Ko> z_#h6V!qN)^=Ggak>)xxtr_;-(>vmGSQ>~*jaR%xKkgAo`n`tpee;Iou7||U|s)FLp z=AA|Mx@sVPl=**NKX zHf+ilX>;STo-HtRqMm9YVzDM`1&Ē#~FXrGYnz$nG%d`S;o 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“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%0A&Eg?RJ_>Q6?H`^jS8Am#sJGB+h5c^&Exporuj-| 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

L3x- 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 z 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

-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

F*?el+eiD2~nm;c%)Bg$|>L_soETyGdXi} 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 literal 0 HcmV?d00001

3zU1*pPkQt0fH&;d5 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