Skip to content
Snippets Groups Projects
  1. Dec 05, 2019
  2. Oct 25, 2019
  3. Oct 21, 2019
  4. Sep 20, 2019
  5. Jul 01, 2019
  6. Jun 30, 2019
  7. Jun 29, 2019
    • 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
    • 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
  8. Jun 19, 2019
  9. Jun 17, 2019
  10. Jun 14, 2019
  11. Jun 06, 2019
  12. May 25, 2019
    • Brad Barber's avatar
      Fix text for 'Qa' · 30ef8b0c
      Brad Barber authored
      Fix download links for qh-get.htm
      Mark as QH110nn FIX:
    • 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
    • Brad Barber's avatar
      Add q_benchmark and qtest.sh for benchmarks of Qhull performance · 6a86df9e
      Brad Barber authored
      and for testing intermittent failures.
      
      Add q_benchmark-ok.txt for the results of q_benchmark on Qhull 2015.2
      
      Add make-qhull_qh.sh to convert reentrant Qhull code into
      non-reentrant Qhull code.  A directory diff can than check for
      discrepancies.
      
      Add exports.def files for building Qhull with qh_NOmerge code.
      6a86df9e
  13. Dec 29, 2018
    • Brad Barber's avatar
      Qhull 2018.0.1 2018/12/28 (7.3.0) · 6ebf10e2
      Brad Barber authored
      merge branch 'next' into master
    • Brad Barber's avatar
    • Brad Barber's avatar
      Qhull 2018.0.1 2018/12/28 (7.3.0) · a0e0374a
      Brad Barber authored
      Qhull options
       - Add option 'Tf' to flush each qh_fprintf for debugging segfaults
       - Add Q14-no-merge-pinched: do not merge pinched vertices for duplicate ridge
         Default if post-merge only ('Cn'), 'Qgood-only', or 2-d convex hulls
       - Add Q15-allow-wide-maxout: do not error on qh_check_maxout failures
       - Add Q16-simplex-merge: test opposite vertex instead of centrum for merges
       - option 'f' (print facets): updated flags for facets
         'seen' and 'seen2' flags not listed (listed if tracing)
         Renamed 'new' to 'newfacet'
         'isarea' if area is listed for the facet
         'cycledone' if qh_mergefacet completed
         Renamed 'MERGE' to 'MERGEridge' in the facet neighors (for merging)
         Renamed 'DUP' to 'DUPLICATEridge' in the facet neighors (for merging)
         Comment '- horizon ridge to visible facet' added for tentative new facets
       - option 'f' (print facets): updated flags for ridges
         'mergevertex' and 'mergevertex2' if a ridge vertex will be merged
         'simplicialtop' and 'simplicialbot' if the top/bottom facet is simplicial
       - option 'f' (print facets): updated flags for vertices
         Renamed 'ridgedeleted' to 'delridge'
         'newfacet' if the vertex belongs to a new facet on qh.newfacet_list
         'seen' and 'seen2' listed if tracing
       - Option 'T3' prepend message number for trace levels 0-3
         e.g., "[QH1040]qh_findhorizon: find horizon..."
       - Option 'TCone_stop' stops before vertex merge due to duplicate ridges (unlikely)
       - Option 'Ts' (qh_initbuild): print command prompt at start of run for segfaults
       - Rename option 'U-coplanar-distance' to 'U-max-coplanar' (qh.MAXcoplanar)
      
      Qhull documentation
       - Explanation of clobbered warning for Qhull::runQhull and qh_new_qhull
       - html/index.htm: Add "Nearly coincident points" to "When to use Qhull"
       - html/index.htm: Add Tomilov's qhullhull.hpp for general position input.
       - html/qh-eg.htm: Add 'Q0' link to eg.14.sphere.corner
       - html/qh-faq.htm,qh-code.htm: merge slivers in a Delaunay triangulation [M. Treacy]
       - html/qh-optq.htm: Update documentation for 'Qx' and its default behavior
       - html/qh-impre.htm: Rewrote notes on 'Nearly coincident points within 1e-13'
       - geom_r.c/qh_distplane: nearly coplanar points may return the same distance for different points
       - Update copyright to 2018
      
      Qhull builds
       - Move 'extern "C" {}' logic from C++ to C headers [C. Atkins, github]
       - build/*-64.vcxproj Updated for tool set 8.1
       - CMakeLists.txt: Add note for "dynamic linking" of qhull executables [M. Atzeri]
      
      Bugs fixed
       - libqulll_r.c/qh_findbest: search from newfacet_list instead of f.next if !bestfacet
       - merge_r.c/qh_find_newvertex: use v.seen to avoid maxvisit > qh.vertex_visit
       - merge_r.c/qh_merge_simplex: repeat with next ridge after qh_delridge_merge
       - merge_r.c/qh_vertexridges: 'qh.visit_id += 2' to avoid visit_id collision
       - poly_r.c/qh_appendfacet: update qh.visible_list if qh.newfacet_list/visible_list are empty
       - poly2_r.c/qh_check_maxout: check qh.min_vertex if qh.VERIFYoutput/CHECKfrequently
       - poly2_r.c/qh_checkpolygon: do not report qh.visible_list error if visible_list and newfacet_list are defined but empty
       - stat_r.c/qh_printallstatistics,qh_printstatistics: 'const char *string' instead of 'char *string' for !qh_KEEPstatistics
      
      Qhull error reporting
       - libqulll_r.c/qh_findhorizon: error if no neighbors for a visible facet
       - libqulll_r.c/qh_findbestnew: error if facet sentinel (!facet->next)
       - libqhull_r.c/qh_nextfurthest: error if infinite loop
       - libqhull_r.c/qh_partitioncoplanar: error if partition into a visible facet
       - libqhull_r.c/qh_partitionpoint: error if partition into a visible facet
       - libqhull_r.c/qh_partitionvisible: error if deleted vertex with an empty qh.newfacet_list
       - merge_r.c/qh_checkdelfacet: check that mergeset does not reference facet
       - merge_r.c/qh_checkdelridge: check that qh_delridge_merge is not needed for deleted ridges
                   Call from qh_mergecycle, qh_makenewfacets, qh_attachnewfacets
       - merge_r.c/qh_maydropneighbor: error if simplicial facet or neighbor
       - merge_r.c/qh_merge_facet: error if wide merge (disabled with 'Q15')
       - merge_r.c/qh_merge_nonconvex: error if unexected mergetype
       - poly_r.c/qh_matchneighbor: convert error QH6106 (two facets with same vertices) to a warning (QH7084) and automatic fix
       - poly2_r.c/qh_check_maxout: error if wide qh.max_outside/min_vertex (disabled with 'Q15')
       - poly2_r.c/qh_check_maxout: warn if wide maxout for vertices (for diagnosing errors)
       - poly2_r.c/qh_check_maxout: warn if point is outside f.outside (for diagnosing errors)
       - poly2_r.c/qh_check_maxout: warn if 'f.maxoutside > qh.max_outside'
       - poly2_r.c/qh_check_maxout: changed comparison from 'dist == maxoutside' to 'dist >= maxoutside' (allow multiple warnings)
       - poly2_r.c/qh_checkfacet: error if 'redundant' or 'degenerate', but neither 'visible' nor qh.degen_mergeset
       - poly2_r.c/qh_checkfacet: error if 'dupridge' or 'newmerge', but not 'newfacet'
       - poly2_r.c/qh_checkfacet: error if neighbor of facet is 'visible' (i.e., deleted)
       - poly2_r.c/qh_checkfacet: report 'OK due to merging' as trace4 (QH4073) instead of error QH6134
       - poly2_r.c/qh_checkpolygon: error if qh.visible_list is after qh.newfacet_list
       - poly2_r.c/qh_checkpolygon: error if f.newfacet before qh.visible_list or qh.newfacet_list
       - poly2_r.c/qh_checkpolygon: error qh.newfacet_list without f.newfacet
       - poly2_r.c/qh_checkpolygon: error if f.visible not on qh.visible_list
       - poly2_r.c/qh_checkpolygon: error if qh.visible_list without f.visible
       - poly2_r.c/qh_checkpolygon: error if qh.newfacet_list is not on qh.facet_list
       - poly2_r.c/qh_checkpolygon: error if v.newfacet not on qh.newvertex_list
       - poly2_r.c/qh_checkpolygon: error if qh.newvertex_list is not on qh.vertex_list
       - poly2_r.c/qh_checkpolygon: error if a facet occurs twice in v.neighbors
       - poly2_r.c/qh_checkpolygon: error if vertex not in f.vertices for facets in v.neighbors
       - poly2_r.c/qh_checkpolygon: error if facet not in v.neighbors for vertices in f.vertices
       - poly2_r.c/qh_delvertex: error if vertex previously deleted but not partitioned as a coplanar point
       - user_r.c/qh_errexit: clear printed flags on statistics (qh_allstatistics)
       - user_r.c/qh_errprint: print vertex and ridge before facets
       - user_r.c/qh_errprint: print vertex and ridge before facets
       - user_r.c/qh_printfacetlist: add 'qh_printfacetlist:' for rapid navigation
      
      Source code additions
       - mergeT: expanded for vertices and ridges
       - mergeType: add MRGconcavecoplanar, MRGtwisted, MRGsubridge, MRGvertices, and MRGcoplanarhorizon
       - qtT.ALLOWwidemaxout: true if 'Q15', allow qh.WIDEmaxoutside increases in qh_check_maxout
       - qtT.FLUSHprint: true if 'Tf', flush output on qh_fprintf
       - qtT.MERGEpinched: false if 'Q14', merge pinched vertex due to duplicate ridge
       - qtT.SIMPLEXmerge: true if 'Q16', test_appendmerge tests opposite vertex instead of centrum
       - qtT.first_newfacet: id of first new facet in qh_buildcone, other new facets were merged
       - qtT.isRenameVertex: true during qh_merge_pinchedvertices
       - qtT.NEWtentative: true while new facets are tentative due to qh.MERGEpinched or ONLYgood
       - qtT.repart_facetid: previous facetid to prevent recursive qh_partitioncoplanar
       - qtT.retry_addpoint: number of retries of qh_addpoint due to qh.MERGEpinched
       - qtT.vertex_mergeset: set of vertex merges for qh_next_vertexmerge
       - ridgeT.mergevertex and mergevertex2 if a ridge vertex will be merged
       - ridgeT.simplicialtop and simplicialbot if the top/bottom facet is simplicial
       - vertexT.partitioned: true if deleted vertex partitioned by qh_partitionvisible
       - geom2_r.c/qh_furthestnewvertex: return furthest unvisited, new vertex to a facet
       - geom2_r.c/qh_furthestvertex: return furthest unvisited vertex to a facet
       - geom2_r.c/qh_vertex_bestdist: return nearest distance between vertices
       - geom2_r.c/qh_vertex_bestdist2: return nearest vertex pair between vertices
       - geom2_r.c/qh_vertex_isbelow: test vertexA distance to vertexB's simplicial facets and vice versa
       - libqhull_r.c/qh_buildcone: split out qh_makenewfacets,etc. from qh_addpoint
       - merge_r.c/qh_all_vertexmerges: perform vertex merges in qh.vertex_mergeset
       - merge_r.c/qh_appendvertexmerge: append vertex merge to qh.vertex_mergeset
       - merge_r.c/qh_delridge_merge: split out ridge maintenance from qh_renameridgevertex and qh_merge_simplex
       - merge_r.c/qh_hasmerge: True if mergeset has mergetype for facetA and facetB
       - merge_r.c/qh_initmergesets,qh_freemergesets: init/free of qh.*_mergeset with error reporting
       - merge_r.c/qh_maybe_duplicateridge: add MRGvertices if neighboring facet has another ridge with the same vertices
       - merge_r.c/qh_maybe_duplicateridges: add MRGvertices if ridges with the same vertices
       - merge_r.c/qh_merge_dupridges: split out conversion of dupridges to MRGridge merges from qh_makeridges
       - merge_r.c/qh_merge_pinchedvertices- merge pinched vertices in qh.vertex_mergeset to avoid qh_forcedmerges of duplicated ridges
       - merge_r.c/qh_merge_twisted: merge twisted facets that are above and below their neighbors (4D+ and non-simplicial)
       - merge_r.c/qh_neighbor_vertices,qh_neighbor_vertices_facet: return neighboring vertices for a vertex (not in subridge)
       - merge_r.c/qh_next_facetmerge: split out next merge from qh_all_merges and replace qsort
       - merge_r.c/qh_next_vertexmerge: select next vertex merge by distance, allow one MRGsubridge merge
       - merge_r.c/qh_opposite_horizonfacet: return horizon facet for a merge facet and its opposite vertex
       - merge_r.c/qh_reducevertices: qh_merge_degenredundant if qh_remove_extravertices or qh_rename_sharedvertex
       - merge_r.c/qh_remove_mergetype: remove mergetype merges from mergeset
       - merge_r.c/qh_rename_adjacentvertex: rename oldvertex as newvertex, must be adjacent (i.e., in the same subridge)
       - merge_r.c/qh_test_cemtrum_merge: split out test centrum convexity from qh_test_appendmerge
       - merge_r.c/qh_test_simplex_merge: test simplex convexity and append non-convex facets to qh.facet_mergeset
       - merge_r.c/qh_test_nonsimplicial_merge: test nonsimplicial convexity and append non-convex facets to qh.facet_mergeset
       - merge_r.h/FOREACHmergeA_,FOREACHmerge_i_: add macros for mergeset iteration
       - poly_r.c/qh_getreplacement: split out new facet for visible facet from qh_partitionvisible and qh_merge_degenredunant
       - poly2_r.c/qh_addfacetvertex: split out add newvertex to f.vertices if not already there from qh_merge_simplex
       - poly2_r.c/qh_matchdupridge_coplanarhorizon: match duplicate ridges with the same coplanar horizon, instead of qh_matchdupridge
       - poly2_r.c/qh_opposite_vertex: return the opposite vertex in facetA to neighbor
       - poly2_r.c/qh_replacefacetvertex: replace oldvertex with newvertex in f.vertices
       - user_r.h/qh_RATIOconcavehorizon: ratio of horizon vertex distance to qh.max_outside for concave, twisted new facets in qh_test_nonsimplicial_merge
       - user_r.h/qh_RATIOconvexmerge: ratio of vertex distance to qh.min_vertex for clearly convex new facets in qh_test_nonsimplicial_merge
       - user_r.h/qh_RATIOcoplanarapex: ratio of best distance for coplanar apex vs. vertex merge in qh_getpinchedmerges
       - user_r.h/qh_RATIOcoplanaroutside: ratio to repartition a coplanar point as an outside point in qh_partitioncoplanar and qh_check_maxout
       - user_r.h/qh_RATIOpinchedsubridge: ratio to qh.ONEmerge to accept vertices in qh_findbest_pinchedvertex
       - user_r.h/qh_RATIOtrypinched: ratio to qh.ONEmerge to merge twisted facets in qh_merge_twisted
       - user_r.h/qh_RATIOtwisted: maximum ratio to qh.ONEmerge to merge twisted facets in qh_merge_twisted
       - user_r.h/qh_WIDEmaxoutside: precision ratio for maximum increase for qh.max_outside in qh_check_maxout
       - user_r.h/qh_WIDEmaxoutside2: precision ratio for maximum qh.max_outside in qh_check_maxout
       - user_r.h/qh_WIDEpinched: merge ratio for distance between pinched vertices compared to current facet width for qh_getpinchedmerges and qh_next_vertexmerge
      
      Source code changes
       - Change " = " to "= " (avoid confusion with " == ")
       - Improved error messages, tracing, and code comments throughout
       - Moved qh_check_dupridge from poly2_r.c to merge_r.c.  It is used for merging
       - Moved qh_printlists from poly2_r.c to io_r.c.  Useful for debugging
       - Removed qh_compareangle and qh_comparemerge.  Replaced by qh_next_facetmerge
       - Renamed 'qh_precision' to 'qh_joggle_restart'.  It restarts qhull to avoid a precision error.
       - Renamed 'Qhull internal error' to 'qhull internal error' for consistency
       - Renamed mergeT.type to mergetype.  Same as parameters and local variables
       - Renamed vertexT.newlist to newfacet. True if on a new facet
       - Renamed qh_matchduplicates to qh_matchdupridge (poly2_r.c).  A 'duplicates' is ridges with duplicate vertices
       - Use coordT for distances instead of realT.  Needs further review.
       - qh_NOmerge: include comments in #ifndef
       - global_r.c/qh_freebuffers: use the same order as qh_initbuffers
       - global_r.c/qh_freebuild: free the global sets, qh.degen_mergeset,etc.
       - io_r.c/qh_printfacetheader: print 'MERGEridge' instead of 'MERGE' to match name of flag
       - io_r.c/qh_printfacetheader: print 'DUPLICATEridge' instead of 'DUP' to match name of flag
       - libqhull_r.c/qh_partitioncoplanar: change qh.findbestnew to a parameter (search all new facets)
       - libqhull_r.c/qh_partitioncoplanar: repartition a coplanar point if far outside
                      typically due to a twisted facet in D4+ with almost coincident vertices
       - libqhull_r.c/qh_partitionpoint: if outside set is empty, set f.newfacet and adjust qh.facet_next
       - libqhull_r.c/qh_partitionvisible: prevent duplicate partitions of deleted vertices
       - libqhull_r.c/qh_partitionvisible: test against !f.next instead of qh.facet_tail.  Both indicate sentinel
       - mrege_r.h/mergeType: reordered mergetypes is preference order
       - merge_r.c: identify MRGconcavecoplanar facets that are above and coplanar with their neighbors
       - merge_r.c/mergetypes: string names for mergeType
       - merge_r.c/qh_all_merges: clear wasmerge and othermerge on qh_reducevertices.  Avoids extra calls
       - merge_r.c/qh_appendmergeset: add parameters for m.dist and m.angle
       - merge_r.c/qh_appendmergeset: initialize all fields of mergeT
       - merge_r.c/qh_copynonconvex: clear old r.nonconvex for consistency.  Ridge will be deleted soon
       - merge_r.c/qh_degen_redundant_neighbors: check neighbors of delfacet instead of facet.  Faster and it matches definition
       - merge_r.c/qh_mark_dupridges: add 'allmerges' parameter for dupridges vs. pinched vertices
       - merge_r.c/qh_mark_dupridges: test for duplicate vertices to avoid duplicate MRGridge
       - merge_r.c/qh_merge_cycle_all: test for duplicate ridges at end of merge_cycle_all (qh_maybe_duplicateridges)
       - merge_r.c/qh_merge_dupridges: clear mergeridge/mergeridge2 flags (not needed on first call)
       - merge_r.c/qh_merge_facet: test for qh_degen_redundant_facet and qh_maybe_duplicateridges
       - merge_r.c/qh_merge_facet: add mergeType parameter for logging
       - merge_r.c/qh_merge_facet: rename 'apex' to 'opposite' (not always apex)
       - merge_r.c/qh_merge_simplex: identify 'isnew' instead of 'issame' (more accurate)
       - merge_r.c/qh_remove_extravertices: skip for simplicial facets
       - merge_r.c/qh_renamevertex: test qh_maybe_duplicateridge if qh_renameridgevertex
       - merge_r.c/qh_renamevertex: test qh_degen_redundant_facet for oldvertex neighbors
       - merge_r.c/qh_renamevertex: test qh_degen_redundant_neighbors for oldvertex nonsimplicial neighbors
       - merge_r.c/qh_renamevertex: test qh_maybe_duplicateridge if qh_renameridgevertex
       - merge_r.c/qh_renamevertex: test qh_degen_redundant_facet oldfacet
       - merge_r.c/qh_tracemerge: add mergeType parameter for logging
       - merge_r.c/qh_test_appendmerge: calls qh_test_simplex_merge, qh_test_centrum_merge, or qh_test_nonsimplicial_merge as needed
       - merge_r.c/qh_vertexridges: add 'allneighbors' parameter to test all neighbors of a vertex
       - merge_r.c/qh_vertexridges_facet: optimize qh_setin by common cases
       - poly_r.c/qh_checkflipped: move call from qh_matchnewfacets to qh_setfacetplane.  Allow call of qh_setfacetplane from qh_initialhull to reverse orientation
       - poly_r.c/qh_matchneighbor: call qh_setfacetplane/qh_checkflipped on-demand to support qh.NEWtentative
       - poly_r.c/qh_matchnewfacets: returns maxdupdist for duplicate ridges
       - poly_r.c/qh_matchnewfacets: move qh_joggle_restart from qh_matchduplicates ("ridge with multiple neighbors")
       - poly_r.c/qh_matchnewfacets: try to match ridges with coplanar horizon (qh_matchdupridge_coplanarhorizon)
       - poly_r.c/qh_updatevertices: use qh_setunique to pdate vertex neighbors (due to pinched vertex merge)
       - poly2_r.c/qh_checkfacet: optimize qh_setequal of ridges with the same vertices
       - poly2_r.c/qh_checkpolygon: do not include visible facets in totvertices
       - poly2_r.c/qh_initialhull: use f.flipped instead of qh_distplane/qh_checkflipped (qh_checkflipped called from qh_setfacetplane)
       - poly2_r.c/qh_matchdupridge: was qh_matchduplicates in qhull 2015.2
       - poly2_r.c/qh_matchdupridge: detect duplicate facets/ridges and force vertex merge
       - poly2_r.c/qh_matchdupridge: separate code for qh_DUPLICATEridge/f.tricoplanar for improved logging
       - poly2_r.c/qh_matchdupridge: if !makematch, collect best match via flipped and qh_getdistance between facets
       - poly2_r.c/qh_resetlists: clear f.dupridge
       - poly2_r.c/qh_triangulate: clear f.degenerate at end (degenerate tricoplanar facets)
       - poly2_r.c/qh_triangulate_link: skip duplicate MRGmirror merges
       - poly2_r.c/qh_triangulate_mirror: skip duplicate MRGmirror merges and previously deleted MRGmirror facets
      a0e0374a
  14. Dec 28, 2018
  15. Sep 26, 2018
    • Antony Lee's avatar
      Fix some apparently missing braces. · 33ace207
      Antony Lee authored
      Caught by gcc's -Wmisleading-indentation.
      
      Note: Technically this changes the execution flow at that point; I
      haven't checked whether this is desired but it looks like the previous
      version was a incorrect...
      33ace207
  16. Jan 21, 2017
  17. Jan 18, 2017
  18. Jun 17, 2016
  19. Jun 15, 2016
  20. Feb 07, 2016
  21. Jan 23, 2016
  22. Jan 20, 2016
    • Chuck Atkins's avatar
      Make C headers safe for C++ inclusion. · 2681baa6
      Chuck Atkins authored
      This commit moves the extern "C" { ... } logic into headers themselves.
      This way, it's the headers responsibility to define it's linkage
      appropriately and the consuming C and C++ code can both use "#include"
      without ifdef guards.
      2681baa6
  23. Jan 19, 2016
    • Brad Barber's avatar
      Qhull 2015.2 2016/01/18 (7.2.0) · 5a79a000
      Brad Barber authored
       - Fixed memory leak in ~QhullQh [M. Sandim]
         QhullQh.cpp: call checkAndFreeQhullMemory() in the destructor.  Otherwise memT is not freed.
         Remove checkAndFreeQhullMemory() from Qhull.h.  It is not needed.
         Remove calls to checkAndFreeQhullMemory in qhulltest.  It is called by ~QhullQh()
         libqhull_r.h: Document qh_ASvornoi and facetT.center
         qh_freeqhull: if qh_NOmem, use qh_ALL
         qh_memalloc: short memory is freed by qh_memfreeshort unless qh_NOmem
         qh_memstatistics (mem.c): call qh_memcheck() as done in mem_r.c
         qh_new_qhull calls qh_memcheck
         qh_newvertex: free vertex on error
         qh_projectinput: Free memory allocations on error
         qh_rboxpoints: free simplex on error
         qh_sethalfspace_all: Fixed memory leak on error QH8032 feasible not inside halfspace
         qh_triangulate_facet: For TRInormals ('Q11') replace qh_copypoints with qh_memalloc
         qh_triangulate_facet: Document qh.TRInormals
         qh_voronoi_center: Free center on error
         qhulltest: Fixed memory leak of s_testcases by calling RoadTest::deleteTests()
         qhulltest: The 'add_*_test' functions append the test object to RoadTest::s_testcases
         ~RoadTest: declare virtual for Q_OBJECT, removeAll not needed
         user_eg2: Check memory at end of each run
         user_r.h: Add QHULL_CRTDBG for invoking Microsoft's memory leak detector
         use _MSC_VER instead of QHULL_OS_WIN for QHULL_CRTDBG
         Call qh_freeqhull with qh_ALL/!qh_ALL instead of 'True/False'
         Include user_r.h with RoadError,h for QHULL_CRTDBG
         Invoke _CrtSetDbgFlag... at beginning of program
         Moved user_r.h/libqhull_r.h/qhull_ra.h as first include (for QHULL_CRTDBG)
         Moved QHULL_OS_WIN from qhull_ra.h to user_r.h
         Removed __CYGWIN__ from QHULL_OS_WIN (same as Qt's qglobal.h)
      
       - check_dupridge: A bounding box is not sufficient to avoid dupridge errors
       - qh_findbestneighor: Error if qh.CENTERtype is qh_ASvoronoi (i.e., no merging now)
       - qh_printstatlevel: Remove unused parameter, 'start'
       - QhullLinkedList::last() and back(): Return T instead of T& (T is computed)
      
       - qh-code.htm: "How to convert code to reentrant Qhull"
         Update "Nearly coincident points on an edge"
         Add 2012 size of data structures to "Qhull on 64-bit computers"
       - html/index.htm: Add CGAL to "When to use"
       - qh-optq.htm: Add documentation for option 'Q12'
       - Move suggestions from Changes.txt to qh-code.htm#enhance
       - user_r.h: Fixed qh-us_r.html links
       - Fixed links in html pages
      
       - QhullIterator and QhullLinkedList: Include <iterator> [B. Boeckel]
       - Moved include file for each C++ source file to the top of the includes
       - Prepend cpp includes with "libqhullcpp/"
       - RoadLogEvent includes RoadLogEvent.h
       - QhullIterator.h: Only QHULL_DECLARE_SEQUENTIAL_ITERATOR is used.
      
       - Compared src/libqhull/* to src/libqhull_r/* and resolved differences
       - qh_printpoint in io.c skips qh_IDnone like io_r.c
       - qhull_p-exports.def: Added three missing exports
       - set_r.h: Removed countT. Too many issues
      
       - libqhull_r/Makefile: Add help prompts to 'make qtest'
       - libqhull.pro: Add '../libqhull/' to sources and headers
       - libqhull/Makefile: Fixed -I,./,,/src
      
       - qhull-zip.sh: Add CMakeModules to tarball [C. Rosenvik]
       - CMakeLists.txt: Add targets qhullp and user_egp for qh_QHpointer and libqhull_p
       - Reorganized 'make help'
       - Makefile cleanall: Delete testqset and qhulltest from bin/
       - Fix filetype of Unix-only files
       - Fix Unix line endings for Makefile and check in qhull-zip.sh
       - Fix Windows line-endings and check in qhull-zip.sh
       - qhull-zip.sh: Check for Unix text files
  24. Jan 09, 2016
  25. Jan 07, 2016
Loading