-
v8.0.1e8bcf2fa · ·
Qhull 8.0.1 (2020.2 2020/07/24) C++ interface - Removed Java-style iterators for Coordinates and PointCoordinates. std::vector has an expensive copy constructor and copy assignment, and 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 [G. Romualdi, S. Grein #65, #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".
-
2020.14733a95b · ·
Qhull 2020.1 2020/05/29 (8.0.0) Bugs fixed - QhullLinkedList::const_iterator: Fixed operator->() for T*. It returned &i [J. Mirabel 5/1/2020 #61] API changes - RoadError.cpp: stringGlobalLog returns std::string instead of const char* [M. Gehre #46] - io_r.c/qh_order_vertexneighbors: order facet neighbors of a vertex by 2-d (orientation), 3-d (adjacency), n-d (f.visitid,id) [I. Gardner] - poly2_r.c/qh_nextfacet2d: Return next facet and vertex in qh_ORIENTclock order [N. Katzakis #54] C++ interface - Qhull.cpp: Add isDelaunay(). True if computing Delaunay or Voronoi regions Add prepareVoronoi() for Voronoi output. See user_eg3_r.cpp for examples ~Qhull: Change 'Qhull output at end' to 'Qhull messages at ~Qhull()' - QhullFacet.cpp: Add visitId() for f.visitid. Needed for Voronoi output Add nextFacet2d(): Iterate 2-d facets and vertices in counter-clockwise order [N. Katzakis #54] Add setFacetT() - QhullRidge.cpp: Add setRidgeT() and qh() - QhullUser.cpp: Add a user-modifiable interface to Qhull using a custom qh_fprintf Enhanced qh_fprintf with qhull-2019.1 updates to userprintf_r Option 'Ta' prefixes output with message code, [QHnnnn] Option 'Tf' flushes the output after each message, for tracing segfaults Errors and high-level trace messages prefixed with QHnnnn Debugging traps for qh.tracefacet, qh.traceridge, qh.tracevertex - QhullVertex.cpp: Add setVertexT() - QhullQh.cpp: moved qh_fprintf to QhullUser - RoadLogEvent::toString: do not prepend QHnnnn if format_string starts with QHn or [QHn - RboxPoints::appendPoints: use current dimension instead of throwing an error - user_eg3 rbox: set dimension for multiple options (e.g., user_eg3 rbox D4 5 qhull) - user_eg3 eg-convex: a 3-d convex hull using the C++ interface to Qhull [I. Voutchkov] - user_eg3 eg-delaunay: a 2-d Delaunay triangulation using the C++ interface to Qhull - user_eg3 eg-voronoi: a 2-d Voronoi diagram using the C++ interface to Qhull - user_eg3 eg-fifo: hyperplanes separating Voronoi regions via QhullUser and qh_fprintf Documentation - index.htm: Add Teillaud's http://www.computational-geometry.org/ - index.htm: Add When to use Qhull and Performance of Qhull to the Qhull Manual - html/qconvex.htm: Add orientation for options 'i', 'Fx', and 'o' qconvex .: keep the option prompt to five columns - html/qdelaun.htm: qh_findbestfacet may return an adjacent facet for a point - html/qhalf.htm,qh-optf.htm,qh-opto.htm: Added notes for options to halfspaces, e.g., 'Fp' and -10.101 [E. Huang #53] - html/qhalf.htm,qhalf.c,qhalf_r.c,qh-optf.htm: Fix documentation for 'qhalf FN'. The output includes all halfspaces. - html/qvoronoi.htm,qvoron_f.htm: Fix link for control option, 'TI file' - html/qvoronoi.htm,qvoron_f.htm, qh-optf: the hyperplanes for 'Fi' and 'Fo' include the first vertex Option 'Fo' uses the midpoint in place of the vertex at infinity. - html/qh-optf.htm: Voronoi options 'Fi' and 'Fo' orient the hyperplane so that the site is below the hyperplane - html/qh-optf.htm,qh-optt.htm: Voronoi option 'Fo' does not check the hyperplane with 'Tv' The hyperplane check for 'Fi Tv' uses the midpoint, which 'Fo' already used in place of infinity - README.txt/Windows install: install Git for Windows in C:\Git\ instead of Program Files README.txt/Unix install: add options for 32-bit builds w/o -fpic README.txt,Makefile: link libqhullcpp before libqhull_r - COPYING.txt: Add a note to COPYING.txt about C.B. Barber [M. Pryczek] - libqhull/DEPRECATED.txt: Add link to qh-code.htm#convert - Qhull::vertexList: ordered by qh.vertex_list, not by adjacency [N. Katzakis #54] - QhullPoints.cpp/extraCoordinatesCount: must be less than point_dimension (-Wconversion) - QhullPoints.cpp/indexOf: extra must be less than point_dimension (-Wconversion) - io_r.c/qh_detvnorm: add note that qh_sethyperplane_gauss returns nearzero for axis-parallel hyperplanes - user_r.h/qh_CPUclock: may be converted to approximate double (-Wconversion) - Update copyright to 2020 Build - Increase SOVERSION to 8.0 due to ABI breakage in 2019.1 [T. Roehling #58] Change SOVERSION to major.minor due to Qhull's global data structure qhT [T. Roehling #58] Add symbolic link from SONAME_EXT to libqhull_r [T. Roehling #58] Add SO and SONAME_EXT to 'make help' - qhull.pc.in: Added for pkg-config support [T. Roehling #60] - CMakeLists.txt: Add pkg-config support and change *_INSTALL_DIR to relative paths [T. Roehling #60] Change CMAKE_SOURCE_DIR to CMAKE_CURRENT_SOURCE_DIR to allow qhull as a subdirectory [Morwenn #53, A. De #59, A. Maloney, futex] - Makefile: Add pkg-support [T. Roehling #63] Renamed $DESTDIR as $PREFIX to conform with GNU Makefile standards [T. Roehling #63] $DESTDIR is for staged installs as defined by GNU Makefile standards [T. Roehling #63] Commented out M32=-m32 despite memory savings. It caused build failures, e.g., Mac [J. Hollowed] '-fpic' is required for linking to shared libraries [T. Roehling #63] Replaced -fpic with FPIC=-fpic for gcc builds Added FPIC to CXX_OPTS1 (same as CMakeLists.txt for libqhullcpp) Use 'FPIC=' to disable -fpic (may be faster for 32-bit builds on 64-bit hosts) Extract qhull_VERSION and qhull_SOVERSION from CMakeLists.txt [T. Roehling #63] Move the -lm linker flag to the end of the linker command [T. Roehling #63] Add QhullVertexSet.h to LIBQHULLCPP_HDRS Invoke q_test via bash to avoid "eg not a valid command" - Add build/*vcxproj to Unix distribution Testing and other changes - q_test: Add list of executables via 'which' Add tests of user_eg3 with each option and use case Add "Testing done" notification Add "set +v" for echoes - qhull-zip.sh: Add early check for 32-bit release build and modified files Add link checks for options Add findf for identifying files for link checks Add prompts for web.archive and md5sum in qh-get.htm
-
v8.0.04733a95b · ·
Qhull 2020.1 2020/05/29 (8.0.0) Bugs fixed - QhullLinkedList::const_iterator: Fixed operator->() for T*. It returned &i [J. Mirabel 5/1/2020 #61] API changes - RoadError.cpp: stringGlobalLog returns std::string instead of const char* [M. Gehre #46] - io_r.c/qh_order_vertexneighbors: order facet neighbors of a vertex by 2-d (orientation), 3-d (adjacency), n-d (f.visitid,id) [I. Gardner] - poly2_r.c/qh_nextfacet2d: Return next facet and vertex in qh_ORIENTclock order [N. Katzakis #54] C++ interface - Qhull.cpp: Add isDelaunay(). True if computing Delaunay or Voronoi regions Add prepareVoronoi() for Voronoi output. See user_eg3_r.cpp for examples ~Qhull: Change 'Qhull output at end' to 'Qhull messages at ~Qhull()' - QhullFacet.cpp: Add visitId() for f.visitid. Needed for Voronoi output Add nextFacet2d(): Iterate 2-d facets and vertices in counter-clockwise order [N. Katzakis #54] Add setFacetT() - QhullRidge.cpp: Add setRidgeT() and qh() - QhullUser.cpp: Add a user-modifiable interface to Qhull using a custom qh_fprintf Enhanced qh_fprintf with qhull-2019.1 updates to userprintf_r Option 'Ta' prefixes output with message code, [QHnnnn] Option 'Tf' flushes the output after each message, for tracing segfaults Errors and high-level trace messages prefixed with QHnnnn Debugging traps for qh.tracefacet, qh.traceridge, qh.tracevertex - QhullVertex.cpp: Add setVertexT() - QhullQh.cpp: moved qh_fprintf to QhullUser - RoadLogEvent::toString: do not prepend QHnnnn if format_string starts with QHn or [QHn - RboxPoints::appendPoints: use current dimension instead of throwing an error - user_eg3 rbox: set dimension for multiple options (e.g., user_eg3 rbox D4 5 qhull) - user_eg3 eg-convex: a 3-d convex hull using the C++ interface to Qhull [I. Voutchkov] - user_eg3 eg-delaunay: a 2-d Delaunay triangulation using the C++ interface to Qhull - user_eg3 eg-voronoi: a 2-d Voronoi diagram using the C++ interface to Qhull - user_eg3 eg-fifo: hyperplanes separating Voronoi regions via QhullUser and qh_fprintf Documentation - index.htm: Add Teillaud's http://www.computational-geometry.org/ - index.htm: Add When to use Qhull and Performance of Qhull to the Qhull Manual - html/qconvex.htm: Add orientation for options 'i', 'Fx', and 'o' qconvex .: keep the option prompt to five columns - html/qdelaun.htm: qh_findbestfacet may return an adjacent facet for a point - html/qhalf.htm,qh-optf.htm,qh-opto.htm: Added notes for options to halfspaces, e.g., 'Fp' and -10.101 [E. Huang #53] - html/qhalf.htm,qhalf.c,qhalf_r.c,qh-optf.htm: Fix documentation for 'qhalf FN'. The output includes all halfspaces. - html/qvoronoi.htm,qvoron_f.htm: Fix link for control option, 'TI file' - html/qvoronoi.htm,qvoron_f.htm, qh-optf: the hyperplanes for 'Fi' and 'Fo' include the first vertex Option 'Fo' uses the midpoint in place of the vertex at infinity. - html/qh-optf.htm: Voronoi options 'Fi' and 'Fo' orient the hyperplane so that the site is below the hyperplane - html/qh-optf.htm,qh-optt.htm: Voronoi option 'Fo' does not check the hyperplane with 'Tv' The hyperplane check for 'Fi Tv' uses the midpoint, which 'Fo' already used in place of infinity - README.txt/Windows install: install Git for Windows in C:\Git\ instead of Program Files README.txt/Unix install: add options for 32-bit builds w/o -fpic README.txt,Makefile: link libqhullcpp before libqhull_r - COPYING.txt: Add a note to COPYING.txt about C.B. Barber [M. Pryczek] - libqhull/DEPRECATED.txt: Add link to qh-code.htm#convert - Qhull::vertexList: ordered by qh.vertex_list, not by adjacency [N. Katzakis #54] - QhullPoints.cpp/extraCoordinatesCount: must be less than point_dimension (-Wconversion) - QhullPoints.cpp/indexOf: extra must be less than point_dimension (-Wconversion) - io_r.c/qh_detvnorm: add note that qh_sethyperplane_gauss returns nearzero for axis-parallel hyperplanes - user_r.h/qh_CPUclock: may be converted to approximate double (-Wconversion) - Update copyright to 2020 Build - Increase SOVERSION to 8.0 due to ABI breakage in 2019.1 [T. Roehling #58] Change SOVERSION to major.minor due to Qhull's global data structure qhT [T. Roehling #58] Add symbolic link from SONAME_EXT to libqhull_r [T. Roehling #58] Add SO and SONAME_EXT to 'make help' - qhull.pc.in: Added for pkg-config support [T. Roehling #60] - CMakeLists.txt: Add pkg-config support and change *_INSTALL_DIR to relative paths [T. Roehling #60] Change CMAKE_SOURCE_DIR to CMAKE_CURRENT_SOURCE_DIR to allow qhull as a subdirectory [Morwenn #53, A. De #59, A. Maloney, futex] - Makefile: Add pkg-support [T. Roehling #63] Renamed $DESTDIR as $PREFIX to conform with GNU Makefile standards [T. Roehling #63] $DESTDIR is for staged installs as defined by GNU Makefile standards [T. Roehling #63] Commented out M32=-m32 despite memory savings. It caused build failures, e.g., Mac [J. Hollowed] '-fpic' is required for linking to shared libraries [T. Roehling #63] Replaced -fpic with FPIC=-fpic for gcc builds Added FPIC to CXX_OPTS1 (same as CMakeLists.txt for libqhullcpp) Use 'FPIC=' to disable -fpic (may be faster for 32-bit builds on 64-bit hosts) Extract qhull_VERSION and qhull_SOVERSION from CMakeLists.txt [T. Roehling #63] Move the -lm linker flag to the end of the linker command [T. Roehling #63] Add QhullVertexSet.h to LIBQHULLCPP_HDRS Invoke q_test via bash to avoid "eg not a valid command" - Add build/*vcxproj to Unix distribution Testing and other changes - q_test: Add list of executables via 'which' Add tests of user_eg3 with each option and use case Add "Testing done" notification Add "set +v" for echoes - qhull-zip.sh: Add early check for 32-bit release build and modified files Add link checks for options Add findf for identifying files for link checks Add prompts for web.archive and md5sum in qh-get.htm
-
2019.1b94cff07 · ·
Qhull 2019.1 2019/06/21 (7.3.2) released 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]. - CMake: export QhullTargets for config.cmake.in and find_package [tamasmeszaros] - 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
-
v7.3.2b94cff07 · ·
Qhull 2019.1 2019/06/21 (7.3.2) released 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]. - CMake: export QhullTargets for config.cmake.in and find_package [tamasmeszaros] - 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
-
v7.3.130ef8b0c · ·
Qhull 2019.0.1 2019/05/24 (7.3.1) Qhull options - Disallow unknown options and other option errors, allow option warnings with 'Qw' - New option 'Qallow-short': allow input with fewer or more 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 - Options '--help', '-?', and '--' display a short help message 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 - Error if 'd', 'v', or 'Hn,n,n' are used together - 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/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 'QH110nn FIX:' - 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