1. 05 Aug, 2020 4 commits
    • Brad Barber's avatar
    • Brad Barber's avatar
    • Brad Barber's avatar
      md5sum's for Qhull 8.0.1 · ff990e2b
      Brad Barber authored
      ff990e2b
    • Brad Barber's avatar
      C++ interface for Qhull 8.0.1, 2020.2 · e23876c9
      Brad Barber authored
      - Removed Java-style iterators for Coordinates and PointCoordinates.
        std::vector has an expensive copy constructor and copy assignment.
        A pointer to std::vector is vulnerable to mysterious overwrites (e.g., deleting
        a returned value and reusing its memory).  Qt's 'foreach' should not be used for
        Coordinates and PointCoordinates.  It copies std::vector.
      - QHULL_DECLARE_SEQUENTIAL_ITERATOR: allow temporary results
        The Jave-style iterator copies the container.  Same as Qt's Q_DECLARE_SEQUENTIAL_ITERATOR
      - QhullHyperplaneIterator,QhullPointIterator,QhullPointsIterator: allow temporary results
        These Java-style iterators copy the container instead of pointing to the container
      - QhullLinkedListIterator,QhullFacetListIterator,QhullVertexListIterator: allow temporary results
        These Java-style iterators copy the container instead of pointing to the container
      - QhullSetIterator,QhullFacetSetIterator,QhullPointSetIterator,QhullVertexSetIterator: add documentation about temporary results
        These Java-style iterators have always copied the container
      - QhullUser.h, user_eg3_r.cpp: Removed C++11 dependencies [S. Grein #66,#67]
        QhullUser.cpp: Use intptr_t to avoid C++11 dependencies  [S. Grein, Spacelm #68]
      - QhullVertex.cpp: moved the copy constructor to the code file.  It was inline.
      
      Testing and example programs
      - user_eg3_r.cpp: Renamed 'inputSites' to 'voronoiRegions' in qvoronoi_o/qvoronoi_pfn [M. Konecny #72]
      - user_eg3_r.cpp: Replaced C++11's range-based for loops with Qhull's Java-style iterators
      - qh-code.html: Updated qhullcpp code example [M. Konecny #71]
      - QhullFacet_test.cpp: fixed hyperplane epsilon test in t_getSet. The epsilon due to rotation is unknown.
      - Qhull*List_test.cpp,Qhull*Set_test.cpp,QhullRidge_test,QhullVertex_test: test Qt's 'foreach' in t_foreach
      - Qhull*List_test.cpp,Qhull*Set_test.cpp,QhullRidge_test,QhullVertex_test: test C++11 range for in t_foreach
      - Qhull*List_test.cpp,Qhull*Set_test.cpp: test Java-style iterator in t_java_iterator
      - Coordinates_test.cpp,PointCoordinates_test.cpp,QhullHyperplane_test.cpp,QhullPoint_test.cpp,QhullPoints_test.cpp,RboxPoints_test.cpp
        test C++11 range for, Qt's 'foreach', and Java-style iterators (if available)
      
      Builds
      - README.txt: Fixed "cmake -G" for "Installing Qhull with CMake"
      - README.txt: Added a note on 'make install' to "Installing Qhull on Unix"
      - README.txt: Added 'make test' to "Installing Qhull on Unix"
      - README.txt: Added 'ctest' to "Installing Qhull with CMake"
      - README.txt: Added pkg-config notes to "Installing Qhull with CMake"
      - README.txt: Added usage notes for Windows to "Installing Qhull with CMake"
      - README.txt: Added instructions for downloading MinGW-W64-install.exe
      - build/qhull_p.pc.in,qhull_r.pc.in: Delete obsolete files [T. Roehling #63]
      - build/qhull.pc.in: move qhull.pc.in into the build/ directory [T. Roehling #63]
      
      Documentation
      - qh-code.htm, qhull-news.html: Add Toronto and McCarthy, "Practically accurate floating-point math".
      e23876c9
  2. 21 Jul, 2020 2 commits
  3. 20 Jul, 2020 1 commit
  4. 17 Jul, 2020 1 commit
  5. 19 Jun, 2020 2 commits
  6. 18 Jun, 2020 2 commits
  7. 05 Jun, 2020 2 commits
    • Brad Barber's avatar
      Qhull 2020.1 2020/05/29 (8.0.0) released · 4733a95b
      Brad Barber authored
      Qhull 2020.1 enhances the C++ interface with QhullUser and support for Voronoi diagrams.  See user_eg3
      for C++ examples.  Qhull builds support pkg-config, SONAME,
      DESTDIR for staged installs, PREFIX, QhullExport, and CMAKE_CURRENT_SOURCE_DIR.
      
      * QhullLinkedList::const_iterator fixed operator->().
      
      * RoadError::stringGlobalLog returns std::string instead of const char *
      
      * QhullUser is a user-modifiable interface to Qhull using a custom qh_fprintf.
      Option '[Ta](http://www.qhull.org/html/qh-optt.htm#Ta)' displays the message codes for Qhull output.
      qh_fprintf can trap these codes and transfer the data to QhullUser.
      
      * user_eg3 adds examples for convex hulls, Delaunay triangulations, and Voronoi diagrams.
      The examples can take their input from rbox or qhull.  'user_eg3 rbox' preserves the dimension for multiple options.
      
      * The new C++ methods are Qhull::isDelaunay, Qhull::prepareVoronoi,
      QhullFacet::visitId, QhullFacet::nextFacet2d, QhullFacet::setFacetT,
      QhullRidge::qh, QhullRidge::setRidgeT, and QhullVertex::setVertexT.
      
      * qh_order_vertexneighbors [io_r.c] orders facet neighbors of a vertex by 2-d (orientation), 3-d (adjacency), or n-d (f.visitid,id).
      
      * qh_nextfacet2d [poly2_r.c] returns 2-d facets and vertices in counter-clockwise order.
      
      * Qhull install adds pkg-config support via CMakeLists.txt and Makefile.  The template is qhull.pc.in.
      
      * CMakeLists.txt increases SOVERSION to 8.0.  Makefile reads SOVERSION from CMakeLists and creates a symbolic link for SONAME.  Qhull 2019.1 had ABI breakage that was not indicated by its SOVERSION 7.
      
      * CMakeLists.txt creates QhullExport/ for QhullConfig.  CMakeLists sets POSITION_INDEPENDENT_CODE for libqhullcpp.
      
      * Makefile supports GNU Makefile standards for DESTDIR and PREFIX.  Previous Qhull Makefiles used DESTDIR instead of PREFIX.
      
      * By default, Makefile compiles without -m32 and with -fpic.  Use variables M32 and FPIC for 32-bit builds without -fpic on 64-bit hosts.
      This reduces memory requirements and may be faster on older processors.
      
      * The -lm linker flag moved to the end of the linker command.
      4733a95b
    • Brad Barber's avatar
      Qhull 2020.1 2020/05/29 (8.0.0) released · d5952c11
      Brad Barber authored
      Qhull 2020.1 enhances the C++ interface with QhullUser and support for Voronoi diagrams.  See user_eg3
      for C++ examples.  Qhull builds support pkg-config, SONAME,
      DESTDIR for staged installs, PREFIX, QhullExport, and CMAKE_CURRENT_SOURCE_DIR.
      
      * QhullLinkedList::const_iterator fixed operator->().
      
      * RoadError::stringGlobalLog returns std::string instead of const char *
      
      * QhullUser is a user-modifiable interface to Qhull using a custom qh_fprintf.
      Option '[Ta](http://www.qhull.org/html/qh-optt.htm#Ta)' displays the message codes for Qhull output.
      qh_fprintf can trap these codes and transfer the data to QhullUser.
      
      * user_eg3 adds examples for convex hulls, Delaunay triangulations, and Voronoi diagrams.
      The examples can take their input from rbox or qhull.  'user_eg3 rbox' preserves the dimension for multiple options.
      
      * The new C++ methods are Qhull::isDelaunay, Qhull::prepareVoronoi,
      QhullFacet::visitId, QhullFacet::nextFacet2d, QhullFacet::setFacetT,
      QhullRidge::qh, QhullRidge::setRidgeT, and QhullVertex::setVertexT.
      
      * qh_order_vertexneighbors [io_r.c] orders facet neighbors of a vertex by 2-d (orientation), 3-d (adjacency), or n-d (f.visitid,id).
      
      * qh_nextfacet2d [poly2_r.c] returns 2-d facets and vertices in counter-clockwise order.
      
      * Qhull install adds pkg-config support via CMakeLists.txt and Makefile.  The template is qhull.pc.in.
      
      * CMakeLists.txt increases SOVERSION to 8.0.  Makefile reads SOVERSION from CMakeLists and creates a symbolic link for SONAME.  Qhull 2019.1 had ABI breakage that was not indicated by its SOVERSION 7.
      
      * CMakeLists.txt creates QhullExport/ for QhullConfig.  CMakeLists sets POSITION_INDEPENDENT_CODE for libqhullcpp.
      
      * Makefile supports GNU Makefile standards for DESTDIR and PREFIX.  Previous Qhull Makefiles used DESTDIR instead of PREFIX.
      
      * By default, Makefile compiles without -m32 and with -fpic.  Use variables M32 and FPIC for 32-bit builds without -fpic on 64-bit hosts.
      This reduces memory requirements and may be faster on older processors.
      
      * The -lm linker flag moved to the end of the linker command.
      d5952c11
  8. 26 May, 2020 3 commits
  9. 07 May, 2020 2 commits
  10. 12 Apr, 2020 1 commit
    • Timo Röhling's avatar
      Add pkg-config support · 9a2f8613
      Timo Röhling authored
      This PR implements the wishlist bug from #22. The pkg-config file format
      is pretty simple, it basically provides a bunch of compiler flags to
      compile and link against a library.
      
      I changed the default INSTALL_DIR locations to relative paths, because
      CMake expands relative paths to the CMAKE_INSTALL_PREFIX by default
      anyway, and it makes it possible to have both the CMake config and the
      pkg-config in a relocateable style.
      
      Most of the magic happens in the foreach() loop, which is a semicolon
      separated list of config values for the qhull.pc.in template in the form
      NAME;DESCRIPTION
      9a2f8613
  11. 05 Dec, 2019 1 commit
  12. 25 Oct, 2019 4 commits
  13. 21 Oct, 2019 1 commit
  14. 20 Sep, 2019 1 commit
  15. 01 Jul, 2019 1 commit
  16. 30 Jun, 2019 1 commit
  17. 29 Jun, 2019 5 commits
    • Brad Barber's avatar
      Add config.cmake.in to README and qhull-zip.sh · 7cca9583
      Brad Barber authored
      Uploaded a new tarball to www.qhull.org
      7cca9583
    • Brad Barber's avatar
      Ignore Cmake files · b94cff07
      Brad Barber authored
      b94cff07
    • Brad Barber's avatar
      Update CMake config file pull request #43 · e319aff0
      Brad Barber authored
      e319aff0
    • Brad Barber's avatar
      Qhull 2019.1 2019/06/21 (7.3.2) released · 15d90235
      Brad Barber authored
      Qhull 2019.1 contains bug fixes and improvements to logging, error reporting, and merging.
      - Fixed fifty bugs, including initialization bugs and memory corruption bugs
        in qh_readpoints and qh_option. See Bugs and Changes.txt.
      
      - New option 'TAn' stops Qhull after adding n points.
      - New option 'Tf' flushes qh_fprintf. Use 'Tf' when debugging segfaults.
      - New options '--help', '-?', and '--' display a short help message.
        Under Git for Windows or MSYS2, 'qhull' waits for stdin.
      
      - Option 'TP-1' turns on tracing after qh_buildhull and qh_postmerge complete.
        It traces qh_check_maxout, qh_prepare_output, qh_triangulate, and qh_voronoi_center
      - Options 'TI' and 'TO' do not require a space before the filename.
      
      - An unknown Qhull option is an error. It was a warning. Override with option 'Qw'.
      - Short or long input to Qhull is an error. It was a warning. Override with option 'Qa'.
      
      - Documentation encourages the use of joggled input. Joggled input is less precise than facet merging, but it cannot incur merge errors for degenerate input.
      - Documentation refers to 'dupridge' instead of 'duplicate ridge'. A dupridge is an erroneous ridge between four or more facets.
      - Fixed documentation for qh_findbestfacet.
        Delaunay triangulations may return an adjacent triangle [F. Drielsma].
      
      - The C++ interface includes new methods, hasNext() and hasPrevious(), for QhullFacet and QhullVertex.
      - Test scripts qtest.sh and q_benchmark help with logging and optimizing Qhull,
        particularly for intermittent errors and bad cases for Qhull.
      
      Fixed bugs in Qhull 2015.2 (see Changes.txt for the full list)
      - qh_buildcone_onlygood ('Qg') corrupted memory if it called qh_delfacet.
      - qh_check_maxout did not include qh.DISTround when checking f.maxoutside
      - qh_distround did not acount for 'Rn' (random roundoff) in option 'QJn'
      - qh_findbestfacet should document that it may return an adjacent triangle for Delaunay triangulations [F. Drielsma]
      - qh_findfacet_all should not search visible facets or f.upperdelaunay facets [P. Virtanen, S. Dominguez, J.Arkin]
      - qh_findgood may report a bad facet for qh.GOODvertex ('QVn'). Restrict the search to good facets.
      - qh_freebuild deleted unattached ridges, leading to a double delete
      - qh_initial_hull tested 'maybe flipped' instead of 'clearly flipped'. As a result facets could be incorrectly oriented, leading immediately to 'Only 4 facets remain' [S. Caron, P. Virtanen, D. Sterratt, others]
      - qh_initstatistics was missing initialization. As a result, the final qh_checkoutput may be skipped.
      - qh_initstatistics cannot use qh_fprintf to report errors. Use qh_fprintf_stderr
      - qh_maxsimplex did not detect nearly flat simplices except for the last vertex. It assumed the max coordinate was approximately 1. As a result, Qhull reported false narrow hulls or false low dimensional inputs. [J.R. Roussel, D. Sterratt]
      - qh_option could overflow the qh.qhull_options buffer
      - qh_partitionpoint could leave an outside point before qh.next_facet, leading to a skipped point.
      - qh_stddev was incorrect. It should be sqrt of absolute value.
      
      - 'Qbb' scaled the last coordinate to qh.MAXwidth causing loss of precision. It should be qh.MAXabs_coord.
      - 'rbox' and 'user_eg3' returned non-zero exit status for their help prompt. Should be 0.
      - 'rbox Cn,r,m' does not produce points for 'rbox r'
      - An error in qh_initqhull_start2 could loop forever. Need to set qh.NOerrexit
      - Do not call qh_check_points ('Tv') if reporting an error and qh.FORCEoutput ('Po')
      - If 'd' or 'v' was used with 'H', memory corruption occurred. Should be disallowed.
      - Improved searching of coplanar facets by qh_findbesthorizon.
      - Options 'Pdk' and 'Pdk' always returned the closest facet. This should only occur with option 'Pg'.
      - PointCoordinates::appendPoints should not require whitespace after a point
      - Setting qh.MINoutside could lead to verification ('Tv') failures. Fixed by setting qh.KEEPnearinside and calling qh_partitionpoint in qh_partitionall
      15d90235
    • Brad Barber's avatar
      Qhull 2019.1 2019/06/21 (7.3.2) released · 10886624
      Brad Barber authored
      Qhull 2019.1 contains bug fixes and improvements to logging, error reporting, and merging.
      - Fixed fifty bugs, including initialization bugs and memory corruption bugs
        in qh_readpoints and qh_option. See Bugs and Changes.txt.
      
      - New option 'TAn' stops Qhull after adding n points.
      - New option 'Tf' flushes qh_fprintf. Use 'Tf' when debugging segfaults.
      - New options '--help', '-?', and '--' display a short help message.
        Under Git for Windows or MSYS2, 'qhull' waits for stdin.
      
      - Option 'TP-1' turns on tracing after qh_buildhull and qh_postmerge complete.
        It traces qh_check_maxout, qh_prepare_output, qh_triangulate, and qh_voronoi_center
      - Options 'TI' and 'TO' do not require a space before the filename.
      
      - An unknown Qhull option is an error. It was a warning. Override with option 'Qw'.
      - Short or long input to Qhull is an error. It was a warning. Override with option 'Qa'.
      
      - Documentation encourages the use of joggled input. Joggled input is less precise than facet merging, but it cannot incur merge errors for degenerate input.
      - Documentation refers to 'dupridge' instead of 'duplicate ridge'. A dupridge is an erroneous ridge between four or more facets.
      - Fixed documentation for qh_findbestfacet.
        Delaunay triangulations may return an adjacent triangle [F. Drielsma].
      
      - The C++ interface includes new methods, hasNext() and hasPrevious(), for QhullFacet and QhullVertex.
      - Test scripts qtest.sh and q_benchmark help with logging and optimizing Qhull,
        particularly for intermittent errors and bad cases for Qhull.
      
      Fixed bugs in Qhull 2015.2 (see Changes.txt for the full list)
      - qh_buildcone_onlygood ('Qg') corrupted memory if it called qh_delfacet.
      - qh_check_maxout did not include qh.DISTround when checking f.maxoutside
      - qh_distround did not acount for 'Rn' (random roundoff) in option 'QJn'
      - qh_findbestfacet should document that it may return an adjacent triangle for Delaunay triangulations [F. Drielsma]
      - qh_findfacet_all should not search visible facets or f.upperdelaunay facets [P. Virtanen, S. Dominguez, J.Arkin]
      - qh_findgood may report a bad facet for qh.GOODvertex ('QVn'). Restrict the search to good facets.
      - qh_freebuild deleted unattached ridges, leading to a double delete
      - qh_initial_hull tested 'maybe flipped' instead of 'clearly flipped'. As a result facets could be incorrectly oriented, leading immediately to 'Only 4 facets remain' [S. Caron, P. Virtanen, D. Sterratt, others]
      - qh_initstatistics was missing initialization. As a result, the final qh_checkoutput may be skipped.
      - qh_initstatistics cannot use qh_fprintf to report errors. Use qh_fprintf_stderr
      - qh_maxsimplex did not detect nearly flat simplices except for the last vertex. It assumed the max coordinate was approximately 1. As a result, Qhull reported false narrow hulls or false low dimensional inputs. [J.R. Roussel, D. Sterratt]
      - qh_option could overflow the qh.qhull_options buffer
      - qh_partitionpoint could leave an outside point before qh.next_facet, leading to a skipped point.
      - qh_stddev was incorrect. It should be sqrt of absolute value.
      
      - 'Qbb' scaled the last coordinate to qh.MAXwidth causing loss of precision. It should be qh.MAXabs_coord.
      - 'rbox' and 'user_eg3' returned non-zero exit status for their help prompt. Should be 0.
      - 'rbox Cn,r,m' does not produce points for 'rbox r'
      - An error in qh_initqhull_start2 could loop forever. Need to set qh.NOerrexit
      - Do not call qh_check_points ('Tv') if reporting an error and qh.FORCEoutput ('Po')
      - If 'd' or 'v' was used with 'H', memory corruption occurred. Should be disallowed.
      - Improved searching of coplanar facets by qh_findbesthorizon.
      - Options 'Pdk' and 'Pdk' always returned the closest facet. This should only occur with option 'Pg'.
      - PointCoordinates::appendPoints should not require whitespace after a point
      - Setting qh.MINoutside could lead to verification ('Tv') failures. Fixed by setting qh.KEEPnearinside and calling qh_partitionpoint in qh_partitionall
      10886624
  18. 19 Jun, 2019 1 commit
  19. 17 Jun, 2019 1 commit
  20. 14 Jun, 2019 1 commit
  21. 06 Jun, 2019 1 commit
  22. 25 May, 2019 2 commits
    • Brad Barber's avatar
      Fix text for 'Qa' · 30ef8b0c
      Brad Barber authored
      Fix download links for qh-get.htm
      Mark as QH110nn FIX:
      30ef8b0c
    • Brad Barber's avatar
      Relese candidate Qhull 2019.0.1 2019/05/24 (7.3.1) with improved logging,... · c580cb03
      Brad Barber authored
      Relese candidate Qhull 2019.0.1 2019/05/24 (7.3.1) with improved logging, error reporting, and merging.
      
      * Unknown options report an error instead of a warning.  Override with option '[Qw](https://github.com/qhull/qhull/blob/master/html/qh-optq.htm#Qw)'
      * Short or long inputs report an error instead of a warning.  Override with option '[Qa](https://github.com/qhull/qhull/blob/master/html/qh-optq.htm#Qa)'
      * Option '[TAn](https://github.com/qhull/qhull/blob/master/html/qh-optt.htm#TAn)' stops Qhull after adding n points
      * Option '[Tf](https://github.com/qhull/qhull/blob/master/html/qh-optt.htm#Tf)' flushes each qh_fprintf for debugging segfaults
      * Options '--help', '-?', and '--' display a short help message.
      * Fix almost 50 bugs (including memory corruption bugs in qh_readpoints and qh_option)
      * Add C++ methods hasNext() and hasPrevious() to QhullFacet and QhullVertex
      * Encourage the use of joggled input ('[QJ](https://github.com/qhull/qhull/blob/master/html/qh-optq.htm#QJ)').
      Joggled input is less precise than facet merging, but cannot incur topological and wide merge errors.
      * In documentation, use 'dupridge' instead of 'duplicate ridge' for ridges with more than two neighbors.
      Reserve 'duplicate ridge' for two ridges with the same vertices.
      * [eg/q_benchmark](https://github.com/qhull/qhull/blob/master/eg/q_benchmark) and [eg/qtest.sh](https://github.com/qhull/qhull/blob/master/eg/qtest.sh) make multiple runs for testing,
      benchmarking, and debugging Qhull.   It helps analyze intermittent errors such as seen with pinched vertices.
      See [eg/q_benchmark-ok.txt](https://github.com/qhull/qhull/blob/master/eg/q_benchmark-ok.txt).
      * See [Changes.txt](https://github.com/qhull/qhull/blob/master/src/Changes.txt) for additional changes.
      
      An experimental option, '[Q14](https://github.com/qhull/qhull/blob/master/html/qh-optq.htm#Q14)', merges
      pinched vertices.  *Pinched vertices* are
      nearly adjacent vertices (ca. 1.0E-13 apart on the unit cube).  They are far enough
      apart to avoid geometric errors, but not far enough apart to avoid topological errors.  An example
      of a topological error is four facets that share the same ridge; a ridge should only have two neighboring facets.
      Qhull 2015.2 merges facets to repair these errors, but it may fail, especially for multiple pinched vertices.
      
      Qhull options
      - Error if option warning (e.g., rbox 10 | qhull Qy), override error with 'Qw'
      - Error if 'd', 'v', or 'Hn,n,n' are used together
      - New option 'Qallow-short': allow short input with fewer points than coordinates
      - New option 'Qwarn-allow': allow option warnings
      - New option 'TAn': stop after adding n vertices
      - New option 'Tf': flush after qh_fprintf for debugging segfaults
      - New experimental option 'Q14-merge-pinched-vertices': merge pinched vertices due to dupridge
        Excessive merging leads to additional topological and wide facet errors
      - New experimental option 'Q15-check-duplicates': check for duplicate ridges with the same vertices
      - Option 'Q1' merges by mergetype/angle instead of mergetype/distance, coplanar merges first
        In 2015.2 by default, Qhull merged by mergetype/angle with lower angles first
      - Option 'TP-1' turns on tracing after qh_buildhull and qh_postmerge
        It traces qh_check_maxout, qh_prepare_output, qh_triangulate, qh_voronoi_center
      - Allow '-?' and "--help" (or "--") as alternatives for short prompts
        Qhull does not support '--' options
        Git for Windows v2.21.0 does not support isatty ('winpty qhull' is OK)
      - Allow Qhull extra options Q12 and Q14 for qconvex/qdelaunay/qhalf/qvoronoi
      - Allow option 'QRn' (random rotate) for qdelaunay/qhalf/qvoronoi
      - Alphabetize short prompts (qhull .)
      - Alphabetize long prompts w/ normal options first (qhull -)
      - Alphabetize option help by option code
      - Add 'Number of merged pinched vertices' to summary ('s')
      - Add 'TI file' to help message for qconvex/qdelaunay/qhalf/qvoronoi
      - Dropped experimental option 'Q16-simplex-merge'.   Centrums are required for convexity
      - Ignore missing space after 'TI' or 'TO'.  Allow 'TIinputfile' and 'TOoutputfile'
      - Prefix option errors and warnings with 'qhull option error:' or 'qhull option warning:'
      - Remove hidden option 'normals' from help prompts for qdelaunay, qhalf, qvoronoi
      - Reword short prompts to 'Pdrop-d0:0D0', 'QbBound-0:0.5', and 'off_format'
      - Updated qh-quick.htm, 'qhull -', and 'qhull .' for 'T...' and 'Q...' options.
        Separate help prompts for 'T options' and 'Trace options'
      - Use '-' instead of '_' for word delimiter in option names
      
      Qhull builds, scripts, and debugging
      - Add qh.traceridge, qh.traceridge_id, and qh_delridge for debugging by ridge in qh_fprintf
      - Check for qhull with 'which qhull' instead of 'qhull', avoids hangs in git bash
      - Makefile/CC_WARNINGS: Add instructions for collecting and testing gcc warnings
      - Makefile/benchmark: Add q_benchmark, 10 runs of each
      - Makefile/clean: Delete linked files from src/libqhull and src/libqhull_r, as in their Makefiles
      - Makefile/help: Add 'make all' to 'make help' prompts
      - Makefile/libqhull_r.so: Add target for creating symbolic link
      - Makefile/qhullx: Add test of testqset and testqset_r
      - Makefile/qhullx: Create bin/ directory if missing
      - Makefile/test: Add user_eg3 help prompt
      - Makefile/testall: Add q_benchmark, 1 run of each
      - eg/make-vcproj.sh/qhullx: Build bin/qhullx from src/qhullx/ for comparison
      - eg/q_benchmark: new script for measuring Qhull precision and performance with qtest.sh
      - eg/q_test: update error messages for missing bin/ and bin/libqhull_r.dll
      - eg/q_test: tests of Tf and TAn
      - eg/qhull-zip.sh: add note that it requires road-script.sh from http://www.qhull.org/road/
      - eg/qhull-zip.sh: check source depencencies for prompts
      - eg/qtest.sh: new script for testing Qhull and summarizing its trace files
      - libqhull_r/Makefile: install target creates $INCDIR/libqhull_r and $LIBDIR
      - libqhull_r.h/qh_ERRdebug: define error status for debugging exits
      
      Qhull fixed bugs
      - html/qh-optp.htm: options 'PDk' and 'Pdk' require option 'Pg' to return the closest facet
      - Makefile/qhullx: fixed qhullx compile of testqset and testqset_r
      - PointCoordinates.cpp/appendPoints: read 'in >> p' instead of 'in >> p >> ws'
        otherwise istream fails if file does not end with whitespace
      - geom_r.c/qh_findbesthorizon: fix test for Zfindjump (bestdist jumps by searchdist)
      - geom_r.c/qh_findbesthorizon: increased minsearch of coplanar facets if ischeckmax and more than 100 neighbors
      - geom_r.c/qh_sethyperplane_det: dropped precision statistic Znearlysingular (it's Zminnorm)
      - geom2_r.c/qh_detjoggle: use 'En' (roundoff) if specified by options
      - geom2_r.c/qh_distround: move adjustment for 'Rn' into qh_distround.  'QJn' did not account for 'Rn'
      - global_r.c/qh_checkflags: handle two-digit Q options in hiddenflags
      - global_r.c/qh_freebuild: do not delete unattached ridges, otherwise a double delete.  Should not occur
      - global_r.c/qh_option: fix potential overflow of qh.qhull_options
      - global_r.c/qh_initflags: fixed incorrect indentation for option 'TO file'
      - global_r.c/qh_initqhull_start2: set qh.NOerrexit True
      - io_r.c/qh_eachvoronoi: allow fp==NULL for QhullQh::qh_fprintf to appendQhullMessage
      - io_r.c/qh_readpoints: error if 'd' or 'v' with 'H', otherwise memory corruption
      - libqhull_r.h/qh.MERGEvertices: fixed comment, 'Q3' disables this feature
      - libqhull_r.c/qh_buildcone_onlygood: cannot qh_delfacet inside FORALLnew_facets
      - libqhull_r.c/qh_partitionpoint: if qh.NARROWhull and bestdist>qh.MINoutside and isnewoutside,
        may need to move facet to qh.newfacet_list for qh.next_facet
      - libqhull_r.c/qh_printsummary: Zdistconvex is for checking convexity instead of testing convexity
      - libqhull_r.c/qh_findhorizon: coplanar horizon if apex >= -qh.MAXcoplanar, instead of > -qh.MAXcoplanar
      - mem_r.c/qh_memcheck: define null qh_memcheck if qh_NOmem
      - merge_r.c/qh_mergecycle_all: turn on tracing, 'TMn', for coplanar horizon merge of one facet
      - merge_r.c/qh_mergefacet2d: do not create ridges for neighborB.  The opposite neighbor may be tested
      - merge_r.c/qh_test_centrum_merge: coplanar if centrum >= -qh.centrum_radius, instead of > -qh.centrum_radius
      - merge_r.c/qh_test_nonsimplicial_merge: coplanar if centrum >= -qh.centrum_radius, instead of > -qh.centrum_radius
      - merge_r.c/qh_tracemerging: fixed "qhull has merged" prompt
      - merge_r.c/qh_willdelete: empty f.neighbors and f.ridges, references are no longer valid, will be deleted
      - poly_r.c/qh_checkflipped: flipped if qh.interior_point >= -qh.DISTround, instead of > -qh.DISTround
      - poly2_r.c/qh_addfacetvertex: initialize vertex_i in case f.vertices is empty
      - poly2_r.c/qh_check_maxout: need to include qh.DISTround when checking f.maxoutside with qh.maxoutside
      - poly2_r.c/qh_checkconvex: fix documentation for qh_DATAfault.  It is restricted to qh_initialhull with qh.ZEROcentrum
      - poly2_r.c/qh_checkconvex: coplanar if >= -qh.DISTround, instead of > -qh.DISTround
      - poly2_r.c/qh_checkconvex: check simplicial ridges if !qh.MERGING && qh.ZEROcentrum (unlikely or not-possible)
      - poly2_r.c/qh_findgood: restrict qh.GOODvertex ('QVn') to good facets
      - poly2_r.c/qh_findgood_all: unless 'Pg', ignore qh.GOODclosest for nearest facet to thresholds.
           'PdD' reports 0 good facets
      - poly2_r.c/qh_replacefacetvertex: initialize vertex_n in case f.vertices is empty
      - qconvex.c,qdelaunay.c,etc.: remove automatic 'Qx' for 5-d and higher.  Set by default in qh_initqhull_globals
      - qvoronoi_r.c/qh_prompt: remove disabled option 'TRn' from help prompt
      - random_r.c/qh_argv_to_command: fixed missing braces, same behavior as before
      - rbox_r.c: return 0 exit status on prompt
      - rboxlib.c/qh_rboxpoints: use qh_fprintf_stderr instead of qh_fprintf_rbox.  Avoid qh_errexit_rbox
      - rboxlib.c/qh_rboxpoints2: clear rbox_inuse on exit, as in error exit
      - rboxlib_r.c/qh_rboxpoints2: incorrect string arg to 'rbox error: unknown flag'
      - rboxlib_r.c/qh_rboxpoints2: remove superfluous qh_free(*simplex)
      - stat_r.c/qh_initstatistics: due to NOerrors cannot use qh_fprintf, use qh_fprintf_stderr instead
      - stat_r.c/qh_stddev: return sqrt of absolute value
      - testqset_r.c: if qh_NOmem, do not call qh_memfreeshort
      - user_eg_r.c,user_eg2_r.c: if qh_NOmem, call qh_freeqhull(qh, qh_ALL) instead of qh_memfreeshort
      - user_eg3_r.cpp: return 0 exit status on prompt
      
      Qhull fixed bugs introduced by 2018.0
      - libqhull_r.c/qh_addpoint: clear qh.retry_addpoint on success
      - libqhull_r.c/qh_buildcone_mergepinched: cannot qh_delfacet inside FORALLnew_facets
      - libqhull_r.c/qh_partitioncoplanar: clear qh.repart_id on exit for infinite recursion detect
      - geom2_4.c/qh_detmaxoutside: move qh_option call to qh_errexit
      - merge_r.c/mergetypes[]: fixed order by mergeT
      - merge_r.c/qh_all_vertexmerges: fix retryfacet for repeated calls
      - merge_r.c/qh_forcedmerge: f.dupridge retained after MRGdupridge
        hides MRGdegenerate in qh_test_degen_neighbors and qh_test_redundant_neighbors
      - merge_r.c/qh_postmerge: call qh_freemergesets
      - merge_r.c/qh_test_nonsimplicial_merge: clear iscoplanar if isconcave and any vertex is not coplanar
      - poly2_r.c/qh_triangulate: move reset of f.degenerate into delete facet loop
      
      Qhull C++
      - QhullFacet.cpp: add hasNext() and hasPrevious()
      - QhullVertex.cpp: add hasNext() and hasPrevious()
      - qhulltest-64/QhullFacet_test.cpp,QhullVertex_test.cpp: test hasNext, hasPrevious, and hasPrevious iterator
      - user_eg3.cpp: use 'qhull-cout' for option 'Tz' (trace to cout)
      
      Qhull errors, warnings, and tracing
      - Error messages rewritten and error codes changed (see qh_fprintf)
        Renumbered Qhull warnings as 'QH7xxx' if needed (e.g., QH9375)
        Reused unused error and message codes ("def counters" in user_r.h/msgcode)
        Please check your code if it depends on error and message codes
      - Initialize variables to avoid potential uninitialized warnings
      - Use qh_ERRqhull for Qhull internal errors, "qhull internal error (qh_...): ..."
      - Use 'defined()' for qh_QHpointer_dllimport and qh_dllimport (-Wundef)
      - Use 'defined()' for __cplusplus, _MSC_VER, __MWERKS__, and __POWERPC__ (-Wundef)
      - Use 'Early exit' instead of 'At a premature exit'
      - libqhull_r.h/qh_ERRother: define error status for non-internal errors
      - libqhull_r.h/qh_ERRtopology: define error status for qhull topology errors
      - libqhull_r.h/qh_ERRwide: define error status for wide facets due to qhull precision error
      - geom_r.c/qh_setfacetplane: add qh_printfacet if qh.tracefacet for qh.tracefacet_id
      - global_r.c/qh_freebuild: record previousfacet/ridge/vertex in case a memory fault occurs
      - global_r.c/qh_init_flags: improved error message for 'cannot open file' for 'TO f'
      - global_r.c/qh_init_flags: improved warning message for 'unknown option'
      - global_r.c/qh_initbuild: add trace options to "Trace level ..."
      - global_r.c/qh_initqhull_globals: error if qh.VORONOI without qh.DELAUNAY
      - global_r.c/qh_initqhull_globals: error if numpoints is <1 or >qh_POINTSmax (INT_MAX-16)
      - global_r.c/qh_lib_check: use C-style comment for _CrtSetBreakAlloc
      - io_r.c/qh_printfacetheader: add "max" if f.merges==qh_MAXnummerge (511)
      - io_r.c/qh_readpoints: error if numinput is <1 or >qh_POINTSmax (INT_MAX-16)
      - io_r.c/qh_readpoints: moved up 'chop' of qh.rbox_command to report short input errors
      - io_r.c/qh_readpoints: replace warning QH7073 with error message. Override with Qallow-short
      - libqhull_r.c/qh_addpoint: if 'T4', check qh.visible_list before qh_partitionvisible
      - libqhull_r.c/qh_buildtracing: add delta cpu/facets/hyperplanes to QH1049 'qh_addpoint: add p%d...'
      - merge_r.c/qh_findbest_pinchedvertex: replaced assert with a 'qhull internal error'
      - merge_r.c/qh_check_dupridge: drop advice about reporting wide merges for error QH6271
      - merge_r.c/qh_mark_dupridges: topological error if multiple dupridges for one facet, not handled
      - merge_r.c/qh_test_nonsimplicial_merge: if Qx and many merges, replace centrum_radius with maxoutside
      - poly_r.c/qh_matchneighbor: drop extra warnings for duplicate facet (QH7084)
      - poly_r.c/qh_matchnewfacets: check for simplicial facets on qh.newfacet_list, otherwise memory overwrite by qh_matchneighbor
      - poly2_r.c/qh_checkconvex: identify simplicial checking of vertices (qh.ZEROcentrum, default)
      - poly2_r.c/qh_checkconvex: distinguish above from coplanar for non-convex initial simplex
      - poly2_r.c/qh_checkconvex: "non-convex initial simplex" for qh_joggle_restart
      - poly2_r.c/qh_checkfacet: check f.id and f.vertex_visit
      - poly2_r.c/qh_checklists: check and repair facet and vertex lists for infinite loops or overwritten facets/vertices
      - poly2_r.c/qh_checkpolygon: if qh.NEWfacets, check visible facets for empty f.neighbors and f.ridges
      - poly2_r.c/qh_checkpolygon: add qh_checkvertex
      - poly2_r.c/qh_checkpolygon: check f.previous and v.previous links (for C++)
      - poly2_r.c/qh_checkvertex: add parameters for allchecks and waserror (like qh_checkfacet)
      - poly2_r.c/qh_checkvertex: check v.id and v.vertex_visit
      - qvoronoi.c/hidden_options: hide option 'FM'. Maple output is not available
      - rboxlib_r.c/qh_rboxpoints: use QH6... for error codes instead of QH7070 and QH7071
      - stat_r.c/qh_stddev: check for division by 0
      - testqset_r.c: send all messages, except 'OK' to stderr
      - testqset_r.c: reassign unique QH8nnn codes, 8001/etc in use by libqhull_r
      - user_r.c/qh_printhelp_internal: add descriptive message for a Qhull internal error
      - user_r.c/qh_printhelp_narrowhull: add option 'Qs' (search all points)
      - user_r.c/qh_printhelp_topology: add descriptive message for a Qhull topology error
      - user_r.c/qh_printhelp_wide: add descriptive message for a wide merge error
      - user_eg_r.c: add fflush and '=======' markers to interleave stdout with stderr (MSYS2)
      - user_eg2_r.c: add fflush and '=======' markers to interleave stdout with stderr (MSYS2)
      - user_eg2_r.c: add warning about calling qh_addpoint after qh_qhull with 'QJ' (joggle)
      
      Qhull documentation and statistics
      - Add Index to README.txt
      - Add links to Wiki, http://github.com/qhull/qhull/wiki
      - Add links to local home page (index.htm)
      - Add GitHub, Scholar, and Code to navigation bar on home page
      - Change numbered fixups to 'QH11... FIXUP: '
      - Chrome and Internet Explorer load '.c' and '.h' files as text/html from the Web
        These browsers along with Firefox do not read disk files as text/html
        Changed 'Functions' link from a local link to "http://www.qhull.org/src/libqhull_r/index.htm"
      - Document implicit parameters at end of parameter list with '/* qh. ... */'
      - Limit maximum length of literals to 1800 characters
      - Move 'called by' comments to start of 'notes:'
      - Option 'QRn' appends the actual QRn to the summary line ('s')
      - Remove references to 'Qx' in 5-d and higher.  It is automatically set by default.
      - Replace references to 'src/libqhull/*.htm' with reentrant 'src/libqhull_r/*_r.htm'
      - Retitle 'Qhull internals' as 'Qhull code'
      - Use 'nearly adjacent vertices' instead of 'nearly coincident points'
      - Use 'dupridge' instead of 'duplicate ridge' for ridges with more than two neighbors.
        Reserve 'duplicate ridge' for two ridges with the same vertices.
      - Various edits to documentation (*.htm)
      - Update copyright to 2019
      - eg/q_test: Add examples to q_test "front ends"
      - html/index.htm: Add 'Limitations of merged facets' to the Qhull manual
      - html/index.htm: Add links to qdelaun_f.htm and qvoroin_f.htm (furthest-site)
      - html/qconvex.htm,etc: update synopsis and options
      - html/qh-code.htm: Add 'qh_addpoint' trace to 'Performance of Qhull'
      - html/qh-code.htm: Add a section on 'Debugging Qhull' with subsections for error codes,
        infinite loops, trace options, core dumps, segfaults, qtest.sh, and memory errors.
      - html/qh-impre.htm: Add 'Topological error' to 'Precision problems'
      - html/qh-impre.htm: Add 'Topological errors' to 'Limitations of merged facets'
      - html/qh-impre.htm: Add "narrow range of values" to 'Uneven dimensions'
      - html/qh-optq.htm: Add note to 'QJ' (joggle) about calls to qh_addpoint
      - html/qh-optt.htm#'Tc': 'T4' makes additional checks beyond check-frequently
      - html/qhalf.htm: Split the first example to clarify the "feasible point" for qhalf
      - html/qhalf.htm: Use 'feasible point' instead of 'interior point' for halfspace intersection
        Same as Qhull::feasiblePoint and distinguished from qh.interior_point
      - html/qhull.man,qhull.txt: updated man page
      - libqhull_r.h: update documentation for PRINTgood, GOODpoint, GOODvertex
      - qhull_ra.h: include '<limits.h>'.  Used for INT_MAX,etc.
      - stat.h: add zretryadd stats for qh_merge_pinchedvertices
      - stat.h: add zvertextests for distance tests of vertices for merging
      - libqhull_r/*: document global variables as 'qh.'
      - libqhull_r/*: fix libqhull/... links
      - libqhull_r.c/qh_partitioncoplanar: reword Zpartflip as Zpartcorner with updated messages
      - merge_r.c/qh_merge_degenredundant: rename statistic Zneighbor to Zredundant
      - stat_r.c: new or reworded statistics for Zpartcorner, Zparthidden, Zparttwisted, Zpinchduplicate, Zpinchedvertex
      - stat_r.c: rename 'renamed vertex statistics' to 'statistics for vertex merges'
      - stat_r.c: add merge statistics for MRGconcavecoplanar
      - stat_r.c/qh_allstat: add ' ' before parens in statistics
      - user_eg_r.c,user_eg2_r.c: rewrote prompt
      
      Qhull changes
      - For simple initializers, remove spaces (e.g., 'for (i=0; ...')
      - Normalize spacing for libqhull
      - Normalize spacing as 'for (i=0; ...' for simple initializers
      - Review use of '>' for comparison to negative quantities.  Usually should be '>=', e.g., for coplanar tests
      - Reassigned 8xxx and 9xxx codes as trace codes if traced at T3 or lower
      - Remove unused variables
      - Test floating point values with 0.0 instead of 0 (qh.premerge_centrum,lower_bound,upper_bound)
      - Use SETsecondt_() and SETelemt_() instead of SETelem_() when assigning to a specific type
      - Use '(type *)' for pointer casts.  It makes the cast more visible.
      - Use void for empty parameter lists
      - geom_r.c/qh_findbesthorizon: mark startfacet visited, avoids unnecessary visit
      - geom2_r.c/qh_detmaxoutside: determine precision target qh.MAXoutside (option _maxoutside at error exit)
        replaces 'maxoutside' computation
      - geom2_r.c/qh_maxsimplex: add ratio test for false narrow hull with search for prevdet
      - global_r.c/qh_freebuild: free global sets first instead of last, otherwise dangling references
      - io_r.c/qh_compare_nummerge: renamed qh_compare_facetmerge due to conflict with merge_r.h
      - io_r.c/qh_compare_vertexpoint: remove this routine.  Not usable in libqhull_r due to 'qh'
      - io_r.c/qh_printfacetridges: do not print ridge if already printed (e.g., duplicate neighbors for merge of simplicial facets)
      - io_r.c/qh_produce_output2: fflush of qh.fout to show statistics and verification after output (MSYS2)
      - libqhull_r.h/qh.ALLOWwide: rename qh.NOwide to qh.ALLOWwide for 'Q12-allow-wide'
      - libqhull_r.h/qh.IGNOREpinched: replaced qh.MERGEpinched with reversed meaning
      - libqhull_r.c/qh_addpoint: 'TVn' stops after qh_all_vertexmerges, not before qh_resetlists.  Matches documentation
      - merge_r.h/MRGdupridge: renamed MRGridge
      - merge_r.h/qh_ANGLEconcave,etc.: replace mergetype indicators with qh_ANGLEnone and m.mergetype
      - merge_r.c/qh_all_vertexmerges: replace qh_getmergeset_initial with qh_getmergeset.  No facets created
      - merge_r.c/qh_all_vertexmerges: move while loop into qh_all_vertexmerges
      - merge_r.c/qh_append_mergeset: ignore merges into a MRGdegen facet (f.degenerate)
      - merge_r.c/qh_buildcone_mergepinched: clean up code and design documentation
      - merge_r.c/qh_compare_anglemerge: renamed qh_compareangle and sort by mergetype as well as angle
      - merge_r.c/qh_compare_facetmerge: merge MRGcoplanar before MRGconcave, opposite order from 2015.2
                                         sort MRGanglecoplanar by angle
      - merge_r.c/qh_degen_redundant_facet,qh_test_degen_neighbors: moved into qh_mergefacet due to qh_willdelete
      - merge_r.c/qh_getmergeset,qh_getmergeset_initial: set f.tested after testing ridges, not before
      - merge_r.c/qh_next_facetmerge: split out next merge from qh_all_merges and replace qsort
      - merge_r.c/qh_findbest_pinchedvertex,qh_findbest_ridgevertex: dropped selecting merge direction via qh_vertex_isbelow.  Expensive and evidence mixed
      - merge_r.c/qh_freemergesets,qh_initmergesets: pair qh_initmergesets with qh_freemergesets
      - merge_r.c/qh_freemergesets,qh_initmergesets: drop the 'all' parameter
      - merge_r.c/qh_mergecycle_all: move qh_merge_degenredundant, etc. to end from qh_premerge
      - merge_r.c/qh_mergesimplex: delete facet1 from facet2.neighbors at end, not at ridge
      - merge_r.c/qh_post_merges,qh_all_merges: remove setting of v.delridge on all vertices, not needed
      - merge_r.c/qh_premerge: replace parameter 'apex' with 'apexpointid'.  Only used for logging
      - merge_r.c/qh_premerge: add qh.newfacet_list as an implicit parameter
      - merge_r.c/qh_test_degen_neighbors: split from qh_degen_redundant_neighbors and qh_mergefacet
      - merge_r.c/qh_test_redundant_neighbors: split from qh_degen_redundant_neighbors and qh_mergefacet
      - poly_r.c/qh_attachnewfacets: clear f.neighbors and f.ridges for visible facets, will be deleted
      - poly_r.c/qh_matchnewfacets: remove call to qh_checkflipped_all for qh.FORCEoutput, checked by qh_setfacetplane
      - poly_r.c/qh_update_vertexneighbors: renamed qh_updatevertices. A future version will optimize
        qh_update_vertexneighbors_cone: optimization for cone of new facets
      - poly2_r.c/qh_checkconvex: immediate skip of f.tricoplanar facets.  Tricoplanar facets not tested.  Called before qh_triangulate
      - poly2_r.c/qh_initbuild: move 'create sentinels' before qh_createsimplex so that qh.vertex_tail is v0 like f0
      - poly2_r.c/qh_initialvertices: cleaned up code for qh_INITIALmax (8-d)
      - poly2_r.c/qh_makenewfacets: clear f.neighbors and f.ridges for visible facets, will be deleted
      - poly2_r.c/qh_matchdupridge: optimize dupridge for flipped->!flipped, good merge, not !flipped->flipped
      - poly2_r.c/qh_matchdupridge_coplanarhorizon: dropped routine.  Results same or slightly worse.  Complex addition, rarely used
      - poly2_r.c/qh_triangulate: rename facet and vertex lists as triangulated_facet_list,etc.
        qh_triangulate does not maintain qh.newfacet_list or qh.visible_list
      - poly2_r.c/qh_triangulate: ignore qh.NEWfacets. qh_checkpolygon is not valid inside qh_triangulate
      - rboxlib_r.c/qh_rboxpoints2: split function from qh_rboxpoints to avoid -Wclobbered
      - stat_r.c/qh_printstatlevel: remove unused NULLfield
      
      Qhull C++ changes
      - Use NULL instead of 0 for pointers
      - Remove old style casts such as '(size_t)...'
      - Define initializers for default constructors even if explicitly assigned
      - Update static initializer list for s_empty_facet, s_empty_ridge, s_empty_vertex
      - Coordinates.h: default constructor clears coordinate_array
      - Coordinates.h: default iterator constructor clears i
      - RboxPoints.cpp/qh_fprintf_rbox: add empty default to switch statement
      c580cb03