diff -Nru qhull-2015.2/Announce.txt qhull-2020.2/Announce.txt --- qhull-2015.2/Announce.txt 2016-01-18 23:59:10.000000000 +0000 +++ qhull-2020.2/Announce.txt 2020-09-04 01:50:37.000000000 +0000 @@ -1,7 +1,8 @@ - Qhull 2015.2 2016/01/18 + Qhull 2020.2 2020/08/31 (8.0.2) http://www.qhull.org + http://github.com/qhull/qhull/wiki git@github.com:qhull/qhull.git http://www.geomview.org @@ -16,16 +17,17 @@ execution statistics. The program can be called from within your application. You can view the results in 2-d, 3-d and 4-d with Geomview. -To download Qhull: +Download Qhull: + http://www.qhull.org/download git@github.com:qhull/qhull.git -Download qhull-96.ps for: +Reference: Barber, C. B., D.P. Dobkin, and H.T. Huhdanpaa, "The Quickhull Algorithm for Convex Hulls," ACM Trans. on Mathematical Software, 22(4):469-483, Dec. 1996. - http://www.acm.org/pubs/citations/journals/toms/1996-22-4/p469-barber/ + http://portal.acm.org/citation.cfm?doid=235815.235821 http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.117.405 Abstract: diff -Nru qhull-2015.2/build/CMakeModules/CheckLFS.cmake qhull-2020.2/build/CMakeModules/CheckLFS.cmake --- qhull-2015.2/build/CMakeModules/CheckLFS.cmake 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/CMakeModules/CheckLFS.cmake 2015-09-23 03:04:36.000000000 +0000 @@ -0,0 +1,109 @@ +## Checks for large file support ## +include(CheckIncludeFile) +include(CheckSymbolExists) +include(CheckTypeSize) + +macro(check_lfs _isenable) + set(LFS_OFF_T "") + set(LFS_FOPEN "") + set(LFS_FSEEK "") + set(LFS_FTELL "") + set(LFS_PRID "") + + if(${_isenable}) + set(SAFE_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}") + set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} + -D_LARGEFILE_SOURCE -D_LARGE_FILES -D_FILE_OFFSET_BITS=64 + -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS) + + check_include_file("sys/types.h" HAVE_SYS_TYPES_H) + check_include_file("inttypes.h" HAVE_INTTYPES_H) + check_include_file("stddef.h" HAVE_STDDEF_H) + check_include_file("stdint.h" HAVE_STDINT_H) + + # LFS type1: 8 <= sizeof(off_t), fseeko, ftello + check_type_size("off_t" SIZEOF_OFF_T) + if(SIZEOF_OFF_T GREATER 7) + check_symbol_exists("fseeko" "stdio.h" HAVE_FSEEKO) + check_symbol_exists("ftello" "stdio.h" HAVE_FTELLO) + if(HAVE_FSEEKO AND HAVE_FTELLO) + set(LFS_OFF_T "off_t") + set(LFS_FOPEN "fopen") + set(LFS_FSEEK "fseeko") + set(LFS_FTELL "ftello") + check_symbol_exists("PRIdMAX" "inttypes.h" HAVE_PRIDMAX) + if(HAVE_PRIDMAX) + set(LFS_PRID "PRIdMAX") + else(HAVE_PRIDMAX) + check_type_size("long" SIZEOF_LONG) + check_type_size("int" SIZEOF_INT) + if(SIZEOF_OFF_T GREATER SIZEOF_LONG) + set(LFS_PRID "\"lld\"") + elseif(SIZEOF_LONG GREATER SIZEOF_INT) + set(LFS_PRID "\"ld\"") + else(SIZEOF_OFF_T GREATER SIZEOF_LONG) + set(LFS_PRID "\"d\"") + endif(SIZEOF_OFF_T GREATER SIZEOF_LONG) + endif(HAVE_PRIDMAX) + endif(HAVE_FSEEKO AND HAVE_FTELLO) + endif(SIZEOF_OFF_T GREATER 7) + + # LFS type2: 8 <= sizeof(off64_t), fopen64, fseeko64, ftello64 + if(NOT LFS_OFF_T) + check_type_size("off64_t" SIZEOF_OFF64_T) + if(SIZEOF_OFF64_T GREATER 7) + check_symbol_exists("fopen64" "stdio.h" HAVE_FOPEN64) + check_symbol_exists("fseeko64" "stdio.h" HAVE_FSEEKO64) + check_symbol_exists("ftello64" "stdio.h" HAVE_FTELLO64) + if(HAVE_FOPEN64 AND HAVE_FSEEKO64 AND HAVE_FTELLO64) + set(LFS_OFF_T "off64_t") + set(LFS_FOPEN "fopen64") + set(LFS_FSEEK "fseeko64") + set(LFS_FTELL "ftello64") + check_symbol_exists("PRIdMAX" "inttypes.h" HAVE_PRIDMAX) + if(HAVE_PRIDMAX) + set(LFS_PRID "PRIdMAX") + else(HAVE_PRIDMAX) + check_type_size("long" SIZEOF_LONG) + check_type_size("int" SIZEOF_INT) + if(SIZEOF_OFF64_T GREATER SIZEOF_LONG) + set(LFS_PRID "\"lld\"") + elseif(SIZEOF_LONG GREATER SIZEOF_INT) + set(LFS_PRID "\"ld\"") + else(SIZEOF_OFF64_T GREATER SIZEOF_LONG) + set(LFS_PRID "\"d\"") + endif(SIZEOF_OFF64_T GREATER SIZEOF_LONG) + endif(HAVE_PRIDMAX) + endif(HAVE_FOPEN64 AND HAVE_FSEEKO64 AND HAVE_FTELLO64) + endif(SIZEOF_OFF64_T GREATER 7) + endif(NOT LFS_OFF_T) + + # LFS type3: 8 <= sizeof(__int64), _fseeki64, _ftelli64 + if(NOT LFS_OFF_T) + check_type_size("__int64" SIZEOF___INT64) + if(SIZEOF___INT64 GREATER 7) + check_symbol_exists("_fseeki64" "stdio.h" HAVE__FSEEKI64) + check_symbol_exists("_ftelli64" "stdio.h" HAVE__FTELLI64) + if(HAVE__FSEEKI64 AND HAVE__FTELLI64) + set(LFS_OFF_T "__int64") + set(LFS_FOPEN "fopen") + set(LFS_FSEEK "_fseeki64") + set(LFS_FTELL "_ftelli64") + set(LFS_PRID "\"I64d\"") + endif(HAVE__FSEEKI64 AND HAVE__FTELLI64) + endif(SIZEOF___INT64 GREATER 7) + endif(NOT LFS_OFF_T) + + set(CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}") + endif(${_isenable}) + + if(NOT LFS_OFF_T) + ## not found + set(LFS_OFF_T "long") + set(LFS_FOPEN "fopen") + set(LFS_FSEEK "fseek") + set(LFS_FTELL "ftell") + set(LFS_PRID "\"ld\"") + endif(NOT LFS_OFF_T) + +endmacro(check_lfs) diff -Nru qhull-2015.2/build/config.cmake.in qhull-2020.2/build/config.cmake.in --- qhull-2015.2/build/config.cmake.in 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/config.cmake.in 2019-06-29 00:19:28.000000000 +0000 @@ -0,0 +1 @@ +include("${CMAKE_CURRENT_LIST_DIR}/QhullTargets.cmake") diff -Nru qhull-2015.2/build/libqhull-32.vcxproj qhull-2020.2/build/libqhull-32.vcxproj --- qhull-2015.2/build/libqhull-32.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/libqhull-32.vcxproj 2016-01-19 04:23:07.000000000 +0000 @@ -0,0 +1,300 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + MinSizeRel + Win32 + + + RelWithDebInfo + Win32 + + + + {AE297F0D-5402-41C0-83B1-0194B583B67E} + Win32Proj + Win32 + libqhull + + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + libqhull.dir\Debug\ + qhull_d + .dll + false + true + ..\bin\ + libqhull.dir\Release\ + qhull + .dll + false + true + ..\bin\ + libqhull.dir\MinSizeRel\ + qhull + .dll + false + true + ..\bin\ + libqhull.dir\RelWithDebInfo\ + qhull + .dll + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;libqhull_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;libqhull_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull_d.lib + ../src/libqhull/qhull-exports.def + ../bin/qhull_d.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;libqhull_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;libqhull_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull.lib + ../src/libqhull/qhull-exports.def + ../bin/qhull.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;libqhull_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;libqhull_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull.lib + ../src/libqhull/qhull-exports.def + ../bin/qhull.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;libqhull_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;libqhull_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull.lib + ../src/libqhull/qhull-exports.def + ../bin/qhull.pdb + Console + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru qhull-2015.2/build/libqhull-64.vcxproj qhull-2020.2/build/libqhull-64.vcxproj --- qhull-2015.2/build/libqhull-64.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/libqhull-64.vcxproj 2016-01-19 04:23:07.000000000 +0000 @@ -0,0 +1,300 @@ + + + + + Debug + x64 + + + Release + x64 + + + MinSizeRel + x64 + + + RelWithDebInfo + x64 + + + + {AE297F0D-5402-41C0-83B1-0194B583B67E} + x64Proj + x64 + libqhull + + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + libqhull.dir\Debug\ + qhull_d + .dll + false + true + ..\bin\ + libqhull.dir\Release\ + qhull + .dll + false + true + ..\bin\ + libqhull.dir\MinSizeRel\ + qhull + .dll + false + true + ..\bin\ + libqhull.dir\RelWithDebInfo\ + qhull + .dll + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;libqhull_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;libqhull_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull_d.lib + ../src/libqhull/qhull-exports.def + ../bin/qhull_d.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;libqhull_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;libqhull_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull.lib + ../src/libqhull/qhull-exports.def + ../bin/qhull.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;libqhull_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;libqhull_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull.lib + ../src/libqhull/qhull-exports.def + ../bin/qhull.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;libqhull_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;libqhull_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull.lib + ../src/libqhull/qhull-exports.def + ../bin/qhull.pdb + Console + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru qhull-2015.2/build/qconvex-32.vcxproj qhull-2020.2/build/qconvex-32.vcxproj --- qhull-2015.2/build/qconvex-32.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/qconvex-32.vcxproj 2016-01-19 04:23:07.000000000 +0000 @@ -0,0 +1,272 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + MinSizeRel + Win32 + + + RelWithDebInfo + Win32 + + + + {14FC642B-13AD-43EE-98A1-A15D9373B9BA} + Win32Proj + Win32 + qconvex + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + qconvex.dir\Debug\ + qconvex + .exe + false + true + ..\bin\ + qconvex.dir\Release\ + qconvex + .exe + false + true + ..\bin\ + qconvex.dir\MinSizeRel\ + qconvex + .exe + false + true + ..\bin\ + qconvex.dir\RelWithDebInfo\ + qconvex + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_d.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qconvex.lib + ../bin/qconvex.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qconvex.lib + ../bin/qconvex.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qconvex.lib + ../bin/qconvex.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qconvex.lib + ../bin/qconvex.pdb + Console + + + + false + + + + + + + + + + F9AF9BC6-2CA5-4E0C-982B-CF7974723A0B + + + + + + diff -Nru qhull-2015.2/build/qconvex-64.vcxproj qhull-2020.2/build/qconvex-64.vcxproj --- qhull-2015.2/build/qconvex-64.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/qconvex-64.vcxproj 2016-01-19 04:23:07.000000000 +0000 @@ -0,0 +1,272 @@ + + + + + Debug + x64 + + + Release + x64 + + + MinSizeRel + x64 + + + RelWithDebInfo + x64 + + + + {14FC642B-13AD-43EE-98A1-A15D9373B9BA} + x64Proj + x64 + qconvex + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + qconvex.dir\Debug\ + qconvex + .exe + false + true + ..\bin\ + qconvex.dir\Release\ + qconvex + .exe + false + true + ..\bin\ + qconvex.dir\MinSizeRel\ + qconvex + .exe + false + true + ..\bin\ + qconvex.dir\RelWithDebInfo\ + qconvex + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_d.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qconvex.lib + ../bin/qconvex.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qconvex.lib + ../bin/qconvex.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qconvex.lib + ../bin/qconvex.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qconvex.lib + ../bin/qconvex.pdb + Console + + + + false + + + + + + + + + + F9AF9BC6-2CA5-4E0C-982B-CF7974723A0B + + + + + + diff -Nru qhull-2015.2/build/qdelaunay-32.vcxproj qhull-2020.2/build/qdelaunay-32.vcxproj --- qhull-2015.2/build/qdelaunay-32.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/qdelaunay-32.vcxproj 2016-01-19 04:23:07.000000000 +0000 @@ -0,0 +1,272 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + MinSizeRel + Win32 + + + RelWithDebInfo + Win32 + + + + {6120B9C5-847B-44DF-BD51-E3DCFC5BD7D8} + Win32Proj + Win32 + qdelaunay + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + qdelaunay.dir\Debug\ + qdelaunay + .exe + false + true + ..\bin\ + qdelaunay.dir\Release\ + qdelaunay + .exe + false + true + ..\bin\ + qdelaunay.dir\MinSizeRel\ + qdelaunay + .exe + false + true + ..\bin\ + qdelaunay.dir\RelWithDebInfo\ + qdelaunay + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_d.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qdelaunay.lib + ../bin/qdelaunay.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qdelaunay.lib + ../bin/qdelaunay.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qdelaunay.lib + ../bin/qdelaunay.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qdelaunay.lib + ../bin/qdelaunay.pdb + Console + + + + false + + + + + + + + + + F9AF9BC6-2CA5-4E0C-982B-CF7974723A0B + + + + + + diff -Nru qhull-2015.2/build/qdelaunay-64.vcxproj qhull-2020.2/build/qdelaunay-64.vcxproj --- qhull-2015.2/build/qdelaunay-64.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/qdelaunay-64.vcxproj 2016-01-19 04:23:07.000000000 +0000 @@ -0,0 +1,272 @@ + + + + + Debug + x64 + + + Release + x64 + + + MinSizeRel + x64 + + + RelWithDebInfo + x64 + + + + {6120B9C5-847B-44DF-BD51-E3DCFC5BD7D8} + x64Proj + x64 + qdelaunay + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + qdelaunay.dir\Debug\ + qdelaunay + .exe + false + true + ..\bin\ + qdelaunay.dir\Release\ + qdelaunay + .exe + false + true + ..\bin\ + qdelaunay.dir\MinSizeRel\ + qdelaunay + .exe + false + true + ..\bin\ + qdelaunay.dir\RelWithDebInfo\ + qdelaunay + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_d.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qdelaunay.lib + ../bin/qdelaunay.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qdelaunay.lib + ../bin/qdelaunay.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qdelaunay.lib + ../bin/qdelaunay.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qdelaunay.lib + ../bin/qdelaunay.pdb + Console + + + + false + + + + + + + + + + F9AF9BC6-2CA5-4E0C-982B-CF7974723A0B + + + + + + diff -Nru qhull-2015.2/build/qhalf-32.vcxproj qhull-2020.2/build/qhalf-32.vcxproj --- qhull-2015.2/build/qhalf-32.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/qhalf-32.vcxproj 2016-01-19 04:23:07.000000000 +0000 @@ -0,0 +1,272 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + MinSizeRel + Win32 + + + RelWithDebInfo + Win32 + + + + {A5FC7430-68C4-4F67-BC69-C231FAC40A9A} + Win32Proj + Win32 + qhalf + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + qhalf.dir\Debug\ + qhalf + .exe + false + true + ..\bin\ + qhalf.dir\Release\ + qhalf + .exe + false + true + ..\bin\ + qhalf.dir\MinSizeRel\ + qhalf + .exe + false + true + ..\bin\ + qhalf.dir\RelWithDebInfo\ + qhalf + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_d.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qhalf.lib + ../bin/qhalf.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qhalf.lib + ../bin/qhalf.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qhalf.lib + ../bin/qhalf.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qhalf.lib + ../bin/qhalf.pdb + Console + + + + false + + + + + + + + + + F9AF9BC6-2CA5-4E0C-982B-CF7974723A0B + + + + + + diff -Nru qhull-2015.2/build/qhalf-64.vcxproj qhull-2020.2/build/qhalf-64.vcxproj --- qhull-2015.2/build/qhalf-64.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/qhalf-64.vcxproj 2016-01-19 04:23:07.000000000 +0000 @@ -0,0 +1,272 @@ + + + + + Debug + x64 + + + Release + x64 + + + MinSizeRel + x64 + + + RelWithDebInfo + x64 + + + + {A5FC7430-68C4-4F67-BC69-C231FAC40A9A} + x64Proj + x64 + qhalf + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + qhalf.dir\Debug\ + qhalf + .exe + false + true + ..\bin\ + qhalf.dir\Release\ + qhalf + .exe + false + true + ..\bin\ + qhalf.dir\MinSizeRel\ + qhalf + .exe + false + true + ..\bin\ + qhalf.dir\RelWithDebInfo\ + qhalf + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_d.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qhalf.lib + ../bin/qhalf.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qhalf.lib + ../bin/qhalf.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qhalf.lib + ../bin/qhalf.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qhalf.lib + ../bin/qhalf.pdb + Console + + + + false + + + + + + + + + + F9AF9BC6-2CA5-4E0C-982B-CF7974723A0B + + + + + + diff -Nru qhull-2015.2/build/qhull-32.sln qhull-2020.2/build/qhull-32.sln --- qhull-2015.2/build/qhull-32.sln 2016-01-19 04:27:42.000000000 +0000 +++ qhull-2020.2/build/qhull-32.sln 2020-09-01 01:56:16.000000000 +0000 @@ -1,7 +1,5 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libqhull", "libqhull-32.vcxproj", "{AE297F0D-5402-41C0-83B1-0194B583B67E}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qconvex", "qconvex-32.vcxproj", "{14FC642B-13AD-43EE-98A1-A15D9373B9BA}" ProjectSection(ProjectDependencies) = postProject {F9AF9BC6-2CA5-4E0C-982B-CF7974723A0B} = {F9AF9BC6-2CA5-4E0C-982B-CF7974723A0B} @@ -22,8 +20,6 @@ {526F05C7-E54E-4673-91DC-A3AF75041688} = {526F05C7-E54E-4673-91DC-A3AF75041688} EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qhull_p", "qhull_p-32.vcxproj", "{9969E173-B078-4FC0-A35E-9F3B0FDA1CE9}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qhull_r", "qhull_r-32.vcxproj", "{D1E7C352-C0F9-4E64-B0CB-6C4371280C86}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qhullcpp", "qhullcpp-32.vcxproj", "{939F1F43-F252-486C-BB92-3166E44713A5}" diff -Nru qhull-2015.2/build/qhull-32.vcxproj qhull-2020.2/build/qhull-32.vcxproj --- qhull-2015.2/build/qhull-32.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/qhull-32.vcxproj 2016-01-19 04:23:08.000000000 +0000 @@ -0,0 +1,272 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + MinSizeRel + Win32 + + + RelWithDebInfo + Win32 + + + + {E8BF0EA0-A09D-4155-BCEC-CC1B0DF8A67E} + Win32Proj + Win32 + qhull + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + qhull.dir\Debug\ + qhull + .exe + false + true + ..\bin\ + qhull.dir\Release\ + qhull + .exe + false + true + ..\bin\ + qhull.dir\MinSizeRel\ + qhull + .exe + false + true + ..\bin\ + qhull.dir\RelWithDebInfo\ + qhull + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_rd.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull.lib + ../bin/qhull.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_r.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull.lib + ../bin/qhull.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_r.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull.lib + ../bin/qhull.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_r.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull.lib + ../bin/qhull.pdb + Console + + + + false + + + + + + + + + + 526F05C7-E54E-4673-91DC-A3AF75041688 + + + + + + diff -Nru qhull-2015.2/build/qhull-64.sln qhull-2020.2/build/qhull-64.sln --- qhull-2015.2/build/qhull-64.sln 2016-01-19 04:30:13.000000000 +0000 +++ qhull-2020.2/build/qhull-64.sln 2020-09-01 02:01:55.000000000 +0000 @@ -1,7 +1,5 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libqhull", "libqhull-64.vcxproj", "{AE297F0D-5402-41C0-83B1-0194B583B67E}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qconvex", "qconvex-64.vcxproj", "{14FC642B-13AD-43EE-98A1-A15D9373B9BA}" ProjectSection(ProjectDependencies) = postProject {F9AF9BC6-2CA5-4E0C-982B-CF7974723A0B} = {F9AF9BC6-2CA5-4E0C-982B-CF7974723A0B} @@ -22,8 +20,6 @@ {526F05C7-E54E-4673-91DC-A3AF75041688} = {526F05C7-E54E-4673-91DC-A3AF75041688} EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qhull_p", "qhull_p-64.vcxproj", "{9969E173-B078-4FC0-A35E-9F3B0FDA1CE9}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qhull_r", "qhull_r-64.vcxproj", "{D1E7C352-C0F9-4E64-B0CB-6C4371280C86}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qhullcpp", "qhullcpp-64.vcxproj", "{939F1F43-F252-486C-BB92-3166E44713A5}" diff -Nru qhull-2015.2/build/qhull-64.vcxproj qhull-2020.2/build/qhull-64.vcxproj --- qhull-2015.2/build/qhull-64.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/qhull-64.vcxproj 2016-01-19 04:23:08.000000000 +0000 @@ -0,0 +1,272 @@ + + + + + Debug + x64 + + + Release + x64 + + + MinSizeRel + x64 + + + RelWithDebInfo + x64 + + + + {E8BF0EA0-A09D-4155-BCEC-CC1B0DF8A67E} + x64Proj + x64 + qhull + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + qhull.dir\Debug\ + qhull + .exe + false + true + ..\bin\ + qhull.dir\Release\ + qhull + .exe + false + true + ..\bin\ + qhull.dir\MinSizeRel\ + qhull + .exe + false + true + ..\bin\ + qhull.dir\RelWithDebInfo\ + qhull + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_rd.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull.lib + ../bin/qhull.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_r.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull.lib + ../bin/qhull.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_r.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull.lib + ../bin/qhull.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_r.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull.lib + ../bin/qhull.pdb + Console + + + + false + + + + + + + + + + 526F05C7-E54E-4673-91DC-A3AF75041688 + + + + + + diff -Nru qhull-2015.2/build/qhullcpp-32.vcxproj qhull-2020.2/build/qhullcpp-32.vcxproj --- qhull-2015.2/build/qhullcpp-32.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/qhullcpp-32.vcxproj 2020-05-24 01:15:45.000000000 +0000 @@ -0,0 +1,250 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + MinSizeRel + Win32 + + + RelWithDebInfo + Win32 + + + + {939F1F43-F252-486C-BB92-3166E44713A5} + Win32Proj + Win32 + qhullcpp + + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\lib\ + qhullcpp.dir\Debug\ + qhullcpp_d + .lib + ..\lib\ + qhullcpp.dir\Release\ + qhullcpp + .lib + ..\lib\ + qhullcpp.dir\MinSizeRel\ + qhullcpp + .lib + ..\lib\ + qhullcpp.dir\RelWithDebInfo\ + qhullcpp + .lib + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsCpp + ProgramDatabase + Sync + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + true + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsCpp + Sync + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + true + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsCpp + Sync + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + true + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsCpp + ProgramDatabase + Sync + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + true + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru qhull-2015.2/build/qhullcpp-64.vcxproj qhull-2020.2/build/qhullcpp-64.vcxproj --- qhull-2015.2/build/qhullcpp-64.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/qhullcpp-64.vcxproj 2020-05-24 01:15:45.000000000 +0000 @@ -0,0 +1,250 @@ + + + + + Debug + x64 + + + Release + x64 + + + MinSizeRel + x64 + + + RelWithDebInfo + x64 + + + + {939F1F43-F252-486C-BB92-3166E44713A5} + x64Proj + x64 + qhullcpp + + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\lib\ + qhullcpp.dir\Debug\ + qhullcpp_d + .lib + ..\lib\ + qhullcpp.dir\Release\ + qhullcpp + .lib + ..\lib\ + qhullcpp.dir\MinSizeRel\ + qhullcpp + .lib + ..\lib\ + qhullcpp.dir\RelWithDebInfo\ + qhullcpp + .lib + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsCpp + ProgramDatabase + Sync + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + true + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsCpp + Sync + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + true + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsCpp + Sync + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + true + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsCpp + ProgramDatabase + Sync + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + true + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru qhull-2015.2/build/qhullcpp.vcproj qhull-2020.2/build/qhullcpp.vcproj --- qhull-2015.2/build/qhullcpp.vcproj 2016-01-03 21:26:33.000000000 +0000 +++ qhull-2020.2/build/qhullcpp.vcproj 2020-05-24 01:14:19.000000000 +0000 @@ -401,6 +401,10 @@ > + + @@ -501,6 +505,10 @@ > + + diff -Nru qhull-2015.2/build/qhull_p-32.vcxproj qhull-2020.2/build/qhull_p-32.vcxproj --- qhull-2015.2/build/qhull_p-32.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/qhull_p-32.vcxproj 2016-01-19 04:23:08.000000000 +0000 @@ -0,0 +1,300 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + MinSizeRel + Win32 + + + RelWithDebInfo + Win32 + + + + {9969E173-B078-4FC0-A35E-9F3B0FDA1CE9} + Win32Proj + Win32 + qhull_p + + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + qhull_p.dir\Debug\ + qhull_pd + .dll + false + true + ..\bin\ + qhull_p.dir\Release\ + qhull_p + .dll + false + true + ..\bin\ + qhull_p.dir\MinSizeRel\ + qhull_p + .dll + false + true + ..\bin\ + qhull_p.dir\RelWithDebInfo\ + qhull_p + .dll + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;qh_QHpointer;qhull_p_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;qh_QHpointer;qhull_p_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull_pd.lib + ../src/libqhull/qhull_p-exports.def + ../bin/qhull_pd.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;qh_QHpointer;qhull_p_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;qh_QHpointer;qhull_p_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull_p.lib + ../src/libqhull/qhull_p-exports.def + ../bin/qhull_p.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;qh_QHpointer;qhull_p_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;qh_QHpointer;qhull_p_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull_p.lib + ../src/libqhull/qhull_p-exports.def + ../bin/qhull_p.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;qh_QHpointer;qhull_p_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;qh_QHpointer;qhull_p_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull_p.lib + ../src/libqhull/qhull_p-exports.def + ../bin/qhull_p.pdb + Console + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru qhull-2015.2/build/qhull_p-64.vcxproj qhull-2020.2/build/qhull_p-64.vcxproj --- qhull-2015.2/build/qhull_p-64.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/qhull_p-64.vcxproj 2016-01-19 04:23:08.000000000 +0000 @@ -0,0 +1,300 @@ + + + + + Debug + x64 + + + Release + x64 + + + MinSizeRel + x64 + + + RelWithDebInfo + x64 + + + + {9969E173-B078-4FC0-A35E-9F3B0FDA1CE9} + x64Proj + x64 + qhull_p + + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + qhull_p.dir\Debug\ + qhull_pd + .dll + false + true + ..\bin\ + qhull_p.dir\Release\ + qhull_p + .dll + false + true + ..\bin\ + qhull_p.dir\MinSizeRel\ + qhull_p + .dll + false + true + ..\bin\ + qhull_p.dir\RelWithDebInfo\ + qhull_p + .dll + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;qh_QHpointer;qhull_p_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;qh_QHpointer;qhull_p_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull_pd.lib + ../src/libqhull/qhull_p-exports.def + ../bin/qhull_pd.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;qh_QHpointer;qhull_p_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;qh_QHpointer;qhull_p_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull_p.lib + ../src/libqhull/qhull_p-exports.def + ../bin/qhull_p.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;qh_QHpointer;qhull_p_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;qh_QHpointer;qhull_p_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull_p.lib + ../src/libqhull/qhull_p-exports.def + ../bin/qhull_p.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;qh_QHpointer;qhull_p_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;qh_QHpointer;qhull_p_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull_p.lib + ../src/libqhull/qhull_p-exports.def + ../bin/qhull_p.pdb + Console + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru qhull-2015.2/build/qhull.pc.in qhull-2020.2/build/qhull.pc.in --- qhull-2015.2/build/qhull.pc.in 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/qhull.pc.in 2020-07-29 22:31:13.000000000 +0000 @@ -0,0 +1,10 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +libdir=${prefix}/@LIB_INSTALL_DIR@ +includedir=${prefix}/@INCLUDE_INSTALL_DIR@ + +Name: @LIBRARY_NAME@ +Description: @LIBRARY_DESCRIPTION@ +Version: @qhull_VERSION@ +Libs: -L${libdir} -l@LIBRARY_NAME@ +Cflags: -I${includedir} + diff -Nru qhull-2015.2/build/qhull_r-32.vcxproj qhull-2020.2/build/qhull_r-32.vcxproj --- qhull-2015.2/build/qhull_r-32.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/qhull_r-32.vcxproj 2016-01-19 04:23:08.000000000 +0000 @@ -0,0 +1,300 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + MinSizeRel + Win32 + + + RelWithDebInfo + Win32 + + + + {D1E7C352-C0F9-4E64-B0CB-6C4371280C86} + Win32Proj + Win32 + qhull_r + + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + qhull_r.dir\Debug\ + qhull_rd + .dll + false + true + ..\bin\ + qhull_r.dir\Release\ + qhull_r + .dll + false + true + ..\bin\ + qhull_r.dir\MinSizeRel\ + qhull_r + .dll + false + true + ..\bin\ + qhull_r.dir\RelWithDebInfo\ + qhull_r + .dll + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;qhull_r_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;qhull_r_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull_rd.lib + ../src/libqhull_r/qhull_r-exports.def + ../bin/qhull_rd.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;qhull_r_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;qhull_r_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull_r.lib + ../src/libqhull_r/qhull_r-exports.def + ../bin/qhull_r.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;qhull_r_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;qhull_r_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull_r.lib + ../src/libqhull_r/qhull_r-exports.def + ../bin/qhull_r.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;qhull_r_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;qhull_r_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull_r.lib + ../src/libqhull_r/qhull_r-exports.def + ../bin/qhull_r.pdb + Console + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru qhull-2015.2/build/qhull_r-64.vcxproj qhull-2020.2/build/qhull_r-64.vcxproj --- qhull-2015.2/build/qhull_r-64.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/qhull_r-64.vcxproj 2016-01-19 04:23:09.000000000 +0000 @@ -0,0 +1,300 @@ + + + + + Debug + x64 + + + Release + x64 + + + MinSizeRel + x64 + + + RelWithDebInfo + x64 + + + + {D1E7C352-C0F9-4E64-B0CB-6C4371280C86} + x64Proj + x64 + qhull_r + + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + qhull_r.dir\Debug\ + qhull_rd + .dll + false + true + ..\bin\ + qhull_r.dir\Release\ + qhull_r + .dll + false + true + ..\bin\ + qhull_r.dir\MinSizeRel\ + qhull_r + .dll + false + true + ..\bin\ + qhull_r.dir\RelWithDebInfo\ + qhull_r + .dll + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;qhull_r_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;qhull_r_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull_rd.lib + ../src/libqhull_r/qhull_r-exports.def + ../bin/qhull_rd.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;qhull_r_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;qhull_r_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull_r.lib + ../src/libqhull_r/qhull_r-exports.def + ../bin/qhull_r.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;qhull_r_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;qhull_r_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull_r.lib + ../src/libqhull_r/qhull_r-exports.def + ../bin/qhull_r.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;qhull_r_EXPORTS;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;qhull_r_EXPORTS;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qhull_r.lib + ../src/libqhull_r/qhull_r-exports.def + ../bin/qhull_r.pdb + Console + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru qhull-2015.2/build/qhull.sln qhull-2020.2/build/qhull.sln --- qhull-2015.2/build/qhull.sln 2016-01-05 03:19:42.000000000 +0000 +++ qhull-2020.2/build/qhull.sln 2020-09-01 02:02:24.000000000 +0000 @@ -1,7 +1,5 @@ Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libqhull", "libqhull.vcproj", "{51BD63AB-336E-4215-B725-21F144BCBCBC}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qconvex", "qconvex.vcproj", "{F909F400-6805-477F-B85B-5230DED4CB55}" ProjectSection(ProjectDependencies) = postProject {5B24F2E7-EF6E-4AF6-B2CE-1E049B1A12AC} = {5B24F2E7-EF6E-4AF6-B2CE-1E049B1A12AC} @@ -22,8 +20,6 @@ {635EC42D-5C25-4D20-B5C2-D0A0034EB9B8} = {635EC42D-5C25-4D20-B5C2-D0A0034EB9B8} EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qhull_p", "qhull_p.vcproj", "{9A9C8B7B-2D5A-428E-A5D6-303FAF68AB19}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qhull_r", "qhull_r.vcproj", "{DA9B53C4-2817-4E37-9181-E61959CBB0FE}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qhullcpp", "qhullcpp.vcproj", "{7326816B-C401-4ACA-8027-03BA7A98C16B}" diff -Nru qhull-2015.2/build/qhullstatic-32.vcxproj qhull-2020.2/build/qhullstatic-32.vcxproj --- qhull-2015.2/build/qhullstatic-32.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/qhullstatic-32.vcxproj 2016-01-19 04:23:09.000000000 +0000 @@ -0,0 +1,232 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + MinSizeRel + Win32 + + + RelWithDebInfo + Win32 + + + + {F9AF9BC6-2CA5-4E0C-982B-CF7974723A0B} + Win32Proj + Win32 + qhullstatic + + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\lib\ + qhullstatic.dir\Debug\ + qhullstatic_d + .lib + ..\lib\ + qhullstatic.dir\Release\ + qhullstatic + .lib + ..\lib\ + qhullstatic.dir\MinSizeRel\ + qhullstatic + .lib + ..\lib\ + qhullstatic.dir\RelWithDebInfo\ + qhullstatic + .lib + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru qhull-2015.2/build/qhullstatic-64.vcxproj qhull-2020.2/build/qhullstatic-64.vcxproj --- qhull-2015.2/build/qhullstatic-64.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/qhullstatic-64.vcxproj 2016-01-19 04:23:09.000000000 +0000 @@ -0,0 +1,232 @@ + + + + + Debug + x64 + + + Release + x64 + + + MinSizeRel + x64 + + + RelWithDebInfo + x64 + + + + {F9AF9BC6-2CA5-4E0C-982B-CF7974723A0B} + x64Proj + x64 + qhullstatic + + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\lib\ + qhullstatic.dir\Debug\ + qhullstatic_d + .lib + ..\lib\ + qhullstatic.dir\Release\ + qhullstatic + .lib + ..\lib\ + qhullstatic.dir\MinSizeRel\ + qhullstatic + .lib + ..\lib\ + qhullstatic.dir\RelWithDebInfo\ + qhullstatic + .lib + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru qhull-2015.2/build/qhullstatic_r-32.vcxproj qhull-2020.2/build/qhullstatic_r-32.vcxproj --- qhull-2015.2/build/qhullstatic_r-32.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/qhullstatic_r-32.vcxproj 2016-01-19 04:23:09.000000000 +0000 @@ -0,0 +1,232 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + MinSizeRel + Win32 + + + RelWithDebInfo + Win32 + + + + {526F05C7-E54E-4673-91DC-A3AF75041688} + Win32Proj + Win32 + qhullstatic_r + + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\lib\ + qhullstatic_r.dir\Debug\ + qhullstatic_rd + .lib + ..\lib\ + qhullstatic_r.dir\Release\ + qhullstatic_r + .lib + ..\lib\ + qhullstatic_r.dir\MinSizeRel\ + qhullstatic_r + .lib + ..\lib\ + qhullstatic_r.dir\RelWithDebInfo\ + qhullstatic_r + .lib + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru qhull-2015.2/build/qhullstatic_r-64.vcxproj qhull-2020.2/build/qhullstatic_r-64.vcxproj --- qhull-2015.2/build/qhullstatic_r-64.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/qhullstatic_r-64.vcxproj 2016-01-19 04:23:09.000000000 +0000 @@ -0,0 +1,232 @@ + + + + + Debug + x64 + + + Release + x64 + + + MinSizeRel + x64 + + + RelWithDebInfo + x64 + + + + {526F05C7-E54E-4673-91DC-A3AF75041688} + x64Proj + x64 + qhullstatic_r + + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\lib\ + qhullstatic_r.dir\Debug\ + qhullstatic_rd + .lib + ..\lib\ + qhullstatic_r.dir\Release\ + qhullstatic_r + .lib + ..\lib\ + qhullstatic_r.dir\MinSizeRel\ + qhullstatic_r + .lib + ..\lib\ + qhullstatic_r.dir\RelWithDebInfo\ + qhullstatic_r + .lib + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru qhull-2015.2/build/qvoronoi-32.vcxproj qhull-2020.2/build/qvoronoi-32.vcxproj --- qhull-2015.2/build/qvoronoi-32.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/qvoronoi-32.vcxproj 2016-01-19 04:23:09.000000000 +0000 @@ -0,0 +1,272 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + MinSizeRel + Win32 + + + RelWithDebInfo + Win32 + + + + {7A587B07-AE31-4071-9D8B-105BFA3815C9} + Win32Proj + Win32 + qvoronoi + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + qvoronoi.dir\Debug\ + qvoronoi + .exe + false + true + ..\bin\ + qvoronoi.dir\Release\ + qvoronoi + .exe + false + true + ..\bin\ + qvoronoi.dir\MinSizeRel\ + qvoronoi + .exe + false + true + ..\bin\ + qvoronoi.dir\RelWithDebInfo\ + qvoronoi + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_d.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qvoronoi.lib + ../bin/qvoronoi.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qvoronoi.lib + ../bin/qvoronoi.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qvoronoi.lib + ../bin/qvoronoi.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qvoronoi.lib + ../bin/qvoronoi.pdb + Console + + + + false + + + + + + + + + + F9AF9BC6-2CA5-4E0C-982B-CF7974723A0B + + + + + + diff -Nru qhull-2015.2/build/qvoronoi-64.vcxproj qhull-2020.2/build/qvoronoi-64.vcxproj --- qhull-2015.2/build/qvoronoi-64.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/qvoronoi-64.vcxproj 2016-01-19 04:23:09.000000000 +0000 @@ -0,0 +1,272 @@ + + + + + Debug + x64 + + + Release + x64 + + + MinSizeRel + x64 + + + RelWithDebInfo + x64 + + + + {7A587B07-AE31-4071-9D8B-105BFA3815C9} + x64Proj + x64 + qvoronoi + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + qvoronoi.dir\Debug\ + qvoronoi + .exe + false + true + ..\bin\ + qvoronoi.dir\Release\ + qvoronoi + .exe + false + true + ..\bin\ + qvoronoi.dir\MinSizeRel\ + qvoronoi + .exe + false + true + ..\bin\ + qvoronoi.dir\RelWithDebInfo\ + qvoronoi + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_d.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qvoronoi.lib + ../bin/qvoronoi.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qvoronoi.lib + ../bin/qvoronoi.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/qvoronoi.lib + ../bin/qvoronoi.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/qvoronoi.lib + ../bin/qvoronoi.pdb + Console + + + + false + + + + + + + + + + F9AF9BC6-2CA5-4E0C-982B-CF7974723A0B + + + + + + diff -Nru qhull-2015.2/build/rbox-32.vcxproj qhull-2020.2/build/rbox-32.vcxproj --- qhull-2015.2/build/rbox-32.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/rbox-32.vcxproj 2016-01-19 04:23:09.000000000 +0000 @@ -0,0 +1,272 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + MinSizeRel + Win32 + + + RelWithDebInfo + Win32 + + + + {F3F597F4-08BF-4567-8866-D8A66BB1B9BE} + Win32Proj + Win32 + rbox + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + rbox.dir\Debug\ + rbox + .exe + false + true + ..\bin\ + rbox.dir\Release\ + rbox + .exe + false + true + ..\bin\ + rbox.dir\MinSizeRel\ + rbox + .exe + false + true + ..\bin\ + rbox.dir\RelWithDebInfo\ + rbox + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_d.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/rbox.lib + ../bin/rbox.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/rbox.lib + ../bin/rbox.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/rbox.lib + ../bin/rbox.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/rbox.lib + ../bin/rbox.pdb + Console + + + + false + + + + + + + + + + F9AF9BC6-2CA5-4E0C-982B-CF7974723A0B + + + + + + diff -Nru qhull-2015.2/build/rbox-64.vcxproj qhull-2020.2/build/rbox-64.vcxproj --- qhull-2015.2/build/rbox-64.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/rbox-64.vcxproj 2016-01-19 04:23:09.000000000 +0000 @@ -0,0 +1,272 @@ + + + + + Debug + x64 + + + Release + x64 + + + MinSizeRel + x64 + + + RelWithDebInfo + x64 + + + + {F3F597F4-08BF-4567-8866-D8A66BB1B9BE} + x64Proj + x64 + rbox + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + rbox.dir\Debug\ + rbox + .exe + false + true + ..\bin\ + rbox.dir\Release\ + rbox + .exe + false + true + ..\bin\ + rbox.dir\MinSizeRel\ + rbox + .exe + false + true + ..\bin\ + rbox.dir\RelWithDebInfo\ + rbox + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_d.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/rbox.lib + ../bin/rbox.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/rbox.lib + ../bin/rbox.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/rbox.lib + ../bin/rbox.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/rbox.lib + ../bin/rbox.pdb + Console + + + + false + + + + + + + + + + F9AF9BC6-2CA5-4E0C-982B-CF7974723A0B + + + + + + diff -Nru qhull-2015.2/build/testqset-32.vcxproj qhull-2020.2/build/testqset-32.vcxproj --- qhull-2015.2/build/testqset-32.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/testqset-32.vcxproj 2016-01-19 04:23:10.000000000 +0000 @@ -0,0 +1,274 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + MinSizeRel + Win32 + + + RelWithDebInfo + Win32 + + + + {9ECBCBA4-269F-4ED1-B359-7522F9D19DDA} + Win32Proj + Win32 + testqset + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + testqset.dir\Debug\ + testqset + .exe + false + true + ..\bin\ + testqset.dir\Release\ + testqset + .exe + false + true + ..\bin\ + testqset.dir\MinSizeRel\ + testqset + .exe + false + true + ..\bin\ + testqset.dir\RelWithDebInfo\ + testqset + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/testqset.lib + ../bin/testqset.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/testqset.lib + ../bin/testqset.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/testqset.lib + ../bin/testqset.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/testqset.lib + ../bin/testqset.pdb + Console + + + + false + + + + + + + + + + + + + + + + + + diff -Nru qhull-2015.2/build/testqset-64.vcxproj qhull-2020.2/build/testqset-64.vcxproj --- qhull-2015.2/build/testqset-64.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/testqset-64.vcxproj 2016-01-19 04:23:10.000000000 +0000 @@ -0,0 +1,274 @@ + + + + + Debug + x64 + + + Release + x64 + + + MinSizeRel + x64 + + + RelWithDebInfo + x64 + + + + {9ECBCBA4-269F-4ED1-B359-7522F9D19DDA} + x64Proj + x64 + testqset + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + testqset.dir\Debug\ + testqset + .exe + false + true + ..\bin\ + testqset.dir\Release\ + testqset + .exe + false + true + ..\bin\ + testqset.dir\MinSizeRel\ + testqset + .exe + false + true + ..\bin\ + testqset.dir\RelWithDebInfo\ + testqset + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/testqset.lib + ../bin/testqset.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/testqset.lib + ../bin/testqset.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/testqset.lib + ../bin/testqset.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/testqset.lib + ../bin/testqset.pdb + Console + + + + false + + + + + + + + + + + + + + + + + + diff -Nru qhull-2015.2/build/testqset_r-32.vcxproj qhull-2020.2/build/testqset_r-32.vcxproj --- qhull-2015.2/build/testqset_r-32.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/testqset_r-32.vcxproj 2016-01-19 04:23:10.000000000 +0000 @@ -0,0 +1,274 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + MinSizeRel + Win32 + + + RelWithDebInfo + Win32 + + + + {ACECEFF4-E332-4AD0-A89B-0D07A78FEA6A} + Win32Proj + Win32 + testqset_r + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + testqset_r.dir\Debug\ + testqset_r + .exe + false + true + ..\bin\ + testqset_r.dir\Release\ + testqset_r + .exe + false + true + ..\bin\ + testqset_r.dir\MinSizeRel\ + testqset_r + .exe + false + true + ..\bin\ + testqset_r.dir\RelWithDebInfo\ + testqset_r + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/testqset_r.lib + ../bin/testqset_r.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/testqset_r.lib + ../bin/testqset_r.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/testqset_r.lib + ../bin/testqset_r.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/testqset_r.lib + ../bin/testqset_r.pdb + Console + + + + false + + + + + + + + + + + + + + + + + + diff -Nru qhull-2015.2/build/testqset_r-64.vcxproj qhull-2020.2/build/testqset_r-64.vcxproj --- qhull-2015.2/build/testqset_r-64.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/testqset_r-64.vcxproj 2016-01-19 04:23:10.000000000 +0000 @@ -0,0 +1,274 @@ + + + + + Debug + x64 + + + Release + x64 + + + MinSizeRel + x64 + + + RelWithDebInfo + x64 + + + + {ACECEFF4-E332-4AD0-A89B-0D07A78FEA6A} + x64Proj + x64 + testqset_r + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + testqset_r.dir\Debug\ + testqset_r + .exe + false + true + ..\bin\ + testqset_r.dir\Release\ + testqset_r + .exe + false + true + ..\bin\ + testqset_r.dir\MinSizeRel\ + testqset_r + .exe + false + true + ..\bin\ + testqset_r.dir\RelWithDebInfo\ + testqset_r + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/testqset_r.lib + ../bin/testqset_r.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/testqset_r.lib + ../bin/testqset_r.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/testqset_r.lib + ../bin/testqset_r.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/testqset_r.lib + ../bin/testqset_r.pdb + Console + + + + false + + + + + + + + + + + + + + + + + + diff -Nru qhull-2015.2/build/user_eg2-32.vcxproj qhull-2020.2/build/user_eg2-32.vcxproj --- qhull-2015.2/build/user_eg2-32.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/user_eg2-32.vcxproj 2016-01-19 04:23:10.000000000 +0000 @@ -0,0 +1,272 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + MinSizeRel + Win32 + + + RelWithDebInfo + Win32 + + + + {5564AE35-E8FE-4039-BD33-76B920D02BC9} + Win32Proj + Win32 + user_eg2 + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + user_eg2.dir\Debug\ + user_eg2 + .exe + false + true + ..\bin\ + user_eg2.dir\Release\ + user_eg2 + .exe + false + true + ..\bin\ + user_eg2.dir\MinSizeRel\ + user_eg2 + .exe + false + true + ..\bin\ + user_eg2.dir\RelWithDebInfo\ + user_eg2 + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_rd.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg2.lib + ../bin/user_eg2.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_r.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg2.lib + ../bin/user_eg2.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_r.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg2.lib + ../bin/user_eg2.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_r.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg2.lib + ../bin/user_eg2.pdb + Console + + + + false + + + + + + + + + + 526F05C7-E54E-4673-91DC-A3AF75041688 + + + + + + diff -Nru qhull-2015.2/build/user_eg2-64.vcxproj qhull-2020.2/build/user_eg2-64.vcxproj --- qhull-2015.2/build/user_eg2-64.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/user_eg2-64.vcxproj 2016-01-19 04:23:10.000000000 +0000 @@ -0,0 +1,272 @@ + + + + + Debug + x64 + + + Release + x64 + + + MinSizeRel + x64 + + + RelWithDebInfo + x64 + + + + {5564AE35-E8FE-4039-BD33-76B920D02BC9} + x64Proj + x64 + user_eg2 + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + user_eg2.dir\Debug\ + user_eg2 + .exe + false + true + ..\bin\ + user_eg2.dir\Release\ + user_eg2 + .exe + false + true + ..\bin\ + user_eg2.dir\MinSizeRel\ + user_eg2 + .exe + false + true + ..\bin\ + user_eg2.dir\RelWithDebInfo\ + user_eg2 + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_rd.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg2.lib + ../bin/user_eg2.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_r.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg2.lib + ../bin/user_eg2.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_r.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg2.lib + ../bin/user_eg2.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullstatic_r.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg2.lib + ../bin/user_eg2.pdb + Console + + + + false + + + + + + + + + + 526F05C7-E54E-4673-91DC-A3AF75041688 + + + + + + diff -Nru qhull-2015.2/build/user_eg-32.vcxproj qhull-2020.2/build/user_eg-32.vcxproj --- qhull-2015.2/build/user_eg-32.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/user_eg-32.vcxproj 2016-01-19 04:23:10.000000000 +0000 @@ -0,0 +1,272 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + MinSizeRel + Win32 + + + RelWithDebInfo + Win32 + + + + {D1F6E2EB-53DB-44FB-AC8C-EC2A339683A7} + Win32Proj + Win32 + user_eg + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + user_eg.dir\Debug\ + user_eg + .exe + false + true + ..\bin\ + user_eg.dir\Release\ + user_eg + .exe + false + true + ..\bin\ + user_eg.dir\MinSizeRel\ + user_eg + .exe + false + true + ..\bin\ + user_eg.dir\RelWithDebInfo\ + user_eg + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;qh_dllimport;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;qh_dllimport;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhull_rd.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg.lib + ../bin/user_eg.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;qh_dllimport;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;qh_dllimport;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhull_r.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg.lib + ../bin/user_eg.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;qh_dllimport;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;qh_dllimport;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhull_r.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg.lib + ../bin/user_eg.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;qh_dllimport;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;qh_dllimport;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhull_r.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg.lib + ../bin/user_eg.pdb + Console + + + + false + + + + + + + + + + D1E7C352-C0F9-4E64-B0CB-6C4371280C86 + + + + + + diff -Nru qhull-2015.2/build/user_eg3-32.vcxproj qhull-2020.2/build/user_eg3-32.vcxproj --- qhull-2015.2/build/user_eg3-32.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/user_eg3-32.vcxproj 2016-01-19 04:23:10.000000000 +0000 @@ -0,0 +1,275 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + MinSizeRel + Win32 + + + RelWithDebInfo + Win32 + + + + {E615D779-7F0A-4521-B7AD-B3C0D328652E} + Win32Proj + Win32 + user_eg3 + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + user_eg3.dir\Debug\ + user_eg3 + .exe + false + true + ..\bin\ + user_eg3.dir\Release\ + user_eg3 + .exe + false + true + ..\bin\ + user_eg3.dir\MinSizeRel\ + user_eg3 + .exe + false + true + ..\bin\ + user_eg3.dir\RelWithDebInfo\ + user_eg3 + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsCpp + ProgramDatabase + Sync + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + true + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullcpp_d.lib;..\lib\qhullstatic_rd.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg3.lib + ../bin/user_eg3.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsCpp + Sync + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + true + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullcpp.lib;..\lib\qhullstatic_r.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg3.lib + ../bin/user_eg3.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsCpp + Sync + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + true + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullcpp.lib;..\lib\qhullstatic_r.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg3.lib + ../bin/user_eg3.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsCpp + ProgramDatabase + Sync + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + true + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:X86 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullcpp.lib;..\lib\qhullstatic_r.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg3.lib + ../bin/user_eg3.pdb + Console + + + + false + + + + + + + + + + 939F1F43-F252-486C-BB92-3166E44713A5 + + + 526F05C7-E54E-4673-91DC-A3AF75041688 + + + + + + diff -Nru qhull-2015.2/build/user_eg3-64.vcxproj qhull-2020.2/build/user_eg3-64.vcxproj --- qhull-2015.2/build/user_eg3-64.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/user_eg3-64.vcxproj 2016-01-19 04:23:10.000000000 +0000 @@ -0,0 +1,275 @@ + + + + + Debug + x64 + + + Release + x64 + + + MinSizeRel + x64 + + + RelWithDebInfo + x64 + + + + {E615D779-7F0A-4521-B7AD-B3C0D328652E} + x64Proj + x64 + user_eg3 + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + user_eg3.dir\Debug\ + user_eg3 + .exe + false + true + ..\bin\ + user_eg3.dir\Release\ + user_eg3 + .exe + false + true + ..\bin\ + user_eg3.dir\MinSizeRel\ + user_eg3 + .exe + false + true + ..\bin\ + user_eg3.dir\RelWithDebInfo\ + user_eg3 + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsCpp + ProgramDatabase + Sync + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + true + Level3 + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullcpp_d.lib;..\lib\qhullstatic_rd.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg3.lib + ../bin/user_eg3.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsCpp + Sync + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + true + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullcpp.lib;..\lib\qhullstatic_r.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg3.lib + ../bin/user_eg3.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsCpp + Sync + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + true + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullcpp.lib;..\lib\qhullstatic_r.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg3.lib + ../bin/user_eg3.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsCpp + ProgramDatabase + Sync + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + true + Level3 + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhullcpp.lib;..\lib\qhullstatic_r.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg3.lib + ../bin/user_eg3.pdb + Console + + + + false + + + + + + + + + + 939F1F43-F252-486C-BB92-3166E44713A5 + + + 526F05C7-E54E-4673-91DC-A3AF75041688 + + + + + + diff -Nru qhull-2015.2/build/user_eg-64.vcxproj qhull-2020.2/build/user_eg-64.vcxproj --- qhull-2015.2/build/user_eg-64.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/build/user_eg-64.vcxproj 2016-01-19 04:23:10.000000000 +0000 @@ -0,0 +1,272 @@ + + + + + Debug + x64 + + + Release + x64 + + + MinSizeRel + x64 + + + RelWithDebInfo + x64 + + + + {D1F6E2EB-53DB-44FB-AC8C-EC2A339683A7} + x64Proj + x64 + user_eg + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + ..\bin\ + user_eg.dir\Debug\ + user_eg + .exe + false + true + ..\bin\ + user_eg.dir\Release\ + user_eg + .exe + false + true + ..\bin\ + user_eg.dir\MinSizeRel\ + user_eg + .exe + false + true + ..\bin\ + user_eg.dir\RelWithDebInfo\ + user_eg + .exe + false + true + + + + ..\src;%(AdditionalIncludeDirectories) + Debug/ + EnableFastChecks + CompileAsC + ProgramDatabase + + + Disabled + Disabled + NotUsing + MultiThreadedDebugDLL + Level3 + WIN32;_WINDOWS;_DEBUG;qh_dllimport;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;_DEBUG;qh_dllimport;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhull_rd.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg.lib + ../bin/user_eg.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + Release/ + CompileAsC + + + AnySuitable + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;qh_dllimport;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;qh_dllimport;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhull_r.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg.lib + ../bin/user_eg.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + MinSizeRel/ + CompileAsC + + + OnlyExplicitInline + MinSpace + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;qh_dllimport;%(PreprocessorDefinitions) + $(IntDir) + + + + WIN32;_WINDOWS;NDEBUG;qh_dllimport;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhull_r.lib + %(AdditionalLibraryDirectories) + false + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg.lib + ../bin/user_eg.pdb + Console + + + + false + + + + + ..\src;%(AdditionalIncludeDirectories) + RelWithDebInfo/ + CompileAsC + ProgramDatabase + + + OnlyExplicitInline + MaxSpeed + NotUsing + MultiThreadedDLL + Level3 + WIN32;_WINDOWS;NDEBUG;qh_dllimport;%(PreprocessorDefinitions) + $(IntDir) + + + WIN32;_WINDOWS;NDEBUG;qh_dllimport;%(PreprocessorDefinitions) + ..\src;%(AdditionalIncludeDirectories) + + + ..\src;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + /machine:x64 /debug %(AdditionalOptions) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;..\lib\qhull_r.lib + %(AdditionalLibraryDirectories) + true + %(IgnoreSpecificDefaultLibraries) + ../lib/user_eg.lib + ../bin/user_eg.pdb + Console + + + + false + + + + + + + + + + D1E7C352-C0F9-4E64-B0CB-6C4371280C86 + + + + + + diff -Nru qhull-2015.2/CMakeLists.txt qhull-2020.2/CMakeLists.txt --- qhull-2015.2/CMakeLists.txt 2016-01-19 00:21:32.000000000 +0000 +++ qhull-2020.2/CMakeLists.txt 2020-09-04 01:23:31.000000000 +0000 @@ -1,19 +1,34 @@ # CMakeLists.txt -- CMake configuration file for qhull, qhull6, and related programs # +# CMake options +# BUILD_SHARED_LIBS=OFF -- Do not build libqhull_r.so +# BUILD_STATIC_LIBS=OFF -- Do not build libqhullcpp.a, libqhullstatic_r.a, libqhullstatic.a, and user_eg3 +# CMAKE_INSTALL_PREFIX=path -- Prefix for the install directories +# LINK_APPS_SHARED=ON -- Link qconvex,etc. to libqhull_r instead of libqhullstatic_r +# +# 32-bit vs. 64-bit +# Qhull uses less memory when built as 32-bit code +# On 64-bit hosts, consider building with -DCMAKE_CXX_FLAGS=-m32 -DCMAKE_C_FLAGS=-m32 +# +# Additional build targets +# libqhull -- Deprecated, shared library for non-reentrant Qhull (use libqhull_r or libqhullstatic) +# qhull_p -- Deprecated, shared library for qh_QHpointer and non-reentrant Qhull (use libqhull_r) +# qhullp -- Same as qhull using qh_QHpointer and libqhull_p +# user_egp -- Same as user_eg using qh_QHpointer and libqhull_p +# +# For qhulltest, use the Qt build (src/qhull-all.pro) +# # To install CMake # Download from http://www.cmake.org/download/ # # To find the available targets for CMake -G "..." # cmake --help # -# To build with MSYS/mingw +# To build with MSYS, MSYS2, mingw, mingw-w64, or GitForWindows # cd build && cmake -G "MSYS Makefiles" .. && cmake .. # make # make install # -# To uninstall on unix or MSYS/mingw -# xargs rm :d>") if(UNIX) target_link_libraries(${qhull_SHAREDR} m) @@ -382,22 +381,18 @@ endif(UNIX) # --------------------------------------- -# Define shared library for non-reentrant qhull without qh_QHpointer +# Define deprecated shared library for non-reentrant qhull # --------------------------------------- add_library(${qhull_SHARED} SHARED ${libqhull_SOURCES} src/libqhull/qhull-exports.def) - -if(qhull_SHARED MATCHES "libqhull") - set(qhull_OUTPUT_NAME qhull) - set_target_properties(${qhull_SHARED} PROPERTIES - OUTPUT_NAME "${qhull_OUTPUT_NAME}" ) -endif() set_target_properties(${qhull_SHARED} PROPERTIES + EXCLUDE_FROM_ALL TRUE SOVERSION ${qhull_SOVERSION} - VERSION ${qhull_VERSION}) + VERSION ${qhull_VERSION} + OUTPUT_NAME "qhull$<$:_d>") if(UNIX) target_link_libraries(${qhull_SHARED} m) @@ -413,16 +408,19 @@ endif(UNIX) # --------------------------------------- -# Define old shared library qhull with qh_QHpointer +# Define deprecated shared library for non-reentrant qhull with qh_QHpointer # --------------------------------------- -add_library(${qhull_SHAREDP} SHARED +add_library(${qhull_SHAREDP} SHARED ${libqhull_SOURCES} src/libqhull/qhull_p-exports.def) + set_target_properties(${qhull_SHAREDP} PROPERTIES + EXCLUDE_FROM_ALL TRUE COMPILE_DEFINITIONS "qh_QHpointer" SOVERSION ${qhull_SOVERSION} - VERSION ${qhull_VERSION}) + VERSION ${qhull_VERSION} + OUTPUT_NAME "${qhull_SHAREDP}$<$:d>") if(UNIX) target_link_libraries(${qhull_SHAREDP} m) @@ -443,11 +441,13 @@ add_library(${qhull_STATIC} STATIC ${libqhull_SOURCES}) set_target_properties(${qhull_STATIC} PROPERTIES - VERSION ${qhull_VERSION}) + VERSION ${qhull_VERSION} + OUTPUT_NAME "${qhull_STATIC}$<$:_d>") add_library(${qhull_STATICR} STATIC ${libqhullr_SOURCES}) set_target_properties(${qhull_STATICR} PROPERTIES - VERSION ${qhull_VERSION}) + VERSION ${qhull_VERSION} + OUTPUT_NAME "${qhull_STATICR}$<$:d>") if(UNIX) target_link_libraries(${qhull_STATIC} m) @@ -456,64 +456,126 @@ # --------------------------------------- # Define C++ static library qhullcpp -# Do not create libqhullcpp as a shared library. Qhull C++ classes may change layout and size. +# Do not create libqhullcpp as a shared library. +# Qhull C++ classes may change layout and size. +# Qhull C programs use setjmp/longjmp for error handling. # --------------------------------------- add_library(${qhull_CPP} STATIC ${libqhullcpp_SOURCES}) set_target_properties(${qhull_CPP} PROPERTIES - VERSION ${qhull_VERSION}) + VERSION ${qhull_VERSION} + OUTPUT_NAME "${qhull_CPP}$<$:_d>" + POSITION_INDEPENDENT_CODE "TRUE") # --------------------------------------- -# Define qhull executables linked to qhullstatic library -# qhull is linked to reentrant qhull (more flexible) -# the others are linked to non-reentrant qhull (somewhat faster) +# if BUILD_STATIC_LIBS=OFF or BUILD_SHARED_LIBS=OFF +# Exclude library builds from "make all" +# --------------------------------------- +if(NOT ${BUILD_STATIC_LIBS}) + set_target_properties(${qhull_STATIC} PROPERTIES EXCLUDE_FROM_ALL TRUE) + set_target_properties(${qhull_STATICR} PROPERTIES EXCLUDE_FROM_ALL TRUE) + set_target_properties(${qhull_CPP} PROPERTIES EXCLUDE_FROM_ALL TRUE) +endif() +if(NOT ${BUILD_SHARED_LIBS}) + set_target_properties(${qhull_SHARED} PROPERTIES EXCLUDE_FROM_ALL TRUE) + set_target_properties(${qhull_SHAREDR} PROPERTIES EXCLUDE_FROM_ALL TRUE) + set_target_properties(${qhull_SHAREDP} PROPERTIES EXCLUDE_FROM_ALL TRUE) +endif() + # --------------------------------------- +# Define options for linking to shared libaries +# --------------------------------------- +if(MSVC) + set(qconvex_DEFINES qh_dllimport) + set(qdelaunay_DEFINES qh_dllimport) + set(qhalf_DEFINES qh_dllimport) + set(qhull_DEFINES qh_dllimport) + set(qvoronoi_DEFINES qh_dllimport) + set(rbox_DEFINES qh_dllimport) + set(user_eg_DEFINES qh_dllimport) + set(user_eg2_DEFINES qh_dllimport) + set(user_egp_DEFINES qh_QHpointer_dllimport qh_QHpointer) + set(qhullp_DEFINES qh_QHpointer_dllimport qh_QHpointer) +else() + set(qconvex_DEFINES ) + set(qdelaunay_DEFINES ) + set(qhalf_DEFINES ) + set(qhull_DEFINES ) + set(qvoronoi_DEFINES ) + set(rbox_DEFINES ) + set(user_eg_DEFINES ) + set(user_eg2_DEFINES ) + set(user_egp_DEFINES qh_QHpointer) + set(qhullp_DEFINES qh_QHpointer) +endif() -set(qhull_SOURCES src/qhull/unix_r.c) -set(rbox_SOURCES src/rbox/rbox.c) -set(qconvex_SOURCES src/qconvex/qconvex.c) -set(qdelaunay_SOURCES src/qdelaunay/qdelaun.c) -set(qvoronoi_SOURCES src/qvoronoi/qvoronoi.c) -set(qhalf_SOURCES src/qhalf/qhalf.c) +# --------------------------------------- +# Define qhull applications +# +# By default, qhull is linked to reentrant qhull (more flexible) +# the other applications are linked to non-reentrant qhull (somewhat faster) +# +# If LINK_APPS_SHARED, applications are linked to reentrant qhull +# --------------------------------------- -add_executable(qhull ${qhull_SOURCES}) -target_link_libraries(qhull ${qhull_STATICR}) +if(${LINK_APPS_SHARED}) + add_executable(qconvex src/qconvex/qconvex_r.c) + target_link_libraries(qconvex ${qhull_SHAREDR}) + set_target_properties(qconvex PROPERTIES + COMPILE_DEFINITIONS "${qconvex_DEFINES}") + + add_executable(qdelaunay src/qdelaunay/qdelaun_r.c) + target_link_libraries(qdelaunay ${qhull_SHAREDR}) + set_target_properties(qdelaunay PROPERTIES + COMPILE_DEFINITIONS "${qdelaunay_DEFINES}") + + add_executable(qhalf src/qhalf/qhalf_r.c) + target_link_libraries(qhalf ${qhull_SHAREDR}) + set_target_properties(qhalf PROPERTIES + COMPILE_DEFINITIONS "${qhalf_DEFINES}") + + add_executable(qhull src/qhull/unix_r.c) + target_link_libraries(qhull ${qhull_SHAREDR}) + set_target_properties(qhull PROPERTIES + COMPILE_DEFINITIONS "${qhull_DEFINES}") + + add_executable(qvoronoi src/qvoronoi/qvoronoi_r.c) + target_link_libraries(qvoronoi ${qhull_SHAREDR}) + set_target_properties(qvoronoi PROPERTIES + COMPILE_DEFINITIONS "${qvoronoi_DEFINES}") + + add_executable(rbox src/rbox/rbox_r.c) + target_link_libraries(rbox ${qhull_SHAREDR}) + set_target_properties(rbox PROPERTIES + COMPILE_DEFINITIONS "${rbox_DEFINES}") +else() + if(NOT ${BUILD_STATIC_LIBS}) + message(FATAL_ERROR, " Nothing to build -- BUILD_SHARED_LIBS=OFF and BUILD_STATIC_LIBS=OFF") + endif() -add_executable(rbox ${rbox_SOURCES}) -target_link_libraries(rbox ${qhull_STATIC}) + add_executable(qconvex src/qconvex/qconvex.c) + target_link_libraries(qconvex ${qhull_STATIC}) -add_executable(qconvex ${qconvex_SOURCES}) -target_link_libraries(qconvex ${qhull_STATIC}) + add_executable(qdelaunay src/qdelaunay/qdelaun.c) + target_link_libraries(qdelaunay ${qhull_STATIC}) -add_executable(qdelaunay ${qdelaunay_SOURCES}) -target_link_libraries(qdelaunay ${qhull_STATIC}) + add_executable(qhalf src/qhalf/qhalf.c) + target_link_libraries(qhalf ${qhull_STATIC}) -add_executable(qvoronoi ${qvoronoi_SOURCES}) -target_link_libraries(qvoronoi ${qhull_STATIC}) + add_executable(qhull src/qhull/unix_r.c) + target_link_libraries(qhull ${qhull_STATICR}) -add_executable(qhalf ${qhalf_SOURCES}) -target_link_libraries(qhalf ${qhull_STATIC}) + add_executable(qvoronoi src/qvoronoi/qvoronoi.c) + target_link_libraries(qvoronoi ${qhull_STATIC}) -# --------------------------------------- -# Define options for linking to qhull_SHAREDR or qhull_SHARED -# --------------------------------------- -if(MSVC) - set(user_eg_DEFINES qh_dllimport) - set(user_eg2_DEFINES qh_dllimport) - set(user_eg3_DEFINES qh_dllimport) - set(user_egp_DEFINES qh_QHpointer_dllimport qh_QHpointer) - set(qhullp_DEFINES qh_QHpointer_dllimport qh_QHpointer) -else() - set(user_eg_DEFINES ) - set(user_eg2_DEFINES ) - set(user_eg3_DEFINES ) - set(user_egp_DEFINES ) - set(qhullp_DEFINES ) + add_executable(rbox src/rbox/rbox.c) + target_link_libraries(rbox ${qhull_STATIC}) endif() +# #@# 20 # --------------------------------------- -# Define testqset linked to qset.o and mem.o -# Define testqset_r linked to qset_r.o and mem_r.o +# Define testqset linked to qset.o, mem.o, and usermem.o +# Define testqset_r linked to qset_r.o, mem_r.o, and usermem.o # --------------------------------------- add_executable(testqset ${testqset_SOURCES}) @@ -523,57 +585,59 @@ # Define user_eg linked to reentrant qhull shared library # --------------------------------------- -set(user_eg_SOURCES src/user_eg/user_eg_r.c) +add_executable(user_eg src/user_eg/user_eg_r.c) -add_executable(user_eg ${user_eg_SOURCES}) -# user_eg may be linked to qhull_STATICR if user_eg_DEFINES is removed -target_link_libraries(user_eg ${qhull_SHAREDR}) -set_target_properties(user_eg PROPERTIES - COMPILE_DEFINITIONS "${user_eg_DEFINES}") +if(${BUILD_SHARED_LIBS}) + target_link_libraries(user_eg ${qhull_SHAREDR}) + set_target_properties(user_eg PROPERTIES + COMPILE_DEFINITIONS "${user_eg_DEFINES}") +else() + target_link_libraries(user_eg ${qhull_STATICR}) +endif() # --------------------------------------- # Define user_eg2 linked to reentrant qhull static library # --------------------------------------- -set(user_eg2_SOURCES src/user_eg2/user_eg2_r.c) +add_executable(user_eg2 src/user_eg2/user_eg2_r.c) -add_executable(user_eg2 ${user_eg2_SOURCES}) -# user_eg2 may be linked to qhull_SHAREDR if user_eg2_DEFINES is added -target_link_libraries(user_eg2 ${qhull_STATICR}) +if(${BUILD_STATIC_LIBS}) + target_link_libraries(user_eg2 ${qhull_STATICR}) +else() + target_link_libraries(user_eg2 ${qhull_SHAREDR}) + set_target_properties(user_eg2 PROPERTIES + COMPILE_DEFINITIONS "${user_eg2_DEFINES}") +endif() # --------------------------------------- -# Define user_eg3 linked to qhullstatic_r and qhullcpp static library +# Define user_eg3 linked to qhullcpp and qhullstatic_r static libraries # -# user_eg3 and qhullcpp must be compiled with the same compiler for setjmp/longjmp +# user_eg3 is not defined for shared libraries +# user_eg3 and qhullcpp must be compiled with the same compiler for setjmp/longjmp # --------------------------------------- -set(user_eg3_SOURCES src/user_eg3/user_eg3_r.cpp) - -add_executable(user_eg3 ${user_eg3_SOURCES}) -# qhull_STATICR must be last, otherwise qh_fprintf,etc. are not loaded from qhull_CPP -# user_eg3 may be linked to qhull_SHAREDR if user_eg3_DEFINES is added -target_link_libraries(user_eg3 ${qhull_CPP} ${qhull_STATICR}) +if(${BUILD_STATIC_LIBS}) + add_executable(user_eg3 src/user_eg3/user_eg3_r.cpp) + # qhull_STATICR must be last, otherwise qh_fprintf,etc. are not loaded from qhull_CPP + target_link_libraries(user_eg3 ${qhull_CPP} ${qhull_STATICR}) +endif() # --------------------------------------- -# qhullp is qhull/unix.c linked to deprecated qh_QHpointer libqhull_p +# qhullp is qhull/unix.c linked to unsuported qh_QHpointer libqhull_p # Included for testing qh_QHpointer # --------------------------------------- -set(qhullp_SOURCES src/qhull/unix.c) - -add_executable(qhullp EXCLUDE_FROM_ALL ${qhullp_SOURCES}) +add_executable(qhullp EXCLUDE_FROM_ALL src/qhull/unix.c) target_link_libraries(qhullp ${qhull_SHAREDP}) set_target_properties(qhullp PROPERTIES COMPILE_DEFINITIONS "${qhullp_DEFINES}") # --------------------------------------- -# user_egp is user_eg/user_eg.c linked to deprecated qh_QHpointer libqhull_p +# user_egp is user_eg/user_eg.c linked to unsuported qh_QHpointer libqhull_p # Included for compatibility with qhull-2012.1 # --------------------------------------- -set(user_egp_SOURCES src/user_eg/user_eg.c) - -add_executable(user_egp EXCLUDE_FROM_ALL ${user_egp_SOURCES}) +add_executable(user_egp EXCLUDE_FROM_ALL src/user_eg/user_eg.c) target_link_libraries(user_egp ${qhull_SHAREDP}) set_target_properties(user_egp PROPERTIES COMPILE_DEFINITIONS "${user_egp_DEFINES}") @@ -603,24 +667,96 @@ COMMAND sh -c "./user_eg") add_test(NAME user_eg2 COMMAND sh -c "./user_eg2") -add_test(NAME user_eg3 - COMMAND sh -c "./user_eg3 rbox '10 D2' '2 D2' qhull 's p' facets") + +if(${BUILD_STATIC_LIBS}) + add_test(NAME user_eg3 + COMMAND sh -c "./user_eg3 rbox '10 D2' '2 D2' qhull 's p' facets") +endif() # --------------------------------------- # Define install # --------------------------------------- -install(TARGETS ${qhull_TARGETS_INSTALL} +set(qhull_TARGETS_INSTALL ${qhull_TARGETS_APPLICATIONS}) +if (BUILD_SHARED_LIBS) + list(APPEND qhull_TARGETS_INSTALL ${qhull_TARGETS_SHARED}) +endif() +if (BUILD_STATIC_LIBS) + list(APPEND qhull_TARGETS_INSTALL ${qhull_TARGETS_STATIC}) +endif() + +install(TARGETS ${qhull_TARGETS_INSTALL} EXPORT QhullTargets RUNTIME DESTINATION ${BIN_INSTALL_DIR} LIBRARY DESTINATION ${LIB_INSTALL_DIR} - ARCHIVE DESTINATION ${LIB_INSTALL_DIR}) + ARCHIVE DESTINATION ${LIB_INSTALL_DIR} + INCLUDES DESTINATION include) + +include(CMakePackageConfigHelpers) + +write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/QhullExport/QhullConfigVersion.cmake" + VERSION ${qhull_VERSION} + COMPATIBILITY AnyNewerVersion +) + +export(EXPORT QhullTargets + FILE "${CMAKE_CURRENT_BINARY_DIR}/QhullExport/QhullTargets.cmake" + NAMESPACE Qhull:: +) + +configure_file(${PROJECT_SOURCE_DIR}/build/config.cmake.in + "${CMAKE_CURRENT_BINARY_DIR}/QhullExport/QhullConfig.cmake" + @ONLY +) + +set(ConfigPackageLocation lib/cmake/Qhull) +install(EXPORT QhullTargets + FILE + QhullTargets.cmake + NAMESPACE + Qhull:: + DESTINATION + ${ConfigPackageLocation} +) +install( + FILES + "${CMAKE_CURRENT_BINARY_DIR}/QhullExport/QhullConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/QhullExport/QhullConfigVersion.cmake" + DESTINATION + ${ConfigPackageLocation} + COMPONENT + Devel +) + +set(PkgConfigLocation lib/pkgconfig) +foreach(pkgconfig IN ITEMS "${qhull_SHAREDR};Qhull reentrant shared library" + "${qhull_STATIC};Qhull static library" + "${qhull_STATICR};Qhull reentrant static library" + "${qhull_CPP};Qhull C++ library") + list(GET pkgconfig 0 LIBRARY_NAME) + if(LIBRARY_NAME STREQUAL "libqhull") + set(LIBRARY_NAME "qhull") + endif() + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + string(REGEX REPLACE "_(.)$" "_\\1d" LIBRARY_NAME ${LIBRARY_NAME}) + string(REGEX REPLACE "([^d])$" "\\1_d" LIBRARY_NAME ${LIBRARY_NAME}) + endif() + list(GET pkgconfig 1 LIBRARY_DESCRIPTION) + configure_file(build/qhull.pc.in ${LIBRARY_NAME}.pc @ONLY) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME}.pc DESTINATION ${PkgConfigLocation} COMPONENT Devel) +endforeach() install(FILES ${libqhull_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/libqhull) -install(FILES ${libqhull_DOC} DESTINATION ${INCLUDE_INSTALL_DIR}/libqhull) +install(FILES src/libqhull/DEPRECATED.txt DESTINATION ${INCLUDE_INSTALL_DIR}/libqhull) install(FILES ${libqhullr_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/libqhull_r) -install(FILES ${libqhullr_DOC} DESTINATION ${INCLUDE_INSTALL_DIR}/libqhull_r) install(FILES ${libqhullcpp_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/libqhullcpp) install(FILES html/qhull.man DESTINATION ${MAN_INSTALL_DIR} RENAME qhull.1) install(FILES html/rbox.man DESTINATION ${MAN_INSTALL_DIR} RENAME rbox.1) install(FILES ${doc_FILES} DESTINATION ${DOC_INSTALL_DIR}) -install(DIRECTORY html/ DESTINATION ${DOC_INSTALL_DIR}) +install(DIRECTORY html/ DESTINATION ${DOC_INSTALL_DIR}/html) +install(FILES src/Changes.txt DESTINATION ${DOC_INSTALL_DIR}/src) + +add_custom_target(uninstall + COMMENT "uninstall Qhull by deleting files in install_manifest.txt" + COMMAND cat install_manifest.txt | tr -d \"\\r\" | xargs -r rm +) diff -Nru qhull-2015.2/CMakeModules/CheckLFS.cmake qhull-2020.2/CMakeModules/CheckLFS.cmake --- qhull-2015.2/CMakeModules/CheckLFS.cmake 2015-09-23 03:04:36.000000000 +0000 +++ qhull-2020.2/CMakeModules/CheckLFS.cmake 1970-01-01 00:00:00.000000000 +0000 @@ -1,109 +0,0 @@ -## Checks for large file support ## -include(CheckIncludeFile) -include(CheckSymbolExists) -include(CheckTypeSize) - -macro(check_lfs _isenable) - set(LFS_OFF_T "") - set(LFS_FOPEN "") - set(LFS_FSEEK "") - set(LFS_FTELL "") - set(LFS_PRID "") - - if(${_isenable}) - set(SAFE_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}") - set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} - -D_LARGEFILE_SOURCE -D_LARGE_FILES -D_FILE_OFFSET_BITS=64 - -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS) - - check_include_file("sys/types.h" HAVE_SYS_TYPES_H) - check_include_file("inttypes.h" HAVE_INTTYPES_H) - check_include_file("stddef.h" HAVE_STDDEF_H) - check_include_file("stdint.h" HAVE_STDINT_H) - - # LFS type1: 8 <= sizeof(off_t), fseeko, ftello - check_type_size("off_t" SIZEOF_OFF_T) - if(SIZEOF_OFF_T GREATER 7) - check_symbol_exists("fseeko" "stdio.h" HAVE_FSEEKO) - check_symbol_exists("ftello" "stdio.h" HAVE_FTELLO) - if(HAVE_FSEEKO AND HAVE_FTELLO) - set(LFS_OFF_T "off_t") - set(LFS_FOPEN "fopen") - set(LFS_FSEEK "fseeko") - set(LFS_FTELL "ftello") - check_symbol_exists("PRIdMAX" "inttypes.h" HAVE_PRIDMAX) - if(HAVE_PRIDMAX) - set(LFS_PRID "PRIdMAX") - else(HAVE_PRIDMAX) - check_type_size("long" SIZEOF_LONG) - check_type_size("int" SIZEOF_INT) - if(SIZEOF_OFF_T GREATER SIZEOF_LONG) - set(LFS_PRID "\"lld\"") - elseif(SIZEOF_LONG GREATER SIZEOF_INT) - set(LFS_PRID "\"ld\"") - else(SIZEOF_OFF_T GREATER SIZEOF_LONG) - set(LFS_PRID "\"d\"") - endif(SIZEOF_OFF_T GREATER SIZEOF_LONG) - endif(HAVE_PRIDMAX) - endif(HAVE_FSEEKO AND HAVE_FTELLO) - endif(SIZEOF_OFF_T GREATER 7) - - # LFS type2: 8 <= sizeof(off64_t), fopen64, fseeko64, ftello64 - if(NOT LFS_OFF_T) - check_type_size("off64_t" SIZEOF_OFF64_T) - if(SIZEOF_OFF64_T GREATER 7) - check_symbol_exists("fopen64" "stdio.h" HAVE_FOPEN64) - check_symbol_exists("fseeko64" "stdio.h" HAVE_FSEEKO64) - check_symbol_exists("ftello64" "stdio.h" HAVE_FTELLO64) - if(HAVE_FOPEN64 AND HAVE_FSEEKO64 AND HAVE_FTELLO64) - set(LFS_OFF_T "off64_t") - set(LFS_FOPEN "fopen64") - set(LFS_FSEEK "fseeko64") - set(LFS_FTELL "ftello64") - check_symbol_exists("PRIdMAX" "inttypes.h" HAVE_PRIDMAX) - if(HAVE_PRIDMAX) - set(LFS_PRID "PRIdMAX") - else(HAVE_PRIDMAX) - check_type_size("long" SIZEOF_LONG) - check_type_size("int" SIZEOF_INT) - if(SIZEOF_OFF64_T GREATER SIZEOF_LONG) - set(LFS_PRID "\"lld\"") - elseif(SIZEOF_LONG GREATER SIZEOF_INT) - set(LFS_PRID "\"ld\"") - else(SIZEOF_OFF64_T GREATER SIZEOF_LONG) - set(LFS_PRID "\"d\"") - endif(SIZEOF_OFF64_T GREATER SIZEOF_LONG) - endif(HAVE_PRIDMAX) - endif(HAVE_FOPEN64 AND HAVE_FSEEKO64 AND HAVE_FTELLO64) - endif(SIZEOF_OFF64_T GREATER 7) - endif(NOT LFS_OFF_T) - - # LFS type3: 8 <= sizeof(__int64), _fseeki64, _ftelli64 - if(NOT LFS_OFF_T) - check_type_size("__int64" SIZEOF___INT64) - if(SIZEOF___INT64 GREATER 7) - check_symbol_exists("_fseeki64" "stdio.h" HAVE__FSEEKI64) - check_symbol_exists("_ftelli64" "stdio.h" HAVE__FTELLI64) - if(HAVE__FSEEKI64 AND HAVE__FTELLI64) - set(LFS_OFF_T "__int64") - set(LFS_FOPEN "fopen") - set(LFS_FSEEK "_fseeki64") - set(LFS_FTELL "_ftelli64") - set(LFS_PRID "\"I64d\"") - endif(HAVE__FSEEKI64 AND HAVE__FTELLI64) - endif(SIZEOF___INT64 GREATER 7) - endif(NOT LFS_OFF_T) - - set(CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}") - endif(${_isenable}) - - if(NOT LFS_OFF_T) - ## not found - set(LFS_OFF_T "long") - set(LFS_FOPEN "fopen") - set(LFS_FSEEK "fseek") - set(LFS_FTELL "ftell") - set(LFS_PRID "\"ld\"") - endif(NOT LFS_OFF_T) - -endmacro(check_lfs) diff -Nru qhull-2015.2/COPYING.txt qhull-2020.2/COPYING.txt --- qhull-2015.2/COPYING.txt 2015-09-23 02:11:04.000000000 +0000 +++ qhull-2020.2/COPYING.txt 2020-05-22 02:27:32.000000000 +0000 @@ -1,4 +1,4 @@ - Qhull, Copyright (c) 1993-2015 + Qhull, Copyright (c) 1993-2020 C.B. Barber Arlington, MA @@ -13,9 +13,10 @@ email: qhull@qhull.org This software includes Qhull from C.B. Barber and The Geometry Center. -Qhull is copyrighted as noted above. Qhull is free software and may -be obtained via http from www.qhull.org. It may be freely copied, modified, -and redistributed under the following conditions: +Files derived from Qhull 1.0 are copyrighted by the Geometry Center. The +remaining files are copyrighted by C.B. Barber. Qhull is free software +and may be obtained via http from www.qhull.org. It may be freely copied, +modified, and redistributed under the following conditions: 1. All copyright notices must remain intact in all files. diff -Nru qhull-2015.2/debian/changelog qhull-2020.2/debian/changelog --- qhull-2015.2/debian/changelog 2017-12-09 18:18:30.000000000 +0000 +++ qhull-2020.2/debian/changelog 2022-09-21 01:41:56.000000000 +0000 @@ -1,3 +1,137 @@ +qhull (2020.2-4~18.04.sav0) bionic; urgency=medium + + * Backport to Bionic + * Revert "use some dh13 facilities" (d/rules: execute_* -> override_*) + * debian/control: Set debhelper-compat (= 11) BD + + -- Rob Savoury Tue, 20 Sep 2022 18:41:56 -0700 + +qhull (2020.2-4) unstable; urgency=medium + + * Recommend -dev package for the header symlinks (Closes: #988869) + + -- Timo Röhling Sun, 15 Aug 2021 21:49:17 +0200 + +qhull (2020.2-3) unstable; urgency=medium + + * New approach to filter libstdc++ symbols (should fix FTBFS on kfreebsd-*) + * Add myself as uploader + + -- Timo Röhling Thu, 26 Nov 2020 23:59:26 +0100 + +qhull (2020.2-2) unstable; urgency=medium + + * Team upload. + + [ Jochen Sprickerhof ] + * Drop ldconfig (not needed) + + [ Timo Röhling ] + * Fix d/watch + * Add new autopkgtest that verifies functionality + + -- Timo Röhling Thu, 12 Nov 2020 19:01:23 +0100 + +qhull (2020.2-1) unstable; urgency=medium + + * Team upload. + + [ Barak A. Pearlmutter ] + * uscan version 4 + + [ Timo Röhling ] + * Rewrite manual pages in groff and update links + * Mark autopkgtest as superficial + * New upstream version 2020.2 + * Add warning to README.Debian that the non-reentrant libqhull + is likely to be discontinued after the 8.0.x releases. + + -- Timo Röhling Wed, 11 Nov 2020 15:10:39 +0100 + +qhull (2020.1-2) unstable; urgency=medium + + * Team upload. + * Transition to unstable. + + [ Timo Röhling ] + * Bump to debhelper compat 13. + * Debianize test failure message for libqhull_r + * Disable RPATH completely to make build reproducible + * Link qhull binaries against shared library + + [ Barak A. Pearlmutter ] + * update maintainer email + * use some dh13 facilities + + -- Timo Röhling Fri, 19 Jun 2020 10:10:14 +0200 + +qhull (2020.1-1) experimental; urgency=medium + + * Team upload. + * New upstream release. + * New upstream SOVERSION 8.0 + + -- Timo Röhling Sat, 06 Jun 2020 15:58:21 +0200 + +qhull (2019.1-5) unstable; urgency=medium + + * Team upload. + * Transition to unstable. + + -- Timo Röhling Wed, 29 Apr 2020 10:15:52 +0200 + +qhull (2019.1-4) experimental; urgency=medium + + * Team upload. + * Import upstream patch for pkg-config support + * Add autopkgtest compile and link test + * Fix issues with local documentation + + -- Timo Röhling Mon, 20 Apr 2020 16:11:23 +0200 + +qhull (2019.1-3) experimental; urgency=medium + + * Team upload. + * Fix arch-indep build + * Disable RPATH at build time + + -- Timo Röhling Fri, 10 Apr 2020 19:03:03 +0200 + +qhull (2019.1-2) experimental; urgency=medium + + * Team upload. + * Use correct CMake build path for tests + * Mark exported C++ STL symbols as optional + * Build with LFS support + + -- Timo Röhling Fri, 10 Apr 2020 13:50:23 +0200 + +qhull (2019.1-1) experimental; urgency=medium + + [ Barak A. Pearlmutter ] + * Strip unusual field spacing from debian/control. + * Bump debhelper from old 11 to 12. + * New upstream version + * Track minor upstream fix commits + * Bump standards version + * Set upstream metadata fields: Bug-Database, Bug-Submit, Repository, + Repository-Browse. + + [ Timo Röhling ] + * Turn post-release upstream fixes into proper patches + * Ship qhullcpp as shared library (Closes: #925540) + * Add R-R-R to debian/control + * Fix unit tests and honor DEB_BUILD_OPTIONS + * Fix reproducibility issue with assert() macros + * Install all documentation to the recommended place + * Fix privacy breach + * Bump SONAME because of ABI breakage + * Make copyright DEP5 conforming + * Add .symbols files for all shared libraries + * Properly export CMake targets + + -- Barak A. Pearlmutter Tue, 07 Apr 2020 23:02:09 +0100 + qhull (2015.2-4) unstable; urgency=medium * Team upload. diff -Nru qhull-2015.2/debian/clean qhull-2020.2/debian/clean --- qhull-2015.2/debian/clean 2017-12-09 18:17:01.000000000 +0000 +++ qhull-2020.2/debian/clean 2020-11-11 14:07:30.000000000 +0000 @@ -1 +1 @@ -debian/*.xml debian/*.1 +debian/*.1 r.x x.x diff -Nru qhull-2015.2/debian/compat qhull-2020.2/debian/compat --- qhull-2015.2/debian/compat 2017-12-09 18:17:01.000000000 +0000 +++ qhull-2020.2/debian/compat 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -10 diff -Nru qhull-2015.2/debian/control qhull-2020.2/debian/control --- qhull-2015.2/debian/control 2017-12-09 18:17:40.000000000 +0000 +++ qhull-2020.2/debian/control 2022-09-21 01:41:56.000000000 +0000 @@ -1,19 +1,17 @@ Source: qhull Section: math Priority: optional -Maintainer: Debian Science Maintainers -Uploaders: Barak A. Pearlmutter -Standards-Version: 4.1.1 -Build-Depends: debhelper (>= 10), - dh-exec (>= 0.3), - cmake, - chrpath, - docbook2x (>= 0.8.8-3), xsltproc, docbook-xml +Maintainer: Debian Science Maintainers +Uploaders: Barak A. Pearlmutter , Timo Röhling +Standards-Version: 4.5.0 +Build-Depends: debhelper-compat (= 11), + cmake, pkg-kde-tools Homepage: https://www.qhull.org -Vcs-Git: https://anonscm.debian.org/git/debian-science/packages/qhull.git -Vcs-Browser: https://anonscm.debian.org/gitweb/?p=debian-science/packages/qhull.git +Rules-Requires-Root: no +Vcs-Git: https://salsa.debian.org/science-team/qhull.git +Vcs-Browser: https://salsa.debian.org/science-team/qhull -Package: libqhull7 +Package: libqhull8.0 Section: libs Architecture: any Multi-Arch: same @@ -27,7 +25,7 @@ . This package contains the shared C library. -Package: libqhull-r7 +Package: libqhull-r8.0 Section: libs Architecture: any Multi-Arch: same @@ -41,12 +39,27 @@ . This package contains the reentrant version of the shared C library. +Package: libqhullcpp8.0 +Section: libs +Architecture: any +Multi-Arch: same +Pre-Depends: ${misc:Pre-Depends} +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: calculate convex hulls and related structures (C++ shared library) + Qhull computes convex hulls, Delaunay triangulations, halfspace + intersections about a point, Voronoi diagrams, furthest-site + Delaunay triangulations, and furthest-site Voronoi diagrams. It + runs in 2-d, 3-d, 4-d, and higher dimensions. + . + This package contains the shared C++ library. + Package: libqhull-dev Section: libdevel Architecture: any Multi-Arch: same Pre-Depends: ${misc:Pre-Depends} -Depends: libqhull7 (= ${binary:Version}), libqhull-r7 (= ${binary:Version}), ${misc:Depends} +Depends: libqhull8.0 (= ${binary:Version}), libqhull-r8.0 (= ${binary:Version}), + libqhullcpp8.0 (=${binary:Version}), ${misc:Depends} Description: calculate convex hulls and related structures (development files) Qhull computes convex hulls, Delaunay triangulations, halfspace intersections about a point, Voronoi diagrams, furthest-site @@ -59,7 +72,9 @@ Package: libqhull-doc Section: doc Architecture: all +Multi-Arch: foreign Depends: ${misc:Depends} +Recommends: libqhull-dev (= ${binary:Version}) Description: calculate convex hulls and related structures (documentation files) Qhull computes convex hulls, Delaunay triangulations, halfspace intersections about a point, Voronoi diagrams, furthest-site @@ -70,7 +85,7 @@ Package: qhull-bin Architecture: any -Depends: libqhull7 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Depends: ${shlibs:Depends}, ${misc:Depends} Suggests: geomview Description: calculate convex hulls and related structures (utilities) Qhull computes convex hulls, Delaunay triangulations, halfspace diff -Nru qhull-2015.2/debian/copyright qhull-2020.2/debian/copyright --- qhull-2015.2/debian/copyright 2017-12-09 18:17:01.000000000 +0000 +++ qhull-2020.2/debian/copyright 2020-11-11 14:13:32.000000000 +0000 @@ -1,60 +1,52 @@ -This package was debianized by Rafael Laboissiere on -Mon Mar 1 00:28:18 CET 2004 - -It was downloaded from: - - http://www.qhull.org/download/qhull-2003.1.tar.gz - Current upstream repository is git://github.com/qhull/qhull.git - -Upstream Authors: - - C. Bradford Barber - Hannu Huhdanpaa - - c/o The Geometry Center - University of Minnesota - 400 Lind Hall - 207 Church Street S.E. - Minneapolis, MN 55455 - -Copyright: - - The formal license is in the source file COPYING.txt - - Qhull, Copyright (c) 1993-2003 - - The National Science and Technology Research Center for - Computation and Visualization of Geometric Structures - (The Geometry Center) - University of Minnesota - - email: qhull@qhull.org - -This software includes Qhull from The Geometry Center. Qhull is -copyrighted as noted above. Qhull is free software and may be obtained -via http from www.qhull.org. It may be freely copied, modified, -and redistributed under the following conditions: - -1. All copyright notices must remain intact in all files. - -2. A copy of this text file must be distributed along with any copies - of Qhull that you redistribute; this includes copies that you have - modified, or copies of programs or other software products that - include Qhull. - -3. If you modify Qhull, you must include a notice giving the - name of the person performing the modification, the date of - modification, and the reason for such modification. - -4. When distributing modified versions of Qhull, or other software - products that include Qhull, you must provide notice that the original - source code may be obtained as noted above. - -5. There is no warranty or other guarantee of fitness for Qhull, it is - provided solely "as is". Bug reports or fixes may be sent to - qhull_bug@qhull.org; the authors may or may not act on them as - they desire. - -The Debian packaging files are released under the terms of the GNU -General Public License, version 3 or later. The complete text of the -GNU GPL v3, can be found in the file /usr/share/common-licenses/GPL-3. +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: Qhull +Upstream-Contact: qhull@qhull.org +Source: https://github.com/qhull/qhull + +Files: * +Copyright: 1993-2020, C.B. Barber + 1993-2020, The National Science and Technology Research Center for + Computation and Visualization of Geometric Structures + (The Geometry Center) + University of Minnesota +License: Qhull + +Files: debian/* +Copyright: 2003-2009, Rafael Laboissiere + 2003-2019, Barak A. Pearlmutter + 2020, Timo Röhling +License: GPL-3+ + +License: Qhull + Qhull is free software and may be obtained via http from www.qhull.org. It + may be freely copied, modified, and redistributed under the following + conditions: + 1. All copyright notices must remain intact in all files. + 2. A copy of COPYING.txt must be distributed along with any copies + of Qhull that you redistribute; this includes copies that you have + modified, or copies of programs or other software products that + include Qhull. + 3. If you modify Qhull, you must include a notice giving the + name of the person performing the modification, the date of + modification, and the reason for such modification. + 4. When distributing modified versions of Qhull, or other software + products that include Qhull, you must provide notice that the original + source code may be obtained as noted above. + 5. There is no warranty or other guarantee of fitness for Qhull, it is + provided solely "as is". Bug reports or fixes may be sent to + qhull_bug@qhull.org; the authors may or may not act on them as + they desire. + +License: GPL-3+ + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + The complete text of the license can be found in the file + /usr/share/common-licenses/GPL-3 diff -Nru qhull-2015.2/debian/gbp.conf qhull-2020.2/debian/gbp.conf --- qhull-2015.2/debian/gbp.conf 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/debian/gbp.conf 2020-11-11 14:07:30.000000000 +0000 @@ -0,0 +1,6 @@ +# Configuration file for git-buildpackage and friends + +[DEFAULT] +pristine-tar = True +sign-tags = True +debian-branch = debian diff -Nru qhull-2015.2/debian/gitlab-ci.yml qhull-2020.2/debian/gitlab-ci.yml --- qhull-2015.2/debian/gitlab-ci.yml 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/debian/gitlab-ci.yml 2020-11-11 14:07:30.000000000 +0000 @@ -0,0 +1,3 @@ +include: + - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml + - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml diff -Nru qhull-2015.2/debian/libqhull7.install qhull-2020.2/debian/libqhull7.install --- qhull-2015.2/debian/libqhull7.install 2017-12-09 18:17:01.000000000 +0000 +++ qhull-2020.2/debian/libqhull7.install 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -#! /usr/bin/dh-exec -usr/lib/libqhull.so.* /usr/lib/${DEB_HOST_MULTIARCH}/ diff -Nru qhull-2015.2/debian/libqhull8.0.install qhull-2020.2/debian/libqhull8.0.install --- qhull-2015.2/debian/libqhull8.0.install 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/debian/libqhull8.0.install 2020-11-11 14:07:30.000000000 +0000 @@ -0,0 +1 @@ +usr/lib/*/libqhull.so.* diff -Nru qhull-2015.2/debian/libqhull8.0.symbols qhull-2020.2/debian/libqhull8.0.symbols --- qhull-2015.2/debian/libqhull8.0.symbols 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/debian/libqhull8.0.symbols 2020-11-11 14:07:30.000000000 +0000 @@ -0,0 +1,452 @@ +# SymbolsHelper-Confirmed: 2020.1 amd64 +libqhull.so.8.0 libqhull8.0 #MINVER# +* Build-Depends-Package: libqhull-dev + mergetypes@Base 2020.1 + qh_addfacetvertex@Base 2020.1 + qh_addhash@Base 2020.1 + qh_addpoint@Base 2020.1 + qh_all_merges@Base 2020.1 + qh_all_vertexmerges@Base 2020.1 + qh_allstatA@Base 2020.1 + qh_allstatB@Base 2020.1 + qh_allstatC@Base 2020.1 + qh_allstatD@Base 2020.1 + qh_allstatE2@Base 2020.1 + qh_allstatE@Base 2020.1 + qh_allstatF@Base 2020.1 + qh_allstatG@Base 2020.1 + qh_allstatH@Base 2020.1 + qh_allstatI@Base 2020.1 + qh_allstatistics@Base 2020.1 + qh_appendfacet@Base 2020.1 + qh_appendmergeset@Base 2020.1 + qh_appendprint@Base 2020.1 + qh_appendvertex@Base 2020.1 + qh_appendvertexmerge@Base 2020.1 + qh_argv_to_command@Base 2020.1 + qh_argv_to_command_size@Base 2020.1 + qh_attachnewfacets@Base 2020.1 + qh_backnormal@Base 2020.1 + qh_basevertices@Base 2020.1 + qh_build_withrestart@Base 2020.1 + qh_buildcone@Base 2020.1 + qh_buildcone_mergepinched@Base 2020.1 + qh_buildcone_onlygood@Base 2020.1 + qh_buildhull@Base 2020.1 + qh_buildtracing@Base 2020.1 + qh_check_bestdist@Base 2020.1 + qh_check_dupridge@Base 2020.1 + qh_check_maxout@Base 2020.1 + qh_check_output@Base 2020.1 + qh_check_point@Base 2020.1 + qh_check_points@Base 2020.1 + qh_checkconnect@Base 2020.1 + qh_checkconvex@Base 2020.1 + qh_checkdelfacet@Base 2020.1 + qh_checkdelridge@Base 2020.1 + qh_checkfacet@Base 2020.1 + qh_checkflags@Base 2020.1 + qh_checkflipped@Base 2020.1 + qh_checkflipped_all@Base 2020.1 + qh_checklists@Base 2020.1 + qh_checkpolygon@Base 2020.1 + qh_checkvertex@Base 2020.1 + qh_checkzero@Base 2020.1 + qh_clear_outputflags@Base 2020.1 + qh_clearcenters@Base 2020.1 + qh_clock@Base 2020.1 + qh_collectstatistics@Base 2020.1 + qh_compare_anglemerge@Base 2020.1 + qh_compare_facetarea@Base 2020.1 + qh_compare_facetmerge@Base 2020.1 + qh_compare_facetvisit@Base 2020.1 + qh_compare_nummerge@Base 2020.1 + qh_comparevisit@Base 2020.1 + qh_copyfilename@Base 2020.1 + qh_copynonconvex@Base 2020.1 + qh_copypoints@Base 2020.1 + qh_countfacets@Base 2020.1 + qh_createsimplex@Base 2020.1 + qh_crossproduct@Base 2020.1 + qh_degen_redundant_facet@Base 2020.1 + qh_deletevisible@Base 2020.1 + qh_delfacet@Base 2020.1 + qh_delridge@Base 2020.1 + qh_delridge_merge@Base 2020.1 + qh_delvertex@Base 2020.1 + qh_determinant@Base 2020.1 + qh_detjoggle@Base 2020.1 + qh_detmaxoutside@Base 2020.1 + qh_detroundoff@Base 2020.1 + qh_detsimplex@Base 2020.1 + qh_detvnorm@Base 2020.1 + qh_detvridge3@Base 2020.1 + qh_detvridge@Base 2020.1 + qh_dfacet@Base 2020.1 + qh_distnorm@Base 2020.1 + qh_distplane@Base 2020.1 + qh_distround@Base 2020.1 + qh_divzero@Base 2020.1 + qh_drop_mergevertex@Base 2020.1 + qh_dvertex@Base 2020.1 + qh_eachvoronoi@Base 2020.1 + qh_eachvoronoi_all@Base 2020.1 + qh_errexit2@Base 2020.1 + qh_errexit@Base 2020.1 + qh_errexit_rbox@Base 2020.1 + qh_errprint@Base 2020.1 + qh_exit@Base 2020.1 + qh_facet2point@Base 2020.1 + qh_facet3vertex@Base 2020.1 + qh_facetarea@Base 2020.1 + qh_facetarea_simplex@Base 2020.1 + qh_facetcenter@Base 2020.1 + qh_facetintersect@Base 2020.1 + qh_facetvertices@Base 2020.1 + qh_find_newvertex@Base 2020.1 + qh_findbest@Base 2020.1 + qh_findbest_pinchedvertex@Base 2020.1 + qh_findbest_ridgevertex@Base 2020.1 + qh_findbest_test@Base 2020.1 + qh_findbestfacet@Base 2020.1 + qh_findbesthorizon@Base 2020.1 + qh_findbestlower@Base 2020.1 + qh_findbestneighbor@Base 2020.1 + qh_findbestnew@Base 2020.1 + qh_findfacet_all@Base 2020.1 + qh_findgood@Base 2020.1 + qh_findgood_all@Base 2020.1 + qh_findgooddist@Base 2020.1 + qh_findhorizon@Base 2020.1 + qh_flippedmerges@Base 2020.1 + qh_forcedmerges@Base 2020.1 + qh_fprintf@Base 2020.1 + qh_fprintf_rbox@Base 2020.1 + qh_fprintf_stderr@Base 2020.1 + qh_free@Base 2020.1 + qh_freebuffers@Base 2020.1 + qh_freebuild@Base 2020.1 + qh_freemergesets@Base 2020.1 + qh_freeqhull2@Base 2020.1 + qh_freeqhull@Base 2020.1 + qh_freestatistics@Base 2020.1 + qh_furthestnewvertex@Base 2020.1 + qh_furthestnext@Base 2020.1 + qh_furthestout@Base 2020.1 + qh_furthestvertex@Base 2020.1 + qh_gausselim@Base 2020.1 + qh_geomplanes@Base 2020.1 + qh_getangle@Base 2020.1 + qh_getarea@Base 2020.1 + qh_getcenter@Base 2020.1 + qh_getcentrum@Base 2020.1 + qh_getdistance@Base 2020.1 + qh_gethash@Base 2020.1 + qh_getmergeset@Base 2020.1 + qh_getmergeset_initial@Base 2020.1 + qh_getpinchedmerges@Base 2020.1 + qh_getreplacement@Base 2020.1 + qh_gram_schmidt@Base 2020.1 + qh_hashridge@Base 2020.1 + qh_hashridge_find@Base 2020.1 + qh_hasmerge@Base 2020.1 + qh_infiniteloop@Base 2020.1 + qh_init_A@Base 2020.1 + qh_init_B@Base 2020.1 + qh_init_qhull_command@Base 2020.1 + qh_initbuild@Base 2020.1 + qh_initflags@Base 2020.1 + qh_initialhull@Base 2020.1 + qh_initialvertices@Base 2020.1 + qh_initmergesets@Base 2020.1 + qh_initqhull_buffers@Base 2020.1 + qh_initqhull_globals@Base 2020.1 + qh_initqhull_mem@Base 2020.1 + qh_initqhull_outputflags@Base 2020.1 + qh_initqhull_start2@Base 2020.1 + qh_initqhull_start@Base 2020.1 + qh_initstatistics@Base 2020.1 + qh_initthresholds@Base 2020.1 + qh_inthresholds@Base 2020.1 + qh_isvertex@Base 2020.1 + qh_joggle_restart@Base 2020.1 + qh_joggleinput@Base 2020.1 + qh_last_random@Base 2020.1 + qh_lib_check@Base 2020.1 + qh_makenew_nonsimplicial@Base 2020.1 + qh_makenew_simplicial@Base 2020.1 + qh_makenewfacet@Base 2020.1 + qh_makenewfacets@Base 2020.1 + qh_makenewplanes@Base 2020.1 + qh_makeridges@Base 2020.1 + qh_malloc@Base 2020.1 + qh_mark_dupridges@Base 2020.1 + qh_markkeep@Base 2020.1 + qh_markvoronoi@Base 2020.1 + qh_matchdupridge@Base 2020.1 + qh_matchneighbor@Base 2020.1 + qh_matchnewfacets@Base 2020.1 + qh_matchvertices@Base 2020.1 + qh_maxabsval@Base 2020.1 + qh_maxmin@Base 2020.1 + qh_maxouter@Base 2020.1 + qh_maxsimplex@Base 2020.1 + qh_maybe_duplicateridge@Base 2020.1 + qh_maybe_duplicateridges@Base 2020.1 + qh_maydropneighbor@Base 2020.1 + qh_memalloc@Base 2020.1 + qh_memcheck@Base 2020.1 + qh_memfree@Base 2020.1 + qh_memfreeshort@Base 2020.1 + qh_meminit@Base 2020.1 + qh_meminitbuffers@Base 2020.1 + qh_memsetup@Base 2020.1 + qh_memsize@Base 2020.1 + qh_memstatistics@Base 2020.1 + qh_memtotal@Base 2020.1 + qh_merge_degenredundant@Base 2020.1 + qh_merge_nonconvex@Base 2020.1 + qh_merge_pinchedvertices@Base 2020.1 + qh_merge_twisted@Base 2020.1 + qh_mergecycle@Base 2020.1 + qh_mergecycle_all@Base 2020.1 + qh_mergecycle_facets@Base 2020.1 + qh_mergecycle_neighbors@Base 2020.1 + qh_mergecycle_ridges@Base 2020.1 + qh_mergecycle_vneighbors@Base 2020.1 + qh_mergefacet2d@Base 2020.1 + qh_mergefacet@Base 2020.1 + qh_mergeneighbors@Base 2020.1 + qh_mergeridges@Base 2020.1 + qh_mergesimplex@Base 2020.1 + qh_mergevertex_del@Base 2020.1 + qh_mergevertex_neighbors@Base 2020.1 + qh_mergevertices@Base 2020.1 + qh_minabsval@Base 2020.1 + qh_mindiff@Base 2020.1 + qh_nearcoplanar@Base 2020.1 + qh_nearvertex@Base 2020.1 + qh_neighbor_intersections@Base 2020.1 + qh_neighbor_vertices@Base 2020.1 + qh_neighbor_vertices_facet@Base 2020.1 + qh_new_qhull@Base 2020.1 + qh_newfacet@Base 2020.1 + qh_newhashtable@Base 2020.1 + qh_newridge@Base 2020.1 + qh_newstats@Base 2020.1 + qh_newvertex@Base 2020.1 + qh_newvertices@Base 2020.1 + qh_next_vertexmerge@Base 2020.1 + qh_nextfacet2d@Base 2020.1 + qh_nextfurthest@Base 2020.1 + qh_nextridge3d@Base 2020.1 + qh_normalize2@Base 2020.1 + qh_normalize@Base 2020.1 + qh_nostatistic@Base 2020.1 + qh_opposite_horizonfacet@Base 2020.1 + qh_opposite_vertex@Base 2020.1 + qh_option@Base 2020.1 + qh_order_vertexneighbors@Base 2020.1 + qh_orientoutside@Base 2020.1 + qh_out1@Base 2020.1 + qh_out2n@Base 2020.1 + qh_out3n@Base 2020.1 + qh_outcoincident@Base 2020.1 + qh_outcoord@Base 2020.1 + qh_outcoplanar@Base 2020.1 + qh_outerinner@Base 2020.1 + qh_partitionall@Base 2020.1 + qh_partitioncoplanar@Base 2020.1 + qh_partitionpoint@Base 2020.1 + qh_partitionvisible@Base 2020.1 + qh_point@Base 2020.1 + qh_point_add@Base 2020.1 + qh_pointdist@Base 2020.1 + qh_pointfacet@Base 2020.1 + qh_pointid@Base 2020.1 + qh_pointvertex@Base 2020.1 + qh_postmerge@Base 2020.1 + qh_premerge@Base 2020.1 + qh_prepare_output@Base 2020.1 + qh_prependfacet@Base 2020.1 + qh_printafacet@Base 2020.1 + qh_printallstatistics@Base 2020.1 + qh_printbegin@Base 2020.1 + qh_printcenter@Base 2020.1 + qh_printcentrum@Base 2020.1 + qh_printend4geom@Base 2020.1 + qh_printend@Base 2020.1 + qh_printextremes@Base 2020.1 + qh_printextremes_2d@Base 2020.1 + qh_printextremes_d@Base 2020.1 + qh_printfacet2geom@Base 2020.1 + qh_printfacet2geom_points@Base 2020.1 + qh_printfacet2math@Base 2020.1 + qh_printfacet3geom_nonsimplicial@Base 2020.1 + qh_printfacet3geom_points@Base 2020.1 + qh_printfacet3geom_simplicial@Base 2020.1 + qh_printfacet3math@Base 2020.1 + qh_printfacet3vertex@Base 2020.1 + qh_printfacet4geom_nonsimplicial@Base 2020.1 + qh_printfacet4geom_simplicial@Base 2020.1 + qh_printfacet@Base 2020.1 + qh_printfacetNvertex_nonsimplicial@Base 2020.1 + qh_printfacetNvertex_simplicial@Base 2020.1 + qh_printfacetheader@Base 2020.1 + qh_printfacetlist@Base 2020.1 + qh_printfacetridges@Base 2020.1 + qh_printfacets@Base 2020.1 + qh_printhashtable@Base 2020.1 + qh_printhelp_degenerate@Base 2020.1 + qh_printhelp_internal@Base 2020.1 + qh_printhelp_narrowhull@Base 2020.1 + qh_printhelp_singular@Base 2020.1 + qh_printhelp_topology@Base 2020.1 + qh_printhelp_wide@Base 2020.1 + qh_printhyperplaneintersection@Base 2020.1 + qh_printline3geom@Base 2020.1 + qh_printlists@Base 2020.1 + qh_printmatrix@Base 2020.1 + qh_printneighborhood@Base 2020.1 + qh_printpoint3@Base 2020.1 + qh_printpoint@Base 2020.1 + qh_printpointid@Base 2020.1 + qh_printpoints@Base 2020.1 + qh_printpoints_out@Base 2020.1 + qh_printpointvect2@Base 2020.1 + qh_printpointvect@Base 2020.1 + qh_printridge@Base 2020.1 + qh_printspheres@Base 2020.1 + qh_printstatistics@Base 2020.1 + qh_printstatlevel@Base 2020.1 + qh_printstats@Base 2020.1 + qh_printsummary@Base 2020.1 + qh_printvdiagram2@Base 2020.1 + qh_printvdiagram@Base 2020.1 + qh_printvertex@Base 2020.1 + qh_printvertexlist@Base 2020.1 + qh_printvertices@Base 2020.1 + qh_printvneighbors@Base 2020.1 + qh_printvnorm@Base 2020.1 + qh_printvoronoi@Base 2020.1 + qh_printvridge@Base 2020.1 + qh_produce_output2@Base 2020.1 + qh_produce_output@Base 2020.1 + qh_projectdim3@Base 2020.1 + qh_projectinput@Base 2020.1 + qh_projectpoint@Base 2020.1 + qh_projectpoints@Base 2020.1 + qh_qh@Base 2020.1 + qh_qhstat@Base 2020.1 + qh_qhull@Base 2020.1 + qh_rand@Base 2020.1 + qh_randomfactor@Base 2020.1 + qh_randommatrix@Base 2020.1 + qh_rboxpoints2@Base 2020.1 + qh_rboxpoints@Base 2020.1 + qh_readfeasible@Base 2020.1 + qh_readpoints@Base 2020.1 + qh_reducevertices@Base 2020.1 + qh_redundant_vertex@Base 2020.1 + qh_remove_extravertices@Base 2020.1 + qh_remove_mergetype@Base 2020.1 + qh_removefacet@Base 2020.1 + qh_removevertex@Base 2020.1 + qh_rename_adjacentvertex@Base 2020.1 + qh_rename_sharedvertex@Base 2020.1 + qh_renameridgevertex@Base 2020.1 + qh_renamevertex@Base 2020.1 + qh_replacefacetvertex@Base 2020.1 + qh_resetlists@Base 2020.1 + qh_rotateinput@Base 2020.1 + qh_rotatepoints@Base 2020.1 + qh_roundi@Base 2020.1 + qh_scaleinput@Base 2020.1 + qh_scalelast@Base 2020.1 + qh_scalepoints@Base 2020.1 + qh_setaddnth@Base 2020.1 + qh_setaddsorted@Base 2020.1 + qh_setappend2ndlast@Base 2020.1 + qh_setappend@Base 2020.1 + qh_setappend_set@Base 2020.1 + qh_setcheck@Base 2020.1 + qh_setcompact@Base 2020.1 + qh_setcopy@Base 2020.1 + qh_setdel@Base 2020.1 + qh_setdelaunay@Base 2020.1 + qh_setdellast@Base 2020.1 + qh_setdelnth@Base 2020.1 + qh_setdelnthsorted@Base 2020.1 + qh_setdelsorted@Base 2020.1 + qh_setduplicate@Base 2020.1 + qh_setendpointer@Base 2020.1 + qh_setequal@Base 2020.1 + qh_setequal_except@Base 2020.1 + qh_setequal_skip@Base 2020.1 + qh_setfacetplane@Base 2020.1 + qh_setfeasible@Base 2020.1 + qh_setfree2@Base 2020.1 + qh_setfree@Base 2020.1 + qh_setfreelong@Base 2020.1 + qh_sethalfspace@Base 2020.1 + qh_sethalfspace_all@Base 2020.1 + qh_sethyperplane_det@Base 2020.1 + qh_sethyperplane_gauss@Base 2020.1 + qh_setin@Base 2020.1 + qh_setindex@Base 2020.1 + qh_setlarger@Base 2020.1 + qh_setlarger_quick@Base 2020.1 + qh_setlast@Base 2020.1 + qh_setnew@Base 2020.1 + qh_setnew_delnthsorted@Base 2020.1 + qh_setprint@Base 2020.1 + qh_setreplace@Base 2020.1 + qh_setsize@Base 2020.1 + qh_settemp@Base 2020.1 + qh_settempfree@Base 2020.1 + qh_settempfree_all@Base 2020.1 + qh_settemppop@Base 2020.1 + qh_settemppush@Base 2020.1 + qh_settruncate@Base 2020.1 + qh_setunique@Base 2020.1 + qh_setvoronoi_all@Base 2020.1 + qh_setzero@Base 2020.1 + qh_sharpnewfacets@Base 2020.1 + qh_skipfacet@Base 2020.1 + qh_skipfilename@Base 2020.1 + qh_srand@Base 2020.1 + qh_stddev@Base 2020.1 + qh_strtod@Base 2020.1 + qh_strtol@Base 2020.1 + qh_test_appendmerge@Base 2020.1 + qh_test_centrum_merge@Base 2020.1 + qh_test_degen_neighbors@Base 2020.1 + qh_test_nonsimplicial_merge@Base 2020.1 + qh_test_redundant_neighbors@Base 2020.1 + qh_test_vneighbors@Base 2020.1 + qh_tracemerge@Base 2020.1 + qh_tracemerging@Base 2020.1 + qh_triangulate@Base 2020.1 + qh_triangulate_facet@Base 2020.1 + qh_triangulate_link@Base 2020.1 + qh_triangulate_mirror@Base 2020.1 + qh_triangulate_null@Base 2020.1 + qh_update_vertexneighbors@Base 2020.1 + qh_update_vertexneighbors_cone@Base 2020.1 + qh_updatetested@Base 2020.1 + qh_user_memsizes@Base 2020.1 + qh_version2@Base 2020.1 + qh_version@Base 2020.1 + qh_vertex_bestdist2@Base 2020.1 + qh_vertex_bestdist@Base 2020.1 + qh_vertexintersect@Base 2020.1 + qh_vertexintersect_new@Base 2020.1 + qh_vertexneighbors@Base 2020.1 + qh_vertexridges@Base 2020.1 + qh_vertexridges_facet@Base 2020.1 + qh_vertexsubset@Base 2020.1 + qh_voronoi_center@Base 2020.1 + qh_willdelete@Base 2020.1 + qhmem@Base 2020.1 + rbox@Base 2020.1 + rbox_inuse@Base 2020.1 diff -Nru qhull-2015.2/debian/libqhullcpp8.0.install qhull-2020.2/debian/libqhullcpp8.0.install --- qhull-2015.2/debian/libqhullcpp8.0.install 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/debian/libqhullcpp8.0.install 2020-11-11 14:07:30.000000000 +0000 @@ -0,0 +1 @@ +usr/lib/*/libqhullcpp.so.* diff -Nru qhull-2015.2/debian/libqhullcpp8.0.symbols qhull-2020.2/debian/libqhullcpp8.0.symbols --- qhull-2015.2/debian/libqhullcpp8.0.symbols 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/debian/libqhullcpp8.0.symbols 2020-11-27 20:44:58.000000000 +0000 @@ -0,0 +1,295 @@ +# SymbolsHelper-Confirmed: 2020.2 amd64 arm64 armel armhf i386 mips64el mipsel ppc64el s390x alpha hppa hurd-i386 ia64 m68k powerpc ppc64 riscv64 sh4 sparc64 x32 +libqhullcpp.so.8.0 libqhullcpp8.0 #MINVER# +* Build-Depends-Package: libqhull-dev + (optional=libstdc++|regex)"^_Z(Z|GTt|GV|TI|TS|TT|TV|Thn?\d+_|Tvn?\d+_n?\d+_)?N?r?V?K?[RO]?S[abdiost]" 0~unused + _ZN8orgQhull10QhullErrorD0Ev@Base 2020.1 + _ZN8orgQhull10QhullErrorD1Ev@Base 2020.1 + _ZN8orgQhull10QhullErrorD2Ev@Base 2020.1 + _ZN8orgQhull10QhullFacet13s_empty_facetE@Base 2020.1 + _ZN8orgQhull10QhullFacet13voronoiVertexEv@Base 2020.1 + _ZN8orgQhull10QhullFacet9facetAreaEv@Base 2020.1 + _ZN8orgQhull10QhullFacet9getCenterE8qh_PRINT@Base 2020.1 + _ZN8orgQhull10QhullFacetC1ERKNS_5QhullE@Base 2020.1 + _ZN8orgQhull10QhullFacetC1ERKNS_5QhullEP6facetT@Base 2020.1 + _ZN8orgQhull10QhullFacetC2ERKNS_5QhullE@Base 2020.1 + _ZN8orgQhull10QhullFacetC2ERKNS_5QhullEP6facetT@Base 2020.1 + (optional=inline-ctor)_ZN8orgQhull10QhullPointC1EPNS_7QhullQhEPd@Base 2020.2 + _ZN8orgQhull10QhullPointC1ERKNS_5QhullE@Base 2020.1 + _ZN8orgQhull10QhullPointC1ERKNS_5QhullEPd@Base 2020.1 + _ZN8orgQhull10QhullPointC1ERKNS_5QhullERNS_11CoordinatesE@Base 2020.1 + _ZN8orgQhull10QhullPointC1ERKNS_5QhullEiPd@Base 2020.1 + (optional=inline-ctor)_ZN8orgQhull10QhullPointC2EPNS_7QhullQhEPd@Base 2020.2 + _ZN8orgQhull10QhullPointC2ERKNS_5QhullE@Base 2020.1 + _ZN8orgQhull10QhullPointC2ERKNS_5QhullEPd@Base 2020.1 + _ZN8orgQhull10QhullPointC2ERKNS_5QhullERNS_11CoordinatesE@Base 2020.1 + _ZN8orgQhull10QhullPointC2ERKNS_5QhullEiPd@Base 2020.1 + _ZN8orgQhull10QhullRidge13s_empty_ridgeE@Base 2020.1 + _ZN8orgQhull10QhullRidgeC1ERKNS_5QhullE@Base 2020.1 + _ZN8orgQhull10QhullRidgeC1ERKNS_5QhullEP6ridgeT@Base 2020.1 + _ZN8orgQhull10QhullRidgeC2ERKNS_5QhullE@Base 2020.1 + _ZN8orgQhull10QhullRidgeC2ERKNS_5QhullEP6ridgeT@Base 2020.1 + _ZN8orgQhull10RboxPoints12appendPointsEPKc@Base 2020.1 + _ZN8orgQhull10RboxPoints15allocateQhullQhEv@Base 2020.1 + _ZN8orgQhull10RboxPoints16clearRboxMessageEv@Base 2020.1 + _ZN8orgQhull10RboxPointsC1EPKc@Base 2020.1 + _ZN8orgQhull10RboxPointsC1Ev@Base 2020.1 + _ZN8orgQhull10RboxPointsC2EPKc@Base 2020.1 + _ZN8orgQhull10RboxPointsC2Ev@Base 2020.1 + _ZN8orgQhull10RboxPointsD1Ev@Base 2020.1 + _ZN8orgQhull10RboxPointsD2Ev@Base 2020.1 + _ZN8orgQhull11Coordinates4swapEii@Base 2020.1 + _ZN8orgQhull11Coordinates6appendEiPd@Base 2020.1 + _ZN8orgQhull11Coordinates6takeAtEi@Base 2020.1 + _ZN8orgQhull11Coordinates8takeLastEv@Base 2020.1 + _ZN8orgQhull11Coordinates9removeAllERKd@Base 2020.1 + _ZN8orgQhull11CoordinatespLERKS0_@Base 2020.1 + _ZN8orgQhull11QhullPoints12resetQhullQhEPNS_7QhullQhE@Base 2020.1 + _ZN8orgQhull11QhullPointsC1EPNS_7QhullQhEiiPd@Base 2020.1 + _ZN8orgQhull11QhullPointsC1ERKNS_5QhullE@Base 2020.1 + _ZN8orgQhull11QhullPointsC1ERKNS_5QhullEiPd@Base 2020.1 + _ZN8orgQhull11QhullPointsC1ERKNS_5QhullEiiPd@Base 2020.1 + _ZN8orgQhull11QhullPointsC2EPNS_7QhullQhEiiPd@Base 2020.1 + _ZN8orgQhull11QhullPointsC2ERKNS_5QhullE@Base 2020.1 + _ZN8orgQhull11QhullPointsC2ERKNS_5QhullEiPd@Base 2020.1 + _ZN8orgQhull11QhullPointsC2ERKNS_5QhullEiiPd@Base 2020.1 + _ZN8orgQhull11QhullVertex14s_empty_vertexE@Base 2020.1 + _ZN8orgQhull11QhullVertexC1ERKNS_5QhullE@Base 2020.1 + _ZN8orgQhull11QhullVertexC1ERKNS_5QhullEP7vertexT@Base 2020.1 + _ZN8orgQhull11QhullVertexC1ERKS0_@Base 2020.2 + _ZN8orgQhull11QhullVertexC2ERKNS_5QhullE@Base 2020.1 + _ZN8orgQhull11QhullVertexC2ERKNS_5QhullEP7vertexT@Base 2020.1 + _ZN8orgQhull11QhullVertexC2ERKS0_@Base 2020.2 + _ZN8orgQhull12QhullSetBase11s_empty_setE@Base 2020.1 + _ZN8orgQhull12QhullSetBase5countEPK4setT@Base 2020.1 + _ZN8orgQhull12QhullSetBaseC1ERKNS_5QhullEP4setT@Base 2020.1 + _ZN8orgQhull12QhullSetBaseC2ERKNS_5QhullEP4setT@Base 2020.1 + _ZN8orgQhull12RoadLogEvent14firstExtraCodeERSocPc@Base 2020.1 + _ZN8orgQhull14QhullFacetListC1ERKNS_5QhullEP6facetTS5_@Base 2020.1 + _ZN8orgQhull14QhullFacetListC2ERKNS_5QhullEP6facetTS5_@Base 2020.1 + _ZN8orgQhull14QhullVertexSet13freeQhSetTempEv@Base 2020.1 + _ZN8orgQhull14QhullVertexSetC1EPNS_7QhullQhEP6facetTP4setTb@Base 2020.1 + _ZN8orgQhull14QhullVertexSetC1ERKNS_5QhullEP6facetTP4setTb@Base 2020.1 + _ZN8orgQhull14QhullVertexSetC1ERKS0_@Base 2020.1 + _ZN8orgQhull14QhullVertexSetC2EPNS_7QhullQhEP6facetTP4setTb@Base 2020.1 + _ZN8orgQhull14QhullVertexSetC2ERKNS_5QhullEP6facetTP4setTb@Base 2020.1 + _ZN8orgQhull14QhullVertexSetC2ERKS0_@Base 2020.1 + _ZN8orgQhull14QhullVertexSetD1Ev@Base 2020.1 + _ZN8orgQhull14QhullVertexSetD2Ev@Base 2020.1 + _ZN8orgQhull14QhullVertexSetaSERKS0_@Base 2020.1 + _ZN8orgQhull15QhullHyperplaneC1ERKNS_5QhullE@Base 2020.1 + _ZN8orgQhull15QhullHyperplaneC1ERKNS_5QhullEiPdd@Base 2020.1 + _ZN8orgQhull15QhullHyperplaneC2ERKNS_5QhullE@Base 2020.1 + _ZN8orgQhull15QhullHyperplaneC2ERKNS_5QhullEiPdd@Base 2020.1 + _ZN8orgQhull16PointCoordinates12appendPointsERSi@Base 2020.1 + _ZN8orgQhull16PointCoordinates12setDimensionEi@Base 2020.1 + _ZN8orgQhull16PointCoordinates13appendCommentERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@Base 2020.1 + _ZN8orgQhull16PointCoordinates16beginCoordinatesEi@Base 2020.1 + _ZN8orgQhull16PointCoordinates18reserveCoordinatesEi@Base 2020.1 + _ZN8orgQhull16PointCoordinates6appendERKNS_10QhullPointE@Base 2020.1 + _ZN8orgQhull16PointCoordinates6appendERKS0_@Base 2020.1 + _ZN8orgQhull16PointCoordinates6appendEiPKd@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC1EPNS_7QhullQhE@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC1EPNS_7QhullQhERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC1EPNS_7QhullQhEiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC1EPNS_7QhullQhEiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiPKd@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC1ERKNS_5QhullE@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC1ERKNS_5QhullERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC1ERKNS_5QhullEiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC1ERKNS_5QhullEiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiPKd@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC1ERKS0_@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC1EiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC1Ev@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC2EPNS_7QhullQhE@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC2EPNS_7QhullQhERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC2EPNS_7QhullQhEiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC2EPNS_7QhullQhEiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiPKd@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC2ERKNS_5QhullE@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC2ERKNS_5QhullERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC2ERKNS_5QhullEiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC2ERKNS_5QhullEiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiPKd@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC2ERKS0_@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC2EiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@Base 2020.1 + _ZN8orgQhull16PointCoordinatesC2Ev@Base 2020.1 + _ZN8orgQhull16PointCoordinatesD1Ev@Base 2020.1 + _ZN8orgQhull16PointCoordinatesD2Ev@Base 2020.1 + _ZN8orgQhull16PointCoordinatesaSERKS0_@Base 2020.1 + _ZN8orgQhull19QhullPointsIterator12findPreviousERKNS_10QhullPointE@Base 2020.1 + _ZN8orgQhull19QhullPointsIterator8findNextERKNS_10QhullPointE@Base 2020.1 + _ZN8orgQhull5Qhull11inputOriginEv@Base 2020.1 + _ZN8orgQhull5Qhull11outputQhullEPKc@Base 2020.1 + _ZN8orgQhull5Qhull11outputQhullEv@Base 2020.1 + _ZN8orgQhull5Qhull14prepareVoronoiEPbPi@Base 2020.1 + _ZN8orgQhull5Qhull15allocateQhullQhEv@Base 2020.1 + _ZN8orgQhull5Qhull23checkIfQhullInitializedEv@Base 2020.1 + _ZN8orgQhull5Qhull23initializeFeasiblePointEi@Base 2020.1 + _ZN8orgQhull5Qhull26defineVertexNeighborFacetsEv@Base 2020.1 + _ZN8orgQhull5Qhull4areaEv@Base 2020.1 + _ZN8orgQhull5Qhull6volumeEv@Base 2020.1 + _ZN8orgQhull5Qhull8runQhullEPKciiPKdS2_@Base 2020.1 + _ZN8orgQhull5Qhull8runQhullERKNS_10RboxPointsEPKc@Base 2020.1 + _ZN8orgQhull5QhullC1EPKciiPKdS2_@Base 2020.1 + _ZN8orgQhull5QhullC1ERKNS_10RboxPointsEPKc@Base 2020.1 + _ZN8orgQhull5QhullC1Ev@Base 2020.1 + _ZN8orgQhull5QhullC2EPKciiPKdS2_@Base 2020.1 + _ZN8orgQhull5QhullC2ERKNS_10RboxPointsEPKc@Base 2020.1 + _ZN8orgQhull5QhullC2Ev@Base 2020.1 + _ZN8orgQhull5QhullD1Ev@Base 2020.1 + _ZN8orgQhull5QhullD2Ev@Base 2020.1 + _ZN8orgQhull7QhullQh14setErrorStreamEPSo@Base 2020.1 + _ZN8orgQhull7QhullQh15setOutputStreamEPSo@Base 2020.1 + _ZN8orgQhull7QhullQh17clearQhullMessageEv@Base 2020.1 + _ZN8orgQhull7QhullQh18appendQhullMessageERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@Base 2020.1 + _ZN8orgQhull7QhullQh22default_factor_epsilonE@Base 2020.1 + _ZN8orgQhull7QhullQh22maybeThrowQhullMessageEi@Base 2020.1 + _ZN8orgQhull7QhullQh22maybeThrowQhullMessageEii@Base 2020.1 + _ZN8orgQhull7QhullQh23checkAndFreeQhullMemoryEv@Base 2020.1 + _ZN8orgQhull7QhullQhC1Ev@Base 2020.1 + _ZN8orgQhull7QhullQhC2Ev@Base 2020.1 + _ZN8orgQhull7QhullQhD1Ev@Base 2020.1 + _ZN8orgQhull7QhullQhD2Ev@Base 2020.1 + _ZN8orgQhull9QhullStatC1Ev@Base 2020.1 + _ZN8orgQhull9QhullStatC2Ev@Base 2020.1 + _ZN8orgQhull9QhullStatD1Ev@Base 2020.1 + _ZN8orgQhull9QhullStatD2Ev@Base 2020.1 + _ZN8orgQhull9QhullUser10captureOffEv@Base 2020.1 + _ZN8orgQhull9QhullUser5clearEv@Base 2020.1 + _ZN8orgQhull9QhullUser9captureOnEv@Base 2020.1 + _ZN8orgQhull9QhullUserC1EPNS_7QhullQhE@Base 2020.1 + _ZN8orgQhull9QhullUserC2EPNS_7QhullQhE@Base 2020.1 + _ZN8orgQhull9QhullUserD1Ev@Base 2020.1 + _ZN8orgQhull9QhullUserD2Ev@Base 2020.1 + _ZN8orgQhull9RoadError10global_logB5cxx11E@Base 2020.1 + _ZN8orgQhull9RoadError7ROADtagE@Base 2020.1 + _ZN8orgQhull9RoadErrorC1ERKS0_@Base 2020.1 + _ZN8orgQhull9RoadErrorC1EiPKc@Base 2020.1 + _ZN8orgQhull9RoadErrorC1EiPKci@Base 2020.1 + _ZN8orgQhull9RoadErrorC1EiPKcii@Base 2020.1 + _ZN8orgQhull9RoadErrorC1EiPKciif@Base 2020.1 + _ZN8orgQhull9RoadErrorC1EiPKciifPKv@Base 2020.1 + _ZN8orgQhull9RoadErrorC1EiPKciifS2_@Base 2020.1 + _ZN8orgQhull9RoadErrorC1EiPKciifd@Base 2020.1 + _ZN8orgQhull9RoadErrorC1EiPKciifi@Base 2020.1 + _ZN8orgQhull9RoadErrorC1EiPKciifx@Base 2020.1 + _ZN8orgQhull9RoadErrorC1EiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@Base 2020.1 + _ZN8orgQhull9RoadErrorC1Ev@Base 2020.1 + _ZN8orgQhull9RoadErrorC2ERKS0_@Base 2020.1 + _ZN8orgQhull9RoadErrorC2EiPKc@Base 2020.1 + _ZN8orgQhull9RoadErrorC2EiPKci@Base 2020.1 + _ZN8orgQhull9RoadErrorC2EiPKcii@Base 2020.1 + _ZN8orgQhull9RoadErrorC2EiPKciif@Base 2020.1 + _ZN8orgQhull9RoadErrorC2EiPKciifPKv@Base 2020.1 + _ZN8orgQhull9RoadErrorC2EiPKciifS2_@Base 2020.1 + _ZN8orgQhull9RoadErrorC2EiPKciifd@Base 2020.1 + _ZN8orgQhull9RoadErrorC2EiPKciifi@Base 2020.1 + _ZN8orgQhull9RoadErrorC2EiPKciifx@Base 2020.1 + _ZN8orgQhull9RoadErrorC2EiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@Base 2020.1 + _ZN8orgQhull9RoadErrorC2Ev@Base 2020.1 + _ZN8orgQhull9RoadErrorD0Ev@Base 2020.1 + _ZN8orgQhull9RoadErrorD1Ev@Base 2020.1 + _ZN8orgQhull9RoadErrorD2Ev@Base 2020.1 + _ZN8orgQhull9RoadErroraSERKS0_@Base 2020.1 + _ZNK8orgQhull10QhullFacet10innerplaneEv@Base 2020.1 + _ZNK8orgQhull10QhullFacet10outerplaneEv@Base 2020.1 + _ZNK8orgQhull10QhullFacet11nextFacet2dEPNS_11QhullVertexE@Base 2020.1 + _ZNK8orgQhull10QhullFacet13outsidePointsEv@Base 2020.1 + _ZNK8orgQhull10QhullFacet14coplanarPointsEv@Base 2020.1 + _ZNK8orgQhull10QhullFacet14neighborFacetsEv@Base 2020.1 + _ZNK8orgQhull10QhullFacet16tricoplanarOwnerEv@Base 2020.1 + _ZNK8orgQhull10QhullFacet6ridgesEv@Base 2020.1 + _ZNK8orgQhull10QhullFacet8verticesEv@Base 2020.1 + _ZNK8orgQhull10QhullPoint11toStdVectorEv@Base 2020.1 + _ZNK8orgQhull10QhullPoint8distanceERKS0_@Base 2020.1 + _ZNK8orgQhull10QhullPointeqERKS0_@Base 2020.1 + _ZNK8orgQhull10QhullRidge11nextRidge3dERKNS_10QhullFacetEPNS_11QhullVertexE@Base 2020.1 + _ZNK8orgQhull10QhullRidge14hasNextRidge3dERKNS_10QhullFacetE@Base 2020.1 + _ZNK8orgQhull10RboxPoints10rboxStatusEv@Base 2020.1 + _ZNK8orgQhull10RboxPoints11rboxMessageB5cxx11Ev@Base 2020.1 + _ZNK8orgQhull10RboxPoints14hasRboxMessageEv@Base 2020.1 + _ZNK8orgQhull11Coordinates11lastIndexOfERKdi@Base 2020.1 + _ZNK8orgQhull11Coordinates3midEii@Base 2020.1 + _ZNK8orgQhull11Coordinates5countERKd@Base 2020.1 + _ZNK8orgQhull11Coordinates5valueEiRKd@Base 2020.1 + _ZNK8orgQhull11Coordinates7indexOfERKdi@Base 2020.1 + _ZNK8orgQhull11Coordinates8containsERKd@Base 2020.1 + _ZNK8orgQhull11CoordinatesplERKS0_@Base 2020.1 + _ZNK8orgQhull11QhullPoints11lastIndexOfERKNS_10QhullPointE@Base 2020.1 + _ZNK8orgQhull11QhullPoints11toStdVectorEv@Base 2020.1 + _ZNK8orgQhull11QhullPoints21extraCoordinatesCountEv@Base 2020.1 + _ZNK8orgQhull11QhullPoints3midEii@Base 2020.1 + _ZNK8orgQhull11QhullPoints5countERKNS_10QhullPointE@Base 2020.1 + _ZNK8orgQhull11QhullPoints5valueEi@Base 2020.1 + _ZNK8orgQhull11QhullPoints5valueEiRNS_10QhullPointE@Base 2020.1 + _ZNK8orgQhull11QhullPoints7indexOfEPKd@Base 2020.1 + _ZNK8orgQhull11QhullPoints7indexOfEPKdi@Base 2020.1 + _ZNK8orgQhull11QhullPoints7indexOfERKNS_10QhullPointE@Base 2020.1 + _ZNK8orgQhull11QhullPoints8containsERKNS_10QhullPointE@Base 2020.1 + _ZNK8orgQhull11QhullPointseqERKS0_@Base 2020.1 + _ZNK8orgQhull11QhullVertex14neighborFacetsEv@Base 2020.1 + _ZNK8orgQhull12RoadLogEvent8toStringB5cxx11EPKci@Base 2020.1 + _ZNK8orgQhull13QhullFacetSet11toStdVectorEv@Base 2020.1 + _ZNK8orgQhull13QhullFacetSet5countERKNS_10QhullFacetE@Base 2020.1 + _ZNK8orgQhull13QhullFacetSet5countEv@Base 2020.1 + _ZNK8orgQhull13QhullFacetSet8containsERKNS_10QhullFacetE@Base 2020.1 + _ZNK8orgQhull14QhullFacetList11toStdVectorEv@Base 2020.1 + _ZNK8orgQhull14QhullFacetList20vertices_toStdVectorEv@Base 2020.1 + _ZNK8orgQhull14QhullFacetList5countERKNS_10QhullFacetE@Base 2020.1 + _ZNK8orgQhull14QhullFacetList5countEv@Base 2020.1 + _ZNK8orgQhull14QhullFacetList8containsERKNS_10QhullFacetE@Base 2020.1 + _ZNK8orgQhull14QhullVertexSet11toStdVectorEv@Base 2020.1 + _ZNK8orgQhull15QhullHyperplane11toStdVectorEv@Base 2020.1 + _ZNK8orgQhull15QhullHyperplane15hyperplaneAngleERKS0_@Base 2020.1 + _ZNK8orgQhull15QhullHyperplane4normEv@Base 2020.1 + _ZNK8orgQhull15QhullHyperplane8distanceERKNS_10QhullPointE@Base 2020.1 + _ZNK8orgQhull15QhullHyperplaneeqERKS0_@Base 2020.1 + _ZNK8orgQhull16PointCoordinates10checkValidEv@Base 2020.1 + _ZNK8orgQhull16PointCoordinates11indexOffsetEi@Base 2020.1 + _ZNK8orgQhull16PointCoordinates16beginCoordinatesEi@Base 2020.1 + _ZNK8orgQhull16PointCoordinatesplERKS0_@Base 2020.1 + _ZNK8orgQhull5Qhull10vertexListEv@Base 2020.1 + _ZNK8orgQhull5Qhull11otherPointsEv@Base 2020.1 + _ZNK8orgQhull5Qhull13feasiblePointEv@Base 2020.1 + _ZNK8orgQhull5Qhull6pointsEv@Base 2020.1 + _ZNK8orgQhull5Qhull9facetListEv@Base 2020.1 + _ZNK8orgQhull7QhullQh11qhullStatusEv@Base 2020.1 + _ZNK8orgQhull7QhullQh12qhullMessageB5cxx11Ev@Base 2020.1 + _ZNK8orgQhull7QhullQh15hasQhullMessageEv@Base 2020.1 + _ZNK8orgQhull9RoadError18logErrorLastResortEv@Base 2020.1 + _ZNK8orgQhull9RoadError4whatEv@Base 2020.1 + _ZTIN8orgQhull10QhullErrorE@Base 2020.1 + _ZTIN8orgQhull9RoadErrorE@Base 2020.1 + _ZTSN8orgQhull10QhullErrorE@Base 2020.1 + _ZTSN8orgQhull9RoadErrorE@Base 2020.1 + _ZTVN8orgQhull10QhullErrorE@Base 2020.1 + _ZTVN8orgQhull9RoadErrorE@Base 2020.1 + _ZlsRSoRKN8orgQhull10QhullFacet10PrintFacetE@Base 2020.1 + _ZlsRSoRKN8orgQhull10QhullFacet10PrintFlagsE@Base 2020.1 + _ZlsRSoRKN8orgQhull10QhullFacet11PrintCenterE@Base 2020.1 + _ZlsRSoRKN8orgQhull10QhullFacet11PrintHeaderE@Base 2020.1 + _ZlsRSoRKN8orgQhull10QhullFacet11PrintRidgesE@Base 2020.1 + _ZlsRSoRKN8orgQhull10QhullPoint10PrintPointE@Base 2020.1 + _ZlsRSoRKN8orgQhull10QhullPointE@Base 2020.1 + _ZlsRSoRKN8orgQhull10QhullRidge10PrintRidgeE@Base 2020.1 + _ZlsRSoRKN8orgQhull10QhullRidgeE@Base 2020.1 + _ZlsRSoRKN8orgQhull11CoordinatesE@Base 2020.1 + _ZlsRSoRKN8orgQhull11QhullPoints11PrintPointsE@Base 2020.1 + _ZlsRSoRKN8orgQhull11QhullPointsE@Base 2020.1 + _ZlsRSoRKN8orgQhull11QhullVertex11PrintVertexE@Base 2020.1 + _ZlsRSoRKN8orgQhull13QhullFacetSet13PrintFacetSetE@Base 2020.1 + _ZlsRSoRKN8orgQhull13QhullFacetSet16PrintIdentifiersE@Base 2020.1 + _ZlsRSoRKN8orgQhull13QhullFacetSetE@Base 2020.1 + _ZlsRSoRKN8orgQhull13QhullPointSet13PrintPointSetE@Base 2020.1 + _ZlsRSoRKN8orgQhull13QhullPointSet16PrintIdentifiersE@Base 2020.1 + _ZlsRSoRKN8orgQhull14QhullFacetList11PrintFacetsE@Base 2020.1 + _ZlsRSoRKN8orgQhull14QhullFacetList13PrintVerticesE@Base 2020.1 + _ZlsRSoRKN8orgQhull14QhullFacetList14PrintFacetListE@Base 2020.1 + _ZlsRSoRKN8orgQhull14QhullFacetListE@Base 2020.1 + _ZlsRSoRKN8orgQhull14QhullVertexSet14PrintVertexSetE@Base 2020.1 + _ZlsRSoRKN8orgQhull14QhullVertexSet16PrintIdentifiersE@Base 2020.1 + _ZlsRSoRKN8orgQhull15QhullHyperplane15PrintHyperplaneE@Base 2020.1 + _ZlsRSoRKN8orgQhull15QhullHyperplaneE@Base 2020.1 + _ZlsRSoRKN8orgQhull16PointCoordinatesE@Base 2020.1 + _ZlsRSoRN8orgQhull10QhullFacetE@Base 2020.1 + qh_fprintf@Base 2020.1 + qh_fprintf_rbox@Base 2020.1 diff -Nru qhull-2015.2/debian/libqhull-dev.install qhull-2020.2/debian/libqhull-dev.install --- qhull-2015.2/debian/libqhull-dev.install 2017-12-09 18:17:01.000000000 +0000 +++ qhull-2020.2/debian/libqhull-dev.install 2020-11-11 14:07:30.000000000 +0000 @@ -1,6 +1,9 @@ -#! /usr/bin/dh-exec -usr/lib/libqhull.a /usr/lib/${DEB_HOST_MULTIARCH}/ -usr/lib/libqhull.so /usr/lib/${DEB_HOST_MULTIARCH}/ -usr/lib/libqhullstatic_r.a /usr/lib/${DEB_HOST_MULTIARCH}/ -usr/lib/libqhull_r.so /usr/lib/${DEB_HOST_MULTIARCH}/ +usr/lib/*/libqhullstatic.a +usr/lib/*/libqhull.so +usr/lib/*/libqhullstatic_r.a +usr/lib/*/libqhull_r.so +usr/lib/*/libqhullcpp.so +usr/lib/*/libqhullcpp.a +usr/lib/*/cmake +usr/lib/*/pkgconfig usr/include diff -Nru qhull-2015.2/debian/libqhull-doc.doc-base.qhull-api qhull-2020.2/debian/libqhull-doc.doc-base.qhull-api --- qhull-2015.2/debian/libqhull-doc.doc-base.qhull-api 2017-12-09 18:17:01.000000000 +0000 +++ qhull-2020.2/debian/libqhull-doc.doc-base.qhull-api 2020-11-11 14:07:30.000000000 +0000 @@ -5,5 +5,5 @@ Section: Science/Mathematics Format: HTML -Index: /usr/share/doc/libqhull-doc/include/index.htm -Files: /usr/share/doc/libqhull-doc/include/* +Index: /usr/share/doc/libqhull-dev/qhull/src/libqhull_r/index.htm +Files: /usr/share/doc/libqhull-dev/qhull/src/libqhull_r/* diff -Nru qhull-2015.2/debian/libqhull-doc.doc-base.qhull-manual qhull-2020.2/debian/libqhull-doc.doc-base.qhull-manual --- qhull-2015.2/debian/libqhull-doc.doc-base.qhull-manual 2017-12-09 18:17:01.000000000 +0000 +++ qhull-2020.2/debian/libqhull-doc.doc-base.qhull-manual 2020-11-11 14:07:30.000000000 +0000 @@ -9,5 +9,5 @@ Section: Science/Mathematics Format: HTML -Index: /usr/share/doc/libqhull-doc/qhull/index.htm -Files: /usr/share/doc/libqhull-doc/qhull/*.htm +Index: /usr/share/doc/libqhull-dev/qhull/index.htm +Files: /usr/share/doc/libqhull-dev/qhull/*.htm diff -Nru qhull-2015.2/debian/libqhull-doc.docs qhull-2020.2/debian/libqhull-doc.docs --- qhull-2015.2/debian/libqhull-doc.docs 2017-12-09 18:17:01.000000000 +0000 +++ qhull-2020.2/debian/libqhull-doc.docs 2020-11-11 14:07:30.000000000 +0000 @@ -1 +1 @@ -debian/tmp/usr/share/doc/qhull +usr/share/doc/libqhull-dev/* diff -Nru qhull-2015.2/debian/libqhull-doc.install qhull-2020.2/debian/libqhull-doc.install --- qhull-2015.2/debian/libqhull-doc.install 2017-12-09 18:17:01.000000000 +0000 +++ qhull-2020.2/debian/libqhull-doc.install 2020-11-11 14:07:45.000000000 +0000 @@ -1 +1,2 @@ -/usr/include/libqhull/*.htm /usr/share/doc/libqhull-doc/include/ +usr/share/doc/libqhull-dev/qhull/src +src/libqhull_r/*.htm usr/share/doc/libqhull-dev/qhull/src/libqhull_r diff -Nru qhull-2015.2/debian/libqhull-r7.install qhull-2020.2/debian/libqhull-r7.install --- qhull-2015.2/debian/libqhull-r7.install 2017-12-09 18:17:01.000000000 +0000 +++ qhull-2020.2/debian/libqhull-r7.install 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -#! /usr/bin/dh-exec -usr/lib/libqhull_r.so.* /usr/lib/${DEB_HOST_MULTIARCH}/ diff -Nru qhull-2015.2/debian/libqhull-r8.0.install qhull-2020.2/debian/libqhull-r8.0.install --- qhull-2015.2/debian/libqhull-r8.0.install 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/debian/libqhull-r8.0.install 2020-11-11 14:07:30.000000000 +0000 @@ -0,0 +1 @@ +usr/lib/*/libqhull_r.so.* diff -Nru qhull-2015.2/debian/libqhull-r8.0.symbols qhull-2020.2/debian/libqhull-r8.0.symbols --- qhull-2015.2/debian/libqhull-r8.0.symbols 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/debian/libqhull-r8.0.symbols 2020-11-11 14:07:30.000000000 +0000 @@ -0,0 +1,445 @@ +# SymbolsHelper-Confirmed: 2020.1 amd64 +libqhull_r.so.8.0 libqhull-r8.0 #MINVER# +* Build-Depends-Package: libqhull-dev + mergetypes@Base 2020.1 + qh_addfacetvertex@Base 2020.1 + qh_addhash@Base 2020.1 + qh_addpoint@Base 2020.1 + qh_all_merges@Base 2020.1 + qh_all_vertexmerges@Base 2020.1 + qh_allstatA@Base 2020.1 + qh_allstatB@Base 2020.1 + qh_allstatC@Base 2020.1 + qh_allstatD@Base 2020.1 + qh_allstatE2@Base 2020.1 + qh_allstatE@Base 2020.1 + qh_allstatF@Base 2020.1 + qh_allstatG@Base 2020.1 + qh_allstatH@Base 2020.1 + qh_allstatI@Base 2020.1 + qh_allstatistics@Base 2020.1 + qh_appendfacet@Base 2020.1 + qh_appendmergeset@Base 2020.1 + qh_appendprint@Base 2020.1 + qh_appendvertex@Base 2020.1 + qh_appendvertexmerge@Base 2020.1 + qh_argv_to_command@Base 2020.1 + qh_argv_to_command_size@Base 2020.1 + qh_attachnewfacets@Base 2020.1 + qh_backnormal@Base 2020.1 + qh_basevertices@Base 2020.1 + qh_build_withrestart@Base 2020.1 + qh_buildcone@Base 2020.1 + qh_buildcone_mergepinched@Base 2020.1 + qh_buildcone_onlygood@Base 2020.1 + qh_buildhull@Base 2020.1 + qh_buildtracing@Base 2020.1 + qh_check_bestdist@Base 2020.1 + qh_check_dupridge@Base 2020.1 + qh_check_maxout@Base 2020.1 + qh_check_output@Base 2020.1 + qh_check_point@Base 2020.1 + qh_check_points@Base 2020.1 + qh_checkconnect@Base 2020.1 + qh_checkconvex@Base 2020.1 + qh_checkdelfacet@Base 2020.1 + qh_checkdelridge@Base 2020.1 + qh_checkfacet@Base 2020.1 + qh_checkflags@Base 2020.1 + qh_checkflipped@Base 2020.1 + qh_checkflipped_all@Base 2020.1 + qh_checklists@Base 2020.1 + qh_checkpolygon@Base 2020.1 + qh_checkvertex@Base 2020.1 + qh_checkzero@Base 2020.1 + qh_clear_outputflags@Base 2020.1 + qh_clearcenters@Base 2020.1 + qh_clock@Base 2020.1 + qh_collectstatistics@Base 2020.1 + qh_compare_anglemerge@Base 2020.1 + qh_compare_facetarea@Base 2020.1 + qh_compare_facetmerge@Base 2020.1 + qh_compare_facetvisit@Base 2020.1 + qh_compare_nummerge@Base 2020.1 + qh_comparevisit@Base 2020.1 + qh_copyfilename@Base 2020.1 + qh_copynonconvex@Base 2020.1 + qh_copypoints@Base 2020.1 + qh_countfacets@Base 2020.1 + qh_createsimplex@Base 2020.1 + qh_crossproduct@Base 2020.1 + qh_degen_redundant_facet@Base 2020.1 + qh_deletevisible@Base 2020.1 + qh_delfacet@Base 2020.1 + qh_delridge@Base 2020.1 + qh_delridge_merge@Base 2020.1 + qh_delvertex@Base 2020.1 + qh_determinant@Base 2020.1 + qh_detjoggle@Base 2020.1 + qh_detmaxoutside@Base 2020.1 + qh_detroundoff@Base 2020.1 + qh_detsimplex@Base 2020.1 + qh_detvnorm@Base 2020.1 + qh_detvridge3@Base 2020.1 + qh_detvridge@Base 2020.1 + qh_dfacet@Base 2020.1 + qh_distnorm@Base 2020.1 + qh_distplane@Base 2020.1 + qh_distround@Base 2020.1 + qh_divzero@Base 2020.1 + qh_drop_mergevertex@Base 2020.1 + qh_dvertex@Base 2020.1 + qh_eachvoronoi@Base 2020.1 + qh_eachvoronoi_all@Base 2020.1 + qh_errexit2@Base 2020.1 + qh_errexit@Base 2020.1 + qh_errexit_rbox@Base 2020.1 + qh_errprint@Base 2020.1 + qh_exit@Base 2020.1 + qh_facet2point@Base 2020.1 + qh_facet3vertex@Base 2020.1 + qh_facetarea@Base 2020.1 + qh_facetarea_simplex@Base 2020.1 + qh_facetcenter@Base 2020.1 + qh_facetintersect@Base 2020.1 + qh_facetvertices@Base 2020.1 + qh_find_newvertex@Base 2020.1 + qh_findbest@Base 2020.1 + qh_findbest_pinchedvertex@Base 2020.1 + qh_findbest_ridgevertex@Base 2020.1 + qh_findbest_test@Base 2020.1 + qh_findbestfacet@Base 2020.1 + qh_findbesthorizon@Base 2020.1 + qh_findbestlower@Base 2020.1 + qh_findbestneighbor@Base 2020.1 + qh_findbestnew@Base 2020.1 + qh_findfacet_all@Base 2020.1 + qh_findgood@Base 2020.1 + qh_findgood_all@Base 2020.1 + qh_findgooddist@Base 2020.1 + qh_findhorizon@Base 2020.1 + qh_flippedmerges@Base 2020.1 + qh_forcedmerges@Base 2020.1 + qh_fprintf@Base 2020.1 + qh_fprintf_rbox@Base 2020.1 + qh_fprintf_stderr@Base 2020.1 + qh_free@Base 2020.1 + qh_freebuffers@Base 2020.1 + qh_freebuild@Base 2020.1 + qh_freemergesets@Base 2020.1 + qh_freeqhull@Base 2020.1 + qh_furthestnewvertex@Base 2020.1 + qh_furthestnext@Base 2020.1 + qh_furthestout@Base 2020.1 + qh_furthestvertex@Base 2020.1 + qh_gausselim@Base 2020.1 + qh_geomplanes@Base 2020.1 + qh_getangle@Base 2020.1 + qh_getarea@Base 2020.1 + qh_getcenter@Base 2020.1 + qh_getcentrum@Base 2020.1 + qh_getdistance@Base 2020.1 + qh_gethash@Base 2020.1 + qh_getmergeset@Base 2020.1 + qh_getmergeset_initial@Base 2020.1 + qh_getpinchedmerges@Base 2020.1 + qh_getreplacement@Base 2020.1 + qh_gram_schmidt@Base 2020.1 + qh_hashridge@Base 2020.1 + qh_hashridge_find@Base 2020.1 + qh_hasmerge@Base 2020.1 + qh_infiniteloop@Base 2020.1 + qh_init_A@Base 2020.1 + qh_init_B@Base 2020.1 + qh_init_qhull_command@Base 2020.1 + qh_initbuild@Base 2020.1 + qh_initflags@Base 2020.1 + qh_initialhull@Base 2020.1 + qh_initialvertices@Base 2020.1 + qh_initmergesets@Base 2020.1 + qh_initqhull_buffers@Base 2020.1 + qh_initqhull_globals@Base 2020.1 + qh_initqhull_mem@Base 2020.1 + qh_initqhull_outputflags@Base 2020.1 + qh_initqhull_start2@Base 2020.1 + qh_initqhull_start@Base 2020.1 + qh_initstatistics@Base 2020.1 + qh_initthresholds@Base 2020.1 + qh_inthresholds@Base 2020.1 + qh_isvertex@Base 2020.1 + qh_joggle_restart@Base 2020.1 + qh_joggleinput@Base 2020.1 + qh_lib_check@Base 2020.1 + qh_makenew_nonsimplicial@Base 2020.1 + qh_makenew_simplicial@Base 2020.1 + qh_makenewfacet@Base 2020.1 + qh_makenewfacets@Base 2020.1 + qh_makenewplanes@Base 2020.1 + qh_makeridges@Base 2020.1 + qh_malloc@Base 2020.1 + qh_mark_dupridges@Base 2020.1 + qh_markkeep@Base 2020.1 + qh_markvoronoi@Base 2020.1 + qh_matchdupridge@Base 2020.1 + qh_matchneighbor@Base 2020.1 + qh_matchnewfacets@Base 2020.1 + qh_matchvertices@Base 2020.1 + qh_maxabsval@Base 2020.1 + qh_maxmin@Base 2020.1 + qh_maxouter@Base 2020.1 + qh_maxsimplex@Base 2020.1 + qh_maybe_duplicateridge@Base 2020.1 + qh_maybe_duplicateridges@Base 2020.1 + qh_maydropneighbor@Base 2020.1 + qh_memalloc@Base 2020.1 + qh_memcheck@Base 2020.1 + qh_memfree@Base 2020.1 + qh_memfreeshort@Base 2020.1 + qh_meminit@Base 2020.1 + qh_meminitbuffers@Base 2020.1 + qh_memsetup@Base 2020.1 + qh_memsize@Base 2020.1 + qh_memstatistics@Base 2020.1 + qh_memtotal@Base 2020.1 + qh_merge_degenredundant@Base 2020.1 + qh_merge_nonconvex@Base 2020.1 + qh_merge_pinchedvertices@Base 2020.1 + qh_merge_twisted@Base 2020.1 + qh_mergecycle@Base 2020.1 + qh_mergecycle_all@Base 2020.1 + qh_mergecycle_facets@Base 2020.1 + qh_mergecycle_neighbors@Base 2020.1 + qh_mergecycle_ridges@Base 2020.1 + qh_mergecycle_vneighbors@Base 2020.1 + qh_mergefacet2d@Base 2020.1 + qh_mergefacet@Base 2020.1 + qh_mergeneighbors@Base 2020.1 + qh_mergeridges@Base 2020.1 + qh_mergesimplex@Base 2020.1 + qh_mergevertex_del@Base 2020.1 + qh_mergevertex_neighbors@Base 2020.1 + qh_mergevertices@Base 2020.1 + qh_minabsval@Base 2020.1 + qh_mindiff@Base 2020.1 + qh_nearcoplanar@Base 2020.1 + qh_nearvertex@Base 2020.1 + qh_neighbor_intersections@Base 2020.1 + qh_neighbor_vertices@Base 2020.1 + qh_neighbor_vertices_facet@Base 2020.1 + qh_new_qhull@Base 2020.1 + qh_newfacet@Base 2020.1 + qh_newhashtable@Base 2020.1 + qh_newridge@Base 2020.1 + qh_newstats@Base 2020.1 + qh_newvertex@Base 2020.1 + qh_newvertices@Base 2020.1 + qh_next_vertexmerge@Base 2020.1 + qh_nextfacet2d@Base 2020.1 + qh_nextfurthest@Base 2020.1 + qh_nextridge3d@Base 2020.1 + qh_normalize2@Base 2020.1 + qh_normalize@Base 2020.1 + qh_nostatistic@Base 2020.1 + qh_opposite_horizonfacet@Base 2020.1 + qh_opposite_vertex@Base 2020.1 + qh_option@Base 2020.1 + qh_order_vertexneighbors@Base 2020.1 + qh_orientoutside@Base 2020.1 + qh_out1@Base 2020.1 + qh_out2n@Base 2020.1 + qh_out3n@Base 2020.1 + qh_outcoincident@Base 2020.1 + qh_outcoord@Base 2020.1 + qh_outcoplanar@Base 2020.1 + qh_outerinner@Base 2020.1 + qh_partitionall@Base 2020.1 + qh_partitioncoplanar@Base 2020.1 + qh_partitionpoint@Base 2020.1 + qh_partitionvisible@Base 2020.1 + qh_point@Base 2020.1 + qh_point_add@Base 2020.1 + qh_pointdist@Base 2020.1 + qh_pointfacet@Base 2020.1 + qh_pointid@Base 2020.1 + qh_pointvertex@Base 2020.1 + qh_postmerge@Base 2020.1 + qh_premerge@Base 2020.1 + qh_prepare_output@Base 2020.1 + qh_prependfacet@Base 2020.1 + qh_printafacet@Base 2020.1 + qh_printallstatistics@Base 2020.1 + qh_printbegin@Base 2020.1 + qh_printcenter@Base 2020.1 + qh_printcentrum@Base 2020.1 + qh_printend4geom@Base 2020.1 + qh_printend@Base 2020.1 + qh_printextremes@Base 2020.1 + qh_printextremes_2d@Base 2020.1 + qh_printextremes_d@Base 2020.1 + qh_printfacet2geom@Base 2020.1 + qh_printfacet2geom_points@Base 2020.1 + qh_printfacet2math@Base 2020.1 + qh_printfacet3geom_nonsimplicial@Base 2020.1 + qh_printfacet3geom_points@Base 2020.1 + qh_printfacet3geom_simplicial@Base 2020.1 + qh_printfacet3math@Base 2020.1 + qh_printfacet3vertex@Base 2020.1 + qh_printfacet4geom_nonsimplicial@Base 2020.1 + qh_printfacet4geom_simplicial@Base 2020.1 + qh_printfacet@Base 2020.1 + qh_printfacetNvertex_nonsimplicial@Base 2020.1 + qh_printfacetNvertex_simplicial@Base 2020.1 + qh_printfacetheader@Base 2020.1 + qh_printfacetlist@Base 2020.1 + qh_printfacetridges@Base 2020.1 + qh_printfacets@Base 2020.1 + qh_printhashtable@Base 2020.1 + qh_printhelp_degenerate@Base 2020.1 + qh_printhelp_internal@Base 2020.1 + qh_printhelp_narrowhull@Base 2020.1 + qh_printhelp_singular@Base 2020.1 + qh_printhelp_topology@Base 2020.1 + qh_printhelp_wide@Base 2020.1 + qh_printhyperplaneintersection@Base 2020.1 + qh_printline3geom@Base 2020.1 + qh_printlists@Base 2020.1 + qh_printmatrix@Base 2020.1 + qh_printneighborhood@Base 2020.1 + qh_printpoint3@Base 2020.1 + qh_printpoint@Base 2020.1 + qh_printpointid@Base 2020.1 + qh_printpoints@Base 2020.1 + qh_printpoints_out@Base 2020.1 + qh_printpointvect2@Base 2020.1 + qh_printpointvect@Base 2020.1 + qh_printridge@Base 2020.1 + qh_printspheres@Base 2020.1 + qh_printstatistics@Base 2020.1 + qh_printstatlevel@Base 2020.1 + qh_printstats@Base 2020.1 + qh_printsummary@Base 2020.1 + qh_printvdiagram2@Base 2020.1 + qh_printvdiagram@Base 2020.1 + qh_printvertex@Base 2020.1 + qh_printvertexlist@Base 2020.1 + qh_printvertices@Base 2020.1 + qh_printvneighbors@Base 2020.1 + qh_printvnorm@Base 2020.1 + qh_printvoronoi@Base 2020.1 + qh_printvridge@Base 2020.1 + qh_produce_output2@Base 2020.1 + qh_produce_output@Base 2020.1 + qh_projectdim3@Base 2020.1 + qh_projectinput@Base 2020.1 + qh_projectpoint@Base 2020.1 + qh_projectpoints@Base 2020.1 + qh_qhull@Base 2020.1 + qh_rand@Base 2020.1 + qh_randomfactor@Base 2020.1 + qh_randommatrix@Base 2020.1 + qh_rboxpoints2@Base 2020.1 + qh_rboxpoints@Base 2020.1 + qh_readfeasible@Base 2020.1 + qh_readpoints@Base 2020.1 + qh_reducevertices@Base 2020.1 + qh_redundant_vertex@Base 2020.1 + qh_remove_extravertices@Base 2020.1 + qh_remove_mergetype@Base 2020.1 + qh_removefacet@Base 2020.1 + qh_removevertex@Base 2020.1 + qh_rename_adjacentvertex@Base 2020.1 + qh_rename_sharedvertex@Base 2020.1 + qh_renameridgevertex@Base 2020.1 + qh_renamevertex@Base 2020.1 + qh_replacefacetvertex@Base 2020.1 + qh_resetlists@Base 2020.1 + qh_rotateinput@Base 2020.1 + qh_rotatepoints@Base 2020.1 + qh_roundi@Base 2020.1 + qh_scaleinput@Base 2020.1 + qh_scalelast@Base 2020.1 + qh_scalepoints@Base 2020.1 + qh_setaddnth@Base 2020.1 + qh_setaddsorted@Base 2020.1 + qh_setappend2ndlast@Base 2020.1 + qh_setappend@Base 2020.1 + qh_setappend_set@Base 2020.1 + qh_setcheck@Base 2020.1 + qh_setcompact@Base 2020.1 + qh_setcopy@Base 2020.1 + qh_setdel@Base 2020.1 + qh_setdelaunay@Base 2020.1 + qh_setdellast@Base 2020.1 + qh_setdelnth@Base 2020.1 + qh_setdelnthsorted@Base 2020.1 + qh_setdelsorted@Base 2020.1 + qh_setduplicate@Base 2020.1 + qh_setendpointer@Base 2020.1 + qh_setequal@Base 2020.1 + qh_setequal_except@Base 2020.1 + qh_setequal_skip@Base 2020.1 + qh_setfacetplane@Base 2020.1 + qh_setfeasible@Base 2020.1 + qh_setfree2@Base 2020.1 + qh_setfree@Base 2020.1 + qh_setfreelong@Base 2020.1 + qh_sethalfspace@Base 2020.1 + qh_sethalfspace_all@Base 2020.1 + qh_sethyperplane_det@Base 2020.1 + qh_sethyperplane_gauss@Base 2020.1 + qh_setin@Base 2020.1 + qh_setindex@Base 2020.1 + qh_setlarger@Base 2020.1 + qh_setlarger_quick@Base 2020.1 + qh_setlast@Base 2020.1 + qh_setnew@Base 2020.1 + qh_setnew_delnthsorted@Base 2020.1 + qh_setprint@Base 2020.1 + qh_setreplace@Base 2020.1 + qh_setsize@Base 2020.1 + qh_settemp@Base 2020.1 + qh_settempfree@Base 2020.1 + qh_settempfree_all@Base 2020.1 + qh_settemppop@Base 2020.1 + qh_settemppush@Base 2020.1 + qh_settruncate@Base 2020.1 + qh_setunique@Base 2020.1 + qh_setvoronoi_all@Base 2020.1 + qh_setzero@Base 2020.1 + qh_sharpnewfacets@Base 2020.1 + qh_skipfacet@Base 2020.1 + qh_skipfilename@Base 2020.1 + qh_srand@Base 2020.1 + qh_stddev@Base 2020.1 + qh_strtod@Base 2020.1 + qh_strtol@Base 2020.1 + qh_test_appendmerge@Base 2020.1 + qh_test_centrum_merge@Base 2020.1 + qh_test_degen_neighbors@Base 2020.1 + qh_test_nonsimplicial_merge@Base 2020.1 + qh_test_redundant_neighbors@Base 2020.1 + qh_test_vneighbors@Base 2020.1 + qh_tracemerge@Base 2020.1 + qh_tracemerging@Base 2020.1 + qh_triangulate@Base 2020.1 + qh_triangulate_facet@Base 2020.1 + qh_triangulate_link@Base 2020.1 + qh_triangulate_mirror@Base 2020.1 + qh_triangulate_null@Base 2020.1 + qh_update_vertexneighbors@Base 2020.1 + qh_update_vertexneighbors_cone@Base 2020.1 + qh_updatetested@Base 2020.1 + qh_user_memsizes@Base 2020.1 + qh_version2@Base 2020.1 + qh_version@Base 2020.1 + qh_vertex_bestdist2@Base 2020.1 + qh_vertex_bestdist@Base 2020.1 + qh_vertexintersect@Base 2020.1 + qh_vertexintersect_new@Base 2020.1 + qh_vertexneighbors@Base 2020.1 + qh_vertexridges@Base 2020.1 + qh_vertexridges_facet@Base 2020.1 + qh_vertexsubset@Base 2020.1 + qh_voronoi_center@Base 2020.1 + qh_willdelete@Base 2020.1 + qh_zero@Base 2020.1 diff -Nru qhull-2015.2/debian/manpage.in qhull-2020.2/debian/manpage.in --- qhull-2015.2/debian/manpage.in 2017-12-09 18:17:01.000000000 +0000 +++ qhull-2020.2/debian/manpage.in 2020-11-11 14:07:30.000000000 +0000 @@ -1,112 +1,35 @@ - -Rafael"> - Laboissiere"> - - 2004-02-06"> - - 1"> - rafael@debian.org"> - - #command#"> - - - Debian"> - -]> - - - - - -
- &dhemail; -
- - &dhfirstname; - &dhsurname; - - - 2003 - &dhusername; - - &dhdate; -
- - &dhucpackage; - - &dhsection; - - - &dhpackage; - - #purpose# - - - - &dhpackage; - - - - - DESCRIPTION - - - This manual page was written for the &debian; distribution - because the original program does not have a manual page. - - - - This program is documented fully in HTML - format, available in the libqhull-doc package. - - - - - - SEE ALSO - - - &docfile; - - - - - AUTHOR - - - The Qhull library is authored by C. Bradford Barber and Hannu - Huhdanpaa. - - - - This manual page was written by &dhusername; &dhemail; for the - &debian; system (but may be used by others withouth any - restrictions). - - - -
- - +.ig +Template manual page for the Qhull commands +(C) 2020 Timo Röhling + +This is a manual transcription of the +Template manual page for the Qhull commands, DocBook source file +(C) 2006 Rafael Laboissiere +.. +.de URL +\\$2 \(laURL: \\$1 \(ra\\$3 +.. +.if \n[.g] .mso www.tmac +.if n .ad l +.nh +.TH #COMMAND# 1 "" "" "Qhull Utilities" +.SH NAME +#command# \- #purpose# +.SH SYNOPSIS +.B #command# +.RI [ ] +.SH DESCRIPTION +This manual page was written for the Debian distribution because the +original program does not have a manual page. +.PP +This program is documented fully in +.URL file:///usr/share/doc/libqhull-dev/qhull/html/#doc#.htm "HTML format" , +available in the libqhull-doc package. +.SH SEE ALSO +.B /usr/share/doc/libqhull-dev/qhull/html/#doc#.htm +.SH AUTHOR +The Qhull library is authored by C. Bradford Barber and Hannu Huhdanpaa. +.PP +This manual page was originally written by Rafael Laboissiere and later +ported from DocBook to GROFF by Timo R\[u00F6]hling for the Debian System (but +may be used by others without any restrictions). diff -Nru qhull-2015.2/debian/not-installed qhull-2020.2/debian/not-installed --- qhull-2015.2/debian/not-installed 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/debian/not-installed 2020-11-11 14:07:30.000000000 +0000 @@ -0,0 +1 @@ +usr/lib/*/libqhull_p.* diff -Nru qhull-2015.2/debian/patches/0001-debianize-test-failure-msg.patch qhull-2020.2/debian/patches/0001-debianize-test-failure-msg.patch --- qhull-2015.2/debian/patches/0001-debianize-test-failure-msg.patch 2017-12-09 18:17:01.000000000 +0000 +++ qhull-2020.2/debian/patches/0001-debianize-test-failure-msg.patch 2020-11-11 14:07:33.000000000 +0000 @@ -4,16 +4,17 @@ Redirect users to the Debian BTS in the error message of rbox. --- - src/libqhull/io.c | 5 +---- - 1 file changed, 1 insertion(+), 4 deletions(-) + src/libqhull/io.c | 5 +---- + src/libqhull_r/io_r.c | 5 +---- + 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/libqhull/io.c b/src/libqhull/io.c -index 401987e..17b09d0 100644 +index beed156..037cfd5 100644 --- a/src/libqhull/io.c +++ b/src/libqhull/io.c -@@ -3933,10 +3933,7 @@ qhull warning: instead of %d %d-dimensional points, input contains\n\ - if (!strcmp(qh rbox_command, "./rbox D4")) - qh_fprintf(qh ferr, 8055, "\n\ +@@ -4002,10 +4002,7 @@ coordT *qh_readpoints(int *numpoints, int *dimension, boolT *ismalloc) { + if (!strcmp(qh rbox_command, "./rbox D4")) + qh_fprintf(qh ferr, 8055, "\n\ This is the qhull test case. If any errors or core dumps occur,\n\ -recompile qhull with 'make new'. If errors still occur, there is\n\ -an incompatibility. You should try a different compiler. You can also\n\ @@ -22,4 +23,20 @@ +file a bug report against the libqhull Debian package.\n\ \n\ Type 'qhull' for a short list of options.\n"); - } + qh_free(qh line); +diff --git a/src/libqhull_r/io_r.c b/src/libqhull_r/io_r.c +index a80a5b1..871232d 100644 +--- a/src/libqhull_r/io_r.c ++++ b/src/libqhull_r/io_r.c +@@ -4002,10 +4002,7 @@ coordT *qh_readpoints(qhT *qh, int *numpoints, int *dimension, boolT *ismalloc) + if (!strcmp(qh->rbox_command, "./rbox D4")) + qh_fprintf(qh, qh->ferr, 8055, "\n\ + This is the qhull test case. If any errors or core dumps occur,\n\ +-recompile qhull with 'make new'. If errors still occur, there is\n\ +-an incompatibility. You should try a different compiler. You can also\n\ +-change the choices in user_r.h. If you discover the source of the problem,\n\ +-please send mail to qhull_bug@qhull.org.\n\ ++file a bug report against the libqhull-r Debian package.\n\ + \n\ + Type 'qhull' for a short list of options.\n"); + qh_free(qh->line); diff -Nru qhull-2015.2/debian/patches/0002-Fix-privacy-breach.patch qhull-2020.2/debian/patches/0002-Fix-privacy-breach.patch --- qhull-2015.2/debian/patches/0002-Fix-privacy-breach.patch 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/debian/patches/0002-Fix-privacy-breach.patch 2020-11-11 14:07:33.000000000 +0000 @@ -0,0 +1,23 @@ +From: =?utf-8?q?Timo_R=C3=B6hling?= +Date: Tue, 10 Mar 2020 11:25:14 +0100 +Subject: Fix privacy breach + +--- + html/qh-get.htm | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/html/qh-get.htm b/html/qh-get.htm +index f26e733..9e46619 100644 +--- a/html/qh-get.htm ++++ b/html/qh-get.htm +@@ -72,10 +72,6 @@ width="100" height="100"> Qhull Downloads + Transactions on Mathematical Software, 22(4):469-483, Dec 1996 [abstract].

+ +- +-
+- +-

+ + +
  • -Date: Wed, 25 Sep 2002 10:39:30 +0200 -Subject: QHpointer - -Access globals via a pointer to allocated memory. ---- - src/libqhull/user.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/libqhull/user.h b/src/libqhull/user.h -index 523aa7b..2438f28 100644 ---- a/src/libqhull/user.h -+++ b/src/libqhull/user.h -@@ -609,7 +609,7 @@ stop after qh_JOGGLEmaxretry attempts - #error QH6207 Qhull error: Use qh_QHpointer_dllimport instead of qh_dllimport with qh_QHpointer - #endif - #else --#define qh_QHpointer 0 -+#define qh_QHpointer 1 - #if qh_QHpointer_dllimport - #error QH6234 Qhull error: Use qh_dllimport instead of qh_QHpointer_dllimport when qh_QHpointer is not defined - #endif diff -Nru qhull-2015.2/debian/patches/0003-spelling.patch qhull-2020.2/debian/patches/0003-spelling.patch --- qhull-2015.2/debian/patches/0003-spelling.patch 2017-12-09 18:17:01.000000000 +0000 +++ qhull-2020.2/debian/patches/0003-spelling.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -From: "Barak A. Pearlmutter" -Date: Wed, 18 Jan 2017 13:29:12 +0000 -Subject: spelling - ---- - src/libqhull/poly2.c | 2 +- - src/libqhull_r/poly2_r.c | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/libqhull/poly2.c b/src/libqhull/poly2.c -index f6dc15c..de3e6ad 100644 ---- a/src/libqhull/poly2.c -+++ b/src/libqhull/poly2.c -@@ -3177,7 +3177,7 @@ void qh_vertexneighbors(void /*qh.facet_list*/) { - - if (qh VERTEXneighbors) - return; -- trace1((qh ferr, 1035, "qh_vertexneighbors: determing neighboring facets for each vertex\n")); -+ trace1((qh ferr, 1035, "qh_vertexneighbors: determining neighboring facets for each vertex\n")); - qh vertex_visit++; - FORALLfacets { - if (facet->visible) -diff --git a/src/libqhull_r/poly2_r.c b/src/libqhull_r/poly2_r.c -index 475e8c6..b8ae9af 100644 ---- a/src/libqhull_r/poly2_r.c -+++ b/src/libqhull_r/poly2_r.c -@@ -3177,7 +3177,7 @@ void qh_vertexneighbors(qhT *qh /*qh.facet_list*/) { - - if (qh->VERTEXneighbors) - return; -- trace1((qh, qh->ferr, 1035, "qh_vertexneighbors: determing neighboring facets for each vertex\n")); -+ trace1((qh, qh->ferr, 1035, "qh_vertexneighbors: determining neighboring facets for each vertex\n")); - qh->vertex_visit++; - FORALLfacets { - if (facet->visible) diff -Nru qhull-2015.2/debian/patches/0003-Use-local-version-of-function-index.patch qhull-2020.2/debian/patches/0003-Use-local-version-of-function-index.patch --- qhull-2015.2/debian/patches/0003-Use-local-version-of-function-index.patch 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/debian/patches/0003-Use-local-version-of-function-index.patch 2020-11-11 14:07:33.000000000 +0000 @@ -0,0 +1,21 @@ +From: =?utf-8?q?Timo_R=C3=B6hling?= +Date: Sun, 12 Apr 2020 13:18:00 +0200 +Subject: Use local version of function index + +--- + index.htm | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/index.htm b/index.htm +index d0e7816..748d30e 100644 +--- a/index.htm ++++ b/index.htm +@@ -145,7 +145,7 @@ If you use Qhull 2003.1, please upgrade or apply Changes.txt - change history
    +
  • Qhull code +
  • Performance of Qhull +-
  • Index to Qhull Functions ++
  • Index to Qhull Functions + + +
  • Qhull build systems diff -Nru qhull-2015.2/debian/patches/0004-Build-qhullcpp-as-shared-library.patch qhull-2020.2/debian/patches/0004-Build-qhullcpp-as-shared-library.patch --- qhull-2015.2/debian/patches/0004-Build-qhullcpp-as-shared-library.patch 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/debian/patches/0004-Build-qhullcpp-as-shared-library.patch 2020-11-11 14:07:33.000000000 +0000 @@ -0,0 +1,90 @@ +From: =?utf-8?q?Timo_R=C3=B6hling?= +Date: Wed, 11 Nov 2020 13:51:36 +0100 +Subject: Build qhullcpp as shared library + +--- + CMakeLists.txt | 33 ++++++++++++++++++++++----------- + 1 file changed, 22 insertions(+), 11 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index f50b187..3583916 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -336,6 +336,7 @@ set( + include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src) + + set(qhull_CPP qhullcpp) ++set(qhull_CPPSTATIC qhullcpp_static) + set(qhull_STATIC qhullstatic) + set(qhull_STATICR qhullstatic_r) + set(qhull_SHAREDR qhull_r) +@@ -343,8 +344,8 @@ set(qhull_SHARED libqhull) # Temporarily avoid name conflict with qhull executa + set(qhull_SHAREDP qhull_p) # libqhull and qhull_p are deprecated, use qhull_r instead + + set(qhull_TARGETS_APPLICATIONS qhull rbox qconvex qdelaunay qvoronoi qhalf) +-set(qhull_TARGETS_STATIC ${qhull_CPP} ${qhull_STATIC} ${qhull_STATICR}) +-set(qhull_TARGETS_SHARED ${qhull_SHAREDR}) ++set(qhull_TARGETS_STATIC ${qhull_CPPSTATIC} ${qhull_STATIC} ${qhull_STATICR}) ++set(qhull_TARGETS_SHARED ${qhull_CPP} ${qhull_SHAREDR}) + + set( + qhull_TARGETS_TEST # Unused +@@ -455,17 +456,27 @@ if(UNIX) + endif(UNIX) + + # --------------------------------------- +-# Define C++ static library qhullcpp +-# Do not create libqhullcpp as a shared library. +-# Qhull C++ classes may change layout and size. +-# Qhull C programs use setjmp/longjmp for error handling. ++# Define C++ shared library qhullcpp + # --------------------------------------- + +-add_library(${qhull_CPP} STATIC ${libqhullcpp_SOURCES}) ++add_library(${qhull_CPP} SHARED ${libqhullcpp_SOURCES}) + set_target_properties(${qhull_CPP} PROPERTIES ++ SOVERSION ${qhull_SOVERSION} + VERSION ${qhull_VERSION} + OUTPUT_NAME "${qhull_CPP}$<$:_d>" +- POSITION_INDEPENDENT_CODE "TRUE") ++) ++target_link_libraries(${qhull_CPP} ${qhull_SHAREDR}) ++ ++# --------------------------------------- ++# Define C++ static library qhullcpp ++# --------------------------------------- ++ ++add_library(${qhull_CPPSTATIC} STATIC ${libqhullcpp_SOURCES}) ++set_target_properties(${qhull_CPPSTATIC} PROPERTIES ++ VERSION ${qhull_VERSION} ++ OUTPUT_NAME "${qhull_CPP}$<$:_d>" ++) ++target_link_libraries(${qhull_CPPSTATIC} ${qhull_STATICR}) + + # --------------------------------------- + # if BUILD_STATIC_LIBS=OFF or BUILD_SHARED_LIBS=OFF +@@ -474,12 +485,13 @@ set_target_properties(${qhull_CPP} PROPERTIES + if(NOT ${BUILD_STATIC_LIBS}) + set_target_properties(${qhull_STATIC} PROPERTIES EXCLUDE_FROM_ALL TRUE) + set_target_properties(${qhull_STATICR} PROPERTIES EXCLUDE_FROM_ALL TRUE) +- set_target_properties(${qhull_CPP} PROPERTIES EXCLUDE_FROM_ALL TRUE) ++ set_target_properties(${qhull_CPPSTATIC} PROPERTIES EXCLUDE_FROM_ALL TRUE) + endif() + if(NOT ${BUILD_SHARED_LIBS}) + set_target_properties(${qhull_SHARED} PROPERTIES EXCLUDE_FROM_ALL TRUE) + set_target_properties(${qhull_SHAREDR} PROPERTIES EXCLUDE_FROM_ALL TRUE) + set_target_properties(${qhull_SHAREDP} PROPERTIES EXCLUDE_FROM_ALL TRUE) ++ set_target_properties(${qhull_CPP} PROPERTIES EXCLUDE_FROM_ALL TRUE) + endif() + + # --------------------------------------- +@@ -618,8 +630,7 @@ endif() + + if(${BUILD_STATIC_LIBS}) + add_executable(user_eg3 src/user_eg3/user_eg3_r.cpp) +- # qhull_STATICR must be last, otherwise qh_fprintf,etc. are not loaded from qhull_CPP +- target_link_libraries(user_eg3 ${qhull_CPP} ${qhull_STATICR}) ++ target_link_libraries(user_eg3 ${qhull_CPPSTATIC}) + endif() + + # --------------------------------------- diff -Nru qhull-2015.2/debian/patches/0005-Fix-CMake-target-export.patch qhull-2020.2/debian/patches/0005-Fix-CMake-target-export.patch --- qhull-2015.2/debian/patches/0005-Fix-CMake-target-export.patch 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/debian/patches/0005-Fix-CMake-target-export.patch 2020-11-11 14:07:33.000000000 +0000 @@ -0,0 +1,49 @@ +From: =?utf-8?q?Timo_R=C3=B6hling?= +Date: Wed, 11 Nov 2020 13:57:43 +0100 +Subject: Fix CMake target export + +--- + CMakeLists.txt | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 3583916..e092125 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -688,7 +688,7 @@ endif() + # Define install + # --------------------------------------- + +-set(qhull_TARGETS_INSTALL ${qhull_TARGETS_APPLICATIONS}) ++set(qhull_TARGETS_INSTALL) + if (BUILD_SHARED_LIBS) + list(APPEND qhull_TARGETS_INSTALL ${qhull_TARGETS_SHARED}) + endif() +@@ -702,6 +702,9 @@ install(TARGETS ${qhull_TARGETS_INSTALL} EXPORT QhullTargets + ARCHIVE DESTINATION ${LIB_INSTALL_DIR} + INCLUDES DESTINATION include) + ++install(TARGETS ${qhull_TARGETS_APPLICATIONS} ++ RUNTIME DESTINATION ${BIN_INSTALL_DIR}) ++ + include(CMakePackageConfigHelpers) + + write_basic_package_version_file( +@@ -720,7 +723,7 @@ configure_file(${PROJECT_SOURCE_DIR}/build/config.cmake.in + @ONLY + ) + +-set(ConfigPackageLocation lib/cmake/Qhull) ++set(ConfigPackageLocation ${LIB_INSTALL_DIR}/cmake/Qhull) + install(EXPORT QhullTargets + FILE + QhullTargets.cmake +@@ -739,7 +742,7 @@ install( + Devel + ) + +-set(PkgConfigLocation lib/pkgconfig) ++set(PkgConfigLocation ${LIB_INSTALL_DIR}/pkgconfig) + foreach(pkgconfig IN ITEMS "${qhull_SHAREDR};Qhull reentrant shared library" + "${qhull_STATIC};Qhull static library" + "${qhull_STATICR};Qhull reentrant static library" diff -Nru qhull-2015.2/debian/patches/0006-Build-deprecated-libqhull-for-now.patch qhull-2020.2/debian/patches/0006-Build-deprecated-libqhull-for-now.patch --- qhull-2015.2/debian/patches/0006-Build-deprecated-libqhull-for-now.patch 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/debian/patches/0006-Build-deprecated-libqhull-for-now.patch 2020-11-11 14:07:33.000000000 +0000 @@ -0,0 +1,46 @@ +From: =?utf-8?q?Timo_R=C3=B6hling?= +Date: Wed, 11 Nov 2020 14:00:30 +0100 +Subject: Build deprecated libqhull for now + +--- + CMakeLists.txt | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index e092125..6e6dabd 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -345,7 +345,7 @@ set(qhull_SHAREDP qhull_p) # libqhull and qhull_p are deprecated, use qhull_r i + + set(qhull_TARGETS_APPLICATIONS qhull rbox qconvex qdelaunay qvoronoi qhalf) + set(qhull_TARGETS_STATIC ${qhull_CPPSTATIC} ${qhull_STATIC} ${qhull_STATICR}) +-set(qhull_TARGETS_SHARED ${qhull_CPP} ${qhull_SHAREDR}) ++set(qhull_TARGETS_SHARED ${qhull_CPP} ${qhull_SHAREDR} ${qhull_SHARED}) + + set( + qhull_TARGETS_TEST # Unused +@@ -353,7 +353,7 @@ set( + ) + set( + qhull_TARGETS_DEPRECATED # Unused +- $(qhull_SHARED) $(qhull_SHAREDP) qhullp user_egp ++ $(qhull_SHAREDP) qhullp user_egp + ) + + # --------------------------------------- +@@ -390,7 +390,6 @@ add_library(${qhull_SHARED} SHARED + src/libqhull/qhull-exports.def) + + set_target_properties(${qhull_SHARED} PROPERTIES +- EXCLUDE_FROM_ALL TRUE + SOVERSION ${qhull_SOVERSION} + VERSION ${qhull_VERSION} + OUTPUT_NAME "qhull$<$:_d>") +@@ -745,6 +744,7 @@ install( + set(PkgConfigLocation ${LIB_INSTALL_DIR}/pkgconfig) + foreach(pkgconfig IN ITEMS "${qhull_SHAREDR};Qhull reentrant shared library" + "${qhull_STATIC};Qhull static library" ++ "${qhull_SHARED};Qhull shared library" + "${qhull_STATICR};Qhull reentrant static library" + "${qhull_CPP};Qhull C++ library") + list(GET pkgconfig 0 LIBRARY_NAME) diff -Nru qhull-2015.2/debian/patches/series qhull-2020.2/debian/patches/series --- qhull-2015.2/debian/patches/series 2017-12-09 18:17:01.000000000 +0000 +++ qhull-2020.2/debian/patches/series 2020-11-11 14:07:45.000000000 +0000 @@ -1,3 +1,6 @@ 0001-debianize-test-failure-msg.patch -0002-QHpointer.patch -0003-spelling.patch +0002-Fix-privacy-breach.patch +0003-Use-local-version-of-function-index.patch +0004-Build-qhullcpp-as-shared-library.patch +0005-Fix-CMake-target-export.patch +0006-Build-deprecated-libqhull-for-now.patch diff -Nru qhull-2015.2/debian/README.Debian qhull-2020.2/debian/README.Debian --- qhull-2015.2/debian/README.Debian 2017-12-09 18:17:01.000000000 +0000 +++ qhull-2020.2/debian/README.Debian 2020-11-11 14:07:45.000000000 +0000 @@ -9,6 +9,14 @@ drawn for testing and experimentation using "rbox". +Deprecation Notice +------------------ + +The non-reentrant libqhull is no longer built by default in upstream. You +should port your software to the reentrant libqhull_r library as soon as +possible. libqhull is likely to be discontinued after the 8.0.x releases. + + Registering ----------- @@ -18,3 +26,4 @@ -- Barak A. Pearlmutter , Sun, 4 Dec 2011 20:01:06 +0000 + -- Timo Röhling Wed, 11 Nov 2020 14:30:55 +0100 diff -Nru qhull-2015.2/debian/rules qhull-2020.2/debian/rules --- qhull-2015.2/debian/rules 2017-12-09 18:17:01.000000000 +0000 +++ qhull-2020.2/debian/rules 2022-09-21 01:41:56.000000000 +0000 @@ -3,61 +3,76 @@ # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 -export DEB_BUILD_MAINT_OPTIONS = hardening=+all +export DEB_BUILD_MAINT_OPTIONS = hardening=+all reproducible=+all future=+lfs + +include /usr/share/dpkg/architecture.mk %: - dh $@ --buildsystem=cmake + dh $@ --buildsystem=cmake --with pkgkde_symbolshelper + +override_dh_auto_configure: + dh_auto_configure \ + --buildsystem=cmake \ + --builddir=$(CURDIR)/obj-$(DEB_HOST_GNU_TYPE) \ + -- \ + -DCMAKE_SKIP_RPATH=ON \ + -DINCLUDE_INSTALL_DIR=include \ + -DLINK_APPS_SHARED=ON \ + -DLIB_INSTALL_DIR=lib/$(DEB_HOST_MULTIARCH) \ + -DBIN_INSTALL_DIR=bin \ + -DMAN_INSTALL_DIR=share/man/man1 \ + -DDOC_INSTALL_DIR=share/doc/libqhull-dev/qhull override_dh_auto_build: dh_auto_build - @echo Building man pages + @echo "Building man pages" cd debian && \ - for info in "qconvex:compute the convex hull" \ - "qdelaunay:compute the Delaunay triangulation" \ - "qhalf:halfspace intersection about a point" \ - "qvoronoi:compute the Voronoi diagram" ; do \ + for info in \ + "qconvex:compute the convex hull:qconvex" \ + "qdelaunay:compute the Delaunay triangulation:qdelaun" \ + "qhalf:halfspace intersection about a point:qhalf" \ + "qvoronoi:compute the Voronoi diagram:qvoronoi"; \ + do \ comm=$$(echo $$info | cut -d: -f1) && \ purp=$$(echo $$info | cut -d: -f2) && \ + doc=$$(echo $$info | cut -d: -f3) && \ + COMM=$$(echo $$comm | tr [:lower:] [:upper:]) && \ echo -n Building man page for $$comm... && \ - sed "s/#command#/$$comm/;s/#purpose#/$$purp/" \ - manpage.in > $$comm.xml && \ - docbook2x-man $$comm.xml && \ - echo " done" ; \ + sed -e "s/#command#/$$comm/g" -e "s/#purpose#/$$purp/g" \ + -e "s/#COMMAND#/$$COMM/g" -e "s/#doc#/$$doc/g" \ + manpage.in > $$comm.1 && \ + echo " done"; \ done override_dh_auto_test: - env PATH=$(CURDIR)/src:$${PATH} eg/q_test +ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS))) + env LD_LIBRARY_PATH=$(CURDIR)/obj-$(DEB_HOST_GNU_TYPE) \ + PATH=$(CURDIR)/obj-$(DEB_HOST_GNU_TYPE):$$PATH \ + eg/q_test +endif + +override_dh_auto_install: + dh_auto_install --buildsystem=cmake override_dh_auto_install: dh_auto_install - @echo No need for extra copy of license. - rm --verbose debian/tmp/usr/share/doc/qhull/COPYING.txt || true - @echo No need for doc/ copies of man pages in ../../man/man1/ or for other formats. + @echo "No need for extra copy of license" + rm --verbose debian/tmp/usr/share/doc/libqhull-dev/qhull/COPYING.txt + @echo "No need for doc/ copies of man pages in ../../man/man1/ or for other formats." @for f in qhull rbox; do \ - for ext in man txt htm; do \ - rm --verbose debian/tmp/usr/share/doc/qhull/$$f.$$ext || true; \ + for ext in man txt; do \ + rm --verbose debian/tmp/usr/share/doc/libqhull-dev/qhull/html/$$f.$$ext || true; \ done \ done - @-mv --verbose debian/tmp/usr/lib/libqhullstatic.a debian/tmp/usr/lib/libqhull.a - @-mv --verbose debian/tmp/usr/lib/libqhullstatic_p.a debian/tmp/usr/lib/libqhull_p.a - find debian/tmp/usr/lib -type f -name '*.so*' \ - -exec chrpath --list '{}' ';' \ - -exec chrpath --delete '{}' ';' - @echo 'Convenience links for #include and #include ' - mkdir -p debian/tmp/usr/include/qhull - (cd debian/tmp/usr/include/qhull \ - && ln --verbose -s ../libqhull/* ../libqhullcpp/* ./ \ - && ln --verbose -s libqhull.h qhull.h) - echo Convenience links for backwards compatibility \ - > debian/tmp/usr/include/qhull/README + rm --verbose debian/tmp/usr/share/doc/libqhull-dev/qhull/src/Changes.txt override_dh_installchangelogs: dh_installchangelogs src/Changes.txt override_dh_link: - mkdir -p debian/libqhull-doc/usr/share/doc/libqhull-doc/include - @for f in $$(cd debian/tmp && echo usr/include/libqhull/*.h); do \ - ln --verbose -s /$$f debian/libqhull-doc/usr/share/doc/libqhull-doc/include/; \ + mkdir -p debian/libqhull-doc/usr/share/doc/libqhull-dev/qhull/src/libqhull_r + @for f in $$(cd debian/tmp && echo usr/include/libqhull_r/*.h); do \ + ln --verbose -s /$$f debian/libqhull-doc/usr/share/doc/libqhull-dev/qhull/src/libqhull_r/; \ done dh_link diff -Nru qhull-2015.2/debian/tests/build qhull-2020.2/debian/tests/build --- qhull-2015.2/debian/tests/build 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/debian/tests/build 2020-11-11 14:07:30.000000000 +0000 @@ -0,0 +1,70 @@ +#!/bin/bash +set -e + +tmpdir="$(mktemp -d)" +trap "rm -rf $tmpdir" EXIT + +cd "$tmpdir" + +run() +{ + echo '$' "$@" + "$@" +} + +cat >CMakeLists.txt << EOF +cmake_minimum_required(VERSION 3.0) +project(test_qhull_build LANGUAGES C CXX) + +find_package(Qhull REQUIRED) + +add_executable(test_qhull test_qhull.c) +target_link_libraries(test_qhull Qhull::libqhull) + +add_executable(test_qhull_r test_qhull_r.c) +target_link_libraries(test_qhull_r Qhull::qhull_r) + +add_executable(test_qhullcpp test_qhullcpp.cpp) +target_link_libraries(test_qhullcpp Qhull::qhullcpp) +EOF + +cat >test_qhull.c << EOF +#include + +int main(int argc, char** argv) +{ + QHULL_LIB_CHECK + return 0; +} +EOF + +cat >test_qhull_r.c << EOF +#include + +int main(int argc, char** argv) +{ + QHULL_LIB_CHECK + return 0; +} +EOF + +cat >test_qhullcpp.cpp << EOF +#include + +int main(int argc, char** argv) +{ + QHULL_LIB_CHECK + return 0; +} +EOF + +run cmake . +run make VERBOSE=ON +run ./test_qhull +run ./test_qhull_r +run ./test_qhullcpp + +run gcc -o test_qhull_pkgconfig test_qhull.c `pkg-config --cflags --libs qhull` +run gcc -o test_qhull_r_pkgconfig test_qhull_r.c `pkg-config --cflags --libs qhull_r` +run g++ -o test_qhullcpp_pkgconfig test_qhullcpp.cpp `pkg-config --cflags --libs qhullcpp qhull_r` + diff -Nru qhull-2015.2/debian/tests/compute qhull-2020.2/debian/tests/compute --- qhull-2015.2/debian/tests/compute 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/debian/tests/compute 2020-11-12 17:57:08.000000000 +0000 @@ -0,0 +1,53 @@ +#!/bin/bash +set -e +tmpfile=$(mktemp) +trap "rm $tmpfile" EXIT + +# 2D square with 100 random points inside +rbox 100 c D2 | qconvex p | tee "$tmpfile" +diff -uZ "$tmpfile" - << EOF +2 +4 + -0.5 -0.5 + -0.5 0.5 + 0.5 -0.5 + 0.5 0.5 +EOF +# 2D square with 100 random points on the border +rbox 100 c W0 D2 | qconvex p | tee "$tmpfile" +diff -uZ "$tmpfile" - << EOF +2 +4 + -0.5 -0.5 + -0.5 0.5 + 0.5 -0.5 + 0.5 0.5 +EOF +# 3D cube with 100 random points inside +rbox 100 c D3 | qconvex p |tee "$tmpfile" +diff -uZ "$tmpfile" - << EOF +3 +8 + -0.5 -0.5 -0.5 + -0.5 -0.5 0.5 + -0.5 0.5 -0.5 + -0.5 0.5 0.5 + 0.5 -0.5 -0.5 + 0.5 -0.5 0.5 + 0.5 0.5 -0.5 + 0.5 0.5 0.5 +EOF +# 3D cube with 100 random points on the surfaces +rbox 100 c W0 D3 | qconvex p |tee "$tmpfile" +diff -uZ "$tmpfile" - << EOF +3 +8 + -0.5 -0.5 -0.5 + -0.5 -0.5 0.5 + -0.5 0.5 -0.5 + -0.5 0.5 0.5 + 0.5 -0.5 -0.5 + 0.5 -0.5 0.5 + 0.5 0.5 -0.5 + 0.5 0.5 0.5 +EOF diff -Nru qhull-2015.2/debian/tests/control qhull-2020.2/debian/tests/control --- qhull-2015.2/debian/tests/control 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/debian/tests/control 2020-11-12 17:45:44.000000000 +0000 @@ -0,0 +1,6 @@ +Tests: build +Depends: libqhull-dev, cmake, pkg-config, gcc | c-compiler, g++ | c++-compiler +Restrictions: superficial + +Tests: compute +Depends: qhull-bin diff -Nru qhull-2015.2/debian/upstream/metadata qhull-2020.2/debian/upstream/metadata --- qhull-2015.2/debian/upstream/metadata 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/debian/upstream/metadata 2020-11-11 14:07:30.000000000 +0000 @@ -0,0 +1,4 @@ +Bug-Database: https://github.com/qhull/qhull/issues +Bug-Submit: https://github.com/qhull/qhull/issues/new +Repository: https://github.com/qhull/qhull.git +Repository-Browse: https://github.com/qhull/qhull diff -Nru qhull-2015.2/debian/watch qhull-2020.2/debian/watch --- qhull-2015.2/debian/watch 2017-12-09 18:17:01.000000000 +0000 +++ qhull-2020.2/debian/watch 2020-11-12 12:39:53.000000000 +0000 @@ -1,5 +1,4 @@ -version=3 -http://www.qhull.org/download/qhull-(\d[\d\.]*)-src.*\.tgz - -# Need to manually rename, e.g., this is version 2015.2 -# http://www.qhull.org/download/qhull-2015-src-7.2.0.tgz +version=4 +opts=pagemangle=s/(?i)">\s*download:?\s+qhull\s+(\d\S+)\s+for\s+unix/?version=$1">/g,\ + downloadurlmangle=s/\?version=\d\S+$// \ +http://www.qhull.org/download/ .+\?version=(\d\S+) diff -Nru qhull-2015.2/eg/make-qhull_qh.sh qhull-2020.2/eg/make-qhull_qh.sh --- qhull-2015.2/eg/make-qhull_qh.sh 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/eg/make-qhull_qh.sh 2020-09-01 22:28:17.000000000 +0000 @@ -0,0 +1,160 @@ +#!/bin/bash +# +# make-qhull_qh.sh [libqhull_r] [sed-only] [files] -- Derive src/qhull-qh/ from src/libqhull_r with 'qh' macros +# +# $Id: //main/2019/qhull/eg/make-qhull_qh.sh#3 $$Change: 3037 $ +# $DateTime: 2020/09/03 17:28:32 $$Author: bbarber $ + +if [[ "$1" == "" || "$1" == "--help" ]]; then + echo + echo "eg/make-qhull_qh.sh -- convert reentrant Qhull files for comparison to non-reentrant Qhull files" + echo + echo " eg/make-qhull_qh.sh libqhull_r" + echo " converts 'qh->' to macro 'qh' for src/libqhull_r, src/qhalf, etc." + echo " the default default destination directory is 'src/qhull_qh'" + echo " errors if the destination directory already exists" + echo " override via 'DEST=destination eg/make-qhull_qh.sh ...'" + echo + echo " eg/make-qhull_qh.sh " + echo " specify the source directory list" + echo + echo " eg/make-qhull_qh.sh sed-only src/qhull_qh" + echo " reconvert files in src/qhull_qh via sed scripts" + echo " requires file '_QH_CONVERTED_FILES' as a safety check" + echo + exit 0 +fi +# set -v +SEDONLY=0 +if [[ "$1" == "libqhull_r" ]]; then + SOURCES="src/libqhull_r src/qconvex src/qdelaunay src/qhalf src/qhull src/qvoronoi src/rbox src/testqset_r src/user_eg src/user_eg2" + DEST=${DEST:-src/qhull_qh} + if [[ $# -gt 1 ]]; then + echo "eg/make-qhull_qh.sh: 'libqhull_r' does not take source directories. It converts qhull files in '$SOURCES' to '$DEST'" + exit 1 + fi +elif [[ "$1" == "sed-only" ]]; then + SEDONLY=1 + if [[ $# -ne 2 ]]; then + echo "eg/make-qhull_qh.sh: 'sed-only' requires the destination directory, 'src/qhull_qh' + exit 1 + fi + DEST=$2 + if [[ ! -f $DEST/_QH_CONVERTED_FILES ]]; then + echo "eg/make-qhull_qh.sh: 'sed-only' is missing '$DEST/_QH_CONVERTED_FILES'. Run 'eg/make-qhull_qh.sh libqhull_r' first. + exit 1 + fi +else + SOURCES="$@" + DEST=${DEST:-src/qhull_qh} +fi + +if [[ $SEDONLY -ne 1 ]]; then + if [[ -d $DEST ]]; then + echo "To rebuild '$DEST' from '$SOURCES'" + if [[ "$DEST" == "src/qhull_qh" ]]; then + echo " make cleanall; eg/make-qhull_qh.sh $@" + else + echo " rm -rf '$DEST'; eg/make-qhull_qh.sh $@" + fi + exit 1 + fi + for F in $SOURCES; do + if [[ ! -d $F && ! -r $F ]]; then + echo "eg/make-qhull_qh.sh: source '$F' not found. Execute make-qhull_qh.sh from a Qhull directory with $SOURCES" + exit 1 + fi + done + echo eg/make-qhull_qh.sh: Create "'$DEST/' from '$SOURCES'" + mkdir $DEST || exit 1 + echo -e "eg/make-qhull_qh.sh created '$DEST' to compare reentrant with non-reentrant Qhull" >$DEST/README.txt + echo -e "\nSource directories and files -- $SOURCES" >>$DEST/README.txt + echo -e "\n'make cleanall' deletes 'src/qhull_qh/'\n" >>$DEST/README.txt + date >>$DEST/README.txt + touch $DEST/_QH_CONVERTED_FILES + for X in $SOURCES; do + if [[ -d $X ]]; then + for F in $X/*_r.* $X/*_ra.* $X/*.def; do + if [[ -f $F ]]; then + G="$(echo ${F##*/} | sed -e 's/_r\././' -e 's/_ra\./_a./')" + # echo "$F => $DEST/$G" + cp -p $F $DEST/$G || exit 1 + fi + done + if [[ -f $X/Makefile && ! -f $DEST/Makefile ]]; then + cp -p $X/Makefile $DEST/ || exit 1 + fi + if [[ -f $X/index.htm && ! -f $DEST/index.htm ]]; then + cp -p $X/index.htm $DEST/ || exit 1 + fi + elif [[ -f $X ]]; then + G="$(echo ${X##*/} | sed -e 's/_r\././' -e 's/_ra\./_a./')" + # echo "$X => $DEST/$G" + cp -p $X $DEST/$G || exit 1 + fi + done +fi + +echo Convert 'qh->' to 'qh ', etc. +if [[ -w $DEST/Makefile ]]; then + sed -i -r \ + -e 's/_r$//' \ + -e 's/_r / /g' \ + -e 's|_r/|/|g' \ + -e 's/_r\.a/.a/g' \ + -e 's/_r\.c/.c/g' \ + -e 's/_r\.h/.h/g' \ + -e 's/_r\.o/.o/g' \ + -e 's/_ra\.h/_a.h/g' \ + $DEST/Makefile || exit 1 +fi +for F in $DEST/*.c $DEST/*.h; do + sed -i -r \ + -e 's/\(qhT \*qh, /(/' \ + -e ' /ifdef __cplusplus/,/^$/ d' \ + -e 's/\(qhT \*qh(.*)\)/(void\1)/' \ + -e 's/_r$//' \ + -e 's/_r([ /:])/\1/g' \ + -e 's/_r\.c/.c/g' \ + -e 's/_r\.h/.h/g' \ + -e 's/_r\.o/.o/g' \ + -e 's/_ra\.h/_a.h/g' \ + -e 's/ \|\| \!qh\)/)/' \ + -e 's/_rbox\(qh, qh->/_rbox(rbox./' \ + -e ' /QHULL_UNUSED\(qh\)/ d' \ + -e 's/qh->rbox_([^c])/rbox.\1/g' \ + -e 's/\(qh, (.*) \)$/( \1 )/' \ + -e 's/\(qh, (.*) \) \{ \.\.\. \}$/( \1 ) { ... }/' \ + -e 's/\(qh *\)$/( )/' \ + -e 's/\(qhB?, /(/g' \ + -e 's/\(qhB?\)/()/g' \ + -e 's/\(qh /(/g' \ + -e 's/qh->qhmem/qhmem/g' \ + -e 's/qh->qhstat\./qhstat /g' \ + -e 's/qh->/qh /g' \ + -e 's/qhull_r-/qhull-/g' \ + -e "s/Needed for qhT in libqhull.h/Needed for qhT in libqhull_r.h. Here for compatibility/" \ + -e ' /ifdef __cplusplus/,/^$/ d' \ + -e ' /qh may be NULL/ d' \ + -e ' /For libqhull_r,/ d' \ + -e ' /reentrant only/ d' \ + -e ' /assumes qh defined/ d' \ + -e ' /^ *\/\*.*\.cpp -- / d' \ + $F + # sed requires space before search expressions, /.../ + if which u2d >/dev/null 2>&1; then + u2d $F + fi +done +for F in $DEST/*.htm; do + sed -i -r \ + -e 's|_r/|/|g' \ + -e 's/_r\.c/.c/g' \ + -e 's/_r\.h/.h/g' \ + -e 's/_ra\.h/_a.h/g' \ + $F + if which u2d >/dev/null 2>&1; then + u2d $F + fi +done +echo -e "\nCompare '$DEST' to 'src/libqhull', 'src/qdelaunay', etc. Do not ignore minor differences." diff -Nru qhull-2015.2/eg/make-vcproj.sh qhull-2020.2/eg/make-vcproj.sh --- qhull-2015.2/eg/make-vcproj.sh 2016-01-19 03:41:58.000000000 +0000 +++ qhull-2020.2/eg/make-vcproj.sh 2019-05-22 14:40:34.000000000 +0000 @@ -1,36 +1,131 @@ #!/bin/bash # -# make-vcproj.sh -- Make sln and vcproj files from CMakeLists.txt and qhull-all.pro +# make-vcproj.sh YYMMDD -- Make sln and vcproj files from CMakeLists.txt and qhull-all.pro +# eg/make-vcproj.sh qhull-x -- Derive src/qhull-x/ from src/libqhull_r # -# CMake vcproj files includes absolute paths and does not handle 'd' annotatios for debug versions -# Remove CMake targets -# Change absolute paths to '../...' +# Design +# CMake vcproj files includes absolute paths and does not handle 'd' annotatios for debug versions +# Remove CMake targets +# Change absolute paths to '../..' # Append '_d' to debug products # Write targets to '../lib/' and ../bin/' # -# $Id: //main/2015/qhull/eg/make-vcproj.sh#4 $$Change: 2070 $ -# $DateTime: 2016/01/18 22:45:12 $$Author: bbarber $ +# $Id: //main/2019/qhull/eg/make-vcproj.sh#1 $$Change: 2661 $ +# $DateTime: 2019/05/24 20:09:58 $$Author: bbarber $ -if [[ "$1" != "" && "$1" != "Win64" && "$1" != "sed-only" ]]; then - echo "eg/make-vcproj.sh [Win64] [sed-only]" +if [[ "$1" != "" && "$1" != "Win64" && "$1" != "qhull-x" && "$1" != "sed-only" ]]; then + echo "eg/make-vcproj.sh Win64|sed-only|qhull-x" echo "Written for 'sed 4.0.7', 'Visual Studio 11 2012 Win64', and 'Visual Studio 8 2005'" echo "Other variations are likely to fail" exit fi -if [[ "$1" == "Win64" ]]; then +if [[ "$1" == "qhull-x" ]]; then + set -v + win64=1 + if [[ ! -w build/qhull.sln || ! -r build/qhull-64.vcxproj || ! -d src/libqhull_r ]]; then + echo "Excute 'eg/make-vcproj.sh qhull-x' from qhull directory with build/qhull.sln, build/qhull-64.vcxproj, src/libqhull_r" + exit + fi + + SOURCEDIR=. + SOURCE=$SOURCEDIR/src/libqhull_r + SOURCE2=$SOURCEDIR/src/qhull + SOURCE3=$SOURCEDIR/src/rbox + DEST=/c/bash/local/qhull/src/qhull-x + DEST2=$DEST + # SOURCE=../qhull-y/src/libqhull_r + # SOURCE2=src/qhull + # DEST=src/qhull-x + # DEST2=../../../qhull/$DEST # relative to SOURCE + if [[ -d $DEST ]]; then + echo "To rebuild $DEST from $SOURCE and $SOURCE2 -- rm -r $DEST; eg/make-vcproj.sh qhull-x" + else + echo Create $DEST from $SOURCE and $SOURCE2 + mkdir $DEST || exit 1 + pushd $SOURCE || exit 1 + sed -e 's/_r/_x/g' -e 's/_xbox/_rbox/g' Makefile >$DEST2/Makefile || exit 1 + for F in *_r.c; do + G=${F%_r.c}_x.c; echo $G; cp -p $F $DEST2/$G || exit 1 + done + for F in *_r.h; do + G=${F%_r.h}_x.h; echo $G; cp -p $F $DEST2/$G || exit 1 + done + for F in *_ra.h; do + G=${F%_ra.h}_xa.h; echo $G; cp -p $F $DEST2/$G || exit 1 + done + popd + pushd $SOURCE2 || exit 1 + for F in *_r.c; do + G=${F%_r.c}_x.c; echo $G; cp -p $F $DEST2/$G || exit 1 + done + popd + pushd $SOURCE3 || exit 1 + for F in *_r.c; do + G=${F%_r.c}_x.c; echo $G; cp -p $F $DEST2/$G || exit 1 + done + popd + + echo "Substitute *_x for *_r" + sed -i 's/_r\.h/_x.h/' $DEST/* + sed -i 's/_ra\.h/_xa.h/' $DEST/* + sed -i 's|libqhull_r/libqhull_x|libqhull_x|' $DEST/* + sed -i 's|libqhull_r/random_x|random_x|' $DEST/* + + echo "Restrict Makefile to qhull-x and rbox" + sed -i ' /^all. / s/qhull_links//' $DEST/Makefile + sed -i ' /-f .*exe/ s/qconvex.*exe/core rbox qhull-x *.exe/' $DEST/Makefile + sed -i ' /-p .*BINDIR/ s/qconvex.*rbox/qhull-x/' $DEST/Makefile + sed -i ' /-o qhull/ s/qhull/qhull-x/' $DEST/Makefile + sed -i '\|\./qhull| s/qhull/qhull-x/' $DEST/Makefile + sed -i 's|\.\./qconvex.*|unix_x.c|' $DEST/Makefile + sed -i ' /^qhull_all. / s/qconvex.*testqset_x.o/unix_x.o rbox_x.o/' $DEST/Makefile + for D in qconvex qdelaunay qhalf qvoronoi user_eg testqset libqhullstatic DOCDIR INCDIR LIBDIR MANDIR; do + sed -i " /$D/ d" $DEST/Makefile + done + sed -i " /ln -s / d" $DEST/Makefile + fi + + pushd build/ || exit 1 + SOURCE=../src/qhull-x + VCXPROJ=qhull-x-64.vcxproj + GUID=3192557A-C34A-426E-A51B-2BCE463EAD02 + VCXPROJ2=qhull-64.vcxproj + GUID2=E8BF0EA0-A09D-4155-BCEC-CC1B0DF8A67E + echo Create $VCXPROJ from $VCXPROJ2 + if ! grep $GUID qhull-64.sln >/dev/null; then + echo add GUID for $VCXPROJ to qhull-64.sln -- $GUID + fi + cp $VCXPROJ2 $VCXPROJ || exit 1 + grep $GUID2 $VCXPROJ2 >/dev/null || (echo unknown GUID for $VCXPROJ2 -- $GUID2; exit 1) + sed -i s/$GUID2/$GUID/g $VCXPROJ + sed -i 's/ProjectReference Include=.*/ProjectReference>/' $VCXPROJ + sed -i 's/.*//' $VCXPROJ + # need to delete 3 lines + sed -i -r 's/;...lib.qhullstatic_rd?.lib//' $VCXPROJ + sed -i 's/qhull/qhull-x/g' $VCXPROJ + # Since qhull pulls object files from libqhullstatic_r.lib, order unknown, may be in specified order + for F in $SOURCE/*_x.h; do + sed -i " /ClCompile.*_r.c/ i " $VCXPROJ + done + for F in $SOURCE/*_x.c; do + sed -i " /ClCompile.*_r.c/ i " $VCXPROJ + done + sed -i ' /_r.c/ d' $VCXPROJ + popd + exit +elif [[ "$1" == "Win64" ]]; then if [[ "$2" != "" && "$2" != "sed-only" ]]; then - echo "working/make-vcproj.sh [Win64] [sed-only]" - exit + echo "eg/make-vcproj.sh [Win64] [sed-only]" + exit fi win64=1 else win64=0 fi - if [[ "$1" == "sed-only" || "$2" == "sed-only" ]]; then echo Skip creating buildvc/ and buildqt/ -else # Matches 'sed-only' +else # else execute to 'fi ... sed-only' if [[ ! -f CMakeLists.txt || ! -f src/qhull-all.pro ]]; then echo "Excute eg/make-vcproj.sh from qhull directory with CMakeLists.txt and src/qhull-all.pro" @@ -80,7 +175,7 @@ echo -n $f if [[ ! ${f##*INSTALL*} || ! ${f##*ALL_BUILD*} || ! ${f##*ZERO_CHECK*} || ! ${f##*RUN_TESTS*} ]]; then echo " removed" - continue + continue fi if [[ $win64 -eq 1 ]]; then ext=${f##*.} @@ -88,87 +183,87 @@ base=${base%.*} dest=build/$base-64.$ext echo " => $dest" - # sed requires a blank or \ before address ranges - # sed requires a \/ for s|...|...| ! - # the ConfigurationType clauses depend on Debug being first - sed -r \ - -e ' /CustomBuild.*CMake/,/CustomBuild/ d' \ - -e ' /ZERO_CHECK/,/ProjectReference/ d' \ - -e ' />qhulltest/ s|[cC]:\\bash\\local\\qhull|..\\..|g' \ - -e ' />qhulltest/ s|[cC]:\/bash\/local\/qhull|..\/..|g' \ - -e 's|[cC]:\\bash\\local\\qhull|..|g' \ - -e 's|[cC]:\/bash\/local\/qhull|..|g' \ - -e '\|CMake| d' \ - -e '\|VCWebServiceProxyGeneratorTool| d' \ - -e 's/;CMAKE_INTDIR=[^;]*;/;/' \ - -e 's/;[a-zA-Z]*\\([_a-z0-9]*\.lib[;<])/;..\\lib\\\1/g' \ - -e ' /LinkIncremental/ s/true/false/' \ - -e 's/buildvc/build/g' \ - -e 's/buildqt/build/g' \ - -e 's/c:\\qt\\[0-9]\.[0-9]\.[0-9]/\$(QTDIR)/g' \ - -e 's|..\/build\/[a-zA-Z]*[\\/]([_a-z0-9]*.pdb)|..\/bin\/\1|g' \ - -e 's|..\/build\/[a-zA-Z]*[\\/]([_a-z0-9]*.exe)|..\/bin\/\1|g' \ - -e 's|..\/build\/[a-zA-Z]*[\\/]([_a-z0-9]*.lib)|..\/lib\/\1|g' \ - -e 's|..\/build\/[a-zA-Z]*[\\/]([_a-z0-9]*.dll)|..\/bin\/\1|g' \ - -e 's| [a-zA-Z]*[\\/]([_a-z0-9]*\.lib)| ..\\lib\\\1|g' \ - -e 's/"([_a-z0-9]*.exe)/"..\\bin\\\1/g' \ - -e ' /ConfigurationType>Application/,/ClInclude/ s/(OutDir.*\.\.)[\\a-zA-Z]*DynamicLibrary/,/ClInclude/ s/(OutDir.*\.\.)[\\a-zA-Z]*DynamicLibrary/,/ImportLibrary/ s/(ImportLibrary.*_[rp])\.libDynamicLibrary/,/ImportLibrary/ s/(ImportLibrary.*[^d])\.libDynamicLibrary/,/TargetName.*Debug/ s/(TargetName.*_[pr])DynamicLibrary/,/TargetName.*Debug/ s/(TargetName.*Debug.*[^d])DynamicLibrary/,/ProgramDataBaseFile/ s/(ProgramDataBaseFile.*_[pr])\.pdb/\1d.pdb/' \ - -e ' /ConfigurationType>DynamicLibrary/,/ProgramDataBaseFile/ s/(ProgramDataBaseFile.*[^d])\.pdb/\1_d.pdb/' \ - -e ' /ConfigurationType>StaticLibrary/,/ClInclude/ s/(OutDir.*\.\.)[\\a-zA-Z]*StaticLibrary/,/ImportLibrary/ s/(ImportLibrary.*_[rp])\.libStaticLibrary/,/ImportLibrary/ s/(ImportLibrary.*[^d])\.libStaticLibrary/,/TargetName.*Debug/ s/(TargetName.*_[pr])StaticLibrary/,/TargetName.*Debug/ s/(TargetName.*Debug.*[^d])StaticLibrary/,/ProgramDataBaseFile/ s/(ProgramDataBaseFile.*_[pr])\.pdb/\1d.pdb/' \ - -e ' /ConfigurationType>StaticLibrary/,/ProgramDataBaseFile/ s/(ProgramDataBaseFile.*[^d])\.pdb/\1_d.pdb/' \ - -e ' /ItemDefinitionGroup.*Debug/,/AdditionalDependencies/ s/(AdditionalDependencies.*_r)\.lib/\1d.lib/g' \ - -e ' /ItemDefinitionGroup.*Debug/,/AdditionalDependencies/ s/(AdditionalDependencies.*qhull[a-z]*[^d])\.lib/\1_d.lib/g' \ - -e ' /AdditionalDependencies/ s/;[a-zA-Z]*\\/;..\\lib\\/g' \ - -e 's/[cC]:\\[qQ]t\\[qQt0-9.\\]*msvc[_0-9]*/\$(QTDIR)/g' \ - -e 's/[cC]:\\[qQ]t\\[qQt0-9.\\]*/\$(QTDIR)\\..\\/g' \ - -e 's/([|>])Win32/\1x64/' \ - -e 's/machine:X86/machine:x64/' \ - -e 's/\.vcxproj/-64.vcxproj/' \ - $f | awk '//{ next } / $dest + # sed requires a blank or \ before address ranges + # sed requires a \/ for s|...|...| ! + # the ConfigurationType clauses depend on Debug being first + sed -r \ + -e ' /CustomBuild.*CMake/,/CustomBuild/ d' \ + -e ' /ZERO_CHECK/,/ProjectReference/ d' \ + -e ' />qhulltest/ s|[cC]:\\bash\\local\\qhull|..\\..|g' \ + -e ' />qhulltest/ s|[cC]:\/bash\/local\/qhull|..\/..|g' \ + -e 's|[cC]:\\bash\\local\\qhull|..|g' \ + -e 's|[cC]:\/bash\/local\/qhull|..|g' \ + -e '\|CMake| d' \ + -e '\|VCWebServiceProxyGeneratorTool| d' \ + -e 's/;CMAKE_INTDIR=[^;]*;/;/' \ + -e 's/;[a-zA-Z]*\\([_a-z0-9]*\.lib[;<])/;..\\lib\\\1/g' \ + -e ' /LinkIncremental/ s/true/false/' \ + -e 's/buildvc/build/g' \ + -e 's/buildqt/build/g' \ + -e 's/c:\\qt\\[0-9]\.[0-9]\.[0-9]/\$(QTDIR)/g' \ + -e 's|..\/build\/[a-zA-Z]*[\\/]([_a-z0-9]*.pdb)|..\/bin\/\1|g' \ + -e 's|..\/build\/[a-zA-Z]*[\\/]([_a-z0-9]*.exe)|..\/bin\/\1|g' \ + -e 's|..\/build\/[a-zA-Z]*[\\/]([_a-z0-9]*.lib)|..\/lib\/\1|g' \ + -e 's|..\/build\/[a-zA-Z]*[\\/]([_a-z0-9]*.dll)|..\/bin\/\1|g' \ + -e 's| [a-zA-Z]*[\\/]([_a-z0-9]*\.lib)| ..\\lib\\\1|g' \ + -e 's/"([_a-z0-9]*.exe)/"..\\bin\\\1/g' \ + -e ' /ConfigurationType>Application/,/ClInclude/ s/(OutDir.*\.\.)[\\a-zA-Z]*DynamicLibrary/,/ClInclude/ s/(OutDir.*\.\.)[\\a-zA-Z]*DynamicLibrary/,/ImportLibrary/ s/(ImportLibrary.*_[rp])\.libDynamicLibrary/,/ImportLibrary/ s/(ImportLibrary.*[^d])\.libDynamicLibrary/,/TargetName.*Debug/ s/(TargetName.*_[pr])DynamicLibrary/,/TargetName.*Debug/ s/(TargetName.*Debug.*[^d])DynamicLibrary/,/ProgramDataBaseFile/ s/(ProgramDataBaseFile.*_[pr])\.pdb/\1d.pdb/' \ + -e ' /ConfigurationType>DynamicLibrary/,/ProgramDataBaseFile/ s/(ProgramDataBaseFile.*[^d])\.pdb/\1_d.pdb/' \ + -e ' /ConfigurationType>StaticLibrary/,/ClInclude/ s/(OutDir.*\.\.)[\\a-zA-Z]*StaticLibrary/,/ImportLibrary/ s/(ImportLibrary.*_[rp])\.libStaticLibrary/,/ImportLibrary/ s/(ImportLibrary.*[^d])\.libStaticLibrary/,/TargetName.*Debug/ s/(TargetName.*_[pr])StaticLibrary/,/TargetName.*Debug/ s/(TargetName.*Debug.*[^d])StaticLibrary/,/ProgramDataBaseFile/ s/(ProgramDataBaseFile.*_[pr])\.pdb/\1d.pdb/' \ + -e ' /ConfigurationType>StaticLibrary/,/ProgramDataBaseFile/ s/(ProgramDataBaseFile.*[^d])\.pdb/\1_d.pdb/' \ + -e ' /ItemDefinitionGroup.*Debug/,/AdditionalDependencies/ s/(AdditionalDependencies.*_r)\.lib/\1d.lib/g' \ + -e ' /ItemDefinitionGroup.*Debug/,/AdditionalDependencies/ s/(AdditionalDependencies.*qhull[a-z]*[^d])\.lib/\1_d.lib/g' \ + -e ' /AdditionalDependencies/ s/;[a-zA-Z]*\\/;..\\lib\\/g' \ + -e 's/[cC]:\\[qQ]t\\[qQt0-9.\\]*msvc[_0-9]*/\$(QTDIR)/g' \ + -e 's/[cC]:\\[qQ]t\\[qQt0-9.\\]*/\$(QTDIR)\\..\\/g' \ + -e 's/([|>])Win32/\1x64/' \ + -e 's/machine:X86/machine:x64/' \ + -e 's/\.vcxproj/-64.vcxproj/' \ + $f | awk '//{ next } / $dest else dest=build/${f##*\/} - # sed requires a blank or \ before address ranges - sed -r -e 's|[cC]:\\bash\\local\\qhull|..|g' \ - -e 's|[cC]:/bash/local/qhull|..|g' \ - -e '\|CMake| d' \ - -e '\|VCWebServiceProxyGeneratorTool| d' \ - -e 's/;CMAKE_INTDIR=..quot;[A-Za-z]*..quot;//' \ - -e 's/LinkIncremental="2"/LinkIncremental="1"/' \ - -e 's/RuntimeLibrary[=]/RuntimeTypeInfo="false" RuntimeLibrary=/' \ - -e 's/.*RuntimeTypeInfo."TRUE".*//' \ - -e 's/buildvc/build/g' \ - -e 's/buildqt/build/g' \ - -e 's/\.\.\\\.\./../g' \ - -e 's|\.\./\.\.|..|g' \ - -e 's/c:\\qt\\[0-9]\.[0-9]\.[0-9]/\$(QTDIR)/g' \ - -e 's|..\\build\\[a-zA-Z]*[\\/]([_a-z0-9]*.pdb)|..\\bin\\\1|g' \ - -e 's|..\\build\\[a-zA-Z]*[\\/]([_a-z0-9]*.exe)|..\\bin\\\1|g' \ - -e 's|..\\build\\[a-zA-Z]*[\\/]([_a-z0-9]*.lib)|..\\lib\\\1|g' \ - -e 's|..\\build\\[a-zA-Z]*[\\/]([_a-z0-9]*.dll)|..\\bin\\\1|g' \ - -e 's| [a-zA-Z]*[\\/]([_a-z0-9]*\.lib)| ..\\lib\\\1|g' \ - -e 's/"([_a-z0-9]*.exe)/"..\\bin\\\1/g' \ - -e ' /Name="Debug/,/OutputFile/ s/(OutputFile.*_[rp])\.(dll|lib)"/\1d.\2"/' \ - -e ' /Name="Debug/,/OutputFile/ s/(OutputFile.*[^d])\.(dll|lib)"/\1_d.\2"/' \ - -e ' /Name="Debug/,/ImportLibrary/ s/(ImportLibrary.*_[rp])\.lib"/\1d.lib"/' \ - -e ' /Name="Debug/,/ImportLibrary/ s/(ImportLibrary.*[^d])\.lib"/\1_d.lib"/' \ - -e ' /Name="Debug/,/AdditionalDependencies/ s/(AdditionalDependencies.*_[rp])\.lib/\1d.lib/' \ - -e ' /Name="Debug/,/AdditionalDependencies/ s/(AdditionalDependencies.*qhull[a-z]*[^d])\.lib/\1_d.lib/' \ - -e ' /Name="Debug/,/ProgramDatabaseFile/ s/(ProgramDatabaseFile.*_r)\.pdb/\1d.pdb/' \ - -e ' /Name="Debug/,/ProgramDatabaseFile/ s/(ProgramDatabaseFile.*qhull[a-z]*[^d])\.pdb/\1_d.pdb/' \ - -e 's/[cC]:\\Qt\\[0-9.]*/\$(QTDIR)/g' \ - -e 's/\.vcxproj/-32.vcxproj/' \ - $f | awk '//{ next } / $dest + # sed requires a blank or \ before address ranges + sed -r -e 's|[cC]:\\bash\\local\\qhull|..|g' \ + -e 's|[cC]:/bash/local/qhull|..|g' \ + -e '\|CMake| d' \ + -e '\|VCWebServiceProxyGeneratorTool| d' \ + -e 's/;CMAKE_INTDIR=..quot;[A-Za-z]*..quot;//' \ + -e 's/LinkIncremental="2"/LinkIncremental="1"/' \ + -e 's/RuntimeLibrary[=]/RuntimeTypeInfo="false" RuntimeLibrary=/' \ + -e 's/.*RuntimeTypeInfo."TRUE".*//' \ + -e 's/buildvc/build/g' \ + -e 's/buildqt/build/g' \ + -e 's/\.\.\\\.\./../g' \ + -e 's|\.\./\.\.|..|g' \ + -e 's/c:\\qt\\[0-9]\.[0-9]\.[0-9]/\$(QTDIR)/g' \ + -e 's|..\\build\\[a-zA-Z]*[\\/]([_a-z0-9]*.pdb)|..\\bin\\\1|g' \ + -e 's|..\\build\\[a-zA-Z]*[\\/]([_a-z0-9]*.exe)|..\\bin\\\1|g' \ + -e 's|..\\build\\[a-zA-Z]*[\\/]([_a-z0-9]*.lib)|..\\lib\\\1|g' \ + -e 's|..\\build\\[a-zA-Z]*[\\/]([_a-z0-9]*.dll)|..\\bin\\\1|g' \ + -e 's| [a-zA-Z]*[\\/]([_a-z0-9]*\.lib)| ..\\lib\\\1|g' \ + -e 's/"([_a-z0-9]*.exe)/"..\\bin\\\1/g' \ + -e ' /Name="Debug/,/OutputFile/ s/(OutputFile.*_[rp])\.(dll|lib)"/\1d.\2"/' \ + -e ' /Name="Debug/,/OutputFile/ s/(OutputFile.*[^d])\.(dll|lib)"/\1_d.\2"/' \ + -e ' /Name="Debug/,/ImportLibrary/ s/(ImportLibrary.*_[rp])\.lib"/\1d.lib"/' \ + -e ' /Name="Debug/,/ImportLibrary/ s/(ImportLibrary.*[^d])\.lib"/\1_d.lib"/' \ + -e ' /Name="Debug/,/AdditionalDependencies/ s/(AdditionalDependencies.*_[rp])\.lib/\1d.lib/' \ + -e ' /Name="Debug/,/AdditionalDependencies/ s/(AdditionalDependencies.*qhull[a-z]*[^d])\.lib/\1_d.lib/' \ + -e ' /Name="Debug/,/ProgramDatabaseFile/ s/(ProgramDatabaseFile.*_r)\.pdb/\1d.pdb/' \ + -e ' /Name="Debug/,/ProgramDatabaseFile/ s/(ProgramDatabaseFile.*qhull[a-z]*[^d])\.pdb/\1_d.pdb/' \ + -e 's/[cC]:\\Qt\\[0-9.]*/\$(QTDIR)/g' \ + -e 's/\.vcxproj/-32.vcxproj/' \ + $f | awk '//{ next } / $dest fi # grep -E '\.\.[\\/]|_[a-z]?d[^a-z]' $dest done @@ -179,42 +274,42 @@ echo Create qhull-64.sln sed -r \ -e '\|Project.*ALL_BUILD|,\|EndProject$| d' \ - -e '\|Project.*INSTALL|,\|EndProject$| d' \ - -e '\|Project.*ZERO_CHECK|,\|EndProject$| d' \ - -e '\|Project.*RUN_TESTS|,\|EndProject$| d' \ - -e '\|ProjectDependencies|,\| = | s/^.* = \{.*$//' \ - -e 's/\.vcxproj/-64.vcxproj/' \ - buildvc/qhull.sln >build/qhull-64.sln + -e '\|Project.*INSTALL|,\|EndProject$| d' \ + -e '\|Project.*ZERO_CHECK|,\|EndProject$| d' \ + -e '\|Project.*RUN_TESTS|,\|EndProject$| d' \ + -e '\|ProjectDependencies|,\| = | s/^.* = \{.*$//' \ + -e 's/\.vcxproj/-64.vcxproj/' \ + buildvc/qhull.sln >build/qhull-64.sln echo Create qhull-32.sln from qhull-64 with 32 GUIDs # Need to keep the original GUIDs. Otherwise get -- can't locate project '' sed -r \ - -e 's/-64\.vcxproj/-32.vcxproj/' \ - -e 's/([|>])x64/\1Win32/g' \ - build/qhull-64.sln >build/qhull-32.sln + -e 's/-64\.vcxproj/-32.vcxproj/' \ + -e 's/([|>])x64/\1Win32/g' \ + build/qhull-64.sln >build/qhull-32.sln echo Create *-32.vcxproj with 32 GUIDs for f in build/*-64.vcxproj build/qhulltest/*-64.vcxproj; do - dest=${f%64.vcxproj}32.vcxproj + dest=${f%64.vcxproj}32.vcxproj sed -r \ - -e 's/([|>])x64/\1Win32/' \ - -e 's/machine:x64/machine:X86/' \ - $f >$dest + -e 's/([|>])x64/\1Win32/' \ + -e 's/machine:x64/machine:X86/' \ + $f >$dest done echo Convert vcxproj/sln files to DOS format for f in build/*.vcxproj build/*-32.sln build/*-64.sln; do - u2d $f + u2d $f done else sed -e '\|Project.*ALL_BUILD|,\|EndProject$| d' \ - -e '\|Project.*INSTALL|,\|EndProject$| d' \ - -e '\|Project.*ZERO_CHECK|,\|EndProject$| d' \ - -e '\|Project.*RUN_TESTS|,\|EndProject$| d' \ - buildvc/qhull.sln >build/qhull.sln + -e '\|Project.*INSTALL|,\|EndProject$| d' \ + -e '\|Project.*ZERO_CHECK|,\|EndProject$| d' \ + -e '\|Project.*RUN_TESTS|,\|EndProject$| d' \ + buildvc/qhull.sln >build/qhull.sln echo Convert vcproj/sln files to DOS format for f in build/*.vcproj build/*.sln; do - u2d $f + u2d $f done fi @@ -222,8 +317,10 @@ echo 'Add qhulltest.vcproj to qhull.sln' echo ' Open qhull.sln with DevStudio' echo ' Add build/qhulltest/qhulltest.vcproj or qhulltest-64.vcxproj' -echo ' Add dependencies on qhullcpp and qhullstatic_r' +echo ' Add dependencies on qhullcpp (user_eg3, qhulltest)' +echo ' Add dependencies on qhullstatic (rbox, qconvex, etc)' +echo ' Add dependencies on qhullstatic_r (qhull, user_eg2)' +echo ' Add dependencies on libqhull_r (user_eg) and qhullstatic_r' echo ' Remove qhulltest via Configuration Manager from Release,Debug,etc. Qt is optional' echo echo 'Update Perforce for build/...vcproj, otherwise qhull-zip.sh will revert the files' - diff -Nru qhull-2015.2/eg/q_benchmark qhull-2020.2/eg/q_benchmark --- qhull-2015.2/eg/q_benchmark 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/eg/q_benchmark 2020-06-05 14:57:36.000000000 +0000 @@ -0,0 +1,705 @@ +#!/bin/sh +# +# eg/q_benchmark [test] [precision-count] [other-count] [pinched-count] [time-count]" +# Time and precision benchmark for qhull using eg/qtest.sh +# +# With negative counts, compare output with Beyond Compare. Aligns on '^Test.?.?.? -- ' +# Session > Session Settings.. > Alignment > Skew Tolerance > 5000 +# +# To compare various choices for facet merging (e.g., merge_r.c/qh_next_facetmerge) +# T=A_LT_T_LT_6; ../eg/q_benchmark 0 -6 -6 | tee $T.log | grep -E '^== |Maximum|error' | tee $T.err; echo $T $(grep error $T.err | wc -l) +# +# Use 'gcc -O3' via libqhull/Makefile +# +# $Id: //main/2019/qhull/eg/q_benchmark#5 $$DateTime: 2020/06/05 16:33:18 $ +# $Change: 2967 $$Author: bbarber $ + +function log { #message + echo "$1" | tee -a $QH_APPEND_DEST | tee -a $QH_APPEND_SHOW +} + +# set -v # echo commands to stdout + +if [[ "$1" == "test" ]]; then + TEST_QTEST=1 + shift +fi + +N_PRECISION=${1:-0} +FUZZY_CUBE=1 +NARROW_LENSE=1 +CONE=1 + +N_OTHER=${2:-0} +DELAUNAY_CIRCLE=1 +LENSE_SIZE=0 # not repeatable +LENSE_GAP=0 # not repeatable + +N_PINCHED=${3:-0} # Q14 -- merge pinched vertices +CUBE_PAIRS=1 +DELAUNAY_PAIRS=1 +CIRCLE_PAIRS=1 +VORONOI_WIDE_MESH=1 # wide pairs, 1e-8 instead of 1e-13 +DELAUNAY_DRUM_PAIRS=1 # nearly cospherical with Qbb +TIME_DELAUNAY_PAIRS_CUBE=1 +TIME_DELAUNAY_PAIRS=1 + +N_TIMING=${4:-0} +TIME_INTERIOR=1 # Random points +TIME_SPHERE=1 # Cospherical points +TIME_POST_MERGE=1 # Post-merge of cospherical points +TIME_CUBICAL=1 # Rotated cubical points +TIME_JOGGLE=1 # Joggled cubical points +TIME_MERGE=1 # Merging cubical points +TIME_DELAUNAY=1 # Delaunay of random points +TIME_REGULAR_MESH=1 + +QHULL=${QHULL:-qhull} +if [[ -d eg ]]; then + export QH_APPEND_DEST="eg/qhull-benchmark.log" + export QH_APPEND_SHOW="eg/qhull-benchmark-show.log" +else + export QH_APPEND_DEST="qhull-benchmark.log" + export QH_APPEND_SHOW="qhull-benchmark-show.log" +fi +rm -f $QH_APPEND_DEST +rm -f $QH_APPEND_SHOW + +if qtest.sh >/dev/null 2>&1; then + QTEST=qtest.sh +elif [ -e qtest.sh ]; then + QTEST=qtest.sh +elif [ -e eg/qtest.sh ]; then + QTEST=eg/qtest.sh +elif [ -e ../eg/qtest.sh ]; then + QTEST=../eg/qtest.sh +elif [ -e ../../eg/qtest.sh ]; then + QTEST=../../eg/qtest.sh +else + echo 'eg/q_benchmark: Not able to locate qtest.sh. Tried $PATH, ./, eg/, ../eg/, and ../../eg/' + exit 1 +fi + +if ! which rbox >/dev/null 2>&1; then + if [ ! -d bin ]; then + echo 'eg/q_benchmark: Run eg/q_benchmark from the Qhull directory with bin/rbox, or add rbox to $PATH' + exit 1 + fi + if [ ! -e bin/rbox -a ! -e bin/rbox.exe ]; then + echo 'eg/q_benchmark: Build qhull first. rbox is missing from bin/ directory and $PATH' + exit 1 + fi + echo 'eg/q_benchmark: Temporarily add "$PWD/bin" to $PATH for access to rbox' + PATH=$PWD/bin:$PATH + if ! which rbox >/dev/null 2>&1; then + echo 'eg/q_benchmark: PATH=... failed. Please execute "export PATH=$PWD/bin:$PATH" and repeat' + exit 1 + fi +fi +if ! which $QTEST >/dev/null 2>&1; then + log "q_benchmark error: expecting Qhull test program '$QTEST', not able to execute" + log "$(ls -ld $QTEST)" + log "$($QTEST)" + exit 1 +fi +if ! (rbox c | $QHULL >/dev/null 2>&1); then + log "q_benchmark error: expecting a Qhull program \$QHULL '$QHULL', not able to execute" + log "$(ls -ld $QHULL)" + log "$($QHULL)" + exit 1 +fi + +export QH_TEST='' # additional regexp for qtest.sh, see N_TIMING + +log +log "============================================" +log "== eg/q_benchmark [test] [precision-count] [other-count] [pinched-count] [time-count]" +log "== Time and precision benchmarks for qhull" +log "============================================" +log +log "[jun'20] Many timing figures 5-10% faster than jun'19 results. No change to code" +log +if [[ "$TEST_QTEST" == 1 ]]; then + log "'q_benchmark test $N_PRECISION $N_OTHER $N_PINCHED $N_TIMING' $(date)" +else + log "'q_benchmark $N_PRECISION $N_OTHER $N_PINCHED $N_TIMING' $(date)" +fi +log +log "$(grep Id: $0 | head -1)" +log "$($QTEST help | grep Id:)" +log "qhull => $(QHULL -V)" +log "$(ls -l $(which $QHULL))" +log "rbox => $(rbox | grep Version | sed 's/^.*Version/Version/')" +log "$(ls -l $(which rbox))" +log "$(uname -a)" +log +log "Logging to $PWD/$QH_APPEND_DEST and $QH_APPEND_SHOW" + +if [[ "$TEST_QTEST" == 1 ]]; then + log + log ======================== + log "=== test eg/qtest.sh ===" + log ======================== + log + log "== qtest.sh help" + $QTEST | tee -a "$QH_APPEND_DEST" + log "== qtest.sh 1 '10' ''" + $QTEST 1 '10' '' + log "== qtest.sh 2 'rbox 10 | qhull'" + $QTEST 2 'rbox 10 | qhull' + log "== qtest.sh -3 '10' ''" + $QTEST -3 '10' '' + log "== qtest.sh -3 'rbox 10 | qhull'" + $QTEST -3 'rbox 10 | qhull' + log "== qtest.sh run t123456 '10' 'Tz'" + $QTEST run t123456 '10' 'Tz' | tee -a "$QH_APPEND_DEST" + log "== qtest.sh run QR123456 'rbox 10 | qhull Tz'" + $QTEST run QR123456 'rbox 10 | qhull Tz' | tee -a "$QH_APPEND_DEST" + log "== qtest.sh log 'rbox 10 | qhull'" + ($QTEST log 'rbox 10 | qhull' && echo && echo qhull.log && head qhull.log) | tee -a "$QH_APPEND_DEST" + log "== qtest.sh t123456 '10' ''" + ($QTEST t123456 '10' '' && echo && echo qhull.log && head qhull.log) | tee -a "$QH_APPEND_DEST" + log "== qtest.sh QR123456 'rbox 10 | qhull'" + ($QTEST QR123456 'rbox 10 | qhull' && echo && echo qhull-step.log && head qhull-step.log) | tee -a "$QH_APPEND_DEST" + log "== qtest.sh grep 'qh_addpoint|QH1' >qhull-grep.log" + ($QTEST grep 'qh_addpoint|QH1' >qhull-grep.log && head qhull-grep.log && echo qhull-grep.log && tail qhull-grep.log) | tee -a "$QH_APPEND_DEST" + log "== qtest.sh grep 'qh_addpoint' 'added| qh_addpoint' >qhull-grep.log" + ($QTEST grep 'qh_addpoint' 'added| qh_addpoint' >qhull-grep.log && head qhull-grep.log && echo qhull-grep.log && tail qhull-grep.log) | tee -a "$QH_APPEND_DEST" + log "== qtest.sh grep-merge 'qhull.log' >qhull-grep.log" + ($QTEST grep-merge qhull.log >qhull-grep.log && head qhull-grep.log && echo qhull-grep.log && tail qhull-grep.log) | tee -a "$QH_APPEND_DEST" + log "== qtest.sh grep-step 'qhull.log' >qhull-step.log" + ($QTEST grep-step qhull.log >qhull-step.log && head qhull-step.log && echo qhull-step.log && tail qhull-step.log) | tee -a "$QH_APPEND_DEST" + log "== qtest.sh -v -3 'rbox 10 | qhull'" + $QTEST -v -3 'rbox 10 | qhull' + + log + log ============================ + log "=== test qtest.sh errors ===" + log ============================ + log "== qtest.sh run -3 'rbox 10 | qhull'" + $QTEST run -3 'rbox 10 | qhull' | tee -a "$QH_APPEND_DEST" + log "== qtest.sh run 3 '10' ''" + $QTEST run 3 '10' '' | tee -a "$QH_APPEND_DEST" + log "== qtest.sh run '10' ''" + $QTEST run '10' '' | tee -a "$QH_APPEND_DEST" + log "== qtest.sh run" + $QTEST run | tee -a "$QH_APPEND_DEST" + log "== qtest.sh 3 '10' d T4" + $QTEST 3 '10' d T4 | tee -a "$QH_APPEND_DEST" + log "== qtest.sh 3 '10' 'd H'" + $QTEST 3 '10' 'd H' | tee -a "$QH_APPEND_DEST" + log "== qtest.sh 3" + $QTEST 3 | tee -a "$QH_APPEND_DEST" + log "== qtest.sh grep" + $QTEST grep | tee -a "$QH_APPEND_DEST" + log "== qtest.sh grep-merge '10' 'v'" + $QTEST grep-merge '10' 'v' | tee -a "$QH_APPEND_DEST" + log "== qtest.sh grep-merge" + $QTEST grep-merge | tee -a "$QH_APPEND_DEST" + log "== qtest.sh grep-merge not-a-file" + $QTEST grep-merge not-a-file | tee -a "$QH_APPEND_DEST" + log "== qtest.sh grep-step '10' 'v'" + $QTEST grep-step '10' 'v' | tee -a "$QH_APPEND_DEST" + log "== qtest.sh grep-step" + $QTEST grep-step | tee -a "$QH_APPEND_DEST" + log "== qtest.sh grep-step not-a-file" + $QTEST grep-step not-a-file | tee -a "$QH_APPEND_DEST" + log "== qtest.sh log '10' 'd'" + $QTEST log '10' 'd' | tee -a "$QH_APPEND_DEST" + log "== qtest.sh t34" + $QTEST t34 | tee -a "$QH_APPEND_DEST" + log "== qtest.sh t34 'rbox 10 | qhull'" + $QTEST t34 'rbox 10 | qhull' | tee -a "$QH_APPEND_DEST" + log "== qtest.sh QR34" + $QTEST QR34 | tee -a "$QH_APPEND_DEST" + log "== qtest.sh QR34 '10' 'v'" + $QTEST QR34 '10' 'v' | tee -a "$QH_APPEND_DEST" + log "== qtest.sh t34 '10 ZERROR' 'v'" + $QTEST t34 '10 ZERROR' 'v' | tee -a "$QH_APPEND_DEST" + log "== Delete temporary log files ghull.log, qhull-grep.log, and qhull-step.log" + rm -f qhull.log qhull-grep.log qhull-step.log +fi + +log +log "==============================" +log "=== N_PRECISION test cases ===" +log "==============================" +if [[ $N_PRECISION -gt 0 || $N_PRECISION -lt 0 ]]; then + +log "== difficult cases for qhull ${d:-`date`}" + +if [[ $FUZZY_CUBE == 1 ]]; then + log + log ==================== + log "== Convex hull of fuzzy cube (large flat facets)" + log ==================== + set -v + # [2015-2019] 1 D5 error vs. 2 D5 + 1 D6 error, similar CPU + # rbox is slow if compiled for Debug + $QTEST $N_PRECISION '1000000 W1e-13 D2' 'Tv' + $QTEST $N_PRECISION '500000 W1e-13 D3' 'Tv' + $QTEST $N_PRECISION '10000 W1e-13 D4' 'Tv' + $QTEST $N_PRECISION '2000 W1e-13 D5' 'Tv' + $QTEST $N_PRECISION '1000 W1e-13 D6' 'Tv' + set +v +fi +if [[ $NARROW_LENSE == 1 ]]; then + log + log ==================== + log "== narrow lense" + log ==================== + set -v + # [2015-2019] no errors, similar CPU, new sometimes slower + $QTEST $N_PRECISION '1000000 L100000 s G1e-6 D2' 'Tv' + $QTEST $N_PRECISION '10000 L100000 s G1e-6 D3' 'Q12 Tv' + $QTEST $N_PRECISION '5000 L100000 s G1e-6 D4' 'Tv' + $QTEST $N_PRECISION '1000 L100000 s G1e-6 D5' 'Tv' + $QTEST $N_PRECISION '400 L100000 s G1e-6 D6' 'Tv' + set +v +fi + +if [[ $CONE == 1 ]]; then + log + log ==================== + log "== cone" + log ==================== + set -v + # [2015-2019] D2, no errors, similar CPU + # [2015-2019] D3, 2+20x and outside points vs. 3+20x, new is faster except for one 3x slower + # [2015-2019] D4, 3+20x vs. no errors, wide variation in CPU, new is slower + # [2015-2019] D5, 0 vs. 2 errors, new is 2x slower + # [2015-2019] D6, 0 vs. 1 error and 3 OK errors, new is 2x slower + $QTEST $N_PRECISION '100000 s Z1 G1e-13 D2' 'Tv' + $QTEST $N_PRECISION '10000 s Z1 G1e-13 D3' 'Q12 Tv' + $QTEST $N_PRECISION '2000 s Z1 G1e-13 D4' 'Q12 Tv' + $QTEST $N_PRECISION '1000 s Z1 G1e-13 D5' 'Q12 Tv' + $QTEST $N_PRECISION '400 s Z1 G1e-13 D6' 'Q12 Tv' + set +v +fi +export QH_TEST='' +fi # end of N_PRECISION test cases + +log +log "==========================" +log "=== N_OTHER test cases ===" +log "==========================" +if [[ $N_OTHER -gt 0 || $N_OTHER -lt 0 ]]; then + +if [[ $DELAUNAY_CIRCLE == 1 ]]; then + log + log ==================== + log "== Delaunay triangulation of fuzzy circle (large, narrow disk)" + log "== No Qbb, highly degenerate due to narrow disk of two cospherical sets of points" + log ==================== + set -v + # [2015-2019] D2, ten 20+x vs. 3 errors and seven 20+x + # [2015-2019] D3, 1 error 2 outside nine 20+x vs. 8 errors and two 20+x + # [2015-2019] D4, 5 errors and three 20+x vs. 3 errors and three 20+x + # [2015-2019] D5, 7 errors vs. 1 error and one 20+x + # [2015-2019] D6, 8 errors vs. 9 errors + # Only 8 facets remain due to many dupridges with flipped facets + $QTEST $N_OTHER '10000 s W1e-13 D2' 'd Tv' # no Qbb + $QTEST $N_OTHER '2000 s W1e-13 D3' 'd Tv' + $QTEST $N_OTHER '1000 s W1e-13 D4' 'd Tv' + $QTEST $N_OTHER '200 s W1e-13 D5' 'd Tv' + $QTEST $N_OTHER '100 s W1e-13 D6' 'd Tv' + set +v +fi + +export QH_TEST='merge|rename|created:|facets:| hull:' +if [[ $LENSE_SIZE == 1 ]]; then # For testing, normally skipped + log + log ==================== + log "== test narrow lense by size " + log ==================== + set -v + # [2015.2-2018.0] D3 similar behavior, 10x increase in merges/facet per run + # [2015.2-2018.0] D3 L1000000 QH6154, initial simplex is flat + $QTEST 1 '1000 L1000 s G1e-6 D3' '' + $QTEST 1 '1000 L10000 s G1e-6 D3' '' + $QTEST 1 '1000 L100000 s G1e-6 D3' '' + $QTEST 1 '1000 L1000000 s G1e-6 D3' '' + set +v +fi +if [[ $LENSE_GAP == 1 ]]; then # For testing, normally skipped + log + log ==================== + log "== test narrow lense by gap " + log ==================== + set -v + # [2015.2-2018.0] D3 similar behavior, L100000 max'd 511 merges for a facet + $QTEST 1 '1000 L100000 s G1e-3 D3' '' + $QTEST 1 '1000 L100000 s G1e-4 D3' '' + $QTEST 1 '1000 L100000 s G1e-5 D3' '' + $QTEST 1 '1000 L100000 s G1e-6 D3' '' + $QTEST 1 '1000 L100000 s G1e-7 D3' '' + $QTEST 1 '1000 L100000 s G1e-8 D3' '' + set +v +fi +export QH_TEST='' + +fi # end of N_OTHER test cases + +log +log "===========================================================" +log "=== N_PINCHED test cases for Q14-merge-pinched-vertices ===" +log "===========================================================" +if [[ $N_PINCHED -gt 0 || $N_PINCHED -lt 0 ]]; then + +if [[ $CUBE_PAIRS == 1 ]]; then + log + log ==================== + log "== Convex hull of fuzzy cube with point pairs (large flat facets)" + log ==================== + set -v + # [2015-2019] D2, no errors, similar CPU + # [2015-2019] D3, no errors, new is faster + # [2015-2019] D4, 3 vs. 1 error, similar speed + # [2015-2019] D5, 10 vs. 1 errors + # [2015-2019] D6, 10 vs. 2 errors + $QTEST $N_PINCHED '1000000 W1e-13 C1,2e-13 D2' 'Q14 Tv' + $QTEST $N_PINCHED '500000 W1e-13 C1,2e-13 D3' 'Q14 Tv' # Tv doubles the time + $QTEST $N_PINCHED '20000 W1e-13 C1,2e-13 D4' 'Q14 Tv' + $QTEST $N_PINCHED '2000 W1e-13 C1,2e-13 D5' 'Q14 Tv' + $QTEST $N_PINCHED '500 W1e-13 C1,2e-13 D6' 'Q14 Tv' + set +v + log + log ==================== + log "== Convex hull of cube with point pairs (large flat facets)" + log ==================== + set -v + # [2015-2019] D2, no errors, new is somewhat slower + # [2015-2019] D3, no errors, similar CPU + # [2015-2019] D4, 5 vs. no errors, similar speed + # [2015-2019] D5, 9 vs. 1 error + # [2015-2019] D6, 10 vs. 6 errors + $QTEST $N_PINCHED '1000000 W0 C1,2e-13 D2' 'Q14 Tv' + $QTEST $N_PINCHED '100000 W0 C1,2e-13 D3' 'Q14 Tv' + $QTEST $N_PINCHED '5000 W0 C1,2e-13 D4' 'Q14 Tv' + $QTEST $N_PINCHED '1000 W0 C1,2e-13 D5' 'Q14 Tv' + $QTEST $N_PINCHED '500 W0 C1,2e-13 D6' 'Q14 Tv' + set +v +fi + +if [[ $DELAUNAY_PAIRS == 1 ]]; then + + log + log ==================== + log "== Delaunay triangulation of point pairs (large upper facet)" + log "== Difficult case due to large upper facet with nearly adjacent vertices" + log "== A bounding box helps avoid this case, see TIME_DELAUNAY_PAIRS" + log ==================== + set -v + # [2015-2019] D2 no errors, similar CPU + # [2015-2019] D3 10 vs. 0 errors + # [2015-2019] D4 10 vs. 4 errors + # [2015-2019] D5 10 vs. 7 errors + # [2015-2019] D6 10 vs. 0 errors + $QTEST $N_PINCHED '100000 C1,2e-13 D2' 'Q14 d Qbb' # Tv is too expensive + $QTEST $N_PINCHED '10000 C1,2e-13 D3' 'Q14 d Qbb Tv' + $QTEST $N_PINCHED '500 C1,2e-13 D4' 'Q14 d Qbb Tv' + $QTEST $N_PINCHED '200 C1,2e-13 D5' 'Q14 d Qbb Tv' + $QTEST $N_PINCHED '100 C1,2e-13 D6' 'Q14 d Qbb Tv' + set +v + + log + log ==================== + log "== Delaunay triangulation of point quads (2e-13, large upper facet)" + log "== Difficult case due to large upper facet with many nearly adjacent vertices" + log ==================== + set -v + # [2015-2019] D2 no errors, new somewhat faster + # [2015-2019] D3 10 vs. 7 errors + # [2015-2019] D4 10 vs. 9 errors + # [2015-2019] D5 10 vs. 9 errors + # [2015-2019] D6 10 vs. 2 errors + $QTEST $N_PINCHED '50000 C3,2e-13 D2' 'Q14 d Qbb' # 'Tv' is too expensive + $QTEST $N_PINCHED '10000 C3,2e-13 D3' 'Q14 d Qbb' # 'Tv' is too expensive + $QTEST $N_PINCHED '200 C3,2e-13 D4' 'Q14 d Qbb Tv' # lots of errors for 300 + $QTEST $N_PINCHED '100 C3,2e-13 D5' 'Q14 d Qbb Tv' # lots of error for 100 and 200 + $QTEST $N_PINCHED '100 C3,2e-13 D6' 'Q14 d Qbb Tv' # OK + set +v +fi +if [[ $CIRCLE_PAIRS == 1 ]]; then + log + log ==================== + log "== Delaunay triangulation of fuzzy circle with pairs (large, narrow disk)" + log "== Highly degenerate due to narrow disk of two cospherical sets of point pairs" + log "== Worse with Qbb since it stretches out the paraboloid, doubling _one-merge" + log ==================== + set -v + # [2015-2019] D2 0 vs. 2 errors, new 10x faster + # [2015-2019] D3 10 vs. 9 errors + # [2015-2019] D4 10 vs. 7 errors + # [2015-2019] D5 10 vs. 10 errors + # [2015-2019] D6 10 vs. 10 errors + $QTEST $N_PINCHED '10000 s W1e-13 C1,1e-13 D2' 'Q14 d Tv' + $QTEST $N_PINCHED '5000 s W1e-13 C1,1e-13 D3' 'Q14 d Tv' + $QTEST $N_PINCHED '500 s W1e-13 C1,1e-13 D4' 'Q14 d Tv' + $QTEST $N_PINCHED '200 s W1e-13 C1,1e-13 D5' 'Q14 d Tv' + $QTEST $N_PINCHED '100 s W1e-13 C1,1e-13 D6' 'Q14 d Tv' + set +v +fi + +if [[ $VORONOI_WIDE_MESH == 1 ]]; then + log + log ==================== + log "== Voronoi diagram of rotated mesh with wide, 1e-8 pairs" + log "== All fail at C1,1e-12" + log ==================== + set -v + # [2015-2019] D2 1 vs. 0 errors, similar speed + # [2015-2019] D3 6 vs. 4 errors, similar speed + # [2015-2019] D4 0 vs. 0 errors, new is 5% slower + # [2015-2019] D5 0 vs. 2 errors, new is 10% slower + # [2015-2019] D6 skipped, too slow + $QTEST $N_PINCHED "10000 M3,4 C1,1e-8 D2" "QR3 Q14 v Qbb Tv" # co-circular if 40000 + $QTEST $N_PINCHED "2000 M3,4,5 C1,1e-8 D3" "QR3 Q14 v Qbb Tv" + $QTEST $N_PINCHED "600 M3,4,5 C1,1e-8 D4" "QR3 Q14 v Qbb Tv" + $QTEST $N_PINCHED "300 M3,4,5 C1,1e-8 D5" "QR3 Q14 v Qbb Tv" # 250 is narrow + log "skip D6, millions of vertices" # $QTEST $N_PINCHED "250 M3,4,5 D6 C1,1e-8" "QR3 Q14 v Qbb Tv" + set +v +fi + +if [[ $DELAUNAY_DRUM_PAIRS == 1 ]]; then + log + log ============================ + log "== Delaunay triangulation of nearly cospherical point pairs with Qbb drum" + log "== Qbb makes this the most difficult distribution for Qhull, only 100 points" + log ============================ + # [2015-2019] D3 0 vs. 0 errors, new is 2x faster + # [2015-2019] D4 9 vs. 8 errors + # [2015-2019] D5 10 vs. 10 errors + # [2015-2019] D6 10 vs. 10 errors + $QTEST $N_PINCHED '1000 s C1,1e-13 D3' 'Q14 d Qbb Tv' + $QTEST $N_PINCHED '100 s C1,1e-13 D4' 'Q14 d Qbb Tv' + $QTEST $N_PINCHED '50 s C1,1e-13 D5' 'Q14 d Qbb Tv' + $QTEST $N_PINCHED '50 s C1,1e-13 D6' 'Q14 d Qbb Tv' +fi + + +if [[ $TIME_DELAUNAY_PAIRS_CUBE == 1 ]]; then + log + log ============================ + log "== Time for pinched Delaunay triangulation of random point pairs (Q14) with bounding box" + log ============================ + # [2015-2019] D2 no errors, similar speed + # [2015-2019] D3 3 vs. no errors, similar speed + # [2015-2019] D4 10 vs. 1 error + # [2015-2019] D5 10 vs. 1 error + # [2015-2019] D6 10 vs. 1 error + $QTEST $N_PINCHED '50000 C1,2e-13 c G2.0 D2' 'Q14 d Qbb' + $QTEST $N_PINCHED '10000 C1,2e-13 c G2.0 D3' 'Q14 d Qbb' + $QTEST $N_PINCHED '3000 C1,2e-13 c G2.0 D4' 'Q14 d Qbb' + $QTEST $N_PINCHED '500 C1,2e-13 c G2.0 D5' 'Q14 d Qbb' + $QTEST $N_PINCHED '100 C1,2e-13 c G2.0 D6' 'Q14 d Qbb' +fi + +if [[ $TIME_DELAUNAY_PAIRS == 1 ]]; then + log + log ============================ + log "== Time for pinched Delaunay triangulation of random point pairs (Q14, Q12)" + log "== qh_next_facetmerge, qh_findbesthorizon (qh_distplane)" + log ============================ + # [2015-2019] D2 no errors, 20% slower CPU + # [2015-2019] D3 10 vs. no errors + # [2015-2019] D4 10 vs. no errors + # [2015-2019] D5 10 vs. 2 errors + # [2015-2019] D6 10 vs. no errors + $QTEST $N_PINCHED '50000 C1,2e-13 D2' 'Q14 d Qbb' + $QTEST $N_PINCHED '5000 C1,2e-13 D3' 'Q14 d Qbb' + $QTEST $N_PINCHED '500 C1,2e-13 D4' 'Q12 Q14 d Qbb' + $QTEST $N_PINCHED '300 C1,2e-13 D5' 'Q12 Q14 d Qbb' + $QTEST $N_PINCHED '100 C1,2e-13 D6' 'Q14 d Qbb' +fi + +export QH_TEST='' +fi # end of N_PINCHED test cases + +log +log =========================== +log "=== N_TIMING test cases ===" +log =========================== +if [[ $N_TIMING -gt 0 || $N_TIMING -lt 0 ]]; then + +# export QH_TEST='vertices:|facets:|sites:|regions:|merged facets:|hyperplanes created:' + +log +log ============================ +log "== Time for random points in a cube" +log ============================ +if [[ $TIME_INTERIOR == 1 ]]; then + # [2015-2019] D2 no errors, 10% slower CPU + # [2015-2019] D3 no errors, 5% slower CPU + # [2015-2019] D4 no errors, similar CPU + # [2015-2019] D5 no errors, similar CPU + # [2015-2019] D6 no errors, similar CPU + $QTEST $N_TIMING '1000000 D2' '' + $QTEST $N_TIMING '500000 D3' '' + $QTEST $N_TIMING '200000 D4' '' + $QTEST $N_TIMING '100000 D5' 'Q12' + $QTEST $N_TIMING '3000 D6' '' +fi + +log +log ============================ +log "== Time for random cospherical points" +log ============================ +if [[ $TIME_SPHERE == 1 ]]; then + # [2015-2019] D2 no errors, similar CPU + # [2015-2019] D3 no errors, 10% slower CPU + # [2015-2019] D4 no errors, 5% slower CPU + # [2019, gcc] D4 qconvex, no errors, 4% faster than qhull + # [2015-2019] D5 no errors, similar CPU + # [2015-2019] D6 no errors, similar CPU + $QTEST $N_TIMING '100000 s D2' '' + $QTEST $N_TIMING '100000 s D3' '' + $QTEST $N_TIMING '50000 s D4' '' + if [[ -e ../bin/qconvex || -e bin/qconvex ]]; then + echo + echo == Repeat with 'qconvex', bin/qconvex is built with libqhull instead of libqhull_r + QHULL=qconvex $QTEST $N_TIMING '50000 s D4' '' + fi + $QTEST $N_TIMING '10000 s D5' '' + $QTEST $N_TIMING '1000 s D6' '' +fi + +log +log ============================ +log "== Time for extreme post-merge of random cospherical points" +log ============================ +if [[ $TIME_POST_MERGE == 1 ]]; then + # [2015-2019] D2 no errors, 10% slower CPU + # [2015-2019] D3 no errors, 20% slower CPU + # [2015-2019] D4 no errors, 15% slower CPU + # [2019, gcc] D4 qconvex, no errors, slightly faster than qhull + # [2015-2019] D5 no errors, 10% slower CPU + # [2015-2019] D6 no errors, 10% slower CPU + $QTEST $N_TIMING '100000 s D2' 'C0.01' + $QTEST $N_TIMING '10000 s D3' 'C0.01' + $QTEST $N_TIMING '5000 s D4' 'C0.01' + if [[ -e ../bin/qconvex || -e bin/qconvex ]]; then + echo + echo == Repeat with 'qconvex', bin/qconvex is built with libqhull instead of libqhull_r + QHULL=qconvex $QTEST $N_TIMING '5000 s D4' 'C0.01' + fi + $QTEST $N_TIMING '2000 s D5' 'C0.01' + $QTEST $N_TIMING '500 s D6' 'C0.01' +fi + +log +log ============================ +log "== Time for rotated cubical points with large merged facets" +log ============================ +if [[ $TIME_CUBICAL == 1 ]]; then + # [2015-2019] D2 no errors, 5% slower CPU + # [2015-2019] D3 no errors, somewhat slower CPU + # [2015-2019] D4 no errors, similar CPU + # [2015-2019] D5 no errors, 10% slower CPU + # [2015-2019] D6 no errors, 10% slower CPU + $QTEST $N_TIMING '5000000 W0 D2' 'QR3' + $QTEST $N_TIMING '1000000 W0 D3' 'QR3' + $QTEST $N_TIMING '100000 W0 D4' 'QR3' + $QTEST $N_TIMING '10000 W0 D5' 'QR3' + $QTEST $N_TIMING '1000 W0 D6' 'QR3' +fi + +log +log ============================ +log "== Time for joggled, rotated cubical points with multiple retries" +log ============================ +if [[ $TIME_JOGGLE == 1 ]]; then + # [2015-2019] D2 no errors, somewhat slower CPU, 0.67-0.78 was 0.8 + # [2015-2019] D3 no errors, similar CPU, 0.4-1.7 was 0.5-0.6 + # [2015-2019] D4 no errors, somewhat slower CPU, 0.24-0.37 was 0.35 + # [2015-2019] D5 no errors, similar CPU, 0.4-0.9 was 0.6 + # [2015-2019] D6 no errors, similar CPU, 0.5-1.0 was 0.9 + $QTEST $N_TIMING '5000000 W0 D2' 'QR3 QJ' + $QTEST $N_TIMING '1000000 W0 D3' 'QR3 QJ' + $QTEST $N_TIMING '100000 W0 D4' 'QR3 QJ' + $QTEST $N_TIMING '10000 W0 D5' 'QR3 QJ' + $QTEST $N_TIMING '1000 W0 D6' 'QR3 QJ' + + log + log ============================ + log "== Time for joggled, nearly cubical points" + log ============================ + $QTEST $N_TIMING '1000000 W1e-13 D2' 'QJ' + $QTEST $N_TIMING '500000 W1e-13 D3' 'QJ' + $QTEST $N_TIMING '100000 W1e-13 D4' 'QJ' + $QTEST $N_TIMING '10000 W1e-13 D5' 'QJ' + $QTEST $N_TIMING '1000 W1e-13 D6' 'QJ' +fi + +log +log ============================ +log "== Time for merging nearly cubical points" +log ============================ +if [[ $TIME_MERGE == 1 ]]; then + # [2015-2019] D2 no errors, somewhat slower CPU + # [2015-2019] D3 no errors, similar CPU + # [2015-2019] D4 no vs. 1+20x, varied CPU + # [2015-2019] D5 1 vs. 1 errors, similar CPU + # [2015-2019] D6 no errors, similar CPU + $QTEST $N_TIMING '1000000 W1e-13 D2' '' + $QTEST $N_TIMING '1000000 W1e-13 D3' '' + $QTEST $N_TIMING '100000 W1e-13 D4' 'Q12' + $QTEST $N_TIMING '2000 W1e-13 D5' 'Q12' + $QTEST $N_TIMING '500 W1e-13 D6' '' +fi + +log +log ============================ +log "== Time for Delaunay triangulation of random points" +log "== qh_findbesthorizon, qh_distplane, qh_update_vertexneighbors_cone, qh_makenew_simplicial" +log ============================ +if [[ $TIME_DELAUNAY == 1 ]]; then + # [2015-2019] D2 no errors, similar CPU + # [2015-2019] D3 no errors, similar CPU + # [2015-2019] D4 no errors, 5% slower CPU + # [2015-2019] D5 no errors, 5% slower CPU + # [2015-2019] D6 no errors, 10% slower CPU + $QTEST $N_TIMING '100000 D2' 'd Qbb Qz' + $QTEST $N_TIMING '50000 D3' 'd Qbb Qz' + $QTEST $N_TIMING '10000 D4' 'd Qbb Qz' + $QTEST $N_TIMING '1000 D5' 'd Qbb Qz' + $QTEST $N_TIMING '200 D6' 'd Qbb Qz' +fi + +if [[ $TIME_REGULAR_MESH == 1 ]]; then + log + log ==================== + log "== Time for Delaunay triangulation of regular mesh, integer coordinates" + log ==================== + set -v + # [2015-2019] D2 no errors, similar CPU + # [2015-2019] D3 no errors, 5% slower CPU + # [2015-2019] D4 no errors, 5% slower CPU + # [2015-2019] D5 no errors, 5% slower CPU + # [2015-2019] D6 no errors, somewhat slower CPU + $QTEST $N_TIMING "100000 M3,4 z D2" "QR3 d Qt Qbb" + $QTEST $N_TIMING "20000 M3,4,5 z D3" "QR3 d Qt Qbb" + $QTEST $N_TIMING "5000 M3,4,5 z D4" "QR3 d Qt Qbb" + $QTEST $N_TIMING "1500 M3,4,5 z D5" "QR3 d Qt Qbb" + $QTEST $N_TIMING "500 M3,4,5 z D6" "QR3 d Qt Qbb" + log + log ==================== + log "== Time for Voronoi diagram of regular mesh" + log ==================== + # [2015-2019] D2 no errors, somewhat faster CPU + # [2015-2019] D3 no errors, 5% slower CPU + # [2015-2019] D4 no errors, 5% slower CPU + # [2015-2019] D5 no errors, 5% slower CPU + # [2015-2019] D6 no errors, 10% slower CPU + $QTEST $N_TIMING "rbox 100000 M3,4 z D2 | $QHULL v Qbb" + $QTEST $N_TIMING "rbox 20000 M3,4,5 z | $QHULL v Qbb" + $QTEST $N_TIMING "rbox 5000 M3,4,5 z D4 | $QHULL v Qbb" + $QTEST $N_TIMING "rbox 1500 M3,4,5 z D5 | $QHULL v Qbb" + $QTEST $N_TIMING "rbox 500 M3,4,5 z D6 | $QHULL v Qbb" + set +v +fi + +export QH_TEST='' +fi # end of N_TIMING test cases + +# end of q_benchmark diff -Nru qhull-2015.2/eg/q_benchmark-ok.txt qhull-2020.2/eg/q_benchmark-ok.txt --- qhull-2015.2/eg/q_benchmark-ok.txt 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/eg/q_benchmark-ok.txt 2020-07-25 01:27:45.000000000 +0000 @@ -0,0 +1,3615 @@ +============================================ +== make benchmark ========================== +== eg/qtest.sh ========================== +============================================ +== Thu, Jun 4, 2020 7:26:49 PM + +eg/q_benchmark -10 -10 -10 -10 +eg/q_benchmark: Temporarily add "$PWD/bin" to $PATH for access to rbox + +============================================ +== eg/q_benchmark [test] [precision-count] [other-count] [pinched-count] [time-count] +== Time and precision benchmarks for qhull +============================================ + +[jun'20] Many timing figures 5-10% faster than jun'19 results. No change to code + +'q_benchmark -10 -10 -10 -10' Thu, Jun 4, 2020 7:26:50 PM + +# $Id: //main/2019/qhull/eg/q_benchmark-ok.txt#5 $$DateTime: 2020/06/05 16:33:18 $ +# $Id: //main/2019/qhull/eg/q_benchmark-ok.txt#5 $$DateTime: 2020/06/05 16:33:18 $ +qhull => qhull_r 8.0.0 (2020.1.r 2020/05/29) +-rwxr-xr-x 1 bbarber 197121 339968 Jun 4 16:16 /var/tmp/qhull-zip-2020-06-04-16-17/zip/qhull-2020.1/bin/qhull +rbox => Version: 2019/11/10 +-rwxr-xr-x 1 bbarber 197121 32768 Jun 4 16:16 /var/tmp/qhull-zip-2020-06-04-16-17/zip/qhull-2020.1/bin/rbox +MINGW64_NT-10.0-18362 kelwyn 3.0.7-338.x86_64 2019-04-30 21:52 UTC x86_64 Msys + +Logging to /var/tmp/qhull-zip-2020-06-04-16-17/zip/qhull-2020.1/eg/qhull-benchmark.log and eg/qhull-benchmark-show.log + +============================== +=== N_PRECISION test cases === +============================== +== difficult cases for qhull Thu, Jun 4, 2020 7:26:51 PM + +==================== +== Convex hull of fuzzy cube (large flat facets) +==================== + +Testing -- rbox 1000000 W1e-13 D2 t1 | qhull Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-864647.log +Test -- t1 + CPU seconds to compute hull (after input): 0.249 +Test -- t2 + CPU seconds to compute hull (after input): 0.196 +Test -- t3 + CPU seconds to compute hull (after input): 0.21 +Test -- t4 + CPU seconds to compute hull (after input): 0.215 +Test -- t5 + CPU seconds to compute hull (after input): 0.197 +Test -- t6 + CPU seconds to compute hull (after input): 0.221 +Test -- t7 + CPU seconds to compute hull (after input): 0.192 +Test -- t8 + CPU seconds to compute hull (after input): 0.213 +Test -- t9 + CPU seconds to compute hull (after input): 0.197 +Test -- t10 + CPU seconds to compute hull (after input): 0.212 +1591313239 Test 10 runs in 28 seconds (ave. 2800 msec) -- rbox 1000000 W1e-13 D2 t1 | qhull Tv + +Testing -- rbox 500000 W1e-13 D3 t1 | qhull Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-802003.log +Test -- t1 + CPU seconds to compute hull (after input): 0.565 +Test -- t2 + CPU seconds to compute hull (after input): 0.572 +Test -- t3 + CPU seconds to compute hull (after input): 0.508 +Test -- t4 + CPU seconds to compute hull (after input): 0.485 +Test -- t5 + CPU seconds to compute hull (after input): 0.504 +Test -- t6 + CPU seconds to compute hull (after input): 0.574 +Test -- t7 + CPU seconds to compute hull (after input): 0.486 +Test -- t8 + CPU seconds to compute hull (after input): 0.517 +Test -- t9 + CPU seconds to compute hull (after input): 0.505 +Test -- t10 + CPU seconds to compute hull (after input): 0.541 +1591313286 Test 10 runs in 46 seconds (ave. 4600 msec) -- rbox 500000 W1e-13 D3 t1 | qhull Tv + +Testing -- rbox 10000 W1e-13 D4 t1 | qhull Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-875422.log +Test -- t1 +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f15532 into f15531 for mergetype 7 (dupridge). maxdist 0 (0.0x) mindist -1.1e-12 (112.6x) vertexdist 0.074 Allow with 'Q12' (allow-wide) +Test -- t2 + CPU seconds to compute hull (after input): 0.134 +Test -- t3 + CPU seconds to compute hull (after input): 0.086 +Test -- t4 + CPU seconds to compute hull (after input): 0.123 +Test -- t5 + CPU seconds to compute hull (after input): 0.09 +Test -- t6 + CPU seconds to compute hull (after input): 0.115 +Test -- t7 + CPU seconds to compute hull (after input): 0.084 +Test -- t8 + CPU seconds to compute hull (after input): 0.103 +Test -- t9 + CPU seconds to compute hull (after input): 0.099 +Test -- t10 + CPU seconds to compute hull (after input): 0.094 +1591313292 Test 10 runs in 5 seconds (ave. 500 msec) -- rbox 10000 W1e-13 D4 t1 | qhull Tv + +Testing -- rbox 2000 W1e-13 D5 t1 | qhull Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-76284.log +Test -- t1 + CPU seconds to compute hull (after input): 0.532 +Test -- t2 + CPU seconds to compute hull (after input): 0.479 +Test -- t3 +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f75175 into f75221 for mergetype 7 (dupridge). maxdist 0 (0.0x) mindist -1.6e-12 (96.1x) vertexdist 0.048 Allow with 'Q12' (allow-wide) + Maximum distance of point above facet: 2.1e-13 (12.8x) +Test -- t4 + CPU seconds to compute hull (after input): 0.495 +Test -- t5 + CPU seconds to compute hull (after input): 0.47 +Test -- t6 + CPU seconds to compute hull (after input): 0.612 +Test -- t7 + CPU seconds to compute hull (after input): 0.529 +Test -- t8 +QH6271 qhull topology error (qh_check_dupridge): wide merge (100.6x wider) due to dupridge between f23261 and f23245 (vertex dist 0.16), merge dist 2e-12, while processing p54 +Test -- t9 + CPU seconds to compute hull (after input): 0.558 +Test -- t10 + CPU seconds to compute hull (after input): 0.488 +1591313301 Test 10 runs in 8 seconds (ave. 800 msec) -- rbox 2000 W1e-13 D5 t1 | qhull Tv + +Testing -- rbox 1000 W1e-13 D6 t1 | qhull Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-411054.log +Test -- t1 + CPU seconds to compute hull (after input): 2.168 +Test -- t2 +QH6271 qhull topology error (qh_check_dupridge): wide merge (78677624350.8x wider) due to dupridge between f372429 and f372158 (vertex dist 0.48), merge dist 0.011, while processing p166 +Test -- t3 + CPU seconds to compute hull (after input): 1.993 +Test -- t4 + CPU seconds to compute hull (after input): 2.038 +Test -- t5 + CPU seconds to compute hull (after input): 1.961 +Test -- t6 + CPU seconds to compute hull (after input): 2.044 +Test -- t7 + CPU seconds to compute hull (after input): 2.055 +Test -- t8 + CPU seconds to compute hull (after input): 2.153 +Test -- t9 + CPU seconds to compute hull (after input): 1.98 +Test -- t10 + CPU seconds to compute hull (after input): 2.067 +1591313330 Test 10 runs in 28 seconds (ave. 2800 msec) -- rbox 1000 W1e-13 D6 t1 | qhull Tv + +==================== +== narrow lense +==================== + +Testing -- rbox 1000000 L100000 s G1e-6 D2 t1 | qhull Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-881887.log +Test -- t1 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.175 +Test -- t2 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.17 +Test -- t3 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.184 +Test -- t4 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.207 +Test -- t5 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.174 +Test -- t6 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.185 +Test -- t7 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.227 +Test -- t8 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.195 +Test -- t9 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.181 +Test -- t10 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.233 +1591313354 Test 10 runs in 23 seconds (ave. 2300 msec) -- rbox 1000000 L100000 s G1e-6 D2 t1 | qhull Tv + +Testing -- rbox 10000 L100000 s G1e-6 D3 t1 | qhull Q12 Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-685335.log +Test -- t1 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.574 +Test -- t2 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.555 +Test -- t3 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.572 +Test -- t4 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.578 + Maximum distance of point above facet: 8.3e-14 (14.9x) +Test -- t5 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.56 +Test -- t6 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.594 +Test -- t7 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.601 +Test -- t8 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.623 +Test -- t9 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.633 + Maximum distance of point above facet: 1.1e-13 (19.4x) +Test -- t10 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.599 +1591313373 Test 10 runs in 18 seconds (ave. 1800 msec) -- rbox 10000 L100000 s G1e-6 D3 t1 | qhull Q12 Tv + +Testing -- rbox 5000 L100000 s G1e-6 D4 t1 | qhull Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-287921.log +Test -- t1 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.493 +Test -- t2 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.508 +Test -- t3 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.506 +Test -- t4 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 1.305 +Test -- t5 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.458 +Test -- t6 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 1.343 + Maximum distance of point above facet: 2.1e-13 (21.0x) +Test -- t7 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.556 +Test -- t8 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.459 +Test -- t9 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.462 +Test -- t10 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.488 +1591313394 Test 10 runs in 20 seconds (ave. 2000 msec) -- rbox 5000 L100000 s G1e-6 D4 t1 | qhull Tv + +Testing -- rbox 1000 L100000 s G1e-6 D5 t1 | qhull Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-490938.log +Test -- t1 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.161 +Test -- t2 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.165 +Test -- t3 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.173 +Test -- t4 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.17 +Test -- t5 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.164 +Test -- t6 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.162 +Test -- t7 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.165 +Test -- t8 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.172 +Test -- t9 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.17 +Test -- t10 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.173 +1591313401 Test 10 runs in 6 seconds (ave. 600 msec) -- rbox 1000 L100000 s G1e-6 D5 t1 | qhull Tv + +Testing -- rbox 400 L100000 s G1e-6 D6 t1 | qhull Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-225277.log +Test -- t1 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.354 +Test -- t2 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.364 +Test -- t3 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.4 +Test -- t4 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.346 +Test -- t5 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.354 +Test -- t6 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.327 +Test -- t7 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.355 +Test -- t8 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.353 +Test -- t9 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.318 +Test -- t10 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.352 +1591313409 Test 10 runs in 7 seconds (ave. 700 msec) -- rbox 400 L100000 s G1e-6 D6 t1 | qhull Tv + +==================== +== cone +==================== + +Testing -- rbox 100000 s Z1 G1e-13 D2 t1 | qhull Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-26570.log +Test -- t1 + CPU seconds to compute hull (after input): 0.026 +Test -- t2 + CPU seconds to compute hull (after input): 0.024 +Test -- t3 + CPU seconds to compute hull (after input): 0.042 +Test -- t4 + CPU seconds to compute hull (after input): 0.027 +Test -- t5 + CPU seconds to compute hull (after input): 0.032 +Test -- t6 + CPU seconds to compute hull (after input): 0.02 +Test -- t7 + CPU seconds to compute hull (after input): 0.02 +Test -- t8 + CPU seconds to compute hull (after input): 0.019 +Test -- t9 + CPU seconds to compute hull (after input): 0.02 +Test -- t10 + CPU seconds to compute hull (after input): 0.029 +1591313414 Test 10 runs in 4 seconds (ave. 400 msec) -- rbox 100000 s Z1 G1e-13 D2 t1 | qhull Tv + +Testing -- rbox 10000 s Z1 G1e-13 D3 t1 | qhull Q12 Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-160478.log +Test -- t1 +QH7088 Qhull precision warning: in post-processing (qh_check_maxout) p8 for f18922 is 1.7e-12 above hidden facet f41175 nearest vertices 0.0001 +QH7088 Qhull precision warning: in post-processing (qh_check_maxout) p11 for f11008 is 1.7e-12 above hidden facet f41175 nearest vertices 0.0001 +QH7088 Qhull precision warning: in post-processing (qh_check_maxout) p27 for f29977 is 1.7e-12 above hidden facet f41175 nearest vertices 0.0001 +QH7088 Qhull precision warning: in post-processing (qh_check_maxout) p73 for f29524 is 1.7e-12 above hidden facet f41175 nearest vertices 0.0001 +QH7088 Qhull precision warning: in post-processing (qh_check_maxout) p148 for f29629 is 1.7e-12 above hidden facet f41175 nearest vertices 0.0001 +QH7088 Qhull precision warning: in post-processing (qh_check_maxout) p273 for f19304 is 1.7e-12 above hidden facet f41175 nearest vertices 0.0001 +QH7088 Qhull precision warning: in post-processing (qh_check_maxout) p1065 for f11292 is 1.7e-12 above hidden facet f41175 nearest vertices 0.0001 +QH7088 Qhull precision warning: in post-processing (qh_check_maxout) p1189 for f11280 is 1.7e-12 above hidden facet f41175 nearest vertices 0.0001 +QH7088 Qhull precision warning: in post-processing (qh_check_maxout) p2536 for f29640 is 1.7e-12 above hidden facet f41175 nearest vertices 0.0001 + CPU seconds to compute hull (after input): 0.505 + Maximum distance of point above facet: 1.7e-12 (308.8x) +Test -- t2 + CPU seconds to compute hull (after input): 0.467 +Test -- t3 + CPU seconds to compute hull (after input): 1.49 + Maximum distance of point above facet: 8.5e-14 (15.2x) +Test -- t4 + CPU seconds to compute hull (after input): 0.533 +Test -- t5 + CPU seconds to compute hull (after input): 0.647 +Test -- t6 + CPU seconds to compute hull (after input): 0.47 +Test -- t7 +QH7088 Qhull precision warning: in post-processing (qh_check_maxout) p21 for f56395 is 1.2e-11 above hidden facet f84424 nearest vertices 6.2e-05 +QH7088 Qhull precision warning: in post-processing (qh_check_maxout) p36 for f109744 is 1.2e-11 above hidden facet f84424 nearest vertices 6.2e-05 +QH7088 Qhull precision warning: in post-processing (qh_check_maxout) p217 for f104110 is 1.2e-11 above hidden facet f84424 nearest vertices 6.2e-05 +QH7088 Qhull precision warning: in post-processing (qh_check_maxout) p564 for f89945 is 1.2e-11 above hidden facet f84424 nearest vertices 6.2e-05 +QH7088 Qhull precision warning: in post-processing (qh_check_maxout) p2226 for f56971 is 1.2e-11 above hidden facet f84424 nearest vertices 6.2e-05 +QH7088 Qhull precision warning: in post-processing (qh_check_maxout) p8038 for f89945 is 1.2e-11 above hidden facet f84424 nearest vertices 6.2e-05 +QH7088 Qhull precision warning: in post-processing (qh_check_maxout) p9660 for f104202 is 1.2e-11 above hidden facet f84424 nearest vertices 6.2e-05 + CPU seconds to compute hull (after input): 2.016 + Maximum distance of point above facet: 1.2e-11 (2123.2x) +Test -- t8 + CPU seconds to compute hull (after input): 1.515 + Maximum distance of point above facet: 5.9e-13 (106.8x) +Test -- t9 + CPU seconds to compute hull (after input): 0.513 + Maximum distance of point above facet: 1.9e-13 (33.5x) +Test -- t10 + CPU seconds to compute hull (after input): 0.435 +1591313440 Test 10 runs in 26 seconds (ave. 2600 msec) -- rbox 10000 s Z1 G1e-13 D3 t1 | qhull Q12 Tv + +Testing -- rbox 2000 s Z1 G1e-13 D4 t1 | qhull Q12 Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-564357.log +Test -- t1 + CPU seconds to compute hull (after input): 3.213 +Test -- t2 + CPU seconds to compute hull (after input): 3.322 + Maximum distance of point above facet: 2.5e-13 (24.5x) +Test -- t3 + CPU seconds to compute hull (after input): 2.259 +Test -- t4 + CPU seconds to compute hull (after input): 0.816 +Test -- t5 + CPU seconds to compute hull (after input): 1.606 +Test -- t6 + CPU seconds to compute hull (after input): 0.631 +Test -- t7 + CPU seconds to compute hull (after input): 1.152 +Test -- t8 + CPU seconds to compute hull (after input): 1.7 +Test -- t9 + CPU seconds to compute hull (after input): 1.554 +Test -- t10 + CPU seconds to compute hull (after input): 0.85 +1591313461 Test 10 runs in 20 seconds (ave. 2000 msec) -- rbox 2000 s Z1 G1e-13 D4 t1 | qhull Q12 Tv + +Testing -- rbox 1000 s Z1 G1e-13 D5 t1 | qhull Q12 Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-767374.log +Test -- t1 + CPU seconds to compute hull (after input): 0.509 +Test -- t2 + CPU seconds to compute hull (after input): 1.121 +Test -- t3 +QH6271 qhull topology error (qh_check_dupridge): wide merge (230539152422.1x wider) due to dupridge between f44488 and f44473 (vertex dist 0.061), merge dist 0.032, while processing p101 + CPU seconds to compute hull (after input): 0.539 + Maximum distance of vertex below facet: -0.032 (1972076014119.1x) +Test -- t4 + CPU seconds to compute hull (after input): 0.602 +Test -- t5 + CPU seconds to compute hull (after input): 0.405 +Test -- t6 +QH6271 qhull topology error (qh_check_dupridge): wide merge (35319340797.5x wider) due to dupridge between f39960 and f39992 (vertex dist 0.072), merge dist 0.0062, while processing p696 + CPU seconds to compute hull (after input): 0.667 + Maximum distance of point above facet: 0.00026 (16181662784.3x) + Maximum distance of vertex below facet: -0.0018 (109549989077.6x) +Test -- t7 + CPU seconds to compute hull (after input): 0.544 +Test -- t8 + CPU seconds to compute hull (after input): 0.51 +Test -- t9 + CPU seconds to compute hull (after input): 0.4 +Test -- t10 + CPU seconds to compute hull (after input): 0.536 +1591313472 Test 10 runs in 10 seconds (ave. 1000 msec) -- rbox 1000 s Z1 G1e-13 D5 t1 | qhull Q12 Tv + +Testing -- rbox 400 s Z1 G1e-13 D6 t1 | qhull Q12 Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-635621.log +Test -- t1 + CPU seconds to compute hull (after input): 1.015 +Test -- t2 + CPU seconds to compute hull (after input): 2.154 +Test -- t3 +QH6271 qhull topology error (qh_check_dupridge): wide merge (210507823427.9x wider) due to dupridge between f5405 and f5520 (vertex dist 0.19), merge dist 0.037, while processing p318 + CPU seconds to compute hull (after input): 5.686 +Test -- t4 + CPU seconds to compute hull (after input): 0.884 +Test -- t5 + CPU seconds to compute hull (after input): 2.565 +Test -- t6 +QH6271 qhull topology error (qh_check_dupridge): wide merge (271634975.9x wider) due to dupridge between f96869 and f97564 (vertex dist 0.091), merge dist 0.00015, while processing p223 + CPU seconds to compute hull (after input): 3.793 +Test -- t7 +QH6271 qhull topology error (qh_check_dupridge): wide merge (3447376779583.9x wider) due to dupridge between f2795 and f2801 (vertex dist 0.17), merge dist 0.16, while processing p85 +QH6271 qhull topology error (qh_check_dupridge): wide merge (13981974127.2x wider) due to dupridge between f89269 and f89268 (vertex dist 0.16), merge dist 0.011, while processing p296 + CPU seconds to compute hull (after input): 2.05 + Maximum distance of point above facet: 0.0033 (134133559778.9x) + Maximum distance of vertex below facet: -0.0067 (273160548745.7x) +Test -- t8 +QH6271 qhull topology error (qh_check_dupridge): wide merge (114810705647.7x wider) due to dupridge between f2488 and f2437 (vertex dist 0.23), merge dist 0.0039, while processing p150 +QH6271 qhull topology error (qh_check_dupridge): wide merge (962458297491.5x wider) due to dupridge between f8964 and f9014 (vertex dist 0.21), merge dist 0.074, while processing p351 + CPU seconds to compute hull (after input): 4.798 +Test -- t9 +QH6271 qhull topology error (qh_check_dupridge): wide merge (24322794639.0x wider) due to dupridge between f10036 and f10102 (vertex dist 0.13), merge dist 0.0053, while processing p237 +QH6271 qhull topology error (qh_check_dupridge): wide merge (13665015104.4x wider) due to dupridge between f25745 and f25744 (vertex dist 0.12), merge dist 0.013, while processing p259 +QH6271 qhull topology error (qh_check_dupridge): wide merge (5189398520.6x wider) due to dupridge between f27688 and f27087 (vertex dist 0.12), merge dist 0.005, while processing p60 + CPU seconds to compute hull (after input): 2.728 +Test -- t10 + CPU seconds to compute hull (after input): 1.507 +1591313509 Test 10 runs in 36 seconds (ave. 3600 msec) -- rbox 400 s Z1 G1e-13 D6 t1 | qhull Q12 Tv + +========================== +=== N_OTHER test cases === +========================== + +==================== +== Delaunay triangulation of fuzzy circle (large, narrow disk) +== No Qbb, highly degenerate due to narrow disk of two cospherical sets of points +==================== + +Testing -- rbox 10000 s W1e-13 D2 t1 | qhull d Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-374270.log +Test -- t1 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f13593 into f5532 for mergetype 6 (flip). maxdist 0 (0.0x) mindist -4.3e-11 (7726.8x) vertexdist 0.00042 Allow with 'Q12' (allow-wide) +Test -- t2 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.451 + Maximum distance of point above facet: 8e-12 (1437.2x) +Test -- t3 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f5431 into f3337 for mergetype 6 (flip). maxdist 0 (0.0x) mindist -3.4e-12 (614.3x) vertexdist 0.011 Allow with 'Q12' (allow-wide) + Maximum distance of vertex below facet: -2.5e-13 (45.3x) +Test -- t4 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.453 + Maximum distance of point above facet: 2.5e-12 (455.3x) +Test -- t5 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.298 + Maximum distance of point above facet: 1.8e-12 (318.7x) +Test -- t6 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f2694 into f1989 for mergetype 6 (flip). maxdist 0 (0.0x) mindist -5.5e-12 (986.3x) vertexdist 0.025 Allow with 'Q12' (allow-wide) + Maximum distance of point above facet: 7.8e-14 (14.0x) + Maximum distance of vertex below facet: -1.3e-13 (23.1x) +Test -- t7 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.504 + Maximum distance of point above facet: 2.6e-12 (460.3x) +Test -- t8 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 1.073 + Maximum distance of point above facet: 3.4e-13 (61.2x) +Test -- t9 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.422 + Maximum distance of point above facet: 2.2e-12 (400.0x) +Test -- t10 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7086 Qhull precision warning: repartition coplanar point p3137 from f19949 as an outside point above hidden facet f19948 dist 2.9e-12 nearest vertices 3.4e-06 +QH7086 Qhull precision warning: repartition coplanar point p8476 from f28083 as an outside point above hidden facet f28083 dist 5.7e-12 nearest vertices 1.3e-06 +QH7088 Qhull precision warning: in post-processing (qh_check_maxout) p2710 for f2993 is 4.4e-12 above hidden facet f36150 nearest vertices 5.1e-07 +QH6297 Qhull precision error (qh_check_maxout): large increase in qh.max_outside during post-processing dist 4.4e-12 (102.2x). See warning QH0032/QH0033. Allow with 'Q12' (allow-wide) and 'Pp' + Maximum distance of point above facet: 4.4e-12 (797.8x) +1591313524 Test 10 runs in 14 seconds (ave. 1400 msec) -- rbox 10000 s W1e-13 D2 t1 | qhull d Tv + +Testing -- rbox 2000 s W1e-13 D3 t1 | qhull d Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-842948.log +Test -- t1 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f5159 into f4940 for mergetype 6 (flip). maxdist 0 (0.0x) mindist -3.2e-11 (3209.7x) vertexdist 0.092 Allow with 'Q12' (allow-wide) + Maximum distance of point above facet: 2.2e-13 (22.1x) + Maximum distance of vertex below facet: -2.2e-13 (21.4x) +Test -- t2 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.848 + Maximum distance of point above facet: 4.2e-12 (417.7x) +Test -- t3 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f24055 into f21217 for mergetype 6 (flip). maxdist 0 (0.0x) mindist -1.6e-11 (1628.3x) vertexdist 0.013 Allow with 'Q12' (allow-wide) + Maximum distance of point above facet: 1.7e-12 (171.9x) +Test -- t4 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f5422 into f3326 for mergetype 6 (flip). maxdist 0 (0.0x) mindist -5.5e-12 (545.2x) vertexdist 0.056 Allow with 'Q12' (allow-wide) + Maximum distance of point above facet: 4.8e-13 (47.8x) + Maximum distance of vertex below facet: -3e-13 (29.6x) +Test -- t5 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f6567 into f5543 for mergetype 6 (flip). maxdist 0 (0.0x) mindist -1.9e-12 (186.6x) vertexdist 0.14 Allow with 'Q12' (allow-wide) + Maximum distance of point above facet: 3.2e-12 (317.3x) + Maximum distance of vertex below facet: -8.1e-13 (80.2x) +Test -- t6 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7086 Qhull precision warning: repartition coplanar point p947 from f5509 as an outside point above hidden facet f5521 dist 1.9e-12 nearest vertices 0.0032 +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f6036 into f6042 for mergetype 6 (flip). maxdist 1.7e-12 (166.5x) mindist 0 (-0.0x) vertexdist 0.12 Allow with 'Q12' (allow-wide) + Maximum distance of vertex below facet: -2e-13 (19.6x) +Test -- t7 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f16711 into f13078 for mergetype 6 (flip). maxdist 0 (0.0x) mindist -6.2e-12 (615.7x) vertexdist 0.033 Allow with 'Q12' (allow-wide) + Maximum distance of vertex below facet: -8.5e-13 (84.1x) +Test -- t8 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f20687 into f19136 for mergetype 6 (flip). maxdist 0 (0.0x) mindist -9.5e-12 (947.4x) vertexdist 0.024 Allow with 'Q12' (allow-wide) + Maximum distance of point above facet: 8.2e-12 (809.7x) + Maximum distance of vertex below facet: -2.4e-13 (24.2x) +Test -- t9 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f991 into f4726 for mergetype 3 (concave). maxdist 1.5e-13 (15.4x) mindist -1.2e-12 (123.4x) vertexdist 0.023 Allow with 'Q12' (allow-wide) +Test -- t10 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f2500 into f1666 for mergetype 6 (flip). maxdist 0 (0.0x) mindist -5.5e-12 (541.1x) vertexdist 0.03 Allow with 'Q12' (allow-wide) + Maximum distance of point above facet: 7.8e-13 (77.8x) + Maximum distance of vertex below facet: -3e-13 (29.6x) +1591313528 Test 10 runs in 4 seconds (ave. 400 msec) -- rbox 2000 s W1e-13 D3 t1 | qhull d Tv + +Testing -- rbox 1000 s W1e-13 D4 t1 | qhull d Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-510333.log +Test -- t1 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.75 + Maximum distance of point above facet: 3.5e-13 (21.2x) +Test -- t2 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 1.405 + Maximum distance of point above facet: 2e-12 (125.0x) +Test -- t3 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f71887 into f69472 for mergetype 6 (flip). maxdist 0 (0.0x) mindist -2.7e-12 (165.0x) vertexdist 0.097 Allow with 'Q12' (allow-wide) + Maximum distance of point above facet: 1.6e-12 (97.5x) + Maximum distance of vertex below facet: -1e-12 (63.5x) +Test -- t4 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.599 + Maximum distance of point above facet: 2e-13 (12.4x) +Test -- t5 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f52894 into f47417 for mergetype 6 (flip). maxdist 0 (0.0x) mindist -1.7e-12 (103.0x) vertexdist 0.075 Allow with 'Q12' (allow-wide) + Maximum distance of point above facet: 5.7e-13 (35.6x) + Maximum distance of vertex below facet: -3.9e-13 (24.6x) +Test -- t6 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.754 + Maximum distance of point above facet: 2.1e-13 (12.7x) +Test -- t7 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.781 + Maximum distance of point above facet: 2.6e-13 (16.0x) +Test -- t8 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f71726 into f40542 for mergetype 6 (flip). maxdist 0 (0.0x) mindist -2.1e-12 (128.7x) vertexdist 0.075 Allow with 'Q12' (allow-wide) + Maximum distance of point above facet: 2.4e-12 (149.9x) + Maximum distance of vertex below facet: -5.8e-13 (35.9x) +Test -- t9 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.881 + Maximum distance of point above facet: 2.7e-13 (16.8x) +Test -- t10 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.72 + Maximum distance of point above facet: 6.6e-13 (40.9x) +1591313540 Test 10 runs in 11 seconds (ave. 1100 msec) -- rbox 1000 s W1e-13 D4 t1 | qhull d Tv + +Testing -- rbox 200 s W1e-13 D5 t1 | qhull d Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-378580.log +Test -- t1 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.362 +Test -- t2 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.258 +Test -- t3 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6227 qhull topology error: Only 7 facets remain. The input is too degenerate or the convexity constraints are too strong. + Maximum distance of point above facet: 3.7e-13 (15.2x) + Maximum distance of vertex below facet: -9.9e-13 (40.8x) +Test -- t4 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7086 Qhull precision warning: repartition coplanar point p152 from f29818 as an outside point above hidden facet f24789 dist 1.6e-11 nearest vertices 0.33 + CPU seconds to compute hull (after input): 0.527 + Maximum distance of point above facet: 9.2e-13 (37.7x) +Test -- t5 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.539 +Test -- t6 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.313 +Test -- t7 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.406 +Test -- t8 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.228 +Test -- t9 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.399 +Test -- t10 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.26 +1591313546 Test 10 runs in 6 seconds (ave. 600 msec) -- rbox 200 s W1e-13 D5 t1 | qhull d Tv + +Testing -- rbox 100 s W1e-13 D6 t1 | qhull d Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-579442.log +Test -- t1 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6227 qhull topology error: Only 8 facets remain. The input is too degenerate or the convexity constraints are too strong. + Maximum distance of point above facet: 8.5e-13 (26.9x) + Maximum distance of vertex below facet: -7.6e-13 (24.1x) +Test -- t2 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6227 qhull topology error: Only 8 facets remain. The input is too degenerate or the convexity constraints are too strong. + Maximum distance of point above facet: 6e-13 (19.1x) + Maximum distance of vertex below facet: -9.5e-13 (30.0x) +Test -- t3 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6227 qhull topology error: Only 8 facets remain. The input is too degenerate or the convexity constraints are too strong. + Maximum distance of point above facet: 5.2e-13 (15.6x) + Maximum distance of vertex below facet: -1.2e-12 (36.9x) +Test -- t4 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6227 qhull topology error: Only 8 facets remain. The input is too degenerate or the convexity constraints are too strong. + Maximum distance of point above facet: 3.9e-12 (129.6x) + Maximum distance of vertex below facet: -1e-12 (33.3x) +Test -- t5 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6227 qhull topology error: Only 8 facets remain. The input is too degenerate or the convexity constraints are too strong. + Maximum distance of point above facet: 6.9e-13 (21.4x) + Maximum distance of vertex below facet: -7.9e-13 (24.8x) +Test -- t6 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6227 qhull topology error: Only 8 facets remain. The input is too degenerate or the convexity constraints are too strong. + Maximum distance of point above facet: 6.1e-13 (18.2x) + Maximum distance of vertex below facet: -9.5e-13 (28.3x) +Test -- t7 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.487 +Test -- t8 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6227 qhull topology error: Only 8 facets remain. The input is too degenerate or the convexity constraints are too strong. + Maximum distance of vertex below facet: -1.3e-12 (41.0x) +Test -- t9 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6227 qhull topology error: Only 8 facets remain. The input is too degenerate or the convexity constraints are too strong. + Maximum distance of vertex below facet: -6.7e-13 (21.0x) +Test -- t10 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6227 qhull topology error: Only 8 facets remain. The input is too degenerate or the convexity constraints are too strong. + Maximum distance of point above facet: 5e-13 (16.1x) + Maximum distance of vertex below facet: -1.4e-12 (45.7x) +1591313551 Test 10 runs in 5 seconds (ave. 500 msec) -- rbox 100 s W1e-13 D6 t1 | qhull d Tv + +=========================================================== +=== N_PINCHED test cases for Q14-merge-pinched-vertices === +=========================================================== + +==================== +== Convex hull of fuzzy cube with point pairs (large flat facets) +==================== + +Testing -- rbox 1000000 W1e-13 C1,2e-13 D2 t1 | qhull Q14 Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-246827.log +Test -- t1 + CPU seconds to compute hull (after input): 0.332 +Test -- t2 + CPU seconds to compute hull (after input): 0.309 +Test -- t3 + CPU seconds to compute hull (after input): 0.343 +Test -- t4 + CPU seconds to compute hull (after input): 0.314 +Test -- t5 + CPU seconds to compute hull (after input): 0.307 +Test -- t6 + CPU seconds to compute hull (after input): 0.301 +Test -- t7 + CPU seconds to compute hull (after input): 0.295 +Test -- t8 + CPU seconds to compute hull (after input): 0.347 +Test -- t9 + CPU seconds to compute hull (after input): 0.293 +Test -- t10 + CPU seconds to compute hull (after input): 0.279 +1591313609 Test 10 runs in 57 seconds (ave. 5700 msec) -- rbox 1000000 W1e-13 C1,2e-13 D2 t1 | qhull Q14 Tv + +Testing -- rbox 500000 W1e-13 C1,2e-13 D3 t1 | qhull Q14 Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-188493.log +Test -- t1 + CPU seconds to compute hull (after input): 0.641 +Test -- t2 + CPU seconds to compute hull (after input): 0.576 +Test -- t3 + CPU seconds to compute hull (after input): 0.487 +Test -- t4 + CPU seconds to compute hull (after input): 0.492 +Test -- t5 + CPU seconds to compute hull (after input): 0.508 +Test -- t6 + CPU seconds to compute hull (after input): 0.603 +Test -- t7 + CPU seconds to compute hull (after input): 0.556 +Test -- t8 + CPU seconds to compute hull (after input): 0.558 +Test -- t9 + CPU seconds to compute hull (after input): 0.605 +Test -- t10 + CPU seconds to compute hull (after input): 0.53 +1591313735 Test 10 runs in 126 seconds (ave. 12600 msec) -- rbox 500000 W1e-13 C1,2e-13 D3 t1 | qhull Q14 Tv + +Testing -- rbox 20000 W1e-13 C1,2e-13 D4 t1 | qhull Q14 Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-940072.log +Test -- t1 + CPU seconds to compute hull (after input): 0.148 +Test -- t2 + CPU seconds to compute hull (after input): 0.126 +Test -- t3 + CPU seconds to compute hull (after input): 0.147 +Test -- t4 + CPU seconds to compute hull (after input): 0.178 +Test -- t5 + CPU seconds to compute hull (after input): 0.178 +Test -- t6 + CPU seconds to compute hull (after input): 0.14 +Test -- t7 + CPU seconds to compute hull (after input): 0.169 +Test -- t8 + CPU seconds to compute hull (after input): 0.144 +Test -- t9 + CPU seconds to compute hull (after input): 0.141 +Test -- t10 + CPU seconds to compute hull (after input): 0.145 +1591313766 Test 10 runs in 30 seconds (ave. 3000 msec) -- rbox 20000 W1e-13 C1,2e-13 D4 t1 | qhull Q14 Tv + +Testing -- rbox 2000 W1e-13 C1,2e-13 D5 t1 | qhull Q14 Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-944382.log +Test -- t1 +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f113177 into f113175 for mergetype 7 (dupridge). maxdist 0 (0.0x) mindist -1.5e-12 (92.2x) vertexdist 0.16 Allow with 'Q12' (allow-wide) + Maximum distance of point above facet: 1.8e-13 (11.2x) +Test -- t2 + CPU seconds to compute hull (after input): 0.438 +Test -- t3 +QH7085 Qhull precision warning: repartition coplanar point p2235 from f117398 as an outside point above twisted facet f115796 dist 0.00029 nearest vertices 2.1e-13 + CPU seconds to compute hull (after input): 0.389 +Test -- t4 +QH7085 Qhull precision warning: repartition coplanar point p2331 from f138633 as an outside point above twisted facet f138769 dist 0.0037 nearest vertices 2.2e-13 +QH7085 Qhull precision warning: repartition coplanar point p2331 from f142401 as an outside point above twisted facet f142401 dist 0.0037 nearest vertices 2.2e-13 + CPU seconds to compute hull (after input): 0.504 +Test -- t5 + CPU seconds to compute hull (after input): 0.438 +Test -- t6 + CPU seconds to compute hull (after input): 0.407 + Maximum distance of point above facet: 1.7e-13 (10.5x) +Test -- t7 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r15110 and r15115. Nearest v591 and v666 dist 0.38 (25519640968939.1x) +Test -- t8 + CPU seconds to compute hull (after input): 0.459 + Maximum distance of point above facet: 2e-13 (12.4x) +Test -- t9 + CPU seconds to compute hull (after input): 0.482 + Maximum distance of point above facet: 1.9e-13 (11.5x) + Maximum distance of vertex below facet: -1.9e-13 (11.7x) +Test -- t10 + CPU seconds to compute hull (after input): 0.425 +1591313780 Test 10 runs in 13 seconds (ave. 1300 msec) -- rbox 2000 W1e-13 C1,2e-13 D5 t1 | qhull Q14 Tv + +Testing -- rbox 500 W1e-13 C1,2e-13 D6 t1 | qhull Q14 Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-413060.log +Test -- t1 + CPU seconds to compute hull (after input): 1.246 + Maximum distance of point above facet: 3e-13 (12.3x) + Maximum distance of vertex below facet: -2.9e-13 (11.9x) +Test -- t2 + CPU seconds to compute hull (after input): 1.228 + Maximum distance of point above facet: 3.1e-13 (12.7x) + Maximum distance of vertex below facet: -2.6e-13 (10.4x) +Test -- t3 +QH7085 Qhull precision warning: repartition coplanar point p512 from f323305 as an outside point above twisted facet f322364 dist 0.00083 nearest vertices 2.9e-13 + CPU seconds to compute hull (after input): 1.232 + Maximum distance of point above facet: 2.8e-13 (11.5x) + Maximum distance of vertex below facet: -2.6e-13 (10.7x) +Test -- t4 +QH6271 qhull topology error (qh_check_dupridge): wide merge (476654024777.9x wider) due to dupridge between f307863 and f307761 (vertex dist 2.6e-13), merge dist 0.092, while processing p516 +Test -- t5 + CPU seconds to compute hull (after input): 1.118 + Maximum distance of point above facet: 2.8e-13 (11.3x) + Maximum distance of vertex below facet: -2.7e-13 (11.1x) +Test -- t6 + CPU seconds to compute hull (after input): 1.231 + Maximum distance of point above facet: 2.9e-13 (12.0x) + Maximum distance of vertex below facet: -2.9e-13 (11.8x) +Test -- t7 +QH7085 Qhull precision warning: repartition coplanar point p73 from f185396 as an outside point above twisted facet f161746 dist 0.00022 nearest vertices 2.3e-13 + CPU seconds to compute hull (after input): 1.162 +Test -- t8 +QH6271 qhull topology error (qh_check_dupridge): wide merge (33125155946.5x wider) due to dupridge between f313208 and f313293 (vertex dist 1.4e-13), merge dist 0.016, while processing p504 + Maximum distance of point above facet: 4.9e-13 (19.7x) + Maximum distance of vertex below facet: -3.8e-13 (15.3x) +Test -- t9 + CPU seconds to compute hull (after input): 1.196 + Maximum distance of point above facet: 2.9e-13 (11.7x) + Maximum distance of vertex below facet: -6e-13 (24.2x) +Test -- t10 + CPU seconds to compute hull (after input): 1.176 + Maximum distance of point above facet: 3e-13 (12.1x) + Maximum distance of vertex below facet: -3.1e-13 (12.7x) +1591313798 Test 10 runs in 17 seconds (ave. 1700 msec) -- rbox 500 W1e-13 C1,2e-13 D6 t1 | qhull Q14 Tv + +==================== +== Convex hull of cube with point pairs (large flat facets) +==================== + +Testing -- rbox 1000000 W0 C1,2e-13 D2 t1 | qhull Q14 Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-15646.log +Test -- t1 + CPU seconds to compute hull (after input): 0.292 +Test -- t2 + CPU seconds to compute hull (after input): 0.286 +Test -- t3 + CPU seconds to compute hull (after input): 0.299 +Test -- t4 + CPU seconds to compute hull (after input): 0.353 +Test -- t5 + CPU seconds to compute hull (after input): 0.319 +Test -- t6 + CPU seconds to compute hull (after input): 0.362 +Test -- t7 + CPU seconds to compute hull (after input): 0.312 +Test -- t8 + CPU seconds to compute hull (after input): 0.312 +Test -- t9 + CPU seconds to compute hull (after input): 0.306 +Test -- t10 + CPU seconds to compute hull (after input): 0.364 +1591313851 Test 10 runs in 52 seconds (ave. 5200 msec) -- rbox 1000000 W0 C1,2e-13 D2 t1 | qhull Q14 Tv + +Testing -- rbox 100000 W0 C1,2e-13 D3 t1 | qhull Q14 Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-289927.log +Test -- t1 + CPU seconds to compute hull (after input): 0.08 +Test -- t2 + CPU seconds to compute hull (after input): 0.112 +Test -- t3 + CPU seconds to compute hull (after input): 0.082 +Test -- t4 + CPU seconds to compute hull (after input): 0.093 +Test -- t5 + CPU seconds to compute hull (after input): 0.099 +Test -- t6 + CPU seconds to compute hull (after input): 0.099 +Test -- t7 + CPU seconds to compute hull (after input): 0.082 +Test -- t8 + CPU seconds to compute hull (after input): 0.091 +Test -- t9 + CPU seconds to compute hull (after input): 0.087 +Test -- t10 + CPU seconds to compute hull (after input): 0.094 +1591313873 Test 10 runs in 21 seconds (ave. 2100 msec) -- rbox 100000 W0 C1,2e-13 D3 t1 | qhull Q14 Tv + +Testing -- rbox 5000 W0 C1,2e-13 D4 t1 | qhull Q14 Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-26421.log +Test -- t1 +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f25732 into f25739 for mergetype 7 (dupridge). maxdist 1.7e-12 (170.7x) mindist 0 (-0.0x) vertexdist 0.077 Allow with 'Q12' (allow-wide) + Maximum distance of point above facet: 1.7e-13 (17.0x) +Test -- t2 + CPU seconds to compute hull (after input): 0.054 +Test -- t3 + CPU seconds to compute hull (after input): 0.048 +Test -- t4 + CPU seconds to compute hull (after input): 0.058 +Test -- t5 + CPU seconds to compute hull (after input): 0.05 +Test -- t6 + CPU seconds to compute hull (after input): 0.058 +Test -- t7 + CPU seconds to compute hull (after input): 0.047 +Test -- t8 + CPU seconds to compute hull (after input): 0.054 +Test -- t9 + CPU seconds to compute hull (after input): 0.046 +Test -- t10 + CPU seconds to compute hull (after input): 0.047 +1591313879 Test 10 runs in 6 seconds (ave. 600 msec) -- rbox 5000 W0 C1,2e-13 D4 t1 | qhull Q14 Tv + +Testing -- rbox 1000 W0 C1,2e-13 D5 t1 | qhull Q14 Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-760760.log +Test -- t1 +QH7085 Qhull precision warning: repartition coplanar point p267 from f75220 as an outside point above twisted facet f75416 dist 0.0034 nearest vertices 2.3e-13 +QH7085 Qhull precision warning: repartition coplanar point p267 from f75294 as an outside point above twisted facet f82791 dist 0.0035 nearest vertices 2.3e-13 + CPU seconds to compute hull (after input): 0.226 + Maximum distance of point above facet: 1.8e-13 (11.1x) + Maximum distance of vertex below facet: -1.8e-13 (10.9x) +Test -- t2 + CPU seconds to compute hull (after input): 0.198 +Test -- t3 +QH7085 Qhull precision warning: repartition coplanar point p401 from f90444 as an outside point above twisted facet f90433 dist 0.00047 nearest vertices 3.2e-13 + CPU seconds to compute hull (after input): 0.177 + Maximum distance of point above facet: 2.3e-13 (13.8x) + Maximum distance of vertex below facet: -1.8e-13 (11.1x) +Test -- t4 + CPU seconds to compute hull (after input): 0.208 +Test -- t5 + CPU seconds to compute hull (after input): 0.243 +Test -- t6 + CPU seconds to compute hull (after input): 0.211 + Maximum distance of point above facet: 2e-13 (12.0x) +Test -- t7 + CPU seconds to compute hull (after input): 0.205 +Test -- t8 + CPU seconds to compute hull (after input): 0.194 +Test -- t9 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r12609 and r12598. Nearest v498 and v570 dist 0.51 (33702563635476.9x) +Test -- t10 + CPU seconds to compute hull (after input): 0.19 +1591313886 Test 10 runs in 6 seconds (ave. 600 msec) -- rbox 1000 W0 C1,2e-13 D5 t1 | qhull Q14 Tv + +Testing -- rbox 500 W0 C1,2e-13 D6 t1 | qhull Q14 Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-495099.log +Test -- t1 +QH7085 Qhull precision warning: repartition coplanar point p75 from f228039 as an outside point above twisted facet f249986 dist 0.00033 nearest vertices 3.2e-13 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r79874 and r79879. Nearest v324 and v535 dist 0.46 (19985215447239.0x) +Test -- t2 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r66254 and r66259. Nearest v20 and v213 dist 0.49 (21557823068697.4x) + Maximum distance of point above facet: 5.7e-13 (23.1x) +Test -- t3 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r22309 and r22303. Nearest v26 and v290 dist 0.43 (18762058006914.9x) +Test -- t4 + CPU seconds to compute hull (after input): 1.283 + Maximum distance of point above facet: 2.5e-13 (10.1x) + Maximum distance of vertex below facet: -3e-13 (12.2x) +Test -- t5 + CPU seconds to compute hull (after input): 1.132 + Maximum distance of vertex below facet: -2.5e-13 (10.0x) +Test -- t6 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r142084 and r143506. Nearest v236 and v580 dist 0.28 (12167221004784.7x) + Maximum distance of point above facet: 5.3e-13 (21.6x) + Maximum distance of vertex below facet: -6.3e-13 (25.7x) +Test -- t7 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r93165 and r93538. Nearest v296 and v410 dist 0.48 (21206162079995.6x) + Maximum distance of vertex below facet: -2.9e-13 (11.7x) +Test -- t8 + CPU seconds to compute hull (after input): 1.33 + Maximum distance of point above facet: 2.7e-13 (11.1x) + Maximum distance of vertex below facet: -3e-13 (12.1x) +Test -- t9 + CPU seconds to compute hull (after input): 1.201 + Maximum distance of point above facet: 2.9e-13 (11.7x) + Maximum distance of vertex below facet: -2.8e-13 (11.4x) +Test -- t10 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r54174 and r72009. Nearest v295 and v518 dist 0.37 (15990634214780.1x) +1591313899 Test 10 runs in 12 seconds (ave. 1200 msec) -- rbox 500 W0 C1,2e-13 D6 t1 | qhull Q14 Tv + +==================== +== Delaunay triangulation of point pairs (large upper facet) +== Difficult case due to large upper facet with nearly adjacent vertices +== A bounding box helps avoid this case, see TIME_DELAUNAY_PAIRS +==================== + +Testing -- rbox 100000 C1,2e-13 D2 t1 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-430300.log +Test -- t1 + CPU seconds to compute hull (after input): 1.03 +Test -- t2 + CPU seconds to compute hull (after input): 1.141 +Test -- t3 + CPU seconds to compute hull (after input): 1.077 +Test -- t4 + CPU seconds to compute hull (after input): 1.058 +Test -- t5 + CPU seconds to compute hull (after input): 1.068 +Test -- t6 + CPU seconds to compute hull (after input): 1.105 +Test -- t7 + CPU seconds to compute hull (after input): 1.063 +Test -- t8 + CPU seconds to compute hull (after input): 1.053 +Test -- t9 + CPU seconds to compute hull (after input): 1.155 +Test -- t10 + CPU seconds to compute hull (after input): 1.039 +1591313919 Test 10 runs in 19 seconds (ave. 1900 msec) -- rbox 100000 C1,2e-13 D2 t1 | qhull Q14 d Qbb + +Testing -- rbox 10000 C1,2e-13 D3 t1 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-99840.log +Test -- t1 + CPU seconds to compute hull (after input): 0.567 + Maximum distance of point above facet: 1.3e-13 (12.4x) + Maximum distance of vertex below facet: -1.4e-13 (13.6x) +Test -- t2 + CPU seconds to compute hull (after input): 0.578 + Maximum distance of point above facet: 1.2e-13 (12.1x) + Maximum distance of vertex below facet: -1.3e-13 (12.6x) +Test -- t3 + CPU seconds to compute hull (after input): 0.6 +Test -- t4 + CPU seconds to compute hull (after input): 0.586 + Maximum distance of point above facet: 1.7e-13 (17.0x) + Maximum distance of vertex below facet: -1.7e-13 (17.0x) +Test -- t5 + CPU seconds to compute hull (after input): 0.666 +Test -- t6 + CPU seconds to compute hull (after input): 0.57 +Test -- t7 + CPU seconds to compute hull (after input): 0.554 + Maximum distance of point above facet: 1.2e-13 (11.9x) + Maximum distance of vertex below facet: -1e-13 (10.0x) +Test -- t8 + CPU seconds to compute hull (after input): 0.595 + Maximum distance of point above facet: 1.6e-13 (15.6x) + Maximum distance of vertex below facet: -1.6e-13 (15.4x) +Test -- t9 + CPU seconds to compute hull (after input): 0.591 +Test -- t10 + CPU seconds to compute hull (after input): 0.569 + Maximum distance of point above facet: 1.7e-13 (17.2x) +1591314060 Test 10 runs in 140 seconds (ave. 14000 msec) -- rbox 10000 C1,2e-13 D3 t1 | qhull Q14 d Qbb Tv + +Testing -- rbox 500 C1,2e-13 D4 t1 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-786620.log +Test -- t1 + CPU seconds to compute hull (after input): 0.251 + Maximum distance of point above facet: 1.7e-13 (10.4x) +Test -- t2 + CPU seconds to compute hull (after input): 0.297 +Test -- t3 +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f61980 into f61983 for mergetype 3 (concave). maxdist 0 (0.0x) mindist -0.00029 (17708951316.3x) vertexdist 0.24 Allow with 'Q12' (allow-wide) +Test -- t4 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r37323 and r37309. Nearest v145 and v655 dist 0.067 (4459578188183.3x) +Test -- t5 +QH6348 qhull precision error (qh_mergefacet): wide merge for pinched facet f90244 into f90226 for mergetype 3 (concave). maxdist 8.9e-16 (0x) mindist -0.00072 (43999621074.9x) vertexdist 2.3e-13 Allow with 'Q12' (allow-wide) + Maximum distance of point above facet: 2.5e-13 (15.4x) +Test -- t6 + CPU seconds to compute hull (after input): 0.245 +Test -- t7 +QH7085 Qhull precision warning: repartition coplanar point p939 from f58978 as an outside point above twisted facet f53492 dist 0.00041 nearest vertices 2.1e-13 + CPU seconds to compute hull (after input): 0.248 +Test -- t8 +QH6391 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve opposite oriented ridges r49440 and r49431 in f83434 and f83454. Nearest v702 and v749 dist 0.13 (8887619111449.9x) +Test -- t9 + CPU seconds to compute hull (after input): 0.269 +Test -- t10 + CPU seconds to compute hull (after input): 0.287 + Maximum distance of point above facet: 2.2e-13 (13.3x) + Maximum distance of vertex below facet: -2.2e-13 (13.3x) +1591314066 Test 10 runs in 5 seconds (ave. 500 msec) -- rbox 500 C1,2e-13 D4 t1 | qhull Q14 d Qbb Tv + +Testing -- rbox 200 C1,2e-13 D5 t1 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-987482.log +Test -- t1 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f185034 and f185037 have the same vertices (skip 1, skip 1) and same horizon ridges to f141174 and f144760 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f185034 and f185037 have the same vertices (skip 2, skip 2) and same horizon ridges to f141174 and f144760 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f185034 and f185037 have the same vertices (skip 3, skip 3) and same horizon ridges to f141174 and f144760 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f185034 and f185037 have the same vertices (skip 4, skip 4) and same horizon ridges to f141174 and f144760 + CPU seconds to compute hull (after input): 0.593 + Maximum distance of point above facet: 2.9e-13 (11.9x) + Maximum distance of vertex below facet: -3e-13 (12.1x) +Test -- t2 +QH6348 qhull precision error (qh_mergefacet): wide merge for pinched facet f174047 into f174042 for mergetype 10 (degen). maxdist 0 (0x) mindist -0.0016 (66839804109.7x) vertexdist 2.3e-13 Allow with 'Q12' (allow-wide) + Maximum distance of point above facet: 3e-13 (12.4x) +Test -- t3 +QH7085 Qhull precision warning: repartition coplanar point p347 from f112661 as an outside point above twisted facet f84991 dist 0.012 nearest vertices 2.4e-13 +QH7085 Qhull precision warning: repartition coplanar point p262 from f146466 as an outside point above twisted facet f146340 dist 0.0036 nearest vertices 2.7e-13 + CPU seconds to compute hull (after input): 0.677 + Maximum distance of point above facet: 2.9e-13 (11.6x) + Maximum distance of vertex below facet: -2.8e-13 (11.3x) +Test -- t4 + CPU seconds to compute hull (after input): 0.617 + Maximum distance of point above facet: 3.2e-13 (12.8x) + Maximum distance of vertex below facet: -3.1e-13 (12.8x) +Test -- t5 + CPU seconds to compute hull (after input): 0.612 + Maximum distance of vertex below facet: -3.1e-13 (12.5x) +Test -- t6 +QH7085 Qhull precision warning: repartition coplanar point p360 from f151288 as an outside point above twisted facet f150803 dist 0.0006 nearest vertices 2.3e-13 + CPU seconds to compute hull (after input): 0.648 + Maximum distance of point above facet: 2.7e-13 (11.1x) + Maximum distance of vertex below facet: -2.7e-13 (11.0x) +Test -- t7 +QH6271 qhull topology error (qh_check_dupridge): wide merge (137048246420.0x wider) due to dupridge between f120616 and f120712 (vertex dist 2.9e-13), merge dist 0.032, while processing p87 +Test -- t8 +QH7085 Qhull precision warning: repartition coplanar point p398 from f162825 as an outside point above twisted facet f161866 dist 0.0035 nearest vertices 2.4e-13 + CPU seconds to compute hull (after input): 0.655 + Maximum distance of point above facet: 3.3e-13 (13.2x) + Maximum distance of vertex below facet: -3.1e-13 (12.7x) +Test -- t9 +QH7085 Qhull precision warning: repartition coplanar point p20 from f184186 as an outside point above twisted facet f151412 dist 0.0025 nearest vertices 2.3e-13 +QH7085 Qhull precision warning: repartition coplanar point p170 from f185019 as an outside point above twisted facet f185295 dist 0.0019 nearest vertices 2.6e-13 +QH6348 qhull precision error (qh_mergefacet): wide merge for pinched facet f201965 into f164338 for mergetype 10 (degen). maxdist 0 (0x) mindist -0.00068 (27672717659.2x) vertexdist 2.6e-13 Allow with 'Q12' (allow-wide) +Test -- t10 +QH7085 Qhull precision warning: repartition coplanar point p299 from f93758 as an outside point above twisted facet f108187 dist 0.00051 nearest vertices 2.5e-13 +QH7085 Qhull precision warning: repartition coplanar point p80 from f146206 as an outside point above twisted facet f146404 dist 0.0016 nearest vertices 2.1e-13 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f173687 and f173690 have the same vertices (skip 2, skip 2) and same horizon ridges to f148123 and f114638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f173687 and f173690 have the same vertices (skip 4, skip 4) and same horizon ridges to f148123 and f114638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f173687 and f173690 have the same vertices (skip 5, skip 5) and same horizon ridges to f148123 and f114638 +QH6155 qhull topology error (qh_matchdupridge): missing qh_DUPLICATEridge at f173690 skip 4 for new f173687 skip 4 hash 2975 ismatch 1. Set by qh_matchneighbor +1591314074 Test 10 runs in 8 seconds (ave. 800 msec) -- rbox 200 C1,2e-13 D5 t1 | qhull Q14 d Qbb Tv + +Testing -- rbox 100 C1,2e-13 D6 t1 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-788775.log +Test -- t1 + CPU seconds to compute hull (after input): 1.063 + Maximum distance of vertex below facet: -3.7e-13 (10.6x) +Test -- t2 + CPU seconds to compute hull (after input): 0.989 +Test -- t3 + CPU seconds to compute hull (after input): 1.078 +Test -- t4 + CPU seconds to compute hull (after input): 1.032 + Maximum distance of point above facet: 3.6e-13 (10.3x) + Maximum distance of vertex below facet: -3.6e-13 (10.4x) +Test -- t5 + CPU seconds to compute hull (after input): 1.035 + Maximum distance of point above facet: 3.9e-13 (11.2x) + Maximum distance of vertex below facet: -3.5e-13 (10.0x) +Test -- t6 + CPU seconds to compute hull (after input): 1.183 + Maximum distance of point above facet: 3.6e-13 (10.2x) + Maximum distance of vertex below facet: -3.6e-13 (10.2x) +Test -- t7 + CPU seconds to compute hull (after input): 1.035 + Maximum distance of point above facet: 3.6e-13 (10.3x) + Maximum distance of vertex below facet: -3.9e-13 (11.2x) +Test -- t8 + CPU seconds to compute hull (after input): 1.092 + Maximum distance of point above facet: 3.9e-13 (11.2x) +Test -- t9 + CPU seconds to compute hull (after input): 1.053 + Maximum distance of vertex below facet: -3.5e-13 (10.1x) +Test -- t10 + CPU seconds to compute hull (after input): 1.133 +1591314089 Test 10 runs in 14 seconds (ave. 1400 msec) -- rbox 100 C1,2e-13 D6 t1 | qhull Q14 d Qbb Tv + +==================== +== Delaunay triangulation of point quads (2e-13, large upper facet) +== Difficult case due to large upper facet with many nearly adjacent vertices +==================== + +Testing -- rbox 50000 C3,2e-13 D2 t1 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-257453.log +Test -- t1 + CPU seconds to compute hull (after input): 0.79 +Test -- t2 + CPU seconds to compute hull (after input): 0.816 +Test -- t3 + CPU seconds to compute hull (after input): 0.751 +Test -- t4 + CPU seconds to compute hull (after input): 0.794 +Test -- t5 + CPU seconds to compute hull (after input): 0.827 +Test -- t6 + CPU seconds to compute hull (after input): 0.816 +Test -- t7 + CPU seconds to compute hull (after input): 0.756 +Test -- t8 + CPU seconds to compute hull (after input): 0.788 +Test -- t9 + CPU seconds to compute hull (after input): 0.807 +Test -- t10 + CPU seconds to compute hull (after input): 0.798 +1591314105 Test 10 runs in 15 seconds (ave. 1500 msec) -- rbox 50000 C3,2e-13 D2 t1 | qhull Q14 d Qbb + +Testing -- rbox 10000 C3,2e-13 D3 t1 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-793085.log +Test -- t1 +QH7085 Qhull precision warning: repartition coplanar point p12320 from f382177 as an outside point above twisted facet f291472 dist 1.2e-05 nearest vertices 2.4e-13 + CPU seconds to compute hull (after input): 1.319 + Maximum distance of point above facet: 1.7e-13 (16.5x) + Maximum distance of vertex below facet: -2.8e-13 (27.9x) +Test -- t2 + CPU seconds to compute hull (after input): 1.19 + Maximum distance of point above facet: 2e-13 (19.9x) + Maximum distance of vertex below facet: -3e-13 (29.5x) +Test -- t3 +QH6271 qhull topology error (qh_check_dupridge): wide merge (23901933399.7x wider) due to dupridge between f137488 and f137468 (vertex dist 1.5e-13), merge dist 0.0039, while processing p17270 + Maximum distance of point above facet: 1.6e-13 (16.3x) +Test -- t4 +QH7085 Qhull precision warning: repartition coplanar point p29925 from f280725 as an outside point above twisted facet f256639 dist 0.00035 nearest vertices 3.3e-13 + CPU seconds to compute hull (after input): 1.327 +Test -- t5 + CPU seconds to compute hull (after input): 1.315 + Maximum distance of vertex below facet: -2e-13 (20.2x) +Test -- t6 +QH6271 qhull topology error (qh_check_dupridge): wide merge (11702792832.0x wider) due to dupridge between f387461 and f387449 (vertex dist 2.6e-13), merge dist 0.00061, while processing p22990 + Maximum distance of vertex below facet: -2.2e-13 (21.3x) +Test -- t7 +QH7085 Qhull precision warning: repartition coplanar point p5375 from f42124 as an outside point above twisted facet f35929 dist 0.00017 nearest vertices 2.3e-13 +QH7085 Qhull precision warning: repartition coplanar point p12414 from f118528 as an outside point above twisted facet f118402 dist 8.2e-05 nearest vertices 2.9e-13 +QH7085 Qhull precision warning: repartition coplanar point p12412 from f131934 as an outside point above twisted facet f118402 dist 8.2e-05 nearest vertices 2.9e-13 +QH6271 qhull topology error (qh_check_dupridge): wide merge (34223214094.6x wider) due to dupridge between f220362 and f220384 (vertex dist 2.1e-13), merge dist 0.0034, while processing p30020 +Test -- t8 +QH6271 qhull topology error (qh_check_dupridge): wide merge (7996982012.6x wider) due to dupridge between f145209 and f145190 (vertex dist 2.5e-13), merge dist 0.00036, while processing p33922 +Test -- t9 +QH6348 qhull precision error (qh_mergefacet): wide merge for pinched facet f281312 into f281315 for mergetype 10 (degen). maxdist 0.00023 (22681376866x) mindist 0 (-0.0x) vertexdist 2.8e-13 Allow with 'Q12' (allow-wide) + Maximum distance of point above facet: 1.5e-13 (14.5x) + Maximum distance of vertex below facet: -1.9e-13 (18.6x) +Test -- t10 +QH7085 Qhull precision warning: repartition coplanar point p13174 from f115708 as an outside point above twisted facet f75801 dist 6.2e-05 nearest vertices 1.8e-13 + CPU seconds to compute hull (after input): 1.255 + Maximum distance of point above facet: 1.2e-13 (11.9x) + Maximum distance of vertex below facet: -1.5e-13 (15.0x) +1591314118 Test 10 runs in 13 seconds (ave. 1300 msec) -- rbox 10000 C3,2e-13 D3 t1 | qhull Q14 d Qbb + +Testing -- rbox 200 C3,2e-13 D4 t1 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-728286.log +Test -- t1 +QH7085 Qhull precision warning: repartition coplanar point p472 from f30497 as an outside point above twisted facet f28296 dist 0.0013 nearest vertices 2.9e-13 +QH7085 Qhull precision warning: repartition coplanar point p474 from f15245 as an outside point above twisted facet f28296 dist 0.0013 nearest vertices 2.9e-13 +QH7085 Qhull precision warning: repartition coplanar point p475 from f25323 as an outside point above twisted facet f28296 dist 0.0013 nearest vertices 2.9e-13 +QH7085 Qhull precision warning: repartition coplanar point p360 from f32075 as an outside point above twisted facet f38829 dist 0.0016 nearest vertices 3.3e-13 +QH7085 Qhull precision warning: repartition coplanar point p568 from f45312 as an outside point above twisted facet f61895 dist 0.00052 nearest vertices 3.2e-13 + CPU seconds to compute hull (after input): 0.233 + Maximum distance of vertex below facet: -2.2e-13 (13.2x) +Test -- t2 +QH6271 qhull topology error (qh_check_dupridge): wide merge (428757713021.6x wider) due to dupridge between f60125 and f60186 (vertex dist 1.8e-13), merge dist 0.046, while processing p212 +Test -- t3 +QH7085 Qhull precision warning: repartition coplanar point p712 from f33823 as an outside point above twisted facet f33910 dist 0.0062 nearest vertices 3e-13 +QH7085 Qhull precision warning: repartition coplanar point p489 from f63992 as an outside point above twisted facet f58682 dist 0.00083 nearest vertices 2.6e-13 +QH7085 Qhull precision warning: repartition coplanar point p712 from f65054 as an outside point above twisted facet f65054 dist 0.0062 nearest vertices 3e-13 + CPU seconds to compute hull (after input): 0.224 + Maximum distance of point above facet: 2.7e-13 (16.3x) + Maximum distance of vertex below facet: -2.6e-13 (16.0x) +Test -- t4 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f85331 and f85334 have the same vertices (skip 1, skip 1) and same horizon ridges to f56870 and f56807 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f85331 and f85334 have the same vertices (skip 3, skip 3) and same horizon ridges to f56870 and f56807 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f85331 and f85334 have the same vertices (skip 4, skip 4) and same horizon ridges to f56870 and f56807 + CPU seconds to compute hull (after input): 0.244 + Maximum distance of point above facet: 1.7e-13 (10.2x) + Maximum distance of vertex below facet: -2.1e-13 (13.0x) +Test -- t5 + CPU seconds to compute hull (after input): 0.25 + Maximum distance of point above facet: 2.7e-13 (16.2x) +Test -- t6 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f69535 and f69536 have the same vertices (skip 2, skip 2) and same horizon ridges to f67282 and f55324 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f69535 and f69536 have the same vertices (skip 4, skip 4) and same horizon ridges to f67282 and f55324 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r33127 and r33205. Nearest v112 and v298 dist 0.44 (29005168264526.7x) +Test -- t7 +QH6271 qhull topology error (qh_check_dupridge): wide merge (127462857834.9x wider) due to dupridge between f68944 and f69003 (vertex dist 1.8e-13), merge dist 0.026, while processing p131 + Maximum distance of point above facet: 2e-13 (12.4x) +Test -- t8 +QH7085 Qhull precision warning: repartition coplanar point p676 from f45805 as an outside point above twisted facet f45702 dist 0.0013 nearest vertices 2.1e-13 +QH7085 Qhull precision warning: repartition coplanar point p676 from f57639 as an outside point above twisted facet f57674 dist 0.0013 nearest vertices 2.1e-13 + CPU seconds to compute hull (after input): 0.223 + Maximum distance of point above facet: 2.2e-13 (13.6x) +Test -- t9 +QH6271 qhull topology error (qh_check_dupridge): wide merge (32039228101.5x wider) due to dupridge between f54848 and f54847 (vertex dist 4.5e-13), merge dist 0.003, while processing p245 +Test -- t10 +QH7085 Qhull precision warning: repartition coplanar point p195 from f41114 as an outside point above twisted facet f45686 dist 0.00052 nearest vertices 2.3e-13 +QH7085 Qhull precision warning: repartition coplanar point p649 from f55532 as an outside point above twisted facet f51266 dist 0.00025 nearest vertices 3.1e-13 +QH6271 qhull topology error (qh_check_dupridge): wide merge (126156001671.2x wider) due to dupridge between f84631 and f84632 (vertex dist 1.6e-13), merge dist 0.014, while processing p249 +1591314123 Test 10 runs in 4 seconds (ave. 400 msec) -- rbox 200 C3,2e-13 D4 t1 | qhull Q14 d Qbb Tv + +Testing -- rbox 100 C3,2e-13 D5 t1 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-395671.log +Test -- t1 +QH7085 Qhull precision warning: repartition coplanar point p398 from f32500 as an outside point above twisted facet f31968 dist 0.00053 nearest vertices 3.1e-13 +QH6271 qhull topology error (qh_check_dupridge): wide merge (85243973871.6x wider) due to dupridge between f37655 and f37777 (vertex dist 1.2e-13), merge dist 0.014, while processing p277 +Test -- t2 +QH6271 qhull topology error (qh_check_dupridge): wide merge (53863715239.4x wider) due to dupridge between f53646 and f53579 (vertex dist 1.8e-13), merge dist 0.011, while processing p271 +Test -- t3 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f69313 and f69314 have the same vertices (skip 1, skip 1) and same horizon ridges to f48822 and f47087 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f69313 and f69314 have the same vertices (skip 2, skip 2) and same horizon ridges to f48822 and f47087 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f69313 and f69314 have the same vertices (skip 3, skip 3) and same horizon ridges to f48822 and f47087 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f69313 and f69314 have the same vertices (skip 4, skip 4) and same horizon ridges to f48822 and f47087 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f69313 and f69314 have the same vertices (skip 5, skip 5) and same horizon ridges to f48822 and f47087 +QH6155 qhull topology error (qh_matchdupridge): missing qh_DUPLICATEridge at f69314 skip 4 for new f69313 skip 4 hash 299 ismatch 1. Set by qh_matchneighbor + Maximum distance of point above facet: 5.2e-13 (21.0x) +Test -- t4 +QH6425 Qhull topology error (qh_partitioncoplanar): can not repartition coplanar point p81 from f24330 as outside point above f38196. It previously failed to form a cone of facets, dist 0.021, nearest vertices 1.9e-13 + Maximum distance of point above facet: 4.5e-13 (18.2x) +Test -- t5 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f55397 and f55399 have the same vertices (skip 1, skip 1) and same horizon ridges to f45325 and f30999 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f55397 and f55399 have the same vertices (skip 2, skip 2) and same horizon ridges to f45325 and f30999 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f55397 and f55399 have the same vertices (skip 3, skip 3) and same horizon ridges to f45325 and f30999 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f55397 and f55399 have the same vertices (skip 5, skip 5) and same horizon ridges to f45325 and f30999 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f55691 and f55692 have the same vertices (skip 1, skip 1) and same horizon ridges to f31188 and f31188 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f55691 and f55692 have the same vertices (skip 2, skip 2) and same horizon ridges to f31188 and f31188 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f55691 and f55692 have the same vertices (skip 3, skip 3) and same horizon ridges to f31188 and f31188 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f55691 and f55692 have the same vertices (skip 4, skip 4) and same horizon ridges to f31188 and f31188 +QH6155 qhull topology error (qh_matchdupridge): missing qh_DUPLICATEridge at f55692 skip 2 for new f55691 skip 2 hash 110 ismatch 1. Set by qh_matchneighbor + Maximum distance of point above facet: 3.7e-13 (14.9x) +Test -- t6 +QH6425 Qhull topology error (qh_partitioncoplanar): can not repartition coplanar point p118 from f42823 as outside point above f59123. It previously failed to form a cone of facets, dist 0.0012, nearest vertices 3e-13 + Maximum distance of point above facet: 4.3e-13 (17.6x) +Test -- t7 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f32570 and f32577 have the same vertices (skip 1, skip 1) and same horizon ridges to f30838 and f17693 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f32570 and f32577 have the same vertices (skip 2, skip 2) and same horizon ridges to f30838 and f17693 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f32570 and f32577 have the same vertices (skip 3, skip 3) and same horizon ridges to f30838 and f17693 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f32570 and f32577 have the same vertices (skip 5, skip 5) and same horizon ridges to f30838 and f17693 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f33395 and f33396 have the same vertices (skip 1, skip 1) and same horizon ridges to f30837 and f30837 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f33395 and f33396 have the same vertices (skip 2, skip 2) and same horizon ridges to f30837 and f30837 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f33395 and f33396 have the same vertices (skip 4, skip 4) and same horizon ridges to f30837 and f30837 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f33395 and f33396 have the same vertices (skip 5, skip 5) and same horizon ridges to f30837 and f30837 +QH6155 qhull topology error (qh_matchdupridge): missing qh_DUPLICATEridge at f33396 skip 4 for new f33395 skip 4 hash 1814 ismatch 1. Set by qh_matchneighbor +Test -- t8 +QH7085 Qhull precision warning: repartition coplanar point p2 from f55464 as an outside point above twisted facet f55542 dist 0.012 nearest vertices 3.4e-13 +QH7085 Qhull precision warning: repartition coplanar point p3 from f71850 as an outside point above twisted facet f55542 dist 0.012 nearest vertices 3.4e-13 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r62183 and r43372. Nearest v132 and v169 dist 0.36 (15824738144899.3x) +Test -- t9 +QH7085 Qhull precision warning: repartition coplanar point p104 from f37252 as an outside point above twisted facet f34161 dist 0.0053 nearest vertices 1.4e-13 +QH7085 Qhull precision warning: repartition coplanar point p195 from f55708 as an outside point above twisted facet f55858 dist 0.0025 nearest vertices 2.8e-13 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f60441 and f60442 have the same vertices (skip 1, skip 1) and same horizon ridges to f52475 and f43643 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f60441 and f60442 have the same vertices (skip 4, skip 4) and same horizon ridges to f52475 and f43643 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f60441 and f60442 have the same vertices (skip 5, skip 5) and same horizon ridges to f52475 and f43643 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f75399 and f75401 have the same vertices (skip 2, skip 2) and same horizon ridges to f50203 and f53335 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f75399 and f75401 have the same vertices (skip 3, skip 3) and same horizon ridges to f50203 and f53335 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f75399 and f75401 have the same vertices (skip 4, skip 4) and same horizon ridges to f50203 and f53335 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f75399 and f75401 have the same vertices (skip 5, skip 5) and same horizon ridges to f50203 and f53335 +QH6155 qhull topology error (qh_matchdupridge): missing qh_DUPLICATEridge at f75401 skip 5 for new f75399 skip 5 hash 2313 ismatch 1. Set by qh_matchneighbor + Maximum distance of point above facet: 3.9e-13 (15.7x) +Test -- t10 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f46690 and f46691 have the same vertices (skip 1, skip 1) and same horizon ridges to f41615 and f41615 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f46690 and f46691 have the same vertices (skip 2, skip 2) and same horizon ridges to f41615 and f41615 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f46690 and f46691 have the same vertices (skip 4, skip 4) and same horizon ridges to f41615 and f41615 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f53810 and f53813 have the same vertices (skip 1, skip 1) and same horizon ridges to f44991 and f49453 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f53810 and f53813 have the same vertices (skip 2, skip 2) and same horizon ridges to f44991 and f49453 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f53810 and f53813 have the same vertices (skip 3, skip 3) and same horizon ridges to f44991 and f49453 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f53810 and f53813 have the same vertices (skip 4, skip 4) and same horizon ridges to f44991 and f49453 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f53810 and f53813 have the same vertices (skip 5, skip 5) and same horizon ridges to f44991 and f49453 +QH6155 qhull topology error (qh_matchdupridge): missing qh_DUPLICATEridge at f53813 skip 3 for new f53810 skip 3 hash 649 ismatch 1. Set by qh_matchneighbor + Maximum distance of point above facet: 3.2e-13 (12.8x) +1591314127 Test 10 runs in 3 seconds (ave. 300 msec) -- rbox 100 C3,2e-13 D5 t1 | qhull Q14 d Qbb Tv + +Testing -- rbox 100 C3,2e-13 D6 t1 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-529579.log +Test -- t1 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f60622 and f60625 have the same vertices (skip 2, skip 2) and same horizon ridges to f45381 and f45383 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f60622 and f60625 have the same vertices (skip 3, skip 3) and same horizon ridges to f45381 and f45383 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f60622 and f60625 have the same vertices (skip 4, skip 4) and same horizon ridges to f45381 and f45383 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f60622 and f60625 have the same vertices (skip 5, skip 5) and same horizon ridges to f45381 and f45383 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r62945 and r62952. Nearest v1 and v91 dist 0.58 (17756633105771.5x) +Test -- t2 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f30378 and f30379 have the same vertices (skip 3, skip 3) and same horizon ridges to f28250 and f28199 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f30378 and f30379 have the same vertices (skip 4, skip 4) and same horizon ridges to f28250 and f28199 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f30378 and f30379 have the same vertices (skip 5, skip 5) and same horizon ridges to f28250 and f28199 +QH7085 Qhull precision warning: repartition coplanar point p77 from f459553 as an outside point above twisted facet f459471 dist 0.0045 nearest vertices 3.6e-13 +QH6425 Qhull topology error (qh_partitioncoplanar): can not repartition coplanar point p269 from f428888 as outside point above f443167. It previously failed to form a cone of facets, dist 0.0044, nearest vertices 3.4e-13 + Maximum distance of point above facet: 5.4e-13 (15.5x) +Test -- t3 +QH7085 Qhull precision warning: repartition coplanar point p138 from f486368 as an outside point above twisted facet f456801 dist 0.018 nearest vertices 2.9e-13 +QH6425 Qhull topology error (qh_partitioncoplanar): can not repartition coplanar point p138 from f456801 as outside point above f456801. It previously failed to form a cone of facets, dist 0.018, nearest vertices 2.9e-13 + Maximum distance of point above facet: 6.7e-13 (19.1x) +Test -- t4 +QH7085 Qhull precision warning: repartition coplanar point p160 from f486132 as an outside point above twisted facet f478047 dist 0.0078 nearest vertices 2.1e-13 +QH7085 Qhull precision warning: repartition coplanar point p161 from f486262 as an outside point above twisted facet f478047 dist 0.0078 nearest vertices 2.1e-13 + CPU seconds to compute hull (after input): 2.417 + Maximum distance of point above facet: 5.4e-13 (15.3x) + Maximum distance of vertex below facet: -6.4e-13 (18.4x) +Test -- t5 +QH7085 Qhull precision warning: repartition coplanar point p71 from f128831 as an outside point above twisted facet f125804 dist 0.0028 nearest vertices 5e-13 +QH7087 Qhull precision warning: in post-processing (qh_check_maxout) p196 for f444324 is 0.014 above twisted facet f474646 nearest vertices 2.9e-13 +QH7087 Qhull precision warning: in post-processing (qh_check_maxout) p197 for f244291 is 0.014 above twisted facet f474646 nearest vertices 2.9e-13 +QH7087 Qhull precision warning: in post-processing (qh_check_maxout) p198 for f173972 is 0.014 above twisted facet f474646 nearest vertices 2.9e-13 +QH7087 Qhull precision warning: in post-processing (qh_check_maxout) p199 for f338726 is 0.014 above twisted facet f474646 nearest vertices 2.9e-13 +QH6297 Qhull precision error (qh_check_maxout): large increase in qh.max_outside during post-processing dist 0.014 (27511359088.2x). See warning QH0032/QH0033. Allow with 'Q12' (allow-wide) and 'Pp' + Maximum distance of point above facet: 0.014 (393049147618.8x) + Maximum distance of vertex below facet: -4.2e-13 (12.1x) +Test -- t6 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f188213 and f188267 have the same vertices (skip 2, skip 2) and same horizon ridges to f147427 and f92655 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f188213 and f188267 have the same vertices (skip 4, skip 4) and same horizon ridges to f147427 and f92655 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f188213 and f188267 have the same vertices (skip 5, skip 5) and same horizon ridges to f147427 and f92655 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f188213 and f188267 have the same vertices (skip 6, skip 6) and same horizon ridges to f147427 and f92655 +QH6271 qhull topology error (qh_check_dupridge): wide merge (4575757634.2x wider) due to dupridge between f379449 and f379436 (vertex dist 3.3e-13), merge dist 0.0028, while processing p275 + Maximum distance of point above facet: 6e-13 (17.3x) +Test -- t7 +QH7085 Qhull precision warning: repartition coplanar point p392 from f47849 as an outside point above twisted facet f48668 dist 0.0048 nearest vertices 2.6e-13 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f131731 and f131732 have the same vertices (skip 1, skip 1) and same horizon ridges to f103529 and f90653 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f131731 and f131732 have the same vertices (skip 2, skip 2) and same horizon ridges to f103529 and f90653 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f131731 and f131732 have the same vertices (skip 4, skip 4) and same horizon ridges to f103529 and f90653 +QH7085 Qhull precision warning: repartition coplanar point p56 from f145507 as an outside point above twisted facet f154853 dist 0.0022 nearest vertices 4.1e-13 +QH6425 Qhull topology error (qh_partitioncoplanar): can not repartition coplanar point p112 from f208350 as outside point above f444562. It previously failed to form a cone of facets, dist 0.022, nearest vertices 3.9e-13 + Maximum distance of point above facet: 5.5e-13 (15.6x) +Test -- t8 +QH7085 Qhull precision warning: repartition coplanar point p289 from f154666 as an outside point above twisted facet f154831 dist 0.0001 nearest vertices 3.5e-13 +QH7085 Qhull precision warning: repartition coplanar point p10 from f202799 as an outside point above twisted facet f198044 dist 8.8e-05 nearest vertices 3.6e-13 + CPU seconds to compute hull (after input): 2.755 + Maximum distance of point above facet: 5.9e-13 (16.7x) + Maximum distance of vertex below facet: -5.9e-13 (16.9x) +Test -- t9 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f62222 and f62223 have the same vertices (skip 3, skip 3) and same horizon ridges to f46423 and f46695 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f62222 and f62223 have the same vertices (skip 4, skip 4) and same horizon ridges to f46423 and f46695 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f62222 and f62223 have the same vertices (skip 5, skip 5) and same horizon ridges to f46423 and f46695 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f62220 and f62224 have the same vertices (skip 2, skip 2) and same horizon ridges to f44626 and f58290 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f62220 and f62224 have the same vertices (skip 3, skip 3) and same horizon ridges to f44626 and f58290 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f62220 and f62224 have the same vertices (skip 5, skip 5) and same horizon ridges to f44626 and f58290 +QH6155 qhull topology error (qh_matchdupridge): missing qh_DUPLICATEridge at f62223 skip 5 for new f62222 skip 5 hash 9681 ismatch 1. Set by qh_matchneighbor +Test -- t10 +QH7085 Qhull precision warning: repartition coplanar point p84 from f300897 as an outside point above twisted facet f298172 dist 0.0014 nearest vertices 2.3e-13 +QH7085 Qhull precision warning: repartition coplanar point p87 from f271195 as an outside point above twisted facet f298172 dist 0.0014 nearest vertices 2.3e-13 +QH7085 Qhull precision warning: repartition coplanar point p287 from f392815 as an outside point above twisted facet f373850 dist 0.0018 nearest vertices 2.2e-13 + CPU seconds to compute hull (after input): 2.57 + Maximum distance of point above facet: 5.1e-13 (14.7x) + Maximum distance of vertex below facet: -4.7e-13 (13.4x) +1591314149 Test 10 runs in 21 seconds (ave. 2100 msec) -- rbox 100 C3,2e-13 D6 t1 | qhull Q14 d Qbb Tv + +==================== +== Delaunay triangulation of fuzzy circle with pairs (large, narrow disk) +== Highly degenerate due to narrow disk of two cospherical sets of point pairs +== Worse with Qbb since it stretches out the paraboloid, doubling _one-merge +==================== + +Testing -- rbox 10000 s W1e-13 C1,1e-13 D2 t1 | qhull Q14 d Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-799550.log +Test -- t1 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.15 + Maximum distance of point above facet: 8.9e-14 (16.0x) +Test -- t2 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7085 Qhull precision warning: repartition coplanar point p8919 from f70212 as an outside point above twisted facet f70212 dist 3e-09 nearest vertices 3.9e-14 +QH7085 Qhull precision warning: repartition coplanar point p455 from f59188 as an outside point above twisted facet f81155 dist 4.4e-12 nearest vertices 1.3e-13 + CPU seconds to compute hull (after input): 0.181 + Maximum distance of point above facet: 1.1e-13 (19.3x) +Test -- t3 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7085 Qhull precision warning: repartition coplanar point p17910 from f11508 as an outside point above twisted facet f11509 dist 1.5e-09 nearest vertices 1.2e-13 +QH7085 Qhull precision warning: repartition coplanar point p1289 from f50034 as an outside point above twisted facet f50033 dist 1.1e-10 nearest vertices 1.3e-13 +QH7085 Qhull precision warning: repartition coplanar point p1146 from f51301 as an outside point above twisted facet f51297 dist 5.3e-09 nearest vertices 9.6e-14 + CPU seconds to compute hull (after input): 0.132 + Maximum distance of point above facet: 9e-14 (16.3x) +Test -- t4 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7085 Qhull precision warning: repartition coplanar point p9630 from f2685 as an outside point above twisted facet f2685 dist 8.6e-08 nearest vertices 1.2e-13 +QH7085 Qhull precision warning: repartition coplanar point p16714 from f32738 as an outside point above twisted facet f32736 dist 1.6e-08 nearest vertices 1.1e-13 +QH7085 Qhull precision warning: repartition coplanar point p13115 from f87933 as an outside point above twisted facet f87933 dist 7.7e-11 nearest vertices 5.9e-14 + CPU seconds to compute hull (after input): 0.158 + Maximum distance of point above facet: 1.4e-13 (25.2x) +Test -- t5 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7085 Qhull precision warning: repartition coplanar point p17035 from f27535 as an outside point above twisted facet f18091 dist 3.2e-08 nearest vertices 1.4e-13 + CPU seconds to compute hull (after input): 0.128 + Maximum distance of point above facet: 7.3e-14 (13.1x) +Test -- t6 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7085 Qhull precision warning: repartition coplanar point p9250 from f30601 as an outside point above twisted facet f30601 dist 4.5e-10 nearest vertices 8.7e-14 + CPU seconds to compute hull (after input): 0.263 + Maximum distance of point above facet: 1e-13 (18.3x) +Test -- t7 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7085 Qhull precision warning: repartition coplanar point p10212 from f52627 as an outside point above twisted facet f39538 dist 8e-08 nearest vertices 1.2e-13 +QH7085 Qhull precision warning: repartition coplanar point p18974 from f62060 as an outside point above twisted facet f62059 dist 1.8e-10 nearest vertices 1.5e-13 + CPU seconds to compute hull (after input): 0.155 + Maximum distance of point above facet: 7.9e-14 (14.2x) +Test -- t8 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.135 +Test -- t9 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7085 Qhull precision warning: repartition coplanar point p9241 from f12854 as an outside point above twisted facet f19747 dist 2.1e-10 nearest vertices 5.3e-14 + CPU seconds to compute hull (after input): 0.285 + Maximum distance of point above facet: 1.1e-13 (20.2x) +Test -- t10 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7085 Qhull precision warning: repartition coplanar point p1126 from f6831 as an outside point above twisted facet f6829 dist 6.6e-08 nearest vertices 6.8e-14 +QH7085 Qhull precision warning: repartition coplanar point p5672 from f50284 as an outside point above twisted facet f50284 dist 2e-08 nearest vertices 1.3e-13 +QH7085 Qhull precision warning: repartition coplanar point p16435 from f83558 as an outside point above twisted facet f83559 dist 4.2e-09 nearest vertices 1.2e-13 + CPU seconds to compute hull (after input): 0.134 +1591314207 Test 10 runs in 56 seconds (ave. 5600 msec) -- rbox 10000 s W1e-13 C1,1e-13 D2 t1 | qhull Q14 d Tv + +Testing -- rbox 5000 s W1e-13 C1,1e-13 D3 t1 | qhull Q14 d Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-207739.log +Test -- t1 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6417 qhull precision error (qh_merge_twisted): twisted facet f21567 does not contain pinched vertices. Too wide to merge into neighbor. mindist -2.7e-12 maxdist 1.2e-13 vertexdist 0.0099 maxpinched 1.8e-13 neighbor f50395 mindist -1.7e-13 maxdist 0 + Maximum distance of point above facet: 1.1e-13 (10.9x) + Maximum distance of vertex below facet: -1.1e-13 (11.3x) +Test -- t2 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.869 +Test -- t3 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7085 Qhull precision warning: repartition coplanar point p8930 from f104123 as an outside point above twisted facet f103999 dist 0.00018 nearest vertices 1.2e-13 +QH7085 Qhull precision warning: repartition coplanar point p892 from f113105 as an outside point above twisted facet f111527 dist 4.1e-05 nearest vertices 1.2e-13 +QH7085 Qhull precision warning: repartition coplanar point p6690 from f123791 as an outside point above twisted facet f123795 dist 0.0006 nearest vertices 1.4e-13 +QH7085 Qhull precision warning: repartition coplanar point p5468 from f142839 as an outside point above twisted facet f142837 dist 0.00098 nearest vertices 1.6e-13 +QH7085 Qhull precision warning: repartition coplanar point p3405 from f142848 as an outside point above twisted facet f139682 dist 7.8e-05 nearest vertices 1e-13 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r165439 and r38425. Nearest v830 and v1354 dist 0.074 (8134458896400.2x) + Maximum distance of point above facet: 3.7e-13 (37.2x) + Maximum distance of vertex below facet: -4.4e-13 (43.6x) +Test -- t4 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7085 Qhull precision warning: repartition coplanar point p7666 from f61505 as an outside point above twisted facet f61504 dist 0.00016 nearest vertices 1.2e-13 +QH7087 Qhull precision warning: in post-processing (qh_check_maxout) p606 for f82547 is 1.3e-05 above twisted facet f153062 nearest vertices 1.1e-13 +QH7087 Qhull precision warning: in post-processing (qh_check_maxout) p956 for f158681 is 2.2e-05 above twisted facet f158676 nearest vertices 5.8e-14 +QH7087 Qhull precision warning: in post-processing (qh_check_maxout) p957 for f138507 is 2.2e-05 above twisted facet f158676 nearest vertices 5.8e-14 +QH7087 Qhull precision warning: in post-processing (qh_check_maxout) p1790 for f158676 is 4.3e-05 above twisted facet f158681 nearest vertices 9.4e-14 +QH7087 Qhull precision warning: in post-processing (qh_check_maxout) p5202 for f105552 is 0.0004 above twisted facet f153062 nearest vertices 1.1e-13 +QH7087 Qhull precision warning: in post-processing (qh_check_maxout) p5282 for f81536 is 0.00041 above twisted facet f153062 nearest vertices 1.1e-13 +QH6297 Qhull precision error (qh_check_maxout): large increase in qh.max_outside during post-processing dist 0.00041 (6382723453.9x). See warning QH0032/QH0033. Allow with 'Q12' (allow-wide) and 'Pp' + Maximum distance of point above facet: 0.00041 (40469546794.9x) + Maximum distance of vertex below facet: -2.3e-13 (22.9x) +Test -- t5 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7087 Qhull precision warning: in post-processing (qh_check_maxout) p8850 for f55068 is 8.7e-07 above twisted facet f95335 nearest vertices 1.1e-13 +QH6297 Qhull precision error (qh_check_maxout): large increase in qh.max_outside during post-processing dist 8.7e-07 (1930350.1x). See warning QH0032/QH0033. Allow with 'Q12' (allow-wide) and 'Pp' + Maximum distance of point above facet: 8.7e-07 (85973653.6x) + Maximum distance of vertex below facet: -1e-13 (10.2x) +Test -- t6 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7085 Qhull precision warning: repartition coplanar point p2321 from f163230 as an outside point above twisted facet f163220 dist 8.3e-05 nearest vertices 7.5e-14 +QH7087 Qhull precision warning: in post-processing (qh_check_maxout) p826 for f88991 is 0.00033 above twisted facet f110829 nearest vertices 1.7e-13 +QH6297 Qhull precision error (qh_check_maxout): large increase in qh.max_outside during post-processing dist 0.00033 (4218337700.8x). See warning QH0032/QH0033. Allow with 'Q12' (allow-wide) and 'Pp' + Maximum distance of point above facet: 0.00033 (33146888209.5x) + Maximum distance of vertex below facet: -2.3e-13 (22.6x) +Test -- t7 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7087 Qhull precision warning: in post-processing (qh_check_maxout) p652 for f85664 is 3e-06 above twisted facet f144652 nearest vertices 7.8e-14 +QH7087 Qhull precision warning: in post-processing (qh_check_maxout) p653 for f85664 is 3e-06 above twisted facet f144652 nearest vertices 7.8e-14 +QH7087 Qhull precision warning: in post-processing (qh_check_maxout) p5236 for f144004 is 0.00013 above twisted facet f159710 nearest vertices 1.2e-13 +QH6297 Qhull precision error (qh_check_maxout): large increase in qh.max_outside during post-processing dist 0.00013 (919993296.3x). See warning QH0032/QH0033. Allow with 'Q12' (allow-wide) and 'Pp' + Maximum distance of point above facet: 0.00013 (13191992399.9x) + Maximum distance of vertex below facet: -1.2e-13 (12.2x) +Test -- t8 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f33822 into f23677 for mergetype 6 (flip). maxdist 0 (0.0x) mindist -2.4e-12 (236.3x) vertexdist 0.024 Allow with 'Q12' (allow-wide) + Maximum distance of point above facet: 1.9e-13 (19.3x) + Maximum distance of vertex below facet: -2.7e-13 (26.9x) +Test -- t9 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7085 Qhull precision warning: repartition coplanar point p6766 from f44641 as an outside point above twisted facet f59686 dist 0.00017 nearest vertices 1.5e-13 +QH7085 Qhull precision warning: repartition coplanar point p6333 from f79975 as an outside point above twisted facet f76440 dist 0.0019 nearest vertices 1.1e-13 +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f80579 into f75812 for mergetype 6 (flip). maxdist 0 (0.0x) mindist -9.1e-12 (907.4x) vertexdist 0.029 Allow with 'Q12' (allow-wide) + Maximum distance of point above facet: 3.9e-12 (383.9x) + Maximum distance of vertex below facet: -1.8e-13 (17.6x) +Test -- t10 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7087 Qhull precision warning: in post-processing (qh_check_maxout) p7294 for f134434 is 7.2e-05 above twisted facet f147686 nearest vertices 1.1e-13 +QH6297 Qhull precision error (qh_check_maxout): large increase in qh.max_outside during post-processing dist 7.2e-05 (691353684.1x). See warning QH0032/QH0033. Allow with 'Q12' (allow-wide) and 'Pp' + Maximum distance of point above facet: 7.2e-05 (7140208545.0x) + Maximum distance of vertex below facet: -1.2e-13 (11.7x) +1591314219 Test 10 runs in 12 seconds (ave. 1200 msec) -- rbox 5000 s W1e-13 C1,1e-13 D3 t1 | qhull Q14 d Tv + +Testing -- rbox 500 s W1e-13 C1,1e-13 D4 t1 | qhull Q14 d Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-609463.log +Test -- t1 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7085 Qhull precision warning: repartition coplanar point p948 from f83190 as an outside point above twisted facet f86648 dist 0.00028 nearest vertices 1.1e-13 + CPU seconds to compute hull (after input): 0.274 +Test -- t2 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.267 +Test -- t3 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r38713 and r38597. Nearest v77 and v303 dist 0.05 (3330384581182.4x) + Maximum distance of point above facet: 6.2e-13 (38.1x) + Maximum distance of vertex below facet: -5.5e-13 (33.5x) +Test -- t4 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r13989 and r13927. Nearest v122 and v202 dist 0.14 (9422510226747.0x) +Test -- t5 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.418 +Test -- t6 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6271 qhull topology error (qh_check_dupridge): wide merge (231006179866.2x wider) due to dupridge between f34685 and f34686 (vertex dist 1.2e-13), merge dist 0.011, while processing p470 +Test -- t7 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7085 Qhull precision warning: repartition coplanar point p617 from f25266 as an outside point above twisted facet f65328 dist 0.00047 nearest vertices 1.3e-13 +QH7085 Qhull precision warning: repartition coplanar point p605 from f71137 as an outside point above twisted facet f81400 dist 0.021 nearest vertices 1.2e-13 +QH6425 Qhull topology error (qh_partitioncoplanar): can not repartition coplanar point p617 from f65328 as outside point above f65328. It previously failed to form a cone of facets, dist 0.00047, nearest vertices 1.3e-13 + Maximum distance of vertex below facet: -6.1e-13 (37.6x) +Test -- t8 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6271 qhull topology error (qh_check_dupridge): wide merge (1712425744.3x wider) due to dupridge between f42222 and f42213 (vertex dist 1.3e-13), merge dist 0.00016, while processing p901 +Test -- t9 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r97497 and r97495. Nearest v951 and v958 dist 0.21 (14211983327451.1x) +Test -- t10 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6391 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve opposite oriented ridges r23942 and r23905 in f26657 and f26648. Nearest v57 and v94 dist 0.12 (8422534220006.4x) + Maximum distance of point above facet: 2e-13 (12.6x) +1591314224 Test 10 runs in 4 seconds (ave. 400 msec) -- rbox 500 s W1e-13 C1,1e-13 D4 t1 | qhull Q14 d Tv + +Testing -- rbox 200 s W1e-13 C1,1e-13 D5 t1 | qhull Q14 d Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-276848.log +Test -- t1 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f65877 and f65878 have the same vertices (skip 3, skip 3) and same horizon ridges to f36436 and f26957 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f65877 and f65878 have the same vertices (skip 4, skip 4) and same horizon ridges to f36436 and f26957 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r91033 and r90813. Nearest v102 and v243 dist 0.25 (11585979429831.3x) + Maximum distance of point above facet: 2.5e-13 (10.7x) + Maximum distance of vertex below facet: -8e-13 (34.2x) +Test -- t2 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r27312 and r21744. Nearest v8 and v11 dist 0.12 (5599980284995.9x) + Maximum distance of vertex below facet: -3.8e-13 (16.3x) +Test -- t3 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f76669 and f76670 have the same vertices (skip 1, skip 1) and same horizon ridges to f72263 and f72252 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f76669 and f76670 have the same vertices (skip 2, skip 2) and same horizon ridges to f72263 and f72252 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f76668 and f76672 have the same vertices (skip 1, skip 1) and same horizon ridges to f70929 and f70929 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f76668 and f76672 have the same vertices (skip 2, skip 2) and same horizon ridges to f70929 and f70929 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f76668 and f76672 have the same vertices (skip 5, skip 5) and same horizon ridges to f70929 and f70929 +QH7081 qhull precision warning (qh_getpinchedmerges): pinched vertices v231 and v85 (dist 0.15, 1328212115756x) would produce a wide merge for f76671 and f76596. Will merge dupridge instead +QH6361 qhull topological error (qh_mark_dupridges): multiple dupridges for f76668 and f76672, including reverse +Test -- t4 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r5823 and r3583. Nearest v13 and v33 dist 0.26 (11735381901050.8x) + Maximum distance of point above facet: 2.4e-13 (10.0x) +Test -- t5 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f86767 into f86766 for mergetype 7 (dupridge). maxdist 0 (0.0x) mindist -2.9e-12 (128.8x) vertexdist 0.2 Allow with 'Q12' (allow-wide) +Test -- t6 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6391 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve opposite oriented ridges r21534 and r21559 in f18063 and f18083. Nearest v58 and v85 dist 0.29 (13646960554035.8x) +Test -- t7 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f18317 and f18319 have the same vertices (skip 1, skip 1) and same horizon ridges to f14054 and f14054 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f18317 and f18319 have the same vertices (skip 2, skip 2) and same horizon ridges to f14054 and f14054 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f18317 and f18319 have the same vertices (skip 3, skip 3) and same horizon ridges to f14054 and f14054 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f18317 and f18319 have the same vertices (skip 5, skip 5) and same horizon ridges to f14054 and f14054 +QH6155 qhull topology error (qh_matchdupridge): missing qh_DUPLICATEridge at f18319 skip 3 for new f18317 skip 3 hash 802 ismatch 1. Set by qh_matchneighbor + Maximum distance of point above facet: 9.8e-13 (40.9x) +Test -- t8 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86520 and f86528 have the same vertices (skip 1, skip 1) and same horizon ridges to f84820 and f84820 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86520 and f86528 have the same vertices (skip 2, skip 2) and same horizon ridges to f84820 and f84820 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86520 and f86528 have the same vertices (skip 3, skip 3) and same horizon ridges to f84820 and f84820 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86520 and f86528 have the same vertices (skip 4, skip 4) and same horizon ridges to f84820 and f84820 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86520 and f86528 have the same vertices (skip 5, skip 5) and same horizon ridges to f84820 and f84820 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86545 and f86546 have the same vertices (skip 1, skip 1) and same horizon ridges to f84922 and f84922 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86545 and f86546 have the same vertices (skip 2, skip 2) and same horizon ridges to f84922 and f84922 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86545 and f86546 have the same vertices (skip 3, skip 3) and same horizon ridges to f84922 and f84922 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86545 and f86546 have the same vertices (skip 4, skip 4) and same horizon ridges to f84922 and f84922 +QH6155 qhull topology error (qh_matchdupridge): missing qh_DUPLICATEridge at f86528 skip 3 for new f86520 skip 3 hash 2096 ismatch 1. Set by qh_matchneighbor + Maximum distance of point above facet: 6.3e-13 (26.7x) + Maximum distance of vertex below facet: -3.4e-13 (14.4x) +Test -- t9 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r128601 and r111375. Nearest v29 and v134 dist 0.17 (8013113085774.5x) +Test -- t10 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f85245 and f85343 have the same vertices (skip 1, skip 1) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f85245 and f85343 have the same vertices (skip 2, skip 2) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f85245 and f85343 have the same vertices (skip 3, skip 3) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f85245 and f85343 have the same vertices (skip 4, skip 4) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f85245 and f85343 have the same vertices (skip 5, skip 5) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f85275 and f85344 have the same vertices (skip 1, skip 1) and same horizon ridges to f81775 and f81455 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f85275 and f85344 have the same vertices (skip 4, skip 4) and same horizon ridges to f81775 and f81455 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f85275 and f85344 have the same vertices (skip 5, skip 5) and same horizon ridges to f81775 and f81455 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86001 and f86099 have the same vertices (skip 1, skip 1) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86001 and f86099 have the same vertices (skip 2, skip 2) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86001 and f86099 have the same vertices (skip 3, skip 3) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86001 and f86099 have the same vertices (skip 4, skip 4) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86001 and f86099 have the same vertices (skip 5, skip 5) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86031 and f86100 have the same vertices (skip 1, skip 1) and same horizon ridges to f81775 and f81455 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86031 and f86100 have the same vertices (skip 4, skip 4) and same horizon ridges to f81775 and f81455 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86031 and f86100 have the same vertices (skip 5, skip 5) and same horizon ridges to f81775 and f81455 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86757 and f86855 have the same vertices (skip 1, skip 1) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86757 and f86855 have the same vertices (skip 2, skip 2) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86757 and f86855 have the same vertices (skip 3, skip 3) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86757 and f86855 have the same vertices (skip 4, skip 4) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86757 and f86855 have the same vertices (skip 5, skip 5) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86787 and f86856 have the same vertices (skip 1, skip 1) and same horizon ridges to f81775 and f81455 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86787 and f86856 have the same vertices (skip 4, skip 4) and same horizon ridges to f81775 and f81455 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f86787 and f86856 have the same vertices (skip 5, skip 5) and same horizon ridges to f81775 and f81455 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f87513 and f87611 have the same vertices (skip 1, skip 1) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f87513 and f87611 have the same vertices (skip 2, skip 2) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f87513 and f87611 have the same vertices (skip 3, skip 3) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f87513 and f87611 have the same vertices (skip 4, skip 4) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f87513 and f87611 have the same vertices (skip 5, skip 5) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f87543 and f87612 have the same vertices (skip 1, skip 1) and same horizon ridges to f81775 and f81455 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f87543 and f87612 have the same vertices (skip 4, skip 4) and same horizon ridges to f81775 and f81455 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f87543 and f87612 have the same vertices (skip 5, skip 5) and same horizon ridges to f81775 and f81455 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f88269 and f88367 have the same vertices (skip 1, skip 1) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f88269 and f88367 have the same vertices (skip 2, skip 2) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f88269 and f88367 have the same vertices (skip 3, skip 3) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f88269 and f88367 have the same vertices (skip 4, skip 4) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f88269 and f88367 have the same vertices (skip 5, skip 5) and same horizon ridges to f81217 and f81638 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f88299 and f88368 have the same vertices (skip 1, skip 1) and same horizon ridges to f81775 and f81455 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f88299 and f88368 have the same vertices (skip 4, skip 4) and same horizon ridges to f81775 and f81455 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f88299 and f88368 have the same vertices (skip 5, skip 5) and same horizon ridges to f81775 and f81455 +QH7081 qhull precision warning (qh_getpinchedmerges): pinched vertices v256 and v92 (dist 0.051, 102248841159x) would produce a wide merge for f88419 and f88416. Will merge dupridge instead +QH6361 qhull topological error (qh_mark_dupridges): multiple dupridges for f88269 and f88367, including reverse + Maximum distance of vertex below facet: -5e-13 (22.0x) +1591314228 Test 10 runs in 3 seconds (ave. 300 msec) -- rbox 200 s W1e-13 C1,1e-13 D5 t1 | qhull Q14 d Tv + +Testing -- rbox 100 s W1e-13 C1,1e-13 D6 t1 | qhull Q14 d Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-944233.log +Test -- t1 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r20591 and r20602. Nearest v9 and v14 dist 0.16 (5355849098491.0x) +Test -- t2 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f36893 and f36910 have the same vertices (skip 1, skip 1) and same horizon ridges to f13135 and f13135 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f36893 and f36910 have the same vertices (skip 2, skip 2) and same horizon ridges to f13135 and f13135 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f36893 and f36910 have the same vertices (skip 3, skip 3) and same horizon ridges to f13135 and f13135 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f36893 and f36910 have the same vertices (skip 4, skip 4) and same horizon ridges to f13135 and f13135 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f36893 and f36910 have the same vertices (skip 6, skip 6) and same horizon ridges to f13135 and f13135 +QH6155 qhull topology error (qh_matchdupridge): missing qh_DUPLICATEridge at f36910 skip 3 for new f36893 skip 3 hash 649 ismatch 1. Set by qh_matchneighbor +Test -- t3 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f42897 and f42914 have the same vertices (skip 1, skip 1) and same horizon ridges to f25665 and f25167 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f42897 and f42914 have the same vertices (skip 3, skip 3) and same horizon ridges to f25665 and f25167 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f42897 and f42914 have the same vertices (skip 4, skip 4) and same horizon ridges to f25665 and f25167 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f42897 and f42914 have the same vertices (skip 6, skip 6) and same horizon ridges to f25665 and f25167 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f45327 and f45330 have the same vertices (skip 1, skip 1) and same horizon ridges to f7820 and f7820 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f45327 and f45330 have the same vertices (skip 3, skip 3) and same horizon ridges to f7820 and f7820 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f45327 and f45330 have the same vertices (skip 4, skip 4) and same horizon ridges to f7820 and f7820 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r25070 and r53364. Nearest v18 and v53 dist 0.22 (7683622046685.1x) +Test -- t4 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f51508 and f51510 have the same vertices (skip 1, skip 1) and same horizon ridges to f30507 and f39669 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f51508 and f51510 have the same vertices (skip 2, skip 2) and same horizon ridges to f30507 and f39669 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f51508 and f51510 have the same vertices (skip 5, skip 5) and same horizon ridges to f30507 and f39669 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f51508 and f51510 have the same vertices (skip 6, skip 6) and same horizon ridges to f30507 and f39669 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f51507 and f51511 have the same vertices (skip 1, skip 1) and same horizon ridges to f19171 and f30753 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f51507 and f51511 have the same vertices (skip 2, skip 2) and same horizon ridges to f19171 and f30753 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f51507 and f51511 have the same vertices (skip 3, skip 3) and same horizon ridges to f19171 and f30753 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f51507 and f51511 have the same vertices (skip 5, skip 5) and same horizon ridges to f19171 and f30753 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f51507 and f51511 have the same vertices (skip 6, skip 6) and same horizon ridges to f19171 and f30753 +QH6155 qhull topology error (qh_matchdupridge): missing qh_DUPLICATEridge at f51511 skip 5 for new f51507 skip 5 hash 459 ismatch 1. Set by qh_matchneighbor +Test -- t5 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r33252 and r36487. Nearest v21 and v45 dist 0.37 (12223161979313.1x) + Maximum distance of vertex below facet: -9.5e-13 (29.7x) +Test -- t6 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r20356 and r21043. Nearest v17 and v41 dist 0.35 (11546961641179.1x) + Maximum distance of vertex below facet: -4.5e-13 (14.0x) +Test -- t7 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f22426 and f22461 have the same vertices (skip 2, skip 2) and same horizon ridges to f13937 and f13937 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f22426 and f22461 have the same vertices (skip 4, skip 4) and same horizon ridges to f13937 and f13937 +QH7081 qhull precision warning (qh_getpinchedmerges): pinched vertices v59 and v24 (dist 0.12, 1174239239079x) would produce a wide merge for f22426 and f22461. Will merge dupridge instead +QH6361 qhull topological error (qh_mark_dupridges): multiple dupridges for f22426 and f22461, including reverse +Test -- t8 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r20549 and r12171. Nearest v11 and v37 dist 0.2 (6991485173088.3x) +Test -- t9 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f9958 and f9968 have the same vertices (skip 1, skip 1) and same horizon ridges to f6116 and f3475 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f9958 and f9968 have the same vertices (skip 2, skip 2) and same horizon ridges to f6116 and f3475 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f9958 and f9968 have the same vertices (skip 3, skip 3) and same horizon ridges to f6116 and f3475 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f9958 and f9968 have the same vertices (skip 5, skip 5) and same horizon ridges to f6116 and f3475 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f9958 and f9968 have the same vertices (skip 6, skip 6) and same horizon ridges to f6116 and f3475 +QH6361 qhull topological error (qh_mark_dupridges): multiple dupridges for f9958 and f9968, including reverse + Maximum distance of vertex below facet: -5.4e-13 (18.5x) +Test -- t10 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6391 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve opposite oriented ridges r553 and r464 in f569 and f42. Nearest v2 and v17 dist 0.5 (17642408039144.3x) +1591314232 Test 10 runs in 3 seconds (ave. 300 msec) -- rbox 100 s W1e-13 C1,1e-13 D6 t1 | qhull Q14 d Tv + +==================== +== Voronoi diagram of rotated mesh with wide, 1e-8 pairs +== All fail at C1,1e-12 +==================== + +Testing -- rbox 10000 M3,4 C1,1e-8 D2 t1 | qhull QR3 Q14 v Qbb Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-544664.log +Test -- t1 + CPU seconds to compute hull (after input): 0.138 +Test -- t2 + CPU seconds to compute hull (after input): 0.133 +Test -- t3 + CPU seconds to compute hull (after input): 0.128 +Test -- t4 + CPU seconds to compute hull (after input): 0.13 +Test -- t5 + CPU seconds to compute hull (after input): 0.128 +Test -- t6 + CPU seconds to compute hull (after input): 0.128 +Test -- t7 + CPU seconds to compute hull (after input): 0.129 +Test -- t8 + CPU seconds to compute hull (after input): 0.149 +Test -- t9 + CPU seconds to compute hull (after input): 0.138 +Test -- t10 + CPU seconds to compute hull (after input): 0.133 +1591314301 Test 10 runs in 68 seconds (ave. 6800 msec) -- rbox 10000 M3,4 C1,1e-8 D2 t1 | qhull QR3 Q14 v Qbb Tv + +Testing -- rbox 2000 M3,4,5 C1,1e-8 D3 t1 | qhull QR3 Q14 v Qbb Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-354577.log +Test -- t1 +QH7081 qhull precision warning (qh_getpinchedmerges): pinched vertices v1581 and v128 (dist 1.5e-08, 5900x) would produce a wide merge for f67521 and f67517. Will merge dupridge instead +QH6271 qhull topology error (qh_check_dupridge): wide merge (45056588.6x wider) due to dupridge between f67521 and f67517 (vertex dist 1.5e-08), merge dist 0.00012, while processing p548 +Test -- t2 + CPU seconds to compute hull (after input): 0.111 +Test -- t3 + CPU seconds to compute hull (after input): 0.109 +Test -- t4 +QH7081 qhull precision warning (qh_getpinchedmerges): pinched vertices v942 and v599 (dist 1e-08, 4123x) would produce a wide merge for f60963 and f60977. Will merge dupridge instead +QH6271 qhull topology error (qh_check_dupridge): wide merge (95642702.5x wider) due to dupridge between f60963 and f60977 (vertex dist 1e-08), merge dist 0.00024, while processing p1401 +Test -- t5 +QH7081 qhull precision warning (qh_getpinchedmerges): pinched vertices v658 and v408 (dist 1.3e-08, 5100x) would produce a wide merge for f17839 and f17857. Will merge dupridge instead +QH6271 qhull topology error (qh_check_dupridge): wide merge (168477336.0x wider) due to dupridge between f17839 and f17857 (vertex dist 1.3e-08), merge dist 0.00042, while processing p643 +Test -- t6 +QH6271 qhull topology error (qh_check_dupridge): wide merge (145857611.2x wider) due to dupridge between f71951 and f71942 (vertex dist 1.5e-08), merge dist 0.00036, while processing p2410 +Test -- t7 + CPU seconds to compute hull (after input): 0.111 +Test -- t8 +QH7081 qhull precision warning (qh_getpinchedmerges): pinched vertices v2061 and v542 (dist 1.1e-08, 4571x) would produce a wide merge for f70338 and f70340. Will merge dupridge instead +QH6271 qhull topology error (qh_check_dupridge): wide merge (123.4x wider) due to dupridge between f70338 and f70340 (vertex dist 1.1e-08), merge dist 3e-10, while processing p2537 +Test -- t9 +QH7081 qhull precision warning (qh_getpinchedmerges): pinched vertices v2465 and v1930 (dist 1.7e-08, 7048x) would produce a wide merge for f80589 and f80576. Will merge dupridge instead +QH6271 qhull topology error (qh_check_dupridge): wide merge (106850984.5x wider) due to dupridge between f80589 and f80576 (vertex dist 1.7e-08), merge dist 0.00026, while processing p535 +Test -- t10 + CPU seconds to compute hull (after input): 0.106 +1591314308 Test 10 runs in 7 seconds (ave. 700 msec) -- rbox 2000 M3,4,5 C1,1e-8 D3 t1 | qhull QR3 Q14 v Qbb Tv + +Testing -- rbox 600 M3,4,5 C1,1e-8 D4 t1 | qhull QR3 Q14 v Qbb Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-622393.log +Test -- t1 + CPU seconds to compute hull (after input): 0.221 +Test -- t2 + CPU seconds to compute hull (after input): 0.257 +Test -- t3 + CPU seconds to compute hull (after input): 0.23 +Test -- t4 + CPU seconds to compute hull (after input): 0.235 +Test -- t5 + CPU seconds to compute hull (after input): 0.247 +Test -- t6 + CPU seconds to compute hull (after input): 0.223 +Test -- t7 +QH7081 qhull precision warning (qh_getpinchedmerges): pinched vertices v529 and v929 (dist 8.7e-09, 7425x) would produce a wide merge for f112419 and f112421. Will merge dupridge instead +QH6271 qhull topology error (qh_check_dupridge): wide merge (172594538.9x wider) due to dupridge between f112419 and f112421 (vertex dist 1.3e-08), merge dist 0.0002, while processing p380 +Test -- t8 + CPU seconds to compute hull (after input): 0.223 +Test -- t9 + CPU seconds to compute hull (after input): 0.22 +Test -- t10 + CPU seconds to compute hull (after input): 0.221 +1591314317 Test 10 runs in 8 seconds (ave. 800 msec) -- rbox 600 M3,4,5 C1,1e-8 D4 t1 | qhull QR3 Q14 v Qbb Tv + +Testing -- rbox 300 M3,4,5 C1,1e-8 D5 t1 | qhull QR3 Q14 v Qbb Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-890209.log +Test -- t1 + CPU seconds to compute hull (after input): 0.803 +Test -- t2 + CPU seconds to compute hull (after input): 0.804 +Test -- t3 + CPU seconds to compute hull (after input): 0.833 +Test -- t4 + CPU seconds to compute hull (after input): 0.848 +Test -- t5 + CPU seconds to compute hull (after input): 0.785 +Test -- t6 + CPU seconds to compute hull (after input): 0.762 +Test -- t7 + CPU seconds to compute hull (after input): 0.878 +Test -- t8 + CPU seconds to compute hull (after input): 0.803 +Test -- t9 + CPU seconds to compute hull (after input): 0.819 +Test -- t10 + CPU seconds to compute hull (after input): 0.808 +1591314334 Test 10 runs in 16 seconds (ave. 1600 msec) -- rbox 300 M3,4,5 C1,1e-8 D5 t1 | qhull QR3 Q14 v Qbb Tv +skip D6, millions of vertices + +============================ +== Delaunay triangulation of nearly cospherical point pairs with Qbb drum +== Qbb makes this the most difficult distribution for Qhull, only 100 points +============================ + +Testing -- rbox 1000 s C1,1e-13 D3 t1 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-492795.log +Test -- t1 + CPU seconds to compute hull (after input): 0.043 +Test -- t2 + CPU seconds to compute hull (after input): 0.042 +Test -- t3 + CPU seconds to compute hull (after input): 0.042 +Test -- t4 + CPU seconds to compute hull (after input): 0.042 +Test -- t5 + CPU seconds to compute hull (after input): 0.043 +Test -- t6 + CPU seconds to compute hull (after input): 0.043 +Test -- t7 + CPU seconds to compute hull (after input): 0.043 +Test -- t8 + CPU seconds to compute hull (after input): 0.046 +Test -- t9 + CPU seconds to compute hull (after input): 0.043 +Test -- t10 + CPU seconds to compute hull (after input): 0.042 +1591314339 Test 10 runs in 4 seconds (ave. 400 msec) -- rbox 1000 s C1,1e-13 D3 t1 | qhull Q14 d Qbb Tv + +Testing -- rbox 100 s C1,1e-13 D4 t1 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-626703.log +Test -- t1 + CPU seconds to compute hull (after input): 0.02 +Test -- t2 +QH6271 qhull topology error (qh_check_dupridge): wide merge (499726909788.7x wider) due to dupridge between f15279 and f15281 (vertex dist 0.0026), merge dist 0.0088, while processing p150 +Test -- t3 +QH6271 qhull topology error (qh_check_dupridge): wide merge (707750430102.1x wider) due to dupridge between f11994 and f12093 (vertex dist 0.1), merge dist 0.012, while processing p104 +Test -- t4 + CPU seconds to compute hull (after input): 0.021 +Test -- t5 +QH6271 qhull topology error (qh_check_dupridge): wide merge (119659788166.1x wider) due to dupridge between f7842 and f7823 (vertex dist 0.0016), merge dist 0.0021, while processing p55 +Test -- t6 + CPU seconds to compute hull (after input): 0.02 +Test -- t7 +QH6271 qhull topology error (qh_check_dupridge): wide merge (826947278897.3x wider) due to dupridge between f10941 and f10938 (vertex dist 0.12), merge dist 0.014, while processing p174 +Test -- t8 +QH6271 qhull topology error (qh_check_dupridge): wide merge (332360605318.1x wider) due to dupridge between f12931 and f12932 (vertex dist 0.05), merge dist 0.0058, while processing p72 +Test -- t9 + CPU seconds to compute hull (after input): 0.02 +Test -- t10 +QH6271 qhull topology error (qh_check_dupridge): wide merge (279982910429.7x wider) due to dupridge between f13107 and f13053 (vertex dist 0.0087), merge dist 0.0049, while processing p148 +1591314342 Test 10 runs in 2 seconds (ave. 200 msec) -- rbox 100 s C1,1e-13 D4 t1 | qhull Q14 d Qbb Tv + +Testing -- rbox 50 s C1,1e-13 D5 t1 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-227134.log +Test -- t1 +QH6271 qhull topology error (qh_check_dupridge): wide merge (4995107542900.0x wider) due to dupridge between f16194 and f16417 (vertex dist 0.14), merge dist 0.12, while processing p13 +Test -- t2 + CPU seconds to compute hull (after input): 0.045 +Test -- t3 + CPU seconds to compute hull (after input): 0.043 +Test -- t4 + CPU seconds to compute hull (after input): 0.042 +Test -- t5 +QH6271 qhull topology error (qh_check_dupridge): wide merge (145603403574.2x wider) due to dupridge between f18407 and f18342 (vertex dist 0.1), merge dist 0.0034, while processing p84 +Test -- t6 + CPU seconds to compute hull (after input): 0.044 +Test -- t7 +QH6271 qhull topology error (qh_check_dupridge): wide merge (45196191923.8x wider) due to dupridge between f18796 and f18794 (vertex dist 0.023), merge dist 0.00098, while processing p69 +Test -- t8 + CPU seconds to compute hull (after input): 0.043 +Test -- t9 +QH6271 qhull topology error (qh_check_dupridge): wide merge (423011392553.9x wider) due to dupridge between f23440 and f23439 (vertex dist 0.0016), merge dist 0.0097, while processing p38 +Test -- t10 +QH7081 qhull precision warning (qh_getpinchedmerges): pinched vertices v34 and v17 (dist 0.0067, 299162469040x) would produce a wide merge for f14316 and f14545. Will merge dupridge instead +QH6271 qhull topology error (qh_check_dupridge): wide merge (878926583303.0x wider) due to dupridge between f14316 and f14545 (vertex dist 0.017), merge dist 0.02, while processing p66 +1591314345 Test 10 runs in 2 seconds (ave. 200 msec) -- rbox 50 s C1,1e-13 D5 t1 | qhull Q14 d Qbb Tv + +Testing -- rbox 50 s C1,1e-13 D6 t1 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-06-04/qhull-827565.log +Test -- t1 +QH6271 qhull topology error (qh_check_dupridge): wide merge (5897312052479.2x wider) due to dupridge between f18531 and f18530 (vertex dist 0.092), merge dist 0.19, while processing p77 +Test -- t2 +QH6271 qhull topology error (qh_check_dupridge): wide merge (1724107680480.5x wider) due to dupridge between f25295 and f25296 (vertex dist 0.00061), merge dist 0.054, while processing p3 +Test -- t3 +QH6271 qhull topology error (qh_check_dupridge): wide merge (798302749670.2x wider) due to dupridge between f18579 and f18574 (vertex dist 0.084), merge dist 0.024, while processing p83 +Test -- t4 +QH7081 qhull precision warning (qh_getpinchedmerges): pinched vertices v33 and v2 (dist 0.016, 535923660887x) would produce a wide merge for f13575 and f13490. Will merge dupridge instead +QH6271 qhull topology error (qh_check_dupridge): wide merge (527892127468.9x wider) due to dupridge between f13575 and f13490 (vertex dist 0.016), merge dist 0.016, while processing p23 +Test -- t5 +QH6271 qhull topology error (qh_check_dupridge): wide merge (50044710155.4x wider) due to dupridge between f13023 and f13391 (vertex dist 0.2), merge dist 0.0017, while processing p75 +Test -- t6 +QH7081 qhull precision warning (qh_getpinchedmerges): pinched vertices v57 and v22 (dist 0.0063, 221587513534x) would produce a wide merge for f39570 and f39365. Will merge dupridge instead +QH6271 qhull topology error (qh_check_dupridge): wide merge (2548029701901.9x wider) due to dupridge between f39570 and f39365 (vertex dist 0.0063), merge dist 0.072, while processing p52 +Test -- t7 +QH7081 qhull precision warning (qh_getpinchedmerges): pinched vertices v25 and v57 (dist 0.0017, 55693747840x) would produce a wide merge for f30840 and f30837. Will merge dupridge instead +QH6271 qhull topology error (qh_check_dupridge): wide merge (1650435777757.3x wider) due to dupridge between f30625 and f30623 (vertex dist 0.012), merge dist 0.051, while processing p52 +Test -- t8 +QH7081 qhull precision warning (qh_getpinchedmerges): pinched vertices v49 and v29 (dist 0.00012, 4740313861x) would produce a wide merge for f46587 and f46678. Will merge dupridge instead +QH6271 qhull topology error (qh_check_dupridge): wide merge (139144921895.4x wider) due to dupridge between f46374 and f46372 (vertex dist 0.025), merge dist 0.0036, while processing p50 +Test -- t9 +QH6271 qhull topology error (qh_check_dupridge): wide merge (556932183829.0x wider) due to dupridge between f13608 and f13610 (vertex dist 0.022), merge dist 0.017, while processing p50 +Test -- t10 +QH7081 qhull precision warning (qh_getpinchedmerges): pinched vertices v56 and v42 (dist 0.00098, 34927769758x) would produce a wide merge for f30280 and f30270. Will merge dupridge instead +QH6271 qhull topology error (qh_check_dupridge): wide merge (216561738457.3x wider) due to dupridge between f30280 and f30270 (vertex dist 0.00098), merge dist 0.0061, while processing p92 +1591314348 Test 10 runs in 2 seconds (ave. 200 msec) -- rbox 50 s C1,1e-13 D6 t1 | qhull Q14 d Qbb Tv + +============================ +== Time for pinched Delaunay triangulation of random point pairs (Q14) with bounding box +============================ + +Testing -- rbox 50000 C1,2e-13 c G2.0 D2 t1 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-427996.log +Test -- t1 + CPU seconds to compute hull (after input): 0.499 +Test -- t2 + CPU seconds to compute hull (after input): 0.475 +Test -- t3 + CPU seconds to compute hull (after input): 0.478 +Test -- t4 + CPU seconds to compute hull (after input): 0.478 +Test -- t5 + CPU seconds to compute hull (after input): 0.449 +Test -- t6 + CPU seconds to compute hull (after input): 0.496 +Test -- t7 + CPU seconds to compute hull (after input): 0.503 +Test -- t8 + CPU seconds to compute hull (after input): 0.494 +Test -- t9 + CPU seconds to compute hull (after input): 0.479 +Test -- t10 + CPU seconds to compute hull (after input): 0.48 +1591314359 Test 10 runs in 10 seconds (ave. 1000 msec) -- rbox 50000 C1,2e-13 c G2.0 D2 t1 | qhull Q14 d Qbb + +Testing -- rbox 10000 C1,2e-13 c G2.0 D3 t1 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-296243.log +Test -- t1 + CPU seconds to compute hull (after input): 0.392 +Test -- t2 + CPU seconds to compute hull (after input): 0.386 +Test -- t3 + CPU seconds to compute hull (after input): 0.411 +Test -- t4 + CPU seconds to compute hull (after input): 0.399 +Test -- t5 + CPU seconds to compute hull (after input): 0.407 +Test -- t6 + CPU seconds to compute hull (after input): 0.387 +Test -- t7 + CPU seconds to compute hull (after input): 0.386 +Test -- t8 + CPU seconds to compute hull (after input): 0.408 +Test -- t9 + CPU seconds to compute hull (after input): 0.404 +Test -- t10 + CPU seconds to compute hull (after input): 0.367 +1591314366 Test 10 runs in 6 seconds (ave. 600 msec) -- rbox 10000 C1,2e-13 c G2.0 D3 t1 | qhull Q14 d Qbb + +Testing -- rbox 3000 C1,2e-13 c G2.0 D4 t1 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-564059.log +Test -- t1 +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f190685 into f190684 for mergetype 3 (concave). maxdist 0 (0.0x) mindist -9.2e-05 (1409066448.7x) vertexdist 0.11 Allow with 'Q12' (allow-wide) +Test -- t2 +QH7085 Qhull precision warning: repartition coplanar point p4824 from f261866 as an outside point above twisted facet f261713 dist 0.00066 nearest vertices 2e-13 + CPU seconds to compute hull (after input): 0.976 +Test -- t3 +QH7085 Qhull precision warning: repartition coplanar point p5663 from f370475 as an outside point above twisted facet f370562 dist 0.0043 nearest vertices 3e-13 +QH7085 Qhull precision warning: repartition coplanar point p2873 from f370475 as an outside point above twisted facet f370562 dist 0.00034 nearest vertices 3e-13 +QH7085 Qhull precision warning: repartition coplanar point p2311 from f370475 as an outside point above twisted facet f370562 dist 0.015 nearest vertices 3e-13 + CPU seconds to compute hull (after input): 0.956 +Test -- t4 + CPU seconds to compute hull (after input): 0.941 +Test -- t5 +QH7085 Qhull precision warning: repartition coplanar point p1727 from f29969 as an outside point above twisted facet f28893 dist 0.00066 nearest vertices 2e-13 + CPU seconds to compute hull (after input): 0.989 +Test -- t6 + CPU seconds to compute hull (after input): 0.993 +Test -- t7 +QH7085 Qhull precision warning: repartition coplanar point p512 from f121648 as an outside point above twisted facet f121661 dist 0.0011 nearest vertices 2e-13 +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f231543 into f231542 for mergetype 3 (concave). maxdist 0 (0.0x) mindist -0.00026 (4040593870.1x) vertexdist 0.094 Allow with 'Q12' (allow-wide) +Test -- t8 +QH7085 Qhull precision warning: repartition coplanar point p2360 from f22149 as an outside point above twisted facet f20962 dist 0.0017 nearest vertices 2.1e-13 +QH7085 Qhull precision warning: repartition coplanar point p5349 from f61378 as an outside point above twisted facet f61399 dist 0.0056 nearest vertices 1.5e-13 +QH7085 Qhull precision warning: repartition coplanar point p366 from f61425 as an outside point above twisted facet f61399 dist 0.0063 nearest vertices 1.5e-13 +QH7085 Qhull precision warning: repartition coplanar point p2878 from f74011 as an outside point above twisted facet f61399 dist 0.017 nearest vertices 1.5e-13 + CPU seconds to compute hull (after input): 0.997 +Test -- t9 + CPU seconds to compute hull (after input): 0.924 +Test -- t10 + CPU seconds to compute hull (after input): 1.004 +1591314378 Test 10 runs in 11 seconds (ave. 1100 msec) -- rbox 3000 C1,2e-13 c G2.0 D4 t1 | qhull Q14 d Qbb + +Testing -- rbox 500 C1,2e-13 c G2.0 D5 t1 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-965783.log +Test -- t1 + CPU seconds to compute hull (after input): 0.901 +Test -- t2 +QH7085 Qhull precision warning: repartition coplanar point p441 from f155582 as an outside point above twisted facet f155687 dist 0.0012 nearest vertices 2.7e-13 + CPU seconds to compute hull (after input): 1.069 +Test -- t3 + CPU seconds to compute hull (after input): 0.925 +Test -- t4 +QH7085 Qhull precision warning: repartition coplanar point p843 from f17592 as an outside point above twisted facet f17727 dist 0.0012 nearest vertices 3e-13 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r7446 and r7444. Nearest v41 and v78 dist 0.61 (6635311317759.2x) +Test -- t5 +QH7085 Qhull precision warning: repartition coplanar point p38 from f99761 as an outside point above twisted facet f84442 dist 0.0045 nearest vertices 2.8e-13 + CPU seconds to compute hull (after input): 0.911 +Test -- t6 + CPU seconds to compute hull (after input): 0.961 +Test -- t7 +QH7085 Qhull precision warning: repartition coplanar point p268 from f291988 as an outside point above twisted facet f291679 dist 0.013 nearest vertices 2.3e-13 + CPU seconds to compute hull (after input): 0.888 +Test -- t8 + CPU seconds to compute hull (after input): 0.938 +Test -- t9 +QH7085 Qhull precision warning: repartition coplanar point p925 from f317207 as an outside point above twisted facet f317303 dist 0.014 nearest vertices 2.7e-13 +QH6348 qhull precision error (qh_mergefacet): wide merge for pinched facet f317430 into f317603 for mergetype 3 (concave). maxdist 0 (0x) mindist -0.002 (20692770256.2x) vertexdist 2.2e-13 Allow with 'Q12' (allow-wide) +Test -- t10 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r44665 and r44664. Nearest v253 and v490 dist 0.58 (6291651853148.8x) +1591314389 Test 10 runs in 10 seconds (ave. 1000 msec) -- rbox 500 C1,2e-13 c G2.0 D5 t1 | qhull Q14 d Qbb + +Testing -- rbox 100 C1,2e-13 c G2.0 D6 t1 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-834030.log +Test -- t1 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r40264 and r40261. Nearest v24 and v29 dist 0.8 (6057456805330.6x) +Test -- t2 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r22036 and r22035. Nearest v38 and v64 dist 1.2 (8992021169760.2x) +Test -- t3 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r140925 and r140923. Nearest v124 and v149 dist 0.74 (5629429151422.8x) +Test -- t4 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r41562 and r41555. Nearest v13 and v24 dist 0.52 (3937835544171.1x) +Test -- t5 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r10090 and r10088. Nearest v21 and v45 dist 0.44 (3372974355622.5x) +Test -- t6 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r104203 and r104152. Nearest v12 and v127 dist 0.51 (3899853567278.4x) +Test -- t7 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r113761 and r113750. Nearest v90 and v144 dist 0.54 (4106052672638.0x) +Test -- t8 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r64014 and r63556. Nearest v59 and v79 dist 0.72 (5474375529407.1x) +Test -- t9 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r62473 and r62470. Nearest v23 and v86 dist 0.76 (5797319173797.8x) +Test -- t10 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r56091 and r56070. Nearest v24 and v32 dist 0.68 (5202677736978.0x) +1591314396 Test 10 runs in 6 seconds (ave. 600 msec) -- rbox 100 C1,2e-13 c G2.0 D6 t1 | qhull Q14 d Qbb + +============================ +== Time for pinched Delaunay triangulation of random point pairs (Q14, Q12) +== qh_next_facetmerge, qh_findbesthorizon (qh_distplane) +============================ + +Testing -- rbox 50000 C1,2e-13 D2 t1 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-568369.log +Test -- t1 + CPU seconds to compute hull (after input): 0.529 +Test -- t2 + CPU seconds to compute hull (after input): 0.544 +Test -- t3 + CPU seconds to compute hull (after input): 0.462 +Test -- t4 + CPU seconds to compute hull (after input): 0.539 +Test -- t5 + CPU seconds to compute hull (after input): 0.514 +Test -- t6 + CPU seconds to compute hull (after input): 0.482 +Test -- t7 + CPU seconds to compute hull (after input): 0.46 +Test -- t8 + CPU seconds to compute hull (after input): 0.522 +Test -- t9 + CPU seconds to compute hull (after input): 0.499 +Test -- t10 + CPU seconds to compute hull (after input): 0.478 +1591314407 Test 10 runs in 10 seconds (ave. 1000 msec) -- rbox 50000 C1,2e-13 D2 t1 | qhull Q14 d Qbb + +Testing -- rbox 5000 C1,2e-13 D3 t1 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-436616.log +Test -- t1 + CPU seconds to compute hull (after input): 0.35 + Maximum distance of vertex below facet: -1.1e-13 (11.0x) +Test -- t2 + CPU seconds to compute hull (after input): 0.311 + Maximum distance of vertex below facet: -1.3e-13 (12.7x) +Test -- t3 + CPU seconds to compute hull (after input): 0.36 + Maximum distance of vertex below facet: -1.5e-13 (15.2x) +Test -- t4 + CPU seconds to compute hull (after input): 0.321 +Test -- t5 + CPU seconds to compute hull (after input): 0.36 +Test -- t6 + CPU seconds to compute hull (after input): 0.347 +Test -- t7 + CPU seconds to compute hull (after input): 0.327 + Maximum distance of point above facet: 1.4e-13 (13.6x) + Maximum distance of vertex below facet: -1.4e-13 (13.6x) +Test -- t8 + CPU seconds to compute hull (after input): 0.32 + Maximum distance of point above facet: 1.2e-13 (12.4x) + Maximum distance of vertex below facet: -1.3e-13 (12.7x) +Test -- t9 +QH6271 qhull topology error (qh_check_dupridge): wide merge (2392033422.9x wider) due to dupridge between f123716 and f123715 (vertex dist 2.4e-13), merge dist 0.0004, while processing p8866 + Maximum distance of point above facet: 1.7e-13 (16.5x) +Test -- t10 + CPU seconds to compute hull (after input): 0.291 +1591314413 Test 10 runs in 5 seconds (ave. 500 msec) -- rbox 5000 C1,2e-13 D3 t1 | qhull Q14 d Qbb + +Testing -- rbox 500 C1,2e-13 D4 t1 | qhull Q12 Q14 d Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-637478.log +Test -- t1 + CPU seconds to compute hull (after input): 0.265 + Maximum distance of point above facet: 1.7e-13 (10.4x) +Test -- t2 + CPU seconds to compute hull (after input): 0.279 +Test -- t3 + CPU seconds to compute hull (after input): 0.265 +Test -- t4 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r37323 and r37309. Nearest v145 and v655 dist 0.067 (4459578188183.3x) +Test -- t5 + CPU seconds to compute hull (after input): 0.259 + Maximum distance of point above facet: 2.1e-13 (12.9x) + Maximum distance of vertex below facet: -0.00072 (43999621075.0x) +Test -- t6 + CPU seconds to compute hull (after input): 0.243 +Test -- t7 +QH7085 Qhull precision warning: repartition coplanar point p939 from f58978 as an outside point above twisted facet f53492 dist 0.00041 nearest vertices 2.1e-13 + CPU seconds to compute hull (after input): 0.252 +Test -- t8 +QH6391 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve opposite oriented ridges r49440 and r49431 in f83434 and f83454. Nearest v702 and v749 dist 0.13 (8887619111449.9x) +Test -- t9 + CPU seconds to compute hull (after input): 0.284 +Test -- t10 + CPU seconds to compute hull (after input): 0.283 + Maximum distance of point above facet: 2.2e-13 (13.3x) + Maximum distance of vertex below facet: -2.2e-13 (13.3x) +1591314419 Test 10 runs in 5 seconds (ave. 500 msec) -- rbox 500 C1,2e-13 D4 t1 | qhull Q12 Q14 d Qbb + +Testing -- rbox 300 C1,2e-13 D5 t1 | qhull Q12 Q14 d Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-304863.log +Test -- t1 +QH6271 qhull topology error (qh_check_dupridge): wide merge (5570546919.7x wider) due to dupridge between f164113 and f164214 (vertex dist 2.2e-13), merge dist 0.0012, while processing p459 +QH6418 qhull precision error (qh_merge_twisted): twisted facet f151765 with pinched vertices. Could merge vertices, but too wide to merge into neighbor. mindist -0.019 maxdist 0 vertexdist 3.3e-13 neighbor f170719 mindist -0.014 maxdist 0 + Maximum distance of point above facet: 2.5e-13 (10.2x) + Maximum distance of vertex below facet: -0.0012 (50158760830.2x) +Test -- t2 +QH6271 qhull topology error (qh_check_dupridge): wide merge (347037085657.3x wider) due to dupridge between f142397 and f202075 (vertex dist 2e-13), merge dist 0.1, while processing p329 +QH6271 qhull topology error (qh_check_dupridge): wide merge (18938032507.7x wider) due to dupridge between f345584 and f345474 (vertex dist 2.9e-13), merge dist 0.0056, while processing p557 + CPU seconds to compute hull (after input): 1.234 + Maximum distance of point above facet: 2.9e-13 (11.9x) + Maximum distance of vertex below facet: -0.017 (687191049377.1x) +Test -- t3 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r23254 and r23262. Nearest v99 and v153 dist 0.14 (6271081023221.3x) +Test -- t4 +QH6271 qhull topology error (qh_check_dupridge): wide merge (454633750155.1x wider) due to dupridge between f270523 and f270385 (vertex dist 2.5e-13), merge dist 0.088, while processing p419 +QH6391 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve opposite oriented ridges r200444 and r200522 in f270385 and f309294. Nearest v250 and v544 dist 0.39 (16854722445792.8x) + Maximum distance of point above facet: 0.00092 (37271597143.0x) + Maximum distance of vertex below facet: -0.088 (3584450304447.4x) +Test -- t5 +QH7085 Qhull precision warning: repartition coplanar point p35 from f123614 as an outside point above twisted facet f123219 dist 4.5e-05 nearest vertices 3.3e-13 +QH6271 qhull topology error (qh_check_dupridge): wide merge (878413113784.2x wider) due to dupridge between f164350 and f164337 (vertex dist 2.4e-13), merge dist 0.19, while processing p499 + CPU seconds to compute hull (after input): 4.97 + Maximum distance of point above facet: 3.4e-13 (13.7x) + Maximum distance of vertex below facet: -3.9e-13 (15.9x) +Test -- t6 +QH7085 Qhull precision warning: repartition coplanar point p6 from f150669 as an outside point above twisted facet f150322 dist 0.0024 nearest vertices 3e-13 + CPU seconds to compute hull (after input): 1.122 + Maximum distance of point above facet: 4.1e-13 (16.8x) + Maximum distance of vertex below facet: -3.7e-13 (15.1x) +Test -- t7 +QH7085 Qhull precision warning: repartition coplanar point p444 from f199948 as an outside point above twisted facet f265269 dist 0.0018 nearest vertices 3e-13 +QH6271 qhull topology error (qh_check_dupridge): wide merge (569356935583.7x wider) due to dupridge between f270435 and f270400 (vertex dist 2.7e-13), merge dist 0.17, while processing p182 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r215922 and r276482. Nearest v67 and v208 dist 0.13 (5873339593550.7x) + Maximum distance of point above facet: 0.0028 (112586859288.4x) + Maximum distance of vertex below facet: -0.17 (6865829933136.7x) +Test -- t8 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f138124 and f138129 have the same vertices (skip 1, skip 1) and same horizon ridges to f82053 and f58330 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f138124 and f138129 have the same vertices (skip 2, skip 2) and same horizon ridges to f82053 and f58330 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f138124 and f138129 have the same vertices (skip 3, skip 3) and same horizon ridges to f82053 and f58330 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r161343 and r161333. Nearest v277 and v461 dist 0.3 (13107519691555.2x) +Test -- t9 +QH6391 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve opposite oriented ridges r162905 and r162900 in f219542 and f219513. Nearest v431 and v470 dist 0.33 (14493670237305.6x) + Maximum distance of point above facet: 2.8e-13 (11.2x) +Test -- t10 +QH6391 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve opposite oriented ridges r54841 and r54808 in f98872 and f98951. Nearest v103 and v151 dist 0.24 (10377121912131.9x) +1591314432 Test 10 runs in 13 seconds (ave. 1300 msec) -- rbox 300 C1,2e-13 D5 t1 | qhull Q12 Q14 d Qbb + +Testing -- rbox 100 C1,2e-13 D6 t1 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-773541.log +Test -- t1 + CPU seconds to compute hull (after input): 1.056 + Maximum distance of vertex below facet: -3.7e-13 (10.6x) +Test -- t2 + CPU seconds to compute hull (after input): 0.983 +Test -- t3 + CPU seconds to compute hull (after input): 0.951 +Test -- t4 + CPU seconds to compute hull (after input): 1.057 + Maximum distance of point above facet: 3.6e-13 (10.3x) + Maximum distance of vertex below facet: -3.6e-13 (10.4x) +Test -- t5 + CPU seconds to compute hull (after input): 1.024 + Maximum distance of point above facet: 3.9e-13 (11.2x) + Maximum distance of vertex below facet: -3.5e-13 (10.0x) +Test -- t6 + CPU seconds to compute hull (after input): 1.096 + Maximum distance of point above facet: 3.6e-13 (10.2x) + Maximum distance of vertex below facet: -3.6e-13 (10.2x) +Test -- t7 + CPU seconds to compute hull (after input): 1.125 + Maximum distance of point above facet: 3.6e-13 (10.3x) + Maximum distance of vertex below facet: -3.9e-13 (11.2x) +Test -- t8 + CPU seconds to compute hull (after input): 0.959 + Maximum distance of point above facet: 3.9e-13 (11.2x) +Test -- t9 + CPU seconds to compute hull (after input): 0.996 + Maximum distance of vertex below facet: -3.5e-13 (10.1x) +Test -- t10 + CPU seconds to compute hull (after input): 1.042 +1591314446 Test 10 runs in 13 seconds (ave. 1300 msec) -- rbox 100 C1,2e-13 D6 t1 | qhull Q14 d Qbb + +=========================== +=== N_TIMING test cases === +=========================== + +============================ +== Time for random points in a cube +============================ + +Testing -- rbox 1000000 D2 t1 | qhull >/d/bash/var/tmp/qtest-2020-06-04/qhull-242219.log +Test -- t1 + CPU seconds to compute hull (after input): 0.105 +Test -- t2 + CPU seconds to compute hull (after input): 0.099 +Test -- t3 + CPU seconds to compute hull (after input): 0.099 +Test -- t4 + CPU seconds to compute hull (after input): 0.099 +Test -- t5 + CPU seconds to compute hull (after input): 0.098 +Test -- t6 + CPU seconds to compute hull (after input): 0.103 +Test -- t7 + CPU seconds to compute hull (after input): 0.109 +Test -- t8 + CPU seconds to compute hull (after input): 0.103 +Test -- t9 + CPU seconds to compute hull (after input): 0.121 +Test -- t10 + CPU seconds to compute hull (after input): 0.102 +1591314472 Test 10 runs in 24 seconds (ave. 2400 msec) -- rbox 1000000 D2 t1 | qhull + +Testing -- rbox 500000 D3 t1 | qhull >/d/bash/var/tmp/qtest-2020-06-04/qhull-112621.log +Test -- t1 + CPU seconds to compute hull (after input): 0.105 +Test -- t2 + CPU seconds to compute hull (after input): 0.092 +Test -- t3 + CPU seconds to compute hull (after input): 0.099 +Test -- t4 + CPU seconds to compute hull (after input): 0.106 +Test -- t5 + CPU seconds to compute hull (after input): 0.109 +Test -- t6 + CPU seconds to compute hull (after input): 0.114 +Test -- t7 + CPU seconds to compute hull (after input): 0.109 +Test -- t8 + CPU seconds to compute hull (after input): 0.095 +Test -- t9 + CPU seconds to compute hull (after input): 0.122 +Test -- t10 + CPU seconds to compute hull (after input): 0.103 +1591314492 Test 10 runs in 19 seconds (ave. 1900 msec) -- rbox 500000 D3 t1 | qhull + +Testing -- rbox 200000 D4 t1 | qhull >/d/bash/var/tmp/qtest-2020-06-04/qhull-248684.log +Test -- t1 + CPU seconds to compute hull (after input): 0.107 +Test -- t2 + CPU seconds to compute hull (after input): 0.127 +Test -- t3 + CPU seconds to compute hull (after input): 0.134 +Test -- t4 + CPU seconds to compute hull (after input): 0.149 +Test -- t5 + CPU seconds to compute hull (after input): 0.116 +Test -- t6 + CPU seconds to compute hull (after input): 0.147 +Test -- t7 + CPU seconds to compute hull (after input): 0.141 +Test -- t8 + CPU seconds to compute hull (after input): 0.142 +Test -- t9 + CPU seconds to compute hull (after input): 0.181 +Test -- t10 + CPU seconds to compute hull (after input): 0.145 +1591314505 Test 10 runs in 12 seconds (ave. 1200 msec) -- rbox 200000 D4 t1 | qhull + +Testing -- rbox 100000 D5 t1 | qhull Q12 >/d/bash/var/tmp/qtest-2020-06-04/qhull-183885.log +Test -- t1 + CPU seconds to compute hull (after input): 0.712 +Test -- t2 + CPU seconds to compute hull (after input): 0.763 +Test -- t3 + CPU seconds to compute hull (after input): 0.707 +Test -- t4 + CPU seconds to compute hull (after input): 0.688 +Test -- t5 + CPU seconds to compute hull (after input): 0.767 +Test -- t6 + CPU seconds to compute hull (after input): 0.763 +Test -- t7 + CPU seconds to compute hull (after input): 0.635 +Test -- t8 + CPU seconds to compute hull (after input): 0.688 +Test -- t9 + CPU seconds to compute hull (after input): 0.752 +Test -- t10 + CPU seconds to compute hull (after input): 0.65 +1591314520 Test 10 runs in 15 seconds (ave. 1500 msec) -- rbox 100000 D5 t1 | qhull Q12 + +Testing -- rbox 3000 D6 t1 | qhull >/d/bash/var/tmp/qtest-2020-06-04/qhull-186040.log +Test -- t1 + CPU seconds to compute hull (after input): 0.931 +Test -- t2 + CPU seconds to compute hull (after input): 0.959 +Test -- t3 + CPU seconds to compute hull (after input): 1.084 +Test -- t4 + CPU seconds to compute hull (after input): 0.908 +Test -- t5 + CPU seconds to compute hull (after input): 0.785 +Test -- t6 + CPU seconds to compute hull (after input): 0.979 +Test -- t7 + CPU seconds to compute hull (after input): 0.887 +Test -- t8 + CPU seconds to compute hull (after input): 0.995 +Test -- t9 + CPU seconds to compute hull (after input): 0.959 +Test -- t10 + CPU seconds to compute hull (after input): 0.903 +1591314532 Test 10 runs in 12 seconds (ave. 1200 msec) -- rbox 3000 D6 t1 | qhull + +============================ +== Time for random cospherical points +============================ + +Testing -- rbox 100000 s D2 t1 | qhull >/d/bash/var/tmp/qtest-2020-06-04/qhull-121241.log +Test -- t1 + CPU seconds to compute hull (after input): 0.257 +Test -- t2 + CPU seconds to compute hull (after input): 0.251 +Test -- t3 + CPU seconds to compute hull (after input): 0.222 +Test -- t4 + CPU seconds to compute hull (after input): 0.223 +Test -- t5 + CPU seconds to compute hull (after input): 0.238 +Test -- t6 + CPU seconds to compute hull (after input): 0.26 +Test -- t7 + CPU seconds to compute hull (after input): 0.218 +Test -- t8 + CPU seconds to compute hull (after input): 0.234 +Test -- t9 + CPU seconds to compute hull (after input): 0.231 +Test -- t10 + CPU seconds to compute hull (after input): 0.231 +1591314541 Test 10 runs in 7 seconds (ave. 700 msec) -- rbox 100000 s D2 t1 | qhull + +Testing -- rbox 100000 s D3 t1 | qhull >/d/bash/var/tmp/qtest-2020-06-04/qhull-389057.log +Test -- t1 + CPU seconds to compute hull (after input): 0.478 +Test -- t2 + CPU seconds to compute hull (after input): 0.517 +Test -- t3 + CPU seconds to compute hull (after input): 0.504 +Test -- t4 + CPU seconds to compute hull (after input): 0.453 +Test -- t5 + CPU seconds to compute hull (after input): 0.483 +Test -- t6 + CPU seconds to compute hull (after input): 0.494 +Test -- t7 + CPU seconds to compute hull (after input): 0.466 +Test -- t8 + CPU seconds to compute hull (after input): 0.448 +Test -- t9 + CPU seconds to compute hull (after input): 0.523 +Test -- t10 + CPU seconds to compute hull (after input): 0.446 +1591314552 Test 10 runs in 11 seconds (ave. 1100 msec) -- rbox 100000 s D3 t1 | qhull + +Testing -- rbox 50000 s D4 t1 | qhull >/d/bash/var/tmp/qtest-2020-06-04/qhull-790781.log +Test -- t1 + CPU seconds to compute hull (after input): 1.135 +Test -- t2 + CPU seconds to compute hull (after input): 1.031 +Test -- t3 + CPU seconds to compute hull (after input): 1.127 +Test -- t4 + CPU seconds to compute hull (after input): 1.056 +Test -- t5 + CPU seconds to compute hull (after input): 1.086 +Test -- t6 + CPU seconds to compute hull (after input): 1.04 +Test -- t7 + CPU seconds to compute hull (after input): 1.149 +Test -- t8 + CPU seconds to compute hull (after input): 1.089 +Test -- t9 + CPU seconds to compute hull (after input): 1.102 +Test -- t10 + CPU seconds to compute hull (after input): 1.07 +1591314571 Test 10 runs in 18 seconds (ave. 1800 msec) -- rbox 50000 s D4 t1 | qhull + +== Repeat with qconvex, bin/qconvex is built with libqhull instead of libqhull_r + +Testing -- rbox 50000 s D4 t1 | qconvex >/d/bash/var/tmp/qtest-2020-06-04/qhull-393367.log +Test -- t1 + CPU seconds to compute hull (after input): 1.01 +Test -- t2 + CPU seconds to compute hull (after input): 1.052 +Test -- t3 + CPU seconds to compute hull (after input): 0.953 +Test -- t4 + CPU seconds to compute hull (after input): 1.005 +Test -- t5 + CPU seconds to compute hull (after input): 1.006 +Test -- t6 + CPU seconds to compute hull (after input): 1.004 +Test -- t7 + CPU seconds to compute hull (after input): 1.096 +Test -- t8 + CPU seconds to compute hull (after input): 1.073 +Test -- t9 + CPU seconds to compute hull (after input): 1.025 +Test -- t10 + CPU seconds to compute hull (after input): 1.068 +1591314588 Test 10 runs in 16 seconds (ave. 1600 msec) -- rbox 50000 s D4 t1 | qconvex + +Testing -- rbox 10000 s D5 t1 | qhull >/d/bash/var/tmp/qtest-2020-06-04/qhull-995953.log +Test -- t1 + CPU seconds to compute hull (after input): 1.423 +Test -- t2 + CPU seconds to compute hull (after input): 1.367 +Test -- t3 + CPU seconds to compute hull (after input): 1.44 +Test -- t4 + CPU seconds to compute hull (after input): 1.375 +Test -- t5 + CPU seconds to compute hull (after input): 1.406 +Test -- t6 + CPU seconds to compute hull (after input): 1.421 +Test -- t7 + CPU seconds to compute hull (after input): 1.475 +Test -- t8 + CPU seconds to compute hull (after input): 1.464 +Test -- t9 + CPU seconds to compute hull (after input): 1.4 +Test -- t10 + CPU seconds to compute hull (after input): 1.453 +1591314608 Test 10 runs in 19 seconds (ave. 1900 msec) -- rbox 10000 s D5 t1 | qhull + +Testing -- rbox 1000 s D6 t1 | qhull >/d/bash/var/tmp/qtest-2020-06-04/qhull-665493.log +Test -- t1 + CPU seconds to compute hull (after input): 0.705 +Test -- t2 + CPU seconds to compute hull (after input): 0.735 +Test -- t3 + CPU seconds to compute hull (after input): 0.681 +Test -- t4 + CPU seconds to compute hull (after input): 0.66 +Test -- t5 + CPU seconds to compute hull (after input): 0.716 +Test -- t6 + CPU seconds to compute hull (after input): 0.694 +Test -- t7 + CPU seconds to compute hull (after input): 0.669 +Test -- t8 + CPU seconds to compute hull (after input): 0.655 +Test -- t9 + CPU seconds to compute hull (after input): 0.682 +Test -- t10 + CPU seconds to compute hull (after input): 0.655 +1591314619 Test 10 runs in 10 seconds (ave. 1000 msec) -- rbox 1000 s D6 t1 | qhull + +============================ +== Time for extreme post-merge of random cospherical points +============================ + +Testing -- rbox 100000 s D2 t1 | qhull C0.01 >/d/bash/var/tmp/qtest-2020-06-04/qhull-533740.log +Test -- t1 + CPU seconds to compute hull (after input): 0.647 +Test -- t2 + CPU seconds to compute hull (after input): 0.575 +Test -- t3 + CPU seconds to compute hull (after input): 0.604 +Test -- t4 + CPU seconds to compute hull (after input): 0.652 +Test -- t5 + CPU seconds to compute hull (after input): 0.599 +Test -- t6 + CPU seconds to compute hull (after input): 0.668 +Test -- t7 + CPU seconds to compute hull (after input): 0.639 +Test -- t8 + CPU seconds to compute hull (after input): 0.629 +Test -- t9 + CPU seconds to compute hull (after input): 0.644 +Test -- t10 + CPU seconds to compute hull (after input): 0.639 +1591314632 Test 10 runs in 12 seconds (ave. 1200 msec) -- rbox 100000 s D2 t1 | qhull C0.01 + +Testing -- rbox 10000 s D3 t1 | qhull C0.01 >/d/bash/var/tmp/qtest-2020-06-04/qhull-935464.log +Test -- t1 + CPU seconds to compute hull (after input): 0.14 +Test -- t2 + CPU seconds to compute hull (after input): 0.147 +Test -- t3 + CPU seconds to compute hull (after input): 0.174 +Test -- t4 + CPU seconds to compute hull (after input): 0.165 +Test -- t5 + CPU seconds to compute hull (after input): 0.148 +Test -- t6 + CPU seconds to compute hull (after input): 0.149 +Test -- t7 + CPU seconds to compute hull (after input): 0.144 +Test -- t8 + CPU seconds to compute hull (after input): 0.142 +Test -- t9 + CPU seconds to compute hull (after input): 0.142 +Test -- t10 + CPU seconds to compute hull (after input): 0.145 +1591314636 Test 10 runs in 3 seconds (ave. 300 msec) -- rbox 10000 s D3 t1 | qhull C0.01 + +Testing -- rbox 5000 s D4 t1 | qhull C0.01 >/d/bash/var/tmp/qtest-2020-06-04/qhull-602849.log +Test -- t1 + CPU seconds to compute hull (after input): 0.395 +Test -- t2 + CPU seconds to compute hull (after input): 0.426 +Test -- t3 + CPU seconds to compute hull (after input): 0.403 +Test -- t4 + CPU seconds to compute hull (after input): 0.375 +Test -- t5 + CPU seconds to compute hull (after input): 0.407 +Test -- t6 + CPU seconds to compute hull (after input): 0.409 +Test -- t7 + CPU seconds to compute hull (after input): 0.399 +Test -- t8 + CPU seconds to compute hull (after input): 0.415 +Test -- t9 + CPU seconds to compute hull (after input): 0.374 +Test -- t10 + CPU seconds to compute hull (after input): 0.437 +1591314643 Test 10 runs in 6 seconds (ave. 600 msec) -- rbox 5000 s D4 t1 | qhull C0.01 + +== Repeat with qconvex, bin/qconvex is built with libqhull instead of libqhull_r + +Testing -- rbox 5000 s D4 t1 | qconvex C0.01 >/d/bash/var/tmp/qtest-2020-06-04/qhull-337188.log +Test -- t1 + CPU seconds to compute hull (after input): 0.42 +Test -- t2 + CPU seconds to compute hull (after input): 0.384 +Test -- t3 + CPU seconds to compute hull (after input): 0.362 +Test -- t4 + CPU seconds to compute hull (after input): 0.393 +Test -- t5 + CPU seconds to compute hull (after input): 0.42 +Test -- t6 + CPU seconds to compute hull (after input): 0.43 +Test -- t7 + CPU seconds to compute hull (after input): 0.392 +Test -- t8 + CPU seconds to compute hull (after input): 0.376 +Test -- t9 + CPU seconds to compute hull (after input): 0.444 +Test -- t10 + CPU seconds to compute hull (after input): 0.406 +1591314650 Test 10 runs in 6 seconds (ave. 600 msec) -- rbox 5000 s D4 t1 | qconvex C0.01 + +Testing -- rbox 2000 s D5 t1 | qhull C0.01 >/d/bash/var/tmp/qtest-2020-06-04/qhull-71527.log +Test -- t1 + CPU seconds to compute hull (after input): 0.805 +Test -- t2 + CPU seconds to compute hull (after input): 0.8 +Test -- t3 + CPU seconds to compute hull (after input): 0.847 +Test -- t4 + CPU seconds to compute hull (after input): 0.809 +Test -- t5 + CPU seconds to compute hull (after input): 0.872 +Test -- t6 + CPU seconds to compute hull (after input): 0.877 +Test -- t7 + CPU seconds to compute hull (after input): 0.819 +Test -- t8 + CPU seconds to compute hull (after input): 0.826 +Test -- t9 + CPU seconds to compute hull (after input): 0.806 +Test -- t10 + CPU seconds to compute hull (after input): 0.811 +1591314662 Test 10 runs in 11 seconds (ave. 1100 msec) -- rbox 2000 s D5 t1 | qhull C0.01 + +Testing -- rbox 500 s D6 t1 | qhull C0.01 >/d/bash/var/tmp/qtest-2020-06-04/qhull-473251.log +Test -- t1 + CPU seconds to compute hull (after input): 0.826 +Test -- t2 + CPU seconds to compute hull (after input): 0.848 +Test -- t3 + CPU seconds to compute hull (after input): 0.812 +Test -- t4 + CPU seconds to compute hull (after input): 0.907 +Test -- t5 + CPU seconds to compute hull (after input): 0.879 +Test -- t6 + CPU seconds to compute hull (after input): 0.907 +Test -- t7 + CPU seconds to compute hull (after input): 0.852 +Test -- t8 + CPU seconds to compute hull (after input): 0.825 +Test -- t9 + CPU seconds to compute hull (after input): 0.851 +Test -- t10 + CPU seconds to compute hull (after input): 0.884 +1591314675 Test 10 runs in 12 seconds (ave. 1200 msec) -- rbox 500 s D6 t1 | qhull C0.01 + +============================ +== Time for rotated cubical points with large merged facets +============================ + +Testing -- rbox 5000000 W0 D2 t1 | qhull QR3 >/d/bash/var/tmp/qtest-2020-06-04/qhull-874975.log +Test -- t1 + CPU seconds to compute hull (after input): 0.922 +Test -- t2 + CPU seconds to compute hull (after input): 0.854 +Test -- t3 + CPU seconds to compute hull (after input): 0.892 +Test -- t4 + CPU seconds to compute hull (after input): 0.862 +Test -- t5 + CPU seconds to compute hull (after input): 0.985 +Test -- t6 + CPU seconds to compute hull (after input): 0.838 +Test -- t7 + CPU seconds to compute hull (after input): 0.826 +Test -- t8 + CPU seconds to compute hull (after input): 0.801 +Test -- t9 + CPU seconds to compute hull (after input): 0.833 +Test -- t10 + CPU seconds to compute hull (after input): 0.863 +1591314778 Test 10 runs in 102 seconds (ave. 10200 msec) -- rbox 5000000 W0 D2 t1 | qhull QR3 + +Testing -- rbox 1000000 W0 D3 t1 | qhull QR3 >/d/bash/var/tmp/qtest-2020-06-04/qhull-823106.log +Test -- t1 + CPU seconds to compute hull (after input): 0.621 +Test -- t2 + CPU seconds to compute hull (after input): 0.721 +Test -- t3 + CPU seconds to compute hull (after input): 0.549 +Test -- t4 + CPU seconds to compute hull (after input): 0.6 +Test -- t5 + CPU seconds to compute hull (after input): 0.575 +Test -- t6 + CPU seconds to compute hull (after input): 0.635 +Test -- t7 + CPU seconds to compute hull (after input): 0.591 +Test -- t8 + CPU seconds to compute hull (after input): 0.646 +Test -- t9 + CPU seconds to compute hull (after input): 0.742 +Test -- t10 + CPU seconds to compute hull (after input): 0.614 +1591314815 Test 10 runs in 36 seconds (ave. 3600 msec) -- rbox 1000000 W0 D3 t1 | qhull QR3 + +Testing -- rbox 100000 W0 D4 t1 | qhull QR3 >/d/bash/var/tmp/qtest-2020-06-04/qhull-95232.log +Test -- t1 + CPU seconds to compute hull (after input): 0.437 +Test -- t2 + CPU seconds to compute hull (after input): 0.417 +Test -- t3 + CPU seconds to compute hull (after input): 0.403 +Test -- t4 + CPU seconds to compute hull (after input): 0.419 +Test -- t5 + CPU seconds to compute hull (after input): 0.416 +Test -- t6 + CPU seconds to compute hull (after input): 0.423 +Test -- t7 + CPU seconds to compute hull (after input): 0.417 +Test -- t8 + CPU seconds to compute hull (after input): 0.381 +Test -- t9 + CPU seconds to compute hull (after input): 0.413 +Test -- t10 + CPU seconds to compute hull (after input): 0.46 +1591314826 Test 10 runs in 10 seconds (ave. 1000 msec) -- rbox 100000 W0 D4 t1 | qhull QR3 + +Testing -- rbox 10000 W0 D5 t1 | qhull QR3 >/d/bash/var/tmp/qtest-2020-06-04/qhull-430002.log +Test -- t1 + CPU seconds to compute hull (after input): 0.654 +Test -- t2 + CPU seconds to compute hull (after input): 0.685 +Test -- t3 + CPU seconds to compute hull (after input): 0.657 +Test -- t4 + CPU seconds to compute hull (after input): 0.628 +Test -- t5 + CPU seconds to compute hull (after input): 0.699 +Test -- t6 + CPU seconds to compute hull (after input): 0.618 +Test -- t7 + CPU seconds to compute hull (after input): 0.614 +Test -- t8 + CPU seconds to compute hull (after input): 0.655 +Test -- t9 + CPU seconds to compute hull (after input): 0.69 +Test -- t10 + CPU seconds to compute hull (after input): 0.807 +1591314836 Test 10 runs in 9 seconds (ave. 900 msec) -- rbox 10000 W0 D5 t1 | qhull QR3 + +Testing -- rbox 1000 W0 D6 t1 | qhull QR3 >/d/bash/var/tmp/qtest-2020-06-04/qhull-764772.log +Test -- t1 + CPU seconds to compute hull (after input): 0.91 +Test -- t2 + CPU seconds to compute hull (after input): 0.918 +Test -- t3 + CPU seconds to compute hull (after input): 0.874 +Test -- t4 + CPU seconds to compute hull (after input): 0.827 +Test -- t5 + CPU seconds to compute hull (after input): 0.827 +Test -- t6 + CPU seconds to compute hull (after input): 0.923 +Test -- t7 + CPU seconds to compute hull (after input): 0.821 +Test -- t8 + CPU seconds to compute hull (after input): 1 +Test -- t9 + CPU seconds to compute hull (after input): 0.839 +Test -- t10 + CPU seconds to compute hull (after input): 0.908 +1591314848 Test 10 runs in 11 seconds (ave. 1100 msec) -- rbox 1000 W0 D6 t1 | qhull QR3 + +============================ +== Time for joggled, rotated cubical points with multiple retries +============================ + +Testing -- rbox 5000000 W0 D2 t1 | qhull QR3 QJ >/d/bash/var/tmp/qtest-2020-06-04/qhull-699973.log +Test -- t1 + CPU seconds to compute hull (after input): 0.837 +Test -- t2 + CPU seconds to compute hull (after input): 0.764 +Test -- t3 + CPU seconds to compute hull (after input): 0.733 +Test -- t4 + CPU seconds to compute hull (after input): 0.723 +Test -- t5 + CPU seconds to compute hull (after input): 0.819 +Test -- t6 + CPU seconds to compute hull (after input): 0.81 +Test -- t7 + CPU seconds to compute hull (after input): 0.732 +Test -- t8 + CPU seconds to compute hull (after input): 0.799 +Test -- t9 + CPU seconds to compute hull (after input): 0.803 +Test -- t10 + CPU seconds to compute hull (after input): 0.712 +1591314950 Test 10 runs in 101 seconds (ave. 10100 msec) -- rbox 5000000 W0 D2 t1 | qhull QR3 QJ + +Testing -- rbox 1000000 W0 D3 t1 | qhull QR3 QJ >/d/bash/var/tmp/qtest-2020-06-04/qhull-114627.log +Test -- t1 + CPU seconds to compute hull (after input): 1.327 + After 2 retries, input joggled by: 3.5e-10 +Test -- t2 + CPU seconds to compute hull (after input): 1.996 + After 3 retries, input joggled by: 3.5e-09 +Test -- t3 + CPU seconds to compute hull (after input): 1.311 + After 2 retries, input joggled by: 3.5e-10 +Test -- t4 + CPU seconds to compute hull (after input): 0.522 +Test -- t5 + CPU seconds to compute hull (after input): 0.478 +Test -- t6 + CPU seconds to compute hull (after input): 1.074 + After 1 retries, input joggled by: 3.5e-11 +Test -- t7 + CPU seconds to compute hull (after input): 1.308 + After 2 retries, input joggled by: 3.5e-10 +Test -- t8 + CPU seconds to compute hull (after input): 1.455 + After 2 retries, input joggled by: 3.5e-10 +Test -- t9 + CPU seconds to compute hull (after input): 1.62 + After 2 retries, input joggled by: 3.5e-10 +Test -- t10 + CPU seconds to compute hull (after input): 1.542 + After 2 retries, input joggled by: 3.5e-10 +1591314995 Test 10 runs in 44 seconds (ave. 4400 msec) -- rbox 1000000 W0 D3 t1 | qhull QR3 QJ + +Testing -- rbox 100000 W0 D4 t1 | qhull QR3 QJ >/d/bash/var/tmp/qtest-2020-06-04/qhull-587615.log +Test -- t1 + CPU seconds to compute hull (after input): 0.326 + After 3 retries, input joggled by: 5.7e-09 +Test -- t2 + CPU seconds to compute hull (after input): 0.433 + After 3 retries, input joggled by: 5.7e-09 +Test -- t3 + CPU seconds to compute hull (after input): 0.347 + After 2 retries, input joggled by: 5.7e-10 +Test -- t4 + CPU seconds to compute hull (after input): 0.345 + After 2 retries, input joggled by: 5.6e-10 +Test -- t5 + CPU seconds to compute hull (after input): 0.383 + After 2 retries, input joggled by: 5.7e-10 +Test -- t6 + CPU seconds to compute hull (after input): 0.325 + After 2 retries, input joggled by: 5.7e-10 +Test -- t7 + CPU seconds to compute hull (after input): 0.385 + After 2 retries, input joggled by: 5.7e-10 +Test -- t8 + CPU seconds to compute hull (after input): 0.339 + After 2 retries, input joggled by: 5.7e-10 +Test -- t9 + CPU seconds to compute hull (after input): 0.309 + After 2 retries, input joggled by: 5.7e-10 +Test -- t10 + CPU seconds to compute hull (after input): 0.465 + After 3 retries, input joggled by: 5.7e-09 +1591315005 Test 10 runs in 10 seconds (ave. 1000 msec) -- rbox 100000 W0 D4 t1 | qhull QR3 QJ + +Testing -- rbox 10000 W0 D5 t1 | qhull QR3 QJ >/d/bash/var/tmp/qtest-2020-06-04/qhull-922385.log +Test -- t1 + CPU seconds to compute hull (after input): 0.967 + After 4 retries, input joggled by: 8.3e-08 +Test -- t2 + CPU seconds to compute hull (after input): 0.716 + After 3 retries, input joggled by: 8.3e-09 +Test -- t3 + CPU seconds to compute hull (after input): 0.922 + After 4 retries, input joggled by: 8.4e-08 +Test -- t4 + CPU seconds to compute hull (after input): 0.478 + After 2 retries, input joggled by: 7.9e-10 +Test -- t5 + CPU seconds to compute hull (after input): 0.638 + After 3 retries, input joggled by: 8.4e-09 +Test -- t6 + CPU seconds to compute hull (after input): 0.624 + After 3 retries, input joggled by: 8.1e-09 +Test -- t7 + CPU seconds to compute hull (after input): 0.614 + After 3 retries, input joggled by: 8.4e-09 +Test -- t8 + CPU seconds to compute hull (after input): 0.462 + After 2 retries, input joggled by: 8.4e-10 +Test -- t9 + CPU seconds to compute hull (after input): 0.456 + After 3 retries, input joggled by: 8.5e-09 +Test -- t10 + CPU seconds to compute hull (after input): 0.448 + After 2 retries, input joggled by: 8.3e-10 +1591315014 Test 10 runs in 9 seconds (ave. 900 msec) -- rbox 10000 W0 D5 t1 | qhull QR3 QJ + +Testing -- rbox 1000 W0 D6 t1 | qhull QR3 QJ >/d/bash/var/tmp/qtest-2020-06-04/qhull-723678.log +Test -- t1 + CPU seconds to compute hull (after input): 1.123 + After 3 retries, input joggled by: 1e-08 +Test -- t2 + CPU seconds to compute hull (after input): 0.903 + After 2 retries, input joggled by: 1e-09 +Test -- t3 + CPU seconds to compute hull (after input): 0.804 + After 2 retries, input joggled by: 1e-09 +Test -- t4 + CPU seconds to compute hull (after input): 0.721 + After 3 retries, input joggled by: 1e-08 +Test -- t5 + CPU seconds to compute hull (after input): 0.608 + After 2 retries, input joggled by: 1.1e-09 +Test -- t6 + CPU seconds to compute hull (after input): 0.937 + After 3 retries, input joggled by: 9.9e-09 +Test -- t7 + CPU seconds to compute hull (after input): 0.735 + After 2 retries, input joggled by: 9.8e-10 +Test -- t8 + CPU seconds to compute hull (after input): 0.559 + After 2 retries, input joggled by: 9.7e-10 +Test -- t9 + CPU seconds to compute hull (after input): 0.842 + After 2 retries, input joggled by: 1.1e-09 +Test -- t10 + CPU seconds to compute hull (after input): 0.663 + After 2 retries, input joggled by: 9.9e-10 +1591315026 Test 10 runs in 11 seconds (ave. 1100 msec) -- rbox 1000 W0 D6 t1 | qhull QR3 QJ + +============================ +== Time for joggled, nearly cubical points +============================ + +Testing -- rbox 1000000 W1e-13 D2 t1 | qhull QJ >/d/bash/var/tmp/qtest-2020-06-04/qhull-125402.log +Test -- t1 + CPU seconds to compute hull (after input): 0.321 + After 1 retries, input joggled by: 1.3e-11 +Test -- t2 + CPU seconds to compute hull (after input): 0.157 +Test -- t3 + CPU seconds to compute hull (after input): 0.193 +Test -- t4 + CPU seconds to compute hull (after input): 0.165 +Test -- t5 + CPU seconds to compute hull (after input): 0.174 +Test -- t6 + CPU seconds to compute hull (after input): 0.169 +Test -- t7 + CPU seconds to compute hull (after input): 0.357 + After 1 retries, input joggled by: 1.3e-11 +Test -- t8 + CPU seconds to compute hull (after input): 0.184 +Test -- t9 + CPU seconds to compute hull (after input): 0.205 +Test -- t10 + CPU seconds to compute hull (after input): 0.172 +1591315053 Test 10 runs in 26 seconds (ave. 2600 msec) -- rbox 1000000 W1e-13 D2 t1 | qhull QJ + +Testing -- rbox 500000 W1e-13 D3 t1 | qhull QJ >/d/bash/var/tmp/qtest-2020-06-04/qhull-529281.log +Test -- t1 + CPU seconds to compute hull (after input): 1.32 + After 4 retries, input joggled by: 2.1e-08 +Test -- t2 + CPU seconds to compute hull (after input): 1.079 + After 3 retries, input joggled by: 2.1e-09 +Test -- t3 + CPU seconds to compute hull (after input): 1.055 + After 3 retries, input joggled by: 2.1e-09 +Test -- t4 + CPU seconds to compute hull (after input): 1.303 + After 4 retries, input joggled by: 2.1e-08 +Test -- t5 + CPU seconds to compute hull (after input): 1.163 + After 3 retries, input joggled by: 2.1e-09 +Test -- t6 + CPU seconds to compute hull (after input): 1.109 + After 3 retries, input joggled by: 2.1e-09 +Test -- t7 + CPU seconds to compute hull (after input): 1.053 + After 3 retries, input joggled by: 2.1e-09 +Test -- t8 + CPU seconds to compute hull (after input): 0.983 + After 3 retries, input joggled by: 2.1e-09 +Test -- t9 + CPU seconds to compute hull (after input): 1.361 + After 4 retries, input joggled by: 2.1e-08 +Test -- t10 + CPU seconds to compute hull (after input): 0.981 + After 3 retries, input joggled by: 2.1e-09 +1591315083 Test 10 runs in 29 seconds (ave. 2900 msec) -- rbox 500000 W1e-13 D3 t1 | qhull QJ + +Testing -- rbox 100000 W1e-13 D4 t1 | qhull QJ >/d/bash/var/tmp/qtest-2020-06-04/qhull-533591.log +Test -- t1 + CPU seconds to compute hull (after input): 0.653 + After 4 retries, input joggled by: 3e-08 +Test -- t2 + CPU seconds to compute hull (after input): 0.463 + After 3 retries, input joggled by: 3e-09 +Test -- t3 + CPU seconds to compute hull (after input): 0.65 + After 4 retries, input joggled by: 3e-08 +Test -- t4 + CPU seconds to compute hull (after input): 0.47 + After 3 retries, input joggled by: 3e-09 +Test -- t5 + CPU seconds to compute hull (after input): 0.583 + After 4 retries, input joggled by: 3e-08 +Test -- t6 + CPU seconds to compute hull (after input): 0.657 + After 4 retries, input joggled by: 3e-08 +Test -- t7 + CPU seconds to compute hull (after input): 0.453 + After 3 retries, input joggled by: 3e-09 +Test -- t8 + CPU seconds to compute hull (after input): 0.434 + After 3 retries, input joggled by: 3e-09 +Test -- t9 + CPU seconds to compute hull (after input): 0.55 + After 3 retries, input joggled by: 3e-09 +Test -- t10 + CPU seconds to compute hull (after input): 0.668 + After 4 retries, input joggled by: 3e-08 +1591315095 Test 10 runs in 11 seconds (ave. 1100 msec) -- rbox 100000 W1e-13 D4 t1 | qhull QJ + +Testing -- rbox 10000 W1e-13 D5 t1 | qhull QJ >/d/bash/var/tmp/qtest-2020-06-04/qhull-468792.log +Test -- t1 + CPU seconds to compute hull (after input): 0.5 + After 3 retries, input joggled by: 4.1e-09 +Test -- t2 + CPU seconds to compute hull (after input): 0.86 + After 3 retries, input joggled by: 4.1e-09 +Test -- t3 + CPU seconds to compute hull (after input): 0.796 + After 4 retries, input joggled by: 4.1e-08 +Test -- t4 + CPU seconds to compute hull (after input): 0.894 + After 4 retries, input joggled by: 4.1e-08 +Test -- t5 + CPU seconds to compute hull (after input): 0.575 + After 3 retries, input joggled by: 4.1e-09 +Test -- t6 + CPU seconds to compute hull (after input): 0.83 + After 4 retries, input joggled by: 4.1e-08 +Test -- t7 + CPU seconds to compute hull (after input): 0.545 + After 3 retries, input joggled by: 4.1e-09 +Test -- t8 + CPU seconds to compute hull (after input): 0.593 + After 3 retries, input joggled by: 4.1e-09 +Test -- t9 + CPU seconds to compute hull (after input): 0.852 + After 4 retries, input joggled by: 4.1e-08 +Test -- t10 + CPU seconds to compute hull (after input): 0.759 + After 4 retries, input joggled by: 4.1e-08 +1591315106 Test 10 runs in 10 seconds (ave. 1000 msec) -- rbox 10000 W1e-13 D5 t1 | qhull QJ + +Testing -- rbox 1000 W1e-13 D6 t1 | qhull QJ >/d/bash/var/tmp/qtest-2020-06-04/qhull-337039.log +Test -- t1 + CPU seconds to compute hull (after input): 0.658 + After 2 retries, input joggled by: 5.3e-10 +Test -- t2 + CPU seconds to compute hull (after input): 0.741 + After 2 retries, input joggled by: 5.3e-10 +Test -- t3 + CPU seconds to compute hull (after input): 0.782 + After 2 retries, input joggled by: 5.3e-10 +Test -- t4 + CPU seconds to compute hull (after input): 1.135 + After 2 retries, input joggled by: 5.3e-10 +Test -- t5 + CPU seconds to compute hull (after input): 1.04 + After 3 retries, input joggled by: 5.3e-09 +Test -- t6 + CPU seconds to compute hull (after input): 0.693 + After 2 retries, input joggled by: 5.3e-10 +Test -- t7 + CPU seconds to compute hull (after input): 0.981 + After 3 retries, input joggled by: 5.3e-09 +Test -- t8 + CPU seconds to compute hull (after input): 0.884 + After 3 retries, input joggled by: 5.3e-09 +Test -- t9 + CPU seconds to compute hull (after input): 1.183 + After 3 retries, input joggled by: 5.3e-09 +Test -- t10 + CPU seconds to compute hull (after input): 0.862 + After 3 retries, input joggled by: 5.3e-09 +1591315119 Test 10 runs in 12 seconds (ave. 1200 msec) -- rbox 1000 W1e-13 D6 t1 | qhull QJ + +============================ +== Time for merging nearly cubical points +============================ + +Testing -- rbox 1000000 W1e-13 D2 t1 | qhull >/d/bash/var/tmp/qtest-2020-06-04/qhull-272240.log +Test -- t1 + CPU seconds to compute hull (after input): 0.208 +Test -- t2 + CPU seconds to compute hull (after input): 0.197 +Test -- t3 + CPU seconds to compute hull (after input): 0.232 +Test -- t4 + CPU seconds to compute hull (after input): 0.213 +Test -- t5 + CPU seconds to compute hull (after input): 0.179 +Test -- t6 + CPU seconds to compute hull (after input): 0.209 +Test -- t7 + CPU seconds to compute hull (after input): 0.194 +Test -- t8 + CPU seconds to compute hull (after input): 0.214 +Test -- t9 + CPU seconds to compute hull (after input): 0.193 +Test -- t10 + CPU seconds to compute hull (after input): 0.223 +1591315146 Test 10 runs in 26 seconds (ave. 2600 msec) -- rbox 1000000 W1e-13 D2 t1 | qhull + +Testing -- rbox 1000000 W1e-13 D3 t1 | qhull >/d/bash/var/tmp/qtest-2020-06-04/qhull-142642.log +Test -- t1 + CPU seconds to compute hull (after input): 1.418 +Test -- t2 + CPU seconds to compute hull (after input): 1.07 +Test -- t3 + CPU seconds to compute hull (after input): 1.273 +Test -- t4 + CPU seconds to compute hull (after input): 1.124 +Test -- t5 + CPU seconds to compute hull (after input): 1.111 +Test -- t6 + CPU seconds to compute hull (after input): 1.152 +Test -- t7 + CPU seconds to compute hull (after input): 1.083 +Test -- t8 + CPU seconds to compute hull (after input): 1.255 +Test -- t9 + CPU seconds to compute hull (after input): 1.102 +Test -- t10 + CPU seconds to compute hull (after input): 1.237 +1591315193 Test 10 runs in 46 seconds (ave. 4600 msec) -- rbox 1000000 W1e-13 D3 t1 | qhull + +Testing -- rbox 100000 W1e-13 D4 t1 | qhull Q12 >/d/bash/var/tmp/qtest-2020-06-04/qhull-216061.log +Test -- t1 + CPU seconds to compute hull (after input): 0.958 +Test -- t2 + CPU seconds to compute hull (after input): 0.998 +Test -- t3 + CPU seconds to compute hull (after input): 1.68 +Test -- t4 + CPU seconds to compute hull (after input): 1.194 +Test -- t5 + CPU seconds to compute hull (after input): 1.471 + Maximum distance of point above facet: 1.7e-13 (16.9x) + Maximum distance of vertex below facet: -1.4e-13 (13.9x) +Test -- t6 + CPU seconds to compute hull (after input): 1.17 +Test -- t7 + CPU seconds to compute hull (after input): 0.964 +Test -- t8 + CPU seconds to compute hull (after input): 1.509 +Test -- t9 + CPU seconds to compute hull (after input): 2.097 + Maximum distance of vertex below facet: -1.3e-13 (12.6x) +Test -- t10 + CPU seconds to compute hull (after input): 1.882 +1591315213 Test 10 runs in 20 seconds (ave. 2000 msec) -- rbox 100000 W1e-13 D4 t1 | qhull Q12 + +Testing -- rbox 2000 W1e-13 D5 t1 | qhull Q12 >/d/bash/var/tmp/qtest-2020-06-04/qhull-885601.log +Test -- t1 + CPU seconds to compute hull (after input): 0.504 +Test -- t2 + CPU seconds to compute hull (after input): 0.509 +Test -- t3 + CPU seconds to compute hull (after input): 0.513 +Test -- t4 + CPU seconds to compute hull (after input): 0.505 +Test -- t5 + CPU seconds to compute hull (after input): 0.446 +Test -- t6 + CPU seconds to compute hull (after input): 0.517 +Test -- t7 + CPU seconds to compute hull (after input): 0.485 +Test -- t8 +QH6271 qhull topology error (qh_check_dupridge): wide merge (100.6x wider) due to dupridge between f23261 and f23245 (vertex dist 0.16), merge dist 2e-12, while processing p54 + CPU seconds to compute hull (after input): 0.543 +Test -- t9 + CPU seconds to compute hull (after input): 0.55 +Test -- t10 + CPU seconds to compute hull (after input): 0.531 +1591315221 Test 10 runs in 7 seconds (ave. 700 msec) -- rbox 2000 W1e-13 D5 t1 | qhull Q12 + +Testing -- rbox 500 W1e-13 D6 t1 | qhull >/d/bash/var/tmp/qtest-2020-06-04/qhull-153417.log +Test -- t1 + CPU seconds to compute hull (after input): 0.41 +Test -- t2 + CPU seconds to compute hull (after input): 0.455 +Test -- t3 + CPU seconds to compute hull (after input): 0.491 +Test -- t4 + CPU seconds to compute hull (after input): 0.428 +Test -- t5 + CPU seconds to compute hull (after input): 0.394 +Test -- t6 + CPU seconds to compute hull (after input): 0.436 +Test -- t7 + CPU seconds to compute hull (after input): 0.465 +Test -- t8 + CPU seconds to compute hull (after input): 0.464 +Test -- t9 + CPU seconds to compute hull (after input): 0.378 +Test -- t10 + CPU seconds to compute hull (after input): 0.408 +1591315228 Test 10 runs in 6 seconds (ave. 600 msec) -- rbox 500 W1e-13 D6 t1 | qhull + +============================ +== Time for Delaunay triangulation of random points +== qh_findbesthorizon, qh_distplane, qh_update_vertexneighbors_cone, qh_makenew_simplicial +============================ + +Testing -- rbox 100000 D2 t1 | qhull d Qbb Qz >/d/bash/var/tmp/qtest-2020-06-04/qhull-421233.log +Test -- t1 + CPU seconds to compute hull (after input): 0.782 +Test -- t2 + CPU seconds to compute hull (after input): 0.756 +Test -- t3 + CPU seconds to compute hull (after input): 0.778 +Test -- t4 + CPU seconds to compute hull (after input): 0.742 +Test -- t5 + CPU seconds to compute hull (after input): 0.724 +Test -- t6 + CPU seconds to compute hull (after input): 0.807 +Test -- t7 + CPU seconds to compute hull (after input): 0.717 +Test -- t8 + CPU seconds to compute hull (after input): 0.807 +Test -- t9 + CPU seconds to compute hull (after input): 0.745 +Test -- t10 + CPU seconds to compute hull (after input): 0.721 +1591315243 Test 10 runs in 14 seconds (ave. 1400 msec) -- rbox 100000 D2 t1 | qhull d Qbb Qz + +Testing -- rbox 50000 D3 t1 | qhull d Qbb Qz >/d/bash/var/tmp/qtest-2020-06-04/qhull-889911.log +Test -- t1 + CPU seconds to compute hull (after input): 1.703 +Test -- t2 + CPU seconds to compute hull (after input): 1.693 +Test -- t3 + CPU seconds to compute hull (after input): 1.048 +Test -- t4 + CPU seconds to compute hull (after input): 1.599 +Test -- t5 + CPU seconds to compute hull (after input): 1.669 +Test -- t6 + CPU seconds to compute hull (after input): 1.064 +Test -- t7 + CPU seconds to compute hull (after input): 1.661 +Test -- t8 + CPU seconds to compute hull (after input): 1.646 +Test -- t9 + CPU seconds to compute hull (after input): 1.031 +Test -- t10 + CPU seconds to compute hull (after input): 1.027 +1591315265 Test 10 runs in 21 seconds (ave. 2100 msec) -- rbox 50000 D3 t1 | qhull d Qbb Qz + +Testing -- rbox 10000 D4 t1 | qhull d Qbb Qz >/d/bash/var/tmp/qtest-2020-06-04/qhull-626405.log +Test -- t1 + CPU seconds to compute hull (after input): 1.413 +Test -- t2 + CPU seconds to compute hull (after input): 1.377 +Test -- t3 + CPU seconds to compute hull (after input): 1.453 +Test -- t4 + CPU seconds to compute hull (after input): 1.396 +Test -- t5 + CPU seconds to compute hull (after input): 1.384 +Test -- t6 + CPU seconds to compute hull (after input): 1.453 +Test -- t7 + CPU seconds to compute hull (after input): 1.359 +Test -- t8 + CPU seconds to compute hull (after input): 1.515 +Test -- t9 + CPU seconds to compute hull (after input): 1.427 +Test -- t10 + CPU seconds to compute hull (after input): 1.385 +1591315286 Test 10 runs in 20 seconds (ave. 2000 msec) -- rbox 10000 D4 t1 | qhull d Qbb Qz + +Testing -- rbox 1000 D5 t1 | qhull d Qbb Qz >/d/bash/var/tmp/qtest-2020-06-04/qhull-829422.log +Test -- t1 + CPU seconds to compute hull (after input): 0.674 +Test -- t2 + CPU seconds to compute hull (after input): 0.662 +Test -- t3 + CPU seconds to compute hull (after input): 0.683 +Test -- t4 + CPU seconds to compute hull (after input): 0.677 +Test -- t5 + CPU seconds to compute hull (after input): 0.697 +Test -- t6 + CPU seconds to compute hull (after input): 0.638 +Test -- t7 + CPU seconds to compute hull (after input): 0.67 +Test -- t8 + CPU seconds to compute hull (after input): 0.667 +Test -- t9 + CPU seconds to compute hull (after input): 0.658 +Test -- t10 + CPU seconds to compute hull (after input): 0.696 +1591315296 Test 10 runs in 10 seconds (ave. 1000 msec) -- rbox 1000 D5 t1 | qhull d Qbb Qz + +Testing -- rbox 200 D6 t1 | qhull d Qbb Qz >/d/bash/var/tmp/qtest-2020-06-04/qhull-164192.log +Test -- t1 + CPU seconds to compute hull (after input): 0.353 +Test -- t2 + CPU seconds to compute hull (after input): 0.376 +Test -- t3 + CPU seconds to compute hull (after input): 0.384 +Test -- t4 + CPU seconds to compute hull (after input): 0.366 +Test -- t5 + CPU seconds to compute hull (after input): 0.405 +Test -- t6 + CPU seconds to compute hull (after input): 0.374 +Test -- t7 + CPU seconds to compute hull (after input): 0.382 +Test -- t8 + CPU seconds to compute hull (after input): 0.353 +Test -- t9 + CPU seconds to compute hull (after input): 0.388 +Test -- t10 + CPU seconds to compute hull (after input): 0.375 +1591315303 Test 10 runs in 6 seconds (ave. 600 msec) -- rbox 200 D6 t1 | qhull d Qbb Qz + +==================== +== Time for Delaunay triangulation of regular mesh, integer coordinates +==================== + +Testing -- rbox 100000 M3,4 z D2 t1 | qhull QR3 d Qt Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-432008.log +Test -- t1 + CPU seconds to compute hull (after input): 0.81 +Test -- t2 + CPU seconds to compute hull (after input): 0.784 +Test -- t3 + CPU seconds to compute hull (after input): 0.791 +Test -- t4 + CPU seconds to compute hull (after input): 0.812 +Test -- t5 + CPU seconds to compute hull (after input): 0.795 +Test -- t6 + CPU seconds to compute hull (after input): 0.761 +Test -- t7 + CPU seconds to compute hull (after input): 0.789 +Test -- t8 + CPU seconds to compute hull (after input): 0.772 +Test -- t9 + CPU seconds to compute hull (after input): 0.851 +Test -- t10 + CPU seconds to compute hull (after input): 0.794 +1591315322 Test 10 runs in 18 seconds (ave. 1800 msec) -- rbox 100000 M3,4 z D2 t1 | qhull QR3 d Qt Qbb + +Testing -- rbox 20000 M3,4,5 z D3 t1 | qhull QR3 d Qt Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-568071.log +Test -- t1 + CPU seconds to compute hull (after input): 0.908 +Test -- t2 + CPU seconds to compute hull (after input): 0.847 +Test -- t3 + CPU seconds to compute hull (after input): 0.887 +Test -- t4 + CPU seconds to compute hull (after input): 0.869 +Test -- t5 + CPU seconds to compute hull (after input): 0.862 +Test -- t6 + CPU seconds to compute hull (after input): 0.89 +Test -- t7 + CPU seconds to compute hull (after input): 0.889 +Test -- t8 + CPU seconds to compute hull (after input): 0.893 +Test -- t9 + CPU seconds to compute hull (after input): 0.899 +Test -- t10 + CPU seconds to compute hull (after input): 0.91 +1591315337 Test 10 runs in 14 seconds (ave. 1400 msec) -- rbox 20000 M3,4,5 z D3 t1 | qhull QR3 d Qt Qbb + +Testing -- rbox 5000 M3,4,5 z D4 t1 | qhull QR3 d Qt Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-570226.log +Test -- t1 + CPU seconds to compute hull (after input): 0.867 +Test -- t2 + CPU seconds to compute hull (after input): 0.924 +Test -- t3 + CPU seconds to compute hull (after input): 0.867 +Test -- t4 + CPU seconds to compute hull (after input): 0.966 +Test -- t5 + CPU seconds to compute hull (after input): 0.852 +Test -- t6 + CPU seconds to compute hull (after input): 0.85 +Test -- t7 + CPU seconds to compute hull (after input): 0.957 +Test -- t8 + CPU seconds to compute hull (after input): 0.881 +Test -- t9 + CPU seconds to compute hull (after input): 0.89 +Test -- t10 + CPU seconds to compute hull (after input): 0.874 +1591315352 Test 10 runs in 14 seconds (ave. 1400 msec) -- rbox 5000 M3,4,5 z D4 t1 | qhull QR3 d Qt Qbb + +Testing -- rbox 1500 M3,4,5 z D5 t1 | qhull QR3 d Qt Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-38904.log +Test -- t1 + CPU seconds to compute hull (after input): 0.97 +Test -- t2 + CPU seconds to compute hull (after input): 0.985 +Test -- t3 + CPU seconds to compute hull (after input): 0.998 +Test -- t4 + CPU seconds to compute hull (after input): 1.012 +Test -- t5 + CPU seconds to compute hull (after input): 0.998 +Test -- t6 + CPU seconds to compute hull (after input): 0.978 +Test -- t7 + CPU seconds to compute hull (after input): 0.97 +Test -- t8 + CPU seconds to compute hull (after input): 0.988 +Test -- t9 + CPU seconds to compute hull (after input): 0.96 +Test -- t10 + CPU seconds to compute hull (after input): 1.035 +1591315367 Test 10 runs in 14 seconds (ave. 1400 msec) -- rbox 1500 M3,4,5 z D5 t1 | qhull QR3 d Qt Qbb + +Testing -- rbox 500 M3,4,5 z D6 t1 | qhull QR3 d Qt Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-41059.log +Test -- t1 + CPU seconds to compute hull (after input): 0.807 +Test -- t2 + CPU seconds to compute hull (after input): 0.789 +Test -- t3 + CPU seconds to compute hull (after input): 0.877 +Test -- t4 + CPU seconds to compute hull (after input): 0.866 +Test -- t5 + CPU seconds to compute hull (after input): 0.853 +Test -- t6 + CPU seconds to compute hull (after input): 0.779 +Test -- t7 + CPU seconds to compute hull (after input): 0.794 +Test -- t8 + CPU seconds to compute hull (after input): 0.838 +Test -- t9 + CPU seconds to compute hull (after input): 0.792 +Test -- t10 + CPU seconds to compute hull (after input): 0.854 +1591315380 Test 10 runs in 13 seconds (ave. 1300 msec) -- rbox 500 M3,4,5 z D6 t1 | qhull QR3 d Qt Qbb + +==================== +== Time for Voronoi diagram of regular mesh +==================== +Testing -- rbox 100000 M3,4 z D2 | qhull v Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-976260.log +Test -- QR1 + CPU seconds to compute hull (after input): 0.786 +Test -- QR2 + CPU seconds to compute hull (after input): 0.794 +Test -- QR3 + CPU seconds to compute hull (after input): 0.794 +Test -- QR4 + CPU seconds to compute hull (after input): 0.758 +Test -- QR5 + CPU seconds to compute hull (after input): 0.809 +Test -- QR6 + CPU seconds to compute hull (after input): 0.774 +Test -- QR7 + CPU seconds to compute hull (after input): 0.792 +Test -- QR8 + CPU seconds to compute hull (after input): 0.825 +Test -- QR9 + CPU seconds to compute hull (after input): 0.758 +Test -- QR10 + CPU seconds to compute hull (after input): 0.777 +1591315393 Test 10 runs in 12 seconds (average 1200 msec) -- rbox 100000 M3,4 z D2 | qhull v Qbb +Testing -- rbox 20000 M3,4,5 z | qhull v Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-911461.log +Test -- QR1 + CPU seconds to compute hull (after input): 0.861 +Test -- QR2 + CPU seconds to compute hull (after input): 0.86 +Test -- QR3 + CPU seconds to compute hull (after input): 0.973 +Test -- QR4 + CPU seconds to compute hull (after input): 0.854 +Test -- QR5 + CPU seconds to compute hull (after input): 0.888 +Test -- QR6 + CPU seconds to compute hull (after input): 0.917 +Test -- QR7 + CPU seconds to compute hull (after input): 0.922 +Test -- QR8 + CPU seconds to compute hull (after input): 0.883 +Test -- QR9 + CPU seconds to compute hull (after input): 0.882 +Test -- QR10 + CPU seconds to compute hull (after input): 0.893 +1591315405 Test 10 runs in 12 seconds (average 1200 msec) -- rbox 20000 M3,4,5 z | qhull v Qbb +Testing -- rbox 5000 M3,4,5 z D4 | qhull v Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-313185.log +Test -- QR1 + CPU seconds to compute hull (after input): 0.917 +Test -- QR2 + CPU seconds to compute hull (after input): 0.894 +Test -- QR3 + CPU seconds to compute hull (after input): 0.838 +Test -- QR4 + CPU seconds to compute hull (after input): 0.893 +Test -- QR5 + CPU seconds to compute hull (after input): 0.918 +Test -- QR6 + CPU seconds to compute hull (after input): 0.879 +Test -- QR7 + CPU seconds to compute hull (after input): 0.895 +Test -- QR8 + CPU seconds to compute hull (after input): 0.993 +Test -- QR9 + CPU seconds to compute hull (after input): 0.885 +Test -- QR10 + CPU seconds to compute hull (after input): 1.034 +1591315417 Test 10 runs in 11 seconds (average 1100 msec) -- rbox 5000 M3,4,5 z D4 | qhull v Qbb +Testing -- rbox 1500 M3,4,5 z D5 | qhull v Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-714909.log +Test -- QR1 + CPU seconds to compute hull (after input): 1.049 +Test -- QR2 + CPU seconds to compute hull (after input): 0.996 +Test -- QR3 + CPU seconds to compute hull (after input): 0.989 +Test -- QR4 + CPU seconds to compute hull (after input): 0.974 +Test -- QR5 + CPU seconds to compute hull (after input): 0.936 +Test -- QR6 + CPU seconds to compute hull (after input): 0.959 +Test -- QR7 + CPU seconds to compute hull (after input): 0.872 +Test -- QR8 + CPU seconds to compute hull (after input): 0.95 +Test -- QR9 + CPU seconds to compute hull (after input): 0.952 +Test -- QR10 + CPU seconds to compute hull (after input): 1.055 +1591315429 Test 10 runs in 12 seconds (average 1200 msec) -- rbox 1500 M3,4,5 z D5 | qhull v Qbb +Testing -- rbox 500 M3,4,5 z D6 | qhull v Qbb >/d/bash/var/tmp/qtest-2020-06-04/qhull-116633.log +Test -- QR1 + CPU seconds to compute hull (after input): 0.927 +Test -- QR2 + CPU seconds to compute hull (after input): 0.773 +Test -- QR3 + CPU seconds to compute hull (after input): 0.841 +Test -- QR4 + CPU seconds to compute hull (after input): 0.837 +Test -- QR5 + CPU seconds to compute hull (after input): 0.872 +Test -- QR6 + CPU seconds to compute hull (after input): 0.696 +Test -- QR7 + CPU seconds to compute hull (after input): 0.789 +Test -- QR8 + CPU seconds to compute hull (after input): 0.905 +Test -- QR9 + CPU seconds to compute hull (after input): 0.793 +Test -- QR10 + CPU seconds to compute hull (after input): 0.796 +1591315440 Test 10 runs in 10 seconds (average 1000 msec) -- rbox 500 M3,4,5 z D6 | qhull v Qbb diff -Nru qhull-2015.2/eg/q_eg qhull-2020.2/eg/q_eg --- qhull-2015.2/eg/q_eg 2015-11-22 00:50:18.000000000 +0000 +++ qhull-2020.2/eg/q_eg 2019-05-29 14:39:18.000000000 +0000 @@ -1,17 +1,20 @@ #!/bin/sh # writes examples to eg/ # see html/qh_eg.htm -if ! qconvex >/dev/null 2>&1; then +if ! which qconvex >/dev/null 2>&1; then if [ ! -d bin ]; then - echo Run eg/q_eg from the Qhull directory - exit + echo 'eg/q_eg: Run eg/q_eg from the Qhull directory with bin/qconvex, or add qconvex/etc. to $PATH' + exit 1 fi if [ ! -e bin/qconvex -a ! -e bin/qconvex.exe ]; then - echo 'Build qhull first. qconvex is missing from bin/ directory and $PATH' - exit + echo 'eg/q_eg: Build qhull first. qconvex is missing from bin/ directory and $PATH' + exit 1 fi - if ! qconvex >/dev/null 2>&1; then - PATH=$PWD/bin:$PATH + echo 'eg/q_eg: Temporarily add "$PWD/bin" to $PATH for access to qconvex,etc.' + PATH=$PWD/bin:$PATH + if ! which qconvex >/dev/null 2>&1; then + echo 'eg/q_eg: PATH=... failed. Please execute "export PATH=$PWD/bin:$PATH" and repeat' + exit 1 fi fi mkdir -p eg @@ -72,6 +75,7 @@ echo ==the following should generate flipped and concave facets== >/dev/null rbox 200 s | qhull Q0 s R0.014 Gav Po >eg/eg.21a.roundoff.errors echo ==the preceding should report flipped and concave facets== >/dev/null +echo END eg/q_eg >/dev/null diff -Nru qhull-2015.2/eg/q_egtest qhull-2020.2/eg/q_egtest --- qhull-2015.2/eg/q_egtest 2015-11-22 00:50:18.000000000 +0000 +++ qhull-2020.2/eg/q_egtest 2019-05-29 14:39:25.000000000 +0000 @@ -1,16 +1,19 @@ #!/bin/sh # writes examples to eg/ -if ! qconvex >/dev/null 2>&1; then +if ! which qconvex >/dev/null 2>&1; then if [ ! -d bin ]; then - echo Run eg/q_eg from the Qhull directory + echo 'eg/q_egtest: Run eg/q_egtest from the Qhull directory with bin/qconvex, or add qconvex/etc. to $PATH' exit fi if [ ! -e bin/qconvex -a ! -e bin/qconvex.exe ]; then - echo 'Build qhull first. qconvex is missing from bin/ directory and $PATH' + echo 'eg/q_egtest: Build qhull first. qconvex is missing from bin/ directory and $PATH' exit fi - if ! qconvex >/dev/null 2>&1; then - PATH=$PWD/bin:$PATH + echo 'eg/q_egtest: Temporarily add "$PWD/bin" to $PATH for access to qconvex,etc.' + PATH=$PWD/bin:$PATH + if ! which qconvex >/dev/null 2>&1; then + echo 'eg/q_egtest: PATH=... failed. Please execute "export PATH=$PWD/bin:$PATH" and repeat' + exit 1 fi fi mkdir -p eg @@ -48,5 +51,5 @@ echo ==the following generates an error== >/dev/null rbox 1000 D4 | qhull Q0 s Po R0.005 Ga Tc Tv >eg/eg.t25.neighbors.4d echo ==the previous should generate an error== >/dev/null - +echo END eg/q_egtest >/dev/null diff -Nru qhull-2015.2/eg/Qhull-go.bat qhull-2020.2/eg/Qhull-go.bat --- qhull-2015.2/eg/Qhull-go.bat 2015-11-22 00:50:17.000000000 +0000 +++ qhull-2020.2/eg/Qhull-go.bat 2011-11-23 02:43:34.000000000 +0000 @@ -1,18 +1,18 @@ -: Qhull-go.bat invoked as cmd.com from QHULL-GO -@echo off -echo. -echo ========= Qhull with rbox, qconvex, qdelaunay, qvoronoi, qhalf ============ -echo. -echo Use arrow keys to repeat and edit commands. -echo. -echo Double-click window bar for full height, or -echo "right-click > Properties > Layout > Window Size > Height > 50 " -echo. -echo Type 'qconvex' for synopsis and examples. -echo. -echo ========= -echo. - -title Qhull -cd bin -%comspec% +: Qhull-go.bat invoked as cmd.com from QHULL-GO +@echo off +echo. +echo ========= Qhull with rbox, qconvex, qdelaunay, qvoronoi, qhalf ============ +echo. +echo Use arrow keys to repeat and edit commands. +echo. +echo Double-click window bar for full height, or +echo "right-click > Properties > Layout > Window Size > Height > 50 " +echo. +echo Type 'qconvex' for synopsis and examples. +echo. +echo ========= +echo. + +title Qhull +cd bin +%comspec% diff -Nru qhull-2015.2/eg/qhulltest-ok.txt qhull-2020.2/eg/qhulltest-ok.txt --- qhull-2015.2/eg/qhulltest-ok.txt 2016-01-19 02:27:15.000000000 +0000 +++ qhull-2020.2/eg/qhulltest-ok.txt 2020-07-25 02:39:16.000000000 +0000 @@ -1,7 +1,34 @@ +********* Start testing of orgQhull::PointCoordinates_test ********* +Config: Using QtTest library 5.11.2, Qt 5.11.2 (x86_64-little_endian-llp64 shared (dynamic) release build; by MSVC 2017) +PASS : orgQhull::PointCoordinates_test::initTestCase() +PASS : orgQhull::PointCoordinates_test::t_construct_q() +PASS : orgQhull::PointCoordinates_test::t_construct_qh() +PASS : orgQhull::PointCoordinates_test::t_convert() +INFO : Caught QH10063 Qhull error: can not change PointCoordinates dimension (from 3 to 2) +PASS : orgQhull::PointCoordinates_test::t_getset() +PASS : orgQhull::PointCoordinates_test::t_element() +PASS : orgQhull::PointCoordinates_test::t_foreach() +PASS : orgQhull::PointCoordinates_test::t_search() +PASS : orgQhull::PointCoordinates_test::t_modify() +PASS : orgQhull::PointCoordinates_test::t_append_points() +PointCoordinates 0-d +0 +0 +PointCoordinates 1,2 3,1 2,3 +2 +3 +1 2 +3 1 +2 3 +PASS : orgQhull::PointCoordinates_test::t_io() +PASS : orgQhull::PointCoordinates_test::cleanupTestCase() +Totals: 12 passed, 0 failed, 0 skipped, 0 blacklisted, 2ms +********* Finished testing of orgQhull::PointCoordinates_test ********* ********* Start testing of orgQhull::Qhull_test ********* -Config: Using QTest library 4.7.4, Qt 4.7.4 +Config: Using QtTest library 5.11.2, Qt 5.11.2 (x86_64-little_endian-llp64 shared (dynamic) release build; by MSVC 2017) PASS : orgQhull::Qhull_test::initTestCase() INFO : Caught QH10023 Qhull error: checkIfQhullInitialized failed. Call runQhull() first. +area delta 0. qFuzzyCompare delta 3.41421e-12 PASS : orgQhull::Qhull_test::t_construct() Expecting summary of halfspace intersection @@ -14,13 +41,14 @@ Statistics for: normals of square | qhull H Number of points processed: 4 - Number of hyperplanes created: 6 - Number of distance tests for qhull: 4 + Number of hyperplanes created: 5 + Number of distance tests for qhull: 3 CPU seconds to compute hull (after input): 0 Expecting no output from qh_fprintf() in Qhull.cpp +Expecting output from ~Qhull -Qhull output at end +Qhull messages at ~Qhull() Halfspace intersection by the convex hull of 4 points in 2-d: @@ -31,43 +59,41 @@ Statistics for: normals of square | qhull H Number of points processed: 4 - Number of hyperplanes created: 6 - Number of distance tests for qhull: 4 + Number of hyperplanes created: 5 + Number of distance tests for qhull: 3 CPU seconds to compute hull (after input): 0 PASS : orgQhull::Qhull_test::t_attribute() -INFO : Caught QH6029 qhull error: option 'Fd' is not used with this program. +INFO : Caught QH6029 qhull option error: option 'Fd' is not used with this program. It may be used with qhull. While executing: | -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 103966907 +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 225630356 _maxoutside 0 INFO : Error stream without output stream -qhull error: option 'Fd' is not used with this program. +QH6029 qhull option error: option 'Fd' is not used with this program. It may be used with qhull. While executing: | -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 103966907 -INFO : Caught QH6029 -INFO : Error output sent to output stream without error stream -qhull input error: feasible point is not clearly inside halfspace +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 225630356 _maxoutside 0 +INFO : Caught QH6029INFO : Error output sent to output stream without error stream +QH6023 qhull input error: feasible point is not clearly inside halfspace feasible point: 0 0 halfspace: -0.5 -0.5 at offset: 0.5 and distance: 0.5 The halfspace was at index 1 While executing: rbox "c" | qhull Tz H0 -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 103966907 Tz-stdout Halfspace-about 0 -INFO : Caught QH6023 -INFO : No error stream or output stream -INFO : Caught QH6029 qhull error: option 'Fd' is not used with this program. +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 225630356 Tz-stdout Halfspace-about 0 _maxoutside 0 +INFO : Caught QH6023INFO : No error stream or output stream +INFO : Caught QH6029 qhull option error: option 'Fd' is not used with this program. It may be used with qhull. While executing: | -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 103966907 +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 225630356 _maxoutside 0 PASS : orgQhull::Qhull_test::t_message() Convex hull of 8 points in 3-d: @@ -80,9 +106,9 @@ Number of points processed: 8 Number of hyperplanes created: 11 - Number of distance tests for qhull: 35 - Number of distance tests for merging: 84 - Number of distance tests for checking: 56 + Number of distance tests for qhull: 34 + Number of distance tests for merging: 90 + Number of distance tests for checking: 48 Number of merged facets: 6 CPU seconds to compute hull (after input): 0 @@ -97,9 +123,9 @@ Number of points processed: 8 Number of hyperplanes created: 11 - Number of distance tests for qhull: 35 - Number of distance tests for merging: 84 - Number of distance tests for checking: 56 + Number of distance tests for qhull: 34 + Number of distance tests for merging: 90 + Number of distance tests for checking: 48 Number of merged facets: 6 CPU seconds to compute hull (after input): 0 @@ -116,31 +142,48 @@ 0 0.5 0 -0.5 0 0 0.5 0 0 -3 3 1 4 -3 1 3 5 -3 0 3 4 -3 3 0 5 -3 2 1 5 +3 2 0 4 +3 0 2 5 3 1 2 4 +3 2 1 5 +3 3 0 5 +3 0 3 4 +3 1 3 5 +3 3 1 4 +Expecting the same output using std::vector and Qhull classes +3 +6 8 12 + 0 0 -0.5 + 0 0 0.5 + 0 -0.5 0 + 0 0.5 0 + -0.5 0 0 + 0.5 0 0 3 2 0 4 3 0 2 5 +3 1 2 4 +3 2 1 5 +3 3 0 5 +3 0 3 4 +3 1 3 5 +3 3 1 4 Expecting normals of a 3-d diamond. 4 8 --0.5773502691896258 0.5773502691896258 0.5773502691896258 -0.2886751345948129 -0.5773502691896258 0.5773502691896258 0.5773502691896258 -0.2886751345948129 --0.5773502691896258 0.5773502691896258 -0.5773502691896258 -0.2886751345948129 -0.5773502691896258 0.5773502691896258 -0.5773502691896258 -0.2886751345948129 -0.5773502691896258 -0.5773502691896258 0.5773502691896258 -0.2886751345948129 --0.5773502691896258 -0.5773502691896258 0.5773502691896258 -0.2886751345948129 -0.5773502691896258 -0.5773502691896258 -0.5773502691896258 -0.2886751345948129 0.5773502691896258 -0.5773502691896258 -0.5773502691896258 -0.2886751345948129 -PASS : orgQhull::Qhull_test::t_modify() +-0.5773502691896258 -0.5773502691896258 0.5773502691896258 -0.2886751345948129 +0.5773502691896258 -0.5773502691896258 0.5773502691896258 -0.2886751345948129 +0.5773502691896258 0.5773502691896258 -0.5773502691896258 -0.2886751345948129 +-0.5773502691896258 0.5773502691896258 -0.5773502691896258 -0.2886751345948129 +0.5773502691896258 0.5773502691896258 0.5773502691896258 -0.2886751345948129 +-0.5773502691896258 0.5773502691896258 0.5773502691896258 -0.2886751345948129 +PASS : orgQhull::Qhull_test::t_diamond() PASS : orgQhull::Qhull_test::cleanupTestCase() -Totals: 10 passed, 0 failed, 0 skipped +Totals: 10 passed, 0 failed, 0 skipped, 0 blacklisted, 6ms ********* Finished testing of orgQhull::Qhull_test ********* ********* Start testing of orgQhull::Coordinates_test ********* -Config: Using QTest library 4.7.4, Qt 4.7.4 +Config: Using QtTest library 5.11.2, Qt 5.11.2 (x86_64-little_endian-llp64 shared (dynamic) release build; by MSVC 2017) PASS : orgQhull::Coordinates_test::initTestCase() PASS : orgQhull::Coordinates_test::t_construct() PASS : orgQhull::Coordinates_test::t_convert() @@ -149,17 +192,16 @@ PASS : orgQhull::Coordinates_test::t_operator() PASS : orgQhull::Coordinates_test::t_const_iterator() PASS : orgQhull::Coordinates_test::t_iterator() -PASS : orgQhull::Coordinates_test::t_coord_iterator() -PASS : orgQhull::Coordinates_test::t_mutable_coord_iterator() -PASS : orgQhull::Coordinates_test::t_readwrite() +PASS : orgQhull::Coordinates_test::t_foreach() PASS : orgQhull::Coordinates_test::t_search() +PASS : orgQhull::Coordinates_test::t_readwrite() Coordinates 1-2-3 1 2 3 PASS : orgQhull::Coordinates_test::t_io() PASS : orgQhull::Coordinates_test::cleanupTestCase() -Totals: 14 passed, 0 failed, 0 skipped +Totals: 13 passed, 0 failed, 0 skipped, 0 blacklisted, 1ms ********* Finished testing of orgQhull::Coordinates_test ********* ********* Start testing of orgQhull::PointCoordinates_test ********* -Config: Using QTest library 4.7.4, Qt 4.7.4 +Config: Using QtTest library 5.11.2, Qt 5.11.2 (x86_64-little_endian-llp64 shared (dynamic) release build; by MSVC 2017) PASS : orgQhull::PointCoordinates_test::initTestCase() PASS : orgQhull::PointCoordinates_test::t_construct_q() PASS : orgQhull::PointCoordinates_test::t_construct_qh() @@ -171,7 +213,6 @@ PASS : orgQhull::PointCoordinates_test::t_search() PASS : orgQhull::PointCoordinates_test::t_modify() PASS : orgQhull::PointCoordinates_test::t_append_points() -PASS : orgQhull::PointCoordinates_test::t_coord_iterator() PointCoordinates 0-d 0 0 @@ -183,14 +224,14 @@ 2 3 PASS : orgQhull::PointCoordinates_test::t_io() PASS : orgQhull::PointCoordinates_test::cleanupTestCase() -Totals: 13 passed, 0 failed, 0 skipped +Totals: 12 passed, 0 failed, 0 skipped, 0 blacklisted, 1ms ********* Finished testing of orgQhull::PointCoordinates_test ********* ********* Start testing of orgQhull::QhullFacet_test ********* -Config: Using QTest library 4.7.4, Qt 4.7.4 +Config: Using QtTest library 5.11.2, Qt 5.11.2 (x86_64-little_endian-llp64 shared (dynamic) release build; by MSVC 2017) PASS : orgQhull::QhullFacet_test::initTestCase() PASS : orgQhull::QhullFacet_test::t_construct_qh() PASS : orgQhull::QhullFacet_test::t_constructConvert() - rbox c | qhull Qt QR0 QR1453170434 distanceEpsilon 1.12961e-015 + rbox c | qhull Qt QR0 QR1595644756 distanceEpsilon 1.19523e-15 18 19 22 @@ -203,401 +244,450 @@ 35 38 39 -Hyperplane: -0.266222 -0.0132844 0.96382 -0.5 -InnerPlane: -0.266222 -0.0132844 0.96382 -0.5 - innerOffset+0.5 1.05471e-015 -OuterPlane: -0.266222 -0.0132844 0.96382 -0.5 - outerOffset+0.5 -2.22045e-015 -Center: -0.133111 -0.00664222 0.48191 - -Hyperplane: -0.266222 -0.0132844 0.96382 -0.5 -InnerPlane: -0.266222 -0.0132844 0.96382 -0.5 - innerOffset+0.5 1.05471e-015 -OuterPlane: -0.266222 -0.0132844 0.96382 -0.5 - outerOffset+0.5 -2.22045e-015 -Center: -0.133111 -0.00664222 0.48191 - -Hyperplane: 0.706713 0.677289 0.20454 -0.5 -InnerPlane: 0.706713 0.677289 0.20454 -0.5 - innerOffset+0.5 1.11022e-015 -OuterPlane: 0.706713 0.677289 0.20454 -0.5 - outerOffset+0.5 -2.33147e-015 -Center: 0.353356 0.338645 0.10227 - -Hyperplane: 0.706713 0.677289 0.20454 -0.5 -InnerPlane: 0.706713 0.677289 0.20454 -0.5 - innerOffset+0.5 1.11022e-015 -OuterPlane: 0.706713 0.677289 0.20454 -0.5 - outerOffset+0.5 -2.33147e-015 -Center: 0.353356 0.338645 0.10227 - -Hyperplane: 0.655502 -0.735597 0.170921 -0.5 -InnerPlane: 0.655502 -0.735597 0.170921 -0.5 - innerOffset+0.5 1.16573e-015 -OuterPlane: 0.655502 -0.735597 0.170921 -0.5 - outerOffset+0.5 -2.22045e-015 -Center: 0.327751 -0.367798 0.0854606 - -Hyperplane: 0.655502 -0.735597 0.170921 -0.5 -InnerPlane: 0.655502 -0.735597 0.170921 -0.5 - innerOffset+0.5 1.16573e-015 -OuterPlane: 0.655502 -0.735597 0.170921 -0.5 - outerOffset+0.5 -2.22045e-015 -Center: 0.327751 -0.367798 0.0854606 - -Hyperplane: -0.655502 0.735597 -0.170921 -0.5 -InnerPlane: -0.655502 0.735597 -0.170921 -0.5 - innerOffset+0.5 1.05471e-015 -OuterPlane: -0.655502 0.735597 -0.170921 -0.5 - outerOffset+0.5 -2.44249e-015 -Center: -0.327751 0.367798 -0.0854606 - -Hyperplane: -0.655502 0.735597 -0.170921 -0.5 -InnerPlane: -0.655502 0.735597 -0.170921 -0.5 - innerOffset+0.5 1.05471e-015 -OuterPlane: -0.655502 0.735597 -0.170921 -0.5 - outerOffset+0.5 -2.44249e-015 -Center: -0.327751 0.367798 -0.0854606 - -Hyperplane: -0.706713 -0.677289 -0.20454 -0.5 -InnerPlane: -0.706713 -0.677289 -0.20454 -0.5 - innerOffset+0.5 1.22125e-015 -OuterPlane: -0.706713 -0.677289 -0.20454 -0.5 - outerOffset+0.5 -2.22045e-015 -Center: -0.353356 -0.338645 -0.10227 - -Hyperplane: -0.706713 -0.677289 -0.20454 -0.5 -InnerPlane: -0.706713 -0.677289 -0.20454 -0.5 - innerOffset+0.5 1.22125e-015 -OuterPlane: -0.706713 -0.677289 -0.20454 -0.5 - outerOffset+0.5 -2.22045e-015 -Center: -0.353356 -0.338645 -0.10227 - -Hyperplane: 0.266222 0.0132844 -0.96382 -0.5 -InnerPlane: 0.266222 0.0132844 -0.96382 -0.5 - innerOffset+0.5 1.05471e-015 -OuterPlane: 0.266222 0.0132844 -0.96382 -0.5 - outerOffset+0.5 -2.22045e-015 -Center: 0.133111 0.00664222 -0.48191 - -Hyperplane: 0.266222 0.0132844 -0.96382 -0.5 -InnerPlane: 0.266222 0.0132844 -0.96382 -0.5 - innerOffset+0.5 1.05471e-015 -OuterPlane: 0.266222 0.0132844 -0.96382 -0.5 - outerOffset+0.5 -2.22045e-015 -Center: 0.133111 0.00664222 -0.48191 - - rbox c | qhull d Qz Qt QR0 QR1453170434 distanceEpsilon 1.66334e-015 - rbox c | qhull v Qz QR0 QR1453170434 distanceEpsilon 1.66334e-015 -Voronoi vertex: -1.11022e-016 1.66533e-016 1.97758e-016 - Is it within 400 * distanceEpsilon (6.65334e-013) of the origin? +39 +38 +35 +34 +31 +30 +27 +26 +24 +22 +19 +18 +InnerPlane: 0.554312 -0.805806 -0.208361 -0.5 + innerOffset+0.5 1.22125e-15 +Hyperplane: 0.554312 -0.805806 -0.208361 -0.5 + offset+0.5 -1.11022e-16 +OuterPlane: 0.554312 -0.805806 -0.208361 -0.5 + outerOffset+0.5 -2.55351e-15 +Center: 0.277156 -0.402903 -0.104181 + +InnerPlane: 0.554312 -0.805806 -0.208361 -0.5 + innerOffset+0.5 1.22125e-15 +Hyperplane: 0.554312 -0.805806 -0.208361 -0.5 + offset+0.5 -1.11022e-16 +OuterPlane: 0.554312 -0.805806 -0.208361 -0.5 + outerOffset+0.5 -2.55351e-15 +Center: 0.277156 -0.402903 -0.104181 + +InnerPlane: -0.51438 -0.528475 0.675372 -0.5 + innerOffset+0.5 1.38778e-15 +Hyperplane: -0.51438 -0.528475 0.675372 -0.5 + offset+0.5 1.66533e-16 +OuterPlane: -0.51438 -0.528475 0.675372 -0.5 + outerOffset+0.5 -2.22045e-15 +Center: -0.25719 -0.264237 0.337686 + +InnerPlane: -0.51438 -0.528475 0.675372 -0.5 + innerOffset+0.5 1.38778e-15 +Hyperplane: -0.51438 -0.528475 0.675372 -0.5 + offset+0.5 1.66533e-16 +OuterPlane: -0.51438 -0.528475 0.675372 -0.5 + outerOffset+0.5 -2.22045e-15 +Center: -0.25719 -0.264237 0.337686 + +InnerPlane: 0.654333 0.26719 0.70743 -0.5 + innerOffset+0.5 1.11022e-15 +Hyperplane: 0.654333 0.26719 0.70743 -0.5 + offset+0.5 -1.11022e-16 +OuterPlane: 0.654333 0.26719 0.70743 -0.5 + outerOffset+0.5 -2.55351e-15 +Center: 0.327167 0.133595 0.353715 + +InnerPlane: 0.654333 0.26719 0.70743 -0.5 + innerOffset+0.5 1.11022e-15 +Hyperplane: 0.654333 0.26719 0.70743 -0.5 + offset+0.5 -1.11022e-16 +OuterPlane: 0.654333 0.26719 0.70743 -0.5 + outerOffset+0.5 -2.55351e-15 +Center: 0.327167 0.133595 0.353715 + +InnerPlane: -0.654333 -0.26719 -0.70743 -0.5 + innerOffset+0.5 1.16573e-15 +Hyperplane: -0.654333 -0.26719 -0.70743 -0.5 + offset+0.5 -2.22045e-16 +OuterPlane: -0.654333 -0.26719 -0.70743 -0.5 + outerOffset+0.5 -2.66454e-15 +Center: -0.327167 -0.133595 -0.353715 + +InnerPlane: -0.654333 -0.26719 -0.70743 -0.5 + innerOffset+0.5 1.16573e-15 +Hyperplane: -0.654333 -0.26719 -0.70743 -0.5 + offset+0.5 -2.22045e-16 +OuterPlane: -0.654333 -0.26719 -0.70743 -0.5 + outerOffset+0.5 -2.66454e-15 +Center: -0.327167 -0.133595 -0.353715 + +InnerPlane: -0.554312 0.805806 0.208361 -0.5 + innerOffset+0.5 1.16573e-15 +Hyperplane: -0.554312 0.805806 0.208361 -0.5 + offset+0.5 -2.22045e-16 +OuterPlane: -0.554312 0.805806 0.208361 -0.5 + outerOffset+0.5 -2.66454e-15 +Center: -0.277156 0.402903 0.104181 + +InnerPlane: -0.554312 0.805806 0.208361 -0.5 + innerOffset+0.5 1.16573e-15 +Hyperplane: -0.554312 0.805806 0.208361 -0.5 + offset+0.5 -2.22045e-16 +OuterPlane: -0.554312 0.805806 0.208361 -0.5 + outerOffset+0.5 -2.66454e-15 +Center: -0.277156 0.402903 0.104181 + +InnerPlane: 0.51438 0.528475 -0.675372 -0.5 + innerOffset+0.5 1.33227e-15 +Hyperplane: 0.51438 0.528475 -0.675372 -0.5 + offset+0.5 1.11022e-16 +OuterPlane: 0.51438 0.528475 -0.675372 -0.5 + outerOffset+0.5 -2.33147e-15 +Center: 0.25719 0.264237 -0.337686 + +InnerPlane: 0.51438 0.528475 -0.675372 -0.5 + innerOffset+0.5 1.33227e-15 +Hyperplane: 0.51438 0.528475 -0.675372 -0.5 + offset+0.5 1.11022e-16 +OuterPlane: 0.51438 0.528475 -0.675372 -0.5 + outerOffset+0.5 -2.33147e-15 +Center: 0.25719 0.264237 -0.337686 + + rbox c | qhull d Qz Qt QR0 QR1595644756 distanceEpsilon 1.73695e-15 + rbox c | qhull v Qz QR0 QR1595644756 distanceEpsilon 1.73695e-15 +Voronoi vertex: -1.11022e-16 -2.77556e-17 6.93889e-18 + Is it within 400 * distanceEpsilon (6.9478e-13) of the origin? PASS : orgQhull::QhullFacet_test::t_getSet() +Points and facets. Facet vertices in counter-clockwise order (option 'o') +2 +4 4 4 + -0.5 -0.5 + -0.5 0.5 + 0.5 -0.5 + 0.5 0.5 +2 0 2 +2 1 0 +2 2 3 +2 3 1 +Facets and vertices in counter-clockwise order (f.nextFacet2d) +f4 v1 p0 +f5 v2 p2 +f2 v4 p3 +f1 v3 p1 +Extreme points in counter-clockwise order (option 'Fx') +4 +0 +2 +3 +1 +PASS : orgQhull::QhullFacet_test::t_getSet2d() PASS : orgQhull::QhullFacet_test::t_value() PASS : orgQhull::QhullFacet_test::t_foreach() - f1 - - flags: bottom tested seen coplanar + - flags: bottom tested - merges: 1 - normal: -0 -0 -1 - offset: -0.5 - center: 0 0 -0.5 - - vertices: p6(v6) p2(v2) p4(v1) p0(v0) - - neighboring facets: f2 f3 f9 f10 + - vertices: p6(v6) p2(v3) p4(v2) p0(v1) + - neighboring facets: f2 f3 f10 f9 - ridges: - - r4 tested - vertices: p2(v2) p0(v0) + - r4 tested simplicialtop simplicialbot + vertices: p2(v3) p0(v1) between f1 and f3 - - r3 tested - vertices: p4(v1) p0(v0) + - r3 tested simplicialtop simplicialbot + vertices: p4(v2) p0(v1) between f2 and f1 - - r1 tested - vertices: p6(v6) p4(v1) + - r1 tested simplicialtop + vertices: p6(v6) p4(v2) between f9 and f1 - - r2 tested - vertices: p6(v6) p2(v2) + - r2 tested simplicialbot + vertices: p6(v6) p2(v3) between f1 and f10 With a message - f1 - - flags: bottom tested seen coplanar + - flags: bottom tested - merges: 1 - normal: -0 -0 -1 - offset: -0.5 - center: 0 0 -0.5 - - vertices: p6(v6) p2(v2) p4(v1) p0(v0) - - neighboring facets: f2 f3 f9 f10 + - vertices: p6(v6) p2(v3) p4(v2) p0(v1) + - neighboring facets: f2 f3 f10 f9 - ridges: - - r4 tested - vertices: p2(v2) p0(v0) + - r4 tested simplicialtop simplicialbot + vertices: p2(v3) p0(v1) between f1 and f3 - - r3 tested - vertices: p4(v1) p0(v0) + - r3 tested simplicialtop simplicialbot + vertices: p4(v2) p0(v1) between f2 and f1 - - r1 tested - vertices: p6(v6) p4(v1) + - r1 tested simplicialtop + vertices: p6(v6) p4(v2) between f9 and f1 - - r2 tested - vertices: p6(v6) p2(v2) + - r2 tested simplicialbot + vertices: p6(v6) p2(v3) between f1 and f10 Print header for the same facet - f1 - - flags: bottom tested seen coplanar + - flags: bottom tested - merges: 1 - normal: -0 -0 -1 - offset: -0.5 - center: 0 0 -0.5 - - vertices: p6(v6) p2(v2) p4(v1) p0(v0) - - neighboring facets: f2 f3 f9 f10 + - vertices: p6(v6) p2(v3) p4(v2) p0(v1) + - neighboring facets: f2 f3 f10 f9 Print each component - - flags: bottom tested seen coplanar + - flags: bottom tested - center: 0 0 -0.5 - ridges: - - r4 tested - vertices: p2(v2) p0(v0) + - r4 tested simplicialtop simplicialbot + vertices: p2(v3) p0(v1) between f1 and f3 - - r3 tested - vertices: p4(v1) p0(v0) + - r3 tested simplicialtop simplicialbot + vertices: p4(v2) p0(v1) between f2 and f1 - - r1 tested - vertices: p6(v6) p4(v1) + - r1 tested simplicialtop + vertices: p6(v6) p4(v2) between f9 and f1 - - r2 tested - vertices: p6(v6) p2(v2) + - r2 tested simplicialbot + vertices: p6(v6) p2(v3) between f1 and f10 PASS : orgQhull::QhullFacet_test::t_io() PASS : orgQhull::QhullFacet_test::cleanupTestCase() -Totals: 8 passed, 0 failed, 0 skipped +Totals: 9 passed, 0 failed, 0 skipped, 0 blacklisted, 3ms ********* Finished testing of orgQhull::QhullFacet_test ********* ********* Start testing of orgQhull::QhullFacetList_test ********* -Config: Using QTest library 4.7.4, Qt 4.7.4 +Config: Using QtTest library 5.11.2, Qt 5.11.2 (x86_64-little_endian-llp64 shared (dynamic) release build; by MSVC 2017) PASS : orgQhull::QhullFacetList_test::initTestCase() PASS : orgQhull::QhullFacetList_test::t_construct_qh() PASS : orgQhull::QhullFacetList_test::t_construct_q() PASS : orgQhull::QhullFacetList_test::t_convert() PASS : orgQhull::QhullFacetList_test::t_readonly() PASS : orgQhull::QhullFacetList_test::t_foreach() +PASS : orgQhull::QhullFacetList_test::t_java_iterator() Show all of FacetList Vertices for 3 facets -- p5 (v6): -0.107506 0.699801 0.49872 - neighborFacets: f8 f6 f4 -- p0 (v5): -0.158716 -0.713085 0.465101 - neighborFacets: f6 f7 f13 -- p1 (v3): 0.547996 -0.035796 0.669641 - neighborFacets: f4 f6 f7 -- p4 (v0): -0.814218 0.0225116 0.294179 - neighborFacets: f6 f8 f13 -- p2 (v7): 0.107506 -0.699801 -0.49872 - neighborFacets: f11 f13 f7 -- p3 (v1): 0.814218 -0.0225116 -0.294179 - neighborFacets: f4 f7 f11 -- p6 (v8): -0.547996 0.035796 -0.669641 - neighborFacets: f8 f13 f11 -- f6 - - flags: bottom tested seen +- p1 (v6): 0.347133 -0.533546 0.587221 + neighborFacets: f8 f4 f6 +- p2 (v4): 0.207179 -0.272261 -0.795582 + neighborFacets: f4 f3 f11 +- p0 (v3): -0.307201 -0.800736 -0.12021 + neighborFacets: f3 f4 f6 +- p3 (v2): 0.861512 -0.00507083 -0.0881516 + neighborFacets: f8 f4 f11 +- p5 (v5): -0.207179 0.272261 0.795582 + neighborFacets: f8 f6 f14 +- p4 (v1): -0.861512 0.00507083 0.0881516 + neighborFacets: f6 f3 f14 +- p6 (v8): -0.347133 0.533546 -0.587221 + neighborFacets: f3 f14 f11 +- f4 + - flags: top tested - merges: 1 - - normal: -0.266222 -0.0132844 0.96382 + - normal: 0.554312 -0.805806 -0.208361 - offset: -0.5 - - center: -0.133111 -0.00664222 0.48191 - - vertices: p5(v6) p0(v5) p1(v3) p4(v0) - - neighboring facets: f7 f13 f8 f4 + - center: 0.277156 -0.402903 -0.104181 + - vertices: p1(v6) p2(v4) p0(v3) p3(v2) + - neighboring facets: f3 f11 f6 f8 - ridges: - - r1 tested - vertices: p0(v5) p4(v0) - between f6 and f13 - - r6 tested - vertices: p5(v6) p4(v0) - between f8 and f6 + - r4 tested simplicialtop simplicialbot + vertices: p2(v4) p3(v2) + between f11 and f4 + - r8 tested simplicialtop simplicialbot + vertices: p2(v4) p0(v3) + between f4 and f3 - r7 tested - vertices: p5(v6) p1(v3) + vertices: p1(v6) p0(v3) between f6 and f4 - - r8 tested - vertices: p0(v5) p1(v3) - between f7 and f6 -- f7 - - flags: top tested seen coplanar + - r6 tested simplicialbot + vertices: p1(v6) p3(v2) + between f4 and f8 +- f6 + - flags: top tested - merges: 1 - - normal: 0.655502 -0.735597 0.170921 + - normal: -0.51438 -0.528475 0.675372 - offset: -0.5 - - center: 0.327751 -0.367798 0.0854606 - - vertices: p2(v7) p0(v5) p1(v3) p3(v1) - - neighboring facets: f4 f6 f11 f13 + - center: -0.25719 -0.264237 0.337686 + - vertices: p1(v6) p5(v5) p0(v3) p4(v1) + - neighboring facets: f3 f14 f4 f8 - ridges: - - r11 tested - vertices: p1(v3) p3(v1) - between f7 and f4 - - r13 tested - vertices: p2(v7) p3(v1) - between f11 and f7 - - r14 tested - vertices: p2(v7) p0(v5) - between f7 and f13 - - r8 tested - vertices: p0(v5) p1(v3) - between f7 and f6 -- f13 - - flags: bottom tested seen coplanar + - r1 tested simplicialtop simplicialbot + vertices: p5(v5) p4(v1) + between f14 and f6 + - r10 tested simplicialtop + vertices: p1(v6) p5(v5) + between f8 and f6 + - r7 tested + vertices: p1(v6) p0(v3) + between f6 and f4 + - r11 tested simplicialtop simplicialbot + vertices: p0(v3) p4(v1) + between f6 and f3 +- f3 + - flags: bottom tested - merges: 1 - - normal: -0.706713 -0.677289 -0.20454 + - normal: -0.654333 -0.26719 -0.70743 - offset: -0.5 - - center: -0.353356 -0.338645 -0.10227 - - vertices: p6(v8) p2(v7) p0(v5) p4(v0) - - neighboring facets: f6 f8 f7 f11 + - center: -0.327167 -0.133595 -0.353715 + - vertices: p6(v8) p2(v4) p0(v3) p4(v1) + - neighboring facets: f6 f4 f11 f14 - ridges: - - r1 tested - vertices: p0(v5) p4(v0) - between f6 and f13 - - r14 tested - vertices: p2(v7) p0(v5) - between f7 and f13 - - r19 tested - vertices: p6(v8) p2(v7) - between f11 and f13 + - r11 tested simplicialtop simplicialbot + vertices: p0(v3) p4(v1) + between f6 and f3 + - r8 tested simplicialtop simplicialbot + vertices: p2(v4) p0(v3) + between f4 and f3 + - r17 tested + vertices: p6(v8) p2(v4) + between f11 and f3 - r16 tested - vertices: p6(v8) p4(v0) - between f13 and f8 + vertices: p6(v8) p4(v1) + between f3 and f14 Facets only -- f6 - - flags: bottom tested seen +- f4 + - flags: top tested - merges: 1 - - normal: -0.266222 -0.0132844 0.96382 + - normal: 0.554312 -0.805806 -0.208361 - offset: -0.5 - - center: -0.133111 -0.00664222 0.48191 - - vertices: p5(v6) p0(v5) p1(v3) p4(v0) - - neighboring facets: f7 f13 f8 f4 + - center: 0.277156 -0.402903 -0.104181 + - vertices: p1(v6) p2(v4) p0(v3) p3(v2) + - neighboring facets: f3 f11 f6 f8 - ridges: - - r1 tested - vertices: p0(v5) p4(v0) - between f6 and f13 - - r6 tested - vertices: p5(v6) p4(v0) - between f8 and f6 + - r4 tested simplicialtop simplicialbot + vertices: p2(v4) p3(v2) + between f11 and f4 + - r8 tested simplicialtop simplicialbot + vertices: p2(v4) p0(v3) + between f4 and f3 - r7 tested - vertices: p5(v6) p1(v3) + vertices: p1(v6) p0(v3) between f6 and f4 - - r8 tested - vertices: p0(v5) p1(v3) - between f7 and f6 -- f7 - - flags: top tested seen coplanar + - r6 tested simplicialbot + vertices: p1(v6) p3(v2) + between f4 and f8 +- f6 + - flags: top tested - merges: 1 - - normal: 0.655502 -0.735597 0.170921 + - normal: -0.51438 -0.528475 0.675372 - offset: -0.5 - - center: 0.327751 -0.367798 0.0854606 - - vertices: p2(v7) p0(v5) p1(v3) p3(v1) - - neighboring facets: f4 f6 f11 f13 + - center: -0.25719 -0.264237 0.337686 + - vertices: p1(v6) p5(v5) p0(v3) p4(v1) + - neighboring facets: f3 f14 f4 f8 - ridges: - - r11 tested - vertices: p1(v3) p3(v1) - between f7 and f4 - - r13 tested - vertices: p2(v7) p3(v1) - between f11 and f7 - - r14 tested - vertices: p2(v7) p0(v5) - between f7 and f13 - - r8 tested - vertices: p0(v5) p1(v3) - between f7 and f6 -- f13 - - flags: bottom tested seen coplanar + - r1 tested simplicialtop simplicialbot + vertices: p5(v5) p4(v1) + between f14 and f6 + - r10 tested simplicialtop + vertices: p1(v6) p5(v5) + between f8 and f6 + - r7 tested + vertices: p1(v6) p0(v3) + between f6 and f4 + - r11 tested simplicialtop simplicialbot + vertices: p0(v3) p4(v1) + between f6 and f3 +- f3 + - flags: bottom tested - merges: 1 - - normal: -0.706713 -0.677289 -0.20454 + - normal: -0.654333 -0.26719 -0.70743 - offset: -0.5 - - center: -0.353356 -0.338645 -0.10227 - - vertices: p6(v8) p2(v7) p0(v5) p4(v0) - - neighboring facets: f6 f8 f7 f11 + - center: -0.327167 -0.133595 -0.353715 + - vertices: p6(v8) p2(v4) p0(v3) p4(v1) + - neighboring facets: f6 f4 f11 f14 - ridges: - - r1 tested - vertices: p0(v5) p4(v0) - between f6 and f13 - - r14 tested - vertices: p2(v7) p0(v5) - between f7 and f13 - - r19 tested - vertices: p6(v8) p2(v7) - between f11 and f13 + - r11 tested simplicialtop simplicialbot + vertices: p0(v3) p4(v1) + between f6 and f3 + - r8 tested simplicialtop simplicialbot + vertices: p2(v4) p0(v3) + between f4 and f3 + - r17 tested + vertices: p6(v8) p2(v4) + between f11 and f3 - r16 tested - vertices: p6(v8) p4(v0) - between f13 and f8 + vertices: p6(v8) p4(v1) + between f3 and f14 Vertices only -- p5 (v6): -0.107506 0.699801 0.49872 - neighborFacets: f8 f6 f4 -- p0 (v5): -0.158716 -0.713085 0.465101 - neighborFacets: f6 f7 f13 -- p1 (v3): 0.547996 -0.035796 0.669641 - neighborFacets: f4 f6 f7 -- p4 (v0): -0.814218 0.0225116 0.294179 - neighborFacets: f6 f8 f13 -- p2 (v7): 0.107506 -0.699801 -0.49872 - neighborFacets: f11 f13 f7 -- p3 (v1): 0.814218 -0.0225116 -0.294179 - neighborFacets: f4 f7 f11 -- p6 (v8): -0.547996 0.035796 -0.669641 - neighborFacets: f8 f13 f11 +- p1 (v6): 0.347133 -0.533546 0.587221 + neighborFacets: f8 f4 f6 +- p2 (v4): 0.207179 -0.272261 -0.795582 + neighborFacets: f4 f3 f11 +- p0 (v3): -0.307201 -0.800736 -0.12021 + neighborFacets: f3 f4 f6 +- p3 (v2): 0.861512 -0.00507083 -0.0881516 + neighborFacets: f8 f4 f11 +- p5 (v5): -0.207179 0.272261 0.795582 + neighborFacets: f8 f6 f14 +- p4 (v1): -0.861512 0.00507083 0.0881516 + neighborFacets: f6 f3 f14 +- p6 (v8): -0.347133 0.533546 -0.587221 + neighborFacets: f3 f14 f11 PASS : orgQhull::QhullFacetList_test::t_io() PASS : orgQhull::QhullFacetList_test::cleanupTestCase() -Totals: 8 passed, 0 failed, 0 skipped +Totals: 9 passed, 0 failed, 0 skipped, 0 blacklisted, 1ms ********* Finished testing of orgQhull::QhullFacetList_test ********* ********* Start testing of orgQhull::QhullFacetSet_test ********* -Config: Using QTest library 4.7.4, Qt 4.7.4 +Config: Using QtTest library 5.11.2, Qt 5.11.2 (x86_64-little_endian-llp64 shared (dynamic) release build; by MSVC 2017) PASS : orgQhull::QhullFacetSet_test::initTestCase() PASS : orgQhull::QhullFacetSet_test::t_construct() PASS : orgQhull::QhullFacetSet_test::t_convert() PASS : orgQhull::QhullFacetSet_test::t_readonly() PASS : orgQhull::QhullFacetSet_test::t_foreach() -Neighbors of first facet with point 0- f7 - - flags: top tested seen coplanar +PASS : orgQhull::QhullFacetSet_test::t_java_iterator() +Neighbors of first facet with point 0- f3 + - flags: bottom tested - merges: 1 - - normal: 0.655502 -0.735597 0.170921 + - normal: -0.654333 -0.26719 -0.70743 - offset: -0.5 - - center: 0.327751 -0.367798 0.0854606 - - vertices: p2(v7) p0(v5) p1(v3) p3(v1) - - neighboring facets: f4 f6 f11 f13 + - center: -0.327167 -0.133595 -0.353715 + - vertices: p6(v8) p2(v4) p0(v3) p4(v1) + - neighboring facets: f6 f4 f11 f14 - ridges: - - r11 tested - vertices: p1(v3) p3(v1) - between f7 and f4 - - r13 tested - vertices: p2(v7) p3(v1) - between f11 and f7 - - r14 tested - vertices: p2(v7) p0(v5) - between f7 and f13 - - r8 tested - vertices: p0(v5) p1(v3) - between f7 and f6 -- f13 - - flags: bottom tested seen coplanar + - r11 tested simplicialtop simplicialbot + vertices: p0(v3) p4(v1) + between f6 and f3 + - r8 tested simplicialtop simplicialbot + vertices: p2(v4) p0(v3) + between f4 and f3 + - r17 tested + vertices: p6(v8) p2(v4) + between f11 and f3 + - r16 tested + vertices: p6(v8) p4(v1) + between f3 and f14 +- f6 + - flags: top tested - merges: 1 - - normal: -0.706713 -0.677289 -0.20454 + - normal: -0.51438 -0.528475 0.675372 - offset: -0.5 - - center: -0.353356 -0.338645 -0.10227 - - vertices: p6(v8) p2(v7) p0(v5) p4(v0) - - neighboring facets: f6 f8 f7 f11 + - center: -0.25719 -0.264237 0.337686 + - vertices: p1(v6) p5(v5) p0(v3) p4(v1) + - neighboring facets: f3 f14 f4 f8 - ridges: - - r1 tested - vertices: p0(v5) p4(v0) - between f6 and f13 - - r14 tested - vertices: p2(v7) p0(v5) - between f7 and f13 - - r19 tested - vertices: p6(v8) p2(v7) - between f11 and f13 - - r16 tested - vertices: p6(v8) p4(v0) - between f13 and f8 + - r1 tested simplicialtop simplicialbot + vertices: p5(v5) p4(v1) + between f14 and f6 + - r10 tested simplicialtop + vertices: p1(v6) p5(v5) + between f8 and f6 + - r7 tested + vertices: p1(v6) p0(v3) + between f6 and f4 + - r11 tested simplicialtop simplicialbot + vertices: p0(v3) p4(v1) + between f6 and f3 -Facet identifiers: f7 f13 +Facet identifiers: f3 f6 PASS : orgQhull::QhullFacetSet_test::t_io() PASS : orgQhull::QhullFacetSet_test::cleanupTestCase() -Totals: 7 passed, 0 failed, 0 skipped +Totals: 8 passed, 0 failed, 0 skipped, 0 blacklisted, 1ms ********* Finished testing of orgQhull::QhullFacetSet_test ********* ********* Start testing of orgQhull::QhullHyperplane_test ********* -Config: Using QTest library 4.7.4, Qt 4.7.4 +Config: Using QtTest library 5.11.2, Qt 5.11.2 (x86_64-little_endian-llp64 shared (dynamic) release build; by MSVC 2017) PASS : orgQhull::QhullHyperplane_test::initTestCase() PASS : orgQhull::QhullHyperplane_test::t_construct() PASS : orgQhull::QhullHyperplane_test::t_construct_qh() @@ -616,22 +706,24 @@ h39 PASS : orgQhull::QhullHyperplane_test::t_readonly() PASS : orgQhull::QhullHyperplane_test::t_define() -angle 0 +angle -5.55112e-17 PASS : orgQhull::QhullHyperplane_test::t_value() PASS : orgQhull::QhullHyperplane_test::t_operator() PASS : orgQhull::QhullHyperplane_test::t_iterator() PASS : orgQhull::QhullHyperplane_test::t_const_iterator() +PASS : orgQhull::QhullHyperplane_test::t_foreach() PASS : orgQhull::QhullHyperplane_test::t_qhullHyperplane_iterator() +PASS : orgQhull::QhullHyperplane_test::t_java_iterator() Hyperplane: -0 -0 -1 -0.5 message -0 -0 -1 -0.5 and a message -0 -0 -1 offset -0.5 PASS : orgQhull::QhullHyperplane_test::t_io() PASS : orgQhull::QhullHyperplane_test::cleanupTestCase() -Totals: 13 passed, 0 failed, 0 skipped +Totals: 15 passed, 0 failed, 0 skipped, 0 blacklisted, 1ms ********* Finished testing of orgQhull::QhullHyperplane_test ********* ********* Start testing of orgQhull::QhullLinkedList_test ********* -Config: Using QTest library 4.7.4, Qt 4.7.4 +Config: Using QtTest library 5.11.2, Qt 5.11.2 (x86_64-little_endian-llp64 shared (dynamic) release build; by MSVC 2017) PASS : orgQhull::QhullLinkedList_test::initTestCase() PASS : orgQhull::QhullLinkedList_test::t_construct() PASS : orgQhull::QhullLinkedList_test::t_convert() @@ -639,49 +731,53 @@ PASS : orgQhull::QhullLinkedList_test::t_search() PASS : orgQhull::QhullLinkedList_test::t_iterator() PASS : orgQhull::QhullLinkedList_test::t_const_iterator() +PASS : orgQhull::QhullLinkedList_test::t_foreach() PASS : orgQhull::QhullLinkedList_test::t_QhullLinkedList_iterator() +PASS : orgQhull::QhullLinkedList_test::t_java_iterator() INFO: empty QhullVertextList -INFO: - p0 (v2): -0.0879639 0.801034 -0.317186 - neighborFacets: f3 f4 f6 -- p7 (v8): 0.0879639 -0.801034 0.317186 - neighborFacets: f8 f11 f13 -- p6 (v5): -0.315091 -0.0274652 0.806203 - neighborFacets: f6 f8 f13 -- p3 (v1): 0.838612 -0.215926 0.0103054 - neighborFacets: f4 f8 f11 -- p5 (v7): -0.435558 -0.557643 -0.499323 - neighborFacets: f11 f3 f13 -- p2 (v6): 0.435558 0.557643 0.499323 +INFO: - p1 (v6): 0.347133 -0.533546 0.587221 neighborFacets: f8 f4 f6 -- p1 (v3): 0.315091 0.0274652 -0.806203 - neighborFacets: f3 f4 f11 -- p4 (v0): -0.838612 0.215926 -0.0103054 - neighborFacets: f3 f6 f13 +- p6 (v8): -0.347133 0.533546 -0.587221 + neighborFacets: f3 f14 f11 +- p2 (v4): 0.207179 -0.272261 -0.795582 + neighborFacets: f4 f3 f11 +- p4 (v1): -0.861512 0.00507083 0.0881516 + neighborFacets: f6 f3 f14 +- p7 (v7): 0.307201 0.800736 0.12021 + neighborFacets: f11 f14 f8 +- p0 (v3): -0.307201 -0.800736 -0.12021 + neighborFacets: f3 f4 f6 +- p5 (v5): -0.207179 0.272261 0.795582 + neighborFacets: f8 f6 f14 +- p3 (v2): 0.861512 -0.00507083 -0.0881516 + neighborFacets: f8 f4 f11 PASS : orgQhull::QhullLinkedList_test::t_io() PASS : orgQhull::QhullLinkedList_test::cleanupTestCase() -Totals: 10 passed, 0 failed, 0 skipped +Totals: 12 passed, 0 failed, 0 skipped, 0 blacklisted, 3ms ********* Finished testing of orgQhull::QhullLinkedList_test ********* ********* Start testing of orgQhull::QhullPoint_test ********* -Config: Using QTest library 4.7.4, Qt 4.7.4 +Config: Using QtTest library 5.11.2, Qt 5.11.2 (x86_64-little_endian-llp64 shared (dynamic) release build; by MSVC 2017) PASS : orgQhull::QhullPoint_test::initTestCase() PASS : orgQhull::QhullPoint_test::t_construct() PASS : orgQhull::QhullPoint_test::t_convert() Point ids in 'rbox c' -p2 p1 +p2 p3 p0 -p6 -p4 p5 +p4 p7 +p6 PASS : orgQhull::QhullPoint_test::t_readonly() PASS : orgQhull::QhullPoint_test::t_define() PASS : orgQhull::QhullPoint_test::t_operator() PASS : orgQhull::QhullPoint_test::t_iterator() PASS : orgQhull::QhullPoint_test::t_const_iterator() +PASS : orgQhull::QhullPoint_test::t_foreach() PASS : orgQhull::QhullPoint_test::t_qhullpoint_iterator() +PASS : orgQhull::QhullPoint_test::t_java_iterator() PASS : orgQhull::QhullPoint_test::t_method() Point: 0.5 -0.5 -0.5 @@ -690,10 +786,10 @@ Point with id and a message p4: 0.5 -0.5 -0.5 PASS : orgQhull::QhullPoint_test::t_io() PASS : orgQhull::QhullPoint_test::cleanupTestCase() -Totals: 12 passed, 0 failed, 0 skipped +Totals: 14 passed, 0 failed, 0 skipped, 0 blacklisted, 1ms ********* Finished testing of orgQhull::QhullPoint_test ********* ********* Start testing of orgQhull::QhullPoints_test ********* -Config: Using QTest library 4.7.4, Qt 4.7.4 +Config: Using QtTest library 5.11.2, Qt 5.11.2 (x86_64-little_endian-llp64 shared (dynamic) release build; by MSVC 2017) PASS : orgQhull::QhullPoints_test::initTestCase() PASS : orgQhull::QhullPoints_test::t_construct_q() PASS : orgQhull::QhullPoints_test::t_construct_qh() @@ -702,8 +798,10 @@ PASS : orgQhull::QhullPoints_test::t_element() PASS : orgQhull::QhullPoints_test::t_iterator() PASS : orgQhull::QhullPoints_test::t_const_iterator() +PASS : orgQhull::QhullPoints_test::t_foreach() PASS : orgQhull::QhullPoints_test::t_search() PASS : orgQhull::QhullPoints_test::t_points_iterator() +PASS : orgQhull::QhullPoints_test::t_java_iterator() Empty QhullPoints QhullPoints from c[] @@ -711,38 +809,38 @@ 3 4 5 QhullPoints - -0.0879639 0.801034 -0.317186 - 0.315091 0.0274652 -0.806203 - 0.435558 0.557643 0.499323 - 0.838612 -0.215926 0.0103054 - -0.838612 0.215926 -0.0103054 - -0.435558 -0.557643 -0.499323 - -0.315091 -0.0274652 0.806203 - 0.0879639 -0.801034 0.317186 + -0.307201 -0.800736 -0.12021 + 0.347133 -0.533546 0.587221 + 0.207179 -0.272261 -0.795582 + 0.861512 -0.00507083 -0.0881516 + -0.861512 0.00507083 0.0881516 + -0.207179 0.272261 0.795582 + -0.347133 0.533546 -0.587221 + 0.307201 0.800736 0.12021 message - -0.0879639 0.801034 -0.317186 - 0.315091 0.0274652 -0.806203 - 0.435558 0.557643 0.499323 - 0.838612 -0.215926 0.0103054 - -0.838612 0.215926 -0.0103054 - -0.435558 -0.557643 -0.499323 - -0.315091 -0.0274652 0.806203 - 0.0879639 -0.801034 0.317186 + -0.307201 -0.800736 -0.12021 + 0.347133 -0.533546 0.587221 + 0.207179 -0.272261 -0.795582 + 0.861512 -0.00507083 -0.0881516 + -0.861512 0.00507083 0.0881516 + -0.207179 0.272261 0.795582 + -0.347133 0.533546 -0.587221 + 0.307201 0.800736 0.12021 w/ identifiers -p0: -0.0879639 0.801034 -0.317186 -p1: 0.315091 0.0274652 -0.806203 -p2: 0.435558 0.557643 0.499323 -p3: 0.838612 -0.215926 0.0103054 -p4: -0.838612 0.215926 -0.0103054 -p5: -0.435558 -0.557643 -0.499323 -p6: -0.315091 -0.0274652 0.806203 -p7: 0.0879639 -0.801034 0.317186 +p0: -0.307201 -0.800736 -0.12021 +p1: 0.347133 -0.533546 0.587221 +p2: 0.207179 -0.272261 -0.795582 +p3: 0.861512 -0.00507083 -0.0881516 +p4: -0.861512 0.00507083 0.0881516 +p5: -0.207179 0.272261 0.795582 +p6: -0.347133 0.533546 -0.587221 +p7: 0.307201 0.800736 0.12021 PASS : orgQhull::QhullPoints_test::t_io() PASS : orgQhull::QhullPoints_test::cleanupTestCase() -Totals: 12 passed, 0 failed, 0 skipped +Totals: 14 passed, 0 failed, 0 skipped, 0 blacklisted, 1ms ********* Finished testing of orgQhull::QhullPoints_test ********* ********* Start testing of orgQhull::QhullPointSet_test ********* -Config: Using QTest library 4.7.4, Qt 4.7.4 +Config: Using QtTest library 5.11.2, Qt 5.11.2 (x86_64-little_endian-llp64 shared (dynamic) release build; by MSVC 2017) PASS : orgQhull::QhullPointSet_test::initTestCase() PASS : orgQhull::QhullPointSet_test::t_construct() PASS : orgQhull::QhullPointSet_test::t_convert() @@ -750,7 +848,9 @@ PASS : orgQhull::QhullPointSet_test::t_iterator() PASS : orgQhull::QhullPointSet_test::t_const_iterator() PASS : orgQhull::QhullPointSet_test::t_search() +PASS : orgQhull::QhullPointSet_test::t_foreach() PASS : orgQhull::QhullPointSet_test::t_pointset_iterator() +PASS : orgQhull::QhullPointSet_test::t_java_iterator() QhullPointSet from coplanarPoints 0.368247 0.129543 0.5 0.35127 -0.210684 0.5 @@ -830,45 +930,46 @@ 0.404653 0.00452289 0.5 PASS : orgQhull::QhullPointSet_test::t_io() PASS : orgQhull::QhullPointSet_test::cleanupTestCase() -Totals: 10 passed, 0 failed, 0 skipped +Totals: 12 passed, 0 failed, 0 skipped, 0 blacklisted, 5ms ********* Finished testing of orgQhull::QhullPointSet_test ********* ********* Start testing of orgQhull::QhullRidge_test ********* -Config: Using QTest library 4.7.4, Qt 4.7.4 +Config: Using QtTest library 5.11.2, Qt 5.11.2 (x86_64-little_endian-llp64 shared (dynamic) release build; by MSVC 2017) PASS : orgQhull::QhullRidge_test::initTestCase() PASS : orgQhull::QhullRidge_test::t_construct() 4 8 -6 7 +6 PASS : orgQhull::QhullRidge_test::t_getSet() PASS : orgQhull::QhullRidge_test::t_foreach() +PASS : orgQhull::QhullRidge_test::t_java_iterator() Ridges - - r4 tested - vertices: p2(v2) p0(v0) + - r4 tested simplicialtop simplicialbot + vertices: p2(v3) p0(v1) between f1 and f3 - - r3 tested - vertices: p4(v1) p0(v0) + - r3 tested simplicialtop simplicialbot + vertices: p4(v2) p0(v1) between f2 and f1 - - r1 tested - vertices: p6(v6) p4(v1) - between f9 and f1 - - r2 tested - vertices: p6(v6) p2(v2) + - r2 tested simplicialbot + vertices: p6(v6) p2(v3) between f1 and f10 + - r1 tested simplicialtop + vertices: p6(v6) p4(v2) + between f9 and f1 Ridge - - r4 tested - vertices: p2(v2) p0(v0) + - r4 tested simplicialtop simplicialbot + vertices: p2(v3) p0(v1) between f1 and f3 -Ridge with message r4 tested - vertices: p2(v2) p0(v0) +Ridge with message r4 tested simplicialtop simplicialbot + vertices: p2(v3) p0(v1) between f1 and f3 PASS : orgQhull::QhullRidge_test::t_io() PASS : orgQhull::QhullRidge_test::cleanupTestCase() -Totals: 6 passed, 0 failed, 0 skipped +Totals: 7 passed, 0 failed, 0 skipped, 0 blacklisted, 1ms ********* Finished testing of orgQhull::QhullRidge_test ********* ********* Start testing of orgQhull::QhullSet_test ********* -Config: Using QTest library 4.7.4, Qt 4.7.4 +Config: Using QtTest library 5.11.2, Qt 5.11.2 (x86_64-little_endian-llp64 shared (dynamic) release build; by MSVC 2017) PASS : orgQhull::QhullSet_test::initTestCase() PASS : orgQhull::QhullSet_test::t_qhullsetbase() PASS : orgQhull::QhullSet_test::t_convert() @@ -877,159 +978,168 @@ PASS : orgQhull::QhullSet_test::t_iterator() PASS : orgQhull::QhullSet_test::t_const_iterator() PASS : orgQhull::QhullSet_test::t_qhullset_iterator() +PASS : orgQhull::QhullSet_test::t_java_iterator() INFO: empty set INFO: Neighboring facets - f3 - - flags: top tested seen coplanar + - flags: bottom tested - merges: 1 - - normal: -0.523521 0.243391 -0.816509 + - normal: -0.654333 -0.26719 -0.70743 - offset: -0.5 - - center: -0.261761 0.121695 -0.408254 - - vertices: p5(v7) p1(v3) p0(v2) p4(v0) - - neighboring facets: f6 f4 f13 f11 + - center: -0.327167 -0.133595 -0.353715 + - vertices: p6(v8) p2(v4) p0(v3) p4(v1) + - neighboring facets: f6 f4 f11 f14 - ridges: - - r11 tested - vertices: p0(v2) p4(v0) - between f3 and f6 - - r13 tested - vertices: p5(v7) p4(v0) - between f13 and f3 - - r14 tested - vertices: p5(v7) p1(v3) - between f3 and f11 - - r8 tested - vertices: p1(v3) p0(v2) - between f3 and f4 + - r11 tested simplicialtop simplicialbot + vertices: p0(v3) p4(v1) + between f6 and f3 + - r8 tested simplicialtop simplicialbot + vertices: p2(v4) p0(v3) + between f4 and f3 + - r17 tested + vertices: p6(v8) p2(v4) + between f11 and f3 + - r16 tested + vertices: p6(v8) p4(v1) + between f3 and f14 - f11 - - flags: bottom tested seen coplanar + - flags: top tested - merges: 1 - - normal: 0.403054 -0.773569 -0.489018 + - normal: 0.51438 0.528475 -0.675372 - offset: -0.5 - - center: 0.201527 -0.386784 -0.244509 - - vertices: p7(v8) p5(v7) p1(v3) p3(v1) - - neighboring facets: f4 f8 f3 f13 + - center: 0.25719 0.264237 -0.337686 + - vertices: p6(v8) p7(v7) p2(v4) p3(v2) + - neighboring facets: f4 f8 f14 f3 - ridges: - - r4 tested - vertices: p1(v3) p3(v1) - between f4 and f11 - - r14 tested - vertices: p5(v7) p1(v3) - between f3 and f11 + - r4 tested simplicialtop simplicialbot + vertices: p2(v4) p3(v2) + between f11 and f4 + - r13 tested simplicialbot + vertices: p7(v7) p3(v2) + between f8 and f11 - r19 tested - vertices: p7(v8) p5(v7) - between f13 and f11 - - r16 tested - vertices: p7(v8) p3(v1) - between f11 and f8 -- f8 - - flags: bottom tested seen coplanar - - merges: 1 - - normal: 0.523521 -0.243391 0.816509 - - offset: -0.5 - - center: 0.261761 -0.121695 0.408254 - - vertices: p7(v8) p2(v6) p6(v5) p3(v1) - - neighboring facets: f6 f4 f11 f13 - - ridges: - - r10 tested - vertices: p2(v6) p6(v5) - between f6 and f8 - - r6 tested - vertices: p2(v6) p3(v1) - between f8 and f4 - - r16 tested - vertices: p7(v8) p3(v1) - between f11 and f8 + vertices: p6(v8) p7(v7) + between f14 and f11 - r17 tested - vertices: p7(v8) p6(v5) - between f8 and f13 + vertices: p6(v8) p2(v4) + between f11 and f3 - f6 - - flags: bottom tested seen + - flags: top tested - merges: 1 - - normal: -0.403054 0.773569 0.489018 + - normal: -0.51438 -0.528475 0.675372 - offset: -0.5 - - center: -0.201527 0.386784 0.244509 - - vertices: p2(v6) p6(v5) p0(v2) p4(v0) - - neighboring facets: f3 f13 f4 f8 + - center: -0.25719 -0.264237 0.337686 + - vertices: p1(v6) p5(v5) p0(v3) p4(v1) + - neighboring facets: f3 f14 f4 f8 - ridges: - - r1 tested - vertices: p6(v5) p4(v0) - between f6 and f13 - - r11 tested - vertices: p0(v2) p4(v0) - between f3 and f6 + - r1 tested simplicialtop simplicialbot + vertices: p5(v5) p4(v1) + between f14 and f6 + - r10 tested simplicialtop + vertices: p1(v6) p5(v5) + between f8 and f6 - r7 tested - vertices: p2(v6) p0(v2) - between f4 and f6 - - r10 tested - vertices: p2(v6) p6(v5) - between f6 and f8 + vertices: p1(v6) p0(v3) + between f6 and f4 + - r11 tested simplicialtop simplicialbot + vertices: p0(v3) p4(v1) + between f6 and f3 +- f8 + - flags: top tested + - merges: 1 + - normal: 0.654333 0.26719 0.70743 + - offset: -0.5 + - center: 0.327167 0.133595 0.353715 + - vertices: p7(v7) p1(v6) p5(v5) p3(v2) + - neighboring facets: f6 f4 f14 f11 + - ridges: + - r10 tested simplicialtop + vertices: p1(v6) p5(v5) + between f8 and f6 + - r14 tested simplicialtop + vertices: p7(v7) p5(v5) + between f14 and f8 + - r13 tested simplicialbot + vertices: p7(v7) p3(v2) + between f8 and f11 + - r6 tested simplicialbot + vertices: p1(v6) p3(v2) + between f4 and f8 INFO: Ridges for a facet - - r4 tested - vertices: p1(v3) p3(v1) - between f4 and f11 - - r8 tested - vertices: p1(v3) p0(v2) - between f3 and f4 - - r6 tested - vertices: p2(v6) p3(v1) - between f8 and f4 + - r4 tested simplicialtop simplicialbot + vertices: p2(v4) p3(v2) + between f11 and f4 + - r8 tested simplicialtop simplicialbot + vertices: p2(v4) p0(v3) + between f4 and f3 - r7 tested - vertices: p2(v6) p0(v2) - between f4 and f6 + vertices: p1(v6) p0(v3) + between f6 and f4 + - r6 tested simplicialbot + vertices: p1(v6) p3(v2) + between f4 and f8 PASS : orgQhull::QhullSet_test::t_io() PASS : orgQhull::QhullSet_test::cleanupTestCase() -Totals: 10 passed, 0 failed, 0 skipped +Totals: 11 passed, 0 failed, 0 skipped, 0 blacklisted, 1ms ********* Finished testing of orgQhull::QhullSet_test ********* ********* Start testing of orgQhull::QhullVertex_test ********* -Config: Using QTest library 4.7.4, Qt 4.7.4 +Config: Using QtTest library 5.11.2, Qt 5.11.2 (x86_64-little_endian-llp64 shared (dynamic) release build; by MSVC 2017) PASS : orgQhull::QhullVertex_test::initTestCase() PASS : orgQhull::QhullVertex_test::t_constructConvert() 6 -3 -1 +4 2 +3 5 -0 +1 7 8 -Point 2: - 0.435558 0.557643 0.499323 - +8 +7 +1 +5 +3 +2 +4 +6 Point 1: - 0.315091 0.0274652 -0.806203 + 0.347133 -0.533546 0.587221 + +Point 2: + 0.207179 -0.272261 -0.795582 Point 3: - 0.838612 -0.215926 0.0103054 + 0.861512 -0.00507083 -0.0881516 Point 0: - -0.0879639 0.801034 -0.317186 + -0.307201 -0.800736 -0.12021 -Point 6: - -0.315091 -0.0274652 0.806203 +Point 5: + -0.207179 0.272261 0.795582 Point 4: - -0.838612 0.215926 -0.0103054 - -Point 5: - -0.435558 -0.557643 -0.499323 + -0.861512 0.00507083 0.0881516 Point 7: - 0.0879639 -0.801034 0.317186 + 0.307201 0.800736 0.12021 + +Point 6: + -0.347133 0.533546 -0.587221 PASS : orgQhull::QhullVertex_test::t_getSet() PASS : orgQhull::QhullVertex_test::t_foreach() Vertex and vertices: -- p4 (v1): 0.5 -0.5 -0.5 +- p4 (v2): 0.5 -0.5 -0.5 neighborFacets: f1 f2 f9 - p6(v6) p2(v2) p4(v1) p0(v0) + p6(v6) p2(v3) p4(v2) p0(v1) Vertex and vertices with message: -Vertex p4 (v1): 0.5 -0.5 -0.5 +Vertex p4 (v2): 0.5 -0.5 -0.5 neighborFacets: f1 f2 f9 -Vertices: p6(v6) p2(v2) p4(v1) p0(v0) +Vertices: p6(v6) p2(v3) p4(v2) p0(v1) Try again with simplicial facets. No neighboring facets listed for vertices. Vertex and vertices: @@ -1040,32 +1150,33 @@ Try again with Voronoi diagram of simplicial facets. Neighboring facets automatically defined for vertices. Vertex and vertices: -- p7 (v1): 0.386746 0.0449288 0.118336 0.165595 +- p7 (v2): 0.386746 0.0449288 0.118336 0.165595 neighborFacets: f1 f6 f9 f13 f14 f15 f16 f18 f19 f21 PASS : orgQhull::QhullVertex_test::t_io() PASS : orgQhull::QhullVertex_test::cleanupTestCase() -Totals: 6 passed, 0 failed, 0 skipped +Totals: 6 passed, 0 failed, 0 skipped, 0 blacklisted, 1ms ********* Finished testing of orgQhull::QhullVertex_test ********* ********* Start testing of orgQhull::QhullVertexSet_test ********* -Config: Using QTest library 4.7.4, Qt 4.7.4 +Config: Using QtTest library 5.11.2, Qt 5.11.2 (x86_64-little_endian-llp64 shared (dynamic) release build; by MSVC 2017) PASS : orgQhull::QhullVertexSet_test::initTestCase() -INFO : Cube rotated by QR1453170435 +INFO : Cube rotated by QR1595644756 PASS : orgQhull::QhullVertexSet_test::t_construct() -INFO : Cube rotated by QR1453170435 +INFO : Cube rotated by QR1595644756 PASS : orgQhull::QhullVertexSet_test::t_convert() PASS : orgQhull::QhullVertexSet_test::t_readonly() -INFO : Cube rotated by QR1453170435 +INFO : Cube rotated by QR1595644756 PASS : orgQhull::QhullVertexSet_test::t_foreach() -INFO : Cube rotated by QR1453170435 -Vertices of first facet with point 0 p2(v6) p1(v3) p0(v2) p3(v1) +PASS : orgQhull::QhullVertexSet_test::t_java_iterator() +INFO : Cube rotated by QR1595644756 +Vertices of first facet with point 0 p1(v6) p2(v4) p0(v3) p3(v2) -Vertex identifiers: v6 v3 v2 v1 +Vertex identifiers: v6 v4 v3 v2 PASS : orgQhull::QhullVertexSet_test::t_io() PASS : orgQhull::QhullVertexSet_test::cleanupTestCase() -Totals: 7 passed, 0 failed, 0 skipped +Totals: 8 passed, 0 failed, 0 skipped, 0 blacklisted, 1ms ********* Finished testing of orgQhull::QhullVertexSet_test ********* ********* Start testing of orgQhull::RboxPoints_test ********* -Config: Using QTest library 4.7.4, Qt 4.7.4 +Config: Using QtTest library 5.11.2, Qt 5.11.2 (x86_64-little_endian-llp64 shared (dynamic) release build; by MSVC 2017) PASS : orgQhull::RboxPoints_test::initTestCase() PASS : orgQhull::RboxPoints_test::t_construct() INFO : Caught QH6189 rbox error: dimension, D0, out of bounds (>=200 or <=0) @@ -1079,12 +1190,13 @@ PASS : orgQhull::RboxPoints_test::t_change() PASS : orgQhull::RboxPoints_test::t_ostream() PASS : orgQhull::RboxPoints_test::cleanupTestCase() -Totals: 9 passed, 0 failed, 0 skipped +Totals: 9 passed, 0 failed, 0 skipped, 0 blacklisted, 1ms ********* Finished testing of orgQhull::RboxPoints_test ********* ********* Start testing of orgQhull::Qhull_test ********* -Config: Using QTest library 4.7.4, Qt 4.7.4 +Config: Using QtTest library 5.11.2, Qt 5.11.2 (x86_64-little_endian-llp64 shared (dynamic) release build; by MSVC 2017) PASS : orgQhull::Qhull_test::initTestCase() INFO : Caught QH10023 Qhull error: checkIfQhullInitialized failed. Call runQhull() first. +area delta 0. qFuzzyCompare delta 3.41421e-12 PASS : orgQhull::Qhull_test::t_construct() Expecting summary of halfspace intersection @@ -1097,13 +1209,14 @@ Statistics for: normals of square | qhull H Number of points processed: 4 - Number of hyperplanes created: 6 - Number of distance tests for qhull: 4 + Number of hyperplanes created: 5 + Number of distance tests for qhull: 3 CPU seconds to compute hull (after input): 0 Expecting no output from qh_fprintf() in Qhull.cpp +Expecting output from ~Qhull -Qhull output at end +Qhull messages at ~Qhull() Halfspace intersection by the convex hull of 4 points in 2-d: @@ -1114,43 +1227,41 @@ Statistics for: normals of square | qhull H Number of points processed: 4 - Number of hyperplanes created: 6 - Number of distance tests for qhull: 4 + Number of hyperplanes created: 5 + Number of distance tests for qhull: 3 CPU seconds to compute hull (after input): 0 PASS : orgQhull::Qhull_test::t_attribute() -INFO : Caught QH6029 qhull error: option 'Fd' is not used with this program. +INFO : Caught QH6029 qhull option error: option 'Fd' is not used with this program. It may be used with qhull. While executing: | -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 103983714 +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 225630356 _maxoutside 0 INFO : Error stream without output stream -qhull error: option 'Fd' is not used with this program. +QH6029 qhull option error: option 'Fd' is not used with this program. It may be used with qhull. While executing: | -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 103983714 -INFO : Caught QH6029 -INFO : Error output sent to output stream without error stream -qhull input error: feasible point is not clearly inside halfspace +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 225630356 _maxoutside 0 +INFO : Caught QH6029INFO : Error output sent to output stream without error stream +QH6023 qhull input error: feasible point is not clearly inside halfspace feasible point: 0 0 halfspace: -0.5 -0.5 at offset: 0.5 and distance: 0.5 The halfspace was at index 1 While executing: rbox "c" | qhull Tz H0 -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 103983714 Tz-stdout Halfspace-about 0 -INFO : Caught QH6023 -INFO : No error stream or output stream -INFO : Caught QH6029 qhull error: option 'Fd' is not used with this program. +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 225630356 Tz-stdout Halfspace-about 0 _maxoutside 0 +INFO : Caught QH6023INFO : No error stream or output stream +INFO : Caught QH6029 qhull option error: option 'Fd' is not used with this program. It may be used with qhull. While executing: | -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 103983714 +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 225630356 _maxoutside 0 PASS : orgQhull::Qhull_test::t_message() Convex hull of 8 points in 3-d: @@ -1163,9 +1274,9 @@ Number of points processed: 8 Number of hyperplanes created: 11 - Number of distance tests for qhull: 35 - Number of distance tests for merging: 84 - Number of distance tests for checking: 56 + Number of distance tests for qhull: 34 + Number of distance tests for merging: 90 + Number of distance tests for checking: 48 Number of merged facets: 6 CPU seconds to compute hull (after input): 0 @@ -1180,9 +1291,9 @@ Number of points processed: 8 Number of hyperplanes created: 11 - Number of distance tests for qhull: 35 - Number of distance tests for merging: 84 - Number of distance tests for checking: 56 + Number of distance tests for qhull: 34 + Number of distance tests for merging: 90 + Number of distance tests for checking: 48 Number of merged facets: 6 CPU seconds to compute hull (after input): 0 @@ -1199,28 +1310,45 @@ 0 0.5 0 -0.5 0 0 0.5 0 0 -3 3 1 4 -3 1 3 5 -3 0 3 4 -3 3 0 5 -3 2 1 5 +3 2 0 4 +3 0 2 5 3 1 2 4 +3 2 1 5 +3 3 0 5 +3 0 3 4 +3 1 3 5 +3 3 1 4 +Expecting the same output using std::vector and Qhull classes +3 +6 8 12 + 0 0 -0.5 + 0 0 0.5 + 0 -0.5 0 + 0 0.5 0 + -0.5 0 0 + 0.5 0 0 3 2 0 4 3 0 2 5 +3 1 2 4 +3 2 1 5 +3 3 0 5 +3 0 3 4 +3 1 3 5 +3 3 1 4 Expecting normals of a 3-d diamond. 4 8 --0.5773502691896258 0.5773502691896258 0.5773502691896258 -0.2886751345948129 -0.5773502691896258 0.5773502691896258 0.5773502691896258 -0.2886751345948129 --0.5773502691896258 0.5773502691896258 -0.5773502691896258 -0.2886751345948129 -0.5773502691896258 0.5773502691896258 -0.5773502691896258 -0.2886751345948129 -0.5773502691896258 -0.5773502691896258 0.5773502691896258 -0.2886751345948129 --0.5773502691896258 -0.5773502691896258 0.5773502691896258 -0.2886751345948129 -0.5773502691896258 -0.5773502691896258 -0.5773502691896258 -0.2886751345948129 0.5773502691896258 -0.5773502691896258 -0.5773502691896258 -0.2886751345948129 -PASS : orgQhull::Qhull_test::t_modify() +-0.5773502691896258 -0.5773502691896258 0.5773502691896258 -0.2886751345948129 +0.5773502691896258 -0.5773502691896258 0.5773502691896258 -0.2886751345948129 +0.5773502691896258 0.5773502691896258 -0.5773502691896258 -0.2886751345948129 +-0.5773502691896258 0.5773502691896258 -0.5773502691896258 -0.2886751345948129 +0.5773502691896258 0.5773502691896258 0.5773502691896258 -0.2886751345948129 +-0.5773502691896258 0.5773502691896258 0.5773502691896258 -0.2886751345948129 +PASS : orgQhull::Qhull_test::t_diamond() PASS : orgQhull::Qhull_test::cleanupTestCase() -Totals: 10 passed, 0 failed, 0 skipped +Totals: 10 passed, 0 failed, 0 skipped, 0 blacklisted, 4ms ********* Finished testing of orgQhull::Qhull_test ********* -Passed 131 tests. +Passed 155 tests. Finished test of libqhullcpp. Test libqhull_r with eg/q_test after building libqhull_r/Makefile diff -Nru qhull-2015.2/eg/qhull-zip.sh qhull-2020.2/eg/qhull-zip.sh --- qhull-2015.2/eg/qhull-zip.sh 2016-01-19 03:48:37.000000000 +0000 +++ qhull-2020.2/eg/qhull-zip.sh 2020-09-04 01:20:07.000000000 +0000 @@ -2,23 +2,30 @@ # # qhull-zip.sh version -- Make zip and tgz files for Qhull release # +# requires road-script.sh from http://www.qhull.org/road/ +# for check_err_log, log_step, log_note, exit_err, exit_if_fail, etc. +# # wzzip from http://www.winzip.com/wzcline.htm # can not use path with $zip_file # odd error messages if can't locate directory # -# $Id: //main/2015/qhull/eg/qhull-zip.sh#16 $$Change: 2071 $ -# $DateTime: 2016/01/18 23:12:45 $$Author: bbarber $ +# $Id: //main/2019/qhull/eg/qhull-zip.sh#39 $$Change: 3039 $ +# $DateTime: 2020/09/03 21:26:22 $$Author: bbarber $ if [[ $# -ne 3 ]]; then - echo 'Missing date stamp, e.g., qhull-zip.sh 2015 2015.2 7.2.0' + echo 'Missing date stamp -- eg/qhull-zip.sh 2020 2020.2 8.0.2' + echo 'Build Release Win32 binaries -- build/... from Perforce, make cleanall, retarget vcxproj files, restart DevStudio' + echo 'Check libqhull_r and libqhull are the same. See qh_code.htm#convert' exit fi versionyear=$1 version=$2 versionunix=$3 +echo $TMP + err_program=qhull-zip -err_log=/var/tmp/qhull-zip.log +err_log=$TMP/qhull-zip.log [[ -e $HOME/bash/etc/road-script.sh ]] && source $HOME/bash/etc/road-script.sh \ || source /etc/road-script.sh @@ -38,6 +45,7 @@ fi fi root_dir=$(pwd) +echo root_dir= $root_dir TEMP_DIR="$TMP/qhull-zip-$(ro_today2)" TEMP_FILE="$TMP/qhull-zip-$(ro_today2).txt" @@ -48,6 +56,31 @@ exit_if_fail $LINENO "rm -f $qhull_zip_file $qhull_tgz_file $qhullmd5_file" +if [[ -e /bin/msysinfo || -e /bin/msys-z.dll ]]; then + + ############################# + log_step $LINENO "Check for DevStudio 32-bit release build without q_test2" + ############################# + + ls -l qhull/bin/*.exe qhull/bin/*.dll + qhull/bin/rbox 4 D2 | qhull/bin/qhull Tsz | grep "size in bytes" + qhull/bin/rbox 4 D2 | qhull/bin/qhull Tsz | grep "size in bytes" | grep "ridge 20" + exit_if_err $LINENO "Not a 32-bit build (expecting 'ridge 20')" + + if grep eg/q_test2 qhull/Makefile; then + exit_err $LINENO "Change eg/q_test2 to eg/q_test in Makefile.testall" + fi + + log_step $LINENO "Check 'p4 diff se' for modified files" + if (p4 diff -se qhull/... | grep -v vcxp | grep qhull); then + exit_err $LINENO "Submit modified files to Perforce" + fi + + if [[ -d src/qhull_qh ]]; then + exit_err $LINENO "Delete src/qhull_qh/" + fi +fi + ############################# log_step $LINENO "Check files" ############################# @@ -61,8 +94,9 @@ exit_err $LINENO "qh_QHpointer is defined in src/libqhull/user.h" fi -if (od -a Makefile src/libqhull/Makefile src/libqhull_r/Makefile build/*.in html/*.man eg/*.sh eg/q_eg eg/q_egtest eg/q_test | grep cr >/dev/null); then - exit_err $LINENO "A Makefile contains DOS line endings (od -a Makefile | grep cr)" +if (od -a Makefile src/libqhull/Makefile src/libqhull_r/Makefile build/*.pc.in html/*.man eg/*.sh eg/q_eg eg/q_egtest eg/q_test | grep cr >/dev/null); then + for f in Makefile src/*/Makefile build/*.pc.in html/*.man eg/*.sh eg/q_eg eg/q_egtest eg/q_test; do echo $f; od -a $f | grep cr | head -1; done + exit_err $LINENO "A UNIX file contains DOS line endings. Use d2u and binary type" fi NOT_OK=$(grep -h "^ " Makefile src/libqhull/Makefile src/libqhull_r/Makefile | grep -vE '^[ \t]+[$()a-zA-Z_/]+\.[oh]|bin/testqset_r qtest') @@ -130,38 +164,56 @@ local HERE=$(ro_here) log_step $HERE "Compute $md5_file" exit_if_fail $HERE "rm -f $md5_file" - find . -type f | sed 's|^\./||' | sort | xargs md5sum >>$md5_file + find . -type f | sed 's|^\./||' | LC_COLLATE=C sort | xargs md5sum >>$md5_file exit_if_err $HERE "md5sum failed" log_note $HERE "$(md5sum $md5_file)" } +function findf #name [path] +{ + find . -type f -name "*$2*" -not -path "*.git*" | egrep -i "${1:-.}" +} + ############################# log_step $LINENO "Configure $0 for $(pwd)/qhull" ############################# -md5_zip_file=qhull-$version.zip.md5sum -md5_tgz_file=qhull-$versionyear-src-$versionunix.tgz.md5sum +md5_zip_file=qhull-$version-zip.md5sum +md5_tgz_file=qhull-$versionyear-src-$versionunix-tgz.md5sum # recursive -qhull_dirs="qhull/CMakeModules qhull/eg qhull/html qhull/src" +qhull_dirs="qhull/build/CMakeModules qhull/eg qhull/html qhull/src" qhull_files="qhull/build/*.sln qhull/build/*.vcproj qhull/build/qhulltest/*.vcproj \ - qhull/build/*.vcxproj qhull/build/qhulltest/*.vcxproj \ - qhull/Announce.txt qhull/CMakeLists.txt qhull/COPYING.txt \ - qhull/File_id.diz qhull/QHULL-GO.lnk qhull/README.txt \ - qhull/REGISTER.txt qhull/index.htm qhull/Makefile \ + qhull/build/*.vcxproj qhull/build/config.cmake.in qhull/build/qhulltest/*.vcxproj \ + qhull/Announce.txt qhull/CMakeLists.txt qhull/COPYING.txt qhull/File_id.diz \ + qhull/build/qhull.pc.in qhull/build/README-build.txt qhull/QHULL-GO.lnk \ + qhull/README.txt qhull/REGISTER.txt qhull/index.htm qhull/Makefile \ qhull/bin/qconvex.exe qhull/bin/qdelaunay.exe qhull/bin/qhalf.exe \ - qhull/bin/qhull.exe qhull/bin/qhull_r.dll qhull/bin/qvoronoi.exe \ + qhull/bin/qhull.exe qhull/bin/*qhull_r.dll qhull/bin/qvoronoi.exe \ qhull/bin/rbox.exe qhull/bin/user_eg.exe qhull/bin/user_eg2.exe \ qhull/bin/testqset_r.exe \ qhull/bin/user_eg3.exe qhull/bin/testqset.exe qhull/bin/msvcr80.dll" qhull_ufiles="$qhull_dirs qhull/build/*.sln qhull/build/*.vcproj \ + qhull/build/*.vcxproj qhull/build/config.cmake.in \ qhull/Announce.txt qhull/CMakeLists.txt qhull/COPYING.txt \ - qhull/File_id.diz qhull/QHULL-GO.lnk qhull/README.txt \ + qhull/File_id.diz qhull/build/qhull.pc.in qhull/QHULL-GO.lnk qhull/README.txt \ qhull/REGISTER.txt qhull/index.htm qhull/Makefile" qhull_d2ufiles="Makefile src/libqhull/Makefile src/libqhull_r/Makefile \ + qhull/build/config.cmake.in \ src/*/DEPRECATED.txt src/*/*.pro src/*/*.htm html/*.htm html/*.txt \ src/libqhull/MBorland eg/q_eg eg/q_egtest eg/q_test " + +if [[ -e /bin/msysinfo || -e /bin/msys-z.dll ]]; then + + ############################# + log_step $LINENO "Check qhull_files for zip directory" + ############################# + + ls -l $qhull_files $qhull_dirs >>$err_log + exit_if_err $LINENO "Missing files for zip directory. Release build only" +fi + ############################# log_step $LINENO "Clean distribution directories" ############################# @@ -175,10 +227,11 @@ cd .. # Includes many files from 'cleanall' (Makefile) rm -f qhull/src/qhull-all.pro.user* qhull/src/libqhull/BCC32tmp.cfg -rm -f qhull/eg/eg.* -rm -f qhull/bin/qhulltest.exe qhull/bin/qhulltest qhull/bin/qhullp.exe qhull/bin/user_egp.exe -rm -f qhull/src/libqhull/*.exe qhull/src/libqhull/*.a -rm -f qhull/src/libqhull_r/*.exe qhull/src/libqhull_r/*.a +rm -f qhull/eg/eg.* qhull/eg/qhull-benchmark.log qhull/eg/qhull-benchmark-show.log +rm -f qhull/bin/qhulltest.exe qhull/bin/qhulltest qhull/bin/qhullp.exe +rm -f qhull/bin/user_egp.exe qhull/bin/libqhull_*.dll +rm -f qhull/src/libqhull/*.exe qhull/src/libqhull/*.a qhull/src/libqhull/*.dll +rm -f qhull/src/libqhull_r/*.exe qhull/src/libqhull_r/*.a qhull/src/libqhull_r/*.dll rm -f qhull/src/libqhull/qconvex.c qhull/src/libqhull/unix.c rm -f qhull/src/libqhull/qdelaun.c qhull/src/libqhull/qhalf.c rm -f qhull/src/libqhull/qvoronoi.c qhull/src/libqhull/rbox.c @@ -192,10 +245,10 @@ find qhull/ -type f -name x -o -name 'x.*' -o -name '*.x' | xargs -r rm set noglob -if [[ -e /bin/msysinfo && $(type -p wzzip) && $(type -p wzunzip) ]]; then +if [[ (-e /bin/msysinfo || -e /bin/msys-z.dll) && $(type -p wzzip) && $(type -p wzunzip) ]]; then ############################# - log_step $LINENO "Build zip directory, $TEMP_DIR/qhull" + log_step $LINENO "Build zip directory as $TEMP_DIR/qhull" ############################# ls -l $qhull_files $qhull_dirs >>$err_log @@ -227,7 +280,7 @@ fi ############################# -log_step $LINENO "Build tgz directory, $TEMP_DIR/qhull" +log_step $LINENO "Build tgz directory as $TEMP_DIR/qhull" ############################# log_note $LINENO "Archive these files as $qhull_tgz_file" @@ -268,50 +321,131 @@ done ############################# -log_step $LINENO "Extract zip and tgz files to ($TEMP_DIR)" +log_step $LINENO "Extract zip and tgz files to $TEMP_DIR" ############################# exit_if_fail $LINENO "rm -rf $TEMP_DIR" if [[ -r $root_dir/$qhull_zip_file ]]; then exit_if_fail $LINENO "mkdir -p $TEMP_DIR/zip && cd $TEMP_DIR/zip" + log_step $LINENO "Current directory is /c/Git/$TEMP_DIR/zip" exit_if_fail $LINENO "wzunzip -yb -d $root_dir/$qhull_zip_file" - log_step $LINENO "Search for date stamps to zip/Dates.txt" - find . -type f | grep -v '/bin/' | xargs grep '\-20' | grep -v -E '(page=|ISBN|sql-2005|utility-2000|written 2002-2003|tail -n -20|Spinellis|WEBSIDESTORY|D:06-5-2007|server-2005)' >Dates.txt - find . -type f | grep -v '/bin/' | xargs grep -i 'qhull *20' >>Dates.txt - find . -type f | grep -v '/bin/' | xargs grep -E 'SO=|SO |VERSION' >>Dates.txt + log_step $LINENO "Search for date stamps into zip/Dates.txt" + find . -type f | grep -vE '/bin/|q_benchmark|q_test' | xargs grep '\-20' | grep -v -E '(page=|ISBN|sql-2005|utility-2000|written 2002-2003|tail -n -20|Spinellis|WEBSIDESTORY|D:06-5-2007|server-2005)' >Dates.txt + find . -type f | grep -vE '/bin/|q_benchmark|q_test' | xargs grep -i 'qhull *20' >>Dates.txt + find . -type f | grep -vE '/bin/|q_benchmark|q_test' | xargs grep -E 'SO=|SO |VERSION|FIXUP' >>Dates.txt + log_step $LINENO "Search for error codes into zip/Errors-matched.txt" + (find */src -type f) | grep -vE '_test\.cpp|\.log|Changes\.txt' | xargs grep -Eh ', [67][0-9][0-9][0-9]|"QH[67][0-9]|qh_fprintf_stderr\([67][0-9][0-9][0-9]' | sed -r 's/^[^Q67]*QH//' | sed -r 's/^.*qh_fprintf_stderr\(//' | sed -r 's/^[^67]*(errfile|ferr|fp|stderr), //' | sed 's/\\n"[,\)].*/ EOL/' | sed -r 's/_r([: ])/\1/' | sort >Errors.txt + (cat Errors.txt | sed 's/, .*//'; for ((i=6001; i<6400; i++)); do echo $i; done; for ((i=7001; i<7200; i++)); do echo $i; done) | sort | uniq -c | grep -v '^ *3 ' | sed -r 's/^[^0-9]*([0-9]) (.*)/\2 \1 NOT-MATCHED/' >Errors-not-matched.txt + cat Errors.txt | grep -v 'EOL$' | sort -u >Errors-matched.txt + log_step $LINENO "Search for mismatched '*_r.h' references to zip/FileRef.txt" + grep -E '[^_][^_][^ *][.][ch]($|[^a-z>])|/libqhull/' */src/*/*_r.* */src/*/*_ra.* */src/libqhull_r/Makefile | grep -vE 'float.h|/html/| l.h.s. |libqhullcpp|mem.c for a standalone|qglobal.h|QhullError.|QhullSet.|string.h|unused.h|user.h and user_r.h' >FileRef.txt + grep -E '_r[.]|_ra[.]|/libqhull_r/' */src/qconvex/qconvex.c */src/qconvex/qconvex.c */src/qdelaunay/qdelaun.c */src/qhalf/qhalf.c */src/qvoronoi/qvoronoi.c */src/testqset/* | grep -vE 'user.h and user_r.h' >>FileRef.txt + log_step $LINENO "Search for mismatched option links in htm files to Links-single.txt" + findf htm | xargs grep 'qh-opt.*\#' | tee Links-all.txt | sed -r -e 's/^[^:]*://' -e 's/qh-opt/\nqh-opt/g' | grep 'qh-opt.*<' | sed -r -e 's/<.*//' | LC_ALL=C sort | uniq -c >Links-counts.txt + grep ' 1 ' Links-counts.txt >Links-single.txt + log_step $LINENO "Search for other internal links to Links-check-other.txt" + findf htm | xargs grep -E 'http[^#]*htm#|href="?#|name=' | tee Links-other.txt | sed -e 's/#/\n#/g' -e 's/name="/\n#/g' -e 's/name=/\nname=/g' | grep -E '^#|name=' | sed -r -e 's/[" ].*//' | grep -vE ';|#[1-9][0-9]|#3dd|#[Hdv]$|[0-9][0-9]$|[a-z]T$|QJ$|convex|option|startup|voronoi|name=(as_q|num|sitesearch)' | LC_ALL=C sort | uniq -c | grep ' 1 ' >Links-check-other.txt + log_step $LINENO "Search for mismatched link quotes" + findf htm | xargs grep -E '"' | sed -e 's/"[^"]*"//g' | grep '"' | grep -vE 'html/qhull|html/rbox|working/debian' > Links-check-quotes.txt fi if [[ -r $root_dir/$qhull_tgz_file ]]; then exit_if_fail $LINENO "mkdir -p $TEMP_DIR/tgz && cd $TEMP_DIR/tgz" + log_step $LINENO "Current directory is $TEMP_DIR/tgz" exit_if_fail $LINENO "tar -zxf $root_dir/$qhull_tgz_file" fi +log_step $LINENO "Check Changes.txt" +head -60 */src/Changes.txt | tail -17 ############################# log_step $LINENO "=====================================================================" -log_step $LINENO "Check for 18 projects in Release mode, including qhulltest" +log_step $LINENO "Check *qhull-zip-.../zip/Dates.txt and rbox.c for timestamps that need updating" +log_step $LINENO "Check *qhull-zip-.../zip/Errors-matched.txt for mismatched codes, errors not ending in NL, errors on multiple lines, and recently missing codes" +log_step $LINENO " OK (\\n in error message) -- counters 6429,7027,.., 6023, 6233, 6237, 7089" +log_step $LINENO "Check *qhull-zip-.../zip/Errors-not-matched.txt for unused error codes (count==1, without text) or multiply-defined codes (count>2, 7079 OK)" +log_step $LINENO "Check *qhull-zip-.../zip/Links-single.txt for single use option links (matched names OK) in Links-all.txt" +log_step $LINENO "Check *qhull-zip-.../zip/Links-check-other.txt for unknown tags in Links-other.txt" +log_step $LINENO "Check *qhull-zip-.../zip/Links-check-quotes.txt for quotes that cross a line" +log_step $LINENO "Check q_egtest examples in Geomview" +log_step $LINENO "Check for 16 projects in Release mode, including qhulltest" log_step $LINENO "Check build dependencies for programs." -log_step $LINENO "Test unix compile" +log_step $LINENO "Check source dependencies and help prompts once a release" +log_step $LINENO " prompts: see qhull-zip.sh for command" +# N=qvoronoi; ($N . | grep -vE '^$|^Except|^Qhull' | sed 's/ */\n/g'; $N - | grep -vE '^ *#|^Qhull|0 roundoff|comments|options:' | sed 's/^ *//') | grep -vE '^$' | sort >x.1 +log_step $LINENO " check QhullFacet/qh_printfacetheader, QhullRidge/qh_printridge, QhullVertex/qh_printvertex" +log_step $LINENO " check for internal errors while merging with pinched vertices, see qhull-zip.sh for command" +# ../eg/qtest.sh 10 '10000 s C1,2e-13 D3' 'd Q14' | grep -vE 'topology|precision|CPU|Maximum' +log_step $LINENO " check solution for ' = ' (comments OK)" +log_step $LINENO "Test qhull with 32-bit devstudio release, compare and update with q_test-ok.txt" +log_step $LINENO " make testall 2>&1 | tee eg/q_test.x" + +log_step $LINENO "Test CMake build" +log_step $LINENO " cd $TEMP_DIR/tgz/qhull*/build" +log_step $LINENO " cmake -G \"MSYS Makefiles\" .. && cmake .." +log_step $LINENO " make" +log_step $LINENO " mkdir -p ../bin/ && cp -p lib*.dll *.exe ../bin/" +log_step $LINENO " cd ..; make test" +log_step $LINENO "Test Linux compile" log_step $LINENO " cd .. && scp $qhull_tgz_file qhull@qhull.org:" -log_step $LINENO " tar zxf $qhull_tgz_file && cd qhull-$version && make >../make.x 2>&1" +log_step $LINENO " rm -rf qhull-$version; tar zxf $qhull_tgz_file && cd qhull-$version && make >../make.x 2>&1" +log_step $LINENO " more ../make.x" +log_step $LINENO " export DESTDIR=.; make install; cd usr/local/lib" log_step $LINENO " make test" +log_step $LINENO " eg/q_test >eg/q_test.x 2>&1" +log_step $LINENO "Update 'Qhull wiki.md', qhull-news.htm (#problems, #bugs), qh-code.htm#enhance" log_step $LINENO "Test qhull and compare to q_test-ok.txt" -log_step $LINENO " cd $TEMP_DIR/zip/qhull* && make testall >/c/bash/local/qhull/eg/q_test.x 2>&1" -log_step $LINENO "Build and test testqhull. Compare to qhulltest-ok.txt" -log_step $LINENO " cd /c/bash/local/qhull && bin/qhulltest --all >eg/qhulltest.x 2>&1" +log_step $LINENO " cd $TEMP_DIR/zip/qhull* && make testall >/d/bash/local/qhull/eg/q_test.x 2>&1" +log_step $LINENO "Build and test 64-bit qhulltest. Compare to eg/qhulltest-ok.txt" +log_step $LINENO " cd /d/bash/local/qhull && bin/qhulltest --all >eg/qhulltest.x 2>&1" +log_step $LINENO "Compare source directories: Copy 'qhull/' to 'downloads/qhull-YYYY/'" +log_step $LINENO " If comparing 2020 to 2019 -- find qhull-2020 -type f ! -path "./.git*" ! -path "*working*" | xargs sed -i 's/2020/2019/g'" +log_step $LINENO "Benchmark qhull. Compare to eg/q_benchmark-ok.txt" +log_step $LINENO " cd $TEMP_DIR/zip/qhull* && make benchmark >/d/bash/local/qhull/eg/q_benchmark.x 2>&1" log_step $LINENO "Build qhull with gcc" log_step $LINENO " cd $TEMP_DIR/zip/qhull* && make SO=dll" -log_step $LINENO "Test qhull and compare to q_test-ok.txt" -log_step $LINENO " cp -p lib/libqhull*.dll bin && make testall >/c/bash/local/qhull/eg/q_test-make.x 2>&1" -log_step $LINENO "Build and test libqhull" -log_step $LINENO " cd src/libqhull && make && cp *.exe ../../bin && cd ../.. && make test && ls -l bin/qhull.exe" -log_step $LINENO " make testall >/c/bash/local/qhull/eg/q_test-libqhull.x 2>&1" -log_step $LINENO "Build and test libqhull_r" -log_step $LINENO " cd src/libqhull_r && make && cp *.exe ../../bin && cd ../.. && make test && ls -l bin/qhull.exe" -log_step $LINENO " make testall >/c/bash/local/qhull/eg/q_test-libqhull_r.x 2>&1" -log_step $LINENO "Compare previous zip release, Dates.txt, and md5sum. Check for virus." +log_step $LINENO " cp -p lib/libqhull*.dll bin && make testall >/d/bash/local/qhull/eg/q_test-make.x 2>&1" +log_step $LINENO "Create qhull_qh and compare with libqhull, qconvex, etc. See qh_code.htm#convert" +log_step $LINENO " eg/make-qhull_qh.sh libqhull_r" +log_step $LINENO " Ignore 'Id: //.*' and 'DateTime: 20.*' Edit>FullRefresh" +log_step $LINENO " Compare qhull*exports.def and add new functions" +log_step $LINENO "Build and test libqhull. user_eg3 not built" +log_step $LINENO " make cleanall && cd src/libqhull && make cleanall && make && cp *.exe ../../bin && cd ../.. && make test && ls -l bin/qhull.exe" +log_step $LINENO " make testall >/d/bash/local/qhull/eg/q_test-libqhull.x 2>&1" +log_step $LINENO "Build and test libqhull with qh_QHpointer" +log_step $LINENO " e src/libqhull/user.h" +log_step $LINENO " make cleanall && cd src/libqhull && make cleanall && make && cp *.exe ../../bin && cd ../.. && make test && ls -l bin/qhull.exe" +log_step $LINENO " bin/rbox c | bin/qhull FO Tz | grep QHpointer" +log_step $LINENO " make testall 2>&1 | tee eg/q_test-qh_QHpointer.x" +log_step $LINENO "Build and test libqhull_r. user_eg3 not built" +log_step $LINENO " make cleanall && cd src/libqhull_r && make cleanall && make && cp *.exe ../../bin && cd ../.. && make test && ls -l bin/qhull.exe" +log_step $LINENO " make testall >/d/bash/local/qhull/eg/q_test-libqhull_r.x 2>&1" +log_step $LINENO "Build and test libqhull_r with qh_NOmem" +log_step $LINENO "Build and test libqhull_r with qh_NOmerge" +log_step $LINENO "Build and test libqhull_r with qh_NOtrace" +log_step $LINENO "Build and test libqhull_r with qh_KEEPstatistics 0" +log_step $LINENO "Build and check Makefile/qhullx. user_eg* not built" +log_step $LINENO " make cleanall && make qhullx && make test && ls -l bin/qhull.exe" +log_step $LINENO "Benchmark libqhull_r with gcc" +log_step $LINENO " make benchmark >/d/bash/local/qhull/eg/q_benchmark-libqhull_r.x 2>&1" +log_step $LINENO "Check Qhull-go (double-click)" +log_step $LINENO "Compare Changes.txt with previous release" +log_step $LINENO "Compare README.txt with previous release" +log_step $LINENO "Compare previous zip release, Dates.txt, and md5sum" log_step $LINENO "Compare zip and tgz for CRLF vs LF" -log_step $LINENO "Search xml files for UNDEFINED. Check page links" -log_step $LINENO "Extract zip to Qhull/ and compare directories" +log_step $LINENO " C:/Git$TEMP_DIR/" +log_step $LINENO "Compare qh_prompt* for unix_r.c,qconvex.c,etc." +log_step $LINENO "Check html links with Firefox Link Analyzer (fast but doesn't check #..." +log_step $LINENO " Replace old links with web.archive.org (archive.is)" +log_step $LINENO "Check all files for FIXUP comments, including Makefile, html, etc." +log_step $LINENO "Extract zip to download/ and compare directories" +log_step $LINENO "Retest 32-bit release builds and 64-bit qhulltest" +log_step $LINENO "Check for 32-bit release executables from DevStudio (<500K and 'Ts' 32-bit allocations)" +log_step $LINENO "Check for virus with Windows Defender" +log_step $LINENO "Check object dependencies with 'objdump -p user_eg.exe'" log_step $LINENO "Copy tarballs to qhull.org" -log_step $LINENO " scp qhull-2015*x qhull@qhull.org:web/download/" +log_step $LINENO " cd .. && ls -l qhull-2020.2* qhull*8.0.2*" +log_step $LINENO " scp -p qhull-2020.2* qhull*8.0.2* qhull@qhull.org:web/download/" +log_step $LINENO "Add md5sums to end of qh-get.htm" +log_step $LINENO "Add release labels to git" log_step $LINENO "Finished successfully" ############################# + diff -Nru qhull-2015.2/eg/q_test qhull-2020.2/eg/q_test --- qhull-2015.2/eg/q_test 2016-01-07 03:06:53.000000000 +0000 +++ qhull-2020.2/eg/q_test 2020-06-04 19:50:51.000000000 +0000 @@ -1,23 +1,28 @@ #!/bin/sh # # NOTE: all tests duplicated in q_test.bat -if ! qconvex >/dev/null 2>&1; then +if ! which qconvex >/dev/null 2>&1; then if [ ! -d bin ]; then - echo Run eg/q_test from the Qhull directory - exit + echo 'eg/q_test: Run eg/q_test from the Qhull directory with bin/qconvex, or add qconvex/etc. to $PATH' + exit 1 fi if [ ! -e bin/qconvex -a ! -e bin/qconvex.exe ]; then - echo 'Build qhull first. qconvex is missing from bin/ directory and $PATH' - exit + echo 'eg/q_test: Build qhull first. qconvex is missing from bin/ directory and $PATH' + exit 1 fi - if ! qconvex >/dev/null 2>&1; then - PATH=$PWD/bin:$PATH + echo 'eg/q_test: Temporarily add "$PWD/bin" to $PATH for access to qconvex,etc.' + PATH=$PWD/bin:$PATH + if ! which qconvex >/dev/null 2>&1; then + echo 'eg/q_test: PATH=... failed. Please execute "export PATH=$PWD/bin:$PATH" and repeat' + exit 1 fi fi if ! user_eg >/dev/null; then - echo user_eg failed to run. It uses the shared qhull library + echo eg/q_test: user_eg failed to run. It uses the shared qhull library echo 'On Linux, export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH' + echo 'On Windows with mingw, cp -p lib/libqhull_r.dll bin/' fi + echo ============================== echo ========= eg/q_test ========== echo == Check qhull programs ====== @@ -28,38 +33,72 @@ echo "qvoronoi => $(qconvex -V)" echo "qdelaunay => $(qdelaunay -V)" echo "qhalf => $(qhalf -V)" -echo +(ls -ld $(which qhull) \ + $(which qconvex) \ + $(which qvoronoi) \ + $(which qdelaunay) \ + $(which qhalf) \ + $(which user_eg) \ + $(which user_eg2) \ + $(which user_eg3)) 2>/dev/null echo ============================== echo == check user_eg, user_eg2, and user_eg3 echo == errors if 'user_eg' and 'user_eg2' not found echo ============================== +set -v # echo commands to stdout +user_eg +user_eg 'QR1 p n Qt' 'v p' 'Fp' +user_eg2 +user_eg2 'QR1 p' 'v p' 'Fp' +user_eg3 +user_eg3 eg-100 +user_eg3 eg-convex +user_eg3 eg-delaunay +user_eg3 eg-voronoi +user_eg3 eg-fifo +user_eg3 rbox qhull +user_eg3 rbox qhull T1 +user_eg3 rbox qhull d +user_eg3 rbox y c +user_eg3 rbox D2 10 2 "s r 5" qhull 's p' facets +user_eg3 rbox "10 D2" eg-convex +user_eg3 rbox '10 D2' qhull s eg-convex +user_eg3 rbox 10 eg-delaunay qhull 'd o' +user_eg3 rbox D5 c P2 qhull d eg-delaunay +user_eg3 rbox '10 D2' eg-voronoi +user_eg3 rbox "D5 c P2" qhull v eg-voronoi o +user_eg3 rbox '10 D2' eg-fifo +user_eg3 rbox D2 10 qhull v eg-fifo p Fi Fo + +set +v +echo === check front ends and examples ${d:-`date`} ================== set -v -user_eg "QR1 p n Qt" "v p" Fp -user_eg2 "QR1 p" "v p" Fp -user_eg3 rbox "10 D2" "2 D2" qhull "p" -echo === check front ends ${d:-`date`} ================== qconvex - qconvex . -qconvex +qconvex -? # [mar'19] isatty does not work for Git for Windows rbox c D3 | qconvex s n Qt rbox c D2 | qconvex s i +rbox c D2 | qconvex s n rbox c D2 | qconvex o rbox 1000 s | qconvex s Tv FA rbox c d D2 | qconvex s Qc Fx -rbox y 1000 W0 | qconvex s n +rbox y 1000 W0 | qconvex Qc s n rbox y 1000 W0 | qconvex s QJ rbox d G1 D12 | qconvex QR0 FA -rbox c D6 | qconvex FA TF500 +rbox c D6 | qconvex s FA TF500 +rbox c D7 | qconvex s FA TF1000 +rbox d G1 D12 | qconvex QR0 FA Pp rbox c P0 d D2 | qconvex p Fa Fc FP FI Fn FN FS Fv Fx rbox c d D2 | qconvex s i QV0 rbox c | qconvex Q0 qvoronoi - qvoronoi . -qvoronoi +qvoronoi -? # [mar'19] isatty does not work for Git for Windows rbox c P0 D2 | qvoronoi s o rbox c P0 D2 | qvoronoi Fi Tv -rbox c P0 D2 | qvoronoi Fo +rbox c P0 D2 | qvoronoi Fo Tv rbox c P0 D2 | qvoronoi Fv +rbox c P0 D2 | qvoronoi s Qu Fv rbox c P0 D2 | qvoronoi s Qu Qt Fv rbox c P0 D2 | qvoronoi Qu Fo rbox c G1 d D2 | qvoronoi s p @@ -68,7 +107,7 @@ rbox P0 c D2 | qvoronoi s Fv QV0 qdelaunay - qdelaunay . -qdelaunay +qdelaunay -? # [mar'19] isatty does not work for Git for Windows rbox c P0 D2 | qdelaunay s o rbox c P0 D2 | qdelaunay i rbox c P0 D2 | qdelaunay Fv @@ -81,12 +120,32 @@ rbox P0 P0 c D2 | qdelaunay s FP QV0 qhalf - qhalf . -qhalf +qhalf -? # [mar'19] isatty does not work for Git for Windows rbox d | qhull FQ n | qhalf s Qt H0,0,0 Fp rbox c | qhull FQ FV n | qhalf s i rbox c | qhull FQ FV n | qhalf o rbox d D2 | qhull FQ n | qhalf s H0 Fc FP Fn FN FQ Fv Fx +# qhull - printed at end +qhull . +qhull -? # [mar'19] isatty does not work for Git for Windows +rbox 1000 s | qhull Tv s FA +rbox 10 D2 | qhull d QJ s i TO q_test.log.1 +cat q_test.log.1 +rbox 10 D2 | qhull v Qbb Qt p +rbox 10 D2 | qhull d Qu QJ m +rbox 10 D2 | qhull v Qu QJ o +rbox c d D2 | qhull Qc s f Fx +rbox c | qhull FV n | qhull H Fp +rbox d D12 | qhull QR0 FA +rbox c D7 | qhull FA TF1000 +rbox y 1000 W0 | qhull Qc +rbox c | qhull n +rbox c | qhull TA1 +rbox 10 s | qhull C1e-5 T1P-1f + +set +v echo === check quality of Qhull for ${d:-`hostname`} ${d:-`date`} +set -v rbox 1000 W0 | qhull QR2 QJ s Fs Tv rbox 1000 W0 | qhull QR2 s Fs Tv rbox 1000 s | qhull C0.02 Qc Tv @@ -98,23 +157,34 @@ rbox 1000 W1e-4 | qhull C-1e-6 Qc Tv rbox 1000 W5e-4 D4 | qhull C-1e-5 Qc Tv rbox 400 W1e-3 D5 | qhull C-1e-5 Qx Qc Tv + +set +v echo === check input format etc. ${d:-`date`} +set -v qhull <r.x +qhull TIr.x +qhull p TI r.x TO x.x +cat x.x + +set +v echo === check qhull output formats ${d:-`date`} +set -v rbox 5 r s D2 | qhull Tcv rbox 5 r s D2 | qhull s rbox 5 r s D2 | qhull s o @@ -217,7 +306,7 @@ rbox 10 D3 | qhull o rbox 10 D3 | qhull Fx rbox 27 M1,0,1 | qhull Qc -rbox 50 D3 s | qhull C0.1 Qc Pd0d1d2 s p Tcv +rbox 50 D3 s | qhull C0.1 Qc Pd0d1d2 Pg s p Tcv rbox 10 D2 P0 P1e-15 | qhull d Qc FP s Tcv rbox 100 s | qhull C-0.003 Qc FP s rbox 100 s D2 | qhull C0.1 i Fx Tcv @@ -243,7 +332,9 @@ rbox 10 D3 | qhull Fa PA5 rbox 10 D3 | qhull Fa PF0.4 +set +v echo === test Qt ${d:-`date`} +set -v rbox c | qhull Qt s o Tcv rbox c | qhull Qt f i rbox c | qhull Qt m FM n @@ -255,9 +346,11 @@ rbox 6 r s c G0.1 D2 | qhull Qt v p Tcv rbox c | qhull Qt C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv rbox 6 r s c G0.1 D2 P0.1,0.1 | qhull s FP d FO Qt -rbox 100 W0 | qhull Tv Q11 +rbox 100 W0 | qhull Tv Q11 FO +set +v echo === test unbounded intersection ${d:-`date`} +set -v rbox c | qhull PD0:0.5 n | qhull H0 Fp Tcv rbox 1000 W1e-3 D3 | qhull PA8 Fa FS s n Tcv rbox 1000 W1e-3 D3 | qhull C-0.01 PM10 Fm n Tcv Qc @@ -265,13 +358,15 @@ rbox 10 | qhull FO Tz TO q_test.log.1 cat q_test.log.1 +set +v echo === check Delaunay/Voronoi ${d:-`date`} +set -v rbox 10 D2 | qhull d Tcv -rbox 10 D2 | qhull d Tcv Qz +rbox 10 D2 | qhull d Qz Tcv rbox 10 D3 | qhull d Tcv rbox c | qhull d Qz Ft Tcv rbox 10 s D2 c | qhull d Tcv -rbox 10 s D2 | qhull d Tcv Q8 Qz +rbox 10 s D2 | qhull d Tcv Qz Q8 rbox 10 D2 | qhull d Tcv p rbox 10 D2 | qhull d Tcv i rbox 10 D2 | qhull d Tcv o @@ -288,21 +383,34 @@ rbox 10 D3 | qhull v Qu o Fv Fi Fo Tcv rbox 5 D2 | qhull v f FnN o -echo === check Halfspace ${d:-`date`} -rbox 100 s D4 | qhull FA FV n s Tcv | qhull H Fp Tcv | qhull FA Tcv -rbox d D3 | qhull FQ n s FD Tcv | qhull Fd H0.1,0.1 Fp FQ Tcv -rbox 5 r D2 | qhull s n Tcv | qhull H0 Fp Tcv +set +v +echo === check Halfspace and Qhull identity pipeline, showing the input ${d:-`date`} +echo === the Qhull pipeline recreates 100 4-D cospherical points with the same area and volume +set -v +rbox 100 s D4 | qhull FA FV s n | head +rbox 100 s D4 | qhull FQ FA FV n s | qhull s H Fp | head +rbox 100 s D4 | qhull FQ FA FV n s Tcv | qhull FQ s H Fp Tcv | qhull FA Tcv +echo === the Qhull pipeline recreates a 3-D tetrahedron +rbox d D3 | qhull n FD +rbox d D3 | qhull s n FD Tcv | qhull s Fd H0.1,0.1 Fp Tcv +echo === the Qhull pipeline recreates a regular 2-D pentagon +rbox 5 r D2 | qhull FQ n +rbox 5 r D2 | qhull s FQ n Tcv | qhull s H0 Fp Tcv +set +v echo === check qhull ${d:-`date`} +set -v rbox 10 s D3 | qhull Tcv -rbox 10 s D3 | qhull f Pd0:0.5 Pd2 Tcv -rbox 10 s D3 | qhull f Tcv PD2:-0.5 +rbox 10 s D3 | qhull f Pd0:0.5 Pd2 Pg Tcv +rbox 10 s D3 | qhull f Tcv PD2:-0.5 Pg rbox 10 s D3 | qhull QR-1 rbox 10 s D3 | qhull QR-40 rbox 1000 D3 | qhull Tcvs -rbox 100 D3 | qhull T8 Tz TO q_test.log.1 +# Test tracing 'Tn', combine stderr/stdout 'Tz', flush fprintf 'Tf' +rbox 100 D3 | qhull T1 Tz Tf TA1 TO q_test.log.1 tail -n -10 q_test.log.1 rm q_test.log.1 +rbox 100 s D3 | qhull TcvA10 rbox 100 s D3 | qhull TcvV-2 rbox 100 s D3 | qhull TcvC2 rbox 100 s D3 | qhull TcvV2 @@ -314,7 +422,7 @@ rbox 100 D5 | qhull Qs Tcv rbox 100 D3 | qhull Qr Tcv rbox 100 D3 | qhull Qxv Tcv -rbox 100 D3 | qhull Qi f Pd0 Pd1 Pd2 Tcv +rbox 100 D3 | qhull Qi f Pd0 Pd1 Pd2 Pg Tcv rbox c d | qhull Qc f Tcv rbox c d | qhull Qc p Tcv rbox 100 D3 | qhull QbB FO Tcv @@ -336,7 +444,9 @@ rbox 1000 W1e-3 s D2 t | qhull d FO Tcv Qu Q0 rbox 1000 W1e-3 s D2 t | qhull d FO Tcv Qu C-0 +set +v echo === check joggle and TRn ${d:-`date`} +set -v rbox 100 W0 | qhull QJ1e-14 Qc TR100 Tv rbox 100 W0 | qhull QJ1e-13 Qc TR100 Tv rbox 100 W0 | qhull QJ1e-12 Qc TR100 Tv @@ -344,7 +454,9 @@ rbox 100 W0 | qhull QJ1e-10 Qc TR100 Tv rbox 100 | qhull d QJ Qb0:1e4 QB0:1e5 Qb1:1e4 QB1:1e6 Qb2:1e5 QB2:1e7 FO Tv +set +v echo === check precision options ${d:-`date`} +set -v rbox 100 D3 s | qhull E0.01 Qx Tcv FO rbox 100 D3 W1e-1 | qhull W1e-3 Tcv rbox 100 D3 W1e-1 | qhull W1e-2 Tcv Q0 @@ -388,19 +500,23 @@ rbox 100 D6 t |qhull A-0.9999 Qx Qc Tcv rbox 50 D7 t |qhull A-0.99999 Qx Qc Tcv W0.1 -echo === check bad cases for Qhull. May cause errors ${d:-`date`} +set +v +echo ======================================================= +echo === The following commands may cause errors ${d:-`date`} +echo ======================================================= +echo +echo === check bad cases for Qhull ${d:-`date`} +set -v rbox 1000 L100000 s G1e-6 t | qhull Tv rbox 1000 L100000 s G1e-6 t | qhull Tv Q10 rbox 1000 s Z1 G1e-13 t | qhull Tv -rbox 1000 s W1e-13 P0 t | qhull d Qbb Qc Tv -rbox 1000 s W1e-13 t | qhull d Tv +rbox 1000 s W1e-13 P0 t | qhull d Qbb Qc Q12 Tv +rbox 1000 s W1e-13 t | qhull d Q12 Tv rbox 1000 s W1e-13 t D2 | qhull d Tv -echo ======================================================= -echo ======================================================= -echo === The following commands may cause errors ${d:-`date`} -echo ======================================================= -echo ======================================================= +set +v +echo === check Qhull without merging Q0 ${d:-`date`} +set -v rbox c D7 | qhull Q0 Tcv rbox 100 s D3 | qhull Q0 E1e-3 Tc Po rbox 100 s D3 | qhull Q0 E1e-2 Tc Po @@ -412,12 +528,22 @@ rbox 1000 W1e-7 | qhull Q0 Tc Po rbox 50 s | qhull Q0 V0.05 W0.01 Tc Po rbox 100 s D5 | qhull Q0 R1e-2 Tc Po -rbox L100 10000 D4 s C1,1e-13 t2 | qhull -rbox L100 10000 D4 s C1,1e-13 t2 | qhull Q12 + +set +v +echo === check nearly incident points ${d:-`date`} +set -v +rbox L100 2000 D4 s C1,1e-13 t2 | qhull +rbox L100 2000 D4 s C1,1e-13 t2 | qhull Q12 rbox 50 C1,1E-13 t1447644703 | qhull d rbox 50 C1,1E-13 t1447644703 | qhull d Q12 -qhull -qhull . +rbox 50 C1,1E-13 t1447644703 | qhull d Q14 + +set +v +echo ======================================================= +echo === Testing done. Print documentation +echo ======================================================= +set -v + qhull - rbox cat html/qhull.txt html/rbox.txt diff -Nru qhull-2015.2/eg/q_test.bat qhull-2020.2/eg/q_test.bat --- qhull-2015.2/eg/q_test.bat 2015-11-22 00:50:18.000000000 +0000 +++ qhull-2020.2/eg/q_test.bat 2020-05-31 02:06:38.000000000 +0000 @@ -1,666 +1,838 @@ -echo Run q_test for Windows from the bin/ directory. >q_test.x -echo === errors if 'user_eg' and 'user_eg2' not found === -echo === check user_eg === >>q_test.x -echo "user_eg 'QR1 p n Qt' 'v p' Fp" >>q_test.x -user_eg "QR1 p n Qt" "v p" Fp >>q_test.x -echo "user_eg2 'QR1 p' 'v p' Fp" >>q_test.x -user_eg2 "QR1 p" "v p" Fp >>q_test.x -echo 'user_eg3 rbox "10 D2" "2 D2" qhull "p"' >>q_test.x -user_eg3 rbox "10 D2" "2 D2" qhull "p" >>q_test.x -echo === check front ends ========================================================== >>q_test.x -echo "qconvex -" >>q_test.x -qconvex - >>q_test.x -echo "qconvex ." >>q_test.x -qconvex . >>q_test.x -echo "qconvex" >>q_test.x -qconvex >>q_test.x -echo "rbox c D3 | qconvex s n Qt" >>q_test.x -rbox c D3 | qconvex s n Qt >>q_test.x -echo "rbox c D2 | qconvex i Qt " >>q_test.x -rbox c D2 | qconvex i Qt >>q_test.x -echo "rbox c D2 | qconvex o" >>q_test.x -rbox c D2 | qconvex o >>q_test.x -echo "rbox 1000 s | qconvex s Tv FA" >>q_test.x -rbox 1000 s | qconvex s Tv FA >>q_test.x -echo "rbox c d D2 | qconvex s Qc Fx" >>q_test.x -rbox c d D2 | qconvex s Qc Fx >>q_test.x -echo "rbox y 1000 W0 | qconvex s n " >>q_test.x -rbox y 1000 W0 | qconvex s n >>q_test.x -echo "rbox y 1000 W0 | qconvex s QJ" >>q_test.x -rbox y 1000 W0 | qconvex s QJ >>q_test.x -echo "rbox d G1 D12 | qconvex QR0 FA" >>q_test.x -rbox d G1 D12 | qconvex QR0 FA >>q_test.x -echo "rbox c D6 | qconvex FA TF500" >>q_test.x -rbox c D6 | qconvex FA TF500 >>q_test.x -echo "rbox c P0 d D2 | qconvex p Fa Fc FP FI Fn FN FS Fv Fx" >>q_test.x -rbox c P0 d D2 | qconvex p Fa Fc FP FI Fn FN FS Fv Fx >>q_test.x -echo "rbox c d D2 | qconvex s i QV0" >>q_test.x -rbox c d D2 | qconvex s i QV0 >>q_test.x -echo "rbox c | qconvex Q0" >>q_test.x -rbox c | qconvex Q0 >>q_test.x -echo "qvoronoi -" >>q_test.x -qvoronoi - >>q_test.x -echo "qvoronoi ." >>q_test.x -qvoronoi . >>q_test.x -echo "qvoronoi" >>q_test.x -qvoronoi >>q_test.x -echo "rbox c P0 D2 | qvoronoi s o" >>q_test.x -rbox c P0 D2 | qvoronoi s o >>q_test.x -echo "rbox c P0 D2 | qvoronoi Fi" >>q_test.x -rbox c P0 D2 | qvoronoi Fi >>q_test.x -echo "rbox c P0 D2 | qvoronoi Fo" >>q_test.x -rbox c P0 D2 | qvoronoi Fo >>q_test.x -echo "rbox c P0 D2 | qvoronoi Fv" >>q_test.x -rbox c P0 D2 | qvoronoi Fv >>q_test.x -echo "rbox c P0 D2 | qvoronoi s Qu Qt Fv" >>q_test.x -rbox c P0 D2 | qvoronoi s Qu Qt Fv >>q_test.x -echo "rbox c P0 D2 | qvoronoi Qu Fo" >>q_test.x -rbox c P0 D2 | qvoronoi Qu Fo >>q_test.x -echo "rbox c G1 d D2 | qvoronoi s p " >>q_test.x -rbox c G1 d D2 | qvoronoi s p >>q_test.x -echo "rbox c G1 d D2 | qvoronoi QJ p " >>q_test.x -rbox c G1 d D2 | qvoronoi QJ p >>q_test.x -echo "rbox c P-0.1 P+0.1 P+0.1 D2 | qvoronoi s Fc FP FQ Fn FN " >>q_test.x -rbox c P-0.1 P+0.1 P+0.1 D2 | qvoronoi s Fc FP FQ Fn FN >>q_test.x -echo "rbox P0 c D2 | qvoronoi s Fv QV0" >>q_test.x -rbox P0 c D2 | qvoronoi s Fv QV0 >>q_test.x -echo "qdelaunay -" >>q_test.x -qdelaunay - >>q_test.x -echo "qdelaunay ." >>q_test.x -qdelaunay . >>q_test.x -echo "qdelaunay" >>q_test.x -qdelaunay >>q_test.x -echo "rbox c P0 D2 | qdelaunay s o" >>q_test.x -rbox c P0 D2 | qdelaunay s o >>q_test.x -echo "rbox c P0 D2 | qdelaunay i" >>q_test.x -rbox c P0 D2 | qdelaunay i >>q_test.x -echo "rbox c P0 D2 | qdelaunay Fv" >>q_test.x -rbox c P0 D2 | qdelaunay Fv >>q_test.x -echo "rbox c P0 D2 | qdelaunay s Qu Qt Fv" >>q_test.x -rbox c P0 D2 | qdelaunay s Qu Qt Fv >>q_test.x -echo "rbox c G1 d D2 | qdelaunay s i" >>q_test.x -rbox c G1 d D2 | qdelaunay s i >>q_test.x -echo "rbox c G1 d D2 | qdelaunay Ft" >>q_test.x -rbox c G1 d D2 | qdelaunay Ft >>q_test.x -echo "rbox c G1 d D2 | qdelaunay QJ s Ft" >>q_test.x -rbox c G1 d D2 | qdelaunay QJ s Ft >>q_test.x -echo "rbox M3,4 z 100 D2 | qdelaunay s" >>q_test.x -rbox M3,4 z 100 D2 | qdelaunay s >>q_test.x -echo "rbox c P-0.1 P+0.1 P+0.1 D2 | qdelaunay s Fx Fa Fc FP FQ Fn FN" >>q_test.x -rbox c P-0.1 P+0.1 P+0.1 D2 | qdelaunay s Fx Fa Fc FP FQ Fn FN >>q_test.x -echo "rbox P0 P0 c D2 | qdelaunay s FP QV0" >>q_test.x -rbox P0 P0 c D2 | qdelaunay s FP QV0 >>q_test.x -echo "qhalf -" >>q_test.x -qhalf - >>q_test.x -echo "qhalf ." >>q_test.x -qhalf . >>q_test.x -echo "qhalf" >>q_test.x -qhalf >>q_test.x -echo "rbox d | qhull FQ n | qhalf s Qt H0,0,0 Fp" >>q_test.x -rbox d | qhull FQ n | qhalf s H0,0,0 Fp >>q_test.x -echo "rbox c | qhull FQ FV n | qhalf s i" >>q_test.x -rbox c | qhull FQ FV n | qhalf s i >>q_test.x -echo "rbox c | qhull FQ FV n | qhalf o" >>q_test.x -rbox c | qhull FQ FV n | qhalf o >>q_test.x -echo "rbox d D2 | qhull FQ n | qhalf s H0 Fc FP Fn FN FQ Fv Fx" >>q_test.x -rbox d D2 | qhull FQ n | qhalf s H0 Fc FP Fn FN FQ Fv Fx >>q_test.x - -echo === check quality of merges for ${d:-`hostname`} ${d:-`date`} >>q_test.x -echo "rbox 1000 W0 t | qhull QR2 QJ s Fs Tv" >>q_test.x -rbox 1000 W0 t | qhull QR2 QJ s Fs Tv >>q_test.x -echo "rbox 1000 W0 t | qhull QR2 s Fs Tv" >>q_test.x -rbox 1000 W0 t | qhull QR2 s Fs Tv >>q_test.x -echo "rbox 1000 s t | qhull C0.02 Qc Tv" >>q_test.x -rbox 1000 s t | qhull C0.02 Qc Tv >>q_test.x -echo "rbox 500 s D4 t | qhull C0.01 Qc Tv" >>q_test.x -rbox 500 s D4 t | qhull C0.01 Qc Tv >>q_test.x -echo "rbox 1000 s t | qhull C-0.02 Qc Tv" >>q_test.x -rbox 1000 s t | qhull C-0.02 Qc Tv >>q_test.x -echo "rbox 1000 s D4 t | qhull C-0.01 Qc Tv" >>q_test.x -rbox 1000 s D4 t | qhull C-0.01 Qc Tv >>q_test.x -echo "rbox 200 s D5 t | qhull C-0.01 Qx Qc Tv" >>q_test.x -rbox 200 s D5 t | qhull C-0.01 Qx Qc Tv >>q_test.x -echo "rbox 100 s D6 t | qhull C-0.001 Qx Qc Tv" >>q_test.x -rbox 100 s D6 t | qhull C-0.001 Qx Qc Tv >>q_test.x -echo "rbox 1000 W1e-4 t | qhull C-1e-6 Qc Tv" >>q_test.x -rbox 1000 W1e-4 t | qhull C-1e-6 Qc Tv >>q_test.x -echo "rbox 1000 W5e-4 D4 t | qhull C-1e-5 Qc Tv" >>q_test.x -rbox 1000 W5e-4 D4 t | qhull C-1e-5 Qc Tv >>q_test.x -echo "rbox 400 W1e-3 D5 t | qhull C-1e-5 Qx Qc Tv" >>q_test.x -rbox 400 W1e-3 D5 t | qhull C-1e-5 Qx Qc Tv >>q_test.x - -echo === check input format etc. ${d:-`date`} >>q_test.x -echo "rbox d h | qhull Fd FV n FD Tcv | qhull Fd H Fp Tcv" >>q_test.x -rbox d h | qhull Fd FV n FD Tcv | qhull Fd H Fp Tcv >>q_test.x -echo "rbox 10 h | qhull Fd FD p Tcv | qhull Fd d Tcv " >>q_test.x -rbox 10 h | qhull Fd FD p Tcv | qhull Fd d Tcv >>q_test.x - -echo === check rbox ${d:-`date`} >>q_test.x -echo "rbox 3 n D2" >>q_test.x -rbox 3 n D2 >>q_test.x -echo "rbox 3 D2" >>q_test.x -rbox 3 D2 >>q_test.x -echo "rbox 3 h D2" >>q_test.x -rbox 3 h D2 >>q_test.x -echo "rbox 3 z D2" >>q_test.x -rbox 3 z D2 >>q_test.x -echo "rbox 3 z h D2" >>q_test.x -rbox 3 z h D2 >>q_test.x -echo "rbox 3 B10 D2" >>q_test.x -rbox 3 B10 D2 >>q_test.x -echo "rbox 3 z B10 D2" >>q_test.x -rbox 3 z B10 D2 >>q_test.x -echo "rbox 4 L2 r D2" >>q_test.x -rbox 4 L2 r D2 >>q_test.x -echo "rbox 8 L2 D2" >>q_test.x -rbox 8 L2 D2 >>q_test.x -echo "rbox 4 L4 r D3" >>q_test.x -rbox 4 L4 r D3 >>q_test.x -echo "rbox y" >>q_test.x -rbox y >>q_test.x -echo "rbox 10 M3,4" >>q_test.x -rbox 10 M3,4 >>q_test.x -echo "rbox 4 L4 s D5 W1e-3 " >>q_test.x -rbox 4 L4 s D5 W1e-3 >>q_test.x -echo "rbox 10 L2 s D3 | qhull Tcv" >>q_test.x -rbox 10 L2 s D3 | qhull Tcv >>q_test.x -echo "rbox 10 L4 s W1e-3 D3 | qhull Tcv" >>q_test.x -rbox 10 L4 s W1e-3 D3 | qhull Tcv >>q_test.x -echo "rbox 10 L6 D3 | qhull Tcv" >>q_test.x -rbox 10 L6 D3 | qhull Tcv >>q_test.x -echo "rbox 10 L1.1 s D4 | qhull Tcv" >>q_test.x -rbox 10 L1.1 s D4 | qhull Tcv >>q_test.x -echo "rbox y r 100 W0 O0.5 | qhull s p Tcv" >>q_test.x -rbox y r 100 W0 O0.5 | qhull s p Tcv >>q_test.x -echo "rbox x r 100 W0 O0.5 | qhull s p Tcv" >>q_test.x -rbox x r 100 W0 O0.5 | qhull s p Tcv >>q_test.x -echo "rbox 12 D8 | qhull Tcv" >>q_test.x -rbox 12 D8 | qhull Tcv >>q_test.x -echo "rbox 12 D9 | qhull Tcv" >>q_test.x -rbox 12 D9 | qhull Tcv >>q_test.x -echo "rbox 1000 D4 | qhull s i A-0.97 C0.2 A0.7 Tcv" >>q_test.x -rbox 1000 D4 | qhull s i A-0.97 C0.2 A0.7 Tcv >>q_test.x -echo "rbox 3 D2 | qhull Qb0B1:-2 p " >>q_test.x -rbox 3 D2 | qhull Qb0B1:-2 p >>q_test.x -echo "rbox 100 r D2 | qhull Pd0:0.7 PD0:0.8 n Tcv" >>q_test.x -rbox 100 r D2 | qhull Pd0:0.7 PD0:0.8 n Tcv >>q_test.x -echo "rbox 1000 s | qhull C0.05 Tcv" >>q_test.x -rbox 1000 s | qhull C0.05 Tcv >>q_test.x -echo "rbox 1000 s t | qhull Qm C0.05 Tcv" >>q_test.x -rbox 1000 s t | qhull Qm C0.05 Tcv >>q_test.x -echo "rbox 500 D2 | qhull n A-0.95 C0.1 Tcv" >>q_test.x -rbox 500 D2 | qhull n A-0.95 C0.1 Tcv >>q_test.x -echo "rbox 500 s P1,1,1 | qhull QgG0 Pp Tcv" >>q_test.x -rbox 500 s P1,1,1 | qhull QgG0 Pp Tcv >>q_test.x - -echo "rbox d | qhull m" >>q_test.x -rbox d | qhull m >>q_test.x -echo "rbox d | qhull FM" >>q_test.x -rbox d | qhull FM >>q_test.x -echo "rbox c D2 | qhull Q0 Tcv" >>q_test.x -rbox c D2 | qhull Q0 Tcv >>q_test.x -echo "rbox d D2 | qhull Tcv" >>q_test.x -rbox d D2 | qhull Tcv >>q_test.x -echo "rbox c D3 | qhull Q0 Tcv" >>q_test.x -rbox c D3 | qhull Q0 Tcv >>q_test.x -echo "rbox d D3 | qhull Tcv" >>q_test.x -rbox d D3 | qhull Tcv >>q_test.x -echo "rbox c D4 | qhull Q0 Tcv" >>q_test.x -rbox c D4 | qhull Q0 Tcv >>q_test.x -echo "rbox d D4 | qhull Tcv" >>q_test.x -rbox d D4 | qhull Tcv >>q_test.x -echo "rbox c D5 | qhull Q0 Tcv" >>q_test.x -rbox c D5 | qhull Q0 Tcv >>q_test.x -echo "rbox d D5 | qhull Tcv" >>q_test.x -rbox d D5 | qhull Tcv >>q_test.x -echo "rbox c D6 | qhull Q0 Tcv" >>q_test.x -rbox c D6 | qhull Q0 Tcv >>q_test.x -echo "rbox d D6 | qhull Tcv" >>q_test.x -rbox d D6 | qhull Tcv >>q_test.x -echo "rbox d D7 | qhull Tcv" >>q_test.x -rbox d D7 | qhull Tcv >>q_test.x -echo "rbox c D2 | qhull Tcv C-0" >>q_test.x -rbox c D2 | qhull Tcv C-0 >>q_test.x -echo "rbox c D3 | qhull Tcv C-0" >>q_test.x -rbox c D3 | qhull Tcv C-0 >>q_test.x -echo "rbox c D4 | qhull Tcv C-0" >>q_test.x -rbox c D4 | qhull Tcv C-0 >>q_test.x -echo "rbox c D5 | qhull Tcv C-0" >>q_test.x -rbox c D5 | qhull Tcv C-0 >>q_test.x -echo "rbox c D6 | qhull Tcv C-0" >>q_test.x -rbox c D6 | qhull Tcv C-0 >>q_test.x -echo "rbox c D7 | qhull Tv C-0" >>q_test.x -rbox c D7 | qhull Tv C-0 >>q_test.x -echo "rbox 20 l D3 | qhull Tcv" >>q_test.x -rbox 20 l D3 | qhull Tcv >>q_test.x -echo "rbox 100 s D2 | qhull Tcv" >>q_test.x -rbox 100 s D2 | qhull Tcv >>q_test.x -echo "rbox 100 s D3 | qhull Tcv" >>q_test.x -rbox 100 s D3 | qhull Tcv >>q_test.x -echo "rbox 100 s D4 | qhull Tcv" >>q_test.x -rbox 100 s D4 | qhull Tcv >>q_test.x -echo "rbox 100 s c D4 | qhull Tcv" >>q_test.x -rbox 100 s c D4 | qhull Tcv >>q_test.x -echo "rbox 100 s d G1.5 D4 | qhull Tcv" >>q_test.x -rbox 100 s d G1.5 D4 | qhull Tcv >>q_test.x -echo "rbox 100 s W1e-2 | qhull Tcv" >>q_test.x -rbox 100 s W1e-2 | qhull Tcv >>q_test.x -echo "rbox 100 | qhull Tcv" >>q_test.x -rbox 100 | qhull Tcv >>q_test.x -echo "rbox 100 W1e-3 | qhull Tcv" >>q_test.x -rbox 100 W1e-3 | qhull Tcv >>q_test.x -echo "rbox 100 r D2 | qhull Tcv" >>q_test.x -rbox 100 r D2 | qhull Tcv >>q_test.x -echo "rbox 100 r s Z1 | qhull Tcv" >>q_test.x -rbox 100 r s Z1 | qhull Tcv >>q_test.x -echo "rbox 100 r s Z1 G0.1 | qhull Tcv C-0" >>q_test.x -rbox 100 r s Z1 G0.1 | qhull Tcv C-0 >>q_test.x -echo "rbox 100 s Z1 G0.1 | qhull Tcv " >>q_test.x -rbox 100 s Z1 G0.1 | qhull Tcv >>q_test.x -echo "rbox 100 s Z1e-5 G0.1 | qhull Tc Pp" >>q_test.x -rbox 100 s Z1e-5 G0.1 | qhull Tc Pp >>q_test.x - -echo === check qhull output formats ${d:-`date`} >>q_test.x -echo "rbox 5 r s D2 | qhull Tcv" >>q_test.x -rbox 5 r s D2 | qhull Tcv >>q_test.x -echo "rbox 5 r s D2 | qhull s " >>q_test.x -rbox 5 r s D2 | qhull s >>q_test.x -echo "rbox 5 r s D2 | qhull s o " >>q_test.x -rbox 5 r s D2 | qhull s o >>q_test.x -echo "rbox 5 r s D2 | qhull f" >>q_test.x -rbox 5 r s D2 | qhull f >>q_test.x -echo "rbox 5 r s D2 | qhull i " >>q_test.x -rbox 5 r s D2 | qhull i >>q_test.x -echo "rbox 5 r s D2 | qhull m " >>q_test.x -rbox 5 r s D2 | qhull m >>q_test.x -echo "rbox 5 r s D2 | qhull FM " >>q_test.x -rbox 5 r s D2 | qhull FM >>q_test.x -echo "rbox 5 r s D2 | qhull n " >>q_test.x -rbox 5 r s D2 | qhull n >>q_test.x -echo "rbox 5 r s D2 | qhull p " >>q_test.x -rbox 5 r s D2 | qhull p >>q_test.x -echo "rbox 5 r s D2 | qhull o " >>q_test.x -rbox 5 r s D2 | qhull o >>q_test.x -echo "rbox 5 r s D2 | qhull Fx" >>q_test.x -rbox 5 r s D2 | qhull Fx >>q_test.x -echo "rbox 5 r s D2 | qhull p n i p p" >>q_test.x -rbox 5 r s D2 | qhull p n i p p >>q_test.x -echo "rbox 10 D3 | qhull f Tcv" >>q_test.x -rbox 10 D3 | qhull f Tcv >>q_test.x -echo "rbox 10 D3 | qhull i" >>q_test.x -rbox 10 D3 | qhull i >>q_test.x -echo "rbox 10 D3 | qhull p " >>q_test.x -rbox 10 D3 | qhull p >>q_test.x -echo "rbox 10 D3 | qhull o " >>q_test.x -rbox 10 D3 | qhull o >>q_test.x -echo "rbox 10 D3 | qhull Fx " >>q_test.x -rbox 10 D3 | qhull Fx >>q_test.x -echo "rbox 27 M1,0,1 | qhull Qc" >>q_test.x -rbox 27 M1,0,1 | qhull Qc >>q_test.x -echo "rbox 50 D3 s | qhull C0.1 Qc Pd0d1d2 s p Tcv" >>q_test.x -rbox 50 D3 s | qhull C0.1 Qc Pd0d1d2 s p Tcv >>q_test.x -echo "rbox 10 D2 P0 P1e-15 | qhull d Qc FP s Tcv" >>q_test.x -rbox 10 D2 P0 P1e-15 | qhull d Qc FP s Tcv >>q_test.x -echo "rbox 100 s | qhull C-0.003 Qc FP s" >>q_test.x -rbox 100 s | qhull C-0.003 Qc FP s >>q_test.x -echo "rbox 100 s D2 | qhull C0.1 i Fx Tcv" >>q_test.x -rbox 100 s D2 | qhull C0.1 i Fx Tcv >>q_test.x -echo "rbox 4 s D3 | qhull Qc Ghipv Tcv " >>q_test.x -rbox 4 s D3 | qhull Qc Ghipv Tcv >>q_test.x -echo "rbox 6 D4 | qhull f Tcv" >>q_test.x -rbox 6 D4 | qhull f Tcv >>q_test.x -echo "rbox 6 D4 | qhull i" >>q_test.x -rbox 6 D4 | qhull i >>q_test.x -echo "rbox 6 D4 | qhull p " >>q_test.x -rbox 6 D4 | qhull p >>q_test.x -echo "rbox 6 D4 | qhull o" >>q_test.x -rbox 6 D4 | qhull o >>q_test.x -echo "rbox 1000 s D2 | qhull FA Tcv" >>q_test.x -rbox 1000 s D2 | qhull FA Tcv >>q_test.x -echo "rbox 1000 s | qhull FA Tcv" >>q_test.x -rbox 1000 s | qhull FA Tcv >>q_test.x -echo "rbox c D4 | qhull FA Tcv" >>q_test.x -rbox c D4 | qhull FA Tcv >>q_test.x -echo "rbox c D5 | qhull FA Tcv" >>q_test.x -rbox c D5 | qhull FA Tcv >>q_test.x -echo "rbox 10 D2 | qhull d FA Tcv" >>q_test.x -rbox 10 D2 | qhull d FA Tcv >>q_test.x -echo "rbox 10 D2 | qhull d Qu FA Tcv" >>q_test.x -rbox 10 D2 | qhull d Qu FA Tcv >>q_test.x -echo "rbox 10 D2 | qhull FA Tcv" >>q_test.x -rbox 10 D2 | qhull FA Tcv >>q_test.x -echo "rbox 10 c D2 | qhull Fx Tcv" >>q_test.x -rbox 10 c D2 | qhull Fx Tcv >>q_test.x -echo "rbox 1000 s | qhull FS Tcv" >>q_test.x -rbox 1000 s | qhull FS Tcv >>q_test.x -echo "rbox 10 W0 D2 | qhull p Qc FcC Tcv" >>q_test.x -rbox 10 W0 D2 | qhull p Qc FcC Tcv >>q_test.x -echo "rbox 4 z h s D2 | qhull Fd s n FD Tcv" >>q_test.x -rbox 4 z h s D2 | qhull Fd s n FD Tcv >>q_test.x -echo "rbox 6 s D3 | qhull C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv" >>q_test.x -rbox 6 s D3 | qhull C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv >>q_test.x -echo "rbox P0.5,0.5 P0.5,0.5 W0 5 D2 | qhull d FN Qc" >>q_test.x -rbox P0.5,0.5 P0.5,0.5 W0 5 D2 | qhull d FN Qc >>q_test.x -echo "rbox 10 D3 | qhull Fa PA5" >>q_test.x -rbox 10 D3 | qhull Fa PA5 >>q_test.x -echo "rbox 10 D3 | qhull Fa PF0.4" >>q_test.x -rbox 10 D3 | qhull Fa PF0.4 >>q_test.x - -echo === test Qt >>q_test.x -echo "rbox c | qhull Qt s o Tcv" >>q_test.x -rbox c | qhull Qt s o Tcv >>q_test.x -echo "rbox c | qhull Qt f i" >>q_test.x -rbox c | qhull Qt f i >>q_test.x -echo "rbox c | qhull Qt m FM n" >>q_test.x -rbox c | qhull Qt m FM n >>q_test.x -echo "rbox c | qhull Qt p o" >>q_test.x -rbox c | qhull Qt p o >>q_test.x -echo "rbox c | qhull Qt Fx" >>q_test.x -rbox c | qhull Qt Fx >>q_test.x -echo "rbox c | qhull Qt FA s Fa" >>q_test.x -rbox c | qhull Qt FA s Fa >>q_test.x -echo "rbox 6 r s c G0.1 D2 | qhull Qt d FA Tcv" >>q_test.x -rbox 6 r s c G0.1 D2 | qhull Qt d FA Tcv >>q_test.x -echo "rbox 6 r s c G0.1 D2 | qhull d FA Tcv" >>q_test.x -rbox 6 r s c G0.1 D2 | qhull d FA Tcv >>q_test.x -echo "rbox 6 r s c G0.1 D2 | qhull Qt v p Tcv" >>q_test.x -rbox 6 r s c G0.1 D2 | qhull Qt v p Tcv >>q_test.x -echo "rbox c | qhull Qt C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv" >>q_test.x -rbox c | qhull Qt C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv >>q_test.x -echo "rbox 6 r s c G0.1 D2 P0.1,0.1 | qhull s FP d FO Qt" >>q_test.x -rbox 6 r s c G0.1 D2 P0.1,0.1 | qhull s FP d FO Qt >>q_test.x -echo "RBOX 100 W0 | QHULL Tv Q11 FO" >>q_test.x -RBOX 100 W0 | QHULL Tv Q11 FO >>q_test.x - -echo === test unbounded intersection >>q_test.x -echo "rbox c | qhull PD0:0.5 n | qhull H0 Fp Tcv" >>q_test.x -rbox c | qhull PD0:0.5 n | qhull H0 Fp Tcv >>q_test.x -echo "rbox 1000 W1e-3 D3 | qhull PA8 Fa FS s n Tcv " >>q_test.x -rbox 1000 W1e-3 D3 | qhull PA8 Fa FS s n Tcv >>q_test.x -echo "rbox 1000 W1e-3 D3 | qhull C-0.01 PM10 Fm n Tcv Qc" >>q_test.x -rbox 1000 W1e-3 D3 | qhull C-0.01 PM10 Fm n Tcv Qc >>q_test.x -echo "rbox 1000 W1e-3 D3 | qhull C-0.01 PA8 PG n Tcv Qc" >>q_test.x -rbox 1000 W1e-3 D3 | qhull C-0.01 PA8 PG n Tcv Qc >>q_test.x -rbox 10 | qhull FO Tz TO q_test.log.1 -echo "type q_test.log.1" >>q_test.x -type q_test.log.1 >>q_test.x - -echo === check Delaunay/Voronoi ${d:-`date`} >>q_test.x -echo "rbox 10 D2 | qhull d Tcv" >>q_test.x -rbox 10 D2 | qhull d Tcv >>q_test.x -echo "rbox 10 D2 | qhull d Qz Tcv" >>q_test.x -rbox 10 D2 | qhull d Qz Tcv >>q_test.x -echo "rbox 10 D3 | qhull d Tcv" >>q_test.x -rbox 10 D3 | qhull d Tcv >>q_test.x -echo "rbox c | qhull d Qz Ft Tcv" >>q_test.x -rbox c | qhull d Qz Ft Tcv >>q_test.x -echo "rbox 10 s D2 c | qhull d Tcv" >>q_test.x -rbox 10 s D2 c | qhull d Tcv >>q_test.x -echo "rbox 10 s D2 | qhull d Tcv Qz Q8" >>q_test.x -rbox 10 s D2 | qhull d Tcv Qz Q8 >>q_test.x -echo "rbox 10 D2 | qhull d Tcv p" >>q_test.x -rbox 10 D2 | qhull d Tcv p >>q_test.x -echo "rbox 10 D2 | qhull d Tcv i" >>q_test.x -rbox 10 D2 | qhull d Tcv i >>q_test.x -echo "rbox 10 D2 | qhull d Tcv o" >>q_test.x -rbox 10 D2 | qhull d Tcv o >>q_test.x -echo "rbox 10 D2 | qhull v Tcv o" >>q_test.x -rbox 10 D2 | qhull v Tcv o >>q_test.x -echo "rbox 10 D2 | qhull v Tcv p" >>q_test.x -rbox 10 D2 | qhull v Tcv p >>q_test.x -echo "rbox 10 D2 | qhull v Tcv G" >>q_test.x -rbox 10 D2 | qhull v Tcv G >>q_test.x -echo "rbox 10 D2 | qhull v Tcv Fv" >>q_test.x -rbox 10 D2 | qhull v Tcv Fv >>q_test.x -echo "rbox 10 D2 | qhull v Tcv Fi" >>q_test.x -rbox 10 D2 | qhull v Tcv Fi >>q_test.x -echo "rbox 10 D2 | qhull v Tcv Fo" >>q_test.x -rbox 10 D2 | qhull v Tcv Fo >>q_test.x -echo "rbox 10 D2 | qhull v Qu Tcv o Fv Fi Fo" >>q_test.x -rbox 10 D2 | qhull v Qu Tcv o Fv Fi Fo >>q_test.x -echo "rbox 10 D3 | qhull v Tcv Fv" >>q_test.x -rbox 10 D3 | qhull v Tcv Fv >>q_test.x -echo "rbox 10 D3 | qhull v Tcv Fi" >>q_test.x -rbox 10 D3 | qhull v Tcv Fi >>q_test.x -echo "rbox 10 D3 | qhull v Tcv Fo" >>q_test.x -rbox 10 D3 | qhull v Tcv Fo >>q_test.x -echo "rbox 10 D3 | qhull v Qu Tcv o Fv Fi Fo" >>q_test.x -rbox 10 D3 | qhull v Qu Tcv o Fv Fi Fo >>q_test.x -echo "rbox 5 D2 | qhull v f FnN o" >>q_test.x -rbox 5 D2 | qhull v f FnN o >>q_test.x - -echo === check Halfspace ${d:-`date`} >>q_test.x -echo "rbox 100 s D4 | qhull FA FV n s Tcv | qhull H Fp Tcv | qhull FA Tcv" >>q_test.x -rbox 100 s D4 | qhull FA s Tcv >>q_test.x -rbox 100 s D4 | qhull FA FV n s Tcv | qhull H Fp Tcv | qhull FA Tcv >>q_test.x -echo "rbox d D3 | qhull FQ n s FD Tcv | qhull Fd H0.1,0.1 Fp FQ Tcv" >>q_test.x -rbox d D3 | qhull s >>q_test.x -rbox d D3 | qhull FQ n FD Tcv | qhull Fd H0.1,0.1 Fp FQ Tcv >>q_test.x -echo "rbox 5 r D2 | qhull s n Tcv | qhull H0 Fp Tcv" >>q_test.x -rbox 5 r D2 | qhull >>q_test.x -rbox 5 r D2 | qhull n Tcv | qhull H0 Fp Tcv >>q_test.x - -echo === check qhull ${d:-`date`} >>q_test.x -echo "rbox 10 s D3 | qhull Tcv" >>q_test.x -rbox 10 s D3 | qhull Tcv >>q_test.x -echo "rbox 10 s D3 | qhull f Pd0:0.5 Pd2 Tcv" >>q_test.x -rbox 10 s D3 | qhull f Pd0:0.5 Pd2 Tcv >>q_test.x -echo "rbox 10 s D3 | qhull f Tcv PD2:-0.5" >>q_test.x -rbox 10 s D3 | qhull f Tcv PD2:-0.5 >>q_test.x -echo "rbox 10 s D3 | qhull QR-1" >>q_test.x -rbox 10 s D3 | qhull QR-1 >>q_test.x -echo "rbox 10 s D3 | qhull QR-40" >>q_test.x -rbox 10 s D3 | qhull QR-40 >>q_test.x -echo "rbox 1000 D3 | qhull Tcvs" >>q_test.x -rbox 1000 D3 | qhull Tcvs >>q_test.x -echo "rbox 100 s D3 | qhull TcvV-2" >>q_test.x -rbox 100 s D3 | qhull TcvV-2 >>q_test.x -echo "rbox 100 s D3 | qhull TcvC2" >>q_test.x -rbox 100 s D3 | qhull TcvC2 >>q_test.x -echo "rbox 100 s D3 | qhull TcvV2" >>q_test.x -rbox 100 s D3 | qhull TcvV2 >>q_test.x -echo "rbox 100 s D3 | qhull T1cvV2P2" >>q_test.x -rbox 100 s D3 | qhull T1cvV2P2 >>q_test.x -echo "rbox 100 s D3 | qhull TcvF100" >>q_test.x -rbox 100 s D3 | qhull TcvF100 >>q_test.x -echo "rbox 100 s D3 | qhull Qf Tcv" >>q_test.x -rbox 100 s D3 | qhull Qf Tcv >>q_test.x -echo "rbox 100 D3 | qhull Tcv" >>q_test.x -rbox 100 D3 | qhull Tcv >>q_test.x -echo "rbox 100 D3 | qhull Qs Tcv" >>q_test.x -rbox 100 D3 | qhull Qs Tcv >>q_test.x -echo "rbox 100 D5 | qhull Qs Tcv" >>q_test.x -rbox 100 D5 | qhull Qs Tcv >>q_test.x -echo "rbox 100 D3 | qhull Qr Tcv" >>q_test.x -rbox 100 D3 | qhull Qr Tcv >>q_test.x -echo "rbox 100 D3 | qhull Qxv Tcv" >>q_test.x -rbox 100 D3 | qhull Qxv Tcv >>q_test.x -echo "rbox 100 D3 | qhull Qi f Pd0 Pd1 Pd2 Tcv" >>q_test.x -rbox 100 D3 | qhull Qi f Pd0 Pd1 Pd2 Tcv >>q_test.x -echo "rbox c d | qhull Qc f Tcv" >>q_test.x -rbox c d | qhull Qc f Tcv >>q_test.x -echo "rbox c d | qhull Qc p Tcv" >>q_test.x -rbox c d | qhull Qc p Tcv >>q_test.x -echo "rbox 100 D3 | qhull QbB FO Tcv" >>q_test.x -rbox 100 D3 | qhull QbB FO Tcv >>q_test.x -echo "rbox 1000 D2 B1e6 | qhull d Qbb FO Tcv" >>q_test.x -rbox 1000 D2 B1e6 | qhull d Qbb FO Tcv >>q_test.x -echo "rbox 10 D3 | qhull QbB p Tcv" >>q_test.x -rbox 10 D3 | qhull QbB p Tcv >>q_test.x -echo "rbox 10 D3 | qhull Qbb p Tcv" >>q_test.x -rbox 10 D3 | qhull Qbb p Tcv >>q_test.x -echo "rbox 10 D3 | qhull Qb0:-10B2:20 p Tcv" >>q_test.x -rbox 10 D3 | qhull Qb0:-10B2:20 p Tcv >>q_test.x -echo "rbox 10 D3 | qhull Qb0:-10B2:20 p Tcv | qhull QbB p Tcv" >>q_test.x -rbox 10 D3 | qhull Qb0:-10B2:20 p Tcv | qhull QbB p Tcv >>q_test.x -echo "rbox 10 D3 | qhull Qb1:0B1:0 d Tcv Q8" >>q_test.x -rbox 10 D3 | qhull Qb1:0B1:0 d Tcv Q8 >>q_test.x -echo "rbox 10 D3 | qhull Qb1:0B1:0B2:0 d Tcv Q8" >>q_test.x -rbox 10 D3 | qhull Qb1:0B1:0B2:0 d Tcv Q8 >>q_test.x -echo "rbox 10 D3 | qhull Qb1:0 d Tcv " >>q_test.x -rbox 10 D3 | qhull Qb1:0 d Tcv >>q_test.x -echo "rbox 10 D3 | qhull Qb1:0B1:0 Tcv" >>q_test.x -rbox 10 D3 | qhull Qb1:0B1:0 Tcv >>q_test.x -echo "== next command will error ==" >>q_test.x -echo "rbox 10 D2 | qhull Qb1:1B1:1 Tcv" >>q_test.x -rbox 10 D2 | qhull Qb1:1B1:1 Tcv >>q_test.x -echo "rbox 200 L20 D2 t | qhull FO Tcv C-0" >>q_test.x -rbox 200 L20 D2 t | qhull FO Tcv C-0 >>q_test.x -echo "rbox 1000 L20 t | qhull FO Tcv C-0" >>q_test.x -rbox 1000 L20 t | qhull FO Tcv C-0 >>q_test.x -echo "rbox 200 L20 D4 t | qhull FO Tcv C-0" >>q_test.x -rbox 200 L20 D4 t | qhull FO Tcv C-0 >>q_test.x -echo "rbox 200 L20 D5 t | qhull FO Tcv Qx" >>q_test.x -rbox 200 L20 D5 t | qhull FO Tcv Qx >>q_test.x -echo "rbox 1000 W1e-3 s D2 t | qhull d FO Tcv Qu Q0" >>q_test.x -rbox 1000 W1e-3 s D2 t | qhull d FO Tcv Qu Q0 >>q_test.x -echo "rbox 1000 W1e-3 s D2 t | qhull d FO Tcv Qu C-0" >>q_test.x -rbox 1000 W1e-3 s D2 t | qhull d FO Tcv Qu C-0 >>q_test.x - -echo === check joggle and TRn ${d:-`date`} >>q_test.x -echo "rbox 100 W0 | qhull QJ1e-14 Qc TR100 Tv" >>q_test.x -rbox 100 W0 | qhull QJ1e-14 Qc TR100 Tv >>q_test.x -echo "rbox 100 W0 | qhull QJ1e-13 Qc TR100 Tv" >>q_test.x -rbox 100 W0 | qhull QJ1e-13 Qc TR100 Tv >>q_test.x -echo "rbox 100 W0 | qhull QJ1e-12 Qc TR100 Tv" >>q_test.x -rbox 100 W0 | qhull QJ1e-12 Qc TR100 Tv >>q_test.x -echo "rbox 100 W0 | qhull QJ1e-11 Qc TR100 Tv" >>q_test.x -rbox 100 W0 | qhull QJ1e-11 Qc TR100 Tv >>q_test.x -echo "rbox 100 W0 | qhull QJ1e-10 Qc TR100 Tv" >>q_test.x -rbox 100 W0 | qhull QJ1e-10 Qc TR100 Tv >>q_test.x -echo "rbox 100 | qhull d QJ Qb0:1e4 QB0:1e5 Qb1:1e4 QB1:1e6 Qb2:1e5 QB2:1e7 FO Tv" >>q_test.x -rbox 100 | qhull d QJ Qb0:1e4 QB0:1e5 Qb1:1e4 QB1:1e6 Qb2:1e5 QB2:1e7 FO Tv >>q_test.x - -echo === check precision options ${d:-`date`} >>q_test.x -echo "rbox 100 D3 s | qhull E0.01 Qx Tcv FO" >>q_test.x -rbox 100 D3 s | qhull E0.01 Qx Tcv FO >>q_test.x -echo "rbox 100 D3 W1e-1 | qhull W1e-3 Tcv" >>q_test.x -rbox 100 D3 W1e-1 | qhull W1e-3 Tcv >>q_test.x -echo "rbox 100 D3 W1e-1 | qhull W1e-2 Tcv Q0" >>q_test.x -rbox 100 D3 W1e-1 | qhull W1e-2 Tcv Q0 >>q_test.x -echo "rbox 100 D3 W1e-1 | qhull W1e-2 Tcv" >>q_test.x -rbox 100 D3 W1e-1 | qhull W1e-2 Tcv >>q_test.x -echo "rbox 100 D3 W1e-1 | qhull W1e-1 Tcv" >>q_test.x -rbox 100 D3 W1e-1 | qhull W1e-1 Tcv >>q_test.x -echo "rbox 15 D2 P0 P1e-14,1e-14 | qhull d Quc Tcv" >>q_test.x -rbox 15 D2 P0 P1e-14,1e-14 | qhull d Quc Tcv >>q_test.x -echo "rbox 15 D3 P0 P1e-12,1e-14,1e-14 | qhull d Qcu Tcv" >>q_test.x -rbox 15 D3 P0 P1e-12,1e-14,1e-14 | qhull d Qcu Tcv >>q_test.x -echo "rbox 1000 s D3 | qhull C-0.01 Tcv Qc" >>q_test.x -rbox 1000 s D3 | qhull C-0.01 Tcv Qc >>q_test.x -echo "rbox 1000 s D3 | qhull C-0.01 V0 Qc Tcv" >>q_test.x -rbox 1000 s D3 | qhull C-0.01 V0 Qc Tcv >>q_test.x -echo "rbox 1000 s D3 | qhull C-0.01 U0 Qc Tcv" >>q_test.x -rbox 1000 s D3 | qhull C-0.01 U0 Qc Tcv >>q_test.x -echo "rbox 1000 s D3 | qhull C-0.01 V0 Qcm Tcv" >>q_test.x -rbox 1000 s D3 | qhull C-0.01 V0 Qcm Tcv >>q_test.x -echo "rbox 1000 s D3 | qhull C-0.01 Qcm Tcv" >>q_test.x -rbox 1000 s D3 | qhull C-0.01 Qcm Tcv >>q_test.x -echo "rbox 1000 s D3 | qhull C-0.01 Q1 FO Tcv Qc" >>q_test.x -rbox 1000 s D3 | qhull C-0.01 Q1 FO Tcv Qc >>q_test.x -echo "rbox 1000 s D3 | qhull C-0.01 Q2 FO Tcv Qc" >>q_test.x -rbox 1000 s D3 | qhull C-0.01 Q2 FO Tcv Qc >>q_test.x -echo "rbox 1000 s D3 | qhull C-0.01 Q3 FO Tcv Qc" >>q_test.x -rbox 1000 s D3 | qhull C-0.01 Q3 FO Tcv Qc >>q_test.x -echo "rbox 1000 s D3 | qhull C-0.01 Q4 FO Tcv Qc" >>q_test.x -rbox 1000 s D3 | qhull C-0.01 Q4 FO Tcv Qc >>q_test.x -echo === this may generate an error ${d:-`date`} >>q_test.x -echo "rbox 1000 s D3 | qhull C-0.01 Q5 FO Tcv " >>q_test.x -rbox 1000 s D3 | qhull C-0.01 Q5 FO Tcv >>q_test.x -echo === this should generate an error ${d:-`date`} >>q_test.x -echo "rbox 1000 s D3 | qhull C-0.01 Q6 FO Po Tcv Qc" >>q_test.x -rbox 1000 s D3 | qhull C-0.01 Q6 FO Po Tcv Qc >>q_test.x -echo "rbox 1000 s D3 | qhull C-0.01 Q7 FO Tcv Qc" >>q_test.x -rbox 1000 s D3 | qhull C-0.01 Q7 FO Tcv Qc >>q_test.x -echo "rbox 1000 s D3 | qhull C-0.01 Qx Tcv Qc" >>q_test.x -rbox 1000 s D3 | qhull C-0.01 Qx Tcv Qc >>q_test.x -echo "rbox 100 s D3 t | qhull R1e-3 Tcv Qc" >>q_test.x -rbox 100 s D3 t | qhull R1e-3 Tcv Qc >>q_test.x -echo "rbox 100 s D3 t | qhull R1e-2 Tcv Qc" >>q_test.x -rbox 100 s D3 t | qhull R1e-2 Tcv Qc >>q_test.x -echo "rbox 500 s D3 t | qhull R0.05 A-1 Tcv Qc" >>q_test.x -rbox 500 s D3 t | qhull R0.05 A-1 Tcv Qc >>q_test.x -echo "rbox 100 W0 D3 t | qhull R1e-3 Tcv Qc" >>q_test.x -rbox 100 W0 D3 t | qhull R1e-3 Tcv Qc >>q_test.x -echo "rbox 100 W0 D3 t | qhull R1e-3 Qx Tcv Qc" >>q_test.x -rbox 100 W0 D3 t | qhull R1e-3 Qx Tcv Qc >>q_test.x -echo "rbox 100 W0 D3 t | qhull R1e-2 Tcv Qc" >>q_test.x -rbox 100 W0 D3 t | qhull R1e-2 Tcv Qc >>q_test.x -echo "rbox 100 W0 D3 t | qhull R1e-2 Qx Tcv Qc" >>q_test.x -rbox 100 W0 D3 t | qhull R1e-2 Qx Tcv Qc >>q_test.x -echo "rbox 500 W0 D3 t | qhull R0.05 A-1 Tcv Qc" >>q_test.x -rbox 500 W0 D3 t | qhull R0.05 A-1 Tcv Qc >>q_test.x -echo "rbox 500 W0 D3 t | qhull R0.05 Qx Tcv Qc" >>q_test.x -rbox 500 W0 D3 t | qhull R0.05 Qx Tcv Qc >>q_test.x -echo "rbox 1000 W1e-20 t | qhull Tcv Qc" >>q_test.x -rbox 1000 W1e-20 t | qhull Tcv Qc >>q_test.x -echo "rbox 1000 W1e-20 D4 t | qhull Tcv Qc" >>q_test.x -rbox 1000 W1e-20 D4 t | qhull Tcv Qc >>q_test.x -echo "rbox 500 W1e-20 D5 t | qhull Tv Qc" >>q_test.x -rbox 500 W1e-20 D5 t | qhull Tv Qc >>q_test.x -echo "rbox 100 W1e-20 D6 t | qhull Tv Qc" >>q_test.x -rbox 100 W1e-20 D6 t | qhull Tv Qc >>q_test.x -echo "rbox 50 W1e-20 D6 t | qhull Qv Tv Qc" >>q_test.x -rbox 50 W1e-20 D6 t | qhull Qv Tv Qc >>q_test.x -echo "rbox 10000 D4 t | qhull QR0 Qc C-0.01 A0.3 Tv" >>q_test.x -rbox 10000 D4 t | qhull QR0 Qc C-0.01 A0.3 Tv >>q_test.x -echo "rbox 1000 D2 t | qhull d QR0 Qc C-1e-8 Qu Tv" >>q_test.x -rbox 1000 D2 t | qhull d QR0 Qc C-1e-8 Qu Tv >>q_test.x -echo "rbox 300 D5 t |qhull A-0.999 Qc Tcv" >>q_test.x -rbox 300 D5 t |qhull A-0.999 Qc Tcv >>q_test.x -echo "rbox 100 D6 t |qhull A-0.9999 Qc Tcv" >>q_test.x -rbox 100 D6 t |qhull A-0.9999 Qc Tcv >>q_test.x -echo "rbox 50 D7 t |qhull A-0.99999 Qc Tcv W0.1" >>q_test.x -rbox 50 D7 t |qhull A-0.99999 Qc Tcv W0.1 >>q_test.x - -echo === check bad cases for Qhull. May cause errors ${d:-`date`} >>q_test.x -echo "RBOX 1000 L100000 s G1e-6 t | QHULL Tv" >>q_test.x -RBOX 1000 L100000 s G1e-6 t | QHULL Tv >>q_test.x -echo "RBOX 1000 L100000 s G1e-6 t | QHULL Tv Q10" >>q_test.x -RBOX 1000 L100000 s G1e-6 t | QHULL Tv Q10 >>q_test.x -echo "rbox 1000 s Z1 G1e-13 t | qhull Tv" >>q_test.x -rbox 1000 s Z1 G1e-13 t | qhull Tv >>q_test.x -echo "RBOX 1000 s W1e-13 P0 t | QHULL d Qbb Qc Tv" >>q_test.x -RBOX 1000 s W1e-13 P0 t | QHULL d Qbb Qc Tv >>q_test.x -echo "RBOX 1000 s W1e-13 t | QHULL d Tv" >>q_test.x -RBOX 1000 s W1e-13 t | QHULL d Tv >>q_test.x -echo "RBOX 1000 s W1e-13 t D2 | QHULL d Tv" >>q_test.x -RBOX 1000 s W1e-13 t D2 | QHULL d Tv >>q_test.x - -echo ======================================================= >>q_test.x -echo ======================================================= >>q_test.x -echo === The following commands may cause errors =========== >>q_test.x -echo ======================================================= >>q_test.x -echo ======================================================= >>q_test.x -echo "rbox c D7 | qhull Q0 Tcv" >>q_test.x -rbox c D7 | qhull Q0 Tcv >>q_test.x -echo "rbox 100 s D3 | qhull Q0 E1e-3 Tc Po" >>q_test.x -rbox 100 s D3 | qhull Q0 E1e-3 Tc Po >>q_test.x -echo "rbox 100 s D3 | qhull Q0 E1e-2 Tc Po" >>q_test.x -rbox 100 s D3 | qhull Q0 E1e-2 Tc Po >>q_test.x -echo "rbox 100 s D3 | qhull Q0 E1e-1 Tc Po" >>q_test.x -rbox 100 s D3 | qhull Q0 E1e-1 Tc Po >>q_test.x -echo "rbox 100 s D3 | qhull Q0 R1e-3 Tc Po" >>q_test.x -rbox 100 s D3 | qhull Q0 R1e-3 Tc Po >>q_test.x -echo "rbox 100 s D3 | qhull Q0 R1e-2 Tc Po" >>q_test.x -rbox 100 s D3 | qhull Q0 R1e-2 Tc Po >>q_test.x -echo "rbox 100 s D3 | qhull Q0 R0.05 Tc" >>q_test.x -rbox 100 s D3 | qhull Q0 R0.05 Tc >>q_test.x -echo "rbox 100 s D3 | qhull Q0 R0.05 Tc Po" >>q_test.x -rbox 100 s D3 | qhull Q0 R0.05 Tc Po >>q_test.x -echo "rbox 1000 W1e-7 | qhull Q0 Tc Po" >>q_test.x -rbox 1000 W1e-7 | qhull Q0 Tc Po >>q_test.x -echo "rbox 50 s | qhull Q0 V0.05 W0.01 Tc Po" >>q_test.x -rbox 50 s | qhull Q0 V0.05 W0.01 Tc Po >>q_test.x -echo "rbox 100 s D5 | qhull Q0 R1e-2 Tc Po" >>q_test.x -rbox 100 s D5 | qhull Q0 R1e-2 Tc Po >>q_test.x -echo "qhull" >>q_test.x -qhull >>q_test.x -echo "qhull ." >>q_test.x -qhull . >>q_test.x -echo "qhull -" >>q_test.x -qhull - >>q_test.x -echo "rbox" >>q_test.x -rbox >>q_test.x +echo off +echo q_test.bat -- writes output to q_test.x for comparison with eg/q_test-ok.txt +echo +echo Instructions: +echo +echo Launch QHULL-GO.bat +echo " ..\eg\q_test.bat >q_test.x 2>&1 " +echo +echo Compare bin\q_test.x with ..\eg\q_test-ok.txt + +echo "========================" >q_test.x +echo "== Run q_test.bat for Windows from the bin/ directory." +echo "== Skips 'make test' and 'make qtest'" +echo "== Align the next block with 'eg/q_test'" +echo "========================" +echo +echo "==============================" +echo "========= eg/q_test ==========" +echo "== Check qhull programs ======" +echo "==============================" +echo +echo "==============================" +echo "== check user_eg, user_eg2, and user_eg3" +echo "== errors if 'user_eg' and 'user_eg2' not found" +echo "==============================" +echo user_eg +user_eg +echo "user_eg 'QR1 p n Qt' 'v p' Fp" +user_eg "QR1 p n Qt" "v p" Fp +echo user_eg2 +user_eg2 +echo "user_eg2 'QR1 p' 'v p' Fp" +user_eg2 "QR1 p" "v p" Fp +echo user_eg3 +user_eg3 +echo user_eg3 eg-100 +user_eg3 eg-100 +echo user_eg3 eg-convex +user_eg3 eg-convex +echo user_eg3 eg-delaunay +user_eg3 eg-delaunay +echo user_eg3 eg-voronoi +user_eg3 eg-voronoi +echo user_eg3 eg-fifo +user_eg3 eg-fifo +echo user_eg3 rbox qhull +user_eg3 rbox qhull +echo user_eg3 rbox qhull T1 +user_eg3 rbox qhull T1 +echo user_eg3 rbox qhull d +user_eg3 rbox qhull d +echo user_eg3 rbox y c +user_eg3 rbox y c +echo 'user_eg3 rbox D2 10 2 "s r 5" qhull 's p' facets' +user_eg3 rbox D2 10 2 "s r 5" qhull 's p' facets +echo user_eg3 rbox "10 D2" eg-convex +user_eg3 rbox "10 D2" eg-convex +echo 'user_eg3 rbox "10 D2" qhull s eg-convex' +user_eg3 rbox "10 D2" qhull s eg-convex +echo 'user_eg3 rbox 10 eg-delaunay qhull "d o"' +user_eg3 rbox 10 eg-delaunay qhull "d o" +echo user_eg3 rbox D5 c P2 qhull d eg-delaunay +user_eg3 rbox D5 c P2 qhull d eg-delaunay +echo user_eg3 rbox "10 D2" eg-voronoi +user_eg3 rbox "10 D2" eg-voronoi +echo user_eg3 rbox "D5 c P2" qhull v eg-voronoi o +user_eg3 rbox "D5 c P2" qhull v eg-voronoi o +echo user_eg3 rbox "10 D2" eg-fifo +user_eg3 rbox "10 D2" eg-fifo +echo user_eg3 rbox "10 D2" qhull v eg-fifo p Fi Fo +user_eg3 rbox "10 D2" qhull v eg-fifo p Fi Fo + +echo === check front ends ========================================================== +echo "qconvex -" +qconvex - +echo "qconvex ." +qconvex . +echo "qconvex -?" +qconvex -? # [mar'19] isatty does not work for Git for Windows +echo "rbox c D3 | qconvex s n Qt" +rbox c D3 | qconvex s n Qt +echo "rbox c D2 | qconvex s i" +rbox c D2 | qconvex s i +echo "rbox c D2 | qconvex s n" +rbox c D2 | qconvex s n +echo "rbox c D2 | qconvex o" +rbox c D2 | qconvex o +echo "rbox 1000 s | qconvex s Tv FA" +rbox 1000 s | qconvex s Tv FA +echo "rbox c d D2 | qconvex s Qc Fx" +rbox c d D2 | qconvex s Qc Fx +echo "rbox y 1000 W0 | qconvex Qc s n" +rbox y 1000 W0 | qconvex Qc s n +echo "rbox y 1000 W0 | qconvex s QJ" +rbox y 1000 W0 | qconvex s QJ +echo "rbox d G1 D12 | qconvex QR0 FA" +rbox d G1 D12 | qconvex QR0 FA +echo "rbox c D6 | qconvex s FA TF500" +rbox c D6 | qconvex s FA TF500 +echo "rbox c D7 | qconvex s FA TF1000" +rbox c D7 | qconvex s FA TF1000 +echo "rbox d G1 D12 | qconvex QR0 FA Pp" +rbox d G1 D12 | qconvex QR0 FA Pp +echo "rbox c P0 d D2 | qconvex p Fa Fc FP FI Fn FN FS Fv Fx" +rbox c P0 d D2 | qconvex p Fa Fc FP FI Fn FN FS Fv Fx +echo "rbox c d D2 | qconvex s i QV0" +rbox c d D2 | qconvex s i QV0 +echo "rbox c | qconvex Q0" +rbox c | qconvex Q0 +echo "qvoronoi -" +qvoronoi - +echo "qvoronoi ." +qvoronoi . +echo "qvoronoi -?" +qvoronoi -? # [mar'19] isatty does not work for Git for Windows +echo "rbox c P0 D2 | qvoronoi s o" +rbox c P0 D2 | qvoronoi s o +echo "rbox c P0 D2 | qvoronoi Fi Tv" +rbox c P0 D2 | qvoronoi Fi Tv +echo "rbox c P0 D2 | qvoronoi Fo Tv" +rbox c P0 D2 | qvoronoi Fo Tv +echo "rbox c P0 D2 | qvoronoi Fv" +rbox c P0 D2 | qvoronoi Fv +echo "rbox c P0 D2 | qvoronoi s Qu Fv" +rbox c P0 D2 | qvoronoi s Qu Fv +echo "rbox c P0 D2 | qvoronoi s Qu Qt Fv" +rbox c P0 D2 | qvoronoi s Qu Qt Fv +echo "rbox c P0 D2 | qvoronoi Qu Fo" +rbox c P0 D2 | qvoronoi Qu Fo +echo "rbox c G1 d D2 | qvoronoi s p" +rbox c G1 d D2 | qvoronoi s p +echo "rbox c G1 d D2 | qvoronoi QJ p" +rbox c G1 d D2 | qvoronoi QJ p +echo "rbox c P-0.1 P+0.1 P+0.1 D2 | qvoronoi s Fc FP FQ Fn FN" +rbox c P-0.1 P+0.1 P+0.1 D2 | qvoronoi s Fc FP FQ Fn FN +echo "rbox P0 c D2 | qvoronoi s Fv QV0" +rbox P0 c D2 | qvoronoi s Fv QV0 +echo "qdelaunay -" +qdelaunay - +echo "qdelaunay ." +qdelaunay . +echo "qdelaunay -?" +qdelaunay -? # [mar'19] isatty does not work for Git for Windows +echo "rbox c P0 D2 | qdelaunay s o" +rbox c P0 D2 | qdelaunay s o +echo "rbox c P0 D2 | qdelaunay i" +rbox c P0 D2 | qdelaunay i +echo "rbox c P0 D2 | qdelaunay Fv" +rbox c P0 D2 | qdelaunay Fv +echo "rbox c P0 D2 | qdelaunay s Qu Qt Fv" +rbox c P0 D2 | qdelaunay s Qu Qt Fv +echo "rbox c G1 d D2 | qdelaunay s i" +rbox c G1 d D2 | qdelaunay s i +echo "rbox c G1 d D2 | qhull d Qbb Ft" +rbox c G1 d D2 | qhull d Qbb Ft +echo "rbox c G1 d D2 | qhull d Qbb QJ s Ft" +rbox c G1 d D2 | qhull d Qbb QJ s Ft +echo "rbox M3,4 z 100 D2 | qdelaunay s" +rbox M3,4 z 100 D2 | qdelaunay s +echo "rbox c P-0.1 P+0.1 P+0.1 D2 | qdelaunay s Fx Fa Fc FP FQ Fn FN" +rbox c P-0.1 P+0.1 P+0.1 D2 | qdelaunay s Fx Fa Fc FP FQ Fn FN +echo "rbox P0 P0 c D2 | qdelaunay s FP QV0" +rbox P0 P0 c D2 | qdelaunay s FP QV0 +echo "qhalf -" +qhalf - +echo "qhalf ." +qhalf . +echo "qhalf -?" +qhalf -? # [mar'19] isatty does not work for Git for Windows +echo "rbox d | qhull FQ n | qhalf s Qt H0,0,0 Fp" +rbox d | qhull FQ n | qhalf s Qt H0,0,0 Fp +echo "rbox c | qhull FQ FV n | qhalf s i" +rbox c | qhull FQ FV n | qhalf s i +echo "rbox c | qhull FQ FV n | qhalf o" +rbox c | qhull FQ FV n | qhalf o +echo "rbox d D2 | qhull FQ n | qhalf s H0 Fc FP Fn FN FQ Fv Fx" +rbox d D2 | qhull FQ n | qhalf s H0 Fc FP Fn FN FQ Fv Fx +echo "qhull - printed at end" +echo "qhull ." +qhull . +echo "qhull -?" +qhull -? # [mar'19] isatty does not work for Git for Windows +echo "rbox 1000 s | qhull Tv s FA" +rbox 1000 s | qhull Tv s FA +echo "rbox 10 D2 | qhull d QJ s i TO q_test.log.1" +rbox 10 D2 | qhull d QJ s i TO q_test.log.1 +echo "type q_test.log.1" +type q_test.log.1 +echo "rbox 10 D2 | qhull v Qbb Qt p" +rbox 10 D2 | qhull v Qbb Qt p +echo "rbox 10 D2 | qhull d Qu QJ m" +rbox 10 D2 | qhull d Qu QJ m +echo "rbox 10 D2 | qhull v Qu QJ o" +rbox 10 D2 | qhull v Qu QJ o +echo "rbox c d D2 | qhull Qc s f Fx" +rbox c d D2 | qhull Qc s f Fx +echo "rbox c | qhull FV n | qhull H Fp" +rbox c | qhull FV n | qhull H Fp +echo "rbox d D12 | qhull QR0 FA" +rbox d D12 | qhull QR0 FA +echo "rbox c D7 | qhull FA TF1000" +rbox c D7 | qhull FA TF1000 +echo "rbox y 1000 W0 | qhull Qc" +rbox y 1000 W0 | qhull Qc +echo "rbox c | qhull n" +rbox c | qhull n +echo "rbox c | qhull TA1" +rbox c | qhull TA1 +echo "rbox 10 s | qhull C1e-5 T1P-1f" +rbox 10 s | qhull C1e-5 T1P-1f +echo === check quality of Qhull for ${d:-`hostname`} ${d:-`date`} +echo "rbox 1000 W0 | qhull QR2 QJ s Fs Tv" +rbox 1000 W0 | qhull QR2 QJ s Fs Tv +echo "rbox 1000 W0 | qhull QR2 s Fs Tv" +rbox 1000 W0 | qhull QR2 s Fs Tv +echo "rbox 1000 s | qhull C0.02 Qc Tv" +rbox 1000 s | qhull C0.02 Qc Tv +echo "rbox 500 s D4 | qhull C0.01 Qc Tv" +rbox 500 s D4 | qhull C0.01 Qc Tv +echo "rbox 1000 s | qhull C-0.02 Qc Tv" +rbox 1000 s | qhull C-0.02 Qc Tv +echo "rbox 1000 s D4 | qhull C-0.01 Qc Tv" +rbox 1000 s D4 | qhull C-0.01 Qc Tv +echo "rbox 200 s D5 | qhull C-0.01 Qx Qc Tv" +rbox 200 s D5 | qhull C-0.01 Qx Qc Tv +echo "rbox 100 s D6 | qhull C-0.001 Qx Qc Tv" +rbox 100 s D6 | qhull C-0.001 Qx Qc Tv +echo "rbox 1000 W1e-4 | qhull C-1e-6 Qc Tv" +rbox 1000 W1e-4 | qhull C-1e-6 Qc Tv +echo "rbox 1000 W5e-4 D4 | qhull C-1e-5 Qc Tv" +rbox 1000 W5e-4 D4 | qhull C-1e-5 Qc Tv +echo "rbox 400 W1e-3 D5 | qhull C-1e-5 Qx Qc Tv" +rbox 400 W1e-3 D5 | qhull C-1e-5 Qx Qc Tv + +echo === check input format etc. ${d:-`date`} +echo "=== test long and short input to Qhull by hand, see eg/q_test ===" +echo "rbox d h | qhull Fd FV n FD Tcv | qhull Fd H Fp Tcv" +rbox d h | qhull Fd FV n FD Tcv | qhull Fd H Fp Tcv +echo "rbox 10 h | qhull Fd FD p Tcv | qhull Fd d Tcv" +rbox 10 h | qhull Fd FD p Tcv | qhull Fd d Tcv + +echo === check rbox ${d:-`date`} +echo "rbox 3 n D2" +rbox 3 n D2 +echo "rbox 3 D2" +rbox 3 D2 +echo "rbox 3 h D2" +rbox 3 h D2 +echo "rbox 3 z D2" +rbox 3 z D2 +echo "rbox 3 z h D2" +rbox 3 z h D2 +echo "rbox 3 B10 D2" +rbox 3 B10 D2 +echo "rbox 3 B10 D2 C2,1E-13,1" +rbox 3 B10 D2 C2,1E-13,1 +echo "rbox 3 z B10 D2" +rbox 3 z B10 D2 +echo "rbox 4 L2 r D2" +rbox 4 L2 r D2 +echo "rbox 8 L2 r D2" +rbox 8 L2 r D2 +echo "rbox 8 L2 D2 C1,1E-13,2" +rbox 8 L2 D2 C1,1E-13,2 +echo "rbox 4 L4 r D3" +rbox 4 L4 r D3 +echo "rbox 4 L4 s D5 W1e-3" +rbox 4 L4 s D5 W1e-3 +echo "rbox 4 L4 s D5 W1e-3 C1,1E-12" +rbox 4 L4 s D5 W1e-3 C1,1E-12 +echo "rbox y" +rbox y +echo "rbox 10 M3,4" +rbox 10 M3,4 +echo "rbox 10 M3,4 C1,1E-14" +rbox 10 M3,4 C1,1E-14 +echo "rbox 27 M1,0,1" +rbox 27 M1,0,1 +echo "rbox 10 L4 r D3 | qhull Tcv" +rbox 10 L4 r D3 | qhull Tcv +echo "rbox 10 L4 s D5 W1e-3 | qhull Tcv" +rbox 10 L4 s D5 W1e-3 | qhull Tcv +echo "rbox 10 L4 s D5 W1e-3 C1,1E-12 | qhull Tcv" +rbox 10 L4 s D5 W1e-3 C1,1E-12 | qhull Tcv +echo "rbox 10 L6 D3 | qhull Tcv" +rbox 10 L6 D3 | qhull Tcv +echo "rbox 10 L1.1 s D4 | qhull Tcv" +rbox 10 L1.1 s D4 | qhull Tcv +echo "rbox y r 100 W0 O0.5 | qhull s p Tcv" +rbox y r 100 W0 O0.5 | qhull s p Tcv +echo "rbox x r 100 W0 O0.5 | qhull s Tcv" +rbox x r 100 W0 O0.5 | qhull s Tcv +echo "rbox 12 D8 | qhull Tcv" +rbox 12 D8 | qhull Tcv +echo "rbox 12 D9 | qhull Tcv" +rbox 12 D9 | qhull Tcv +echo "rbox 1000 D4 | qhull s i A-0.97 C0.2 A0.7 Tcv" +rbox 1000 D4 | qhull s i A-0.97 C0.2 A0.7 Tcv +echo "rbox 3 D2 | qhull Qb0B1:-2 p" +rbox 3 D2 | qhull Qb0B1:-2 p +echo "rbox 100 r D2 | qhull Pd0:0.7 PD0:0.8 Pg n Tcv" +rbox 100 r D2 | qhull Pd0:0.7 PD0:0.8 Pg n Tcv +echo "rbox 1000 s | qhull C0.05 Tcv" +rbox 1000 s | qhull C0.05 Tcv +echo "rbox 1000 s t | qhull Qm C0.05 Tcv" +rbox 1000 s t | qhull Qm C0.05 Tcv +echo "rbox 500 D2 | qhull n A-0.95 C0.1 Tcv" +rbox 500 D2 | qhull n A-0.95 C0.1 Tcv +echo "rbox 500 s P1,1,1 | qhull QgG0 Pp Tcv" +rbox 500 s P1,1,1 | qhull QgG0 Pp Tcv +echo "rbox d | qhull m" +rbox d | qhull m +echo "rbox d | qhull FM" +rbox d | qhull FM +echo "rbox c D2 | qhull Tcv Q0" +rbox c D2 | qhull Tcv Q0 +echo "rbox d D2 | qhull Tcv" +rbox d D2 | qhull Tcv +echo "rbox c D3 | qhull Tcv Q0" +rbox c D3 | qhull Tcv Q0 +echo "rbox d D3 | qhull Tcv" +rbox d D3 | qhull Tcv +echo "rbox c D4 | qhull Tcv Q0" +rbox c D4 | qhull Tcv Q0 +echo "rbox d D4 | qhull Tcv" +rbox d D4 | qhull Tcv +echo "rbox c D5 | qhull Tcv Q0" +rbox c D5 | qhull Tcv Q0 +echo "rbox d D5 | qhull Tcv" +rbox d D5 | qhull Tcv +echo "rbox c D6 | qhull Tcv Q0" +rbox c D6 | qhull Tcv Q0 +echo "rbox d D6 | qhull Tcv" +rbox d D6 | qhull Tcv +echo "rbox d D7 | qhull Tcv" +rbox d D7 | qhull Tcv +echo "rbox c D2 | qhull Tcv C-0" +rbox c D2 | qhull Tcv C-0 +echo "rbox c D3 | qhull Tcv C-0" +rbox c D3 | qhull Tcv C-0 +echo "rbox c D4 | qhull Tcv C-0" +rbox c D4 | qhull Tcv C-0 +echo "rbox c D5 | qhull Tcv C-0" +rbox c D5 | qhull Tcv C-0 +echo "rbox c D6 | qhull Tcv C-0" +rbox c D6 | qhull Tcv C-0 +echo "rbox c D7 | qhull Tv C-0" +rbox c D7 | qhull Tv C-0 +echo "rbox 20 l D3 | qhull Tcv" +rbox 20 l D3 | qhull Tcv +echo "rbox 100 s D2 | qhull Tcv" +rbox 100 s D2 | qhull Tcv +echo "rbox 100 s D3 | qhull Tcv" +rbox 100 s D3 | qhull Tcv +echo "rbox 100 s D4 | qhull Tcv" +rbox 100 s D4 | qhull Tcv +echo "rbox 100 s c D4 | qhull Tcv" +rbox 100 s c D4 | qhull Tcv +echo "rbox 100 s d G1.5 D4 | qhull Tcv" +rbox 100 s d G1.5 D4 | qhull Tcv +echo "rbox 100 s W1e-2 | qhull Tcv" +rbox 100 s W1e-2 | qhull Tcv +echo "rbox 100 | qhull Tcv" +rbox 100 | qhull Tcv +echo "rbox 100 W1e-3 | qhull Tcv" +rbox 100 W1e-3 | qhull Tcv +echo "rbox 100 r D2 | qhull Tcv" +rbox 100 r D2 | qhull Tcv +echo "rbox 100 r s Z1 | qhull Tcv" +rbox 100 r s Z1 | qhull Tcv +echo "rbox 100 r s Z1 G0.1 | qhull Tcv C-0" +rbox 100 r s Z1 G0.1 | qhull Tcv C-0 +echo "rbox 100 s Z1 G0.1 | qhull Tcv" +rbox 100 s Z1 G0.1 | qhull Tcv +echo "rbox 100 s Z1e-5 G0.1 | qhull Tc Pp" +rbox 100 s Z1e-5 G0.1 | qhull Tc Pp + +echo === check qhull option errors ${d:-`date`} + + +echo "rbox 10 | qhull d H0" +rbox 10 | qhull d H0 +echo "rbox 10 | qhull Zza" +rbox 10 | qhull Zza +echo "rbox 10 | qhull Zza Qw" +rbox 10 | qhull Zza Qw +echo "rbox 10 | qhull Q999" +rbox 10 | qhull Q999 +echo "rbox 10 | qhull Q999 Qw" +rbox 10 | qhull Q999 Qw +echo "qhull TIxyzlkajdfhwh" +qhull TIxyzlkajdfhwh +echo "rbox 10 >r.x" +rbox 10 >r.x +echo "qhull TIr.x" +qhull TIr.x +echo "qhull p TI r.x TO x.x" +qhull p TI r.x TO x.x +echo "type x.x" +type x.x + +echo === check qhull output formats ${d:-`date`} +echo "rbox 5 r s D2 | qhull Tcv" +rbox 5 r s D2 | qhull Tcv +echo "rbox 5 r s D2 | qhull s " +rbox 5 r s D2 | qhull s +echo "rbox 5 r s D2 | qhull s o " +rbox 5 r s D2 | qhull s o +echo "rbox 5 r s D2 | qhull f" +rbox 5 r s D2 | qhull f +echo "rbox 5 r s D2 | qhull i " +rbox 5 r s D2 | qhull i +echo "rbox 5 r s D2 | qhull m " +rbox 5 r s D2 | qhull m +echo "rbox 5 r s D2 | qhull FM " +rbox 5 r s D2 | qhull FM +echo "rbox 5 r s D2 | qhull n " +rbox 5 r s D2 | qhull n +echo "rbox 5 r s D2 | qhull p " +rbox 5 r s D2 | qhull p +echo "rbox 5 r s D2 | qhull o " +rbox 5 r s D2 | qhull o +echo "rbox 5 r s D2 | qhull Ft" +rbox 5 r s D2 | qhull Ft +echo "rbox 5 r s D2 | qhull Fx" +rbox 5 r s D2 | qhull Fx +echo "rbox 5 r s D2 | qhull p n i p p" +rbox 5 r s D2 | qhull p n i p p +echo "rbox 10 D3 | qhull f Tcv" +rbox 10 D3 | qhull f Tcv +echo "rbox 10 D3 | qhull i" +rbox 10 D3 | qhull i +echo "rbox 10 D3 | qhull p " +rbox 10 D3 | qhull p +echo "rbox 10 D3 | qhull o " +rbox 10 D3 | qhull o +echo "rbox 10 D3 | qhull Fx" +rbox 10 D3 | qhull Fx +echo "rbox 27 M1,0,1 | qhull Qc" +rbox 27 M1,0,1 | qhull Qc +echo "rbox 50 D3 s | qhull C0.1 Qc Pd0d1d2 Pg s p Tcv" +rbox 50 D3 s | qhull C0.1 Qc Pd0d1d2 Pg s p Tcv +echo "rbox 10 D2 P0 P1e-15 | qhull d Qc FP s Tcv" +rbox 10 D2 P0 P1e-15 | qhull d Qc FP s Tcv +echo "rbox 100 s | qhull C-0.003 Qc FP s" +rbox 100 s | qhull C-0.003 Qc FP s +echo "rbox 100 s D2 | qhull C0.1 i Fx Tcv" +rbox 100 s D2 | qhull C0.1 i Fx Tcv +echo "rbox 4 s D3 | qhull Qc Ghipv Tcv " +rbox 4 s D3 | qhull Qc Ghipv Tcv +echo "rbox 6 D4 | qhull f Tcv" +rbox 6 D4 | qhull f Tcv +echo "rbox 6 D4 | qhull i" +rbox 6 D4 | qhull i +echo "rbox 6 D4 | qhull p " +rbox 6 D4 | qhull p +echo "rbox 6 D4 | qhull o" +rbox 6 D4 | qhull o +echo "rbox 1000 s D2 | qhull FA Tcv" +rbox 1000 s D2 | qhull FA Tcv +echo "rbox 1000 s | qhull FA Tcv" +rbox 1000 s | qhull FA Tcv +echo "rbox c D4 | qhull FA Tcv" +rbox c D4 | qhull FA Tcv +echo "rbox c D5 | qhull FA Tcv" +rbox c D5 | qhull FA Tcv +echo "rbox c D5 | qhull FA Qt Tcv" +rbox c D5 | qhull FA Qt Tcv +echo "rbox 10 D2 | qhull d FA Tcv" +rbox 10 D2 | qhull d FA Tcv +echo "rbox 10 D2 | qhull d Qu FA Tcv" +rbox 10 D2 | qhull d Qu FA Tcv +echo "rbox 10 D2 | qhull FA Tcv" +rbox 10 D2 | qhull FA Tcv +echo "rbox 10 c D2 | qhull Fx Tcv" +rbox 10 c D2 | qhull Fx Tcv +echo "rbox 1000 s | qhull FS Tcv" +rbox 1000 s | qhull FS Tcv +echo "rbox 10 W0 D2 | qhull p Qc FcC Tcv" +rbox 10 W0 D2 | qhull p Qc FcC Tcv +echo "rbox 4 z h s D2 | qhull Fd s n FD Tcv" +rbox 4 z h s D2 | qhull Fd s n FD Tcv +echo "rbox 6 s D3 | qhull C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv" +rbox 6 s D3 | qhull C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv +echo "rbox P0.5,0.5 P0.5,0.5 W0 5 D2 | qhull d FN Qc" +rbox P0.5,0.5 P0.5,0.5 W0 5 D2 | qhull d FN Qc +echo "rbox 10 D3 | qhull Fa PA5" +rbox 10 D3 | qhull Fa PA5 +echo "rbox 10 D3 | qhull Fa PF0.4" +rbox 10 D3 | qhull Fa PF0.4 + +echo === test Qt ${d:-`date`} +echo "rbox c | qhull Qt s o Tcv" +rbox c | qhull Qt s o Tcv +echo "rbox c | qhull Qt f i" +rbox c | qhull Qt f i +echo "rbox c | qhull Qt m FM n" +rbox c | qhull Qt m FM n +echo "rbox c | qhull Qt p o" +rbox c | qhull Qt p o +echo "rbox c | qhull Qt Fx" +rbox c | qhull Qt Fx +echo "rbox c | qhull Qt FA s Fa" +rbox c | qhull Qt FA s Fa +echo "rbox 6 r s c G0.1 D2 | qhull Qt d FA Tcv" +rbox 6 r s c G0.1 D2 | qhull Qt d FA Tcv +echo "rbox 6 r s c G0.1 D2 | qhull d FA Tcv" +rbox 6 r s c G0.1 D2 | qhull d FA Tcv +echo "rbox 6 r s c G0.1 D2 | qhull Qt v p Tcv" +rbox 6 r s c G0.1 D2 | qhull Qt v p Tcv +echo "rbox c | qhull Qt C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv" +rbox c | qhull Qt C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv +echo "rbox 6 r s c G0.1 D2 P0.1,0.1 | qhull s FP d FO Qt" +rbox 6 r s c G0.1 D2 P0.1,0.1 | qhull s FP d FO Qt +echo "rbox 100 W0 | qhull Tv Q11 FO" +rbox 100 W0 | qhull Tv Q11 FO + +echo === test unbounded intersection +echo "rbox c | qhull PD0:0.5 n | qhull H0 Fp Tcv" +rbox c | qhull PD0:0.5 n | qhull H0 Fp Tcv +echo "rbox 1000 W1e-3 D3 | qhull PA8 Fa FS s n Tcv" +rbox 1000 W1e-3 D3 | qhull PA8 Fa FS s n Tcv +echo "rbox 1000 W1e-3 D3 | qhull C-0.01 PM10 Fm n Tcv Qc" +rbox 1000 W1e-3 D3 | qhull C-0.01 PM10 Fm n Tcv Qc +echo "rbox 1000 W1e-3 D3 | qhull C-0.01 PA8 PG n Tcv Qc" +rbox 1000 W1e-3 D3 | qhull C-0.01 PA8 PG n Tcv Qc +echo "rbox 10 | qhull FO Tz TO q_test.log.1" +rbox 10 | qhull FO Tz TO q_test.log.1 +echo "type q_test.log.1" +type q_test.log.1 + +echo === check Delaunay/Voronoi ${d:-`date`} +echo "rbox 10 D2 | qhull d Tcv" +rbox 10 D2 | qhull d Tcv +echo "rbox 10 D2 | qhull d Qz Tcv" +rbox 10 D2 | qhull d Qz Tcv +echo "rbox 10 D3 | qhull d Tcv" +rbox 10 D3 | qhull d Tcv +echo "rbox c | qhull d Qz Ft Tcv" +rbox c | qhull d Qz Ft Tcv +echo "rbox 10 s D2 c | qhull d Tcv" +rbox 10 s D2 c | qhull d Tcv +echo "rbox 10 s D2 | qhull d Tcv Qz Q8" +rbox 10 s D2 | qhull d Tcv Qz Q8 +echo "rbox 10 D2 | qhull d Tcv p" +rbox 10 D2 | qhull d Tcv p +echo "rbox 10 D2 | qhull d Tcv i" +rbox 10 D2 | qhull d Tcv i +echo "rbox 10 D2 | qhull d Tcv o" +rbox 10 D2 | qhull d Tcv o +echo "rbox 10 D2 | qhull v Tcv o" +rbox 10 D2 | qhull v Tcv o +echo "rbox 10 D2 | qhull v Tcv p" +rbox 10 D2 | qhull v Tcv p +echo "rbox 10 D2 | qhull v Tcv G" +rbox 10 D2 | qhull v Tcv G +echo "rbox 10 D2 | qhull v Tcv Fv" +rbox 10 D2 | qhull v Tcv Fv +echo "rbox 10 D2 | qhull v Tcv Fi" +rbox 10 D2 | qhull v Tcv Fi +echo "rbox 10 D2 | qhull v Tcv Fo" +rbox 10 D2 | qhull v Tcv Fo +echo "rbox 10 D2 | qhull v Qu o Fv Fi Fo Tcv" +rbox 10 D2 | qhull v Qu o Fv Fi Fo Tcv +echo "rbox 10 D3 | qhull v Fv Tcv" +rbox 10 D3 | qhull v Fv Tcv +echo "rbox 10 D3 | qhull v fi Tcv" +rbox 10 D3 | qhull v Fi Tcv +echo "rbox 10 D3 | qhull v Fo Tcv" +rbox 10 D3 | qhull v Fo Tcv +echo "rbox 10 D3 | qhull v Qu o Fv Fi Fo Tcv" +rbox 10 D3 | qhull v Qu o Fv Fi Fo Tcv +echo "rbox 5 D2 | qhull v f FnN o" +rbox 5 D2 | qhull v f FnN o + +echo === check Halfspace, showing the input ${d:-`date`} +echo === the Qhull pipeline recreates 100 4-D cospherical points with the same area and volume +echo "rbox 100 s D4 | qhull FA FV s" +rbox 100 s D4 | qhull FA FV s +echo "rbox 100 s D4 | qhull FQ FA FV n | qhull s H" +rbox 100 s D4 | qhull FQ FA FV n s | qhull s H +echo "rbox 100 s D4 | qhull FQ FA FV n s Tcv | qhull FQ s H Fp Tcv | qhull FA Tcv" +rbox 100 s D4 | qhull FQ FA FV n s Tcv | qhull FQ s H Fp Tcv | qhull FA Tcv +echo === the Qhull pipeline recreates a 3-D tetrahedron +echo "rbox d D3 | qhull n FD" +rbox d D3 | qhull n FD +echo "rbox d D3 | qhull s n FD Tcv | qhull s Fd H0.1,0.1 Fp Tcv" +rbox d D3 | qhull s n FD Tcv | qhull s Fd H0.1,0.1 Fp Tcv +echo "rbox 5 r D2 | qhull s n Tcv" +echo === the Qhull pipeline recreates a regular 2-D pentagon +rbox 5 r D2 | qhull FQ n +echo "rbox 5 r D2 | qhull s FQ n Tcv | qhull s H0 Fp Tcv" +rbox 5 r D2 | qhull s FQ n Tcv | qhull s H0 Fp Tcv + +echo === check qhull ${d:-`date`} +echo "rbox 10 s D3 | qhull Tcv" +rbox 10 s D3 | qhull Tcv +echo "rbox 10 s D3 | qhull f Pd0:0.5 Pd2 Pg Tcv" +rbox 10 s D3 | qhull f Pd0:0.5 Pd2 Pg Tcv +echo "rbox 10 s D3 | qhull f Tcv PD2:-0.5 Pg" +rbox 10 s D3 | qhull f Tcv PD2:-0.5 Pg +echo "rbox 10 s D3 | qhull QR-1" +rbox 10 s D3 | qhull QR-1 +echo "rbox 10 s D3 | qhull QR-40" +rbox 10 s D3 | qhull QR-40 +echo "rbox 1000 D3 | qhull Tcvs" +rbox 1000 D3 | qhull Tcvs +echo "Test tracing 'Tn', combine stderr/stdout 'Tz', flush fprintf 'Tf'" +echo "rbox 100 D3 | qhull T1 Tz Tf TA1 TO q_test.log.1" +rbox 100 D3 | qhull T1 Tz Tf TA1 TO q_test.log.1 +echo "type q_test.log.1" +type q_test.log.1 +echo "del q_test.log.1" +del q_test.log.1 +echo "rbox 100 s D3 | qhull TcvA10" +rbox 100 s D3 | qhull TcvA10 +echo "rbox 100 s D3 | qhull TcvV-2" +rbox 100 s D3 | qhull TcvV-2 +echo "rbox 100 s D3 | qhull TcvC2" +rbox 100 s D3 | qhull TcvC2 +echo "rbox 100 s D3 | qhull TcvV2" +rbox 100 s D3 | qhull TcvV2 +echo "rbox 100 s D3 | qhull T1cvV2P2" +rbox 100 s D3 | qhull T1cvV2P2 +echo "rbox 100 s D3 | qhull TcvF100" +rbox 100 s D3 | qhull TcvF100 +echo "rbox 100 s D3 | qhull Qf Tcv" +rbox 100 s D3 | qhull Qf Tcv +echo "rbox 100 D3 | qhull Tcv" +rbox 100 D3 | qhull Tcv +echo "rbox 100 D3 | qhull Qs Tcv" +rbox 100 D3 | qhull Qs Tcv +echo "rbox 100 D5 | qhull Qs Tcv" +rbox 100 D5 | qhull Qs Tcv +echo "rbox 100 D3 | qhull Qr Tcv" +rbox 100 D3 | qhull Qr Tcv +echo "rbox 100 D3 | qhull Qxv Tcv" +rbox 100 D3 | qhull Qxv Tcv +echo "rbox 100 D3 | qhull Qi f Pd0 Pd1 Pd2 Pg Tcv" +rbox 100 D3 | qhull Qi f Pd0 Pd1 Pd2 Pg Tcv +echo "rbox c d | qhull Qc f Tcv" +rbox c d | qhull Qc f Tcv +echo "rbox c d | qhull Qc p Tcv" +rbox c d | qhull Qc p Tcv +echo "rbox 100 D3 | qhull QbB FO Tcv" +rbox 100 D3 | qhull QbB FO Tcv +echo "rbox 1000 D2 B1e6 | qhull d Qbb FO Tcv" +rbox 1000 D2 B1e6 | qhull d Qbb FO Tcv +echo "rbox 10 D3 | qhull QbB p Tcv" +rbox 10 D3 | qhull QbB p Tcv +echo "rbox 10 D3 | qhull Qbb p Tcv" +rbox 10 D3 | qhull Qbb p Tcv +echo "rbox 10 D3 | qhull Qb0:-10B2:20 p Tcv" +rbox 10 D3 | qhull Qb0:-10B2:20 p Tcv +echo "rbox 10 D3 | qhull Qb0:-10B2:20 p Tcv | qhull QbB p Tcv" +rbox 10 D3 | qhull Qb0:-10B2:20 p Tcv | qhull QbB p Tcv +echo "rbox 10 D3 | qhull Qb1:0B1:0 d Tcv Q8" +rbox 10 D3 | qhull Qb1:0B1:0 d Tcv Q8 +echo "rbox 10 D3 | qhull Qb1:0B1:0B2:0 d Tcv Q8" +rbox 10 D3 | qhull Qb1:0B1:0B2:0 d Tcv Q8 +echo "rbox 10 D3 | qhull Qb1:0 d Tcv" +rbox 10 D3 | qhull Qb1:0 d Tcv +echo "rbox 10 D3 | qhull Qb1:0B1:0 Tcv" +rbox 10 D3 | qhull Qb1:0B1:0 Tcv +echo "== next command will error ${d:-`date`} ==" +echo "rbox 10 D2 | qhull Qb1:1B1:1 Tcv" +rbox 10 D2 | qhull Qb1:1B1:1 Tcv +echo "rbox 200 L20 D2 t | qhull FO Tcv C-0" +rbox 200 L20 D2 t | qhull FO Tcv C-0 +echo "rbox 1000 L20 t | qhull FO Tcv C-0" +rbox 1000 L20 t | qhull FO Tcv C-0 +echo "rbox 200 L20 D4 t | qhull FO Tcv C-0" +rbox 200 L20 D4 t | qhull FO Tcv C-0 +echo "rbox 200 L20 D5 t | qhull FO Tcv Qx" +rbox 200 L20 D5 t | qhull FO Tcv Qx +echo "rbox 1000 W1e-3 s D2 t | qhull d FO Tcv Qu Q0" +rbox 1000 W1e-3 s D2 t | qhull d FO Tcv Qu Q0 +echo "rbox 1000 W1e-3 s D2 t | qhull d FO Tcv Qu C-0" +rbox 1000 W1e-3 s D2 t | qhull d FO Tcv Qu C-0 + +echo === check joggle and TRn ${d:-`date`} +echo "rbox 100 W0 | qhull QJ1e-14 Qc TR100 Tv" +rbox 100 W0 | qhull QJ1e-14 Qc TR100 Tv +echo "rbox 100 W0 | qhull QJ1e-13 Qc TR100 Tv" +rbox 100 W0 | qhull QJ1e-13 Qc TR100 Tv +echo "rbox 100 W0 | qhull QJ1e-12 Qc TR100 Tv" +rbox 100 W0 | qhull QJ1e-12 Qc TR100 Tv +echo "rbox 100 W0 | qhull QJ1e-11 Qc TR100 Tv" +rbox 100 W0 | qhull QJ1e-11 Qc TR100 Tv +echo "rbox 100 W0 | qhull QJ1e-10 Qc TR100 Tv" +rbox 100 W0 | qhull QJ1e-10 Qc TR100 Tv +echo "rbox 100 | qhull d QJ Qb0:1e4 QB0:1e5 Qb1:1e4 QB1:1e6 Qb2:1e5 QB2:1e7 FO Tv" +rbox 100 | qhull d QJ Qb0:1e4 QB0:1e5 Qb1:1e4 QB1:1e6 Qb2:1e5 QB2:1e7 FO Tv + +echo === check precision options ${d:-`date`} +echo "rbox 100 D3 s | qhull E0.01 Qx Tcv FO" +rbox 100 D3 s | qhull E0.01 Qx Tcv FO +echo "rbox 100 D3 W1e-1 | qhull W1e-3 Tcv" +rbox 100 D3 W1e-1 | qhull W1e-3 Tcv +echo "rbox 100 D3 W1e-1 | qhull W1e-2 Tcv Q0" +rbox 100 D3 W1e-1 | qhull W1e-2 Tcv Q0 +echo "rbox 100 D3 W1e-1 | qhull W1e-2 Tcv" +rbox 100 D3 W1e-1 | qhull W1e-2 Tcv +echo "rbox 100 D3 W1e-1 | qhull W1e-1 Tcv" +rbox 100 D3 W1e-1 | qhull W1e-1 Tcv +echo "rbox 15 D2 P0 P1e-14,1e-14 | qhull d Quc Tcv" +rbox 15 D2 P0 P1e-14,1e-14 | qhull d Quc Tcv +echo "rbox 15 D3 P0 P1e-12,1e-14,1e-14 | qhull d Qcu Tcv" +rbox 15 D3 P0 P1e-12,1e-14,1e-14 | qhull d Qcu Tcv +echo "rbox 1000 s D3 | qhull C-0.01 Tcv Qc" +rbox 1000 s D3 | qhull C-0.01 Tcv Qc +echo "rbox 1000 s D3 | qhull C-0.01 V0 Qc Tcv" +rbox 1000 s D3 | qhull C-0.01 V0 Qc Tcv +echo "rbox 1000 s D3 | qhull C-0.01 U0 Qc Tcv" +rbox 1000 s D3 | qhull C-0.01 U0 Qc Tcv +echo "rbox 1000 s D3 | qhull C-0.01 V0 Qcm Tcv" +rbox 1000 s D3 | qhull C-0.01 V0 Qcm Tcv +echo "rbox 1000 s D3 | qhull C-0.01 Qcm Tcv" +rbox 1000 s D3 | qhull C-0.01 Qcm Tcv +echo "rbox 1000 s D3 | qhull C-0.01 Q1 FO Tcv Qc" +rbox 1000 s D3 | qhull C-0.01 Q1 FO Tcv Qc +echo "rbox 1000 s D3 | qhull C-0.01 Q2 FO Tcv Qc" +rbox 1000 s D3 | qhull C-0.01 Q2 FO Tcv Qc +echo "rbox 1000 s D3 | qhull C-0.01 Q3 FO Tcv Qc" +rbox 1000 s D3 | qhull C-0.01 Q3 FO Tcv Qc +echo "rbox 1000 s D3 | qhull C-0.01 Q4 FO Tcv Qc" +rbox 1000 s D3 | qhull C-0.01 Q4 FO Tcv Qc +echo === this may generate an error ${d:-`date`} +echo "rbox 1000 s D3 | qhull C-0.01 Q5 FO Tcv" +rbox 1000 s D3 | qhull C-0.01 Q5 FO Tcv +echo === this should generate an error ${d:-`date`} +echo "rbox 1000 s D3 | qhull C-0.01 Q6 FO Po Tcv Qc" +rbox 1000 s D3 | qhull C-0.01 Q6 FO Po Tcv Qc +echo "rbox 1000 s D3 | qhull C-0.01 Q7 FO Tcv Qc" +rbox 1000 s D3 | qhull C-0.01 Q7 FO Tcv Qc +echo "rbox 1000 s D3 | qhull C-0.01 Qx Tcv Qc" +rbox 1000 s D3 | qhull C-0.01 Qx Tcv Qc +echo "=== this may generate an error e.g., t1263080158 ${d:-`date`}" +echo "rbox 100 s D3 t | qhull R1e-3 Tcv Qc" +rbox 100 s D3 t | qhull R1e-3 Tcv Qc +echo "rbox 100 s D3 t | qhull R1e-2 Tcv Qc" +rbox 100 s D3 t | qhull R1e-2 Tcv Qc +echo "rbox 500 s D3 t | qhull R0.05 A-1 Tcv Qc" +rbox 500 s D3 t | qhull R0.05 A-1 Tcv Qc +echo "rbox 100 W0 D3 t | qhull R1e-3 Tcv Qc" +rbox 100 W0 D3 t | qhull R1e-3 Tcv Qc +echo "rbox 100 W0 D3 t | qhull R1e-3 Qx Tcv Qc" +rbox 100 W0 D3 t | qhull R1e-3 Qx Tcv Qc +echo "rbox 100 W0 D3 t | qhull R1e-2 Tcv Qc" +rbox 100 W0 D3 t | qhull R1e-2 Tcv Qc +echo "rbox 100 W0 D3 t | qhull R1e-2 Qx Tcv Qc" +rbox 100 W0 D3 t | qhull R1e-2 Qx Tcv Qc +echo "rbox 500 W0 D3 t | qhull R0.05 A-1 Tcv Qc" +rbox 500 W0 D3 t | qhull R0.05 A-1 Tcv Qc +echo "rbox 500 W0 D3 t | qhull R0.05 Qx Tcv Qc" +rbox 500 W0 D3 t | qhull R0.05 Qx Tcv Qc +echo "rbox 1000 W1e-20 t | qhull Tcv Qc" +rbox 1000 W1e-20 t | qhull Tcv Qc +echo "rbox 1000 W1e-20 D4 t | qhull Tcv Qc" +rbox 1000 W1e-20 D4 t | qhull Tcv Qc +echo "rbox 500 W1e-20 D5 t | qhull Tv Qc" +rbox 500 W1e-20 D5 t | qhull Tv Qc +echo "rbox 100 W1e-20 D6 t | qhull Tv Qc" +rbox 100 W1e-20 D6 t | qhull Tv Qc +echo "rbox 50 W1e-20 D6 t | qhull Qv Tv Qc" +rbox 50 W1e-20 D6 t | qhull Qv Tv Qc +echo "rbox 10000 D4 t | qhull QR0 Qc C-0.01 A0.3 Tv" +rbox 10000 D4 t | qhull QR0 Qc C-0.01 A0.3 Tv +echo "rbox 1000 D2 t | qhull d QR0 Qc C-1e-8 Qu Tv" +rbox 1000 D2 t | qhull d QR0 Qc C-1e-8 Qu Tv +echo "rbox 300 D5 t |qhull A-0.999 Qx Qc Tcv" +rbox 300 D5 t |qhull A-0.999 Qx Qc Tcv +echo "rbox 100 D6 t |qhull A-0.9999 Qx Qc Tcv" +rbox 100 D6 t |qhull A-0.9999 Qx Qc Tcv +echo "rbox 50 D7 t |qhull A-0.99999 Qx Qc Tcv W0.1" +rbox 50 D7 t |qhull A-0.99999 Qx Qc Tcv W0.1 + +echo === check bad cases for Qhull. May cause errors ${d:-`date`} +echo "rbox 1000 L100000 s G1e-6 t | qhull Tv" +rbox 1000 L100000 s G1e-6 t | qhull Tv +echo "rbox 1000 L100000 s G1e-6 t | qhull Tv Q10" +rbox 1000 L100000 s G1e-6 t | qhull Tv Q10 +echo "rbox 1000 s Z1 G1e-13 t | qhull Tv" +rbox 1000 s Z1 G1e-13 t | qhull Tv +echo "rbox 1000 s W1e-13 P0 t | qhull d Qbb Qc Q12 Tv" +rbox 1000 s W1e-13 P0 t | qhull d Qbb Qc Q12 Tv +echo "rbox 1000 s W1e-13 t | qhull d Q12 Tv" +rbox 1000 s W1e-13 t | qhull d Q12 Tv +echo "rbox 1000 s W1e-13 t D2 | qhull d Tv" +rbox 1000 s W1e-13 t D2 | qhull d Tv + +echo ======================================================= +echo ======================================================= +echo === The following commands may cause errors =========== +echo ======================================================= +echo ======================================================= +echo "rbox c D7 | qhull Q0 Tcv" +rbox c D7 | qhull Q0 Tcv +echo "rbox 100 s D3 | qhull Q0 E1e-3 Tc Po" +rbox 100 s D3 | qhull Q0 E1e-3 Tc Po +echo "rbox 100 s D3 | qhull Q0 E1e-2 Tc Po" +rbox 100 s D3 | qhull Q0 E1e-2 Tc Po +echo "rbox 100 s D3 | qhull Q0 E1e-1 Tc Po" +rbox 100 s D3 | qhull Q0 E1e-1 Tc Po +echo "rbox 100 s D3 | qhull Q0 R1e-3 Tc Po" +rbox 100 s D3 | qhull Q0 R1e-3 Tc Po +echo "rbox 100 s D3 | qhull Q0 R1e-2 Tc Po" +rbox 100 s D3 | qhull Q0 R1e-2 Tc Po +echo "rbox 100 s D3 | qhull Q0 R0.05 Tc" +rbox 100 s D3 | qhull Q0 R0.05 Tc +echo "rbox 100 s D3 | qhull Q0 R0.05 Tc Po" +rbox 100 s D3 | qhull Q0 R0.05 Tc Po +echo "rbox 1000 W1e-7 | qhull Q0 Tc Po" +rbox 1000 W1e-7 | qhull Q0 Tc Po +echo "rbox 50 s | qhull Q0 V0.05 W0.01 Tc Po" +rbox 50 s | qhull Q0 V0.05 W0.01 Tc Po +echo "rbox 100 s D5 | qhull Q0 R1e-2 Tc Po" +rbox 100 s D5 | qhull Q0 R1e-2 Tc Po +echo "rbox L100 10000 D4 s C1,1e-13 t2 | qhull" +rbox L100 10000 D4 s C1,1e-13 t2 | qhull +echo "rbox L100 10000 D4 s C1,1e-13 t2 | qhull Q12" +rbox L100 10000 D4 s C1,1e-13 t2 | qhull Q12 +echo "rbox 50 C1,1E-13 t1447644703 | qhull d" +rbox 50 C1,1E-13 t1447644703 | qhull d +echo "rbox 50 C1,1E-13 t1447644703 | qhull d Q12" +rbox 50 C1,1E-13 t1447644703 | qhull d Q12 +echo "rbox 50 C1,1E-13 t1447644703 | qhull d Q14" +rbox 50 C1,1E-13 t1447644703 | qhull d Q14 + +echo "=======================================================" +echo "=== Testing done. Print documentation" +echo "=======================================================" +echo "qhull -" +qhull - +echo "rbox" +rbox -echo "# end of q_test" >>q_test.x +echo "# end of q_test" diff -Nru qhull-2015.2/eg/q_test-ok.txt qhull-2020.2/eg/q_test-ok.txt --- qhull-2015.2/eg/q_test-ok.txt 2016-01-19 03:06:00.000000000 +0000 +++ qhull-2020.2/eg/q_test-ok.txt 2020-07-29 21:36:41.000000000 +0000 @@ -1,39 +1,17 @@ ============================================ == make qtest ============================== ============================================ -== Mon Jan 18 21:22:19 EST 2016 +== Fri, Jul 24, 2020 10:27:09 PM ============================================ == Test non-reentrant qset.c with mem.c ==== ============================================ bin/testqset 10000 - - -Not testing qh_setduplicate and qh_setfree2. - These routines use heap-allocated set contents. See qhull tests. - -memory statistics: - 124 quick allocations - 25 short allocations - 8230 long allocations - 148 short frees - 8230 long frees - 24 bytes of short memory in use - 760 bytes of short memory in freelists - 130280 bytes of dropped short memory - 68 bytes of unused short memory (estimated) - 105548 bytes of long memory allocated (max, except for input) - 0 bytes of long memory in use (in 0 pieces) - 131064 bytes of short memory buffers (minus links) - 65536 bytes per short memory buffer (initially 131072 bytes) - 1135 calls to qh_setlarger -5.6e+002 average copy size - freelists(bytes->count): 16->3 24->5 32->6 40->10 - - -testqset: OK - qh_meminitbuffers: memory initialized with alignment 8 +qh_memsize: quick memory of 16 bytes +qh_memsize: quick memory of 24 bytes +qh_memsize: quick memory of 32 bytes +qh_memsize: quick memory of 40 bytes SETelemsize is 4 bytes for pointer-to-int @@ -58,19 +36,14 @@ Testing qh_setlast, qh_setnew_delnthsorted, qh_setunique, and qh_setzero 0..9999. Test j0 j1 j2 j3 j4 j5 j6 j7 j8 j9 j10 j100 j1000 j9999 Testing qh_setdel*, qh_setaddsorted, and 0..9999. Test j0 j1 j2 j3 j4 j5 j6 j7 j8 j9 j10 j100 j1000 j9999 + +Not testing qh_setduplicate and qh_setfree2. These routines use heap-allocated, +set contents. See qhull tests in eg/q_test and bin/qhulltest. + qh_memcheck: check size of freelists on qhmem qh_memcheck: A segmentation fault indicates an overwrite of qhmem qh_memcheck: total size of freelists totfree is the same as qhmem.totfree -============================================ -== Test reentrant qset_r.c with mem_r.c ==== -============================================ -bin/testqset_r 10000 - - -Not testing qh_setduplicate and qh_setfree2. - These routines use heap-allocated set contents. See qhull tests. - memory statistics: 124 quick allocations 25 short allocations @@ -86,13 +59,22 @@ 131064 bytes of short memory buffers (minus links) 65536 bytes per short memory buffer (initially 131072 bytes) 1135 calls to qh_setlarger -5.6e+002 average copy size +5.6e+02 average copy size freelists(bytes->count): 16->3 24->5 32->6 40->10 -testqset_r: OK +testqset: OK + +============================================ +== Test reentrant qset_r.c with mem_r.c ==== +============================================ +bin/testqset_r 10000 qh_meminitbuffers: memory initialized with alignment 8 +qh_memsize: quick memory of 16 bytes +qh_memsize: quick memory of 24 bytes +qh_memsize: quick memory of 32 bytes +qh_memsize: quick memory of 40 bytes SETelemsize is 4 bytes for pointer-to-int @@ -117,10 +99,36 @@ Testing qh_setlast, qh_setnew_delnthsorted, qh_setunique, and qh_setzero 0..9999. Test j0 j1 j2 j3 j4 j5 j6 j7 j8 j9 j10 j100 j1000 j9999 Testing qh_setdel*, qh_setaddsorted, and 0..9999. Test j0 j1 j2 j3 j4 j5 j6 j7 j8 j9 j10 j100 j1000 j9999 + +Not testing qh_setduplicate and qh_setfree2. These routines use heap-allocated, +set contents. See qhull tests in eg/q_test and bin/qhulltest. + qh_memcheck: check size of freelists on qh->qhmem qh_memcheck: A segmentation fault indicates an overwrite of qh->qhmem qh_memcheck: total size of freelists totfree is the same as qh->qhmem.totfree +memory statistics: + 124 quick allocations + 25 short allocations + 8230 long allocations + 148 short frees + 8230 long frees + 24 bytes of short memory in use + 760 bytes of short memory in freelists + 130280 bytes of dropped short memory + 68 bytes of unused short memory (estimated) + 105548 bytes of long memory allocated (max, except for input) + 0 bytes of long memory in use (in 0 pieces) + 131064 bytes of short memory buffers (minus links) + 65536 bytes per short memory buffer (initially 131072 bytes) + 1135 calls to qh_setlarger +5.6e+02 average copy size + freelists(bytes->count): 16->3 24->5 32->6 40->10 + + +testqset_r: OK + + ============================================ == Run the qhull smoketest ==== ============================================ @@ -139,15 +147,15 @@ Statistics for: rbox D4 | qhull Tv Number of points processed: 50 - Number of hyperplanes created: 712 - Number of distance tests for qhull: 1433 - CPU seconds to compute hull (after input): 0.015 + Number of hyperplanes created: 711 + Number of distance tests for qhull: 1432 + CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 2.8e-015 of +Output completed. Verifying that all points are below 2.8e-15 of all facets. Will make 13000 distance computations. ============================================ -== make test =============================== +== make test, after running qtest ========== ============================================ ============================== @@ -168,12 +176,12 @@ Statistics for: rbox D4 | qhull Tv Number of points processed: 50 - Number of hyperplanes created: 712 - Number of distance tests for qhull: 1433 + Number of hyperplanes created: 711 + Number of distance tests for qhull: 1432 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 2.8e-015 of +Output completed. Verifying that all points are below 2.8e-15 of all facets. Will make 13000 distance computations. ============================== @@ -189,12 +197,12 @@ Statistics for: rbox 10 | qconvex Tv Number of points processed: 10 - Number of hyperplanes created: 27 - Number of distance tests for qhull: 44 + Number of hyperplanes created: 26 + Number of distance tests for qhull: 43 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 2e-015 of +Output completed. Verifying that all points are below 2e-15 of all facets. Will make 160 distance computations. ============================== @@ -210,13 +218,13 @@ Statistics for: rbox 10 | qdelaunay Tv Number of points processed: 10 - Number of hyperplanes created: 48 + Number of hyperplanes created: 47 Number of facets in hull: 25 - Number of distance tests for qhull: 69 - CPU seconds to compute hull (after input): 0 + Number of distance tests for qhull: 68 + CPU seconds to compute hull (after input): 0.001 -Output completed. Verifying that all points are below 5.6e-015 of +Output completed. Verifying that all points are below 3e-15 of all facets. Will make 150 distance computations. ============================== @@ -224,7 +232,7 @@ ============================== bin/rbox 10 | bin/qconvex FQ FV n Tv | bin/qhalf Tv -Output completed. Verifying that all points are below 2e-015 of +Output completed. Verifying that all points are below 2e-15 of all facets. Will make 160 distance computations. Halfspace intersection by the convex hull of 16 points in 3-d: @@ -238,9 +246,9 @@ Number of points processed: 16 Number of hyperplanes created: 29 - Number of distance tests for qhull: 100 - Number of distance tests for merging: 342 - Number of distance tests for checking: 156 + Number of distance tests for qhull: 99 + Number of distance tests for merging: 300 + Number of distance tests for checking: 188 Number of merged facets: 18 CPU seconds to compute hull (after input): 0 @@ -261,28 +269,33 @@ Statistics for: rbox 10 | qvoronoi Tv Number of points processed: 10 - Number of hyperplanes created: 48 + Number of hyperplanes created: 47 Number of facets in hull: 25 - Number of distance tests for qhull: 69 + Number of distance tests for qhull: 68 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 5.6e-015 of +Output completed. Verifying that all points are below 3e-15 of all facets. Will make 150 distance computations. -============================== -========= user_eg ============ -============================== +================================= +========= user_eg =============== +== if fails under Windows ======= +== cp lib/libqhull_r.dll bin/ == +================================= bin/user_eg -This is the output from user_eg_r.c -It shows how qhull() may be called from an application using the qhull -reentrant library. user_eg is not part of qhull itself. If it appears -accidently, please remove user_eg_r.c from your project. If it fails -immediately, user_eg_r.c was incorrectly linked to the non-reentrant library. -Also try 'user_eg T1 2>&1' +======== +user_eg 'cube qhull options' 'Delaunay options' 'halfspace options' +This is the output from user_eg_r.c. It shows how qhull() may be called from +an application, via Qhull's shared, reentrant library. user_eg is not part of +Qhull itself. If user_eg fails immediately, user_eg_r.c was incorrectly linked +to Qhull's non-reentrant library, libqhull. +Try -- user_eg 'T1' 'T1' 'T1' + +======== compute convex hull of cube after rotating input input -1 -1 -1 @@ -294,129 +307,6 @@ -1 1 1 1 1 1 -8 vertices and 6 facets with normals: - -0 -0 -1 - 0 -1 0 - 1 -0 -0 - -1 -0 -0 - 0 1 -0 - -0 -0 1 - -compute 3-d Delaunay triangulation -seed: 1453170142 -input --0.908 -0.451 -0.3 --0.329 -0.914 0.777 - 0.249 -0.979 0.0594 --0.359 -0.194 -0.69 --0.986 0.529 0.578 --0.667 0.525 -0.301 - 0.305 0.573 0.572 - 0.885 0.47 -0.669 - -8 vertices and 16 facets with normals: - 0.58 -0.11 -0.17 -0.79 -0.0011 1 -0.051 0.054 - 0.25 0.48 -0.36 -0.76 - 0.034 -0.51 -0.76 0.39 - -0.39 0.28 -0.66 0.59 - -0.35 0.21 -0.83 0.39 - -0.47 -0.11 0.48 -0.73 - -0.38 -0.17 0.37 -0.83 - -0.17 -0.15 -0.34 0.91 --6.3e-005 -0.46 -0.49 0.74 - 0.43 0.25 0.56 0.67 - 0.81 -0.16 0.52 0.21 - -0.47 -0.13 0.49 -0.73 - -0.3 -0.27 0.39 -0.83 - -0.31 -0.29 0.37 -0.82 - -0.32 -0.25 0.39 -0.83 - -find 3-d Delaunay triangle closest to [0.5, 0.5, ...] - 0.31 0.57 0.57 --0.36 -0.19 -0.69 - 0.25 -0.98 0.06 - 0.89 0.47 -0.67 - -Compute a new triangulation as a separate instance of Qhull -seed: 1453170143 -input --0.908 -0.188 -0.789 - 0.588 0.152 -0.785 - 0.344 0.378 -0.582 --0.489 0.573 0.349 - 0.676 0.598 0.685 - 0.392 -0.132 -0.285 --0.928 0.707 -0.593 - 0.259 -0.352 -0.808 - -8 vertices and 16 facets with normals: - -0.04 -0.85 0.51 0.13 - -0.44 -0.29 0.69 0.49 - -0.17 -0.78 0.6 0.029 - 0.82 -0.56 0.11 0.07 - 0.35 -0.19 -0.15 0.91 - 0.37 -0.47 -0.044 0.8 - 0.29 0.62 0.2 -0.7 - 0.86 0.31 -0.066 -0.4 - 0.098 0.97 -0.099 -0.18 - 0.34 0.88 -0.31 0.13 - -0.52 0.26 -0.45 -0.68 - -0.52 0.19 -0.43 -0.72 - 0.31 -0.0023 -0.75 -0.59 - -0.37 0.028 -0.66 -0.66 - -0.14 0.26 -0.92 -0.24 - -0.14 0.21 -0.93 -0.28 - -Free memory allocated by the new instance of Qhull, and redisplay the old results. - - - -8 vertices and 16 facets with normals: - 0.58 -0.11 -0.17 -0.79 -0.0011 1 -0.051 0.054 - 0.25 0.48 -0.36 -0.76 - 0.034 -0.51 -0.76 0.39 - -0.39 0.28 -0.66 0.59 - -0.35 0.21 -0.83 0.39 - -0.47 -0.11 0.48 -0.73 - -0.38 -0.17 0.37 -0.83 - -0.17 -0.15 -0.34 0.91 --6.3e-005 -0.46 -0.49 0.74 - 0.43 0.25 0.56 0.67 - 0.81 -0.16 0.52 0.21 - -0.47 -0.13 0.49 -0.73 - -0.3 -0.27 0.39 -0.83 - -0.31 -0.29 0.37 -0.82 - -0.32 -0.25 0.39 -0.83 - -compute halfspace intersection about the origin for a diamond -input as halfspace coefficients + offsets - -1 -1 -1 -1 - 1 -1 -1 -1 - -1 1 -1 -1 - 1 1 -1 -1 - -1 -1 1 -1 - 1 -1 1 -1 - -1 1 1 -1 - 1 1 1 -1 -3 -6 - 0 0 -1 - 0 -1 0 - 1 0 0 - -1 0 0 - 0 1 0 - 0 0 1 - -8 vertices and 6 facets with normals: - -0 -0 -1 - 0 -1 0 - 1 -0 -0 - -1 -0 -0 - 0 1 -0 - -0 -0 1 - Convex hull of 8 points in 3-d: Number of vertices: 8 @@ -427,9 +317,9 @@ Number of points processed: 8 Number of hyperplanes created: 11 - Number of distance tests for qhull: 35 - Number of distance tests for merging: 142 - Number of distance tests for checking: 56 + Number of distance tests for qhull: 34 + Number of distance tests for merging: 96 + Number of distance tests for checking: 100 Number of merged facets: 6 CPU seconds to compute hull (after input): 0 @@ -437,6 +327,27 @@ Output completed. Verifying that all points are below outer planes of all facets. Will make 48 distance computations. +8 vertices and 6 facets with normals: + -0 -0 -1 + 0 -1 0 + 1 -0 -0 + -1 -0 -0 + 0 1 -0 + -0 -0 1 + +======== +compute 3-d Delaunay triangulation +seed: 1595644031 +input +-0.801 0.00317 -0.695 +-0.358 -0.422 0.394 +-0.893 -0.345 -0.494 +-0.548 0.646 0.388 +-0.0159 0.604 0.693 + 0.43 0.224 0.755 +0.0381 -0.37 -0.66 +-0.737 0.146 -0.926 + Delaunay triangulation by the convex hull of 8 points in 4-d: Number of input sites: 8 @@ -445,31 +356,123 @@ Statistics for: | qhull s d Tcv Number of points processed: 8 - Number of hyperplanes created: 28 + Number of hyperplanes created: 25 Number of facets in hull: 16 - Number of distance tests for qhull: 29 + Number of distance tests for qhull: 27 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 9.6e-015 of +Output completed. Verifying that all points are below 8.6e-15 of all facets. Will make 64 distance computations. +8 vertices and 16 facets with normals: + 0.44 -0.53 -0.014 0.72 + 0.34 -0.77 0.14 0.52 +-0.071 -0.12 0.39 0.91 + -0.2 -0.037 0.42 0.88 + -0.31 -0.32 0.65 0.62 + -0.38 -0.28 0.66 0.58 + 0.62 0.65 -0.45 0.03 + 0.31 0.76 -0.47 -0.32 + 0.17 0.3 -0.021 -0.94 + 0.03 0.36 -0.071 -0.93 + -0.76 0.11 -0.041 -0.64 + -0.55 -0.11 -0.29 -0.78 + -0.43 0.24 -0.24 -0.84 + -0.94 0.3 0.069 0.11 + -0.36 -0.39 -0.78 -0.34 + -0.13 0.6 -0.48 -0.63 + +find 3-d Delaunay triangle or adjacent triangle closest to [0.5, 0.5, ...] +-0.02 0.60 0.69 + 0.04 -0.37 -0.66 +-0.74 0.15 -0.93 +-0.55 0.65 0.39 + +======== +Compute a new triangulation as a separate instance of Qhull +seed: 1595644032 +input +-0.801 0.266 0.816 + 0.559 0.644 0.832 +-0.799 -0.987 0.864 +-0.678 -0.587 -0.573 +-0.354 0.674 0.8 +-0.511 -0.433 0.77 + 0.805 -0.236 0.175 + 0.637 -0.676 0.935 + Delaunay triangulation by the convex hull of 8 points in 4-d: Number of input sites: 8 - Number of Delaunay regions: 9 + Number of Delaunay regions: 12 Statistics for: | qhull s d Tcv Number of points processed: 8 - Number of hyperplanes created: 28 - Number of facets in hull: 16 - Number of distance tests for qhull: 32 + Number of hyperplanes created: 29 + Number of facets in hull: 18 + Number of distance tests for qhull: 28 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 1e-014 of -all facets. Will make 72 distance computations. +Output completed. Verifying that all points are below 1.4e-14 of +all facets. Will make 96 distance computations. + +8 vertices and 18 facets with normals: + -0.24 0.52 -0.46 0.68 + -0.91 -0.24 0.12 -0.31 + -0.49 0.2 -0.02 -0.85 + -0.27 0.19 -0.052 -0.94 + 0.063 -0.9 0.065 -0.43 + 0.028 -0.92 0.075 -0.39 +-0.086 -0.048 0.99 -0.11 +-0.033 0.0066 0.98 -0.18 + 0.13 0.076 0.69 -0.71 + 0.23 -0.066 0.78 -0.58 + 0.024 0.013 0.96 -0.26 + 0.099 0.71 -0.66 -0.24 + 0.46 0.12 -0.63 0.61 + -0.12 0.5 -0.48 0.71 + 0.32 0.15 -0.57 0.74 +-0.074 0.2 0.95 0.21 +-0.039 0.091 0.99 0.068 +-0.033 0.076 1 -0.0011 + +======== +Free memory allocated by the new instance of Qhull, and redisplay the old results. + + + +8 vertices and 16 facets with normals: + 0.44 -0.53 -0.014 0.72 + 0.34 -0.77 0.14 0.52 +-0.071 -0.12 0.39 0.91 + -0.2 -0.037 0.42 0.88 + -0.31 -0.32 0.65 0.62 + -0.38 -0.28 0.66 0.58 + 0.62 0.65 -0.45 0.03 + 0.31 0.76 -0.47 -0.32 + 0.17 0.3 -0.021 -0.94 + 0.03 0.36 -0.071 -0.93 + -0.76 0.11 -0.041 -0.64 + -0.55 -0.11 -0.29 -0.78 + -0.43 0.24 -0.24 -0.84 + -0.94 0.3 0.069 0.11 + -0.36 -0.39 -0.78 -0.34 + -0.13 0.6 -0.48 -0.63 + +======== +compute halfspace intersection about the origin for a diamond +input as halfspace coefficients + offsets + -1 -1 -1 -1 + 1 -1 -1 -1 + -1 1 -1 -1 + 1 1 -1 -1 + -1 -1 1 -1 + 1 -1 1 -1 + -1 1 1 -1 + 1 1 1 -1 Halfspace intersection by the convex hull of 8 points in 3-d: @@ -482,31 +485,53 @@ Number of points processed: 8 Number of hyperplanes created: 11 - Number of distance tests for qhull: 35 - Number of distance tests for merging: 142 - Number of distance tests for checking: 56 + Number of distance tests for qhull: 34 + Number of distance tests for merging: 96 + Number of distance tests for checking: 100 Number of merged facets: 6 CPU seconds to compute hull (after input): 0 +3 +6 + 0 0 -1 + 0 -1 0 + 1 0 0 + -1 0 0 + 0 1 0 + 0 0 1 Output completed. Verifying that all points are below outer planes of all facets. Will make 48 distance computations. +8 vertices and 6 facets with normals: + -0 -0 -1 + 0 -1 0 + 1 -0 -0 + -1 -0 -0 + 0 1 -0 + -0 -0 1 + ============================== ========= user_eg2 =========== ============================== bin/user_eg2 -This is the output from user_eg2_r.c -It shows how qhull() may be called from an application using qhull's -static, reentrant library. user_eg2 is not part of qhull itself. If it -appears accidently, please remove user_eg2_r.c from your project. If it fails -immediately, user_eg2_r.c was incorrectly linked to the non-reentrant library. -Also try 'user_eg2 T1 2>&1' +======== +user_eg2 'cube qhull options' 'Delaunay options' 'halfspace options' +This is the output from user_eg2_r.c. It shows how qhull() may be called from +an application, via Qhull's static, reentrant library. user_eg2 is not part +of Qhull itself. If user_eg2 fails immediately, user_eg2_r.c was incorrectly +linked to Qhull's non-reentrant library, libqhullstatic. +Try -- user_eg2 'T1' 'T1' 'T1' + +======== compute triangulated convex hull of cube after rotating input +Output completed. Verifying that all points are below outer planes of +all facets. Will make 96 distance computations. + 8 vertices and 12 facets with normals: -0 -0 -1 -0 -0 -1 @@ -543,61 +568,6 @@ 0.71 0 0.71 -0 0.71 0.71 -compute 2-d Delaunay triangulation -seed: 1453170142 - -8 vertices and 12 facets with normals: - 0.29 -0.76 -0.59 - 0.5 0.13 0.85 - 0.65 0.74 -0.16 - -0.8 -0.19 0.56 - -0.14 -0.31 0.94 - 0.15 -0.79 -0.59 - -0.41 -0.9 -0.15 - -0.19 -0.68 -0.71 - -0.58 -0.63 -0.52 - -0.81 0.069 -0.58 - -0.31 0.63 -0.71 --0.065 0.73 -0.68 - -add points to triangulation -added point p8: -1 -0.7369 1.543 -9 points, 0 extra points, 9 vertices, and 14 facets in total -added point p9: 0.5112 -0.0827 0.2682 -10 points, 0 extra points, 10 vertices, and 16 facets in total -added point p10: 0.06553 -0.5621 0.3202 -11 points, 0 extra points, 11 vertices, and 18 facets in total -added point p11: -0.9059 0.3577 0.9486 -12 points, 0 extra points, 12 vertices, and 20 facets in total -added point p12: 0.3586 0.8694 0.8844 -13 points, 0 extra points, 13 vertices, and 22 facets in total -added point p13: -0.233 0.03883 0.0558 -14 points, 0 extra points, 14 vertices, and 24 facets in total - -find Delaunay triangle closest to [0.5, 0.5, ...] --0.23 0.04 - 0.36 0.87 - 0.51 -0.08 - -compute halfspace intersection about the origin for a diamond - -add halfspaces for cube to intersection -added offset -1 and normal 1.732 0 0 -8 points, 1 extra points, 9 vertices, and 9 facets in total -added offset -1 and normal -1.732 0 0 -8 points, 2 extra points, 10 vertices, and 12 facets in total -added offset -1 and normal 0 1.732 0 -8 points, 3 extra points, 11 vertices, and 15 facets in total -added offset -1 and normal 0 -1.732 0 -8 points, 4 extra points, 12 vertices, and 18 facets in total -added offset -1 and normal 0 0 1.732 -8 points, 5 extra points, 13 vertices, and 21 facets in total -added offset -1 and normal 0 0 -1.732 -8 points, 6 extra points, 14 vertices, and 24 facets in total - -Output completed. Verifying that all points are below outer planes of -all facets. Will make 96 distance computations. - Convex hull of 14 points in 3-d: Number of vertices: 14 @@ -608,9 +578,9 @@ Number of points processed: 14 Number of hyperplanes created: 23 - Number of distance tests for qhull: 65 - Number of distance tests for merging: 450 - Number of distance tests for checking: 190 + Number of distance tests for qhull: 64 + Number of distance tests for merging: 276 + Number of distance tests for checking: 324 Number of merged facets: 18 CPU seconds to compute hull (after input): 0 @@ -618,39 +588,80 @@ Output completed. Verifying that all points are below outer planes of all facets. Will make 168 distance computations. +======== +compute 2-d Delaunay triangulation +seed: 1595644031 + +8 vertices and 12 facets with normals: + -0.17 0.61 0.77 + 0.39 -0.56 0.73 + 0.19 -0.23 -0.95 + 0.4 0.75 -0.52 + 0.63 -0.77 0.026 + 0.21 -0.24 -0.95 + -0.23 0.64 0.73 + -0.44 0.78 0.45 + -0.45 -0.16 -0.88 + -0.57 -0.097 -0.82 + -0.69 -0.58 -0.42 + -0.83 -0.2 -0.53 + Delaunay triangulation by the convex hull of 8 points in 3-d: Number of input sites: 8 - Number of Delaunay regions: 9 + Number of Delaunay regions: 7 Statistics for: user_eg2 Delaunay example | qhull s d Tcv Number of points processed: 8 - Number of hyperplanes created: 21 + Number of hyperplanes created: 18 Number of facets in hull: 12 - Number of distance tests for qhull: 31 + Number of distance tests for qhull: 34 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 6e-015 of -all facets. Will make 72 distance computations. - -Delaunay triangulation by the convex hull of 14 points in 3-d: +Output completed. Verifying that all points are below 3.8e-15 of +all facets. Will make 56 distance computations. - Number of input sites: 14 - Number of Delaunay regions: 19 +======== +add points to triangulation +added point p8: -1 -0.7369 1.543 +9 points, 0 extra points, 9 vertices, and 14 facets in total +added point p9: 0.5112 -0.0827 0.2682 +10 points, 0 extra points, 10 vertices, and 16 facets in total +added point p10: 0.06553 -0.5621 0.3202 +11 points, 0 extra points, 11 vertices, and 18 facets in total +added point p11: -0.9059 0.3577 0.9486 +12 points, 0 extra points, 12 vertices, and 20 facets in total +added point p12: 0.3586 0.8694 0.8844 +13 points, 0 extra points, 13 vertices, and 22 facets in total +added point p13: -0.233 0.03883 0.0558 +14 points, 0 extra points, 14 vertices, and 24 facets in total + +find Delaunay triangle or adjacent triangle closest to [0.5, 0.5, ...] + 0.36 0.87 + 0.65 0.39 +-0.02 0.60 + +Delaunay triangulation by the convex hull of 14 points in 3-d: + + Number of input sites: 14 + Number of Delaunay regions: 20 Statistics for: user_eg2 Delaunay example | qhull s d Tcv Number of points processed: 14 - Number of hyperplanes created: 54 + Number of hyperplanes created: 53 Number of facets in hull: 24 - Number of distance tests for qhull: 78 + Number of distance tests for qhull: 84 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 6e-015 of -all facets. Will make 266 distance computations. +Output completed. Verifying that all points are below 3.8e-15 of +all facets. Will make 280 distance computations. + +======== +compute halfspace intersection about the origin for a diamond Halfspace intersection by the convex hull of 8 points in 3-d: @@ -663,16 +674,31 @@ Number of points processed: 8 Number of hyperplanes created: 11 - Number of distance tests for qhull: 35 - Number of distance tests for merging: 142 - Number of distance tests for checking: 56 + Number of distance tests for qhull: 34 + Number of distance tests for merging: 96 + Number of distance tests for checking: 100 Number of merged facets: 6 - CPU seconds to compute hull (after input): 0 + CPU seconds to compute hull (after input): 0.001 Output completed. Verifying that all points are below outer planes of all facets. Will make 48 distance computations. +======== +add halfspaces for cube to intersection +added offset -1 and normal 1.732 0 0 +8 points, 1 extra points, 9 vertices, and 9 facets in total +added offset -1 and normal -1.732 0 0 +8 points, 2 extra points, 10 vertices, and 12 facets in total +added offset -1 and normal 0 1.732 0 +8 points, 3 extra points, 11 vertices, and 15 facets in total +added offset -1 and normal 0 -1.732 0 +8 points, 4 extra points, 12 vertices, and 18 facets in total +added offset -1 and normal 0 0 1.732 +8 points, 5 extra points, 13 vertices, and 21 facets in total +added offset -1 and normal 0 0 -1.732 +8 points, 6 extra points, 14 vertices, and 24 facets in total + Halfspace intersection by the convex hull of 14 points in 3-d: Number of halfspaces: 14 @@ -683,11 +709,11 @@ Number of points processed: 14 Number of hyperplanes created: 35 - Number of distance tests for qhull: 59 - Number of distance tests for merging: 306 - Number of distance tests for checking: 214 + Number of distance tests for qhull: 58 + Number of distance tests for merging: 248 + Number of distance tests for checking: 256 Number of merged facets: 6 - CPU seconds to compute hull (after input): 0 + CPU seconds to compute hull (after input): 0.001 Output completed. Verifying that all points are below outer planes of @@ -696,6 +722,39 @@ ============================== ========= user_eg3 =========== ============================== +bin/user_eg3 + +======== +user_eg3 commands... -- demonstrate calling rbox and qhull from C++. + +user_eg3 is statically linked to qhullcpp and reentrant qhull. If user_eg3 +fails immediately, it is probably linked to the non-reentrant qhull library. + +Commands: + eg-100 Run the example in qh-code.htm + eg-convex 'rbox d | qconvex o' with std::vector and C++ classes + eg-delaunay 'rbox y c | qdelaunay o' with std::vector and C++ classes + eg-voronoi 'rbox y c | qvoronoi o' with std::vector and C++ classes + eg-fifo 'rbox y c | qvoronoi FN Fi Fo' with QhullUser and qh_fprintf + +Rbox and Qhull commands: + rbox "200 D4" ... Generate points from rbox + qhull "d p" ... Run qhull with options and produce output + qhull-cout "o" ... Run qhull with options and produce output to cout + qhull "T1" ... Run qhull with level-1 trace to cerr + qhull-cout "T1z" ... Run qhull with level-1 trace to cout + facets Print qhull's facets when done + +For example + user_eg3 rbox qhull + user_eg3 rbox qhull T1 + user_eg3 rbox qhull d + user_eg3 rbox D2 10 2 "s r 5" qhull "s p" facets + user_eg3 eg-convex + user_eg3 rbox 10 eg-delaunay qhull "d o" + user_eg3 rbox D5 c P2 qhull d eg-delaunay + user_eg3 rbox "D5 c P2" qhull v eg-voronoi o + user_eg3 rbox D2 10 qhull "v" eg-fifo p Fi Fo bin/user_eg3 rbox "10 D2" "2 D2" qhull "s p" facets rbox 10 D2 rbox 2 D2 @@ -707,11 +766,11 @@ Number of vertices: 5 Number of facets: 5 -Statistics for: rbox "10 D2" "2 D2" | qhull s p +Statistics for: rbox "10 D2" "2 D2 D2" | qhull s p Number of points processed: 5 Number of hyperplanes created: 8 - Number of distance tests for qhull: 64 + Number of distance tests for qhull: 56 CPU seconds to compute hull (after input): 0 2 @@ -720,45 +779,46 @@ -0.4285431913366012 0.4745826469497594 0.3790312361708201 0.3779794437605696 0.3443122672329771 -0.1437312230875075 --0.3674659290047977 0.0001301793382784133 +-0.4999921736307369 -0.3684622117955817 Facets created by Qhull::runQhull() -- f1 +- f2 - flags: top simplicial + - normal: -0.996428 0.0844484 + - offset: -0.46709 + - vertices: p1(v3) p10(v1) + - neighboring facets: f4 f3 +- f3 + - flags: bottom simplicial - normal: 0.118775 0.992921 - offset: -0.420323 - - vertices: p4(v1) p1(v0) - - neighboring facets: f6 f4 + - vertices: p1(v3) p4(v2) + - neighboring facets: f6 f2 - f4 + - flags: bottom simplicial + - normal: -0.261631 -0.965168 + - offset: -0.486442 + - vertices: p0(v4) p10(v1) + - neighboring facets: f2 f7 +- f6 - flags: top simplicial - normal: 0.997793 -0.0664014 - offset: -0.353096 - - vertices: p8(v4) p4(v1) - - neighboring facets: f1 f5 -- f5 + - vertices: p8(v5) p4(v2) + - neighboring facets: f3 f7 +- f7 - flags: bottom simplicial - normal: 0.694945 -0.719063 - offset: -0.34263 - - vertices: p8(v4) p0(v2) - - neighboring facets: f7 f4 -- f6 - - flags: bottom simplicial - - normal: -0.991816 -0.127679 - - offset: -0.364442 - - vertices: p10(v5) p1(v0) - - neighboring facets: f1 f7 -- f7 - - flags: top simplicial - - normal: -0.821881 -0.569659 - - offset: -0.301939 - - vertices: p10(v5) p0(v2) - - neighboring facets: f5 f6 -============================================ -== make testall ============================ -============================================ -== Mon Jan 18 21:22:22 EST 2016 + - vertices: p8(v5) p0(v4) + - neighboring facets: f4 f6 +================================================ +== make testall, after running qtest and test == +================================================ +== Fri, Jul 24, 2020 10:27:12 PM eg/q_eg +eg/q_eg: Temporarily add "$PWD/bin" to $PATH for access to qconvex,etc. ============================== ========= eg/q_eg ============ == Create geomview examples == @@ -776,9 +836,9 @@ Number of points processed: 8 Number of hyperplanes created: 11 - Number of distance tests for qhull: 35 - Number of distance tests for merging: 84 - Number of distance tests for checking: 56 + Number of distance tests for qhull: 34 + Number of distance tests for merging: 90 + Number of distance tests for checking: 48 Number of merged facets: 6 CPU seconds to compute hull (after input): 0 @@ -794,8 +854,8 @@ Number of points processed: 6 Number of hyperplanes created: 11 Number of distance tests for qhull: 88 - Number of distance tests for merging: 45 - Number of distance tests for checking: 54 + Number of distance tests for merging: 51 + Number of distance tests for checking: 48 Number of merged facets: 1 CPU seconds to compute hull (after input): 0 @@ -809,8 +869,8 @@ Statistics for: rbox s 100 D3 | qconvex s G Number of points processed: 100 - Number of hyperplanes created: 503 - Number of distance tests for qhull: 1631 + Number of hyperplanes created: 502 + Number of distance tests for qhull: 1630 CPU seconds to compute hull (after input): 0 rbox s 100 D2 | qconvex s G >eg/eg.04.circle @@ -824,7 +884,7 @@ Number of points processed: 100 Number of hyperplanes created: 198 - Number of distance tests for qhull: 891 + Number of distance tests for qhull: 890 CPU seconds to compute hull (after input): 0 rbox 10 l | qconvex s G >eg/eg.05.spiral @@ -837,8 +897,8 @@ Statistics for: rbox 10 l | qconvex s G Number of points processed: 10 - Number of hyperplanes created: 26 - Number of distance tests for qhull: 40 + Number of hyperplanes created: 25 + Number of distance tests for qhull: 39 CPU seconds to compute hull (after input): 0 rbox 1000 D2 | qconvex s C-0.03 Qc Gapcv >eg/eg.06.merge.square @@ -852,10 +912,10 @@ Statistics for: rbox 1000 D2 | qconvex s C-0.03 Qc Gapcv Number of points processed: 6 - Number of hyperplanes created: 8 - Number of distance tests for qhull: 12111 - Number of distance tests for merging: 43 - Number of distance tests for checking: 3736 + Number of hyperplanes created: 7 + Number of distance tests for qhull: 11448 + Number of distance tests for merging: 41 + Number of distance tests for checking: 3540 Number of merged facets: 2 CPU seconds to compute hull (after input): 0 Maximum distance of point above facet: 0.019 (0.3x) @@ -871,9 +931,9 @@ Statistics for: rbox 1000 D3 | qconvex s G Number of points processed: 81 - Number of hyperplanes created: 368 - Number of distance tests for qhull: 12884 - CPU seconds to compute hull (after input): 0 + Number of hyperplanes created: 367 + Number of distance tests for qhull: 12879 + CPU seconds to compute hull (after input): 0.001 rbox c G0.4 s 500 | qconvex s G >eg/eg.08a.cube.sphere @@ -886,8 +946,8 @@ Number of points processed: 99 Number of hyperplanes created: 443 - Number of distance tests for qhull: 9648 - CPU seconds to compute hull (after input): 0.015 + Number of distance tests for qhull: 9651 + CPU seconds to compute hull (after input): 0 rbox d G0.6 s 500 | qconvex s G >eg/eg.08b.diamond.sphere @@ -898,13 +958,13 @@ Statistics for: rbox d G0.6 s 500 | qconvex s G - Number of points processed: 409 - Number of hyperplanes created: 2032 - Number of distance tests for qhull: 10055 - Number of distance tests for merging: 8153 - Number of distance tests for checking: 10136 + Number of points processed: 407 + Number of hyperplanes created: 2053 + Number of distance tests for qhull: 9900 + Number of distance tests for merging: 8243 + Number of distance tests for checking: 4671 Number of merged facets: 1 - CPU seconds to compute hull (after input): 0 + CPU seconds to compute hull (after input): 0.002 rbox 100 L3 G0.5 s | qconvex s G >eg/eg.09.lens @@ -917,8 +977,8 @@ Number of points processed: 100 Number of hyperplanes created: 483 - Number of distance tests for qhull: 1642 - CPU seconds to compute hull (after input): 0.015 + Number of distance tests for qhull: 1641 + CPU seconds to compute hull (after input): 0 rbox 100 s P0.5,0.5,0.5 | qconvex s Ga QG0 >eg/eg.10a.sphere.visible @@ -931,8 +991,8 @@ Statistics for: rbox 100 s P0.5,0.5,0.5 | qconvex s Ga QG0 Number of points processed: 100 - Number of hyperplanes created: 513 - Number of distance tests for qhull: 1704 + Number of hyperplanes created: 512 + Number of distance tests for qhull: 1703 CPU seconds to compute hull (after input): 0 rbox 100 s P0.5,0.5,0.5 | qconvex s Ga QG-0 >eg/eg.10b.sphere.beyond @@ -946,8 +1006,8 @@ Statistics for: rbox 100 s P0.5,0.5,0.5 | qconvex s Ga QG-0 Number of points processed: 100 - Number of hyperplanes created: 513 - Number of distance tests for qhull: 1704 + Number of hyperplanes created: 512 + Number of distance tests for qhull: 1703 CPU seconds to compute hull (after input): 0 rbox 100 s P0.5,0.5,0.5 | qconvex s Ga QG0 PG >eg/eg.10c.sphere.horizon @@ -961,8 +1021,8 @@ Statistics for: rbox 100 s P0.5,0.5,0.5 | qconvex s Ga QG0 PG Number of points processed: 100 - Number of hyperplanes created: 513 - Number of distance tests for qhull: 1704 + Number of hyperplanes created: 512 + Number of distance tests for qhull: 1703 CPU seconds to compute hull (after input): 0 rbox 100 s P0.5,0.5,0.5 | qconvex s Ga QV0 PgG >eg/eg.10d.sphere.cone @@ -977,7 +1037,7 @@ Number of points processed: 88 Number of hyperplanes created: 429 - Number of distance tests for qhull: 1594 + Number of distance tests for qhull: 1586 CPU seconds to compute hull (after input): 0 rbox 100 s P0.5,0.5,0.5 | qconvex s Ga >eg/eg.10e.sphere.new @@ -991,7 +1051,7 @@ Number of points processed: 88 Number of hyperplanes created: 429 - Number of distance tests for qhull: 1594 + Number of distance tests for qhull: 1586 CPU seconds to compute hull (after input): 0 rbox 100 s P0.5,0.5,0.5 | qhull s Ga QV0g Q0 >eg/eg.14.sphere.corner @@ -1006,8 +1066,8 @@ Number of points processed: 45 Number of hyperplanes created: 194 - Number of distance tests for qhull: 1435 - CPU seconds to compute hull (after input): 0.015 + Number of distance tests for qhull: 1426 + CPU seconds to compute hull (after input): 0 rbox 500 W0 | qconvex s QR0 Qc Gvp >eg/eg.15a.surface @@ -1018,15 +1078,15 @@ Number of facets: 80 Number of non-simplicial facets: 6 -Statistics for: rbox 500 W0 | qconvex s QR0 Qc Gvp QR1453170143 +Statistics for: rbox 500 W0 | qconvex s QR0 Qc Gvp QR1595644033 - Number of points processed: 70 - Number of hyperplanes created: 212 - Number of distance tests for qhull: 8617 - Number of distance tests for merging: 1888 - Number of distance tests for checking: 6765 - Number of merged facets: 56 - CPU seconds to compute hull (after input): 0 + Number of points processed: 73 + Number of hyperplanes created: 223 + Number of distance tests for qhull: 8533 + Number of distance tests for merging: 2022 + Number of distance tests for checking: 6699 + Number of merged facets: 62 + CPU seconds to compute hull (after input): 0.001 rbox 500 W0 | qconvex s QR0 Qt Qc Gvp >eg/eg.15b.triangle @@ -1037,29 +1097,29 @@ Number of facets: 128 Number of triangulated facets: 6 -Statistics for: rbox 500 W0 | qconvex s QR0 Qt Qc Gvp QR1453170143 +Statistics for: rbox 500 W0 | qconvex s QR0 Qt Qc Gvp QR1595644033 - Number of points processed: 70 - Number of hyperplanes created: 212 - Number of distance tests for qhull: 8617 - Number of distance tests for merging: 1954 - Number of distance tests for checking: 6765 - Number of merged facets: 56 + Number of points processed: 73 + Number of hyperplanes created: 223 + Number of distance tests for qhull: 8533 + Number of distance tests for merging: 2022 + Number of distance tests for checking: 6699 + Number of merged facets: 62 CPU seconds to compute hull (after input): 0 rbox 500 W0 | qconvex s QR0 QJ5e-2 Qc Gvp >eg/eg.15c.joggle Convex hull of 500 points in 3-d: - Number of vertices: 78 - Number of coplanar points: 422 - Number of facets: 152 + Number of vertices: 76 + Number of coplanar points: 424 + Number of facets: 148 -Statistics for: rbox 500 W0 | qconvex s QR0 QJ5e-2 Qc Gvp QR1453170143 +Statistics for: rbox 500 W0 | qconvex s QR0 QJ5e-2 Qc Gvp QR1595644033 - Number of points processed: 87 - Number of hyperplanes created: 379 - Number of distance tests for qhull: 18158 + Number of points processed: 89 + Number of hyperplanes created: 409 + Number of distance tests for qhull: 18381 CPU seconds to compute hull (after input): 0 Input joggled by: 0.05 @@ -1078,11 +1138,11 @@ Statistics for: = rbox 6 r s D2, rbox 15 B0.3 W0.25, c G0.5 | qdelaunay s Qt GnraD2 Number of points processed: 25 - Number of hyperplanes created: 90 + Number of hyperplanes created: 89 Number of facets in hull: 46 - Number of distance tests for qhull: 289 - Number of distance tests for merging: 492 - Number of distance tests for checking: 307 + Number of distance tests for qhull: 287 + Number of distance tests for merging: 487 + Number of distance tests for checking: 282 Number of merged facets: 4 CPU seconds to compute hull (after input): 0 @@ -1097,11 +1157,11 @@ Statistics for: = rbox 6 r s D2, rbox 15 B0.3 W0.25, c G0.5 | qdelaunay s GnraD2 Number of points processed: 25 - Number of hyperplanes created: 90 + Number of hyperplanes created: 89 Number of facets in hull: 42 - Number of distance tests for qhull: 289 - Number of distance tests for merging: 482 - Number of distance tests for checking: 307 + Number of distance tests for qhull: 287 + Number of distance tests for merging: 487 + Number of distance tests for checking: 282 Number of merged facets: 4 CPU seconds to compute hull (after input): 0 @@ -1116,11 +1176,11 @@ Statistics for: = rbox 6 r s D2, rbox 15 B0.3 W0.25, c G0.5 | qdelaunay s C-0 Ga Number of points processed: 25 - Number of hyperplanes created: 90 + Number of hyperplanes created: 89 Number of facets in hull: 42 - Number of distance tests for qhull: 289 - Number of distance tests for merging: 482 - Number of distance tests for checking: 307 + Number of distance tests for qhull: 287 + Number of distance tests for merging: 487 + Number of distance tests for checking: 282 Number of merged facets: 4 CPU seconds to compute hull (after input): 0 @@ -1134,11 +1194,11 @@ Statistics for: = rbox 6 r s D2, rbox 15 B0.3 W0.25, c G0.5 | qvoronoi s QJ Gna Number of points processed: 25 - Number of hyperplanes created: 99 + Number of hyperplanes created: 110 Number of facets in hull: 46 - Number of distance tests for qhull: 283 - CPU seconds to compute hull (after input): 0 - Input joggled by: 4.2e-011 + Number of distance tests for qhull: 281 + CPU seconds to compute hull (after input): 0.001 + Input joggled by: 4.2e-11 qvoronoi s eg/eg.17e.voronoi.2i @@ -1151,11 +1211,11 @@ Statistics for: = rbox 6 r s D2, rbox 15 B0.3 W0.25, c G0.5 | qvoronoi s Gna Number of points processed: 25 - Number of hyperplanes created: 90 + Number of hyperplanes created: 89 Number of facets in hull: 42 - Number of distance tests for qhull: 289 - Number of distance tests for merging: 482 - Number of distance tests for checking: 307 + Number of distance tests for qhull: 287 + Number of distance tests for merging: 487 + Number of distance tests for checking: 282 Number of merged facets: 4 CPU seconds to compute hull (after input): 0 @@ -1170,11 +1230,11 @@ Statistics for: rbox 10 D2 d | qdelaunay s Qu G Number of points processed: 14 - Number of hyperplanes created: 46 + Number of hyperplanes created: 50 Number of facets in hull: 24 - Number of distance tests for qhull: 85 - Number of distance tests for merging: 213 - Number of distance tests for checking: 304 + Number of distance tests for qhull: 96 + Number of distance tests for merging: 229 + Number of distance tests for checking: 138 Number of merged facets: 1 CPU seconds to compute hull (after input): 0 @@ -1188,11 +1248,11 @@ Statistics for: rbox 10 D2 d | qdelaunay s Qu Pd2 G Number of points processed: 14 - Number of hyperplanes created: 46 + Number of hyperplanes created: 50 Number of facets in hull: 24 - Number of distance tests for qhull: 85 - Number of distance tests for merging: 213 - Number of distance tests for checking: 304 + Number of distance tests for qhull: 96 + Number of distance tests for merging: 229 + Number of distance tests for checking: 138 Number of merged facets: 1 CPU seconds to compute hull (after input): 0 @@ -1206,13 +1266,13 @@ Statistics for: rbox 10 D2 d | qvoronoi s Qu Gv Number of points processed: 14 - Number of hyperplanes created: 46 + Number of hyperplanes created: 50 Number of facets in hull: 24 - Number of distance tests for qhull: 85 - Number of distance tests for merging: 213 - Number of distance tests for checking: 304 + Number of distance tests for qhull: 96 + Number of distance tests for merging: 229 + Number of distance tests for checking: 138 Number of merged facets: 1 - CPU seconds to compute hull (after input): 0.015 + CPU seconds to compute hull (after input): 0 rbox 10 D3 | qvoronoi s FQ QV5 p | qconvex s G >eg/eg.19.voronoi.region.3 @@ -1224,9 +1284,9 @@ Statistics for: rbox 10 D3 | qvoronoi s FQ QV5 p Number of points processed: 10 - Number of hyperplanes created: 44 + Number of hyperplanes created: 43 Number of facets in hull: 27 - Number of distance tests for qhull: 67 + Number of distance tests for qhull: 66 CPU seconds to compute hull (after input): 0 @@ -1239,10 +1299,10 @@ Statistics for: rbox 10 D3 | qvoronoi s FQ QV5 p | qconvex s G Number of points processed: 10 - Number of hyperplanes created: 18 - Number of distance tests for qhull: 45 - Number of distance tests for merging: 130 - Number of distance tests for checking: 89 + Number of hyperplanes created: 17 + Number of distance tests for qhull: 44 + Number of distance tests for merging: 135 + Number of distance tests for checking: 79 Number of merged facets: 7 CPU seconds to compute hull (after input): 0 @@ -1257,10 +1317,10 @@ Statistics for: rbox r s 20 Z1 G0.2 | qconvex s QR1 G QR1 Number of points processed: 41 - Number of hyperplanes created: 115 - Number of distance tests for qhull: 624 - Number of distance tests for merging: 1584 - Number of distance tests for checking: 721 + Number of hyperplanes created: 117 + Number of distance tests for qhull: 630 + Number of distance tests for merging: 1607 + Number of distance tests for checking: 680 Number of merged facets: 61 CPU seconds to compute hull (after input): 0 @@ -1270,80 +1330,80 @@ Number of vertices: 65 Number of coplanar points: 135 - Number of facets: 52 - Number of non-simplicial facets: 43 + Number of facets: 59 + Number of non-simplicial facets: 41 Statistics for: rbox 200 s | qconvex s Qc R0.014 Gpav - Number of points processed: 73 - Number of hyperplanes created: 291 - Number of distance tests for qhull: 9744 - Number of distance tests for merging: 4407 - Number of distance tests for checking: 4026 - Number of merged facets: 176 - CPU seconds to compute hull (after input): 0.015 - Maximum distance of point above facet: 0.048 (0.9x) - Maximum distance of vertex below facet: -0.098 (1.7x) + Number of points processed: 71 + Number of hyperplanes created: 298 + Number of distance tests for qhull: 11700 + Number of distance tests for merging: 4151 + Number of distance tests for checking: 5318 + Number of merged facets: 153 + CPU seconds to compute hull (after input): 0.001 + Maximum distance of point above facet: 0.047 (0.8x) + Maximum distance of vertex below facet: -0.075 (1.3x) rbox 1000 s| qconvex s C0.01 Qc Gcrp >eg/eg.22a.merge.sphere.01 Convex hull of 1000 points in 3-d: - Number of vertices: 223 - Number of coplanar points: 777 - Number of facets: 117 + Number of vertices: 224 + Number of coplanar points: 776 + Number of facets: 119 Number of non-simplicial facets: 117 Statistics for: rbox 1000 s | qconvex s C0.01 Qc Gcrp Number of points processed: 1000 - Number of hyperplanes created: 5545 - Number of distance tests for qhull: 121035 - Number of distance tests for merging: 79123 - Number of distance tests for checking: 8141 - Number of merged facets: 1879 - CPU seconds to compute hull (after input): 0.016 - Maximum distance of vertex below facet: -0.04 (1.3x) + Number of hyperplanes created: 5544 + Number of distance tests for qhull: 122395 + Number of distance tests for merging: 77744 + Number of distance tests for checking: 7926 + Number of merged facets: 1877 + CPU seconds to compute hull (after input): 0.009 + Maximum distance of vertex below facet: -0.041 (1.4x) rbox 1000 s| qconvex s C-0.01 Qc Gcrp >eg/eg.22b.merge.sphere.-01 Convex hull of 1000 points in 3-d: - Number of vertices: 102 - Number of coplanar points: 898 - Number of facets: 103 - Number of non-simplicial facets: 75 + Number of vertices: 103 + Number of coplanar points: 897 + Number of facets: 96 + Number of non-simplicial facets: 77 Statistics for: rbox 1000 s | qconvex s C-0.01 Qc Gcrp - Number of points processed: 108 - Number of hyperplanes created: 467 - Number of distance tests for qhull: 71156 - Number of distance tests for merging: 6748 - Number of distance tests for checking: 31209 - Number of merged facets: 256 - CPU seconds to compute hull (after input): 0.015 - Maximum distance of point above facet: 0.031 (1.0x) - Maximum distance of vertex below facet: -0.065 (2.2x) + Number of points processed: 105 + Number of hyperplanes created: 447 + Number of distance tests for qhull: 60561 + Number of distance tests for merging: 6257 + Number of distance tests for checking: 21333 + Number of merged facets: 240 + CPU seconds to compute hull (after input): 0.002 + Maximum distance of point above facet: 0.025 (0.8x) + Maximum distance of vertex below facet: -0.03 (1.0x) rbox 1000 s| qconvex s C0.05 Qc Gcrpv >eg/eg.22c.merge.sphere.05 Convex hull of 1000 points in 3-d: - Number of vertices: 48 - Number of coplanar points: 952 - Number of facets: 26 - Number of non-simplicial facets: 26 + Number of vertices: 36 + Number of coplanar points: 964 + Number of facets: 20 + Number of non-simplicial facets: 20 Statistics for: rbox 1000 s | qconvex s C0.05 Qc Gcrpv Number of points processed: 1000 - Number of hyperplanes created: 5545 - Number of distance tests for qhull: 55658 - Number of distance tests for merging: 83457 - Number of distance tests for checking: 7742 - Number of merged facets: 1970 - CPU seconds to compute hull (after input): 0.031 + Number of hyperplanes created: 5544 + Number of distance tests for qhull: 50001 + Number of distance tests for merging: 82257 + Number of distance tests for checking: 7446 + Number of merged facets: 1976 + CPU seconds to compute hull (after input): 0.015 Maximum distance of vertex below facet: -0.21 (1.4x) rbox 1000 s| qconvex s C-0.05 Qc Gcrpv >eg/eg.22d.merge.sphere.-05 @@ -1358,12 +1418,12 @@ Statistics for: rbox 1000 s | qconvex s C-0.05 Qc Gcrpv Number of points processed: 22 - Number of hyperplanes created: 69 - Number of distance tests for qhull: 44445 - Number of distance tests for merging: 1034 - Number of distance tests for checking: 13690 + Number of hyperplanes created: 68 + Number of distance tests for qhull: 41237 + Number of distance tests for merging: 1029 + Number of distance tests for checking: 12702 Number of merged facets: 41 - CPU seconds to compute hull (after input): 0 + CPU seconds to compute hull (after input): 0.002 Maximum distance of point above facet: 0.14 (0.9x) Maximum distance of vertex below facet: -0.15 (1.0x) @@ -1372,7 +1432,7 @@ Convex hull of 1000 points in 3-d: Number of vertices: 8 - Number of coplanar points: 741 + Number of coplanar points: 743 Number of facets: 6 Number of non-simplicial facets: 6 @@ -1380,11 +1440,11 @@ Number of points processed: 95 Number of hyperplanes created: 453 - Number of distance tests for qhull: 60073 - Number of distance tests for merging: 5413 - Number of distance tests for checking: 6014 + Number of distance tests for qhull: 59218 + Number of distance tests for merging: 5460 + Number of distance tests for checking: 6022 Number of merged facets: 146 - CPU seconds to compute hull (after input): 0.015 + CPU seconds to compute hull (after input): 0.002 Maximum distance of vertex below facet: -0.18 (0.6x) rbox 5000 D4 | qconvex s GD0v Pd0:0.5 C-0.02 C0.1 >eg/eg.24.merge.cube.4d-in-3d @@ -1398,15 +1458,15 @@ Statistics for: rbox 5000 D4 | qconvex s GD0v Pd0:0.5 C-0.02 C0.1 - Number of points processed: 30 - Number of hyperplanes created: 182 - Number of distance tests for qhull: 658286 - Number of distance tests for merging: 4770 - Number of distance tests for checking: 45000 - Number of merged facets: 188 - CPU seconds to compute hull (after input): 0.031 + Number of points processed: 28 + Number of hyperplanes created: 161 + Number of distance tests for qhull: 606114 + Number of distance tests for merging: 8562 + Number of distance tests for checking: 40020 + Number of merged facets: 159 + CPU seconds to compute hull (after input): 0.012 Maximum distance of point above facet: 0.14 (0.4x) - Maximum distance of vertex below facet: -0.31 (0.8x) + Maximum distance of vertex below facet: -0.28 (0.7x) rbox 5000 D4 | qconvex s s C-0.02 C0.1 Gh >eg/eg.30.4d.merge.cube @@ -1418,15 +1478,15 @@ Statistics for: rbox 5000 D4 | qconvex s s C-0.02 C0.1 Gh - Number of points processed: 30 - Number of hyperplanes created: 182 - Number of distance tests for qhull: 658286 - Number of distance tests for merging: 4770 - Number of distance tests for checking: 45000 - Number of merged facets: 188 - CPU seconds to compute hull (after input): 0.031 + Number of points processed: 28 + Number of hyperplanes created: 161 + Number of distance tests for qhull: 606114 + Number of distance tests for merging: 8562 + Number of distance tests for checking: 40020 + Number of merged facets: 159 + CPU seconds to compute hull (after input): 0.012 Maximum distance of point above facet: 0.14 (0.4x) - Maximum distance of vertex below facet: -0.31 (0.8x) + Maximum distance of vertex below facet: -0.28 (0.7x) rbox 20 D3 | qdelaunay s G >eg/eg.31.4d.delaunay @@ -1440,7 +1500,7 @@ Number of points processed: 20 Number of hyperplanes created: 162 Number of facets in hull: 81 - Number of distance tests for qhull: 302 + Number of distance tests for qhull: 303 CPU seconds to compute hull (after input): 0 rbox 30 s D4 | qconvex s G Pd0d1d2D3 >eg/eg.32.4d.octant @@ -1455,7 +1515,7 @@ Number of points processed: 30 Number of hyperplanes created: 340 - Number of distance tests for qhull: 650 + Number of distance tests for qhull: 649 CPU seconds to compute hull (after input): 0 rbox 10 r s Z1 G0.3 | qconvex G >eg/eg.33a.cone @@ -1472,91 +1532,72 @@ Statistics for: rbox 10 r s Z1 G0.3 | qconvex FQ FV n | qhalf FQ s Fp Number of points processed: 21 - Number of hyperplanes created: 48 - Number of distance tests for qhull: 162 - Number of distance tests for merging: 435 - Number of distance tests for checking: 261 - Number of merged facets: 18 + Number of hyperplanes created: 49 + Number of distance tests for qhull: 170 + Number of distance tests for merging: 445 + Number of distance tests for checking: 240 + Number of merged facets: 17 CPU seconds to compute hull (after input): 0 echo ==the following should generate flipped and concave facets== >/dev/null rbox 200 s | qhull Q0 s R0.014 Gav Po >eg/eg.21a.roundoff.errors -QH6136 qhull precision error: facet f506 is flipped, distance= 0.461556194655 -QH6136 qhull precision error: facet f592 is flipped, distance= 0.439612545215 -QH6136 qhull precision error: facet f604 is flipped, distance= 0.465768128315 -QH6136 qhull precision error: facet f506 is flipped, distance= 0.468691154013 -QH6136 qhull precision error: facet f592 is flipped, distance= 0.450451888758 -QH6136 qhull precision error: facet f604 is flipped, distance= 0.471152553888 -QH6115 qhull precision error: f127 is concave to f267, since p65(v17) is 0.02603 above -QH6115 qhull precision error: f139 is concave to f285, since p13(v34) is 0.02883 above -QH6115 qhull precision error: f166 is concave to f316, since p189(v18) is 0.008704 above -QH6115 qhull precision error: f198 is concave to f604, since p109(v11) is 0.02657 above -QH6115 qhull precision error: f242 is concave to f527, since p65(v17) is 0.02938 above -QH6115 qhull precision error: f259 is concave to f462, since p59(v60) is 0.008633 above -QH6115 qhull precision error: f280 is concave to f286, since p22(v65) is 0.01973 above -QH6115 qhull precision error: f288 is concave to f310, since p71(v67) is 0.02406 above -QH6115 qhull precision error: f297 is concave to f487, since p180(v38) is 0.008078 above -QH6115 qhull precision error: f313 is concave to f496, since p63(v41) is 0.03309 above -QH6115 qhull precision error: f330 is concave to f331, since p10(v64) is 0.02231 above -QH6115 qhull precision error: f397 is concave to f542, since p69(v51) is 0.01923 above -QH6115 qhull precision error: f399 is concave to f543, since p155(v31) is 0.01245 above -QH6115 qhull precision error: f417 is concave to f552, since p184(v71) is 0.009005 above -QH6115 qhull precision error: f426 is concave to f477, since p135(v95) is 0.016 above -QH6115 qhull precision error: f431 is concave to f555, since p135(v95) is 0.008306 above -QH6115 qhull precision error: f442 is concave to f559, since p97(v98) is 0.04007 above -QH6115 qhull precision error: f444 is concave to f245, since p194(v99) is 0.0124 above -QH6115 qhull precision error: f457 is concave to f505, since p70(v101) is 0.05613 above -QH6115 qhull precision error: f460 is concave to f565, since p176(v61) is 0.02392 above -QH6115 qhull precision error: f469 is concave to f580, since p119(v9) is 0.07256 above -QH6115 qhull precision error: f472 is concave to f582, since p138(v63) is 0.04511 above -QH6115 qhull precision error: f481 is concave to f624, since p79(v93) is 0.0132 above -QH6115 qhull precision error: f484 is concave to f483, since p79(v93) is 0.01528 above -QH6115 qhull precision error: f492 is concave to f551, since p163(v108) is 0.05382 above -QH6115 qhull precision error: f501 is concave to f602, since p29(v10) is 0.01867 above -QH6115 qhull precision error: f505 is concave to f457, since p128(v110) is 0.008966 above -QH6113 qhull precision error: f506 is flipped(interior point is outside) -QH6115 qhull precision error: f520 is concave to f541, since p100(v114) is 0.009004 above -QH6115 qhull precision error: f521 is concave to f516, since p100(v114) is 0.01561 above -QH6115 qhull precision error: f522 is concave to f526, since p100(v114) is 0.0118 above -QH6115 qhull precision error: f534 is concave to f535, since p190(v2) is 0.01582 above -QH6115 qhull precision error: f535 is concave to f534, since p154(v47) is 0.009917 above -QH6115 qhull precision error: f544 is concave to f620, since p58(v91) is 0.01945 above -QH6115 qhull precision error: f551 is concave to f492, since p41(v120) is 0.0114 above -QH6115 qhull precision error: f559 is concave to f442, since p38(v122) is 0.01392 above -QH6115 qhull precision error: f565 is concave to f460, since p73(v123) is 0.01004 above -QH6115 qhull precision error: f566 is concave to f571, since p133(v16) is 0.01303 above -QH6115 qhull precision error: f580 is concave to f469, since p158(v127) is 0.0104 above -QH6113 qhull precision error: f592 is flipped(interior point is outside) -QH6115 qhull precision error: f595 is concave to f626, since p22(v65) is 0.008193 above -QH6115 qhull precision error: f603 is concave to f500, since p14(v132) is 0.00736 above -QH6113 qhull precision error: f604 is flipped(interior point is outside) -QH6115 qhull precision error: f619 is concave to f617, since p12(v1) is 0.007428 above +QH6136 qhull precision error: facet f577 is flipped, distance= 0.444437742328 +QH6136 qhull precision error: facet f598 is flipped, distance= 0.397912421371 +QH6115 qhull precision error: f136 is concave to f206, since p13(v33) is 0.04846 above f206 +QH6115 qhull precision error: f175 is concave to f491, since p63(v41) is 0.02842 above f491 +QH6115 qhull precision error: f188 is concave to f357, since p13(v33) is 0.05044 above f357 +QH6115 qhull precision error: f192 is concave to f430, since p165(v44) is 0.01805 above f430 +QH6115 qhull precision error: f206 is concave to f136, since p51(v47) is 0.007003 above f136 +QH6115 qhull precision error: f231 is concave to f495, since p53(v5) is 0.01049 above f495 +QH6115 qhull precision error: f264 is concave to f539, since p70(v31) is 0.02908 above f539 +QH6115 qhull precision error: f275 is concave to f442, since p176(v60) is 0.03539 above f442 +QH6115 qhull precision error: f276 is concave to f256, since p131(v61) is 0.01036 above f256 +QH6115 qhull precision error: f294 is concave to f465, since p13(v33) is 0.009524 above f465 +QH6115 qhull precision error: f307 is concave to f485, since p99(v67) is 0.0106 above f485 +QH6115 qhull precision error: f311 is concave to f476, since p87(v16) is 0.03213 above f476 +QH6115 qhull precision error: f345 is concave to f344, since p13(v33) is 0.01277 above f344 +QH6115 qhull precision error: f357 is concave to f188, since p23(v76) is 0.008612 above f188 +QH6115 qhull precision error: f381 is concave to f512, since p161(v13) is 0.05502 above f512 +QH6115 qhull precision error: f386 is concave to f532, since p152(v82) is 0.01786 above f532 +QH6115 qhull precision error: f436 is concave to f461, since p173(v92) is 0.007229 above f461 +QH6115 qhull precision error: f436 is concave to f591, since p109(v11) is 0.04018 above f591 +QH6115 qhull precision error: f488 is concave to f487, since p180(v32) is 0.01013 above f487 +QH6115 qhull precision error: f539 is concave to f264, since p90(v113) is 0.01548 above f264 +QH6115 qhull precision error: f549 is concave to f592, since p81(v95) is 0.0117 above f592 +QH6115 qhull precision error: f562 is concave to f460, since p21(v117) is 0.007454 above f460 +QH6115 qhull precision error: f563 is concave to f595, since p91(v49) is 0.03273 above f595 +QH6115 qhull precision error: f569 is concave to f329, since p62(v119) is 0.007692 above f329 +QH6113 qhull precision error: f577 is flipped (interior point is outside) +QH6113 qhull precision error: f598 is flipped (interior point is outside) +QH6115 qhull precision error: f603 is concave to f605, since p79(v52) is 0.01194 above f605 Convex hull of 200 points in 3-d: - Number of vertices: 138 - Number of facets: 272 + Number of vertices: 128 + Number of facets: 252 Statistics for: rbox 200 s | qhull Q0 s R0.014 Gav Po - Number of points processed: 138 - Number of hyperplanes created: 629 - Number of distance tests for qhull: 4659 + Number of points processed: 128 + Number of hyperplanes created: 610 + Number of distance tests for qhull: 4539 CPU seconds to compute hull (after input): 0 precision problems (corrected unless 'Q0' or an error) - 120 coplanar half ridges in output - 41 concave half ridges in output - 3 flipped facets - 125 coplanar horizon facets for new vertices - 62 coplanar points during partitioning + 101 coplanar half ridges in output + 25 concave half ridges in output + 2 flipped facets + 112 coplanar horizon facets for new vertices + 72 coplanar points during partitioning echo ==the preceding should report flipped and concave facets== >/dev/null +echo END eg/q_eg >/dev/null eg/q_egtest +eg/q_egtest: Temporarily add "$PWD/bin" to $PATH for access to qconvex,etc. ============================== ========= eg/q_egtest ======== == Create geomview tests ===== @@ -1573,7 +1614,7 @@ Number of points processed: 6 Number of hyperplanes created: 11 - Number of distance tests for qhull: 11 + Number of distance tests for qhull: 10 Number of distance tests for merging: 59 Number of distance tests for checking: 54 Number of merged facets: 1 @@ -1592,12 +1633,12 @@ Statistics for: rbox d D2 | qconvex s Gnv Tc Tv Number of points processed: 4 - Number of hyperplanes created: 6 - Number of distance tests for qhull: 4 + Number of hyperplanes created: 5 + Number of distance tests for qhull: 3 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 1.3e-015 of +Output completed. Verifying that all points are below 1.3e-15 of all facets. Will make 16 distance computations. rbox d D3 | qconvex s Gnrp Tc Tv >eg/eg.t03.points.3 @@ -1610,7 +1651,7 @@ Number of points processed: 6 Number of hyperplanes created: 11 - Number of distance tests for qhull: 11 + Number of distance tests for qhull: 10 Number of distance tests for merging: 59 Number of distance tests for checking: 54 Number of merged facets: 1 @@ -1629,12 +1670,12 @@ Statistics for: rbox d D2 | qconvex s Gnp Tc Tv Number of points processed: 4 - Number of hyperplanes created: 6 - Number of distance tests for qhull: 4 + Number of hyperplanes created: 5 + Number of distance tests for qhull: 3 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 1.3e-015 of +Output completed. Verifying that all points are below 1.3e-15 of all facets. Will make 16 distance computations. rbox c D4 | qconvex s C0.05 GnpcD3 Pd3:0.5 Tc Tv >eg/eg.t05.centrum.points.4-3 @@ -1648,10 +1689,10 @@ Statistics for: rbox c D4 | qconvex s C0.05 GnpcD3 Pd3:0.5 Tc Tv Number of points processed: 16 - Number of hyperplanes created: 26 - Number of distance tests for qhull: 168 - Number of distance tests for merging: 963 - Number of distance tests for checking: 144 + Number of hyperplanes created: 25 + Number of distance tests for qhull: 167 + Number of distance tests for merging: 565 + Number of distance tests for checking: 532 Number of merged facets: 36 CPU seconds to compute hull (after input): 0 @@ -1669,7 +1710,7 @@ Number of points processed: 6 Number of hyperplanes created: 11 - Number of distance tests for qhull: 11 + Number of distance tests for qhull: 10 Number of distance tests for merging: 59 Number of distance tests for checking: 54 Number of merged facets: 1 @@ -1689,9 +1730,9 @@ Number of points processed: 6 Number of hyperplanes created: 11 - Number of distance tests for qhull: 11 - Number of distance tests for merging: 169 - Number of distance tests for checking: 54 + Number of distance tests for qhull: 10 + Number of distance tests for merging: 93 + Number of distance tests for checking: 130 Number of merged facets: 1 CPU seconds to compute hull (after input): 0 @@ -1708,8 +1749,8 @@ Statistics for: rbox d D2 | qconvex s C0.05 Gc Tc Tv Number of points processed: 4 - Number of hyperplanes created: 6 - Number of distance tests for qhull: 4 + Number of hyperplanes created: 5 + Number of distance tests for qhull: 3 CPU seconds to compute hull (after input): 0 @@ -1726,7 +1767,7 @@ Number of points processed: 6 Number of hyperplanes created: 11 - Number of distance tests for qhull: 11 + Number of distance tests for qhull: 10 Number of distance tests for merging: 59 Number of distance tests for checking: 54 Number of merged facets: 1 @@ -1747,7 +1788,7 @@ Number of points processed: 6 Number of hyperplanes created: 11 - Number of distance tests for qhull: 11 + Number of distance tests for qhull: 10 Number of distance tests for merging: 59 Number of distance tests for checking: 54 Number of merged facets: 1 @@ -1768,7 +1809,7 @@ Number of points processed: 6 Number of hyperplanes created: 11 - Number of distance tests for qhull: 11 + Number of distance tests for qhull: 10 Number of distance tests for merging: 59 Number of distance tests for checking: 54 Number of merged facets: 1 @@ -1789,9 +1830,9 @@ Number of points processed: 6 Number of hyperplanes created: 11 - Number of distance tests for qhull: 11 - Number of distance tests for merging: 169 - Number of distance tests for checking: 54 + Number of distance tests for qhull: 10 + Number of distance tests for merging: 93 + Number of distance tests for checking: 130 Number of merged facets: 1 CPU seconds to compute hull (after input): 0 @@ -1810,7 +1851,7 @@ Number of points processed: 6 Number of hyperplanes created: 11 - Number of distance tests for qhull: 11 + Number of distance tests for qhull: 10 Number of distance tests for merging: 59 Number of distance tests for checking: 54 Number of merged facets: 1 @@ -1831,7 +1872,7 @@ Number of points processed: 6 Number of hyperplanes created: 11 - Number of distance tests for qhull: 11 + Number of distance tests for qhull: 10 Number of distance tests for merging: 59 Number of distance tests for checking: 54 Number of merged facets: 1 @@ -1852,12 +1893,12 @@ Statistics for: rbox c D4 | qconvex s GvD0 Pd0:0.5 Tc Tv Number of points processed: 16 - Number of hyperplanes created: 26 - Number of distance tests for qhull: 168 - Number of distance tests for merging: 788 - Number of distance tests for checking: 144 + Number of hyperplanes created: 25 + Number of distance tests for qhull: 167 + Number of distance tests for merging: 510 + Number of distance tests for checking: 412 Number of merged facets: 36 - CPU seconds to compute hull (after input): 0 + CPU seconds to compute hull (after input): 0.001 Output completed. Verifying that all points are below outer planes of @@ -1874,10 +1915,10 @@ Statistics for: rbox c D4 | qhull s Q0 C0 GpD0 Pd0:0.5 Tc Tv Number of points processed: 16 - Number of hyperplanes created: 62 - Number of distance tests for qhull: 163 - Number of distance tests for merging: 1304 - Number of distance tests for checking: 144 + Number of hyperplanes created: 61 + Number of distance tests for qhull: 162 + Number of distance tests for merging: 1272 + Number of distance tests for checking: 244 Number of merged facets: 36 CPU seconds to compute hull (after input): 0 @@ -1896,10 +1937,10 @@ Statistics for: rbox c D4 | qconvex s GahD0 Pd0:0.5 Tc Tv Number of points processed: 16 - Number of hyperplanes created: 26 - Number of distance tests for qhull: 168 - Number of distance tests for merging: 788 - Number of distance tests for checking: 144 + Number of hyperplanes created: 25 + Number of distance tests for qhull: 167 + Number of distance tests for merging: 510 + Number of distance tests for checking: 412 Number of merged facets: 36 CPU seconds to compute hull (after input): 0 @@ -1919,11 +1960,11 @@ Number of points processed: 18 Number of hyperplanes created: 60 - Number of distance tests for qhull: 3313 - Number of distance tests for merging: 1030 - Number of distance tests for checking: 1347 + Number of distance tests for qhull: 3110 + Number of distance tests for merging: 784 + Number of distance tests for checking: 1502 Number of merged facets: 29 - CPU seconds to compute hull (after input): 0 + CPU seconds to compute hull (after input): 0.001 Maximum distance of point above facet: 0.092 (0.6x) Maximum distance of vertex below facet: -0.14 (0.9x) @@ -1942,7 +1983,7 @@ Number of points processed: 30 Number of hyperplanes created: 340 - Number of distance tests for qhull: 650 + Number of distance tests for qhull: 649 CPU seconds to compute hull (after input): 0 rbox 100 s P1,1,1 | qconvex s QG-0 Pgp Tc G >eg/eg.t20.notvisible @@ -1956,9 +1997,9 @@ Statistics for: rbox 100 s P1,1,1 | qconvex s QG-0 Pgp Tc G Number of points processed: 100 - Number of hyperplanes created: 503 - Number of distance tests for qhull: 1631 - CPU seconds to compute hull (after input): 0 + Number of hyperplanes created: 502 + Number of distance tests for qhull: 1630 + CPU seconds to compute hull (after input): 0.001 rbox 100 s | qconvex s QV-10 Pgp Tc G >eg/eg.t21.notvertex @@ -1972,8 +2013,8 @@ Number of points processed: 100 Number of hyperplanes created: 494 - Number of distance tests for qhull: 1641 - CPU seconds to compute hull (after input): 0 + Number of distance tests for qhull: 1640 + CPU seconds to compute hull (after input): 0.002 rbox 100 r D2 P1,1 | qhull s Pd0:0.7 PD0:0.8 QgG0 G Tv >eg/eg.t22.split @@ -1985,39 +2026,39 @@ Statistics for: rbox 100 r D2 P1,1 | qhull s Pd0:0.7 PD0:0.8 QgG0 G Tv - Number of points processed: 89 + Number of points processed: 42 Number of hyperplanes created: 176 Number of distance tests for qhull: 1099 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 2.6e-015 of +Output completed. Verifying that all points are below 2.6e-15 of all good facets. Will make 303 distance computations. rbox 100 D2 c G1.0 | qvoronoi s A-0.95 Gna Tv >eg/eg.t23.voronoi.imprecise Voronoi diagram by the convex hull of 104 points in 3-d: - Number of Voronoi regions: 13 - Total number of nearly incident points: 91 - Number of Voronoi vertices: 13 - Number of non-simplicial Voronoi vertices: 5 + Number of Voronoi regions: 16 + Total number of nearly incident points: 88 + Number of Voronoi vertices: 11 + Number of non-simplicial Voronoi vertices: 8 Statistics for: rbox 100 D2 c G1.0 | qvoronoi s A-0.95 Gna Tv - Number of points processed: 13 - Number of hyperplanes created: 39 - Number of facets in hull: 14 - Number of distance tests for qhull: 2740 - Number of distance tests for merging: 464 - Number of distance tests for checking: 1119 - Number of merged facets: 13 + Number of points processed: 16 + Number of hyperplanes created: 48 + Number of facets in hull: 12 + Number of distance tests for qhull: 2378 + Number of distance tests for merging: 614 + Number of distance tests for checking: 920 + Number of merged facets: 23 CPU seconds to compute hull (after input): 0 - Maximum distance of point above facet: 0.098 (0.1x) - Maximum distance of vertex below facet: -0.082 (0.1x) + Maximum distance of point above facet: 0.046 + Maximum distance of vertex below facet: -0.1 (0.1x) Output completed. Verifying that all points are below outer planes of -all facets. Will make 1352 distance computations. +all facets. Will make 1144 distance computations. rbox 30 s D4 | qconvex s Gh Pd0d1d2D3 Tc >eg/eg.t24.intersect.precise.4d Convex hull of 30 points in 4-d: @@ -2030,57 +2071,52 @@ Number of points processed: 30 Number of hyperplanes created: 340 - Number of distance tests for qhull: 650 + Number of distance tests for qhull: 649 CPU seconds to compute hull (after input): 0 echo ==the following generates an error== >/dev/null rbox 1000 D4 | qhull Q0 s Po R0.005 Ga Tc Tv >eg/eg.t25.neighbors.4d -QH6136 qhull precision error: facet f491 is flipped, distance= 0.413460414284 -QH6136 qhull precision error: facet f949 is flipped, distance= 0.558894018107 -QH6107 qhull precision error: facets f977, f981 and f978 meet at a ridge with more than 2 neighbors. Can not continue. +QH6107 qhull topology error: facets f394, f412 and f396 meet at a ridge with more than 2 neighbors. Can not continue due to no qh.PREmerge and no 'Qx' (MERGEexact) ERRONEOUS FACET: -- f977 - - flags: bottom simplicial new - - normal: -0.07131 -0.04413 0.08982 -0.9924 - - offset: -0.5084414 - - vertices: p108(v73) p722(v63) p713(v35) p241(v7) - - neighboring facets: f824 f968 f971 f978 +- f394 + - flags: bottom simplicial newfacet + - offset: 0 + - vertices: p938(v40) p381(v18) p241(v7) p327(v3) + - neighboring facets: f121 f396 f398 f395 ERRONEOUS OTHER FACET: -- f981 - - flags: top simplicial new - - normal: -0.005308 -0.0126 0.005272 -0.9999 - - offset: -0.4947257 - - vertices: p108(v73) p722(v63) p713(v35) p62(v20) - - neighboring facets: f825 +- f412 + - flags: bottom simplicial newfacet + - offset: 0 + - vertices: p938(v40) p241(v7) p837(v6) p327(v3) + - neighboring facets: f121 f398 ERRONEOUS and NEIGHBORING FACETS to output While executing: rbox 1000 D4 | qhull Q0 s Po R0.005 Ga Tc Tv -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99109684 Q0-no-premerge summary Poutput-forced - Random_perturb 0.005 Gall-points Tcheck-frequently Tverify _max-width 1 - Error-roundoff 0.0025 Visible-distance 0.0025 U-coplanar-distance 0.0025 - Width-outside 0.005 _wide-facet 0.015 -Last point added to hull was p108. +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213546123 Q0-no-premerge summary Poutput-forced + Random-perturb 0.005 Gall-points Tcheck-frequently Tverify _max-width 1 + Error-roundoff 0.0025 Visible-distance 0.0025 U-max-coplanar 0.0025 + Width-outside 0.005 _wide-facet 0.015 _maxoutside 0.025 +Last point added to hull was p938. Convex hull of 1000 points in 4-d: - Number of vertices: 68 - Number of facets: 346 + Number of vertices: 38 + Number of facets: 180 Statistics for: rbox 1000 D4 | qhull Q0 s Po R0.005 Ga Tc Tv - Number of points processed: 73 - Number of hyperplanes created: 986 - Number of distance tests for qhull: 28532 + Number of points processed: 39 + Number of hyperplanes created: 394 + Number of distance tests for qhull: 21752 precision problems (corrected unless 'Q0' or an error) - 2 flipped facets - 42 coplanar horizon facets for new vertices - 141 coplanar points during partitioning - 9 degenerate hyperplanes recomputed with gaussian elimination - 9 nearly singular or axis-parallel hyperplanes + 1 flipped facets + 13 coplanar horizon facets for new vertices + 103 coplanar points during partitioning + 4 degenerate hyperplanes recomputed with gaussian elimination Precision problems were detected during construction of the convex hull. This occurs because convex hull algorithms assume that calculations are @@ -2116,9 +2152,10 @@ - use option 'Ft' to triangulate the output by adding points - use exact arithmetic (see "Imprecision in Qhull", qh-impre.htm) echo ==the previous should generate an error== >/dev/null +echo END eg/q_egtest >/dev/null - -eg/q_test +bash -c eg/q_test +eg/q_test: Temporarily add "$PWD/bin" to $PATH for access to qconvex,etc. Convex hull of 8 points in 3-d: @@ -2130,9 +2167,9 @@ Number of points processed: 8 Number of hyperplanes created: 11 - Number of distance tests for qhull: 35 - Number of distance tests for merging: 142 - Number of distance tests for checking: 56 + Number of distance tests for qhull: 34 + Number of distance tests for merging: 96 + Number of distance tests for checking: 100 Number of merged facets: 6 CPU seconds to compute hull (after input): 0 @@ -2148,31 +2185,31 @@ Statistics for: | qhull s d Tcv Number of points processed: 8 - Number of hyperplanes created: 24 - Number of facets in hull: 15 - Number of distance tests for qhull: 29 + Number of hyperplanes created: 28 + Number of facets in hull: 18 + Number of distance tests for qhull: 28 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 1.3e-014 of +Output completed. Verifying that all points are below 1e-14 of all facets. Will make 80 distance computations. Delaunay triangulation by the convex hull of 8 points in 4-d: Number of input sites: 8 - Number of Delaunay regions: 11 + Number of Delaunay regions: 10 Statistics for: | qhull s d Tcv Number of points processed: 8 Number of hyperplanes created: 26 - Number of facets in hull: 18 + Number of facets in hull: 17 Number of distance tests for qhull: 28 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 1.1e-014 of -all facets. Will make 88 distance computations. +Output completed. Verifying that all points are below 1e-14 of +all facets. Will make 80 distance computations. Halfspace intersection by the convex hull of 8 points in 3-d: @@ -2185,9 +2222,9 @@ Number of points processed: 8 Number of hyperplanes created: 11 - Number of distance tests for qhull: 35 - Number of distance tests for merging: 142 - Number of distance tests for checking: 56 + Number of distance tests for qhull: 34 + Number of distance tests for merging: 96 + Number of distance tests for checking: 100 Number of merged facets: 6 CPU seconds to compute hull (after input): 0 @@ -2199,26 +2236,36 @@ == Check qhull programs ====== ============================== -qhull => qhull_r 7.2.0 (2015.2.r 2016/01/18) -qconvex => qhull 7.2.0 (2015.2 2016/01/18) -qvoronoi => qhull 7.2.0 (2015.2 2016/01/18) -qdelaunay => qhull 7.2.0 (2015.2 2016/01/18) -qhalf => qhull 7.2.0 (2015.2 2016/01/18) - +qhull => qhull_r 8.0.1 (2020.2.r 2020/07/24) +qconvex => qhull 8.0.1 (2020.2 2020/07/24) +qvoronoi => qhull 8.0.1 (2020.2 2020/07/24) +qdelaunay => qhull 8.0.1 (2020.2 2020/07/24) +qhalf => qhull 8.0.1 (2020.2 2020/07/24) +-rwxr-xr-x 1 bbarber 197121 344064 Jul 24 21:06 /d/bash/local/qhull/bin/qconvex +-rwxr-xr-x 1 bbarber 197121 344576 Jul 24 21:06 /d/bash/local/qhull/bin/qdelaunay +-rwxr-xr-x 1 bbarber 197121 344576 Jul 24 21:06 /d/bash/local/qhull/bin/qhalf +-rwxr-xr-x 1 bbarber 197121 339968 Jul 24 21:06 /d/bash/local/qhull/bin/qhull +-rwxr-xr-x 1 bbarber 197121 343552 Jul 24 21:06 /d/bash/local/qhull/bin/qvoronoi +-rwxr-xr-x 1 bbarber 197121 13312 Jul 24 21:06 /d/bash/local/qhull/bin/user_eg +-rwxr-xr-x 1 bbarber 197121 320000 Jul 24 21:06 /d/bash/local/qhull/bin/user_eg2 +-rwxr-xr-x 1 bbarber 197121 468480 Jul 24 21:06 /d/bash/local/qhull/bin/user_eg3 ============================== == check user_eg, user_eg2, and user_eg3 == errors if user_eg and user_eg2 not found ============================== -user_eg "QR1 p n Qt" "v p" Fp -This is the output from user_eg_r.c +user_eg + +======== +user_eg 'cube qhull options' 'Delaunay options' 'halfspace options' -It shows how qhull() may be called from an application using the qhull -reentrant library. user_eg is not part of qhull itself. If it appears -accidently, please remove user_eg_r.c from your project. If it fails -immediately, user_eg_r.c was incorrectly linked to the non-reentrant library. -Also try 'user_eg T1 2>&1' +This is the output from user_eg_r.c. It shows how qhull() may be called from +an application, via Qhull's shared, reentrant library. user_eg is not part of +Qhull itself. If user_eg fails immediately, user_eg_r.c was incorrectly linked +to Qhull's non-reentrant library, libqhull. +Try -- user_eg 'T1' 'T1' 'T1' +======== compute convex hull of cube after rotating input input -1 -1 -1 @@ -2229,181 +2276,26 @@ 1 -1 1 -1 1 1 1 1 1 -3 -8 -0.9124763375291641 1.390833937612012 -0.4826674750136243 --0.5764091147442416 0.565375258822974 -1.532352227508615 --0.1847368907548403 1.250953879569599 1.183632828365285 --1.673622343028246 0.4254952007805605 0.1339480758702939 -1.673622343028246 -0.4254952007805605 -0.1339480758702939 -0.1847368907548403 -1.250953879569599 -1.183632828365285 -0.5764091147442416 -0.565375258822974 1.532352227508615 --0.9124763375291641 -1.390833937612012 0.4826674750136243 -4 -12 --0.380573002749541 0.9081645691962865 -0.1743596995716652 -1 --0.380573002749541 0.9081645691962865 -0.1743596995716652 -1 -0.744442726136703 0.4127293393945193 0.5248423762474955 -1 -0.744442726136703 0.4127293393945193 0.5248423762474955 -1 --0.5486066141420022 -0.06994002902120672 0.8331501516894545 -1 --0.5486066141420022 -0.06994002902120672 0.8331501516894545 -1 -0.5486066141420022 0.06994002902120679 -0.8331501516894545 -1 -0.5486066141420022 0.06994002902120679 -0.8331501516894545 -1 -0.380573002749541 -0.9081645691962865 0.1743596995716652 -1 -0.380573002749541 -0.9081645691962865 0.1743596995716652 -1 --0.7444427261367029 -0.4127293393945193 -0.5248423762474955 -0.9999999999999997 --0.7444427261367029 -0.4127293393945193 -0.5248423762474955 -0.9999999999999997 - -8 vertices and 12 facets with normals: - -0.38 0.91 -0.17 - -0.38 0.91 -0.17 - 0.74 0.41 0.52 - 0.74 0.41 0.52 - -0.55 -0.07 0.83 - -0.55 -0.07 0.83 - 0.55 0.07 -0.83 - 0.55 0.07 -0.83 - 0.38 -0.91 0.17 - 0.38 -0.91 0.17 - -0.74 -0.41 -0.52 - -0.74 -0.41 -0.52 - -compute 3-d Delaunay triangulation -seed: 1453170146 -input --0.908 0.601 -0.255 - -0.66 -0.651 0.529 - 0.626 0.452 -0.506 --0.881 0.874 -0.534 --0.338 0.805 -0.994 - -0.43 -0.105 -0.239 --0.628 -0.892 -0.0884 - 0.379 -0.818 0.775 -3 -11 -0.1206234910713486 0.8106257590224304 1.046110467559872 -0.6034505523209381 -0.8490578882939199 -0.5062994704097396 --0.1098652805746826 0.6258694901385873 -0.2503246966707915 -0.289125075234291 -1.114104944766644 -2.301587454807958 --0.06038651887222346 0.9285609099720696 -0.1284510413623241 --1.713429009896733 -0.4906021101913347 -1.674553477323186 --1.072681352389381 -0.04611120787826117 -1.178566729185204 --1.688788369492729 -0.5274487028086174 -1.834504228551717 --1.411974391363738 -0.2499500717826609 -0.02344121748126604 --0.009395484577228164 0.7236162622894086 1.088700712276103 --0.0001242908449476943 -0.567023937674154 0.173755725953586 - -8 vertices and 18 facets with normals: - 0.47 -0.52 -0.6 0.38 - 0.085 0.57 0.74 -0.35 - 0.48 -0.67 -0.4 -0.4 - -0.13 0.74 -0.3 -0.59 - 0.11 -0.42 -0.88 -0.19 - 0.19 0.68 0.71 0.011 --0.057 0.87 -0.12 -0.47 - 0.49 0.55 0.41 0.53 --0.043 -0.37 -0.15 0.92 - -0.69 -0.2 -0.67 -0.2 - -0.64 -0.028 -0.71 -0.3 - -0.65 -0.2 -0.71 -0.19 - -0.93 -0.16 -0.015 -0.33 --0.0067 0.52 0.78 -0.36 --0.00016 -0.73 0.22 -0.64 - -0.97 -0.18 0.035 0.15 - -0.17 0.48 0.84 0.19 - -0.32 -0.31 0.19 0.87 - -find 3-d Delaunay triangle closest to [0.5, 0.5, ...] --0.43 -0.11 -0.24 - 0.38 -0.82 0.77 - 0.63 0.45 -0.51 --0.91 0.60 -0.25 - -Compute a new triangulation as a separate instance of Qhull -seed: 1453170147 -input --0.908 0.864 -0.744 - 0.258 0.414 0.967 - 0.72 -0.191 0.852 - 0.988 -0.359 0.504 --0.676 0.875 -0.887 - 0.63 -0.763 -0.224 - 0.139 -0.759 0.747 --0.247 0.36 0.636 -3 -10 --0.4925957364680179 -0.2611640062676175 -0.4139670162902063 -0.6279946734211253 0.6258341099344547 -0.429691099680779 --0.8450204672718732 -0.5771013029453928 -0.3607175181995652 --0.06286701532693678 2.816587817709126 0.5058642860673261 -0.7447774408865542 0.8206973693777764 -0.3966896996542739 -0.2743343895968138 -0.08667699575068594 0.1403537214803923 -0.281657248834964 -0.2131791712833152 0.2070161763534151 -0.2278041725704485 -0.1529994926952811 0.1795324994333687 -0.4627842556593114 0.2396919357050809 0.1283455479907359 -0.1149555911110416 -0.1382980200862171 0.7203299885416222 -8 vertices and 17 facets with normals: - 0.26 -0.41 -0.28 0.83 - -0.58 -0.31 -0.48 -0.58 - 0.57 0.57 -0.39 -0.45 - 0.034 -0.55 -0.086 0.83 - -0.71 -0.48 -0.3 -0.42 - -0.72 -0.05 0.63 0.27 - 0.46 0.48 0.21 0.71 --0.022 0.97 0.17 -0.17 - 0.58 0.64 -0.31 -0.39 - 0.46 -0.15 0.24 -0.84 - 0.44 -0.33 0.32 -0.77 - 0.38 -0.26 0.3 -0.84 - 0.63 0.33 0.17 -0.68 - 0.13 -0.15 0.8 -0.56 - -0.01 -0.26 0.32 0.91 - 0.37 0.37 0.29 0.8 - -0.18 -0.098 0.55 0.81 +Convex hull of 8 points in 3-d: -Free memory allocated by the new instance of Qhull, and redisplay the old results. + Number of vertices: 8 + Number of facets: 6 + Number of non-simplicial facets: 6 +Statistics for: | qhull s Tcv + Number of points processed: 8 + Number of hyperplanes created: 11 + Number of distance tests for qhull: 34 + Number of distance tests for merging: 96 + Number of distance tests for checking: 100 + Number of merged facets: 6 + CPU seconds to compute hull (after input): 0 -8 vertices and 18 facets with normals: - 0.47 -0.52 -0.6 0.38 - 0.085 0.57 0.74 -0.35 - 0.48 -0.67 -0.4 -0.4 - -0.13 0.74 -0.3 -0.59 - 0.11 -0.42 -0.88 -0.19 - 0.19 0.68 0.71 0.011 --0.057 0.87 -0.12 -0.47 - 0.49 0.55 0.41 0.53 --0.043 -0.37 -0.15 0.92 - -0.69 -0.2 -0.67 -0.2 - -0.64 -0.028 -0.71 -0.3 - -0.65 -0.2 -0.71 -0.19 - -0.93 -0.16 -0.015 -0.33 --0.0067 0.52 0.78 -0.36 --0.00016 -0.73 0.22 -0.64 - -0.97 -0.18 0.035 0.15 - -0.17 0.48 0.84 0.19 - -0.32 -0.31 0.19 0.87 -compute halfspace intersection about the origin for a diamond -input as halfspace coefficients + offsets - -1 -1 -1 -1 - 1 -1 -1 -1 - -1 1 -1 -1 - 1 1 -1 -1 - -1 -1 1 -1 - 1 -1 1 -1 - -1 1 1 -1 - 1 1 1 -1 -3 -6 - 0 0 -1 - 0 -1 0 - 1 0 0 - -1 0 0 - 0 1 0 - 0 0 1 +Output completed. Verifying that all points are below outer planes of +all facets. Will make 48 distance computations. 8 vertices and 6 facets with normals: -0 -0 -1 @@ -2413,59 +2305,147 @@ 0 1 -0 -0 -0 1 -Convex hull of 8 points in 3-d: +======== +compute 3-d Delaunay triangulation +seed: 1595644037 +input +-0.801 -0.418 0.372 +-0.854 -0.0286 -0.978 +-0.329 -0.199 -0.343 + 0.668 -0.752 0.621 +-0.0443 -0.981 -0.666 + 0.786 0.278 0.847 + 0.639 0.432 0.349 +-0.495 -0.786 0.239 - Number of vertices: 8 - Number of facets: 12 - Number of triangulated facets: 6 +Delaunay triangulation by the convex hull of 8 points in 4-d: -Statistics for: | qhull s Tcv QR1 p n Qt QR1 + Number of input sites: 8 + Number of Delaunay regions: 10 + +Statistics for: | qhull s d Tcv Number of points processed: 8 - Number of hyperplanes created: 11 - Number of distance tests for qhull: 24 - Number of distance tests for merging: 186 - Number of distance tests for checking: 56 - Number of merged facets: 7 + Number of hyperplanes created: 28 + Number of facets in hull: 18 + Number of distance tests for qhull: 28 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below outer planes of -all facets. Will make 96 distance computations. +Output completed. Verifying that all points are below 1e-14 of +all facets. Will make 80 distance computations. -Voronoi diagram by the convex hull of 8 points in 4-d: +8 vertices and 18 facets with normals: + 0.67 0.27 -0.6 0.35 + 0.51 0.23 -0.8 -0.2 + -0.47 0.83 0.3 0.072 + -0.52 0.81 0.13 -0.23 + 0.86 0.0043 -0.48 0.16 + 0.71 -0.35 -0.33 -0.51 + 0.38 -0.011 -0.2 0.9 + -0.34 -0.07 0.44 0.83 + -0.38 -0.45 0.29 0.75 + 0.011 -0.16 0.78 -0.6 + 0.27 -0.76 -0.02 -0.59 + -0.38 -0.49 0.3 0.72 + -0.64 -0.57 -0.38 -0.34 + -0.51 -0.56 0.2 0.62 + -0.75 -0.48 -0.3 -0.35 +-0.0085 -0.17 0.65 -0.74 + 0.12 -0.29 0.58 -0.75 + 0.021 -0.19 0.75 -0.64 + +find 3-d Delaunay triangle or adjacent triangle closest to [0.5, 0.5, ...] +-0.80 -0.42 0.37 +-0.33 -0.20 -0.34 + 0.64 0.43 0.35 +-0.85 -0.03 -0.98 - Number of Voronoi regions: 8 - Number of Voronoi vertices: 11 +======== +Compute a new triangulation as a separate instance of Qhull +seed: 1595644038 +input +-0.801 -0.155 -0.117 +0.0631 -0.963 -0.541 +-0.235 -0.841 -0.984 + 0.538 0.0146 -0.34 +-0.382 -0.912 -0.559 +-0.155 -0.38 0.862 +-0.594 0.566 -0.816 + 0.878 0.392 0.1 -Statistics for: | qhull s d Tcv v p +Delaunay triangulation by the convex hull of 8 points in 4-d: + + Number of input sites: 8 + Number of Delaunay regions: 10 + +Statistics for: | qhull s d Tcv Number of points processed: 8 Number of hyperplanes created: 26 - Number of facets in hull: 18 + Number of facets in hull: 17 Number of distance tests for qhull: 28 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 1.1e-014 of -all facets. Will make 88 distance computations. +Output completed. Verifying that all points are below 1e-14 of +all facets. Will make 80 distance computations. -Voronoi diagram by the convex hull of 8 points in 4-d: +8 vertices and 17 facets with normals: + -0.27 0.8 0.44 -0.33 + -0.15 0.61 0.4 -0.67 +-0.064 -0.63 0.081 -0.77 + 0.68 -0.61 0.3 -0.26 + -0.19 0.77 0.19 -0.58 + -0.72 -0.05 0.32 0.62 + -0.23 -0.13 -0.76 -0.59 + 0.51 -0.33 0.37 0.7 + 0.063 0.23 0.34 0.91 + 0.82 -0.23 -0.53 0.074 + 0.55 0.27 -0.78 0.11 + -0.19 -0.71 0.12 -0.67 + -0.74 -0.13 0.32 0.58 +-0.024 -0.74 0.42 0.53 + -0.16 -0.5 -0.37 -0.77 + -0.22 -0.18 -0.74 -0.61 +-0.097 -0.32 -0.72 -0.61 - Number of Voronoi regions: 8 - Number of Voronoi vertices: 10 +======== +Free memory allocated by the new instance of Qhull, and redisplay the old results. -Statistics for: | qhull s d Tcv v p - Number of points processed: 8 - Number of hyperplanes created: 24 - Number of facets in hull: 17 - Number of distance tests for qhull: 27 - CPU seconds to compute hull (after input): 0 +8 vertices and 18 facets with normals: + 0.67 0.27 -0.6 0.35 + 0.51 0.23 -0.8 -0.2 + -0.47 0.83 0.3 0.072 + -0.52 0.81 0.13 -0.23 + 0.86 0.0043 -0.48 0.16 + 0.71 -0.35 -0.33 -0.51 + 0.38 -0.011 -0.2 0.9 + -0.34 -0.07 0.44 0.83 + -0.38 -0.45 0.29 0.75 + 0.011 -0.16 0.78 -0.6 + 0.27 -0.76 -0.02 -0.59 + -0.38 -0.49 0.3 0.72 + -0.64 -0.57 -0.38 -0.34 + -0.51 -0.56 0.2 0.62 + -0.75 -0.48 -0.3 -0.35 +-0.0085 -0.17 0.65 -0.74 + 0.12 -0.29 0.58 -0.75 + 0.021 -0.19 0.75 -0.64 -Output completed. Verifying that all points are below 1.3e-014 of -all facets. Will make 80 distance computations. +======== +compute halfspace intersection about the origin for a diamond +input as halfspace coefficients + offsets + -1 -1 -1 -1 + 1 -1 -1 -1 + -1 1 -1 -1 + 1 1 -1 -1 + -1 -1 1 -1 + 1 -1 1 -1 + -1 1 1 -1 + 1 1 1 -1 Halfspace intersection by the convex hull of 8 points in 3-d: @@ -2478,76 +2458,73 @@ Number of points processed: 8 Number of hyperplanes created: 11 - Number of distance tests for qhull: 35 - Number of distance tests for merging: 142 - Number of distance tests for checking: 56 + Number of distance tests for qhull: 34 + Number of distance tests for merging: 96 + Number of distance tests for checking: 100 Number of merged facets: 6 CPU seconds to compute hull (after input): 0 +3 +6 + 0 0 -1 + 0 -1 0 + 1 0 0 + -1 0 0 + 0 1 0 + 0 0 1 Output completed. Verifying that all points are below outer planes of all facets. Will make 48 distance computations. -user_eg2 "QR1 p" "v p" Fp -This is the output from user_eg2_r.c -It shows how qhull() may be called from an application using qhull's -static, reentrant library. user_eg2 is not part of qhull itself. If it -appears accidently, please remove user_eg2_r.c from your project. If it fails -immediately, user_eg2_r.c was incorrectly linked to the non-reentrant library. -Also try 'user_eg2 T1 2>&1' +8 vertices and 6 facets with normals: + -0 -0 -1 + 0 -1 0 + 1 -0 -0 + -1 -0 -0 + 0 1 -0 + -0 -0 1 +user_eg 'QR1 p n Qt' 'v p' 'Fp' + +======== +user_eg 'cube qhull options' 'Delaunay options' 'halfspace options' +This is the output from user_eg_r.c. It shows how qhull() may be called from +an application, via Qhull's shared, reentrant library. user_eg is not part of +Qhull itself. If user_eg fails immediately, user_eg_r.c was incorrectly linked +to Qhull's non-reentrant library, libqhull. +Try -- user_eg 'T1' 'T1' 'T1' -compute triangulated convex hull of cube after rotating input -8 vertices and 12 facets with normals: - -0.38 0.91 -0.17 - -0.38 0.91 -0.17 - 0.74 0.41 0.52 - 0.74 0.41 0.52 - -0.55 -0.07 0.83 - -0.55 -0.07 0.83 - 0.55 0.07 -0.83 - 0.55 0.07 -0.83 - 0.38 -0.91 0.17 - 0.38 -0.91 0.17 - -0.74 -0.41 -0.52 - -0.74 -0.41 -0.52 +======== +compute convex hull of cube after rotating input +input + -1 -1 -1 + 1 -1 -1 + -1 1 -1 + 1 1 -1 + -1 -1 1 + 1 -1 1 + -1 1 1 + 1 1 1 -add points in a diamond -9 vertices and 14 facets -10 vertices and 16 facets -11 vertices and 18 facets -12 vertices and 20 facets -13 vertices and 22 facets -14 vertices and 24 facets +Convex hull of 8 points in 3-d: + + Number of vertices: 8 + Number of facets: 12 + Number of triangulated facets: 6 + +Statistics for: | qhull s Tcv QR1 p n Qt QR1 + + Number of points processed: 8 + Number of hyperplanes created: 12 + Number of distance tests for qhull: 22 + Number of distance tests for merging: 100 + Number of distance tests for checking: 100 + Number of merged facets: 6 + CPU seconds to compute hull (after input): 0 -14 vertices and 24 facets with normals: - -0.67 0.63 -0.39 - 0.67 -0.63 0.39 - -0.1 -0.71 0.7 - 0.65 -0.66 0.37 - 0.63 -0.7 -0.34 - -0.65 -0.65 -0.41 - -0.62 -0.62 -0.49 - -0.65 0.66 -0.37 - -0.63 0.7 0.34 - 0.1 0.71 -0.7 - 0.65 0.65 0.41 - 0.62 0.62 0.49 - -0.7 -0.13 -0.7 - -0.62 -0.49 -0.62 - 0.11 0.7 -0.71 - 0.68 0.29 -0.68 - 0.66 -0.34 -0.67 - 0.67 -0.3 -0.67 - -0.66 0.34 0.67 - -0.67 0.3 0.67 - 0.7 0.13 0.7 - 0.62 0.49 0.62 - -0.11 -0.7 0.71 - -0.68 -0.29 0.68 3 -14 +8 0.9124763375291641 1.390833937612012 -0.4826674750136243 -0.5764091147442416 0.565375258822974 -1.532352227508615 -0.1847368907548403 1.250953879569599 1.183632828365285 @@ -2556,80 +2533,221 @@ 0.1847368907548403 -1.250953879569599 -1.183632828365285 0.5764091147442416 -0.565375258822974 1.532352227508615 -0.9124763375291641 -1.390833937612012 0.4826674750136243 - -2 0 0 - 2 0 0 - 0 -2 0 - 0 2 0 - 0 0 -2 - 0 0 2 +4 +12 +-0.744442726136703 -0.4127293393945193 -0.5248423762474955 -1 +-0.744442726136703 -0.4127293393945193 -0.5248423762474955 -1 +0.380573002749541 -0.9081645691962865 0.1743596995716653 -1 +0.380573002749541 -0.9081645691962865 0.1743596995716653 -1 +-0.5486066141420022 -0.06994002902120684 0.8331501516894545 -1 +-0.5486066141420022 -0.06994002902120684 0.8331501516894545 -1 +0.5486066141420022 0.06994002902120672 -0.8331501516894545 -1 +0.5486066141420022 0.06994002902120672 -0.8331501516894545 -1 +0.7444427261367031 0.4127293393945192 0.5248423762474955 -1 +0.7444427261367031 0.4127293393945192 0.5248423762474955 -1 +-0.380573002749541 0.9081645691962864 -0.1743596995716652 -1 +-0.380573002749541 0.9081645691962864 -0.1743596995716652 -1 -compute 2-d Delaunay triangulation -seed: 1453170146 +Output completed. Verifying that all points are below outer planes of +all facets. Will make 96 distance computations. 8 vertices and 12 facets with normals: - 0.45 -0.28 -0.85 - 0.064 -0.018 1 - 0.36 0.46 0.81 - 0.34 0.58 0.74 - 0.049 -0.25 0.97 - -0.65 -0.54 -0.53 - 0.24 -0.93 -0.28 - -0.56 0.72 -0.41 --0.065 0.28 -0.96 --0.075 0.14 -0.99 - -0.69 -0.11 -0.72 - -0.87 0.079 -0.48 -2 -8 -0.261783406105113 -0.1645934537920248 --0.6126022547668056 -0.506831695105782 -0.4313552576547662 -1.692777183752249 --0.6887906629487247 0.8872152319047915 --0.03374188264047418 0.1445289530926284 --0.0380674759861005 0.07304930676236426 --0.4778160044925665 -0.07365942368398104 --0.9154616627787595 0.08265378350821578 + -0.74 -0.41 -0.52 + -0.74 -0.41 -0.52 + 0.38 -0.91 0.17 + 0.38 -0.91 0.17 + -0.55 -0.07 0.83 + -0.55 -0.07 0.83 + 0.55 0.07 -0.83 + 0.55 0.07 -0.83 + 0.74 0.41 0.52 + 0.74 0.41 0.52 + -0.38 0.91 -0.17 + -0.38 0.91 -0.17 -add points to triangulation -added point p8: -1 -0.7369 1.543 -9 points, 0 extra points, 9 vertices, and 14 facets in total -added point p9: 0.5112 -0.0827 0.2682 -10 points, 0 extra points, 10 vertices, and 16 facets in total -added point p10: 0.06553 -0.5621 0.3202 -11 points, 0 extra points, 11 vertices, and 18 facets in total -added point p11: -0.9059 0.3577 0.9486 -12 points, 0 extra points, 12 vertices, and 20 facets in total -added point p12: 0.3586 0.8694 0.8844 -13 points, 0 extra points, 13 vertices, and 22 facets in total -added point p13: -0.233 0.03883 0.0558 -14 points, 0 extra points, 14 vertices, and 24 facets in total -2 -18 --0.6126022547668056 -0.506831695105782 --0.6887906629487247 0.8872152319047915 --0.6890718883842961 -0.589478265980138 -1.150610839461831 0.05954726657105378 -0.4679979167367609 -0.4893864373109676 -0.5213712027931413 -2.051406778503543 -0.1310901012422779 -1.351673160448553 --5.278757164106608 0.447573815550907 --0.8034773594082503 0.4801384788817613 --0.548524938551111 -0.3009018131238184 --0.6940492648374339 -0.06463314795107626 --0.5878216841084438 0.1595213402892999 --0.1857247019012585 -0.3122944004261165 -0.1161835094406034 -0.1623083804984112 --0.2793296819230945 0.4229733899863926 -0.1862035405984735 0.2664606321349433 -0.04432712652997822 0.4672660978876235 -0.1133168599569771 0.4181258968679588 +======== +compute 3-d Delaunay triangulation +seed: 1595644038 +input +-0.801 -0.155 -0.117 +0.0631 -0.963 -0.541 +-0.235 -0.841 -0.984 + 0.538 0.0146 -0.34 +-0.382 -0.912 -0.559 +-0.155 -0.38 0.862 +-0.594 0.566 -0.816 + 0.878 0.392 0.1 + +Voronoi diagram by the convex hull of 8 points in 4-d: + + Number of Voronoi regions: 8 + Number of Voronoi vertices: 10 + +Statistics for: | qhull s d Tcv v p + + Number of points processed: 8 + Number of hyperplanes created: 26 + Number of facets in hull: 17 + Number of distance tests for qhull: 28 + CPU seconds to compute hull (after input): 0 + +3 +10 +-0.4071479102294318 1.219133029325973 0.6665355448746564 +-0.1108160944725886 0.456025758474877 0.296165826000959 +-0.04172545836103403 -0.4089628768956435 0.05248152588212329 +1.328063758340639 -1.183562100392564 0.5872409889009436 +-0.1590699940723186 0.6580028523373366 0.1606354382946221 +-0.1958933203456756 -0.1120634006329647 -0.6453966139916644 +-0.1391996697363491 -0.532197185823705 0.08861056648935872 +-0.1012641820194624 -0.3207618095382609 -0.2371505242478096 +-0.1847968878329362 -0.150249705715356 -0.6079504566397304 +-0.07956014265606015 -0.2591783977016859 -0.5894629573067639 + +Output completed. Verifying that all points are below 1e-14 of +all facets. Will make 80 distance computations. + +8 vertices and 17 facets with normals: + -0.27 0.8 0.44 -0.33 + -0.15 0.61 0.4 -0.67 +-0.064 -0.63 0.081 -0.77 + 0.68 -0.61 0.3 -0.26 + -0.19 0.77 0.19 -0.58 + -0.72 -0.05 0.32 0.62 + -0.23 -0.13 -0.76 -0.59 + 0.51 -0.33 0.37 0.7 + 0.063 0.23 0.34 0.91 + 0.82 -0.23 -0.53 0.074 + 0.55 0.27 -0.78 0.11 + -0.19 -0.71 0.12 -0.67 + -0.74 -0.13 0.32 0.58 +-0.024 -0.74 0.42 0.53 + -0.16 -0.5 -0.37 -0.77 + -0.22 -0.18 -0.74 -0.61 +-0.097 -0.32 -0.72 -0.61 + +find 3-d Delaunay triangle or adjacent triangle closest to [0.5, 0.5, ...] +-0.59 0.57 -0.82 +-0.15 -0.38 0.86 + 0.88 0.39 0.10 +-0.80 -0.16 -0.12 + +======== +Compute a new triangulation as a separate instance of Qhull +seed: 1595644039 +input +-0.801 0.108 -0.606 + 0.98 0.102 -0.103 +-0.141 0.517 0.375 + 0.407 0.782 0.698 + -0.72 -0.842 -0.452 + 0.905 0.963 0.878 + 0.173 0.7 0.0194 + 0.252 -0.431 -0.039 + +Voronoi diagram by the convex hull of 8 points in 4-d: + + Number of Voronoi regions: 8 + Number of Voronoi vertices: 10 + +Statistics for: | qhull s d Tcv v p + + Number of points processed: 8 + Number of hyperplanes created: 29 + Number of facets in hull: 19 + Number of distance tests for qhull: 34 + CPU seconds to compute hull (after input): 0 + +3 +10 +0.6957254548402696 -0.5636294604869319 -2.507464110663786 +0.2747984690652054 0.1906381162276007 -1.008814834585774 +0.9719393512739847 -0.4886296283040745 1.285981228064616 +0.9113330904344364 0.817705195127131 0.1350558690072676 +0.4328681637125205 0.1330532247438454 0.3197206613620017 +0.4651973598805769 0.1012147513913624 0.4233056008080553 +0.466027516489028 0.1682136331316482 0.3670953858444743 +-0.1814376757632739 0.1184692202639611 -0.2296672791600022 +-0.5906767690426418 -0.2360311159460474 0.1939451211897689 +-2.63695386199309 -5.462987868661916 10.22310605930232 + +Output completed. Verifying that all points are below 1.5e-14 of +all facets. Will make 80 distance computations. + +8 vertices and 19 facets with normals: + 0.25 0.099 -0.83 0.49 + 0.26 -0.21 -0.93 -0.18 + 0.41 -0.79 0.41 0.2 + 0.22 0.59 -0.76 0.17 + 0.23 0.16 -0.86 -0.43 + 0.55 -0.28 0.73 -0.28 + 0.69 0.62 0.1 -0.38 + -0.14 -0.51 0.85 0.0066 + -0.49 0.87 -0.013 0.069 + 0.58 0.18 0.43 -0.67 + 0.57 0.12 0.52 -0.62 + 0.59 0.21 0.46 -0.63 + -0.31 0.2 -0.39 -0.85 + -0.5 0.86 0.013 0.053 + -0.71 -0.28 0.23 -0.6 + -0.22 -0.46 0.86 -0.042 + -0.77 0.12 0.59 0.21 + -0.7 0.62 0.3 0.15 + -0.67 -0.036 0.73 0.17 + +======== +Free memory allocated by the new instance of Qhull, and redisplay the old results. -find Delaunay triangle closest to [0.5, 0.5, ...] --0.23 0.04 - 0.36 0.87 - 0.63 0.45 + +8 vertices and 17 facets with normals: + -0.27 0.8 0.44 -0.33 + -0.15 0.61 0.4 -0.67 +-0.064 -0.63 0.081 -0.77 + 0.68 -0.61 0.3 -0.26 + -0.19 0.77 0.19 -0.58 + -0.72 -0.05 0.32 0.62 + -0.23 -0.13 -0.76 -0.59 + 0.51 -0.33 0.37 0.7 + 0.063 0.23 0.34 0.91 + 0.82 -0.23 -0.53 0.074 + 0.55 0.27 -0.78 0.11 + -0.19 -0.71 0.12 -0.67 + -0.74 -0.13 0.32 0.58 +-0.024 -0.74 0.42 0.53 + -0.16 -0.5 -0.37 -0.77 + -0.22 -0.18 -0.74 -0.61 +-0.097 -0.32 -0.72 -0.61 + +======== compute halfspace intersection about the origin for a diamond +input as halfspace coefficients + offsets + -1 -1 -1 -1 + 1 -1 -1 -1 + -1 1 -1 -1 + 1 1 -1 -1 + -1 -1 1 -1 + 1 -1 1 -1 + -1 1 1 -1 + 1 1 1 -1 + +Halfspace intersection by the convex hull of 8 points in 3-d: + + Number of halfspaces: 8 + Number of non-redundant halfspaces: 8 + Number of intersection points: 6 + Number of non-simplicial intersection points: 6 + +Statistics for: | qhull H0 s Tcv Fp + + Number of points processed: 8 + Number of hyperplanes created: 11 + Number of distance tests for qhull: 34 + Number of distance tests for merging: 96 + Number of distance tests for checking: 100 + Number of merged facets: 6 + CPU seconds to compute hull (after input): 0 + 3 6 0 0 -1 @@ -2639,101 +2757,164 @@ 0 1 0 0 0 1 -add halfspaces for cube to intersection -added offset -1 and normal 1.732 0 0 -8 points, 1 extra points, 9 vertices, and 9 facets in total -added offset -1 and normal -1.732 0 0 -8 points, 2 extra points, 10 vertices, and 12 facets in total -added offset -1 and normal 0 1.732 0 -8 points, 3 extra points, 11 vertices, and 15 facets in total -added offset -1 and normal 0 -1.732 0 -8 points, 4 extra points, 12 vertices, and 18 facets in total -added offset -1 and normal 0 0 1.732 -8 points, 5 extra points, 13 vertices, and 21 facets in total -added offset -1 and normal 0 0 -1.732 -8 points, 6 extra points, 14 vertices, and 24 facets in total -3 -24 -0.5773502691896257 0 -0.4226497308103742 -0.5773502691896257 -0.4226497308103742 0 -0.5773502691896257 0.4226497308103742 0 -0.5773502691896257 0 0.4226497308103742 --0.5773502691896257 0 -0.4226497308103742 --0.5773502691896257 -0.4226497308103742 0 --0.5773502691896257 0.4226497308103742 0 --0.5773502691896257 0 0.4226497308103742 - 0 0.5773502691896257 -0.4226497308103742 -0.4226497308103742 0.5773502691896257 0 --0.4226497308103742 0.5773502691896257 0 - 0 0.5773502691896257 0.4226497308103742 - 0 -0.5773502691896257 -0.4226497308103742 --0.4226497308103742 -0.5773502691896257 0 -0.4226497308103742 -0.5773502691896257 0 - 0 -0.5773502691896257 0.4226497308103742 - 0 -0.4226497308103742 0.5773502691896257 -0.4226497308103742 0 0.5773502691896257 - 0 0.4226497308103742 0.5773502691896257 --0.4226497308103742 0 0.5773502691896257 --0.4226497308103742 0 -0.5773502691896257 - 0 -0.4226497308103742 -0.5773502691896257 -0.4226497308103742 0 -0.5773502691896257 - 0 0.4226497308103742 -0.5773502691896257 +Output completed. Verifying that all points are below outer planes of +all facets. Will make 48 distance computations. + +8 vertices and 6 facets with normals: + -0 -0 -1 + 0 -1 0 + 1 -0 -0 + -1 -0 -0 + 0 1 -0 + -0 -0 1 +user_eg2 + +======== +user_eg2 'cube qhull options' 'Delaunay options' 'halfspace options' + +This is the output from user_eg2_r.c. It shows how qhull() may be called from +an application, via Qhull's static, reentrant library. user_eg2 is not part +of Qhull itself. If user_eg2 fails immediately, user_eg2_r.c was incorrectly +linked to Qhull's non-reentrant library, libqhullstatic. +Try -- user_eg2 'T1' 'T1' 'T1' + + +======== +compute triangulated convex hull of cube after rotating input Output completed. Verifying that all points are below outer planes of all facets. Will make 96 distance computations. +8 vertices and 12 facets with normals: + -0 -0 -1 + -0 -0 -1 + 0 -1 0 + 0 -1 0 + 1 -0 -0 + 1 -0 -0 + -1 -0 -0 + -1 -0 -0 + 0 1 -0 + 0 1 -0 + -0 -0 1 + -0 -0 1 + +add points in a diamond +9 vertices and 14 facets +10 vertices and 16 facets +11 vertices and 16 facets +12 vertices and 16 facets +13 vertices and 14 facets +14 vertices and 12 facets + +14 vertices and 12 facets with normals: + 0.71 -0.71 -0 + -0.71 -0.71 0 + -0.71 0.71 -0 + 0.71 0.71 -0 + -0.71 -0 -0.71 + -0 0.71 -0.71 + 0 -0.71 -0.71 + 0.71 0 -0.71 + -0 -0.71 0.71 + -0.71 0 0.71 + 0.71 0 0.71 + -0 0.71 0.71 + Convex hull of 14 points in 3-d: Number of vertices: 14 - Number of facets: 24 + Number of facets: 12 + Number of non-simplicial facets: 12 -Statistics for: user_eg2 cube example | qhull s Tcv Q11 QR1 p QR1 +Statistics for: user_eg2 cube example | qhull s Tcv Q11 Number of points processed: 14 - Number of hyperplanes created: 45 - Number of distance tests for qhull: 68 - Number of distance tests for merging: 370 - Number of distance tests for checking: 214 - Number of merged facets: 7 + Number of hyperplanes created: 23 + Number of distance tests for qhull: 64 + Number of distance tests for merging: 276 + Number of distance tests for checking: 324 + Number of merged facets: 18 CPU seconds to compute hull (after input): 0 Output completed. Verifying that all points are below outer planes of -all facets. Will make 192 distance computations. +all facets. Will make 168 distance computations. -Voronoi diagram by the convex hull of 8 points in 3-d: +======== +compute 2-d Delaunay triangulation +seed: 1595644038 - Number of Voronoi regions: 8 - Number of Voronoi vertices: 8 +8 vertices and 12 facets with normals: + 0.82 0.37 0.43 + 0.82 0.26 0.52 + 0.77 0.21 0.6 + 0.37 -0.025 0.93 + -0.96 -0.0085 -0.29 + -0.66 0.42 -0.62 + -0.77 0.28 -0.57 + -0.43 -0.34 -0.83 + -0.45 -0.61 -0.65 + -0.54 -0.61 -0.57 + -0.6 -0.59 -0.53 + -0.72 -0.46 -0.53 -Statistics for: user_eg2 Delaunay example | qhull s d Tcv v p +Delaunay triangulation by the convex hull of 8 points in 3-d: + + Number of input sites: 8 + Number of Delaunay regions: 8 + +Statistics for: user_eg2 Delaunay example | qhull s d Tcv Number of points processed: 8 - Number of hyperplanes created: 21 + Number of hyperplanes created: 23 Number of facets in hull: 12 - Number of distance tests for qhull: 29 + Number of distance tests for qhull: 32 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 4.9e-015 of +Output completed. Verifying that all points are below 5.2e-15 of all facets. Will make 64 distance computations. -Voronoi diagram by the convex hull of 14 points in 3-d: +======== +add points to triangulation +added point p8: -1 -0.7369 1.543 +9 points, 0 extra points, 9 vertices, and 14 facets in total +added point p9: 0.5112 -0.0827 0.2682 +10 points, 0 extra points, 10 vertices, and 16 facets in total +added point p10: 0.06553 -0.5621 0.3202 +11 points, 0 extra points, 11 vertices, and 18 facets in total +added point p11: -0.9059 0.3577 0.9486 +12 points, 0 extra points, 12 vertices, and 20 facets in total +added point p12: 0.3586 0.8694 0.8844 +13 points, 0 extra points, 13 vertices, and 22 facets in total +added point p13: -0.233 0.03883 0.0558 +14 points, 0 extra points, 14 vertices, and 24 facets in total - Number of Voronoi regions: 14 - Number of Voronoi vertices: 18 +find Delaunay triangle or adjacent triangle closest to [0.5, 0.5, ...] + 0.36 0.87 + 0.51 -0.08 +-0.12 0.06 -Statistics for: user_eg2 Delaunay example | qhull s d Tcv v p +Delaunay triangulation by the convex hull of 14 points in 3-d: + + Number of input sites: 14 + Number of Delaunay regions: 19 + +Statistics for: user_eg2 Delaunay example | qhull s d Tcv Number of points processed: 14 - Number of hyperplanes created: 53 + Number of hyperplanes created: 51 Number of facets in hull: 24 - Number of distance tests for qhull: 75 + Number of distance tests for qhull: 69 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 4.9e-015 of -all facets. Will make 252 distance computations. +Output completed. Verifying that all points are below 5.2e-15 of +all facets. Will make 266 distance computations. + +======== +compute halfspace intersection about the origin for a diamond Halfspace intersection by the convex hull of 8 points in 3-d: @@ -2742,13 +2923,13 @@ Number of intersection points: 6 Number of non-simplicial intersection points: 6 -Statistics for: user_eg2 halfspace example | qhull H0 s Tcv Fp +Statistics for: user_eg2 halfspace example | qhull H0 s Tcv Number of points processed: 8 Number of hyperplanes created: 11 - Number of distance tests for qhull: 35 - Number of distance tests for merging: 142 - Number of distance tests for checking: 56 + Number of distance tests for qhull: 34 + Number of distance tests for merging: 96 + Number of distance tests for checking: 100 Number of merged facets: 6 CPU seconds to compute hull (after input): 0 @@ -2756,520 +2937,1661 @@ Output completed. Verifying that all points are below outer planes of all facets. Will make 48 distance computations. +======== +add halfspaces for cube to intersection +added offset -1 and normal 1.732 0 0 +8 points, 1 extra points, 9 vertices, and 9 facets in total +added offset -1 and normal -1.732 0 0 +8 points, 2 extra points, 10 vertices, and 12 facets in total +added offset -1 and normal 0 1.732 0 +8 points, 3 extra points, 11 vertices, and 15 facets in total +added offset -1 and normal 0 -1.732 0 +8 points, 4 extra points, 12 vertices, and 18 facets in total +added offset -1 and normal 0 0 1.732 +8 points, 5 extra points, 13 vertices, and 21 facets in total +added offset -1 and normal 0 0 -1.732 +8 points, 6 extra points, 14 vertices, and 24 facets in total + Halfspace intersection by the convex hull of 14 points in 3-d: Number of halfspaces: 14 Number of non-redundant halfspaces: 14 Number of intersection points: 24 -Statistics for: user_eg2 halfspace example | qhull H0 s Tcv Fp +Statistics for: user_eg2 halfspace example | qhull H0 s Tcv Number of points processed: 14 Number of hyperplanes created: 35 - Number of distance tests for qhull: 59 - Number of distance tests for merging: 306 - Number of distance tests for checking: 214 + Number of distance tests for qhull: 58 + Number of distance tests for merging: 248 + Number of distance tests for checking: 256 Number of merged facets: 6 CPU seconds to compute hull (after input): 0 Output completed. Verifying that all points are below outer planes of all facets. Will make 192 distance computations. -user_eg3 rbox "10 D2" "2 D2" qhull "p" -rbox 10 D2 -rbox 2 D2 - -Results of p -2 -5 --0.02222276248244826 -0.4979727817680433 --0.4285431913366012 0.4745826469497594 -0.3790312361708201 0.3779794437605696 -0.3443122672329771 -0.1437312230875075 --0.3674659290047977 0.0001301793382784133 -echo === check front ends ${d:-`date`} ================== -date -=== check front ends Mon Jan 18 21:22:26 EST 2016 ================== -qconvex - +user_eg2 'QR1 p' 'v p' 'Fp' -qconvex- compute the convex hull - http://www.qhull.org 2015.2 2016/01/18 +======== +user_eg2 'cube qhull options' 'Delaunay options' 'halfspace options' -input (stdin): - first lines: dimension and number of points (or vice-versa). - other lines: point coordinates, best if one point per line - comments: start with a non-numeric character +This is the output from user_eg2_r.c. It shows how qhull() may be called from +an application, via Qhull's static, reentrant library. user_eg2 is not part +of Qhull itself. If user_eg2 fails immediately, user_eg2_r.c was incorrectly +linked to Qhull's non-reentrant library, libqhullstatic. +Try -- user_eg2 'T1' 'T1' 'T1' -options: - Qt - triangulated output - QJ - joggled input instead of merged facets - Qc - keep coplanar points with nearest facet - Qi - keep interior points with nearest facet -Qhull control options: - Qbk:n - scale coord k so that low bound is n - QBk:n - scale coord k so that upper bound is n (QBk is 0.5) - QbB - scale input to unit cube centered at the origin - Qbk:0Bk:0 - remove k-th coordinate from input - QJn - randomly joggle input in range [-n,n] - QRn - random rotation (n=seed, n=0 time, n=-1 time/no rotate) - Qs - search all points for the initial simplex - QGn - good facet if visible from point n, -n for not visible - QVn - good facet if it includes point n, -n if not +======== +compute triangulated convex hull of cube after rotating input -Trace options: - T4 - trace at level n, 4=all, 5=mem/gauss, -1= events - Tc - check frequently during execution - Ts - print statistics - Tv - verify result: structure, convexity, and point inclusion - Tz - send all output to stdout - TFn - report summary when n or more facets created - TI file - input data from file, no spaces or single quotes - TO file - output results to file, may be enclosed in single quotes - TPn - turn on tracing when point n added to hull - TMn - turn on tracing at merge n - TWn - trace merge facets when width > n - TVn - stop qhull after adding point n, -n for before (see TCn) - TCn - stop qhull after building cone for point n (see TVn) +Output completed. Verifying that all points are below outer planes of +all facets. Will make 96 distance computations. -Precision options: - Cn - radius of centrum (roundoff added). Merge facets if non-convex - An - cosine of maximum angle. Merge facets if cosine > n or non-convex - C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge - Rn - randomly perturb computations by a factor of [1-n,1+n] - Un - max distance below plane for a new, coplanar point - Wn - min facet width for outside point (before roundoff) +8 vertices and 12 facets with normals: + -0.74 -0.41 -0.52 + -0.74 -0.41 -0.52 + 0.38 -0.91 0.17 + 0.38 -0.91 0.17 + -0.55 -0.07 0.83 + -0.55 -0.07 0.83 + 0.55 0.07 -0.83 + 0.55 0.07 -0.83 + 0.74 0.41 0.52 + 0.74 0.41 0.52 + -0.38 0.91 -0.17 + -0.38 0.91 -0.17 -Output formats (may be combined; if none, produces a summary to stdout): - f - facet dump - G - Geomview output (see below) - i - vertices incident to each facet - m - Mathematica output (2-d and 3-d) - n - normals with offsets - o - OFF file format (dim, points and facets; Voronoi regions) - p - point coordinates - s - summary (stderr) +add points in a diamond +9 vertices and 14 facets +10 vertices and 16 facets +11 vertices and 18 facets +12 vertices and 20 facets +13 vertices and 22 facets +14 vertices and 24 facets -More formats: - Fa - area for each facet - FA - compute total area and volume for option 's' - Fc - count plus coplanar points for each facet - use 'Qc' (default) for coplanar and 'Qi' for interior - FC - centrum for each facet - Fd - use cdd format for input (homogeneous with offset first) - FD - use cdd format for numeric output (offset first) - FF - facet dump without ridges - Fi - inner plane for each facet - FI - ID for each facet - Fm - merge count for each facet (511 max) - Fn - count plus neighboring facets for each facet - FN - count plus neighboring facets for each point - Fo - outer plane (or max_outside) for each facet - FO - options and precision constants - FP - nearest vertex for each coplanar point - FQ - command used for qconvex - Fs - summary: #int (8), dimension, #points, tot vertices, tot facets, - for output: #vertices, #facets, - #coplanar points, #non-simplicial facets - #real (2), max outer plane, min vertex - FS - sizes: #int (0) - #real (2) tot area, tot volume - Ft - triangulation with centrums for non-simplicial facets (OFF format) - Fv - count plus vertices for each facet - FV - average of vertices (a feasible point for 'H') - Fx - extreme points (in order for 2-d) +14 vertices and 24 facets with normals: + -0.67 0.63 -0.39 + 0.67 -0.63 0.39 + -0.1 -0.71 0.7 + -0.65 -0.65 -0.41 + -0.62 -0.62 -0.49 + 0.63 -0.7 -0.34 + 0.65 -0.66 0.37 + -0.65 0.66 -0.37 + 0.1 0.71 -0.7 + -0.63 0.7 0.34 + 0.62 0.62 0.49 + 0.65 0.65 0.41 + -0.7 -0.13 -0.7 + -0.62 -0.49 -0.62 + 0.11 0.7 -0.71 + 0.68 0.29 -0.68 + 0.66 -0.34 -0.67 + 0.67 -0.3 -0.67 + -0.66 0.34 0.67 + -0.67 0.3 0.67 + 0.62 0.49 0.62 + 0.7 0.13 0.7 + -0.11 -0.7 0.71 + -0.68 -0.29 0.68 -Geomview output (2-d, 3-d, and 4-d) - Ga - all points as dots - Gp - coplanar points and vertices as radii - Gv - vertices as spheres - Gi - inner planes only - Gn - no planes - Go - outer planes only - Gc - centrums - Gh - hyperplane intersections - Gr - ridges - GDn - drop dimension n in 3-d and 4-d output +Convex hull of 14 points in 3-d: -Print options: - PAn - keep n largest facets by area - Pdk:n - drop facet if normal[k] <= n (default 0.0) - PDk:n - drop facet if normal[k] >= n - Pg - print good facets (needs 'QGn' or 'QVn') - PFn - keep facets whose area is at least n - PG - print neighbors of good facets - PMn - keep n facets with most merges - Po - force output. If error, output neighborhood of facet - Pp - do not report precision problems + Number of vertices: 14 + Number of facets: 24 - . - list of all options - - - one line descriptions of all options - -V - version -qconvex . +Statistics for: user_eg2 cube example | qhull s Tcv Q11 QR1 p QR1 -Qhull 2015.2 2016/01/18. -Except for 'F.' and 'PG', upper-case options take an argument. + Number of points processed: 14 + Number of hyperplanes created: 46 + Number of distance tests for qhull: 68 + Number of distance tests for merging: 284 + Number of distance tests for checking: 244 + Number of merged facets: 6 + CPU seconds to compute hull (after input): 0 - incidences mathematica normals OFF_format points - summary facet_dump +3 +14 +0.9124763375291641 1.390833937612012 -0.4826674750136243 +-0.5764091147442416 0.565375258822974 -1.532352227508615 +-0.1847368907548403 1.250953879569599 1.183632828365285 +-1.673622343028246 0.4254952007805605 0.1339480758702939 +1.673622343028246 -0.4254952007805605 -0.1339480758702939 +0.1847368907548403 -1.250953879569599 -1.183632828365285 +0.5764091147442416 -0.565375258822974 1.532352227508615 +-0.9124763375291641 -1.390833937612012 0.4826674750136243 + -2 0 0 + 2 0 0 + 0 -2 0 + 0 2 0 + 0 0 -2 + 0 0 2 - Farea FArea_total Fcoplanars FCentrums Fd_cdd_in - FD_cdd_out FFacet_xridge Finner FIDs Fmerges - Fneighbors FNeigh_vertex Fouter FOptions FPoint_near - FQhull Fsummary FSize Fvertices FVertex_ave - Fxtremes FMaple +Output completed. Verifying that all points are below outer planes of +all facets. Will make 192 distance computations. - Gvertices Gpoints Gall_points Gno_planes Ginner - Gcentrums Ghyperplanes Gridges Gouter GDrop_dim +======== +compute 2-d Delaunay triangulation +seed: 1595644038 - PArea_keep Pdrop d0:0D0 PFacet_area_keep Pgood PGood_neighbors - PMerge_keep Poutput_forced Pprecision_not +8 vertices and 12 facets with normals: + 0.82 0.37 0.43 + 0.82 0.26 0.52 + 0.77 0.21 0.6 + 0.37 -0.025 0.93 + -0.96 -0.0085 -0.29 + -0.66 0.42 -0.62 + -0.77 0.28 -0.57 + -0.43 -0.34 -0.83 + -0.45 -0.61 -0.65 + -0.54 -0.61 -0.57 + -0.6 -0.59 -0.53 + -0.72 -0.46 -0.53 - QbBound 0:0.5 QbB_scale_box Qcoplanar QGood_point Qinterior - QJoggle Qrandom QRotate Qsearch_1st Qtriangulate - QVertex_good +Voronoi diagram by the convex hull of 8 points in 3-d: - T4_trace Tcheck_often Tstatistics Tverify Tz_stdout - TFacet_log TInput_file TPoint_trace TMerge_trace TOutput_file - TWide_trace TVertex_stop TCone_stop + Number of Voronoi regions: 8 + Number of Voronoi vertices: 8 - Angle_max Centrum_size Random_dist Ucoplanar_max Wide_outside -qconvex +Statistics for: user_eg2 Delaunay example | qhull s d Tcv v p -qconvex- compute the convex hull. Qhull 2015.2 2016/01/18 - input (stdin): dimension, number of points, point coordinates - comments start with a non-numeric character + Number of points processed: 8 + Number of hyperplanes created: 23 + Number of facets in hull: 12 + Number of distance tests for qhull: 32 + CPU seconds to compute hull (after input): 0 -options (qconvex.htm): - Qt - triangulated output - QJ - joggled input instead of merged facets - Tv - verify result: structure, convexity, and point inclusion - . - concise list of all options - - - one-line description of all options - -V - version +2 +8 +-1.674054922003768 -0.01487922147866316 +-0.5283040369357602 0.3408731556323899 +-0.6811827832457983 0.2470406317137401 +-0.2588235717416882 -0.2062901824864997 +-0.3453635548914167 -0.473499856633778 +-0.4723074028302096 -0.5334617665938058 +-0.5632414635328725 -0.5546706688338812 +-0.6792210384845423 -0.4332097342034502 -output options (subset): - s - summary of results (default) - i - vertices incident to each facet - n - normals with offsets - p - vertex coordinates (includes coplanar points if 'Qc') - Fx - extreme points (convex hull vertices) - FA - report total area and volume - FS - compute total area and volume - o - OFF format (dim, n, points, facets) - G - Geomview output (2-d, 3-d, and 4-d) - m - Mathematica output (2-d and 3-d) - QVn - print facets that include point n, -n if not - TO file- output results to file, may be enclosed in single quotes +Output completed. Verifying that all points are below 5.2e-15 of +all facets. Will make 64 distance computations. -examples: - rbox c D2 | qconvex s n rbox c D2 | qconvex i - rbox c D2 | qconvex o rbox 1000 s | qconvex s Tv FA - rbox c d D2 | qconvex s Qc Fx rbox y 1000 W0 | qconvex s n - rbox y 1000 W0 | qconvex s QJ rbox d G1 D12 | qconvex QR0 FA Pp - rbox c D7 | qconvex FA TF1000 +======== +add points to triangulation +added point p8: -1 -0.7369 1.543 +9 points, 0 extra points, 9 vertices, and 14 facets in total +added point p9: 0.5112 -0.0827 0.2682 +10 points, 0 extra points, 10 vertices, and 16 facets in total +added point p10: 0.06553 -0.5621 0.3202 +11 points, 0 extra points, 11 vertices, and 18 facets in total +added point p11: -0.9059 0.3577 0.9486 +12 points, 0 extra points, 12 vertices, and 20 facets in total +added point p12: 0.3586 0.8694 0.8844 +13 points, 0 extra points, 13 vertices, and 22 facets in total +added point p13: -0.233 0.03883 0.0558 +14 points, 0 extra points, 14 vertices, and 24 facets in total -rbox c D3 | qconvex s n Qt -4 -12 - -0 -0 -1 -0.5 - -0 -0 -1 -0.5 - 0 -1 0 -0.5 - 0 -1 0 -0.5 - 1 -0 -0 -0.5 - 1 -0 -0 -0.5 - -1 -0 -0 -0.5 - -1 -0 -0 -0.5 - 0 1 -0 -0.5 - 0 1 -0 -0.5 - -0 -0 1 -0.5 - -0 -0 1 -0.5 +find Delaunay triangle or adjacent triangle closest to [0.5, 0.5, ...] + 0.36 0.87 + 0.51 -0.08 +-0.12 0.06 -Convex hull of 8 points in 3-d: +Voronoi diagram by the convex hull of 14 points in 3-d: - Number of vertices: 8 - Number of facets: 12 - Number of triangulated facets: 6 + Number of Voronoi regions: 14 + Number of Voronoi vertices: 19 -Statistics for: rbox c D3 | qconvex s n Qt +Statistics for: user_eg2 Delaunay example | qhull s d Tcv v p - Number of points processed: 8 - Number of hyperplanes created: 11 - Number of distance tests for qhull: 35 - Number of distance tests for merging: 108 - Number of distance tests for checking: 56 - Number of merged facets: 6 + Number of points processed: 14 + Number of hyperplanes created: 51 + Number of facets in hull: 24 + Number of distance tests for qhull: 69 CPU seconds to compute hull (after input): 0 -rbox c D2 | qconvex s i -4 -0 2 -1 0 -2 3 -3 1 +2 +19 +-0.3453635548914167 -0.473499856633778 +-0.4723074028302096 -0.5334617665938058 +-0.5632414635328725 -0.5546706688338812 +-0.6792210384845423 -0.4332097342034502 +-4.056602348809204 -0.06101009284882331 +-0.6560206746168462 -0.6998668839041049 +0.185140444577552 -0.06163295117232724 +-0.2543391922542552 -0.5188303037952583 +0.3503119507232316 -0.379975065066025 +-2.028638855503524 -0.02174467382692347 +-1.591570729265863 -0.04956406204488362 +-0.6808639548265594 0.136484379373769 +0.2852101525160285 0.3693477005974929 +-0.129890132625773 -0.1642796734345424 +-0.2761495329593209 -0.2597875866082675 +-0.5599240949499432 0.2183890070294259 +-0.3236308562463083 0.7169995339075901 +-0.3180575110901469 0.7253864449960007 +-0.3156556110857897 0.7236756129173678 -Convex hull of 4 points in 2-d: +Output completed. Verifying that all points are below 5.2e-15 of +all facets. Will make 266 distance computations. - Number of vertices: 4 - Number of facets: 4 +======== +compute halfspace intersection about the origin for a diamond -Statistics for: rbox c D2 | qconvex s i +Halfspace intersection by the convex hull of 8 points in 3-d: - Number of points processed: 4 - Number of hyperplanes created: 6 - Number of distance tests for qhull: 6 - CPU seconds to compute hull (after input): 0 + Number of halfspaces: 8 + Number of non-redundant halfspaces: 8 + Number of intersection points: 6 + Number of non-simplicial intersection points: 6 -rbox c D2 | qconvex o -2 -4 4 4 - -0.5 -0.5 - -0.5 0.5 - 0.5 -0.5 - 0.5 0.5 -2 0 2 -2 1 0 -2 2 3 -2 3 1 -rbox 1000 s | qconvex s Tv FA +Statistics for: user_eg2 halfspace example | qhull H0 s Tcv Fp -Convex hull of 1000 points in 3-d: + Number of points processed: 8 + Number of hyperplanes created: 11 + Number of distance tests for qhull: 34 + Number of distance tests for merging: 96 + Number of distance tests for checking: 100 + Number of merged facets: 6 + CPU seconds to compute hull (after input): 0.001 - Number of vertices: 1000 - Number of facets: 1996 +3 +6 + 0 0 -1 + 0 -1 0 + 1 0 0 + -1 0 0 + 0 1 0 + 0 0 1 -Statistics for: rbox 1000 s | qconvex s Tv FA +Output completed. Verifying that all points are below outer planes of +all facets. Will make 48 distance computations. - Number of points processed: 1000 - Number of hyperplanes created: 5545 - Number of distance tests for qhull: 25488 - CPU seconds to compute hull (after input): 0.015 - Total facet area: 3.1201951 - Total volume: 0.51650274 +======== +add halfspaces for cube to intersection +added offset -1 and normal 1.732 0 0 +8 points, 1 extra points, 9 vertices, and 9 facets in total +added offset -1 and normal -1.732 0 0 +8 points, 2 extra points, 10 vertices, and 12 facets in total +added offset -1 and normal 0 1.732 0 +8 points, 3 extra points, 11 vertices, and 15 facets in total +added offset -1 and normal 0 -1.732 0 +8 points, 4 extra points, 12 vertices, and 18 facets in total +added offset -1 and normal 0 0 1.732 +8 points, 5 extra points, 13 vertices, and 21 facets in total +added offset -1 and normal 0 0 -1.732 +8 points, 6 extra points, 14 vertices, and 24 facets in total +Halfspace intersection by the convex hull of 14 points in 3-d: -qhull output completed. Verifying that 1000 points are -below 2.1e-015 of the nearest facet. -rbox c d D2 | qconvex s Qc Fx -4 -0 -2 -3 -1 + Number of halfspaces: 14 + Number of non-redundant halfspaces: 14 + Number of intersection points: 24 -Convex hull of 8 points in 2-d: +Statistics for: user_eg2 halfspace example | qhull H0 s Tcv Fp - Number of vertices: 4 - Number of coplanar points: 4 - Number of facets: 4 + Number of points processed: 14 + Number of hyperplanes created: 35 + Number of distance tests for qhull: 58 + Number of distance tests for merging: 248 + Number of distance tests for checking: 256 + Number of merged facets: 6 + CPU seconds to compute hull (after input): 0.001 -Statistics for: rbox c d D2 | qconvex s Qc Fx +3 +24 +0.5773502691896257 0 -0.4226497308103742 +0.5773502691896257 -0.4226497308103742 0 +0.5773502691896257 0.4226497308103742 0 +0.5773502691896257 0 0.4226497308103742 +-0.5773502691896257 0 -0.4226497308103742 +-0.5773502691896257 -0.4226497308103742 0 +-0.5773502691896257 0 0.4226497308103742 +-0.5773502691896257 0.4226497308103742 0 + 0 0.5773502691896257 -0.4226497308103742 +0.4226497308103742 0.5773502691896257 0 +-0.4226497308103742 0.5773502691896257 0 + 0 0.5773502691896257 0.4226497308103742 + 0 -0.5773502691896257 -0.4226497308103742 +-0.4226497308103742 -0.5773502691896257 0 + 0 -0.5773502691896257 0.4226497308103742 +0.4226497308103742 -0.5773502691896257 0 + 0 -0.4226497308103742 0.5773502691896257 +0.4226497308103742 0 0.5773502691896257 + 0 0.4226497308103742 0.5773502691896257 +-0.4226497308103742 0 0.5773502691896257 +-0.4226497308103742 0 -0.5773502691896257 + 0 -0.4226497308103742 -0.5773502691896257 + 0 0.4226497308103742 -0.5773502691896257 +0.4226497308103742 0 -0.5773502691896257 - Number of points processed: 4 - Number of hyperplanes created: 6 - Number of distance tests for qhull: 36 - CPU seconds to compute hull (after input): 0 +Output completed. Verifying that all points are below outer planes of +all facets. Will make 192 distance computations. +user_eg3 + +======== +user_eg3 commands... -- demonstrate calling rbox and qhull from C++. + +user_eg3 is statically linked to qhullcpp and reentrant qhull. If user_eg3 +fails immediately, it is probably linked to the non-reentrant qhull library. + +Commands: + eg-100 Run the example in qh-code.htm + eg-convex 'rbox d | qconvex o' with std::vector and C++ classes + eg-delaunay 'rbox y c | qdelaunay o' with std::vector and C++ classes + eg-voronoi 'rbox y c | qvoronoi o' with std::vector and C++ classes + eg-fifo 'rbox y c | qvoronoi FN Fi Fo' with QhullUser and qh_fprintf + +Rbox and Qhull commands: + rbox "200 D4" ... Generate points from rbox + qhull "d p" ... Run qhull with options and produce output + qhull-cout "o" ... Run qhull with options and produce output to cout + qhull "T1" ... Run qhull with level-1 trace to cerr + qhull-cout "T1z" ... Run qhull with level-1 trace to cout + facets Print qhull's facets when done + +For example + user_eg3 rbox qhull + user_eg3 rbox qhull T1 + user_eg3 rbox qhull d + user_eg3 rbox D2 10 2 "s r 5" qhull "s p" facets + user_eg3 eg-convex + user_eg3 rbox 10 eg-delaunay qhull "d o" + user_eg3 rbox D5 c P2 qhull d eg-delaunay + user_eg3 rbox "D5 c P2" qhull v eg-voronoi o + user_eg3 rbox D2 10 qhull "v" eg-fifo p Fi Fo +user_eg3 eg-100 +- f24 + - flags: bottom simplicial + - normal: -0.721696 -0.658796 -0.212466 + - offset: -0.549277 + - vertices: p40(v10) p27(v7) p0(v1) + - neighboring facets: f34 f47 f54 +- f32 + - flags: top simplicial + - normal: 0.389612 -0.428663 0.815138 + - offset: -0.449315 + - vertices: p22(v12) p13(v6) p82(v2) + - neighboring facets: f61 f72 f77 +- f34 + - flags: top simplicial + - normal: -0.452613 -0.760661 0.465335 + - offset: -0.62552 + - vertices: p22(v12) p27(v7) p0(v1) + - neighboring facets: f24 f80 f73 +- f38 + - flags: top simplicial + - normal: 0.998285 0.058513 -0.00174787 + - offset: -0.477764 + - vertices: p90(v13) p48(v8) p82(v2) + - neighboring facets: f100 f97 f57 +- f46 + - flags: bottom simplicial + - normal: -0.406035 0.904011 0.133791 + - offset: -0.547585 + - vertices: p73(v15) p76(v9) p97(v5) + - neighboring facets: f51 f87 f82 +- f47 + - flags: bottom simplicial + - normal: -0.992416 -0.0122817 -0.122308 + - offset: -0.469463 + - vertices: p73(v15) p40(v10) p0(v1) + - neighboring facets: f24 f81 f88 +- f49 + - flags: top simplicial + - normal: -0.107843 0.991034 0.0788761 + - offset: -0.50132 + - vertices: p21(v16) p97(v5) p29(v3) + - neighboring facets: f116 f66 f51 +- f51 + - flags: top simplicial + - normal: -0.177935 0.975873 0.126537 + - offset: -0.506339 + - vertices: p21(v16) p76(v9) p97(v5) + - neighboring facets: f46 f49 f67 +- f52 + - flags: top simplicial + - normal: -0.378163 -0.891276 -0.250241 + - offset: -0.526009 + - vertices: p98(v17) p27(v7) p83(v4) + - neighboring facets: f75 f53 f54 +- f53 + - flags: bottom simplicial + - normal: -0.430163 -0.821913 -0.373389 + - offset: -0.546784 + - vertices: p98(v17) p40(v10) p83(v4) + - neighboring facets: f108 f52 f54 +- f54 + - flags: top simplicial + - normal: -0.548096 -0.791241 -0.271162 + - offset: -0.537299 + - vertices: p98(v17) p40(v10) p27(v7) + - neighboring facets: f24 f52 f53 +- f57 + - flags: bottom simplicial + - normal: 0.974428 0.137974 -0.177349 + - offset: -0.521881 + - vertices: p19(v18) p90(v13) p48(v8) + - neighboring facets: f38 f60 f113 +- f59 + - flags: bottom simplicial + - normal: 0.239508 -0.0103785 -0.970839 + - offset: -0.517616 + - vertices: p19(v18) p4(v14) p83(v4) + - neighboring facets: f76 f110 f60 +- f60 + - flags: top simplicial + - normal: 0.567061 -0.0365561 -0.822865 + - offset: -0.572132 + - vertices: p19(v18) p4(v14) p48(v8) + - neighboring facets: f85 f57 f59 +- f61 + - flags: bottom simplicial + - normal: 0.433241 -0.284128 0.855321 + - offset: -0.426268 + - vertices: p37(v19) p13(v6) p82(v2) + - neighboring facets: f32 f69 f95 +- f65 + - flags: top simplicial + - normal: -0.198254 0.211674 0.957021 + - offset: -0.497913 + - vertices: p67(v20) p12(v11) p76(v9) + - neighboring facets: f79 f67 f68 +- f66 + - flags: top simplicial + - normal: -0.155514 0.97946 0.128347 + - offset: -0.504016 + - vertices: p67(v20) p21(v16) p29(v3) + - neighboring facets: f49 f71 f67 +- f67 + - flags: bottom simplicial + - normal: -0.16055 0.978089 0.132539 + - offset: -0.504235 + - vertices: p67(v20) p21(v16) p76(v9) + - neighboring facets: f51 f65 f66 +- f68 + - flags: top simplicial + - normal: 0.598999 -0.0537935 0.798941 + - offset: -0.457967 + - vertices: p67(v20) p37(v19) p12(v11) + - neighboring facets: f96 f65 f69 +- f69 + - flags: bottom simplicial + - normal: 0.69477 -0.0317528 0.718531 + - offset: -0.45153 + - vertices: p67(v20) p37(v19) p82(v2) + - neighboring facets: f61 f98 f68 +- f71 + - flags: bottom simplicial + - normal: 0.877687 0.308225 0.366966 + - offset: -0.494379 + - vertices: p67(v20) p90(v13) p29(v3) + - neighboring facets: f115 f66 f99 +- f72 + - flags: top simplicial + - normal: 0.245263 -0.887198 0.390801 + - offset: -0.480731 + - vertices: p41(v21) p22(v12) p82(v2) + - neighboring facets: f32 f74 f73 +- f73 + - flags: bottom simplicial + - normal: 0.0168085 -0.963019 0.268908 + - offset: -0.510609 + - vertices: p41(v21) p22(v12) p27(v7) + - neighboring facets: f34 f75 f72 +- f74 + - flags: bottom simplicial + - normal: 0.227082 -0.964773 0.132845 + - offset: -0.464868 + - vertices: p41(v21) p4(v14) p82(v2) + - neighboring facets: f84 f72 f76 +- f75 + - flags: bottom simplicial + - normal: 0.0345717 -0.998303 0.0468616 + - offset: -0.47919 + - vertices: p41(v21) p27(v7) p83(v4) + - neighboring facets: f52 f76 f73 +- f76 + - flags: top simplicial + - normal: 0.137757 -0.987556 0.0758723 + - offset: -0.471349 + - vertices: p41(v21) p4(v14) p83(v4) + - neighboring facets: f59 f75 f74 +- f77 + - flags: bottom simplicial + - normal: -0.323398 -0.00535492 0.946248 + - offset: -0.501516 + - vertices: p15(v22) p22(v12) p13(v6) + - neighboring facets: f32 f78 f80 +- f78 + - flags: top simplicial + - normal: -0.20543 0.0915675 0.974379 + - offset: -0.474687 + - vertices: p15(v22) p12(v11) p13(v6) + - neighboring facets: f94 f77 f79 +- f79 + - flags: bottom simplicial + - normal: -0.218614 0.160888 0.962457 + - offset: -0.484859 + - vertices: p15(v22) p12(v11) p76(v9) + - neighboring facets: f65 f82 f78 +- f80 + - flags: top simplicial + - normal: -0.593167 -0.119334 0.796186 + - offset: -0.544059 + - vertices: p15(v22) p22(v12) p0(v1) + - neighboring facets: f34 f81 f77 +- f81 + - flags: bottom simplicial + - normal: -0.974282 0.088044 0.20742 + - offset: -0.50771 + - vertices: p15(v22) p73(v15) p0(v1) + - neighboring facets: f47 f80 f82 +- f82 + - flags: top simplicial + - normal: -0.826328 0.394399 0.402034 + - offset: -0.559684 + - vertices: p15(v22) p73(v15) p76(v9) + - neighboring facets: f46 f79 f81 +- f84 + - flags: top simplicial + - normal: 0.82988 -0.542609 -0.129903 + - offset: -0.585213 + - vertices: p57(v23) p4(v14) p82(v2) + - neighboring facets: f74 f101 f85 +- f85 + - flags: bottom simplicial + - normal: 0.906692 -0.29884 -0.297664 + - offset: -0.57209 + - vertices: p57(v23) p4(v14) p48(v8) + - neighboring facets: f60 f102 f84 +- f86 + - flags: top simplicial + - normal: -0.85363 0.243861 -0.460269 + - offset: -0.522928 + - vertices: p11(v24) p40(v10) p97(v5) + - neighboring facets: f89 f87 f88 +- f87 + - flags: bottom simplicial + - normal: -0.890339 0.291001 -0.350165 + - offset: -0.531756 + - vertices: p11(v24) p73(v15) p97(v5) + - neighboring facets: f46 f86 f88 +- f88 + - flags: top simplicial + - normal: -0.987894 0.0156004 -0.154345 + - offset: -0.477251 + - vertices: p11(v24) p73(v15) p40(v10) + - neighboring facets: f47 f86 f87 +- f89 + - flags: bottom simplicial + - normal: -0.492188 0.332666 -0.804416 + - offset: -0.526118 + - vertices: p25(v25) p40(v10) p97(v5) + - neighboring facets: f86 f114 f109 +- f94 + - flags: bottom simplicial + - normal: 0.368779 -0.208614 0.905805 + - offset: -0.440207 + - vertices: p7(v26) p12(v11) p13(v6) + - neighboring facets: f78 f95 f96 +- f95 + - flags: top simplicial + - normal: 0.417114 -0.259346 0.871066 + - offset: -0.429768 + - vertices: p7(v26) p37(v19) p13(v6) + - neighboring facets: f61 f94 f96 +- f96 + - flags: bottom simplicial + - normal: 0.469304 -0.162419 0.867971 + - offset: -0.446808 + - vertices: p7(v26) p37(v19) p12(v11) + - neighboring facets: f68 f94 f95 +- f97 + - flags: top simplicial + - normal: 0.911891 0.1675 0.374697 + - offset: -0.446013 + - vertices: p28(v27) p90(v13) p82(v2) + - neighboring facets: f38 f98 f99 +- f98 + - flags: bottom simplicial + - normal: 0.888791 0.148029 0.433749 + - offset: -0.448933 + - vertices: p28(v27) p67(v20) p82(v2) + - neighboring facets: f69 f97 f99 +- f99 + - flags: top simplicial + - normal: 0.903592 0.183305 0.387197 + - offset: -0.447956 + - vertices: p28(v27) p67(v20) p90(v13) + - neighboring facets: f71 f97 f98 +- f100 + - flags: bottom simplicial + - normal: 0.93763 -0.294784 -0.184262 + - offset: -0.546054 + - vertices: p42(v28) p48(v8) p82(v2) + - neighboring facets: f38 f101 f102 +- f101 + - flags: top simplicial + - normal: 0.933493 -0.306605 -0.185968 + - offset: -0.547862 + - vertices: p42(v28) p57(v23) p82(v2) + - neighboring facets: f84 f100 f102 +- f102 + - flags: bottom simplicial + - normal: 0.928146 -0.300441 -0.219729 + - offset: -0.55469 + - vertices: p42(v28) p57(v23) p48(v8) + - neighboring facets: f85 f100 f101 +- f108 + - flags: top simplicial + - normal: 0.00135876 0.0103445 -0.999946 + - offset: -0.494086 + - vertices: p5(v30) p40(v10) p83(v4) + - neighboring facets: f53 f110 f109 +- f109 + - flags: top simplicial + - normal: -0.106214 0.129184 -0.985916 + - offset: -0.504323 + - vertices: p5(v30) p25(v25) p40(v10) + - neighboring facets: f89 f108 f111 +- f110 + - flags: bottom simplicial + - normal: 0.125474 0.0262996 -0.991748 + - offset: -0.496467 + - vertices: p5(v30) p19(v18) p83(v4) + - neighboring facets: f59 f108 f111 +- f111 + - flags: bottom simplicial + - normal: 0.0358445 0.163534 -0.985886 + - offset: -0.514407 + - vertices: p5(v30) p25(v25) p19(v18) + - neighboring facets: f112 f110 f109 +- f112 + - flags: top simplicial + - normal: 0.0769357 0.958704 -0.273801 + - offset: -0.543222 + - vertices: p78(v31) p25(v25) p19(v18) + - neighboring facets: f111 f113 f114 +- f113 + - flags: top simplicial + - normal: 0.129005 0.982313 -0.135717 + - offset: -0.512909 + - vertices: p78(v31) p19(v18) p90(v13) + - neighboring facets: f57 f115 f112 +- f114 + - flags: bottom simplicial + - normal: -0.0450665 0.957786 -0.283929 + - offset: -0.551711 + - vertices: p78(v31) p25(v25) p97(v5) + - neighboring facets: f89 f116 f112 +- f115 + - flags: top simplicial + - normal: 0.102483 0.993113 -0.0567803 + - offset: -0.497056 + - vertices: p78(v31) p90(v13) p29(v3) + - neighboring facets: f71 f116 f113 +- f116 + - flags: bottom simplicial + - normal: -0.00662022 0.999903 -0.0122926 + - offset: -0.49314 + - vertices: p78(v31) p97(v5) p29(v3) + - neighboring facets: f49 f115 f114 +user_eg3 eg-convex + +A 3-d diamond (rbox d) +3 rbox "d" +6 +0 0 -0.5 +0 0 0.5 +0 -0.5 0 +0 0.5 0 +-0.5 0 0 +0.5 0 0 + +Input points and facetlist of its convex hull (qhull o) +3 +6 8 12 + 0 0 -0.5 + 0 0 0.5 + 0 -0.5 0 + 0 0.5 0 + -0.5 0 0 + 0.5 0 0 +3 2 0 4 +3 0 2 5 +3 1 2 4 +3 2 1 5 +3 3 0 5 +3 0 3 4 +3 1 3 5 +3 3 1 4 + +Input points and facetlist using std::vector and C++ classes +3 +6 8 12 + 0 0 -0.5 + 0 0 0.5 + 0 -0.5 0 + 0 0.5 0 + -0.5 0 0 + 0.5 0 0 +3 2 0 4 +3 0 2 5 +3 1 2 4 +3 2 1 5 +3 3 0 5 +3 0 3 4 +3 1 3 5 +3 3 1 4 + +Its outward pointing normals as vector plus offset (qhull n) +4 +8 +-0.5773502691896258 -0.5773502691896258 -0.5773502691896258 -0.2886751345948129 +0.5773502691896258 -0.5773502691896258 -0.5773502691896258 -0.2886751345948129 +-0.5773502691896258 -0.5773502691896258 0.5773502691896258 -0.2886751345948129 +0.5773502691896258 -0.5773502691896258 0.5773502691896258 -0.2886751345948129 +0.5773502691896258 0.5773502691896258 -0.5773502691896258 -0.2886751345948129 +-0.5773502691896258 0.5773502691896258 -0.5773502691896258 -0.2886751345948129 +0.5773502691896258 0.5773502691896258 0.5773502691896258 -0.2886751345948129 +-0.5773502691896258 0.5773502691896258 0.5773502691896258 -0.2886751345948129 +user_eg3 eg-delaunay + +A 2-d triangle in a square (rbox y c D2) +2 rbox "y c D2" +7 +0.0795233 -0.451105 +0.279706 0.0133225 +-0.0888864 0.0861965 +-0.5 -0.5 +-0.5 0.5 +0.5 -0.5 +0.5 0.5 + +The 2-d input sites are lifted to a 3-d paraboloid. +A Delaunay region is a facet of the paraboloid's convex hull. + +The Delaunay triangulation as input sites and Delaunay regions (qhull d o) +3 +7 8 12 +0.07952334739223432 -0.4511049142583319 0.209819606448483 +0.2797056779076398 0.01332249167684696 0.07841275503825199 +-0.08888640449278651 0.08619647248293871 0.01533062477215727 + -0.5 -0.5 0.5 + -0.5 0.5 0.5 + 0.5 -0.5 0.5 + 0.5 0.5 0.5 +3 2 4 3 +3 2 6 4 +3 5 0 3 +3 0 2 3 +3 6 1 5 +3 1 6 2 +3 1 0 5 +3 0 1 2 + +The same results using std::vector and C++ classes +3 +7 8 12 +0.0795233 -0.451105 0.20982 +0.279706 0.0133225 0.0784128 +-0.0888864 0.0861965 0.0153306 +-0.5 -0.5 0.5 +-0.5 0.5 0.5 +0.5 -0.5 0.5 +0.5 0.5 0.5 +3 2 4 3 +3 2 6 4 +3 5 0 3 +3 0 2 3 +3 6 1 5 +3 1 6 2 +3 1 0 5 +3 0 1 2 +user_eg3 eg-voronoi + +A 2-d triangle in a square (rbox y c D2) +2 rbox "y c D2" +7 +0.0795233 -0.451105 +0.279706 0.0133225 +-0.0888864 0.0861965 +-0.5 -0.5 +-0.5 0.5 +0.5 -0.5 +0.5 0.5 + +Its Voronoi diagram as vertices and regions (qhull v o) +The Voronoi diagram is the dual of the Delaunay triangulation +Voronoi vertices are Delaunay regions, and Voronoi regions are Delaunay input sites +The Voronoi vertex at infinity is represented as '-10.101 -10.101' +2 +9 7 1 +-10.101 -10.101 +-0.5894591914795221 -2.775557561562891e-17 + 0 0.5856274089010268 +-1.387778780781446e-17 -2.967377898513707 +-0.2290343684408742 -0.2527745420948135 +0.9568726986640038 2.081668171172169e-17 +0.1571419516493774 0.3619977084558904 +0.3129256373384354 -0.2763523586794005 +0.05307821633938364 -0.1643502208872393 +4 8 4 3 7 +4 8 6 5 7 +5 8 4 1 2 6 +4 4 1 0 3 +3 2 0 1 +4 7 3 0 5 +4 6 2 0 5 + +The same results using std::vector and C++ classes +Qhull::prepareVoronoi assigns facetT.visit_id and vertexT.neighbors +The Voronoi regions are rotated by one Voronoi vertex (prepareVoronoi occurs twice) +2 +9 7 1 +-10.101 -10.101 +-0.589459 -2.77556e-17 +0 0.585627 +-1.38778e-17 -2.96738 +-0.229034 -0.252775 +0.956873 2.08167e-17 +0.157142 0.361998 +0.312926 -0.276352 +0.0530782 -0.16435 +4 7 8 4 3 +4 7 8 6 5 +5 6 8 4 1 2 +4 3 4 1 0 +3 1 2 0 +4 5 7 3 0 +4 5 6 2 0 +user_eg3 eg-fifo + +A 2-d triangle in a square (rbox y c D2) +2 rbox "y c D2" +7 +0.0795233 -0.451105 +0.279706 0.0133225 +-0.0888864 0.0861965 +-0.5 -0.5 +-0.5 0.5 +0.5 -0.5 +0.5 0.5 -rbox y 1000 W0 | qconvex s n +Its Voronoi vertices (qhull v p) +This is the first part of eg-voronoi, but without infinity +2 +8 +-0.5894591914795221 -2.775557561562891e-17 + 0 0.5856274089010268 +-1.387778780781446e-17 -2.967377898513707 +-0.2290343684408742 -0.2527745420948135 +0.9568726986640038 2.081668171172169e-17 +0.1571419516493774 0.3619977084558904 +0.3129256373384354 -0.2763523586794005 +0.05307821633938364 -0.1643502208872393 + +Its Voronoi regions (qhull v FN) +This is the second part of eg-voronoi, with ids one less +Regions are ordered by the corresponding input site. +7 +4 7 3 2 6 +4 7 5 4 6 +5 7 3 0 1 5 +4 3 0 -1 2 +3 1 -1 0 +4 6 2 -1 4 +4 5 1 -1 4 + +The same results as 'qhull v p FN' using std::vector and C++ classes +Qhull::prepareVoronoi assigns facet.visit_id and vertex.neighbors +prepareVoronoi is also called by q.outputQhull("FN"), hence the rotated vertices +2 +8 +-0.589459 -2.77556e-17 +0 0.585627 +-1.38778e-17 -2.96738 +-0.229034 -0.252775 +0.956873 2.08167e-17 +0.157142 0.361998 +0.312926 -0.276352 +0.0530782 -0.16435 +7 +4 6 7 3 2 +4 6 7 5 4 +5 5 7 3 0 1 +4 2 3 0 -1 +3 0 1 -1 +4 4 6 2 -1 +4 4 5 1 -1 + +Hyperplanes for bounded facets between Voronoi regions (qhull v Fi) +Each hyperplane is the perpendicular bisector of 2 input sites. +10 +5 0 1 0.3958261856523667 0.9183254492563615 0.1299172425168069 +5 0 5 0.9933067158065388 -0.1155065726858348 -0.3427516509210134 +5 0 2 -0.2990888272252211 0.954225273941663 0.1727022360246516 +5 0 3 -0.9964596398753636 -0.08407250501478321 -0.2494748932535505 +5 1 5 0.3943714145865591 -0.9189511343684148 -0.3773632397513814 +5 1 2 -0.9810105005095815 0.1939546284313432 0.08394677360204827 +5 1 6 0.4123709353479589 0.9110160326142727 -0.3945864897570009 +5 2 6 0.8181972788475073 0.5749375730342683 -0.3366992011759034 +5 2 3 -0.574189571650573 -0.8187223801800775 -0.3384613206611199 +5 2 4 -0.7047972640762143 0.7094087795838752 -0.4154492254393445 + +Hyperplanes for unbounded rays of unbounded facets (qhull v Fo) +Each ray goes through the midpoint of 2 input sites, oriented outwards 4 +5 3 5 1 -5.624508437144599e-18 -2.812254218572297e-18 +5 3 4 -3.10259629632159e-16 1 -1.551298148160795e-16 +5 4 6 1 -0 -0 +5 5 6 -4.55634179336919e-17 1 2.278170896684595e-17 + +The same result as 'qhull v Fi' using QhullUser and its custom qh_fprintf +qh_fprintf captures the output from qh_eachvoronoi in io_r.c (qhull v Fi Fo Ta) +10 +5 0 1 0.395826 0.918325 0.129917 +5 0 5 0.993307 -0.115507 -0.342752 +5 0 2 -0.299089 0.954225 0.172702 +5 0 3 -0.99646 -0.0840725 -0.249475 +5 1 5 0.394371 -0.918951 -0.377363 +5 1 2 -0.981011 0.193955 0.0839468 +5 1 6 0.412371 0.911016 -0.394586 +5 2 6 0.818197 0.574938 -0.336699 +5 2 3 -0.57419 -0.818722 -0.338461 +5 2 4 -0.704797 0.709409 -0.415449 + +The same result as 'qhull v Fo' using QhullUser and its custom qh_fprintf 4 -0.2135848119563837 0.1168704340428167 0.9699086708284445 -0.09806074564261891 -0.08553875579270345 -0.8316435307282575 -0.5486822022403077 -0.1234144150397865 --0.749541668500822 -0.02779445272382559 -0.6613733859014792 -0.2159556159595279 -0.3120013537900506 0.9498158823230658 -0.02247097950761911 -0.02453689035981485 +5 3 5 1 -5.62451e-18 -2.81225e-18 +5 3 4 -3.1026e-16 1 -1.5513e-16 +5 4 6 1 -0 -0 +5 5 6 -4.55634e-17 1 2.27817e-17 + +Message codes captured by qh_fprintf in QhullUser.cpp (qhull v Fo Ta): +9231 9271 9272 9272 9273 9274 9271 9272 9272 9273 9274 9271 9272 9272 9273 9274 9271 9272 9272 9273 9274 +user_eg3 rbox qhull -Convex hull of 1004 points in 3-d: +Results of qhull + +Convex hull of 10 points in 2-d: Number of vertices: 4 Number of facets: 4 -Statistics for: rbox y 1000 W0 | qconvex s n +Statistics for: rbox "10 D2" | qhull Number of points processed: 4 Number of hyperplanes created: 5 - Number of distance tests for qhull: 11001 + Number of distance tests for qhull: 51 CPU seconds to compute hull (after input): 0 -rbox y 1000 W0 | qconvex s QJ +user_eg3 rbox qhull T1 -Convex hull of 1004 points in 3-d: +Results of T1 +[QH0013]qh_initqhull_globals: for rbox "10 D2" | qhull T1 +qh_meminitbuffers: memory initialized with alignment 8 +qh_maxmin: dim min max width nearzero min-point max-point + 0 -4.28543191e-01 3.79031236e-01 8.07574428e-01 7.6125e-15 p1 p4 + 1 -4.97972782e-01 4.74582647e-01 9.72555429e-01 1.6458e-14 p0 p1 +qh_maxmin: found the max and min points (by dim): p1 p4 p0 p1 +[QH1002]qh_maxsimplex: selected point p0 for 3`th initial vertex, det=0.7462, targetdet=0.7854, mindet=0.007854 +[QH1028]qh_createsimplex: created simplex +qh_initialhull: qh.interior_point p-2: -0.02391 0.1182 +[QH1027]qh_checkpolygon: check all facets from f1, qh.NEWtentative? 0 +[QH1064]qh_checkconvex: check that facets are not-flipped and for qh.ZEROcentrum that simplicial vertices are below their neighbor (dist<0.0) +qh_initialhull: simplex constructed +[QH1042]qh_partitionall: partition all points into outside sets + +Trace level T0, IStracing 1, point TP-3, merge TM0, dist TW1.8e+308, qh.tracefacet_id -1, traceridge_id -1, tracevertex_id -1, last qh.RERUN 0, rbox "10 D2" | qhull T1 +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213562930 _pre-merge _zero-centrum _max-width 0.97 + Error-roundoff 4.3e-16 _one-merge 2.1e-15 _near-inside 1.1e-14 + Visible-distance 8.5e-16 U-max-coplanar 8.5e-16 Width-outside 1.7e-15 + _wide-facet 5.1e-15 +[QH1029]qh_furthestnext: made f3 next facet(dist 0.19) +[QH1030]qh_initbuild: initial hull created and points partitioned +[QH1037]qh_buildhull: start build hull +[QH1049]qh_addpoint: add p8(v4) 0.19 above f3 to hull of 3 facets, 0 merges, 3 outside at 0 CPU secs. Previous p-1(v3) delta 0 CPU, 3 facets, 0 merges, 3 hyperplanes, 61 distplanes, 0 retries +[QH1040]qh_findhorizon: find horizon for point p8 facet f3 +[QH1041]qh_findhorizon: 2 horizon facets(good 2), 1 visible(good 1), 0 coplanar +[QH1032]qh_makenewfacets: created 2 new facets f4..f5 from point p8 to horizon +[QH1019]qh_matchnewfacets: match neighbors for new facets. +[QH1043]qh_partitionvisible: partitioned 2 points from outsidesets, 0 points from coplanarsets, and 0 deleted vertices +[QH1018]qh_deletevisible: delete 1 visible facets and 0 vertices +[QH1039]qh_buildhull: completed the hull construction +[QH1036]Qhull: algorithm completed +[QH1027]qh_checkpolygon: check all facets from f1, qh.NEWtentative? 0 +[QH1064]qh_checkconvex: check that facets are not-flipped and for qh.ZEROcentrum that simplicial vertices are below their neighbor (dist<0.0) - Number of vertices: 51 - Number of facets: 98 +Convex hull of 10 points in 2-d: -Statistics for: rbox y 1000 W0 | qconvex s QJ + Number of vertices: 4 + Number of facets: 4 - Number of points processed: 52 - Number of hyperplanes created: 181 - Number of distance tests for qhull: 6424 - CPU seconds to compute hull (after input): 0 - Input joggled by: 2.1e-011 +Statistics for: rbox "10 D2" | qhull T1 -rbox d G1 D12 | qconvex QR0 FA + Number of points processed: 4 + Number of hyperplanes created: 5 + Number of distance tests for qhull: 51 + CPU seconds to compute hull (after input): 0 -Convex hull of 24 points in 12-d: +user_eg3 rbox qhull d - Number of vertices: 24 - Number of facets: 4096 +Results of d -Statistics for: rbox d G1 D12 | qconvex QR0 FA QR1453170146 +Delaunay triangulation by the convex hull of 10 points in 3-d: - Number of points processed: 24 - Number of hyperplanes created: 4108 - Number of distance tests for qhull: 4216 - Number of distance tests for merging: 121128 - Number of distance tests for checking: 98328 - Number of merged facets: 2036 - CPU seconds to compute hull (after input): 0.062 - Approximate facet area: 0.00035546337 - Approximate volume: 8.5511197e-006 + Number of input sites: 10 + Number of Delaunay regions: 14 -rbox c D6 | qconvex FA TF500 +Statistics for: rbox "10 D2" | qhull d -Convex hull of 64 points in 6-d: + Number of points processed: 10 + Number of hyperplanes created: 28 + Number of facets in hull: 16 + Number of distance tests for qhull: 47 + CPU seconds to compute hull (after input): 0 - Number of vertices: 64 - Number of facets: 12 - Number of non-simplicial facets: 12 +user_eg3 rbox y c +rbox y +rbox c +3 rbox "y" "c" +12 +-0.306292 0.149266 -0.289011 +-0.409906 -0.282924 -0.0983473 +0.0770774 0.440163 -0.185531 +-0.212802 0.438723 -0.375664 +-0.5 -0.5 -0.5 +-0.5 -0.5 0.5 +-0.5 0.5 -0.5 +-0.5 0.5 0.5 +0.5 -0.5 -0.5 +0.5 -0.5 0.5 +0.5 0.5 -0.5 +0.5 0.5 0.5 +user_eg3 rbox D2 10 2 "s r 5" qhull 's p' facets +rbox D2 +rbox 10 +rbox 2 +rbox s r 5 -Statistics for: rbox c D6 | qconvex FA TF500 +Results of s p - Number of points processed: 64 - Number of hyperplanes created: 359 - Number of distance tests for qhull: 2510 - Number of distance tests for merging: 14115 - Number of distance tests for checking: 832 - Number of merged facets: 1457 - CPU seconds to compute hull (after input): 0.015 - Approximate facet area: 12 - Approximate volume: 1 +Convex hull of 17 points in 2-d: + Number of vertices: 7 + Number of facets: 7 -At 21:22:26 & 0.015 CPU secs, qhull has created 543 facets and merged 289. - The current hull contains 91 facets and 23 vertices. There are 41 - outside points. Next is point p27(v24), 0.64 above f107. +Statistics for: rbox "10 D2" "2 D2" "s r 5 D2" | qhull s p -At 21:22:26 & 0.015 CPU secs, qhull has created 1061 facets and merged 737. - The current hull contains 69 facets and 33 vertices. There are 31 - outside points. Next is point p22(v34), 0.52 above f610. + Number of points processed: 7 + Number of hyperplanes created: 11 + Number of distance tests for qhull: 78 + CPU seconds to compute hull (after input): 0 -At 21:22:26 & 0.015 CPU secs, qhull has created 1575 facets and merged 1230. - The current hull contains 25 facets and 51 vertices. There are 13 - outside points. Next is point p45(v52), 0.45 above f1476. +2 +7 +-0.02222276248244826 -0.4979727817680433 +-0.4285431913366012 0.4745826469497594 +0.3790312361708201 0.3779794437605696 +0.1545084971874737 0.4755282581475768 +-0.4045084971874738 -0.2938926261462365 +0.1545084971874736 -0.4755282581475768 + 0.5 -1.224646799147353e-16 -At 21:22:26 & 0.015 CPU secs, qhull has created 1815 facets and merged 1457. - The current hull contains 12 facets and 64 vertices. Last point was p35 +Facets created by Qhull::runQhull() +- f5 + - flags: bottom simplicial + - normal: 0.952413 0.304811 + - offset: -0.476206 + - vertices: p4(v4) p16(v2) + - neighboring facets: f8 f11 +- f6 + - flags: bottom simplicial + - normal: -0.999511 -0.0312605 + - offset: -0.413498 + - vertices: p14(v5) p1(v1) + - neighboring facets: f10 f7 +- f7 + - flags: top simplicial + - normal: -0.470938 -0.882167 + - offset: -0.44976 + - vertices: p14(v5) p0(v3) + - neighboring facets: f9 f6 +- f8 + - flags: top simplicial + - normal: 0.809017 -0.587785 + - offset: -0.404508 + - vertices: p15(v6) p16(v2) + - neighboring facets: f5 f9 +- f9 + - flags: bottom simplicial + - normal: 0.125986 -0.992032 + - offset: -0.491205 + - vertices: p15(v6) p0(v3) + - neighboring facets: f7 f8 +- f10 + - flags: top simplicial + - normal: -0.00162183 0.999999 + - offset: -0.475277 + - vertices: p12(v7) p1(v1) + - neighboring facets: f6 f11 +- f11 + - flags: bottom simplicial + - normal: 0.398486 0.917174 + - offset: -0.497712 + - vertices: p12(v7) p4(v4) + - neighboring facets: f5 f10 +user_eg3 rbox "10 D2" eg-convex +rbox 10 D2 -Convex hull of 64 points in 6-d: +Input points and facetlist for convex hull of rbox "10 D2" via C++ classes +2 +10 4 4 +-0.0222228 -0.497973 +-0.428543 0.474583 +0.31054 0.240018 +-0.0188396 0.363026 +0.379031 0.377979 +-0.299496 0.377661 +0.347182 0.0836553 +-0.0048582 0.348268 +0.344312 -0.143731 +0.309331 -0.077581 +2 4 1 +2 1 0 +2 8 4 +2 0 8 +user_eg3 rbox '10 D2' qhull s eg-convex +rbox 10 D2 - Number of vertices: 64 - Number of facets: 12 - Number of non-simplicial facets: 12 +Results of s -Statistics for: rbox c D6 | qconvex FA TF500 +Convex hull of 10 points in 2-d: - Number of points processed: 64 - Number of hyperplanes created: 359 - Number of distance tests for qhull: 2510 - Number of distance tests for merging: 13995 - Number of distance tests for checking: 0 - Number of merged facets: 1457 + Number of vertices: 4 + Number of facets: 4 +Statistics for: rbox "10 D2" | qhull s -First post-merge with 'C3.5e-015' and 'A1.8e+308' + Number of points processed: 4 + Number of hyperplanes created: 5 + Number of distance tests for qhull: 51 + CPU seconds to compute hull (after input): 0 -At 21:22:26 & 0.015 CPU secs, qhull has created 1815 facets and merged 1457. - The current hull contains 12 facets and 64 vertices. Last point was p35 -Testing all coplanar points. -computing area of each facet and volume of the convex hull -rbox c P0 d D2 | qconvex p Fa Fc FP FI Fn FN FS Fv Fx +Input points and facetlist for 'qhull s' via C++ classes 2 -8 - -0.5 -0.5 - -0.5 0.5 - 0.5 -0.5 - 0.5 0.5 - 0 -0.5 - 0 0.5 - -0.5 0 - 0.5 0 -4 - 1 - 1 - 1 - 1 -4 -1 5 -1 7 -1 8 -1 6 +10 4 4 +-0.0222228 -0.497973 +-0.428543 0.474583 +0.31054 0.240018 +-0.0188396 0.363026 +0.379031 0.377979 +-0.299496 0.377661 +0.347182 0.0836553 +-0.0048582 0.348268 +0.344312 -0.143731 +0.309331 -0.077581 +2 4 1 +2 1 0 +2 8 4 +2 0 8 +user_eg3 rbox 10 eg-delaunay qhull 'd o' +rbox 10 + +Delaunay triangulation of 10 points as 4-d paraboloid via C++ classes 4 -3 5 1 0.5 -2 7 2 0.5 -4 8 4 0.5 -4 6 5 0.5 +10 15 30 +-0.374949 0.224726 -0.0378235 0.192519 +0.300492 0.369454 0.421096 0.404114 +0.364148 0.233952 0.0348979 0.188555 +-0.470713 -0.281065 0.135495 0.318928 +0.264275 -0.326571 0.317506 0.2773 +0.318323 0.0506033 0.489822 0.343815 +0.433436 -0.248039 0.203767 0.290911 +-0.285595 -0.00222701 -0.42931 0.265876 +-0.40759 -0.362593 -0.0978938 0.307186 +-0.301385 -0.378685 0.434172 0.422741 +4 5 2 1 6 +4 5 4 2 6 +4 2 4 7 6 +4 4 0 5 2 +4 0 5 2 1 +4 0 4 9 3 +4 4 0 9 5 +4 0 9 5 1 +4 4 8 7 6 +4 4 8 9 3 +4 8 0 7 3 +4 0 8 4 3 +4 4 8 2 7 +4 8 0 2 7 +4 8 0 4 2 + +Results of d o 4 -1 +10 15 30 +-0.374949442106252 0.2247255418679914 -0.03782349642163468 0.1925192701852094 +0.3004920247946792 0.3694544596313075 0.4210962191420572 0.4041140804824029 +0.3641479121187217 0.2339522165562512 0.03489791698278666 0.1885552061417448 +-0.4707134565997063 -0.2810653003687648 0.1354949890035158 0.3189277533404903 +0.2642752088273644 -0.3265712199048802 0.3175057017407433 0.2773000183087906 +0.3183227589524563 0.05060330969337679 0.4898217078203537 0.3438153792710754 +0.4334355904100794 -0.2480392830893763 0.2037671452423252 0.2909109464698327 +-0.2855954200826543 -0.002227006947833121 -0.4293096679535784 0.2658764945305452 +-0.4075898489985521 -0.3625928418362446 -0.09789381697577781 0.3071862533596335 +-0.3013850588364387 -0.3786854184034145 0.4341719447953365 0.4227408774485775 +4 5 2 1 6 +4 5 4 2 6 +4 2 4 7 6 +4 4 0 5 2 +4 0 5 2 1 +4 0 4 9 3 +4 4 0 9 5 +4 0 9 5 1 +4 4 8 7 6 +4 4 8 9 3 +4 8 0 7 3 +4 0 8 4 3 +4 4 8 2 7 +4 8 0 2 7 +4 8 0 4 2 +user_eg3 rbox D5 c P2 qhull d eg-delaunay +rbox D5 +rbox c +rbox P2 + +Results of d + +Delaunay triangulation by the convex hull of 33 points in 6-d: + + Number of input sites: 33 + Number of Delaunay regions: 2 + Number of non-simplicial Delaunay regions: 2 + +Statistics for: rbox "c D5" "P2 D5" | qhull d + + Number of points processed: 33 + Number of hyperplanes created: 87 + Number of facets in hull: 11 + Number of distance tests for qhull: 826 + Number of distance tests for merging: 3868 + Number of distance tests for checking: 363 + Number of merged facets: 296 + CPU seconds to compute hull (after input): 0.001 + + +Vertices and Delaunay regions of paraboloid from 'qhull d' via C++ classes +6 +33 2 6 +-0.5 -0.5 -0.5 -0.5 -0.5 1.25 +-0.5 -0.5 -0.5 -0.5 0.5 1.25 +-0.5 -0.5 -0.5 0.5 -0.5 1.25 +-0.5 -0.5 -0.5 0.5 0.5 1.25 +-0.5 -0.5 0.5 -0.5 -0.5 1.25 +-0.5 -0.5 0.5 -0.5 0.5 1.25 +-0.5 -0.5 0.5 0.5 -0.5 1.25 +-0.5 -0.5 0.5 0.5 0.5 1.25 +-0.5 0.5 -0.5 -0.5 -0.5 1.25 +-0.5 0.5 -0.5 -0.5 0.5 1.25 +-0.5 0.5 -0.5 0.5 -0.5 1.25 +-0.5 0.5 -0.5 0.5 0.5 1.25 +-0.5 0.5 0.5 -0.5 -0.5 1.25 +-0.5 0.5 0.5 -0.5 0.5 1.25 +-0.5 0.5 0.5 0.5 -0.5 1.25 +-0.5 0.5 0.5 0.5 0.5 1.25 +0.5 -0.5 -0.5 -0.5 -0.5 1.25 +0.5 -0.5 -0.5 -0.5 0.5 1.25 +0.5 -0.5 -0.5 0.5 -0.5 1.25 +0.5 -0.5 -0.5 0.5 0.5 1.25 +0.5 -0.5 0.5 -0.5 -0.5 1.25 +0.5 -0.5 0.5 -0.5 0.5 1.25 +0.5 -0.5 0.5 0.5 -0.5 1.25 +0.5 -0.5 0.5 0.5 0.5 1.25 +0.5 0.5 -0.5 -0.5 -0.5 1.25 +0.5 0.5 -0.5 -0.5 0.5 1.25 +0.5 0.5 -0.5 0.5 -0.5 1.25 +0.5 0.5 -0.5 0.5 0.5 1.25 +0.5 0.5 0.5 -0.5 -0.5 1.25 +0.5 0.5 0.5 -0.5 0.5 1.25 +0.5 0.5 0.5 0.5 -0.5 1.25 +0.5 0.5 0.5 0.5 0.5 1.25 +2 0 0 0 0 4 +32 17 18 3 20 5 6 24 9 10 12 19 21 22 7 25 26 11 28 13 14 23 27 29 30 15 31 16 1 2 4 8 0 +17 17 18 20 24 19 21 22 25 26 28 23 27 29 30 31 16 32 +user_eg3 rbox '10 D2' eg-voronoi +rbox 10 D2 + +Voronoi vertices and regions for rbox "10 D2" via C++ classes 2 -4 +15 10 1 +-10.101 -10.101 +-0.129438 -0.0724741 +0.0826769 -0.239764 +0.129526 1.71603 +0.174036 0.531752 +0.185142 0.388255 +-0.906594 -0.296296 +-0.195481 -0.0711189 +-0.140758 0.723386 +-0.16763 0.208062 +0.0586831 0.0663207 +0.0880634 0.105408 +0.476159 -0.0316837 +3.09421 -0.0647219 +0.541052 0.211562 +5 7 1 2 0 6 +4 8 3 0 6 +3 14 5 11 +4 9 4 3 8 +6 14 5 4 3 0 13 +4 9 7 6 8 +5 14 11 10 12 13 +7 11 5 4 9 7 1 10 +4 13 0 2 12 +4 12 2 1 10 +user_eg3 rbox "D5 c P2" qhull v eg-voronoi o +rbox D5 c P2 + +Results of v + +Voronoi diagram by the convex hull of 33 points in 6-d: + + Number of Voronoi regions: 33 + Number of Voronoi vertices: 2 + Number of non-simplicial Voronoi vertices: 2 + +Statistics for: rbox "D5 c P2" | qhull v + + Number of points processed: 33 + Number of hyperplanes created: 87 + Number of facets in hull: 11 + Number of distance tests for qhull: 826 + Number of distance tests for merging: 3868 + Number of distance tests for checking: 363 + Number of merged facets: 296 + CPU seconds to compute hull (after input): 0.001 + + +Voronoi vertices and regions for 'qhull v' via C++ classes 5 -4 -2 1 2 -2 0 3 -2 0 3 -2 1 2 -9 -0 +3 33 1 +-10.101 -10.101 -10.101 -10.101 -10.101 +0 0 0 0 0 +0.916667 0 0 0 0 +2 0 2 2 0 1 -2 1 3 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 + +Results of o +5 +3 33 1 +-10.101 -10.101 -10.101 -10.101 -10.101 + 0 0 0 0 0 +0.9166666666666667 0 0 0 0 2 0 2 -2 2 3 -1 0 -1 3 -1 1 -1 2 -0 -2 4 1 -4 -2 3 1 -2 2 1 -2 4 3 -2 4 2 -4 -1 -3 -4 -2 -rbox c d D2 | qconvex s i QV0 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +2 0 1 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +3 0 1 2 +user_eg3 rbox '10 D2' eg-fifo +rbox 10 D2 + +Voronoi vertices for rbox "10 D2" via QhullUser and qh_fprintf 2 -0 2 -1 0 +14 +-0.129438 -0.0724741 +0.0826769 -0.239764 +0.129526 1.71603 +0.174036 0.531752 +0.185142 0.388255 +-0.906594 -0.296296 +-0.195481 -0.0711189 +-0.140758 0.723386 +-0.16763 0.208062 +0.0586831 0.0663207 +0.0880634 0.105408 +0.476159 -0.0316837 +3.09421 -0.0647219 +0.541052 0.211562 +10 +5 6 0 1 -1 5 +4 7 2 -1 5 +3 13 4 10 +4 8 3 2 7 +6 13 4 3 2 -1 12 +4 8 6 5 7 +5 13 10 9 11 12 +7 10 4 3 8 6 0 9 +4 12 -1 1 11 +4 11 1 0 9 -Convex hull of 8 points in 2-d: +Hyperplanes for bounded facets between Voronoi regions via QhullUser and qh_fprintf +19 +5 0 5 -0.301881 0.953346 0.00878913 +5 0 7 0.0205153 0.99979 0.0751143 +5 0 9 0.619259 0.785187 0.137061 +5 1 5 0.799595 -0.600539 0.546971 +5 1 3 0.964872 -0.262721 0.325862 +5 2 6 0.22816 -0.973624 0.0825353 +5 2 4 0.444671 0.895694 -0.430084 +5 2 7 -0.945841 0.32463 0.0490754 +5 3 5 -0.998643 0.0520745 -0.178237 +5 3 7 0.687752 -0.725945 0.26633 +5 3 4 0.999294 0.037557 -0.193884 +5 4 6 -0.107584 -0.994196 0.268542 +5 4 7 -0.997018 -0.0771644 0.214549 +5 5 7 0.995061 -0.0992661 0.187455 +5 6 7 -0.799364 0.600847 0.00706064 +5 6 9 -0.228542 -0.973534 0.077977 +5 6 8 -0.0126184 -0.99992 -0.0256728 +5 7 9 0.593695 -0.80469 0.0185277 +5 8 9 -0.467479 0.884004 0.250603 - Number of vertices: 4 - Number of facets: 4 - Number of 'good' facets: 2 +Hyperplanes for unbounded facets between Voronoi regions via QhullUser and qh_fprintf +4 +5 0 8 0.719063 0.694945 0.107173 +5 0 1 -0.385496 0.92271 -0.076093 +5 1 4 0.992921 -0.118775 0.0752121 +5 4 8 -0.0664014 -0.997793 0.140881 + +Message codes captured by qh_fprintf in QhullUser.cpp (qhull v Fo Ta): +9231 9271 9272 9272 9273 9274 9271 9272 9272 9273 9274 9271 9272 9272 9273 9274 9271 9272 9272 9273 9274 +user_eg3 rbox D2 10 qhull v eg-fifo p Fi Fo +rbox D2 +rbox 10 -Statistics for: rbox c d D2 | qconvex s i QV0 +Results of v - Number of points processed: 4 - Number of hyperplanes created: 6 - Number of distance tests for qhull: 36 +Voronoi diagram by the convex hull of 10 points in 3-d: + + Number of Voronoi regions: 10 + Number of Voronoi vertices: 14 + +Statistics for: rbox "10 D2" | qhull v + + Number of points processed: 10 + Number of hyperplanes created: 28 + Number of facets in hull: 16 + Number of distance tests for qhull: 47 CPU seconds to compute hull (after input): 0 -rbox c | qconvex Q0 -QH6029 qhull error: option 'Q0' is not used with this program. - It may be used with qhull. -While executing: | qconvex Q0 -Options selected for Qhull 2015.2 2016/01/18: - run-id 99126491 -qvoronoi - +Voronoi vertices for 'qhull v' via C++ classes +2 +14 +-0.129438 -0.0724741 +0.0826769 -0.239764 +0.129526 1.71603 +0.174036 0.531752 +0.185142 0.388255 +-0.906594 -0.296296 +-0.195481 -0.0711189 +-0.140758 0.723386 +-0.16763 0.208062 +0.0586831 0.0663207 +0.0880634 0.105408 +0.476159 -0.0316837 +3.09421 -0.0647219 +0.541052 0.211562 +10 +5 6 0 1 -1 5 +4 7 2 -1 5 +3 13 4 10 +4 8 3 2 7 +6 13 4 3 2 -1 12 +4 8 6 5 7 +5 13 10 9 11 12 +7 10 4 3 8 6 0 9 +4 12 -1 1 11 +4 11 1 0 9 + +Hyperplanes for bounded facets between Voronoi regions via QhullUser and qh_fprintf +19 +5 0 5 -0.301881 0.953346 0.00878913 +5 0 7 0.0205153 0.99979 0.0751143 +5 0 9 0.619259 0.785187 0.137061 +5 1 5 0.799595 -0.600539 0.546971 +5 1 3 0.964872 -0.262721 0.325862 +5 2 6 0.22816 -0.973624 0.0825353 +5 2 4 0.444671 0.895694 -0.430084 +5 2 7 -0.945841 0.32463 0.0490754 +5 3 5 -0.998643 0.0520745 -0.178237 +5 3 7 0.687752 -0.725945 0.26633 +5 3 4 0.999294 0.037557 -0.193884 +5 4 6 -0.107584 -0.994196 0.268542 +5 4 7 -0.997018 -0.0771644 0.214549 +5 5 7 0.995061 -0.0992661 0.187455 +5 6 7 -0.799364 0.600847 0.00706064 +5 6 9 -0.228542 -0.973534 0.077977 +5 6 8 -0.0126184 -0.99992 -0.0256728 +5 7 9 0.593695 -0.80469 0.0185277 +5 8 9 -0.467479 0.884004 0.250603 + +Hyperplanes for unbounded facets between Voronoi regions via QhullUser and qh_fprintf +4 +5 0 8 0.719063 0.694945 0.107173 +5 0 1 -0.385496 0.92271 -0.076093 +5 1 4 0.992921 -0.118775 0.0752121 +5 4 8 -0.0664014 -0.997793 0.140881 -qvoronoi- compute the Voronoi diagram - http://www.qhull.org 2015.2 2016/01/18 +Message codes captured by qh_fprintf in QhullUser.cpp (qhull v Fo Ta): +9231 9271 9272 9272 9273 9274 9271 9272 9272 9273 9274 9271 9272 9272 9273 9274 9271 9272 9272 9273 9274 + +Results of p +2 +14 +-0.1294381801544404 -0.07247409101984709 +0.08267689532419764 -0.2397644955865706 +0.1295260566906467 1.716033573116839 +0.1740355150742391 0.5317519038435656 +0.1851415205797576 0.3882545794457364 +-0.9065939866848106 -0.2962957610652136 +-0.1954805620516264 -0.07111892482963184 +-0.1407581310832469 0.7233857048236081 +-0.1676297826663961 0.2080621273999384 +0.05868313821742954 0.06632066014880161 +0.08806341399736983 0.1054080604689984 +0.4761588899009251 -0.03168366595227294 +3.094213357897476 -0.064721945677682 +0.5410515627308723 0.211561543495592 + +Results of Fi +19 +5 0 5 -0.301880639203215 0.9533457293522944 0.008789126238507639 +5 0 7 0.02051532578114256 0.9997895385570373 0.0751143044524602 +5 0 9 0.619259133056969 0.7851866823409139 0.1370614663104577 +5 1 5 0.7995952824356682 -0.6005392446015695 0.5469710423089691 +5 1 3 0.9648718030091262 -0.2627211520946076 0.3258622775065155 +5 2 6 0.2281595097543264 -0.9736237661995856 0.0825352874566877 +5 2 4 0.4446710312325422 0.895693962234081 -0.4300843534994401 +5 2 7 -0.9458410914974846 0.324629988810102 0.04907537812572163 +5 3 5 -0.9986432053419565 0.05207445078292225 -0.1782370644858235 +5 3 7 0.6877523324625964 -0.7259454037269318 0.2663295190946446 +5 3 4 0.99929448732669 0.03755699133966526 -0.1938837324602515 +5 4 6 -0.1075842248297359 -0.9941959739245502 0.2685422477498993 +5 4 7 -0.9970183790688238 -0.07716444646969949 0.2145489484590234 +5 5 7 0.995060920624513 -0.09926612839179721 0.1874553677160639 +5 6 7 -0.7993641842155071 0.6008468199079334 0.007060641163779156 +5 6 9 -0.2285415587894344 -0.9735341575446109 0.07797696388863322 +5 6 8 -0.01261839651625044 -0.9999203848653946 -0.02567278177543585 +5 7 9 0.5936952885926361 -0.8046899429612046 0.01852766555277021 +5 8 9 -0.4674785097727935 0.8840044360186254 0.2506025495170938 + +Results of Fo +4 +5 0 8 0.7190625207842074 0.6949453872092838 0.1071733734620183 +5 0 1 -0.3854955578888163 0.922709691532494 -0.07609298438083834 +5 1 4 0.9929212365203528 -0.1187746524595787 0.0752121188850394 +5 4 8 -0.06640144810487485 -0.9977929883946747 0.1408811441173877 + +set +v +=== check front ends and examples Fri, Jul 24, 2020 10:27:18 PM ================== +qconvex - + +qconvex -- compute the convex hull + http://www.qhull.org 2020.2 2020/07/24 input (stdin): first lines: dimension and number of points (or vice-versa). @@ -3277,1037 +4599,2177 @@ comments: start with a non-numeric character options: - Qu - compute furthest-site Voronoi diagram + Qc - keep coplanar points with nearest facet + Qi - keep interior points with nearest facet + QJ - joggled input instead of merged facets + Qt - triangulated output Qhull control options: - Qz - add point-at-infinity to Voronoi diagram + Qa - allow input with fewer or more points than coordinates + Qbk:n - scale coord k so that low bound is n + QBk:n - scale coord k so that upper bound is n (QBk is 0.5) + QbB - scale input to unit cube centered at the origin + Qbk:0Bk:0 - remove k-th coordinate from input + QJn - randomly joggle input in range [-n,n] + QRn - random rotation (n=seed, n=0 time, n=-1 time/no rotate) Qs - search all points for the initial simplex - QGn - Voronoi vertices if visible from point n, -n if not - QVn - Voronoi vertices for input point n, -n if not -Trace options: - T4 - trace at level n, 4=all, 5=mem/gauss, -1= events - Tc - check frequently during execution +Qhull extra options: + QGn - good facet if visible from point n, -n for not visible + QVn - good facet if it includes point n, -n if not + Qw - allow option warnings + Q12 - allow wide facets and wide dupridge + Q14 - merge pinched vertices that create a dupridge + +T options: + TFn - report summary when n or more facets created + TI file - input file, may be enclosed in single quotes + TO file - output file, may be enclosed in single quotes Ts - statistics Tv - verify result: structure, convexity, and in-circle test Tz - send all output to stdout - TFn - report summary when n or more facets created - TI file - input data from file, no spaces or single quotes - TO file - output results to file, may be enclosed in single quotes + +Trace options: + T4 - trace at level n, 4=all, 5=mem/gauss, -1= events + Ta - annotate output with message codes + TAn - stop qhull after adding n vertices + TCn - stop qhull after building cone for point n + TVn - stop qhull after adding point n, -n for before + Tc - check frequently during execution + Tf - flush each qh_fprintf for debugging segfaults TPn - turn on tracing when point n added to hull TMn - turn on tracing at merge n TWn - trace merge facets when width > n - TVn - stop qhull after adding point n, -n for before (see TCn) - TCn - stop qhull after building cone for point n (see TVn) Precision options: Cn - radius of centrum (roundoff added). Merge facets if non-convex An - cosine of maximum angle. Merge facets if cosine > n or non-convex C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge Rn - randomly perturb computations by a factor of [1-n,1+n] - Wn - min facet width for non-coincident point (before roundoff) + Un - max distance below plane for a new, coplanar point + Wn - min facet width for outside point (before roundoff) Output formats (may be combined; if none, produces a summary to stdout): - s - summary to stderr - p - Voronoi vertices - o - OFF format (dim, Voronoi vertices, and Voronoi regions) - i - Delaunay regions (use 'Pp' to avoid warning) f - facet dump + G - Geomview output (see below) + i - vertices incident to each facet + m - Mathematica output (2-d and 3-d) + n - normals with offsets + o - OFF file format (dim, points and facets) + p - point coordinates + s - summary (stderr) More formats: - Fc - count plus coincident points (by Voronoi vertex) + Fa - area for each facet + FA - compute total area and volume for option 's' + Fc - count plus coplanar points for each facet + use 'Qc' (default) for coplanar and 'Qi' for interior + FC - centrum for each facet Fd - use cdd format for input (homogeneous with offset first) - FD - use cdd format for output (offset first) + FD - use cdd format for numeric output (offset first) FF - facet dump without ridges - Fi - separating hyperplanes for bounded Voronoi regions - FI - ID for each Voronoi vertex - Fm - merge count for each Voronoi vertex (511 max) - Fn - count plus neighboring Voronoi vertices for each Voronoi vertex - FN - count and Voronoi vertices for each Voronoi region - Fo - separating hyperplanes for unbounded Voronoi regions + Fi - inner plane for each facet + FI - ID for each facet + Fm - merge count for each facet (511 max) + FM - Maple output (2-d and 3-d) + Fn - count plus neighboring facets for each facet + FN - count plus neighboring facets for each point + Fo - outer plane (or max_outside) for each facet FO - options and precision constants - FP - nearest point and distance for each coincident point - FQ - command used for qvoronoi + FP - nearest vertex for each coplanar point + FQ - command used for qconvex Fs - summary: #int (8), dimension, #points, tot vertices, tot facets, - for output: #Voronoi regions, #Voronoi vertices, - #coincident points, #non-simplicial regions - #real (2), max outer plane and min vertex - Fv - Voronoi diagram as Voronoi vertices between adjacent input sites - Fx - extreme points of Delaunay triangulation (on convex hull) + output: #vertices, #facets, #coplanars, #nonsimplicial + #real (2), max outer plane, min vertex + FS - sizes: #int (0) + #real (2) tot area, tot volume + Ft - triangulation with centrums for non-simplicial facets (OFF format) + Fv - count plus vertices for each facet + FV - average of vertices (a feasible point for 'H') + Fx - extreme points (in order for 2-d) -Geomview options (2-d only) +Geomview output (2-d, 3-d, and 4-d) Ga - all points as dots Gp - coplanar points and vertices as radii Gv - vertices as spheres + Gc - centrums + GDn - drop dimension n in 3-d and 4-d output + Gh - hyperplane intersections Gi - inner planes only Gn - no planes Go - outer planes only - Gc - centrums - Gh - hyperplane intersections Gr - ridges - GDn - drop dimension n in 3-d and 4-d output Print options: - PAn - keep n largest Voronoi vertices by 'area' + PAn - keep n largest facets by area Pdk:n - drop facet if normal[k] <= n (default 0.0) PDk:n - drop facet if normal[k] >= n - Pg - print good Voronoi vertices (needs 'QGn' or 'QVn') - PFn - keep Voronoi vertices whose 'area' is at least n - PG - print neighbors of good Voronoi vertices - PMn - keep n Voronoi vertices with most merges + PFn - keep facets whose area is at least n + Pg - print good facets (needs 'QGn' or 'QVn') + PG - print neighbors of good facets + PMn - keep n facets with most merges Po - force output. If error, output neighborhood of facet Pp - do not report precision problems . - list of all options - - one line descriptions of all options + -? - help with examples -V - version -qvoronoi . +qconvex . -Qhull 2015.2 2016/01/18. +Qhull 2020.2 2020/07/24 Except for 'F.' and 'PG', upper-case options take an argument. - OFF_format p_vertices i_delaunay summary facet_dump + facet-dump Geomview incidences mathematica normals + off-format points summary - Fcoincident Fd_cdd_in FD_cdd_out FF-dump-xridge Fi_bounded - Fxtremes Fmerges Fneighbors FNeigh_region FOptions - Fo_unbounded FPoint_near FQvoronoi Fsummary Fvoronoi - FIDs + Farea FArea-total Fcoplanars FCentrums Fd-cdd-in + FD-cdd-out FFacets-xridge Finner FIDs Fmerges + FMaple Fneighbors FNeigh-vertex Fouter FOptions + FPoint-near FQhull Fsummary FSize Ftriangles + Fvertices FVertex-ave Fxtremes + + Gall-points Gcentrums GDrop-dim Ghyperplanes Ginner + Gno-planes Gouter Gpoints Gridges Gvertices - Gvertices Gpoints Gall_points Gno_planes Ginner - Gcentrums Ghyperplanes Gridges Gouter GDrop_dim + PArea-keep Pdrop-d0:0D0 PFacet-area-keep Pgood PGood-neighbors + PMerge-keep Poutput-forced Pprecision-not - PArea_keep Pdrop d0:0D0 Pgood PFacet_area_keep - PGood_neighbors PMerge_keep Poutput_forced Pprecision_not + Qallow-short QbBound-0:0.5 QbB-scale-box Qcoplanar QGood-point + Qinterior QJoggle QRotate Qsearch-all Qtriangulate + QVertex-good Qwarn-allow Q12-allow-wide Q14-merge-pinched - QG_vertex_good Qsearch_1st Qupper_voronoi QV_point_good Qzinfinite - T4_trace Tcheck_often Tstatistics Tverify Tz_stdout - TFacet_log TInput_file TPoint_trace TMerge_trace TOutput_file - TWide_trace TVertex_stop TCone_stop + TFacet-log TInput-file TOutput-file Tstatistics Tverify + Tz-stdout - Angle_max Centrum_size Random_dist Wide_outside -qvoronoi + T4-trace Tannotate TAdd-stop Tcheck-often TCone-stop + Tflush TMerge-trace TPoint-trace TVertex-stop TWide-trace -qvoronoi- compute the Voronoi diagram. Qhull 2015.2 2016/01/18 + Angle-max Centrum-size Random-dist Ucoplanar-max Wide-outside +qconvex -? # [mar'19] isatty does not work for Git for Windows + +qconvex -- compute the convex hull. Qhull 2020.2 2020/07/24 input (stdin): dimension, number of points, point coordinates comments start with a non-numeric character -options (qvoronoi.htm): - Qu - compute furthest-site Voronoi diagram - Tv - verify result: structure, convexity, and in-circle test +options (qconvex.htm): + Qt - triangulated output + QJ - joggled input instead of merged facets + Tv - verify result: structure, convexity, and point inclusion . - concise list of all options - - - one-line description of all options + - - one-line description of each option + -? - this message -V - version output options (subset): s - summary of results (default) - p - Voronoi vertices - o - OFF file format (dim, Voronoi vertices, and Voronoi regions) - FN - count and Voronoi vertices for each Voronoi region - Fv - Voronoi diagram as Voronoi vertices between adjacent input sites - Fi - separating hyperplanes for bounded regions, 'Fo' for unbounded - G - Geomview output (2-d only) - QVn - Voronoi vertices for input point n, -n if not - TO file- output results to file, may be enclosed in single quotes + i - vertices incident to each facet + n - normals with offsets + p - vertex coordinates (if 'Qc', includes coplanar points) + FA - report total area and volume + FS - total area and volume + Fx - extreme points (convex hull vertices) + G - Geomview output (2-d, 3-d, and 4-d) + m - Mathematica output (2-d and 3-d) + o - OFF format (dim, n, points, facets) + QVn - print facets that include point n, -n if not + TI file - input file, may be enclosed in single quotes + TO file - output file, may be enclosed in single quotes examples: -rbox c P0 D2 | qvoronoi s o rbox c P0 D2 | qvoronoi Fi -rbox c P0 D2 | qvoronoi Fo rbox c P0 D2 | qvoronoi Fv -rbox c P0 D2 | qvoronoi s Qu Fv rbox c P0 D2 | qvoronoi Qu Fo -rbox c G1 d D2 | qvoronoi s p rbox c P0 D2 | qvoronoi s Fv QV0 + rbox c D2 | qconvex s n rbox c D2 | qconvex i + rbox c D2 | qconvex o rbox 1000 s | qconvex s Tv FA + rbox c d D2 | qconvex s Qc Fx rbox y 1000 W0 | qconvex Qc s n + rbox y 1000 W0 | qconvex s QJ rbox d G1 D12 | qconvex QR0 FA Pp + rbox c D7 | qconvex FA TF1000 -rbox c P0 D2 | qvoronoi s o -2 -5 5 1 --10.101 -10.101 - 0 -0.5 - -0.5 0 - 0.5 0 - 0 0.5 -4 4 2 1 3 -3 2 0 1 -3 4 0 2 -3 3 0 1 -3 4 0 3 +rbox c D3 | qconvex s n Qt -Voronoi diagram by the convex hull of 5 points in 3-d: +Convex hull of 8 points in 3-d: - Number of Voronoi regions: 5 - Number of Voronoi vertices: 4 + Number of vertices: 8 + Number of facets: 12 + Number of triangulated facets: 6 -Statistics for: rbox c P0 D2 | qvoronoi s o +Statistics for: rbox c D3 | qconvex s n Qt - Number of points processed: 5 - Number of hyperplanes created: 7 - Number of facets in hull: 5 - Number of distance tests for qhull: 8 - Number of distance tests for merging: 29 - Number of distance tests for checking: 30 - Number of merged facets: 1 + Number of points processed: 8 + Number of hyperplanes created: 11 + Number of distance tests for qhull: 34 + Number of distance tests for merging: 90 + Number of distance tests for checking: 48 + Number of merged facets: 6 CPU seconds to compute hull (after input): 0 -rbox c P0 D2 | qvoronoi Fi Tv 4 -5 0 3 0.7071067811865475 -0.7071067811865475 -0.3535533905932737 -5 0 1 -0.7071067811865475 -0.7071067811865475 -0.3535533905932737 -5 0 2 -0.7071067811865475 0.7071067811865475 -0.3535533905932737 -5 0 4 0.7071067811865475 0.7071067811865475 -0.3535533905932737 +12 + -0 -0 -1 -0.5 + -0 -0 -1 -0.5 + 0 -1 0 -0.5 + 0 -1 0 -0.5 + 1 -0 -0 -0.5 + 1 -0 -0 -0.5 + -1 -0 -0 -0.5 + -1 -0 -0 -0.5 + 0 1 -0 -0.5 + 0 1 -0 -0.5 + -0 -0 1 -0.5 + -0 -0 1 -0.5 +rbox c D2 | qconvex s i -Voronoi ridge statistics - 4 bounded ridges - 0 max. distance of midpoint to ridge - 4 bounded ridges with ok normal -2.2e-016 ave. angle to ridge -2.2e-016 max. angle to ridge +Convex hull of 4 points in 2-d: + + Number of vertices: 4 + Number of facets: 4 + +Statistics for: rbox c D2 | qconvex s i + + Number of points processed: 4 + Number of hyperplanes created: 6 + Number of distance tests for qhull: 5 + CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below outer planes of -all facets. Will make 20 distance computations. -rbox c P0 D2 | qvoronoi Fo -4 -5 1 2 -1 0 -0.5 -5 1 3 1 -0 -0 -5 2 4 1 -0 -0 -5 3 4 -1 0 0.5 -rbox c P0 D2 | qvoronoi Fv -8 -4 0 3 1 3 -4 0 1 1 2 -4 0 2 2 4 -4 0 4 3 4 -4 1 2 0 2 -4 1 3 0 1 -4 2 4 0 4 -4 3 4 0 3 -rbox c P0 D2 | qvoronoi s Qu Qt Fv 4 -4 1 3 0 2 -4 1 2 0 1 -4 2 4 0 1 -4 3 4 0 2 +0 2 +1 0 +2 3 +3 1 +rbox c D2 | qconvex s n -Furthest-site Voronoi vertices by the convex hull of 5 points in 3-d: +Convex hull of 4 points in 2-d: - Number of Voronoi regions: 5 - Number of Voronoi vertices: 2 - Number of triangulated facets: 1 + Number of vertices: 4 + Number of facets: 4 -Statistics for: rbox c P0 D2 | qvoronoi s Qu Qt Fv +Statistics for: rbox c D2 | qconvex s n - Number of points processed: 5 - Number of hyperplanes created: 7 - Number of facets in hull: 6 - Number of distance tests for qhull: 8 - Number of distance tests for merging: 33 - Number of distance tests for checking: 30 - Number of merged facets: 1 + Number of points processed: 4 + Number of hyperplanes created: 6 + Number of distance tests for qhull: 5 CPU seconds to compute hull (after input): 0 -rbox c P0 D2 | qvoronoi Qu Fo +3 4 -5 1 2 -0 1 0 -5 1 3 1 -0 -0 -5 2 4 1 -0 -0 -5 3 4 -0 1 -0 -rbox c G1 d D2 | qvoronoi s p + -0 -1 -0.5 + -1 0 -0.5 + 1 -0 -0.5 + 0 1 -0.5 +rbox c D2 | qconvex o 2 -9 - 0 -1.75 - -1.75 0 --0.5833333333333334 -0.5833333333333333 - 0 1.75 --0.5833333333333333 0.5833333333333334 - 1.75 0 -0.5833333333333334 -0.5833333333333333 -0.5833333333333334 0.5833333333333333 - 0 0 +4 4 4 + -0.5 -0.5 + -0.5 0.5 + 0.5 -0.5 + 0.5 0.5 +2 0 2 +2 1 0 +2 2 3 +2 3 1 +rbox 1000 s | qconvex s Tv FA -Voronoi diagram by the convex hull of 8 points in 3-d: +Convex hull of 1000 points in 3-d: - Number of Voronoi regions: 8 - Number of Voronoi vertices: 9 - Number of non-simplicial Voronoi vertices: 1 + Number of vertices: 1000 + Number of facets: 1996 -Statistics for: rbox c G1 d D2 | qvoronoi s p +Statistics for: rbox 1000 s | qconvex s Tv FA - Number of points processed: 8 - Number of hyperplanes created: 17 - Number of facets in hull: 10 - Number of distance tests for qhull: 42 - Number of distance tests for merging: 103 - Number of distance tests for checking: 80 - Number of merged facets: 3 + Number of points processed: 1000 + Number of hyperplanes created: 5544 + Number of distance tests for qhull: 25487 + CPU seconds to compute hull (after input): 0.003 + Total facet area: 3.1201951 + Total volume: 0.51650274 + + +qhull output completed. Verifying that 1000 points are +below 2.1e-15 of the nearest facet. +rbox c d D2 | qconvex s Qc Fx + +Convex hull of 8 points in 2-d: + + Number of vertices: 4 + Number of coplanar points: 4 + Number of facets: 4 + +Statistics for: rbox c d D2 | qconvex s Qc Fx + + Number of points processed: 4 + Number of hyperplanes created: 6 + Number of distance tests for qhull: 35 CPU seconds to compute hull (after input): 0 -rbox c G1 d D2 | qvoronoi QJ p -2 -10 --2.57276422388486e-011 1.749999999802917 --2.05463598231932e-011 -1.750000000331276 -0.5833333333083517 -0.5833333333052267 -1.862254794815499e-011 -7.815052443180038e-011 -1.750000000002628 3.498100747664324e-011 -0.5833333333132078 0.5833333333796981 --0.5833333332888888 0.5833333333317835 --7.592293460589872e-011 -7.815050692933324e-011 --1.750000000049026 2.293196879294717e-011 --0.5833333333977308 -0.5833333333229861 -rbox c P-0.1 P+0.1 P+0.1 D2 | qvoronoi s Fc FP FQ Fn FN 4 0 -1 1 -0 -0 +2 +3 1 -2 1 8 0 -rbox c P-0.1 P+0.1 P+0.1 D2 | qvoronoi s Fc FP FQ Fn FN -4 -3 -1 2 3 -3 -1 2 3 -4 -1 0 1 3 -4 0 -1 2 1 -7 -3 3 2 0 -1 1 -3 3 1 2 -3 0 -1 2 -3 3 -1 0 -3 1 -1 2 -3 1 -1 3 +rbox y 1000 W0 | qconvex Qc s n -Voronoi diagram by the convex hull of 7 points in 3-d: +Convex hull of 1004 points in 3-d: - Number of Voronoi regions: 6 - Number of nearly incident points: 1 - Number of Voronoi vertices: 4 - Number of non-simplicial Voronoi vertices: 2 + Number of vertices: 4 + Number of coplanar points: 1000 + Number of facets: 4 -Statistics for: rbox c P-0.1 P+0.1 P+0.1 D2 | qvoronoi s Fc FP FQ Fn FN +Statistics for: rbox y 1000 W0 | qconvex Qc s n - Number of points processed: 6 - Number of hyperplanes created: 8 - Number of facets in hull: 5 - Number of distance tests for qhull: 33 - Number of distance tests for merging: 49 - Number of distance tests for checking: 43 - Number of merged facets: 3 - CPU seconds to compute hull (after input): 0 + Number of points processed: 4 + Number of hyperplanes created: 4 + Number of distance tests for qhull: 11000 + CPU seconds to compute hull (after input): 0.001 -rbox P0 c D2 | qvoronoi s Fv QV0 4 -4 0 3 1 3 -4 0 1 1 2 -4 0 2 2 4 -4 0 4 3 4 +4 +0.2135848119563837 0.1168704340428168 0.9699086708284446 -0.09806074564261894 +0.08553875579270347 -0.8316435307282575 -0.5486822022403076 -0.1234144150397865 +-0.749541668500822 -0.02779445272382575 -0.6613733859014791 -0.2159556159595279 +0.3120013537900506 0.9498158823230658 -0.02247097950761911 -0.02453689035981485 +rbox y 1000 W0 | qconvex s QJ -Voronoi diagram by the convex hull of 5 points in 3-d: +Convex hull of 1004 points in 3-d: - Number of Voronoi regions: 5 - Number of 'good' Voronoi vertices: 4 + Number of vertices: 51 + Number of facets: 98 -Statistics for: rbox P0 c D2 | qvoronoi s Fv QV0 +Statistics for: rbox y 1000 W0 | qconvex s QJ - Number of points processed: 5 - Number of hyperplanes created: 7 - Number of facets in hull: 5 - Number of distance tests for qhull: 8 - Number of distance tests for merging: 29 - Number of distance tests for checking: 30 - Number of merged facets: 1 + Number of points processed: 52 + Number of hyperplanes created: 180 + Number of distance tests for qhull: 6420 CPU seconds to compute hull (after input): 0 + Input joggled by: 2.1e-11 -qdelaunay - +rbox d G1 D12 | qconvex QR0 FA -qdelaunay- compute the Delaunay triangulation - http://www.qhull.org 2015.2 2016/01/18 +Convex hull of 24 points in 12-d: -input (stdin): - first lines: dimension and number of points (or vice-versa). - other lines: point coordinates, best if one point per line - comments: start with a non-numeric character + Number of vertices: 24 + Number of facets: 4096 -options: - Qu - compute furthest-site Delaunay triangulation - Qt - triangulated output - QJ - joggled input instead of merged facets +Statistics for: rbox d G1 D12 | qconvex QR0 FA QR1595644039 -Qhull control options: - QJn - randomly joggle input in range [-n,n] - Qs - search all points for the initial simplex - Qz - add point-at-infinity to Delaunay triangulation - QGn - print Delaunay region if visible from point n, -n if not - QVn - print Delaunay regions that include point n, -n if not + Number of points processed: 24 + Number of hyperplanes created: 4107 + Number of distance tests for qhull: 4215 + Number of distance tests for merging: 121142 + Number of distance tests for checking: 98304 + Number of merged facets: 2036 + CPU seconds to compute hull (after input): 0.024 + Approximate facet area: 0.00035546337 + Approximate volume: 8.5511197e-06 -Trace options: - T4 - trace at level n, 4=all, 5=mem/gauss, -1= events - Tc - check frequently during execution - Ts - print statistics - Tv - verify result: structure, convexity, and in-circle test - Tz - send all output to stdout - TFn - report summary when n or more facets created - TI file - input data from file, no spaces or single quotes - TO file - output results to file, may be enclosed in single quotes - TPn - turn on tracing when point n added to hull - TMn - turn on tracing at merge n - TWn - trace merge facets when width > n - TVn - stop qhull after adding point n, -n for before (see TCn) - TCn - stop qhull after building cone for point n (see TVn) +rbox c D6 | qconvex s FA TF500 -Precision options: - Cn - radius of centrum (roundoff added). Merge facets if non-convex - An - cosine of maximum angle. Merge facets if cosine > n or non-convex - C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge - Rn - randomly perturb computations by a factor of [1-n,1+n] - Wn - min facet width for outside point (before roundoff) +At 22:27:19 & 0.003 CPU secs, qhull has created 543 facets and merged 289. + The current hull contains 91 facets and 23 vertices. There are 41 + outside points. Next is point p27(v24), 0.64 above f107. -Output formats (may be combined; if none, produces a summary to stdout): - f - facet dump - G - Geomview output (see below) - i - vertices incident to each Delaunay region - m - Mathematica output (2-d only, lifted to a paraboloid) - o - OFF format (dim, points, and facets as a paraboloid) - p - point coordinates (lifted to a paraboloid) - s - summary (stderr) +At 22:27:19 & 0.004 CPU secs, qhull has created 1061 facets and merged 737. + The current hull contains 69 facets and 33 vertices. There are 31 + outside points. Next is point p22(v34), 0.52 above f610. -More formats: - Fa - area for each Delaunay region - FA - compute total area for option 's' - Fc - count plus coincident points for each Delaunay region - Fd - use cdd format for input (homogeneous with offset first) - FD - use cdd format for numeric output (offset first) - FF - facet dump without ridges - FI - ID of each Delaunay region - Fm - merge count for each Delaunay region (511 max) - FM - Maple output (2-d only, lifted to a paraboloid) - Fn - count plus neighboring region for each Delaunay region - FN - count plus neighboring region for each point - FO - options and precision constants - FP - nearest point and distance for each coincident point - FQ - command used for qdelaunay - Fs - summary: #int (8), dimension, #points, tot vertices, tot facets, - for output: #vertices, #Delaunay regions, - #coincident points, #non-simplicial regions - #real (2), max outer plane, min vertex - FS - sizes: #int (0) - #real (2), tot area, 0 - Fv - count plus vertices for each Delaunay region - Fx - extreme points of Delaunay triangulation (on convex hull) +At 22:27:19 & 0.006 CPU secs, qhull has created 1567 facets and merged 1216. + The current hull contains 37 facets and 48 vertices. There are 16 + outside points. Next is point p9(v49), 0.45 above f1061. -Geomview options (2-d and 3-d) - Ga - all points as dots - Gp - coplanar points and vertices as radii - Gv - vertices as spheres - Gi - inner planes only - Gn - no planes - Go - outer planes only - Gc - centrums - Gh - hyperplane intersections - Gr - ridges - GDn - drop dimension n in 3-d and 4-d output - Gt - transparent outer ridges to view 3-d Delaunay +At 22:27:19 & 0.006 CPU secs, qhull has created 1819 facets and merged 1462. + The current hull contains 12 facets and 64 vertices. Last point was p11 -Print options: - PAn - keep n largest Delaunay regions by area - Pdk:n - drop facet if normal[k] <= n (default 0.0) - PDk:n - drop facet if normal[k] >= n - Pg - print good Delaunay regions (needs 'QGn' or 'QVn') - PFn - keep Delaunay regions whose area is at least n - PG - print neighbors of good regions (needs 'QGn' or 'QVn') - PMn - keep n Delaunay regions with most merges - Po - force output. If error, output neighborhood of facet - Pp - do not report precision problems +Convex hull of 64 points in 6-d: - . - list of all options - - - one line descriptions of all options - -V - version -qdelaunay . + Number of vertices: 64 + Number of facets: 12 + Number of non-simplicial facets: 12 -Qhull 2015.2 2016/01/18. -Except for 'F.' and 'PG', upper-case options take an argument. +Statistics for: rbox c D6 | qconvex s FA TF500 - incidences mathematica OFF_format points_lifted summary - facet_dump + Number of points processed: 64 + Number of hyperplanes created: 358 + Number of distance tests for qhull: 2515 + Number of distance tests for merging: 14300 + Number of distance tests for checking: 0 + Number of merged facets: 1462 - Farea FArea_total Fcoincident Fd_cdd_in FD_cdd_out - FF_dump_xridge FIDs Fmerges Fneighbors FNeigh_vertex - FOptions FPoint_near FQdelaun Fsummary FSize - Fvertices Fxtremes FMaple - Gvertices Gpoints Gall_points Gno_planes Ginner - Gcentrums Ghyperplanes Gridges Gouter GDrop_dim - Gtransparent +First post-merge with 'C3.5e-15' and 'A1.8e+308' - PArea_keep Pdrop d0:0D0 Pgood PFacet_area_keep - PGood_neighbors PMerge_keep Poutput_forced Pprecision_not +At 22:27:19 & 0.006 CPU secs, qhull has created 1819 facets and merged 1462. + The current hull contains 12 facets and 64 vertices. Last point was p11 - QGood_point QJoggle Qsearch_1st Qtriangulate QupperDelaunay - QVertex_good Qzinfinite +Testing all coplanar points. +computing area of each facet and volume of the convex hull - T4_trace Tcheck_often Tstatistics Tverify Tz_stdout - TFacet_log TInput_file TPoint_trace TMerge_trace TOutput_file - TWide_trace TVertex_stop TCone_stop +Convex hull of 64 points in 6-d: - Angle_max Centrum_size Random_dist Wide_outside -qdelaunay + Number of vertices: 64 + Number of facets: 12 + Number of non-simplicial facets: 12 -qdelaunay- compute the Delaunay triangulation. Qhull 2015.2 2016/01/18 - input (stdin): dimension, number of points, point coordinates - comments start with a non-numeric character +Statistics for: rbox c D6 | qconvex s FA TF500 -options (qdelaun.htm): - Qu - furthest-site Delaunay triangulation - Qt - triangulated output - QJ - joggled input instead of merged facets - Tv - verify result: structure, convexity, and in-circle test - . - concise list of all options - - - one-line description of all options - -V - version + Number of points processed: 64 + Number of hyperplanes created: 358 + Number of distance tests for qhull: 2515 + Number of distance tests for merging: 14420 + Number of distance tests for checking: 768 + Number of merged facets: 1462 + CPU seconds to compute hull (after input): 0.006 + Approximate facet area: 12 + Approximate volume: 1 -output options (subset): - s - summary of results (default) - i - vertices incident to each Delaunay region - Fx - extreme points (vertices of the convex hull) - o - OFF format (shows the points lifted to a paraboloid) - G - Geomview output (2-d and 3-d points lifted to a paraboloid) - m - Mathematica output (2-d inputs lifted to a paraboloid) - QVn - print Delaunay regions that include point n, -n if not - TO file- output results to file, may be enclosed in single quotes +rbox c D7 | qconvex s FA TF1000 -examples: - rbox c P0 D2 | qdelaunay s o rbox c P0 D2 | qdelaunay i - rbox c P0 D2 | qdelaunay Fv rbox c P0 D2 | qdelaunay s Qu Fv - rbox c G1 d D2 | qdelaunay s i rbox c G1 d D2 | qdelaunay Qt - rbox M3,4 z 100 D2 | qdelaunay s rbox M3,4 z 100 D2 | qdelaunay s Qt +At 22:27:19 & 0.003 CPU secs, qhull has created 1048 facets and merged 469. + The current hull contains 230 facets and 24 vertices. There are 104 + outside points. Next is point p79(v25), 0.66 above f145. + +At 22:27:19 & 0.005 CPU secs, qhull has created 2146 facets and merged 1272. + The current hull contains 273 facets and 31 vertices. There are 97 + outside points. Next is point p120(v32), 0.54 above f437. + +At 22:27:19 & 0.008 CPU secs, qhull has created 3310 facets and merged 2244. + The current hull contains 243 facets and 36 vertices. There are 92 + outside points. Next is point p60(v37), 0.54 above f1338. + +At 22:27:19 & 0.01 CPU secs, qhull has created 4322 facets and merged 3099. + The current hull contains 249 facets and 42 vertices. There are 86 + outside points. Next is point p30(v43), 0.54 above f2005. + +At 22:27:19 & 0.013 CPU secs, qhull has created 5491 facets and merged 4196. + The current hull contains 186 facets and 48 vertices. There are 80 + outside points. Next is point p21(v49), 0.5 above f2995. + +At 22:27:19 & 0.015 CPU secs, qhull has created 6589 facets and merged 5175. + The current hull contains 194 facets and 53 vertices. There are 75 + outside points. Next is point p56(v54), 0.28 above f3731. + +At 22:27:19 & 0.018 CPU secs, qhull has created 7867 facets and merged 6337. + The current hull contains 203 facets and 60 vertices. There are 68 + outside points. Next is point p76(v61), 0.29 above f5879. + +At 22:27:19 & 0.021 CPU secs, qhull has created 8971 facets and merged 7362. + The current hull contains 179 facets and 67 vertices. There are 61 + outside points. Next is point p80(v68), 0.23 above f7175. + +At 22:27:19 & 0.024 CPU secs, qhull has created 9984 facets and merged 8352. + The current hull contains 104 facets and 77 vertices. There are 51 + outside points. Next is point p96(v78), 0.41 above f6748. + +At 22:27:19 & 0.028 CPU secs, qhull has created 10990 facets and merged 9326. + The current hull contains 54 facets and 90 vertices. There are 38 + outside points. Next is point p18(v91), 0.41 above f10178. + +At 22:27:19 & 0.03 CPU secs, qhull has created 11996 facets and merged 10295. + The current hull contains 34 facets and 114 vertices. There are 14 + outside points. Next is point p19(v115), 0.38 above f11792. -rbox c P0 D2 | qdelaunay s o -3 -5 4 6 - 0 0 0 - -0.5 -0.5 1 - -0.5 0.5 1 - 0.5 -0.5 1 - 0.5 0.5 1 -3 3 0 1 -3 0 2 1 -3 4 0 3 -3 0 4 2 +At 22:27:19 & 0.032 CPU secs, qhull has created 12860 facets and merged 11072. + The current hull contains 14 facets and 128 vertices. Last point was p77 -Delaunay triangulation by the convex hull of 5 points in 3-d: +Convex hull of 128 points in 7-d: - Number of input sites: 5 - Number of Delaunay regions: 4 + Number of vertices: 128 + Number of facets: 14 + Number of non-simplicial facets: 14 -Statistics for: rbox c P0 D2 | qdelaunay s o +Statistics for: rbox c D7 | qconvex s FA TF1000 - Number of points processed: 5 - Number of hyperplanes created: 7 - Number of facets in hull: 5 - Number of distance tests for qhull: 8 - Number of distance tests for merging: 29 - Number of distance tests for checking: 30 - Number of merged facets: 1 - CPU seconds to compute hull (after input): 0 + Number of points processed: 128 + Number of hyperplanes created: 1789 + Number of distance tests for qhull: 10122 + Number of distance tests for merging: 87203 + Number of distance tests for checking: 0 + Number of merged facets: 11072 -rbox c P0 D2 | qdelaunay i -4 -3 0 1 -0 2 1 -4 0 3 -0 4 2 -rbox c P0 D2 | qdelaunay Fv -4 -3 0 3 1 -3 0 2 1 -3 4 0 3 -3 4 0 2 -rbox c P0 D2 | qdelaunay s Qu Qt Fv -2 -3 4 2 1 -3 4 3 1 -Furthest-site Delaunay triangulation by the convex hull of 5 points in 3-d: +First post-merge with 'C4.4e-15' and 'A1.8e+308' - Number of input sites: 5 - Number of Delaunay regions: 2 - Number of triangulated facets: 1 +At 22:27:19 & 0.033 CPU secs, qhull has created 12860 facets and merged 11072. + The current hull contains 14 facets and 128 vertices. Last point was p77 -Statistics for: rbox c P0 D2 | qdelaunay s Qu Qt Fv +Testing all coplanar points. +computing area of each facet and volume of the convex hull - Number of points processed: 5 - Number of hyperplanes created: 7 - Number of facets in hull: 6 - Number of distance tests for qhull: 8 - Number of distance tests for merging: 33 - Number of distance tests for checking: 30 - Number of merged facets: 1 - CPU seconds to compute hull (after input): 0 +Convex hull of 128 points in 7-d: -rbox c G1 d D2 | qdelaunay s i -9 -2 4 0 -6 1 0 -4 6 0 -5 3 1 -6 5 1 -3 7 2 -7 4 2 -5 7 3 -4 7 5 6 + Number of vertices: 128 + Number of facets: 14 + Number of non-simplicial facets: 14 -Delaunay triangulation by the convex hull of 8 points in 3-d: +Statistics for: rbox c D7 | qconvex s FA TF1000 - Number of input sites: 8 - Number of Delaunay regions: 9 - Number of non-simplicial Delaunay regions: 1 + Number of points processed: 128 + Number of hyperplanes created: 1789 + Number of distance tests for qhull: 10122 + Number of distance tests for merging: 87371 + Number of distance tests for checking: 1792 + Number of merged facets: 11072 + CPU seconds to compute hull (after input): 0.033 + Approximate facet area: 14 + Approximate volume: 1 -Statistics for: rbox c G1 d D2 | qdelaunay s i +rbox d G1 D12 | qconvex QR0 FA Pp - Number of points processed: 8 - Number of hyperplanes created: 17 - Number of facets in hull: 10 - Number of distance tests for qhull: 42 - Number of distance tests for merging: 103 - Number of distance tests for checking: 80 - Number of merged facets: 3 - CPU seconds to compute hull (after input): 0 +Convex hull of 24 points in 12-d: -rbox c G1 d D2 | qhull d Qbb Ft + Number of vertices: 24 + Number of facets: 4096 + +Statistics for: rbox d G1 D12 | qconvex QR0 FA Pp QR1595644039 + + Number of points processed: 24 + Number of hyperplanes created: 4107 + Number of distance tests for qhull: 4215 + Number of distance tests for merging: 121142 + Number of distance tests for checking: 98304 + Number of merged facets: 2036 + CPU seconds to compute hull (after input): 0.022 + Approximate facet area: 0.00035546337 + Approximate volume: 8.5511197e-06 + +rbox c P0 d D2 | qconvex p Fa Fc FP FI Fn FN FS Fv Fx 2 -9 12 14 - -1 -1 - -1 1 - 1 -1 - 1 1 +8 + -0.5 -0.5 + -0.5 0.5 + 0.5 -0.5 + 0.5 0.5 0 -0.5 0 0.5 -0.5 0 0.5 0 - 0 0 -3 2 4 0 -3 6 1 0 -3 4 6 0 -3 5 3 1 -3 6 5 1 -3 3 7 2 -3 7 4 2 -3 5 7 3 -3 8 5 6 -3 8 6 4 -3 8 4 7 -3 8 7 5 -rbox c G1 d D2 | qhull d Qbb QJ s Ft -2 -8 10 15 --1.000000000061343 -0.999999999957446 --0.9999999999945448 0.9999999999532114 -1.000000000029778 -0.9999999999701502 -0.9999999999806051 1.000000000003233 --7.748592400792811e-011 -0.5000000000743411 -2.849349704487493e-011 0.49999999991804 --0.5000000000721135 -1.37371989142159e-011 -0.5000000000148132 7.166044474310069e-011 -3 1 5 3 -3 2 4 0 -3 7 4 2 -3 4 7 5 -3 3 7 2 -3 5 7 3 -3 1 6 5 -3 6 4 5 -3 6 1 0 -3 4 6 0 - -Delaunay triangulation by the convex hull of 8 points in 3-d: - - Number of input sites: 8 - Number of Delaunay regions: 10 - -Statistics for: rbox c G1 d D2 | qhull d Qbb QJ s Ft - - Number of points processed: 8 - Number of hyperplanes created: 20 - Number of facets in hull: 12 - Number of distance tests for qhull: 32 - CPU seconds to compute hull (after input): 0 - Input joggled by: 8.3e-011 - -rbox M3,4 z 100 D2 | qdelaunay s - -Delaunay triangulation by the convex hull of 100 points in 3-d: - - Number of input sites: 100 - Number of Delaunay regions: 81 - Number of non-simplicial Delaunay regions: 81 - -Statistics for: rbox M3,4 z 100 D2 | qdelaunay s - - Number of points processed: 100 - Number of hyperplanes created: 262 - Number of facets in hull: 86 - Number of distance tests for qhull: 1652 - Number of distance tests for merging: 2778 - Number of distance tests for checking: 1348 - Number of merged facets: 152 - CPU seconds to compute hull (after input): 0 - -rbox c P-0.1 P+0.1 P+0.1 D2 | qdelaunay s Fx Fa Fc FP FQ Fn FN 4 + 1 + 1 + 1 + 1 4 -3 -6 -5 +1 5 +1 7 +1 8 +1 6 4 - 0.2 - 0.2 - 0.3 - 0.3 +3 5 1 0.5 +2 7 2 0.5 +4 8 4 0.5 +4 6 5 0.5 +4 +1 +2 +4 +5 4 +2 1 2 +2 0 3 +2 0 3 +2 1 2 +9 0 +2 0 1 +2 1 3 +2 2 0 +2 3 2 +1 0 +1 3 1 1 +1 2 0 -0 +2 4 1 +4 +2 3 1 +2 2 1 +2 4 3 +2 4 2 +4 1 -2 1 8 0 -rbox c P-0.1 P+0.1 P+0.1 D2 | qdelaunay s Fx Fa Fc FP FQ Fn FN +3 4 -3 -1 2 3 -3 -1 2 3 -4 -1 0 1 3 -4 0 -1 2 1 -7 -3 3 2 0 -1 1 -3 3 1 2 -3 0 -1 2 -3 3 -1 0 -3 1 -1 2 -3 1 -1 3 +2 +rbox c d D2 | qconvex s i QV0 -Delaunay triangulation by the convex hull of 7 points in 3-d: +Convex hull of 8 points in 2-d: - Number of input sites: 6 - Number of nearly incident points: 1 - Number of Delaunay regions: 4 - Number of non-simplicial Delaunay regions: 2 + Number of vertices: 4 + Number of facets: 4 + Number of 'good' facets: 2 -Statistics for: rbox c P-0.1 P+0.1 P+0.1 D2 | qdelaunay s Fx Fa Fc FP FQ Fn FN +Statistics for: rbox c d D2 | qconvex s i QV0 - Number of points processed: 6 - Number of hyperplanes created: 8 - Number of facets in hull: 5 - Number of distance tests for qhull: 33 - Number of distance tests for merging: 49 - Number of distance tests for checking: 42 - Number of merged facets: 3 + Number of points processed: 4 + Number of hyperplanes created: 6 + Number of distance tests for qhull: 35 CPU seconds to compute hull (after input): 0 - Approximate facet area: 1 - -rbox P0 P0 c D2 | qdelaunay s FP QV0 -1 -0 1 2 0 - -Delaunay triangulation by the convex hull of 6 points in 3-d: - Number of input sites: 5 - Number of nearly incident points: 1 - Number of 'good' Delaunay regions: 4 - -Statistics for: rbox P0 P0 c D2 | qdelaunay s FP QV0 - - Number of points processed: 5 - Number of hyperplanes created: 7 - Number of facets in hull: 5 - Number of distance tests for qhull: 20 - Number of distance tests for merging: 29 - Number of distance tests for checking: 36 - Number of merged facets: 1 - CPU seconds to compute hull (after input): 0 +2 +0 2 +1 0 +rbox c | qconvex Q0 +QH6029 qhull option error: option 'Q0' is not used with this program. + It may be used with qhull. -qhalf - +While executing: | qconvex Q0 +Options selected for Qhull 2020.2 2020/07/24: + run-id 213579737 _maxoutside 0 +qvoronoi - -qhalf- compute the intersection of halfspaces about a point - http://www.qhull.org 2015.2 2016/01/18 +qvoronoi -- compute the Voronoi diagram + http://www.qhull.org 2020.2 2020/07/24 input (stdin): - optional interior point: dimension, 1, coordinates - first lines: dimension+1 and number of halfspaces - other lines: halfspace coefficients followed by offset + first lines: dimension and number of points (or vice-versa). + other lines: point coordinates, best if one point per line comments: start with a non-numeric character options: - Hn,n - specify coordinates of interior point - Qt - triangulated output - QJ - joggled input instead of merged facets - Qc - keep coplanar halfspaces - Qi - keep other redundant halfspaces + Qu - compute furthest-site Voronoi diagram Qhull control options: - QJn - randomly joggle input in range [-n,n] - Qbk:0Bk:0 - remove k-th coordinate from input - Qs - search all halfspaces for the initial simplex - QGn - print intersection if visible to halfspace n, -n for not - QVn - print intersections for halfspace n, -n if not + Qa - allow input with fewer or more points than coordinates + QRn - random rotation (n=seed, n=0 time, n=-1 time/no rotate) + Qs - search all points for the initial simplex + Qz - add point-at-infinity to Voronoi diagram + +Qhull extra options: + QGn - Voronoi vertices if visible from point n, -n if not + QVn - Voronoi vertices for input point n, -n if not + Qw - allow option warnings + Q12 - allow wide facets and wide dupridge + Q14 - merge pinched vertices that create a dupridge + +T options: + TFn - report summary when n or more facets created + TI file - input file, may be enclosed in single quotes + TO file - output file, may be enclosed in single quotes + Ts - statistics + Tv - verify result: structure, convexity, and in-circle test + Tz - send all output to stdout Trace options: T4 - trace at level n, 4=all, 5=mem/gauss, -1= events + Ta - annotate output with message codes + TAn - stop qhull after adding n vertices + TCn - stop qhull after building cone for point n + TVn - stop qhull after adding point n, -n for before Tc - check frequently during execution - Ts - print statistics - Tv - verify result: structure, convexity, and redundancy - Tz - send all output to stdout - TFn - report summary when n or more facets created - TI file - input data from file, no spaces or single quotes - TO file - output results to file, may be enclosed in single quotes - TPn - turn on tracing when halfspace n added to intersection - TMn - turn on tracing at merge n - TWn - trace merge facets when width > n - TVn - stop qhull after adding halfspace n, -n for before (see TCn) - TCn - stop qhull after building cone for halfspace n (see TVn) + Tf - flush each qh_fprintf for debugging segfaults + TPn - turn on tracing when point n added to hull + TMn - turn on tracing at merge n + TWn - trace merge facets when width > n Precision options: Cn - radius of centrum (roundoff added). Merge facets if non-convex An - cosine of maximum angle. Merge facets if cosine > n or non-convex C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge Rn - randomly perturb computations by a factor of [1-n,1+n] - Un - max distance below plane for a new, coplanar halfspace - Wn - min facet width for outside halfspace (before roundoff) + Wn - min facet width for non-coincident point (before roundoff) -Output formats (may be combined; if none, produces a summary to stdout): +Output formats (may be combined; if none, summary to stdout): + p - Voronoi vertices + s - summary to stderr f - facet dump - G - Geomview output (dual convex hull) - i - non-redundant halfspaces incident to each intersection - m - Mathematica output (dual convex hull) - o - OFF format (dual convex hull: dimension, points, and facets) - p - vertex coordinates of dual convex hull (coplanars if 'Qc' or 'Qi') - s - summary (stderr) + i - Delaunay regions (use 'Pp' to avoid warning) + o - OFF format (dim, Voronoi vertices, and Voronoi regions) More formats: - Fc - count plus redundant halfspaces for each intersection - - Qc (default) for coplanar and Qi for other redundant + Fc - count plus coincident points (by Voronoi vertex) Fd - use cdd format for input (homogeneous with offset first) + FD - use cdd format for output (offset first) FF - facet dump without ridges - FI - ID of each intersection - Fm - merge count for each intersection (511 max) - FM - Maple output (dual convex hull) - Fn - count plus neighboring intersections for each intersection - FN - count plus intersections for each non-redundant halfspace + Fi - separating hyperplanes for bounded Voronoi regions + FI - ID for each Voronoi vertex + Fm - merge count for each Voronoi vertex (511 max) + Fn - count plus neighboring Voronoi vertices for each Voronoi vertex + FN - count and Voronoi vertices for each Voronoi region + Fo - separating hyperplanes for unbounded Voronoi regions FO - options and precision constants - Fp - dim, count, and intersection coordinates - FP - nearest halfspace and distance for each redundant halfspace - FQ - command used for qhalf - Fs - summary: #int (8), dim, #halfspaces, #non-redundant, #intersections - for output: #non-redundant, #intersections, #coplanar - halfspaces, #non-simplicial intersections - #real (2), max outer plane, min vertex - Fv - count plus non-redundant halfspaces for each intersection - Fx - non-redundant halfspaces + FP - nearest point and distance for each coincident point + FQ - command used for qvoronoi + Fs - summary: #int (8), dimension, #points, tot vertices, tot facets, + for output: #Voronoi regions, #Voronoi vertices, + #coincident points, #non-simplicial regions + #real (2), max outer plane and min vertex + Fv - Voronoi diagram as Voronoi vertices between adjacent input sites + Fx - extreme points of Delaunay triangulation (on convex hull) + +Geomview output (2-d only) + Ga - all points as dots + Gp - coplanar points and vertices as radii + Gv - vertices as spheres + Gc - centrums + GDn - drop dimension n in 3-d and 4-d output + Gh - hyperplane intersections + Gi - inner planes only + Gn - no planes + Go - outer planes only + Gr - ridges + +Print options: + PAn - keep n largest Voronoi vertices by 'area' + Pdk:n - drop facet if normal[k] <= n (default 0.0) + PDk:n - drop facet if normal[k] >= n + PFn - keep Voronoi vertices whose 'area' is at least n + Pg - print good Voronoi vertices (needs 'QGn' or 'QVn') + PG - print neighbors of good Voronoi vertices + PMn - keep n Voronoi vertices with most merges + Po - force output. If error, output neighborhood of facet + Pp - do not report precision problems + + . - list of all options + - - one line descriptions of all options + -? - help with examples + -V - version +qvoronoi . + +Qhull 2020.2 2020/07/24 +Except for 'F.' and 'PG', upper-case options take an argument. + + facet-dump Geomview i-delaunay off-format p-vertices + summary + + Fcoincident Fd-cdd-in FD-cdd-out FF-dump-xridge Fi-bounded + FIDs Fmerges Fneighbors FNeigh-region Fo-unbounded + FOptions FPoint-near FQvoronoi Fsummary Fvoronoi + Fxtremes + + Gall-points Gcentrums GDrop-dim Ghyperplanes Ginner + Gno-planes Gouter Gpoints Gridges Gvertices + + PArea-keep Pdrop-d0:0D0 PFacet-area-keep Pgood PGood-neighbors + PMerge-keep Poutput-forced Pprecision-not + + Qallow-short QG-vertex-good QRotate Qsearch-all Qupper-voronoi + QV-point-good Qwarn-allow Qzinfinite Q12-allow-wide Q14-merge-pinched + + TFacet-log TInput-file TOutput-file Tstatistics Tverify + Tz-stdout + + T4-trace Tannotate TAdd-stop Tcheck-often TCone-stop + Tflush TMerge-trace TPoint-trace TVertex-stop TWide-trace + + Angle-max Centrum-size Random-dist Wide-outside +qvoronoi -? # [mar'19] isatty does not work for Git for Windows + +qvoronoi -- compute the Voronoi diagram. Qhull 2020.2 2020/07/24 + input (stdin): dimension, number of points, point coordinates + comments start with a non-numeric character + +options (qvoronoi.htm): + Qu - compute furthest-site Voronoi diagram + Tv - verify result: structure, convexity, and in-circle test + . - concise list of all options + - - one-line description of all options + -? - this message + -V - version + +output options (subset): + Fi - separating hyperplanes for bounded regions, 'Fo' for unbounded + FN - count and Voronoi vertices for each Voronoi region + Fv - Voronoi diagram as Voronoi vertices between adjacent input sites + G - Geomview output (2-d only) + o - OFF file format (dim, Voronoi vertices, and Voronoi regions) + p - Voronoi vertices + QVn - Voronoi vertices for input point n, -n if not + s - summary of results (default) + TI file - input file, may be enclosed in single quotes + TO file - output file, may be enclosed in single quotes + +examples: + rbox c P0 D2 | qvoronoi s o rbox c P0 D2 | qvoronoi Fi + rbox c P0 D2 | qvoronoi Fo rbox c P0 D2 | qvoronoi Fv + rbox c P0 D2 | qvoronoi s Qu Fv rbox c P0 D2 | qvoronoi Qu Fo + rbox c G1 d D2 | qvoronoi s p rbox c P0 D2 | qvoronoi s Fv QV0 + +rbox c P0 D2 | qvoronoi s o + +Voronoi diagram by the convex hull of 5 points in 3-d: + + Number of Voronoi regions: 5 + Number of Voronoi vertices: 4 + +Statistics for: rbox c P0 D2 | qvoronoi s o + + Number of points processed: 5 + Number of hyperplanes created: 6 + Number of facets in hull: 5 + Number of distance tests for qhull: 7 + Number of distance tests for merging: 34 + Number of distance tests for checking: 25 + Number of merged facets: 1 + CPU seconds to compute hull (after input): 0 + +2 +5 5 1 +-10.101 -10.101 + 0 -0.5 + -0.5 0 + 0.5 0 + 0 0.5 +4 4 2 1 3 +3 2 0 1 +3 4 0 2 +3 3 0 1 +3 4 0 3 +rbox c P0 D2 | qvoronoi Fi Tv +4 +5 0 3 0.7071067811865475 -0.7071067811865475 -0.3535533905932737 +5 0 1 -0.7071067811865475 -0.7071067811865475 -0.3535533905932737 +5 0 2 -0.7071067811865475 0.7071067811865475 -0.3535533905932737 +5 0 4 0.7071067811865475 0.7071067811865475 -0.3535533905932737 + +Voronoi ridge statistics + 4 bounded ridges + 0 max. distance of midpoint to ridge + 4 bounded ridges with ok normal +2.2e-16 ave. angle to ridge +2.2e-16 max. angle to ridge + +Output completed. Verifying that all points are below outer planes of +all facets. Will make 20 distance computations. +rbox c P0 D2 | qvoronoi Fo Tv +4 +5 1 2 -1 0 -0.5 +5 1 3 1 -0 -0 +5 2 4 1 -0 -0 +5 3 4 -1 0 0.5 + +Output completed. Verifying that all points are below outer planes of +all facets. Will make 20 distance computations. +rbox c P0 D2 | qvoronoi Fv +8 +4 0 3 1 3 +4 0 1 1 2 +4 0 2 2 4 +4 0 4 3 4 +4 1 2 0 2 +4 1 3 0 1 +4 2 4 0 4 +4 3 4 0 3 +rbox c P0 D2 | qvoronoi s Qu Fv + +Furthest-site Voronoi vertices by the convex hull of 5 points in 3-d: + + Number of Voronoi regions: 5 + Number of Voronoi vertices: 1 + Number of non-simplicial Voronoi vertices: 1 + +Statistics for: rbox c P0 D2 | qvoronoi s Qu Fv + + Number of points processed: 5 + Number of hyperplanes created: 6 + Number of facets in hull: 5 + Number of distance tests for qhull: 7 + Number of distance tests for merging: 34 + Number of distance tests for checking: 25 + Number of merged facets: 1 + CPU seconds to compute hull (after input): 0 + +4 +4 1 2 0 1 +4 1 3 0 1 +4 2 4 0 1 +4 3 4 0 1 +rbox c P0 D2 | qvoronoi s Qu Qt Fv + +Furthest-site Voronoi vertices by the convex hull of 5 points in 3-d: + + Number of Voronoi regions: 5 + Number of Voronoi vertices: 2 + Number of triangulated facets: 1 + +Statistics for: rbox c P0 D2 | qvoronoi s Qu Qt Fv + + Number of points processed: 5 + Number of hyperplanes created: 6 + Number of facets in hull: 6 + Number of distance tests for qhull: 7 + Number of distance tests for merging: 34 + Number of distance tests for checking: 25 + Number of merged facets: 1 + CPU seconds to compute hull (after input): 0 + +4 +4 1 3 0 2 +4 1 2 0 1 +4 2 4 0 1 +4 3 4 0 2 +rbox c P0 D2 | qvoronoi Qu Fo +4 +5 1 2 -0 1 0 +5 1 3 1 -0 -0 +5 2 4 1 -0 -0 +5 3 4 -0 1 -0 +rbox c G1 d D2 | qvoronoi s p + +Voronoi diagram by the convex hull of 8 points in 3-d: + + Number of Voronoi regions: 8 + Number of Voronoi vertices: 9 + Number of non-simplicial Voronoi vertices: 1 + +Statistics for: rbox c G1 d D2 | qvoronoi s p + + Number of points processed: 8 + Number of hyperplanes created: 16 + Number of facets in hull: 10 + Number of distance tests for qhull: 41 + Number of distance tests for merging: 108 + Number of distance tests for checking: 72 + Number of merged facets: 3 + CPU seconds to compute hull (after input): 0 + +2 +9 + 0 -1.75 + -1.75 0 +-0.5833333333333334 -0.5833333333333333 + 0 1.75 +-0.5833333333333333 0.5833333333333334 + 1.75 0 +0.5833333333333334 -0.5833333333333333 +0.5833333333333334 0.5833333333333333 + 0 0 +rbox c G1 d D2 | qvoronoi QJ p +2 +10 +-2.57276422388486e-11 1.749999999802917 +-2.05463598231932e-11 -1.750000000331276 +0.5833333333083517 -0.5833333333052267 +1.862254794815499e-11 -7.815052443180038e-11 +1.750000000002628 3.498100747664324e-11 +0.5833333333132078 0.5833333333796981 +-0.5833333332888888 0.5833333333317835 +-7.592293460589872e-11 -7.815050692933323e-11 +-1.750000000049026 2.293196879294717e-11 +-0.5833333333977307 -0.5833333333229861 +rbox c P-0.1 P+0.1 P+0.1 D2 | qvoronoi s Fc FP FQ Fn FN + +Voronoi diagram by the convex hull of 7 points in 3-d: + + Number of Voronoi regions: 6 + Number of nearly incident points: 1 + Number of Voronoi vertices: 4 + Number of non-simplicial Voronoi vertices: 2 + +Statistics for: rbox c P-0.1 P+0.1 P+0.1 D2 | qvoronoi s Fc FP FQ Fn FN + + Number of points processed: 6 + Number of hyperplanes created: 7 + Number of facets in hull: 5 + Number of distance tests for qhull: 31 + Number of distance tests for merging: 54 + Number of distance tests for checking: 36 + Number of merged facets: 3 + CPU seconds to compute hull (after input): 0 + +4 +0 +1 1 +0 +0 +1 +2 1 8 0 +rbox c P-0.1 P+0.1 P+0.1 D2 | qvoronoi s Fc FP FQ Fn FN +4 +3 -1 2 3 +3 -1 2 3 +4 -1 0 3 1 +4 0 -1 2 1 +7 +3 3 2 0 +1 1 +3 3 1 2 +3 0 -1 2 +3 3 -1 0 +3 1 -1 2 +3 1 -1 3 +rbox P0 c D2 | qvoronoi s Fv QV0 + +Voronoi diagram by the convex hull of 5 points in 3-d: + + Number of Voronoi regions: 5 + Number of 'good' Voronoi vertices: 4 + +Statistics for: rbox P0 c D2 | qvoronoi s Fv QV0 + + Number of points processed: 5 + Number of hyperplanes created: 6 + Number of facets in hull: 5 + Number of distance tests for qhull: 7 + Number of distance tests for merging: 34 + Number of distance tests for checking: 25 + Number of merged facets: 1 + CPU seconds to compute hull (after input): 0 + +4 +4 0 3 1 3 +4 0 1 1 2 +4 0 2 2 4 +4 0 4 3 4 +qdelaunay - + +qdelaunay -- compute the Delaunay triangulation + http://www.qhull.org 2020.2 2020/07/24 + +input (stdin): + first lines: dimension and number of points (or vice-versa). + other lines: point coordinates, best if one point per line + comments: start with a non-numeric character + +options: + QJ - joggled input instead of merged facets + Qt - triangulated output + Qu - compute furthest-site Delaunay triangulation + +Qhull control options: + Qa - allow input with fewer or more points than coordinates + QJn - randomly joggle input in range [-n,n] + QRn - random rotation (n=seed, n=0 time, n=-1 time/no rotate) + Qs - search all points for the initial simplex + Qz - add point-at-infinity to Delaunay triangulation + +Qhull extra options: + QGn - print Delaunay region if visible from point n, -n if not + QVn - print Delaunay regions that include point n, -n if not + Qw - allow option warnings + Q12 - allow wide facets and wide dupridge + Q14 - merge pinched vertices that create a dupridge + +T options: + TFn - report summary when n or more facets created + TI file - input file, may be enclosed in single quotes + TO file - output file, may be enclosed in single quotes + Ts - statistics + Tv - verify result: structure, convexity, and in-circle test + Tz - send all output to stdout + +Trace options: + T4 - trace at level n, 4=all, 5=mem/gauss, -1= events + Ta - annotate output with message codes + TAn - stop qhull after adding n vertices + TCn - stop qhull after building cone for point n + TVn - stop qhull after adding point n, -n for before + Tc - check frequently during execution + Tf - flush each qh_fprintf for debugging segfaults + TPn - turn on tracing when point n added to hull + TMn - turn on tracing at merge n + TWn - trace merge facets when width > n + +Precision options: + Cn - radius of centrum (roundoff added). Merge facets if non-convex + An - cosine of maximum angle. Merge facets if cosine > n or non-convex + C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge + Rn - randomly perturb computations by a factor of [1-n,1+n] + Wn - min facet width for outside point (before roundoff) + +Output formats (may be combined; if none, produces a summary to stdout): + f - facet dump + G - Geomview output (see below) + i - vertices incident to each Delaunay region + m - Mathematica output (2-d only, lifted to a paraboloid) + o - OFF format (dim, points, and facets as a paraboloid) + p - point coordinates (lifted to a paraboloid) + s - summary (stderr) + +More formats: + Fa - area for each Delaunay region + FA - compute total area for option 's' + Fc - count plus coincident points for each Delaunay region + Fd - use cdd format for input (homogeneous with offset first) + FD - use cdd format for numeric output (offset first) + FF - facet dump without ridges + FI - ID of each Delaunay region + Fm - merge count for each Delaunay region (511 max) + FM - Maple output (2-d only, lifted to a paraboloid) + Fn - count plus neighboring region for each Delaunay region + FN - count plus neighboring region for each point + FO - options and precision constants + FP - nearest point and distance for each coincident point + FQ - command used for qdelaunay + Fs - summary: #int (8), dimension, #points, tot vertices, tot facets, + output: #vertices, #Delaunay regions, + #coincident points, #non-simplicial regions + #real (2), max outer plane, min vertex + FS - sizes: #int (0) + #real (2), tot area, 0 + Fv - count plus vertices for each Delaunay region + Fx - extreme points of Delaunay triangulation (on convex hull) + +Geomview output (2-d and 3-d points lifted to a paraboloid) + Ga - all points as dots + Gp - coplanar points and vertices as radii + Gv - vertices as spheres + Gc - centrums + GDn - drop dimension n in 3-d and 4-d output + Gh - hyperplane intersections + Gi - inner planes only + Gn - no planes + Go - outer planes only + Gr - ridges + Gt - transparent outer ridges to view 3-d Delaunay + +Print options: + PAn - keep n largest Delaunay regions by area + Pdk:n - drop facet if normal[k] <= n (default 0.0) + PDk:n - drop facet if normal[k] >= n + PFn - keep Delaunay regions whose area is at least n + Pg - print good Delaunay regions (needs 'QGn' or 'QVn') + PG - print neighbors of good regions (needs 'QGn' or 'QVn') + PMn - keep n Delaunay regions with most merges + Po - force output. If error, output neighborhood of facet + Pp - do not report precision problems + + . - list of all options + - - one line descriptions of all options + -? - help with examples + -V - version +qdelaunay . + +Qhull 2020.2 2020/07/24 +Except for 'F.' and 'PG', upper-case options take an argument. + + facet-dump Geomview incidences mathematica off-format + points-lifted summary + + Farea FArea-total Fcoincident Fd-cdd-in FD-cdd-out + FF-dump-xridge FIDs Fmerges FMaple Fneighbors + FNeigh-vertex FOptions FPoint-near FQdelaun Fsummary + FSize Fvertices Fxtremes + + Gall-points Gcentrums GDrop-dim Ghyperplanes Ginner + Gno-planes Gouter Gpoints Gridges Gtransparent + Gvertices + + PArea-keep Pdrop-d0:0D0 PFacet-area-keep Pgood PGood-neighbors + PMerge-keep Poutput-forced Pprecision-not + + Qallow-short QGood-point QJoggle Qrotate Qsearch-all + Qtriangulate QupperDelaunay QVertex-good Qwarn-allow Qzinfinite + Q12-allow-wide Q14-merge-pinched + + TFacet-log TInput-file TOutput-file Tstatistics Tverify + Tz-stdout + + T4-trace Tannotate TAdd-stop Tcheck-often TCone-stop + Tflush TMerge-trace TPoint-trace TVertex-stop TWide-trace + + Angle-max Centrum-size Random-dist Wide-outside +qdelaunay -? # [mar'19] isatty does not work for Git for Windows + +qdelaunay -- compute the Delaunay triangulation. Qhull 2020.2 2020/07/24 + input (stdin): dimension, number of points, point coordinates + comments start with a non-numeric character + +options (qdelaun.htm): + Qu - furthest-site Delaunay triangulation + Qt - triangulated output + QJ - joggled input instead of merged facets + Tv - verify result: structure, convexity, and in-circle test + . - concise list of all options + - - one-line description of each option + -? - this message + -V - version + +output options (subset): + s - summary of results (default) + i - vertices incident to each Delaunay region + Fx - extreme points (vertices of the convex hull) + G - Geomview output (2-d and 3-d points lifted to a paraboloid) + m - Mathematica output (2-d inputs lifted to a paraboloid) + o - OFF format (shows the points lifted to a paraboloid) + QVn - print Delaunay regions that include point n, -n if not + TI file - input file, may be enclosed in single quotes + TO file - output file, may be enclosed in single quotes + +examples: + rbox c P0 D2 | qdelaunay s o rbox c P0 D2 | qdelaunay i + rbox c P0 D2 | qdelaunay Fv rbox c P0 D2 | qdelaunay s Qu Fv + rbox c G1 d D2 | qdelaunay s i rbox c G1 d D2 | qdelaunay Qt + rbox M3,4 z 100 D2 | qdelaunay s rbox M3,4 z 100 D2 | qdelaunay s Qt + +rbox c P0 D2 | qdelaunay s o + +Delaunay triangulation by the convex hull of 5 points in 3-d: + + Number of input sites: 5 + Number of Delaunay regions: 4 + +Statistics for: rbox c P0 D2 | qdelaunay s o + + Number of points processed: 5 + Number of hyperplanes created: 6 + Number of facets in hull: 5 + Number of distance tests for qhull: 7 + Number of distance tests for merging: 34 + Number of distance tests for checking: 25 + Number of merged facets: 1 + CPU seconds to compute hull (after input): 0 + +3 +5 4 6 + 0 0 0 + -0.5 -0.5 0.5 + -0.5 0.5 0.5 + 0.5 -0.5 0.5 + 0.5 0.5 0.5 +3 3 0 1 +3 0 2 1 +3 4 0 3 +3 0 4 2 +rbox c P0 D2 | qdelaunay i +4 +3 0 1 +0 2 1 +4 0 3 +0 4 2 +rbox c P0 D2 | qdelaunay Fv +4 +3 0 3 1 +3 0 2 1 +3 4 0 3 +3 4 0 2 +rbox c P0 D2 | qdelaunay s Qu Qt Fv + +Furthest-site Delaunay triangulation by the convex hull of 5 points in 3-d: + + Number of input sites: 5 + Number of Delaunay regions: 2 + Number of triangulated facets: 1 + +Statistics for: rbox c P0 D2 | qdelaunay s Qu Qt Fv + + Number of points processed: 5 + Number of hyperplanes created: 6 + Number of facets in hull: 6 + Number of distance tests for qhull: 7 + Number of distance tests for merging: 34 + Number of distance tests for checking: 25 + Number of merged facets: 1 + CPU seconds to compute hull (after input): 0 + +2 +3 4 2 1 +3 4 3 1 +rbox c G1 d D2 | qdelaunay s i + +Delaunay triangulation by the convex hull of 8 points in 3-d: + + Number of input sites: 8 + Number of Delaunay regions: 9 + Number of non-simplicial Delaunay regions: 1 + +Statistics for: rbox c G1 d D2 | qdelaunay s i + + Number of points processed: 8 + Number of hyperplanes created: 16 + Number of facets in hull: 10 + Number of distance tests for qhull: 41 + Number of distance tests for merging: 108 + Number of distance tests for checking: 72 + Number of merged facets: 3 + CPU seconds to compute hull (after input): 0 + +9 +2 4 0 +6 1 0 +4 6 0 +5 3 1 +6 5 1 +3 7 2 +7 4 2 +5 7 3 +4 7 5 6 +rbox c G1 d D2 | qhull d Qbb Ft +2 +9 12 14 + -1 -1 + -1 1 + 1 -1 + 1 1 + 0 -0.5 + 0 0.5 + -0.5 0 + 0.5 0 + 0 0 +3 2 4 0 +3 6 1 0 +3 4 6 0 +3 5 3 1 +3 6 5 1 +3 3 7 2 +3 7 4 2 +3 5 7 3 +3 8 5 6 +3 8 6 4 +3 8 7 5 +3 8 4 7 +rbox c G1 d D2 | qhull d Qbb QJ s Ft + +Delaunay triangulation by the convex hull of 8 points in 3-d: + + Number of input sites: 8 + Number of Delaunay regions: 10 + +Statistics for: rbox c G1 d D2 | qhull d Qbb QJ s Ft + + Number of points processed: 8 + Number of hyperplanes created: 19 + Number of facets in hull: 12 + Number of distance tests for qhull: 31 + CPU seconds to compute hull (after input): 0 + Input joggled by: 8.3e-11 + +2 +8 10 15 +-1.000000000061343 -0.999999999957446 +-0.9999999999945448 0.9999999999532114 +1.000000000029778 -0.9999999999701502 +0.9999999999806051 1.000000000003233 +-7.748592400792811e-11 -0.5000000000743411 +2.849349704487493e-11 0.49999999991804 +-0.5000000000721135 -1.37371989142159e-11 +0.5000000000148132 7.166044474310069e-11 +3 1 5 3 +3 2 4 0 +3 7 4 2 +3 4 7 5 +3 3 7 2 +3 5 7 3 +3 1 6 5 +3 6 4 5 +3 6 1 0 +3 4 6 0 +rbox M3,4 z 100 D2 | qdelaunay s + +Delaunay triangulation by the convex hull of 100 points in 3-d: + + Number of input sites: 100 + Number of Delaunay regions: 81 + Number of non-simplicial Delaunay regions: 81 + +Statistics for: rbox M3,4 z 100 D2 | qdelaunay s + + Number of points processed: 100 + Number of hyperplanes created: 251 + Number of facets in hull: 86 + Number of distance tests for qhull: 1650 + Number of distance tests for merging: 2765 + Number of distance tests for checking: 1248 + Number of merged facets: 155 + CPU seconds to compute hull (after input): 0 + +rbox c P-0.1 P+0.1 P+0.1 D2 | qdelaunay s Fx Fa Fc FP FQ Fn FN + +Delaunay triangulation by the convex hull of 7 points in 3-d: + + Number of input sites: 6 + Number of nearly incident points: 1 + Number of Delaunay regions: 4 + Number of non-simplicial Delaunay regions: 2 + +Statistics for: rbox c P-0.1 P+0.1 P+0.1 D2 | qdelaunay s Fx Fa Fc FP FQ Fn FN + + Number of points processed: 6 + Number of hyperplanes created: 7 + Number of facets in hull: 5 + Number of distance tests for qhull: 31 + Number of distance tests for merging: 54 + Number of distance tests for checking: 35 + Number of merged facets: 3 + CPU seconds to compute hull (after input): 0 + Approximate facet area: 1 + +4 +4 +3 +6 +5 +4 + 0.2 + 0.2 + 0.3 + 0.3 +4 +0 +1 1 +0 +0 +1 +2 1 8 0 +rbox c P-0.1 P+0.1 P+0.1 D2 | qdelaunay s Fx Fa Fc FP FQ Fn FN +4 +3 -1 2 3 +3 -1 2 3 +4 -1 0 3 1 +4 0 -1 2 1 +7 +3 3 2 0 +1 1 +3 3 1 2 +3 0 -1 2 +3 3 -1 0 +3 1 -1 2 +3 1 -1 3 +rbox P0 P0 c D2 | qdelaunay s FP QV0 + +Delaunay triangulation by the convex hull of 6 points in 3-d: + + Number of input sites: 5 + Number of nearly incident points: 1 + Number of 'good' Delaunay regions: 4 + +Statistics for: rbox P0 P0 c D2 | qdelaunay s FP QV0 + + Number of points processed: 5 + Number of hyperplanes created: 6 + Number of facets in hull: 5 + Number of distance tests for qhull: 18 + Number of distance tests for merging: 34 + Number of distance tests for checking: 30 + Number of merged facets: 1 + CPU seconds to compute hull (after input): 0 + +1 +0 1 2 0 +qhalf - + +qhalf -- compute the intersection of halfspaces about a point + http://www.qhull.org 2020.2 2020/07/24 + +input (stdin): + optional interior point: dimension, 1, coordinates + first lines: dimension+1 and number of halfspaces + other lines: halfspace coefficients followed by offset + comments: start with a non-numeric character + +options: + Hn,n - specify coordinates of interior point + Qc - keep coplanar halfspaces + Qi - keep other redundant halfspaces + QJ - joggled input instead of merged facets + Qt - triangulated output + +Qhull control options: + Qa - allow input with fewer or more points than coordinates + Qbk:0Bk:0 - remove k-th coordinate from input + QJn - randomly joggle input in range [-n,n] + QRn - random rotation (n=seed, n=0 time, n=-1 time/no rotate) + Qs - search all halfspaces for the initial simplex + +Qhull extra options: + QGn - print intersection if visible to halfspace n, -n for not + QVn - print intersections for halfspace n, -n if not + Qw - allow option warnings + Q12 - allow wide facets and wide dupridge + Q14 - merge pinched vertices that create a dupridge + +T options: + TFn - report summary when n or more facets created + TI file - input file, may be enclosed in single quotes + TO file - output file, may be enclosed in single quotes + Ts - statistics + Tv - verify result: structure, convexity, and in-circle test + Tz - send all output to stdout + +Trace options: + T4 - trace at level n, 4=all, 5=mem/gauss, -1= events + Ta - annotate output with message codes + TAn - stop qhull after adding n vertices + TCn - stop qhull after building cone for point n + TVn - stop qhull after adding point n, -n for before + Tc - check frequently during execution + Tf - flush each qh_fprintf for debugging segfaults + TPn - turn on tracing when point n added to hull + TMn - turn on tracing at merge n + TWn - trace merge facets when width > n + +Precision options: + Cn - radius of centrum (roundoff added). Merge facets if non-convex + An - cosine of maximum angle. Merge facets if cosine > n or non-convex + C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge + Rn - randomly perturb computations by a factor of [1-n,1+n] + Un - max distance below plane for a new, coplanar halfspace + Wn - min facet width for outside halfspace (before roundoff) + +Output formats (may be combined; if none, produces a summary to stdout): + f - facet dump + G - Geomview output (dual convex hull) + i - non-redundant halfspaces incident to each intersection + m - Mathematica output (dual convex hull) + o - OFF format (dual convex hull: dimension, points, and facets) + p - vertex coordinates of dual convex hull (coplanars if 'Qc' or 'Qi') + s - summary (stderr) + +More formats: + Fc - count plus redundant halfspaces for each intersection + - Qc (default) for coplanar and Qi for other redundant + Fd - use cdd format for input (homogeneous with offset first) + FF - facet dump without ridges + FI - ID of each intersection + Fm - merge count for each intersection (511 max) + FM - Maple output (dual 2-d or 3-d convex hull) + Fn - count plus neighboring intersections for each intersection + FN - count plus intersections for each halfspace + FO - options and precision constants + Fp - dim, count, and intersection coordinates + FP - nearest halfspace and distance for each redundant halfspace + FQ - command used for qhalf + Fs - summary: #int (8), dim, #halfspaces, #non-redundant, #intersections + output: #non-redundant, #intersections, #coplanar + halfspaces, #non-simplicial intersections + #real (2), max outer plane, min vertex + Fv - count plus non-redundant halfspaces for each intersection + Fx - non-redundant halfspaces + +Geomview output (2-d, 3-d and 4-d; dual convex hull) + Ga - all points (i.e., transformed halfspaces) as dots + Gp - coplanar points and vertices as radii + Gv - vertices (i.e., non-redundant halfspaces) as spheres + Gc - centrums + GDn - drop dimension n in 3-d and 4-d output + Gh - hyperplane intersections + Gi - inner planes (i.e., halfspace intersections) only + Gn - no planes + Go - outer planes only + Gr - ridges + +Print options: + PAn - keep n largest facets (i.e., intersections) by area + Pdk:n- drop facet if normal[k] <= n (default 0.0) + PDk:n- drop facet if normal[k] >= n + PFn - keep facets whose area is at least n + Pg - print good facets (needs 'QGn' or 'QVn') + PG - print neighbors of good facets + PMn - keep n facets with most merges + Po - force output. If error, output neighborhood of facet + Pp - do not report precision problems + + . - list of all options + - - one line descriptions of all options + -? - help with examples + -V - version +qhalf . + +Qhull 2020.2 2020/07/24 +Except for 'F.' and 'PG', upper_case options take an argument. + + facet-dump Geomview H0,0-interior incidences mathematica + off-format point-dual summary + + Fc-redundant Fd-cdd-in FF-dump-xridge FIDs Fmerges + FMaple Fneighbors FN-intersect FOptions Fp-coordinates + FP-nearest FQhalf Fsummary Fv-halfspace Fx-non-redundant + + Gall-points Gcentrums GDrop-dim Ghyperplanes Ginner + Gno-planes Gouter Gpoints Gridges Gvertices + + PArea-keep Pdrop-d0:0D0 PFacet-area-keep Pgood PGood-neighbors + PMerge-keep Poutput-forced Pprecision-not + + Qallow-short Qbk:0Bk:0-drop Qcoplanar QG-half-good Qi-redundant + QJoggle QRotate Qsearch-all Qtriangulate QVertex-good + Qwarn-allow Q12-allow-wide Q14-merge-pinched + + TFacet-log TInput-file TOutput-file Tstatistics Tverify + Tz-stdout + + T4-trace Tannotate TAdd-stop Tcheck-often TCone-stop + Tflush TMerge-trace TPoint-trace TVertex-stop TWide-trace + + Angle-max Centrum-size Random-dist Ucoplanar-max Wide-outside +qhalf -? # [mar'19] isatty does not work for Git for Windows + +qhalf -- halfspace intersection about a point. Qhull 2020.2 2020/07/24 + input (stdin): [dimension, 1, interior point] + dimension+1, number of halfspaces, coefficients+offset + comments start with a non-numeric character + +options (qhalf.htm): + Hn,n - specify coordinates of interior point + Qt - triangulated output + QJ - joggled input instead of merged facets + Tv - verify result: structure, convexity, and redundancy + . - concise list of all options + - - one-line description of each option + -? - this message + -V - version + +output options (subset): + s - summary of results (default) + Fp - intersection coordinates + Fv - non-redundant halfspaces incident to each intersection + Fx - non-redundant halfspaces + G - Geomview output (dual convex hull) + m - Mathematica output (dual convex hull) + o - OFF file format (dual convex hull) + QVn - print intersections for halfspace n, -n if not + TI file - input file, may be enclosed in single quotes + TO file - output file, may be enclosed in single quotes + +examples: + rbox d | qconvex FQ n | qhalf s H0,0,0 Fp + rbox c | qconvex FQ FV n | qhalf s i + rbox c | qconvex FQ FV n | qhalf s o + +rbox d | qhull FQ n | qhalf s Qt H0,0,0 Fp + +Halfspace intersection by the convex hull of 8 points in 3-d: + + Number of halfspaces: 8 + Number of non-redundant halfspaces: 8 + Number of intersection points: 12 + Number of triangulated facets: 6 + +Statistics for: rbox d | qhull FQ n | qhalf s Qt H0,0,0 Fp + + Number of points processed: 8 + Number of hyperplanes created: 11 + Number of distance tests for qhull: 32 + Number of distance tests for merging: 101 + Number of distance tests for checking: 48 + Number of merged facets: 7 + CPU seconds to compute hull (after input): 0 + +3 +12 + 0 0 -0.5 + 0 0 -0.5 + 0 -0.5 0 + 0 -0.5 0 + -0.5 0 0 + -0.5 0 0 + 0.5 0 0 + 0.5 0 0 + 0 0.5 0 + 0 0.5 0 + 0 0 0.5 + 0 0 0.5 +rbox c | qhull FQ FV n | qhalf s i + +Halfspace intersection by the convex hull of 6 points in 3-d: + + Number of halfspaces: 6 + Number of non-redundant halfspaces: 6 + Number of intersection points: 8 + +Statistics for: rbox c | qhull FQ FV n | qhalf s i + + Number of points processed: 6 + Number of hyperplanes created: 11 + Number of distance tests for qhull: 10 + Number of distance tests for merging: 51 + Number of distance tests for checking: 48 + Number of merged facets: 1 + CPU seconds to compute hull (after input): 0 + +8 +1 0 3 +0 1 2 +5 1 3 +1 5 2 +4 0 2 +0 4 3 +5 4 2 +4 5 3 +rbox c | qhull FQ FV n | qhalf o +3 +6 8 12 + -0 -0 -2 + 0 -2 0 + 2 -0 -0 + -2 -0 -0 + 0 2 -0 + -0 -0 2 +3 1 0 3 +3 0 1 2 +3 5 1 3 +3 1 5 2 +3 4 0 2 +3 0 4 3 +3 5 4 2 +3 4 5 3 +rbox d D2 | qhull FQ n | qhalf s H0 Fc FP Fn FN FQ Fv Fx + +Halfspace intersection by the convex hull of 4 points in 2-d: + + Number of halfspaces: 4 + Number of non-redundant halfspaces: 4 + Number of intersection points: 4 + +Statistics for: rbox d D2 | qhull FQ n | qhalf s H0 Fc FP Fn FN FQ Fv Fx + + Number of points processed: 4 + Number of hyperplanes created: 6 + Number of distance tests for qhull: 5 + CPU seconds to compute hull (after input): 0 + +4 +0 +0 +0 +0 +0 +4 +2 1 2 +2 0 3 +2 0 3 +2 1 2 +4 +2 0 1 +2 2 0 +2 1 3 +2 3 2 +rbox d D2 | qhull FQ n | qhalf s H0 Fc FP Fn FN FQ Fv Fx +4 +2 1 0 +2 2 0 +2 3 1 +2 3 2 +4 +0 +1 +3 +2 +# qhull - printed at end +qhull . + +Qhull 2020.2.r 2020/07/24 +Except for 'F.' and 'PG', upper-case options take an argument. + + delaunay facet-dump Geomview H0,0-interior Halfspace + incidences mathematica normals off-format points + summary voronoi + + Farea FArea-total Fcoplanars FCentrums Fd-cdd-in + FD-cdd-out FFacets-xridge Finner FIDs Fmerges + FMaple Fneighbors FNeigh-vertex Fouter FOptions + Fpoint-intersect FPoint-near FQhull Fsummary FSize + Ftriangles Fvertices Fvoronoi FVertex-ave Fxtremes + + Gall-points Gcentrums GDrop-dim Ghyperplanes Ginner + Gno-planes Gouter Gpoints Gridges Gtransparent + Gvertices + + PArea-keep Pdrop-d0:0D0 PFacet-area-keep Pgood PGood-neighbors + PMerge-keep Poutput-forced Pprecision-not + + Qallow-short QbBound-0:0.5 QbB-scale-box Qbb-scale-last Qbk:0Bk:0-drop + Qcoplanar Qinterior QJoggle QRotate Qsearch-all + Qtriangulate QupperDelaunay Qwarn-allow Qxact-merge Qzinfinite + + Qfurthest Qgood-only QGood-point Qmax-outside Qrandom + Qvneighbors QVertex-good + + Q0-no-premerge Q1-angle-merge Q2-no-independ Q3-no-redundant + Q4-no-old Q5-no-check-out Q6-no-concave Q7-depth-first + Q8-no-near-in Q9-pick-furthest Q10-no-narrow Q11-trinormals + Q12-allow-wide Q14-merge-pinched Q15-duplicates + + TFacet-log TInput-file TOutput-file Tstatistics Tverify + Tz-stdout + + T4-trace Tannotate TAdd-stop Tcheck-often TCone-stop + Tflush TMerge-trace TPoint-trace TRerun TVertex-stop + TWide-trace + + Angle-max Centrum-size Error-round Random-dist Ucoplanar-max + Visible-min Wide-outside +qhull -? # [mar'19] isatty does not work for Git for Windows + +qhull -- compute convex hulls and related structures. Qhull 2020.2.r 2020/07/24 + input (stdin): dimension, number of points, point coordinates + comments start with a non-numeric character + halfspace: use dim+1 and put offsets after coefficients + +options (qh-quick.htm): + d - Delaunay triangulation by lifting points to a paraboloid + d Qu - furthest-site Delaunay triangulation (upper convex hull) + v - Voronoi diagram as the dual of the Delaunay triangulation + v Qu - furthest-site Voronoi diagram + H1,1 - Halfspace intersection about [1,1,0,...] via polar duality + Qt - triangulated output + QJ - joggled input instead of merged facets + Tv - verify result: structure, convexity, and point inclusion + . - concise list of all options + - - one-line description of each option + -? - this message + -V - version + +Output options (subset): + s - summary of results (default) + i - vertices incident to each facet + n - normals with offsets + p - vertex coordinates (if 'Qc', includes coplanar points) + if 'v', Voronoi vertices + FA - report total area and volume + Fp - halfspace intersections + FS - total area and volume + Fx - extreme points (convex hull vertices) + G - Geomview output (2-d, 3-d and 4-d) + m - Mathematica output (2-d and 3-d) + o - OFF format (if 'v', outputs Voronoi regions) + QVn - print facets that include point n, -n if not + TI file - input file, may be enclosed in single quotes + TO file - output file, may be enclosed in single quotes + +examples: + rbox D4 | qhull Tv rbox 1000 s | qhull Tv s FA + rbox 10 D2 | qhull d QJ s i TO result rbox 10 D2 | qhull v Qbb Qt p + rbox 10 D2 | qhull d Qu QJ m rbox 10 D2 | qhull v Qu QJ o + rbox c d D2 | qhull Qc s f Fx | more rbox c | qhull FV n | qhull H Fp + rbox d D12 | qhull QR0 FA rbox c D7 | qhull FA TF1000 + rbox y 1000 W0 | qhull Qc rbox c | qhull n + +rbox 1000 s | qhull Tv s FA + +Convex hull of 1000 points in 3-d: + + Number of vertices: 1000 + Number of facets: 1996 + +Statistics for: rbox 1000 s | qhull Tv s FA + + Number of points processed: 1000 + Number of hyperplanes created: 5544 + Number of distance tests for qhull: 25487 + CPU seconds to compute hull (after input): 0.003 + Total facet area: 3.1201951 + Total volume: 0.51650274 + + +qhull output completed. Verifying that 1000 points are +below 2.1e-15 of the nearest facet. +rbox 10 D2 | qhull d QJ s i TO q_test.log.1 + +Delaunay triangulation by the convex hull of 10 points in 3-d: + + Number of input sites: 10 + Number of Delaunay regions: 14 + +Statistics for: rbox 10 D2 | qhull d QJ s i TO q_test.log.1 + + Number of points processed: 10 + Number of hyperplanes created: 28 + Number of facets in hull: 16 + Number of distance tests for qhull: 47 + CPU seconds to compute hull (after input): 0 + Input joggled by: 4e-11 + +cat q_test.log.1 +14 +9 7 0 +8 9 0 +3 4 1 +3 7 4 +7 2 4 +0 5 1 +7 5 0 +5 3 1 +3 5 7 +6 7 9 +6 2 7 +8 6 9 +6 8 4 +2 6 4 +rbox 10 D2 | qhull v Qbb Qt p +2 +14 +-0.1294381801544404 -0.07247409101984714 +0.08267689532419747 -0.2397644955865706 +0.1295260566906465 1.716033573116837 +0.1740355150742391 0.5317519038435655 +0.1851415205797575 0.3882545794457364 +-0.9065939866848107 -0.2962957610652135 +-0.1954805620516266 -0.07111892482963184 +-0.1407581310832468 0.7233857048236082 +-0.1676297826663962 0.2080621273999375 +0.05868313821742954 0.06632066014880154 +0.08806341399736994 0.1054080604689985 +0.4761588899009253 -0.03168366595227294 +3.094213357897477 -0.064721945677682 +0.5410515627308725 0.2115615434955919 +rbox 10 D2 | qhull d Qu QJ m +{ +Polygon[{{ 0.37903124, 0.37797944, 0.29963416}, +{ -0.02222276, -0.49797278, 0.23792952}, +{ -0.42854319, 0.47458265, 0.49797278}}], +Polygon[{{ 0.34431227, -0.14373122, 0.06080143}, +{ -0.02222276, -0.49797278, 0.23792952}, +{ 0.37903124, 0.37797944, 0.29963416}}]} +rbox 10 D2 | qhull v Qu QJ o +2 +3 10 1 +-10.101 -10.101 +-0.06934933488573394 0.05349366577046777 +-0.3051278692468022 0.16149850548211 +3 0 2 1 +2 0 1 +0 +0 +3 0 1 2 +0 +0 +0 +2 0 2 +0 +rbox c d D2 | qhull Qc s f Fx + +Convex hull of 8 points in 2-d: + + Number of vertices: 4 + Number of coplanar points: 4 + Number of facets: 4 + +Statistics for: rbox c d D2 | qhull Qc s f Fx + + Number of points processed: 4 + Number of hyperplanes created: 6 + Number of distance tests for qhull: 35 + CPU seconds to compute hull (after input): 0 + +Vertices and facets: +- p2(v2): 0.5 -0.5 +- p0(v1): -0.5 -0.5 +- p1(v3): -0.5 0.5 +- p3(v4): 0.5 0.5 +- f1 + - flags: bottom simplicial + - normal: -0 -1 + - offset: -0.5 + - coplanar set(furthest p4): + p4: 0 -0.5 + furthest distance= 0 + - vertices: p2(v2) p0(v1) + - neighboring facets: f2 f4 +- f2 + - flags: top simplicial + - normal: -1 0 + - offset: -0.5 + - coplanar set(furthest p6): + p6: -0.5 0 + furthest distance= 0 + - vertices: p1(v3) p0(v1) + - neighboring facets: f1 f5 +- f4 + - flags: bottom simplicial + - normal: 1 -0 + - offset: -0.5 + - coplanar set(furthest p7): + p7: 0.5 0 + furthest distance= 0 + - vertices: p3(v4) p2(v2) + - neighboring facets: f1 f5 +- f5 + - flags: top simplicial + - normal: 0 1 + - offset: -0.5 + - coplanar set(furthest p5): + p5: 0 0.5 + furthest distance= 0 + - vertices: p3(v4) p1(v3) + - neighboring facets: f2 f4 +4 +0 +2 +3 +1 +rbox c | qhull FV n | qhull H Fp +3 +8 + -0.5 -0.5 -0.5 + 0.5 -0.5 -0.5 + -0.5 -0.5 0.5 + 0.5 -0.5 0.5 + 0.5 0.5 -0.5 + -0.5 0.5 -0.5 + 0.5 0.5 0.5 + -0.5 0.5 0.5 +rbox d D12 | qhull QR0 FA + +Convex hull of 24 points in 12-d: + + Number of vertices: 24 + Number of facets: 4096 -Geomview output (2-d, 3-d and 4-d; dual convex hull) - Ga - all points (i.e., transformed halfspaces) as dots - Gp - coplanar points and vertices as radii - Gv - vertices (i.e., non-redundant halfspaces) as spheres - Gi - inner planes (i.e., halfspace intersections) only - Gn - no planes - Go - outer planes only - Gc - centrums - Gh - hyperplane intersections - Gr - ridges - GDn - drop dimension n in 3-d and 4-d output +Statistics for: rbox d D12 | qhull QR0 FA QR1595644042 -Print options: - PAn - keep n largest facets (i.e., intersections) by area - Pdk:n- drop facet if normal[k] <= n (default 0.0) - PDk:n- drop facet if normal[k] >= n - Pg - print good facets (needs 'QGn' or 'QVn') - PFn - keep facets whose area is at least n - PG - print neighbors of good facets - PMn - keep n facets with most merges - Po - force output. If error, output neighborhood of facet - Pp - do not report precision problems + Number of points processed: 24 + Number of hyperplanes created: 4107 + Number of distance tests for qhull: 4215 + Number of distance tests for merging: 121142 + Number of distance tests for checking: 98304 + Number of merged facets: 2036 + CPU seconds to compute hull (after input): 0.023 + Approximate facet area: 1.735661e-07 + Approximate volume: 2.0876757e-09 + +rbox c D7 | qhull FA TF1000 + +At 22:27:22 & 0.003 CPU secs, qhull has created 1048 facets and merged 469. + The current hull contains 230 facets and 24 vertices. There are 104 + outside points. Next is point p79(v25), 0.66 above f145. + +At 22:27:22 & 0.005 CPU secs, qhull has created 2146 facets and merged 1272. + The current hull contains 273 facets and 31 vertices. There are 97 + outside points. Next is point p120(v32), 0.54 above f437. + +At 22:27:22 & 0.008 CPU secs, qhull has created 3310 facets and merged 2244. + The current hull contains 243 facets and 36 vertices. There are 92 + outside points. Next is point p60(v37), 0.54 above f1338. + +At 22:27:22 & 0.01 CPU secs, qhull has created 4322 facets and merged 3099. + The current hull contains 249 facets and 42 vertices. There are 86 + outside points. Next is point p30(v43), 0.54 above f2005. + +At 22:27:22 & 0.012 CPU secs, qhull has created 5491 facets and merged 4196. + The current hull contains 186 facets and 48 vertices. There are 80 + outside points. Next is point p21(v49), 0.5 above f2995. + +At 22:27:22 & 0.015 CPU secs, qhull has created 6589 facets and merged 5175. + The current hull contains 194 facets and 53 vertices. There are 75 + outside points. Next is point p56(v54), 0.28 above f3731. + +At 22:27:22 & 0.018 CPU secs, qhull has created 7867 facets and merged 6337. + The current hull contains 203 facets and 60 vertices. There are 68 + outside points. Next is point p76(v61), 0.29 above f5879. + +At 22:27:22 & 0.021 CPU secs, qhull has created 8971 facets and merged 7362. + The current hull contains 179 facets and 67 vertices. There are 61 + outside points. Next is point p80(v68), 0.23 above f7175. + +At 22:27:22 & 0.023 CPU secs, qhull has created 9984 facets and merged 8352. + The current hull contains 104 facets and 77 vertices. There are 51 + outside points. Next is point p96(v78), 0.41 above f6748. + +At 22:27:22 & 0.027 CPU secs, qhull has created 10990 facets and merged 9326. + The current hull contains 54 facets and 90 vertices. There are 38 + outside points. Next is point p18(v91), 0.41 above f10178. + +At 22:27:22 & 0.031 CPU secs, qhull has created 11996 facets and merged 10295. + The current hull contains 34 facets and 114 vertices. There are 14 + outside points. Next is point p19(v115), 0.38 above f11792. - . - list of all options - - - one line descriptions of all options - -V - version -qhalf . +At 22:27:22 & 0.034 CPU secs, qhull has created 12860 facets and merged 11072. + The current hull contains 14 facets and 128 vertices. Last point was p77 -Qhull 2015.2 2016/01/18. -Except for 'F.' and 'PG', upper_case options take an argument. +Convex hull of 128 points in 7-d: - incidences Geomview mathematica OFF_format point_dual - summary facet_dump + Number of vertices: 128 + Number of facets: 14 + Number of non-simplicial facets: 14 - Fc_redundant Fd_cdd_in FF_dump_xridge FIDs Fmerges - Fneighbors FN_intersect FOptions Fp_coordinates FP_nearest - FQhalf Fsummary Fv_halfspace FMaple Fx_non_redundant +Statistics for: rbox c D7 | qhull FA TF1000 - Gvertices Gpoints Gall_points Gno_planes Ginner - Gcentrums Ghyperplanes Gridges Gouter GDrop_dim + Number of points processed: 128 + Number of hyperplanes created: 1789 + Number of distance tests for qhull: 10122 + Number of distance tests for merging: 87203 + Number of distance tests for checking: 0 + Number of merged facets: 11072 - PArea_keep Pdrop d0:0D0 Pgood PFacet_area_keep - PGood_neighbors PMerge_keep Poutput_forced Pprecision_not - Qbk:0Bk:0_drop Qcoplanar QG_half_good Qi_redundant QJoggle - Qsearch_1st Qtriangulate QVertex_good +First post-merge with 'C4.4e-15' and 'A1.8e+308' - T4_trace Tcheck_often Tstatistics Tverify Tz_stdout - TFacet_log TInput_file TPoint_trace TMerge_trace TOutput_file - TWide_trace TVertex_stop TCone_stop +At 22:27:22 & 0.034 CPU secs, qhull has created 12860 facets and merged 11072. + The current hull contains 14 facets and 128 vertices. Last point was p77 - Angle_max Centrum_size Random_dist Ucoplanar_max Wide_outside -qhalf +Testing all coplanar points. +computing area of each facet and volume of the convex hull -qhalf- halfspace intersection about a point. Qhull 2015.2 2016/01/18 - input (stdin): [dim, 1, interior point], dim+1, n, coefficients+offset - comments start with a non-numeric character +Convex hull of 128 points in 7-d: -options (qhalf.htm): - Hn,n - specify coordinates of interior point - Qt - triangulated output - QJ - joggled input instead of merged facets - Tv - verify result: structure, convexity, and redundancy - . - concise list of all options - - - one-line description of all options - -V - version + Number of vertices: 128 + Number of facets: 14 + Number of non-simplicial facets: 14 -output options (subset): - s - summary of results (default) - Fp - intersection coordinates - Fv - non-redundant halfspaces incident to each intersection - Fx - non-redundant halfspaces - o - OFF file format (dual convex hull) - G - Geomview output (dual convex hull) - m - Mathematica output (dual convex hull) - QVn - print intersections for halfspace n, -n if not - TO file - output results to file, may be enclosed in single quotes +Statistics for: rbox c D7 | qhull FA TF1000 -examples: - rbox d | qconvex FQ n | qhalf s H0,0,0 Fp - rbox c | qconvex FQ FV n | qhalf s i - rbox c | qconvex FQ FV n | qhalf s o + Number of points processed: 128 + Number of hyperplanes created: 1789 + Number of distance tests for qhull: 10122 + Number of distance tests for merging: 87371 + Number of distance tests for checking: 1792 + Number of merged facets: 11072 + CPU seconds to compute hull (after input): 0.034 + Approximate facet area: 14 + Approximate volume: 1 -rbox d | qhull FQ n | qhalf s Qt H0,0,0 Fp -3 -12 - 0 0 0.5 - 0 0 0.5 - 0 0.5 0 - 0 0.5 0 - -0.5 0 0 - -0.5 0 0 - 0.5 0 0 - 0.5 0 0 - 0 -0.5 0 - 0 -0.5 0 - 0 0 -0.5 - 0 0 -0.5 +rbox y 1000 W0 | qhull Qc -Halfspace intersection by the convex hull of 8 points in 3-d: +Convex hull of 1004 points in 3-d: - Number of halfspaces: 8 - Number of non-redundant halfspaces: 8 - Number of intersection points: 12 - Number of triangulated facets: 6 + Number of vertices: 4 + Number of coplanar points: 1000 + Number of facets: 4 -Statistics for: rbox d | qhull FQ n | qhalf s Qt H0,0,0 Fp +Statistics for: rbox y 1000 W0 | qhull Qc - Number of points processed: 8 - Number of hyperplanes created: 11 - Number of distance tests for qhull: 33 - Number of distance tests for merging: 119 - Number of distance tests for checking: 56 - Number of merged facets: 7 - CPU seconds to compute hull (after input): 0 + Number of points processed: 4 + Number of hyperplanes created: 4 + Number of distance tests for qhull: 11000 + CPU seconds to compute hull (after input): 0.001 -rbox c | qhull FQ FV n | qhalf s i -8 -4 5 3 -5 4 2 -0 4 3 -4 0 2 -1 5 2 -5 1 3 -1 0 3 -0 1 2 +rbox c | qhull n +4 +6 + -0 -0 -1 -0.5 + 0 -1 0 -0.5 + 1 -0 -0 -0.5 + -1 -0 -0 -0.5 + 0 1 -0 -0.5 + -0 -0 1 -0.5 +rbox c | qhull TA1 -Halfspace intersection by the convex hull of 6 points in 3-d: +Early exit due to 'TAn', 'TVn', 'TCn', 'TRn', or precision error with 'QJn'. +Convex hull of 8 points in 3-d: - Number of halfspaces: 6 - Number of non-redundant halfspaces: 6 - Number of intersection points: 8 + Number of vertices: 5 + Number of facets: 6 -Statistics for: rbox c | qhull FQ FV n | qhalf s i +Statistics for: rbox c | qhull TA1 - Number of points processed: 6 - Number of hyperplanes created: 11 - Number of distance tests for qhull: 11 - Number of distance tests for merging: 45 - Number of distance tests for checking: 54 - Number of merged facets: 1 + Number of points processed: 5 + Number of hyperplanes created: 8 + Number of distance tests for qhull: 25 CPU seconds to compute hull (after input): 0 -rbox c | qhull FQ FV n | qhalf o -3 -6 8 12 - -0 -0 -2 - 0 -2 0 - 2 -0 -0 - -2 -0 -0 - 0 2 -0 - -0 -0 2 -3 4 5 3 -3 5 4 2 -3 0 4 3 -3 4 0 2 -3 1 5 2 -3 5 1 3 -3 1 0 3 -3 0 1 2 -rbox d D2 | qhull FQ n | qhalf s H0 Fc FP Fn FN FQ Fv Fx -4 -0 -0 -0 -0 -0 -4 -2 1 2 -2 0 3 -2 0 3 -2 1 2 -4 -2 0 1 -2 0 2 -2 1 3 -2 2 3 -rbox d D2 | qhull FQ n | qhalf s H0 Fc FP Fn FN FQ Fv Fx -4 -2 1 0 -2 2 0 -2 3 1 -2 3 2 -4 -1 -0 -2 -3 +rbox 10 s | qhull C1e-5 T1P-1f +[QH1008]qh_readpoints: read in 10 3-dimensional points +[QH0013]qh_initqhull_globals: for rbox 10 s | qhull C1e-5 T1P-1f + +Trace level T1, IStracing 0, point TP-1, merge TM0, dist TW1.8e+308, qh.tracefacet_id -1, traceridge_id -1, tracevertex_id -1, last qh.RERUN 0, rbox 10 s | qhull C1e-5 T1P-1f +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213630158 Centrum-postmerge 1e-05 Trace-point -1 Tflush _pre-merge + _max-width 0.88 Error-roundoff 6.7e-16 _one-merge 3e-05 + _near-inside 0.00015 Visible-distance 1.3e-15 U-max-coplanar 1.3e-15 + Width-outside 2.7e-15 _wide-facet 8e-15 +[QH2112]qh_qhull: finished qh_buildhull and qh_postmerge, start tracing (TP-1) +[QH1022]qh_check_maxout: check and update qh.min_vertex -6.7e-16 and qh.max_outside 1.1e-16 +[QH1055]qh_check_maxout: determine actual maxoutside +[QH1024]qh_check_maxout: p7(v6) is qh.min_vertex -6.7e-16 below facet f4. Point p2 for f4 is qh.max_outside 1.1e-16 above f4. 0 points are outside of not-good facets +[QH1036]Qhull: algorithm completed +[QH1027]qh_checkpolygon: check all facets from f4, qh.NEWtentative? 0 +[QH1062]qh_checkconvex: check that facets are not-flipped and that their centrums are convex by qh.DISTround ('En', 'Rn') -Halfspace intersection by the convex hull of 4 points in 2-d: +Convex hull of 10 points in 3-d: - Number of halfspaces: 4 - Number of non-redundant halfspaces: 4 - Number of intersection points: 4 + Number of vertices: 10 + Number of facets: 16 -Statistics for: rbox d D2 | qhull FQ n | qhalf s H0 Fc FP Fn FN FQ Fv Fx +Statistics for: rbox 10 s | qhull C1e-5 T1P-1f - Number of points processed: 4 - Number of hyperplanes created: 6 - Number of distance tests for qhull: 6 + Number of points processed: 10 + Number of hyperplanes created: 27 + Number of distance tests for qhull: 51 CPU seconds to compute hull (after input): 0 -echo === check quality of Qhull for ${d:-`hostname`} ${d:-`date`} -hostname -date -=== check quality of Qhull for ispy Mon Jan 18 21:22:27 EST 2016 +[QH1006]qh_freeqhull: free global memory +[QH1005]qh_freebuild: free memory from qh_inithull and qh_buildhull +[QH1061]qh_freeqhull: clear qhT except for qh.qhmem and qh.qhstat + +set +v +=== check quality of Qhull for kelwyn Fri, Jul 24, 2020 10:27:22 PM rbox 1000 W0 | qhull QR2 QJ s Fs Tv -10 3 1000 144 284 144 284 0 0 33 0 -2 5.045982607091333e-011 -5.045982607091333e-011 Convex hull of 1000 points in 3-d: @@ -4318,16 +6780,16 @@ Number of points processed: 171 Number of hyperplanes created: 1233 - Number of distance tests for qhull: 33562 - CPU seconds to compute hull (after input): 0 - After 1 retries, input joggled by: 2.9e-011 + Number of distance tests for qhull: 33543 + CPU seconds to compute hull (after input): 0.005 + After 1 retries, input joggled by: 2.9e-11 +10 3 1000 144 284 144 284 0 0 33 0 +2 5.045982607091333e-11 -5.045982607091333e-11 -Output completed. Verifying that all points are below 2.9e-015 of +Output completed. Verifying that all points are below 2.9e-15 of all facets. Will make 284000 distance computations. rbox 1000 W0 | qhull QR2 s Fs Tv -10 3 1000 84 98 84 98 0 6 13 0 -2 1.942124858599573e-015 -1.241679291552168e-015 Convex hull of 1000 points in 3-d: @@ -4339,12 +6801,14 @@ Number of points processed: 97 Number of hyperplanes created: 299 - Number of distance tests for qhull: 18051 - Number of distance tests for merging: 3325 - Number of distance tests for checking: 15397 + Number of distance tests for qhull: 18050 + Number of distance tests for merging: 3163 + Number of distance tests for checking: 15481 Number of merged facets: 92 - CPU seconds to compute hull (after input): 0 + CPU seconds to compute hull (after input): 0.001 +10 3 1000 84 98 84 98 0 6 13 0 +2 1.942124858599573e-15 -1.241679291552168e-15 Output completed. Verifying that all points are below outer planes of all facets. Will make 98000 distance computations. @@ -4352,68 +6816,68 @@ Convex hull of 1000 points in 3-d: - Number of vertices: 114 - Number of coplanar points: 886 - Number of facets: 60 - Number of non-simplicial facets: 60 + Number of vertices: 110 + Number of coplanar points: 890 + Number of facets: 57 + Number of non-simplicial facets: 57 Statistics for: rbox 1000 s | qhull C0.02 Qc Tv Number of points processed: 1000 - Number of hyperplanes created: 5545 - Number of distance tests for qhull: 83858 - Number of distance tests for merging: 82226 - Number of distance tests for checking: 7929 - Number of merged facets: 1936 - CPU seconds to compute hull (after input): 0.031 - Maximum distance of vertex below facet: -0.072 (1.2x) + Number of hyperplanes created: 5544 + Number of distance tests for qhull: 81537 + Number of distance tests for merging: 80708 + Number of distance tests for checking: 8256 + Number of merged facets: 1939 + CPU seconds to compute hull (after input): 0.011 + Maximum distance of vertex below facet: -0.079 (1.3x) Output completed. Verifying that all points are below outer planes of -all facets. Will make 60000 distance computations. +all facets. Will make 57000 distance computations. rbox 500 s D4 | qhull C0.01 Qc Tv Convex hull of 500 points in 4-d: - Number of vertices: 467 - Number of coplanar points: 33 - Number of facets: 357 - Number of non-simplicial facets: 343 + Number of vertices: 462 + Number of coplanar points: 38 + Number of facets: 345 + Number of non-simplicial facets: 332 Statistics for: rbox 500 s D4 | qhull C0.01 Qc Tv Number of points processed: 500 - Number of hyperplanes created: 11284 - Number of distance tests for qhull: 41395 - Number of distance tests for merging: 162691 - Number of distance tests for checking: 20813 - Number of merged facets: 2809 - CPU seconds to compute hull (after input): 0.046 - Maximum distance of vertex below facet: -0.073 (1.8x) + Number of hyperplanes created: 11283 + Number of distance tests for qhull: 42789 + Number of distance tests for merging: 217345 + Number of distance tests for checking: 12552 + Number of merged facets: 2821 + CPU seconds to compute hull (after input): 0.019 + Maximum distance of vertex below facet: -0.08 (2.0x) Output completed. Verifying that all points are below outer planes of -all facets. Will make 178500 distance computations. +all facets. Will make 172500 distance computations. rbox 1000 s | qhull C-0.02 Qc Tv Convex hull of 1000 points in 3-d: - Number of vertices: 47 - Number of coplanar points: 953 + Number of vertices: 52 + Number of coplanar points: 948 Number of facets: 47 - Number of non-simplicial facets: 35 + Number of non-simplicial facets: 38 Statistics for: rbox 1000 s | qhull C-0.02 Qc Tv - Number of points processed: 50 - Number of hyperplanes created: 199 - Number of distance tests for qhull: 52519 - Number of distance tests for merging: 2966 - Number of distance tests for checking: 24231 - Number of merged facets: 98 - CPU seconds to compute hull (after input): 0.015 - Maximum distance of point above facet: 0.065 (1.1x) - Maximum distance of vertex below facet: -0.062 (1.0x) + Number of points processed: 53 + Number of hyperplanes created: 214 + Number of distance tests for qhull: 47444 + Number of distance tests for merging: 2943 + Number of distance tests for checking: 19555 + Number of merged facets: 107 + CPU seconds to compute hull (after input): 0.002 + Maximum distance of point above facet: 0.039 (0.7x) + Maximum distance of vertex below facet: -0.057 (0.9x) Output completed. Verifying that all points are below outer planes of @@ -4422,97 +6886,95 @@ Convex hull of 1000 points in 4-d: - Number of vertices: 117 - Number of coplanar points: 883 - Number of facets: 232 - Number of non-simplicial facets: 149 + Number of vertices: 126 + Number of coplanar points: 874 + Number of facets: 206 + Number of non-simplicial facets: 148 Statistics for: rbox 1000 s D4 | qhull C-0.01 Qc Tv - Number of points processed: 117 - Number of hyperplanes created: 1232 - Number of distance tests for qhull: 372627 - Number of distance tests for merging: 31334 - Number of distance tests for checking: 122166 - Number of merged facets: 1167 - CPU seconds to compute hull (after input): 0.031 - Maximum distance of point above facet: 0.062 (1.5x) - Maximum distance of vertex below facet: -0.064 (1.6x) + Number of points processed: 126 + Number of hyperplanes created: 1371 + Number of distance tests for qhull: 414344 + Number of distance tests for merging: 73447 + Number of distance tests for checking: 124140 + Number of merged facets: 1331 + CPU seconds to compute hull (after input): 0.02 + Maximum distance of point above facet: 0.068 (1.7x) + Maximum distance of vertex below facet: -0.1 (2.6x) Output completed. Verifying that all points are below outer planes of -all facets. Will make 232000 distance computations. +all facets. Will make 206000 distance computations. rbox 200 s D5 | qhull C-0.01 Qx Qc Tv Convex hull of 200 points in 5-d: - Number of vertices: 160 - Number of coplanar points: 40 - Number of facets: 388 - Number of non-simplicial facets: 342 + Number of vertices: 161 + Number of coplanar points: 39 + Number of facets: 416 + Number of non-simplicial facets: 365 Statistics for: rbox 200 s D5 | qhull C-0.01 Qx Qc Tv - Number of points processed: 160 - Number of hyperplanes created: 4522 - Number of distance tests for qhull: 235312 - Number of distance tests for merging: 143140 - Number of distance tests for checking: 46266 - Number of merged facets: 5940 - CPU seconds to compute hull (after input): 0.047 + Number of points processed: 161 + Number of hyperplanes created: 4552 + Number of distance tests for qhull: 229096 + Number of distance tests for merging: 309308 + Number of distance tests for checking: 54701 + Number of merged facets: 6165 + CPU seconds to compute hull (after input): 0.039 Maximum distance of point above facet: 0.059 (1.2x) - Maximum distance of vertex below facet: -0.11 (2.1x) + Maximum distance of vertex below facet: -0.1 (2.1x) -QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point -is outside of a facet. See qh-optq.htm#Qx +QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point is outside of a facet. See qh-optq.htm#Qx Output completed. Verifying that all points are below outer planes of -all facets. Will make 77600 distance computations. +all facets. Will make 83200 distance computations. rbox 100 s D6 | qhull C-0.001 Qx Qc Tv Convex hull of 100 points in 6-d: Number of vertices: 100 - Number of facets: 4465 + Number of facets: 4454 Number of non-simplicial facets: 809 Statistics for: rbox 100 s D6 | qhull C-0.001 Qx Qc Tv Number of points processed: 100 - Number of hyperplanes created: 20175 - Number of distance tests for qhull: 33383 - Number of distance tests for merging: 299744 - Number of distance tests for checking: 66106 - Number of merged facets: 3948 - CPU seconds to compute hull (after input): 0.109 - Maximum distance of point above facet: 0.0029 (0.5x) - Maximum distance of vertex below facet: -0.014 (2.4x) + Number of hyperplanes created: 19805 + Number of distance tests for qhull: 33228 + Number of distance tests for merging: 330047 + Number of distance tests for checking: 88758 + Number of merged facets: 3862 + CPU seconds to compute hull (after input): 0.057 + Maximum distance of point above facet: 0.003 (0.5x) + Maximum distance of vertex below facet: -0.014 (2.3x) -QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point -is outside of a facet. See qh-optq.htm#Qx +QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point is outside of a facet. See qh-optq.htm#Qx Output completed. Verifying that all points are below outer planes of -all facets. Will make 446500 distance computations. +all facets. Will make 445400 distance computations. rbox 1000 W1e-4 | qhull C-1e-6 Qc Tv Convex hull of 1000 points in 3-d: - Number of vertices: 144 - Number of coplanar points: 75 + Number of vertices: 145 + Number of coplanar points: 87 Number of facets: 243 - Number of non-simplicial facets: 26 + Number of non-simplicial facets: 29 Statistics for: rbox 1000 W1e-4 | qhull C-1e-6 Qc Tv Number of points processed: 185 - Number of hyperplanes created: 939 - Number of distance tests for qhull: 42000 - Number of distance tests for merging: 8652 - Number of distance tests for checking: 5684 - Number of merged facets: 145 - CPU seconds to compute hull (after input): 0.015 - Maximum distance of point above facet: 1.3e-006 (0.4x) - Maximum distance of vertex below facet: -3.2e-006 (1.1x) + Number of hyperplanes created: 940 + Number of distance tests for qhull: 40788 + Number of distance tests for merging: 7744 + Number of distance tests for checking: 6136 + Number of merged facets: 143 + CPU seconds to compute hull (after input): 0.002 + Maximum distance of point above facet: 8.3e-07 (0.3x) + Maximum distance of vertex below facet: -3.9e-06 (1.3x) Output completed. Verifying that all points are below outer planes of @@ -4521,112 +6983,155 @@ Convex hull of 1000 points in 4-d: - Number of vertices: 290 - Number of coplanar points: 433 - Number of facets: 1296 - Number of non-simplicial facets: 154 + Number of vertices: 291 + Number of coplanar points: 645 + Number of facets: 1273 + Number of non-simplicial facets: 151 Statistics for: rbox 1000 W5e-4 D4 | qhull C-1e-5 Qc Tv - Number of points processed: 368 - Number of hyperplanes created: 6238 - Number of distance tests for qhull: 182095 - Number of distance tests for merging: 75580 - Number of distance tests for checking: 52937 - Number of merged facets: 1353 - CPU seconds to compute hull (after input): 0.031 - Maximum distance of point above facet: 9.1e-005 (2.3x) - Maximum distance of vertex below facet: -0.00012 (2.9x) + Number of points processed: 365 + Number of hyperplanes created: 6252 + Number of distance tests for qhull: 173357 + Number of distance tests for merging: 90805 + Number of distance tests for checking: 56693 + Number of merged facets: 1351 + CPU seconds to compute hull (after input): 0.013 + Maximum distance of point above facet: 0.00013 (3.3x) + Maximum distance of vertex below facet: -0.00021 (5.4x) Output completed. Verifying that all points are below outer planes of -all facets. Will make 1296000 distance computations. +all facets. Will make 1273000 distance computations. rbox 400 W1e-3 D5 | qhull C-1e-5 Qx Qc Tv Convex hull of 400 points in 5-d: - Number of vertices: 305 - Number of coplanar points: 35 - Number of facets: 5552 - Number of non-simplicial facets: 281 + Number of vertices: 306 + Number of coplanar points: 33 + Number of facets: 5557 + Number of non-simplicial facets: 287 Statistics for: rbox 400 W1e-3 D5 | qhull C-1e-5 Qx Qc Tv - Number of points processed: 336 - Number of hyperplanes created: 24527 - Number of distance tests for qhull: 251847 - Number of distance tests for merging: 277585 - Number of distance tests for checking: 61531 - Number of merged facets: 1482 - CPU seconds to compute hull (after input): 0.093 - Maximum distance of point above facet: 5.5e-005 (1.1x) + Number of points processed: 338 + Number of hyperplanes created: 24498 + Number of distance tests for qhull: 262194 + Number of distance tests for merging: 271065 + Number of distance tests for checking: 90075 + Number of merged facets: 1472 + CPU seconds to compute hull (after input): 0.045 + Maximum distance of point above facet: 5.5e-05 (1.1x) Maximum distance of vertex below facet: -0.0001 (2.1x) -QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point -is outside of a facet. See qh-optq.htm#Qx +QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point is outside of a facet. See qh-optq.htm#Qx Output completed. Verifying that all points are below outer planes of -all facets. Will make 2220800 distance computations. -echo === check input format etc. ${d:-`date`} -date -=== check input format etc. Mon Jan 18 21:22:28 EST 2016 +all facets. Will make 2222800 distance computations. + +set +v +=== check input format etc. Fri, Jul 24, 2020 10:27:23 PM qhull <r.x +qhull TIr.x + +Convex hull of 10 points in 3-d: + + Number of vertices: 10 + Number of facets: 16 + +Statistics for: rbox 10 | qhull TIr.x + + Number of points processed: 10 + Number of hyperplanes created: 26 + Number of distance tests for qhull: 43 CPU seconds to compute hull (after input): 0 - Maximum distance of vertex below facet: -1.1e-015 (0.3x) +qhull p TI r.x TO x.x +cat x.x +3 +10 +-0.374949442106252 0.2247255418679914 -0.03782349642163468 +0.3004920247946792 0.3694544596313075 0.4210962191420572 +0.3641479121187217 0.2339522165562512 0.03489791698278666 +-0.4707134565997063 -0.2810653003687648 0.1354949890035158 +0.2642752088273644 -0.3265712199048802 0.3175057017407433 +0.3183227589524563 0.05060330969337679 0.4898217078203537 +0.4334355904100794 -0.2480392830893763 0.2037671452423252 +-0.2855954200826543 -0.002227006947833121 -0.4293096679535784 +-0.4075898489985521 -0.3625928418362446 -0.09789381697577781 +-0.3013850588364387 -0.3786854184034145 0.4341719447953365 -echo === check qhull output formats ${d:-`date`} -date -=== check qhull output formats Mon Jan 18 21:22:31 EST 2016 +set +v +=== check qhull output formats Fri, Jul 24, 2020 10:27:28 PM rbox 5 r s D2 | qhull Tcv Convex hull of 5 points in 2-d: @@ -5899,11 +8530,11 @@ Number of points processed: 5 Number of hyperplanes created: 8 - Number of distance tests for qhull: 8 + Number of distance tests for qhull: 7 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 1.3e-015 of +Output completed. Verifying that all points are below 1.3e-15 of all facets. Will make 25 distance computations. rbox 5 r s D2 | qhull s @@ -5916,22 +8547,10 @@ Number of points processed: 5 Number of hyperplanes created: 8 - Number of distance tests for qhull: 8 + Number of distance tests for qhull: 7 CPU seconds to compute hull (after input): 0 rbox 5 r s D2 | qhull s o -2 -5 5 5 -0.1545084971874737 0.4755282581475768 --0.4045084971874737 0.2938926261462366 --0.4045084971874738 -0.2938926261462365 -0.1545084971874736 -0.4755282581475768 - 0.5 -1.224646799147353e-016 -2 4 0 -2 2 3 -2 3 4 -2 1 2 -2 0 1 Convex hull of 5 points in 2-d: @@ -5942,45 +8561,57 @@ Number of points processed: 5 Number of hyperplanes created: 8 - Number of distance tests for qhull: 8 + Number of distance tests for qhull: 7 CPU seconds to compute hull (after input): 0 +2 +5 5 5 +0.1545084971874737 0.4755282581475768 +-0.4045084971874737 0.2938926261462366 +-0.4045084971874738 -0.2938926261462365 +0.1545084971874736 -0.4755282581475768 + 0.5 -1.224646799147353e-16 +2 4 0 +2 2 3 +2 3 4 +2 1 2 +2 0 1 rbox 5 r s D2 | qhull f Vertices and facets: -- p0(v2): 0.15 0.48 -- p4(v1): 0.5 -1.2e-016 +- p0(v3): 0.15 0.48 +- p4(v2): 0.5 -1.2e-16 - p3(v4): 0.15 -0.48 -- p2(v0): -0.4 -0.29 +- p2(v1): -0.4 -0.29 - p1(v5): -0.4 0.29 - f3 - flags: bottom simplicial - normal: 0.809 0.5878 - offset: -0.4045085 - - vertices: p0(v2) p4(v1) + - vertices: p0(v3) p4(v2) - neighboring facets: f5 f7 - f4 - flags: bottom simplicial - normal: -0.309 -0.9511 - offset: -0.4045085 - - vertices: p3(v4) p2(v0) + - vertices: p3(v4) p2(v1) - neighboring facets: f6 f5 - f5 - flags: top simplicial - normal: 0.809 -0.5878 - offset: -0.4045085 - - vertices: p3(v4) p4(v1) + - vertices: p3(v4) p4(v2) - neighboring facets: f3 f4 - f6 - flags: top simplicial - - normal: -1 9.444e-017 + - normal: -1 9.444e-17 - offset: -0.4045085 - - vertices: p1(v5) p2(v0) + - vertices: p1(v5) p2(v1) - neighboring facets: f4 f7 - f7 - flags: bottom simplicial - normal: -0.309 0.9511 - offset: -0.4045085 - - vertices: p1(v5) p0(v2) + - vertices: p1(v5) p0(v3) - neighboring facets: f3 f6 rbox 5 r s D2 | qhull i 5 @@ -6010,8 +8641,8 @@ 5 0.8090169943749476 0.587785252292473 -0.4045084971874737 -0.3090169943749476 -0.9510565162951536 -0.4045084971874738 -0.8090169943749472 -0.5877852522924733 -0.4045084971874737 - -1 9.444121133484361e-017 -0.4045084971874738 +0.8090169943749472 -0.5877852522924732 -0.4045084971874737 + -1 9.444121133484361e-17 -0.4045084971874738 -0.3090169943749474 0.9510565162951536 -0.4045084971874738 rbox 5 r s D2 | qhull p 2 @@ -6020,7 +8651,7 @@ -0.4045084971874737 0.2938926261462366 -0.4045084971874738 -0.2938926261462365 0.1545084971874736 -0.4755282581475768 - 0.5 -1.224646799147353e-016 + 0.5 -1.224646799147353e-16 rbox 5 r s D2 | qhull o 2 5 5 5 @@ -6028,7 +8659,7 @@ -0.4045084971874737 0.2938926261462366 -0.4045084971874738 -0.2938926261462365 0.1545084971874736 -0.4755282581475768 - 0.5 -1.224646799147353e-016 + 0.5 -1.224646799147353e-16 2 4 0 2 2 3 2 3 4 @@ -6041,7 +8672,7 @@ -0.4045084971874737 0.2938926261462366 -0.4045084971874738 -0.2938926261462365 0.1545084971874736 -0.4755282581475768 - 0.5 -1.224646799147353e-016 + 0.5 -1.224646799147353e-16 2 4 0 2 2 3 2 3 4 @@ -6061,13 +8692,13 @@ -0.4045084971874737 0.2938926261462366 -0.4045084971874738 -0.2938926261462365 0.1545084971874736 -0.4755282581475768 - 0.5 -1.224646799147353e-016 + 0.5 -1.224646799147353e-16 3 5 0.8090169943749476 0.587785252292473 -0.4045084971874737 -0.3090169943749476 -0.9510565162951536 -0.4045084971874738 -0.8090169943749472 -0.5877852522924733 -0.4045084971874737 - -1 9.444121133484361e-017 -0.4045084971874738 +0.8090169943749472 -0.5877852522924732 -0.4045084971874737 + -1 9.444121133484361e-17 -0.4045084971874738 -0.3090169943749474 0.9510565162951536 -0.4045084971874738 5 4 0 @@ -6078,10 +8709,10 @@ rbox 10 D3 | qhull f Tcv Vertices and facets: - p0(v5): -0.022 -0.37 0.33 -- p9(v2): 0.38 -0.47 -0.22 -- p6(v0): -0.31 -0.011 -0.49 -- p1(v3): -0.067 -0.16 0.46 -- p7(v1): 0.39 0.045 0.12 +- p9(v3): 0.38 -0.47 -0.22 +- p6(v1): -0.31 -0.011 -0.49 +- p1(v4): -0.067 -0.16 0.46 +- p7(v2): 0.39 0.045 0.12 - p3(v6): 0.31 0.084 -0.1 - p4(v7): 0.18 0.12 0.049 - p5(v8): -0.12 0.015 -0.14 @@ -6090,79 +8721,79 @@ - flags: top simplicial - normal: -0.4934 -0.8471 -0.1973 - offset: -0.2568231 - - vertices: p0(v5) p9(v2) p6(v0) + - vertices: p0(v5) p9(v3) p6(v1) - neighboring facets: f9 f6 f7 - f6 - flags: bottom simplicial - normal: -0.9301 -0.3157 0.1877 - offset: -0.1977325 - - vertices: p0(v5) p1(v3) p6(v0) + - vertices: p0(v5) p1(v4) p6(v1) - neighboring facets: f17 f5 f8 - f7 - flags: bottom simplicial - normal: 0.7008 -0.3956 0.5936 - offset: -0.323519 - - vertices: p0(v5) p9(v2) p7(v1) + - vertices: p0(v5) p9(v3) p7(v2) - neighboring facets: f10 f8 f5 - f8 - flags: top simplicial - normal: 0.6544 -0.298 0.6949 - offset: -0.3219447 - - vertices: p0(v5) p1(v3) p7(v1) + - vertices: p0(v5) p1(v4) p7(v2) - neighboring facets: f13 f7 f6 - f9 - flags: bottom simplicial - normal: 0.4866 0.2316 -0.8424 - offset: -0.2582907 - - vertices: p3(v6) p9(v2) p6(v0) + - vertices: p3(v6) p9(v3) p6(v1) - neighboring facets: f5 f16 f10 - f10 - flags: top simplicial - normal: 0.943 0.1711 -0.2855 - offset: -0.3386013 - - vertices: p3(v6) p9(v2) p7(v1) + - vertices: p3(v6) p9(v3) p7(v2) - neighboring facets: f7 f14 f9 - f13 - flags: bottom simplicial - normal: 0.08536 0.8035 0.5892 - offset: -0.1388354 - - vertices: p4(v7) p1(v3) p7(v1) + - vertices: p4(v7) p1(v4) p7(v2) - neighboring facets: f8 f14 f20 - f14 - flags: top simplicial - normal: 0.3121 0.948 0.06295 - offset: -0.1707289 - - vertices: p4(v7) p3(v6) p7(v1) + - vertices: p4(v7) p3(v6) p7(v2) - neighboring facets: f10 f13 f16 - f16 - flags: bottom simplicial - normal: -0.008104 0.9738 -0.2271 - offset: -0.1026508 - - vertices: p4(v7) p3(v6) p6(v0) + - vertices: p4(v7) p3(v6) p6(v1) - neighboring facets: f9 f18 f14 - f17 - flags: top simplicial - normal: -0.6179 0.7381 0.2709 - offset: -0.04995414 - - vertices: p5(v8) p1(v3) p6(v0) + - vertices: p5(v8) p1(v4) p6(v1) - neighboring facets: f6 f18 f21 - f18 - flags: bottom simplicial - normal: -0.3978 0.9064 0.1423 - offset: -0.04320607 - - vertices: p5(v8) p4(v7) p6(v0) + - vertices: p5(v8) p4(v7) p6(v1) - neighboring facets: f16 f17 f22 - f20 - flags: top simplicial - normal: -0.4124 0.8514 0.3242 - offset: -0.04294297 - - vertices: p2(v9) p4(v7) p1(v3) + - vertices: p2(v9) p4(v7) p1(v4) - neighboring facets: f13 f21 f22 - f21 - flags: bottom simplicial - normal: -0.5086 0.8133 0.2826 - offset: -0.03620543 - - vertices: p2(v9) p5(v8) p1(v3) + - vertices: p2(v9) p5(v8) p1(v4) - neighboring facets: f17 f20 f22 - f22 - flags: top simplicial @@ -6171,7 +8802,7 @@ - vertices: p2(v9) p5(v8) p4(v7) - neighboring facets: f18 f20 f21 -Output completed. Verifying that all points are below 2e-015 of +Output completed. Verifying that all points are below 2e-15 of all facets. Will make 140 distance computations. rbox 10 D3 | qhull i 14 @@ -6197,7 +8828,7 @@ 0.02820502736438535 0.04189077954915421 0.05832764185809314 0.3126723396709863 0.08400649026409401 -0.1029227018383543 0.1781470954214661 0.1182274414396169 0.04860343742054274 --0.1220315663349177 0.01546165115708642 -0.1360330368727754 +-0.1220315663349177 0.01546165115708642 -0.1360330368727753 -0.3072535691850387 -0.01073880122111998 -0.4870359524963758 0.3867462923626847 0.04492879989084675 0.118335500935405 0.3789805913148268 -0.4732086509216658 -0.2177962499836425 @@ -6209,7 +8840,7 @@ 0.02820502736438535 0.04189077954915421 0.05832764185809314 0.3126723396709863 0.08400649026409401 -0.1029227018383543 0.1781470954214661 0.1182274414396169 0.04860343742054274 --0.1220315663349177 0.01546165115708642 -0.1360330368727754 +-0.1220315663349177 0.01546165115708642 -0.1360330368727753 -0.3072535691850387 -0.01073880122111998 -0.4870359524963758 0.3867462923626847 0.04492879989084675 0.118335500935405 -0.1352406177997967 0.01093378431250691 -0.2358910583293913 @@ -6252,48 +8883,42 @@ Number of points processed: 8 Number of hyperplanes created: 11 - Number of distance tests for qhull: 320 - Number of distance tests for merging: 84 - Number of distance tests for checking: 188 + Number of distance tests for qhull: 297 + Number of distance tests for merging: 90 + Number of distance tests for checking: 168 Number of merged facets: 6 CPU seconds to compute hull (after input): 0 -rbox 50 D3 s | qhull C0.1 Qc Pd0d1d2 s p Tcv -3 -7 -0.1955434141942995 0.09315491718098735 0.4506494586374647 -0.3786694231678469 0.2419725568326128 -0.2192230592287637 -0.1164290160865212 0.2250749615572271 0.4310284745734756 -0.3010852516984067 0.3425921496145067 0.2048860420629442 -0.4995640899182717 0.005583735684776723 0.02011322848106417 -0.4035338761538298 0.1419567271683243 0.2588603840063664 -0.3642936952899509 -0.2163723184172344 -0.2654677445467591 +rbox 50 D3 s | qhull C0.1 Qc Pd0d1d2 Pg s p Tcv Convex hull of 50 points in 3-d: - - Number of vertices: 19 - Number of coplanar points: 31 - Number of facets: 12 + + Number of vertices: 17 + Number of coplanar points: 33 + Number of facets: 11 Number of 'good' facets: 1 - Number of 'good' non-simplicial facets: 1 -Statistics for: rbox 50 D3 s | qhull C0.1 Qc Pd0d1d2 s p Tcv +Statistics for: rbox 50 D3 s | qhull C0.1 Qc Pd0d1d2 Pg s p Tcv Number of points processed: 50 - Number of hyperplanes created: 237 - Number of distance tests for qhull: 1177 - Number of distance tests for merging: 3999 - Number of distance tests for checking: 367 - Number of merged facets: 84 - CPU seconds to compute hull (after input): 0 + Number of hyperplanes created: 236 + Number of distance tests for qhull: 1191 + Number of distance tests for merging: 3250 + Number of distance tests for checking: 1146 + Number of merged facets: 85 + CPU seconds to compute hull (after input): 0.001 Maximum distance of vertex below facet: -0.24 (0.8x) +3 +4 +0.4995640899182717 0.005583735684776723 0.02011322848106416 +0.3642936952899509 -0.2163723184172344 -0.2654677445467591 +0.39379735093457 0.04855022442420501 -0.3042474685273066 +0.397166795352245 -0.07497301400429786 -0.2943426300092109 Output completed. Verifying that all points are below outer planes of all facets. Will make 50 distance computations. rbox 10 D2 P0 P1e-15 | qhull d Qc FP s Tcv -1 -0 1 12 1e-015 Delaunay triangulation by the convex hull of 12 points in 3-d: @@ -6306,24 +8931,15 @@ Number of points processed: 11 Number of hyperplanes created: 33 Number of facets in hull: 18 - Number of distance tests for qhull: 111 + Number of distance tests for qhull: 107 CPU seconds to compute hull (after input): 0 +1 +0 1 12 1e-15 Output completed. Verifying that all points are below outer planes of all facets. Will make 192 distance computations. rbox 100 s | qhull C-0.003 Qc FP s -10 -29 92 222 0.05221620842441997 -49 2 292 0.03790045221711885 -99 9 338 0.02993864679572162 -54 84 341 0.06479664045626413 -54 72 226 0.03827167959574595 -96 6 368 0.02282529175708785 -19 1 372 0.01048228658130246 -69 26 409 0.04998878658421259 -19 66 371 0.008281093788857875 -19 45 371 0.04608027722786196 Convex hull of 100 points in 3-d: @@ -6335,29 +8951,40 @@ Statistics for: rbox 100 s | qhull C-0.003 Qc FP s Number of points processed: 90 - Number of hyperplanes created: 400 - Number of distance tests for qhull: 2016 - Number of distance tests for merging: 3695 - Number of distance tests for checking: 1469 - Number of merged facets: 102 + Number of hyperplanes created: 404 + Number of distance tests for qhull: 1996 + Number of distance tests for merging: 3783 + Number of distance tests for checking: 1381 + Number of merged facets: 105 CPU seconds to compute hull (after input): 0 Maximum distance of point above facet: 0.0057 (0.6x) Maximum distance of vertex below facet: -0.0087 (1.0x) +10 +29 92 222 0.05221620842441997 +49 2 292 0.03790045221711884 +99 9 336 0.02993864679572162 +54 84 340 0.06479664045626413 +54 72 226 0.03827167959574595 +96 6 368 0.02282529175708784 +19 1 372 0.01048228658130246 +69 26 409 0.04998878658421259 +19 66 371 0.008281093788857875 +19 45 371 0.04608027722786196 rbox 100 s D2 | qhull C0.1 i Fx Tcv 6 4 28 -70 27 77 70 +6 68 +70 6 68 4 -27 68 28 77 6 4 28 77 70 -27 +6 68 Output completed. Verifying that all points are below outer planes of @@ -6420,22 +9047,22 @@ 3 16 12 15 3 17 10 16 } transforms { TLIST -0.009951 0 0 0 # v2 +0.009951 0 0 0 # v3 0 0.009951 0 0 0 0 0.009951 0 -0.04234 -0.2077 -0.4529 # p3 1 -0.009951 0 0 0 # v1 +0.009951 0 0 0 # v2 0 0.009951 0 0 0 0 0.009951 0 0.004313 -0.4976 0.04904 # p2 1 -0.009951 0 0 0 # v0 +0.009951 0 0 0 # v1 0 0.009951 0 0 0 0 0.009951 0 -0.4876 0.03313 -0.1055 # p0 1 -0.009951 0 0 0 # v3 +0.009951 0 0 0 # v4 0 0.009951 0 0 0 0 0.009951 0 -0.3939 -0.1068 -0.2889 # p1 @@ -6487,66 +9114,66 @@ 3 0 1 2 0.7133 0.8999 0.7112 1.0 } } -Output completed. Verifying that all points are below 2.1e-015 of +Output completed. Verifying that all points are below 2.1e-15 of all facets. Will make 16 distance computations. rbox 6 D4 | qhull f Tcv Vertices and facets: -- p3(v4): 0.1 -0.13 -0.17 -0.42 -- p0(v3): -0.33 -0.43 -0.46 0.15 -- p2(v2): 0.11 0.4 -0.063 -0.18 -- p1(v0): -0.35 -0.24 0.14 -0.18 -- p4(v1): 0.14 -0.34 -0.084 0.087 +- p3(v5): 0.1 -0.13 -0.17 -0.42 +- p0(v4): -0.33 -0.43 -0.46 0.15 +- p2(v3): 0.11 0.4 -0.063 -0.18 +- p1(v1): -0.35 -0.24 0.14 -0.18 +- p4(v2): 0.14 -0.34 -0.084 0.087 - p5(v6): -0.25 -0.5 0.22 -0.033 - f4 - flags: bottom simplicial - normal: -0.6536 0.3379 -0.424 -0.5281 - offset: -0.1850304 - - vertices: p3(v4) p0(v3) p2(v2) p1(v0) + - vertices: p3(v5) p0(v4) p2(v3) p1(v1) - neighboring facets: f6 f8 f10 f5 - f5 - flags: top simplicial - normal: 0.6142 0.09488 -0.7743 0.1197 - offset: -0.1313181 - - vertices: p3(v4) p0(v3) p2(v2) p4(v1) + - vertices: p3(v5) p0(v4) p2(v3) p4(v2) - neighboring facets: f7 f9 f11 f4 - f6 - flags: top simplicial - normal: -0.4209 0.3853 0.2879 0.7691 - offset: 0.04819078 - - vertices: p5(v6) p0(v3) p2(v2) p1(v0) + - vertices: p5(v6) p0(v4) p2(v3) p1(v1) - neighboring facets: f4 f8 f10 f7 - f7 - flags: bottom simplicial - normal: -0.1759 0.3066 0.2842 0.8912 - offset: 0.07466537 - - vertices: p5(v6) p0(v3) p2(v2) p4(v1) + - vertices: p5(v6) p0(v4) p2(v3) p4(v2) - neighboring facets: f5 f9 f11 f6 - f8 - flags: bottom simplicial - normal: 0.2584 0.07433 0.814 -0.515 - offset: -0.09844114 - - vertices: p5(v6) p3(v4) p2(v2) p1(v0) + - vertices: p5(v6) p3(v5) p2(v3) p1(v1) - neighboring facets: f4 f6 f10 f9 - f9 - flags: top simplicial - normal: 0.6576 -0.06072 0.7252 -0.195 - offset: -0.03612816 - - vertices: p5(v6) p3(v4) p2(v2) p4(v1) + - vertices: p5(v6) p3(v5) p2(v3) p4(v2) - neighboring facets: f5 f7 f11 f8 - f10 - flags: top simplicial - normal: -0.3537 -0.6003 -0.2017 -0.6883 - offset: -0.3651888 - - vertices: p5(v6) p3(v4) p0(v3) p1(v0) + - vertices: p5(v6) p3(v5) p0(v4) p1(v1) - neighboring facets: f4 f6 f8 f11 - f11 - flags: bottom simplicial - normal: 0.2962 -0.865 -0.2123 -0.3449 - offset: -0.3220787 - - vertices: p5(v6) p3(v4) p0(v3) p4(v1) + - vertices: p5(v6) p3(v5) p0(v4) p4(v2) - neighboring facets: f5 f7 f9 f10 -Output completed. Verifying that all points are below 3e-015 of +Output completed. Verifying that all points are below 3e-15 of all facets. Will make 48 distance computations. rbox 6 D4 | qhull i 8 @@ -6594,15 +9221,15 @@ Statistics for: rbox 1000 s D2 | qhull FA Tcv Number of points processed: 1000 - Number of hyperplanes created: 1998 - Number of distance tests for qhull: 13978 - CPU seconds to compute hull (after input): 0 + Number of hyperplanes created: 1997 + Number of distance tests for qhull: 13977 + CPU seconds to compute hull (after input): 0.044 Total facet area: 3.1415592 Total volume: 0.7853647 qhull output completed. Verifying that 1000 points are -below 1.3e-015 of the nearest facet. +below 1.3e-15 of the nearest facet. rbox 1000 s | qhull FA Tcv Convex hull of 1000 points in 3-d: @@ -6613,15 +9240,15 @@ Statistics for: rbox 1000 s | qhull FA Tcv Number of points processed: 1000 - Number of hyperplanes created: 5545 - Number of distance tests for qhull: 25488 - CPU seconds to compute hull (after input): 0.015 + Number of hyperplanes created: 5544 + Number of distance tests for qhull: 25487 + CPU seconds to compute hull (after input): 0.034 Total facet area: 3.1201951 Total volume: 0.51650274 qhull output completed. Verifying that 1000 points are -below 2.1e-015 of the nearest facet. +below 2.1e-15 of the nearest facet. rbox c D4 | qhull FA Tcv Convex hull of 16 points in 4-d: @@ -6633,10 +9260,10 @@ Statistics for: rbox c D4 | qhull FA Tcv Number of points processed: 16 - Number of hyperplanes created: 26 - Number of distance tests for qhull: 168 - Number of distance tests for merging: 788 - Number of distance tests for checking: 144 + Number of hyperplanes created: 25 + Number of distance tests for qhull: 167 + Number of distance tests for merging: 510 + Number of distance tests for checking: 412 Number of merged facets: 36 CPU seconds to compute hull (after input): 0 Approximate facet area: 8 @@ -6656,17 +9283,16 @@ Statistics for: rbox c D5 | qhull FA Tcv Number of points processed: 32 - Number of hyperplanes created: 87 - Number of distance tests for qhull: 722 - Number of distance tests for merging: 2775 - Number of distance tests for checking: 352 + Number of hyperplanes created: 86 + Number of distance tests for qhull: 721 + Number of distance tests for merging: 2702 + Number of distance tests for checking: 400 Number of merged facets: 210 - CPU seconds to compute hull (after input): 0 + CPU seconds to compute hull (after input): 0.002 Approximate facet area: 10 Approximate volume: 1 -QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point -is outside of a facet. See qh-optq.htm#Qx +QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point is outside of a facet. See qh-optq.htm#Qx Output completed. Verifying that all points are below outer planes of all facets. Will make 320 distance computations. @@ -6681,17 +9307,16 @@ Statistics for: rbox c D5 | qhull FA Qt Tcv Number of points processed: 32 - Number of hyperplanes created: 87 - Number of distance tests for qhull: 722 - Number of distance tests for merging: 3235 - Number of distance tests for checking: 352 + Number of hyperplanes created: 86 + Number of distance tests for qhull: 721 + Number of distance tests for merging: 2702 + Number of distance tests for checking: 400 Number of merged facets: 210 - CPU seconds to compute hull (after input): 0.015 + CPU seconds to compute hull (after input): 0.004 Approximate facet area: 10 Approximate volume: 1 -QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point -is outside of a facet. See qh-optq.htm#Qx +QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point is outside of a facet. See qh-optq.htm#Qx Output completed. Verifying that all points are below outer planes of all facets. Will make 10112 distance computations. @@ -6707,12 +9332,12 @@ Number of points processed: 10 Number of hyperplanes created: 28 Number of facets in hull: 16 - Number of distance tests for qhull: 48 + Number of distance tests for qhull: 47 CPU seconds to compute hull (after input): 0 Total facet area: 0.46254269 -Output completed. Verifying that all points are below 2.1e-015 of +Output completed. Verifying that all points are below 2.1e-15 of all facets. Will make 140 distance computations. rbox 10 D2 | qhull d Qu FA Tcv @@ -6726,12 +9351,12 @@ Number of points processed: 10 Number of hyperplanes created: 28 Number of facets in hull: 16 - Number of distance tests for qhull: 48 + Number of distance tests for qhull: 47 CPU seconds to compute hull (after input): 0 Total facet area: 0.46254269 -Output completed. Verifying that all points are below 2.1e-015 of +Output completed. Verifying that all points are below 2.1e-15 of all facets. Will make 20 distance computations. rbox 10 D2 | qhull FA Tcv @@ -6743,14 +9368,14 @@ Statistics for: rbox 10 D2 | qhull FA Tcv Number of points processed: 4 - Number of hyperplanes created: 6 - Number of distance tests for qhull: 52 + Number of hyperplanes created: 5 + Number of distance tests for qhull: 51 CPU seconds to compute hull (after input): 0 Total facet area: 2.8999576 Total volume: 0.46254269 -Output completed. Verifying that all points are below 1.3e-015 of +Output completed. Verifying that all points are below 1.3e-15 of all facets. Will make 40 distance computations. rbox 10 c D2 | qhull Fx Tcv 4 @@ -6759,14 +9384,14 @@ 13 11 -Output completed. Verifying that all points are below 1.3e-015 of +Output completed. Verifying that all points are below 1.3e-15 of all facets. Will make 56 distance computations. rbox 1000 s | qhull FS Tcv 0 -2 3.12019513507746 0.516502736886338 +2 3.120195135077461 0.516502736886338 qhull output completed. Verifying that 1000 points are -below 2.1e-015 of the nearest facet. +below 2.1e-15 of the nearest facet. rbox 10 W0 D2 | qhull p Qc FcC Tcv 2 10 @@ -6776,7 +9401,7 @@ 0.3748708151978168 0.5 -0.01474997775140219 0.5 0.1582814042067914 0.5 - -0.5 0.45089279622854 + -0.5 0.4508927962285399 -0.5 -0.003085198815060031 -0.3688616616361418 -0.5 -0.2798755283280048 0.5 @@ -6788,15 +9413,28 @@ 5 2 4 5 9 1 2 5 -0.003004576780837498 -8.023127287351645e-018 - -0.5 0.22390379870674 +0.003004576780837498 -8.023127287351645e-18 + -0.5 0.2239037987067399 -0.4344308308180709 -0.25154259940753 --0.4431538257684129 0.47544639811427 +-0.4431538257684129 0.4754463981142699 -0.005718418169504469 0.5 Output completed. Verifying that all points are below outer planes of all facets. Will make 50 distance computations. rbox 4 z h s D2 | qhull Fd s n FD Tcv + +Convex hull of 4 points in 2-d: + + Number of vertices: 4 + Number of facets: 4 + +Statistics for: rbox 4 z h s D2 | qhull Fd s n FD Tcv + + Number of points processed: 4 + Number of hyperplanes created: 5 + Number of distance tests for qhull: 4 + CPU seconds to compute hull (after input): 0 + rbox 4 z h s D2 | qhull Fd s n FD Tcv begin 4 3 real @@ -6806,37 +9444,48 @@ 864878.4439653738 0.3984446264475182 0.9171923896626583 end -Convex hull of 4 points in 2-d: +Output completed. Verifying that all points are below 2.6e-09 of +all facets. Will make 16 distance computations. +rbox 6 s D3 | qhull C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213781421 Centrum-premerge- 0.1 Qcoplanar-keep FFacets-xridge + summary FQhull Finner normals Fouter FQhull FIDs Fmerges Fneighbors + FNeighbors-vertex FOptions FQhull Fsummary FSize FVertex-average + Tcheck-frequently Tverify Fvertices _max-width 0.86 + Error-roundoff 6.6e-16 _one-merge 0.3 _near-inside 1.5 + Visible-distance 0.1 U-max-coplanar 0.1 Width-outside 0.2 _wide-facet 0.6 + +Convex hull of 6 points in 3-d: Number of vertices: 4 + Number of coplanar points: 2 Number of facets: 4 -Statistics for: rbox 4 z h s D2 | qhull Fd s n FD Tcv +Statistics for: rbox 6 s D3 | qhull C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv Number of points processed: 4 - Number of hyperplanes created: 6 - Number of distance tests for qhull: 5 + Number of hyperplanes created: 4 + Number of distance tests for qhull: 22 CPU seconds to compute hull (after input): 0 + Total facet area: 0.82966766 + Total volume: 0.010511079 + Maximum distance of point above facet: 0.11 (0.4x) - -Output completed. Verifying that all points are below 2.6e-009 of -all facets. Will make 16 distance computations. -rbox 6 s D3 | qhull C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv Vertices and facets: -- p1(v2): -0.3 0.39 -0.092 -- p5(v1): 0.4 -0.22 -0.2 -- p4(v0): -0.46 -0.19 -0.018 -- p2(v3): 0.25 0.28 -0.33 +- p1(v3): -0.3 0.39 -0.092 +- p5(v2): 0.4 -0.22 -0.2 +- p4(v1): -0.46 -0.19 -0.018 +- p2(v4): 0.25 0.28 -0.33 - f1 - - flags: top simplicial + - flags: top simplicial isarea - area: 0.26 - normal: 0.2054 0.06987 0.9762 - offset: 0.125398 - center: -0.1205015151724569 -0.008790385787885074 -0.1024776532548504 - - vertices: p1(v2) p5(v1) p4(v0) + - vertices: p1(v3) p5(v2) p4(v1) - neighboring facets: f2 f3 f4 - f2 - - flags: bottom simplicial + - flags: bottom simplicial isarea - area: 0.23 - normal: -0.2032 -0.3001 -0.932 - offset: -0.1680571 @@ -6846,23 +9495,23 @@ p0: 0.07025 -0.4742 -0.142 p3: 0.2976 -0.2965 -0.2712 furthest distance= 0.11 - - vertices: p2(v3) p5(v1) p4(v0) + - vertices: p2(v4) p5(v2) p4(v1) - neighboring facets: f1 f3 f4 - f3 - - flags: top simplicial + - flags: top simplicial isarea - area: 0.18 - normal: -0.3912 -0.01238 -0.9202 - offset: -0.1989549 - center: -0.1715856748140029 0.1590825675964338 -0.1454013928109104 - - vertices: p2(v3) p1(v2) p4(v0) + - vertices: p2(v4) p1(v3) p4(v1) - neighboring facets: f1 f2 f4 - f4 - - flags: bottom simplicial + - flags: bottom simplicial isarea - area: 0.16 - normal: 0.4184 0.3424 0.8413 - offset: 0.07254957 - center: 0.116549362001881 0.1503252206347392 -0.2053893818610149 - - vertices: p2(v3) p1(v2) p5(v1) + - vertices: p2(v4) p1(v3) p5(v2) - neighboring facets: f1 f2 f3 rbox 6 s D3 | qhull C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv 4 @@ -6879,8 +9528,8 @@ 0.4183781509471984 0.3424157187037644 0.8412557271095321 0.0725495687466966 4 4 -0.205360378770873 0.06987429109559466 0.976188864039624 0.1253980026939627 --0.2031613339148238 -0.3001304507855299 -0.9320124381751694 -0.2813242952138536 +0.205360378770873 0.06987429109559466 0.976188864039624 0.1253980026939626 +-0.2031613339148238 -0.3001304507855299 -0.9320124381751694 -0.2813242952138535 -0.3911895500493898 -0.01238286325891905 -0.9202268202077502 -0.1989548866041498 0.4183781509471984 0.3424157187037644 0.8412557271095321 0.07254956874669528 rbox 6 s D3 | qhull C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv @@ -6906,17 +9555,16 @@ 1 1 3 2 0 1 3 3 0 1 -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99227333 Centrum-premerge- 0.1 Qcoplanar-keep FFacets-xridge +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213781421 Centrum-premerge- 0.1 Qcoplanar-keep FFacets-xridge summary FQhull Finner normals Fouter FQhull FIDs Fmerges Fneighbors FNeighbors-vertex FOptions FQhull Fsummary FSize FVertex-average Tcheck-frequently Tverify Fvertices _max-width 0.86 - Error-roundoff 6.6e-016 _one-merge 0.3 _near-inside 1.5 - Visible-distance 0.1 U-coplanar-distance 0.1 Width-outside 0.2 - _wide-facet 0.6 + Error-roundoff 6.6e-16 _one-merge 0.3 _near-inside 1.5 + Visible-distance 0.1 U-max-coplanar 0.1 Width-outside 0.2 _wide-facet 0.6 rbox 6 s D3 | qhull C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv 10 3 6 4 4 4 4 2 0 0 0 -2 0.1132672327102437 -1.315898280434284e-015 +2 0.1132672327102437 -1.315898280434284e-15 0 2 0.8296676646636063 0.01051107893821417 3 1 @@ -6926,43 +9574,18 @@ 3 2 5 4 3 2 1 4 3 2 1 5 -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99227333 Centrum-premerge- 0.1 Qcoplanar-keep FFacets-xridge - summary FQhull Finner normals Fouter FQhull FIDs Fmerges Fneighbors - FNeighbors-vertex FOptions FQhull Fsummary FSize FVertex-average - Tcheck-frequently Tverify Fvertices _max-width 0.86 - Error-roundoff 6.6e-016 _one-merge 0.3 _near-inside 1.5 - Visible-distance 0.1 U-coplanar-distance 0.1 Width-outside 0.2 - _wide-facet 0.6 - -Convex hull of 6 points in 3-d: - - Number of vertices: 4 - Number of coplanar points: 2 - Number of facets: 4 - -Statistics for: rbox 6 s D3 | qhull C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv - - Number of points processed: 4 - Number of hyperplanes created: 5 - Number of distance tests for qhull: 24 - CPU seconds to compute hull (after input): 0 - Total facet area: 0.82966766 - Total volume: 0.010511079 - Maximum distance of point above facet: 0.11 (0.4x) - Output completed. Verifying that all points are below outer planes of all facets. Will make 24 distance computations. rbox P0.5,0.5 P0.5,0.5 W0 5 D2 | qhull d FN Qc 7 -5 3 0 2 -7 -8 -1 0 -5 -10 1 -6 -7 -8 -4 -6 1 0 2 -3 -7 2 -6 +5 3 1 0 -4 -8 +1 1 +5 -10 2 -3 -4 -8 +4 2 -3 0 1 +3 -4 0 -3 3 -10 -8 3 -4 -10 1 0 3 +4 -10 2 1 3 rbox 10 D3 | qhull Fa PA5 5 0.2844546842397038 @@ -6971,13 +9594,29 @@ 0.07490600482805046 0.2087585943133527 rbox 10 D3 | qhull Fa PF0.4 -0 QH7055 qhull warning: no facets printed +0 -echo === test Qt ${d:-`date`} -date -=== test Qt Mon Jan 18 21:22:32 EST 2016 +set +v +=== test Qt Fri, Jul 24, 2020 10:27:31 PM rbox c | qhull Qt s o Tcv + +Convex hull of 8 points in 3-d: + + Number of vertices: 8 + Number of facets: 12 + Number of triangulated facets: 6 + +Statistics for: rbox c | qhull Qt s o Tcv + + Number of points processed: 8 + Number of hyperplanes created: 11 + Number of distance tests for qhull: 34 + Number of distance tests for merging: 96 + Number of distance tests for checking: 100 + Number of merged facets: 6 + CPU seconds to compute hull (after input): 0 + 3 8 12 18 -0.5 -0.5 -0.5 @@ -7001,58 +9640,41 @@ 3 3 5 1 3 5 3 7 -Convex hull of 8 points in 3-d: - - Number of vertices: 8 - Number of facets: 12 - Number of triangulated facets: 6 - -Statistics for: rbox c | qhull Qt s o Tcv - - Number of points processed: 8 - Number of hyperplanes created: 11 - Number of distance tests for qhull: 35 - Number of distance tests for merging: 166 - Number of distance tests for checking: 56 - Number of merged facets: 6 - CPU seconds to compute hull (after input): 0 - - Output completed. Verifying that all points are below outer planes of all facets. Will make 96 distance computations. rbox c | qhull Qt f i Vertices and facets: - p6(v6): 0.5 0.5 -0.5 neighbors: f17 f18 f25 f27 f33 f34 -- p2(v2): -0.5 0.5 -0.5 +- p2(v3): -0.5 0.5 -0.5 neighbors: f17 f29 f33 -- p0(v0): -0.5 -0.5 -0.5 +- p0(v1): -0.5 -0.5 -0.5 neighbors: f17 f18 f21 f22 f29 f30 -- p4(v1): 0.5 -0.5 -0.5 +- p4(v2): 0.5 -0.5 -0.5 neighbors: f18 f21 f25 - p5(v7): 0.5 -0.5 0.5 neighbors: f21 f22 f25 f27 f37 f38 -- p1(v3): -0.5 -0.5 0.5 +- p1(v4): -0.5 -0.5 0.5 neighbors: f22 f30 f37 - p7(v5): 0.5 0.5 0.5 neighbors: f27 f34 f38 - p3(v8): -0.5 0.5 0.5 neighbors: f29 f30 f33 f34 f37 f38 - f17 - - flags: top simplicial tricoplanar seen keepcentrum + - flags: top simplicial tricoplanar keepcentrum - owner of normal & centrum is facet f17 - normal: -0 -0 -1 - offset: -0.5 - center: 0 0 -0.5 - - vertices: p6(v6) p2(v2) p0(v0) + - vertices: p6(v6) p2(v3) p0(v1) - neighboring facets: f29 f18 f33 - f18 - - flags: bottom simplicial tricoplanar seen + - flags: bottom simplicial tricoplanar - owner of normal & centrum is facet f17 - normal: -0 -0 -1 - offset: -0.5 - center: 0 0 -0.5 - - vertices: p6(v6) p4(v1) p0(v0) + - vertices: p6(v6) p4(v2) p0(v1) - neighboring facets: f21 f17 f25 - f21 - flags: top simplicial tricoplanar keepcentrum @@ -7060,15 +9682,15 @@ - normal: 0 -1 0 - offset: -0.5 - center: 0 -0.5 0 - - vertices: p5(v7) p4(v1) p0(v0) + - vertices: p5(v7) p4(v2) p0(v1) - neighboring facets: f18 f22 f25 - f22 - - flags: bottom simplicial tricoplanar seen + - flags: bottom simplicial tricoplanar - owner of normal & centrum is facet f21 - normal: 0 -1 0 - offset: -0.5 - center: 0 -0.5 0 - - vertices: p5(v7) p1(v3) p0(v0) + - vertices: p5(v7) p1(v4) p0(v1) - neighboring facets: f30 f21 f37 - f25 - flags: top simplicial tricoplanar keepcentrum @@ -7076,10 +9698,10 @@ - normal: 1 -0 -0 - offset: -0.5 - center: 0.5 0 0 - - vertices: p5(v7) p6(v6) p4(v1) + - vertices: p5(v7) p6(v6) p4(v2) - neighboring facets: f18 f21 f27 - f27 - - flags: bottom simplicial tricoplanar seen + - flags: bottom simplicial tricoplanar - owner of normal & centrum is facet f25 - normal: 1 -0 -0 - offset: -0.5 @@ -7092,7 +9714,7 @@ - normal: -1 -0 -0 - offset: -0.5 - center: -0.5 0 0 - - vertices: p3(v8) p2(v2) p0(v0) + - vertices: p3(v8) p2(v3) p0(v1) - neighboring facets: f17 f30 f33 - f30 - flags: top simplicial tricoplanar @@ -7100,7 +9722,7 @@ - normal: -1 -0 -0 - offset: -0.5 - center: -0.5 0 0 - - vertices: p3(v8) p1(v3) p0(v0) + - vertices: p3(v8) p1(v4) p0(v1) - neighboring facets: f22 f29 f37 - f33 - flags: bottom simplicial tricoplanar keepcentrum @@ -7108,7 +9730,7 @@ - normal: 0 1 -0 - offset: -0.5 - center: 0 0.5 0 - - vertices: p3(v8) p6(v6) p2(v2) + - vertices: p3(v8) p6(v6) p2(v3) - neighboring facets: f17 f29 f34 - f34 - flags: top simplicial tricoplanar @@ -7124,7 +9746,7 @@ - normal: -0 -0 1 - offset: -0.5 - center: 0 0 0.5 - - vertices: p3(v8) p5(v7) p1(v3) + - vertices: p3(v8) p5(v7) p1(v4) - neighboring facets: f22 f30 f38 - f38 - flags: bottom simplicial tricoplanar @@ -7280,19 +9902,6 @@ 6 7 rbox c | qhull Qt FA s Fa -12 - 0.5 - 0.5 - 0.5 - 0.5 - 0.5 - 0.5 - 0.5 - 0.5 - 0.5 - 0.5 - 0.5 - 0.5 Convex hull of 8 points in 3-d: @@ -7304,14 +9913,27 @@ Number of points processed: 8 Number of hyperplanes created: 11 - Number of distance tests for qhull: 35 - Number of distance tests for merging: 108 - Number of distance tests for checking: 56 + Number of distance tests for qhull: 34 + Number of distance tests for merging: 90 + Number of distance tests for checking: 48 Number of merged facets: 6 CPU seconds to compute hull (after input): 0 Approximate facet area: 6 Approximate volume: 1 +12 + 0.5 + 0.5 + 0.5 + 0.5 + 0.5 + 0.5 + 0.5 + 0.5 + 0.5 + 0.5 + 0.5 + 0.5 rbox 6 r s c G0.1 D2 | qhull Qt d FA Tcv Delaunay triangulation by the convex hull of 10 points in 3-d: @@ -7323,11 +9945,11 @@ Statistics for: rbox 6 r s c G0.1 D2 | qhull Qt d FA Tcv Number of points processed: 10 - Number of hyperplanes created: 20 + Number of hyperplanes created: 19 Number of facets in hull: 16 - Number of distance tests for qhull: 51 - Number of distance tests for merging: 257 - Number of distance tests for checking: 100 + Number of distance tests for qhull: 48 + Number of distance tests for merging: 170 + Number of distance tests for checking: 164 Number of merged facets: 7 CPU seconds to compute hull (after input): 0 Approximate facet area: 0.64951905 @@ -7346,11 +9968,11 @@ Statistics for: rbox 6 r s c G0.1 D2 | qhull d FA Tcv Number of points processed: 10 - Number of hyperplanes created: 20 + Number of hyperplanes created: 19 Number of facets in hull: 10 - Number of distance tests for qhull: 51 - Number of distance tests for merging: 239 - Number of distance tests for checking: 100 + Number of distance tests for qhull: 48 + Number of distance tests for merging: 170 + Number of distance tests for checking: 164 Number of merged facets: 7 CPU seconds to compute hull (after input): 0 Approximate facet area: 0.64951905 @@ -7367,75 +9989,101 @@ 0.3359969878447702 -0.1939879513790819 0.3359969878447707 0.1939879513790815 0.2875 0 --2.220446049250313e-016 -0.3453321730569308 --2.220446049250313e-016 -0.3453321730569308 -1.110223024625157e-016 0.3453321730569308 -1.110223024625157e-016 0.3453321730569308 +-2.220446049250313e-16 -0.3453321730569308 +-2.220446049250313e-16 -0.3453321730569308 +1.110223024625157e-16 0.3453321730569308 +1.110223024625157e-16 0.3453321730569308 0 0 0 0 Output completed. Verifying that all points are below outer planes of all facets. Will make 120 distance computations. rbox c | qhull Qt C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213798228 Qtriangulate Centrum-premerge- 0.1 Qcoplanar-keep + FFacets-xridge summary FQhull Finner normals Fouter FQhull FIDs + Fmerges Fneighbors FNeighbors-vertex FOptions FQhull Fsummary FSize + FVertex-average Tcheck-frequently Tverify Fvertices _max-width 1 + Error-roundoff 6.9e-16 _one-merge 0.3 _near-inside 1.5 + Visible-distance 0.1 U-max-coplanar 0.1 Width-outside 0.2 _wide-facet 0.6 + +Convex hull of 8 points in 3-d: + + Number of vertices: 8 + Number of facets: 12 + Number of triangulated facets: 6 + +Statistics for: rbox c | qhull Qt C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv + + Number of points processed: 8 + Number of hyperplanes created: 11 + Number of distance tests for qhull: 34 + Number of distance tests for merging: 102 + Number of distance tests for checking: 126 + Number of merged facets: 6 + CPU seconds to compute hull (after input): 0 + Approximate facet area: 6 + Approximate volume: 1 + Vertices and facets: - p6(v6): 0.5 0.5 -0.5 neighbors: f17 f18 f25 f27 f33 f34 -- p2(v2): -0.5 0.5 -0.5 +- p2(v3): -0.5 0.5 -0.5 neighbors: f17 f29 f33 -- p0(v0): -0.5 -0.5 -0.5 +- p0(v1): -0.5 -0.5 -0.5 neighbors: f17 f18 f21 f22 f29 f30 -- p4(v1): 0.5 -0.5 -0.5 +- p4(v2): 0.5 -0.5 -0.5 neighbors: f18 f21 f25 - p5(v7): 0.5 -0.5 0.5 neighbors: f21 f22 f25 f27 f37 f38 -- p1(v3): -0.5 -0.5 0.5 +- p1(v4): -0.5 -0.5 0.5 neighbors: f22 f30 f37 - p7(v5): 0.5 0.5 0.5 neighbors: f27 f34 f38 - p3(v8): -0.5 0.5 0.5 neighbors: f29 f30 f33 f34 f37 f38 - f17 - - flags: top simplicial tricoplanar keepcentrum + - flags: top simplicial tricoplanar isarea keepcentrum - area: 0.5 - normal: -0 -0 -1 - offset: -0.5 - center: 0 0 -0.5 - - vertices: p6(v6) p2(v2) p0(v0) + - vertices: p6(v6) p2(v3) p0(v1) - neighboring facets: f29 f18 f33 - f18 - - flags: bottom simplicial tricoplanar + - flags: bottom simplicial tricoplanar isarea - area: 0.5 - normal: -0 -0 -1 - offset: -0.5 - center: 0 0 -0.5 - - vertices: p6(v6) p4(v1) p0(v0) + - vertices: p6(v6) p4(v2) p0(v1) - neighboring facets: f21 f17 f25 - f21 - - flags: top simplicial tricoplanar keepcentrum + - flags: top simplicial tricoplanar isarea keepcentrum - area: 0.5 - normal: 0 -1 0 - offset: -0.5 - center: 0 -0.5 0 - - vertices: p5(v7) p4(v1) p0(v0) + - vertices: p5(v7) p4(v2) p0(v1) - neighboring facets: f18 f22 f25 - f22 - - flags: bottom simplicial tricoplanar + - flags: bottom simplicial tricoplanar isarea - area: 0.5 - normal: 0 -1 0 - offset: -0.5 - center: 0 -0.5 0 - - vertices: p5(v7) p1(v3) p0(v0) + - vertices: p5(v7) p1(v4) p0(v1) - neighboring facets: f30 f21 f37 - f25 - - flags: top simplicial tricoplanar keepcentrum + - flags: top simplicial tricoplanar isarea keepcentrum - area: 0.5 - normal: 1 -0 -0 - offset: -0.5 - center: 0.5 0 0 - - vertices: p5(v7) p6(v6) p4(v1) + - vertices: p5(v7) p6(v6) p4(v2) - neighboring facets: f18 f21 f27 - f27 - - flags: bottom simplicial tricoplanar + - flags: bottom simplicial tricoplanar isarea - area: 0.5 - normal: 1 -0 -0 - offset: -0.5 @@ -7443,31 +10091,31 @@ - vertices: p5(v7) p6(v6) p7(v5) - neighboring facets: f34 f38 f25 - f29 - - flags: bottom simplicial tricoplanar keepcentrum + - flags: bottom simplicial tricoplanar isarea keepcentrum - area: 0.5 - normal: -1 -0 -0 - offset: -0.5 - center: -0.5 0 0 - - vertices: p3(v8) p2(v2) p0(v0) + - vertices: p3(v8) p2(v3) p0(v1) - neighboring facets: f17 f30 f33 - f30 - - flags: top simplicial tricoplanar + - flags: top simplicial tricoplanar isarea - area: 0.5 - normal: -1 -0 -0 - offset: -0.5 - center: -0.5 0 0 - - vertices: p3(v8) p1(v3) p0(v0) + - vertices: p3(v8) p1(v4) p0(v1) - neighboring facets: f22 f29 f37 - f33 - - flags: bottom simplicial tricoplanar keepcentrum + - flags: bottom simplicial tricoplanar isarea keepcentrum - area: 0.5 - normal: 0 1 -0 - offset: -0.5 - center: 0 0.5 0 - - vertices: p3(v8) p6(v6) p2(v2) + - vertices: p3(v8) p6(v6) p2(v3) - neighboring facets: f17 f29 f34 - f34 - - flags: top simplicial tricoplanar + - flags: top simplicial tricoplanar isarea - area: 0.5 - normal: 0 1 -0 - offset: -0.5 @@ -7475,15 +10123,15 @@ - vertices: p3(v8) p6(v6) p7(v5) - neighboring facets: f27 f38 f33 - f37 - - flags: top simplicial tricoplanar keepcentrum + - flags: top simplicial tricoplanar isarea keepcentrum - area: 0.5 - normal: -0 -0 1 - offset: -0.5 - center: 0 0 0.5 - - vertices: p3(v8) p5(v7) p1(v3) + - vertices: p3(v8) p5(v7) p1(v4) - neighboring facets: f22 f30 f38 - f38 - - flags: bottom simplicial tricoplanar + - flags: bottom simplicial tricoplanar isarea - area: 0.5 - normal: -0 -0 1 - offset: -0.5 @@ -7582,17 +10230,16 @@ 6 11 5 4 2 3 10 6 9 5 4 1 0 8 3 11 5 9 -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99244140 Qtriangulate Centrum-premerge- 0.1 Qcoplanar-keep +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213798228 Qtriangulate Centrum-premerge- 0.1 Qcoplanar-keep FFacets-xridge summary FQhull Finner normals Fouter FQhull FIDs Fmerges Fneighbors FNeighbors-vertex FOptions FQhull Fsummary FSize FVertex-average Tcheck-frequently Tverify Fvertices _max-width 1 - Error-roundoff 6.9e-016 _one-merge 0.3 _near-inside 1.5 - Visible-distance 0.1 U-coplanar-distance 0.1 Width-outside 0.2 - _wide-facet 0.6 + Error-roundoff 6.9e-16 _one-merge 0.3 _near-inside 1.5 + Visible-distance 0.1 U-max-coplanar 0.1 Width-outside 0.2 _wide-facet 0.6 rbox c | qhull Qt C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv 10 3 8 8 12 8 12 0 0 0 6 -2 1.387359992873471e-015 -6.936799964367356e-016 +2 1.387359992873471e-15 -6.936799964367356e-16 0 2 6 1 3 1 @@ -7610,44 +10257,15 @@ 3 3 6 7 3 3 5 1 3 3 5 7 -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99244140 Qtriangulate Centrum-premerge- 0.1 Qcoplanar-keep - FFacets-xridge summary FQhull Finner normals Fouter FQhull FIDs - Fmerges Fneighbors FNeighbors-vertex FOptions FQhull Fsummary FSize - FVertex-average Tcheck-frequently Tverify Fvertices _max-width 1 - Error-roundoff 6.9e-016 _one-merge 0.3 _near-inside 1.5 - Visible-distance 0.1 U-coplanar-distance 0.1 Width-outside 0.2 - _wide-facet 0.6 - -Convex hull of 8 points in 3-d: - - Number of vertices: 8 - Number of facets: 12 - Number of triangulated facets: 6 - -Statistics for: rbox c | qhull Qt C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv - - Number of points processed: 8 - Number of hyperplanes created: 11 - Number of distance tests for qhull: 35 - Number of distance tests for merging: 198 - Number of distance tests for checking: 56 - Number of merged facets: 6 - CPU seconds to compute hull (after input): 0 - Approximate facet area: 6 - Approximate volume: 1 - Output completed. Verifying that all points are below outer planes of all facets. Will make 96 distance computations. rbox 6 r s c G0.1 D2 P0.1,0.1 | qhull s FP d FO Qt -1 -0 10 36 0 -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99244140 summary FPoint-nearest delaunay Qtriangulate _pre-merge - _zero-centrum Pgood Qcoplanar _max-width 1 Error-roundoff 6.9e-016 - _one-merge 4.9e-015 _near-inside 2.4e-014 Visible-distance 1.4e-015 - U-coplanar-distance 1.4e-015 Width-outside 2.8e-015 _wide-facet 8.3e-015 +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213798228 summary FPoint-nearest delaunay Qtriangulate _pre-merge + _zero-centrum Pgood Qcoplanar _max-width 1 Error-roundoff 6.9e-16 + _one-merge 4.9e-15 _near-inside 2.4e-14 Visible-distance 1.4e-15 + U-max-coplanar 1.4e-15 Width-outside 2.8e-15 _wide-facet 8.3e-15 Delaunay triangulation by the convex hull of 11 points in 3-d: @@ -7659,15 +10277,22 @@ Statistics for: rbox 6 r s c G0.1 D2 P0.1,0.1 | qhull s FP d FO Qt Number of points processed: 10 - Number of hyperplanes created: 20 + Number of hyperplanes created: 19 Number of facets in hull: 16 - Number of distance tests for qhull: 83 - Number of distance tests for merging: 166 - Number of distance tests for checking: 111 + Number of distance tests for qhull: 79 + Number of distance tests for merging: 153 + Number of distance tests for checking: 100 Number of merged facets: 6 CPU seconds to compute hull (after input): 0 -rbox 100 W0 | qhull Tv Q11 +1 +0 10 36 0 +rbox 100 W0 | qhull Tv Q11 FO +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213798228 Tverify Q11-trinormals Qtriangulate _pre-merge + _zero-centrum _max-width 1 Error-roundoff 6.9e-16 _one-merge 4.9e-15 + _near-inside 2.4e-14 Visible-distance 1.4e-15 U-max-coplanar 1.4e-15 + Width-outside 2.8e-15 _wide-facet 8.3e-15 Convex hull of 100 points in 3-d: @@ -7675,13 +10300,13 @@ Number of facets: 86 Number of triangulated facets: 33 -Statistics for: rbox 100 W0 | qhull Tv Q11 +Statistics for: rbox 100 W0 | qhull Tv Q11 FO Number of points processed: 52 - Number of hyperplanes created: 172 - Number of distance tests for qhull: 1576 - Number of distance tests for merging: 1498 - Number of distance tests for checking: 2172 + Number of hyperplanes created: 171 + Number of distance tests for qhull: 1575 + Number of distance tests for merging: 1368 + Number of distance tests for checking: 1131 Number of merged facets: 41 CPU seconds to compute hull (after input): 0 @@ -7689,42 +10314,20 @@ Output completed. Verifying that all points are below outer planes of all facets. Will make 8600 distance computations. -echo === test unbounded intersection ${d:-`date`} -date -=== test unbounded intersection Mon Jan 18 21:22:33 EST 2016 +set +v +=== test unbounded intersection Fri, Jul 24, 2020 10:27:32 PM rbox c | qhull PD0:0.5 n | qhull H0 Fp Tcv 3 5 - -0.5 0.5 -0.5 -0.5 -0.5 -0.5 - -0.5 0.5 0.5 + -0.5 0.5 -0.5 -0.5 -0.5 0.5 + -0.5 0.5 0.5 -10.101 -10.101 -10.101 Output completed. Verifying that all points are below outer planes of all facets. Will make 25 distance computations. rbox 1000 W1e-3 D3 | qhull PA8 Fa FS s n Tcv -8 -0.1446087232094601 -0.1622198334884075 -0.2057158590759609 -0.1567143851824352 -0.188985866819172 -0.1580674614313253 -0.1616733826473112 -0.1767351337533958 -0 -2 5.881743214947514 0.9968516315221345 -4 -8 -1.009144997325421e-005 0.9999999999463923 2.319049754624652e-006 -0.4999875785488853 --1.229609861584452e-005 8.587946880918045e-005 0.9999999962367613 -0.500004859549355 --1.383340239672453e-005 -0.9999999998842694 6.332306547224587e-006 -0.4999917156571327 -1.802476239613105e-005 -1.901476191096464e-005 0.9999999996567733 -0.4999909156385879 -0.9999999996788914 1.780140020603311e-005 -1.803683546259361e-005 -0.4999971349013697 -3.470111681088057e-006 -3.668365732095583e-005 -0.9999999993211337 -0.4999893476858696 --1.633273154317779e-005 -0.9999999998072314 1.089857916466569e-005 -0.4999921708899001 --0.9999999997878146 -2.055073083002867e-005 -1.427680287414111e-006 -0.4999990322171606 Convex hull of 1000 points in 3-d: @@ -7736,11 +10339,32 @@ Number of points processed: 203 Number of hyperplanes created: 1043 - Number of distance tests for qhull: 21470 - CPU seconds to compute hull (after input): 0 + Number of distance tests for qhull: 21452 + CPU seconds to compute hull (after input): 0.005 Total facet area: 5.8817432 Total volume: 0.99685163 +8 +0.1446087232094601 +0.1622198334884075 +0.2057158590759608 +0.1567143851824352 +0.188985866819172 +0.1580674614313252 +0.1616733826473111 +0.1767351337533958 +0 +2 5.881743214947513 0.9968516315221345 +4 +8 +1.009144997325421e-05 0.9999999999463923 2.319049754624652e-06 -0.4999875785488853 +-1.229609861584452e-05 8.587946880918045e-05 0.9999999962367613 -0.500004859549355 +-1.383340239672454e-05 -0.9999999998842694 6.332306547224586e-06 -0.4999917156571327 +1.802476239613105e-05 -1.901476191096464e-05 0.9999999996567733 -0.4999909156385879 +0.9999999996788914 1.780140020603311e-05 -1.803683546259361e-05 -0.4999971349013697 +3.470111681088057e-06 -3.668365732095583e-05 -0.9999999993211337 -0.4999893476858696 +-1.633273154317779e-05 -0.9999999998072314 1.08985791646657e-05 -0.4999921708899001 +-0.9999999997878146 -2.055073082985623e-05 -1.427680287303445e-06 -0.4999990322171605 Output completed. Verifying that all points are below outer planes of all facets. Will make 8000 distance computations. @@ -7748,53 +10372,54 @@ 10 1 1 +5 8 +6 0 6 +2 7 10 -0 -11 -6 4 10 0.6345454980886096 0.2737427089707436 0.7227841587506171 -0.7458921924784656 -0.00253733560834815 0.666653414016696 0.7453635270845322 -0.6767722083805112 +-0.003237401631533091 0.002761552371517554 -0.9999909464886048 -0.4969398742962436 -0.0004022623770974538 0.9999997831336711 0.0005214571799133833 -0.5000167453415887 --0.5357402012449896 -0.5359428531021374 -0.6524934443952053 -0.811263040246498 --0.005480509661076106 -0.9999701072857251 0.005454223027194167 -0.4992904789191579 +-0.999601787347817 0.0214081839262726 0.01838359029211947 -0.4985486000821885 +-0.4745617604911457 -0.2935495843214587 0.8298311738084099 -0.7523676152838523 +-0.005480509661076107 -0.9999701072857251 0.005454223027194169 -0.4992904789191579 +-0.9987007292177809 -0.05077399000218431 -0.004342280406757339 -0.5182179901342427 0.001196850675493193 0.0003334814784797861 0.9999992281689842 -0.4989807987213126 -0.9999992961453315 0.00118637926097064 1.459763172590229e-005 -0.4998611663332402 --0.9129791746952519 0.1462545158779729 -0.3808919048208773 -0.6797481567213483 --0.999601787347817 0.02140818392627282 0.01838359029211947 -0.4985486000821886 --0.003237401631533091 0.002761552371517554 -0.9999909464886048 -0.4969398742962436 +0.9999992961453315 0.00118637926097064 1.459763172590229e-05 -0.4998611663332402 Output completed. Verifying that all points are below outer planes of all facets. Will make 10000 distance computations. rbox 1000 W1e-3 D3 | qhull C-0.01 PA8 PG n Tcv Qc 4 -11 +12 0.6345454980886096 0.2737427089707436 0.7227841587506171 -0.7458921924784656 +-0.00253733560834815 0.666653414016696 0.7453635270845322 -0.6767722083805112 +-0.9785529186794025 -0.009694358843403266 -0.2057673558916428 -0.5832522471275383 0.8278306348810541 -0.3414688798813042 -0.4450791435520636 -0.7665474225756105 -0.7383776593319754 -0.4655216164679658 0.4879426777814023 -0.7788991125303444 -0.2008161614085187 -0.8823413491644904 0.425613219803773 -0.6982307124493008 --0.4745617604911457 -0.2935495843214587 0.8298311738084099 -0.7523676152838523 --0.8259135249806853 -0.559220008247317 0.07169261907511661 -0.6812000445406896 +0.7383776593319754 -0.4655216164679661 0.4879426777814019 -0.7788991125303445 +0.2008161614085187 -0.8823413491644904 0.4256132198037728 -0.6982307124493007 0.41932306725662 0.6721295192910486 -0.6102541065524131 -0.7755692997856908 +-0.3210285130221472 0.4863414284958994 -0.8126578054478755 -0.7591490151594069 +-0.4745617604911457 -0.2935495843214587 0.8298311738084099 -0.7523676152838523 +-0.8238864443814345 -0.556605789918439 0.1067760337987315 -0.695666244857558 -0.5357402012449896 -0.5359428531021374 -0.6524934443952053 -0.811263040246498 --0.3304054030140146 0.4364026747636864 -0.8368900615482577 -0.7495022949733237 0.6755431502353132 -0.2163920762108173 0.7048517017950092 -0.7475007704997935 --0.9129791746952519 0.1462545158779729 -0.3808919048208773 -0.6797481567213483 Output completed. Verifying that all points are below outer planes of all facets. Will make 8000 distance computations. rbox 10 | qhull FO Tz TO q_test.log.1 cat q_test.log.1 -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99244140 Tz-stdout TOutput-file q_test.log.1 _pre-merge - _zero-centrum _max-width 0.92 Error-roundoff 6.8e-016 _one-merge 4.8e-015 - _near-inside 2.4e-014 Visible-distance 1.4e-015 - U-coplanar-distance 1.4e-015 Width-outside 2.7e-015 _wide-facet 8.2e-015 +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213815035 Tz-stdout TOutput-file q_test.log.1 _pre-merge + _zero-centrum _max-width 0.92 Error-roundoff 6.8e-16 _one-merge 4.8e-15 + _near-inside 2.4e-14 Visible-distance 1.4e-15 U-max-coplanar 1.4e-15 + Width-outside 2.7e-15 _wide-facet 8.2e-15 Convex hull of 10 points in 3-d: @@ -7804,14 +10429,13 @@ Statistics for: rbox 10 | qhull FO Tz TO q_test.log.1 Number of points processed: 10 - Number of hyperplanes created: 27 - Number of distance tests for qhull: 44 + Number of hyperplanes created: 26 + Number of distance tests for qhull: 43 CPU seconds to compute hull (after input): 0 -echo === check Delaunay/Voronoi ${d:-`date`} -date -=== check Delaunay/Voronoi Mon Jan 18 21:22:33 EST 2016 +set +v +=== check Delaunay/Voronoi Fri, Jul 24, 2020 10:27:33 PM rbox 10 D2 | qhull d Tcv Delaunay triangulation by the convex hull of 10 points in 3-d: @@ -7824,29 +10448,29 @@ Number of points processed: 10 Number of hyperplanes created: 28 Number of facets in hull: 16 - Number of distance tests for qhull: 48 + Number of distance tests for qhull: 47 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 2.1e-015 of +Output completed. Verifying that all points are below 2.1e-15 of all facets. Will make 140 distance computations. -rbox 10 D2 | qhull d Tcv Qz +rbox 10 D2 | qhull d Qz Tcv Delaunay triangulation by the convex hull of 11 points in 3-d: Number of input sites and at-infinity: 11 Number of Delaunay regions: 14 -Statistics for: rbox 10 D2 | qhull d Tcv Qz +Statistics for: rbox 10 D2 | qhull d Qz Tcv Number of points processed: 11 - Number of hyperplanes created: 31 + Number of hyperplanes created: 30 Number of facets in hull: 18 - Number of distance tests for qhull: 56 - CPU seconds to compute hull (after input): 0.015 + Number of distance tests for qhull: 55 + CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 2.1e-015 of +Output completed. Verifying that all points are below 2.1e-15 of all facets. Will make 154 distance computations. rbox 10 D3 | qhull d Tcv @@ -7858,13 +10482,13 @@ Statistics for: rbox 10 D3 | qhull d Tcv Number of points processed: 10 - Number of hyperplanes created: 44 + Number of hyperplanes created: 43 Number of facets in hull: 27 - Number of distance tests for qhull: 67 + Number of distance tests for qhull: 66 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 2.9e-015 of +Output completed. Verifying that all points are below 2.9e-15 of all facets. Will make 180 distance computations. rbox c | qhull d Qz Ft Tcv 3 @@ -7882,15 +10506,15 @@ 4 9 1 2 0 4 9 2 4 0 4 9 4 1 0 -4 9 5 7 1 +4 9 7 5 4 +4 9 6 7 4 4 9 7 6 2 4 9 2 6 4 -4 9 6 7 4 +4 9 5 7 1 4 9 5 1 4 -4 9 7 5 4 +4 9 7 3 1 4 9 1 3 2 4 9 3 7 2 -4 9 7 3 1 Output completed. Verifying that all points are below outer planes of all facets. Will make 9 distance computations. @@ -7905,18 +10529,18 @@ Statistics for: rbox 10 s D2 c | qhull d Tcv Number of points processed: 14 - Number of hyperplanes created: 33 + Number of hyperplanes created: 32 Number of facets in hull: 16 - Number of distance tests for qhull: 116 - Number of distance tests for merging: 395 - Number of distance tests for checking: 182 + Number of distance tests for qhull: 115 + Number of distance tests for merging: 296 + Number of distance tests for checking: 272 Number of merged facets: 8 CPU seconds to compute hull (after input): 0 Output completed. Verifying that all points are below outer planes of all facets. Will make 210 distance computations. -rbox 10 s D2 | qhull d Tcv Q8 Qz +rbox 10 s D2 | qhull d Tcv Qz Q8 Delaunay triangulation by the convex hull of 11 points in 3-d: @@ -7924,20 +10548,18 @@ Number of Delaunay regions: 1 Number of non-simplicial Delaunay regions: 1 -Statistics for: rbox 10 s D2 | qhull d Tcv Q8 Qz +Statistics for: rbox 10 s D2 | qhull d Tcv Qz Q8 Number of points processed: 11 Number of hyperplanes created: 19 Number of facets in hull: 11 - Number of distance tests for qhull: 55 - Number of distance tests for merging: 278 - Number of distance tests for checking: 132 + Number of distance tests for qhull: 54 + Number of distance tests for merging: 201 + Number of distance tests for checking: 204 Number of merged facets: 7 CPU seconds to compute hull (after input): 0 -QH7077 qhull input warning: no outer plane check ('Q5') or no processing of -near-inside points ('Q8'). Verify may report that a point is outside -of a facet. +QH7077 qhull input warning: no outer plane check ('Q5') or no processing of near-inside points ('Q8'). Verify may report that a point is outside of a facet. Output completed. Verifying that all points are below outer planes of all facets. Will make 11 distance computations. @@ -7949,13 +10571,13 @@ 0.3105396575392593 0.2400179190933871 0.1540434803905201 -0.01883958887200765 0.3630260628303755 0.13214285240299 0.3790312361708201 0.3779794437605696 0.2865331378987296 --0.2994955874043476 0.3776609263174803 0.2323253821416526 +-0.2994955874043476 0.3776609263174803 0.2323253821416525 0.3471817493878135 0.08365533089605659 0.1275333814953112 -0.00485819764887746 0.3482682405489201 0.121314369459436 0.3443122672329771 -0.1437312230875075 0.1392096018573439 0.309330780347186 -0.07758103877080702 0.1017043492469565 -Output completed. Verifying that all points are below 2.1e-015 of +Output completed. Verifying that all points are below 2.1e-15 of all facets. Will make 140 distance computations. rbox 10 D2 | qhull d Tcv i 14 @@ -7974,7 +10596,7 @@ 6 8 4 2 6 4 -Output completed. Verifying that all points are below 2.1e-015 of +Output completed. Verifying that all points are below 2.1e-15 of all facets. Will make 140 distance computations. rbox 10 D2 | qhull d Tcv o 3 @@ -7984,7 +10606,7 @@ 0.3105396575392593 0.2400179190933871 0.1540434803905201 -0.01883958887200765 0.3630260628303755 0.13214285240299 0.3790312361708201 0.3779794437605696 0.2865331378987296 --0.2994955874043476 0.3776609263174803 0.2323253821416526 +-0.2994955874043476 0.3776609263174803 0.2323253821416525 0.3471817493878135 0.08365533089605659 0.1275333814953112 -0.00485819764887746 0.3482682405489201 0.121314369459436 0.3443122672329771 -0.1437312230875075 0.1392096018573439 @@ -8004,18 +10626,18 @@ 3 6 8 4 3 2 6 4 -Output completed. Verifying that all points are below 2.1e-015 of +Output completed. Verifying that all points are below 2.1e-15 of all facets. Will make 140 distance computations. rbox 10 D2 | qhull v Tcv o 2 15 10 1 -10.101 -10.101 -0.1294381801544404 -0.07247409101984714 -0.08267689532419748 -0.2397644955865706 -0.1295260566906465 1.716033573116838 +0.08267689532419747 -0.2397644955865706 +0.1295260566906465 1.716033573116837 0.1740355150742391 0.5317519038435655 0.1851415205797575 0.3882545794457364 --0.9065939866848107 -0.2962957610652136 +-0.9065939866848107 -0.2962957610652135 -0.1954805620516266 -0.07111892482963184 -0.1407581310832468 0.7233857048236082 -0.1676297826663962 0.2080621273999375 @@ -8023,7 +10645,7 @@ 0.08806341399736994 0.1054080604689985 0.4761588899009253 -0.03168366595227294 3.094213357897477 -0.064721945677682 -0.5410515627308725 0.211561543495592 +0.5410515627308725 0.2115615434955919 5 7 1 2 0 6 4 8 3 0 6 3 14 5 11 @@ -8035,17 +10657,17 @@ 4 13 0 2 12 4 12 2 1 10 -Output completed. Verifying that all points are below 2.1e-015 of +Output completed. Verifying that all points are below 2.1e-15 of all facets. Will make 140 distance computations. rbox 10 D2 | qhull v Tcv p 2 14 -0.1294381801544404 -0.07247409101984714 -0.08267689532419748 -0.2397644955865706 -0.1295260566906465 1.716033573116838 +0.08267689532419747 -0.2397644955865706 +0.1295260566906465 1.716033573116837 0.1740355150742391 0.5317519038435655 0.1851415205797575 0.3882545794457364 --0.9065939866848107 -0.2962957610652136 +-0.9065939866848107 -0.2962957610652135 -0.1954805620516266 -0.07111892482963184 -0.1407581310832468 0.7233857048236082 -0.1676297826663962 0.2080621273999375 @@ -8053,9 +10675,9 @@ 0.08806341399736994 0.1054080604689985 0.4761588899009253 -0.03168366595227294 3.094213357897477 -0.064721945677682 -0.5410515627308725 0.211561543495592 +0.5410515627308725 0.2115615434955919 -Output completed. Verifying that all points are below 2.1e-015 of +Output completed. Verifying that all points are below 2.1e-15 of all facets. Will make 140 distance computations. rbox 10 D2 | qhull v Tcv G {appearance {linewidth 3} LIST # rbox 10 D2 | qhull v Tcv G @@ -8064,15 +10686,15 @@ # 1 f8 -0.1294381801544404 -0.07247409101984714 0 # 2 f11 -0.08267689532419748 -0.2397644955865706 0 +0.08267689532419747 -0.2397644955865706 0 # 3 f12 -0.1295260566906465 1.716033573116838 0 +0.1295260566906465 1.716033573116837 0 # 4 f14 0.1740355150742391 0.5317519038435655 0 # 5 f15 0.1851415205797575 0.3882545794457364 0 # 6 f19 --0.9065939866848107 -0.2962957610652136 0 +-0.9065939866848107 -0.2962957610652135 0 # 7 f20 -0.1954805620516266 -0.07111892482963184 0 # 8 f21 @@ -8088,21 +10710,21 @@ # 13 f26 3.094213357897477 -0.064721945677682 0 # 14 f27 -0.5410515627308725 0.211561543495592 0 -4 7 1 2 6 # p0(v2) -3 8 3 6 # p1(v0) +0.5410515627308725 0.2115615434955919 0 +4 7 1 2 6 # p0(v3) +3 8 3 6 # p1(v1) 3 14 5 11 # p2(v8) 4 9 4 3 8 # p3(v7) -5 14 5 4 3 13 # p4(v1) +5 14 5 4 3 13 # p4(v2) 4 9 7 6 8 # p5(v9) 5 14 11 10 12 13 # p6(v10) 7 11 5 4 9 7 1 10 # p7(v5) 3 13 2 12 # p8(v6) -4 12 2 1 10 # p9(v3) +4 12 2 1 10 # p9(v4) } } -Output completed. Verifying that all points are below 2.1e-015 of +Output completed. Verifying that all points are below 2.1e-15 of all facets. Will make 140 distance computations. rbox 10 D2 | qhull v Tcv Fv 23 @@ -8130,48 +10752,48 @@ 4 7 9 1 10 4 8 9 2 12 -Output completed. Verifying that all points are below 2.1e-015 of +Output completed. Verifying that all points are below 2.1e-15 of all facets. Will make 140 distance computations. rbox 10 D2 | qhull v Tcv Fi 19 5 0 7 0.02051532578114336 0.9997895385570373 0.07511430445246037 5 0 9 0.619259133056969 0.7851866823409139 0.1370614663104577 -5 0 5 -0.301880639203215 0.9533457293522945 0.008789126238507583 +5 0 5 -0.301880639203215 0.9533457293522944 0.008789126238507583 5 1 3 0.9648718030091262 -0.2627211520946079 0.3258622775065156 5 1 5 0.7995952824356682 -0.6005392446015695 0.5469710423089692 5 2 7 -0.9458410914974847 0.3246299888101017 0.04907537812572171 5 2 4 0.444671031232542 0.8956939622340812 -0.4300843534994401 5 2 6 0.2281595097543261 -0.9736237661995858 0.08253528745668784 5 3 4 0.9992944873266901 0.03755699133966539 -0.1938837324602516 -5 3 7 0.6877523324625972 -0.7259454037269313 0.2663295190946441 +5 3 7 0.6877523324625971 -0.7259454037269313 0.2663295190946441 5 3 5 -0.9986432053419565 0.05207445078292259 -0.1782370644858237 -5 4 7 -0.9970183790688239 -0.07716444646969993 0.2145489484590235 +5 4 7 -0.9970183790688238 -0.07716444646969993 0.2145489484590235 5 4 6 -0.1075842248297359 -0.9941959739245502 0.2685422477498993 5 5 7 0.9950609206245129 -0.09926612839179765 0.187455367716064 5 6 7 -0.7993641842155074 0.6008468199079334 0.007060641163779212 -5 6 9 -0.2285415587894343 -0.973534157544611 0.07797696388863314 +5 6 9 -0.2285415587894342 -0.973534157544611 0.07797696388863314 5 6 8 -0.01261839651625044 -0.9999203848653946 -0.02567278177543585 5 7 9 0.5936952885926361 -0.8046899429612046 0.01852766555277016 5 8 9 -0.4674785097727932 0.8840044360186256 0.2506025495170936 Voronoi ridge statistics 19 bounded ridges -4.2e-017 ave. distance of midpoint to ridge -1.7e-016 max. distance of midpoint to ridge +4.2e-17 ave. distance of midpoint to ridge +1.7e-16 max. distance of midpoint to ridge 19 bounded ridges with ok normal -1.2e-017 ave. angle to ridge -1.1e-016 max. angle to ridge +5.8e-17 ave. angle to ridge +2.2e-16 max. angle to ridge -Output completed. Verifying that all points are below 2.1e-015 of +Output completed. Verifying that all points are below 2.1e-15 of all facets. Will make 140 distance computations. rbox 10 D2 | qhull v Tcv Fo 4 -5 0 1 -0.3854955578888161 0.9227096915324941 -0.07609298438083822 +5 0 1 -0.3854955578888161 0.922709691532494 -0.07609298438083822 5 0 8 0.719062520784207 0.6949453872092842 0.1071733734620186 5 1 4 0.9929212365203526 -0.1187746524595787 0.07521211888503937 5 4 8 -0.06640144810487483 -0.9977929883946747 0.1408811441173877 -Output completed. Verifying that all points are below 2.1e-015 of +Output completed. Verifying that all points are below 2.1e-15 of all facets. Will make 140 distance computations. rbox 10 D2 | qhull v Qu o Fv Fi Fo Tcv 2 @@ -8199,18 +10821,18 @@ 5 0 4 0.4164624817835529 0.9091529031283372 -0.01975252543405325 4 5 0 8 0.7190625207842071 0.6949453872092841 0.1071733734620185 -5 0 1 -0.3854955578888162 0.9227096915324941 -0.07609298438083828 +5 0 1 -0.3854955578888162 0.922709691532494 -0.07609298438083828 5 1 4 0.9929212365203528 -0.1187746524595786 0.07521211888503934 5 4 8 -0.06640144810487485 -0.9977929883946747 0.1408811441173877 Voronoi ridge statistics 1 bounded ridges -1.2e-016 ave. distance of midpoint to ridge -1.2e-016 max. distance of midpoint to ridge +1.2e-16 ave. distance of midpoint to ridge +1.2e-16 max. distance of midpoint to ridge 1 bounded ridges with ok normal 0 max. angle to ridge -Output completed. Verifying that all points are below 2.1e-015 of +Output completed. Verifying that all points are below 2.1e-15 of all facets. Will make 20 distance computations. rbox 10 D3 | qhull v Fv Tcv 32 @@ -8247,65 +10869,65 @@ 5 7 9 0 1 2 6 8 9 6 7 12 10 -Output completed. Verifying that all points are below 2.9e-015 of +Output completed. Verifying that all points are below 2.9e-15 of all facets. Will make 180 distance computations. rbox 10 D3 | qhull v Fi Tcv 13 -6 0 2 0.1026012494065407 0.8309156055795224 -0.5468566905731633 0.2399036185798247 -6 0 8 -0.1644981128676531 0.5492243080463513 -0.8193247404503221 0.122023739903044 -6 0 5 -0.1640386761614814 0.6276090456203117 -0.7610507201092119 0.1709974344854013 -6 2 3 0.8628264983391891 0.1277424492346306 -0.4890933453107607 -0.1660057988150949 -6 2 9 0.514615149546644 -0.7556910962035636 -0.4050953159143434 -0.3000434746332833 +6 0 2 0.1026012494065408 0.8309156055795224 -0.5468566905731632 0.2399036185798246 +6 0 8 -0.1644981128676535 0.549224308046351 -0.8193247404503221 0.1220237399030437 +6 0 5 -0.1640386761614813 0.6276090456203122 -0.7610507201092116 0.1709974344854015 +6 2 3 0.8628264983391892 0.127742449234631 -0.4890933453107607 -0.1660057988150948 +6 2 9 0.5146151495466437 -0.7556910962035636 -0.4050953159143434 -0.3000434746332832 6 2 7 0.9862472983740704 0.008356748990702902 0.1650649302430821 -0.2195655184060844 -6 3 8 -0.9471370887617876 -0.1545163381156413 -0.281169052968456 0.0437290219976465 -6 3 5 -0.9850113492204077 -0.1553182373520525 -0.07502590921037534 0.09265233510028302 -6 4 8 -0.7177135399298968 -0.2457215366779669 -0.6515429387338296 -0.02974683605231299 -6 5 9 0.7110332662678565 -0.6935177833709648 -0.1160378317993181 -0.270606286195582 -6 5 8 -0.1310037283001487 -0.04490613421135449 -0.9903643078593113 -0.2004293237314498 -6 6 8 0.5636530776159621 0.07101685912338829 0.8229531054770393 0.4221671959133706 -6 8 9 0.7278413449934531 -0.6852671087526033 0.02561183671604039 -0.2412830130907243 +6 3 8 -0.9471370887617877 -0.1545163381156413 -0.2811690529684558 0.04372902199764667 +6 3 5 -0.9850113492204077 -0.1553182373520528 -0.07502590921037623 0.09265233510028284 +6 4 8 -0.7177135399298967 -0.245721536677967 -0.65154293873383 -0.02974683605231299 +6 5 9 0.7110332662678562 -0.693517783370965 -0.116037831799318 -0.2706062861955821 +6 5 8 -0.1310037283001485 -0.04490613421135446 -0.9903643078593113 -0.2004293237314498 +6 6 8 0.563653077615962 0.07101685912338832 0.8229531054770393 0.4221671959133705 +6 8 9 0.7278413449934529 -0.6852671087526033 0.02561183671604023 -0.2412830130907243 Voronoi ridge statistics 15 non-simplicial Voronoi vertices for all ridges -4.5e-017 ave. distance to ridge -1.1e-016 max. distance to ridge +6.9e-17 ave. distance to ridge +1.9e-16 max. distance to ridge 13 bounded ridges -5.1e-017 ave. distance of midpoint to ridge -1.1e-016 max. distance of midpoint to ridge +7.8e-17 ave. distance of midpoint to ridge + 3e-16 max. distance of midpoint to ridge 13 bounded ridges with ok normal - 6e-017 ave. angle to ridge -2.2e-016 max. angle to ridge +8.5e-17 ave. angle to ridge +2.2e-16 max. angle to ridge -Output completed. Verifying that all points are below 2.9e-015 of +Output completed. Verifying that all points are below 2.9e-15 of all facets. Will make 180 distance computations. rbox 10 D3 | qhull v Fo Tcv 19 -6 0 1 -0.1769702595802887 0.8331351847724079 0.523991689932513 0.004105600879712693 -6 0 9 0.5856843296472445 -0.1558732679166011 -0.7954102025713887 -0.1264594278193165 -6 0 6 -0.305501768024369 0.3812318858994052 -0.8725427891556765 -0.04822326899809229 -6 0 7 0.6633910639781613 0.6672883530766242 -0.3385831509130508 0.06175731395259272 +6 0 1 -0.1769702595802885 0.8331351847724077 0.5239916899325134 0.004105600879712498 +6 0 9 0.5856843296472444 -0.1558732679166009 -0.7954102025713885 -0.1264594278193164 +6 0 6 -0.305501768024369 0.3812318858994052 -0.8725427891556765 -0.04822326899809234 +6 0 7 0.6633910639781613 0.6672883530766242 -0.3385831509130507 0.06175731395259272 6 1 7 0.7533877382120365 0.334939238848763 -0.5658821628140998 0.06152842458597928 -6 1 2 0.2077539373736715 0.4344067294949107 -0.8764297432625574 0.2556318087147513 -6 1 5 -0.08886729274769867 0.2768317827550707 -0.9568002760954578 0.1656561460661368 +6 1 2 0.2077539373736714 0.4344067294949102 -0.8764297432625574 0.2556318087147513 +6 1 5 -0.08886729274769822 0.2768317827550689 -0.9568002760954583 0.1656561460661369 6 2 4 0.8896724708236493 0.4529391082738924 -0.05769799697211265 -0.124969949041603 -6 2 5 -0.6080629223625024 -0.1069684332549472 -0.7866493734408968 -0.05602222006342443 +6 2 5 -0.6080629223625026 -0.1069684332549473 -0.7866493734408965 -0.05602222006342437 6 3 9 0.1157648604151236 -0.9728190902550374 -0.2005530222370839 -0.2615067759720444 6 3 7 0.3131056731324619 -0.1651787990807294 0.9352437125084113 -0.1060546443225209 6 3 6 -0.8429664438017094 -0.1288333013498811 -0.5223117412882753 -0.1470675860428305 -6 3 4 -0.6546392846048743 0.1665291828386517 0.7373706247980789 0.1638426312062793 +6 3 4 -0.6546392846048742 0.1665291828386516 0.7373706247980789 0.1638426312062793 6 4 7 0.8997625993863546 -0.3161631359012113 0.3007792151107228 -0.2534488584590283 -6 4 6 -0.6610636619910347 -0.1756381951302929 -0.7294834194184101 -0.1931488689248214 -6 4 5 -0.8177140658972856 -0.2799433900977096 -0.5029666040348318 0.01966883326066575 -6 5 6 -0.4656867325018191 -0.06587339986788444 -0.8824945112359766 -0.374728122564582 +6 4 6 -0.6610636619910346 -0.1756381951302929 -0.7294834194184102 -0.1931488689248214 +6 4 5 -0.8177140658972858 -0.2799433900977097 -0.5029666040348314 0.01966883326066583 +6 5 6 -0.4656867325018191 -0.06587339986788447 -0.8824945112359766 -0.374728122564582 6 6 9 0.7885740013077054 -0.5314391513195501 0.309392102204163 -0.04784058563315544 6 7 9 -0.0125726543874506 -0.8388634914110149 -0.5441966291143082 -0.2018836580171401 Voronoi ridge statistics 14 non-simplicial Voronoi vertices for all ridges -5.4e-017 ave. distance to ridge -1.2e-016 max. distance to ridge +4.3e-17 ave. distance to ridge +9.7e-17 max. distance to ridge -Output completed. Verifying that all points are below 2.9e-015 of +Output completed. Verifying that all points are below 2.9e-15 of all facets. Will make 180 distance computations. rbox 10 D3 | qhull v Qu o Fv Fi Fo Tcv 3 @@ -8317,9 +10939,9 @@ -0.9550934192592715 0.3815223390696589 -0.9370156532984113 -0.01637948561987637 -0.8836250780525146 -0.03718065630611937 0.09499885792019704 -0.7038538868165176 -0.181396220925921 -2.128743389186444 -4.06034590041635 -1.216246894786401 -2.789531685277142 -5.39366622961672 -1.494034092231972 -2.640156785602008 -4.796303906482421 -1.459799746992416 +2.128743389186444 -4.06034590041635 -1.2162468947864 +2.789531685277133 -5.393666229616701 -1.494034092231969 +2.640156785601998 -4.796303906482405 -1.459799746992412 3 0 3 4 7 0 1 3 4 6 7 9 4 0 7 8 9 @@ -8351,77 +10973,77 @@ 6 7 9 0 2 1 4 3 6 1 9 0.5123553720802024 -0.363812082853534 -0.7779027838170592 -0.100757404152973 -6 2 6 -0.5221667006142706 -0.08192192666458514 -0.8488997200501182 -0.2535440955968324 -6 6 7 0.752213645322669 0.06033708575303686 0.6561509489997043 0.09003235761431797 +6 2 6 -0.5221667006142685 -0.08192192666458321 -0.8488997200501196 -0.2535440955968309 +6 6 7 0.752213645322669 0.06033708575303686 0.6561509489997043 0.09003235761431796 15 6 0 1 -0.1769702595802886 0.8331351847724078 0.5239916899325134 0.004105600879712498 6 0 9 0.5856843296472447 -0.1558732679166012 -0.7954102025713884 -0.1264594278193166 -6 1 6 -0.2436653478720987 0.147883680687048 -0.9585184480399009 -0.04663519095132841 -6 1 2 0.207753937373674 0.4344067294949119 -0.8764297432625561 0.2556318087147511 +6 1 6 -0.2436653478720986 0.147883680687048 -0.9585184480399009 -0.04663519095132841 +6 1 2 0.2077539373736637 0.4344067294949081 -0.8764297432625605 0.255631808714752 6 1 4 0.444220078847362 0.4986447037065236 -0.744326528490203 0.1737545932855555 6 1 7 0.7533877382120362 0.3349392388487629 -0.5658821628141001 0.06152842458597942 -6 2 5 -0.6080629223625025 -0.1069684332549475 -0.7866493734408965 -0.05602222006342417 -6 2 4 0.8896724708236504 0.4529391082738911 -0.05769799697210674 -0.1249699490416038 +6 2 5 -0.6080629223625006 -0.1069684332549458 -0.7866493734408982 -0.05602222006342417 +6 2 4 0.8896724708236509 0.4529391082738904 -0.0576979969721034 -0.1249699490416035 6 3 6 -0.8429664438017096 -0.1288333013498811 -0.5223117412882751 -0.1470675860428304 -6 3 7 0.3131056731324614 -0.1651787990807291 0.9352437125084115 -0.1060546443225207 -6 4 6 -0.661063661991035 -0.1756381951302929 -0.7294834194184101 -0.1931488689248215 +6 3 7 0.3131056731324613 -0.1651787990807291 0.9352437125084115 -0.1060546443225207 +6 4 6 -0.6610636619910349 -0.1756381951302929 -0.7294834194184099 -0.1931488689248214 6 4 7 0.8997625993863546 -0.3161631359012115 0.3007792151107228 -0.2534488584590282 -6 5 6 -0.4656867325018209 -0.06587339986788572 -0.8824945112359753 -0.3747281225645818 +6 5 6 -0.4656867325018176 -0.06587339986788343 -0.8824945112359772 -0.374728122564582 6 6 9 0.7885740013077054 -0.5314391513195503 0.3093921022041629 -0.04784058563315553 6 7 9 -0.01257265438745033 -0.8388634914110151 -0.5441966291143079 -0.2018836580171402 Voronoi ridge statistics 9 non-simplicial Voronoi vertices for all ridges -7.9e-017 ave. distance to ridge -2.2e-016 max. distance to ridge +1.5e-16 ave. distance to ridge +4.4e-16 max. distance to ridge 3 bounded ridges -1.1e-016 ave. distance of midpoint to ridge -1.4e-016 max. distance of midpoint to ridge +6.4e-16 ave. distance of midpoint to ridge +1.7e-15 max. distance of midpoint to ridge 3 bounded ridges with ok normal -7.4e-017 ave. angle to ridge -2.2e-016 max. angle to ridge +7.4e-17 ave. angle to ridge +2.2e-16 max. angle to ridge -Output completed. Verifying that all points are below 2.9e-015 of +Output completed. Verifying that all points are below 2.9e-15 of all facets. Will make 90 distance computations. rbox 5 D2 | qhull v f FnN o Vertices and facets: - p3(v5): 0.43 -0.11 0.19 neighbors: f5 f6 f7 f8 -- p2(v1): 0.47 -0.11 0.24 +- p2(v2): 0.47 -0.11 0.24 neighbors: f1 f5 f7 -- p4(v0): -0.39 0.45 0.36 +- p4(v1): -0.39 0.45 0.36 neighbors: f1 f3 f5 f6 -- p0(v3): -0.34 0.23 0.17 +- p0(v4): -0.34 0.23 0.17 neighbors: f3 f6 f8 -- p1(v2): 0.32 -0.23 0.16 +- p1(v3): 0.32 -0.23 0.16 neighbors: f1 f3 f7 f8 - f5 - flags: top simplicial - normal: 0.437 0.773 -0.4599 - offset: -0.01170704 - center: 0.4751017705052502 0.8404705693422864 - - vertices: p3(v5) p2(v1) p4(v0) + - vertices: p3(v5) p2(v2) p4(v1) - neighboring facets: f1 f6 f7 - f6 - flags: bottom simplicial - normal: 0.3235 0.6691 -0.669 - offset: 0.0657 - center: 0.24177356134713 0.5000766029034823 - - vertices: p3(v5) p0(v3) p4(v0) + - vertices: p3(v5) p0(v4) p4(v1) - neighboring facets: f3 f5 f8 - f7 - flags: top simplicial - normal: 0.6288 -0.3317 -0.7033 - offset: -0.1682885 - - center: 0.447029359505762 -0.2357835939937328 - - vertices: p3(v5) p1(v2) p2(v1) + - center: 0.4470293595057619 -0.2357835939937328 + - vertices: p3(v5) p1(v3) p2(v2) - neighboring facets: f1 f5 f8 - f8 - flags: top simplicial - normal: 0.1177 0.1841 -0.9758 - offset: 0.15929 - center: 0.06029550723695781 0.09433023738340306 - - vertices: p3(v5) p0(v3) p1(v2) + - vertices: p3(v5) p0(v4) p1(v3) - neighboring facets: f3 f7 f6 4 3 -1 1 2 @@ -8439,7 +11061,7 @@ -10.101 -10.101 0.4751017705052502 0.8404705693422864 0.24177356134713 0.5000766029034823 -0.447029359505762 -0.2357835939937328 +0.4470293595057619 -0.2357835939937328 0.06029550723695781 0.09433023738340306 3 2 4 0 3 3 4 0 @@ -8447,29 +11069,121 @@ 4 3 4 2 1 3 1 2 0 -echo === check Halfspace ${d:-`date`} -date -=== check Halfspace Mon Jan 18 21:22:34 EST 2016 -rbox 100 s D4 | qhull FA FV n s Tcv | qhull H Fp Tcv | qhull FA Tcv +set +v +=== check Halfspace and Qhull identity pipeline, showing the input Fri, Jul 24, 2020 10:27:34 PM +=== the Qhull pipeline recreates 100 4-D cospherical points with the same area and volume +rbox 100 s D4 | qhull FA FV s n | head Convex hull of 100 points in 4-d: Number of vertices: 100 Number of facets: 584 -Statistics for: rbox 100 s D4 | qhull FA FV n s Tcv +Statistics for: rbox 100 s D4 | qhull FA FV s n Number of points processed: 100 - Number of hyperplanes created: 1718 - Number of distance tests for qhull: 4091 - CPU seconds to compute hull (after input): 0 + Number of hyperplanes created: 1717 + Number of distance tests for qhull: 4090 + CPU seconds to compute hull (after input): 0.001 + Total facet area: 1.7919449 + Total volume: 0.18640279 + +4 1 +-0.006240661006237819 -0.006198497499885543 -0.0019864189252863 0.03528712962677102 +5 +584 +-0.4728063044129454 -0.06576180062326932 0.3296766529322419 -0.8145200357250598 -0.4001269961794449 +0.9350657178932537 -0.116181174817606 -0.009048199757790566 0.3347718147035652 -0.3733488931324643 +0.5670388949132408 -0.5323662756300656 -0.3876606744394214 0.4947446227302695 -0.4846392631626165 +0.8393609616706702 -0.1089654738688994 -0.05104156673138016 0.530089105710936 -0.4115455431603698 +0.6753770108964836 -0.1536990905729236 -0.0485198359900459 0.7196445707605155 -0.4414725485817289 +0.20025580309926 0.08170320261530004 0.2334845247641378 0.9480016754748583 -0.4466269780920115 +rbox 100 s D4 | qhull FQ FA FV n s | qhull s H Fp | head + +Convex hull of 100 points in 4-d: + + Number of vertices: 100 + Number of facets: 584 + +Statistics for: rbox 100 s D4 | qhull FQ FA FV n s + + Number of points processed: 100 + Number of hyperplanes created: 1717 + Number of distance tests for qhull: 4090 + CPU seconds to compute hull (after input): 0.001 + Total facet area: 1.7919449 + Total volume: 0.18640279 + + +Halfspace intersection by the convex hull of 584 points in 4-d: + + Number of halfspaces: 584 + Number of non-redundant halfspaces: 584 + Number of intersection points: 100 + Number of non-simplicial intersection points: 100 + +Statistics for: rbox 100 s D4 | qhull FQ FA FV n s | qhull s H Fp + + Number of points processed: 584 + Number of hyperplanes created: 4013 + Number of distance tests for qhull: 29717 + Number of distance tests for merging: 76955 + Number of distance tests for checking: 18265 + Number of merged facets: 3444 + CPU seconds to compute hull (after input): 0.012 + Maximum distance of point above facet: 2.4e-14 (0.4x) + Maximum distance of vertex below facet: -1.7e-14 (0.3x) + +4 +100 +-0.1497820974007844 0.4220759056868791 -0.1730594919621551 0.1395265758865447 +-0.1656824599698354 0.2695081565763442 0.2399815540443042 -0.3038478726528215 +-0.1287028906527846 0.3274268489457611 0.1066154632455187 -0.3389105597705839 +0.2152206390581626 0.2489384546335302 -0.342896351704003 0.1553441801811403 +-0.3478218321497436 0.1609400522171699 0.2504669650899252 -0.2009591303498609 +-0.2026608048181584 0.132737676060139 -0.4340855448243784 0.05365675464591807 +-0.1243914612976075 -0.06208848857682957 -0.4348180038806073 -0.2039732517850684 +0.318659177699236 0.2994118752602876 -0.2407753518255607 -0.02891517550426 +rbox 100 s D4 | qhull FQ FA FV n s Tcv | qhull FQ s H Fp Tcv | qhull FA Tcv + +Convex hull of 100 points in 4-d: + + Number of vertices: 100 + Number of facets: 584 + +Statistics for: rbox 100 s D4 | qhull FQ FA FV n s Tcv + + Number of points processed: 100 + Number of hyperplanes created: 1717 + Number of distance tests for qhull: 4090 + CPU seconds to compute hull (after input): 0.007 Total facet area: 1.7919449 Total volume: 0.18640279 -Output completed. Verifying that all points are below 2.8e-015 of +Output completed. Verifying that all points are below 2.8e-15 of all facets. Will make 58400 distance computations. +Halfspace intersection by the convex hull of 584 points in 4-d: + + Number of halfspaces: 584 + Number of non-redundant halfspaces: 584 + Number of intersection points: 100 + Number of non-simplicial intersection points: 100 + +Statistics for: rbox 100 s D4 | qhull FQ FA FV n s Tcv | qhull FQ s H Fp Tcv + + Number of points processed: 584 + Number of hyperplanes created: 4013 + Number of distance tests for qhull: 29717 + Number of distance tests for merging: 77055 + Number of distance tests for checking: 51837 + Number of merged facets: 3444 + CPU seconds to compute hull (after input): 0.363 + Maximum distance of point above facet: 2.4e-14 (0.4x) + Maximum distance of vertex below facet: -1.7e-14 (0.3x) + + Output completed. Verifying that all points are below outer planes of all facets. Will make 58400 distance computations. @@ -8478,30 +11192,45 @@ Number of vertices: 100 Number of facets: 584 -Statistics for: | qhull FA Tcv +Statistics for: rbox 100 s D4 | qhull FQ FA FV n s Tcv | qhull FQ s H Fp Tcv | qhull FA Tcv Number of points processed: 100 - Number of hyperplanes created: 1718 - Number of distance tests for qhull: 4091 - CPU seconds to compute hull (after input): 0 + Number of hyperplanes created: 1717 + Number of distance tests for qhull: 4090 + CPU seconds to compute hull (after input): 0.006 Total facet area: 1.7919449 Total volume: 0.18640279 -Output completed. Verifying that all points are below 2.8e-015 of +Output completed. Verifying that all points are below 2.8e-15 of all facets. Will make 58400 distance computations. -rbox d D3 | qhull FQ n s FD Tcv | qhull Fd H0.1,0.1 Fp FQ Tcv +echo === the Qhull pipeline recreates a 3-D tetrahedron +=== the Qhull pipeline recreates a 3-D tetrahedron +rbox d D3 | qhull n FD +rbox d D3 | qhull n FD +begin + 8 4 real +0.2886751345948129 0.5773502691896258 0.5773502691896258 0.5773502691896258 +0.2886751345948129 -0.5773502691896258 0.5773502691896258 0.5773502691896258 +0.2886751345948129 0.5773502691896258 0.5773502691896258 -0.5773502691896258 +0.2886751345948129 -0.5773502691896258 0.5773502691896258 -0.5773502691896258 +0.2886751345948129 -0.5773502691896258 -0.5773502691896258 0.5773502691896258 +0.2886751345948129 0.5773502691896258 -0.5773502691896258 0.5773502691896258 +0.2886751345948129 -0.5773502691896258 -0.5773502691896258 -0.5773502691896258 +0.2886751345948129 0.5773502691896258 -0.5773502691896258 -0.5773502691896258 +end +rbox d D3 | qhull s n FD Tcv | qhull s Fd H0.1,0.1 Fp Tcv Convex hull of 6 points in 3-d: Number of vertices: 6 Number of facets: 8 -Statistics for: rbox d D3 | qhull FQ n s FD Tcv +Statistics for: rbox d D3 | qhull s n FD Tcv Number of points processed: 6 Number of hyperplanes created: 11 - Number of distance tests for qhull: 11 + Number of distance tests for qhull: 10 Number of distance tests for merging: 59 Number of distance tests for checking: 54 Number of merged facets: 1 @@ -8510,49 +11239,90 @@ Output completed. Verifying that all points are below outer planes of all facets. Will make 48 distance computations. + +Halfspace intersection by the convex hull of 8 points in 3-d: + + Number of halfspaces: 8 + Number of non-redundant halfspaces: 8 + Number of intersection points: 6 + Number of non-simplicial intersection points: 6 + +Statistics for: rbox d D3 | qhull s n FD Tcv | qhull s Fd H0.1,0.1 Fp Tcv + + Number of points processed: 8 + Number of hyperplanes created: 10 + Number of distance tests for qhull: 30 + Number of distance tests for merging: 95 + Number of distance tests for checking: 100 + Number of merged facets: 6 + CPU seconds to compute hull (after input): 0 + 3 6 --1.387778780781446e-017 -1.387778780781446e-017 0.5 --2.775557561562891e-017 0.5 0 +-1.387778780781446e-17 -1.387778780781446e-17 -0.5 +-2.775557561562891e-17 0.5 0 -0.5 0 0 - 0.5 -2.775557561562891e-017 0 + 0.5 -2.775557561562891e-17 0 0 -0.5 0 --1.387778780781446e-017 1.387778780781446e-017 -0.4999999999999999 -rbox d D3 | qhull FQ n s FD Tcv | qhull Fd H0.1,0.1 Fp FQ Tcv +-1.387778780781446e-17 1.387778780781446e-17 0.4999999999999999 Output completed. Verifying that all points are below outer planes of all facets. Will make 48 distance computations. -rbox 5 r D2 | qhull s n Tcv | qhull H0 Fp Tcv +echo === the Qhull pipeline recreates a regular 2-D pentagon +=== the Qhull pipeline recreates a regular 2-D pentagon +rbox 5 r D2 | qhull FQ n +rbox 5 r D2 | qhull FQ n +3 +5 +0.8090169943749476 0.587785252292473 -0.4045084971874737 +-0.3090169943749476 -0.9510565162951536 -0.4045084971874738 +0.8090169943749472 -0.5877852522924732 -0.4045084971874737 + -1 9.444121133484361e-17 -0.4045084971874738 +-0.3090169943749474 0.9510565162951536 -0.4045084971874738 +rbox 5 r D2 | qhull s FQ n Tcv | qhull s H0 Fp Tcv Convex hull of 5 points in 2-d: Number of vertices: 5 Number of facets: 5 -Statistics for: rbox 5 r D2 | qhull s n Tcv +Statistics for: rbox 5 r D2 | qhull s FQ n Tcv Number of points processed: 5 Number of hyperplanes created: 8 - Number of distance tests for qhull: 8 + Number of distance tests for qhull: 7 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 1.3e-015 of +Output completed. Verifying that all points are below 1.3e-15 of all facets. Will make 25 distance computations. + +Halfspace intersection by the convex hull of 5 points in 2-d: + + Number of halfspaces: 5 + Number of non-redundant halfspaces: 5 + Number of intersection points: 5 + +Statistics for: rbox 5 r D2 | qhull s FQ n Tcv | qhull s H0 Fp Tcv + + Number of points processed: 5 + Number of hyperplanes created: 7 + Number of distance tests for qhull: 8 + CPU seconds to compute hull (after input): 0 + 2 5 -0.4045084971874738 -0.2938926261462365 - 0.5 -1.528090898784888e-016 + 0.5 -1.528090898784888e-16 0.1545084971874736 -0.4755282581475768 -0.4045084971874737 0.2938926261462366 0.1545084971874737 0.4755282581475768 -Output completed. Verifying that all points are below 6.4e-015 of +Output completed. Verifying that all points are below 6.4e-15 of all facets. Will make 25 distance computations. -echo === check qhull ${d:-`date`} -date -=== check qhull Mon Jan 18 21:22:34 EST 2016 +set +v +=== check qhull Fri, Jul 24, 2020 10:27:35 PM rbox 10 s D3 | qhull Tcv Convex hull of 10 points in 3-d: @@ -8564,38 +11334,38 @@ Number of points processed: 10 Number of hyperplanes created: 29 - Number of distance tests for qhull: 49 + Number of distance tests for qhull: 48 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 2e-015 of +Output completed. Verifying that all points are below 2e-15 of all facets. Will make 160 distance computations. -rbox 10 s D3 | qhull f Pd0:0.5 Pd2 Tcv +rbox 10 s D3 | qhull f Pd0:0.5 Pd2 Pg Tcv Vertices and facets: - p7(v8): 0.2 0.093 0.45 - p9(v5): 0.29 -0.16 0.38 -- p3(v1): 0.48 -0.13 0.022 +- p3(v2): 0.48 -0.13 0.022 - p8(v10): 0.32 0.025 -0.38 - f16 - flags: bottom simplicial - normal: 0.858 0.1759 0.4826 - offset: -0.4016457 - - vertices: p7(v8) p9(v5) p3(v1) + - vertices: p7(v8) p9(v5) p3(v2) - neighboring facets: f7 f27 f23 - f27 - flags: bottom simplicial - normal: 0.646 0.7625 0.03668 - offset: -0.2138755 - - vertices: p8(v10) p7(v8) p3(v1) + - vertices: p8(v10) p7(v8) p3(v2) - neighboring facets: f16 f26 f28 -Output completed. Verifying that all points are below 2e-015 of +Output completed. Verifying that all points are below 2e-15 of all facets. Will make 20 distance computations. -rbox 10 s D3 | qhull f Tcv PD2:-0.5 +rbox 10 s D3 | qhull f Tcv PD2:-0.5 Pg Vertices and facets: - p4(v7): 0.23 -0.32 -0.31 -- p1(v3): -0.072 0.057 -0.49 -- p6(v2): -0.13 -0.47 -0.09 +- p1(v4): -0.072 0.057 -0.49 +- p6(v3): -0.13 -0.47 -0.09 - p0(v9): -0.37 -0.27 0.19 - p8(v10): 0.32 0.025 -0.38 - p5(v6): 0.028 0.16 -0.47 @@ -8603,28 +11373,28 @@ - flags: top simplicial - normal: -0.2354 -0.5691 -0.7879 - offset: -0.3715833 - - vertices: p4(v7) p1(v3) p6(v2) + - vertices: p4(v7) p1(v4) p6(v3) - neighboring facets: f21 f11 f25 - f21 - flags: bottom simplicial - normal: -0.8148 -0.2922 -0.5006 - offset: -0.2881945 - - vertices: p0(v9) p1(v3) p6(v2) + - vertices: p0(v9) p1(v4) p6(v3) - neighboring facets: f12 f19 f20 - f24 - flags: top simplicial - normal: 0.2636 -0.06941 -0.9621 - offset: -0.4497787 - - vertices: p8(v10) p5(v6) p1(v3) + - vertices: p8(v10) p5(v6) p1(v4) - neighboring facets: f9 f25 f28 - f25 - flags: bottom simplicial - normal: 0.2402 -0.2624 -0.9346 - offset: -0.4268812 - - vertices: p8(v10) p4(v7) p1(v3) + - vertices: p8(v10) p4(v7) p1(v4) - neighboring facets: f12 f24 f26 -Output completed. Verifying that all points are below 2e-015 of +Output completed. Verifying that all points are below 2e-15 of all facets. Will make 40 distance computations. rbox 10 s D3 | qhull QR-1 @@ -8633,11 +11403,11 @@ Number of vertices: 10 Number of facets: 16 -Statistics for: rbox 10 s D3 | qhull QR-1 QR-1453170154 +Statistics for: rbox 10 s D3 | qhull QR-1 QR-1595644055 Number of points processed: 10 Number of hyperplanes created: 29 - Number of distance tests for qhull: 49 + Number of distance tests for qhull: 48 CPU seconds to compute hull (after input): 0 rbox 10 s D3 | qhull QR-40 @@ -8651,40 +11421,54 @@ Number of points processed: 10 Number of hyperplanes created: 29 - Number of distance tests for qhull: 49 + Number of distance tests for qhull: 48 CPU seconds to compute hull (after input): 0 rbox 1000 D3 | qhull Tcvs +qhull 2020.2.r 2020/07/24 Statistics: rbox 1000 D3 | qhull Tcvs + +Convex hull of 1000 points in 3-d: + + Number of vertices: 73 + Number of facets: 142 + +Statistics for: rbox 1000 D3 | qhull Tcvs + + Number of points processed: 81 + Number of hyperplanes created: 367 + Number of distance tests for qhull: 12879 + CPU seconds to compute hull (after input): 0.001 - qhull invoked by: rbox 1000 D3 | qhull Tcvs -2015.2.r 2016/01/18 with options: - run-id 99260947 Tcheck-frequently Tverify Tstatistics _pre-merge - _zero-centrum _max-width 1 Error-roundoff 6.9e-016 _one-merge 4.9e-015 - _near-inside 2.4e-014 Visible-distance 1.4e-015 - U-coplanar-distance 1.4e-015 Width-outside 2.8e-015 _wide-facet 8.3e-015 + +qhull invoked by: rbox 1000 D3 | qhull Tcvs + 2020.2.r 2020/07/24 with options: + run-id 213848649 Tcheck-frequently Tverify Tstatistics _pre-merge + _zero-centrum _max-width 1 Error-roundoff 6.9e-16 _one-merge 4.9e-15 + _near-inside 2.4e-14 Visible-distance 1.4e-15 U-max-coplanar 1.4e-15 + Width-outside 2.8e-15 _wide-facet 8.3e-15 precision constants: - 0.5 max. abs. coordinate in the (transformed) input('Qbd:n') - 6.9e-016 max. roundoff error for distance computation('En') - 6.7e-016 max. roundoff error for angle computations - 2.8e-015 min. distance for outside points ('Wn') - 1.4e-015 min. distance for visible facets ('Vn') - 1.4e-015 max. distance for coplanar facets ('Un') - 8.3e-015 max. facet width for recomputing centrum and area - 2.4e-014 max. distance for near-inside points - 1.4e-015 radius of pre-merge centrum - 4.9e-015 max. distance for merging two simplicial facets - 2.2e-016 max. roundoff error for arithmetic operations - 1.1e-308 min. denominator for divisions - zero diagonal for Gauss: 8.88e-015 1.78e-014 2.66e-014 + 0.5 max. abs. coordinate in the (transformed) input ('Qbd:n') + 6.9e-16 max. roundoff error for distance computation ('En') + 6.7e-16 max. roundoff error for angle computations + 2.8e-15 min. distance for outside points ('Wn') + 1.4e-15 min. distance for visible facets ('Vn') + 1.4e-15 max. distance for coplanar facets ('Un') + 8.3e-15 max. facet width for recomputing centrum and area + 2.4e-14 max. distance for near-inside points + 1.4e-15 radius of pre-merge centrum + 4.9e-15 max. distance for merging two simplicial facets + 2.2e-16 max. roundoff error for arithmetic operations + 1.1e-308 min. denominator for division + zero diagonal for Gauss: 8.88e-15 1.78e-14 2.66e-14 precision statistics -3.7e-017 ave. distance of a new vertex to a facet(!0s) -1.4e-016 max. distance of a new vertex to a facet -1.1e-016 max. distance of an output vertex to a facet --1.4e-016 min. distance of an output vertex to a facet +3.8e-17 ave. distance of a new vertex to a facet +1.7e-16 max. distance of a new vertex to a facet +1.4e-16 max. distance of an output vertex to a facet +-1.7e-16 min. distance of an output vertex to a facet 0.0026 min. denominator in hyperplane computation summary information @@ -8694,12 +11478,13 @@ 3 maximum number of neighbors 3 average number of vertices per facet 3 maximum number of vertices + 0.001 cpu seconds for qhull after input 82 vertices created altogether - 368 facets created altogether - 0 maximum merges for a facet(at most 511) - 0.93 average angle(cosine) of facet normals for all ridges - 1 maximum angle(cosine) of facet normals across a ridge - 0.21 minimum angle(cosine) of facet normals across a ridge + 367 facets created altogether + 0 maximum merges for a facet (at most 511) + 0.93 average cosine (angle) of facet normals for all ridges + 1 maximum cosine of facet normals (flatest) across a ridge + 0.21 minimum cosine of facet normals (sharpest) across a ridge build hull statistics 81 points processed @@ -8712,111 +11497,115 @@ 11 maximum 4.38 ave. horizon facets per iteration 4.48 ave. new or merged facets per iteration - 10 maximum(includes initial simplex) + 10 maximum (includes initial simplex) -0.77 average new facet balance 1.5 standard deviation - 77 number of trials - 7 determinants computed(area & initial hull) - 504 distance tests for facet visibility + 77 count + 7 determinants for initial hull or voronoi vertices + 503 distance tests for facet visibility 73 points checked for facets' outer planes - 12.4 ave. distance tests per check - 1629 max visit_id/2 - 619 max vertex_visit/2 + 11.4 ave. distance tests per check + 1668 max visit_id/2 + 3125 max vertex_visit/2 -partitioning statistics(see previous for outer planes) +partitioning statistics (see previous for outer planes) 8 total vertices deleted 1 maximum vertices deleted per iteration - 135 calls to findbest - 2.59 ave. facets tested - 7 max. facets tested - 2045 calls to findbestnew + 132 calls to findbest + 2.53 ave. facets tested + 6 max. facets tested + 2048 calls to findbestnew 4.47 ave. facets tested 13 max. facets tested 36 calls due to qh_sharpnewfacets 927 calls to findhorizon - 3.02 ave. facets tested - 6 max. facets tested - 5 horizon facets better than bestfacet + 3.01 ave. facets tested + 5 max. facets tested +0.00539 ave. clearly better + 5 new bestfacets during qh_findbesthorizon 919 inside points 8 inside points that were coplanar with a facet --3.1e-017 difference in max_outside at final check +-2.8e-17 difference in max_outside at final check 3747 distance tests for initial partition 3132 partitions of a point - 8558 distance tests for partitioning - 513 distance tests for checking flipped facets - 1162 distance tests for statistics - 16990 total number of distance tests + 8553 distance tests for partitioning + 518 distance tests for checking flipped facets + 1160 distance tests for statistics + 16915 total number of distance tests 8 partitions of coplanar points or deleted vertices - 75 distance tests for these partitions + 76 distance tests for these partitions statistics for matching ridges 726 total lookups for matching ridges of new facets - 0.574 average number of tests to match a ridge + 0.583 average number of tests to match a ridge statistics for determining merges 1089 distance tests for checking simplicial convexity statistics for merging -1.4e-016 max distance of vertex or coplanar point above facet(w/roundoff) --6.9e-016 max distance of merged vertex below facet(or roundoff) - -memory usage statistics(in bytes) - 21584 for facets -Convex hull of 1000 points in 3-d: - - Number of vertices: 73 - Number of facets: 142 - -Statistics for: rbox 1000 D3 | qhull Tcvs +1.7e-16 max distance of vertex or coplanar point above facet (w/roundoff) +-6.9e-16 max distance of vertex below facet (or roundoff) - Number of points processed: 81 - Number of hyperplanes created: 368 - Number of distance tests for qhull: 12884 - CPU seconds to compute hull (after input): 0 - -and their normals, neighbor and vertex sets +memory usage statistics (in bytes) + 21584 for facets and their normals, neighbor and vertex sets 2044 for vertices and their neighbor sets - 30632 for input points, outside and coplanar sets, and qhT + 31104 for input points, outside and coplanar sets, and qhT memory statistics: - 1166 quick allocations - 673 short allocations + 1413 quick allocations + 687 short allocations 69 long allocations - 1184 short frees + 1445 short frees 68 long frees 25680 bytes of short memory in use - 680 bytes of short memory in freelists - 104704 bytes of dropped short memory - 2948 bytes of unused short memory (estimated) + 1472 bytes of short memory in freelists + 103912 bytes of dropped short memory + 1364 bytes of unused short memory (estimated) 10916 bytes of long memory allocated (max, except for input) 96 bytes of long memory in use (in 1 pieces) 131064 bytes of short memory buffers (minus links) 65536 bytes per short memory buffer (initially 131072 bytes) - 73 calls to qh_setlarger - 15 average copy size - freelists(bytes->count): 16->1 24->13 32->0 88->4 + 100 calls to qh_setlarger + 14 average copy size + freelists(bytes->count): 16->1 24->13 32->0 48->11 88->7 - size in bytes: merge 24 ridge 20 vertex 28 facet 88 + size in bytes: merge 48 ridge 20 vertex 28 facet 88 normal 24 ridge vertices 16 facet vertices or neighbors 20 Output completed. Verifying that all points are below outer planes of all facets. Will make 142000 distance computations. -rbox 100 D3 | qhull T8 Tz TO q_test.log.1 +# Test tracing 'Tn', combine stderr/stdout 'Tz', flush fprintf 'Tf' +rbox 100 D3 | qhull T1 Tz Tf TA1 TO q_test.log.1 tail -n -10 q_test.log.1 -qh_mem 00270170 n 1022 free short: 32 bytes (tot 9032 cnt 228) -qh_mem 00270190 n 1023 free short: 32 bytes (tot 9000 cnt 227) -qh_mem 002701B0 n 1024 free short: 32 bytes (tot 8968 cnt 226) -qh_mem 002701D0 n 1025 free short: 32 bytes (tot 8936 cnt 225) -qh_mem 002633D8 n 30 free long: 96 bytes (tot 0 cnt 0) -qh_mem 002701F0 n 1026 free short: 16 bytes (tot 8920 cnt 224) -qh_mem 00270050 n 1027 free short: 88 bytes (tot 8832 cnt 223) -qh_mem 002700A8 n 1028 free short: 88 bytes (tot 8744 cnt 222) -qh_mem 00270100 n 1029 free short: 88 bytes (tot 8656 cnt 221) -qh_freebuffers: finished +Statistics for: rbox 100 D3 | qhull T1 Tz Tf TA1 TO q_test.log.1 + + Number of points processed: 5 + Number of hyperplanes created: 8 + Number of distance tests for qhull: 456 + CPU seconds to compute hull (after input): 0.001 + +[QH1006]qh_freeqhull: free global memory +[QH1005]qh_freebuild: free memory from qh_inithull and qh_buildhull +[QH1061]qh_freeqhull: clear qhT except for qh.qhmem and qh.qhstat rm q_test.log.1 +rbox 100 s D3 | qhull TcvA10 + +Early exit due to 'TAn', 'TVn', 'TCn', 'TRn', or precision error with 'QJn'. +Convex hull of 100 points in 3-d: + + Number of vertices: 14 + Number of facets: 24 + +Statistics for: rbox 100 s D3 | qhull TcvA10 + + Number of points processed: 14 + Number of hyperplanes created: 48 + Number of distance tests for qhull: 599 + CPU seconds to compute hull (after input): 0 + rbox 100 s D3 | qhull TcvV-2 -At a premature exit due to 'TVn', 'TCn', 'TRn', or precision error with 'QJn'. +Early exit due to 'TAn', 'TVn', 'TCn', 'TRn', or precision error with 'QJn'. Convex hull of 100 points in 3-d: Number of vertices: 78 @@ -8826,12 +11615,12 @@ Number of points processed: 78 Number of hyperplanes created: 390 - Number of distance tests for qhull: 1489 - CPU seconds to compute hull (after input): 0 + Number of distance tests for qhull: 1488 + CPU seconds to compute hull (after input): 0.001 rbox 100 s D3 | qhull TcvC2 -At a premature exit due to 'TVn', 'TCn', 'TRn', or precision error with 'QJn'. +Early exit due to 'TAn', 'TVn', 'TCn', 'TRn', or precision error with 'QJn'. Convex hull of 100 points in 3-d: Number of vertices: 79 @@ -8841,12 +11630,12 @@ Number of points processed: 79 Number of hyperplanes created: 395 - Number of distance tests for qhull: 1496 - CPU seconds to compute hull (after input): 0 + Number of distance tests for qhull: 1495 + CPU seconds to compute hull (after input): 0.001 rbox 100 s D3 | qhull TcvV2 -At a premature exit due to 'TVn', 'TCn', 'TRn', or precision error with 'QJn'. +Early exit due to 'TAn', 'TVn', 'TCn', 'TRn', or precision error with 'QJn'. Convex hull of 100 points in 3-d: Number of vertices: 79 @@ -8856,12 +11645,42 @@ Number of points processed: 79 Number of hyperplanes created: 395 - Number of distance tests for qhull: 1496 - CPU seconds to compute hull (after input): 0 + Number of distance tests for qhull: 1495 + CPU seconds to compute hull (after input): 0.001 rbox 100 s D3 | qhull T1cvV2P2 +[QH1008]qh_readpoints: read in 100 3-dimensional points +[QH0013]qh_initqhull_globals: for rbox 100 s D3 | qhull T1cvV2P2 + +Trace level T1, IStracing 0, point TP2, merge TM0, dist TW1.8e+308, qh.tracefacet_id -1, traceridge_id -1, tracevertex_id -1, last qh.RERUN 0, rbox 100 s D3 | qhull T1cvV2P2 +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213848649 Tcheck-frequently Tverify TV-stop-after-point 2 + Trace-point 2 _pre-merge _zero-centrum _max-width 0.94 + Error-roundoff 6.7e-16 _one-merge 4.7e-15 _near-inside 2.3e-14 + Visible-distance 1.3e-15 U-max-coplanar 1.3e-15 Width-outside 2.7e-15 + _wide-facet 8.1e-15 +qh_findbest: point p2 starting at f7 isnewfacets? 1, unless 0 exit if > 2.7e-15, testhorizon? 1, noupper? 0, Last qh_addpoint p41, Last merge #0, max_outside 4e-17 +qh_findbest: point p2 starting at f15 isnewfacets? 1, unless 0 exit if > 2.7e-15, testhorizon? 1, noupper? 0, Last qh_addpoint p52, Last merge #0, max_outside 1.1e-16 +qh_findbest: point p2 starting at f37 isnewfacets? 1, unless 0 exit if > 2.7e-15, testhorizon? 1, noupper? 0, Last qh_addpoint p73, Last merge #0, max_outside 1.1e-16 +qh_findbest: point p2 starting at f52 isnewfacets? 1, unless 0 exit if > 2.7e-15, testhorizon? 1, noupper? 0, Last qh_addpoint p87, Last merge #0, max_outside 1.1e-16 +qh_findbest: point p2 starting at f72 isnewfacets? 1, unless 0 exit if > 2.7e-15, testhorizon? 1, noupper? 0, Last qh_addpoint p76, Last merge #0, max_outside 1.1e-16 +qh_findbest: point p2 starting at f120 isnewfacets? 1, unless 0 exit if > 2.7e-15, testhorizon? 1, noupper? 0, Last qh_addpoint p84, Last merge #0, max_outside 1.1e-16 +qh_findbest: point p2 starting at f211 isnewfacets? 1, unless 0 exit if > 2.7e-15, testhorizon? 1, noupper? 0, Last qh_addpoint p10, Last merge #0, max_outside 1.1e-16 +qh_findbest: point p2 starting at f289 isnewfacets? 1, unless 0 exit if > 2.7e-15, testhorizon? 1, noupper? 0, Last qh_addpoint p6, Last merge #0, max_outside 1.1e-16 +[QH1049]qh_addpoint: add p2(v79) 0.014 above f288 to hull of 152 facets, 0 merges, 22 outside at 0.001 CPU secs. Previous p56(v78) delta 0.001 CPU, 152 facets, 0 merges, 390 hyperplanes, 3835 distplanes, 0 retries +[QH1040]qh_findhorizon: find horizon for point p2 facet f288 +[QH1041]qh_findhorizon: 5 horizon facets(good 5), 3 visible(good 3), 0 coplanar +[QH1032]qh_makenewfacets: created 5 new facets f390..f394 from point p2 to horizon +[QH1019]qh_matchnewfacets: match neighbors for new facets. +[QH1043]qh_partitionvisible: partitioned 0 points from outsidesets, 0 points from coplanarsets, and 0 deleted vertices +[QH1018]qh_deletevisible: delete 3 visible facets and 0 vertices +[QH1027]qh_checkpolygon: check all facets from f62, qh.NEWtentative? 0 +[QH1039]qh_buildhull: completed the hull construction +[QH1036]Qhull: algorithm completed +[QH1027]qh_checkpolygon: check all facets from f62, qh.NEWtentative? 0 +[QH1064]qh_checkconvex: check that facets are not-flipped and for qh.ZEROcentrum that simplicial vertices are below their neighbor (dist<0.0) -At a premature exit due to 'TVn', 'TCn', 'TRn', or precision error with 'QJn'. +Early exit due to 'TAn', 'TVn', 'TCn', 'TRn', or precision error with 'QJn'. Convex hull of 100 points in 3-d: Number of vertices: 79 @@ -8871,81 +11690,44 @@ Number of points processed: 79 Number of hyperplanes created: 395 - Number of distance tests for qhull: 1496 - CPU seconds to compute hull (after input): 0 + Number of distance tests for qhull: 1495 + CPU seconds to compute hull (after input): 0.001 -qh_readpoints: read in 100 3-dimensional points -qh_initqhull_globals: for rbox 100 s D3 | qhull T1cvV2P2 - -Trace level 1 for rbox 100 s D3 | qhull T1cvV2P2 -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99260947 Tcheck-frequently Tverify TV-stop-after-point 2 - Trace-point 2 _pre-merge _zero-centrum _max-width 0.94 - Error-roundoff 6.7e-016 _one-merge 4.7e-015 _near-inside 2.3e-014 - Visible-distance 1.3e-015 U-coplanar-distance 1.3e-015 - Width-outside 2.7e-015 _wide-facet 8.1e-015 -qh_findbest: point p2 starting at f7 isnewfacets? 1, unless 0 exit if > 2.7e-015 - testhorizon? 1 noupper? 0 Last point added was p41. Last merge was #0. max_outside 5.6e-017 -qh_findbest: point p2 starting at f15 isnewfacets? 1, unless 0 exit if > 2.7e-015 - testhorizon? 1 noupper? 0 Last point added was p52. Last merge was #0. max_outside 1.1e-016 -qh_findbest: point p2 starting at f37 isnewfacets? 1, unless 0 exit if > 2.7e-015 - testhorizon? 1 noupper? 0 Last point added was p73. Last merge was #0. max_outside 1.1e-016 -qh_findbest: point p2 starting at f52 isnewfacets? 1, unless 0 exit if > 2.7e-015 - testhorizon? 1 noupper? 0 Last point added was p87. Last merge was #0. max_outside 1.1e-016 -qh_findbest: point p2 starting at f72 isnewfacets? 1, unless 0 exit if > 2.7e-015 - testhorizon? 1 noupper? 0 Last point added was p76. Last merge was #0. max_outside 1.1e-016 -qh_findbest: point p2 starting at f120 isnewfacets? 1, unless 0 exit if > 2.7e-015 - testhorizon? 1 noupper? 0 Last point added was p84. Last merge was #0. max_outside 1.7e-016 -qh_findbest: point p2 starting at f211 isnewfacets? 1, unless 0 exit if > 2.7e-015 - testhorizon? 1 noupper? 0 Last point added was p10. Last merge was #0. max_outside 1.7e-016 -qh_findbest: point p2 starting at f289 isnewfacets? 1, unless 0 exit if > 2.7e-015 - testhorizon? 1 noupper? 0 Last point added was p6. Last merge was #0. max_outside 1.7e-016 -qh_addpoint: add p2(v79) to hull of 152 facets(0.014 above f288) and 22 outside at 0 CPU secs. Previous was p56. -qh_findhorizon: find horizon for point p2 facet f288 -qh_findhorizon: 5 horizon facets(good 5), 3 visible(good 3), 0 coplanar -qh_makenewfacets: created 5 new facets from point p2 to horizon -qh_matchnewfacets: match neighbors for new facets. -qh_partitionvisible: partitioned 0 points from outsidesets and 0 points from coplanarsets -qh_deletevisible: delete 3 visible facets and 0 vertices -qh_checkpolygon: check all facets from f390 -qh_buildhull: completed the hull construction -Qhull: algorithm completed -qh_checkpolygon: check all facets from f62 -qh_checkconvex: check all ridges are convex -qh_freeqhull: free global memory -qh_freebuild: free memory from qh_inithull and qh_buildhull +[QH1006]qh_freeqhull: free global memory +[QH1005]qh_freebuild: free memory from qh_inithull and qh_buildhull +[QH1061]qh_freeqhull: clear qhT except for qh.qhmem and qh.qhstat rbox 100 s D3 | qhull TcvF100 -Convex hull of 100 points in 3-d: - - Number of vertices: 100 - Number of facets: 196 - -Statistics for: rbox 100 s D3 | qhull TcvF100 - - Number of points processed: 100 - Number of hyperplanes created: 514 - Number of distance tests for qhull: 1691 - CPU seconds to compute hull (after input): 0 - - -At 21:22:35 & 0 CPU secs, qhull has created 102 facets and merged 0. +At 22:27:35 & 0.001 CPU secs, qhull has created 102 facets and merged 0. The current hull contains 46 facets and 25 vertices. There are 75 outside points. Next is point p55(v26), 0.035 above f44. -At 21:22:35 & 0 CPU secs, qhull has created 203 facets and merged 0. +At 22:27:35 & 0.001 CPU secs, qhull has created 203 facets and merged 0. The current hull contains 86 facets and 45 vertices. There are 55 outside points. Next is point p82(v46), 0.067 above f117. -At 21:22:35 & 0 CPU secs, qhull has created 306 facets and merged 0. +At 22:27:35 & 0.002 CPU secs, qhull has created 306 facets and merged 0. The current hull contains 122 facets and 63 vertices. There are 37 outside points. Next is point p50(v64), 0.042 above f218. -At 21:22:35 & 0 CPU secs, qhull has created 412 facets and merged 0. +At 22:27:35 & 0.002 CPU secs, qhull has created 412 facets and merged 0. The current hull contains 160 facets and 82 vertices. There are 18 outside points. Next is point p60(v83), 0.031 above f307. -Output completed. Verifying that all points are below 2e-015 of +Convex hull of 100 points in 3-d: + + Number of vertices: 100 + Number of facets: 196 + +Statistics for: rbox 100 s D3 | qhull TcvF100 + + Number of points processed: 100 + Number of hyperplanes created: 514 + Number of distance tests for qhull: 1690 + CPU seconds to compute hull (after input): 0.002 + + +Output completed. Verifying that all points are below 2e-15 of all facets. Will make 19600 distance computations. rbox 100 s D3 | qhull Qf Tcv @@ -8957,12 +11739,12 @@ Statistics for: rbox 100 s D3 | qhull Qf Tcv Number of points processed: 100 - Number of hyperplanes created: 504 - Number of distance tests for qhull: 4423 - CPU seconds to compute hull (after input): 0 + Number of hyperplanes created: 506 + Number of distance tests for qhull: 4421 + CPU seconds to compute hull (after input): 0.002 -Output completed. Verifying that all points are below 2e-015 of +Output completed. Verifying that all points are below 2e-15 of all facets. Will make 19600 distance computations. rbox 100 D3 | qhull Tcv @@ -8974,8 +11756,8 @@ Statistics for: rbox 100 D3 | qhull Tcv Number of points processed: 28 - Number of hyperplanes created: 110 - Number of distance tests for qhull: 1164 + Number of hyperplanes created: 109 + Number of distance tests for qhull: 1163 CPU seconds to compute hull (after input): 0 @@ -8992,7 +11774,7 @@ Number of points processed: 29 Number of hyperplanes created: 105 - Number of distance tests for qhull: 1176 + Number of distance tests for qhull: 1172 CPU seconds to compute hull (after input): 0 @@ -9008,12 +11790,11 @@ Statistics for: rbox 100 D5 | qhull Qs Tcv Number of points processed: 85 - Number of hyperplanes created: 4015 - Number of distance tests for qhull: 8584 - CPU seconds to compute hull (after input): 0.015 + Number of hyperplanes created: 4014 + Number of distance tests for qhull: 9050 + CPU seconds to compute hull (after input): 0.01 -QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point -is outside of a facet. See qh-optq.htm#Qx +QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point is outside of a facet. See qh-optq.htm#Qx Output completed. Verifying that all points are below outer planes of all facets. Will make 117400 distance computations. @@ -9027,8 +11808,8 @@ Statistics for: rbox 100 D3 | qhull Qr Tcv Number of points processed: 56 - Number of hyperplanes created: 294 - Number of distance tests for qhull: 2129 + Number of hyperplanes created: 293 + Number of distance tests for qhull: 2135 Output completed. Verifying that all points are below outer planes of @@ -9043,20 +11824,19 @@ Statistics for: rbox 100 D3 | qhull Qxv Tcv Number of points processed: 28 - Number of hyperplanes created: 110 - Number of distance tests for qhull: 1164 + Number of hyperplanes created: 109 + Number of distance tests for qhull: 1163 CPU seconds to compute hull (after input): 0 -QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point -is outside of a facet. See qh-optq.htm#Qx +QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point is outside of a facet. See qh-optq.htm#Qx Output completed. Verifying that all points are below outer planes of all facets. Will make 4800 distance computations. -rbox 100 D3 | qhull Qi f Pd0 Pd1 Pd2 Tcv +rbox 100 D3 | qhull Qi f Pd0 Pd1 Pd2 Pg Tcv Vertices and facets: - p11(v14): -0.31 0.47 0.07 - p59(v8): 0.44 0.42 -0.11 -- p33(v2): -0.067 0.49 -0.11 +- p33(v3): -0.067 0.49 -0.11 - p48(v25): 0.25 0.24 0.44 - p37(v15): 0.45 0.26 0.04 - p38(v5): 0.42 -0.25 0.42 @@ -9067,7 +11847,7 @@ - coplanar set(furthest p70): p70: 0.04762 0.3507 -0.06712 furthest distance= -0.1 - - vertices: p11(v14) p59(v8) p33(v2) + - vertices: p11(v14) p59(v8) p33(v3) - neighboring facets: f52 f41 f93 - f93 - flags: top simplicial @@ -9101,22 +11881,22 @@ Vertices and facets: - p6(v6): 0.5 0.5 -0.5 neighbors: f1 f9 f10 -- p2(v2): -0.5 0.5 -0.5 +- p2(v3): -0.5 0.5 -0.5 neighbors: f1 f3 f10 -- p4(v1): 0.5 -0.5 -0.5 +- p4(v2): 0.5 -0.5 -0.5 neighbors: f1 f2 f9 -- p0(v0): -0.5 -0.5 -0.5 +- p0(v1): -0.5 -0.5 -0.5 neighbors: f1 f2 f3 - p5(v7): 0.5 -0.5 0.5 neighbors: f2 f9 f13 -- p1(v3): -0.5 -0.5 0.5 +- p1(v4): -0.5 -0.5 0.5 neighbors: f2 f3 f13 - p7(v5): 0.5 0.5 0.5 - neighbors: f9 f10 f13 + neighbors: f10 f13 f9 - p3(v8): -0.5 0.5 0.5 neighbors: f3 f10 f13 - f1 - - flags: bottom tested seen coplanar + - flags: bottom tested - merges: 1 - normal: -0 -0 -1 - offset: -0.5 @@ -9124,23 +11904,23 @@ - coplanar set(furthest p8): p8: 0 0 -0.5 furthest distance= 0 - - vertices: p6(v6) p2(v2) p4(v1) p0(v0) - - neighboring facets: f2 f3 f9 f10 + - vertices: p6(v6) p2(v3) p4(v2) p0(v1) + - neighboring facets: f2 f3 f10 f9 - ridges: - - r4 tested - vertices: p2(v2) p0(v0) + - r4 tested simplicialtop simplicialbot + vertices: p2(v3) p0(v1) between f1 and f3 - - r3 tested - vertices: p4(v1) p0(v0) + - r3 tested simplicialtop simplicialbot + vertices: p4(v2) p0(v1) between f2 and f1 - - r1 tested - vertices: p6(v6) p4(v1) + - r1 tested simplicialtop + vertices: p6(v6) p4(v2) between f9 and f1 - - r2 tested - vertices: p6(v6) p2(v2) + - r2 tested simplicialbot + vertices: p6(v6) p2(v3) between f1 and f10 - f2 - - flags: top tested seen coplanar + - flags: top tested - merges: 1 - normal: 0 -1 0 - offset: -0.5 @@ -9148,23 +11928,23 @@ - coplanar set(furthest p10): p10: 0 -0.5 0 furthest distance= 0 - - vertices: p5(v7) p1(v3) p4(v1) p0(v0) - - neighboring facets: f1 f3 f9 f13 + - vertices: p5(v7) p1(v4) p4(v2) p0(v1) + - neighboring facets: f1 f3 f13 f9 - ridges: - - r3 tested - vertices: p4(v1) p0(v0) + - r3 tested simplicialtop simplicialbot + vertices: p4(v2) p0(v1) between f2 and f1 - - r8 tested - vertices: p1(v3) p0(v0) + - r8 tested simplicialtop simplicialbot + vertices: p1(v4) p0(v1) between f3 and f2 - - r7 tested - vertices: p5(v7) p1(v3) + - r7 tested simplicialtop + vertices: p5(v7) p1(v4) between f13 and f2 - r6 tested - vertices: p5(v7) p4(v1) + vertices: p5(v7) p4(v2) between f2 and f9 - f9 - - flags: bottom tested seen coplanar + - flags: bottom tested - merges: 1 - normal: 1 -0 -0 - offset: -0.5 @@ -9172,23 +11952,23 @@ - coplanar set(furthest p13): p13: 0.5 0 0 furthest distance= 0 - - vertices: p5(v7) p6(v6) p7(v5) p4(v1) + - vertices: p5(v7) p6(v6) p7(v5) p4(v2) - neighboring facets: f2 f1 f10 f13 - ridges: - - r1 tested - vertices: p6(v6) p4(v1) + - r1 tested simplicialtop + vertices: p6(v6) p4(v2) between f9 and f1 - r6 tested - vertices: p5(v7) p4(v1) + vertices: p5(v7) p4(v2) between f2 and f9 - - r10 tested + - r10 tested simplicialbot vertices: p5(v7) p7(v5) between f9 and f13 - - r11 tested + - r11 tested simplicialtop simplicialbot vertices: p6(v6) p7(v5) between f10 and f9 - f3 - - flags: bottom tested seen coplanar + - flags: bottom tested - merges: 1 - normal: -1 -0 -0 - offset: -0.5 @@ -9196,23 +11976,23 @@ - coplanar set(furthest p12): p12: -0.5 0 0 furthest distance= 0 - - vertices: p3(v8) p1(v3) p2(v2) p0(v0) - - neighboring facets: f1 f2 f10 f13 + - vertices: p3(v8) p1(v4) p2(v3) p0(v1) + - neighboring facets: f1 f2 f13 f10 - ridges: - - r4 tested - vertices: p2(v2) p0(v0) + - r4 tested simplicialtop simplicialbot + vertices: p2(v3) p0(v1) between f1 and f3 - r13 tested - vertices: p3(v8) p2(v2) + vertices: p3(v8) p2(v3) between f10 and f3 - r14 tested - vertices: p3(v8) p1(v3) + vertices: p3(v8) p1(v4) between f3 and f13 - - r8 tested - vertices: p1(v3) p0(v0) + - r8 tested simplicialtop simplicialbot + vertices: p1(v4) p0(v1) between f3 and f2 - f10 - - flags: top tested seen coplanar + - flags: top tested - merges: 1 - normal: 0 1 -0 - offset: -0.5 @@ -9220,23 +12000,23 @@ - coplanar set(furthest p11): p11: 0 0.5 0 furthest distance= 0 - - vertices: p3(v8) p6(v6) p7(v5) p2(v2) + - vertices: p3(v8) p6(v6) p7(v5) p2(v3) - neighboring facets: f3 f1 f9 f13 - ridges: - - r2 tested - vertices: p6(v6) p2(v2) + - r2 tested simplicialbot + vertices: p6(v6) p2(v3) between f1 and f10 - - r11 tested + - r11 tested simplicialtop simplicialbot vertices: p6(v6) p7(v5) between f10 and f9 - r16 tested vertices: p3(v8) p7(v5) between f13 and f10 - r13 tested - vertices: p3(v8) p2(v2) + vertices: p3(v8) p2(v3) between f10 and f3 - f13 - - flags: bottom tested seen coplanar + - flags: bottom tested - merges: 1 - normal: -0 -0 1 - offset: -0.5 @@ -9244,19 +12024,19 @@ - coplanar set(furthest p9): p9: 0 0 0.5 furthest distance= 0 - - vertices: p3(v8) p5(v7) p7(v5) p1(v3) + - vertices: p3(v8) p5(v7) p7(v5) p1(v4) - neighboring facets: f10 f2 f9 f3 - ridges: - - r7 tested - vertices: p5(v7) p1(v3) + - r7 tested simplicialtop + vertices: p5(v7) p1(v4) between f13 and f2 - r14 tested - vertices: p3(v8) p1(v3) + vertices: p3(v8) p1(v4) between f3 and f13 - r16 tested vertices: p3(v8) p7(v5) between f13 and f10 - - r10 tested + - r10 tested simplicialbot vertices: p5(v7) p7(v5) between f9 and f13 @@ -9283,6 +12063,11 @@ Output completed. Verifying that all points are below outer planes of all facets. Will make 84 distance computations. rbox 100 D3 | qhull QbB FO Tcv +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213865456 QbBound-unit-box 0.5 Tcheck-frequently Tverify + _pre-merge _zero-centrum _max-width 1 Error-roundoff 6.9e-16 + _one-merge 4.9e-15 _near-inside 2.4e-14 Visible-distance 1.4e-15 + U-max-coplanar 1.4e-15 Width-outside 2.8e-15 _wide-facet 8.3e-15 Convex hull of 100 points in 3-d: @@ -9292,19 +12077,19 @@ Statistics for: rbox 100 D3 | qhull QbB FO Tcv Number of points processed: 28 - Number of hyperplanes created: 110 - Number of distance tests for qhull: 1164 + Number of hyperplanes created: 109 + Number of distance tests for qhull: 1163 CPU seconds to compute hull (after input): 0 -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99277754 QbBound-unit-box 0.5 Tcheck-frequently Tverify _pre-merge - _zero-centrum _max-width 1 Error-roundoff 6.9e-016 _one-merge 4.9e-015 - _near-inside 2.4e-014 Visible-distance 1.4e-015 - U-coplanar-distance 1.4e-015 Width-outside 2.8e-015 _wide-facet 8.3e-015 Output completed. Verifying that all points are below outer planes of all facets. Will make 4800 distance computations. rbox 1000 D2 B1e6 | qhull d Qbb FO Tcv +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213865456 delaunay Qbbound-last Tcheck-frequently Tverify + _pre-merge _zero-centrum Pgood _max-width 2e+06 Error-roundoff 1.4e-09 + _one-merge 9.7e-09 _near-inside 4.9e-08 Visible-distance 2.8e-09 + U-max-coplanar 2.8e-09 Width-outside 5.5e-09 _wide-facet 1.7e-08 Delaunay triangulation by the convex hull of 1000 points in 3-d: @@ -9314,82 +12099,77 @@ Statistics for: rbox 1000 D2 B1e6 | qhull d Qbb FO Tcv Number of points processed: 1000 - Number of hyperplanes created: 5422 + Number of hyperplanes created: 5457 Number of facets in hull: 1996 - Number of distance tests for qhull: 27767 - CPU seconds to compute hull (after input): 0 + Number of distance tests for qhull: 27959 + CPU seconds to compute hull (after input): 0.036 -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99277754 delaunay Qbbound-last Tcheck-frequently Tverify - _pre-merge _zero-centrum Pgood _max-width 2e+006 Error-roundoff 2.8e-009 - _one-merge 1.9e-008 _near-inside 9.7e-008 Visible-distance 5.5e-009 - U-coplanar-distance 5.5e-009 Width-outside 1.1e-008 _wide-facet 3.3e-008 qhull output completed. Verifying that 1000 points are -below 8.3e-009 of the nearest facet. +below 4.2e-09 of the nearest facet. rbox 10 D3 | qhull QbB p Tcv 3 9 --0.08928142660407056 -0.3194671263098747 0.3605569202297553 +-0.08928142660407055 -0.3194671263098747 0.3605569202297553 -0.1534778158747162 0.03516440701453921 0.5 -0.01663016790622804 0.3709299907861695 0.0764863283135003 0.3932651765570926 0.4421392241401818 -0.09396622763110282 0.199424728304684 0.5 0.06620718432588452 --0.2331094527352667 0.3262436269787957 -0.1289660986727641 +-0.2331094527352667 0.3262436269787957 -0.128966098672764 -0.5 0.2819439085196089 -0.5 0.4999999999999999 0.3760666748352666 0.1399187075693636 0.4888102268053206 -0.5 -0.2153953634886358 -Output completed. Verifying that all points are below 2.1e-015 of +Output completed. Verifying that all points are below 2.1e-15 of all facets. Will make 140 distance computations. rbox 10 D3 | qhull Qbb p Tcv +QH7040 qhull option warning: option 'Qbb' (scale-last-coordinate) is normally used with 'd' or 'v' 3 9 --0.0222149361131852 -0.366434993563625 0.5972263834933854 --0.06676722137887703 -0.1566931052661437 0.6939998615477234 -0.02820502736438535 0.04189077954915421 0.4000814320337247 -0.3126723396709863 0.08400649026409401 0.2817873818077145 -0.1781470954214661 0.1182274414396169 0.3929477075294902 --0.1220315663349177 0.01546165115708642 0.2574974761506134 +-0.0222149361131852 -0.366434993563625 0.4072229792632261 +-0.06676722137887703 -0.1566931052661437 0.4732086509216659 +0.02820502736438535 0.04189077954915421 0.272798317696016 +0.3126723396709863 0.08400649026409401 0.1921386936513206 +0.1781470954214661 0.1182274414396169 0.2679341378370068 +-0.1220315663349177 0.01546165115708642 0.1755764518932639 -0.3072535691850387 -0.01073880122111998 0 -0.3867462923626847 0.04492879989084675 0.4441034944549365 -0.3789805913148268 -0.4732086509216658 0.1975155783347269 -QH7040 qhull input warning: option 'Qbb' (scale-last-coordinate) is normally used with 'd' or 'v' +0.3867462923626847 0.04492879989084675 0.3028150683084346 +0.3789805913148268 -0.4732086509216658 0.1346773760895938 -Output completed. Verifying that all points are below 2.9e-015 of +Output completed. Verifying that all points are below 2e-15 of all facets. Will make 140 distance computations. rbox 10 D3 | qhull Qb0:-10B2:20 p Tcv 3 9 -5.733970380575339 -0.366434993563625 17.14322461142018 --6.400761988815289 -0.1566931052661437 20 --4.97936018866004 0.04189077954915421 11.32346018178494 +-6.400761988815288 -0.1566931052661437 20 +-4.97936018866004 0.04189077954915421 11.32346018178493 -0.7218812392989191 0.08400649026409401 7.831392539952951 -2.735252796494545 0.1182274414396169 11.11287098934976 --7.227875597731384 0.01546165115708642 7.114348923589699 +-7.227875597731384 0.01546165115708642 7.114348923589702 -10 -0.01073880122111998 -0.4870359524963758 0.3867462923626847 0.04492879989084675 12.62300161615219 -0.2705209571204694 -0.4732086509216658 5.343669467959106 +0.2705209571204694 -0.4732086509216658 5.343669467959105 -Output completed. Verifying that all points are below 7.5e-014 of +Output completed. Verifying that all points are below 7.5e-14 of all facets. Will make 140 distance computations. rbox 10 D3 | qhull Qb0:-10B2:20 p Tcv | qhull QbB p Tcv -Output completed. Verifying that all points are below 7.5e-014 of +Output completed. Verifying that all points are below 7.5e-14 of all facets. Will make 140 distance computations. 3 9 -0.08928142660407051 -0.3194671263098747 0.3605569202297555 --0.1534778158747163 0.03516440701453921 0.5 --0.01663016790622796 0.3709299907861695 0.07648632831350066 +-0.153477815874716 0.03516440701453921 0.5 +-0.01663016790622796 0.3709299907861695 0.07648632831350011 0.3932651765570927 0.4421392241401818 -0.09396622763110274 0.1994247283046841 0.5 0.06620718432588446 --0.2331094527352668 0.3262436269787957 -0.128966098672764 +-0.2331094527352668 0.3262436269787957 -0.1289660986727639 -0.5 0.2819439085196089 -0.4999999999999999 0.5 0.3760666748352666 0.1399187075693635 0.4888102268053207 -0.5 -0.2153953634886357 -Output completed. Verifying that all points are below 2.1e-015 of +Output completed. Verifying that all points are below 2.1e-15 of all facets. Will make 126 distance computations. rbox 10 D3 | qhull Qb1:0B1:0 d Tcv Q8 @@ -9401,16 +12181,14 @@ Statistics for: rbox 10 D3 | qhull Qb1:0B1:0 d Tcv Q8 Number of points processed: 10 - Number of hyperplanes created: 32 + Number of hyperplanes created: 31 Number of facets in hull: 16 - Number of distance tests for qhull: 62 + Number of distance tests for qhull: 61 CPU seconds to compute hull (after input): 0 -QH7077 qhull input warning: no outer plane check ('Q5') or no processing of -near-inside points ('Q8'). Verify may report that a point is outside -of a facet. +QH7077 qhull input warning: no outer plane check ('Q5') or no processing of near-inside points ('Q8'). Verify may report that a point is outside of a facet. -Output completed. Verifying that all points are below 2e-015 of +Output completed. Verifying that all points are below 2e-15 of all facets. Will make 140 distance computations. rbox 10 D3 | qhull Qb1:0B1:0B2:0 d Tcv Q8 @@ -9422,16 +12200,14 @@ Statistics for: rbox 10 D3 | qhull Qb1:0B1:0B2:0 d Tcv Q8 Number of points processed: 10 - Number of hyperplanes created: 32 + Number of hyperplanes created: 31 Number of facets in hull: 16 - Number of distance tests for qhull: 62 + Number of distance tests for qhull: 61 CPU seconds to compute hull (after input): 0 -QH7077 qhull input warning: no outer plane check ('Q5') or no processing of -near-inside points ('Q8'). Verify may report that a point is outside -of a facet. +QH7077 qhull input warning: no outer plane check ('Q5') or no processing of near-inside points ('Q8'). Verify may report that a point is outside of a facet. -Output completed. Verifying that all points are below 2e-015 of +Output completed. Verifying that all points are below 2e-15 of all facets. Will make 140 distance computations. rbox 10 D3 | qhull Qb1:0 d Tcv @@ -9443,13 +12219,13 @@ Statistics for: rbox 10 D3 | qhull Qb1:0 d Tcv Number of points processed: 10 - Number of hyperplanes created: 44 + Number of hyperplanes created: 43 Number of facets in hull: 27 - Number of distance tests for qhull: 67 + Number of distance tests for qhull: 66 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 2.9e-015 of +Output completed. Verifying that all points are below 2.9e-15 of all facets. Will make 180 distance computations. rbox 10 D3 | qhull Qb1:0B1:0 Tcv @@ -9462,36 +12238,36 @@ Number of points processed: 4 Number of hyperplanes created: 6 - Number of distance tests for qhull: 49 + Number of distance tests for qhull: 48 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 1.3e-015 of +Output completed. Verifying that all points are below 1.3e-15 of all facets. Will make 40 distance computations. echo "== next command will error ${d:-`date`} ==" -date -== next command will error Mon Jan 18 21:22:35 EST 2016 == +== next command will error Fri, Jul 24, 2020 10:27:36 PM == rbox 10 D2 | qhull Qb1:1B1:1 Tcv QH6154 Qhull precision error: Initial simplex is flat (facet 1 is coplanar with the interior point) While executing: rbox 10 D2 | qhull Qb1:1B1:1 Tcv -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99277754 Qbound-dim-low 1 1 QBound-dim-high 1 1 Tcheck-frequently - Tverify _pre-merge _zero-centrum _max-width 0.81 Error-roundoff 8.6e-016 - _one-merge 4.3e-015 _near-inside 2.1e-014 Visible-distance 1.7e-015 - U-coplanar-distance 1.7e-015 Width-outside 3.4e-015 _wide-facet 1e-014 +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213865456 Qbound-dim-low 1 1 QBound-dim-high 1 1 + Tcheck-frequently Tverify _pre-merge _zero-centrum _max-width 0.81 + Error-roundoff 8.6e-16 _one-merge 4.3e-15 _near-inside 2.1e-14 + Visible-distance 1.7e-15 U-max-coplanar 1.7e-15 Width-outside 3.4e-15 + _wide-facet 1e-14 _maxoutside 5.1e-15 The input to qhull appears to be less than 2 dimensional, or a computation has overflowed. Qhull could not construct a clearly convex simplex from points: -- p0(v2): -0.022 1 -- p4(v1): 0.38 1 -- p1(v0): -0.43 1 +- p0(v3): -0.022 1 +- p4(v2): 0.38 1 +- p1(v1): -0.43 1 The center point is coplanar with a facet, or a vertex is coplanar with a neighboring facet. The maximum round off error for -computing distances is 8.6e-016. The center point, facets and distances +computing distances is 8.6e-16. The center point, facets and distances to the center point are as follows: center point -0.02391 1 @@ -9514,7 +12290,7 @@ - use 'QbB' to scale the points to the unit cube - use 'QR0' to randomly rotate the input for different maximum points - use 'Qs' to search all points for the initial simplex - - use 'En' to specify a maximum roundoff error less than 8.6e-016. + - use 'En' to specify a maximum roundoff error less than 8.6e-16. - trace execution with 'T3' to see the determinant for each point. If the input is lower dimensional: @@ -9526,149 +12302,147 @@ into a coordinate plane, and delete the other coordinates. - add one or more points to make the input full dimensional. rbox 200 L20 D2 t | qhull FO Tcv C-0 +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213865456 Tcheck-frequently Tverify Centrum-premerge- 0 + _zero-centrum _max-width 0.98 Error-roundoff 3.4e-16 _one-merge 1.7e-15 + _near-inside 8.5e-15 Visible-distance 6.8e-16 U-max-coplanar 6.8e-16 + Width-outside 1.4e-15 _wide-facet 4.1e-15 Convex hull of 200 points in 2-d: Number of vertices: 200 Number of facets: 200 -Statistics for: rbox 200 L20 D2 t1453170155 | qhull FO Tcv C-0 +Statistics for: rbox 200 L20 D2 t1595644056 | qhull FO Tcv C-0 Number of points processed: 200 - Number of hyperplanes created: 398 - Number of distance tests for qhull: 2092 - CPU seconds to compute hull (after input): 0 + Number of hyperplanes created: 397 + Number of distance tests for qhull: 2118 + CPU seconds to compute hull (after input): 0.002 -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99277754 Tcheck-frequently Tverify Centrum-premerge- 0 - _zero-centrum _max-width 0.99 Error-roundoff 3.4e-016 _one-merge 1.7e-015 - _near-inside 8.5e-015 Visible-distance 6.8e-016 - U-coplanar-distance 6.8e-016 Width-outside 1.4e-015 _wide-facet 4.1e-015 -Output completed. Verifying that all points are below 1e-015 of +Output completed. Verifying that all points are below 1e-15 of all facets. Will make 40000 distance computations. rbox 1000 L20 t | qhull FO Tcv C-0 +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213865456 Tcheck-frequently Tverify Centrum-premerge- 0 + _zero-centrum _max-width 1 Error-roundoff 6.9e-16 _one-merge 4.8e-15 + _near-inside 2.4e-14 Visible-distance 1.4e-15 U-max-coplanar 1.4e-15 + Width-outside 2.8e-15 _wide-facet 8.3e-15 Convex hull of 1000 points in 3-d: - Number of vertices: 58 - Number of facets: 112 + Number of vertices: 49 + Number of facets: 94 -Statistics for: rbox 1000 L20 t1453170155 | qhull FO Tcv C-0 +Statistics for: rbox 1000 L20 t1595644056 | qhull FO Tcv C-0 - Number of points processed: 68 - Number of hyperplanes created: 305 - Number of distance tests for qhull: 13232 - CPU seconds to compute hull (after input): 0 + Number of points processed: 63 + Number of hyperplanes created: 272 + Number of distance tests for qhull: 13669 + CPU seconds to compute hull (after input): 0.001 -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99277754 Tcheck-frequently Tverify Centrum-premerge- 0 - _zero-centrum _max-width 1 Error-roundoff 6.9e-016 _one-merge 4.8e-015 - _near-inside 2.4e-014 Visible-distance 1.4e-015 - U-coplanar-distance 1.4e-015 Width-outside 2.8e-015 _wide-facet 8.3e-015 Output completed. Verifying that all points are below outer planes of -all facets. Will make 112000 distance computations. +all facets. Will make 94000 distance computations. rbox 200 L20 D4 t | qhull FO Tcv C-0 +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213865456 Tcheck-frequently Tverify Centrum-premerge- 0 + _zero-centrum _max-width 0.99 Error-roundoff 1e-15 _one-merge 9.1e-15 + _near-inside 4.5e-14 Visible-distance 6e-15 U-max-coplanar 6e-15 + Width-outside 1.2e-14 _wide-facet 3.6e-14 Convex hull of 200 points in 4-d: - Number of vertices: 57 - Number of facets: 260 + Number of vertices: 55 + Number of facets: 261 -Statistics for: rbox 200 L20 D4 t1453170155 | qhull FO Tcv C-0 +Statistics for: rbox 200 L20 D4 t1595644056 | qhull FO Tcv C-0 Number of points processed: 67 - Number of hyperplanes created: 706 - Number of distance tests for qhull: 5628 - CPU seconds to compute hull (after input): 0.015 + Number of hyperplanes created: 823 + Number of distance tests for qhull: 6036 + CPU seconds to compute hull (after input): 0.002 -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99277754 Tcheck-frequently Tverify Centrum-premerge- 0 - _zero-centrum _max-width 1 Error-roundoff 1e-015 _one-merge 9e-015 - _near-inside 4.5e-014 Visible-distance 6e-015 U-coplanar-distance 6e-015 - Width-outside 1.2e-014 _wide-facet 3.6e-014 Output completed. Verifying that all points are below outer planes of -all facets. Will make 52000 distance computations. +all facets. Will make 52200 distance computations. rbox 200 L20 D5 t | qhull FO Tcv Qx +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213865456 Tcheck-frequently Tverify Qxact-merge _zero-centrum + _max-width 0.99 Error-roundoff 1.4e-15 _one-merge 1.5e-14 + _near-inside 7.5e-14 Visible-distance 8.2e-15 U-max-coplanar 8.2e-15 + Width-outside 1.6e-14 _wide-facet 4.9e-14 Convex hull of 200 points in 5-d: - Number of vertices: 95 - Number of facets: 1406 + Number of vertices: 90 + Number of facets: 1272 -Statistics for: rbox 200 L20 D5 t1453170155 | qhull FO Tcv Qx +Statistics for: rbox 200 L20 D5 t1595644056 | qhull FO Tcv Qx - Number of points processed: 107 - Number of hyperplanes created: 4426 - Number of distance tests for qhull: 16507 - CPU seconds to compute hull (after input): 0.015 + Number of points processed: 111 + Number of hyperplanes created: 3928 + Number of distance tests for qhull: 17297 + CPU seconds to compute hull (after input): 0.013 -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99277754 Tcheck-frequently Tverify Qxact-merge _zero-centrum - _max-width 0.99 Error-roundoff 1.4e-015 _one-merge 1.5e-014 - _near-inside 7.5e-014 Visible-distance 8.2e-015 - U-coplanar-distance 8.2e-015 Width-outside 1.6e-014 _wide-facet 4.9e-014 -QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point -is outside of a facet. See qh-optq.htm#Qx +QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point is outside of a facet. See qh-optq.htm#Qx Output completed. Verifying that all points are below outer planes of -all facets. Will make 281200 distance computations. +all facets. Will make 254400 distance computations. rbox 1000 W1e-3 s D2 t | qhull d FO Tcv Qu Q0 +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213882263 delaunay Tcheck-frequently Tverify QupperDelaunay + Q0-no-premerge Pgood _max-width 1 Error-roundoff 6.9e-16 + Visible-distance 6.9e-16 U-max-coplanar 6.9e-16 Width-outside 1.4e-15 + _wide-facet 4.2e-15 Furthest-site Delaunay triangulation by the convex hull of 1000 points in 3-d: Number of input sites: 1000 - Number of Delaunay regions: 265 + Number of Delaunay regions: 259 -Statistics for: rbox 1000 W1e-3 s D2 t1453170155 | qhull d FO Tcv Qu Q0 +Statistics for: rbox 1000 W1e-3 s D2 t1595644057 | qhull d FO Tcv Qu Q0 Number of points processed: 1000 - Number of hyperplanes created: 4817 + Number of hyperplanes created: 4694 Number of facets in hull: 1996 - Number of distance tests for qhull: 27138 - CPU seconds to compute hull (after input): 0 + Number of distance tests for qhull: 27601 + CPU seconds to compute hull (after input): 0.037 -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99277754 delaunay Tcheck-frequently Tverify QupperDelaunay - Q0-no-premerge Pgood _max-width 1 Error-roundoff 6.9e-016 - Visible-distance 6.9e-016 U-coplanar-distance 6.9e-016 - Width-outside 1.4e-015 _wide-facet 4.2e-015 -Output completed. Verifying that all points are below 2.1e-015 of -all facets. Will make 265000 distance computations. +Output completed. Verifying that all points are below 2.1e-15 of +all facets. Will make 259000 distance computations. rbox 1000 W1e-3 s D2 t | qhull d FO Tcv Qu C-0 +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213882263 delaunay Tcheck-frequently Tverify QupperDelaunay + Centrum-premerge- 0 _zero-centrum Pgood _max-width 1 + Error-roundoff 6.9e-16 _one-merge 4.9e-15 _near-inside 2.4e-14 + Visible-distance 1.4e-15 U-max-coplanar 1.4e-15 Width-outside 2.8e-15 + _wide-facet 8.3e-15 Furthest-site Delaunay triangulation by the convex hull of 1000 points in 3-d: Number of input sites: 1000 - Number of Delaunay regions: 271 + Number of Delaunay regions: 259 -Statistics for: rbox 1000 W1e-3 s D2 t1453170156 | qhull d FO Tcv Qu C-0 +Statistics for: rbox 1000 W1e-3 s D2 t1595644057 | qhull d FO Tcv Qu C-0 Number of points processed: 1000 - Number of hyperplanes created: 4634 + Number of hyperplanes created: 4694 Number of facets in hull: 1996 - Number of distance tests for qhull: 27485 - CPU seconds to compute hull (after input): 0 + Number of distance tests for qhull: 27601 + CPU seconds to compute hull (after input): 0.035 -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99294561 delaunay Tcheck-frequently Tverify QupperDelaunay - Centrum-premerge- 0 _zero-centrum Pgood _max-width 1 - Error-roundoff 6.9e-016 _one-merge 4.9e-015 _near-inside 2.4e-014 - Visible-distance 1.4e-015 U-coplanar-distance 1.4e-015 - Width-outside 2.8e-015 _wide-facet 8.3e-015 - -Output completed. Verifying that all points are below 2.1e-015 of -all facets. Will make 271000 distance computations. - -echo === check joggle and TRn ${d:-`date`} -date -=== check joggle and TRn Mon Jan 18 21:22:36 EST 2016 + +Output completed. Verifying that all points are below 2.1e-15 of +all facets. Will make 259000 distance computations. + +set +v +=== check joggle and TRn Fri, Jul 24, 2020 10:27:37 PM rbox 100 W0 | qhull QJ1e-14 Qc TR100 Tv -At a premature exit due to 'TVn', 'TCn', 'TRn', or precision error with 'QJn'. +Early exit due to 'TAn', 'TVn', 'TCn', 'TRn', or precision error with 'QJn'. Convex hull of 100 points in 3-d: Number of vertices: 15 @@ -9678,9 +12452,9 @@ Statistics for: rbox 100 W0 | qhull QJ1e-14 Qc TR100 Tv Number of points processed: 15 - Number of hyperplanes created: 11270 - Number of distance tests for qhull: 120689 - CPU seconds to compute hull (after input): 0.015 + Number of hyperplanes created: 11218 + Number of distance tests for qhull: 119030 + CPU seconds to compute hull (after input): 0.008 Percentage of runs with precision errors: 100.0 @@ -9689,7 +12463,7 @@ 400 coplanar points during partitioning rbox 100 W0 | qhull QJ1e-13 Qc TR100 Tv -At a premature exit due to 'TVn', 'TCn', 'TRn', or precision error with 'QJn'. +Early exit due to 'TAn', 'TVn', 'TCn', 'TRn', or precision error with 'QJn'. Convex hull of 100 points in 3-d: Number of vertices: 28 @@ -9699,9 +12473,9 @@ Statistics for: rbox 100 W0 | qhull QJ1e-13 Qc TR100 Tv Number of points processed: 28 - Number of hyperplanes created: 24800 - Number of distance tests for qhull: 197857 - CPU seconds to compute hull (after input): 0.031 + Number of hyperplanes created: 24747 + Number of distance tests for qhull: 195826 + CPU seconds to compute hull (after input): 0.016 Percentage of runs with precision errors: 63.0 @@ -9711,7 +12485,7 @@ 119 coplanar points during partitioning rbox 100 W0 | qhull QJ1e-12 Qc TR100 Tv -At a premature exit due to 'TVn', 'TCn', 'TRn', or precision error with 'QJn'. +Early exit due to 'TAn', 'TVn', 'TCn', 'TRn', or precision error with 'QJn'. Convex hull of 100 points in 3-d: Number of vertices: 40 @@ -9721,9 +12495,9 @@ Statistics for: rbox 100 W0 | qhull QJ1e-12 Qc TR100 Tv Number of points processed: 40 - Number of hyperplanes created: 29205 - Number of distance tests for qhull: 217398 - CPU seconds to compute hull (after input): 0.031 + Number of hyperplanes created: 29152 + Number of distance tests for qhull: 216487 + CPU seconds to compute hull (after input): 0.017 Percentage of runs with precision errors: 8.0 @@ -9742,16 +12516,16 @@ Statistics for: rbox 100 W0 | qhull QJ1e-11 Qc TR100 Tv Number of points processed: 75 - Number of hyperplanes created: 29630 - Number of distance tests for qhull: 219104 - CPU seconds to compute hull (after input): 0.031 + Number of hyperplanes created: 29577 + Number of distance tests for qhull: 218409 + CPU seconds to compute hull (after input): 0.017 Percentage of runs with precision errors: 0.0 precision problems (corrected unless 'Q0' or an error) 3 coplanar points during partitioning -Output completed. Verifying that all points are below 2.1e-015 of +Output completed. Verifying that all points are below 2.1e-15 of all facets. Will make 12800 distance computations. rbox 100 W0 | qhull QJ1e-10 Qc TR100 Tv @@ -9764,15 +12538,22 @@ Statistics for: rbox 100 W0 | qhull QJ1e-10 Qc TR100 Tv Number of points processed: 75 - Number of hyperplanes created: 29636 - Number of distance tests for qhull: 218960 - CPU seconds to compute hull (after input): 0.031 + Number of hyperplanes created: 29583 + Number of distance tests for qhull: 218315 + CPU seconds to compute hull (after input): 0.018 Percentage of runs with precision errors: 0.0 -Output completed. Verifying that all points are below 2.1e-015 of +Output completed. Verifying that all points are below 2.1e-15 of all facets. Will make 12800 distance computations. rbox 100 | qhull d QJ Qb0:1e4 QB0:1e5 Qb1:1e4 QB1:1e6 Qb2:1e5 QB2:1e7 FO Tv +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213882263 delaunay Qbound-dim-low 0 1e+04 QBound-dim-high 0 1e+05 + Qbound-dim-low 1 1e+04 QBound-dim-high 1 1e+06 Qbound-dim-low 2 1e+05 + QBound-dim-high 2 1e+07 Tverify Pgood _run 1 QJoggle 6.7e+03 + _joggle-seed 16807 _max-width 1e+14 Error-roundoff 0.11 + Visible-distance 0.11 U-max-coplanar 0.11 Width-outside 0.23 + _wide-facet 0.68 Delaunay triangulation by the convex hull of 100 points in 4-d: @@ -9782,56 +12563,47 @@ Statistics for: rbox 100 | qhull d QJ Qb0:1e4 QB0:1e5 Qb1:1e4 QB1:1e6 Qb2:1e5 QB2:1e7 FO Tv Number of points processed: 100 - Number of hyperplanes created: 1578 + Number of hyperplanes created: 1477 Number of facets in hull: 560 - Number of distance tests for qhull: 3924 - CPU seconds to compute hull (after input): 0 - Input joggled by: 6.7e+003 + Number of distance tests for qhull: 3418 + CPU seconds to compute hull (after input): 0.001 + Input joggled by: 6.7e+03 -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99294561 delaunay Qbound-dim-low 0 1e+004 QBound-dim-high 0 1e+005 - Qbound-dim-low 1 1e+004 QBound-dim-high 1 1e+006 Qbound-dim-low 2 1e+005 - QBound-dim-high 2 1e+007 Tverify Pgood _run 1 QJoggle 6.7e+003 - _joggle-seed 16807 _max-width 1e+014 Error-roundoff 0.11 - Visible-distance 0.11 U-coplanar-distance 0.11 Width-outside 0.23 - _wide-facet 0.68 Output completed. Verifying that all points are below 0.34 of all facets. Will make 48800 distance computations. -echo === check precision options ${d:-`date`} -date -=== check precision options Mon Jan 18 21:22:36 EST 2016 +set +v +=== check precision options Fri, Jul 24, 2020 10:27:37 PM rbox 100 D3 s | qhull E0.01 Qx Tcv FO +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213882263 Distance-roundoff 0.01 Qxact-merge Tcheck-frequently + Tverify _zero-centrum _max-width 0.98 _one-merge 0.07 _near-inside 0.35 + Visible-distance 0.02 U-max-coplanar 0.02 Width-outside 0.04 + _wide-facet 0.12 Convex hull of 100 points in 3-d: - Number of vertices: 45 - Number of facets: 42 - Number of non-simplicial facets: 28 + Number of vertices: 46 + Number of facets: 41 + Number of non-simplicial facets: 29 Statistics for: rbox 100 D3 s | qhull E0.01 Qx Tcv FO - Number of points processed: 45 - Number of hyperplanes created: 160 - Number of distance tests for qhull: 3992 - Number of distance tests for merging: 2006 - Number of distance tests for checking: 1937 - Number of merged facets: 57 - CPU seconds to compute hull (after input): 0 + Number of points processed: 46 + Number of hyperplanes created: 162 + Number of distance tests for qhull: 3834 + Number of distance tests for merging: 1887 + Number of distance tests for checking: 1989 + Number of merged facets: 60 + CPU seconds to compute hull (after input): 0.001 Maximum distance of point above facet: 0.048 (0.6x) Maximum distance of vertex below facet: -0.072 (0.9x) -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99294561 Distance-roundoff 0.01 Qxact-merge Tcheck-frequently - Tverify _zero-centrum _max-width 0.98 _one-merge 0.07 _near-inside 0.35 - Visible-distance 0.02 U-coplanar-distance 0.02 Width-outside 0.04 - _wide-facet 0.12 -QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point -is outside of a facet. See qh-optq.htm#Qx +QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point is outside of a facet. See qh-optq.htm#Qx Output completed. Verifying that all points are below outer planes of -all facets. Will make 4200 distance computations. +all facets. Will make 4100 distance computations. rbox 100 D3 W1e-1 | qhull W1e-3 Tcv Convex hull of 100 points in 3-d: @@ -9842,8 +12614,8 @@ Statistics for: rbox 100 D3 W1e-1 | qhull W1e-3 Tcv Number of points processed: 37 - Number of hyperplanes created: 170 - Number of distance tests for qhull: 1580 + Number of hyperplanes created: 169 + Number of distance tests for qhull: 1565 CPU seconds to compute hull (after input): 0 Maximum distance of point above facet: 0.00084 @@ -9860,15 +12632,15 @@ Statistics for: rbox 100 D3 W1e-1 | qhull W1e-2 Tcv Q0 Number of points processed: 29 - Number of hyperplanes created: 128 - Number of distance tests for qhull: 1442 + Number of hyperplanes created: 127 + Number of distance tests for qhull: 1691 CPU seconds to compute hull (after input): 0 precision problems (corrected unless 'Q0' or an error) - 22 coplanar points during partitioning + 23 coplanar points during partitioning -Output completed. Verifying that all points are below 0.0097 of +Output completed. Verifying that all points are below outer planes of all facets. Will make 5200 distance computations. rbox 100 D3 W1e-1 | qhull W1e-2 Tcv @@ -9880,8 +12652,8 @@ Statistics for: rbox 100 D3 W1e-1 | qhull W1e-2 Tcv Number of points processed: 30 - Number of hyperplanes created: 132 - Number of distance tests for qhull: 1768 + Number of hyperplanes created: 131 + Number of distance tests for qhull: 1720 CPU seconds to compute hull (after input): 0 Maximum distance of point above facet: 0.0057 @@ -9898,8 +12670,8 @@ Statistics for: rbox 100 D3 W1e-1 | qhull W1e-1 Tcv Number of points processed: 13 - Number of hyperplanes created: 46 - Number of distance tests for qhull: 2521 + Number of hyperplanes created: 45 + Number of distance tests for qhull: 2377 CPU seconds to compute hull (after input): 0 Maximum distance of point above facet: 0.098 @@ -9916,14 +12688,14 @@ Statistics for: rbox 15 D2 P0 P1e-14,1e-14 | qhull d Quc Tcv Number of points processed: 17 - Number of hyperplanes created: 64 + Number of hyperplanes created: 63 Number of facets in hull: 28 - Number of distance tests for qhull: 142 - Number of distance tests for merging: 527 - Number of distance tests for checking: 194 + Number of distance tests for qhull: 141 + Number of distance tests for merging: 474 + Number of distance tests for checking: 236 Number of merged facets: 7 CPU seconds to compute hull (after input): 0 - Maximum distance of point above facet: 1.6e-015 (0.3x) + Maximum distance of point above facet: 1.6e-15 (0.3x) Output completed. Verifying that all points are below outer planes of @@ -9938,549 +12710,544 @@ Statistics for: rbox 15 D3 P0 P1e-12,1e-14,1e-14 | qhull d Qcu Tcv Number of points processed: 17 - Number of hyperplanes created: 124 + Number of hyperplanes created: 123 Number of facets in hull: 60 - Number of distance tests for qhull: 225 + Number of distance tests for qhull: 224 CPU seconds to compute hull (after input): 0 -Output completed. Verifying that all points are below 2.8e-015 of +Output completed. Verifying that all points are below 2.8e-15 of all facets. Will make 238 distance computations. rbox 1000 s D3 | qhull C-0.01 Tcv Qc Convex hull of 1000 points in 3-d: - Number of vertices: 107 - Number of coplanar points: 893 - Number of facets: 96 - Number of non-simplicial facets: 77 + Number of vertices: 108 + Number of coplanar points: 892 + Number of facets: 95 + Number of non-simplicial facets: 78 Statistics for: rbox 1000 s D3 | qhull C-0.01 Tcv Qc Number of points processed: 112 - Number of hyperplanes created: 449 - Number of distance tests for qhull: 64526 - Number of distance tests for merging: 8425 - Number of distance tests for checking: 23411 - Number of merged facets: 256 - CPU seconds to compute hull (after input): 0.015 - Maximum distance of point above facet: 0.02 (0.7x) - Maximum distance of vertex below facet: -0.035 (1.2x) + Number of hyperplanes created: 464 + Number of distance tests for qhull: 62162 + Number of distance tests for merging: 6682 + Number of distance tests for checking: 24376 + Number of merged facets: 264 + CPU seconds to compute hull (after input): 0.007 + Maximum distance of point above facet: 0.021 (0.7x) + Maximum distance of vertex below facet: -0.029 (1.0x) Output completed. Verifying that all points are below outer planes of -all facets. Will make 96000 distance computations. +all facets. Will make 95000 distance computations. rbox 1000 s D3 | qhull C-0.01 V0 Qc Tcv Convex hull of 1000 points in 3-d: - Number of vertices: 120 - Number of coplanar points: 880 - Number of facets: 82 - Number of non-simplicial facets: 71 + Number of vertices: 137 + Number of coplanar points: 863 + Number of facets: 87 + Number of non-simplicial facets: 82 Statistics for: rbox 1000 s D3 | qhull C-0.01 V0 Qc Tcv - Number of points processed: 445 - Number of hyperplanes created: 2451 - Number of distance tests for qhull: 172077 - Number of distance tests for merging: 52430 - Number of distance tests for checking: 19885 - Number of merged facets: 1741 - CPU seconds to compute hull (after input): 0.031 - Maximum distance of point above facet: 0.032 (1.1x) - Maximum distance of vertex below facet: -0.064 (2.1x) + Number of points processed: 466 + Number of hyperplanes created: 2572 + Number of distance tests for qhull: 232429 + Number of distance tests for merging: 47390 + Number of distance tests for checking: 38513 + Number of merged facets: 1818 + CPU seconds to compute hull (after input): 0.046 + Maximum distance of point above facet: 0.026 (0.9x) + Maximum distance of vertex below facet: -0.075 (2.5x) Output completed. Verifying that all points are below outer planes of -all facets. Will make 82000 distance computations. +all facets. Will make 87000 distance computations. rbox 1000 s D3 | qhull C-0.01 U0 Qc Tcv Convex hull of 1000 points in 3-d: - Number of vertices: 107 - Number of coplanar points: 893 - Number of facets: 98 + Number of vertices: 108 + Number of coplanar points: 892 + Number of facets: 97 Number of non-simplicial facets: 77 Statistics for: rbox 1000 s D3 | qhull C-0.01 U0 Qc Tcv Number of points processed: 112 - Number of hyperplanes created: 497 - Number of distance tests for qhull: 64717 - Number of distance tests for merging: 9106 - Number of distance tests for checking: 23621 - Number of merged facets: 254 - CPU seconds to compute hull (after input): 0.015 - Maximum distance of point above facet: 0.02 (0.7x) - Maximum distance of vertex below facet: -0.035 (1.2x) + Number of hyperplanes created: 505 + Number of distance tests for qhull: 62212 + Number of distance tests for merging: 7315 + Number of distance tests for checking: 24575 + Number of merged facets: 260 + CPU seconds to compute hull (after input): 0.006 + Maximum distance of point above facet: 0.021 (0.7x) + Maximum distance of vertex below facet: -0.029 (1.0x) Output completed. Verifying that all points are below outer planes of -all facets. Will make 98000 distance computations. +all facets. Will make 97000 distance computations. rbox 1000 s D3 | qhull C-0.01 V0 Qcm Tcv -Convex hull of 1000 points in 3-d: - - Number of vertices: 106 - Number of coplanar points: 894 - Number of facets: 94 - Number of non-simplicial facets: 71 +Convex hull of 1000 points in 3-d: + + Number of vertices: 87 + Number of coplanar points: 913 + Number of facets: 88 + Number of non-simplicial facets: 56 Statistics for: rbox 1000 s D3 | qhull C-0.01 V0 Qcm Tcv - Number of points processed: 114 - Number of hyperplanes created: 597 - Number of distance tests for qhull: 54389 - Number of distance tests for merging: 10179 - Number of distance tests for checking: 18597 - Number of merged facets: 288 - CPU seconds to compute hull (after input): 0.015 - Maximum distance of point above facet: 0.025 (0.8x) - Maximum distance of vertex below facet: -0.07 (2.3x) + Number of points processed: 90 + Number of hyperplanes created: 457 + Number of distance tests for qhull: 46341 + Number of distance tests for merging: 5761 + Number of distance tests for checking: 21602 + Number of merged facets: 192 + CPU seconds to compute hull (after input): 0.005 + Maximum distance of point above facet: 0.032 (1.1x) + Maximum distance of vertex below facet: -0.041 (1.4x) Output completed. Verifying that all points are below outer planes of -all facets. Will make 94000 distance computations. +all facets. Will make 88000 distance computations. rbox 1000 s D3 | qhull C-0.01 Qcm Tcv Convex hull of 1000 points in 3-d: - Number of vertices: 103 - Number of coplanar points: 897 - Number of facets: 96 + Number of vertices: 101 + Number of coplanar points: 899 + Number of facets: 95 Number of non-simplicial facets: 69 Statistics for: rbox 1000 s D3 | qhull C-0.01 Qcm Tcv - Number of points processed: 106 - Number of hyperplanes created: 434 - Number of distance tests for qhull: 64355 - Number of distance tests for merging: 7947 - Number of distance tests for checking: 23460 - Number of merged facets: 234 - CPU seconds to compute hull (after input): 0.015 - Maximum distance of point above facet: 0.022 (0.7x) - Maximum distance of vertex below facet: -0.035 (1.2x) + Number of points processed: 104 + Number of hyperplanes created: 433 + Number of distance tests for qhull: 59136 + Number of distance tests for merging: 6024 + Number of distance tests for checking: 24116 + Number of merged facets: 232 + CPU seconds to compute hull (after input): 0.006 + Maximum distance of point above facet: 0.023 (0.8x) + Maximum distance of vertex below facet: -0.031 (1.0x) Output completed. Verifying that all points are below outer planes of -all facets. Will make 96000 distance computations. +all facets. Will make 95000 distance computations. rbox 1000 s D3 | qhull C-0.01 Q1 FO Tcv Qc +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213899070 Centrum-premerge- 0.01 Q1-angle-merge Tcheck-frequently + Tverify Qcoplanar-keep _max-width 1 Error-roundoff 6.9e-16 + _one-merge 0.03 _near-inside 0.15 Visible-distance 0.01 + U-max-coplanar 0.01 Width-outside 0.02 _wide-facet 0.06 Convex hull of 1000 points in 3-d: - Number of vertices: 105 - Number of coplanar points: 895 - Number of facets: 94 - Number of non-simplicial facets: 70 + Number of vertices: 107 + Number of coplanar points: 893 + Number of facets: 97 + Number of non-simplicial facets: 80 Statistics for: rbox 1000 s D3 | qhull C-0.01 Q1 FO Tcv Qc - Number of points processed: 110 - Number of hyperplanes created: 457 - Number of distance tests for qhull: 66717 - Number of distance tests for merging: 8730 - Number of distance tests for checking: 23168 - Number of merged facets: 258 - CPU seconds to compute hull (after input): 0.015 + Number of points processed: 111 + Number of hyperplanes created: 450 + Number of distance tests for qhull: 61776 + Number of distance tests for merging: 6387 + Number of distance tests for checking: 24594 + Number of merged facets: 253 + CPU seconds to compute hull (after input): 0.006 Maximum distance of point above facet: 0.02 (0.7x) Maximum distance of vertex below facet: -0.035 (1.2x) -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99311368 Centrum-premerge- 0.01 Q1-no-angle-sort Tcheck-frequently - Tverify Qcoplanar-keep _max-width 1 Error-roundoff 6.9e-016 - _one-merge 0.03 _near-inside 0.15 Visible-distance 0.01 - U-coplanar-distance 0.01 Width-outside 0.02 _wide-facet 0.06 Output completed. Verifying that all points are below outer planes of -all facets. Will make 94000 distance computations. +all facets. Will make 97000 distance computations. rbox 1000 s D3 | qhull C-0.01 Q2 FO Tcv Qc +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213899070 Centrum-premerge- 0.01 Q2-no-merge-independent + Tcheck-frequently Tverify Qcoplanar-keep _max-width 1 + Error-roundoff 6.9e-16 _one-merge 0.03 _near-inside 0.15 + Visible-distance 0.01 U-max-coplanar 0.01 Width-outside 0.02 + _wide-facet 0.06 Convex hull of 1000 points in 3-d: Number of vertices: 106 Number of coplanar points: 894 - Number of facets: 91 + Number of facets: 92 Number of non-simplicial facets: 74 Statistics for: rbox 1000 s D3 | qhull C-0.01 Q2 FO Tcv Qc - Number of points processed: 112 - Number of hyperplanes created: 454 - Number of distance tests for qhull: 64909 - Number of distance tests for merging: 8602 - Number of distance tests for checking: 22777 - Number of merged facets: 267 - CPU seconds to compute hull (after input): 0.015 - Maximum distance of point above facet: 0.02 (0.7x) + Number of points processed: 110 + Number of hyperplanes created: 451 + Number of distance tests for qhull: 60312 + Number of distance tests for merging: 6396 + Number of distance tests for checking: 23893 + Number of merged facets: 260 + CPU seconds to compute hull (after input): 0.007 + Maximum distance of point above facet: 0.023 (0.8x) Maximum distance of vertex below facet: -0.049 (1.6x) -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99311368 Centrum-premerge- 0.01 Q2-no-merge-independent - Tcheck-frequently Tverify Qcoplanar-keep _max-width 1 - Error-roundoff 6.9e-016 _one-merge 0.03 _near-inside 0.15 - Visible-distance 0.01 U-coplanar-distance 0.01 Width-outside 0.02 - _wide-facet 0.06 Output completed. Verifying that all points are below outer planes of -all facets. Will make 91000 distance computations. +all facets. Will make 92000 distance computations. rbox 1000 s D3 | qhull C-0.01 Q3 FO Tcv Qc +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213899070 Centrum-premerge- 0.01 Q3-no-merge-vertices + Tcheck-frequently Tverify Qcoplanar-keep _max-width 1 + Error-roundoff 6.9e-16 _one-merge 0.03 _near-inside 0.15 + Visible-distance 0.01 U-max-coplanar 0.01 Width-outside 0.02 + _wide-facet 0.06 Convex hull of 1000 points in 3-d: Number of vertices: 112 Number of coplanar points: 888 - Number of facets: 95 + Number of facets: 94 Number of non-simplicial facets: 78 Statistics for: rbox 1000 s D3 | qhull C-0.01 Q3 FO Tcv Qc Number of points processed: 112 - Number of hyperplanes created: 453 - Number of distance tests for qhull: 64248 - Number of distance tests for merging: 8529 - Number of distance tests for checking: 23283 - Number of merged facets: 260 - CPU seconds to compute hull (after input): 0.015 - Maximum distance of point above facet: 0.02 (0.7x) - Maximum distance of vertex below facet: -0.035 (1.2x) + Number of hyperplanes created: 468 + Number of distance tests for qhull: 61911 + Number of distance tests for merging: 6879 + Number of distance tests for checking: 24243 + Number of merged facets: 268 + CPU seconds to compute hull (after input): 0.007 + Maximum distance of point above facet: 0.021 (0.7x) + Maximum distance of vertex below facet: -0.03 (1.0x) -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99311368 Centrum-premerge- 0.01 Q3-no-merge-vertices - Tcheck-frequently Tverify Qcoplanar-keep _max-width 1 - Error-roundoff 6.9e-016 _one-merge 0.03 _near-inside 0.15 - Visible-distance 0.01 U-coplanar-distance 0.01 Width-outside 0.02 - _wide-facet 0.06 Output completed. Verifying that all points are below outer planes of -all facets. Will make 95000 distance computations. +all facets. Will make 94000 distance computations. rbox 1000 s D3 | qhull C-0.01 Q4 FO Tcv Qc +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213899070 Centrum-premerge- 0.01 Q4-avoid-old-into-new + Tcheck-frequently Tverify Qcoplanar-keep _max-width 1 + Error-roundoff 6.9e-16 _one-merge 0.03 _near-inside 0.15 + Visible-distance 0.01 U-max-coplanar 0.01 Width-outside 0.02 + _wide-facet 0.06 Convex hull of 1000 points in 3-d: - Number of vertices: 107 - Number of coplanar points: 893 - Number of facets: 96 - Number of non-simplicial facets: 77 + Number of vertices: 108 + Number of coplanar points: 892 + Number of facets: 95 + Number of non-simplicial facets: 78 Statistics for: rbox 1000 s D3 | qhull C-0.01 Q4 FO Tcv Qc Number of points processed: 112 - Number of hyperplanes created: 449 - Number of distance tests for qhull: 64526 - Number of distance tests for merging: 8425 - Number of distance tests for checking: 23411 - Number of merged facets: 256 - CPU seconds to compute hull (after input): 0.015 - Maximum distance of point above facet: 0.02 (0.7x) - Maximum distance of vertex below facet: -0.035 (1.2x) + Number of hyperplanes created: 464 + Number of distance tests for qhull: 62162 + Number of distance tests for merging: 6682 + Number of distance tests for checking: 24376 + Number of merged facets: 264 + CPU seconds to compute hull (after input): 0.007 + Maximum distance of point above facet: 0.021 (0.7x) + Maximum distance of vertex below facet: -0.029 (1.0x) -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99311368 Centrum-premerge- 0.01 Q4-avoid-old-into-new - Tcheck-frequently Tverify Qcoplanar-keep _max-width 1 - Error-roundoff 6.9e-016 _one-merge 0.03 _near-inside 0.15 - Visible-distance 0.01 U-coplanar-distance 0.01 Width-outside 0.02 - _wide-facet 0.06 Output completed. Verifying that all points are below outer planes of -all facets. Will make 96000 distance computations. +all facets. Will make 95000 distance computations. echo === this may generate an error ${d:-`date`} -date -=== this may generate an error Mon Jan 18 21:22:37 EST 2016 +=== this may generate an error Fri, Jul 24, 2020 10:27:38 PM rbox 1000 s D3 | qhull C-0.01 Q5 FO Tcv +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213899070 Centrum-premerge- 0.01 Q5-no-check-outer + Tcheck-frequently Tverify _max-width 1 Error-roundoff 6.9e-16 + _one-merge 0.03 Visible-distance 0.01 U-max-coplanar 0.01 + Width-outside 0.02 _wide-facet 0.06 Convex hull of 1000 points in 3-d: - Number of vertices: 107 - Number of facets: 96 - Number of non-simplicial facets: 77 + Number of vertices: 108 + Number of facets: 95 + Number of non-simplicial facets: 78 Statistics for: rbox 1000 s D3 | qhull C-0.01 Q5 FO Tcv Number of points processed: 112 - Number of hyperplanes created: 449 - Number of distance tests for qhull: 38064 - Number of distance tests for merging: 8425 - Number of distance tests for checking: 0 - Number of merged facets: 256 - CPU seconds to compute hull (after input): 0.015 + Number of hyperplanes created: 464 + Number of distance tests for qhull: 35756 + Number of distance tests for merging: 6682 + Number of distance tests for checking: 2036 + Number of merged facets: 264 + CPU seconds to compute hull (after input): 0.005 Maximum distance of point above facet: 0.022 (0.7x) - Maximum distance of vertex below facet: -0.035 (1.2x) + Maximum distance of vertex below facet: -0.031 (1.0x) -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99311368 Centrum-premerge- 0.01 Q5-no-check-outer Tcheck-frequently - Tverify _max-width 1 Error-roundoff 6.9e-016 _one-merge 0.03 - Visible-distance 0.01 U-coplanar-distance 0.01 Width-outside 0.02 - _wide-facet 0.06 -QH7077 qhull input warning: no outer plane check ('Q5') or no processing of -near-inside points ('Q8'). Verify may report that a point is outside -of a facet. +QH7077 qhull input warning: no outer plane check ('Q5') or no processing of near-inside points ('Q8'). Verify may report that a point is outside of a facet. Output completed. Verifying that all points are below 0.022 of -all facets. Will make 96000 distance computations. +all facets. Will make 95000 distance computations. echo === this should generate an error ${d:-`date`} -date -=== this should generate an error Mon Jan 18 21:22:37 EST 2016 +=== this should generate an error Fri, Jul 24, 2020 10:27:38 PM rbox 1000 s D3 | qhull C-0.01 Q6 FO Po Tcv Qc +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213899070 Centrum-premerge- 0.01 Q6-no-concave-merge Poutput-forced + Tcheck-frequently Tverify Qcoplanar-keep _max-width 1 + Error-roundoff 6.9e-16 _one-merge 0.03 _near-inside 0.15 + Visible-distance 0.01 U-max-coplanar 0.01 Width-outside 0.02 + _wide-facet 0.06 +QH6117 qhull precision error: f328 is concave to f329. Centrum of f328 is 0.001027 above f329 +QH6117 qhull precision error: f329 is concave to f328. Centrum of f329 is 0.004134 above f328 +QH6117 qhull precision error: f482 is concave to f484. Centrum of f482 is 0.0001795 above f484 +QH6117 qhull precision error: f484 is concave to f482. Centrum of f484 is 6.818e-05 above f482 Convex hull of 1000 points in 3-d: - Number of vertices: 114 - Number of coplanar points: 886 - Number of facets: 182 + Number of vertices: 115 + Number of coplanar points: 885 + Number of facets: 184 Number of non-simplicial facets: 40 Statistics for: rbox 1000 s D3 | qhull C-0.01 Q6 FO Po Tcv Qc - Number of points processed: 114 - Number of hyperplanes created: 447 - Number of distance tests for qhull: 53157 - Number of distance tests for merging: 3458 - Number of distance tests for checking: 27470 + Number of points processed: 115 + Number of hyperplanes created: 455 + Number of distance tests for qhull: 52081 + Number of distance tests for merging: 1190 + Number of distance tests for checking: 28981 Number of merged facets: 88 - CPU seconds to compute hull (after input): 0.015 + CPU seconds to compute hull (after input): 0.005 Maximum distance of point above facet: 0.02 (0.7x) Maximum distance of vertex below facet: -0.009 (0.3x) -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99311368 Centrum-premerge- 0.01 Q6-no-concave-merge Poutput-forced +rbox 1000 s D3 | qhull C-0.01 Q7 FO Tcv Qc +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213899070 Centrum-premerge- 0.01 Q7-no-breadth-first Tcheck-frequently Tverify Qcoplanar-keep _max-width 1 - Error-roundoff 6.9e-016 _one-merge 0.03 _near-inside 0.15 - Visible-distance 0.01 U-coplanar-distance 0.01 Width-outside 0.02 + Error-roundoff 6.9e-16 _one-merge 0.03 _near-inside 0.15 + Visible-distance 0.01 U-max-coplanar 0.01 Width-outside 0.02 _wide-facet 0.06 -QH6117 qhull precision error: f324 is concave to f325. Centrum of f324 is 0.004134 above f325 -QH6117 qhull precision error: f325 is concave to f324. Centrum of f325 is 0.001027 above f324 -rbox 1000 s D3 | qhull C-0.01 Q7 FO Tcv Qc Convex hull of 1000 points in 3-d: - Number of vertices: 100 - Number of coplanar points: 900 - Number of facets: 94 - Number of non-simplicial facets: 73 + Number of vertices: 108 + Number of coplanar points: 892 + Number of facets: 99 + Number of non-simplicial facets: 77 Statistics for: rbox 1000 s D3 | qhull C-0.01 Q7 FO Tcv Qc - Number of points processed: 103 - Number of hyperplanes created: 448 - Number of distance tests for qhull: 70481 - Number of distance tests for merging: 8005 - Number of distance tests for checking: 21158 - Number of merged facets: 233 - CPU seconds to compute hull (after input): 0.015 - Maximum distance of point above facet: 0.02 (0.7x) - Maximum distance of vertex below facet: -0.042 (1.4x) + Number of points processed: 110 + Number of hyperplanes created: 449 + Number of distance tests for qhull: 55287 + Number of distance tests for merging: 6050 + Number of distance tests for checking: 22232 + Number of merged facets: 242 + CPU seconds to compute hull (after input): 0.006 + Maximum distance of point above facet: 0.021 (0.7x) + Maximum distance of vertex below facet: -0.031 (1.0x) -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99311368 Centrum-premerge- 0.01 Q7-no-breadth-first - Tcheck-frequently Tverify Qcoplanar-keep _max-width 1 - Error-roundoff 6.9e-016 _one-merge 0.03 _near-inside 0.15 - Visible-distance 0.01 U-coplanar-distance 0.01 Width-outside 0.02 - _wide-facet 0.06 Output completed. Verifying that all points are below outer planes of -all facets. Will make 94000 distance computations. +all facets. Will make 99000 distance computations. rbox 1000 s D3 | qhull C-0.01 Qx Tcv Qc Convex hull of 1000 points in 3-d: - Number of vertices: 114 - Number of coplanar points: 886 - Number of facets: 103 - Number of non-simplicial facets: 77 + Number of vertices: 115 + Number of coplanar points: 885 + Number of facets: 101 + Number of non-simplicial facets: 76 Statistics for: rbox 1000 s D3 | qhull C-0.01 Qx Tcv Qc - Number of points processed: 114 - Number of hyperplanes created: 447 - Number of distance tests for qhull: 90887 - Number of distance tests for merging: 5483 - Number of distance tests for checking: 20583 - Number of merged facets: 167 - CPU seconds to compute hull (after input): 0 + Number of points processed: 115 + Number of hyperplanes created: 455 + Number of distance tests for qhull: 89505 + Number of distance tests for merging: 5154 + Number of distance tests for checking: 19846 + Number of merged facets: 171 + CPU seconds to compute hull (after input): 0.006 Maximum distance of point above facet: 0.02 (0.7x) Maximum distance of vertex below facet: -0.034 (1.1x) -QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point -is outside of a facet. See qh-optq.htm#Qx +QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point is outside of a facet. See qh-optq.htm#Qx Output completed. Verifying that all points are below outer planes of -all facets. Will make 103000 distance computations. +all facets. Will make 101000 distance computations. echo === this may generate an error e.g., t1263080158 ${d:-`date`} -date -=== this may generate an error e.g., t1263080158 Mon Jan 18 21:22:37 EST 2016 +=== this may generate an error e.g., t1263080158 Fri, Jul 24, 2020 10:27:38 PM rbox 100 s D3 t | qhull R1e-3 Tcv Qc Convex hull of 100 points in 3-d: - Number of vertices: 100 - Number of facets: 172 - Number of non-simplicial facets: 17 + Number of vertices: 99 + Number of coplanar points: 1 + Number of facets: 173 + Number of non-simplicial facets: 19 -Statistics for: rbox 100 s D3 t1453170157 | qhull R1e-3 Tcv Qc +Statistics for: rbox 100 s D3 t1595644058 | qhull R1e-3 Tcv Qc Number of points processed: 100 - Number of hyperplanes created: 478 - Number of distance tests for qhull: 1671 - Number of distance tests for merging: 3521 - Number of distance tests for checking: 1302 - Number of merged facets: 44 - CPU seconds to compute hull (after input): 0 - Maximum distance of point above facet: 0.0015 (0.4x) - Maximum distance of vertex below facet: -0.0038 (1.0x) + Number of hyperplanes created: 471 + Number of distance tests for qhull: 1627 + Number of distance tests for merging: 2780 + Number of distance tests for checking: 1528 + Number of merged facets: 33 + CPU seconds to compute hull (after input): 0.002 + Maximum distance of point above facet: 0.0017 (0.4x) + Maximum distance of vertex below facet: -0.0062 (1.6x) Output completed. Verifying that all points are below outer planes of -all facets. Will make 17200 distance computations. +all facets. Will make 17300 distance computations. rbox 100 s D3 t | qhull R1e-2 Tcv Qc Convex hull of 100 points in 3-d: - Number of vertices: 62 - Number of coplanar points: 38 - Number of facets: 61 + Number of vertices: 59 + Number of coplanar points: 41 + Number of facets: 57 Number of non-simplicial facets: 34 -Statistics for: rbox 100 s D3 t1453170157 | qhull R1e-2 Tcv Qc +Statistics for: rbox 100 s D3 t1595644059 | qhull R1e-2 Tcv Qc - Number of points processed: 66 - Number of hyperplanes created: 287 - Number of distance tests for qhull: 4262 - Number of distance tests for merging: 4731 - Number of distance tests for checking: 2342 - Number of merged facets: 129 - CPU seconds to compute hull (after input): 0 - Maximum distance of point above facet: 0.033 (0.8x) - Maximum distance of vertex below facet: -0.055 (1.4x) + Number of points processed: 61 + Number of hyperplanes created: 269 + Number of distance tests for qhull: 3527 + Number of distance tests for merging: 3559 + Number of distance tests for checking: 2604 + Number of merged facets: 120 + CPU seconds to compute hull (after input): 0.002 + Maximum distance of point above facet: 0.034 (0.8x) + Maximum distance of vertex below facet: -0.061 (1.5x) Output completed. Verifying that all points are below outer planes of -all facets. Will make 6100 distance computations. +all facets. Will make 5700 distance computations. rbox 500 s D3 t | qhull R0.05 A-1 Tcv Qc Convex hull of 500 points in 3-d: - Number of vertices: 22 - Number of coplanar points: 478 - Number of facets: 17 - Number of non-simplicial facets: 15 - -Statistics for: rbox 500 s D3 t1453170157 | qhull R0.05 A-1 Tcv Qc - - Number of points processed: 26 - Number of hyperplanes created: 84 - Number of distance tests for qhull: 23620 - Number of distance tests for merging: 1716 - Number of distance tests for checking: 9125 - Number of merged facets: 55 - CPU seconds to compute hull (after input): 0 - Maximum distance of point above facet: 0.15 (0.3x) - Maximum distance of vertex below facet: -0.2 (0.3x) + Number of vertices: 20 + Number of coplanar points: 480 + Number of facets: 15 + Number of non-simplicial facets: 13 + +Statistics for: rbox 500 s D3 t1595644059 | qhull R0.05 A-1 Tcv Qc + + Number of points processed: 24 + Number of hyperplanes created: 76 + Number of distance tests for qhull: 20339 + Number of distance tests for merging: 1188 + Number of distance tests for checking: 6863 + Number of merged facets: 49 + CPU seconds to compute hull (after input): 0.002 + Maximum distance of point above facet: 0.14 (0.2x) + Maximum distance of vertex below facet: -0.24 (0.4x) Output completed. Verifying that all points are below outer planes of -all facets. Will make 8500 distance computations. +all facets. Will make 7500 distance computations. rbox 100 W0 D3 t | qhull R1e-3 Tcv Qc Convex hull of 100 points in 3-d: - Number of vertices: 40 - Number of coplanar points: 60 - Number of facets: 51 - Number of non-simplicial facets: 10 + Number of vertices: 36 + Number of coplanar points: 64 + Number of facets: 46 + Number of non-simplicial facets: 7 -Statistics for: rbox 100 W0 D3 t1453170157 | qhull R1e-3 Tcv Qc +Statistics for: rbox 100 W0 D3 t1595644059 | qhull R1e-3 Tcv Qc - Number of points processed: 43 - Number of hyperplanes created: 143 - Number of distance tests for qhull: 1788 - Number of distance tests for merging: 1601 - Number of distance tests for checking: 1088 - Number of merged facets: 36 - CPU seconds to compute hull (after input): 0 - Maximum distance of point above facet: 0.0023 (0.6x) - Maximum distance of vertex below facet: -0.0044 (1.1x) + Number of points processed: 48 + Number of hyperplanes created: 160 + Number of distance tests for qhull: 1898 + Number of distance tests for merging: 1433 + Number of distance tests for checking: 1387 + Number of merged facets: 49 + CPU seconds to compute hull (after input): 0.001 + Maximum distance of point above facet: 0.0018 (0.5x) + Maximum distance of vertex below facet: -0.0077 (1.9x) Output completed. Verifying that all points are below outer planes of -all facets. Will make 5100 distance computations. +all facets. Will make 4600 distance computations. rbox 100 W0 D3 t | qhull R1e-3 Qx Tcv Qc Convex hull of 100 points in 3-d: - Number of vertices: 41 - Number of coplanar points: 59 - Number of facets: 53 - Number of non-simplicial facets: 8 + Number of vertices: 35 + Number of coplanar points: 65 + Number of facets: 46 + Number of non-simplicial facets: 7 -Statistics for: rbox 100 W0 D3 t1453170157 | qhull R1e-3 Qx Tcv Qc +Statistics for: rbox 100 W0 D3 t1595644059 | qhull R1e-3 Qx Tcv Qc - Number of points processed: 44 - Number of hyperplanes created: 135 - Number of distance tests for qhull: 1703 - Number of distance tests for merging: 1367 - Number of distance tests for checking: 1109 - Number of merged facets: 34 - CPU seconds to compute hull (after input): 0 - Maximum distance of point above facet: 0.0015 (0.4x) - Maximum distance of vertex below facet: -0.0042 (1.1x) + Number of points processed: 48 + Number of hyperplanes created: 157 + Number of distance tests for qhull: 2121 + Number of distance tests for merging: 1562 + Number of distance tests for checking: 1086 + Number of merged facets: 46 + CPU seconds to compute hull (after input): 0.001 + Maximum distance of point above facet: 0.0018 (0.4x) + Maximum distance of vertex below facet: -0.0041 (1.0x) -QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point -is outside of a facet. See qh-optq.htm#Qx +QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point is outside of a facet. See qh-optq.htm#Qx Output completed. Verifying that all points are below outer planes of -all facets. Will make 5300 distance computations. +all facets. Will make 4600 distance computations. rbox 100 W0 D3 t | qhull R1e-2 Tcv Qc Convex hull of 100 points in 3-d: - Number of vertices: 25 - Number of coplanar points: 75 - Number of facets: 26 - Number of non-simplicial facets: 10 + Number of vertices: 24 + Number of coplanar points: 76 + Number of facets: 25 + Number of non-simplicial facets: 8 -Statistics for: rbox 100 W0 D3 t1453170157 | qhull R1e-2 Tcv Qc +Statistics for: rbox 100 W0 D3 t1595644059 | qhull R1e-2 Tcv Qc - Number of points processed: 28 - Number of hyperplanes created: 90 - Number of distance tests for qhull: 2446 - Number of distance tests for merging: 1315 - Number of distance tests for checking: 1061 - Number of merged facets: 36 - CPU seconds to compute hull (after input): 0 - Maximum distance of point above facet: 0.023 (0.6x) - Maximum distance of vertex below facet: -0.06 (1.5x) + Number of points processed: 32 + Number of hyperplanes created: 105 + Number of distance tests for qhull: 2303 + Number of distance tests for merging: 1290 + Number of distance tests for checking: 1263 + Number of merged facets: 47 + CPU seconds to compute hull (after input): 0.001 + Maximum distance of point above facet: 0.026 (0.6x) + Maximum distance of vertex below facet: -0.08 (2.0x) Output completed. Verifying that all points are below outer planes of -all facets. Will make 2600 distance computations. +all facets. Will make 2500 distance computations. rbox 100 W0 D3 t | qhull R1e-2 Qx Tcv Qc Convex hull of 100 points in 3-d: - Number of vertices: 29 - Number of coplanar points: 71 - Number of facets: 30 - Number of non-simplicial facets: 12 + Number of vertices: 25 + Number of coplanar points: 75 + Number of facets: 26 + Number of non-simplicial facets: 11 -Statistics for: rbox 100 W0 D3 t1453170157 | qhull R1e-2 Qx Tcv Qc +Statistics for: rbox 100 W0 D3 t1595644059 | qhull R1e-2 Qx Tcv Qc - Number of points processed: 33 - Number of hyperplanes created: 88 - Number of distance tests for qhull: 3393 - Number of distance tests for merging: 1197 - Number of distance tests for checking: 1105 - Number of merged facets: 42 + Number of points processed: 32 + Number of hyperplanes created: 106 + Number of distance tests for qhull: 2604 + Number of distance tests for merging: 1089 + Number of distance tests for checking: 1026 + Number of merged facets: 37 CPU seconds to compute hull (after input): 0 - Maximum distance of point above facet: 0.025 (0.6x) - Maximum distance of vertex below facet: -0.043 (1.1x) + Maximum distance of point above facet: 0.026 (0.7x) + Maximum distance of vertex below facet: -0.051 (1.3x) -QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point -is outside of a facet. See qh-optq.htm#Qx +QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point is outside of a facet. See qh-optq.htm#Qx Output completed. Verifying that all points are below outer planes of -all facets. Will make 3000 distance computations. +all facets. Will make 2600 distance computations. rbox 500 W0 D3 t | qhull R0.05 A-1 Tcv Qc Convex hull of 500 points in 3-d: @@ -10490,17 +13257,17 @@ Number of facets: 6 Number of non-simplicial facets: 6 -Statistics for: rbox 500 W0 D3 t1453170157 | qhull R0.05 A-1 Tcv Qc +Statistics for: rbox 500 W0 D3 t1595644059 | qhull R0.05 A-1 Tcv Qc - Number of points processed: 14 - Number of hyperplanes created: 44 - Number of distance tests for qhull: 17320 - Number of distance tests for merging: 694 - Number of distance tests for checking: 3990 - Number of merged facets: 23 - CPU seconds to compute hull (after input): 0 - Maximum distance of point above facet: 0.1 (0.2x) - Maximum distance of vertex below facet: -0.13 (0.2x) + Number of points processed: 17 + Number of hyperplanes created: 48 + Number of distance tests for qhull: 16359 + Number of distance tests for merging: 670 + Number of distance tests for checking: 3635 + Number of merged facets: 33 + CPU seconds to compute hull (after input): 0.001 + Maximum distance of point above facet: 0.11 (0.2x) + Maximum distance of vertex below facet: -0.2 (0.3x) Output completed. Verifying that all points are below outer planes of @@ -10509,163 +13276,158 @@ Convex hull of 500 points in 3-d: - Number of vertices: 10 - Number of coplanar points: 490 - Number of facets: 7 + Number of vertices: 8 + Number of coplanar points: 492 + Number of facets: 6 Number of non-simplicial facets: 6 -Statistics for: rbox 500 W0 D3 t1453170157 | qhull R0.05 Qx Tcv Qc +Statistics for: rbox 500 W0 D3 t1595644059 | qhull R0.05 Qx Tcv Qc - Number of points processed: 15 - Number of hyperplanes created: 28 - Number of distance tests for qhull: 14528 - Number of distance tests for merging: 423 - Number of distance tests for checking: 4227 - Number of merged facets: 22 - CPU seconds to compute hull (after input): 0 - Maximum distance of point above facet: 0.11 (0.6x) - Maximum distance of vertex below facet: -0.19 (0.9x) + Number of points processed: 20 + Number of hyperplanes created: 52 + Number of distance tests for qhull: 22372 + Number of distance tests for merging: 729 + Number of distance tests for checking: 3426 + Number of merged facets: 43 + CPU seconds to compute hull (after input): 0.001 + Maximum distance of point above facet: 0.094 (0.5x) + Maximum distance of vertex below facet: -0.14 (0.7x) -QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point -is outside of a facet. See qh-optq.htm#Qx +QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point is outside of a facet. See qh-optq.htm#Qx Output completed. Verifying that all points are below outer planes of -all facets. Will make 3500 distance computations. +all facets. Will make 3000 distance computations. rbox 1000 W1e-20 t | qhull Tcv Qc Convex hull of 1000 points in 3-d: - Number of vertices: 78 - Number of coplanar points: 922 - Number of facets: 92 + Number of vertices: 81 + Number of coplanar points: 919 + Number of facets: 95 Number of non-simplicial facets: 6 -Statistics for: rbox 1000 W1e-20 t1453170157 | qhull Tcv Qc +Statistics for: rbox 1000 W1e-20 t1595644059 | qhull Tcv Qc - Number of points processed: 85 - Number of hyperplanes created: 265 - Number of distance tests for qhull: 17667 - Number of distance tests for merging: 3471 - Number of distance tests for checking: 29686 - Number of merged facets: 74 - CPU seconds to compute hull (after input): 0.015 + Number of points processed: 93 + Number of hyperplanes created: 303 + Number of distance tests for qhull: 18699 + Number of distance tests for merging: 3015 + Number of distance tests for checking: 16676 + Number of merged facets: 87 + CPU seconds to compute hull (after input): 0.002 Output completed. Verifying that all points are below outer planes of -all facets. Will make 92000 distance computations. +all facets. Will make 95000 distance computations. rbox 1000 W1e-20 D4 t | qhull Tcv Qc Convex hull of 1000 points in 4-d: - Number of vertices: 271 - Number of coplanar points: 729 - Number of facets: 1001 + Number of vertices: 287 + Number of coplanar points: 713 + Number of facets: 1029 Number of non-simplicial facets: 8 -Statistics for: rbox 1000 W1e-20 D4 t1453170157 | qhull Tcv Qc +Statistics for: rbox 1000 W1e-20 D4 t1595644059 | qhull Tcv Qc - Number of points processed: 336 - Number of hyperplanes created: 4209 - Number of distance tests for qhull: 72958 - Number of distance tests for merging: 64847 - Number of distance tests for checking: 140537 - Number of merged facets: 1001 - CPU seconds to compute hull (after input): 0.078 + Number of points processed: 340 + Number of hyperplanes created: 4227 + Number of distance tests for qhull: 69008 + Number of distance tests for merging: 51153 + Number of distance tests for checking: 88363 + Number of merged facets: 997 + CPU seconds to compute hull (after input): 0.086 Output completed. Verifying that all points are below outer planes of -all facets. Will make 1001000 distance computations. +all facets. Will make 1029000 distance computations. rbox 500 W1e-20 D5 t | qhull Tv Qc Convex hull of 500 points in 5-d: - Number of vertices: 357 - Number of coplanar points: 143 - Number of facets: 5615 + Number of vertices: 348 + Number of coplanar points: 152 + Number of facets: 5402 Number of non-simplicial facets: 10 -Statistics for: rbox 500 W1e-20 D5 t1453170157 | qhull Tv Qc +Statistics for: rbox 500 W1e-20 D5 t1595644059 | qhull Tv Qc - Number of points processed: 406 - Number of hyperplanes created: 27513 - Number of distance tests for qhull: 120931 - Number of distance tests for merging: 306616 - Number of distance tests for checking: 242155 - Number of merged facets: 3419 - CPU seconds to compute hull (after input): 0.109 + Number of points processed: 405 + Number of hyperplanes created: 27428 + Number of distance tests for qhull: 130100 + Number of distance tests for merging: 299784 + Number of distance tests for checking: 118368 + Number of merged facets: 3468 + CPU seconds to compute hull (after input): 0.045 -QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point -is outside of a facet. See qh-optq.htm#Qx +QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point is outside of a facet. See qh-optq.htm#Qx Output completed. Verifying that all points are below outer planes of -all facets. Will make 2807500 distance computations. +all facets. Will make 2701000 distance computations. rbox 100 W1e-20 D6 t | qhull Tv Qc Convex hull of 100 points in 6-d: - Number of vertices: 98 - Number of coplanar points: 2 - Number of facets: 5434 - Number of non-simplicial facets: 9 + Number of vertices: 100 + Number of facets: 6076 + Number of non-simplicial facets: 10 -Statistics for: rbox 100 W1e-20 D6 t1453170158 | qhull Tv Qc +Statistics for: rbox 100 W1e-20 D6 t1595644059 | qhull Tv Qc - Number of points processed: 99 - Number of hyperplanes created: 18877 - Number of distance tests for qhull: 29933 - Number of distance tests for merging: 166869 - Number of distance tests for checking: 112842 - Number of merged facets: 191 - CPU seconds to compute hull (after input): 0.078 + Number of points processed: 100 + Number of hyperplanes created: 21104 + Number of distance tests for qhull: 32827 + Number of distance tests for merging: 181994 + Number of distance tests for checking: 62831 + Number of merged facets: 141 + CPU seconds to compute hull (after input): 0.026 -QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point -is outside of a facet. See qh-optq.htm#Qx +QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point is outside of a facet. See qh-optq.htm#Qx Output completed. Verifying that all points are below outer planes of -all facets. Will make 543400 distance computations. +all facets. Will make 607600 distance computations. rbox 50 W1e-20 D6 t | qhull Qv Tv Qc Convex hull of 50 points in 6-d: Number of vertices: 50 - Number of facets: 1881 + Number of facets: 2067 Number of non-simplicial facets: 1 -Statistics for: rbox 50 W1e-20 D6 t1453170158 | qhull Qv Tv Qc +Statistics for: rbox 50 W1e-20 D6 t1595644059 | qhull Qv Tv Qc Number of points processed: 50 - Number of hyperplanes created: 5679 - Number of distance tests for qhull: 8521 - Number of distance tests for merging: 3011007 - Number of distance tests for checking: 38170 + Number of hyperplanes created: 5952 + Number of distance tests for qhull: 8579 + Number of distance tests for merging: 3400138 + Number of distance tests for checking: 21120 Number of merged facets: 3 - CPU seconds to compute hull (after input): 0.125 + CPU seconds to compute hull (after input): 0.056 -QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point -is outside of a facet. See qh-optq.htm#Qx +QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point is outside of a facet. See qh-optq.htm#Qx Output completed. Verifying that all points are below outer planes of -all facets. Will make 94050 distance computations. +all facets. Will make 103350 distance computations. rbox 10000 D4 t | qhull QR0 Qc C-0.01 A0.3 Tv Convex hull of 10000 points in 4-d: Number of vertices: 16 - Number of coplanar points: 9320 + Number of coplanar points: 8483 Number of facets: 8 Number of non-simplicial facets: 8 -Statistics for: rbox 10000 D4 t1453170158 | qhull QR0 Qc C-0.01 A0.3 Tv QR1453170158 +Statistics for: rbox 10000 D4 t1595644059 | qhull QR0 Qc C-0.01 A0.3 Tv QR1595644060 - Number of points processed: 48 - Number of hyperplanes created: 273 - Number of distance tests for qhull: 1177654 - Number of distance tests for merging: 9826 - Number of distance tests for checking: 99444 - Number of merged facets: 317 - CPU seconds to compute hull (after input): 0.063 - Maximum distance of point above facet: 0.049 - Maximum distance of vertex below facet: -0.23 (0.1x) + Number of points processed: 43 + Number of hyperplanes created: 282 + Number of distance tests for qhull: 1406709 + Number of distance tests for merging: 18069 + Number of distance tests for checking: 89655 + Number of merged facets: 291 + CPU seconds to compute hull (after input): 0.032 + Maximum distance of point above facet: 0.053 + Maximum distance of vertex below facet: -0.18 (0.1x) Output completed. Verifying that all points are below outer planes of @@ -10675,273 +13437,284 @@ Furthest-site Delaunay triangulation by the convex hull of 1000 points in 3-d: Number of input sites: 1000 - Number of Delaunay regions: 14 + Number of Delaunay regions: 16 -Statistics for: rbox 1000 D2 t1453170158 | qhull d QR0 Qc C-1e-8 Qu Tv QR1453170158 +Statistics for: rbox 1000 D2 t1595644060 | qhull d QR0 Qc C-1e-8 Qu Tv QR1595644060 Number of points processed: 1000 - Number of hyperplanes created: 5527 + Number of hyperplanes created: 5585 Number of facets in hull: 1996 - Number of distance tests for qhull: 30007 - CPU seconds to compute hull (after input): 0.015 + Number of distance tests for qhull: 30012 + CPU seconds to compute hull (after input): 0.004 Output completed. Verifying that all points are below outer planes of -all facets. Will make 14000 distance computations. +all facets. Will make 16000 distance computations. rbox 300 D5 t |qhull A-0.999 Qx Qc Tcv Convex hull of 300 points in 5-d: - Number of vertices: 155 - Number of coplanar points: 33 - Number of facets: 1575 - Number of non-simplicial facets: 415 + Number of vertices: 160 + Number of coplanar points: 23 + Number of facets: 1756 + Number of non-simplicial facets: 471 -Statistics for: rbox 300 D5 t1453170158 | qhull A-0.999 Qx Qc Tcv +Statistics for: rbox 300 D5 t1595644060 | qhull A-0.999 Qx Qc Tcv - Number of points processed: 184 - Number of hyperplanes created: 11245 - Number of distance tests for qhull: 184805 - Number of distance tests for merging: 57645 - Number of distance tests for checking: 19853 - Number of merged facets: 1235 - CPU seconds to compute hull (after input): 0.046 - Maximum distance of vertex below facet: -0.024 (0.2x) + Number of points processed: 188 + Number of hyperplanes created: 11314 + Number of distance tests for qhull: 145495 + Number of distance tests for merging: 59109 + Number of distance tests for checking: 31214 + Number of merged facets: 1190 + CPU seconds to compute hull (after input): 0.027 + Maximum distance of vertex below facet: -0.018 (0.2x) -QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point -is outside of a facet. See qh-optq.htm#Qx +QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point is outside of a facet. See qh-optq.htm#Qx Output completed. Verifying that all points are below outer planes of -all facets. Will make 472500 distance computations. +all facets. Will make 526800 distance computations. rbox 100 D6 t |qhull A-0.9999 Qx Qc Tcv Convex hull of 100 points in 6-d: - Number of vertices: 82 - Number of coplanar points: 4 - Number of facets: 3572 - Number of non-simplicial facets: 230 + Number of vertices: 87 + Number of facets: 3852 + Number of non-simplicial facets: 249 -Statistics for: rbox 100 D6 t1453170158 | qhull A-0.9999 Qx Qc Tcv +Statistics for: rbox 100 D6 t1595644060 | qhull A-0.9999 Qx Qc Tcv - Number of points processed: 94 - Number of hyperplanes created: 14424 - Number of distance tests for qhull: 40249 - Number of distance tests for merging: 78016 - Number of distance tests for checking: 77007 + Number of points processed: 95 + Number of hyperplanes created: 15426 + Number of distance tests for qhull: 36579 + Number of distance tests for merging: 63310 + Number of distance tests for checking: 65746 Number of merged facets: 597 - CPU seconds to compute hull (after input): 0.062 - Maximum distance of vertex below facet: -0.0065 (0.2x) + CPU seconds to compute hull (after input): 0.03 + Maximum distance of vertex below facet: -0.0061 (0.2x) -QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point -is outside of a facet. See qh-optq.htm#Qx +QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point is outside of a facet. See qh-optq.htm#Qx Output completed. Verifying that all points are below outer planes of -all facets. Will make 357200 distance computations. +all facets. Will make 385200 distance computations. rbox 50 D7 t |qhull A-0.99999 Qx Qc Tcv W0.1 Convex hull of 50 points in 7-d: - Number of vertices: 46 + Number of vertices: 47 Number of coplanar points: 3 - Number of facets: 4377 - Number of non-simplicial facets: 76 + Number of facets: 5092 + Number of non-simplicial facets: 84 -Statistics for: rbox 50 D7 t1453170158 | qhull A-0.99999 Qx Qc Tcv W0.1 +Statistics for: rbox 50 D7 t1595644060 | qhull A-0.99999 Qx Qc Tcv W0.1 - Number of points processed: 46 - Number of hyperplanes created: 14833 - Number of distance tests for qhull: 32962 - Number of distance tests for merging: 90704 - Number of distance tests for checking: 127690 - Number of merged facets: 255 - CPU seconds to compute hull (after input): 0.062 - Maximum distance of point above facet: 0.086 - Maximum distance of vertex below facet: -0.0022 (0.2x) - -QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point -is outside of a facet. See qh-optq.htm#Qx - -Output completed. Verifying that all points are below outer planes of -all facets. Will make 218850 distance computations. - -echo === check bad cases for Qhull. May cause errors ${d:-`date`} -date -=== check bad cases for Qhull. May cause errors Mon Jan 18 21:22:39 EST 2016 + Number of points processed: 47 + Number of hyperplanes created: 15267 + Number of distance tests for qhull: 21958 + Number of distance tests for merging: 67744 + Number of distance tests for checking: 146550 + Number of merged facets: 238 + CPU seconds to compute hull (after input): 0.033 + Maximum distance of point above facet: 0.081 + Maximum distance of vertex below facet: -0.0017 (0.1x) + +QH7076 qhull input warning: exact merge ('Qx'). Verify may report that a point is outside of a facet. See qh-optq.htm#Qx + +Output completed. Verifying that all points are below outer planes of +all facets. Will make 254600 distance computations. + +set +v +======================================================= +=== The following commands may cause errors Fri, Jul 24, 2020 10:27:40 PM +======================================================= + +=== check bad cases for Qhull Fri, Jul 24, 2020 10:27:40 PM rbox 1000 L100000 s G1e-6 t | qhull Tv +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +dimensional (e.g., a square in 3-d instead of a cube)? Cosine of the minimum +angle is 1.0000000000000000. If so, Qhull may produce a wide facet. +Options 'Qs' (search all points), 'Qbb' (scale last coordinate), or +'QbB' (scale to unit box) may remove this warning. +See 'Limitations' in qh-impre.htm. Use 'Pp' to skip this warning. Convex hull of 1000 points in 3-d: - Number of vertices: 991 - Number of facets: 1527 - Number of non-simplicial facets: 7 + Number of vertices: 994 + Number of facets: 1523 + Number of non-simplicial facets: 6 -Statistics for: rbox 1000 L100000 s G1e-6 t1453170159 | qhull Tv +Statistics for: rbox 1000 L100000 s G1e-6 t1595644060 | qhull Tv - Number of points processed: 991 - Number of hyperplanes created: 3680 - Number of distance tests for qhull: 30929 - Number of distance tests for merging: 124775 - Number of distance tests for checking: 111665 - Number of merged facets: 455 - CPU seconds to compute hull (after input): 0.015 - Maximum distance of point above facet: 1.8e-015 (0.3x) - Maximum distance of vertex below facet: -4.1e-015 (0.7x) + Number of points processed: 994 + Number of hyperplanes created: 3610 + Number of distance tests for qhull: 30049 + Number of distance tests for merging: 128506 + Number of distance tests for checking: 116631 + Number of merged facets: 461 + CPU seconds to compute hull (after input): 0.009 + Maximum distance of point above facet: 2.1e-15 (0.4x) + Maximum distance of vertex below facet: -4.7e-15 (0.8x) -qhull precision warning: -The initial hull is narrow (cosine of min. angle is 1.0000000000000000). -Is the input lower dimensional (e.g., on a plane in 3-d)? Qhull may -produce a wide facet. Options 'QbB' (scale to unit box) or 'Qbb' (scale -last coordinate) may remove this warning. Use 'Pp' to skip this warning. -See 'Limitations' in qh-impre.htm. Output completed. Verifying that all points are below outer planes of -all facets. Will make 1527000 distance computations. +all facets. Will make 1523000 distance computations. rbox 1000 L100000 s G1e-6 t | qhull Tv Q10 Convex hull of 1000 points in 3-d: - Number of vertices: 991 - Number of facets: 1527 - Number of non-simplicial facets: 7 + Number of vertices: 994 + Number of facets: 1523 + Number of non-simplicial facets: 6 -Statistics for: rbox 1000 L100000 s G1e-6 t1453170159 | qhull Tv Q10 +Statistics for: rbox 1000 L100000 s G1e-6 t1595644060 | qhull Tv Q10 - Number of points processed: 991 - Number of hyperplanes created: 3680 - Number of distance tests for qhull: 30926 - Number of distance tests for merging: 124775 - Number of distance tests for checking: 111665 - Number of merged facets: 455 - CPU seconds to compute hull (after input): 0.015 - Maximum distance of point above facet: 1.8e-015 (0.3x) - Maximum distance of vertex below facet: -4.1e-015 (0.7x) + Number of points processed: 994 + Number of hyperplanes created: 3610 + Number of distance tests for qhull: 30053 + Number of distance tests for merging: 128506 + Number of distance tests for checking: 116638 + Number of merged facets: 461 + CPU seconds to compute hull (after input): 0.008 + Maximum distance of point above facet: 2.1e-15 (0.4x) + Maximum distance of vertex below facet: -4.7e-15 (0.8x) Output completed. Verifying that all points are below outer planes of -all facets. Will make 1527000 distance computations. +all facets. Will make 1523000 distance computations. rbox 1000 s Z1 G1e-13 t | qhull Tv Convex hull of 1001 points in 3-d: Number of vertices: 1001 - Number of facets: 1515 - Number of non-simplicial facets: 172 + Number of facets: 1489 + Number of non-simplicial facets: 134 -Statistics for: rbox 1000 s Z1 G1e-13 t1453170159 | qhull Tv +Statistics for: rbox 1000 s Z1 G1e-13 t1595644060 | qhull Tv Number of points processed: 1001 - Number of hyperplanes created: 4285 - Number of distance tests for qhull: 31541 - Number of distance tests for merging: 71006 - Number of distance tests for checking: 177092 - Number of merged facets: 1372 - CPU seconds to compute hull (after input): 0.031 - Maximum distance of point above facet: 8.6e-015 (1.5x) - Maximum distance of vertex below facet: -7.1e-015 (1.3x) + Number of hyperplanes created: 5159 + Number of distance tests for qhull: 32536 + Number of distance tests for merging: 139652 + Number of distance tests for checking: 306125 + Number of merged facets: 2330 + CPU seconds to compute hull (after input): 0.016 + Maximum distance of point above facet: 1.2e-14 (2.1x) + Maximum distance of vertex below facet: -1.8e-14 (3.2x) Output completed. Verifying that all points are below outer planes of -all facets. Will make 1516515 distance computations. -rbox 1000 s W1e-13 P0 t | qhull d Qbb Qc Tv +all facets. Will make 1490489 distance computations. +rbox 1000 s W1e-13 P0 t | qhull d Qbb Qc Q12 Tv Delaunay triangulation by the convex hull of 1001 points in 4-d: Number of input sites: 1001 Number of Delaunay regions: 1996 -Statistics for: rbox 1000 s W1e-13 P0 t1453170159 | qhull d Qbb Qc Tv +Statistics for: rbox 1000 s W1e-13 P0 t1595644060 | qhull d Qbb Qc Q12 Tv Number of points processed: 1001 - Number of hyperplanes created: 13893 - Number of facets in hull: 3674 - Number of distance tests for qhull: 55276 - Number of distance tests for merging: 193461 - Number of distance tests for checking: 169955 - Number of merged facets: 4573 - CPU seconds to compute hull (after input): 0.078 - Maximum distance of point above facet: 3.1e-014 (1.5x) - Maximum distance of vertex below facet: -5.9e-014 (2.9x) + Number of hyperplanes created: 12921 + Number of facets in hull: 3711 + Number of distance tests for qhull: 56202 + Number of distance tests for merging: 330422 + Number of distance tests for checking: 310646 + Number of merged facets: 3733 + CPU seconds to compute hull (after input): 0.033 + Maximum distance of point above facet: 1.8e-14 (1.8x) + Maximum distance of vertex below facet: -3.5e-14 (3.5x) Output completed. Verifying that all points are below outer planes of all facets. Will make 1997996 distance computations. -rbox 1000 s W1e-13 t | qhull d Tv +rbox 1000 s W1e-13 t | qhull d Q12 Tv +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +dimensional (e.g., a square in 3-d instead of a cube)? Cosine of the minimum +angle is 1.0000000000000000. If so, Qhull may produce a wide facet. +Options 'Qs' (search all points), 'Qbb' (scale last coordinate), or +'QbB' (scale to unit box) may remove this warning. +See 'Limitations' in qh-impre.htm. Use 'Pp' to skip this warning. +QH6170 qhull topology error (qh_partitionvisible): all new facets deleted as + degenerate facets. Can not continue. + +While executing: rbox 1000 s W1e-13 t1595644060 | qhull d Q12 Tv +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213932684 delaunay Q12-allow-wide Tverify _pre-merge + _zero-centrum Pgood _max-width 1 Error-roundoff 1e-15 _one-merge 9.1e-15 + _near-inside 4.5e-14 Visible-distance 6e-15 U-max-coplanar 6e-15 + Width-outside 1.2e-14 _wide-facet 3.6e-14 _narrow-hull 0 + _maxoutside 6.4e-13 +Last point added to hull was p716. Last merge was #2225. + +At error exit: Delaunay triangulation by the convex hull of 1000 points in 4-d: - Number of input sites: 33 - Total number of deleted points due to merging: 881 - Total number of nearly incident points: 86 - Number of Delaunay regions: 24 - Number of non-simplicial Delaunay regions: 10 - -Statistics for: rbox 1000 s W1e-13 t1453170159 | qhull d Tv - - Number of points processed: 914 - Number of hyperplanes created: 12201 - Number of facets in hull: 44 - Number of distance tests for qhull: 3146312 - Number of distance tests for merging: 473877 - Number of distance tests for checking: 45000 - Number of merged facets: 11380 - CPU seconds to compute hull (after input): 0.297 - Maximum distance of point above facet: 1.9e-013 (18.4x) - Maximum distance of vertex below facet: -4.7e-014 (4.7x) - -qhull precision warning: -The initial hull is narrow (cosine of min. angle is 1.0000000000000000). -Is the input lower dimensional (e.g., on a plane in 3-d)? Qhull may -produce a wide facet. Options 'QbB' (scale to unit box) or 'Qbb' (scale -last coordinate) may remove this warning. Use 'Pp' to skip this warning. -See 'Limitations' in qh-impre.htm. + Number of input sites: 53 + Total number of deleted points due to merging: 184 + Total number of nearly incident points: 763 + Number of Delaunay regions: 31 + Number of non-simplicial Delaunay regions: 11 + +Statistics for: rbox 1000 s W1e-13 t1595644060 | qhull d Q12 Tv + + Number of points processed: 243 + Number of hyperplanes created: 2811 + Number of facets in hull: 72 + Number of distance tests for qhull: 995247 + Number of distance tests for merging: 231583 + Number of distance tests for checking: 0 + Number of merged facets: 2301 + Maximum distance of point above facet: 6.4e-13 (63.5x) + Maximum distance of vertex below facet: -1.6e-12 (158.2x) -Output completed. Verifying that all points are below outer planes of -all facets. Will make 24000 distance computations. + +precision problems (corrected unless 'Q0' or an error) + 235 flipped facets + 394 coplanar horizon facets for new vertices + 11 coplanar points during partitioning + 6 dupridges with flip facet into good neighbor + 1 dupridges with flip facet into good flip neighbor + +A Qhull topology error has occurred. Qhull did not recover from facet merges and vertex merges. +This usually occurs when the input is nearly degenerate and substantial merging has occurred. +See http://www.qhull.org/html/qh-impre.htm#limit rbox 1000 s W1e-13 t D2 | qhull d Tv +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +dimensional (e.g., a square in 3-d instead of a cube)? Cosine of the minimum +angle is 1.0000000000000000. If so, Qhull may produce a wide facet. +Options 'Qs' (search all points), 'Qbb' (scale last coordinate), or +'QbB' (scale to unit box) may remove this warning. +See 'Limitations' in qh-impre.htm. Use 'Pp' to skip this warning. +QH7086 Qhull precision warning: repartition coplanar point p440 from f817 as an outside point above hidden facet f817 dist 2.8e-13 nearest vertices 0.00052 Delaunay triangulation by the convex hull of 1000 points in 3-d: - Number of input sites: 976 - Total number of deleted points due to merging: 6 - Total number of nearly incident points: 18 - Number of Delaunay regions: 724 - Number of non-simplicial Delaunay regions: 145 - -Statistics for: rbox 1000 s W1e-13 D2 t1453170159 | qhull d Tv - - Number of points processed: 982 - Number of hyperplanes created: 3790 - Number of facets in hull: 1445 - Number of distance tests for qhull: 60840 - Number of distance tests for merging: 40450 - Number of distance tests for checking: 175721 - Number of merged facets: 793 - CPU seconds to compute hull (after input): 0.016 - Maximum distance of point above facet: 5.8e-014 (10.5x) - Maximum distance of vertex below facet: -9.3e-015 (1.7x) + Number of input sites: 977 + Total number of deleted points due to merging: 13 + Total number of nearly incident points: 10 + Number of Delaunay regions: 718 + Number of non-simplicial Delaunay regions: 130 + +Statistics for: rbox 1000 s W1e-13 D2 t1595644060 | qhull d Tv + + Number of points processed: 990 + Number of hyperplanes created: 3949 + Number of facets in hull: 1457 + Number of distance tests for qhull: 48902 + Number of distance tests for merging: 41502 + Number of distance tests for checking: 74612 + Number of merged facets: 882 + CPU seconds to compute hull (after input): 0.007 + Maximum distance of point above facet: 7.5e-14 (13.5x) + Maximum distance of vertex below facet: -9.7e-15 (1.7x) -qhull precision warning: -The initial hull is narrow (cosine of min. angle is 1.0000000000000000). -Is the input lower dimensional (e.g., on a plane in 3-d)? Qhull may -produce a wide facet. Options 'QbB' (scale to unit box) or 'Qbb' (scale -last coordinate) may remove this warning. Use 'Pp' to skip this warning. -See 'Limitations' in qh-impre.htm. Output completed. Verifying that all points are below outer planes of -all facets. Will make 724000 distance computations. +all facets. Will make 718000 distance computations. -echo ======================================================= -======================================================= -echo ======================================================= -======================================================= -echo === The following commands may cause errors ${d:-`date`} -date -=== The following commands may cause errors Mon Jan 18 21:22:39 EST 2016 -echo ======================================================= -======================================================= -echo ======================================================= -======================================================= +set +v +=== check Qhull without merging Q0 Fri, Jul 24, 2020 10:27:40 PM rbox c D7 | qhull Q0 Tcv Convex hull of 128 points in 7-d: @@ -10953,8 +13726,8 @@ Number of points processed: 128 Number of hyperplanes created: 12287 - Number of distance tests for qhull: 32936 - CPU seconds to compute hull (after input): 0.046 + Number of distance tests for qhull: 26353 + CPU seconds to compute hull (after input): 0.016 precision problems (corrected unless 'Q0' or an error) @@ -10965,8 +13738,13 @@ 11903 zero divisors during gaussian elimination qhull output completed. Verifying that 128 points are -below 6.6e-015 of the nearest facet. +below 6.6e-15 of the nearest facet. rbox 100 s D3 | qhull Q0 E1e-3 Tc Po +QH6115 qhull precision error: f100 is concave to f247, since p44(v13) is 0.002232 above f247 +QH6115 qhull precision error: f139 is concave to f274, since p90(v32) is 0.007128 above f274 +QH6115 qhull precision error: f163 is concave to f232, since p5(v6) is 0.001226 above f232 +QH6115 qhull precision error: f293 is concave to f389, since p11(v61) is 0.002161 above f389 +QH6115 qhull precision error: f307 is concave to f459, since p75(v21) is 0.01537 above f459 Convex hull of 100 points in 3-d: @@ -10977,20 +13755,20 @@ Number of points processed: 100 Number of hyperplanes created: 508 - Number of distance tests for qhull: 1728 - CPU seconds to compute hull (after input): 0 + Number of distance tests for qhull: 1727 + CPU seconds to compute hull (after input): 0.001 -QH6115 qhull precision error: f100 is concave to f247, since p44(v13) is 0.002232 above -QH6115 qhull precision error: f139 is concave to f274, since p90(v32) is 0.007128 above -QH6115 qhull precision error: f163 is concave to f232, since p5(v6) is 0.001226 above -QH6115 qhull precision error: f293 is concave to f389, since p11(v61) is 0.002161 above -QH6115 qhull precision error: f307 is concave to f459, since p75(v21) is 0.01537 above precision problems (corrected unless 'Q0' or an error) 16 coplanar half ridges in output 5 concave half ridges in output 18 coplanar horizon facets for new vertices rbox 100 s D3 | qhull Q0 E1e-2 Tc Po +QH6115 qhull precision error: f123 is concave to f235, since p85(v8) is 0.06092 above f235 +QH6115 qhull precision error: f177 is concave to f272, since p98(v20) is 0.03571 above f272 +QH6115 qhull precision error: f246 is concave to f252, since p7(v57) is 0.02104 above f252 +QH6115 qhull precision error: f261 is concave to f305, since p82(v60) is 0.01847 above f305 +QH6115 qhull precision error: f266 is concave to f317, since p82(v60) is 0.02592 above f317 Convex hull of 100 points in 3-d: @@ -11001,14 +13779,9 @@ Number of points processed: 72 Number of hyperplanes created: 321 - Number of distance tests for qhull: 1693 - CPU seconds to compute hull (after input): 0 + Number of distance tests for qhull: 1664 + CPU seconds to compute hull (after input): 0.001 -QH6115 qhull precision error: f123 is concave to f235, since p85(v8) is 0.06092 above -QH6115 qhull precision error: f177 is concave to f272, since p98(v20) is 0.03571 above -QH6115 qhull precision error: f246 is concave to f252, since p7(v57) is 0.02104 above -QH6115 qhull precision error: f261 is concave to f305, since p82(v60) is 0.01847 above -QH6115 qhull precision error: f266 is concave to f317, since p82(v60) is 0.02592 above precision problems (corrected unless 'Q0' or an error) 52 coplanar half ridges in output @@ -11026,7 +13799,7 @@ Number of points processed: 10 Number of hyperplanes created: 27 - Number of distance tests for qhull: 977 + Number of distance tests for qhull: 917 CPU seconds to compute hull (after input): 0 @@ -11035,6 +13808,10 @@ 3 coplanar horizon facets for new vertices 59 coplanar points during partitioning rbox 100 s D3 | qhull Q0 R1e-3 Tc Po +QH6115 qhull precision error: f94 is concave to f270, since p44(v13) is 0.003303 above f270 +QH6115 qhull precision error: f157 is concave to f255, since p5(v6) is 0.005886 above f255 +QH6115 qhull precision error: f289 is concave to f386, since p30(v62) is 0.000726 above f386 +QH6115 qhull precision error: f381 is concave to f293, since p56(v79) is 0.0006018 above f293 Convex hull of 100 points in 3-d: @@ -11044,108 +13821,99 @@ Statistics for: rbox 100 s D3 | qhull Q0 R1e-3 Tc Po Number of points processed: 100 - Number of hyperplanes created: 513 - Number of distance tests for qhull: 1693 - CPU seconds to compute hull (after input): 0 + Number of hyperplanes created: 498 + Number of distance tests for qhull: 1643 + CPU seconds to compute hull (after input): 0.002 -QH6115 qhull precision error: f229 is concave to f300, since p90(v34) is 0.007895 above -QH6115 qhull precision error: f323 is concave to f421, since p11(v67) is 0.001894 above -QH6115 qhull precision error: f343 is concave to f493, since p75(v21) is 0.011 above -QH6115 qhull precision error: f493 is concave to f343, since p25(v97) is 0.000937 above precision problems (corrected unless 'Q0' or an error) - 14 coplanar half ridges in output + 10 coplanar half ridges in output 4 concave half ridges in output - 9 coplanar horizon facets for new vertices + 10 coplanar horizon facets for new vertices rbox 100 s D3 | qhull Q0 R1e-2 Tc Po +QH6115 qhull precision error: f78 is concave to f147, since p57(v1) is 0.01085 above f147 +QH6115 qhull precision error: f89 is concave to f194, since p17(v2) is 0.0111 above f194 +QH6115 qhull precision error: f106 is concave to f122, since p74(v27) is 0.01501 above f122 +QH6115 qhull precision error: f122 is concave to f106, since p95(v30) is 0.00822 above f106 +QH6115 qhull precision error: f126 is concave to f213, since p95(v30) is 0.007437 above f213 +QH6115 qhull precision error: f141 is concave to f288, since p81(v34) is 0.007157 above f288 +QH6115 qhull precision error: f147 is concave to f227, since p90(v19) is 0.1078 above f227 +QH6115 qhull precision error: f161 is concave to f252, since p20(v24) is 0.008976 above f252 +QH6115 qhull precision error: f176 is concave to f277, since p38(v22) is 0.008285 above f277 +QH6115 qhull precision error: f181 is concave to f276, since p73(v12) is 0.02209 above f276 +QH6115 qhull precision error: f186 is concave to f291, since p85(v8) is 0.04316 above f291 +QH6115 qhull precision error: f194 is concave to f89, since p82(v45) is 0.009743 above f89 +QH6115 qhull precision error: f198 is concave to f273, since p82(v45) is 0.01834 above f273 +QH6115 qhull precision error: f213 is concave to f126, since p93(v48) is 0.01071 above f126 +QH6115 qhull precision error: f227 is concave to f147, since p37(v51) is 0.007006 above f147 +QH6115 qhull precision error: f273 is concave to f198, since p29(v60) is 0.006128 above f198 +QH6115 qhull precision error: f288 is concave to f141, since p96(v63) is 0.005493 above f141 +QH6115 qhull precision error: f291 is concave to f186, since p34(v64) is 0.008643 above f186 +QH6115 qhull precision error: f300 is concave to f355, since p30(v66) is 0.006345 above f355 +QH6115 qhull precision error: f324 is concave to f384, since p75(v20) is 0.02388 above f384 +QH6115 qhull precision error: f361 is concave to f406, since p41(v5) is 0.009438 above f406 +QH6115 qhull precision error: f368 is concave to f367, since p11(v69) is 0.007227 above f367 +QH6115 qhull precision error: f390 is concave to f391, since p99(v73) is 0.007279 above f391 +QH6115 qhull precision error: f391 is concave to f390, since p43(v74) is 0.01052 above f390 Convex hull of 100 points in 3-d: - Number of vertices: 87 - Number of facets: 170 + Number of vertices: 88 + Number of facets: 172 Statistics for: rbox 100 s D3 | qhull Q0 R1e-2 Tc Po - Number of points processed: 87 - Number of hyperplanes created: 405 - Number of distance tests for qhull: 1734 - CPU seconds to compute hull (after input): 0 - -QH6136 qhull precision error: facet f326 is flipped, distance= 0.51437088552 -QH6136 qhull precision error: facet f326 is flipped, distance= 0.511098236347 -QH6115 qhull precision error: f76 is concave to f201, since p76(v21) is 0.0101 above -QH6115 qhull precision error: f96 is concave to f279, since p38(v22) is 0.008383 above -QH6115 qhull precision error: f132 is concave to f140, since p57(v0) is 0.02117 above -QH6115 qhull precision error: f140 is concave to f132, since p96(v34) is 0.00703 above -QH6115 qhull precision error: f150 is concave to f230, since p11(v37) is 0.04121 above -QH6115 qhull precision error: f161 is concave to f326, since p26(v32) is 0.01279 above -QH6115 qhull precision error: f194 is concave to f281, since p73(v12) is 0.03149 above -QH6115 qhull precision error: f230 is concave to f150, since p47(v52) is 0.008464 above -QH6115 qhull precision error: f263 is concave to f156, since p15(v60) is 0.01055 above -QH6115 qhull precision error: f277 is concave to f353, since p89(v36) is 0.005387 above -QH6115 qhull precision error: f281 is concave to f194, since p66(v63) is 0.005996 above -QH6115 qhull precision error: f319 is concave to f341, since p82(v70) is 0.07818 above -QH6115 qhull precision error: f324 is concave to f368, since p41(v5) is 0.01436 above -QH6113 qhull precision error: f326 is flipped(interior point is outside) -QH6115 qhull precision error: f344 is concave to f352, since p29(v75) is 0.009226 above -QH6115 qhull precision error: f348 is concave to f351, since p27(v76) is 0.008815 above -QH6115 qhull precision error: f349 is concave to f350, since p15(v60) is 0.01089 above -QH6115 qhull precision error: f352 is concave to f344, since p69(v77) is 0.008279 above -QH6115 qhull precision error: f353 is concave to f277, since p69(v77) is 0.006627 above -QH6115 qhull precision error: f385 is concave to f404, since p18(v73) is 0.007494 above -QH6115 qhull precision error: f404 is concave to f385, since p13(v87) is 0.005049 above + Number of points processed: 88 + Number of hyperplanes created: 413 + Number of distance tests for qhull: 1702 + CPU seconds to compute hull (after input): 0.001 + precision problems (corrected unless 'Q0' or an error) - 45 coplanar half ridges in output - 20 concave half ridges in output - 1 flipped facets - 47 coplanar horizon facets for new vertices - 13 coplanar points during partitioning + 49 coplanar half ridges in output + 24 concave half ridges in output + 53 coplanar horizon facets for new vertices + 12 coplanar points during partitioning rbox 100 s D3 | qhull Q0 R0.05 Tc -QH6136 qhull precision error: facet f160 is flipped, distance= 0.41168102504 +QH6136 qhull precision error: facet f193 is flipped, distance= 0.391655882694 ERRONEOUS FACET: -- f160 - - flags: bottom simplicial flipped - - normal: -0.3615 -0.1924 0.9123 - - offset: 0.4644952 - - vertices: p94(v40) p19(v28) p56(v27) - - neighboring facets: f107 f158 f202 -QH6136 qhull precision error: facet f203 is flipped, distance= 0.448767103644 -ERRONEOUS FACET: -- f203 +- f193 - flags: top simplicial flipped - - normal: -0.2281 0.05702 -0.972 - - offset: 0.4136177 - - vertices: p40(v51) p83(v19) p48(v6) - - neighboring facets: f123 f204 f205 + - normal: -0.2813 -0.9389 0.1981 + - offset: 0.2910058 + - vertices: p19(v46) p65(v35) p74(v28) + - neighboring facets: f183 f194 f195 A flipped facet occurs when its distance to the interior point is -greater than -0.024, the maximum roundoff error. +greater than or equal to -0.024, the maximum roundoff error. While executing: rbox 100 s D3 | qhull Q0 R0.05 Tc -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99361789 Q0-no-premerge Random_perturb 0.05 Tcheck-frequently +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213949491 Q0-no-premerge Random-perturb 0.05 Tcheck-frequently _max-width 0.94 Error-roundoff 0.024 Visible-distance 0.024 - U-coplanar-distance 0.024 Width-outside 0.048 _wide-facet 0.15 -Last point added to hull was p40. + U-max-coplanar 0.024 Width-outside 0.048 _wide-facet 0.15 _maxoutside 0.19 +Last point added to hull was p19. Qhull has finished constructing the hull. At error exit: Convex hull of 100 points in 3-d: - Number of vertices: 51 - Number of facets: 98 + Number of vertices: 46 + Number of facets: 88 Statistics for: rbox 100 s D3 | qhull Q0 R0.05 Tc - Number of points processed: 51 - Number of hyperplanes created: 206 - Number of distance tests for qhull: 2041 + Number of points processed: 46 + Number of hyperplanes created: 196 + Number of distance tests for qhull: 2023 CPU seconds to compute hull (after input): 0 - 46 coplanar points during partitioning +precision problems (corrected unless 'Q0' or an error) + 1 flipped facets + 34 coplanar horizon facets for new vertices + 51 coplanar points during partitioning Precision problems were detected during construction of the convex hull. This occurs because convex hull algorithms assume that calculations are @@ -11181,47 +13949,31 @@ - use option 'Ft' to triangulate the output by adding points - use exact arithmetic (see "Imprecision in Qhull", qh-impre.htm) rbox 100 s D3 | qhull Q0 R0.05 Tc Po +QH6136 qhull precision error: facet f193 is flipped, distance= 0.391655882694 +QH6115 qhull precision error: f119 is concave to f134, since p31(v31) is 0.05178 above f134 +QH6115 qhull precision error: f124 is concave to f131, since p5(v6) is 0.1065 above f131 +QH6115 qhull precision error: f147 is concave to f91, since p69(v36) is 0.0354 above f91 +QH6113 qhull precision error: f193 is flipped (interior point is outside) Convex hull of 100 points in 3-d: - Number of vertices: 51 - Number of facets: 98 + Number of vertices: 46 + Number of facets: 88 Statistics for: rbox 100 s D3 | qhull Q0 R0.05 Tc Po - Number of points processed: 51 - Number of hyperplanes created: 209 - Number of distance tests for qhull: 2072 - CPU seconds to compute hull (after input): 0 - -QH6136 qhull precision error: facet f105 is flipped, distance= 0.531034433025 -QH6136 qhull precision error: facet f172 is flipped, distance= 0.351989788321 -QH6136 qhull precision error: facet f105 is flipped, distance= 0.524438872687 -QH6136 qhull precision error: facet f172 is flipped, distance= 0.311891927779 -QH6115 qhull precision error: f30 is concave to f172, since p90(v11) is 0.05852 above -QH6115 qhull precision error: f41 is concave to f70, since p28(v14) is 0.03835 above -QH6115 qhull precision error: f65 is concave to f128, since p18(v19) is 0.03961 above -QH6115 qhull precision error: f77 is concave to f201, since p89(v21) is 0.03681 above -QH6115 qhull precision error: f99 is concave to f192, since p85(v8) is 0.1891 above -QH6113 qhull precision error: f105 is flipped(interior point is outside) -QH6115 qhull precision error: f143 is concave to f179, since p3(v2) is 0.0956 above -QH6115 qhull precision error: f150 is concave to f185, since p70(v13) is 0.03157 above -QH6115 qhull precision error: f161 is concave to f171, since p41(v5) is 0.07964 above -QH6115 qhull precision error: f166 is concave to f108, since p96(v41) is 0.02537 above -QH6115 qhull precision error: f169 is concave to f129, since p60(v42) is 0.02492 above -QH6113 qhull precision error: f172 is flipped(interior point is outside) -QH6115 qhull precision error: f183 is concave to f205, since p44(v37) is 0.1309 above -QH6115 qhull precision error: f186 is concave to f207, since p5(v25) is 0.1066 above -QH6115 qhull precision error: f187 is concave to f151, since p75(v47) is 0.04347 above -QH6115 qhull precision error: f199 is concave to f200, since p12(v3) is 0.08495 above -QH6115 qhull precision error: f201 is concave to f77, since p35(v50) is 0.02603 above + Number of points processed: 46 + Number of hyperplanes created: 196 + Number of distance tests for qhull: 2023 + CPU seconds to compute hull (after input): 0 + precision problems (corrected unless 'Q0' or an error) - 61 coplanar half ridges in output - 15 concave half ridges in output - 2 flipped facets - 44 coplanar horizon facets for new vertices - 46 coplanar points during partitioning + 35 coplanar half ridges in output + 3 concave half ridges in output + 1 flipped facets + 34 coplanar horizon facets for new vertices + 51 coplanar points during partitioning rbox 1000 W1e-7 | qhull Q0 Tc Po Convex hull of 1000 points in 3-d: @@ -11233,60 +13985,32 @@ Number of points processed: 221 Number of hyperplanes created: 1160 - Number of distance tests for qhull: 22647 - CPU seconds to compute hull (after input): 0.015 + Number of distance tests for qhull: 22590 + CPU seconds to compute hull (after input): 0.006 + +rbox 50 s | qhull Q0 V0.05 W0.01 Tc Po +QH7088 Qhull precision warning: in post-processing (qh_check_maxout) p0 for f36 is 0.061 above hidden facet f70 nearest vertices 0.15 +QH7088 Qhull precision warning: in post-processing (qh_check_maxout) p8 for f38 is 0.26 above hidden facet f145 nearest vertices 0.14 +QH6297 Qhull precision error (qh_check_maxout): large increase in qh.max_outside during post-processing dist 0.26 (46669910714866.6x). See warning QH0032/QH0033. Allow with 'Q12' (allow-wide) and 'Pp' +ERRONEOUS FACET: +- f145 + - flags: top simplicial + - normal: -0.6276 0.1677 -0.7602 + - offset: -0.2196772 + - maxoutside: 0.2588526 + - vertices: p2(v43) p0(v13) p24(v6) + - neighboring facets: f39 f146 f147 +ERRONEOUS and NEIGHBORING FACETS to output + +While executing: rbox 50 s | qhull Q0 V0.05 W0.01 Tc Po +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213949491 Q0-no-premerge Visible 0.05 W-outside 0.01 + Tcheck-frequently Poutput-forced _max-width 0.98 Error-roundoff 6.9e-16 + _near-inside 2.4e-14 U-max-coplanar 0.05 _wide-facet 0.3 _maxoutside 0.01 +Last point added to hull was p10. + +At error exit: -rbox 50 s | qhull Q0 V0.05 W0.01 Tc Po -QH6136 qhull precision error: facet f105 is flipped, distance= 0.328228630954 -QH6136 qhull precision error: facet f125 is flipped, distance= 0.389476173148 -QH6136 qhull precision error: facet f152 is flipped, distance= 0.420187947128 -QH6136 qhull precision error: facet f155 is flipped, distance= 0.396217639489 -QH6136 qhull precision error: facet f161 is flipped, distance= 0.0543980568868 -QH6136 qhull precision error: facet f164 is flipped, distance= 0.448464152152 -QH6136 qhull precision error: facet f170 is flipped, distance= 0.430073300444 -QH6136 qhull precision error: facet f105 is flipped, distance= 0.328228630954 -QH6136 qhull precision error: facet f125 is flipped, distance= 0.389476173148 -QH6136 qhull precision error: facet f152 is flipped, distance= 0.420187947128 -QH6136 qhull precision error: facet f155 is flipped, distance= 0.396217639489 -QH6136 qhull precision error: facet f161 is flipped, distance= 0.0543980568868 -QH6136 qhull precision error: facet f164 is flipped, distance= 0.448464152152 -QH6136 qhull precision error: facet f170 is flipped, distance= 0.430073300444 -QH6115 qhull precision error: f25 is concave to f60, since p41(v8) is 0.1672 above -QH6115 qhull precision error: f25 is concave to f155, since p19(v2) is 0.01771 above -QH6115 qhull precision error: f38 is concave to f70, since p0(v13) is 0.06094 above -QH6115 qhull precision error: f39 is concave to f145, since p8(v11) is 0.2589 above -QH6115 qhull precision error: f45 is concave to f72, since p5(v15) is 0.02091 above -QH6115 qhull precision error: f47 is concave to f98, since p5(v15) is 0.05573 above -QH6115 qhull precision error: f47 is concave to f96, since p42(v7) is 0.05284 above -QH6115 qhull precision error: f50 is concave to f59, since p49(v16) is 0.01059 above -QH6115 qhull precision error: f54 is concave to f84, since p28(v17) is 0.03013 above -QH6115 qhull precision error: f54 is concave to f152, since p29(v1) is 0.2143 above -QH6115 qhull precision error: f59 is concave to f50, since p1(v19) is 0.01736 above -QH6115 qhull precision error: f60 is concave to f25, since p1(v19) is 0.02263 above -QH6115 qhull precision error: f62 is concave to f119, since p14(v5) is 0.02783 above -QH6115 qhull precision error: f65 is concave to f120, since p16(v10) is 0.003387 above -QH6115 qhull precision error: f70 is concave to f38, since p9(v22) is 0.04722 above -QH6115 qhull precision error: f71 is concave to f73, since p9(v22) is 0.04568 above -QH6115 qhull precision error: f72 is concave to f45, since p31(v23) is 0.02334 above -QH6115 qhull precision error: f73 is concave to f71, since p31(v23) is 0.04141 above -QH6115 qhull precision error: f78 is concave to f125, since p38(v24) is 0.01386 above -QH6115 qhull precision error: f84 is concave to f54, since p25(v26) is 0.01696 above -QH6115 qhull precision error: f87 is concave to f93, since p14(v5) is 0.01836 above -QH6115 qhull precision error: f88 is concave to f112, since p4(v27) is 0.04742 above -QH6115 qhull precision error: f91 is concave to f161, since p26(v28) is 0.3121 above -QH6115 qhull precision error: f93 is concave to f87, since p26(v28) is 0.01572 above -QH6115 qhull precision error: f96 is concave to f47, since p21(v29) is 0.02763 above -QH6115 qhull precision error: f98 is concave to f47, since p20(v30) is 0.03086 above -QH6113 qhull precision error: f105 is flipped(interior point is outside) -QH6115 qhull precision error: f106 is concave to f149, since p29(v1) is 0.0618 above -QH6115 qhull precision error: f112 is concave to f88, since p6(v34) is 0.02917 above -QH6115 qhull precision error: f119 is concave to f62, since p39(v36) is 0.006072 above -QH6115 qhull precision error: f120 is concave to f65, since p39(v36) is 0.001213 above -QH6113 qhull precision error: f125 is flipped(interior point is outside) -QH6115 qhull precision error: f134 is concave to f139, since p46(v40) is 0.07699 above -QH6115 qhull precision error: f139 is concave to f134, since p47(v41) is 0.01871 above -QH6115 qhull precision error: f141 is concave to f144, since p47(v41) is 0.1017 above -QH6115 qhull precision error: f144 is concave to f14 Convex hull of 50 points in 3-d: Number of vertices: 50 @@ -11296,63 +14020,85 @@ Number of points processed: 50 Number of hyperplanes created: 171 - Number of distance tests for qhull: 552 - CPU seconds to compute hull (after input): 0 + Number of distance tests for qhull: 538 -1, since p35(v42) is 0.03263 above -QH6115 qhull precision error: f145 is concave to f39, since p2(v43) is 0.04048 above -QH6115 qhull precision error: f149 is concave to f106, since p18(v44) is 0.009672 above -QH6113 qhull precision error: f152 is flipped(interior point is outside) -QH6113 qhull precision error: f155 is flipped(interior point is outside) -QH6113 qhull precision error: f161 is flipped(interior point is outside) -QH6113 qhull precision error: f164 is flipped(interior point is outside) -QH6115 qhull precision error: f166 is concave to f170, since p16(v10) is 0.04552 above -QH6113 qhull precision error: f170 is flipped(interior point is outside) precision problems (corrected unless 'Q0' or an error) - 37 concave half ridges in output 7 flipped facets 82 coplanar horizon facets for new vertices -rbox 100 s D5 | qhull Q0 R1e-2 Tc Po -Convex hull of 100 points in 5-d: +Precision problems were detected during construction of the convex hull. +This occurs because convex hull algorithms assume that calculations are +exact, but floating-point arithmetic has roundoff errors. - Number of vertices: 37 - Number of facets: 500 +To correct for precision problems, do not use 'Q0'. By default, Qhull +selects 'C-0' or 'Qx' and merges non-convex facets. With option 'QJ', +Qhull joggles the input to prevent precision problems. See "Imprecision +in Qhull" (qh-impre.htm). -Statistics for: rbox 100 s D5 | qhull Q0 R1e-2 Tc Po +If you use 'Q0', the output may include +coplanar ridges, concave ridges, and flipped facets. In 4-d and higher, +Qhull may produce a ridge with four neighbors or two facets with the same +vertices. Qhull reports these events when they occur. It stops when a +concave ridge, flipped facet, or duplicate facet occurs. - Number of points processed: 37 - Number of hyperplanes created: 1198 - Number of distance tests for qhull: 2764 +If you need triangular output: + - use option 'Qt' to triangulate the output + - use option 'QJ' to joggle the input points and remove precision errors + - use option 'Ft'. It triangulates non-simplicial facets with added points. -QH6107 qhull precision error: facets f1150, f1191 and f1152 meet at a ridge with more than 2 neighbors. Can not continue. +If you must use 'Q0', +try one or more of the following options. They can not guarantee an output. + - use 'QbB' to scale the input to a cube. + - use 'Po' to produce output and prevent partitioning for flipped facets + - use 'V0' to set min. distance to visible facet as 0 instead of roundoff + - use 'En' to specify a maximum roundoff error less than 6.9e-16. + - options 'Qf', 'Qbb', and 'QR0' may also help + +To guarantee simplicial output: + - use option 'Qt' to triangulate the output + - use option 'QJ' to joggle the input points and remove precision errors + - use option 'Ft' to triangulate the output by adding points + - use exact arithmetic (see "Imprecision in Qhull", qh-impre.htm) +rbox 100 s D5 | qhull Q0 R1e-2 Tc Po +QH6107 qhull topology error: facets f721, f756 and f722 meet at a ridge with more than 2 neighbors. Can not continue due to no qh.PREmerge and no 'Qx' (MERGEexact) ERRONEOUS FACET: -- f1150 - - flags: top simplicial new - - normal: -0.7563 0.3207 -0.3738 0.2956 0.3133 - - offset: -0.2362615 - - vertices: p70(v37) p59(v25) p47(v17) p33(v15) p6(v9) - - neighboring facets: f519 f1148 f1151 f1152 f1153 +- f721 + - flags: bottom simplicial newfacet + - offset: 0 + - vertices: p84(v29) p2(v19) p58(v12) p3(v7) p9(v2) + - neighboring facets: f362 f720 f728 f722 f740 ERRONEOUS OTHER FACET: -- f1191 - - flags: top simplicial new - - normal: 0.7615 -0.2592 0.3014 -0.3662 -0.3577 - - offset: 0.27682 - - vertices: p70(v37) p59(v25) p47(v17) p6(v9) p54(v0) - - neighboring facets: f519 f1148 +- f756 + - flags: top simplicial newfacet + - offset: 0 + - vertices: p84(v29) p40(v26) p2(v19) p58(v12) p9(v2) + - neighboring facets: f566 ERRONEOUS and NEIGHBORING FACETS to output While executing: rbox 100 s D5 | qhull Q0 R1e-2 Tc Po -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99361789 Q0-no-premerge Random_perturb 0.01 Tcheck-frequently +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213949491 Q0-no-premerge Random-perturb 0.01 Tcheck-frequently Poutput-forced _max-width 0.88 Error-roundoff 0.0045 - Visible-distance 0.0045 U-coplanar-distance 0.0045 Width-outside 0.009 - _wide-facet 0.027 -Last point added to hull was p70. + Visible-distance 0.0045 U-max-coplanar 0.0045 Width-outside 0.009 + _wide-facet 0.027 _maxoutside 0.054 +Last point added to hull was p84. + +Convex hull of 100 points in 5-d: + + Number of vertices: 29 + Number of facets: 340 + +Statistics for: rbox 100 s D5 | qhull Q0 R1e-2 Tc Po + + Number of points processed: 28 + Number of hyperplanes created: 720 + Number of distance tests for qhull: 2275 + precision problems (corrected unless 'Q0' or an error) - 50 coplanar horizon facets for new vertices + 1 flipped facets + 24 coplanar horizon facets for new vertices Precision problems were detected during construction of the convex hull. This occurs because convex hull algorithms assume that calculations are @@ -11387,290 +14133,194 @@ - use option 'QJ' to joggle the input points and remove precision errors - use option 'Ft' to triangulate the output by adding points - use exact arithmetic (see "Imprecision in Qhull", qh-impre.htm) -rbox L100 10000 D4 s C1,1e-13 t2 | qhull -QH6271 qhull precision error (qh_check_dupridge): wide merge (1758701813 times wider) due to duplicate ridge with nearly coincident points (9.7e-014) between f172830 and f172837, merge dist 0.00014, while processing p18865 -- Ignore error with option 'Q12' -- To be fixed in a later version of Qhull -ERRONEOUS FACET: -- f172830 - - flags: bottom new seen mergehorizon dupridge mergeridge2 - - normal: 0.02056 0.0117 -0.03234 -0.9992 - - offset: -0.01941977 - - vertices: p18865(v6808) p18864(v5629) p15729(v4497) p14473(v2222) - - neighboring facets: f141969 f172828 f141974 f172837 - - ridges: - - r1364 - vertices: p18864(v5629) p15729(v4497) p14473(v2222) - between f141969 and f172830 - - r1365 - vertices: p18865(v6808) p15729(v4497) p14473(v2222) - between f172830 and f172828 - - r1366 - vertices: p18865(v6808) p18864(v5629) p14473(v2222) - between f141974 and f172830 - - r1367 - vertices: p18865(v6808) p18864(v5629) p15729(v4497) - between f172830 and f172837 -ERRONEOUS OTHER FACET: -- f172837 - - flags: top new seen mergehorizon dupridge mergeridge1 - - normal: 0.02282 0.01247 -0.03249 -0.9991 - - offset: -0.02018688 - - vertices: p18865(v6808) p9733(v5729) p18864(v5629) p15729(v4497) - - neighboring facets: f144525 f144533 f172836 f172830 - - ridges: - - r1361 - vertices: p9733(v5729) p18864(v5629) p15729(v4497) - between f172837 and f144525 - - r1363 - vertices: p18865(v6808) p9733(v5729) p18864(v5629) - between f144533 and f172837 - - r1362 - vertices: p18865(v6808) p9733(v5729) p15729(v4497) - between f172837 and f172836 - - r1367 - vertices: p18865(v6808) p18864(v5629) p15729(v4497) - between f172830 and f172837 - -While executing: rbox L100 10000 D4 s C1,1e-13 t2 | qhull -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99361789 _pre-merge _zero-centrum _max-width 0.98 - Error-roundoff 1e-015 _one-merge 9e-015 _near-inside 4.5e-014 - Visible-distance 6e-015 U-coplanar-distance 6e-015 Width-outside 1.2e-014 - _wide-facet 3.6e-014 -Last point added to hull was p18865. Last merge was #277. -At error exit: +set +v +=== check nearly incident points Fri, Jul 24, 2020 10:27:41 PM +rbox L100 2000 D4 s C1,1e-13 t2 | qhull + +Convex hull of 4000 points in 4-d: + + Number of vertices: 2096 + Number of facets: 13614 + Number of non-simplicial facets: 52 + +Statistics for: rbox L100 2000 D4 s C1,1e-13 t2 | qhull + + Number of points processed: 2111 + Number of hyperplanes created: 51581 + Number of distance tests for qhull: 585497 + Number of distance tests for merging: 267217 + Number of distance tests for checking: 152193 + Number of merged facets: 129 + CPU seconds to compute hull (after input): 0.056 + Maximum distance of point above facet: 1.8e-14 (1.9x) + Maximum distance of vertex below facet: -8.9e-15 (0.9x) -Convex hull of 20000 points in 4-d: +rbox L100 2000 D4 s C1,1e-13 t2 | qhull Q12 - Number of vertices: 6760 - Number of coplanar points: 2817 - Number of facets: 44615 - Number of non-simplicial facets: 125 - -Statistics for: rbox L100 10000 D4 s C1,1e-13 t2 | qhull - - Number of points processed: 6808 - Number of hyperplanes created: 172682 - Number of distance tests for qhull: 2682241 - Number of distance tests for merging: 880748 - Number of distance tests for checking: 0 - Number of merged facets: 277 - Maximum distance of merged point above facet: 7.7e-014 (7.8x) - Maximum distance of merged vertex below facet: -9.7e-015 (1.0x) +Convex hull of 4000 points in 4-d: + Number of vertices: 2096 + Number of facets: 13614 + Number of non-simplicial facets: 52 -precision problems (corrected unless 'Q0' or an error) - 398 coplanar points during partitioning -rbox L100 10000 D4 s C1,1e-13 t2 | qhull Q12 +Statistics for: rbox L100 2000 D4 s C1,1e-13 t2 | qhull Q12 -Convex hull of 20000 points in 4-d: + Number of points processed: 2111 + Number of hyperplanes created: 51581 + Number of distance tests for qhull: 585497 + Number of distance tests for merging: 267217 + Number of distance tests for checking: 152193 + Number of merged facets: 129 + CPU seconds to compute hull (after input): 0.056 + Maximum distance of point above facet: 1.8e-14 (1.9x) + Maximum distance of vertex below facet: -8.9e-15 (0.9x) - Number of vertices: 10230 - Number of facets: 67919 - Number of non-simplicial facets: 158 - -Statistics for: rbox L100 10000 D4 s C1,1e-13 t2 | qhull Q12 - - Number of points processed: 10292 - Number of hyperplanes created: 262105 - Number of distance tests for qhull: 3482323 - Number of distance tests for merging: 1331208 - Number of distance tests for checking: 761542 - Number of merged facets: 366 - CPU seconds to compute hull (after input): 0.875 - Maximum distance of point above facet: 1.1e-013 (10.9x) - Maximum distance of vertex below facet: -2.3e-005 (2267021951.3x) - -QH6271 qhull precision error (qh_check_dupridge): wide merge (1758701813 times wider) due to duplicate ridge with nearly coincident points (9.7e-014) between f172830 and f172837, merge dist 0.00014, while processing p18865 -- Ignore error with option 'Q12' -- To be fixed in a later version of Qhull rbox 50 C1,1E-13 t1447644703 | qhull d -QH6271 qhull precision error (qh_check_dupridge): wide merge (1125070907263 times wider) due to duplicate ridge with nearly coincident points (6.5e-014) between f749 and f759, merge dist 0.015, while processing p54 -- Ignore error with option 'Q12' -- To be fixed in a later version of Qhull -- A simple workaround is to add a bounding box to the input sites +QH6271 qhull topology error (qh_check_dupridge): wide merge (1125070907263.1x wider) due to dupridge between f1143 and f1169 (vertex dist 6.5e-14), merge dist 0.015, while processing p54 +- Allow error with option 'Q12' +- Experimental option merge-pinched-vertices ('Q14') may avoid this error. It merges nearly adjacent vertices. +- A bounding box for the input sites may alleviate this error. ERRONEOUS FACET: -- f749 - - flags: bottom upperDelaunay new dupridge mergeridge2 flipped +- f1143 + - flags: bottom upperDelaunay newfacet dupridge mergeridge2 flipped - normal: 0.2935 0.3842 0.4668 0.7405 - offset: 0.05514914 - - vertices: p54(v54) p45(v48) p76(v38) p44(v19) - - neighboring facets: f435 f738 f759 f748 + - vertices: p54(v76) p45(v56) p76(v36) p44(v19) + - neighboring facets: f405 f1159 f1169 f1144 - ridges: - - r412 tested - vertices: p45(v48) p76(v38) p44(v19) - between f435 and f749 - - r556 - vertices: p54(v54) p76(v38) p44(v19) - between f749 and f738 - - r557 - vertices: p54(v54) p45(v48) p44(v19) - between f759 and f749 - - r558 - vertices: p54(v54) p45(v48) p76(v38) - between f749 and f748 + - r576 tested simplicialbot + vertices: p45(v56) p76(v36) p44(v19) + between f405 and f1143 + - r1072 simplicialtop simplicialbot + vertices: p54(v76) p76(v36) p44(v19) + between f1143 and f1159 + - r1073 simplicialbot + vertices: p54(v76) p45(v56) p44(v19) + between f1169 and f1143 + - r1074 simplicialtop simplicialbot + vertices: p54(v76) p45(v56) p76(v36) + between f1143 and f1144 ERRONEOUS OTHER FACET: -- f759 - - flags: bottom upperDelaunay new dupridge mergeridge1 flipped +- f1169 + - flags: bottom upperDelaunay newfacet dupridge mergeridge1 flipped - normal: -0.3214 0.1166 0.5495 0.7623 - offset: 0.114967 - - vertices: p54(v54) p45(v48) p44(v19) p92(v11) - - neighboring facets: f435 f738 f760 f749 + - vertices: p54(v76) p45(v56) p44(v19) p92(v11) + - neighboring facets: f405 f1159 f1170 f1143 - ridges: - - r418 tested - vertices: p45(v48) p44(v19) p92(v11) - between f435 and f759 - - r554 - vertices: p54(v54) p44(v19) p92(v11) - between f759 and f738 - - r555 - vertices: p54(v54) p45(v48) p92(v11) - between f760 and f759 - - r557 - vertices: p54(v54) p45(v48) p44(v19) - between f759 and f749 + - r561 tested simplicialbot + vertices: p45(v56) p44(v19) p92(v11) + between f405 and f1169 + - r1070 simplicialtop simplicialbot + vertices: p54(v76) p44(v19) p92(v11) + between f1169 and f1159 + - r1071 simplicialtop simplicialbot + vertices: p54(v76) p45(v56) p92(v11) + between f1170 and f1169 + - r1073 simplicialbot + vertices: p54(v76) p45(v56) p44(v19) + between f1169 and f1143 While executing: rbox 50 C1,1E-13 t1447644703 | qhull d -Options selected for Qhull 2015.2.r 2016/01/18: - run-id 99395403 delaunay _pre-merge _zero-centrum Pgood _max-width 0.94 - Error-roundoff 1e-015 _one-merge 9.2e-015 _near-inside 4.6e-014 - Visible-distance 6.1e-015 U-coplanar-distance 6.1e-015 - Width-outside 1.2e-014 _wide-facet 3.7e-014 -Last point added to hull was p54. Last merge was #126. +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 213949491 delaunay _pre-merge _zero-centrum Pgood _max-width 0.94 + Error-roundoff 1e-15 _one-merge 9.2e-15 _near-inside 4.6e-14 + Visible-distance 6.1e-15 U-max-coplanar 6.1e-15 Width-outside 1.2e-14 + _wide-facet 3.7e-14 _maxoutside 1.2e-14 +Last point added to hull was p54. Last merge was #247. At error exit: Delaunay triangulation by the convex hull of 100 points in 4-d: - Number of input sites: 54 - Total number of nearly incident points: 46 - Number of Delaunay regions: 0 - Number of non-simplicial Delaunay regions: 39 + Number of input sites: 76 + Number of nearly incident points: 1 + Number of Delaunay regions: 266 + Number of non-simplicial Delaunay regions: 73 Statistics for: rbox 50 C1,1E-13 t1447644703 | qhull d - Number of points processed: 54 - Number of hyperplanes created: 711 - Number of facets in hull: 234 - Number of distance tests for qhull: 3419 - Number of distance tests for merging: 6140 + Number of points processed: 76 + Number of hyperplanes created: 1087 + Number of facets in hull: 303 + Number of distance tests for qhull: 5296 + Number of distance tests for merging: 10632 Number of distance tests for checking: 0 - Number of merged facets: 126 - Maximum distance of merged point above facet: 8.9e-015 (0.9x) - Maximum distance of merged vertex below facet: -9e-015 (0.9x) + Number of merged facets: 249 + Maximum distance of point above facet: 1.3e-14 (1.3x) + Maximum distance of vertex below facet: -1.3e-14 (1.3x) + +precision problems (corrected unless 'Q0' or an error) + 4 flipped facets + 73 coplanar horizon facets for new vertices + 1 coplanar points during partitioning + 213 degenerate hyperplanes recomputed with gaussian elimination + 17 nearly singular or axis-parallel hyperplanes + 1 dupridges with multiple neighbors + +A wide merge error has occurred. Qhull has produced a wide facet due to facet merges and vertex merges. +This usually occurs when the input is nearly degenerate and substantial merging has occurred. +See http://www.qhull.org/html/qh-impre.htm#limit rbox 50 C1,1E-13 t1447644703 | qhull d Q12 +QH6271 qhull topology error (qh_check_dupridge): wide merge (1125070907263.1x wider) due to dupridge between f1143 and f1169 (vertex dist 6.5e-14), merge dist 0.015, while processing p54 +- Allow error with option 'Q12' +- Experimental option merge-pinched-vertices ('Q14') may avoid this error. It merges nearly adjacent vertices. +- A bounding box for the input sites may alleviate this error. Delaunay triangulation by the convex hull of 100 points in 4-d: Number of input sites: 99 Total number of nearly incident points: 1 - Number of Delaunay regions: 310 - Number of non-simplicial Delaunay regions: 136 + Number of Delaunay regions: 307 + Number of non-simplicial Delaunay regions: 133 Statistics for: rbox 50 C1,1E-13 t1447644703 | qhull d Q12 Number of points processed: 99 - Number of hyperplanes created: 1584 - Number of facets in hull: 348 - Number of distance tests for qhull: 8710 - Number of distance tests for merging: 17689 - Number of distance tests for checking: 7460 - Number of merged facets: 507 - CPU seconds to compute hull (after input): 0.015 - Maximum distance of point above facet: 3.2e-014 (3.1x) + Number of hyperplanes created: 1504 + Number of facets in hull: 345 + Number of distance tests for qhull: 7670 + Number of distance tests for merging: 18284 + Number of distance tests for checking: 7318 + Number of merged facets: 456 + CPU seconds to compute hull (after input): 0.003 + Maximum distance of point above facet: 1.3e-14 (1.3x) Maximum distance of vertex below facet: -0.0012 (119810840063.5x) -QH6271 qhull precision error (qh_check_dupridge): wide merge (1125070907263 times wider) due to duplicate ridge with nearly coincident points (6.5e-014) between f749 and f759, merge dist 0.015, while processing p54 -- Ignore error with option 'Q12' -- To be fixed in a later version of Qhull -- A simple workaround is to add a bounding box to the input sites -qhull - -qhull- compute convex hulls and related structures. Qhull 2015.2.r 2016/01/18 - input (stdin): dimension, n, point coordinates - comments start with a non-numeric character - halfspace: use dim+1 and put offsets after coefficients - -options (qh-quick.htm): - d - Delaunay triangulation by lifting points to a paraboloid - d Qu - furthest-site Delaunay triangulation (upper convex hull) - v - Voronoi diagram as the dual of the Delaunay triangulation - v Qu - furthest-site Voronoi diagram - H1,1 - Halfspace intersection about [1,1,0,...] via polar duality - Qt - triangulated output - QJ - joggled input instead of merged facets - Tv - verify result: structure, convexity, and point inclusion - . - concise list of all options - - - one-line description of each option - -V - version +rbox 50 C1,1E-13 t1447644703 | qhull d Q14 -Output options (subset): - s - summary of results (default) - i - vertices incident to each facet - n - normals with offsets - p - vertex coordinates (if 'Qc', includes coplanar points) - if 'v', Voronoi vertices - Fp - halfspace intersections - Fx - extreme points (convex hull vertices) - FA - compute total area and volume - o - OFF format (if 'v', outputs Voronoi regions) - G - Geomview output (2-d, 3-d and 4-d) - m - Mathematica output (2-d and 3-d) - QVn - print facets that include point n, -n if not - TO file- output results to file, may be enclosed in single quotes +Delaunay triangulation by the convex hull of 100 points in 4-d: -examples: - rbox D4 | qhull Tv rbox 1000 s | qhull Tv s FA - rbox 10 D2 | qhull d QJ s i TO result rbox 10 D2 | qhull v Qbb Qt p - rbox 10 D2 | qhull d Qu QJ m rbox 10 D2 | qhull v Qu QJ o - rbox c d D2 | qhull Qc s f Fx | more rbox c | qhull FV n | qhull H Fp - rbox d D12 | qhull QR0 FA rbox c D7 | qhull FA TF1000 - rbox y 1000 W0 | qhull rbox c | qhull n + Number of input sites: 99 + Total number of nearly incident points: 1 + Number of Delaunay regions: 312 + Number of non-simplicial Delaunay regions: 137 -qhull . +Statistics for: rbox 50 C1,1E-13 t1447644703 | qhull d Q14 -Qhull 2015.2.r 2016/01/18. -Except for 'F.' and 'PG', upper-case options take an argument. + Number of points processed: 99 + Number of hyperplanes created: 1487 + Number of facets in hull: 350 + Number of distance tests for qhull: 5360 + Number of distance tests for merging: 17768 + Number of distance tests for checking: 4953 + Number of merged facets: 513 + CPU seconds to compute hull (after input): 0.003 + Maximum distance of point above facet: 1.3e-14 (1.3x) + Maximum distance of vertex below facet: -1.4e-14 (1.4x) - delaunay voronoi Geomview Halfspace facet_dump - incidences mathematica normals OFF_format points - summary - Farea FArea-total Fcoplanars FCentrums Fd-cdd-in - FD-cdd-out FF-dump-xridge Finner FIDs Fmerges - Fneighbors FNeigh-vertex Fouter FOptions Fpoint-intersect - FPoint_near FQhull Fsummary FSize Ftriangles - Fvertices Fvoronoi FVertex-ave Fxtremes FMaple - - Gvertices Gpoints Gall_points Gno_planes Ginner - Gcentrums Ghyperplanes Gridges Gouter GDrop_dim - Gtransparent - - PArea-keep Pdrop d0:0D0 Pgood PFacet_area_keep - PGood_neighbors PMerge-keep Poutput_forced Pprecision_not - - QbBound 0:0.5 Qbk:0Bk:0_drop QbB-scale-box Qbb-scale-last Qcoplanar - Qfurthest Qgood_only QGood_point Qinterior Qmax_out - QJoggle Qrandom QRotate Qsearch_1st Qtriangulate - QupperDelaunay QVertex_good Qvneighbors Qxact_merge Qzinfinite - - Q0_no_premerge Q1_no_angle Q2_no_independ Q3_no_redundant Q4_no_old - Q5_no_check_out Q6_no_concave Q7_depth_first Q8_no_near_in Q9_pick_furthest - Q10_no_narrow Q11_trinormals Q12_no_wide_dup - - T4_trace Tannotate Tcheck_often Tstatistics Tverify - Tz_stdout TFacet_log TInput_file TPoint_trace TMerge_trace - TOutput_file TRerun TWide_trace TVertex_stop TCone_stop +set +v +======================================================= +=== Testing done. Print documentation +======================================================= - Angle_max Centrum_size Error_round Random_dist Visible_min - Ucoplanar_max Wide_outside qhull - -qhull- compute convex hulls and related structures. - http://www.qhull.org 2015.2.r 2016/01/18 +qhull -- compute convex hulls and related structures. + http://www.qhull.org 2020.2.r 2020/07/24 input (stdin): first lines: dimension and number of points (or vice-versa). @@ -11682,15 +14332,16 @@ options: d - Delaunay triangulation by lifting points to a paraboloid d Qu - furthest-site Delaunay triangulation (upper convex hull) - v - Voronoi diagram (dual of the Delaunay triangulation) - v Qu - furthest-site Voronoi diagram Hn,n,... - halfspace intersection about point [n,n,0,...] - Qt - triangulated output - QJ - joggled input instead of merged facets Qc - keep coplanar points with nearest facet Qi - keep interior points with nearest facet + QJ - joggled input instead of merged facets + Qt - triangulated output + v - Voronoi diagram (dual of the Delaunay triangulation) + v Qu - furthest-site Voronoi diagram Qhull control options: + Qa - allow input with fewer or more points than coordinates Qbk:n - scale coord k so that low bound is n QBk:n - scale coord k so that upper bound is n (QBk is 0.5) QbB - scale input to unit cube centered at the origin @@ -11698,21 +14349,24 @@ Qbk:0Bk:0 - remove k-th coordinate from input QJn - randomly joggle input in range [-n,n] QRn - random rotation (n=seed, n=0 time, n=-1 time/no rotate) - Qf - partition point to furthest outside facet - Qg - only build good facets (needs 'QGn', 'QVn', or 'PdD') - Qm - only process points that would increase max_outside - Qr - process random outside points instead of furthest ones Qs - search all points for the initial simplex Qu - for 'd' or 'v', compute upper hull without point at-infinity returns furthest-site Delaunay triangulation - Qv - test vertex neighbors for convexity + QVn - good facet if it includes point n, -n if not Qx - exact pre-merges (skips coplanar and angle-coplanar facets) Qz - add point-at-infinity to Delaunay triangulation + +Qhull extra options: + Qf - partition point to furthest outside facet + Qg - only build good facets (needs 'QGn', 'QVn', or 'PdD') QGn - good facet if visible from point n, -n for not visible - QVn - good facet if it includes point n, -n if not + Qm - only process points that would increase max_outside + Qr - process random outside points instead of furthest ones + Qv - test vertex neighbors for convexity + Qw - allow option warnings Q0 - turn off default premerge with 'C-0'/'Qx' - Q1 - sort merges by type instead of angle - Q2 - merge all non-convex at once instead of independent sets + Q1 - merge by mergetype/angle instead of mergetype/distance + Q2 - merge all coplanar facets instead of merging independent sets Q3 - do not merge redundant vertices Q4 - avoid old->new merges Q5 - do not correct outer planes at end of qhull @@ -11722,24 +14376,31 @@ Q9 - process furthest of furthest points Q10 - no special processing for narrow distributions Q11 - copy normals and recompute centrums for tricoplanar facets - Q12 - no error on wide merge due to duplicate ridge + Q12 - allow wide facets and wide dupridge + Q14 - merge pinched vertices that create a dupridge + Q15 - check for duplicate ridges with the same vertices + +T options: + TFn - report summary when n or more facets created + TI file - input file, may be enclosed in single quotes + TO file - output file, may be enclosed in single quotes + Ts - statistics + Tv - verify result: structure, convexity, and point inclusion + Tz - send all output to stdout -Topts- Trace options: +Trace options: T4 - trace at level n, 4=all, 5=mem/gauss, -1= events Ta - annotate output with message codes + TAn - stop qhull after adding n vertices + TCn - stop qhull after building cone for point n + TVn - stop qhull after adding point n, -n for before Tc - check frequently during execution - Ts - print statistics - Tv - verify result: structure, convexity, and point inclusion - Tz - send all output to stdout - TFn - report summary when n or more facets created - TI file - input data from file, no spaces or single quotes - TO file - output results to file, may be enclosed in single quotes + Tf - flush each qh_fprintf for debugging segfaults TPn - turn on tracing when point n added to hull + TP-1 turn on tracing after qh_buildhull and qh_postmerge TMn - turn on tracing at merge n TWn - trace merge facets when width > n - TRn - rerun qhull n times. Use with 'QJn' - TVn - stop qhull after adding point n, -n for before (see TCn) - TCn - stop qhull after building cone for point n (see TVn) + TRn - rerun qhull n times for statistics to adjust 'QJn' Precision options: Cn - radius of centrum (roundoff added). Merge facets if non-convex @@ -11756,8 +14417,8 @@ G - Geomview output (see below) i - vertices incident to each facet m - Mathematica output (2-d and 3-d) - o - OFF format (dim, points and facets; Voronoi regions) n - normals with offsets + o - OFF format (dim, points and facets; Voronoi regions) p - vertex coordinates or Voronoi vertices (coplanar points if 'Qc') s - summary (stderr) @@ -11794,25 +14455,25 @@ FV - average of vertices (a feasible point for 'H') Fx - extreme points (in order for 2-d) -Geomview options (2-d, 3-d, and 4-d; 2-d Voronoi) +Geomview output (2-d, 3-d, and 4-d; 2-d Voronoi) Ga - all points as dots Gp - coplanar points and vertices as radii Gv - vertices as spheres + Gc - centrums + GDn - drop dimension n in 3-d and 4-d output + Gh - hyperplane intersections Gi - inner planes only Gn - no planes Go - outer planes only - Gc - centrums - Gh - hyperplane intersections Gr - ridges - GDn - drop dimension n in 3-d and 4-d output Gt - for 3-d 'd', transparent outer ridges Print options: PAn - keep n largest facets by area Pdk:n - drop facet if normal[k] <= n (default 0.0) PDk:n - drop facet if normal[k] >= n - Pg - print good facets (needs 'QGn' or 'QVn') PFn - keep facets whose area is at least n + Pg - print good facets (needs 'QGn' or 'QVn') PG - print neighbors of good facets PMn - keep n facets with most merges Po - force output. If error, output neighborhood of facet @@ -11820,12 +14481,13 @@ . - list of all options - - one line descriptions of all options + -? - help with examples -V - version rbox --rbox- generate various point distributions. Default is random in cube. +rbox -- generate various point distributions. Default is random in cube. -args (any order, space separated): Version: 2016/01/18 +args (any order, space separated): Version: 2019/11/10 3000 number of random points in cube, lens, spiral, sphere or grid D3 dimension 3-d c add a unit cube to the output ('c G2.0' sets size) @@ -11835,7 +14497,7 @@ s generate cospherical points x generate random points in simplex, may use 'r' or 'Wn' y same as 'x', plus simplex - Cn,r,m add n nearly coincident points within radius r of m points + Cn,r,m add n nearly adjacent points within radius r of m points Pn,m,r add point [n,m,r] first, pads with 0, maybe repeated Ln lens distribution of radius n. Also 's', 'r', 'G', 'W'. @@ -11851,7 +14513,7 @@ On offset coordinates by n t use time as the random number seed(default is command line) tn use n as the random number seed - z print integer coordinates, default 'Bn' is 1e+006 + z print integer coordinates, default 'Bn' is 1e+06 cat html/qhull.txt html/rbox.txt @@ -11870,39 +14532,49 @@ halfspace: use dim plus one with offsets after coefficients options (qh-quick.htm): - d - Delaunay triangulation by lifting points to a paraboloid - v - Voronoi diagram via the Delaunay triangulation - H1,1 - Halfspace intersection about [1,1,0,...] - d Qu - Furthest-site Delaunay triangulation (upper convex hull) - v Qu - Furthest-site Voronoi diagram - QJ - Joggle the input to avoid precision problems - . - concise list of all options - - - one-line description of all options + d - Delaunay triangulation by lifting points to a paraboloid + d Qu - furthest-site Delaunay triangulation (upper convex hull) + v - Voronoi diagram as the dual of the Delaunay triangulation + v Qu - furthest-site Voronoi diagram + H1,1 - Halfspace intersection about [1,1,0,...] via polar duality + Qt - triangulated output + QJ - joggled input instead of merged facets + Tv - verify result: structure, convexity, and point inclusion + . - concise list of all options + - - one-line description of each option + -? - this message + -V - version Output options (subset): - FA - compute total area and volume - Fx - extreme points (convex hull vertices) - G - Geomview output (2-d, 3-d and 4-d) - Fp - halfspace intersection coordinates - m - Mathematica output (2-d and 3-d) - n - normals with offsets - o - OFF file format (if Voronoi, outputs regions) - TO file- output results to file, may be enclosed in single quotes - f - print all fields of all facets - s - summary of results (default) - Tv - verify result: structure, convexity, and point inclusion - p - vertex coordinates - i - vertices incident to each facet + s - summary of results (default) + i - vertices incident to each facet + n - normals with offsets + p - vertex coordinates (if 'Qc', includes coplanar points) + if 'v', Voronoi vertices + FA - report total area and volume + Fp - halfspace intersections + FS - total area and volume + Fx - extreme points (convex hull vertices) + G - Geomview output (2-d, 3-d and 4-d) + m - Mathematica output (2-d and 3-d) + o - OFF format (if 'v', outputs Voronoi regions) + QVn - print facets that include point n, -n if not + TI file - input file, may be enclosed in single quotes + TO file - output file, may be enclosed in single quotes + + examples: + rbox D4 | qhull Tv rbox 1000 s | qhull Tv s FA + rbox 10 D2 | qhull d QJ s i TO result rbox 10 D2 | qhull v Qbb Qt p + rbox 10 D2 | qhull d Qu QJ m rbox 10 D2 | qhull v Qu QJ o + rbox c d D2 | qhull Qc s f Fx | more rbox c | qhull FV n | qhull H Fp + rbox d D12 | qhull QR0 FA rbox c D7 | qhull FA TF1000 + rbox y 1000 W0 | qhull Qc rbox c | qhull n - example: - rbox 1000 s | qhull Tv s FA - - - html manual: index.htm + - html manual: html/index.htm - installation: README.txt - see also: COPYING.txt, REGISTER.txt, Changes.txt - WWW: - GIT: - - mirror: - news: - Geomview: - news group: @@ -11913,7 +14585,7 @@ -Geometry Center 2003/12/30 1 +Geometry Center 2019/05/03 1 @@ -11941,8 +14613,8 @@ - ACKNOWLEGEMENTS This man page briefly describes all Qhull options. Please - report any mismatches with Qhull's html manual (qh- - man.htm). + report any mismatches with Qhull's html manual + (html/index.htm). @@ -11979,7 +14651,7 @@ -Geometry Center 2003/12/30 2 +Geometry Center 2019/05/03 2 @@ -12033,19 +14705,19 @@ OPTIONS To get a list of the most important options, execute - 'qhull' by itself. To get a complete list of options, + 'qhull -?'. To get a complete list of options, execute 'qhull -'. To get a complete, concise list of options, execute 'qhull .'. Options can be in any order. Capitalized options take an argument (except 'PG' and 'F' options). Single letters are used for output formats and precision constants. The - other options are grouped into menus for other output for- - mats ('F'), Geomview output ('G'), printing ('P'), Qhull + other options are grouped into menus: output formats ('F'), + Geomview output ('G'), printing ('P'), Qhull control ('Q'), -Geometry Center 2003/12/30 3 +Geometry Center 2019/05/03 3 @@ -12054,7 +14726,7 @@ qhull(1) qhull(1) - control ('Q'), and tracing ('T'). + and tracing ('T'). Main options: @@ -12111,7 +14783,7 @@ -Geometry Center 2003/12/30 4 +Geometry Center 2019/05/03 4 @@ -12132,7 +14804,7 @@ Input/Output options: - f Print out all facets and all fields of each facet. + f Print all facets and all fields of each facet. G Output the hull in Geomview format. For imprecise hulls, Geomview displays the inner and outer hull. @@ -12157,7 +14829,11 @@ trum. Its index is greater than the indices of the input points. Each base corresponds to a simpli- cial ridge between two facets. To print the ver- - tices without triangulation, use option 'Fv'. + tices without triangulation, use option 'Fv'. To + print the centrum coordinates, use option 'Ft'. The + centrum indices for option 'i' are one more than + the centrum indices for option 'Ft'. + m Output the hull in Mathematica format. Qhull writes a Mathematica file for 2-d and 3-d convex @@ -12179,7 +14855,7 @@ -Geometry Center 2003/12/30 5 +Geometry Center 2019/05/03 5 @@ -12208,13 +14884,13 @@ dinates of each Voronoi vertex. s Print a summary to stderr. If no output options - are specified at all, a summary goes to stdout. + are specified, a summary goes to stdout. The summary lists the number of input points, the dimension, the number of vertices in the convex hull, the number of facets in the convex hull, the number of good facets (if 'Pg'), and statistics. - The last two statistics (if needed) measure the + The last two statistics (if needed) measure the maximum distance from a point or vertex to a facet. The number in parenthesis (e.g., 2.1x) is the ratio between the maximum distance and the worst-case @@ -12245,7 +14921,7 @@ -Geometry Center 2003/12/30 6 +Geometry Center 2019/05/03 6 @@ -12311,7 +14987,7 @@ -Geometry Center 2003/12/30 7 +Geometry Center 2019/05/03 7 @@ -12377,7 +15053,7 @@ -Geometry Center 2003/12/30 8 +Geometry Center 2019/05/03 8 @@ -12387,10 +15063,11 @@ last float is the offset. The hyperplane is ori- - ented toward verify that the hyperplanes are per- - pendicular bisectors. Use 'Fo' for unbounded - regions, and 'Fv' for the corresponding Voronoi - vertices. + ented toward 'QVn' (if defined), or the first input + site of the pair. Use 'Tv' to verify that the + hyperplanes are perpendicular bisectors. Use + 'Fo' for unbounded regions, and 'Fv' for the + corresponding Voronoi vertices. FI Print facet identifiers. @@ -12432,10 +15109,11 @@ adjacent input sites, the next d floats are the normalized coefficients for the hyperplane, and the last float is the offset. The hyperplane is ori- - ented toward verify that the hyperplanes are per- - pendicular bisectors. Use 'Fi' for bounded - regions, and 'Fv' for the corresponding Voronoi - vertices. + ented toward 'QVn' (if defined), or the first input + site of the pair. Use 'Tv' to verify that the + hyperplanes are perpendicular bisectors. Use + 'Fi' for bounded regions, and 'Fv' for the + corresponding Voronoi vertices. FO List all options to stderr, including the default values. Additional 'FO's are printed to stdout. @@ -12445,7 +15123,7 @@ -Geometry Center 2003/12/30 9 +Geometry Center 2019/05/03 9 @@ -12509,7 +15187,7 @@ -Geometry Center 2003/12/30 10 +Geometry Center 2019/05/03 10 @@ -12575,7 +15253,7 @@ -Geometry Center 2003/12/30 11 +Geometry Center 2019/05/03 11 @@ -12641,7 +15319,7 @@ -Geometry Center 2003/12/30 12 +Geometry Center 2019/05/03 12 @@ -12654,8 +15332,8 @@ visible from a point (the 'QGn' option) or includes a point (the 'QVn' option). It also meets the requirements of 'Pdk' and 'PDk' options. Option - 'Pg' is automatically set for options 'PAn' and - 'PFn'. + 'Pg' is automatically set for options 'd', 'PAn', + 'PFn', and 'PMn' PG Print neighbors of good facets. @@ -12677,6 +15355,8 @@ Qhull control options + Qa Allow input with fewer or more points than coordinates + Qbk:0Bk:0 Drop dimension k from the input points. This allows the user to take convex hulls of sub-dimen- @@ -12705,7 +15385,7 @@ -Geometry Center 2003/12/30 13 +Geometry Center 2019/05/03 13 @@ -12772,7 +15452,7 @@ -Geometry Center 2003/12/30 14 +Geometry Center 2019/05/03 14 @@ -12797,6 +15477,9 @@ the first point added to the hull. Option 'QVn' may not be used with merging. + Qw Allow option warnings. Otherwise Qhull returns an + error after most option warnings. + Qx Perform exact merges while building the hull. The "exact" merges are merging a point into a coplanar facet (defined by 'Vn', 'Un', and 'C-n'), merging @@ -12823,8 +15506,8 @@ the convex hull. This may lead to precision errors. If so, a descriptive warning is generated. - Q1 With 'Q1', Qhull sorts merges by type (coplanar, - angle coplanar, concave) instead of by angle. + Q1 With 'Q1', Qhull merges by mergetype/angle instead + of mergetype/distance. Q2 With 'Q2', Qhull merges all facets at once instead of using independent sets of merges and then @@ -12842,7 +15525,7 @@ -Geometry Center 2003/12/30 15 +Geometry Center 2019/05/03 15 @@ -12871,9 +15554,12 @@ Q11 With 'Q11', Qhull copies normals and recomputes centrums for tricoplanar facets. - Q12 With 'Q12', Qhull does not report a very wide merge due - to a duplicated ridge with nearly coincident vertices + Q12 With 'Q12', Qhull allows wide facets and wide dupridge + + Q14 With 'Q14', Qhull merges pinched vertices that create a dupridge. + Q15 With 'Q15', Qhull checks for duplicate ridges with the same vertices. + Trace options Tn Trace at level n. Qhull includes full execution @@ -12887,6 +15573,8 @@ Ta Annotate output with codes that identify the corresponding qh_fprintf() statement. + TAn Stop Qhull after adding n vertices. + Tc Check frequently during execution. This will catch most inconsistency errors. @@ -12894,21 +15582,28 @@ for point n. The output for 'f' includes the cone and the old hull. See also 'TVn'. + Tf Flush output after each qh_fprintf. Use 'Tf' for + debugging segfaults. See 'Tz' for redirecting stderr. + TFn Report progress whenever more than n facets are created During post-merging, 'TFn' reports progress after more than n/2 merges. TI file Input data from 'file'. The filename may not include - spaces or quotes. + spaces or quotes. + + TMn Turn on tracing at n'th merge. TO file Output results to 'file'. The name may be enclosed in single quotes. TPn Turn on tracing when point n is added to the hull. - Trace partitions of point n. If used with TWn, turn off - tracing after adding point n to the hull. + Trace partitions of point n. If used with TWn, turn off + tracing after adding point n to the hull. + + TP-1 Turn on tracing after qh_buildhull and qh_postmerge. TRn Rerun qhull n times. Usually used with 'QJn' to determine the probability that a given joggle will @@ -12924,8 +15619,7 @@ Option 'Tv' does not check point inclusion if - -Geometry Center 2003/12/30 16 +Geometry Center 2019/05/03 16 @@ -12952,12 +15646,10 @@ Qhull before adding point n. Output shows the hull at this time. See also 'TCn' - TMn Turn on tracing at n'th merge. - TWn Trace merge facets when the width is greater than n. - Tz Redirect stderr to stdout. + Tz Redirect stderr to stdout. See 'Tf' for flushing writes. BUGS @@ -12991,7 +15683,7 @@ -Geometry Center 2003/12/30 17 +Geometry Center 2019/05/03 17 @@ -13051,7 +15743,7 @@ -Geometry Center 2003/12/30 18 +Geometry Center 2019/05/03 18 @@ -13069,51 +15761,7 @@ Qhull is available from http://www.qhull.org - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Geometry Center 2003/12/30 19 +Geometry Center 2019/05/03 19 @@ -13313,3 +15961,1051 @@ # end of q_test +eg/q_benchmark test 1 1 1 1 +eg/q_benchmark: Temporarily add "$PWD/bin" to $PATH for access to rbox + +============================================ +== eg/q_benchmark [test] [precision-count] [other-count] [pinched-count] [time-count] +== Time and precision benchmarks for qhull +============================================ + +[jun'20] Many timing figures 5-10% faster than jun'19 results. No change to code + +'q_benchmark test 1 1 1 1' Fri, Jul 24, 2020 10:27:42 PM + +# $Id: //main/2019/qhull/eg/q_benchmark#5 $$DateTime: 2020/06/05 16:33:18 $ +# $Id: //main/2019/qhull/eg/qtest.sh#4 $$DateTime: 2019/06/25 15:24:47 $ +qhull => qhull_r 8.0.1 (2020.2.r 2020/07/24) +-rwxr-xr-x 1 bbarber 197121 339968 Jul 24 21:06 /d/bash/local/qhull/bin/qhull +rbox => Version: 2019/11/10 +-rwxr-xr-x 1 bbarber 197121 32768 Jul 24 21:06 /d/bash/local/qhull/bin/rbox +MINGW64_NT-10.0-19041 kelwyn 3.0.7-338.x86_64 2019-04-30 21:52 UTC x86_64 Msys + +Logging to /d/bash/local/qhull/eg/qhull-benchmark.log and eg/qhull-benchmark-show.log + +======================== +=== test eg/qtest.sh === +======================== + +== qtest.sh help + +qtest.sh -- test qhull runs + qtest.sh N 'rbox c | qhull' -- N random qhull runs + qtest.sh N 'rbox-opts' 'qhull-opts' -- N random rbox|qhull runs + qtest.sh -N 'rbox c | qhull' -- N qhull runs + qtest.sh -N 'rbox opts' 'qhull opts' -- N rbox|qhull runs +execute rbox and qhull + qtest.sh run 'rbox c | qhull' -- execute 'qhull command' + qtest.sh run QR... 'rbox | qhull' -- execute 'qhull command QR...' + qtest.sh run t... 'rbox-opts' 'qhull-opts' -- execute 'rbox t... | qhull' +log execution of rbox and qhull + qtest.sh log 'rbox c | qhull' -- log qhull to qhull.log/qhull-step.log + qtest.sh QR... 'rbox c | qhull' -- log a qhull run + qtest.sh t... 'rbox-opts' 'qhull-opts' -- log a 'rbox|qhull' run + qtest.sh grep 'include-regexp' -- grep qhull.log for events to grep.log + qtest.sh grep 'include-regexp' 'exclude-regexp' + qtest.sh grep-merge logfile -- grep logfile for qh_mergefacet,etc. to stdout + qtest.sh grep-step logfile -- grep logfile for steps to stdout + qtest.sh -v ... -- verbose output with environment vars +variables defined in qtest.sh + QH_TEST_BASE -- first tNN for negative counts + QH_TEST_DEST -- qtest.sh log + QH_TEST_GREP -- grep expression for qtest.sh log + QH_SHOW_DEST -- qtest.sh show log + QH_SHOW_GREPX -- exclude grep for show log + QH_LOG_DEST -- qhull log + QH_LOG_GREP -- grep expression for qhull log + QH_STEP_DEST -- qhull step log + QH_STEP_GREP -- grep expression for step log and grep-step + QH_MERGE_GREP -- grep expression for grep-merge + QH_MERGE_GREPX -- exclude grep for grep-merge +environment variables + QHULL -- qhull program, may be qconvex, etc + QH_APPEND_DEST -- append qtest.sh log + QH_APPEND_SHOW -- append show log + QH_TEST -- additional grep expression for qtest.sh log + QH_TESTX -- exclude grep for qtest.sh log + QH_SHOW -- grep expression for show log + QH_SHOWX -- additional exclude grep for show log + QH_GREP -- additional grep expression for grep log + QH_GREPX -- additional exclude grep for grep log + Tnz -- Trace setting for 'qtest.sh log' +examples + qtest.sh help + qtest.sh 25 '1000 W1e-13 D4' '' + qtest.sh 25 '1000 W0 D4 C2,2e-13' 'Q14' + qtest.sh 25 '300 D4 C1,2e-13' 'd Q14' + qtest.sh -10 '10000 D4' '' + qtest.sh -10 '1000 s D4' '' + qtest.sh -10 'rbox 1000 s D4 | qhull' + qtest.sh run QR4 'rbox 1000 s D4 | qhull' + qtest.sh run t876333 '1000 s D4' '' + qtest.sh log 'rbox 500 s D4 | qhull' # qhull.log qhull-step.log + qtest.sh t876333 '500 s D4' '' + qtest.sh QR4 'rbox 500 s D4 | qhull' + qtest.sh grep 'qh_addpoint|qh_mark_dupridges' | head -20 # QH_GREP QH_GREPX + qtest.sh grep 'qh_addpoint' 'added| qh_addpoint' | head -20 + qtest.sh grep-merge qhull.log | head -20 + qtest.sh grep-step qhull.log >qhull-step.log + qtest.sh -v -10 '10000 D4' '' # verbose + +# $Id: //main/2019/qhull/eg/qtest.sh#4 $$DateTime: 2019/06/25 15:24:47 $ +== qtest.sh 1 '10' '' + +Testing -- rbox 10 t330528 | qhull >/d/bash/var/tmp/qtest-2020-07-24/qhull-330528.log +Test -- t330528 + CPU seconds to compute hull (after input): 0 +== qtest.sh 2 'rbox 10 | qhull' +Testing -- rbox 10 | qhull >/d/bash/var/tmp/qtest-2020-07-24/qhull-864005.log +Test -- QR864005 + CPU seconds to compute hull (after input): 0 +Test -- QR864006 + CPU seconds to compute hull (after input): 0 +== qtest.sh -3 '10' '' + +Testing -- rbox 10 t1 | qhull >/d/bash/var/tmp/qtest-2020-07-24/qhull-930959.log +Test -- t1 + CPU seconds to compute hull (after input): 0 +Test -- t2 + CPU seconds to compute hull (after input): 0 +Test -- t3 + CPU seconds to compute hull (after input): 0 +1595644068 Test 3 runs in 1 seconds (ave. 333 msec) -- rbox 10 t1 | qhull +== qtest.sh -3 'rbox 10 | qhull' +Testing -- rbox 10 | qhull >/d/bash/var/tmp/qtest-2020-07-24/qhull-464436.log +Test -- QR1 + CPU seconds to compute hull (after input): 0 +Test -- QR2 + CPU seconds to compute hull (after input): 0 +Test -- QR3 + CPU seconds to compute hull (after input): 0 +1595644069 Test 3 runs in 0 seconds (average 0 msec) -- rbox 10 | qhull +== qtest.sh run t123456 '10' 'Tz' + +Convex hull of 10 points in 3-d: + + Number of vertices: 8 + Number of facets: 12 + +Statistics for: rbox 10 t123456 | qhull Tz + + Number of points processed: 8 + Number of hyperplanes created: 20 + Number of distance tests for qhull: 53 + CPU seconds to compute hull (after input): 0 + +== qtest.sh run QR123456 'rbox 10 | qhull Tz' + +Convex hull of 10 points in 3-d: + + Number of vertices: 10 + Number of facets: 16 + +Statistics for: rbox 10 | qhull Tz QR123456 QR123456 + + Number of points processed: 10 + Number of hyperplanes created: 27 + Number of distance tests for qhull: 45 + CPU seconds to compute hull (after input): 0 + +== qtest.sh log 'rbox 10 | qhull' +qtest.sh: log 'rbox 10 | qhull T4z' to 'qhull.log' and 'qhull-step.log' + +==== EXTRA Fri, Jul 24, 2020 10:27:51 PM ==== + +1801:Convex hull of 10 points in 3-d: +1802: +1803: Number of vertices: 10 +1804: Number of facets: 16 +1805: +1806:Statistics for: rbox 10 | qhull T4z +1807: +1808: Number of points processed: 10 +1809: Number of hyperplanes created: 26 +1810: Number of distance tests for qhull: 43 +1811: CPU seconds to compute hull (after input): 0.002 + +qhull.log +qtest.sh: log 'rbox 10 | qhull T4z' to 'qhull.log' and 'qhull-step.log' +kelwyn Fri, Jul 24, 2020 10:27:50 PM +/d/bash/local/qhull +-rwxr-xr-x 1 bbarber 197121 339968 Jul 24 21:06 /d/bash/local/qhull/bin/qhull +qhull_r 8.0.1 (2020.2.r 2020/07/24) +1:qh_initflags: option flags initialized +2:[QH1008]qh_readpoints: read in 10 3-dimensional points +3:[QH0013]qh_initqhull_globals: for rbox 10 | qhull T4z +4:[QH2005]qh_initqhull_globals: initialize globals. input_dim 3, numpoints 10, malloc? 1, projected 0 to hull_dim 3 +5:[QH3024]qh_initqhull_outputflags: qhull T4z +== qtest.sh t123456 '10' '' +qtest.sh: logging 'rbox 10 t123456 | qhull T4sz ' to 'qhull.log' and 'qhull-step.log' + +==== EXTRA Fri, Jul 24, 2020 10:27:52 PM ==== + +1320:Convex hull of 10 points in 3-d: +1321: +1322: Number of vertices: 8 +1323: Number of facets: 12 +1324: +1325:Statistics for: rbox 10 t123456 | qhull T4z +1326: +1327: Number of points processed: 8 +1328: Number of hyperplanes created: 20 +1329: Number of distance tests for qhull: 53 +1330: CPU seconds to compute hull (after input): 0.003 + +qhull.log +qtest.sh: logging 'rbox 10 t123456 | qhull T4sz ' to 'qhull.log' and 'qhull-step.log' +Fri, Jul 24, 2020 10:27:51 PM +/d/bash/local/qhull +-rwxr-xr-x 1 bbarber 197121 339968 Jul 24 21:06 /d/bash/local/qhull/bin/qhull +qhull_r 8.0.1 (2020.2.r 2020/07/24) +1:qh_initflags: option flags initialized +2:[QH1008]qh_readpoints: read in 10 3-dimensional points +3:[QH0013]qh_initqhull_globals: for rbox 10 t123456 | qhull T4z +4:[QH2005]qh_initqhull_globals: initialize globals. input_dim 3, numpoints 10, malloc? 1, projected 0 to hull_dim 3 +5:[QH3024]qh_initqhull_outputflags: qhull T4z +== qtest.sh QR123456 'rbox 10 | qhull' +qtest.sh: log 'rbox 10 | qhull T4z QR123456' to 'qhull.log' and 'qhull-step.log' + +==== EXTRA Fri, Jul 24, 2020 10:27:53 PM ==== + +1850:Convex hull of 10 points in 3-d: +1851: +1852: Number of vertices: 10 +1853: Number of facets: 16 +1854: +1855:Statistics for: rbox 10 | qhull T4z QR123456 QR123456 +1856: +1857: Number of points processed: 10 +1858: Number of hyperplanes created: 27 +1859: Number of distance tests for qhull: 45 +1860: CPU seconds to compute hull (after input): 0.004 + +qhull-step.log +qtest.sh: log 'rbox 10 | qhull T4z QR123456' to 'qhull.log' and 'qhull-step.log' +2:[QH1008]qh_readpoints: read in 10 3-dimensional points +3:[QH0013]qh_initqhull_globals: for rbox 10 | qhull T4z QR123456 +4:[QH2005]qh_initqhull_globals: initialize globals. input_dim 3, numpoints 10, malloc? 1, projected 0 to hull_dim 3 +5:[QH3024]qh_initqhull_outputflags: qhull T4z QR123456 +7:[QH3078]qh_memsize: quick memory of 32 bytes +8:[QH3078]qh_memsize: quick memory of 24 bytes +9:[QH3078]qh_memsize: quick memory of 48 bytes +10:[QH3078]qh_memsize: quick memory of 88 bytes +11:[QH3078]qh_memsize: quick memory of 16 bytes +== qtest.sh grep 'qh_addpoint|QH1' >qhull-grep.log +qtest.sh: grep from 'qhull.log' to stdout +2:[QH1008]qh_readpoints: read in 10 3-dimensional points +32:[QH1002]qh_maxsimplex: selected point p9 for 3`th initial vertex, det=0.3388, targetdet=0.6029, mindet=0.006029 +36:[QH1002]qh_maxsimplex: selected point p7 for 4`th initial vertex, det=0.253, targetdet=0.3628, mindet=0.003628 +53:[QH1028]qh_createsimplex: created simplex +93:[QH1027]qh_checkpolygon: check all facets from f1, qh.NEWtentative? 0 +99:[QH1064]qh_checkconvex: check that facets are not-flipped and for qh.ZEROcentrum that simplicial vertices are below their neighbor (dist<0.0) +113:[QH1042]qh_partitionall: partition all points into outside sets +177:[QH1029]qh_furthestnext: made f1 next facet(dist 0.53) +178:[QH1030]qh_initbuild: initial hull created and points partitioned +qhull-grep.log +1706: qh.visible_list f24, newfacet_list f24, facet_next f14 for qh_addpoint +1742:[QH1027]qh_checkpolygon: check all facets from f5, qh.NEWtentative? 0 +1761:[QH2056]qh_addpoint: added p4 to convex hull with point balance 0 +1762:[QH1039]qh_buildhull: completed the hull construction +1764:[QH1036]Qhull: algorithm completed +1765:[QH1027]qh_checkpolygon: check all facets from f5, qh.NEWtentative? 0 +1799:[QH1064]qh_checkconvex: check that facets are not-flipped and for qh.ZEROcentrum that simplicial vertices are below their neighbor (dist<0.0) +1863:[QH1006]qh_freeqhull: free global memory +1864:[QH1005]qh_freebuild: free memory from qh_inithull and qh_buildhull +1865:[QH1061]qh_freeqhull: clear qhT except for qh.qhmem and qh.qhstat +== qtest.sh grep 'qh_addpoint' 'added| qh_addpoint' >qhull-grep.log +qtest.sh: grep from 'qhull.log' to stdout +182:[QH1049]qh_addpoint: add p1(v5) 0.53 above f1 to hull of 4 facets, 0 merges, 6 outside at 0.001 CPU secs. Previous p-1(v4) delta 0.001 CPU, 4 facets, 0 merges, 4 hyperplanes, 44 distplanes, 0 retries +453:[QH1049]qh_addpoint: add p3(v6) 0.18 above f3 to hull of 6 facets, 0 merges, 5 outside at 0.001 CPU secs. Previous p1(v5) delta 0 CPU, 2 facets, 0 merges, 4 hyperplanes, 32 distplanes, 0 retries +734:[QH1049]qh_addpoint: add p5(v7) 0.15 above f6 to hull of 8 facets, 0 merges, 4 outside at 0.002 CPU secs. Previous p3(v6) delta 0.001 CPU, 2 facets, 0 merges, 4 hyperplanes, 33 distplanes, 0 retries +954:[QH1049]qh_addpoint: add p2(v8) 0.24 above f8 to hull of 10 facets, 0 merges, 3 outside at 0.002 CPU secs. Previous p5(v7) delta 0 CPU, 2 facets, 0 merges, 3 hyperplanes, 24 distplanes, 0 retries +1223:[QH1049]qh_addpoint: add p8(v9) 0.18 above f12 to hull of 12 facets, 0 merges, 2 outside at 0.003 CPU secs. Previous p2(v8) delta 0.001 CPU, 2 facets, 0 merges, 4 hyperplanes, 30 distplanes, 0 retries +1494:[QH1049]qh_addpoint: add p4(v10) 0.073 above f13 to hull of 14 facets, 0 merges, 1 outside at 0.003 CPU secs. Previous p8(v9) delta 0 CPU, 2 facets, 0 merges, 4 hyperplanes, 30 distplanes, 0 retries +qhull-grep.log +qtest.sh: grep from 'qhull.log' to stdout +182:[QH1049]qh_addpoint: add p1(v5) 0.53 above f1 to hull of 4 facets, 0 merges, 6 outside at 0.001 CPU secs. Previous p-1(v4) delta 0.001 CPU, 4 facets, 0 merges, 4 hyperplanes, 44 distplanes, 0 retries +453:[QH1049]qh_addpoint: add p3(v6) 0.18 above f3 to hull of 6 facets, 0 merges, 5 outside at 0.001 CPU secs. Previous p1(v5) delta 0 CPU, 2 facets, 0 merges, 4 hyperplanes, 32 distplanes, 0 retries +734:[QH1049]qh_addpoint: add p5(v7) 0.15 above f6 to hull of 8 facets, 0 merges, 4 outside at 0.002 CPU secs. Previous p3(v6) delta 0.001 CPU, 2 facets, 0 merges, 4 hyperplanes, 33 distplanes, 0 retries +954:[QH1049]qh_addpoint: add p2(v8) 0.24 above f8 to hull of 10 facets, 0 merges, 3 outside at 0.002 CPU secs. Previous p5(v7) delta 0 CPU, 2 facets, 0 merges, 3 hyperplanes, 24 distplanes, 0 retries +1223:[QH1049]qh_addpoint: add p8(v9) 0.18 above f12 to hull of 12 facets, 0 merges, 2 outside at 0.003 CPU secs. Previous p2(v8) delta 0.001 CPU, 2 facets, 0 merges, 4 hyperplanes, 30 distplanes, 0 retries +1494:[QH1049]qh_addpoint: add p4(v10) 0.073 above f13 to hull of 14 facets, 0 merges, 1 outside at 0.003 CPU secs. Previous p8(v9) delta 0 CPU, 2 facets, 0 merges, 4 hyperplanes, 30 distplanes, 0 retries +== qtest.sh grep-merge 'qhull.log' >qhull-grep.log +qtest.sh: grep merges from 'qhull.log' to stdout +qtest.sh: log 'rbox 10 | qhull T4z QR123456' to 'qhull.log' and 'qhull-step.log' +182:[QH1049]qh_addpoint: add p1(v5) 0.53 above f1 to hull of 4 facets, 0 merges, 6 outside at 0.001 CPU secs. Previous p-1(v4) delta 0.001 CPU, 4 facets, 0 merges, 4 hyperplanes, 44 distplanes, 0 retries +183:[QH1040]qh_findhorizon: find horizon for point +450:[QH2056]qh_addpoint: added p1 to convex hull with point balance 0 +453:[QH1049]qh_addpoint: add p3(v6) 0.18 above f3 to hull of 6 facets, 0 merges, 5 outside at 0.001 CPU secs. Previous p1(v5) delta 0 CPU, 2 facets, 0 merges, 4 hyperplanes, 32 distplanes, 0 retries +454:[QH1040]qh_findhorizon: find horizon for point +731:[QH2056]qh_addpoint: added p3 to convex hull with point balance -1 +734:[QH1049]qh_addpoint: add p5(v7) 0.15 above f6 to hull of 8 facets, 0 merges, 4 outside at 0.002 CPU secs. Previous p3(v6) delta 0.001 CPU, 2 facets, 0 merges, 4 hyperplanes, 33 distplanes, 0 retries +735:[QH1040]qh_findhorizon: find horizon for point +951:[QH2056]qh_addpoint: added p5 to convex hull with point balance -0.29 +qhull-grep.log +954:[QH1049]qh_addpoint: add p2(v8) 0.24 above f8 to hull of 10 facets, 0 merges, 3 outside at 0.002 CPU secs. Previous p5(v7) delta 0 CPU, 2 facets, 0 merges, 3 hyperplanes, 24 distplanes, 0 retries +955:[QH1040]qh_findhorizon: find horizon for point +1220:[QH2056]qh_addpoint: added p2 to convex hull with point balance -0.75 +1223:[QH1049]qh_addpoint: add p8(v9) 0.18 above f12 to hull of 12 facets, 0 merges, 2 outside at 0.003 CPU secs. Previous p2(v8) delta 0.001 CPU, 2 facets, 0 merges, 4 hyperplanes, 30 distplanes, 0 retries +1224:[QH1040]qh_findhorizon: find horizon for point +1491:[QH2056]qh_addpoint: added p8 to convex hull with point balance -0.33 +1494:[QH1049]qh_addpoint: add p4(v10) 0.073 above f13 to hull of 14 facets, 0 merges, 1 outside at 0.003 CPU secs. Previous p8(v9) delta 0 CPU, 2 facets, 0 merges, 4 hyperplanes, 30 distplanes, 0 retries +1495:[QH1040]qh_findhorizon: find horizon for point +1761:[QH2056]qh_addpoint: added p4 to convex hull with point balance 0 +1861:qh_maxouter: max distance from facet to outer plane is 1.571e-15, qh.max_outside is 9.714e-17 +== qtest.sh grep-step 'qhull.log' >qhull-step.log +qtest.sh: grep step log from 'qhull.log' to stdout +2:[QH1008]qh_readpoints: read in 10 3-dimensional points +3:[QH0013]qh_initqhull_globals: for rbox 10 | qhull T4z QR123456 +4:[QH2005]qh_initqhull_globals: initialize globals. input_dim 3, numpoints 10, malloc? 1, projected 0 to hull_dim 3 +5:[QH3024]qh_initqhull_outputflags: qhull T4z QR123456 +7:[QH3078]qh_memsize: quick memory of 32 bytes +8:[QH3078]qh_memsize: quick memory of 24 bytes +9:[QH3078]qh_memsize: quick memory of 48 bytes +10:[QH3078]qh_memsize: quick memory of 88 bytes +11:[QH3078]qh_memsize: quick memory of 16 bytes +12:[QH3078]qh_memsize: quick memory of 24 bytes +qhull-step.log +1851: +1852: Number of vertices: 10 +1853: Number of facets: 16 +1854: +1855:Statistics for: rbox 10 | qhull T4z QR123456 QR123456 +1856: +1857: Number of points processed: 10 +1858: Number of hyperplanes created: 27 +1859: Number of distance tests for qhull: 45 +1860: CPU seconds to compute hull (after input): 0.004 +== qtest.sh -v -3 'rbox 10 | qhull' +Testing -- rbox 10 | qhull >/d/bash/var/tmp/qtest-2020-07-24/qhull-198775.log +qtest.sh: rbox 10 | qhull QR1 Tsz | grep -E 'QH[67]| Statis|[0-9][0-9][.][0-9]x|CPU|FIXUP|retries, input joggled|initial hull is narrow' | grep -Ev 'keep 239874664' | tee -a '/d/bash/var/tmp/qtest-2020-07-24/qhull-198775.log' | grep -E '.' | grep -Ev 'QH7[0-9][^8]|Stati' | tee -a '/d/bash/var/tmp/qtest-2020-07-24/qhull-198775-show.log' + QH_TEST_DEST='/d/bash/var/tmp/qtest-2020-07-24/qhull-198775.log' + QH_SHOW_DEST='/d/bash/var/tmp/qtest-2020-07-24/qhull-198775-show.log' + QH_TEST_GREP='QH[67]| Statis|[0-9][0-9][.][0-9]x|CPU|FIXUP|retries, input joggled|initial hull is narrow' + QH_SHOW_GREPX='QH7[0-9][^8]|Stati' + QH_TEST='' + QH_TESTX='' + QH_SHOW='' + QH_SHOWX='' +Test -- QR1 + CPU seconds to compute hull (after input): 0 +Test -- QR2 + CPU seconds to compute hull (after input): 0 +Test -- QR3 + CPU seconds to compute hull (after input): 0 +1595644076 Test 3 runs in 0 seconds (average 0 msec) -- rbox 10 | qhull + +============================ +=== test qtest.sh errors === +============================ +== qtest.sh run -3 'rbox 10 | qhull' +QH7094 qhull option warning: unknown option 'r'(72) +QH7036 qhull option warning: missing space after option 'r'(72), reserved for sub-options, ignoring 'r' options to next space +QH7094 qhull option warning: unknown option '1'(31) +QH7036 qhull option warning: missing space after option '1'(31), reserved for sub-options, ignoring '1' options to next space +QH7094 qhull option warning: unknown option '|'(7c) +QH7094 qhull option warning: unknown option 'q'(71) +QH7036 qhull option warning: missing space after option 'q'(71), reserved for sub-options, ignoring 'q' options to next space +QH6035 qhull option error: see previous warnings, use 'Qw' to override: 'qhull rbox 10 | qhull' (last offset 16) + +While executing: | qhull rbox 10 | qhull +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 214218403 _maxoutside 0 +== qtest.sh run 3 '10' '' +qtest.sh: Expecting 'run' followed by 'tNNN rbox-args qhull-args'. See 'qtest.sh help' +== qtest.sh run '10' '' + +Convex hull of 10 points in 3-d: + + Number of vertices: 10 + Number of facets: 16 + +Statistics for: rbox 10 | qhull + + Number of points processed: 10 + Number of hyperplanes created: 26 + Number of distance tests for qhull: 43 + CPU seconds to compute hull (after input): 0 + +== qtest.sh run +qtest.sh: Expecting 'run' followed by 1 to 3 arguments. Got total of 1 arguments. See 'qtest.sh help' +== qtest.sh 3 '10' d T4 +qtest.sh: Expecting 1 to 3 arguments. Got 4 arguments. See 'qtest.sh help' +== qtest.sh 3 '10' 'd H' + +Testing -- rbox 10 t332683 | qhull d H >/d/bash/var/tmp/qtest-2020-07-24/qhull-332683.log +QH6037 qhull option error (qh_readpoints): can not use Delaunay('d') or Voronoi('v') with halfspace intersection('H') + +While executing: rbox 20 + | qhull d H TA1 +Options selected for Qhull 2020.2.r 2020/07/24: + run-id 214252017 delaunay Halfspace TA-stop-add 1 _maxoutside 0 + +qtest.sh error: 'rbox 20 | qhull d H TA1' failed +== qtest.sh 3 +qtest.sh: Expecting run count followed by rbox and qhull options. Only run count provided (3). +== qtest.sh grep +qtest.sh: Expecting 'grep' followed by include and exclude regexps or $QH_GREP or $QH_GREPX. None defined. +== qtest.sh grep-merge '10' 'v' +qtest.sh: Expecting 'grep-merge' followed by log file. Got 'grep-merge 10 v ...' +== qtest.sh grep-merge +qtest.sh: Expecting 'grep-merge' followed by log file. Got 'grep-merge ...' +== qtest.sh grep-merge not-a-file +qtest.sh: Expecting 'grep-merge' followed by log file. Got 'grep-merge not-a-file ...' +== qtest.sh grep-step '10' 'v' +qtest.sh: Expecting 'grep-step' followed by log file. Got 'grep-step 10 v ...' +== qtest.sh grep-step +qtest.sh: Expecting 'grep-step' followed by log file. Got 'grep-step ...' +== qtest.sh grep-step not-a-file +qtest.sh: Expecting 'grep-step' followed by log file. Got 'grep-step not-a-file ...' +== qtest.sh log '10' 'd' +qtest.sh: Expecting 'log' followed by a qhull command line in quotes. Got 3 arguments +== qtest.sh t34 +qtest.sh: Expecting txxxxxx followed by rbox and qhull options. Got tag 't34' only +== qtest.sh t34 'rbox 10 | qhull' +qtest.sh: Expecting txxxxxx followed by rbox and qhull options. Tag 't34' was followed by a qhull command -- rbox 10 | qhull +== qtest.sh QR34 +qtest.sh: Expecting QRxxxxxx followed by a qhull command. Got tag 'QR34' only +== qtest.sh QR34 '10' 'v' +qtest.sh: Expecting QRxxxxxx followed by a qhull command. Got rbox options '10' and qhull options 'v' +== qtest.sh t34 '10 ZERROR' 'v' +qtest.sh: logging 'rbox 10 ZERROR t34 | qhull T4sz v' to 'qhull.log' and 'qhull-step.log' +QH6353 rbox error: missing space between flags at ERROR t34 1000. + +qtest.sh error: 'rbox 10 ZERROR t34' failed +== Delete temporary log files ghull.log, qhull-grep.log, and qhull-step.log + +============================== +=== N_PRECISION test cases === +============================== +== difficult cases for qhull Fri, Jul 24, 2020 10:28:05 PM + +==================== +== Convex hull of fuzzy cube (large flat facets) +==================== + +Testing -- rbox 1000000 W1e-13 D2 t67022 | qhull Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-67022.log +Test -- t67022 + CPU seconds to compute hull (after input): 0.261 + +Testing -- rbox 500000 W1e-13 D3 t200930 | qhull Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-200930.log +Test -- t200930 + CPU seconds to compute hull (after input): 0.659 + +Testing -- rbox 10000 W1e-13 D4 t935269 | qhull Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-935269.log +Test -- t935269 + CPU seconds to compute hull (after input): 0.104 + +Testing -- rbox 2000 W1e-13 D5 t2223 | qhull Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-2223.log +Test -- t2223 + CPU seconds to compute hull (after input): 0.584 + +Testing -- rbox 1000 W1e-13 D6 t69177 | qhull Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-69177.log +Test -- t69177 + CPU seconds to compute hull (after input): 2.013 + +==================== +== narrow lense +==================== + +Testing -- rbox 1000000 L100000 s G1e-6 D2 t203085 | qhull Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-203085.log +Test -- t203085 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.188 + +Testing -- rbox 10000 L100000 s G1e-6 D3 t336993 | qhull Q12 Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-336993.log +Test -- t336993 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.689 + +Testing -- rbox 5000 L100000 s G1e-6 D4 t937424 | qhull Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-937424.log +Test -- t937424 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.599 + +Testing -- rbox 1000 L100000 s G1e-6 D5 t537855 | qhull Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-537855.log +Test -- t537855 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.216 + +Testing -- rbox 400 L100000 s G1e-6 D6 t604809 | qhull Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-604809.log +Test -- t604809 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.494 + +==================== +== cone +==================== + +Testing -- rbox 100000 s Z1 G1e-13 D2 t671763 | qhull Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-671763.log +Test -- t671763 + CPU seconds to compute hull (after input): 0.02 + +Testing -- rbox 10000 s Z1 G1e-13 D3 t205240 | qhull Q12 Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-205240.log +Test -- t205240 + CPU seconds to compute hull (after input): 0.603 + +Testing -- rbox 2000 s Z1 G1e-13 D4 t339148 | qhull Q12 Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-339148.log +Test -- t339148 + CPU seconds to compute hull (after input): 3.031 + +Testing -- rbox 1000 s Z1 G1e-13 D5 t473056 | qhull Q12 Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-473056.log +Test -- t473056 + CPU seconds to compute hull (after input): 0.599 + +Testing -- rbox 400 s Z1 G1e-13 D6 t540010 | qhull Q12 Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-540010.log +Test -- t540010 +QH6271 qhull topology error (qh_check_dupridge): wide merge (1662534044043.3x wider) due to dupridge between f3740 and f124 (vertex dist 0.11), merge dist 0.48, while processing p68 +QH6227 qhull topology error: Only 7 facets remain. The input is too degenerate or the convexity constraints are too strong. + Maximum distance of point above facet: 0.26 (10708130307576.8x) + Maximum distance of vertex below facet: -0.54 (22117535651526.7x) + +========================== +=== N_OTHER test cases === +========================== + +==================== +== Delaunay triangulation of fuzzy circle (large, narrow disk) +== No Qbb, highly degenerate due to narrow disk of two cospherical sets of points +==================== + +Testing -- rbox 10000 s W1e-13 D2 t606964 | qhull d Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-606964.log +Test -- t606964 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.527 + Maximum distance of point above facet: 1.1e-12 (191.6x) + +Testing -- rbox 2000 s W1e-13 D3 t207395 | qhull d Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-207395.log +Test -- t207395 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f8586 into f5812 for mergetype 6 (flip). maxdist 0 (0.0x) mindist -1.8e-12 (178.9x) vertexdist 0.054 Allow with 'Q12' (allow-wide) + Maximum distance of point above facet: 3.2e-13 (31.3x) + Maximum distance of vertex below facet: -1.3e-13 (12.7x) + +Testing -- rbox 1000 s W1e-13 D4 t274349 | qhull d Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-274349.log +Test -- t274349 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7086 Qhull precision warning: repartition coplanar point p819 from f106 as an outside point above hidden facet f64145 dist 7e-12 nearest vertices 0.11 + CPU seconds to compute hull (after input): 0.994 + Maximum distance of point above facet: 1.9e-12 (114.1x) + +Testing -- rbox 200 s W1e-13 D5 t341303 | qhull d Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-341303.log +Test -- t341303 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.304 + Maximum distance of point above facet: 2.8e-13 (12.0x) + +Testing -- rbox 100 s W1e-13 D6 t408257 | qhull d Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-408257.log +Test -- t408257 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6227 qhull topology error: Only 8 facets remain. The input is too degenerate or the convexity constraints are too strong. + +=========================================================== +=== N_PINCHED test cases for Q14-merge-pinched-vertices === +=========================================================== + +==================== +== Convex hull of fuzzy cube with point pairs (large flat facets) +==================== + +Testing -- rbox 1000000 W1e-13 C1,2e-13 D2 t475211 | qhull Q14 Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-475211.log +Test -- t475211 + CPU seconds to compute hull (after input): 0.355 + +Testing -- rbox 500000 W1e-13 C1,2e-13 D3 t209550 | qhull Q14 Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-209550.log +Test -- t209550 + CPU seconds to compute hull (after input): 0.645 + +Testing -- rbox 20000 W1e-13 C1,2e-13 D4 t745182 | qhull Q14 Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-745182.log +Test -- t745182 + CPU seconds to compute hull (after input): 0.205 + +Testing -- rbox 2000 W1e-13 C1,2e-13 D5 t879090 | qhull Q14 Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-879090.log +Test -- t879090 +QH6271 qhull topology error (qh_check_dupridge): wide merge (114884573208.0x wider) due to dupridge between f95160 and f95159 (vertex dist 2.4e-13), merge dist 0.008, while processing p2645 + +Testing -- rbox 500 W1e-13 C1,2e-13 D6 t946044 | qhull Q14 Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-946044.log +Test -- t946044 +QH6347 qhull precision error (qh_mergefacet): wide merge for facet f253245 into f252997 for mergetype 7 (dupridge). maxdist 0 (0.0x) mindist -5.7e-12 (231.7x) vertexdist 0.44 Allow with 'Q12' (allow-wide) + Maximum distance of point above facet: 3.3e-13 (13.4x) + +==================== +== Convex hull of cube with point pairs (large flat facets) +==================== + +Testing -- rbox 1000000 W0 C1,2e-13 D2 t12998 | qhull Q14 Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-12998.log +Test -- t12998 + CPU seconds to compute hull (after input): 0.345 + +Testing -- rbox 100000 W0 C1,2e-13 D3 t747337 | qhull Q14 Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-747337.log +Test -- t747337 + CPU seconds to compute hull (after input): 0.092 + +Testing -- rbox 5000 W0 C1,2e-13 D4 t347768 | qhull Q14 Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-347768.log +Test -- t347768 + CPU seconds to compute hull (after input): 0.051 + +Testing -- rbox 1000 W0 C1,2e-13 D5 t881245 | qhull Q14 Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-881245.log +Test -- t881245 + CPU seconds to compute hull (after input): 0.189 + +Testing -- rbox 500 W0 C1,2e-13 D6 t948199 | qhull Q14 Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-948199.log +Test -- t948199 +QH6271 qhull topology error (qh_check_dupridge): wide merge (382263037091.0x wider) due to dupridge between f319376 and f320185 (vertex dist 2.4e-13), merge dist 0.21, while processing p208 + Maximum distance of point above facet: 5.4e-13 (22.1x) + Maximum distance of vertex below facet: -7.3e-13 (29.5x) + +==================== +== Delaunay triangulation of point pairs (large upper facet) +== Difficult case due to large upper facet with nearly adjacent vertices +== A bounding box helps avoid this case, see TIME_DELAUNAY_PAIRS +==================== + +Testing -- rbox 100000 C1,2e-13 D2 t548630 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-548630.log +Test -- t548630 + CPU seconds to compute hull (after input): 1.306 + +Testing -- rbox 10000 C1,2e-13 D3 t149061 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-149061.log +Test -- t149061 + CPU seconds to compute hull (after input): 0.657 + +Testing -- rbox 500 C1,2e-13 D4 t684693 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-684693.log +Test -- t684693 +QH6271 qhull topology error (qh_check_dupridge): wide merge (37732005938.4x wider) due to dupridge between f52566 and f52538 (vertex dist 2.3e-13), merge dist 0.0032, while processing p553 + +Testing -- rbox 200 C1,2e-13 D5 t751647 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-751647.log +Test -- t751647 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r108296 and r108302. Nearest v293 and v387 dist 0.16 (7021422850377.3x) + +Testing -- rbox 100 C1,2e-13 D6 t285124 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-285124.log +Test -- t285124 + CPU seconds to compute hull (after input): 1.292 + +==================== +== Delaunay triangulation of point quads (2e-13, large upper facet) +== Difficult case due to large upper facet with many nearly adjacent vertices +==================== + +Testing -- rbox 50000 C3,2e-13 D2 t885555 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-885555.log +Test -- t885555 + CPU seconds to compute hull (after input): 0.846 + +Testing -- rbox 10000 C3,2e-13 D3 t485986 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-485986.log +Test -- t485986 +QH6348 qhull precision error (qh_mergefacet): wide merge for pinched facet f179300 into f83347 for mergetype 3 (concave). maxdist 0 (0x) mindist -0.00015 (15229327719.9x) vertexdist 1.1e-13 Allow with 'Q12' (allow-wide) + +Testing -- rbox 200 C3,2e-13 D4 t552940 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-552940.log +Test -- t552940 +QH6348 qhull precision error (qh_mergefacet): wide merge for pinched facet f17712 into f17726 for mergetype 10 (degen). maxdist 0 (0x) mindist -0.0021 (128521499042.8x) vertexdist 3e-13 Allow with 'Q12' (allow-wide) + +Testing -- rbox 100 C3,2e-13 D5 t86417 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-86417.log +Test -- t86417 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f66306 and f66308 have the same vertices (skip 1, skip 1) and same horizon ridges to f52073 and f55106 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f66306 and f66308 have the same vertices (skip 2, skip 2) and same horizon ridges to f52073 and f55106 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f66306 and f66308 have the same vertices (skip 4, skip 4) and same horizon ridges to f52073 and f55106 +QH7084 qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f66306 and f66308 have the same vertices (skip 5, skip 5) and same horizon ridges to f52073 and f55106 +QH6155 qhull topology error (qh_matchdupridge): missing qh_DUPLICATEridge at f66308 skip 4 for new f66306 skip 4 hash 3265 ismatch 1. Set by qh_matchneighbor + Maximum distance of point above facet: 3.7e-13 (15.0x) + +Testing -- rbox 100 C3,2e-13 D6 t619894 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-619894.log +Test -- t619894 +QH6425 Qhull topology error (qh_partitioncoplanar): can not repartition coplanar point p360 from f389002 as outside point above f503604. It previously failed to form a cone of facets, dist 0.00014, nearest vertices 3.3e-13 + Maximum distance of point above facet: 5.3e-13 (15.3x) + +==================== +== Delaunay triangulation of fuzzy circle with pairs (large, narrow disk) +== Highly degenerate due to narrow disk of two cospherical sets of point pairs +== Worse with Qbb since it stretches out the paraboloid, doubling _one-merge +==================== + +Testing -- rbox 10000 s W1e-13 C1,1e-13 D2 t753802 | qhull Q14 d Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-753802.log +Test -- t753802 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH7085 Qhull precision warning: repartition coplanar point p13605 from f33398 as an outside point above twisted facet f33398 dist 1.5e-08 nearest vertices 8.5e-14 +QH7085 Qhull precision warning: repartition coplanar point p3161 from f46136 as an outside point above twisted facet f46131 dist 1.7e-09 nearest vertices 1.5e-13 +QH7085 Qhull precision warning: repartition coplanar point p13717 from f34469 as an outside point above twisted facet f59096 dist 1.9e-09 nearest vertices 5.3e-14 + CPU seconds to compute hull (after input): 0.161 + Maximum distance of point above facet: 5.8e-14 (10.4x) + +Testing -- rbox 5000 s W1e-13 C1,1e-13 D3 t488141 | qhull Q14 d Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-488141.log +Test -- t488141 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.606 + +Testing -- rbox 500 s W1e-13 C1,1e-13 D4 t155526 | qhull Q14 d Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-155526.log +Test -- t155526 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower + CPU seconds to compute hull (after input): 0.318 + +Testing -- rbox 200 s W1e-13 C1,1e-13 D5 t222480 | qhull Q14 d Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-222480.log +Test -- t222480 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r81322 and r81457. Nearest v137 and v201 dist 0.21 (9398058245899.0x) + +Testing -- rbox 100 s W1e-13 C1,1e-13 D6 t289434 | qhull Q14 d Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-289434.log +Test -- t289434 +QH7089 qhull precision warning: The initial hull is narrow. Is the input lower +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r41099 and r40865. Nearest v8 and v45 dist 0.22 (7248633393770.0x) + +==================== +== Voronoi diagram of rotated mesh with wide, 1e-8 pairs +== All fail at C1,1e-12 +==================== + +Testing -- rbox 10000 M3,4 C1,1e-8 D2 t822911 | qhull QR3 Q14 v Qbb Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-822911.log +Test -- t822911 + CPU seconds to compute hull (after input): 0.152 + +Testing -- rbox 2000 M3,4,5 C1,1e-8 D3 t157681 | qhull QR3 Q14 v Qbb Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-157681.log +Test -- t157681 +QH7081 qhull precision warning (qh_getpinchedmerges): pinched vertices v910 and v456 (dist 8.1e-09, 3294x) would produce a wide merge for f40800 and f40814. Will merge dupridge instead +QH6271 qhull topology error (qh_check_dupridge): wide merge (417465268.1x wider) due to dupridge between f40800 and f40814 (vertex dist 8.1e-09), merge dist 0.001, while processing p3608 + +Testing -- rbox 600 M3,4,5 C1,1e-8 D4 t691158 | qhull QR3 Q14 v Qbb Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-691158.log +Test -- t691158 + CPU seconds to compute hull (after input): 0.258 + +Testing -- rbox 300 M3,4,5 C1,1e-8 D5 t758112 | qhull QR3 Q14 v Qbb Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-758112.log +Test -- t758112 + CPU seconds to compute hull (after input): 0.902 +skip D6, millions of vertices + +============================ +== Delaunay triangulation of nearly cospherical point pairs with Qbb drum +== Qbb makes this the most difficult distribution for Qhull, only 100 points +============================ + +Testing -- rbox 1000 s C1,1e-13 D3 t358543 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-358543.log +Test -- t358543 + CPU seconds to compute hull (after input): 0.052 + +Testing -- rbox 100 s C1,1e-13 D4 t425497 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-425497.log +Test -- t425497 + CPU seconds to compute hull (after input): 0.023 + +Testing -- rbox 50 s C1,1e-13 D5 t958974 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-958974.log +Test -- t958974 +QH7081 qhull precision warning (qh_getpinchedmerges): pinched vertices v65 and v49 (dist 0.0034, 139424997685x) would produce a wide merge for f11052 and f11054. Will merge dupridge instead +QH6271 qhull topology error (qh_check_dupridge): wide merge (322371235117.8x wider) due to dupridge between f11052 and f11054 (vertex dist 0.0034), merge dist 0.0078, while processing p50 + +Testing -- rbox 50 s C1,1e-13 D6 t492451 | qhull Q14 d Qbb Tv >/d/bash/var/tmp/qtest-2020-07-24/qhull-492451.log +Test -- t492451 +QH6271 qhull topology error (qh_check_dupridge): wide merge (33307682655.3x wider) due to dupridge between f19365 and f19401 (vertex dist 0.011), merge dist 0.001, while processing p18 + +============================ +== Time for pinched Delaunay triangulation of random point pairs (Q14) with bounding box +============================ + +Testing -- rbox 50000 C1,2e-13 c G2.0 D2 t559405 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-559405.log +Test -- t559405 + CPU seconds to compute hull (after input): 0.641 + +Testing -- rbox 10000 C1,2e-13 c G2.0 D3 t626359 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-626359.log +Test -- t626359 + CPU seconds to compute hull (after input): 0.456 + +Testing -- rbox 3000 C1,2e-13 c G2.0 D4 t693313 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-693313.log +Test -- t693313 +QH7085 Qhull precision warning: repartition coplanar point p5346 from f250733 as an outside point above twisted facet f250738 dist 0.00038 nearest vertices 2.5e-13 + CPU seconds to compute hull (after input): 1.179 + +Testing -- rbox 500 C1,2e-13 c G2.0 D5 t760267 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-760267.log +Test -- t760267 + CPU seconds to compute hull (after input): 1.176 + +Testing -- rbox 100 C1,2e-13 c G2.0 D6 t360698 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-360698.log +Test -- t360698 +QH6381 qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r88304 and r87884. Nearest v82 and v86 dist 0.61 (4668353828614.3x) + +============================ +== Time for pinched Delaunay triangulation of random point pairs (Q14, Q12) +== qh_next_facetmerge, qh_findbesthorizon (qh_distplane) +============================ + +Testing -- rbox 50000 C1,2e-13 D2 t427652 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-427652.log +Test -- t427652 + CPU seconds to compute hull (after input): 0.548 + +Testing -- rbox 5000 C1,2e-13 D3 t494606 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-494606.log +Test -- t494606 + CPU seconds to compute hull (after input): 0.461 + Maximum distance of point above facet: 1.6e-13 (15.6x) + Maximum distance of vertex below facet: -1.3e-13 (13.2x) + +Testing -- rbox 500 C1,2e-13 D4 t561560 | qhull Q12 Q14 d Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-561560.log +Test -- t561560 +QH6271 qhull topology error (qh_check_dupridge): wide merge (231733071381.3x wider) due to dupridge between f76307 and f76302 (vertex dist 2.4e-13), merge dist 0.02, while processing p507 + CPU seconds to compute hull (after input): 0.345 + Maximum distance of point above facet: 2e-13 (12.3x) + Maximum distance of vertex below facet: -2.1e-13 (12.9x) + +Testing -- rbox 300 C1,2e-13 D5 t95037 | qhull Q12 Q14 d Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-95037.log +Test -- t95037 +QH6271 qhull topology error (qh_check_dupridge): wide merge (80235921958.0x wider) due to dupridge between f243374 and f243379 (vertex dist 2.1e-13), merge dist 0.018, while processing p428 + CPU seconds to compute hull (after input): 1.498 + Maximum distance of point above facet: 3.3e-13 (13.3x) + Maximum distance of vertex below facet: -3.3e-13 (13.5x) + +Testing -- rbox 100 C1,2e-13 D6 t695468 | qhull Q14 d Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-695468.log +Test -- t695468 + CPU seconds to compute hull (after input): 1.234 + +=========================== +=== N_TIMING test cases === +=========================== + +============================ +== Time for random points in a cube +============================ + +Testing -- rbox 1000000 D2 t295899 | qhull >/d/bash/var/tmp/qtest-2020-07-24/qhull-295899.log +Test -- t295899 + CPU seconds to compute hull (after input): 0.114 + +Testing -- rbox 500000 D3 t429807 | qhull >/d/bash/var/tmp/qtest-2020-07-24/qhull-429807.log +Test -- t429807 + CPU seconds to compute hull (after input): 0.14 + +Testing -- rbox 200000 D4 t563715 | qhull >/d/bash/var/tmp/qtest-2020-07-24/qhull-563715.log +Test -- t563715 + CPU seconds to compute hull (after input): 0.192 + +Testing -- rbox 100000 D5 t630669 | qhull Q12 >/d/bash/var/tmp/qtest-2020-07-24/qhull-630669.log +Test -- t630669 + CPU seconds to compute hull (after input): 0.774 + +Testing -- rbox 3000 D6 t231100 | qhull >/d/bash/var/tmp/qtest-2020-07-24/qhull-231100.log +Test -- t231100 + CPU seconds to compute hull (after input): 1.059 + +============================ +== Time for random cospherical points +============================ + +Testing -- rbox 100000 s D2 t298054 | qhull >/d/bash/var/tmp/qtest-2020-07-24/qhull-298054.log +Test -- t298054 + CPU seconds to compute hull (after input): 0.287 + +Testing -- rbox 100000 s D3 t365008 | qhull >/d/bash/var/tmp/qtest-2020-07-24/qhull-365008.log +Test -- t365008 + CPU seconds to compute hull (after input): 0.521 + +Testing -- rbox 50000 s D4 t431962 | qhull >/d/bash/var/tmp/qtest-2020-07-24/qhull-431962.log +Test -- t431962 + CPU seconds to compute hull (after input): 1.199 + +== Repeat with qconvex, bin/qconvex is built with libqhull instead of libqhull_r + +Testing -- rbox 50000 s D4 t32393 | qconvex >/d/bash/var/tmp/qtest-2020-07-24/qhull-32393.log +Test -- t32393 + CPU seconds to compute hull (after input): 1.251 + +Testing -- rbox 10000 s D5 t632824 | qhull >/d/bash/var/tmp/qtest-2020-07-24/qhull-632824.log +Test -- t632824 + CPU seconds to compute hull (after input): 1.498 + +Testing -- rbox 1000 s D6 t233255 | qhull >/d/bash/var/tmp/qtest-2020-07-24/qhull-233255.log +Test -- t233255 + CPU seconds to compute hull (after input): 0.747 + +============================ +== Time for extreme post-merge of random cospherical points +============================ + +Testing -- rbox 100000 s D2 t833686 | qhull C0.01 >/d/bash/var/tmp/qtest-2020-07-24/qhull-833686.log +Test -- t833686 + CPU seconds to compute hull (after input): 0.657 + +Testing -- rbox 10000 s D3 t900640 | qhull C0.01 >/d/bash/var/tmp/qtest-2020-07-24/qhull-900640.log +Test -- t900640 + CPU seconds to compute hull (after input): 0.185 + +Testing -- rbox 5000 s D4 t967594 | qhull C0.01 >/d/bash/var/tmp/qtest-2020-07-24/qhull-967594.log +Test -- t967594 + CPU seconds to compute hull (after input): 0.422 + +== Repeat with qconvex, bin/qconvex is built with libqhull instead of libqhull_r + +Testing -- rbox 5000 s D4 t34548 | qconvex C0.01 >/d/bash/var/tmp/qtest-2020-07-24/qhull-34548.log +Test -- t34548 + CPU seconds to compute hull (after input): 0.438 + +Testing -- rbox 2000 s D5 t568025 | qhull C0.01 >/d/bash/var/tmp/qtest-2020-07-24/qhull-568025.log +Test -- t568025 + CPU seconds to compute hull (after input): 0.989 + +Testing -- rbox 500 s D6 t168456 | qhull C0.01 >/d/bash/var/tmp/qtest-2020-07-24/qhull-168456.log +Test -- t168456 + CPU seconds to compute hull (after input): 1.015 + +============================ +== Time for rotated cubical points with large merged facets +============================ + +Testing -- rbox 5000000 W0 D2 t235410 | qhull QR3 >/d/bash/var/tmp/qtest-2020-07-24/qhull-235410.log +Test -- t235410 + CPU seconds to compute hull (after input): 0.879 + +Testing -- rbox 1000000 W0 D3 t103657 | qhull QR3 >/d/bash/var/tmp/qtest-2020-07-24/qhull-103657.log +Test -- t103657 + CPU seconds to compute hull (after input): 0.686 + +Testing -- rbox 100000 W0 D4 t771042 | qhull QR3 >/d/bash/var/tmp/qtest-2020-07-24/qhull-771042.log +Test -- t771042 + CPU seconds to compute hull (after input): 0.477 + +Testing -- rbox 10000 W0 D5 t837996 | qhull QR3 >/d/bash/var/tmp/qtest-2020-07-24/qhull-837996.log +Test -- t837996 + CPU seconds to compute hull (after input): 0.742 + +Testing -- rbox 1000 W0 D6 t371473 | qhull QR3 >/d/bash/var/tmp/qtest-2020-07-24/qhull-371473.log +Test -- t371473 + CPU seconds to compute hull (after input): 0.941 + +============================ +== Time for joggled, rotated cubical points with multiple retries +============================ + +Testing -- rbox 5000000 W0 D2 t971904 | qhull QR3 QJ >/d/bash/var/tmp/qtest-2020-07-24/qhull-971904.log +Test -- t971904 + CPU seconds to compute hull (after input): 0.808 + +Testing -- rbox 1000000 W0 D3 t840151 | qhull QR3 QJ >/d/bash/var/tmp/qtest-2020-07-24/qhull-840151.log +Test -- t840151 + CPU seconds to compute hull (after input): 1.002 + After 1 retries, input joggled by: 3.5e-11 + +Testing -- rbox 100000 W0 D4 t507536 | qhull QR3 QJ >/d/bash/var/tmp/qtest-2020-07-24/qhull-507536.log +Test -- t507536 + CPU seconds to compute hull (after input): 0.458 + After 3 retries, input joggled by: 5.7e-09 + +Testing -- rbox 10000 W0 D5 t574490 | qhull QR3 QJ >/d/bash/var/tmp/qtest-2020-07-24/qhull-574490.log +Test -- t574490 + CPU seconds to compute hull (after input): 0.651 + After 3 retries, input joggled by: 8.2e-09 + +Testing -- rbox 1000 W0 D6 t641444 | qhull QR3 QJ >/d/bash/var/tmp/qtest-2020-07-24/qhull-641444.log +Test -- t641444 + CPU seconds to compute hull (after input): 1.17 + After 2 retries, input joggled by: 1.1e-09 + +============================ +== Time for joggled, nearly cubical points +============================ + +Testing -- rbox 1000000 W1e-13 D2 t708398 | qhull QJ >/d/bash/var/tmp/qtest-2020-07-24/qhull-708398.log +Test -- t708398 + CPU seconds to compute hull (after input): 0.166 + +Testing -- rbox 500000 W1e-13 D3 t308829 | qhull QJ >/d/bash/var/tmp/qtest-2020-07-24/qhull-308829.log +Test -- t308829 + CPU seconds to compute hull (after input): 1.447 + After 4 retries, input joggled by: 2.1e-08 + +Testing -- rbox 100000 W1e-13 D4 t976214 | qhull QJ >/d/bash/var/tmp/qtest-2020-07-24/qhull-976214.log +Test -- t976214 + CPU seconds to compute hull (after input): 0.483 + After 3 retries, input joggled by: 3e-09 + +Testing -- rbox 10000 W1e-13 D5 t43168 | qhull QJ >/d/bash/var/tmp/qtest-2020-07-24/qhull-43168.log +Test -- t43168 + CPU seconds to compute hull (after input): 0.635 + After 3 retries, input joggled by: 4.1e-09 + +Testing -- rbox 1000 W1e-13 D6 t576645 | qhull QJ >/d/bash/var/tmp/qtest-2020-07-24/qhull-576645.log +Test -- t576645 + CPU seconds to compute hull (after input): 1.025 + After 3 retries, input joggled by: 5.3e-09 + +============================ +== Time for merging nearly cubical points +============================ + +Testing -- rbox 1000000 W1e-13 D2 t177076 | qhull >/d/bash/var/tmp/qtest-2020-07-24/qhull-177076.log +Test -- t177076 + CPU seconds to compute hull (after input): 0.21 + +Testing -- rbox 1000000 W1e-13 D3 t310984 | qhull >/d/bash/var/tmp/qtest-2020-07-24/qhull-310984.log +Test -- t310984 + CPU seconds to compute hull (after input): 1.573 + +Testing -- rbox 100000 W1e-13 D4 t511846 | qhull Q12 >/d/bash/var/tmp/qtest-2020-07-24/qhull-511846.log +Test -- t511846 + CPU seconds to compute hull (after input): 1.446 + +Testing -- rbox 2000 W1e-13 D5 t112277 | qhull Q12 >/d/bash/var/tmp/qtest-2020-07-24/qhull-112277.log +Test -- t112277 + CPU seconds to compute hull (after input): 0.652 + +Testing -- rbox 500 W1e-13 D6 t179231 | qhull >/d/bash/var/tmp/qtest-2020-07-24/qhull-179231.log +Test -- t179231 + CPU seconds to compute hull (after input): 0.52 + +============================ +== Time for Delaunay triangulation of random points +== qh_findbesthorizon, qh_distplane, qh_update_vertexneighbors_cone, qh_makenew_simplicial +============================ + +Testing -- rbox 100000 D2 t246185 | qhull d Qbb Qz >/d/bash/var/tmp/qtest-2020-07-24/qhull-246185.log +Test -- t246185 + CPU seconds to compute hull (after input): 0.791 + +Testing -- rbox 50000 D3 t846616 | qhull d Qbb Qz >/d/bash/var/tmp/qtest-2020-07-24/qhull-846616.log +Test -- t846616 + CPU seconds to compute hull (after input): 1.818 + +Testing -- rbox 10000 D4 t447047 | qhull d Qbb Qz >/d/bash/var/tmp/qtest-2020-07-24/qhull-447047.log +Test -- t447047 + CPU seconds to compute hull (after input): 1.502 + +Testing -- rbox 1000 D5 t580955 | qhull d Qbb Qz >/d/bash/var/tmp/qtest-2020-07-24/qhull-580955.log +Test -- t580955 + CPU seconds to compute hull (after input): 0.68 + +Testing -- rbox 200 D6 t647909 | qhull d Qbb Qz >/d/bash/var/tmp/qtest-2020-07-24/qhull-647909.log +Test -- t647909 + CPU seconds to compute hull (after input): 0.471 + +==================== +== Time for Delaunay triangulation of regular mesh, integer coordinates +==================== + +Testing -- rbox 100000 M3,4 z D2 t714863 | qhull QR3 d Qt Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-714863.log +Test -- t714863 + CPU seconds to compute hull (after input): 0.937 + +Testing -- rbox 20000 M3,4,5 z D3 t315294 | qhull QR3 d Qt Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-315294.log +Test -- t315294 + CPU seconds to compute hull (after input): 1.055 + +Testing -- rbox 5000 M3,4,5 z D4 t382248 | qhull QR3 d Qt Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-382248.log +Test -- t382248 + CPU seconds to compute hull (after input): 1.095 + +Testing -- rbox 1500 M3,4,5 z D5 t982679 | qhull QR3 d Qt Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-982679.log +Test -- t982679 + CPU seconds to compute hull (after input): 1.073 + +Testing -- rbox 500 M3,4,5 z D6 t49633 | qhull QR3 d Qt Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-49633.log +Test -- t49633 + CPU seconds to compute hull (after input): 0.857 + +==================== +== Time for Voronoi diagram of regular mesh +==================== +Testing -- rbox 100000 M3,4 z D2 | qhull v Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-650064.log +Test -- QR650064 + CPU seconds to compute hull (after input): 0.942 +Testing -- rbox 20000 M3,4,5 z | qhull v Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-250495.log +Test -- QR250495 + CPU seconds to compute hull (after input): 0.9 +Testing -- rbox 5000 M3,4,5 z D4 | qhull v Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-317449.log +Test -- QR317449 + CPU seconds to compute hull (after input): 1.037 +Testing -- rbox 1500 M3,4,5 z D5 | qhull v Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-384403.log +Test -- QR384403 + CPU seconds to compute hull (after input): 1.256 +Testing -- rbox 500 M3,4,5 z D6 | qhull v Qbb >/d/bash/var/tmp/qtest-2020-07-24/qhull-451357.log +Test -- QR451357 + CPU seconds to compute hull (after input): 0.955 diff -Nru qhull-2015.2/eg/qtest.sh qhull-2020.2/eg/qtest.sh --- qhull-2015.2/eg/qtest.sh 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/eg/qtest.sh 2019-06-25 17:21:13.000000000 +0000 @@ -0,0 +1,459 @@ +#!/bin/bash +# +# eg/qtest.sh -- test qhull runs or log a qhull run +# +# tags: #help #test-rbox #test-qhull #grep #grep-merge #grep-step +# #log-qhull #log-t #log-QR +# +# Test for internal errors using difficult cases for Qhull (see q_benchmark) +# ../eg/qtest.sh 100 '500 s W1e-13 C1,1e-13 D4' 'd' | grep -vE 'topology|precision|CPU|Maximum +# +# $Id: //main/2019/qhull/eg/qtest.sh#4 $$DateTime: 2019/06/25 15:24:47 $ +# $Change: 2701 $$Author: bbarber $ + +QHULL=${QHULL:-qhull} +Tnz=${Tnz:-T4z} +PROG=$0 +NOW=$(date +"%s") +TODAY=$(date +"%Y-%m-%d") +BASE=$(( (NOW * 234533477) % 1000000 )) +COUNT=0 +QH_TMPDIR="$TMP/qtest-$TODAY" +QH_TEST_DEST="$QH_TMPDIR/qhull-$BASE.log" +QH_SHOW_DEST="$QH_TMPDIR/qhull-$BASE-show.log" +QH_LOG_DEST="qhull.log" +QH_STEP_DEST="qhull-step.log" +QH_TEST_BASE=1 +QH_TEST_GREP='QH[67]| Statis|[0-9][0-9][.][0-9]x|CPU|FIXUP|retries, input joggled|initial hull is narrow' +QH_SHOW_GREPX="QH7[0-9][^8]|Stati" +QH_STEP_GREP="QH[0-367]|FIXUP" +QH_STEP_ARG="-A10" +QH_STEP_EXTRA="QH6| of [0-9]+ points in|:precision problems" +QH_MERGE_GREP="QH[67]|QH(1040|1050|3034)|qh_addpoint:|qh_checkflipped|qh_matchdupridge|qh_maxouter|qh_mergefacet|qh_test_centrum_merge|qh_test_nonsimplicial_merge|qtest.sh" +QH_MERGE_GREPX='keep 239874664' # 'mergetype (11|13)|mindist= -2, maxdist= -2$' +# QH_APPEND_DEST [env only] for copy of QH_TEST_DEST (e.g., eg/q_benchmark) +# QH_APPEND_SHOW [env only] for copy of QH_SHOW_DEST (e.g., eg/q_benchmark) +# QH_TEST [env only] grep expression appended to QH_TEST_GREP +# QH_TESTX [env only] grep expression to exclude from QH_TEST_GREP +# QH_SHOW [env only] grep expression to exclude from show log +# QH_SHOWX [env only] grep expression appended to QH_SHOW_GREPX +# QH_GREP [env only] grep expression appended to 'qtest.sh grep' +# QH_GREPX [env only] grep expression to exclude from 'qtest.sh grep' + +if [[ $# -eq 0 || "$1" == "help" || "$1" == "--help" || "$1" == "-?" ]]; then + echo + #help + echo "qtest.sh -- test qhull runs" + echo " qtest.sh N 'rbox c | qhull' -- N random qhull runs" + echo " qtest.sh N 'rbox-opts' 'qhull-opts' -- N random rbox|qhull runs" + echo " qtest.sh -N 'rbox c | qhull' -- N qhull runs" + echo " qtest.sh -N 'rbox opts' 'qhull opts' -- N rbox|qhull runs" + echo "execute rbox and qhull" + echo " qtest.sh run 'rbox c | qhull' -- execute 'qhull command'" + echo " qtest.sh run QR... 'rbox | qhull' -- execute 'qhull command QR...'" + echo " qtest.sh run t... 'rbox-opts' 'qhull-opts' -- execute 'rbox t... | qhull'" + echo "log execution of rbox and qhull" + echo " qtest.sh log 'rbox c | qhull' -- log qhull to qhull.log/qhull-step.log" + echo " qtest.sh QR... 'rbox c | qhull' -- log a qhull run" + echo " qtest.sh t... 'rbox-opts' 'qhull-opts' -- log a 'rbox|qhull' run" + echo " qtest.sh grep 'include-regexp' -- grep qhull.log for events to grep.log" + echo " qtest.sh grep 'include-regexp' 'exclude-regexp'" + echo " qtest.sh grep-merge logfile -- grep logfile for qh_mergefacet,etc. to stdout" + echo " qtest.sh grep-step logfile -- grep logfile for steps to stdout" + echo " qtest.sh -v ... -- verbose output with environment vars" + echo "variables defined in qtest.sh" + echo " QH_TEST_BASE -- first tNN for negative counts" + echo " QH_TEST_DEST -- qtest.sh log" + echo " QH_TEST_GREP -- grep expression for qtest.sh log" + echo " QH_SHOW_DEST -- qtest.sh show log" + echo " QH_SHOW_GREPX -- exclude grep for show log" + echo " QH_LOG_DEST -- qhull log" + echo " QH_LOG_GREP -- grep expression for qhull log" + echo " QH_STEP_DEST -- qhull step log" + echo " QH_STEP_GREP -- grep expression for step log and grep-step" + echo " QH_MERGE_GREP -- grep expression for grep-merge" + echo " QH_MERGE_GREPX -- exclude grep for grep-merge" + echo "environment variables" + echo " QHULL -- qhull program, may be qconvex, etc" + echo " QH_APPEND_DEST -- append qtest.sh log" + echo " QH_APPEND_SHOW -- append show log" + echo " QH_TEST -- additional grep expression for qtest.sh log" + echo " QH_TESTX -- exclude grep for qtest.sh log" + echo " QH_SHOW -- grep expression for show log" + echo " QH_SHOWX -- additional exclude grep for show log" + echo " QH_GREP -- additional grep expression for grep log" + echo " QH_GREPX -- additional exclude grep for grep log" + echo " Tnz -- Trace setting for 'qtest.sh log'" + echo "examples" + echo " qtest.sh help" + echo " qtest.sh 25 '1000 W1e-13 D4' ''" + echo " qtest.sh 25 '1000 W0 D4 C2,2e-13' 'Q14'" + echo " qtest.sh 25 '300 D4 C1,2e-13' 'd Q14'" + echo " qtest.sh -10 '10000 D4' ''" + echo " qtest.sh -10 '1000 s D4' ''" + echo " qtest.sh -10 'rbox 1000 s D4 | qhull'" + echo " qtest.sh run QR4 'rbox 1000 s D4 | qhull'" + echo " qtest.sh run t876333 '1000 s D4' ''" + echo " qtest.sh log 'rbox 500 s D4 | qhull' # qhull.log qhull-step.log" + echo " qtest.sh t876333 '500 s D4' ''" + echo " qtest.sh QR4 'rbox 500 s D4 | qhull'" + echo " qtest.sh grep 'qh_addpoint|qh_mark_dupridges' | head -20 # QH_GREP QH_GREPX" + echo " qtest.sh grep 'qh_addpoint' 'added| qh_addpoint' | head -20" + echo " qtest.sh grep-merge qhull.log | head -20" + echo " qtest.sh grep-step qhull.log >qhull-step.log" + echo " qtest.sh -v -10 '10000 D4' '' # verbose" + echo + echo "$(grep Id: $0 | head -1)" + exit +fi + +function isnum { + expr "$1" + 0 >/dev/null 2>&1 +} + +if ! which rbox >/dev/null 2>&1; then + if [[ ! -d bin ]]; then + echo 'eg/qtest.sh: Run eg/qtest.sh from the Qhull directory with bin/, or add $QHULL' "'$QHULL' and 'rbox' to" '$PATH' + exit 1 + fi + if [[ ! -e bin/rbox && ! -e bin/rbox.exe ]]; then + echo "eg/qtest.sh: Build '$QHULL' and 'rbox', or add" '$QHULL' "'$QHULL' and 'rbox' to" '$PATH' + exit 1 + fi + if [[ ! -e "bin/$QHULL" && ! -e "bin/$QHULL.exe" ]]; then + echo "eg/qtest.sh: Build '$QHULL' and 'rbox', or add" '$QHULL' "'$QHULL' and 'rbox' to" '$PATH' + exit 1 + fi + PATH="$PWD/bin:$PATH" + if ! which rbox >/dev/null 2>&1; then + echo 'eg/qtest.sh: Failed to temporily add "$PWD/bin" to $PATH for access to $QHULL and rbox' "'$QHULL'." 'Please execute "export PATH=$PWD/bin:$PATH"' + exit 1 + fi +fi +if ! which $QHULL >/dev/null 2>&1; then + echo 'eg/qtest.sh: $QHULL failed. Cannot run' "'rbox c | $QHULL'. Add '$QHULL' to" '$PATH' + exit 1 +fi +if [[ ! -d $QH_TMPDIR ]]; then + mkdir -p "$QH_TMPDIR" || (echo "qtest.sh: 'mkdir -p $QH_TMPDIR'" && exit 1) +fi +ISLOG=0 +if [[ "$1" == "-v" ]]; then + ISLOG=1 + shift +fi +if [[ "$1" == "run" ]]; then + if [[ $# -eq 2 ]]; then + sh -c "$2" + elif [[ $# -eq 3 && "${2:0:2}" == "QR" ]]; then + sh -c "$3 $2" + elif [[ $# -eq 3 ]]; then + rbox $2 | $QHULL $3 + elif [[ $# -eq 4 && "${2:0:1}" == "t" ]]; then + rbox $3 $2 | $QHULL $4 + elif [[ $# -eq 4 ]]; then + echo "qtest.sh: Expecting 'run' followed by 'tNNN rbox-args qhull-args'. See 'qtest.sh help'" >&2 + exit 1 + else + echo "qtest.sh: Expecting 'run' followed by 1 to 3 arguments. Got total of $# arguments. See 'qtest.sh help'" >&2 + exit 1 + fi + exit +fi +if [[ $# -gt 3 ]]; then + echo "qtest.sh: Expecting 1 to 3 arguments. Got $# arguments. See 'qtest.sh help'" >&2 + exit 1 +fi + +if [[ "$QH_TEST_DEST" == "" || "$QH_SHOW_DEST" == "" || "$QH_LOG_DEST" == "" ]]; then + echo "qtest.sh: script does not define \$QH_TEST_DEST, \$QH_SHOW_DEST, or \$QH_LOG_DEST. Required setting for 'qtest.sh help'" >&2 + echo -e " QH_TEST_DEST='$QH_TEST_DEST'\n QH_SHOW_DEST='$QH_SHOW_DEST'" >&2 + echo -e " QH_LOG_DEST='$QH_TEST_DEST'" >&2 + exit 1 +elif [[ "$QH_TEST_GREP" == "" || "$QH_SHOW_GREPX" == "" || "$QH_STEP_EXTRA" == "" ]]; then + echo "qtest.sh: script does not define \$QH_TEST_GREP, \$QH_STEP_EXTRA, or \$QH_SHOW_GREPX. Required setting for 'qtest.sh help'" >&2 + echo -e " QH_TEST_GREP='$QH_TEST_GREP'\n QH_SHOW_GREPX='$QH_SHOW_GREPX'\n QH_STEP_EXTRA='$QH_STEP_EXTRA'" >&2 + exit 1 +fi + +if isnum "$1"; then + COUNT=$1 +fi +if [[ $COUNT -lt 0 ]]; then + BASE=$(( QH_TEST_BASE )) + COUNT=$(( -COUNT )) +fi +if [[ $COUNT -gt 0 ]]; then + DEST="$QH_TEST_DEST" + GREP="$QH_TEST_GREP" + GREPX="keep 239874664" + DEST2="$QH_SHOW_DEST" + GREP2="." + GREPX2="$QH_SHOW_GREPX" + if [[ "$QH_TEST" != "" ]]; then + GREP="$GREP|$QH_TEST" + fi + if [[ "$QH_TESTX" != "" ]]; then + GREPX="$QH_TESTX" + fi + if [[ "$QH_SHOW" != "" ]]; then + GREP2="$QH_SHOW" + fi + if [[ "$QH_SHOWX" != "" ]]; then + GREPX2="$GREPX2|$QH_SHOWX" + fi + if [[ $# -eq 3 ]]; then + CMD="rbox $2 t$BASE | $QHULL $3" + echo -e "\nTesting -- $CMD >$DEST" | tee "$DEST" | tee "$DEST2" + echo "$PROG $COUNT '$2' '$3'" >> "$DEST" + (date; pwd; ls -ld "$(which $QHULL)"; $QHULL -V) >> "$DEST" + if ! rbox $2 1000 t$BASE | head -10 >/dev/null; then + echo; echo "qtest.sh error: 'rbox $2 t$BASE' failed" + exit 1 + fi + if ! (rbox 20 | $QHULL $3 TA1) >/dev/null; then + echo; echo "qtest.sh error: 'rbox 20 | $QHULL $3 TA1' failed" + exit 1 + fi + if [[ $ISLOG -gt 0 ]]; then + echo "qtest.sh: rbox $2 t$i | $QHULL $3 Tsz | grep -E '$GREP' | grep -Ev '$GREPX' | tee -a '$DEST' | grep -E '$GREP2' | grep -Ev '$GREPX2' | tee -a '$DEST2' " + echo -e " QH_TEST_DEST='$QH_TEST_DEST'\n QH_SHOW_DEST='$QH_SHOW_DEST'" + echo -e " QH_TEST_GREP='$QH_TEST_GREP'\n QH_SHOW_GREPX='$QH_SHOW_GREPX'" + echo -e " QH_TEST='$QH_TEST'\n QH_TESTX='$QH_TESTX'" + echo -e " QH_SHOW='$QH_SHOW'\n QH_SHOWX='$QH_SHOWX'" + fi + #test-rbox + START=$(date +"%s") + for ((i=0; i<$COUNT; i++)); do + RUN=$(( BASE + i )) + echo "Test -- t$RUN" | tee -a "$DEST" | tee -a "$DEST2" + sh -c "rbox $2 t$RUN | $QHULL $3 Tsz" | grep -E "$GREP" | grep -Ev "$GREPX" | tee -a "$DEST" \ + | grep -E "$GREP2" | grep -Ev "$GREPX2" | tee -a "$DEST2" + done + DONE=$(date +"%s") + if [[ $COUNT -gt 2 ]]; then + echo "$DONE Test $COUNT runs in $((DONE - START)) seconds (ave. $(( (DONE - START)*1000/COUNT )) msec) -- $CMD" | tee -a "$DEST" | tee -a "$DEST2" + fi + elif [[ $# -eq 2 ]]; then + CMD="$2" + echo "Testing -- $CMD >$DEST" | tee "$DEST" | tee "$DEST2" + echo "$PROG $COUNT '$CMD'" >> "$DEST" + (date; pwd; ls -ld "$(which $QHULL)"; $QHULL -V) >> "$DEST" + if ! sh -c "$CMD QR0 TA1" >/dev/null; then + echo; echo "qtest.sh error: qhull failed" + exit 1 + fi + if [[ $ISLOG -gt 0 ]]; then + echo "qtest.sh: $CMD QR$BASE Tsz | grep -E '$GREP' | grep -Ev '$GREPX' | tee -a '$DEST' | grep -E '$GREP2' | grep -Ev '$GREPX2' | tee -a '$DEST2' " + echo -e " QH_TEST_DEST='$QH_TEST_DEST'\n QH_SHOW_DEST='$QH_SHOW_DEST'" + echo -e " QH_TEST_GREP='$QH_TEST_GREP'\n QH_SHOW_GREPX='$QH_SHOW_GREPX'" + echo -e " QH_TEST='$QH_TEST'\n QH_TESTX='$QH_TESTX'" + echo -e " QH_SHOW='$QH_SHOW'\n QH_SHOWX='$QH_SHOWX'" + fi + #test-qhull + START=$(date +"%s") + for ((i=0; i<$COUNT; i++)); do + RUN=$(( BASE + i )) + echo "Test -- QR$RUN" | tee -a "$DEST" | tee -a "$DEST2" + sh -c "$CMD QR$RUN Tsz" | grep -E "$GREP" | grep -Ev "$GREPX" | tee -a "$DEST" \ + | grep -E "$GREP2" | grep -Ev "$GREPX2" | tee -a "$DEST2" + done + DONE=$(date +"%s") + if [[ $COUNT -gt 2 ]]; then + echo "$DONE Test $COUNT runs in $((DONE - START)) seconds (average $(( (DONE - START)*1000/COUNT )) msec) -- $CMD" | tee -a "$DEST" | tee -a "$DEST2" + fi + else + echo "qtest.sh: Expecting run count followed by rbox and qhull options. Only run count provided ($1)." + exit 1 + fi + if [[ "$QH_APPEND_DEST" != "" ]]; then + cat "$QH_TEST_DEST" >>"$QH_APPEND_DEST" + fi + if [[ "$QH_APPEND_SHOW" != "" ]]; then + cat "$QH_SHOW_DEST" >>"$QH_APPEND_SHOW" + fi +elif [[ "$1" == "grep" ]]; then + if [[ $# -ge 2 && "$QH_GREP" != "" ]]; then + GREP="$2|$QH_GREP" + elif [[ $# -ge 2 ]]; then + GREP="$2" + elif [[ "$QH_GREP" != "" ]]; then + GREP="$QH_GREP" + else + GREP="." + fi + if [[ $# -eq 3 && "$QH_GREPX" != "" ]]; then + GREPX="$3|$QH_GREPX" + elif [[ $# -eq 3 ]]; then + GREPX="$3" + elif [[ "$QH_GREPX" != "" ]]; then + GREPX="$QH_GREPX" + else + if [[ "$GREP" == "." ]]; then + echo "qtest.sh: Expecting 'grep' followed by include and exclude regexps or \$QH_GREP or \$QH_GREPX. None defined." + exit 1 + fi + GREPX="keep 239874664" + fi + echo "qtest.sh: grep from '$QH_LOG_DEST' to stdout" + if [[ $ISLOG -gt 0 ]]; then + echo "qtest.sh: grep -E '$GREP' '$QH_LOG_DEST' | grep -Ev '$GREPX'" >&2 + echo -e " QH_LOG_DEST='$QH_TEST_DEST'" >&2 + echo -e " QH_GREP='$QH_GREP'\n QH_GREPX='$QH_GREPX'" >&2 + fi + #grep + grep -E "$GREP" "$QH_LOG_DEST" | grep -Ev "$GREPX" +elif [[ "$1" == "grep-merge" ]]; then + if [[ $# -ne 2 || ! -r "$2" ]]; then + echo "qtest.sh: Expecting 'grep-merge' followed by log file. Got '$1 $2 $3 ...'" >&2 + exit 1 + fi + SRC="$2" + # includes qh_appendvertexmerge, qh_findhorizon + GREP="$QH_MERGE_GREP" + GREPX="$QH_MERGE_GREPX" + SED='s/^xxx[0-9]*://' + SED2='s/horizon for point.*/horizon for point/' + echo "qtest.sh: grep merges from '$SRC' to stdout" >&2 + if [[ $ISLOG -gt 0 ]]; then + echo "qtest.sh: grep -E '$GREP' '$SRC' | grep -Ev '$GREPX' | sed -r -e '$SED' -e '$SED2'" >&2 + fi + #grep-merge + grep -E "$GREP" "$SRC" | grep -Ev "$GREPX" | sed -r -e "$SED" -e "$SED2" +elif [[ "$1" == "grep-step" ]]; then + if [[ $# -ne 2 || ! -r "$2" ]]; then + echo "qtest.sh: Expecting 'grep-step' followed by log file. Got '$1 $2 $3 ...'" >&2 + exit 1 + fi + SRC="$2" + GREP2="$QH_STEP_GREP" + GREPX2="keep 239874664" + ARG="$QH_STEP_ARG" + EXTRA="$QH_STEP_EXTRA" + if [[ "$QH_STEP" != "" ]]; then + GREP2="$GREP2|$QH_STEP" + fi + if [[ "$QH_STEPX" != "" ]]; then + GREPX2="$QH_STEPX" + fi + if [[ "$QH_ARG" != "" ]]; then + ARG="$QH_ARG" + fi + if [[ "$QH_EXTRA" != "" ]]; then + EXTRA="$EXTRA|$QH_EXTRA" + fi + echo "qtest.sh: grep step log from '$SRC' to stdout" >&2 + if [[ $ISLOG -gt 0 ]]; then + echo "qtest.sh: (grep -E '$GREP2' '$SRC' | grep -Ev '$GREPX2'; echo; echo ==== EXTRA $(date) ====; echo; grep '$ARG' -E '$EXTRA' '$SRC')" >&2 + echo -e " QH_STEP_GREP='$QH_STEP_GREP'" >&2 + echo -e " QH_STEP_ARG='$QH_STEP_ARG'\n QH_STEP_EXTRA='$QH_STEP_EXTRA'" >&2 + echo -e " QH_ARG='$QH_ARG'\n QH_STEP='$QH_STEP'" >&2 + fi + #grep-step + grep -E "$GREP2" "$SRC" | grep -Ev "$GREPX2"; + echo; echo ==== EXTRA $(date) ====; echo; grep $ARG -E "$EXTRA" "$SRC" +elif [[ "$1" == "log" && $# -ne 2 ]]; then + echo "qtest.sh: Expecting 'log' followed by a qhull command line in quotes. Got $# arguments" >&2 + exit 1 +elif [[ "${1:0:1}" == "t" && $# -eq 1 ]]; then + echo "qtest.sh: Expecting txxxxxx followed by rbox and qhull options. Got tag '$1' only" >&2 + exit 1 +elif [[ "${1:0:1}" == "t" && $# -eq 2 ]]; then + echo "qtest.sh: Expecting txxxxxx followed by rbox and qhull options. Tag '$1' was followed by a qhull command -- $2" >&2 + exit 1 +elif [[ "${1:0:2}" == "QR" && $# -eq 1 ]]; then + echo "qtest.sh: Expecting QRxxxxxx followed by a qhull command. Got tag '$1' only" >&2 + exit 1 +elif [[ "${1:0:2}" == "QR" && $# -eq 3 ]]; then + echo "qtest.sh: Expecting QRxxxxxx followed by a qhull command. Got rbox options '$2' and qhull options '$3'" >&2 + exit 1 +elif [[ "${1:0:1}" != "t" && $# -eq 3 ]]; then + echo "qtest.sh: Expecting 'txxxx' with rbox and qhull options. Got unknown tag '$1' with two additional arguments" >&2 + exit 1 +elif [[ "${1:0:2}" != "QR" && "$1" != "log" && $# -eq 2 ]]; then + echo "qtest.sh: Expecting 'log' or 'QRxxxx' followed by a qhull command. Got unknown tag '$1' followed by one additional argument '$2'" >&2 + exit 1 +else + DEST="$QH_LOG_DEST" + DEST2="$QH_STEP_DEST" + GREP="$QH_LOG_GREP" + GREPX="keep 239874664" + GREP2="$QH_STEP_GREP" + GREPX2="keep 239874664" + ARG="$QH_STEP_ARG" + EXTRA="$QH_STEP_EXTRA" + if [[ "$QH_LOG" != "" ]]; then + GREP="$GREP|$QH_LOG" + fi + if [[ "$QH_LOGX" != "" ]]; then + GREPX="$QH_LOGX" + fi + if [[ "$QH_STEP" != "" ]]; then + GREP2="$GREP2|$QH_STEP" + fi + if [[ "$QH_STEPX" != "" ]]; then + GREPX2="$QH_STEPX" + fi + if [[ "$QH_ARG" != "" ]]; then + ARG="$QH_ARG" + fi + if [[ "$QH_EXTRA" != "" ]]; then + EXTRA="$EXTRA|$QH_EXTRA" + fi + if [[ "$1" == "log" ]]; then + echo "qtest.sh: log '$2 $Tnz' to '$DEST' and '$DEST2'" | tee "$DEST" | tee "$DEST2" >&2 + (echo -n "$HOSTNAME "; date ; pwd; ls -ld "$(which $QHULL)"; $QHULL -V) >> "$DEST" + if [[ $ISLOG -gt 0 ]]; then + echo "qtest.sh: $2 $Tnz | grep -n . | grep -E '$GREP' | grep -Ev '$GREPX' | tee -a '$DEST' | grep -E '$GREP2' | grep -Ev '$GREPX2' | tee -a '$DEST2'; (echo; echo ==== EXTRA $(date) ====; echo; grep '$ARG' -E '$EXTRA' '$DEST') | tee -a '$DEST2' " >&2 + echo -e " QH_LOG_DEST='$QH_LOG_DEST'\n QH_STEP_DEST='$QH_STEP_DEST'" >&2 + echo -e " QH_LOG_GREP='$QH_LOG_GREP'\n QH_STEP_GREP='$QH_STEP_GREP'" >&2 + echo -e " QH_STEP_ARG='$QH_STEP_ARG'\n QH_STEP_EXTRA='$QH_STEP_EXTRA'" >&2 + echo -e " QH_LOG='$QH_LOG'\n QH_LOGX='$QH_LOGX'" >&2 + echo -e " QH_ARG='$QH_ARG'\n QH_STEP='$QH_STEP'" >&2 + fi + #log-qhull + sh -c "$2 $Tnz" | grep -n . | grep -E "$GREP" | grep -Ev "$GREPX" | tee -a "$DEST" \ + | grep -E "$GREP2" | grep -Ev "$GREPX2" >> "$DEST2" + (echo; echo ==== EXTRA $(date) ====; echo; grep $ARG -E "$EXTRA" "$DEST") | tee -a "$DEST2" + elif [[ "${1:0:1}" == "t" ]]; then + echo "qtest.sh: logging 'rbox $2 $1 | $QHULL T4sz $3' to '$DEST' and '$DEST2'" | tee "$DEST" | tee "$DEST2" >&2 + (date; pwd; ls -ld "$(which $QHULL)"; $QHULL -V) >> "$DEST" + if [[ $ISLOG -gt 0 ]]; then + echo "qtest.sh: rbox $2 $i | $QHULL T4sz $3 | grep -E '$GREP' | grep -Ev '$GREPX' | tee -a '$DEST' | grep -E '$GREP2' | grep -Ev '$GREPX2' | tee -a '$DEST2'; (echo; echo ==== EXTRA $(date) ====; echo; grep '$ARG' -E '$EXTRA' '$DEST') | tee -a '$DEST2'" >&2 + echo -e " QH_TEST_DEST='$QH_TEST_DEST'\n QH_SHOW_DEST='$QH_SHOW_DEST'" >&2 + echo -e " QH_TEST_GREP='$QH_TEST_GREP'\n QH_SHOW_GREPX='$QH_SHOW_GREPX'" >&2 + echo -e " QH_TEST_ARG='$QH_TEST_ARG'\n QH_TEST_EXTRA='$QH_TEST_EXTRA'" >&2 + echo -e " QH_TEST='$QH_TEST'\n QH_TESTX='$QH_TESTX'" >&2 + echo -e " QH_SHOW='$QH_SHOW'\n QH_SHOWX='$QH_SHOWX'" >&2 + echo -e " QH_ARG='$QH_ARG'\n QH_EXTRA='$QH_EXTRA'" >&2 + fi + if ! rbox $2 $1 1000 >/dev/null; then + echo; echo "qtest.sh error: 'rbox $2 $1' failed" >&2 + exit 1 + fi + #log-t + rbox $2 $1 | $QHULL $Tnz $3 | grep -n . | grep -E "$GREP" | grep -Ev "$GREPX" | tee -a "$DEST" \ + | grep -E "$GREP2" | grep -Ev "$GREPX2" >> "$DEST2" + (echo; echo ==== EXTRA $(date) ====; echo; grep $ARG -E "$EXTRA" "$DEST") | tee -a "$DEST2" + elif [[ "${1:0:2}" == "QR" ]]; then + echo "qtest.sh: log '$2 $Tnz $1' to '$DEST' and '$DEST2'" | tee "$DEST" | tee "$DEST2" >&2 + (date; pwd; ls -ld "$(which $QHULL)"; $QHULL -V) >> "$DEST" + if [[ $ISLOG -gt 0 ]]; then + echo "qtest.sh: $2 $Tnz $1 | grep -n . | grep -E '$GREP' | grep -Ev '$GREPX' | tee -a '$DEST' | grep -E '$GREP2' | grep -Ev '$GREPX2' | tee -a '$DEST2'; (echo; echo ==== EXTRA $(date) ====; echo; grep '$ARG' -E '$EXTRA' '$DEST') | tee -a '$DEST2' " >&2 + echo -e " QH_LOG_DEST='$QH_LOG_DEST'\n QH_STEP_DEST='$QH_STEP_DEST'" >&2 + echo -e " QH_LOG_GREP='$QH_LOG_GREP'\n QH_STEP_GREP='$QH_STEP_GREP'" >&2 + echo -e " QH_STEP_ARG='$QH_STEP_ARG'\n QH_STEP_EXTRA='$QH_STEP_EXTRA'" >&2 + echo -e " QH_LOG='$QH_LOG'\n QH_LOGX='$QH_LOGX'" >&2 + echo -e " QH_ARG='$QH_ARG'\n QH_STEP='$QH_STEP'" >&2 + fi + #log-QR + sh -c "$2 $Tnz $1" | grep -n . | grep -E "$GREP" | grep -Ev "$GREPX" | tee -a "$DEST" \ + | grep -E "$GREP2" | grep -Ev "$GREPX2" >> "$DEST2" + (echo; echo ==== EXTRA $(date) ====; echo; grep $ARG -E "$EXTRA" "$DEST") | tee -a "$DEST2" + else + echo "qtest.sh: unexpected arguments, run 'qtest.sh' for help -- qtest.sh $1 $2 $3" + exit 1 + fi +fi + +# end of qtest.sh diff -Nru qhull-2015.2/File_id.diz qhull-2020.2/File_id.diz --- qhull-2015.2/File_id.diz 2016-01-18 23:59:11.000000000 +0000 +++ qhull-2020.2/File_id.diz 2020-07-25 00:51:35.000000000 +0000 @@ -1,4 +1,4 @@ -Qhull 2015.2 - Qhull computes convex hulls, +Qhull 2020.2 - Qhull computes convex hulls, Delaunay triangulations, halfspace inter- sections about a point, Voronoi diagrams, furthest-site Delaunay triangulations, and @@ -8,5 +8,4 @@ areas, and approximations. It runs in a command window under Windows 95/NT/XP/7. www.qhull.org, freeware. - - + \ No newline at end of file diff -Nru qhull-2015.2/html/index.htm qhull-2020.2/html/index.htm --- qhull-2015.2/html/index.htm 2016-01-18 23:59:11.000000000 +0000 +++ qhull-2020.2/html/index.htm 2020-08-30 15:46:35.000000000 +0000 @@ -15,12 +15,12 @@

    Up: Home page for Qhull
    -Up:Home page for Qhull (local)
    +Up: News about Qhull
    -Up: FAQ about Qhull
    -To: Qhull manual: Table of Contents -(please wait while loading)
    +Up: Qhull Wiki and +FAQ (local)
    +To: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -30,7 +30,7 @@ • QhullPrecisionTrace -• Functions
    +• Functions (local)


    @@ -87,12 +87,11 @@

    Brad Barber, Arlington, MA

    -

    Copyright © 1995-2015 C.B. Barber

    +

    Copyright © 1995-2020 C.B. Barber


    -

    »Qhull manual: Table of -Contents

    +

    »Qhull manual: contents

  • Description of Qhull @@ -127,12 +128,12 @@
  • Qhull programs, with instructions and examples
    • qconvex -- convex hulls -
    • qdelaunay -- Delaunay triangulations and - furthest-site Delaunay triangulations +
    • qdelaunay -- Delaunay triangulation +
    • qdelaunay Qu -- furthest-site Delaunay triangulation
    • qhalf -- halfspace intersections about a point
    • qhull -- all structures with additional options -
    • qvoronoi -- Voronoi diagrams and - furthest-site Voronoi diagrams +
    • qvoronoi -- Voronoi diagram +
    • qvoronoi Qu -- furthest-site Voronoi diagram
    • rbox -- generate point distributions for qhull

    @@ -157,7 +158,7 @@

  • Building Geomview for Windows
  • -

  • Qhull internals
      +
    • Qhull code
    • @@ -183,12 +183,11 @@ comp.graphics.algorithms

    • FAQ for computer graphics algorithms and - Exaflop's geometric structures. + Exaflop's geometric structures (archived).
    • Amenta's Directory - of Computational Geometry Software
    • + of Computational Geometry Software
    • Erickson's Computational - Geometry Software
    • + href="http://jeffe.cs.illinois.edu/compgeom/">Computational Geometry Software
    • Fukuda's introduction to convex hulls, Delaunay triangulations, @@ -212,8 +211,8 @@ triangulations, and furthest-site Voronoi diagrams.

      For convex hulls and halfspace intersections, Qhull may be used -for 2-d upto 8-d. For Voronoi diagrams and Delaunay triangulations, Qhull may be -used for 2-d upto 7-d. In higher dimensions, the size of the output +for 2-d up to 8-d. For Voronoi diagrams and Delaunay triangulations, Qhull may be +used for 2-d up to 7-d. In higher dimensions, the size of the output grows rapidly and Qhull does not work well with virtual memory. If n is the size of the input and d is the dimension (d>=3), the size of the output @@ -223,24 +222,26 @@ not try to build a 16-d convex hull of 1000 points. It will have on the order of 1,000,000,000,000,000,000,000,000 facets. -

      On a 600 MHz Pentium 3, Qhull computes the 2-d convex hull of -300,000 cocircular points in 11 seconds. It computes the -2-d Delaunay triangulation and 3-d convex hull of 120,000 points -in 12 seconds. It computes the -3-d Delaunay triangulation and 4-d convex hull of 40,000 points -in 18 seconds. It computes the -4-d Delaunay triangulation and 5-d convex hull of 6,000 points -in 12 seconds. It computes the -5-d Delaunay triangulation and 6-d convex hull of 1,000 points -in 12 seconds. It computes the -6-d Delaunay triangulation and 7-d convex hull of 300 points -in 15 seconds. It computes the -7-d Delaunay triangulation and 8-d convex hull of 120 points -in 15 seconds. It computes the -8-d Delaunay triangulation and 9-d convex hull of 70 points -in 15 seconds. It computes the -9-d Delaunay triangulation and 10-d convex hull of 50 points -in 17 seconds. The 10-d convex hull of 50 points has about 90,000 facets. +

      On a 1.7 GHz i7, Qhull computes the 2-d convex hull of +3,000,000 evenly spaced, cocircular points in 4.7 seconds. +It computes the +2-d Delaunay triangulation and 3-d convex hull of 600,000 points +in 5.9 seconds. It computes the +3-d Delaunay triangulation and 4-d convex hull of 120,000 points +in 4.6 seconds. It computes the +4-d Delaunay triangulation and 5-d convex hull of 30,000 points +in 5.1 seconds. It computes the +5-d Delaunay triangulation and 6-d convex hull of 6,000 points +in 7.8 seconds. It computes the +6-d Delaunay triangulation and 7-d convex hull of 1,000 points +in 7.6 seconds. It computes the +7-d Delaunay triangulation and 8-d convex hull of 300 points +in 8.6 seconds. It computes the +8-d Delaunay triangulation and 9-d convex hull of 120 points +in 5.7 seconds. It computes the +9-d Delaunay triangulation and 10-d convex hull of 70 points +in 4.8 seconds. +The 10-d convex hull of 70 cospherical points has about 375,000 facets.

      Qhull does not support constrained Delaunay @@ -248,12 +249,23 @@ generation of non-convex objects, or medium-sized inputs in 9-D and higher.

      -

      This is a big package with many options. It is one of the -fastest available. It is the only 3-d code that handles precision +

      This is a big package with many options. For 32-bit code, it is one of the +fastest available. It is the only 3-d and higher code that handles precision problems due to floating point arithmetic. For example, it implements the identity function for extreme points (see Imprecision in Qhull).

      +

      Qhull does not handle all precision problems (Limitations of merged facets). +For example, errors may occur for the 4-D Delaunay triangulation of nearly adjacent points in the unit cube. If every +input site has a nearly adjacent point within a 10^-13 ball, precision errors and topological errors are likely to +occur. A bounding box may alleviate these errors. Nearly adjacent points within substantially smaller or larger balls +are OK.

      + +

      Joggled input, option 'QJn', is an alternative to merged facets (Merged facets or joggled input). +It randomly perturbs the input. If precision problems occur, Qhull restarts with a larger, random perturbation. Joggled input +is a simple solution without the limitations of merged facets. For example, Qhull constructs a convex hull even if all of the input points +are identical.

      +

      If you need a short code for convex hull, Delaunay triangulation, or Voronoi volumes consider Clarkson's hull @@ -262,20 +274,22 @@ program. It is much faster than Qhull and it allows constraints. Both programs use exact arithmetic. They are in http://www.netlib.org/voronoi/. -Qhull version -1.0 may also meet your needs. It detects precision problems, -but does not handle them.

      + +

      If your input is in general position (i.e., no coplanar or colinear points), +Tomilov's quickhull.hpp (documentation-ru), +or Qhull version 1.0 may meet your needs. Both programs detect precision problems, +but do not handle them.

      CGAL is a library of efficient and reliable -geometric algoriths. It uses C++ templates and the Boost library to produce dimension-specific +geometric algorithms. It uses C++ templates and the Boost library to produce dimension-specific code. This allows more efficient use of memory than Qhull's general-dimension -code. CGAL simulates arbitrary precision while Qhull handles round-off error -with thick facets (Robustness Issues in CGAL, -Imprecision in Qhull). - +code. For 64-bit code, CGAL uses significantly less memory than Qhull and runs faster. +CGAL simulates arbitrary precision while Qhull handles round-off error +with thick facets. Compare the two approaches with Robustness Issues in CGAL, +and Imprecision in Qhull. -

      Leda is a +

      Leda is a library for writing computational geometry programs and other combinatorial algorithms. It includes routines for computing 3-d convex @@ -312,8 +326,7 @@ objects. Use qdelaunay to subdivide a convex object.

      -

      »Description of -Qhull

      +

      »Description of Qhull

      »definition

      @@ -405,9 +418,9 @@

      Single letters are used for output formats and precision constants. The other options are grouped into menus for formats ('F'), Geomview ('G '), printing ('G'), printing ('P'), Qhull control ('Q '), and tracing ('Q'), and tracing ('T'). The menu options may be listed together (e.g., 'GrD3' for 'Gr' and 'GD3'). Options may be in any order. Capitalized options take a numeric argument (except for 'A coordinate is a real number in floating point format.

    • A point is an array of d coordinates. - With option 'QJ', the + With option 'QJ', the coordinates are joggled by a small amount.
    • A vertex is an input point.
    • A hyperplane is d normal coefficients and @@ -533,7 +546,7 @@

    For examples, use option 'f'. See polyhedron operations for further +href="http://www.qhull.org/src/libqhull_r/qh-poly_r.htm">polyhedron operations (local) for further design documentation.

    @@ -556,13 +569,13 @@

    »Options for using Qhull

    -

    See Options.

    +

    See Qhull options.

    -

    »Qhull internals

    +

    »Qhull code and internals

    -

    See Internals.

    +

    See Qhull code.

    »Geomview, Qhull's @@ -599,7 +612,7 @@

    If using Xforms (e.g., for Geomview's External Modules), install the 'libXpm-devel' package from cygwin and move the xforms directory into your geomview directory, e.g.,
    mv xforms-1.2.4 geomview-1.9.5/xforms -

    Geomview's ndview provides multiple views into 4-d and higher objects. +

    Geomview's ndview provides multiple views into 4-d and higher objects. This module is out-of-date (geomview-users: 4dview). Download NDview-sgi.tar.Z at newpieces and 4dview at Geomview/modules. @@ -712,13 +725,12 @@ -

    »What to do if something goes wrong

    -

    Please report bugs to qhull_bug@qhull.org -. Please report if Qhull crashes. Please report if Qhull +

    Please report bugs to qhull_bug@qhull.org. +Please report if Qhull crashes. Please report if Qhull generates an "internal error". Please report if Qhull produces a poor approximate hull in 2-d, 3-d or 4-d. Please report documentation errors. Please report missing or incorrect @@ -747,7 +759,13 @@ facet is convex with its neighbors. It checks the topology of the convex hull.

    -

    Qhull should work on all inputs. It may report precision +

    Qhull resolves most precision issues. It reports +a precision error for lower dimensional inputs. It may report a precision +error for non-simplicial facets with multiple merges or nearly +adjacent vertices. See Limitations of merged facets for +more information. + +

    Qhull reports precision errors if you turn off merged facets with option 'Q0'. This can get as bad as facets with flipped orientation or two facets with the same vertices. You'll @@ -808,7 +826,7 @@

    A special thanks to Endocardial Solutions, Inc. of St. Paul, Minnesota for their support of the -internal documentation (src/libqhull/index.htm). They use Qhull to build 3-d models of +code documentation (src/libqhull_r/index.htm, local). They use Qhull to build 3-d models of heart chambers.

    Qhull 1.0 and 2.0 were developed under National Science Foundation @@ -828,7 +846,8 @@ -- A survey of a fundamental geometric data structure," ACM Computing Surveys, 1991, 23:345-405.

    -

    Barber, C. B., D.P. Dobkin, and H.T. +

    +Barber, C. B., D.P. Dobkin, and H.T. Huhdanpaa, "The Quickhull Algorithm for Convex Hulls," ACM Transactions on Mathematical Software, 22(4):469-483, Dec 1996, www.qhull.org [Edelsbrunner, H, Geometry and Topology for Mesh Generation, Cambridge University Press, 2001. -

    Gartner, B., "Fast and robust smallest enclosing balls", Algorithms - ESA '99, LNCS 1643. +

    Gartner, B., "Fast and robust smallest enclosing balls", Algorithms - ESA '99, LNCS 1643. -

    Golub, G.H. and van Loan, C.F., Matric Computations, Baltimore, Maryland, USA: John Hopkins Press, 1983 +

    Golub, G.H. and van Loan, C.F., Matric Computations, Baltimore, Maryland, USA: John Hopkins Press, 1983

    Fortune, S., "Computational geometry," in R. Martin, editor, Directions in Geometric @@ -893,11 +912,12 @@


    Up: Home page for Qhull
    +href="http://www.qhull.org">Home page for Qhull (local)
    Up:News about Qhull
    -Up: FAQ about Qhull
    -To: Qhull manual: Table of Contents
    +Up: Qhull Wiki and +FAQ (local)
    +To: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -907,12 +927,10 @@ • QhullPrecisionTrace -• Functions
    +• Functions (local)
    Dn: Imprecision in Qhull
    Dn: Description of Qhull examples
    -Dn: Qhull internals
    -Dn: Qhull functions, macros, and data -structures +Dn: Qhull code


    @@ -921,7 +939,7 @@ Home Page

    Comments to: qhull@qhull.org -
    +
    Created: Sept. 25, 1995 --- Last modified: see top

    diff -Nru qhull-2015.2/html/qconvex.htm qhull-2020.2/html/qconvex.htm --- qhull-2015.2/html/qconvex.htm 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/html/qconvex.htm 2020-08-16 17:57:34.000000000 +0000 @@ -8,8 +8,8 @@ Up: -Home page for Qhull
    -Up: Qhull manual -- Table of Contents
    +Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -19,7 +19,7 @@ • QhullPrecisionTrace -• Functions
    +• Functions (local)
    To: synopsis • input • outputs • controls • graphics @@ -61,7 +61,7 @@ points on its surface.
     
    Example: rbox x W1e-12 1000 | qconvex - QR0
    + QR0
    Compute the convex hull of 1000 points near the surface of a randomly rotated simplex. Report the maximum thickness of a facet.
    @@ -110,7 +110,7 @@ example, it will have 12 facets. Some facets may be degenerate and have zero area. -

    If you use 'QJ' (joggled input), +

    If you use 'QJ' (joggled input), all facets will be simplicial. The corresponding vertices will be slightly perturbed and identical points will be joggled apart. Joggled input is less accurate that triangulated @@ -125,46 +125,48 @@

    The 'qconvex' program is equivalent to -'qhull' in 2-d to 4-d, and -'qhull Qx' -in 5-d and higher. It disables the following Qhull +'qhull'. It disables the following Qhull options: d v H Qbb Qf Qg Qm Qr Qu Qv Qx Qz TR E V Fp Gt Q0,etc. -

    Copyright © 1995-2015 C.B. Barber

    +

    Copyright © 1995-2020 C.B. Barber


    »qconvex synopsis

    -qconvex- compute the convex hull.
    +qconvex -- compute the convex hull.
         input (stdin): dimension, number of points, point coordinates
         comments start with a non-numeric character
     
    -options (qconvex.htm):
    +options:
         Qt   - triangulated output
    -    QJ   - joggle input instead of merging facets
    +    QJ   - joggled input instead of merged facets
         Tv   - verify result: structure, convexity, and point inclusion
         .    - concise list of all options
    -    -    - one-line description of all options
    +    -    - one-line description of each option
    +    -?   - this message
    +    -V   - version
     
     output options (subset):
         s    - summary of results (default)
         i    - vertices incident to each facet
         n    - normals with offsets
    -    p    - vertex coordinates (includes coplanar points if 'Qc')
    +    p    - vertex coordinates (if 'Qc', includes coplanar points)
    +    FA   - report total area and volume
    +    FS   - total area and volume
         Fx   - extreme points (convex hull vertices)
    -    FA   - compute total area and volume
    -    o    - OFF format (dim, n, points, facets)
         G    - Geomview output (2-d, 3-d, and 4-d)
         m    - Mathematica output (2-d and 3-d)
    +    o    - OFF format (dim, n, points, facets)
         QVn  - print facets that include point n, -n if not
    -    TO file- output results to file, may be enclosed in single quotes
    +    TI file - input file, may be enclosed in single quotes
    +    TO file - output file, may be enclosed in single quotes
     
     examples:
         rbox c D2 | qconvex s n                    rbox c D2 | qconvex i
         rbox c D2 | qconvex o                      rbox 1000 s | qconvex s Tv FA
    -    rbox c d D2 | qconvex s Qc Fx              rbox y 1000 W0 | qconvex s n
    +    rbox c d D2 | qconvex s Qc Fx              rbox y 1000 W0 | qconvex Qc s n
         rbox y 1000 W0 | qconvex s QJ              rbox d G1 D12 | qconvex QR0 FA Pp
         rbox c D7 | qconvex FA TF1000
     
    @@ -181,7 +183,7 @@

    Use I/O redirection (e.g., qconvex < data.txt), a pipe (e.g., rbox 10 | qconvex), -or the 'TI' option (e.g., qconvex TI data.txt). +or the 'TI' option (e.g., qconvex TI data.txt).

    Comments start with a non-numeric character. Error reporting is simpler if there is one point per line. Dimension @@ -247,15 +249,15 @@

    Fx
    list extreme points (i.e., vertices). The first line is the number of extreme points. Each point is listed, one per line. The cube example - has eight vertices.
    + has eight vertices. In 2-d, extreme points are in counter-clockwise order.
    Fv
    list vertices for each facet. The first line is the number of facets. Each remaining line starts with the number of vertices. For the cube example, each facet has four vertices.
    i
    list vertices for each facet. The first line is the number of facets. The - remaining lines list the vertices for each facet. In 4-d and - higher, triangulate non-simplicial facets by adding an extra point.
    + remaining lines list the vertices for each facet. The facets are oriented. + In 4-d and higher, triangulate non-simplicial facets by adding an extra point.
     
     
    Coordinates
    @@ -264,7 +266,8 @@ first line is the dimension. The second line is the number of vertices, facets, and ridges. The vertex coordinates are next, followed by the facets. Each facet starts with - the number of vertices. The cube example has four vertices per facet. + the number of vertices. Simplicial and 3-d facets are oriented. The cube + example has four vertices per facet.
    Ft
    print a triangulation of the convex hull in OFF format. The first line is the dimension. The second line is the number of vertices and added points, @@ -387,14 +390,14 @@
    Qt
    triangulated output. Qhull triangulates non-simplicial facets. It may produce degenerate facets of zero area.
    -
    QJ
    +
    QJ
    joggle the input instead of merging facets. This guarantees simplicial facets (e.g., triangles in 3-d). It is less accurate than triangulated output ('Qt').
    Qc
    keep coplanar points
    Qi
    keep interior points
    -
    f
    +
    f
    facet dump. Print the data structure for each facet.
    QVn
    select facets containing point n as a vertex,
    @@ -407,7 +410,7 @@
    report progress after constructing n facets
    Tv
    verify result
    -
    TI file
    +
    TI file
    input data from file. The filename may not use spaces or quotes.
    TO file
    output results to file. Use single quotes if the filename @@ -480,7 +483,7 @@

    »qconvex options

    -qconvex- compute the convex hull
    +qconvex -- compute the convex hull
         http://www.qhull.org
     
     input (stdin):
    @@ -489,12 +492,13 @@
         comments:    start with a non-numeric character
     
     options:
    -    Qt   - triangulated output
    -    QJ   - joggle input instead of merging facets
         Qc   - keep coplanar points with nearest facet
         Qi   - keep interior points with nearest facet
    +    QJ   - joggled input instead of merged facets
    +    Qt   - triangulated output
     
     Qhull control options:
    +    Qa   - allow input with fewer or more points than coordinates
         Qbk:n   - scale coord k so that low bound is n
           QBk:n - scale coord k so that upper bound is n (QBk is 0.5)
         QbB  - scale input to unit cube centered at the origin
    @@ -502,23 +506,33 @@
         QJn  - randomly joggle input in range [-n,n]
         QRn  - random rotation (n=seed, n=0 time, n=-1 time/no rotate)
         Qs   - search all points for the initial simplex
    +
    +Qhull extra options:
         QGn  - good facet if visible from point n, -n for not visible
         QVn  - good facet if it includes point n, -n if not
    +    Qw   - allow option warnings
    +    Q12  - allow wide facets and wide dupridge
    +    Q14  - merge pinched vertices that create a dupridge
    +
    +T options:
    +    TFn  - report summary when n or more facets created
    +    TI file - input file, may be enclosed in single quotes
    +    TO file - output file, may be enclosed in single quotes
    +    Ts   - statistics
    +    Tv   - verify result: structure, convexity, and in-circle test
    +    Tz   - send all output to stdout
     
     Trace options:
         T4   - trace at level n, 4=all, 5=mem/gauss, -1= events
    +    Ta   - annotate output with message codes
    +    TAn  - stop qhull after adding n vertices
    +     TCn - stop qhull after building cone for point n
    +     TVn - stop qhull after adding point n, -n for before
         Tc   - check frequently during execution
    -    Ts   - print statistics
    -    Tv   - verify result: structure, convexity, and point inclusion
    -    Tz   - send all output to stdout
    -    TFn  - report summary when n or more facets created
    -    TI file - input data from file, no spaces or single quotes
    -    TO file - output results to file, may be enclosed in single quotes
    +    Tf   - flush each qh_fprintf for debugging segfaults
         TPn  - turn on tracing when point n added to hull
          TMn - turn on tracing at merge n
          TWn - trace merge facets when width > n
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)
    -     TCn - stop qhull after building cone for point n (see TVn)
     
     Precision options:
         Cn   - radius of centrum (roundoff added).  Merge facets if non-convex
    @@ -534,7 +548,7 @@
         i    - vertices incident to each facet
         m    - Mathematica output (2-d and 3-d)
         n    - normals with offsets
    -    o    - OFF file format (dim, points and facets; Voronoi regions)
    +    o    - OFF file format (dim, points and facets)
         p    - point coordinates
         s    - summary (stderr)
     
    @@ -558,11 +572,10 @@
         FP   - nearest vertex for each coplanar point
         FQ   - command used for qconvex
         Fs   - summary: #int (8), dimension, #points, tot vertices, tot facets,
    -                      for output: #vertices, #facets,
    -                                  #coplanar points, #non-simplicial facets
    +                      output: #vertices, #facets, #coplanars, #nonsimplicial
                         #real (2), max outer plane, min vertex
         FS   - sizes:   #int (0)
    -                    #real(2) tot area, tot volume
    +                    #real (2) tot area, tot volume
         Ft   - triangulation with centrums for non-simplicial facets (OFF format)
         Fv   - count plus vertices for each facet
         FV   - average of vertices (a feasible point for 'H')
    @@ -572,20 +585,20 @@
         Ga   - all points as dots
          Gp  -  coplanar points and vertices as radii
          Gv  -  vertices as spheres
    +    Gc   - centrums
    +    GDn  - drop dimension n in 3-d and 4-d output
    +    Gh   - hyperplane intersections
         Gi   - inner planes only
          Gn  -  no planes
          Go  -  outer planes only
    -    Gc   - centrums
    -    Gh   - hyperplane intersections
         Gr   - ridges
    -    GDn  - drop dimension n in 3-d and 4-d output
     
     Print options:
         PAn  - keep n largest facets by area
    -    Pdk:n - drop facet if normal[k] <= n (default 0.0)
    +    Pdk:n - drop facet if normal[k] <= n (default 0.0)
         PDk:n - drop facet if normal[k] >= n
    -    Pg   - print good facets (needs 'QGn' or 'QVn')
         PFn  - keep facets whose area is at least n
    +    Pg   - print good facets (needs 'QGn' or 'QVn')
         PG   - print neighbors of good facets
         PMn  - keep n facets with most merges
         Po   - force output.  If error, output neighborhood of facet
    @@ -593,14 +606,15 @@
     
         .    - list of all options
         -    - one line descriptions of all options
    -
    +    -?   - help with examples
    +    -V   - version
     

    -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -610,7 +624,7 @@ • QhullPrecisionTrace -• Functions
    +• Functions (local)
    To: synopsis • input • outputs • controls • graphics @@ -624,7 +638,7 @@ Home Page

    Comments to: qhull@qhull.org -
    +
    Created: Sept. 25, 1995 --- Last modified: see top

    diff -Nru qhull-2015.2/html/qdelau_f.htm qhull-2020.2/html/qdelau_f.htm --- qhull-2015.2/html/qdelau_f.htm 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/html/qdelau_f.htm 2020-08-16 17:53:45.000000000 +0000 @@ -8,8 +8,8 @@ Up: -Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -19,7 +19,7 @@ • QhullPrecisionTrace -• Functions
    +• Functions (local)
    To: synopsis • input • outputs • controls • graphics @@ -53,7 +53,7 @@
     
    Example: rbox 10 D2 | qdelaunay Qu QJ s + href="qh-optq.htm#QJ">QJ s i TO result
    Compute the 2-d, furthest-site Delaunay triangulation of 10 random @@ -108,14 +108,12 @@

    The 'qdelaunay' program is equivalent to -'qhull d Qbb' in 2-d to 3-d, and -'qhull d Qbb Qx' -in 4-d and higher. It disables the following Qhull +'qhull d Qbb'. It disables the following Qhull options: d n v H U Qb QB Qc Qf Qg Qi -Qm Qr QR Qv Qx TR E V FC Fi Fo Fp FV Q0,etc. +Qm Qr Qv Qx TR E V FC Fi Fo Fp Ft FV Q0,etc. -

    Copyright © 1995-2015 C.B. Barber

    +

    Copyright © 1995-2020 C.B. Barber


    @@ -129,8 +127,8 @@

    »furthest-site qdelaunay input

    -
    +

    The input data on stdin consists of:

    • dimension @@ -139,7 +137,7 @@

    Use I/O redirection (e.g., qdelaunay Qu < data.txt), a pipe (e.g., rbox 10 | qdelaunay Qu), -or the 'TI' option (e.g., qdelaunay Qu TI data.txt). +or the 'TI' option (e.g., qdelaunay Qu TI data.txt).

    For example, this is a square containing four random points. Its furthest-site Delaunay @@ -285,12 +283,16 @@

    QJ
    joggle the input to avoid cospherical and coincident sites. It is less accurate than triangulated output ('Qt').
    +
    QRn
    +
    randomly rotate the input with a random seed of n. If n=0, the + seed is the time. If n=-1, use time for the random seed, but do + not rotate the input.
    QVn
    select facets adjacent to input site n (marked 'good').
    Tv
    verify result.
    -
    TI file
    +
    TI file
    input data from file. The filename may not use spaces or quotes.
    TO file
    output results to file. Use single quotes if the filename @@ -341,7 +343,7 @@

    Furthest-site Delaunay triangulations do not include facets that are coplanar with the convex hull of the input sites. A facet is coplanar if the last coefficient of its normal is -nearly zero (see qh_ZEROdelaunay). +nearly zero (see qh_ZEROdelaunay).

    »furthest-site qdelaunay conventions

    @@ -385,8 +387,8 @@
    -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -396,7 +398,7 @@ • QhullPrecisionTrace -• Functions
    +• Functions (local)
    To: synopsis • input • outputs • controls • graphics @@ -410,7 +412,7 @@ Home Page

    Comments to: qhull@qhull.org -
    +
    Created: Sept. 25, 1995 --- Last modified: see top

    diff -Nru qhull-2015.2/html/qdelaun.htm qhull-2020.2/html/qdelaun.htm --- qhull-2015.2/html/qdelaun.htm 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/html/qdelaun.htm 2020-08-16 17:53:45.000000000 +0000 @@ -8,8 +8,8 @@ Up: -Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -19,7 +19,7 @@ • QhullPrecisionTrace -• Functions
    +• Functions (local)
    To: synopsis • input • outputs • controls • graphics @@ -57,7 +57,7 @@ regions to the console. Produce triangulated output.
     
    Example: rbox 10 D2 | qdelaunay QJ s + href="qh-optq.htm#QJ">QJ s i TO result
    Compute the 2-d Delaunay triangulation of 10 random @@ -70,7 +70,7 @@

    Qhull computes the Delaunay triangulation by computing a convex hull. It lifts the input sites to a paraboloid by adding the sum of the squares of the coordinates. It scales the height -of the paraboloid to improve numeric precision ('Qbb'). +of the paraboloid to improve numeric precision ('Qbb'). It computes the convex hull of the lifted sites, and projects the lower convex hull to the input. @@ -82,7 +82,7 @@ See the examples, Delaunay and Voronoi diagrams.

    -

    See Qhull FAQ - Delaunay and +

    See Qhull FAQ (local) - Delaunay and Voronoi diagram questions.

    By default, qdelaunay merges cocircular and cospherical regions. @@ -113,46 +113,48 @@

    The 'qdelaunay' program is equivalent to -'qhull d Qbb' in 2-d to 3-d, and -'qhull d Qbb Qx' -in 4-d and higher. It disables the following Qhull +'qhull d Qbb'. +It disables the following Qhull options: d n v H U Qb QB Qc Qf Qg Qi -Qm Qr QR Qv Qx TR E V FC Fi Fo Fp Ft FV Q0,etc. +Qm Qr Qv Qx TR E V FC Fi Fo Fp Ft FV Q0,etc. -

    Copyright © 1995-2015 C.B. Barber

    +

    Copyright © 1995-2020 C.B. Barber


    »qdelaunay synopsis

    -qdelaunay- compute the Delaunay triangulation.
    +qdelaunay -- compute the Delaunay triangulation.
         input (stdin): dimension, number of points, point coordinates
         comments start with a non-numeric character
     
    -options (qdelaun.htm):
    -    Qt   - triangulated output
    -    QJ   - joggle input instead of merging facets
    +options:
         Qu   - furthest-site Delaunay triangulation
    +    Qt   - triangulated output
    +    QJ   - joggled input instead of merged facets
         Tv   - verify result: structure, convexity, and in-circle test
         .    - concise list of all options
    -    -    - one-line description of all options
    +    -    - one-line description of each option
    +    -?   - this message
    +    -V   - version
     
     output options (subset):
         s    - summary of results (default)
         i    - vertices incident to each Delaunay region
         Fx   - extreme points (vertices of the convex hull)
    -    o    - OFF format (shows the points lifted to a paraboloid)
         G    - Geomview output (2-d and 3-d points lifted to a paraboloid)
         m    - Mathematica output (2-d inputs lifted to a paraboloid)
    +    o    - OFF format (shows the points lifted to a paraboloid)
         QVn  - print Delaunay regions that include point n, -n if not
    -    TO file- output results to file, may be enclosed in single quotes
    +    TI file - input file, may be enclosed in single quotes
    +    TO file - output file, may be enclosed in single quotes
     
     examples:
         rbox c P0 D2 | qdelaunay s o          rbox c P0 D2 | qdelaunay i
    -    rbox c P0 D3 | qdelaunay Fv Qt        rbox c P0 D2 | qdelaunay s Qu Fv
    -    rbox c G1 d D2 | qdelaunay s i        rbox c G1 d D2 | qdelaunay s i Qt
    +    rbox c P0 D2 | qdelaunay Fv           rbox c P0 D2 | qdelaunay s Qu Fv
    +    rbox c G1 d D2 | qdelaunay s i        rbox c G1 d D2 | qdelaunay Qt
         rbox M3,4 z 100 D2 | qdelaunay s      rbox M3,4 z 100 D2 | qdelaunay s Qt
     
    @@ -169,7 +171,7 @@

    Use I/O redirection (e.g., qdelaunay < data.txt), a pipe (e.g., rbox 10 | qdelaunay), -or the 'TI' option (e.g., qdelaunay TI data.txt). +or the 'TI' option (e.g., qdelaunay TI data.txt).

    For example, this is four cocircular points inside a square. Its Delaunay triangulation contains 8 triangles and one four-sided @@ -189,6 +191,7 @@ 1 -1 1 1 +

    qdelaunay s i < data

    @@ -325,6 +328,10 @@
        
    QJ
    joggle the input to avoid cospherical and coincident sites. It is less accurate than triangulated output ('Qt').
    +
    QRn
    +
    randomly rotate the input with a random seed of n. If n=0, the + seed is the time. If n=-1, use time for the random seed, but do + not rotate the input.
    Qu
    compute the furthest-site Delaunay triangulation.
    Qz
    @@ -338,7 +345,7 @@ 'good').
    Tv
    verify result.
    -
    TI file
    +
    TI file
    input data from file. The filename may not use spaces or quotes.
    TO file
    output results to file. Use single quotes if the filename @@ -363,12 +370,14 @@ hull (a paraboloid).

    To view a 2-d Delaunay triangulation, use 'qdelaunay GrD2' to drop the last dimension. This +href="qh-optg.htm#GDn">GrD2' to drop the last dimension and view ridges. +This is the same as viewing the hull without perspective (see Geomview's 'cameras' menu).

    To view a 3-d Delaunay triangulation, use 'qdelaunay GrD3' to drop the last dimension. You +href="qh-optg.htm#GDn">GrD3' to drop the last dimension and +view ridges. You may see extra edges. These are interior edges that Geomview moves towards the viewer (see 'lines closer' in Geomview's camera options). Use option 'Gt' to make @@ -404,7 +413,7 @@

    Delaunay triangulations do not include facets that are coplanar with the convex hull of the input sites. A facet is coplanar if the last coefficient of its normal is -nearly zero (see qh_ZEROdelaunay). +nearly zero (see qh_ZEROdelaunay).

    See Imprecision issues :: Delaunay triangulations for a discussion of precision issues. Deleted vertices indicate @@ -423,14 +432,16 @@ approximately linear for reasonably sized point sets.

    With the Qhull library, you -can use qh_findbestfacet in poly2.c to locate the facet -that contains a point. You should first lift the point to the +can use qh_findbestfacet in poly2.c to locate the facet or adjacent +facet that contains a point. First lift the point to the paraboloid (i.e., the last coordinate is the sum of the squares of the point's coordinates -- qh_setdelaunay). Do not use options 'Qbb', 'QbB', 'Qbk:n', or 'QBk:n' since these scale the last -coordinate.

    +coordinate. See locate a facet with +qh_findbestfacet() +

    If a point is interior to the convex hull of the input set, it is interior to the adjacent vertices of the Delaunay @@ -491,7 +502,7 @@

    »qdelaunay options

    -qdelaunay- compute the Delaunay triangulation
    +qdelaunay -- compute the Delaunay triangulation
         http://www.qhull.org
     
     input (stdin):
    @@ -500,31 +511,43 @@
         comments:    start with a non-numeric character
     
     options:
    +    QJ   - joggled input instead of merged facets
         Qt   - triangulated output
    -    QJ   - joggle input instead of merging facets
         Qu   - compute furthest-site Delaunay triangulation
     
     Qhull control options:
    +    Qa   - allow input with fewer or more points than coordinates
         QJn  - randomly joggle input in range [-n,n]
    +    QRn  - random rotation (n=seed, n=0 time, n=-1 time/no rotate)
         Qs   - search all points for the initial simplex
         Qz   - add point-at-infinity to Delaunay triangulation
    +
    +Qhull extra options:
         QGn  - print Delaunay region if visible from point n, -n if not
         QVn  - print Delaunay regions that include point n, -n if not
    +    Qw   - allow option warnings
    +    Q12  - allow wide facets and wide dupridge
    +    Q14  - merge pinched vertices that create a dupridge
    +
    +T options:
    +    TFn  - report summary when n or more facets created
    +    TI file - input file, may be enclosed in single quotes
    +    TO file - output file, may be enclosed in single quotes
    +    Ts   - statistics
    +    Tv   - verify result: structure, convexity, and in-circle test
    +    Tz   - send all output to stdout
     
     Trace options:
         T4   - trace at level n, 4=all, 5=mem/gauss, -1= events
    +    Ta   - annotate output with message codes
    +    TAn  - stop qhull after adding n vertices
    +     TCn - stop qhull after building cone for point n
    +     TVn - stop qhull after adding point n, -n for before
         Tc   - check frequently during execution
    -    Ts   - print statistics
    -    Tv   - verify result: structure, convexity, and in-circle test
    -    Tz   - send all output to stdout
    -    TFn  - report summary when n or more facets created
    -    TI file - input data from file, no spaces or single quotes
    -    TO file - output results to file, may be enclosed in single quotes
    +    Tf   - flush each qh_fprintf for debugging segfaults
         TPn  - turn on tracing when point n added to hull
          TMn - turn on tracing at merge n
          TWn - trace merge facets when width > n
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)
    -     TCn - stop qhull after building cone for point n (see TVn)
     
     Precision options:
         Cn   - radius of centrum (roundoff added).  Merge facets if non-convex
    @@ -558,7 +581,7 @@
         FP   - nearest point and distance for each coincident point
         FQ   - command used for qdelaunay
         Fs   - summary: #int (8), dimension, #points, tot vertices, tot facets,
    -                    for output: #vertices, #Delaunay regions,
    +                    output: #vertices, #Delaunay regions,
                                     #coincident points, #non-simplicial regions
                         #real (2), max outer plane, min vertex
         FS   - sizes:   #int (0)
    @@ -566,25 +589,25 @@
         Fv   - count plus vertices for each Delaunay region
         Fx   - extreme points of Delaunay triangulation (on convex hull)
     
    -Geomview options (2-d and 3-d)
    +Geomview output (2-d and 3-d points lifted to a paraboloid)
         Ga   - all points as dots
          Gp  -  coplanar points and vertices as radii
          Gv  -  vertices as spheres
    +    Gc   - centrums
    +    GDn  - drop dimension n in 3-d and 4-d output
    +    Gh   - hyperplane intersections
         Gi   - inner planes only
          Gn  -  no planes
          Go  -  outer planes only
    -    Gc     - centrums
    -    Gh   - hyperplane intersections
         Gr   - ridges
    -    GDn  - drop dimension n in 3-d and 4-d output
         Gt   - transparent outer ridges to view 3-d Delaunay
     
     Print options:
         PAn  - keep n largest Delaunay regions by area
    -    Pdk:n - drop facet if normal[k] <= n (default 0.0)
    +    Pdk:n - drop facet if normal[k] <= n (default 0.0)
         PDk:n - drop facet if normal[k] >= n
    -    Pg   - print good Delaunay regions (needs 'QGn' or 'QVn')
         PFn  - keep Delaunay regions whose area is at least n
    +    Pg   - print good Delaunay regions (needs 'QGn' or 'QVn')
         PG   - print neighbors of good regions (needs 'QGn' or 'QVn')
         PMn  - keep n Delaunay regions with most merges
         Po   - force output.  If error, output neighborhood of facet
    @@ -592,13 +615,15 @@
     
         .    - list of all options
         -    - one line descriptions of all options
    +    -?   - help with examples
    +    -V   - version
     

    -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -608,7 +633,7 @@ • QhullPrecisionTrace -• Functions
    +• Functions (local)
    To: synopsis • input • outputs • controls • graphics @@ -622,7 +647,7 @@ Home Page

    Comments to: qhull@qhull.org -
    +
    Created: Sept. 25, 1995 --- Last modified: see top

    diff -Nru qhull-2015.2/html/qhalf.htm qhull-2020.2/html/qhalf.htm --- qhull-2015.2/html/qhalf.htm 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/html/qhalf.htm 2020-08-16 17:53:45.000000000 +0000 @@ -7,8 +7,8 @@ -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -18,7 +18,7 @@ • QhullPrecisionTrace -• Functions
    +• Functions (local)
    To: synopsis • input • outputs • controls • graphics @@ -40,15 +40,23 @@

    -

    Example: rbox c | qconvex FQ FV - n | qhalf

    Example: rbox c | qconvex + FV n | qhalf Fp

    Print the intersection of the facets of a cube. rbox c - generates the vertices of a cube. qconvex FV n returns of average - of the cube's vertices (in this case, the origin) and the halfspaces - that define the cube. qhalf Fp computes the intersection of - the halfspaces about the origin. The intersection is the vertices - of the original cube.
    + generates the vertices of a cube. qconvex FV returns a feasible + point for halfspace intersection. This feasible or interior point, + qconvex FV, is the average of the cube's vertices (i.e., the origin). + qconvex n returns the halfspaces that define the cube. + qhalf Fp computes the intersection of the halfspaces about the + feasible point. The intersection is the vertices of the original cube.
    + +

    Example: rbox c | qconvex FQ + n | qhalf H0.1,0.1,0.1

    +
    Compute the intersection of the facets of a cube and print a summary ('s'). + Option 'FQ' prints the qconvex command as an input comment for the summary. + 'qhalf Hn,n,n' specifies the feasible point as [0.1, 0.1, 0.1]. 'qhalf H0' would specify the + feasible point as the origin.

    Example: rbox c d G0.55 | qconvex FQ FV n | qhalf d halfspaces. See the sphere example. +

    The identity pipeline for Qhull starts with points, produces the halfspaces for their convex hull, and +intersects these halfspaces, returning the original points. For example, 'rbox c' is the unit cube. +

    +	rbox c | qconvex FV n | qhalf Fp
    +	3
    +	8
    +	  -0.5    0.5    0.5
    +	   0.5    0.5    0.5
    +	  -0.5    0.5   -0.5
    +	   0.5    0.5   -0.5
    +	   0.5   -0.5    0.5
    +	  -0.5   -0.5    0.5
    +	   0.5   -0.5   -0.5
    +	  -0.5   -0.5   -0.5
    +
    +

    You can try triangulated output ('Qt') and joggled input ('QJ'). It demonstrates that triangulated output is more accurate than joggled input. @@ -112,47 +136,47 @@ href="qh-impre.htm#joggle">Merged facets or joggled input.

    The 'qhalf' program is equivalent to -'qhull H' in 2-d to 4-d, and -'qhull H Qx' -in 5-d and higher. It disables the following Qhull +'qhull H'. It disables the following Qhull options: d n v Qbb QbB Qf Qg Qm -Qr QR Qv Qx Qz TR E V Fa FA FC FD FS Ft FV Gt Q0,etc. +Qr Qv Qx Qz TR E V Fa FA FC FD FS Ft FV Gt Q0,etc. -

    Copyright © 1995-2015 C.B. Barber

    +

    Copyright © 1995-2020 C.B. Barber


    »qhalf synopsis

    -qhalf- halfspace intersection about a point.
    -    input (stdin): [dim, 1, interior point]
    -                   dim+1, n
    -                   halfspace coefficients + offset
    +qhalf -- halfspace intersection about a point.
    +    input (stdin): [dimension, 1, interior point]
    +                       dimension+1, number of halfspaces, coefficients+offset
         comments start with a non-numeric character
     
    -options (qhalf.htm):
    +options:
         Hn,n - specify coordinates of interior point
         Qt   - triangulated output
    -    QJ   - joggle input instead of merging facets
    +    QJ   - joggled input instead of merged facets
         Tv   - verify result: structure, convexity, and redundancy
         .    - concise list of all options
    -    -    - one-line description of all options
    +    -    - one-line description of each option
    +    -?   - this message
    +    -V   - version
     
     output options (subset):
         s    - summary of results (default)
         Fp   - intersection coordinates
         Fv   - non-redundant halfspaces incident to each intersection
         Fx   - non-redundant halfspaces
    -    o    - OFF file format (dual convex hull)
         G    - Geomview output (dual convex hull)
         m    - Mathematica output (dual convex hull)
    +    o    - OFF file format (dual convex hull)
         QVn  - print intersections for halfspace n, -n if not
    -    TO file - output results to file, may be enclosed in single quotes
    +    TI file - input file, may be enclosed in single quotes
    +    TO file - output file, may be enclosed in single quotes
     
     examples:
    -    rbox d | qconvex n | qhalf s H0,0,0 Fp
    -    rbox c | qconvex FV n | qhalf s i
    -    rbox c | qconvex FV n | qhalf s o
    +    rbox d | qconvex FQ n | qhalf s H0,0,0 Fp
    +    rbox c | qconvex FQ FV n | qhalf s i
    +    rbox c | qconvex FQ FV n | qhalf s o
     

    »qhalf input

    @@ -160,11 +184,11 @@

    The input data on stdin consists of:

      -
    • [optional] interior point +
    • [optional] feasible point
      • dimension
      • 1 -
      • coordinates of interior point +
      • coordinates of feasible point
    • dimension + 1
    • number of halfspaces
    • @@ -172,18 +196,18 @@

    Use I/O redirection (e.g., qhalf < data.txt), a pipe (e.g., rbox c | qconvex FV n | qhalf), -or the 'TI' option (e.g., qhalf TI data.txt). +or the 'TI' option (e.g., qhalf TI data.txt). -

    Qhull needs an interior point to compute the halfspace -intersection. An interior point is clearly inside all of the halfspaces. +

    Qhull needs a feasible point to compute the halfspace +intersection. A feasible point is clearly inside all of the halfspaces. A point is inside a halfspace if its distance to the corresponding hyperplane is negative. -

    The interior point may be listed at the beginning of the input (as shown above). +

    The feasible point may be listed at the beginning of the input (as shown above). If not, option -'Hn,n' defines the interior point as +'Hn,n' defines the feasible point as [n,n,0,...] where 0 is the default coordinate (e.g., 'H0' is the origin). Use linear programming if you do not know -the interior point (see halfspace notes),

    +the feasible point (see halfspace notes),

    The input to qhalf is a set of halfspaces that are defined by their hyperplanes. Each halfspace is defined by @@ -193,7 +217,7 @@ The vector may have any length. If it has length one, the offset is the distance from the origin to the halfspace's boundary. Points in the halfspace have a negative distance to the hyperplane. -The distance from the interior point to each +The distance from the feasible point to each halfspace is likewise negative.

    The halfspace format is the same as Qhull's output options ' 

    Intersections
    FN
    -
    list intersection points for each non-redundant +
    list intersection points for each halfspace. The first line - is the number of non-redundant halfspaces. Each remaining - lines starts with the number of intersection points. For the cube + is the number of halfspaces. Each remaining + line starts with the number of intersection points. Redundant halfspaces + have 0 intersection points. For the cube example, each halfspace has four intersection points.
    Fn
    list neighboring intersections for each intersection point. The first line - is the number of intersection points. Each remaining line - starts with the number of neighboring intersections. For the cube - example, each intersection point has three neighboring intersections. + is the number of intersection points. Each following line + starts with the number of neighboring intersections. + For the cube example, each intersection point has three neighboring intersections.

    In 3-d, a non-simplicial intersection has more than three neighboring intersections. For random data (e.g., the sphere example), non-simplicial intersections are the norm. @@ -285,7 +310,8 @@

    Fp
    print intersection coordinates. The first line is the dimension and the second line is the number of intersection points. The following lines are the - coordinates of each intersection.
    + coordinates of each intersection point. The "infinity" point, +[-10.101,-10.101,...] (qh_INFINITE), indicates an unbounded intersection.
    FI
    list intersection IDs. The first line is the number of intersections. The IDs follow, one per line.
    @@ -297,19 +323,19 @@ non-redundant halfspaces. The other lines list one halfspace per line. A halfspace is non-redundant if it defines a facet of the intersection. Redundant halfspaces are ignored. For - the cube example, all of the halfspaces are non-redundant. + the cube example, none of the halfspaces are redundant.
    Fv
    list non-redundant halfspaces incident to each intersection point. The first line is the number of non-redundant halfspaces. Each remaining line starts with the number - of non-redundant halfspaces. For the - cube example, each intersection is incident to three halfspaces.
    + of non-redundant halfspaces incident to that point. For the + cube example, each intersection point is incident to three halfspaces.
    i
    list non-redundant halfspaces incident to each intersection point. The first line is the number of intersection points. Each remaining line - lists the incident, non-redundant halfspaces. For the - cube example, each intersection is incident to three halfspaces. + lists the incident, non-redundant halfspaces for that intersection point. For the + cube example, each intersection point is incident to three halfspaces.
    Fc
    list coplanar halfspaces for each intersection point. The first line is @@ -317,7 +343,7 @@ the number of coplanar halfspaces. A coplanar halfspace is listed for one intersection point even though it is coplanar to multiple intersection points.
    -
    Qi Fc
    +
    Qi Fc
    list redundant halfspaces for each intersection point. The first line is the number of intersection points. Each remaining line starts with the number of redundant halfspaces. Use options 'Qc Qi Fc' to list @@ -338,7 +364,7 @@
    print vertex coordinates of the dual convex hull. Each vertex corresponds to a non-redundant halfspace. Its coordinates are the negative of the hyperplane's coefficients divided by the offset plus the inner product of the coefficients and - the interior point (-c/(b+a.p). + the feasible point (-c/(b+a.p). Options 'p Qc' includes coplanar halfspaces. Options 'p Qi' includes redundant halfspaces.
    m
    @@ -362,10 +388,14 @@
    triangulated output. If a 3-d intersection is defined by more than three hyperplanes, Qhull produces duplicate intersections -- one for each extra hyperplane.
    +
    QRn
    +
    randomly rotate the input with a random seed of n. If n=0, the + seed is the time. If n=-1, use time for the random seed, but do + not rotate the input.
    QJ
    joggle the input instead of merging facets. In 3-d, this guarantees that each intersection is defined by three hyperplanes.
    -
    f
    +
    f
    facet dump. Print the data structure for each intersection (i.e., facet)
    TFn
    @@ -382,7 +412,7 @@ halfspace intersection in one lower dimension.
    Tv
    verify result
    -
    TI file
    +
    TI file
    input data from file. The filename may not use spaces or quotes.
    TO file
    output results to file. Use single quotes if the filename @@ -412,7 +442,7 @@

    See halfspace intersection for precision issues related to qhalf.

    -

    If you do not know an interior point for the halfspaces, use +

    If you do not know a feasible point for the halfspaces, use linear programming to find one. Assume, n halfspaces defined by: aj*x1+bj*x2+cj*x3+dj<=0, j=1..n. Perform the following linear program:

    @@ -429,21 +459,21 @@

    -

    and conclude that the point [x1/x4,x2/x4,x3/x4] is in -the interior of all the halfspaces. Since x5 is -optimal, this point is "way in" the interior (good +

    and conclude that the point [x1/x4,x2/x4,x3/x4] is +inside all the halfspaces. Since x5 is +optimal, this feasible point is "clearly inside" the halfspaces (good for precision errors).

    -

    After finding an interior point, the rest of the intersection +

    After finding a feasible point, the rest of the intersection algorithm is from Preparata & Shamos ['85, p. 316, "A simple case -..."]. Translate the halfspaces so that the interior point +..."]. Translate the halfspaces so that the feasible point is the origin. Calculate the dual polytope. The dual polytope is the convex hull of the vertices dual to the original faces in regard to the unit sphere (i.e., halfspaces at distance d from the origin are dual to vertices at distance 1/d). Then calculate the resulting polytope, which is the dual of the -dual polytope, and translate the origin back to the interior +dual polytope, and translate the origin back to the feasible point [S. Spitz, S. Teller, D. Strawn].

    @@ -459,11 +489,11 @@ conventions and Qhull's data structures.

      -
    • interior point - a point in the intersection of - the halfspaces. Qhull needs an interior point to compute +
    • feasible or interior point - a point in the intersection of + the halfspaces. Qhull needs a feasible point to compute the intersection. See halfspace input.
    • halfspace - d coordinates for the - normal and a signed offset. The distance to an interior + normal and a signed offset. The distance to the feasible point is negative.
    • non-redundant halfspace - a halfspace that defines an output facet
    • @@ -488,7 +518,7 @@

      »qhalf options

      -qhalf- compute the intersection of halfspaces about a point
      +qhalf -- compute the intersection of halfspaces about a point
           http://www.qhull.org
       
       input (stdin):
      @@ -499,32 +529,44 @@
       
       options:
           Hn,n - specify coordinates of interior point
      -    Qt   - triangulated ouput
      -    QJ   - joggle input instead of merging facets
           Qc   - keep coplanar halfspaces
           Qi   - keep other redundant halfspaces
      +    QJ   - joggled input instead of merged facets
      +    Qt   - triangulated output
       
       Qhull control options:
      -    QJn  - randomly joggle input in range [-n,n]
      +    Qa   - allow input with fewer or more points than coordinates
           Qbk:0Bk:0 - remove k-th coordinate from input
      +    QJn  - randomly joggle input in range [-n,n]
      +    QRn  - random rotation (n=seed, n=0 time, n=-1 time/no rotate)
           Qs   - search all halfspaces for the initial simplex
      -    QGn  - print intersection if redundant to halfspace n, -n for not
      +
      +Qhull extra options:
      +    QGn  - print intersection if visible to halfspace n, -n for not
           QVn  - print intersections for halfspace n, -n if not
      +    Qw   - allow option warnings
      +    Q12  - allow wide facets and wide dupridge
      +    Q14  - merge pinched vertices that create a dupridge
      +
      +T options:
      +    TFn  - report summary when n or more facets created
      +    TI file - input file, may be enclosed in single quotes
      +    TO file - output file, may be enclosed in single quotes
      +    Ts   - statistics
      +    Tv   - verify result: structure, convexity, and in-circle test
      +    Tz   - send all output to stdout
       
       Trace options:
           T4   - trace at level n, 4=all, 5=mem/gauss, -1= events
      +    Ta   - annotate output with message codes
      +    TAn  - stop qhull after adding n vertices
      +     TCn - stop qhull after building cone for point n
      +     TVn - stop qhull after adding point n, -n for before
           Tc   - check frequently during execution
      -    Ts   - print statistics
      -    Tv   - verify result: structure, convexity, and redundancy
      -    Tz   - send all output to stdout
      -    TFn  - report summary when n or more facets created
      -    TI file - input data from file, no spaces or single quotes
      -    TO file - output results to file, may be enclosed in single quotes
      -    TPn  - turn on tracing when halfspace n added to intersection
      -    TMn  - turn on tracing at merge n
      -    TWn  - trace merge facets when width > n
      -    TVn  - stop qhull after adding halfspace n, -n for before (see TCn)
      -    TCn  - stop qhull after building cone for halfspace n (see TVn)
      +    Tf   - flush each qh_fprintf for debugging segfaults
      +    TPn - turn on tracing when point n added to hull
      +     TMn  - turn on tracing at merge n
      +     TWn - trace merge facets when width > n
       
       Precision options:
           Cn   - radius of centrum (roundoff added).  Merge facets if non-convex
      @@ -550,15 +592,15 @@
           FF   - facet dump without ridges
           FI   - ID of each intersection
           Fm   - merge count for each intersection (511 max)
      -    FM   - Maple output (dual convex hull)
      +    FM   - Maple output (dual 2-d or 3-d convex hull)
           Fn   - count plus neighboring intersections for each intersection
      -    FN   - count plus intersections for each non-redundant halfspace
      +    FN   - count plus intersections for each halfspace
           FO   - options and precision constants
           Fp   - dim, count, and intersection coordinates
           FP   - nearest halfspace and distance for each redundant halfspace
           FQ   - command used for qhalf
           Fs   - summary: #int (8), dim, #halfspaces, #non-redundant, #intersections
      -                      for output: #non-redundant, #intersections, #coplanar
      +                      output: #non-redundant, #intersections, #coplanar
                                         halfspaces, #non-simplicial intersections
                           #real (2), max outer plane, min vertex
           Fv   - count plus non-redundant halfspaces for each intersection
      @@ -568,20 +610,20 @@
           Ga   - all points (i.e., transformed halfspaces) as dots
            Gp  -  coplanar points and vertices as radii
            Gv  -  vertices (i.e., non-redundant halfspaces) as spheres
      +    Gc   - centrums
      +    GDn  - drop dimension n in 3-d and 4-d output
      +    Gh   - hyperplane intersections
           Gi   - inner planes (i.e., halfspace intersections) only
            Gn  -  no planes
            Go  -  outer planes only
      -    Gc   - centrums
      -    Gh   - hyperplane intersections
           Gr   - ridges
      -    GDn  - drop dimension n in 3-d and 4-d output
       
       Print options:
           PAn  - keep n largest facets (i.e., intersections) by area
      -    Pdk:n- drop facet if normal[k] <= n (default 0.0)
      +    Pdk:n- drop facet if normal[k] <= n (default 0.0)
           PDk:n- drop facet if normal[k] >= n
      -    Pg   - print good facets (needs 'QGn' or 'QVn')
           PFn  - keep facets whose area is at least n
      +    Pg   - print good facets (needs 'QGn' or 'QVn')
           PG   - print neighbors of good facets
           PMn  - keep n facets with most merges
           Po   - force output.  If error, output neighborhood of facet
      @@ -589,13 +631,15 @@
       
           .    - list of all options
           -    - one line descriptions of all options
      +    -?   - help with examples
      +    -V   - version
       

      -

      Up: Home page for Qhull
      -Up: Qhull manual: Table of Contents
      +

      Up: Home page for Qhull (local)
      +Up: Qhull manual: contents
      To: ProgramsOptionsOutput @@ -605,7 +649,7 @@ • QhullPrecisionTrace -• Functions
      +• Functions (local)
      To: synopsis • input • outputs • controls • graphics @@ -619,7 +663,7 @@ Home Page

      Comments to: qhull@qhull.org -
      +
      Created: Sept. 25, 1995 --- Last modified: see top

      diff -Nru qhull-2015.2/html/qh-code.htm qhull-2020.2/html/qh-code.htm --- qhull-2015.2/html/qh-code.htm 2016-01-18 23:02:14.000000000 +0000 +++ qhull-2020.2/html/qh-code.htm 2020-09-04 01:24:40.000000000 +0000 @@ -8,26 +8,22 @@ -

      Up: Home page for Qhull -
      -Up: Qhull manual: Table of -Contents
      -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
      -To: Qhull code: Table of Contents -(please wait while loading)
      -Dn: Qhull functions, macros, and data -structures -

      +

      + Up: Home page for Qhull (local)
      + Up: Qhull manual: contents
      + To: Programs + • Options + • Output + • Formats + • Geomview + • Print + • Qhull + • Precision + • Trace + • Functions (local)
      + To: Imprecision in Qhull
      + To: Qhull code: contents
      +


      @@ -38,17 +34,17 @@

      This section discusses the code for Qhull.

      -

      Copyright © 1995-2015 C.B. Barber

      +

      Copyright © 1995-2020 C.B. Barber


      -

      »Qhull code: Table of -Contents

      +

      »Qhull code: contents


      @@ -115,12 +121,20 @@ The previous C++ interface was unusual due to Qhull's global data structures.

      All other users should consider converting to libqhull_r. The conversion is straight forward. -The original conversion of libqhull to libqhull_r required thousands of changes, mostly global -search and replace. The first run of Qhull (unix_r.c) produced the same -output, and nearly the same log files, as the original (unix.c). +Most of the changes may be made with global search and replace. The resulting files +may be checked via eg/make-qhull_qh.sh. It performs the inverse mapping for comparison with +non-reentrant code. + +

      For example, even though the original conversion of libqhull to +libqhull_r required thousands of changes, the first run of reentrant Qhull (unix_r.c) produced the same +output, and nearly the same log files, as the original, non-reentrant Qhull (unix.c). The +original conversion was made without the help of eg/make-qhull_qh.sh. Conversion errors almost +always produce compiler errors.

      Suggestions to help with conversion.

        +
      • Qhull 2019.1 introduced eg/make-qhull_qh.sh. It simplifies the task of checking the consistency +of reentrant and non-reentrant C code for Qhull.
      • Compare qconvex_r.c with qconvex.c. Define a qhT object and a pointer it. The qhT* pointer is the first argument to most Qhull functions. Clear qh_qh-<NOerrext before calling qh_initflags(). Invoke QHULL_LIB_CHECK to check for a compatible Qhull library.
      • Compare user_eg2_r.c with user_eg2.c @@ -134,10 +148,44 @@
      • For regexps and conversion notes, see README_r.txt (unedited).
      +

      Suggestions for updating src/libqhull/* from src/libqhull_r/*: +

        +
      • Make edits to libqhull_r/* instead of libqhull/*. The reverse update is more difficult, as desribed above. +
      • Use 'eg/make-qhull_qh.sh libqhull_r' to automatically convert libqhull_r/* to qhull_qh/* +
      • Compare src/qhull_qh/ to src/libqhull/ using Beyond Compare (www.scootersoftware.com) +or another directory comparison utility. +
      • Configure Beyond Compare for expected differences: +
        • Rules > Importance > Unimportant text
          '$Id: ', '$DateTime: ', 'char qh_version' +
        • When updating 'Unimportant text', select 'Use for all files in parent session' and, optionally, 'Updated session defaults' +
        • Select 'Minor' to ignore unimportant text +
        • Review Rules > Importance > Mark grammar elements. Be sure to include 'Comment' +
        +
      • Almost all unmodified lines should be identical. +
      • Use 'Diffs' view to review diffs, and 'All' view to copy diffs. Otherwise wrong lines may be changed +
      • Copy modified lines as needed. +
      • Be careful of removing true differences, such as those involiving +
          +
        • DEFqhT +
        • oldqhA, oldqhB +
        • qh_QHpointer +
        • qh_last_random +
        • qh_rand_r +
        • qhmem +
        • qhstat, qhstatT +
        • rbox_inuse +
        • rboxT +
        • "renentrant" vs. "non-reentrant" +
        +
      +

      »Qhull on 64-bit computers

      Qhull compiles for 64-bit hosts. Since the size of a pointer on a 64-bit host is double the size on a 32-bit host, memory consumption increases about 50% for simplicial facets and up-to 100% for non-simplicial facets. +If the convex hull does not fit in the computer's level 1 and level 2 cache memory, Qhull will run +slower as it retrieves data from main memory. + +

      If your data fits in 32-bits, run Qhull as 32-bit code. It will use less memory and run faster.

      You can check memory consumption with option Ts. It includes the size of each data structure: @@ -169,7 +217,7 @@

      You can retain most of the data in Qhull and use the C++ interface to explore its results. -Each object contains a reference the Qhull's data structure (via QhullQh), making the C++ representation less memory efficient. +Each object contains a reference to Qhull's data structure (via QhullQh), making the C++ representation less memory efficient.

      Besides using the C++ interface, you can also use libqhull_r directly. For example, @@ -179,22 +227,26 @@

      The C++ interface to Qhull is incomplete. You may need to extend the interface. If so, you will need to understand Qhull's data structures and read the code. -Example (c.f., user_eg3 eg-100). It prints the facets generated by Qhull. +

      The C++ interface is not documented. You will need to read the code and review +user_eg3 and Qhull's test program qhulltest. Please consider +documenting the C++ interface with Doxygen or +another javadoc-style processor. + +

      user_eg3 demonstrates the C++ interface. For example, +user_eg3 eg-100 prints the facets generated by Qhull.

           RboxPoints rbox;
      -    rbox.appendRandomPoints("100");
      +    rbox.appendPoints("100");
           Qhull qhull;
      -    qhull.runQhull("", rbox);
      -    QhullFacetList facets(qhull);
      -    cout<< facets;
      +    qhull.runQhull(rbox, "");
      +    cout << qhull.facetList();
       

      The C++ iterface for RboxPoints redefines the fprintf() calls in rboxlib.c. Instead of writing its output to stdout, RboxPoints appends the output to a std::vector. -The same technique may be used for calling Qhull from C++.

      • Run Qhull with option 'Ta' to annotate the @@ -204,6 +256,10 @@
      • See RboxPoints.cpp for an example.
      +

      The same technique may be used for calling Qhull from C++. The class QhullUser provides +a starting point. See user_eg3 eg-fifo for +a demonstration of Voronoi diagrams. +

      Since the C++ interface uses reentrant Qhull, multiple threads may run Qhull at the same time. Each thread is one run of Qhull. @@ -346,10 +402,10 @@

      RboxPoints is a std::vector of point coordinates (QhullPoint). -It's iterator is CoordinateIterator. +Its iterator is CoordinateIterator.

      -RboxPoints.appendRandomPoints() appends points from a variety of distributions such as uniformly distributed within a cube and random points on a sphere. +RboxPoints.appendPoints() appends points from a variety of distributions such as uniformly distributed within a cube and random points on a sphere. It can also append a cube's vertices or specific points.

      @@ -358,12 +414,12 @@ Developing C++ code requires many conventions, idioms, and technical details. The following questions have either mystified the author or do not have a clear answer. See also -C++ and Perl Guidelines. -and FIXUP notes in the code. +C++ and Perl Guidelines +and 'QH110nn FIX' notes in the code. Please add notes to Qhull Wiki.
        -
      • FIXUP QH11028 Should return reference, but get reference to temporary +
      • QH11028 FIX: Should return reference, but get reference to temporary
        iterator Coordinates::operator++() { return iterator(++i); }
      • size() as size_t, size_type, or int
      • Should all containers have a reserve()? @@ -412,12 +468,14 @@ qvoronoi.c. The '*_r.c' files are reentrant, otherwise they are non-reentrant. Either version may be used. New code should use reentrant Qhull. -

        See Reentrant Qhull functions, macros, and data -structures for internal documentation of Qhull. The -documentation provides an overview and index. To use the library -you will need to read and understand the code. For most users, it -is better to write data to a file, call the qhull program, and -read the results from the output file.

        +

        + See Functions (local) for + internal documentation of Qhull. The + documentation provides an overview and index. To use the library + you will need to read and understand the code. For most users, it + is better to write data to a file, call the qhull program, and + read the results from the output file. +

        If you use non-reentrant Qhull, be aware of the macros "qh" and "qhstat", e.g., "qh hull_dim". They are @@ -435,6 +493,13 @@ with "#include <libqhull_r/qhull_ra.h>". This avoids potential name conflicts.

        +

        Qhull provides build/qhull.pc.in for pkg-config support and CMakeLists.txt for CMake. +Using back-ticks, you can compile your C program with Qhull. For example: +

        +  	gcc `pkg-config --cflags --libs qhull_r` -o my_app my_app.c
        +
        +

        +

        If you use the Qhull library, you are on your own as far as bugs go. Start with small examples for which you know the output. If you get a bug, try to duplicate it with the Qhull program. The @@ -483,7 +548,7 @@ malloc/free in applications that allocate and deallocate lots of memory.

        -

        Qset_r.c implements sets and related collections. It's +

        qset_r.c implements sets and related collections. It's the inner loop of Qhull, so speed is more important than abstraction. Set iteration is particularly fast. qset_r.c just includes the functions needed for Qhull.

        @@ -519,17 +584,27 @@

        The routine qh_findbestfacet in poly2_r.c is particularly useful. It uses a directed search to locate the -facet that is furthest below a point. For Delaunay -triangulations, this facet is the Delaunay triangle that contains -the lifted point. For convex hulls, the distance of a point to +facet that is furthest below a point.

        + +

        For Delaunay +triangulations, this facet is either the Delaunay triangle or a neighbor of +the Delaunay triangle that contains the lifted point. Qhull determines the +Delaunay triangulation by projecting the input sites to a paraboloid. The +convex hull matches the Delaunay triangulation at the input sites, but does not +match along the edges. See this image +by F. Drielsma. A point is green or yellow depending upon the facet returned +by qh_findbestfacet. For points near an +edge, the circumcircles overlap and the adjacent facet may be returned.

        + +

        For convex hulls, the distance of a point to the convex hull is either the distance to this facet or the distance to a subface of the facet.

        -

        Warning: If triangulated output ('Qt') and -the best facet is triangulated, qh_findbestfacet() returns one of +

        Warning: If triangulated output ('Qt') and +the best facet was triangulated, qh_findbestfacet() returns one of the corresponding 'tricoplanar' facets. The actual best facet may be a different -tricoplanar facet. +tricoplanar facet from the same set of facets.

        See qh_nearvertex() in poly2.c for sample code to visit each tricoplanar facet. To identify the correct tricoplanar facet, @@ -622,8 +697,7 @@ terminate qhull

        -

        »Constrained -Delaunay triangulation

        +

        »Constrained Delaunay triangulation

        With a fair amount of work, Qhull is suitable for constrained Delaunay triangulation. See Shewchuk, ACM Symposium on @@ -637,7 +711,7 @@

        »Tricoplanar facets and option 'Qt'

        -

        Option 'Qt' triangulates non-simplicial +

        Option 'Qt' triangulates non-simplicial facets (e.g., a square facet in 3-d or a cubical facet in 4-d). All facets share the same apex (i.e., the first vertex in facet->vertices). For each triangulated facet, Qhull @@ -654,7 +728,7 @@ all neighbors of a tricoplanar facet. The tricoplanar facets will have the same facet->center.

        -

        See qh_detvridge for an example of ignoring tricoplanar facets.

        +

        See qh_detvridge for an example of ignoring tricoplanar facets.

        »Voronoi vertices of a region

        @@ -666,7 +740,7 @@ corresponds to an adjacent facet. A facet is "upperdelaunay" if it corresponds to a Voronoi vertex "at-infinity". Qhull uses qh_printvoronoi in io.c -for 'qvoronoi o'

        +for 'qvoronoi o'

        @@ -733,8 +807,241 @@
         if you need 1-faces, you probably need to generate the full face
         graph of the convex hull. 

        -

        »Performance of -Qhull

        +

        »How to debug Qhull

        + +

        Qhull continually checks its execution, so most errors will stop Qhull with an error message. +Additional checking occurs for verified output ('Tv'), check +frequently ('Tc'), check for duplicate ridges ('Q15'), +and tracing at level 4 ('T4').

        + +

        If Qhull detects an error, it writes a descriptive error message to stderr, and exits with an exit status code (see following). +The C++ interface captures the message +in Qhull::qhullMessage. If Qhull::setErrorStream was called, it writes the error message to Qhull::errorStream. + +

        If a Qhull segfault occurs, turn on tracing with option 'T4' and +flush output (qh_fprintf) with option 'Tf'. See core dumps and +segfaults. + +

        If Qhull never finishes, is Qhull running slow or was there an infinite loop? +

          +
        • If you are running Qhull under Git for Windows or MSYS2, 'qhull' waits for stdin instead of displaying a help message. +Use 'qhull --help' instead. +
        • Turn on monitoring with option +'TFn'. Qhull normally takes approximately the same amount of time per point. +If the output is too large, it will slow down due to main memory or virtual memory. +
        • If there are large, +non-simplicial facets, see "quadradic running time" in Limitations of merged facets. +
        • See Performance and infinite loops for further suggestions. +
        + +

        If a Qhull error occurs, try to simplify the problem. +

          +
        • If new to Qhull, start with short examples that you can work out by hand. Your problem may +be due to misunderstanding Qhull's output, or an incompatibility between your program and the Qhull libraries. +
        • Can you produce the input that triggers the problem? The input to Qhull includes the dimension, +number of points, point coordinates, and Qhull options. Qhull is usually deterministic for a particular build. +
        • Can you duplicate the problem using one of the Qhull programs (e.g., 'qhull' or 'qconvex')? +
        • Does a shorter output trigger the problem? +
        • Can you turn on tracing with option 'T4'? If too much output occurs, +use the trace options to reduce the trace output. +
        • The test program, 'eg/qtest.sh', repeats a qhull run for intermittent errors. +It can log a qhull run to 'qhull.log' and a reduced log, 'qhull-step.log'. +
        + +

        If the segfault, infinite loop, or internal error was +due to Qhull, please report the error to 'bradb@shore.net. +Please include the input data (i.e., point coordinates) that triggered the error. + +

        »Qhull errors

        + +

        Qhull errors start with 'QH6...' and Qhull warnings start with 'QH7...'. The error message and +error code are arguments to a qh_fprintf call. After printing the error message, Qhull exits with +an exit status code. The exit status code indicates the type of error: +

          +
        • +qh_ERRinput (1) -- badly formed options or input. Badly formed options are reported as +Qhull warnings. Unless option 'Qw' is specified, Qhull reports error +QH6035 or QH6037 and exits with qh_ERRinput. Inconsistent options typically report an error. +
          The input to Qhull specifies the dimension +and number of points. If the input contains +fewer or more points than coordinates, Qhull reports error QH6410 and exits with qh_ERRinput. +If option 'Qa' is specified, it reports warning QH7073 +and continues execution.
        • +
        • +qh_ERRsingular (2) -- singular input data. If the input data is singular or flat (e.g., a line segment in 2-d), +Qhull reports error QH6114, QH6379, or QH6154. Qhull calls qh_printhelp_singular to print an explanation of the error. +It exits qhull with qh_ERRsingular.
        • +
        • +qh_ERRprec (3) -- precision error. By default, Qhull handles precision errors by merging. +If merging is not possible, or if a precision error is identified after Qhull finishes, Qhull reports an +error and calls qh_printhelp_degenerate. It exits qhull with qh_ERRprec.
        • +
        • +qh_ERRmem (4) -- memory error. If Qhull runs out of memory, it reports an error and exits qhull with qh_ERRmem.
        • +
        • +qh_ERRQhull (5) -- internal error. If Qhull detects an internal error, it reports the +error and calls qh_printhelp_internal. It exits qhull with qh_ERRQhull.
        • +
        • +qh_ERRother (6) -- other errors. If Qhull identifies an error while reporting another error, it prints +"qhull error while handling previous error" and exits Qhull with qh_ERRother. The same exit code is +used for vertex id overflow and missing exitcode for qh_errexit.
        • +
        • +qh_ERRtopology (7) -- topology error. If Qhull cannot recover from a topology error, it reports +the error and calls qh_printhelp_topology. It exits qhull with qh_ERRtopology.
        • +
        • +qh_ERRwide (8) -- wide facet error. If Qhull produces an extra-wide facet, it reports the error and +calls qh_printhelp_wide. It exits qhull with qh_ERRwide.
        • +
        • +qh_ERRdebug (9) -- debug. Use qh_ERRdebug for exits from debugging code.
        • +

        + +

        »Qhull infinite loops

        + +Except for list traversals, most loops in Qhull are limited by a count or the size of set. +Linked lists of facets and vertices terminate with a sentinel whose next element is NULL. +If a programming error inserts a link to a previous facet or vertex, an infinite loop occurs +on the next traversal. Qhull periodically checks and corrects its linked lists for infinite loops +(qh_checklists). +

        + +

        »Qhull trace options

        + +

        Qhull's trace options are the key to debugging Qhull. They describe +an execution of Qhull at various levels of detail, with various options to control what is traced. +

          +
        • Level 0 ('T-1') -- Key events are prefixed with '[QH00nn]' +
        • Level 1 ('T1') -- Main steps in the program are prefixed with '[QH1nnn]'.
          +[QH1049]qh_addpoint -- When Qhull adds a point, it logs information about the point, the convex hull so far, and changes since the previous qh_addpoint. +
        • Level 2 ('T2') -- Minor steps in the program are prefixed with '[QH2nnn]'. +
        • Level 3 ('T3') -- Merge and other events are prefixed with '[QH3nnn]'. +
        • Level 4 ('T4') -- Detailed trace of Qhull execution. +
        • Level 5 ('T5') -- Memory allocations and Guassian elimination. Memory allocations are prefixed with "qh_mem " followed by address, sequence number, alloc/free, short/long, etc. +If you sort by address and sequence number, each allocate should be paired with its free. +

        + +

        These options select when tracing starts or stops. It limits the amount of tracing, especially in high dimensions. +

          +
        • 'TAn' -- stop Qhull after adding n vertices +
        • 'TCn' -- stop Qhull after building cone for point n +
        • 'TMn' -- turn on tracing at merge n. +When Qhull reports an error, it reports "Last merge was #nnn". +
        • 'TPn' -- turn on tracing when point n is added to hull or point n is referenced. +When Qhull reports an error, it reports "Last point added to hull was pnnn". +
        • 'TVn' -- stop Qhull after adding point n, -n for before +
        • 'TWn' -- trace merge facets when width > n +

        + +Additional logging by facet id (fnnn), ridge id (rnnn) or vertex id (vnnn), may be enabled by +setting qh.tracefacet_id, qh.traceridge_id, +or qh.tracevertex_id in global_r.c/qh_initqhull_start2. + +

        »Qhull core dumps and segfaults

        + +

        If a segfault occurs, use option 'Tf' to flush output after every qh_fprintf. +Logging will be significantly slower than normal.

        + +

        The following debugging plan usually identifies the error +

          +
        1. Trace execution at level 1 with flush after each qh_fprintf +and output to stdout ('T1 Tf Tz'). +
        2. Repeat at level 4 after the last qh_addpoint (QH1049, 'TPn'). +Add line numbers to the log by piping the output through 'grep -n .'. +
            +
          • If there is too much level 4 output, repeat at level 2 to find the last +qh_mergefacet (QH2081) and then trace at level 4 from the last merge ('TMn'). +
          • If there is still too much level 4 output, identify one of the last level 3 events and add debugging +to the corresponding trace3 call. Be sure to mark the code for removal. For example
            +
            +  if (facetA->id==4675)
            +    qh->IStracing= 4; /* DEBUG */
            +  trace3((qh, qh->ferr, 3020, "qh_triangulate_facet: triangulate facet f%d\n", facetA->id));
            +
            +
        3. +
        4. Identify the location of the failure using a build of Qhull with debug symbols. +
        5. Use the debugger to find relevant facet ids, ridge ids, and vertex ids. These identifiers will appear in the +level 4 log. +
        + +

        »eg/qtest.sh for intermittent errors and logging

        + +

        For intermittent errors, use 'rbox' to generate random test cases, and eg/qtest.sh +to invoke multiple runs of qhull. +When a failing case is found, rerun eg/qtest.sh with the test case identifier. It produces qhull.log and the +corresponding reduced log, qhull-step.log. These logs include line numbers generated by 'grep -n .'

        + +

        qtest.sh provides the following options +

          +
        • N qhull runs (qtest.sh -N 'rbox c | qhull') +
          execute the qhull command N times with rotated input 'QR1', 'QR2', ... +
        • N random qhull runs (qtest.sh N 'rbox c | qhull') +
          execute the qhull command N times with random rotations 'QRn', ... +

          +

        • N 'rbox|qhull' runs (qtest.sh -N 'rbox-opts' 'qhull-opts') +
          execute rbox and qhull N times with random inputs 't1', 't2', ... +
        • N random 'rbox|qhull' runs (qtest.sh N 'rbox-opts' 'qhull-opts') +
          execute rbox and qhull N times with random inputs 'tnnn', ... +

          +

        • Run qhull command (qtest.sh run 'rbox c | qhull') +
          execute a qhull command line +
        • Run qhull QRnnn (qtest.sh run QRnnn 'rbox | qhull') +
          execute a qhull command line with QRnnn rotated input +
        • Run rbox tnnn | qhull (qtest.sh run t... 'rbox-opts' 'qhull-opts') +
          execute rbox and qhull commands with tnnn random input +

          +

        • Log qhull command (qtest.sh log 'rbox c | qhull') +
          trace (T4) a qhull command line to qhull.log and qhull-step.log +
        • Log qhull QRnnn (qtest.sh QRnnn 'rbox | qhull') +
          trace (T4) a qhull command line with QRnnn rotated input to qhull.log and qhull-step.log +
        • Log rbox tnnn | qhull (qtest.sh tnnn 'rbox-opts' 'qhull-opts') +
          trace (T4) rbox and qhull commands with tnnn random input to qhull.log and qhull-step.log +

          +

        • Grep qhull.log for events (qtest.sh grep) +
          grep qhull.log for $QH_GREP excluding $QH_GREPX to stdout +
        • Grep qhull.log for regexp (qtest.sh grep 'include-regexp') +
          grep qhull.log for regexp|$QH_GREP excluding $QH_GREPX to stdout +
        • Grep qhull.log for include and exclude regexps (qtest.sh grep 'include-regexp' 'exclude-regexp') +
          grep qhull.log for include|$QH_GREP excluding exclude|$QH_GREPX to stdout +

          +

        • Grep logfile for merge events (qtest.sh grep-merge logfile) +
          grep logfile for merge events to stdout, see #grep-merge in qtest.sh +

          +

        • Grep logfile for step events (qtest.sh grep-merge logfile) +
          grep logfile for step events to stdout, same as qhull-step.log +

          +

        • Verbose logging (qtest.sh -v ...) +
          prepend log with command and environment variables +
        + +

        »Memory errors

        + +Qhull checks memory usage before exiting. To locate memory that is not freed ("QH7079 qhull internal warning (main): did not free ..."): +
          +
        1. Run qhull with memory tracing 'T5'. +
          See 'Level 5' in Qhull trace options (above) +
        2. Sort lines that start with 'qh_mem'. It matches qh_memalloc with the corresponding qh_memfree. +
        3. For long allocations, sort lines that contain -- qh_mem.*long: +
        4. Replace -- qh_mem.*alloc.*\nqh_mem.*free.* -- with 'Match' (Textpad supports internal newlines in match expressions). +
        5. Sort by column 25 (n...). It shows unallocated actions. Long allocations are in execution order. +Short and quick allocations are in execution order. +
        6. For example: qh_mem 0000000000537440 n 10053 alloc long: 128 bytes (tot 484800 cnt 1209) +
        7. To check quick vs. long allocations -- grep "qh_mem .*alloc " qhull.log | sed -e 's/^.*long/long/' -e 's/^.*short/short/' -e 's/^.*quick/quick/' -e 's/bytes.*/bytes/' | sort | uniq -c >x.1 +

        + +

        Option 'Ts' reports +numerous memory statistics. + +

        »Qhull debugging tips

        + +
          +
        • qh_printlists in poly2_r.c -- called during qh_addpoint. Easily inserted into existing code and a +good location for debugging code. +
        • qh_fprintf in user_r.c -- called for all Qhull output, including trace logs. A good location +for reasonably efficient debugging code. +The debugging code may refer to a facet, ridge, or vertex by setting +qh.tracefacet_id, qh.traceridge_id, or qh.tracevertex_id in global_r.c/qh_initqhull_start2. +
        • qh_tracemerge in merge_r.c -- called after each merge. It is a good location for debugging code. +
        + +

        »Performance of Qhull

        Empirically, Qhull's performance is balanced in the sense that the average case happens on average. This may always be true if @@ -750,9 +1057,9 @@ increases rapidly with dimension. It is O(v^floor(d/2) / floor(d/2)!).

        -

        The time complexity for merging is unknown. Options 'C-0' and 'Qx' -(defaults) handle precision problems due to floating-point +

        The time complexity for merging is unknown. The default options 'C-0' (2-d, 3-d, 4-d) and 'Qx' (5-d and higher) +handle precision problems due to floating-point arithmetic. They are optimized for simplicial outputs.

        When running large data sets, you should monitor Qhull's @@ -762,6 +1069,14 @@ example the product of 8-d simplices contains 18 facets and 500,000 ridges. This will increase the time needed per facet.

        +

        Additional detail is provided by QH1049 in the level-1 trace ('T1'). +For each qh_addpoint, it provides vertex id, facet count, outside point count, +CPU time for the previous point, deltas for facets/hyperplanes/distplanes, and the number +of retries due to merged pinched vertices. For example:

        +
        +[QH1049]qh_addpoint: add p260(v176) to hull of 286 facets (1.4e-12 above f830) and 2 outside at 1.192 CPU secs. Previous p710(v175) delta 0.007 CPU, 2 facets, 3 hyperplanes, 443 distplanes, 0 retries +
        +

        As dimension increases, the number of facets and ridges in a convex hull grows rapidly for the same number of vertices. For example, the convex hull of 300 cospherical points in 6-d has @@ -844,33 +1159,218 @@ convex hull of cosperical points is qh_distplane(), mainly called from qh_findbestnew(). The dominate cost for 3-d Delaunay triangulation is creating new facets in qh_addpoint(), while qh_distplane() remains -the most expensive function. +the most expensive function.

        -

        -

        »Enhancements to Qhull

        +

        »eg/q_benchmark for optimizing Qhull

        + +

        eg/q_benchmark and eg/qtest.sh +make multiple runs of Qhull for testing, +benchmarking, and debugging. They help test and analyze intermittent errors, performance issues, and precision issues. +Each release updates eg/q_benchmark-ok.txt. + +

        Qhull 2019.1 is 15% larger than Qhull 2015.2 due to enhanced error reporting, tracing, and facet merging. +The increased code size may increase startup times.

        + +

        Qhull is single threaded. Gcc's gprof works well for profiling Qhull performance.

        + +
          +
        • Recompile Qhull with '-pg' added to CC_OPTS1 in qhull's Makefile. Check for optimization ('-O3'). +
        • Execute a performance test of Qhull +
          • See "=== Timing test cases ===" in 'eg/q_benchmark'. +
          +
        • Check for gmon.out from gcc's '-pg' option -- ls -l gmon.out +
        • Run gprof -- gprof qhull >gprof.txt # gprof qhull.exe >gprof.txt +
        • Review gprof.txt +
            +
          • The first section gives results by function, the second section, results by caller +
          +
        • Sample runs +
          rbox 500000 s >r.x; time qhull TI r.x
          +
          +AIR2-/local/qhull/bin> time qhull TI r.x
          +
          +Convex hull of 500000 points in 3-d:
          +
          +  Number of vertices: 500000
          +  Number of facets: 999996
          +
          +Statistics for: rbox 500000 s | qhull TI r.x
          +
          +  Number of points processed: 500000
          +  Number of hyperplanes created: 2827999
          +  Number of distance tests for qhull: 24786928
          +  CPU seconds to compute hull (after input): 4.852
          +
          +
          +[4]     62.8    0.02    2.11  499996         qh_addpoint [4]
          +                0.01    0.83  499996/499996      qh_buildcone [5]
          +                0.04    0.56  499996/499996      qh_partitionvisible [7]
          +                0.01    0.28  499996/499996      qh_premerge [13]
          +                0.04    0.13  499996/499996      qh_findhorizon [19]
          +
          +# 2015.2
          +Statistics for: rbox 500000 s | qhull TI c:/bash/local/qhull/bin/r.x
          +  Number of vertices: 500000
          +  Number of facets: 999996
          +  Number of points processed: 500000
          +  Number of hyperplanes created: 2827999
          +  Number of distance tests for qhull: 24786929
          +  CPU seconds to compute hull (after input): 4.477
          +real    0m6.334s
          +user    0m0.016s
          +sys     0m0.015s
          +
          +
        + +

        »Enhancements to Qhull

        There are many ways in which Qhull can be improved.

        -[Jan 2015] Suggestions
        +Top Suggestions
        + - Document the C++ interface using Doxygen
        + - Construct the full Voronoi Diagram using the C++ interface.  See "To do" in Changes.txt
        + - Optimize for 64-bit code
        +   Custom facetT for simplicial facets
        +   32-bit indices for facets and vertices
        + - Bulk qh_addpoint with a custom point partition
        + - Full-dimensional flats
        +   Add points at right angles like 'Qz'
        +   Ignore added facets in output (cf. f.upperDelaunay and f.good)
        + - Per-vertex joggle
        +   Joggle by random flip of low-order and adjustable-order bits in mantissa
        +   Allows consistent triangulations across distributed partitions
        +   Detect integer input data and automatically translate to the origin
        + - Develop a theory for merging Qhull's non-simplicial facets
        +   A merge creates constraints on subsequent merges, what are these constraints?
        +   Identify topological errors in qh_findbest_test (merge_r.c)f
        +   Prevent duplicate ridges (Q15-check-duplicates) or facets with the same vertices
        +   Preserve facet-ridge orientation for nonsimplicial facets (ridge top/bot)
        +   Produce conformant triangulations for nonsimplicial facets (option 'Qt', QH2088)
        +   Should vertex merge account for facet orientation?
        +   Rationalize the merge options qh_RATIOtwisted, qh_WIDEdupridge, etc.
        +   Should wide merges be proportional to qh.ONEmerge or f.maxoutside?
        +   Can dupridges be avoided with geometric and topological constraints?
        +   Review coplanar tests across sharp ridges (coplanar horizon, qh_test_appendmerge, qh_check_maxout)
        + - Improve Qhull's computations, particularly qh_setfacetplane for hyperplanes
        +   Toronto, N., McCarthy, J., "Practically accurate floating-point math,", Computing in
        +   Science & Engineering, IEEE, July/August 2014, p. 80-95.
        + - Octave creates endpoints for unbounded ridges, for drawing Delaunay/Voronoi diagrams [M. Voss]
        + - Option to select bounded Voronoi regions [A. Uzunovic]
        + - Review Qhull performance.  qh_next_vertexmerge and qh_check_maxout are slower than expected
        +   Compare to Peterka et al and Li and Snoeyink, particularly 64-bit vs. 32-bit
        + - Use Gaussian distribution for random cospherical points in rbox
        + - Implement dimension reduction via Johnson-Lindenstrauss flattening
        + - Implement bulk qh_addpoint via a subset of the facets, perhaps a box about qh.interior_point
        +   Allow qh_triangulate to run after each increment [coldfix, scipy #4974]
        + - Write incremental addPoint with bucketed inputs and facet search (CGAL)
        + - Compute hyperplanes in parallel (cf. qh_setfactplane)
        + - Create Voronoi volumes and topology in parallel
        + - Implement Delaunay to Voronoi tesselation [Peterka et al, 2014, www.mcs.anl.gov/papers/P5154-0614.pdf]
        + - Integrate 4dview with Geomview 1.9.5
        + - Use coverage testing to expand Qhull's test programs
        + - Add RPM and Debian builds to Qhull (CMake's CPackRMP and CPackDeb).
        + - Create a mirror/archive web site for old and new Qhull builds
        + - Constrain delaunay triangulations via Shewchuk's algorithm (ACM Symp. Comp. Geo., 1998)
        +
        +-----------
        +To do for a furture version of the C++ interface
        + - Document C++ using Doxygen conventions (//! and //!<)
        + - Add defineAs() to each object
        + - Add Qtest::toString() functions for QhullPoint and others.  QByteArray and qstrdup()
        + - Add toQVector() for Qt container support.  QVector is preferred over QList
        + - Add mutable Java-style iterators for containers.  Limited due to memory-allocation issues.
        + - Should Qhull manage the output formats for doubles?  QH11010 FIX: user_r.h defines qh_REAL_1 as %6.8g
        + - Allocate memory for QhullSet using Qhull.qhmem.  Create default constructors for QhullVertexSet etc.  Also mid() etc.
        + - Add interior point for automatic translation?
        + - Write a program with concurrent Qhull
        + - Write QhullStat and QhullStat_test
        + - Add QList and vector instance of facetT*, etc.
        + - Generalize QhullPointSetIterator
        + - qh-code.htm: Document changes to C++ interface.
        +      Organize C++ documentation into collection classes, etc.
        + - Review all C++ classes and C++ tests
        + - QhullVertexSet uses QhullSetBase::referenceSetT() to free its memory.   Probably needed elsewhere
        + - The Boost Graph Library provides C++ classes for graph data structures. It may help
        +   enhance Qhull's C++ interface [Dr. Dobb's 9/00 p. 29-38; OOPSLA 99 p. 399-414].
        +
        +[May 2020] Suggestions
        +- Check that the midpoint for Voronoi option 'Fo' is not a Voronoi vertex (rbox c D2 P0 | qvoronoi Fo)
        +- How to detect degenerate hyperplanes for Voronoi option 'Fo' and 'Fi'?
        +  qh_sethyperplane_gauss reports nearzero for axis parallel hyperplanes.
        +- Add a 'Tv' test for Voronoi option 'Fo' that does not use midpoints
        +
        +[May 2019] Suggestions
        +------------
        +Precision issues
        +- Improve handling of data with positive, integer coordinates, particularly for Delaunay triangulation
        +  eg Sterratt's github issue #25
        +  Add a warning that available precision is reduced
        +  Add an option to automatically translate the data to the origin
        +- Review qh.MAXcoplanar ('Un'), it varies by dimension compared to qh.ONEmerge
        +
        +Topology issues
        +- Need theory for facet merging, vertex merging, and topological errors
        +- Does qh_triangulate produce a consistent orientation if qh_renamevertex is not called?
        +
        +Facet and vertex merging
        +- Reduce the overhead of qh.NEWtentative ('Q14') and improve the speed of facet and vertex merging
        +- Review MRGconcavecoplanar and early out for isconcave in qh_test_nonsimplicial_merge
        +- Review user_r.h ratios and precision constants for merging
        +  Pre-compute derived precision values (e.g., qh_detmaxoutside)
        +- Use a fixed target instead of a relative wide-max ratio.
        +  Why should qh.MAXoutside increase when qh.max_outside increases dramatically
        +  Why should a slow but steady increase in qh.max_outside be OK?
        +  Define an option to specify wide-max ratio -- 100x is borderline, bad cases can produce 400x,
        +- Add statistics for dupridge matching in qh_matchneighbor and qh_matchdupridge.  Report as a "precision problem"
        +- Collect statistics for MRGdegen and MRGredundant
        +- In qh_all_merges, why is isreduce set when qh.POSTmerging && qh.hull_dim >= 4?
        +- In qh_forcedmerges and qh_initmergesets, remove assumption that qh.facet_mergeset is the last temporary set
        +- Review comparisons for qh_compare_anglemerge and qh_compare_facetmerge (after developing a theory)
        +
        +Other
        +- Add a version flag to 'rbox' (cf. global_r.c/qh_version).  Currently, the release date is part of its help prompt.
        +- Review effect of qh.GOODclosest on qh_buildcone_onlygood ('Qg', QH11030 FIX).  qh_findgood preserves old value if didn't find a good facet.  See qh_findgood_all for disabling
        +- Review the rules for -REALmax -- they look inconsistent.
        +  Why REALmax/2 and -REALmax/2?  The comments say 'avoid underflow'.  When was it introduced?
        +- Review comment in qh_matchnewfacets -- "do not allocate memory after qh.hash_table (need to free it cleanly)"
        +- Chase circular dependencies when compiling qhulltest with Microsoft Devstudio
        +  Warning MSB8017 A circular dependency has been detected while executing custom build commands for item "moc\Coordinates_test.moc". This may cause incremental build to work incorrectly.        qhulltest-64    C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets   209
        +- Add 'design:' documentation for poly2_r.c/qh_triangulate
        +  Consider splitting up
        +- Geomview for 4-d merge is difficult to understand.  Not able to see the convexity of the edges
        +- Review memory sizes (mem_r.c/qh_memsize) and quick allocations for 64-bit code
        +- Review Qhull's collection API conventions, http://www.qhull.org/road/road-faq/xml/qhull-cpp.xml
        +  See http://gnuwin32.sourceforge.net/packages.html and https://google-styleguide.googlecode.com/svn/trunk/cppguide.html
        +
        +[Jan 2019] Suggestions
        +- Optimize poly_r.c/qh_update_vertexneighbors for qh_triangulate. qh_setunique and qh_setcompact are slow
        +- The size of maxpoints in qh_initialvertices/qh_maxsimplex should be d+3 unique points to help avoid QH6154
        +- Review coordT vs. realT.  Should parameters and variables be coordT when they are distances or coordinates?
        +  'coordT' is defined as 'realT'
        +  Having computations as 'double' with coordinates stored as 'float' requires many type conversions
        +  Expressions are often computed as 'double' anyway
        +  Source code sometimes uses 'coordT' and sometimes 'realT'
        +- Need a separate, hash check for duplicate ridge vertices in a facet list -- faster than current qh_checkfacet
        +- Add joggle for 'almost incident' vertices (order of 100), may clean up Qt as well, projected to hyperplane
        +- Consider using r.mergevertex2 to optimize qh_postmerge
        +- Report two facets with same ridge vertices, opposite orientation (topology error)
        +  add warning (see QH7084) for duplicate ridge with opposite orientation (only two facets in the list)
        +- Check 'qh_NOmerge' compiler option
        +
        +[Jan 2016] Suggestions
         ------------
        -To do for a future verson of Qhull
        - - Add a merge pass before cone creation to remove duplicate subridges between horizon facets
        + - Add a post-merge pass for Delaunay slivers.  Merge into a neighbor with a circumsphere that includes the opposite point. [M. Treacy]
          - Option to add a bounding box for Delaunay triangulations, e,g., nearly coincident points
        - - Report error when rbox Cn,r,m does not produce points (e.g., 'r' distributions)
          - Rescale output to match 'QbB' on input [J. Metz, 1/30/2014 12:21p]
          - Run through valgrind
          - Notes to compgeom on conformant triangulation and Voronoi volume
        - - Git: Create signed tags for Qhull versions
          - Implement weighted Delaunay triangulation and weighted Voronoi diagram [A. Liebscher]
            e.g., Sugihara, "Three-dimensional convex hull as a fruitful source of diagrams," Theoretical Computer Science, 2000, 235:325-337
          - testqset: test qh_setdelnth and move-to-front
          - Makefile: Re-review gcc/g++ warnings.  OK in 2011.
          - Break up -Wextra into its components or figure out how to override -Wunused-but-set-variable
            unused-but-set-variable is reporting incorrectly.  All instances are annotated.
        - - CMakelists.txt:  Why are files duplicated for cmake build
        - - CMakeLists.txt: configure the 'ctest' target
        - - The size of maxpoints in qh_maxsimplex should be d+3 unique points to help avoid QH6154
         
          - Can countT be defined as 'int', 'unsigned int', or 64-bit int?
            countT is currently defined as 'int' in qset_r.h
        @@ -886,46 +1386,18 @@
            All error messages with countT are wrong, convert to int?
            RboxPoints.qh_fprintf_rbox, etc. message 9393 assumes countT but may be int, va_arg(args, countT);  Need to split
         
        -------------
        -To do for a furture version of the C++ interface
        - - Fix C++ memory leak in user_eg3 [M. Sandim]
        - - Document C++ using Doxygen conventions (//! and //!<)
        - - Should Qhull manage the output formats for doubles?  QH11010 user_r.h defines qh_REAL_1 as %6.8g
        - - Allocate memory for QhullSet using Qhull.qhmem.  Create default constructors for QhullVertexSet etc.  Also mid() etc.
        - - Add interior point for automatic translation?
        - - Add hasNext() to all next() iterators (e.g., QhullVertex)
        - - Add defineAs() to each object
        - - Write a program with concurrent Qhull
        - - Write QhullStat and QhullStat_test
        - - Add QList and vector instance of facetT*, etc.
        - - Generalize QhullPointSetIterator
        - - qh-code.htm: Document changes to C++ interface.
        -      Organize C++ documentation into collection classes, etc.
        - - Review all C++ classes and C++ tests
        - - QhullVertexSet uses QhullSetBase::referenceSetT() to free it's memory.   Probably needed elsewhere
        - - The Boost Graph Library provides C++ classes for graph data structures. It may help
        -   enhance Qhull's C++ interface [Dr. Dobb's 9/00 p. 29-38; OOPSLA '99 p. 399-414].
        -
         [Jan 2010] Suggestions
          - Generate vcproj from qtpro files
            cd qtpro && qmake -spec win32-msvc2005 -tp vc -recursive
            sed -i 's/C\:\/bash\/local\/qhull\/qtpro\///' qhull-all.sln
            Change qhullcpp to libqhull.dll
            Allow both builds on same host (keep /tmp separate)
        - - Make distribution -- remove tmp, news, .git, leftovers from project, change CRLF
        -     search for 2010.1, Dates
        -     qhulltest --all added to output
        -     Add md5sum
        -     Add test of user_eg3, etc.
          - C++ class for access to statistics, accumulate vs. add
          - Add dialog box to RoadError-- a virtual function?
          - Option 'Gt' does not make visible all facets of the mesh example, rbox 32 M1,0,1 | qhull d Gt
        - - Option to select bounded Voronoi regions [A. Uzunovic]
          - Merge small volume boundary cells into unbounded regions [Dominik Szczerba]
          - Postmerge with merge options
        - - Add const to C code
          - Add modify operators and MutablePointCoordinateIterator to PointCoordinates
        - - Add Qtest::toString() functions for QhullPoint and others.  QByteArray and qstrdup()
          - Fix option Qt for conformant triangulations of merged facets
          - Investigate flipped facet -- rbox 100 s D3 t1263080158 | qhull R1e-3 Tcv Qc
          - Add doc comments to c++ code
        @@ -937,7 +1409,7 @@
            qh-code.htm#inc on-line construction with qh_addpoint()
         - How to handle 64-bit possible loss of data.  WARN64, ptr_intT, size_t/int
         - Show custom of qh_fprintf
        -- grep 'qh_mem ' x | sort | awk '{ print $2; }' | uniq -c | grep -vE ' (2|4|6|8|10|12|14|16|20|64|162)[^0-9]'
        +- cat x.x | grep 'qh_mem ' | sort | awk '{ print $2; }' | uniq -c | grep -vE ' (2|4|6|8|10|12|14|16|20|64|162)[^0-9]'
         - qtpro/qhulltest contains .pro and Makefile.  Remove Makefiles by setting shadow directory to ../../tmp/projectname
         - Rules for use of qh_qh and multi processes
             UsingQhull
        @@ -1015,10 +1487,11 @@
          - track total number of ridges for summary and logging
         
         Performance improvements:
        + - GPU hardware acceleration, particularly for qh_setplane [D. Reese]
          - optimize Qhull for 2-d Delaunay triangulations
          -   use O'Rourke's '94 vertex->duplicate_edge
          -   add bucketing
        - -   better to specialize all of the code (ca. 2-3x faster w/o merging)
        + -   better to specialize all of the code (ca. 2-3x faster w/o meSrging)
          - use updated LU decomposition to speed up hyperplane construction
          -        [Gill et al. 1974, Math. Comp. 28:505-35]
          - construct hyperplanes from the corresponding horizon/visible facets
        @@ -1030,32 +1503,31 @@
         
         
        -

        Up: Home -page for Qhull
        -Up: Qhull manual: Table of -Contents
        -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
        -To: Qhull code: Table of Contents
        -Dn: Qhull functions, macros, and data -structures +

        + Up: Home page for Qhull (local)
        + Up: Qhull manual: contents
        + To: Programs + • Options + • Output + • Formats + • Geomview + • Print + • Qhull + • Precision + • Trace + • Functions (local)
        + To: Imprecision in Qhull
        + To: Qhull code: contents
        + -


        +

        The Geometry Center Home Page

        Comments to: qhull@qhull.org -
        -Created: Sept. 25, 1995 --- Last modified: see changes.txt

        +
        +Created: Sept. 25, 1995 --- Last modified: see Changes.txt

        diff -Nru qhull-2015.2/html/qh-eg.htm qhull-2020.2/html/qh-eg.htm --- qhull-2015.2/html/qh-eg.htm 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/html/qh-eg.htm 2020-08-16 18:08:32.000000000 +0000 @@ -8,8 +8,8 @@

        Up: Home -page for Qhull
        -Up: Qhull manual: Table of Contents
        +page for Qhull (local)
        +Up: Qhull manual: contents
        To: ProgramsOptionsOutput @@ -19,9 +19,8 @@ • QhullPrecisionTrace -• Functions
        -To: Qhull examples: Table of Contents (please wait -while loading)
        +• Functions (local)
        +To: Qhull examples: contents


        @@ -45,16 +44,18 @@

        To generate the Geomview examples, execute the shell script eg/q_eg. It uses rbox. The shell script eg/q_egtest generates -test examples, and eg/q_test exercises the code. If you +test examples, and eg/q_test exercises the code. Test and log +Qhull with eg/qtest.sh. eg/q_benchmark is a benchmark +of Qhull precision and performance. +If you find yourself viewing the inside of a 3-d example, use Geomview's normalization option on the 'obscure' menu.

        -

        Copyright © 1995-2015 C.B. Barber

        +

        Copyright © 1995-2020 C.B. Barber


        -

        »Qhull examples: Table of -Contents

        +

        »Qhull examples: contents

      • »Facet merging for - imprecision
          + imprecision + +

          If you regularly use Qhull on a Windows host, install a bash shell such as +

            +
          • Git for Windows (wiki, based on MSYS2) +-- Git for Windows v2.21 requires arguments for 'qhull', otherwise it waits for stdin. Use 'qhull --help' for a usage note instead of 'qhull'. +
          • MSYS2 (wiki) +
          • Cygwin +
          + +

          If you use Windows XP or Windows 8, you may use +

            +
          • MSYS +
          • Road Bash -- MSYS with useful utilities and shell scripts +

          »How do I enter points for Qhull?

          -

          Qhull takes its data from standard input. For example, create +

          Qhull takes its data from standard input (stdin). For example, create a file named 'data.txt' with the following contents:

          @@ -227,7 +248,7 @@ the vertices and edges. See also input format.

          -

          You can generate sample data with rbox, e.g., 'rbox 10' +

          You can generate sample data with rbox. For example, 'rbox 10' generates 10 random points in 3-d. Use a pipe ('|') to run rbox and qhull together, e.g.,

          @@ -257,43 +278,49 @@

          Look at Qhull's on-line documentation:

            -
          • 'qconvex' gives a synopsis of qconvex and its options -
          • 'rbox' lists all of the options for generating point sets -
          • 'qconvex - | more' lists the options for qconvex +
          • 'qconvex --help' gives a synopsis of qconvex and its options +
          • 'qconvex -' lists all of the options for qconvex
          • 'qconvex .' gives a concise list of options -
          • 'qdelaunay', 'qhalf', 'qvoronoi', and 'qhull' also have a synopsis and option list
          • +
          • 'qdelaunay', 'qhalf', 'qvoronoi', and 'qhull' also have a synopsis and options

          Then try out the Qhull programs on small examples.

            -
          • 'rbox c' lists the vertices of a cube -
          • 'rbox c | qconvex' is the convex hull of a cube -
          • 'rbox c | qconvex o' lists the vertices and facets of +
          • 'rbox c' -- lists the vertices of a cube +
          • 'rbox c D2 | qconvex' -- is the convex hull of a square +
          • 'rbox c D2 | qconvex o' -- lists the vertices and facets of + a square +
          • 'rbox c | qconvex' -- is the convex hull of a cube +
          • 'rbox c | qconvex o' -- lists the vertices and facets of a cube -
          • 'rbox c | qconvex Qt o' triangulates the cube -
          • 'rbox c | qconvex QJ o' joggles the input and +
          • 'rbox c | qconvex Qt o' -- triangulates the cube +
          • 'rbox c | qconvex QJ o' -- joggles the input and triangulates the cube -
          • 'rbox c D2 | qconvex' generates the convex hull of a - square -
          • 'rbox c D4 | qconvex' generates the convex hull of a - hypercube -
          • 'rbox 6 s D2 | qconvex p Fx' lists 6 random points in - a circle and lists the vertices of their convex hull in order -
          • 'rbox c D2 c G2 | qdelaunay' computes the Delaunay - triangulation of two embedded squares. It merges the cospherical facets. -
          • 'rbox c D2 c G2 | qdelaunay Qt' computes the Delaunay - triangulation of two embedded squares. It triangulates the cospherical facets. -
          • 'rbox c D2 c G2 | qvoronoi o' computes the - corresponding Voronoi vertices and regions. -
          • 'rbox c D2 c G2 | qvoronio Fv' shows the Voronoi diagram +
          • 'rbox c D4 | qconvex' -- is the convex hull of a hypercube +

            +
          • 'rbox 6 s D2 t | qconvex p Fx' -- is the convex hull of 6 random, cocircular points. + Option 'p' lists the points while option 'Fx' lists the vertices in order. +

            +
          • 'rbox d D2 c G2 | qdelaunay' -- is the Delaunay + triangulation of a diamond and a square. The diamond's vertices are cocircular. +
          • 'rbox d D2 c G2 | qdelaunay o' -- lists the input sites projected + to a paraboloid and the Delaunay regions. The region with 4 vertices is the diamond. +
          • 'rbox d D2 c G2 | qdelaunay o Qt' -- the cocircular diamond is triangulated as two Delaunay regions. +
          • 'rbox d D2 c G2 | qdelaunay o QJ' -- the input is joggled and the diamond is triangulated. +

            +
          • 'rbox d D2 c G2 | qvoronoi o' -- is the Voronoi regions for a diamond and a square. The Voronoi vertex + for the diamond is the origin (0,0). Unbounded regions are represented by the first vertex (-10.101 -10.101) +
          • 'rbox d D2 c G2 | qvoronoi Fv' -- shows the Voronoi diagram for the previous example. Each line is one edge of the diagram. The first number is 4, the next two numbers list a pair of input sites, and the last two numbers list the corresponding pair of Voronoi vertices.
          • -
          +
        • 'rbox d D2 c G2 | qvoronoi o Qt' -- the cocircular Delaunay region is triangulated. Instead of one Voronoi vertex + for the diamond, there are two Voronoi vertices (0,0) and (0,0). +

        Install Geomview if you are running SGI Irix, Solaris, SunOS, Linux, HP, IBM @@ -307,17 +334,17 @@

        You will need to decide how Qhull should handle precision problems. It can triangulate the output ('Qt'), joggle the input ('QJ'), or merge facets (the default).

        + href="qh-optq.htm#Qt">Qt'), joggle the input ('QJ'), or merge facets (the default).

          +
        • With triangulated output, Qhull merges facets and triangulates + the result.
        • With joggle, Qhull produces simplicial (i.e., triangular) output by joggling the input. After joggle, no points are cocircular or cospherical.
        • With facet merging, Qhull produces a better - approximation and does not modify the input. -
        • With triangulated output, Qhull merges facets and triangulates - the result.
        • + approximation than joggle, nor does it modify the input.
        • See Merged facets or joggled input.
        @@ -327,14 +354,18 @@

        »How do I report just the area and volume of a convex hull?

        -Use option 'FS'. For example, +Use option 'FS' or 'FA'. +The area is the area of the surface of the convex hull, while +the volume is the total volume of the convex hull. + +

        For example,

        -C:\qhull>rbox 10 | qconvex FS
        +rbox 10 | qconvex FS
         0
         2 2.192915621644613 0.2027867899638665
         
        -C:\qhull>rbox 10 | qconvex FA
        +rbox 10 | qconvex FA
         
         Convex hull of 10 points in 3-d:
         
        @@ -351,16 +382,51 @@
           Total volume:       0.20278679
         
        +

        +In 2-d, the convex hull is a polygon. +Its surface is the edges of a polygon. So in 2-d, the 'area' is the length of the polygon's edges, while +the 'volume' is the area of the polygon. + +

        For example the convex hull of a square, + +

        +rbox c D2 | qconvex FS
        +0
        +2      4      1
        +
        +rbox c D2 | qconvex FA
        +
        +Convex hull of 4 points in 2-d:
        +
        +  Number of vertices: 4
        +  Number of facets: 4
        +
        +Statistics for: rbox c D2 | qconvex FA
        +
        +  Number of points processed: 4
        +  Number of hyperplanes created: 6
        +  Number of distance tests for qhull: 5
        +  CPU seconds to compute hull (after input):  0
        +  Total facet area:    4
        +  Total volume:        1
        +
        + +

        »Why are there extra points in a 4-d or higher convex hull?

        -

        You may see extra points if you use options 'i' or 'Ft' - without using triangulated output ('Qt'). -The extra points occur when a facet is non-simplicial (i.e., a -facet with more than d vertices). For example, Qhull +

        Options 'i' (in 4-D and higher) and 'Ft' + (in 3-D and higher) use "extra" points for non-simplicial facets (e.g., a face +of a cube or hypercube). These points are not part +of the convex hull. Options 'i' and 'Ft' triangulate non-simplicial facets using +the facet's centrum. + +

        For example, Qhull reports the following for one facet of the convex hull of a hypercube. -Option 'Pd0:0.5' returns the facet along the positive-x axis:

        +The facets of a 4-D hypercube are 3-d cubes. +Option 'Pd0:0.5' returns the facet along the positive-x axis. Point 17 +represents the centrum of this facet. The facet's vertices are eight points: point 8 to point 15

        @@ -378,6 +444,17 @@
         17 13 9 8
         17 9 11 8
         17 11 9 13
        +
        +rbox c D4 | qconvex Fx Pd0:0.5
        +8
        +8
        +9
        +10
        +11
        +12
        +13
        +14
        +15
         
        @@ -419,7 +496,9 @@

        The coordinates of the extra point are printed with the 'Ft' option.

        +href="qh-optf.htm#Ft">Ft' option. For centrums, option 'Ft' uses +indices one less than option 'i'. In this case, point 16 represents +the centrum of the facet.

        @@ -509,6 +588,12 @@
         property of Delaunay triangles.  This is independent of the area of
         the Delaunay triangles.  Qhull does handle nearly coincident points.
         
        +

        If you are calling Qhull from a program, you can merge slivers into an adjacent facet. +In d dimensions with simplicial facets (e.g., from 'Qt'), each facet has +d+1 neighbors. Each neighbor shares d vertices of the facet's d+1 vertices. Let the +other vertex be the opposite vertex. For each neighboring facet, if its circumsphere +includes the opposite.vertex, the two facets can be merged. [M. Treacy] +

        You can handle collinear or coplanar boundary points by enclosing the points in a box. For example, (rbox c P0 P0,0.4999999999 c G1 | qdelaunay Fa), surrounds the @@ -601,8 +686,8 @@ tetrahedron 2 9 5 8.

        You can also use the Qhull library to generate the triangles. -See "How do I visit the ridges of a -Delaunay triangulation?"

        +See 'How do I visit the ridges of a +Delaunay triangulation?'

        »How do I construct a 3-d Delaunay triangulation?

        @@ -611,7 +696,7 @@ use triangulated output ('Qt') or joggled input ('QJ'). Otherwise option 'i' will -triangulate non-simplicial facets by adding a point to the facet. +triangulate non-simplicial facets with the facet's centrum.

        If you want non-simplicial output for cospherical sites, use option @@ -664,10 +749,8 @@

        If you want simplicial output use options -'Qt i' or -'QJ i', e.g., +'Qt i' or +'QJ i', e.g.,

        @@ -763,7 +846,7 @@

        rbox 10 D2 | qconvex Fx

        -

        »Can Qhull triangulate +

        »Can Qhull triangulate a hundred 16-d points?

        No. This is an immense structure. A triangulation of 19, 16-d @@ -774,8 +857,7 @@ too slow to use.

        -

        »Voronoi -diagram questions

        +

        »Voronoi diagram questions

        »How do I compute the volume of a Voronoi region?

        @@ -950,7 +1032,7 @@

        »How do I construct the Voronoi diagram of cospherical points?

        -

        Three-d terrain data can be approximated with cospherical +

        Three-dimensional terrain data can be approximated with cospherical points. The Delaunay triangulation of cospherical points is the same as their convex hull. If the points lie on the unit sphere, the facet normals are the Voronoi vertices [via S. Fortune].

        @@ -1050,10 +1132,11 @@ unbounded rays of the Voronoi diagram?

        Use 'Fo' to compute the separating -hyperplanes for unbounded Voronoi regions. The corresponding ray -goes to infinity from the Voronoi vertices. If you enclose the +hyperplanes for unbounded Voronoi regions. The corresponding ray +goes to infinity from the Voronoi vertices. The midpoint between input +sites replaces the Voronoi vertex at infinity. Alternatively, if you enclose the input sites in a large enough box, the outermost bounded regions -will represent the unbounded regions of the original points.

        +will represent the unbounded regions of the original points.

        If you do not box the input sites, you can identify the unbounded regions. They list '0' as a vertex. Vertex 0 represents @@ -1135,22 +1218,18 @@

        MATLAB

        Z. You of MathWorks added qhull to MATLAB 6. -See functions convhulln, - delaunayn, - griddata3, - griddatan, - tsearch, - tsearchn, and - voronoin. V. Brumberg update MATLAB R14 for Qhull 2003.1 and triangulated output. -

        Engwirda wrote mesh2d for unstructured mesh generation in MATLAB. +

        Engwirda wrote mesh2d for unstructured mesh generation in MATLAB. It is based on the iterative method of Persson and generally results in better quality meshes than delaunay refinement. @@ -1184,7 +1263,7 @@

        Qhull does not create ridges for simplicial facets. Instead it computes ridges from facet->neighbors. To make ridges for a -simplicial facet, use qh_makeridges() in merge.c. Usefacet->visit_id to visit +simplicial facet, use qh_makeridges() in merge.c. Use facet->visit_id to visit each ridge once (instead of twice). For example,

        @@ -1211,7 +1290,7 @@
         
         See user_eg.c and "Qhull-template" in user_r.c for examples..
         
        -See Qhull internals for an introduction to Qhull's reentrant library and its C++ interface.
        +See Qhull code for an introduction to Qhull's reentrant library and its C++ interface.
         
         

        Hint: Start with a small example for which you know the answer.

        @@ -1222,6 +1301,12 @@ The size depends on the dimension. Use option 'Ts' to print out the memory statistics [e.g., 'rbox D2 10 | qconvex Ts']. +

        Qhull's data structures use many pointers. For 64-bit code, pointers are twice +the size of integers. For 64-bit code, Qhull uses 50% more +memory. It there is not enough memory in the computer's level 1 and level 2 +caches, Qhull will run slower as it retrieves data from main memory. A future +version of Qhull will include memory and performance improvements for 64-bit +code.

        »Can Qhull construct convex hulls and Delaunay triangulations one point at a time?

        @@ -1296,11 +1381,6 @@ } -

        Qhull should be redesigned as a class library, or at least as -an API. It currently provides everything needed, but the -programmer has to do a lot of work. Hopefully someone will write -C++ wrapper classes or a Python module for Qhull.

        -

        »How do I visit the Delaunay regions?

        @@ -1365,6 +1445,10 @@

        »How do I find the facet that is closest to a point?

        +

        See Locate facet with qh_findbestfacet. +For Delaunay triangulations, qh_findbestfacet returns the Delaunay triangle or +adjacent triangle that contains the point. +

        Use qh_findbestfacet(). For example,

        @@ -1377,7 +1461,7 @@
         
             facet= qh_findbestfacet (point, qh_ALL, &bestdist, &isoutside);
         
        -    /* 'facet' is the closest facet to 'point' */
        +    /* 'facet' or an adjacent facet is the closest facet to 'point' */
         

        qh_findbestfacet() performs a directed search for the facet @@ -1388,9 +1472,9 @@ all of the facet's neighbors. The exhaustive search may be skipped for spherical distributions.

        -

        Also see, "How do I find the +

        Also see, 'How do I find the Delaunay triangle that is closest to a -point?"

        +point?'

        »How do I find the Delaunay triangle or Voronoi region that is closest to a point?

        @@ -1404,12 +1488,12 @@

        First compute the Delaunay triangle with qh_new_qhull() in user_r.c or Qhull::runQhull(). Lift the point to the paraboloid by summing the squares of the -coordinates. Use qh_findbestfacet() [poly2.c] to find the closest Delaunay -triangle. Determine the closest vertex to find the corresponding +coordinates. Use qh_findbestfacet [poly2_r.c] to find the closest Delaunay facet or +adjacent facet. Determine the closest vertex to find the corresponding Voronoi region. Do not use options 'Qbb', 'QbB', 'Qbk:n', or 'QBk:n' since these scale the last + href="qh-optq.htm#QBk">QBk:n' since these scale the last coordinate. Optimizations of qh_findbestfacet() should be possible for Delaunay triangulations.

        @@ -1430,21 +1514,21 @@ qh_setdelaunay (DIM+1, 1, point); facet= qh_findbestfacet (point, qh_ALL, &bestdist, &isoutside); - /* 'facet' is the closest Delaunay triangle to 'point' */ + /* 'facet' or an adjacent facet is the closest Delaunay triangle to 'point' */ -

        The returned facet either contains the point or it is the +

        The returned facet either contains the point, or an adjacent facet contains +the point, or it is the closest Delaunay triangle along the convex hull of the input set.

        Point location is an active research area in Computational -Geometry. For a practical approach, see Mucke, et al, "Fast randomized -point location without preprocessing in two- and -three-dimensional Delaunay triangulations," Computational -Geometry '96, p. 274-283, May 1996. +Geometry. For a practical approach, see Mucke, et al, +"Fast randomized point location without preprocessing in two- and three-dimensional Delaunay triangulations," +Computational Geometry '96, p. 274-283, May 1996. For an introduction to planar point location see [O'Rourke '93]. -Also see, "How do I find the facet that is closest to a -point?"

        +point?'

        To locate the closest Voronoi region, determine the closest vertex of the closest Delaunay triangle.

        @@ -1511,9 +1595,11 @@

        -

        Up: Home page for Qhull
        -Up: Qhull manual: Table of Contents
        +

        Up:Home page for Qhull (local)
        +Up: Qhull Wiki and +FAQ (local)
        +Up: Qhull manual: contents
        +To: Imprecision in Qhull
        To: ProgramsOptionsOutput @@ -1523,8 +1609,9 @@ • QhullPrecisionTrace -• Functions
        -To: FAQ: Table of Contents
        +• Functions (local)
        +To: FAQ: contents
        +


        @@ -1533,7 +1620,7 @@ Home Page

        Comments to: qhull@qhull.org -
        +
        Created: Sept. 25, 1995 --- Last modified: see top

        Binary files /tmp/tmp2a6lzxqx/gv_ieYLzWR/qhull-2015.2/html/qh_findbestfacet-drielsma.pdf and /tmp/tmp2a6lzxqx/pCF8Btkq7H/qhull-2020.2/html/qh_findbestfacet-drielsma.pdf differ diff -Nru qhull-2015.2/html/qh-get.htm qhull-2020.2/html/qh-get.htm --- qhull-2015.2/html/qh-get.htm 2016-01-18 23:59:11.000000000 +0000 +++ qhull-2020.2/html/qh-get.htm 2020-09-04 02:01:54.000000000 +0000 @@ -7,7 +7,7 @@ -

        Up: Qhull Home Page
        +

        Up: Qhull Home Page (www.qhull.org)


        @@ -29,50 +29,53 @@

        Visit Qhull News for news, bug reports, change history, and users. - If you use Qhull 2003.1 or 2009.1, please upgrade to 2015.2 or apply + If you use Qhull 2003.1 or 2009.1, please upgrade or apply poly.c-qh_gethash.patch.

      • Download: - Qhull 2015.2 for Windows 10, 8, 7, XP, and NT (2.6 MB, - readme, - md5sum, - contents) + href="http://www.qhull.org/download/qhull-2020.2.zip">Download: + Qhull 2020.2 for Windows 10, 8, 7, XP, and NT (3.3 MB, + readme, + md5sum, + contents)

        Type: console programs for Windows (32- or 64-bit)

        Includes 32-bit executables, documentation, and sources files. It runs in a command window. Qhull may be compiled for 64-bits.

        -
      • GitHub Qhull (git@github.com:qhull/qhull.git) -

        Type: git repository for Qhull. See recent Changes.txt

        +

        Type: git repository for Qhull. See current Changes.txt

        Includes documentation, source files, C++ interface, and test programs. It builds with gcc, mingw, CMake, DevStudio, and Qt Creator.

      • -
      • Download: Qhull 2015.2 for Unix (1.0 MB, - readme, - md5sum, - contents) -

        Type: C/C++ source code for 32-bit and 64-bit architectures. See Changes.txt

        +
      • Download: Qhull 2020.2 for Unix (1.3 MB, + readme, + md5sum, + contents) +

        Type: C/C++ source code for 32-bit and 64-bit architectures.

        Includes documentation, source files, Makefiles, CMakeLists.txt, DevStudio projects, and Qt projects. - Includes preliminary C++ support.

        + Includes C++ support.

        Download and search sites for pre-built packages include

      • +
      • The Quickhull algorithm for convex hulls (PDF, 307K) -
      • Download: - Article about Qhull (307K)

        Type: PDF on ACM Digital Library (from this page only)

        Barber, C.B., Dobkin, D.P., and Huhdanpaa, H.T., "The Quickhull algorithm for convex hulls," ACM Transactions on Mathematical Software, 22(4):469-483, Dec 1996 [abstract].

        + + +
        + +

      • + +
      • Sept. 3, 2020 22:00:41 EDT md5sum for Qhull 2020.2 downloads +
        +368f2aa9bf89677af04d57d281041359 *qhull-2020.2/qhull-2020.2-zip.md5sum
        +27c44a7e2db5f127e1c6fc7807580566 *qhull-2020.2/qhull-2020-src-8.0.2-tgz.md5sum
        +a1a58969aa17d89088ebbd0b0eb44a82 *qhull-2020.2.zip
        +fa34047579937433e3a36c5d4033a988 *qhull-2020-src-8.0.2.tgz
        +
      • +

      -

      Up: Qhull Home Page
      +

      Up: Qhull Home Page (www.qhull.org)


      @@ -101,6 +113,7 @@

      [HOME] The Geometry Center Home Page

      -

      Comments to: qhull@qhull.org
      +

      Comments to: qhull@qhull.org +
      diff -Nru qhull-2015.2/html/qh-impre.htm qhull-2020.2/html/qh-impre.htm --- qhull-2015.2/html/qh-impre.htm 2016-01-19 02:55:56.000000000 +0000 +++ qhull-2020.2/html/qh-impre.htm 2020-08-16 18:14:53.000000000 +0000 @@ -8,9 +8,8 @@

      Up: Home -page for Qhull
      -Up: Qhull manual: Table of -Contents
      +page for Qhull (local)
      +Up: Qhull manual: contents
      To: ProgramsOptionsOutput @@ -20,9 +19,8 @@ • QhullPrecisionTrace -• Functions
      -To: Qhull imprecision: Table of Contents -(please wait while loading) +• Functions (local)
      +To: Qhull imprecision: contents


      @@ -32,11 +30,11 @@ height="100"> Imprecision in Qhull

      This section of the Qhull manual discusses the problems caused -by coplanar points and why Qhull uses options 'C-0' or 'Qx' -by default. If you ignore precision issues with option 'C-0' or 'Qx'. +If you ignore precision issues with option 'Q0', the output from Qhull can be -arbitrarily bad. Qhull avoids precision problems if you merge facets (the default) or joggle +arbitrarily bad. Qhull avoids most precision problems if you merge facets (the default) or joggle the input ('QJ').

      @@ -47,22 +45,21 @@

      Qhull automatically tests for convexity if it detects precision errors while constructing the hull.

      -

      Copyright © 1995-2015 C.B. Barber

      +

      Copyright © 1995-2020 C.B. Barber


      -

      »Qhull -imprecision: Table of Contents

      +

      »Qhull imprecision: contents

      @@ -90,6 +87,8 @@
    • Approximation error occurs when the user wants an approximate result because the exact result contains too much detail.
    • +
    • Topological error occurs when the topology of mathematical + convex hulls is broken by facet merging or vertex merging.

    Under imprecision, calculations may return erroneous results. @@ -120,13 +119,19 @@ modification is tried. When no precision errors occur, Qhull is done.

    +

    Joggled input avoids merged facets and the topological issues that +may arise. If your application is sensitive to errors, consider joggled +input and the corresponding flag, qh_NOmerge. +

    Qhull 3.1 and later provides option 'Qt' -for triangulated output. This removes the need for -joggled input ('QJ'). -Non-simplicial facets are triangulated. +for triangulated output. Non-simplicial facets are triangulated. The facets may have zero area. Triangulated output is particularly useful for Delaunay triangulations.

    +

    Qhull 2019.1 includes an experimental option ('Q14') to merge nearly adjacent +vertices due to duplicated ridges. If reports a topological error if merging fails to resolve the issue. Further +work is needed. +

    By handling round-off errors, Qhull can provide a variety of output formats. For example, it can return the halfspace that defines each facet ('n'). The @@ -164,32 +169,36 @@

    • Use merged facets (the default) when you want non-simplicial output (e.g., the faces of a cube). -
    • Use merged facets and triangulated output ('Qt') when -you want simplicial output and coplanar facets (e.g., triangles for a Delaunay triangulation).
    • Use joggled input ('QJ') when you need clearly-convex, simplicial output. +
    • Use joggled input if your code is sensitive to errors. Joggled input handles +all inputs, even highly degenerate inputs such as 100 identical points. If you compile +with qh_NOmerge, Qhull +does not contain code for merging facets. It uses joggled input instead. +
    • Otherwise, use merged facets and triangulated output ('Qt') when +you want simplicial output and coplanar facets (e.g., triangles for a Delaunay triangulation).

    The choice between merged facets and joggled input depends on the application. Both run about the same speed. Joggled input may be faster if the initial joggle is sufficiently large to avoid -precision errors. - -

    Most applications should used merged facets -with triangulated output.

    +precision errors. Although less precise, joggled +input is more reliable than merged facets. A future version of Qhull will provide +per vertex joggle.

    Use merged facets (the default, 'C-0') or triangulated output ('Qt') if

    -
    • Your application supports non-simplicial facets, or it allows degenerate, simplicial facets (option 'Qt').
    • You do not want the input modified.
    • +
    • Your input coordinates start with the same five or more digits (i.e., it is shifted + relative to the origin). This reduces the available precision.
    • +
    • You use single precision arithmetic (realT). +
    • You want to set additional options for approximating the hull.
    • -
    • You use single precision arithmetic (realT). -

    Use joggled input ('QJ') if

    @@ -198,6 +207,7 @@
  • Your application needs clearly convex, simplicial output
  • Your application supports perturbed input points and narrow triangles.
  • Seven significant digits is sufficient accuracy.
  • +
  • Your application is sensitive to errors.
  • You may use both techniques or combine joggle with @@ -214,12 +224,184 @@

    Merged facets ('C-0') handles precision problems directly. If a precision problem occurs, Qhull merges one of the offending facets into one of its neighbors. -Since all precision problems in Qhull are associated with one or -more facets, Qhull will either fix the problem or attempt to merge the -last remaining facets.

    +With multiple merges, topological problems may lead to severe precision +problems, or prevent Qhull from continuing. Otherwise, Qhull will either +fix the problem or attempt to merge the last remaining facets.

    + + +

    »Joggled input

    + +

    Joggled input is a simple work-around for precision problems +in computational geometry ["joggle: to shake or jar +slightly," Amer. Heritage Dictionary]. Other names are +jostled input or random perturbation. +Qhull joggles the +input by modifying each coordinate by a small random quantity. If +a precision problem occurs, Qhull joggles the input with a larger +quantity and the algorithm is restarted. This process continues +until no precision problems occur. Unless all inputs incur +precision problems, Qhull will terminate. Qhull adjusts the inner +and outer planes to account for the joggled input.

    + +

    Neither joggle nor merged facets has an upper bound for the width of the output +facets, but both methods work well in practice. Joggled input is +easier to justify. Precision errors occur when the points are +nearly singular. For example, four points may be coplanar or +three points may be collinear. Consider a line and an incident +point. A precision error occurs if the point is within some +epsilon of the line. Now joggle the point away from the line by a +small, uniformly distributed, random quantity. If the point is +changed by more than epsilon, the precision error is avoided. The +probability of this event depends on the maximum joggle. Once the +maximum joggle is larger than epsilon, doubling the maximum +joggle will halve the probability of a precision error.

    + +

    With actual data, an analysis would need to account for each +point changing independently and other computations. It is easier +to determine the probabilities empirically ('TRn') . For example, consider +computing the convex hull of the unit cube centered on the +origin. The arithmetic has 16 significant decimal digits.

    + +
    +

    Convex hull of unit cube

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    joggleerror prob.
    1.0e-150.983
    2.0e-150.830
    4.0e-150.561
    8.0e-150.325
    1.6e-140.185
    3.2e-140.099
    6.4e-140.051
    1.3e-130.025
    2.6e-130.010
    5.1e-130.004
    1.0e-120.002
    2.0e-120.001
    +
    + +

    A larger joggle is needed for multiple points. Since the +number of potential singularities increases, the probability of +one or more precision errors increases. Here is an example.

    + +
    +

    Convex hull of 1000 points on unit cube

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    joggleerror prob.
    1.0e-120.870
    2.0e-120.700
    4.0e-120.450
    8.0e-120.250
    1.6e-110.110
    3.2e-110.065
    6.4e-110.030
    1.3e-100.010
    2.6e-100.008
    5.1e-090.003
    +
    + +

    Other distributions behave similarly. No distribution should +behave significantly worse. In Euclidean space, the probability +measure of all singularities is zero. With floating point +numbers, the probability of a singularity is non-zero. With +sufficient digits, the probability of a singularity is extremely +small for random data. For a sufficiently large joggle, all data +is nearly random data.

    + +

    Qhull uses an initial joggle of 30,000 times the maximum +roundoff error for a distance computation. This avoids most +potential singularities. If a failure occurs, Qhull retries at +the initial joggle (in case bad luck occurred). If it occurs +again, Qhull increases the joggle by ten-fold and tries again. +This process repeats until the joggle is a hundredth of the width +of the input points. Qhull reports an error after 100 attempts. +This should never happen with double-precision arithmetic. Once +the probability of success is non-zero, the probability of +success increases about ten-fold at each iteration. The +probability of repeated failures becomes extremely small.

    + +

    Merged facets produces a significantly better approximation. +Empirically, the maximum separation between inner and outer +facets is about 30 times the maximum roundoff error for a +distance computation. This is about 2,000 times better than +joggled input. Most applications though will not notice the +difference.

    -

    »Delaunay -triangulations

    +

    »Delaunay triangulations

    Programs that use Delaunay triangulations traditionally assume a triangulated input. By default, qdelaunay @@ -269,7 +451,7 @@ -

    »Merged facets

    +

    »Merged facets

    Qhull detects precision problems when computing distances. A precision problem occurs if @@ -303,9 +485,9 @@ can be high by the maximum roundoff error.

    With the 'C-n' or 'A-n ' options, Qhull merges non-convex +href="qh-optc.htm#An">A-n' options, Qhull merges non-convex facets while constructing the hull. The remaining facets are -clearly convex. With the 'Qx ' +clearly convex. With the 'Qx' option, Qhull merges coplanar facets after constructing the hull. While constructing the hull, it merges coplanar horizon facets, flipped facets, concave facets and duplicated ridges. With ' +

    If a topological error occurs, such as more than two neighbors for a newly created ridge, +Qhull may merge nearly adjacent vertices.

    »Limitations of merged facets

    @@ -361,7 +545,8 @@
  • Uneven dimensions -- If one coordinate has a larger absolute value than other coordinates, it may dominate the effect of roundoff errors on -distance computations. You may use option 'QbB' to scale points to the unit cube. For Delaunay triangulations and Voronoi diagrams, qdelaunay and qvoronoi always set @@ -381,8 +566,8 @@ The distributions are the same but the first is compressed to a 2e-14 slab.

    -

  • Post-merging of coplanar facets -- In 5-d and higher, option 'Qx' -(default) delays merging of coplanar facets until post-merging. +
  • Post-merging of coplanar facets -- In 5-d and higher, the default option 'Qx' +delays merging of coplanar facets until post-merging. This may allow "dents" to occur in the intermediate convex hulls. A point may be poorly partitioned and force a poor approximation. See option 'Qx' for @@ -404,7 +589,7 @@ good job of pre-merging in 2-d, 3-d, and 4-d. With the 'Qx' option, it does a good job in higher dimensions. In 5-d and higher, Qhull does poorly at -detecting redundant vertices.

    +detecting redundant vertices.

    In the summary ('s'), look at the ratio between the maximum facet width and the maximum width of a @@ -479,31 +664,52 @@ add option 'Qbb', or add the origin ('P0') to the input.

    -

  • Nearly coincident points on an edge -- Multiple, nearly coincident points on -an edge with non-simplicial facets may lead to wide facets or quadratic running time. -For example, either the convex hull -in 4-D of a narrow lens with coincident points or the Delaunay triangulation of -nearly coincident points may lead to very wide facets (e.g., 2267021951.3x). - -

    For Delaunay triangulations an edge occurs between the corresponding upper -and lower convex hull. Points on this edge correspond to vertices of the convex hull of the input sites. -After multiple facet merges, four facets may share the same, duplicate ridge and must be merged. -Some of these facets may be long and narrow, leading to a very wide merged facet. -Starting with Qhull 2015.1, an error is reported. - -

    Duplicate ridges occur when the horizon facets for a new point is "pinched". -In a duplicate ridge, a subridge (e.g., a line segment in 3-d) is shared by two horizon facets. -At least two of its vertices are nearly coincident. Qhull 2015.1 adds the 'Cn,r,m' option to rbox. -This option generates nearly coincident points. For example, every point of the following -distributions has a nearly coincident point within a 1e-13 ball. -Substantially smaller or larger balls do not lead to pinched horizons. +

  • Nearly adjacent vertices within 1e-13 -- +Multiple, nearly adjacent vertices within a 1e-13 ball in the unit cube +may lead to topological errors and wide facets. The experimental option 'Q14' +for Qhull 2019.1 merges nearly adjacent vertices to resolve dupridges. A dupridge is a topological +error where multiple facets meet at the same ridge. Further improvements are needed, primarily for 4-D and higher. +For example, the Delaunay triangulation of 400 pairs of nearly adjacent 5-D points frequently fails with +a topological error (eg/qtest.sh 10 '400 C1,2e-13 D5' 'Q14 d Qbb'). + +

    For Delaunay triangulations, the problem typically occurs for extreme points of the input +set (i.e., on the edge between the upper and lower convex hull). After multiple facet merges, four +facets may share a "dupridge" and must be merged. +Some of these facets may be twisted relative to each other, leading to a very wide merged facet. +If so, error QH6271 is reported. It may be overriden with option 'Q12'. + +

    A "dupridge" may occur when the horizon facets for a new point is "pinched" (i.e., two vertices are +nearly adjacent). +If a subridge (e.g., a line segment in 3-d) is shared by two horizon facets, the four corresponding +new facets meet at the same ridge, called a "dupridge". +In poly_r.c, qh_matchnewfacets calls qh_matchneighbor. +qh_matchneighbor identifies dupridges for matching by qh_matchdupridge. +In merge_r.c, qh_mark_dupridges identifies facets for merging across a dupridge. If vertices are +nearly adjacent, qh_merge_pinchedvertices merges the vertices, otherwise qh_forcedmerges +merges the facets. qh_forcedmerges checks for wide merges with qh_check_dupridge. + +

    It is easy to generate nearly adjacent or coincident points with rbox +option 'Cn,r,m'. It generates n points within an r ball for each of m input sites. For example, +the following examples successfully merge pinched vertices. Substantially smaller or larger balls do +not lead to pinched horizons.

    -        rbox L100 1000 D4 s C1,1e-13 t | qhull
    -        rbox 75 C1,1E-13 t | qhull d
    +        rbox 2000 C1,1e-13 D4 s t | qhull Q14
    +        rbox 500 C1,1e-13 t | qhull Q14 d Qbb
     
    -For Delaunay triangulations, a bounding box may alleviate this error (e.g., rbox 500 C1,1E-13 t c G1 | qhull d). -A later release of qhull will avoid pinched horizons by merging duplicate subridges. A subridge is -merged by merging adjacent vertices. +For Delaunay triangulations, a bounding box may alleviate this issue (e.g., rbox 500 C1,1E-13 D4 t c G1.0 | qhull Q14 d Qbb). +The Delaunay triangulation of a regular mesh is likewise sensitive to nearly adjacent vertices. +
    +        rbox 2000 M3,4,5 D4 C1,1e-8 | qhull Q14 d Qbb
    +
    +

    +

  • Topological errors -- Merging facets and vertices may lead to topological errors that do +not occur for mathematical, convex hulls. Qhull merges redundant or degenerate facets. +With option 'Q14', Qhull tries to correct "dupridges" by merging vertices or facets (see previous issue). +It corrects some instances of dupridges. Qhull reports a "Qhull topology error" if +a topological error leads to a wide facet or if Qhull fails to create a cone of new facets. +It leaves other cases as is. The orientation of nonsimplicial facets is ill-defined. +Ridges may have the same vertices. Adjacent nonsimplicial +facets may have incompatible triangulations. These problems may be addressed in future releases of Qhull.

  • Facet with zero-area -- It is possible for a zero-area facet to be convex with its @@ -518,7 +724,7 @@ and two of the facets are not clearly convex. This typically occurs when the convexity constraints are too strong or the input points are degenerate. The former is more likely in 5-d and -higher -- especially with option 'C-n'.

    +higher -- especially with option 'C-n'.

  • Deleted cone -- Lots of merging can end up deleting all @@ -536,7 +742,7 @@

    The triangulation process detects degenerate facets with only two neighbors. These are marked degenerate. They have -zero area. +zero area.

  • Coplanar points -- @@ -568,178 +774,6 @@ -

    »Joggled input

    - -

    Joggled input is a simple work-around for precision problems -in computational geometry ["joggle: to shake or jar -slightly," Amer. Heritage Dictionary]. Other names are -jostled input or random perturbation. -Qhull joggles the -input by modifying each coordinate by a small random quantity. If -a precision problem occurs, Qhull joggles the input with a larger -quantity and the algorithm is restarted. This process continues -until no precision problems occur. Unless all inputs incur -precision problems, Qhull will terminate. Qhull adjusts the inner -and outer planes to account for the joggled input.

    - -

    Neither joggle nor merged facets has an upper bound for the width of the output -facets, but both methods work well in practice. Joggled input is -easier to justify. Precision errors occur when the points are -nearly singular. For example, four points may be coplanar or -three points may be collinear. Consider a line and an incident -point. A precision error occurs if the point is within some -epsilon of the line. Now joggle the point away from the line by a -small, uniformly distributed, random quantity. If the point is -changed by more than epsilon, the precision error is avoided. The -probability of this event depends on the maximum joggle. Once the -maximum joggle is larger than epsilon, doubling the maximum -joggle will halve the probability of a precision error.

    - -

    With actual data, an analysis would need to account for each -point changing independently and other computations. It is easier -to determine the probabilities empirically ('TRn') . For example, consider -computing the convex hull of the unit cube centered on the -origin. The arithmetic has 16 significant decimal digits.

    - -
    -

    Convex hull of unit cube

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    joggleerror prob.
    1.0e-150.983
    2.0e-150.830
    4.0e-150.561
    8.0e-150.325
    1.6e-140.185
    3.2e-140.099
    6.4e-140.051
    1.3e-130.025
    2.6e-130.010
    5.1e-130.004
    1.0e-120.002
    2.0e-120.001
    -
    - -

    A larger joggle is needed for multiple points. Since the -number of potential singularities increases, the probability of -one or more precision errors increases. Here is an example.

    - -
    -

    Convex hull of 1000 points on unit cube

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    joggleerror prob.
    1.0e-120.870
    2.0e-120.700
    4.0e-120.450
    8.0e-120.250
    1.6e-110.110
    3.2e-110.065
    6.4e-110.030
    1.3e-100.010
    2.6e-100.008
    5.1e-090.003
    -
    - -

    Other distributions behave similarly. No distribution should -behave significantly worse. In Euclidean space, the probability -measure of all singularities is zero. With floating point -numbers, the probability of a singularity is non-zero. With -sufficient digits, the probability of a singularity is extremely -small for random data. For a sufficiently large joggle, all data -is nearly random data.

    - -

    Qhull uses an initial joggle of 30,000 times the maximum -roundoff error for a distance computation. This avoids most -potential singularities. If a failure occurs, Qhull retries at -the initial joggle (in case bad luck occurred). If it occurs -again, Qhull increases the joggle by ten-fold and tries again. -This process repeats until the joggle is a hundredth of the width -of the input points. Qhull reports an error after 100 attempts. -This should never happen with double-precision arithmetic. Once -the probability of success is non-zero, the probability of -success increases about ten-fold at each iteration. The -probability of repeated failures becomes extremely small.

    - -

    Merged facets produces a significantly better approximation. -Empirically, the maximum separation between inner and outer -facets is about 30 times the maximum roundoff error for a -distance computation. This is about 2,000 times better than -joggled input. Most applications though will not notice the -difference.

    -

    »Exact arithmetic

    Exact arithmetic may be used instead of floating point. @@ -750,6 +784,12 @@ increases the time and space required. Some operations are difficult to do.

    +

    CGAL includes a practical implementation +of symbolic perturbation. It uses the BOOST library to generate +dimension-specific, C++ data structures. It makes good use of 64-bit memory. +Input sites may be added incrementally. It is the fastest 64-bit code +available. +

    Clarkson's hull program and Shewchuk's

    Up: Home -page for Qhull
    -Up: Qhull manual: Table of -Contents
    +page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -808,8 +847,8 @@ • QhullPrecisionTrace -• Functions
    -To: Qhull imprecision: Table of Contents +• Functions (local)
    +To: Qhull imprecision: contents


    @@ -819,7 +858,7 @@ Home Page

    Comments to: qhull@qhull.org -
    +
    Created: Sept. 25, 1995 --- Last modified: see top

    diff -Nru qhull-2015.2/html/qh-optc.htm qhull-2020.2/html/qh-optc.htm --- qhull-2015.2/html/qh-optc.htm 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/html/qh-optc.htm 2020-08-16 17:53:45.000000000 +0000 @@ -7,8 +7,8 @@ -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -18,7 +18,7 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)


    @@ -30,7 +30,7 @@ This section lists the precision options for Qhull. These options are indicated by an upper-case letter followed by a number. -

    Copyright © 1995-2015 C.B. Barber

    +

    Copyright © 1995-2020 C.B. Barber


    @@ -43,7 +43,7 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)

    Precision options

    @@ -52,7 +52,7 @@ convex hull. They may also be used for testing Qhull's handling of precision errors.

    -

    By default, Qhull uses options 'C-0' for +

    Qhull uses the default option 'C-0' for 2-d, 3-d and 4-d, and 'Qx' for 5-d and higher. These options use facet merging to handle precision errors. You may also use joggled input 'QJ' @@ -132,14 +132,12 @@

    If 'An' is set without 'Cn', then 'C0' is automatically set.

    -

    »C-0 - handle all precision -errors

    +

    »C-0 - handle all precision errors

    -

    Qhull handles precision errors by merging facets. The 'C-0' -option handles all precision errors in 2-d, 3-d, and 4-d. It is -set by default. It may be used in higher dimensions, but -sometimes the facet width grows rapidly. It is usually better to -use 'Qx' in 5-d and higher. +

    Qhull handles precision errors by merging facets. The default option 'C-0' +handles all precision errors in 2-d, 3-d, and 4-d. It may be used in higher dimensions, but +sometimes the facet width grows rapidly. In 5-d and higher, the default +option is 'Qx'. Use 'QJ' to joggle the input instead of merging facets. Use 'In 5-d and higher, you should set 'Qx' along with 'C-n'. It skips merges of coplanar facets until after the hull is constructed and before 'An' and 'Cn' are checked.

    +href="#Cn2">Cn' are checked.

    »Cn - centrum radius for post-merging

    @@ -204,30 +202,27 @@ facet" (from option 'Ts') is a reasonable upper bound for the actual roundoff error.

    -

    »Rn - randomly perturb -computations

    +

    »Rn - randomly perturb computations

    This option perturbs every distance, hyperplane, and angle computation by up to (+/- n * max_coord). It simulates the effect of roundoff errors. Unless 'En' is explicitly set, it is adjusted for 'Rn'. The command 'qhull Rn' will generate a convex hull despite the perturbations. See the Examples section for an example.

    +href="qh-eg.htm#merge">Examples section for an example.

    Options 'Rn C-n' have the effect of 'W2n' and 'C-2n'. To use time as the random number seed, use option 'QR-1'.

    -

    »Un - max distance for a -new, coplanar point

    +

    »Un - max distance for a new, coplanar point

    This allows the user to set coplanarity. When pre-merging ('C-n ', 'A-n' or 'C-n', 'A-n' or 'Qx'), Qhull merges a new point into any coplanar facets. The default value for 'Un' is 'Vn'.

    -

    »Vn - min distance for a -visible facet

    +

    »Vn - min distance for a visible facet

    This allows the user to set facet visibility. When adding a point to the convex hull, Qhull determines all facets that are @@ -238,7 +233,7 @@ error ('En'). With merging, the default value is the pre-merge centrum ('C-n') in 2-d or 3-d, or three times that in other dimensions. If the outside width is -specified with option 'Wn ', the maximum, +specified with option 'Wn', the maximum, default value for 'Vn' is 'Wn'.

    Qhull warns if 'Vn' is greater than 'Wn' and @@ -252,7 +247,7 @@

    Points are added to the convex hull only if they are clearly outside of a facet. A point is outside of a facet if its distance to the facet is greater than 'Wn'. Without pre-merging, the -default value for 'Wn' is 'En '. If the user +default value for 'Wn' is 'En'. If the user specifies pre-merging and does not set 'Wn', than 'Wn' is set to the maximum of 'C-n' and maxcoord*(1 - A-n).

    @@ -266,8 +261,8 @@
    -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -277,7 +272,7 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)


    @@ -286,7 +281,7 @@ Home Page

    Comments to: qhull@qhull.org -
    +
    Created: Sept. 25, 1995 --- Last modified: see top

    diff -Nru qhull-2015.2/html/qh-optf.htm qhull-2020.2/html/qh-optf.htm --- qhull-2015.2/html/qh-optf.htm 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/html/qh-optf.htm 2020-08-16 17:53:45.000000000 +0000 @@ -6,8 +6,8 @@ -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -17,7 +17,7 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)


    This section lists the format options for Qhull. These options are indicated by 'F' followed by a letter. See Output, Print, + href="qh-opto.htm#output">Output, Print, and Geomview for other output options.

    -

    Copyright © 1995-2015 C.B. Barber

    +

    Copyright © 1995-2020 C.B. Barber


    @@ -44,7 +44,7 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)

    Additional input & output formats

    @@ -54,86 +54,81 @@ may also be used.

    -
    -
    Summary and control -
    FA +
    FA
    compute total area and volume for option 's' - -
    FV + href="qh-opto.htm#s">s'
  • +
    Fd
    +
    use cdd format for input (offset first)
    +
    FD
    +
    use cdd format for normals (offset first)
    +
    FM
    +
    print Maple output (2-d and 3-d)
    +
    FO
    +
    print options to stderr or stdout
    +
    FQ
    +
    print command for qhull and input
    +
    Fs
    +
    print summary -- dim, #points, total vertices and + facets, #vertices, #facets, max outer and inner plane
    +
    FS
    +
    print sizes -- total area and volume
    +
    FV
    print average vertex (interior point for 'qhalf') -
    FQ -
    print command for qhull and input -
    FO -
    print options to stderr or stdout -
    FS -
    print sizes: total area and volume -
    Fs -
    print summary: dim, #points, total vertices and - facets, #vertices, #facets, max outer and inner plane -
    Fd -
    use format for input (offset first) -
    FD -
    use cdd format for normals (offset first) -
    FM -
    print Maple output (2-d and 3-d) -
    -
    -
    Facets, points, and vertices -
    Fa -
    print area for each facet -
    FC -
    print centrum for each facet -
    Fc -
    print coplanar points for each facet -
    Fx -
    print extreme points (i.e., vertices) of convex hull. - -
    FF -
    print facets w/o ridges -
    FI -
    print ID for each facet -
    Fi -
    print inner planes for each facet -
    Fm -
    print merge count for each facet (511 max) -
    FP -
    print nearest vertex for coplanar points -
    Fn -
    print neighboring facets for each facet -
    FN -
    print neighboring facets for each point -
    Fo -
    print outer planes for each facet -
    Ft -
    print triangulation with added points -
    Fv -
    print vertices for each facet -
    -
    -
    Delaunay, Voronoi, and halfspace -
    Fx -
    print extreme input sites of Delaunay triangulation - or Voronoi diagram. -
    Fp -
    print points at halfspace intersections -
    Fi + href="qhalf.htm">qhalf') +
     
    +
     
    +
    Facets, points, and vertices
    +
    Fa
    +
    print area for each facet
    +
    Fc
    +
    print coplanar points for each facet
    +
    FC
    +
    print centrum for each facet
    +
    FF
    +
    print facets w/o ridges
    +
    Fi
    +
    print inner planes for each facet
    +
    FI
    +
    print ID for each facet
    +
    Fm
    +
    print merge count for each facet (511 max)
    +
    Fn
    +
    print neighboring facets for each facet
    +
    FN
    +
    print neighboring facets for each point
    +
    Fo
    +
    print outer planes for each facet
    +
    FP
    +
    print nearest vertex for coplanar points
    +
    Ft
    +
    print triangulation with added points
    +
    Fv
    +
    print vertices for each facet
    +
    Fx
    +
    print extreme points (i.e., vertices) of convex hull
    +
     
    +
     
    +
    Delaunay, Voronoi, and halfspace
    +
    FC
    +
    print Voronoi vertex ("center") for each facet
    +
    Fi
    print separating hyperplanes for inner, bounded - Voronoi regions -
    Fo + Voronoi regions +
    Fo
    print separating hyperplanes for outer, unbounded - Voronoi regions -
    Fv -
    print Voronoi diagram as ridges for each input pair -
    FC -
    print Voronoi vertex ("center") for each facet
    + Voronoi regions +
    Fp
    +
    print points at halfspace intersections
    +
    Fv
    +
    print Voronoi diagram as ridges for each input pair
    +
    Fx
    +
    print extreme input sites of Delaunay triangulation + or Voronoi diagram

    -

    »Fa - print area for each -facet

    +

    »Fa - print area for each facet

    The first line is the number of facets. The remaining lines are the area for each facet, one facet per line. See 'For non-simplicial facets, vertices are often below the facet's hyperplane. If so, the approximation is less than the -actual value and it may be significantly less.

    +actual value and it may be significantly less or 0.0.

    »FA - compute total area -and volume for option 's'

    +and volume for option 's'

    With option 'FA', Qhull includes the total area and volume in the summary ('s'). Option 'FS' also includes the total area and volume. If facets are merged, the area and volume are approximations. Option 'FA' is automatically set for options 'Fa', 'PAn', and 'PFn'. + href="qh-optp.htm#PAn">PAn', and 'PFn'.

    With 'qdelaunay s FA', Qhull computes the total area of + href="qh-opto.htm#s">s FA', Qhull computes the total area of the Delaunay triangulation. This equals the volume of the convex hull of the data points. With options 'qdelaunay Qu s FA', Qhull computes the @@ -180,7 +175,7 @@

    See 'Fa' for further details. Option 'FS' also computes the total area and volume.

    »Fc - print coplanar -points for each facet

    +points for each facet

    The output starts with the number of facets. Then each facet is printed one per line. Each line is the number of coplanar @@ -195,12 +190,22 @@

    Each coplanar point or interior point is assigned to the facet it is furthest above (resp., least below).

    +

    For halfspace intersection (qhalf), a "facet" +is an intersection point and a "point" is a halfspace. Option 'Fc' lists the +coplanar halfspaces for each intersection point. +The first line is the number of intersection points. Each remaining +line starts with the number of coplanar halfspaces. A coplanar halfspace +is listed for one intersection point even though it is coplanar to +multiple intersection points. Options "Fc Qi" list +the redundant halfspaces for each intersection point. +

    +

    Use 'Qc p' to print vertex and coplanar point coordinates. Use 'Fv' to print vertices.

    »FC - print centrum or -Voronoi vertex for each facet

    +Voronoi vertex for each facet

    The output starts with the dimension followed by the number of facets. Then each facet centrum is printed, one per line. For @@ -208,7 +213,7 @@ printed instead.

    »Fd - use cdd format for -input

    +input

    The input starts with comments. The first comment is reported in the summary. Data starts after a "begin" line. The @@ -225,11 +230,11 @@ point in 'FV' format.

    »FD - use cdd format for -normals

    +normals

    Option 'FD' prints normals ('n', 'Fo', 'Fi') or points ('p') in cdd format. The first line is the + href="qh-opto.htm#p">p') in cdd format. The first line is the command line that invoked Qhull. Data starts with a "begin" line. The next line is the number of normals or points followed by the dimension plus one and "real". @@ -238,17 +243,15 @@ the offset and coefficients use the opposite sign from Qhull. The data ends with an "end" line.

    -

    »FF - print facets w/o -ridges

    +

    »FF - print facets w/o ridges

    Option 'FF' prints all fields of all facets (as in 'f') without printing the ridges. This is + href="qh-opto.htm#f">f') without printing the ridges. This is useful in higher dimensions where a facet may have many ridges. For simplicial facets, options 'FF' and 'f ' are equivalent.

    -

    »Fi - print inner planes -for each facet

    +

    »Fi - print inner planes for each facet

    The first line is the dimension plus one. The second line is the number of facets. The remainder is one inner plane per line. @@ -259,7 +262,7 @@ roundoff error for computing the vertex distance.

    Note that the inner planes for Geomview output ('Gi') include an additional offset for + href="qh-optg.htm#Gi">Gi') include an additional offset for vertex visualization and roundoff error.

    »Fi - print separating @@ -273,8 +276,8 @@ an adjacent pair of input sites. The next d floats are the normalized coefficients for the hyperplane, and the last float is the offset. The hyperplane is oriented toward 'QVn' (if defined), or the first input -site of the pair.

    + href="qh-optq.htm#QVn">QVn' (if defined), or the first input +site of the pair (the point is below the hyperplane).

    Use 'Fo' for unbounded regions, and 'Fv' for the corresponding @@ -291,16 +294,14 @@ corresponding Delaunay triangles are large and thin; for example, the Voronoi diagram of nearly cospherical points.

    -

    »FI - print ID for each -facet

    +

    »FI - print ID for each facet

    Print facet identifiers. These are used internally and listed with options 'f' and 'FF'. -Options 'Fn ' and 'FN' use +Options 'Fn' and 'FN' use facet identifiers for negative indices.

    -

    »Fm - print merge count -for each facet

    +

    »Fm - print merge count for each facet

    The first line is the number of facets. The remainder is the number of merges for each facet, one per line. At most 511 merges @@ -308,7 +309,7 @@ for printing the facets with the most merges.

    »FM - print Maple -output

    +output

    Qhull writes a Maple file for 2-d and 3-d convex hulls, 2-d and 3-d halfspace intersections, @@ -368,7 +369,7 @@ for other URLs.

    »Fn - print neighboring -facets for each facet

    +facets for each facet

    The output starts with the number of facets. Then each facet is printed one per line. Each line is the number of neighbors @@ -385,11 +386,15 @@ only good facets ('Pg', qdelaunay, qvoronoi). It is the negation of the facet's ID (option 'FI'). -For example, negative indices are used for facets "at -infinity" in the Delaunay triangulation.

    +For example, negative indices are used for facets "at infinity" in +the Delaunay triangulation.

    + +

    For halfspace intersection (qhalf), a "facet" +is an intersection point. Option 'Fn' lists +the neighboring intersection points for each intersection point.

    »FN - print neighboring -facets for each point

    +facets for each point

    The first line is the number of points. Then each point is printed, one per line. For unassigned points (either interior or @@ -397,7 +402,7 @@ points ('Qc'), the line is "1" followed by the index of the facet that is furthest below the point. For assigned interior points ('Qi'), the line is "1" + href="qh-optq.htm#Qi">Qi'), the line is "1" followed by the index of the facet that is least above the point. For vertices that do not belong to good facet, the line is "0"

    @@ -420,15 +425,20 @@ Voronoi region for each input site. Option 'FN' lists the regions in site ID order. Option 'FN' corresponds to the second half of option 'o'. To convert from 'FN' to 'o', replace negative indices with zero + href="qh-opto.htm#o">o', replace negative indices with zero and increment non-negative indices by one.

    +

    For halfspace intersection (qhalf), a "facet" +is an intersection point and a "point" is a halfspace. Option 'FN' lists +the intersection points for each halfspace. The first line is the number of +halfspaces. Each remaining line starts with the number of intersection +points for this halfspace. Redundant halfspaces have 0 intersection points.

    +

    If you are using the Qhull library or C++ interface, option 'FN' has the side effect of reordering the neighbors for a vertex

    -

    »Fo - print outer planes -for each facet

    +

    »Fo - print outer planes for each facet

    The first line is the dimension plus one. The second line is the number of facets. The remainder is one outer plane per line. @@ -446,7 +456,7 @@ outer planes.

    Note that the outer planes for Geomview output ('G') include an additional offset for + href="qh-optg.htm#G">G') include an additional offset for vertex/point visualization, 'lines closer,' and roundoff error.

    »Fo - print separating @@ -460,21 +470,21 @@ an adjacent pair of input sites. The next d floats are the normalized coefficients for the hyperplane, and the last float is the offset. The hyperplane is oriented toward 'QVn' (if defined), or the first input -site of the pair.

    + href="qh-optq.htm#QVn">QVn' (if defined), or the first input +site of the pair (the point is below the hyperplane).

    -

    Option 'Fo' gives the hyperplanes for the unbounded rays of -the unbounded regions of the Voronoi diagram. Each hyperplane -goes through the midpoint of the corresponding input sites. The -rays are directed away from the input sites.

    +

    Option 'Fo' gives the separating hyperplanes for the unbounded regions of +the Voronoi diagram. The midpoint between each pair of input sites is used +in place of the vertex at infinity. + +

    If the midpoint happens to be a Voronoi vertex, the hyperplane is degenerate +(e.g., 'rbox c P0 D2 | qvoronoi p Fo').

    Use 'Fi' for bounded regions, and 'Fv' for the corresponding -Voronoi vertices. Use 'Tv' to verify -that the corresponding Voronoi vertices lie on the hyperplane.

    +Voronoi vertices.

    -

    »FO - print list of -selected options

    +

    »FO - print list of selected options

    Lists selected options and default values to stderr. Additional 'FO's are printed to stdout.

    @@ -486,16 +496,15 @@ remainder is one intersection point per line. A intersection point is the intersection of d or more halfspaces from 'qhalf'. It corresponds to a -facet of the dual polytope. The "infinity" point -[-10.101,-10.101,...] indicates an unbounded intersection.

    +facet of the dual polytope. The "infinity" point, +[-10.101,-10.101,...] (qh_INFINITE), indicates an unbounded intersection.

    If [x,y,z] are the dual facet's normal coefficients and b<0 is its offset, the halfspace intersection occurs at [x/-b,y/-b,z/-b] plus the interior point. If b>=0, the halfspace intersection is unbounded.

    -

    »FP - print nearest -vertex for coplanar points

    +

    »FP - print nearest vertex for coplanar points

    The output starts with the number of coplanar points. Then each coplanar point is printed one per line. Each line is the @@ -504,7 +513,7 @@ lines to list the coplanar points nearest to each vertex.

    Use options 'Qc' and/or 'Qi' with 'FP'. Options 'Qc FP' prints + href="qh-optq.htm#Qi">Qi' with 'FP'. Options 'Qc FP' prints coplanar points while 'Qci FP' prints coplanar and interior points. Option 'Qc' is automatically selected if 'Qi' is not selected. @@ -523,11 +532,10 @@ 'FP' may be inefficient. It redetermines the original vertex set for each coplanar point.

    -

    »FQ - print command for -qhull and input

    +

    »FQ - print command for qhull and input

    -

    Prints qhull and input command, e.g., "rbox 10 s | qhull -FQ". Option 'FQ' may be repeated multiple times.

    +

    Prints qhull and input command, e.g., 'rbox 10 s | qhull FQ'. +Option 'FQ' may be repeated multiple times.

    »Fs - print summary

    @@ -575,8 +583,8 @@

    The total volume measures the volume of the intersection of the halfspaces defined by each facet. It is computed from the facet area. Both area and volume are approximations for -non-simplicial facets. See option 'Fa ' for -further notes. Option 'FA ' also computes the total area and volume.

    +non-simplicial facets. See option 'Fa' for +further notes. Option 'FA' also computes the total area and volume.

    »Ft - print triangulation

    @@ -614,8 +622,8 @@ same as option 'o' without the lifted coordinate. Since 'Ft' is invalid for merged Delaunay facets, option 'Ft' is not available for qdelaunay or qvoronoi. It may be used with -joggled input ('QJ') or triangulated output ('Qt'), for example, rbox 10 c G 0.01 | qhull d QJ Ft

    +joggled input ('QJ') or triangulated output ('Qt'), for example, rbox 10 c G 0.01 | qhull d QJ Ft

    If you add a point-at-infinity with 'Qz', it is printed after the input sites and before any centrums. It @@ -635,6 +643,12 @@ vertices. Option 'i' triangulates non-simplicial, 4-d and higher facets by adding vertices for the centrums.

    +

    For halfspace intersection (qhalf), a "facet" +is an intersection point and a "point" is a halfspace. Option 'Fv' lists the +non-redundant halfspaces incident to each intersection point. +The first line is the number of non-redundant halfspaces. Each remaining +line starts with the number of non-redundant halfspaces incident to that point. +

    »Fv - print Voronoi diagram

    @@ -652,8 +666,8 @@ unbounded ray is directed from the Voronoi vertices to infinity.

    Use 'Fo' for separating -hyperplanes of outer, unbounded regions. Use 'Fi' for separating hyperplanes of +hyperplanes of outer, unbounded regions. Use 'Fi' for separating hyperplanes of inner, bounded regions.

    Option 'Fv' does not list ridges that require more than one @@ -672,8 +686,7 @@ write code to handle them, please send email to qhull@qhull.org.

    -

    »FV - print average -vertex

    +

    »FV - print average vertex

    The average vertex is the average of all vertex coordinates. It is an interior point for halfspace intersection. The first @@ -696,11 +709,11 @@ '0'.

    In 2-d, the extreme points (vertices) are listed in -counterclockwise order (by qh_ORIENTclock in user.h).

    +counter-clockwise order (by qh_ORIENTclock in user.h).

    In 3-d and higher convex hulls, the extreme points (vertices) are sorted by index. This is the same order as option 'p' when it doesn't include coplanar or + href="qh-opto.htm#p">p' when it doesn't include coplanar or interior points.

    For Delaunay triangulations, 'Fx' lists the extreme @@ -709,8 +722,8 @@


    -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -720,7 +733,9 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)

    + +

    Comments to: qhull@qhull.org -
    +
    Created: Sept. 25, 1995 --- Last modified: see top

    diff -Nru qhull-2015.2/html/qh-optg.htm qhull-2020.2/html/qh-optg.htm --- qhull-2015.2/html/qh-optg.htm 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/html/qh-optg.htm 2020-08-16 17:53:45.000000000 +0000 @@ -7,8 +7,8 @@ -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -18,7 +18,7 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)


    @@ -34,7 +34,7 @@ and Format for other output options. -

    Copyright © 1995-2015 C.B. Barber

    +

    Copyright © 1995-2020 C.B. Barber


    @@ -47,7 +47,7 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)

    Geomview output options

    @@ -66,14 +66,12 @@ dual convex hull.

    -
     
    -
    General
    G
    display Geomview output
    -
    Gt
    -
    display transparent 3-d Delaunay triangulation
    GDn
    drop dimension n in 3-d and 4-d output
    +
    Gt
    +
    display transparent 3-d Delaunay triangulation
     
     
    @@ -82,20 +80,20 @@
    display all points as dots
    Gc
    display centrums (2-d, 3-d)
    -
    Gp
    -
    display coplanar points and vertices as radii
    Gh
    display hyperplane intersections
    Gi
    display inner planes only (2-d, 3-d)
    +
    Gn
    +
    do not display planes
    Go
    display outer planes only (2-d, 3-d)
    +
    Gp
    +
    display coplanar points and vertices as radii
    Gr
    display ridges (3-d)
    Gv
    display vertices as spheres
    -
    Gn
    -
    do not display planes
    @@ -123,13 +121,11 @@ diagram. For halfspace intersections, it displays the dual convex hull. -

    »Ga - display all -points as dots

    +

    »Ga - display all points as dots

    Each input point is displayed as a green dot.

    -

    »Gc - display centrums -(3-d)

    +

    »Gc - display centrums (3-d)

    The centrum is defined by a green radius sitting on a blue plane. The plane corresponds to the facet's hyperplane. If you @@ -138,8 +134,7 @@ by 'C-n' or 'Cn'.

    -

    »GDn - drop dimension -n in 3-d and 4-d output

    +

    »GDn - drop dimension n in 3-d and 4-d output

    The result is a 2-d or 3-d object. In 4-d, this corresponds to viewing the 4-d object from the nth axis without perspective. @@ -168,7 +163,7 @@

    In 3-d, the intersection is a black line. It lies on two neighboring hyperplanes, c.f., the blue squares associated with -centrums ('Gc '). In 4-d, the ridges are +centrums ('Gc'). In 4-d, the ridges are projected to the intersection of both hyperplanes. If you turn on edges (Geomview's 'appearances' menu), each triangle corresponds to one ridge. The ridges may overlap each other.

    @@ -181,8 +176,7 @@ the opposite of the outer plane's color, i.e., [1-r,1-g,1-b] . Its edges are determined by the vertices.

    -

    »Gn - do not display -planes

    +

    »Gn - do not display planes

    By default, Geomview displays the precise plane (no merging) or both inner and output planes (if merging). If merging, @@ -197,7 +191,7 @@ the facet's normal, and its edges are determined by the vertices.

    »Gp - display coplanar -points and vertices as radii

    +points and vertices as radii

    Coplanar points ('Qc'), interior points ('Qi'), outside points ('maxcoord * (1 - -A-n). It is at +A-n). It is at least 1/20'th of the maximum coordinate, and ignores post merging if pre-merging is done.

    @@ -219,8 +213,7 @@ points. Option 'Qc' is automatically selected if 'Qi' is not selected with options 'Gpv'. -

    »Gr - display ridges -(3-d)

    +

    »Gr - display ridges (3-d)

    A ridge connects the two vertices that are shared by neighboring facets. It is displayed in green. A ridge is the @@ -228,8 +221,7 @@ intersection is the geometric edge between two facets. Ridges are always displayed in 4-d.

    -

    »Gt - transparent 3-d -Delaunay

    +

    »Gt - transparent 3-d Delaunay

    A 3-d Delaunay triangulation looks like a convex hull with interior facets. Option 'Gt' removes the outside ridges to reveal @@ -247,8 +239,8 @@


    -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -258,7 +250,7 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)


    @@ -268,7 +260,7 @@ Home Page

    Comments to: qhull@qhull.org -
    +
    Created: Sept. 25, 1995 --- Last modified: see top

    diff -Nru qhull-2015.2/html/qh-opto.htm qhull-2020.2/html/qh-opto.htm --- qhull-2015.2/html/qh-opto.htm 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/html/qh-opto.htm 2020-08-16 17:53:45.000000000 +0000 @@ -7,8 +7,8 @@ -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -18,7 +18,7 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)


    @@ -34,7 +34,7 @@ href="qh-optg.htm#geomview">Geomview for other output options.

    -

    Copyright © 1995-2015 C.B. Barber

    +

    Copyright © 1995-2020 C.B. Barber


    @@ -47,7 +47,7 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)

    Output options

    @@ -58,38 +58,37 @@
    f
    print all fields of all facets
    -
    n
    -
    print hyperplane normals with offsets
    +
    i
    +
    print vertices incident to each facet
    m
    print Mathematica output (2-d and 3-d)
    +
    n
    +
    print hyperplane normals with offsets
    o
    print OFF file format (dim, points and facets)
    -
    s
    -
    print summary to stderr
    p
    print vertex and point coordinates
    -
    i
    -
    print vertices incident to each facet
    +
    s
    +
    print summary to stderr
     
     
    Related options
    F
    additional input/output formats
    +
    Ft
    +
    print triangulation with added points
    G
    Geomview output
    P
    Print options
    -
    Ft
    -
    print triangulation with added points
     

    -

    »f - print all fields of -all facets

    +

    »f - print all fields of all facets

    -

    Print all fields of all facets. +

    Print all fields of facetT for all facets. The facet is the primary data structure for Qhull. @@ -103,8 +102,7 @@

    Use the 'FF' option to print the facets but not the ridges.

    -

    »i - print vertices -incident to each facet

    +

    »i - print vertices incident to each facet

    The first line is the number of facets. The remaining lines list the vertices for each facet, one facet per line. The indices @@ -127,10 +125,17 @@ Use option 'Fv' to list the vertices of non-simplicial facets as is. Use option 'Ft' to print the coordinates of the -centrums as well as those of the input points.

    +centrums as well as those of the input points. The centrum indices +for option 'i' are one more than the centrum indices for option 'Ft'.

    + +

    For halfspace intersection (qhalf), a "facet" +is an intersection point and a "point" is a halfspace. Option 'i' lists the +non-redundant halfspaces incident to each intersection point. +The first line is the number of non-redundant halfspaces. Each remaining +line lists the incident, non-redundant halfspaces for that intersection point. +

    -

    »m - print Mathematica -output

    +

    »m - print Mathematica output

    Qhull writes a Mathematica file for 2-d and 3-d convex hulls, 2-d and 3-d halfspace intersections, @@ -157,8 +162,7 @@

    See Is Qhull available for Mathematica? for URLs. -

    »n - print hyperplane -normals with offsets

    +

    »n - print hyperplane normals with offsets

    The first line is the dimension plus one. The second line is the number of facets. The remaining lines are the normals for @@ -223,8 +227,7 @@

    If you are using the Qhull library, options 'v o' have the side effect of reordering the neighbors for a vertex.

    -

    »p - print vertex and -point coordinates

    +

    »p - print vertex and point coordinates

    The first line is the dimension. The second line is the number of vertices. The remaining lines are the vertices, one vertex per @@ -256,8 +259,7 @@ The vertices follow with a leading "1". Output ends with "end".

    -

    »s - print summary to -stderr

    +

    »s - print summary to stderr

    The default output of Qhull is a summary to stderr. Options 'FS' and 'Fs' @@ -327,8 +329,8 @@


    -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -338,7 +340,7 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)


    @@ -347,7 +349,7 @@ Home Page

    Comments to: qhull@qhull.org -
    +
    Created: Sept. 25, 1995 --- Last modified: see top

    diff -Nru qhull-2015.2/html/qh-optp.htm qhull-2020.2/html/qh-optp.htm --- qhull-2015.2/html/qh-optp.htm 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/html/qh-optp.htm 2020-08-16 17:53:45.000000000 +0000 @@ -7,8 +7,8 @@ -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -18,7 +18,7 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)


    @@ -33,12 +33,12 @@ and Format for other output options. -

    Copyright © 1995-2015 C.B. Barber

    +

    Copyright © 1995-2020 C.B. Barber


    » Programs - Options + OptionsOutputFormatsGeomview @@ -46,22 +46,22 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)

    Print options

    -
     
    -
    General
    -
    Pp
    -
    do not report precision problems
    Po
    force output despite precision problems
    Po
    if error, output neighborhood of facet
    +
    Pp
    +
    do not report precision problems
     
     
    -
    Select
    +
    Selection options
    +
    PAn
    +
    print n largest facets by area
    Pdk:n
    print facets with normal[k] >= n (default 0.0)
    PDk:n
    @@ -70,13 +70,11 @@
    print facets whose area is at least n
    Pg
    print good facets only (needs 'QGn' - or 'QVn ')
    -
    PMn
    -
    print n facets with most merges
    -
    PAn
    -
    print n largest facets by area
    + or 'QVn')
    PG
    print neighbors of good facets
    +
    PMn
    +
    print n facets with most merges

    @@ -89,15 +87,14 @@ a hull. Unless 'PG' is set, 'Pg' is automatically set.

    -

    »Pdk:n - print facet if -normal[k] >= n

    +

    »Pdk:n - print facet if normal[k] >= n

    For a given output, print only those facets with normal[k] >= n and drop the others. For example, 'Pd0:0.5' prints facets with normal[0] >= 0.5 . The default value of n is zero. For example in 3-d, 'Pd0d1d2' prints facets in the positive octant.

    -If no facets match, the closest facet is returned.

    +If no facets match, use option 'Pg' to print the closest facet.

    On Windows 95, do not combine multiple options. A 'd' is considered part of a number. For example, use 'Pd0:0.5 Pd1:0.5' instead of @@ -111,8 +108,9 @@ For example, 'PD0:0.5' prints facets with normal[0] <= 0.5 . The default value of n is zero. For example in 3-d, 'PD0D1D2' displays facets in the negative octant. -

    -If no facets match, the closest facet is returned.

    + +

    If no facets match, use option 'Pg' to print the closest facet.

    +

    In 2-d, 'd G PD2' displays the Delaunay triangulation instead of the corresponding paraboloid.

    @@ -130,25 +128,27 @@ 'PG' is set, 'Pg' is automatically set.

    -

    »Pg - print good facets

    +

    »Pg - print good facets

    Qhull can mark facets as "good". This is used to

    • mark the lower convex hull for Delaunay triangulations and Voronoi diagrams
    • -
    • mark the facets that are visible from a point (the 'QGn ' option)
    • -
    • mark the facets that contain a point (the 'QVn' option).
    • +
    • mark the facets that are visible from a point (option 'QGn')
    • +
    • mark the facets that contain a point (option 'QVn').
    • indicate facets with a large enough area (options 'PAn' and 'PFn')
    • +
    • indicate facets with many merges (option 'PMn')

    Option 'Pg' only prints good facets that also meet 'Pdk' and 'PDk' -options. It is automatically set for options 'PAn', -'PFn ', 'QGn', +options. It is automatically set for options 'd', 'PAn', +'PFn', 'PMn', 'QGn', and 'QVn'.

    »PG - print neighbors of @@ -217,8 +217,7 @@

    See 'Po' - force output despite precision problems. -

    »Pp - do not report -precision problems

    +

    »Pp - do not report precision problems

    With option 'Pp', Qhull does not print statistics about precision problems, and it removes some of the warnings. It @@ -227,8 +226,8 @@


    -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -238,7 +237,7 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)


    @@ -247,7 +246,7 @@ Home Page

    Comments to: qhull@qhull.org -
    +
    Created: Sept. 25, 1995 --- Last modified: see top

    diff -Nru qhull-2015.2/html/qh-optq.htm qhull-2020.2/html/qh-optq.htm --- qhull-2015.2/html/qh-optq.htm 2016-01-19 02:56:54.000000000 +0000 +++ qhull-2020.2/html/qh-optq.htm 2020-08-16 17:53:45.000000000 +0000 @@ -7,8 +7,8 @@ -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -18,7 +18,7 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)


    @@ -30,7 +30,7 @@

    This section lists the control options for Qhull. These options are indicated by 'Q' followed by a letter.

    -

    Copyright © 1995-2015 C.B. Barber

    +

    Copyright © 1995-2020 C.B. Barber


    @@ -43,16 +43,13 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)

    Qhull control options

    -
     
    -
    General
    -
    Qu
    -
    compute upper hull for furthest-site Delaunay - triangulation
    +
    Qa
    +
    allow input with fewer or more points than coordinates
    Qc
    keep coplanar points with nearest facet
    Qi
    @@ -61,63 +58,75 @@
    joggled input to avoid precision problems
    Qt
    triangulated output
    +
    Qu
    +
    compute upper hull for furthest-site Delaunay + triangulation
    +
    Qw
    +
    allow warnings about Qhull options
     
     
    Precision handling
    -
    Qz
    -
    add a point-at-infinity for Delaunay triangulations
    -
    Qx
    -
    exact pre-merges (allows coplanar facets)
    -
    Qs
    -
    search all points for the initial simplex
    Qbb
    scale last coordinate to [0,m] for Delaunay
    +
    Qs
    +
    search all points for the initial simplex
    Qv
    test vertex neighbors for convexity
    +
    Qx
    +
    exact pre-merges (allows coplanar facets)
    +
    Qz
    +
    add a point-at-infinity for Delaunay triangulations
     
     
    Transform input
    -
    Qbk:0Bk:0
    -
    drop dimension k from input
    -
    QRn
    -
    random rotation (n=seed, n=0 time, n=-1 time/no rotate)
    Qbk:n
    scale coord[k] to low bound of n (default -0.5)
    -
    QBk:n
    -
    scale coord[k] to upper bound of n (default 0.5)
    +
    Qbk:0Bk:0
    +
    drop dimension k from input
    QbB
    scale input to fit the unit cube
    +
    QBk:n
    +
    scale coord[k] to upper bound of n (default 0.5)
    +
    QRn
    +
    random rotation (n=seed, n=0 time, n=-1 time/no rotate)
     
     
    Select facets
    -
    QVn
    -
    good facet if it includes point n, -n if not
    -
    QGn
    -
    good facet if visible from point n, -n for not visible
    Qg
    only build good facets (needs 'QGn', 'QVn ', or 'Pdk')
    + href="#QVn">QVn', or 'Pdk') +
    QGn
    +
    good facet if visible from point n, -n for not visible
    +
    QVn
    +
    good facet if it includes point n, -n if not
     
     
    Experimental
    +
    Qf
    +
    partition point to furthest outside facet
    +
    Qm
    +
    process points only if they would increase the max. outer + plane
    +
    Qr
    +
    process random outside points instead of furthest one
    +
    Q0
    +
    do not pre-merge facets with 'C-0' or 'Qx'
    +
    Q1
    +
    merge by mergetype/angle instead of mergetype/distance
    +
    Q2
    +
    merge all non-convex at once instead of independent sets
    +
    Q3
    +
    do not merge redundant vertices
    Q4
    avoid merging old facets into new facets
    Q5
    do not correct outer planes at end of qhull
    -
    Q3
    -
    do not merge redundant vertices
    Q6
    do not pre-merge concave or coplanar facets
    -
    Q0
    -
    do not pre-merge facets with 'C-0' or 'Qx'
    -
    Q8
    -
    ignore near-interior points
    -
    Q2
    -
    merge all non-convex at once instead of independent sets
    -
    Qf
    -
    partition point to furthest outside facet
    Q7
    process facets depth-first instead of breadth-first
    +
    Q8
    +
    ignore near-interior points
    Q9
    process furthest of furthest points
    Q10
    @@ -125,18 +134,23 @@
    Q11
    copy normals and recompute centrums for tricoplanar facets
    Q12
    -
    do not error on wide merge due to duplicate ridge and nearly coincident points
    -
    Qm
    -
    process points only if they would increase the max. outer - plane
    -
    Qr
    -
    process random outside points instead of furthest one
    -
    Q1
    -
    sort merges by type instead of angle
    +
    allow wide facets and wide dupridge
    +
    Q14
    +
    merge pinched vertices that create a dupridge
    +
    Q15
    +
    check for duplicate ridges with the same vertices

    +

    »Qa - allow input with fewer or more points than coordinates

    + +

    Option 'Qa' (qh.ALLOWshort) allows input with fewer or more points than coordinates. Qhull's input +starts with the number of points and the dimension, d. The coordinates follow, d coordinates per point. + +

    With option 'Qa', there may be fewer or more points than coordinates. This simplifies exploring an input point set by +adjusting the number of points. +

    »Qbb - scale the last coordinate to [0,m] for Delaunay

    @@ -174,8 +188,7 @@

    After scaling, the lower bound for dimension k of the input points will be n. 'Qbk' scales coord[k] to -0.5.

    -

    »QBk:n - scale coord[k] -to upper bound

    +

    »QBk:n - scale coord[k] to upper bound

    After scaling, the upper bound for dimension k of the input points will be n. 'QBk' scales coord[k] to 0.5.

    @@ -190,8 +203,7 @@ It happens after the halfspace transformation for both the data and the feasible point.

    -

    »Qc - keep coplanar points -with nearest facet

    +

    »Qc - keep coplanar points with nearest facet

    During construction of the hull, a point is coplanar if it is between 'Wn' above and 'QJ'), a coplanar point includes points within one joggle of the inner plane.

    -

    With option 'Qc', output formats 'p ', +

    With option 'Qc', output formats 'p', 'f', 'Gp', 'Fc', 'FN', and 'FP' will print the coplanar @@ -225,12 +237,11 @@ coplanar point may be missed in the output (see Qhull limitations).

    -

    »Qf - partition point to -furthest outside facet

    +

    »Qf - partition point to furthest outside facet

    After adding a new point to the convex hull, Qhull partitions the outside points and coplanar points of the old, visible -facets. Without the 'f ' option and +facets. Without the 'f' option and merging, it assigns a point to the first facet that it is outside ('Wn'). When merging, it assigns a point to the first facet that is more than several times outside @@ -245,18 +256,19 @@ furthest points.

    »Qg - only build good -facets (needs 'QGn' 'QVn' or 'Pdk')

    +facets (needs 'QGn' 'QVn' or 'Pdk')

    Qhull has several options for defining and printing good facets. With the 'Qg' option, Qhull will only build those facets that it needs to determine the good facets in -the output. This may speed up Qhull in 2-d and 3-d. It is +the output. Outside points that are not above good facets are ignored. +This may speed up Qhull in 2-d and 3-d. It is useful for furthest-site Delaunay triangulations (qdelaunay Qu, invoke with 'qhull d Qbb Qu Qg'). It is not effective in higher dimensions because many facets see a given point and contain a -given vertex. It is not guaranteed to work for all combinations.

    +given vertex. It may not work for all combinations of options.

    See 'QGn', 'QVn', and 'Pdk' for defining good facets, and 'Pg'.

    +

    Option Qg disables renaming vertices due to duplicate ridges. +See ('Q14' merge-pinched-vertices).

    +

    »QGn - good facet if -visible from point n, -n for not visible

    +visible from point n, -n for not visible

    With option 'QGn', a facet is good (see 'Qg' and 'Pg') if it is visible from @@ -278,13 +293,12 @@

    With rbox, use the 'Pn,m,r' option to define your point; it will be point 0 ('QG0').

    -

    »Qi - keep interior points -with nearest facet

    +

    »Qi - keep interior points with nearest facet

    Normally Qhull ignores points that are clearly interior to the convex hull. With option 'Qi', Qhull treats interior points the same as coplanar points. Option 'Qi' does not retain coplanar -points. You will probably want 'Qc ' as well.

    +points. You will probably want 'Qc' as well.

    Option 'Qi' is automatically set for 'qdelaunay Qc' and 'qvoronoi @@ -300,17 +314,21 @@ and 'FP' include interior points.

    »QJ or QJn - joggled -input to avoid precision errors

    +input to avoid precision errors

    Option 'QJ' or 'QJn' joggles each input coordinate by adding a random number in the range [-n,n]. If a precision error occurs, It tries again. If precision errors still occur, Qhull increases n ten-fold and tries again. The maximum value for increasing n is 0.01 times the maximum width of the input. Option 'QJ' selects -a default value for n. User.h +a default value for n. +The header file user_r.h defines these parameters and a maximum number of retries. See Merged facets or joggled input.

    +

    On repeated joggles, Qhull errors (QH6010) if the joggle is greater +than 0.1 or one quarter of the maximum coordinate width.

    +

    Users of joggled input should consider converting to triangulated output ('Qt'). Triangulated output is approximately 1000 times more accurate than joggled input. @@ -328,8 +346,10 @@

    Qhull adjusts the outer and inner planes for 'QJn' ('Fs'). They are increased by sqrt(d)*n to account for the maximum distance between a joggled point and -the corresponding input point. Coplanar points ('Qc') require an additional sqrt(d)*n +the corresponding input point.

    + +

    Coplanar points ('Qc', option '_near-inside') require an additional sqrt(d)*n since vertices and coplanar points may be joggled in opposite directions.

    @@ -357,8 +377,15 @@

    Use option 'TRn' to estimate the probability that Qhull will fail for a given 'QJn'. +

    If your application incrementally adds points with qh_addpoint, +facet merging for precision problems is disabled by default. +You can reduce the probability of failure by joggling the point's coordinates before calling qh_addpoint. +See qh_joggleinput +for sample code. +

    »Qm - only process points -that increase the maximum outer plane

    +that increase the maximum outer plane

    Qhull reports the maximum outer plane in its summary ('s'). With option 'Qm', Qhull does not @@ -369,7 +396,7 @@ triangulation. Option 'Qm' is no longer important for merging.

    »Qr - process random -outside points instead of furthest ones

    +outside points instead of furthest ones

    Normally, Qhull processes the furthest point of a facet's outside points. Option 'Qr' instead selects a random outside @@ -386,7 +413,7 @@ "distance tests". Qhull does not report CPU time because the randomization is inefficient.

    -

    »QRn - random rotation

    +

    »QRn - random rotation

    Option 'QRn' randomly rotates the input. For Delaunay triangulations (qdelaunay or qvoronoi), @@ -398,8 +425,11 @@ but use time as the random number seed. If n<-1, don't rotate but use n as the random number seed.

    +

    If set, the summary option ('s') displays +the corresponding 'QRn' option after "Statistics for: ..." +

    »Qs - search all points -for the initial simplex

    +for the initial simplex

    Qhull constructs an initial simplex from d+1 points. It selects points with the maximum and minimum coordinates and @@ -442,7 +472,7 @@

    With sufficient merging, the ridges of a non-simplicial facet may share more than two neighboring facets. If so, their triangulation ('Qt') will fail since two facets have the same vertex set.

    »Qu - compute upper hull -for furthest-site Delaunay triangulation

    +for furthest-site Delaunay triangulation

    When computing a Delaunay triangulation (qdelaunay or qvoronoi), @@ -462,7 +492,7 @@ 'qhull d Qbb Qu' or 'qhull v Qbb Qu' on these points.

    »Qv - test vertex -neighbors for convexity

    +neighbors for convexity

    Normally, Qhull tests all facet neighbors for convexity. Non-neighboring facets which share a vertex may not satisfy the @@ -473,7 +503,7 @@ constructed..

    »QVn - good facet if it -includes point n, -n if not

    +includes point n, -n if not

    With option 'QVn', a facet is good ('Qg', 'Pg') if one of its vertices is @@ -493,36 +523,43 @@ point added to the hull. Options 'QVn Qg' require either 'QJ' or 'Q0' (no merging).

    -

    »Qx - exact pre-merges -(allows coplanar facets)

    +

    »Qw - allow warnings about Qhull options

    + +

    Option 'Qw' allows warning about unknown, malformed, or incompatible Qhull options. +If 'Qw' is not specified, option warnings produce a 'Qhull option error' and return exit status qh_ERRinput (1).

    + +

    »Qx - exact pre-merges (allows coplanar facets)

    Option 'Qx' performs exact merges while building the hull. -Option 'Qx' is set by default in 5-d and higher. Use option 'Q0' to not use 'Qx' by default. Unless otherwise -specified, option 'Qx' sets option 'C-0'. +Options 'Qx' and 'C-0' are set by default in 5-d and higher. To disable this default, +set option 'C-0' or another pre-merge option. +Use option 'Q0' to disable all merging, including 'Qx' and 'C-0'.

    -

    The "exact" merges are merging a point into a -coplanar facet (defined by 'Vn ', 'The "exact" pre-merges are merging a point into a +coplanar horizon facet (defined by 'Vn', 'Un', and 'C-n'), merging concave facets, merging duplicate ridges, and merging flipped facets. Coplanar merges and angle coplanar merges ('A-n') are not performed. Concavity +href="qh-optc.htm#An">A-n') are not performed. Superfluous +vertices are allowed. Concavity testing is delayed until a merge occurs.

    After the hull is built, all coplanar merges are performed (defined by 'C-n' and 'A-n'), then post-merges are performed (defined by 'Cn' and 'An'). If facet progress is logged ('An'). Superfluous +vertices are removed.

    + +

    If facet progress is logged ('TFn'), Qhull reports each phase and prints intermediate summaries and statistics ('Ts').

    Without 'Qx' in 5-d and higher, options 'C-n' and 'A-n' -may merge too many facets. Since redundant vertices are not -removed effectively, facets become increasingly wide.

    +may merge too many facets. Facets become increasingly wide.

    Option 'Qx' may report a wide facet. With 'Qx', coplanar facets are not merged. This can produce a "dent" in an @@ -561,24 +598,25 @@ lead to precision errors. If so, a descriptive warning is generated. See Precision issues.

    -

    »Q1 - sort merges by type -instead of angle

    +

    »Q1 - merge by mergetype/angle instead +of mergetype/distance

    -

    Qhull sorts the coplanar facets before picking a subset of the -facets to merge. It merges concave and flipped facets first. Then -it merges facets that meet at a steep angle. With 'Q1', Qhull -sorts merges by type (coplanar, angle coplanar, concave) instead -of by angle. This may make the facets wider.

    +

    Qhull merges coplanar facets first, then concave and flipped facets. +Within a merge-type, it merges coplanar facets by distance first. +

    + +

    With option 'Q1', Qhull merges coplanar facets by angle instead of by distance. +

    »Q2 - merge all non-convex -at once instead of independent sets

    +at once instead of independent sets

    With 'Q2', Qhull merges all facets at once instead of performing merges in independent sets. This may make the facets wider.

    »Q3 - do not merge -redundant vertices

    +redundant vertices

    With 'Q3', Qhull does not remove redundant vertices. In 6-d and higher, Qhull never removes redundant vertices (since @@ -586,15 +624,15 @@ but it may result in wider facets. Its effect is easiest to see in 3-d and 4-d.

    -

    »Q4 - avoid merging old +

    »Q4 - avoid merging old facets into new facets

    With 'Q4', Qhull avoids merges of an old facet into a new facet. This sometimes improves facet width and sometimes makes it -worse.

    +worse. See qh_merge_nonconvex. It is not supported for qh_merge_twisted.

    »Q5 - do not correct outer -planes at end of qhull

    +planes at end of qhull

    When merging facets or approximating a hull, Qhull tests coplanar points and outer planes after constructing the hull. It @@ -611,19 +649,19 @@

    Option 'Q5' may be used if outer planes are not needed. Outer planes are needed for options 's', 'G', 'Go ', +href="qh-optg.htm#G">G', 'Go', 'Fs', 'Fo', 'FF', and 'f'.

    »Q6 - do not pre-merge -concave or coplanar facets

    +concave or coplanar facets

    With 'Q6', Qhull does not pre-merge concave or coplanar facets. This demonstrates the effect of "dents" when using 'Qx'.

    »Q7 - depth-first -processing instead of breadth-first

    +processing instead of breadth-first

    With 'Q7', Qhull processes facets in depth-first order instead of breadth-first order. This may increase the locality of @@ -638,8 +676,7 @@

    Under 'Q7', Qhull runs slower and the facets may be wider.

    -

    »Q8 - ignore near-interior -points

    +

    »Q8 - ignore near-interior points

    With 'Q8' and merging, Qhull does not process interior points that are near to a facet (as defined by qh_RATIOnearInside in @@ -649,7 +686,7 @@ href="#Qc">Qc' may be sufficient.

    »Q9 - process furthest of -furthest points

    +furthest points

    With 'Q9', Qhull processes the furthest point of all outside sets. This may reduce precision problems. The furthest point of @@ -685,28 +722,58 @@ is added to qh_addpoint(), RBOX 1000 s W1e-12 t1001813667 P0 | QHULL d Q11 Tv, reports an error due to a duplicate ridge. -

    »Q12 - do not error -on wide merge due to duplicate ridge and nearly coincident points

    - -

    In 3-d and higher Delaunay Triangulations or 4-d and higher convex hulls, multiple, -nearly coincident points may lead to very wide facets. An error is reported if a -merge across a duplicate ridge would increase the facet width by 100x or more. +

    »Q12 - allow wide facets and wide dupridge

    -

    Use option 'Q12' to log a warning instead of throwing an error. +

    Option 'Q12' (qh.ALLOWwide) disables error exits due to wide facets and wide dupridge. With 'Q12', Qhull may produce arbitrarily +wide facets. A facet is 'wide' if there is a wide gap between its outer plane (f.maxoutside above all points) and its +inner plane (below its vertices). A wide facet is typically due to multiple topological and geometric problems that +Qhull cannot resolve. As Qhull merges facets, they become increasingly wide, making further problems more likely.

    + +

    A 'dupridge' is a ridge with more than two neighboring facets. A dupridge is a loop in the facet topology. A convex hull should never have dupridges, but with imprecise +arithmetic, they may occur. Dupridges may occur in 3-D and higher. They are more likely for +nearly adjacent points in 4-D and higher.

    + +

    Qhull handles dupridges by merging all but one pair of facets (qh_matchdupridge in poly2_r.c) +or by dropping one of its vertices as a coplanar point (qh_getpinchedmerges in merge_r.c). If +vertices are too far apart and a merge would produce an wide facet, qh_check_dupridge reports an error. The +corresponding error exit is disabled by 'Q12'.

    -

    For Delaunay triangulations, a bounding box may alleviate this error (e.g., rbox 500 C1,1E-13 t c G1 | qhull d). +

    To demonstrate the problem, use rbox option 'Cn,r,m' to generate nearly adjacent points. +For Delaunay triangulations, a bounding box may alleviate this error (e.g., rbox 500 C1,1E-13 c G1 | qhull d). This avoids the ill-defined edge between upper and lower convex hulls. -The problem will be fixed in a future release of Qhull. +For more information, see "Nearly adjacent vertices within 1e-13" in Limitations of merged facets. +

    + +

    Errors disabled by 'Q12' return an error status of qh_ERRwide (8). Wide facets are defined by constants in user_r.h (qh_WIDE... and qh_RATIO...). + +

    »Q14 - merge pinched vertices due to a dupridge

    -

    To demonstrate the problem, use rbox option 'Cn,r,m' to generate nearly coincident points. -For more information, see "Nearly coincident points on an edge" -in In 3-d and higher, nearly adjacent vertices may lead to dupridges (see +"Nearly adjacent vertices within 1e-13" in Imprecision in Qhull). +With option 'Q14', Qhull merges nearly adjacent vertices when they create a dupridge. + +

    »Q15 - check for duplicate ridges with the same vertices

    + +

    Option 'Q15' (qh.CHECKduplicates) checks for duplicate ridges after each merge (qh_maybe_duplicateridges, +qh_checkfacet). +Duplicate ridges have the same vertices. It is a topological error for convex hulls. +Qhull resolves a duplicate ridge by merging vertices and partitioning the deleted vertex as a coplanar +point (qh_renamevertex). + +

    Option 'Q15' does not prevent duplicate ridges for non-neighboring facets, nor does it prevent other topological +errors such as inconsistent facet orientation. Resolving a duplicate ridge may itself lead to topological errors +and wide facets.


    -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -716,7 +783,7 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)


    @@ -725,7 +792,7 @@ Home Page

    Comments to: qhull@qhull.org -
    +
    Created: Sept. 25, 1995 --- Last modified: see top

    diff -Nru qhull-2015.2/html/qh-optt.htm qhull-2020.2/html/qh-optt.htm --- qhull-2015.2/html/qh-optt.htm 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/html/qh-optt.htm 2020-08-16 17:53:45.000000000 +0000 @@ -7,8 +7,8 @@ -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -18,7 +18,7 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)


    @@ -30,7 +30,7 @@ This section lists the trace options for Qhull. These options are indicated by 'T' followed by a letter. -

    Copyright © 1995-2015 C.B. Barber

    +

    Copyright © 1995-2020 C.B. Barber


    @@ -43,58 +43,75 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)

    Trace options

     
    General
    -
    Tz
    -
    output error information to stdout instead of stderr
    +
    Ta
    +
    annotate output with message codes
    +
    TFn
    +
    report progress whenever n or more facets created
    TI file
    input data from a file
    TO file
    output results to a file
    Ts
    print statistics
    -
    TFn
    -
    report progress whenever n or more facets created
    -
    TRn
    -
    rerun qhull n times
    Tv
    verify result: structure, convexity, and point inclusion
    +
    Tz
    +
    output error information to stdout instead of stderr
     
     
    Debugging
    +
    T4
    +
    trace at level n, 4=all, 5=mem/gauss, -1= events
    +
    TAn
    +
    stop after adding n vertices
    Tc
    check frequently during execution
    -
    TVn
    -
    stop qhull after adding point n
    TCn
    stop qhull after building cone for point n
    -
    TV-n
    -
    stop qhull before adding point n
    -
    T4
    -
    trace at level n, 4=all, 5=mem/gauss, -1= events
    -
    TWn
    -
    trace merge facets when width > n
    +
    Tf
    +
    flush each qh_fprintf for debugging segfaults
    TMn
    turn on tracing at merge n
    TPn
    turn on tracing when point n added to hull
    +
    TRn
    +
    rerun qhull n times for QJn statitics
    +
    TV-n
    +
    stop qhull before adding point n
    +
    TVn
    +
    stop qhull after adding point n
    +
    TWn
    +
    trace merge facets when width > n

    -

    »Tc - check frequently -during execution

    +

    »Ta - annotate output with message codes

    + +

    With option 'Ta', Qhull annotates output with message codes. Programmers may use these +codes to trap the corresponding print statements.

    + +

    »TAn - stop Qhull after adding n vertices

    + +

    With option 'TAn', Qhull stops after adding n vertices. +See option 'TVn' to stop after +adding point n.

    + +

    »Tc - check frequently during execution

    Qhull includes frequent checks of its data structures. Option 'Tc' will catch most inconsistency errors. It is slow and should not be used for production runs. Option 'Tv' -performs the same checks after the hull is constructed.

    +performs the same checks after the hull is constructed. Tracing ('T4') +adds additional calls to qh_checkconvex, qh_checkpolygon, and qh_checkfacet.

    »TCn - stop qhull after building cone for point n

    @@ -104,8 +121,14 @@ for 'f' includes the cone and the old hull.'.

    -

    »TFn - report summary -whenever n or more facets created

    +

    »Tf - flush each +qh_fprintf for debugging segfaults

    + +

    Option 'Tf' flushes each qh_fprintf for debugging segfaults.

    + +

    See option 'Tz' for redirecting stderr.

    + +

    »TFn - report summary whenever n or more facets created

    Option 'TFn' reports progress whenever more than n facets are created. The test occurs just before adding a new point to the @@ -114,13 +137,13 @@

    »TI file - input data from file

    -

    Input data from 'file' instead of stdin. The filename may not -contain spaces or use single quotes. -You may use I/O redirection +

    Input data from 'file' instead of stdin. The filename may be enclosed in +single quotes. If the filename does not contain spaces, TIfile is OK.

    + +

    You may use I/O redirection instead (e.g., 'rbox 10 | qdelaunay >results').

    -

    »TMn - turn on tracing at -merge n

    +

    »TMn - turn on tracing at merge n

    Turn on tracing at n'th merge.

    @@ -128,10 +151,11 @@

    Qhull includes full execution tracing. 'T-1' traces events. 'T1' traces the overall execution of the program. 'T2' and 'T3' -trace overall execution and geometric and topological events. -'T4' traces the algorithm. 'T5' includes information about memory +trace overall execution, and geometric, topological, and merge events. +'T4' is the detailed trace of Qhull. 'T5' adds information about memory allocation and Gaussian elimination. 'T1' is useful for logging -progress of Qhull in high dimensions.

    +progress of Qhull in high dimensions. See +Debugging Qhull.

    Option 'Tn' can produce large amounts of output. Use options 'TPn', 'TWn', and 'TMn' to selectively @@ -147,8 +171,8 @@

    »TO file - output results to file

    Redirect stdout to 'file'. The filename may be enclosed in -single quotes. Unix and Windows NT users may use I/O redirection -instead (e.g., 'rbox 10 | qdelaunay >results').

    +single quotes. If the filename does not contain spaces, TOfile is OK. Unix and Windows NT users may use I/O +redirection instead of 'TO' (e.g., 'rbox 10 | qdelaunay >results').

    Windows95 users should always use 'TO file'. If they use I/O redirection, error output is not sent to the console. Qhull uses single quotes instead @@ -157,7 +181,7 @@

    »TPn - turn on tracing -when point n added to hull

    +when point n added to hull

    Option 'TPn' turns on tracing when point n is added to the hull. It also traces partitions of point n. This option @@ -165,6 +189,8 @@ method to determine the cause of a Qhull error. All Qhull errors report the last point added. +

    Use option 'TP-1' to turn on tracing after qh_buildhull and qh_postmerge.

    +

    Use options 'TPn TVn' to trace the addition of point n to the convex hull and stop when done.

    @@ -174,9 +200,9 @@ trace the addition of point n to the convex hull, partitions of point n, and wide merges.

    -

    »TRn - rerun qhull n times

    +

    »TRn - rerun qhull n times for QJn statitics

    -

    Option 'TRn' reruns Qhull n times. It is usually used +

    Option 'TRn' reruns Qhull n times. It is used with 'QJn' to determine the probability that a given joggle will fail. The summary ('s') lists the failure @@ -189,18 +215,19 @@ is reported, the options list the run number as "_run". To trace this run, set 'TRn' to the same value.

    -

    »Ts - print statistics

    +

    »Ts - print statistics

    Option 'Ts' collects statistics and prints them to stderr. For Delaunay triangulations, the angle statistics are restricted to the lower or upper envelope.

    »Tv - verify result: -structure, convexity, and point inclusion

    +structure, convexity, and point inclusion -

    Option 'Tv' checks the topological structure, convexity, and -point inclusion. If precision problems occurred, facet convexity -is tested whether or not 'Tv' is selected. Option 'Tv' does not +

    Option 'Tv' checks the topological structure, flipped facets, and +point inclusion. Facet convexity is tested if not merging or if 2-D/3-D and a merged facet. +If precision problems occur, flipped facet tests and facet convexity tests occur whether or not +'Tv' is selected. Option 'Tv' does not check point inclusion if forcing output with 'Po', or if 'Q5' is set.

    @@ -219,10 +246,9 @@ href="qh-optp.htm#Pp">Pp' is used. This allows the user to interrupt Qhull without changing the output.

    -

    With 'qvoronoi Fi' -and 'qvoronoi Fo', +

    With 'qvoronoi Fi', option 'Tv' collects statistics that verify all Voronoi vertices lie -on the separating hyperplane, and for bounded regions, all +on the separating hyperplane, and all separating hyperplanes are perpendicular bisectors.

    »TV-n - stop qhull before @@ -236,24 +262,27 @@

    »TVn - stop qhull after adding point n

    -

    Option 'TVn' stops Qhull after it has added point n. Output -shows the hull at this time.

    +

    Option 'TVn' stops Qhull after it has added point n and before it deletes +the visible facets. If facet merges lead to vertex merges, 'TVn' stops after +vertex merges and deleting visible facets. Output +shows the hull at this time. See option 'TAn' to stop after +adding n vertices.

    »TWn - trace merge facets -when width > n

    +when width > n

    Along with TMn, this option allows the user to determine the cause of a wide merge.

    -

    »Tz - send all output to -stdout

    -

    Redirect stderr to stdout.

    +

    »Tz - send all output to stdout

    + +

    Redirect stderr to stdout. See option 'Tf' for flushing writes.


    -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -263,7 +292,7 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)


    @@ -272,7 +301,7 @@ Home Page

    Comments to: qhull@qhull.org -
    +
    Created: Sept. 25, 1995 --- Last modified: see top

    diff -Nru qhull-2015.2/html/qh-quick.htm qhull-2020.2/html/qh-quick.htm --- qhull-2015.2/html/qh-quick.htm 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/html/qh-quick.htm 2020-05-22 02:29:26.000000000 +0000 @@ -7,28 +7,28 @@ -

    Up: Home -page for Qhull
    -Up: Qhull manual
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: Qhull internals
    -To: Qhull functions, macros, and data structures
    -To: Qhull files
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    +

    + Up: Home page for + Qhull (local)
    + Up: Qhull manual
    + To: Programs + • Options + • Output + • Formats + • Geomview + • Print + • Qhull + • Precision + • Trace + • Functions (local)
    + To: Qhull code
    + To: Qhull files (local)
    + To: GeomGlobal + • IoMem + • MergePoly + • QhullSet + • StatUser +


    @@ -39,7 +39,7 @@ This section lists all programs and options in Qhull. -

    Copyright © 1995-2015 C.B. Barber

    +

    Copyright © 1995-2020 C.B. Barber

      @@ -54,7 +54,7 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)

    qconvex -- convex hull
    @@ -144,352 +144,372 @@ • QhullPrecisionTrace -• Functions

    +• Functions (local)

    - + - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + + + + - - -
    'Fa' +'d' +delaunay +'f' +facet-dump +'G' +Geomview +'H' +Halfspace + +
    'i' +incidences +'m' +mathematica +'n' +normals +'o' +OFF-format + +
    'p' +points +'s' +summary +'v' +voronoi + +
     
    'Fa' Farea -'FA' +'FA' FArea-total -'Fc' +'Fc' Fcoplanars -'FC' +'FC' FCentrums
    'Fd' +'Fd' Fd-cdd-in -'FD' +'FD' FD-cdd-out -'FF' -FF-dump-xridge -'Fi' +'FF' +FFacets-xridge +'Fi' Finner
    'Fi' -Finner_bounded -'FI' +'Fi' +Finner-bounded +'FI' FIDs -'Fm' +'Fm' Fmerges -'FM' +'FM' FMaple
    'Fn' +'Fn' Fneighbors -'FN' +'FN' FNeigh-vertex -'Fo' +'Fo' Fouter -'Fo' -Fouter_unbounded +'Fo' +Fouter-unbounded
    'FO' +'FO' FOptions -'Fp' +'Fp' Fpoint-intersect -'FP' -FPoint_near -'FQ' +'FP' +FPoint-near +'FQ' FQhull
    'Fs' +'Fs' Fsummary -'FS' +'FS' FSize -'Ft' +'Ft' Ftriangles -'Fv' +'Fv' Fvertices
    'Fv' +'Fv' Fvoronoi -'FV' +'FV' FVertex-ave -'Fx' +'Fx' Fxtremes - -Merged facets or joggled input - -
     
    'PAn' -PArea-keep -'Pdk:n' -Pdrop_low -'PDk:n' -Pdrop_high -'Pg' -Pgood - -
    'PFn' -PFacet_area_keep -'PG' -PGood_neighbors -'PMn' -PMerge-keep -'Po' -Poutput_forced - -
    'Po' -Poutput_error -'Pp' -Pprecision_not
     
    'd' -delaunay -'v' -voronoi -'G' -Geomview -'H' -Halfspace - -
    'f' -facet_dump -'i' -incidences -'m' -mathematica -'n' -normals +'Ga' +Gall-points +'Gc' +Gcentrums +'GDn' +GDrop-dim +'Gh' +Ghyperplanes
    'o' -OFF_format -'p' -points -'s' -summary - -
     
    'Gv' -Gvertices -'Gp' +'Gi' +Ginner +'Gn' +Gno-planes +'Go' +Gouter +'Gp' Gpoints -'Ga' -Gall_points -'Gn' -Gno_planes
    'Gi' -Ginner -'Gc' -Gcentrums -'Gh' -Ghyperplanes -'Gr' +'Gr' Gridges - -
    'Go' -Gouter -'GDn' -GDrop_dim -'Gt' +'Gt' Gtransparent +'Gv' +Gvertices
     
    'T4' -T4_trace -'Tc' -Tcheck_often -'Ts' -Tstatistics -'Tv' -Tverify - -
    'Tz' -Tz_stdout -'TFn' -TFacet_log -'TI file' -TInput_file -'TPn' -TPoint_trace +'PAn' +PArea-keep +'Pdk:n' +Pdrop-low +'PDk:n' +Pdrop-high +'PFn' +PFacet-area-keep
    'TMn' -TMerge_trace -'TO file' -TOutput_file -'TRn' -TRerun -'TWn' -TWide_trace +'Pg' +Pgood +'PG' +PGood-neighbors +'PMn' +PMerge-keep +'Po' +Poutput-forced
    'TV-n' -TVertex_stop_before -
    'TVn' -TVertex_stop_after -'TCn' -TCone_stop_after +'Po' +Poutput-error +'Pp' +Pprecision-not
     
    'A-n' -Angle_max_pre -'An' -Angle_max_post -'C-0' -Centrum_roundoff -'C-n' -Centrum_size_pre - -
    'Cn' -Centrum_size_post -'En' -Error_round -'Rn' -Random_dist -'Vn' -Visible_min - -
    'Un' -Ucoplanar_max -'Wn' -Wide_outside - -
     
    'Qbk:n' -Qbound_low -'QBk:n' -QBound_high -'Qbk:0Bk:0' -Qbound_drop -'QbB' +'Qa' +Qallow-short +'Qbk:n' +Qbound-low +'QBk:n' +QBound-high +'QbB' QbB-scale-box
    'Qbb' +'Qbb' Qbb-scale-last -'Qc' +'Qbk:0Bk:0' +Qbound-drop +'Qc' Qcoplanar -'Qf' -Qfurthest -'Qg' -Qgood_only - -
    'QGn' -QGood_point -'Qi' +'Qi' Qinterior -'Qm' -Qmax_out -'QJn' -QJoggle
    'Qr' -Qrandom -'QRn' +'QJn' +QJoggle +'QRn' QRotate -'Qs' -Qsearch_1st -'Qt' +'Qs' +Qsearch-all +'Qt' Qtriangulate
    'Qu' +'Qu' QupperDelaunay -'QVn' -QVertex_good -'Qv' -Qvneighbors -'Qx' -Qxact_merge +'Qw' +Qwarn-allow +'Qx' +Qxact-merge +'Qz' +Qzinfinite + +
     
    'Qf' +Qfurthest +'Qg' +Qgood-only +'QGn' +QGood-point +'Qm' +Qmax-outside
    'Qz' -Qzinfinite +'Qr' +Qrandom +'Qv' +Qvertex-neighbors +'QVn' +QVertex-good + +
    'Q0' +Q0-no-premerge +'Q1' +Q1-angle-merge +'Q2' +Q2-no-independent +'Q3' +Q3-no-redundant + +
    'Q4' +Q4-no-old +'Q5' +Q5-no-check-out +'Q6' +Q6-no-concave +'Q7' +Q7-depth-first + +
    'Q8' +Q8-no-near-interior +'Q9' +Q9-pick-furthest +'Q10' +Q10-no-narrow +'Q11' +Q11-trinormals + +
    'Q12' +Q12-allow-wide +'Q14' +Q14-merge-pinched +'Q15' +Q15-duplicate-ridges
     
    'Q0' -Q0_no_premerge -'Q1' -Q1_no_angle -'Q2' -Q2_no_independ -'Q3' -Q3_no_redundant - -
    'Q4' -Q4_no_old -'Q5' -Q5_no_check_out -'Q6' -Q6_no_concave -'Q7' -Q7_depth_first - -
    'Q8' -Q8_no_near_in -'Q9' -Q9_pick_furthest -'Q10' -Q10_no_narrow -'Q11' -Q11_trinormals -
    +'TFn' +TFacet-log +'TI file' +TInput-file +'TO file' +TOutput-file +'Ts' +Tstatistics + + +'Tv' +Tverify +'Tz' +Tz-stdout + + +  +'T4' +T4-trace +'Ta' +Tannotate +'TAn' +TAdd-stop +'Tc' +Tcheck-often + + +'TCn' +TCone-stop +'Tf' +Tflush +'TMn' +TMerge-trace +'TPn' +TPoint-trace + + +'TRn' +TRerun +'TV-n' +TVertex-stop-before +'TVn' +TVertex-stop-after +'TWn' +TWide-trace + + +  +'A-n' +Angle-max-pre +'An' +Angle-max-post +'C-0' +Centrum-roundoff +'C-n' +Centrum-size-pre + + +'Cn' +Centrum-size-post +'En' +Error-round +'Rn' +Random-dist +'Un' +Ucoplanar-max + + +'Vn' +Visible-min +'Wn' +Wide-outside + + +


    -

    Up: Home -page for Qhull
    -Up: Qhull manual
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: Qhull internals
    -To: Qhull functions, macros, and data structures
    -To: Qhull files
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser
    - -


    +

    + Up: Home page for Qhull (local)
    + Up: Qhull manual
    + To: Programs + • Options + • Output + • Formats + • Geomview + • Print + • Qhull + • Precision + • Trace + • Functions (local)
    + To: Qhull code
    + To: Qhull files (local)
    + To: GeomGlobal + • IoMem + • MergePoly + • QhullSet + • StatUser
    + +


    The Geometry Center Home Page

    Comments to: qhull@qhull.org -
    +
    Created: Sept. 25, 1995 --- Last modified: see top

    diff -Nru qhull-2015.2/html/qhull-cpp.xml qhull-2020.2/html/qhull-cpp.xml --- qhull-2015.2/html/qhull-cpp.xml 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/html/qhull-cpp.xml 2020-05-22 02:29:26.000000000 +0000 @@ -6,11 +6,11 @@ xmlns:rf="http://schemas.roadintranet.org/road-faq-1" title=" C++ interface to Qhull" file="qhull-cpp.xml" - fileid="$Id: //main/2015/qhull/html/qhull-cpp.xml#2 $$Change: 2027 $" - fileChange="$DateTime: 2015/11/09 23:18:11 $$Author: bbarber $"> + fileid="$Id: //main/2019/qhull/html/qhull-cpp.xml#2 $$Change: 2954 $" + fileChange="$DateTime: 2020/05/21 22:30:09 $$Author: bbarber $">

    Qhull C++ -- C++ interface to Qhull

    - Copyright (c) 2009-2015, C.B. Barber + Copyright (c) 2009-2020, C.B. Barber
    diff -Nru qhull-2015.2/html/qhull.htm qhull-2020.2/html/qhull.htm --- qhull-2015.2/html/qhull.htm 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/html/qhull.htm 2020-08-16 17:53:45.000000000 +0000 @@ -7,8 +7,8 @@ -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -18,7 +18,7 @@ • QhullPrecisionTrace -• Functions
    +• Functions (local)
    To: synopsis • input • outputs • controls • options @@ -66,8 +66,7 @@ This leads to serious precision errors.

    -

    Use the following equivalences when calling qhull in 2-d to 4-d (a 3-d -Delaunay triangulation is a 4-d convex hull): +

    Use the following equivalences when calling qhull:

    • @@ -81,22 +80,6 @@
    -

    Use the following equivalences when calling qhull in 5-d and higher (a 4-d -Delaunay triangulation is a 5-d convex hull): -

    - -
    - -

    By default, Qhull merges coplanar facets. For example, the convex hull of a cube's vertices has six facets. @@ -117,28 +100,30 @@ are there extra points in a 4-d or higher convex hull?

    -

    Copyright © 1995-2015 C.B. Barber

    +

    Copyright © 1995-2020 C.B. Barber


    »qhull synopsis

    -qhull- compute convex hulls and related structures.
    -    input (stdin): dimension, n, point coordinates
    +qhull -- compute convex hulls and related structures.
    +    input (stdin): dimension, number of points, point coordinates
         comments start with a non-numeric character
         halfspace: use dim+1 and put offsets after coefficients
     
    -options (qh-quick.htm):
    +options:
         d    - Delaunay triangulation by lifting points to a paraboloid
         d Qu - furthest-site Delaunay triangulation (upper convex hull)
         v    - Voronoi diagram as the dual of the Delaunay triangulation
         v Qu - furthest-site Voronoi diagram
         H1,1 - Halfspace intersection about [1,1,0,...] via polar duality
         Qt   - triangulated output
    -    QJ   - joggle input instead of merging facets
    +    QJ   - joggled input instead of merged facets
         Tv   - verify result: structure, convexity, and point inclusion
         .    - concise list of all options
    -    -    - one-line description of all options
    +    -    - one-line description of each option
    +    -?   - this message
    +    -V   - version
     
     Output options (subset):
         s    - summary of results (default)
    @@ -146,22 +131,24 @@
         n    - normals with offsets
         p    - vertex coordinates (if 'Qc', includes coplanar points)
                if 'v', Voronoi vertices
    +    FA   - report total area and volume
         Fp   - halfspace intersections
    +    FS   - total area and volume
         Fx   - extreme points (convex hull vertices)
    -    FA   - compute total area and volume
    -    o    - OFF format (if 'v', outputs Voronoi regions)
         G    - Geomview output (2-d, 3-d and 4-d)
         m    - Mathematica output (2-d and 3-d)
    +    o    - OFF format (if 'v', outputs Voronoi regions)
         QVn  - print facets that include point n, -n if not
    -    TO file- output results to file, may be enclosed in single quotes
    +    TI file - input file, may be enclosed in single quotes
    +    TO file - output file, may be enclosed in single quotes
     
     examples:
    -    rbox c d D2 | qhull Qc s f Fx | more      rbox 1000 s | qhull Tv s FA
    +    rbox D4 | qhull Tv                        rbox 1000 s | qhull Tv s FA
         rbox 10 D2 | qhull d QJ s i TO result     rbox 10 D2 | qhull v Qbb Qt p
         rbox 10 D2 | qhull d Qu QJ m              rbox 10 D2 | qhull v Qu QJ o
    -    rbox c | qhull n                          rbox c | qhull FV n | qhull H Fp
    +    rbox c d D2 | qhull Qc s f Fx | more      rbox c | qhull FV n | qhull H Fp
         rbox d D12 | qhull QR0 FA                 rbox c D7 | qhull FA TF1000
    -    rbox y 1000 W0 | qhull                    rbox 10 | qhull v QJ o Fv
    +    rbox y 1000 W0 | qhull Qc                 rbox c | qhull n
     

    »qhull input

    @@ -175,7 +162,7 @@

    Use I/O redirection (e.g., qhull < data.txt), a pipe (e.g., rbox 10 | qhull), -or the 'TI' option (e.g., qhull TI data.txt). +or the 'TI' option (e.g., qhull TI data.txt).

    Comments start with a non-numeric character. Error reporting is simpler if there is one point per line. Dimension @@ -254,7 +241,7 @@ See qvoronoi.

    qhull H
    compute the halfspace intersection about a point via polar - duality. The point is below the hyperplane that defines the halfspace. + duality. The point is below the hyperplanes that defines the halfspace. See qhalf.
    @@ -289,7 +276,7 @@

    »qhull options

    -qhull- compute convex hulls and related structures.
    +qhull -- compute convex hulls and related structures.
         http://www.qhull.org
     
     input (stdin):
    @@ -302,15 +289,16 @@
     options:
         d    - Delaunay triangulation by lifting points to a paraboloid
         d Qu - furthest-site Delaunay triangulation (upper convex hull)
    -    v    - Voronoi diagram (dual of the Delaunay triangulation)
    -    v Qu - furthest-site Voronoi diagram
         Hn,n,... - halfspace intersection about point [n,n,0,...]
    -    Qt   - triangulated output
    -    QJ   - joggle input instead of merging facets
         Qc   - keep coplanar points with nearest facet
         Qi   - keep interior points with nearest facet
    +    QJ   - joggled input instead of merged facets
    +    Qt   - triangulated output
    +    v    - Voronoi diagram (dual of the Delaunay triangulation)
    +    v Qu - furthest-site Voronoi diagram
     
     Qhull control options:
    +    Qa   - allow input with fewer or more points than coordinates
         Qbk:n   - scale coord k so that low bound is n
           QBk:n - scale coord k so that upper bound is n (QBk is 0.5)
         QbB  - scale input to unit cube centered at the origin
    @@ -318,23 +306,26 @@
         Qbk:0Bk:0 - remove k-th coordinate from input
         QJn  - randomly joggle input in range [-n,n]
         QRn  - random rotation (n=seed, n=0 time, n=-1 time/no rotate)
    -    Qf   - partition point to furthest outside facet
    -    Qg   - only build good facets (needs 'QGn', 'QVn', or 'PdD')
    -    Qm   - only process points that would increase max_outside
    -    Qr   - process random outside points instead of furthest ones
         Qs   - search all points for the initial simplex
         Qu   - for 'd' or 'v', compute upper hull without point at-infinity
                   returns furthest-site Delaunay triangulation
    -    Qv   - test vertex neighbors for convexity
    -    Qx   - exact pre-merges (skips coplanar and anglomaniacs facets)
    +    QVn  - good facet if it includes point n, -n if not
    +    Qx   - exact pre-merges (skips coplanar and angle-coplanar facets)
         Qz   - add point-at-infinity to Delaunay triangulation
    +
    +Qhull extra options:
    +    Qf   - partition point to furthest outside facet
    +    Qg   - only build good facets (needs 'QGn', 'QVn', or 'PdD')
         QGn  - good facet if visible from point n, -n for not visible
    -    QVn  - good facet if it includes point n, -n if not
    -    Q0   - turn off default p remerge with 'C-0'/'Qx'
    -    Q1     - sort merges by type instead of angle
    -    Q2   - merge all non-convex at once instead of independent sets
    +    Qm   - only process points that would increase max_outside
    +    Qr   - process random outside points instead of furthest ones
    +    Qv   - test vertex neighbors for convexity
    +    Qw   - allow option warnings
    +    Q0   - turn off default premerge with 'C-0'/'Qx'
    +    Q1   - merge by mergetype/angle instead of mergetype/distance
    +    Q2   - merge all coplanar facets instead of merging independent sets
         Q3   - do not merge redundant vertices
    -    Q4   - avoid old>new merges
    +    Q4   - avoid old->new merges
         Q5   - do not correct outer planes at end of qhull
         Q6   - do not pre-merge concave or coplanar facets
         Q7   - depth-first processing instead of breadth-first
    @@ -342,23 +333,31 @@
         Q9   - process furthest of furthest points
         Q10  - no special processing for narrow distributions
         Q11  - copy normals and recompute centrums for tricoplanar facets
    -    Q12  - do not error on wide merge due to duplicate ridge and nearly coincident points
    +    Q12  - allow wide facets and wide dupridge
    +    Q14  - merge pinched vertices that create a dupridge
    +    Q15  - check for duplicate ridges with the same vertices
     
    -Towpaths Trace options:
    -    T4   - trace at level n, 4=all, 5=mem/gauss, -1= events
    -    Tc   - check frequently during execution
    -    Ts   - print statistics
    +T options:
    +    TFn  - report summary when n or more facets created
    +    TI file - input file, may be enclosed in single quotes
    +    TO file - output file, may be enclosed in single quotes
    +    Ts   - statistics
         Tv   - verify result: structure, convexity, and point inclusion
         Tz   - send all output to stdout
    -    TFn  - report summary when n or more facets created
    -    TI file - input data from file, no spaces or single quotes
    -    TO file - output results to file, may be enclosed in single quotes
    +
    +Trace options:
    +    T4   - trace at level n, 4=all, 5=mem/gauss, -1= events
    +    Ta   - annotate output with message codes
    +    TAn  - stop qhull after adding n vertices
    +     TCn - stop qhull after building cone for point n
    +     TVn - stop qhull after adding point n, -n for before
    +    Tc   - check frequently during execution
    +    Tf   - flush each qh_fprintf for debugging segfaults
         TPn  - turn on tracing when point n added to hull
    +     TP-1  turn on tracing after qh_buildhull and qh_postmerge
          TMn - turn on tracing at merge n
          TWn - trace merge facets when width > n
    -    TRn  - rerun qhull n times.  Use with 'QJn'
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)
    -     TCn - stop qhull after building cone for point n (see TVn)
    +    TRn  - rerun qhull n times for statistics to adjust 'QJn'
     
     Precision options:
         Cn   - radius of centrum (roundoff added).  Merge facets if non-convex
    @@ -375,8 +374,8 @@
         G    - Geomview output (see below)
         i    - vertices incident to each facet
         m    - Mathematica output (2-d and 3-d)
    -    o    - OFF format (dim, points and facets; Voronoi regions)
         n    - normals with offsets
    +    o    - OFF format (dim, points and facets; Voronoi regions)
         p    - vertex coordinates or Voronoi vertices (coplanar points if 'Qc')
         s    - summary (stderr)
     
    @@ -406,32 +405,32 @@
                           output: #vertices, #facets, #coplanars, #nonsimplicial
                         #real (2), max outer plane, min vertex
         FS   - sizes:   #int (0)
    -                    #real(2) tot area, tot volume
    +                    #real (2) tot area, tot volume
         Ft   - triangulation with centrums for non-simplicial facets (OFF format)
         Fv   - count plus vertices for each facet
                for 'v', Voronoi diagram as Voronoi vertices for pairs of sites
         FV   - average of vertices (a feasible point for 'H')
         Fx   - extreme points (in order for 2-d)
     
    -Geomview options (2-d, 3-d, and 4-d; 2-d Voronoi)
    +Geomview output (2-d, 3-d, and 4-d; 2-d Voronoi)
         Ga   - all points as dots
          Gp  -  coplanar points and vertices as radii
          Gv  -  vertices as spheres
    +    Gc   - centrums
    +    GDn  - drop dimension n in 3-d and 4-d output
    +    Gh   - hyperplane intersections
         Gi   - inner planes only
          Gn  -  no planes
          Go  -  outer planes only
    -    Gc   - centrums
    -    Gh   - hyperplane intersections
         Gr   - ridges
    -    GDn  - drop dimension n in 3-d and 4-d output
         Gt   - for 3-d 'd', transparent outer ridges
     
     Print options:
         PAn  - keep n largest facets by area
    -    Pdk:n - drop facet if normal[k] <= n (default 0.0)
    +    Pdk:n - drop facet if normal[k] <= n (default 0.0)
         PDk:n - drop facet if normal[k] >= n
    -    Pg   - print good facets (needs 'QGn' or 'QVn')
         PFn  - keep facets whose area is at least n
    +    Pg   - print good facets (needs 'QGn' or 'QVn')
         PG   - print neighbors of good facets
         PMn  - keep n facets with most merges
         Po   - force output.  If error, output neighborhood of facet
    @@ -439,13 +438,15 @@
     
         .    - list of all options
         -    - one line descriptions of all options
    +    -?   - help with examples
    +    -V   - version
     

    -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -455,7 +456,7 @@ • QhullPrecisionTrace -• Functions
    +• Functions (local)
    To: synopsis • input • outputs • controls • options @@ -467,7 +468,7 @@ Home Page

    Comments to: qhull@qhull.org -
    +
    Created: Sept. 25, 1995 --- Last modified: see top

    diff -Nru qhull-2015.2/html/qhull.man qhull-2020.2/html/qhull.man --- qhull-2015.2/html/qhull.man 2016-01-09 03:28:19.000000000 +0000 +++ qhull-2020.2/html/qhull.man 2019-06-13 14:50:00.000000000 +0000 @@ -24,41 +24,50 @@ halfspace: use dim plus one with offsets after coefficients options (qh-quick.htm): - d - Delaunay triangulation by lifting points to a paraboloid - v - Voronoi diagram via the Delaunay triangulation - H1,1 - Halfspace intersection about [1,1,0,...] - d Qu - Furthest-site Delaunay triangulation (upper convex hull) - v Qu - Furthest-site Voronoi diagram - Qt - triangulated output - QJ - Joggle the input to avoid precision problems - . - concise list of all options - - - one-line description of all options + d - Delaunay triangulation by lifting points to a paraboloid + d Qu - furthest-site Delaunay triangulation (upper convex hull) + v - Voronoi diagram as the dual of the Delaunay triangulation + v Qu - furthest-site Voronoi diagram + H1,1 - Halfspace intersection about [1,1,0,...] via polar duality + Qt - triangulated output + QJ - joggled input instead of merged facets + Tv - verify result: structure, convexity, and point inclusion + . - concise list of all options + - - one-line description of each option + -? - this message + -V - version Output options (subset): - FA - compute total area and volume - Fx - extreme points (convex hull vertices) - G - Geomview output (2-d, 3-d and 4-d) - Fp - halfspace intersection coordinates - m - Mathematica output (2-d and 3-d) - n - normals with offsets - o - OFF file format (if Voronoi, outputs regions) - TO file- output results to file, may be enclosed in single quotes - f - print all fields of all facets - s - summary of results (default) - Tv - verify result: structure, convexity, and point inclusion - p - vertex coordinates (centers for Voronoi) - i - vertices incident to each facet - -example: - rbox 1000 s | qhull Tv s FA + s - summary of results (default) + i - vertices incident to each facet + n - normals with offsets + p - vertex coordinates (if 'Qc', includes coplanar points) + if 'v', Voronoi vertices + FA - report total area and volume + Fp - halfspace intersections + FS - total area and volume + Fx - extreme points (convex hull vertices) + G - Geomview output (2-d, 3-d and 4-d) + m - Mathematica output (2-d and 3-d) + o - OFF format (if 'v', outputs Voronoi regions) + QVn - print facets that include point n, -n if not + TI file - input file, may be enclosed in single quotes + TO file - output file, may be enclosed in single quotes + +examples: + rbox D4 | qhull Tv rbox 1000 s | qhull Tv s FA + rbox 10 D2 | qhull d QJ s i TO result rbox 10 D2 | qhull v Qbb Qt p + rbox 10 D2 | qhull d Qu QJ m rbox 10 D2 | qhull v Qu QJ o + rbox c d D2 | qhull Qc s f Fx | more rbox c | qhull FV n | qhull H Fp + rbox d D12 | qhull QR0 FA rbox c D7 | qhull FA TF1000 + rbox y 1000 W0 | qhull Qc rbox c | qhull n .fi - - html manual: index.htm + - html manual: html/index.htm - installation: README.txt - see also: COPYING.txt, REGISTER.txt, Changes.txt - WWW: - GIT: - - mirror: - news: - Geomview: - news group: @@ -85,7 +94,7 @@ - ACKNOWLEGEMENTS This man page briefly describes all Qhull options. Please report -any mismatches with Qhull's html manual (index.htm). +any mismatches with Qhull's html manual (html/index.htm). .PP .SH INTRODUCTION @@ -157,15 +166,14 @@ merging will not occur. .SH OPTIONS .PP -To get a list of the most important options, execute 'qhull' by itself. -To get a complete list of options, -execute 'qhull \-'. +To get a list of the most important options, execute 'qhull -?'. +To get a complete list of options, execute 'qhull \-'. To get a complete, concise list of options, execute 'qhull .'. Options can be in any order. Capitalized options take an argument (except 'PG' and 'F' options). Single letters are used for output formats and precision constants. The -other options are grouped into menus for other output formats ('F'), +other options are grouped into menus: output formats ('F'), Geomview output ('G'), printing ('P'), Qhull control ('Q'), and tracing ('T'). .TP @@ -233,7 +241,7 @@ Input/Output options: .TP f -Print out all facets and all fields of each facet. +Print all facets and all fields of each facet. .TP G Output the hull in Geomview format. For imprecise hulls, @@ -259,6 +267,9 @@ than the indices of the input points. Each base corresponds to a simplicial ridge between two facets. To print the vertices without triangulation, use option 'Fv'. +To print the centrum coordinates, use option 'Ft'. +The centrum indices +for option 'i' are one more than the centrum indices for option 'Ft'. .TP m Output the hull in Mathematica format. Qhull writes a Mathematica file for 2\[hy]d and 3\[hy]d @@ -298,7 +309,7 @@ .TP s Print a summary to stderr. If no output options -are specified at all, a summary goes to stdout. The summary lists +are specified, a summary goes to stdout. The summary lists the number of input points, the dimension, the number of vertices in the convex hull, the number of facets in the convex hull, the number of good facets (if 'Pg'), and statistics. @@ -435,8 +446,8 @@ with the number of indices and floats. The first pair lists adjacent input sites, the next d floats are the normalized coefficients for the hyperplane, -and the last float is the offset. The hyperplane is oriented toward 'QVn' -(if defined), or the first input site of the pair. Use 'Tv' to +and the last float is the offset. The hyperplane is oriented +toward 'QVn' (if defined), or the first input site of the pair. Use 'Tv' to verify that the hyperplanes are perpendicular bisectors. Use 'Fo' for unbounded regions, and 'Fv' for the corresponding Voronoi vertices. .TP @@ -486,8 +497,8 @@ with the number of indices and floats. The first pair lists adjacent input sites, the next d floats are the normalized coefficients for the hyperplane, -and the last float is the offset. The hyperplane is oriented toward 'QVn' -(if defined), or the first input site of the pair. Use 'Tv' to +and the last float is the offset. The hyperplane is oriented +toward 'QVn' (if defined), or the first input site of the pair. Use 'Tv' to verify that the hyperplanes are perpendicular bisectors. Use 'Fi' for bounded regions, and 'Fv' for the corresponding Voronoi vertices. .TP @@ -660,7 +671,7 @@ Print only good facets. A good facet is either visible from a point (the 'QGn' option) or includes a point (the 'QVn' option). It also meets the requirements of 'Pdk' and 'PDk' options. Option 'Pg' is automatically -set for options 'PAn' and 'PFn'. +set for options 'd', 'PAn', 'PFn', and 'PMn'. .TP PG Print neighbors of good facets. @@ -686,6 +697,9 @@ .TP Qhull control options .TP +Qa +Allow input with fewer or more points than coordinates +.TP Qbk:0Bk:0 Drop dimension k from the input points. This allows the user to take convex hulls of sub\[hy]dimensional objects. It happens before @@ -781,6 +795,9 @@ include point n. The point is either in the initial simplex or it is the first point added to the hull. Option 'QVn' may not be used with merging. .TP +Qw +Allow option warnings. Otherwise Qhull returns an error after most option warnings +.TP Qx Perform exact merges while building the hull. The "exact" merges are merging a point into a coplanar facet (defined by 'Vn', 'Un', @@ -809,8 +826,7 @@ generated. .TP Q1 -With 'Q1', Qhull sorts merges by type (coplanar, angle coplanar, concave) -instead of by angle. +With 'Q1', Qhull merges by mergetype/angle instead of mergetype/distance. .TP Q2 With 'Q2', Qhull merges all facets at once instead of using @@ -848,7 +864,13 @@ With 'Q11', Qhull copies normals and recompute centrums for tricoplanar facets. .TP Q12 -With 'Q12', Qhull does not report a very wide merge due to a duplicated ridge with nearly coincident vertices +With 'Q12', Qhull allows wide facets and wide dupridge. +.TP +Q14 +With 'Q14', Qhull merges pinched vertices that create a dupridge. +.TP +Q15 +With 'Q15', Qhull checks for duplicate ridges with the same vertices. .PP .TP Trace options @@ -865,6 +887,9 @@ Annotate output with codes that identify the corresponding qh_fprintf() statement. .TP +TAn +Stop Qhull after adding n vertices. +.TP Tc Check frequently during execution. This will catch most inconsistency errors. @@ -874,6 +899,10 @@ output for 'f' includes the cone and the old hull. See also 'TVn'. .TP +Tf +Flush output after each qh_fprintf. Use 'Tf' for debugging segfaults. See 'Tz' for +redirecting stderr. +.TP TFn Report progress whenever more than n facets are created During post\[hy]merging, 'TFn' @@ -883,6 +912,9 @@ Input data from 'file'. The filename may not include spaces or quotes. .TP +TMn +Turn on tracing at n'th merge. +.TP TO file Output results to 'file'. The name may be enclosed in single quotes. @@ -892,6 +924,9 @@ partitions of point n. If used with TWn, turn off tracing after adding point n to the hull. .TP +TP-1 +Turn on tracing after qh_buildhull and qh_postmerge. +.TP TRn Rerun qhull n times. Usually used with 'QJn' to determine the probability that a given joggle will fail. @@ -921,14 +956,11 @@ Stop Qhull after adding point n. If n < 0, stop Qhull before adding point n. Output shows the hull at this time. See also 'TCn' .TP -TMn -Turn on tracing at n'th merge. -.TP TWn Trace merge facets when the width is greater than n. .TP Tz -Redirect stderr to stdout. +Redirect stderr to stdout. See 'Tf' for flushing writes. .PP .SH BUGS Please report bugs to Brad Barber at qhull_bug@qhull.org. diff -Nru qhull-2015.2/html/qhull.txt qhull-2020.2/html/qhull.txt --- qhull-2015.2/html/qhull.txt 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/html/qhull.txt 2019-06-13 14:50:00.000000000 +0000 @@ -15,39 +15,49 @@ halfspace: use dim plus one with offsets after coefficients options (qh-quick.htm): - d - Delaunay triangulation by lifting points to a paraboloid - v - Voronoi diagram via the Delaunay triangulation - H1,1 - Halfspace intersection about [1,1,0,...] - d Qu - Furthest-site Delaunay triangulation (upper convex hull) - v Qu - Furthest-site Voronoi diagram - QJ - Joggle the input to avoid precision problems - . - concise list of all options - - - one-line description of all options + d - Delaunay triangulation by lifting points to a paraboloid + d Qu - furthest-site Delaunay triangulation (upper convex hull) + v - Voronoi diagram as the dual of the Delaunay triangulation + v Qu - furthest-site Voronoi diagram + H1,1 - Halfspace intersection about [1,1,0,...] via polar duality + Qt - triangulated output + QJ - joggled input instead of merged facets + Tv - verify result: structure, convexity, and point inclusion + . - concise list of all options + - - one-line description of each option + -? - this message + -V - version Output options (subset): - FA - compute total area and volume - Fx - extreme points (convex hull vertices) - G - Geomview output (2-d, 3-d and 4-d) - Fp - halfspace intersection coordinates - m - Mathematica output (2-d and 3-d) - n - normals with offsets - o - OFF file format (if Voronoi, outputs regions) - TO file- output results to file, may be enclosed in single quotes - f - print all fields of all facets - s - summary of results (default) - Tv - verify result: structure, convexity, and point inclusion - p - vertex coordinates - i - vertices incident to each facet + s - summary of results (default) + i - vertices incident to each facet + n - normals with offsets + p - vertex coordinates (if 'Qc', includes coplanar points) + if 'v', Voronoi vertices + FA - report total area and volume + Fp - halfspace intersections + FS - total area and volume + Fx - extreme points (convex hull vertices) + G - Geomview output (2-d, 3-d and 4-d) + m - Mathematica output (2-d and 3-d) + o - OFF format (if 'v', outputs Voronoi regions) + QVn - print facets that include point n, -n if not + TI file - input file, may be enclosed in single quotes + TO file - output file, may be enclosed in single quotes + + examples: + rbox D4 | qhull Tv rbox 1000 s | qhull Tv s FA + rbox 10 D2 | qhull d QJ s i TO result rbox 10 D2 | qhull v Qbb Qt p + rbox 10 D2 | qhull d Qu QJ m rbox 10 D2 | qhull v Qu QJ o + rbox c d D2 | qhull Qc s f Fx | more rbox c | qhull FV n | qhull H Fp + rbox d D12 | qhull QR0 FA rbox c D7 | qhull FA TF1000 + rbox y 1000 W0 | qhull Qc rbox c | qhull n - example: - rbox 1000 s | qhull Tv s FA - - - html manual: index.htm + - html manual: html/index.htm - installation: README.txt - see also: COPYING.txt, REGISTER.txt, Changes.txt - WWW: - GIT: - - mirror: - news: - Geomview: - news group: @@ -58,7 +68,7 @@ -Geometry Center 2003/12/30 1 +Geometry Center 2019/05/03 1 @@ -86,8 +96,8 @@ - ACKNOWLEGEMENTS This man page briefly describes all Qhull options. Please - report any mismatches with Qhull's html manual (qh- - man.htm). + report any mismatches with Qhull's html manual + (html/index.htm). @@ -124,7 +134,7 @@ -Geometry Center 2003/12/30 2 +Geometry Center 2019/05/03 2 @@ -178,19 +188,19 @@ OPTIONS To get a list of the most important options, execute - 'qhull' by itself. To get a complete list of options, + 'qhull -?'. To get a complete list of options, execute 'qhull -'. To get a complete, concise list of options, execute 'qhull .'. Options can be in any order. Capitalized options take an argument (except 'PG' and 'F' options). Single letters are used for output formats and precision constants. The - other options are grouped into menus for other output for- - mats ('F'), Geomview output ('G'), printing ('P'), Qhull + other options are grouped into menus: output formats ('F'), + Geomview output ('G'), printing ('P'), Qhull control ('Q'), -Geometry Center 2003/12/30 3 +Geometry Center 2019/05/03 3 @@ -199,7 +209,7 @@ qhull(1) qhull(1) - control ('Q'), and tracing ('T'). + and tracing ('T'). Main options: @@ -256,7 +266,7 @@ -Geometry Center 2003/12/30 4 +Geometry Center 2019/05/03 4 @@ -277,7 +287,7 @@ Input/Output options: - f Print out all facets and all fields of each facet. + f Print all facets and all fields of each facet. G Output the hull in Geomview format. For imprecise hulls, Geomview displays the inner and outer hull. @@ -302,7 +312,11 @@ trum. Its index is greater than the indices of the input points. Each base corresponds to a simpli- cial ridge between two facets. To print the ver- - tices without triangulation, use option 'Fv'. + tices without triangulation, use option 'Fv'. To + print the centrum coordinates, use option 'Ft'. The + centrum indices for option 'i' are one more than + the centrum indices for option 'Ft'. + m Output the hull in Mathematica format. Qhull writes a Mathematica file for 2-d and 3-d convex @@ -324,7 +338,7 @@ -Geometry Center 2003/12/30 5 +Geometry Center 2019/05/03 5 @@ -353,13 +367,13 @@ dinates of each Voronoi vertex. s Print a summary to stderr. If no output options - are specified at all, a summary goes to stdout. + are specified, a summary goes to stdout. The summary lists the number of input points, the dimension, the number of vertices in the convex hull, the number of facets in the convex hull, the number of good facets (if 'Pg'), and statistics. - The last two statistics (if needed) measure the + The last two statistics (if needed) measure the maximum distance from a point or vertex to a facet. The number in parenthesis (e.g., 2.1x) is the ratio between the maximum distance and the worst-case @@ -390,7 +404,7 @@ -Geometry Center 2003/12/30 6 +Geometry Center 2019/05/03 6 @@ -456,7 +470,7 @@ -Geometry Center 2003/12/30 7 +Geometry Center 2019/05/03 7 @@ -522,7 +536,7 @@ -Geometry Center 2003/12/30 8 +Geometry Center 2019/05/03 8 @@ -532,10 +546,11 @@ last float is the offset. The hyperplane is ori- - ented toward verify that the hyperplanes are per- - pendicular bisectors. Use 'Fo' for unbounded - regions, and 'Fv' for the corresponding Voronoi - vertices. + ented toward 'QVn' (if defined), or the first input + site of the pair. Use 'Tv' to verify that the + hyperplanes are perpendicular bisectors. Use + 'Fo' for unbounded regions, and 'Fv' for the + corresponding Voronoi vertices. FI Print facet identifiers. @@ -577,10 +592,11 @@ adjacent input sites, the next d floats are the normalized coefficients for the hyperplane, and the last float is the offset. The hyperplane is ori- - ented toward verify that the hyperplanes are per- - pendicular bisectors. Use 'Fi' for bounded - regions, and 'Fv' for the corresponding Voronoi - vertices. + ented toward 'QVn' (if defined), or the first input + site of the pair. Use 'Tv' to verify that the + hyperplanes are perpendicular bisectors. Use + 'Fi' for bounded regions, and 'Fv' for the + corresponding Voronoi vertices. FO List all options to stderr, including the default values. Additional 'FO's are printed to stdout. @@ -590,7 +606,7 @@ -Geometry Center 2003/12/30 9 +Geometry Center 2019/05/03 9 @@ -654,7 +670,7 @@ -Geometry Center 2003/12/30 10 +Geometry Center 2019/05/03 10 @@ -720,7 +736,7 @@ -Geometry Center 2003/12/30 11 +Geometry Center 2019/05/03 11 @@ -786,7 +802,7 @@ -Geometry Center 2003/12/30 12 +Geometry Center 2019/05/03 12 @@ -799,8 +815,8 @@ visible from a point (the 'QGn' option) or includes a point (the 'QVn' option). It also meets the requirements of 'Pdk' and 'PDk' options. Option - 'Pg' is automatically set for options 'PAn' and - 'PFn'. + 'Pg' is automatically set for options 'd', 'PAn', + 'PFn', and 'PMn' PG Print neighbors of good facets. @@ -822,6 +838,8 @@ Qhull control options + Qa Allow input with fewer or more points than coordinates + Qbk:0Bk:0 Drop dimension k from the input points. This allows the user to take convex hulls of sub-dimen- @@ -850,7 +868,7 @@ -Geometry Center 2003/12/30 13 +Geometry Center 2019/05/03 13 @@ -917,7 +935,7 @@ -Geometry Center 2003/12/30 14 +Geometry Center 2019/05/03 14 @@ -942,6 +960,9 @@ the first point added to the hull. Option 'QVn' may not be used with merging. + Qw Allow option warnings. Otherwise Qhull returns an + error after most option warnings. + Qx Perform exact merges while building the hull. The "exact" merges are merging a point into a coplanar facet (defined by 'Vn', 'Un', and 'C-n'), merging @@ -968,8 +989,8 @@ the convex hull. This may lead to precision errors. If so, a descriptive warning is generated. - Q1 With 'Q1', Qhull sorts merges by type (coplanar, - angle coplanar, concave) instead of by angle. + Q1 With 'Q1', Qhull merges by mergetype/angle instead + of mergetype/distance. Q2 With 'Q2', Qhull merges all facets at once instead of using independent sets of merges and then @@ -987,7 +1008,7 @@ -Geometry Center 2003/12/30 15 +Geometry Center 2019/05/03 15 @@ -1016,9 +1037,12 @@ Q11 With 'Q11', Qhull copies normals and recomputes centrums for tricoplanar facets. - Q12 With 'Q12', Qhull does not report a very wide merge due - to a duplicated ridge with nearly coincident vertices + Q12 With 'Q12', Qhull allows wide facets and wide dupridge + + Q14 With 'Q14', Qhull merges pinched vertices that create a dupridge. + Q15 With 'Q15', Qhull checks for duplicate ridges with the same vertices. + Trace options Tn Trace at level n. Qhull includes full execution @@ -1032,6 +1056,8 @@ Ta Annotate output with codes that identify the corresponding qh_fprintf() statement. + TAn Stop Qhull after adding n vertices. + Tc Check frequently during execution. This will catch most inconsistency errors. @@ -1039,21 +1065,28 @@ for point n. The output for 'f' includes the cone and the old hull. See also 'TVn'. + Tf Flush output after each qh_fprintf. Use 'Tf' for + debugging segfaults. See 'Tz' for redirecting stderr. + TFn Report progress whenever more than n facets are created During post-merging, 'TFn' reports progress after more than n/2 merges. TI file Input data from 'file'. The filename may not include - spaces or quotes. + spaces or quotes. + + TMn Turn on tracing at n'th merge. TO file Output results to 'file'. The name may be enclosed in single quotes. TPn Turn on tracing when point n is added to the hull. - Trace partitions of point n. If used with TWn, turn off - tracing after adding point n to the hull. + Trace partitions of point n. If used with TWn, turn off + tracing after adding point n to the hull. + + TP-1 Turn on tracing after qh_buildhull and qh_postmerge. TRn Rerun qhull n times. Usually used with 'QJn' to determine the probability that a given joggle will @@ -1069,8 +1102,7 @@ Option 'Tv' does not check point inclusion if - -Geometry Center 2003/12/30 16 +Geometry Center 2019/05/03 16 @@ -1097,12 +1129,10 @@ Qhull before adding point n. Output shows the hull at this time. See also 'TCn' - TMn Turn on tracing at n'th merge. - TWn Trace merge facets when the width is greater than n. - Tz Redirect stderr to stdout. + Tz Redirect stderr to stdout. See 'Tf' for flushing writes. BUGS @@ -1136,7 +1166,7 @@ -Geometry Center 2003/12/30 17 +Geometry Center 2019/05/03 17 @@ -1196,7 +1226,7 @@ -Geometry Center 2003/12/30 18 +Geometry Center 2019/05/03 18 @@ -1214,50 +1244,6 @@ Qhull is available from http://www.qhull.org - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Geometry Center 2003/12/30 19 +Geometry Center 2019/05/03 19 diff -Nru qhull-2015.2/html/qvoron_f.htm qhull-2020.2/html/qvoron_f.htm --- qhull-2015.2/html/qvoron_f.htm 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/html/qvoron_f.htm 2020-08-16 17:53:45.000000000 +0000 @@ -8,8 +8,8 @@ Up: -Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -19,7 +19,7 @@ • QhullPrecisionTrace -• Functions
    +• Functions (local)
    To: synopsis • input • outputs • controls • graphics @@ -77,18 +77,16 @@ region corresponds to a vertex of the Delaunay triangulation (i.e., an input site).

    -

    See Qhull FAQ - Delaunay and +

    See Qhull FAQ (local) - Delaunay and Voronoi diagram questions.

    The 'qvonoroi' program is equivalent to -'qhull v Qbb' in 2-d to 3-d, and -'qhull v Qbb Qx' -in 4-d and higher. It disables the following Qhull +'qhull v Qbb'. It disables the following Qhull options: d n m v H U Qb -QB Qc Qf Qg Qi Qm Qr QR Qv Qx TR E V Fa FA FC Fp FS Ft FV Gt Q0,etc. +QB Qc Qf Qg Qi Qm Qr Qv Qx TR E V Fa FA FC Fp FS Ft FV Gt Q0,etc. -

    Copyright © 1995-2015 C.B. Barber

    +

    Copyright © 1995-2020 C.B. Barber


    »furthest-site qvoronoi synopsis

    @@ -111,7 +109,7 @@

    Use I/O redirection (e.g., qvoronoi Qu < data.txt), a pipe (e.g., rbox 10 | qvoronoi Qu), -or the 'TI' option (e.g., qvoronoi TI data.txt Qu). +or the 'TI' option (e.g., qvoronoi TI data.txt Qu).

    For example, this is a square containing four random points. Its furthest-site Voronoi diagram has on vertex and four unbounded, @@ -265,11 +263,15 @@

    Qu
    must be used.
    +
    QRn
    +
    randomly rotate the input with a random seed of n. If n=0, the + seed is the time. If n=-1, use time for the random seed, but do + not rotate the input.
    QVn
    select furthest-site Voronoi vertices for input site n
    Tv
    verify result
    -
    TI file
    +
    TI file
    input data from file. The filename may not use spaces or quotes.
    TO file
    output results to file. Use single quotes if the filename @@ -279,7 +281,7 @@
    PDk:1
    include upper and lower facets in the output. Set k to the last dimension (e.g., 'PD2:1' for 2-d inputs).
    -
    f
    +
    f
    facet dump. Print the data structure for each facet (i.e., furthest-site Voronoi vertex).
    @@ -365,8 +367,8 @@
    -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -376,7 +378,7 @@ • QhullPrecisionTrace -• Functions
    +• Functions (local)
    To: synopsis • input • outputs • controls • graphics @@ -390,7 +392,7 @@ Home Page

    Comments to: qhull@qhull.org -
    +
    Created: Sept. 25, 1995 --- Last modified: see top

    diff -Nru qhull-2015.2/html/qvoronoi.htm qhull-2020.2/html/qvoronoi.htm --- qhull-2015.2/html/qvoronoi.htm 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/html/qvoronoi.htm 2020-08-16 17:53:45.000000000 +0000 @@ -8,8 +8,8 @@ Up: -Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -19,7 +19,7 @@ • QhullPrecisionTrace -• Functions
    +• Functions (local)
    To: synopsis • input • outputs • controls • graphics @@ -28,10 +28,9 @@
    -

    [voronoi]qvoronoi -- Voronoi diagram

    +height="100">qvoronoi -- Voronoi diagram

    The Voronoi diagram is the nearest-neighbor map for a set of points. Each region contains those points that are nearer @@ -103,17 +102,15 @@

    Use option 'Qz' if the input is circular, cospherical, or nearly so. It improves precision by adding a point "at infinity," above the corresponding paraboloid. -

    See Qhull FAQ - Delaunay and +

    See Qhull FAQ (local) - Delaunay and Voronoi diagram questions.

    The 'qvonoroi' program is equivalent to -'qhull v Qbb' in 2-d to 3-d, and -'qhull v Qbb Qx' -in 4-d and higher. It disables the following Qhull +'qhull v Qbb'. It disables the following Qhull options: d n v Qbb QbB Qf Qg Qm -Qr QR Qv Qx Qz TR E V Fa FA FC FD FS Ft FV Gt Q0,etc. +Qr Qv Qx Qz TR E V Fa FA FC FD FS Ft FV Gt Q0,etc. -

    Copyright © 1995-2015 C.B. Barber

    +

    Copyright © 1995-2020 C.B. Barber

    Voronoi image by KOOK Architecture, Silvan Oesterle and Michael Knauss. @@ -121,26 +118,29 @@

    »qvoronoi synopsis

    -qvoronoi- compute the Voronoi diagram.
    +qvoronoi -- compute the Voronoi diagram.
         input (stdin): dimension, number of points, point coordinates
         comments start with a non-numeric character
     
    -options (qh-voron.htm):
    +options (qvoronoi.htm):
         Qu   - compute furthest-site Voronoi diagram
         Tv   - verify result: structure, convexity, and in-circle test
         .    - concise list of all options
         -    - one-line description of all options
    +    -?   - this message
    +    -V   - version
     
     output options (subset):
    -    s    - summary of results (default)
    -    p    - Voronoi vertices
    -    o    - OFF file format (dim, Voronoi vertices, and Voronoi regions)
    +    Fi   - separating hyperplanes for bounded regions, 'Fo' for unbounded
         FN   - count and Voronoi vertices for each Voronoi region
         Fv   - Voronoi diagram as Voronoi vertices between adjacent input sites
    -    Fi   - separating hyperplanes for bounded regions, 'Fo' for unbounded
         G    - Geomview output (2-d only)
    +    o    - OFF file format (dim, Voronoi vertices, and Voronoi regions)
    +    p    - Voronoi vertices
         QVn  - Voronoi vertices for input point n, -n if not
    -    TO file- output results to file, may be enclosed in single quotes
    +    s    - summary of results (default)
    +    TI file - input file, may be enclosed in single quotes
    +    TO file - output file, may be enclosed in single quotes
     
     examples:
     rbox c P0 D2 | qvoronoi s o         rbox c P0 D2 | qvoronoi Fi
    @@ -159,7 +159,7 @@
     
     
     

    Use I/O redirection (e.g., qvoronoi < data.txt), a pipe (e.g., rbox 10 | qvoronoi), -or the 'TI' option (e.g., qvoronoi TI data.txt). +or the 'TI' option (e.g., qvoronoi TI data.txt).

    For example, this is four cocircular points inside a square. Their Voronoi diagram has nine vertices and eight regions. Notice the Voronoi vertex @@ -276,9 +276,7 @@ next two numbers are adjacent input sites on the convex hull. The next dim numbers are the coefficients of the separating hyperplane. The - last number is its offset. Use 'Tv' to verify that the -hyperplanes are perpendicular bisectors. It will list relevant -statistics to stderr, + last number is its offset.

     
     
    Input sites
    @@ -339,6 +337,10 @@
    Qu
    compute the furthest-site Voronoi diagram.
    +
    QRn
    +
    randomly rotate the input with a random seed of n. If n=0, the + seed is the time. If n=-1, use time for the random seed, but do + not rotate the input.
    QVn
    select Voronoi vertices for input site n
    Qz
    @@ -347,7 +349,7 @@ (e.g., 'rbox c | qvoronoi Qz').
    Tv
    verify result
    -
    TI file
    +
    TI file
    input data from file. The filename may not use spaces or quotes.
    TO file
    output results to file. Use single quotes if the filename @@ -357,7 +359,7 @@
    PDk:1
    include upper and lower facets in the output. Set k to the last dimension (e.g., 'PD2:1' for 2-d inputs).
    -
    f
    +
    f
    facet dump. Print the data structure for each facet (i.e., Voronoi vertex).
    @@ -408,7 +410,7 @@

    Voronoi diagrams do not include facets that are coplanar with the convex hull of the input sites. A facet is coplanar if the last coefficient of its normal is -nearly zero (see qh_ZEROdelaunay). +nearly zero (see qh_ZEROdelaunay).

    Unbounded regions can be confusing. For example, 'rbox c | qvoronoi Qz o' produces the Voronoi regions for the vertices @@ -538,7 +540,7 @@

    »qvoronoi options

    -qvoronoi- compute the Voronoi diagram
    +qvoronoi -- compute the Voronoi diagram
         http://www.qhull.org
     
     input (stdin):
    @@ -550,26 +552,37 @@
         Qu   - compute furthest-site Voronoi diagram
     
     Qhull control options:
    -    QJn  - randomly joggle input in range [-n,n]
    +    Qa   - allow input with fewer or more points than coordinates
    +    QRn  - random rotation (n=seed, n=0 time, n=-1 time/no rotate)
         Qs   - search all points for the initial simplex
         Qz   - add point-at-infinity to Voronoi diagram
    +
    +Qhull extra options:
         QGn  - Voronoi vertices if visible from point n, -n if not
         QVn  - Voronoi vertices for input point n, -n if not
    +    Qw   - allow option warnings
    +    Q12  - allow wide facets and wide dupridge
    +    Q14  - merge pinched vertices that create a dupridge
     
    -Trace options:
    -    T4   - trace at level n, 4=all, 5=mem/gauss, -1= events
    -    Tc   - check frequently during execution
    +T options:
    +    TFn  - report summary when n or more facets created
    +    TI file - input file, may be enclosed in single quotes
    +    TO file - output file, may be enclosed in single quotes
         Ts   - statistics
         Tv   - verify result: structure, convexity, and in-circle test
         Tz   - send all output to stdout
    -    TFn  - report summary when n or more facets created
    -    TI file - input data from file, no spaces or single quotes
    -    TO file - output results to file, may be enclosed in single quotes
    +
    +Trace options:
    +    T4   - trace at level n, 4=all, 5=mem/gauss, -1= events
    +    Ta   - annotate output with message codes
    +    TAn  - stop qhull after adding n vertices
    +     TCn - stop qhull after building cone for point n
    +     TVn - stop qhull after adding point n, -n for before
    +    Tc   - check frequently during execution
    +    Tf   - flush each qh_fprintf for debugging segfaults
         TPn  - turn on tracing when point n added to hull
          TMn - turn on tracing at merge n
          TWn - trace merge facets when width > n
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)
    -     TCn - stop qhull after building cone for point n (see TVn)
     
     Precision options:
         Cn   - radius of centrum (roundoff added).  Merge facets if non-convex
    @@ -578,12 +591,12 @@
         Rn   - randomly perturb computations by a factor of [1-n,1+n]
         Wn   - min facet width for non-coincident point (before roundoff)
     
    -Output formats (may be combined; if none, produces a summary to stdout):
    -    s    - summary to stderr
    +Output formats (may be combined; if none, summary to stdout):
         p    - Voronoi vertices
    -    o    - OFF format (dim, Voronoi vertices, and Voronoi regions)
    -    i    - Delaunay regions (use 'Pp' to avoid warning)
    +    s    - summary to stderr
         f    - facet dump
    +    i    - Delaunay regions (use 'Pp' to avoid warning)
    +    o    - OFF format (dim, Voronoi vertices, and Voronoi regions)
     
     More formats:
         Fc   - count plus coincident points (by Voronoi vertex)
    @@ -606,24 +619,24 @@
         Fv   - Voronoi diagram as Voronoi vertices between adjacent input sites
         Fx   - extreme points of Delaunay triangulation (on convex hull)
     
    -Geomview options (2-d only)
    +Geomview output (2-d only)
         Ga   - all points as dots
          Gp  -  coplanar points and vertices as radii
          Gv  -  vertices as spheres
    +    Gc   - centrums
    +    GDn  - drop dimension n in 3-d and 4-d output
    +    Gh   - hyperplane intersections
         Gi   - inner planes only
          Gn  -  no planes
          Go  -  outer planes only
    -    Gc   - centrums
    -    Gh   - hyperplane intersections
         Gr   - ridges
    -    GDn  - drop dimension n in 3-d and 4-d output
     
     Print options:
         PAn  - keep n largest Voronoi vertices by 'area'
    -    Pdk:n - drop facet if normal[k] <= n (default 0.0)
    +    Pdk:n - drop facet if normal[k] <= n (default 0.0)
         PDk:n - drop facet if normal[k] >= n
    -    Pg   - print good Voronoi vertices (needs 'QGn' or 'QVn')
         PFn  - keep Voronoi vertices whose 'area' is at least n
    +    Pg   - print good Voronoi vertices (needs 'QGn' or 'QVn')
         PG   - print neighbors of good Voronoi vertices
         PMn  - keep n Voronoi vertices with most merges
         Po   - force output.  If error, output neighborhood of facet
    @@ -631,13 +644,15 @@
     
         .    - list of all options
         -    - one line descriptions of all options
    +    -?   - help with examples
    +    -V   - version
     

    -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -647,7 +662,7 @@ • QhullPrecisionTrace -• Functions
    +• Functions (local)
    To: synopsis • input • outputs • controls • graphics @@ -661,7 +676,7 @@ Home Page

    Comments to: qhull@qhull.org -
    +
    Created: Sept. 25, 1995 --- Last modified: see top

    diff -Nru qhull-2015.2/html/rbox.htm qhull-2020.2/html/rbox.htm --- qhull-2015.2/html/rbox.htm 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/html/rbox.htm 2020-08-16 17:53:45.000000000 +0000 @@ -7,8 +7,8 @@ -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -18,7 +18,7 @@ • QhullPrecisionTrace -• Functions
    +• Functions (local)
    To: synopsis • outputs • examples • notes • options @@ -248,8 +248,8 @@


    -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +

    Up: Home page for Qhull (local)
    +Up: Qhull manual: contents
    To: ProgramsOptionsOutput @@ -259,7 +259,7 @@ • QhullPrecisionTrace -• Functions
    +• Functions (local)
    To: synopsis • outputs • examples • notes • options diff -Nru qhull-2015.2/index.htm qhull-2020.2/index.htm --- qhull-2015.2/index.htm 2016-01-18 23:59:10.000000000 +0000 +++ qhull-2020.2/index.htm 2020-09-01 19:07:39.000000000 +0000 @@ -8,15 +8,19 @@ URL: http://www.qhull.org -
    To: -News -• Download -• CiteSeer +• News +• ScholarImages -• Manual -• FAQ +• GitHub +
    To: +Download +• Readme +• ManualProgramsOptions +• FAQ +• Code +• Functions


    @@ -43,9 +47,8 @@ and higher, alpha shapes, weighted Voronoi diagrams, Voronoi volumes, or constrained Delaunay triangulations,

    -

    Qhull 2015.2 introduces reentrant Qhull. It allows concurrent Qhull runs and simplifies the C++ interface to Qhull. -If you call Qhull from your program, you should use reentrant Qhull (libqhull_r) instead of qh_QHpointer (libqhull). -If you use Qhull 2003.1. please upgrade or apply poly.c-qh_gethash.patch. +

    If you call Qhull from your program, please use reentrant Qhull (libqhull_r or libqhullstatic_r). +If you use Qhull 2003.1, please upgrade or apply poly.c-qh_gethash.patch.

    @@ -56,18 +59,17 @@

    Introduction

    • Gregorius' talk on implementing Quickhull, + Lloyd's QuickHull3D in Java, + and Newbold's Waterman polyhedra +
    • Fukuda's introduction to convex hulls, Delaunay triangulations, Voronoi diagrams, and linear programming
    • -
    • Lambert's Java visualization of convex hull algorithms
    • LEDA Guide to geometry algorithms @@ -123,28 +125,30 @@
    • Manual for Qhull and rbox
      +
    • Qhull build systems
    • Send e-mail to qhull@qhull.org
    • Report bugs to qhull_bug@qhull.org @@ -152,40 +156,41 @@

      Related URLs

      FAQs and Newsgroups @@ -193,11 +198,9 @@

    • FAQ for computer graphics algorithms - (Exaflop.org: geometric structures) -
    • +
    • FAQ - for linear programming
    • + href="http://lpsolve.sourceforge.net/4.0/LinearProgrammingFAQ.htm">FAQ for linear programming
    • Newsgroup: comp.graphics.algorithms
    • Newsgroup: @@ -220,7 +223,7 @@ is VTK.

      For an article about Qhull, download from - ACM or ACM or CiteSeer:

      @@ -258,15 +261,19 @@

      Up: Past Software Projects of the Geometry Center
      URL: http://www.qhull.org -
      To: -News -• Download -• CiteSeer +• News +• ScholarImages +• GitHub +
      To: +Download +• ReadmeManual -• FAQProgramsOptions +• FAQ +• Code +• Functions


      diff -Nru qhull-2015.2/Makefile qhull-2020.2/Makefile --- qhull-2015.2/Makefile 2016-01-19 00:24:57.000000000 +0000 +++ qhull-2020.2/Makefile 2020-09-04 01:45:49.000000000 +0000 @@ -6,12 +6,14 @@ # For static builds, a simple alternative is src/libqhull_r/Makefile # # Variables -# DESTDIR destination directory for 'make install'. -# BINDIR directory where to copy executables -# DOCDIR directory where to copy html documentation -# INCDIR directory where to copy headers -# LIBDIR directory where to copy libraries -# MANDIR directory where to copy manual pages +# DESTDIR directory for staged installs (GNU Makefile standards) +# PREFIX install directory for 'make install' (default /usr/local) +# BINDIR sub-directory where to copy executables +# DOCDIR sub-directory where to copy html documentation +# INCDIR sub-directory where to copy headers +# LIBDIR sub-directory where to copy libraries +# MANDIR sub-directory where to copy manual pages +# PCDIR sub-directory where to copy pkg-config files # PRINTMAN command for printing manual pages # PRINTC command for printing C files # CC ANSI C or C++ compiler @@ -23,6 +25,8 @@ # CXX_OPTS2 options used to link .o files # CC_WARNINGS warnings for .c programs # CXX_WARNINGS warnings for .cpp programs +# SO file extension for libqhull_r (so-$VERSION or dll) +# SONAME_EXT SONAME extension for libqhull_r (so-$SOVERSION) # # LIBQHULLS_RBOX_OBJS .o files for linking # LIBQHULLR_HDRS non-reentrant .h files @@ -55,34 +59,64 @@ # user_eg3 An example of the C++ interface with libqhullcpp and libqhullstatic_r # # Targets -# make Build results using gcc or another compiler +# make Build Qhull using gcc or another compiler +# make all # make SO=dll For mingw on Windows, use SO=dll. It builds dlls -# make bin/qvoronoi Produce bin/qvoronoi (etc.) +# make M32=-m32 Build 32-bit Qhull on a 64-bit host (less memory) +# make M32=-m32 FPIC= Build 32-bit Qhull on 64-bit host without '-fpic' (maybe faster) +# make bin/qvoronoi Produce bin/qvoronoi (etc.) # make qhullx Produce qhull, qconvex etc. without using library # +# make benchmark Benchmark of qhull precision and performance +# make benchmark 2>&1 | tee eg/q_benchmark.x # make clean Remove object files # make cleanall Remove generated files, build/*.dlr/, buildqt/, and buildvc/ # make doc Print documentation # make help -# make install Copy qhull, rbox, qhull.1, rbox.1 to BINDIR, MANDIR +# make install Copy results and documentation to BINDIR, DOCDIR, INCDIR, LIBDIR, MANDIR, PCDOC +# For debug libraries, please append '_d' (e.g., libqhull_rd) +# make uninstall Delete Qhull files from BINDIR, DOCDIR, INCDIR, LIBDIR, MANDIR, PCDOC # make new Rebuild qhull and rbox from source # make printall Print all files # make qtest Quick test of rbox and qhull # make test Quick test of qhull programs # make testall Test programs for manual review with eg/q_test-ok.txt -# make testall >eg/q_test.x 2>&1 +# Windows -- make cleanall SO=dll all; cp lib/libqhull*.dll bin/ +# make testall >eg/q_test.x 2>&1 +# make testall 2>&1 | tee eg/q_test.x # Build the C++ qhulltest with Qt # +# $Id: //main/2019/qhull/Makefile#36 $ + # Do not replace tabs with spaces. Needed for build rules # Unix line endings (\n) -# $Id: //main/2015/qhull/Makefile#10 $ -DESTDIR = /usr/local -BINDIR = $(DESTDIR)/bin -INCDIR = $(DESTDIR)/include -LIBDIR = $(DESTDIR)/lib -DOCDIR = $(DESTDIR)/share/doc/qhull -MANDIR = $(DESTDIR)/share/man/man1 +PREFIX ?= /usr/local +BINDIR ?= bin +INCDIR ?= include +LIBDIR ?= lib +DOCDIR ?= share/doc/qhull +MANDIR ?= share/man/man1 +PCDIR ?= $(LIBDIR)/pkgconfig + +ABS_BINDIR = $(DESTDIR)$(PREFIX)/$(BINDIR) +ABS_INCDIR = $(DESTDIR)$(PREFIX)/$(INCDIR) +ABS_LIBDIR = $(DESTDIR)$(PREFIX)/$(LIBDIR) +ABS_DOCDIR = $(DESTDIR)$(PREFIX)/$(DOCDIR) +ABS_MANDIR = $(DESTDIR)$(PREFIX)/$(MANDIR) +ABS_PCDIR = $(DESTDIR)$(PREFIX)/$(PCDIR) + +# Define qhull_VERSION in CMakeLists.txt, Makefile, and qhull-warn.pri +# Truncated version in qhull-exports.def, qhull_p-exports.def, qhull_r-exports.def +# libqhull_r.so -- reentrant Qhull with qh_qhT passed as an argument. +qhull_VERSION=$(shell grep 'set.qhull_VERSION ' CMakeLists.txt | grep -o '[0-9.]\+' || echo 0unknown) +qhull_SOVERSION=$(shell grep 'set.qhull_SOVERSION ' CMakeLists.txt | grep -o '[0-9.]\+' || echo 0unknown) +SO = so.$(qhull_VERSION) +SONAME_EXT = so.$(qhull_SOVERSION) + +# On MinGW, +# make SO=dll +# Copy lib/libqhull_r.dll to bin/ # if you do not have enscript, try a2ps or just use lpr. The files are text. PRINTMAN = enscript -2rl @@ -91,29 +125,24 @@ # PRINTC = lpr #for Gnu's gcc compiler, -O3 for optimization, -g for debugging, -pg for profiling -# -fpic needed for gcc x86_64-linux-gnu. Not needed for mingw +# see below for gcc's CC_WARNINGS and CXX_WARNINGS +# Qhull uses less memory for 32-bit builds on 64-bit hosts +# Enable 32-bit builds with 'make M32=-m32' +# M32 = -m32 +# -fpic is required for linking to shared libraries +# -fpic may be slower for 32-bit builds on 64-bit hosts +# Disable -fpic with 'make FPIC=' +FPIC = -fpic CC = gcc -CC_OPTS1 = -O3 -ansi -Isrc -fpic $(CC_WARNINGS) +CC_OPTS1 = -O3 -ansi -Isrc/ $(CC_WARNINGS) $(M32) $(FPIC) CXX = g++ -# libqhullcpp must be before libqhull_r -CXX_OPTS1 = -O3 -Isrc/ $(CXX_WARNINGS) +# libqhullcpp must be listed before libqhull_r, otherwise libqhull_r pulls in userprintf_r.c +CXX_OPTS1 = -std=c++98 -O3 -Isrc/ $(CXX_WARNINGS) $(M32) $(FPIC) # for shared library link CC_OPTS3 = -# Define qhull_VERSION in CMakeLists.txt, Makefile, and qhull-warn.pri -# Truncated version in qhull-exports.def, qhull_p-exports.def, -# qhull.so -- static qh_qhT global data structure (qh_QHpointer=0) -# qhull_p.so -- allocated qh_qhT global data structure (qh_QHpointer=1). Required for libqhullcpp -# qhull_m.so -- future version of Qhull with qh_qhT passed as an argument. -qhull_SOVERSION=7 -SO = so.7.2.0 - -# On MinGW, -# make SO=dll -# Copy lib/libqhull6_p.dll and lib/libqhull.dll to bin/ - # for Sun's cc compiler, -fast or O2 for optimization, -g for debugging, -Xc for ANSI #CC = cc #CC_OPTS1 = -Xc -v -fast @@ -130,21 +159,46 @@ CC_OPTS2 = $(CC_OPTS1) CXX_OPTS2 = $(CXX_OPTS1) -# [gcc 4.4] Compiles without error (-Werror) -CC_WARNINGS = -Wall -Wcast-qual -Wextra -Wwrite-strings -Wshadow +# Warnings for gcc +# [gcc 8.1 from may'2018] Compiles without error (-Werror) +# gcc -pedantic not used due to -Woverlength-strings. Maximum string length is less than 2000 +# g++ -pedantic not used due to 'long long' warning. +CC_WARNINGS = -Wall -Wcast-qual -Wextra -Wwrite-strings -Wshadow -Wsign-conversion -Wconversion CXX_WARNINGS = -Wall -Wcast-qual -Wextra -Wwrite-strings -Wno-sign-conversion -Wshadow -Wconversion -# [mar'11] Compiles OK with all gcc warnings except for -Wno-sign-conversion and -Wconversion -# Qhull reports -Wunused-but-set-variable warnings but these are OK (see annotations) -# --help=warnings -# Compiles OK with all g++ warnings except Qt source errors on -Wshadow and -Wconversion -# -Waddress -Warray-bounds -Wchar-subscripts -Wclobbered -Wcomment -Wunused-variable -# -Wempty-body -Wformat -Wignored-qualifiers -Wimplicit-function-declaration -Wimplicit-int -# -Wmain -Wmissing-braces -Wmissing-field-initializers -Wmissing-parameter-type -Wnonnull -# -Wold-style-declaration -Woverride-init -Wparentheses -Wpointer-sign -Wreturn-type -# -Wsequence-point -Wsign-compare -Wsign-compare -Wstrict-aliasing -Wstrict-overflow=1 -# -Wswitch -Wtrigraphs -Wtype-limits -Wuninitialized -Wuninitialized -Wvolatile-register-var -# -Wunknown-pragmas -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value +# All warnings for gcc +# Ignore these gcc warnings (-f*, Fortran only, Go only, ObjC only, Qhull issues) +##Ignore warnings that occur in Qhull and appear to be OK +# NOT_QHULL_WARN="aggregate-return|float-equal|format-nonliteral|format-signedness|old-style-cast|padded|redundant-decls|long-long|strict-overflow|switch-enum|traditional|traditional-conversion|unsafe-loop-optimizations|unsuffixed-float-constants|useless-cast|zero-as-null-pointer-constant" +##Ignore warnings that require an operand. Include them specifically if needed. Pattern may be a substring +# NOT_EQUAL_WARN="format-overflow<|normalized=[^> ]*>|larger-than=|larger-than-|abi=|array-bounds=|aligned-new=|catch-value=|format=|format-overflow=|format-truncation=|implicit-fallthrough=|normalized=[^.]|placement-new=[^.]|shift-overflow=[^.]|stack-usage=|strict-aliasing=|strict-overflow=|stringop-overflow=[^.]|unused-const-variable=[^.]" +##Ignore warnings that are GCC specific and occur in Qhull +# NOT_GCC_WARN="abi-tag|effc[+][+]|missing-format-attribute|missing-noreturn|namespaces|suggest-attribute|suggest-attribute=(format|malloc|noreturn|pure)|suggest-final-methods|suggest-final-types|suggest-override|templates" +## -Wstringop-truncation -- known issue Bug c++/85700 +##Ignore the above warnings and warnings specific to Fortran, ObjC, etc +# NOT_CC_CXX_WARN="$NOT_GCC_WARN|$NOT_QHULL_WARN|aliasing|align-commons|ampersand|argument-mismatch|array-temporaries|assign-intercept|c-binding-type|character-truncation|compare-reals|conversion-extra|do-subscript|function-elimination|implicit-interface|implicit-procedure|integer-division|intrinsic-shadow|intrinsics-std|line-truncation|property-assign-default|protocol|real-q-constant|realloc-lhs|realloc-lhs-all|selector|shadow-ivar|strict-selector-match|surprising|tabs|target-lifetime|undeclared-selector|undefined-do-loop|underflow|unused-dummy-argument|use-without-only|zerotrip" +##Ignore these warnings and warnings for CC but not CXX and vice versa +# NOT_CC_WARNINGS="$NOT_CC_CXX_WARN|c[+][+][0-9xz]*-compat|abi-tag|argument-mismatch|catch-value|class-memaccess|conditionally-supported|conversion-null|ctor-dtor-privacy|delete-incomplete|delete-non-virtual-dtor|effc++|extra-semi|inherited-variadic-ctor|invalid-offsetof|literal-suffix|multiple-inheritance|namespaces|noexcept|noexcept-type|non-template-friend|non-virtual-dtor|overloaded-virtual|placement-new|pmf-conversions|register|reorder|sign-promo|sized-deallocation|strict-null-sentinel|subobject-linkage|suggest-override|synth|templates|terminate|useless-cast|virtual-inheritance|virtual-move-assign|zero-as-null-pointer-constant" +# NOT_CXX_WARNINGS="$NOT_CC_CXX_WARN|c[+][+]-compat|bad-function-cast|c90-c99-compat|c99-c11-compat|declaration-after-statement|designated-init|discarded-array-qualifiers|discarded-qualifiers|duplicate-decl-specifier|implicit|implicit-function-declaration|implicit-int|incompatible-pointer-types|int-conversion|jump-misses-init|missing-parameter-type|missing-prototypes|nested-externs|old-style-declaration|old-style-definition|override-init|override-init-side-effects|pointer-sign|pointer-to-int-cast|strict-prototypes" +# NOT_CXX_WARNINGS="$NOT_CXX_WARNINGS|sign-conversion" +##List of gcc warnings for CC_WARNINGS, excluding NOT_CC_WARNINGS and NOT_EQUAL_WARN, to bin/x.cc +# (echo -n -Wformat-overflow; echo " "; gcc --help=warnings) | sed -nr 's/^ *(-W[^ ]*) .*/\1/p' | sort -u | grep -vE "[-]W\$|-W(all|extra|$NOT_CC_WARNINGS)\$|$NOT_EQUAL_WARN" >bin/x.cc +##List gcc warnings for CXX_WARNINGS, excluding NOT_CXX_WARNINGS and NOT_EQUAL_WARN, bin/x.ccx +## -Wno-sign-conversion due to 'int' vs. 'size_t' for indexing, boolT, countT, and size_t returns +##..-Wno-old-style-cast due to warnings for libqhull_r macros +## Test CXX_WARNINGS with -Wsign-conversion and -Wold-style-cast +# (echo -n -Wno-old-style-cast -Wno-sign-conversion -Wformat-overflow; echo " "; gcc --help=warnings) | sed -nr 's/^ *(-W[^ ]*) .*/\1/p' | sort -u | grep -vE "[-]W\$|-W(all|extra|sign-conversion|$NOT_CXX_WARNINGS)\$|$NOT_EQUAL_WARN" >bin/x.cxx +##List of mismatched gcc warnings for NOT_CC_CXX_WARN, NOT_CC_WARNINGS, and NOT_CXX_WARNINGS to bin/x.1 +# make cleanall SO=dll qhullx 2>&1 | grep "not for C" | sort -u > bin/x.1 +##Test gcc warnings on Windows with mingw gcc to bin/x.2 +# make cleanall SO=dll qhullx >bin/x.2 2>&1 # libqhull and libqhull_r +# make cleanall SO=dll bin/user_eg3 >bin/x.2 2>&1 # libqhullcpp +# make cleanall SO=dll all >bin/x.2 2>&1 +##Summary list of warnings to bin/x.1 for review +# grep -vE 'Tools/mingw|mingw-w64|short unsigned int:9|string length .([0-9][0-9][0-9]|1[0-7][0-9][0-9]). is greater|from src/' bin/x.2 | grep -E -A6 'warning:|: error:' >bin/x.1 +## [gcc 8.1 from may'2018] Compiles OK with these CC_WARNINGS and CXX_WARNINGS +# CC_WARNINGS = -Wformat-overflow -Wabi -Waddress -Waggressive-loop-optimizations -Walloc-zero -Walloca -Warray-bounds -Wattribute-alias -Wattributes -Wbad-function-cast -Wbool-compare -Wbool-operation -Wbuiltin-declaration-mismatch -Wbuiltin-macro-redefined -Wc90-c99-compat -Wc99-c11-compat -Wcast-align -Wcast-align=strict -Wcast-function-type -Wcast-qual -Wchar-subscripts -Wchkp -Wclobbered -Wcomment -Wcomments -Wconversion -Wcoverage-mismatch -Wcpp -Wdangling-else -Wdate-time -Wdeclaration-after-statement -Wdeprecated -Wdeprecated-declarations -Wdesignated-init -Wdisabled-optimization -Wdiscarded-array-qualifiers -Wdiscarded-qualifiers -Wdiv-by-zero -Wdouble-promotion -Wduplicate-decl-specifier -Wduplicated-branches -Wduplicated-cond -Wempty-body -Wendif-labels -Wenum-compare -Werror-implicit-function-declaration -Werror=implicit-function-declaration -Wexpansion-to-defined -Wfloat-conversion -Wformat -Wformat-contains-nul -Wformat-extra-args -Wformat-security -Wformat-truncation -Wformat-y2k -Wformat-zero-length -Wframe-address -Wfree-nonheap-object -Whsa -Wif-not-aligned -Wignored-attributes -Wignored-qualifiers -Wimplicit -Wimplicit-fallthrough -Wimplicit-function-declaration -Wimplicit-int -Wincompatible-pointer-types -Winit-self -Winline -Wint-conversion -Wint-in-bool-context -Wint-to-pointer-cast -Winvalid-memory-model -Winvalid-pch -Wjump-misses-init -Wlogical-not-parentheses -Wlogical-op -Wlto-type-mismatch -Wmain -Wmaybe-uninitialized -Wmemset-elt-size -Wmemset-transposed-args -Wmisleading-indentation -Wmissing-attributes -Wmissing-braces -Wmissing-declarations -Wmissing-field-initializers -Wmissing-include-dirs -Wmissing-parameter-type -Wmissing-prototypes -Wmultichar -Wmultistatement-macros -Wnarrowing -Wnested-externs -Wnonnull -Wnonnull-compare -Wnormalized -Wnull-dereference -Wodr -Wold-style-declaration -Wold-style-definition -Wopenmp-simd -Woverflow -Woverlength-strings -Woverride-init -Woverride-init-side-effects -Wpacked -Wpacked-bitfield-compat -Wpacked-not-aligned -Wparentheses -Wpedantic -Wpedantic-ms-format -Wpointer-arith -Wpointer-compare -Wpointer-sign -Wpointer-to-int-cast -Wpragmas -Wpsabi -Wrestrict -Wreturn-local-addr -Wreturn-type -Wscalar-storage-order -Wsequence-point -Wshadow -Wshadow-compatible-local -Wshadow-local -Wshadow=compatible-local -Wshadow=global -Wshadow=local -Wshift-count-negative -Wshift-count-overflow -Wshift-negative-value -Wshift-overflow -Wsign-compare -Wsign-conversion -Wsizeof-array-argument -Wsizeof-pointer-div -Wsizeof-pointer-memaccess -Wstack-protector -Wstrict-aliasing -Wstrict-prototypes -Wstringop-overflow -Wstringop-truncation -Wsuggest-attribute=cold -Wsuggest-attribute=const -Wswitch -Wswitch-bool -Wswitch-default -Wswitch-unreachable -Wsync-nand -Wsystem-headers -Wtautological-compare -Wtrampolines -Wtrigraphs -Wtype-limits -Wundef -Wuninitialized -Wunknown-pragmas -Wunreachable-code -Wunused -Wunused-but-set-parameter -Wunused-but-set-variable -Wunused-const-variable -Wunused-function -Wunused-label -Wunused-local-typedefs -Wunused-macros -Wunused-parameter -Wunused-result -Wunused-value -Wunused-variable -Wvarargs -Wvariadic-macros -Wvector-operation-performance -Wvla -Wvolatile-register-var -Wwrite-strings +# CXX_WARNINGS = -Wno-old-style-cast -Wno-sign-conversion -Wformat-overflow -Wabi -Waddress -Waggressive-loop-optimizations -Walloc-zero -Walloca -Warray-bounds -Wattribute-alias -Wattributes -Wbool-compare -Wbool-operation -Wbuiltin-declaration-mismatch -Wbuiltin-macro-redefined -Wc++0x-compat -Wc++11-compat -Wc++14-compat -Wc++17-compat -Wc++1z-compat -Wcast-align -Wcast-align=strict -Wcast-function-type -Wcast-qual -Wcatch-value -Wchar-subscripts -Wchkp -Wclass-memaccess -Wclobbered -Wcomment -Wcomments -Wconditionally-supported -Wconversion -Wconversion-null -Wcoverage-mismatch -Wcpp -Wctor-dtor-privacy -Wdangling-else -Wdate-time -Wdelete-incomplete -Wdelete-non-virtual-dtor -Wdeprecated -Wdeprecated-declarations -Wdisabled-optimization -Wdiv-by-zero -Wdouble-promotion -Wduplicated-branches -Wduplicated-cond -Wempty-body -Wendif-labels -Wenum-compare -Werror-implicit-function-declaration -Werror=implicit-function-declaration -Wexpansion-to-defined -Wextra-semi -Wfloat-conversion -Wformat -Wformat-contains-nul -Wformat-extra-args -Wformat-security -Wformat-truncation -Wformat-y2k -Wformat-zero-length -Wframe-address -Wfree-nonheap-object -Whsa -Wif-not-aligned -Wignored-attributes -Wignored-qualifiers -Wimplicit-fallthrough -Winherited-variadic-ctor -Winit-self -Winline -Wint-in-bool-context -Wint-to-pointer-cast -Winvalid-memory-model -Winvalid-offsetof -Winvalid-pch -Wliteral-suffix -Wlogical-not-parentheses -Wlogical-op -Wlto-type-mismatch -Wmain -Wmaybe-uninitialized -Wmemset-elt-size -Wmemset-transposed-args -Wmisleading-indentation -Wmissing-attributes -Wmissing-braces -Wmissing-declarations -Wmissing-field-initializers -Wmissing-include-dirs -Wmultichar -Wmultiple-inheritance -Wmultistatement-macros -Wnarrowing -Wnoexcept -Wnoexcept-type -Wnon-template-friend -Wnon-virtual-dtor -Wnonnull -Wnonnull-compare -Wnormalized -Wnull-dereference -Wodr -Wopenmp-simd -Woverflow -Woverlength-strings -Woverloaded-virtual -Wpacked -Wpacked-bitfield-compat -Wpacked-not-aligned -Wparentheses -Wpedantic -Wpedantic-ms-format -Wplacement-new -Wpmf-conversions -Wpointer-arith -Wpointer-compare -Wpragmas -Wpsabi -Wregister -Wreorder -Wrestrict -Wreturn-local-addr -Wreturn-type -Wscalar-storage-order -Wsequence-point -Wshadow -Wshadow-compatible-local -Wshadow-local -Wshadow=compatible-local -Wshadow=global -Wshadow=local -Wshift-count-negative -Wshift-count-overflow -Wshift-negative-value -Wshift-overflow -Wsign-compare -Wsign-promo -Wsized-deallocation -Wsizeof-array-argument -Wsizeof-pointer-div -Wsizeof-pointer-memaccess -Wstack-protector -Wstrict-aliasing -Wstrict-null-sentinel -Wstringop-overflow -Wstringop-truncation -Wsubobject-linkage -Wsuggest-attribute=cold -Wsuggest-attribute=const -Wswitch -Wswitch-bool -Wswitch-default -Wswitch-unreachable -Wsync-nand -Wsynth -Wsystem-headers -Wtautological-compare -Wterminate -Wtrampolines -Wtrigraphs -Wtype-limits -Wundef -Wuninitialized -Wunknown-pragmas -Wunreachable-code -Wunused -Wunused-but-set-parameter -Wunused-but-set-variable -Wunused-const-variable -Wunused-function -Wunused-label -Wunused-local-typedefs -Wunused-macros -Wunused-parameter -Wunused-result -Wunused-value -Wunused-variable -Wvarargs -Wvariadic-macros -Wvector-operation-performance -Wvirtual-inheritance -Wvirtual-move-assign -Wvla -Wvolatile-register-var -Wwrite-strings # Default targets for make @@ -152,18 +206,30 @@ bin/testqset_r qtest bin/user_eg2 bin/user_eg3 bin/user_eg qconvex-prompt help: - head -n 75 Makefile + head -n 88 Makefile bin-lib: - mkdir -p bin lib + mkdir -p bin + mkdir -p lib + @echo "if user_eg or the shared library build fails, other targets remain OK" # Remove intermediate files for all builds +# Deletes eg/*.x, *.x, and *.tmp clean: rm -f src/*/*.o src/qhulltest/RoadTest.h.cpp build/*/*/*.o build/*/*.o rm -f src/*/*.obj build/*/*/*.obj build/*/*/*/*/*.obj build/*/*.obj - rm -f bin/*.idb lib/*.idb build-cmake/*/*.idb eg/*.x *.x *.tmp + rm -f src/*/gmon.out bin/*.idb lib/*.idb build-cmake/*/*.idb + rm -f eg/*.x *.x *.tmp rm -f build/*/*/*.a build/*/*/*.rsp build/moc/*.moc rm -f build-cmake/*/*.obj build-cmake/*/*/*.obj build-cmake/*/*.ilk + @echo Remove linked C files from libqhull/ and libqhull_r/ + rm -f src/libqhull/rbox.c src/libqhull/qconvex.c src/libqhull/qdelaun.c + rm -f src/libqhull/qhalf.c src/libqhull/qvoronoi.c src/libqhull/testqset.c + rm -f src/libqhull/unix.c src/libqhull/user_eg.c src/libqhull/user_eg2.c + rm -f src/libqhull_r/rbox_r.c src/libqhull_r/qconvex_r.c src/libqhull_r/qdelaun_r.c + rm -f src/libqhull_r/qhalf_r.c src/libqhull_r/qvoronoi_r.c src/libqhull_r/testqset_r.c + rm -f src/libqhull_r/unix_r.c src/libqhull_r/user_eg_r.c src/libqhull_r/user_eg2_r.c + rm -f src/libqhull_r/user_eg3_r.c # Remove intermediate files and targets for all builds # DevStudio prevents build/qhull.ncb deletes @@ -173,55 +239,74 @@ rm -rf buildvc/ rm -rf buildqt/ rm -rf build-qhull-all*/ - rm -f eg/eg.* eg/t*.tmp + rm -rf src/qhull_qh/ + rm -rf gmon.out bin/gmon.out rm -f bin/qconvex bin/qdelaunay bin/qhalf bin/qvoronoi bin/qhull rm -f bin/rbox core bin/core bin/user_eg bin/user_eg2 bin/user_eg3 rm -f bin/testqset bin/testqset_r bin/qhulltest - rm -f lib/libqhull* lib/qhull*.lib lib/qhull*.exp lib/qhull*.dll rm -f bin/libqhull* bin/qhull*.dll bin/*.exe bin/*.pdb lib/*.pdb rm -f build/*.dll build/*.exe build/*.a build/*.exp rm -f build/*.lib build/*.pdb build/*.idb build/qhull-no-qt.sln rm -f build-cmake/*/*.dll build-cmake/*/*.exe build-cmake/*/*.exp rm -f build-cmake/*/*.lib build-cmake/*/*.pdb - rm -f src/libqhull/qconvex.c src/libqhull/qdelaun.c src/libqhull/qhalf.c - rm -f src/libqhull/qvoronoi.c src/libqhull/rbox.c src/libqhull/testqset.c - rm -f src/libqhull/unix.c src/libqhull/user_eg.c src/libqhull/user_eg2.c - rm -f src/libqhull/*.exe src/libqhull/libqhullstatic* src/libqhull/core - rm -f src/libqhull/qconvex src/libqhull/qdelaunay src/libqhull/qhalf src/libqhull/qvoronoi src/libqhull/qhull - rm -f src/libqhull/rbox src/libqhull/core src/libqhull/user_eg src/libqhull/user_eg2 src/libqhull/user_eg3 - rm -f src/libqhull_r/unix_r.c src/libqhull_r/user_eg_r.c src/libqhull_r/user_eg2_r.c - rm -f src/libqhull_r/qconvex_r.c src/libqhull_r/qdelaun_r.c src/libqhull_r/qhalf_r.c - rm -f src/libqhull_r/qvoronoi_r.c src/libqhull_r/rbox_r.c src/libqhull_r/testqset_r.c - rm -f src/libqhull_r/unix_r.c src/libqhull_r/user_eg_r.c src/libqhull_r/user_eg2_r.c - rm -f src/libqhull_r/*.exe src/libqhull_r/libqhullstatic* - rm -f src/libqhull_r/qconvex src/libqhull_r/qdelaunay src/libqhull_r/qhalf src/libqhull_r/qvoronoi src/libqhull_r/qhull - rm -f src/libqhull_r/rbox src/libqhull_r/core src/libqhull_r/user_eg src/libqhull_r/user_eg2 src/libqhull_r/user_eg3 + rm -f eg/eg.* eg/t*.tmp + rm -f lib/libqhull* lib/qhull*.lib lib/qhull*.exp lib/qhull*.dll + rm -f src/libqhull*/*.exe src/libqhull*/libqhullstatic*.a src/libqhull*/core + rm -f src/libqhull*/qconvex src/libqhull*/qdelaunay src/libqhull*/qhalf + rm -f src/libqhull*/qvoronoi src/libqhull*/qhull src/libqhull*/rbox + rm -f src/libqhull*/user_eg src/libqhull*/user_eg2 src/libqhull*/user_eg3 doc: $(PRINTMAN) $(TXTFILES) $(DOCFILES) -install: - mkdir -p $(BINDIR) - mkdir -p $(DOCDIR) - mkdir -p $(INCDIR)/libqhull - mkdir -p $(INCDIR)/libqhull_r - mkdir -p $(INCDIR)/libqhullcpp - mkdir -p $(LIBDIR) - mkdir -p $(MANDIR) - cp bin/qconvex $(BINDIR) - cp bin/qdelaunay $(BINDIR) - cp bin/qhalf $(BINDIR) - cp bin/qhull $(BINDIR) - cp bin/qvoronoi $(BINDIR) - cp bin/rbox $(BINDIR) - cp html/qhull.man $(MANDIR)/qhull.1 - cp html/rbox.man $(MANDIR)/rbox.1 - cp html/* $(DOCDIR) - cp -P lib/* $(LIBDIR) - cp src/libqhull/DEPRECATED.txt src/libqhull/*.h src/libqhull/*.htm $(INCDIR)/libqhull - cp src/libqhull_r/*.h src/libqhull_r/*.htm $(INCDIR)/libqhull_r - cp src/libqhullcpp/*.h $(INCDIR)/libqhullcpp - cp src/qhulltest/*.h $(INCDIR)/libqhullcpp +install: bin/qconvex bin/qdelaunay bin/qhalf bin/qhull bin/qvoronoi bin/rbox + mkdir -p $(ABS_BINDIR) + mkdir -p $(ABS_DOCDIR) + mkdir -p $(ABS_DOCDIR)/src + mkdir -p $(ABS_INCDIR)/libqhull + mkdir -p $(ABS_INCDIR)/libqhull_r + mkdir -p $(ABS_INCDIR)/libqhullcpp + mkdir -p $(ABS_LIBDIR) + mkdir -p $(ABS_MANDIR) + mkdir -p $(ABS_PCDIR) + cp bin/qconvex $(ABS_BINDIR) + cp bin/qdelaunay $(ABS_BINDIR) + cp bin/qhalf $(ABS_BINDIR) + cp bin/qhull $(ABS_BINDIR) + cp bin/qvoronoi $(ABS_BINDIR) + cp bin/rbox $(ABS_BINDIR) + cp -p html/qhull.man $(ABS_MANDIR)/qhull.1 + cp -p html/rbox.man $(ABS_MANDIR)/rbox.1 + cp -p README.txt REGISTER.txt Announce.txt COPYING.txt index.htm $(ABS_DOCDIR)/ + cp -pr html $(ABS_DOCDIR)/ + cp -p src/Changes.txt $(ABS_DOCDIR)/src/ + cp -P lib/* $(ABS_LIBDIR) + cp src/libqhull/DEPRECATED.txt src/libqhull/*.h $(ABS_INCDIR)/libqhull + cp src/libqhull_r/*.h $(ABS_INCDIR)/libqhull_r + cp src/libqhullcpp/*.h $(ABS_INCDIR)/libqhullcpp + cp src/qhulltest/*.h $(ABS_INCDIR)/libqhullcpp + for lib in qhullstatic qhullstatic_r qhull_r qhullcpp; \ + do sed \ + -e 's#@qhull_VERSION@#$(qhull_VERSION)#' \ + -e 's#@CMAKE_INSTALL_PREFIX@#$(PREFIX)#' \ + -e 's#@LIB_INSTALL_DIR@#$(LIBDIR)#' \ + -e 's#@INCLUDE_INSTALL_DIR@#$(INCDIR)#' \ + -e 's#@LIBRARY_NAME@#'$$lib'#' \ + -e 's#@LIBRARY_DESCRIPTION@#'$$lib'#' \ + build/qhull.pc.in > $(ABS_PCDIR)/$$lib.pc; \ + done + +uninstall: + -(cd $(ABS_BINDIR) && rm -f qconvex qdelaunay qhalf qhull qvoronoi rbox) + -(cd $(ABS_BINDIR) && rm -f qconvex.exe qdelaunay.exe qhalf.exe qhull.exe qvoronoi.exe rbox.exe libqhull*.dll) + -(cd $(ABS_MANDIR) && rm -f qhull.1 rbox.1) + -(cd $(ABS_DOCDIR) && rm -f README.txt REGISTER.txt Announce.txt COPYING.txt index.htm src/Changes.txt) + -(cd $(ABS_DOCDIR) && rm -rf html) + -(cd $(ABS_LIBDIR) && rm -f libqhull*.a libqhull*.dll libqhull*.so* qhull*.lib qhull*.exp) + -(cd $(ABS_INCDIR) && rm -rf libqhull_r libqhull libqhullcpp) + -(cd $(ABS_PCDIR) && rm -f qhullstatic.pc qhullstatic_r.pc qhull_r.pc qhullcpp.pc) + -rmdir $(ABS_DOCDIR)/src + -rmdir $(ABS_DOCDIR) new: cleanall all @@ -240,6 +325,7 @@ printf: $(PRINTC) $(FILES) +# for Windows, do not depend on bin/qhull,etc. qtest: @echo ============================================ @echo == make qtest ============================== @@ -262,9 +348,10 @@ @echo ============================================ -bin/rbox D4 | bin/qhull Tv +# for Windows, do not depend on bin/qhull,etc. test: qtest @echo ============================================ - @echo == make test =============================== + @echo == make test, after running qtest ========== @echo ============================================ @echo @echo ============================== @@ -292,9 +379,11 @@ @echo ============================== -bin/rbox 10 | bin/qvoronoi Tv @echo - @echo ============================== - @echo ========= user_eg ============ - @echo ============================== + @echo ================================= + @echo ========= user_eg =============== + @echo == if fails under Windows ======= + @echo == cp lib/libqhull_r.dll bin/ == + @echo ================================= -bin/user_eg @echo @echo ============================== @@ -305,22 +394,36 @@ @echo ============================== @echo ========= user_eg3 =========== @echo ============================== + -bin/user_eg3 -bin/user_eg3 rbox "10 D2" "2 D2" qhull "s p" facets -# make testall >q_test.txt 2>&1 +# make testall >eg/q_test.x 2>&1 testall: test + @echo ================================================ + @echo == make testall, after running qtest and test == + @echo ================================================ + @echo -n "== " + @date + @echo + eg/q_eg + eg/q_egtest + bash -c eg/q_test + -eg/q_benchmark test 1 1 1 1 + +# make benchmark >eg/q_benchmark.x 2>&1 +benchmark: @echo ============================================ - @echo == make testall ============================ + @echo == make benchmark ========================== + @echo == eg/qtest.sh ========================== @echo ============================================ @echo -n "== " @date @echo - -eg/q_eg - -eg/q_egtest - -eg/q_test + -eg/q_benchmark -10 -10 -10 -10 -qconvex-prompt: - bin/qconvex +# last command for 'make all' +qconvex-prompt: bin/qconvex bin/rbox + bin/qconvex -? @echo @echo ============================================ @echo == Run the qconvex smoketest @@ -328,7 +431,7 @@ bin/rbox D4 | bin/qconvex Tv @echo @echo ============================================ - @echo == To enable user_eg and user_eg2 + @echo == To enable user_eg @echo == @echo == Windows -- make SO=dll @echo '== cp -p lib/libqhull*.dll bin' @@ -344,12 +447,14 @@ @echo @echo ============================================ @echo == To run qhull tests for manual review with eg/q_test-ok.txt - @echo '== make testall >q_test.txt 2>&1' + @echo '== make testall >eg/q_test.x 2>&1' + @echo '== make testall 2>&1 | tee eg/q_test.x' @echo ============================================ @echo @echo ============================================ - @echo == For all make targets + @echo == To install qhull or show help @echo '== make help' + @echo '== make install' @echo ============================================ @echo @@ -369,8 +474,8 @@ TCPP= src/qhulltest LIBQHULL_HDRS = $(L)/user.h $(L)/libqhull.h $(L)/qhull_a.h $(L)/geom.h \ - $(L)/io.h $(L)/mem.h $(L)/merge.h $(L)/poly.h $(L)/random.h \ - $(L)/qset.h $(L)/stat.h + $(L)/io.h $(L)/mem.h $(L)/merge.h $(L)/poly.h $(L)/random.h \ + $(L)/qset.h $(L)/stat.h LIBQHULLR_HDRS = $(LR)/user_r.h $(LR)/libqhull_r.h $(LR)/qhull_ra.h $(LR)/geom_r.h \ $(LR)/io_r.h $(LR)/mem_r.h $(LR)/merge_r.h $(LR)/poly_r.h $(LR)/random_r.h \ @@ -380,11 +485,11 @@ # small files at end. Better locality. LIBQHULLS_OBJS= $(LS)/global.o $(LS)/stat.o $(LS)/geom2.o $(LS)/poly2.o \ - $(LS)/merge.o $(LS)/libqhull.o $(LS)/geom.o $(LS)/poly.o \ - $(LS)/qset.o $(LS)/mem.o $(LS)/random.o + $(LS)/merge.o $(LS)/libqhull.o $(LS)/geom.o $(LS)/poly.o \ + $(LS)/qset.o $(LS)/mem.o $(LS)/random.o LIBQHULLS_USER_OBJS = $(LIBQHULLS_OBJS) $(LS)/usermem.o $(LS)/userprintf.o \ - $(LS)/io.o $(LS)/user.o + $(LS)/io.o $(LS)/user.o LIBQHULLS_RBOX_OBJS = $(LIBQHULLS_USER_OBJS) $(LS)/rboxlib.o $(LS)/userprintf_rbox.o @@ -403,15 +508,15 @@ $(LCPP)/QhullFacetList.h $(LCPP)/QhullFacetSet.h $(LCPP)/QhullIterator.h \ $(LCPP)/QhullLinkedList.h $(LCPP)/QhullPoint.h $(LCPP)/QhullPoints.h \ $(LCPP)/QhullPointSet.h $(LCPP)/QhullQh.h $(LCPP)/QhullRidge.h \ - $(LCPP)/QhullSet.h $(LCPP)/QhullSets.h $(LCPP)/QhullStat.h \ - $(LCPP)/QhullVertex.h $(LCPP)/RboxPoints.h + $(LCPP)/QhullSet.h $(LCPP)/QhullSets.h $(LCPP)/QhullStat.h $(LCPP)/QhullUser.h \ + $(LCPP)/QhullVertex.h $(LCPP)/QhullVertexSet.h $(LCPP)/RboxPoints.h LIBQHULLCPP_OBJS = $(LCPP)/RoadError.o $(LCPP)/RoadLogEvent.o $(LCPP)/Coordinates.o \ $(LCPP)/PointCoordinates.o $(LCPP)/Qhull.o $(LCPP)/QhullFacet.o \ $(LCPP)/QhullFacetList.o $(LCPP)/QhullFacetSet.o \ - $(LCPP)/QhullHyperplane.o $(LCPP)/QhullPoint.o \ - $(LCPP)/QhullPoints.o $(LCPP)/QhullPointSet.o $(LCPP)/QhullQh.o \ - $(LCPP)/QhullRidge.o $(LCPP)/QhullSet.o $(LCPP)/QhullStat.o \ + $(LCPP)/QhullHyperplane.o $(LCPP)/QhullPoint.o $(LCPP)/QhullPoints.o \ + $(LCPP)/QhullPointSet.o $(LCPP)/QhullQh.o $(LCPP)/QhullRidge.o \ + $(LCPP)/QhullSet.o $(LCPP)/QhullStat.o $(LCPP)/QhullUser.o \ $(LCPP)/QhullVertex.o $(LCPP)/QhullVertexSet.o $(LCPP)/RboxPoints.o # CFILES for non-reentrant Qhull, ordered alphabetically after libqhull.c @@ -432,7 +537,7 @@ $(LCPP)/QhullFacetList.cpp $(LCPP)/QhullFacetSet.cpp \ $(LCPP)/QhullHyperplane.cpp $(LCPP)/QhullPoint.cpp \ $(LCPP)/QhullPoints.cpp $(LCPP)/QhullPointSet.cpp $(LCPP)/QhullQh.cpp \ - $(LCPP)/QhullRidge.cpp $(LCPP)/QhullSet.cpp $(LCPP)/QhullStat.cpp \ + $(LCPP)/QhullRidge.cpp $(LCPP)/QhullSet.cpp $(LCPP)/QhullStat.cpp $(LCPP)/QhullUser.cpp \ $(LCPP)/QhullVertex.cpp $(LCPP)/QhullVertexSet.cpp $(LCPP)/RboxPoints.cpp \ $(LCPP)/RoadError.cpp $(LCPP)/RoadLogEvent.cpp src/user_eg3/user_eg3_r.cpp @@ -516,6 +621,7 @@ $(LCPP)/QhullStat.o: $(LIBQHULLCPP_HDRS) $(LIBQHULLR_HDRS) $(LCPP)/QhullVertex.o: $(LIBQHULLCPP_HDRS) $(LIBQHULLR_HDRS) $(LCPP)/QhullVertexSet.o: $(LIBQHULLCPP_HDRS) $(LIBQHULLR_HDRS) +$(LCPP)/QhullUser.o: $(LIBQHULLCPP_HDRS) $(LIBQHULLR_HDRS) $(LCPP)/RboxPoints.o: $(LIBQHULLCPP_HDRS) $(LIBQHULLR_HDRS) .c.o: @@ -527,17 +633,20 @@ # qhullx -- Compile qhull without using a qhull library. Must be after LIBQHULLS_RBOX_OBJS # For qconvex, rbox, and other programs, qhullx produces the same results as libqhull/Makefile # For qhull, 'make qhullx' produces the same results as libqhull_r/Makefile -qhullx: src/qconvex/qconvex.o src/qdelaunay/qdelaun.o src/qhalf/qhalf.o \ - src/qvoronoi/qvoronoi.o src/rbox/rbox.o \ - src/qhull/unix_r.o $(LIBQHULLS_RBOX_OBJS) $(LIBQHULLSR_USER_OBJS) +qhullx: src/qconvex/qconvex.o src/qdelaunay/qdelaun.o src/qhalf/qhalf.o src/qvoronoi/qvoronoi.o\ + src/qhull/unix_r.o src/rbox/rbox.o src/testqset/testqset.o src/testqset_r/testqset_r.o\ + $(LIBQHULLS_RBOX_OBJS) $(LIBQHULLSR_USER_OBJS) $(LS)/mem.o $(LS)/qset.o $(LS)/usermem.o + mkdir -p bin/ $(CC) -o bin/qconvex $(CC_OPTS2) -lm $(LIBQHULLS_USER_OBJS) src/qconvex/qconvex.o $(CC) -o bin/qdelaunay $(CC_OPTS2) -lm $(LIBQHULLS_USER_OBJS) src/qdelaunay/qdelaun.o $(CC) -o bin/qhalf $(CC_OPTS2) -lm $(LIBQHULLS_USER_OBJS) src/qhalf/qhalf.o $(CC) -o bin/qvoronoi $(CC_OPTS2) -lm $(LIBQHULLS_USER_OBJS) src/qvoronoi/qvoronoi.o $(CC) -o bin/qhull $(CC_OPTS2) -lm $(LIBQHULLSR_USER_OBJS) src/qhull/unix_r.o $(CC) -o bin/rbox $(CC_OPTS2) -lm $(LIBQHULLS_RBOX_OBJS) src/rbox/rbox.o - $(CC) -o bin/testqset $(CC_OPTS2) -lm mem.o qset.o usermem.o testqset.o - $(CC) -o bin/testqset_r $(CC_OPTS2) -lm mem_r.o qset_r.o usermem_r.o testqset_r.o + $(CC) -o bin/testqset $(CC_OPTS2) -lm $(LS)/mem.o $(LS)/qset.o $(LS)/usermem.o src/testqset/testqset.o + $(CC) -o bin/testqset_r $(CC_OPTS2) -lm $(LSR)/mem_r.o $(LSR)/qset_r.o $(LSR)/usermem_r.o src/testqset_r/testqset_r.o + -bin/testqset 10000 + -bin/testqset_r 10000 -bin/rbox D4 | bin/qhull # The static library, libqhullstatic, contains non-reentrant code for Qhull. It is somewhat faster than reentrant libqhullstatic_r @@ -619,7 +728,7 @@ @echo ==== If 'ar' fails, try 'make qhullx' ==== @echo ========================================== ar -rs $@ $^ - #If 'ar -rs' fails try using 'ar -s' with 'ranlib' + #If 'ar -rs' fails, try using 'ar -s' with 'ranlib' #ranlib $@ lib/libqhullstatic_r.a: $(LIBQHULLSR_RBOX_OBJS) @@ -633,7 +742,9 @@ lib/libqhull_r.$(SO): $(LIBQHULLSR_RBOX_OBJS) $(CC) -shared -o $@ $(CC_OPTS3) $^ - cd lib && ln -f -s libqhull_r.$(SO) libqhull_r.so + # the following line fails under MSYS, not needed for SO=dll + -(cd lib/ && ln -f -s libqhull_r.$(SO) libqhull_r.so) + -(cd lib/ && ln -f -s libqhull_r.$(SO) libqhull_r.$(SONAME_EXT)) # don't use ../qconvex. Does not work on Red Hat Linux bin/qconvex: src/qconvex/qconvex.o lib/libqhullstatic.a @@ -664,7 +775,7 @@ # You may use -lqhullstatic_r instead of -lqhull_r bin/user_eg: src/user_eg/user_eg_r.o lib/libqhull_r.$(SO) @echo -e '\n\n===================================================' - @echo -e '== If user_eg fails to link on MinGW or Cygwin, use' + @echo -e '== If user_eg fails to link on a Windows host, use' @echo -e '== "make SO=dll" and copy lib/libqhull_r.dll to bin/' @echo -e '== Otherwise if user_eg fails to link, switch to -lqhullstatic_r' @echo -e '===================================================\n' diff -Nru qhull-2015.2/qhull-2015-src-7.2.0.tgz.md5sum qhull-2020.2/qhull-2015-src-7.2.0.tgz.md5sum --- qhull-2015.2/qhull-2015-src-7.2.0.tgz.md5sum 2016-01-19 04:37:32.000000000 +0000 +++ qhull-2020.2/qhull-2015-src-7.2.0.tgz.md5sum 1970-01-01 00:00:00.000000000 +0000 @@ -1,268 +0,0 @@ -8f1e5f4b485d6095d16508e2d75dc2fd *Announce.txt -3ad98f9f6b5b8ac810d744b5ab5372ef *CMakeLists.txt -3df5c1d94c5b624903c46b16a03cc858 *CMakeModules/CheckLFS.cmake -6cf68697da2f499f1207c84dc319b727 *COPYING.txt -474ccbff2b79320b15d1128180f8451b *File_id.diz -c0b78b8b813b8f8499b5d14687e6a733 *Makefile -dd1051d9a32f67f84b14d8e841c98532 *QHULL-GO.lnk -916939bb1fee5b8ca7826fbcf7b53232 *README.txt -dfc60c06612b894244510f7efa338c08 *REGISTER.txt -8f844acd13bdea1d0433330b0bb431ca *build/libqhull.vcproj -009d73f2de59864af22baa0144420263 *build/qconvex.vcproj -e0cfb73e02bd751ba6e03de423aec448 *build/qdelaunay.vcproj -62e41a8ab99cce1346d92d8aa25dfa3b *build/qhalf.vcproj -a7e010e96f90b69a132ae4f5f6764a21 *build/qhull-32.sln -4157d3265f042398586f604f62148f6a *build/qhull-64.sln -601339bc1ef69482740206c94f2ecf28 *build/qhull.sln -9cb65d19846cbc2055d977e52f9b3f9f *build/qhull.vcproj -4c235c02ab61de1cb42f883996ba47f2 *build/qhull_p.vcproj -acaf4abe23157c4c1159fa31d5412a32 *build/qhull_r.vcproj -58d8c410b0849f6f6aacf07949a805c7 *build/qhullcpp.vcproj -63014725677aaf48bd9c39537480c4c2 *build/qhullstatic.vcproj -0fc1b5f0000da84f94d98c0834fd3d74 *build/qhullstatic_r.vcproj -1ec841a1f6b2ce527aa921881ee7bd5e *build/qvoronoi.vcproj -29f806fb2500e21d167b3519e31f3cb8 *build/rbox.vcproj -180df169e114aa5681a3b74cde5d9723 *build/testqset.vcproj -abeb1b1c369c8befdfc15c30fbb0fd68 *build/testqset_r.vcproj -e9b976dc3b2805a36b2006f93e5a257e *build/user_eg.vcproj -1f8b42dabb6de8fbfd8956a07e646031 *build/user_eg2.vcproj -c8dc2e931a45dfe3aebeca085652e2f5 *build/user_eg3.vcproj -d8081ded37896ec86fcc7b5fb2626cb3 *eg/Qhull-go.bat -1b3d71b4dbb731eb90612963d6eb88d5 *eg/make-vcproj.sh -fcd5be5b84d71947c149de185dc0b6db *eg/q_eg -0893adfbce8f69c5f89284c62d58c036 *eg/q_egtest -3dfc727328d99d18dbc5ca9fa9a88354 *eg/q_test -34fb075be942704d9a121ab786983976 *eg/q_test-ok.txt -f3be99dff5e9d9c3016820e951c84fb9 *eg/q_test.bat -6b2af917b10f4f565929dcf88e130ab6 *eg/qhull-zip.sh -846665f7f764dd0555f48fa046fcdb32 *eg/qhulltest-ok.txt -6ee059870d4f4bdc9da8941757a9f854 *html/index.htm -59e9b69f186c9e715192df9e146ebd21 *html/normal_voronoi_knauss_oesterle.jpg -4fc9246954eb42bcb288c8eb75621672 *html/qconvex.htm -5b2ff3acf129b9e50305c260388bb1e4 *html/qdelau_f.htm -1347298241ae216bd8f27165ca62c1c4 *html/qdelaun.htm -bb51e7810cc49e5aff1b910bc3126713 *html/qh--4d.gif -687f459f95e958da6c3ff0c83cafcf46 *html/qh--cone.gif -dc51084bc7ba1f235c71d40c771ce9c8 *html/qh--dt.gif -829df3fbc9a3f36dbdb6389f768b5570 *html/qh--geom.gif -0587393a4591c5fbcd040af9a4f510c7 *html/qh--half.gif -0515fcc283b7dfeeaa7169218722880e *html/qh--rand.gif -15b6d06c99e02a80287ba4ec1e309652 *html/qh-code.htm -96e22b54fbe8f74666e23b131bba2c4b *html/qh-eg.htm -05f3aac1c41623bbe8c75b89d0f1952f *html/qh-faq.htm -1c2491ed698b2d57d1db6ef2f1798424 *html/qh-get.htm -0a02274855985f2d50d077dad7a7a0c8 *html/qh-impre.htm -3ae019d7ec625c4f78d7512b81b05ae2 *html/qh-optc.htm -b678cdcbe2980b2d5e2aab1afd815fd2 *html/qh-optf.htm -7817b95ea0f03841fc96a0f1ba9c1f2c *html/qh-optg.htm -7be7ee8bc36e7bdddb40be689df36257 *html/qh-opto.htm -a9e8f8b1c593397861f2dc9184151ce6 *html/qh-optp.htm -efa4668efa639083ba4c10179d49263a *html/qh-optq.htm -f243fb0af27cc1d2c258f5b3369c7229 *html/qh-optt.htm -923b7248e411fe7a2ac3dd362abe481c *html/qh-quick.htm -fa799462e7d944b9d502827774d8d015 *html/qhalf.htm -346ebb61aba57bc6a2922488b3366f46 *html/qhull-cpp.xml -580422a321a938f501863617cef2e3fa *html/qhull.htm -da57fc3d40cdd729f816d96005a3b632 *html/qhull.man -b153a2374097b29a8f69c859789627cf *html/qhull.txt -027c95fe710c20b7b7f264d8afae745c *html/qvoron_f.htm -53f87c7a37a904ccdfc8e14d6a8880d2 *html/qvoronoi.htm -8062428babdd8b64655fe4be4d4302c3 *html/rbox.htm -4cbad586d2136f611dbaf7f47128cc86 *html/rbox.man -61cd54c422366e1ef1db2babdb3daff9 *html/rbox.txt -3d6cbc49ec6a8ede8855926327b5d505 *index.htm -3c454f4abf1a67cef9d662d9368cbe76 *src/Changes.txt -794e28e13571bb9cef381e644288b888 *src/libqhull/DEPRECATED.txt -7e2c6e2f103665ad92a9ad0935447162 *src/libqhull/Makefile -e76b4786a5fa7197784c0dcf98e3949f *src/libqhull/Mborland -4ef3661a01c2844550565e0b3250691a *src/libqhull/geom.c -ce04e77c4eb6d45c62252e35adb689f4 *src/libqhull/geom.h -3f5e759cd807568b778a3a7c50f5a049 *src/libqhull/geom2.c -d5c25bbcb08b60bf91a3d2052e85d4d6 *src/libqhull/global.c -00debf675ba1cfbb47087d94a031aba6 *src/libqhull/index.htm -f49e6c1b820e72655260d9582d149401 *src/libqhull/io.c -572e3ff973908d537f71e440109ea542 *src/libqhull/io.h -4dde4452523a91f35455abd95e9e3d61 *src/libqhull/libqhull.c -a97e4a2727ab0beae094d5ec4585f389 *src/libqhull/libqhull.h -6b4f63226f2b9e7a4e92ed662dfbfc96 *src/libqhull/libqhull.pro -d36212806e43cba4e1ccaf6c6507712f *src/libqhull/mem.c -92597838e421964fac30076964c3677d *src/libqhull/mem.h -e04a8f232146a15ee169a11e4c31ed56 *src/libqhull/merge.c -d43df405fdd482f17bc5eaa865c752e2 *src/libqhull/merge.h -450b5da8954494beb17bbf8e822d20b7 *src/libqhull/poly.c -4c13e3b4880ab0993f760890435555a8 *src/libqhull/poly.h -7d6c35f94b3e5f6e63d9abcda9065e2f *src/libqhull/poly2.c -ff9eca5fad61b6a935b3c4b73637125d *src/libqhull/qh-geom.htm -4b68ad7285e99a7b02d6d26e76b86a62 *src/libqhull/qh-globa.htm -f224e3b1938f6d2d778e17b7d3b20514 *src/libqhull/qh-io.htm -b87c7d2a391add3679a1cc8184935012 *src/libqhull/qh-mem.htm -4c72f9f82b8025dc8b0ada668573a0aa *src/libqhull/qh-merge.htm -a003b11bdb3b0dada7bcdbb0afc0a6f7 *src/libqhull/qh-poly.htm -63f650966d4ef9d8a3e12ba6b16facd8 *src/libqhull/qh-qhull.htm -ca5015e58de50c76099bdb95d46b368f *src/libqhull/qh-set.htm -9ab79aad29428638c09fc5be13be4f0f *src/libqhull/qh-stat.htm -3d042808e80bacdfcc13572c584f6666 *src/libqhull/qh-user.htm -83234d819cf913d91401235368b9fbc1 *src/libqhull/qhull-exports.def -355f755a63e7790d5a3268168c52bedc *src/libqhull/qhull_a.h -cc191794284322ece05d03bd86989985 *src/libqhull/qhull_p-exports.def -606725030a1945365bd9e20ea9239be5 *src/libqhull/qset.c -7c3634fcd61f1ead152c899502eecfb8 *src/libqhull/qset.h -8f49d0034c109b7f6aedda4fc552d236 *src/libqhull/random.c -84d38ccfed57cfcfd76f34e55bcb8c4e *src/libqhull/random.h -411b46b3a946259aea46e511bf3bb445 *src/libqhull/rboxlib.c -f29329454962c72d36cbc4b07ce1b025 *src/libqhull/stat.c -a154d23bb08c6b1c88212402260e2b97 *src/libqhull/stat.h -965102c4a6a1f44a7d9abab96cd4dc22 *src/libqhull/user.c -e8180ffd75b4581cce2c5915c11f98a6 *src/libqhull/user.h -152ce853d861bf6586e9846b30a1a2f2 *src/libqhull/usermem.c -ba9a732d1a95089c6200a9f55ce93d05 *src/libqhull/userprintf.c -c4424d4fd7f7e69f98f1e2fe2fe5a260 *src/libqhull/userprintf_rbox.c -1ec6e32d63d218f7bd4bdc113a88c97b *src/libqhull_r/Makefile -dacb518e4412655c3c27df15e33ae5ba *src/libqhull_r/geom2_r.c -76fcfbadd94c49fb50b0ef9b6d9e2ee8 *src/libqhull_r/geom_r.c -2f9a059ae0b213370b3517856da542b4 *src/libqhull_r/geom_r.h -4605b60019d7afad1f3b3a0d4c94af84 *src/libqhull_r/global_r.c -e62fb37b5811c0d3f7519d4fb2ec6900 *src/libqhull_r/index.htm -978a083ead09aac102e94e9e9f7152fa *src/libqhull_r/io_r.c -029080eca18cdba2c4a0e82ca854b119 *src/libqhull_r/io_r.h -95d1f647ac69de2cf0bf89e96fecfb03 *src/libqhull_r/libqhull_r.c -fc075bd19a9996ed7aae1591f8b20b7c *src/libqhull_r/libqhull_r.h -fc1edee713bbf47361276f84d4c0ed8f *src/libqhull_r/libqhull_r.pro -038d7a5dff679d87702098365253843c *src/libqhull_r/mem_r.c -591de8cb0429716dc82c256b41ff79fc *src/libqhull_r/mem_r.h -099ae8a68bcf4602132f83e28233f3c5 *src/libqhull_r/merge_r.c -e3c4e56f395bfd03363a014a4f3e06c4 *src/libqhull_r/merge_r.h -db20cf41795388b8295fb556495b920f *src/libqhull_r/poly2_r.c -f2edd613887ce24b5795385ca5eb9993 *src/libqhull_r/poly_r.c -5ec44992e593ae97d7248363b205e280 *src/libqhull_r/poly_r.h -e4fe24c50dceddf3d449f7a2d7fda019 *src/libqhull_r/qh-geom_r.htm -f800d9b353ab2a02d0d57536f42de3dd *src/libqhull_r/qh-globa_r.htm -e1b2a6b2db81fc9164a37946eb5edc53 *src/libqhull_r/qh-io_r.htm -3444862ddce5d5d2ce3a94559e19b003 *src/libqhull_r/qh-mem_r.htm -31d95f0928e65e597f96872e0edf730c *src/libqhull_r/qh-merge_r.htm -93f7b23257eef17748edb8114840710c *src/libqhull_r/qh-poly_r.htm -589b78fc028ade1ad016b384714e758f *src/libqhull_r/qh-qhull_r.htm -88f4aeb900349c7981069cc757112ea6 *src/libqhull_r/qh-set_r.htm -361beb5151e435b87f85e86495277552 *src/libqhull_r/qh-stat_r.htm -a690db3c4d96a0edaaa727abe97a7fec *src/libqhull_r/qh-user_r.htm -d604283a2002dd5e66c207deb37fa141 *src/libqhull_r/qhull_r-exports.def -e0c3f973242e234bdf3d8a75a9d00ae4 *src/libqhull_r/qhull_ra.h -a336b5eab84a1c2328228faa044a816c *src/libqhull_r/qset_r.c -52bbf6f6fc66ebd05e841d3f3e44fcc0 *src/libqhull_r/qset_r.h -c1efe0ded515a498e78672ea51330a2b *src/libqhull_r/random_r.c -9eda756f917ac4f7875a292549f69a90 *src/libqhull_r/random_r.h -a8eee8ee7bcec2910d23e22849e4a0c5 *src/libqhull_r/rboxlib_r.c -bb0844368cac0b4ac0ec3fdbf74c823f *src/libqhull_r/stat_r.c -13882a6d9d391f15453d0c7fa7d8f1cb *src/libqhull_r/stat_r.h -bd892680e8ee7aa39111c4ca8a7ca929 *src/libqhull_r/user_r.c -4934a9df295ff94365c1c92b6f5ae80e *src/libqhull_r/user_r.h -263c4d1a746f5ce6448f625a2391a554 *src/libqhull_r/usermem_r.c -b616ea48118c1c0ae23425f4e698de19 *src/libqhull_r/userprintf_r.c -292925bff7c805c25238eb1799a8d619 *src/libqhull_r/userprintf_rbox_r.c -528830685754674df06b90f3f1c6d716 *src/libqhullcpp/Coordinates.cpp -4892af52021288cf52c7ed579c70b4e7 *src/libqhullcpp/Coordinates.h -3d261b466b32e63e1088e1ce74fdb9eb *src/libqhullcpp/PointCoordinates.cpp -02d1a5a22ddc9453df9f1cfac6989b87 *src/libqhullcpp/PointCoordinates.h -bc377511b107d437a0b1ac8aadbe20a6 *src/libqhullcpp/Qhull.cpp -295ceaf4b4b4d61c1bc29f705184a01a *src/libqhullcpp/Qhull.h -ca9ba81156bad61c95082b2649cd9e60 *src/libqhullcpp/QhullError.h -7cb4a4d368bbc51d88cac602fc52c6e8 *src/libqhullcpp/QhullFacet.cpp -2a751db727e2e77d8809f9bbf3d43f46 *src/libqhullcpp/QhullFacet.h -5329023aa2da6af438761bf9632de31a *src/libqhullcpp/QhullFacetList.cpp -3365d4e07588a0a7c3f7f5bea0195f3f *src/libqhullcpp/QhullFacetList.h -6f9344cff395ebc876d5d78b2bfacd25 *src/libqhullcpp/QhullFacetSet.cpp -eaac27cb3ea2e88e18cc1911c33cce13 *src/libqhullcpp/QhullFacetSet.h -7b59c6025efc73d41a18a075b172ef3e *src/libqhullcpp/QhullHyperplane.cpp -e776ac3e8f5c917da1f9d951003ea7d1 *src/libqhullcpp/QhullHyperplane.h -3fbdc624899e6d9c3e0fa8b2447f894a *src/libqhullcpp/QhullIterator.h -a1a2f6773103e1a56bb061b6f7b3c284 *src/libqhullcpp/QhullLinkedList.h -8bcd6c0d0e4bd6a2bb7b32a7b2e63894 *src/libqhullcpp/QhullPoint.cpp -90f9aa46a9fb03dd145a68010843e4cc *src/libqhullcpp/QhullPoint.h -e606669b54468f91a9bb3bdaa2dc2f5b *src/libqhullcpp/QhullPointSet.cpp -6f10d172ec8e636f902fba2892a796b6 *src/libqhullcpp/QhullPointSet.h -cad6d44962d677a3ee1523156e5a0fea *src/libqhullcpp/QhullPoints.cpp -12f85f39df1b0ba28d3eac887988312b *src/libqhullcpp/QhullPoints.h -3e3735bc41d17e0d99b2bd2518c7c27a *src/libqhullcpp/QhullQh.cpp -c86e112156b99fe752d57ae5a86f0c93 *src/libqhullcpp/QhullQh.h -c91b9ecce17f4680b62988c6f7336dad *src/libqhullcpp/QhullRidge.cpp -54aa9e338868b46224e1abdbfff688cd *src/libqhullcpp/QhullRidge.h -180d9ac3e5bc4033ba2f8b6cc97f2c50 *src/libqhullcpp/QhullSet.cpp -1cae9000b079673823988924471cc65a *src/libqhullcpp/QhullSet.h -5d1e3aed22f344251e84151d7f08200a *src/libqhullcpp/QhullSets.h -ca897d16ccf2c0a94780338996858bd4 *src/libqhullcpp/QhullStat.cpp -36fd0c5793416bd052036c43198e7f82 *src/libqhullcpp/QhullStat.h -3d811f7df7cba2069c600da628b9830f *src/libqhullcpp/QhullVertex.cpp -3a887beda1898693d56c2a3543a8e3ca *src/libqhullcpp/QhullVertex.h -82b1acf97546bf36468e0b227f58e97a *src/libqhullcpp/QhullVertexSet.cpp -9b733f4fd524a560257f5242bec6f4c7 *src/libqhullcpp/QhullVertexSet.h -ffe9cafbab17292162f7a0a20efba8a1 *src/libqhullcpp/RboxPoints.cpp -b6f6f14d84c4bf392e12bb5dd42f04c6 *src/libqhullcpp/RboxPoints.h -619e3fc49325a5e003da27bafdd6a872 *src/libqhullcpp/RoadError.cpp -2a11f985bac08692fcf3d96a6704458f *src/libqhullcpp/RoadError.h -41a813d8cda053dd8eeb027965afe33d *src/libqhullcpp/RoadLogEvent.cpp -3cf1d8f543a10b09c8cce766de36c309 *src/libqhullcpp/RoadLogEvent.h -80893170ca1a1537875b74e3b31b4b78 *src/libqhullcpp/functionObjects.h -565ffb112c8b4fc7d0b8bc8e9cc78ac4 *src/libqhullcpp/libqhullcpp.pro -100b675ce5c979688800ae01b4ac5057 *src/libqhullcpp/qt-qhull.cpp -f4dd3fa77a518897eb438efb78504499 *src/libqhullcpp/usermem_r-cpp.cpp -b4752f1c7e6e6bdf90f2fafafabe324b *src/libqhullstatic/libqhullstatic.pro -b22e10e89694ba6ce3c6a285b47e2f86 *src/libqhullstatic_r/libqhullstatic_r.pro -abd0486b3c20b333d955bb39d56d1f98 *src/qconvex/qconvex.c -4ea25c0ef260f5d1c1f59326f1439997 *src/qconvex/qconvex.pro -28f9e492c763fc279866611a5ae157ac *src/qconvex/qconvex_r.c -196d87e841103c9bc3e1b3b06949e391 *src/qdelaunay/qdelaun.c -4b5c8ef7b5648dc245a4c288169ef625 *src/qdelaunay/qdelaun_r.c -ae7da22e7e39cc39f54b5bc4f8f68b47 *src/qdelaunay/qdelaunay.pro -07a307b2e21cc5d0952322bc08428d61 *src/qhalf/qhalf.c -eea5fc6e1ff79d68e05a525a7d2f5d82 *src/qhalf/qhalf.pro -9a3001f6473f79bec4bbe17ba1ee672a *src/qhalf/qhalf_r.c -2661db012730595501713a6c4f6cfa7a *src/qhull-all.pro -0d3de78f61956b9b68741ba5b80bf801 *src/qhull-app-c.pri -b91314146b69e2a45d791ce5e9410548 *src/qhull-app-c_r.pri -11aa141df627d7ec2da4e468c3dc4fdc *src/qhull-app-cpp.pri -b6eda0a529088b9cc4b9b84afc2a47c6 *src/qhull-app-shared.pri -ea2dba27c9f027aa6ed059337ea833f9 *src/qhull-app-shared_r.pri -6c2b47785a0fa76099cc6470b99e5046 *src/qhull-libqhull-src.pri -2d671d08665952d503d45a8470fc74c0 *src/qhull-libqhull-src_r.pri -6fde86c54604ae753b4ba10085f1b5a7 *src/qhull-warn.pri -094c90c389b9929d514f4c045cd3cee5 *src/qhull/qhull.pro -27d9e206a7934ffd6ed2ddc9e992db58 *src/qhull/unix.c -0b7a378f54a606d86eb04ca240c29db2 *src/qhull/unix_r.c -25aaaa0950a042680c1fc2fb31f6cc2b *src/qhulltest/Coordinates_test.cpp -a602e316fa36882bf36d02fd0cb40ad7 *src/qhulltest/PointCoordinates_test.cpp -2be4fd6da3c166e8f0542e4e241d3d41 *src/qhulltest/QhullFacetList_test.cpp -3659dbb9c7be91864529065dac328946 *src/qhulltest/QhullFacetSet_test.cpp -72a8a3edfb7b8d272bab51ff098ccc3f *src/qhulltest/QhullFacet_test.cpp -061137030a2715a601af0eace021abd2 *src/qhulltest/QhullHyperplane_test.cpp -8d1710b7b5a5457e5c56720256e4f7b2 *src/qhulltest/QhullLinkedList_test.cpp -250f29c5de70744529e2eb086afd5563 *src/qhulltest/QhullPointSet_test.cpp -bd91229e9e5c6a089e657137fedc69c6 *src/qhulltest/QhullPoint_test.cpp -38b6c8ec74e6e48551042da7995a99fd *src/qhulltest/QhullPoints_test.cpp -b8eb93577b2c0e3dee60c6f9c8f17999 *src/qhulltest/QhullRidge_test.cpp -402b3f55053f798713b34f59a66b2ae0 *src/qhulltest/QhullSet_test.cpp -16bf0e16461f3e2cc09317cb487bad12 *src/qhulltest/QhullVertexSet_test.cpp -54d94dd44d82c65f0e6befc64ae9923e *src/qhulltest/QhullVertex_test.cpp -413b656e724534c3ac955a4e86679dfb *src/qhulltest/Qhull_test.cpp -c43061bea5a7cc2e15bc49e8ef3e6acd *src/qhulltest/RboxPoints_test.cpp -b0d605a276237a41f8f5dc6519232aa8 *src/qhulltest/RoadTest.cpp -50f4425004ef84b27c8d35c820499480 *src/qhulltest/RoadTest.h -827ce2213995f6e211af9283bfd654e6 *src/qhulltest/qhulltest.cpp -00fe5c4317a03cb83009b7a622a20170 *src/qhulltest/qhulltest.pro -1c7c18e5fb9bb6a33e3e75b6f31c7389 *src/qvoronoi/qvoronoi.c -fbeca66e16029e38c1ecfef02294387d *src/qvoronoi/qvoronoi.pro -3b935aa29717e92b7d0430844edfdb61 *src/qvoronoi/qvoronoi_r.c -6650f16c864c034a6494c3673dc15ab0 *src/rbox/rbox.c -8528e43a27c17806d447b2bb20842aa0 *src/rbox/rbox.pro -93fc2ac095e48c745cb3ae12467f2e82 *src/rbox/rbox_r.c -c556c0446e582e2df34f94bcc9e76777 *src/testqset/testqset.c -8424a44ea97cc3f5bd1a04b74815bdb1 *src/testqset/testqset.pro -22a753b97441edc24b478136ff29e22a *src/testqset_r/testqset_r.c -b0953b95725a8782f192afea4fa469e7 *src/testqset_r/testqset_r.pro -b11bee3767ecc029321d4783534cbb37 *src/user_eg/user_eg.c -a1c77e28793f660109ceb46c904e3e7d *src/user_eg/user_eg.pro -65a29cdb15b4205087b2bb39e861b518 *src/user_eg/user_eg_r.c -7093fee28deb1cb1ddd3f33d5ec38f35 *src/user_eg2/user_eg2.c -a0bbf00f860f4cbbccada014cfc995e1 *src/user_eg2/user_eg2.pro -d10204ce91e3894c6372944c27ae728b *src/user_eg2/user_eg2_r.c -d7c41d0a8ffeae7a484cbab75d251b3a *src/user_eg3/user_eg3.pro -af76d7d6bc3d8ccb8fbba38cfcff682b *src/user_eg3/user_eg3_r.cpp diff -Nru qhull-2015.2/qhull-2020-src-8.0.2-tgz.md5sum qhull-2020.2/qhull-2020-src-8.0.2-tgz.md5sum --- qhull-2015.2/qhull-2020-src-8.0.2-tgz.md5sum 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/qhull-2020-src-8.0.2-tgz.md5sum 2020-09-04 02:14:55.000000000 +0000 @@ -0,0 +1,314 @@ +65d09ceb4e9b64e6e6ec7a482f2303ec *Announce.txt +0720361ecd968b0dd4d89cf6e8ca2785 *CMakeLists.txt +484ee0cacf0472e8b40225b116f6296c *COPYING.txt +f60ca60ab1172bba8ca679e64f1d3b96 *File_id.diz +c6392cb46274b9145679419d9666ff84 *Makefile +dd1051d9a32f67f84b14d8e841c98532 *QHULL-GO.lnk +54014768f765d484db59ae4f8d8db443 *README.txt +dfc60c06612b894244510f7efa338c08 *REGISTER.txt +3df5c1d94c5b624903c46b16a03cc858 *build/CMakeModules/CheckLFS.cmake +87837a71483543335ee384d5f82046ad *build/config.cmake.in +4674d016bfa37816ad225bcf6d9ae2d6 *build/libqhull-32.vcxproj +2586adcb1f68104c6b442a80364060fa *build/libqhull-64.vcxproj +8f844acd13bdea1d0433330b0bb431ca *build/libqhull.vcproj +13cdf2a8dd294cc769921f70b81c9a24 *build/qconvex-32.vcxproj +c24abdbe2b3e6a6b33a02f76386cfa8d *build/qconvex-64.vcxproj +009d73f2de59864af22baa0144420263 *build/qconvex.vcproj +29f144075cffa904203d8cceeb1cb817 *build/qdelaunay-32.vcxproj +015a6aa1836f0695ed24643dcef10d3d *build/qdelaunay-64.vcxproj +e0cfb73e02bd751ba6e03de423aec448 *build/qdelaunay.vcproj +669d3abe08f776f1fb88573888169261 *build/qhalf-32.vcxproj +b7c2f622e0fdcae7568347599a752c13 *build/qhalf-64.vcxproj +62e41a8ab99cce1346d92d8aa25dfa3b *build/qhalf.vcproj +2c3d77ab761390157dd820d8b09acc6b *build/qhull-32.sln +eb1c989130db051048e27c9217b86e74 *build/qhull-32.vcxproj +239249d8729e802512203205e999ff5f *build/qhull-64.sln +67be08aa40c8073b7f4bff8d3952845c *build/qhull-64.vcxproj +96e3fc9be110b51d4cf67f8d4c39a7c7 *build/qhull.pc.in +9e4bd2b7739e4416e2e29e974e8705ba *build/qhull.sln +9cb65d19846cbc2055d977e52f9b3f9f *build/qhull.vcproj +a255f3a11c112414e6e8558a770ee2d7 *build/qhull_p-32.vcxproj +6dfb8e9e6dd7c20655b6aeec4723aa73 *build/qhull_p-64.vcxproj +4c235c02ab61de1cb42f883996ba47f2 *build/qhull_p.vcproj +7e23bce282e1de9f518f0e3dcfb5e7bb *build/qhull_r-32.vcxproj +af6429f2c7b475496234e63ec30280a3 *build/qhull_r-64.vcxproj +acaf4abe23157c4c1159fa31d5412a32 *build/qhull_r.vcproj +87da5646b5150757b6a7bd14bef285f0 *build/qhullcpp-32.vcxproj +9c88330b04a21958fb4e864155523012 *build/qhullcpp-64.vcxproj +0a6605fa121cc63a9dab9c6b7e023ff2 *build/qhullcpp.vcproj +6277fea4325996336f0a81fa492a8528 *build/qhullstatic-32.vcxproj +8ae5f938a03f4edb28e0b21c96651436 *build/qhullstatic-64.vcxproj +63014725677aaf48bd9c39537480c4c2 *build/qhullstatic.vcproj +2f65933fc8ab244e7e8128111fe26c21 *build/qhullstatic_r-32.vcxproj +921fa3a27d5d4bdcac5ddd433f312f09 *build/qhullstatic_r-64.vcxproj +0fc1b5f0000da84f94d98c0834fd3d74 *build/qhullstatic_r.vcproj +b50d39ba520c29b4244a886f93755129 *build/qvoronoi-32.vcxproj +d875bde97f78d26f51d06800d60f4920 *build/qvoronoi-64.vcxproj +1ec841a1f6b2ce527aa921881ee7bd5e *build/qvoronoi.vcproj +3df85e67e03b6055c1f87dbece9f1f49 *build/rbox-32.vcxproj +0ce917ab6d57ba7f45af1291eabe8a67 *build/rbox-64.vcxproj +29f806fb2500e21d167b3519e31f3cb8 *build/rbox.vcproj +e4d6dd9fdf1d4beb8a4de7846357a043 *build/testqset-32.vcxproj +9f610bb6508af3569e40227ae8c6134f *build/testqset-64.vcxproj +180df169e114aa5681a3b74cde5d9723 *build/testqset.vcproj +7c3d6eac7ea0ce73f13ae30a7724158a *build/testqset_r-32.vcxproj +e7c8117ce1911f111f8c7af65ce2e38f *build/testqset_r-64.vcxproj +abeb1b1c369c8befdfc15c30fbb0fd68 *build/testqset_r.vcproj +5fcff78b8a26f2cea4874325b1e68514 *build/user_eg-32.vcxproj +a670399d6dd14a23e5d7c76e5268cda2 *build/user_eg-64.vcxproj +e9b976dc3b2805a36b2006f93e5a257e *build/user_eg.vcproj +10dc74407641cc1f68999ae5f697a65d *build/user_eg2-32.vcxproj +473f1a98f684e1911d1e193fe8b44ca5 *build/user_eg2-64.vcxproj +1f8b42dabb6de8fbfd8956a07e646031 *build/user_eg2.vcproj +8b087c9c5a24c948100057ea490fdb6f *build/user_eg3-32.vcxproj +0158d73fe951d890949ca40a5da88c5a *build/user_eg3-64.vcxproj +c8dc2e931a45dfe3aebeca085652e2f5 *build/user_eg3.vcproj +a7c173113017aeac4a2f15cb0c391ad8 *eg/Qhull-go.bat +e7b1c17bc19c003c26de72467a258605 *eg/make-qhull_qh.sh +89a30e16de271af01489ee6797576af7 *eg/make-vcproj.sh +5d92b824631d802afa304e93db37f186 *eg/q_benchmark +4f8c270a19a4654a411ee30c2de3b3ef *eg/q_benchmark-ok.txt +ed8a87186ca51f3aef86c7098d53ea51 *eg/q_eg +e8240a2c4c33aab2e6b1cf1681991664 *eg/q_egtest +b29fe52be86de37cfd8bf6991d9098d2 *eg/q_test +f0f27d75bbd37c2e618bca2f103dba43 *eg/q_test-ok.txt +29f540676a6eaafbc380eebf60aeb2d2 *eg/q_test.bat +03757af90de48525c4e2016820d33eae *eg/qhull-zip.sh +c09360b40198e3bc8757fba186b85f4a *eg/qhulltest-ok.txt +5aee776ff7b0656ebef048346794fbef *eg/qtest.sh +f4297aeec0354656c3efc99ea4cda387 *html/index.htm +59e9b69f186c9e715192df9e146ebd21 *html/normal_voronoi_knauss_oesterle.jpg +1cdddaa03a2575e7ff07638959fb9fe0 *html/qconvex.htm +f167803bdc16a07fa23b2a31924abbdb *html/qdelau_f.htm +a1a1518d37463a204c580d417550b408 *html/qdelaun.htm +bb51e7810cc49e5aff1b910bc3126713 *html/qh--4d.gif +687f459f95e958da6c3ff0c83cafcf46 *html/qh--cone.gif +dc51084bc7ba1f235c71d40c771ce9c8 *html/qh--dt.gif +829df3fbc9a3f36dbdb6389f768b5570 *html/qh--geom.gif +0587393a4591c5fbcd040af9a4f510c7 *html/qh--half.gif +0515fcc283b7dfeeaa7169218722880e *html/qh--rand.gif +a63772a7b7c405bc97b37e8ee2f001dd *html/qh-code.htm +e69cab72cd604f1e9aafce840e6306bf *html/qh-eg.htm +974ed918de1aa1105188dd4dc4a497bd *html/qh-faq.htm +0cea0d5a050266c7abe886d2cfa3b75e *html/qh-get.htm +b59cd55b5b6f16737dc6075e647330c2 *html/qh-impre.htm +4383c32994b7330c7de53661dd0c51ec *html/qh-optc.htm +268899c7634da8acf9e31cd977481b93 *html/qh-optf.htm +d06e302804f8b290266fc17e87332265 *html/qh-optg.htm +3471d4c6f65572ee0bf78dfccd99487e *html/qh-opto.htm +da400a2bb032dda9888aea225ebb0db8 *html/qh-optp.htm +f1916f39734895c9289aec380695e407 *html/qh-optq.htm +ec16627e14caf0d8f79f8cc651fc9b26 *html/qh-optt.htm +5367b3e99373755d5744a34ac1d22d6c *html/qh-quick.htm +6112b359d174db3a32c575236b65fb90 *html/qh_findbestfacet-drielsma.pdf +a183d4bf20cff3db7013dd5ccc475f05 *html/qhalf.htm +da2fe3fd695ceae9437aca693e1fe76b *html/qhull-cpp.xml +9f48e440a7f28da3eef2fe9d0758961a *html/qhull.htm +5afb7d83533ac6d38303103c9936e8a3 *html/qhull.man +ae0e659a7472f6387fddd46d5379ee84 *html/qhull.txt +031fe69b5db5e87cac77db517e9de804 *html/qvoron_f.htm +f6f23918c9f7eb29e5fce2f26d12425e *html/qvoronoi.htm +30c848ff6f5cd7f4218e4270f0459e3b *html/rbox.htm +4cbad586d2136f611dbaf7f47128cc86 *html/rbox.man +61cd54c422366e1ef1db2babdb3daff9 *html/rbox.txt +8116baf92dcda379767f7a23a6549cf5 *index.htm +e9215a2ce69ac30bfd31b51d1d0dc5f3 *src/Changes.txt +7611837185670c6d7f8768c29d239339 *src/libqhull/DEPRECATED.txt +17a6ffbaabc242df0e5ffebf655d2084 *src/libqhull/Makefile +e76b4786a5fa7197784c0dcf98e3949f *src/libqhull/Mborland +29be4610c7fd8a1052ed3e41e384bfac *src/libqhull/geom.c +3a98ef14c7671e39a17266276c8c9794 *src/libqhull/geom.h +d27392944e8b4895fc3aff6db97c3f50 *src/libqhull/geom2.c +d9597f7a4eb8d39a16651fde58c863a0 *src/libqhull/global.c +39dd11d4ba1c16a11778577cc95a502d *src/libqhull/index.htm +518dbab7e087dd40c5c427e31dc57e13 *src/libqhull/io.c +bc74bab30ca533ba3c85adb2c2708345 *src/libqhull/io.h +24346b91ddf45b75beedc254127df09b *src/libqhull/libqhull.c +97eeb276efecf399603313581ffeeabf *src/libqhull/libqhull.h +6b4f63226f2b9e7a4e92ed662dfbfc96 *src/libqhull/libqhull.pro +2dbf0bb26d822d217bc07ba7a114a370 *src/libqhull/mem.c +9574f63f06d0eb11317e498dbdf7eabe *src/libqhull/mem.h +0bfd96e51cf797d2545eb3724ae1add7 *src/libqhull/merge.c +ffba845661c716508d5e4d6bf35db574 *src/libqhull/merge.h +efbfd8c26ac93227e765f83f1ac0da22 *src/libqhull/poly.c +6f92baf68e56456a1b5a69e4ac527cf9 *src/libqhull/poly.h +91110c28f82bb4f21f8d1d118a64e365 *src/libqhull/poly2.c +6bb99f305df73fe577fd7042c6e4bd86 *src/libqhull/qh-geom.htm +c577ca0f1516d07b435dfe08fec26364 *src/libqhull/qh-globa.htm +58fc73009db00fef28bf9990e73bee36 *src/libqhull/qh-io.htm +892166aee9a777e395b5e86bbdc78267 *src/libqhull/qh-mem.htm +e944d190b08235150b92895074f18ede *src/libqhull/qh-merge.htm +e8c9a7a70a66b5c7255ca8744fee5607 *src/libqhull/qh-poly.htm +4b493275f0a5bb23c25b09ae2f73921c *src/libqhull/qh-qhull.htm +dc6914bc6c0c78ea99509e8685e49002 *src/libqhull/qh-set.htm +93266af6121082853a4f25557c00689e *src/libqhull/qh-stat.htm +02733f3342523af8b902e3d86a4fa794 *src/libqhull/qh-user.htm +987aa6e3464982b90af168173103625a *src/libqhull/qhull-exports.def +fcd57bbb666943b18f3a2ee7a9a937d7 *src/libqhull/qhull-nomerge-exports.def +d365ec42ee899a7914ff573ce114c5d1 *src/libqhull/qhull_a.h +83eba4edf07391024705d5bcc98b602d *src/libqhull/qhull_p-exports.def +1af9f55067eb6c50dc542f4f865ccaae *src/libqhull/qhull_p-nomerge-exports.def +c031da674e4a4af9288e1235043e81a2 *src/libqhull/qset.c +700c0c8549947cecc0267bea3bb1b2c9 *src/libqhull/qset.h +249358a8f4227fcfd476a086f30d8aee *src/libqhull/random.c +4cf4514863c130058efc8f0733bb71b1 *src/libqhull/random.h +c40e01c0f66cf2d10f2c486af831bdfa *src/libqhull/rboxlib.c +c5f9cda941242f1dbd5b023ef9169df7 *src/libqhull/stat.c +fcc7ee0199c523179d5bb760da31390d *src/libqhull/stat.h +5bb1d2cca19dc70182c9682981e3b937 *src/libqhull/user.c +35079e6ef420737d76d74db09d262b01 *src/libqhull/user.h +bea66689b7321f3beb49ff3339175c75 *src/libqhull/usermem.c +73eed50a9986c51816fefcf38b12fa2c *src/libqhull/userprintf.c +64f1f7ed6c6016632bf29b9feef0d599 *src/libqhull/userprintf_rbox.c +ed08b3fa49e20cc05d9f71b643799dc5 *src/libqhull_r/Makefile +876c09adad390e33d27f72fbb6dc520d *src/libqhull_r/geom2_r.c +b5bfc1b056f16945579951686dc2c428 *src/libqhull_r/geom_r.c +cfde24c128897c30273de690cfb8ad20 *src/libqhull_r/geom_r.h +7f6bb4819c9a4abbf9ad638892fa27cb *src/libqhull_r/global_r.c +7289aa97c84335378ac7bc84c84cac04 *src/libqhull_r/index.htm +580b19ed605ab74265254d47d020e14e *src/libqhull_r/io_r.c +ebd7597c25e31f815e819da068e9914f *src/libqhull_r/io_r.h +b6910ea39f0797da7489f4421c9b88ea *src/libqhull_r/libqhull_r.c +c159399ed03809f06c240d31f274de7f *src/libqhull_r/libqhull_r.h +f4bf5aab9cfdfd35e00dc8330fb60e61 *src/libqhull_r/libqhull_r.pro +8275d12edcabef504d1a39db3680bd09 *src/libqhull_r/mem_r.c +e7a552cf8e5b47a75b6b9fd0eaf0b4cf *src/libqhull_r/mem_r.h +746094f172d5e194a3b6c857a554e397 *src/libqhull_r/merge_r.c +905850f71545d3b4d2d3d0811035eb3d *src/libqhull_r/merge_r.h +3e5c51d6c3a002eb661060b51be47fef *src/libqhull_r/poly2_r.c +f28a42b955f615484659d25f4d40bc72 *src/libqhull_r/poly_r.c +73b0c0b388910469d2faae58a39ebca6 *src/libqhull_r/poly_r.h +484078e99a3fde0bd0daa99f4a1fd56b *src/libqhull_r/qh-geom_r.htm +d7851a9939651e33ec7489c0e5085339 *src/libqhull_r/qh-globa_r.htm +7f7aa31b68cc8791ee8d210080404289 *src/libqhull_r/qh-io_r.htm +35606a644f52da36dd52bb72393383e9 *src/libqhull_r/qh-mem_r.htm +5735de0188677d8cc69d4e54372327da *src/libqhull_r/qh-merge_r.htm +c71f6df7047165a05b427f1103b40664 *src/libqhull_r/qh-poly_r.htm +b9c36e566998129216c3de8e14917c6c *src/libqhull_r/qh-qhull_r.htm +7ad1ad9102c469a634f776a8776f731f *src/libqhull_r/qh-set_r.htm +a6ea3edf6fe83fcc4144189ffad0e551 *src/libqhull_r/qh-stat_r.htm +7ac470e4d33d52f6b25b368de3c95b92 *src/libqhull_r/qh-user_r.htm +2e497193088e1b6ae5381657cc343dd9 *src/libqhull_r/qhull_r-exports.def +cb49262f5a240674ab152fd95f4bb945 *src/libqhull_r/qhull_r-nomerge-exports.def +52fcd7e36336fd312c022fce2c45edf5 *src/libqhull_r/qhull_ra.h +5442309186618a5774230daaba3c74ab *src/libqhull_r/qset_r.c +47f8171b0fbe74280bb1299fd8a6ef8d *src/libqhull_r/qset_r.h +f498e0602fba35e60a1080f3918b99c4 *src/libqhull_r/random_r.c +a1fe43bed99882c8c850ea6f0ae15ecd *src/libqhull_r/random_r.h +9d1c472d83fb77b0c0b1499b851432dd *src/libqhull_r/rboxlib_r.c +278521cfead70046b36b59b17bbaeb15 *src/libqhull_r/stat_r.c +ee0baf81125db01bf0bc29f4c2a3c33f *src/libqhull_r/stat_r.h +27987c9ca25ddb728b7de06abeffd039 *src/libqhull_r/user_r.c +560946c6d1a20ac71211e1d76f3b5f78 *src/libqhull_r/user_r.h +a6c60a2391b6beda18f4261707cb8090 *src/libqhull_r/usermem_r.c +61cd83f3c0639f8e6933f5a15b6c229c *src/libqhull_r/userprintf_r.c +cc32478b6848d9938c0c5c2832e4869b *src/libqhull_r/userprintf_rbox_r.c +f5cbe73af7fc4edac17f6d62924e02d0 *src/libqhullcpp/Coordinates.cpp +661eca245e61cced9e373aa6871148e2 *src/libqhullcpp/Coordinates.h +34a2dd1f51d4ecbf2fe3e9f6f0039f9b *src/libqhullcpp/PointCoordinates.cpp +1b63708c316032fe0a9e42cc254fb6c6 *src/libqhullcpp/PointCoordinates.h +be371d83a58bd9f6811c122223b31936 *src/libqhullcpp/Qhull.cpp +471ff2463d651b96ff7294145ef8434c *src/libqhullcpp/Qhull.h +0c2543742f613ed0e75b14af5b8a1f07 *src/libqhullcpp/QhullError.h +a4a2f2cc79ee68ad1a89cc0674d3d6c6 *src/libqhullcpp/QhullFacet.cpp +4445abbcb8d44364a7e99ccdc459bf8e *src/libqhullcpp/QhullFacet.h +20d2c8ddff36ef52bf09905dd45f7506 *src/libqhullcpp/QhullFacetList.cpp +ea55403677477a66a944356ea41c5005 *src/libqhullcpp/QhullFacetList.h +c1a4cf0f760882fb975250dba78c6732 *src/libqhullcpp/QhullFacetSet.cpp +2d8373e1574a89585526d75371f7f261 *src/libqhullcpp/QhullFacetSet.h +894c0cb4aab042c1a39c09ea621c46b5 *src/libqhullcpp/QhullHyperplane.cpp +8d88d655dca7732cef5591c8b68f1ad0 *src/libqhullcpp/QhullHyperplane.h +5778fcfe6e9993c684d48f467dd9e589 *src/libqhullcpp/QhullIterator.h +a65b84f48f62431879a5b94b5e77238e *src/libqhullcpp/QhullLinkedList.h +f1f4c76f261dad68d68c10ec7934ac34 *src/libqhullcpp/QhullPoint.cpp +0fd012acd20be74c0ce15f49a7d8d466 *src/libqhullcpp/QhullPoint.h +60238b90770fbeb302d1c1821b211cfe *src/libqhullcpp/QhullPointSet.cpp +c8359ae483b46ca4cdf46df5e54c97ca *src/libqhullcpp/QhullPointSet.h +0b553aa2f07b93037d8cb4498db7b30a *src/libqhullcpp/QhullPoints.cpp +4c2b9b4ae4a24cdf7509c68d6f70e02d *src/libqhullcpp/QhullPoints.h +9f4621c4383ee7649a8654ed397729fc *src/libqhullcpp/QhullQh.cpp +18a16fc501e731277d56f052d694f28a *src/libqhullcpp/QhullQh.h +7adf5a94b243eefea6848ab59e234dac *src/libqhullcpp/QhullRidge.cpp +344512c37d10a06ac1b764f5affc0b46 *src/libqhullcpp/QhullRidge.h +d7d9c4db6a94c808a1b90ec889b3562a *src/libqhullcpp/QhullSet.cpp +507cf1e784f462356901e180698514e9 *src/libqhullcpp/QhullSet.h +2f946b07ef3d44c65df9aa7cfcf710a8 *src/libqhullcpp/QhullSets.h +9358bbb3f43b27be0df52e781b048d73 *src/libqhullcpp/QhullStat.cpp +f58ec9baf5fb04134b120c9ea66caeac *src/libqhullcpp/QhullStat.h +3605fa52376508c46b898f674fd5d8e2 *src/libqhullcpp/QhullUser.cpp +51d2f3ec5e46d07c888a228a9020bb25 *src/libqhullcpp/QhullUser.h +9c990237932a4df67c70634bef628e94 *src/libqhullcpp/QhullVertex.cpp +0c0f98b2de607a6469ac729cc75f6ffe *src/libqhullcpp/QhullVertex.h +17cab27891d47a7fdaeddb22b9cfae22 *src/libqhullcpp/QhullVertexSet.cpp +406c264a9732864b996b29ff8ae30864 *src/libqhullcpp/QhullVertexSet.h +a27237c31d6b33a2db440fbfc8a17d9f *src/libqhullcpp/RboxPoints.cpp +639bef41ece0d409b3e9307d0829b0fd *src/libqhullcpp/RboxPoints.h +de273e0fca7f3b2e6151e21cc0f317b9 *src/libqhullcpp/RoadError.cpp +eb11e1a3de896aa19e96ce009c80db70 *src/libqhullcpp/RoadError.h +a1f89e5ee8a5330485dcdfc24c819cb3 *src/libqhullcpp/RoadLogEvent.cpp +1efd4679fb346c162a52a98038f0187c *src/libqhullcpp/RoadLogEvent.h +2e1c39222d819ae6752a44092fb9d2b8 *src/libqhullcpp/functionObjects.h +88ac335866b28a3b8a3a2ac6aa8e35f0 *src/libqhullcpp/libqhullcpp.pro +10a6c51f22c670291f5c954c55fa1dd3 *src/libqhullcpp/qt-qhull.cpp +f4dd3fa77a518897eb438efb78504499 *src/libqhullcpp/usermem_r-cpp.cpp +b4752f1c7e6e6bdf90f2fafafabe324b *src/libqhullstatic/libqhullstatic.pro +b22e10e89694ba6ce3c6a285b47e2f86 *src/libqhullstatic_r/libqhullstatic_r.pro +7e262184ff18ff86eac57c804833066b *src/qconvex/qconvex.c +4ea25c0ef260f5d1c1f59326f1439997 *src/qconvex/qconvex.pro +ced1f28f5bd14198924cc163e87fe42a *src/qconvex/qconvex_r.c +205ef0e37e997a72920092543640dc82 *src/qdelaunay/qdelaun.c +c829859a93554bbd2a0f9746ee92a968 *src/qdelaunay/qdelaun_r.c +ae7da22e7e39cc39f54b5bc4f8f68b47 *src/qdelaunay/qdelaunay.pro +8374447cb68fe7ac8e7285c7b6b1dd58 *src/qhalf/qhalf.c +eea5fc6e1ff79d68e05a525a7d2f5d82 *src/qhalf/qhalf.pro +977f29fdd977858d66e6882eb1ec66f0 *src/qhalf/qhalf_r.c +ad3a57f1dbc582419fc5dae51d0fe852 *src/qhull-all.pro +0d3de78f61956b9b68741ba5b80bf801 *src/qhull-app-c.pri +b91314146b69e2a45d791ce5e9410548 *src/qhull-app-c_r.pri +11aa141df627d7ec2da4e468c3dc4fdc *src/qhull-app-cpp.pri +b6eda0a529088b9cc4b9b84afc2a47c6 *src/qhull-app-shared.pri +ea2dba27c9f027aa6ed059337ea833f9 *src/qhull-app-shared_r.pri +6c2b47785a0fa76099cc6470b99e5046 *src/qhull-libqhull-src.pri +2d671d08665952d503d45a8470fc74c0 *src/qhull-libqhull-src_r.pri +c96cb18ac8bf7b518bfb83bde5b4ddf4 *src/qhull-warn.pri +094c90c389b9929d514f4c045cd3cee5 *src/qhull/qhull.pro +bab640b4ea8a53d344c3de39870a821a *src/qhull/unix.c +b34388a871e1eb7b98dd0802cae20dfd *src/qhull/unix_r.c +ab9a7520696cbaf5c16df416795c3882 *src/qhulltest/Coordinates_test.cpp +c43036f7ce1c46ba0d4865d23bcd5b16 *src/qhulltest/PointCoordinates_test.cpp +a7b6c5b507c80f79d0d3bc1e193195dc *src/qhulltest/QhullFacetList_test.cpp +171133a2056271755595ba3610b3dfa4 *src/qhulltest/QhullFacetSet_test.cpp +cd5915244c632c19572c450be8424f3f *src/qhulltest/QhullFacet_test.cpp +6d802824b6ff4a45b3480e4214051b97 *src/qhulltest/QhullHyperplane_test.cpp +38a7bf1e5d36bc6d41cb2c0820f16191 *src/qhulltest/QhullLinkedList_test.cpp +37339b5e045661851eb65905be468394 *src/qhulltest/QhullPointSet_test.cpp +8c85f653155f3249244085deab2708f2 *src/qhulltest/QhullPoint_test.cpp +b4c1f5408312f23c6fcdd6c67c6a1b7b *src/qhulltest/QhullPoints_test.cpp +c9d97adc646c547bdc575468192f5167 *src/qhulltest/QhullRidge_test.cpp +3ae11e276cf75a0137edefbca4309a6b *src/qhulltest/QhullSet_test.cpp +bbc4cbc1ccfd59714b951068474ef85d *src/qhulltest/QhullVertexSet_test.cpp +ed340cf36d74d377c061d596bc10222e *src/qhulltest/QhullVertex_test.cpp +23199a0ae3f2824cb88258f1918a6d98 *src/qhulltest/Qhull_test.cpp +827f34b2911fa14abec9143f78189866 *src/qhulltest/RboxPoints_test.cpp +b3de8b9ba6a904c82fc7c78a1766c16b *src/qhulltest/RoadTest.cpp +ca7c9840fbbeb6ebf1b56ea647a831b9 *src/qhulltest/RoadTest.h +7dbad30230b7b123e1172c1191ad8085 *src/qhulltest/qhulltest.cpp +00fe5c4317a03cb83009b7a622a20170 *src/qhulltest/qhulltest.pro +ab8b936d7aed5b34965773d5e4840460 *src/qvoronoi/qvoronoi.c +fbeca66e16029e38c1ecfef02294387d *src/qvoronoi/qvoronoi.pro +42c25a668e35cd7aa8c6cac0b1de241f *src/qvoronoi/qvoronoi_r.c +63854e191e68440b691df57c19d47e10 *src/rbox/rbox.c +8528e43a27c17806d447b2bb20842aa0 *src/rbox/rbox.pro +a68b116647242e9111e8e7f19ff62d95 *src/rbox/rbox_r.c +7fc05de3e183a5de6712b391caaa79cf *src/testqset/testqset.c +8424a44ea97cc3f5bd1a04b74815bdb1 *src/testqset/testqset.pro +d87fa8259226adb84bc80cd5cb31e6a7 *src/testqset_r/testqset_r.c +b0953b95725a8782f192afea4fa469e7 *src/testqset_r/testqset_r.pro +df1e678a01abd7d0328cc0b9e85374e5 *src/user_eg/user_eg.c +a1c77e28793f660109ceb46c904e3e7d *src/user_eg/user_eg.pro +63fa2c535d8c152eb537f13337b7caa2 *src/user_eg/user_eg_r.c +49d35f12ff9400608884a6f115963a1a *src/user_eg2/user_eg2.c +a0bbf00f860f4cbbccada014cfc995e1 *src/user_eg2/user_eg2.pro +6a2977b32d1dade9af65e267488c8b14 *src/user_eg2/user_eg2_r.c +d7c41d0a8ffeae7a484cbab75d251b3a *src/user_eg3/user_eg3.pro +2a4a48ccfd29a8c3df92f8b2c64e373d *src/user_eg3/user_eg3_r.cpp diff -Nru qhull-2015.2/README.txt qhull-2020.2/README.txt --- qhull-2015.2/README.txt 2016-01-18 23:59:11.000000000 +0000 +++ qhull-2020.2/README.txt 2020-09-04 01:10:05.000000000 +0000 @@ -1,9 +1,9 @@ Name - qhull, rbox 2015.2 2016/01/18 + qhull, rbox 2020.2 2020/08/31 (8.0.2) Convex hull, Delaunay triangulation, Voronoi diagrams, Halfspace intersection - + Documentation: html/index.htm @@ -11,15 +11,15 @@ Available from: - (git@github.com:qhull/qhull.git) - + (git@github.com:qhull/qhull.git) + News and a paper: Version 1 (simplicial only): - + Purpose Qhull is a general dimension convex hull program that reads a set @@ -31,7 +31,7 @@ Rbox is a useful tool in generating input for Qhull; it generates hypercubes, diamonds, cones, circles, simplices, spirals, lattices, and random points. - + Qhull produces graphical output for Geomview. This helps with understanding the output. @@ -40,11 +40,10 @@ Qhull and rbox should run on all 32-bit and 64-bit computers. Use an ANSI C or C++ compiler to compile the program. The software is self-contained. It comes with examples and test scripts. - + Qhull's C++ interface uses the STL. The C++ test program uses QTestLib - from the Qt Framework. Qhull's C++ interface may change without - notice. Eventually, it will move into the qhull shared library. - + from the Qt Framework. + Qhull is copyrighted software. Please read COPYING.txt and REGISTER.txt before using or distributing Qhull. @@ -57,40 +56,60 @@ To modify Qhull, particularly the C++ interface Qhull is on GitHub - (http://github.com/qhull/qhull, git@github.com:qhull/qhull.git) - + (http://github.com/qhull/qhull/wiki, git@github.com:qhull/qhull.git) + For internal documentation, see html/qh-code.htm To install Qhull Qhull is precompiled for Windows 32-bit, otherwise it needs compilation. - + Qhull includes Makefiles for gcc and other targets, CMakeLists.txt for CMake, .sln/.vcproj/.vcxproj files for Microsoft Visual Studio, and .pro files for Qt Creator. It compiles under Windows with mingw. - + () + Install and build instructions follow. - + See the end of this document for a list of distributed files. ------------------ +------------------ +Index + +Installing Qhull on Windows 10, 8, 7 (32- or 64-bit), Windows XP, and Windows NT +Installing Qhull on Unix with gcc +Installing Qhull with CMake 2.6 or later +Installing Qhull with Qt +Working with Qhull's C++ interface +Calling Qhull from C programs +Compiling Qhull with Microsoft Visual C++ +Compiling Qhull with Qt Creator +Compiling Qhull with mingw/gcc on Windows +Compiling Qhull with cygwin on Windows +Compiling from Makfile without gcc +Compiling on other machines and compilers +Distributed files +Authors + +------------------ Installing Qhull on Windows 10, 8, 7 (32- or 64-bit), Windows XP, and Windows NT The zip file contains rbox.exe, qhull.exe, qconvex.exe, qdelaunay.exe, qhalf.exe, qvoronoi.exe, testqset.exe, user_eg*.exe, documentation files, and source files. Qhull.exe and user-eg3.exe are compiled with the reentrant library while the other executables use the non-reentrant library. - + To install Qhull: - Unzip the files into a directory (e.g., named 'qhull') - Click on QHULL-GO or open a command window into Qhull's bin directory. - Test with 'rbox D4 | qhull' - + To uninstall Qhull - Delete the qhull directory - + To learn about Qhull: - Execute 'qconvex' for a synopsis and examples. + Or 'qconvex --help' or 'qconvex -?' - Execute 'rbox 10 | qconvex' to compute the convex hull of 10 random points. - Execute 'rbox 10 | qconvex i TO file' to write results to 'file'. - Browse the documentation: qhull\html\index.htm @@ -110,65 +129,101 @@ - Click OK - Select 'Modify shortcut that started this window', then OK - If you use qhull a lot, install a bash shell such as - MSYS (www.mingw.org/wiki/msys), Road Bash (www.qhull.org/bash), - or Cygwin (www.cygwin.com). + If you regularly use qhull on a Windows host, install a bash shell such as + https://gitforwindows.org/ # based on MSYS2 + https://github.com/git-for-windows/git/wiki + http://www.msys2.org/ + https://github.com/msys2/msys2/wiki + [mar'19] Git for Windows v2.21 requires 'qhull --help' + Install in C:\Git\... # Not 'Program Files\...' otherwise './configure && make' fails + www.cygwin.com + www.mingw.org/wiki/msys # for Windows XP + Road Bash (www.qhull.org/bash) # based on MSYS ------------------ +------------------ Installing Qhull on Unix with gcc To build Qhull, static libraries, shared library, and C++ interface - Download and extract Qhull (either GitHub, .tgz file, or .zip file) - make - export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH + - make test + + 'make install' installs Qhull at '/usr/local/'. It installs pkg-config files + at '/usr/local/lib/pkgconfig'. Change the install directory with DESTDIR and PREFIX. + + To build 32-bit Qhull on a 64-bit host (uses 33% less memory in 4-d) + - make new M32=-m32 + + To build 32-bit Qhull without -fpic (may be faster, but shared library may fail) + - make new M32=-m32 FPIC= The Makefiles may be edited for other compilers. If 'testqset' exits with an error, qhull is broken - + A simple Makefile for Qhull is in src/libqhull and src/libqhull_r. To build the Qhull executables and libqhullstatic - Extract Qhull from qhull...tgz or qhull...zip - cd src/libqhull_r # cd src/libqhull - make - ------------------ + +------------------ Installing Qhull with CMake 2.6 or later See CMakeLists.txt for examples and further build instructions - + To build Qhull, static libraries, shared library, and C++ interface - Download and extract Qhull (either GitHub, .tgz file, or .zip file) - cd build - - cmake --help # List build generators - - make -G "" .. && cmake .. - - cmake .. + - cmake --help # List build generators + - cmake -G "" .. # e.g., for MINGW-w64 -- cmake -G "MSYS Makefiles" .. + - cmake .. - make - - make install + - ctest + - make install # If MSYS or UNIX, default CMAKE_INSTALL_PREFIX is '/usr/local' + # otherwise if WINDOWS, installs to ../bin, ../include, and ../lib + - make uninstall # Delete the files in install_manifest.txt The ".." is important. It refers to the parent directory (i.e., qhull/) + + CMake installs lib/pkgconfig/qhull*.pc for use with pkg-config - On Windows, CMake installs to C:/Program Files/qhull. 64-bit generators - have a "Win64" tag. + If CMAKE_INSTALL_PREFIX is C:/Program Files/qhull, you may need to give 'Users' "full control" + to qhull's sub-directories: bin, doc, include, lib, and man (folder > Properties > Security > Edit > Users). - If creating a qhull package, please include a pkg-config file based on build/qhull*.pc.in + On Windows, CMake's 64-bit generators have a "Win64" tag. Qhull's data structures + are substantial larger as 64-bit code than as 32-bit code. This may slow down Qhull. If cmake fails with "No CMAKE_C_COMPILER could be found" - cmake was not able to find the build environment specified by -G "..." - ------------------ + + If cmake's gcc smoketest fails after a Windows update + - Reinstall MINGW-w64 and delete CMakeCache.txt. A Windows update can break gcc process creation for cc1. + +------------------ Installing Qhull with Qt - To build Qhull, including its C++ test (qhulltest) + To build Qhull, including its C++ test program (qhulltest) - Download and extract Qhull (either GitHub, .tgz file, or .zip file) - Load src/qhull-all.pro into QtCreator + - Configure the project to use a Shadow build at the same level as 'src', 'bin', and 'lib' + If, instead, the shadow build is a subdirectory of 'build', Qt Creator will install Qhull in 'build/bin' and 'build/lib' - Build + + - Build qhulltest with a C++11 or later compiler + - qhulltest depends on shared libraries QtCore.a and QtTest.a. They may need to be copied + into the bin directory. On Windows, copy Qt5Core.dll and Qt5Test.dll, e.g., /qt/5.11.2/msvc2017_64/bin + - If qhulltest fails with exit status 127 and no error message, + check for missing Q5Core.dll and Qt5Test.dll -------------------- +------------------ Working with Qhull's C++ interface See html/qh-code.htm#cpp for calling Qhull from C++ programs + Class and method documentation is limited + See html/qh-code.htm#reentrant for converting from Qhull-2012 Examples of using the C++ interface @@ -177,29 +232,42 @@ Qhull's C++ interface is likely to change. Stay current with GitHub. - To clone Qhull's next branch from http://github.com/qhull/qhull + To clone Qhull's next branch from http://github.com/qhull/qhull/wiki git init git clone git@github.com:qhull/qhull.git cd qhull git checkout next ... git pull origin next - + Compile qhullcpp and libqhullstatic_r with the same compiler. Both libraries use the C routines setjmp() and longjmp() for error handling. They must be compiled with the same compiler. - -------------------- + + Qhull provides pkg-config support with build/qhull.pc.in and lib/pkgconfig/qhull*.pc + With back-ticks, you can compile your C++ program with the Qhull libraries: + g++ `pkg-config --cflags --libs qhullcpp qhullstatic_r` -o my_app my_app.cpp + or + g++ `pkg-config --cflags --libs qhullcpp qhull_r` -o my_app my_app.cpp + + qhullcpp must be linked before qhull_r, otherwise the linker reports + an error -- "QhullUser ... multiple definition of `qh_fprintf'" + +------------------ Calling Qhull from C programs See html/qh-code.htm#library for calling Qhull from C programs + Qhull provides pkg-config support with build/qhull.pc.in and lib/pkgconfig/qhull*.pc + With back-ticks, you can compile your C program with the Qhull library + gcc `pkg-config --cflags --libs qhull_r` -o my_app my_app.c + See html/qh-code.htm#reentrant for converting from Qhull-2012 Warning: You will need to understand Qhull's data structures and read the code. Most users will find it easier to call Qhull as an external command. - The new, reentrant 'C' code (src/libqhull_r), passes a pointer to qhT + The reentrant 'C' code (src/libqhull_r), passes a pointer to qhT to most Qhull routines. This allows multiple instances of Qhull to run at the same time. It simplifies the C++ interface. @@ -214,21 +282,33 @@ To compile 32-bit Qhull with Microsoft Visual C++ 2010 and later - Download and extract Qhull (either GitHub, .tgz file, or .zip file) - - Load solution build/qhull-32.sln + - Load solution build/qhull-32.sln + - Right-click 'Retarget solution' from toolset v110 to your Platform Toolset + File > Save All - Build target 'Win32' - Project qhulltest requires Qt for DevStudio (http://www.qt.io) Set the QTDIR environment variable to your Qt directory (e.g., c:/qt/5.2.0/5.2.0/msvc2012) If QTDIR is incorrect, precompile will fail with 'Can not locate the file specified' + - Copy Qt shared libraries, QtCore.dll and QtTest.dll, into the bin directory To compile 64-bit Qhull with Microsoft Visual C++ 2010 and later - - 64-bit Qhull has larger data structures due to 64-bit pointers + - 64-bit Qhull has larger data structures due to 64-bit pointers. This may slow down Qhull. - Download and extract Qhull (either GitHub, .tgz file, or .zip file) - Load solution build/qhull-64.sln - - Build target 'Win32' + - Right-click 'Retarget solution' from toolset v110 to your Platform Toolset + File > Save All + - Build target 'x64' + - If build as 32-bit fails, use solution build/qhull-32.sln - Project qhulltest requires Qt for DevStudio (http://www.qt.io) Set the QTDIR environment variable to your Qt directory (e.g., c:/qt/5.2.0/5.2.0/msvc2012_64) If QTDIR is incorrect, precompile will fail with 'Can not locate the file specified' + If error -- MSB8020: The build tools for Visual Studio 2012 (Platform Toolset = 'v110') cannot be found. + - 'Project > Retarget solution' for both qhull-32.sln and qhull-64.sln + - 'File > Open' your preferred solution (qhull-32.sln or qhull-64.sln) + - 'Save All' both projects + - DevStudio may need a restart + To compile Qhull with Microsoft Visual C++ 2005 (vcproj files) - Download and extract Qhull (either GitHub, .tgz file, or .zip file) - Load solution build/qhull.sln @@ -236,33 +316,58 @@ - Project qhulltest requires Qt for DevStudio (http://www.qt.io) Set the QTDIR environment variable to your Qt directory (e.g., c:/qt/4.7.4) If QTDIR is incorrect, precompile will fail with 'Can not locate the file specified' - ------------------ + +------------------ Compiling Qhull with Qt Creator Qt (http://www.qt.io) is a C++ framework for Windows, Linux, and Macintosh Qhull uses QTestLib to test qhull's C++ interface (see src/qhulltest/) - + To compile Qhull with Qt Creator - Download and extract Qhull (either GitHub, .tgz file, or .zip file) - Download the Qt SDK - Start Qt Creator - Load src/qhull-all.pro + - Configure the project to use a Shadow build at the same level as 'src', 'bin', and 'lib' + If, instead, the shadow build is a subdirectory of 'build', Qt Creator will install Qhull in 'build/bin' and 'build/lib' - Build + + - Build qhulltest with a C++11 or later compiler + - qhulltest depends on shared libraries QtCore.a and QtTest.a. They may need to be copied + into the bin directory. On Windows, copy Qt5Core.dll and Qt5Test.dll, e.g., /qt/5.11.2/msvc2017_64/bin + - If qhulltest fails with exit status 127 and no error message, + check for missing Q5Core.dll and Qt5Test.dll ------------------ -Compiling Qhull with mingw on Windows +------------------ +Compiling Qhull with mingw/gcc on Windows To compile Qhull with MINGW - Download and extract Qhull (either GitHub, .tgz file, or .zip file) - - Install Road Bash (http://www.qhull.org/bash) - or install MSYS (http://www.mingw.org/wiki/msys) - - Install MINGW-w64 (http://sourceforge.net/projects/mingw-w64). - Mingw is included with Qt SDK. - - make - ------------------ + - Install GitForWindows (https://gitforwindows.org/) + or MSYS2 (http://www.msys2.org/) + Install in C:\Git\... # Not 'Program Files\...' otherwise './configure && make' will not work + - Install MINGW-w64 with gcc (https://mingw-w64.org/) + 1) Goto sourceforge -- https://sourceforge.net/projects/mingw-w64/files/ + 2) in folder -- mingw-w64 + 3) download installer -- MinGW-W64-install.exe + Run the installer + 1) Select i686/posix/dwarf + 2) Install in 'C:\mingw-w64' # Not 'Program Files\...' + Rename /c/mingw-w64/mingw32/bin/mingw32-make.exe to make.exe + Add the 'C:\mingw-w64\mingw32\bin' directory to your $PATH environment variable + Execute 'which make' to check that 'make' is mingw-w64's make + - Compile Qhull from the home directory + make help + make + + Notes + - Mingw is included with Qt SDK in qt/Tools/mingw53_32 + - If you use Windows XP + Install Road Bash (http://www.qhull.org/bash) or MSYS (http://www.mingw.org/wiki/msys) + Install MINGW (http://mingw.org/) + +------------------ Compiling Qhull with cygwin on Windows To compile Qhull with cygwin @@ -271,18 +376,18 @@ - Include packages for gcc, make, ar, and ln - make ------------------ +------------------ Compiling from Makfile without gcc The file, qhull-src.tgz, contains documentation and source files for qhull and rbox. - + To unpack the tgz file - tar zxf qhull-src.tgz - cd qhull - Use qhull/Makefile Simpler Makefiles are qhull/src/libqhull/Makefile and qhull/src/libqhull_r/Makefile - + Compiling qhull and rbox with Makefile - in Makefile, check the CC, CCOPTS1, PRINTMAN, and PRINTC defines - the defaults are gcc and enscript @@ -326,16 +431,16 @@ Qhull may compile with Borland C++ 5.0 bcc32. A Makefile is included. Execute 'cd src/libqhull; make -f Mborland'. If you use the Borland IDE, set the ANSI option in Options:Project:Compiler:Source:Language-compliance. - + Qhull may compile with Borland C++ 4.02 for Win32 and DOS Power Pack. Use 'cd src/libqhull; make -f Mborland -D_DPMI'. Qhull 1.0 compiles with Borland C++ 4.02. For rbox 1.0, use "bcc32 -WX -w- -O2-e -erbox -lc rbox.c". Use the same options for Qhull 1.0. [D. Zwick] - + If you have troubles with the memory manager, you can turn it off by defining qh_NOmem in mem.h. ------------------ +------------------ Distributed files README.txt // Instructions for installing Qhull @@ -344,20 +449,23 @@ QHULL-GO.lnk // Windows icon for eg/qhull-go.bat Announce.txt // Announcement CMakeLists.txt // CMake build file (2.6 or later) - CMakeModules/CheckLFS.cmake // enables Large File Support in cmake File_id.diz // Package descriptor index.htm // Home page Makefile // Makefile for gcc and other compilers qhull*.md5sum // md5sum for all files bin/* // Qhull executables and dll (.zip only) - build/qhull*.pc.in // pkg-config templates for qhull_r, qhull, and qhull_p + build/CMakeModules/CheckLFS.cmake // enables Large File Support in CMake + build/config.cmake.in // extract target variables + build/qhull.pc.in // pkg-config template for creating lib/pkgconfig/qhull*.pc build/qhull-32.sln // 32-bit DevStudio solution and project files (2010 and later) build/*-32.vcxproj build/qhull-64.sln // 64-bit DevStudio solution and project files (2010 and later) build/*-64.vcxproj build/qhull.sln // DevStudio solution and project files (2005 and 2009) build/*.vcproj + build/qhulltest/ // DevStudio project files for qhulltest (C++ and Qt) + build/README-build.txt // Contents of build/ eg/* // Test scripts and geomview files from q_eg html/index.htm // Manual html/qh-faq.htm // Frequently asked questions @@ -367,13 +475,19 @@ src/qhull-all.pro // Qt project eg/ + q_benchmark // shell script for precision and performance benchmark + q_benchmark-ok.txt // reviewed output from q_benchmark q_eg // shell script for Geomview examples (eg.01.cube) q_egtest // shell script for Geomview test examples q_test // shell script to test qhull - q_test-ok.txt // output from q_test - qhulltest-ok.txt // output from qhulltest (Qt only) - make-vcproj.sh // bash shell script to create vcproj and vcxprog files - qhull-zip.sh // bash shell script for distribution files + q_test.bat // Windows batch test for QHULL-GO.bat + // cd bin; ..\eg\q_test.bat >q_test.x 2>&1 + q_test-ok.txt // reviewed output from q_test + qhulltest-ok.txt // reviewed output from qhulltest (Qt only) + make-qhull_qh.sh // shell script to create non-reentrant qhull_qh from reentrant Qhull + make-vcproj.sh // shell script to create vcproj and vcxprog files + qhull-zip.sh // shell script to create distribution files + qtest.sh // shell script for testing and logging qhull rbox consists of (bin, html): rbox.exe // Win32 executable (.zip only) @@ -403,6 +517,7 @@ qh-quick.htm qh--*.gif // images for manual normal_voronoi_knauss_oesterle.jpg + qh_findbestfacet-drielsma.pdf qhull.man // Unix man page qhull.txt @@ -432,12 +547,14 @@ testqset_r/testqset_r.c // Test of reentrant qset_r.c and mem_r.c testqset/testqset.c // Test of non-rentrant qset.c and mem.c - src/libqhull libqhull.pro // Qt project for non-rentrant, shared library (qhull.dll) index.htm // design documentation for libqhull qh-*.htm - qhull-exports.def // Export Definition file for Visual C++ + qhull-exports.def // Export Definition files for Visual C++ + qhull-nomerge-exports.def + qhull_p-exports.def + qhull_p-nomerge-exports.def Makefile // Simple gcc Makefile for qhull and libqhullstatic.a Mborland // Makefile for Borland C++ 5.0 @@ -475,7 +592,8 @@ libqhull_r.pro // Qt project for rentrant, shared library (qhull_r.dll) index.htm // design documentation for libqhull_r qh-*_r.htm - qhull-exports_r.def // Export Definition file for Visual C++ + qhull_r-exports.def // Export Definition files for Visual C++ + qhull_r-nomerge-exports.def Makefile // Simple gcc Makefile for qhull and libqhullstatic.a libqhull_r.h // header file for qhull @@ -512,7 +630,7 @@ Qhull.cpp // Calls libqhull_r.c from C++ Qhull.h qt-qhull.cpp // Supporting methods for Qt - + Coordinates.cpp // input classes Coordinates.h @@ -532,7 +650,7 @@ QhullRidge.h QhullVertex.cpp QhullVertex.h - + QhullFacetList.cpp // collection classes QhullFacetList.h QhullFacetSet.cpp @@ -556,6 +674,8 @@ QhullQh.h QhullStat.cpp QhullStat.h + QhullUser.cpp + QhullUser.h RoadError.cpp // Supporting base classes RoadError.h RoadLogEvent.cpp @@ -564,10 +684,10 @@ src/libqhullstatic/ libqhullstatic.pro // Qt project for non-reentrant, static library - + src/libqhullstatic_r/ libqhullstatic_r.pro // Qt project for reentrant, static library - + src/qhulltest/ qhulltest.pro // Qt project for test of C++ interface Coordinates_test.cpp // Test of each class @@ -589,12 +709,12 @@ RoadTest.cpp // Run multiple test files with QTestLib RoadTest.h ------------------ -Authors: +------------------ +Authors C. Bradford Barber Hannu Huhdanpaa (Version 1.0) bradb@shore.net hannu@qhull.org - + Qhull 1.0 and 2.0 were developed under NSF grants NSF/DMS-8920161 and NSF-CCR-91-15793 750-7504 at the Geometry Center and Harvard University. If you find Qhull useful, please let us know. diff -Nru qhull-2015.2/src/Changes.txt qhull-2020.2/src/Changes.txt --- qhull-2015.2/src/Changes.txt 2016-01-19 03:02:21.000000000 +0000 +++ qhull-2020.2/src/Changes.txt 2020-09-04 02:07:25.000000000 +0000 @@ -1,20 +1,908 @@ -$Id: //main/2015/qhull/src/Changes.txt#28 $ +$Id: //main/2019/qhull/src/Changes.txt#77 $$Date: 2020/09/03 $ .............This file lists all changes to qhull and rbox..................... +==== +== Contents +==== + +To do +Qhull 2018-2020 +Qhull 2015 +Qhull 2012.1 +Qhull 2011.1 +Qhull 2010.1 and 2009.1 +Qhull 2003.1 +Qhull 2002.1 +Qhull 3.1 (2001) +Qhull 2.6 (1999) +Qhull 2.5 (1998) +Qhull 2.4 (1997) +Qhull 2.3 (1996) +Qhull 2.2 (1995-1996) +Qhull 2.1 (1995) +Qhull 2.0 (1994-1995) + +==== +== To do +==== + +- For a list of enhancement requests, see + http://www.qhull.org/html/qh-code.htm#enhance +- The C++ interface needs documentation. + Give C++ a try and make it better. + http://github.com/qhull/qhull/wiki +- Expand the C++ interface for Voronoi diagrams + Design for arbitrary dimension with non-simplicial facets + Start with 'user_eg3 eg-voronoi eg-fifo' + Compute the convex hull of each Voronoi region + Compare its facet hyperplanes with eg-fifo + Create a data structure for the Voronoi diagram + Compare your result to CGAL's 2-d Voronoi diagram + Two CGAL halfedges is equivalent to a Qhull ridge + https://doc.cgal.org/4.7/Voronoi_diagram_2/group__PkgVoronoiDiagramAdaptor2.html + +================== +== Qhull 2018-2020 +================== + +------------ +Qhull 2020.2 2020/08/31 (8.0.2) + +CMake builds +- CMakeLists.txt: Fixed /usr/local/lib/pkgconfig for debug builds +- CMakeLists.txt: Remove qhull_SHARED and qhull_SHAREDP from 'make all' + Remove qhull_SHARED and qhull_SHAREDP from qhull_TARGETS_SHARED + Use reentrant Qhull (libqhull_r) for user code +- CMakeLists.txt: If "MSYS Makefiles", change the default CMAKE_INSTALL_PREFIX to "/usr/local" + Remove WIN32 conditionals from MAN_INSTALL_DIR and DOC_INSTALL_DIR +- CMakeLists.txt: Add 'uninstall' to delete the files listed in install_manifest.txt +- CMakeLists.txt: If LINK_APPS_SHARED, link qhull applications to libqhull_r.so [S. Bruens #69] + If BUILD_STATIC_LIBS=OFF or BUILD_SHARED_LIBS=OFF, exclude those libraries [S. Bruens #69] + libqhullcpp and user_eg3 are built only if BUILD_STATIC_LIBS is true +- CMakeModules/CheckLFS.cmake: Moved CMakeModules to the build/ directory +- CMakeLists.txt: Replace rbox_SOURCES(etc.) with a source file, either reentrant or non-reentrant +- CMakeLists.txt: Add deprecated libqhull and qhull_p to "# Additional build targets" + If not MSVC, add qh_QHpointer to user_egp_DEFINES and qhullp_DEFINES (otherwise qh_lib_check fails) + +Other builds +- build/README-build.txt: Add description of build/ directory +- build/qhull*.sln: Remove qhull_p and qhull_p.dll, retain the corresponding DevStudio project files + Remove libqhull and qhull.dll, retain the corresponding DevStudio project files +- Makefile: Add libqhull_r/libqhullstatic_r.a to 'cleanall' +- Makefile: Add note about installing debug libraries (e.g., libqhull_rd) +- Makefile,libqhull*/Makefile: Copy README.txt,...,Changes.txt and html/* to ABS_DOCDIR +- Makefile,libqhull*/Makefile: Add target 'uninstall' to delete installed Qhull files +- libqhull/qhull-exports.def,qhull-nomerge-exports.def: Add qh_nextfacet2d + +Documentation +- html/qh-code.htm: Add request for Doxygen documentation of the C++ interface +- html/index.htm,etc: "Contents" instead of "Table of Contents" + +Testing +- eg/make-qhull_qh.sh: Redo help prompt +- eg/make-qhull_qh.sh: Create src/qhull_qh/_QH_CONVERTED_FILES as a safety check +- eg/make-qhull_qh.sh: Require destination directory and _QH_CONVERTED_FILES for 'sed-only' + +------------ +Qhull Github + +C++ interface +- libqhullcpp/qt-qhull.cpp: In toQList(), use count() to avoid a type error +- libqhullcpp/qt-qhull.cpp: In toQList(), use nullptr instead of NULL +- libqhullcpp/QhullSet.h: Declare 'QList toQList() const' to avoid a prototype error + +Builds +- Qhull build systems: Add wiki page on build systems to GitHub +- CMakeLists.txt: Use same target name for Debug and non-Debug builds [Spacelm #76] +- CMakeLists.txt: Remove functional documentation from /usr/local/include/libqhull* + Most of the links are broken. +- CMakeLists.txt: Move Qhull html documentation to /usr/local/share/doc/qhull/html/ + Otherwise index.htm is overwritten and README links are broken +- CMakeLists.txt: Add /usr/local/share/doc/qhull/src/Changes.txt +- Makefile, make install: Remove functional documentation from /usr/local/include/libqhull + and /usr/local/include/libqhullinclude/libqhull_r. Most of the links are broken. +- Makefile, src/libqhull/Makefile: Add DEPRECATED.txt to /usr/local/include/libqhull +- Makefile, src/libqhull*/Makefile: Add 'make install' to the welcome prompt + +Documentation +- index.htm: Balance the top-page 'URL:' and 'To:' links +- index.htm: Send the top-page 'Functions' link to www.qhull.org (better 'src' links) +- index.htm: Make the bottom-page 'URL:' and 'To:' links the same as the top-page links +- index.htm: "please use rentrant Qhull (libqhull_r or libqhullstatic_r)" +- html/index.htm: Add rbox.txt to Contents and rename "Table of Contents" +- html/index.htm,qh-code.htm,qh-eg.htm,qh-impre.htm: Remove 'please wait while loading' +- README.txt/Installing Qhull with Qt: The shadow build directory should be at the same level as 'src' +- README.txt/Compiling Qhull with Qt Creator: Copy steps from 'Installing Qhull with Qt' + +------------ +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". + ------------ -Need help - - Write an incremental addPoint using bucketed inputs and facet location search (see CGAL) - - Compute hyperplanes in parallel (cf. qh_setfactplane) - - Create Voronoi volumes and topology using a parallel implementation - - Produce conformant triangulations for merged facets using option 'Qt' - - Integrate 4dview with Geomview 1.9.5 - - Qhull needs RPM and Debian builds (CMake's CPackRMP and CPackDeb). - - Qhull needs a mirror/archive site for old and new builds - - Constrained delaunay triangulation via Shewchuk's algorithm (ACM Symp. Comp. Geo., 1998) - - More enhancements -- http://www.qhull.org/html/qh-code.htm#enhance - - The C++ interface needs work. Give it a try and make it better. - http://github.com/qhull/qhull/wiki +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 + +------------ +Qhull 2019.1 github 2019/10/24 + +Documentation +- Review and fix Qhull html and option links +- README.txt/mingw: Install GitForWindows in C:\Git\ +- libqhull_r/index.htm: Fixed Firefox web access to '.c' and '.h' files (http://qhull.org/src/libqhull_r/) + +Bugs fixed +- merge_r.c/qh_appendmergeset,qh_appendvertexmerge,qh_mergefacet,qh_tracemerge: + fix error check of index for mergetypes + +Build +- CMakeLists.txt: Rename Qhull to QhullExport for QhullConfig. On MacOS, "Qhull" conflicts with "qhull" [tamasmeszaros #48, C. Xu, tschoonj] +- CMakeLists.txt: Add POSITION_INDEPENDENT_CODE "TRUE" to set_target_properties for libqhullcpp [J Anderson 11/20/2019 #47] + +------------ +Qhull 2019.1 2019/06/21 (7.3.2) + +bugs fixed +- Fixed broken HTML links identified by Firefox Link Analyzer. Replace old links with web.archive.org (archive.is) +- Moved live code out of qh_NOtrace regions +- qh-faq.htm#learn: fixed the Delaunay examples (rbox generates a square, but does not generate two squares) +- geom2_r.c/qh_maxmin: qh_scalelast for 'd Qbb' to qh.MAXabs_coord instead of qh.MAXwidth [J.R. Roussel, D. Sterratt] +- geom2_r.c/qh_maxsimplex: estimate targetdet as prevdet*qh.MAXwidth, set mindet to 10*qh_RATIOmaxsimplex [J.R. Roussel, D. Sterratt] +- global_r.c/qh_freebuild: in high-D, simplicial facets may use long memory +- global_r.c/qh_initqhull_globals: set qh.DOcheckmax and qh.KEEPnearinside if qh.APPROXhull ('Wn', rbox 100 D3 W1e-1 | qhull QJ W1e-1 Tv) +- libqhull_r.c/qh_addpoint: add qh.lastmerges to qh_addpoint trace +- libqhull_r.c/qh_buildcone_mergepinched: called qh_partitioncoplanar with uninitialized 'dist' +- libqhull_r.c/qh_build_withrestart: if qh_joggle_restart, set v.partitioned for qh.del_vertices. Avoid error in qh_delvertex from qh_freebuild +- libqhull_r.c/qh_partitionall: if qh.KEEPnearinside, qh_partitionpoint for non-outside pointset +- libqhull_r.c/qh_partitioncoplanar: define qh.coplanar_apex to prevent infinite loop of repartition point +- merge_r.c/qh_checkzero: check opposite vertex against -2*qh.DISTround to account for qh_distround and 'Rn' +- merge_r.c/qh_comparevisit: fix compare of 'unsigned int' +- poly2_r.c/qh_findbestfacet: for Delaunay triangulations, may be an adjacent triangle [F. Drielsma] + Updated discussion at qh-code.htm/findfacet and examples at user_eg_r.c and user_eg2_r.c +- poly2_r.c/qh_findfacet_all: do not search visible facets, and if qh_NOupper, f.upperdelaunay facets [P. Virtanen, S. Dominguez, J.Arkin] +- poly2_r.c/qh_initialhull: reverse orientation if clearly flipped. qh_ERRsingular if maybe flipped [S. Caron, P. Virtanen, D. Sterratt, others] +- poly2_r.c/qh_initialhull: test for coplanar qh.interior_point with 'allerror' (dist >= -qh.DISTround) [S. Caron, P. Virtanen, D. Sterratt, others] +- poly2_r.c/qh_initialhull: call qh_joggle_restart for qh.DELAUNAY if cospherical input sites [P. Celba] +- poly2_r.c/qh_initbuild: qh_scalelast for 'd Qbb' to qh.MAXabs_coord instead of qh.MAXwidth [J.R. Roussel, D. Sterratt] +- random_r.c/qh_argv_to_command_size: returned size may be < 1. If so, rbox.c/main reports an error +- rboxlib_r.c/qh_rboxpoints: report error for coincident, regular points 'rbox r C1,1e-13' +- stat_r.c/qh_initstatistics: missing call to qh_allstatistics for qh_newstats. qh_checkoutput ignored +- userprintf.c/qh_fprintf: fixed 2019.0.1 bug if 'qh_qh' is NULL for qh_QHpointer +- Qhull.cpp/outputQhull: fixed missed conditional if qh.GOODvertex == -qh.GOODpoint + +documentation and web site +- Add notes that Qhull 64-bit code uses 50% more memory than 32-bit code. This slows down Qhull. + A future version of Qhull will include memory and performance improvements for 64-bit code. +- Add the Qhull identity pipeline to html/qhalf.htm +- Enabled PDF download from portal.acm.org +- Error exit from qhull,qconvex,etc. returns a 6xxx error code if available +- Rename md5sum files back to *-tgz.md5sum and *-zip.md5sum + Both Firefox and IE convert *.tgz.md5sum and *.zip.md5sum as .tgz/.zip files +- html/qh-code.htm: add sections on debugging Qhull +- html/qh-faq.html: reviewed startup questions for Qhull +- html/qh-opto.htm: the centrum indices for option 'i' are one more than the centrum indices for option 'Ft' + +build and test +- CMakeLists.txt: export QhullTargets for config.cmake.in and find_package [tamasmeszaros] +- eg/q_benchmark: add 'uname -a' for host identification +- eg/q_test.bat: update for changes to q_test + removed redirects on every line (invoke with redirection) +- eg/q_test: add some tests for option warnings and errors +- Makefile: add dependencies for 'install', 'test', 'qtest', and 'qconvex-prompt' [V. Delecroix] +- Makefile: set -m32 as default for gcc builds. Uses less memory on 64-bit hosts. + disable with 'make M32=' +- Remove 'unused parameter' warnings if qh_NOmerge +- Tested qh_QHpointer, qh_NOmem, qh_NOmerge, qh_NOtrace, qh_KEEPstatistics 0 +- Tested qh_NOmerge with qh_NOtrace and qh_KEEPstatistics 0. Simpler code, fewer errors, 35% smaller +- Tested random qh_distplane and qh_setplane qh_RANDOMdist 1e-5, qh_RANDOMdist 1e-13 +- user_r.h: define qh_RANDOMdist to perturb all calls to qh_distplane, qh_newfacetplane by 'Rn' + +other changes +- Replace 'unsigned' with 'unsigned int', for consistency +- Replace warning 6263 with 7079 in qconvex_r.c, etc. +- Resolved C warnings for -Wsign-conversion, mostly type casts + Continue to use -Wno-sign-conversion for C++ due to countT, boolT, int vs. size_t mismatches +- Reviewed gcc 8.1.0 warnings. See Makefile CC_WARNINGS and CXX_WARNINGS + Type cast (int)sizeof(facetT),etc. as needed +- Reviewed error and warning codes for multiple instances of the same code +- Reviewed file references such as libqhull_r.c vs libqhull.c +- Reviewed multi-line, error message width for 80 column output +- global.c/qh_initflags: Add 'qh_QHpointer' to qh_option for option list +- geom2_r.c/qh_joggleinput: report QH6010, current joggle is too large, as qh_ERRinput +- geom2_r.c/qh_maxsimplex: report error if qh.MAXwidth not defined, for estimating the determinates +- geom2_r.c/qh_minmax: if tracing, log min and max coordinates [J.R. Roussel, D. Sterratt] +- io_r.c/qh_printbegin: rewrote warning QH7053, use 'p' or 'o' for Voronoi centers +- io_r.c/qh_produce_output2: fflush to maintain execution order of output +- libqhull_r.c/qh_buildtracing: change qh.lastfacets, qh.lastplanes, qh.lastdist to 'int' +- libqhull_r.c/qh_build_withrestart: change error QH6229, 101 attempts to joggle input, to qh_ERRinput and 51 attempts +- merge_r.c/qh_renameridgevertex: report error if old vertex not found +- poly_r.c/qh_update_vertexneighbors: use qh_setappend instead of qh_setunique for newly created facets (restores 2015.2 code) +- poly2_r.c/qh_check_point: limit 'Tv' errors to qh_MAXcheckpoint per facet +- poly2_r.c/qh_initialhull: rewrite QH6329 for cospherical input sites and add qh_printvertexlist [P. Celba] +- qset_r.c/qh_setlarger_quick: optimize qh_setlarger for quick memory +- rboxlib_r.c/qh_rboxpoints2: fix strncat to resolve -Wstringop-truncation warning [D. Sterratt] + increased command[] to 250 and decreased seedbuf[] to 50 +- user_r.h/qh_JOGGLEmaxretry: reduced from 100 iterations to 50 iterations +- user_r.c/qh_new_qhull: allow "qhull" for the qhull_cmd parameter +- user_eg_r.c/findDelaunay: qh_findbestfacet returns the closest Delaunay triangle or an adjacent triangle +- user_eg2_r.c/findDelaunay: qh_findbestfacet returns the closest Delaunay triangle or an adjacent triangle +- userprintf_r.c/qh_fprintf: set qh.last_errcode for MSG_ERROR (6000) codes +- RboxPoints::qh_fprintf_rbox: print error message to stderr if cpp_object undefined + +------------ +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 warnings +- 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:' and renamed as MSG_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 ''. 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 [J. Romain] +- 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 + +------------ +Qhull 2018.0.1 2018/12/28 (7.3.0) + +Qhull options + - If unknown option, report error QH6035 instead of warning QH7035. Override with Qw + - Add option 'Tf' to flush each qh_fprintf for debugging segfaults + - Add Q14-ignore-pinched-vertices: ignore pinched vertices due to dupridge + Default if post-merge only ('Cn'), 'Qgood-only', or 2-d convex hulls + - Expand Q12-allow-wide to include wide facet errors reported by qh_check_maxout and qh_merge_facet + - 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 + +Qhull builds + - Move 'extern "C" {}' logic from C++ to C headers [C. Atkins, nine7nine, W. Scullin, M. Culpo] + - build/*-64.vcxproj Updated for tool set 8.1 + - CMakeLists.txt: Add note for "dynamic linking" of qhull executables [M. Atzeri] + - CMakeLists.txt: Revert accidental commit cea6d22 [pchilds, QuLogic, fabiencastan, daniel-packard] + +Bugs fixed + - html/*.htm: fix trailing
      after 'Comments to:' + - 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 + - Qhull.cpp/outputQhull: do not call qh_check_points if qh.FORCEoutput + - stat_r.c/qh_printallstatistics,qh_printstatistics: 'const char *string' instead of 'char *string' for !qh_KEEPstatistics + - user_r.c/qh_new_qhull: do not call qh_check_points if qh.FORCEoutput + - user_eg2.c: do not call qh_check_points if qh.FORCEoutput + +Qhull error reporting + - io_r.c/qh_readpoints: improved formating of error "QH6410 ... instead of n points" + - 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 + - libqulll_r.c/qh_printsummary: if qh.ERREXITcalled and qh.DELAUNAY, update f.good and qh.num_good (qh_findgood_all) + - 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 (allow with 'Q12') + - 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 (allow with 'Q12') + - 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 'Repaired by qh_remove_extravertices' as trace4 (QH4025) 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 if 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_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.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_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_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 tracing and code comments throughout + - Moved qh_check_dupridge from poly2_r.c to merge_r.c. It is used for merging + - 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_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_update_vertexneighbors: 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 + +------------ +Qhull github 2018 + +- Fixed confusing indentation [A. Lee 2018/12/28] +- Add labels for each release [A. Mailaga 2016/7/5] +- Add 'typename qualifier to QhullSet [D. Gomes 2016/6/16] +- Make C headers safe for C++ inclusion [C. Atkins 2016/01/20] +- build/qhull*.pc.in: Removed templates for pkg-config (not updated for Qhull 2015) + +============= +== Qhull 2015 +============= ------------ Qhull 2015.2 2016/01/18 (7.2.0) @@ -71,7 +959,7 @@ - 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 @@ -88,9 +976,9 @@ ------------ Qhull 2015.1 2016/01/03 (7.1.0) - Add Rbox option 'Cn,r,m' to add nearly coincident points. Trigger for duplicate ridges - - Add Qhull option 'Q12' to ignore error on wide merge due to duplicate ridge + - Add Qhull option 'Q12' to allow wide merge due to a dupridge - - qh_findbestlower: Call qh_findfacet_all to fix rare "flipped or upper Delaunay" error QH6228. + - qh_findbestlower: Call qh_findfacet_all to fix rare "flipped or upper Delaunay" error QH6228 (now QH3025) QH6228 input provided by J. Metz. Reported (date order): L. Fiaschi, N. Bowler, A. Liebscher, V. Vieira, N. Rhinehart, N. Vance, P. Shafer - qh_check_dupridge: Check if wide merge due to duplicate ridge from nearly coincident points - qh_initialhull: Fix error messages for initial simplex is flat @@ -155,7 +1043,7 @@ - usermem_r-cpp.cpp: Optional file to redefine qh_exit() as throw "QH10003.." [B. Pearlmutter] qh_exit() is called by qhull_r when qh_errexit() is not available. -- html/index.htm: Add bibliographic reference to Golub & van Loan and annotated the source references +- html/index.htm: Add bibliographic reference to Golub & van Loan and other references [R. Gaul] - qhalf.htm: A halfspace is the points on or below a hyperplane [D. Strawn] - qh-opto.htm#n: Defined inside, outside, on, above, and below a hyperplane [D. Strawn] - qhalf.htm#notes: Recast the linear program using negative halfspaces (as used by Qhull) [D. Strawn] @@ -223,8 +1111,8 @@ ------------ Qhull 2015.0.1 2015/8/31 - Source code changes - - Increased size of vertexT.id and ridgeT.id to 2^32 [H. Strandenes, C. Cantwell] +Source code changes + - Increased size of vertexT.id and ridgeT.id to 2^32 [H. Strandenes, C. Carson, K. Nguyen] Reworded the warning message for ridgeT.id overflow. It does not affect Qhull output - Add qh_lib_check to check for a compatible Qhull library. Programs should call QHULL_LIB_CHECK before calling Qhull. @@ -235,7 +1123,7 @@ - qh_initqhull_start2 sets qh->NOerrexit on initialization User must clear NOerrexit after setjmp() - Other source code changes +Other source code changes - Define ptr_intT as 'long long' for __MINGW64__ [A. Voskov] - poly_r.c: initialize horizon_skip [K. Schwehr] - Removed vertexT.dim and MAX_vdim. It is not used by reentrant Qhull. @@ -439,7 +1327,7 @@ Implement print("message") - QhullHyperplane Add hyperplaneAngle() method - Rewrite operator== to use hyperplaneAngle() + Rewrite operator==to use hyperplaneAngle() Reorganize fields to keep pointers aligned Except for default constructor requires Qhull or QhullQh* pointer Enable copy assignment @@ -512,7 +1400,11 @@ Removed Replace setGlobalDistanceEpsilon with setFactorEpsilon Replace globalDistanceEpsilon with distanceEpsilon - + +============= +== Qhull 2012.1 +============= + ------------ Qhull 2012.1 2012/02/18 6.3.1.1494 - Fix CMakeLists for libqhull with MATCHES [P. Gajdos] @@ -681,6 +1573,10 @@ - Remove out-of-date material from qhull-go.bat - Replaced QHULL-GO with a lnk file +============= +== Qhull 2011.1 +============= + Qhull 2011.1 2011/05/23 6.2.0.1385 (exe/dll files unchanged) - delaunay.vcproj: Fixed qhullstatic_d.lib for debug and minrelsize builds - Did not redate the distribution @@ -790,6 +1686,10 @@ - Fixed type of vertex->neighbors in qh_printvoronoi [no effect on results] - Removed unnecessary if statement in qh_printvoronoi +============= +== Qhull 2010.1 and 2009.1 +============= + ------------ qhull 2010.1 2010/01/14 - Fixed quote for #include in qhull.h [U.Hergenhahn, K.Roland] @@ -1028,6 +1928,10 @@ automake/aclocal (1.10.2), and libtool (2.2.6) - Some character issues in the man pages are fixed +============= +== Qhull 2003.1 +============= + ------------ qhull 2003.1 2003/12/30 @@ -1091,6 +1995,10 @@ - Fixed options for eg/eg.t23.voronoi.imprecise [B. Pearlmutter] +============= +== Qhull 2002.1 +============= + ------------ qhull 2002.1 2002/8/20 @@ -1132,6 +2040,10 @@ - Changed URL for locate/cglist to software/cglist - Used site relative links for qh-home.htm +============= +== Qhull 3.1 (2001) +============= + ------------ qhull 3.1 2001/10/04 @@ -1309,6 +2221,10 @@ - added FAQ item on meshing non-convex objects - added FAQ item on MATLAB and Mathematica interface +============= +== Qhull 2.6 (1999) +============= + ------------ qhull 2.6 1999/04/19 - fixed memory overwrite (no effect) in qh_initstatistics() [K. Ford] @@ -1380,6 +2296,10 @@ - removed 'qh rand_seed' since random number generator is independent of qhull - dropt 'qhull-PPC.sit.bin' from the distribution (out-of-date) [M. Harris] +============= +== Qhull 2.5 (1998) +============= + ------------ qhull 2.5 1998/5/4 @@ -1425,6 +2345,7 @@ - renamed qh_JOGGLEmax to qh_JOGGLEmaxincrease - updated URL for Fukuda's cdd program +------------------- qhull 2.5 1998/1/12 New or modified features @@ -1500,6 +2421,10 @@ - separated qh_distround and qh_detroundoff from qh_maxmin +============= +== Qhull 2.4 (1997) +============= + ------------ qhull 2.4 97/4/2 @@ -1560,6 +2485,10 @@ - added request for unbounded Voronoi rays to Enhancements please let me know if you try this +============= +== Qhull 2.3 (1996) +============= + ------------ qhull V2.3 96/6/5 - fixed total area of Delaunay triangulation. [A. Enge] @@ -1616,6 +2545,10 @@ - moved 'FO' print of options to just before qh_buildhull - changed 'FO' to list difference from -1 for _narrow-hull +============= +== Qhull 2.2 (1995-1996) +============= + ------------ qhull V2.2 96/2/15 - detect narrow initial hulls (cosine of min angle < qh_MAXnarrow in user.h). @@ -1774,6 +2707,10 @@ - reorganized split between poly/poly2.c and geom/geom2.c - reordered object files in Makefile +============= +== Qhull 2.1 (1995) +============= + ------------ qhull V2.1 95/9/25 - converted qhull.man to html format, many edits @@ -1785,7 +2722,7 @@ - moved option 'FO' to include default precision options - changed default random number generator to qh_rand in geom2.c (user.h) - other code changes + Other code changes - fixed option comment Pdrop-facets-dim-less, Qbound-dim-low, QbBound-unit-box - defined ptr_intT for converting 64-bit ptrs to 'unsigned long' [D. Bremner] - defined setelemT to distinguish actual size from pointers [D. Bremner] @@ -1796,7 +2733,7 @@ - added type conversion to qh_memalloc() calls where missing - added type conversion to calls into set.c that return void* - other documentation changes: + Other documentation changes: - new URLs for graphics images - fixed comment for facetT.neighbors in libqhull.h [P. Soikkonen] - changed recommendations for precision errors in qh_printhelp_degenerate() @@ -1848,7 +2785,7 @@ qhull V2.1 beta 5/15/95 - ======= main changes ======== + Main changes - added halfspace intersection ('Hn,n,n') - facet merging is better, especially for high dimensions - added 'Qx' for exact merges of coplanar points and precision faults @@ -1865,7 +2802,7 @@ - renamed 'Qv' to 'Q7' since virtual memory does not work well for qhull - Qhull is available for the Power Mac (no graphical output) - ====== other new and modified options =========== + Other new and modified options - changed default MINvisible ('Vn') to a multiple of premerge_centrum ('C-n') - added 'Un' option to set width of facet for coplanar points. This replaces the previous rules for determining coplanar points. @@ -1893,14 +2830,14 @@ - added warning if mix Geomview output with other outputs ('Po' turns off) - options 'o v' for 3-d and higher sort the Voronoi vertices by index - ======= documentation ======= + Documentation - rewrote the introduction and precision sections - added a section on performance - added an example on halfspace intersection - installed examples of Qhull in - ======= Makefile, user.h, and messages ======= + Makefile, user.h, and messages - Makefile calls ./qhull, ./rbox, and prints short prompt for qhull - added new statistics, e.g., for buildhull - changed default qh_RANDOMtype to RAND_MAX with rand() @@ -1912,7 +2849,7 @@ - use this instead of redefining qh_merge_nonconvex in user.c - simplified user_eg.c. See qh_call_qhull() in user.c for the full version - ======== bug fixes ============ + Bug fixes - fixed error in number of points for 'rbox 100 r' (odd distribution) - fixed performance error in qh_degen_redundant_neighbors - qh_partitionpoint now sets facet->maxoutside for first outside point @@ -1922,7 +2859,7 @@ - forcing output on error ('Po') fixed for options 'n' 'o' 'i' 's' - fixed optimization error on HP machines [fprintf(... *p++)] - ======== changes to libqhull.h for user code ======= + Changes to libqhull.h for user code - qh_collectstatistics and qh_printstatistics removed from libqhull.h. should use qh_printallstatistics instead - qh_findbest uses boolT for newfacets @@ -1935,7 +2872,7 @@ - added dfacet/dvertex for printing facets/vertices while debugging - added qh_produce_output and qh_printsummary - ======== changes to code ========== + Changes to code - moved qh_setfacetplane from qh_makenewfacets to qh_makenewplanes - added qh_setfree2, qh_setcompact, and qh_setduplicate to set.c - qh_findgooddist returns list of visible facets instead of setting global @@ -1947,7 +2884,7 @@ - uses facet->dupridge to indicate duplicated ridges instead of ->seen - qh_buildtracing records CPU time relative to qh hulltime instead of 0 - ========== changes to merging ======= + Changes to merging - many performance improvements, especially in high-d. - when merging, qh_findbest and qh_findbestnew stops search at qh_DISToutside - vertex neighbors delayed until first merge @@ -1974,6 +2911,10 @@ - removed horizon preference in qh_merge_nonconvex (qh AVOIDold) - facet->keepcentrum if qh WIDEfacet or qh_MAXnewcentrum extra vertices +============= +== Qhull 2.0 (1994-1995) +============= + ------------ qhull V2.02 1/25/95 - rbox 'z' prints integer coordinates, use 'Bn' to change range diff -Nru qhull-2015.2/src/libqhull/DEPRECATED.txt qhull-2020.2/src/libqhull/DEPRECATED.txt --- qhull-2015.2/src/libqhull/DEPRECATED.txt 2016-01-17 16:40:33.000000000 +0000 +++ qhull-2020.2/src/libqhull/DEPRECATED.txt 2020-05-24 19:59:01.000000000 +0000 @@ -14,16 +14,17 @@ with libqhull_r. Qhull's C++ interface requires libqhull_r. If you previously used the - C++ interface, you will need to update your code. See Changes.txt for - suggestions. + C++ interface with libqhull, you will need to update your code to libqhull_r. + See qh-code.htm#convert and Changes.txt for suggestions. The C code in libqhull looks unusual because of the 'qh' macro. The 'qh' macro controls access to Qhull's global data structure, qhT. If 'qh_QHpointer' is defined, 'qh' is 'qh_qh->' and 'qh_qh' is defined as 'qhT *qh_qh', otherwise 'qh' is 'qh_qh.' and 'qh_qh' is defined as - 'qhT qh_qh'. + 'qhT qh_qh'. This allows dynamic allocation of qh_qh without modifying + the code. Reentrant Qhull is a better solution. libqhull will be supported indefinitely. The qh_QHpointer variation of libqhull will be not be retested each release. It is replaced by libqhull_r. - + \ No newline at end of file diff -Nru qhull-2015.2/src/libqhull/geom2.c qhull-2020.2/src/libqhull/geom2.c --- qhull-2015.2/src/libqhull/geom2.c 2016-01-18 18:35:25.000000000 +0000 +++ qhull-2020.2/src/libqhull/geom2.c 2020-09-02 02:02:40.000000000 +0000 @@ -7,9 +7,9 @@ see qh-geom.htm and geom.h - Copyright (c) 1993-2015 The Geometry Center. - $Id: //main/2015/qhull/src/libqhull/geom2.c#6 $$Change: 2065 $ - $DateTime: 2016/01/18 13:51:04 $$Author: bbarber $ + Copyright (c) 1993-2020 The Geometry Center. + $Id: //main/2019/qhull/src/libqhull/geom2.c#14 $$Change: 3037 $ + $DateTime: 2020/09/03 17:28:32 $$Author: bbarber $ frequently used code goes into geom.c */ @@ -21,17 +21,19 @@ /*--------------------------------- - qh_copypoints( points, numpoints, dimension) + qh_copypoints( points, numpoints, dimension ) return qh_malloc'd copy of points + notes: qh_free the returned points to avoid a memory leak */ -coordT *qh_copypoints(coordT *points, int numpoints, int dimension) { +coordT *qh_copypoints(coordT *points, int numpoints, int dimension) +{ int size; coordT *newpoints; size= numpoints * dimension * (int)sizeof(coordT); - if (!(newpoints=(coordT*)qh_malloc((size_t)size))) { + if (!(newpoints= (coordT *)qh_malloc((size_t)size))) { qh_fprintf(qh ferr, 6004, "qhull error: insufficient memory to copy %d points\n", numpoints); qh_errexit(qh_ERRmem, NULL, NULL); @@ -91,16 +93,16 @@ }else if (dim == 2) { det= det2_(rows[0][0], rows[0][1], rows[1][0], rows[1][1]); - if (fabs_(det) < 10*qh NEARzero[1]) /* not really correct, what should this be? */ + if (fabs_(det) < 10*qh NEARzero[1]) /* QH11031 FIX: not really correct, what should this be? */ *nearzero= True; }else if (dim == 3) { det= det3_(rows[0][0], rows[0][1], rows[0][2], rows[1][0], rows[1][1], rows[1][2], rows[2][0], rows[2][1], rows[2][2]); - if (fabs_(det) < 10*qh NEARzero[2]) /* what should this be? det 5.5e-12 was flat for qh_maxsimplex of qdelaunay 0,0 27,27 -36,36 -9,63 */ + if (fabs_(det) < 10*qh NEARzero[2]) /* QH11031 FIX: what should this be? det 5.5e-12 was flat for qh_maxsimplex of qdelaunay 0,0 27,27 -36,36 -9,63 */ *nearzero= True; }else { - qh_gausselim(rows, dim, dim, &sign, nearzero); /* if nearzero, diagonal still ok*/ + qh_gausselim(rows, dim, dim, &sign, nearzero); /* if nearzero, diagonal still ok */ det= 1.0; for (i=dim; i--; ) det *= (rows[i])[i]; @@ -134,25 +136,29 @@ realT maxwidth= 0; int k; - for (k=0; k < dimension; k++) { - if (qh SCALElast && k == dimension-1) - abscoord= maxwidth; - else if (qh DELAUNAY && k == dimension-1) /* will qh_setdelaunay() */ - abscoord= 2 * maxabs * maxabs; /* may be low by qh hull_dim/2 */ - else { - maxcoord= -REALmax; - mincoord= REALmax; - FORALLpoint_(points, numpoints) { - maximize_(maxcoord, point[k]); - minimize_(mincoord, point[k]); + if (qh SETroundoff) + distround= qh DISTround; /* 'En' */ + else{ + for (k=0; k < dimension; k++) { + if (qh SCALElast && k == dimension-1) + abscoord= maxwidth; + else if (qh DELAUNAY && k == dimension-1) /* will qh_setdelaunay() */ + abscoord= 2 * maxabs * maxabs; /* may be low by qh hull_dim/2 */ + else { + maxcoord= -REALmax; + mincoord= REALmax; + FORALLpoint_(points, numpoints) { + maximize_(maxcoord, point[k]); + minimize_(mincoord, point[k]); + } + maximize_(maxwidth, maxcoord-mincoord); + abscoord= fmax_(maxcoord, -mincoord); } - maximize_(maxwidth, maxcoord-mincoord); - abscoord= fmax_(maxcoord, -mincoord); - } - sumabs += abscoord; - maximize_(maxabs, abscoord); - } /* for k */ - distround= qh_distround(qh hull_dim, maxabs, sumabs); + sumabs += abscoord; + maximize_(maxabs, abscoord); + } /* for k */ + distround= qh_distround(qh hull_dim, maxabs, sumabs); + } joggle= distround * qh_JOGGLEdefault; maximize_(joggle, REALepsilon * qh_JOGGLEdefault); trace2((qh ferr, 2001, "qh_detjoggle: joggle=%2.2g maxwidth=%2.2g\n", joggle, maxwidth)); @@ -160,9 +166,32 @@ } /* detjoggle */ /*--------------------------------- + + qh_detmaxoutside(); + determine qh.MAXoutside target for qh_RATIO... tests of distance + updates option '_max-outside' + + notes: + called from qh_addpoint and qh_detroundoff + accounts for qh.ONEmerge, qh.DISTround, qh.MINoutside ('Wn'), qh.max_outside + see qh_maxout for qh.max_outside with qh.DISTround +*/ + +void qh_detmaxoutside(void) { + realT maxoutside; + + maxoutside= fmax_(qh max_outside, qh ONEmerge + qh DISTround); + maximize_(maxoutside, qh MINoutside); + qh MAXoutside= maxoutside; + trace3((qh ferr, 3056, "qh_detmaxoutside: MAXoutside %2.2g from qh.max_outside %2.2g, ONEmerge %2.2g, MINoutside %2.2g, DISTround %2.2g\n", + qh MAXoutside, qh max_outside, qh ONEmerge, qh MINoutside, qh DISTround)); +} /* detmaxoutside */ + +/*--------------------------------- - qh_detroundoff() + qh_detroundoff( ) determine maximum roundoff errors from REALepsilon, REALmax, REALmin, qh.hull_dim, qh.MAXabs_coord, qh.MAXsumcoord, qh.MAXwidth, qh.MINdenom_1 @@ -194,8 +223,6 @@ qh_option("_max-width", NULL, &qh MAXwidth); if (!qh SETroundoff) { qh DISTround= qh_distround(qh hull_dim, qh MAXabs_coord, qh MAXsumcoord); - if (qh RANDOMdist) - qh DISTround += qh RANDOMfactor * qh MAXabs_coord; qh_option("Error-roundoff", NULL, &qh DISTround); } qh MINdenom= qh MINdenom_1 * qh MAXabs_coord; @@ -203,8 +230,10 @@ qh MINdenom_2= qh MINdenom_1_2 * qh MAXabs_coord; /* for inner product */ qh ANGLEround= 1.01 * qh hull_dim * REALepsilon; - if (qh RANDOMdist) + if (qh RANDOMdist) { qh ANGLEround += qh RANDOMfactor; + trace4((qh ferr, 4096, "qh_detroundoff: increase qh.ANGLEround by option 'R%2.2g'\n", qh RANDOMfactor)); + } if (qh premerge_cos < REALmax/2) { qh premerge_cos -= qh ANGLEround; if (qh RANDOMdist) @@ -247,7 +276,7 @@ if (qh KEEPnearinside) qh_option("_near-inside", NULL, &qh NEARinside); if (qh JOGGLEmax < qh DISTround) { - qh_fprintf(qh ferr, 6006, "qhull error: the joggle for 'QJn', %.2g, is below roundoff for distance computations, %.2g\n", + qh_fprintf(qh ferr, 6006, "qhull option error: the joggle for 'QJn', %.2g, is below roundoff for distance computations, %.2g\n", qh JOGGLEmax, qh DISTround); qh_errexit(qh_ERRinput, NULL, NULL); } @@ -264,7 +293,7 @@ } if (qh MAXcoplanar > REALmax/2) { qh MAXcoplanar= qh MINvisible; - qh_option("U-coplanar-distance", NULL, &qh MAXcoplanar); + qh_option("U-max-coplanar", NULL, &qh MAXcoplanar); } if (!qh APPROXhull) { /* user may specify qh MINoutside */ qh MINoutside= 2 * qh MINvisible; @@ -283,6 +312,7 @@ qh max_vertex= qh DISTround; qh min_vertex= -qh DISTround; /* numeric constants reported in printsummary */ + qh_detmaxoutside(); } /* detroundoff */ /*--------------------------------- - qh_distround(dimension, maxabs, maxsumabs ) + qh_distround( dimension, maxabs, maxsumabs ) compute maximum round-off error for a distance computation to a normalized hyperplane maxabs is the maximum absolute value of a coordinate maxsumabs is the maximum possible sum of absolute coordinate values + if qh.RANDOMdist ('Qr'), adjusts qh_distround returns: - max dist round for REALepsilon + max dist round for qh.REALepsilon and qh.RANDOMdist notes: calculate roundoff error according to Golub & van Loan, 1983, Lemma 3.2-1, "Rounding Errors" @@ -374,14 +406,19 @@ or use maxsumabs since one vector is < 1 */ realT qh_distround(int dimension, realT maxabs, realT maxsumabs) { - realT maxdistsum, maxround; + realT maxdistsum, maxround, delta; maxdistsum= sqrt((realT)dimension) * maxabs; minimize_( maxdistsum, maxsumabs); maxround= REALepsilon * (dimension * maxdistsum * 1.01 + maxabs); /* adds maxabs for offset */ - trace4((qh ferr, 4008, "qh_distround: %2.2g maxabs %2.2g maxsumabs %2.2g maxdistsum %2.2g\n", - maxround, maxabs, maxsumabs, maxdistsum)); + if (qh RANDOMdist) { + delta= qh RANDOMfactor * maxabs; + maxround += delta; + trace4((qh ferr, 4092, "qh_distround: increase roundoff by random delta %2.2g for option 'R%2.2g'\n", delta, qh RANDOMfactor)); + } + trace4((qh ferr, 4008, "qh_distround: %2.2g, maxabs %2.2g, maxsumabs %2.2g, maxdistsum %2.2g\n", + maxround, maxabs, maxsumabs, maxdistsum)); return maxround; } /* distround */ @@ -566,7 +603,7 @@ for (k=dim; k--; ) *(gmcoord++)= *normalp++; } - zinc_(Zdetsimplex); + zinc_(Zdetfacetarea); area= qh_determinant(rows, dim, &nearzero); if (toporient) area= -area; @@ -677,6 +714,90 @@ } /* findgooddist */ /*--------------------------------- + + qh_furthestnewvertex( unvisited, facet, &maxdist ) + return furthest unvisited, new vertex to a facet + + return: + NULL if no vertex is above facet + maxdist to facet + updates v.visitid + + notes: + Ignores vertices in facetB + Does not change qh.vertex_visit. Use in conjunction with qh_furthestvertex +*/ +vertexT *qh_furthestnewvertex(unsigned int unvisited, facetT *facet, realT *maxdistp /* qh.newvertex_list */) { + vertexT *maxvertex= NULL, *vertex; + coordT dist, maxdist= 0.0; + + FORALLvertex_(qh newvertex_list) { + if (vertex->newfacet && vertex->visitid <= unvisited) { + vertex->visitid= qh vertex_visit; + qh_distplane(vertex->point, facet, &dist); + if (dist > maxdist) { + maxdist= dist; + maxvertex= vertex; + } + } + } + trace4((qh ferr, 4085, "qh_furthestnewvertex: v%d dist %2.2g is furthest new vertex for f%d\n", + getid_(maxvertex), maxdist, facet->id)); + *maxdistp= maxdist; + return maxvertex; +} /* furthestnewvertex */ + +/*--------------------------------- + + qh_furthestvertex( facetA, facetB, &maxdist, &mindist ) + return furthest vertex in facetA from facetB, or NULL if none + + return: + maxdist and mindist to facetB or 0.0 if none + updates qh.vertex_visit + + notes: + Ignores vertices in facetB +*/ +vertexT *qh_furthestvertex(facetT *facetA, facetT *facetB, realT *maxdistp, realT *mindistp) { + vertexT *maxvertex= NULL, *vertex, **vertexp; + coordT dist, maxdist= -REALmax, mindist= REALmax; + + qh vertex_visit++; + FOREACHvertex_(facetB->vertices) + vertex->visitid= qh vertex_visit; + FOREACHvertex_(facetA->vertices) { + if (vertex->visitid != qh vertex_visit) { + vertex->visitid= qh vertex_visit; + zzinc_(Zvertextests); + qh_distplane(vertex->point, facetB, &dist); + if (!maxvertex) { + maxdist= dist; + mindist= dist; + maxvertex= vertex; + }else if (dist > maxdist) { + maxdist= dist; + maxvertex= vertex; + }else if (dist < mindist) + mindist= dist; + } + } + if (!maxvertex) { + trace3((qh ferr, 3067, "qh_furthestvertex: all vertices of f%d are in f%d. Returning 0.0 for max and mindist\n", + facetA->id, facetB->id)); + maxdist= mindist= 0.0; + }else { + trace4((qh ferr, 4084, "qh_furthestvertex: v%d dist %2.2g is furthest (mindist %2.2g) of f%d above f%d\n", + maxvertex->id, maxdist, mindist, facetA->id, facetB->id)); + } + *maxdistp= maxdist; + *mindistp= mindist; + return maxvertex; +} /* furthestvertex */ + +/*--------------------------------- qh_getarea( facetlist ) @@ -709,7 +830,7 @@ if (qh REPORTfreq) qh_fprintf(qh ferr, 8020, "computing area of each facet and volume of the convex hull\n"); else - trace1((qh ferr, 1001, "qh_getarea: computing volume and area for each facet\n")); + trace1((qh ferr, 1001, "qh_getarea: computing area for each facet and its volume to qh.interior_point (dist*area/dim)\n")); qh totarea= qh totvol= 0.0; FORALLfacet_(facetlist) { if (!facet->normal) @@ -766,7 +887,7 @@ for (i=0; i < dim; i++) { rowi= row[i]; - for (norm= 0.0, k= dim; k--; rowi++) + for (norm=0.0, k=dim; k--; rowi++) norm += *rowi * *rowi; norm= sqrt(norm); wmin_(Wmindenom, norm); @@ -776,7 +897,7 @@ *(--rowi) /= norm; for (j=i+1; j < dim; j++) { rowj= row[j]; - for (norm= 0.0, k=dim; k--; ) + for (norm=0.0, k=dim; k--; ) norm += *rowi++ * *rowj++; for (k=dim; k--; ) *(--rowj) -= *(--rowi) * norm; @@ -842,7 +963,7 @@ /*--------------------------------- - qh_joggleinput() + qh_joggleinput( ) randomly joggle input to Qhull by qh.JOGGLEmax initial input is qh.first_point/qh.num_points of qh.hull_dim repeated calls use qh.input_points/qh.num_points @@ -879,8 +1000,8 @@ if (!qh input_points) { /* first call */ qh input_points= qh first_point; qh input_malloc= qh POINTSmalloc; - size= qh num_points * qh hull_dim * sizeof(coordT); - if (!(qh first_point=(coordT*)qh_malloc((size_t)size))) { + size= qh num_points * qh hull_dim * (int)sizeof(coordT); + if (!(qh first_point= (coordT *)qh_malloc((size_t)size))) { qh_fprintf(qh ferr, 6009, "qhull error: insufficient memory to joggle %d points\n", qh num_points); qh_errexit(qh_ERRmem, NULL, NULL); @@ -903,14 +1024,14 @@ qh_option("QJoggle", NULL, &qh JOGGLEmax); } if (qh build_cnt > 1 && qh JOGGLEmax > fmax_(qh MAXwidth/4, 0.1)) { - qh_fprintf(qh ferr, 6010, "qhull error: the current joggle for 'QJn', %.2g, is too large for the width\nof the input. If possible, recompile Qhull with higher-precision reals.\n", + qh_fprintf(qh ferr, 6010, "qhull input error (qh_joggleinput): the current joggle for 'QJn', %.2g, is too large for the width\nof the input. If possible, recompile Qhull with higher-precision reals.\n", qh JOGGLEmax); - qh_errexit(qh_ERRqhull, NULL, NULL); + qh_errexit(qh_ERRinput, NULL, NULL); } /* for some reason, using qh ROTATErandom and qh_RANDOMseed does not repeat the run. Use 'TRn' instead */ seed= qh_RANDOMint; qh_option("_joggle-seed", &seed, NULL); - trace0((qh ferr, 6, "qh_joggleinput: joggle input by %2.2g with seed %d\n", + trace0((qh ferr, 6, "qh_joggleinput: joggle input by %4.4g with seed %d\n", qh JOGGLEmax, seed)); inputp= qh input_points; coordp= qh first_point; @@ -994,12 +1115,12 @@ && REALmax > 0.0 && -REALmax < 0.0) ; /* all ok */ else { - qh_fprintf(qh ferr, 6011, "qhull error: floating point constants in user.h are wrong\n\ -REALepsilon %g REALmin %g REALmax %g -REALmax %g\n", - REALepsilon, REALmin, REALmax, -REALmax); + qh_fprintf(qh ferr, 6011, "qhull error: one or more floating point constants in user.h are inconsistent. REALmin %g, -REALmax %g, 0.0, REALepsilon %g, REALmax %g\n", + REALmin, -REALmax, REALepsilon, REALmax); qh_errexit(qh_ERRinput, NULL, NULL); } set= qh_settemp(2*dimension); + trace1((qh ferr, 8082, "qh_maxmin: dim min max width nearzero min-point max-point\n")); for (k=0; k < dimension; k++) { if (points == qh GOODpointp) minimum= maximum= points + dimension; @@ -1018,7 +1139,7 @@ qh MAXlastcoord= maximum[k]; } if (qh SCALElast && k == dimension-1) - maxcoord= qh MAXwidth; + maxcoord= qh MAXabs_coord; else { maxcoord= fmax_(maximum[k], -minimum[k]); if (qh GOODpointp) { @@ -1030,23 +1151,28 @@ } maximize_(qh MAXabs_coord, maxcoord); qh MAXsumcoord += maxcoord; - qh_setappend(&set, maximum); qh_setappend(&set, minimum); + qh_setappend(&set, maximum); /* calculation of qh NEARzero is based on Golub & van Loan, 1983, Eq. 4.4-13 for "Gaussian elimination with complete pivoting". Golub & van Loan say that n^3 can be ignored and 10 be used in place of rho */ qh NEARzero[k]= 80 * qh MAXsumcoord * REALepsilon; + trace1((qh ferr, 8106, " %3d % 14.8e % 14.8e % 14.8e %4.4e p%-9d p%-d\n", + k, minimum[k], maximum[k], maximum[k]-minimum[k], qh NEARzero[k], qh_pointid(minimum), qh_pointid(maximum))); + if (qh SCALElast && k == dimension-1) + trace1((qh ferr, 8107, " last coordinate scaled to (%4.4g, %4.4g), width %4.4e for option 'Qbb'\n", + qh MAXabs_coord - qh MAXwidth, qh MAXabs_coord, qh MAXwidth)); } - if (qh IStracing >=1) - qh_printpoints(qh ferr, "qh_maxmin: found the max and min points(by dim):", set); + if (qh IStracing >= 1) + qh_printpoints(qh ferr, "qh_maxmin: found the max and min points (by dim):", set); return(set); } /* maxmin */ /*--------------------------------- - qh_maxouter() + qh_maxouter( ) return maximum distance from facet to outer plane normally this is qh.max_outside+qh.DISTround does not include qh.JOGGLEmax @@ -1056,6 +1182,7 @@ notes: need to add another qh.DISTround if testing actual point with computation + see qh_detmaxoutside for a qh_RATIO... target for joggle: qh_setfacetplane() updated qh.max_outer for Wnewvertexmax (max distance to vertex) @@ -1068,7 +1195,7 @@ dist= fmax_(qh max_outside, qh DISTround); dist += qh DISTround; - trace4((qh ferr, 4012, "qh_maxouter: max distance from facet to outer plane is %2.2g max_outside is %2.2g\n", dist, qh max_outside)); + trace4((qh ferr, 4012, "qh_maxouter: max distance from facet to outer plane is %4.4g, qh.max_outside is %4.4g\n", dist, qh max_outside)); return dist; } /* maxouter */ @@ -1077,32 +1204,45 @@ qh_maxsimplex( dim, maxpoints, points, numpoints, simplex ) determines maximum simplex for a set of points - starts from points already in simplex + maxpoints is the subset of points with a min or max coordinate + may start with points already in simplex skips qh.GOODpointp (assumes that it isn't in maxpoints) returns: simplex with dim+1 points notes: - assumes at least pointsneeded points in points + called by qh_initialvertices, qh_detvnorm, and qh_voronoi_center + requires qh.MAXwidth to estimate determinate for each vertex + assumes at least needed points in points maximizes determinate for x,y,z,w, etc. uses maxpoints as long as determinate is clearly non-zero design: initialize simplex with at least two points (find points with max or min x coordinate) - for each remaining dimension - add point that maximizes the determinate - (use points from maxpoints first) + create a simplex of dim+1 vertices as follows + add point from maxpoints that maximizes the determinate of the point and the simplex vertices + if last point and maxdet/prevdet < qh_RATIOmaxsimplex (3.0e-2) + flag maybe_falsenarrow + if no maxpoint or maxnearzero or maybe_falsenarrow + search all points for maximum determinate + early exit if maybe_falsenarrow and !maxnearzero and maxdet > prevdet */ void qh_maxsimplex(int dim, setT *maxpoints, pointT *points, int numpoints, setT **simplex) { pointT *point, **pointp, *pointtemp, *maxpoint, *minx=NULL, *maxx=NULL; - boolT nearzero, maxnearzero= False; - int k, sizinit; - realT maxdet= -REALmax, det, mincoord= REALmax, maxcoord= -REALmax; + boolT nearzero, maxnearzero= False, maybe_falsenarrow; + int i, sizinit; + realT maxdet= -1.0, prevdet= -1.0, det, mincoord= REALmax, maxcoord= -REALmax, mindet, ratio, targetdet; + if (qh MAXwidth <= 0.0) { + qh_fprintf(qh ferr, 6421, "qhull internal error (qh_maxsimplex): qh.MAXwidth required for qh_maxsimplex. Used to estimate determinate\n"); + qh_errexit(qh_ERRqhull, NULL, NULL); + } sizinit= qh_setsize(*simplex); - if (sizinit < 2) { + if (sizinit >= 2) { + maxdet= pow(qh MAXwidth, sizinit - 1); + }else { if (qh_setsize(maxpoints) >= 2) { FOREACHpoint_(maxpoints) { if (maxcoord < point[0]) { @@ -1128,28 +1268,31 @@ } } } + maxdet= maxcoord - mincoord; qh_setunique(simplex, minx); if (qh_setsize(*simplex) < 2) qh_setunique(simplex, maxx); sizinit= qh_setsize(*simplex); if (sizinit < 2) { - qh_precision("input has same x coordinate"); + qh_joggle_restart("input has same x coordinate"); if (zzval_(Zsetplane) > qh hull_dim+1) { - qh_fprintf(qh ferr, 6012, "qhull precision error (qh_maxsimplex for voronoi_center):\n%d points with the same x coordinate.\n", - qh_setsize(maxpoints)+numpoints); + qh_fprintf(qh ferr, 6012, "qhull precision error (qh_maxsimplex for voronoi_center): %d points with the same x coordinate %4.4g\n", + qh_setsize(maxpoints)+numpoints, mincoord); qh_errexit(qh_ERRprec, NULL, NULL); }else { - qh_fprintf(qh ferr, 6013, "qhull input error: input is less than %d-dimensional since it has the same x coordinate\n", qh hull_dim); + qh_fprintf(qh ferr, 6013, "qhull input error: input is less than %d-dimensional since all points have the same x coordinate %4.4g\n", + qh hull_dim, mincoord); qh_errexit(qh_ERRinput, NULL, NULL); } } } - for (k=sizinit; k < dim+1; k++) { + for (i=sizinit; i < dim+1; i++) { + prevdet= maxdet; maxpoint= NULL; - maxdet= -REALmax; + maxdet= -1.0; FOREACHpoint_(maxpoints) { - if (!qh_setin(*simplex, point)) { - det= qh_detsimplex(point, *simplex, k, &nearzero); + if (!qh_setin(*simplex, point) && point != maxpoint) { + det= qh_detsimplex(point, *simplex, i, &nearzero); /* retests maxpoints if duplicate or multiple iterations */ if ((det= fabs_(det)) > maxdet) { maxdet= det; maxpoint= point; @@ -1157,23 +1300,41 @@ } } } - if (!maxpoint || maxnearzero) { + maybe_falsenarrow= False; + ratio= 1.0; + targetdet= prevdet * qh MAXwidth; + mindet= 10 * qh_RATIOmaxsimplex * targetdet; + if (maxdet > 0.0) { + ratio= maxdet / targetdet; + if (ratio < qh_RATIOmaxsimplex) + maybe_falsenarrow= True; + } + if (!maxpoint || maxnearzero || maybe_falsenarrow) { zinc_(Zsearchpoints); if (!maxpoint) { - trace0((qh ferr, 7, "qh_maxsimplex: searching all points for %d-th initial vertex.\n", k+1)); + trace0((qh ferr, 7, "qh_maxsimplex: searching all points for %d-th initial vertex, better than mindet %4.4g, targetdet %4.4g\n", + i+1, mindet, targetdet)); + }else if (qh ALLpoints) { + trace0((qh ferr, 30, "qh_maxsimplex: searching all points ('Qs') for %d-th initial vertex, better than p%d det %4.4g, targetdet %4.4g, ratio %4.4g\n", + i+1, qh_pointid(maxpoint), maxdet, targetdet, ratio)); + }else if (maybe_falsenarrow) { + trace0((qh ferr, 17, "qh_maxsimplex: searching all points for %d-th initial vertex, better than p%d det %4.4g and mindet %4.4g, ratio %4.4g\n", + i+1, qh_pointid(maxpoint), maxdet, mindet, ratio)); }else { - trace0((qh ferr, 8, "qh_maxsimplex: searching all points for %d-th initial vertex, better than p%d det %2.2g\n", - k+1, qh_pointid(maxpoint), maxdet)); + trace0((qh ferr, 8, "qh_maxsimplex: searching all points for %d-th initial vertex, better than p%d det %2.2g and mindet %4.4g, targetdet %4.4g\n", + i+1, qh_pointid(maxpoint), maxdet, mindet, targetdet)); } FORALLpoint_(points, numpoints) { if (point == qh GOODpointp) continue; - if (!qh_setin(*simplex, point)) { - det= qh_detsimplex(point, *simplex, k, &nearzero); + if (!qh_setin(maxpoints, point) && !qh_setin(*simplex, point)) { + det= qh_detsimplex(point, *simplex, i, &nearzero); if ((det= fabs_(det)) > maxdet) { maxdet= det; maxpoint= point; maxnearzero= nearzero; + if (!maxnearzero && !qh ALLpoints && maxdet > mindet) + break; } } } @@ -1183,9 +1344,9 @@ qh_errexit(qh_ERRqhull, NULL, NULL); } qh_setappend(simplex, maxpoint); - trace1((qh ferr, 1002, "qh_maxsimplex: selected point p%d for %d`th initial vertex, det=%2.2g\n", - qh_pointid(maxpoint), k+1, maxdet)); - } /* k */ + trace1((qh ferr, 1002, "qh_maxsimplex: selected point p%d for %d`th initial vertex, det=%4.4g, targetdet=%4.4g, mindet=%4.4g\n", + qh_pointid(maxpoint), i+1, maxdet, prevdet * qh MAXwidth, mindet)); + } /* i */ } /* maxsimplex */ /*--------------------------------- - qh_projectinput() + qh_projectinput( ) project input points using qh.lower_bound/upper_bound and qh DELAUNAY if qh.lower_bound[k]=qh.upper_bound[k]= 0, removes dimension k @@ -1425,14 +1586,14 @@ int k,i; int newdim= qh input_dim, newnum= qh num_points; signed char *project; - int projectsize= (qh input_dim+1)*sizeof(*project); + int projectsize= (qh input_dim + 1) * (int)sizeof(*project); pointT *newpoints, *coord, *infinity; realT paraboloid, maxboloid= 0; - project= (signed char*)qh_memalloc(projectsize); - memset((char*)project, 0, (size_t)projectsize); + project= (signed char *)qh_memalloc(projectsize); + memset((char *)project, 0, (size_t)projectsize); for (k=0; k < qh input_dim; k++) { /* skip Delaunay bound */ - if (qh lower_bound[k] == 0 && qh upper_bound[k] == 0) { + if (qh lower_bound[k] == 0.0 && qh upper_bound[k] == 0.0) { project[k]= -1; newdim--; } @@ -1448,7 +1609,7 @@ qh_fprintf(qh ferr, 6015, "qhull internal error (qh_projectinput): dimension after projection %d != hull_dim %d\n", newdim, qh hull_dim); qh_errexit(qh_ERRqhull, NULL, NULL); } - if (!(newpoints= qh temp_malloc= (coordT*)qh_malloc(newnum*newdim*sizeof(coordT)))){ + if (!(newpoints= qh temp_malloc= (coordT *)qh_malloc((size_t)(newnum * newdim) * sizeof(coordT)))) { qh_memfree(project, projectsize); qh_fprintf(qh ferr, 6016, "qhull error: insufficient memory to project %d points\n", qh num_points); @@ -1499,7 +1660,7 @@ qh num_points++; trace0((qh ferr, 9, "qh_projectinput: projected points to paraboloid for Delaunay\n")); }else if (qh DELAUNAY) /* !qh ATinfinity */ - qh_setdelaunay( qh hull_dim, qh num_points, qh first_point); + qh_setdelaunay(qh hull_dim, qh num_points, qh first_point); } /* projectinput */ @@ -1613,12 +1774,12 @@ if (qh IStracing >= 1) qh_printmatrix(qh ferr, "qh_rotatepoints: rotate points by", row, dim, dim); - for (point= points, j= numpoints; j--; point += dim) { + for (point=points, j=numpoints; j--; point += dim) { newval= row[dim]; for (i=0; i < dim; i++) { rowi= row[i]; coord= point; - for (sum= 0.0, k= dim; k--; ) + for (sum=0.0, k=dim; k--; ) sum += *rowi++ * *coord++; *(newval++)= sum; } @@ -1631,7 +1792,7 @@ /*--------------------------------- - qh_scaleinput() + qh_scaleinput( ) scale input points using qh low_bound/high_bound input points given by qh first_point, num_points, hull_dim if qh POINTSmalloc, overwrites input points, else mallocs a new array @@ -1657,16 +1818,20 @@ >-------------------------------- qh_scalelast( points, numpoints, dim, low, high, newhigh ) - scale last coordinate to [0,m] for Delaunay triangulations + scale last coordinate to [0.0, newhigh], for Delaunay triangulation input points given by points, numpoints, dim returns: - changes scale of last coordinate from [low, high] to [0, newhigh] + changes scale of last coordinate from [low, high] to [0.0, newhigh] overwrites last coordinate of each point saves low/high/newhigh in qh.last_low, etc. for qh_setdelaunay() notes: - when called by qh_setdelaunay, low/high may not match actual data + to reduce precision issues, qh_scalelast makes the last coordinate similar to other coordinates + the last coordinate for Delaunay triangulation is the sum of squares of input coordinates + note that the range [0.0, newwidth] is wrong for narrow distributions with large positive coordinates (e.g., [995933.64, 995963.48]) + + when called by qh_setdelaunay, low/high may not match the data passed to qh_setdelaunay design: compute scale and shift factors @@ -1675,26 +1840,28 @@ void qh_scalelast(coordT *points, int numpoints, int dim, coordT low, coordT high, coordT newhigh) { realT scale, shift; - coordT *coord; + coordT *coord, newlow; int i; boolT nearzero= False; - trace4((qh ferr, 4013, "qh_scalelast: scale last coordinate from [%2.2g, %2.2g] to [0,%2.2g]\n", - low, high, newhigh)); + newlow= 0.0; + trace4((qh ferr, 4013, "qh_scalelast: scale last coordinate from [%2.2g, %2.2g] to [%2.2g, %2.2g]\n", + low, high, newlow, newhigh)); qh last_low= low; qh last_high= high; qh last_newhigh= newhigh; - scale= qh_divzero(newhigh, high - low, + scale= qh_divzero(newhigh - newlow, high - low, qh MINdenom_1, &nearzero); if (nearzero) { if (qh DELAUNAY) - qh_fprintf(qh ferr, 6019, "qhull input error: can not scale last coordinate. Input is cocircular\n or cospherical. Use option 'Qz' to add a point at infinity.\n"); + qh_fprintf(qh ferr, 6019, "qhull input error (qh_scalelast): can not scale last coordinate to [%4.4g, %4.4g]. Input is cocircular or cospherical. Use option 'Qz' to add a point at infinity.\n", + newlow, newhigh); else - qh_fprintf(qh ferr, 6020, "qhull input error: can not scale last coordinate. New bounds [0, %2.2g] are too wide for\nexisting bounds [%2.2g, %2.2g] (width %2.2g)\n", - newhigh, low, high, high-low); + qh_fprintf(qh ferr, 6020, "qhull input error (qh_scalelast): can not scale last coordinate to [%4.4g, %4.4g]. New bounds are too wide for compared to existing bounds [%4.4g, %4.4g] (width %4.4g)\n", + newlow, newhigh, low, high, high-low); qh_errexit(qh_ERRinput, NULL, NULL); } - shift= - low * newhigh / (high-low); + shift= newlow - low * scale; coord= points + dim - 1; for (i=numpoints; i--; coord += dim) *coord= *coord * scale + shift; @@ -1817,7 +1984,7 @@ coord= *coordp++; paraboloid += coord*coord; } - *coordp++ = paraboloid; + *coordp++= paraboloid; } if (qh last_low < REALmax/2) qh_scalelast(points, count, dim, qh last_low, qh last_high, qh last_newhigh); @@ -1866,6 +2033,7 @@ } } *nextp= coordp; +#ifndef qh_NOtrace if (qh IStracing >= 4) { qh_fprintf(qh ferr, 8021, "qh_sethalfspace: halfspace at offset %6.2g to point: ", *offset); for (k=dim, coordp=coords; k--; ) { @@ -1874,6 +2042,7 @@ } qh_fprintf(qh ferr, 8023, "\n"); } +#endif return True; LABELerroroutside: feasiblep= feasible; @@ -1909,8 +2078,8 @@ call before qh_init_B or qh_initqhull_globals free memory when done unused/untested code: please email bradb@shore.net if this works ok for you - if using option 'Fp', qh->feasible_point must be set (e.g., to 'feasible') - qh->feasible_point is a malloc'd array that is freed by qh_freebuffers. + if using option 'Fp', qh.feasible_point must be set (e.g., to 'feasible') + qh feasible_point is a malloc'd array that is freed by qh_freebuffers. design: see qh_sethalfspace @@ -1922,7 +2091,7 @@ trace0((qh ferr, 12, "qh_sethalfspace_all: compute dual for halfspace intersection\n")); newdim= dim - 1; - if (!(newpoints=(coordT*)qh_malloc(count*newdim*sizeof(coordT)))){ + if (!(newpoints= (coordT *)qh_malloc((size_t)(count * newdim) * sizeof(coordT)))){ qh_fprintf(qh ferr, 6024, "qhull error: insufficient memory to compute dual of %d halfspaces\n", count); qh_errexit(qh_ERRmem, NULL, NULL); @@ -1945,7 +2114,7 @@ /*--------------------------------- - qh_sharpnewfacets() + qh_sharpnewfacets( ) returns: true if could be an acute angle (facets in different quadrants) @@ -1960,10 +2129,10 @@ */ boolT qh_sharpnewfacets(void) { facetT *facet; - boolT issharp = False; + boolT issharp= False; int *quadrant, k; - quadrant= (int*)qh_memalloc(qh hull_dim * sizeof(int)); + quadrant= (int *)qh_memalloc(qh hull_dim * (int)sizeof(int)); FORALLfacet_(qh newfacet_list) { if (facet == qh newfacet_list) { for (k=qh hull_dim; k--; ) @@ -1979,12 +2148,50 @@ if (issharp) break; } - qh_memfree( quadrant, qh hull_dim * sizeof(int)); + qh_memfree(quadrant, qh hull_dim * (int)sizeof(int)); trace3((qh ferr, 3001, "qh_sharpnewfacets: %d\n", issharp)); return issharp; } /* sharpnewfacets */ /*--------------------------------- + + qh_vertex_bestdist( vertices ) + qh_vertex_bestdist2( vertices, vertexp, vertexp2 ) + return nearest distance between vertices + optionally returns vertex and vertex2 + + notes: + called by qh_partitioncoplanar, qh_mergefacet, qh_check_maxout, qh_checkpoint +*/ +coordT qh_vertex_bestdist(setT *vertices) { + vertexT *vertex, *vertex2; + + return qh_vertex_bestdist2(vertices, &vertex, &vertex2); +} /* vertex_bestdist */ + +coordT qh_vertex_bestdist2(setT *vertices, vertexT **vertexp/*= NULL*/, vertexT **vertexp2/*= NULL*/) { + vertexT *vertex, *vertexA, *bestvertex= NULL, *bestvertex2= NULL; + coordT dist, bestdist= REALmax; + int k, vertex_i, vertex_n; + + FOREACHvertex_i_(vertices) { + for (k= vertex_i+1; k < vertex_n; k++) { + vertexA= SETelemt_(vertices, k, vertexT); + dist= qh_pointdist(vertex->point, vertexA->point, -qh hull_dim); + if (dist < bestdist) { + bestdist= dist; + bestvertex= vertex; + bestvertex2= vertexA; + } + } + } + *vertexp= bestvertex; + *vertexp2= bestvertex2; + return sqrt(bestdist); +} /* vertex_bestdist */ + +/*--------------------------------- qh_voronoi_center( dim, points ) @@ -2011,7 +2218,7 @@ */ pointT *qh_voronoi_center(int dim, setT *points) { pointT *point, **pointp, *point0; - pointT *center= (pointT*)qh_memalloc(qh center_size); + pointT *center= (pointT *)qh_memalloc(qh center_size); setT *simplex; int i, j, k, size= qh_setsize(points); coordT *gmcoord; @@ -2022,7 +2229,7 @@ simplex= points; else if (size < dim+1) { qh_memfree(center, qh center_size); - qh_fprintf(qh ferr, 6025, "qhull internal error (qh_voronoi_center):\n need at least %d points to construct a Voronoi center\n", + qh_fprintf(qh ferr, 6025, "qhull internal error (qh_voronoi_center): need at least %d points to construct a Voronoi center\n", dim+1); qh_errexit(qh_ERRqhull, NULL, NULL); simplex= points; /* never executed -- avoids warning */ @@ -2075,7 +2282,7 @@ } #ifndef qh_NOtrace if (qh IStracing >= 3) { - qh_fprintf(qh ferr, 8033, "qh_voronoi_center: det %2.2g factor %2.2g ", det, factor); + qh_fprintf(qh ferr, 3061, "qh_voronoi_center: det %2.2g factor %2.2g ", det, factor); qh_printmatrix(qh ferr, "center:", ¢er, 1, dim); if (qh IStracing >= 5) { qh_printpoints(qh ferr, "points", simplex); diff -Nru qhull-2015.2/src/libqhull/geom.c qhull-2020.2/src/libqhull/geom.c --- qhull-2015.2/src/libqhull/geom.c 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/src/libqhull/geom.c 2020-05-22 02:00:58.000000000 +0000 @@ -6,9 +6,9 @@ see qh-geom.htm and geom.h - Copyright (c) 1993-2015 The Geometry Center. - $Id: //main/2015/qhull/src/libqhull/geom.c#2 $$Change: 1995 $ - $DateTime: 2015/10/13 21:59:42 $$Author: bbarber $ + Copyright (c) 1993-2020 The Geometry Center. + $Id: //main/2019/qhull/src/libqhull/geom.c#4 $$Change: 2953 $ + $DateTime: 2020/05/21 22:05:32 $$Author: bbarber $ infrequent code goes into geom2.c */ @@ -28,6 +28,20 @@ notes: dist > 0 if point is above facet (i.e., outside) does not error (for qh_sortfacets, qh_outerinner) + for nearly coplanar points, the returned values may be duplicates + for example pairs of nearly incident points, rbox 175 C1,2e-13 t1538759579 | qhull d T4 + 622 qh_distplane: e-014 # count of two or more duplicate values for unique calls + 258 qh_distplane: e-015 + 38 qh_distplane: e-016 + 40 qh_distplane: e-017 + 6 qh_distplane: e-018 + 5 qh_distplane: -e-018 + 33 qh_distplane: -e-017 + 3153 qh_distplane: -2.775557561562891e-017 # duplicated value for 3153 unique calls + 42 qh_distplane: -e-016 + 307 qh_distplane: -e-015 + 1271 qh_distplane: -e-014 + 13 qh_distplane: -e-013 see: qh_distnorm in geom2.c @@ -66,7 +80,7 @@ *dist += *coordp++ * *normal++; break; } - zinc_(Zdistplane); + zzinc_(Zdistplane); if (!qh RANDOMdist && qh IStracing < 4) return; if (qh RANDOMdist) { @@ -74,11 +88,13 @@ *dist += (2.0 * randr / qh_RANDOMmax - 1.0) * qh RANDOMfactor * qh MAXabs_coord; } +#ifndef qh_NOtrace if (qh IStracing >= 4) { qh_fprintf(qh ferr, 8001, "qh_distplane: "); qh_fprintf(qh ferr, 8002, qh_REAL_1, *dist); qh_fprintf(qh ferr, 8003, "from p%d to f%d\n", qh_pointid(point), facet->id); } +#endif return; } /* distplane */ @@ -123,7 +139,7 @@ qh_check_bestdist(), qh_addpoint() indicated by !qh_ISnewfacets returns best facet in neighborhood of given facet - this is best facet overall if dist > - qh.MAXcoplanar + this is best facet overall if dist >= -qh.MAXcoplanar or hull has at least a "spherical" curvature design: @@ -146,21 +162,23 @@ int oldtrace= qh IStracing; unsigned int visitid= ++qh visit_id; int numpartnew=0; - boolT testhorizon = True; /* needed if precise, e.g., rbox c D6 | qhull Q0 Tv */ + boolT testhorizon= True; /* needed if precise, e.g., rbox c D6 | qhull Q0 Tv */ zinc_(Zfindbest); - if (qh IStracing >= 3 || (qh TRACElevel && qh TRACEpoint >= 0 && qh TRACEpoint == qh_pointid(point))) { +#ifndef qh_NOtrace + if (qh IStracing >= 4 || (qh TRACElevel && qh TRACEpoint >= 0 && qh TRACEpoint == qh_pointid(point))) { if (qh TRACElevel > qh IStracing) qh IStracing= qh TRACElevel; - qh_fprintf(qh ferr, 8004, "qh_findbest: point p%d starting at f%d isnewfacets? %d, unless %d exit if > %2.2g\n", + qh_fprintf(qh ferr, 8004, "qh_findbest: point p%d starting at f%d isnewfacets? %d, unless %d exit if > %2.2g,", qh_pointid(point), startfacet->id, isnewfacets, bestoutside, qh MINoutside); - qh_fprintf(qh ferr, 8005, " testhorizon? %d noupper? %d", testhorizon, noupper); - qh_fprintf(qh ferr, 8006, " Last point added was p%d.", qh furthest_id); - qh_fprintf(qh ferr, 8007, " Last merge was #%d. max_outside %2.2g\n", zzval_(Ztotmerge), qh max_outside); + qh_fprintf(qh ferr, 8005, " testhorizon? %d, noupper? %d,", testhorizon, noupper); + qh_fprintf(qh ferr, 8006, " Last qh_addpoint p%d,", qh furthest_id); + qh_fprintf(qh ferr, 8007, " Last merge #%d, max_outside %2.2g\n", zzval_(Ztotmerge), qh max_outside); } +#endif if (isoutside) *isoutside= True; - if (!startfacet->flipped) { /* test startfacet */ + if (!startfacet->flipped) { /* test startfacet before testing its neighbors */ *numpart= 1; qh_distplane(point, startfacet, dist); /* this code is duplicated below */ if (!bestoutside && *dist >= qh MINoutside @@ -209,11 +227,11 @@ facet= neighbor; /* non-NULL only if *dist>bestdist */ } /* end of while facet (directed search) */ if (isnewfacets) { - if (!bestfacet) { + if (!bestfacet) { /* startfacet is upperdelaunay (or flipped) w/o !flipped newfacet neighbors */ bestdist= -REALmax/2; - bestfacet= qh_findbestnew(point, startfacet->next, &bestdist, bestoutside, isoutside, &numpartnew); + bestfacet= qh_findbestnew(point, qh newfacet_list, &bestdist, bestoutside, isoutside, &numpartnew); testhorizon= False; /* qh_findbestnew calls qh_findbesthorizon */ - }else if (!qh findbest_notsharp && bestdist < - qh DISTround) { + }else if (!qh findbest_notsharp && bestdist < -qh DISTround) { if (qh_sharpnewfacets()) { /* seldom used, qh_findbestnew will retest all facets */ zinc_(Zfindnewsharp); @@ -225,8 +243,8 @@ } } if (!bestfacet) - bestfacet= qh_findbestlower(lastfacet, point, &bestdist, numpart); - if (testhorizon) + bestfacet= qh_findbestlower(lastfacet, point, &bestdist, numpart); /* lastfacet is non-NULL because startfacet is non-NULL */ + if (testhorizon) /* qh_findbestnew not called */ bestfacet= qh_findbesthorizon(!qh_IScheckmax, point, bestfacet, noupper, &bestdist, &numpartnew); *dist= bestdist; if (isoutside && bestdist < qh MINoutside) @@ -246,17 +264,24 @@ qh_findbesthorizon( qh_IScheckmax, point, startfacet, qh_NOupper, &bestdist, &numpart ) search coplanar and better horizon facets from startfacet/bestdist ischeckmax turns off statistics and minsearch update - all arguments must be initialized + all arguments must be initialized, including *bestdist and *numpart + qh.coplanarfacetset used to maintain current search set, reset whenever best facet is substantially better returns(ischeckmax): best facet + updates f.maxoutside for neighbors of searched facets (if qh_MAXoutside) returns(!ischeckmax): - best facet that is not upperdelaunay + best facet that is not upperdelaunay or newfacet (qh.first_newfacet) allows upperdelaunay that is clearly outside returns: bestdist is distance to bestfacet numpart -- updates number of distance tests notes: + called by qh_findbest if point is not outside a facet (directed search) + called by qh_findbestnew if point is not outside a new facet + called by qh_check_maxout for each point in hull + called by qh_check_bestdist for each point in hull (rarely used) + no early out -- use qh_findbest() or qh_findbestnew() Searches coplanar or better horizon facets @@ -283,10 +308,11 @@ realT dist; facetT *neighbor, **neighborp, *facet; facetT *nextfacet= NULL; /* optimize last facet of coplanarfacetset */ - int numpartinit= *numpart, coplanarfacetset_size; + int numpartinit= *numpart, coplanarfacetset_size, numcoplanar= 0, numfacet= 0; unsigned int visitid= ++qh visit_id; boolT newbest= False; /* for tracing */ realT minsearch, searchdist; /* skip facets that are too far from point */ + boolT is_5x_minsearch; if (!ischeckmax) { zinc_(Zfindhorizon); @@ -296,30 +322,30 @@ startfacet->maxoutside= *bestdist; #endif } - searchdist= qh_SEARCHdist; /* multiple of qh.max_outside and precision constants */ + searchdist= qh_SEARCHdist; /* an expression, a multiple of qh.max_outside and precision constants */ minsearch= *bestdist - searchdist; if (ischeckmax) { /* Always check coplanar facets. Needed for RBOX 1000 s Z1 G1e-13 t996564279 | QHULL Tv */ minimize_(minsearch, -searchdist); } coplanarfacetset_size= 0; + startfacet->visitid= visitid; facet= startfacet; while (True) { - trace4((qh ferr, 4002, "qh_findbesthorizon: neighbors of f%d bestdist %2.2g f%d ischeckmax? %d noupper? %d minsearch %2.2g searchdist %2.2g\n", + numfacet++; + is_5x_minsearch= (ischeckmax && facet->nummerge > 10 && qh_setsize(facet->neighbors) > 100); /* QH11033 FIX: qh_findbesthorizon: many tests for facets with many merges and neighbors. Can hide coplanar facets, e.g., 'rbox 1000 s Z1 G1e-13' with 4400+ neighbors */ + trace4((qh ferr, 4002, "qh_findbesthorizon: test neighbors of f%d bestdist %2.2g f%d ischeckmax? %d noupper? %d minsearch %2.2g is_5x? %d searchdist %2.2g\n", facet->id, *bestdist, getid_(bestfacet), ischeckmax, noupper, - minsearch, searchdist)); + minsearch, is_5x_minsearch, searchdist)); FOREACHneighbor_(facet) { if (neighbor->visitid == visitid) continue; neighbor->visitid= visitid; - if (!neighbor->flipped) { - qh_distplane(point, neighbor, &dist); + if (!neighbor->flipped) { /* neighbors of flipped facets always searched via nextfacet */ + qh_distplane(point, neighbor, &dist); /* duplicate qh_distpane for new facets, they may be coplanar */ (*numpart)++; if (dist > *bestdist) { if (!neighbor->upperdelaunay || ischeckmax || (!noupper && dist >= qh MINoutside)) { - bestfacet= neighbor; - *bestdist= dist; - newbest= True; if (!ischeckmax) { minsearch= dist - searchdist; if (dist > *bestdist + searchdist) { @@ -327,15 +353,22 @@ coplanarfacetset_size= 0; } } + bestfacet= neighbor; + *bestdist= dist; + newbest= True; } + }else if (is_5x_minsearch) { + if (dist < 5 * minsearch) + continue; /* skip this neighbor, do not set nextfacet. dist is negative */ }else if (dist < minsearch) - continue; /* if ischeckmax, dist can't be positive */ + continue; /* skip this neighbor, do not set nextfacet. If ischeckmax, dist can't be positive */ #if qh_MAXoutside if (ischeckmax && dist > neighbor->maxoutside) neighbor->maxoutside= dist; #endif - } /* end of !flipped */ + } /* end of !flipped, need to search neighbor */ if (nextfacet) { + numcoplanar++; if (!coplanarfacetset_size++) { SETfirst_(qh coplanarfacetset)= nextfacet; SETtruncate_(qh coplanarfacetset, 1); @@ -354,15 +387,16 @@ facet= SETfirstt_(qh coplanarfacetset, facetT); SETtruncate_(qh coplanarfacetset, 0); }else - facet= (facetT*)qh_setdellast(qh coplanarfacetset); - } /* while True, for each facet in qh.coplanarfacetset */ + facet= (facetT *)qh_setdellast(qh coplanarfacetset); + } /* while True, i.e., "for each facet in qh.coplanarfacetset" */ if (!ischeckmax) { zadd_(Zfindhorizontot, *numpart - numpartinit); zmax_(Zfindhorizonmax, *numpart - numpartinit); if (newbest) - zinc_(Zparthorizon); + zinc_(Znewbesthorizon); } - trace4((qh ferr, 4003, "qh_findbesthorizon: newbest? %d bestfacet f%d bestdist %2.2g\n", newbest, getid_(bestfacet), *bestdist)); + trace4((qh ferr, 4003, "qh_findbesthorizon: p%d, newbest? %d, bestfacet f%d, bestdist %2.2g, numfacet %d, coplanarfacets %d, numdist %d\n", + qh_pointid(point), newbest, getid_(bestfacet), *bestdist, numfacet, numcoplanar, *numpart - numpartinit)); return bestfacet; } /* findbesthorizon */ @@ -417,15 +451,17 @@ unsigned int visitid= ++qh visit_id; realT distoutside= 0.0; boolT isdistoutside; /* True if distoutside is defined */ - boolT testhorizon = True; /* needed if precise, e.g., rbox c D6 | qhull Q0 Tv */ + boolT testhorizon= True; /* needed if precise, e.g., rbox c D6 | qhull Q0 Tv */ - if (!startfacet) { - if (qh MERGING) - qh_fprintf(qh ferr, 6001, "qhull precision error (qh_findbestnew): merging has formed and deleted a cone of new facets. Can not continue.\n"); - else + if (!startfacet || !startfacet->next) { + if (qh MERGING) { + qh_fprintf(qh ferr, 6001, "qhull topology error (qh_findbestnew): merging has formed and deleted a cone of new facets. Can not continue.\n"); + qh_errexit(qh_ERRtopology, NULL, NULL); + }else { qh_fprintf(qh ferr, 6002, "qhull internal error (qh_findbestnew): no new facets for point p%d\n", qh furthest_id); - qh_errexit(qh_ERRqhull, NULL, NULL); + qh_errexit(qh_ERRqhull, NULL, NULL); + } } zinc_(Zfindnew); if (qh BESToutside || bestoutside) @@ -437,14 +473,16 @@ if (isoutside) *isoutside= True; *numpart= 0; - if (qh IStracing >= 3 || (qh TRACElevel && qh TRACEpoint >= 0 && qh TRACEpoint == qh_pointid(point))) { +#ifndef qh_NOtrace + if (qh IStracing >= 4 || (qh TRACElevel && qh TRACEpoint >= 0 && qh TRACEpoint == qh_pointid(point))) { if (qh TRACElevel > qh IStracing) qh IStracing= qh TRACElevel; - qh_fprintf(qh ferr, 8008, "qh_findbestnew: point p%d facet f%d. Stop? %d if dist > %2.2g\n", + qh_fprintf(qh ferr, 8008, "qh_findbestnew: point p%d facet f%d. Stop? %d if dist > %2.2g,", qh_pointid(point), startfacet->id, isdistoutside, distoutside); - qh_fprintf(qh ferr, 8009, " Last point added p%d visitid %d.", qh furthest_id, visitid); - qh_fprintf(qh ferr, 8010, " Last merge was #%d.\n", zzval_(Ztotmerge)); + qh_fprintf(qh ferr, 8009, " Last qh_addpoint p%d, qh.visit_id %d, vertex_visit %d,", qh furthest_id, visitid, qh vertex_visit); + qh_fprintf(qh ferr, 8010, " Last merge #%d\n", zzval_(Ztotmerge)); } +#endif /* visit all new facets starting with startfacet, maybe qh facet_list */ for (i=0, facet=startfacet; i < 2; i++, facet= qh newfacet_list) { FORALLfacet_(facet) { @@ -474,7 +512,8 @@ LABELreturn_bestnew: zadd_(Zfindnewtot, *numpart); zmax_(Zfindnewmax, *numpart); - trace4((qh ferr, 4004, "qh_findbestnew: bestfacet f%d bestdist %2.2g\n", getid_(bestfacet), *dist)); + trace4((qh ferr, 4004, "qh_findbestnew: bestfacet f%d bestdist %2.2g for p%d f%d bestoutside? %d \n", + getid_(bestfacet), *dist, qh_pointid(point), startfacet->id, bestoutside)); qh IStracing= oldtrace; return bestfacet; } /* findbestnew */ @@ -550,10 +589,10 @@ } } if (zerocol != -1) { - zzinc_(Zback0); *nearzero= True; trace4((qh ferr, 4005, "qh_backnormal: zero diagonal at column %d.\n", i)); - qh_precision("zero diagonal on back substitution"); + zzinc_(Zback0); + qh_joggle_restart("zero diagonal on back substitution"); } } /* backnormal */ @@ -603,12 +642,14 @@ if (pivot_abs <= qh NEARzero[k]) { *nearzero= True; if (pivot_abs == 0.0) { /* remainder of column == 0 */ +#ifndef qh_NOtrace if (qh IStracing >= 4) { qh_fprintf(qh ferr, 8011, "qh_gausselim: 0 pivot at column %d. (%2.2g < %2.2g)\n", k, pivot_abs, qh DISTround); qh_printmatrix(qh ferr, "Matrix:", rows, numrow, numcol); } +#endif zzinc_(Zgauss0); - qh_precision("zero pivot for Gaussian elimination"); + qh_joggle_restart("zero pivot for Gaussian elimination"); goto LABELnextcol; } } @@ -652,7 +693,7 @@ angle += (2.0 * randr / qh_RANDOMmax - 1.0) * qh RANDOMfactor; } - trace4((qh ferr, 4006, "qh_getangle: %2.2g\n", angle)); + trace4((qh ferr, 4006, "qh_getangle: %4.4g\n", angle)); return(angle); } /* getangle */ @@ -716,7 +757,7 @@ >-------------------------------- qh_getdistance( facet, neighbor, mindist, maxdist ) - returns the maxdist and mindist distance of any vertex from neighbor + returns the min and max distance to neighbor of non-neighbor vertices in facet returns: the max absolute value @@ -725,9 +766,9 @@ for each vertex of facet that is not in neighbor test the distance from vertex to neighbor */ -realT qh_getdistance(facetT *facet, facetT *neighbor, realT *mindist, realT *maxdist) { +coordT qh_getdistance(facetT *facet, facetT *neighbor, coordT *mindist, coordT *maxdist) { vertexT *vertex, **vertexp; - realT dist, maxd, mind; + coordT dist, maxd, mind; FOREACHvertex_(facet->vertices) vertex->seen= False; @@ -766,7 +807,7 @@ qh_normalize2 */ void qh_normalize(coordT *normal, int dim, boolT toporient) { - qh_normalize2( normal, dim, toporient, NULL, NULL); + qh_normalize2(normal, dim, toporient, NULL, NULL); } /* normalize */ /*-normal) qh_memalloc_(normsize, freelistp, facet->normal, coordT); +#ifndef qh_NOtrace if (facet == qh tracefacet) { oldtrace= qh IStracing; qh IStracing= 5; @@ -950,6 +993,7 @@ qh_fprintf(qh ferr, 8015, "\n\nCurrent summary is:\n"); qh_printsummary(qh ferr); } +#endif if (qh hull_dim <= 4) { i= 0; if (qh RANDOMdist) { @@ -991,7 +1035,7 @@ facet->normal, &facet->offset, &nearzero); if (nearzero) { if (qh_orientoutside(facet)) { - trace0((qh ferr, 2, "qh_setfacetplane: flipped orientation after testing interior_point during p%d\n", qh furthest_id)); + trace0((qh ferr, 2, "qh_setfacetplane: flipped orientation due to nearzero gauss and interior_point test. During p%d\n", qh furthest_id)); /* this is part of using Gaussian Elimination. For example in 5-d 1 1 1 1 0 1 1 1 1 1 @@ -1036,7 +1080,7 @@ }else if (-dist > qh TRACEdist) istrace= True; if (istrace) { - qh_fprintf(qh ferr, 8016, "qh_setfacetplane: ====== vertex p%d(v%d) increases max_outside to %2.2g for new facet f%d last p%d\n", + qh_fprintf(qh ferr, 3060, "qh_setfacetplane: ====== vertex p%d(v%d) increases max_outside to %2.2g for new facet f%d last p%d\n", qh_pointid(vertex->point), vertex->id, dist, facet->id, qh furthest_id); qh_errprint("DISTANT", facet, NULL, NULL, NULL); } @@ -1044,15 +1088,20 @@ } qh RANDOMdist= qh old_randomdist; } - if (qh IStracing >= 3) { +#ifndef qh_NOtrace + if (qh IStracing >= 4) { qh_fprintf(qh ferr, 8017, "qh_setfacetplane: f%d offset %2.2g normal: ", facet->id, facet->offset); for (k=0; k < qh hull_dim; k++) qh_fprintf(qh ferr, 8018, "%2.2g ", facet->normal[k]); qh_fprintf(qh ferr, 8019, "\n"); } - if (facet == qh tracefacet) +#endif + qh_checkflipped(facet, NULL, qh_ALL); + if (facet == qh tracefacet) { qh IStracing= oldtrace; + qh_printfacet(qh ferr, facet); + } } /* setfacetplane */ @@ -1166,8 +1215,8 @@ } if (*nearzero) { zzinc_(Zminnorm); - trace0((qh ferr, 3, "qh_sethyperplane_det: degenerate norm during p%d.\n", qh furthest_id)); - zzinc_(Znearlysingular); + /* qh_joggle_restart not needed, will call qh_sethyperplane_gauss instead */ + trace0((qh ferr, 3, "qh_sethyperplane_det: degenerate norm during p%d, use qh_sethyperplane_gauss instead.\n", qh furthest_id)); } } /* sethyperplane_det */ @@ -1211,6 +1260,7 @@ } if (*nearzero) { zzinc_(Znearlysingular); + /* qh_joggle_restart ignored for Znearlysingular, normal part of qh_sethyperplane_gauss */ trace0((qh ferr, 4, "qh_sethyperplane_gauss: nearly singular or axis parallel hyperplane during p%d.\n", qh furthest_id)); qh_backnormal(rows, dim-1, dim, sign, normal, &nearzero2); }else { diff -Nru qhull-2015.2/src/libqhull/geom.h qhull-2020.2/src/libqhull/geom.h --- qhull-2015.2/src/libqhull/geom.h 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/src/libqhull/geom.h 2020-05-22 02:00:58.000000000 +0000 @@ -6,9 +6,9 @@ see qh-geom.htm and geom.c - Copyright (c) 1993-2015 The Geometry Center. - $Id: //main/2015/qhull/src/libqhull/geom.h#1 $$Change: 1981 $ - $DateTime: 2015/09/28 20:26:32 $$Author: bbarber $ + Copyright (c) 1993-2020 The Geometry Center. + $Id: //main/2019/qhull/src/libqhull/geom.h#2 $$Change: 2953 $ + $DateTime: 2020/05/21 22:05:32 $$Author: bbarber $ */ #ifndef qhDEFgeom @@ -111,7 +111,7 @@ realT qh_getangle(pointT *vect1, pointT *vect2); pointT *qh_getcenter(setT *vertices); pointT *qh_getcentrum(facetT *facet); -realT qh_getdistance(facetT *facet, facetT *neighbor, realT *mindist, realT *maxdist); +coordT qh_getdistance(facetT *facet, facetT *neighbor, coordT *mindist, coordT *maxdist); void qh_normalize(coordT *normal, int dim, boolT toporient); void qh_normalize2(coordT *normal, int dim, boolT toporient, realT *minnorm, boolT *ismin); @@ -130,6 +130,7 @@ void qh_crossproduct(int dim, realT vecA[3], realT vecB[3], realT vecC[3]); realT qh_determinant(realT **rows, int dim, boolT *nearzero); realT qh_detjoggle(pointT *points, int numpoints, int dimension); +void qh_detmaxoutside(void); void qh_detroundoff(void); realT qh_detsimplex(pointT *apex, setT *points, int dim, boolT *nearzero); realT qh_distnorm(int dim, pointT *point, pointT *normal, realT *offsetp); @@ -140,6 +141,8 @@ vertexT *notvertex, boolT toporient, coordT *normal, realT *offset); pointT *qh_facetcenter(setT *vertices); facetT *qh_findgooddist(pointT *point, facetT *facetA, realT *distp, facetT **facetlist); +vertexT *qh_furthestnewvertex(unsigned int unvisited, facetT *facet, realT *maxdistp /* qh.newvertex_list */); +vertexT *qh_furthestvertex(facetT *facetA, facetT *facetB, realT *maxdistp, realT *mindistp); void qh_getarea(facetT *facetlist); boolT qh_gram_schmidt(int dim, realT **rows); boolT qh_inthresholds(coordT *normal, realT *angle); @@ -168,6 +171,8 @@ boolT qh_sethalfspace(int dim, coordT *coords, coordT **nextp, coordT *normal, coordT *offset, coordT *feasible); coordT *qh_sethalfspace_all(int dim, int count, coordT *halfspaces, pointT *feasible); +coordT qh_vertex_bestdist(setT *vertices); +coordT qh_vertex_bestdist2(setT *vertices, vertexT **vertexp, vertexT **vertexp2); pointT *qh_voronoi_center(int dim, setT *points); #endif /* qhDEFgeom */ diff -Nru qhull-2015.2/src/libqhull/global.c qhull-2020.2/src/libqhull/global.c --- qhull-2015.2/src/libqhull/global.c 2016-01-18 23:59:10.000000000 +0000 +++ qhull-2020.2/src/libqhull/global.c 2020-09-03 21:25:32.000000000 +0000 @@ -11,9 +11,9 @@ see qhull_a.h for internal functions - Copyright (c) 1993-2015 The Geometry Center. - $Id: //main/2015/qhull/src/libqhull/global.c#17 $$Change: 2066 $ - $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $ + Copyright (c) 1993-2020 The Geometry Center. + $Id: //main/2019/qhull/src/libqhull/global.c#16 $$Change: 3037 $ + $DateTime: 2020/09/03 17:28:32 $$Author: bbarber $ */ #include "qhull_a.h" @@ -29,7 +29,7 @@ #endif /*---------------------------------- + >--------------------------------- qh_version version string by year and date @@ -41,14 +41,14 @@ change date: Changes.txt, Announce.txt, index.htm, README.txt, qhull-news.html, Eudora signatures, CMakeLists.txt change version: README.txt, qh-get.htm, File_id.diz, Makefile.txt, CMakeLists.txt - check that CmakeLists @version is the same as qh_version2 + check that CMakeLists.txt @version is the same as qh_version2 change year: Copying.txt check download size recompile user_eg.c, rbox.c, libqhull.c, qconvex.c, qdelaun.c qvoronoi.c, qhalf.c, testqset.c */ -const char qh_version[]= "2015.2 2016/01/18"; -const char qh_version2[]= "qhull 7.2.0 (2015.2 2016/01/18)"; +const char qh_version[]= "2020.2 2020/08/31"; +const char qh_version2[]= "qhull 8.0.2 (2020.2 2020/08/31)"; /*--------------------------------- @@ -86,18 +86,18 @@ void qh_checkflags(char *command, char *hiddenflags) { char *s= command, *t, *chkerr; /* qh_skipfilename is non-const */ char key, opt, prevopt; - char chkkey[]= " "; - char chkopt[]= " "; - char chkopt2[]= " "; + char chkkey[]= " "; /* check one character options ('s') */ + char chkopt[]= " "; /* check two character options ('Ta') */ + char chkopt2[]= " "; /* check three character options ('Q12') */ boolT waserr= False; if (*hiddenflags != ' ' || hiddenflags[strlen(hiddenflags)-1] != ' ') { - qh_fprintf(qh ferr, 6026, "qhull error (qh_checkflags): hiddenflags must start and end with a space: \"%s\"", hiddenflags); - qh_errexit(qh_ERRinput, NULL, NULL); + qh_fprintf(qh ferr, 6026, "qhull internal error (qh_checkflags): hiddenflags must start and end with a space: \"%s\"\n", hiddenflags); + qh_errexit(qh_ERRqhull, NULL, NULL); } if (strpbrk(hiddenflags, ",\n\r\t")) { - qh_fprintf(qh ferr, 6027, "qhull error (qh_checkflags): hiddenflags contains commas, newlines, or tabs: \"%s\"", hiddenflags); - qh_errexit(qh_ERRinput, NULL, NULL); + qh_fprintf(qh ferr, 6027, "qhull internal error (qh_checkflags): hiddenflags contains commas, newlines, or tabs: \"%s\"\n", hiddenflags); + qh_errexit(qh_ERRqhull, NULL, NULL); } while (*s && !isspace(*s)) /* skip program name */ s++; @@ -108,8 +108,8 @@ s++; if (!*s) break; - key = *s++; - chkerr = NULL; + key= *s++; + chkerr= NULL; if (key == 'T' && (*s == 'I' || *s == 'O')) { /* TI or TO 'file name' */ s= qh_skipfilename(++s); continue; @@ -136,9 +136,16 @@ } }else if (key == 'Q' && isdigit(opt) && prevopt != 'b' && (prevopt == ' ' || islower(prevopt))) { - chkopt[2]= opt; - if (strstr(hiddenflags, chkopt)) - chkerr= chkopt; + if (isdigit(*s)) { /* Q12 */ + chkopt2[2]= opt; + chkopt2[3]= *s++; + if (strstr(hiddenflags, chkopt2)) + chkerr= chkopt2; + }else { + chkopt[2]= opt; + if (strstr(hiddenflags, chkopt)) + chkerr= chkopt; + } }else { qh_strtod(s-1, &t); if (s < t) @@ -150,7 +157,7 @@ if (chkerr) { *chkerr= '\''; chkerr[strlen(chkerr)-1]= '\''; - qh_fprintf(qh ferr, 6029, "qhull error: option %s is not used with this program.\n It may be used with qhull.\n", chkerr); + qh_fprintf(qh ferr, 6029, "qhull option error: option %s is not used with this program.\n It may be used with qhull.\n", chkerr); waserr= True; } } @@ -159,9 +166,9 @@ } /* checkflags */ /*--------------------------------- + >-------------------------------- - qh_clear_outputflags() + qh_clear_outputflags( ) Clear output flags for QhullPoints */ void qh_clear_outputflags(void) { @@ -277,20 +284,21 @@ trace5((qh ferr, 5001, "qh_freebuffers: freeing up global memory buffers\n")); /* allocated by qh_initqhull_buffers */ - qh_memfree(qh NEARzero, qh hull_dim * sizeof(realT)); - qh_memfree(qh lower_threshold, (qh input_dim+1) * sizeof(realT)); - qh_memfree(qh upper_threshold, (qh input_dim+1) * sizeof(realT)); - qh_memfree(qh lower_bound, (qh input_dim+1) * sizeof(realT)); - qh_memfree(qh upper_bound, (qh input_dim+1) * sizeof(realT)); - qh_memfree(qh gm_matrix, (qh hull_dim+1) * qh hull_dim * sizeof(coordT)); - qh_memfree(qh gm_row, (qh hull_dim+1) * sizeof(coordT *)); + qh_setfree(&qh other_points); + qh_setfree(&qh del_vertices); + qh_setfree(&qh coplanarfacetset); + qh_memfree(qh NEARzero, qh hull_dim * (int)sizeof(realT)); + qh_memfree(qh lower_threshold, (qh input_dim+1) * (int)sizeof(realT)); + qh_memfree(qh upper_threshold, (qh input_dim+1) * (int)sizeof(realT)); + qh_memfree(qh lower_bound, (qh input_dim+1) * (int)sizeof(realT)); + qh_memfree(qh upper_bound, (qh input_dim+1) * (int)sizeof(realT)); + qh_memfree(qh gm_matrix, (qh hull_dim+1) * qh hull_dim * (int)sizeof(coordT)); + qh_memfree(qh gm_row, (qh hull_dim+1) * (int)sizeof(coordT *)); qh NEARzero= qh lower_threshold= qh upper_threshold= NULL; qh lower_bound= qh upper_bound= NULL; qh gm_matrix= NULL; qh gm_row= NULL; - qh_setfree(&qh other_points); - qh_setfree(&qh del_vertices); - qh_setfree(&qh coplanarfacetset); + if (qh line) /* allocated by qh_readinput, freed if no error */ qh_free(qh line); if (qh half_space) @@ -327,22 +335,37 @@ design: free centrums free each vertex - mark unattached ridges for each facet free ridges free outside set, coplanar set, neighbor set, ridge set, vertex set free facet free hash table free interior point - free merge set + free merge sets free temporary sets */ void qh_freebuild(boolT allmem) { - facetT *facet; - vertexT *vertex; - ridgeT *ridge, **ridgep; + facetT *facet, *previousfacet= NULL; + vertexT *vertex, *previousvertex= NULL; + ridgeT *ridge, **ridgep, *previousridge= NULL; mergeT *merge, **mergep; + int newsize; + boolT freeall; + /* free qhT global sets first, includes references from qh_buildhull */ + trace5((qh ferr, 5004, "qh_freebuild: free global sets\n")); + FOREACHmerge_(qh facet_mergeset) /* usually empty */ + qh_memfree(merge, (int)sizeof(mergeT)); + FOREACHmerge_(qh degen_mergeset) /* usually empty */ + qh_memfree(merge, (int)sizeof(mergeT)); + FOREACHmerge_(qh vertex_mergeset) /* usually empty */ + qh_memfree(merge, (int)sizeof(mergeT)); + qh facet_mergeset= NULL; /* temp set freed by qh_settempfree_all */ + qh degen_mergeset= NULL; /* temp set freed by qh_settempfree_all */ + qh vertex_mergeset= NULL; /* temp set freed by qh_settempfree_all */ + qh_setfree(&(qh hash_table)); + trace5((qh ferr, 5003, "qh_freebuild: free temporary sets (qh_settempfree_all)\n")); + qh_settempfree_all(); trace1((qh ferr, 1005, "qh_freebuild: free memory from qh_inithull and qh_buildhull\n")); if (qh del_vertices) qh_settruncate(qh del_vertices, 0); @@ -351,9 +374,12 @@ if (vertex->next) qh_delvertex(vertex); else { - qh_memfree(vertex, (int)sizeof(vertexT)); + qh_memfree(vertex, (int)sizeof(vertexT)); /* sentinel */ qh newvertex_list= qh vertex_list= NULL; + break; } + previousvertex= vertex; /* in case of memory fault */ + QHULL_UNUSED(previousvertex) } }else if (qh VERTEXneighbors) { FORALLvertices @@ -366,22 +392,18 @@ FOREACHridge_(facet->ridges) ridge->seen= False; } - FORALLfacets { - if (facet->visible) { + while ((facet= qh facet_list)) { + if (!facet->newfacet || !qh NEWtentative || qh_setsize(facet->ridges) > 1) { /* skip tentative horizon ridges */ + trace4((qh ferr, 4095, "qh_freebuild: delete the previously-seen ridges of f%d\n", facet->id)); FOREACHridge_(facet->ridges) { - if (!otherfacet_(ridge, facet)->visible) - ridge->seen= True; /* an unattached ridge */ + if (ridge->seen) + qh_delridge(ridge); + else + ridge->seen= True; + previousridge= ridge; /* in case of memory fault */ + QHULL_UNUSED(previousridge) } } - } - while ((facet= qh facet_list)) { - FOREACHridge_(facet->ridges) { - if (ridge->seen) { - qh_setfree(&(ridge->vertices)); - qh_memfree(ridge, (int)sizeof(ridgeT)); - }else - ridge->seen= True; - } qh_setfree(&(facet->outsideset)); qh_setfree(&(facet->coplanarset)); qh_setfree(&(facet->neighbors)); @@ -393,26 +415,26 @@ qh_memfree(facet, (int)sizeof(facetT)); qh visible_list= qh newfacet_list= qh facet_list= NULL; } + previousfacet= facet; /* in case of memory fault */ + QHULL_UNUSED(previousfacet) } }else { + freeall= True; + if (qh_setlarger_quick(qh hull_dim + 1, &newsize)) + freeall= False; FORALLfacets { qh_setfreelong(&(facet->outsideset)); qh_setfreelong(&(facet->coplanarset)); - if (!facet->simplicial) { + if (!facet->simplicial || freeall) { qh_setfreelong(&(facet->neighbors)); qh_setfreelong(&(facet->ridges)); qh_setfreelong(&(facet->vertices)); } } } - qh_setfree(&(qh hash_table)); + /* qh internal constants */ qh_memfree(qh interior_point, qh normal_size); qh interior_point= NULL; - FOREACHmerge_(qh facet_mergeset) /* usually empty */ - qh_memfree(merge, (int)sizeof(mergeT)); - qh facet_mergeset= NULL; /* temp set */ - qh degen_mergeset= NULL; /* temp set */ - qh_settempfree_all(); } /* freebuild */ /*-NOerrexit + calls qh_exit() if qh.NOerrexit returns: sets qh.qhull_command to command if needed notes: - ignores first word (e.g., "qhull d") + ignores first word (e.g., 'qhull' in "qhull d") use qh_strtol/strtod since strtol/strtod may or may not skip trailing spaces see: @@ -614,14 +636,19 @@ */ void qh_initflags(char *command) { int k, i, lastproject; - char *s= command, *t, *prev_s, *start, key; + char *s= command, *t, *prev_s, *start, key, *lastwarning= NULL; boolT isgeom= False, wasproject; realT r; - if(qh NOerrexit){/* without this comment, segfault in gcc 4.4.0 mingw32 */ - qh_fprintf(qh ferr, 6245, "qhull initflags error: qh.NOerrexit was not cleared before calling qh_initflags(). It should be cleared after setjmp(). Exit qhull."); - qh_exit(6245); - } + if(qh NOerrexit){ + qh_fprintf(qh ferr, 6245, "qhull internal error (qh_initflags): qh.NOerrexit was not cleared before calling qh_initflags(). It should be cleared after setjmp(). Exit qhull.\n"); + qh_exit(qh_ERRqhull); + } +#ifdef qh_RANDOMdist + qh RANDOMfactor= qh_RANDOMdist; + qh_option("Random-qh_RANDOMdist", NULL, &qh RANDOMfactor); + qh RANDOMdist= True; +#endif if (command <= &qh qhull_command[0] || command > &qh qhull_command[0] + sizeof(qh qhull_command)) { if (command != &qh qhull_command[0]) { *qh qhull_command= '\0'; @@ -630,6 +657,8 @@ while (*s && !isspace(*s)) /* skip program name */ s++; } + if (qh_QHpointer) + qh_option("qh_QHpointer", NULL, NULL); while (*s) { while (*s && isspace(*s)) s++; @@ -677,9 +706,10 @@ qh DELAUNAY= True; break; case 'A': - if (!isdigit(*s) && *s != '.' && *s != '-') - qh_fprintf(qh ferr, 7002, "qhull warning: no maximum cosine angle given for option 'An'. Ignored.\n"); - else { + if (!isdigit(*s) && *s != '.' && *s != '-') { + qh_fprintf(qh ferr, 7002, "qhull input warning: no maximum cosine angle given for option 'An'. A1.0 is coplanar\n"); + lastwarning= s-1; + }else { if (*s == '-') { qh premerge_cos= -qh_strtod(s, &s); qh_option("Angle-premerge-", NULL, &qh premerge_cos); @@ -693,9 +723,10 @@ } break; case 'C': - if (!isdigit(*s) && *s != '.' && *s != '-') - qh_fprintf(qh ferr, 7003, "qhull warning: no centrum radius given for option 'Cn'. Ignored.\n"); - else { + if (!isdigit(*s) && *s != '.' && *s != '-') { + qh_fprintf(qh ferr, 7003, "qhull input warning: no centrum radius given for option 'Cn'\n"); + lastwarning= s-1; + }else { if (*s == '-') { qh premerge_centrum= -qh_strtod(s, &s); qh_option("Centrum-premerge-", NULL, &qh premerge_centrum); @@ -709,11 +740,13 @@ } break; case 'E': - if (*s == '-') - qh_fprintf(qh ferr, 7004, "qhull warning: negative maximum roundoff given for option 'An'. Ignored.\n"); - else if (!isdigit(*s)) - qh_fprintf(qh ferr, 7005, "qhull warning: no maximum roundoff given for option 'En'. Ignored.\n"); - else { + if (*s == '-') { + qh_fprintf(qh ferr, 6363, "qhull option error: expecting a positive number for maximum roundoff 'En'. Got '%s'\n", s-1); + qh_errexit(qh_ERRinput, NULL, NULL); + }else if (!isdigit(*s)) { + qh_fprintf(qh ferr, 7005, "qhull option warning: no maximum roundoff given for option 'En'\n"); + lastwarning= s-1; + }else { qh DISTround= qh_strtod(s, &s); qh_option("Distance-roundoff", NULL, &qh DISTround); qh SETroundoff= True; @@ -727,14 +760,16 @@ if (*t && !isspace(*t)) { if (*t == ',') t++; - else - qh_fprintf(qh ferr, 7006, "qhull warning: origin for Halfspace intersection should be 'Hn,n,n,...'\n"); + else { + qh_fprintf(qh ferr, 6364, "qhull option error: expecting 'Hn,n,n,...' for feasible point of halfspace intersection. Got '%s'\n", start-1); + qh_errexit(qh_ERRinput, NULL, NULL); + } } s= t; qh_strtod(s, &t); } if (start < t) { - if (!(qh feasible_string= (char*)calloc((size_t)(t-start+1), (size_t)1))) { + if (!(qh feasible_string= (char *)calloc((size_t)(t-start+1), (size_t)1))) { qh_fprintf(qh ferr, 6034, "qhull error: insufficient memory for 'Hn,n,n'\n"); qh_errexit(qh_ERRmem, NULL, NULL); } @@ -745,36 +780,41 @@ qh_option("Halfspace", NULL, NULL); break; case 'R': - if (!isdigit(*s)) - qh_fprintf(qh ferr, 7007, "qhull warning: missing random perturbation for option 'Rn'. Ignored\n"); - else { + if (!isdigit(*s)) { + qh_fprintf(qh ferr, 7007, "qhull option warning: missing random perturbation for option 'Rn'\n"); + lastwarning= s-1; + }else { qh RANDOMfactor= qh_strtod(s, &s); - qh_option("Random_perturb", NULL, &qh RANDOMfactor); + qh_option("Random-perturb", NULL, &qh RANDOMfactor); qh RANDOMdist= True; } break; case 'V': - if (!isdigit(*s) && *s != '-') - qh_fprintf(qh ferr, 7008, "qhull warning: missing visible distance for option 'Vn'. Ignored\n"); - else { + if (!isdigit(*s) && *s != '-') { + qh_fprintf(qh ferr, 7008, "qhull option warning: missing visible distance for option 'Vn'\n"); + lastwarning= s-1; + }else { qh MINvisible= qh_strtod(s, &s); qh_option("Visible", NULL, &qh MINvisible); } break; case 'U': - if (!isdigit(*s) && *s != '-') - qh_fprintf(qh ferr, 7009, "qhull warning: missing coplanar distance for option 'Un'. Ignored\n"); - else { + if (!isdigit(*s) && *s != '-') { + qh_fprintf(qh ferr, 7009, "qhull option warning: missing coplanar distance for option 'Un'\n"); + lastwarning= s-1; + }else { qh MAXcoplanar= qh_strtod(s, &s); qh_option("U-coplanar", NULL, &qh MAXcoplanar); } break; case 'W': - if (*s == '-') - qh_fprintf(qh ferr, 7010, "qhull warning: negative outside width for option 'Wn'. Ignored.\n"); - else if (!isdigit(*s)) - qh_fprintf(qh ferr, 7011, "qhull warning: missing outside width for option 'Wn'. Ignored\n"); - else { + if (*s == '-') { + qh_fprintf(qh ferr, 6365, "qhull option error: expecting a positive number for outside width 'Wn'. Got '%s'\n", s-1); + qh_errexit(qh_ERRinput, NULL, NULL); + }else if (!isdigit(*s)) { + qh_fprintf(qh ferr, 7011, "qhull option warning: missing outside width for option 'Wn'\n"); + lastwarning= s-1; + }else { qh MINoutside= qh_strtod(s, &s); qh_option("W-outside", NULL, &qh MINoutside); qh APPROXhull= True; @@ -887,7 +927,8 @@ break; default: s--; - qh_fprintf(qh ferr, 7012, "qhull warning: unknown 'F' output option %c, rest ignored\n", (int)s[0]); + qh_fprintf(qh ferr, 7012, "qhull option warning: unknown 'F' output option 'F%c', skip to next space\n", (int)s[0]); + lastwarning= s-1; while (*++s && !isspace(*s)); break; } @@ -939,19 +980,23 @@ qh PRINTspheres= True; break; case 'D': - if (!isdigit(*s)) - qh_fprintf(qh ferr, 6035, "qhull input error: missing dimension for option 'GDn'\n"); - else { - if (qh DROPdim >= 0) - qh_fprintf(qh ferr, 7013, "qhull warning: can only drop one dimension. Previous 'GD%d' ignored\n", + if (!isdigit(*s)) { + qh_fprintf(qh ferr, 7004, "qhull option warning: missing dimension for option 'GDn'\n"); + lastwarning= s-2; + }else { + if (qh DROPdim >= 0) { + qh_fprintf(qh ferr, 7013, "qhull option warning: can only drop one dimension. Previous 'GD%d' ignored\n", qh DROPdim); + lastwarning= s-2; + } qh DROPdim= qh_strtol(s, &s); qh_option("GDrop-dim", &qh DROPdim, NULL); } break; default: s--; - qh_fprintf(qh ferr, 7014, "qhull warning: unknown 'G' print option %c, rest ignored\n", (int)s[0]); + qh_fprintf(qh ferr, 7014, "qhull option warning: unknown 'G' geomview option 'G%c', skip to next space\n", (int)s[0]); + lastwarning= s-1; while (*++s && !isspace(*s)); break; } @@ -990,34 +1035,38 @@ qh PRINTprecision= False; break; case 'A': - if (!isdigit(*s)) - qh_fprintf(qh ferr, 6036, "qhull input error: missing facet count for keep area option 'PAn'\n"); - else { + if (!isdigit(*s)) { + qh_fprintf(qh ferr, 7006, "qhull option warning: missing facet count for keep area option 'PAn'\n"); + lastwarning= s-2; + }else { qh KEEParea= qh_strtol(s, &s); qh_option("PArea-keep", &qh KEEParea, NULL); qh GETarea= True; } break; case 'F': - if (!isdigit(*s)) - qh_fprintf(qh ferr, 6037, "qhull input error: missing facet area for option 'PFn'\n"); - else { + if (!isdigit(*s)) { + qh_fprintf(qh ferr, 7010, "qhull option warning: missing facet area for option 'PFn'\n"); + lastwarning= s-2; + }else { qh KEEPminArea= qh_strtod(s, &s); qh_option("PFacet-area-keep", NULL, &qh KEEPminArea); qh GETarea= True; } break; case 'M': - if (!isdigit(*s)) - qh_fprintf(qh ferr, 6038, "qhull input error: missing merge count for option 'PMn'\n"); - else { + if (!isdigit(*s)) { + qh_fprintf(qh ferr, 7090, "qhull option warning: missing merge count for option 'PMn'\n"); + lastwarning= s-2; + }else { qh KEEPmerge= qh_strtol(s, &s); qh_option("PMerge-keep", &qh KEEPmerge, NULL); } break; default: s--; - qh_fprintf(qh ferr, 7015, "qhull warning: unknown 'P' print option %c, rest ignored\n", (int)s[0]); + qh_fprintf(qh ferr, 7015, "qhull option warning: unknown 'P' print option 'P%c', skip to next space\n", (int)s[0]); + lastwarning= s-1; while (*++s && !isspace(*s)); break; } @@ -1027,6 +1076,10 @@ lastproject= -1; while (*s && !isspace(*s)) { switch (*s++) { + case 'a': + qh_option("Qallow-short", NULL, NULL); + qh ALLOWshort= True; + break; case 'b': case 'B': /* handled by qh_initthresholds */ key= s[-1]; if (key == 'b' && *s == 'B') { @@ -1114,9 +1167,10 @@ break; case 'T': qh_option("QTestPoints", NULL, NULL); - if (!isdigit(*s)) - qh_fprintf(qh ferr, 6039, "qhull input error: missing number of test points for option 'QTn'\n"); - else { + if (!isdigit(*s)) { + qh_fprintf(qh ferr, 7091, "qhull option warning: missing number of test points for option 'QTn'\n"); + lastwarning= s-2; + }else { qh TESTpoints= qh_strtol(s, &s); qh_option("QTestPoints", &qh TESTpoints, NULL); } @@ -1143,8 +1197,8 @@ break; case '1': if (!isdigit(*s)) { - qh_option("Q1-no-angle-sort", NULL, NULL); - qh ANGLEmerge= False; + qh_option("Q1-angle-merge", NULL, NULL); + qh ANGLEmerge= True; break; } switch (*s++) { @@ -1158,12 +1212,26 @@ qh TRIangulate= True; break; case '2': - qh_option("Q12-no-wide-dup", NULL, NULL); - qh NOwide= True; + qh_option("Q12-allow-wide", NULL, NULL); + qh ALLOWwide= True; + break; + case '4': +#ifndef qh_NOmerge + qh_option("Q14-merge-pinched-vertices", NULL, NULL); + qh MERGEpinched= True; +#else + /* ignore 'Q14' for q_benchmark testing of difficult cases for Qhull */ + qh_fprintf(qh ferr, 7099, "qhull option warning: option 'Q14-merge-pinched' disabled due to qh_NOmerge\n"); +#endif + break; + case '7': + qh_option("Q15-check-duplicates", NULL, NULL); + qh CHECKduplicates= True; break; default: s--; - qh_fprintf(qh ferr, 7016, "qhull warning: unknown 'Q' qhull option 1%c, rest ignored\n", (int)s[0]); + qh_fprintf(qh ferr, 7016, "qhull option warning: unknown 'Q' qhull option 'Q1%c', skip to next space\n", (int)s[0]); + lastwarning= s-1; while (*++s && !isspace(*s)); break; } @@ -1172,14 +1240,16 @@ qh_option("Q2-no-merge-independent", NULL, NULL); qh MERGEindependent= False; goto LABELcheckdigit; - break; /* no warnings */ + break; /* no gcc warnings */ case '3': qh_option("Q3-no-merge-vertices", NULL, NULL); qh MERGEvertices= False; LABELcheckdigit: - if (isdigit(*s)) - qh_fprintf(qh ferr, 7017, "qhull warning: can not follow '1', '2', or '3' with a digit. '%c' skipped.\n", - *s++); + if (isdigit(*s)) { + qh_fprintf(qh ferr, 7017, "qhull option warning: can not follow '1', '2', or '3' with a digit. 'Q%c%c' skipped\n", *(s-1), *s); + lastwarning= s-2; + s++; + } break; case '4': qh_option("Q4-avoid-old-into-new", NULL, NULL); @@ -1207,11 +1277,13 @@ break; case 'G': i= qh_strtol(s, &t); - if (qh GOODpoint) - qh_fprintf(qh ferr, 7018, "qhull warning: good point already defined for option 'QGn'. Ignored\n"); - else if (s == t) - qh_fprintf(qh ferr, 7019, "qhull warning: missing good point id for option 'QGn'. Ignored\n"); - else if (i < 0 || *s == '-') { + if (qh GOODpoint) { + qh_fprintf(qh ferr, 7018, "qhull option warning: good point already defined for option 'QGn'. Ignored\n"); + lastwarning= s-2; + }else if (s == t) { + qh_fprintf(qh ferr, 7019, "qhull option warning: missing good point id for option 'QGn'. Ignored\n"); + lastwarning= s-2; + }else if (i < 0 || *s == '-') { qh GOODpoint= i-1; qh_option("QGood-if-dont-see-point", &i, NULL); }else { @@ -1229,9 +1301,10 @@ } break; case 'R': - if (!isdigit(*s) && *s != '-') - qh_fprintf(qh ferr, 7020, "qhull warning: missing random seed for option 'QRn'. Ignored\n"); - else { + if (!isdigit(*s) && *s != '-') { + qh_fprintf(qh ferr, 7020, "qhull option warning: missing random seed for option 'QRn'\n"); + lastwarning= s-2; + }else { qh ROTATErandom= i= qh_strtol(s, &s); if (i > 0) qh_option("QRotate-id", &i, NULL ); @@ -1241,11 +1314,13 @@ break; case 'V': i= qh_strtol(s, &t); - if (qh GOODvertex) - qh_fprintf(qh ferr, 7021, "qhull warning: good vertex already defined for option 'QVn'. Ignored\n"); - else if (s == t) - qh_fprintf(qh ferr, 7022, "qhull warning: no good point id given for option 'QVn'. Ignored\n"); - else if (i < 0) { + if (qh GOODvertex) { + qh_fprintf(qh ferr, 7021, "qhull option warning: good vertex already defined for option 'QVn'. Ignored\n"); + lastwarning= s-2; + }else if (s == t) { + qh_fprintf(qh ferr, 7022, "qhull option warning: no good point id given for option 'QVn'. Ignored\n"); + lastwarning= s-2; + }else if (i < 0) { qh GOODvertex= i - 1; qh_option("QV-good-facets-not-point", &i, NULL); }else { @@ -1254,9 +1329,14 @@ } s= t; break; + case 'w': + qh_option("Qwarn-allow", NULL, NULL); + qh ALLOWwarning= True; + break; default: s--; - qh_fprintf(qh ferr, 7023, "qhull warning: unknown 'Q' qhull option %c, rest ignored\n", (int)s[0]); + qh_fprintf(qh ferr, 7023, "qhull option warning: unknown 'Q' qhull option 'Q%c', skip to next space\n", (int)s[0]); + lastwarning= s-1; while (*++s && !isspace(*s)); break; } @@ -1275,6 +1355,10 @@ qh_option("Tcheck-frequently", NULL, NULL); qh CHECKfrequently= True; break; + case 'f': + qh_option("Tflush", NULL, NULL); + qh FLUSHprint= True; + break; case 's': qh_option("Tstatistics", NULL, NULL); qh PRINTstatistics= True; @@ -1288,9 +1372,10 @@ /* The C++ interface captures the output in qh_fprint_qhull() */ qh_option("Tz-stdout", NULL, NULL); qh USEstdout= True; - }else if (!qh fout) - qh_fprintf(qh ferr, 7024, "qhull warning: output file undefined(stdout). Option 'Tz' ignored.\n"); - else { + }else if (!qh fout) { + qh_fprintf(qh ferr, 7024, "qhull option warning: output file undefined(stdout). Option 'Tz' ignored.\n"); + lastwarning= s-2; + }else { qh_option("Tz-stdout", NULL, NULL); qh USEstdout= True; qh ferr= qh fout; @@ -1298,26 +1383,26 @@ } break; case 'C': - if (!isdigit(*s)) - qh_fprintf(qh ferr, 7025, "qhull warning: missing point id for cone for trace option 'TCn'. Ignored\n"); - else { + if (!isdigit(*s)) { + qh_fprintf(qh ferr, 7025, "qhull option warning: missing point id for cone for trace option 'TCn'\n"); + lastwarning= s-2; + }else { i= qh_strtol(s, &s); qh_option("TCone-stop", &i, NULL); qh STOPcone= i + 1; } break; case 'F': - if (!isdigit(*s)) - qh_fprintf(qh ferr, 7026, "qhull warning: missing frequency count for trace option 'TFn'. Ignored\n"); - else { + if (!isdigit(*s)) { + qh_fprintf(qh ferr, 7026, "qhull option warning: missing frequency count for trace option 'TFn'\n"); + lastwarning= s-2; + }else { qh REPORTfreq= qh_strtol(s, &s); qh_option("TFacet-log", &qh REPORTfreq, NULL); qh REPORTfreq2= qh REPORTfreq/2; /* for tracemerging() */ } break; case 'I': - if (!isspace(*s)) - qh_fprintf(qh ferr, 7027, "qhull warning: missing space between 'TI' and filename, %s\n", s); while (isspace(*s)) s++; t= qh_skipfilename(s); @@ -1327,7 +1412,7 @@ qh_copyfilename(filename, (int)sizeof(filename), s, (int)(t-s)); /* WARN64 */ s= t; if (!freopen(filename, "r", stdin)) { - qh_fprintf(qh ferr, 6041, "qhull error: could not open file \"%s\".", filename); + qh_fprintf(qh ferr, 6041, "qhull option error: cannot open 'TI' file \"%s\"\n", filename); qh_errexit(qh_ERRinput, NULL, NULL); }else { qh_option("TInput-file", NULL, NULL); @@ -1336,56 +1421,81 @@ } break; case 'O': - if (!isspace(*s)) - qh_fprintf(qh ferr, 7028, "qhull warning: missing space between 'TO' and filename, %s\n", s); - while (isspace(*s)) - s++; - t= qh_skipfilename(s); - { - char filename[qh_FILENAMElen]; - - qh_copyfilename(filename, (int)sizeof(filename), s, (int)(t-s)); /* WARN64 */ - s= t; - if (!qh fout) { - qh_fprintf(qh ferr, 6266, "qhull input warning: qh.fout was not set by caller. Cannot use option 'TO' to redirect output. Ignoring option 'TO'\n"); - }else if (!freopen(filename, "w", qh fout)) { - qh_fprintf(qh ferr, 6044, "qhull error: could not open file \"%s\".", filename); - qh_errexit(qh_ERRinput, NULL, NULL); - }else { - qh_option("TOutput-file", NULL, NULL); + while (isspace(*s)) + s++; + t= qh_skipfilename(s); + { + char filename[qh_FILENAMElen]; + + qh_copyfilename(filename, (int)sizeof(filename), s, (int)(t-s)); /* WARN64 */ + if (!qh fout) { + qh_fprintf(qh ferr, 7092, "qhull option warning: qh.fout was not set by caller of qh_initflags. Cannot use option 'TO' to redirect output. Ignoring option 'TO'\n"); + lastwarning= s-2; + }else if (!freopen(filename, "w", qh fout)) { + qh_fprintf(qh ferr, 6044, "qhull option error: cannot open file \"%s\" for writing as option 'TO'. It is already in use or read-only\n", filename); + qh_errexit(qh_ERRinput, NULL, NULL); + }else { + qh_option("TOutput-file", NULL, NULL); qh_option(filename, NULL, NULL); } + s= t; } break; + case 'A': + if (!isdigit(*s)) { + qh_fprintf(qh ferr, 7093, "qhull option warning: missing count of added points for trace option 'TAn'\n"); + lastwarning= s-2; + }else { + i= qh_strtol(s, &t); + qh STOPadd= i + 1; + qh_option("TA-stop-add", &i, NULL); + } + s= t; + break; case 'P': - if (!isdigit(*s)) - qh_fprintf(qh ferr, 7029, "qhull warning: missing point id for trace option 'TPn'. Ignored\n"); - else { + if (*s == '-') { + if (s[1] == '1' && !isdigit(s[2])) { + s += 2; + qh TRACEpoint= qh_IDunknown; /* qh_buildhull done */ + qh_option("Trace-point", &qh TRACEpoint, NULL); + }else { + qh_fprintf(qh ferr, 7100, "qhull option warning: negative point id for trace option 'TPn'. Expecting 'TP-1' for tracing after qh_buildhull and qh_postmerge\n"); + lastwarning= s-2; + while (isdigit(*(++s))) + ; /* skip digits */ + } + }else if (!isdigit(*s)) { + qh_fprintf(qh ferr, 7029, "qhull option warning: missing point id or -1 for trace option 'TPn'\n"); + lastwarning= s-2; + }else { qh TRACEpoint= qh_strtol(s, &s); qh_option("Trace-point", &qh TRACEpoint, NULL); } break; case 'M': - if (!isdigit(*s)) - qh_fprintf(qh ferr, 7030, "qhull warning: missing merge id for trace option 'TMn'. Ignored\n"); - else { + if (!isdigit(*s)) { + qh_fprintf(qh ferr, 7030, "qhull option warning: missing merge id for trace option 'TMn'\n"); + lastwarning= s-2; + }else { qh TRACEmerge= qh_strtol(s, &s); qh_option("Trace-merge", &qh TRACEmerge, NULL); } break; case 'R': - if (!isdigit(*s)) - qh_fprintf(qh ferr, 7031, "qhull warning: missing rerun count for trace option 'TRn'. Ignored\n"); - else { + if (!isdigit(*s)) { + qh_fprintf(qh ferr, 7031, "qhull option warning: missing rerun count for trace option 'TRn'\n"); + lastwarning= s-2; + }else { qh RERUN= qh_strtol(s, &s); qh_option("TRerun", &qh RERUN, NULL); } break; case 'V': i= qh_strtol(s, &t); - if (s == t) - qh_fprintf(qh ferr, 7032, "qhull warning: missing furthest point id for trace option 'TVn'. Ignored\n"); - else if (i < 0) { + if (s == t) { + qh_fprintf(qh ferr, 7032, "qhull option warning: missing furthest point id for trace option 'TVn'\n"); + lastwarning= s-2; + }else if (i < 0) { qh STOPpoint= i - 1; qh_option("TV-stop-before-point", &i, NULL); }else { @@ -1395,37 +1505,51 @@ s= t; break; case 'W': - if (!isdigit(*s)) - qh_fprintf(qh ferr, 7033, "qhull warning: missing max width for trace option 'TWn'. Ignored\n"); - else { + if (!isdigit(*s)) { + qh_fprintf(qh ferr, 7033, "qhull option warning: missing max width for trace option 'TWn'\n"); + lastwarning= s-2; + }else { qh TRACEdist= (realT) qh_strtod(s, &s); qh_option("TWide-trace", NULL, &qh TRACEdist); } break; default: s--; - qh_fprintf(qh ferr, 7034, "qhull warning: unknown 'T' trace option %c, rest ignored\n", (int)s[0]); + qh_fprintf(qh ferr, 7034, "qhull option warning: unknown 'T' trace option 'T%c', skip to next space\n", (int)s[0]); + lastwarning= s-2; while (*++s && !isspace(*s)); break; } } break; default: - qh_fprintf(qh ferr, 7035, "qhull warning: unknown flag %c(%x)\n", (int)s[-1], - (int)s[-1]); + qh_fprintf(qh ferr, 7094, "qhull option warning: unknown option '%c'(%x)\n", + (int)s[-1], (int)s[-1]); + lastwarning= s-2; break; } if (s-1 == prev_s && *s && !isspace(*s)) { - qh_fprintf(qh ferr, 7036, "qhull warning: missing space after flag %c(%x); reserved for menu. Skipped.\n", - (int)*prev_s, (int)*prev_s); + qh_fprintf(qh ferr, 7036, "qhull option warning: missing space after option '%c'(%x), reserved for sub-options, ignoring '%c' options to next space\n", + (int)*prev_s, (int)*prev_s, (int)*prev_s); + lastwarning= s-1; while (*s && !isspace(*s)) s++; } } - if (qh STOPcone && qh JOGGLEmax < REALmax/2) - qh_fprintf(qh ferr, 7078, "qhull warning: 'TCn' (stopCone) ignored when used with 'QJn' (joggle)\n"); - if (isgeom && !qh FORCEoutput && qh PRINTout[1]) - qh_fprintf(qh ferr, 7037, "qhull warning: additional output formats are not compatible with Geomview\n"); + if (qh STOPcone && qh JOGGLEmax < REALmax/2) { + qh_fprintf(qh ferr, 7078, "qhull option warning: 'TCn' (stopCone) ignored when used with 'QJn' (joggle)\n"); + lastwarning= command; + } + if (isgeom && !qh FORCEoutput && qh PRINTout[1]) { + qh_fprintf(qh ferr, 7037, "qhull option warning: additional output formats ('Fc',etc.) are not compatible with Geomview ('G'). Use option 'Po' to override\n"); + lastwarning= command; + } + if (lastwarning && !qh ALLOWwarning) { + qh_fprintf(qh ferr, 6035, "qhull option error: see previous warnings, use 'Qw' to override: '%s' (last offset %d)\n", + command, (int)(lastwarning-command)); + qh_errexit(qh_ERRinput, NULL, NULL); + } + trace4((qh ferr, 4093, "qh_initflags: option flags initialized\n")); /* set derived values in qh_initqhull_globals */ } /* initflags */ @@ -1433,7 +1557,7 @@ /*--------------------------------- - qh_initqhull_buffers() + qh_initqhull_buffers( ) initialize global memory buffers notes: @@ -1442,25 +1566,25 @@ void qh_initqhull_buffers(void) { int k; - qh TEMPsize= (qhmem.LASTsize - sizeof(setT))/SETelemsize; + qh TEMPsize= (qhmem.LASTsize - (int)sizeof(setT))/SETelemsize; if (qh TEMPsize <= 0 || qh TEMPsize > qhmem.LASTsize) qh TEMPsize= 8; /* e.g., if qh_NOmem */ qh other_points= qh_setnew(qh TEMPsize); qh del_vertices= qh_setnew(qh TEMPsize); qh coplanarfacetset= qh_setnew(qh TEMPsize); - qh NEARzero= (realT *)qh_memalloc(qh hull_dim * sizeof(realT)); - qh lower_threshold= (realT *)qh_memalloc((qh input_dim+1) * sizeof(realT)); - qh upper_threshold= (realT *)qh_memalloc((qh input_dim+1) * sizeof(realT)); - qh lower_bound= (realT *)qh_memalloc((qh input_dim+1) * sizeof(realT)); - qh upper_bound= (realT *)qh_memalloc((qh input_dim+1) * sizeof(realT)); + qh NEARzero= (realT *)qh_memalloc(qh hull_dim * (int)sizeof(realT)); + qh lower_threshold= (realT *)qh_memalloc((qh input_dim+1) * (int)sizeof(realT)); + qh upper_threshold= (realT *)qh_memalloc((qh input_dim+1) * (int)sizeof(realT)); + qh lower_bound= (realT *)qh_memalloc((qh input_dim+1) * (int)sizeof(realT)); + qh upper_bound= (realT *)qh_memalloc((qh input_dim+1) * (int)sizeof(realT)); for (k=qh input_dim+1; k--; ) { /* duplicated in qh_initqhull_buffers and qh_clear_outputflags */ qh lower_threshold[k]= -REALmax; qh upper_threshold[k]= REALmax; qh lower_bound[k]= -REALmax; qh upper_bound[k]= REALmax; } - qh gm_matrix= (coordT *)qh_memalloc((qh hull_dim+1) * qh hull_dim * sizeof(coordT)); - qh gm_row= (coordT **)qh_memalloc((qh hull_dim+1) * sizeof(coordT *)); + qh gm_matrix= (coordT *)qh_memalloc((qh hull_dim+1) * qh hull_dim * (int)sizeof(coordT)); + qh gm_row= (coordT **)qh_memalloc((qh hull_dim+1) * (int)sizeof(coordT *)); } /* initqhull_buffers */ /*- qh_POINTSmax) { + qh_fprintf(qh ferr, 6412, "qhull input error (qh_initqhull_globals): expecting between 1 and %d points. Got %d %d-d points\n", + qh_POINTSmax, numpoints, dim); + qh_errexit(qh_ERRinput, NULL, NULL); + /* same error message in qh_readpoints */ + } qh POINTSmalloc= ismalloc; qh first_point= points; qh num_points= numpoints; @@ -1513,23 +1642,25 @@ qh_option("_pre-merge", NULL, NULL); }else { qh MERGEexact= True; - qh_option("Qxact_merge", NULL, NULL); + qh_option("Qxact-merge", NULL, NULL); } }else if (qh MERGEexact) qh MERGING= True; + if (qh NOpremerge && (qh MERGEexact || qh PREmerge)) + qh_fprintf(qh ferr, 7095, "qhull option warning: 'Q0-no-premerge' ignored due to exact merge ('Qx') or pre-merge ('C-n' or 'A-n')\n"); if (!qh NOpremerge && qh JOGGLEmax > REALmax/2) { #ifdef qh_NOmerge qh JOGGLEmax= 0.0; #endif } - if (qh TRIangulate && qh JOGGLEmax < REALmax/2 && qh PRINTprecision) - qh_fprintf(qh ferr, 7038, "qhull warning: joggle('QJ') always produces simplicial output. Triangulated output('Qt') does nothing.\n"); + if (qh TRIangulate && qh JOGGLEmax < REALmax/2 && !qh PREmerge && !qh POSTmerge && qh PRINTprecision) + qh_fprintf(qh ferr, 7038, "qhull option warning: joggle ('QJ') produces simplicial output (i.e., triangles in 2-D). Unless merging is requested, option 'Qt' has no effect\n"); if (qh JOGGLEmax < REALmax/2 && qh DELAUNAY && !qh SCALEinput && !qh SCALElast) { qh SCALElast= True; qh_option("Qbbound-last-qj", NULL, NULL); } if (qh MERGING && !qh POSTmerge && qh premerge_cos > REALmax/2 - && qh premerge_centrum == 0) { + && qh premerge_centrum == 0.0) { qh ZEROcentrum= True; qh ZEROall_ok= True; qh_option("_zero-centrum", NULL, NULL); @@ -1539,7 +1670,7 @@ REALepsilon); #ifdef qh_NOmerge if (qh MERGING) { - qh_fprintf(qh ferr, 6045, "qhull input error: merging not installed(qh_NOmerge + 'Qx', 'Cn' or 'An')\n"); + qh_fprintf(qh ferr, 6045, "qhull option error: merging not installed (qh_NOmerge) for 'Qx', 'Cn' or 'An')\n"); qh_errexit(qh_ERRinput, NULL, NULL); } #endif @@ -1547,21 +1678,34 @@ qh KEEPinside= True; qh_option("Qinterior-keep", NULL, NULL); } + if (qh VORONOI && !qh DELAUNAY) { + qh_fprintf(qh ferr, 6038, "qhull internal error (qh_initqhull_globals): if qh.VORONOI is set, qh.DELAUNAY must be set. Qhull constructs the Delaunay triangulation in order to compute the Voronoi diagram\n"); + qh_errexit(qh_ERRqhull, NULL, NULL); + } if (qh DELAUNAY && qh HALFspace) { - qh_fprintf(qh ferr, 6046, "qhull input error: can not use Delaunay('d') or Voronoi('v') with halfspace intersection('H')\n"); + qh_fprintf(qh ferr, 6046, "qhull option error: can not use Delaunay('d') or Voronoi('v') with halfspace intersection('H')\n"); qh_errexit(qh_ERRinput, NULL, NULL); + /* same error message in qh_readpoints */ } if (!qh DELAUNAY && (qh UPPERdelaunay || qh ATinfinity)) { - qh_fprintf(qh ferr, 6047, "qhull input error: use upper-Delaunay('Qu') or infinity-point('Qz') with Delaunay('d') or Voronoi('v')\n"); + qh_fprintf(qh ferr, 6047, "qhull option error: use upper-Delaunay('Qu') or infinity-point('Qz') with Delaunay('d') or Voronoi('v')\n"); qh_errexit(qh_ERRinput, NULL, NULL); } if (qh UPPERdelaunay && qh ATinfinity) { - qh_fprintf(qh ferr, 6048, "qhull input error: can not use infinity-point('Qz') with upper-Delaunay('Qu')\n"); + qh_fprintf(qh ferr, 6048, "qhull option error: can not use infinity-point('Qz') with upper-Delaunay('Qu')\n"); + qh_errexit(qh_ERRinput, NULL, NULL); + } + if (qh MERGEpinched && qh ONLYgood) { + qh_fprintf(qh ferr, 6362, "qhull option error: can not use merge-pinched-vertices ('Q14') with good-facets-only ('Qg')\n"); qh_errexit(qh_ERRinput, NULL, NULL); } + if (qh MERGEpinched && qh hull_dim == 2) { + trace2((qh ferr, 2108, "qh_initqhull_globals: disable qh.MERGEpinched for 2-d. It has no effect")) + qh MERGEpinched= False; + } if (qh SCALElast && !qh DELAUNAY && qh PRINTprecision) - qh_fprintf(qh ferr, 7040, "qhull input warning: option 'Qbb' (scale-last-coordinate) is normally used with 'd' or 'v'\n"); - qh DOcheckmax= (!qh SKIPcheckmax && qh MERGING ); + qh_fprintf(qh ferr, 7040, "qhull option warning: option 'Qbb' (scale-last-coordinate) is normally used with 'd' or 'v'\n"); + qh DOcheckmax= (!qh SKIPcheckmax && (qh MERGING || qh APPROXhull)); qh KEEPnearinside= (qh DOcheckmax && !(qh KEEPinside && qh KEEPcoplanar) && !qh NOnearinside); if (qh MERGING) @@ -1569,7 +1713,7 @@ else if (qh VORONOI) qh CENTERtype= qh_ASvoronoi; if (qh TESTvneighbors && !qh MERGING) { - qh_fprintf(qh ferr, 6049, "qhull input error: test vertex neighbors('Qv') needs a merge option\n"); + qh_fprintf(qh ferr, 6049, "qhull option error: test vertex neighbors('Qv') needs a merge option\n"); qh_errexit(qh_ERRinput, NULL ,NULL); } if (qh PROJECTinput || (qh DELAUNAY && qh PROJECTdelaunay)) { @@ -1587,10 +1731,10 @@ for (k=2, factorial=1.0; k < qh hull_dim; k++) factorial *= k; qh AREAfactor= 1.0 / factorial; - trace2((qh ferr, 2005, "qh_initqhull_globals: initialize globals. dim %d numpoints %d malloc? %d projected %d to hull_dim %d\n", - dim, numpoints, ismalloc, qh PROJECTinput, qh hull_dim)); - qh normal_size= qh hull_dim * sizeof(coordT); - qh center_size= qh normal_size - sizeof(coordT); + trace2((qh ferr, 2005, "qh_initqhull_globals: initialize globals. input_dim %d, numpoints %d, malloc? %d, projected %d to hull_dim %d\n", + qh input_dim, numpoints, ismalloc, qh PROJECTinput, qh hull_dim)); + qh normal_size= qh hull_dim * (int)sizeof(coordT); + qh center_size= qh normal_size - (int)sizeof(coordT); pointsneeded= qh hull_dim+1; if (qh hull_dim > qh_DIMmergeVertex) { qh MERGEvertices= False; @@ -1599,17 +1743,20 @@ if (qh GOODpoint) pointsneeded++; #ifdef qh_NOtrace - if (qh IStracing) { - qh_fprintf(qh ferr, 6051, "qhull input error: tracing is not installed(qh_NOtrace in user.h)"); - qh_errexit(qh_ERRqhull, NULL, NULL); + if (qh IStracing || qh TRACEmerge || qh TRACEpoint != qh_IDnone || qh TRACEdist < REALmax/2) { + qh_fprintf(qh ferr, 6051, "qhull option error: tracing is not installed (qh_NOtrace in user.h). Trace options 'Tn', 'TMn', 'TPn' and 'TWn' mostly removed. Continue with 'Qw' (allow warning)\n"); + if (!qh ALLOWwarning) + qh_errexit(qh_ERRinput, NULL, NULL); } #endif if (qh RERUN > 1) { qh TRACElastrun= qh IStracing; /* qh_build_withrestart duplicates next conditional */ - if (qh IStracing != -1) + if (qh IStracing && qh IStracing != -1) { + qh_fprintf(qh ferr, 8162, "qh_initqhull_globals: trace last of TR%d runs at level %d\n", qh RERUN, qh IStracing); qh IStracing= 0; - }else if (qh TRACEpoint != qh_IDunknown || qh TRACEdist < REALmax/2 || qh TRACEmerge) { - qh TRACElevel= (qh IStracing? qh IStracing : 3); + } + }else if (qh TRACEpoint != qh_IDnone || qh TRACEdist < REALmax/2 || qh TRACEmerge) { + qh TRACElevel= (qh IStracing ? qh IStracing : 3); qh IStracing= 0; } if (qh ROTATErandom == 0 || qh ROTATErandom == -1) { @@ -1633,20 +1780,17 @@ randr += randi; if (randi > qh_RANDOMmax) { qh_fprintf(qh ferr, 8036, "\ -qhull configuration error (qh_RANDOMmax in user.h):\n\ - random integer %d > qh_RANDOMmax(%.8g)\n", +qhull configuration error (qh_RANDOMmax in user.h): random integer %d > qh_RANDOMmax (%.8g)\n", randi, qh_RANDOMmax); qh_errexit(qh_ERRinput, NULL, NULL); } } qh_RANDOMseed_(seed); - randr = randr/1000; + randr= randr/1000; if (randr < qh_RANDOMmax * 0.1 || randr > qh_RANDOMmax * 0.9) qh_fprintf(qh ferr, 8037, "\ -qhull configuration warning (qh_RANDOMmax in user.h):\n\ - average of 1000 random integers (%.2g) is much different than expected (%.2g).\n\ - Is qh_RANDOMmax (%.2g) wrong?\n", +qhull configuration warning (qh_RANDOMmax in user.h): average of 1000 random integers (%.2g) is much different than expected (%.2g). Is qh_RANDOMmax (%.2g) wrong?\n", randr, qh_RANDOMmax * 0.5, qh_RANDOMmax); qh RANDOMa= 2.0 * qh RANDOMfactor/qh_RANDOMmax; qh RANDOMb= 1.0 - qh RANDOMfactor; @@ -1666,12 +1810,12 @@ /*--------------------------------- - qh_initqhull_mem( ) + qh_initqhull_mem( ) initialize mem.c for qhull qh.hull_dim and qh.normal_size determine some of the allocation sizes if qh.MERGING, includes ridgeT - calls qh_user_memsizes() to add up to 10 additional sizes for quick allocation + calls qh_user_memsizes (user.c) to add up to 10 additional sizes for quick allocation (see numsizes below) returns: @@ -1687,14 +1831,14 @@ numsizes= 8+10; qh_meminitbuffers(qh IStracing, qh_MEMalign, numsizes, - qh_MEMbufsize,qh_MEMinitbuf); + qh_MEMbufsize, qh_MEMinitbuf); qh_memsize((int)sizeof(vertexT)); if (qh MERGING) { qh_memsize((int)sizeof(ridgeT)); qh_memsize((int)sizeof(mergeT)); } qh_memsize((int)sizeof(facetT)); - i= sizeof(setT) + (qh hull_dim - 1) * SETelemsize; /* ridge.vertices */ + i= (int)sizeof(setT) + (qh hull_dim - 1) * SETelemsize; /* ridge.vertices */ qh_memsize(i); qh_memsize(qh normal_size); /* normal */ i += SETelemsize; /* facet.vertices, .ridges, .neighbors */ @@ -1725,7 +1869,7 @@ trace3((qh ferr, 3024, "qh_initqhull_outputflags: %s\n", qh qhull_command)); if (!(qh PRINTgood || qh PRINTneighbors)) { - if (qh KEEParea || qh KEEPminArea < REALmax/2 || qh KEEPmerge || qh DELAUNAY + if (qh DELAUNAY || qh KEEParea || qh KEEPminArea < REALmax/2 || qh KEEPmerge || (!qh ONLYgood && (qh GOODvertex || qh GOODpoint))) { qh PRINTgood= True; qh_option("Pgood", NULL, NULL); @@ -1733,11 +1877,11 @@ } if (qh PRINTtransparent) { if (qh hull_dim != 4 || !qh DELAUNAY || qh VORONOI || qh DROPdim >= 0) { - qh_fprintf(qh ferr, 6215, "qhull input error: transparent Delaunay('Gt') needs 3-d Delaunay('d') w/o 'GDn'\n"); + qh_fprintf(qh ferr, 6215, "qhull option error: transparent Delaunay('Gt') needs 3-d Delaunay('d') w/o 'GDn'\n"); qh_errexit(qh_ERRinput, NULL, NULL); } - qh DROPdim = 3; - qh PRINTridges = True; + qh DROPdim= 3; + qh PRINTridges= True; } for (i=qh_PRINTEND; i--; ) { if (qh PRINTout[i] == qh_PRINTgeom) @@ -1749,13 +1893,13 @@ else if (qh PRINTout[i] == qh_PRINTpointnearest) printcoplanar= True; else if (qh PRINTout[i] == qh_PRINTpointintersect && !qh HALFspace) { - qh_fprintf(qh ferr, 6053, "qhull input error: option 'Fp' is only used for \nhalfspace intersection('Hn,n,n').\n"); + qh_fprintf(qh ferr, 6053, "qhull option error: option 'Fp' is only used for \nhalfspace intersection('Hn,n,n').\n"); qh_errexit(qh_ERRinput, NULL, NULL); }else if (qh PRINTout[i] == qh_PRINTtriangles && (qh HALFspace || qh VORONOI)) { - qh_fprintf(qh ferr, 6054, "qhull input error: option 'Ft' is not available for Voronoi vertices or halfspace intersection\n"); + qh_fprintf(qh ferr, 6054, "qhull option error: option 'Ft' is not available for Voronoi vertices ('v') or halfspace intersection ('H')\n"); qh_errexit(qh_ERRinput, NULL, NULL); }else if (qh PRINTout[i] == qh_PRINTcentrums && qh VORONOI) { - qh_fprintf(qh ferr, 6055, "qhull input error: option 'FC' is not available for Voronoi vertices('v')\n"); + qh_fprintf(qh ferr, 6055, "qhull option error: option 'FC' is not available for Voronoi vertices('v')\n"); qh_errexit(qh_ERRinput, NULL, NULL); }else if (qh PRINTout[i] == qh_PRINTvertices) { if (qh VORONOI) @@ -1766,31 +1910,30 @@ } if (printcoplanar && qh DELAUNAY && qh JOGGLEmax < REALmax/2) { if (qh PRINTprecision) - qh_fprintf(qh ferr, 7041, "qhull input warning: 'QJ' (joggle) will usually prevent coincident input sites for options 'Fc' and 'FP'\n"); + qh_fprintf(qh ferr, 7041, "qhull option warning: 'QJ' (joggle) will usually prevent coincident input sites for options 'Fc' and 'FP'\n"); } if (printmath && (qh hull_dim > 3 || qh VORONOI)) { - qh_fprintf(qh ferr, 6056, "qhull input error: Mathematica and Maple output is only available for 2-d and 3-d convex hulls and 2-d Delaunay triangulations\n"); + qh_fprintf(qh ferr, 6056, "qhull option error: Mathematica and Maple output is only available for 2-d and 3-d convex hulls and 2-d Delaunay triangulations\n"); qh_errexit(qh_ERRinput, NULL, NULL); } if (printgeom) { if (qh hull_dim > 4) { - qh_fprintf(qh ferr, 6057, "qhull input error: Geomview output is only available for 2-d, 3-d and 4-d\n"); + qh_fprintf(qh ferr, 6057, "qhull option error: Geomview output is only available for 2-d, 3-d and 4-d\n"); qh_errexit(qh_ERRinput, NULL, NULL); } if (qh PRINTnoplanes && !(qh PRINTcoplanar + qh PRINTcentrums + qh PRINTdots + qh PRINTspheres + qh DOintersections + qh PRINTridges)) { - qh_fprintf(qh ferr, 6058, "qhull input error: no output specified for Geomview\n"); + qh_fprintf(qh ferr, 6058, "qhull option error: no output specified for Geomview\n"); qh_errexit(qh_ERRinput, NULL, NULL); } if (qh VORONOI && (qh hull_dim > 3 || qh DROPdim >= 0)) { - qh_fprintf(qh ferr, 6059, "qhull input error: Geomview output for Voronoi diagrams only for 2-d\n"); + qh_fprintf(qh ferr, 6059, "qhull option error: Geomview output for Voronoi diagrams only for 2-d\n"); qh_errexit(qh_ERRinput, NULL, NULL); } /* can not warn about furthest-site Geomview output: no lower_threshold */ if (qh hull_dim == 4 && qh DROPdim == -1 && (qh PRINTcoplanar || qh PRINTspheres || qh PRINTcentrums)) { - qh_fprintf(qh ferr, 7042, "qhull input warning: coplanars, vertices, and centrums output not\n\ -available for 4-d output(ignored). Could use 'GDn' instead.\n"); + qh_fprintf(qh ferr, 7042, "qhull option warning: coplanars, vertices, and centrums output not available for 4-d output(ignored). Could use 'GDn' instead.\n"); qh PRINTcoplanar= qh PRINTspheres= qh PRINTcentrums= False; } } @@ -1799,7 +1942,7 @@ if (qh QHULLfinished) { qh_fprintf(qh ferr, 7072, "qhull output warning: ignoring coplanar points, option 'Qc' was not set for the first run of qhull.\n"); }else { - qh KEEPcoplanar = True; + qh KEEPcoplanar= True; qh_option("Qcoplanar", NULL, NULL); } } @@ -1809,7 +1952,7 @@ if (qh DROPdim < qh hull_dim) { qh PRINTdim--; if (!printgeom || qh hull_dim < 3) - qh_fprintf(qh ferr, 7043, "qhull input warning: drop dimension 'GD%d' is only available for 3-d/4-d Geomview\n", qh DROPdim); + qh_fprintf(qh ferr, 7043, "qhull option warning: drop dimension 'GD%d' is only available for 3-d/4-d Geomview\n", qh DROPdim); }else qh DROPdim= -1; }else if (qh VORONOI) { @@ -1863,17 +2006,22 @@ #else memset((char *)&qh_qh, 0, sizeof(qhT)); #endif - qh ANGLEmerge= True; + qh NOerrexit= True; qh DROPdim= -1; qh ferr= errfile; qh fin= infile; qh fout= outfile; qh furthest_id= qh_IDunknown; +#ifndef qh_NOmerge qh JOGGLEmax= REALmax; - qh KEEPminArea = REALmax; +#else + qh JOGGLEmax= 0.0; /* Joggle ('QJ') if qh_NOmerge */ +#endif + qh KEEPminArea= REALmax; qh last_low= REALmax; qh last_high= REALmax; qh last_newhigh= REALmax; + qh lastcpu= 0.0; qh max_outside= 0.0; qh max_vertex= 0.0; qh MAXabs_coord= 0.0; @@ -1896,9 +2044,10 @@ qh totarea= 0.0; qh totvol= 0.0; qh TRACEdist= REALmax; - qh TRACEpoint= qh_IDunknown; /* recompile or use 'TPn' */ - qh tracefacet_id= UINT_MAX; /* recompile to trace a facet */ - qh tracevertex_id= UINT_MAX; /* recompile to trace a vertex */ + qh TRACEpoint= qh_IDnone; /* recompile to trace a point, or use 'TPn' */ + qh tracefacet_id= UINT_MAX; /* recompile to trace a facet, set to UINT_MAX when done, see userprintf.c/qh_fprintf */ + qh traceridge_id= UINT_MAX; /* recompile to trace a ridge, set to UINT_MAX when done, see userprintf.c/qh_fprintf */ + qh tracevertex_id= UINT_MAX; /* recompile to trace a vertex, set to UINT_MAX when done, see userprintf.c/qh_fprintf */ seed= (int)time(&timedata); qh_RANDOMseed_(seed); qh run_id= qh_RANDOMint; @@ -1932,6 +2081,7 @@ realT value; int idx, maxdim, k; char *s= command; /* non-const due to strtol */ + char *lastoption, *lastwarning= NULL; char key; maxdim= qh input_dim; @@ -1941,26 +2091,29 @@ if (*s == '-') s++; if (*s == 'P') { - s++; + lastoption= s++; while (*s && !isspace(key= *s++)) { if (key == 'd' || key == 'D') { if (!isdigit(*s)) { - qh_fprintf(qh ferr, 7044, "qhull warning: no dimension given for Print option '%c' at: %s. Ignored\n", + qh_fprintf(qh ferr, 7044, "qhull option warning: no dimension given for Print option 'P%c' at: %s. Ignored\n", key, s-1); + lastwarning= lastoption; continue; } idx= qh_strtol(s, &s); if (idx >= qh hull_dim) { - qh_fprintf(qh ferr, 7045, "qhull warning: dimension %d for Print option '%c' is >= %d. Ignored\n", + qh_fprintf(qh ferr, 7045, "qhull option warning: dimension %d for Print option 'P%c' is >= %d. Ignored\n", idx, key, qh hull_dim); + lastwarning= lastoption; continue; } if (*s == ':') { s++; value= qh_strtod(s, &s); if (fabs((double)value) > 1.0) { - qh_fprintf(qh ferr, 7046, "qhull warning: value %2.4g for Print option %c is > +1 or < -1. Ignored\n", + qh_fprintf(qh ferr, 7046, "qhull option warning: value %2.4g for Print option 'P%c' is > +1 or < -1. Ignored\n", value, key); + lastwarning= lastoption; continue; } }else @@ -1972,7 +2125,7 @@ } } }else if (*s == 'Q') { - s++; + lastoption= s++; while (*s && !isspace(key= *s++)) { if (key == 'b' && *s == 'B') { s++; @@ -1984,14 +2137,16 @@ s++; else if (key == 'b' || key == 'B') { if (!isdigit(*s)) { - qh_fprintf(qh ferr, 7047, "qhull warning: no dimension given for Qhull option %c. Ignored\n", + qh_fprintf(qh ferr, 7047, "qhull option warning: no dimension given for Qhull option 'Q%c'\n", key); + lastwarning= lastoption; continue; } idx= qh_strtol(s, &s); if (idx >= maxdim) { - qh_fprintf(qh ferr, 7048, "qhull warning: dimension %d for Qhull option %c is >= %d. Ignored\n", + qh_fprintf(qh ferr, 7048, "qhull option warning: dimension %d for Qhull option 'Q%c' is >= %d. Ignored\n", idx, key, maxdim); + lastwarning= lastoption; continue; } if (*s == ':') { @@ -2025,6 +2180,11 @@ }else if (qh upper_threshold[k] < REALmax/2) qh GOODthreshold= True; } + if (lastwarning && !qh ALLOWwarning) { + qh_fprintf(qh ferr, 6036, "qhull option error: see previous warnings, use 'Qw' to override: '%s' (last offset %d)\n", + command, (int)(lastwarning-command)); + qh_errexit(qh_ERRinput, NULL, NULL); + } } /* initthresholds */ /*- sizeof(buf)-30-30) { + qh_fprintf(qh ferr, 6408, "qhull internal error (qh_option): option (%d chars) has more than %d chars. May overflow temporary buffer. Option '%s'\n", + (int)strlen(option), (int)sizeof(buf)-30-30, option); + qh_errexit(qh_ERRqhull, NULL, NULL); + } sprintf(buf, " %s", option); if (i) sprintf(buf+strlen(buf), " %d", *i); if (r) sprintf(buf+strlen(buf), " %2.2g", *r); - len= (int)strlen(buf); /* WARN64 */ - qh qhull_optionlen += len; - maxlen= sizeof(qh qhull_options) - len -1; - maximize_(maxlen, 0); - if (qh qhull_optionlen >= qh_OPTIONline && maxlen > 0) { - qh qhull_optionlen= len; - strncat(qh qhull_options, "\n", (size_t)(maxlen--)); + buflen= (int)strlen(buf); /* WARN64 */ + qh qhull_optionlen += buflen; + remainder= (int)(sizeof(qh qhull_options) - strlen(qh qhull_options)) - 1; /* WARN64 */ + maximize_(remainder, 0); + if (qh qhull_optionlen >= qh_OPTIONline && remainder > 0) { + strncat(qh qhull_options, "\n", (unsigned int)remainder); + --remainder; + qh qhull_optionlen= buflen; + } + if (buflen > remainder) { + trace1((qh ferr, 1058, "qh_option: option would overflow qh.qhull_options. Truncated '%s'\n", buf)); } - strncat(qh qhull_options, buf, (size_t)maxlen); + strncat(qh qhull_options, buf, (unsigned int)remainder); } /* option */ #if qh_QHpointer diff -Nru qhull-2015.2/src/libqhull/index.htm qhull-2020.2/src/libqhull/index.htm --- qhull-2015.2/src/libqhull/index.htm 2016-01-17 21:51:15.000000000 +0000 +++ qhull-2020.2/src/libqhull/index.htm 2020-08-16 18:16:58.000000000 +0000 @@ -9,8 +9,8 @@

      Up: Home page for Qhull
      -Up: Qhull manual: Table of Contents
      +href="http://www.qhull.org">Home page for Qhull (local)
      +Up: Qhull manual: contents
      Up: ProgramsOptionsOutput @@ -20,8 +20,8 @@ • QhullPrecisionTrace -• Functions
      -Up: Qhull code
      +• Functions (local)
      +Up: Qhull code
      To: Qhull files
      To: GeomGlobalIoMem @@ -78,9 +78,15 @@ Search io.c to learn how the print function is implemented.

      If your web browser is configured for .c and .h files, the function, macro, and data type links -go to the corresponding source location. To configure your web browser for .c and .h files. +go to the corresponding source location.

        -
      • In the Download Preferences or Options panel, add file extensions 'c' and 'h' to mime type 'text/html'. +
      • Internet Explorer -- OK for web access but not for file access +
      • Chrome -- OK for web access but not for file access +
      • Firefox -- OK for web access but not for file access +
        +# .htaccess on web server with NL line endings
        +AddType text/html .c .h
        +
      • Opera 12.10
        1. In Tools > Preferences > Advanced > Downloads @@ -90,9 +96,6 @@
        2. Add File extensions 'c,h,'
        3. Click 'OK'
        -
      • Internet Explorer -- Mime types are not available from 'Internet Options'. Is there a registry key for these settings? -
      • Firefox -- Mime types are not available from 'Preferences'. Is there an add-on to change the file extensions for a mime type? -
      • Chrome -- Can Chrome be configured?

      @@ -100,7 +103,7 @@ to qhull-bug@qhull.org. -

      Copyright © 1997-2015 C.B. Barber

      +

      Copyright © 1997-2020 C.B. Barber


      @@ -188,7 +191,7 @@ libqhull.c, libqhull.h, qhull_a.h, -unix.c , +unix.c , qconvex.c , qdelaun.c , qhalf.c , @@ -219,6 +222,7 @@ user.c, user_eg.c, user_eg2.c, +user_eg3.cpp,
      User-defined routines. Qhull allows the user to configure the code with defined constants and specialized routines. @@ -230,9 +234,9 @@


      Up: -Home page for -Qhull
      -Up: Qhull manual: Table of Contents
      +Home page for +Qhull (local)
      +Up: Qhull manual: contents
      Up: ProgramsOptionsOutput @@ -242,8 +246,8 @@ • QhullPrecisionTrace -• Functions
      -Up: Qhull code: Table of Contents
      +• Functions (local)
      +Up: Qhull code
      To: Qhull files
      To: GeomGlobalIo @@ -258,7 +262,7 @@ src="../../html/qh--geom.gif" align="middle" width="40" height="40">The Geometry Center Home Page

      Comments to: qhull@qhull.org -
      +
      Created: May 2, 1997 --- Last modified: see top

      diff -Nru qhull-2015.2/src/libqhull/io.c qhull-2020.2/src/libqhull/io.c --- qhull-2015.2/src/libqhull/io.c 2016-01-18 14:20:26.000000000 +0000 +++ qhull-2020.2/src/libqhull/io.c 2020-06-04 18:56:32.000000000 +0000 @@ -13,9 +13,9 @@ unix.c and user.c are the only callers of io.c functions This allows the user to avoid loading io.o from qhull.a - Copyright (c) 1993-2015 The Geometry Center. - $Id: //main/2015/qhull/src/libqhull/io.c#5 $$Change: 2064 $ - $DateTime: 2016/01/18 12:36:08 $$Author: bbarber $ + Copyright (c) 1993-2020 The Geometry Center. + $Id: //main/2019/qhull/src/libqhull/io.c#11 $$Change: 2965 $ + $DateTime: 2020/06/04 15:37:41 $$Author: bbarber $ */ #include "qhull_a.h" @@ -25,10 +25,11 @@ /*--------------------------------- - qh_produce_output() - qh_produce_output2() + qh_produce_output( ) + qh_produce_output2( ) prints out the result of qhull in desired format - qh_produce_output2() does not call qh_prepare_output() + qh_produce_output2 does not call qh_prepare_output + qh_checkpolygon is valid for qh_prepare_output if qh.GETarea computes and prints area and volume qh.PRINTout[] is an array of output formats @@ -52,12 +53,15 @@ void qh_produce_output2(void) { int i, tempsize= qh_setsize(qhmem.tempstack), d_1; + fflush(NULL); if (qh PRINTsummary) qh_printsummary(qh ferr); else if (qh PRINTout[0] == qh_PRINTnone) qh_printsummary(qh fout); for (i=0; i < qh_PRINTEND; i++) qh_printfacets(qh fout, qh PRINTout[i], qh facet_list, NULL, !qh_ALL); + fflush(NULL); + qh_allstatistics(); if (qh PRINTprecision && !qh MERGING && (qh JOGGLEmax > REALmax/2 || qh RERUN)) qh_printstats(qh ferr, qhstat precision, NULL); @@ -66,7 +70,7 @@ if (qh PRINTstatistics) { qh_printstatistics(qh ferr, ""); qh_memstatistics(qh ferr); - d_1= sizeof(setT) + (qh hull_dim - 1) * SETelemsize; + d_1= (int)sizeof(setT) + (qh hull_dim - 1) * SETelemsize; qh_fprintf(qh ferr, 8040, "\ size in bytes: merge %d ridge %d vertex %d facet %d\n\ normal %d ridge vertices %d facet vertices or neighbors %d\n", @@ -88,7 +92,7 @@ print facet by id, for debugging */ -void qh_dfacet(unsigned id) { +void qh_dfacet(unsigned int id) { facetT *facet; FORALLfacets { @@ -106,7 +110,7 @@ qh_dvertex( id ) print vertex by id, for debugging */ -void qh_dvertex(unsigned id) { +void qh_dvertex(unsigned int id) { vertexT *vertex; FORALLvertices { @@ -139,18 +143,6 @@ } /* compare_facetarea */ /*--------------------------------- - - qh_compare_facetmerge( p1, p2 ) - used by qsort() to order facets by number of merges -*/ -int qh_compare_facetmerge(const void *p1, const void *p2) { - const facetT *a= *((facetT *const*)p1), *b= *((facetT *const*)p2); - - return(a->nummerge - b->nummerge); -} /* compare_facetvisit */ - -/*--------------------------------- qh_compare_facetvisit( p1, p2 ) @@ -160,26 +152,27 @@ const facetT *a= *((facetT *const*)p1), *b= *((facetT *const*)p2); int i,j; - if (!(i= a->visitid)) - i= 0 - a->id; /* do not convert to int, sign distinguishes id from visitid */ - if (!(j= b->visitid)) - j= 0 - b->id; + if (!(i= (int)a->visitid)) + i= (int)(0 - a->id); /* sign distinguishes id from visitid */ + if (!(j= (int)b->visitid)) + j= (int)(0 - b->id); return(i - j); } /* compare_facetvisit */ /*--------------------------------- + >-------------------------------- - qh_compare_vertexpoint( p1, p2 ) - used by qsort() to order vertices by point id + qh_compare_nummerge( p1, p2 ) + used by qsort() to order facets by number of merges - Not used. Not available in libqhull_r.h since qh_pointid depends on qh +notes: + called by qh_markkeep ('PMerge-keep') */ -int qh_compare_vertexpoint(const void *p1, const void *p2) { - const vertexT *a= *((vertexT *const*)p1), *b= *((vertexT *const*)p2); +int qh_compare_nummerge(const void *p1, const void *p2) { + const facetT *a= *((facetT *const*)p1), *b= *((facetT *const*)p2); - return((qh_pointid(a->point) > qh_pointid(b->point)?1:-1)); -} /* compare_vertexpoint */ + return(a->nummerge - b->nummerge); +} /* compare_nummerge */ /*--------------------------------- @@ -197,7 +190,7 @@ qh_fprintf(qh ferr, 6040, "qhull error: filename is more than %d characters, %s\n", size-1, source); qh_errexit(qh_ERRinput, NULL, NULL); } - strncpy(filename, source, length); + strncpy(filename, source, (size_t)length); filename[length]= '\0'; if (c == '\'' || c == '"') { char *s= filename + 1; @@ -217,7 +210,7 @@ /*--------------------------------- - qh_countfacets( facetlist, facets, printall, + qh_countfacets(facetlist, facets, printall, numfacets, numsimplicial, totneighbors, numridges, numcoplanar, numtricoplanars ) count good facets for printing and set visitid if allfacets, ignores qh_skipfacet() @@ -251,7 +244,7 @@ || (!printall && qh_skipfacet(facet))) facet->visitid= 0; else { - facet->visitid= ++numfacets; + facet->visitid= (unsigned int)(++numfacets); totneighbors += qh_setsize(facet->neighbors); if (facet->simplicial) { numsimplicial++; @@ -269,7 +262,7 @@ || (!printall && qh_skipfacet(facet))) facet->visitid= 0; else { - facet->visitid= ++numfacets; + facet->visitid= (unsigned int)(++numfacets); totneighbors += qh_setsize(facet->neighbors); if (facet->simplicial){ numsimplicial++; @@ -281,7 +274,7 @@ numcoplanars += qh_setsize(facet->coplanarset); } } - qh visit_id += numfacets+1; + qh visit_id += (unsigned int)numfacets + 1; *numfacetsp= numfacets; *numsimplicialp= numsimplicial; *totneighborsp= totneighbors; @@ -390,6 +383,7 @@ normal= gmcoord; qh_sethyperplane_gauss(dim, qh gm_row, point0, True, normal, &offset, &nearzero); + /* nearzero is true for axis-parallel hyperplanes (e.g., a bounding box). Should detect degenerate hyperplanes. See 'Tv' check following */ if (qh GOODvertexp == vertexA->point) inpoint= vertexA->point; else @@ -426,7 +420,7 @@ else angle= angle - 1.0; if (angle < 0.0) - angle -= angle; + angle= -angle; trace4((qh ferr, 4015, "qh_detvnorm: points %d %d angle %2.2g nearzero %d\n", pointid, pointidA, angle, nearzero)); if (nearzero) { @@ -595,6 +589,7 @@ if printvridge, calls printvridge( fp, vertex, vertexA, centers) fp== any pointer (assumes FILE*) + fp may be NULL for QhullQh::qh_fprintf which calls appendQhullMessage vertex,vertexA= pair of input sites that define a Voronoi ridge centers= set of facets (i.e., Voronoi vertices) ->visitid == index or 0 if vertex_at_infinity @@ -669,7 +664,7 @@ totridges++; trace4((qh ferr, 4017, "qh_eachvoronoi: Voronoi ridge of %d vertices between sites %d and %d\n", count, qh_pointid(atvertex->point), qh_pointid(vertex->point))); - if (printvridge && fp) { + if (printvridge) { if (inorder && qh hull_dim == 3+1) /* 3-d Voronoi diagram */ centers= qh_detvridge3(atvertex, vertex); else @@ -725,7 +720,7 @@ qh_clearcenters(qh_ASvoronoi); qh_vertexneighbors(); - maximize_(qh visit_id, (unsigned) qh num_facets); + maximize_(qh visit_id, (unsigned int)qh num_facets); FORALLfacets { facet->visitid= 0; facet->seen= False; @@ -733,7 +728,7 @@ } FORALLfacets { if (facet->upperdelaunay == isUpper) - facet->visitid= numcenters++; + facet->visitid= (unsigned int)(numcenters++); } FORALLvertices vertex->seen= False; @@ -869,13 +864,17 @@ >-------------------------------- qh_markkeep( facetlist ) - mark good facets that meet qh.KEEParea, qh.KEEPmerge, and qh.KEEPminArea + restrict good facets for qh.KEEParea, qh.KEEPmerge, and qh.KEEPminArea ignores visible facets (!part of convex hull) returns: may clear facet->good recomputes qh.num_good + notes: + only called by qh_prepare_output after qh_findgood_all + does not throw errors except memory/corruption of qset.c + design: get set of good facets if qh.KEEParea @@ -913,7 +912,7 @@ } if (qh KEEPmerge) { qsort(SETaddr_(facets, facetT), (size_t)size, - sizeof(facetT *), qh_compare_facetmerge); + sizeof(facetT *), qh_compare_nummerge); if ((count= size - qh KEEPmerge) > 0) { FOREACHfacet_(facets) { facet->good= False; @@ -974,7 +973,7 @@ if (qh ATinfinity) SETelem_(vertices, qh num_points-1)= NULL; qh visit_id++; - maximize_(qh visit_id, (unsigned) qh num_facets); + maximize_(qh visit_id, (unsigned int)qh num_facets); FORALLfacet_(facetlist) { if (printall || !qh_skipfacet(facet)) { if (!facet->upperdelaunay) { @@ -1002,11 +1001,11 @@ numcenters++; /* qh_INFINITE */ FORALLfacet_(facetlist) { if (printall || !qh_skipfacet(facet)) - facet->visitid= numcenters++; + facet->visitid= (unsigned int)(numcenters++); } FOREACHfacet_(facets) { if (printall || !qh_skipfacet(facet)) - facet->visitid= numcenters++; + facet->visitid= (unsigned int)(numcenters++); } *isLowerp= isLower; *numcentersp= numcenters; @@ -1018,43 +1017,75 @@ >-------------------------------- qh_order_vertexneighbors( vertex ) - order facet neighbors of a 2-d or 3-d vertex by adjacency + order facet neighbors of vertex by 2-d (orientation), 3-d (adjacency), or n-d (f.visitid,id) notes: - does not orient the neighbors - - design: + error if qh_vertexneighbors not called beforehand + only 2-d orients the neighbors + for 4-d and higher + set or clear f.visitid for qh_compare_facetvisit + for example, use qh_markvoronoi (e.g., qh_printvornoi) or qh_countfacets (e.g., qh_printvneighbors) + + design (2-d): + see qh_printextremes_2d + design (3-d): initialize a new neighbor set with the first facet in vertex->neighbors while vertex->neighbors non-empty select next neighbor in the previous facet's neighbor set set vertex->neighbors to the new neighbor set + design (n-d): + qsort by f.visitid, or f.facetid (qh_compare_facetvisit) + facet_id is negated (sorted before visit_id facets) */ void qh_order_vertexneighbors(vertexT *vertex) { setT *newset; - facetT *facet, *neighbor, **neighborp; - - trace4((qh ferr, 4018, "qh_order_vertexneighbors: order neighbors of v%d for 3-d\n", vertex->id)); - newset= qh_settemp(qh_setsize(vertex->neighbors)); - facet= (facetT*)qh_setdellast(vertex->neighbors); - qh_setappend(&newset, facet); - while (qh_setsize(vertex->neighbors)) { - FOREACHneighbor_(vertex) { - if (qh_setin(facet->neighbors, neighbor)) { - qh_setdel(vertex->neighbors, neighbor); - qh_setappend(&newset, neighbor); - facet= neighbor; - break; + facetT *facet, *facetA, *facetB, *neighbor, **neighborp; + vertexT *vertexA; + int numneighbors; + + trace4((qh ferr, 4018, "qh_order_vertexneighbors: order facet neighbors of v%d by 2-d (orientation), 3-d (adjacency), or n-d (f.visitid,id)\n", vertex->id)); + if (!qh VERTEXneighbors) { + qh_fprintf(qh ferr, 6428, "qhull internal error (qh_order_vertexneighbors): call qh_vertexneighbors before calling qh_order_vertexneighbors\n"); + qh_errexit(qh_ERRqhull, NULL, NULL); + } + if (qh hull_dim == 2) { + facetA= SETfirstt_(vertex->neighbors, facetT); + if (facetA->toporient ^ qh_ORIENTclock) + vertexA= SETfirstt_(facetA->vertices, vertexT); + else + vertexA= SETsecondt_(facetA->vertices, vertexT); + if (vertexA!=vertex) { + facetB= SETsecondt_(vertex->neighbors, facetT); + SETfirst_(vertex->neighbors)= facetB; + SETsecond_(vertex->neighbors)= facetA; + } + }else if (qh hull_dim == 3) { + newset= qh_settemp(qh_setsize(vertex->neighbors)); + facet= (facetT *)qh_setdellast(vertex->neighbors); + qh_setappend(&newset, facet); + while (qh_setsize(vertex->neighbors)) { + FOREACHneighbor_(vertex) { + if (qh_setin(facet->neighbors, neighbor)) { + qh_setdel(vertex->neighbors, neighbor); + qh_setappend(&newset, neighbor); + facet= neighbor; + break; + } + } + if (!neighbor) { + qh_fprintf(qh ferr, 6066, "qhull internal error (qh_order_vertexneighbors): no neighbor of v%d for f%d\n", + vertex->id, facet->id); + qh_errexit(qh_ERRqhull, facet, NULL); } } - if (!neighbor) { - qh_fprintf(qh ferr, 6066, "qhull internal error (qh_order_vertexneighbors): no neighbor of v%d for f%d\n", - vertex->id, facet->id); - qh_errexit(qh_ERRqhull, facet, NULL); - } + qh_setfree(&vertex->neighbors); + qh_settemppop(); + vertex->neighbors= newset; + }else { /* qh.hull_dim >= 4 */ + numneighbors= qh_setsize(vertex->neighbors); + qsort(SETaddr_(vertex->neighbors, facetT), (size_t)numneighbors, + sizeof(facetT *), qh_compare_facetvisit); } - qh_setfree(&vertex->neighbors); - qh_settemppop(); - vertex->neighbors= newset; } /* order_vertexneighbors */ /*-good notes + called by qh_produce_output, qh_new_qhull, Qhull.outputQhull except for PRINTstatistics, no-op if previously called with same options */ void qh_prepare_output(void) { @@ -1232,11 +1264,11 @@ case qh_PRINTpointintersect: if (!qh feasible_point) { qh_fprintf(qh ferr, 6067, "qhull input error (qh_printafacet): option 'Fp' needs qh feasible_point\n"); - qh_errexit( qh_ERRinput, NULL, NULL); + qh_errexit(qh_ERRinput, NULL, NULL); } if (facet->offset > 0) goto LABELprintinfinite; - point= coordp= (coordT*)qh_memalloc(qh normal_size); + point= coordp= (coordT *)qh_memalloc(qh normal_size); normp= facet->normal; feasiblep= qh feasible_point; if (facet->offset < -qh MINdenom) { @@ -1288,7 +1320,7 @@ /*--------------------------------- - qh_printbegin( ) + qh_printbegin( ) prints header for all output formats returns: @@ -1475,8 +1507,8 @@ break; case qh_PRINTincidences: if (qh VORONOI && qh PRINTprecision) - qh_fprintf(qh ferr, 7053, "qhull warning: writing Delaunay. Use 'p' or 'o' for Voronoi centers\n"); - qh printoutvar= qh vertex_id; /* centrum id for non-simplicial facets */ + qh_fprintf(qh ferr, 7053, "qhull warning: input sites of Delaunay regions (option 'i'). Use option 'p' or 'o' for Voronoi centers. Disable warning with option 'Pp'\n"); + qh printoutvar= (int)qh vertex_id; /* centrum id for 4-d+, non-simplicial facets */ if (qh hull_dim <= 3) qh_fprintf(fp, 9050, "%d\n", numfacets); else @@ -1519,7 +1551,7 @@ case qh_PRINTtriangles: if (qh VORONOI) goto LABELnoformat; - num = qh hull_dim; + num= qh hull_dim; if (format == qh_PRINToff || qh hull_dim == 2) qh_fprintf(fp, 9060, "%d\n%d %d %d\n", num, qh num_points+qh_setsize(qh other_points), numfacets, totneighbors/2); @@ -1871,7 +1903,7 @@ nextfacet= SETsecondt_(facet->neighbors, facetT); } if (facet->visitid == qh visit_id) { - qh_fprintf(qh ferr, 6218, "Qhull internal error (qh_printextremes_2d): loop in facet list. facet %d nextfacet %d\n", + qh_fprintf(qh ferr, 6218, "qhull internal error (qh_printextremes_2d): loop in facet list. facet %d nextfacet %d\n", facet->id, nextfacet->id); qh_errexit2(qh_ERRqhull, facet, nextfacet); } @@ -2137,7 +2169,7 @@ /*--------------------------------- - qh_printfacet3geom_simplicial( ) + qh_printfacet3geom_simplicial( ) print Geomview OFF for a 3-d simplicial facet. notes: @@ -2271,7 +2303,7 @@ /*--------------------------------- - qh_printfacet4geom_nonsimplicial( ) + qh_printfacet4geom_nonsimplicial( ) print Geomview 4OFF file for a 4d nonsimplicial facet prints all ridges to unvisited neighbors (qh.visit_id) if qh.DROPdim @@ -2472,17 +2504,23 @@ if (facet->visible) qh_fprintf(fp, 9143, " visible"); if (facet->newfacet) - qh_fprintf(fp, 9144, " new"); + qh_fprintf(fp, 9144, " newfacet"); if (facet->tested) qh_fprintf(fp, 9145, " tested"); if (!facet->good) qh_fprintf(fp, 9146, " notG"); - if (facet->seen) + if (facet->seen && qh IStracing) qh_fprintf(fp, 9147, " seen"); - if (facet->coplanar) - qh_fprintf(fp, 9148, " coplanar"); + if (facet->seen2 && qh IStracing) + qh_fprintf(fp, 9418, " seen2"); + if (facet->isarea) + qh_fprintf(fp, 9419, " isarea"); + if (facet->coplanarhorizon) + qh_fprintf(fp, 9148, " coplanarhorizon"); if (facet->mergehorizon) qh_fprintf(fp, 9149, " mergehorizon"); + if (facet->cycledone) + qh_fprintf(fp, 9420, " cycledone"); if (facet->keepcentrum) qh_fprintf(fp, 9150, " keepcentrum"); if (facet->dupridge) @@ -2514,18 +2552,20 @@ qh_fprintf(fp, 9163, " - owner of normal & centrum is facet f%d\n", facet->f.triowner->id); }else if (facet->f.newcycle) qh_fprintf(fp, 9164, " - was horizon to f%d\n", facet->f.newcycle->id); - if (facet->nummerge) + if (facet->nummerge == qh_MAXnummerge) + qh_fprintf(fp, 9427, " - merges: %dmax\n", qh_MAXnummerge); + else if (facet->nummerge) qh_fprintf(fp, 9165, " - merges: %d\n", facet->nummerge); qh_printpointid(fp, " - normal: ", qh hull_dim, facet->normal, qh_IDunknown); qh_fprintf(fp, 9166, " - offset: %10.7g\n", facet->offset); if (qh CENTERtype == qh_ASvoronoi || facet->center) qh_printcenter(fp, qh_PRINTfacets, " - center: ", facet); #if qh_MAXoutside - if (facet->maxoutside > qh DISTround) + if (facet->maxoutside > qh DISTround) /* initial value */ qh_fprintf(fp, 9167, " - maxoutside: %10.7g\n", facet->maxoutside); #endif if (!SETempty_(facet->outsideset)) { - furthest= (pointT*)qh_setlast(facet->outsideset); + furthest= (pointT *)qh_setlast(facet->outsideset); if (qh_setsize(facet->outsideset) < 6) { qh_fprintf(fp, 9168, " - outside set(furthest p%d):\n", qh_pointid(furthest)); FOREACHpoint_(facet->outsideset) @@ -2541,7 +2581,7 @@ #endif } if (!SETempty_(facet->coplanarset)) { - furthest= (pointT*)qh_setlast(facet->coplanarset); + furthest= (pointT *)qh_setlast(facet->coplanarset); if (qh_setsize(facet->coplanarset) < 6) { qh_fprintf(fp, 9171, " - coplanar set(furthest p%d):\n", qh_pointid(furthest)); FOREACHpoint_(facet->coplanarset) @@ -2560,9 +2600,9 @@ qh_fprintf(fp, 9174, " - neighboring facets:"); FOREACHneighbor_(facet) { if (neighbor == qh_MERGEridge) - qh_fprintf(fp, 9175, " MERGE"); + qh_fprintf(fp, 9175, " MERGEridge"); else if (neighbor == qh_DUPLICATEridge) - qh_fprintf(fp, 9176, " DUP"); + qh_fprintf(fp, 9176, " DUPLICATEridge"); else qh_fprintf(fp, 9177, " f%d", neighbor->id); } @@ -2587,10 +2627,10 @@ facetT *neighbor, **neighborp; ridgeT *ridge, **ridgep; int numridges= 0; - + int n; if (facet->visible && qh NEWfacets) { - qh_fprintf(fp, 9179, " - ridges(ids may be garbage):"); + qh_fprintf(fp, 9179, " - ridges (tentative ids):"); FOREACHridge_(facet->ridges) qh_fprintf(fp, 9180, " r%d", ridge->id); qh_fprintf(fp, 9181, "\n"); @@ -2609,7 +2649,7 @@ }else { FOREACHneighbor_(facet) { FOREACHridge_(facet->ridges) { - if (otherfacet_(ridge,facet) == neighbor) { + if (otherfacet_(ridge, facet) == neighbor && !ridge->seen) { ridge->seen= True; qh_printridge(fp, ridge); numridges++; @@ -2617,12 +2657,17 @@ } } } - if (numridges != qh_setsize(facet->ridges)) { + n= qh_setsize(facet->ridges); + if (n == 1 && facet->newfacet && qh NEWtentative) { + qh_fprintf(fp, 9411, " - horizon ridge to visible facet\n"); + } + if (numridges != n) { qh_fprintf(fp, 9183, " - all ridges:"); FOREACHridge_(facet->ridges) qh_fprintf(fp, 9184, " r%d", ridge->id); - qh_fprintf(fp, 9185, "\n"); + qh_fprintf(fp, 9185, "\n"); } + /* non-3d ridges w/o non-simplicial neighbors */ FOREACHridge_(facet->ridges) { if (!ridge->seen) qh_printridge(fp, ridge); @@ -2817,7 +2862,7 @@ facetB= NULL; facets= qh_settemp(2*(qh_setsize(facetA->neighbors)+1)); qh visit_id++; - for (facet= facetA; facet; facet= ((facet == facetA) ? facetB : NULL)) { + for (facet=facetA; facet; facet= ((facet == facetA) ? facetB : NULL)) { if (facet->visitid != qh visit_id) { facet->visitid= qh visit_id; qh_setappend(&facets, facet); @@ -2850,9 +2895,9 @@ Same as QhullPoint's printPoint */ void qh_printpoint(FILE *fp, const char *string, pointT *point) { - int id= qh_pointid( point); + int id= qh_pointid(point); - qh_printpointid( fp, string, qh hull_dim, point, id); + qh_printpointid(fp, string, qh hull_dim, point, id); } /* printpoint */ void qh_printpointid(FILE *fp, const char *string, int dim, pointT *point, int id) { @@ -3024,6 +3069,14 @@ qh_fprintf(fp, 9223, " tested"); if (ridge->nonconvex) qh_fprintf(fp, 9224, " nonconvex"); + if (ridge->mergevertex) + qh_fprintf(fp, 9421, " mergevertex"); + if (ridge->mergevertex2) + qh_fprintf(fp, 9422, " mergevertex2"); + if (ridge->simplicialtop) + qh_fprintf(fp, 9425, " simplicialtop"); + if (ridge->simplicialbot) + qh_fprintf(fp, 9423, " simplicialbot"); qh_fprintf(fp, 9225, "\n"); qh_printvertices(fp, " vertices:", ridge->vertices); if (ridge->top && ridge->bottom) @@ -3153,8 +3206,8 @@ innerouter= qh_RIDGEouter; printvridge= qh_printvnorm; }else { - qh_fprintf(qh ferr, 6219, "Qhull internal error (qh_printvdiagram): unknown print format %d.\n", format); - qh_errexit(qh_ERRinput, NULL, NULL); + qh_fprintf(qh ferr, 6219, "qhull internal error (qh_printvdiagram): unknown print format %d.\n", format); + qh_errexit(qh_ERRqhull, NULL, NULL); } vertices= qh_markvoronoi(facetlist, facets, printall, &isLower, &numcenters); totcount= qh_printvdiagram2(NULL, NULL, vertices, innerouter, False); @@ -3242,7 +3295,13 @@ if (vertex->deleted) qh_fprintf(fp, 9237, " deleted"); if (vertex->delridge) - qh_fprintf(fp, 9238, " ridgedeleted"); + qh_fprintf(fp, 9238, " delridge"); + if (vertex->newfacet) + qh_fprintf(fp, 9415, " newfacet"); + if (vertex->seen && qh IStracing) + qh_fprintf(fp, 9416, " seen"); + if (vertex->seen2 && qh IStracing) + qh_fprintf(fp, 9417, " seen2"); qh_fprintf(fp, 9239, "\n"); if (vertex->neighbors) { qh_fprintf(fp, 9240, " neighbors:"); @@ -3341,11 +3400,7 @@ if (vertex) { numneighbors= qh_setsize(vertex->neighbors); qh_fprintf(fp, 9249, "%d", numneighbors); - if (qh hull_dim == 3) - qh_order_vertexneighbors(vertex); - else if (qh hull_dim >= 4) - qsort(SETaddr_(vertex->neighbors, facetT), (size_t)numneighbors, - sizeof(facetT *), qh_compare_facetvisit); + qh_order_vertexneighbors(vertex); FOREACHneighbor_(vertex) qh_fprintf(fp, 9250, " %d", neighbor->visitid ? neighbor->visitid - 1 : 0 - neighbor->id); @@ -3390,13 +3445,13 @@ setT *vertices; vertexT *vertex; boolT isLower; - unsigned int numfacets= (unsigned int) qh num_facets; + unsigned int numfacets= (unsigned int)qh num_facets; vertices= qh_markvoronoi(facetlist, facets, printall, &isLower, &numcenters); FOREACHvertex_i_(vertices) { if (vertex) { numvertices++; - numneighbors = numinf = 0; + numneighbors= numinf= 0; FOREACHneighbor_(vertex) { if (neighbor->visitid == 0) numinf= 1; @@ -3441,12 +3496,7 @@ numneighbors= 0; numinf=0; if (vertex) { - if (qh hull_dim == 3) - qh_order_vertexneighbors(vertex); - else if (qh hull_dim >= 4) - qsort(SETaddr_(vertex->neighbors, facetT), - (size_t)qh_setsize(vertex->neighbors), - sizeof(facetT *), qh_compare_facetvisit); + qh_order_vertexneighbors(vertex); FOREACHneighbor_(vertex) { if (neighbor->visitid == 0) numinf= 1; @@ -3601,7 +3651,7 @@ } if (qh feasible_string) qh_fprintf(qh ferr, 7057, "qhull input warning: feasible point(dim 1 coords) overrides 'Hn,n,n' feasible point for halfspace intersection\n"); - if (!(qh feasible_point= (coordT*)qh_malloc(dim* sizeof(coordT)))) { + if (!(qh feasible_point= (coordT *)qh_malloc((size_t)dim * sizeof(coordT)))) { qh_fprintf(qh ferr, 6071, "qhull error: insufficient memory for feasible point\n"); qh_errexit(qh_ERRmem, NULL, NULL); } @@ -3668,7 +3718,7 @@ notes: dimension will change in qh_initqhull_globals if qh.PROJECTinput uses malloc() since qh_mem not initialized - FIXUP QH11012: qh_readpoints needs rewriting, too long + QH11012 FIX: qh_readpoints needs rewriting, too long */ coordT *qh_readpoints(int *numpoints, int *dimension, boolT *ismalloc) { coordT *points, *coords, *infinity= NULL; @@ -3741,11 +3791,22 @@ numinput= tempi; } if (diminput < 2) { - qh_fprintf(qh ferr, 6220,"qhull input error: dimension %d(first number) should be at least 2\n", + qh_fprintf(qh ferr, 6220, "qhull input error: dimension %d (first or smaller number) should be at least 2\n", diminput); qh_errexit(qh_ERRinput, NULL, NULL); } - if (isdelaunay) { + if (numinput < 1 || numinput > qh_POINTSmax) { + qh_fprintf(qh ferr, 6411, "qhull input error: expecting between 1 and %d points. Got %d %d-d points\n", + qh_POINTSmax, numinput, diminput); + qh_errexit(qh_ERRinput, NULL, NULL); + /* same error message in qh_initqhull_globals */ + } + + if (isdelaunay && qh HALFspace) { + qh_fprintf(qh ferr, 6037, "qhull option error (qh_readpoints): can not use Delaunay('d') or Voronoi('v') with halfspace intersection('H')\n"); + qh_errexit(qh_ERRinput, NULL, NULL); + /* otherwise corrupted memory allocations, same error message as in qh_initqhull_globals */ + }else if (isdelaunay) { qh PROJECTdelaunay= False; if (qh CDDinput) *dimension= diminput; @@ -3758,13 +3819,13 @@ *dimension= diminput - 1; *numpoints= numinput; if (diminput < 3) { - qh_fprintf(qh ferr, 6221,"qhull input error: dimension %d(first number, includes offset) should be at least 3 for halfspaces\n", + qh_fprintf(qh ferr, 6221, "qhull input error: dimension %d (first number, includes offset) should be at least 3 for halfspaces\n", diminput); qh_errexit(qh_ERRinput, NULL, NULL); } if (dimfeasible) { if (dimfeasible != *dimension) { - qh_fprintf(qh ferr, 6222,"qhull input error: dimension %d of feasible point is not one less than dimension %d for halfspaces\n", + qh_fprintf(qh ferr, 6222, "qhull input error: dimension %d of feasible point is not one less than dimension %d for halfspaces\n", dimfeasible, diminput); qh_errexit(qh_ERRinput, NULL, NULL); } @@ -3777,9 +3838,9 @@ *dimension= diminput; *numpoints= numinput; } - qh normal_size= *dimension * sizeof(coordT); /* for tracing with qh_printpoint */ + qh normal_size= *dimension * (int)sizeof(coordT); /* for tracing with qh_printpoint */ if (qh HALFspace) { - qh half_space= coordp= (coordT*)qh_malloc(qh normal_size + sizeof(coordT)); + qh half_space= coordp= (coordT *)qh_malloc((size_t)qh normal_size + sizeof(coordT)); if (qh CDDinput) { offsetp= qh half_space; normalp= offsetp + 1; @@ -3790,10 +3851,10 @@ } qh maxline= diminput * (qh_REALdigits + 5); maximize_(qh maxline, 500); - qh line= (char*)qh_malloc((qh maxline+1) * sizeof(char)); + qh line= (char *)qh_malloc((size_t)(qh maxline+1) * sizeof(char)); *ismalloc= True; /* use malloc since memory not setup */ coords= points= qh temp_malloc= /* numinput and diminput >=2 by QH6220 */ - (coordT*)qh_malloc((*numpoints)*(*dimension)*sizeof(coordT)); + (coordT *)qh_malloc((size_t)((*numpoints)*(*dimension))*sizeof(coordT)); if (!coords || !qh line || (qh HALFspace && !qh half_space)) { qh_fprintf(qh ferr, 6076, "qhull error: insufficient memory to read %d points\n", numinput); @@ -3894,19 +3955,29 @@ } isfirst= False; } + if (qh rbox_command[0]) + qh rbox_command[strlen(qh rbox_command)-1]= '\0'; /* remove \n, previous qh_errexit's display command as two lines */ if (tokcount != maxcount) { newnum= fmin_(numinput, tokcount/diminput); - qh_fprintf(qh ferr, 7073,"\ -qhull warning: instead of %d %d-dimensional points, input contains\n\ -%d points and %d extra coordinates. Line %d is the first\npoint", - numinput, diminput, tokcount/diminput, tokcount % diminput, firstpoint); + if (qh ALLOWshort) + qh_fprintf(qh ferr, 7073, "qhull warning: instead of %d points in %d-d, input contains %d points and %d extra coordinates.\n", + numinput, diminput, tokcount/diminput, tokcount % diminput); + else + qh_fprintf(qh ferr, 6410, "qhull error: instead of %d points in %d-d, input contains %d points and %d extra coordinates.\n", + numinput, diminput, tokcount/diminput, tokcount % diminput); if (firsttext) - qh_fprintf(qh ferr, 8051, ", line %d is the first comment", firsttext); + qh_fprintf(qh ferr, 8051, " Line %d is the first comment.\n", firsttext); + qh_fprintf(qh ferr, 8033, " Line %d is the first point.\n", firstpoint); if (firstshort) - qh_fprintf(qh ferr, 8052, ", line %d is the first short\nline", firstshort); + qh_fprintf(qh ferr, 8052, " Line %d is the first short line.\n", firstshort); if (firstlong) - qh_fprintf(qh ferr, 8053, ", line %d is the first long line", firstlong); - qh_fprintf(qh ferr, 8054, ". Continue with %d points.\n", newnum); + qh_fprintf(qh ferr, 8053, " Line %d is the first long line.\n", firstlong); + if (qh ALLOWshort) + qh_fprintf(qh ferr, 8054, " Continuing with %d points.\n", newnum); + else { + qh_fprintf(qh ferr, 8077, " Override with option 'Qa' (allow-short)\n"); + qh_errexit(qh_ERRinput, NULL, NULL); + } numinput= newnum; if (isdelaunay && qh ATinfinity) { for (k= tokcount % diminput; k--; ) @@ -3918,20 +3989,18 @@ } } if (isdelaunay && qh ATinfinity) { - for (k= (*dimension) -1; k--; ) + for (k= (*dimension) - 1; k--; ) infinity[k] /= numinput; if (coords == infinity) coords += (*dimension) -1; else { - for (k=0; k < (*dimension) -1; k++) + for (k=0; k < (*dimension) - 1; k++) *(coords++)= infinity[k]; } *(coords++)= maxboloid * 1.1; } - if (qh rbox_command[0]) { - qh rbox_command[strlen(qh rbox_command)-1]= '\0'; - if (!strcmp(qh rbox_command, "./rbox D4")) - qh_fprintf(qh ferr, 8055, "\n\ + if (!strcmp(qh rbox_command, "./rbox D4")) + qh_fprintf(qh ferr, 8055, "\n\ This is the qhull test case. If any errors or core dumps occur,\n\ recompile qhull with 'make new'. If errors still occur, there is\n\ an incompatibility. You should try a different compiler. You can also\n\ @@ -3939,7 +4008,6 @@ please send mail to qhull_bug@qhull.org.\n\ \n\ Type 'qhull' for a short list of options.\n"); - } qh_free(qh line); qh line= NULL; if (qh half_space) { @@ -3970,12 +4038,10 @@ coordT *coords, value; if (!(s= qh feasible_string)) { - qh_fprintf(qh ferr, 6223, "\ -qhull input error: halfspace intersection needs a feasible point.\n\ -Either prepend the input with 1 point or use 'Hn,n,n'. See manual.\n"); + qh_fprintf(qh ferr, 6223, "qhull input error: halfspace intersection needs a feasible point. Either prepend the input with 1 point or use 'Hn,n,n'. See manual.\n"); qh_errexit(qh_ERRinput, NULL, NULL); } - if (!(qh feasible_point= (pointT*)qh_malloc(dim * sizeof(coordT)))) { + if (!(qh feasible_point= (pointT *)qh_malloc((size_t)dim * sizeof(coordT)))) { qh_fprintf(qh ferr, 6079, "qhull error: insufficient memory for 'Hn,n,n'\n"); qh_errexit(qh_ERRmem, NULL, NULL); } diff -Nru qhull-2015.2/src/libqhull/io.h qhull-2020.2/src/libqhull/io.h --- qhull-2015.2/src/libqhull/io.h 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/src/libqhull/io.h 2020-05-22 02:00:58.000000000 +0000 @@ -6,9 +6,9 @@ see README, libqhull.h and io.c - Copyright (c) 1993-2015 The Geometry Center. - $Id: //main/2015/qhull/src/libqhull/io.h#1 $$Change: 1981 $ - $DateTime: 2015/09/28 20:26:32 $$Author: bbarber $ + Copyright (c) 1993-2020 The Geometry Center. + $Id: //main/2019/qhull/src/libqhull/io.h#3 $$Change: 2953 $ + $DateTime: 2020/05/21 22:05:32 $$Author: bbarber $ */ #ifndef qhDEFio @@ -60,7 +60,7 @@ */ typedef enum { - qh_RIDGEall = 0, qh_RIDGEinner, qh_RIDGEouter + qh_RIDGEall= 0, qh_RIDGEinner, qh_RIDGEouter } qh_RIDGE; @@ -77,12 +77,11 @@ /*============== -prototypes in alphabetical order =========*/ -void qh_dfacet(unsigned id); -void qh_dvertex(unsigned id); +void qh_dfacet(unsigned int id); +void qh_dvertex(unsigned int id); int qh_compare_facetarea(const void *p1, const void *p2); -int qh_compare_facetmerge(const void *p1, const void *p2); int qh_compare_facetvisit(const void *p1, const void *p2); -int qh_compare_vertexpoint(const void *p1, const void *p2); /* not used, not in libqhull_r.h */ +int qh_compare_nummerge(const void *p1, const void *p2); void qh_copyfilename(char *filename, int size, const char* source, int length); void qh_countfacets(facetT *facetlist, setT *facets, boolT printall, int *numfacetsp, int *numsimplicialp, int *totneighborsp, @@ -127,8 +126,8 @@ void qh_printfacets(FILE *fp, qh_PRINT format, facetT *facetlist, setT *facets, boolT printall); void qh_printhyperplaneintersection(FILE *fp, facetT *facet1, facetT *facet2, setT *vertices, realT color[3]); -void qh_printneighborhood(FILE *fp, qh_PRINT format, facetT *facetA, facetT *facetB, boolT printall); void qh_printline3geom(FILE *fp, pointT *pointA, pointT *pointB, realT color[3]); +void qh_printneighborhood(FILE *fp, qh_PRINT format, facetT *facetA, facetT *facetB, boolT printall); void qh_printpoint(FILE *fp, const char *string, pointT *point); void qh_printpointid(FILE *fp, const char *string, int dim, pointT *point, int id); void qh_printpoint3(FILE *fp, pointT *point); diff -Nru qhull-2015.2/src/libqhull/libqhull.c qhull-2020.2/src/libqhull/libqhull.c --- qhull-2015.2/src/libqhull/libqhull.c 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/src/libqhull/libqhull.c 2020-05-22 02:00:58.000000000 +0000 @@ -10,9 +10,9 @@ see qhull_a.h for internal functions - Copyright (c) 1993-2015 The Geometry Center. - $Id: //main/2015/qhull/src/libqhull/libqhull.c#3 $$Change: 2047 $ - $DateTime: 2016/01/04 22:03:18 $$Author: bbarber $ + Copyright (c) 1993-2020 The Geometry Center. + $Id: //main/2019/qhull/src/libqhull/libqhull.c#13 $$Change: 2953 $ + $DateTime: 2020/05/21 22:05:32 $$Author: bbarber $ */ #include "qhull_a.h" @@ -22,7 +22,7 @@ /*--------------------------------- - qh_qhull() + qh_qhull( ) compute DIM3 convex hull of qh.num_points starting at qh.first_point qh contains all global options and variables @@ -67,29 +67,36 @@ qh_initbuild(); qh_buildhull(); } - if (!qh STOPpoint && !qh STOPcone) { + if (!qh STOPadd && !qh STOPcone && !qh STOPpoint) { if (qh ZEROall_ok && !qh TESTvneighbors && qh MERGEexact) - qh_checkzero( qh_ALL); + qh_checkzero(qh_ALL); if (qh ZEROall_ok && !qh TESTvneighbors && !qh WAScoplanar) { trace2((qh ferr, 2055, "qh_qhull: all facets are clearly convex and no coplanar points. Post-merging and check of maxout not needed.\n")); qh DOcheckmax= False; }else { + qh_initmergesets(/* qh.facet_mergeset,degen_mergeset,vertex_mergeset */); if (qh MERGEexact || (qh hull_dim > qh_DIMreduceBuild && qh PREmerge)) qh_postmerge("First post-merge", qh premerge_centrum, qh premerge_cos, - (qh POSTmerge ? False : qh TESTvneighbors)); + (qh POSTmerge ? False : qh TESTvneighbors)); /* calls qh_reducevertices */ else if (!qh POSTmerge && qh TESTvneighbors) qh_postmerge("For testing vertex neighbors", qh premerge_centrum, - qh premerge_cos, True); + qh premerge_cos, True); /* calls qh_test_vneighbors */ if (qh POSTmerge) qh_postmerge("For post-merging", qh postmerge_centrum, qh postmerge_cos, qh TESTvneighbors); - if (qh visible_list == qh facet_list) { /* i.e., merging done */ + if (qh visible_list == qh facet_list) { /* qh_postmerge was called */ qh findbestnew= True; - qh_partitionvisible(/*qh.visible_list*/ !qh_ALL, &numoutside); + qh_partitionvisible(!qh_ALL, &numoutside /* qh.visible_list */); qh findbestnew= False; - qh_deletevisible(/*qh.visible_list*/); - qh_resetlists(False, qh_RESETvisible /*qh.visible_list newvertex_list newfacet_list */); + qh_deletevisible(/* qh.visible_list */); /* stops at first !f.visible */ + qh_resetlists(False, qh_RESETvisible /* qh.visible_list newvertex_list qh.newfacet_list */); } + qh_all_vertexmerges(-1, NULL, NULL); + qh_freemergesets(); + } + if (qh TRACEpoint == qh_IDunknown && qh TRACElevel > qh IStracing) { + qh IStracing= qh TRACElevel; + qh_fprintf(qh ferr, 2112, "qh_qhull: finished qh_buildhull and qh_postmerge, start tracing (TP-1)\n"); } if (qh DOcheckmax){ if (qh REPORTfreq) { @@ -102,7 +109,7 @@ qh_nearcoplanar(); } if (qh_setsize(qhmem.tempstack) != 0) { - qh_fprintf(qh ferr, 6164, "qhull internal error (qh_qhull): temporary sets not empty(%d)\n", + qh_fprintf(qh ferr, 6164, "qhull internal error (qh_qhull): temporary sets not empty(%d) at end of Qhull\n", qh_setsize(qhmem.tempstack)); qh_errexit(qh_ERRqhull, NULL, NULL); } @@ -128,21 +135,24 @@ returns: returns False if user requested an early termination - qh.visible_list, newfacet_list, delvertex_list, NEWfacets may be defined + qh.visible_list, newfacet_list, delvertex_list, NEWfacets may be defined updates qh.facet_list, qh.num_facets, qh.vertex_list, qh.num_vertices clear qh.maxoutdone (will need to call qh_check_maxout() for facet->maxoutside) if unknown point, adds a pointer to qh.other_points do not deallocate the point's coordinates notes: + called from qh_initbuild, qh_buildhull, and qh_addpoint + tail recursive call if merged a pinchedvertex due to a duplicated ridge + no more than qh.num_vertices calls (QH6296) assumes point is near its best facet and not at a local minimum of a lens distributions. Use qh_findbestfacet to avoid this case. uses qh.visible_list, qh.newfacet_list, qh.delvertex_list, qh.NEWfacets - - see also: - qh_triangulate() -- triangulate non-simplicial facets + if called from a user application after qh_qhull and 'QJ' (joggle), + facet merging for precision problems is disabled by default design: + exit if qh.STOPadd vertices 'TAn' add point to other_points if needed if checkdist if point not above facet @@ -150,11 +160,9 @@ exit exit if pre STOPpoint requested find horizon and visible facets for point - make new facets for point to horizon - make hyperplanes for point - compute balance statistics - match neighboring new facets - update vertex neighbors and delete interior vertices + build cone of new facets to the horizon + exit if build cone fails due to qh.ONLYgood + tail recursive call if build cone fails due to pinched vertices exit if STOPcone requested merge non-convex new facets if merge found, many merges, or 'Qf' @@ -166,12 +174,11 @@ reset working lists of facets and vertices */ boolT qh_addpoint(pointT *furthest, facetT *facet, boolT checkdist) { - int goodvisible, goodhorizon; - vertexT *vertex; - facetT *newfacet; - realT dist, newbalance, pbalance; + realT dist, pbalance; + facetT *replacefacet, *newfacet; + vertexT *apex; boolT isoutside= False; - int numpart, numpoints, numnew, firstnew; + int numpart, numpoints, goodvisible, goodhorizon, apexpointid; qh maxoutdone= False; if (qh_pointid(furthest) == qh_IDunknown) @@ -180,6 +187,7 @@ qh_fprintf(qh ferr, 6213, "qhull internal error (qh_addpoint): NULL facet. Need to call qh_findbestfacet first\n"); qh_errexit(qh_ERRqhull, NULL, NULL); } + qh_detmaxoutside(); if (checkdist) { facet= qh_findbest(furthest, facet, !qh_ALL, !qh_ISnewfacets, !qh_NOupper, &dist, &isoutside, &numpart); @@ -187,7 +195,7 @@ if (!isoutside) { zinc_(Znotmax); /* last point of outsideset is no longer furthest. */ facet->notfurthest= True; - qh_partitioncoplanar(furthest, facet, &dist); + qh_partitioncoplanar(furthest, facet, &dist, qh findbestnew); return True; } } @@ -197,44 +205,47 @@ return False; } qh_findhorizon(furthest, facet, &goodvisible, &goodhorizon); - if (qh ONLYgood && !(goodvisible+goodhorizon) && !qh GOODclosest) { + if (qh ONLYgood && !qh GOODclosest && !(goodvisible+goodhorizon)) { zinc_(Znotgood); facet->notfurthest= True; /* last point of outsideset is no longer furthest. This is ok - since all points of the outside are likely to be bad */ - qh_resetlists(False, qh_RESETvisible /*qh.visible_list newvertex_list newfacet_list */); + since all points of the outside are likely to be bad */ + qh_resetlists(False, qh_RESETvisible /* qh.visible_list newvertex_list qh.newfacet_list */); return True; } - zzinc_(Zprocessed); - firstnew= qh facet_id; - vertex= qh_makenewfacets(furthest /*visible_list, attaches if !ONLYgood */); - qh_makenewplanes(/* newfacet_list */); - numnew= qh facet_id - firstnew; - newbalance= numnew - (realT) (qh num_facets-qh num_visible) - * qh hull_dim/qh num_vertices; - wadd_(Wnewbalance, newbalance); - wadd_(Wnewbalance2, newbalance * newbalance); - if (qh ONLYgood - && !qh_findgood(qh newfacet_list, goodhorizon) && !qh GOODclosest) { - FORALLnew_facets - qh_delfacet(newfacet); - qh_delvertex(vertex); - qh_resetlists(True, qh_RESETvisible /*qh.visible_list newvertex_list newfacet_list */); - zinc_(Znotgoodnew); - facet->notfurthest= True; - return True; + apex= qh_buildcone(furthest, facet, goodhorizon, &replacefacet); + /* qh.newfacet_list, visible_list, newvertex_list */ + if (!apex) { + if (qh ONLYgood) + return True; /* ignore this furthest point, a good new facet was not found */ + if (replacefacet) { + if (qh retry_addpoint++ >= qh num_vertices) { + qh_fprintf(qh ferr, 6296, "qhull internal error (qh_addpoint): infinite loop (%d retries) of merging pinched vertices due to dupridge for point p%d, facet f%d, and %d vertices\n", + qh retry_addpoint, qh_pointid(furthest), facet->id, qh num_vertices); + qh_errexit(qh_ERRqhull, facet, NULL); + } + /* retry qh_addpoint after resolving a dupridge via qh_merge_pinchedvertices */ + return qh_addpoint(furthest, replacefacet, True /* checkdisk */); + } + qh retry_addpoint= 0; + return True; /* ignore this furthest point, resolved a dupridge by making furthest a coplanar point */ } - if (qh ONLYgood) - qh_attachnewfacets(/*visible_list*/); - qh_matchnewfacets(); - qh_updatevertices(); + if (qh retry_addpoint) { + zinc_(Zretryadd); + zadd_(Zretryaddtot, qh retry_addpoint); + zmax_(Zretryaddmax, qh retry_addpoint); + qh retry_addpoint= 0; + } + apexpointid= qh_pointid(apex->point); + zzinc_(Zprocessed); if (qh STOPcone && qh furthest_id == qh STOPcone-1) { facet->notfurthest= True; return False; /* visible_list etc. still defined */ } qh findbestnew= False; if (qh PREmerge || qh MERGEexact) { - qh_premerge(vertex, qh premerge_centrum, qh premerge_cos); + qh_initmergesets(/* qh.facet_mergeset,degen_mergeset,vertex_mergeset */); + qh_premerge(apexpointid, qh premerge_centrum, qh premerge_cos /* qh.newfacet_list */); if (qh_USEfindbestnew) qh findbestnew= True; else { @@ -247,7 +258,9 @@ } }else if (qh BESToutside) qh findbestnew= True; - qh_partitionvisible(/*qh.visible_list*/ !qh_ALL, &numpoints); + if (qh IStracing >= 4) + qh_checkpolygon(qh visible_list); + qh_partitionvisible(!qh_ALL, &numpoints /* qh.visible_list */); qh findbestnew= False; qh findbest_notsharp= False; zinc_(Zpbalance); @@ -255,57 +268,68 @@ * (qh num_points - qh num_vertices)/qh num_vertices; wadd_(Wpbalance, pbalance); wadd_(Wpbalance2, pbalance * pbalance); - qh_deletevisible(/*qh.visible_list*/); + qh_deletevisible(/* qh.visible_list */); zmax_(Zmaxvertex, qh num_vertices); qh NEWfacets= False; if (qh IStracing >= 4) { - if (qh num_facets < 2000) + if (qh num_facets < 200) qh_printlists(); qh_printfacetlist(qh newfacet_list, NULL, True); qh_checkpolygon(qh facet_list); }else if (qh CHECKfrequently) { - if (qh num_facets < 50) + if (qh num_facets < 1000) qh_checkpolygon(qh facet_list); else qh_checkpolygon(qh newfacet_list); } - if (qh STOPpoint > 0 && qh furthest_id == qh STOPpoint-1) + if (qh STOPpoint > 0 && qh furthest_id == qh STOPpoint-1 && qh_setsize(qh vertex_mergeset) > 0) return False; - qh_resetlists(True, qh_RESETvisible /*qh.visible_list newvertex_list newfacet_list */); + qh_resetlists(True, qh_RESETvisible /* qh.visible_list newvertex_list qh.newfacet_list */); + if (qh facet_mergeset) { + /* vertex merges occur after facet merges (qh_premerge) and qh_resetlists */ + qh_all_vertexmerges(apexpointid, NULL, NULL); + qh_freemergesets(); + } /* qh_triangulate(); to test qh.TRInormals */ - trace2((qh ferr, 2056, "qh_addpoint: added p%d new facets %d new balance %2.2g point balance %2.2g\n", - qh_pointid(furthest), numnew, newbalance, pbalance)); + if (qh STOPpoint > 0 && qh furthest_id == qh STOPpoint-1) + return False; + trace2((qh ferr, 2056, "qh_addpoint: added p%d to convex hull with point balance %2.2g\n", + qh_pointid(furthest), pbalance)); return True; } /* addpoint */ /*--------------------------------- - qh_build_withrestart() + qh_build_withrestart( ) allow restarts due to qh.JOGGLEmax while calling qh_buildhull() qh_errexit always undoes qh_build_withrestart() qh.FIRSTpoint/qh.NUMpoints is point array - it may be moved by qh_joggleinput() + it may be moved by qh_joggleinput */ void qh_build_withrestart(void) { int restart; + vertexT *vertex, **vertexp; qh ALLOWrestart= True; while (True) { restart= setjmp(qh restartexit); /* simple statement for CRAY J916 */ - if (restart) { /* only from qh_precision() */ + if (restart) { /* only from qh_joggle_restart() */ + qh last_errcode= qh_ERRnone; zzinc_(Zretry); wmax_(Wretrymax, qh JOGGLEmax); /* QH7078 warns about using 'TCn' with 'QJn' */ qh STOPcone= qh_IDunknown; /* if break from joggle, prevents normal output */ + FOREACHvertex_(qh del_vertices) { + if (vertex->point && !vertex->partitioned) + vertex->partitioned= True; /* avoid error in qh_freebuild -> qh_delvertex */ + } } if (!qh RERUN && qh JOGGLEmax < REALmax/2) { if (qh build_cnt > qh_JOGGLEmaxretry) { - qh_fprintf(qh ferr, 6229, "qhull precision error: %d attempts to construct a convex hull\n\ - with joggled input. Increase joggle above 'QJ%2.2g'\n\ - or modify qh_JOGGLE... parameters in user.h\n", + qh_fprintf(qh ferr, 6229, "qhull input error: %d attempts to construct a convex hull with joggled input. Increase joggle above 'QJ%2.2g' or modify qh_JOGGLE... parameters in user.h\n", qh build_cnt, qh JOGGLEmax); - qh_errexit(qh_ERRqhull, NULL, NULL); + qh_errexit(qh_ERRinput, NULL, NULL); } if (qh build_cnt && !restart) break; @@ -317,13 +341,13 @@ if (!qh qhull_optionsiz) qh qhull_optionsiz= (int)strlen(qh qhull_options); /* WARN64 */ else { - qh qhull_options [qh qhull_optionsiz]= '\0'; + qh qhull_options[qh qhull_optionsiz]= '\0'; qh qhull_optionlen= qh_OPTIONline; /* starts a new line */ } qh_option("_run", &qh build_cnt, NULL); if (qh build_cnt == qh RERUN) { qh IStracing= qh TRACElastrun; /* duplicated from qh_initqhull_globals */ - if (qh TRACEpoint != qh_IDunknown || qh TRACEdist < REALmax/2 || qh TRACEmerge) { + if (qh TRACEpoint != qh_IDnone || qh TRACEdist < REALmax/2 || qh TRACEmerge) { qh TRACElevel= (qh IStracing? qh IStracing : 3); qh IStracing= 0; } @@ -340,9 +364,210 @@ } /* qh_build_withrestart */ /*--------------------------------- + + qh_buildcone( furthest, facet, goodhorizon, &replacefacet ) + build cone of new facets from furthest to the horizon + goodhorizon is count of good, horizon facets from qh_find_horizon + + returns: + returns apex of cone with qh.newfacet_list and qh.first_newfacet (f.id) + returns NULL if qh.ONLYgood and no good facets + returns NULL and retryfacet if merging pinched vertices will resolve a dupridge + a horizon vertex was nearly adjacent to another vertex + will retry qh_addpoint + returns NULL if resolve a dupridge by making furthest a coplanar point + furthest was nearly adjacent to an existing vertex + updates qh.degen_mergeset (MRGridge) if resolve a dupridge by merging facets + updates qh.newfacet_list, visible_list, newvertex_list + updates qh.facet_list, vertex_list, num_facets, num_vertices + + notes: + called by qh_addpoint + see qh_triangulate, it triangulates non-simplicial facets in post-processing + + design: + make new facets for point to horizon + compute balance statistics + make hyperplanes for point + exit if qh.ONLYgood and not good (qh_buildcone_onlygood) + match neighboring new facets + if dupridges + exit if !qh.IGNOREpinched and dupridge resolved by coplanar furthest + retry qh_buildcone if !qh.IGNOREpinched and dupridge resolved by qh_buildcone_mergepinched + otherwise dupridges resolved by merging facets + update vertex neighbors and delete interior vertices +*/ +vertexT *qh_buildcone(pointT *furthest, facetT *facet, int goodhorizon, facetT **retryfacet) { + vertexT *apex; + realT newbalance; + int numnew; + + *retryfacet= NULL; + qh first_newfacet= qh facet_id; + qh NEWtentative= (qh MERGEpinched || qh ONLYgood); /* cleared by qh_attachnewfacets or qh_resetlists */ + apex= qh_makenewfacets(furthest /* qh.newfacet_list visible_list, attaches new facets if !qh.NEWtentative */); + numnew= (int)(qh facet_id - qh first_newfacet); + newbalance= numnew - (realT)(qh num_facets - qh num_visible) * qh hull_dim / qh num_vertices; + /* newbalance statistics updated below if the new facets are accepted */ + if (qh ONLYgood) { /* qh.MERGEpinched is false by QH6362 */ + if (!qh_buildcone_onlygood(apex, goodhorizon /* qh.newfacet_list */)) { + facet->notfurthest= True; + return NULL; + } + }else if(qh MERGEpinched) { +#ifndef qh_NOmerge + if (qh_buildcone_mergepinched(apex, facet, retryfacet /* qh.newfacet_list */)) + return NULL; +#else + qh_fprintf(qh ferr, 6375, "qhull option error (qh_buildcone): option 'Q14' (qh.MERGEpinched) is not available due to qh_NOmerge\n"); + qh_errexit(qh_ERRinput, NULL, NULL); +#endif + }else { + /* qh_makenewfacets attached new facets to the horizon */ + qh_matchnewfacets(); /* ignore returned value. qh_forcedmerges will merge dupridges if any */ + qh_makenewplanes(/* qh.newfacet_list */); + qh_update_vertexneighbors_cone(); + } + wadd_(Wnewbalance, newbalance); + wadd_(Wnewbalance2, newbalance * newbalance); + trace2((qh ferr, 2067, "qh_buildcone: created %d newfacets for p%d(v%d) new facet balance %2.2g\n", + numnew, qh_pointid(furthest), apex->id, newbalance)); + return apex; +} /* buildcone */ + +#ifndef qh_NOmerge +/*--------------------------------- + + qh_buildcone_mergepinched( apex, facet, maxdupdist, &retryfacet ) + build cone of new facets from furthest to the horizon + maxdupdist>0.0 for merging dupridges (qh_matchdupridge) + + returns: + returns True if merged a pinched vertex and deleted the cone of new facets + if retryfacet is set + a dupridge was resolved by qh_merge_pinchedvertices + retry qh_addpoint + otherwise + apex/furthest was partitioned as a coplanar point + ignore this furthest point + returns False if no dupridges or if dupridges will be resolved by MRGridge + updates qh.facet_list, qh.num_facets, qh.vertex_list, qh.num_vertices + + notes: + only called from qh_buildcone with qh.MERGEpinched + + design: + match neighboring new facets + if matching detected dupridges with a wide merge (qh_RATIOtrypinched) + if pinched vertices (i.e., nearly adjacent) + delete the cone of new facets + delete the apex and reset the facet lists + if coplanar, pinched apex + partition the apex as a coplanar point + else + repeatedly merge the nearest pair of pinched vertices and subsequent facet merges + return True + otherwise + MRGridge are better than vertex merge, but may report an error + attach new facets + make hyperplanes for point + update vertex neighbors and delete interior vertices +*/ +boolT qh_buildcone_mergepinched(vertexT *apex, facetT *facet, facetT **retryfacet) { + facetT *newfacet, *nextfacet; + pointT *apexpoint; + coordT maxdupdist; + int apexpointid; + boolT iscoplanar; + + *retryfacet= NULL; + maxdupdist= qh_matchnewfacets(); + if (maxdupdist > qh_RATIOtrypinched * qh ONEmerge) { /* one or more dupridges with a wide merge */ + if (qh IStracing >= 4 && qh num_facets < 1000) + qh_printlists(); + qh_initmergesets(/* qh.facet_mergeset,degen_mergeset,vertex_mergeset */); + if (qh_getpinchedmerges(apex, maxdupdist, &iscoplanar /* qh.newfacet_list, qh.vertex_mergeset */)) { + for (newfacet=qh newfacet_list; newfacet && newfacet->next; newfacet= nextfacet) { + nextfacet= newfacet->next; + qh_delfacet(newfacet); + } + apexpoint= apex->point; + apexpointid= qh_pointid(apexpoint); + qh_delvertex(apex); + qh_resetlists(False, qh_RESETvisible /* qh.visible_list newvertex_list qh.newfacet_list */); + if (iscoplanar) { + zinc_(Zpinchedapex); + facet->notfurthest= True; + qh_partitioncoplanar(apexpoint, facet, NULL, qh findbestnew); + }else { + qh_all_vertexmerges(apexpointid, facet, retryfacet); + } + qh_freemergesets(); /* errors if not empty */ + return True; + } + /* MRGridge are better than vertex merge, but may report an error */ + qh_freemergesets(); + } + qh_attachnewfacets(/* qh.visible_list */); + qh_makenewplanes(/* qh.newfacet_list */); + qh_update_vertexneighbors_cone(); + return False; +} /* buildcone_mergepinched */ +#endif /* !qh_NOmerge */ + +/*--------------------------------- + + qh_buildcone_onlygood( apex, goodhorizon ) + build cone of good, new facets from apex and its qh.newfacet_list to the horizon + goodhorizon is count of good, horizon facets from qh_find_horizon + + returns: + False if a f.good facet or a qh.GOODclosest facet is not found + updates qh.facet_list, qh.num_facets, qh.vertex_list, qh.num_vertices + + notes: + called from qh_buildcone + QH11030 FIX: Review effect of qh.GOODclosest on qh_buildcone_onlygood ('Qg'). qh_findgood preserves old value if didn't find a good facet. See qh_findgood_all for disabling + + design: + make hyperplanes for point + if qh_findgood fails to find a f.good facet or a qh.GOODclosest facet + delete cone of new facets + return NULL (ignores apex) + else + attach cone to horizon + match neighboring new facets +*/ +boolT qh_buildcone_onlygood(vertexT *apex, int goodhorizon) { + facetT *newfacet, *nextfacet; + + qh_makenewplanes(/* qh.newfacet_list */); + if(qh_findgood(qh newfacet_list, goodhorizon) == 0) { + if (!qh GOODclosest) { + for (newfacet=qh newfacet_list; newfacet && newfacet->next; newfacet= nextfacet) { + nextfacet= newfacet->next; + qh_delfacet(newfacet); + } + qh_delvertex(apex); + qh_resetlists(False /*no stats*/, qh_RESETvisible /* qh.visible_list newvertex_list qh.newfacet_list */); + zinc_(Znotgoodnew); + /* !good outside points dropped from hull */ + return False; + } + } + qh_attachnewfacets(/* qh.visible_list */); + qh_matchnewfacets(); /* ignore returned value. qh_forcedmerges will merge dupridges if any */ + qh_update_vertexneighbors_cone(); + return True; +} /* buildcone_onlygood */ + +/*--------------------------------- - qh_buildhull() + qh_buildhull( ) construct a convex hull by adding outside points one at a time returns: @@ -354,7 +579,7 @@ design: check visible facet and newfacet flags - check newlist vertex flags and qh.STOPcone/STOPpoint + check newfacet vertex flags and qh.STOPcone/STOPpoint for each facet with a furthest outside point add point to facet exit if qh.STOPcone or qh.STOPpoint requested @@ -376,7 +601,7 @@ } } FORALLvertices { - if (vertex->newlist) { + if (vertex->newfacet) { qh_fprintf(qh ferr, 6166, "qhull internal error (qh_buildhull): new vertex f%d in vertex list\n", vertex->id); qh_errprint("ERRONEOUS", NULL, NULL, NULL, vertex); @@ -393,11 +618,15 @@ qh facet_next= qh facet_list; /* advance facet when processed */ while ((furthest= qh_nextfurthest(&facet))) { qh num_outside--; /* if ONLYmax, furthest may not be outside */ + if (qh STOPadd>0 && (qh num_vertices - qh hull_dim - 1 >= qh STOPadd - 1)) { + trace1((qh ferr, 1059, "qh_buildhull: stop after adding %d vertices\n", qh STOPadd-1)); + return; + } if (!qh_addpoint(furthest, facet, qh ONLYmax)) break; } if (qh NARROWhull) /* move points from outsideset to coplanarset */ - qh_outcoplanar( /* facet_list */ ); + qh_outcoplanar(/* facet_list */ ); if (qh num_outside && !furthest) { qh_fprintf(qh ferr, 6167, "qhull internal error (qh_buildhull): %d outside points were never processed.\n", qh num_outside); qh_errexit(qh_ERRqhull, NULL, NULL); @@ -414,7 +643,7 @@ if !furthest, prints progress message returns: - tracks progress with qh.lastreport + tracks progress with qh.lastreport, lastcpu, lastfacets, lastmerges, lastplanes, lastdist updates qh.furthest_id (-3 if furthest is NULL) also resets visit_id, vertext_visit on wrap around @@ -434,7 +663,7 @@ */ void qh_buildtracing(pointT *furthest, facetT *facet) { realT dist= 0; - float cpu; + double cpu; int total, furthestid; time_t timedata; struct tm *tp; @@ -445,8 +674,8 @@ if (!furthest) { time(&timedata); tp= localtime(&timedata); - cpu= (float)qh_CPUclock - (float)qh hulltime; - cpu /= (float)qh_SECticks; + cpu= (double)qh_CPUclock - (double)qh hulltime; + cpu /= (double)qh_SECticks; total= zzval_(Ztotmerge) - zzval_(Zcyclehorizon) + zzval_(Zcyclefacettot); qh_fprintf(qh ferr, 8118, "\n\ At %02d:%02d:%02d & %2.5g CPU secs, qhull has created %d facets and merged %d.\n\ @@ -456,19 +685,22 @@ return; } furthestid= qh_pointid(furthest); +#ifndef qh_NOtrace if (qh TRACEpoint == furthestid) { + trace1((qh ferr, 1053, "qh_buildtracing: start trace T%d for point TP%d above facet f%d\n", qh TRACElevel, furthestid, facet->id)); qh IStracing= qh TRACElevel; qhmem.IStracing= qh TRACElevel; - }else if (qh TRACEpoint != qh_IDunknown && qh TRACEdist < REALmax/2) { + }else if (qh TRACEpoint != qh_IDnone && qh TRACEdist < REALmax/2) { qh IStracing= 0; qhmem.IStracing= 0; } - if (qh REPORTfreq && (qh facet_id-1 > qh lastreport+qh REPORTfreq)) { +#endif + if (qh REPORTfreq && (qh facet_id-1 > qh lastreport + (unsigned int)qh REPORTfreq)) { qh lastreport= qh facet_id-1; time(&timedata); tp= localtime(&timedata); - cpu= (float)qh_CPUclock - (float)qh hulltime; - cpu /= (float)qh_SECticks; + cpu= (double)qh_CPUclock - (double)qh hulltime; + cpu /= (double)qh_SECticks; total= zzval_(Ztotmerge) - zzval_(Zcyclehorizon) + zzval_(Zcyclefacettot); zinc_(Zdistio); qh_distplane(furthest, facet, &dist); @@ -480,23 +712,36 @@ total, qh num_facets, qh num_vertices, qh num_outside+1, furthestid, qh vertex_id, dist, getid_(facet)); }else if (qh IStracing >=1) { - cpu= (float)qh_CPUclock - (float)qh hulltime; - cpu /= (float)qh_SECticks; + cpu= (double)qh_CPUclock - (double)qh hulltime; + cpu /= (double)qh_SECticks; qh_distplane(furthest, facet, &dist); - qh_fprintf(qh ferr, 8120, "qh_addpoint: add p%d(v%d) to hull of %d facets(%2.2g above f%d) and %d outside at %4.4g CPU secs. Previous was p%d.\n", - furthestid, qh vertex_id, qh num_facets, dist, - getid_(facet), qh num_outside+1, cpu, qh furthest_id); + qh_fprintf(qh ferr, 1049, "qh_addpoint: add p%d(v%d) %2.2g above f%d to hull of %d facets, %d merges, %d outside at %4.4g CPU secs. Previous p%d(v%d) delta %4.4g CPU, %d facets, %d merges, %d hyperplanes, %d distplanes, %d retries\n", + furthestid, qh vertex_id, dist, getid_(facet), qh num_facets, zzval_(Ztotmerge), qh num_outside+1, cpu, qh furthest_id, qh vertex_id - 1, + cpu - qh lastcpu, qh num_facets - qh lastfacets, zzval_(Ztotmerge) - qh lastmerges, zzval_(Zsetplane) - qh lastplanes, zzval_(Zdistplane) - qh lastdist, qh retry_addpoint); + qh lastcpu= cpu; + qh lastfacets= qh num_facets; + qh lastmerges= zzval_(Ztotmerge); + qh lastplanes= zzval_(Zsetplane); + qh lastdist= zzval_(Zdistplane); } zmax_(Zvisit2max, (int)qh visit_id/2); - if (qh visit_id > (unsigned) INT_MAX) { /* 31 bits */ + if (qh visit_id > (unsigned int) INT_MAX) { /* 31 bits */ zinc_(Zvisit); + if (!qh_checklists(qh facet_list)) { + qh_fprintf(qh ferr, 6370, "qhull internal error: qh_checklists failed on reset of qh.visit_id %u\n", qh visit_id); + qh_errexit(qh_ERRqhull, NULL, NULL); + } qh visit_id= 0; FORALLfacets facet->visitid= 0; } zmax_(Zvvisit2max, (int)qh vertex_visit/2); - if (qh vertex_visit > (unsigned) INT_MAX) { /* 31 bits */ + if (qh vertex_visit > (unsigned int) INT_MAX) { /* 31 bits */ zinc_(Zvvisit); + if (qh visit_id && !qh_checklists(qh facet_list)) { + qh_fprintf(qh ferr, 6371, "qhull internal error: qh_checklists failed on reset of qh.vertex_visit %u\n", qh vertex_visit); + qh_errexit(qh_ERRqhull, NULL, NULL); + } qh vertex_visit= 0; FORALLvertices vertex->visitid= 0; @@ -519,7 +764,9 @@ normally use qh_errexit() in user.c(reports a facet and a ridge) */ void qh_errexit2(int exitcode, facetT *facet, facetT *otherfacet) { - + qh tracefacet= NULL; /* avoid infinite recursion through qh_fprintf */ + qh traceridge= NULL; + qh tracevertex= NULL; qh_errprint("ERRONEOUS", facet, otherfacet, NULL, NULL); qh_errexit(exitcode, NULL, NULL); } /* errexit2 */ @@ -558,7 +805,7 @@ int numhorizon= 0, coplanar= 0; realT dist; - trace1((qh ferr, 1040,"qh_findhorizon: find horizon for point p%d facet f%d\n",qh_pointid(point),facet->id)); + trace1((qh ferr, 1040, "qh_findhorizon: find horizon for point p%d facet f%d\n",qh_pointid(point),facet->id)); *goodvisible= *goodhorizon= 0; zinc_(Ztotvisible); qh_removefacet(facet); /* visible_list at end of qh facet_list */ @@ -574,7 +821,11 @@ qh visit_id++; FORALLvisible_facets { if (visible->tricoplanar && !qh TRInormals) { - qh_fprintf(qh ferr, 6230, "Qhull internal error (qh_findhorizon): does not work for tricoplanar facets. Use option 'Q11'\n"); + qh_fprintf(qh ferr, 6230, "qhull internal error (qh_findhorizon): does not work for tricoplanar facets. Use option 'Q11'\n"); + qh_errexit(qh_ERRqhull, visible, NULL); + } + if (qh_setsize(visible->neighbors) == 0) { + qh_fprintf(qh ferr, 6295, "qhull internal error (qh_findhorizon): visible facet f%d does not have neighbors\n", visible->id); qh_errexit(qh_ERRqhull, visible, NULL); } visible->visitid= qh visit_id; @@ -596,10 +847,10 @@ if (qh IStracing >=4) qh_errprint("visible", neighbor, NULL, NULL, NULL); }else { - if (dist > - qh MAXcoplanar) { - neighbor->coplanar= True; + if (dist >= -qh MAXcoplanar) { + neighbor->coplanarhorizon= True; zzinc_(Zcoplanarhorizon); - qh_precision("coplanar horizon"); + qh_joggle_restart("coplanar horizon"); coplanar++; if (qh MERGING) { if (dist > 0) { @@ -614,7 +865,7 @@ trace2((qh ferr, 2057, "qh_findhorizon: point p%d is coplanar to horizon f%d, dist=%2.7g < qh MINvisible(%2.7g)\n", qh_pointid(point), neighbor->id, dist, qh MINvisible)); }else - neighbor->coplanar= False; + neighbor->coplanarhorizon= False; zinc_(Ztothorizon); numhorizon++; if (neighbor->good) @@ -625,19 +876,37 @@ } } if (!numhorizon) { - qh_precision("empty horizon"); - qh_fprintf(qh ferr, 6168, "qhull precision error (qh_findhorizon): empty horizon\n\ -QhullPoint p%d was above all facets.\n", qh_pointid(point)); - qh_printfacetlist(qh facet_list, NULL, True); - qh_errexit(qh_ERRprec, NULL, NULL); + qh_joggle_restart("empty horizon"); + qh_fprintf(qh ferr, 6168, "qhull topology error (qh_findhorizon): empty horizon for p%d. It was above all facets.\n", qh_pointid(point)); + if (qh num_facets < 100) { + qh_printfacetlist(qh facet_list, NULL, True); + } + qh_errexit(qh_ERRtopology, NULL, NULL); } trace1((qh ferr, 1041, "qh_findhorizon: %d horizon facets(good %d), %d visible(good %d), %d coplanar\n", numhorizon, *goodhorizon, qh num_visible, *goodvisible, coplanar)); - if (qh IStracing >= 4 && qh num_facets < 50) + if (qh IStracing >= 4 && qh num_facets < 100) qh_printlists(); } /* findhorizon */ /*--------------------------------- + + qh_joggle_restart( reason ) + if joggle ('QJn') and not merging, restart on precision and topology errors +*/ +void qh_joggle_restart(const char *reason) { + + if (qh JOGGLEmax < REALmax/2) { + if (qh ALLOWrestart && !qh PREmerge && !qh MERGEexact) { + trace0((qh ferr, 26, "qh_joggle_restart: qhull restart because of %s\n", reason)); + /* May be called repeatedly if qh ALLOWrestart */ + longjmp(qh restartexit, qh_ERRprec); + } + } +} /* qh_joggle_restart */ + +/*--------------------------------- qh_nextfurthest( visible ) @@ -661,11 +930,17 @@ */ pointT *qh_nextfurthest(facetT **visible) { facetT *facet; - int size, idx; + int size, idx, loopcount= 0; realT randr, dist; pointT *furthest; while ((facet= qh facet_next) != qh facet_tail) { + if (!facet || loopcount++ > qh num_facets) { + qh_fprintf(qh ferr, 6406, "qhull internal error (qh_nextfurthest): null facet or infinite loop detected for qh.facet_next f%d facet_tail f%d\n", + getid_(facet), getid_(qh facet_tail)); + qh_printlists(); + qh_errexit2(qh_ERRqhull, facet, qh facet_tail); + } if (!facet->outsideset) { qh facet_next= facet->next; continue; @@ -679,7 +954,7 @@ if (qh NARROWhull) { if (facet->notfurthest) qh_furthestout(facet); - furthest= (pointT*)qh_setlast(facet->outsideset); + furthest= (pointT *)qh_setlast(facet->outsideset); #if qh_COMPUTEfurthest qh_distplane(furthest, facet, &dist); zinc_(Zcomputefurthest); @@ -697,21 +972,22 @@ facet= qh facet_next; } *visible= facet; - return((pointT*)qh_setdellast(facet->outsideset)); + return ((pointT *)qh_setdellast(facet->outsideset)); } if (qh RANDOMoutside) { - int outcoplanar = 0; + int outcoplanar= 0; if (qh NARROWhull) { FORALLfacets { if (facet == qh facet_next) break; if (facet->outsideset) - outcoplanar += qh_setsize( facet->outsideset); + outcoplanar += qh_setsize(facet->outsideset); } } randr= qh_RANDOMint; randr= randr/(qh_RANDOMmax+1); - idx= (int)floor((qh num_outside - outcoplanar) * randr); + randr= floor((qh num_outside - outcoplanar) * randr); + idx= (int)randr; FORALLfacet_(qh facet_next) { if (facet->outsideset) { SETreturnsize_(facet->outsideset, size); @@ -719,7 +995,7 @@ qh_setfree(&facet->outsideset); else if (size > idx) { *visible= facet; - return((pointT*)qh_setdelnth(facet->outsideset, idx)); + return ((pointT *)qh_setdelnth(facet->outsideset, idx)); }else idx -= size; } @@ -729,7 +1005,7 @@ qh_errexit(qh_ERRqhull, NULL, NULL); }else { /* VIRTUALmemory */ facet= qh facet_tail->previous; - if (!(furthest= (pointT*)qh_setdellast(facet->outsideset))) { + if (!(furthest= (pointT *)qh_setdellast(facet->outsideset))) { if (facet->outsideset) qh_setfree(&facet->outsideset); qh_removefacet(facet); @@ -841,7 +1117,7 @@ } } /* if !qh BESToutside, pointset contains points not assigned to outsideset */ - if (qh BESToutside || qh MERGING || qh KEEPcoplanar || qh KEEPinside) { + if (qh BESToutside || qh MERGING || qh KEEPcoplanar || qh KEEPinside || qh KEEPnearinside) { qh findbestnew= True; FOREACHpoint_i_(pointset) { if (point) @@ -860,18 +1136,19 @@ /*--------------------------------- - qh_partitioncoplanar( point, facet, dist ) + qh_partitioncoplanar( point, facet, dist, allnew ) partition coplanar point to a facet dist is distance from point to facet if dist NULL, searches for bestfacet and does nothing if inside - if qh.findbestnew set, + if allnew (qh.findbestnew) searches new facets instead of using qh_findbest() returns: qh.max_ouside updated if qh.KEEPcoplanar or qh.KEEPinside point assigned to best coplanarset + qh.repart_facetid==0 (for detecting infinite recursion via qh_partitionpoint) notes: facet->maxoutside is updated at end by qh_check_maxout @@ -893,16 +1170,18 @@ else update qh.max_outside */ -void qh_partitioncoplanar(pointT *point, facetT *facet, realT *dist) { +void qh_partitioncoplanar(pointT *point, facetT *facet, realT *dist, boolT allnew) { facetT *bestfacet; pointT *oldfurthest; - realT bestdist, dist2= 0, angle; - int numpart= 0, oldfindbest; - boolT isoutside; + realT bestdist, angle, nearest, dist2= 0.0; + int numpart= 0; + boolT isoutside, oldfindbest, repartition= False; + trace4((qh ferr, 4090, "qh_partitioncoplanar: partition coplanar point p%d starting with f%d dist? %2.2g, allnew? %d, gh.repart_facetid f%d\n", + qh_pointid(point), facet->id, (dist ? *dist : 0.0), allnew, qh repart_facetid)); qh WAScoplanar= True; if (!dist) { - if (qh findbestnew) + if (allnew) bestfacet= qh_findbestnew(point, facet, &bestdist, qh_ALL, &isoutside, &numpart); else bestfacet= qh_findbest(point, facet, qh_ALL, !qh_ISnewfacets, qh DELAUNAY, @@ -913,14 +1192,16 @@ if (qh KEEPnearinside) { if (bestdist < -qh NEARinside) { zinc_(Zcoplanarinside); - trace4((qh ferr, 4062, "qh_partitioncoplanar: point p%d is more than near-inside facet f%d dist %2.2g findbestnew %d\n", - qh_pointid(point), bestfacet->id, bestdist, qh findbestnew)); + trace4((qh ferr, 4062, "qh_partitioncoplanar: point p%d is more than near-inside facet f%d dist %2.2g allnew? %d\n", + qh_pointid(point), bestfacet->id, bestdist, allnew)); + qh repart_facetid= 0; return; } }else if (bestdist < -qh MAXcoplanar) { - trace4((qh ferr, 4063, "qh_partitioncoplanar: point p%d is inside facet f%d dist %2.2g findbestnew %d\n", - qh_pointid(point), bestfacet->id, bestdist, qh findbestnew)); + trace4((qh ferr, 4063, "qh_partitioncoplanar: point p%d is inside facet f%d dist %2.2g allnew? %d\n", + qh_pointid(point), bestfacet->id, bestdist, allnew)); zinc_(Zcoplanarinside); + qh repart_facetid= 0; return; } } @@ -928,32 +1209,72 @@ bestfacet= facet; bestdist= *dist; } + if(bestfacet->visible){ + qh_fprintf(qh ferr, 6405, "qhull internal error (qh_partitioncoplanar): cannot partition coplanar p%d of f%d into visible facet f%d\n", + qh_pointid(point), facet->id, bestfacet->id); + qh_errexit2(qh_ERRqhull, facet, bestfacet); + } if (bestdist > qh max_outside) { - if (!dist && facet != bestfacet) { + if (!dist && facet != bestfacet) { /* can't be recursive from qh_partitionpoint since facet != bestfacet */ zinc_(Zpartangle); angle= qh_getangle(facet->normal, bestfacet->normal); if (angle < 0) { + nearest= qh_vertex_bestdist(bestfacet->vertices); /* typically due to deleted vertex and coplanar facets, e.g., - RBOX 1000 s Z1 G1e-13 t1001185205 | QHULL Tv */ - zinc_(Zpartflip); - trace2((qh ferr, 2058, "qh_partitioncoplanar: repartition point p%d from f%d. It is above flipped facet f%d dist %2.2g\n", - qh_pointid(point), facet->id, bestfacet->id, bestdist)); - oldfindbest= qh findbestnew; - qh findbestnew= False; - qh_partitionpoint(point, bestfacet); - qh findbestnew= oldfindbest; - return; + RBOX 1000 s Z1 G1e-13 t1001185205 | QHULL Tv */ + zinc_(Zpartcorner); + trace2((qh ferr, 2058, "qh_partitioncoplanar: repartition coplanar point p%d from f%d as an outside point above corner facet f%d dist %2.2g with angle %2.2g\n", + qh_pointid(point), facet->id, bestfacet->id, bestdist, angle)); + repartition= True; + } + } + if (!repartition) { + if (bestdist > qh MAXoutside * qh_RATIOcoplanaroutside) { + nearest= qh_vertex_bestdist(bestfacet->vertices); + if (facet->id == bestfacet->id) { + if (facet->id == qh repart_facetid) { + qh_fprintf(qh ferr, 6404, "Qhull internal error (qh_partitioncoplanar): infinite loop due to recursive call to qh_partitionpoint. Repartition point p%d from f%d as a outside point dist %2.2g nearest vertices %2.2g\n", + qh_pointid(point), facet->id, bestdist, nearest); + qh_errexit(qh_ERRqhull, facet, NULL); + } + qh repart_facetid= facet->id; /* reset after call to qh_partitionpoint */ + } + if (point == qh coplanar_apex) { + /* otherwise may loop indefinitely, the point is well above a facet, yet near a vertex */ + qh_fprintf(qh ferr, 6425, "Qhull topology error (qh_partitioncoplanar): can not repartition coplanar point p%d from f%d as outside point above f%d. It previously failed to form a cone of facets, dist %2.2g, nearest vertices %2.2g\n", + qh_pointid(point), facet->id, bestfacet->id, bestdist, nearest); + qh_errexit(qh_ERRtopology, facet, NULL); + } + if (nearest < 2 * qh MAXoutside * qh_RATIOcoplanaroutside) { + zinc_(Zparttwisted); + qh_fprintf(qh ferr, 7085, "Qhull precision warning: repartition coplanar point p%d from f%d as an outside point above twisted facet f%d dist %2.2g nearest vertices %2.2g\n", + qh_pointid(point), facet->id, bestfacet->id, bestdist, nearest); + }else { + zinc_(Zparthidden); + qh_fprintf(qh ferr, 7086, "Qhull precision warning: repartition coplanar point p%d from f%d as an outside point above hidden facet f%d dist %2.2g nearest vertices %2.2g\n", + qh_pointid(point), facet->id, bestfacet->id, bestdist, nearest); + } + repartition= True; } } + if (repartition) { + oldfindbest= qh findbestnew; + qh findbestnew= False; + qh_partitionpoint(point, bestfacet); + qh findbestnew= oldfindbest; + qh repart_facetid= 0; + return; + } + qh repart_facetid= 0; qh max_outside= bestdist; - if (bestdist > qh TRACEdist) { - qh_fprintf(qh ferr, 8122, "qh_partitioncoplanar: ====== p%d from f%d increases max_outside to %2.2g of f%d last p%d\n", + if (bestdist > qh TRACEdist || qh IStracing >= 3) { + qh_fprintf(qh ferr, 3041, "qh_partitioncoplanar: == p%d from f%d increases qh.max_outside to %2.2g of f%d last p%d\n", qh_pointid(point), facet->id, bestdist, bestfacet->id, qh furthest_id); qh_errprint("DISTANT", facet, bestfacet, NULL, NULL); } } if (qh KEEPcoplanar + qh KEEPinside + qh KEEPnearinside) { - oldfurthest= (pointT*)qh_setlast(bestfacet->coplanarset); + oldfurthest= (pointT *)qh_setlast(bestfacet->coplanarset); if (oldfurthest) { zinc_(Zcomputefurthest); qh_distplane(oldfurthest, bestfacet, &dist2); @@ -963,7 +1284,7 @@ else qh_setappend2ndlast(&bestfacet->coplanarset, point); } - trace4((qh ferr, 4064, "qh_partitioncoplanar: point p%d is coplanar with facet f%d(or inside) dist %2.2g\n", + trace4((qh ferr, 4064, "qh_partitioncoplanar: point p%d is coplanar with facet f%d (or inside) dist %2.2g\n", qh_pointid(point), bestfacet->id, bestdist)); } /* partitioncoplanar */ @@ -1003,13 +1324,10 @@ partition as coplanar point into bestfacet */ void qh_partitionpoint(pointT *point, facetT *facet) { - realT bestdist; - boolT isoutside; + realT bestdist, previousdist; + boolT isoutside, isnewoutside= False; facetT *bestfacet; int numpart; -#if qh_COMPUTEfurthest - realT dist; -#endif if (qh findbestnew) bestfacet= qh_findbestnew(point, facet, &bestdist, qh BESToutside, &isoutside, &numpart); @@ -1018,9 +1336,14 @@ &bestdist, &isoutside, &numpart); zinc_(Ztotpartition); zzadd_(Zpartition, numpart); + if(bestfacet->visible){ + qh_fprintf(qh ferr, 6293, "qhull internal error (qh_partitionpoint): cannot partition p%d of f%d into visible facet f%d\n", + qh_pointid(point), facet->id, bestfacet->id); + qh_errexit2(qh_ERRqhull, facet, bestfacet); + } if (qh NARROWhull) { if (qh DELAUNAY && !isoutside && bestdist >= -qh MAXcoplanar) - qh_precision("nearly incident point(narrow hull)"); + qh_joggle_restart("nearly incident point (narrow hull)"); if (qh KEEPnearinside) { if (bestdist >= -qh NEARinside) isoutside= True; @@ -1030,53 +1353,67 @@ if (isoutside) { if (!bestfacet->outsideset - || !qh_setlast(bestfacet->outsideset)) { + || !qh_setlast(bestfacet->outsideset)) { /* empty outside set */ qh_setappend(&(bestfacet->outsideset), point); - if (!bestfacet->newfacet) { - qh_removefacet(bestfacet); /* make sure it's after qh facet_next */ - qh_appendfacet(bestfacet); - } + if (!qh NARROWhull || bestdist > qh MINoutside) + isnewoutside= True; #if !qh_COMPUTEfurthest bestfacet->furthestdist= bestdist; #endif }else { #if qh_COMPUTEfurthest zinc_(Zcomputefurthest); - qh_distplane(oldfurthest, bestfacet, &dist); - if (dist < bestdist) + qh_distplane(oldfurthest, bestfacet, &previousdist); + if (previousdist < bestdist) qh_setappend(&(bestfacet->outsideset), point); else qh_setappend2ndlast(&(bestfacet->outsideset), point); #else - if (bestfacet->furthestdist < bestdist) { + previousdist= bestfacet->furthestdist; + if (previousdist < bestdist) { qh_setappend(&(bestfacet->outsideset), point); bestfacet->furthestdist= bestdist; + if (qh NARROWhull && previousdist < qh MINoutside && bestdist >= qh MINoutside) + isnewoutside= True; }else qh_setappend2ndlast(&(bestfacet->outsideset), point); #endif } + if (isnewoutside && qh facet_next != bestfacet) { + if (bestfacet->newfacet) { + if (qh facet_next->newfacet) + qh facet_next= qh newfacet_list; /* make sure it's after qh.facet_next */ + }else { + qh_removefacet(bestfacet); /* make sure it's after qh.facet_next */ + qh_appendfacet(bestfacet); + if(qh newfacet_list){ + bestfacet->newfacet= True; + } + } + } qh num_outside++; - trace4((qh ferr, 4065, "qh_partitionpoint: point p%d is outside facet f%d new? %d (or narrowhull)\n", - qh_pointid(point), bestfacet->id, bestfacet->newfacet)); + trace4((qh ferr, 4065, "qh_partitionpoint: point p%d is outside facet f%d newfacet? %d, newoutside? %d (or narrowhull)\n", + qh_pointid(point), bestfacet->id, bestfacet->newfacet, isnewoutside)); }else if (qh DELAUNAY || bestdist >= -qh MAXcoplanar) { /* for 'd', bestdist skips upperDelaunay facets */ - zzinc_(Zcoplanarpart); if (qh DELAUNAY) - qh_precision("nearly incident point"); + qh_joggle_restart("nearly incident point"); + /* allow coplanar points with joggle, may be interior */ + zzinc_(Zcoplanarpart); if ((qh KEEPcoplanar + qh KEEPnearinside) || bestdist > qh max_outside) - qh_partitioncoplanar(point, bestfacet, &bestdist); + qh_partitioncoplanar(point, bestfacet, &bestdist, qh findbestnew); else { trace4((qh ferr, 4066, "qh_partitionpoint: point p%d is coplanar to facet f%d (dropped)\n", qh_pointid(point), bestfacet->id)); } - }else if (qh KEEPnearinside && bestdist > -qh NEARinside) { + }else if (qh KEEPnearinside && bestdist >= -qh NEARinside) { zinc_(Zpartnear); - qh_partitioncoplanar(point, bestfacet, &bestdist); + qh_partitioncoplanar(point, bestfacet, &bestdist, qh findbestnew); }else { zinc_(Zpartinside); trace4((qh ferr, 4067, "qh_partitionpoint: point p%d is inside all facets, closest to f%d dist %2.2g\n", qh_pointid(point), bestfacet->id, bestdist)); if (qh KEEPinside) - qh_partitioncoplanar(point, bestfacet, &bestdist); + qh_partitioncoplanar(point, bestfacet, &bestdist, qh findbestnew); } } /* partitionpoint */ @@ -1084,18 +1421,18 @@ >-------------------------------- qh_partitionvisible( allpoints, numoutside ) - partitions points in visible facets to qh.newfacet_list - qh.visible_list= visible facets - for visible facets - 1st neighbor (if any) points to a horizon facet or a new facet - if allpoints(!used), - repartitions coplanar points + partitions outside points in visible facets (qh.visible_list) to qh.newfacet_list + if keeping coplanar/near-inside/inside points + partitions coplanar points; repartitions if 'allpoints' (not used) + 1st neighbor (if any) of visible facets points to a horizon facet or a new facet returns: updates outside sets and coplanar sets of qh.newfacet_list updates qh.num_outside (count of outside points) + does not truncate f.outsideset, f.coplanarset, or qh.del_vertices (see qh_deletevisible) notes: + called by qh_qhull, qh_addpoint, and qh_all_vertexmerges qh.findbest_notsharp should be clear (extra work if set) design: @@ -1114,31 +1451,26 @@ else partition vertex into coplanar sets of new facets */ -void qh_partitionvisible(/*qh.visible_list*/ boolT allpoints, int *numoutside) { +void qh_partitionvisible(boolT allpoints, int *numoutside /* qh.visible_list */) { facetT *visible, *newfacet; pointT *point, **pointp; - int coplanar=0, size; - unsigned count; + int delsize, coplanar=0, size; vertexT *vertex, **vertexp; + trace3((qh ferr, 3042, "qh_partitionvisible: partition outside and coplanar points of visible and merged facets f%d into new facets f%d\n", + qh visible_list->id, qh newfacet_list->id)); if (qh ONLYmax) maximize_(qh MINoutside, qh max_vertex); *numoutside= 0; FORALLvisible_facets { if (!visible->outsideset && !visible->coplanarset) continue; - newfacet= visible->f.replace; - count= 0; - while (newfacet && newfacet->visible) { - newfacet= newfacet->f.replace; - if (count++ > qh facet_id) - qh_infiniteloop(visible); - } + newfacet= qh_getreplacement(visible); if (!newfacet) newfacet= qh newfacet_list; - if (newfacet == qh facet_tail) { - qh_fprintf(qh ferr, 6170, "qhull precision error (qh_partitionvisible): all new facets deleted as\n degenerate facets. Can not continue.\n"); - qh_errexit(qh_ERRprec, NULL, NULL); + if (!newfacet->next) { + qh_fprintf(qh ferr, 6170, "qhull topology error (qh_partitionvisible): all new facets deleted as\n degenerate facets. Can not continue.\n"); + qh_errexit(qh_ERRtopology, NULL, NULL); } if (visible->outsideset) { size= qh_setsize(visible->outsideset); @@ -1154,40 +1486,33 @@ if (allpoints) /* not used */ qh_partitionpoint(point, newfacet); else - qh_partitioncoplanar(point, newfacet, NULL); + qh_partitioncoplanar(point, newfacet, NULL, qh findbestnew); } } } - FOREACHvertex_(qh del_vertices) { - if (vertex->point) { - if (allpoints) /* not used */ - qh_partitionpoint(vertex->point, qh newfacet_list); - else - qh_partitioncoplanar(vertex->point, qh newfacet_list, NULL); + delsize= qh_setsize(qh del_vertices); + if (delsize > 0) { + trace3((qh ferr, 3049, "qh_partitionvisible: partition %d deleted vertices as coplanar? %d points into new facets f%d\n", + delsize, !allpoints, qh newfacet_list->id)); + FOREACHvertex_(qh del_vertices) { + if (vertex->point && !vertex->partitioned) { + if (!qh newfacet_list || qh newfacet_list == qh facet_tail) { + qh_fprintf(qh ferr, 6284, "qhull internal error (qh_partitionvisible): all new facets deleted or none defined. Can not partition deleted v%d.\n", vertex->id); + qh_errexit(qh_ERRqhull, NULL, NULL); + } + if (allpoints) /* not used */ + /* [apr'2019] infinite loop if vertex recreates the same facets from the same horizon + e.g., qh_partitionpoint if qh.DELAUNAY with qh.MERGEindependent for all mergetype, ../eg/qtest.sh t427764 '1000 s W1e-13 D3' 'd' */ + qh_partitionpoint(vertex->point, qh newfacet_list); + else + qh_partitioncoplanar(vertex->point, qh newfacet_list, NULL, qh_ALL); /* search all new facets */ + vertex->partitioned= True; + } } } - trace1((qh ferr, 1043,"qh_partitionvisible: partitioned %d points from outsidesets and %d points from coplanarsets\n", *numoutside, coplanar)); + trace1((qh ferr, 1043,"qh_partitionvisible: partitioned %d points from outsidesets, %d points from coplanarsets, and %d deleted vertices\n", *numoutside, coplanar, delsize)); } /* partitionvisible */ - - -/*--------------------------------- - - qh_precision( reason ) - restart on precision errors if not merging and if 'QJn' -*/ -void qh_precision(const char *reason) { - - if (qh ALLOWrestart && !qh PREmerge && !qh MERGEexact) { - if (qh JOGGLEmax < REALmax/2) { - trace0((qh ferr, 26, "qh_precision: qhull restart because of %s\n", reason)); - /* May be called repeatedly if qh->ALLOWrestart */ - longjmp(qh restartexit, qh_ERRprec); - } - } -} /* qh_precision */ - /*--------------------------------- @@ -1197,6 +1522,7 @@ notes: not in io.c so that user_eg.c can prevent io.c from loading qh_printsummary and qh_countfacets must match counts + updates qh.facet_visit to detect infinite loop design: determine number of points, vertices, and coplanar points @@ -1204,20 +1530,40 @@ */ void qh_printsummary(FILE *fp) { realT ratio, outerplane, innerplane; - float cpu; - int size, id, nummerged, numvertices, numcoplanars= 0, nonsimplicial=0; - int goodused; + double cpu; + int size, id, nummerged, numpinched, numvertices, numcoplanars= 0, nonsimplicial=0, numdelaunay= 0; facetT *facet; const char *s; int numdel= zzval_(Zdelvertextot); int numtricoplanars= 0; + boolT goodused; size= qh num_points + qh_setsize(qh other_points); numvertices= qh num_vertices - qh_setsize(qh del_vertices); id= qh_pointid(qh GOODpointp); + if (!qh_checklists(qh facet_list) && !qh ERREXITcalled) { + qh_fprintf(fp, 6372, "qhull internal error: qh_checklists failed at qh_printsummary\n"); + if (qh num_facets < 4000) + qh_printlists(); + qh_errexit(qh_ERRqhull, NULL, NULL); + } + if (qh DELAUNAY && qh ERREXITcalled) { + /* update f.good and determine qh.num_good as in qh_findgood_all */ + FORALLfacets { + if (facet->visible) + facet->good= False; /* will be deleted */ + else if (facet->good) { + if (facet->normal && !qh_inthresholds(facet->normal, NULL)) + facet->good= False; + else + numdelaunay++; + } + } + qh num_good= numdelaunay; + } FORALLfacets { if (facet->coplanarset) - numcoplanars += qh_setsize( facet->coplanarset); + numcoplanars += qh_setsize(facet->coplanarset); if (facet->good) { if (facet->simplicial) { if (facet->keepcentrum && facet->tricoplanar) @@ -1228,14 +1574,19 @@ } if (id >=0 && qh STOPcone-1 != id && -qh STOPpoint-1 != id) size--; - if (qh STOPcone || qh STOPpoint) - qh_fprintf(fp, 9288, "\nAt a premature exit due to 'TVn', 'TCn', 'TRn', or precision error with 'QJn'."); - if (qh UPPERdelaunay) - goodused= qh GOODvertex + qh GOODpoint + qh SPLITthresholds; - else if (qh DELAUNAY) - goodused= qh GOODvertex + qh GOODpoint + qh GOODthreshold; - else - goodused= qh num_good; + if (qh STOPadd || qh STOPcone || qh STOPpoint) + qh_fprintf(fp, 9288, "\nEarly exit due to 'TAn', 'TVn', 'TCn', 'TRn', or precision error with 'QJn'."); + goodused= False; + if (qh ERREXITcalled) + ; /* qh_findgood_all not called */ + else if (qh UPPERdelaunay) { + if (qh GOODvertex || qh GOODpoint || qh SPLITthresholds) + goodused= True; + }else if (qh DELAUNAY) { + if (qh GOODvertex || qh GOODpoint || qh GOODthreshold) + goodused= True; + }else if (qh num_good > 0 || qh GOODthreshold) + goodused= True; nummerged= zzval_(Ztotmerge) - zzval_(Zcyclehorizon) + zzval_(Zcyclefacettot); if (qh VORONOI) { if (qh UPPERdelaunay) @@ -1347,14 +1698,16 @@ #endif if (nummerged) { qh_fprintf(fp, 9330," Number of distance tests for merging: %d\n",zzval_(Zbestdist)+ - zzval_(Zcentrumtests)+zzval_(Zdistconvex)+zzval_(Zdistcheck)+ - zzval_(Zdistzero)); - qh_fprintf(fp, 9331," Number of distance tests for checking: %d\n",zzval_(Zcheckpart)); + zzval_(Zcentrumtests)+zzval_(Zvertextests)+zzval_(Zdistcheck)+zzval_(Zdistzero)); + qh_fprintf(fp, 9331," Number of distance tests for checking: %d\n",zzval_(Zcheckpart)+zzval_(Zdistconvex)); qh_fprintf(fp, 9332," Number of merged facets: %d\n", nummerged); } + numpinched= zzval_(Zpinchduplicate) + zzval_(Zpinchedvertex); + if (numpinched) + qh_fprintf(fp, 9375," Number of merged pinched vertices: %d\n", numpinched); if (!qh RANDOMoutside && qh QHULLfinished) { - cpu= (float)qh hulltime; - cpu /= (float)qh_SECticks; + cpu= (double)qh hulltime; + cpu /= (double)qh_SECticks; wval_(Wcpu)= cpu; qh_fprintf(fp, 9333, " CPU seconds to compute hull (after input): %2.4g\n", cpu); } @@ -1378,8 +1731,7 @@ if (qh MERGING) { qh_outerinner(NULL, &outerplane, &innerplane); if (outerplane > 2 * qh DISTround) { - qh_fprintf(fp, 9339, " Maximum distance of %spoint above facet: %2.2g", - (qh QHULLfinished ? "" : "merged "), outerplane); + qh_fprintf(fp, 9339, " Maximum distance of point above facet: %2.2g", outerplane); ratio= outerplane/(qh ONEmerge + qh DISTround); /* don't report ratio if MINoutside is large */ if (ratio > 0.05 && 2* qh ONEmerge > qh MINoutside && qh JOGGLEmax > REALmax/2) @@ -1388,8 +1740,7 @@ qh_fprintf(fp, 9341, "\n"); } if (innerplane < -2 * qh DISTround) { - qh_fprintf(fp, 9342, " Maximum distance of %svertex below facet: %2.2g", - (qh QHULLfinished ? "" : "merged "), innerplane); + qh_fprintf(fp, 9342, " Maximum distance of vertex below facet: %2.2g", innerplane); ratio= -innerplane/(qh ONEmerge+qh DISTround); if (ratio > 0.05 && qh JOGGLEmax > REALmax/2) qh_fprintf(fp, 9343, " (%.1fx)\n", ratio); diff -Nru qhull-2015.2/src/libqhull/libqhull.h qhull-2020.2/src/libqhull/libqhull.h --- qhull-2015.2/src/libqhull/libqhull.h 2016-01-18 21:59:53.000000000 +0000 +++ qhull-2020.2/src/libqhull/libqhull.h 2020-05-24 02:23:14.000000000 +0000 @@ -6,9 +6,9 @@ see qh-qhull.htm, qhull_a.h - Copyright (c) 1993-2015 The Geometry Center. - $Id: //main/2015/qhull/src/libqhull/libqhull.h#7 $$Change: 2066 $ - $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $ + Copyright (c) 1993-2020 The Geometry Center. + $Id: //main/2019/qhull/src/libqhull/libqhull.h#11 $$Change: 2958 $ + $DateTime: 2020/05/26 16:17:49 $$Author: bbarber $ NOTE: access to qh_qh is via the 'qh' macro. This allows qh_qh to be either a pointer or a structure. An example @@ -31,19 +31,20 @@ /*=========================== -included files ==============*/ -/* user_r.h first for QHULL_CRTDBG */ -#include "user.h" /* user definable constants (e.g., qh_QHpointer) */ +/* user.h first for QHULL_CRTDBG */ +#include "user.h" /* user definable constants (e.g., realT). */ -#include "mem.h" /* Needed qhT in libqhull_r.h. Here for compatibility */ +#include "mem.h" /* Needed for qhT in libqhull_r.h. Here for compatibility */ #include "qset.h" /* Needed for QHULL_LIB_CHECK */ -/* include stat_r.h after defining boolT. Needed for qhT in libqhull_r.h. Here for compatibility and statT */ +/* include stat.h after defining boolT. Needed for qhT in libqhull_r.h. Here for compatibility */ #include #include +#include #include #include -#if __MWERKS__ && __POWERPC__ +#if defined(__MWERKS__) && defined(__POWERPC__) #include #include #include @@ -51,7 +52,7 @@ #ifndef __STDC__ #ifndef __cplusplus -#if !_MSC_VER +#if !defined(_MSC_VER) #error Neither __STDC__ nor __cplusplus is defined. Please use strict ANSI C or C++ to compile #error Qhull. You may need to turn off compiler extensions in your project configuration. If #error your compiler is a standard C compiler, you can delete this warning from libqhull.h @@ -96,7 +97,7 @@ #define pointT coordT typedef enum { - qh_IDnone = -3, qh_IDinterior = -2, qh_IDunknown = -1 + qh_IDnone= -3, qh_IDinterior= -2, qh_IDunknown= -1 } qh_pointT; @@ -130,7 +131,7 @@ #define qh_False 0 #define qh_True 1 -#include "stat.h" /* after define of boolT */ +#include "stat.h" /* needs boolT */ /*---------------------------------- @@ -140,7 +141,7 @@ */ typedef enum { - qh_ASnone = 0, /* If not MERGING and not VORONOI */ + qh_ASnone= 0, /* If not MERGING and not VORONOI */ qh_ASvoronoi, /* Set by qh_clearcenters on qh_prepare_output, or if not MERGING and VORONOI */ qh_AScentrum /* If MERGING (assumed during merging) */ } @@ -178,24 +179,28 @@ argument flag for selecting everything */ #define qh_ALL True -#define qh_NOupper True /* argument for qh_findbest */ -#define qh_IScheckmax True /* argument for qh_findbesthorizon */ -#define qh_ISnewfacets True /* argument for qh_findbest */ -#define qh_RESETvisible True /* argument for qh_resetlists */ +#define qh_NOupper True /* argument for qh_findbest */ +#define qh_IScheckmax True /* argument for qh_findbesthorizon */ +#define qh_ISnewfacets True /* argument for qh_findbest */ +#define qh_RESETvisible True /* argument for qh_resetlists */ /*---------------------------------- - qh_ERR - Qhull exit codes, for indicating errors - See: MSG_ERROR and MSG_WARNING [user.h] + qh_ERR... + Qhull exit status codes, for indicating errors + See: MSG_ERROR (6000) and MSG_WARNING (7000) [user.h] */ #define qh_ERRnone 0 /* no error occurred during qhull */ #define qh_ERRinput 1 /* input inconsistency */ -#define qh_ERRsingular 2 /* singular input data */ -#define qh_ERRprec 3 /* precision error */ +#define qh_ERRsingular 2 /* singular input data, calls qh_printhelp_singular */ +#define qh_ERRprec 3 /* precision error, calls qh_printhelp_degenerate */ #define qh_ERRmem 4 /* insufficient memory, matches mem.h */ -#define qh_ERRqhull 5 /* internal error detected, matches mem.h */ +#define qh_ERRqhull 5 /* internal error detected, matches mem.h, calls qh_printhelp_internal */ +#define qh_ERRother 6 /* other error detected */ +#define qh_ERRtopology 7 /* topology error, maybe due to nearly adjacent vertices, calls qh_printhelp_topology */ +#define qh_ERRwide 8 /* wide facet error, maybe due to nearly adjacent vertices, calls qh_printhelp_wide */ +#define qh_ERRdebug 9 /* qh_errexit from debugging code */ /*---------------------------------- @@ -204,23 +209,24 @@ Fake stderr to distinguish error output from normal output For C++ interface. Must redefine qh_fprintf_qhull */ -#define qh_FILEstderr ((FILE*)1) +#define qh_FILEstderr ((FILE *)1) /* ============ -structures- ==================== each of the following structures is defined by a typedef all realT and coordT fields occur at the beginning of a structure (otherwise space may be wasted due to alignment) define all flags together and pack into 32-bit number - DEFsetT is likewise defined in - mem.h and qset.h + + DEFsetT is likewise defined in mem.h and qset.h */ typedef struct vertexT vertexT; typedef struct ridgeT ridgeT; typedef struct facetT facetT; +typedef struct qhT qhT; #ifndef DEFsetT #define DEFsetT 1 -typedef struct setT setT; /* defined in qset.h */ +typedef struct setT setT; /* defined in qset.h */ #endif /*-isarea */ - facetT *replace; /* replacement facet if ->visible and NEWfacets - is NULL only if qh_mergedegen_redundant or interior */ - facetT *samecycle; /* cycle of facets from the same visible/horizon intersection, + realT area; /* area of facet, only in io.c if f.isarea */ + facetT *replace; /* replacement facet for qh.NEWfacets with f.visible + NULL if qh_mergedegen_redundant, interior, or !NEWfacets */ + facetT *samecycle; /* cycle of facets from the same visible/horizon intersection, if ->newfacet */ facetT *newcycle; /* in horizon facet, current samecycle of new facets */ facetT *trivisible; /* visible facet for ->tricoplanar facets during qh_triangulate() */ @@ -290,34 +297,42 @@ /* qh_ASvoronoi: Voronoi center (qh_facetcenter) */ /* after constructing the hull, it may be changed (qh_clearcenter) */ /* if tricoplanar and !keepcentrum, shared with a neighbor */ - facetT *previous; /* previous facet in the facet_list */ - facetT *next; /* next facet in the facet_list */ + facetT *previous; /* previous facet in the facet_list or NULL, for C++ interface */ + facetT *next; /* next facet in the facet_list or facet_tail */ setT *vertices; /* vertices for this facet, inverse sorted by ID - if simplicial, 1st vertex was apex/furthest */ - setT *ridges; /* explicit ridges for nonsimplicial facets. - for simplicial facets, neighbors define the ridges */ - setT *neighbors; /* neighbors of the facet. If simplicial, the kth - neighbor is opposite the kth vertex, and the first - neighbor is the horizon facet for the first vertex*/ + if simplicial, 1st vertex was apex/furthest + qh_reduce_vertices removes extraneous vertices via qh_remove_extravertices + if f.visible, vertices may be on qh.del_vertices */ + setT *ridges; /* explicit ridges for nonsimplicial facets or nonsimplicial neighbors. + For simplicial facets, neighbors define the ridges + qh_makeridges() converts simplicial facets by creating ridges prior to merging + If qh.NEWtentative, new facets have horizon ridge, but not vice versa + if f.visible && qh.NEWfacets, ridges is empty */ + setT *neighbors; /* neighbors of the facet. Neighbors may be f.visible + If simplicial, the kth neighbor is opposite the kth vertex and the + first neighbor is the horizon facet for the first vertex. + dupridges marked by qh_DUPLICATEridge (0x01) and qh_MERGEridge (0x02) + if f.visible && qh.NEWfacets, neighbors is empty */ setT *outsideset; /* set of points outside this facet if non-empty, last point is furthest - if NARROWhull, includes coplanars for partitioning*/ + if NARROWhull, includes coplanars (less than qh.MINoutside) for partitioning*/ setT *coplanarset; /* set of points coplanar with this facet - > qh.min_vertex and <= facet->max_outside + >= qh.min_vertex and <= facet->max_outside a point is assigned to the furthest facet if non-empty, last point is furthest away */ - unsigned visitid; /* visit_id, for visiting all neighbors, + unsigned int visitid; /* visit_id, for visiting all neighbors, all uses are independent */ - unsigned id; /* unique identifier from qh.facet_id */ - unsigned nummerge:9; /* number of merges */ -#define qh_MAXnummerge 511 /* 2^9-1, 32 flags total, see "flags:" in io.c */ + unsigned int id; /* unique identifier from qh.facet_id, 1..qh.facet_id, 0 is sentinel, printed as 'f%d' */ + unsigned int nummerge:9; /* number of merges */ +#define qh_MAXnummerge 511 /* 2^9-1 */ + /* 23 flags (at most 23 due to nummerge), printed by "flags:" in io.c */ flagT tricoplanar:1; /* True if TRIangulate and simplicial and coplanar with a neighbor */ /* all tricoplanars share the same apex */ /* all tricoplanars share the same ->center, ->normal, ->offset, ->maxoutside */ /* ->keepcentrum is true for the owner. It has the ->coplanareset */ /* if ->degenerate, does not span facet (one logical ridge) */ /* during qh_triangulate, f.trivisible points to original facet */ - flagT newfacet:1; /* True if facet on qh.newfacet_list (new or merged) */ + flagT newfacet:1; /* True if facet on qh.newfacet_list (new/qh.first_newfacet or merged) */ flagT visible:1; /* True if visible facet (will be deleted) */ flagT toporient:1; /* True if created with top orientation after merging, use ridge orientation */ @@ -326,25 +341,29 @@ flagT seen2:1; /* used to perform operations only once, like visitid */ flagT flipped:1; /* True if facet is flipped */ flagT upperdelaunay:1; /* True if facet is upper envelope of Delaunay triangulation */ - flagT notfurthest:1; /* True if last point of outsideset is not furthest*/ + flagT notfurthest:1; /* True if last point of outsideset is not furthest */ /*-------- flags primarily for output ---------*/ flagT good:1; /* True if a facet marked good for output */ flagT isarea:1; /* True if facet->f.area is defined */ /*-------- flags for merging ------------------*/ - flagT dupridge:1; /* True if duplicate ridge in facet */ - flagT mergeridge:1; /* True if facet or neighbor contains a qh_MERGEridge - ->normal defined (also defined for mergeridge2) */ - flagT mergeridge2:1; /* True if neighbor contains a qh_MERGEridge (mark_dupridges */ - flagT coplanar:1; /* True if horizon facet is coplanar at last use */ - flagT mergehorizon:1; /* True if will merge into horizon (->coplanar) */ + flagT dupridge:1; /* True if facet has one or more dupridge in a new facet (qh_matchneighbor), + a dupridge has a subridge shared by more than one new facet */ + flagT mergeridge:1; /* True if facet or neighbor has a qh_MERGEridge (qh_mark_dupridges) + ->normal defined for mergeridge and mergeridge2 */ + flagT mergeridge2:1; /* True if neighbor has a qh_MERGEridge (qh_mark_dupridges) */ + flagT coplanarhorizon:1; /* True if horizon facet is coplanar at last use */ + flagT mergehorizon:1; /* True if will merge into horizon (its first neighbor w/ f.coplanarhorizon). */ flagT cycledone:1;/* True if mergecycle_all already done */ flagT tested:1; /* True if facet convexity has been tested (false after merge */ - flagT keepcentrum:1; /* True if keep old centrum after a merge, or marks owner for ->tricoplanar */ + flagT keepcentrum:1; /* True if keep old centrum after a merge, or marks owner for ->tricoplanar + Set by qh_updatetested if more than qh_MAXnewcentrum extra vertices + Set by qh_mergefacet if |maxdist| > qh.WIDEfacet */ flagT newmerge:1; /* True if facet is newly merged for reducevertices */ flagT degenerate:1; /* True if facet is degenerate (degen_mergeset or ->tricoplanar) */ - flagT redundant:1; /* True if facet is redundant (degen_mergeset) */ + flagT redundant:1; /* True if facet is redundant (degen_mergeset) + Maybe merge degenerate and redundant to gain another flag */ }; @@ -371,13 +390,21 @@ struct ridgeT { setT *vertices; /* vertices belonging to this ridge, inverse sorted by ID NULL if a degen ridge (matchsame) */ - facetT *top; /* top facet this ridge is part of */ - facetT *bottom; /* bottom facet this ridge is part of */ - unsigned id; /* unique identifier. Same size as vertex_id and ridge_id */ + facetT *top; /* top facet for this ridge */ + facetT *bottom; /* bottom facet for this ridge + ridge oriented by odd/even vertex order and top/bottom */ + unsigned int id; /* unique identifier. Same size as vertex_id, printed as 'r%d' */ flagT seen:1; /* used to perform operations only once */ - flagT tested:1; /* True when ridge is tested for convexity */ + flagT tested:1; /* True when ridge is tested for convexity by centrum or opposite vertices */ flagT nonconvex:1; /* True if getmergeset detected a non-convex neighbor only one ridge between neighbors may have nonconvex */ + flagT mergevertex:1; /* True if pending qh_appendvertexmerge due to + qh_maybe_duplicateridge or qh_maybe_duplicateridges + disables check for duplicate vertices in qh_checkfacet */ + flagT mergevertex2:1; /* True if qh_drop_mergevertex of MRGvertices, printed but not used */ + flagT simplicialtop:1; /* True if top was simplicial (original vertices) */ + flagT simplicialbot:1; /* True if bottom was simplicial (original vertices) + use qh_test_centrum_merge if top and bot, need to retest since centrum may change */ }; /*---------------------------------- - qh - all global variables for qhull are in qh, qhmem, and qhstat + qhT + All global variables for qhull are in qhT, qhmemT, and qhstatT notes: qhmem is defined in mem.h, qhstat is defined in stat.h, qhrbox is defined in rboxpoints.h @@ -430,15 +464,15 @@ QHULL_LIB_CHECK checks that a program and the corresponding qhull library were built with the same type of header files. -*/ -typedef struct qhT qhT; + QHULL_LIB_TYPE is QHULL_NON_REENTRANT, QHULL_QH_POINTER, or QHULL_REENTRANT +*/ #define QHULL_NON_REENTRANT 0 #define QHULL_QH_POINTER 1 #define QHULL_REENTRANT 2 -#if qh_QHpointer_dllimport +#ifdef qh_QHpointer_dllimport #define qh qh_qh-> __declspec(dllimport) extern qhT *qh_qh; /* allocated in global.c */ #define QHULL_LIB_TYPE QHULL_QH_POINTER @@ -448,7 +482,7 @@ extern qhT *qh_qh; /* allocated in global.c */ #define QHULL_LIB_TYPE QHULL_QH_POINTER -#elif qh_dllimport +#elif defined(qh_dllimport) #define qh qh_qh. __declspec(dllimport) extern qhT qh_qh; /* allocated in global.c */ #define QHULL_LIB_TYPE QHULL_NON_REENTRANT @@ -475,9 +509,12 @@ copied into qh by qh_setflags(). qh-quick.htm#options defines the flags. */ boolT ALLpoints; /* true 'Qs' if search all points for initial simplex */ - boolT ANGLEmerge; /* true 'Qa' if sort potential merges by angle */ + boolT ALLOWshort; /* true 'Qa' allow input with fewer or more points than coordinates */ + boolT ALLOWwarning; /* true 'Qw' if allow option warnings */ + boolT ALLOWwide; /* true 'Q12' if allow wide facets and wide dupridges, c.f. qh_WIDEmaxoutside */ + boolT ANGLEmerge; /* true 'Q1' if sort potential merges by type/angle instead of type/distance */ boolT APPROXhull; /* true 'Wn' if MINoutside set */ - realT MINoutside; /* 'Wn' min. distance for an outside point */ + realT MINoutside; /* Minimum distance for an outside point ('Wn' or 2*qh.MINvisible) */ boolT ANNOTATEoutput; /* true 'Ta' if annotate output with message codes */ boolT ATinfinity; /* true 'Qz' if point num_points-1 is "at-infinity" for improving precision in Delaunay triangulations */ @@ -485,22 +522,25 @@ boolT BESToutside; /* true 'Qf' if partition points into best outsideset */ boolT CDDinput; /* true 'Pc' if input uses CDD format (1.0/offset first) */ boolT CDDoutput; /* true 'PC' if print normals in CDD format (offset first) */ + boolT CHECKduplicates; /* true 'Q15' if qh_maybe_duplicateridges after each qh_mergefacet */ boolT CHECKfrequently; /* true 'Tc' if checking frequently */ realT premerge_cos; /* 'A-n' cos_max when pre merging */ realT postmerge_cos; /* 'An' cos_max when post merging */ - boolT DELAUNAY; /* true 'd' if computing DELAUNAY triangulation */ + boolT DELAUNAY; /* true 'd' or 'v' if computing DELAUNAY triangulation */ boolT DOintersections; /* true 'Gh' if print hyperplane intersections */ int DROPdim; /* drops dim 'GDn' for 4-d -> 3-d output */ + boolT FLUSHprint; /* true 'Tf' if flush after qh_fprintf for segfaults */ boolT FORCEoutput; /* true 'Po' if forcing output despite degeneracies */ - int GOODpoint; /* 1+n for 'QGn', good facet if visible/not(-) from point n*/ + int GOODpoint; /* 'QGn' or 'QG-n' (n+1, n-1), good facet if visible from point n (or not) */ pointT *GOODpointp; /* the actual point */ - boolT GOODthreshold; /* true if qh.lower_threshold/upper_threshold defined + boolT GOODthreshold; /* true 'Pd/PD' if qh.lower_threshold/upper_threshold defined + set if qh.UPPERdelaunay (qh_initbuild) false if qh.SPLITthreshold */ - int GOODvertex; /* 1+n, good facet if vertex for point n */ + int GOODvertex; /* 'QVn' or 'QV-n' (n+1, n-1), good facet if vertex for point n (or not) */ pointT *GOODvertexp; /* the actual point */ boolT HALFspace; /* true 'Hn,n,n' if halfspace intersection */ boolT ISqhullQh; /* Set by Qhull.cpp on initialization */ - int IStracing; /* trace execution, 0=none, 1=least, 4=most, -1=events */ + int IStracing; /* 'Tn' trace execution, 0=none, 1=least, 4=most, -1=events */ int KEEParea; /* 'PAn' number of largest facets to keep */ boolT KEEPcoplanar; /* true 'Qc' if keeping nearest facet for coplanar points */ boolT KEEPinside; /* true 'Qi' if keeping nearest facet for inside points @@ -508,28 +548,31 @@ int KEEPmerge; /* 'PMn' number of facets to keep with most merges */ realT KEEPminArea; /* 'PFn' minimum facet area to keep */ realT MAXcoplanar; /* 'Un' max distance below a facet to be coplanar*/ - boolT MERGEexact; /* true 'Qx' if exact merges (coplanar, degen, dupridge, flipped) */ - boolT MERGEindependent; /* true 'Q2' if merging independent sets */ + int MAXwide; /* 'QWn' max ratio for wide facet, otherwise error unless Q12-allow-wide */ + boolT MERGEexact; /* true 'Qx' if exact merges (concave, degen, dupridge, flipped) + tested by qh_checkzero and qh_test_*_merge */ + boolT MERGEindependent; /* true if merging independent sets of coplanar facets. 'Q2' disables */ boolT MERGING; /* true if exact-, pre- or post-merging, with angle and centrum tests */ realT premerge_centrum; /* 'C-n' centrum_radius when pre merging. Default is round-off */ realT postmerge_centrum; /* 'Cn' centrum_radius when post merging. Default is round-off */ - boolT MERGEvertices; /* true 'Q3' if merging redundant vertices */ + boolT MERGEpinched; /* true 'Q14' if merging pinched vertices due to dupridge */ + boolT MERGEvertices; /* true if merging redundant vertices, 'Q3' disables or qh.hull_dim > qh_DIMmergeVertex */ realT MINvisible; /* 'Vn' min. distance for a facet to be visible */ boolT NOnarrow; /* true 'Q10' if no special processing for narrow distributions */ - boolT NOnearinside; /* true 'Q8' if ignore near-inside points when partitioning */ + boolT NOnearinside; /* true 'Q8' if ignore near-inside points when partitioning, qh_check_points may fail */ boolT NOpremerge; /* true 'Q0' if no defaults for C-0 or Qx */ - boolT NOwide; /* true 'Q12' if no error on wide merge due to duplicate ridge */ boolT ONLYgood; /* true 'Qg' if process points with good visible or horizon facets */ boolT ONLYmax; /* true 'Qm' if only process points that increase max_outside */ boolT PICKfurthest; /* true 'Q9' if process furthest of furthest points*/ - boolT POSTmerge; /* true if merging after buildhull (Cn or An) */ - boolT PREmerge; /* true if merging during buildhull (C-n or A-n) */ + boolT POSTmerge; /* true if merging after buildhull ('Cn' or 'An') */ + boolT PREmerge; /* true if merging during buildhull ('C-n' or 'A-n') */ /* NOTE: some of these names are similar to qh_PRINT names */ boolT PRINTcentrums; /* true 'Gc' if printing centrums */ boolT PRINTcoplanar; /* true 'Gp' if printing coplanar points */ int PRINTdim; /* print dimension for Geomview output */ boolT PRINTdots; /* true 'Ga' if printing all points as dots */ - boolT PRINTgood; /* true 'Pg' if printing good facets */ + boolT PRINTgood; /* true 'Pg' if printing good facets + PGood set if 'd', 'PAn', 'PFn', 'PMn', 'QGn', 'QG-n', 'QVn', or 'QV-n' */ boolT PRINTinner; /* true 'Gi' if printing inner planes */ boolT PRINTneighbors; /* true 'PG' if printing neighbors of good facets */ boolT PRINTnoplanes; /* true 'Gn' if printing no planes */ @@ -545,23 +588,25 @@ boolT PROJECTdelaunay; /* true if DELAUNAY, no readpoints() and need projectinput() for Delaunay in qh_init_B */ int PROJECTinput; /* number of projected dimensions 'bn:0Bn:0' */ - boolT QUICKhelp; /* true if quick help message for degen input */ - boolT RANDOMdist; /* true if randomly change distplane and setfacetplane */ + boolT RANDOMdist; /* true 'Rn' if randomly change distplane and setfacetplane */ realT RANDOMfactor; /* maximum random perturbation */ realT RANDOMa; /* qh_randomfactor is randr * RANDOMa + RANDOMb */ realT RANDOMb; - boolT RANDOMoutside; /* true if select a random outside point */ - int REPORTfreq; /* buildtracing reports every n facets */ + boolT RANDOMoutside; /* true 'Qr' if select a random outside point */ + int REPORTfreq; /* 'TFn' buildtracing reports every n facets */ int REPORTfreq2; /* tracemerging reports every REPORTfreq/2 facets */ int RERUN; /* 'TRn' rerun qhull n times (qh.build_cnt) */ - int ROTATErandom; /* 'QRn' seed, 0 time, >= rotate input */ + int ROTATErandom; /* 'QRn' n<-1 random seed, n==-1 time is seed, n==0 random rotation by time, n>0 rotate input */ boolT SCALEinput; /* true 'Qbk' if scaling input */ boolT SCALElast; /* true 'Qbb' if scale last coord to max prev coord */ - boolT SETroundoff; /* true 'E' if qh.DISTround is predefined */ - boolT SKIPcheckmax; /* true 'Q5' if skip qh_check_maxout */ + boolT SETroundoff; /* true 'En' if qh.DISTround is predefined */ + boolT SKIPcheckmax; /* true 'Q5' if skip qh_check_maxout, qh_check_points may fail */ boolT SKIPconvex; /* true 'Q6' if skip convexity testing during pre-merge */ - boolT SPLITthresholds; /* true if upper_/lower_threshold defines a region + boolT SPLITthresholds; /* true 'Pd/PD' if upper_/lower_threshold defines a region + else qh.GOODthresholds + set if qh.DELAUNAY (qh_initbuild) used only for printing (!for qh.ONLYgood) */ + int STOPadd; /* 'TAn' 1+n for stop after adding n vertices */ int STOPcone; /* 'TCn' 1+n for stopping after cone for point n */ /* also used by qh_build_withresart for err exit*/ int STOPpoint; /* 'TVn' 'TV-n' 1+n for stopping after/before(-) @@ -570,7 +615,7 @@ boolT TESTvneighbors; /* true 'Qv' if test vertex neighbors at end */ int TRACElevel; /* 'Tn' conditional IStracing level */ int TRACElastrun; /* qh.TRACElevel applies to last qh.RERUN */ - int TRACEpoint; /* 'TPn' start tracing when point n is a vertex */ + int TRACEpoint; /* 'TPn' start tracing when point n is a vertex, use qh_IDunknown (-1) after qh_buildhull and qh_postmerge */ realT TRACEdist; /* 'TWn' start tracing when merge distance too big */ int TRACEmerge; /* 'TMn' start tracing before this merge */ boolT TRIangulate; /* true 'Qt' if triangulate non-simplicial facets */ @@ -579,11 +624,11 @@ boolT USEstdout; /* true 'Tz' if using stdout instead of stderr */ boolT VERIFYoutput; /* true 'Tv' if verify output at end of qhull */ boolT VIRTUALmemory; /* true 'Q7' if depth-first processing in buildhull */ - boolT VORONOI; /* true 'v' if computing Voronoi diagram */ + boolT VORONOI; /* true 'v' if computing Voronoi diagram, also sets qh.DELAUNAY */ /*--------input constants ---------*/ realT AREAfactor; /* 1/(hull_dim-1)! for converting det's to area */ - boolT DOcheckmax; /* true if calling qh_check_maxout (qh_initqhull_globals) */ + boolT DOcheckmax; /* true if calling qh_check_maxout (!qh.SKIPcheckmax && qh.MERGING) */ char *feasible_string; /* feasible point 'Hn,n,n' for halfspace intersection */ coordT *feasible_point; /* as coordinates, both malloc'd */ boolT GETarea; /* true 'Fa', 'FA', 'FS', 'PAn', 'PFn' if compute facet area/Voronoi volume in io.c */ @@ -604,10 +649,10 @@ int qhull_optionsiz2; /* size of qhull_options at qh_clear_outputflags */ int run_id; /* non-zero, random identifier for this instance of qhull */ boolT VERTEXneighbors; /* true if maintaining vertex neighbors */ - boolT ZEROcentrum; /* true if 'C-0' or 'C-0 Qx'. sets ZEROall_ok */ + boolT ZEROcentrum; /* true if 'C-0' or 'C-0 Qx' and not post-merging or 'A-n'. Sets ZEROall_ok */ realT *upper_threshold; /* don't print if facet->normal[k]>=upper_threshold[k] must set either GOODthreshold or SPLITthreshold - if Delaunay, default is 0.0 for upper envelope */ + if qh.DELAUNAY, default is 0.0 for upper envelope (qh_initbuild) */ realT *lower_threshold; /* don't print if facet->normal[k] <=lower_threshold[k] */ realT *upper_bound; /* scale point[k] to new upper bound */ realT *lower_bound; /* scale point[k] to new lower bound @@ -620,16 +665,18 @@ precision constants for Qhull notes: - qh_detroundoff() computes the maximum roundoff error for distance + qh_detroundoff [geom2.c] computes the maximum roundoff error for distance and other computations. It also sets default values for the qh constants above. */ realT ANGLEround; /* max round off error for angles */ - realT centrum_radius; /* max centrum radius for convexity (roundoff added) */ + realT centrum_radius; /* max centrum radius for convexity ('Cn' + 2*qh.DISTround) */ realT cos_max; /* max cosine for convexity (roundoff added) */ - realT DISTround; /* max round off error for distances, 'E' overrides qh_distround() */ + realT DISTround; /* max round off error for distances, qh.SETroundoff ('En') overrides qh_distround */ realT MAXabs_coord; /* max absolute coordinate */ realT MAXlastcoord; /* max last coordinate for qh_scalelast */ + realT MAXoutside; /* max target for qh.max_outside/f.maxoutside, base for qh_RATIO... + recomputed at qh_addpoint, unrelated to qh_MAXoutside */ realT MAXsumcoord; /* max sum of coordinates */ realT MAXwidth; /* max rectilinear width of point coordinates */ realT MINdenom_1; /* min. abs. value for 1/x */ @@ -637,7 +684,6 @@ realT MINdenom_1_2; /* min. abs. val for 1/x that allows normalization */ realT MINdenom_2; /* use divzero if denominator < MINdenom_2 */ realT MINlastcoord; /* min. last coordinate for qh_scalelast */ - boolT NARROWhull; /* set in qh_initialhull if angle < qh_MAXnarrow */ realT *NEARzero; /* hull_dim array for near zero in gausselim */ realT NEARinside; /* keep points for qh_check_maxout if close to facet */ realT ONEmerge; /* max distance for merging simplicial facets */ @@ -645,6 +691,7 @@ qh_check_bestdist() qh_check_points() reports error if point outside */ realT WIDEfacet; /* size of wide facet for skipping ridge in area computation and locking centrum */ + boolT NARROWhull; /* set in qh_initialhull if angle < qh_MAXnarrow */ /*---------------------------------- @@ -654,16 +701,16 @@ */ char qhull[sizeof("qhull")]; /* "qhull" for checking ownership while debugging */ jmp_buf errexit; /* exit label for qh_errexit, defined by setjmp() and NOerrexit */ - char jmpXtra[40]; /* extra bytes in case jmp_buf is defined wrong by compiler */ + char jmpXtra[40]; /* extra bytes in case jmp_buf is defined wrong by compiler */ jmp_buf restartexit; /* restart label for qh_errexit, defined by setjmp() and ALLOWrestart */ - char jmpXtra2[40]; /* extra bytes in case jmp_buf is defined wrong by compiler*/ - FILE *fin; /* pointer to input file, init by qh_initqhull_start2 */ - FILE *fout; /* pointer to output file */ - FILE *ferr; /* pointer to error file */ + char jmpXtra2[40]; /* extra bytes in case jmp_buf is defined wrong by compiler*/ + FILE * fin; /* pointer to input file, init by qh_initqhull_start2 */ + FILE * fout; /* pointer to output file */ + FILE * ferr; /* pointer to error file */ pointT *interior_point; /* center point of the initial simplex*/ - int normal_size; /* size in bytes for facet normals and point coords*/ - int center_size; /* size in bytes for Voronoi centers */ - int TEMPsize; /* size for small, temporary sets (in quick mem) */ + int normal_size; /* size in bytes for facet normals and point coords */ + int center_size; /* size in bytes for Voronoi centers */ + int TEMPsize; /* size for small, temporary sets (in quick mem) */ /*---------------------------------- @@ -675,31 +722,40 @@ qh_resetlists() */ facetT *facet_list; /* first facet */ - facetT *facet_tail; /* end of facet_list (dummy facet) */ + facetT *facet_tail; /* end of facet_list (dummy facet with id 0 and next==NULL) */ facetT *facet_next; /* next facet for buildhull() previous facets do not have outside sets NARROWhull: previous facets may have coplanar outside sets for qh_outcoplanar */ - facetT *newfacet_list; /* list of new facets to end of facet_list */ + facetT *newfacet_list; /* list of new facets to end of facet_list + qh_postmerge sets newfacet_list to facet_list */ facetT *visible_list; /* list of visible facets preceding newfacet_list, - facet->visible set */ + end of visible list if !facet->visible, same as newfacet_list + qh_findhorizon sets visible_list at end of facet_list + qh_willdelete prepends to visible_list + qh_triangulate appends mirror facets to visible_list at end of facet_list + qh_postmerge sets visible_list to facet_list + qh_deletevisible deletes the visible facets */ int num_visible; /* current number of visible facets */ - unsigned tracefacet_id; /* set at init, then can print whenever */ - facetT *tracefacet; /* set in newfacet/mergefacet, undone in delfacet*/ - unsigned tracevertex_id; /* set at buildtracing, can print whenever */ - vertexT *tracevertex; /* set in newvertex, undone in delvertex*/ - vertexT *vertex_list; /* list of all vertices, to vertex_tail */ - vertexT *vertex_tail; /* end of vertex_list (dummy vertex) */ + unsigned int tracefacet_id; /* set at init, then can print whenever */ + facetT *tracefacet; /* set in newfacet/mergefacet, undone in delfacet and qh_errexit */ + unsigned int traceridge_id; /* set at init, then can print whenever */ + ridgeT *traceridge; /* set in newridge, undone in delridge, errexit, errexit2, makenew_nonsimplicial, mergecycle_ridges */ + unsigned int tracevertex_id; /* set at buildtracing, can print whenever */ + vertexT *tracevertex; /* set in newvertex, undone in delvertex and qh_errexit */ + vertexT *vertex_list; /* list of all vertices, to vertex_tail */ + vertexT *vertex_tail; /* end of vertex_list (dummy vertex with ID 0, next NULL) */ vertexT *newvertex_list; /* list of vertices in newfacet_list, to vertex_tail - all vertices have 'newlist' set */ + all vertices have 'newfacet' set */ int num_facets; /* number of facets in facet_list includes visible faces (num_visible) */ int num_vertices; /* number of vertices in facet_list */ int num_outside; /* number of points in outsidesets (for tracing and RANDOMoutside) includes coplanar outsideset points for NARROWhull/qh_outcoplanar() */ - int num_good; /* number of good facets (after findgood_all) */ - unsigned facet_id; /* ID of next, new facet from newfacet() */ - unsigned ridge_id; /* ID of next, new ridge from newridge() */ - unsigned vertex_id; /* ID of next, new vertex from newvertex() */ + int num_good; /* number of good facets (after qh_findgood_all or qh_markkeep) */ + unsigned int facet_id; /* ID of next, new facet from newfacet() */ + unsigned int ridge_id; /* ID of next, new ridge from newridge() */ + unsigned int vertex_id; /* ID of next, new vertex from newvertex() */ + unsigned int first_newfacet; /* ID of first_newfacet for qh_buildcone, or 0 if none */ /*---------------------------------- @@ -710,15 +766,18 @@ initialize in qh_initbuild or qh_maxmin if used in qh_buildhull */ unsigned long hulltime; /* ignore time to set up input and randomize */ - /* use unsigned to avoid wrap-around errors */ - boolT ALLOWrestart; /* true if qh_precision can use qh.restartexit */ + /* use 'unsigned long' to avoid wrap-around errors */ + boolT ALLOWrestart; /* true if qh_joggle_restart can use qh.restartexit */ int build_cnt; /* number of calls to qh_initbuild */ qh_CENTER CENTERtype; /* current type of facet->center, qh_CENTER */ int furthest_id; /* pointid of furthest point, for tracing */ + int last_errcode; /* last errcode from qh_fprintf, reset in qh_build_withrestart */ facetT *GOODclosest; /* closest facet to GOODthreshold in qh_findgood */ + pointT *coplanar_apex; /* last apex declared a coplanar point by qh_getpinchedmerges, prevents infinite loop */ boolT hasAreaVolume; /* true if totarea, totvol was defined by qh_getarea */ boolT hasTriangulation; /* true if triangulation created by qh_triangulate */ - realT JOGGLEmax; /* set 'QJn' if randomly joggle input */ + boolT isRenameVertex; /* true during qh_merge_pinchedvertices, disables duplicate ridge vertices in qh_checkfacet */ + realT JOGGLEmax; /* set 'QJn' if randomly joggle input. 'QJ'/'QJ0.0' sets default (qh_detjoggle) */ boolT maxoutdone; /* set qh_check_maxout(), cleared by qh_addpoint() */ realT max_outside; /* maximum distance from a point to a facet, before roundoff, not simplicial vertices @@ -731,22 +790,26 @@ if qh.JOGGLEmax, qh_makenewplanes sets it recomputed if qh.DOcheckmax, default -qh.DISTround */ boolT NEWfacets; /* true while visible facets invalid due to new or merge - from makecone/attachnewfacets to deletevisible */ + from qh_makecone/qh_attachnewfacets to qh_resetlists */ + boolT NEWtentative; /* true while new facets are tentative due to !qh.IGNOREpinched or qh.ONLYgood + from qh_makecone to qh_attachnewfacets */ boolT findbestnew; /* true if partitioning calls qh_findbestnew */ boolT findbest_notsharp; /* true if new facets are at least 90 degrees */ - boolT NOerrexit; /* true if qh.errexit is not available, cleared after setjmp */ + boolT NOerrexit; /* true if qh.errexit is not available, cleared after setjmp. See qh.ERREXITcalled */ realT PRINTcradius; /* radius for printing centrums */ realT PRINTradius; /* radius for printing vertex spheres and points */ boolT POSTmerging; /* true when post merging */ int printoutvar; /* temporary variable for qh_printbegin, etc. */ int printoutnum; /* number of facets printed */ + unsigned int repart_facetid; /* previous facetid to prevent recursive qh_partitioncoplanar+qh_partitionpoint */ + int retry_addpoint; /* number of retries of qh_addpoint due to merging pinched vertices */ boolT QHULLfinished; /* True after qhull() is finished */ realT totarea; /* 'FA': total facet area computed by qh_getarea, hasAreaVolume */ realT totvol; /* 'FA': total volume computed by qh_getarea, hasAreaVolume */ unsigned int visit_id; /* unique ID for searching neighborhoods, */ unsigned int vertex_visit; /* unique ID for searching vertices, reset with qh_buildtracing */ - boolT ZEROall_ok; /* True if qh_checkzero always succeeds */ boolT WAScoplanar; /* True if qh_partitioncoplanar (qh_check_maxout) */ + boolT ZEROall_ok; /* True if qh_checkzero always succeeds */ /*---------------------------------- @@ -757,11 +820,12 @@ */ setT *facet_mergeset; /* temporary set of merges to be done */ setT *degen_mergeset; /* temporary set of degenerate and redundant merges */ + setT *vertex_mergeset; /* temporary set of vertex merges */ setT *hash_table; /* hash table for matching ridges in qh_matchfacets size is setsize() */ setT *other_points; /* additional points */ setT *del_vertices; /* vertices to partition and delete with visible - facets. Have deleted set for checkfacet */ + facets. v.deleted is set for checkfacet */ /*---------------------------------- @@ -773,7 +837,7 @@ coordT **gm_row; /* array of gm_matrix rows */ char* line; /* malloc'd input line of maxline+1 chars */ int maxline; - coordT *half_space; /* malloc'd input array for halfspace (qh normal_size+coordT) */ + coordT *half_space; /* malloc'd input array for halfspace (qh.normal_size+coordT) */ coordT *temp_malloc; /* malloc'd input array for points */ /*-id) : qh_IDunknown) @@ -845,6 +915,8 @@ FORALLpoints { ... } assign 'point' to each point in qh.first_point, qh.num_points + notes: + declare: coordT *point, *pointtemp; */ @@ -853,13 +925,13 @@ /*---------------------------------- - FORALLpoint_( points, num) { ... } + FORALLpoint_(points, num) { ... } assign 'point' to each point in points array of num points declare: coordT *point, *pointtemp; */ -#define FORALLpoint_(points, num) for (point= (points), \ +#define FORALLpoint_(points, num) for (point=(points), \ pointtemp= (points)+qh hull_dim*(num); point < pointtemp; point += qh hull_dim) /*-next;vertex= vertex->next) @@ -885,6 +957,9 @@ declare: facetT *facet, **facetp; + notes: + assumes set is not modified + see: FOREACHsetelement_ */ @@ -902,6 +977,9 @@ declare: facetT *neighbor, **neighborp; + notes: + assumes set is not modified + see: FOREACHsetelement_ */ @@ -916,6 +994,9 @@ declare: pointT *point, **pointp; + notes: + assumes set is not modified + see: FOREACHsetelement_ */ @@ -930,6 +1011,9 @@ declare: ridgeT *ridge, **ridgep; + notes: + assumes set is not modified + see: FOREACHsetelement_ */ @@ -944,6 +1028,9 @@ declare: vertexT *vertex, **vertexp; + notes: + assumes set is not modified + see: FOREACHsetelement_ */ @@ -970,15 +1057,13 @@ FOREACHneighbor_i_( facet ) { ... } assign 'neighbor' and 'neighbor_i' for each neighbor in facet->neighbors - FOREACHneighbor_i_( vertex ) { ... } - assign 'neighbor' and 'neighbor_i' for each neighbor in vertex->neighbors - declare: facetT *neighbor; int neighbor_n, neighbor_i; - see: - FOREACHsetelement_i_ + notes: + see FOREACHsetelement_i_ + for facet neighbors of vertex, need to define a new macro */ #define FOREACHneighbor_i_(facet) FOREACHsetelement_i_(facetT, facet->neighbors, neighbor) @@ -1025,12 +1110,13 @@ see: FOREACHsetelement_i_ */ -#define FOREACHvertex_i_(vertices) FOREACHsetelement_i_(vertexT, vertices,vertex) +#define FOREACHvertex_i_(vertices) FOREACHsetelement_i_(vertexT, vertices, vertex) /********* -libqhull.c prototypes (duplicated from qhull_a.h) **********************/ void qh_qhull(void); boolT qh_addpoint(pointT *furthest, facetT *facet, boolT checkdist); +void qh_errexit2(int exitcode, facetT *facet, facetT *otherfacet); void qh_printsummary(FILE *fp); /********* -user.c prototypes (alphabetical) **********************/ @@ -1041,8 +1127,11 @@ char *qhull_cmd, FILE *outfile, FILE *errfile); void qh_printfacetlist(facetT *facetlist, setT *facets, boolT printall); void qh_printhelp_degenerate(FILE *fp); +void qh_printhelp_internal(FILE *fp); void qh_printhelp_narrowhull(FILE *fp, realT minangle); void qh_printhelp_singular(FILE *fp); +void qh_printhelp_topology(FILE *fp); +void qh_printhelp_wide(FILE *fp); void qh_user_memsizes(void); /********* -usermem.c prototypes (alphabetical) **********************/ @@ -1101,8 +1190,8 @@ /***** -io.c prototypes (duplicated from io.h) ***********************/ -void qh_dfacet(unsigned id); -void qh_dvertex(unsigned id); +void qh_dfacet(unsigned int id); +void qh_dvertex(unsigned int id); void qh_printneighborhood(FILE *fp, qh_PRINT format, facetT *facetA, facetT *facetB, boolT printall); void qh_produce_output(void); coordT *qh_readpoints(int *numpoints, int *dimension, boolT *ismalloc); @@ -1122,11 +1211,11 @@ realT *bestdist, boolT *isoutside); vertexT *qh_nearvertex(facetT *facet, pointT *point, realT *bestdistp); pointT *qh_point(int id); -setT *qh_pointfacet(void /*qh.facet_list*/); +setT *qh_pointfacet(void /* qh.facet_list */); int qh_pointid(pointT *point); -setT *qh_pointvertex(void /*qh.facet_list*/); +setT *qh_pointvertex(void /* qh.facet_list */); void qh_setvoronoi_all(void); -void qh_triangulate(void /*qh.facet_list*/); +void qh_triangulate(void /* qh.facet_list */); /********* -rboxlib.c prototypes **********************/ int qh_rboxpoints(FILE* fout, FILE* ferr, char* rbox_command); diff -Nru qhull-2015.2/src/libqhull/Makefile qhull-2020.2/src/libqhull/Makefile --- qhull-2015.2/src/libqhull/Makefile 2016-01-19 00:25:48.000000000 +0000 +++ qhull-2020.2/src/libqhull/Makefile 2020-09-03 23:02:04.000000000 +0000 @@ -4,12 +4,14 @@ # See README.txt and ../../Makefile # # Variables +# DESTDIR directory for staged installs (GNU Makefile standards) +# PREFIX install directory for 'make install' (default /usr/local) # BINDIR directory where to copy executables -# DESTDIR destination directory for 'make install' # DOCDIR directory where to copy html documentation # INCDIR directory where to copy headers # LIBDIR directory where to copy libraries # MANDIR directory where to copy manual pages +# PCDIR directory where to copy pkg-config files # PRINTMAN command for printing manual pages # PRINTC command for printing C files # CC ANSI C or C++ compiler @@ -24,40 +26,53 @@ # FILES miscellaneous files for printing # TFILES .txt versions of html files # FILES all other files -# LIBQHULL_OBJS specifies the object files of libqhullstatic_r.a +# LIBQHULL_OBJS specifies the object files of libqhullstatic.a # # Results # rbox Generates points sets for qhull, qconvex, etc. # qhull Computes convex hulls and related structures # qconvex, qdelaunay, qhalf, qvoronoi # Specializations of qhull for each geometric structure -# libqhullstatic_r.a Static library for non-reentrant qhull -# testqset_r Standalone test of non-reentrant qset_r.c with mem_r.c +# libqhullstatic.a Static library for non-reentrant qhull +# testqset Standalone test of non-reentrant qset.c with mem.c # user_eg An example of using qhull (non-reentrant) # user_eg2 An example of using qhull (non-reentrant) # # Make targets # make Build results using gcc or another compiler +# make all # make clean Remove object files # make cleanall Remove generated files # make doc Print documentation # make help -# make install Copy qhull, rbox, qhull.1, rbox.1 to BINDIR, MANDIR +# make install Copy results and documentation to BINDIR, DOCDIR, INCDIR, LIBDIR, MANDIR, PCDOC +# make uninstall Delete Qhull files from BINDIR, DOCDIR, INCDIR, LIBDIR, MANDIR, PCDOC # make new Rebuild qhull and rbox from source # make printall Print all files # make qtest Quick test of qset, rbox, and qhull # make test Quck test of qhull, qconvex, etc. # +# $Id: //main/2019/qhull/src/libqhull/Makefile#13 $ + # Do not replace tabs with spaces. Needed for build rules # Unix line endings (\n) -# $Id: //main/2015/qhull/src/libqhull/Makefile#8 $ -DESTDIR = /usr/local -BINDIR = $(DESTDIR)/bin -INCDIR = $(DESTDIR)/include -LIBDIR = $(DESTDIR)/lib -DOCDIR = $(DESTDIR)/share/doc/qhull -MANDIR = $(DESTDIR)/share/man/man1 +PREFIX ?= /usr/local +BINDIR ?= bin +INCDIR ?= include +LIBDIR ?= lib +DOCDIR ?= share/doc/qhull +MANDIR ?= share/man/man1 +PCDIR ?= $(LIBDIR)/pkgconfig + +ABS_BINDIR = $(DESTDIR)$(PREFIX)/$(BINDIR) +ABS_INCDIR = $(DESTDIR)$(PREFIX)/$(INCDIR) +ABS_LIBDIR = $(DESTDIR)$(PREFIX)/$(LIBDIR) +ABS_DOCDIR = $(DESTDIR)$(PREFIX)/$(DOCDIR) +ABS_MANDIR = $(DESTDIR)$(PREFIX)/$(MANDIR) +ABS_PCDIR = $(DESTDIR)$(PREFIX)/$(PCDIR) + +qhull_VERSION=$(shell grep 'set.qhull_VERSION ' ../../CMakeLists.txt | grep -o '[0-9.]\+' || echo 0unknown) # if you do not have enscript, try a2ps or just use lpr. The files are text. PRINTMAN = enscript -2rl @@ -66,9 +81,16 @@ # PRINTC = lpr #for Gnu's gcc compiler, -O3 for optimization, -g for debugging, -pg for profiling -# -fpic needed for gcc x86_64-linux-gnu. Not needed for mingw +# caller may define CC_WARNINGS +# Qhull uses less memory for 32-bit builds on 64-bit hosts +# Enable 32-bit builds with 'make M32=-m32' +# M32 = -m32 +# -fpic is required for linking to shared libraries +# -fpic may be slower for 32-bit builds on 64-bit hosts +# Disable -fpic with 'make FPIC=' +FPIC = -fpic CC = gcc -CC_OPTS1 = -O3 -ansi -I../../src -fpic $(CC_WARNINGS) +CC_OPTS1 = -O3 -ansi -I../../src $(CC_WARNINGS) $(M32) $(FPIC) # for Sun's cc compiler, -fast or O2 for optimization, -g for debugging, -Xc for ANSI #CC = cc @@ -90,7 +112,7 @@ all: qhull_links qhull_all qtest help: - head -n 50 Makefile + head -n 54 Makefile clean: rm -f *.o @@ -106,16 +128,40 @@ $(PRINTMAN) $(TXTFILES) $(DOCFILES) install: - mkdir -p $(BINDIR) - mkdir -p $(DOCDIR) - mkdir -p $(INCDIR)/libqhull - mkdir -p $(MANDIR) - cp -p qconvex qdelaunay qhalf qhull qvoronoi rbox $(BINDIR) - cp -p libqhullstatic.a $(LIBDIR) - cp -p ../../html/qhull.man $(MANDIR)/qhull.1 - cp -p ../../html/rbox.man $(MANDIR)/rbox.1 - cp -p ../../html/* $(DOCDIR) - cp *.h $(INCDIR)/libqhull + mkdir -p $(ABS_BINDIR) + mkdir -p $(ABS_DOCDIR)/src + mkdir -p $(ABS_INCDIR)/libqhull + mkdir -p $(ABS_LIBDIR) + mkdir -p $(ABS_MANDIR) + mkdir -p $(ABS_PCDIR) + cp -p qconvex qdelaunay qhalf qhull qvoronoi rbox $(ABS_BINDIR) + cp -p libqhullstatic.a $(ABS_LIBDIR) + (cd ../.. && cp -p README.txt REGISTER.txt Announce.txt COPYING.txt index.htm $(ABS_DOCDIR)/) + (cd ../.. && cp -pr html $(ABS_DOCDIR)/) + (cd ../.. && cp -p src/Changes.txt $(ABS_DOCDIR)/src/) + cp -p ../../html/qhull.man $(ABS_MANDIR)/qhull.1 + cp -p ../../html/rbox.man $(ABS_MANDIR)/rbox.1 + cp DEPRECATED.txt *.h $(ABS_INCDIR)/libqhull + sed \ + -e 's#@qhull_VERSION@#$(qhull_VERSION)#' \ + -e 's#@CMAKE_INSTALL_PREFIX@#$(PREFIX)#' \ + -e 's#@LIB_INSTALL_DIR@#$(LIBDIR)#' \ + -e 's#@INCLUDE_INSTALL_DIR@#$(INCDIR)#' \ + -e 's#@LIBRARY_NAME@#qhullstatic#' \ + -e 's#@LIBRARY_DESCRIPTION@#Qhull static library#' \ + ../../build/qhull.pc.in > $(ABS_PCDIR)/qhullstatic.pc + +uninstall: + -(cd $(ABS_BINDIR) && rm -f qconvex qdelaunay qhalf qhull qvoronoi rbox) + -(cd $(ABS_BINDIR) && rm -f qconvex.exe qdelaunay.exe qhalf.exe qhull.exe qvoronoi.exe rbox.exe) + -(cd $(ABS_MANDIR) && rm -f qhull.1 rbox.1) + -(cd $(ABS_DOCDIR) && rm -f README.txt REGISTER.txt Announce.txt COPYING.txt index.htm src/Changes.txt) + -(cd $(ABS_DOCDIR) && rm -rf html) + -(cd $(ABS_LIBDIR) && rm -f libqhullstatic.a) + -(cd $(ABS_INCDIR) && rm -rf libqhull) + -(cd $(ABS_PCDIR) && rm -f qhullstatic.pc) + -rmdir $(ABS_DOCDIR)/src + -rmdir $(ABS_DOCDIR) new: cleanall all @@ -131,21 +177,22 @@ # Same definitions as ../../Makefile LIBQHULLS_OBJS_1= global.o stat.o geom2.o poly2.o merge.o \ - libqhull.o geom.o poly.o qset.o mem.o random.o + libqhull.o geom.o poly.o qset.o mem.o random.o LIBQHULLS_OBJS_2= $(LIBQHULLS_OBJS_1) usermem.o userprintf.o io.o user.o LIBQHULLS_OBJS= $(LIBQHULLS_OBJS_2) rboxlib.o userprintf_rbox.o LIBQHULL_HDRS= user.h libqhull.h qhull_a.h geom.h \ - io.h mem.h merge.h poly.h random.h \ - qset.h stat.h + io.h mem.h merge.h poly.h random.h \ + qset.h stat.h -# CFILES ordered alphabetically after libqhull.c +# CFILES for 'printc', ordered alphabetically after libqhull.c CFILES= ../qhull/unix.c libqhull.c geom.c geom2.c global.c io.c \ mem.c merge.c poly.c poly2.c random.c rboxlib.c \ qset.c stat.c user.c usermem.c userprintf.c \ - ../qconvex/qconvex.c ../qdelaunay/qdelaun.c ../qhalf/qhalf.c ../qvoronoi/qvoronoi.c + ../qconvex/qconvex.c ../qdelaunay/qdelaun.c \ + ../qhalf/qhalf.c ../qvoronoi/qvoronoi.c TXTFILES= ../../Announce.txt ../../REGISTER.txt ../../COPYING.txt ../../README.txt ../Changes.txt DOCFILES= ../../html/rbox.txt ../../html/qhull.txt @@ -156,27 +203,28 @@ # Work around problems with ../ in Red Hat Linux qhull_links: # On MINSYS, 'ln -s' may create a copy instead of a symbolic link - [ -f qconvex.c ] || ln -s ../qconvex/qconvex.c - [ -f qdelaun.c ] || ln -s ../qdelaunay/qdelaun.c - [ -f qhalf.c ] || ln -s ../qhalf/qhalf.c - [ -f qvoronoi.c ] || ln -s ../qvoronoi/qvoronoi.c - [ -f rbox.c ] || ln -s ../rbox/rbox.c - [ -f testqset.c ] || ln -s ../testqset/testqset.c - [ -f unix.c ] || ln -s ../qhull/unix.c - [ -f user_eg.c ] || ln -s ../user_eg/user_eg.c - [ -f user_eg2.c ] || ln -s ../user_eg2/user_eg2.c + [ -f qconvex.c ] || ln -s ../qconvex/qconvex.c + [ -f qdelaun.c ] || ln -s ../qdelaunay/qdelaun.c + [ -f qhalf.c ] || ln -s ../qhalf/qhalf.c + [ -f qvoronoi.c ] || ln -s ../qvoronoi/qvoronoi.c + [ -f rbox.c ] || ln -s ../rbox/rbox.c + [ -f testqset.c ] || ln -s ../testqset/testqset.c + [ -f unix.c ] || ln -s ../qhull/unix.c + [ -f user_eg.c ] || ln -s ../user_eg/user_eg.c + [ -f user_eg2.c ] || ln -s ../user_eg2/user_eg2.c + # user_eg3.c not compiled. It requires all of libqhullcpp; use qhull/Makefile instead # compile qhull without using bin/libqhullstatic.a qhull_all: qconvex.o qdelaun.o qhalf.o qvoronoi.o unix.o user_eg.o user_eg2.o rbox.o testqset.o $(LIBQHULLS_OBJS) - $(CC) -o qconvex $(CC_OPTS2) -lm $(LIBQHULLS_OBJS_2) qconvex.o - $(CC) -o qdelaunay $(CC_OPTS2) -lm $(LIBQHULLS_OBJS_2) qdelaun.o - $(CC) -o qhalf $(CC_OPTS2) -lm $(LIBQHULLS_OBJS_2) qhalf.o - $(CC) -o qvoronoi $(CC_OPTS2) -lm $(LIBQHULLS_OBJS_2) qvoronoi.o - $(CC) -o qhull $(CC_OPTS2) -lm $(LIBQHULLS_OBJS_2) unix.o - $(CC) -o rbox $(CC_OPTS2) -lm $(LIBQHULLS_OBJS) rbox.o - $(CC) -o user_eg $(CC_OPTS2) -lm $(LIBQHULLS_OBJS_2) user_eg.o - $(CC) -o user_eg2 $(CC_OPTS2) -lm $(LIBQHULLS_OBJS_1) user_eg2.o usermem.o userprintf.o io.o - $(CC) -o testqset $(CC_OPTS2) -lm mem.o qset.o usermem.o testqset.o + $(CC) -o qconvex $(CC_OPTS2) $(LIBQHULLS_OBJS_2) qconvex.o -lm + $(CC) -o qdelaunay $(CC_OPTS2) $(LIBQHULLS_OBJS_2) qdelaun.o -lm + $(CC) -o qhalf $(CC_OPTS2) $(LIBQHULLS_OBJS_2) qhalf.o -lm + $(CC) -o qvoronoi $(CC_OPTS2) $(LIBQHULLS_OBJS_2) qvoronoi.o -lm + $(CC) -o qhull $(CC_OPTS2) $(LIBQHULLS_OBJS_2) unix.o -lm + $(CC) -o rbox $(CC_OPTS2) $(LIBQHULLS_OBJS) rbox.o -lm + $(CC) -o user_eg $(CC_OPTS2) $(LIBQHULLS_OBJS_2) user_eg.o -lm + $(CC) -o user_eg2 $(CC_OPTS2) $(LIBQHULLS_OBJS_1) user_eg2.o usermem.o userprintf.o io.o -lm + $(CC) -o testqset $(CC_OPTS2) mem.o qset.o usermem.o testqset.o -lm -ar -rs libqhullstatic.a $(LIBQHULLS_OBJS) #libqhullstatic.a is not needed for qhull #If 'ar -rs' fails try using 'ar -s' with 'ranlib' @@ -199,8 +247,9 @@ @echo ============================================ @echo @echo ============================================ - @echo == For all make targets + @echo == To install qhull or show help @echo '== make help' + @echo '== make install' @echo ============================================ @echo diff -Nru qhull-2015.2/src/libqhull/mem.c qhull-2020.2/src/libqhull/mem.c --- qhull-2015.2/src/libqhull/mem.c 2016-01-18 18:47:19.000000000 +0000 +++ qhull-2020.2/src/libqhull/mem.c 2020-05-22 02:00:58.000000000 +0000 @@ -29,9 +29,9 @@ qh-mem.htm and mem.h global.c (qh_initbuffers) for an example of using mem.c - Copyright (c) 1993-2015 The Geometry Center. - $Id: //main/2015/qhull/src/libqhull/mem.c#7 $$Change: 2065 $ - $DateTime: 2016/01/18 13:51:04 $$Author: bbarber $ + Copyright (c) 1993-2020 The Geometry Center. + $Id: //main/2019/qhull/src/libqhull/mem.c#4 $$Change: 2953 $ + $DateTime: 2020/05/21 22:05:32 $$Author: bbarber $ */ #include "user.h" /* for QHULL_CRTDBG */ @@ -152,14 +152,14 @@ *((void **)newbuffer)= qhmem.curbuffer; /* prepend newbuffer to curbuffer list. newbuffer!=0 by QH6080 */ qhmem.curbuffer= newbuffer; - size= (sizeof(void **) + qhmem.ALIGNmask) & ~qhmem.ALIGNmask; + size= ((int)sizeof(void **) + qhmem.ALIGNmask) & ~qhmem.ALIGNmask; qhmem.freemem= (void *)((char *)newbuffer+size); qhmem.freesize= bufsize - size; qhmem.totbuffer += bufsize - size; /* easier to check */ /* Periodically test totbuffer. It matches at beginning and exit of every call */ - n = qhmem.totshort + qhmem.totfree + qhmem.totdropped + qhmem.freesize - outsize; + n= qhmem.totshort + qhmem.totfree + qhmem.totdropped + qhmem.freesize - outsize; if (qhmem.totbuffer != n) { - qh_fprintf(qhmem.ferr, 6212, "qh_memalloc internal error: short totbuffer %d != totshort+totfree... %d\n", qhmem.totbuffer, n); + qh_fprintf(qhmem.ferr, 6212, "qhull internal error (qh_memalloc): short totbuffer %d != totshort+totfree... %d\n", qhmem.totbuffer, n); qh_errexit(qhmem_ERRmem, NULL, NULL); } } @@ -205,7 +205,8 @@ void *object; if (qhmem.ferr == 0 || qhmem.IStracing < 0 || qhmem.IStracing > 10 || (((qhmem.ALIGNmask+1) & qhmem.ALIGNmask) != 0)) { - qh_fprintf_stderr(6244, "qh_memcheck error: either qhmem is overwritten or qhmem is not initialized. Call qh_meminit() or qh_new_qhull() before calling qh_mem routines. ferr 0x%x IsTracing %d ALIGNmask 0x%x", qhmem.ferr, qhmem.IStracing, qhmem.ALIGNmask); + qh_fprintf_stderr(6244, "qhull internal error (qh_memcheck): either qhmem is overwritten or qhmem is not initialized. Call qh_meminit or qh_new_qhull before calling qh_mem routines. ferr 0x%x, IsTracing %d, ALIGNmask 0x%x\n", + qhmem.ferr, qhmem.IStracing, qhmem.ALIGNmask); qh_exit(qhmem_ERRqhull); /* can not use qh_errexit() */ } if (qhmem.IStracing != 0) @@ -217,7 +218,7 @@ totfree += qhmem.sizetable[i] * count; } if (totfree != qhmem.totfree) { - qh_fprintf(qhmem.ferr, 6211, "Qhull internal error (qh_memcheck): totfree %d not equal to freelist total %d\n", qhmem.totfree, totfree); + qh_fprintf(qhmem.ferr, 6211, "qhull internal error (qh_memcheck): totfree %d not equal to freelist total %d\n", qhmem.totfree, totfree); qh_errexit(qhmem_ERRqhull, NULL, NULL); } if (qhmem.IStracing != 0) @@ -281,6 +282,11 @@ returns: number and size of current long allocations + notes: + if qh_NOmem (qh_malloc() for all allocations), + short objects (e.g., facetT) are not recovered. + use qh_freeqhull(qh_ALL) instead. + see: qh_freeqhull(allMem) qh_memtotal(curlong, totlong, curshort, totshort, maxlong, totbuffer); @@ -291,7 +297,7 @@ *curlong= qhmem.cntlong - qhmem.freelong; *totlong= qhmem.totlong; - for (buffer= qhmem.curbuffer; buffer; buffer= nextbuffer) { + for (buffer=qhmem.curbuffer; buffer; buffer= nextbuffer) { nextbuffer= *((void **) buffer); qh_free(buffer); } @@ -311,7 +317,7 @@ >--------------------------------- qh_meminit( ferr ) - initialize qhmem and test sizeof( void*) + initialize qhmem and test sizeof(void *) Does not throw errors. qh_exit on failure */ void qh_meminit(FILE *ferr) { @@ -321,13 +327,13 @@ qhmem.ferr= ferr; else qhmem.ferr= stderr; - if (sizeof(void*) < sizeof(int)) { - qh_fprintf(qhmem.ferr, 6083, "qhull internal error (qh_meminit): sizeof(void*) %d < sizeof(int) %d. qset.c will not work\n", (int)sizeof(void*), (int)sizeof(int)); + if (sizeof(void *) < sizeof(int)) { + qh_fprintf(qhmem.ferr, 6083, "qhull internal error (qh_meminit): sizeof(void *) %d < sizeof(int) %d. qset.c will not work\n", (int)sizeof(void*), (int)sizeof(int)); qh_exit(qhmem_ERRqhull); /* can not use qh_errexit() */ } - if (sizeof(void*) > sizeof(ptr_intT)) { - qh_fprintf(qhmem.ferr, 6084, "qhull internal error (qh_meminit): sizeof(void*) %d > sizeof(ptr_intT) %d. Change ptr_intT in mem.h to 'long long'\n", (int)sizeof(void*), (int)sizeof(ptr_intT)); - qh_exit(qhmem_ERRqhull); /* can not use qh_errexit() */ + if (sizeof(void *) > sizeof(ptr_intT)) { + qh_fprintf(qhmem.ferr, 6084, "qhull internal error (qh_meminit): sizeof(void *) %d > sizeof(ptr_intT) %d. Change ptr_intT in mem.h to 'long long'\n", (int)sizeof(void*), (int)sizeof(ptr_intT)); + qh_exit(qhmem_ERRqhull); /* can not use qh_errexit() */ } qh_memcheck(); } /* meminit */ @@ -367,7 +373,7 @@ /*--------------------------------- - qh_memsetup() + qh_memsetup( ) set up memory after running memsize() */ void qh_memsetup(void) { @@ -380,7 +386,7 @@ qhmem.LASTsize, qhmem.BUFsize, qhmem.BUFinit); qh_errexit(qhmem_ERRmem, NULL, NULL); } - if (!(qhmem.indextable= (int *)qh_malloc((qhmem.LASTsize+1) * sizeof(int)))) { + if (!(qhmem.indextable= (int *)qh_malloc((size_t)(qhmem.LASTsize+1) * sizeof(int)))) { qh_fprintf(qhmem.ferr, 6088, "qhull error (qh_memsetup): insufficient memory\n"); qh_errexit(qhmem_ERRmem, NULL, NULL); } @@ -405,10 +411,12 @@ int k; if (qhmem.LASTsize) { - qh_fprintf(qhmem.ferr, 6089, "qhull error (qh_memsize): called after qhmem_setup\n"); + qh_fprintf(qhmem.ferr, 6089, "qhull internal error (qh_memsize): qh_memsize called after qh_memsetup\n"); qh_errexit(qhmem_ERRqhull, NULL, NULL); } size= (size + qhmem.ALIGNmask) & ~qhmem.ALIGNmask; + if (qhmem.IStracing >= 3) + qh_fprintf(qhmem.ferr, 3078, "qh_memsize: quick memory of %d bytes\n", size); for (k=qhmem.TABLEsize; k--; ) { if (qhmem.sizetable[k] == size) return; @@ -416,7 +424,7 @@ if (qhmem.TABLEsize < qhmem.NUMsizes) qhmem.sizetable[qhmem.TABLEsize++]= size; else - qh_fprintf(qhmem.ferr, 7060, "qhull warning (memsize): free list table has room for only %d sizes\n", qhmem.NUMsizes); + qh_fprintf(qhmem.ferr, 7060, "qhull warning (qh_memsize): free list table has room for only %d sizes\n", qhmem.NUMsizes); } /* memsize */ @@ -456,7 +464,7 @@ qhmem.totbuffer, qhmem.BUFsize, qhmem.BUFinit); if (qhmem.cntlarger) { qh_fprintf(fp, 9279, "%7d calls to qh_setlarger\n%7.2g average copy size\n", - qhmem.cntlarger, ((float)qhmem.totlarger)/(float)qhmem.cntlarger); + qhmem.cntlarger, ((double)qhmem.totlarger)/(double)qhmem.cntlarger); qh_fprintf(fp, 9280, " freelists(bytes->count):"); } for (i=0; i < qhmem.TABLEsize; i++) { @@ -496,6 +504,9 @@ return object; } +void qh_memcheck(void) { +} + void qh_memfree(void *object, int insize) { if (!object) @@ -520,8 +531,8 @@ qhmem.ferr= ferr; else qhmem.ferr= stderr; - if (sizeof(void*) < sizeof(int)) { - qh_fprintf(qhmem.ferr, 6091, "qhull internal error (qh_meminit): sizeof(void*) %d < sizeof(int) %d. qset.c will not work\n", (int)sizeof(void*), (int)sizeof(int)); + if (sizeof(void *) < sizeof(int)) { + qh_fprintf(qhmem.ferr, 6091, "qhull internal error (qh_meminit): sizeof(void *) %d < sizeof(int) %d. qset.c will not work\n", (int)sizeof(void*), (int)sizeof(int)); qh_errexit(qhmem_ERRqhull, NULL, NULL); } } @@ -532,11 +543,9 @@ } void qh_memsetup(void) { - } void qh_memsize(int size) { - } void qh_memstatistics(FILE *fp) { @@ -563,7 +572,7 @@ Returns the total current bytes of long and short allocations Returns the current count of long and short allocations Returns the maximum long memory and total short buffer (minus one link per buffer) - Does not error (UsingLibQhull.cpp) + Does not error (for deprecated UsingLibQhull.cpp in libqhullpcpp) */ void qh_memtotal(int *totlong, int *curlong, int *totshort, int *curshort, int *maxlong, int *totbuffer) { *totlong= qhmem.totlong; diff -Nru qhull-2015.2/src/libqhull/mem.h qhull-2020.2/src/libqhull/mem.h --- qhull-2015.2/src/libqhull/mem.h 2016-01-17 02:21:09.000000000 +0000 +++ qhull-2020.2/src/libqhull/mem.h 2020-05-22 02:00:58.000000000 +0000 @@ -11,9 +11,9 @@ and qh_errexit(qhmem_ERRqhull, NULL, NULL) otherwise - Copyright (c) 1993-2015 The Geometry Center. - $Id: //main/2015/qhull/src/libqhull/mem.h#2 $$Change: 2062 $ - $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $ + Copyright (c) 1993-2020 The Geometry Center. + $Id: //main/2019/qhull/src/libqhull/mem.h#2 $$Change: 2953 $ + $DateTime: 2020/05/21 22:05:32 $$Author: bbarber $ */ #ifndef qhDEFmem @@ -33,7 +33,7 @@ problem, and send the answer to qhull@qhull.org. If this can not be done, define qh_NOmem to use malloc/free instead. - #define qh_NOmem + #define qh_NOmem */ /*-neighbors not set until the first merge occurs - Copyright (c) 1993-2015 C.B. Barber. - $Id: //main/2015/qhull/src/libqhull/merge.c#4 $$Change: 2064 $ - $DateTime: 2016/01/18 12:36:08 $$Author: bbarber $ + Copyright (c) 1993-2020 C.B. Barber. + $Id: //main/2019/qhull/src/libqhull/merge.c#12 $$Change: 2958 $ + $DateTime: 2020/05/26 16:17:49 $$Author: bbarber $ */ #include "qhull_a.h" #ifndef qh_NOmerge +/* MRGnone, etc. */ +const char *mergetypes[]= { + "none", + "coplanar", + "anglecoplanar", + "concave", + "concavecoplanar", + "twisted", + "flip", + "dupridge", + "subridge", + "vertices", + "degen", + "redundant", + "mirror", + "coplanarhorizon", +}; + /*===== functions(alphabetical after premerge and postmerge) ======*/ /*--------------------------------- - qh_premerge( apex, maxcentrum ) - pre-merge nonconvex facets in qh.newfacet_list for apex + qh_premerge( apexpointid, maxcentrum ) + pre-merge nonconvex facets in qh.newfacet_list for apexpointid maxcentrum defines coplanar and concave (qh_test_appendmerge) returns: deleted facets added to qh.visible_list with facet->visible set notes: + only called by qh_addpoint uses globals, qh.MERGEexact, qh.PREmerge design: - mark duplicate ridges in qh.newfacet_list + mark dupridges in qh.newfacet_list merge facet cycles in qh.newfacet_list - merge duplicate ridges and concave facets in qh.newfacet_list + merge dupridges and concave facets in qh.newfacet_list check merged facet cycles for degenerate and redundant facets merge degenerate and redundant facets collect coplanar and concave facets merge concave, coplanar, degenerate, and redundant facets */ -void qh_premerge(vertexT *apex, realT maxcentrum, realT maxangle) { +void qh_premerge(int apexpointid, realT maxcentrum, realT maxangle /* qh.newfacet_list */) { boolT othermerge= False; - facetT *newfacet; if (qh ZEROcentrum && qh_checkzero(!qh_ALL)) return; - trace2((qh ferr, 2008, "qh_premerge: premerge centrum %2.2g angle %2.2g for apex v%d facetlist f%d\n", - maxcentrum, maxangle, apex->id, getid_(qh newfacet_list))); - if (qh IStracing >= 4 && qh num_facets < 50) + trace2((qh ferr, 2008, "qh_premerge: premerge centrum %2.2g angle %4.4g for apex p%d newfacet_list f%d\n", + maxcentrum, maxangle, apexpointid, getid_(qh newfacet_list))); + if (qh IStracing >= 4 && qh num_facets < 100) qh_printlists(); qh centrum_radius= maxcentrum; qh cos_max= maxangle; - qh degen_mergeset= qh_settemp(qh TEMPsize); - qh facet_mergeset= qh_settemp(qh TEMPsize); if (qh hull_dim >=3) { - qh_mark_dupridges(qh newfacet_list); /* facet_mergeset */ + qh_mark_dupridges(qh newfacet_list, qh_ALL); /* facet_mergeset */ qh_mergecycle_all(qh newfacet_list, &othermerge); qh_forcedmerges(&othermerge /* qh.facet_mergeset */); - FORALLnew_facets { /* test samecycle merges */ - if (!newfacet->simplicial && !newfacet->mergeridge) - qh_degen_redundant_neighbors(newfacet, NULL); - } - if (qh_merge_degenredundant()) - othermerge= True; }else /* qh.hull_dim == 2 */ qh_mergecycle_all(qh newfacet_list, &othermerge); qh_flippedmerges(qh newfacet_list, &othermerge); @@ -86,8 +96,6 @@ qh_getmergeset_initial(qh newfacet_list); qh_all_merges(othermerge, False); } - qh_settempfree(&qh facet_mergeset); - qh_settempfree(&qh degen_mergeset); } /* premerge */ /*-newmerge set qh.newvertext_list to qh.vertex_list add all vertices to qh.newvertex_list - if a pre-merge occured + if a pre-merge occurred set vertex->delridge {will retest the ridge} if qh.MERGEexact call qh_reducevertices() @@ -145,35 +155,29 @@ qh centrum_radius= maxcentrum; qh cos_max= maxangle; qh POSTmerging= True; - qh degen_mergeset= qh_settemp(qh TEMPsize); - qh facet_mergeset= qh_settemp(qh TEMPsize); - if (qh visible_list != qh facet_list) { /* first call */ + if (qh visible_list != qh facet_list) { /* first call due to qh_buildhull, multiple calls if qh.POSTmerge */ qh NEWfacets= True; qh visible_list= qh newfacet_list= qh facet_list; - FORALLnew_facets { + FORALLnew_facets { /* all facets are new facets for qh_postmerge */ newfacet->newfacet= True; if (!newfacet->simplicial) - newfacet->newmerge= True; + newfacet->newmerge= True; /* test f.vertices for 'delridge'. 'newmerge' was cleared at end of qh_all_merges */ zinc_(Zpostfacets); } qh newvertex_list= qh vertex_list; FORALLvertices - vertex->newlist= True; - if (qh VERTEXneighbors) { /* a merge has occurred */ - FORALLvertices - vertex->delridge= True; /* test for redundant, needed? */ - if (qh MERGEexact) { - if (qh hull_dim <= qh_DIMreduceBuild) - qh_reducevertices(); /* was skipped during pre-merging */ - } + vertex->newfacet= True; + if (qh VERTEXneighbors) { /* a merge has occurred */ + if (qh MERGEexact && qh hull_dim <= qh_DIMreduceBuild) + qh_reducevertices(); /* qh_all_merges did not call qh_reducevertices for v.delridge */ } if (!qh PREmerge && !qh MERGEexact) qh_flippedmerges(qh newfacet_list, &othermerges); } qh_getmergeset_initial(qh newfacet_list); - qh_all_merges(False, vneighbors); - qh_settempfree(&qh facet_mergeset); - qh_settempfree(&qh degen_mergeset); + qh_all_merges(False, vneighbors); /* calls qh_reducevertices before exiting */ + FORALLnew_facets + newfacet->newmerge= False; /* Was True if no vertex in f.vertices was 'delridge' */ } /* post_merge */ /*- 0 || qh_setsize(qh degen_mergeset) > 0) { + if (qh_setsize(qh degen_mergeset) > 0) { + numdegenredun += qh_merge_degenredundant(); + wasmerge= True; + } + while ((merge= (mergeT *)qh_setdellast(qh facet_mergeset))) { facet1= merge->facet1; facet2= merge->facet2; - mergetype= merge->type; - qh_memfree_(merge, (int)sizeof(mergeT), freelistp); - if (facet1->visible || facet2->visible) /*deleted facet*/ + vertex= merge->vertex1; /* not used for qh.facet_mergeset*/ + mergetype= merge->mergetype; + angle= merge->angle; + distance= merge->distance; + qh_memfree_(merge, (int)sizeof(mergeT), freelistp); /* 'merge' is invalid */ + if (facet1->visible || facet2->visible) { + trace3((qh ferr, 3045, "qh_all_merges: drop merge of f%d (del? %d) into f%d (del? %d) mergetype %d, dist %4.4g, angle %4.4g. One or both facets is deleted\n", + facet1->id, facet1->visible, facet2->id, facet2->visible, mergetype, distance, angle)); continue; - if ((facet1->newfacet && !facet1->tested) - || (facet2->newfacet && !facet2->tested)) { - if (qh MERGEindependent && mergetype <= MRGanglecoplanar) - continue; /* perform independent sets of merges */ + }else if (mergetype == MRGcoplanar || mergetype == MRGanglecoplanar) { + if (qh MERGEindependent) { + if ((!facet1->tested && facet1->newfacet) + || (!facet2->tested && facet2->newfacet)) { + trace3((qh ferr, 3064, "qh_all_merges: drop merge of f%d (tested? %d) into f%d (tested? %d) mergetype %d, dist %2.2g, angle %4.4g. Merge independent sets of coplanar merges\n", + facet1->id, facet1->visible, facet2->id, facet2->visible, mergetype, distance, angle)); + continue; + } + } } - qh_merge_nonconvex(facet1, facet2, mergetype); - numdegenredun += qh_merge_degenredundant(); + trace3((qh ferr, 3047, "qh_all_merges: merge f%d and f%d type %d dist %2.2g angle %4.4g\n", + facet1->id, facet2->id, mergetype, distance, angle)); + if (mergetype == MRGtwisted) + qh_merge_twisted(facet1, facet2); + else + qh_merge_nonconvex(facet1, facet2, mergetype); numnewmerges++; + numdegenredun += qh_merge_degenredundant(); wasmerge= True; if (mergetype == MRGconcave) numconcave++; - else /* MRGcoplanar or MRGanglecoplanar */ + else if (mergetype == MRGconcavecoplanar) + numconcavecoplanar++; + else if (mergetype == MRGtwisted) + numtwisted++; + else if (mergetype == MRGcoplanar || mergetype == MRGanglecoplanar) numcoplanar++; - } /* while setdellast */ + else { + qh_fprintf(qh ferr, 6394, "qhull internal error (qh_all_merges): expecting concave, coplanar, or twisted merge. Got merge f%d f%d v%d mergetype %d\n", + getid_(facet1), getid_(facet2), getid_(vertex), mergetype); + qh_errexit2(qh_ERRqhull, facet1, facet2); + } + } /* while qh_setdellast */ if (qh POSTmerging && qh hull_dim <= qh_DIMreduceBuild && numnewmerges > qh_MAXnewmerges) { numnewmerges= 0; + wasmerge= othermerge= False; qh_reducevertices(); /* otherwise large post merges too slow */ } - qh_getmergeset(qh newfacet_list); /* facet_mergeset */ - } /* while mergeset */ - if (qh VERTEXneighbors) { + qh_getmergeset(qh newfacet_list); /* qh.facet_mergeset */ + } /* while facet_mergeset or degen_mergeset */ + if (qh VERTEXneighbors) { /* at least one merge */ isreduce= False; - if (qh hull_dim >=4 && qh POSTmerging) { - FORALLvertices - vertex->delridge= True; - isreduce= True; - } - if ((wasmerge || othermerge) && (!qh MERGEexact || qh POSTmerging) - && qh hull_dim <= qh_DIMreduceBuild) { - othermerge= False; + if (qh POSTmerging && qh hull_dim >= 4) { isreduce= True; + }else if (qh POSTmerging || !qh MERGEexact) { + if ((wasmerge || othermerge) && qh hull_dim > 2 && qh hull_dim <= qh_DIMreduceBuild) + isreduce= True; } if (isreduce) { + wasmerge= othermerge= False; if (qh_reducevertices()) { qh_getmergeset(qh newfacet_list); /* facet_mergeset */ continue; @@ -277,6 +313,12 @@ continue; break; } /* while (True) */ + if (wasmerge || othermerge) { + trace3((qh ferr, 3033, "qh_all_merges: skip qh_reducevertices due to post-merging, no qh.VERTEXneighbors (%d), or hull_dim %d ==2 or >%d\n", qh VERTEXneighbors, qh hull_dim, qh_DIMreduceBuild)) + FORALLnew_facets { + newfacet->newmerge= False; + } + } if (qh CHECKfrequently && !qh MERGEexact) { qh old_randomdist= qh RANDOMdist; qh RANDOMdist= False; @@ -284,27 +326,79 @@ /* qh_checkconnect(); [this is slow and it changes the facet order] */ qh RANDOMdist= qh old_randomdist; } - trace1((qh ferr, 1009, "qh_all_merges: merged %d coplanar facets %d concave facets and %d degen or redundant facets.\n", - numcoplanar, numconcave, numdegenredun)); - if (qh IStracing >= 4 && qh num_facets < 50) + trace1((qh ferr, 1009, "qh_all_merges: merged %d coplanar %d concave %d concavecoplanar %d twisted facets and %d degen or redundant facets.\n", + numcoplanar, numconcave, numconcavecoplanar, numtwisted, numdegenredun)); + if (qh IStracing >= 4 && qh num_facets < 500) qh_printlists(); } /* all_merges */ +/*--------------------------------- + + qh_all_vertexmerges( apexpointid, facet, &retryfacet ) + merge vertices in qh.vertex_mergeset and subsequent merges + + returns: + returns retryfacet for facet (if defined) + updates qh.facet_list, qh.num_facets, qh.vertex_list, qh.num_vertices + mergesets are empty + if merges, resets facet lists + + notes: + called from qh_qhull, qh_addpoint, and qh_buildcone_mergepinched + vertex merges occur after facet merges and qh_resetlists + + design: + while merges in vertex_mergeset (MRGvertices) + merge a pair of pinched vertices + update vertex neighbors + merge non-convex and degenerate facets and check for ridges with duplicate vertices + partition outside points of deleted, "visible" facets +*/ +void qh_all_vertexmerges(int apexpointid, facetT *facet, facetT **retryfacet) { + int numpoints; /* ignore count of partitioned points. Used by qh_addpoint for Zpbalance */ + + if (retryfacet) + *retryfacet= facet; + while (qh_setsize(qh vertex_mergeset) > 0) { + trace1((qh ferr, 1057, "qh_all_vertexmerges: starting to merge %d vertex merges for apex p%d facet f%d\n", + qh_setsize(qh vertex_mergeset), apexpointid, getid_(facet))); + if (qh IStracing >= 4 && qh num_facets < 1000) + qh_printlists(); + qh_merge_pinchedvertices(apexpointid /* qh.vertex_mergeset, visible_list, newvertex_list, newfacet_list */); + qh_update_vertexneighbors(); /* update neighbors of qh.newvertex_list from qh_newvertices for deleted facets on qh.visible_list */ + /* test ridges and merge non-convex facets */ + qh_getmergeset(qh newfacet_list); + qh_all_merges(True, False); /* calls qh_reducevertices */ + if (qh CHECKfrequently) + qh_checkpolygon(qh facet_list); + qh_partitionvisible(!qh_ALL, &numpoints /* qh.visible_list qh.del_vertices*/); + if (retryfacet) + *retryfacet= qh_getreplacement(*retryfacet); + qh_deletevisible(/* qh.visible_list qh.del_vertices*/); + qh_resetlists(False, qh_RESETvisible /* qh.visible_list newvertex_list qh.newfacet_list */); + if (qh IStracing >= 4 && qh num_facets < 1000) { + qh_printlists(); + qh_checkpolygon(qh facet_list); + } + } +} /* all_vertexmerges */ /*--------------------------------- - qh_appendmergeset( facet, neighbor, mergetype, angle ) + qh_appendmergeset( facet, vertex, neighbor, mergetype, dist, angle ) appends an entry to qh.facet_mergeset or qh.degen_mergeset - - angle ignored if NULL or !qh.ANGLEmerge + if 'dist' is unknown, set it to 0.0 + if 'angle' is unknown, set it to 1.0 (coplanar) returns: merge appended to facet_mergeset or degen_mergeset sets ->degenerate or ->redundant if degen_mergeset - see: - qh_test_appendmerge() + notes: + caller collects statistics and/or caller of qh_mergefacet + see: qh_test_appendmerge() design: allocate merge entry @@ -313,44 +407,75 @@ else if degenerate merge and qh.facet_mergeset is all degenerate append to qh.degen_mergeset else if degenerate merge - prepend to qh.degen_mergeset + prepend to qh.degen_mergeset (merged last) else if redundant merge append to qh.degen_mergeset */ -void qh_appendmergeset(facetT *facet, facetT *neighbor, mergeType mergetype, realT *angle) { +void qh_appendmergeset(facetT *facet, facetT *neighbor, mergeType mergetype, coordT dist, realT angle) { mergeT *merge, *lastmerge; void **freelistp; /* used if !qh_NOmem by qh_memalloc_() */ + const char *mergename; - if (facet->redundant) + if ((facet->redundant && mergetype != MRGmirror) || neighbor->redundant) { + trace3((qh ferr, 3051, "qh_appendmergeset: f%d is already redundant (%d) or f%d is already redundant (%d). Ignore merge f%d and f%d type %d\n", + facet->id, facet->redundant, neighbor->id, neighbor->redundant, facet->id, neighbor->id, mergetype)); return; - if (facet->degenerate && mergetype == MRGdegen) + } + if (facet->degenerate && mergetype == MRGdegen) { + trace3((qh ferr, 3077, "qh_appendmergeset: f%d is already degenerate. Ignore merge f%d type %d (MRGdegen)\n", + facet->id, facet->id, mergetype)); return; + } + if (!qh facet_mergeset || !qh degen_mergeset) { + qh_fprintf(qh ferr, 6403, "qhull internal error (qh_appendmergeset): expecting temp set defined for qh.facet_mergeset (0x%x) and qh.degen_mergeset (0x%x). Got NULL\n", + qh facet_mergeset, qh degen_mergeset); + /* otherwise qh_setappend creates a new set that is not freed by qh_freebuild() */ + qh_errexit(qh_ERRqhull, NULL, NULL); + } + if (neighbor->flipped && !facet->flipped) { + if (mergetype != MRGdupridge) { + qh_fprintf(qh ferr, 6355, "qhull internal error (qh_appendmergeset): except for MRGdupridge, cannot merge a non-flipped facet f%d into flipped f%d, mergetype %d, dist %4.4g\n", + facet->id, neighbor->id, mergetype, dist); + qh_errexit(qh_ERRqhull, NULL, NULL); + }else { + trace2((qh ferr, 2106, "qh_appendmergeset: dupridge will merge a non-flipped facet f%d into flipped f%d, dist %4.4g\n", + facet->id, neighbor->id, dist)); + } + } qh_memalloc_((int)sizeof(mergeT), freelistp, merge, mergeT); + merge->angle= angle; + merge->distance= dist; merge->facet1= facet; merge->facet2= neighbor; - merge->type= mergetype; - if (angle && qh ANGLEmerge) - merge->angle= *angle; + merge->vertex1= NULL; + merge->vertex2= NULL; + merge->ridge1= NULL; + merge->ridge2= NULL; + merge->mergetype= mergetype; + if(mergetype > 0 && mergetype < sizeof(mergetypes)/sizeof(char *)) + mergename= mergetypes[mergetype]; + else + mergename= mergetypes[MRGnone]; if (mergetype < MRGdegen) qh_setappend(&(qh facet_mergeset), merge); else if (mergetype == MRGdegen) { facet->degenerate= True; - if (!(lastmerge= (mergeT*)qh_setlast(qh degen_mergeset)) - || lastmerge->type == MRGdegen) + if (!(lastmerge= (mergeT *)qh_setlast(qh degen_mergeset)) + || lastmerge->mergetype == MRGdegen) qh_setappend(&(qh degen_mergeset), merge); else - qh_setaddnth(&(qh degen_mergeset), 0, merge); + qh_setaddnth(&(qh degen_mergeset), 0, merge); /* merged last */ }else if (mergetype == MRGredundant) { facet->redundant= True; qh_setappend(&(qh degen_mergeset), merge); }else /* mergetype == MRGmirror */ { if (facet->redundant || neighbor->redundant) { - qh_fprintf(qh ferr, 6092, "qhull error (qh_appendmergeset): facet f%d or f%d is already a mirrored facet\n", + qh_fprintf(qh ferr, 6092, "qhull internal error (qh_appendmergeset): facet f%d or f%d is already a mirrored facet (i.e., 'redundant')\n", facet->id, neighbor->id); qh_errexit2(qh_ERRqhull, facet, neighbor); } if (!qh_setequal(facet->vertices, neighbor->vertices)) { - qh_fprintf(qh ferr, 6093, "qhull error (qh_appendmergeset): mirrored facets f%d and f%d do not have the same vertices\n", + qh_fprintf(qh ferr, 6093, "qhull internal error (qh_appendmergeset): mirrored facets f%d and f%d do not have the same vertices\n", facet->id, neighbor->id); qh_errexit2(qh_ERRqhull, facet, neighbor); } @@ -358,10 +483,69 @@ neighbor->redundant= True; qh_setappend(&(qh degen_mergeset), merge); } + if (merge->mergetype >= MRGdegen) { + trace3((qh ferr, 3044, "qh_appendmergeset: append merge f%d and f%d type %d (%s) to qh.degen_mergeset (size %d)\n", + merge->facet1->id, merge->facet2->id, merge->mergetype, mergename, qh_setsize(qh degen_mergeset))); + }else { + trace3((qh ferr, 3027, "qh_appendmergeset: append merge f%d and f%d type %d (%s) dist %2.2g angle %4.4g to qh.facet_mergeset (size %d)\n", + merge->facet1->id, merge->facet2->id, merge->mergetype, mergename, merge->distance, merge->angle, qh_setsize(qh facet_mergeset))); + } } /* appendmergeset */ /*--------------------------------- + + qh_appendvertexmerge( vertex, vertex2, mergetype, distance, ridge1, ridge2 ) + appends a vertex merge to qh.vertex_mergeset + MRGsubridge includes two ridges (from MRGdupridge) + MRGvertices includes two ridges + + notes: + called by qh_getpinchedmerges for MRGsubridge + called by qh_maybe_duplicateridge and qh_maybe_duplicateridges for MRGvertices + only way to add a vertex merge to qh.vertex_mergeset + checked by qh_next_vertexmerge +*/ +void qh_appendvertexmerge(vertexT *vertex, vertexT *destination, mergeType mergetype, realT distance, ridgeT *ridge1, ridgeT *ridge2) { + mergeT *merge; + void **freelistp; /* used if !qh_NOmem by qh_memalloc_() */ + const char *mergename; + + if (!qh vertex_mergeset) { + qh_fprintf(qh ferr, 6387, "qhull internal error (qh_appendvertexmerge): expecting temp set defined for qh.vertex_mergeset (0x%x). Got NULL\n", + qh vertex_mergeset); + /* otherwise qh_setappend creates a new set that is not freed by qh_freebuild() */ + qh_errexit(qh_ERRqhull, NULL, NULL); + } + qh_memalloc_((int)sizeof(mergeT), freelistp, merge, mergeT); + merge->angle= qh_ANGLEnone; + merge->distance= distance; + merge->facet1= NULL; + merge->facet2= NULL; + merge->vertex1= vertex; + merge->vertex2= destination; + merge->ridge1= ridge1; + merge->ridge2= ridge2; + merge->mergetype= mergetype; + if(mergetype > 0 && mergetype < sizeof(mergetypes)/sizeof(char *)) + mergename= mergetypes[mergetype]; + else + mergename= mergetypes[MRGnone]; + if (mergetype == MRGvertices) { + if (!ridge1 || !ridge2 || ridge1 == ridge2) { + qh_fprintf(qh ferr, 6106, "qhull internal error (qh_appendvertexmerge): expecting two distinct ridges for MRGvertices. Got r%d r%d\n", + getid_(ridge1), getid_(ridge2)); + qh_errexit(qh_ERRqhull, NULL, ridge1); + } + } + qh_setappend(&(qh vertex_mergeset), merge); + trace3((qh ferr, 3034, "qh_appendvertexmerge: append merge v%d into v%d r%d r%d dist %2.2g type %d (%s)\n", + vertex->id, destination->id, getid_(ridge1), getid_(ridge2), distance, merge->mergetype, mergename)); +} /* appendvertexmerge */ + + +/*--------------------------------- qh_basevertices( samecycle ) @@ -405,9 +589,59 @@ } /* basevertices */ /*--------------------------------- + + qh_check_dupridge( facet1, dist1, facet2, dist2 ) + Check dupridge between facet1 and facet2 for wide merge + dist1 is the maximum distance of facet1's vertices to facet2 + dist2 is the maximum distance of facet2's vertices to facet1 + + returns + Level 1 log of the dupridge with the minimum distance between vertices + Throws error if the merge will increase the maximum facet width by qh_WIDEduplicate (100x) + + notes: + only called from qh_forcedmerges +*/ +void qh_check_dupridge(facetT *facet1, realT dist1, facetT *facet2, realT dist2) { + vertexT *vertex, **vertexp, *vertexA, **vertexAp; + realT dist, innerplane, mergedist, outerplane, prevdist, ratio, vertexratio; + realT minvertex= REALmax; + + mergedist= fmin_(dist1, dist2); + qh_outerinner(NULL, &outerplane, &innerplane); /* ratio from qh_printsummary */ + FOREACHvertex_(facet1->vertices) { /* The dupridge is between facet1 and facet2, so either facet can be tested */ + FOREACHvertexA_(facet1->vertices) { + if (vertex > vertexA){ /* Test each pair once */ + dist= qh_pointdist(vertex->point, vertexA->point, qh hull_dim); + minimize_(minvertex, dist); + /* Not quite correct. A facet may have a dupridge and another pair of nearly adjacent vertices. */ + } + } + } + prevdist= fmax_(outerplane, innerplane); + maximize_(prevdist, qh ONEmerge + qh DISTround); + maximize_(prevdist, qh MINoutside + qh DISTround); + ratio= mergedist/prevdist; + vertexratio= minvertex/prevdist; + trace0((qh ferr, 16, "qh_check_dupridge: dupridge between f%d and f%d (vertex dist %2.2g), dist %2.2g, reverse dist %2.2g, ratio %2.2g while processing p%d\n", + facet1->id, facet2->id, minvertex, dist1, dist2, ratio, qh furthest_id)); + if (ratio > qh_WIDEduplicate) { + qh_fprintf(qh ferr, 6271, "qhull topology error (qh_check_dupridge): wide merge (%.1fx wider) due to dupridge between f%d and f%d (vertex dist %2.2g), merge dist %2.2g, while processing p%d\n- Allow error with option 'Q12'\n", + ratio, facet1->id, facet2->id, minvertex, mergedist, qh furthest_id); + if (vertexratio < qh_WIDEpinched) + qh_fprintf(qh ferr, 8145, "- Experimental option merge-pinched-vertices ('Q14') may avoid this error. It merges nearly adjacent vertices.\n"); + if (qh DELAUNAY) + qh_fprintf(qh ferr, 8145, "- A bounding box for the input sites may alleviate this error.\n"); + if (!qh ALLOWwide) + qh_errexit2(qh_ERRwide, facet1, facet2); + } +} /* check_dupridge */ + +/*--------------------------------- - qh_checkconnect() + qh_checkconnect( ) check that new facets are connected new facets are on qh.newfacet_list @@ -441,7 +675,7 @@ FORALLnew_facets { if (newfacet->visitid == qh visit_id) break; - qh_fprintf(qh ferr, 6094, "qhull error: f%d is not attached to the new facets\n", + qh_fprintf(qh ferr, 6094, "qhull internal error (qh_checkconnect): f%d is not attached to the new facets\n", newfacet->id); errfacet= newfacet; } @@ -450,6 +684,68 @@ } /* checkconnect */ /*--------------------------------- + + qh_checkdelfacet( facet, mergeset ) + check that mergeset does not reference facet + +*/ +void qh_checkdelfacet(facetT *facet, setT *mergeset) { + mergeT *merge, **mergep; + + FOREACHmerge_(mergeset) { + if (merge->facet1 == facet || merge->facet2 == facet) { + qh_fprintf(qh ferr, 6390, "qhull internal error (qh_checkdelfacet): cannot delete f%d. It is referenced by merge f%d f%d mergetype %d\n", + facet->id, merge->facet1->id, getid_(merge->facet2), merge->mergetype); + qh_errexit2(qh_ERRqhull, merge->facet1, merge->facet2); + } + } +} /* checkdelfacet */ + +/*--------------------------------- + + qh_checkdelridge( ) + check that qh_delridge_merge is not needed for deleted ridges + + notes: + called from qh_mergecycle, qh_makenewfacets, qh_attachnewfacets + errors if qh.vertex_mergeset is non-empty + errors if any visible or new facet has a ridge with r.nonconvex set + assumes that vertex.delfacet is not needed +*/ +void qh_checkdelridge(void /* qh.visible_facets, vertex_mergeset */) { + facetT *newfacet, *visible; + ridgeT *ridge, **ridgep; + + if (!SETempty_(qh vertex_mergeset)) { + qh_fprintf(qh ferr, 6382, "qhull internal error (qh_checkdelridge): expecting empty qh.vertex_mergeset in order to avoid calling qh_delridge_merge. Got %d merges\n", qh_setsize(qh vertex_mergeset)); + qh_errexit(qh_ERRqhull, NULL, NULL); + } + + FORALLnew_facets { + FOREACHridge_(newfacet->ridges) { + if (ridge->nonconvex) { + qh_fprintf(qh ferr, 6313, "qhull internal error (qh_checkdelridge): unexpected 'nonconvex' flag for ridge r%d in newfacet f%d. Otherwise need to call qh_delridge_merge\n", + ridge->id, newfacet->id); + qh_errexit(qh_ERRqhull, newfacet, ridge); + } + } + } + + FORALLvisible_facets { + FOREACHridge_(visible->ridges) { + if (ridge->nonconvex) { + qh_fprintf(qh ferr, 6385, "qhull internal error (qh_checkdelridge): unexpected 'nonconvex' flag for ridge r%d in visible facet f%d. Otherwise need to call qh_delridge_merge\n", + ridge->id, visible->id); + qh_errexit(qh_ERRqhull, visible, ridge); + } + } + } +} /* checkdelridge */ + + +/*--------------------------------- qh_checkzero( testall ) @@ -472,6 +768,7 @@ clears qh.ZEROall_ok if any problems or coplanar facets notes: + called by qh_premerge (qh.CHECKzero, 'C-0') and qh_qhull ('Qx') uses qh.vertex_visit horizon facets may define multiple new facets @@ -486,9 +783,9 @@ test the other vertices in the facet's horizon facet */ boolT qh_checkzero(boolT testall) { - facetT *facet, *neighbor, **neighborp; + facetT *facet, *neighbor; facetT *horizon, *facetlist; - int neighbor_i; + int neighbor_i, neighbor_n; vertexT *vertex, **vertexp; realT dist; @@ -510,19 +807,17 @@ } FORALLfacet_(facetlist) { qh vertex_visit++; - neighbor_i= 0; horizon= NULL; - FOREACHneighbor_(facet) { + FOREACHneighbor_i_(facet) { if (!neighbor_i && !testall) { horizon= neighbor; - neighbor_i++; continue; /* horizon facet tested in qh_findhorizon */ } - vertex= SETelemt_(facet->vertices, neighbor_i++, vertexT); + vertex= SETelemt_(facet->vertices, neighbor_i, vertexT); vertex->visitid= qh vertex_visit; zzinc_(Zdistzero); qh_distplane(vertex->point, neighbor, &dist); - if (dist >= -qh DISTround) { + if (dist >= -2 * qh DISTround) { /* need 2x for qh_distround and 'Rn' for qh_checkconvex, same as qh.premerge_centrum */ qh ZEROall_ok= False; if (!qh MERGEexact || testall || dist > qh DISTround) goto LABELnonconvex; @@ -533,10 +828,10 @@ if (vertex->visitid != qh vertex_visit) { zzinc_(Zdistzero); qh_distplane(vertex->point, facet, &dist); - if (dist >= -qh DISTround) { + if (dist >= -2 * qh DISTround) { qh ZEROall_ok= False; if (!qh MERGEexact || dist > qh DISTround) - goto LABELnonconvex; + goto LABELnonconvexhorizon; } break; } @@ -545,55 +840,84 @@ } trace2((qh ferr, 2012, "qh_checkzero: testall %d, facets are %s\n", testall, (qh MERGEexact && !testall) ? - "not concave, flipped, or duplicate ridged" : "clearly convex")); + "not concave, flipped, or dupridge" : "clearly convex")); return True; LABELproblem: qh ZEROall_ok= False; - trace2((qh ferr, 2013, "qh_checkzero: facet f%d needs pre-merging\n", - facet->id)); + trace2((qh ferr, 2013, "qh_checkzero: qh_premerge is needed. New facet f%d or its horizon f%d is non-simplicial, flipped, dupridge, or mergehorizon\n", + facet->id, horizon->id)); return False; LABELnonconvex: trace2((qh ferr, 2014, "qh_checkzero: facet f%d and f%d are not clearly convex. v%d dist %.2g\n", facet->id, neighbor->id, vertex->id, dist)); return False; + + LABELnonconvexhorizon: + trace2((qh ferr, 2060, "qh_checkzero: facet f%d and horizon f%d are not clearly convex. v%d dist %.2g\n", + facet->id, horizon->id, vertex->id, dist)); + return False; } /* checkzero */ /*--------------------------------- + >-------------------------------- + + qh_compare_anglemerge( mergeA, mergeB ) + used by qsort() to order qh.facet_mergeset by mergetype and angle (qh.ANGLEmerge, 'Q1') + lower numbered mergetypes done first (MRGcoplanar before MRGconcave) - qh_compareangle( angle1, angle2 ) - used by qsort() to order merges by angle + notes: + qh_all_merges processes qh.facet_mergeset by qh_setdellast + [mar'19] evaluated various options with eg/q_benchmark and merging of pinched vertices (Q14) */ -int qh_compareangle(const void *p1, const void *p2) { +int qh_compare_anglemerge(const void *p1, const void *p2) { const mergeT *a= *((mergeT *const*)p1), *b= *((mergeT *const*)p2); - return((a->angle > b->angle) ? 1 : -1); -} /* compareangle */ + if (a->mergetype != b->mergetype) + return (a->mergetype < b->mergetype ? 1 : -1); /* select MRGcoplanar (1) before MRGconcave (3) */ + else + return (a->angle > b->angle ? 1 : -1); /* select coplanar merge (1.0) before sharp merge (-0.5) */ +} /* compare_anglemerge */ /*--------------------------------- + >-------------------------------- - qh_comparemerge( merge1, merge2 ) - used by qsort() to order merges + qh_compare_facetmerge( mergeA, mergeB ) + used by qsort() to order merges by mergetype, first merge, first + lower numbered mergetypes done first (MRGcoplanar before MRGconcave) + if same merge type, flat merges are first + + notes: + qh_all_merges processes qh.facet_mergeset by qh_setdellast + [mar'19] evaluated various options with eg/q_benchmark and merging of pinched vertices (Q14) */ -int qh_comparemerge(const void *p1, const void *p2) { +int qh_compare_facetmerge(const void *p1, const void *p2) { const mergeT *a= *((mergeT *const*)p1), *b= *((mergeT *const*)p2); - return(a->type - b->type); -} /* comparemerge */ + if (a->mergetype != b->mergetype) + return (a->mergetype < b->mergetype ? 1 : -1); /* select MRGcoplanar (1) before MRGconcave (3) */ + else if (a->mergetype == MRGanglecoplanar) + return (a->angle > b->angle ? 1 : -1); /* if MRGanglecoplanar, select coplanar merge (1.0) before sharp merge (-0.5) */ + else + return (a->distance < b->distance ? 1 : -1); /* select flat (0.0) merge before wide (1e-10) merge */ +} /* compare_facetmerge */ /*--------------------------------- - qh_comparevisit( vertex1, vertex2 ) + qh_comparevisit( vertexA, vertexB ) used by qsort() to order vertices by their visitid + + notes: + only called by qh_find_newvertex */ int qh_comparevisit(const void *p1, const void *p2) { const vertexT *a= *((vertexT *const*)p1), *b= *((vertexT *const*)p2); - return(a->visitid - b->visitid); + if (a->visitid > b->visitid) + return 1; + return -1; } /* comparevisit */ /*-top; otherfacet= atridge->bottom; + atridge->nonconvex= False; FOREACHridge_(facet->ridges) { - if (otherfacet == otherfacet_(ridge, facet) && ridge != atridge) { - ridge->nonconvex= True; - trace4((qh ferr, 4020, "qh_copynonconvex: moved nonconvex flag from r%d to r%d\n", - atridge->id, ridge->id)); - break; + if (otherfacet == ridge->top || otherfacet == ridge->bottom) { + if (ridge != atridge) { + ridge->nonconvex= True; + trace4((qh ferr, 4020, "qh_copynonconvex: moved nonconvex flag from r%d to r%d between f%d and f%d\n", + atridge->id, ridge->id, facet->id, otherfacet->id)); + break; + } } } } /* copynonconvex */ @@ -630,15 +957,14 @@ >-------------------------------- qh_degen_redundant_facet( facet ) - check facet for degen. or redundancy + check for a degenerate (too few neighbors) or redundant (subset of vertices) facet notes: + called at end of qh_mergefacet, qh_renamevertex, and qh_reducevertices bumps vertex_visit called if a facet was redundant but no longer is (qh_merge_degenredundant) qh_appendmergeset() only appends first reference to facet (i.e., redundant) - - see: - qh_degen_redundant_neighbors() + see: qh_test_redundant_neighbors, qh_maydropneighbor design: test for redundant neighbor @@ -648,9 +974,20 @@ vertexT *vertex, **vertexp; facetT *neighbor, **neighborp; - trace4((qh ferr, 4021, "qh_degen_redundant_facet: test facet f%d for degen/redundant\n", + trace3((qh ferr, 3028, "qh_degen_redundant_facet: test facet f%d for degen/redundant\n", facet->id)); + if (facet->flipped) { + trace2((qh ferr, 3074, "qh_degen_redundant_facet: f%d is flipped, will merge later\n", facet->id)); + return; + } FOREACHneighbor_(facet) { + if (neighbor->flipped) /* disallow merge of non-flipped into flipped, neighbor will be merged later */ + continue; + if (neighbor->visible) { + qh_fprintf(qh ferr, 6357, "qhull internal error (qh_degen_redundant_facet): facet f%d has deleted neighbor f%d (qh.visible_list)\n", + facet->id, neighbor->id); + qh_errexit2(qh_ERRqhull, facet, neighbor); + } qh vertex_visit++; FOREACHvertex_(neighbor->vertices) vertex->visitid= qh vertex_visit; @@ -659,88 +996,84 @@ break; } if (!vertex) { - qh_appendmergeset(facet, neighbor, MRGredundant, NULL); trace2((qh ferr, 2015, "qh_degen_redundant_facet: f%d is contained in f%d. merge\n", facet->id, neighbor->id)); + qh_appendmergeset(facet, neighbor, MRGredundant, 0.0, 1.0); return; } } if (qh_setsize(facet->neighbors) < qh hull_dim) { - qh_appendmergeset(facet, facet, MRGdegen, NULL); - trace2((qh ferr, 2016, "qh_degen_redundant_neighbors: f%d is degenerate.\n", facet->id)); + qh_appendmergeset(facet, facet, MRGdegen, 0.0, 1.0); + trace2((qh ferr, 2016, "qh_degen_redundant_facet: f%d is degenerate.\n", facet->id)); } } /* degen_redundant_facet */ /*--------------------------------- + >-------------------------------- - qh_degen_redundant_neighbors( facet, delfacet, ) - append degenerate and redundant neighbors to facet_mergeset - if delfacet, - only checks neighbors of both delfacet and facet - also checks current facet for degeneracy + qh_delridge_merge( ridge ) + delete ridge due to a merge notes: - bumps vertex_visit - called for each qh_mergefacet() and qh_mergecycle() - merge and statistics occur in merge_nonconvex - qh_appendmergeset() only appends first reference to facet (i.e., redundant) - it appends redundant facets after degenerate ones - - a degenerate facet has fewer than hull_dim neighbors - a redundant facet's vertices is a subset of its neighbor's vertices - tests for redundant merges first (appendmergeset is nop for others) - in a merge, only needs to test neighbors of merged facet - - see: - qh_merge_degenredundant() and qh_degen_redundant_facet() + only called by merge.c (qh_mergeridges, qh_renameridgevertex) + ridges also freed in qh_freeqhull and qh_mergecycle_ridges design: - test for degenerate facet - test for redundant neighbor - test for degenerate neighbor + if needed, moves ridge.nonconvex to another ridge + sets vertex.delridge for qh_reducevertices + deletes ridge from qh.vertex_mergeset + deletes ridge from its neighboring facets + frees up its memory */ -void qh_degen_redundant_neighbors(facetT *facet, facetT *delfacet) { +void qh_delridge_merge(ridgeT *ridge) { vertexT *vertex, **vertexp; - facetT *neighbor, **neighborp; - int size; + mergeT *merge; + int merge_i, merge_n; - trace4((qh ferr, 4022, "qh_degen_redundant_neighbors: test neighbors of f%d with delfacet f%d\n", - facet->id, getid_(delfacet))); - if ((size= qh_setsize(facet->neighbors)) < qh hull_dim) { - qh_appendmergeset(facet, facet, MRGdegen, NULL); - trace2((qh ferr, 2017, "qh_degen_redundant_neighbors: f%d is degenerate with %d neighbors.\n", facet->id, size)); - } - if (!delfacet) - delfacet= facet; - qh vertex_visit++; - FOREACHvertex_(facet->vertices) - vertex->visitid= qh vertex_visit; - FOREACHneighbor_(delfacet) { - /* uses early out instead of checking vertex count */ - if (neighbor == facet) - continue; - FOREACHvertex_(neighbor->vertices) { - if (vertex->visitid != qh vertex_visit) - break; - } - if (!vertex) { - qh_appendmergeset(neighbor, facet, MRGredundant, NULL); - trace2((qh ferr, 2018, "qh_degen_redundant_neighbors: f%d is contained in f%d. merge\n", neighbor->id, facet->id)); - } - } - FOREACHneighbor_(delfacet) { /* redundant merges occur first */ - if (neighbor == facet) - continue; - if ((size= qh_setsize(neighbor->neighbors)) < qh hull_dim) { - qh_appendmergeset(neighbor, neighbor, MRGdegen, NULL); - trace2((qh ferr, 2019, "qh_degen_redundant_neighbors: f%d is degenerate with %d neighbors. Neighbor of f%d.\n", neighbor->id, size, facet->id)); + trace3((qh ferr, 3036, "qh_delridge_merge: delete ridge r%d between f%d and f%d\n", + ridge->id, ridge->top->id, ridge->bottom->id)); + if (ridge->nonconvex) + qh_copynonconvex(ridge); + FOREACHvertex_(ridge->vertices) + vertex->delridge= True; + FOREACHmerge_i_(qh vertex_mergeset) { + if (merge->ridge1 == ridge || merge->ridge2 == ridge) { + trace3((qh ferr, 3029, "qh_delridge_merge: drop merge of v%d into v%d (dist %2.2g r%d r%d) due to deleted, duplicated ridge r%d\n", + merge->vertex1->id, merge->vertex2->id, merge->distance, merge->ridge1->id, merge->ridge2->id, ridge->id)); + if (merge->ridge1 == ridge) + merge->ridge2->mergevertex= False; + else + merge->ridge1->mergevertex= False; + qh_setdelnth(qh vertex_mergeset, merge_i); + merge_i--; merge_n--; /* next merge after deleted */ } } -} /* degen_redundant_neighbors */ + qh_setdel(ridge->top->ridges, ridge); + qh_setdel(ridge->bottom->ridges, ridge); + qh_delridge(ridge); +} /* delridge_merge */ /*--------------------------------- + + qh_drop_mergevertex( merge ) + + clear mergevertex flags for ridges of a vertex merge +*/ +void qh_drop_mergevertex(mergeT *merge) +{ + if (merge->mergetype == MRGvertices) { + merge->ridge1->mergevertex= False; + merge->ridge1->mergevertex2= True; + merge->ridge2->mergevertex= False; + merge->ridge2->mergevertex2= True; + trace3((qh ferr, 3032, "qh_drop_mergevertex: unset mergevertex for r%d and r%d due to dropped vertex merge v%d to v%d. Sets mergevertex2\n", + merge->ridge1->id, merge->ridge2->id, merge->vertex1->id, merge->vertex2->id)); + } +} /* drop_mergevertex */ + +/*--------------------------------- qh_find_newvertex( oldvertex, vertices, ridges ) @@ -750,11 +1083,14 @@ returns: newvertex or NULL - each ridge includes both vertex and oldvertex - vertices sorted by number of deleted ridges + each ridge includes both newvertex and oldvertex + vertices without oldvertex sorted by number of deleted ridges + qh.vertex_visit updated + sets v.seen notes: - modifies vertex->visitid + called by qh_redundant_vertex due to vertex->delridge and qh_rename_sharedvertex + sets vertex->visitid to 0..setsize() for vertices new vertex is in one of the ridges renaming will not cause a duplicate ridge renaming will minimize the number of deleted ridges @@ -762,13 +1098,13 @@ design: for each vertex in vertices - set vertex->visitid to number of references in ridges + set vertex->visitid to number of ridges remove unvisited vertices set qh.vertex_visit above all possible values - sort vertices by number of references in ridges + sort vertices by number of ridges (minimize ridges that need renaming add each ridge to qh.hash_table for each vertex in vertices - look for a vertex that would not cause a duplicate ridge after a rename + find the first vertex that would not cause a duplicate ridge after a rename */ vertexT *qh_find_newvertex(vertexT *oldvertex, setT *vertices, setT *ridges) { vertexT *vertex, **vertexp; @@ -776,6 +1112,7 @@ ridgeT *ridge, **ridgep; int size, hashsize; int hash; + unsigned int maxvisit; #ifndef qh_NOtrace if (qh IStracing >= 4) { @@ -788,11 +1125,19 @@ qh_fprintf(qh ferr, 8066, "\n"); } #endif - FOREACHvertex_(vertices) - vertex->visitid= 0; FOREACHridge_(ridges) { FOREACHvertex_(ridge->vertices) - vertex->visitid++; + vertex->seen= False; + } + FOREACHvertex_(vertices) { + vertex->visitid= 0; /* v.visitid will be number of ridges */ + vertex->seen= True; + } + FOREACHridge_(ridges) { + FOREACHvertex_(ridge->vertices) { + if (vertex->seen) + vertex->visitid++; + } } FOREACHvertex_(vertices) { if (!vertex->visitid) { @@ -800,7 +1145,8 @@ vertexp--; /* repeat since deleted this vertex */ } } - qh vertex_visit += (unsigned int)qh_setsize(ridges); + maxvisit= (unsigned int)qh_setsize(ridges); + maximize_(qh vertex_visit, maxvisit); if (!qh_setsize(vertices)) { trace4((qh ferr, 4023, "qh_find_newvertex: vertices not in ridges for v%d\n", oldvertex->id)); @@ -819,10 +1165,10 @@ FOREACHridge_(ridges) qh_hashridge(qh hash_table, hashsize, ridge, oldvertex); FOREACHvertex_(vertices) { - newridges= qh_vertexridges(vertex); + newridges= qh_vertexridges(vertex, !qh_ALL); FOREACHridge_(newridges) { if (qh_hashridge_find(qh hash_table, hashsize, ridge, vertex, oldvertex, &hash)) { - zinc_(Zdupridge); + zinc_(Zvertexridge); break; } } @@ -836,31 +1182,163 @@ vertex->id, oldvertex->id, qh_setsize(vertices), qh_setsize(ridges))); }else { zinc_(Zfindfail); - trace0((qh ferr, 14, "qh_find_newvertex: no vertex for renaming v%d(all duplicated ridges) during p%d\n", + trace0((qh ferr, 14, "qh_find_newvertex: no vertex for renaming v%d (all duplicated ridges) during p%d\n", oldvertex->id, qh furthest_id)); } qh_setfree(&qh hash_table); return vertex; } /* find_newvertex */ +/*--------------------------------- + + qh_findbest_pinchedvertex( merge, apex, nearestp, distp ) + Determine the best pinched vertex to rename as its nearest neighboring vertex + Renaming will remove a duplicate MRGdupridge in newfacet_list + + returns: + pinched vertex (either apex or subridge), nearest vertex (subridge or neighbor vertex), and the distance between them + + notes: + only called by qh_getpinchedmerges + assumes qh.VERTEXneighbors + see qh_findbest_ridgevertex + + design: + if the facets have the same vertices + return the nearest vertex pair + else + the subridge is the intersection of the two new facets minus the apex + the subridge consists of qh.hull_dim-2 horizon vertices + the subridge is also a matched ridge for the new facets (its duplicate) + determine the nearest vertex to the apex + determine the nearest pair of subridge vertices + for each vertex in the subridge + determine the nearest neighbor vertex (not in the subridge) +*/ +vertexT *qh_findbest_pinchedvertex(mergeT *merge, vertexT *apex, vertexT **nearestp, coordT *distp /* qh.newfacet_list */) { + vertexT *vertex, **vertexp, *vertexA, **vertexAp; + vertexT *bestvertex= NULL, *bestpinched= NULL; + setT *subridge, *maybepinched; + coordT dist, bestdist= REALmax; + coordT pincheddist= (qh ONEmerge+qh DISTround)*qh_RATIOpinchedsubridge; + + if (!merge->facet1->simplicial || !merge->facet2->simplicial) { + qh_fprintf(qh ferr, 6351, "qhull internal error (qh_findbest_pinchedvertex): expecting merge of adjacent, simplicial new facets. f%d or f%d is not simplicial\n", + merge->facet1->id, merge->facet2->id); + qh_errexit2(qh_ERRqhull, merge->facet1, merge->facet2); + } + subridge= qh_vertexintersect_new(merge->facet1->vertices, merge->facet2->vertices); /* new setT. No error_exit() */ + if (qh_setsize(subridge) == qh hull_dim) { /* duplicate vertices */ + bestdist= qh_vertex_bestdist2(subridge, &bestvertex, &bestpinched); + if(bestvertex == apex) { + bestvertex= bestpinched; + bestpinched= apex; + } + }else { + qh_setdel(subridge, apex); + if (qh_setsize(subridge) != qh hull_dim - 2) { + qh_fprintf(qh ferr, 6409, "qhull internal error (qh_findbest_pinchedvertex): expecting subridge of qh.hull_dim-2 vertices for the intersection of new facets f%d and f%d minus their apex. Got %d vertices\n", + merge->facet1->id, merge->facet2->id, qh_setsize(subridge)); + qh_errexit2(qh_ERRqhull, merge->facet1, merge->facet2); + } + FOREACHvertex_(subridge) { + dist= qh_pointdist(vertex->point, apex->point, qh hull_dim); + if (dist < bestdist) { + bestpinched= apex; + bestvertex= vertex; + bestdist= dist; + } + } + if (bestdist > pincheddist) { + FOREACHvertex_(subridge) { + FOREACHvertexA_(subridge) { + if (vertexA->id > vertex->id) { /* once per vertex pair, do not compare addresses */ + dist= qh_pointdist(vertexA->point, vertex->point, qh hull_dim); + if (dist < bestdist) { + bestpinched= vertexA; + bestvertex= vertex; + bestdist= dist; + } + } + } + } + } + if (bestdist > pincheddist) { + FOREACHvertexA_(subridge) { + maybepinched= qh_neighbor_vertices(vertexA, subridge); /* subridge and apex tested above */ + FOREACHvertex_(maybepinched) { + dist= qh_pointdist(vertex->point, vertexA->point, qh hull_dim); + if (dist < bestdist) { + bestvertex= vertex; + bestpinched= vertexA; + bestdist= dist; + } + } + qh_settempfree(&maybepinched); + } + } + } + *distp= bestdist; + qh_setfree(&subridge); /* qh_err_exit not called since allocated */ + if (!bestvertex) { /* should never happen if qh.hull_dim > 2 */ + qh_fprintf(qh ferr, 6274, "qhull internal error (qh_findbest_pinchedvertex): did not find best vertex for subridge of dupridge between f%d and f%d, while processing p%d\n", merge->facet1->id, merge->facet2->id, qh furthest_id); + qh_errexit2(qh_ERRqhull, merge->facet1, merge->facet2); + } + *nearestp= bestvertex; + trace2((qh ferr, 2061, "qh_findbest_pinchedvertex: best pinched p%d(v%d) and vertex p%d(v%d) are closest (%2.2g) for duplicate subridge between f%d and f%d\n", + qh_pointid(bestpinched->point), bestpinched->id, qh_pointid(bestvertex->point), bestvertex->id, bestdist, merge->facet1->id, merge->facet2->id)); + return bestpinched; +} /* findbest_pinchedvertex */ + +/*--------------------------------- + + qh_findbest_ridgevertex( ridge, pinchedp, distp ) + Determine the best vertex/pinched-vertex to merge for ridges with the same vertices + + returns: + vertex, pinched vertex, and the distance between them + + notes: + assumes qh.hull_dim>=3 + see qh_findbest_pinchedvertex + +*/ +vertexT *qh_findbest_ridgevertex(ridgeT *ridge, vertexT **pinchedp, coordT *distp) { + vertexT *bestvertex; + + *distp= qh_vertex_bestdist2(ridge->vertices, &bestvertex, pinchedp); + trace4((qh ferr, 4069, "qh_findbest_ridgevertex: best pinched p%d(v%d) and vertex p%d(v%d) are closest (%2.2g) for duplicated ridge r%d (same vertices) between f%d and f%d\n", + qh_pointid((*pinchedp)->point), (*pinchedp)->id, qh_pointid(bestvertex->point), bestvertex->id, *distp, ridge->id, ridge->top->id, ridge->bottom->id)); + return bestvertex; +} /* findbest_ridgevertex */ + /*--------------------------------- - qh_findbest_test( testcentrum, facet, neighbor, bestfacet, dist, mindist, maxdist ) + qh_findbest_test( testcentrum, facet, neighbor, &bestfacet, &dist, &mindist, &maxdist ) test neighbor of facet for qh_findbestneighbor() if testcentrum, tests centrum (assumes it is defined) else tests vertices + initially *bestfacet==NULL and *dist==REALmax returns: if a better facet (i.e., vertices/centrum of facet closer to neighbor) updates bestfacet, dist, mindist, and maxdist + + notes: + called by qh_findbestneighbor + ignores pairs of flipped facets, unless that's all there is */ void qh_findbest_test(boolT testcentrum, facetT *facet, facetT *neighbor, facetT **bestfacet, realT *distp, realT *mindistp, realT *maxdistp) { realT dist, mindist, maxdist; + if (facet->flipped && neighbor->flipped && *bestfacet && !(*bestfacet)->flipped) + return; /* do not merge flipped into flipped facets */ if (testcentrum) { zzinc_(Zbestdist); qh_distplane(facet->center, neighbor, &dist); @@ -917,7 +1395,7 @@ int size= qh_setsize(facet->vertices); if(qh CENTERtype==qh_ASvoronoi){ - qh_fprintf(qh ferr, 6272, "qhull error: cannot call qh_findbestneighor for f%d while qh.CENTERtype is qh_ASvoronoi\n", facet->id); + qh_fprintf(qh ferr, 6272, "qhull internal error: cannot call qh_findbestneighor for f%d while qh.CENTERtype is qh_ASvoronoi\n", facet->id); qh_errexit(qh_ERRqhull, facet, NULL); } *distp= REALmax; @@ -944,7 +1422,6 @@ } if (!bestfacet) { qh_fprintf(qh ferr, 6095, "qhull internal error (qh_findbestneighbor): no neighbors for f%d\n", facet->id); - qh_errexit(qh_ERRqhull, facet, NULL); } if (testcentrum) @@ -984,44 +1461,50 @@ realT dist, mindist, maxdist; mergeT *merge, **mergep; setT *othermerges; - int nummerge=0; + int nummerge= 0, numdegen= 0; trace4((qh ferr, 4024, "qh_flippedmerges: begin\n")); FORALLfacet_(facetlist) { if (facet->flipped && !facet->visible) - qh_appendmergeset(facet, facet, MRGflip, NULL); + qh_appendmergeset(facet, facet, MRGflip, 0.0, 1.0); + } + othermerges= qh_settemppop(); + if(othermerges != qh facet_mergeset) { + qh_fprintf(qh ferr, 6392, "qhull internal error (qh_flippedmerges): facet_mergeset (%d merges) not at top of tempstack (%d merges)\n", + qh_setsize(qh facet_mergeset), qh_setsize(othermerges)); + qh_errexit(qh_ERRqhull, NULL, NULL); } - othermerges= qh_settemppop(); /* was facet_mergeset */ qh facet_mergeset= qh_settemp(qh TEMPsize); qh_settemppush(othermerges); FOREACHmerge_(othermerges) { facet1= merge->facet1; - if (merge->type != MRGflip || facet1->visible) + if (merge->mergetype != MRGflip || facet1->visible) continue; if (qh TRACEmerge-1 == zzval_(Ztotmerge)) qhmem.IStracing= qh IStracing= qh TRACElevel; neighbor= qh_findbestneighbor(facet1, &dist, &mindist, &maxdist); trace0((qh ferr, 15, "qh_flippedmerges: merge flipped f%d into f%d dist %2.2g during p%d\n", facet1->id, neighbor->id, dist, qh furthest_id)); - qh_mergefacet(facet1, neighbor, &mindist, &maxdist, !qh_MERGEapex); + qh_mergefacet(facet1, neighbor, merge->mergetype, &mindist, &maxdist, !qh_MERGEapex); nummerge++; if (qh PRINTstatistics) { zinc_(Zflipped); wadd_(Wflippedtot, dist); wmax_(Wflippedmax, dist); } - qh_merge_degenredundant(); } FOREACHmerge_(othermerges) { if (merge->facet1->visible || merge->facet2->visible) - qh_memfree(merge, (int)sizeof(mergeT)); + qh_memfree(merge, (int)sizeof(mergeT)); /* invalidates merge and othermerges */ else qh_setappend(&qh facet_mergeset, merge); } qh_settempfree(&othermerges); + numdegen += qh_merge_degenredundant(); /* somewhat better here than after each flipped merge -- qtest.sh 10 '500 C1,2e-13 D4' 'd Qbb' */ if (nummerge) *wasmerge= True; - trace1((qh ferr, 1010, "qh_flippedmerges: merged %d flipped facets into a good neighbor\n", nummerge)); + trace1((qh ferr, 1010, "qh_flippedmerges: merged %d flipped and %d degenredundant facets into a good neighbor\n", + nummerge, numdegen)); } /* flippedmerges */ @@ -1029,16 +1512,19 @@ >-------------------------------- qh_forcedmerges( wasmerge ) - merge duplicated ridges + merge dupridges + calls qh_check_dupridge to report an error on wide merges + assumes qh_settemppop is qh.facet_mergeset returns: - removes all duplicate ridges on facet_mergeset + removes all dupridges on facet_mergeset wasmerge set if merge qh.facet_mergeset may include non-forced merges(none for now) qh.degen_mergeset includes degen/redun merges notes: - duplicate ridges occur when the horizon is pinched, + called by qh_premerge + dupridges occur when the horizon is pinched, i.e. a subridge occurs in more than two horizon ridges. could rename vertices that pinch the horizon assumes qh_merge_degenredundant() has not be called @@ -1046,54 +1532,75 @@ keep it in case of change design: - for each duplicate ridge + for each dupridge find current facets by chasing f.replace links - check for wide merge due to duplicate ridge + check for wide merge due to dupridge determine best direction for facet merge one facet into the other - remove duplicate ridges from qh.facet_mergeset + remove dupridges from qh.facet_mergeset */ void qh_forcedmerges(boolT *wasmerge) { - facetT *facet1, *facet2; + facetT *facet1, *facet2, *merging, *merged, *newfacet; mergeT *merge, **mergep; - realT dist1, dist2, mindist1, mindist2, maxdist1, maxdist2; + realT dist, mindist, maxdist, dist2, mindist2, maxdist2; setT *othermerges; - int nummerge=0, numflip=0; + int nummerge=0, numflip=0, numdegen= 0; + boolT wasdupridge= False; if (qh TRACEmerge-1 == zzval_(Ztotmerge)) qhmem.IStracing= qh IStracing= qh TRACElevel; - trace4((qh ferr, 4025, "qh_forcedmerges: begin\n")); + trace3((qh ferr, 3054, "qh_forcedmerges: merge dupridges\n")); othermerges= qh_settemppop(); /* was facet_mergeset */ + if (qh facet_mergeset != othermerges ) { + qh_fprintf(qh ferr, 6279, "qhull internal error (qh_forcedmerges): qh_settemppop (size %d) is not qh facet_mergeset (size %d)\n", + qh_setsize(othermerges), qh_setsize(qh facet_mergeset)); + qh_errexit(qh_ERRqhull, NULL, NULL); + } qh facet_mergeset= qh_settemp(qh TEMPsize); qh_settemppush(othermerges); FOREACHmerge_(othermerges) { - if (merge->type != MRGridge) + if (merge->mergetype != MRGdupridge) continue; + wasdupridge= True; if (qh TRACEmerge-1 == zzval_(Ztotmerge)) qhmem.IStracing= qh IStracing= qh TRACElevel; - facet1= merge->facet1; - facet2= merge->facet2; - while (facet1->visible) /* must exist, no qh_merge_degenredunant */ - facet1= facet1->f.replace; /* previously merged facet */ - while (facet2->visible) - facet2= facet2->f.replace; /* previously merged facet */ + facet1= qh_getreplacement(merge->facet1); /* must exist, no qh_merge_degenredunant */ + facet2= qh_getreplacement(merge->facet2); /* previously merged facet, if any */ if (facet1 == facet2) continue; if (!qh_setin(facet2->neighbors, facet1)) { - qh_fprintf(qh ferr, 6096, "qhull internal error (qh_forcedmerges): f%d and f%d had a duplicate ridge but as f%d and f%d they are no longer neighbors\n", + qh_fprintf(qh ferr, 6096, "qhull internal error (qh_forcedmerges): f%d and f%d had a dupridge but as f%d and f%d they are no longer neighbors\n", merge->facet1->id, merge->facet2->id, facet1->id, facet2->id); qh_errexit2(qh_ERRqhull, facet1, facet2); } - dist1= qh_getdistance(facet1, facet2, &mindist1, &maxdist1); + dist= qh_getdistance(facet1, facet2, &mindist, &maxdist); dist2= qh_getdistance(facet2, facet1, &mindist2, &maxdist2); - qh_check_dupridge(facet1, dist1, facet2, dist2); - if (dist1 < dist2) - qh_mergefacet(facet1, facet2, &mindist1, &maxdist1, !qh_MERGEapex); - else { - qh_mergefacet(facet2, facet1, &mindist2, &maxdist2, !qh_MERGEapex); - dist1= dist2; - facet1= facet2; + qh_check_dupridge(facet1, dist, facet2, dist2); + if (dist < dist2) { + if (facet2->flipped && !facet1->flipped && dist2 < qh_WIDEdupridge*(qh ONEmerge+qh DISTround)) { /* prefer merge of flipped facet */ + merging= facet2; + merged= facet1; + dist= dist2; + mindist= mindist2; + maxdist= maxdist2; + }else { + merging= facet1; + merged= facet2; + } + }else { + if (facet1->flipped && !facet2->flipped && dist < qh_WIDEdupridge*(qh ONEmerge+qh DISTround)) { /* prefer merge of flipped facet */ + merging= facet1; + merged= facet2; + }else { + merging= facet2; + merged= facet1; + dist= dist2; + mindist= mindist2; + maxdist= maxdist2; + } } + qh_mergefacet(merging, merged, merge->mergetype, &mindist, &maxdist, !qh_MERGEapex); + numdegen += qh_merge_degenredundant(); /* better here than at end -- qtest.sh 10 '500 C1,2e-13 D4' 'd Qbb' */ if (facet1->flipped) { zinc_(Zmergeflipdup); numflip++; @@ -1101,25 +1608,67 @@ nummerge++; if (qh PRINTstatistics) { zinc_(Zduplicate); - wadd_(Wduplicatetot, dist1); - wmax_(Wduplicatemax, dist1); + wadd_(Wduplicatetot, dist); + wmax_(Wduplicatemax, dist); } } FOREACHmerge_(othermerges) { - if (merge->type == MRGridge) - qh_memfree(merge, (int)sizeof(mergeT)); + if (merge->mergetype == MRGdupridge) + qh_memfree(merge, (int)sizeof(mergeT)); /* invalidates merge and othermerges */ else qh_setappend(&qh facet_mergeset, merge); } qh_settempfree(&othermerges); - if (nummerge) + if (wasdupridge) { + FORALLnew_facets { + if (newfacet->dupridge) { + newfacet->dupridge= False; + newfacet->mergeridge= False; + newfacet->mergeridge2= False; + if (qh_setsize(newfacet->neighbors) < qh hull_dim) { /* not tested for MRGdupridge */ + qh_appendmergeset(newfacet, newfacet, MRGdegen, 0.0, 1.0); + trace2((qh ferr, 2107, "qh_forcedmerges: dupridge f%d is degenerate with fewer than %d neighbors\n", + newfacet->id, qh hull_dim)); + } + } + } + numdegen += qh_merge_degenredundant(); + } + if (nummerge || numflip) { *wasmerge= True; - trace1((qh ferr, 1011, "qh_forcedmerges: merged %d facets and %d flipped facets across duplicated ridges\n", - nummerge, numflip)); + trace1((qh ferr, 1011, "qh_forcedmerges: merged %d facets, %d flipped facets, and %d degenredundant facets across dupridges\n", + nummerge, numflip, numdegen)); + } } /* forcedmerges */ /*--------------------------------- + + qh_freemergesets( ) + free the merge sets + + notes: + matches qh_initmergesets +*/ +void qh_freemergesets(void) { + + if (!qh facet_mergeset || !qh degen_mergeset || !qh vertex_mergeset) { + qh_fprintf(qh ferr, 6388, "qhull internal error (qh_freemergesets): expecting mergesets. Got a NULL mergeset, qh.facet_mergeset (0x%x), qh.degen_mergeset (0x%x), qh.vertex_mergeset (0x%x)\n", + qh facet_mergeset, qh degen_mergeset, qh vertex_mergeset); + qh_errexit(qh_ERRqhull, NULL, NULL); + } + if (!SETempty_(qh facet_mergeset) || !SETempty_(qh degen_mergeset) || !SETempty_(qh vertex_mergeset)) { + qh_fprintf(qh ferr, 6389, "qhull internal error (qh_freemergesets): expecting empty mergesets. Got qh.facet_mergeset (%d merges), qh.degen_mergeset (%d merges), qh.vertex_mergeset (%d merges)\n", + qh_setsize(qh facet_mergeset), qh_setsize(qh degen_mergeset), qh_setsize(qh vertex_mergeset)); + qh_errexit(qh_ERRqhull, NULL, NULL); + } + qh_settempfree(&qh facet_mergeset); + qh_settempfree(&qh vertex_mergeset); + qh_settempfree(&qh degen_mergeset); +} /* freemergesets */ + +/*--------------------------------- qh_getmergeset( facetlist ) @@ -1131,14 +1680,12 @@ all ridges tested notes: + facetlist is qh.facet_newlist, use qh_getmergeset_initial for all facets assumes no nonconvex ridges with both facets tested uses facet->tested/ridge->tested to prevent duplicate tests can not limit tests to modified ridges since the centrum changed uses qh.visit_id - see: - qh_getmergeset_initial() - design: for each facet on facetlist for each ridge of facet @@ -1146,12 +1693,13 @@ test ridge for convexity if non-convex append ridge to qh.facet_mergeset - sort qh.facet_mergeset by angle + sort qh.facet_mergeset by mergetype and angle or distance */ void qh_getmergeset(facetT *facetlist) { facetT *facet, *neighbor, **neighborp; ridgeT *ridge, **ridgep; int nummerges; + boolT simplicial; nummerges= qh_setsize(qh facet_mergeset); trace4((qh ferr, 4026, "qh_getmergeset: started.\n")); @@ -1160,31 +1708,36 @@ if (facet->tested) continue; facet->visitid= qh visit_id; - facet->tested= True; /* must be non-simplicial due to merge */ FOREACHneighbor_(facet) neighbor->seen= False; + /* facet must be non-simplicial due to merge to qh.facet_newlist */ FOREACHridge_(facet->ridges) { if (ridge->tested && !ridge->nonconvex) continue; - /* if tested & nonconvex, need to append merge */ + /* if r.tested & r.nonconvex, need to retest and append merge */ neighbor= otherfacet_(ridge, facet); - if (neighbor->seen) { + if (neighbor->seen) { /* another ridge for this facet-neighbor pair was already tested in this loop */ ridge->tested= True; - ridge->nonconvex= False; + ridge->nonconvex= False; /* only one ridge is marked nonconvex per facet-neighbor pair */ }else if (neighbor->visitid != qh visit_id) { - ridge->tested= True; + neighbor->seen= True; ridge->nonconvex= False; - neighbor->seen= True; /* only one ridge is marked nonconvex */ - if (qh_test_appendmerge(facet, neighbor)) + simplicial= False; + if (ridge->simplicialbot && ridge->simplicialtop) + simplicial= True; + if (qh_test_appendmerge(facet, neighbor, simplicial)) ridge->nonconvex= True; + ridge->tested= True; } } + facet->tested= True; } nummerges= qh_setsize(qh facet_mergeset); if (qh ANGLEmerge) - qsort(SETaddr_(qh facet_mergeset, mergeT), (size_t)nummerges, sizeof(mergeT *), qh_compareangle); + qsort(SETaddr_(qh facet_mergeset, mergeT), (size_t)nummerges, sizeof(mergeT *), qh_compare_anglemerge); else - qsort(SETaddr_(qh facet_mergeset, mergeT), (size_t)nummerges, sizeof(mergeT *), qh_comparemerge); + qsort(SETaddr_(qh facet_mergeset, mergeT), (size_t)nummerges, sizeof(mergeT *), qh_compare_facetmerge); + nummerges += qh_setsize(qh degen_mergeset); if (qh POSTmerging) { zadd_(Zmergesettot2, nummerges); }else { @@ -1208,9 +1761,7 @@ notes: uses visit_id, assumes ridge->nonconvex is False - - see: - qh_getmergeset() + see qh_getmergeset design: for each facet on facetlist @@ -1219,20 +1770,23 @@ if non-convex append merge to qh.facet_mergeset mark one of the ridges as nonconvex - sort qh.facet_mergeset by angle + sort qh.facet_mergeset by mergetype and angle or distance */ void qh_getmergeset_initial(facetT *facetlist) { facetT *facet, *neighbor, **neighborp; ridgeT *ridge, **ridgep; int nummerges; + boolT simplicial; qh visit_id++; FORALLfacet_(facetlist) { facet->visitid= qh visit_id; - facet->tested= True; FOREACHneighbor_(facet) { if (neighbor->visitid != qh visit_id) { - if (qh_test_appendmerge(facet, neighbor)) { + simplicial= False; /* ignores r.simplicialtop/simplicialbot. Need to test horizon facets */ + if (facet->simplicial && neighbor->simplicial) + simplicial= True; + if (qh_test_appendmerge(facet, neighbor, simplicial)) { FOREACHridge_(neighbor->ridges) { if (facet == otherfacet_(ridge, neighbor)) { ridge->nonconvex= True; @@ -1242,14 +1796,16 @@ } } } + facet->tested= True; FOREACHridge_(facet->ridges) ridge->tested= True; } nummerges= qh_setsize(qh facet_mergeset); if (qh ANGLEmerge) - qsort(SETaddr_(qh facet_mergeset, mergeT), (size_t)nummerges, sizeof(mergeT *), qh_compareangle); + qsort(SETaddr_(qh facet_mergeset, mergeT), (size_t)nummerges, sizeof(mergeT *), qh_compare_anglemerge); else - qsort(SETaddr_(qh facet_mergeset, mergeT), (size_t)nummerges, sizeof(mergeT *), qh_comparemerge); + qsort(SETaddr_(qh facet_mergeset, mergeT), (size_t)nummerges, sizeof(mergeT *), qh_compare_facetmerge); + nummerges += qh_setsize(qh degen_mergeset); if (qh POSTmerging) { zadd_(Zmergeinittot2, nummerges); }else { @@ -1259,6 +1815,130 @@ trace2((qh ferr, 2022, "qh_getmergeset_initial: %d merges found\n", nummerges)); } /* getmergeset_initial */ +/*--------------------------------- + + qh_getpinchedmerges( apex, maxdist, iscoplanar ) + get pinched merges for dupridges in qh.facet_mergeset + qh.NEWtentative==True + qh.newfacet_list with apex + qh.horizon_list is attached to qh.visible_list instead of qh.newfacet_list + maxdist for vertex-facet of a dupridge + qh.facet_mergeset is empty + qh.vertex_mergeset is a temporary set + + returns: + False if nearest vertex would increase facet width by more than maxdist or qh_WIDEpinched + True and iscoplanar, if the pinched vertex is the apex (i.e., make the apex a coplanar point) + True and !iscoplanar, if should merge a pinched vertex of a dupridge + qh.vertex_mergeset contains one or more MRGsubridge with a pinched vertex and a nearby, neighboring vertex + qh.facet_mergeset is empty + + notes: + called by qh_buildcone_mergepinched + hull_dim >= 3 + a pinched vertex is in a dupridge and the horizon + selects the pinched vertex that is closest to its neighbor + + design: + for each dupridge + determine the best pinched vertex to be merged into a neighboring vertex + if merging the pinched vertex would produce a wide merge (qh_WIDEpinched) + ignore pinched vertex with a warning, and use qh_merge_degenredundant instead + else + append the pinched vertex to vertex_mergeset for merging +*/ +boolT qh_getpinchedmerges(vertexT *apex, coordT maxdupdist, boolT *iscoplanar /* qh.newfacet_list, qh.vertex_mergeset */) { + mergeT *merge, **mergep, *bestmerge= NULL; + vertexT *nearest, *pinched, *bestvertex= NULL, *bestpinched= NULL; + boolT result; + coordT dist, prevdist, bestdist= REALmax/(qh_RATIOcoplanarapex+1.0); /* allow *3.0 */ + realT ratio; + + trace2((qh ferr, 2062, "qh_getpinchedmerges: try to merge pinched vertices for dupridges in new facets with apex p%d(v%d) max dupdist %2.2g\n", + qh_pointid(apex->point), apex->id, maxdupdist)); + *iscoplanar= False; + prevdist= fmax_(qh ONEmerge + qh DISTround, qh MINoutside + qh DISTround); + maximize_(prevdist, qh max_outside); + maximize_(prevdist, -qh min_vertex); + qh_mark_dupridges(qh newfacet_list, !qh_ALL); /* qh.facet_mergeset, creates ridges */ + /* qh_mark_dupridges is called a second time in qh_premerge */ + FOREACHmerge_(qh facet_mergeset) { /* read-only */ + if (merge->mergetype != MRGdupridge) { + qh_fprintf(qh ferr, 6393, "qhull internal error (qh_getpinchedmerges): expecting MRGdupridge from qh_mark_dupridges. Got merge f%d f%d type %d\n", + getid_(merge->facet1), getid_(merge->facet2), merge->mergetype); + qh_errexit(qh_ERRqhull, NULL, NULL); + } + /* dist is distance between vertices */ + pinched= qh_findbest_pinchedvertex(merge, apex, &nearest, &dist /* qh.newfacet_list */); + if (pinched == apex && dist < qh_RATIOcoplanarapex*bestdist) { /* prefer coplanar apex since it always works */ + bestdist= dist/qh_RATIOcoplanarapex; + bestmerge= merge; + bestpinched= pinched; + bestvertex= nearest; + }else if (dist < bestdist) { + bestdist= dist; + bestmerge= merge; + bestpinched= pinched; + bestvertex= nearest; + } + } + result= False; + if (bestmerge && bestdist < maxdupdist) { + ratio= bestdist / prevdist; + if (ratio > qh_WIDEpinched) { + if (bestmerge->facet1->mergehorizon || bestmerge->facet2->mergehorizon) { /* e.g., rbox 175 C3,2e-13 t1539182828 | qhull d */ + trace1((qh ferr, 1051, "qh_getpinchedmerges: dupridge (MRGdupridge) of coplanar horizon would produce a wide merge (%.0fx) due to pinched vertices v%d and v%d (dist %2.2g) for f%d and f%d. qh_mergecycle_all will merge one or both facets\n", + ratio, bestpinched->id, bestvertex->id, bestdist, bestmerge->facet1->id, bestmerge->facet2->id)); + }else { + qh_fprintf(qh ferr, 7081, "qhull precision warning (qh_getpinchedmerges): pinched vertices v%d and v%d (dist %2.2g, %.0fx) would produce a wide merge for f%d and f%d. Will merge dupridge instead\n", + bestpinched->id, bestvertex->id, bestdist, ratio, bestmerge->facet1->id, bestmerge->facet2->id); + } + }else { + if (bestpinched == apex) { + trace2((qh ferr, 2063, "qh_getpinchedmerges: will make the apex a coplanar point. apex p%d(v%d) is the nearest vertex to v%d on dupridge. Dist %2.2g\n", + qh_pointid(apex->point), apex->id, bestvertex->id, bestdist*qh_RATIOcoplanarapex)); + qh coplanar_apex= apex->point; + *iscoplanar= True; + result= True; + }else if (qh_setin(bestmerge->facet1->vertices, bestpinched) != qh_setin(bestmerge->facet2->vertices, bestpinched)) { /* pinched in one facet but not the other facet */ + trace2((qh ferr, 2064, "qh_getpinchedmerges: will merge new facets to resolve dupridge between f%d and f%d with pinched v%d and v%d\n", + bestmerge->facet1->id, bestmerge->facet2->id, bestpinched->id, bestvertex->id)); + qh_appendvertexmerge(bestpinched, bestvertex, MRGsubridge, bestdist, NULL, NULL); + result= True; + }else { + trace2((qh ferr, 2065, "qh_getpinchedmerges: will merge pinched v%d into v%d to resolve dupridge between f%d and f%d\n", + bestpinched->id, bestvertex->id, bestmerge->facet1->id, bestmerge->facet2->id)); + qh_appendvertexmerge(bestpinched, bestvertex, MRGsubridge, bestdist, NULL, NULL); + result= True; + } + } + } + /* delete MRGdupridge, qh_mark_dupridges is called a second time in qh_premerge */ + while ((merge= (mergeT *)qh_setdellast(qh facet_mergeset))) + qh_memfree(merge, (int)sizeof(mergeT)); + return result; +}/* getpinchedmerges */ + +/*--------------------------------- + + qh_hasmerge( mergeset, mergetype, facetA, facetB ) + True if mergeset has mergetype for facetA and facetB +*/ +boolT qh_hasmerge(setT *mergeset, mergeType type, facetT *facetA, facetT *facetB) { + mergeT *merge, **mergep; + + FOREACHmerge_(mergeset) { + if (merge->mergetype == type) { + if (merge->facet1 == facetA && merge->facet2 == facetB) + return True; + if (merge->facet1 == facetB && merge->facet2 == facetA) + return True; + } + } + return False; +}/* hasmerge */ /*--------------------------------- @@ -1342,6 +2022,28 @@ /*--------------------------------- + + qh_initmergesets( ) + initialize the merge sets + if 'all', include qh.degen_mergeset + + notes: + matches qh_freemergesets +*/ +void qh_initmergesets(void /* qh.facet_mergeset,degen_mergeset,vertex_mergeset */) { + + if (qh facet_mergeset || qh degen_mergeset || qh vertex_mergeset) { + qh_fprintf(qh ferr, 6386, "qhull internal error (qh_initmergesets): expecting NULL mergesets. Got qh.facet_mergeset (0x%x), qh.degen_mergeset (0x%x), qh.vertex_mergeset (0x%x)\n", + qh facet_mergeset, qh degen_mergeset, qh vertex_mergeset); + qh_errexit(qh_ERRqhull, NULL, NULL); + } + qh degen_mergeset= qh_settemp(qh TEMPsize); + qh vertex_mergeset= qh_settemp(qh TEMPsize); + qh facet_mergeset= qh_settemp(qh TEMPsize); /* last temporary set for qh_forcedmerges */ +} /* initmergesets */ + +/*--------------------------------- qh_makeridges( facet ) @@ -1350,6 +2052,7 @@ returns: facet with ridges and without qh_MERGEridge ->simplicial is False + if facet was tested, new ridges are tested notes: allows qh_MERGEridge flag @@ -1358,6 +2061,7 @@ see: qh_mergecycle_ridges() + qh_rename_adjacentvertex for qh_merge_pinchedvertices design: look for qh_MERGEridge neighbors @@ -1365,7 +2069,7 @@ for each unprocessed neighbor of facet create a ridge for neighbor and facet if any qh_MERGEridge neighbors - delete qh_MERGEridge flags (already handled by qh_mark_dupridges) + delete qh_MERGEridge flags (previously processed by qh_mark_dupridges) */ void qh_makeridges(facetT *facet) { facetT *neighbor, **neighborp; @@ -1392,26 +2096,40 @@ ridge= qh_newridge(); ridge->vertices= qh_setnew_delnthsorted(facet->vertices, qh hull_dim, neighbor_i, 0); - toporient= facet->toporient ^ (neighbor_i & 0x1); + toporient= (boolT)(facet->toporient ^ (neighbor_i & 0x1)); if (toporient) { ridge->top= facet; ridge->bottom= neighbor; + ridge->simplicialtop= True; + ridge->simplicialbot= neighbor->simplicial; }else { ridge->top= neighbor; ridge->bottom= facet; + ridge->simplicialtop= neighbor->simplicial; + ridge->simplicialbot= True; } + if (facet->tested && !mergeridge) + ridge->tested= True; #if 0 /* this also works */ flip= (facet->toporient ^ neighbor->toporient)^(skip1 & 0x1) ^ (skip2 & 0x1); if (facet->toporient ^ (skip1 & 0x1) ^ flip) { ridge->top= neighbor; ridge->bottom= facet; + ridge->simplicialtop= True; + ridge->simplicialbot= neighbor->simplicial; }else { ridge->top= facet; ridge->bottom= neighbor; + ridge->simplicialtop= neighbor->simplicial; + ridge->simplicialbot= True; } #endif qh_setappend(&(facet->ridges), ridge); + trace5((qh ferr, 5005, "makeridges: appended r%d to ridges for f%d. Next is ridges for neighbor f%d\n", + ridge->id, facet->id, neighbor->id)); qh_setappend(&(neighbor->ridges), ridge); + if (qh ridge_id == qh traceridge_id) + qh traceridge= ridge; } } if (mergeridge) { @@ -1424,46 +2142,64 @@ /*--------------------------------- - qh_mark_dupridges( facetlist ) + qh_mark_dupridges( facetlist, allmerges ) add duplicated ridges to qh.facet_mergeset - facet->dupridge is true + facet-dupridge is true if it contains a subridge shared by more than one new facet + for each such facet, one has a neighbor marked qh_MERGEridge + allmerges is true if merging dupridges + allmerges is false if merging pinched vertices followed by retry addpoint + qh_mark_dupridges will be called again if pinched vertices not found returns: - duplicate ridges on qh.facet_mergeset - ->mergeridge/->mergeridge2 set - duplicate ridges marked by qh_MERGEridge and both sides facet->dupridge - no MERGEridges in neighbor sets + dupridges on qh.facet_mergeset (MRGdupridge) + f.mergeridge and f.mergeridge2 set for facet + f.mergeridge set for neighbor + if allmerges is true + make ridges for facets with dupridges as marked by qh_MERGEridge and both sides facet->dupridge + removes qh_MERGEridge from neighbor sets notes: - duplicate ridges occur when the horizon is pinched, + called by qh_premerge and qh_getpinchedmerges + dupridges are due to duplicate subridges i.e. a subridge occurs in more than two horizon ridges. - could rename vertices that pinch the horizon (thus removing subridge) + i.e., a ridge has more than two neighboring facets + dupridges occur in at least two cases + 1) a pinched horizon with nearly adjacent vertices -> merge the vertices (qh_getpinchedmerges) + 2) more than one newfacet for a horizon face -> merge coplanar facets (qh_premerge) + qh_matchdupridge previously identified the furthest apart pair of facets to retain + they must have a matching subridge and the same orientation + only way to set facet->mergeridge and mergeridge2 uses qh.visit_id design: for all facets on facetlist - if facet contains a duplicate ridge + if facet contains a dupridge for each neighbor of facet if neighbor marked qh_MERGEridge (one side of the merge) set facet->mergeridge else - if neighbor contains a duplicate ridge + if neighbor contains a dupridge and the back link is qh_MERGEridge - append duplicate ridge to qh.facet_mergeset - for each duplicate ridge + append dupridge to qh.facet_mergeset + exit if !allmerges for repeating qh_mark_dupridges later + for each dupridge make ridge sets in preparation for merging remove qh_MERGEridge from neighbor set - for each duplicate ridge + for each dupridge restore the missing neighbor from the neighbor set that was qh_MERGEridge add the missing ridge for this neighbor */ -void qh_mark_dupridges(facetT *facetlist) { +void qh_mark_dupridges(facetT *facetlist, boolT allmerges) { facetT *facet, *neighbor, **neighborp; int nummerge=0; mergeT *merge, **mergep; - - trace4((qh ferr, 4028, "qh_mark_dupridges: identify duplicate ridges\n")); + trace4((qh ferr, 4028, "qh_mark_dupridges: identify dupridges in facetlist f%d, allmerges? %d\n", + facetlist->id, allmerges)); + FORALLfacet_(facetlist) { /* not necessary for first call */ + facet->mergeridge2= False; + facet->mergeridge= False; + } FORALLfacet_(facetlist) { if (facet->dupridge) { FOREACHneighbor_(facet) { @@ -1471,43 +2207,198 @@ facet->mergeridge= True; continue; } - if (neighbor->dupridge - && !qh_setin(neighbor->neighbors, facet)) { /* qh_MERGEridge */ - qh_appendmergeset(facet, neighbor, MRGridge, NULL); - facet->mergeridge2= True; - facet->mergeridge= True; - nummerge++; + if (neighbor->dupridge) { + if (!qh_setin(neighbor->neighbors, facet)) { /* i.e., it is qh_MERGEridge, neighbors are distinct */ + qh_appendmergeset(facet, neighbor, MRGdupridge, 0.0, 1.0); + facet->mergeridge2= True; + facet->mergeridge= True; + nummerge++; + }else if (qh_setequal(facet->vertices, neighbor->vertices)) { /* neighbors are the same except for horizon and qh_MERGEridge, see QH7085 */ + trace3((qh ferr, 3043, "qh_mark_dupridges): dupridge due to duplicate vertices for subridges f%d and f%d\n", + facet->id, neighbor->id)); + qh_appendmergeset(facet, neighbor, MRGdupridge, 0.0, 1.0); + facet->mergeridge2= True; + facet->mergeridge= True; + nummerge++; + break; /* same for all neighbors */ + } } } } } if (!nummerge) return; - FORALLfacet_(facetlist) { /* gets rid of qh_MERGEridge */ + if (!allmerges) { + trace1((qh ferr, 1012, "qh_mark_dupridges: found %d duplicated ridges (MRGdupridge) for qh_getpinchedmerges\n", nummerge)); + return; + } + trace1((qh ferr, 1048, "qh_mark_dupridges: found %d duplicated ridges (MRGdupridge) for qh_premerge. Prepare facets for merging\n", nummerge)); + /* make ridges in preparation for merging */ + FORALLfacet_(facetlist) { if (facet->mergeridge && !facet->mergeridge2) qh_makeridges(facet); } + trace3((qh ferr, 3075, "qh_mark_dupridges: restore missing neighbors and ridges due to qh_MERGEridge\n")); FOREACHmerge_(qh facet_mergeset) { /* restore the missing neighbors */ - if (merge->type == MRGridge) { - qh_setappend(&merge->facet2->neighbors, merge->facet1); + if (merge->mergetype == MRGdupridge) { /* only between simplicial facets */ + if (merge->facet2->mergeridge2 && qh_setin(merge->facet2->neighbors, merge->facet1)) { + /* Due to duplicate or multiple subridges, e.g., ../eg/qtest.sh t712682 '200 s W1e-13 C1,1e-13 D5' 'd' + merge->facet1: - neighboring facets: f27779 f59186 f59186 f59186 MERGEridge f59186 + merge->facet2: - neighboring facets: f27779 f59100 f59100 f59100 f59100 f59100 + or, ../eg/qtest.sh 100 '500 s W1e-13 C1,1e-13 D4' 'd' + both facets will be degenerate after merge, consider for special case handling + */ + qh_fprintf(qh ferr, 6361, "qhull topological error (qh_mark_dupridges): multiple dupridges for f%d and f%d, including reverse\n", + merge->facet1->id, merge->facet2->id); + qh_errexit2(qh_ERRtopology, merge->facet1, merge->facet2); + }else + qh_setappend(&merge->facet2->neighbors, merge->facet1); qh_makeridges(merge->facet1); /* and the missing ridges */ } } - trace1((qh ferr, 1012, "qh_mark_dupridges: found %d duplicated ridges\n", - nummerge)); } /* mark_dupridges */ /*--------------------------------- + + qh_maybe_duplicateridge( ridge ) + add MRGvertices if neighboring facet has another ridge with the same vertices + + returns: + adds rename requests to qh.vertex_mergeset + + notes: + called by qh_renamevertex + nop if 2-D + expensive test + Duplicate ridges may lead to new facets with same vertex set (QH7084), will try merging vertices + same as qh_maybe_duplicateridges + + design: + for the two neighbors + if non-simplicial + for each ridge with the same first and last vertices (max id and min id) + if the remaining vertices are the same + get the closest pair of vertices + add to vertex_mergeset for merging +*/ +void qh_maybe_duplicateridge(ridgeT *ridgeA) { + ridgeT *ridge, **ridgep; + vertexT *vertex, *pinched; + facetT *neighbor; + coordT dist; + int i, k, last= qh hull_dim-2; + + if (qh hull_dim < 3 ) + return; + + for (neighbor= ridgeA->top, i=0; i<2; neighbor= ridgeA->bottom, i++) { + if (!neighbor->simplicial && neighbor->nummerge > 0) { /* skip degenerate neighbors with both new and old vertices that will be merged */ + FOREACHridge_(neighbor->ridges) { + if (ridge != ridgeA && SETfirst_(ridge->vertices) == SETfirst_(ridgeA->vertices)) { + if (SETelem_(ridge->vertices, last) == SETelem_(ridgeA->vertices, last)) { + for (k=1; kvertices, k) != SETelem_(ridgeA->vertices, k)) + break; + } + if (k == last) { + vertex= qh_findbest_ridgevertex(ridge, &pinched, &dist); + trace2((qh ferr, 2069, "qh_maybe_duplicateridge: will merge v%d into v%d (dist %2.2g) due to duplicate ridges r%d/r%d with the same vertices. mergevertex set\n", + pinched->id, vertex->id, dist, ridgeA->id, ridge->id, ridgeA->top->id, ridgeA->bottom->id, ridge->top->id, ridge->bottom->id)); + qh_appendvertexmerge(pinched, vertex, MRGvertices, dist, ridgeA, ridge); + ridge->mergevertex= True; /* disables check for duplicate vertices in qh_checkfacet */ + ridgeA->mergevertex= True; + } + } + } + } + } + } +} /* maybe_duplicateridge */ + +/*--------------------------------- + + qh_maybe_duplicateridges( facet ) + if Q15, add MRGvertices if facet has ridges with the same vertices + + returns: + adds rename requests to qh.vertex_mergeset + + notes: + called at end of qh_mergefacet and qh_mergecycle_all + only enabled if qh.CHECKduplicates ('Q15') and 3-D or more + expensive test, not worth it + same as qh_maybe_duplicateridge + + design: + for all ridge pairs in facet + if the same first and last vertices (max id and min id) + if the remaining vertices are the same + get the closest pair of vertices + add to vertex_mergeset for merging +*/ +void qh_maybe_duplicateridges(facetT *facet) { + facetT *otherfacet; + ridgeT *ridge, *ridge2; + vertexT *vertex, *pinched; + coordT dist; + int ridge_i, ridge_n, i, k, last_v= qh hull_dim-2; + + if (qh hull_dim < 3 || !qh CHECKduplicates) + return; + + FOREACHridge_i_(facet->ridges) { + otherfacet= otherfacet_(ridge, facet); + if (otherfacet->degenerate || otherfacet->redundant || otherfacet->dupridge || otherfacet->flipped) /* will merge */ + continue; + for (i=ridge_i+1; i < ridge_n; i++) { + ridge2= SETelemt_(facet->ridges, i, ridgeT); + otherfacet= otherfacet_(ridge2, facet); + if (otherfacet->degenerate || otherfacet->redundant || otherfacet->dupridge || otherfacet->flipped) /* will merge */ + continue; + /* optimize qh_setequal(ridge->vertices, ridge2->vertices) */ + if (SETelem_(ridge->vertices, last_v) == SETelem_(ridge2->vertices, last_v)) { /* SETfirst is likely to be the same */ + if (SETfirst_(ridge->vertices) == SETfirst_(ridge2->vertices)) { + for (k=1; kvertices, k) != SETelem_(ridge2->vertices, k)) + break; + } + if (k == last_v) { + vertex= qh_findbest_ridgevertex(ridge, &pinched, &dist); + if (ridge->top == ridge2->bottom && ridge->bottom == ridge2->top) { + /* proof that ridges may have opposite orientation */ + trace2((qh ferr, 2088, "qh_maybe_duplicateridges: will merge v%d into v%d (dist %2.2g) due to opposite oriented ridges r%d/r%d for f%d and f%d\n", + pinched->id, vertex->id, dist, ridge->id, ridge2->id, ridge->top->id, ridge->bottom->id)); + }else { + trace2((qh ferr, 2083, "qh_maybe_duplicateridges: will merge v%d into v%d (dist %2.2g) due to duplicate ridges with the same vertices r%d/r%d in merged facet f%d\n", + pinched->id, vertex->id, dist, ridge->id, ridge2->id, facet->id)); + } + qh_appendvertexmerge(pinched, vertex, MRGvertices, dist, ridge, ridge2); + ridge->mergevertex= True; /* disables check for duplicate vertices in qh_checkfacet */ + ridge2->mergevertex= True; + } + } + } + } + } +} /* maybe_duplicateridges */ + +/*--------------------------------- qh_maydropneighbor( facet ) - drop neighbor relationship if no ridge between facet and neighbor + drop neighbor relationship if ridge was deleted between a non-simplicial facet and its neighbors returns: - neighbor sets updated - appends degenerate facets to qh.facet_mergeset + for deleted ridges + ridges made for simplicial neighbors + neighbor sets updated + appends degenerate facets to qh.facet_mergeset notes: + called by qh_renamevertex + assumes neighbors do not include qh_MERGEridge (qh_makeridges) won't cause redundant facets since vertex inclusion is the same may drop vertex and neighbor if no ridge uses qh.visit_id @@ -1515,7 +2406,7 @@ design: visit all neighbors with ridges for each unvisited neighbor of facet - delete neighbor and facet from the neighbor sets + delete neighbor and facet from the non-simplicial neighbor sets if neighbor becomes degenerate append neighbor to qh.degen_mergeset if facet is degenerate @@ -1523,34 +2414,48 @@ */ void qh_maydropneighbor(facetT *facet) { ridgeT *ridge, **ridgep; - realT angledegen= qh_ANGLEdegen; facetT *neighbor, **neighborp; qh visit_id++; trace4((qh ferr, 4029, "qh_maydropneighbor: test f%d for no ridges to a neighbor\n", facet->id)); + if (facet->simplicial) { + qh_fprintf(qh ferr, 6278, "qhull internal error (qh_maydropneighbor): not valid for simplicial f%d while adding furthest p%d\n", + facet->id, qh furthest_id); + qh_errexit(qh_ERRqhull, facet, NULL); + } FOREACHridge_(facet->ridges) { ridge->top->visitid= qh visit_id; ridge->bottom->visitid= qh visit_id; } FOREACHneighbor_(facet) { + if (neighbor->visible) { + qh_fprintf(qh ferr, 6358, "qhull internal error (qh_maydropneighbor): facet f%d has deleted neighbor f%d (qh.visible_list)\n", + facet->id, neighbor->id); + qh_errexit2(qh_ERRqhull, facet, neighbor); + } if (neighbor->visitid != qh visit_id) { - trace0((qh ferr, 17, "qh_maydropneighbor: facets f%d and f%d are no longer neighbors during p%d\n", + trace2((qh ferr, 2104, "qh_maydropneighbor: facets f%d and f%d are no longer neighbors while adding furthest p%d\n", facet->id, neighbor->id, qh furthest_id)); + if (neighbor->simplicial) { + qh_fprintf(qh ferr, 6280, "qhull internal error (qh_maydropneighbor): not valid for simplicial neighbor f%d of f%d while adding furthest p%d\n", + neighbor->id, facet->id, qh furthest_id); + qh_errexit2(qh_ERRqhull, neighbor, facet); + } zinc_(Zdropneighbor); - qh_setdel(facet->neighbors, neighbor); - neighborp--; /* repeat, deleted a neighbor */ qh_setdel(neighbor->neighbors, facet); if (qh_setsize(neighbor->neighbors) < qh hull_dim) { zinc_(Zdropdegen); - qh_appendmergeset(neighbor, neighbor, MRGdegen, &angledegen); + qh_appendmergeset(neighbor, neighbor, MRGdegen, 0.0, qh_ANGLEnone); trace2((qh ferr, 2023, "qh_maydropneighbors: f%d is degenerate.\n", neighbor->id)); } + qh_setdel(facet->neighbors, neighbor); + neighborp--; /* repeat, deleted a neighbor */ } } if (qh_setsize(facet->neighbors) < qh hull_dim) { zinc_(Zdropdegen); - qh_appendmergeset(facet, facet, MRGdegen, &angledegen); + qh_appendmergeset(facet, facet, MRGdegen, 0.0, qh_ANGLEnone); trace2((qh ferr, 2024, "qh_maydropneighbors: f%d is degenerate.\n", facet->id)); } } /* maydropneighbor */ @@ -1559,9 +2464,9 @@ /*--------------------------------- - qh_merge_degenredundant() + qh_merge_degenredundant( ) merge all degenerate and redundant facets - qh.degen_mergeset contains merges from qh_degen_redundant_neighbors() + qh.degen_mergeset contains merges from qh_test_degen_neighbors, qh_test_redundant_neighbors, and qh_degen_redundant_facet returns: number of merges performed @@ -1572,6 +2477,7 @@ notes: redundant merges happen before degenerate ones merging and renaming vertices can result in degen/redundant facets + check for coplanar and convex neighbors afterwards design: for each merge on qh.degen_mergeset @@ -1584,17 +2490,21 @@ int qh_merge_degenredundant(void) { int size; mergeT *merge; - facetT *bestneighbor, *facet1, *facet2; + facetT *bestneighbor, *facet1, *facet2, *facet3; realT dist, mindist, maxdist; vertexT *vertex, **vertexp; int nummerges= 0; mergeType mergetype; + setT *mergedfacets; - while ((merge= (mergeT*)qh_setdellast(qh degen_mergeset))) { + trace2((qh ferr, 2095, "qh_merge_degenredundant: merge %d degenerate, redundant, and mirror facets\n", + qh_setsize(qh degen_mergeset))); + mergedfacets= qh_settemp(qh TEMPsize); + while ((merge= (mergeT *)qh_setdellast(qh degen_mergeset))) { facet1= merge->facet1; facet2= merge->facet2; - mergetype= merge->type; - qh_memfree(merge, (int)sizeof(mergeT)); + mergetype= merge->mergetype; + qh_memfree(merge, (int)sizeof(mergeT)); /* 'merge' is invalidated */ if (facet1->visible) continue; facet1->degenerate= False; @@ -1602,25 +2512,23 @@ if (qh TRACEmerge-1 == zzval_(Ztotmerge)) qhmem.IStracing= qh IStracing= qh TRACElevel; if (mergetype == MRGredundant) { - zinc_(Zneighbor); - while (facet2->visible) { - if (!facet2->f.replace) { - qh_fprintf(qh ferr, 6097, "qhull internal error (qh_merge_degenredunant): f%d redundant but f%d has no replacement\n", - facet1->id, facet2->id); + zinc_(Zredundant); + facet3= qh_getreplacement(facet2); /* the same facet if !facet2.visible */ + if (!facet3) { + qh_fprintf(qh ferr, 6097, "qhull internal error (qh_merge_degenredunant): f%d is redundant but visible f%d has no replacement\n", + facet1->id, getid_(facet2)); qh_errexit2(qh_ERRqhull, facet1, facet2); - } - facet2= facet2->f.replace; } - if (facet1 == facet2) { - qh_degen_redundant_facet(facet1); /* in case of others */ + qh_setunique(&mergedfacets, facet3); + if (facet1 == facet3) { continue; } - trace2((qh ferr, 2025, "qh_merge_degenredundant: facet f%d is contained in f%d, will merge\n", - facet1->id, facet2->id)); - qh_mergefacet(facet1, facet2, NULL, NULL, !qh_MERGEapex); + trace2((qh ferr, 2025, "qh_merge_degenredundant: merge redundant f%d into f%d (arg f%d)\n", + facet1->id, facet3->id, facet2->id)); + qh_mergefacet(facet1, facet3, mergetype, NULL, NULL, !qh_MERGEapex); /* merge distance is already accounted for */ nummerges++; - }else { /* mergetype == MRGdegen, other merges may have fixed */ + }else { /* mergetype == MRGdegen or MRGmirror, other merges may have fixed */ if (!(size= qh_setsize(facet1->neighbors))) { zinc_(Zdelfacetdup); trace2((qh ferr, 2026, "qh_merge_degenredundant: facet f%d has no neighbors. Deleted\n", facet1->id)); @@ -1640,7 +2548,7 @@ bestneighbor= qh_findbestneighbor(facet1, &dist, &mindist, &maxdist); trace2((qh ferr, 2028, "qh_merge_degenredundant: facet f%d has %d neighbors, merge into f%d dist %2.2g\n", facet1->id, size, bestneighbor->id, dist)); - qh_mergefacet(facet1, bestneighbor, &mindist, &maxdist, !qh_MERGEapex); + qh_mergefacet(facet1, bestneighbor, mergetype, &mindist, &maxdist, !qh_MERGEapex); nummerges++; if (qh PRINTstatistics) { zinc_(Zdegen); @@ -1650,6 +2558,7 @@ } /* else, another merge fixed the degeneracy and redundancy tested */ } } + qh_settempfree(&mergedfacets); return nummerges; } /* merge_degenredundant */ @@ -1663,6 +2572,9 @@ returns: merges one of the facets into the best neighbor + notes: + mergetype is MRGcoplanar..MRGconvex + design: if one of the facets is a new facet prefer merging new facet into old facet @@ -1671,9 +2583,14 @@ update the statistics */ void qh_merge_nonconvex(facetT *facet1, facetT *facet2, mergeType mergetype) { - facetT *bestfacet, *bestneighbor, *neighbor; + facetT *bestfacet, *bestneighbor, *neighbor, *merging, *merged; realT dist, dist2, mindist, mindist2, maxdist, maxdist2; + if (mergetype < MRGcoplanar || mergetype > MRGconcavecoplanar) { + qh_fprintf(qh ferr, 6398, "qhull internal error (qh_merge_nonconvex): expecting mergetype MRGcoplanar..MRGconcavecoplanar. Got merge f%d and f%d type %d\n", + facet1->id, facet2->id, mergetype); + qh_errexit2(qh_ERRqhull, facet1, facet2); + } if (qh TRACEmerge-1 == zzval_(Ztotmerge)) qhmem.IStracing= qh IStracing= qh TRACElevel; trace3((qh ferr, 3003, "qh_merge_nonconvex: merge #%d for f%d and f%d type %d\n", @@ -1688,7 +2605,8 @@ bestneighbor= qh_findbestneighbor(bestfacet, &dist, &mindist, &maxdist); neighbor= qh_findbestneighbor(facet2, &dist2, &mindist2, &maxdist2); if (dist < dist2) { - qh_mergefacet(bestfacet, bestneighbor, &mindist, &maxdist, !qh_MERGEapex); + merging= bestfacet; + merged= bestneighbor; }else if (qh AVOIDold && !facet2->newfacet && ((mindist >= -qh MAXcoplanar && maxdist <= qh max_outside) || dist * 1.5 < dist2)) { @@ -1697,11 +2615,17 @@ wmax_(Wavoidoldmax, dist); trace2((qh ferr, 2029, "qh_merge_nonconvex: avoid merging old facet f%d dist %2.2g. Use f%d dist %2.2g instead\n", facet2->id, dist2, facet1->id, dist2)); - qh_mergefacet(bestfacet, bestneighbor, &mindist, &maxdist, !qh_MERGEapex); + merging= bestfacet; + merged= bestneighbor; }else { - qh_mergefacet(facet2, neighbor, &mindist2, &maxdist2, !qh_MERGEapex); + merging= facet2; + merged= neighbor; dist= dist2; + mindist= mindist2; + maxdist= maxdist2; } + qh_mergefacet(merging, merged, mergetype, &mindist, &maxdist, !qh_MERGEapex); + /* caller merges qh_degenredundant */ if (qh PRINTstatistics) { if (mergetype == MRGanglecoplanar) { zinc_(Zacoplanar); @@ -1711,6 +2635,10 @@ zinc_(Zconcave); wadd_(Wconcavetot, dist); wmax_(Wconcavemax, dist); + }else if (mergetype == MRGconcavecoplanar) { + zinc_(Zconcavecoplanar); + wadd_(Wconcavecoplanartot, dist); + wmax_(Wconcavecoplanarmax, dist); }else { /* MRGcoplanar */ zinc_(Zcoplanar); wadd_(Wcoplanartot, dist); @@ -1720,6 +2648,137 @@ } /* merge_nonconvex */ /*--------------------------------- + + qh_merge_pinchedvertices( apex ) + merge pinched vertices in qh.vertex_mergeset to avoid qh_forcedmerges of dupridges + + notes: + only called by qh_all_vertexmerges + hull_dim >= 3 + + design: + make vertex neighbors if necessary + for each pinched vertex + determine the ridges for the pinched vertex (make ridges as needed) + merge the pinched vertex into the horizon vertex + merge the degenerate and redundant facets that result + check and resolve new dupridges +*/ +void qh_merge_pinchedvertices(int apexpointid /* qh.newfacet_list */) { + mergeT *merge, *mergeA, **mergeAp; + vertexT *vertex, *vertex2; + realT dist; + boolT firstmerge= True; + + qh_vertexneighbors(); + if (qh visible_list || qh newfacet_list || qh newvertex_list) { + qh_fprintf(qh ferr, 6402, "qhull internal error (qh_merge_pinchedvertices): qh.visible_list (f%d), newfacet_list (f%d), or newvertex_list (v%d) not empty\n", + getid_(qh visible_list), getid_(qh newfacet_list), getid_(qh newvertex_list)); + qh_errexit(qh_ERRqhull, NULL, NULL); + } + qh visible_list= qh newfacet_list= qh facet_tail; + qh newvertex_list= qh vertex_tail; + qh isRenameVertex= True; /* disable duplicate ridge vertices check in qh_checkfacet */ + while ((merge= qh_next_vertexmerge(/* qh.vertex_mergeset */))) { /* only one at a time from qh_getpinchedmerges */ + if (qh TRACEmerge-1 == zzval_(Ztotmerge)) + qhmem.IStracing= qh IStracing= qh TRACElevel; + if (merge->mergetype == MRGsubridge) { + zzinc_(Zpinchedvertex); + trace1((qh ferr, 1050, "qh_merge_pinchedvertices: merge one of %d pinched vertices before adding apex p%d. Try to resolve duplicate ridges in newfacets\n", + qh_setsize(qh vertex_mergeset)+1, apexpointid)); + qh_remove_mergetype(qh vertex_mergeset, MRGsubridge); + }else { + zzinc_(Zpinchduplicate); + if (firstmerge) + trace1((qh ferr, 1056, "qh_merge_pinchedvertices: merge %d pinched vertices from dupridges in merged facets, apex p%d\n", + qh_setsize(qh vertex_mergeset)+1, apexpointid)); + firstmerge= False; + } + vertex= merge->vertex1; + vertex2= merge->vertex2; + dist= merge->distance; + qh_memfree(merge, (int)sizeof(mergeT)); /* merge is invalidated */ + qh_rename_adjacentvertex(vertex, vertex2, dist); +#ifndef qh_NOtrace + if (qh IStracing >= 2) { + FOREACHmergeA_(qh degen_mergeset) { + if (mergeA->mergetype== MRGdegen) { + qh_fprintf(qh ferr, 2072, "qh_merge_pinchedvertices: merge degenerate f%d into an adjacent facet\n", mergeA->facet1->id); + }else { + qh_fprintf(qh ferr, 2084, "qh_merge_pinchedvertices: merge f%d into f%d mergeType %d\n", mergeA->facet1->id, mergeA->facet2->id, mergeA->mergetype); + } + } + } +#endif + qh_merge_degenredundant(); /* simplicial facets with both old and new vertices */ + } + qh isRenameVertex= False; +}/* merge_pinchedvertices */ + +/*--------------------------------- + + qh_merge_twisted( facet1, facet2 ) + remove twisted ridge between facet1 into facet2 or report error + + returns: + merges one of the facets into the best neighbor + + notes: + a twisted ridge has opposite vertices that are convex and concave + + design: + find best neighbors for both facets + error if wide merge + merge the nearest facet into its best neighbor + update statistics +*/ +void qh_merge_twisted(facetT *facet1, facetT *facet2) { + facetT *neighbor2, *neighbor, *merging, *merged; + vertexT *bestvertex, *bestpinched; + realT dist, dist2, mindist, mindist2, maxdist, maxdist2, mintwisted, bestdist; + + if (qh TRACEmerge-1 == zzval_(Ztotmerge)) + qhmem.IStracing= qh IStracing= qh TRACElevel; + trace3((qh ferr, 3050, "qh_merge_twisted: merge #%d for twisted f%d and f%d\n", + zzval_(Ztotmerge) + 1, facet1->id, facet2->id)); + /* twisted */ + neighbor= qh_findbestneighbor(facet1, &dist, &mindist, &maxdist); + neighbor2= qh_findbestneighbor(facet2, &dist2, &mindist2, &maxdist2); + mintwisted= qh_RATIOtwisted * qh ONEmerge; + maximize_(mintwisted, facet1->maxoutside); + maximize_(mintwisted, facet2->maxoutside); + if (dist > mintwisted && dist2 > mintwisted) { + bestdist= qh_vertex_bestdist2(facet1->vertices, &bestvertex, &bestpinched); + if (bestdist > mintwisted) { + qh_fprintf(qh ferr, 6417, "qhull precision error (qh_merge_twisted): twisted facet f%d does not contain pinched vertices. Too wide to merge into neighbor. mindist %2.2g maxdist %2.2g vertexdist %2.2g maxpinched %2.2g neighbor f%d mindist %2.2g maxdist %2.2g\n", + facet1->id, mindist, maxdist, bestdist, mintwisted, facet2->id, mindist2, maxdist2); + }else { + qh_fprintf(qh ferr, 6418, "qhull precision error (qh_merge_twisted): twisted facet f%d with pinched vertices. Could merge vertices, but too wide to merge into neighbor. mindist %2.2g maxdist %2.2g vertexdist %2.2g neighbor f%d mindist %2.2g maxdist %2.2g\n", + facet1->id, mindist, maxdist, bestdist, facet2->id, mindist2, maxdist2); + } + qh_errexit2(qh_ERRwide, facet1, facet2); + } + if (dist < dist2) { + merging= facet1; + merged= neighbor; + }else { + /* ignores qh.AVOIDold ('Q4') */ + merging= facet2; + merged= neighbor2; + dist= dist2; + mindist= mindist2; + maxdist= maxdist2; + } + qh_mergefacet(merging, merged, MRGtwisted, &mindist, &maxdist, !qh_MERGEapex); + /* caller merges qh_degenredundant */ + zinc_(Ztwisted); + wadd_(Wtwistedtot, dist); + wmax_(Wtwistedmax, dist); +} /* merge_twisted */ + +/*--------------------------------- qh_mergecycle( samecycle, newfacet ) @@ -1733,9 +2792,9 @@ newfacet at end of qh.facet_list deleted vertices on qh.del_vertices - see: - qh_mergefacet() - called by qh_mergecycle_all() for multiple, same cycle facets + notes: + only called by qh_mergecycle_all for multiple, same cycle facets + see qh_mergefacet design: make vertex neighbors if necessary @@ -1755,16 +2814,6 @@ facetT *same; #endif - if (newfacet->tricoplanar) { - if (!qh TRInormals) { - qh_fprintf(qh ferr, 6224, "Qhull internal error (qh_mergecycle): does not work for tricoplanar facets. Use option 'Q11'\n"); - qh_errexit(qh_ERRqhull, newfacet, NULL); - } - newfacet->tricoplanar= False; - newfacet->keepcentrum= False; - } - if (!qh VERTEXneighbors) - qh_vertexneighbors(); zzinc_(Ztotmerge); if (qh REPORTfreq2 && qh POSTmerging) { if (zzval_(Ztotmerge) > qh mergereport + qh REPORTfreq2) @@ -1791,6 +2840,18 @@ if (qh IStracing >=4) qh_errprint("MERGING CYCLE", samecycle, newfacet, NULL, NULL); #endif /* !qh_NOtrace */ + if (newfacet->tricoplanar) { + if (!qh TRInormals) { + qh_fprintf(qh ferr, 6224, "qhull internal error (qh_mergecycle): does not work for tricoplanar facets. Use option 'Q11'\n"); + qh_errexit(qh_ERRqhull, newfacet, NULL); + } + newfacet->tricoplanar= False; + newfacet->keepcentrum= False; + } + if (qh CHECKfrequently) + qh_checkdelridge(); + if (!qh VERTEXneighbors) + qh_vertexneighbors(); apex= SETfirstt_(samecycle->vertices, vertexT); qh_makeridges(newfacet); qh_mergecycle_neighbors(samecycle, newfacet); @@ -1801,7 +2862,7 @@ if (!newfacet->newfacet) qh_newvertices(newfacet->vertices); qh_mergecycle_facets(samecycle, newfacet); - qh_tracemerge(samecycle, newfacet); + qh_tracemerge(samecycle, newfacet, MRGcoplanarhorizon); /* check for degen_redundant_neighbors after qh_forcedmerges() */ if (traceonce) { qh_fprintf(qh ferr, 8072, "qh_mergecycle: end of trace facet\n"); @@ -1823,37 +2884,40 @@ deleted vertices on qh.del_vertices sets wasmerge if any merge - see: + notes: + called by qh_premerge calls qh_mergecycle for multiple, same cycle facets design: for each facet on facetlist - skip facets with duplicate ridges and normals + skip facets with dupridges and normals check that facet is in a samecycle (->mergehorizon) if facet only member of samecycle sets vertex->delridge for all vertices except apex merge facet into horizon else mark all facets in samecycle - remove facets with duplicate ridges from samecycle + remove facets with dupridges from samecycle merge samecycle into horizon (deletes facets from facetlist) */ void qh_mergecycle_all(facetT *facetlist, boolT *wasmerge) { - facetT *facet, *same, *prev, *horizon; + facetT *facet, *same, *prev, *horizon, *newfacet; facetT *samecycle= NULL, *nextfacet, *nextsame; vertexT *apex, *vertex, **vertexp; - int cycles=0, total=0, facets, nummerge; + int cycles=0, total=0, facets, nummerge, numdegen= 0; - trace2((qh ferr, 2031, "qh_mergecycle_all: begin\n")); - for (facet= facetlist; facet && (nextfacet= facet->next); facet= nextfacet) { + trace2((qh ferr, 2031, "qh_mergecycle_all: merge new facets into coplanar horizon facets. Bulk merge a cycle of facets with the same horizon facet\n")); + for (facet=facetlist; facet && (nextfacet= facet->next); facet= nextfacet) { if (facet->normal) continue; if (!facet->mergehorizon) { - qh_fprintf(qh ferr, 6225, "Qhull internal error (qh_mergecycle_all): f%d without normal\n", facet->id); + qh_fprintf(qh ferr, 6225, "qhull internal error (qh_mergecycle_all): f%d without normal\n", facet->id); qh_errexit(qh_ERRqhull, facet, NULL); } horizon= SETfirstt_(facet->neighbors, facetT); if (facet->f.samecycle == facet) { + if (qh TRACEmerge-1 == zzval_(Ztotmerge)) + qhmem.IStracing= qh IStracing= qh TRACElevel; zinc_(Zonehorizon); /* merge distance done in qh_findhorizon */ apex= SETfirstt_(facet->vertices, vertexT); @@ -1862,7 +2926,7 @@ vertex->delridge= True; } horizon->f.newcycle= NULL; - qh_mergefacet(facet, horizon, NULL, NULL, qh_MERGEapex); + qh_mergefacet(facet, horizon, MRGcoplanarhorizon, NULL, NULL, qh_MERGEapex); }else { samecycle= facet; facets= 0; @@ -1889,7 +2953,7 @@ if (nummerge > qh_MAXnummerge) horizon->nummerge= qh_MAXnummerge; else - horizon->nummerge= (short unsigned int)nummerge; + horizon->nummerge= (short unsigned int)nummerge; /* limited to 9 bits by qh_MAXnummerge, -Wconversion */ zzinc_(Zcyclehorizon); total += facets; zzadd_(Zcyclefacettot, facets); @@ -1897,9 +2961,20 @@ } cycles++; } - if (cycles) + if (cycles) { + FORALLnew_facets { + /* qh_maybe_duplicateridges postponed since qh_mergecycle_ridges deletes ridges without calling qh_delridge_merge */ + if (newfacet->coplanarhorizon) { + qh_test_redundant_neighbors(newfacet); + qh_maybe_duplicateridges(newfacet); + newfacet->coplanarhorizon= False; + } + } + numdegen += qh_merge_degenredundant(); *wasmerge= True; - trace1((qh ferr, 1013, "qh_mergecycle_all: merged %d same cycles or facets into coplanar horizons\n", cycles)); + trace1((qh ferr, 1013, "qh_mergecycle_all: merged %d same cycles or facets into coplanar horizons and %d degenredundant facets\n", + cycles, numdegen)); + } } /* mergecycle_all */ /*-vertices)); qh_memfree_(ridge, (int)sizeof(ridgeT), freelistp); numold++; }else if (neighbor->visitid == samevisitid) { qh_setdel(neighbor->ridges, ridge); + if (qh traceridge == ridge) + qh traceridge= NULL; qh_setfree(&(ridge->vertices)); qh_memfree_(ridge, (int)sizeof(ridgeT), freelistp); numold++; @@ -2139,16 +3219,20 @@ ridge= qh_newridge(); ridge->vertices= qh_setnew_delnthsorted(same->vertices, qh hull_dim, neighbor_i, 0); - toporient= same->toporient ^ (neighbor_i & 0x1); + toporient= (boolT)(same->toporient ^ (neighbor_i & 0x1)); if (toporient) { ridge->top= newfacet; ridge->bottom= neighbor; + ridge->simplicialbot= True; }else { ridge->top= neighbor; ridge->bottom= newfacet; + ridge->simplicialtop= True; } qh_setappend(&(newfacet->ridges), ridge); qh_setappend(&(neighbor->ridges), ridge); + if (qh ridge_id == qh traceridge_id) + qh traceridge= ridge; numnew++; } } @@ -2220,14 +3304,17 @@ /*--------------------------------- - qh_mergefacet( facet1, facet2, mindist, maxdist, mergeapex ) + qh_mergefacet( facet1, facet2, mergetype, mindist, maxdist, mergeapex ) merges facet1 into facet2 - mergeapex==qh_MERGEapex if merging new facet into coplanar horizon + mergeapex==qh_MERGEapex if merging new facet into coplanar horizon (optimizes qh_mergesimplex) returns: qh.max_outside and qh.min_vertex updated initializes vertex neighbors on first merge + note: + mergetype only used for logging and error reporting + returns: facet2 contains facet1's vertices, neighbors, and ridges facet2 moved to end of qh.facet_list @@ -2242,6 +3329,7 @@ adds neighboring facets to facet_mergeset if redundant or degenerate notes: + when done, tests facet1 and facet2 for degenerate or redundant neighbors and dupridges mindist/maxdist may be NULL (only if both NULL) traces merge if fmax_(maxdist,-mindist) > TRACEdist @@ -2263,19 +3351,30 @@ merge facet1's vertices into facet2 merge facet1's vertex neighbors into facet2 add facet2's vertices to qh.new_vertexlist - unless qh_MERGEapex - test facet2 for degenerate or redundant neighbors - move facet1 to qh.visible_list for later deletion - move facet2 to end of qh.newfacet_list + move facet2 to end of qh.newfacet_list + unless MRGcoplanarhorizon + test facet2 for redundant neighbors + test facet1 for degenerate neighbors + test for redundant facet2 + maybe test for duplicate ridges ('Q15') + move facet1 to qh.visible_list for later deletion */ -void qh_mergefacet(facetT *facet1, facetT *facet2, realT *mindist, realT *maxdist, boolT mergeapex) { +void qh_mergefacet(facetT *facet1, facetT *facet2, mergeType mergetype, realT *mindist, realT *maxdist, boolT mergeapex) { boolT traceonce= False; vertexT *vertex, **vertexp; + realT mintwisted, vertexdist; + realT onemerge; int tracerestore=0, nummerge; + const char *mergename; + if(mergetype > 0 && mergetype < sizeof(mergetypes)/sizeof(char *)) + mergename= mergetypes[mergetype]; + else + mergename= mergetypes[MRGnone]; if (facet1->tricoplanar || facet2->tricoplanar) { if (!qh TRInormals) { - qh_fprintf(qh ferr, 6226, "Qhull internal error (qh_mergefacet): does not work for tricoplanar facets. Use option 'Q11'\n"); + qh_fprintf(qh ferr, 6226, "qhull internal error (qh_mergefacet): merge f%d into f%d for mergetype %d (%s) does not work for tricoplanar facets. Use option 'Q11'\n", + facet1->id, facet2->id, mergetype, mergename); qh_errexit2(qh_ERRqhull, facet1, facet2); } if (facet2->tricoplanar) { @@ -2294,14 +3393,14 @@ tracerestore= 0; qh IStracing= qh TRACElevel; traceonce= True; - qh_fprintf(qh ferr, 8075, "qh_mergefacet: ========= trace wide merge #%d(%2.2g) for f%d into f%d, last point was p%d\n", zzval_(Ztotmerge), - fmax_(-*mindist, *maxdist), facet1->id, facet2->id, qh furthest_id); + qh_fprintf(qh ferr, 8075, "qh_mergefacet: ========= trace wide merge #%d(%2.2g) for f%d into f%d for mergetype %d (%s), last point was p%d\n", + zzval_(Ztotmerge), fmax_(-*mindist, *maxdist), facet1->id, facet2->id, mergetype, mergename, qh furthest_id); }else if (facet1 == qh tracefacet || facet2 == qh tracefacet) { tracerestore= qh IStracing; qh IStracing= 4; traceonce= True; - qh_fprintf(qh ferr, 8076, "qh_mergefacet: ========= trace merge #%d involving f%d, furthest is p%d\n", - zzval_(Ztotmerge), qh tracefacet_id, qh furthest_id); + qh_fprintf(qh ferr, 8076, "qh_mergefacet: ========= trace merge #%d for f%d into f%d for mergetype %d (%s), furthest is p%d\n", + zzval_(Ztotmerge), facet1->id, facet2->id, mergetype, mergename, qh furthest_id); } } if (qh IStracing >= 2) { @@ -2312,23 +3411,38 @@ mergemin= *mindist; mergemax= *maxdist; } - qh_fprintf(qh ferr, 8077, "qh_mergefacet: #%d merge f%d into f%d, mindist= %2.2g, maxdist= %2.2g\n", - zzval_(Ztotmerge), facet1->id, facet2->id, mergemin, mergemax); + qh_fprintf(qh ferr, 2081, "qh_mergefacet: #%d merge f%d into f%d for merge for mergetype %d (%s), mindist= %2.2g, maxdist= %2.2g, max_outside %2.2g\n", + zzval_(Ztotmerge), facet1->id, facet2->id, mergetype, mergename, mergemin, mergemax, qh max_outside); } #endif /* !qh_NOtrace */ + if(!qh ALLOWwide && mindist) { + mintwisted= qh_WIDEmaxoutside * qh ONEmerge; /* same as qh_merge_twisted and qh_check_maxout (poly2) */ + maximize_(mintwisted, facet1->maxoutside); + maximize_(mintwisted, facet2->maxoutside); + if (*maxdist > mintwisted || -*mindist > mintwisted) { + vertexdist= qh_vertex_bestdist(facet1->vertices); + onemerge= qh ONEmerge + qh DISTround; + if (vertexdist > mintwisted) { + qh_fprintf(qh ferr, 6347, "qhull precision error (qh_mergefacet): wide merge for facet f%d into f%d for mergetype %d (%s). maxdist %2.2g (%.1fx) mindist %2.2g (%.1fx) vertexdist %2.2g Allow with 'Q12' (allow-wide)\n", + facet1->id, facet2->id, mergetype, mergename, *maxdist, *maxdist/onemerge, *mindist, -*mindist/onemerge, vertexdist); + }else { + qh_fprintf(qh ferr, 6348, "qhull precision error (qh_mergefacet): wide merge for pinched facet f%d into f%d for mergetype %d (%s). maxdist %2.2g (%.fx) mindist %2.2g (%.1fx) vertexdist %2.2g Allow with 'Q12' (allow-wide)\n", + facet1->id, facet2->id, mergetype, mergename, *maxdist, *maxdist/onemerge, *mindist, -*mindist/onemerge, vertexdist); + } + qh_errexit2(qh_ERRwide, facet1, facet2); + } + } if (facet1 == facet2 || facet1->visible || facet2->visible) { - qh_fprintf(qh ferr, 6099, "qhull internal error (qh_mergefacet): either f%d and f%d are the same or one is a visible facet\n", - facet1->id, facet2->id); + qh_fprintf(qh ferr, 6099, "qhull internal error (qh_mergefacet): either f%d and f%d are the same or one is a visible facet, mergetype %d (%s)\n", + facet1->id, facet2->id, mergetype, mergename); qh_errexit2(qh_ERRqhull, facet1, facet2); } if (qh num_facets - qh num_visible <= qh hull_dim + 1) { - qh_fprintf(qh ferr, 6227, "\n\ -qhull precision error: Only %d facets remain. Can not merge another\n\ -pair. The input is too degenerate or the convexity constraints are\n\ -too strong.\n", qh hull_dim+1); + qh_fprintf(qh ferr, 6227, "qhull topology error: Only %d facets remain. The input is too degenerate or the convexity constraints are too strong.\n", + qh hull_dim+1); if (qh hull_dim >= 5 && !qh MERGEexact) - qh_fprintf(qh ferr, 8079, "Option 'Qx' may avoid this problem.\n"); - qh_errexit(qh_ERRprec, NULL, NULL); + qh_fprintf(qh ferr, 8079, " Option 'Qx' may avoid this problem.\n"); + qh_errexit(qh_ERRtopology, NULL, NULL); } if (!qh VERTEXneighbors) qh_vertexneighbors(); @@ -2353,7 +3467,7 @@ if (nummerge >= qh_MAXnummerge) facet2->nummerge= qh_MAXnummerge; else - facet2->nummerge= (short unsigned int)nummerge; + facet2->nummerge= (short unsigned int)nummerge; /* limited to 9 bits by qh_MAXnummerge, -Wconversion */ facet2->newmerge= True; facet2->dupridge= False; qh_updatetested(facet1, facet2); @@ -2374,25 +3488,34 @@ if (!facet2->newfacet) qh_newvertices(facet2->vertices); } - if (!mergeapex) - qh_degen_redundant_neighbors(facet2, facet1); - if (facet2->coplanar || !facet2->newfacet) { + if (facet2->coplanarhorizon) { + zinc_(Zmergeintocoplanar); + }else if (!facet2->newfacet) { zinc_(Zmergeintohorizon); }else if (!facet1->newfacet && facet2->newfacet) { zinc_(Zmergehorizon); }else { zinc_(Zmergenew); } - qh_willdelete(facet1, facet2); qh_removefacet(facet2); /* append as a newfacet to end of qh facet_list */ qh_appendfacet(facet2); facet2->newfacet= True; facet2->tested= False; - qh_tracemerge(facet1, facet2); + qh_tracemerge(facet1, facet2, mergetype); if (traceonce) { qh_fprintf(qh ferr, 8080, "qh_mergefacet: end of wide tracing\n"); qh IStracing= tracerestore; } + if (mergetype != MRGcoplanarhorizon) { + trace3((qh ferr, 3076, "qh_mergefacet: check f%d and f%d for redundant and degenerate neighbors\n", + facet1->id, facet2->id)); + qh_test_redundant_neighbors(facet2); + qh_test_degen_neighbors(facet1); /* after qh_test_redundant_neighbors since MRGdegen more difficult than MRGredundant + and before qh_willdelete which clears facet1.neighbors */ + qh_degen_redundant_facet(facet2); /* may occur in qh_merge_pinchedvertices, e.g., rbox 175 C3,2e-13 D4 t1545228104 | qhull d */ + qh_maybe_duplicateridges(facet2); + } + qh_willdelete(facet1, facet2); } /* mergefacet */ @@ -2468,7 +3591,7 @@ SETfirst_(facet2->neighbors)= neighborB; SETsecond_(facet2->neighbors)= neighborA; } - qh_makeridges(neighborB); + /* qh_makeridges not needed since neighborB is not degenerate */ qh_setreplace(neighborB->neighbors, facet1, facet2); trace4((qh ferr, 4036, "qh_mergefacet2d: merged v%d and neighbor f%d of f%d into f%d\n", vertexA->id, neighborB->id, facet1->id, facet2->id)); @@ -2481,13 +3604,15 @@ qh_mergeneighbors( facet1, facet2 ) merges the neighbors of facet1 into facet2 - see: - qh_mergecycle_neighbors() + notes: + only called by qh_mergefacet + qh.hull_dim >= 3 + see qh_mergecycle_neighbors design: for each neighbor of facet1 if neighbor is also a neighbor of facet2 - if neighbor is simpilicial + if neighbor is simplicial make ridges for later deletion as a degenerate facet update its neighbor set else @@ -2544,23 +3669,24 @@ */ void qh_mergeridges(facetT *facet1, facetT *facet2) { ridgeT *ridge, **ridgep; - vertexT *vertex, **vertexp; - trace4((qh ferr, 4038, "qh_mergeridges: merge ridges of f%d and f%d\n", + trace4((qh ferr, 4038, "qh_mergeridges: merge ridges of f%d into f%d\n", facet1->id, facet2->id)); FOREACHridge_(facet2->ridges) { if ((ridge->top == facet1) || (ridge->bottom == facet1)) { - FOREACHvertex_(ridge->vertices) - vertex->delridge= True; - qh_delridge(ridge); /* expensive in high-d, could rebuild */ - ridgep--; /*repeat*/ + /* ridge.nonconvex is irrelevant due to merge */ + qh_delridge_merge(ridge); /* expensive in high-d, could rebuild */ + ridgep--; /* deleted this ridge, repeat with next ridge*/ } } FOREACHridge_(facet1->ridges) { - if (ridge->top == facet1) + if (ridge->top == facet1) { ridge->top= facet2; - else + ridge->simplicialtop= False; + }else { /* ridge.bottom is facet1 */ ridge->bottom= facet2; + ridge->simplicialbot= False; + } qh_setappend(&(facet2->ridges), ridge); } } /* mergeridges */ @@ -2602,7 +3728,7 @@ if apex rename facet1 to facet2 in its vertex neighbors else - delete facet1 from vertex neighors + delete facet1 from vertex neighbors if only in facet2 add vertex to qh.del_vertices for later deletion for each ridge of facet1 @@ -2610,20 +3736,21 @@ append other ridges to facet2 after renaming facet to facet2 */ void qh_mergesimplex(facetT *facet1, facetT *facet2, boolT mergeapex) { - vertexT *vertex, **vertexp, *apex; + vertexT *vertex, **vertexp, *opposite; ridgeT *ridge, **ridgep; - boolT issubset= False; - int vertex_i= -1, vertex_n; + boolT isnew= False; facetT *neighbor, **neighborp, *otherfacet; if (mergeapex) { + opposite= SETfirstt_(facet1->vertices, vertexT); /* apex is opposite facet2. It has the last vertex id */ + trace4((qh ferr, 4086, "qh_mergesimplex: merge apex v%d of f%d into facet f%d\n", + opposite->id, facet1->id, facet2->id)); if (!facet2->newfacet) - qh_newvertices(facet2->vertices); /* apex is new */ - apex= SETfirstt_(facet1->vertices, vertexT); - if (SETfirstt_(facet2->vertices, vertexT) != apex) - qh_setaddnth(&facet2->vertices, 0, apex); /* apex has last id */ - else - issubset= True; + qh_newvertices(facet2->vertices); /* apex, the first vertex, is already new */ + if (SETfirstt_(facet2->vertices, vertexT) != opposite) { + qh_setaddnth(&facet2->vertices, 0, opposite); + isnew= True; + } }else { zinc_(Zmergesimplex); FOREACHvertex_(facet1->vertices) @@ -2641,30 +3768,21 @@ if (!vertex->seen) break; /* must occur */ } - apex= vertex; - trace4((qh ferr, 4039, "qh_mergesimplex: merge apex v%d of f%d into facet f%d\n", - apex->id, facet1->id, facet2->id)); - FOREACHvertex_i_(facet2->vertices) { - if (vertex->id < apex->id) { - break; - }else if (vertex->id == apex->id) { - issubset= True; - break; - } - } - if (!issubset) - qh_setaddnth(&facet2->vertices, vertex_i, apex); + opposite= vertex; + trace4((qh ferr, 4039, "qh_mergesimplex: merge opposite v%d of f%d into facet f%d\n", + opposite->id, facet1->id, facet2->id)); + isnew= qh_addfacetvertex(facet2, opposite); if (!facet2->newfacet) qh_newvertices(facet2->vertices); - else if (!apex->newlist) { - qh_removevertex(apex); - qh_appendvertex(apex); + else if (!opposite->newfacet) { + qh_removevertex(opposite); + qh_appendvertex(opposite); } } trace4((qh ferr, 4040, "qh_mergesimplex: update vertex neighbors of f%d\n", facet1->id)); FOREACHvertex_(facet1->vertices) { - if (vertex == apex && !issubset) + if (vertex == opposite && isnew) qh_setreplace(vertex->neighbors, facet1, facet2); else { qh_setdel(vertex->neighbors, facet1); @@ -2680,11 +3798,17 @@ FOREACHridge_(facet1->ridges) { otherfacet= otherfacet_(ridge, facet1); if (otherfacet == facet2) { - qh_setdel(facet2->ridges, ridge); - qh_setfree(&(ridge->vertices)); - qh_memfree(ridge, (int)sizeof(ridgeT)); - qh_setdel(facet2->neighbors, facet1); + /* ridge.nonconvex is irrelevant due to merge */ + qh_delridge_merge(ridge); /* expensive in high-d, could rebuild */ + ridgep--; /* deleted this ridge, repeat with next ridge*/ + qh_setdel(facet2->neighbors, facet1); /* a simplicial facet may have duplicate neighbors, need to delete each one */ + }else if (otherfacet->dupridge && !qh_setin(otherfacet->neighbors, facet1)) { + qh_fprintf(qh ferr, 6356, "qhull topology error (qh_mergesimplex): f%d is a dupridge of f%d, cannot merge f%d into f%d\n", + facet1->id, otherfacet->id, facet1->id, facet2->id); + qh_errexit2(qh_ERRqhull, facet1, otherfacet); }else { + trace4((qh ferr, 4059, "qh_mergesimplex: move r%d with f%d to f%d, new neighbor? %d, maybe horizon? %d\n", + ridge->id, otherfacet->id, facet2->id, (otherfacet->visitid != qh visit_id), (SETfirstt_(otherfacet->neighbors, facetT) == facet1))); qh_setappend(&facet2->ridges, ridge); if (otherfacet->visitid != qh visit_id) { qh_setappend(&facet2->neighbors, otherfacet); @@ -2693,22 +3817,26 @@ }else { if (otherfacet->simplicial) /* is degen, needs ridges */ qh_makeridges(otherfacet); - if (SETfirstt_(otherfacet->neighbors, facetT) != facet1) - qh_setdel(otherfacet->neighbors, facet1); - else { /*keep newfacet->neighbors->horizon*/ + if (SETfirstt_(otherfacet->neighbors, facetT) == facet1) { + /* keep new, otherfacet->neighbors->horizon */ qh_setdel(otherfacet->neighbors, facet2); qh_setreplace(otherfacet->neighbors, facet1, facet2); + }else { + /* facet2 is already a neighbor of otherfacet, by f.visitid */ + qh_setdel(otherfacet->neighbors, facet1); } } - if (ridge->top == facet1) /* wait until after qh_makeridges */ + if (ridge->top == facet1) { /* wait until after qh_makeridges */ ridge->top= facet2; - else + ridge->simplicialtop= False; + }else { ridge->bottom= facet2; + ridge->simplicialbot= False; + } } } - SETfirst_(facet1->ridges)= NULL; /* it will be deleted */ - trace3((qh ferr, 3006, "qh_mergesimplex: merged simplex f%d apex v%d into facet f%d\n", - facet1->id, getid_(apex), facet2->id)); + trace3((qh ferr, 3006, "qh_mergesimplex: merged simplex f%d v%d into facet f%d\n", + facet1->id, opposite->id, facet2->id)); } /* mergesimplex */ /*-id, facet2->id)); if (qh tracevertex) { - qh_fprintf(qh ferr, 8081, "qh_mergevertex_neighbors: of f%d and f%d at furthest p%d f0= %p\n", + qh_fprintf(qh ferr, 8081, "qh_mergevertex_neighbors: of f%d into f%d at furthest p%d f0= %p\n", facet1->id, facet2->id, qh furthest_id, qh tracevertex->neighbors->e[0].p); qh_errprint("TRACE", NULL, NULL, NULL, qh tracevertex); } @@ -2828,6 +3956,8 @@ NULL if empty set notes: + only called by qh_redundant_vertex for qh_reducevertices + so f.vertices does not contain extraneous vertices that are not in f.ridges used for renaming vertices design: @@ -2875,69 +4005,300 @@ } /* neighbor_intersections */ /*--------------------------------- + >-------------------------------- - qh_newvertices( vertices ) - add vertices to end of qh.vertex_list (marks as new vertices) + qh_neighbor_vertices( vertex ) + return neighboring vertices for a vertex (not in subridge) + assumes vertices have full vertex->neighbors returns: - vertices on qh.newvertex_list - vertex->newlist set + temporary set of vertices + + notes: + updates qh.visit_id and qh.vertex_visit + similar to qh_vertexridges + */ -void qh_newvertices(setT *vertices) { +setT *qh_neighbor_vertices(vertexT *vertexA, setT *subridge) { + facetT *neighbor, **neighborp; vertexT *vertex, **vertexp; + setT *vertices= qh_settemp(qh TEMPsize); - FOREACHvertex_(vertices) { - if (!vertex->newlist) { - qh_removevertex(vertex); - qh_appendvertex(vertex); - } + qh visit_id++; + FOREACHneighbor_(vertexA) + neighbor->visitid= qh visit_id; + qh vertex_visit++; + vertexA->visitid= qh vertex_visit; + FOREACHvertex_(subridge) { + vertex->visitid= qh vertex_visit; } -} /* newvertices */ + FOREACHneighbor_(vertexA) { + if (*neighborp) /* no new ridges in last neighbor */ + qh_neighbor_vertices_facet(vertexA, neighbor, &vertices); + } + trace3((qh ferr, 3035, "qh_neighbor_vertices: %d non-subridge, vertex neighbors for v%d\n", + qh_setsize(vertices), vertexA->id)); + return vertices; +} /* neighbor_vertices */ /*--------------------------------- + >-------------------------------- - qh_reducevertices() - reduce extra vertices, shared vertices, and redundant vertices - facet->newmerge is set if merged since last call - if !qh.MERGEvertices, only removes extra vertices + qh_neighbor_vertices_facet( vertex, facet, vertices ) + add neighboring vertices on ridges for vertex in facet + neighbor->visitid==qh.visit_id if it hasn't been visited + v.visitid==qh.vertex_visit if it is already in vertices returns: - True if also merged degen_redundant facets - vertices are renamed if possible - clears facet->newmerge and vertex->delridge + vertices updated + sets facet->visitid to qh.visit_id-1 notes: - ignored if 2-d + only called by qh_neighbor_vertices + similar to qh_vertexridges_facet design: - merge any degenerate or redundant facets - for each newly merged facet - remove extra vertices - if qh.MERGEvertices - for each newly merged facet - for each vertex - if vertex was on a deleted ridge - rename vertex if it is shared - remove delridge flag from new vertices + for each ridge of facet + if ridge of visited neighbor (i.e., unprocessed) + if vertex in ridge + append unprocessed vertices of ridge + mark facet processed */ -boolT qh_reducevertices(void) { - int numshare=0, numrename= 0; - boolT degenredun= False; - facetT *newfacet; - vertexT *vertex, **vertexp; +void qh_neighbor_vertices_facet(vertexT *vertexA, facetT *facet, setT **vertices) { + ridgeT *ridge, **ridgep; + facetT *neighbor; + vertexT *second, *last, *vertex, **vertexp; + int last_i= qh hull_dim-2, count= 0; + boolT isridge; - if (qh hull_dim == 2) - return False; - if (qh_merge_degenredundant()) + if (facet->simplicial) { + FOREACHvertex_(facet->vertices) { + if (vertex->visitid != qh vertex_visit) { + vertex->visitid= qh vertex_visit; + qh_setappend(vertices, vertex); + count++; + } + } + }else { + FOREACHridge_(facet->ridges) { + neighbor= otherfacet_(ridge, facet); + if (neighbor->visitid == qh visit_id) { + isridge= False; + if (SETfirst_(ridge->vertices) == vertexA) { + isridge= True; + }else if (last_i > 2) { + second= SETsecondt_(ridge->vertices, vertexT); + last= SETelemt_(ridge->vertices, last_i, vertexT); + if (second->id >= vertexA->id && last->id <= vertexA->id) { /* vertices inverse sorted by id */ + if (second == vertexA || last == vertexA) + isridge= True; + else if (qh_setin(ridge->vertices, vertexA)) + isridge= True; + } + }else if (SETelem_(ridge->vertices, last_i) == vertexA) { + isridge= True; + }else if (last_i > 1 && SETsecond_(ridge->vertices) == vertexA) { + isridge= True; + } + if (isridge) { + FOREACHvertex_(ridge->vertices) { + if (vertex->visitid != qh vertex_visit) { + vertex->visitid= qh vertex_visit; + qh_setappend(vertices, vertex); + count++; + } + } + } + } + } + } + facet->visitid= qh visit_id-1; + if (count) { + trace4((qh ferr, 4079, "qh_neighbor_vertices_facet: found %d vertex neighbors for v%d in f%d (simplicial? %d)\n", + count, vertexA->id, facet->id, facet->simplicial)); + } +} /* neighbor_vertices_facet */ + + +/*--------------------------------- + + qh_newvertices( vertices ) + add vertices to end of qh.vertex_list (marks as new vertices) + + returns: + vertices on qh.newvertex_list + vertex->newfacet set +*/ +void qh_newvertices(setT *vertices) { + vertexT *vertex, **vertexp; + + FOREACHvertex_(vertices) { + if (!vertex->newfacet) { + qh_removevertex(vertex); + qh_appendvertex(vertex); + } + } +} /* newvertices */ + +/*--------------------------------- + + qh_next_vertexmerge( ) + return next vertex merge from qh.vertex_mergeset + + returns: + vertex merge either MRGvertices or MRGsubridge + drops merges of deleted vertices + + notes: + called from qh_merge_pinchedvertices +*/ +mergeT *qh_next_vertexmerge(void /* qh.vertex_mergeset */) { + mergeT *merge; + int merge_i, merge_n, best_i= -1; + realT bestdist= REALmax; + + FOREACHmerge_i_(qh vertex_mergeset) { + if (!merge->vertex1 || !merge->vertex2) { + qh_fprintf(qh ferr, 6299, "qhull internal error (qh_next_vertexmerge): expecting two vertices for vertex merge. Got v%d v%d and optional f%d\n", + getid_(merge->vertex1), getid_(merge->vertex2), getid_(merge->facet1)); + qh_errexit(qh_ERRqhull, merge->facet1, NULL); + } + if (merge->vertex1->deleted || merge->vertex2->deleted) { + trace3((qh ferr, 3030, "qh_next_vertexmerge: drop merge of v%d (del? %d) into v%d (del? %d) due to deleted vertex of r%d and r%d\n", + merge->vertex1->id, merge->vertex1->deleted, merge->vertex2->id, merge->vertex2->deleted, getid_(merge->ridge1), getid_(merge->ridge2))); + qh_drop_mergevertex(merge); + qh_setdelnth(qh vertex_mergeset, merge_i); + merge_i--; merge_n--; + qh_memfree(merge, (int)sizeof(mergeT)); + }else if (merge->distance < bestdist) { + bestdist= merge->distance; + best_i= merge_i; + } + } + merge= NULL; + if (best_i >= 0) { + merge= SETelemt_(qh vertex_mergeset, best_i, mergeT); + if (bestdist/qh ONEmerge > qh_WIDEpinched) { + if (merge->mergetype==MRGvertices) { + if (merge->ridge1->top == merge->ridge2->bottom && merge->ridge1->bottom == merge->ridge2->top) + qh_fprintf(qh ferr, 6391, "qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve opposite oriented ridges r%d and r%d in f%d and f%d. Nearest v%d and v%d dist %2.2g (%.1fx)\n", + merge->ridge1->id, merge->ridge2->id, merge->ridge1->top->id, merge->ridge1->bottom->id, merge->vertex1->id, merge->vertex2->id, bestdist, bestdist/qh ONEmerge); + else + qh_fprintf(qh ferr, 6381, "qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve duplicate ridges r%d and r%d. Nearest v%d and v%d dist %2.2g (%.1fx)\n", + merge->ridge1->id, merge->ridge2->id, merge->vertex1->id, merge->vertex2->id, bestdist, bestdist/qh ONEmerge); + }else { + qh_fprintf(qh ferr, 6208, "qhull topology error (qh_next_vertexmerge): no nearly adjacent vertices to resolve dupridge. Nearest v%d and v%d dist %2.2g (%.1fx)\n", + merge->vertex1->id, merge->vertex2->id, bestdist, bestdist/qh ONEmerge); + } + /* it may be possible to find a different vertex, after other vertex merges have occurred */ + qh_errexit(qh_ERRtopology, NULL, merge->ridge1); + } + qh_setdelnth(qh vertex_mergeset, best_i); + } + return merge; +} /* next_vertexmerge */ + +/*--------------------------------- + + qh_opposite_horizonfacet( merge, opposite ) + return horizon facet for one of the merge facets, and its opposite vertex across the ridge + assumes either facet1 or facet2 of merge is 'mergehorizon' + assumes both facets are simplicial facets on qh.new_facetlist + + returns: + horizon facet and opposite vertex + + notes: + called by qh_getpinchedmerges +*/ +facetT *qh_opposite_horizonfacet(mergeT *merge, vertexT **opposite) { + facetT *facet, *horizon, *otherfacet; + int neighbor_i; + + if (!merge->facet1->simplicial || !merge->facet2->simplicial || (!merge->facet1->mergehorizon && !merge->facet2->mergehorizon)) { + qh_fprintf(qh ferr, 6273, "qhull internal error (qh_opposite_horizonfacet): expecting merge of simplicial facets, at least one of which is mergehorizon. Either simplicial or mergehorizon is wrong\n"); + qh_errexit2(qh_ERRqhull, merge->facet1, merge->facet2); + } + if (merge->facet1->mergehorizon) { + facet= merge->facet1; + otherfacet= merge->facet2; + }else { + facet= merge->facet2; + otherfacet= merge->facet1; + } + horizon= SETfirstt_(facet->neighbors, facetT); + neighbor_i= qh_setindex(otherfacet->neighbors, facet); + if (neighbor_i==-1) + neighbor_i= qh_setindex(otherfacet->neighbors, qh_MERGEridge); + if (neighbor_i==-1) { + qh_fprintf(qh ferr, 6238, "qhull internal error (qh_opposite_horizonfacet): merge facet f%d not connected to mergehorizon f%d\n", + otherfacet->id, facet->id); + qh_errexit2(qh_ERRqhull, otherfacet, facet); + } + *opposite= SETelemt_(otherfacet->vertices, neighbor_i, vertexT); + return horizon; +} /* opposite_horizonfacet */ + + +/*--------------------------------- + + qh_reducevertices( ) + reduce extra vertices, shared vertices, and redundant vertices + facet->newmerge is set if merged since last call + vertex->delridge is set if vertex was on a deleted ridge + if !qh.MERGEvertices, only removes extra vertices + + returns: + True if also merged degen_redundant facets + vertices are renamed if possible + clears facet->newmerge and vertex->delridge + + notes: + called by qh_all_merges and qh_postmerge + ignored if 2-d + + design: + merge any degenerate or redundant facets + repeat until no more degenerate or redundant facets + for each newly merged facet + remove extra vertices + if qh.MERGEvertices + for each newly merged facet + for each vertex + if vertex was on a deleted ridge + rename vertex if it is shared + for each new, undeleted vertex + remove delridge flag + if vertex is redundant + merge degenerate or redundant facets +*/ +boolT qh_reducevertices(void) { + int numshare=0, numrename= 0; + boolT degenredun= False; + facetT *newfacet; + vertexT *vertex, **vertexp; + + if (qh hull_dim == 2) + return False; + trace2((qh ferr, 2101, "qh_reducevertices: reduce extra vertices, shared vertices, and redundant vertices\n")); + if (qh_merge_degenredundant()) degenredun= True; - LABELrestart: +LABELrestart: FORALLnew_facets { if (newfacet->newmerge) { if (!qh MERGEvertices) newfacet->newmerge= False; - qh_remove_extravertices(newfacet); + if (qh_remove_extravertices(newfacet)) { + qh_degen_redundant_facet(newfacet); + if (qh_merge_degenredundant()) { + degenredun= True; + goto LABELrestart; + } + } } } if (!qh MERGEvertices) @@ -2949,6 +4310,10 @@ if (vertex->delridge) { if (qh_rename_sharedvertex(vertex, newfacet)) { numshare++; + if (qh_merge_degenredundant()) { + degenredun= True; + goto LABELrestart; + } vertexp--; /* repeat since deleted vertex */ } } @@ -2976,33 +4341,36 @@ >-------------------------------- qh_redundant_vertex( vertex ) - detect and rename a redundant vertex - vertices have full vertex->neighbors + rename a redundant vertex if qh_find_newvertex succeeds + assumes vertices have full vertex->neighbors returns: - returns true if find a redundant vertex - deletes vertex(vertex->deleted) + if find a replacement vertex + returns new vertex + qh_renamevertex sets vertex->deleted for redundant vertex notes: - only needed if vertex->delridge and hull_dim >= 4 + only called by qh_reducevertices for vertex->delridge and hull_dim >= 4 may add degenerate facets to qh.facet_mergeset doesn't change vertex->neighbors or create redundant facets design: intersect vertices of all facet neighbors of vertex determine ridges for these vertices - if find a new vertex for vertex amoung these ridges and vertices + if find a new vertex for vertex among these ridges and vertices rename vertex to the new vertex */ vertexT *qh_redundant_vertex(vertexT *vertex) { vertexT *newvertex= NULL; setT *vertices, *ridges; - trace3((qh ferr, 3008, "qh_redundant_vertex: check if v%d can be renamed\n", vertex->id)); + trace3((qh ferr, 3008, "qh_redundant_vertex: check if v%d from a deleted ridge can be renamed\n", vertex->id)); if ((vertices= qh_neighbor_intersections(vertex))) { - ridges= qh_vertexridges(vertex); - if ((newvertex= qh_find_newvertex(vertex, vertices, ridges))) - qh_renamevertex(vertex, newvertex, ridges, NULL, NULL); + ridges= qh_vertexridges(vertex, !qh_ALL); + if ((newvertex= qh_find_newvertex(vertex, vertices, ridges))) { + zinc_(Zrenameall); + qh_renamevertex(vertex, newvertex, ridges, NULL, NULL); /* ridges invalidated */ + } qh_settempfree(&ridges); qh_settempfree(&vertices); } @@ -3017,12 +4385,18 @@ returns: returns True if it finds them + deletes facet from vertex neighbors + facet may be redundant (test with qh_degen_redundant) + + notes: + called by qh_renamevertex and qh_reducevertices + a merge (qh_reducevertices) or qh_renamevertex may drop all ridges for a vertex in a facet design: for each vertex in facet if vertex not in a ridge (i.e., no longer used) delete vertex from facet - delete facet from vertice's neighbors + delete facet from vertex's neighbors unless vertex in another facet add vertex to qh.del_vertices for later deletion */ @@ -3031,7 +4405,10 @@ vertexT *vertex, **vertexp; boolT foundrem= False; - trace4((qh ferr, 4043, "qh_remove_extravertices: test f%d for extra vertices\n", + if (facet->simplicial) { + return False; + } + trace4((qh ferr, 4043, "qh_remove_extravertices: test non-simplicial f%d for extra vertices\n", facet->id)); FOREACHvertex_(facet->vertices) vertex->seen= False; @@ -3059,6 +4436,127 @@ } /* remove_extravertices */ /*--------------------------------- + + qh_remove_mergetype( mergeset, mergetype ) + Remove mergetype merges from mergeset + + notes: + Does not preserve order +*/ +void qh_remove_mergetype(setT *mergeset, mergeType type) { + mergeT *merge; + int merge_i, merge_n; + + FOREACHmerge_i_(mergeset) { + if (merge->mergetype == type) { + trace3((qh ferr, 3037, "qh_remove_mergetype: remove merge f%d f%d v%d v%d r%d r%d dist %2.2g type %d", + getid_(merge->facet1), getid_(merge->facet2), getid_(merge->vertex1), getid_(merge->vertex2), getid_(merge->ridge1), getid_(merge->ridge2), merge->distance, type)); + qh_setdelnth(mergeset, merge_i); + merge_i--; merge_n--; /* repeat with next merge */ + } + } +} /* remove_mergetype */ + +/*--------------------------------- + + qh_rename_adjacentvertex( oldvertex, newvertex ) + renames oldvertex as newvertex. Must be adjacent (i.e., in the same subridge) + no-op if either vertex is deleted + + notes: + called from qh_merge_pinchedvertices + + design: + for all neighbors of oldvertex + if simplicial, rename oldvertex to newvertex and drop if degenerate + if needed, add oldvertex neighbor to newvertex + determine ridges for oldvertex + rename oldvertex as newvertex in ridges (qh_renamevertex) +*/ +void qh_rename_adjacentvertex(vertexT *oldvertex, vertexT *newvertex, realT dist) { + setT *ridges; + facetT *neighbor, **neighborp, *maxfacet= NULL; + ridgeT *ridge, **ridgep; + boolT istrace= False; + int oldsize= qh_setsize(oldvertex->neighbors); + int newsize= qh_setsize(newvertex->neighbors); + coordT maxdist2= -REALmax, dist2; + + if (qh IStracing >= 4 || oldvertex->id == qh tracevertex_id || newvertex->id == qh tracevertex_id) { + istrace= True; + } + zzinc_(Ztotmerge); + if (istrace) { + qh_fprintf(qh ferr, 2071, "qh_rename_adjacentvertex: merge #%d rename v%d (%d neighbors) to v%d (%d neighbors) dist %2.2g\n", + zzval_(Ztotmerge), oldvertex->id, oldsize, newvertex->id, newsize, dist); + } + if (oldvertex->deleted || newvertex->deleted) { + if (istrace || qh IStracing >= 2) { + qh_fprintf(qh ferr, 2072, "qh_rename_adjacentvertex: ignore rename. Either v%d (%d) or v%d (%d) is deleted\n", + oldvertex->id, oldvertex->deleted, newvertex->id, newvertex->deleted); + } + return; + } + if (oldsize == 0 || newsize == 0) { + qh_fprintf(qh ferr, 2072, "qhull internal error (qh_rename_adjacentvertex): expecting neighbor facets for v%d and v%d. Got %d and %d neighbors resp.\n", + oldvertex->id, newvertex->id, oldsize, newsize); + qh_errexit(qh_ERRqhull, NULL, NULL); + } + FOREACHneighbor_(oldvertex) { + if (neighbor->simplicial) { + if (qh_setin(neighbor->vertices, newvertex)) { + if (istrace || qh IStracing >= 2) { + qh_fprintf(qh ferr, 2070, "qh_rename_adjacentvertex: simplicial f%d contains old v%d and new v%d. Will be marked degenerate by qh_renamevertex\n", + neighbor->id, oldvertex->id, newvertex->id); + } + qh_makeridges(neighbor); /* no longer simplicial, nummerge==0, skipped by qh_maybe_duplicateridge */ + }else { + qh_replacefacetvertex(neighbor, oldvertex, newvertex); + qh_setunique(&newvertex->neighbors, neighbor); + qh_newvertices(neighbor->vertices); /* for qh_update_vertexneighbors of vertex neighbors */ + } + } + } + ridges= qh_vertexridges(oldvertex, qh_ALL); + if (istrace) { + FOREACHridge_(ridges) { + qh_printridge(qh ferr, ridge); + } + } + FOREACHneighbor_(oldvertex) { + if (!neighbor->simplicial){ + qh_addfacetvertex(neighbor, newvertex); + qh_setunique(&newvertex->neighbors, neighbor); + qh_newvertices(neighbor->vertices); /* for qh_update_vertexneighbors of vertex neighbors */ + if (qh newfacet_list == qh facet_tail) { + qh_removefacet(neighbor); /* add a neighbor to newfacet_list so that qh_partitionvisible has a newfacet */ + qh_appendfacet(neighbor); + neighbor->newfacet= True; + } + } + } + qh_renamevertex(oldvertex, newvertex, ridges, NULL, NULL); /* ridges invalidated */ + if (oldvertex->deleted && !oldvertex->partitioned) { + FOREACHneighbor_(newvertex) { + if (!neighbor->visible) { + qh_distplane(oldvertex->point, neighbor, &dist2); + if (dist2>maxdist2) { + maxdist2= dist2; + maxfacet= neighbor; + } + } + } + trace2((qh ferr, 2096, "qh_rename_adjacentvertex: partition old p%d(v%d) as a coplanar point for furthest f%d dist %2.2g. Maybe repartition later (QH0031)\n", + qh_pointid(oldvertex->point), oldvertex->id, maxfacet->id, maxdist2)) + qh_partitioncoplanar(oldvertex->point, maxfacet, NULL, !qh_ALL); /* faster with maxdist2, otherwise duplicates distance tests from maxdist2/dist2 */ + oldvertex->partitioned= True; + } + qh_settempfree(&ridges); +} /* rename_adjacentvertex */ + +/*--------------------------------- qh_rename_sharedvertex( vertex, facet ) @@ -3072,6 +4570,8 @@ updates vertex->neighbors notes: + only called by qh_reducevertices after qh_remove_extravertices + so f.vertices does not contain extraneous vertices a shared vertex for a facet is only in ridges to one neighbor this may undo a pinched facet @@ -3088,7 +4588,7 @@ vertexT *qh_rename_sharedvertex(vertexT *vertex, facetT *facet) { facetT *neighbor, **neighborp, *neighborA= NULL; setT *vertices, *ridges; - vertexT *newvertex; + vertexT *newvertex= NULL; if (qh_setsize(vertex->neighbors) == 2) { neighborA= SETfirstt_(vertex->neighbors, facetT); @@ -3107,27 +4607,29 @@ neighborA= neighbor; } } - if (!neighborA) { - qh_fprintf(qh ferr, 6101, "qhull internal error (qh_rename_sharedvertex): v%d's neighbors not in f%d\n", + } + if (!neighborA) { + qh_fprintf(qh ferr, 6101, "qhull internal error (qh_rename_sharedvertex): v%d's neighbors not in f%d\n", vertex->id, facet->id); - qh_errprint("ERRONEOUS", facet, NULL, NULL, vertex); - qh_errexit(qh_ERRqhull, NULL, NULL); - } + qh_errprint("ERRONEOUS", facet, NULL, NULL, vertex); + qh_errexit(qh_ERRqhull, NULL, NULL); + } + if (neighborA) { /* avoid warning */ + /* the vertex is shared by facet and neighborA */ + ridges= qh_settemp(qh TEMPsize); + neighborA->visitid= ++qh visit_id; + qh_vertexridges_facet(vertex, facet, &ridges); + trace2((qh ferr, 2037, "qh_rename_sharedvertex: p%d(v%d) is shared by f%d(%d ridges) and f%d\n", + qh_pointid(vertex->point), vertex->id, facet->id, qh_setsize(ridges), neighborA->id)); + zinc_(Zintersectnum); + vertices= qh_vertexintersect_new(facet->vertices, neighborA->vertices); + qh_setdel(vertices, vertex); + qh_settemppush(vertices); + if ((newvertex= qh_find_newvertex(vertex, vertices, ridges))) + qh_renamevertex(vertex, newvertex, ridges, facet, neighborA); /* ridges invalidated */ + qh_settempfree(&vertices); + qh_settempfree(&ridges); } - /* the vertex is shared by facet and neighborA */ - ridges= qh_settemp(qh TEMPsize); - neighborA->visitid= ++qh visit_id; - qh_vertexridges_facet(vertex, facet, &ridges); - trace2((qh ferr, 2037, "qh_rename_sharedvertex: p%d(v%d) is shared by f%d(%d ridges) and f%d\n", - qh_pointid(vertex->point), vertex->id, facet->id, qh_setsize(ridges), neighborA->id)); - zinc_(Zintersectnum); - vertices= qh_vertexintersect_new(facet->vertices, neighborA->vertices); - qh_setdel(vertices, vertex); - qh_settemppush(vertices); - if ((newvertex= qh_find_newvertex(vertex, vertices, ridges))) - qh_renamevertex(vertex, newvertex, ridges, facet, neighborA); - qh_settempfree(&vertices); - qh_settempfree(&ridges); return newvertex; } /* rename_sharedvertex */ @@ -3138,6 +4640,12 @@ renames oldvertex as newvertex in ridge returns: + True if renames oldvertex + False if deleted the ridge + + notes: + called by qh_renamevertex + caller sets newvertex->delridge for deleted ridges (qh_reducevertices) design: delete oldvertex from ridge @@ -3148,12 +4656,17 @@ insert newvertex into the ridge adjust the ridge's orientation */ -void qh_renameridgevertex(ridgeT *ridge, vertexT *oldvertex, vertexT *newvertex) { +boolT qh_renameridgevertex(ridgeT *ridge, vertexT *oldvertex, vertexT *newvertex) { int nth= 0, oldnth; facetT *temp; vertexT *vertex, **vertexp; oldnth= qh_setindex(ridge->vertices, oldvertex); + if (oldnth < 0) { + qh_fprintf(qh ferr, 6424, "qhull internal error (qh_renameridgevertex): oldvertex v%d not found in r%d. Cannot rename to v%d\n", + oldvertex->id, ridge->id, newvertex->id); + qh_errexit(qh_ERRqhull, NULL, ridge); + } qh_setdelnthsorted(ridge->vertices, oldnth); FOREACHvertex_(ridge->vertices) { if (vertex == newvertex) { @@ -3162,14 +4675,16 @@ qh_copynonconvex(ridge); trace2((qh ferr, 2038, "qh_renameridgevertex: ridge r%d deleted. It contained both v%d and v%d\n", ridge->id, oldvertex->id, newvertex->id)); - qh_delridge(ridge); - return; + qh_delridge_merge(ridge); /* ridge.vertices deleted */ + return False; } if (vertex->id < newvertex->id) break; nth++; } qh_setaddnth(&ridge->vertices, nth, newvertex); + ridge->simplicialtop= False; + ridge->simplicialbot= False; if (abs(oldnth - nth)%2) { trace3((qh ferr, 3010, "qh_renameridgevertex: swapped the top and bottom of ridge r%d\n", ridge->id)); @@ -3177,6 +4692,7 @@ ridge->top= ridge->bottom; ridge->bottom= temp; } + return True; } /* renameridgevertex */ @@ -3184,21 +4700,27 @@ >-------------------------------- qh_renamevertex( oldvertex, newvertex, ridges, oldfacet, neighborA ) - renames oldvertex as newvertex in ridges - gives oldfacet/neighborA if oldvertex is shared between two facets + renames oldvertex as newvertex in ridges of non-simplicial neighbors + set oldfacet/neighborA if oldvertex is shared between two facets (qh_rename_sharedvertex) + otherwise qh_redundant_vertex or qh_rename_adjacentvertex returns: - oldvertex may still exist afterwards - + if oldfacet and multiple neighbors, oldvertex may still exist afterwards + otherwise sets oldvertex->deleted for later deletion + one or more ridges maybe deleted + ridges is invalidated + merges may be added to degen_mergeset via qh_maydropneighbor or qh_degen_redundant_facet notes: - can not change neighbors of newvertex (since it's a subset) + qh_rename_sharedvertex can not change neighbors of newvertex (since it's a subset) + qh_redundant_vertex due to vertex->delridge for qh_reducevertices + qh_rename_adjacentvertex for complete renames design: for each ridge in ridges rename oldvertex to newvertex and delete degenerate ridges if oldfacet not defined - for each neighbor of oldvertex + for each non-simplicial neighbor of oldvertex delete oldvertex from neighbor's vertices remove extra vertices from neighbor add oldvertex to qh.del_vertices @@ -3207,29 +4729,56 @@ add oldvertex to qh.del_vertices else oldvertex is in oldfacet and neighborA and other facets (i.e., pinched) delete oldvertex from oldfacet - delete oldfacet from oldvertice's neighbors + delete oldfacet from old vertex's neighbors remove extra vertices (e.g., oldvertex) from neighborA */ void qh_renamevertex(vertexT *oldvertex, vertexT *newvertex, setT *ridges, facetT *oldfacet, facetT *neighborA) { facetT *neighbor, **neighborp; ridgeT *ridge, **ridgep; + int topsize, bottomsize; boolT istrace= False; +#ifndef qh_NOtrace if (qh IStracing >= 2 || oldvertex->id == qh tracevertex_id || - newvertex->id == qh tracevertex_id) + newvertex->id == qh tracevertex_id) { istrace= True; - FOREACHridge_(ridges) - qh_renameridgevertex(ridge, oldvertex, newvertex); + qh_fprintf(qh ferr, 2086, "qh_renamevertex: rename v%d to v%d in %d ridges with old f%d and neighbor f%d\n", + oldvertex->id, newvertex->id, qh_setsize(ridges), getid_(oldfacet), getid_(neighborA)); + } +#endif + FOREACHridge_(ridges) { + if (qh_renameridgevertex(ridge, oldvertex, newvertex)) { /* ridge is deleted if False, invalidating ridges */ + topsize= qh_setsize(ridge->top->vertices); + bottomsize= qh_setsize(ridge->bottom->vertices); + if (topsize < qh hull_dim || (topsize == qh hull_dim && !ridge->top->simplicial && qh_setin(ridge->top->vertices, newvertex))) { + trace4((qh ferr, 4070, "qh_renamevertex: ignore duplicate check for r%d. top f%d (size %d) will be degenerate after rename v%d to v%d\n", + ridge->id, ridge->top->id, topsize, oldvertex->id, newvertex->id)); + }else if (bottomsize < qh hull_dim || (bottomsize == qh hull_dim && !ridge->bottom->simplicial && qh_setin(ridge->bottom->vertices, newvertex))) { + trace4((qh ferr, 4071, "qh_renamevertex: ignore duplicate check for r%d. bottom f%d (size %d) will be degenerate after rename v%d to v%d\n", + ridge->id, ridge->bottom->id, bottomsize, oldvertex->id, newvertex->id)); + }else + qh_maybe_duplicateridge(ridge); + } + } if (!oldfacet) { - zinc_(Zrenameall); + /* stat Zrenameall or Zpinchduplicate */ if (istrace) - qh_fprintf(qh ferr, 8082, "qh_renamevertex: renamed v%d to v%d in several facets\n", + qh_fprintf(qh ferr, 2087, "qh_renamevertex: renaming v%d to v%d in several facets for qh_redundant_vertex or MRGsubridge\n", oldvertex->id, newvertex->id); FOREACHneighbor_(oldvertex) { - qh_maydropneighbor(neighbor); - qh_setdelsorted(neighbor->vertices, oldvertex); - if (qh_remove_extravertices(neighbor)) - neighborp--; /* neighbor may be deleted */ + if (neighbor->simplicial) { + qh_degen_redundant_facet(neighbor); /* e.g., rbox 175 C3,2e-13 D4 t1545235541 | qhull d */ + }else { + if (istrace) + qh_fprintf(qh ferr, 4080, "qh_renamevertex: rename vertices in non-simplicial neighbor f%d of v%d\n", neighbor->id, oldvertex->id); + qh_maydropneighbor(neighbor); + qh_setdelsorted(neighbor->vertices, oldvertex); /* if degenerate, qh_degen_redundant_facet will add to mergeset */ + if (qh_remove_extravertices(neighbor)) + neighborp--; /* neighbor deleted from oldvertex neighborset */ + qh_degen_redundant_facet(neighbor); /* either direction may be redundant, faster if combine? */ + qh_test_redundant_neighbors(neighbor); + qh_test_degen_neighbors(neighbor); + } } if (!oldvertex->deleted) { oldvertex->deleted= True; @@ -3238,120 +4787,454 @@ }else if (qh_setsize(oldvertex->neighbors) == 2) { zinc_(Zrenameshare); if (istrace) - qh_fprintf(qh ferr, 8083, "qh_renamevertex: renamed v%d to v%d in oldfacet f%d\n", + qh_fprintf(qh ferr, 3039, "qh_renamevertex: renaming v%d to v%d in oldfacet f%d for qh_rename_sharedvertex\n", oldvertex->id, newvertex->id, oldfacet->id); - FOREACHneighbor_(oldvertex) + FOREACHneighbor_(oldvertex) { qh_setdelsorted(neighbor->vertices, oldvertex); + qh_degen_redundant_facet(neighbor); + } oldvertex->deleted= True; qh_setappend(&qh del_vertices, oldvertex); }else { zinc_(Zrenamepinch); - if (istrace || qh IStracing) - qh_fprintf(qh ferr, 8084, "qh_renamevertex: renamed pinched v%d to v%d between f%d and f%d\n", + if (istrace || qh IStracing >= 1) + qh_fprintf(qh ferr, 3040, "qh_renamevertex: renaming pinched v%d to v%d between f%d and f%d\n", oldvertex->id, newvertex->id, oldfacet->id, neighborA->id); qh_setdelsorted(oldfacet->vertices, oldvertex); qh_setdel(oldvertex->neighbors, oldfacet); - qh_remove_extravertices(neighborA); + if (qh_remove_extravertices(neighborA)) + qh_degen_redundant_facet(neighborA); } + if (oldfacet) + qh_degen_redundant_facet(oldfacet); } /* renamevertex */ - /*--------------------------------- - qh_test_appendmerge( facet, neighbor ) - tests facet/neighbor for convexity - appends to mergeset if non-convex + qh_test_appendmerge( facet, neighbor, simplicial ) + test convexity and append to qh.facet_mergeset if non-convex if pre-merging, - nop if qh.SKIPconvex, or qh.MERGEexact and coplanar + no-op if qh.SKIPconvex, or qh.MERGEexact and coplanar + if simplicial, assumes centrum test is valid (e.g., adjacent, simplicial new facets) returns: - true if appends facet/neighbor to mergeset + true if appends facet/neighbor to qh.facet_mergeset sets facet->center as needed does not change facet->seen + notes: + called from qh_getmergeset_initial, qh_getmergeset, and qh_test_vneighbors + must be at least as strong as qh_checkconvex (poly2.c) + assumes !f.flipped + design: - if qh.cos_max is defined + exit if qh.SKIPconvex ('Q0') and !qh.POSTmerging + if qh.cos_max ('An') is defined and merging coplanars if the angle between facet normals is too shallow append an angle-coplanar merge to qh.mergeset return True - make facet's centrum if needed - if facet's centrum is above the neighbor - set isconcave - else - if facet's centrum is not below the neighbor - set iscoplanar - make neighbor's centrum if needed - if neighbor's centrum is above the facet - set isconcave - else if neighbor's centrum is not below the facet - set iscoplanar - if isconcave or iscoplanar - get angle if needed - append concave or coplanar merge to qh.mergeset -*/ -boolT qh_test_appendmerge(facetT *facet, facetT *neighbor) { - realT dist, dist2= -REALmax, angle= -REALmax; - boolT isconcave= False, iscoplanar= False, okangle= False; + test convexity of facet and neighbor +*/ +boolT qh_test_appendmerge(facetT *facet, facetT *neighbor, boolT simplicial) { + realT angle= -REALmax; + boolT okangle= False; if (qh SKIPconvex && !qh POSTmerging) return False; - if ((!qh MERGEexact || qh POSTmerging) && qh cos_max < REALmax/2) { + if (qh cos_max < REALmax/2 && (!qh MERGEexact || qh POSTmerging)) { angle= qh_getangle(facet->normal, neighbor->normal); + okangle= True; zinc_(Zangletests); if (angle > qh cos_max) { zinc_(Zcoplanarangle); - qh_appendmergeset(facet, neighbor, MRGanglecoplanar, &angle); + qh_appendmergeset(facet, neighbor, MRGanglecoplanar, 0.0, angle); trace2((qh ferr, 2039, "qh_test_appendmerge: coplanar angle %4.4g between f%d and f%d\n", angle, facet->id, neighbor->id)); return True; - }else - okangle= True; + } } + if (simplicial || qh hull_dim <= 3) + return qh_test_centrum_merge(facet, neighbor, angle, okangle); + else + return qh_test_nonsimplicial_merge(facet, neighbor, angle, okangle); +} /* test_appendmerge */ + +/*--------------------------------- + + qh_test_centrum_merge( facet, neighbor, angle, okangle ) + test centrum convexity and append non-convex facets to qh.facet_mergeset + 'angle' is angle between facets if okangle is true, otherwise use 0.0 + + returns: + true if append facet/neighbor to qh.facet_mergeset + sets facet->center as needed + does not change facet->seen + + notes: + called from test_appendmerge if adjacent simplicial facets or 2-d/3-d + at least as strict as qh_checkconvex, including qh.DISTround ('En' and 'Rn') + + design: + make facet's centrum if needed + if facet's centrum is above the neighbor (qh.centrum_radius) + set isconcave + + if facet's centrum is not below the neighbor (-qh.centrum_radius) + set iscoplanar + make neighbor's centrum if needed + if neighbor's centrum is above the facet + set isconcave + else if neighbor's centrum is not below the facet + set iscoplanar + if isconcave or iscoplanar and merging coplanars + get angle if needed (qh.ANGLEmerge 'An') + append concave-coplanar, concave ,or coplanar merge to qh.mergeset +*/ +boolT qh_test_centrum_merge(facetT *facet, facetT *neighbor, realT angle, boolT okangle) { + coordT dist, dist2, mergedist; + boolT isconcave= False, iscoplanar= False; + if (!facet->center) facet->center= qh_getcentrum(facet); zzinc_(Zcentrumtests); qh_distplane(facet->center, neighbor, &dist); if (dist > qh centrum_radius) isconcave= True; - else { - if (dist > -qh centrum_radius) - iscoplanar= True; - if (!neighbor->center) - neighbor->center= qh_getcentrum(neighbor); - zzinc_(Zcentrumtests); - qh_distplane(neighbor->center, facet, &dist2); - if (dist2 > qh centrum_radius) - isconcave= True; - else if (!iscoplanar && dist2 > -qh centrum_radius) - iscoplanar= True; - } + else if (dist >= -qh centrum_radius) + iscoplanar= True; + if (!neighbor->center) + neighbor->center= qh_getcentrum(neighbor); + zzinc_(Zcentrumtests); + qh_distplane(neighbor->center, facet, &dist2); + if (dist2 > qh centrum_radius) + isconcave= True; + else if (!iscoplanar && dist2 >= -qh centrum_radius) + iscoplanar= True; if (!isconcave && (!iscoplanar || (qh MERGEexact && !qh POSTmerging))) return False; if (!okangle && qh ANGLEmerge) { angle= qh_getangle(facet->normal, neighbor->normal); zinc_(Zangletests); } - if (isconcave) { - zinc_(Zconcaveridge); - if (qh ANGLEmerge) - angle += qh_ANGLEconcave + 0.5; - qh_appendmergeset(facet, neighbor, MRGconcave, &angle); - trace0((qh ferr, 18, "qh_test_appendmerge: concave f%d to f%d dist %4.4g and reverse dist %4.4g angle %4.4g during p%d\n", + if (isconcave && iscoplanar) { + zinc_(Zconcavecoplanarridge); + if (dist > dist2) + qh_appendmergeset(facet, neighbor, MRGconcavecoplanar, dist, angle); + else + qh_appendmergeset(neighbor, facet, MRGconcavecoplanar, dist2, angle); + trace0((qh ferr, 36, "qh_test_centrum_merge: concave f%d to coplanar f%d, dist %4.4g and reverse dist %4.4g, angle %4.4g during p%d\n", facet->id, neighbor->id, dist, dist2, angle, qh furthest_id)); + }else if (isconcave) { + mergedist= fmax_(dist, dist2); + zinc_(Zconcaveridge); + qh_appendmergeset(facet, neighbor, MRGconcave, mergedist, angle); + trace0((qh ferr, 37, "qh_test_centrum_merge: concave f%d to f%d, dist %4.4g and reverse dist %4.4g, angle %4.4g during p%d\n", + facet->id, neighbor->id, dist, dist2, angle, qh furthest_id)); }else /* iscoplanar */ { + mergedist= fmin_(fabs_(dist), fabs_(dist2)); zinc_(Zcoplanarcentrum); - qh_appendmergeset(facet, neighbor, MRGcoplanar, &angle); - trace2((qh ferr, 2040, "qh_test_appendmerge: coplanar f%d to f%d dist %4.4g, reverse dist %4.4g angle %4.4g\n", + qh_appendmergeset(facet, neighbor, MRGcoplanar, mergedist, angle); + trace2((qh ferr, 2097, "qh_test_centrum_merge: coplanar f%d to f%d dist %4.4g, reverse dist %4.4g angle %4.4g\n", facet->id, neighbor->id, dist, dist2, angle)); } return True; -} /* test_appendmerge */ +} /* test_centrum_merge */ + +/*--------------------------------- + + qh_test_degen_neighbors( facet ) + append degenerate neighbors to qh.degen_mergeset + + notes: + called at end of qh_mergefacet() and qh_renamevertex() + call after test_redundant_facet() since MRGredundant is less expensive then MRGdegen + a degenerate facet has fewer than hull_dim neighbors + see: qh_merge_degenredundant() + +*/ +void qh_test_degen_neighbors(facetT *facet) { + facetT *neighbor, **neighborp; + int size; + + trace4((qh ferr, 4073, "qh_test_degen_neighbors: test for degenerate neighbors of f%d\n", facet->id)); + FOREACHneighbor_(facet) { + if (neighbor->visible) { + qh_fprintf(qh ferr, 6359, "qhull internal error (qh_test_degen_neighbors): facet f%d has deleted neighbor f%d (qh.visible_list)\n", + facet->id, neighbor->id); + qh_errexit2(qh_ERRqhull, facet, neighbor); + } + if (neighbor->degenerate || neighbor->redundant || neighbor->dupridge) /* will merge or delete */ + continue; + /* merge flipped-degenerate facet before flipped facets */ + if ((size= qh_setsize(neighbor->neighbors)) < qh hull_dim) { + qh_appendmergeset(neighbor, neighbor, MRGdegen, 0.0, 1.0); + trace2((qh ferr, 2019, "qh_test_degen_neighbors: f%d is degenerate with %d neighbors. Neighbor of f%d.\n", neighbor->id, size, facet->id)); + } + } +} /* test_degen_neighbors */ + + +/*--------------------------------- + + qh_test_nonsimplicial_merge( facet, neighbor, angle, okangle ) + test centrum and vertex convexity and append non-convex or redundant facets to qh.facet_mergeset + 'angle' is angle between facets if okangle is true, otherwise use 0.0 + skips coplanar merges if pre-merging with qh.MERGEexact ('Qx') + + returns: + true if appends facet/neighbor to qh.facet_mergeset + sets facet->center as needed + does not change facet->seen + + notes: + only called from test_appendmerge if a non-simplicial facet and at least 4-d + at least as strict as qh_checkconvex, including qh.DISTround ('En' and 'Rn') + centrums must be < -qh.centrum_radius + tests vertices as well as centrums since a facet may be twisted relative to its neighbor + + design: + set precision constants for maxoutside, clearlyconcave, minvertex, and coplanarcentrum + use maxoutside for coplanarcentrum if premerging with 'Qx' and qh_MAXcoplanarcentrum merges + otherwise use qh.centrum_radious for coplanarcentrum + make facet and neighbor centrums if needed + isconcave if a centrum is above neighbor (coplanarcentrum) + iscoplanar if a centrum is not below neighbor (-qh.centrum_radius) + maybeconvex if a centrum is clearly below neighbor (-clearyconvex) + return False if both centrums clearly below neighbor (-clearyconvex) + return MRGconcave if isconcave + + facets are neither clearly convex nor clearly concave + test vertices as well as centrums + if maybeconvex + determine mindist and maxdist for vertices of the other facet + maybe MRGredundant + otherwise + determine mindist and maxdist for vertices of either facet + maybe MRGredundant + maybeconvex if a vertex is clearly below neighbor (-clearconvex) + + vertices are concave if dist > clearlyconcave + vertices are twisted if dist > maxoutside (isconcave and maybeconvex) + return False if not concave and pre-merge of 'Qx' (qh.MERGEexact) + vertices are coplanar if dist in -minvertex..maxoutside + if !isconcave, vertices are coplanar if dist >= -qh.MAXcoplanar (n*qh.premerge_centrum) + + return False if neither concave nor coplanar + return MRGtwisted if isconcave and maybeconvex + return MRGconcavecoplanar if isconcave and isconvex + return MRGconcave if isconcave + return MRGcoplanar if iscoplanar +*/ +boolT qh_test_nonsimplicial_merge(facetT *facet, facetT *neighbor, realT angle, boolT okangle) { + coordT dist, mindist, maxdist, mindist2, maxdist2, dist2, maxoutside, clearlyconcave, minvertex, clearlyconvex, mergedist, coplanarcentrum; + boolT isconcave= False, iscoplanar= False, maybeconvex= False, isredundant= False; + vertexT *maxvertex= NULL, *maxvertex2= NULL; + + maxoutside= fmax_(neighbor->maxoutside, qh ONEmerge + qh DISTround); + maxoutside= fmax_(maxoutside, facet->maxoutside); + clearlyconcave= qh_RATIOconcavehorizon * maxoutside; + minvertex= fmax_(-qh min_vertex, qh MAXcoplanar); /* non-negative, not available per facet, not used for iscoplanar */ + clearlyconvex= qh_RATIOconvexmerge * minvertex; /* must be convex for MRGtwisted */ + if (qh MERGEexact && !qh POSTmerging && (facet->nummerge > qh_MAXcoplanarcentrum || neighbor->nummerge > qh_MAXcoplanarcentrum)) + coplanarcentrum= maxoutside; + else + coplanarcentrum= qh centrum_radius; + + if (!facet->center) + facet->center= qh_getcentrum(facet); + zzinc_(Zcentrumtests); + qh_distplane(facet->center, neighbor, &dist); + if (dist > coplanarcentrum) + isconcave= True; + else if (dist >= -qh centrum_radius) + iscoplanar= True; + else if (dist < -clearlyconvex) + maybeconvex= True; + if (!neighbor->center) + neighbor->center= qh_getcentrum(neighbor); + zzinc_(Zcentrumtests); + qh_distplane(neighbor->center, facet, &dist2); + if (dist2 > coplanarcentrum) + isconcave= True; + else if (dist2 >= -qh centrum_radius) + iscoplanar= True; + else if (dist2 < -clearlyconvex) { + if (maybeconvex) + return False; /* both centrums clearly convex */ + maybeconvex= True; + } + if (isconcave) { + if (!okangle && qh ANGLEmerge) { + angle= qh_getangle(facet->normal, neighbor->normal); + zinc_(Zangletests); + } + mergedist= fmax_(dist, dist2); + zinc_(Zconcaveridge); + qh_appendmergeset(facet, neighbor, MRGconcave, mergedist, angle); + trace0((qh ferr, 18, "qh_test_nonsimplicial_merge: concave centrum for f%d or f%d, dist %4.4g and reverse dist %4.4g, angle %4.4g during p%d\n", + facet->id, neighbor->id, dist, dist2, angle, qh furthest_id)); + return True; + } + /* neither clearly convex nor clearly concave, test vertices as well as centrums */ + if (maybeconvex) { + if (dist < -clearlyconvex) { + maxdist= dist; /* facet centrum clearly convex, no need to test its vertex distance */ + mindist= dist; + maxvertex2= qh_furthestvertex(neighbor, facet, &maxdist2, &mindist2); + if (!maxvertex2) { + qh_appendmergeset(neighbor, facet, MRGredundant, maxdist2, qh_ANGLEnone); + isredundant= True; + } + }else { /* dist2 < -clearlyconvex */ + maxdist2= dist2; /* neighbor centrum clearly convex, no need to test its vertex distance */ + mindist2= dist2; + maxvertex= qh_furthestvertex(facet, neighbor, &maxdist, &mindist); + if (!maxvertex) { + qh_appendmergeset(facet, neighbor, MRGredundant, maxdist, qh_ANGLEnone); + isredundant= True; + } + } + }else { + maxvertex= qh_furthestvertex(facet, neighbor, &maxdist, &mindist); + if (maxvertex) { + maxvertex2= qh_furthestvertex(neighbor, facet, &maxdist2, &mindist2); + if (!maxvertex2) { + qh_appendmergeset(neighbor, facet, MRGredundant, maxdist2, qh_ANGLEnone); + isredundant= True; + }else if (mindist < -clearlyconvex || mindist2 < -clearlyconvex) + maybeconvex= True; + }else { /* !maxvertex */ + qh_appendmergeset(facet, neighbor, MRGredundant, maxdist, qh_ANGLEnone); + isredundant= True; + } + } + if (isredundant) { + zinc_(Zredundantmerge); + return True; + } + + if (maxdist > clearlyconcave || maxdist2 > clearlyconcave) + isconcave= True; + else if (maybeconvex) { + if (maxdist > maxoutside || maxdist2 > maxoutside) + isconcave= True; /* MRGtwisted */ + } + if (!isconcave && qh MERGEexact && !qh POSTmerging) + return False; + if (isconcave && !iscoplanar) { + if (maxdist < maxoutside && (-qh MAXcoplanar || (maxdist2 < maxoutside && mindist2 >= -qh MAXcoplanar))) + iscoplanar= True; /* MRGconcavecoplanar */ + }else if (!iscoplanar) { + if (mindist >= -qh MAXcoplanar || mindist2 >= -qh MAXcoplanar) + iscoplanar= True; /* MRGcoplanar */ + } + if (!isconcave && !iscoplanar) + return False; + if (!okangle && qh ANGLEmerge) { + angle= qh_getangle(facet->normal, neighbor->normal); + zinc_(Zangletests); + } + if (isconcave && maybeconvex) { + zinc_(Ztwistedridge); + if (maxdist > maxdist2) + qh_appendmergeset(facet, neighbor, MRGtwisted, maxdist, angle); + else + qh_appendmergeset(neighbor, facet, MRGtwisted, maxdist2, angle); + trace0((qh ferr, 27, "qh_test_nonsimplicial_merge: twisted concave f%d v%d to f%d v%d, dist %4.4g and reverse dist %4.4g, angle %4.4g during p%d\n", + facet->id, getid_(maxvertex), neighbor->id, getid_(maxvertex2), maxdist, maxdist2, angle, qh furthest_id)); + }else if (isconcave && iscoplanar) { + zinc_(Zconcavecoplanarridge); + if (maxdist > maxdist2) + qh_appendmergeset(facet, neighbor, MRGconcavecoplanar, maxdist, angle); + else + qh_appendmergeset(neighbor, facet, MRGconcavecoplanar, maxdist2, angle); + trace0((qh ferr, 28, "qh_test_nonsimplicial_merge: concave coplanar f%d v%d to f%d v%d, dist %4.4g and reverse dist %4.4g, angle %4.4g during p%d\n", + facet->id, getid_(maxvertex), neighbor->id, getid_(maxvertex2), maxdist, maxdist2, angle, qh furthest_id)); + }else if (isconcave) { + mergedist= fmax_(maxdist, maxdist2); + zinc_(Zconcaveridge); + qh_appendmergeset(facet, neighbor, MRGconcave, mergedist, angle); + trace0((qh ferr, 29, "qh_test_nonsimplicial_merge: concave f%d v%d to f%d v%d, dist %4.4g and reverse dist %4.4g, angle %4.4g during p%d\n", + facet->id, getid_(maxvertex), neighbor->id, getid_(maxvertex2), maxdist, maxdist2, angle, qh furthest_id)); + }else /* iscoplanar */ { + mergedist= fmax_(fmax_(maxdist, maxdist2), fmax_(-mindist, -mindist2)); + zinc_(Zcoplanarcentrum); + qh_appendmergeset(facet, neighbor, MRGcoplanar, mergedist, angle); + trace2((qh ferr, 2099, "qh_test_nonsimplicial_merge: coplanar f%d v%d to f%d v%d, dist %4.4g and reverse dist %4.4g, angle %4.4g during p%d\n", + facet->id, getid_(maxvertex), neighbor->id, getid_(maxvertex2), maxdist, maxdist2, angle, qh furthest_id)); + } + return True; +} /* test_nonsimplicial_merge */ + +/*--------------------------------- + + qh_test_redundant_neighbors( facet ) + append degenerate facet or its redundant neighbors to qh.degen_mergeset + + returns: + bumps vertex_visit + + notes: + called at end of qh_mergefacet(), qh_mergecycle_all(), and qh_renamevertex + call before qh_test_degen_neighbors (MRGdegen are more likely to cause problems) + a redundant neighbor's vertices is a subset of the facet's vertices + with pinched and flipped facets, a redundant neighbor may have a wildly different normal + + see qh_merge_degenredundant() and qh_-_facet() + + design: + if facet is degenerate + appends facet to degen_mergeset + else + appends redundant neighbors of facet to degen_mergeset +*/ +void qh_test_redundant_neighbors(facetT *facet) { + vertexT *vertex, **vertexp; + facetT *neighbor, **neighborp; + int size; + + trace4((qh ferr, 4022, "qh_test_redundant_neighbors: test neighbors of f%d vertex_visit %d\n", + facet->id, qh vertex_visit+1)); + if ((size= qh_setsize(facet->neighbors)) < qh hull_dim) { + qh_appendmergeset(facet, facet, MRGdegen, 0.0, 1.0); + trace2((qh ferr, 2017, "qh_test_redundant_neighbors: f%d is degenerate with %d neighbors.\n", facet->id, size)); + }else { + qh vertex_visit++; + FOREACHvertex_(facet->vertices) + vertex->visitid= qh vertex_visit; + FOREACHneighbor_(facet) { + if (neighbor->visible) { + qh_fprintf(qh ferr, 6360, "qhull internal error (qh_test_redundant_neighbors): facet f%d has deleted neighbor f%d (qh.visible_list)\n", + facet->id, neighbor->id); + qh_errexit2(qh_ERRqhull, facet, neighbor); + } + if (neighbor->degenerate || neighbor->redundant || neighbor->dupridge) /* will merge or delete */ + continue; + if (facet->flipped && !neighbor->flipped) /* do not merge non-flipped into flipped */ + continue; + /* merge redundant-flipped facet first */ + /* uses early out instead of checking vertex count */ + FOREACHvertex_(neighbor->vertices) { + if (vertex->visitid != qh vertex_visit) + break; + } + if (!vertex) { + qh_appendmergeset(neighbor, facet, MRGredundant, 0.0, 1.0); + trace2((qh ferr, 2018, "qh_test_redundant_neighbors: f%d is contained in f%d. merge\n", neighbor->id, facet->id)); + } + } + } +} /* test_redundant_neighbors */ /*--------------------------------- - qh_test_vneighbors() + qh_test_vneighbors( ) test vertex neighbors for convexity tests all facets on qh.newfacet_list @@ -3360,6 +5243,7 @@ initializes vertex neighbors if needed notes: + called by qh_all_merges from qh_postmerge if qh.TESTvneighbors ('Qv') assumes all facet neighbors have been tested this can be expensive this does not guarantee that a centrum is below all facets @@ -3392,7 +5276,7 @@ FOREACHneighbor_(vertex) { if (neighbor->seen || neighbor->visitid == qh visit_id) continue; - if (qh_test_appendmerge(newfacet, neighbor)) + if (qh_test_appendmerge(newfacet, neighbor, False)) /* ignores optimization for simplicial ridges */ nummerges++; } } @@ -3409,14 +5293,20 @@ qh_tracemerge( facet1, facet2 ) print trace message after merge */ -void qh_tracemerge(facetT *facet1, facetT *facet2) { +void qh_tracemerge(facetT *facet1, facetT *facet2, mergeType mergetype) { boolT waserror= False; + const char *mergename; #ifndef qh_NOtrace + if(mergetype > 0 && mergetype < sizeof(mergetypes)/sizeof(char *)) + mergename= mergetypes[mergetype]; + else + mergename= mergetypes[MRGnone]; if (qh IStracing >= 4) qh_errprint("MERGED", facet2, NULL, NULL, NULL); - if (facet2 == qh tracefacet || (qh tracevertex && qh tracevertex->newlist)) { - qh_fprintf(qh ferr, 8085, "qh_tracemerge: trace facet and vertex after merge of f%d and f%d, furthest p%d\n", facet1->id, facet2->id, qh furthest_id); + if (facet2 == qh tracefacet || (qh tracevertex && qh tracevertex->newfacet)) { + qh_fprintf(qh ferr, 8085, "qh_tracemerge: trace facet and vertex after merge of f%d into f%d type %d (%s), furthest p%d\n", + facet1->id, facet2->id, mergetype, mergename, qh furthest_id); if (facet2 != qh tracefacet) qh_errprint("TRACE", qh tracefacet, (qh tracevertex && qh tracevertex->neighbors) ? @@ -3428,25 +5318,25 @@ qh_fprintf(qh ferr, 8086, "qh_tracemerge: trace vertex deleted at furthest p%d\n", qh furthest_id); else - qh_checkvertex(qh tracevertex); - } - if (qh tracefacet) { - qh_checkfacet(qh tracefacet, True, &waserror); - if (waserror) - qh_errexit(qh_ERRqhull, qh tracefacet, NULL); + qh_checkvertex(qh tracevertex, qh_ALL, &waserror); } + if (qh tracefacet && qh tracefacet->normal && !qh tracefacet->visible) + qh_checkfacet(qh tracefacet, True /* newmerge */, &waserror); #endif /* !qh_NOtrace */ if (qh CHECKfrequently || qh IStracing >= 4) { /* can't check polygon here */ - qh_checkfacet(facet2, True, &waserror); - if (waserror) - qh_errexit(qh_ERRqhull, NULL, NULL); + if (qh IStracing >= 4 && qh num_facets < 500) { + qh_printlists(); + } + qh_checkfacet(facet2, True /* newmerge */, &waserror); } + if (waserror) + qh_errexit(qh_ERRqhull, NULL, NULL); /* erroneous facet logged by qh_checkfacet */ } /* tracemerge */ /*--------------------------------- - qh_tracemerging() + qh_tracemerging( ) print trace message during POSTmerging returns: @@ -3471,10 +5361,10 @@ cpu /= qh_SECticks; total= zzval_(Ztotmerge) - zzval_(Zcyclehorizon) + zzval_(Zcyclefacettot); qh_fprintf(qh ferr, 8087, "\n\ -At %d:%d:%d & %2.5g CPU secs, qhull has merged %d facets. The hull\n\ - contains %d facets and %d vertices.\n", - tp->tm_hour, tp->tm_min, tp->tm_sec, cpu, - total, qh num_facets - qh num_visible, +At %d:%d:%d & %2.5g CPU secs, qhull has merged %d facets with max_outside %2.2g, min_vertex %2.2g.\n\ + The hull contains %d facets and %d vertices.\n", + tp->tm_hour, tp->tm_min, tp->tm_sec, cpu, total, qh max_outside, qh min_vertex, + qh num_facets - qh num_visible, qh num_vertices-qh_setsize(qh del_vertices)); } /* tracemerging */ @@ -3488,6 +5378,9 @@ deletes facet2->center unless it's already large if so, clears facet2->ridge->tested + notes: + only called by qh_mergefacet + design: clear facet2->tested clear ridge->tested for facet1's ridges @@ -3531,28 +5424,32 @@ /*--------------------------------- - qh_vertexridges( vertex ) + qh_vertexridges( vertex, allneighbors ) return temporary set of ridges adjacent to a vertex - vertex->neighbors defined + vertex->neighbors defined (qh_vertexneighbors) - ntoes: + notes: uses qh.visit_id does not include implicit ridges for simplicial facets + skips last neighbor, unless allneighbors. For new facets, the last neighbor shares ridges with adjacent neighbors + if the last neighbor is not simplicial, it will have ridges for its simplicial neighbors + Use allneighbors when a new cone is attached to an existing convex hull + similar to qh_neighbor_vertices design: for each neighbor of vertex add ridges that include the vertex to ridges */ -setT *qh_vertexridges(vertexT *vertex) { +setT *qh_vertexridges(vertexT *vertex, boolT allneighbors) { facetT *neighbor, **neighborp; setT *ridges= qh_settemp(qh TEMPsize); int size; - qh visit_id++; + qh visit_id += 2; /* visit_id for vertex neighbors, visit_id-1 for facets of visited ridges */ FOREACHneighbor_(vertex) neighbor->visitid= qh visit_id; FOREACHneighbor_(vertex) { - if (*neighborp) /* no new ridges in last neighbor */ + if (*neighborp || allneighbors) /* no new ridges in last neighbor */ qh_vertexridges_facet(vertex, neighbor, &ridges); } if (qh PRINTstatistics || qh IStracing) { @@ -3581,18 +5478,34 @@ for each ridge of facet if ridge of visited neighbor (i.e., unprocessed) if vertex in ridge - append ridge to vertex + append ridge mark facet processed */ void qh_vertexridges_facet(vertexT *vertex, facetT *facet, setT **ridges) { ridgeT *ridge, **ridgep; facetT *neighbor; + int last_i= qh hull_dim-2; + vertexT *second, *last; FOREACHridge_(facet->ridges) { neighbor= otherfacet_(ridge, facet); - if (neighbor->visitid == qh visit_id - && qh_setin(ridge->vertices, vertex)) - qh_setappend(ridges, ridge); + if (neighbor->visitid == qh visit_id) { + if (SETfirst_(ridge->vertices) == vertex) { + qh_setappend(ridges, ridge); + }else if (last_i > 2) { + second= SETsecondt_(ridge->vertices, vertexT); + last= SETelemt_(ridge->vertices, last_i, vertexT); + if (second->id >= vertex->id && last->id <= vertex->id) { /* vertices inverse sorted by id */ + if (second == vertex || last == vertex) + qh_setappend(ridges, ridge); + else if (qh_setin(ridge->vertices, vertex)) + qh_setappend(ridges, ridge); + } + }else if (SETelem_(ridge->vertices, last_i) == vertex + || (last_i > 1 && SETsecond_(ridge->vertices) == vertex)) { + qh_setappend(ridges, ridge); + } + } } facet->visitid= qh visit_id-1; } /* vertexridges_facet */ @@ -3601,28 +5514,68 @@ >-------------------------------- qh_willdelete( facet, replace ) - moves facet to visible list + moves facet to visible list for qh_deletevisible sets facet->f.replace to replace (may be NULL) + clears f.ridges and f.neighbors -- no longer valid returns: bumps qh.num_visible */ void qh_willdelete(facetT *facet, facetT *replace) { + trace4((qh ferr, 4081, "qh_willdelete: move f%d to visible list, set its replacement as f%d, and clear f.neighbors and f.ridges\n", facet->id, getid_(replace))); + if (!qh visible_list && qh newfacet_list) { + qh_fprintf(qh ferr, 6378, "qhull internal error (qh_willdelete): expecting qh.visible_list at before qh.newfacet_list f%d. Got NULL\n", + qh newfacet_list->id); + qh_errexit2(qh_ERRqhull, NULL, NULL); + } qh_removefacet(facet); qh_prependfacet(facet, &qh visible_list); qh num_visible++; facet->visible= True; facet->f.replace= replace; + if (facet->ridges) + SETfirst_(facet->ridges)= NULL; + if (facet->neighbors) + SETfirst_(facet->neighbors)= NULL; } /* willdelete */ #else /* qh_NOmerge */ -void qh_premerge(vertexT *apex, realT maxcentrum, realT maxangle) { + +void qh_all_vertexmerges(int apexpointid, facetT *facet, facetT **retryfacet) { + QHULL_UNUSED(apexpointid) + QHULL_UNUSED(facet) + QHULL_UNUSED(retryfacet) +} +void qh_premerge(int apexpointid, realT maxcentrum, realT maxangle) { + QHULL_UNUSED(apexpointid) + QHULL_UNUSED(maxcentrum) + QHULL_UNUSED(maxangle) } void qh_postmerge(const char *reason, realT maxcentrum, realT maxangle, boolT vneighbors) { + QHULL_UNUSED(reason) + QHULL_UNUSED(maxcentrum) + QHULL_UNUSED(maxangle) + QHULL_UNUSED(vneighbors) +} +void qh_checkdelfacet(facetT *facet, setT *mergeset) { + QHULL_UNUSED(facet) + QHULL_UNUSED(mergeset) +} +void qh_checkdelridge(void /* qh.visible_facets, vertex_mergeset */) { } boolT qh_checkzero(boolT testall) { - } + QHULL_UNUSED(testall) + + return True; +} +void qh_freemergesets(void) { +} +void qh_initmergesets(void) { +} +void qh_merge_pinchedvertices(int apexpointid /* qh.newfacet_list */) { + QHULL_UNUSED(apexpointid) +} #endif /* qh_NOmerge */ diff -Nru qhull-2015.2/src/libqhull/merge.h qhull-2020.2/src/libqhull/merge.h --- qhull-2015.2/src/libqhull/merge.h 2016-01-17 21:51:15.000000000 +0000 +++ qhull-2020.2/src/libqhull/merge.h 2020-05-22 02:00:58.000000000 +0000 @@ -6,9 +6,9 @@ see qh-merge.htm and merge.c - Copyright (c) 1993-2015 C.B. Barber. - $Id: //main/2015/qhull/src/libqhull/merge.h#1 $$Change: 1981 $ - $DateTime: 2015/09/28 20:26:32 $$Author: bbarber $ + Copyright (c) 1993-2020 C.B. Barber. + $Id: //main/2019/qhull/src/libqhull/merge.h#3 $$Change: 2953 $ + $DateTime: 2020/05/21 22:05:32 $$Author: bbarber $ */ #ifndef qhDEFmerge @@ -20,52 +20,44 @@ /*============ -constants- ==============*/ /*---------------------------------- + >--------------------------------- - qh_ANGLEredundant - indicates redundant merge in mergeT->angle + qh_ANGLEnone + indicates missing angle for mergeT->angle */ -#define qh_ANGLEredundant 6.0 - -/*---------------------------------- - - qh_ANGLEdegen - indicates degenerate facet in mergeT->angle -*/ -#define qh_ANGLEdegen 5.0 - -/*---------------------------------- - - qh_ANGLEconcave - offset to indicate concave facets in mergeT->angle - - notes: - concave facets are assigned the range of [2,4] in mergeT->angle - roundoff error may make the angle less than 2 -*/ -#define qh_ANGLEconcave 1.5 +#define qh_ANGLEnone 2.0 /*---------------------------------- MRG... (mergeType) indicates the type of a merge (mergeT->type) + MRGcoplanar...MRGtwisted set by qh_test_centrum_merge, qh_test_nonsimplicial_merge */ -typedef enum { /* in sort order for facet_mergeset */ +typedef enum { /* must match mergetypes[] */ MRGnone= 0, - MRGcoplanar, /* centrum coplanar */ - MRGanglecoplanar, /* angle coplanar */ - /* could detect half concave ridges */ - MRGconcave, /* concave ridge */ - MRGflip, /* flipped facet. facet1 == facet2 */ - MRGridge, /* duplicate ridge (qh_MERGEridge) */ - /* degen and redundant go onto degen_mergeset */ - MRGdegen, /* degenerate facet (!enough neighbors) facet1 == facet2 */ - MRGredundant, /* redundant facet (vertex subset) */ + /* MRGcoplanar..MRGtwisted go into qh.facet_mergeset for qh_all_merges + qh_compare_facetmerge selects lower mergetypes for merging first */ + MRGcoplanar, /* (1) centrum coplanar if centrum ('Cn') or vertex not clearly above or below neighbor */ + MRGanglecoplanar, /* (2) angle coplanar if angle ('An') is coplanar */ + MRGconcave, /* (3) concave ridge */ + MRGconcavecoplanar, /* (4) concave and coplanar ridge, one side concave, other side coplanar */ + MRGtwisted, /* (5) twisted ridge, both concave and convex, facet1 is wider */ + /* MRGflip go into qh.facet_mergeset for qh_flipped_merges */ + MRGflip, /* (6) flipped facet if qh.interior_point is above facet, w/ facet1 == facet2 */ + /* MRGdupridge go into qh.facet_mergeset for qh_forcedmerges */ + MRGdupridge, /* (7) dupridge if more than two neighbors. Set by qh_mark_dupridges for qh_MERGEridge */ + /* MRGsubridge and MRGvertices go into vertex_mergeset */ + MRGsubridge, /* (8) merge pinched vertex to remove the subridge of a MRGdupridge */ + MRGvertices, /* (9) merge pinched vertex to remove a facet's ridges with the same vertices */ + /* MRGdegen, MRGredundant, and MRGmirror go into qh.degen_mergeset */ + MRGdegen, /* (10) degenerate facet (!enough neighbors) facet1 == facet2 */ + MRGredundant, /* (11) redundant facet (vertex subset) */ /* merge_degenredundant assumes degen < redundant */ - MRGmirror, /* mirror facet from qh_triangulate */ + MRGmirror, /* (12) mirror facets: same vertices due to null facets in qh_triangulate + f.redundant for both facets*/ + /* MRGcoplanarhorizon for qh_mergecycle_all only */ + MRGcoplanarhorizon, /* (13) new facet coplanar with the horizon (qh_mergecycle_all) */ ENDmrg } mergeType; @@ -88,10 +80,16 @@ typedef struct mergeT mergeT; struct mergeT { /* initialize in qh_appendmergeset */ - realT angle; /* angle between normals of facet1 and facet2 */ + realT angle; /* cosine of angle between normals of facet1 and facet2, + null value and right angle is 0.0, coplanar is 1.0, narrow is -1.0 */ + realT distance; /* absolute value of distance between vertices, centrum and facet, or vertex and facet */ facetT *facet1; /* will merge facet1 into facet2 */ facetT *facet2; - mergeType type; + vertexT *vertex1; /* will merge vertext1 into vertex2 for MRGsubridge or MRGvertices */ + vertexT *vertex2; + ridgeT *ridge1; /* the duplicate ridges resolved by MRGvertices */ + ridgeT *ridge2; /* merge is deleted if either ridge is deleted (qh_delridge) */ + mergeType mergetype; }; @@ -106,50 +104,93 @@ notes: uses 'mergeT *merge, **mergep;' if qh_mergefacet(), - restart since qh.facet_mergeset may change + restart or use qh_setdellast() since qh.facet_mergeset may change see FOREACHsetelement_ */ -#define FOREACHmerge_( merges ) FOREACHsetelement_(mergeT, merges, merge) +#define FOREACHmerge_(merges) FOREACHsetelement_(mergeT, merges, merge) + +/*---------------------------------- + + FOREACHmergeA_( vertices ) { ... } + assign 'mergeA' to each merge in merges + + notes: + uses 'mergeT *mergeA, *mergeAp;' + see FOREACHsetelement_ +*/ +#define FOREACHmergeA_(merges) FOREACHsetelement_(mergeT, merges, mergeA) + +/*---------------------------------- + + FOREACHmerge_i_( vertices ) { ... } + assign 'merge' and 'merge_i' for each merge in mergeset + + declare: + mergeT *merge; + int merge_n, merge_i; + + see: + FOREACHsetelement_i_ +*/ +#define FOREACHmerge_i_(mergeset) FOREACHsetelement_i_(mergeT, mergeset, merge) /*============ prototypes in alphabetical order after pre/postmerge =======*/ -void qh_premerge(vertexT *apex, realT maxcentrum, realT maxangle); +void qh_premerge(int apexpointid, realT maxcentrum, realT maxangle); void qh_postmerge(const char *reason, realT maxcentrum, realT maxangle, boolT vneighbors); void qh_all_merges(boolT othermerge, boolT vneighbors); -void qh_appendmergeset(facetT *facet, facetT *neighbor, mergeType mergetype, realT *angle); -setT *qh_basevertices( facetT *samecycle); +void qh_all_vertexmerges(int apexpointid, facetT *facet, facetT **retryfacet); +void qh_appendmergeset(facetT *facet, facetT *neighbor, mergeType mergetype, coordT dist, realT angle); +void qh_appendvertexmerge(vertexT *vertex, vertexT *destination, mergeType mergetype, realT distance, ridgeT *ridge1, ridgeT *ridge2); +setT *qh_basevertices(facetT *samecycle); +void qh_check_dupridge(facetT *facet1, realT dist1, facetT *facet2, realT dist2); void qh_checkconnect(void /* qh.new_facets */); +void qh_checkdelfacet(facetT *facet, setT *mergeset); +void qh_checkdelridge(void /* qh.visible_facets, vertex_mergeset */); boolT qh_checkzero(boolT testall); -int qh_compareangle(const void *p1, const void *p2); -int qh_comparemerge(const void *p1, const void *p2); +int qh_compare_anglemerge(const void *p1, const void *p2); +int qh_compare_facetmerge(const void *p1, const void *p2); int qh_comparevisit(const void *p1, const void *p2); void qh_copynonconvex(ridgeT *atridge); void qh_degen_redundant_facet(facetT *facet); -void qh_degen_redundant_neighbors(facetT *facet, facetT *delfacet); +void qh_drop_mergevertex(mergeT *merge); +void qh_delridge_merge(ridgeT *ridge); vertexT *qh_find_newvertex(vertexT *oldvertex, setT *vertices, setT *ridges); +vertexT *qh_findbest_pinchedvertex(mergeT *merge, vertexT *apex, vertexT **pinchedp, realT *distp /* qh.newfacet_list */); +vertexT *qh_findbest_ridgevertex(ridgeT *ridge, vertexT **pinchedp, coordT *distp); void qh_findbest_test(boolT testcentrum, facetT *facet, facetT *neighbor, facetT **bestfacet, realT *distp, realT *mindistp, realT *maxdistp); facetT *qh_findbestneighbor(facetT *facet, realT *distp, realT *mindistp, realT *maxdistp); void qh_flippedmerges(facetT *facetlist, boolT *wasmerge); -void qh_forcedmerges( boolT *wasmerge); +void qh_forcedmerges(boolT *wasmerge); +void qh_freemergesets(void); void qh_getmergeset(facetT *facetlist); void qh_getmergeset_initial(facetT *facetlist); +boolT qh_getpinchedmerges(vertexT *apex, coordT maxdupdist, boolT *iscoplanar /* qh.newfacet_list, vertex_mergeset */); +boolT qh_hasmerge(setT *mergeset, mergeType type, facetT *facetA, facetT *facetB); void qh_hashridge(setT *hashtable, int hashsize, ridgeT *ridge, vertexT *oldvertex); ridgeT *qh_hashridge_find(setT *hashtable, int hashsize, ridgeT *ridge, vertexT *vertex, vertexT *oldvertex, int *hashslot); +void qh_initmergesets(void); void qh_makeridges(facetT *facet); -void qh_mark_dupridges(facetT *facetlist); +void qh_mark_dupridges(facetT *facetlist, boolT allmerges); +void qh_maybe_duplicateridge(ridgeT *ridge); +void qh_maybe_duplicateridges(facetT *facet); void qh_maydropneighbor(facetT *facet); int qh_merge_degenredundant(void); -void qh_merge_nonconvex( facetT *facet1, facetT *facet2, mergeType mergetype); +void qh_merge_nonconvex(facetT *facet1, facetT *facet2, mergeType mergetype); +void qh_merge_pinchedvertices(int apexpointid /* qh.newfacet_list */); +void qh_merge_twisted(facetT *facet1, facetT *facet2); void qh_mergecycle(facetT *samecycle, facetT *newfacet); void qh_mergecycle_all(facetT *facetlist, boolT *wasmerge); -void qh_mergecycle_facets( facetT *samecycle, facetT *newfacet); +void qh_mergecycle_facets(facetT *samecycle, facetT *newfacet); void qh_mergecycle_neighbors(facetT *samecycle, facetT *newfacet); void qh_mergecycle_ridges(facetT *samecycle, facetT *newfacet); -void qh_mergecycle_vneighbors( facetT *samecycle, facetT *newfacet); -void qh_mergefacet(facetT *facet1, facetT *facet2, realT *mindist, realT *maxdist, boolT mergeapex); +void qh_mergecycle_vneighbors(facetT *samecycle, facetT *newfacet); +void qh_mergefacet(facetT *facet1, facetT *facet2, mergeType mergetype, realT *mindist, realT *maxdist, boolT mergeapex); void qh_mergefacet2d(facetT *facet1, facetT *facet2); void qh_mergeneighbors(facetT *facet1, facetT *facet2); void qh_mergeridges(facetT *facet1, facetT *facet2); @@ -158,20 +199,31 @@ void qh_mergevertex_neighbors(facetT *facet1, facetT *facet2); void qh_mergevertices(setT *vertices1, setT **vertices); setT *qh_neighbor_intersections(vertexT *vertex); +setT *qh_neighbor_vertices(vertexT *vertex, setT *subridge); +void qh_neighbor_vertices_facet(vertexT *vertexA, facetT *facet, setT **vertices); void qh_newvertices(setT *vertices); +mergeT *qh_next_vertexmerge(void); +facetT *qh_opposite_horizonfacet(mergeT *merge, vertexT **vertex); boolT qh_reducevertices(void); vertexT *qh_redundant_vertex(vertexT *vertex); boolT qh_remove_extravertices(facetT *facet); +void qh_remove_mergetype(setT *mergeset, mergeType type); +void qh_rename_adjacentvertex(vertexT *oldvertex, vertexT *newvertex, realT dist); vertexT *qh_rename_sharedvertex(vertexT *vertex, facetT *facet); -void qh_renameridgevertex(ridgeT *ridge, vertexT *oldvertex, vertexT *newvertex); +boolT qh_renameridgevertex(ridgeT *ridge, vertexT *oldvertex, vertexT *newvertex); void qh_renamevertex(vertexT *oldvertex, vertexT *newvertex, setT *ridges, facetT *oldfacet, facetT *neighborA); -boolT qh_test_appendmerge(facetT *facet, facetT *neighbor); +boolT qh_test_appendmerge(facetT *facet, facetT *neighbor, boolT simplicial); +void qh_test_degen_neighbors(facetT *facet); +boolT qh_test_centrum_merge(facetT *facet, facetT *neighbor, realT angle, boolT okangle); +boolT qh_test_nonsimplicial_merge(facetT *facet, facetT *neighbor, realT angle, boolT okangle); +void qh_test_redundant_neighbors(facetT *facet); boolT qh_test_vneighbors(void /* qh.newfacet_list */); -void qh_tracemerge(facetT *facet1, facetT *facet2); +void qh_tracemerge(facetT *facet1, facetT *facet2, mergeType mergetype); void qh_tracemerging(void); -void qh_updatetested( facetT *facet1, facetT *facet2); -setT *qh_vertexridges(vertexT *vertex); +void qh_undo_newfacets(void); +void qh_updatetested(facetT *facet1, facetT *facet2); +setT *qh_vertexridges(vertexT *vertex, boolT allneighbors); void qh_vertexridges_facet(vertexT *vertex, facetT *facet, setT **ridges); void qh_willdelete(facetT *facet, facetT *replace); diff -Nru qhull-2015.2/src/libqhull/poly2.c qhull-2020.2/src/libqhull/poly2.c --- qhull-2015.2/src/libqhull/poly2.c 2016-01-19 02:59:21.000000000 +0000 +++ qhull-2020.2/src/libqhull/poly2.c 2020-06-02 16:01:30.000000000 +0000 @@ -2,15 +2,15 @@ >-------------------------------- poly2.c - implements polygons and simplices + implements polygons and simplicies see qh-poly.htm, poly.h and libqhull.h frequently used code is in poly.c - Copyright (c) 1993-2015 The Geometry Center. - $Id: //main/2015/qhull/src/libqhull/poly2.c#11 $$Change: 2069 $ - $DateTime: 2016/01/18 22:05:03 $$Author: bbarber $ + Copyright (c) 1993-2020 The Geometry Center. + $Id: //main/2019/qhull/src/libqhull/poly2.c#16 $$Change: 2963 $ + $DateTime: 2020/06/03 19:31:01 $$Author: bbarber $ */ #include "qhull_a.h" @@ -18,12 +18,43 @@ /*======== functions in alphabetical order ==========*/ /*--------------------------------- + + qh_addfacetvertex( facet, newvertex ) + add newvertex to facet.vertices if not already there + vertices are inverse sorted by vertex->id + + returns: + True if new vertex for facet + + notes: + see qh_replacefacetvertex +*/ +boolT qh_addfacetvertex(facetT *facet, vertexT *newvertex) { + vertexT *vertex; + int vertex_i= 0, vertex_n; + boolT isnew= True; + + FOREACHvertex_i_(facet->vertices) { + if (vertex->id < newvertex->id) { + break; + }else if (vertex->id == newvertex->id) { + isnew= False; + break; + } + } + if (isnew) + qh_setaddnth(&facet->vertices, vertex_i, newvertex); + return isnew; +} /* addfacetvertex */ + +/*--------------------------------- qh_addhash( newelem, hashtable, hashsize, hash ) add newelem to linear hash table at hash if not already there */ -void qh_addhash(void* newelem, setT *hashtable, int hashsize, int hash) { +void qh_addhash(void *newelem, setT *hashtable, int hashsize, int hash) { int scan; void *elem; @@ -40,7 +71,7 @@ /*--------------------------------- - qh_check_bestdist() + qh_check_bestdist( ) check that all points are within max_outside of the nearest facet if qh.ONLYgood, ignores !good facets @@ -78,7 +109,7 @@ maxoutside += qh DISTround; /* one more qh.DISTround for check computation */ trace1((qh ferr, 1021, "qh_check_bestdist: check that all points are within %2.2g of best facet\n", maxoutside)); - facets= qh_pointfacet(/*qh.facet_list*/); + facets= qh_pointfacet(/* qh.facet_list */); if (!qh_QUICKhelp && qh PRINTprecision) qh_fprintf(qh ferr, 8091, "\n\ qhull output completed. Verifying that %d points are\n\ @@ -101,12 +132,12 @@ maximize_(maxdist, dist); if (dist > maxoutside) { if (qh ONLYgood && !bestfacet->good - && !((bestfacet= qh_findgooddist(point, bestfacet, &dist, &facetlist)) - && dist > maxoutside)) + && !((bestfacet= qh_findgooddist(point, bestfacet, &dist, &facetlist)) + && dist > maxoutside)) notgood++; else { waserror= True; - qh_fprintf(qh ferr, 6109, "qhull precision error: point p%d is outside facet f%d, distance= %6.8g maxoutside= %6.8g\n", + qh_fprintf(qh ferr, 6109, "qhull precision error (qh_check_bestdist): point p%d is outside facet f%d, distance= %6.8g maxoutside= %6.8g\n", facet_i, bestfacet->id, dist, maxoutside); if (errfacet1 != bestfacet) { errfacet2= errfacet1; @@ -122,7 +153,7 @@ a lens-shaped component, these points were not verified. Use\n\ options 'Qci Tv' to verify all points.\n", notverified); if (maxdist > qh outside_err) { - qh_fprintf(qh ferr, 6110, "qhull precision error (qh_check_bestdist): a coplanar point is %6.2g from convex hull. The maximum value(qh.outside_err) is %6.2g\n", + qh_fprintf(qh ferr, 6110, "qhull precision error (qh_check_bestdist): a coplanar point is %6.2g from convex hull. The maximum value is qh.outside_err (%6.2g)\n", maxdist, qh outside_err); qh_errexit2(qh_ERRprec, errfacet1, errfacet2); }else if (waserror && qh outside_err > REALmax/2) @@ -131,61 +162,11 @@ trace0((qh ferr, 20, "qh_check_bestdist: max distance outside %2.2g\n", maxdist)); } /* check_bestdist */ -/*--------------------------------- - - qh_check_dupridge(facet1, dist1, facet2, dist2) - Check duplicate ridge between facet1 and facet2 for wide merge - dist1 is the maximum distance of facet1's vertices to facet2 - dist2 is the maximum distance of facet2's vertices to facet1 - - Returns - Level 1 log of the duplicate ridge with the minimum distance between vertices - Throws error if the merge will increase the maximum facet width by qh_WIDEduplicate (100x) - - called from: - qh_forcedmerges() -*/ #ifndef qh_NOmerge -void qh_check_dupridge(facetT *facet1, realT dist1, facetT *facet2, realT dist2) { - vertexT *vertex, **vertexp, *vertexA, **vertexAp; - realT dist, innerplane, mergedist, outerplane, prevdist, ratio; - realT minvertex= REALmax; - - mergedist= fmin_(dist1, dist2); - qh_outerinner(NULL, &outerplane, &innerplane); /* ratio from qh_printsummary */ - prevdist= fmax_(outerplane, innerplane); - maximize_(prevdist, qh ONEmerge + qh DISTround); - maximize_(prevdist, qh MINoutside + qh DISTround); - ratio= mergedist/prevdist; - FOREACHvertex_(facet1->vertices) { /* The duplicate ridge is between facet1 and facet2, so either facet can be tested */ - FOREACHvertexA_(facet1->vertices) { - if (vertex > vertexA){ /* Test each pair once */ - dist= qh_pointdist(vertex->point, vertexA->point, qh hull_dim); - minimize_(minvertex, dist); - } - } - } - trace0((qh ferr, 16, "qh_check_dupridge: duplicate ridge between f%d and f%d due to nearly-coincident vertices (%2.2g), dist %2.2g, reverse dist %2.2g, ratio %2.2g while processing p%d\n", - facet1->id, facet2->id, minvertex, dist1, dist2, ratio, qh furthest_id)); - if (ratio > qh_WIDEduplicate) { - qh_fprintf(qh ferr, 6271, "qhull precision error (qh_check_dupridge): wide merge (%.0f times wider) due to duplicate ridge with nearly coincident points (%2.2g) between f%d and f%d, merge dist %2.2g, while processing p%d\n- Ignore error with option 'Q12'\n- To be fixed in a later version of Qhull\n", - ratio, minvertex, facet1->id, facet2->id, mergedist, qh furthest_id); - if (qh DELAUNAY) - qh_fprintf(qh ferr, 8145, "- A bounding box for the input sites may alleviate this error.\n"); - if(minvertex > qh_WIDEduplicate*prevdist) - qh_fprintf(qh ferr, 8146, "- Vertex distance %2.2g is greater than %d times maximum distance %2.2g\n Please report to bradb@shore.net with steps to reproduce and all output\n", - minvertex, qh_WIDEduplicate, prevdist); - if (!qh NOwide) - qh_errexit2(qh_ERRqhull, facet1, facet2); - } -} /* check_dupridge */ -#endif - /*--------------------------------- - qh_check_maxout() + qh_check_maxout( ) updates qh.max_outside by checking all points against bestfacet if qh.ONLYgood, ignores !good facets @@ -197,9 +178,9 @@ removes inside/coplanar points from coplanarset as needed notes: - defines coplanar as min_vertex instead of MAXcoplanar + defines coplanar as qh.min_vertex instead of qh.MAXcoplanar may not need to check near-inside points because of qh.MAXcoplanar - and qh.KEEPnearinside (before it was -DISTround) + and qh.KEEPnearinside (before it was -qh.DISTround) see also: qh_check_bestdist() @@ -214,78 +195,140 @@ (updates outer planes) remove near-inside points from coplanar sets */ -#ifndef qh_NOmerge void qh_check_maxout(void) { - facetT *facet, *bestfacet, *neighbor, **neighborp, *facetlist; - realT dist, maxoutside, minvertex, old_maxoutside; - pointT *point; + facetT *facet, *bestfacet, *neighbor, **neighborp, *facetlist, *maxbestfacet= NULL, *minfacet, *maxfacet, *maxpointfacet; + realT dist, maxoutside, mindist, nearest; + realT maxoutside_base, minvertex_base; + pointT *point, *maxpoint= NULL; int numpart= 0, facet_i, facet_n, notgood= 0; setT *facets, *vertices; - vertexT *vertex; + vertexT *vertex, *minvertex; - trace1((qh ferr, 1022, "qh_check_maxout: check and update maxoutside for each facet.\n")); - maxoutside= minvertex= 0; + trace1((qh ferr, 1022, "qh_check_maxout: check and update qh.min_vertex %2.2g and qh.max_outside %2.2g\n", qh min_vertex, qh max_outside)); + minvertex_base= fmin_(qh min_vertex, -(qh ONEmerge+qh DISTround)); + maxoutside= mindist= 0.0; + minvertex= qh vertex_list; + maxfacet= minfacet= maxpointfacet= qh facet_list; if (qh VERTEXneighbors && (qh PRINTsummary || qh KEEPinside || qh KEEPcoplanar - || qh TRACElevel || qh PRINTstatistics + || qh TRACElevel || qh PRINTstatistics || qh VERIFYoutput || qh CHECKfrequently || qh PRINTout[0] == qh_PRINTsummary || qh PRINTout[0] == qh_PRINTnone)) { - trace1((qh ferr, 1023, "qh_check_maxout: determine actual maxoutside and minvertex\n")); - vertices= qh_pointvertex(/*qh.facet_list*/); + trace1((qh ferr, 1023, "qh_check_maxout: determine actual minvertex\n")); + vertices= qh_pointvertex(/* qh.facet_list */); FORALLvertices { FOREACHneighbor_(vertex) { zinc_(Zdistvertex); /* distance also computed by main loop below */ qh_distplane(vertex->point, neighbor, &dist); - minimize_(minvertex, dist); + if (dist < mindist) { + if (qh min_vertex/minvertex_base > qh_WIDEmaxoutside && (qh PRINTprecision || !qh ALLOWwide)) { + nearest= qh_vertex_bestdist(neighbor->vertices); + /* should be caught in qh_mergefacet */ + qh_fprintf(qh ferr, 7083, "Qhull precision warning: in post-processing (qh_check_maxout) p%d(v%d) is %2.2g below f%d nearest vertices %2.2g\n", + qh_pointid(vertex->point), vertex->id, dist, neighbor->id, nearest); + } + mindist= dist; + minvertex= vertex; + minfacet= neighbor; + } +#ifndef qh_NOtrace if (-dist > qh TRACEdist || dist > qh TRACEdist - || neighbor == qh tracefacet || vertex == qh tracevertex) - qh_fprintf(qh ferr, 8093, "qh_check_maxout: p%d(v%d) is %.2g from f%d\n", - qh_pointid(vertex->point), vertex->id, dist, neighbor->id); + || neighbor == qh tracefacet || vertex == qh tracevertex) { + nearest= qh_vertex_bestdist(neighbor->vertices); + qh_fprintf(qh ferr, 8093, "qh_check_maxout: p%d(v%d) is %.2g from f%d nearest vertices %2.2g\n", + qh_pointid(vertex->point), vertex->id, dist, neighbor->id, nearest); + } +#endif } } if (qh MERGING) { wmin_(Wminvertex, qh min_vertex); } - qh min_vertex= minvertex; + qh min_vertex= mindist; qh_settempfree(&vertices); } - facets= qh_pointfacet(/*qh.facet_list*/); - do { - old_maxoutside= fmax_(qh max_outside, maxoutside); - FOREACHfacet_i_(facets) { /* for each point with facet assignment */ - if (facet) { - point= qh_point(facet_i); - if (point == qh GOODpointp) - continue; - zzinc_(Ztotcheck); - qh_distplane(point, facet, &dist); - numpart++; - bestfacet= qh_findbesthorizon(qh_IScheckmax, point, facet, !qh_NOupper, &dist, &numpart); - if (bestfacet && dist > maxoutside) { - if (qh ONLYgood && !bestfacet->good - && !((bestfacet= qh_findgooddist(point, bestfacet, &dist, &facetlist)) - && dist > maxoutside)) - notgood++; - else - maxoutside= dist; + trace1((qh ferr, 1055, "qh_check_maxout: determine actual maxoutside\n")); + maxoutside_base= fmax_(qh max_outside, qh ONEmerge+qh DISTround); + /* maxoutside_base is same as qh.MAXoutside without qh.MINoutside (qh_detmaxoutside) */ + facets= qh_pointfacet(/* qh.facet_list */); + FOREACHfacet_i_(facets) { /* for each point with facet assignment */ + if (facet) { + point= qh_point(facet_i); + if (point == qh GOODpointp) + continue; + zzinc_(Ztotcheck); + qh_distplane(point, facet, &dist); + numpart++; + bestfacet= qh_findbesthorizon(qh_IScheckmax, point, facet, !qh_NOupper, &dist, &numpart); + if (bestfacet && dist >= maxoutside) { + if (qh ONLYgood && !bestfacet->good + && !((bestfacet= qh_findgooddist(point, bestfacet, &dist, &facetlist)) + && dist > maxoutside)) { + notgood++; + }else if (dist/maxoutside_base > qh_WIDEmaxoutside && (qh PRINTprecision || !qh ALLOWwide)) { + nearest= qh_vertex_bestdist(bestfacet->vertices); + if (nearest < fmax_(qh ONEmerge, qh max_outside) * qh_RATIOcoplanaroutside * 2) { + qh_fprintf(qh ferr, 7087, "Qhull precision warning: in post-processing (qh_check_maxout) p%d for f%d is %2.2g above twisted facet f%d nearest vertices %2.2g\n", + qh_pointid(point), facet->id, dist, bestfacet->id, nearest); + }else { + qh_fprintf(qh ferr, 7088, "Qhull precision warning: in post-processing (qh_check_maxout) p%d for f%d is %2.2g above hidden facet f%d nearest vertices %2.2g\n", + qh_pointid(point), facet->id, dist, bestfacet->id, nearest); + } + maxbestfacet= bestfacet; } - if (dist > qh TRACEdist || (bestfacet && bestfacet == qh tracefacet)) - qh_fprintf(qh ferr, 8094, "qh_check_maxout: p%d is %.2g above f%d\n", - qh_pointid(point), dist, (bestfacet ? bestfacet->id : UINT_MAX)); - } + maxoutside= dist; + maxfacet= bestfacet; + maxpoint= point; + maxpointfacet= facet; + } + if (dist > qh TRACEdist || (bestfacet && bestfacet == qh tracefacet)) + qh_fprintf(qh ferr, 8094, "qh_check_maxout: p%d is %.2g above f%d\n", + qh_pointid(point), dist, (bestfacet ? bestfacet->id : UINT_MAX)); } - }while - (maxoutside > 2*old_maxoutside); - /* if qh.maxoutside increases substantially, qh_SEARCHdist is not valid - e.g., RBOX 5000 s Z1 G1e-13 t1001200614 | qhull */ + } zzadd_(Zcheckpart, numpart); qh_settempfree(&facets); wval_(Wmaxout)= maxoutside - qh max_outside; wmax_(Wmaxoutside, qh max_outside); - qh max_outside= maxoutside; - qh_nearcoplanar(/*qh.facet_list*/); + if (!qh APPROXhull && maxoutside > qh DISTround) { /* initial value for f.maxoutside */ + FORALLfacets { + if (maxoutside < facet->maxoutside) { + if (!qh KEEPcoplanar) { + maxoutside= facet->maxoutside; + }else if (maxoutside + qh DISTround < facet->maxoutside) { /* maxoutside is computed distance, e.g., rbox 100 s D3 t1547136913 | qhull R1e-3 Tcv Qc */ + qh_fprintf(qh ferr, 7082, "Qhull precision warning (qh_check_maxout): f%d.maxoutside (%4.4g) is greater than computed qh.max_outside (%2.2g) + qh.DISTround (%2.2g). It should be less than or equal\n", + facet->id, facet->maxoutside, maxoutside, qh DISTround); + } + } + } + } + qh max_outside= maxoutside; + qh_nearcoplanar(/* qh.facet_list */); qh maxoutdone= True; - trace1((qh ferr, 1024, "qh_check_maxout: maxoutside %2.2g, min_vertex %2.2g, outside of not good %d\n", - maxoutside, qh min_vertex, notgood)); + trace1((qh ferr, 1024, "qh_check_maxout: p%d(v%d) is qh.min_vertex %2.2g below facet f%d. Point p%d for f%d is qh.max_outside %2.2g above f%d. %d points are outside of not-good facets\n", + qh_pointid(minvertex->point), minvertex->id, qh min_vertex, minfacet->id, qh_pointid(maxpoint), maxpointfacet->id, qh max_outside, maxfacet->id, notgood)); + if(!qh ALLOWwide) { + if (maxoutside/maxoutside_base > qh_WIDEmaxoutside) { + qh_fprintf(qh ferr, 6297, "Qhull precision error (qh_check_maxout): large increase in qh.max_outside during post-processing dist %2.2g (%.1fx). See warning QH0032/QH0033. Allow with 'Q12' (allow-wide) and 'Pp'\n", + maxoutside, maxoutside/maxoutside_base); + qh_errexit(qh_ERRwide, maxbestfacet, NULL); + }else if (!qh APPROXhull && maxoutside_base > (qh ONEmerge * qh_WIDEmaxoutside2)) { + if (maxoutside > (qh ONEmerge * qh_WIDEmaxoutside2)) { /* wide facets may have been deleted */ + qh_fprintf(qh ferr, 6298, "Qhull precision error (qh_check_maxout): a facet merge, vertex merge, vertex, or coplanar point produced a wide facet %2.2g (%.1fx). Trace with option 'TWn' to identify the merge. Allow with 'Q12' (allow-wide)\n", + maxoutside_base, maxoutside_base/(qh ONEmerge + qh DISTround)); + qh_errexit(qh_ERRwide, maxbestfacet, NULL); + } + }else if (qh min_vertex/minvertex_base > qh_WIDEmaxoutside) { + qh_fprintf(qh ferr, 6354, "Qhull precision error (qh_check_maxout): large increase in qh.min_vertex during post-processing dist %2.2g (%.1fx). See warning QH7083. Allow with 'Q12' (allow-wide) and 'Pp'\n", + qh min_vertex, qh min_vertex/minvertex_base); + qh_errexit(qh_ERRwide, minfacet, NULL); + }else if (minvertex_base < -(qh ONEmerge * qh_WIDEmaxoutside2)) { + if (qh min_vertex < -(qh ONEmerge * qh_WIDEmaxoutside2)) { /* wide facets may have been deleted */ + qh_fprintf(qh ferr, 6380, "Qhull precision error (qh_check_maxout): a facet or vertex merge produced a wide facet: v%d below f%d distance %2.2g (%.1fx). Trace with option 'TWn' to identify the merge. Allow with 'Q12' (allow-wide)\n", + minvertex->id, minfacet->id, mindist, -qh min_vertex/(qh ONEmerge + qh DISTround)); + qh_errexit(qh_ERRwide, minfacet, NULL); + } + } + } } /* check_maxout */ #else /* qh_NOmerge */ void qh_check_maxout(void) { @@ -295,16 +338,16 @@ /*--------------------------------- - qh_check_output() + qh_check_output( ) performs the checks at the end of qhull algorithm - Maybe called after voronoi output. Will recompute otherwise centrums are Voronoi centers instead + Maybe called after Voronoi output. If so, it recomputes centrums since they are Voronoi centers instead. */ void qh_check_output(void) { int i; if (qh STOPcone) return; - if (qh VERIFYoutput | qh IStracing | qh CHECKfrequently) { + if (qh VERIFYoutput || qh IStracing || qh CHECKfrequently) { qh_checkpolygon(qh facet_list); qh_checkflipped_all(qh facet_list); qh_checkconvex(qh facet_list, qh_ALGORITHMfault); @@ -319,35 +362,43 @@ /*--------------------------------- - qh_check_point( point, facet, maxoutside, maxdist, errfacet1, errfacet2 ) + qh_check_point( point, facet, maxoutside, maxdist, errfacet1, errfacet2, errcount ) check that point is less than maxoutside from facet + + notes: + only called from qh_checkpoints + reports up to qh_MAXcheckpoint-1 errors per facet */ -void qh_check_point(pointT *point, facetT *facet, realT *maxoutside, realT *maxdist, facetT **errfacet1, facetT **errfacet2) { - realT dist; +void qh_check_point(pointT *point, facetT *facet, realT *maxoutside, realT *maxdist, facetT **errfacet1, facetT **errfacet2, int *errcount) { + realT dist, nearest; /* occurs after statistics reported */ qh_distplane(point, facet, &dist); + maximize_(*maxdist, dist); if (dist > *maxoutside) { + (*errcount)++; if (*errfacet1 != facet) { *errfacet2= *errfacet1; *errfacet1= facet; } - qh_fprintf(qh ferr, 6111, "qhull precision error: point p%d is outside facet f%d, distance= %6.8g maxoutside= %6.8g\n", - qh_pointid(point), facet->id, dist, *maxoutside); + if (*errcount < qh_MAXcheckpoint) { + nearest= qh_vertex_bestdist(facet->vertices); + qh_fprintf(qh ferr, 6111, "qhull precision error: point p%d is outside facet f%d, distance= %6.8g maxoutside= %6.8g nearest vertices %2.2g\n", + qh_pointid(point), facet->id, dist, *maxoutside, nearest); + } } - maximize_(*maxdist, dist); } /* qh_check_point */ /*--------------------------------- - qh_check_points() + qh_check_points( ) checks that all points are inside all facets notes: if many points and qh_check_maxout not called (i.e., !qh.MERGING), - calls qh_findbesthorizon (seldom done). + calls qh_findbesthorizon via qh_check_bestdist (seldom done). ignores flipped facets maxoutside includes 2 qh.DISTrounds one qh.DISTround for the computed distances in qh_check_points @@ -366,6 +417,7 @@ facetT *facet, *errfacet1= NULL, *errfacet2= NULL; realT total, maxoutside, maxdist= -REALmax; pointT *point, **pointp, *pointtemp; + int errcount; boolT testouter; maxoutside= qh_maxouter(); @@ -379,8 +431,7 @@ total= (float)qh num_facets * (float)qh num_points; if (total >= qh_VERIFYdirect && !qh maxoutdone) { if (!qh_QUICKhelp && qh SKIPcheckmax && qh MERGING) - qh_fprintf(qh ferr, 7075, "qhull input warning: merging without checking outer planes('Q5' or 'Po').\n\ -Verify may report that a point is outside of a facet.\n"); + qh_fprintf(qh ferr, 7075, "qhull input warning: merging without checking outer planes('Q5' or 'Po'). Verify may report that a point is outside of a facet.\n"); qh_check_bestdist(); }else { if (qh_MAXoutside && qh maxoutdone) @@ -389,12 +440,9 @@ testouter= False; if (!qh_QUICKhelp) { if (qh MERGEexact) - qh_fprintf(qh ferr, 7076, "qhull input warning: exact merge ('Qx'). Verify may report that a point\n\ -is outside of a facet. See qh-optq.htm#Qx\n"); + qh_fprintf(qh ferr, 7076, "qhull input warning: exact merge ('Qx'). Verify may report that a point is outside of a facet. See qh-optq.htm#Qx\n"); else if (qh SKIPcheckmax || qh NOnearinside) - qh_fprintf(qh ferr, 7077, "qhull input warning: no outer plane check ('Q5') or no processing of\n\ -near-inside points ('Q8'). Verify may report that a point is outside\n\ -of a facet.\n"); + qh_fprintf(qh ferr, 7077, "qhull input warning: no outer plane check ('Q5') or no processing of near-inside points ('Q8'). Verify may report that a point is outside of a facet.\n"); } if (qh PRINTprecision) { if (testouter) @@ -415,29 +463,36 @@ continue; if (!facet->normal) { qh_fprintf(qh ferr, 7061, "qhull warning (qh_check_points): missing normal for facet f%d\n", facet->id); + if (!errfacet1) + errfacet1= facet; continue; } if (testouter) { #if qh_MAXoutside - maxoutside= facet->maxoutside + 2* qh DISTround; + maxoutside= facet->maxoutside + 2 * qh DISTround; /* one DISTround to actual point and another to computed point */ #endif } + errcount= 0; FORALLpoints { if (point != qh GOODpointp) - qh_check_point(point, facet, &maxoutside, &maxdist, &errfacet1, &errfacet2); + qh_check_point(point, facet, &maxoutside, &maxdist, &errfacet1, &errfacet2, &errcount); } FOREACHpoint_(qh other_points) { if (point != qh GOODpointp) - qh_check_point(point, facet, &maxoutside, &maxdist, &errfacet1, &errfacet2); + qh_check_point(point, facet, &maxoutside, &maxdist, &errfacet1, &errfacet2, &errcount); + } + if (errcount >= qh_MAXcheckpoint) { + qh_fprintf(qh ferr, 6422, "qhull precision error (qh_check_points): %d additional points outside facet f%d, maxdist= %6.8g\n", + errcount-qh_MAXcheckpoint+1, facet->id, maxdist); } } if (maxdist > qh outside_err) { qh_fprintf(qh ferr, 6112, "qhull precision error (qh_check_points): a coplanar point is %6.2g from convex hull. The maximum value(qh.outside_err) is %6.2g\n", maxdist, qh outside_err ); - qh_errexit2( qh_ERRprec, errfacet1, errfacet2 ); + qh_errexit2(qh_ERRprec, errfacet1, errfacet2 ); }else if (errfacet1 && qh outside_err > REALmax/2) - qh_errexit2( qh_ERRprec, errfacet1, errfacet2 ); + qh_errexit2(qh_ERRprec, errfacet1, errfacet2 ); /* else if errfacet1, the error was logged to qh.ferr but does not effect the output */ trace0((qh ferr, 21, "qh_check_points: max distance outside %2.2g\n", maxdist)); } @@ -449,103 +504,133 @@ qh_checkconvex( facetlist, fault ) check that each ridge in facetlist is convex - fault = qh_DATAfault if reporting errors + fault = qh_DATAfault if reporting errors from qh_initialhull with qh.ZEROcentrum = qh_ALGORITHMfault otherwise returns: counts Zconcaveridges and Zcoplanarridges - errors if concaveridge or if merging an coplanar ridge + errors if !qh.FORCEoutput ('Fo') and concaveridge or if merging a coplanar ridge + overwrites Voronoi centers if set by qh_setvoronoi_all/qh_ASvoronoi - note: + notes: + called by qh_initial_hull, qh_check_output, qh_all_merges ('Tc'), qh_build_withrestart ('QJ') + does not test f.tricoplanar facets (qh_triangulate) + must be no stronger than qh_test_appendmerge if not merging, - tests vertices for neighboring simplicial facets - else if ZEROcentrum, - tests vertices for neighboring simplicial facets - else - tests centrums of neighboring facets + tests vertices for neighboring simplicial facets < -qh.DISTround + else if ZEROcentrum and simplicial facet, + tests vertices for neighboring simplicial facets < 0.0 + tests centrums of neighboring nonsimplicial facets < 0.0 + else if ZEROcentrum + tests centrums of neighboring facets < 0.0 + else + tests centrums of neighboring facets < -qh.DISTround ('En' 'Rn') + Does not test against -qh.centrum_radius since repeated computations may have different round-off errors (e.g., 'Rn') design: for all facets report flipped facets if ZEROcentrum and simplicial neighbors - test vertices for neighboring simplicial facets + test vertices against neighbor else - test centrum against all neighbors + test centrum against neighbor */ void qh_checkconvex(facetT *facetlist, int fault) { facetT *facet, *neighbor, **neighborp, *errfacet1=NULL, *errfacet2=NULL; vertexT *vertex; realT dist; pointT *centrum; - boolT waserror= False, centrum_warning= False, tempcentrum= False, allsimplicial; - int neighbor_i; + boolT waserror= False, centrum_warning= False, tempcentrum= False, first_nonsimplicial= False, tested_simplicial, allsimplicial; + int neighbor_i, neighbor_n; - trace1((qh ferr, 1026, "qh_checkconvex: check all ridges are convex\n")); + if (qh ZEROcentrum) { + trace1((qh ferr, 1064, "qh_checkconvex: check that facets are not-flipped and for qh.ZEROcentrum that simplicial vertices are below their neighbor (dist<0.0)\n")); + first_nonsimplicial= True; + }else if (!qh MERGING) { + trace1((qh ferr, 1026, "qh_checkconvex: check that facets are not-flipped and that simplicial vertices are convex by qh.DISTround ('En', 'Rn')\n")); + first_nonsimplicial= True; + }else + trace1((qh ferr, 1062, "qh_checkconvex: check that facets are not-flipped and that their centrums are convex by qh.DISTround ('En', 'Rn') \n")); if (!qh RERUN) { zzval_(Zconcaveridges)= 0; zzval_(Zcoplanarridges)= 0; } FORALLfacet_(facetlist) { if (facet->flipped) { - qh_precision("flipped facet"); - qh_fprintf(qh ferr, 6113, "qhull precision error: f%d is flipped(interior point is outside)\n", + qh_joggle_restart("flipped facet"); /* also tested by qh_checkflipped */ + qh_fprintf(qh ferr, 6113, "qhull precision error: f%d is flipped (interior point is outside)\n", facet->id); errfacet1= facet; waserror= True; continue; } - if (qh MERGING && (!qh ZEROcentrum || !facet->simplicial || facet->tricoplanar)) + if (facet->tricoplanar) + continue; + if (qh MERGING && (!qh ZEROcentrum || !facet->simplicial)) { allsimplicial= False; - else { + tested_simplicial= False; + }else { allsimplicial= True; - neighbor_i= 0; - FOREACHneighbor_(facet) { - vertex= SETelemt_(facet->vertices, neighbor_i++, vertexT); - if (!neighbor->simplicial || neighbor->tricoplanar) { + tested_simplicial= True; + FOREACHneighbor_i_(facet) { + if (neighbor->tricoplanar) + continue; + if (!neighbor->simplicial) { allsimplicial= False; continue; } + vertex= SETelemt_(facet->vertices, neighbor_i, vertexT); qh_distplane(vertex->point, neighbor, &dist); - if (dist > -qh DISTround) { + if (dist >= -qh DISTround) { if (fault == qh_DATAfault) { - qh_precision("coplanar or concave ridge"); - qh_fprintf(qh ferr, 6114, "qhull precision error: initial simplex is not convex. Distance=%.2g\n", dist); - qh_errexit(qh_ERRsingular, NULL, NULL); + qh_joggle_restart("non-convex initial simplex"); + if (dist > qh DISTround) + qh_fprintf(qh ferr, 6114, "qhull precision error: initial simplex is not convex, since p%d(v%d) is %6.4g above opposite f%d\n", + qh_pointid(vertex->point), vertex->id, dist, neighbor->id); + else + qh_fprintf(qh ferr, 6379, "qhull precision error: initial simplex is not convex, since p%d(v%d) is within roundoff of opposite facet f%d (dist %6.4g)\n", + qh_pointid(vertex->point), vertex->id, neighbor->id, dist); + qh_errexit(qh_ERRsingular, neighbor, NULL); } if (dist > qh DISTround) { zzinc_(Zconcaveridges); - qh_precision("concave ridge"); - qh_fprintf(qh ferr, 6115, "qhull precision error: f%d is concave to f%d, since p%d(v%d) is %6.4g above\n", - facet->id, neighbor->id, qh_pointid(vertex->point), vertex->id, dist); + qh_joggle_restart("concave ridge"); + qh_fprintf(qh ferr, 6115, "qhull precision error: f%d is concave to f%d, since p%d(v%d) is %6.4g above f%d\n", + facet->id, neighbor->id, qh_pointid(vertex->point), vertex->id, dist, neighbor->id); errfacet1= facet; errfacet2= neighbor; waserror= True; }else if (qh ZEROcentrum) { - if (dist > 0) { /* qh_checkzero checks that dist < - qh DISTround */ + if (dist > 0.0) { /* qh_checkzero checked convex (dist < (- 2*qh DISTround)), computation may differ e.g. 'Rn' */ zzinc_(Zcoplanarridges); - qh_precision("coplanar ridge"); - qh_fprintf(qh ferr, 6116, "qhull precision error: f%d is clearly not convex to f%d, since p%d(v%d) is %6.4g above\n", - facet->id, neighbor->id, qh_pointid(vertex->point), vertex->id, dist); + qh_joggle_restart("coplanar ridge"); + qh_fprintf(qh ferr, 6116, "qhull precision error: f%d is clearly not convex to f%d, since p%d(v%d) is %6.4g above or coplanar with f%d with qh.ZEROcentrum\n", + facet->id, neighbor->id, qh_pointid(vertex->point), vertex->id, dist, neighbor->id); errfacet1= facet; errfacet2= neighbor; waserror= True; } }else { zzinc_(Zcoplanarridges); - qh_precision("coplanar ridge"); - trace0((qh ferr, 22, "qhull precision error: f%d may be coplanar to f%d, since p%d(v%d) is within %6.4g during p%d\n", - facet->id, neighbor->id, qh_pointid(vertex->point), vertex->id, dist, qh furthest_id)); + qh_joggle_restart("coplanar ridge"); + trace0((qh ferr, 22, "qhull precision error: f%d is coplanar to f%d, since p%d(v%d) is within %6.4g of f%d, during p%d\n", + facet->id, neighbor->id, qh_pointid(vertex->point), vertex->id, dist, neighbor->id, qh furthest_id)); } } } } if (!allsimplicial) { + if (first_nonsimplicial) { + trace1((qh ferr, 1063, "qh_checkconvex: starting with f%d, also check that centrums of non-simplicial ridges are below their neighbors (dist<0.0)\n", + facet->id)); + first_nonsimplicial= False; + } if (qh CENTERtype == qh_AScentrum) { if (!facet->center) facet->center= qh_getcentrum(facet); centrum= facet->center; }else { - if (!centrum_warning && (!facet->simplicial || facet->tricoplanar)) { + if (!centrum_warning && !facet->simplicial) { /* recomputed centrum correct for simplicial facets */ centrum_warning= True; qh_fprintf(qh ferr, 7062, "qhull warning: recomputing centrums for convexity test. This may lead to false, precision errors.\n"); } @@ -553,15 +638,15 @@ tempcentrum= True; } FOREACHneighbor_(facet) { - if (qh ZEROcentrum && facet->simplicial && neighbor->simplicial) + if (neighbor->simplicial && tested_simplicial) /* tested above since f.simplicial */ continue; - if (facet->tricoplanar || neighbor->tricoplanar) + if (neighbor->tricoplanar) continue; zzinc_(Zdistconvex); qh_distplane(centrum, neighbor, &dist); if (dist > qh DISTround) { zzinc_(Zconcaveridges); - qh_precision("concave ridge"); + qh_joggle_restart("concave ridge"); qh_fprintf(qh ferr, 6117, "qhull precision error: f%d is concave to f%d. Centrum of f%d is %6.4g above f%d\n", facet->id, neighbor->id, facet->id, dist, neighbor->id); errfacet1= facet; @@ -570,7 +655,7 @@ }else if (dist >= 0.0) { /* if arithmetic always rounds the same, can test against centrum radius instead */ zzinc_(Zcoplanarridges); - qh_precision("coplanar ridge"); + qh_joggle_restart("coplanar ridge"); qh_fprintf(qh ferr, 6118, "qhull precision error: f%d is coplanar or concave to f%d. Centrum of f%d is %6.4g above f%d\n", facet->id, neighbor->id, facet->id, dist, neighbor->id); errfacet1= facet; @@ -613,6 +698,7 @@ all ridges have distinct vertex sets notes: + called by qh_tracemerge and qh_checkpolygon uses neighbor->seen design: @@ -628,22 +714,53 @@ facetT *neighbor, **neighborp, *errother=NULL; ridgeT *ridge, **ridgep, *errridge= NULL, *ridge2; vertexT *vertex, **vertexp; - unsigned previousid= INT_MAX; + unsigned int previousid= INT_MAX; int numneighbors, numvertices, numridges=0, numRvertices=0; boolT waserror= False; - int skipA, skipB, ridge_i, ridge_n, i; + int skipA, skipB, ridge_i, ridge_n, i, last_v= qh hull_dim-2; setT *intersection; - if (facet->visible) { - qh_fprintf(qh ferr, 6119, "qhull internal error (qh_checkfacet): facet f%d is on the visible_list\n", + trace4((qh ferr, 4088, "qh_checkfacet: check f%d newmerge? %d\n", facet->id, newmerge)); + if (facet->id >= qh facet_id) { + qh_fprintf(qh ferr, 6414, "qhull internal error (qh_checkfacet): unknown facet id f%d >= qh.facet_id (%d)\n", facet->id, qh facet_id); + waserror= True; + } + if (facet->visitid > qh visit_id) { + qh_fprintf(qh ferr, 6415, "qhull internal error (qh_checkfacet): expecting f%d.visitid <= qh.visit_id (%d). Got visitid %d\n", facet->id, qh visit_id, facet->visitid); + waserror= True; + } + if (facet->visible && !qh NEWtentative) { + qh_fprintf(qh ferr, 6119, "qhull internal error (qh_checkfacet): facet f%d is on qh.visible_list\n", facet->id); qh_errexit(qh_ERRqhull, facet, NULL); } + if (facet->redundant && !facet->visible && qh_setsize(qh degen_mergeset)==0) { + qh_fprintf(qh ferr, 6399, "qhull internal error (qh_checkfacet): redundant facet f%d not on qh.visible_list\n", + facet->id); + waserror= True; + } + if (facet->degenerate && !facet->visible && qh_setsize(qh degen_mergeset)==0) { + qh_fprintf(qh ferr, 6400, "qhull internal error (qh_checkfacet): degenerate facet f%d is not on qh.visible_list and qh.degen_mergeset is empty\n", + facet->id); + waserror= True; + } if (!facet->normal) { - qh_fprintf(qh ferr, 6120, "qhull internal error (qh_checkfacet): facet f%d does not have a normal\n", + qh_fprintf(qh ferr, 6120, "qhull internal error (qh_checkfacet): facet f%d does not have a normal\n", facet->id); waserror= True; } + if (!facet->newfacet) { + if (facet->dupridge) { + qh_fprintf(qh ferr, 6349, "qhull internal error (qh_checkfacet): f%d is 'dupridge' but it is not a newfacet on qh.newfacet_list f%d\n", + facet->id, getid_(qh newfacet_list)); + waserror= True; + } + if (facet->newmerge) { + qh_fprintf(qh ferr, 6383, "qhull internal error (qh_checkfacet): f%d is 'newmerge' but it is not a newfacet on qh.newfacet_list f%d. Missing call to qh_reducevertices\n", + facet->id, getid_(qh newfacet_list)); + waserror= True; + } + } qh_setcheck(facet->vertices, "vertices for f", facet->id); qh_setcheck(facet->ridges, "ridges for f", facet->id); qh_setcheck(facet->outsideset, "outsideset for f", facet->id); @@ -694,9 +811,15 @@ } FOREACHneighbor_(facet) { if (neighbor == qh_MERGEridge || neighbor == qh_DUPLICATEridge) { - qh_fprintf(qh ferr, 6126, "qhull internal error (qh_checkfacet): facet f%d still has a MERGE or DUP neighbor\n", facet->id); + qh_fprintf(qh ferr, 6126, "qhull internal error (qh_checkfacet): facet f%d still has a MERGEridge or DUPLICATEridge neighbor\n", facet->id); qh_errexit(qh_ERRqhull, facet, NULL); } + if (neighbor->visible) { + qh_fprintf(qh ferr, 6401, "qhull internal error (qh_checkfacet): facet f%d has deleted neighbor f%d (qh.visible_list)\n", + facet->id, neighbor->id); + errother= neighbor; + waserror= True; + } neighbor->seen= True; } FOREACHneighbor_(facet) { @@ -741,6 +864,14 @@ errridge= ridge; waserror= True; } + if (!facet->newfacet && !neighbor->newfacet) { + if ((!ridge->tested) | ridge->nonconvex | ridge->mergevertex) { + qh_fprintf(qh ferr, 6384, "qhull internal error (qh_checkfacet): ridge r%d is nonconvex (%d), mergevertex (%d) or not tested (%d) for facet f%d, neighbor f%d\n", + ridge->id, ridge->nonconvex, ridge->mergevertex, ridge->tested, facet->id, neighbor->id); + errridge= ridge; + waserror= True; + } + } } if (!facet->simplicial) { FOREACHneighbor_(facet) { @@ -773,15 +904,16 @@ if (!newmerge) { FOREACHvertex_(intersection) { if (!vertex->seen2) { - if (qh IStracing >=3 || !qh MERGING) { - qh_fprintf(qh ferr, 6134, "qhull precision error (qh_checkfacet): vertex v%d in f%d intersect f%d but\n\ - not in a ridge. This is ok under merging. Last point was p%d\n", + if (!qh MERGING) { + qh_fprintf(qh ferr, 6420, "qhull topology error (qh_checkfacet): vertex v%d in f%d intersect f%d but not in a ridge. Last point was p%d\n", vertex->id, facet->id, neighbor->id, qh furthest_id); - if (!qh FORCEoutput && !qh MERGING) { + if (!qh FORCEoutput) { qh_errprint("ERRONEOUS", facet, neighbor, NULL, vertex); - if (!qh MERGING) - qh_errexit(qh_ERRqhull, NULL, NULL); + qh_errexit(qh_ERRtopology, NULL, NULL); } + }else { + trace4((qh ferr, 4025, "qh_checkfacet: vertex v%d in f%d intersect f%d but not in a ridge. Repaired by qh_remove_extravertices in qh_reducevertices\n", + vertex->id, facet->id, neighbor->id)); } } } @@ -790,7 +922,7 @@ } }else { /* simplicial */ FOREACHneighbor_(facet) { - if (neighbor->simplicial) { + if (neighbor->simplicial && !facet->degenerate && !neighbor->degenerate) { skipA= SETindex_(facet->neighbors, neighbor); skipB= qh_setindex(neighbor->neighbors, facet); if (skipA<0 || skipB<0 || !qh_setequal_skip(facet->vertices, skipA, neighbor->vertices, skipB)) { @@ -802,15 +934,21 @@ } } } - if (qh hull_dim < 5 && (qh IStracing > 2 || qh CHECKfrequently)) { - FOREACHridge_i_(facet->ridges) { /* expensive */ - for (i=ridge_i+1; i < ridge_n; i++) { - ridge2= SETelemt_(facet->ridges, i, ridgeT); - if (qh_setequal(ridge->vertices, ridge2->vertices)) { - qh_fprintf(qh ferr, 6227, "Qhull internal error (qh_checkfacet): ridges r%d and r%d have the same vertices\n", - ridge->id, ridge2->id); - errridge= ridge; - waserror= True; + if (!newmerge && qh CHECKduplicates && qh hull_dim < 5 && (qh IStracing > 2 || qh CHECKfrequently)) { + FOREACHridge_i_(facet->ridges) { /* expensive, if was merge and qh_maybe_duplicateridges hasn't been called yet */ + if (!ridge->mergevertex) { + for (i=ridge_i+1; i < ridge_n; i++) { + ridge2= SETelemt_(facet->ridges, i, ridgeT); + if (SETelem_(ridge->vertices, last_v) == SETelem_(ridge2->vertices, last_v)) { /* SETfirst is likely to be the same */ + if (SETfirst_(ridge->vertices) == SETfirst_(ridge2->vertices)) { + if (qh_setequal(ridge->vertices, ridge2->vertices)) { + qh_fprintf(qh ferr, 6294, "qhull internal error (qh_checkfacet): ridges r%d and r%d (f%d) have the same vertices\n", /* same as duplicate ridge */ + ridge->id, ridge2->id, facet->id); + errridge= ridge; + waserror= True; + } + } + } } } } @@ -821,12 +959,14 @@ } } /* checkfacet */ - /*--------------------------------- qh_checkflipped_all( facetlist ) checks orientation of facets in list against interior point + + notes: + called by qh_checkoutput */ void qh_checkflipped_all(facetT *facetlist) { facetT *facet; @@ -848,80 +988,300 @@ if (waserror) { qh_fprintf(qh ferr, 8101, "\n\ A flipped facet occurs when its distance to the interior point is\n\ -greater than %2.2g, the maximum roundoff error.\n", -qh DISTround); +greater than or equal to %2.2g, the maximum roundoff error.\n", -qh DISTround); qh_errexit(qh_ERRprec, NULL, NULL); } } /* checkflipped_all */ /*--------------------------------- + + qh_checklists( facetlist ) + Check and repair facetlist and qh.vertex_list for infinite loops or overwritten facets + Checks that qh.newvertex_list is on qh.vertex_list + if facetlist is qh.facet_list + Checks that qh.visible_list and qh.newfacet_list are on qh.facet_list + Updates qh.facetvisit and qh.vertexvisit + + returns: + True if no errors found + If false, repairs erroneous lists to prevent infinite loops by FORALL macros + + notes: + called by qh_buildtracing, qh_checkpolygon, qh_collectstatistics, qh_printfacetlist, qh_printsummary + not called by qh_printlists + + design: + if facetlist + check qh.facet_tail + for each facet + check for infinite loop or overwritten facet + check previous facet + if facetlist is qh.facet_list + check qh.next_facet, qh.visible_list and qh.newfacet_list + if vertexlist + check qh.vertex_tail + for each vertex + check for infinite loop or overwritten vertex + check previous vertex + check qh.newvertex_list +*/ +boolT qh_checklists(facetT *facetlist) { + facetT *facet, *errorfacet= NULL, *errorfacet2= NULL, *previousfacet; + vertexT *vertex, *vertexlist, *previousvertex, *errorvertex= NULL; + boolT waserror= False, newseen= False, nextseen= False, newvertexseen= False, visibleseen= False; + + if (facetlist == qh newfacet_list || facetlist == qh visible_list) { + vertexlist= qh vertex_list; + previousvertex= NULL; + trace2((qh ferr, 2110, "qh_checklists: check qh.%s_list f%d and qh.vertex_list v%d\n", + (facetlist == qh newfacet_list ? "newfacet" : "visible"), facetlist->id, getid_(vertexlist))); + }else { + vertexlist= qh vertex_list; + previousvertex= NULL; + trace2((qh ferr, 2111, "qh_checklists: check %slist f%d and qh.vertex_list v%d\n", + (facetlist == qh facet_list ? "qh.facet_" : "facet"), getid_(facetlist), getid_(vertexlist))); + } + if (facetlist) { + if (qh facet_tail == NULL || qh facet_tail->id != 0 || qh facet_tail->next != NULL) { + qh_fprintf(qh ferr, 6397, "qhull internal error (qh_checklists): either qh.facet_tail f%d is NULL, or its id is not 0, or its next is not NULL\n", + getid_(qh facet_tail)); + qh_errexit(qh_ERRqhull, qh facet_tail, NULL); + } + previousfacet= (facetlist == qh facet_list ? NULL : facetlist->previous); + qh visit_id++; + FORALLfacet_(facetlist) { + if (facet->visitid >= qh visit_id || facet->id >= qh facet_id) { + waserror= True; + errorfacet= facet; + errorfacet2= previousfacet; + if (facet->visitid == qh visit_id) + qh_fprintf(qh ferr, 6039, "qhull internal error (qh_checklists): f%d already in facetlist causing an infinite loop ... f%d > f%d ... > f%d > f%d. Truncate facetlist at f%d\n", + facet->id, facet->id, facet->next->id, getid_(previousfacet), facet->id, getid_(previousfacet)); + else + qh_fprintf(qh ferr, 6350, "qhull internal error (qh_checklists): unknown or overwritten facet f%d, either id >= qh.facet_id (%d) or f.visitid %u > qh.visit_id %u. Facetlist terminated at previous facet f%d\n", + facet->id, qh facet_id, facet->visitid, qh visit_id, getid_(previousfacet)); + if (previousfacet) + previousfacet->next= qh facet_tail; + else + facetlist= qh facet_tail; + break; + } + facet->visitid= qh visit_id; + if (facet->previous != previousfacet) { + qh_fprintf(qh ferr, 6416, "qhull internal error (qh_checklists): expecting f%d.previous == f%d. Got f%d\n", + facet->id, getid_(previousfacet), getid_(facet->previous)); + waserror= True; + errorfacet= facet; + errorfacet2= facet->previous; + } + previousfacet= facet; + if (facetlist == qh facet_list) { + if (facet == qh visible_list) { + if(newseen){ + qh_fprintf(qh ferr, 6285, "qhull internal error (qh_checklists): qh.visible_list f%d is after qh.newfacet_list f%d. It should be at, before, or NULL\n", + facet->id, getid_(qh newfacet_list)); + waserror= True; + errorfacet= facet; + errorfacet2= qh newfacet_list; + } + visibleseen= True; + } + if (facet == qh newfacet_list) + newseen= True; + if (facet == qh facet_next) + nextseen= True; + } + } + if (facetlist == qh facet_list) { + if (!nextseen && qh facet_next && qh facet_next->next) { + qh_fprintf(qh ferr, 6369, "qhull internal error (qh_checklists): qh.facet_next f%d for qh_addpoint is not on qh.facet_list f%d\n", + qh facet_next->id, facetlist->id); + waserror= True; + errorfacet= qh facet_next; + errorfacet2= facetlist; + } + if (!newseen && qh newfacet_list && qh newfacet_list->next) { + qh_fprintf(qh ferr, 6286, "qhull internal error (qh_checklists): qh.newfacet_list f%d is not on qh.facet_list f%d\n", + qh newfacet_list->id, facetlist->id); + waserror= True; + errorfacet= qh newfacet_list; + errorfacet2= facetlist; + } + if (!visibleseen && qh visible_list && qh visible_list->next) { + qh_fprintf(qh ferr, 6138, "qhull internal error (qh_checklists): qh.visible_list f%d is not on qh.facet_list f%d\n", + qh visible_list->id, facetlist->id); + waserror= True; + errorfacet= qh visible_list; + errorfacet2= facetlist; + } + } + } + if (vertexlist) { + if (qh vertex_tail == NULL || qh vertex_tail->id != 0 || qh vertex_tail->next != NULL) { + qh_fprintf(qh ferr, 6366, "qhull internal error (qh_checklists): either qh.vertex_tail v%d is NULL, or its id is not 0, or its next is not NULL\n", + getid_(qh vertex_tail)); + qh_errprint("ERRONEOUS", errorfacet, errorfacet2, NULL, qh vertex_tail); + qh_errexit(qh_ERRqhull, NULL, NULL); + } + qh vertex_visit++; + FORALLvertex_(vertexlist) { + if (vertex->visitid >= qh vertex_visit || vertex->id >= qh vertex_id) { + waserror= True; + errorvertex= vertex; + if (vertex->visitid == qh visit_id) + qh_fprintf(qh ferr, 6367, "qhull internal error (qh_checklists): v%d already in vertexlist causing an infinite loop ... v%d > v%d ... > v%d > v%d. Truncate vertexlist at v%d\n", + vertex->id, vertex->id, vertex->next->id, getid_(previousvertex), vertex->id, getid_(previousvertex)); + else + qh_fprintf(qh ferr, 6368, "qhull internal error (qh_checklists): unknown or overwritten vertex v%d, either id >= qh.vertex_id (%d) or v.visitid %u > qh.visit_id %u. vertexlist terminated at previous vertex v%d\n", + vertex->id, qh vertex_id, vertex->visitid, qh visit_id, getid_(previousvertex)); + if (previousvertex) + previousvertex->next= qh vertex_tail; + else + vertexlist= qh vertex_tail; + break; + } + vertex->visitid= qh vertex_visit; + if (vertex->previous != previousvertex) { + qh_fprintf(qh ferr, 6427, "qhull internal error (qh_checklists): expecting v%d.previous == v%d. Got v%d\n", + vertex->id, previousvertex, getid_(vertex->previous)); + waserror= True; + errorvertex= vertex; + } + previousvertex= vertex; + if(vertex == qh newvertex_list) + newvertexseen= True; + } + if(!newvertexseen && qh newvertex_list && qh newvertex_list->next) { + qh_fprintf(qh ferr, 6287, "qhull internal error (qh_checklists): new vertex list v%d is not on vertex list\n", qh newvertex_list->id); + waserror= True; + errorvertex= qh newvertex_list; + } + } + if (waserror) { + qh_errprint("ERRONEOUS", errorfacet, errorfacet2, NULL, errorvertex); + return False; + } + return True; +} /* checklists */ + +/*--------------------------------- qh_checkpolygon( facetlist ) checks the correctness of the structure notes: - call with either qh.facet_list or qh.newfacet_list + called by qh_addpoint, qh_all_vertexmerge, qh_check_output, qh_initialhull, qh_prepare_output, qh_triangulate + call with qh.facet_list or qh.newfacet_list or another list checks num_facets and num_vertices if qh.facet_list design: + check and repair lists for infinite loop for each facet - checks facet and outside set - initializes vertexlist + check f.newfacet and f.visible + check facet and outside set if qh.NEWtentative and not f.newfacet, or not f.visible + initializes vertexlist for qh.facet_list or qh.newfacet_list + for each vertex + check vertex + check v.newfacet for each facet - checks vertex set - if checking all facets(qh.facetlist) + count f.ridges + check and count f.vertices + if checking qh.facet_list check facet count if qh.VERTEXneighbors - check vertex neighbors and count + check and count v.neighbors for all vertices + check v.neighbors count and report possible causes of mismatch + check that facets are in their v.neighbors check vertex count */ void qh_checkpolygon(facetT *facetlist) { - facetT *facet; + facetT *facet, *neighbor, **neighborp; + facetT *errorfacet= NULL, *errorfacet2= NULL; vertexT *vertex, **vertexp, *vertexlist; int numfacets= 0, numvertices= 0, numridges= 0; - int totvneighbors= 0, totvertices= 0; - boolT waserror= False, nextseen= False, visibleseen= False; + int totvneighbors= 0, totfacetvertices= 0; + boolT waserror= False, newseen= False, newvertexseen= False, nextseen= False, visibleseen= False; + boolT checkfacet; - trace1((qh ferr, 1027, "qh_checkpolygon: check all facets from f%d\n", facetlist->id)); + trace1((qh ferr, 1027, "qh_checkpolygon: check all facets from f%d, qh.NEWtentative? %d\n", facetlist->id, qh NEWtentative)); + if (!qh_checklists(facetlist)) { + waserror= True; + qh_fprintf(qh ferr, 6374, "qhull internal error: qh_checklists failed in qh_checkpolygon\n"); + if (qh num_facets < 4000) + qh_printlists(); + } if (facetlist != qh facet_list || qh ONLYgood) - nextseen= True; + nextseen= True; /* allow f.outsideset */ FORALLfacet_(facetlist) { if (facet == qh visible_list) visibleseen= True; - if (!facet->visible) { + if (facet == qh newfacet_list) + newseen= True; + if (facet->newfacet && !newseen && !visibleseen) { + qh_fprintf(qh ferr, 6289, "qhull internal error (qh_checkpolygon): f%d is 'newfacet' but it is not on qh.newfacet_list f%d or visible_list f%d\n", facet->id, getid_(qh newfacet_list), getid_(qh visible_list)); + qh_errexit(qh_ERRqhull, facet, NULL); + } + if (!facet->newfacet && newseen) { + qh_fprintf(qh ferr, 6292, "qhull internal error (qh_checkpolygon): f%d is on qh.newfacet_list f%d but it is not 'newfacet'\n", facet->id, getid_(qh newfacet_list)); + qh_errexit(qh_ERRqhull, facet, NULL); + } + if (facet->visible != (visibleseen & !newseen)) { + if(facet->visible) + qh_fprintf(qh ferr, 6290, "qhull internal error (qh_checkpolygon): f%d is 'visible' but it is not on qh.visible_list f%d\n", facet->id, getid_(qh visible_list)); + else + qh_fprintf(qh ferr, 6291, "qhull internal error (qh_checkpolygon): f%d is on qh.visible_list f%d but it is not 'visible'\n", facet->id, qh newfacet_list->id); + qh_errexit(qh_ERRqhull, facet, NULL); + } + if (qh NEWtentative) { + checkfacet= !facet->newfacet; + }else { + checkfacet= !facet->visible; + } + if(checkfacet) { if (!nextseen) { - if (facet == qh facet_next) + if (facet == qh facet_next) /* previous facets do not have outsideset */ nextseen= True; else if (qh_setsize(facet->outsideset)) { if (!qh NARROWhull #if !qh_COMPUTEfurthest - || facet->furthestdist >= qh MINoutside + || facet->furthestdist >= qh MINoutside #endif - ) { - qh_fprintf(qh ferr, 6137, "qhull internal error (qh_checkpolygon): f%d has outside points before qh facet_next\n", - facet->id); - qh_errexit(qh_ERRqhull, facet, NULL); + ) { + qh_fprintf(qh ferr, 6137, "qhull internal error (qh_checkpolygon): f%d has outside points before qh.facet_next f%d\n", + facet->id, getid_(qh facet_next)); + qh_errexit2(qh_ERRqhull, facet, qh facet_next); } } } numfacets++; qh_checkfacet(facet, False, &waserror); + }else if (facet->visible && qh NEWfacets) { + if (!SETempty_(facet->neighbors) || !SETempty_(facet->ridges)) { + qh_fprintf(qh ferr, 6376, "qhull internal error (qh_checkpolygon): expecting empty f.neighbors and f.ridges for visible facet f%d. Got %d neighbors and %d ridges\n", + facet->id, qh_setsize(facet->neighbors), qh_setsize(facet->ridges)); + qh_errexit(qh_ERRqhull, facet, NULL); + } } } - if (qh visible_list && !visibleseen && facetlist == qh facet_list) { - qh_fprintf(qh ferr, 6138, "qhull internal error (qh_checkpolygon): visible list f%d no longer on facet list\n", qh visible_list->id); - qh_printlists(); - qh_errexit(qh_ERRqhull, qh visible_list, NULL); - } - if (facetlist == qh facet_list) + if (facetlist == qh facet_list) { vertexlist= qh vertex_list; - else if (facetlist == qh newfacet_list) + }else if (facetlist == qh newfacet_list) { vertexlist= qh newvertex_list; - else + }else { vertexlist= NULL; + } FORALLvertex_(vertexlist) { + qh_checkvertex(vertex, !qh_ALL, &waserror); + if(vertex == qh newvertex_list) + newvertexseen= True; vertex->seen= False; vertex->visitid= 0; + if(vertex->newfacet && !newvertexseen && !vertex->deleted) { + qh_fprintf(qh ferr, 6288, "qhull internal error (qh_checkpolygon): v%d is 'newfacet' but it is not on new vertex list v%d\n", vertex->id, getid_(qh newvertex_list)); + qh_errexit(qh_ERRqhull, qh visible_list, NULL); + } } FORALLfacet_(facetlist) { if (facet->visible) @@ -953,17 +1313,56 @@ qh vertex_visit++; if (qh VERTEXneighbors) { FORALLvertices { + if (!vertex->neighbors) { + qh_fprintf(qh ferr, 6407, "qhull internal error (qh_checkpolygon): missing vertex neighbors for v%d\n", vertex->id); + waserror= True; + } qh_setcheck(vertex->neighbors, "neighbors for v", vertex->id); if (vertex->deleted) continue; totvneighbors += qh_setsize(vertex->neighbors); } - FORALLfacet_(facetlist) - totvertices += qh_setsize(facet->vertices); - if (totvneighbors != totvertices) { - qh_fprintf(qh ferr, 6141, "qhull internal error (qh_checkpolygon): vertex neighbors inconsistent. Totvneighbors %d, totvertices %d\n", - totvneighbors, totvertices); + FORALLfacet_(facetlist) { + if (!facet->visible) + totfacetvertices += qh_setsize(facet->vertices); + } + if (totvneighbors != totfacetvertices) { + qh_fprintf(qh ferr, 6141, "qhull internal error (qh_checkpolygon): vertex neighbors inconsistent (tot_vneighbors %d != tot_facetvertices %d). Maybe duplicate or missing vertex\n", + totvneighbors, totfacetvertices); waserror= True; + FORALLvertices { + if (vertex->deleted) + continue; + qh visit_id++; + FOREACHneighbor_(vertex) { + if (neighbor->visitid==qh visit_id) { + qh_fprintf(qh ferr, 6275, "qhull internal error (qh_checkpolygon): facet f%d occurs twice in neighbors of vertex v%d\n", + neighbor->id, vertex->id); + errorfacet2= errorfacet; + errorfacet= neighbor; + } + neighbor->visitid= qh visit_id; + if (!qh_setin(neighbor->vertices, vertex)) { + qh_fprintf(qh ferr, 6276, "qhull internal error (qh_checkpolygon): facet f%d is a neighbor of vertex v%d but v%d is not a vertex of f%d\n", + neighbor->id, vertex->id, vertex->id, neighbor->id); + errorfacet2= errorfacet; + errorfacet= neighbor; + } + } + } + FORALLfacet_(facetlist){ + if (!facet->visible) { + /* vertices are inverse sorted and are unlikely to be duplicated */ + FOREACHvertex_(facet->vertices){ + if (!qh_setin(vertex->neighbors, facet)) { + qh_fprintf(qh ferr, 6277, "qhull internal error (qh_checkpolygon): v%d is a vertex of facet f%d but f%d is not a neighbor of v%d\n", + vertex->id, facet->id, facet->id, vertex->id); + errorfacet2= errorfacet; + errorfacet= facet; + } + } + } + } } } if (numvertices != qh num_vertices - qh_setsize(qh del_vertices)) { @@ -977,28 +1376,31 @@ waserror= True; } if (qh hull_dim == 3 && numvertices + numfacets - numridges/2 != 2) { - qh_fprintf(qh ferr, 7063, "qhull warning: #vertices %d + #facets %d - #edges %d != 2\n\ - A vertex appears twice in a edge list. May occur during merging.", - numvertices, numfacets, numridges/2); + qh_fprintf(qh ferr, 7063, "qhull warning: #vertices %d + #facets %d - #edges %d != 2. A vertex appears twice in a edge list. May occur during merging.\n", + numvertices, numfacets, numridges/2); /* occurs if lots of merging and a vertex ends up twice in an edge list. e.g., RBOX 1000 s W1e-13 t995849315 D2 | QHULL d Tc Tv */ } } if (waserror) - qh_errexit(qh_ERRqhull, NULL, NULL); + qh_errexit2(qh_ERRqhull, errorfacet, errorfacet2); } /* checkpolygon */ /*--------------------------------- - qh_checkvertex( vertex ) + qh_checkvertex( vertex, allchecks, &waserror ) check vertex for consistency - checks vertex->neighbors + if allchecks, checks vertex->neighbors + + returns: + sets waserror if any error occurs notes: - neighbors checked efficiently in checkpolygon + called by qh_tracemerge and qh_checkpolygon + neighbors checked efficiently in qh_checkpolygon */ -void qh_checkvertex(vertexT *vertex) { +void qh_checkvertex(vertexT *vertex, boolT allchecks, boolT *waserrorp) { boolT waserror= False; facetT *neighbor, **neighborp, *errfacet=NULL; @@ -1007,10 +1409,14 @@ waserror= True; } if (vertex->id >= qh vertex_id) { - qh_fprintf(qh ferr, 6145, "qhull internal error (qh_checkvertex): unknown vertex id %d\n", vertex->id); + qh_fprintf(qh ferr, 6145, "qhull internal error (qh_checkvertex): unknown vertex id v%d >= qh.vertex_id (%d)\n", vertex->id, qh vertex_id); waserror= True; } - if (!waserror && !vertex->deleted) { + if (vertex->visitid > qh vertex_visit) { + qh_fprintf(qh ferr, 6413, "qhull internal error (qh_checkvertex): expecting v%d.visitid <= qh.vertex_visit (%d). Got visitid %d\n", vertex->id, qh vertex_visit, vertex->visitid); + waserror= True; + } + if (allchecks && !waserror && !vertex->deleted) { if (qh_setsize(vertex->neighbors)) { FOREACHneighbor_(vertex) { if (!qh_setin(neighbor->vertices, vertex)) { @@ -1023,7 +1429,9 @@ } if (waserror) { qh_errprint("ERRONEOUS", NULL, NULL, NULL, vertex); - qh_errexit(qh_ERRqhull, errfacet, NULL); + if (errfacet) + qh_errexit(qh_ERRqhull, errfacet, NULL); + *waserrorp= True; } } /* checkvertex */ @@ -1069,31 +1477,28 @@ returns: initializes qh.facet_list to the simplex - initializes qh.newfacet_list, .facet_tail - initializes qh.vertex_list, .newvertex_list, .vertex_tail + + notes: + only called by qh_initialhull design: - initializes lists for each vertex create a new facet for each new facet create its neighbor set */ -void qh_createsimplex(setT *vertices) { +void qh_createsimplex(setT *vertices /* qh.facet_list */) { facetT *facet= NULL, *newfacet; boolT toporient= True; int vertex_i, vertex_n, nth; setT *newfacets= qh_settemp(qh hull_dim+1); vertexT *vertex; - qh facet_list= qh newfacet_list= qh facet_tail= qh_newfacet(); - qh num_facets= qh num_vertices= qh num_visible= 0; - qh vertex_list= qh newvertex_list= qh vertex_tail= qh_newvertex(NULL); FOREACHvertex_i_(vertices) { newfacet= qh_newfacet(); - newfacet->vertices= qh_setnew_delnthsorted(vertices, vertex_n, - vertex_i, 0); - newfacet->toporient= (unsigned char)toporient; + newfacet->vertices= qh_setnew_delnthsorted(vertices, vertex_n, vertex_i, 0); + if (toporient) + newfacet->toporient= True; qh_appendfacet(newfacet); newfacet->newfacet= True; qh_appendvertex(vertex); @@ -1116,23 +1521,19 @@ >-------------------------------- qh_delridge( ridge ) - deletes ridge from data structures it belongs to - frees up its memory + delete a ridge's vertices and frees its memory notes: - in merge.c, caller sets vertex->delridge for each vertex - ridges also freed in qh_freeqhull + assumes r.top->ridges and r.bottom->ridges have been updated */ void qh_delridge(ridgeT *ridge) { - void **freelistp; /* used if !qh_NOmem by qh_memfree_() */ - qh_setdel(ridge->top->ridges, ridge); - qh_setdel(ridge->bottom->ridges, ridge); + if (ridge == qh traceridge) + qh traceridge= NULL; qh_setfree(&(ridge->vertices)); - qh_memfree_(ridge, (int)sizeof(ridgeT), freelistp); + qh_memfree(ridge, (int)sizeof(ridgeT)); } /* delridge */ - /*--------------------------------- @@ -1145,6 +1546,11 @@ */ void qh_delvertex(vertexT *vertex) { + if (vertex->deleted && !vertex->partitioned && !qh NOerrexit) { + qh_fprintf(qh ferr, 6395, "qhull internal error (qh_delvertex): vertex v%d was deleted but it was not partitioned as a coplanar point\n", + vertex->id); + qh_errexit(qh_ERRqhull, NULL, NULL); + } if (vertex == qh tracevertex) qh tracevertex= NULL; qh_removevertex(vertex); @@ -1156,7 +1562,7 @@ /*--------------------------------- - qh_facet3vertex( ) + qh_facet3vertex( ) return temporary set of 3-d vertices in qh_ORIENTclock order design: @@ -1223,9 +1629,13 @@ isoutside set if outside of facet notes: + Distance is measured by distance to the facet's hyperplane. For + Delaunay facets, this is not the same as the containing facet. It may + be an adjacent facet or a different tricoplanar facet. See + locate a facet with qh_findbestfacet() + For tricoplanar facets, this finds one of the tricoplanar facets closest - to the point. For Delaunay triangulations, the point may be inside a - different tricoplanar facet. See locate a facet with qh_findbestfacet() + to the point. If inside, qh_findbestfacet performs an exhaustive search this may be too conservative. Sometimes it is clearly required. @@ -1245,7 +1655,7 @@ bestoutside, !qh_ISnewfacets, bestoutside /* qh_NOupper */, bestdist, isoutside, &totpart); if (*bestdist < -qh DISTround) { - bestfacet= qh_findfacet_all(point, bestdist, isoutside, &numpart); + bestfacet= qh_findfacet_all(point, !qh_NOupper, bestdist, isoutside, &numpart); totpart += numpart; if ((isoutside && *isoutside && bestoutside) || (isoutside && !*isoutside && bestfacet->upperdelaunay)) { @@ -1256,7 +1666,7 @@ } } trace3((qh ferr, 3014, "qh_findbestfacet: f%d dist %2.2g isoutside %d totpart %d\n", - bestfacet->id, *bestdist, (isoutside ? *isoutside : UINT_MAX), totpart)); + bestfacet->id, *bestdist, (isoutside ? *isoutside : UINT_MAX), totpart)); return bestfacet; } /* findbestfacet */ @@ -1271,8 +1681,8 @@ returns bestdist and updates numpart notes: - if Delaunay and inside, point is outside of circumsphere of bestfacet called by qh_findbest() for points above an upperdelaunay facet + if Delaunay and inside, point is outside of circumsphere of bestfacet */ facetT *qh_findbestlower(facetT *upperfacet, pointT *point, realT *bestdistp, int *numpart) { @@ -1316,7 +1726,7 @@ trace3((qh ferr, 3025, "qh_findbestlower: all neighbors of facet %d are flipped or upper Delaunay. Search all facets\n", upperfacet->id)); /* rarely called */ - bestfacet= qh_findfacet_all(point, &bestdist, &isoutside, numpart); + bestfacet= qh_findfacet_all(point, qh_NOupper, &bestdist, &isoutside, numpart); } *bestdistp= bestdist; trace3((qh ferr, 3015, "qh_findbestlower: f%d dist %2.2g for f%d p%d\n", @@ -1327,8 +1737,9 @@ /*--------------------------------- - qh_findfacet_all( point, bestdist, isoutside, numpart ) + qh_findfacet_all( point, noupper, bestdist, isoutside, numpart ) exhaustive search for facet below a point + ignore flipped and visible facets, f.normal==NULL, and if noupper, f.upperdelaunay facets for Delaunay triangulations, Use qh_setdelaunay() to lift point to paraboloid and scale by 'Qbb' if needed @@ -1343,9 +1754,10 @@ number of distance tests notes: - primarily for library users, rarely used by Qhull + called by qh_findbestlower if all neighbors are flipped or upper Delaunay (QH3025) + primarily for library users (qh_findbestfacet), rarely used by Qhull */ -facetT *qh_findfacet_all(pointT *point, realT *bestdist, boolT *isoutside, +facetT *qh_findfacet_all(pointT *point, boolT noupper, realT *bestdist, boolT *isoutside, int *numpart) { facetT *bestfacet= NULL, *facet; realT dist; @@ -1354,7 +1766,9 @@ *bestdist= -REALmax; *isoutside= False; FORALLfacets { - if (facet->flipped || !facet->normal) + if (facet->flipped || !facet->normal || facet->visible) + continue; + if (noupper && facet->upperdelaunay) continue; totpart++; qh_distplane(point, facet, &dist); @@ -1368,8 +1782,8 @@ } } *numpart= totpart; - trace3((qh ferr, 3016, "qh_findfacet_all: f%d dist %2.2g isoutside %d totpart %d\n", - getid_(bestfacet), *bestdist, *isoutside, totpart)); + trace3((qh ferr, 3016, "qh_findfacet_all: p%d, noupper? %d, f%d, dist %2.2g, isoutside %d, totpart %d\n", + qh_pointid(point), noupper, getid_(bestfacet), *bestdist, *isoutside, totpart)); return bestfacet; } /* findfacet_all */ @@ -1377,17 +1791,17 @@ >-------------------------------- qh_findgood( facetlist, goodhorizon ) - identify good facets for qh.PRINTgood - if qh.GOODvertex>0 + identify good facets for qh.PRINTgood and qh_buildcone_onlygood + goodhorizon is count of good, horizon facets from qh_find_horizon, otherwise 0 from qh_findgood_all + if not qh.MERGING and qh.GOODvertex>0 facet includes point as vertex if !match, returns goodhorizon - inactive if qh.MERGING if qh.GOODpoint facet is visible or coplanar (>0) or not visible (<0) if qh.GOODthreshold facet->normal matches threshold if !goodhorizon and !match, - selects facet with closest angle + selects facet with closest angle to thresholds sets GOODclosest returns: @@ -1396,14 +1810,16 @@ may update qh.GOODclosest notes: - qh_findgood_all further reduces the good region + called from qh_initbuild, qh_buildcone_onlygood, and qh_findgood_all + qh_findgood_all (called from qh_prepare_output) further reduces the good region design: count good facets - mark good facets for qh.GOODpoint - mark good facets for qh.GOODthreshold - if necessary - update qh.GOODclosest + if not merging, clear good facets that fail qh.GOODvertex ('QVn', but not 'QV-n') + clear good facets that fail qh.GOODpoint ('QGn' or 'QG-n') + clear good facets that fail qh.GOODthreshold + if !goodhorizon and !find f.good, + sets GOODclosest to facet with closest angle to thresholds */ int qh_findgood(facetT *facetlist, int goodhorizon) { facetT *facet, *bestfacet= NULL; @@ -1416,7 +1832,7 @@ } if (qh GOODvertex>0 && !qh MERGING) { FORALLfacet_(facetlist) { - if (!qh_isvertex(qh GOODvertexp, facet->vertices)) { + if (facet->good && !qh_isvertex(qh GOODvertexp, facet->vertices)) { facet->good= False; numgood--; } @@ -1447,7 +1863,7 @@ } } } - if (!numgood && (!goodhorizon || qh GOODclosest)) { + if (numgood == 0 && (goodhorizon == 0 || qh GOODclosest)) { if (qh GOODclosest) { if (qh GOODclosest->visible) qh GOODclosest= NULL; @@ -1457,7 +1873,7 @@ bestfacet= qh GOODclosest; } } - if (bestfacet && bestfacet != qh GOODclosest) { + if (bestfacet && bestfacet != qh GOODclosest) { /* numgood == 0 */ if (qh GOODclosest) qh GOODclosest->good= False; qh GOODclosest= bestfacet; @@ -1473,8 +1889,8 @@ } } zadd_(Zgoodfacet, numgood); - trace2((qh ferr, 2045, "qh_findgood: found %d good facets with %d good horizon\n", - numgood, goodhorizon)); + trace2((qh ferr, 2045, "qh_findgood: found %d good facets with %d good horizon and qh.GOODclosest f%d\n", + numgood, goodhorizon, getid_(qh GOODclosest))); if (!numgood && qh GOODvertex>0 && !qh MERGING) return goodhorizon; return numgood; @@ -1488,7 +1904,7 @@ if qh.GOODvertex facet includes (>0) or doesn't include (<0) point as vertex if last good facet and ONLYgood, prints warning and continues - if qh.SPLITthresholds + if qh.SPLITthresholds (e.g., qh.DELAUNAY) facet->normal matches threshold, or if none, the closest one calls qh_findgood nop if good not used @@ -1498,12 +1914,14 @@ sets qh.num_good notes: - this is like qh_findgood but more restrictive + called by qh_prepare_output and qh_printneighborhood + unless qh.ONLYgood, calls qh_findgood first design: uses qh_findgood to mark good facets - marks facets for qh.GOODvertex - marks facets for qh.SPLITthreholds + clear f.good for failed qh.GOODvertex + clear f.good for failed qh.SPLITthreholds + if no more good facets, select best of qh.SPLITthresholds */ void qh_findgood_all(facetT *facetlist) { facetT *facet, *bestfacet=NULL; @@ -1521,7 +1939,7 @@ } if (qh GOODvertex <0 || (qh GOODvertex > 0 && qh MERGING)) { FORALLfacet_(facetlist) { - if (facet->good && ((qh GOODvertex > 0) ^ !!qh_isvertex(qh GOODvertexp, facet->vertices))) { + if (facet->good && ((qh GOODvertex > 0) ^ !!qh_isvertex(qh GOODvertexp, facet->vertices))) { /* convert to bool */ if (!--numgood) { if (qh ONLYgood) { qh_fprintf(qh ferr, 7064, "qhull warning: good vertex p%d does not match last good facet f%d. Ignored.\n", @@ -1555,11 +1973,17 @@ if (!numgood && bestfacet) { bestfacet->good= True; numgood++; - trace0((qh ferr, 23, "qh_findgood_all: f%d is closest(%2.2g) to thresholds\n", + trace0((qh ferr, 23, "qh_findgood_all: f%d is closest(%2.2g) to split thresholds\n", bestfacet->id, bestangle)); return; } } + if (numgood == 1 && !qh PRINTgood && qh GOODclosest && qh GOODclosest->good) { + trace2((qh ferr, 2109, "qh_findgood_all: undo selection of qh.GOODclosest f%d since it would fail qh_inthresholds in qh_skipfacet\n", + qh GOODclosest->id)); + qh GOODclosest->good= False; + numgood= 0; + } qh num_good= numgood; trace0((qh ferr, 24, "qh_findgood_all: %d good facets remain out of %d facets\n", numgood, startgood)); @@ -1583,7 +2007,7 @@ if (facet->outsideset) { #if qh_COMPUTEfurthest pointT *furthest; - furthest= (pointT*)qh_setlast(facet->outsideset); + furthest= (pointT *)qh_setlast(facet->outsideset); zinc_(Zcomputefurthest); qh_distplane(furthest, facet, &dist); #else @@ -1651,7 +2075,7 @@ */ void qh_infiniteloop(facetT *facet) { - qh_fprintf(qh ferr, 6149, "qhull internal error (qh_infiniteloop): potential infinite loop detected\n"); + qh_fprintf(qh ferr, 6149, "qhull internal error (qh_infiniteloop): potential infinite loop detected. If visible, f.replace. If newfacet, f.samecycle\n"); qh_errexit(qh_ERRqhull, facet, NULL); } /* qh_infiniteloop */ @@ -1673,6 +2097,9 @@ initialize global variables used during qh_buildhull determine precision constants and points with max/min coordinate values if qh.SCALElast, scale last coordinate(for 'd') + initialize qh.newfacet_list, qh.facet_tail + initialize qh.vertex_list, qh.newvertex_list, qh.vertex_tail + determine initial vertices build initial simplex partition input points into facets of initial simplex set up lists @@ -1680,15 +2107,24 @@ check consistency add qh.GOODvertex if defined */ -void qh_initbuild( void) { +void qh_initbuild(void) { setT *maxpoints, *vertices; facetT *facet; int i, numpart; realT dist; boolT isoutside; + if (qh PRINTstatistics) { + qh_fprintf(qh ferr, 9350, "qhull %s Statistics: %s | %s\n", + qh_version, qh rbox_command, qh qhull_command); + fflush(NULL); + } qh furthest_id= qh_IDunknown; qh lastreport= 0; + qh lastfacets= 0; + qh lastmerges= 0; + qh lastplanes= 0; + qh lastdist= 0; qh facet_id= qh vertex_id= qh ridge_id= 0; qh visit_id= qh vertex_visit= 0; qh maxoutdone= False; @@ -1704,17 +2140,16 @@ if ((qh GOODpoint && (qh GOODpointp < qh first_point /* also catches !GOODpointp */ || qh GOODpointp > qh_point(qh num_points-1))) - || (qh GOODvertex - && (qh GOODvertexp < qh first_point /* also catches !GOODvertexp */ - || qh GOODvertexp > qh_point(qh num_points-1)))) { + || (qh GOODvertex + && (qh GOODvertexp < qh first_point /* also catches !GOODvertexp */ + || qh GOODvertexp > qh_point(qh num_points-1)))) { qh_fprintf(qh ferr, 6150, "qhull input error: either QGn or QVn point is > p%d\n", qh num_points-1); qh_errexit(qh_ERRinput, NULL, NULL); } maxpoints= qh_maxmin(qh first_point, qh num_points, qh hull_dim); if (qh SCALElast) - qh_scalelast(qh first_point, qh num_points, qh hull_dim, - qh MINlastcoord, qh MAXlastcoord, qh MAXwidth); + qh_scalelast(qh first_point, qh num_points, qh hull_dim, qh MINlastcoord, qh MAXlastcoord, qh MAXabs_coord); qh_detroundoff(); if (qh DELAUNAY && qh upper_threshold[qh hull_dim-1] > REALmax/2 && qh lower_threshold[qh hull_dim-1] < -REALmax/2) { @@ -1735,21 +2170,25 @@ } } } + trace4((qh ferr, 4091, "qh_initbuild: create sentinels for qh.facet_tail and qh.vertex_tail\n")); + qh facet_list= qh newfacet_list= qh facet_tail= qh_newfacet(); + qh num_facets= qh num_vertices= qh num_visible= 0; + qh vertex_list= qh newvertex_list= qh vertex_tail= qh_newvertex(NULL); vertices= qh_initialvertices(qh hull_dim, maxpoints, qh first_point, qh num_points); qh_initialhull(vertices); /* initial qh facet_list */ qh_partitionall(vertices, qh first_point, qh num_points); if (qh PRINToptions1st || qh TRACElevel || qh IStracing) { if (qh TRACElevel || qh IStracing) - qh_fprintf(qh ferr, 8103, "\nTrace level %d for %s | %s\n", - qh IStracing ? qh IStracing : qh TRACElevel, qh rbox_command, qh qhull_command); + qh_fprintf(qh ferr, 8103, "\nTrace level T%d, IStracing %d, point TP%d, merge TM%d, dist TW%2.2g, qh.tracefacet_id %d, traceridge_id %d, tracevertex_id %d, last qh.RERUN %d, %s | %s\n", + qh TRACElevel, qh IStracing, qh TRACEpoint, qh TRACEmerge, qh TRACEdist, qh tracefacet_id, qh traceridge_id, qh tracevertex_id, qh TRACElastrun, qh rbox_command, qh qhull_command); qh_fprintf(qh ferr, 8104, "Options selected for Qhull %s:\n%s\n", qh_version, qh qhull_options); } - qh_resetlists(False, qh_RESETvisible /*qh.visible_list newvertex_list newfacet_list */); + qh_resetlists(False, qh_RESETvisible /* qh.visible_list newvertex_list qh.newfacet_list */); qh facet_next= qh facet_list; qh_furthestnext(/* qh.facet_list */); if (qh PREmerge) { qh cos_max= qh premerge_cos; - qh centrum_radius= qh premerge_centrum; + qh centrum_radius= qh premerge_centrum; /* overwritten by qh_premerge */ } if (qh ONLYgood) { if (qh GOODvertex > 0 && qh MERGING) { @@ -1758,12 +2197,11 @@ } if (!(qh GOODthreshold || qh GOODpoint || (!qh MERGEexact && !qh PREmerge && qh GOODvertexp))) { - qh_fprintf(qh ferr, 6152, "qhull input error: 'Qg' (ONLYgood) needs a good threshold('Pd0D0'), a\n\ -good point(QGn or QG-n), or a good vertex with 'QJ' or 'Q0' (QVn).\n"); + qh_fprintf(qh ferr, 6152, "qhull input error: 'Qg' (ONLYgood) needs a good threshold('Pd0D0'), a good point(QGn or QG-n), or a good vertex with 'QJ' or 'Q0' (QVn).\n"); qh_errexit(qh_ERRinput, NULL, NULL); } if (qh GOODvertex > 0 && !qh MERGING /* matches qh_partitionall */ - && !qh_isvertex(qh GOODvertexp, vertices)) { + && !qh_isvertex(qh GOODvertexp, vertices)) { facet= qh_findbestnew(qh GOODvertexp, qh facet_list, &dist, !qh_ALL, &isoutside, &numpart); zadd_(Zdistgood, numpart); @@ -1791,6 +2229,9 @@ qh_initialhull( vertices ) constructs the initial hull as a DIM3 simplex of vertices + notes: + only called by qh_initbuild + design: creates a simplex (initializes lists) determines orientation of simplex @@ -1801,49 +2242,68 @@ */ void qh_initialhull(setT *vertices) { facetT *facet, *firstfacet, *neighbor, **neighborp; - realT dist, angle, minangle= REALmax; -#ifndef qh_NOtrace - int k; -#endif + realT angle, minangle= REALmax, dist; - qh_createsimplex(vertices); /* qh.facet_list */ + qh_createsimplex(vertices /* qh.facet_list */); qh_resetlists(False, qh_RESETvisible); qh facet_next= qh facet_list; /* advance facet when processed */ qh interior_point= qh_getcenter(vertices); + if (qh IStracing) { + qh_fprintf(qh ferr, 8105, "qh_initialhull: "); + qh_printpoint(qh ferr, "qh.interior_point", qh interior_point); + } firstfacet= qh facet_list; - qh_setfacetplane(firstfacet); - zinc_(Znumvisibility); /* needs to be in printsummary */ + qh_setfacetplane(firstfacet); /* qh_joggle_restart if flipped */ + if (firstfacet->flipped) { + trace1((qh ferr, 1065, "qh_initialhull: ignore f%d flipped. Test qh.interior_point (p-2) for clearly flipped\n", firstfacet->id)); + firstfacet->flipped= False; + } + zzinc_(Zdistcheck); qh_distplane(qh interior_point, firstfacet, &dist); - if (dist > 0) { + if (dist > qh DISTround) { /* clearly flipped */ + trace1((qh ferr, 1060, "qh_initialhull: initial orientation incorrect, qh.interior_point is %2.2g from f%d. Reversing orientation of all facets\n", + dist, firstfacet->id)); FORALLfacets facet->toporient ^= (unsigned char)True; + qh_setfacetplane(firstfacet); } - FORALLfacets - qh_setfacetplane(facet); FORALLfacets { - if (!qh_checkflipped(facet, NULL, qh_ALL)) {/* due to axis-parallel facet */ - trace1((qh ferr, 1031, "qh_initialhull: initial orientation incorrect. Correct all facets\n")); + if (facet != firstfacet) + qh_setfacetplane(facet); /* qh_joggle_restart if flipped */ + } + FORALLfacets { + if (facet->flipped) { + trace1((qh ferr, 1066, "qh_initialhull: ignore f%d flipped. Test qh.interior_point (p-2) for clearly flipped\n", facet->id)); facet->flipped= False; - FORALLfacets { + } + zzinc_(Zdistcheck); + qh_distplane(qh interior_point, facet, &dist); /* duplicates qh_setfacetplane */ + if (dist > qh DISTround) { /* clearly flipped, due to axis-parallel facet or coplanar firstfacet */ + trace1((qh ferr, 1031, "qh_initialhull: initial orientation incorrect, qh.interior_point is %2.2g from f%d. Either axis-parallel facet or coplanar firstfacet f%d. Force outside orientation of all facets\n")); + FORALLfacets { /* reuse facet, then 'break' */ + facet->flipped= False; facet->toporient ^= (unsigned char)True; - qh_orientoutside(facet); + qh_orientoutside(facet); /* force outside orientation for f.normal */ } break; } } FORALLfacets { - if (!qh_checkflipped(facet, NULL, !qh_ALL)) { /* can happen with 'R0.1' */ + if (!qh_checkflipped(facet, NULL, qh_ALL)) { if (qh DELAUNAY && ! qh ATinfinity) { + qh_joggle_restart("initial Delaunay cocircular or cospherical"); if (qh UPPERdelaunay) - qh_fprintf(qh ferr, 6240, "Qhull precision error: Initial simplex is cocircular or cospherical. Option 'Qs' searches all points. Can not compute the upper Delaunay triangulation or upper Voronoi diagram of cocircular/cospherical points.\n"); + qh_fprintf(qh ferr, 6240, "Qhull precision error: initial Delaunay input sites are cocircular or cospherical. Option 'Qs' searches all points. Use option 'QJ' to joggle the input, otherwise cannot compute the upper Delaunay triangulation or upper Voronoi diagram of cocircular/cospherical points.\n"); else - qh_fprintf(qh ferr, 6239, "Qhull precision error: Initial simplex is cocircular or cospherical. Use option 'Qz' for the Delaunay triangulation or Voronoi diagram of cocircular/cospherical points. Option 'Qz' adds a point \"at infinity\". Use option 'Qs' to search all points for the initial simplex.\n"); + qh_fprintf(qh ferr, 6239, "Qhull precision error: initial Delaunay input sites are cocircular or cospherical. Use option 'Qz' for the Delaunay triangulation or Voronoi diagram of cocircular/cospherical points; it adds a point \"at infinity\". Alternatively use option 'QJ' to joggle the input. Use option 'Qs' to search all points for the initial simplex.\n"); + qh_printvertexlist(qh ferr, "\ninput sites with last coordinate projected to a paraboloid\n", qh facet_list, NULL, qh_ALL); qh_errexit(qh_ERRinput, NULL, NULL); + }else { + qh_joggle_restart("initial simplex is flat"); + qh_fprintf(qh ferr, 6154, "Qhull precision error: Initial simplex is flat (facet %d is coplanar with the interior point)\n", + facet->id); + qh_errexit(qh_ERRsingular, NULL, NULL); /* calls qh_printhelp_singular */ } - qh_precision("initial simplex is flat"); - qh_fprintf(qh ferr, 6154, "Qhull precision error: Initial simplex is flat (facet %d is coplanar with the interior point)\n", - facet->id); - qh_errexit(qh_ERRsingular, NULL, NULL); /* calls qh_printhelp_singular */ } FOREACHneighbor_(facet) { angle= qh_getangle(facet->normal, neighbor->normal); @@ -1860,15 +2320,10 @@ } zzval_(Zprocessed)= qh hull_dim+1; qh_checkpolygon(qh facet_list); - qh_checkconvex(qh facet_list, qh_DATAfault); -#ifndef qh_NOtrace + qh_checkconvex(qh facet_list, qh_DATAfault); if (qh IStracing >= 1) { - qh_fprintf(qh ferr, 8105, "qh_initialhull: simplex constructed, interior point:"); - for (k=0; k < qh hull_dim; k++) - qh_fprintf(qh ferr, 8106, " %6.4g", qh interior_point[k]); - qh_fprintf(qh ferr, 8107, "\n"); + qh_fprintf(qh ferr, 8105, "qh_initialhull: simplex constructed\n"); } -#endif } /* initialhull */ /*-= dim) /* qh_maxsimplex for last point */ + break; + if (point_i & 0x1) { /* first try up to dim, max. coord. points */ if (!qh_setin(simplex, point) && !qh_setin(tested, point)){ qh_detsimplex(point, simplex, k, &nearzero); if (nearzero) qh_setappend(&tested, point); else { qh_setappend(&simplex, point); - if (++k == dim) /* use search for last point */ - break; + k++; } } } } - while (k != dim && (point= (pointT*)qh_setdellast(maxpoints))) { - if (!qh_setin(simplex, point) && !qh_setin(tested, point)){ - qh_detsimplex(point, simplex, k, &nearzero); - if (nearzero) - qh_setappend(&tested, point); - else { - qh_setappend(&simplex, point); - k++; + FOREACHpoint_i_(maxpoints) { + if (k >= dim) /* qh_maxsimplex for last point */ + break; + if ((point_i & 0x1) == 0) { /* then test min. coord points */ + if (!qh_setin(simplex, point) && !qh_setin(tested, point)){ + qh_detsimplex(point, simplex, k, &nearzero); + if (nearzero) + qh_setappend(&tested, point); + else { + qh_setappend(&simplex, point); + k++; + } } } } + /* remove tested points from maxpoints */ + FOREACHpoint_i_(maxpoints) { + if (qh_setin(simplex, point) || qh_setin(tested, point)) + SETelem_(maxpoints, point_i)= NULL; + } + qh_setcompact(maxpoints); idx= 0; - while (k != dim && (point= qh_point(idx++))) { + while (k < dim && (point= qh_point(idx++))) { if (!qh_setin(simplex, point) && !qh_setin(tested, point)){ qh_detsimplex(point, simplex, k, &nearzero); if (!nearzero){ @@ -1954,7 +2421,7 @@ } qh_settempfree(&tested); qh_maxsimplex(dim, maxpoints, points, numpoints, &simplex); - }else + }else /* qh.hull_dim < qh_INITIALmax */ qh_maxsimplex(dim, maxpoints, points, numpoints, &simplex); FOREACHpoint_(simplex) qh_setaddnth(&vertices, 0, qh_newvertex(point)); /* descending order */ @@ -1989,10 +2456,11 @@ make new facets from point and qh.visible_list returns: + apex (point) of the new facets qh.newfacet_list= list of new facets with hyperplanes and ->newfacet - qh.newvertex_list= list of vertices in new facets with ->newlist set + qh.newvertex_list= list of vertices in new facets with ->newfacet set - if (qh.ONLYgood) + if (qh.NEWtentative) newfacets reference horizon facets, but not vice versa ridges reference non-simplicial horizon ridges, but not vice versa does not change existing facets @@ -2004,9 +2472,9 @@ see also: qh_makenewplanes() -- make hyperplanes for facets - qh_attachnewfacets() -- attachnewfacets if not done here(qh ONLYgood) + qh_attachnewfacets() -- attachnewfacets if not done here qh NEWtentative qh_matchnewfacets() -- match up neighbors - qh_updatevertices() -- update vertex neighbors and delvertices + qh_update_vertexneighbors() -- update vertex neighbors and delvertices qh_deletevisible() -- delete visible facets qh_checkpolygon() --check the result qh_triangulate() -- triangulate a non-simplicial facet @@ -2017,18 +2485,19 @@ update its f.replace clear its neighbor set */ -vertexT *qh_makenewfacets(pointT *point /*visible_list*/) { +vertexT *qh_makenewfacets(pointT *point /* qh.visible_list */) { facetT *visible, *newfacet= NULL, *newfacet2= NULL, *neighbor, **neighborp; vertexT *apex; int numnew=0; + if (qh CHECKfrequently) { + qh_checkdelridge(); + } qh newfacet_list= qh facet_tail; qh newvertex_list= qh vertex_tail; apex= qh_newvertex(point); qh_appendvertex(apex); qh visit_id++; - if (!qh ONLYgood) - qh NEWfacets= True; FORALLvisible_facets { FOREACHneighbor_(visible) neighbor->seen= False; @@ -2038,139 +2507,262 @@ } if (visible->simplicial) newfacet= qh_makenew_simplicial(visible, apex, &numnew); - if (!qh ONLYgood) { + if (!qh NEWtentative) { if (newfacet2) /* newfacet is null if all ridges defined */ newfacet= newfacet2; if (newfacet) visible->f.replace= newfacet; else zinc_(Zinsidevisible); + if (visible->ridges) /* ridges and neighbors are no longer valid for visible facet */ + SETfirst_(visible->ridges)= NULL; SETfirst_(visible->neighbors)= NULL; } } - trace1((qh ferr, 1032, "qh_makenewfacets: created %d new facets from point p%d to horizon\n", - numnew, qh_pointid(point))); + if (!qh NEWtentative) + qh NEWfacets= True; + trace1((qh ferr, 1032, "qh_makenewfacets: created %d new facets f%d..f%d from point p%d to horizon\n", + numnew, qh first_newfacet, qh facet_id-1, qh_pointid(point))); if (qh IStracing >= 4) qh_printfacetlist(qh newfacet_list, NULL, qh_ALL); return apex; } /* makenewfacets */ +#ifndef qh_NOmerge /*--------------------------------- + >-------------------------------- - qh_matchduplicates( atfacet, atskip, hashsize, hashcount ) - match duplicate ridges in qh.hash_table for atfacet/atskip + qh_matchdupridge( atfacet, atskip, hashsize, hashcount ) + match duplicate ridges in qh.hash_table for atfacet@atskip duplicates marked with ->dupridge and qh_DUPLICATEridge returns: - picks match with worst merge (min distance apart) + vertex-facet distance (>0.0) for qh_MERGEridge ridge updates hashcount + set newfacet, facet, matchfacet's hyperplane (removes from mergecycle of coplanarhorizon facets) see also: qh_matchneighbor notes: + only called by qh_matchnewfacets for qh_buildcone and qh_triangulate_facet + assumes atfacet is simplicial + assumes atfacet->neighbors @ atskip == qh_DUPLICATEridge + usually keeps ridge with the widest merge + both MRGdupridge and MRGflipped are required merges -- rbox 100 C1,2e-13 D4 t1 | qhull d Qbb + can merge flipped f11842 skip 3 into f11862 skip 2 and vice versa (forced by goodmatch/goodmatch2) + blocks -- cannot merge f11862 skip 2 and f11863 skip2 (the widest merge) + must block -- can merge f11843 skip 3 into f11842 flipped skip 3, but not vice versa + can merge f11843 skip 3 into f11863 skip 2, but not vice versa + working/unused.h: [jan'19] Dropped qh_matchdupridge_coplanarhorizon, it was the same or slightly worse. Complex addition, rarely occurs design: compute hash value for atfacet and atskip repeat twice -- once to make best matches, once to match the rest for each possible facet in qh.hash_table - if it is a matching facet and pass 2 + if it is a matching facet with the same orientation and pass 2 make match unless tricoplanar, mark match for merging (qh_MERGEridge) [e.g., tricoplanar RBOX s 1000 t993602376 | QHULL C-1e-3 d Qbb FA Qt] - if it is a matching facet and pass 1 + if it is a matching facet with the same orientation and pass 1 test if this is a better match if pass 1, make best match (it will not be merged) + set newfacet, facet, matchfacet's hyperplane (removes from mergecycle of coplanarhorizon facets) + */ -#ifndef qh_NOmerge -void qh_matchduplicates(facetT *atfacet, int atskip, int hashsize, int *hashcount) { - boolT same, ismatch; +coordT qh_matchdupridge(facetT *atfacet, int atskip, int hashsize, int *hashcount) { + boolT same, ismatch, isduplicate= False; int hash, scan; - facetT *facet, *newfacet, *maxmatch= NULL, *maxmatch2= NULL, *nextfacet; - int skip, newskip, nextskip= 0, maxskip= 0, maxskip2= 0, makematch; - realT maxdist= -REALmax, mindist, dist2, low, high; + facetT *facet, *newfacet, *nextfacet; + facetT *maxmatch= NULL, *maxmatch2= NULL, *goodmatch= NULL, *goodmatch2= NULL; + int skip, newskip, nextskip= 0, makematch; + int maxskip= 0, maxskip2= 0, goodskip= 0, goodskip2= 0; + coordT maxdist= -REALmax, maxdist2= 0.0, dupdist, dupdist2, low, high, maxgood, gooddist= 0.0; + maxgood= qh_WIDEdupridge * (qh ONEmerge + qh DISTround); hash= qh_gethash(hashsize, atfacet->vertices, qh hull_dim, 1, SETelem_(atfacet->vertices, atskip)); - trace2((qh ferr, 2046, "qh_matchduplicates: find duplicate matches for f%d skip %d hash %d hashcount %d\n", + trace2((qh ferr, 2046, "qh_matchdupridge: find dupridge matches for f%d skip %d hash %d hashcount %d\n", atfacet->id, atskip, hash, *hashcount)); - for (makematch= 0; makematch < 2; makematch++) { + for (makematch=0; makematch < 2; makematch++) { /* makematch is false on the first pass and 1 on the second */ qh visit_id++; - for (newfacet= atfacet, newskip= atskip; newfacet; newfacet= nextfacet, newskip= nextskip) { + for (newfacet=atfacet, newskip=atskip; newfacet; newfacet= nextfacet, newskip= nextskip) { zinc_(Zhashlookup); - nextfacet= NULL; + nextfacet= NULL; /* exit when ismatch found */ newfacet->visitid= qh visit_id; - for (scan= hash; (facet= SETelemt_(qh hash_table, scan, facetT)); + for (scan=hash; (facet= SETelemt_(qh hash_table, scan, facetT)); scan= (++scan >= hashsize ? 0 : scan)) { if (!facet->dupridge || facet->visitid == qh visit_id) continue; zinc_(Zhashtests); if (qh_matchvertices(1, newfacet->vertices, newskip, facet->vertices, &skip, &same)) { + if (SETelem_(newfacet->vertices, newskip) == SETelem_(facet->vertices, skip)) { + trace3((qh ferr, 3053, "qh_matchdupridge: duplicate ridge due to duplicate facets (f%d skip %d and f%d skip %d) previously reported as QH7084. Maximize dupdist to force vertex merge\n", + newfacet->id, newskip, facet->id, skip)); + isduplicate= True; + } ismatch= (same == (boolT)(newfacet->toporient ^ facet->toporient)); if (SETelemt_(facet->neighbors, skip, facetT) != qh_DUPLICATEridge) { - if (!makematch) { - qh_fprintf(qh ferr, 6155, "qhull internal error (qh_matchduplicates): missing dupridge at f%d skip %d for new f%d skip %d hash %d\n", - facet->id, skip, newfacet->id, newskip, hash); - qh_errexit2(qh_ERRqhull, facet, newfacet); + if (!makematch) { /* occurs if many merges, e.g., rbox 100 W0 C2,1e-13 D6 t1546872462 | qhull C0 Qt Tcv */ + qh_fprintf(qh ferr, 6155, "qhull topology error (qh_matchdupridge): missing qh_DUPLICATEridge at f%d skip %d for new f%d skip %d hash %d ismatch %d. Set by qh_matchneighbor\n", + facet->id, skip, newfacet->id, newskip, hash, ismatch); + qh_errexit2(qh_ERRtopology, facet, newfacet); } - }else if (ismatch && makematch) { - if (SETelemt_(newfacet->neighbors, newskip, facetT) == qh_DUPLICATEridge) { - SETelem_(facet->neighbors, skip)= newfacet; - if (newfacet->tricoplanar) - SETelem_(newfacet->neighbors, newskip)= facet; - else - SETelem_(newfacet->neighbors, newskip)= qh_MERGEridge; - *hashcount -= 2; /* removed two unmatched facets */ - trace4((qh ferr, 4059, "qh_matchduplicates: duplicate f%d skip %d matched with new f%d skip %d merge\n", - facet->id, skip, newfacet->id, newskip)); - } - }else if (ismatch) { - mindist= qh_getdistance(facet, newfacet, &low, &high); - dist2= qh_getdistance(newfacet, facet, &low, &high); - minimize_(mindist, dist2); - if (mindist > maxdist) { - maxdist= mindist; - maxmatch= facet; - maxskip= skip; - maxmatch2= newfacet; - maxskip2= newskip; - } - trace3((qh ferr, 3018, "qh_matchduplicates: duplicate f%d skip %d new f%d skip %d at dist %2.2g, max is now f%d f%d\n", - facet->id, skip, newfacet->id, newskip, mindist, - maxmatch->id, maxmatch2->id)); - }else { /* !ismatch */ + }else if (!ismatch) { nextfacet= facet; nextskip= skip; + }else if (SETelemt_(newfacet->neighbors, newskip, facetT) == qh_DUPLICATEridge) { + if (makematch) { + if (newfacet->tricoplanar) { + SETelem_(facet->neighbors, skip)= newfacet; + SETelem_(newfacet->neighbors, newskip)= facet; + *hashcount -= 2; /* removed two unmatched facets */ + trace2((qh ferr, 2075, "qh_matchdupridge: allow tricoplanar dupridge for new f%d skip %d and f%d skip %d\n", + newfacet->id, newskip, facet->id, skip)); + }else if (goodmatch && goodmatch2) { + SETelem_(goodmatch2->neighbors, goodskip2)= qh_MERGEridge; /* undo selection of goodmatch */ + SETelem_(facet->neighbors, skip)= newfacet; + SETelem_(newfacet->neighbors, newskip)= facet; + *hashcount -= 2; /* removed two unmatched facets */ + trace2((qh ferr, 2105, "qh_matchdupridge: make good forced merge of dupridge f%d skip %d into f%d skip %d, keep new f%d skip %d and f%d skip %d, dist %4.4g\n", + goodmatch->id, goodskip, goodmatch2->id, goodskip2, newfacet->id, newskip, facet->id, skip, gooddist)); + goodmatch2= NULL; + }else { + SETelem_(facet->neighbors, skip)= newfacet; + SETelem_(newfacet->neighbors, newskip)= qh_MERGEridge; /* resolved by qh_mark_dupridges */ + *hashcount -= 2; /* removed two unmatched facets */ + trace3((qh ferr, 3073, "qh_matchdupridge: make forced merge of dupridge for new f%d skip %d and f%d skip %d, maxdist %4.4g in qh_forcedmerges\n", + newfacet->id, newskip, facet->id, skip, maxdist2)); + } + }else { /* !makematch */ + if (!facet->normal) + qh_setfacetplane(facet); /* qh_mergecycle will ignore 'mergehorizon' facets with normals, too many cases otherwise */ + if (!newfacet->normal) + qh_setfacetplane(newfacet); + dupdist= qh_getdistance(facet, newfacet, &low, &high); /* ignore low/high */ + dupdist2= qh_getdistance(newfacet, facet, &low, &high); + if (isduplicate) { + goodmatch= NULL; + minimize_(dupdist, dupdist2); + maxdist= dupdist; + maxdist2= REALmax/2; + maxmatch= facet; + maxskip= skip; + maxmatch2= newfacet; + maxskip2= newskip; + break; /* force maxmatch */ + }else if (facet->flipped && !newfacet->flipped && dupdist < maxgood) { + if (!goodmatch || !goodmatch->flipped || dupdist < gooddist) { + goodmatch= facet; + goodskip= skip; + goodmatch2= newfacet; + goodskip2= newskip; + gooddist= dupdist; + trace3((qh ferr, 3070, "qh_matchdupridge: try good dupridge flipped f%d skip %d into new f%d skip %d at dist %2.2g otherdist %2.2g\n", + goodmatch->id, goodskip, goodmatch2->id, goodskip2, gooddist, dupdist2)); + } + }else if (newfacet->flipped && !facet->flipped && dupdist2 < maxgood) { + if (!goodmatch || !goodmatch->flipped || dupdist2 < gooddist) { + goodmatch= newfacet; + goodskip= newskip; + goodmatch2= facet; + goodskip2= skip; + gooddist= dupdist2; + trace3((qh ferr, 3071, "qh_matchdupridge: try good dupridge flipped new f%d skip %d into f%d skip %d at dist %2.2g otherdist %2.2g\n", + goodmatch->id, goodskip, goodmatch2->id, goodskip2, gooddist, dupdist)); + } + }else if (dupdist < maxgood && (!newfacet->flipped || facet->flipped)) { /* disallow not-flipped->flipped */ + if (!goodmatch || (!goodmatch->flipped && dupdist < gooddist)) { + goodmatch= facet; + goodskip= skip; + goodmatch2= newfacet; + goodskip2= newskip; + gooddist= dupdist; + trace3((qh ferr, 3072, "qh_matchdupridge: try good dupridge f%d skip %d into new f%d skip %d at dist %2.2g otherdist %2.2g\n", + goodmatch->id, goodskip, goodmatch2->id, goodskip2, gooddist, dupdist2)); + } + }else if (dupdist2 < maxgood && (!facet->flipped || newfacet->flipped)) { /* disallow not-flipped->flipped */ + if (!goodmatch || (!goodmatch->flipped && dupdist2 < gooddist)) { + goodmatch= newfacet; + goodskip= newskip; + goodmatch2= facet; + goodskip2= skip; + gooddist= dupdist2; + trace3((qh ferr, 3018, "qh_matchdupridge: try good dupridge new f%d skip %d into f%d skip %d at dist %2.2g otherdist %2.2g\n", + goodmatch->id, goodskip, goodmatch2->id, goodskip2, gooddist, dupdist)); + } + }else if (!goodmatch) { /* otherwise match the furthest apart facets */ + if (!newfacet->flipped || facet->flipped) { + minimize_(dupdist, dupdist2); + } + if (dupdist > maxdist) { /* could keep !flipped->flipped, but probably lost anyway */ + maxdist2= maxdist; + maxdist= dupdist; + maxmatch= facet; + maxskip= skip; + maxmatch2= newfacet; + maxskip2= newskip; + trace3((qh ferr, 3055, "qh_matchdupridge: try furthest dupridge f%d skip %d new f%d skip %d at dist %2.2g\n", + maxmatch->id, maxskip, maxmatch2->id, maxskip2, maxdist)); + }else if (dupdist > maxdist2) + maxdist2= dupdist; + } + } } } - if (makematch && !facet - && SETelemt_(facet->neighbors, skip, facetT) == qh_DUPLICATEridge) { - qh_fprintf(qh ferr, 6156, "qhull internal error (qh_matchduplicates): no MERGEridge match for duplicate f%d skip %d at hash %d\n", - newfacet->id, newskip, hash); - qh_errexit(qh_ERRqhull, newfacet, NULL); - } + } /* end of foreach entry in qh.hash_table starting at 'hash' */ + if (makematch && SETelemt_(newfacet->neighbors, newskip, facetT) == qh_DUPLICATEridge) { + qh_fprintf(qh ferr, 6156, "qhull internal error (qh_matchdupridge): no MERGEridge match for dupridge new f%d skip %d at hash %d..%d\n", + newfacet->id, newskip, hash, scan); + qh_errexit(qh_ERRqhull, newfacet, NULL); } - } /* end of for each new facet at hash */ + } /* end of foreach newfacet at 'hash' */ if (!makematch) { - if (!maxmatch) { - qh_fprintf(qh ferr, 6157, "qhull internal error (qh_matchduplicates): no maximum match at duplicate f%d skip %d at hash %d\n", - atfacet->id, atskip, hash); + if (!maxmatch && !goodmatch) { + qh_fprintf(qh ferr, 6157, "qhull internal error (qh_matchdupridge): no maximum or good match for dupridge new f%d skip %d at hash %d..%d\n", + atfacet->id, atskip, hash, scan); qh_errexit(qh_ERRqhull, atfacet, NULL); } - SETelem_(maxmatch->neighbors, maxskip)= maxmatch2; /* maxmatch!=0 by QH6157 */ - SETelem_(maxmatch2->neighbors, maxskip2)= maxmatch; - *hashcount -= 2; /* removed two unmatched facets */ - zzinc_(Zmultiridge); - trace0((qh ferr, 25, "qh_matchduplicates: duplicate f%d skip %d matched with new f%d skip %d keep\n", - maxmatch->id, maxskip, maxmatch2->id, maxskip2)); - qh_precision("ridge with multiple neighbors"); - if (qh IStracing >= 4) - qh_errprint("DUPLICATED/MATCH", maxmatch, maxmatch2, NULL, NULL); + if (goodmatch) { + SETelem_(goodmatch->neighbors, goodskip)= goodmatch2; + SETelem_(goodmatch2->neighbors, goodskip2)= goodmatch; + *hashcount -= 2; /* removed two unmatched facets */ + if (goodmatch->flipped) { + if (!goodmatch2->flipped) { + zzinc_(Zflipridge); + }else { + zzinc_(Zflipridge2); + /* qh_joggle_restart called by qh_matchneighbor if qh_DUPLICATEridge */ + } + } + /* previously traced */ + }else { + SETelem_(maxmatch->neighbors, maxskip)= maxmatch2; /* maxmatch!=NULL by QH6157 */ + SETelem_(maxmatch2->neighbors, maxskip2)= maxmatch; + *hashcount -= 2; /* removed two unmatched facets */ + zzinc_(Zmultiridge); + /* qh_joggle_restart called by qh_matchneighbor if qh_DUPLICATEridge */ + trace0((qh ferr, 25, "qh_matchdupridge: keep dupridge f%d skip %d and f%d skip %d, dist %4.4g\n", + maxmatch2->id, maxskip2, maxmatch->id, maxskip, maxdist)); + } } } -} /* matchduplicates */ + if (goodmatch) + return gooddist; + return maxdist2; +} /* matchdupridge */ + +#else /* qh_NOmerge */ +coordT qh_matchdupridge(facetT *atfacet, int atskip, int hashsize, int *hashcount) { + QHULL_UNUSED(atfacet) + QHULL_UNUSED(atskip) + QHULL_UNUSED(hashsize) + QHULL_UNUSED(hashcount) + + return 0.0; +} +#endif /* qh_NOmerge */ /*--------------------------------- @@ -2188,7 +2780,8 @@ notes: used for qh.PREmerge and qh.JOGGLEmax - must agree with computation of qh.NEARcoplanar in qh_detroundoff() + must agree with computation of qh.NEARcoplanar in qh_detroundoff + design: if not keeping coplanar or inside points free all coplanar sets @@ -2204,7 +2797,7 @@ if (!qh KEEPcoplanar && !qh KEEPinside) { FORALLfacets { if (facet->coplanarset) - qh_setfree( &facet->coplanarset); + qh_setfree(&facet->coplanarset); } }else if (!qh KEEPcoplanar || !qh KEEPinside) { qh_outerinner(NULL, NULL, &innerplane); @@ -2334,8 +2927,8 @@ memset((char *) vertex, (size_t)0, sizeof(vertexT)); if (qh vertex_id == UINT_MAX) { qh_memfree(vertex, (int)sizeof(vertexT)); - qh_fprintf(qh ferr, 6159, "qhull error: more than 2^32 vertices. vertexT.id field overflows. Vertices would not be sorted correctly.\n"); - qh_errexit(qh_ERRqhull, NULL, NULL); + qh_fprintf(qh ferr, 6159, "qhull error: 2^32 or more vertices. vertexT.id field overflows. Vertices would not be sorted correctly.\n"); + qh_errexit(qh_ERRother, NULL, NULL); } if (qh vertex_id == qh tracevertex_id) qh tracevertex= vertex; @@ -2347,9 +2940,37 @@ } /* newvertex */ /*--------------------------------- + + qh_nextfacet2d( facet, &nextvertex ) + return next facet and vertex for a 2d facet in qh_ORIENTclock order + returns NULL on error + + notes: + in qh_ORIENTclock order (default counter-clockwise) + nextvertex is in between the two facets + does not use qhT or qh_errexit [QhullFacet.cpp] + + design: + see io.c/qh_printextremes_2d +*/ +facetT *qh_nextfacet2d(facetT *facet, vertexT **nextvertexp) { + facetT *nextfacet; + + if (facet->toporient ^ qh_ORIENTclock) { + *nextvertexp= SETfirstt_(facet->vertices, vertexT); + nextfacet= SETfirstt_(facet->neighbors, facetT); + }else { + *nextvertexp= SETsecondt_(facet->vertices, vertexT); + nextfacet= SETsecondt_(facet->neighbors, facetT); + } + return nextfacet; +} /* nextfacet2d */ + +/*--------------------------------- - qh_nextridge3d( atridge, facet, vertex ) + qh_nextridge3d( atridge, facet, &vertex ) return next ridge and vertex for a 3d facet returns NULL on error [for QhullFacet::nextRidge3d] Does not call qh_errexit nor access qh_qh. @@ -2391,14 +3012,34 @@ } return NULL; } /* nextridge3d */ -#else /* qh_NOmerge */ -void qh_matchduplicates(facetT *atfacet, int atskip, int hashsize, int *hashcount) { -} -ridgeT *qh_nextridge3d(ridgeT *atridge, facetT *facet, vertexT **vertexp) { - return NULL; -} -#endif /* qh_NOmerge */ +/*--------------------------------- + + qh_opposite_vertex( facetA, neighbor ) + return the opposite vertex in facetA to neighbor + +*/ +vertexT *qh_opposite_vertex(facetT *facetA, facetT *neighbor) { + vertexT *opposite= NULL; + facetT *facet; + int facet_i, facet_n; + + if (facetA->simplicial) { + FOREACHfacet_i_(facetA->neighbors) { + if (facet == neighbor) { + opposite= SETelemt_(facetA->vertices, facet_i, vertexT); + break; + } + } + } + if (!opposite) { + qh_fprintf(qh ferr, 6396, "qhull internal error (qh_opposite_vertex): opposite vertex in facet f%d to neighbor f%d is not defined. Either is facet is not simplicial or neighbor not found\n", + facetA->id, neighbor->id); + qh_errexit2(qh_ERRqhull, facetA, neighbor); + } + return opposite; +} /* opposite_vertex */ /*--------------------------------- @@ -2426,7 +3067,7 @@ if (qh KEEPcoplanar || qh KEEPnearinside) { qh_distplane(point, facet, &dist); zinc_(Zpartition); - qh_partitioncoplanar(point, facet, &dist); + qh_partitioncoplanar(point, facet, &dist, qh findbestnew); } } qh_setfree(&facet->outsideset); @@ -2440,7 +3081,7 @@ return point for a point id, or NULL if unknown alternative code: - return((pointT *)((unsigned long)qh.first_point + return((pointT *)((unsigned long)qh.first_point + (unsigned long)((id)*qh.normal_size))); */ pointT *qh_point(int id) { @@ -2475,7 +3116,7 @@ qh_fprintf(qh ferr, 7067, "qhull internal warning (point_add): unknown point %p id %d\n", point, id); else if (id >= size) { - qh_fprintf(qh ferr, 6160, "qhull internal errror(point_add): point p%d is out of bounds(%d)\n", + qh_fprintf(qh ferr, 6160, "qhull internal error (point_add): point p%d is out of bounds(%d)\n", id, size); qh_errexit(qh_ERRqhull, NULL, NULL); }else @@ -2489,9 +3130,12 @@ qh_pointfacet() return temporary set of facet for each point the set is indexed by point id + at most one facet per point, arbitrary selection notes: - vertices assigned to one of the facets + each point is assigned to at most one of vertices, coplanarset, or outsideset + unassigned points are interior points or + vertices assigned to one of its facets coplanarset assigned to the facet outside set assigned to the facet NULL if no facet for point (inside) @@ -2507,7 +3151,7 @@ add each coplanar point add each outside point */ -setT *qh_pointfacet(void /*qh.facet_list*/) { +setT *qh_pointfacet(void /* qh.facet_list */) { int numpoints= qh num_points + qh_setsize(qh other_points); setT *facets; facetT *facet; @@ -2535,7 +3179,7 @@ /*--------------------------------- - qh_pointvertex( ) + qh_pointvertex( ) return temporary set of vertices indexed by point id entry is NULL if no vertex for a point this will include qh.GOODpointp @@ -2544,7 +3188,7 @@ FOREACHvertex_i_(vertices) { ... } SETelem_(vertices, i) */ -setT *qh_pointvertex(void /*qh.facet_list*/) { +setT *qh_pointvertex(void /* qh.facet_list */) { int numpoints= qh num_points + qh_setsize(qh other_points); setT *vertices; vertexT *vertex; @@ -2574,7 +3218,6 @@ void qh_prependfacet(facetT *facet, facetT **facetlist) { facetT *prevfacet, *list; - trace4((qh ferr, 4061, "qh_prependfacet: prepend f%d before f%d\n", facet->id, getid_(*facetlist))); if (!*facetlist) @@ -2641,29 +3284,30 @@ } } /* printhashtable */ - /*--------------------------------- - qh_printlists( fp ) - print out facet and vertex list for debugging (without 'f/v' tags) + qh_printlists( ) + print out facet and vertex lists for debugging (without 'f/v' tags) + + notes: + not in I/O to avoid bringing io.c in */ void qh_printlists(void) { facetT *facet; vertexT *vertex; int count= 0; - qh_fprintf(qh ferr, 8108, "qh_printlists: facets:"); - FORALLfacets { + qh_fprintf(qh ferr, 3062, "qh_printlists: max_outside %2.2g all facets:", qh max_outside); + FORALLfacets{ if (++count % 100 == 0) qh_fprintf(qh ferr, 8109, "\n "); qh_fprintf(qh ferr, 8110, " %d", facet->id); } - qh_fprintf(qh ferr, 8111, "\n new facets %d visible facets %d next facet for qh_addpoint %d\n vertices(new %d):", - getid_(qh newfacet_list), getid_(qh visible_list), getid_(qh facet_next), - getid_(qh newvertex_list)); - count = 0; - FORALLvertices { + qh_fprintf(qh ferr, 8111, "\n qh.visible_list f%d, newfacet_list f%d, facet_next f%d for qh_addpoint\n qh.newvertex_list v%d all vertices:", + getid_(qh visible_list), getid_(qh newfacet_list), getid_(qh facet_next), getid_(qh newvertex_list)); + count= 0; + FORALLvertices{ if (++count % 100 == 0) qh_fprintf(qh ferr, 8112, "\n "); qh_fprintf(qh ferr, 8113, " %d", vertex->id); @@ -2672,21 +3316,83 @@ } /* printlists */ /*--------------------------------- + + qh_replacefacetvertex( facet, oldvertex, newvertex ) + replace oldvertex with newvertex in f.vertices + vertices are inverse sorted by vertex->id + + returns: + toporient is flipped if an odd parity, position change + + notes: + for simplicial facets in qh_rename_adjacentvertex + see qh_addfacetvertex +*/ +void qh_replacefacetvertex(facetT *facet, vertexT *oldvertex, vertexT *newvertex) { + vertexT *vertex; + facetT *neighbor; + int vertex_i, vertex_n= 0; + int old_i= -1, new_i= -1; + + trace3((qh ferr, 3038, "qh_replacefacetvertex: replace v%d with v%d in f%d\n", oldvertex->id, newvertex->id, facet->id)); + if (!facet->simplicial) { + qh_fprintf(qh ferr, 6283, "qhull internal error (qh_replacefacetvertex): f%d is not simplicial\n", facet->id); + qh_errexit(qh_ERRqhull, facet, NULL); + } + FOREACHvertex_i_(facet->vertices) { + if (new_i == -1 && vertex->id < newvertex->id) { + new_i= vertex_i; + }else if (vertex->id == newvertex->id) { + qh_fprintf(qh ferr, 6281, "qhull internal error (qh_replacefacetvertex): f%d already contains new v%d\n", facet->id, newvertex->id); + qh_errexit(qh_ERRqhull, facet, NULL); + } + if (vertex->id == oldvertex->id) { + old_i= vertex_i; + } + } + if (old_i == -1) { + qh_fprintf(qh ferr, 6282, "qhull internal error (qh_replacefacetvertex): f%d does not contain old v%d\n", facet->id, oldvertex->id); + qh_errexit(qh_ERRqhull, facet, NULL); + } + if (new_i == -1) { + new_i= vertex_n; + } + if (old_i < new_i) + new_i--; + if ((old_i & 0x1) != (new_i & 0x1)) + facet->toporient ^= 1; + qh_setdelnthsorted(facet->vertices, old_i); + qh_setaddnth(&facet->vertices, new_i, newvertex); + neighbor= SETelemt_(facet->neighbors, old_i, facetT); + qh_setdelnthsorted(facet->neighbors, old_i); + qh_setaddnth(&facet->neighbors, new_i, neighbor); +} /* replacefacetvertex */ + +/*--------------------------------- qh_resetlists( stats, qh_RESETvisible ) - reset newvertex_list, newfacet_list, visible_list + reset newvertex_list, newfacet_list, visible_list, NEWfacets, NEWtentative if stats, maintains statistics + if resetVisible, + visible_list is restored to facet_list + otherwise, f.visible/f.replace is retained returns: - visible_list is empty if qh_deletevisible was called + newvertex_list, newfacet_list, visible_list are NULL + + notes: + To delete visible facets, call qh_deletevisible before qh_resetlists */ -void qh_resetlists(boolT stats, boolT resetVisible /*qh.newvertex_list newfacet_list visible_list*/) { +void qh_resetlists(boolT stats, boolT resetVisible /* qh.newvertex_list newfacet_list visible_list */) { vertexT *vertex; facetT *newfacet, *visible; int totnew=0, totver=0; + trace2((qh ferr, 2066, "qh_resetlists: reset newvertex_list v%d, newfacet_list f%d, visible_list f%d, facet_list f%d next f%d vertex_list v%d -- NEWfacets? %d, NEWtentative? %d, stats? %d\n", + getid_(qh newvertex_list), getid_(qh newfacet_list), getid_(qh visible_list), getid_(qh facet_list), getid_(qh facet_next), getid_(qh vertex_list), qh NEWfacets, qh NEWtentative, stats)); if (stats) { FORALLvertex_(qh newvertex_list) totver++; @@ -2698,10 +3404,13 @@ zmax_(Znewfacetmax, totnew); } FORALLvertex_(qh newvertex_list) - vertex->newlist= False; + vertex->newfacet= False; qh newvertex_list= NULL; - FORALLnew_facets + qh first_newfacet= 0; + FORALLnew_facets { newfacet->newfacet= False; + newfacet->dupridge= False; + } qh newfacet_list= NULL; if (resetVisible) { FORALLvisible_facets { @@ -2710,14 +3419,15 @@ } qh num_visible= 0; } - qh visible_list= NULL; /* may still have visible facets via qh_triangulate */ + qh visible_list= NULL; qh NEWfacets= False; + qh NEWtentative= False; } /* resetlists */ /*--------------------------------- - qh_setvoronoi_all() + qh_setvoronoi_all( ) compute Voronoi centers for all facets includes upperDelaunay facets if qh.UPPERdelaunay ('Qu') @@ -2725,8 +3435,7 @@ facet->center is the Voronoi center notes: - this is unused/untested code - please email bradb@shore.net if this works ok for you + unused/untested code: please email bradb@shore.net if this works ok for you use: FORALLvertices {...} to locate the vertex for a point. @@ -2747,7 +3456,6 @@ } /* setvoronoi_all */ #ifndef qh_NOmerge - /*--------------------------------- @@ -2759,20 +3467,25 @@ returns: all facets simplicial each tricoplanar facet has ->f.triowner == owner of ->center,normal,etc. + resets qh.newfacet_list and visible_list notes: - call after qh_check_output since may switch to Voronoi centers + called by qh_prepare_output and user_eg2.c + call after qh_check_output since may switch to Voronoi centers, and qh_checkconvex skips f.tricoplanar facets Output may overwrite ->f.triowner with ->f.area + while running, 'triangulated_facet_list' is a list of + one non-simplicial facet followed by its 'f.tricoplanar' triangulated facets + See qh_buildcone */ -void qh_triangulate(void /*qh.facet_list*/) { +void qh_triangulate(void /* qh.facet_list */) { facetT *facet, *nextfacet, *owner; - int onlygood= qh ONLYgood; - facetT *neighbor, *visible= NULL, *facet1, *facet2, *new_facet_list= NULL; + facetT *neighbor, *visible= NULL, *facet1, *facet2, *triangulated_facet_list= NULL; facetT *orig_neighbor= NULL, *otherfacet; - vertexT *new_vertex_list= NULL; + vertexT *triangulated_vertex_list= NULL; mergeT *merge; mergeType mergetype; int neighbor_i, neighbor_n; + boolT onlygood= qh ONLYgood; if (qh hasTriangulation) return; @@ -2785,57 +3498,57 @@ } qh ONLYgood= False; /* for makenew_nonsimplicial */ qh visit_id++; - qh NEWfacets= True; - qh degen_mergeset= qh_settemp(qh TEMPsize); + qh_initmergesets(/* qh.facet_mergeset,degen_mergeset,vertex_mergeset */); qh newvertex_list= qh vertex_tail; - for (facet= qh facet_list; facet && facet->next; facet= nextfacet) { /* non-simplicial facets moved to end */ + for (facet=qh facet_list; facet && facet->next; facet= nextfacet) { /* non-simplicial facets moved to end */ nextfacet= facet->next; if (facet->visible || facet->simplicial) continue; /* triangulate all non-simplicial facets, otherwise merging does not work, e.g., RBOX c P-0.1 P+0.1 P+0.1 D3 | QHULL d Qt Tv */ - if (!new_facet_list) - new_facet_list= facet; /* will be moved to end */ - qh_triangulate_facet(facet, &new_vertex_list); - } - trace2((qh ferr, 2047, "qh_triangulate: delete null facets from f%d -- apex same as second vertex\n", getid_(new_facet_list))); - for (facet= new_facet_list; facet && facet->next; facet= nextfacet) { /* null facets moved to end */ + if (!triangulated_facet_list) + triangulated_facet_list= facet; /* will be first triangulated facet */ + qh_triangulate_facet(facet, &triangulated_vertex_list); /* qh_resetlists ! */ + } + /* qh_checkpolygon invalid due to f.visible without qh.visible_list */ + trace2((qh ferr, 2047, "qh_triangulate: delete null facets from facetlist f%d. A null facet has the same first (apex) and second vertices\n", getid_(triangulated_facet_list))); + for (facet=triangulated_facet_list; facet && facet->next; facet= nextfacet) { nextfacet= facet->next; if (facet->visible) continue; if (facet->ridges) { if (qh_setsize(facet->ridges) > 0) { - qh_fprintf(qh ferr, 6161, "qhull error (qh_triangulate): ridges still defined for f%d\n", facet->id); + qh_fprintf(qh ferr, 6161, "qhull internal error (qh_triangulate): ridges still defined for f%d\n", facet->id); qh_errexit(qh_ERRqhull, facet, NULL); } qh_setfree(&facet->ridges); } if (SETfirst_(facet->vertices) == SETsecond_(facet->vertices)) { zinc_(Ztrinull); - qh_triangulate_null(facet); + qh_triangulate_null(facet); /* will delete facet */ } } - trace2((qh ferr, 2048, "qh_triangulate: delete %d or more mirror facets -- same vertices and neighbors\n", qh_setsize(qh degen_mergeset))); + trace2((qh ferr, 2048, "qh_triangulate: delete %d or more mirrored facets. Mirrored facets have the same vertices due to a null facet\n", qh_setsize(qh degen_mergeset))); qh visible_list= qh facet_tail; - while ((merge= (mergeT*)qh_setdellast(qh degen_mergeset))) { + while ((merge= (mergeT *)qh_setdellast(qh degen_mergeset))) { facet1= merge->facet1; facet2= merge->facet2; - mergetype= merge->type; + mergetype= merge->mergetype; qh_memfree(merge, (int)sizeof(mergeT)); if (mergetype == MRGmirror) { zinc_(Ztrimirror); - qh_triangulate_mirror(facet1, facet2); + qh_triangulate_mirror(facet1, facet2); /* will delete both facets */ } } - qh_settempfree(&qh degen_mergeset); - trace2((qh ferr, 2049, "qh_triangulate: update neighbor lists for vertices from v%d\n", getid_(new_vertex_list))); - qh newvertex_list= new_vertex_list; /* all vertices of new facets */ + qh_freemergesets(); + trace2((qh ferr, 2049, "qh_triangulate: update neighbor lists for vertices from v%d\n", getid_(triangulated_vertex_list))); + qh newvertex_list= triangulated_vertex_list; /* all vertices of triangulated facets */ qh visible_list= NULL; - qh_updatevertices(/*qh.newvertex_list, empty newfacet_list and visible_list*/); - qh_resetlists(False, !qh_RESETvisible /*qh.newvertex_list, empty newfacet_list and visible_list*/); + qh_update_vertexneighbors(/* qh.newvertex_list, empty newfacet_list and visible_list */); + qh_resetlists(False, !qh_RESETvisible /* qh.newvertex_list, empty newfacet_list and visible_list */); - trace2((qh ferr, 2050, "qh_triangulate: identify degenerate tricoplanar facets from f%d\n", getid_(new_facet_list))); + trace2((qh ferr, 2050, "qh_triangulate: identify degenerate tricoplanar facets from f%d\n", getid_(triangulated_facet_list))); trace2((qh ferr, 2051, "qh_triangulate: and replace facet->f.triowner with tricoplanar facets that own center, normal, etc.\n")); - FORALLfacet_(new_facet_list) { + FORALLfacet_(triangulated_facet_list) { if (facet->tricoplanar && !facet->visible) { FOREACHneighbor_i_(facet) { if (neighbor_i == 0) { /* first iteration */ @@ -2857,11 +3570,13 @@ } } } - + if (qh IStracing >= 4) + qh_printlists(); trace2((qh ferr, 2052, "qh_triangulate: delete visible facets -- non-simplicial, null, and mirrored facets\n")); owner= NULL; visible= NULL; - for (facet= new_facet_list; facet && facet->next; facet= nextfacet) { /* may delete facet */ + for (facet=triangulated_facet_list; facet && facet->next; facet= nextfacet) { + /* deleting facets, triangulated_facet_list is no longer valid */ nextfacet= facet->next; if (facet->visible) { if (facet->tricoplanar) { /* a null or mirrored facet */ @@ -2870,7 +3585,7 @@ }else { /* a non-simplicial facet followed by its tricoplanars */ if (visible && !owner) { /* RBOX 200 s D5 t1001471447 | QHULL Qt C-0.01 Qx Qc Tv Qt -- f4483 had 6 vertices/neighbors and 8 ridges */ - trace2((qh ferr, 2053, "qh_triangulate: all tricoplanar facets degenerate for non-simplicial facet f%d\n", + trace2((qh ferr, 2053, "qh_triangulate: delete f%d. All tricoplanar facets degenerate for non-simplicial facet\n", visible->id)); qh_delfacet(visible); qh num_visible--; @@ -2880,7 +3595,7 @@ } }else if (facet->tricoplanar) { if (facet->f.triowner != visible || visible==NULL) { - qh_fprintf(qh ferr, 6162, "qhull error (qh_triangulate): tricoplanar facet f%d not owned by its visible, non-simplicial facet f%d\n", facet->id, getid_(visible)); + qh_fprintf(qh ferr, 6162, "qhull internal error (qh_triangulate): tricoplanar facet f%d not owned by its visible, non-simplicial facet f%d\n", facet->id, getid_(visible)); qh_errexit2(qh_ERRqhull, facet, visible); } if (owner) @@ -2901,6 +3616,7 @@ qh num_visible--; } } + facet->degenerate= False; /* reset f.degenerate set by qh_triangulate*/ } if (visible && !owner) { trace2((qh ferr, 2054, "qh_triangulate: all tricoplanar facets degenerate for last non-simplicial facet f%d\n", @@ -2908,7 +3624,6 @@ qh_delfacet(visible); qh num_visible--; } - qh NEWfacets= False; qh ONLYgood= onlygood; /* restore value */ if (qh CHECKfrequently) qh_checkpolygon(qh facet_list); @@ -2919,7 +3634,7 @@ /*--------------------------------- - qh_triangulate_facet(qh, facetA, &firstVertex ) + qh_triangulate_facet( facetA, &firstVertex ) triangulate a non-simplicial facet if qh.CENTERtype=qh_ASvoronoi, sets its Voronoi center returns: @@ -2959,22 +3674,22 @@ trace3((qh ferr, 3020, "qh_triangulate_facet: triangulate facet f%d\n", facetA->id)); + qh first_newfacet= qh facet_id; if (qh IStracing >= 4) qh_printfacet(qh ferr, facetA); FOREACHneighbor_(facetA) { neighbor->seen= False; - neighbor->coplanar= False; + neighbor->coplanarhorizon= False; } if (qh CENTERtype == qh_ASvoronoi && !facetA->center /* matches upperdelaunay in qh_setfacetplane() */ - && fabs_(facetA->normal[qh hull_dim -1]) >= qh ANGLEround * qh_ZEROdelaunay) { + && fabs_(facetA->normal[qh hull_dim -1]) >= qh ANGLEround * qh_ZEROdelaunay) { facetA->center= qh_facetcenter(facetA->vertices); } - qh_willdelete(facetA, NULL); - qh newfacet_list= qh facet_tail; + qh visible_list= qh newfacet_list= qh facet_tail; facetA->visitid= qh visit_id; apex= SETfirstt_(facetA->vertices, vertexT); qh_makenew_nonsimplicial(facetA, apex, &numnew); - SETfirst_(facetA->neighbors)= NULL; + qh_willdelete(facetA, NULL); FORALLnew_facets { newfacet->tricoplanar= True; newfacet->f.trivisible= facetA; @@ -2984,14 +3699,14 @@ if (qh TRInormals) { /* 'Q11' triangulate duplicates ->normal and ->center */ newfacet->keepcentrum= True; if(facetA->normal){ - newfacet->normal= qh_memalloc(qh normal_size); - memcpy((char *)newfacet->normal, facetA->normal, qh normal_size); + newfacet->normal= (double *)qh_memalloc(qh normal_size); + memcpy((char *)newfacet->normal, facetA->normal, (size_t)qh normal_size); } if (qh CENTERtype == qh_AScentrum) newfacet->center= qh_getcentrum(newfacet); else if (qh CENTERtype == qh_ASvoronoi && facetA->center){ - newfacet->center= qh_memalloc(qh center_size); - memcpy((char *)newfacet->center, facetA->center, qh center_size); + newfacet->center= (double *)qh_memalloc(qh center_size); + memcpy((char *)newfacet->center, facetA->center, (size_t)qh center_size); } }else { newfacet->keepcentrum= False; @@ -3004,42 +3719,46 @@ newfacet->maxoutside= facetA->maxoutside; #endif } - qh_matchnewfacets(/*qh.newfacet_list*/); + qh_matchnewfacets(/* qh.newfacet_list */); /* ignore returned value, maxdupdist */ zinc_(Ztricoplanar); zadd_(Ztricoplanartot, numnew); zmax_(Ztricoplanarmax, numnew); - qh visible_list= NULL; if (!(*first_vertex)) (*first_vertex)= qh newvertex_list; qh newvertex_list= NULL; - qh_updatevertices(/*qh.newfacet_list, qh.empty visible_list and qh.newvertex_list*/); - qh_resetlists(False, !qh_RESETvisible /*qh.newfacet_list, qh.empty visible_list and qh.newvertex_list*/); + qh visible_list= NULL; + /* only update v.neighbors for qh.newfacet_list. qh.visible_list and qh.newvertex_list are NULL */ + qh_update_vertexneighbors(/* qh.newfacet_list */); + qh_resetlists(False, !qh_RESETvisible /* qh.newfacet_list */); } /* triangulate_facet */ /*--------------------------------- qh_triangulate_link(oldfacetA, facetA, oldfacetB, facetB) - relink facetA to facetB via oldfacets + relink facetA to facetB via null oldfacetA or mirrored oldfacetA and oldfacetB returns: - adds mirror facets to qh degen_mergeset (4-d and up only) - design: - if they are already neighbors, the opposing neighbors become MRGmirror facets + if neighbors are already linked, will merge as MRGmirror (qh.degen_mergeset, 4-d and up) */ void qh_triangulate_link(facetT *oldfacetA, facetT *facetA, facetT *oldfacetB, facetT *facetB) { int errmirror= False; - trace3((qh ferr, 3021, "qh_triangulate_link: relink old facets f%d and f%d between neighbors f%d and f%d\n", - oldfacetA->id, oldfacetB->id, facetA->id, facetB->id)); + if (oldfacetA == oldfacetB) { + trace3((qh ferr, 3052, "qh_triangulate_link: relink neighbors f%d and f%d of null facet f%d\n", + facetA->id, facetB->id, oldfacetA->id)); + }else { + trace3((qh ferr, 3021, "qh_triangulate_link: relink neighbors f%d and f%d of mirrored facets f%d and f%d\n", + facetA->id, facetB->id, oldfacetA->id, oldfacetB->id)); + } if (qh_setin(facetA->neighbors, facetB)) { if (!qh_setin(facetB->neighbors, facetA)) errmirror= True; - else - qh_appendmergeset(facetA, facetB, MRGmirror, NULL); + else if (!facetA->redundant || !facetB->redundant || !qh_hasmerge(qh degen_mergeset, MRGmirror, facetA, facetB)) + qh_appendmergeset(facetA, facetB, MRGmirror, 0.0, 1.0); }else if (qh_setin(facetB->neighbors, facetA)) errmirror= True; if (errmirror) { - qh_fprintf(qh ferr, 6163, "qhull error (qh_triangulate_link): mirror facets f%d and f%d do not match for old facets f%d and f%d\n", + qh_fprintf(qh ferr, 6163, "qhull internal error (qh_triangulate_link): neighbors f%d and f%d do not match for null facet or mirrored facets f%d and f%d\n", facetA->id, facetB->id, oldfacetA->id, oldfacetB->id); qh_errexit2(qh_ERRqhull, facetA, facetB); } @@ -3051,7 +3770,7 @@ >-------------------------------- qh_triangulate_mirror(facetA, facetB) - delete mirrored facets from qh_triangulate_null() and qh_triangulate_mirror + delete two mirrored facets identified by qh_triangulate_null() and itself a mirrored facet shares the same vertices of a logical ridge design: since a null facet duplicates the first two vertices, the opposing neighbors absorb the null facet @@ -3061,12 +3780,18 @@ facetT *neighbor, *neighborB; int neighbor_i, neighbor_n; - trace3((qh ferr, 3022, "qh_triangulate_mirror: delete mirrored facets f%d and f%d\n", + trace3((qh ferr, 3022, "qh_triangulate_mirror: delete mirrored facets f%d and f%d and link their neighbors\n", facetA->id, facetB->id)); FOREACHneighbor_i_(facetA) { neighborB= SETelemt_(facetB->neighbors, neighbor_i, facetT); - if (neighbor == neighborB) + if (neighbor == facetB && neighborB == facetA) continue; /* occurs twice */ + else if (neighbor->redundant && neighborB->redundant) { /* also mirrored facets (D5+) */ + if (qh_hasmerge(qh degen_mergeset, MRGmirror, neighbor, neighborB)) + continue; + } + if (neighbor->visible && neighborB->visible) /* previously deleted as mirrored facets */ + continue; qh_triangulate_link(facetA, neighbor, facetB, neighborB); } qh_willdelete(facetA, NULL); @@ -3080,11 +3805,11 @@ remove null facetA from qh_triangulate_facet() a null facet has vertex #1 (apex) == vertex #2 returns: - adds facetA to ->visible for deletion after qh_updatevertices + adds facetA to ->visible for deletion after qh_update_vertexneighbors qh degen_mergeset contains mirror facets (4-d and up only) design: since a null facet duplicates the first two vertices, the opposing neighbors absorb the null facet - if they are already neighbors, the opposing neighbors become MRGmirror facets + if they are already neighbors, the opposing neighbors will be merged (MRGmirror) */ void qh_triangulate_null(facetT *facetA) { facetT *neighbor, *otherfacet; @@ -3101,10 +3826,10 @@ } #endif /* qh_NOmerge */ - /*--------------------------------- - qh_vertexintersect( vertexsetA, vertexsetB ) + qh_vertexintersect( verticesA, verticesB ) intersects two vertex sets (inverse id ordered) vertexsetA is a temporary set at the top of qhmem.tempstack @@ -3112,9 +3837,12 @@ replaces vertexsetA with the intersection notes: - could overwrite vertexsetA if currently too slow + only called by qh_neighbor_intersections + if !qh.QHULLfinished, non-simplicial facets may have f.vertices with extraneous vertices + cleaned by qh_remove_extravertices in qh_reduce_vertices + could optimize by overwriting vertexsetA */ -void qh_vertexintersect(setT **vertexsetA,setT *vertexsetB) { +void qh_vertexintersect(setT **vertexsetA, setT *vertexsetB) { setT *intersection; intersection= qh_vertexintersect_new(*vertexsetA, vertexsetB); @@ -3126,13 +3854,18 @@ /*--------------------------------- - qh_vertexintersect_new( ) + qh_vertexintersect_new( verticesA, verticesB ) intersects two vertex sets (inverse id ordered) returns: a new set + + notes: + called by qh_checkfacet, qh_vertexintersect, qh_rename_sharedvertex, qh_findbest_pinchedvertex, qh_neighbor_intersections + if !qh.QHULLfinished, non-simplicial facets may have f.vertices with extraneous vertices + cleaned by qh_remove_extravertices in qh_reduce_vertices */ -setT *qh_vertexintersect_new(setT *vertexsetA,setT *vertexsetB) { +setT *qh_vertexintersect_new(setT *vertexsetA, setT *vertexsetB) { setT *intersection= qh_setnew(qh hull_dim - 1); vertexT **vertexA= SETaddr_(vertexsetA, vertexT); vertexT **vertexB= SETaddr_(vertexsetB, vertexT); @@ -3154,7 +3887,7 @@ /*--------------------------------- - qh_vertexneighbors() + qh_vertexneighbors( ) for each vertex in qh.facet_list, determine its neighboring facets @@ -3171,13 +3904,13 @@ for each vertex append facet to vertex->neighbors */ -void qh_vertexneighbors(void /*qh.facet_list*/) { +void qh_vertexneighbors(void /* qh.facet_list */) { facetT *facet; vertexT *vertex, **vertexp; if (qh VERTEXneighbors) return; - trace1((qh ferr, 1035, "qh_vertexneighbors: determing neighboring facets for each vertex\n")); + trace1((qh ferr, 1035, "qh_vertexneighbors: determining neighboring facets for each vertex\n")); qh vertex_visit++; FORALLfacets { if (facet->visible) diff -Nru qhull-2015.2/src/libqhull/poly.c qhull-2020.2/src/libqhull/poly.c --- qhull-2015.2/src/libqhull/poly.c 2016-01-18 14:27:06.000000000 +0000 +++ qhull-2020.2/src/libqhull/poly.c 2020-05-22 02:00:58.000000000 +0000 @@ -9,9 +9,9 @@ infrequent code is in poly2.c (all but top 50 and their callers 12/3/95) - Copyright (c) 1993-2015 The Geometry Center. - $Id: //main/2015/qhull/src/libqhull/poly.c#3 $$Change: 2064 $ - $DateTime: 2016/01/18 12:36:08 $$Author: bbarber $ + Copyright (c) 1993-2020 The Geometry Center. + $Id: //main/2019/qhull/src/libqhull/poly.c#7 $$Change: 2953 $ + $DateTime: 2020/05/21 22:05:32 $$Author: bbarber $ */ #include "qhull_a.h" @@ -38,8 +38,11 @@ void qh_appendfacet(facetT *facet) { facetT *tail= qh facet_tail; - if (tail == qh newfacet_list) + if (tail == qh newfacet_list) { qh newfacet_list= facet; + if (tail == qh visible_list) /* visible_list is at or before newfacet_list */ + qh visible_list= facet; + } if (tail == qh facet_next) qh facet_next= facet; facet->previous= tail->previous; @@ -61,7 +64,7 @@ appends vertex to end of qh.vertex_list, returns: - sets vertex->newlist + sets vertex->newfacet updates qh.vertex_list, newvertex_list increments qh.num_vertices @@ -74,7 +77,7 @@ if (tail == qh newvertex_list) qh newvertex_list= vertex; - vertex->newlist= True; + vertex->newfacet= True; vertex->previous= tail->previous; vertex->next= tail; if (tail->previous) @@ -83,7 +86,7 @@ qh vertex_list= vertex; tail->previous= vertex; qh num_vertices++; - trace4((qh ferr, 4045, "qh_appendvertex: append v%d to vertex_list\n", vertex->id)); + trace4((qh ferr, 4045, "qh_appendvertex: append v%d to qh.newvertex_list and set v.newfacet\n", vertex->id)); } /* appendvertex */ @@ -93,9 +96,9 @@ qh_attachnewfacets( ) attach horizon facets to new facets in qh.newfacet_list newfacets have neighbor and ridge links to horizon but not vice versa - only needed for qh.ONLYgood returns: + clears qh.NEWtentative set qh.NEWfacets horizon facets linked to new facets ridges changed from visible facets to new facets @@ -103,6 +106,10 @@ qh.visible_list, no ridges valid facet->f.replace is a newfacet (if any) + notes: + used for qh.NEWtentative, otherwise see qh_makenew_nonsimplicial and qh_makenew_simplicial + qh_delridge_merge not needed (as tested by qh_checkdelridge) + design: delete interior ridges and neighbor sets by for each visible, non-simplicial facet @@ -118,7 +125,7 @@ locate corresponding visible facet {may be more than one} link visible facet to new facet replace visible facet with new facet in horizon - else it's non-simplicial + else it is non-simplicial for all visible neighbors of the horizon facet link visible neighbor to new facet delete visible neighbor from horizon facet @@ -126,12 +133,14 @@ the first ridge of the new facet is the horizon ridge link the new facet into the horizon ridge */ -void qh_attachnewfacets(void /* qh.visible_list, newfacet_list */) { +void qh_attachnewfacets(void /* qh.visible_list, qh.newfacet_list */) { facetT *newfacet= NULL, *neighbor, **neighborp, *horizon, *visible; ridgeT *ridge, **ridgep; - qh NEWfacets= True; trace3((qh ferr, 3012, "qh_attachnewfacets: delete interior ridges\n")); + if (qh CHECKfrequently) { + qh_checkdelridge(); + } qh visit_id++; FORALLvisible_facets { visible->visitid= qh visit_id; @@ -142,13 +151,10 @@ || (!neighbor->visible && neighbor->simplicial)) { if (!neighbor->visible) /* delete ridge for simplicial horizon */ qh_setdel(neighbor->ridges, ridge); - qh_setfree(&(ridge->vertices)); /* delete on 2nd visit */ - qh_memfree(ridge, (int)sizeof(ridgeT)); + qh_delridge(ridge); /* delete on second visit */ } } - SETfirst_(visible->ridges)= NULL; } - SETfirst_(visible->neighbors)= NULL; } trace1((qh ferr, 1017, "qh_attachnewfacets: attach horizon facets to new facets\n")); FORALLnew_facets { @@ -171,7 +177,7 @@ visible->f.replace= newfacet; qh_setreplace(horizon->neighbors, visible, newfacet); }else { - qh_fprintf(qh ferr, 6102, "qhull internal error (qh_attachnewfacets): couldn't find visible facet for horizon f%d of newfacet f%d\n", + qh_fprintf(qh ferr, 6102, "qhull internal error (qh_attachnewfacets): could not find visible facet for horizon f%d of newfacet f%d\n", horizon->id, newfacet->id); qh_errexit2(qh_ERRqhull, horizon, newfacet); } @@ -179,19 +185,29 @@ FOREACHneighbor_(horizon) { /* may hold for many new facets */ if (neighbor->visible) { neighbor->f.replace= newfacet; - qh_setdelnth(horizon->neighbors, - SETindex_(horizon->neighbors, neighbor)); + qh_setdelnth(horizon->neighbors, SETindex_(horizon->neighbors, neighbor)); neighborp--; /* repeat */ } } qh_setappend(&horizon->neighbors, newfacet); ridge= SETfirstt_(newfacet->ridges, ridgeT); - if (ridge->top == horizon) + if (ridge->top == horizon) { ridge->bottom= newfacet; - else + ridge->simplicialbot= True; + }else { ridge->top= newfacet; + ridge->simplicialtop= True; } + } } /* newfacets */ + trace4((qh ferr, 4094, "qh_attachnewfacets: clear f.ridges and f.neighbors for visible facets, may become invalid before qh_deletevisible\n")); + FORALLvisible_facets { + if (visible->ridges) + SETfirst_(visible->ridges)= NULL; + SETfirst_(visible->neighbors)= NULL; + } + qh NEWtentative= False; + qh NEWfacets= True; if (qh PRINTstatistics) { FORALLvisible_facets { if (!visible->f.replace) @@ -207,13 +223,16 @@ checks facet orientation to interior point if allerror set, - tests against qh.DISTround + tests against -qh.DISTround else - tests against 0 since tested against DISTround before + tests against 0.0 since tested against -qh.DISTround before returns: False if it flipped orientation (sets facet->flipped) distance if non-NULL + + notes: + called by qh_setfacetplane, qh_initialhull, and qh_checkflipped_all */ boolT qh_checkflipped(facetT *facet, realT *distp, boolT allerror) { realT dist; @@ -224,12 +243,14 @@ qh_distplane(qh interior_point, facet, &dist); if (distp) *distp= dist; - if ((allerror && dist > -qh DISTround)|| (!allerror && dist >= 0.0)) { + if ((allerror && dist >= -qh DISTround) || (!allerror && dist > 0.0)) { facet->flipped= True; - zzinc_(Zflippedfacets); - trace0((qh ferr, 19, "qh_checkflipped: facet f%d is flipped, distance= %6.12g during p%d\n", - facet->id, dist, qh furthest_id)); - qh_precision("flipped facet"); + trace0((qh ferr, 19, "qh_checkflipped: facet f%d flipped, allerror? %d, distance= %6.12g during p%d\n", + facet->id, allerror, dist, qh furthest_id)); + if (qh num_facets > qh hull_dim+1) { /* qh_initialhull reverses orientation if !qh_checkflipped */ + zzinc_(Zflippedfacets); + qh_joggle_restart("flipped facet"); + } return False; } return True; @@ -242,12 +263,19 @@ removes facet from facet_list and frees up its memory notes: - assumes vertices and ridges already freed + assumes vertices and ridges already freed or referenced elsewhere */ void qh_delfacet(facetT *facet) { void **freelistp; /* used if !qh_NOmem by qh_memfree_() */ - trace4((qh ferr, 4046, "qh_delfacet: delete f%d\n", facet->id)); + trace3((qh ferr, 3057, "qh_delfacet: delete f%d\n", facet->id)); + if (qh CHECKfrequently || qh VERIFYoutput) { + if (!qh NOerrexit) { + qh_checkdelfacet(facet, qh facet_mergeset); + qh_checkdelfacet(facet, qh degen_mergeset); + qh_checkdelfacet(facet, qh vertex_mergeset); + } + } if (facet == qh tracefacet) qh tracefacet= NULL; if (facet == qh GOODclosest) @@ -281,26 +309,29 @@ returns: deletes each facet and removes from facetlist + deletes vertices on qh.del_vertices and ridges in qh.del_ridges at exit, qh.visible_list empty (== qh.newfacet_list) notes: - ridges already deleted + called by qh_all_vertexmerges, qh_addpoint, and qh_qhull + ridges already deleted or moved elsewhere + deleted vertices on qh.del_vertices horizon facets do not reference facets on qh.visible_list new facets in qh.newfacet_list uses qh.visit_id; */ -void qh_deletevisible(void /*qh.visible_list*/) { +void qh_deletevisible(void /* qh.visible_list */) { facetT *visible, *nextfacet; vertexT *vertex, **vertexp; int numvisible= 0, numdel= qh_setsize(qh del_vertices); trace1((qh ferr, 1018, "qh_deletevisible: delete %d visible facets and %d vertices\n", qh num_visible, numdel)); - for (visible= qh visible_list; visible && visible->visible; + for (visible=qh visible_list; visible && visible->visible; visible= nextfacet) { /* deleting current */ nextfacet= visible->next; numvisible++; - qh_delfacet(visible); + qh_delfacet(visible); /* f.ridges deleted or moved elsewhere, deleted f.vertices on qh.del_vertices */ } if (numvisible != qh num_visible) { qh_fprintf(qh ferr, 6103, "qhull internal error (qh_deletevisible): qh num_visible %d is not number of visible facets %d\n", @@ -378,7 +409,7 @@ } } if (i >= dim || j >= dim) { - qh_fprintf(qh ferr, 6104, "qhull internal error (qh_facetintersect): f%d or f%d not in others neighbors\n", + qh_fprintf(qh ferr, 6104, "qhull internal error (qh_facetintersect): f%d or f%d not in other's neighbors\n", facetA->id, facetB->id); qh_errexit2(qh_ERRqhull, facetA, facetB); } @@ -404,8 +435,8 @@ */ int qh_gethash(int hashsize, setT *set, int size, int firstindex, void *skipelem) { void **elemp= SETelemaddr_(set, firstindex, void); - ptr_intT hash = 0, elem; - unsigned result; + ptr_intT hash= 0, elem; + unsigned int uresult; int i; #ifdef _MSC_VER /* Microsoft Visual C++ -- warn about 64-bit issues */ #pragma warning( push) /* WARN64 -- ptr_intT holds a 64-bit pointer */ @@ -453,16 +484,37 @@ qh_fprintf(qh ferr, 6202, "qhull internal error: negative hashsize %d passed to qh_gethash [poly.c]\n", hashsize); qh_errexit2(qh_ERRqhull, NULL, NULL); } - result= (unsigned)hash; - result %= (unsigned)hashsize; + uresult= (unsigned int)hash; + uresult %= (unsigned int)hashsize; /* result= 0; for debugging */ - return result; + return (int)uresult; #ifdef _MSC_VER #pragma warning( pop) #endif } /* gethash */ /*--------------------------------- + + qh_getreplacement( visible ) + get replacement for visible facet + + returns: + valid facet from visible.replace (may be chained) +*/ +facetT *qh_getreplacement(facetT *visible) { + unsigned int count= 0; + + facetT *result= visible; + while (result && result->visible) { + result= result->f.replace; + if (count++ > qh facet_id) + qh_infiniteloop(visible); + } + return result; +} + +/*--------------------------------- qh_makenewfacet( vertices, toporient, horizon ) @@ -476,19 +528,20 @@ newfacet->neighbor= horizon, but not vice versa newvertex_list updated with vertices */ -facetT *qh_makenewfacet(setT *vertices, boolT toporient,facetT *horizon) { +facetT *qh_makenewfacet(setT *vertices, boolT toporient, facetT *horizon) { facetT *newfacet; vertexT *vertex, **vertexp; FOREACHvertex_(vertices) { - if (!vertex->newlist) { + if (!vertex->newfacet) { qh_removevertex(vertex); qh_appendvertex(vertex); } } newfacet= qh_newfacet(); newfacet->vertices= vertices; - newfacet->toporient= (unsigned char)toporient; + if (toporient) + newfacet->toporient= True; if (horizon) qh_setappend(&(newfacet->neighbors), horizon); qh_appendfacet(newfacet); @@ -510,17 +563,20 @@ notes: facet->f.samecycle is defined for facet->mergehorizon facets */ -void qh_makenewplanes(void /* newfacet_list */) { +void qh_makenewplanes(void /* qh.newfacet_list */) { facetT *newfacet; + trace4((qh ferr, 4074, "qh_makenewplanes: make new hyperplanes for facets on qh.newfacet_list f%d\n", + qh newfacet_list->id)); FORALLnew_facets { if (!newfacet->mergehorizon) - qh_setfacetplane(newfacet); + qh_setfacetplane(newfacet); /* updates Wnewvertexmax */ } if (qh JOGGLEmax < REALmax/2) minimize_(qh min_vertex, -wwval_(Wnewvertexmax)); } /* makenewplanes */ +#ifndef qh_NOmerge /*--------------------------------- @@ -529,18 +585,21 @@ returns: first newfacet, bumps numnew as needed - attaches new facets if !qh.ONLYgood + attaches new facets if !qh NEWtentative marks ridge neighbors for simplicial visible - if (qh.ONLYgood) + if (qh.NEWtentative) ridges on newfacet, horizon, and visible else - ridge and neighbors between newfacet and horizon + ridge and neighbors between newfacet and horizon visible facet's ridges are deleted + visible facet's f.neighbors is empty notes: + called by qh_makenewfacets and qh_triangulatefacet qh.visit_id if visible has already been processed sets neighbor->seen for building f.samecycle assumes all 'seen' flags initially false + qh_delridge_merge not needed (as tested by qh_checkdelridge in qh_makenewfacets) design: for each ridge of visible facet @@ -559,21 +618,22 @@ (deletes ridge if neighbor is simplicial) */ -#ifndef qh_NOmerge facetT *qh_makenew_nonsimplicial(facetT *visible, vertexT *apex, int *numnew) { void **freelistp; /* used if !qh_NOmem by qh_memfree_() */ ridgeT *ridge, **ridgep; facetT *neighbor, *newfacet= NULL, *samecycle; setT *vertices; boolT toporient; - int ridgeid; + unsigned int ridgeid; FOREACHridge_(visible->ridges) { ridgeid= ridge->id; neighbor= otherfacet_(ridge, visible); if (neighbor->visible) { - if (!qh ONLYgood) { + if (!qh NEWtentative) { if (neighbor->visitid == qh visit_id) { + if (qh traceridge == ridge) + qh traceridge= NULL; qh_setfree(&(ridge->vertices)); /* delete on 2nd visit */ qh_memfree_(ridge, (int)sizeof(ridgeT), freelistp); } @@ -585,7 +645,7 @@ qh_setappend_set(&vertices, ridge->vertices); newfacet= qh_makenewfacet(vertices, toporient, neighbor); (*numnew)++; - if (neighbor->coplanar) { + if (neighbor->coplanarhorizon) { newfacet->mergehorizon= True; if (!neighbor->seen) { newfacet->f.samecycle= newfacet; @@ -596,7 +656,7 @@ samecycle->f.samecycle= newfacet; } } - if (qh ONLYgood) { + if (qh NEWtentative) { if (!neighbor->simplicial) qh_setappend(&(newfacet->ridges), ridge); }else { /* qh_attachnewfacets */ @@ -611,27 +671,32 @@ qh_setreplace(neighbor->neighbors, visible, newfacet); if (neighbor->simplicial) { qh_setdel(neighbor->ridges, ridge); - qh_setfree(&(ridge->vertices)); - qh_memfree(ridge, (int)sizeof(ridgeT)); + qh_delridge(ridge); }else { qh_setappend(&(newfacet->ridges), ridge); - if (toporient) + if (toporient) { ridge->top= newfacet; - else + ridge->simplicialtop= True; + }else { ridge->bottom= newfacet; + ridge->simplicialbot= True; + } } - trace4((qh ferr, 4048, "qh_makenew_nonsimplicial: created facet f%d from v%d and r%d of horizon f%d\n", - newfacet->id, apex->id, ridgeid, neighbor->id)); } + trace4((qh ferr, 4048, "qh_makenew_nonsimplicial: created facet f%d from v%d and r%d of horizon f%d\n", + newfacet->id, apex->id, ridgeid, neighbor->id)); } neighbor->seen= True; } /* for each ridge */ - if (!qh ONLYgood) - SETfirst_(visible->ridges)= NULL; return newfacet; } /* makenew_nonsimplicial */ + #else /* qh_NOmerge */ facetT *qh_makenew_nonsimplicial(facetT *visible, vertexT *apex, int *numnew) { + QHULL_UNUSED(visible) + QHULL_UNUSED(apex) + QHULL_UNUSED(numnew) + return NULL; } #endif /* qh_NOmerge */ @@ -643,7 +708,7 @@ make new facets for simplicial visible facet and apex returns: - attaches new facets if (!qh.ONLYgood) + attaches new facets if !qh.NEWtentative neighbors between newfacet and horizon notes: @@ -674,13 +739,13 @@ toporient= (horizonskip & 0x1) ^ 0x1; newfacet= qh_makenewfacet(vertices, toporient, neighbor); (*numnew)++; - if (neighbor->coplanar && (qh PREmerge || qh MERGEexact)) { + if (neighbor->coplanarhorizon && (qh PREmerge || qh MERGEexact)) { #ifndef qh_NOmerge newfacet->f.samecycle= newfacet; newfacet->mergehorizon= True; #endif } - if (!qh ONLYgood) + if (!qh NEWtentative) SETelem_(neighbor->neighbors, horizonskip)= newfacet; trace4((qh ferr, 4049, "qh_makenew_simplicial: create facet f%d top %d from v%d and horizon f%d skip %d top %d and visible f%d skip %d, flip? %d\n", newfacet->id, toporient, apex->id, neighbor->id, horizonskip, @@ -697,15 +762,16 @@ either match subridge of newfacet with neighbor or add to hash_table returns: - duplicate ridges are unmatched and marked by qh_DUPLICATEridge + matched ridges of newfacet, except for duplicate ridges + duplicate ridges marked by qh_DUPLICATEridge for qh_matchdupridge notes: + called by qh_matchnewfacets + assumes newfacet is simplicial ridge is newfacet->vertices w/o newskip vertex do not allocate memory (need to free hash_table cleanly) uses linear hash chains - - see also: - qh_matchduplicates + see qh_matchdupridge (poly2.c) design: for each possible matching facet in qh.hash_table @@ -714,12 +780,39 @@ if ismatch and matching facet doesn't have a match match the facets by updating their neighbor sets else - indicate a duplicate ridge - set facet hyperplane for later testing + note: dupridge detected when a match 'f&d skip %d' has already been seen + need to mark all of the dupridges for qh_matchdupridge + indicate a duplicate ridge by qh_DUPLICATEridge and f.dupridge add facet to hashtable unless the other facet was already a duplicate ridge mark both facets with a duplicate ridge add other facet (if defined) to hash table + + state at "indicate a duplicate ridge": + newfacet@newskip= the argument + facet= the hashed facet@skip that has the same vertices as newfacet@newskip + same= true if matched vertices have the same orientation + matchfacet= neighbor at facet@skip + matchfacet=qh_DUPLICATEridge, matchfacet was previously detected as a dupridge of facet@skip + ismatch if 'vertex orientation (same) matches facet/newfacet orientation (toporient) + unknown facet will match later + + details at "indicate a duplicate ridge": + if !ismatch and matchfacet, + dupridge is between hashed facet@skip/matchfacet@matchskip and arg newfacet@newskip/unknown + set newfacet@newskip, facet@skip, and matchfacet@matchskip to qh_DUPLICATEridge + add newfacet and matchfacet to hash_table + if ismatch and matchfacet, + same as !ismatch and matchfacet -- it matches facet instead of matchfacet + if !ismatch and !matchfacet + dupridge between hashed facet@skip/unknown and arg newfacet@newskip/unknown + set newfacet@newskip and facet@skip to qh_DUPLICATEridge + add newfacet to hash_table + if ismatch and matchfacet==qh_DUPLICATEridge + dupridge with already duplicated hashed facet@skip and arg newfacet@newskip/unknown + set newfacet@newskip to qh_DUPLICATEridge + add newfacet to hash_table + facet's hyperplane already set */ void qh_matchneighbor(facetT *newfacet, int newskip, int hashsize, int *hashcount) { boolT newfound= False; /* True, if new facet is already in hash chain */ @@ -733,7 +826,7 @@ trace4((qh ferr, 4050, "qh_matchneighbor: newfacet f%d skip %d hash %d hashcount %d\n", newfacet->id, newskip, hash, *hashcount)); zinc_(Zhashlookup); - for (scan= hash; (facet= SETelemt_(qh hash_table, scan, facetT)); + for (scan=hash; (facet= SETelemt_(qh hash_table, scan, facetT)); scan= (++scan >= hashsize ? 0 : scan)) { if (facet == newfacet) { newfound= True; @@ -741,12 +834,12 @@ } zinc_(Zhashtests); if (qh_matchvertices(1, newfacet->vertices, newskip, facet->vertices, &skip, &same)) { - if (SETelem_(newfacet->vertices, newskip) == - SETelem_(facet->vertices, skip)) { - qh_precision("two facets with the same vertices"); - qh_fprintf(qh ferr, 6106, "qhull precision error: Vertex sets are the same for f%d and f%d. Can not force output.\n", - facet->id, newfacet->id); - qh_errexit2(qh_ERRprec, facet, newfacet); + if (SETelem_(newfacet->vertices, newskip) == SETelem_(facet->vertices, skip)) { + qh_joggle_restart("two new facets with the same vertices"); + /* duplicated for multiple skips, not easily avoided */ + qh_fprintf(qh ferr, 7084, "qhull topology warning (qh_matchneighbor): will merge vertices to undo new facets -- f%d and f%d have the same vertices (skip %d, skip %d) and same horizon ridges to f%d and f%d\n", + facet->id, newfacet->id, skip, newskip, SETfirstt_(facet->neighbors, facetT)->id, SETfirstt_(newfacet->neighbors, facetT)->id); + /* will rename a vertex (QH3053). The fault was duplicate ridges (same vertices) in different facets due to a previous rename. Expensive to detect beforehand */ } ismatch= (same == (boolT)((newfacet->toporient ^ facet->toporient))); matchfacet= SETelemt_(facet->neighbors, skip, facetT); @@ -759,35 +852,27 @@ return; } if (!qh PREmerge && !qh MERGEexact) { - qh_precision("a ridge with more than two neighbors"); - qh_fprintf(qh ferr, 6107, "qhull precision error: facets f%d, f%d and f%d meet at a ridge with more than 2 neighbors. Can not continue.\n", + qh_joggle_restart("a ridge with more than two neighbors"); + qh_fprintf(qh ferr, 6107, "qhull topology error: facets f%d, f%d and f%d meet at a ridge with more than 2 neighbors. Can not continue due to no qh.PREmerge and no 'Qx' (MERGEexact)\n", facet->id, newfacet->id, getid_(matchfacet)); - qh_errexit2(qh_ERRprec, facet, newfacet); + qh_errexit2(qh_ERRtopology, facet, newfacet); } SETelem_(newfacet->neighbors, newskip)= qh_DUPLICATEridge; newfacet->dupridge= True; - if (!newfacet->normal) - qh_setfacetplane(newfacet); qh_addhash(newfacet, qh hash_table, hashsize, hash); (*hashcount)++; - if (!facet->normal) - qh_setfacetplane(facet); if (matchfacet != qh_DUPLICATEridge) { SETelem_(facet->neighbors, skip)= qh_DUPLICATEridge; facet->dupridge= True; - if (!facet->normal) - qh_setfacetplane(facet); if (matchfacet) { matchskip= qh_setindex(matchfacet->neighbors, facet); if (matchskip<0) { - qh_fprintf(qh ferr, 6260, "qhull internal error (qh_matchneighbor): matchfacet f%d is in f%d neighbors but not vice versa. Can not continue.\n", + qh_fprintf(qh ferr, 6260, "qhull topology error (qh_matchneighbor): matchfacet f%d is in f%d neighbors but not vice versa. Can not continue.\n", matchfacet->id, facet->id); - qh_errexit2(qh_ERRqhull, matchfacet, facet); + qh_errexit2(qh_ERRtopology, matchfacet, facet); } SETelem_(matchfacet->neighbors, matchskip)= qh_DUPLICATEridge; /* matchskip>=0 by QH6260 */ matchfacet->dupridge= True; - if (!matchfacet->normal) - qh_setfacetplane(matchfacet); qh_addhash(matchfacet, qh hash_table, hashsize, hash); *hashcount += 2; } @@ -810,41 +895,52 @@ /*--------------------------------- - qh_matchnewfacets() - match newfacets in qh.newfacet_list to their newfacet neighbors + qh_matchnewfacets( ) + match new facets in qh.newfacet_list to their newfacet neighbors + all facets are simplicial returns: - qh.newfacet_list with full neighbor sets - get vertices with nth neighbor by deleting nth vertex - if qh.PREmerge/MERGEexact or qh.FORCEoutput - sets facet->flippped if flipped normal (also prevents point partitioning) - if duplicate ridges and qh.PREmerge/MERGEexact + if dupridges and merging + returns maxdupdist (>=0.0) from vertex to opposite facet sets facet->dupridge - missing neighbor links identifies extra ridges to be merging (qh_MERGEridge) + missing neighbor links identify dupridges to be merged (qh_DUPLICATEridge) + else + qh.newfacet_list with full neighbor sets + vertices for the nth neighbor match all but the nth vertex + if not merging and qh.FORCEoutput + for facets with normals (i.e., with dupridges) + sets facet->flippped for flipped normals, also prevents point partitioning notes: - newfacets already have neighbor[0] (horizon facet) + called by qh_buildcone* and qh_triangulate_facet + neighbor[0] of new facets is the horizon facet + if NEWtentative, new facets not attached to the horizon assumes qh.hash_table is NULL vertex->neighbors has not been updated yet do not allocate memory after qh.hash_table (need to free it cleanly) - + design: - delete neighbor sets for all new facets + truncate neighbor sets to horizon facet for all new facets initialize a hash table for all new facets match facet with neighbors if unmatched facets (due to duplicate ridges) for each new facet with a duplicate ridge - match it with a facet - check for flipped facets + try to match facets with the same coplanar horizon + if not all matched + for each new facet with a duplicate ridge + match it with a coplanar facet, or identify a pinched vertex + if not merging and qh.FORCEoutput + check for flipped facets */ -void qh_matchnewfacets(void /* qh.newfacet_list */) { +coordT qh_matchnewfacets(void /* qh.newfacet_list */) { int numnew=0, hashcount=0, newskip; facetT *newfacet, *neighbor; + coordT maxdupdist= 0.0, maxdist2; int dim= qh hull_dim, hashsize, neighbor_i, neighbor_n; setT *neighbors; #ifndef qh_NOtrace - int facet_i, facet_n, numfree= 0; + int facet_i, facet_n, numunused= 0; facetT *facet; #endif @@ -854,7 +950,7 @@ { /* inline qh_setzero(newfacet->neighbors, 1, qh hull_dim); */ neighbors= newfacet->neighbors; neighbors->e[neighbors->maxsize].i= dim+1; /*may be overwritten*/ - memset((char *)SETelemaddr_(neighbors, 1, void), 0, dim * SETelemsize); + memset((char *)SETelemaddr_(neighbors, 1, void), 0, (size_t)(dim * SETelemsize)); } } @@ -862,6 +958,11 @@ but every ridge could be DUPLICATEridge */ hashsize= qh_setsize(qh hash_table); FORALLnew_facets { + if (!newfacet->simplicial) { + qh_fprintf(qh ferr, 6377, "qhull internal error (qh_matchnewfacets): expecting simplicial facets on qh.newfacet_list f%d for qh_matchneighbors, qh_matchneighbor, and qh_matchdupridge. Got non-simplicial f%d\n", + qh newfacet_list->id, newfacet->id); + qh_errexit2(qh_ERRqhull, newfacet, qh newfacet_list); + } for (newskip=1; newskip0 because hull_dim>1 and numnew>0 */ qh_matchneighbor(newfacet, newskip, hashsize, &hashcount); @@ -881,20 +982,23 @@ break; } if (count != hashcount) { - qh_fprintf(qh ferr, 8088, "qh_matchnewfacets: after adding facet %d, hashcount %d != count %d\n", + qh_fprintf(qh ferr, 6266, "qhull error (qh_matchnewfacets): after adding facet %d, hashcount %d != count %d\n", newfacet->id, hashcount, count); - qh_errexit(qh_ERRqhull, newfacet, NULL); + qh_errexit(qh_ERRdebug, newfacet, NULL); } } #endif /* end of trap code */ - } - if (hashcount) { - FORALLnew_facets { - if (newfacet->dupridge) { - FOREACHneighbor_i_(newfacet) { - if (neighbor == qh_DUPLICATEridge) { - qh_matchduplicates(newfacet, neighbor_i, hashsize, &hashcount); - /* this may report MERGEfacet */ + } /* end FORALLnew_facets */ + if (hashcount) { /* all neighbors matched, except for qh_DUPLICATEridge neighbors */ + qh_joggle_restart("ridge with multiple neighbors"); + if (hashcount) { + FORALLnew_facets { + if (newfacet->dupridge) { + FOREACHneighbor_i_(newfacet) { + if (neighbor == qh_DUPLICATEridge) { + maxdist2= qh_matchdupridge(newfacet, neighbor_i, hashsize, &hashcount); + maximize_(maxdupdist, maxdist2); + } } } } @@ -907,25 +1011,21 @@ qh_errexit(qh_ERRqhull, NULL, NULL); } #ifndef qh_NOtrace - if (qh IStracing >= 2) { + if (qh IStracing >= 3) { FOREACHfacet_i_(qh hash_table) { if (!facet) - numfree++; + numunused++; } - qh_fprintf(qh ferr, 8089, "qh_matchnewfacets: %d new facets, %d unused hash entries . hashsize %d\n", - numnew, numfree, qh_setsize(qh hash_table)); + qh_fprintf(qh ferr, 3063, "qh_matchnewfacets: maxdupdist %2.2g, new facets %d, unused hash entries %d, hashsize %d\n", + maxdupdist, numnew, numunused, qh_setsize(qh hash_table)); } #endif /* !qh_NOtrace */ qh_setfree(&qh hash_table); if (qh PREmerge || qh MERGEexact) { if (qh IStracing >= 4) qh_printfacetlist(qh newfacet_list, NULL, qh_ALL); - FORALLnew_facets { - if (newfacet->normal) - qh_checkflipped(newfacet, NULL, qh_ALL); - } - }else if (qh FORCEoutput) - qh_checkflipped_all(qh newfacet_list); /* prints warnings for flipped */ + } + return maxdupdist; } /* matchnewfacets */ @@ -938,10 +1038,11 @@ returns: true if matched vertices - skip index for each set + skip index for skipB sets same iff vertices have the same orientation notes: + called by qh_matchneighbor and qh_matchdupridge assumes skipA is in A and both sets are the same size design: @@ -965,7 +1066,8 @@ }while (*(++elemAp)); if (!skipBp) skipBp= ++elemBp; - *skipB= SETindex_(verticesB, skipB); /* i.e., skipBp - verticesB */ + *skipB= SETindex_(verticesB, skipB); /* i.e., skipBp - verticesB + verticesA and verticesB are the same size, otherwise trace4 may segfault */ *same= !((skipA & 0x1) ^ (*skipB & 0x1)); /* result is 0 or 1 */ trace4((qh ferr, 4054, "qh_matchvertices: matched by skip %d(v%d) and skip %d(v%d) same? %d\n", skipA, (*skipAp)->id, *skipB, (*(skipBp-1))->id, *same)); @@ -975,7 +1077,7 @@ /*--------------------------------- - qh_newfacet() + qh_newfacet( ) return a new facet returns: @@ -999,7 +1101,7 @@ if (qh FORCEoutput && qh APPROXhull) facet->maxoutside= qh MINoutside; else - facet->maxoutside= qh DISTround; + facet->maxoutside= qh DISTround; /* same value as test for QH7082 */ #endif facet->simplicial= True; facet->good= True; @@ -1014,6 +1116,8 @@ qh_newridge() return a new ridge + notes: + caller sets qh.traceridge */ ridgeT *qh_newridge(void) { ridgeT *ridge; @@ -1023,8 +1127,7 @@ memset((char *)ridge, (size_t)0, sizeof(ridgeT)); zinc_(Ztotridges); if (qh ridge_id == UINT_MAX) { - qh_fprintf(qh ferr, 7074, "\ -qhull warning: more than 2^32 ridges. Qhull results are OK. Since the ridge ID wraps around to 0, two ridges may have the same identifier.\n"); + qh_fprintf(qh ferr, 7074, "qhull warning: more than 2^32 ridges. Qhull results are OK. Since the ridge ID wraps around to 0, two ridges may have the same identifier.\n"); } ridge->id= qh ridge_id++; trace4((qh ferr, 4056, "qh_newridge: created ridge r%d\n", ridge->id)); @@ -1035,7 +1138,7 @@ /*--------------------------------- - qh_pointid( point ) + qh_pointid( point ) return id for a point, returns qh_IDnone(-3) if null, qh_IDinterior(-2) if interior, or qh_IDunknown(-1) if not known @@ -1082,7 +1185,7 @@ qh_appendfacet */ void qh_removefacet(facetT *facet) { - facetT *next= facet->next, *previous= facet->previous; + facetT *next= facet->next, *previous= facet->previous; /* next is always defined */ if (facet == qh newfacet_list) qh newfacet_list= next; @@ -1098,7 +1201,7 @@ qh facet_list->previous= NULL; } qh num_facets--; - trace4((qh ferr, 4057, "qh_removefacet: remove f%d from facet_list\n", facet->id)); + trace4((qh ferr, 4057, "qh_removefacet: removed f%d from facet_list, newfacet_list, and visible_list\n", facet->id)); } /* removefacet */ @@ -1113,65 +1216,101 @@ decrements qh.num_vertices */ void qh_removevertex(vertexT *vertex) { - vertexT *next= vertex->next, *previous= vertex->previous; + vertexT *next= vertex->next, *previous= vertex->previous; /* next is always defined */ + trace4((qh ferr, 4058, "qh_removevertex: remove v%d from qh.vertex_list\n", vertex->id)); if (vertex == qh newvertex_list) qh newvertex_list= next; if (previous) { previous->next= next; next->previous= previous; }else { /* 1st vertex in qh vertex_list */ - qh vertex_list= vertex->next; + qh vertex_list= next; qh vertex_list->previous= NULL; } qh num_vertices--; - trace4((qh ferr, 4058, "qh_removevertex: remove v%d from vertex_list\n", vertex->id)); } /* removevertex */ /*--------------------------------- + >-------------------------------- - qh_updatevertices() + qh_update_vertexneighbors( ) update vertex neighbors and delete interior vertices returns: - if qh.VERTEXneighbors, updates neighbors for each vertex + if qh.VERTEXneighbors, if qh.newvertex_list, - removes visible neighbors from vertex neighbors + removes visible neighbors from vertex neighbors if qh.newfacet_list adds new facets to vertex neighbors - if qh.visible_list - interior vertices added to qh.del_vertices for later partitioning + if qh.visible_list + interior vertices added to qh.del_vertices for later partitioning as coplanar points + if not qh.VERTEXneighbors (not merging) + interior vertices of visible facets added to qh.del_vertices for later partitioning as coplanar points + + notes + [jan'19] split off qh_update_vertexneighbors_cone. Optimize the remaining cases in a future release + called by qh_triangulate_facet after triangulating a non-simplicial facet, followed by reset_lists + called by qh_triangulate after triangulating null and mirror facets + called by qh_all_vertexmerges after calling qh_merge_pinchedvertices design: if qh.VERTEXneighbors - deletes references to visible facets from vertex neighbors - appends new facets to the neighbor list for each vertex - checks all vertices of visible facets - removes visible facets from neighbor lists - marks unused vertices for deletion + for each vertex on newvertex_list (i.e., new vertices and vertices of new facets) + delete visible facets from vertex neighbors + for each new facet on newfacet_list + for each vertex of facet + append facet to vertex neighbors + for each visible facet on qh.visible_list + for each vertex of facet + if the vertex is not on a new facet and not itself deleted + if the vertex has a not-visible neighbor (due to merging) + remove the visible facet from the vertex's neighbors + otherwise + add the vertex to qh.del_vertices for later deletion + + if not qh.VERTEXneighbors (not merging) + for each vertex of a visible facet + if the vertex is not on a new facet and not itself deleted + add the vertex to qh.del_vertices for later deletion */ -void qh_updatevertices(void /*qh.newvertex_list, newfacet_list, visible_list*/) { +void qh_update_vertexneighbors(void /* qh.newvertex_list, newfacet_list, visible_list */) { facetT *newfacet= NULL, *neighbor, **neighborp, *visible; vertexT *vertex, **vertexp; + int neighborcount= 0; - trace3((qh ferr, 3013, "qh_updatevertices: delete interior vertices and update vertex->neighbors\n")); if (qh VERTEXneighbors) { + trace3((qh ferr, 3013, "qh_update_vertexneighbors: update v.neighbors for qh.newvertex_list (v%d) and qh.newfacet_list (f%d)\n", + getid_(qh newvertex_list), getid_(qh newfacet_list))); FORALLvertex_(qh newvertex_list) { + neighborcount= 0; FOREACHneighbor_(vertex) { - if (neighbor->visible) + if (neighbor->visible) { + neighborcount++; SETref_(neighbor)= NULL; + } + } + if (neighborcount) { + trace4((qh ferr, 4046, "qh_update_vertexneighbors: delete %d of %d vertex neighbors for v%d. Removes to-be-deleted, visible facets\n", + neighborcount, qh_setsize(vertex->neighbors), vertex->id)); + qh_setcompact(vertex->neighbors); } - qh_setcompact(vertex->neighbors); } FORALLnew_facets { - FOREACHvertex_(newfacet->vertices) - qh_setappend(&vertex->neighbors, newfacet); + if (qh first_newfacet && newfacet->id >= qh first_newfacet) { + FOREACHvertex_(newfacet->vertices) + qh_setappend(&vertex->neighbors, newfacet); + }else { /* called after qh_merge_pinchedvertices. In 7-D, many more neighbors than new facets. qh_setin is expensive */ + FOREACHvertex_(newfacet->vertices) + qh_setunique(&vertex->neighbors, newfacet); + } } + trace3((qh ferr, 3058, "qh_update_vertexneighbors: delete interior vertices for qh.visible_list (f%d)\n", + getid_(qh visible_list))); FORALLvisible_facets { FOREACHvertex_(visible->vertices) { - if (!vertex->newlist && !vertex->deleted) { + if (!vertex->newfacet && !vertex->deleted) { FOREACHneighbor_(vertex) { /* this can happen under merging */ if (!neighbor->visible) break; @@ -1181,25 +1320,128 @@ else { vertex->deleted= True; qh_setappend(&qh del_vertices, vertex); - trace2((qh ferr, 2041, "qh_updatevertices: delete vertex p%d(v%d) in f%d\n", + trace2((qh ferr, 2041, "qh_update_vertexneighbors: delete interior vertex p%d(v%d) of visible f%d\n", qh_pointid(vertex->point), vertex->id, visible->id)); } } } } }else { /* !VERTEXneighbors */ + trace3((qh ferr, 3058, "qh_update_vertexneighbors: delete old vertices for qh.visible_list (f%d)\n", + getid_(qh visible_list))); FORALLvisible_facets { FOREACHvertex_(visible->vertices) { - if (!vertex->newlist && !vertex->deleted) { + if (!vertex->newfacet && !vertex->deleted) { vertex->deleted= True; qh_setappend(&qh del_vertices, vertex); - trace2((qh ferr, 2042, "qh_updatevertices: delete vertex p%d(v%d) in f%d\n", + trace2((qh ferr, 2042, "qh_update_vertexneighbors: will delete interior vertex p%d(v%d) of visible f%d\n", qh_pointid(vertex->point), vertex->id, visible->id)); } } } } -} /* updatevertices */ +} /* update_vertexneighbors */ + +/*--------------------------------- + + qh_update_vertexneighbors_cone( ) + update vertex neighbors for a cone of new facets and delete interior vertices + + returns: + if qh.VERTEXneighbors, + if qh.newvertex_list, + removes visible neighbors from vertex neighbors + if qh.newfacet_list + adds new facets to vertex neighbors + if qh.visible_list + interior vertices added to qh.del_vertices for later partitioning as coplanar points + if not qh.VERTEXneighbors (not merging) + interior vertices of visible facets added to qh.del_vertices for later partitioning as coplanar points + + notes + called by qh_addpoint after create cone and before premerge + design: + if qh.VERTEXneighbors + for each vertex on newvertex_list (i.e., new vertices and vertices of new facets) + delete visible facets from vertex neighbors + for each new facet on newfacet_list + for each vertex of facet + append facet to vertex neighbors + for each visible facet on qh.visible_list + for each vertex of facet + if the vertex is not on a new facet and not itself deleted + if the vertex has a not-visible neighbor (due to merging) + remove the visible facet from the vertex's neighbors + otherwise + add the vertex to qh.del_vertices for later deletion + + if not qh.VERTEXneighbors (not merging) + for each vertex of a visible facet + if the vertex is not on a new facet and not itself deleted + add the vertex to qh.del_vertices for later deletion +*/ +void qh_update_vertexneighbors_cone(void /* qh.newvertex_list, newfacet_list, visible_list */) { + facetT *newfacet= NULL, *neighbor, **neighborp, *visible; + vertexT *vertex, **vertexp; + int delcount= 0; + + if (qh VERTEXneighbors) { + trace3((qh ferr, 3059, "qh_update_vertexneighbors_cone: update v.neighbors for qh.newvertex_list (v%d) and qh.newfacet_list (f%d)\n", + getid_(qh newvertex_list), getid_(qh newfacet_list))); + FORALLvertex_(qh newvertex_list) { + delcount= 0; + FOREACHneighbor_(vertex) { + if (neighbor->visible) { /* alternative design is a loop over visible facets, but needs qh_setdel() */ + delcount++; + qh_setdelnth(vertex->neighbors, SETindex_(vertex->neighbors, neighbor)); + neighborp--; /* repeat */ + } + } + if (delcount) { + trace4((qh ferr, 4021, "qh_update_vertexneighbors_cone: deleted %d visible vertexneighbors of v%d\n", + delcount, vertex->id)); + } + } + FORALLnew_facets { + FOREACHvertex_(newfacet->vertices) + qh_setappend(&vertex->neighbors, newfacet); + } + trace3((qh ferr, 3065, "qh_update_vertexneighbors_cone: delete interior vertices, if any, for qh.visible_list (f%d)\n", + getid_(qh visible_list))); + FORALLvisible_facets { + FOREACHvertex_(visible->vertices) { + if (!vertex->newfacet && !vertex->deleted) { + FOREACHneighbor_(vertex) { /* this can happen under merging, qh_checkfacet QH4025 */ + if (!neighbor->visible) + break; + } + if (neighbor) + qh_setdel(vertex->neighbors, visible); + else { + vertex->deleted= True; + qh_setappend(&qh del_vertices, vertex); + trace2((qh ferr, 2102, "qh_update_vertexneighbors_cone: will delete interior vertex p%d(v%d) of visible f%d\n", + qh_pointid(vertex->point), vertex->id, visible->id)); + } + } + } + } + }else { /* !VERTEXneighbors */ + trace3((qh ferr, 3066, "qh_update_vertexneighbors_cone: delete interior vertices for qh.visible_list (f%d)\n", + getid_(qh visible_list))); + FORALLvisible_facets { + FOREACHvertex_(visible->vertices) { + if (!vertex->newfacet && !vertex->deleted) { + vertex->deleted= True; + qh_setappend(&qh del_vertices, vertex); + trace2((qh ferr, 2059, "qh_update_vertexneighbors_cone: will delete interior vertex p%d(v%d) of visible f%d\n", + qh_pointid(vertex->point), vertex->id, visible->id)); + } + } + } + } +} /* update_vertexneighbors_cone */ diff -Nru qhull-2015.2/src/libqhull/poly.h qhull-2020.2/src/libqhull/poly.h --- qhull-2015.2/src/libqhull/poly.h 2016-01-17 21:51:15.000000000 +0000 +++ qhull-2020.2/src/libqhull/poly.h 2020-06-02 17:21:23.000000000 +0000 @@ -6,9 +6,9 @@ see qh-poly.htm, libqhull.h and poly.c - Copyright (c) 1993-2015 The Geometry Center. - $Id: //main/2015/qhull/src/libqhull/poly.h#3 $$Change: 2047 $ - $DateTime: 2016/01/04 22:03:18 $$Author: bbarber $ + Copyright (c) 1993-2020 The Geometry Center. + $Id: //main/2019/qhull/src/libqhull/poly.h#5 $$Change: 2963 $ + $DateTime: 2020/06/03 19:31:01 $$Author: bbarber $ */ #ifndef qhDEFpoly @@ -21,7 +21,7 @@ /*---------------------------------- - ALGORITHMfault + qh_ALGORITHMfault use as argument to checkconvex() to report errors during buildhull */ #define qh_ALGORITHMfault 0 @@ -29,7 +29,7 @@ /*---------------------------------- - DATAfault + qh_DATAfault use as argument to checkconvex() to report errors during initialhull */ #define qh_DATAfault 1 @@ -37,22 +37,23 @@ /*---------------------------------- - DUPLICATEridge + qh_DUPLICATEridge special value for facet->neighbor to indicate a duplicate ridge notes: - set by matchneighbor, used by matchmatch and mark_dupridge + set by qh_matchneighbor for qh_matchdupridge */ #define qh_DUPLICATEridge (facetT *)1L /*---------------------------------- - MERGEridge flag in facet - special value for facet->neighbor to indicate a merged ridge + qh_MERGEridge flag in facet + special value for facet->neighbor to indicate a duplicate ridge that needs merging notes: - set by matchneighbor, used by matchmatch and mark_dupridge + set by qh_matchnewfacets..qh_matchdupridge from qh_DUPLICATEridge + used by qh_mark_dupridges to set facet->mergeridge, facet->mergeridge2 from facet->dupridge */ #define qh_MERGEridge (facetT *)2L @@ -74,7 +75,7 @@ see: FORALLfacets */ -#define FORALLfacet_( facetlist ) if (facetlist ) for ( facet=( facetlist ); facet && facet->next; facet= facet->next ) +#define FORALLfacet_( facetlist ) if (facetlist) for ( facet=(facetlist); facet && facet->next; facet= facet->next ) /*---------------------------------- @@ -86,7 +87,7 @@ uses 'facetT *newfacet;' at exit, newfacet==NULL */ -#define FORALLnew_facets for ( newfacet=qh newfacet_list;newfacet && newfacet->next;newfacet=newfacet->next ) +#define FORALLnew_facets for ( newfacet=qh newfacet_list; newfacet && newfacet->next; newfacet=newfacet->next ) /*---------------------------------- @@ -212,16 +213,17 @@ void qh_attachnewfacets(void /* qh.visible_list, qh.newfacet_list */); boolT qh_checkflipped(facetT *facet, realT *dist, boolT allerror); void qh_delfacet(facetT *facet); -void qh_deletevisible(void /*qh.visible_list, qh.horizon_list*/); +void qh_deletevisible(void /* qh.visible_list, qh.horizon_list */); setT *qh_facetintersect(facetT *facetA, facetT *facetB, int *skipAp,int *skipBp, int extra); int qh_gethash(int hashsize, setT *set, int size, int firstindex, void *skipelem); +facetT *qh_getreplacement(facetT *visible); facetT *qh_makenewfacet(setT *vertices, boolT toporient, facetT *facet); -void qh_makenewplanes(void /* newfacet_list */); +void qh_makenewplanes(void /* qh.newfacet_list */); facetT *qh_makenew_nonsimplicial(facetT *visible, vertexT *apex, int *numnew); facetT *qh_makenew_simplicial(facetT *visible, vertexT *apex, int *numnew); void qh_matchneighbor(facetT *newfacet, int newskip, int hashsize, int *hashcount); -void qh_matchnewfacets(void); +coordT qh_matchnewfacets(void); boolT qh_matchvertices(int firstindex, setT *verticesA, int skipA, setT *verticesB, int *skipB, boolT *same); facetT *qh_newfacet(void); @@ -229,23 +231,25 @@ int qh_pointid(pointT *point); void qh_removefacet(facetT *facet); void qh_removevertex(vertexT *vertex); -void qh_updatevertices(void); +void qh_update_vertexneighbors(void); +void qh_update_vertexneighbors_cone(void); /*========== -prototypes poly2.c in alphabetical order ===========*/ -void qh_addhash(void* newelem, setT *hashtable, int hashsize, int hash); +boolT qh_addfacetvertex(facetT *facet, vertexT *newvertex); +void qh_addhash(void *newelem, setT *hashtable, int hashsize, int hash); void qh_check_bestdist(void); -void qh_check_dupridge(facetT *facet1, realT dist1, facetT *facet2, realT dist2); void qh_check_maxout(void); void qh_check_output(void); -void qh_check_point(pointT *point, facetT *facet, realT *maxoutside, realT *maxdist, facetT **errfacet1, facetT **errfacet2); +void qh_check_point(pointT *point, facetT *facet, realT *maxoutside, realT *maxdist, facetT **errfacet1, facetT **errfacet2, int *errcount); void qh_check_points(void); void qh_checkconvex(facetT *facetlist, int fault); void qh_checkfacet(facetT *facet, boolT newmerge, boolT *waserrorp); void qh_checkflipped_all(facetT *facetlist); +boolT qh_checklists(facetT *facetlist); void qh_checkpolygon(facetT *facetlist); -void qh_checkvertex(vertexT *vertex); +void qh_checkvertex(vertexT *vertex, boolT allchecks, boolT *waserrorp); void qh_clearcenters(qh_CENTER type); void qh_createsimplex(setT *vertices); void qh_delridge(ridgeT *ridge); @@ -254,7 +258,7 @@ facetT *qh_findbestfacet(pointT *point, boolT bestoutside, realT *bestdist, boolT *isoutside); facetT *qh_findbestlower(facetT *upperfacet, pointT *point, realT *bestdistp, int *numpart); -facetT *qh_findfacet_all(pointT *point, realT *bestdist, boolT *isoutside, +facetT *qh_findfacet_all(pointT *point, boolT noupper, realT *bestdist, boolT *isoutside, int *numpart); int qh_findgood(facetT *facetlist, int goodhorizon); void qh_findgood_all(facetT *facetlist); @@ -265,32 +269,34 @@ void qh_initialhull(setT *vertices); setT *qh_initialvertices(int dim, setT *maxpoints, pointT *points, int numpoints); vertexT *qh_isvertex(pointT *point, setT *vertices); -vertexT *qh_makenewfacets(pointT *point /*horizon_list, visible_list*/); -void qh_matchduplicates(facetT *atfacet, int atskip, int hashsize, int *hashcount); +vertexT *qh_makenewfacets(pointT *point /* qh.horizon_list, visible_list */); +coordT qh_matchdupridge(facetT *atfacet, int atskip, int hashsize, int *hashcount); void qh_nearcoplanar(void /* qh.facet_list */); vertexT *qh_nearvertex(facetT *facet, pointT *point, realT *bestdistp); int qh_newhashtable(int newsize); vertexT *qh_newvertex(pointT *point); +facetT *qh_nextfacet2d(facetT *facet, vertexT **nextvertexp); ridgeT *qh_nextridge3d(ridgeT *atridge, facetT *facet, vertexT **vertexp); -void qh_outcoplanar(void /* facet_list */); +vertexT *qh_opposite_vertex(facetT *facetA, facetT *neighbor); +void qh_outcoplanar(void /* qh.facet_list */); pointT *qh_point(int id); void qh_point_add(setT *set, pointT *point, void *elem); -setT *qh_pointfacet(void /*qh.facet_list*/); -setT *qh_pointvertex(void /*qh.facet_list*/); +setT *qh_pointfacet(void /* qh.facet_list */); +setT *qh_pointvertex(void /* qh.facet_list */); void qh_prependfacet(facetT *facet, facetT **facetlist); void qh_printhashtable(FILE *fp); void qh_printlists(void); -void qh_resetlists(boolT stats, boolT resetVisible /*qh.newvertex_list qh.newfacet_list qh.visible_list*/); +void qh_replacefacetvertex(facetT *facet, vertexT *oldvertex, vertexT *newvertex); +void qh_resetlists(boolT stats, boolT resetVisible /* qh.newvertex_list qh.newfacet_list qh.visible_list */); void qh_setvoronoi_all(void); -void qh_triangulate(void /*qh.facet_list*/); +void qh_triangulate(void /* qh.facet_list */); void qh_triangulate_facet(facetT *facetA, vertexT **first_vertex); void qh_triangulate_link(facetT *oldfacetA, facetT *facetA, facetT *oldfacetB, facetT *facetB); void qh_triangulate_mirror(facetT *facetA, facetT *facetB); void qh_triangulate_null(facetT *facetA); void qh_vertexintersect(setT **vertexsetA,setT *vertexsetB); setT *qh_vertexintersect_new(setT *vertexsetA,setT *vertexsetB); -void qh_vertexneighbors(void /*qh.facet_list*/); +void qh_vertexneighbors(void /* qh.facet_list */); boolT qh_vertexsubset(setT *vertexsetA, setT *vertexsetB); - #endif /* qhDEFpoly */ diff -Nru qhull-2015.2/src/libqhull/qh-geom.htm qhull-2020.2/src/libqhull/qh-geom.htm --- qhull-2015.2/src/libqhull/qh-geom.htm 2016-01-17 21:51:15.000000000 +0000 +++ qhull-2020.2/src/libqhull/qh-geom.htm 2020-08-16 18:16:58.000000000 +0000 @@ -9,8 +9,8 @@

      Up: Home page for Qhull
      -Up: Qhull manual: Table of Contents
      +href="http://www.qhull.org">Home page for Qhull (local)
      +Up: Qhull manual: contents
      Up: ProgramsOptionsOutput @@ -20,9 +20,8 @@ • QhullPrecisionTrace -• Functions
      -Up: Qhull code: Table of Contents
      -To: Qhull functions, macros, and data structures
      +• Functions (local)
      +Up: Qhull code
      To: GeomGlobalIoMemMergePoly @@ -55,7 +54,7 @@ in halfspace computation is accounted for by computing the distance from vertices to the halfspace.

      -

      Copyright © 1995-2015 C.B. Barber

      +

      Copyright © 1995-2020 C.B. Barber


      » Geom Global • @@ -219,7 +218,11 @@ update best new facet with horizon facets

    • qh_findbestnew find best new facet for point
    • -
    • qh_getarea get area of all +
    • qh_furthestnewvertex return +furthest new vertex for facet
    • +
    • qh_furthestvertex return +furthest vertex in facetA above facetB
    • +
    • qh_getarea get area and volume of all facets in facetlist, collect statistics
    • qh_getcentrum return centrum for a facet
    • @@ -238,31 +241,37 @@ the hyperplane for a facet
    • qh_sharpnewfacets true if new facets contains a sharp corner
    • +
    • qh_vertex_bestdist +return nearest distance between vertices, except 'skip'
    • +
    • qh_vertex_isbelow true if +vertexA is below vertexB's simplicial facets, or least above

    »geometric roundoff functions

    • qh_detjoggle determine -default joggle for points and distance roundoff error
    • +default joggle for points and distance roundoff error +
    • qh_detmaxoutside +determine qh.MAXoutside target for qh_RATIO... tests
    • qh_detroundoff -determine maximum roundoff error and other precision constants
    • +determine maximum roundoff error and other precision constants
    • qh_distround compute maximum roundoff error due to a distance computation to a -normalized hyperplane
    • +normalized hyperplane
    • qh_divzero divide by a number that is nearly zero
    • qh_maxouter return maximum outer plane
    • qh_outerinner return actual -outer and inner planes +outer and inner planes


    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    +Home page for +Qhull (local)
    +Up: Qhull manual: contents
    Up: ProgramsOptionsOutput @@ -272,9 +281,8 @@ • QhullPrecisionTrace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    +• Functions (local)
    +Up: Qhull code
    To: GeomGlobalIoMemMerge @@ -289,7 +297,7 @@ src="../../html/qh--geom.gif" align="middle" width="40" height="40">The Geometry Center Home Page

    Comments to: qhull@qhull.org -
    +
    Created: May 2, 1997 --- Last modified: see top

    diff -Nru qhull-2015.2/src/libqhull/qh-globa.htm qhull-2020.2/src/libqhull/qh-globa.htm --- qhull-2015.2/src/libqhull/qh-globa.htm 2016-01-17 21:51:15.000000000 +0000 +++ qhull-2020.2/src/libqhull/qh-globa.htm 2020-08-16 18:17:27.000000000 +0000 @@ -9,8 +9,8 @@

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +href="http://www.qhull.org">Home page for Qhull (local)
    +Up: Qhull manual: contents
    Up: ProgramsOptionsOutput @@ -20,9 +20,8 @@ • QhullPrecisionTrace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    +• Functions (local)
    +Up: Qhull code
    To: GeomGlobalIoMemMergePoly @@ -43,7 +42,7 @@ QHpointer.

    -

    Copyright © 1995-2015 C.B. Barber

    +

    Copyright © 1995-2020 C.B. Barber


    » Geom Global • @@ -65,10 +64,10 @@ variables

    »libqhull.h other @@ -123,6 +122,10 @@ point to the convex hull

  • qh_findhorizon find the horizon and visible facets for a point
  • +
  • qh_buildcone +build cone of new facets from furthest to the horizon
  • +
  • qh_premerge +pre-merge non-convex facets
  • qh_partitionvisible partition points from facets in qh.visible_list to facets in qh.newfacet_list
  • @@ -131,16 +134,14 @@ outside a facet
  • qh_partitioncoplanar partition coplanar point into a facet
  • -
  • qh_precision restart on precision errors if not merging and if 'QJn'
  • +
  • qh_joggle_restart +if joggle ('QJn') and not merging, restart on precision errors
  • »Top-level routines for initializing and terminating Qhull (in other modules)

    -

    »Access and -predicate functions

    +

    »Access and predicate functions

    • qh_setendpointer return pointer to NULL terminator of a set
    • @@ -211,6 +209,8 @@ a set
    • qh_setlarger return a larger set with the same elements
    • +
    • qh_setlarger_quick return +True if newsize fits in quick memory
    • qh_setreplace replace one element with another in a set
    • qh_setunique add an @@ -274,9 +274,9 @@


      Up: -Home page for -Qhull
      -Up: Qhull manual: Table of Contents
      +Home page for +Qhull (local)
      +Up: Qhull manual: contents
      Up: ProgramsOptionsOutput @@ -286,9 +286,8 @@ • QhullPrecisionTrace -• Functions
      -Up: Qhull code: Table of Contents
      -To: Qhull functions, macros, and data structures
      +• Functions (local)
      +Up: Qhull code
      To: GeomGlobalIoMemMerge @@ -302,7 +301,7 @@ src="../../html/qh--geom.gif" align="middle" width="40" height="40">The Geometry Center Home Page

      Comments to: qhull@qhull.org -
      +
      Created: May 2, 1997 --- Last modified: see top

      diff -Nru qhull-2015.2/src/libqhull/qh-stat.htm qhull-2020.2/src/libqhull/qh-stat.htm --- qhull-2015.2/src/libqhull/qh-stat.htm 2016-01-17 21:51:15.000000000 +0000 +++ qhull-2020.2/src/libqhull/qh-stat.htm 2020-08-16 18:19:32.000000000 +0000 @@ -9,8 +9,8 @@

      Up: Home page for Qhull
      -Up: Qhull manual: Table of Contents
      +href="http://www.qhull.org">Home page for Qhull (local)
      +Up: Qhull manual: contents
      Up: ProgramsOptionsOutput @@ -20,9 +20,8 @@ • QhullPrecisionTrace -• Functions
      -Up: Qhull code: Table of Contents
      -To: Qhull functions, macros, and data structures
      +• Functions (local)
      +Up: Qhull code
      To: GeomGlobalIoMemMergePoly @@ -42,7 +41,7 @@ may be turned off in user.h. If so, all but the 'zz' statistics are ignored.

      -

      Copyright © 1995-2015 C.B. Barber

      +

      Copyright © 1995-2020 C.B. Barber


      » Geom Global @@ -129,9 +128,9 @@


      Up: -Home page for -Qhull
      -Up: Qhull manual: Table of Contents
      +Home page for +Qhull (local)
      +Up: Qhull manual: contents
      Up: ProgramsOptionsOutput @@ -141,9 +140,8 @@ • QhullPrecisionTrace -• Functions
      -Up: Qhull code: Table of Contents
      -To: Qhull functions, macros, and data structures
      +• Functions (local)
      +Up: Qhull code
      To: GeomGlobalIoMemMerge @@ -157,7 +155,7 @@ src="../../html/qh--geom.gif" align="middle" width="40" height="40">The Geometry Center Home Page

      Comments to: qhull@qhull.org -
      +
      Created: May 2, 1997 --- Last modified: see top

      diff -Nru qhull-2015.2/src/libqhull/qhull_a.h qhull-2020.2/src/libqhull/qhull_a.h --- qhull-2015.2/src/libqhull/qhull_a.h 2016-01-18 13:32:14.000000000 +0000 +++ qhull-2020.2/src/libqhull/qhull_a.h 2020-05-22 02:00:58.000000000 +0000 @@ -3,7 +3,6 @@ qhull_a.h all header files for compiling qhull with non-reentrant code - included before C++ headers for user_r.h:QHULL_CRTDBG see qh-qhull.htm @@ -13,9 +12,9 @@ defines internal functions for libqhull.c global.c - Copyright (c) 1993-2015 The Geometry Center. - $Id: //main/2015/qhull/src/libqhull/qhull_a.h#4 $$Change: 2064 $ - $DateTime: 2016/01/18 12:36:08 $$Author: bbarber $ + Copyright (c) 1993-2020 The Geometry Center. + $Id: //main/2019/qhull/src/libqhull/qhull_a.h#2 $$Change: 2953 $ + $DateTime: 2020/05/21 22:05:32 $$Author: bbarber $ Notes: grep for ((" and (" to catch fprintf("lkasdjf"); full parens around (x?y:z) @@ -25,7 +24,7 @@ #ifndef qhDEFqhulla #define qhDEFqhulla 1 -#include "libqhull.h" /* Includes user_r.h and data types */ +#include "libqhull.h" /* Includes user.h and data types */ #include "stat.h" #include "random.h" @@ -113,17 +112,20 @@ void qh_qhull(void); boolT qh_addpoint(pointT *furthest, facetT *facet, boolT checkdist); +void qh_build_withrestart(void); +vertexT *qh_buildcone(pointT *furthest, facetT *facet, int goodhorizon, facetT **retryfacet); +boolT qh_buildcone_mergepinched(vertexT *apex, facetT *facet, facetT **retryfacet); +boolT qh_buildcone_onlygood(vertexT *apex, int goodhorizon); void qh_buildhull(void); void qh_buildtracing(pointT *furthest, facetT *facet); -void qh_build_withrestart(void); void qh_errexit2(int exitcode, facetT *facet, facetT *otherfacet); void qh_findhorizon(pointT *point, facetT *facet, int *goodvisible,int *goodhorizon); pointT *qh_nextfurthest(facetT **visible); void qh_partitionall(setT *vertices, pointT *points,int npoints); -void qh_partitioncoplanar(pointT *point, facetT *facet, realT *dist); +void qh_partitioncoplanar(pointT *point, facetT *facet, realT *dist, boolT allnew); void qh_partitionpoint(pointT *point, facetT *facet); void qh_partitionvisible(boolT allpoints, int *numpoints); -void qh_precision(const char *reason); +void qh_joggle_restart(const char *reason); void qh_printsummary(FILE *fp); /***** -global.c internal prototypes (alphabetical) ***********************/ diff -Nru qhull-2015.2/src/libqhull/qhull-exports.def qhull-2020.2/src/libqhull/qhull-exports.def --- qhull-2015.2/src/libqhull/qhull-exports.def 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/src/libqhull/qhull-exports.def 2020-09-02 02:14:22.000000000 +0000 @@ -1,16 +1,22 @@ -; qhull-exports.def -- msvc module-definition file +; qhull-exports.def -- MSVC module-definition file ; ; Generated from depends.exe by cut-and-paste of exported symbols by mingw gcc -; [mar'11] 399 symbols +; [jan'14] 391 symbols ; Annotate as DATA qh_last_random qh_qh qh_qhstat qhmem rbox rbox_inuse ; Annotate as __declspec for outside access in win32 -- qh_qh qh_qhstat ; Same as ../libqhullp/qhull_p-exports.def without qh_save_qhull and qh_restore_qhull ; -; $Id: //main/2015/qhull/src/libqhull/qhull-exports.def#3 $$Change: 2047 $ -; $DateTime: 2016/01/04 22:03:18 $$Author: bbarber $ -; +; Referenced by CMakeLists/add_library, libqhull.pro/DEF_FILE, +; and libqhull.vcxproj/Linker/Input/Module Definition File +; +; If qh_NOmerge, use qhull_r-nomerge-exports.def +; Created by -- grep -vE 'qh_all_merges|qh_appendmergeset|qh_basevertices|qh_check_dupridge|qh_checkconnect|qh_compare_facetmerge|qh_comparevisit|qh_copynonconvex|qh_degen_redundant_facet|qh_delridge_merge|qh_find_newvertex|qh_findbest_test|qh_findbestneighbor|qh_flippedmerges|qh_forcedmerges|qh_getmergeset|qh_getmergeset_initial|qh_hashridge|qh_hashridge_find|qh_makeridges|qh_mark_dupridges|qh_maydropneighbor|qh_merge_degenredundant|qh_merge_nonconvex|qh_mergecycle|qh_mergecycle_all|qh_mergecycle_facets|qh_mergecycle_neighbors|qh_mergecycle_ridges|qh_mergecycle_vneighbors|qh_mergefacet|qh_mergefacet2d|qh_mergeneighbors|qh_mergeridges|qh_mergesimplex|qh_mergevertex_del|qh_mergevertex_neighbors|qh_mergevertices|qh_nearcoplanar|qh_nearvertex|qh_neighbor_intersections|qh_newhashtable|qh_newvertex|qh_newvertices|qh_nextridge3d|qh_reducevertices|qh_redundant_vertex|qh_remove_extravertices|qh_rename_sharedvertex|qh_renameridgevertex|qh_renamevertex|qh_test_appendmerge|qh_test_degen_neighbors|qh_test_redundant_neighbors|qh_test_vneighbors|qh_tracemerge|qh_tracemerging|qh_triangulate_facet|qh_triangulate_link|qh_triangulate_mirror|qh_triangulate_null|qh_updatetested|qh_vertexridges|qh_vertexridges_facet|qh_willdelete' qhull-exports.def >qhull-nomerge-exports.def +; +; $Id: //main/2019/qhull/src/libqhull/qhull-exports.def#5 $$Change: 3037 $ +; $DateTime: 2020/09/03 17:28:32 $$Author: bbarber $ +; ; Define qhull_VERSION in CMakeLists.txt, Makefile, qhull-exports.def, qhull_p-exports.def, qhull_r-exports.def, and qhull-warn.pri -VERSION 7.0 +VERSION 8.0 EXPORTS qh_addhash qh_addpoint @@ -46,10 +52,12 @@ qh_check_points qh_checkconnect qh_checkconvex +qh_checkdelridge qh_checkfacet qh_checkflags qh_checkflipped qh_checkflipped_all +qh_checklists qh_checkpolygon qh_checkvertex qh_checkzero @@ -60,9 +68,7 @@ qh_compare_facetarea qh_compare_facetmerge qh_compare_facetvisit -qh_compare_vertexpoint -qh_compareangle -qh_comparemerge +qh_compare_nummerge qh_comparevisit qh_copyfilename qh_copynonconvex @@ -71,10 +77,9 @@ qh_createsimplex qh_crossproduct qh_degen_redundant_facet -qh_degen_redundant_neighbors qh_deletevisible qh_delfacet -qh_delridge +qh_delridge_merge qh_delvertex qh_determinant qh_detjoggle @@ -160,6 +165,7 @@ qh_initthresholds qh_inthresholds qh_isvertex +qh_joggle_restart qh_joggleinput ; Mark as DATA, otherwise links a separate qh_last_random. No __declspec. qh_last_random DATA @@ -174,7 +180,7 @@ qh_mark_dupridges qh_markkeep qh_markvoronoi -qh_matchduplicates +qh_matchdupridge qh_matchneighbor qh_matchnewfacets qh_matchvertices @@ -220,6 +226,7 @@ qh_newstats qh_newvertex qh_newvertices +qh_nextfacet2d qh_nextfurthest qh_nextridge3d qh_normalize @@ -244,7 +251,6 @@ qh_pointid qh_pointvertex qh_postmerge -qh_precision qh_premerge qh_prepare_output qh_prependfacet @@ -277,8 +283,11 @@ qh_printfacets qh_printhashtable qh_printhelp_degenerate +qh_printhelp_internal qh_printhelp_narrowhull qh_printhelp_singular +qh_printhelp_topology +qh_printhelp_wide qh_printhyperplaneintersection qh_printline3geom qh_printlists @@ -367,6 +376,7 @@ qh_setin qh_setindex qh_setlarger +qh_setlarger_quick qh_setlast qh_setnew qh_setnew_delnthsorted @@ -390,6 +400,8 @@ qh_strtod qh_strtol qh_test_appendmerge +qh_test_degen_neighbors +qh_test_redundant_neighbors qh_test_vneighbors qh_tracemerge qh_tracemerging @@ -399,7 +411,8 @@ qh_triangulate_mirror qh_triangulate_null qh_updatetested -qh_updatevertices +qh_update_vertexneighbors +qh_update_vertexneighbors_cone qh_user_memsizes qh_version qh_version2 @@ -413,5 +426,5 @@ qh_willdelete ; Mark as DATA, otherwise links a separate qhmem. No __declspec qhmem DATA -rbox DATA +rbox DATA rbox_inuse DATA diff -Nru qhull-2015.2/src/libqhull/qhull-nomerge-exports.def qhull-2020.2/src/libqhull/qhull-nomerge-exports.def --- qhull-2015.2/src/libqhull/qhull-nomerge-exports.def 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/src/libqhull/qhull-nomerge-exports.def 2020-09-02 02:15:25.000000000 +0000 @@ -0,0 +1,358 @@ +; qhull-nomerge-exports.def -- msvc module-definition file +; +; Generated from depends.exe by cut-and-paste of exported symbols by mingw gcc +; [jan'14] 391 symbols +; Annotate as DATA qh_last_random qh_qh qh_qhstat qhmem rbox rbox_inuse +; Annotate as __declspec for outside access in win32 -- qh_qh qh_qhstat +; Same as ../libqhullp/qhull_p-nomerge-exports.def without qh_save_qhull and qh_restore_qhull +; +; $Id: //main/2019/qhull/src/libqhull/qhull-nomerge-exports.def#5 $$Change: 3037 $ +; $DateTime: 2020/09/03 17:28:32 $$Author: bbarber $ +; +; Define qhull_VERSION in CMakeLists.txt, Makefile, qhull-exports.def, qhull_p-exports.def, qhull_r-exports.def, and qhull-warn.pri +VERSION 8.0 +EXPORTS +qh_addhash +qh_addpoint +qh_allstatA +qh_allstatB +qh_allstatC +qh_allstatD +qh_allstatE +qh_allstatE2 +qh_allstatF +qh_allstatG +qh_allstatH +qh_allstatI +qh_allstatistics +qh_appendfacet +qh_appendprint +qh_appendvertex +qh_argv_to_command +qh_argv_to_command_size +qh_attachnewfacets +qh_backnormal +qh_build_withrestart +qh_buildhull +qh_buildtracing +qh_check_bestdist +qh_check_maxout +qh_check_output +qh_check_point +qh_check_points +qh_checkconvex +qh_checkdelridge +qh_checkfacet +qh_checkflags +qh_checkflipped +qh_checkflipped_all +qh_checkpolygon +qh_checkvertex +qh_checkzero +qh_clear_outputflags +qh_clearcenters +qh_clock +qh_collectstatistics +qh_compare_facetarea +qh_compare_facetvisit +qh_compare_nummerge +qh_copyfilename +qh_copypoints +qh_countfacets +qh_createsimplex +qh_crossproduct +qh_deletevisible +qh_delfacet +qh_delvertex +qh_determinant +qh_detjoggle +qh_detroundoff +qh_detsimplex +qh_detvnorm +qh_detvridge +qh_detvridge3 +qh_dfacet +qh_distnorm +qh_distplane +qh_distround +qh_divzero +qh_dvertex +qh_eachvoronoi +qh_eachvoronoi_all +qh_errexit +qh_errexit2 +qh_errexit_rbox +qh_errprint +qh_exit +qh_facet2point +qh_facet3vertex +qh_facetarea +qh_facetarea_simplex +qh_facetcenter +qh_facetintersect +qh_facetvertices +qh_findbest +qh_findbestfacet +qh_findbesthorizon +qh_findbestlower +qh_findbestnew +qh_findfacet_all +qh_findgood +qh_findgood_all +qh_findgooddist +qh_findhorizon +qh_fprintf +qh_fprintf_rbox +qh_fprintf_stderr +qh_free +qh_freebuffers +qh_freebuild +qh_freeqhull +qh_freeqhull2 +qh_freestatistics +qh_furthestnext +qh_furthestout +qh_gausselim +qh_geomplanes +qh_getangle +qh_getarea +qh_getcenter +qh_getcentrum +qh_getdistance +qh_gethash +qh_gram_schmidt +qh_infiniteloop +qh_init_A +qh_init_B +qh_init_qhull_command +qh_initbuild +qh_initflags +qh_initialhull +qh_initialvertices +qh_initqhull_buffers +qh_initqhull_globals +qh_initqhull_mem +qh_initqhull_outputflags +qh_initqhull_start +qh_initqhull_start2 +qh_initstatistics +qh_initthresholds +qh_inthresholds +qh_isvertex +qh_joggle_restart +qh_joggleinput +; Mark as DATA, otherwise links a separate qh_last_random. No __declspec. +qh_last_random DATA +qh_lib_check +qh_makenew_nonsimplicial +qh_makenew_simplicial +qh_makenewfacet +qh_makenewfacets +qh_makenewplanes +qh_malloc +qh_markkeep +qh_markvoronoi +qh_matchdupridge +qh_matchneighbor +qh_matchnewfacets +qh_matchvertices +qh_maxabsval +qh_maxmin +qh_maxouter +qh_maxsimplex +qh_memalloc +qh_memfree +qh_memfreeshort +qh_meminit +qh_meminitbuffers +qh_memsetup +qh_memsize +qh_memstatistics +qh_memtotal +qh_minabsval +qh_mindiff +qh_new_qhull +qh_newfacet +qh_newridge +qh_newstats +qh_nextfacet2d +qh_nextfurthest +qh_normalize +qh_normalize2 +qh_nostatistic +qh_option +qh_order_vertexneighbors +qh_orientoutside +qh_out1 +qh_out2n +qh_out3n +qh_outcoplanar +qh_outerinner +qh_partitionall +qh_partitioncoplanar +qh_partitionpoint +qh_partitionvisible +qh_point +qh_point_add +qh_pointdist +qh_pointfacet +qh_pointid +qh_pointvertex +qh_postmerge +qh_premerge +qh_prepare_output +qh_prependfacet +qh_printafacet +qh_printallstatistics +qh_printbegin +qh_printcenter +qh_printcentrum +qh_printend +qh_printend4geom +qh_printextremes +qh_printextremes_2d +qh_printextremes_d +qh_printfacet +qh_printfacet2geom +qh_printfacet2geom_points +qh_printfacet2math +qh_printfacet3geom_nonsimplicial +qh_printfacet3geom_points +qh_printfacet3geom_simplicial +qh_printfacet3math +qh_printfacet3vertex +qh_printfacet4geom_nonsimplicial +qh_printfacet4geom_simplicial +qh_printfacetNvertex_nonsimplicial +qh_printfacetNvertex_simplicial +qh_printfacetheader +qh_printfacetlist +qh_printfacetridges +qh_printfacets +qh_printhashtable +qh_printhelp_degenerate +qh_printhelp_internal +qh_printhelp_narrowhull +qh_printhelp_singular +qh_printhelp_topology +qh_printhelp_wide +qh_printhyperplaneintersection +qh_printline3geom +qh_printlists +qh_printmatrix +qh_printneighborhood +qh_printpoint +qh_printpoint3 +qh_printpointid +qh_printpoints +qh_printpoints_out +qh_printpointvect +qh_printpointvect2 +qh_printridge +qh_printspheres +qh_printstatistics +qh_printstatlevel +qh_printstats +qh_printsummary +qh_printvdiagram +qh_printvdiagram2 +qh_printvertex +qh_printvertexlist +qh_printvertices +qh_printvneighbors +qh_printvnorm +qh_printvoronoi +qh_printvridge +qh_produce_output +qh_produce_output2 +qh_projectdim3 +qh_projectinput +qh_projectpoint +qh_projectpoints +; Mark as DATA, otherwise links a separate qh_qh. qh_qh and qh_qhstat requires __declspec +qh_qh DATA +qh_qhstat DATA +qh_qhull +qh_rand +qh_randomfactor +qh_randommatrix +qh_rboxpoints +qh_readfeasible +qh_readpoints +qh_removefacet +qh_removevertex +qh_resetlists +qh_rotateinput +qh_rotatepoints +qh_roundi +qh_scaleinput +qh_scalelast +qh_scalepoints +qh_setaddnth +qh_setaddsorted +qh_setappend +qh_setappend2ndlast +qh_setappend_set +qh_setcheck +qh_setcompact +qh_setcopy +qh_setdel +qh_setdelaunay +qh_setdellast +qh_setdelnth +qh_setdelnthsorted +qh_setdelsorted +qh_setduplicate +qh_setequal +qh_setequal_except +qh_setequal_skip +qh_setfacetplane +qh_setfeasible +qh_setfree +qh_setfree2 +qh_setfreelong +qh_sethalfspace +qh_sethalfspace_all +qh_sethyperplane_det +qh_sethyperplane_gauss +qh_setin +qh_setindex +qh_setlarger +qh_setlarger_quick +qh_setlast +qh_setnew +qh_setnew_delnthsorted +qh_setprint +qh_setreplace +qh_setsize +qh_settemp +qh_settempfree +qh_settempfree_all +qh_settemppop +qh_settemppush +qh_settruncate +qh_setunique +qh_setvoronoi_all +qh_setzero +qh_sharpnewfacets +qh_skipfacet +qh_skipfilename +qh_srand +qh_stddev +qh_strtod +qh_strtol +qh_triangulate +qh_update_vertexneighbors +qh_update_vertexneighbors_cone +qh_user_memsizes +qh_version +qh_version2 +qh_vertexintersect +qh_vertexintersect_new +qh_vertexneighbors +qh_vertexsubset +qh_voronoi_center +; Mark as DATA, otherwise links a separate qhmem. No __declspec +qhmem DATA +rbox DATA +rbox_inuse DATA diff -Nru qhull-2015.2/src/libqhull/qhull_p-exports.def qhull-2020.2/src/libqhull/qhull_p-exports.def --- qhull-2015.2/src/libqhull/qhull_p-exports.def 2016-01-17 02:46:45.000000000 +0000 +++ qhull-2020.2/src/libqhull/qhull_p-exports.def 2020-07-29 21:36:41.000000000 +0000 @@ -1,15 +1,22 @@ ; qhull_p-exports.def -- msvc module-definition file ; ; Generated from depends.exe by cut-and-paste of exported symbols by mingw gcc -; [mar'11] 399 symbols [jan'15] added 3 symbols +; [jan'14] 391 symbols ; Annotate as DATA qh_last_random qh_qh qh_qhstat qhmem rbox rbox_inuse ; Annotate as __declspec for outside access in win32 -- qh_qh qh_qhstat +; Same as ../libqhull/qhull-exports.def with qh_save_qhull and qh_restore_qhull ; -; $Id: //main/2011/qhull/src/libqhull/qhull-exports.def#2 $$Change: 1368 $ -; $DateTime: 2011/04/16 08:12:32 $$Author: bbarber $ +; Referenced by CMakeLists/add_library, libqhull_p.pro/DEF_FILE, +; and libqhull_p.vcxproj/Linker/Input/Module Definition File +; +; If qh_NOmerge, use qhull_p-nomerge-exports.def +; Created by -- grep -vE 'qh_all_merges|qh_appendmergeset|qh_basevertices|qh_check_dupridge|qh_checkconnect|qh_compare_facetmerge|qh_comparevisit|qh_copynonconvex|qh_degen_redundant_facet|qh_delridge_merge|qh_find_newvertex|qh_findbest_test|qh_findbestneighbor|qh_flippedmerges|qh_forcedmerges|qh_getmergeset|qh_getmergeset_initial|qh_hashridge|qh_hashridge_find|qh_makeridges|qh_mark_dupridges|qh_maydropneighbor|qh_merge_degenredundant|qh_merge_nonconvex|qh_mergecycle|qh_mergecycle_all|qh_mergecycle_facets|qh_mergecycle_neighbors|qh_mergecycle_ridges|qh_mergecycle_vneighbors|qh_mergefacet|qh_mergefacet2d|qh_mergeneighbors|qh_mergeridges|qh_mergesimplex|qh_mergevertex_del|qh_mergevertex_neighbors|qh_mergevertices|qh_nearcoplanar|qh_nearvertex|qh_neighbor_intersections|qh_newhashtable|qh_newvertex|qh_newvertices|qh_nextridge3d|qh_reducevertices|qh_redundant_vertex|qh_remove_extravertices|qh_rename_sharedvertex|qh_renameridgevertex|qh_renamevertex|qh_test_appendmerge|qh_test_degen_neighbors|qh_test_redundant_neighbors|qh_test_vneighbors|qh_tracemerge|qh_tracemerging|qh_triangulate_facet|qh_triangulate_link|qh_triangulate_mirror|qh_triangulate_null|qh_updatetested|qh_vertexridges|qh_vertexridges_facet|qh_willdelete' qhull_p-exports.def >qhull_p-nomerge-exports.def +; +; $Id: //main/2019/qhull/src/libqhull/qhull_p-exports.def#5 $$Change: 2967 $ +; $DateTime: 2020/06/05 16:33:18 $$Author: bbarber $ ; ; Define qhull_VERSION in CMakeLists.txt, Makefile, qhull-exports.def, qhull_p-exports.def, qhull_r-exports.def, and qhull-warn.pri -VERSION 7.0 +VERSION 8.0 EXPORTS qh_addhash qh_addpoint @@ -45,10 +52,12 @@ qh_check_points qh_checkconnect qh_checkconvex +qh_checkdelridge qh_checkfacet qh_checkflags qh_checkflipped qh_checkflipped_all +qh_checklists qh_checkpolygon qh_checkvertex qh_checkzero @@ -59,9 +68,7 @@ qh_compare_facetarea qh_compare_facetmerge qh_compare_facetvisit -qh_compare_vertexpoint -qh_compareangle -qh_comparemerge +qh_compare_nummerge qh_comparevisit qh_copyfilename qh_copynonconvex @@ -70,10 +77,9 @@ qh_createsimplex qh_crossproduct qh_degen_redundant_facet -qh_degen_redundant_neighbors qh_deletevisible qh_delfacet -qh_delridge +qh_delridge_merge qh_delvertex qh_determinant qh_detjoggle @@ -159,6 +165,7 @@ qh_initthresholds qh_inthresholds qh_isvertex +qh_joggle_restart qh_joggleinput ; Mark as DATA, otherwise links a separate qh_last_random. No __declspec. qh_last_random DATA @@ -173,7 +180,7 @@ qh_mark_dupridges qh_markkeep qh_markvoronoi -qh_matchduplicates +qh_matchdupridge qh_matchneighbor qh_matchnewfacets qh_matchvertices @@ -219,6 +226,7 @@ qh_newstats qh_newvertex qh_newvertices +qh_nextfacet2d qh_nextfurthest qh_nextridge3d qh_normalize @@ -243,7 +251,6 @@ qh_pointid qh_pointvertex qh_postmerge -qh_precision qh_premerge qh_prepare_output qh_prependfacet @@ -276,8 +283,11 @@ qh_printfacets qh_printhashtable qh_printhelp_degenerate +qh_printhelp_internal qh_printhelp_narrowhull qh_printhelp_singular +qh_printhelp_topology +qh_printhelp_wide qh_printhyperplaneintersection qh_printline3geom qh_printlists @@ -368,6 +378,7 @@ qh_setin qh_setindex qh_setlarger +qh_setlarger_quick qh_setlast qh_setnew qh_setnew_delnthsorted @@ -391,6 +402,8 @@ qh_strtod qh_strtol qh_test_appendmerge +qh_test_degen_neighbors +qh_test_redundant_neighbors qh_test_vneighbors qh_tracemerge qh_tracemerging @@ -400,7 +413,8 @@ qh_triangulate_mirror qh_triangulate_null qh_updatetested -qh_updatevertices +qh_update_vertexneighbors +qh_update_vertexneighbors_cone qh_user_memsizes qh_version qh_version2 @@ -414,5 +428,5 @@ qh_willdelete ; Mark as DATA, otherwise links a separate qhmem. No __declspec qhmem DATA -rbox DATA +rbox DATA rbox_inuse DATA diff -Nru qhull-2015.2/src/libqhull/qhull_p-nomerge-exports.def qhull-2020.2/src/libqhull/qhull_p-nomerge-exports.def --- qhull-2015.2/src/libqhull/qhull_p-nomerge-exports.def 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/src/libqhull/qhull_p-nomerge-exports.def 2020-07-29 21:36:41.000000000 +0000 @@ -0,0 +1,360 @@ +; qhull_p-nomerge-exports.def -- msvc module-definition file +; +; Generated from depends.exe by cut-and-paste of exported symbols by mingw gcc +; [jan'14] 391 symbols +; Annotate as DATA qh_last_random qh_qh qh_qhstat qhmem rbox rbox_inuse +; Annotate as __declspec for outside access in win32 -- qh_qh qh_qhstat +; Same as ../libqhull/qhull-nomerge-exports.def with qh_save_qhull and qh_restore_qhull +; +; $Id: //main/2019/qhull/src/libqhull/qhull_p-nomerge-exports.def#5 $$Change: 2967 $ +; $DateTime: 2020/06/05 16:33:18 $$Author: bbarber $ +; +; Define qhull_VERSION in CMakeLists.txt, Makefile, qhull-exports.def, qhull_p-exports.def, qhull_r-exports.def, and qhull-warn.pri +VERSION 8.0 +EXPORTS +qh_addhash +qh_addpoint +qh_allstatA +qh_allstatB +qh_allstatC +qh_allstatD +qh_allstatE +qh_allstatE2 +qh_allstatF +qh_allstatG +qh_allstatH +qh_allstatI +qh_allstatistics +qh_appendfacet +qh_appendprint +qh_appendvertex +qh_argv_to_command +qh_argv_to_command_size +qh_attachnewfacets +qh_backnormal +qh_build_withrestart +qh_buildhull +qh_buildtracing +qh_check_bestdist +qh_check_maxout +qh_check_output +qh_check_point +qh_check_points +qh_checkconvex +qh_checkdelridge +qh_checkfacet +qh_checkflags +qh_checkflipped +qh_checkflipped_all +qh_checkpolygon +qh_checkvertex +qh_checkzero +qh_clear_outputflags +qh_clearcenters +qh_clock +qh_collectstatistics +qh_compare_facetarea +qh_compare_facetvisit +qh_compare_nummerge +qh_copyfilename +qh_copypoints +qh_countfacets +qh_createsimplex +qh_crossproduct +qh_deletevisible +qh_delfacet +qh_delvertex +qh_determinant +qh_detjoggle +qh_detroundoff +qh_detsimplex +qh_detvnorm +qh_detvridge +qh_detvridge3 +qh_dfacet +qh_distnorm +qh_distplane +qh_distround +qh_divzero +qh_dvertex +qh_eachvoronoi +qh_eachvoronoi_all +qh_errexit +qh_errexit2 +qh_errexit_rbox +qh_errprint +qh_exit +qh_facet2point +qh_facet3vertex +qh_facetarea +qh_facetarea_simplex +qh_facetcenter +qh_facetintersect +qh_facetvertices +qh_findbest +qh_findbestfacet +qh_findbesthorizon +qh_findbestlower +qh_findbestnew +qh_findfacet_all +qh_findgood +qh_findgood_all +qh_findgooddist +qh_findhorizon +qh_fprintf +qh_fprintf_rbox +qh_fprintf_stderr +qh_free +qh_freebuffers +qh_freebuild +qh_freeqhull +qh_freeqhull2 +qh_freestatistics +qh_furthestnext +qh_furthestout +qh_gausselim +qh_geomplanes +qh_getangle +qh_getarea +qh_getcenter +qh_getcentrum +qh_getdistance +qh_gethash +qh_gram_schmidt +qh_infiniteloop +qh_init_A +qh_init_B +qh_init_qhull_command +qh_initbuild +qh_initflags +qh_initialhull +qh_initialvertices +qh_initqhull_buffers +qh_initqhull_globals +qh_initqhull_mem +qh_initqhull_outputflags +qh_initqhull_start +qh_initqhull_start2 +qh_initstatistics +qh_initthresholds +qh_inthresholds +qh_isvertex +qh_joggle_restart +qh_joggleinput +; Mark as DATA, otherwise links a separate qh_last_random. No __declspec. +qh_last_random DATA +qh_lib_check +qh_makenew_nonsimplicial +qh_makenew_simplicial +qh_makenewfacet +qh_makenewfacets +qh_makenewplanes +qh_malloc +qh_markkeep +qh_markvoronoi +qh_matchdupridge +qh_matchneighbor +qh_matchnewfacets +qh_matchvertices +qh_maxabsval +qh_maxmin +qh_maxouter +qh_maxsimplex +qh_memalloc +qh_memfree +qh_memfreeshort +qh_meminit +qh_meminitbuffers +qh_memsetup +qh_memsize +qh_memstatistics +qh_memtotal +qh_minabsval +qh_mindiff +qh_new_qhull +qh_newfacet +qh_newridge +qh_newstats +qh_nextfacet2d +qh_nextfurthest +qh_normalize +qh_normalize2 +qh_nostatistic +qh_option +qh_order_vertexneighbors +qh_orientoutside +qh_out1 +qh_out2n +qh_out3n +qh_outcoplanar +qh_outerinner +qh_partitionall +qh_partitioncoplanar +qh_partitionpoint +qh_partitionvisible +qh_point +qh_point_add +qh_pointdist +qh_pointfacet +qh_pointid +qh_pointvertex +qh_postmerge +qh_premerge +qh_prepare_output +qh_prependfacet +qh_printafacet +qh_printallstatistics +qh_printbegin +qh_printcenter +qh_printcentrum +qh_printend +qh_printend4geom +qh_printextremes +qh_printextremes_2d +qh_printextremes_d +qh_printfacet +qh_printfacet2geom +qh_printfacet2geom_points +qh_printfacet2math +qh_printfacet3geom_nonsimplicial +qh_printfacet3geom_points +qh_printfacet3geom_simplicial +qh_printfacet3math +qh_printfacet3vertex +qh_printfacet4geom_nonsimplicial +qh_printfacet4geom_simplicial +qh_printfacetNvertex_nonsimplicial +qh_printfacetNvertex_simplicial +qh_printfacetheader +qh_printfacetlist +qh_printfacetridges +qh_printfacets +qh_printhashtable +qh_printhelp_degenerate +qh_printhelp_internal +qh_printhelp_narrowhull +qh_printhelp_singular +qh_printhelp_topology +qh_printhelp_wide +qh_printhyperplaneintersection +qh_printline3geom +qh_printlists +qh_printmatrix +qh_printneighborhood +qh_printpoint +qh_printpoint3 +qh_printpointid +qh_printpoints +qh_printpoints_out +qh_printpointvect +qh_printpointvect2 +qh_printridge +qh_printspheres +qh_printstatistics +qh_printstatlevel +qh_printstats +qh_printsummary +qh_printvdiagram +qh_printvdiagram2 +qh_printvertex +qh_printvertexlist +qh_printvertices +qh_printvneighbors +qh_printvnorm +qh_printvoronoi +qh_printvridge +qh_produce_output +qh_produce_output2 +qh_projectdim3 +qh_projectinput +qh_projectpoint +qh_projectpoints +; Mark as DATA, otherwise links a separate qh_qh. qh_qh and qh_qhstat requires __declspec +qh_qh DATA +qh_qhstat DATA +qh_qhull +qh_rand +qh_randomfactor +qh_randommatrix +qh_rboxpoints +qh_readfeasible +qh_readpoints +qh_removefacet +qh_removevertex +qh_resetlists +qh_restore_qhull +qh_rotateinput +qh_rotatepoints +qh_roundi +qh_save_qhull +qh_scaleinput +qh_scalelast +qh_scalepoints +qh_setaddnth +qh_setaddsorted +qh_setappend +qh_setappend2ndlast +qh_setappend_set +qh_setcheck +qh_setcompact +qh_setcopy +qh_setdel +qh_setdelaunay +qh_setdellast +qh_setdelnth +qh_setdelnthsorted +qh_setdelsorted +qh_setduplicate +qh_setequal +qh_setequal_except +qh_setequal_skip +qh_setfacetplane +qh_setfeasible +qh_setfree +qh_setfree2 +qh_setfreelong +qh_sethalfspace +qh_sethalfspace_all +qh_sethyperplane_det +qh_sethyperplane_gauss +qh_setin +qh_setindex +qh_setlarger +qh_setlarger_quick +qh_setlast +qh_setnew +qh_setnew_delnthsorted +qh_setprint +qh_setreplace +qh_setsize +qh_settemp +qh_settempfree +qh_settempfree_all +qh_settemppop +qh_settemppush +qh_settruncate +qh_setunique +qh_setvoronoi_all +qh_setzero +qh_sharpnewfacets +qh_skipfacet +qh_skipfilename +qh_srand +qh_stddev +qh_strtod +qh_strtol +qh_triangulate +qh_update_vertexneighbors +qh_update_vertexneighbors_cone +qh_user_memsizes +qh_version +qh_version2 +qh_vertexintersect +qh_vertexintersect_new +qh_vertexneighbors +qh_vertexsubset +qh_voronoi_center +; Mark as DATA, otherwise links a separate qhmem. No __declspec +qhmem DATA +rbox DATA +rbox_inuse DATA diff -Nru qhull-2015.2/src/libqhull/qh-user.htm qhull-2020.2/src/libqhull/qh-user.htm --- qhull-2015.2/src/libqhull/qh-user.htm 2016-01-17 21:51:15.000000000 +0000 +++ qhull-2020.2/src/libqhull/qh-user.htm 2020-08-16 18:19:32.000000000 +0000 @@ -9,8 +9,8 @@

      Up: Home page for Qhull
      -Up: Qhull manual: Table of Contents
      +href="http://www.qhull.org">Home page for Qhull (local)
      +Up: Qhull manual: contents
      Up: ProgramsOptionsOutput @@ -20,9 +20,8 @@ • QhullPrecisionTrace -• Functions
      -Up: Qhull code: Table of Contents
      -To: Qhull functions, macros, and data structures
      +• Functions (local)
      +Up: Qhull code
      To: GeomGlobalIoMemMergePoly @@ -36,7 +35,7 @@ user may want to change.

      -

      Copyright © 1995-2015 C.B. Barber

      +

      Copyright © 1995-2020 C.B. Barber


      » Geom Global @@ -91,8 +90,8 @@ output, indicates Voronoi center at infinity

    • qh_ORIENTclock define convention for orienting facets
    • -
    • qh_ZEROdelaunay -define facets that are ignored in Delaunay triangulations
    • +
    • qh_RANDOMdist +for testing qh.DISTround (sets qh.RANDOMfactor for qh.RANDOMdist, same as option 'Rn')

    »joggle constants

    @@ -151,6 +150,8 @@ compute furthest distance to an outside point instead of storing it with the facet
  • qh_KEEPstatistics enable statistic gathering and reporting with option 'Ts' +
  • qh_MAXcheckpoint + report up to qh_MAXcheckpoint errors per facet in qh_check_point ('Tv')
  • qh_MAXoutside record outer plane for each facet
  • qh_NOmerge @@ -167,10 +168,9 @@ constants
    • qh_BESTcentrum -when does qh_findbestneighbor() test centrums?
    • +if many vertices for facet, qh_findbestneighbor tests centrums instead of vertices
    • qh_BESTnonconvex -when does qh_findbestneighbor() test nonconvex -ridges only?
    • +if many neighbors for facet, qh_findbestneighbor only tests nonconvex ridges
    • qh_COPLANARratio what is qh.MINvisible?
    • qh_DIMreduceBuild @@ -178,28 +178,58 @@
    • qh_DIMmergeVertex max dimension for vertex merging
    • qh_DISToutside -when is a point clearly outside of a facet for qh_findbestnew and qh_partitionall
    • +when is a point clearly outside of a facet for qh_findbestnew and qh_partitionall
    • qh_MAXnarrow max. cosine for qh.NARROWhull
    • +
    • qh_MAXcoplanarcentrum +if 'Qx' and many merges, use f.maxoutside for coplanarity test +instead of qh.centrum_radius
    • +
    • qh_MAXnarrow +max. cosine in initial hull that sets qh.NARROWhull
    • qh_MAXnewcentrum when does qh_reducevertices_centrum() reset the centrum?
    • qh_MAXnewmerges when does qh_merge_nonconvex() call qh_reducevertices_centrums?
    • +
    • qh_RATIOconcavehorizon +ratio of horizon vertex distance to qh.max_outside for concave, twisted new facets in qh_test_nonsimplicial_merge
    • +
    • qh_RATIOconvexmerge +ratio of vertex distance to qh.min_vertex for clearly convex new facets in qh_test_nonsimplicial_merge
    • +
    • qh_RATIOcoplanarapex +ratio of best distance for coplanar apex vs. vertex merge in qh_getpinchedmerges
    • +
    • qh_RATIOcoplanaroutside +ratio to repartition a coplanar point as an outside point in qh_partitioncoplanar and qh_check_maxout
    • +
    • qh_RATIOmaxsimplex +ratio for searching all points in qh_maxsimplex
    • qh_RATIOnearinside -ratio for retaining inside points for -qh_check_maxout()
    • +ratio for retaining inside points for qh_check_maxout +
    • qh_RATIOpinchedsubridge +ratio to qh.ONEmerge to accept vertices in qh_findbest_pinchedvertex
    • +
    • qh_RATIOtrypinched +ratio to qh.ONEmerge to try qh_getpinchedmerges in qh_buildcone_mergepinched
    • +
    • qh_RATIOtwisted +maximum ratio to qh.ONEmerge to merge twisted facets in qh_merge_twisted
    • qh_SEARCHdist when is facet coplanar with the best facet for qh_findbesthorizon
    • qh_USEfindbestnew when to use qh_findbestnew for qh_partitionpoint()
    • qh_WARNnarrow -max. cosine to warn about qh.NARROWhull
    • +max. cosine in initial hull to warn about qh.NARROWhull
    • qh_WIDEcoplanar -what is a wide facet?
    • +what is a wide facet
    • qh_WIDEduplicate -what is a wide ratio on merging duplicate ridges?
    • +merge ratio for errexit from qh_forcedmerges due to duplicate ridge +
    • qh_WIDEridge +merge ratio for selecting a forced dupridge merge
    • +
    • qh_WIDEmaxoutside +precision ratio for maximum increase for qh.max_outside in qh_check_maxout
    • +
    • qh_WIDEmaxoutside2 +precision ratio for maximum qh.max_outside in qh_check_maxout
    • +
    • qh_WIDEpinched +merge ratio for distance between pinched vertices compared to current facet width for qh_getpinchedmerges and qh_next_vertexmerge
    • +
    • qh_ZEROdelaunay +define facets that are ignored in Delaunay triangulations

    »user.c @@ -214,6 +244,20 @@ of points

  • qh_printfacetlist print all fields of all facets
  • +
  • qh_printhelp_degenerate +prints descriptive message for precision error
  • +
  • qh_printhelp_internal +print help message for an internal error
  • +
  • qh_printhelp_narrowhull +prints descriptive message to warn about a narrow hull
  • +
  • qh_printhelp_singular +print help message for singular data
  • +
  • qh_printhelp_topology +print help message for a topology error due to merging
  • +
  • qh_printhelp_wide +print help message for a wide merge error
  • +
  • qh_user_memsizes +define additional quick allocation sizes

    »usermem.c @@ -237,9 +281,9 @@


    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    +Home page for +Qhull (local)
    +Up: Qhull manual: contents
    Up: ProgramsOptionsOutput @@ -249,9 +293,8 @@ • QhullPrecisionTrace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    +• Functions (local)
    +Up: Qhull code
    To: GeomGlobalIoMemMerge @@ -265,7 +308,7 @@ src="../../html/qh--geom.gif" align="middle" width="40" height="40">The Geometry Center Home Page

    Comments to: qhull@qhull.org -
    +
    Created: May 2, 1997 --- Last modified: see top

    diff -Nru qhull-2015.2/src/libqhull/qset.c qhull-2020.2/src/libqhull/qset.c --- qhull-2015.2/src/libqhull/qset.c 2016-01-17 04:19:53.000000000 +0000 +++ qhull-2020.2/src/libqhull/qset.c 2020-05-22 02:00:58.000000000 +0000 @@ -11,12 +11,14 @@ either the actual size of the set plus 1, or the NULL terminator of the set (i.e., setelemT). - Copyright (c) 1993-2015 The Geometry Center. - $Id: //main/2015/qhull/src/libqhull/qset.c#3 $$Change: 2062 $ - $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $ + Do not reference 'qh' since it brings in qhT unnecessarily + + Copyright (c) 1993-2020 The Geometry Center. + $Id: //main/2019/qhull/src/libqhull/qset.c#7 $$Change: 2953 $ + $DateTime: 2020/05/21 22:05:32 $$Author: bbarber $ */ -#include "user.h" /* for QHULL_CRTDBG */ +#include "libqhull.h" /* for qhT and QHULL_CRTDBG */ #include "qset.h" #include "mem.h" #include @@ -44,7 +46,7 @@ /*---------------------------------- - qh_setaddnth( setp, nth, newelem) + qh_setaddnth( setp, nth, newelem ) adds newelem as n'th element of sorted or unsorted *setp notes: @@ -116,7 +118,7 @@ /*--------------------------------- - qh_setappend( setp, newelem) + qh_setappend( setp, newelem ) append newelem to *setp notes: @@ -148,7 +150,7 @@ /*--------------------------------- - qh_setappend_set( setp, setA) + qh_setappend_set( setp, setA ) appends setA to *setp notes: @@ -231,7 +233,7 @@ design: checks that maxsize, actual size, and NULL terminator agree */ -void qh_setcheck(setT *set, const char *tname, unsigned id) { +void qh_setcheck(setT *set, const char *tname, unsigned int id) { int maxsize, size; int waserr= 0; @@ -283,7 +285,7 @@ destp= elemp= firstp= SETaddr_(set, void); endp= destp + size; while (1) { - if (!(*destp++ = *elemp++)) { + if (!(*destp++= *elemp++)) { destp--; if (elemp > endp) break; @@ -324,7 +326,7 @@ /*--------------------------------- - qh_setdel( set, oldelem ) + qh_setdel(set, oldelem ) delete oldelem from an unsorted set returns: @@ -367,7 +369,7 @@ /*--------------------------------- - qh_setdellast( set) + qh_setdellast( set ) return last element of set or NULL notes: @@ -428,7 +430,7 @@ sizep= SETsizeaddr_(set); if ((sizep->i--)==0) /* if was a full set */ - sizep->i= set->maxsize; /* *sizep= (maxsize-1)+ 1 */ + sizep->i= set->maxsize; /* *sizep= (maxsize-1)+ 1 */ if (nth < 0 || nth >= sizep->i) { qh_fprintf(qhmem.ferr, 6174, "qhull internal error (qh_setdelnth): nth %d is out-of-bounds for set:\n", nth); qh_setprint(qhmem.ferr, "", set); @@ -600,7 +602,7 @@ return 1; elemAp= SETaddr_(setA, void); elemBp= SETaddr_(setB, void); - if (!memcmp((char *)elemAp, (char *)elemBp, sizeA*SETelemsize)) + if (!memcmp((char *)elemAp, (char *)elemBp, (size_t)(sizeA * SETelemsize))) return 1; return 0; } /* setequal */ @@ -718,7 +720,7 @@ void **freelistp; /* used if !qh_NOmem by qh_memfree_() */ if (*setp) { - size= sizeof(setT) + ((*setp)->maxsize)*SETelemsize; + size= (int)sizeof(setT) + ((*setp)->maxsize)*SETelemsize; if (size <= qhmem.LASTsize) { qh_memfree_(*setp, size, freelistp); }else @@ -771,7 +773,7 @@ int size; if (*setp) { - size= sizeof(setT) + ((*setp)->maxsize)*SETelemsize; + size= (int)sizeof(setT) + ((*setp)->maxsize)*SETelemsize; if (size > qhmem.LASTsize) { qh_memfree(*setp, size); *setp= NULL; @@ -806,7 +808,7 @@ /*--------------------------------- - qh_setindex( set, atelem ) + qh_setindex(set, atelem ) returns the index of atelem in set. returns -1, if not in set or maxsize wrong @@ -843,7 +845,13 @@ returns a larger set that contains all elements of *oldsetp notes: - the set is at least twice as large + if long memory, + the new set is 2x larger + if qhmem.LASTsize is between 1.5x and 2x + the new set is qhmem.LASTsize + otherwise use quick memory, + the new set is 2x larger, rounded up to next qh_memsize + if temp set, updates qhmem.tempstack design: @@ -853,22 +861,23 @@ deletes the old set */ void qh_setlarger(setT **oldsetp) { - int size= 1; + int setsize= 1, newsize; setT *newset, *set, **setp, *oldset; setelemT *sizep; setelemT *newp, *oldp; if (*oldsetp) { oldset= *oldsetp; - SETreturnsize_(oldset, size); + SETreturnsize_(oldset, setsize); qhmem.cntlarger++; - qhmem.totlarger += size+1; - newset= qh_setnew(2 * size); + qhmem.totlarger += setsize+1; + qh_setlarger_quick(setsize, &newsize); + newset= qh_setnew(newsize); oldp= (setelemT *)SETaddr_(oldset, void); newp= (setelemT *)SETaddr_(newset, void); - memcpy((char *)newp, (char *)oldp, (size_t)(size+1) * SETelemsize); + memcpy((char *)newp, (char *)oldp, (size_t)(setsize+1) * SETelemsize); sizep= SETsizeaddr_(newset); - sizep->i= size+1; + sizep->i= setsize+1; FOREACHset_((setT *)qhmem.tempstack) { if (set == oldset) *(setp-1)= newset; @@ -881,6 +890,39 @@ /*--------------------------------- + + qh_setlarger_quick( setsize, newsize ) + determine newsize for setsize + returns True if newsize fits in quick memory + + design: + if 2x fits into quick memory + return True, 2x + if x+4 does not fit into quick memory + return False, 2x + if x+x/3 fits into quick memory + return True, the last quick set + otherwise + return False, 2x +*/ +int qh_setlarger_quick(int setsize, int *newsize) { + int lastquickset; + + *newsize= 2 * setsize; + lastquickset= (qhmem.LASTsize - (int)sizeof(setT)) / SETelemsize; /* matches size computation in qh_setnew */ + if (*newsize <= lastquickset) + return 1; + if (setsize + 4 > lastquickset) + return 0; + if (setsize + setsize/3 <= lastquickset) { + *newsize= lastquickset; + return 1; + } + return 0; +} /* setlarger_quick */ + +/*--------------------------------- qh_setlast( set ) @@ -929,7 +971,7 @@ if (!setsize) setsize++; - size= sizeof(setT) + setsize * SETelemsize; + size= (int)sizeof(setT) + setsize * SETelemsize; /* setT includes NULL terminator, see qh.LASTquickset */ if (size>0 && size <= qhmem.LASTsize) { qh_memalloc_(size, freelistp, set, setT); #ifndef qh_NOmem @@ -938,7 +980,7 @@ setsize += (sizereceived - size)/SETelemsize; #endif }else - set= (setT*)qh_memalloc(size); + set= (setT *)qh_memalloc(size); set->maxsize= setsize; set->e[setsize].i= 1; set->e[0].p= NULL; @@ -1104,6 +1146,7 @@ errors if set's maxsize is incorrect same as SETreturnsize_(set) same code for qh_setsize [qset.c] and QhullSetBase::count + if first element is NULL, SETempty_() is True but qh_setsize may be greater than 0 design: determine actual size of set from maxsize @@ -1132,7 +1175,7 @@ >-------------------------------- qh_settemp( setsize ) - return a stacked, temporary set of upto setsize elements + return a stacked, temporary set of up to setsize elements notes: use settempfree or settempfree_all to release from qhmem.tempstack @@ -1190,7 +1233,7 @@ /*--------------------------------- - qh_settempfree_all( ) + qh_settempfree_all( ) free all temporary sets in qhmem.tempstack design: @@ -1209,7 +1252,7 @@ /*--------------------------------- - qh_settemppop( ) + qh_settemppop( ) pop and return temporary set from qhmem.tempstack notes: @@ -1221,7 +1264,7 @@ setT *qh_settemppop(void) { setT *stackedset; - stackedset= (setT*)qh_setdellast(qhmem.tempstack); + stackedset= (setT *)qh_setdellast(qhmem.tempstack); if (!stackedset) { qh_fprintf(qhmem.ferr, 6180, "qhull internal error (qh_settemppop): pop from empty temporary stack\n"); qh_errexit(qhmem_ERRqhull, NULL, NULL); diff -Nru qhull-2015.2/src/libqhull/qset.h qhull-2020.2/src/libqhull/qset.h --- qhull-2015.2/src/libqhull/qset.h 2016-01-17 04:14:33.000000000 +0000 +++ qhull-2020.2/src/libqhull/qset.h 2020-05-22 02:00:58.000000000 +0000 @@ -16,9 +16,9 @@ - every set is NULL terminated - sets may be sorted or unsorted, the caller must distinguish this - Copyright (c) 1993-2015 The Geometry Center. - $Id: //main/2015/qhull/src/libqhull/qset.h#2 $$Change: 2062 $ - $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $ + Copyright (c) 1993-2020 The Geometry Center. + $Id: //main/2019/qhull/src/libqhull/qset.h#4 $$Change: 2953 $ + $DateTime: 2020/05/21 22:05:32 $$Author: bbarber $ */ #ifndef qhDEFset @@ -77,7 +77,7 @@ typedef union setelemT setelemT; union setelemT { void *p; - int i; /* integer used for e[maxSize] */ + int i; /* integer used for e[maxSize] */ }; struct setT { @@ -123,10 +123,11 @@ variable is NULL at end of loop example: - #define FOREACHfacet_( facets ) FOREACHsetelement_( facetT, facets, facet ) + #define FOREACHfacet_(facets) FOREACHsetelement_(facetT, facets, facet) notes: use FOREACHsetelement_i_() if need index or include NULLs + assumes set is not modified WARNING: nested loops can't use the same variable (define another FOREACH) @@ -159,7 +160,7 @@ variable==NULL and variable_i==variable_n example: - #define FOREACHfacet_i_( facets ) FOREACHsetelement_i_( facetT, facets, facet ) + #define FOREACHfacet_i_(facets) FOREACHsetelement_i_(facetT, facets, facet) WARNING: nested loops can't use the same variable (define another FOREACH) @@ -194,7 +195,7 @@ variable is NULL example: - #define FOREACHvertexreverse_( vertices ) FOREACHsetelementreverse_( vertexT, vertices, vertex ) + #define FOREACHvertexreverse_(vertices) FOREACHsetelementreverse_(vertexT, vertices, vertex) notes: use FOREACHsetelementreverse12_() to reverse first two elements @@ -226,7 +227,7 @@ variable is NULL at end of loop example - #define FOREACHvertexreverse12_( vertices ) FOREACHsetelementreverse12_( vertexT, vertices, vertex ) + #define FOREACHvertexreverse12_(vertices) FOREACHsetelementreverse12_(vertexT, vertices, vertex) notes: WARNING: needs braces if nested inside another FOREACH @@ -261,6 +262,7 @@ FOREACHelem_(set) { notes: + assumes set is not modified WARNING: needs braces if nested inside another FOREACH */ #define FOREACHelem_(set) FOREACHsetelement_(void, set, elem) @@ -339,7 +341,7 @@ notes: assumes that n is valid [0..size] and that set is defined */ -#define SETelemt_(set, n, type) ((type*)((set)->e[n].p)) +#define SETelemt_(set, n, type) ((type *)((set)->e[n].p)) /*----------------------------------------- @@ -368,7 +370,7 @@ return first element of set as a type */ -#define SETfirstt_(set, type) ((type*)((set)->e[0].p)) +#define SETfirstt_(set, type) ((type *)((set)->e[0].p)) /*----------------------------------------- @@ -385,7 +387,7 @@ SETsecondt_(set, type) return second element of set as a type */ -#define SETsecondt_(set, type) ((type*)((set)->e[1].p)) +#define SETsecondt_(set, type) ((type *)((set)->e[1].p)) /*----------------------------------------- @@ -411,10 +413,11 @@ >---------------------------------------- SETempty_(set) - return true(1) if set is empty + return true(1) if set is empty (i.e., FOREACHsetelement_ is empty) notes: set may be NULL + qh_setsize may be non-zero if first element is NULL */ #define SETempty_(set) (!set || (SETfirst_(set) ? 0 : 1)) @@ -452,7 +455,7 @@ void qh_setappend(setT **setp, void *elem); void qh_setappend_set(setT **setp, setT *setA); void qh_setappend2ndlast(setT **setp, void *elem); -void qh_setcheck(setT *set, const char *tname, unsigned id); +void qh_setcheck(setT *set, const char *tname, unsigned int id); void qh_setcompact(setT *set); setT *qh_setcopy(setT *set, int extra); void *qh_setdel(setT *set, void *elem); @@ -460,17 +463,18 @@ void *qh_setdelnth(setT *set, int nth); void *qh_setdelnthsorted(setT *set, int nth); void *qh_setdelsorted(setT *set, void *newelem); -setT *qh_setduplicate( setT *set, int elemsize); +setT *qh_setduplicate(setT *set, int elemsize); void **qh_setendpointer(setT *set); int qh_setequal(setT *setA, setT *setB); int qh_setequal_except(setT *setA, void *skipelemA, setT *setB, void *skipelemB); int qh_setequal_skip(setT *setA, int skipA, setT *setB, int skipB); void qh_setfree(setT **set); -void qh_setfree2( setT **setp, int elemsize); +void qh_setfree2(setT **setp, int elemsize); void qh_setfreelong(setT **set); int qh_setin(setT *set, void *setelem); int qh_setindex(setT *set, void *setelem); void qh_setlarger(setT **setp); +int qh_setlarger_quick(int setsize, int *newsize); void *qh_setlast(setT *set); setT *qh_setnew(int size); setT *qh_setnew_delnthsorted(setT *set, int size, int nth, int prepend); @@ -486,5 +490,4 @@ int qh_setunique(setT **set, void *elem); void qh_setzero(setT *set, int idx, int size); - #endif /* qhDEFset */ diff -Nru qhull-2015.2/src/libqhull/random.c qhull-2020.2/src/libqhull/random.c --- qhull-2015.2/src/libqhull/random.c 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/src/libqhull/random.c 2019-06-27 22:45:15.000000000 +0000 @@ -21,22 +21,21 @@ #endif /*--------------------------------- + >-------------------------------- - qh_argv_to_command( argc, argv, command, max_size ) + qh_argv_to_command( argc, argv, command, max_size ) build command from argc/argv max_size is at least - returns: + returns: a space-delimited string of options (just as typed) returns false if max_size is too short - notes: + notes: silently removes makes option string easy to input and output - matches qh_argv_to_command_size() - + matches qh_argv_to_command_size argc may be 0 */ int qh_argv_to_command(int argc, char *argv[], char* command, int max_size) { @@ -81,9 +80,10 @@ *t= '\0'; }else if (remaining < 0) { goto error_argv; - }else + }else { strcat(command, " "); strcat(command, s); + } } return 1; @@ -92,18 +92,20 @@ } /* argv_to_command */ /*--------------------------------- + >-------------------------------- -qh_argv_to_command_size( argc, argv ) + qh_argv_to_command_size( argc, argv ) return size to allocate for qh_argv_to_command() -notes: + notes: + only called from rbox with qh_errexit not enabled + caller should report error if returned size is less than 1 argc may be 0 actual size is usually shorter */ int qh_argv_to_command_size(int argc, char *argv[]) { - unsigned int count= 1; /* null-terminator if argc==0 */ + int count= 1; /* null-terminator if argc==0 */ int i; char *s; @@ -147,24 +149,24 @@ #define qh_rand_q 127773 /* m div a */ #define qh_rand_r 2836 /* m mod a */ -int qh_rand( void) { +int qh_rand(void) { int lo, hi, test; - int seed = qh_last_random; + int seed= qh_last_random; - hi = seed / qh_rand_q; /* seed div q */ - lo = seed % qh_rand_q; /* seed mod q */ - test = qh_rand_a * lo - qh_rand_r * hi; + hi= seed / qh_rand_q; /* seed div q */ + lo= seed % qh_rand_q; /* seed mod q */ + test= qh_rand_a * lo - qh_rand_r * hi; if (test > 0) seed= test; else seed= test + qh_rand_m; qh_last_random= seed; - /* seed = seed < qh_RANDOMmax/2 ? 0 : qh_RANDOMmax; for testing */ - /* seed = qh_RANDOMmax; for testing */ + /* seed= seed < qh_RANDOMmax/2 ? 0 : qh_RANDOMmax; for testing */ + /* seed= qh_RANDOMmax; for testing */ return seed; } /* rand */ -void qh_srand( int seed) { +void qh_srand(int seed) { if (seed < 1) qh_last_random= 1; else if (seed >= qh_rand_m) @@ -192,14 +194,14 @@ /*--------------------------------- -qh_randommatrix( buffer, dim, rows ) - generate a random dim X dim matrix in range [-1,1] - assumes buffer is [dim+1, dim] - -returns: - sets buffer to random numbers - sets rows to rows of buffer - sets row[dim] as scratch row + qh_randommatrix( buffer, dim, rows ) + generate a random dim X dim matrix in range [-1,1] + assumes buffer is [dim+1, dim] + + returns: + sets buffer to random numbers + sets rows to rows of buffer + sets row[dim] as scratch row */ void qh_randommatrix(realT *buffer, int dim, realT **rows) { int i, k; diff -Nru qhull-2015.2/src/libqhull/random.h qhull-2020.2/src/libqhull/random.h --- qhull-2015.2/src/libqhull/random.h 2016-01-17 21:51:15.000000000 +0000 +++ qhull-2020.2/src/libqhull/random.h 2020-05-22 02:00:58.000000000 +0000 @@ -6,9 +6,9 @@ see qh-geom.htm and random.c - Copyright (c) 1993-2015 The Geometry Center. - $Id: //main/2015/qhull/src/libqhull/random.h#2 $$Change: 2026 $ - $DateTime: 2015/11/07 22:44:39 $$Author: bbarber $ + Copyright (c) 1993-2020 The Geometry Center. + $Id: //main/2019/qhull/src/libqhull/random.h#2 $$Change: 2953 $ + $DateTime: 2020/05/21 22:05:32 $$Author: bbarber $ */ #ifndef qhDEFrandom @@ -18,11 +18,10 @@ /*============= prototypes in alphabetical order ======= */ - int qh_argv_to_command(int argc, char *argv[], char* command, int max_size); int qh_argv_to_command_size(int argc, char *argv[]); -int qh_rand( void); -void qh_srand( int seed); +int qh_rand(void); +void qh_srand(int seed); realT qh_randomfactor(realT scale, realT offset); void qh_randommatrix(realT *buffer, int dim, realT **row); int qh_strtol(const char *s, char **endp); diff -Nru qhull-2015.2/src/libqhull/rboxlib.c qhull-2020.2/src/libqhull/rboxlib.c --- qhull-2015.2/src/libqhull/rboxlib.c 2016-01-18 19:27:37.000000000 +0000 +++ qhull-2020.2/src/libqhull/rboxlib.c 2020-05-29 20:55:08.000000000 +0000 @@ -33,18 +33,19 @@ #define PI 3.1415926535897932384 /* ------------------------------ prototypes ----------------*/ -int qh_roundi( double a); -void qh_out1( double a); -void qh_out2n( double a, double b); -void qh_out3n( double a, double b, double c); +int qh_roundi(double a); +void qh_out1(double a); +void qh_out2n(double a, double b); +void qh_out3n(double a, double b, double c); void qh_outcoord(int iscdd, double *coord, int dim); void qh_outcoincident(int coincidentpoints, double radius, int iscdd, double *coord, int dim); +void qh_rboxpoints2(char* rbox_command, double **simplex); void qh_fprintf_rbox(FILE *fp, int msgcode, const char *fmt, ... ); void qh_free(void *mem); void *qh_malloc(size_t size); -int qh_rand( void); -void qh_srand( int seed); +int qh_rand(void); +void qh_srand(int seed); /* ------------------------------ globals -------------------*/ @@ -79,6 +80,7 @@ notes: To avoid using stdio, redefine qh_malloc, qh_free, and qh_fprintf_rbox (user.c) + Split out qh_rboxpoints2() to avoid -Wclobbered design: Straight line code (consider defining a struct and functions): @@ -88,6 +90,35 @@ Generate the points */ int qh_rboxpoints(FILE* fout, FILE* ferr, char* rbox_command) { + int exitcode; + double *simplex; + + if (rbox_inuse) { + qh_fprintf_stderr(6188, "rbox error: rbox in use by another process. Please lock calls to rbox or use libqhull_r/rboxlib_r.c\n"); + return qh_ERRqhull; + } + rbox_inuse= True; + rbox.ferr= ferr; + rbox.fout= fout; + + simplex= NULL; + exitcode= setjmp(rbox.errexit); + if (exitcode) { + /* same code for error exit and normal return. qh.NOerrexit is set */ + if (simplex) + qh_free(simplex); + rbox_inuse= False; + return exitcode; + } + qh_rboxpoints2(rbox_command, &simplex); + /* same code for error exit and normal return */ + if (simplex) + qh_free(simplex); + rbox_inuse= False; + return qh_ERRnone; +} /* rboxpoints */ + +void qh_rboxpoints2(char* rbox_command, double **simplex) { int i,j,k; int gendim; int coincidentcount=0, coincidenttotal=0, coincidentpoints=0; @@ -99,36 +130,18 @@ int isbox=0, issimplex=0, issimplex2=0, ismesh=0; double width=0.0, gap=0.0, radius=0.0, coincidentradius=0.0; double coord[MAXdim], offset, meshm=3.0, meshn=4.0, meshr=5.0; - double *coordp, *simplex= NULL, *simplexp; + double *coordp, *simplexp; int nthroot, mult[MAXdim]; - double norm, factor, randr, rangap, lensangle=0, lensbase=1; + double norm, factor, randr, rangap, tempr, lensangle=0, lensbase=1; double anglediff, angle, x, y, cube=0.0, diamond=0.0; double box= qh_DEFAULTbox; /* scale all numbers before output */ double randmax= qh_RANDOMmax; - char command[200], seedbuf[200]; - char *s= command, *t, *first_point= NULL; + char command[250], seedbuf[50]; + char *s=command, *t, *first_point=NULL; time_t timedata; - int exitcode; - - if (rbox_inuse) { - qh_fprintf_rbox(rbox.ferr, 6188, "rbox error: rbox in use by another process. Please lock calls to rbox.\n"); - return qh_ERRqhull; - } - rbox_inuse= True; - rbox.ferr= ferr; - rbox.fout= fout; - - exitcode= setjmp(rbox.errexit); - if (exitcode) { - /* same code for error exit and normal return. qh.NOerrexit is set */ - if (simplex) - qh_free(simplex); - rbox_inuse= False; - return exitcode; - } *command= '\0'; - strncat(command, rbox_command, sizeof(command)-strlen(command)-1); + strncat(command, rbox_command, sizeof(command)-sizeof(seedbuf)-strlen(command)-1); while (*s && !isspace(*s)) /* skip program name */ s++; @@ -225,7 +238,7 @@ dim= qh_strtol(s, &s); if (dim < 1 || dim > MAXdim) { - qh_fprintf_rbox(rbox.ferr, 6189, "rbox error: dimension, D%d, out of bounds (>=%d or <=0)", dim, MAXdim); + qh_fprintf_rbox(rbox.ferr, 6189, "rbox error: dimension, D%d, out of bounds (>=%d or <=0)\n", dim, MAXdim); qh_errexit_rbox(qh_ERRinput); } break; @@ -267,7 +280,7 @@ break; case 'P': if (!first_point) - first_point= s-1; + first_point= s - 1; addpoints++; while (*s && !isspace(*s)) /* read points later */ s++; @@ -284,11 +297,11 @@ isaxis= 1; break; default: - qh_fprintf_rbox(rbox.ferr, 7070, "rbox error: unknown flag at %s.\nExecute 'rbox' without arguments for documentation.\n", s); + qh_fprintf_rbox(rbox.ferr, 6352, "rbox error: unknown flag at '%s'.\nExecute 'rbox' without arguments for documentation.\n", s - 1); qh_errexit_rbox(qh_ERRinput); } if (*s && !isspace(*s)) { - qh_fprintf_rbox(rbox.ferr, 7071, "rbox error: missing space between flags at %s.\n", s); + qh_fprintf_rbox(rbox.ferr, 6353, "rbox error: missing space between flags at %s.\n", s); qh_errexit_rbox(qh_ERRinput); } } @@ -297,7 +310,8 @@ if (rbox.isinteger && !isbox) box= qh_DEFAULTzbox; if (addcube) { - cubesize= (int)floor(ldexp(1.0,dim)+0.5); + tempr= floor(ldexp(1.0,dim)+0.5); + cubesize= (int)tempr; if (cube == 0.0) cube= box; }else @@ -344,6 +358,11 @@ qh_fprintf_rbox(rbox.ferr, 6270, "rbox error: 'Cn,r,m' requested n coincident points for each of m points. Either there is no points or m (%d) is greater than the number of points (%d).\n", coincidenttotal, numpoints); qh_errexit_rbox(qh_ERRinput); } + if (coincidentpoints > 0 && isregular) { + qh_fprintf_rbox(rbox.ferr, 6423, "rbox error: 'Cn,r,m' is not implemented for regular points ('r')\n"); + qh_errexit_rbox(qh_ERRinput); + } + if (coincidenttotal == 0) coincidenttotal= numpoints; @@ -382,7 +401,7 @@ }else if (israndom) { seed= (int)time(&timedata); sprintf(seedbuf, " t%d", seed); /* appends an extra t, not worth removing */ - strncat(command, seedbuf, sizeof(command)-strlen(command)-1); + strncat(command, seedbuf, sizeof(command) - strlen(command) - 1); t= strstr(command, " t "); if (t) strcpy(t+1, t+3); /* remove " t " */ @@ -407,9 +426,9 @@ while (s && *s) { /* 'P' */ count= 0; if (iscdd) - qh_out1( 1.0); + qh_out1(1.0); while (*++s) { - qh_out1( qh_strtod(s, &s)); + qh_out1(qh_strtod(s, &s)); count++; if (isspace(*s) || !*s) break; @@ -420,7 +439,7 @@ } if (count < dim) { for (k=dim-count; k--; ) - qh_out1( 0.0); + qh_out1(0.0); }else if (count > dim) { qh_fprintf_rbox(rbox.ferr, 6195, "rbox error: %d coordinates instead of %d coordinates in %s\n\n", count, dim, s); @@ -436,11 +455,11 @@ /* ============= simplex distribution =============== */ if (issimplex+issimplex2) { - if (!(simplex= (double*)qh_malloc( dim * (dim+1) * sizeof(double)))) { + if (!(*simplex= (double *)qh_malloc( (size_t)(dim * (dim+1)) * sizeof(double)))) { qh_fprintf_rbox(rbox.ferr, 6196, "rbox error: insufficient memory for simplex\n"); qh_errexit_rbox(qh_ERRmem); /* qh_ERRmem */ } - simplexp= simplex; + simplexp= *simplex; if (isregular) { for (i=0; i=0; k--) { if (j & ( 1 << k)) - qh_out1( cube); + qh_out1(cube); else - qh_out1( -cube); + qh_out1(-cube); } qh_fprintf_rbox(rbox.fout, 9400, "\n"); } @@ -763,14 +779,14 @@ if (adddiamond) { for (j=0; j=0; k--) { if (j/2 != k) - qh_out1( 0.0); + qh_out1(0.0); else if (j & 0x1) - qh_out1( diamond); + qh_out1(diamond); else - qh_out1( -diamond); + qh_out1(-diamond); } qh_fprintf_rbox(rbox.fout, 9401, "\n"); } @@ -778,17 +794,12 @@ if (iscdd) qh_fprintf_rbox(rbox.fout, 9402, "end\nhull\n"); - - /* same code for error exit and normal return */ - qh_free(simplex); - rbox_inuse= False; - return qh_ERRnone; -} /* rboxpoints */ +} /* rboxpoints2 */ /*------------------------------------------------ outxxx - output functions for qh_rboxpoints */ -int qh_roundi( double a) { +int qh_roundi(double a) { if (a < 0.0) { if (a - 0.5 < INT_MIN) { qh_fprintf_rbox(rbox.ferr, 6200, "rbox input error: negative coordinate %2.2g is too large. Reduce 'Bn'\n", a); @@ -807,12 +818,12 @@ void qh_out1(double a) { if (rbox.isinteger) - qh_fprintf_rbox(rbox.fout, 9403, "%d ", qh_roundi( a+rbox.out_offset)); + qh_fprintf_rbox(rbox.fout, 9403, "%d ", qh_roundi(a+rbox.out_offset)); else qh_fprintf_rbox(rbox.fout, 9404, qh_REAL_1, a+rbox.out_offset); } /* qh_out1 */ -void qh_out2n( double a, double b) { +void qh_out2n(double a, double b) { if (rbox.isinteger) qh_fprintf_rbox(rbox.fout, 9405, "%d %d\n", qh_roundi(a+rbox.out_offset), qh_roundi(b+rbox.out_offset)); @@ -820,7 +831,7 @@ qh_fprintf_rbox(rbox.fout, 9406, qh_REAL_2n, a+rbox.out_offset, b+rbox.out_offset); } /* qh_out2n */ -void qh_out3n( double a, double b, double c) { +void qh_out3n(double a, double b, double c) { if (rbox.isinteger) qh_fprintf_rbox(rbox.fout, 9407, "%d %d %d\n", qh_roundi(a+rbox.out_offset), qh_roundi(b+rbox.out_offset), qh_roundi(c+rbox.out_offset)); @@ -833,7 +844,7 @@ int k; if (iscdd) - qh_out1( 1.0); + qh_out1(1.0); for (k=0; k < dim; k++) qh_out1(*(p++)); qh_fprintf_rbox(rbox.fout, 9396, "\n"); @@ -845,10 +856,10 @@ int i,k; double randmax= qh_RANDOMmax; - for (i= 0; i

  • qh_findbestnew find best new facet for point
  • -
  • qh_getarea get area of all +
  • qh_furthestnewvertex return +furthest new vertex for facet
  • +
  • qh_furthestvertex return +furthest vertex in facetA above facetB
  • +
  • qh_getarea get area and volume of all facets in facetlist, collect statistics
  • qh_getcentrum return centrum for a facet
  • @@ -238,31 +241,37 @@ the hyperplane for a facet
  • qh_sharpnewfacets true if new facets contains a sharp corner
  • +
  • qh_vertex_bestdist +return nearest distance between vertices, except 'skip'
  • +
  • qh_vertex_isbelow true if +vertexA is below vertexB's simplicial facets, or least above
  • »geometric roundoff functions

    • qh_detjoggle determine -default joggle for points and distance roundoff error
    • +default joggle for points and distance roundoff error +
    • qh_detmaxoutside +determine qh.MAXoutside target for qh_RATIO... tests
    • qh_detroundoff -determine maximum roundoff error and other precision constants
    • +determine maximum roundoff error and other precision constants
    • qh_distround compute maximum roundoff error due to a distance computation to a -normalized hyperplane
    • +normalized hyperplane
    • qh_divzero divide by a number that is nearly zero
    • qh_maxouter return maximum outer plane
    • qh_outerinner return actual -outer and inner planes +outer and inner planes


    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    +Home page for +Qhull (local)
    +Up: Qhull manual: contents
    Up: ProgramsOptionsOutput @@ -272,9 +281,8 @@ • QhullPrecisionTrace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    +• Functions (local)
    +Up: Qhull code
    To: GeomGlobalIoMemMerge @@ -289,7 +297,7 @@ src="../../html/qh--geom.gif" align="middle" width="40" height="40">The Geometry Center Home Page

    Comments to: qhull@qhull.org -
    +
    Created: May 2, 1997 --- Last modified: see top

    diff -Nru qhull-2015.2/src/libqhull_r/qh-globa_r.htm qhull-2020.2/src/libqhull_r/qh-globa_r.htm --- qhull-2015.2/src/libqhull_r/qh-globa_r.htm 2016-01-17 21:51:15.000000000 +0000 +++ qhull-2020.2/src/libqhull_r/qh-globa_r.htm 2020-08-16 18:19:32.000000000 +0000 @@ -9,8 +9,8 @@

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    +href="http://www.qhull.org">Home page for Qhull (local)
    +Up: Qhull manual: contents
    Up: ProgramsOptionsOutput @@ -20,9 +20,8 @@ • QhullPrecisionTrace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    +• Functions (local)
    +Up: Qhull code
    To: GeomGlobalIoMemMergePoly @@ -40,7 +39,7 @@ first argument to most functions.

    -

    Copyright © 1995-2015 C.B. Barber

    +

    Copyright © 1995-2020 C.B. Barber


    » Geom Global • @@ -62,7 +61,7 @@ variables

    »libqhull_r.h other @@ -123,6 +122,10 @@ point to the convex hull
  • qh_findhorizon find the horizon and visible facets for a point
  • +
  • qh_buildcone +build cone of new facets from furthest to the horizon
  • +
  • qh_premerge +pre-merge non-convex facets
  • qh_partitionvisible partition points from facets in qh.visible_list to facets in qh.newfacet_list
  • @@ -131,16 +134,14 @@ outside a facet
  • qh_partitioncoplanar partition coplanar point into a facet
  • -
  • qh_precision restart on precision errors if not merging and if 'QJn'
  • +
  • qh_joggle_restart +if joggle ('QJn') and not merging, restart on precision errors
  • »Top-level routines for initializing and terminating Qhull (in other modules)

    -

    »Access and -predicate functions

    +

    »Access and predicate functions

    • qh_setendpointer return pointer to NULL terminator of a set
    • @@ -211,6 +209,8 @@ a set
    • qh_setlarger return a larger set with the same elements
    • +
    • qh_setlarger_quick return +True if newsize fits in quick memory
    • qh_setreplace replace one element with another in a set
    • qh_setunique add an @@ -274,9 +274,9 @@


      Up: -Home page for -Qhull
      -Up: Qhull manual: Table of Contents
      +Home page for +Qhull (local)
      +Up: Qhull manual: contents
      Up: ProgramsOptionsOutput @@ -286,9 +286,8 @@ • QhullPrecisionTrace -• Functions
      -Up: Qhull code: Table of Contents
      -To: Qhull functions, macros, and data structures
      +• Functions (local)
      +Up: Qhull code
      To: GeomGlobalIoMemMerge @@ -302,7 +301,7 @@ src="../../html/qh--geom.gif" align="middle" width="40" height="40">The Geometry Center Home Page

      Comments to: qhull@qhull.org -
      +
      Created: May 2, 1997 --- Last modified: see top

      diff -Nru qhull-2015.2/src/libqhull_r/qh-stat_r.htm qhull-2020.2/src/libqhull_r/qh-stat_r.htm --- qhull-2015.2/src/libqhull_r/qh-stat_r.htm 2016-01-17 21:51:15.000000000 +0000 +++ qhull-2020.2/src/libqhull_r/qh-stat_r.htm 2020-08-16 18:19:32.000000000 +0000 @@ -9,8 +9,8 @@

      Up: Home page for Qhull
      -Up: Qhull manual: Table of Contents
      +href="http://www.qhull.org">Home page for Qhull (local)
      +Up: Qhull manual: contents
      Up: ProgramsOptionsOutput @@ -20,9 +20,8 @@ • QhullPrecisionTrace -• Functions
      -Up: Qhull code: Table of Contents
      -To: Qhull functions, macros, and data structures
      +• Functions (local)
      +Up: Qhull code
      To: GeomGlobalIoMemMergePoly @@ -42,7 +41,7 @@ may be turned off in user_r.h. If so, all but the 'zz' statistics are ignored.

      -

      Copyright © 1995-2015 C.B. Barber

      +

      Copyright © 1995-2020 C.B. Barber


      » Geom Global @@ -127,9 +126,9 @@


      Up: -Home page for -Qhull
      -Up: Qhull manual: Table of Contents
      +Home page for +Qhull (local)
      +Up: Qhull manual: contents
      Up: ProgramsOptionsOutput @@ -139,9 +138,8 @@ • QhullPrecisionTrace -• Functions
      -Up: Qhull code: Table of Contents
      -To: Qhull functions, macros, and data structures
      +• Functions (local)
      +Up: Qhull code
      To: GeomGlobalIoMemMerge @@ -155,7 +153,7 @@ src="../../html/qh--geom.gif" align="middle" width="40" height="40">The Geometry Center Home Page

      Comments to: qhull@qhull.org -
      +
      Created: May 2, 1997 --- Last modified: see top

      diff -Nru qhull-2015.2/src/libqhull_r/qhull_ra.h qhull-2020.2/src/libqhull_r/qhull_ra.h --- qhull-2015.2/src/libqhull_r/qhull_ra.h 2016-01-17 16:06:10.000000000 +0000 +++ qhull-2020.2/src/libqhull_r/qhull_ra.h 2020-05-22 02:00:58.000000000 +0000 @@ -13,9 +13,9 @@ defines internal functions for libqhull_r.c global_r.c - Copyright (c) 1993-2015 The Geometry Center. - $Id: //main/2015/qhull/src/libqhull_r/qhull_ra.h#5 $$Change: 2062 $ - $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $ + Copyright (c) 1993-2020 The Geometry Center. + $Id: //main/2019/qhull/src/libqhull_r/qhull_ra.h#2 $$Change: 2953 $ + $DateTime: 2020/05/21 22:05:32 $$Author: bbarber $ Notes: grep for ((" and (" to catch fprintf("lkasdjf"); full parens around (x?y:z) @@ -109,21 +109,28 @@ # define QHULL_UNUSED(x) (void)x; #endif +#ifdef __cplusplus +extern "C" { +#endif + /***** -libqhull_r.c prototypes (alphabetical after qhull) ********************/ void qh_qhull(qhT *qh); boolT qh_addpoint(qhT *qh, pointT *furthest, facetT *facet, boolT checkdist); +void qh_build_withrestart(qhT *qh); +vertexT *qh_buildcone(qhT *qh, pointT *furthest, facetT *facet, int goodhorizon, facetT **retryfacet); +boolT qh_buildcone_mergepinched(qhT *qh, vertexT *apex, facetT *facet, facetT **retryfacet); +boolT qh_buildcone_onlygood(qhT *qh, vertexT *apex, int goodhorizon); void qh_buildhull(qhT *qh); void qh_buildtracing(qhT *qh, pointT *furthest, facetT *facet); -void qh_build_withrestart(qhT *qh); void qh_errexit2(qhT *qh, int exitcode, facetT *facet, facetT *otherfacet); void qh_findhorizon(qhT *qh, pointT *point, facetT *facet, int *goodvisible,int *goodhorizon); pointT *qh_nextfurthest(qhT *qh, facetT **visible); void qh_partitionall(qhT *qh, setT *vertices, pointT *points,int npoints); -void qh_partitioncoplanar(qhT *qh, pointT *point, facetT *facet, realT *dist); +void qh_partitioncoplanar(qhT *qh, pointT *point, facetT *facet, realT *dist, boolT allnew); void qh_partitionpoint(qhT *qh, pointT *point, facetT *facet); void qh_partitionvisible(qhT *qh, boolT allpoints, int *numpoints); -void qh_precision(qhT *qh, const char *reason); +void qh_joggle_restart(qhT *qh, const char *reason); void qh_printsummary(qhT *qh, FILE *fp); /***** -global_r.c internal prototypes (alphabetical) ***********************/ @@ -147,4 +154,8 @@ void qh_freebuffers(qhT *qh); void qh_initbuffers(qhT *qh, coordT *points, int numpoints, int dim, boolT ismalloc); +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif /* qhDEFqhulla */ diff -Nru qhull-2015.2/src/libqhull_r/qhull_r-exports.def qhull-2020.2/src/libqhull_r/qhull_r-exports.def --- qhull-2015.2/src/libqhull_r/qhull_r-exports.def 2016-01-17 21:51:14.000000000 +0000 +++ qhull-2020.2/src/libqhull_r/qhull_r-exports.def 2020-07-29 21:36:41.000000000 +0000 @@ -1,14 +1,19 @@ -; qhull_r-exports.def -- msvc module-definition file +; qhull_r-exports.def -- MSVC module-definition file ; ; Generated from depends.exe by cut-and-paste of exported symbols by mingw gcc ; [jan'14] 391 symbols -; Same as ../libqhullp/qhull-exports.def without DATA items (reentrant) ; -; $Id: //main/2015/qhull/src/libqhull_r/qhull_r-exports.def#3 $$Change: 2047 $ -; $DateTime: 2016/01/04 22:03:18 $$Author: bbarber $ -; +; Referenced by CMakeLists/add_library, libqhull_r.pro/DEF_FILE, +; and libqhull_r.vcxproj/Linker/Input/Module Definition File +; +; If qh_NOmerge, use qhull_r-nomerge-exports.def +; Created by -- grep -vE 'qh_all_merges|qh_appendmergeset|qh_basevertices|qh_check_dupridge|qh_checkconnect|qh_compare_facetmerge|qh_comparevisit|qh_copynonconvex|qh_degen_redundant_facet|qh_delridge_merge|qh_find_newvertex|qh_findbest_test|qh_findbestneighbor|qh_flippedmerges|qh_forcedmerges|qh_getmergeset|qh_getmergeset_initial|qh_hashridge|qh_hashridge_find|qh_makeridges|qh_mark_dupridges|qh_maydropneighbor|qh_merge_degenredundant|qh_merge_nonconvex|qh_mergecycle|qh_mergecycle_all|qh_mergecycle_facets|qh_mergecycle_neighbors|qh_mergecycle_ridges|qh_mergecycle_vneighbors|qh_mergefacet|qh_mergefacet2d|qh_mergeneighbors|qh_mergeridges|qh_mergesimplex|qh_mergevertex_del|qh_mergevertex_neighbors|qh_mergevertices|qh_nearcoplanar|qh_nearvertex|qh_neighbor_intersections|qh_newhashtable|qh_newvertex|qh_newvertices|qh_nextridge3d|qh_reducevertices|qh_redundant_vertex|qh_remove_extravertices|qh_rename_sharedvertex|qh_renameridgevertex|qh_renamevertex|qh_test_appendmerge|qh_test_degen_neighbors|qh_test_redundant_neighbors|qh_test_vneighbors|qh_tracemerge|qh_tracemerging|qh_triangulate_facet|qh_triangulate_link|qh_triangulate_mirror|qh_triangulate_null|qh_updatetested|qh_vertexridges|qh_vertexridges_facet|qh_willdelete' qhull_r-exports.def >qhull_r-nomerge-exports.def +; +; $Id: //main/2019/qhull/src/libqhull_r/qhull_r-exports.def#4 $$Change: 2967 $ +; $DateTime: 2020/06/05 16:33:18 $$Author: bbarber $ +; ; Define qhull_VERSION in CMakeLists.txt, Makefile, qhull-exports.def, qhull_p-exports.def, qhull_r-exports.def, and qhull-warn.pri -VERSION 7.0 +VERSION 8.0 EXPORTS qh_addhash qh_addpoint @@ -44,10 +49,12 @@ qh_check_points qh_checkconnect qh_checkconvex +qh_checkdelridge qh_checkfacet qh_checkflags qh_checkflipped qh_checkflipped_all +qh_checklists qh_checkpolygon qh_checkvertex qh_checkzero @@ -58,8 +65,7 @@ qh_compare_facetarea qh_compare_facetmerge qh_compare_facetvisit -qh_compareangle -qh_comparemerge +qh_compare_nummerge qh_comparevisit qh_copyfilename qh_copynonconvex @@ -68,10 +74,9 @@ qh_createsimplex qh_crossproduct qh_degen_redundant_facet -qh_degen_redundant_neighbors qh_deletevisible qh_delfacet -qh_delridge +qh_delridge_merge qh_delvertex qh_determinant qh_detjoggle @@ -155,6 +160,7 @@ qh_initthresholds qh_inthresholds qh_isvertex +qh_joggle_restart qh_joggleinput qh_lib_check qh_makenew_nonsimplicial @@ -167,7 +173,7 @@ qh_mark_dupridges qh_markkeep qh_markvoronoi -qh_matchduplicates +qh_matchdupridge qh_matchneighbor qh_matchnewfacets qh_matchvertices @@ -213,6 +219,7 @@ qh_newstats qh_newvertex qh_newvertices +qh_nextfacet2d qh_nextfurthest qh_nextridge3d qh_normalize @@ -237,7 +244,6 @@ qh_pointid qh_pointvertex qh_postmerge -qh_precision qh_premerge qh_prepare_output qh_prependfacet @@ -270,8 +276,11 @@ qh_printfacets qh_printhashtable qh_printhelp_degenerate +qh_printhelp_internal qh_printhelp_narrowhull qh_printhelp_singular +qh_printhelp_topology +qh_printhelp_wide qh_printhyperplaneintersection qh_printline3geom qh_printlists @@ -357,6 +366,7 @@ qh_setin qh_setindex qh_setlarger +qh_setlarger_quick qh_setlast qh_setnew qh_setnew_delnthsorted @@ -380,6 +390,8 @@ qh_strtod qh_strtol qh_test_appendmerge +qh_test_degen_neighbors +qh_test_redundant_neighbors qh_test_vneighbors qh_tracemerge qh_tracemerging @@ -389,7 +401,8 @@ qh_triangulate_mirror qh_triangulate_null qh_updatetested -qh_updatevertices +qh_update_vertexneighbors +qh_update_vertexneighbors_cone qh_user_memsizes qh_version qh_version2 diff -Nru qhull-2015.2/src/libqhull_r/qhull_r-nomerge-exports.def qhull-2020.2/src/libqhull_r/qhull_r-nomerge-exports.def --- qhull-2015.2/src/libqhull_r/qhull_r-nomerge-exports.def 1970-01-01 00:00:00.000000000 +0000 +++ qhull-2020.2/src/libqhull_r/qhull_r-nomerge-exports.def 2020-07-29 21:36:41.000000000 +0000 @@ -0,0 +1,352 @@ +; qhull_r-exports.def --module-definition file +; +; Generated from depends.exe by cut-and-paste of exported symbols by mingw gcc +; [jan'14] 391 symbols +; Same as ../libqhullp/qhull-exports.def without DATA items (reentrant) +; +; Referenced by CMakeLists/add_library, libqhull_r.pro/DEF_FILE, +; and libqhull_r.vcxproj/Linker/Input/Module Definition File +; +; If qh_NOmerge, use qhull_r-nomerge-exports.def +; Created by -- grep -vE 'qh_all_merges|qh_appendmergeset|qh_basevertices|qh_check_dupridge|qh_checkconnect|qh_compare_facetmerge|qh_comparevisit|qh_copynonconvex|qh_degen_redundant_facet|qh_delridge_merge|qh_find_newvertex|qh_findbest_test|qh_findbestneighbor|qh_flippedmerges|qh_forcedmerges|qh_getmergeset|qh_getmergeset_initial|qh_hashridge|qh_hashridge_find|qh_makeridges|qh_mark_dupridges|qh_maydropneighbor|qh_merge_degenredundant|qh_merge_nonconvex|qh_mergecycle|qh_mergecycle_all|qh_mergecycle_facets|qh_mergecycle_neighbors|qh_mergecycle_ridges|qh_mergecycle_vneighbors|qh_mergefacet|qh_mergefacet2d|qh_mergeneighbors|qh_mergeridges|qh_mergesimplex|qh_mergevertex_del|qh_mergevertex_neighbors|qh_mergevertices|qh_nearcoplanar|qh_nearvertex|qh_neighbor_intersections|qh_newhashtable|qh_newvertex|qh_newvertices|qh_nextridge3d|qh_reducevertices|qh_redundant_vertex|qh_remove_extravertices|qh_rename_sharedvertex|qh_renameridgevertex|qh_renamevertex|qh_test_appendmerge|qh_test_degen_neighbors|qh_test_redundant_neighbors|qh_test_vneighbors|qh_tracemerge|qh_tracemerging|qh_triangulate_facet|qh_triangulate_link|qh_triangulate_mirror|qh_triangulate_null|qh_updatetested|qh_vertexridges|qh_vertexridges_facet|qh_willdelete' qhull_r-nomerge-exports.def >qhull_r-nomerge-exports.def +; +; $Id: //main/2019/qhull/src/libqhull_r/qhull_r-nomerge-exports.def#4 $$Change: 2967 $ +; $DateTime: 2020/06/05 16:33:18 $$Author: bbarber $ +; +; Define qhull_VERSION in CMakeLists.txt, Makefile, qhull-exports.def, qhull_p-exports.def, qhull_r-exports.def, and qhull-warn.pri +VERSION 8.0 +EXPORTS +qh_addhash +qh_addpoint +qh_allstatA +qh_allstatB +qh_allstatC +qh_allstatD +qh_allstatE +qh_allstatE2 +qh_allstatF +qh_allstatG +qh_allstatH +qh_allstatI +qh_allstatistics +qh_appendfacet +qh_appendprint +qh_appendvertex +qh_argv_to_command +qh_argv_to_command_size +qh_attachnewfacets +qh_backnormal +qh_build_withrestart +qh_buildhull +qh_buildtracing +qh_check_bestdist +qh_check_maxout +qh_check_output +qh_check_point +qh_check_points +qh_checkconvex +qh_checkdelridge +qh_checkfacet +qh_checkflags +qh_checkflipped +qh_checkflipped_all +qh_checkpolygon +qh_checkvertex +qh_checkzero +qh_clear_outputflags +qh_clearcenters +qh_clock +qh_collectstatistics +qh_compare_facetarea +qh_compare_facetvisit +qh_compare_nummerge +qh_copyfilename +qh_copypoints +qh_countfacets +qh_createsimplex +qh_crossproduct +qh_deletevisible +qh_delfacet +qh_delvertex +qh_determinant +qh_detjoggle +qh_detroundoff +qh_detsimplex +qh_detvnorm +qh_detvridge +qh_detvridge3 +qh_dfacet +qh_distnorm +qh_distplane +qh_distround +qh_divzero +qh_dvertex +qh_eachvoronoi +qh_eachvoronoi_all +qh_errexit +qh_errexit2 +qh_errexit_rbox +qh_errprint +qh_exit +qh_facet2point +qh_facet3vertex +qh_facetarea +qh_facetarea_simplex +qh_facetcenter +qh_facetintersect +qh_facetvertices +qh_findbest +qh_findbestfacet +qh_findbesthorizon +qh_findbestlower +qh_findbestnew +qh_findfacet_all +qh_findgood +qh_findgood_all +qh_findgooddist +qh_findhorizon +qh_fprintf +qh_fprintf_rbox +qh_fprintf_stderr +qh_free +qh_freebuffers +qh_freebuild +qh_freeqhull +qh_furthestnext +qh_furthestout +qh_gausselim +qh_geomplanes +qh_getangle +qh_getarea +qh_getcenter +qh_getcentrum +qh_getdistance +qh_gethash +qh_gram_schmidt +qh_infiniteloop +qh_init_A +qh_init_B +qh_init_qhull_command +qh_initbuild +qh_initflags +qh_initialhull +qh_initialvertices +qh_initqhull_buffers +qh_initqhull_globals +qh_initqhull_mem +qh_initqhull_outputflags +qh_initqhull_start +qh_initqhull_start2 +qh_initstatistics +qh_initthresholds +qh_inthresholds +qh_isvertex +qh_joggle_restart +qh_joggleinput +qh_lib_check +qh_makenew_nonsimplicial +qh_makenew_simplicial +qh_makenewfacet +qh_makenewfacets +qh_makenewplanes +qh_malloc +qh_markkeep +qh_markvoronoi +qh_matchdupridge +qh_matchneighbor +qh_matchnewfacets +qh_matchvertices +qh_maxabsval +qh_maxmin +qh_maxouter +qh_maxsimplex +qh_memalloc +qh_memfree +qh_memfreeshort +qh_meminit +qh_meminitbuffers +qh_memsetup +qh_memsize +qh_memstatistics +qh_memtotal +qh_minabsval +qh_mindiff +qh_new_qhull +qh_newfacet +qh_newridge +qh_newstats +qh_nextfacet2d +qh_nextfurthest +qh_normalize +qh_normalize2 +qh_nostatistic +qh_option +qh_order_vertexneighbors +qh_orientoutside +qh_out1 +qh_out2n +qh_out3n +qh_outcoplanar +qh_outerinner +qh_partitionall +qh_partitioncoplanar +qh_partitionpoint +qh_partitionvisible +qh_point +qh_point_add +qh_pointdist +qh_pointfacet +qh_pointid +qh_pointvertex +qh_postmerge +qh_premerge +qh_prepare_output +qh_prependfacet +qh_printafacet +qh_printallstatistics +qh_printbegin +qh_printcenter +qh_printcentrum +qh_printend +qh_printend4geom +qh_printextremes +qh_printextremes_2d +qh_printextremes_d +qh_printfacet +qh_printfacet2geom +qh_printfacet2geom_points +qh_printfacet2math +qh_printfacet3geom_nonsimplicial +qh_printfacet3geom_points +qh_printfacet3geom_simplicial +qh_printfacet3math +qh_printfacet3vertex +qh_printfacet4geom_nonsimplicial +qh_printfacet4geom_simplicial +qh_printfacetNvertex_nonsimplicial +qh_printfacetNvertex_simplicial +qh_printfacetheader +qh_printfacetlist +qh_printfacetridges +qh_printfacets +qh_printhashtable +qh_printhelp_degenerate +qh_printhelp_internal +qh_printhelp_narrowhull +qh_printhelp_singular +qh_printhelp_topology +qh_printhelp_wide +qh_printhyperplaneintersection +qh_printline3geom +qh_printlists +qh_printmatrix +qh_printneighborhood +qh_printpoint +qh_printpoint3 +qh_printpointid +qh_printpoints +qh_printpoints_out +qh_printpointvect +qh_printpointvect2 +qh_printridge +qh_printspheres +qh_printstatistics +qh_printstatlevel +qh_printstats +qh_printsummary +qh_printvdiagram +qh_printvdiagram2 +qh_printvertex +qh_printvertexlist +qh_printvertices +qh_printvneighbors +qh_printvnorm +qh_printvoronoi +qh_printvridge +qh_produce_output +qh_produce_output2 +qh_projectdim3 +qh_projectinput +qh_projectpoint +qh_projectpoints +qh_qhull +qh_rand +qh_randomfactor +qh_randommatrix +qh_rboxpoints +qh_readfeasible +qh_readpoints +qh_removefacet +qh_removevertex +qh_resetlists +qh_rotateinput +qh_rotatepoints +qh_roundi +qh_scaleinput +qh_scalelast +qh_scalepoints +qh_setaddnth +qh_setaddsorted +qh_setappend +qh_setappend2ndlast +qh_setappend_set +qh_setcheck +qh_setcompact +qh_setcopy +qh_setdel +qh_setdelaunay +qh_setdellast +qh_setdelnth +qh_setdelnthsorted +qh_setdelsorted +qh_setduplicate +qh_setequal +qh_setequal_except +qh_setequal_skip +qh_setfacetplane +qh_setfeasible +qh_setfree +qh_setfree2 +qh_setfreelong +qh_sethalfspace +qh_sethalfspace_all +qh_sethyperplane_det +qh_sethyperplane_gauss +qh_setin +qh_setindex +qh_setlarger +qh_setlarger_quick +qh_setlast +qh_setnew +qh_setnew_delnthsorted +qh_setprint +qh_setreplace +qh_setsize +qh_settemp +qh_settempfree +qh_settempfree_all +qh_settemppop +qh_settemppush +qh_settruncate +qh_setunique +qh_setvoronoi_all +qh_setzero +qh_sharpnewfacets +qh_skipfacet +qh_skipfilename +qh_srand +qh_stddev +qh_strtod +qh_strtol +qh_triangulate +qh_update_vertexneighbors +qh_update_vertexneighbors_cone +qh_user_memsizes +qh_version +qh_version2 +qh_vertexintersect +qh_vertexintersect_new +qh_vertexneighbors +qh_vertexsubset +qh_voronoi_center +qh_zero diff -Nru qhull-2015.2/src/libqhull_r/qh-user_r.htm qhull-2020.2/src/libqhull_r/qh-user_r.htm --- qhull-2015.2/src/libqhull_r/qh-user_r.htm 2016-01-17 21:51:15.000000000 +0000 +++ qhull-2020.2/src/libqhull_r/qh-user_r.htm 2020-08-16 18:19:32.000000000 +0000 @@ -9,8 +9,8 @@

      Up: Home page for Qhull
      -Up: Qhull manual: Table of Contents
      +href="http://www.qhull.org">Home page for Qhull (local)
      +Up: Qhull manual: contents
      Up: ProgramsOptionsOutput @@ -20,9 +20,8 @@ • QhullPrecisionTrace -• Functions
      -Up: Qhull code: Table of Contents
      -To: Qhull functions, macros, and data structures
      +• Functions (local)
      +Up: Qhull code
      To: GeomGlobalIoMemMergePoly @@ -36,7 +35,7 @@ user may want to change.

      -

      Copyright © 1995-2015 C.B. Barber

      +

      Copyright © 1995-2020 C.B. Barber


      » Geom Global @@ -91,8 +90,8 @@ output, indicates Voronoi center at infinity

    • qh_ORIENTclock define convention for orienting facets
    • -
    • qh_ZEROdelaunay -define facets that are ignored in Delaunay triangulations
    • +
    • qh_RANDOMdist +for testing qh.DISTround (sets qh.RANDOMfactor for qh.RANDOMdist, same as option 'Rn')

    »joggle constants

    @@ -151,6 +150,8 @@ compute furthest distance to an outside point instead of storing it with the facet
  • qh_KEEPstatistics enable statistic gathering and reporting with option 'Ts' +
  • qh_MAXcheckpoint + report up to qh_MAXcheckpoint errors per facet in qh_check_point ('Tv')
  • qh_MAXoutside record outer plane for each facet
  • qh_NOmerge @@ -167,10 +168,9 @@ constants
    • qh_BESTcentrum -when does qh_findbestneighbor() test centrums?
    • +if many vertices for facet, qh_findbestneighbor tests centrums instead of vertices
    • qh_BESTnonconvex -when does qh_findbestneighbor() test nonconvex -ridges only?
    • +if many neighbors for facet, qh_findbestneighbor only tests nonconvex ridges
    • qh_COPLANARratio what is qh.MINvisible?
    • qh_DIMreduceBuild @@ -178,28 +178,58 @@
    • qh_DIMmergeVertex max dimension for vertex merging
    • qh_DISToutside -when is a point clearly outside of a facet for qh_findbestnew and qh_partitionall
    • +when is a point clearly outside of a facet for qh_findbestnew and qh_partitionall
    • qh_MAXnarrow max. cosine for qh.NARROWhull
    • +
    • qh_MAXcoplanarcentrum +if 'Qx' and many merges, use f.maxoutside for coplanarity test +instead of qh.centrum_radius
    • +
    • qh_MAXnarrow +max. cosine in initial hull that sets qh.NARROWhull
    • qh_MAXnewcentrum when does qh_reducevertices_centrum() reset the centrum?
    • qh_MAXnewmerges when does qh_merge_nonconvex() call qh_reducevertices_centrums?
    • +
    • qh_RATIOconcavehorizon +ratio of horizon vertex distance to qh.max_outside for concave, twisted new facets in qh_test_nonsimplicial_merge
    • +
    • qh_RATIOconvexmerge +ratio of vertex distance to qh.min_vertex for clearly convex new facets in qh_test_nonsimplicial_merge
    • +
    • qh_RATIOcoplanarapex +ratio of best distance for coplanar apex vs. vertex merge in qh_getpinchedmerges
    • +
    • qh_RATIOcoplanaroutside +ratio to repartition a coplanar point as an outside point in qh_partitioncoplanar and qh_check_maxout
    • +
    • qh_RATIOmaxsimplex +ratio for searching all points in qh_maxsimplex
    • qh_RATIOnearinside -ratio for retaining inside points for -qh_check_maxout()
    • +ratio for retaining inside points for qh_check_maxout +
    • qh_RATIOpinchedsubridge +ratio to qh.ONEmerge to accept vertices in qh_findbest_pinchedvertex
    • +
    • qh_RATIOtrypinched +ratio to qh.ONEmerge to try qh_getpinchedmerges in qh_buildcone_mergepinched
    • +
    • qh_RATIOtwisted +maximum ratio to qh.ONEmerge to merge twisted facets in qh_merge_twisted
    • qh_SEARCHdist when is facet coplanar with the best facet for qh_findbesthorizon
    • qh_USEfindbestnew when to use qh_findbestnew for qh_partitionpoint()
    • qh_WARNnarrow -max. cosine to warn about qh.NARROWhull
    • +max. cosine in initial hull to warn about qh.NARROWhull
    • qh_WIDEcoplanar -what is a wide facet?
    • +what is a wide facet
    • qh_WIDEduplicate -what is a wide ratio on merging duplicate ridges?
    • +merge ratio for errexit from qh_forcedmerges due to duplicate ridge +
    • qh_WIDEridge +merge ratio for selecting a forced dupridge merge
    • +
    • qh_WIDEmaxoutside +precision ratio for maximum increase for qh.max_outside in qh_check_maxout
    • +
    • qh_WIDEmaxoutside2 +precision ratio for maximum qh.max_outside in qh_check_maxout
    • +
    • qh_WIDEpinched +merge ratio for distance between pinched vertices compared to current facet width for qh_getpinchedmerges and qh_next_vertexmerge
    • +
    • qh_ZEROdelaunay +define facets that are ignored in Delaunay triangulations

    »user_r.c @@ -214,13 +244,27 @@ of points

  • qh_printfacetlist print all fields of all facets
  • +
  • qh_printhelp_degenerate +prints descriptive message for precision error
  • +
  • qh_printhelp_internal +print help message for an internal error
  • +
  • qh_printhelp_narrowhull +prints descriptive message to warn about a narrow hull
  • +
  • qh_printhelp_singular +print help message for singular data
  • +
  • qh_printhelp_topology +print help message for a topology error due to merging
  • +
  • qh_printhelp_wide +print help message for a wide merge error
  • +
  • qh_user_memsizes +define additional quick allocation sizes

    »usermem_r.c functions

    • qh_exit exit program, same as exit(). May be redefined as throw "QH10003.." by libqhullcpp/usermem_r-cpp.cpp
    • -
    • qh_fprintf_stderr print to stderr when qh->ferr is not defined.
    • +
    • qh_fprintf_stderr print to stderr when qh.ferr is not defined.
    • qh_free free memory, same as free().
    • qh_malloc allocate memory, same as malloc()
    @@ -237,9 +281,9 @@


    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    +Home page for +Qhull (local)
    +Up: Qhull manual: contents
    Up: ProgramsOptionsOutput @@ -249,9 +293,8 @@ • QhullPrecisionTrace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    +• Functions (local)
    +Up: Qhull code
    To: GeomGlobalIoMemMerge @@ -265,7 +308,7 @@ src="../../html/qh--geom.gif" align="middle" width="40" height="40">The Geometry Center Home Page

    Comments to: qhull@qhull.org -
    +
    Created: May 2, 1997 --- Last modified: see top

    diff -Nru qhull-2015.2/src/libqhull_r/qset_r.c qhull-2020.2/src/libqhull_r/qset_r.c --- qhull-2015.2/src/libqhull_r/qset_r.c 2016-01-17 04:08:21.000000000 +0000 +++ qhull-2020.2/src/libqhull_r/qset_r.c 2020-05-22 02:00:58.000000000 +0000 @@ -11,9 +11,11 @@ either the actual size of the set plus 1, or the NULL terminator of the set (i.e., setelemT). - Copyright (c) 1993-2015 The Geometry Center. - $Id: //main/2015/qhull/src/libqhull_r/qset_r.c#3 $$Change: 2062 $ - $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $ + Only reference qh for qhmem or qhstat. Otherwise the matching code in qset.c will bring in qhT + + Copyright (c) 1993-2020 The Geometry Center. + $Id: //main/2019/qhull/src/libqhull_r/qset_r.c#8 $$Change: 2953 $ + $DateTime: 2020/05/21 22:05:32 $$Author: bbarber $ */ #include "libqhull_r.h" /* for qhT and QHULL_CRTDBG */ @@ -44,7 +46,7 @@ /*---------------------------------- - qh_setaddnth(qh, setp, nth, newelem) + qh_setaddnth(qh, setp, nth, newelem ) adds newelem as n'th element of sorted or unsorted *setp notes: @@ -116,7 +118,7 @@ /*--------------------------------- - qh_setappend(qh, setp, newelem) + qh_setappend(qh, setp, newelem ) append newelem to *setp notes: @@ -148,7 +150,7 @@ /*--------------------------------- - qh_setappend_set(qh, setp, setA) + qh_setappend_set(qh, setp, setA ) appends setA to *setp notes: @@ -231,7 +233,7 @@ design: checks that maxsize, actual size, and NULL terminator agree */ -void qh_setcheck(qhT *qh, setT *set, const char *tname, unsigned id) { +void qh_setcheck(qhT *qh, setT *set, const char *tname, unsigned int id) { int maxsize, size; int waserr= 0; @@ -283,7 +285,7 @@ destp= elemp= firstp= SETaddr_(set, void); endp= destp + size; while (1) { - if (!(*destp++ = *elemp++)) { + if (!(*destp++= *elemp++)) { destp--; if (elemp > endp) break; @@ -367,7 +369,7 @@ /*--------------------------------- - qh_setdellast(set) + qh_setdellast( set ) return last element of set or NULL notes: @@ -428,7 +430,7 @@ sizep= SETsizeaddr_(set); if ((sizep->i--)==0) /* if was a full set */ - sizep->i= set->maxsize; /* *sizep= (maxsize-1)+ 1 */ + sizep->i= set->maxsize; /* *sizep= (maxsize-1)+ 1 */ if (nth < 0 || nth >= sizep->i) { qh_fprintf(qh, qh->qhmem.ferr, 6174, "qhull internal error (qh_setdelnth): nth %d is out-of-bounds for set:\n", nth); qh_setprint(qh, qh->qhmem.ferr, "", set); @@ -487,7 +489,7 @@ /*--------------------------------- - qh_setdelsorted(set, oldelem ) + qh_setdelsorted( set, oldelem ) deletes oldelem from sorted set returns: @@ -600,7 +602,7 @@ return 1; elemAp= SETaddr_(setA, void); elemBp= SETaddr_(setB, void); - if (!memcmp((char *)elemAp, (char *)elemBp, sizeA*SETelemsize)) + if (!memcmp((char *)elemAp, (char *)elemBp, (size_t)(sizeA * SETelemsize))) return 1; return 0; } /* setequal */ @@ -718,7 +720,7 @@ void **freelistp; /* used if !qh_NOmem by qh_memfree_() */ if (*setp) { - size= sizeof(setT) + ((*setp)->maxsize)*SETelemsize; + size= (int)sizeof(setT) + ((*setp)->maxsize)*SETelemsize; if (size <= qh->qhmem.LASTsize) { qh_memfree_(qh, *setp, size, freelistp); }else @@ -771,7 +773,7 @@ int size; if (*setp) { - size= sizeof(setT) + ((*setp)->maxsize)*SETelemsize; + size= (int)sizeof(setT) + ((*setp)->maxsize)*SETelemsize; if (size > qh->qhmem.LASTsize) { qh_memfree(qh, *setp, size); *setp= NULL; @@ -783,7 +785,7 @@ /*--------------------------------- - qh_setin(set, setelem ) + qh_setin( set, setelem ) returns 1 if setelem is in a set, 0 otherwise notes: @@ -843,7 +845,13 @@ returns a larger set that contains all elements of *oldsetp notes: - the set is at least twice as large + if long memory, + the new set is 2x larger + if qhmem.LASTsize is between 1.5x and 2x + the new set is qhmem.LASTsize + otherwise use quick memory, + the new set is 2x larger, rounded up to next qh_memsize + if temp set, updates qh->qhmem.tempstack design: @@ -853,22 +861,23 @@ deletes the old set */ void qh_setlarger(qhT *qh, setT **oldsetp) { - int size= 1; + int setsize= 1, newsize; setT *newset, *set, **setp, *oldset; setelemT *sizep; setelemT *newp, *oldp; if (*oldsetp) { oldset= *oldsetp; - SETreturnsize_(oldset, size); + SETreturnsize_(oldset, setsize); qh->qhmem.cntlarger++; - qh->qhmem.totlarger += size+1; - newset= qh_setnew(qh, 2 * size); + qh->qhmem.totlarger += setsize+1; + qh_setlarger_quick(qh, setsize, &newsize); + newset= qh_setnew(qh, newsize); oldp= (setelemT *)SETaddr_(oldset, void); newp= (setelemT *)SETaddr_(newset, void); - memcpy((char *)newp, (char *)oldp, (size_t)(size+1) * SETelemsize); + memcpy((char *)newp, (char *)oldp, (size_t)(setsize+1) * SETelemsize); sizep= SETsizeaddr_(newset); - sizep->i= size+1; + sizep->i= setsize+1; FOREACHset_((setT *)qh->qhmem.tempstack) { if (set == oldset) *(setp-1)= newset; @@ -881,6 +890,39 @@ /*--------------------------------- + + qh_setlarger_quick(qh, setsize, newsize ) + determine newsize for setsize + returns True if newsize fits in quick memory + + design: + if 2x fits into quick memory + return True, 2x + if x+4 does not fit into quick memory + return False, 2x + if x+x/3 fits into quick memory + return True, the last quick set + otherwise + return False, 2x +*/ +int qh_setlarger_quick(qhT *qh, int setsize, int *newsize) { + int lastquickset; + + *newsize= 2 * setsize; + lastquickset= (qh->qhmem.LASTsize - (int)sizeof(setT)) / SETelemsize; /* matches size computation in qh_setnew */ + if (*newsize <= lastquickset) + return 1; + if (setsize + 4 > lastquickset) + return 0; + if (setsize + setsize/3 <= lastquickset) { + *newsize= lastquickset; + return 1; + } + return 0; +} /* setlarger_quick */ + +/*--------------------------------- qh_setlast( set ) @@ -929,7 +971,7 @@ if (!setsize) setsize++; - size= sizeof(setT) + setsize * SETelemsize; + size= (int)sizeof(setT) + setsize * SETelemsize; /* setT includes NULL terminator, see qh.LASTquickset */ if (size>0 && size <= qh->qhmem.LASTsize) { qh_memalloc_(qh, size, freelistp, set, setT); #ifndef qh_NOmem @@ -938,7 +980,7 @@ setsize += (sizereceived - size)/SETelemsize; #endif }else - set= (setT*)qh_memalloc(qh, size); + set= (setT *)qh_memalloc(qh, size); set->maxsize= setsize; set->e[setsize].i= 1; set->e[0].p= NULL; @@ -1104,6 +1146,7 @@ errors if set's maxsize is incorrect same as SETreturnsize_(set) same code for qh_setsize [qset_r.c] and QhullSetBase::count + if first element is NULL, SETempty_() is True but qh_setsize may be greater than 0 design: determine actual size of set from maxsize @@ -1132,7 +1175,7 @@ >-------------------------------- qh_settemp(qh, setsize ) - return a stacked, temporary set of upto setsize elements + return a stacked, temporary set of up to setsize elements notes: use settempfree or settempfree_all to release from qh->qhmem.tempstack @@ -1221,7 +1264,7 @@ setT *qh_settemppop(qhT *qh) { setT *stackedset; - stackedset= (setT*)qh_setdellast(qh->qhmem.tempstack); + stackedset= (setT *)qh_setdellast(qh->qhmem.tempstack); if (!stackedset) { qh_fprintf(qh, qh->qhmem.ferr, 6180, "qhull internal error (qh_settemppop): pop from empty temporary stack\n"); qh_errexit(qh, qhmem_ERRqhull, NULL, NULL); diff -Nru qhull-2015.2/src/libqhull_r/qset_r.h qhull-2020.2/src/libqhull_r/qset_r.h --- qhull-2015.2/src/libqhull_r/qset_r.h 2016-01-17 04:12:03.000000000 +0000 +++ qhull-2020.2/src/libqhull_r/qset_r.h 2020-05-22 02:00:58.000000000 +0000 @@ -16,9 +16,9 @@ - every set is NULL terminated - sets may be sorted or unsorted, the caller must distinguish this - Copyright (c) 1993-2015 The Geometry Center. - $Id: //main/2015/qhull/src/libqhull_r/qset_r.h#3 $$Change: 2062 $ - $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $ + Copyright (c) 1993-2020 The Geometry Center. + $Id: //main/2019/qhull/src/libqhull_r/qset_r.h#4 $$Change: 2953 $ + $DateTime: 2020/05/21 22:05:32 $$Author: bbarber $ */ #ifndef qhDEFset @@ -128,10 +128,11 @@ variable is NULL at end of loop example: - #define FOREACHfacet_( facets ) FOREACHsetelement_( facetT, facets, facet ) + #define FOREACHfacet_(facets) FOREACHsetelement_(facetT, facets, facet) notes: use FOREACHsetelement_i_() if need index or include NULLs + assumes set is not modified WARNING: nested loops can't use the same variable (define another FOREACH) @@ -164,7 +165,7 @@ variable==NULL and variable_i==variable_n example: - #define FOREACHfacet_i_( qh, facets ) FOREACHsetelement_i_( qh, facetT, facets, facet ) + #define FOREACHfacet_i_(qh, facets) FOREACHsetelement_i_(qh, facetT, facets, facet) WARNING: nested loops can't use the same variable (define another FOREACH) @@ -199,7 +200,7 @@ variable is NULL example: - #define FOREACHvertexreverse_( vertices ) FOREACHsetelementreverse_( vertexT, vertices, vertex ) + #define FOREACHvertexreverse_(vertices) FOREACHsetelementreverse_(vertexT, vertices, vertex) notes: use FOREACHsetelementreverse12_() to reverse first two elements @@ -231,7 +232,7 @@ variable is NULL at end of loop example - #define FOREACHvertexreverse12_( vertices ) FOREACHsetelementreverse12_( vertexT, vertices, vertex ) + #define FOREACHvertexreverse12_(vertices) FOREACHsetelementreverse12_(vertexT, vertices, vertex) notes: WARNING: needs braces if nested inside another FOREACH @@ -266,6 +267,7 @@ FOREACHelem_(set) { notes: + assumes set is not modified WARNING: needs braces if nested inside another FOREACH */ #define FOREACHelem_(set) FOREACHsetelement_(void, set, elem) @@ -344,7 +346,7 @@ notes: assumes that n is valid [0..size] and that set is defined */ -#define SETelemt_(set, n, type) ((type*)((set)->e[n].p)) +#define SETelemt_(set, n, type) ((type *)((set)->e[n].p)) /*----------------------------------------- @@ -373,7 +375,7 @@ return first element of set as a type */ -#define SETfirstt_(set, type) ((type*)((set)->e[0].p)) +#define SETfirstt_(set, type) ((type *)((set)->e[0].p)) /*----------------------------------------- @@ -390,7 +392,7 @@ SETsecondt_(set, type) return second element of set as a type */ -#define SETsecondt_(set, type) ((type*)((set)->e[1].p)) +#define SETsecondt_(set, type) ((type *)((set)->e[1].p)) /*----------------------------------------- @@ -416,10 +418,11 @@ >---------------------------------------- SETempty_(set) - return true(1) if set is empty + return true(1) if set is empty (i.e., FOREACHsetelement_ is empty) notes: set may be NULL + qh_setsize may be non-zero if first element is NULL */ #define SETempty_(set) (!set || (SETfirst_(set) ? 0 : 1)) @@ -452,12 +455,16 @@ /*======= prototypes in alphabetical order ============*/ +#ifdef __cplusplus +extern "C" { +#endif + void qh_setaddsorted(qhT *qh, setT **setp, void *elem); void qh_setaddnth(qhT *qh, setT **setp, int nth, void *newelem); void qh_setappend(qhT *qh, setT **setp, void *elem); void qh_setappend_set(qhT *qh, setT **setp, setT *setA); void qh_setappend2ndlast(qhT *qh, setT **setp, void *elem); -void qh_setcheck(qhT *qh, setT *set, const char *tname, unsigned id); +void qh_setcheck(qhT *qh, setT *set, const char *tname, unsigned int id); void qh_setcompact(qhT *qh, setT *set); setT *qh_setcopy(qhT *qh, setT *set, int extra); void *qh_setdel(setT *set, void *elem); @@ -474,14 +481,15 @@ void qh_setfree2(qhT *qh, setT **setp, int elemsize); void qh_setfreelong(qhT *qh, setT **set); int qh_setin(setT *set, void *setelem); -int qh_setindex(setT *set, void *setelem); +int qh_setindex(setT *set, void *setelem); void qh_setlarger(qhT *qh, setT **setp); +int qh_setlarger_quick(qhT *qh, int setsize, int *newsize); void *qh_setlast(setT *set); setT *qh_setnew(qhT *qh, int size); setT *qh_setnew_delnthsorted(qhT *qh, setT *set, int size, int nth, int prepend); void qh_setprint(qhT *qh, FILE *fp, const char* string, setT *set); void qh_setreplace(qhT *qh, setT *set, void *oldelem, void *newelem); -int qh_setsize(qhT *qh, setT *set); +int qh_setsize(qhT *qh, setT *set); setT *qh_settemp(qhT *qh, int setsize); void qh_settempfree(qhT *qh, setT **set); void qh_settempfree_all(qhT *qh); @@ -491,5 +499,8 @@ int qh_setunique(qhT *qh, setT **set, void *elem); void qh_setzero(qhT *qh, setT *set, int idx, int size); +#ifdef __cplusplus +} /* extern "C" */ +#endif #endif /* qhDEFset */ diff -Nru qhull-2015.2/src/libqhull_r/random_r.c qhull-2020.2/src/libqhull_r/random_r.c --- qhull-2015.2/src/libqhull_r/random_r.c 2016-01-17 04:22:08.000000000 +0000 +++ qhull-2020.2/src/libqhull_r/random_r.c 2019-06-05 20:20:41.000000000 +0000 @@ -21,22 +21,21 @@ #endif /*--------------------------------- + >-------------------------------- - qh_argv_to_command(argc, argv, command, max_size ) + qh_argv_to_command( argc, argv, command, max_size ) build command from argc/argv max_size is at least - returns: + returns: a space-delimited string of options (just as typed) returns false if max_size is too short - notes: + notes: silently removes makes option string easy to input and output - matches qh_argv_to_command_size() - + matches qh_argv_to_command_size argc may be 0 */ int qh_argv_to_command(int argc, char *argv[], char* command, int max_size) { @@ -81,9 +80,10 @@ *t= '\0'; }else if (remaining < 0) { goto error_argv; - }else + }else { strcat(command, " "); strcat(command, s); + } } return 1; @@ -92,18 +92,20 @@ } /* argv_to_command */ /*--------------------------------- + >-------------------------------- -qh_argv_to_command_size(argc, argv ) + qh_argv_to_command_size( argc, argv ) return size to allocate for qh_argv_to_command() -notes: + notes: + only called from rbox with qh_errexit not enabled + caller should report error if returned size is less than 1 argc may be 0 actual size is usually shorter */ int qh_argv_to_command_size(int argc, char *argv[]) { - unsigned int count= 1; /* null-terminator if argc==0 */ + int count= 1; /* null-terminator if argc==0 */ int i; char *s; @@ -129,7 +131,7 @@ generate pseudo-random number between 1 and 2^31 -2 notes: - For qhull and rbox, called from qh_RANDOMint(),etc. [user.h] + For qhull and rbox, called from qh_RANDOMint(),etc. [user_r.h] From Park & Miller's minimal standard random number generator Communications of the ACM, 31:1192-1201, 1988. @@ -147,18 +149,18 @@ int qh_rand(qhT *qh) { int lo, hi, test; - int seed = qh->last_random; + int seed= qh->last_random; - hi = seed / qh_rand_q; /* seed div q */ - lo = seed % qh_rand_q; /* seed mod q */ - test = qh_rand_a * lo - qh_rand_r * hi; + hi= seed / qh_rand_q; /* seed div q */ + lo= seed % qh_rand_q; /* seed mod q */ + test= qh_rand_a * lo - qh_rand_r * hi; if (test > 0) seed= test; else seed= test + qh_rand_m; qh->last_random= seed; - /* seed = seed < qh_RANDOMmax/2 ? 0 : qh_RANDOMmax; for testing */ - /* seed = qh_RANDOMmax; for testing */ + /* seed= seed < qh_RANDOMmax/2 ? 0 : qh_RANDOMmax; for testing */ + /* seed= qh_RANDOMmax; for testing */ return seed; } /* rand */ @@ -191,9 +193,9 @@ /*--------------------------------- -qh_randommatrix(qh, buffer, dim, rows ) - generate a random dim X dim matrix in range [-1,1] - assumes buffer is [dim+1, dim] + qh_randommatrix(qh, buffer, dim, rows ) + generate a random dim X dim matrix in range [-1,1] + assumes buffer is [dim+1, dim] returns: sets buffer to random numbers diff -Nru qhull-2015.2/src/libqhull_r/random_r.h qhull-2020.2/src/libqhull_r/random_r.h --- qhull-2015.2/src/libqhull_r/random_r.h 2016-01-17 04:22:28.000000000 +0000 +++ qhull-2020.2/src/libqhull_r/random_r.h 2020-05-22 02:00:58.000000000 +0000 @@ -1,14 +1,14 @@ /*
      ---------------------------------
     
    -  random.h
    +  random_r.h
         header file for random and utility routines
     
        see qh-geom_r.htm and random_r.c
     
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull_r/random_r.h#3 $$Change: 2062 $
    -   $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    +   Copyright (c) 1993-2020 The Geometry Center.
    +   $Id: //main/2019/qhull/src/libqhull_r/random_r.h#3 $$Change: 2953 $
    +   $DateTime: 2020/05/21 22:05:32 $$Author: bbarber $
     */
     
     #ifndef qhDEFrandom
    @@ -18,6 +18,9 @@
     
     /*============= prototypes in alphabetical order ======= */
     
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
     
     int     qh_argv_to_command(int argc, char *argv[], char* command, int max_size);
     int     qh_argv_to_command_size(int argc, char *argv[]);
    @@ -28,6 +31,10 @@
     int     qh_strtol(const char *s, char **endp);
     double  qh_strtod(const char *s, char **endp);
     
    +#ifdef __cplusplus
    +} /* extern "C" */
    +#endif
    +
     #endif /* qhDEFrandom */
     
     
    diff -Nru qhull-2015.2/src/libqhull_r/rboxlib_r.c qhull-2020.2/src/libqhull_r/rboxlib_r.c
    --- qhull-2015.2/src/libqhull_r/rboxlib_r.c	2016-01-18 19:28:31.000000000 +0000
    +++ qhull-2020.2/src/libqhull_r/rboxlib_r.c	2019-06-27 20:22:24.000000000 +0000
    @@ -39,6 +39,7 @@
     void qh_out3n(qhT *qh, double a, double b, double c);
     void qh_outcoord(qhT *qh, int iscdd, double *coord, int dim);
     void qh_outcoincident(qhT *qh, int coincidentpoints, double radius, int iscdd, double *coord, int dim);
    +void qh_rboxpoints2(qhT *qh, char* rbox_command, double **simplex);
     
     void    qh_fprintf_rbox(qhT *qh, FILE *fp, int msgcode, const char *fmt, ... );
     void    qh_free(void *mem);
    @@ -50,8 +51,8 @@
       >--------------------------------
     
       qh_rboxpoints(qh, rbox_command )
    -    Generate points to qh->fout according to rbox options
    -    Report errors on qh->ferr
    +    Generate points to qh.fout according to rbox options
    +    Report errors on qh.ferr
     
       returns:
         0 (qh_ERRnone) on success
    @@ -61,6 +62,7 @@
     
       notes:
         To avoid using stdio, redefine qh_malloc, qh_free, and qh_fprintf_rbox (user_r.c)
    +    Split out qh_rboxpoints2() to avoid -Wclobbered
     
       design:
         Straight line code (consider defining a struct and functions):
    @@ -70,38 +72,48 @@
         Generate the points
     */
     int qh_rboxpoints(qhT *qh, char* rbox_command) {
    +  int exitcode;
    +  double *simplex;
    +
    +  simplex= NULL;
    +  exitcode= setjmp(qh->rbox_errexit);
    +  if (exitcode) {
    +    /* same code for error exit and normal return.  qh.NOerrexit is set */
    +    if (simplex)
    +      qh_free(simplex);
    +    return exitcode;
    +  }
    +  qh_rboxpoints2(qh, rbox_command, &simplex);
    +  /* same code for error exit and normal return */
    +  if (simplex)
    +    qh_free(simplex);
    +  return qh_ERRnone;
    +} /* rboxpoints */
    +
    +void qh_rboxpoints2(qhT *qh, char* rbox_command, double **simplex) {
       int i,j,k;
       int gendim;
       int coincidentcount=0, coincidenttotal=0, coincidentpoints=0;
       int cubesize, diamondsize, seed=0, count, apex;
    -  int dim=3 , numpoints= 0, totpoints, addpoints=0;
    -  int issphere=0, isaxis=0,  iscdd= 0, islens= 0, isregular=0, iswidth=0, addcube=0;
    -  int isgap=0, isspiral=0, NOcommand= 0, adddiamond=0;
    +  int dim=3, numpoints=0, totpoints, addpoints=0;
    +  int issphere=0, isaxis=0,  iscdd=0, islens=0, isregular=0, iswidth=0, addcube=0;
    +  int isgap=0, isspiral=0, NOcommand=0, adddiamond=0;
       int israndom=0, istime=0;
       int isbox=0, issimplex=0, issimplex2=0, ismesh=0;
       double width=0.0, gap=0.0, radius=0.0, coincidentradius=0.0;
       double coord[MAXdim], offset, meshm=3.0, meshn=4.0, meshr=5.0;
    -  double *coordp, *simplex= NULL, *simplexp;
    +  double *coordp, *simplexp;
       int nthroot, mult[MAXdim];
    -  double norm, factor, randr, rangap, lensangle= 0, lensbase= 1;
    -  double anglediff, angle, x, y, cube= 0.0, diamond= 0.0;
    +  double norm, factor, randr, rangap, tempr, lensangle=0, lensbase=1;
    +  double anglediff, angle, x, y, cube=0.0, diamond=0.0;
       double box= qh_DEFAULTbox; /* scale all numbers before output */
       double randmax= qh_RANDOMmax;
    -  char command[200], seedbuf[200];
    -  char *s= command, *t, *first_point= NULL;
    +  char command[250], seedbuf[50];
    +  char *s=command, *t, *first_point=NULL;
       time_t timedata;
    -  int exitcode;
    -
    -  exitcode= setjmp(qh->rbox_errexit);
    -  if (exitcode) {
    -    /* same code for error exit and normal return, qh->NOerrexit is set */
    -    if (simplex)
    -        qh_free(simplex);
    -    return exitcode;
    -  }
     
       *command= '\0';
    -  strncat(command, rbox_command, sizeof(command)-strlen(command)-1);
    +  strncat(command, rbox_command, sizeof(command)-sizeof(seedbuf)-strlen(command)-1);
     
       while (*s && !isspace(*s))  /* skip program name */
         s++;
    @@ -198,7 +210,7 @@
           dim= qh_strtol(s, &s);
           if (dim < 1
           || dim > MAXdim) {
    -        qh_fprintf_rbox(qh, qh->ferr, 6189, "rbox error: dimension, D%d, out of bounds (>=%d or <=0)", dim, MAXdim);
    +        qh_fprintf_rbox(qh, qh->ferr, 6189, "rbox error: dimension, D%d, out of bounds (>=%d or <=0)\n", dim, MAXdim);
             qh_errexit_rbox(qh, qh_ERRinput);
           }
           break;
    @@ -240,7 +252,7 @@
           break;
         case 'P':
           if (!first_point)
    -        first_point= s-1;
    +        first_point= s - 1;
           addpoints++;
           while (*s && !isspace(*s))   /* read points later */
             s++;
    @@ -257,11 +269,11 @@
           isaxis= 1;
           break;
         default:
    -      qh_fprintf_rbox(qh, qh->ferr, 7070, "rbox error: unknown flag at %s.\nExecute 'rbox' without arguments for documentation.\n", s);
    +      qh_fprintf_rbox(qh, qh->ferr, 6352, "rbox error: unknown flag at '%s'.\nExecute 'rbox' without arguments for documentation.\n", s - 1);
           qh_errexit_rbox(qh, qh_ERRinput);
         }
         if (*s && !isspace(*s)) {
    -      qh_fprintf_rbox(qh, qh->ferr, 7071, "rbox error: missing space between flags at %s.\n", s);
    +      qh_fprintf_rbox(qh, qh->ferr, 6353, "rbox error: missing space between flags at %s.\n", s);
           qh_errexit_rbox(qh, qh_ERRinput);
         }
       }
    @@ -270,7 +282,8 @@
       if (qh->rbox_isinteger && !isbox)
         box= qh_DEFAULTzbox;
       if (addcube) {
    -    cubesize= (int)floor(ldexp(1.0,dim)+0.5);
    +    tempr= floor(ldexp(1.0,dim)+0.5);
    +    cubesize= (int)tempr;
         if (cube == 0.0)
           cube= box;
       }else
    @@ -317,6 +330,11 @@
         qh_fprintf_rbox(qh, qh->ferr, 6270, "rbox error: 'Cn,r,m' requested n coincident points for each of m points.  Either there is no points or m (%d) is greater than the number of points (%d).\n", coincidenttotal, numpoints);
         qh_errexit_rbox(qh, qh_ERRinput);
       }
    +  if (coincidentpoints > 0 && isregular) {
    +    qh_fprintf_rbox(qh, qh->ferr, 6423, "rbox error: 'Cn,r,m' is not implemented for regular points ('r')\n");
    +    qh_errexit_rbox(qh, qh_ERRinput);
    +  }
    +
       if (coincidenttotal == 0)
         coincidenttotal= numpoints;
     
    @@ -355,7 +373,7 @@
       }else if (israndom) {
         seed= (int)time(&timedata);
         sprintf(seedbuf, " t%d", seed);  /* appends an extra t, not worth removing */
    -    strncat(command, seedbuf, sizeof(command)-strlen(command)-1);
    +    strncat(command, seedbuf, sizeof(command) - strlen(command) - 1);
         t= strstr(command, " t ");
         if (t)
           strcpy(t+1, t+3); /* remove " t " */
    @@ -409,11 +427,11 @@
     
       /* ============= simplex distribution =============== */
       if (issimplex+issimplex2) {
    -    if (!(simplex= (double*)qh_malloc( dim * (dim+1) * sizeof(double)))) {
    +    if (!(*simplex= (double *)qh_malloc( (size_t)(dim * (dim+1)) * sizeof(double)))) {
           qh_fprintf_rbox(qh, qh->ferr, 6196, "rbox error: insufficient memory for simplex\n");
           qh_errexit_rbox(qh, qh_ERRmem); /* qh_ERRmem */
         }
    -    simplexp= simplex;
    +    simplexp= *simplex;
         if (isregular) {
           for (i=0; iferr, 6197, "rbox error: regular points can be used only in 2-d and 3-d\n\n");
           qh_errexit_rbox(qh, qh_ERRinput);
         }
    @@ -563,7 +580,6 @@
       /* ============= regular points for 'r Ln D3' =============== */
       else if (isregular && islens && dim != 2) {
         if (dim != 3) {
    -      qh_free(simplex);
           qh_fprintf_rbox(qh, qh->ferr, 6198, "rbox error: regular points can be used only in 2-d and 3-d\n\n");
           qh_errexit_rbox(qh, qh_ERRinput);
         }
    @@ -649,13 +665,12 @@
           /* ============= point of 'l' distribution =============== */
           }else if (isspiral) {
             if (dim != 3) {
    -          qh_free(simplex);
               qh_fprintf_rbox(qh, qh->ferr, 6199, "rbox error: spiral distribution is available only in 3d\n\n");
               qh_errexit_rbox(qh, qh_ERRinput);
             }
             coord[0]= cos(2*PI*i/(numpoints - 1));
             coord[1]= sin(2*PI*i/(numpoints - 1));
    -        coord[2]= 2.0*(double)i/(double)(numpoints-1) - 1.0;
    +        coord[2]= 2.0*(double)i/(double)(numpoints - 1) - 1.0;
           /* ============= point of 's' distribution =============== */
           }else if (issphere) {
             factor= 1.0/norm;
    @@ -751,11 +766,7 @@
     
       if (iscdd)
         qh_fprintf_rbox(qh, qh->fout, 9402, "end\nhull\n");
    -
    -  /* same code for error exit and normal return */
    -  qh_free(simplex);
    -  return qh_ERRnone;
    -} /* rboxpoints */
    +} /* rboxpoints2 */
     
     /*------------------------------------------------
     outxxx - output functions for qh_rboxpoints
    @@ -817,7 +828,7 @@
       int i,k;
       double randmax= qh_RANDOMmax;
     
    -  for (i= 0; iqhstat.precision= qh->qhstat.next;  /* call qh_precision for each of these */
    +  qh->qhstat.precision= qh->qhstat.next;  /* usually call qh_joggle_restart, printed if Q0 or QJn */
       zzdef_(zdoc, Zdoc3, "precision problems (corrected unless 'Q0' or an error)", -1);
       zzdef_(zinc, Zcoplanarridges, "coplanar half ridges in output", -1);
       zzdef_(zinc, Zconcaveridges, "concave half ridges in output", -1);
    @@ -47,14 +47,16 @@
       zzdef_(zinc, Znearlysingular, "nearly singular or axis-parallel hyperplanes", -1);
       zzdef_(zinc, Zback0, "zero divisors during back substitute", -1);
       zzdef_(zinc, Zgauss0, "zero divisors during gaussian elimination", -1);
    -  zzdef_(zinc, Zmultiridge, "ridges with multiple neighbors", -1);
    +  zzdef_(zinc, Zmultiridge, "dupridges with multiple neighbors", -1);
    +  zzdef_(zinc, Zflipridge, "dupridges with flip facet into good neighbor", -1);
    +  zzdef_(zinc, Zflipridge2, "dupridges with flip facet into good flip neighbor", -1);
     }
     void qh_allstatB(qhT *qh) {
       zzdef_(zdoc, Zdoc1, "summary information", -1);
       zdef_(zinc, Zvertices, "number of vertices in output", -1);
       zdef_(zinc, Znumfacets, "number of facets in output", -1);
       zdef_(zinc, Znonsimplicial, "number of non-simplicial facets in output", -1);
    -  zdef_(zinc, Znowsimplicial, "number of simplicial facets that were merged", -1);
    +  zdef_(zinc, Znowsimplicial, "simplicial facets that were non-simplicial", -1);
       zdef_(zinc, Znumridges, "number of ridges in output", -1);
       zdef_(zadd, Znumridges, "average number of ridges per facet", Znumfacets);
       zdef_(zmax, Zmaxridges, "maximum number of ridges", -1);
    @@ -69,12 +71,12 @@
       zzdef_(zinc, Zsetplane, "facets created altogether", -1);
       zdef_(zinc, Ztotridges, "ridges created altogether", -1);
       zdef_(zinc, Zpostfacets, "facets before post merge", -1);
    -  zdef_(zadd, Znummergetot, "average merges per facet(at most 511)", Znumfacets);
    -  zdef_(zmax, Znummergemax, "  maximum merges for a facet(at most 511)", -1);
    +  zdef_(zadd, Znummergetot, "average merges per facet (at most 511)", Znumfacets);
    +  zdef_(zmax, Znummergemax, "  maximum merges for a facet (at most 511)", -1);
       zdef_(zinc, Zangle, NULL, -1);
    -  zdef_(wadd, Wangle, "average angle(cosine) of facet normals for all ridges", Zangle);
    -  zdef_(wmax, Wanglemax, "  maximum angle(cosine) of facet normals across a ridge", -1);
    -  zdef_(wmin, Wanglemin, "  minimum angle(cosine) of facet normals across a ridge", -1);
    +  zdef_(wadd, Wangle, "average cosine (angle) of facet normals for all ridges", Zangle);
    +  zdef_(wmax, Wanglemax, "  maximum cosine of facet normals (flatest) across a ridge", -1);
    +  zdef_(wmin, Wanglemin, "  minimum cosine of facet normals (sharpest) across a ridge", -1);
       zdef_(wadd, Wareatot, "total area of facets", -1);
       zdef_(wmax, Wareamax, "  maximum facet area", -1);
       zdef_(wmin, Wareamin, "  minimum facet area", -1);
    @@ -93,18 +95,20 @@
       zdef_(zmax, Zvisvertexmax, "    maximum", -1);
       zdef_(zinc, Ztothorizon, "ave. horizon facets per iteration", Zprocessed);
       zdef_(zadd, Znewfacettot,  "ave. new or merged facets per iteration", Zprocessed);
    -  zdef_(zmax, Znewfacetmax,  "    maximum(includes initial simplex)", -1);
    +  zdef_(zmax, Znewfacetmax,  "    maximum (includes initial simplex)", -1);
       zdef_(wadd, Wnewbalance, "average new facet balance", Zprocessed);
       zdef_(wadd, Wnewbalance2, "  standard deviation", -1);
       zdef_(wadd, Wpbalance, "average partition balance", Zpbalance);
       zdef_(wadd, Wpbalance2, "  standard deviation", -1);
    -  zdef_(zinc, Zpbalance, "  number of trials", -1);
    +  zdef_(zinc, Zpbalance,  "  count", -1);
       zdef_(zinc, Zsearchpoints, "searches of all points for initial simplex", -1);
    -  zdef_(zinc, Zdetsimplex, "determinants computed(area & initial hull)", -1);
    -  zdef_(zinc, Znoarea, "determinants not computed because vertex too low", -1);
    -  zdef_(zinc, Znotmax, "points ignored(!above max_outside)", -1);
    -  zdef_(zinc, Znotgood, "points ignored(!above a good facet)", -1);
    -  zdef_(zinc, Znotgoodnew, "points ignored(didn't create a good new facet)", -1);
    +  zdef_(zinc, Zdetfacetarea, "determinants for facet area", -1);
    +  zdef_(zinc, Znoarea, "  determinants not computed because vertex too low", -1);
    +  zdef_(zinc, Zdetsimplex, "determinants for initial hull or voronoi vertices", -1);
    +  zdef_(zinc, Znotmax, "points ignored (!above max_outside)", -1);
    +  zdef_(zinc, Zpinchedapex, "points ignored (pinched apex)", -1);
    +  zdef_(zinc, Znotgood, "points ignored (!above a good facet)", -1);
    +  zdef_(zinc, Znotgoodnew, "points ignored (didn't create a good new facet)", -1);
       zdef_(zinc, Zgoodfacet, "good facets found", -1);
       zzdef_(zinc, Znumvisibility, "distance tests for facet visibility", -1);
       zdef_(zinc, Zdistvertex, "distance tests to report minimum vertex", -1);
    @@ -117,7 +121,7 @@
       zdef_(zmax, Zvisit2max, "  max visit_id/2", -1);
       zdef_(zmax, Zvvisit2max, "  max vertex_visit/2", -1);
     
    -  zdef_(zdoc, Zdoc4, "partitioning statistics(see previous for outer planes)", -1);
    +  zdef_(zdoc, Zdoc4, "partitioning statistics (see previous for outer planes)", -1);
       zzdef_(zadd, Zdelvertextot, "total vertices deleted", -1);
       zdef_(zmax, Zdelvertexmax, "    maximum vertices deleted per iteration", -1);
       zdef_(zinc, Zfindbest, "calls to findbest", -1);
    @@ -133,13 +137,15 @@
       zdef_(zadd, Zfindhorizontot, " ave. facets tested", Zfindhorizon);
       zdef_(zmax, Zfindhorizonmax, " max. facets tested", -1);
       zdef_(zinc, Zfindjump,       " ave. clearly better", Zfindhorizon);
    -  zdef_(zinc, Zparthorizon, " horizon facets better than bestfacet", -1);
    +  zdef_(zinc, Znewbesthorizon, " new bestfacets during qh_findbesthorizon", -1);
       zdef_(zinc, Zpartangle, "angle tests for repartitioned coplanar points", -1);
    -  zdef_(zinc, Zpartflip, "  repartitioned coplanar points for flipped orientation", -1);
    +  zdef_(zinc, Zpartcorner, "  repartitioned coplanar points above a corner facet", -1);
    +  zdef_(zinc, Zparthidden, "  repartitioned coplanar points above a hidden facet", -1);
    +  zdef_(zinc, Zparttwisted, "  repartitioned coplanar points above a twisted facet", -1);
     }
     void qh_allstatE(qhT *qh) {
       zdef_(zinc, Zpartinside, "inside points", -1);
    -  zdef_(zinc, Zpartnear, "  inside points kept with a facet", -1);
    +  zdef_(zinc, Zpartnear, "  near inside points kept with a facet", -1);
       zdef_(zinc, Zcoplanarinside, "  inside points that were coplanar with a facet", -1);
       zdef_(zinc, Zbestlower, "calls to findbestlower", -1);
       zdef_(zinc, Zbestlowerv, "  with search of vertex neighbors", -1);
    @@ -154,7 +160,7 @@
       zdef_(zinc, Zdistgood, "distance tests for checking good point", -1);
       zdef_(zinc, Zdistio, "distance tests for output", -1);
       zdef_(zinc, Zdiststat, "distance tests for statistics", -1);
    -  zdef_(zinc, Zdistplane, "total number of distance tests", -1);
    +  zzdef_(zinc, Zdistplane, "total number of distance tests", -1);
       zdef_(zinc, Ztotpartcoplanar, "partitions of coplanar points or deleted vertices", -1);
       zzdef_(zinc, Zpartcoplanar, "   distance tests for these partitions", -1);
       zdef_(zinc, Zcomputefurthest, "distance tests for computing furthest", -1);
    @@ -163,7 +169,7 @@
       zdef_(zdoc, Zdoc5, "statistics for matching ridges", -1);
       zdef_(zinc, Zhashlookup, "total lookups for matching ridges of new facets", -1);
       zdef_(zinc, Zhashtests, "average number of tests to match a ridge", Zhashlookup);
    -  zdef_(zinc, Zhashridge, "total lookups of subridges(duplicates and boundary)", -1);
    +  zdef_(zinc, Zhashridge, "total lookups of subridges (duplicates and boundary)", -1);
       zdef_(zinc, Zhashridgetest, "average number of tests per subridge", Zhashridge);
       zdef_(zinc, Zdupsame, "duplicated ridges in same merge cycle", -1);
       zdef_(zinc, Zdupflip, "duplicated ridges with flipped facets", -1);
    @@ -173,10 +179,13 @@
       zdef_(zinc, Zbestcentrum, "best merges used centrum instead of vertices",-1);
       zzdef_(zinc, Zbestdist, "distance tests for best merge", -1);
       zzdef_(zinc, Zcentrumtests, "distance tests for centrum convexity", -1);
    +  zzdef_(zinc, Zvertextests, "distance tests for vertex convexity", -1);
       zzdef_(zinc, Zdistzero, "distance tests for checking simplicial convexity", -1);
       zdef_(zinc, Zcoplanarangle, "coplanar angles in getmergeset", -1);
    -  zdef_(zinc, Zcoplanarcentrum, "coplanar centrums in getmergeset", -1);
    +  zdef_(zinc, Zcoplanarcentrum, "coplanar centrums or vertices in getmergeset", -1);
       zdef_(zinc, Zconcaveridge, "concave ridges in getmergeset", -1);
    +  zdef_(zinc, Zconcavecoplanarridge, "concave-coplanar ridges in getmergeset", -1);
    +  zdef_(zinc, Ztwistedridge, "twisted ridges in getmergeset", -1);
     }
     void qh_allstatF(qhT *qh) {
       zdef_(zdoc, Zdoc7, "statistics for merging", -1);
    @@ -187,8 +196,8 @@
       zdef_(zadd, Zmergesetmax, "  maximum additional in one pass", -1);
       zdef_(zadd, Zmergeinittot2, "initial non-convex ridges for post merging", -1);
       zdef_(zadd, Zmergesettot2, "  additional non-convex ridges", -1);
    -  zdef_(wmax, Wmaxoutside, "max distance of vertex or coplanar point above facet(w/roundoff)", -1);
    -  zdef_(wmin, Wminvertex, "max distance of merged vertex below facet(or roundoff)", -1);
    +  zdef_(wmax, Wmaxoutside, "max distance of vertex or coplanar point above facet (w/roundoff)", -1);
    +  zdef_(wmin, Wminvertex, "max distance of vertex below facet (or roundoff)", -1);
       zdef_(zinc, Zwidefacet, "centrums frozen due to a wide merge", -1);
       zdef_(zinc, Zwidevertices, "centrums frozen due to extra vertices", -1);
       zzdef_(zinc, Ztotmerge, "total number of facets or cycles of facets merged", -1);
    @@ -197,6 +206,7 @@
       zzdef_(zinc, Zcyclehorizon, "cycles of facets merged into coplanar horizon", -1);
       zzdef_(zadd, Zcyclefacettot, "  ave. facets per cycle", Zcyclehorizon);
       zdef_(zmax, Zcyclefacetmax, "  max. facets", -1);
    +  zdef_(zinc, Zmergeintocoplanar, "new facets merged into coplanar horizon", -1);
       zdef_(zinc, Zmergeintohorizon, "new facets merged into horizon", -1);
       zdef_(zinc, Zmergenew, "new facets merged", -1);
       zdef_(zinc, Zmergehorizon, "horizon facets merged into new facets", -1);
    @@ -204,7 +214,8 @@
       zdef_(zinc, Zcyclevertex, "vertices deleted by merging into coplanar horizon", -1);
       zdef_(zinc, Zdegenvertex, "vertices deleted by degenerate facet", -1);
       zdef_(zinc, Zmergeflipdup, "merges due to flipped facets in duplicated ridge", -1);
    -  zdef_(zinc, Zneighbor, "merges due to redundant neighbors", -1);
    +  zdef_(zinc, Zredundant, "merges due to redundant neighbors", -1);
    +  zdef_(zinc, Zredundantmerge, "  detected by qh_test_nonsimplicial_merge instead of qh_test_redundant_neighbors", -1);
       zdef_(zadd, Ztestvneighbor, "non-convex vertex neighbors", -1);
     }
     void qh_allstatG(qhT *qh) {
    @@ -217,6 +228,9 @@
       zdef_(zinc, Zconcave, "merges due to concave facets", -1);
       zdef_(wadd, Wconcavetot, "  average merge distance", Zconcave);
       zdef_(wmax, Wconcavemax, "  maximum merge distance", -1);
    +  zdef_(zinc, Zconcavecoplanar, "merges due to concave-coplanar facets", -1);
    +  zdef_(wadd, Wconcavecoplanartot, "  average merge distance", Zconcavecoplanar);
    +  zdef_(wmax, Wconcavecoplanarmax, "  maximum merge distance", -1);
       zdef_(zinc, Zavoidold, "coplanar/concave merges due to avoiding old merge", -1);
       zdef_(wadd, Wavoidoldtot, "  average merge distance", Zavoidold);
       zdef_(wmax, Wavoidoldmax, "  maximum merge distance", -1);
    @@ -226,23 +240,31 @@
       zdef_(zinc, Zflipped, "merges due to removing flipped facets", -1);
       zdef_(wadd, Wflippedtot, "  average merge distance", Zflipped);
       zdef_(wmax, Wflippedmax, "  maximum merge distance", -1);
    -  zdef_(zinc, Zduplicate, "merges due to duplicated ridges", -1);
    +  zdef_(zinc, Zduplicate, "merges due to dupridges", -1);
       zdef_(wadd, Wduplicatetot, "  average merge distance", Zduplicate);
       zdef_(wmax, Wduplicatemax, "  maximum merge distance", -1);
    +  zdef_(zinc, Ztwisted, "merges due to twisted facets", -1);
    +  zdef_(wadd, Wtwistedtot, "  average merge distance", Ztwisted);
    +  zdef_(wmax, Wtwistedmax, "  maximum merge distance", -1);
     }
     void qh_allstatH(qhT *qh) {
    -  zdef_(zdoc, Zdoc8, "renamed vertex statistics", -1);
    +  zdef_(zdoc, Zdoc8, "statistics for vertex merges", -1);
    +  zzdef_(zinc, Zpinchduplicate, "merge pinched vertices for a duplicate ridge", -1);
    +  zzdef_(zinc, Zpinchedvertex, "merge pinched vertices for a dupridge", -1);
       zdef_(zinc, Zrenameshare, "renamed vertices shared by two facets", -1);
       zdef_(zinc, Zrenamepinch, "renamed vertices in a pinched facet", -1);
       zdef_(zinc, Zrenameall, "renamed vertices shared by multiple facets", -1);
       zdef_(zinc, Zfindfail, "rename failures due to duplicated ridges", -1);
    -  zdef_(zinc, Zdupridge, "  duplicate ridges detected", -1);
    +  zdef_(zinc, Znewvertexridge, "  found new vertex in ridge", -1);
       zdef_(zinc, Zdelridge, "deleted ridges due to renamed vertices", -1);
       zdef_(zinc, Zdropneighbor, "dropped neighbors due to renamed vertices", -1);
    -  zdef_(zinc, Zdropdegen, "degenerate facets due to dropped neighbors", -1);
    +  zdef_(zinc, Zdropdegen, "merge degenerate facets due to dropped neighbors", -1);
       zdef_(zinc, Zdelfacetdup, "  facets deleted because of no neighbors", -1);
       zdef_(zinc, Zremvertex, "vertices removed from facets due to no ridges", -1);
       zdef_(zinc, Zremvertexdel, "  deleted", -1);
    +  zdef_(zinc, Zretryadd, "retry qh_addpoint after merge pinched vertex", -1);
    +  zdef_(zadd, Zretryaddtot, "  tot. merge pinched vertex due to dupridge", -1);
    +  zdef_(zmax, Zretryaddmax, "  max. merge pinched vertex for a qh_addpoint", -1);
       zdef_(zinc, Zintersectnum, "vertex intersections for locating redundant vertices", -1);
       zdef_(zinc, Zintersectfail, "intersections failed to find a redundant vertex", -1);
       zdef_(zinc, Zintersect, "intersections found redundant vertices", -1);
    @@ -252,7 +274,7 @@
       zdef_(zadd, Zvertexridgetot, "  ave. number of ridges per tested vertex", Zvertexridge);
       zdef_(zmax, Zvertexridgemax, "  max. number of ridges per tested vertex", -1);
     
    -  zdef_(zdoc, Zdoc10, "memory usage statistics(in bytes)", -1);
    +  zdef_(zdoc, Zdoc10, "memory usage statistics (in bytes)", -1);
       zdef_(zadd, Zmemfacets, "for facets and their normals, neighbor and vertex sets", -1);
       zdef_(zadd, Zmemvertices, "for vertices and their neighbor sets", -1);
       zdef_(zadd, Zmempoints, "for input points, outside and coplanar sets, and qhT",-1);
    @@ -260,7 +282,7 @@
     } /* allstat */
     
     void qh_allstatI(qhT *qh) {
    -  qh->qhstat.vridges= qh->qhstat.next;
    +  qh->qhstat.vridges= qh->qhstat.next; /* printed in qh_produce_output2 if non-zero Zridge or Zridgemid */
       zzdef_(zdoc, Zdoc11, "Voronoi ridge statistics", -1);
       zzdef_(zinc, Zridge, "non-simplicial Voronoi vertices for all ridges", -1);
       zzdef_(wadd, Wridge, "  ave. distance to ridge", Zridge);
    @@ -275,13 +297,13 @@
       zzdef_(wadd, Wridge0, "  ave. angle to ridge", Zridge0);
       zzdef_(wmax, Wridge0max, "  max. angle to ridge", -1);
     
    -  zdef_(zdoc, Zdoc12, "Triangulation statistics(Qt)", -1);
    +  zdef_(zdoc, Zdoc12, "Triangulation statistics ('Qt')", -1);
       zdef_(zinc, Ztricoplanar, "non-simplicial facets triangulated", -1);
    -  zdef_(zadd, Ztricoplanartot, "  ave. new facets created(may be deleted)", Ztricoplanar);
    +  zdef_(zadd, Ztricoplanartot, "  ave. new facets created (may be deleted)", Ztricoplanar);
       zdef_(zmax, Ztricoplanarmax, "  max. new facets created", -1);
    -  zdef_(zinc, Ztrinull, "null new facets deleted(duplicated vertex)", -1);
    -  zdef_(zinc, Ztrimirror, "mirrored pairs of new facets deleted(same vertices)", -1);
    -  zdef_(zinc, Ztridegen, "degenerate new facets in output(same ridge)", -1);
    +  zdef_(zinc, Ztrinull, "null new facets deleted (duplicated vertex)", -1);
    +  zdef_(zinc, Ztrimirror, "mirrored pairs of new facets deleted (same vertices)", -1);
    +  zdef_(zinc, Ztridegen, "degenerate new facets in output (same ridge)", -1);
     } /* allstat */
     
     /*-old_randomdist= qh->RANDOMdist;
       qh->RANDOMdist= False;
    -  zval_(Zmempoints)= qh->num_points * qh->normal_size + sizeof(qhT);
    +  zval_(Zmempoints)= qh->num_points * qh->normal_size + (int)sizeof(qhT);
       zval_(Zmemfacets)= 0;
       zval_(Zmemridges)= 0;
       zval_(Zmemvertices)= 0;
    @@ -331,6 +353,11 @@
         wmax_(Wmaxoutside, qh->max_outside);
       if (qh->MERGING)
         wmin_(Wminvertex, qh->min_vertex);
    +  if (!qh_checklists(qh, qh->facet_list)) {
    +    qh_fprintf(qh, qh->ferr, 6373, "qhull internal error: qh_checklists failed on qh_collectstatistics\n");
    +    if (!qh->ERREXITcalled)
    +      qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    +  }
       FORALLfacets
         facet->seen= False;
       if (qh->DELAUNAY) {
    @@ -364,17 +391,17 @@
           zadd_(Znumridges, sizridges);
           zmax_(Zmaxridges, sizridges);
         }
    -    zadd_(Zmemfacets, sizeof(facetT) + qh->normal_size + 2*sizeof(setT)
    +    zadd_(Zmemfacets, (int)sizeof(facetT) + qh->normal_size + 2*(int)sizeof(setT)
            + SETelemsize * (sizneighbors + sizvertices));
         if (facet->ridges) {
           zadd_(Zmemridges,
    -         sizeof(setT) + SETelemsize * sizridges + sizridges *
    -         (sizeof(ridgeT) + sizeof(setT) + SETelemsize * (qh->hull_dim-1))/2);
    +        (int)sizeof(setT) + SETelemsize * sizridges + sizridges *
    +         ((int)sizeof(ridgeT) + (int)sizeof(setT) + SETelemsize * (qh->hull_dim-1))/2);
         }
         if (facet->outsideset)
    -      zadd_(Zmempoints, sizeof(setT) + SETelemsize * qh_setsize(qh, facet->outsideset));
    +      zadd_(Zmempoints, (int)sizeof(setT) + SETelemsize * qh_setsize(qh, facet->outsideset));
         if (facet->coplanarset)
    -      zadd_(Zmempoints, sizeof(setT) + SETelemsize * qh_setsize(qh, facet->coplanarset));
    +      zadd_(Zmempoints, (int)sizeof(setT) + SETelemsize * qh_setsize(qh, facet->coplanarset));
         if (facet->seen) /* Delaunay upper envelope */
           continue;
         facet->seen= True;
    @@ -400,12 +427,12 @@
       FORALLvertices {
         if (vertex->deleted)
           continue;
    -    zadd_(Zmemvertices, sizeof(vertexT));
    +    zadd_(Zmemvertices, (int)sizeof(vertexT));
         if (vertex->neighbors) {
           sizneighbors= qh_setsize(qh, vertex->neighbors);
           zadd_(Znumvneighbors, sizneighbors);
           zmax_(Zmaxvneighbors, sizneighbors);
    -      zadd_(Zmemvertices, sizeof(vertexT) + SETelemsize * sizneighbors);
    +      zadd_(Zmemvertices, (int)sizeof(vertexT) + SETelemsize * sizneighbors);
         }
       }
       qh->RANDOMdist= qh->old_randomdist;
    @@ -419,15 +446,16 @@
         initialize statistics
     
       notes:
    -  NOerrors -- qh_initstatistics can not use qh_errexit(), qh_fprintf, or qh.ferr
    -  On first call, only qhmem.ferr is defined.  qh_memalloc is not setup.
    -  Also invoked by QhullQh().
    +    NOerrors -- qh_initstatistics can not use qh_errexit(), qh_fprintf, or qh.ferr
    +    On first call, only qhmem.ferr is defined.  qh_memalloc is not setup.
    +    Also invoked by QhullQh().
     */
     void qh_initstatistics(qhT *qh) {
       int i;
       realT realx;
       int intx;
     
    +  qh_allstatistics(qh);
       qh->qhstat.next= 0;
       qh_allstatA(qh);
       qh_allstatB(qh);
    @@ -440,14 +468,14 @@
       qh_allstatH(qh);
       qh_allstatI(qh);
       if (qh->qhstat.next > (int)sizeof(qh->qhstat.id)) {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6184, "qhull error (qh_initstatistics): increase size of qhstat.id[].\n\
    -      qhstat.next %d should be <= sizeof(qh->qhstat.id) %d\n", qh->qhstat.next, (int)sizeof(qh->qhstat.id));
    +    qh_fprintf_stderr(6184, "qhull internal error (qh_initstatistics): increase size of qhstat.id[].  qhstat.next %d should be <= sizeof(qh->qhstat.id) %d\n", 
    +          qh->qhstat.next, (int)sizeof(qh->qhstat.id));
     #if 0 /* for locating error, Znumridges should be duplicated */
         for(i=0; i < ZEND; i++) {
           int j;
           for(j=i+1; j < ZEND; j++) {
             if (qh->qhstat.id[i] == qh->qhstat.id[j]) {
    -          qh_fprintf(qh, qh->qhmem.ferr, 6185, "qhull error (qh_initstatistics): duplicated statistic %d at indices %d and %d\n",
    +          qh_fprintf_stderr(6185, "qhull error (qh_initstatistics): duplicated statistic %d at indices %d and %d\n",
                   qh->qhstat.id[i], i, j);
             }
           }
    @@ -476,7 +504,7 @@
     /*---------------------------------
     
    -  qh_newstats(qh, )
    +  qh_newstats(qh )
         returns True if statistics for zdoc
     
       returns:
    @@ -542,23 +570,27 @@
     */
     void qh_printstatistics(qhT *qh, FILE *fp, const char *string) {
       int i, k;
    -  realT ave;
    +  realT ave; /* ignored */
     
    -  if (qh->num_points != qh->num_vertices) {
    -    wval_(Wpbalance)= 0;
    -    wval_(Wpbalance2)= 0;
    +  if (qh->num_points != qh->num_vertices || zval_(Zpbalance) == 0) {
    +    wval_(Wpbalance)= 0.0;
    +    wval_(Wpbalance2)= 0.0;
       }else
    -    wval_(Wpbalance2)= qh_stddev(zval_(Zpbalance), wval_(Wpbalance),
    +    wval_(Wpbalance2)= qh_stddev(qh, zval_(Zpbalance), wval_(Wpbalance),
                                      wval_(Wpbalance2), &ave);
    -  wval_(Wnewbalance2)= qh_stddev(zval_(Zprocessed), wval_(Wnewbalance),
    +  if (zval_(Zprocessed) == 0)
    +    wval_(Wnewbalance2)= 0.0;
    +  else
    +    wval_(Wnewbalance2)= qh_stddev(qh, zval_(Zprocessed), wval_(Wnewbalance),
                                      wval_(Wnewbalance2), &ave);
       qh_fprintf(qh, fp, 9350, "\n\
     %s\n\
    - qhull invoked by: %s | %s\n%s with options:\n%s\n", string, qh->rbox_command,
    -     qh->qhull_command, qh_version, qh->qhull_options);
    +qhull invoked by: %s | %s\n  %s with options:\n%s\n", 
    +    string, qh->rbox_command, qh->qhull_command, qh_version, qh->qhull_options);
    +
       qh_fprintf(qh, fp, 9351, "\nprecision constants:\n\
    - %6.2g max. abs. coordinate in the (transformed) input('Qbd:n')\n\
    - %6.2g max. roundoff error for distance computation('En')\n\
    + %6.2g max. abs. coordinate in the (transformed) input ('Qbd:n')\n\
    + %6.2g max. roundoff error for distance computation ('En')\n\
      %6.2g max. roundoff error for angle computations\n\
      %6.2g min. distance for outside points ('Wn')\n\
      %6.2g min. distance for visible facets ('Vn')\n\
    @@ -581,7 +613,7 @@
       qh_fprintf(qh, fp, 9357, "\
      %6.2g max. distance for merging two simplicial facets\n\
      %6.2g max. roundoff error for arithmetic operations\n\
    - %6.2g min. denominator for divisions\n\
    + %6.2g min. denominator for division\n\
       zero diagonal for Gauss: ", qh->ONEmerge, REALepsilon, qh->MINdenom);
       for(k=0; k < qh->hull_dim; k++)
         qh_fprintf(qh, fp, 9358, "%6.2e ", qh->NEARzero[k]);
    @@ -601,7 +633,6 @@
         nop if id >= ZEND, printed, or same as initial value
     */
     void qh_printstatlevel(qhT *qh, FILE *fp, int id) {
    -#define NULLfield "       "
     
       if (id >= ZEND || qh->qhstat.printed[id])
         return;
    @@ -653,7 +684,7 @@
     /*---------------------------------
     
    -  qh_stddev(num, tot, tot2, ave )
    +  qh_stddev(qh, num, tot, tot2, ave )
         compute the standard deviation and average from statistics
     
         tot2 is the sum of the squares
    @@ -664,19 +695,33 @@
           == tot2 - 2 tot tot/num + tot tot/num
           == tot2 - tot ave
     */
    -realT qh_stddev(int num, realT tot, realT tot2, realT *ave) {
    +realT qh_stddev(qhT *qh, int num, realT tot, realT tot2, realT *ave) {
       realT stddev;
     
    +  if (num <= 0) {
    +    qh_fprintf(qh, qh->ferr, 7101, "qhull warning (qh_stddev): expecting num > 0.  Got num %d, tot %4.4g, tot2 %4.4g.  Returning 0.0\n",
    +      num, tot, tot2);
    +    return 0.0;
    +  }
       *ave= tot/num;
    -  stddev= sqrt(tot2/num - *ave * *ave);
    +  stddev= sqrt(fabs(tot2/num - *ave * *ave));
       return stddev;
     } /* stddev */
    +#else
    +realT qh_stddev(qhT *qh, int num, realT tot, realT tot2, realT *ave) { /* for qhull_r-exports.def */
    +  QHULL_UNUSED(qh)
    +  QHULL_UNUSED(num)
    +  QHULL_UNUSED(tot)
    +  QHULL_UNUSED(tot2)
    +  QHULL_UNUSED(ave)
     
    +  return 0.0;
    +}
     #endif /* qh_KEEPstatistics */
     
     #if !qh_KEEPstatistics
     void    qh_collectstatistics(qhT *qh) {}
    -void    qh_printallstatistics(qhT *qh, FILE *fp, char *string) {};
    -void    qh_printstatistics(qhT *qh, FILE *fp, char *string) {}
    +void    qh_printallstatistics(qhT *qh, FILE *fp, const char *string) {}
    +void    qh_printstatistics(qhT *qh, FILE *fp, const char *string) {}
     #endif
     
    diff -Nru qhull-2015.2/src/libqhull_r/stat_r.h qhull-2020.2/src/libqhull_r/stat_r.h
    --- qhull-2015.2/src/libqhull_r/stat_r.h	2016-01-17 14:56:23.000000000 +0000
    +++ qhull-2020.2/src/libqhull_r/stat_r.h	2020-05-22 02:00:58.000000000 +0000
    @@ -6,9 +6,9 @@
     
        see qh-stat_r.htm and stat_r.c
     
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull_r/stat_r.h#4 $$Change: 2062 $
    -   $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    +   Copyright (c) 1993-2020 The Geometry Center.
    +   $Id: //main/2019/qhull/src/libqhull_r/stat_r.h#4 $$Change: 2953 $
    +   $DateTime: 2020/05/21 22:05:32 $$Author: bbarber $
     
        recompile qhull if you change this file
     
    @@ -21,7 +21,7 @@
     #ifndef qhDEFstat
     #define qhDEFstat 1
     
    -/* Depends on realT.  Do not include libqhull_r to avoid circular dependency */
    +/* Depends on realT.  Do not include "libqhull_r" to avoid circular dependency */
     
     #ifndef DEFqhT
     #define DEFqhT 1
    @@ -37,7 +37,9 @@
       >--------------------------------
     
       qh_KEEPstatistics
    -    0 turns off statistic gathering (except zzdef/zzinc/zzadd/zzval/wwval)
    +    0 turns off statistic reporting and gathering (except zzdef/zzinc/zzadd/zzval/wwval)
    +
    +  set qh_KEEPstatistics in user_r.h to 0 to turn off statistics
     */
     #ifndef qh_KEEPstatistics
     #define qh_KEEPstatistics 1
    @@ -85,8 +87,12 @@
         Zconcave,
         Wconcavemax,
         Wconcavetot,
    -    Zconcaveridges,
    +    Zconcavecoplanar,
    +    Wconcavecoplanarmax,
    +    Wconcavecoplanartot,
    +    Zconcavecoplanarridge,
         Zconcaveridge,
    +    Zconcaveridges,
         Zcoplanar,
         Wcoplanarmax,
         Wcoplanartot,
    @@ -109,6 +115,7 @@
         Zdelridge,
         Zdelvertextot,
         Zdelvertexmax,
    +    Zdetfacetarea,
         Zdetsimplex,
         Zdistcheck,
         Zdistconvex,
    @@ -136,12 +143,13 @@
         Zduplicate,
         Wduplicatemax,
         Wduplicatetot,
    -    Zdupridge,
         Zdupsame,
         Zflipped,
         Wflippedmax,
         Wflippedtot,
         Zflippedfacets,
    +    Zflipridge,
    +    Zflipridge2,
         Zfindbest,
         Zfindbestmax,
         Zfindbesttot,
    @@ -184,6 +192,7 @@
         Zmergeinittot,
         Zmergeinitmax,
         Zmergeinittot2,
    +    Zmergeintocoplanar,
         Zmergeintohorizon,
         Zmergenew,
         Zmergesettot,
    @@ -196,14 +205,16 @@
         Zminnorm,
         Zmultiridge,
         Znearlysingular,
    -    Zneighbor,
    +    Zredundant,
         Wnewbalance,
         Wnewbalance2,
    +    Znewbesthorizon,
         Znewfacettot,
         Znewfacetmax,
         Znewvertex,
         Wnewvertex,
         Wnewvertexmax,
    +    Znewvertexridge,
         Znoarea,
         Znonsimplicial,
         Znowsimplicial,
    @@ -221,25 +232,33 @@
         Zonehorizon,
         Zpartangle,
         Zpartcoplanar,
    -    Zpartflip,
    -    Zparthorizon,
    +    Zpartcorner,
    +    Zparthidden,
         Zpartinside,
         Zpartition,
         Zpartitionall,
         Zpartnear,
    +    Zparttwisted,
         Zpbalance,
         Wpbalance,
         Wpbalance2,
    +    Zpinchduplicate,
    +    Zpinchedapex,
    +    Zpinchedvertex,
         Zpostfacets,
         Zpremergetot,
         Zprocessed,
         Zremvertex,
         Zremvertexdel,
    +    Zredundantmerge,
         Zrenameall,
         Zrenamepinch,
         Zrenameshare,
         Zretry,
         Wretrymax,
    +    Zretryadd,
    +    Zretryaddmax,
    +    Zretryaddtot,
         Zridge,
         Wridge,
         Wridgemax,
    @@ -269,6 +288,11 @@
         Ztridegen,
         Ztrimirror,
         Ztrinull,
    +    Ztwisted,
    +    Wtwistedtot,
    +    Wtwistedmax,
    +    Ztwistedridge,
    +    Zvertextests,
         Wvertexmax,
         Wvertexmin,
         Zvertexridge,
    @@ -310,12 +334,15 @@
       Zdelvertextot,
       Zdistcheck,
       Zdistconvex,
    +  Zdistplane,
       Zdistzero,
       Zdoc1,
       Zdoc2,
       Zdoc3,
       Zdoc11,
       Zflippedfacets,
    +  Zflipridge,
    +  Zflipridge2,
       Zgauss0,
       Zminnorm,
       Zmultiridge,
    @@ -325,6 +352,8 @@
       Zpartcoplanar,
       Zpartition,
       Zpartitionall,
    +  Zpinchduplicate,
    +  Zpinchedvertex,
       Zprocessed,
       Zretry,
       Zridge,
    @@ -342,7 +371,8 @@
       Zsetplane,
       Ztotcheck,
       Ztotmerge,
    -    ZEND};
    +  Zvertextests,
    +  ZEND};
     #endif
     
     /*---------------------------------
     
        usermem_r.c
    -   qh_exit(), qh_free(), and qh_malloc()
    +   user redefinable functions -- qh_exit, qh_free, and qh_malloc
     
        See README.txt.
     
    @@ -28,6 +28,8 @@
     
       qh_exit( exitcode )
         exit program
    +    the exitcode must be 255 or less.  Zero indicates success.
    +    Note: Exit status ('$?') in bash reports 256 as 0
     
       notes:
         qh_exit() is called when qh_errexit() and longjmp() are not available.
    @@ -46,7 +48,8 @@
         fprintf to stderr with msgcode (non-zero)
     
       notes:
    -    qh_fprintf_stderr() is called when qh->ferr is not defined, usually due to an initialization error
    +    qh_fprintf_stderr() is called when qh.ferr is not defined, usually due to an initialization error
    +    if msgcode is a MSG_ERROR (6000), caller should set qh.last_errcode (like qh_fprintf) or variable 'last_errcode'
         
         It is typically followed by qh_errexit().
     
    @@ -67,7 +70,7 @@
     /*---------------------------------
     
    -  qh_free(qhT *qh, mem )
    +  qh_free(qh, mem )
         free memory
     
       notes:
    diff -Nru qhull-2015.2/src/libqhull_r/userprintf_rbox_r.c qhull-2020.2/src/libqhull_r/userprintf_rbox_r.c
    --- qhull-2015.2/src/libqhull_r/userprintf_rbox_r.c	2016-01-17 21:51:14.000000000 +0000
    +++ qhull-2020.2/src/libqhull_r/userprintf_rbox_r.c	2019-06-27 22:29:23.000000000 +0000
    @@ -2,7 +2,7 @@
       >--------------------------------
     
        userprintf_rbox_r.c
    -   qh_fprintf_rbox()
    +   user redefinable function -- qh_fprintf_rbox
     
        see README.txt  see COPYING.txt for copyright information.
     
    @@ -41,8 +41,8 @@
         va_list args;
     
         if (!fp) {
    -        qh_fprintf_stderr(6231, "Qhull internal error (userprintf_rbox_r.c): fp is 0.  Wrong qh_fprintf_rbox called.\n");
    -        qh_errexit_rbox(qh, 6231);
    +      qh_fprintf_stderr(6231, "qhull internal error (userprintf_rbox_r.c): fp is 0.  Wrong qh_fprintf_rbox called.\n");
    +      qh_errexit_rbox(qh, qh_ERRqhull);
         }
         if (msgcode >= MSG_ERROR && msgcode < MSG_STDERR)
           fprintf(fp, "QH%.4d ", msgcode);
    diff -Nru qhull-2015.2/src/libqhull_r/userprintf_r.c qhull-2020.2/src/libqhull_r/userprintf_r.c
    --- qhull-2015.2/src/libqhull_r/userprintf_r.c	2016-01-17 21:51:14.000000000 +0000
    +++ qhull-2020.2/src/libqhull_r/userprintf_r.c	2019-06-27 20:12:57.000000000 +0000
    @@ -1,65 +1,95 @@
     /*
      ---------------------------------
     
    -   userprintf_r.c
    -   qh_fprintf()
    +  userprintf_r.c
    +  user redefinable function -- qh_fprintf
     
    -   see README.txt  see COPYING.txt for copyright information.
    +  see README.txt  see COPYING.txt for copyright information.
     
    -   If you recompile and load this file, then userprintf_r.o will not be loaded
    -   from qhull.a or qhull.lib
    +  If you recompile and load this file, then userprintf_r.o will not be loaded
    +  from qhull_r.a or qhull_r.lib
     
    -   See libqhull_r.h for data structures, macros, and user-callable functions.
    -   See user_r.c for qhull-related, redefinable functions
    -   see user_r.h for user-definable constants
    -   See usermem_r.c for qh_exit(), qh_free(), and qh_malloc()
    -   see Qhull.cpp and RboxPoints.cpp for examples.
    +  See libqhull_r.h for data structures, macros, and user-callable functions.
    +  See user_r.c for qhull-related, redefinable functions
    +  see user_r.h for user-definable constants
    +  See usermem_r.c for qh_exit(), qh_free(), and qh_malloc()
    +  see Qhull.cpp and RboxPoints.cpp for examples.
     
    -   Please report any errors that you fix to qhull@qhull.org
    +  qh_printf is a good location for debugging traps, checked on each log line
    +
    +  Please report any errors that you fix to qhull@qhull.org
     */
     
     #include "libqhull_r.h"
    +#include "poly_r.h" /* for qh.tracefacet */
     
     #include 
     #include 
     #include 
     
     /*---------------------------------
    +  >--------------------------------
     
    -   qh_fprintf(qh, fp, msgcode, format, list of args )
    -     print arguments to *fp according to format
    -     Use qh_fprintf_rbox() for rboxlib_r.c
    -
    -   notes:
    -     same as fprintf()
    -     fgets() is not trapped like fprintf()
    -     exit qh_fprintf via qh_errexit()
    -     may be called for errors in qh_initstatistics and qh_meminit
    +  qh_fprintf(qh, fp, msgcode, format, list of args )
    +    print arguments to *fp according to format
    +    Use qh_fprintf_rbox() for rboxlib_r.c
    +
    +  notes:
    +    sets qh.last_errcode if msgcode is error 6000..6999
    +    same as fprintf()
    +    fgets() is not trapped like fprintf()
    +    exit qh_fprintf via qh_errexit()
    +    may be called for errors in qh_initstatistics and qh_meminit
     */
     
     void qh_fprintf(qhT *qh, FILE *fp, int msgcode, const char *fmt, ... ) {
    -    va_list args;
    +  va_list args;
    +  facetT *neighbor, **neighborp;
     
    -    if (!fp) {
    -        if(!qh){
    -            qh_fprintf_stderr(6241, "userprintf_r.c: fp and qh not defined for qh_fprintf '%s'", fmt);
    -            qh_exit(qhmem_ERRqhull);  /* can not use qh_errexit() */
    -        }
    -        /* could use qh->qhmem.ferr, but probably better to be cautious */
    -        qh_fprintf_stderr(6232, "Qhull internal error (userprintf_r.c): fp is 0.  Wrong qh_fprintf called.\n");
    -        qh_errexit(qh, 6232, NULL, NULL);
    +  if (!fp) {
    +    if(!qh){
    +      qh_fprintf_stderr(6241, "qhull internal error (userprintf_r.c): fp and qh not defined for qh_fprintf '%s'\n", fmt);
    +      qh->last_errcode= 6241;
    +      qh_exit(qh_ERRqhull);  /* can not use qh_errexit() */
         }
    -    va_start(args, fmt);
    -    if (qh && qh->ANNOTATEoutput) {
    -      fprintf(fp, "[QH%.4d]", msgcode);
    -    }else if (msgcode >= MSG_ERROR && msgcode < MSG_STDERR ) {
    -      fprintf(fp, "QH%.4d ", msgcode);
    +    /* could use qh->qhmem.ferr, but probably better to be cautious */
    +    qh_fprintf_stderr(6028, "qhull internal error (userprintf_r.c): fp is 0.  Wrong qh_fprintf was called.\n");
    +    qh->last_errcode= 6028;
    +    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    +  }
    +  if ((qh && qh->ANNOTATEoutput) || msgcode < MSG_TRACE4) {
    +    fprintf(fp, "[QH%.4d]", msgcode);
    +  }else if (msgcode >= MSG_ERROR && msgcode < MSG_STDERR ) {
    +    fprintf(fp, "QH%.4d ", msgcode);
    +  }
    +  va_start(args, fmt);
    +  vfprintf(fp, fmt, args);
    +  va_end(args);
    +    
    +  if (qh) {
    +    if (msgcode >= MSG_ERROR && msgcode < MSG_WARNING)
    +      qh->last_errcode= msgcode;
    +    /* Place debugging traps here. Use with trace option 'Tn' 
    +       Set qh.tracefacet_id, qh.traceridge_id, and/or qh.tracevertex_id in global_r.c
    +    */
    +    if (False) { /* in production skip test for debugging traps */
    +      if (qh->tracefacet && qh->tracefacet->tested) {
    +        if (qh_setsize(qh, qh->tracefacet->neighbors) < qh->hull_dim)
    +          qh_errexit(qh, qh_ERRdebug, qh->tracefacet, qh->traceridge);
    +        FOREACHneighbor_(qh->tracefacet) {
    +          if (neighbor != qh_DUPLICATEridge && neighbor != qh_MERGEridge && neighbor->visible)
    +            qh_errexit2(qh, qh_ERRdebug, qh->tracefacet, neighbor);
    +        }
    +      } 
    +      if (qh->traceridge && qh->traceridge->top->id == 234342223) {
    +        qh_errexit(qh, qh_ERRdebug, qh->tracefacet, qh->traceridge);
    +      }
    +      if (qh->tracevertex && qh_setsize(qh, qh->tracevertex->neighbors)>3434334) {
    +        qh_errexit(qh, qh_ERRdebug, qh->tracefacet, qh->traceridge);
    +      }
         }
    -    vfprintf(fp, fmt, args);
    -    va_end(args);
    -
    -    /* Place debugging traps here. Use with option 'Tn' */
    -
    +    if (qh->FLUSHprint)
    +      fflush(fp);
    +  }
     } /* qh_fprintf */
     
    diff -Nru qhull-2015.2/src/libqhull_r/user_r.c qhull-2020.2/src/libqhull_r/user_r.c
    --- qhull-2015.2/src/libqhull_r/user_r.c	2016-01-17 21:51:14.000000000 +0000
    +++ qhull-2020.2/src/libqhull_r/user_r.c	2020-05-24 19:54:12.000000000 +0000
    @@ -1,7 +1,7 @@
     /*
      ---------------------------------
     
    -   user.c
    +   user_r.c
        user redefinable functions
     
        see user2_r.c for qh_fprintf, qh_malloc, qh_free
    @@ -10,13 +10,13 @@
     
        see libqhull_r.h for data structures, macros, and user-callable functions.
     
    -   see user_eg.c, user_eg2.c, and unix.c for examples.
    +   see user_eg_r.c, user_eg2_r.c, and unix_r.c for examples.
     
    -   see user.h for user-definable constants
    +   see user_r.h for user-definable constants
     
           use qh_NOmem in mem_r.h to turn off memory management
    -      use qh_NOmerge in user.h to turn off facet merging
    -      set qh_KEEPstatistics in user.h to 0 to turn off statistics
    +      use qh_NOmerge in user_r.h to turn off facet merging
    +      set qh_KEEPstatistics in user_r.h to 0 to turn off statistics
     
        This is unsupported software.  You're welcome to make changes,
        but you're on your own if something goes wrong.  Use 'Tc' to
    @@ -56,7 +56,6 @@
     
       notes:
         This can be called any number of times.
    -
     */
     #if 0
     {
    @@ -64,16 +63,16 @@
       int numpoints;            /* number of points */
       coordT *points;           /* array of coordinates for each point */
       boolT ismalloc;           /* True if qhull should free points in qh_freeqhull() or reallocation */
    -  char flags[]= "qhull Tv"; /* option flags for qhull, see qh_opt.htm */
    -  FILE *outfile= stdout;    /* output from qh_produce_output(qh)
    -                               use NULL to skip qh_produce_output(qh) */
    +  char flags[]= "qhull Tv"; /* option flags for qhull, see html/qh-quick.htm */
    +  FILE *outfile= stdout;    /* output from qh_produce_output
    +                               use NULL to skip qh_produce_output */
       FILE *errfile= stderr;    /* error messages from qhull code */
       int exitcode;             /* 0 if no error from qhull */
       facetT *facet;            /* set by FORALLfacets */
       int curlong, totlong;     /* memory remaining after qh_memfreeshort */
     
       qhT qh_qh;                /* Qhull's data structure.  First argument of most calls */
    -  qhT *qh= &qh_qh;          /* Alternatively -- qhT *qh= (qhT*)malloc(sizeof(qhT)) */
    +  qhT *qh= &qh_qh;          /* Alternatively -- qhT *qh= (qhT *)malloc(sizeof(qhT)) */
     
       QHULL_LIB_CHECK /* Check for compatible library */
     
    @@ -91,7 +90,7 @@
       qh_freeqhull(qh, !qh_ALL);
       qh_memfreeshort(qh, &curlong, &totlong);
       if (curlong || totlong)
    -    qh_fprintf(qh, errfile, 7068, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n", totlong, curlong);
    +    qh_fprintf(qh, errfile, 7079, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n", totlong, curlong);
     }
     #endif
     
    @@ -99,10 +98,13 @@
       >--------------------------------
     
       qh_new_qhull(qh, dim, numpoints, points, ismalloc, qhull_cmd, outfile, errfile )
    -    Run qhull and return results in qh.
    -    Returns exitcode (0 if no errors).
    +    Run qhull
         Before first call, either call qh_zero(qh, errfile), or set qh to all zero.
     
    +  returns:
    +    results in qh
    +    exitcode (0 if no errors).
    +
       notes:
         do not modify points until finished with results.
           The qhull data structure contains pointers into the points array.
    @@ -121,6 +123,9 @@
     */
     int qh_new_qhull(qhT *qh, int dim, int numpoints, coordT *points, boolT ismalloc,
                     char *qhull_cmd, FILE *outfile, FILE *errfile) {
    +  /* gcc may issue a "might be clobbered" warning for dim, points, and ismalloc [-Wclobbered].
    +     These parameters are not referenced after a longjmp() and hence not clobbered.
    +     See http://stackoverflow.com/questions/7721854/what-sense-do-these-clobbered-variable-warnings-make */
       int exitcode, hulldim;
       boolT new_ismalloc;
       coordT *new_points;
    @@ -133,16 +138,19 @@
       } else {
         qh_memcheck(qh);
       }
    -  if (strncmp(qhull_cmd, "qhull ", (size_t)6)) {
    -    qh_fprintf(qh, errfile, 6186, "qhull error (qh_new_qhull): start qhull_cmd argument with \"qhull \"\n");
    +  if (strncmp(qhull_cmd, "qhull ", (size_t)6) && strcmp(qhull_cmd, "qhull") != 0) {
    +    qh_fprintf(qh, errfile, 6186, "qhull error (qh_new_qhull): start qhull_cmd argument with \"qhull \" or set to \"qhull\"\n");
         return qh_ERRinput;
       }
       qh_initqhull_start(qh, NULL, outfile, errfile);
    +  if(numpoints==0 && points==NULL){
    +      trace1((qh, qh->ferr, 1047, "qh_new_qhull: initialize Qhull\n"));
    +      return 0;
    +  }
       trace1((qh, qh->ferr, 1044, "qh_new_qhull: build new Qhull for %d %d-d points with %s\n", numpoints, dim, qhull_cmd));
    -  exitcode = setjmp(qh->errexit);
    -  if (!exitcode)
    -  {
    -    qh->NOerrexit = False;
    +  exitcode= setjmp(qh->errexit);
    +  if (!exitcode) {
    +    qh->NOerrexit= False;
         qh_initflags(qh, qhull_cmd);
         if (qh->DELAUNAY)
           qh->PROJECTdelaunay= True;
    @@ -168,10 +176,10 @@
         }else {
           qh_prepare_output(qh);
         }
    -    if (qh->VERIFYoutput && !qh->STOPpoint && !qh->STOPcone)
    +    if (qh->VERIFYoutput && !qh->FORCEoutput && !qh->STOPadd && !qh->STOPcone && !qh->STOPpoint)
           qh_check_points(qh);
       }
    -  qh->NOerrexit = True;
    +  qh->NOerrexit= True;
       return exitcode;
     } /* new_qhull */
     
    @@ -199,14 +207,18 @@
     */
     void qh_errexit(qhT *qh, int exitcode, facetT *facet, ridgeT *ridge) {
     
    +  qh->tracefacet= NULL;  /* avoid infinite recursion through qh_fprintf */
    +  qh->traceridge= NULL;
    +  qh->tracevertex= NULL;
       if (qh->ERREXITcalled) {
    -    qh_fprintf(qh, qh->ferr, 8126, "\nqhull error while processing previous error.  Exit program\n");
    -    qh_exit(qh_ERRqhull);
    +    qh_fprintf(qh, qh->ferr, 8126, "\nqhull error while handling previous error in qh_errexit.  Exit program\n");
    +    qh_exit(qh_ERRother);
       }
       qh->ERREXITcalled= True;
       if (!qh->QHULLfinished)
         qh->hulltime= qh_CPUclock - qh->hulltime;
       qh_errprint(qh, "ERRONEOUS", facet, NULL, ridge, NULL);
    +  qh_option(qh, "_maxoutside", NULL, &qh->MAXoutside);
       qh_fprintf(qh, qh->ferr, 8127, "\nWhile executing: %s | %s\n", qh->rbox_command, qh->qhull_command);
       qh_fprintf(qh, qh->ferr, 8128, "Options selected for Qhull %s:\n%s\n", qh_version, qh->qhull_options);
       if (qh->furthest_id >= 0) {
    @@ -227,6 +239,7 @@
           qh_printsummary(qh, qh->ferr);
           if (qh->PRINTstatistics) {
             qh_collectstatistics(qh);
    +        qh_allstatistics(qh);
             qh_printstatistics(qh, qh->ferr, "at error exit");
             qh_memstatistics(qh, qh->ferr);
           }
    @@ -235,14 +248,30 @@
           qh_printstats(qh, qh->ferr, qh->qhstat.precision, NULL);
       }
       if (!exitcode)
    -    exitcode= qh_ERRqhull;
    -  else if (exitcode == qh_ERRsingular)
    -    qh_printhelp_singular(qh, qh->ferr);
    +    exitcode= qh_ERRother;
       else if (exitcode == qh_ERRprec && !qh->PREmerge)
         qh_printhelp_degenerate(qh, qh->ferr);
    +  else if (exitcode == qh_ERRqhull)
    +    qh_printhelp_internal(qh, qh->ferr);
    +  else if (exitcode == qh_ERRsingular)
    +    qh_printhelp_singular(qh, qh->ferr);
    +  else if (exitcode == qh_ERRdebug)
    +    qh_fprintf(qh, qh->ferr, 8016, "qhull exit due to qh_ERRdebug\n");
    +  else if (exitcode == qh_ERRtopology || exitcode == qh_ERRwide || exitcode == qh_ERRprec) {
    +    if (qh->NOpremerge && !qh->MERGING)
    +      qh_printhelp_degenerate(qh, qh->ferr);
    +    else if (exitcode == qh_ERRtopology)
    +      qh_printhelp_topology(qh, qh->ferr);
    +    else if (exitcode == qh_ERRwide)
    +      qh_printhelp_wide(qh, qh->ferr);
    +  }else if (exitcode > 255) {
    +    qh_fprintf(qh, qh->ferr, 6426, "qhull internal error (qh_errexit): exit code %d is greater than 255.  Invalid argument for exit().  Replaced with 255\n", exitcode);
    +    exitcode= 255;
    +  }
       if (qh->NOerrexit) {
    -    qh_fprintf(qh, qh->ferr, 6187, "qhull error while ending program, or qh->NOerrexit not cleared after setjmp(). Exit program with error.\n");
    -    qh_exit(qh_ERRqhull);
    +    qh_fprintf(qh, qh->ferr, 6187, "qhull internal error (qh_errexit): either error while reporting error QH%d, or qh.NOerrexit not cleared after setjmp(). Exit program with error status %d\n",
    +         qh->last_errcode, exitcode);
    +    qh_exit(exitcode);
       }
       qh->ERREXITcalled= False;
       qh->NOerrexit= True;
    @@ -250,7 +279,6 @@
       longjmp(qh->errexit, exitcode);
     } /* errexit */
     
    -
     /*---------------------------------
     
    @@ -264,30 +292,29 @@
     void qh_errprint(qhT *qh, const char *string, facetT *atfacet, facetT *otherfacet, ridgeT *atridge, vertexT *atvertex) {
       int i;
     
    -  if (atfacet) {
    -    qh_fprintf(qh, qh->ferr, 8135, "%s FACET:\n", string);
    -    qh_printfacet(qh, qh->ferr, atfacet);
    -  }
    -  if (otherfacet) {
    -    qh_fprintf(qh, qh->ferr, 8136, "%s OTHER FACET:\n", string);
    -    qh_printfacet(qh, qh->ferr, otherfacet);
    +  if (atvertex) {
    +    qh_fprintf(qh, qh->ferr, 8138, "%s VERTEX:\n", string);
    +    qh_printvertex(qh, qh->ferr, atvertex);
       }
       if (atridge) {
         qh_fprintf(qh, qh->ferr, 8137, "%s RIDGE:\n", string);
         qh_printridge(qh, qh->ferr, atridge);
    -    if (atridge->top && atridge->top != atfacet && atridge->top != otherfacet)
    -      qh_printfacet(qh, qh->ferr, atridge->top);
    -    if (atridge->bottom
    -        && atridge->bottom != atfacet && atridge->bottom != otherfacet)
    -      qh_printfacet(qh, qh->ferr, atridge->bottom);
         if (!atfacet)
           atfacet= atridge->top;
         if (!otherfacet)
           otherfacet= otherfacet_(atridge, atfacet);
    +    if (atridge->top && atridge->top != atfacet && atridge->top != otherfacet)
    +      qh_printfacet(qh, qh->ferr, atridge->top);
    +    if (atridge->bottom && atridge->bottom != atfacet && atridge->bottom != otherfacet)
    +      qh_printfacet(qh, qh->ferr, atridge->bottom);
       }
    -  if (atvertex) {
    -    qh_fprintf(qh, qh->ferr, 8138, "%s VERTEX:\n", string);
    -    qh_printvertex(qh, qh->ferr, atvertex);
    +  if (atfacet) {
    +    qh_fprintf(qh, qh->ferr, 8135, "%s FACET:\n", string);
    +    qh_printfacet(qh, qh->ferr, atfacet);
    +  }
    +  if (otherfacet) {
    +    qh_fprintf(qh, qh->ferr, 8136, "%s OTHER FACET:\n", string);
    +    qh_printfacet(qh, qh->ferr, otherfacet);
       }
       if (qh->fout && qh->FORCEoutput && atfacet && !qh->QHULLfinished && !qh->IStracing) {
         qh_fprintf(qh, qh->ferr, 8139, "ERRONEOUS and NEIGHBORING FACETS to output\n");
    @@ -312,20 +339,30 @@
     void qh_printfacetlist(qhT *qh, facetT *facetlist, setT *facets, boolT printall) {
       facetT *facet, **facetp;
     
    +  if (facetlist)
    +    qh_checklists(qh, facetlist);
    +  qh_fprintf(qh, qh->ferr, 9424, "printfacetlist: vertices\n");
       qh_printbegin(qh, qh->ferr, qh_PRINTfacets, facetlist, facets, printall);
    -  FORALLfacet_(facetlist)
    -    qh_printafacet(qh, qh->ferr, qh_PRINTfacets, facet, printall);
    -  FOREACHfacet_(facets)
    -    qh_printafacet(qh, qh->ferr, qh_PRINTfacets, facet, printall);
    +  if (facetlist) {
    +    qh_fprintf(qh, qh->ferr, 9413, "printfacetlist: facetlist\n");
    +    FORALLfacet_(facetlist)
    +      qh_printafacet(qh, qh->ferr, qh_PRINTfacets, facet, printall);
    +  }
    +  if (facets) {
    +    qh_fprintf(qh, qh->ferr, 9414, "printfacetlist: %d facets\n", qh_setsize(qh, facets));
    +    FOREACHfacet_(facets)
    +      qh_printafacet(qh, qh->ferr, qh_PRINTfacets, facet, printall);
    +  }
    +  qh_fprintf(qh, qh->ferr, 9412, "printfacetlist: end\n");
       qh_printend(qh, qh->ferr, qh_PRINTfacets, facetlist, facets, printall);
     } /* printfacetlist */
     
     
    -/*---------------------------------
     
       qh_printhelp_degenerate(qh, fp )
    -    prints descriptive message for precision error
    +    prints descriptive message for precision error with qh_ERRprec
     
       notes:
         no message if qh_QUICKhelp
    @@ -358,7 +395,7 @@
     \n\
     Qhull is currently using single precision arithmetic.  The following\n\
     will probably remove the precision problems:\n\
    -  - recompile qhull for realT precision(#define REALfloat 0 in user.h).\n");
    +  - recompile qhull for realT precision(#define REALfloat 0 in user_r.h).\n");
     #endif
         if (qh->DELAUNAY && !qh->SCALElast && qh->MAXabs_coord > 1e4)
           qh_fprintf(qh, fp, 9371, "\
    @@ -396,29 +433,47 @@
       }
     } /* printhelp_degenerate */
     
    +/*---------------------------------
    +
    +  qh_printhelp_internal(qh, fp )
    +    prints descriptive message for qhull internal error with qh_ERRqhull
    +
    +  notes:
    +    no message if qh_QUICKhelp
    +*/
    +void qh_printhelp_internal(qhT *qh, FILE *fp) {
    +
    +  if (!qh_QUICKhelp) {
    +    qh_fprintf(qh, fp, 9426, "\n\
    +A Qhull internal error has occurred.  Please send the input and output to\n\
    +qhull_bug@qhull.org. If you can duplicate the error with logging ('T4z'), please\n\
    +include the log file.\n");
    +  }
    +} /* printhelp_internal */
     
    -/*---------------------------------
     
       qh_printhelp_narrowhull(qh, minangle )
         Warn about a narrow hull
     
       notes:
    -    Alternatively, reduce qh_WARNnarrow in user.h
    +    Alternatively, reduce qh_WARNnarrow in user_r.h
     
     */
     void qh_printhelp_narrowhull(qhT *qh, FILE *fp, realT minangle) {
     
    -    qh_fprintf(qh, fp, 9375, "qhull precision warning: \n\
    -The initial hull is narrow (cosine of min. angle is %.16f).\n\
    -Is the input lower dimensional (e.g., on a plane in 3-d)?  Qhull may\n\
    -produce a wide facet.  Options 'QbB' (scale to unit box) or 'Qbb' (scale\n\
    -last coordinate) may remove this warning.  Use 'Pp' to skip this warning.\n\
    -See 'Limitations' in qh-impre.htm.\n",
    +    qh_fprintf(qh, fp, 7089, "qhull precision warning: The initial hull is narrow.  Is the input lower\n\
    +dimensional (e.g., a square in 3-d instead of a cube)?  Cosine of the minimum\n\
    +angle is %.16f.  If so, Qhull may produce a wide facet.\n\
    +Options 'Qs' (search all points), 'Qbb' (scale last coordinate), or\n\
    +'QbB' (scale to unit box) may remove this warning.\n\
    +See 'Limitations' in qh-impre.htm.  Use 'Pp' to skip this warning.\n",
               -minangle);   /* convert from angle between normals to angle between facets */
     } /* printhelp_narrowhull */
     
    -/*---------------------------------
     
       qh_printhelp_singular(qh, fp )
    @@ -506,7 +561,45 @@
       }
     } /* printhelp_singular */
     
    -/*---------------------------------
    +
    +  qh_printhelp_topology(qh, fp )
    +    prints descriptive message for qhull topology error with qh_ERRtopology
    +
    +  notes:
    +    no message if qh_QUICKhelp
    +*/
    +void qh_printhelp_topology(qhT *qh, FILE *fp) {
    +
    +  if (!qh_QUICKhelp) {
    +    qh_fprintf(qh, fp, 9427, "\n\
    +A Qhull topology error has occurred.  Qhull did not recover from facet merges and vertex merges.\n\
    +This usually occurs when the input is nearly degenerate and substantial merging has occurred.\n\
    +See http://www.qhull.org/html/qh-impre.htm#limit\n");
    +  }
    +} /* printhelp_topology */
    +
    +/*---------------------------------
    +
    +  qh_printhelp_wide(qh, fp )
    +    prints descriptive message for qhull wide facet with qh_ERRwide
    +
    +  notes:
    +    no message if qh_QUICKhelp
    +*/
    +void qh_printhelp_wide(qhT *qh, FILE *fp) {
    +
    +  if (!qh_QUICKhelp) {
    +    qh_fprintf(qh, fp, 9428, "\n\
    +A wide merge error has occurred.  Qhull has produced a wide facet due to facet merges and vertex merges.\n\
    +This usually occurs when the input is nearly degenerate and substantial merging has occurred.\n\
    +See http://www.qhull.org/html/qh-impre.htm#limit\n");
    +  }
    +} /* printhelp_wide */
    +
    +/*---------------------------------
     
       qh_user_memsizes(qh)
    diff -Nru qhull-2015.2/src/libqhull_r/user_r.h qhull-2020.2/src/libqhull_r/user_r.h
    --- qhull-2015.2/src/libqhull_r/user_r.h	2016-01-19 00:31:04.000000000 +0000
    +++ qhull-2020.2/src/libqhull_r/user_r.h	2020-05-20 01:14:06.000000000 +0000
    @@ -1,7 +1,7 @@
     /*
      ---------------------------------
     
    -   user.h
    +   user_r.h
        user redefinable constants
     
        for each source file, user_r.h is included first
    @@ -19,7 +19,8 @@
        ============= memory constants =============================
        ============= joggle constants =============================
        ============= conditional compilation ======================
    -   ============= -merge constants- ============================
    +   ============= merge constants ==============================
    +   ============= Microsoft DevStudio ==========================
     
     Code flags --
       NOerrors -- the code does not call qh_errexit()
    @@ -27,6 +28,8 @@
     
     */
     
    +#include 
    +#include 
     #include 
     
     #ifndef qhDEFuser
    @@ -58,27 +61,28 @@
       msgcode -- Unique message codes for qh_fprintf
     
       If add new messages, assign these values and increment in user.h and user_r.h
    -  See QhullError.h for 10000 errors.
    +  See QhullError.h for 10000 error codes.
    +  Cannot use '0031' since it would be octal
     
    -  def counters =  [27, 1048, 2059, 3026, 4068, 5003,
    -     6273, 7081, 8147, 9411, 10000, 11029]
    +  def counters =  [31/32/33/38, 1067, 2113, 3079, 4097, 5006,
    +     6429, 7027/7028/7035/7068/7070/7102, 8163, 9428, 10000, 11034]
     
       See: qh_ERR* [libqhull_r.h]
     */
     
    -#define MSG_TRACE0 0
    -#define MSG_TRACE1 1000
    -#define MSG_TRACE2 2000
    -#define MSG_TRACE3 3000
    -#define MSG_TRACE4 4000
    -#define MSG_TRACE5 5000
    -#define MSG_ERROR  6000   /* errors written to qh.ferr */
    +#define MSG_TRACE0     0   /* always include if logging ('Tn') */
    +#define MSG_TRACE1  1000
    +#define MSG_TRACE2  2000
    +#define MSG_TRACE3  3000
    +#define MSG_TRACE4  4000
    +#define MSG_TRACE5  5000
    +#define MSG_ERROR   6000   /* errors written to qh.ferr */
     #define MSG_WARNING 7000
    -#define MSG_STDERR  8000  /* log messages Written to qh.ferr */
    +#define MSG_STDERR  8000   /* log messages Written to qh.ferr */
     #define MSG_OUTPUT  9000
     #define MSG_QHULL_ERROR 10000 /* errors thrown by QhullError.cpp (QHULLlastError is in QhullError.h) */
    -#define MSG_FIXUP  11000  /* FIXUP QH11... */
    -#define MSG_MAXLEN  3000 /* qh_printhelp_degenerate() in user.c */
    +#define MSG_FIX    11000   /* Document as 'QH11... FIX: ...' */
    +#define MSG_MAXLEN  3000   /* qh_printhelp_degenerate() in user_r.c */
     
     
     /*----------------------------------
    +
    +  qh_POINTSmax
    +    Maximum number of points for qh.num_points and point allocation in qh_readpoints
    +*/
    +#define qh_POINTSmax (INT_MAX-16)
     
     /*----------------------------------
    @@ -216,24 +227,24 @@
     #if (qh_CLOCKtype == 1)
     
     #if defined(CLOCKS_PER_SECOND)
    -#define qh_CPUclock    ((unsigned long)clock())  /* return CPU clock */
    +#define qh_CPUclock    ((unsigned long)clock())  /* return CPU clock, may be converted to approximate double */
     #define qh_SECticks CLOCKS_PER_SECOND
     
     #elif defined(CLOCKS_PER_SEC)
    -#define qh_CPUclock    ((unsigned long)clock())  /* return CPU clock */
    +#define qh_CPUclock    ((unsigned long)clock())  /* return CPU clock, may be converted to approximate double */
     #define qh_SECticks CLOCKS_PER_SEC
     
     #elif defined(CLK_TCK)
    -#define qh_CPUclock    ((unsigned long)clock())  /* return CPU clock */
    +#define qh_CPUclock    ((unsigned long)clock())  /* return CPU clock, may be converted to approximate double */
     #define qh_SECticks CLK_TCK
     
     #else
    -#define qh_CPUclock    ((unsigned long)clock())  /* return CPU clock */
    +#define qh_CPUclock    ((unsigned long)clock())  /* return CPU clock, may be converted to approximate double */
     #define qh_SECticks 1E6
     #endif
     
     #elif (qh_CLOCKtype == 2)
    -#define qh_CPUclock    qh_clock()  /* return CPU clock */
    +#define qh_CPUclock    qh_clock()  /* return CPU clock, may be converted to approximate double */
     #define qh_SECticks 100
     
     #else /* qh_CLOCKtype == ? */
    @@ -286,12 +297,12 @@
     #define qh_RANDOMmax ((realT)32767)   /* 15 bits (System 5) */
     #endif
     #define qh_RANDOMint  rand()
    -#define qh_RANDOMseed_(qh, seed) srand((unsigned)seed);
    +#define qh_RANDOMseed_(qh, seed) srand((unsigned int)seed);
     
     #elif (qh_RANDOMtype == 3)
     #define qh_RANDOMmax ((realT)0x7fffffffUL)  /* 31 bits, Sun */
     #define qh_RANDOMint  rand()
    -#define qh_RANDOMseed_(qh, seed) srand((unsigned)seed);
    +#define qh_RANDOMseed_(qh, seed) srand((unsigned int)seed);
     
     #elif (qh_RANDOMtype == 4)
     #define qh_RANDOMmax ((realT)0x7fffffffUL)  /* 31 bits, lrand38()/MAX */
    @@ -316,46 +327,56 @@
     */
     #define qh_ORIENTclock 0
     
    +/*----------------------------------
    +
    +  qh_RANDOMdist
    +    define for random perturbation of qh_distplane and qh_setfacetplane (qh.RANDOMdist, 'QRn')
    +
    +  For testing qh.DISTround.  Qhull should not depend on computations always producing the same roundoff error 
    +
    +  #define qh_RANDOMdist 1e-13
    +*/
     
     /*============================================================*/
     /*============= joggle constants =============================*/
     /*============================================================*/
     
     /*----------------------------------
    +  >---------------------------------
     
    -qh_JOGGLEdefault
    -default qh.JOGGLEmax is qh.DISTround * qh_JOGGLEdefault
    +  qh_JOGGLEdefault
    +    default qh.JOGGLEmax is qh.DISTround * qh_JOGGLEdefault
     
    -notes:
    -rbox s r 100 | qhull QJ1e-15 QR0 generates 90% faults at distround 7e-16
    -rbox s r 100 | qhull QJ1e-14 QR0 generates 70% faults
    -rbox s r 100 | qhull QJ1e-13 QR0 generates 35% faults
    -rbox s r 100 | qhull QJ1e-12 QR0 generates 8% faults
    -rbox s r 100 | qhull QJ1e-11 QR0 generates 1% faults
    -rbox s r 100 | qhull QJ1e-10 QR0 generates 0% faults
    -rbox 1000 W0 | qhull QJ1e-12 QR0 generates 86% faults
    -rbox 1000 W0 | qhull QJ1e-11 QR0 generates 20% faults
    -rbox 1000 W0 | qhull QJ1e-10 QR0 generates 2% faults
    -the later have about 20 points per facet, each of which may interfere
    +  notes:
    +    rbox s r 100 | qhull QJ1e-15 QR0 generates 90% faults at distround 7e-16
    +    rbox s r 100 | qhull QJ1e-14 QR0 generates 70% faults
    +    rbox s r 100 | qhull QJ1e-13 QR0 generates 35% faults
    +    rbox s r 100 | qhull QJ1e-12 QR0 generates 8% faults
    +    rbox s r 100 | qhull QJ1e-11 QR0 generates 1% faults
    +    rbox s r 100 | qhull QJ1e-10 QR0 generates 0% faults
    +    rbox 1000 W0 | qhull QJ1e-12 QR0 generates 86% faults
    +    rbox 1000 W0 | qhull QJ1e-11 QR0 generates 20% faults
    +    rbox 1000 W0 | qhull QJ1e-10 QR0 generates 2% faults
    +    the later have about 20 points per facet, each of which may interfere
     
    -pick a value large enough to avoid retries on most inputs
    +    pick a value large enough to avoid retries on most inputs
     */
     #define qh_JOGGLEdefault 30000.0
     
     /*----------------------------------
    +  >---------------------------------
     
    -qh_JOGGLEincrease
    -factor to increase qh.JOGGLEmax on qh_JOGGLEretry or qh_JOGGLEagain
    +  qh_JOGGLEincrease
    +    factor to increase qh.JOGGLEmax on qh_JOGGLEretry or qh_JOGGLEagain
     */
     #define qh_JOGGLEincrease 10.0
     
     /*----------------------------------
    +  >---------------------------------
     
    -qh_JOGGLEretry
    -if ZZretry = qh_JOGGLEretry, increase qh.JOGGLEmax
    +  qh_JOGGLEretry
    +    if ZZretry = qh_JOGGLEretry, increase qh.JOGGLEmax
     
     notes:
     try twice at the original value in case of bad luck the first time
    @@ -363,35 +384,35 @@
     #define qh_JOGGLEretry 2
     
     /*----------------------------------
    +  >---------------------------------
     
    -qh_JOGGLEagain
    -every following qh_JOGGLEagain, increase qh.JOGGLEmax
    +  qh_JOGGLEagain
    +    every following qh_JOGGLEagain, increase qh.JOGGLEmax
     
    -notes:
    -1 is OK since it's already failed qh_JOGGLEretry times
    +  notes:
    +    1 is OK since it's already failed qh_JOGGLEretry times
     */
     #define qh_JOGGLEagain 1
     
     /*----------------------------------
    +  >---------------------------------
     
    -qh_JOGGLEmaxincrease
    -maximum qh.JOGGLEmax due to qh_JOGGLEincrease
    -relative to qh.MAXwidth
    +  qh_JOGGLEmaxincrease
    +    maximum qh.JOGGLEmax due to qh_JOGGLEincrease
    +    relative to qh.MAXwidth
     
    -notes:
    -qh.joggleinput will retry at this value until qh_JOGGLEmaxretry
    +  notes:
    +    qh.joggleinput will retry at this value until qh_JOGGLEmaxretry
     */
     #define qh_JOGGLEmaxincrease 1e-2
     
     /*----------------------------------
    +  >---------------------------------
     
    -qh_JOGGLEmaxretry
    -stop after qh_JOGGLEmaxretry attempts
    +  qh_JOGGLEmaxretry
    +    stop after qh_JOGGLEmaxretry attempts
     */
    -#define qh_JOGGLEmaxretry 100
    +#define qh_JOGGLEmaxretry 50
     
     /*============================================================*/
     /*============= performance related constants ================*/
    @@ -572,19 +593,21 @@
     
       qh_NOmerge
         disables facet merging if defined
    +    For MSVC compiles, use qhull_r-exports-nomerge.def instead of qhull_r-exports.def
     
       notes:
    -    This saves about 10% space.
    +    This saves about 25% space, 30% space in combination with qh_NOtrace, 
    +    and 36% with qh_NOtrace and qh_KEEPstatistics 0
     
    -    Unless 'Q0'
    +    Unless option 'Q0' is used
           qh_NOmerge sets 'QJ' to avoid precision errors
     
    -    #define qh_NOmerge
    -
       see:
    -    qh_NOmem in mem_r.c
    +    qh_NOmem in mem_r.h
     
         see user_r.c/user_eg.c for removing io_r.o
    +
    +  #define qh_NOmerge
     */
     
     /*----------------------------------
    -
    -  qh_DIMmergeVertex
    -    max dimension for vertex merging (it is not effective in high-d)
    -*/
    -#define qh_DIMmergeVertex 6
    -
    -/*----------------------------------
    -
    -  qh_DIMreduceBuild
    -     max dimension for vertex reduction during build (slow in high-d)
    -*/
    -#define qh_DIMreduceBuild 5
    -
    -/*----------------------------------
     
       qh_BESTcentrum
    @@ -663,39 +673,31 @@
     #define qh_BESTnonconvex 15
     
     /*----------------------------------
    +  >---------------------------------
     
    -  qh_MAXnewmerges
    -    if >n newmerges, qh_merge_nonconvex() calls qh_reducevertices_centrums.
    +  qh_COPLANARratio
    +    for 3-d+ merging, qh.MINvisible is n*premerge_centrum
     
       notes:
    -    It is needed because postmerge can merge many facets at once
    +    for non-merging, it's DISTround
     */
    -#define qh_MAXnewmerges 2
    +#define qh_COPLANARratio 3
     
     /*----------------------------------
    -
    -  qh_MAXnewcentrum
    -    if <= dim+n vertices (n approximates the number of merges),
    -      reset the centrum in qh_updatetested() and qh_mergecycle_facets()
    +  >---------------------------------
     
    -  notes:
    -    needed to reduce cost and because centrums may move too much if
    -    many vertices in high-d
    +  qh_DIMmergeVertex
    +    max dimension for vertex merging (it is not effective in high-d)
     */
    -#define qh_MAXnewcentrum 5
    +#define qh_DIMmergeVertex 6
     
     /*----------------------------------
    -
    -  qh_COPLANARratio
    -    for 3-d+ merging, qh.MINvisible is n*premerge_centrum
    +  >---------------------------------
     
    -  notes:
    -    for non-merging, it's DISTround
    +  qh_DIMreduceBuild
    +     max dimension for vertex reduction during build (slow in high-d)
     */
    -#define qh_COPLANARratio 3
    +#define qh_DIMreduceBuild 5
     
     /*----------------------------------
    @@ -729,6 +731,108 @@
          fmax_((qh->MERGING ? 2 : 1)*qh->MINoutside, qh->max_outside))
     
     /*----------------------------------
    +
    +  qh_MAXcheckpoint
    +    Report up to qh_MAXcheckpoint errors per facet in qh_check_point ('Tv')
    +*/
    +#define qh_MAXcheckpoint 10
    +
    +/*----------------------------------
    +
    +  qh_MAXcoplanarcentrum
    +    if pre-merging with qh.MERGEexact ('Qx') and f.nummerge > qh_MAXcoplanarcentrum
    +      use f.maxoutside instead of qh.centrum_radius for coplanarity testing
    +
    +  notes:
    +    see qh_test_nonsimplicial_merges
    +    with qh.MERGEexact, a coplanar ridge is ignored until post-merging
    +    otherwise a large facet with many merges may take all the facets
    +*/
    +#define qh_MAXcoplanarcentrum 10
    +
    +/*----------------------------------
    +
    +  qh_MAXnewcentrum
    +    if <= dim+n vertices (n approximates the number of merges),
    +      reset the centrum in qh_updatetested() and qh_mergecycle_facets()
    +
    +  notes:
    +    needed to reduce cost and because centrums may move too much if
    +    many vertices in high-d
    +*/
    +#define qh_MAXnewcentrum 5
    +
    +/*----------------------------------
    +
    +  qh_MAXnewmerges
    +    if >n newmerges, qh_merge_nonconvex() calls qh_reducevertices_centrums.
    +
    +  notes:
    +    It is needed because postmerge can merge many facets at once
    +*/
    +#define qh_MAXnewmerges 2
    +
    +/*----------------------------------
    +
    +  qh_RATIOconcavehorizon
    +    ratio of horizon vertex distance to max_outside for concave, twisted new facets in qh_test_nonsimplicial_merge
    +    if too small, end up with vertices far below merged facets
    +*/
    +#define qh_RATIOconcavehorizon 20.0
    +
    +/*----------------------------------
    +
    +  qh_RATIOconvexmerge
    +    ratio of vertex distance to qh.min_vertex for clearly convex new facets in qh_test_nonsimplicial_merge
    +
    +  notes:
    +    must be convex for MRGtwisted
    +*/
    +#define qh_RATIOconvexmerge 10.0
    +
    +/*----------------------------------
    +
    +  qh_RATIOcoplanarapex
    +    ratio of best distance for coplanar apex vs. vertex merge in qh_getpinchedmerges
    +
    +  notes:
    +    A coplanar apex always works, while a vertex merge may fail
    +*/
    +#define qh_RATIOcoplanarapex 3.0
    +
    +/*----------------------------------
    +
    +  qh_RATIOcoplanaroutside
    +    qh.MAXoutside ratio to repartition a coplanar point in qh_partitioncoplanar and qh_check_maxout
    +
    +  notes:
    +    combines several tests, see qh_partitioncoplanar
    +
    +*/
    +#define qh_RATIOcoplanaroutside 30.0
    +
    +/*----------------------------------
    +
    +  qh_RATIOmaxsimplex
    +    ratio of max determinate to estimated determinate for searching all points in qh_maxsimplex
    +
    +  notes:
    +    As each point is added to the simplex, the max determinate is should approximate the previous determinate * qh.MAXwidth
    +    If maxdet is significantly less, the simplex may not be full-dimensional.
    +    If so, all points are searched, stopping at 10 times qh_RATIOmaxsimplex
    +*/
    +#define qh_RATIOmaxsimplex 1.0e-3
    +
    +/*----------------------------------
     
       qh_RATIOnearinside
    @@ -738,17 +842,44 @@
       notes:
         This is overkill since do not know the correct value.
         It effects whether 'Qc' reports all coplanar points
    -    Not used for 'd' since non-extreme points are coplanar
    +    Not used for 'd' since non-extreme points are coplanar, nearly incident points
     */
     #define qh_RATIOnearinside 5
     
     /*----------------------------------
    +
    +  qh_RATIOpinchedsubridge
    +    ratio to qh.ONEmerge to accept vertices in qh_findbest_pinchedvertex
    +    skips search of neighboring vertices
    +    facet width may increase by this ratio
    +*/
    +#define qh_RATIOpinchedsubridge 10.0
    +
    +/*----------------------------------
    +
    +  qh_RATIOtrypinched
    +    ratio to qh.ONEmerge to try qh_getpinchedmerges in qh_buildcone_mergepinched
    +    otherwise a duplicate ridge will increase facet width by this amount
    +*/
    +#define qh_RATIOtrypinched 4.0
    +
    +/*----------------------------------
    +
    +  qh_RATIOtwisted
    +    maximum ratio to qh.ONEmerge to merge twisted facets in qh_merge_twisted
    +*/
    +#define qh_RATIOtwisted 20.0
    +
    +/*----------------------------------
     
       qh_SEARCHdist
         When is a facet coplanar with the best facet?
         qh_findbesthorizon: all coplanar facets of the best facet need to be searched.
    -
    +        increases minsearch if ischeckmax and more than 100 neighbors (is_5x_minsearch)
       See:
         qh_DISToutside -- when is a point clearly outside of a facet
         qh_SEARCHdist -- when is facet coplanar with the best facet?
    @@ -772,7 +903,35 @@
     #define qh_USEfindbestnew (zzval_(Ztotmerge) > 50)
     
     /*----------------------------------
    +  >---------------------------------
    +
    +  qh_MAXnarrow
    +    max. cosine in initial hull that sets qh.NARROWhull
    +
    +  notes:
    +    If qh.NARROWhull, the initial partition does not make
    +    coplanar points.  If narrow, a coplanar point can be
    +    coplanar to two facets of opposite orientations and
    +    distant from the exact convex hull.
    +
    +    Conservative estimate.  Don't actually see problems until it is -1.0
    +*/
    +#define qh_MAXnarrow -0.99999999
    +
    +/*----------------------------------
    +
    +  qh_WARNnarrow
    +    max. cosine in initial hull to warn about qh.NARROWhull
    +
    +  notes:
    +    this is a conservative estimate.
    +    Don't actually see problems until it is -1.0.  See qh-impre.htm
    +*/
    +#define qh_WARNnarrow -0.999999999999999
    +
    +/*----------------------------------
     
       qh_WIDEcoplanar
         n*MAXcoplanar or n*MINvisible for a WIDEfacet
    @@ -782,51 +941,73 @@
         the facet's centrum is frozen.
     
       notes:
    -   qh.WIDEfacet= max(qh.MAXoutside,qh_WIDEcoplanar*qh.MAXcoplanar,
    -      qh_WIDEcoplanar * qh.MINvisible);
    +    qh.WIDEfacet= max(qh.MAXoutside,qh_WIDEcoplanar*qh.MAXcoplanar,
    +    qh_WIDEcoplanar * qh.MINvisible);
     */
     #define qh_WIDEcoplanar 6
     
     /*----------------------------------
    +>---------------------------------
     
       qh_WIDEduplicate
    -    Merge ratio for errexit from qh_forcedmerges due to duplicate ridge
    -    Override with option Q12 no-wide-duplicate
    +    merge ratio for errexit from qh_forcedmerges due to duplicate ridge
    +    Override with option Q12-allow-wide
     
    -    Notes:
    -      Merging a duplicate ridge can lead to very wide facets.
    -      A future release of qhull will avoid duplicate ridges by removing duplicate sub-ridges from the horizon
    +  Notes:
    +    Merging a duplicate ridge can lead to very wide facets.
     */
     #define qh_WIDEduplicate 100
     
     /*----------------------------------
    +>---------------------------------
     
    -  qh_MAXnarrow
    -    max. cosine in initial hull that sets qh.NARROWhull
    +  qh_WIDEdupridge
    +    Merge ratio for selecting a forced dupridge merge
     
    -  notes:
    -    If qh.NARROWhull, the initial partition does not make
    -    coplanar points.  If narrow, a coplanar point can be
    -    coplanar to two facets of opposite orientations and
    -    distant from the exact convex hull.
    +  Notes:
    +    Merging a dupridge can lead to very wide facets.
    +*/
    +#define qh_WIDEdupridge 50
     
    -    Conservative estimate.  Don't actually see problems until it is -1.0
    +/*----------------------------------
    +
    +  qh_WIDEmaxoutside
    +    Precision ratio for maximum increase for qh.max_outside in qh_check_maxout
    +    Precision errors while constructing the hull, may lead to very wide facets when checked in qh_check_maxout
    +    Nearly incident points in 4-d and higher is the most likely culprit
    +    Skip qh_check_maxout with 'Q5' (no-check-outer)
    +    Do not error with option 'Q12' (allow-wide)
    +    Do not warn with options 'Q12 Pp'
     */
    -#define qh_MAXnarrow -0.99999999
    +#define qh_WIDEmaxoutside 100
     
     /*----------------------------------
    +>---------------------------------
     
    -  qh_WARNnarrow
    -    max. cosine in initial hull to warn about qh.NARROWhull
    +  qh_WIDEmaxoutside2
    +    Precision ratio for maximum qh.max_outside in qh_check_maxout
    +    Skip qh_check_maxout with 'Q5' no-check-outer
    +    Do not error with option 'Q12' allow-wide
    +*/
    +#define qh_WIDEmaxoutside2 (10*qh_WIDEmaxoutside)
    +
    +
    +/*----------------------------------
    +
    +  qh_WIDEpinched
    +    Merge ratio for distance between pinched vertices compared to current facet width for qh_getpinchedmerges and qh_next_vertexmerge
    +    Reports warning and merges duplicate ridges instead
    +    Enable these attempts with option Q14 merge-pinched-vertices
     
       notes:
    -    this is a conservative estimate.
    -    Don't actually see problems until it is -1.0.  See qh-impre.htm
    +    Merging pinched vertices should prevent duplicate ridges (see qh_WIDEduplicate)
    +    Merging the duplicate ridges may be better than merging the pinched vertices
    +    Found up to 45x ratio for qh_pointdist -- for ((i=1; i<20; i++)); do rbox 175 C1,6e-13 t | qhull d T4 2>&1 | tee x.1 | grep  -E 'QH|non-simplicial|Statis|pinched'; done
    +    Actual distance to facets is a third to a tenth of the qh_pointdist (T1)
     */
    -#define qh_WARNnarrow -0.999999999999999
    +#define qh_WIDEpinched 100
     
     /*----------------------------------
    @@ -877,6 +1058,3 @@
     #endif
     
     #endif /* qh_DEFuser */
    -
    -
    -
    diff -Nru qhull-2015.2/src/qconvex/qconvex.c qhull-2020.2/src/qconvex/qconvex.c
    --- qhull-2015.2/src/qconvex/qconvex.c	2016-01-18 22:00:48.000000000 +0000
    +++ qhull-2020.2/src/qconvex/qconvex.c	2020-07-25 02:25:08.000000000 +0000
    @@ -6,7 +6,7 @@
     
        see unix.c for full interface
     
    -   Copyright (c) 1993-2015, The Geometry Center
    +   Copyright (c) 1993-2020, The Geometry Center
     */
     
     #include "libqhull/libqhull.h"
    @@ -17,12 +17,7 @@
     #include 
     #include 
     
    -#if __cplusplus
    -extern "C" {
    -  int isatty(int);
    -}
    -
    -#elif _MSC_VER
    +#if defined(_MSC_VER)
     #include 
     #define isatty _isatty
     /* int _isatty(int); */
    @@ -41,15 +36,17 @@
       notes:
         restricted version of libqhull.c
     
    -  see:
    -    concise prompt below
    +  notes:
    +    same text as unix.c
    +    see concise prompt below
    +    limit maximum literal to 1800 characters
     */
     
     /* duplicated in qconvex.htm */
    -char hidden_options[]=" d v H Qbb Qf Qg Qm Qr Qu Qv Qx Qz TR E V Fp Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
    +char hidden_options[]=" d v H Qbb Qf Qg Qm Qr Qu Qv Qx Qz TR E V Fp Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q15 ";
     
     char qh_prompta[]= "\n\
    -qconvex- compute the convex hull\n\
    +qconvex -- compute the convex hull\n\
         http://www.qhull.org  %s\n\
     \n\
     input (stdin):\n\
    @@ -58,40 +55,51 @@
         comments:    start with a non-numeric character\n\
     \n\
     options:\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
         Qc   - keep coplanar points with nearest facet\n\
         Qi   - keep interior points with nearest facet\n\
    +    QJ   - joggled input instead of merged facets\n\
    +    Qt   - triangulated output\n\
     \n\
     Qhull control options:\n\
    +    Qa   - allow input with fewer or more points than coordinates\n\
         Qbk:n   - scale coord k so that low bound is n\n\
           QBk:n - scale coord k so that upper bound is n (QBk is %2.2g)\n\
         QbB  - scale input to unit cube centered at the origin\n\
         Qbk:0Bk:0 - remove k-th coordinate from input\n\
         QJn  - randomly joggle input in range [-n,n]\n\
         QRn  - random rotation (n=seed, n=0 time, n=-1 time/no rotate)\n\
    +    Qs   - search all points for the initial simplex\n\
    +\n\
     %s%s%s%s";  /* split up qh_prompt for Visual C++ */
     char qh_promptb[]= "\
    -    Qs   - search all points for the initial simplex\n\
    +Qhull extra options:\n\
         QGn  - good facet if visible from point n, -n for not visible\n\
         QVn  - good facet if it includes point n, -n if not\n\
    +    Qw   - allow option warnings\n\
    +    Q12  - allow wide facets and wide dupridge\n\
    +    Q14  - merge pinched vertices that create a dupridge\n\
    +\n\
    +T options:\n\
    +    TFn  - report summary when n or more facets created\n\
    +    TI file - input file, may be enclosed in single quotes\n\
    +    TO file - output file, may be enclosed in single quotes\n\
    +    Ts   - statistics\n\
    +    Tv   - verify result: structure, convexity, and in-circle test\n\
    +    Tz   - send all output to stdout\n\
     \n\
     ";
     char qh_promptc[]= "\
     Trace options:\n\
         T4   - trace at level n, 4=all, 5=mem/gauss, -1= events\n\
    +    Ta   - annotate output with message codes\n\
    +    TAn  - stop qhull after adding n vertices\n\
    +     TCn - stop qhull after building cone for point n\n\
    +     TVn - stop qhull after adding point n, -n for before\n\
         Tc   - check frequently during execution\n\
    -    Ts   - print statistics\n\
    -    Tv   - verify result: structure, convexity, and point inclusion\n\
    -    Tz   - send all output to stdout\n\
    -    TFn  - report summary when n or more facets created\n\
    -    TI file - input data from file, no spaces or single quotes\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    +    Tf   - flush each qh_fprintf for debugging segfaults\n\
         TPn  - turn on tracing when point n added to hull\n\
          TMn - turn on tracing at merge n\n\
          TWn - trace merge facets when width > n\n\
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)\n\
    -     TCn - stop qhull after building cone for point n (see TVn)\n\
     \n\
     Precision options:\n\
         Cn   - radius of centrum (roundoff added).  Merge facets if non-convex\n\
    @@ -107,7 +115,7 @@
         i    - vertices incident to each facet\n\
         m    - Mathematica output (2-d and 3-d)\n\
         n    - normals with offsets\n\
    -    o    - OFF file format (dim, points and facets; Voronoi regions)\n\
    +    o    - OFF file format (dim, points and facets)\n\
         p    - point coordinates \n\
         s    - summary (stderr)\n\
     \n\
    @@ -125,6 +133,7 @@
         Fi   - inner plane for each facet\n\
         FI   - ID for each facet\n\
         Fm   - merge count for each facet (511 max)\n\
    +    FM   - Maple output (2-d and 3-d)\n\
         Fn   - count plus neighboring facets for each facet\n\
         FN   - count plus neighboring facets for each point\n\
         Fo   - outer plane (or max_outside) for each facet\n\
    @@ -132,8 +141,7 @@
         FP   - nearest vertex for each coplanar point\n\
         FQ   - command used for qconvex\n\
         Fs   - summary: #int (8), dimension, #points, tot vertices, tot facets,\n\
    -                      for output: #vertices, #facets,\n\
    -                                  #coplanar points, #non-simplicial facets\n\
    +                      output: #vertices, #facets, #coplanars, #nonsimplicial\n\
                         #real (2), max outer plane, min vertex\n\
         FS   - sizes:   #int (0) \n\
                         #real (2) tot area, tot volume\n\
    @@ -148,20 +156,20 @@
         Ga   - all points as dots\n\
          Gp  -  coplanar points and vertices as radii\n\
          Gv  -  vertices as spheres\n\
    +    Gc   - centrums\n\
    +    GDn  - drop dimension n in 3-d and 4-d output\n\
    +    Gh   - hyperplane intersections\n\
         Gi   - inner planes only\n\
          Gn  -  no planes\n\
          Go  -  outer planes only\n\
    -    Gc   - centrums\n\
    -    Gh   - hyperplane intersections\n\
         Gr   - ridges\n\
    -    GDn  - drop dimension n in 3-d and 4-d output\n\
     \n\
     Print options:\n\
         PAn  - keep n largest facets by area\n\
         Pdk:n - drop facet if normal[k] <= n (default 0.0)\n\
         PDk:n - drop facet if normal[k] >= n\n\
    -    Pg   - print good facets (needs 'QGn' or 'QVn')\n\
         PFn  - keep facets whose area is at least n\n\
    +    Pg   - print good facets (needs 'QGn' or 'QVn')\n\
         PG   - print neighbors of good facets\n\
         PMn  - keep n facets with most merges\n\
         Po   - force output.  If error, output neighborhood of facet\n\
    @@ -169,6 +177,7 @@
     \n\
         .    - list of all options\n\
         -    - one line descriptions of all options\n\
    +    -?   - help with examples\n\
         -V   - version\n\
     ";
     /* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    @@ -180,7 +189,7 @@
         synopsis for qhull
     */
     char qh_prompt2[]= "\n\
    -qconvex- compute the convex hull.  Qhull %s\n\
    +qconvex -- compute the convex hull.  Qhull %s\n\
         input (stdin): dimension, number of points, point coordinates\n\
         comments start with a non-numeric character\n\
     \n\
    @@ -189,27 +198,29 @@
         QJ   - joggled input instead of merged facets\n\
         Tv   - verify result: structure, convexity, and point inclusion\n\
         .    - concise list of all options\n\
    -    -    - one-line description of all options\n\
    +    -    - one-line description of each option\n\
    +    -?   - this message\n\
         -V   - version\n\
     \n\
     output options (subset):\n\
         s    - summary of results (default)\n\
         i    - vertices incident to each facet\n\
         n    - normals with offsets\n\
    -    p    - vertex coordinates (includes coplanar points if 'Qc')\n\
    -    Fx   - extreme points (convex hull vertices)\n\
    +    p    - vertex coordinates (if 'Qc', includes coplanar points)\n\
         FA   - report total area and volume\n\
    -    FS   - compute total area and volume\n\
    -    o    - OFF format (dim, n, points, facets)\n\
    +    FS   - total area and volume\n\
    +    Fx   - extreme points (convex hull vertices)\n\
         G    - Geomview output (2-d, 3-d, and 4-d)\n\
         m    - Mathematica output (2-d and 3-d)\n\
    +    o    - OFF format (dim, n, points, facets)\n\
         QVn  - print facets that include point n, -n if not\n\
    -    TO file- output results to file, may be enclosed in single quotes\n\
    +    TI file - input file, may be enclosed in single quotes\n\
    +    TO file - output file, may be enclosed in single quotes\n\
     \n\
     examples:\n\
         rbox c D2 | qconvex s n                    rbox c D2 | qconvex i\n\
         rbox c D2 | qconvex o                      rbox 1000 s | qconvex s Tv FA\n\
    -    rbox c d D2 | qconvex s Qc Fx              rbox y 1000 W0 | qconvex s n\n\
    +    rbox c d D2 | qconvex s Qc Fx              rbox y 1000 W0 | qconvex Qc s n\n\
         rbox y 1000 W0 | qconvex s QJ              rbox d G1 D12 | qconvex QR0 FA Pp\n\
         rbox c D7 | qconvex FA TF1000\n\
     \n\
    @@ -223,33 +234,35 @@
         concise prompt for qhull
     */
     char qh_prompt3[]= "\n\
    -Qhull %s.\n\
    +Qhull %s\n\
     Except for 'F.' and 'PG', upper-case options take an argument.\n\
     \n\
    - incidences     mathematica    normals        OFF_format     points\n\
    - summary        facet_dump\n\
    + facet-dump     Geomview       incidences     mathematica    normals\n\
    + off-format     points         summary\n\
     \n\
    - Farea          FArea_total    Fcoplanars     FCentrums      Fd_cdd_in\n\
    - FD_cdd_out     FFacet_xridge  Finner         FIDs           Fmerges\n\
    - Fneighbors     FNeigh_vertex  Fouter         FOptions       FPoint_near\n\
    - FQhull         Fsummary       FSize          Fvertices      FVertex_ave\n\
    - Fxtremes       FMaple\n\
    -\n\
    - Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
    - Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
    -\n\
    - PArea_keep     Pdrop d0:0D0   PFacet_area_keep Pgood        PGood_neighbors\n\
    - PMerge_keep    Poutput_forced Pprecision_not\n\
    -\n\
    - QbBound 0:0.5  QbB_scale_box  Qcoplanar      QGood_point    Qinterior\n\
    - QJoggle        Qrandom        QRotate        Qsearch_1st    Qtriangulate\n\
    - QVertex_good\n\
    -\n\
    - T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
    - TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
    - TWide_trace    TVertex_stop   TCone_stop\n\
    + Farea          FArea-total    Fcoplanars     FCentrums      Fd-cdd-in\n\
    + FD-cdd-out     FFacets-xridge Finner         FIDs           Fmerges\n\
    + FMaple         Fneighbors     FNeigh-vertex  Fouter         FOptions\n\
    + FPoint-near    FQhull         Fsummary       FSize          Ftriangles\n\
    + Fvertices      FVertex-ave    Fxtremes\n\
     \n\
    - Angle_max      Centrum_size   Random_dist    Ucoplanar_max  Wide_outside\n\
    + Gall-points    Gcentrums      GDrop-dim      Ghyperplanes   Ginner\n\
    + Gno-planes     Gouter         Gpoints        Gridges        Gvertices\n\
    +\n\
    + PArea-keep     Pdrop-d0:0D0   PFacet-area-keep  Pgood       PGood-neighbors\n\
    + PMerge-keep    Poutput-forced Pprecision-not\n\
    +\n\
    + Qallow-short   QbBound-0:0.5  QbB-scale-box  Qcoplanar      QGood-point\n\
    + Qinterior      QJoggle        QRotate        Qsearch-all    Qtriangulate\n\
    + QVertex-good   Qwarn-allow    Q12-allow-wide Q14-merge-pinched\n\
    +\n\
    + TFacet-log     TInput-file    TOutput-file   Tstatistics    Tverify\n\
    + Tz-stdout\n\
    +\n\
    + T4-trace       Tannotate      TAdd-stop      Tcheck-often   TCone-stop\n\
    + Tflush         TMerge-trace   TPoint-trace   TVertex-stop   TWide-trace\n\
    +\n\
    + Angle-max      Centrum-size   Random-dist    Ucoplanar-max  Wide-outside\n\
     ";
     
     /*- 1 && *argv[1] == '-' && (*(argv[1] + 1) == '?' || *(argv[1] + 1) == '-')) { /* -? or --help */
    +    fprintf(stdout, qh_prompt2, qh_version);
    +    exit(qh_ERRnone);
    +  }
       if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) {
         fprintf(stdout, qh_prompta, qh_version, qh_DEFAULTbox,
                     qh_promptb, qh_promptc, qh_promptd, qh_prompte);
    @@ -295,14 +312,10 @@
       qh_init_A(stdin, stdout, stderr, argc, argv);  /* sets qh qhull_command */
       exitcode= setjmp(qh errexit); /* simple statement for CRAY J916 */
       if (!exitcode) {
    -    qh NOerrexit = False;
    +    qh NOerrexit= False;
         qh_checkflags(qh qhull_command, hidden_options);
         qh_initflags(qh qhull_command);
         points= qh_readpoints(&numpoints, &dim, &ismalloc);
    -    if (dim >= 5) {
    -      qh_option("Qxact_merge", NULL, NULL);
    -      qh MERGEexact= True; /* 'Qx' always */
    -    }
         qh_init_B(points, numpoints, dim, ismalloc);
         qh_qhull();
         qh_check_output();
    @@ -318,7 +331,7 @@
       qh_freeqhull(!qh_ALL);
       qh_memfreeshort(&curlong, &totlong);
       if (curlong || totlong)
    -    qh_fprintf_stderr(6263, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
    +    qh_fprintf_stderr(7079, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
            totlong, curlong);
     #endif
       return exitcode;
    diff -Nru qhull-2015.2/src/qconvex/qconvex_r.c qhull-2020.2/src/qconvex/qconvex_r.c
    --- qhull-2015.2/src/qconvex/qconvex_r.c	2016-01-18 22:00:32.000000000 +0000
    +++ qhull-2020.2/src/qconvex/qconvex_r.c	2020-06-04 02:31:48.000000000 +0000
    @@ -1,12 +1,12 @@
    -/*
      -
      ---------------------------------
     
    -   qconvex.c
    +   qconvex_r.c
           compute convex hulls using qhull
     
    -   see unix.c for full interface
    +   see unix_r.c for full interface
     
    -   Copyright (c) 1993-2015, The Geometry Center
    +   Copyright (c) 1993-2020, The Geometry Center
     */
     
     #include "libqhull_r/libqhull_r.h"
    @@ -17,12 +17,12 @@
     #include 
     #include 
     
    -#if __cplusplus
    +#ifdef __cplusplus
     extern "C" {
       int isatty(int);
     }
     
    -#elif _MSC_VER
    +#elif defined(_MSC_VER)
     #include 
     #define isatty _isatty
     /* int _isatty(int); */
    @@ -32,24 +32,26 @@
                        if "Undefined symbol" this can be deleted along with call in main() */
     #endif
     
    -/*---------------------------------
     
       qh_prompt
         long prompt for qconvex
     
       notes:
    -    restricted version of libqhull.c
    +    restricted version of libqhull_r.c
     
    -  see:
    -    concise prompt below
    +  notes:
    +    same text as unix_r.c
    +    see concise prompt below
    +    limit maximum literal to 1800 characters
     */
     
     /* duplicated in qconvex.htm */
    -char hidden_options[]=" d v H Qbb Qf Qg Qm Qr Qu Qv Qx Qz TR E V Fp Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
    +char hidden_options[]=" d v H Qbb Qf Qg Qm Qr Qu Qv Qx Qz TR E V Fp Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q15 ";
     
     char qh_prompta[]= "\n\
    -qconvex- compute the convex hull\n\
    +qconvex -- compute the convex hull\n\
         http://www.qhull.org  %s\n\
     \n\
     input (stdin):\n\
    @@ -58,40 +60,51 @@
         comments:    start with a non-numeric character\n\
     \n\
     options:\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
         Qc   - keep coplanar points with nearest facet\n\
         Qi   - keep interior points with nearest facet\n\
    +    QJ   - joggled input instead of merged facets\n\
    +    Qt   - triangulated output\n\
     \n\
     Qhull control options:\n\
    +    Qa   - allow input with fewer or more points than coordinates\n\
         Qbk:n   - scale coord k so that low bound is n\n\
           QBk:n - scale coord k so that upper bound is n (QBk is %2.2g)\n\
         QbB  - scale input to unit cube centered at the origin\n\
         Qbk:0Bk:0 - remove k-th coordinate from input\n\
         QJn  - randomly joggle input in range [-n,n]\n\
         QRn  - random rotation (n=seed, n=0 time, n=-1 time/no rotate)\n\
    +    Qs   - search all points for the initial simplex\n\
    +\n\
     %s%s%s%s";  /* split up qh_prompt for Visual C++ */
     char qh_promptb[]= "\
    -    Qs   - search all points for the initial simplex\n\
    +Qhull extra options:\n\
         QGn  - good facet if visible from point n, -n for not visible\n\
         QVn  - good facet if it includes point n, -n if not\n\
    +    Qw   - allow option warnings\n\
    +    Q12  - allow wide facets and wide dupridge\n\
    +    Q14  - merge pinched vertices that create a dupridge\n\
    +\n\
    +T options:\n\
    +    TFn  - report summary when n or more facets created\n\
    +    TI file - input file, may be enclosed in single quotes\n\
    +    TO file - output file, may be enclosed in single quotes\n\
    +    Ts   - statistics\n\
    +    Tv   - verify result: structure, convexity, and in-circle test\n\
    +    Tz   - send all output to stdout\n\
     \n\
     ";
     char qh_promptc[]= "\
     Trace options:\n\
         T4   - trace at level n, 4=all, 5=mem/gauss, -1= events\n\
    +    Ta   - annotate output with message codes\n\
    +    TAn  - stop qhull after adding n vertices\n\
    +     TCn - stop qhull after building cone for point n\n\
    +     TVn - stop qhull after adding point n, -n for before\n\
         Tc   - check frequently during execution\n\
    -    Ts   - print statistics\n\
    -    Tv   - verify result: structure, convexity, and point inclusion\n\
    -    Tz   - send all output to stdout\n\
    -    TFn  - report summary when n or more facets created\n\
    -    TI file - input data from file, no spaces or single quotes\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    +    Tf   - flush each qh_fprintf for debugging segfaults\n\
         TPn  - turn on tracing when point n added to hull\n\
          TMn - turn on tracing at merge n\n\
          TWn - trace merge facets when width > n\n\
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)\n\
    -     TCn - stop qhull after building cone for point n (see TVn)\n\
     \n\
     Precision options:\n\
         Cn   - radius of centrum (roundoff added).  Merge facets if non-convex\n\
    @@ -107,7 +120,7 @@
         i    - vertices incident to each facet\n\
         m    - Mathematica output (2-d and 3-d)\n\
         n    - normals with offsets\n\
    -    o    - OFF file format (dim, points and facets; Voronoi regions)\n\
    +    o    - OFF file format (dim, points and facets)\n\
         p    - point coordinates \n\
         s    - summary (stderr)\n\
     \n\
    @@ -125,6 +138,7 @@
         Fi   - inner plane for each facet\n\
         FI   - ID for each facet\n\
         Fm   - merge count for each facet (511 max)\n\
    +    FM   - Maple output (2-d and 3-d)\n\
         Fn   - count plus neighboring facets for each facet\n\
         FN   - count plus neighboring facets for each point\n\
         Fo   - outer plane (or max_outside) for each facet\n\
    @@ -132,8 +146,7 @@
         FP   - nearest vertex for each coplanar point\n\
         FQ   - command used for qconvex\n\
         Fs   - summary: #int (8), dimension, #points, tot vertices, tot facets,\n\
    -                      for output: #vertices, #facets,\n\
    -                                  #coplanar points, #non-simplicial facets\n\
    +                      output: #vertices, #facets, #coplanars, #nonsimplicial\n\
                         #real (2), max outer plane, min vertex\n\
         FS   - sizes:   #int (0) \n\
                         #real (2) tot area, tot volume\n\
    @@ -148,20 +161,20 @@
         Ga   - all points as dots\n\
          Gp  -  coplanar points and vertices as radii\n\
          Gv  -  vertices as spheres\n\
    +    Gc   - centrums\n\
    +    GDn  - drop dimension n in 3-d and 4-d output\n\
    +    Gh   - hyperplane intersections\n\
         Gi   - inner planes only\n\
          Gn  -  no planes\n\
          Go  -  outer planes only\n\
    -    Gc   - centrums\n\
    -    Gh   - hyperplane intersections\n\
         Gr   - ridges\n\
    -    GDn  - drop dimension n in 3-d and 4-d output\n\
     \n\
     Print options:\n\
         PAn  - keep n largest facets by area\n\
         Pdk:n - drop facet if normal[k] <= n (default 0.0)\n\
         PDk:n - drop facet if normal[k] >= n\n\
    -    Pg   - print good facets (needs 'QGn' or 'QVn')\n\
         PFn  - keep facets whose area is at least n\n\
    +    Pg   - print good facets (needs 'QGn' or 'QVn')\n\
         PG   - print neighbors of good facets\n\
         PMn  - keep n facets with most merges\n\
         Po   - force output.  If error, output neighborhood of facet\n\
    @@ -169,18 +182,19 @@
     \n\
         .    - list of all options\n\
         -    - one line descriptions of all options\n\
    +    -?   - help with examples\n\
         -V   - version\n\
     ";
     /* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
     
    -/*---------------------------------
     
       qh_prompt2
         synopsis for qhull
     */
     char qh_prompt2[]= "\n\
    -qconvex- compute the convex hull.  Qhull %s\n\
    +qconvex -- compute the convex hull.  Qhull %s\n\
         input (stdin): dimension, number of points, point coordinates\n\
         comments start with a non-numeric character\n\
     \n\
    @@ -189,70 +203,74 @@
         QJ   - joggled input instead of merged facets\n\
         Tv   - verify result: structure, convexity, and point inclusion\n\
         .    - concise list of all options\n\
    -    -    - one-line description of all options\n\
    +    -    - one-line description of each option\n\
    +    -?   - this message\n\
         -V   - version\n\
     \n\
     output options (subset):\n\
         s    - summary of results (default)\n\
         i    - vertices incident to each facet\n\
         n    - normals with offsets\n\
    -    p    - vertex coordinates (includes coplanar points if 'Qc')\n\
    -    Fx   - extreme points (convex hull vertices)\n\
    +    p    - vertex coordinates (if 'Qc', includes coplanar points)\n\
         FA   - report total area and volume\n\
    -    FS   - compute total area and volume\n\
    -    o    - OFF format (dim, n, points, facets)\n\
    +    FS   - total area and volume\n\
    +    Fx   - extreme points (convex hull vertices)\n\
         G    - Geomview output (2-d, 3-d, and 4-d)\n\
         m    - Mathematica output (2-d and 3-d)\n\
    +    o    - OFF format (dim, n, points, facets)\n\
         QVn  - print facets that include point n, -n if not\n\
    -    TO file- output results to file, may be enclosed in single quotes\n\
    +    TI file - input file, may be enclosed in single quotes\n\
    +    TO file - output file, may be enclosed in single quotes\n\
     \n\
     examples:\n\
         rbox c D2 | qconvex s n                    rbox c D2 | qconvex i\n\
         rbox c D2 | qconvex o                      rbox 1000 s | qconvex s Tv FA\n\
    -    rbox c d D2 | qconvex s Qc Fx              rbox y 1000 W0 | qconvex s n\n\
    +    rbox c d D2 | qconvex s Qc Fx              rbox y 1000 W0 | qconvex Qc s n\n\
         rbox y 1000 W0 | qconvex s QJ              rbox d G1 D12 | qconvex QR0 FA Pp\n\
         rbox c D7 | qconvex FA TF1000\n\
     \n\
     ";
     /* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
     
    -/*---------------------------------
     
       qh_prompt3
         concise prompt for qhull
     */
     char qh_prompt3[]= "\n\
    -Qhull %s.\n\
    +Qhull %s\n\
     Except for 'F.' and 'PG', upper-case options take an argument.\n\
     \n\
    - incidences     mathematica    normals        OFF_format     points\n\
    - summary        facet_dump\n\
    + facet-dump     Geomview       incidences     mathematica    normals\n\
    + off-format     points         summary\n\
     \n\
    - Farea          FArea_total    Fcoplanars     FCentrums      Fd_cdd_in\n\
    - FD_cdd_out     FFacet_xridge  Finner         FIDs           Fmerges\n\
    - Fneighbors     FNeigh_vertex  Fouter         FOptions       FPoint_near\n\
    - FQhull         Fsummary       FSize          Fvertices      FVertex_ave\n\
    - Fxtremes       FMaple\n\
    -\n\
    - Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
    - Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
    -\n\
    - PArea_keep     Pdrop d0:0D0   PFacet_area_keep Pgood        PGood_neighbors\n\
    - PMerge_keep    Poutput_forced Pprecision_not\n\
    -\n\
    - QbBound 0:0.5  QbB_scale_box  Qcoplanar      QGood_point    Qinterior\n\
    - QJoggle        Qrandom        QRotate        Qsearch_1st    Qtriangulate\n\
    - QVertex_good\n\
    -\n\
    - T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
    - TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
    - TWide_trace    TVertex_stop   TCone_stop\n\
    + Farea          FArea-total    Fcoplanars     FCentrums      Fd-cdd-in\n\
    + FD-cdd-out     FFacets-xridge Finner         FIDs           Fmerges\n\
    + FMaple         Fneighbors     FNeigh-vertex  Fouter         FOptions\n\
    + FPoint-near    FQhull         Fsummary       FSize          Ftriangles\n\
    + Fvertices      FVertex-ave    Fxtremes\n\
     \n\
    - Angle_max      Centrum_size   Random_dist    Ucoplanar_max  Wide_outside\n\
    + Gall-points    Gcentrums      GDrop-dim      Ghyperplanes   Ginner\n\
    + Gno-planes     Gouter         Gpoints        Gridges        Gvertices\n\
    +\n\
    + PArea-keep     Pdrop-d0:0D0   PFacet-area-keep  Pgood       PGood-neighbors\n\
    + PMerge-keep    Poutput-forced Pprecision-not\n\
    +\n\
    + Qallow-short   QbBound-0:0.5  QbB-scale-box  Qcoplanar      QGood-point\n\
    + Qinterior      QJoggle        QRotate        Qsearch-all    Qtriangulate\n\
    + QVertex-good   Qwarn-allow    Q12-allow-wide Q14-merge-pinched\n\
    +\n\
    + TFacet-log     TInput-file    TOutput-file   Tstatistics    Tverify\n\
    + Tz-stdout\n\
    +\n\
    + T4-trace       Tannotate      TAdd-stop      Tcheck-often   TCone-stop\n\
    + Tflush         TMerge-trace   TPoint-trace   TVertex-stop   TWide-trace\n\
    +\n\
    + Angle-max      Centrum-size   Random-dist    Ucoplanar-max  Wide-outside\n\
     ";
     
    -/*---------------------------------
     
       main( argc, argv )
    @@ -281,6 +299,10 @@
         fprintf(stdout, qh_prompt2, qh_version);
         exit(qh_ERRnone);
       }
    +  if (argc > 1 && *argv[1] == '-' && (*(argv[1] + 1) == '?' || *(argv[1] + 1) == '-')) { /* -? or --help */
    +    fprintf(stdout, qh_prompt2, qh_version);
    +    exit(qh_ERRnone);
    +  }
       if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) {
         fprintf(stdout, qh_prompta, qh_version, qh_DEFAULTbox,
                     qh_promptb, qh_promptc, qh_promptd, qh_prompte);
    @@ -301,10 +323,6 @@
         qh_checkflags(qh, qh->qhull_command, hidden_options);
         qh_initflags(qh, qh->qhull_command);
         points= qh_readpoints(qh, &numpoints, &dim, &ismalloc);
    -    if (dim >= 5) {
    -      qh_option(qh, "Qxact_merge", NULL, NULL);
    -      qh->MERGEexact= True; /* 'Qx' always */
    -    }
         qh_init_B(qh, points, numpoints, dim, ismalloc);
         qh_qhull(qh);
         qh_check_output(qh);
    @@ -320,7 +338,7 @@
       qh_freeqhull(qh, !qh_ALL);
       qh_memfreeshort(qh, &curlong, &totlong);
       if (curlong || totlong)
    -    qh_fprintf_stderr(6263, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
    +    qh_fprintf_stderr(7079, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
            totlong, curlong);
     #endif
       return exitcode;
    diff -Nru qhull-2015.2/src/qdelaunay/qdelaun.c qhull-2020.2/src/qdelaunay/qdelaun.c
    --- qhull-2015.2/src/qdelaunay/qdelaun.c	2016-01-18 22:01:10.000000000 +0000
    +++ qhull-2020.2/src/qdelaunay/qdelaun.c	2020-07-25 02:25:08.000000000 +0000
    @@ -7,7 +7,7 @@
     
        see unix.c for full interface
     
    -   Copyright (c) 1993-2015, The Geometry Center
    +   Copyright (c) 1993-2020, The Geometry Center
     */
     
     #include "libqhull/libqhull.h"
    @@ -18,12 +18,7 @@
     #include 
     #include 
     
    -#if __cplusplus
    -extern "C" {
    -  int isatty(int);
    -}
    -
    -#elif _MSC_VER
    +#if defined(_MSC_VER)
     #include 
     #define isatty _isatty
     /* int _isatty(int); */
    @@ -42,15 +37,17 @@
       notes:
         restricted version of libqhull.c
     
    -  see:
    -    concise prompt below
    +  notes:
    +    same text as unix.c
    +    see concise prompt below
    +    limit maximum literal to 1800 characters
     */
     
     /* duplicated in qdelau_f.htm and qdelaun.htm */
    -char hidden_options[]=" d n v H U Qb QB Qc Qf Qg Qi Qm Qr QR Qv Qx TR E V FC Fi Fo Ft Fp FV Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
    +char hidden_options[]=" d n v H U Qb QB Qc Qf Qg Qi Qm Qr Qv Qx TR E V FC Fi Fo Ft Fp FV Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q15 ";
     
     char qh_prompta[]= "\n\
    -qdelaunay- compute the Delaunay triangulation\n\
    +qdelaunay -- compute the Delaunay triangulation\n\
         http://www.qhull.org  %s\n\
     \n\
     input (stdin):\n\
    @@ -59,35 +56,47 @@
         comments:    start with a non-numeric character\n\
     \n\
     options:\n\
    -    Qu   - compute furthest-site Delaunay triangulation\n\
    -    Qt   - triangulated output\n\
         QJ   - joggled input instead of merged facets\n\
    +    Qt   - triangulated output\n\
    +    Qu   - compute furthest-site Delaunay triangulation\n\
     \n\
     Qhull control options:\n\
    +    Qa   - allow input with fewer or more points than coordinates\n\
         QJn  - randomly joggle input in range [-n,n]\n\
    -%s%s%s%s";  /* split up qh_prompt for Visual C++ */
    -char qh_promptb[]= "\
    +    QRn  - random rotation (n=seed, n=0 time, n=-1 time/no rotate)\n\
         Qs   - search all points for the initial simplex\n\
         Qz   - add point-at-infinity to Delaunay triangulation\n\
    +\n\
    +%s%s%s%s";  /* split up qh_prompt for Visual C++ */
    +char qh_promptb[]= "\
    +Qhull extra options:\n\
         QGn  - print Delaunay region if visible from point n, -n if not\n\
         QVn  - print Delaunay regions that include point n, -n if not\n\
    +    Qw   - allow option warnings\n\
    +    Q12  - allow wide facets and wide dupridge\n\
    +    Q14  - merge pinched vertices that create a dupridge\n\
    +\n\
    +T options:\n\
    +    TFn  - report summary when n or more facets created\n\
    +    TI file - input file, may be enclosed in single quotes\n\
    +    TO file - output file, may be enclosed in single quotes\n\
    +    Ts   - statistics\n\
    +    Tv   - verify result: structure, convexity, and in-circle test\n\
    +    Tz   - send all output to stdout\n\
     \n\
     ";
     char qh_promptc[]= "\
     Trace options:\n\
         T4   - trace at level n, 4=all, 5=mem/gauss, -1= events\n\
    +    Ta   - annotate output with message codes\n\
    +    TAn  - stop qhull after adding n vertices\n\
    +     TCn - stop qhull after building cone for point n\n\
    +     TVn - stop qhull after adding point n, -n for before\n\
         Tc   - check frequently during execution\n\
    -    Ts   - print statistics\n\
    -    Tv   - verify result: structure, convexity, and in-circle test\n\
    -    Tz   - send all output to stdout\n\
    -    TFn  - report summary when n or more facets created\n\
    -    TI file - input data from file, no spaces or single quotes\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    +    Tf   - flush each qh_fprintf for debugging segfaults\n\
         TPn  - turn on tracing when point n added to hull\n\
          TMn - turn on tracing at merge n\n\
          TWn - trace merge facets when width > n\n\
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)\n\
    -     TCn - stop qhull after building cone for point n (see TVn)\n\
     \n\
     Precision options:\n\
         Cn   - radius of centrum (roundoff added).  Merge facets if non-convex\n\
    @@ -123,7 +132,7 @@
         FP   - nearest point and distance for each coincident point\n\
         FQ   - command used for qdelaunay\n\
         Fs   - summary: #int (8), dimension, #points, tot vertices, tot facets,\n\
    -                    for output: #vertices, #Delaunay regions,\n\
    +                    output: #vertices, #Delaunay regions,\n\
                                     #coincident points, #non-simplicial regions\n\
                         #real (2), max outer plane, min vertex\n\
         FS   - sizes:   #int (0)\n\
    @@ -133,25 +142,25 @@
     \n\
     ";
     char qh_prompte[]= "\
    -Geomview options (2-d and 3-d)\n\
    +Geomview output (2-d and 3-d points lifted to a paraboloid)\n\
         Ga   - all points as dots\n\
          Gp  -  coplanar points and vertices as radii\n\
          Gv  -  vertices as spheres\n\
    +    Gc   - centrums\n\
    +    GDn  - drop dimension n in 3-d and 4-d output\n\
    +    Gh   - hyperplane intersections\n\
         Gi   - inner planes only\n\
          Gn  -  no planes\n\
          Go  -  outer planes only\n\
    -    Gc     - centrums\n\
    -    Gh   - hyperplane intersections\n\
         Gr   - ridges\n\
    -    GDn  - drop dimension n in 3-d and 4-d output\n\
         Gt   - transparent outer ridges to view 3-d Delaunay\n\
     \n\
     Print options:\n\
         PAn  - keep n largest Delaunay regions by area\n\
         Pdk:n - drop facet if normal[k] <= n (default 0.0)\n\
         PDk:n - drop facet if normal[k] >= n\n\
    -    Pg   - print good Delaunay regions (needs 'QGn' or 'QVn')\n\
         PFn  - keep Delaunay regions whose area is at least n\n\
    +    Pg   - print good Delaunay regions (needs 'QGn' or 'QVn')\n\
         PG   - print neighbors of good regions (needs 'QGn' or 'QVn')\n\
         PMn  - keep n Delaunay regions with most merges\n\
         Po   - force output.  If error, output neighborhood of facet\n\
    @@ -159,6 +168,7 @@
     \n\
         .    - list of all options\n\
         -    - one line descriptions of all options\n\
    +    -?   - help with examples\n\
         -V   - version\n\
     ";
     /* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    @@ -170,7 +180,7 @@
         synopsis for qhull
     */
     char qh_prompt2[]= "\n\
    -qdelaunay- compute the Delaunay triangulation.  Qhull %s\n\
    +qdelaunay -- compute the Delaunay triangulation.  Qhull %s\n\
         input (stdin): dimension, number of points, point coordinates\n\
         comments start with a non-numeric character\n\
     \n\
    @@ -180,18 +190,20 @@
         QJ   - joggled input instead of merged facets\n\
         Tv   - verify result: structure, convexity, and in-circle test\n\
         .    - concise list of all options\n\
    -    -    - one-line description of all options\n\
    +    -    - one-line description of each option\n\
    +    -?   - this message\n\
         -V   - version\n\
     \n\
     output options (subset):\n\
         s    - summary of results (default)\n\
         i    - vertices incident to each Delaunay region\n\
         Fx   - extreme points (vertices of the convex hull)\n\
    -    o    - OFF format (shows the points lifted to a paraboloid)\n\
         G    - Geomview output (2-d and 3-d points lifted to a paraboloid)\n\
         m    - Mathematica output (2-d inputs lifted to a paraboloid)\n\
    +    o    - OFF format (shows the points lifted to a paraboloid)\n\
         QVn  - print Delaunay regions that include point n, -n if not\n\
    -    TO file- output results to file, may be enclosed in single quotes\n\
    +    TI file - input file, may be enclosed in single quotes\n\
    +    TO file - output file, may be enclosed in single quotes\n\
     \n\
     examples:\n\
         rbox c P0 D2 | qdelaunay s o          rbox c P0 D2 | qdelaunay i\n\
    @@ -209,32 +221,35 @@
         concise prompt for qhull
     */
     char qh_prompt3[]= "\n\
    -Qhull %s.\n\
    +Qhull %s\n\
     Except for 'F.' and 'PG', upper-case options take an argument.\n\
     \n\
    - incidences     mathematica    OFF_format     points_lifted  summary\n\
    - facet_dump\n\
    + facet-dump     Geomview       incidences     mathematica    off-format\n\
    + points-lifted  summary\n\
    +\n\
    + Farea          FArea-total    Fcoincident    Fd-cdd-in      FD-cdd-out\n\
    + FF-dump-xridge FIDs           Fmerges        FMaple         Fneighbors\n\
    + FNeigh-vertex  FOptions       FPoint-near    FQdelaun       Fsummary\n\
    + FSize          Fvertices      Fxtremes\n\
     \n\
    - Farea          FArea_total    Fcoincident    Fd_cdd_in      FD_cdd_out\n\
    - FF_dump_xridge FIDs           Fmerges        Fneighbors     FNeigh_vertex\n\
    - FOptions       FPoint_near    FQdelaun       Fsummary       FSize\n\
    - Fvertices      Fxtremes       FMaple\n\
    + Gall-points    Gcentrums      GDrop-dim      Ghyperplanes   Ginner\n\
    + Gno-planes     Gouter         Gpoints        Gridges        Gtransparent\n\
    + Gvertices\n\
     \n\
    - Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
    - Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
    - Gtransparent\n\
    + PArea-keep     Pdrop-d0:0D0   PFacet-area-keep  Pgood       PGood-neighbors\n\
    + PMerge-keep    Poutput-forced Pprecision-not\n\
     \n\
    - PArea_keep     Pdrop d0:0D0   Pgood          PFacet_area_keep\n\
    - PGood_neighbors PMerge_keep   Poutput_forced Pprecision_not\n\
    + Qallow-short   QGood-point    QJoggle        Qrotate        Qsearch-all\n\
    + Qtriangulate   QupperDelaunay QVertex-good   Qwarn-allow    Qzinfinite\n\
    + Q12-allow-wide Q14-merge-pinched\n\
     \n\
    - QGood_point    QJoggle        Qsearch_1st    Qtriangulate   QupperDelaunay\n\
    - QVertex_good   Qzinfinite\n\
    + TFacet-log     TInput-file    TOutput-file   Tstatistics    Tverify\n\
    + Tz-stdout\n\
     \n\
    - T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
    - TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
    - TWide_trace    TVertex_stop   TCone_stop\n\
    + T4-trace       Tannotate      TAdd-stop      Tcheck-often   TCone-stop\n\
    + Tflush         TMerge-trace   TPoint-trace   TVertex-stop   TWide-trace\n\
     \n\
    - Angle_max      Centrum_size   Random_dist    Wide_outside\n\
    + Angle-max      Centrum-size   Random-dist    Wide-outside\n\
     ";
     
     /*- 1 && *argv[1] == '-' && (*(argv[1] + 1) == '?' || *(argv[1] + 1) == '-')) { /* -? or --help */
    +    fprintf(stdout, qh_prompt2, qh_version);
    +    exit(qh_ERRnone);
    +  }
       if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) {
         fprintf(stdout, qh_prompta, qh_version,
                     qh_promptb, qh_promptc, qh_promptd, qh_prompte);
    @@ -280,7 +299,7 @@
       qh_init_A(stdin, stdout, stderr, argc, argv);  /* sets qh qhull_command */
       exitcode= setjmp(qh errexit); /* simple statement for CRAY J916 */
       if (!exitcode) {
    -    qh NOerrexit = False;
    +    qh NOerrexit= False;
         qh_option("delaunay  Qbbound-last", NULL, NULL);
         qh DELAUNAY= True;     /* 'd'   */
         qh SCALElast= True;    /* 'Qbb' */
    @@ -288,10 +307,6 @@
         qh_checkflags(qh qhull_command, hidden_options);
         qh_initflags(qh qhull_command);
         points= qh_readpoints(&numpoints, &dim, &ismalloc);
    -    if (dim >= 5) {
    -      qh_option("Qxact_merge", NULL, NULL);
    -      qh MERGEexact= True; /* 'Qx' always */
    -    }
         qh_init_B(points, numpoints, dim, ismalloc);
         qh_qhull();
         qh_check_output();
    @@ -307,7 +322,7 @@
       qh_freeqhull(!qh_ALL);
       qh_memfreeshort(&curlong, &totlong);
       if (curlong || totlong)
    -    qh_fprintf_stderr(6263, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
    +    qh_fprintf_stderr(7079, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
            totlong, curlong);
     #endif
       return exitcode;
    diff -Nru qhull-2015.2/src/qdelaunay/qdelaun_r.c qhull-2020.2/src/qdelaunay/qdelaun_r.c
    --- qhull-2015.2/src/qdelaunay/qdelaun_r.c	2016-01-18 22:01:22.000000000 +0000
    +++ qhull-2020.2/src/qdelaunay/qdelaun_r.c	2020-05-22 02:23:02.000000000 +0000
    @@ -1,13 +1,13 @@
    -/*
      -
      ---------------------------------
     
    -   qdelaun.c
    +   qdelaun_r.c
          compute Delaunay triangulations and furthest-point Delaunay
          triangulations using qhull
     
    -   see unix.c for full interface
    +   see unix_r.c for full interface
     
    -   Copyright (c) 1993-2015, The Geometry Center
    +   Copyright (c) 1993-2020, The Geometry Center
     */
     
     #include "libqhull_r/libqhull_r.h"
    @@ -18,12 +18,12 @@
     #include 
     #include 
     
    -#if __cplusplus
    +#ifdef __cplusplus
     extern "C" {
       int isatty(int);
     }
     
    -#elif _MSC_VER
    +#elif defined(_MSC_VER)
     #include 
     #define isatty _isatty
     /* int _isatty(int); */
    @@ -33,24 +33,26 @@
                        if "Undefined symbol" this can be deleted along with call in main() */
     #endif
     
    -/*---------------------------------
     
       qh_prompt
         long prompt for qhull
     
       notes:
    -    restricted version of libqhull.c
    +    restricted version of libqhull_r.c
     
    -  see:
    -    concise prompt below
    +  notes:
    +    same text as unix_r.c
    +    see concise prompt below
    +    limit maximum literal to 1800 characters
     */
     
     /* duplicated in qdelau_f.htm and qdelaun.htm */
    -char hidden_options[]=" d n v H U Qb QB Qc Qf Qg Qi Qm Qr QR Qv Qx TR E V FC Fi Fo Ft Fp FV Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
    +char hidden_options[]=" d n v H U Qb QB Qc Qf Qg Qi Qm Qr Qv Qx TR E V FC Fi Fo Ft Fp FV Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q15 ";
     
     char qh_prompta[]= "\n\
    -qdelaunay- compute the Delaunay triangulation\n\
    +qdelaunay -- compute the Delaunay triangulation\n\
         http://www.qhull.org  %s\n\
     \n\
     input (stdin):\n\
    @@ -59,35 +61,47 @@
         comments:    start with a non-numeric character\n\
     \n\
     options:\n\
    -    Qu   - compute furthest-site Delaunay triangulation\n\
    -    Qt   - triangulated output\n\
         QJ   - joggled input instead of merged facets\n\
    +    Qt   - triangulated output\n\
    +    Qu   - compute furthest-site Delaunay triangulation\n\
     \n\
     Qhull control options:\n\
    +    Qa   - allow input with fewer or more points than coordinates\n\
         QJn  - randomly joggle input in range [-n,n]\n\
    -%s%s%s%s";  /* split up qh_prompt for Visual C++ */
    -char qh_promptb[]= "\
    +    QRn  - random rotation (n=seed, n=0 time, n=-1 time/no rotate)\n\
         Qs   - search all points for the initial simplex\n\
         Qz   - add point-at-infinity to Delaunay triangulation\n\
    +\n\
    +%s%s%s%s";  /* split up qh_prompt for Visual C++ */
    +char qh_promptb[]= "\
    +Qhull extra options:\n\
         QGn  - print Delaunay region if visible from point n, -n if not\n\
         QVn  - print Delaunay regions that include point n, -n if not\n\
    +    Qw   - allow option warnings\n\
    +    Q12  - allow wide facets and wide dupridge\n\
    +    Q14  - merge pinched vertices that create a dupridge\n\
    +\n\
    +T options:\n\
    +    TFn  - report summary when n or more facets created\n\
    +    TI file - input file, may be enclosed in single quotes\n\
    +    TO file - output file, may be enclosed in single quotes\n\
    +    Ts   - statistics\n\
    +    Tv   - verify result: structure, convexity, and in-circle test\n\
    +    Tz   - send all output to stdout\n\
     \n\
     ";
     char qh_promptc[]= "\
     Trace options:\n\
         T4   - trace at level n, 4=all, 5=mem/gauss, -1= events\n\
    +    Ta   - annotate output with message codes\n\
    +    TAn  - stop qhull after adding n vertices\n\
    +     TCn - stop qhull after building cone for point n\n\
    +     TVn - stop qhull after adding point n, -n for before\n\
         Tc   - check frequently during execution\n\
    -    Ts   - print statistics\n\
    -    Tv   - verify result: structure, convexity, and in-circle test\n\
    -    Tz   - send all output to stdout\n\
    -    TFn  - report summary when n or more facets created\n\
    -    TI file - input data from file, no spaces or single quotes\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    +    Tf   - flush each qh_fprintf for debugging segfaults\n\
         TPn  - turn on tracing when point n added to hull\n\
          TMn - turn on tracing at merge n\n\
          TWn - trace merge facets when width > n\n\
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)\n\
    -     TCn - stop qhull after building cone for point n (see TVn)\n\
     \n\
     Precision options:\n\
         Cn   - radius of centrum (roundoff added).  Merge facets if non-convex\n\
    @@ -123,7 +137,7 @@
         FP   - nearest point and distance for each coincident point\n\
         FQ   - command used for qdelaunay\n\
         Fs   - summary: #int (8), dimension, #points, tot vertices, tot facets,\n\
    -                    for output: #vertices, #Delaunay regions,\n\
    +                    output: #vertices, #Delaunay regions,\n\
                                     #coincident points, #non-simplicial regions\n\
                         #real (2), max outer plane, min vertex\n\
         FS   - sizes:   #int (0)\n\
    @@ -133,25 +147,25 @@
     \n\
     ";
     char qh_prompte[]= "\
    -Geomview options (2-d and 3-d)\n\
    +Geomview output (2-d and 3-d points lifted to a paraboloid)\n\
         Ga   - all points as dots\n\
          Gp  -  coplanar points and vertices as radii\n\
          Gv  -  vertices as spheres\n\
    +    Gc   - centrums\n\
    +    GDn  - drop dimension n in 3-d and 4-d output\n\
    +    Gh   - hyperplane intersections\n\
         Gi   - inner planes only\n\
          Gn  -  no planes\n\
          Go  -  outer planes only\n\
    -    Gc     - centrums\n\
    -    Gh   - hyperplane intersections\n\
         Gr   - ridges\n\
    -    GDn  - drop dimension n in 3-d and 4-d output\n\
         Gt   - transparent outer ridges to view 3-d Delaunay\n\
     \n\
     Print options:\n\
         PAn  - keep n largest Delaunay regions by area\n\
         Pdk:n - drop facet if normal[k] <= n (default 0.0)\n\
         PDk:n - drop facet if normal[k] >= n\n\
    -    Pg   - print good Delaunay regions (needs 'QGn' or 'QVn')\n\
         PFn  - keep Delaunay regions whose area is at least n\n\
    +    Pg   - print good Delaunay regions (needs 'QGn' or 'QVn')\n\
         PG   - print neighbors of good regions (needs 'QGn' or 'QVn')\n\
         PMn  - keep n Delaunay regions with most merges\n\
         Po   - force output.  If error, output neighborhood of facet\n\
    @@ -159,18 +173,19 @@
     \n\
         .    - list of all options\n\
         -    - one line descriptions of all options\n\
    +    -?   - help with examples\n\
         -V   - version\n\
     ";
     /* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
     
    -/*---------------------------------
     
       qh_prompt2
         synopsis for qhull
     */
     char qh_prompt2[]= "\n\
    -qdelaunay- compute the Delaunay triangulation.  Qhull %s\n\
    +qdelaunay -- compute the Delaunay triangulation.  Qhull %s\n\
         input (stdin): dimension, number of points, point coordinates\n\
         comments start with a non-numeric character\n\
     \n\
    @@ -180,18 +195,20 @@
         QJ   - joggled input instead of merged facets\n\
         Tv   - verify result: structure, convexity, and in-circle test\n\
         .    - concise list of all options\n\
    -    -    - one-line description of all options\n\
    +    -    - one-line description of each option\n\
    +    -?   - this message\n\
         -V   - version\n\
     \n\
     output options (subset):\n\
         s    - summary of results (default)\n\
         i    - vertices incident to each Delaunay region\n\
         Fx   - extreme points (vertices of the convex hull)\n\
    -    o    - OFF format (shows the points lifted to a paraboloid)\n\
         G    - Geomview output (2-d and 3-d points lifted to a paraboloid)\n\
         m    - Mathematica output (2-d inputs lifted to a paraboloid)\n\
    +    o    - OFF format (shows the points lifted to a paraboloid)\n\
         QVn  - print Delaunay regions that include point n, -n if not\n\
    -    TO file- output results to file, may be enclosed in single quotes\n\
    +    TI file - input file, may be enclosed in single quotes\n\
    +    TO file - output file, may be enclosed in single quotes\n\
     \n\
     examples:\n\
         rbox c P0 D2 | qdelaunay s o          rbox c P0 D2 | qdelaunay i\n\
    @@ -202,42 +219,45 @@
     ";
     /* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
     
    -/*---------------------------------
     
       qh_prompt3
         concise prompt for qhull
     */
     char qh_prompt3[]= "\n\
    -Qhull %s.\n\
    +Qhull %s\n\
     Except for 'F.' and 'PG', upper-case options take an argument.\n\
     \n\
    - incidences     mathematica    OFF_format     points_lifted  summary\n\
    - facet_dump\n\
    + facet-dump     Geomview       incidences     mathematica    off-format\n\
    + points-lifted  summary\n\
    +\n\
    + Farea          FArea-total    Fcoincident    Fd-cdd-in      FD-cdd-out\n\
    + FF-dump-xridge FIDs           Fmerges        FMaple         Fneighbors\n\
    + FNeigh-vertex  FOptions       FPoint-near    FQdelaun       Fsummary\n\
    + FSize          Fvertices      Fxtremes\n\
     \n\
    - Farea          FArea_total    Fcoincident    Fd_cdd_in      FD_cdd_out\n\
    - FF_dump_xridge FIDs           Fmerges        Fneighbors     FNeigh_vertex\n\
    - FOptions       FPoint_near    FQdelaun       Fsummary       FSize\n\
    - Fvertices      Fxtremes       FMaple\n\
    + Gall-points    Gcentrums      GDrop-dim      Ghyperplanes   Ginner\n\
    + Gno-planes     Gouter         Gpoints        Gridges        Gtransparent\n\
    + Gvertices\n\
     \n\
    - Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
    - Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
    - Gtransparent\n\
    + PArea-keep     Pdrop-d0:0D0   PFacet-area-keep  Pgood       PGood-neighbors\n\
    + PMerge-keep    Poutput-forced Pprecision-not\n\
     \n\
    - PArea_keep     Pdrop d0:0D0   Pgood          PFacet_area_keep\n\
    - PGood_neighbors PMerge_keep   Poutput_forced Pprecision_not\n\
    + Qallow-short   QGood-point    QJoggle        Qrotate        Qsearch-all\n\
    + Qtriangulate   QupperDelaunay QVertex-good   Qwarn-allow    Qzinfinite\n\
    + Q12-allow-wide Q14-merge-pinched\n\
     \n\
    - QGood_point    QJoggle        Qsearch_1st    Qtriangulate   QupperDelaunay\n\
    - QVertex_good   Qzinfinite\n\
    + TFacet-log     TInput-file    TOutput-file   Tstatistics    Tverify\n\
    + Tz-stdout\n\
     \n\
    - T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
    - TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
    - TWide_trace    TVertex_stop   TCone_stop\n\
    + T4-trace       Tannotate      TAdd-stop      Tcheck-often   TCone-stop\n\
    + Tflush         TMerge-trace   TPoint-trace   TVertex-stop   TWide-trace\n\
     \n\
    - Angle_max      Centrum_size   Random_dist    Wide_outside\n\
    + Angle-max      Centrum-size   Random-dist    Wide-outside\n\
     ";
     
    -/*---------------------------------
     
       main( argc, argv )
    @@ -266,6 +286,10 @@
         fprintf(stdout, qh_prompt2, qh_version);
         exit(qh_ERRnone);
       }
    +  if (argc > 1 && *argv[1] == '-' && (*(argv[1] + 1) == '?' || *(argv[1] + 1) == '-')) { /* -? or --help */
    +    fprintf(stdout, qh_prompt2, qh_version);
    +    exit(qh_ERRnone);
    +  }
       if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) {
         fprintf(stdout, qh_prompta, qh_version,
                     qh_promptb, qh_promptc, qh_promptd, qh_prompte);
    @@ -290,10 +314,6 @@
         qh_checkflags(qh, qh->qhull_command, hidden_options);
         qh_initflags(qh, qh->qhull_command);
         points= qh_readpoints(qh, &numpoints, &dim, &ismalloc);
    -    if (dim >= 5) {
    -      qh_option(qh, "Qxact_merge", NULL, NULL);
    -      qh->MERGEexact= True; /* 'Qx' always */
    -    }
         qh_init_B(qh, points, numpoints, dim, ismalloc);
         qh_qhull(qh);
         qh_check_output(qh);
    @@ -309,7 +329,7 @@
       qh_freeqhull(qh, !qh_ALL);
       qh_memfreeshort(qh, &curlong, &totlong);
       if (curlong || totlong)
    -    qh_fprintf_stderr(6263, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
    +    qh_fprintf_stderr(7079, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
            totlong, curlong);
     #endif
       return exitcode;
    diff -Nru qhull-2015.2/src/qhalf/qhalf.c qhull-2020.2/src/qhalf/qhalf.c
    --- qhull-2015.2/src/qhalf/qhalf.c	2016-01-18 22:02:07.000000000 +0000
    +++ qhull-2020.2/src/qhalf/qhalf.c	2020-05-29 20:49:44.000000000 +0000
    @@ -6,7 +6,7 @@
     
        see unix.c for full interface
     
    -   Copyright (c) 1993-2015, The Geometry Center
    +   Copyright (c) 1993-2020, The Geometry Center
     */
     
     #include "libqhull/libqhull.h"
    @@ -17,12 +17,7 @@
     #include 
     #include 
     
    -#if __cplusplus
    -extern "C" {
    -  int isatty(int);
    -}
    -
    -#elif _MSC_VER
    +#if defined(_MSC_VER)
     #include 
     #define isatty _isatty
     /* int _isatty(int); */
    @@ -40,16 +35,16 @@
     
       notes:
         restricted version of libqhull.c
    -
    -  see:
    -    concise prompt below
    +    same text as unix.c
    +    see concise prompt below
    +    limit maximum literal to 1800 characters
     */
     
     /* duplicated in qhalf.htm */
    -char hidden_options[]=" d n v Qbb QbB Qf Qg Qm Qr QR Qv Qx Qz TR E V Fa FA FC FD FS Ft FV Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
    +char hidden_options[]=" d n v Qbb QbB Qf Qg Qm Qr Qv Qx Qz TR E V Fa FA FC FD FS Ft FV Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q15 ";
     
     char qh_prompta[]= "\n\
    -qhalf- compute the intersection of halfspaces about a point\n\
    +qhalf -- compute the intersection of halfspaces about a point\n\
         http://www.qhull.org  %s\n\
     \n\
     input (stdin):\n\
    @@ -60,36 +55,48 @@
     \n\
     options:\n\
         Hn,n - specify coordinates of interior point\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
         Qc   - keep coplanar halfspaces\n\
         Qi   - keep other redundant halfspaces\n\
    +    QJ   - joggled input instead of merged facets\n\
    +    Qt   - triangulated output\n\
     \n\
     Qhull control options:\n\
    +    Qa   - allow input with fewer or more points than coordinates\n\
    +    Qbk:0Bk:0 - remove k-th coordinate from input\n\
         QJn  - randomly joggle input in range [-n,n]\n\
    +    QRn  - random rotation (n=seed, n=0 time, n=-1 time/no rotate)\n\
    +    Qs   - search all halfspaces for the initial simplex\n\
    +\n\
     %s%s%s%s";  /* split up qh_prompt for Visual C++ */
     char qh_promptb[]= "\
    -    Qbk:0Bk:0 - remove k-th coordinate from input\n\
    -    Qs   - search all halfspaces for the initial simplex\n\
    +Qhull extra options:\n\
         QGn  - print intersection if visible to halfspace n, -n for not\n\
         QVn  - print intersections for halfspace n, -n if not\n\
    +    Qw   - allow option warnings\n\
    +    Q12  - allow wide facets and wide dupridge\n\
    +    Q14  - merge pinched vertices that create a dupridge\n\
    +\n\
    +T options:\n\
    +    TFn  - report summary when n or more facets created\n\
    +    TI file - input file, may be enclosed in single quotes\n\
    +    TO file - output file, may be enclosed in single quotes\n\
    +    Ts   - statistics\n\
    +    Tv   - verify result: structure, convexity, and in-circle test\n\
    +    Tz   - send all output to stdout\n\
     \n\
     ";
     char qh_promptc[]= "\
     Trace options:\n\
         T4   - trace at level n, 4=all, 5=mem/gauss, -1= events\n\
    +    Ta   - annotate output with message codes\n\
    +    TAn  - stop qhull after adding n vertices\n\
    +     TCn - stop qhull after building cone for point n\n\
    +     TVn - stop qhull after adding point n, -n for before\n\
         Tc   - check frequently during execution\n\
    -    Ts   - print statistics\n\
    -    Tv   - verify result: structure, convexity, and redundancy\n\
    -    Tz   - send all output to stdout\n\
    -    TFn  - report summary when n or more facets created\n\
    -    TI file - input data from file, no spaces or single quotes\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    -    TPn  - turn on tracing when halfspace n added to intersection\n\
    +    Tf   - flush each qh_fprintf for debugging segfaults\n\
    +    TPn - turn on tracing when point n added to hull\n\
         TMn  - turn on tracing at merge n\n\
         TWn  - trace merge facets when width > n\n\
    -    TVn  - stop qhull after adding halfspace n, -n for before (see TCn)\n\
    -    TCn  - stop qhull after building cone for halfspace n (see TVn)\n\
     \n\
     Precision options:\n\
         Cn   - radius of centrum (roundoff added).  Merge facets if non-convex\n\
    @@ -117,15 +124,15 @@
         FF   - facet dump without ridges\n\
         FI   - ID of each intersection\n\
         Fm   - merge count for each intersection (511 max)\n\
    -    FM   - Maple output (dual convex hull)\n\
    +    FM   - Maple output (dual 2-d or 3-d convex hull)\n\
         Fn   - count plus neighboring intersections for each intersection\n\
    -    FN   - count plus intersections for each non-redundant halfspace\n\
    +    FN   - count plus intersections for each halfspace\n\
         FO   - options and precision constants\n\
         Fp   - dim, count, and intersection coordinates\n\
         FP   - nearest halfspace and distance for each redundant halfspace\n\
         FQ   - command used for qhalf\n\
         Fs   - summary: #int (8), dim, #halfspaces, #non-redundant, #intersections\n\
    -                      for output: #non-redundant, #intersections, #coplanar\n\
    +                      output: #non-redundant, #intersections, #coplanar\n\
                                       halfspaces, #non-simplicial intersections\n\
                         #real (2), max outer plane, min vertex\n\
         Fv   - count plus non-redundant halfspaces for each intersection\n\
    @@ -137,20 +144,20 @@
         Ga   - all points (i.e., transformed halfspaces) as dots\n\
          Gp  -  coplanar points and vertices as radii\n\
          Gv  -  vertices (i.e., non-redundant halfspaces) as spheres\n\
    +    Gc   - centrums\n\
    +    GDn  - drop dimension n in 3-d and 4-d output\n\
    +    Gh   - hyperplane intersections\n\
         Gi   - inner planes (i.e., halfspace intersections) only\n\
          Gn  -  no planes\n\
          Go  -  outer planes only\n\
    -    Gc   - centrums\n\
    -    Gh   - hyperplane intersections\n\
         Gr   - ridges\n\
    -    GDn  - drop dimension n in 3-d and 4-d output\n\
     \n\
     Print options:\n\
         PAn  - keep n largest facets (i.e., intersections) by area\n\
         Pdk:n- drop facet if normal[k] <= n (default 0.0)\n\
         PDk:n- drop facet if normal[k] >= n\n\
    -    Pg   - print good facets (needs 'QGn' or 'QVn')\n\
         PFn  - keep facets whose area is at least n\n\
    +    Pg   - print good facets (needs 'QGn' or 'QVn')\n\
         PG   - print neighbors of good facets\n\
         PMn  - keep n facets with most merges\n\
         Po   - force output.  If error, output neighborhood of facet\n\
    @@ -158,6 +165,7 @@
     \n\
         .    - list of all options\n\
         -    - one line descriptions of all options\n\
    +    -?   - help with examples\n\
         -V   - version\n\
     ";
     /* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    @@ -169,8 +177,9 @@
         synopsis for qhull
     */
     char qh_prompt2[]= "\n\
    -qhalf- halfspace intersection about a point.  Qhull %s\n\
    -    input (stdin): [dim, 1, interior point], dim+1, n, coefficients+offset\n\
    +qhalf -- halfspace intersection about a point.  Qhull %s\n\
    +    input (stdin): [dimension, 1, interior point]\n\
    +                       dimension+1, number of halfspaces, coefficients+offset\n\
         comments start with a non-numeric character\n\
     \n\
     options (qhalf.htm):\n\
    @@ -179,7 +188,8 @@
         QJ   - joggled input instead of merged facets\n\
         Tv   - verify result: structure, convexity, and redundancy\n\
         .    - concise list of all options\n\
    -    -    - one-line description of all options\n\
    +    -    - one-line description of each option\n\
    +    -?   - this message\n\
         -V   - version\n\
     \n\
     output options (subset):\n\
    @@ -187,11 +197,12 @@
         Fp   - intersection coordinates\n\
         Fv   - non-redundant halfspaces incident to each intersection\n\
         Fx   - non-redundant halfspaces\n\
    -    o    - OFF file format (dual convex hull)\n\
         G    - Geomview output (dual convex hull)\n\
         m    - Mathematica output (dual convex hull)\n\
    +    o    - OFF file format (dual convex hull)\n\
         QVn  - print intersections for halfspace n, -n if not\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    +    TI file - input file, may be enclosed in single quotes\n\
    +    TO file - output file, may be enclosed in single quotes\n\
     \n\
     examples:\n\
         rbox d | qconvex FQ n | qhalf s H0,0,0 Fp\n\
    @@ -208,30 +219,33 @@
         concise prompt for qhull
     */
     char qh_prompt3[]= "\n\
    -Qhull %s.\n\
    +Qhull %s\n\
     Except for 'F.' and 'PG', upper_case options take an argument.\n\
     \n\
    - incidences     Geomview       mathematica    OFF_format     point_dual\n\
    - summary        facet_dump\n\
    + facet-dump     Geomview       H0,0-interior incidences      mathematica\n\
    + off-format     point-dual     summary\n\
    +\n\
    + Fc-redundant   Fd-cdd-in      FF-dump-xridge FIDs           Fmerges\n\
    + FMaple         Fneighbors     FN-intersect   FOptions       Fp-coordinates\n\
    + FP-nearest     FQhalf         Fsummary       Fv-halfspace   Fx-non-redundant\n\
     \n\
    - Fc_redundant   Fd_cdd_in      FF_dump_xridge FIDs           Fmerges\n\
    - Fneighbors     FN_intersect   FOptions       Fp_coordinates FP_nearest\n\
    - FQhalf         Fsummary       Fv_halfspace   FMaple         Fx_non_redundant\n\
    + Gall-points    Gcentrums      GDrop-dim      Ghyperplanes   Ginner\n\
    + Gno-planes     Gouter         Gpoints        Gridges        Gvertices\n\
     \n\
    - Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
    - Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
    + PArea-keep     Pdrop-d0:0D0   PFacet-area-keep  Pgood       PGood-neighbors\n\
    + PMerge-keep    Poutput-forced Pprecision-not\n\
     \n\
    - PArea_keep     Pdrop d0:0D0   Pgood          PFacet_area_keep\n\
    - PGood_neighbors PMerge_keep   Poutput_forced Pprecision_not\n\
    + Qallow-short   Qbk:0Bk:0-drop Qcoplanar      QG-half-good   Qi-redundant\n\
    + QJoggle        QRotate        Qsearch-all    Qtriangulate   QVertex-good\n\
    + Qwarn-allow    Q12-allow-wide Q14-merge-pinched\n\
     \n\
    - Qbk:0Bk:0_drop Qcoplanar      QG_half_good   Qi_redundant   QJoggle\n\
    - Qsearch_1st    Qtriangulate   QVertex_good\n\
    + TFacet-log     TInput-file    TOutput-file   Tstatistics    Tverify\n\
    + Tz-stdout\n\
     \n\
    - T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
    - TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
    - TWide_trace    TVertex_stop   TCone_stop\n\
    + T4-trace       Tannotate      TAdd-stop      Tcheck-often   TCone-stop\n\
    + Tflush         TMerge-trace   TPoint-trace   TVertex-stop   TWide-trace\n\
     \n\
    - Angle_max      Centrum_size   Random_dist    Ucoplanar_max  Wide_outside\n\
    + Angle-max      Centrum-size   Random-dist    Ucoplanar-max  Wide-outside\n\
     ";
     
     /*- 1 && *argv[1] == '-' && (*(argv[1] + 1) == '?' || *(argv[1] + 1) == '-')) { /* -? or --help */
    +    fprintf(stdout, qh_prompt2, qh_version);
    +    exit(qh_ERRnone);
    +  }
       if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) {
         fprintf(stdout, qh_prompta, qh_version,
             qh_promptb, qh_promptc, qh_promptd, qh_prompte);
    @@ -277,7 +295,7 @@
       qh_init_A(stdin, stdout, stderr, argc, argv);  /* sets qh qhull_command */
       exitcode= setjmp(qh errexit); /* simple statement for CRAY J916 */
       if (!exitcode) {
    -    qh NOerrexit = False;
    +    qh NOerrexit= False;
         qh_option("Halfspace", NULL, NULL);
         qh HALFspace= True;    /* 'H'   */
         qh_checkflags(qh qhull_command, hidden_options);
    @@ -289,10 +307,6 @@
           qh_errexit(qh_ERRinput, NULL, NULL);
         }
         points= qh_readpoints(&numpoints, &dim, &ismalloc);
    -    if (dim >= 5) {
    -      qh_option("Qxact_merge", NULL, NULL);
    -      qh MERGEexact= True; /* 'Qx' always */
    -    }
         qh_init_B(points, numpoints, dim, ismalloc);
         qh_qhull();
         qh_check_output();
    @@ -308,7 +322,7 @@
       qh_freeqhull(!qh_ALL);
       qh_memfreeshort(&curlong, &totlong);
       if (curlong || totlong)
    -    qh_fprintf_stderr(6263, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
    +    qh_fprintf_stderr(7079, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
            totlong, curlong);
     #endif
       return exitcode;
    diff -Nru qhull-2015.2/src/qhalf/qhalf_r.c qhull-2020.2/src/qhalf/qhalf_r.c
    --- qhull-2015.2/src/qhalf/qhalf_r.c	2016-01-18 22:02:19.000000000 +0000
    +++ qhull-2020.2/src/qhalf/qhalf_r.c	2020-05-22 02:00:58.000000000 +0000
    @@ -1,12 +1,12 @@
    -/*
      -
      ---------------------------------
     
    -   qhalf.c
    +   qhalf_r.c
          compute the intersection of halfspaces about a point
     
    -   see unix.c for full interface
    +   see unix_r.c for full interface
     
    -   Copyright (c) 1993-2015, The Geometry Center
    +   Copyright (c) 1993-2020, The Geometry Center
     */
     
     #include "libqhull_r/libqhull_r.h"
    @@ -17,12 +17,12 @@
     #include 
     #include 
     
    -#if __cplusplus
    +#ifdef __cplusplus
     extern "C" {
       int isatty(int);
     }
     
    -#elif _MSC_VER
    +#elif defined(_MSC_VER)
     #include 
     #define isatty _isatty
     /* int _isatty(int); */
    @@ -32,24 +32,24 @@
                        if "Undefined symbol" this can be deleted along with call in main() */
     #endif
     
    -/*---------------------------------
     
       qh_prompt
         long prompt for qhull
     
       notes:
    -    restricted version of libqhull.c
    -
    -  see:
    -    concise prompt below
    +    restricted version of libqhull_r.c
    +    same text as unix_r.c
    +    see concise prompt below
    +    limit maximum literal to 1800 characters
     */
     
     /* duplicated in qhalf.htm */
    -char hidden_options[]=" d n v Qbb QbB Qf Qg Qm Qr QR Qv Qx Qz TR E V Fa FA FC FD FS Ft FV Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
    +char hidden_options[]=" d n v Qbb QbB Qf Qg Qm Qr Qv Qx Qz TR E V Fa FA FC FD FS Ft FV Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q15 ";
     
     char qh_prompta[]= "\n\
    -qhalf- compute the intersection of halfspaces about a point\n\
    +qhalf -- compute the intersection of halfspaces about a point\n\
         http://www.qhull.org  %s\n\
     \n\
     input (stdin):\n\
    @@ -60,36 +60,48 @@
     \n\
     options:\n\
         Hn,n - specify coordinates of interior point\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
         Qc   - keep coplanar halfspaces\n\
         Qi   - keep other redundant halfspaces\n\
    +    QJ   - joggled input instead of merged facets\n\
    +    Qt   - triangulated output\n\
     \n\
     Qhull control options:\n\
    +    Qa   - allow input with fewer or more points than coordinates\n\
    +    Qbk:0Bk:0 - remove k-th coordinate from input\n\
         QJn  - randomly joggle input in range [-n,n]\n\
    +    QRn  - random rotation (n=seed, n=0 time, n=-1 time/no rotate)\n\
    +    Qs   - search all halfspaces for the initial simplex\n\
    +\n\
     %s%s%s%s";  /* split up qh_prompt for Visual C++ */
     char qh_promptb[]= "\
    -    Qbk:0Bk:0 - remove k-th coordinate from input\n\
    -    Qs   - search all halfspaces for the initial simplex\n\
    +Qhull extra options:\n\
         QGn  - print intersection if visible to halfspace n, -n for not\n\
         QVn  - print intersections for halfspace n, -n if not\n\
    +    Qw   - allow option warnings\n\
    +    Q12  - allow wide facets and wide dupridge\n\
    +    Q14  - merge pinched vertices that create a dupridge\n\
    +\n\
    +T options:\n\
    +    TFn  - report summary when n or more facets created\n\
    +    TI file - input file, may be enclosed in single quotes\n\
    +    TO file - output file, may be enclosed in single quotes\n\
    +    Ts   - statistics\n\
    +    Tv   - verify result: structure, convexity, and in-circle test\n\
    +    Tz   - send all output to stdout\n\
     \n\
     ";
     char qh_promptc[]= "\
     Trace options:\n\
         T4   - trace at level n, 4=all, 5=mem/gauss, -1= events\n\
    +    Ta   - annotate output with message codes\n\
    +    TAn  - stop qhull after adding n vertices\n\
    +     TCn - stop qhull after building cone for point n\n\
    +     TVn - stop qhull after adding point n, -n for before\n\
         Tc   - check frequently during execution\n\
    -    Ts   - print statistics\n\
    -    Tv   - verify result: structure, convexity, and redundancy\n\
    -    Tz   - send all output to stdout\n\
    -    TFn  - report summary when n or more facets created\n\
    -    TI file - input data from file, no spaces or single quotes\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    -    TPn  - turn on tracing when halfspace n added to intersection\n\
    +    Tf   - flush each qh_fprintf for debugging segfaults\n\
    +    TPn - turn on tracing when point n added to hull\n\
         TMn  - turn on tracing at merge n\n\
         TWn  - trace merge facets when width > n\n\
    -    TVn  - stop qhull after adding halfspace n, -n for before (see TCn)\n\
    -    TCn  - stop qhull after building cone for halfspace n (see TVn)\n\
     \n\
     Precision options:\n\
         Cn   - radius of centrum (roundoff added).  Merge facets if non-convex\n\
    @@ -117,15 +129,15 @@
         FF   - facet dump without ridges\n\
         FI   - ID of each intersection\n\
         Fm   - merge count for each intersection (511 max)\n\
    -    FM   - Maple output (dual convex hull)\n\
    +    FM   - Maple output (dual 2-d or 3-d convex hull)\n\
         Fn   - count plus neighboring intersections for each intersection\n\
    -    FN   - count plus intersections for each non-redundant halfspace\n\
    +    FN   - count plus intersections for each halfspace\n\
         FO   - options and precision constants\n\
         Fp   - dim, count, and intersection coordinates\n\
         FP   - nearest halfspace and distance for each redundant halfspace\n\
         FQ   - command used for qhalf\n\
         Fs   - summary: #int (8), dim, #halfspaces, #non-redundant, #intersections\n\
    -                      for output: #non-redundant, #intersections, #coplanar\n\
    +                      output: #non-redundant, #intersections, #coplanar\n\
                                       halfspaces, #non-simplicial intersections\n\
                         #real (2), max outer plane, min vertex\n\
         Fv   - count plus non-redundant halfspaces for each intersection\n\
    @@ -137,20 +149,20 @@
         Ga   - all points (i.e., transformed halfspaces) as dots\n\
          Gp  -  coplanar points and vertices as radii\n\
          Gv  -  vertices (i.e., non-redundant halfspaces) as spheres\n\
    +    Gc   - centrums\n\
    +    GDn  - drop dimension n in 3-d and 4-d output\n\
    +    Gh   - hyperplane intersections\n\
         Gi   - inner planes (i.e., halfspace intersections) only\n\
          Gn  -  no planes\n\
          Go  -  outer planes only\n\
    -    Gc   - centrums\n\
    -    Gh   - hyperplane intersections\n\
         Gr   - ridges\n\
    -    GDn  - drop dimension n in 3-d and 4-d output\n\
     \n\
     Print options:\n\
         PAn  - keep n largest facets (i.e., intersections) by area\n\
         Pdk:n- drop facet if normal[k] <= n (default 0.0)\n\
         PDk:n- drop facet if normal[k] >= n\n\
    -    Pg   - print good facets (needs 'QGn' or 'QVn')\n\
         PFn  - keep facets whose area is at least n\n\
    +    Pg   - print good facets (needs 'QGn' or 'QVn')\n\
         PG   - print neighbors of good facets\n\
         PMn  - keep n facets with most merges\n\
         Po   - force output.  If error, output neighborhood of facet\n\
    @@ -158,19 +170,21 @@
     \n\
         .    - list of all options\n\
         -    - one line descriptions of all options\n\
    +    -?   - help with examples\n\
         -V   - version\n\
     ";
     /* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
     
    -/*---------------------------------
     
       qh_prompt2
         synopsis for qhull
     */
     char qh_prompt2[]= "\n\
    -qhalf- halfspace intersection about a point.  Qhull %s\n\
    -    input (stdin): [dim, 1, interior point], dim+1, n, coefficients+offset\n\
    +qhalf -- halfspace intersection about a point.  Qhull %s\n\
    +    input (stdin): [dimension, 1, interior point]\n\
    +                       dimension+1, number of halfspaces, coefficients+offset\n\
         comments start with a non-numeric character\n\
     \n\
     options (qhalf.htm):\n\
    @@ -179,7 +193,8 @@
         QJ   - joggled input instead of merged facets\n\
         Tv   - verify result: structure, convexity, and redundancy\n\
         .    - concise list of all options\n\
    -    -    - one-line description of all options\n\
    +    -    - one-line description of each option\n\
    +    -?   - this message\n\
         -V   - version\n\
     \n\
     output options (subset):\n\
    @@ -187,11 +202,12 @@
         Fp   - intersection coordinates\n\
         Fv   - non-redundant halfspaces incident to each intersection\n\
         Fx   - non-redundant halfspaces\n\
    -    o    - OFF file format (dual convex hull)\n\
         G    - Geomview output (dual convex hull)\n\
         m    - Mathematica output (dual convex hull)\n\
    +    o    - OFF file format (dual convex hull)\n\
         QVn  - print intersections for halfspace n, -n if not\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    +    TI file - input file, may be enclosed in single quotes\n\
    +    TO file - output file, may be enclosed in single quotes\n\
     \n\
     examples:\n\
         rbox d | qconvex FQ n | qhalf s H0,0,0 Fp\n\
    @@ -201,40 +217,43 @@
     ";
     /* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
     
    -/*---------------------------------
     
       qh_prompt3
         concise prompt for qhull
     */
     char qh_prompt3[]= "\n\
    -Qhull %s.\n\
    +Qhull %s\n\
     Except for 'F.' and 'PG', upper_case options take an argument.\n\
     \n\
    - incidences     Geomview       mathematica    OFF_format     point_dual\n\
    - summary        facet_dump\n\
    + facet-dump     Geomview       H0,0-interior incidences      mathematica\n\
    + off-format     point-dual     summary\n\
     \n\
    - Fc_redundant   Fd_cdd_in      FF_dump_xridge FIDs           Fmerges\n\
    - Fneighbors     FN_intersect   FOptions       Fp_coordinates FP_nearest\n\
    - FQhalf         Fsummary       Fv_halfspace   FMaple         Fx_non_redundant\n\
    + Fc-redundant   Fd-cdd-in      FF-dump-xridge FIDs           Fmerges\n\
    + FMaple         Fneighbors     FN-intersect   FOptions       Fp-coordinates\n\
    + FP-nearest     FQhalf         Fsummary       Fv-halfspace   Fx-non-redundant\n\
     \n\
    - Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
    - Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
    + Gall-points    Gcentrums      GDrop-dim      Ghyperplanes   Ginner\n\
    + Gno-planes     Gouter         Gpoints        Gridges        Gvertices\n\
     \n\
    - PArea_keep     Pdrop d0:0D0   Pgood          PFacet_area_keep\n\
    - PGood_neighbors PMerge_keep   Poutput_forced Pprecision_not\n\
    + PArea-keep     Pdrop-d0:0D0   PFacet-area-keep  Pgood       PGood-neighbors\n\
    + PMerge-keep    Poutput-forced Pprecision-not\n\
     \n\
    - Qbk:0Bk:0_drop Qcoplanar      QG_half_good   Qi_redundant   QJoggle\n\
    - Qsearch_1st    Qtriangulate   QVertex_good\n\
    + Qallow-short   Qbk:0Bk:0-drop Qcoplanar      QG-half-good   Qi-redundant\n\
    + QJoggle        QRotate        Qsearch-all    Qtriangulate   QVertex-good\n\
    + Qwarn-allow    Q12-allow-wide Q14-merge-pinched\n\
     \n\
    - T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
    - TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
    - TWide_trace    TVertex_stop   TCone_stop\n\
    + TFacet-log     TInput-file    TOutput-file   Tstatistics    Tverify\n\
    + Tz-stdout\n\
     \n\
    - Angle_max      Centrum_size   Random_dist    Ucoplanar_max  Wide_outside\n\
    + T4-trace       Tannotate      TAdd-stop      Tcheck-often   TCone-stop\n\
    + Tflush         TMerge-trace   TPoint-trace   TVertex-stop   TWide-trace\n\
    +\n\
    + Angle-max      Centrum-size   Random-dist    Ucoplanar-max  Wide-outside\n\
     ";
     
    -/*---------------------------------
     
       main( argc, argv )
    @@ -263,6 +282,10 @@
         fprintf(stdout, qh_prompt2, qh_version);
         exit(qh_ERRnone);
       }
    +  if (argc > 1 && *argv[1] == '-' && (*(argv[1] + 1) == '?' || *(argv[1] + 1) == '-')) { /* -? or --help */
    +    fprintf(stdout, qh_prompt2, qh_version);
    +    exit(qh_ERRnone);
    +  }
       if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) {
         fprintf(stdout, qh_prompta, qh_version,
             qh_promptb, qh_promptc, qh_promptd, qh_prompte);
    @@ -291,10 +314,6 @@
           qh_errexit(qh, qh_ERRinput, NULL, NULL);
         }
         points= qh_readpoints(qh, &numpoints, &dim, &ismalloc);
    -    if (dim >= 5) {
    -      qh_option(qh, "Qxact_merge", NULL, NULL);
    -      qh->MERGEexact= True; /* 'Qx' always */
    -    }
         qh_init_B(qh, points, numpoints, dim, ismalloc);
         qh_qhull(qh);
         qh_check_output(qh);
    @@ -310,7 +329,7 @@
       qh_freeqhull(qh, !qh_ALL);
       qh_memfreeshort(qh, &curlong, &totlong);
       if (curlong || totlong)
    -    qh_fprintf_stderr(6263, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
    +    qh_fprintf_stderr(7079, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
            totlong, curlong);
     #endif
       return exitcode;
    diff -Nru qhull-2015.2/src/qhull/unix.c qhull-2020.2/src/qhull/unix.c
    --- qhull-2015.2/src/qhull/unix.c	2016-01-18 21:56:48.000000000 +0000
    +++ qhull-2020.2/src/qhull/unix.c	2020-05-22 02:23:57.000000000 +0000
    @@ -7,13 +7,12 @@
     
        see qh-qhull.htm
     
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/qhull/unix.c#4 $$Change: 2066 $
    -   $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    +   Copyright (c) 1993-2020 The Geometry Center.
    +   $Id: //main/2019/qhull/src/qhull/unix.c#4 $$Change: 2954 $
    +   $DateTime: 2020/05/21 22:30:09 $$Author: bbarber $
     */
     
     #include "libqhull/libqhull.h"
    -#include "libqhull/qset.h"
     
     #include 
     #include 
    @@ -21,12 +20,7 @@
     #include 
     #include 
     
    -#if __cplusplus
    -extern "C" {
    -  int isatty(int);
    -}
    -
    -#elif _MSC_VER
    +#if defined(_MSC_VER)
     #include 
     #define isatty _isatty
     /* int _isatty(int); */
    @@ -42,11 +36,13 @@
       qh_prompt
         long prompt for qhull
     
    -  see:
    -    concise prompt below
    +  notes:
    +    see concise prompt below
    +    same text as qconvex.c, qdelanay.c, qhalf.c, qvoronoi.c
    +    limit maximum literal to 1800 characters
     */
     char qh_prompta[]= "\n\
    -qhull- compute convex hulls and related structures.\n\
    +qhull -- compute convex hulls and related structures.\n\
         http://www.qhull.org  %s\n\
     \n\
     input (stdin):\n\
    @@ -59,15 +55,16 @@
     options:\n\
         d    - Delaunay triangulation by lifting points to a paraboloid\n\
         d Qu - furthest-site Delaunay triangulation (upper convex hull)\n\
    -    v    - Voronoi diagram (dual of the Delaunay triangulation)\n\
    -    v Qu - furthest-site Voronoi diagram\n\
         Hn,n,... - halfspace intersection about point [n,n,0,...]\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
         Qc   - keep coplanar points with nearest facet\n\
         Qi   - keep interior points with nearest facet\n\
    +    QJ   - joggled input instead of merged facets\n\
    +    Qt   - triangulated output\n\
    +    v    - Voronoi diagram (dual of the Delaunay triangulation)\n\
    +    v Qu - furthest-site Voronoi diagram\n\
     \n\
     Qhull control options:\n\
    +    Qa   - allow input with fewer or more points than coordinates\n\
         Qbk:n   - scale coord k so that low bound is n\n\
           QBk:n - scale coord k so that upper bound is n (QBk is %2.2g)\n\
         QbB  - scale input to unit cube centered at the origin\n\
    @@ -75,23 +72,26 @@
         Qbk:0Bk:0 - remove k-th coordinate from input\n\
         QJn  - randomly joggle input in range [-n,n]\n\
         QRn  - random rotation (n=seed, n=0 time, n=-1 time/no rotate)\n\
    +    Qs   - search all points for the initial simplex\n\
    +    Qu   - for 'd' or 'v', compute upper hull without point at-infinity\n\
    +              returns furthest-site Delaunay triangulation\n\
    +    QVn  - good facet if it includes point n, -n if not\n\
    +    Qx   - exact pre-merges (skips coplanar and angle-coplanar facets)\n\
    +    Qz   - add point-at-infinity to Delaunay triangulation\n\
    +\n\
     %s%s%s%s";  /* split up qh_prompt for Visual C++ */
     char qh_promptb[]= "\
    +Qhull extra options:\n\
         Qf   - partition point to furthest outside facet\n\
         Qg   - only build good facets (needs 'QGn', 'QVn', or 'PdD')\n\
    +    QGn  - good facet if visible from point n, -n for not visible\n\
         Qm   - only process points that would increase max_outside\n\
         Qr   - process random outside points instead of furthest ones\n\
    -    Qs   - search all points for the initial simplex\n\
    -    Qu   - for 'd' or 'v', compute upper hull without point at-infinity\n\
    -              returns furthest-site Delaunay triangulation\n\
         Qv   - test vertex neighbors for convexity\n\
    -    Qx   - exact pre-merges (skips coplanar and angle-coplanar facets)\n\
    -    Qz   - add point-at-infinity to Delaunay triangulation\n\
    -    QGn  - good facet if visible from point n, -n for not visible\n\
    -    QVn  - good facet if it includes point n, -n if not\n\
    +    Qw   - allow option warnings\n\
         Q0   - turn off default premerge with 'C-0'/'Qx'\n\
    -    Q1     - sort merges by type instead of angle\n\
    -    Q2   - merge all non-convex at once instead of independent sets\n\
    +    Q1   - merge by mergetype/angle instead of mergetype/distance\n\
    +    Q2   - merge all coplanar facets instead of merging independent sets\n\
         Q3   - do not merge redundant vertices\n\
         Q4   - avoid old->new merges\n\
         Q5   - do not correct outer planes at end of qhull\n\
    @@ -101,26 +101,33 @@
         Q9   - process furthest of furthest points\n\
         Q10  - no special processing for narrow distributions\n\
         Q11  - copy normals and recompute centrums for tricoplanar facets\n\
    -    Q12  - no error on wide merge due to duplicate ridge\n\
    +    Q12  - allow wide facets and wide dupridge\n\
    +    Q14  - merge pinched vertices that create a dupridge\n\
    +    Q15  - check for duplicate ridges with the same vertices\n\
    +\n\
    +T options:\n\
    +    TFn  - report summary when n or more facets created\n\
    +    TI file - input file, may be enclosed in single quotes\n\
    +    TO file - output file, may be enclosed in single quotes\n\
    +    Ts   - statistics\n\
    +    Tv   - verify result: structure, convexity, and point inclusion\n\
    +    Tz   - send all output to stdout\n\
     \n\
     ";
     char qh_promptc[]= "\
    -Topts- Trace options:\n\
    +Trace options:\n\
         T4   - trace at level n, 4=all, 5=mem/gauss, -1= events\n\
         Ta   - annotate output with message codes\n\
    +    TAn  - stop qhull after adding n vertices\n\
    +     TCn - stop qhull after building cone for point n\n\
    +     TVn - stop qhull after adding point n, -n for before\n\
         Tc   - check frequently during execution\n\
    -    Ts   - print statistics\n\
    -    Tv   - verify result: structure, convexity, and point inclusion\n\
    -    Tz   - send all output to stdout\n\
    -    TFn  - report summary when n or more facets created\n\
    -    TI file - input data from file, no spaces or single quotes\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    +    Tf   - flush each qh_fprintf for debugging segfaults\n\
         TPn  - turn on tracing when point n added to hull\n\
    +     TP-1  turn on tracing after qh_buildhull and qh_postmerge\n\
          TMn - turn on tracing at merge n\n\
          TWn - trace merge facets when width > n\n\
    -    TRn  - rerun qhull n times.  Use with 'QJn'\n\
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)\n\
    -     TCn - stop qhull after building cone for point n (see TVn)\n\
    +    TRn  - rerun qhull n times for statistics to adjust 'QJn'\n\
     \n\
     Precision options:\n\
         Cn   - radius of centrum (roundoff added).  Merge facets if non-convex\n\
    @@ -137,8 +144,8 @@
         G    - Geomview output (see below)\n\
         i    - vertices incident to each facet\n\
         m    - Mathematica output (2-d and 3-d)\n\
    -    o    - OFF format (dim, points and facets; Voronoi regions)\n\
         n    - normals with offsets\n\
    +    o    - OFF format (dim, points and facets; Voronoi regions)\n\
         p    - vertex coordinates or Voronoi vertices (coplanar points if 'Qc')\n\
         s    - summary (stderr)\n\
     \n\
    @@ -179,25 +186,25 @@
     \n\
     ";
     char qh_prompte[]= "\
    -Geomview options (2-d, 3-d, and 4-d; 2-d Voronoi)\n\
    +Geomview output (2-d, 3-d, and 4-d; 2-d Voronoi)\n\
         Ga   - all points as dots\n\
          Gp  -  coplanar points and vertices as radii\n\
          Gv  -  vertices as spheres\n\
    +    Gc   - centrums\n\
    +    GDn  - drop dimension n in 3-d and 4-d output\n\
    +    Gh   - hyperplane intersections\n\
         Gi   - inner planes only\n\
          Gn  -  no planes\n\
          Go  -  outer planes only\n\
    -    Gc   - centrums\n\
    -    Gh   - hyperplane intersections\n\
         Gr   - ridges\n\
    -    GDn  - drop dimension n in 3-d and 4-d output\n\
         Gt   - for 3-d 'd', transparent outer ridges\n\
     \n\
     Print options:\n\
         PAn  - keep n largest facets by area\n\
         Pdk:n - drop facet if normal[k] <= n (default 0.0)\n\
         PDk:n - drop facet if normal[k] >= n\n\
    -    Pg   - print good facets (needs 'QGn' or 'QVn')\n\
         PFn  - keep facets whose area is at least n\n\
    +    Pg   - print good facets (needs 'QGn' or 'QVn')\n\
         PG   - print neighbors of good facets\n\
         PMn  - keep n facets with most merges\n\
         Po   - force output.  If error, output neighborhood of facet\n\
    @@ -205,6 +212,7 @@
     \n\
         .    - list of all options\n\
         -    - one line descriptions of all options\n\
    +    -?   - help with examples\n\
         -V   - version\n\
     ";
     /* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    @@ -214,10 +222,13 @@
     
       qh_prompt2
         synopsis for qhull
    +
    +  notes:
    +    limit maximum literal to 1800 characters
     */
    -char qh_prompt2[]= "\n\
    -qhull- compute convex hulls and related structures.  Qhull %s\n\
    -    input (stdin): dimension, n, point coordinates\n\
    +char qh_prompt2a[]= "\n\
    +qhull -- compute convex hulls and related structures.  Qhull %s\n\
    +    input (stdin): dimension, number of points, point coordinates\n\
         comments start with a non-numeric character\n\
         halfspace: use dim+1 and put offsets after coefficients\n\
     \n\
    @@ -232,6 +243,7 @@
         Tv   - verify result: structure, convexity, and point inclusion\n\
         .    - concise list of all options\n\
         -    - one-line description of each option\n\
    +    -?   - this message\n\
         -V   - version\n\
     \n\
     Output options (subset):\n\
    @@ -240,22 +252,26 @@
         n    - normals with offsets\n\
         p    - vertex coordinates (if 'Qc', includes coplanar points)\n\
                if 'v', Voronoi vertices\n\
    +    FA   - report total area and volume\n\
         Fp   - halfspace intersections\n\
    +    FS   - total area and volume\n\
         Fx   - extreme points (convex hull vertices)\n\
    -    FA   - compute total area and volume\n\
    -    o    - OFF format (if 'v', outputs Voronoi regions)\n\
         G    - Geomview output (2-d, 3-d and 4-d)\n\
         m    - Mathematica output (2-d and 3-d)\n\
    +    o    - OFF format (if 'v', outputs Voronoi regions)\n\
         QVn  - print facets that include point n, -n if not\n\
    -    TO file- output results to file, may be enclosed in single quotes\n\
    +    TI file - input file, may be enclosed in single quotes\n\
    +    TO file - output file, may be enclosed in single quotes\n\
     \n\
    +%s";  /* split literal */
    +char qh_prompt2b[]= "\
     examples:\n\
         rbox D4 | qhull Tv                        rbox 1000 s | qhull Tv s FA\n\
         rbox 10 D2 | qhull d QJ s i TO result     rbox 10 D2 | qhull v Qbb Qt p\n\
         rbox 10 D2 | qhull d Qu QJ m              rbox 10 D2 | qhull v Qu QJ o\n\
         rbox c d D2 | qhull Qc s f Fx | more      rbox c | qhull FV n | qhull H Fp\n\
         rbox d D12 | qhull QR0 FA                 rbox c D7 | qhull FA TF1000\n\
    -    rbox y 1000 W0 | qhull                    rbox c | qhull n\n\
    +    rbox y 1000 W0 | qhull Qc                 rbox c | qhull n\n\
     \n\
     ";
     /* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    @@ -265,43 +281,54 @@
     
       qh_prompt3
         concise prompt for qhull
    +
    +  notes:
    +    limit maximum literal to 1800 characters
     */
    -char qh_prompt3[]= "\n\
    -Qhull %s.\n\
    +char qh_prompt3a[]= "\n\
    +Qhull %s\n\
     Except for 'F.' and 'PG', upper-case options take an argument.\n\
     \n\
    - delaunay       voronoi        Geomview       Halfspace      facet_dump\n\
    - incidences     mathematica    normals        OFF_format     points\n\
    - summary\n\
    + delaunay       facet-dump     Geomview       H0,0-interior  Halfspace\n\
    + incidences     mathematica    normals        off-format     points\n\
    + summary        voronoi\n\
     \n\
      Farea          FArea-total    Fcoplanars     FCentrums      Fd-cdd-in\n\
    - FD-cdd-out     FF-dump-xridge Finner         FIDs           Fmerges\n\
    - Fneighbors     FNeigh-vertex  Fouter         FOptions       Fpoint-intersect\n\
    - FPoint_near    FQhull         Fsummary       FSize          Ftriangles\n\
    - Fvertices      Fvoronoi       FVertex-ave    Fxtremes       FMaple\n\
    -\n\
    - Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
    - Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
    - Gtransparent\n\
    -\n\
    - PArea-keep     Pdrop d0:0D0   Pgood          PFacet_area_keep\n\
    - PGood_neighbors PMerge-keep   Poutput_forced Pprecision_not\n\
    -\n\
    - QbBound 0:0.5  Qbk:0Bk:0_drop QbB-scale-box  Qbb-scale-last Qcoplanar\n\
    - Qfurthest      Qgood_only     QGood_point    Qinterior      Qmax_out\n\
    - QJoggle        Qrandom        QRotate        Qsearch_1st    Qtriangulate\n\
    - QupperDelaunay QVertex_good   Qvneighbors    Qxact_merge    Qzinfinite\n\
    -\n\
    - Q0_no_premerge Q1_no_angle    Q2_no_independ Q3_no_redundant Q4_no_old\n\
    - Q5_no_check_out Q6_no_concave Q7_depth_first Q8_no_near_in  Q9_pick_furthest\n\
    - Q10_no_narrow  Q11_trinormals Q12_no_wide_dup\n\
    -\n\
    - T4_trace       Tannotate      Tcheck_often   Tstatistics    Tverify\n\
    - Tz_stdout      TFacet_log     TInput_file    TPoint_trace   TMerge_trace\n\
    - TOutput_file   TRerun         TWide_trace    TVertex_stop   TCone_stop\n\
    + FD-cdd-out     FFacets-xridge Finner         FIDs           Fmerges\n\
    + FMaple         Fneighbors     FNeigh-vertex  Fouter         FOptions\n\
    + Fpoint-intersect  FPoint-near FQhull         Fsummary       FSize\n\
    + Ftriangles     Fvertices      Fvoronoi       FVertex-ave    Fxtremes\n\
    +\n\
    + Gall-points    Gcentrums      GDrop-dim      Ghyperplanes   Ginner\n\
    + Gno-planes     Gouter         Gpoints        Gridges        Gtransparent\n\
    + Gvertices\n\
    +\n\
    + PArea-keep     Pdrop-d0:0D0   PFacet-area-keep  Pgood       PGood-neighbors\n\
    + PMerge-keep    Poutput-forced Pprecision-not\n\
    +\n\
    + Qallow-short   QbBound-0:0.5  QbB-scale-box  Qbb-scale-last Qbk:0Bk:0-drop\n\
    + Qcoplanar      Qinterior      QJoggle        QRotate        Qsearch-all\n\
    + Qtriangulate   QupperDelaunay Qwarn-allow    Qxact-merge    Qzinfinite\n\
    +\n\
    + Qfurthest      Qgood-only     QGood-point    Qmax-outside   Qrandom\n\
    + Qvneighbors    QVertex-good\n\
    +\n\
    +%s"; /* split literal */
    +char qh_prompt3b[]= "\
    + Q0-no-premerge Q1-angle-merge     Q2-no-independ  Q3-no-redundant\n\
    + Q4-no-old      Q5-no-check-out    Q6-no-concave   Q7-depth-first\n\
    + Q8-no-near-in  Q9-pick-furthest   Q10-no-narrow   Q11-trinormals\n\
    + Q12-allow-wide Q14-merge-pinched  Q15-duplicates\n\
    +\n\
    + TFacet-log     TInput-file    TOutput-file   Tstatistics    Tverify\n\
    + Tz-stdout\n\
    +\n\
    + T4-trace       Tannotate      TAdd-stop      Tcheck-often   TCone-stop\n\
    + Tflush         TMerge-trace   TPoint-trace   TRerun         TVertex-stop\n\
    + TWide-trace\n\
     \n\
    - Angle_max      Centrum_size   Error_round    Random_dist    Visible_min\n\
    - Ucoplanar_max  Wide_outside\n\
    + Angle-max      Centrum-size   Error-round    Random-dist    Ucoplanar-max\n\
    + Visible-min    Wide-outside\n\
     ";
     
     /*- 1 && *argv[1] == '-' && (*(argv[1] + 1) == '?' || *(argv[1] + 1) == '-')) { /* -? or --help */
    +    fprintf(stdout, qh_prompt2a, qh_version, qh_prompt2b);
    +    exit(qh_ERRnone);
    +  }
    +  if (argc > 1 && *argv[1] == '-' && (*(argv[1] + 1) == '?' || *(argv[1] + 1) == '-')) { /* -? or --help */
    +    fprintf(stdout, qh_prompt2a, qh_version, qh_prompt2b);
         exit(qh_ERRnone);
       }
       if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) {
    @@ -337,7 +372,7 @@
         exit(qh_ERRnone);
       }
       if (argc > 1 && *argv[1] == '.' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompt3, qh_version);
    +    fprintf(stdout, qh_prompt3a, qh_version, qh_prompt3b);
         exit(qh_ERRnone);
       }
       if (argc > 1 && *argv[1] == '-' && *(argv[1]+1)=='V') {
    @@ -347,24 +382,25 @@
       qh_init_A(stdin, stdout, stderr, argc, argv);  /* sets qh qhull_command */
       exitcode= setjmp(qh errexit); /* simple statement for CRAY J916 */
       if (!exitcode) {
    +    qh NOerrexit = False;
         qh_initflags(qh qhull_command);
         points= qh_readpoints(&numpoints, &dim, &ismalloc);
         qh_init_B(points, numpoints, dim, ismalloc);
         qh_qhull();
         qh_check_output();
         qh_produce_output();
    -    if (qh VERIFYoutput && !qh FORCEoutput && !qh STOPpoint && !qh STOPcone)
    +    if (qh VERIFYoutput && !qh FORCEoutput && !qh STOPadd && !qh STOPcone && !qh STOPpoint)
           qh_check_points();
         exitcode= qh_ERRnone;
       }
       qh NOerrexit= True;  /* no more setjmp */
     #ifdef qh_NOmem
    -  qh_freeqhull( qh_ALL);
    +  qh_freeqhull(qh_ALL);
     #else
    -  qh_freeqhull( !qh_ALL);
    +  qh_freeqhull(!qh_ALL);
       qh_memfreeshort(&curlong, &totlong);
       if (curlong || totlong)
    -    qh_fprintf_stderr(6263, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
    +    qh_fprintf_stderr(7079, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
            totlong, curlong);
     #endif
       return exitcode;
    diff -Nru qhull-2015.2/src/qhull/unix_r.c qhull-2020.2/src/qhull/unix_r.c
    --- qhull-2015.2/src/qhull/unix_r.c	2016-01-18 21:58:39.000000000 +0000
    +++ qhull-2020.2/src/qhull/unix_r.c	2020-07-25 02:25:08.000000000 +0000
    @@ -1,15 +1,15 @@
    -/*
      -
      ---------------------------------
     
    -   unix.c
    +   unix_r.c
          command line interface to qhull
              includes SIOUX interface for Macintoshes
     
        see qh-qhull.htm
     
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/qhull/unix_r.c#6 $$Change: 2066 $
    -   $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    +   Copyright (c) 1993-2020 The Geometry Center.
    +   $Id: //main/2019/qhull/src/qhull/unix_r.c#6 $$Change: 3006 $
    +   $DateTime: 2020/07/29 18:28:16 $$Author: bbarber $
     */
     
     #include "libqhull_r/libqhull_r.h"
    @@ -20,12 +20,12 @@
     #include 
     #include 
     
    -#if __cplusplus
    +#ifdef __cplusplus
     extern "C" {
       int isatty(int);
     }
     
    -#elif _MSC_VER
    +#elif defined(_MSC_VER)
     #include 
     #define isatty _isatty
     /* int _isatty(int); */
    @@ -35,17 +35,19 @@
                        if "Undefined symbol" this can be deleted along with call in main() */
     #endif
     
    -/*---------------------------------
     
       qh_prompt
         long prompt for qhull
     
    -  see:
    -    concise prompt below
    +  notes:
    +    see concise prompt below
    +    same text as qconvex_r.c, qdelanay_r.c, qhalf_r.c, qvoronoi_r.c
    +    limit maximum literal to 1800 characters
     */
     char qh_prompta[]= "\n\
    -qhull- compute convex hulls and related structures.\n\
    +qhull -- compute convex hulls and related structures.\n\
         http://www.qhull.org  %s\n\
     \n\
     input (stdin):\n\
    @@ -58,15 +60,16 @@
     options:\n\
         d    - Delaunay triangulation by lifting points to a paraboloid\n\
         d Qu - furthest-site Delaunay triangulation (upper convex hull)\n\
    -    v    - Voronoi diagram (dual of the Delaunay triangulation)\n\
    -    v Qu - furthest-site Voronoi diagram\n\
         Hn,n,... - halfspace intersection about point [n,n,0,...]\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
         Qc   - keep coplanar points with nearest facet\n\
         Qi   - keep interior points with nearest facet\n\
    +    QJ   - joggled input instead of merged facets\n\
    +    Qt   - triangulated output\n\
    +    v    - Voronoi diagram (dual of the Delaunay triangulation)\n\
    +    v Qu - furthest-site Voronoi diagram\n\
     \n\
     Qhull control options:\n\
    +    Qa   - allow input with fewer or more points than coordinates\n\
         Qbk:n   - scale coord k so that low bound is n\n\
           QBk:n - scale coord k so that upper bound is n (QBk is %2.2g)\n\
         QbB  - scale input to unit cube centered at the origin\n\
    @@ -74,23 +77,26 @@
         Qbk:0Bk:0 - remove k-th coordinate from input\n\
         QJn  - randomly joggle input in range [-n,n]\n\
         QRn  - random rotation (n=seed, n=0 time, n=-1 time/no rotate)\n\
    +    Qs   - search all points for the initial simplex\n\
    +    Qu   - for 'd' or 'v', compute upper hull without point at-infinity\n\
    +              returns furthest-site Delaunay triangulation\n\
    +    QVn  - good facet if it includes point n, -n if not\n\
    +    Qx   - exact pre-merges (skips coplanar and angle-coplanar facets)\n\
    +    Qz   - add point-at-infinity to Delaunay triangulation\n\
    +\n\
     %s%s%s%s";  /* split up qh_prompt for Visual C++ */
     char qh_promptb[]= "\
    +Qhull extra options:\n\
         Qf   - partition point to furthest outside facet\n\
         Qg   - only build good facets (needs 'QGn', 'QVn', or 'PdD')\n\
    +    QGn  - good facet if visible from point n, -n for not visible\n\
         Qm   - only process points that would increase max_outside\n\
         Qr   - process random outside points instead of furthest ones\n\
    -    Qs   - search all points for the initial simplex\n\
    -    Qu   - for 'd' or 'v', compute upper hull without point at-infinity\n\
    -              returns furthest-site Delaunay triangulation\n\
         Qv   - test vertex neighbors for convexity\n\
    -    Qx   - exact pre-merges (skips coplanar and angle-coplanar facets)\n\
    -    Qz   - add point-at-infinity to Delaunay triangulation\n\
    -    QGn  - good facet if visible from point n, -n for not visible\n\
    -    QVn  - good facet if it includes point n, -n if not\n\
    +    Qw   - allow option warnings\n\
         Q0   - turn off default premerge with 'C-0'/'Qx'\n\
    -    Q1     - sort merges by type instead of angle\n\
    -    Q2   - merge all non-convex at once instead of independent sets\n\
    +    Q1   - merge by mergetype/angle instead of mergetype/distance\n\
    +    Q2   - merge all coplanar facets instead of merging independent sets\n\
         Q3   - do not merge redundant vertices\n\
         Q4   - avoid old->new merges\n\
         Q5   - do not correct outer planes at end of qhull\n\
    @@ -100,26 +106,33 @@
         Q9   - process furthest of furthest points\n\
         Q10  - no special processing for narrow distributions\n\
         Q11  - copy normals and recompute centrums for tricoplanar facets\n\
    -    Q12  - no error on wide merge due to duplicate ridge\n\
    +    Q12  - allow wide facets and wide dupridge\n\
    +    Q14  - merge pinched vertices that create a dupridge\n\
    +    Q15  - check for duplicate ridges with the same vertices\n\
    +\n\
    +T options:\n\
    +    TFn  - report summary when n or more facets created\n\
    +    TI file - input file, may be enclosed in single quotes\n\
    +    TO file - output file, may be enclosed in single quotes\n\
    +    Ts   - statistics\n\
    +    Tv   - verify result: structure, convexity, and point inclusion\n\
    +    Tz   - send all output to stdout\n\
     \n\
     ";
     char qh_promptc[]= "\
    -Topts- Trace options:\n\
    +Trace options:\n\
         T4   - trace at level n, 4=all, 5=mem/gauss, -1= events\n\
         Ta   - annotate output with message codes\n\
    +    TAn  - stop qhull after adding n vertices\n\
    +     TCn - stop qhull after building cone for point n\n\
    +     TVn - stop qhull after adding point n, -n for before\n\
         Tc   - check frequently during execution\n\
    -    Ts   - print statistics\n\
    -    Tv   - verify result: structure, convexity, and point inclusion\n\
    -    Tz   - send all output to stdout\n\
    -    TFn  - report summary when n or more facets created\n\
    -    TI file - input data from file, no spaces or single quotes\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    +    Tf   - flush each qh_fprintf for debugging segfaults\n\
         TPn  - turn on tracing when point n added to hull\n\
    +     TP-1  turn on tracing after qh_buildhull and qh_postmerge\n\
          TMn - turn on tracing at merge n\n\
          TWn - trace merge facets when width > n\n\
    -    TRn  - rerun qhull n times.  Use with 'QJn'\n\
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)\n\
    -     TCn - stop qhull after building cone for point n (see TVn)\n\
    +    TRn  - rerun qhull n times for statistics to adjust 'QJn'\n\
     \n\
     Precision options:\n\
         Cn   - radius of centrum (roundoff added).  Merge facets if non-convex\n\
    @@ -136,8 +149,8 @@
         G    - Geomview output (see below)\n\
         i    - vertices incident to each facet\n\
         m    - Mathematica output (2-d and 3-d)\n\
    -    o    - OFF format (dim, points and facets; Voronoi regions)\n\
         n    - normals with offsets\n\
    +    o    - OFF format (dim, points and facets; Voronoi regions)\n\
         p    - vertex coordinates or Voronoi vertices (coplanar points if 'Qc')\n\
         s    - summary (stderr)\n\
     \n\
    @@ -178,25 +191,25 @@
     \n\
     ";
     char qh_prompte[]= "\
    -Geomview options (2-d, 3-d, and 4-d; 2-d Voronoi)\n\
    +Geomview output (2-d, 3-d, and 4-d; 2-d Voronoi)\n\
         Ga   - all points as dots\n\
          Gp  -  coplanar points and vertices as radii\n\
          Gv  -  vertices as spheres\n\
    +    Gc   - centrums\n\
    +    GDn  - drop dimension n in 3-d and 4-d output\n\
    +    Gh   - hyperplane intersections\n\
         Gi   - inner planes only\n\
          Gn  -  no planes\n\
          Go  -  outer planes only\n\
    -    Gc   - centrums\n\
    -    Gh   - hyperplane intersections\n\
         Gr   - ridges\n\
    -    GDn  - drop dimension n in 3-d and 4-d output\n\
         Gt   - for 3-d 'd', transparent outer ridges\n\
     \n\
     Print options:\n\
         PAn  - keep n largest facets by area\n\
         Pdk:n - drop facet if normal[k] <= n (default 0.0)\n\
         PDk:n - drop facet if normal[k] >= n\n\
    -    Pg   - print good facets (needs 'QGn' or 'QVn')\n\
         PFn  - keep facets whose area is at least n\n\
    +    Pg   - print good facets (needs 'QGn' or 'QVn')\n\
         PG   - print neighbors of good facets\n\
         PMn  - keep n facets with most merges\n\
         Po   - force output.  If error, output neighborhood of facet\n\
    @@ -204,19 +217,23 @@
     \n\
         .    - list of all options\n\
         -    - one line descriptions of all options\n\
    +    -?   - help with examples\n\
         -V   - version\n\
     ";
     /* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
     
    -/*---------------------------------
     
       qh_prompt2
         synopsis for qhull
    +
    +  notes:
    +    limit maximum literal to 1800 characters
     */
    -char qh_prompt2[]= "\n\
    -qhull- compute convex hulls and related structures.  Qhull %s\n\
    -    input (stdin): dimension, n, point coordinates\n\
    +char qh_prompt2a[]= "\n\
    +qhull -- compute convex hulls and related structures.  Qhull %s\n\
    +    input (stdin): dimension, number of points, point coordinates\n\
         comments start with a non-numeric character\n\
         halfspace: use dim+1 and put offsets after coefficients\n\
     \n\
    @@ -231,6 +248,7 @@
         Tv   - verify result: structure, convexity, and point inclusion\n\
         .    - concise list of all options\n\
         -    - one-line description of each option\n\
    +    -?   - this message\n\
         -V   - version\n\
     \n\
     Output options (subset):\n\
    @@ -239,71 +257,86 @@
         n    - normals with offsets\n\
         p    - vertex coordinates (if 'Qc', includes coplanar points)\n\
                if 'v', Voronoi vertices\n\
    +    FA   - report total area and volume\n\
         Fp   - halfspace intersections\n\
    +    FS   - total area and volume\n\
         Fx   - extreme points (convex hull vertices)\n\
    -    FA   - compute total area and volume\n\
    -    o    - OFF format (if 'v', outputs Voronoi regions)\n\
         G    - Geomview output (2-d, 3-d and 4-d)\n\
         m    - Mathematica output (2-d and 3-d)\n\
    +    o    - OFF format (if 'v', outputs Voronoi regions)\n\
         QVn  - print facets that include point n, -n if not\n\
    -    TO file- output results to file, may be enclosed in single quotes\n\
    +    TI file - input file, may be enclosed in single quotes\n\
    +    TO file - output file, may be enclosed in single quotes\n\
     \n\
    +%s";  /* split literal */
    +char qh_prompt2b[]= "\
     examples:\n\
         rbox D4 | qhull Tv                        rbox 1000 s | qhull Tv s FA\n\
         rbox 10 D2 | qhull d QJ s i TO result     rbox 10 D2 | qhull v Qbb Qt p\n\
         rbox 10 D2 | qhull d Qu QJ m              rbox 10 D2 | qhull v Qu QJ o\n\
         rbox c d D2 | qhull Qc s f Fx | more      rbox c | qhull FV n | qhull H Fp\n\
         rbox d D12 | qhull QR0 FA                 rbox c D7 | qhull FA TF1000\n\
    -    rbox y 1000 W0 | qhull                    rbox c | qhull n\n\
    +    rbox y 1000 W0 | qhull Qc                 rbox c | qhull n\n\
     \n\
     ";
     /* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
     
    -/*---------------------------------
     
       qh_prompt3
         concise prompt for qhull
    +
    +  notes:
    +    limit maximum literal to 1800 characters
     */
    -char qh_prompt3[]= "\n\
    -Qhull %s.\n\
    +char qh_prompt3a[]= "\n\
    +Qhull %s\n\
     Except for 'F.' and 'PG', upper-case options take an argument.\n\
     \n\
    - delaunay       voronoi        Geomview       Halfspace      facet_dump\n\
    - incidences     mathematica    normals        OFF_format     points\n\
    - summary\n\
    + delaunay       facet-dump     Geomview       H0,0-interior  Halfspace\n\
    + incidences     mathematica    normals        off-format     points\n\
    + summary        voronoi\n\
     \n\
      Farea          FArea-total    Fcoplanars     FCentrums      Fd-cdd-in\n\
    - FD-cdd-out     FF-dump-xridge Finner         FIDs           Fmerges\n\
    - Fneighbors     FNeigh-vertex  Fouter         FOptions       Fpoint-intersect\n\
    - FPoint_near    FQhull         Fsummary       FSize          Ftriangles\n\
    - Fvertices      Fvoronoi       FVertex-ave    Fxtremes       FMaple\n\
    -\n\
    - Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
    - Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
    - Gtransparent\n\
    -\n\
    - PArea-keep     Pdrop d0:0D0   Pgood          PFacet_area_keep\n\
    - PGood_neighbors PMerge-keep   Poutput_forced Pprecision_not\n\
    -\n\
    - QbBound 0:0.5  Qbk:0Bk:0_drop QbB-scale-box  Qbb-scale-last Qcoplanar\n\
    - Qfurthest      Qgood_only     QGood_point    Qinterior      Qmax_out\n\
    - QJoggle        Qrandom        QRotate        Qsearch_1st    Qtriangulate\n\
    - QupperDelaunay QVertex_good   Qvneighbors    Qxact_merge    Qzinfinite\n\
    -\n\
    - Q0_no_premerge Q1_no_angle    Q2_no_independ Q3_no_redundant Q4_no_old\n\
    - Q5_no_check_out Q6_no_concave Q7_depth_first Q8_no_near_in  Q9_pick_furthest\n\
    - Q10_no_narrow  Q11_trinormals Q12_no_wide_dup\n\
    -\n\
    - T4_trace       Tannotate      Tcheck_often   Tstatistics    Tverify\n\
    - Tz_stdout      TFacet_log     TInput_file    TPoint_trace   TMerge_trace\n\
    - TOutput_file   TRerun         TWide_trace    TVertex_stop   TCone_stop\n\
    + FD-cdd-out     FFacets-xridge Finner         FIDs           Fmerges\n\
    + FMaple         Fneighbors     FNeigh-vertex  Fouter         FOptions\n\
    + Fpoint-intersect  FPoint-near FQhull         Fsummary       FSize\n\
    + Ftriangles     Fvertices      Fvoronoi       FVertex-ave    Fxtremes\n\
    +\n\
    + Gall-points    Gcentrums      GDrop-dim      Ghyperplanes   Ginner\n\
    + Gno-planes     Gouter         Gpoints        Gridges        Gtransparent\n\
    + Gvertices\n\
    +\n\
    + PArea-keep     Pdrop-d0:0D0   PFacet-area-keep  Pgood       PGood-neighbors\n\
    + PMerge-keep    Poutput-forced Pprecision-not\n\
    +\n\
    + Qallow-short   QbBound-0:0.5  QbB-scale-box  Qbb-scale-last Qbk:0Bk:0-drop\n\
    + Qcoplanar      Qinterior      QJoggle        QRotate        Qsearch-all\n\
    + Qtriangulate   QupperDelaunay Qwarn-allow    Qxact-merge    Qzinfinite\n\
    +\n\
    + Qfurthest      Qgood-only     QGood-point    Qmax-outside   Qrandom\n\
    + Qvneighbors    QVertex-good\n\
    +\n\
    +%s"; /* split literal */
    +char qh_prompt3b[]= "\
    + Q0-no-premerge Q1-angle-merge     Q2-no-independ  Q3-no-redundant\n\
    + Q4-no-old      Q5-no-check-out    Q6-no-concave   Q7-depth-first\n\
    + Q8-no-near-in  Q9-pick-furthest   Q10-no-narrow   Q11-trinormals\n\
    + Q12-allow-wide Q14-merge-pinched  Q15-duplicates\n\
    +\n\
    + TFacet-log     TInput-file    TOutput-file   Tstatistics    Tverify\n\
    + Tz-stdout\n\
    +\n\
    + T4-trace       Tannotate      TAdd-stop      Tcheck-often   TCone-stop\n\
    + Tflush         TMerge-trace   TPoint-trace   TRerun         TVertex-stop\n\
    + TWide-trace\n\
     \n\
    - Angle_max      Centrum_size   Error_round    Random_dist    Visible_min\n\
    - Ucoplanar_max  Wide_outside\n\
    + Angle-max      Centrum-size   Error-round    Random-dist    Ucoplanar-max\n\
    + Visible-min    Wide-outside\n\
     ";
     
    -/*---------------------------------
     
       main( argc, argv )
    @@ -329,7 +362,15 @@
       QHULL_LIB_CHECK /* Check for compatible library */
     
       if ((argc == 1) && isatty( 0 /*stdin*/)) {
    -    fprintf(stdout, qh_prompt2, qh_version);
    +    fprintf(stdout, qh_prompt2a, qh_version, qh_prompt2b);
    +    exit(qh_ERRnone);
    +  }
    +  if (argc > 1 && *argv[1] == '-' && (*(argv[1] + 1) == '?' || *(argv[1] + 1) == '-')) { /* -? or --help */
    +    fprintf(stdout, qh_prompt2a, qh_version, qh_prompt2b);
    +    exit(qh_ERRnone);
    +  }
    +  if (argc > 1 && *argv[1] == '-' && (*(argv[1] + 1) == '?' || *(argv[1] + 1) == '-')) { /* -? or --help */
    +    fprintf(stdout, qh_prompt2a, qh_version, qh_prompt2b);
         exit(qh_ERRnone);
       }
       if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) {
    @@ -338,7 +379,7 @@
         exit(qh_ERRnone);
       }
       if (argc > 1 && *argv[1] == '.' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompt3, qh_version);
    +    fprintf(stdout, qh_prompt3a, qh_version, qh_prompt3b);
         exit(qh_ERRnone);
       }
       if (argc > 1 && *argv[1] == '-' && *(argv[1]+1)=='V') {
    @@ -348,14 +389,14 @@
       qh_init_A(qh, stdin, stdout, stderr, argc, argv);  /* sets qh->qhull_command */
       exitcode= setjmp(qh->errexit); /* simple statement for CRAY J916 */
       if (!exitcode) {
    -    qh->NOerrexit = False;
    +    qh->NOerrexit= False;
         qh_initflags(qh, qh->qhull_command);
         points= qh_readpoints(qh, &numpoints, &dim, &ismalloc);
         qh_init_B(qh, points, numpoints, dim, ismalloc);
         qh_qhull(qh);
         qh_check_output(qh);
         qh_produce_output(qh);
    -    if (qh->VERIFYoutput && !qh->FORCEoutput && !qh->STOPpoint && !qh->STOPcone)
    +    if (qh->VERIFYoutput && !qh->FORCEoutput && !qh->STOPadd && !qh->STOPcone && !qh->STOPpoint)
           qh_check_points(qh);
         exitcode= qh_ERRnone;
       }
    @@ -366,7 +407,7 @@
       qh_freeqhull(qh, !qh_ALL);
       qh_memfreeshort(qh, &curlong, &totlong);
       if (curlong || totlong)
    -    qh_fprintf_stderr(6263, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
    +    qh_fprintf_stderr(7079, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
            totlong, curlong);
     #endif
       return exitcode;
    diff -Nru qhull-2015.2/src/qhull-all.pro qhull-2020.2/src/qhull-all.pro
    --- qhull-2015.2/src/qhull-all.pro	2015-07-11 22:31:59.000000000 +0000
    +++ qhull-2020.2/src/qhull-all.pro	2019-02-11 16:52:10.000000000 +0000
    @@ -51,9 +51,13 @@
     OTHER_FILES += ../Makefile
     OTHER_FILES += ../README.txt
     OTHER_FILES += ../REGISTER.txt
    +OTHER_FILES += ../eg/make-vcproj.sh
    +OTHER_FILES += ../eg/q_benchmark
     OTHER_FILES += ../eg/q_eg
     OTHER_FILES += ../eg/q_egtest
     OTHER_FILES += ../eg/q_test
    +OTHER_FILES += ../eg/qhull-zip.sh
    +OTHER_FILES += ../eg/qtest.sh
     OTHER_FILES += ../html/index.htm
     OTHER_FILES += ../html/qconvex.htm
     OTHER_FILES += ../html/qdelau_f.htm
    diff -Nru qhull-2015.2/src/qhulltest/Coordinates_test.cpp qhull-2020.2/src/qhulltest/Coordinates_test.cpp
    --- qhull-2015.2/src/qhulltest/Coordinates_test.cpp	2016-01-17 01:25:45.000000000 +0000
    +++ qhull-2020.2/src/qhulltest/Coordinates_test.cpp	2020-07-24 22:43:51.000000000 +0000
    @@ -1,8 +1,8 @@
     /****************************************************************************
     **
    -** Copyright (c) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/Coordinates_test.cpp#2 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    +** Copyright (c) 2009-2020 C.B. Barber. All rights reserved.
    +** $Id: //main/2019/qhull/src/qhulltest/Coordinates_test.cpp#4 $$Change: 3001 $
    +** $DateTime: 2020/07/24 20:43:28 $$Author: bbarber $
     **
     ****************************************************************************/
     
    @@ -36,10 +36,9 @@
         void t_operator();
         void t_const_iterator();
         void t_iterator();
    -    void t_coord_iterator();
    -    void t_mutable_coord_iterator();
    -    void t_readwrite();
    +    void t_foreach();
         void t_search();
    +    void t_readwrite();
         void t_io();
     };//Coordinates_test
     
    @@ -61,7 +60,7 @@
         c2 << 2.0;
         QCOMPARE(c2.count(), 2);
         Coordinates c3;
    -    c3 = c2;
    +    c3= c2;
         QCOMPARE(c3.count(), 2);
         QCOMPARE(c3[0]+c3[1], 3.0);
         QVERIFY(c2==c3);
    @@ -251,155 +250,74 @@
     }//t_iterator
     
     void Coordinates_test::
    -t_coord_iterator()
    +t_foreach()
     {
    -    Coordinates c;
    -    c << 1.0 << 3.0;
    -    CoordinatesIterator i(c);
    -    CoordinatesIterator i2= c;
    -    QVERIFY(i.findNext(1.0));
    -    QVERIFY(!i.findNext(2.0));
    -    QVERIFY(!i.findNext(3.0));
    -    QVERIFY(i.findPrevious(3.0));
    -    QVERIFY(!i.findPrevious(2.0));
    -    QVERIFY(!i.findPrevious(1.0));
    -    QVERIFY(i2.findNext(3.0));
    -    QVERIFY(i2.findPrevious(3.0));
    -    QVERIFY(i2.findNext(3.0));
    -    QVERIFY(i2.findPrevious(1.0));
    -    QVERIFY(i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    QVERIFY(i.hasNext());
    -    QVERIFY(!i.hasPrevious());
    -    i.toBack();
    -    i2.toFront();
    -    QVERIFY(!i.hasNext());
    -    QVERIFY(i.hasPrevious());
    -    QVERIFY(i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    Coordinates c2;
    -    i2= c2;
    -    QVERIFY(!i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    i2.toBack();
    -    QVERIFY(!i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    QCOMPARE(i.peekPrevious(), 3.0);
    -    QCOMPARE(i.previous(), 3.0);
    -    QCOMPARE(i.previous(), 1.0);
    -    QVERIFY(!i.hasPrevious());
    -    QCOMPARE(i.peekNext(), 1.0);
    -    // i.peekNext()= 1.0; // compiler error
    -    QCOMPARE(i.next(), 1.0);
    -    QCOMPARE(i.peekNext(), 3.0);
    -    QCOMPARE(i.next(), 3.0);
    -    QVERIFY(!i.hasNext());
    -    i.toFront();
    -    QCOMPARE(i.next(), 1.0);
    -}//t_coord_iterator
    +    RboxPoints rcube("c");
    +    Qhull q;
    +    Coordinates cs;
    +    cs << 0.1 << 0.2 << 0.3;
    +    q.setFeasiblePoint(cs);
    +    q.runQhull(rcube, "QR0"); // a rotated cube, feasiblePoint is set but not used
    +    coordT c2= cs.at(1);
    +
    +    // Qt's 'foreach' should not be used.  It makes a copy of the std::vector
    +
    +    bool isC2= false;
    +    int count= 0;
    +    for(coordT c : q.feasiblePoint()){
    +        ++count;
    +        if(c==c2){
    +            isC2= true;
    +        }
    +    }
    +    QVERIFY(isC2);
    +    QCOMPARE(count, cs.count());
    +}//t_foreach
     
     void Coordinates_test::
    -t_mutable_coord_iterator()
    +t_search()
     {
    -    // Same tests as CoordinatesIterator
         Coordinates c;
    -    c << 1.0 << 3.0;
    -    MutableCoordinatesIterator i(c);
    -    MutableCoordinatesIterator i2= c;
    -    QVERIFY(i.findNext(1.0));
    -    QVERIFY(!i.findNext(2.0));
    -    QVERIFY(!i.findNext(3.0));
    -    QVERIFY(i.findPrevious(3.0));
    -    QVERIFY(!i.findPrevious(2.0));
    -    QVERIFY(!i.findPrevious(1.0));
    -    QVERIFY(i2.findNext(3.0));
    -    QVERIFY(i2.findPrevious(3.0));
    -    QVERIFY(i2.findNext(3.0));
    -    QVERIFY(i2.findPrevious(1.0));
    -    QVERIFY(i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    QVERIFY(i.hasNext());
    -    QVERIFY(!i.hasPrevious());
    -    i.toBack();
    -    i2.toFront();
    -    QVERIFY(!i.hasNext());
    -    QVERIFY(i.hasPrevious());
    -    QVERIFY(i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    Coordinates c2;
    -    i2= c2;
    -    QVERIFY(!i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    i2.toBack();
    -    QVERIFY(!i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    QCOMPARE(i.peekPrevious(), 3.0);
    -    QCOMPARE(i.peekPrevious(), 3.0);
    -    QCOMPARE(i.previous(), 3.0);
    -    QCOMPARE(i.previous(), 1.0);
    -    QVERIFY(!i.hasPrevious());
    -    QCOMPARE(i.peekNext(), 1.0);
    -    QCOMPARE(i.next(), 1.0);
    -    QCOMPARE(i.peekNext(), 3.0);
    -    QCOMPARE(i.next(), 3.0);
    -    QVERIFY(!i.hasNext());
    -    i.toFront();
    -    QCOMPARE(i.next(), 1.0);
    -
    -    // Mutable tests
    -    i.toFront();
    -    i.peekNext()= -1.0;
    -    QCOMPARE(i.peekNext(), -1.0);
    -    QCOMPARE((i.next()= 1.0), 1.0);
    -    QCOMPARE(i.peekPrevious(), 1.0);
    -    i.remove();
    -    QCOMPARE(c.count(), 1);
    -    i.remove();
    -    QCOMPARE(c.count(), 1);
    -    QCOMPARE(i.peekNext(), 3.0);
    -    i.insert(1.0);
    -    i.insert(2.0);
    -    QCOMPARE(c.count(), 3);
    -    QCOMPARE(i.peekNext(), 3.0);
    -    QCOMPARE(i.peekPrevious(), 2.0);
    -    i.peekPrevious()= -2.0;
    -    QCOMPARE(i.peekPrevious(), -2.0);
    -    QCOMPARE((i.previous()= 2.0), 2.0);
    -    QCOMPARE(i.peekNext(), 2.0);
    -    i.toBack();
    -    i.remove();
    -    QCOMPARE(c.count(), 3); // unchanged
    -    i.toFront();
    -    i.remove();
    -    QCOMPARE(c.count(), 3); // unchanged
    -    QCOMPARE(i.peekNext(), 1.0);
    -    i.remove();
    -    QCOMPARE(c.count(), 3); // unchanged
    -    i.insert(0.0);
    -    QCOMPARE(c.count(), 4);
    -    QCOMPARE(i.value(), 0.0);
    -    QCOMPARE(i.peekPrevious(), 0.0);
    -    i.setValue(-10.0);
    -    QCOMPARE(c.count(), 4); // unchanged
    -    QCOMPARE(i.peekNext(), 1.0);
    -    QCOMPARE(i.peekPrevious(), -10.0);
    -    i.findNext(1.0);
    -    i.setValue(-1.0);
    -    QCOMPARE(i.peekPrevious(), -1.0);
    -    i.setValue(1.0);
    -    QCOMPARE(i.peekPrevious(), 1.0);
    -    QCOMPARE(i.value(), 1.0);
    -    i.findPrevious(1.0);
    -    i.setValue(-1.0);
    -    QCOMPARE(i.peekNext(), -1.0);
    -    i.toBack();
    -    QCOMPARE(i.previous(), 3.0);
    -    i.setValue(-3.0);
    -    QCOMPARE(i.peekNext(), -3.0);
    -    double d= i.value();
    -    QCOMPARE(d, -3.0);
    -    QCOMPARE(i.previous(), 2.0);
    -}//t_mutable_coord_iterator
    +    c << 1.0 << 3.0 << 1.0;
    +    QVERIFY(c.contains(1.0));
    +    QVERIFY(c.contains(3.0));
    +    QVERIFY(!c.contains(0.0));
    +    QCOMPARE(c.count(1.0), 2);
    +    QCOMPARE(c.count(3.0), 1);
    +    QCOMPARE(c.count(0.0), 0);
    +    QCOMPARE(c.indexOf(1.0), 0);
    +    QCOMPARE(c.indexOf(3.0), 1);
    +    QCOMPARE(c.indexOf(1.0, -1), 2);
    +    QCOMPARE(c.indexOf(3.0, -1), -1);
    +    QCOMPARE(c.indexOf(3.0, -2), 1);
    +    QCOMPARE(c.indexOf(1.0, -3), 0);
    +    QCOMPARE(c.indexOf(1.0, -4), 0);
    +    QCOMPARE(c.indexOf(1.0, 1), 2);
    +    QCOMPARE(c.indexOf(3.0, 2), -1);
    +    QCOMPARE(c.indexOf(1.0, 2), 2);
    +    QCOMPARE(c.indexOf(1.0, 3), -1);
    +    QCOMPARE(c.indexOf(1.0, 4), -1);
    +    QCOMPARE(c.lastIndexOf(1.0), 2);
    +    QCOMPARE(c.lastIndexOf(3.0), 1);
    +    QCOMPARE(c.lastIndexOf(1.0, -1), 2);
    +    QCOMPARE(c.lastIndexOf(3.0, -1), 1);
    +    QCOMPARE(c.lastIndexOf(3.0, -2), 1);
    +    QCOMPARE(c.lastIndexOf(1.0, -3), 0);
    +    QCOMPARE(c.lastIndexOf(1.0, -4), -1);
    +    QCOMPARE(c.lastIndexOf(1.0, 1), 0);
    +    QCOMPARE(c.lastIndexOf(3.0, 2), 1);
    +    QCOMPARE(c.lastIndexOf(1.0, 2), 2);
    +    QCOMPARE(c.lastIndexOf(1.0, 3), 2);
    +    QCOMPARE(c.lastIndexOf(1.0, 4), 2);
    +    c.removeAll(3.0);
    +    QCOMPARE(c.count(), 2);
    +    c.removeAll(4.0);
    +    QCOMPARE(c.count(), 2);
    +    c.removeAll(1.0);
    +    QCOMPARE(c.count(), 0);
    +    c.removeAll(4.0);
    +    QCOMPARE(c.count(), 0);
    +}//t_search
     
     void Coordinates_test::
     t_readwrite()
    @@ -478,51 +396,6 @@
     }//t_readwrite
     
     void Coordinates_test::
    -t_search()
    -{
    -    Coordinates c;
    -    c << 1.0 << 3.0 << 1.0;
    -    QVERIFY(c.contains(1.0));
    -    QVERIFY(c.contains(3.0));
    -    QVERIFY(!c.contains(0.0));
    -    QCOMPARE(c.count(1.0), 2);
    -    QCOMPARE(c.count(3.0), 1);
    -    QCOMPARE(c.count(0.0), 0);
    -    QCOMPARE(c.indexOf(1.0), 0);
    -    QCOMPARE(c.indexOf(3.0), 1);
    -    QCOMPARE(c.indexOf(1.0, -1), 2);
    -    QCOMPARE(c.indexOf(3.0, -1), -1);
    -    QCOMPARE(c.indexOf(3.0, -2), 1);
    -    QCOMPARE(c.indexOf(1.0, -3), 0);
    -    QCOMPARE(c.indexOf(1.0, -4), 0);
    -    QCOMPARE(c.indexOf(1.0, 1), 2);
    -    QCOMPARE(c.indexOf(3.0, 2), -1);
    -    QCOMPARE(c.indexOf(1.0, 2), 2);
    -    QCOMPARE(c.indexOf(1.0, 3), -1);
    -    QCOMPARE(c.indexOf(1.0, 4), -1);
    -    QCOMPARE(c.lastIndexOf(1.0), 2);
    -    QCOMPARE(c.lastIndexOf(3.0), 1);
    -    QCOMPARE(c.lastIndexOf(1.0, -1), 2);
    -    QCOMPARE(c.lastIndexOf(3.0, -1), 1);
    -    QCOMPARE(c.lastIndexOf(3.0, -2), 1);
    -    QCOMPARE(c.lastIndexOf(1.0, -3), 0);
    -    QCOMPARE(c.lastIndexOf(1.0, -4), -1);
    -    QCOMPARE(c.lastIndexOf(1.0, 1), 0);
    -    QCOMPARE(c.lastIndexOf(3.0, 2), 1);
    -    QCOMPARE(c.lastIndexOf(1.0, 2), 2);
    -    QCOMPARE(c.lastIndexOf(1.0, 3), 2);
    -    QCOMPARE(c.lastIndexOf(1.0, 4), 2);
    -    c.removeAll(3.0);
    -    QCOMPARE(c.count(), 2);
    -    c.removeAll(4.0);
    -    QCOMPARE(c.count(), 2);
    -    c.removeAll(1.0);
    -    QCOMPARE(c.count(), 0);
    -    c.removeAll(4.0);
    -    QCOMPARE(c.count(), 0);
    -}//t_search
    -
    -void Coordinates_test::
     t_io()
     {
         Coordinates c;
    diff -Nru qhull-2015.2/src/qhulltest/PointCoordinates_test.cpp qhull-2020.2/src/qhulltest/PointCoordinates_test.cpp
    --- qhull-2015.2/src/qhulltest/PointCoordinates_test.cpp	2016-01-17 01:25:45.000000000 +0000
    +++ qhull-2020.2/src/qhulltest/PointCoordinates_test.cpp	2020-07-25 02:25:08.000000000 +0000
    @@ -1,8 +1,8 @@
     /****************************************************************************
     **
    -** Copyright (c) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/PointCoordinates_test.cpp#2 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    +** Copyright (c) 2009-2020 C.B. Barber. All rights reserved.
    +** $Id: //main/2019/qhull/src/qhulltest/PointCoordinates_test.cpp#5 $$Change: 3006 $
    +** $DateTime: 2020/07/29 18:28:16 $$Author: bbarber $
     **
     ****************************************************************************/
     
    @@ -39,7 +39,6 @@
         void t_search();
         void t_modify();
         void t_append_points();
    -    void t_coord_iterator();
         void t_io();
     };//PointCoordinates_test
     
    @@ -295,10 +294,6 @@
         i2= pc2.end();
         QVERIFY(i2-1!=i3);
         QCOMPARE(*(i2-1), *i3);
    -    foreach(QhullPoint p3, pc){ //Qt only
    -        QVERIFY(p3[0]>=0.0);
    -        QVERIFY(p3[0]<=5.0);
    -    }
         Coordinates::ConstIterator i4= pc.beginCoordinates();
         QCOMPARE(*i4, 0.0);
         Coordinates::Iterator i5= pc.beginCoordinates();
    @@ -311,6 +306,23 @@
         QCOMPARE(*--i4, 5.0);
         i5= pc.endCoordinates();
         QCOMPARE(*--i5, 5.0);
    +
    +    // Qt's 'foreach' makes a copy of std::point_coordinates.  It should not be used.
    +    bool isP3= false;
    +    int count= false;
    +    isP3= false;
    +    count= false;
    +    for(QhullPoint pt : pc){
    +        ++count;
    +        QVERIFY(pt[0] >= 0.0);
    +        QVERIFY(pt[0] <= 5.0);
    +        if(pt==p3){
    +            isP3= true;
    +            QCOMPARE(count, 3);
    +        }
    +    }
    +    QVERIFY(isP3);
    +    QCOMPARE(count, pc.count());
     }//t_foreach
     
     void PointCoordinates_test::
    @@ -400,64 +412,6 @@
     }//t_append_points
     
     void PointCoordinates_test::
    -t_coord_iterator()
    -{
    -    Qhull q;
    -    PointCoordinates c(q, 2, "2-d");
    -    c << 0.0 << 1.0 << 2.0 << 3.0 << 4.0 << 5.0;
    -    PointCoordinatesIterator i(c);
    -    QhullPoint p0(c[0]);
    -    QhullPoint p1(c[1]);
    -    QhullPoint p2(c[2]);
    -    coordT c2[] = {-1.0, -2.0};
    -    QhullPoint p3(q, 2, c2);
    -    PointCoordinatesIterator i2= c;
    -    QVERIFY(i.findNext(p1));
    -    QVERIFY(!i.findNext(p1));
    -    QVERIFY(!i.findNext(p2));
    -    QVERIFY(!i.findNext(p3));
    -    QVERIFY(i.findPrevious(p2));
    -    QVERIFY(!i.findPrevious(p2));
    -    QVERIFY(!i.findPrevious(p0));
    -    QVERIFY(!i.findPrevious(p3));
    -    QVERIFY(i2.findNext(p2));
    -    QVERIFY(i2.findPrevious(p0));
    -    QVERIFY(i2.findNext(p1));
    -    QVERIFY(i2.findPrevious(p0));
    -    QVERIFY(i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    QVERIFY(i.hasNext());
    -    QVERIFY(!i.hasPrevious());
    -    i.toBack();
    -    i2.toFront();
    -    QVERIFY(!i.hasNext());
    -    QVERIFY(i.hasPrevious());
    -    QVERIFY(i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    PointCoordinates c3(q);
    -    PointCoordinatesIterator i3= c3;
    -    QVERIFY(!i3.hasNext());
    -    QVERIFY(!i3.hasPrevious());
    -    i3.toBack();
    -    QVERIFY(!i3.hasNext());
    -    QVERIFY(!i3.hasPrevious());
    -    QCOMPARE(i.peekPrevious(), p2);
    -    QCOMPARE(i.previous(), p2);
    -    QCOMPARE(i.previous(), p1);
    -    QCOMPARE(i.previous(), p0);
    -    QVERIFY(!i.hasPrevious());
    -    QCOMPARE(i.peekNext(), p0);
    -    // i.peekNext()= 1.0; // compiler error
    -    QCOMPARE(i.next(), p0);
    -    QCOMPARE(i.peekNext(), p1);
    -    QCOMPARE(i.next(), p1);
    -    QCOMPARE(i.next(), p2);
    -    QVERIFY(!i.hasNext());
    -    i.toFront();
    -    QCOMPARE(i.next(), p0);
    -}//t_coord_iterator
    -
    -void PointCoordinates_test::
     t_io()
     {
         Qhull q;
    diff -Nru qhull-2015.2/src/qhulltest/QhullFacetList_test.cpp qhull-2020.2/src/qhulltest/QhullFacetList_test.cpp
    --- qhull-2015.2/src/qhulltest/QhullFacetList_test.cpp	2016-01-17 01:25:44.000000000 +0000
    +++ qhull-2020.2/src/qhulltest/QhullFacetList_test.cpp	2020-07-30 23:14:00.000000000 +0000
    @@ -1,8 +1,8 @@
     /****************************************************************************
     **
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullFacetList_test.cpp#3 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    +** Copyright (c) 2008-2020 C.B. Barber. All rights reserved.
    +** $Id: //main/2019/qhull/src/qhulltest/QhullFacetList_test.cpp#4 $$Change: 3009 $
    +** $DateTime: 2020/07/30 19:25:22 $$Author: bbarber $
     **
     ****************************************************************************/
     
    @@ -38,6 +38,7 @@
         void t_convert();
         void t_readonly();
         void t_foreach();
    +    void t_java_iterator();
         void t_io();
     };//QhullFacetList_test
     
    @@ -164,15 +165,65 @@
         Qhull q(rcube,"Qt QR0");  // triangulation of rotated unit cube
         QhullFacetList fs= q.facetList();
         QVERIFY(fs.contains(q.firstFacet()));
    -    QhullFacet f= q.firstFacet().next();
    -    QVERIFY(fs.contains(f));
    +    QhullFacet f2= q.firstFacet().next();
    +    QVERIFY(fs.contains(f2));
         QCOMPARE(fs.first(), *fs.begin());
         QCOMPARE(*(fs.end()-1), fs.last());
         QCOMPARE(fs.first(), q.firstFacet());
         QCOMPARE(*fs.begin(), q.beginFacet());
         QCOMPARE(*fs.end(), q.endFacet());
    +
    +    bool isF2= false;
    +    int count= 0;
    +    foreach(QhullFacet f, q.facetList()){  // Qt only
    +        ++count;
    +        if(f==f2){
    +            isF2= true;
    +            QCOMPARE(count, 2);
    +        }
    +    }
    +    QVERIFY(isF2);
    +    QCOMPARE(count, q.facetCount());
    +    QCOMPARE(count, fs.count());
    +
    +    isF2= false;
    +    count= 0;
    +    for(QhullFacet f : q.facetList()){
    +        ++count;
    +        if(f==f2){
    +            isF2= true;
    +            QCOMPARE(count, 2);
    +        }
    +    }
    +    QVERIFY(isF2);
    +    QCOMPARE(count, q.facetCount());
    +    QCOMPARE(count, fs.count());
     }//t_foreach
     
    +//! \see QhullLinkedList_test::t_QhullLinkedList_iterator
    +void QhullFacetList_test::
    +t_java_iterator()
    +{
    +    RboxPoints rcube("c");
    +    Qhull q(rcube, "Qt QR0");  // triangulation of rotated unit cube
    +    QhullFacet f2= q.firstFacet().next();
    +
    +    bool isF2= false;
    +    int count= 0;
    +    QhullFacetListIterator i(q.facetList());
    +    while(i.hasNext()){
    +        QhullFacet f= i.next();
    +        QCOMPARE(i.peekPrevious(), f);
    +        ++count;
    +        if(f==f2){
    +            isF2= true;
    +            QCOMPARE(count, 2);
    +        }
    +    }
    +    QVERIFY(isF2);
    +    QCOMPARE(count, q.facetCount());
    +}//t_java_iterator
    +
     void QhullFacetList_test::
     t_io()
     {
    diff -Nru qhull-2015.2/src/qhulltest/QhullFacetSet_test.cpp qhull-2020.2/src/qhulltest/QhullFacetSet_test.cpp
    --- qhull-2015.2/src/qhulltest/QhullFacetSet_test.cpp	2016-01-17 01:25:44.000000000 +0000
    +++ qhull-2020.2/src/qhulltest/QhullFacetSet_test.cpp	2020-07-30 23:15:33.000000000 +0000
    @@ -1,8 +1,8 @@
     /****************************************************************************
     **
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullFacetSet_test.cpp#3 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    +** Copyright (c) 2008-2020 C.B. Barber. All rights reserved.
    +** $Id: //main/2019/qhull/src/qhulltest/QhullFacetSet_test.cpp#5 $$Change: 3009 $
    +** $DateTime: 2020/07/30 19:25:22 $$Author: bbarber $
     **
     ****************************************************************************/
     
    @@ -35,6 +35,7 @@
         void t_convert();
         void t_readonly();
         void t_foreach();
    +    void t_java_iterator();
         void t_io();
     };//QhullFacetSet_test
     
    @@ -123,16 +124,63 @@
         QhullFacetSet fs= q.firstFacet().neighborFacets();
         QVERIFY(!fs.contains(q.firstFacet()));
         QVERIFY(fs.contains(fs.first()));
    -    QhullFacet f= q.firstFacet().next();
    -    if(!fs.contains(f)){  // check if 'f' is the facet opposite firstFacet()
    -        f= f.next();
    +    QhullFacet f2= q.firstFacet().next();
    +    if(!fs.contains(f2)){  // check if 'f2' is the facet opposite firstFacet()
    +        f2= f2.next();
         }
    -    QVERIFY(fs.contains(f));
    +    QVERIFY(fs.contains(f2));
         QCOMPARE(fs.first(), *fs.begin());
         QCOMPARE(*(fs.end()-1), fs.last());
    +
    +    bool isF2= false;
    +    int count= 0;
    +    foreach(QhullFacet f, q.firstFacet().neighborFacets()){ // Qt only
    +        ++count;
    +        if(f==f2){
    +            isF2= true;
    +        }
    +    }
    +    QVERIFY(isF2);
    +    QCOMPARE(count, fs.count());
    +
    +    isF2= false;
    +    count= 0;
    +    for(QhullFacet f : q.firstFacet().neighborFacets()){
    +        ++count;
    +        if(f==f2){
    +            isF2= true;
    +        }
    +    }
    +    QVERIFY(isF2);
    +    QCOMPARE(count, fs.count());
     }//t_foreach
     
     void QhullFacetSet_test::
    +t_java_iterator()
    +{
    +    RboxPoints rcube("c");
    +    // Spot check predicates and accessors.  See QhullLinkedList_test
    +    Qhull q(rcube, "QR0");  // rotated unit cube
    +    QhullFacetSet fs= q.firstFacet().neighborFacets();
    +    QhullFacet f2= fs.at(1);
    +
    +    bool isF2= false;
    +    int count= 0;
    +    QhullFacetSetIterator i(q.firstFacet().neighborFacets());
    +    while(i.hasNext()){
    +        QhullFacet f= i.next();
    +        QCOMPARE(i.peekPrevious(), f);
    +        ++count;
    +        if(f==f2){
    +            isF2= true;
    +            QCOMPARE(count, 2);
    +        }
    +    }
    +    QVERIFY(isF2);
    +    QCOMPARE(count, fs.count());
    +}//t_java_iterator
    +
    +void QhullFacetSet_test::
     t_io()
     {
         RboxPoints rcube("c");
    diff -Nru qhull-2015.2/src/qhulltest/QhullFacet_test.cpp qhull-2020.2/src/qhulltest/QhullFacet_test.cpp
    --- qhull-2015.2/src/qhulltest/QhullFacet_test.cpp	2016-01-17 01:25:44.000000000 +0000
    +++ qhull-2020.2/src/qhulltest/QhullFacet_test.cpp	2020-07-25 02:25:08.000000000 +0000
    @@ -1,8 +1,8 @@
     /****************************************************************************
     **
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullFacet_test.cpp#4 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    +** Copyright (c) 2008-2020 C.B. Barber. All rights reserved.
    +** $Id: //main/2019/qhull/src/qhulltest/QhullFacet_test.cpp#6 $$Change: 3006 $
    +** $DateTime: 2020/07/29 18:28:16 $$Author: bbarber $
     **
     ****************************************************************************/
     
    @@ -38,6 +38,7 @@
         void t_construct_qh();
         void t_constructConvert();
         void t_getSet();
    +    void t_getSet2d();
         void t_value();
         void t_foreach();
         void t_io();
    @@ -103,20 +104,41 @@
             while(i.hasNext()){
                 const QhullFacet f= i.next();
                 cout << f.id() << endl;
    +            QhullFacet f2;
    +            f2.setFacetT(f.qh(), f.getFacetT());
    +            QCOMPARE(f, f2);
                 QCOMPARE(f.dimension(),3);
                 QVERIFY(f.id()>0 && f.id()<=39);
                 QVERIFY(f.isValid());
                 if(i.hasNext()){
                     QCOMPARE(f.next(), i.peekNext());
                     QVERIFY(f.next()!=f);
    -            }
    +                QCOMPARE(f.next().previous(), f);
    +                QVERIFY(f.hasNext());
    +                QVERIFY(f.next().hasPrevious());
    +            }else
    +              QVERIFY(!f.hasNext());
                 QVERIFY(i.hasPrevious());
                 QCOMPARE(f, i.peekPrevious());
             }
    -
    +        while(i.hasPrevious()){
    +          const QhullFacet f= i.previous();
    +          cout << f.id() << endl;
    +          QVERIFY(f.isValid());
    +          if(i.hasPrevious()){
    +            QVERIFY(f.hasPrevious());
    +            QCOMPARE(f.previous(), i.peekPrevious());
    +            QVERIFY(f.previous()!=f);
    +            QVERIFY(f.previous().hasNext());
    +            QCOMPARE(f.previous().next(), f);
    +          }else
    +            QVERIFY(!f.hasPrevious());
    +          QVERIFY(i.hasNext());
    +          QCOMPARE(f, i.peekNext());
    +        }
             // test tricoplanarOwner
    -        QhullFacet facet = q.beginFacet();
    -        QhullFacet tricoplanarOwner = facet.tricoplanarOwner();
    +        QhullFacet facet= q.beginFacet();
    +        QhullFacet tricoplanarOwner= facet.tricoplanarOwner();
             int tricoplanarCount= 0;
             i.toFront();
             while(i.hasNext()){
    @@ -128,23 +150,26 @@
             QCOMPARE(tricoplanarCount, 2);
             int tricoplanarCount2= 0;
             foreach (QhullFacet f, q.facetList()){  // Qt only
    +            QhullHyperplane hi= f.innerplane();
    +            QCOMPARE(hi.count(), 3);
    +            double innerOffset= hi.offset() + 0.5;
    +            cout << "InnerPlane: " << hi << "   innerOffset+0.5 " << innerOffset << endl;
                 QhullHyperplane h= f.hyperplane();
    -            cout << "Hyperplane: " << h;
    +            double offset= h.offset() + 0.5;
    +            cout << "Hyperplane: " << h << "   offset+0.5 " << offset << endl;
                 QCOMPARE(h.count(), 3);
                 QCOMPARE(h.offset(), -0.5);
                 double n= h.norm();
                 QCOMPARE(n, 1.0);
    -            QhullHyperplane hi= f.innerplane();
    -            QCOMPARE(hi.count(), 3);
    -            double innerOffset= hi.offset()+0.5;
    -            cout << "InnerPlane: " << hi << "   innerOffset+0.5 " << innerOffset << endl;
    -            QVERIFY(innerOffset >= 0.0-(2*q.distanceEpsilon())); // A guessed epsilon.  It needs to account for roundoff due to rotation of the vertices
                 QhullHyperplane ho= f.outerplane();
                 QCOMPARE(ho.count(), 3);
                 double outerOffset= ho.offset()+0.5;
                 cout << "OuterPlane: " << ho << "   outerOffset+0.5 " << outerOffset << endl;
    -            QVERIFY(outerOffset <= 0.0+(2*q.distanceEpsilon())); // A guessed epsilon.  It needs to account for roundoff due to rotation of the vertices
    -            QVERIFY(outerOffset-innerOffset < 1e-7);
    +            QVERIFY(offset < innerOffset); // the outerOffset is more negative than the innerOffset.  The expected values are -0.5 for the unit cube centered at the origin
    +            QVERIFY(outerOffset < offset); // QR1595623290 was 8.4x,   innerOffset+0.5 9.71445e-15, 2.5e-16 max. distance of a new vertex to a facet
    +            QVERIFY2(fabs(innerOffset) < (10 * q.distanceEpsilon()), "Guessed epsilon from -0.5 due to rotation");   
    +            QVERIFY2(fabs(outerOffset) < (10 * q.distanceEpsilon()), "Guessed epsilon from -0.5 due to rotation");
    +
                 for(int k= 0; k<3; k++){
                     QVERIFY(ho[k]==hi[k]);
                     QVERIFY(ho[k]==h[k]);
    @@ -191,6 +216,26 @@
     }//t_getSet
     
     void QhullFacet_test::
    +t_getSet2d()
    +{
    +    RboxPoints rsquare("c D2");
    +    Qhull q(rsquare, "o");  // convex hull of square
    +    q.setOutputStream(&cout);
    +    cout << "Points and facets.  Facet vertices in counter-clockwise order (option 'o')\n";
    +    q.outputQhull();
    +    int n= q.facetCount();
    +    QhullFacet f= q.firstFacet();
    +    QhullVertex v;
    +    cout << "Facets and vertices in counter-clockwise order (f.nextFacet2d)\n";
    +    for(int i= 0; isetOutputStream(&os3);
             q.outputQhull("f");
    diff -Nru qhull-2015.2/src/qhulltest/QhullHyperplane_test.cpp qhull-2020.2/src/qhulltest/QhullHyperplane_test.cpp
    --- qhull-2015.2/src/qhulltest/QhullHyperplane_test.cpp	2016-01-17 22:00:44.000000000 +0000
    +++ qhull-2020.2/src/qhulltest/QhullHyperplane_test.cpp	2020-07-24 20:08:50.000000000 +0000
    @@ -1,8 +1,8 @@
     /****************************************************************************
     **
    -** Copyright (c) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullHyperplane_test.cpp#4 $$Change: 2064 $
    -** $DateTime: 2016/01/18 12:36:08 $$Author: bbarber $
    +** Copyright (c) 2009-2020 C.B. Barber. All rights reserved.
    +** $Id: //main/2019/qhull/src/qhulltest/QhullHyperplane_test.cpp#4 $$Change: 3001 $
    +** $DateTime: 2020/07/24 20:43:28 $$Author: bbarber $
     **
     ****************************************************************************/
     
    @@ -45,7 +45,9 @@
         void t_operator();
         void t_iterator();
         void t_const_iterator();
    +    void t_foreach();
         void t_qhullHyperplane_iterator();
    +    void t_java_iterator();
         void t_io();
     };//QhullHyperplane_test
     
    @@ -367,11 +369,44 @@
     }//t_const_iterator
     
     void QhullHyperplane_test::
    +t_foreach()
    +{
    +    RboxPoints rcube("c");
    +    Qhull q(rcube, "QR0");  // rotated unit cube
    +    QhullHyperplane h= q.firstFacet().hyperplane();
    +    coordT c2= (h.coordinates())[1];
    +    
    +    bool isC2= false;
    +    int count= 0;
    +    foreach(coordT c, q.firstFacet().hyperplane()){
    +        ++count;
    +        if(c==c2){
    +            isC2= true;
    +            QCOMPARE(count, 2);
    +        }
    +    }
    +    QVERIFY(isC2);
    +    QCOMPARE(count, q.dimension());
    +    
    +    isC2= false;
    +    count= 0;
    +    for(coordT c : q.firstFacet().hyperplane()){
    +        ++count;
    +        if(c==c2){
    +            isC2= true;
    +            QCOMPARE(count, 2);
    +        }
    +    }
    +    QVERIFY(isC2);
    +    QCOMPARE(count, q.dimension());
    +}//t_foreach
    +
    +void QhullHyperplane_test::
     t_qhullHyperplane_iterator()
     {
         RboxPoints rcube("c");
         Qhull q(rcube,"QR0");  // rotated unit cube
    -    QhullHyperplane h = q.firstFacet().hyperplane();
    +    QhullHyperplane h= q.firstFacet().hyperplane();
         QhullHyperplaneIterator i2(h);
         QCOMPARE(h.dimension(), 3);
         QhullHyperplaneIterator i= h;
    @@ -405,6 +440,29 @@
     }//t_qhullHyperplane_iterator
     
     void QhullHyperplane_test::
    +t_java_iterator()
    +{
    +    RboxPoints rcube("c");
    +    Qhull q(rcube, "QR0");  // rotated unit cube
    +    QhullHyperplane h= q.firstFacet().hyperplane();
    +    coordT c2= (h.coordinates())[1];
    +    
    +    bool isC2= false;
    +    int count= 0;
    +    QhullHyperplaneIterator i(q.firstFacet().hyperplane());
    +    while(i.hasNext()){
    +        coordT c= i.next();
    +        ++count;
    +        if(c==c2){
    +            isC2= true;
    +            QCOMPARE(count, 2);
    +        }
    +    }
    +    QVERIFY(isC2);
    +    QCOMPARE(count, q.dimension());
    +}//t_java_iterator
    +
    +void QhullHyperplane_test::
     t_io()
     {
         RboxPoints rcube("c");
    diff -Nru qhull-2015.2/src/qhulltest/QhullLinkedList_test.cpp qhull-2020.2/src/qhulltest/QhullLinkedList_test.cpp
    --- qhull-2015.2/src/qhulltest/QhullLinkedList_test.cpp	2016-01-17 01:25:44.000000000 +0000
    +++ qhull-2020.2/src/qhulltest/QhullLinkedList_test.cpp	2020-07-30 23:15:33.000000000 +0000
    @@ -1,8 +1,8 @@
     /****************************************************************************
     **
    -** Copyright (c) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullLinkedList_test.cpp#3 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    +** Copyright (c) 2009-2020 C.B. Barber. All rights reserved.
    +** $Id: //main/2019/qhull/src/qhulltest/QhullLinkedList_test.cpp#5 $$Change: 3009 $
    +** $DateTime: 2020/07/30 19:25:22 $$Author: bbarber $
     **
     ****************************************************************************/
     
    @@ -30,7 +30,9 @@
         void t_search();
         void t_iterator();
         void t_const_iterator();
    +    void t_foreach();
         void t_QhullLinkedList_iterator();
    +    void t_java_iterator();
         void t_io();
     };//QhullLinkedList_test
     
    @@ -55,11 +57,11 @@
         {
             Qhull q(rcube,"Qt QR0");  // triangulation of rotated unit cube
             QCOMPARE(q.facetCount(), 12);
    -        QhullVertexList vs = QhullVertexList(q.beginVertex(), q.endVertex());
    +        QhullVertexList vs= QhullVertexList(q.beginVertex(), q.endVertex());
             QCOMPARE(vs.count(), 8);
             QCOMPARE(vs.size(), 8u);
             QVERIFY(!vs.isEmpty());
    -        QhullVertexList vs2 = q.vertexList();
    +        QhullVertexList vs2= q.vertexList();
             QCOMPARE(vs2.count(), 8);
             QCOMPARE(vs2.size(),8u);
             QVERIFY(!vs2.isEmpty());
    @@ -77,7 +79,7 @@
         {
             Qhull q(rcube,"Qt QR0");  // triangulation of rotated unit cube
             QCOMPARE(q.facetCount(), 12);
    -        QhullVertexList vs = q.vertexList();
    +        QhullVertexList vs= q.vertexList();
             QCOMPARE(vs.size(), 8u);
             QVERIFY(!vs.isEmpty());
             std::vector vs2= vs.toStdVector();
    @@ -107,7 +109,7 @@
     {
         RboxPoints rcube("c");
         Qhull q(rcube,"QR0");  // rotated unit cube
    -    QhullVertexList vs = q.vertexList();
    +    QhullVertexList vs= q.vertexList();
         QhullVertex v= vs.first();
         QCOMPARE(v.previous(), QhullVertex(NULL));
         QCOMPARE(vs.front(), vs.first());
    @@ -122,7 +124,7 @@
     {
         RboxPoints rcube("c");
         Qhull q(rcube,"QR0");  // rotated unit cube
    -    QhullVertexList vs = q.vertexList();
    +    QhullVertexList vs= q.vertexList();
         QhullVertex v(q);
         QVERIFY(!vs.contains(v));
         QCOMPARE(vs.count(v), 0);
    @@ -140,7 +142,7 @@
         RboxPoints rcube("c");
         {
             Qhull q(rcube,"QR0");  // rotated unit cube
    -        QhullVertexList vs = q.vertexList();
    +        QhullVertexList vs= q.vertexList();
             QhullVertexList::Iterator i= vs.begin();
             QhullVertexList::iterator i2= vs.begin();
             QVERIFY(i==i2);
    @@ -201,7 +203,7 @@
         RboxPoints rcube("c");
         {
             Qhull q(rcube,"QR0");  // rotated unit cube
    -        QhullVertexList vs = q.vertexList();
    +        QhullVertexList vs= q.vertexList();
             QhullVertexList::ConstIterator i= vs.begin();
             QhullVertexList::const_iterator i2= vs.begin();
             QVERIFY(i==i2);
    @@ -249,6 +251,42 @@
     }//t_const_iterator
     
     void QhullLinkedList_test::
    +t_foreach()
    +{
    +    RboxPoints rcube("c");
    +    // Spot check predicates and accessors.  See QhullLinkedList_test
    +    Qhull q(rcube, "QR0");  // rotated unit cube
    +    QhullVertex v2= q.firstVertex().next();
    +    QhullVertexList vs= q.vertexList();
    +
    +    bool isV2= false;
    +    int count= 0;
    +    foreach(QhullVertex v, q.vertexList()) { // Qt only
    +        ++count;
    +        if(v==v2){
    +            isV2= true;
    +            QCOMPARE(count, 2);
    +        }
    +    }
    +    QVERIFY(isV2);
    +    QCOMPARE(count, q.vertexCount());
    +    QCOMPARE(count, vs.count());
    +
    +    isV2= false;
    +    count= 0;
    +    for(QhullVertex v : q.vertexList()){
    +        ++count;
    +        if(v==v2){
    +            isV2= true;
    +            QCOMPARE(count, 2);
    +        }
    +    }
    +    QVERIFY(isV2);
    +    QCOMPARE(count, q.vertexCount());
    +    QCOMPARE(count, vs.count());
    +}//t_foreach
    +
    +void QhullLinkedList_test::
     t_QhullLinkedList_iterator()
     {
         RboxPoints rcube("c");
    @@ -262,7 +300,7 @@
         QVERIFY(!i.hasNext());
         QVERIFY(!i.hasPrevious());
     
    -    QhullVertexList vs2 = q.vertexList();
    +    QhullVertexList vs2= q.vertexList();
         QhullVertexListIterator i2(vs2);
         QCOMPARE(vs2.count(), 8);
         i= vs2;
    @@ -278,7 +316,7 @@
         QVERIFY(!i.hasPrevious());
     
         // i at front, i2 at end/back, 4 neighbors
    -    QhullVertexList vs3 = q.vertexList(); // same as vs2
    +    QhullVertexList vs3= q.vertexList(); // same as vs2
         QhullVertex v3(vs3.first());
         QhullVertex v4= vs3.first();
         QCOMPARE(v3, v4);
    @@ -315,6 +353,32 @@
     }//t_QhullLinkedList_iterator
     
     void QhullLinkedList_test::
    +t_java_iterator()
    +{
    +    RboxPoints rcube("c");
    +    // Spot check predicates and accessors.  See QhullLinkedList_test
    +    Qhull q(rcube, "QR0");  // rotated unit cube
    +    QhullVertex v2= q.firstVertex().next();
    +    QhullVertexList vs= q.vertexList();
    +
    +    bool isV2= false;
    +    int count= 0;
    +    QhullVertexListIterator i(q.vertexList());
    +    while(i.hasNext()){
    +        QhullVertex v= i.next();
    +        QCOMPARE(i.peekPrevious(), v);
    +        ++count;
    +        if(v==v2){
    +            isV2= true;
    +            QCOMPARE(count, 2);
    +        }
    +    }
    +    QVERIFY(isV2);
    +    QCOMPARE(count, q.vertexCount());
    +    QCOMPARE(count, vs.count());
    +}//t_java_iterator
    +
    +void QhullLinkedList_test::
     t_io()
     {
         RboxPoints rcube("c");
    diff -Nru qhull-2015.2/src/qhulltest/QhullPointSet_test.cpp qhull-2020.2/src/qhulltest/QhullPointSet_test.cpp
    --- qhull-2015.2/src/qhulltest/QhullPointSet_test.cpp	2016-01-17 01:25:45.000000000 +0000
    +++ qhull-2020.2/src/qhulltest/QhullPointSet_test.cpp	2020-07-30 23:14:14.000000000 +0000
    @@ -1,8 +1,8 @@
     /****************************************************************************
     **
    -** Copyright (p) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullPointSet_test.cpp#3 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    +** Copyright (p) 2009-2020 C.B. Barber. All rights reserved.
    +** $Id: //main/2019/qhull/src/qhulltest/QhullPointSet_test.cpp#4 $$Change: 3009 $
    +** $DateTime: 2020/07/30 19:25:22 $$Author: bbarber $
     **
     ****************************************************************************/
     
    @@ -36,7 +36,9 @@
         void t_iterator();
         void t_const_iterator();
         void t_search();
    +    void t_foreach();
         void t_pointset_iterator();
    +    void t_java_iterator();
         void t_io();
     };//QhullPointSet_test
     
    @@ -267,7 +269,6 @@
         // QhullPointSet is const-only
     }//t_const_iterator
     
    -
     void QhullPointSet_test::
     t_search()
     {
    @@ -296,6 +297,41 @@
     }//t_search
     
     void QhullPointSet_test::
    +t_foreach()
    +{
    +    RboxPoints rcube("c W0 1000");
    +    Qhull q(rcube,"Qc");  // cube with 1000 coplanar points
    +    QhullFacet f= q.firstFacet();
    +    QhullPointSet ps= f.coplanarPoints();
    +    QVERIFY(ps.count()>=3);  // Sometimes no coplanar points
    +    QhullPoint p2= ps.at(1);
    +
    +    bool isP2= false;
    +    int count= 0;
    +    foreach(QhullPoint p, f.coplanarPoints()){  // Qt only
    +        ++count;
    +        if(p==p2){
    +            isP2= true;
    +            QCOMPARE(count, 2);
    +        }
    +    }
    +    QVERIFY(isP2);
    +    QCOMPARE(count, ps.count());
    +
    +    isP2= false;
    +    count= 0;
    +    for(QhullPoint p : f.coplanarPoints()){
    +        ++count;
    +        if(p==p2){
    +            isP2= true;
    +            QCOMPARE(count, 2);
    +        }
    +    }
    +    QVERIFY(isP2);
    +    QCOMPARE(count, ps.count());
    +}//t_foreach
    +
    +void QhullPointSet_test::
     t_pointset_iterator()
     {
         RboxPoints rcube("c W0 1000");
    @@ -354,6 +390,32 @@
     }//t_pointset_iterator
     
     void QhullPointSet_test::
    +t_java_iterator()
    +{
    +    RboxPoints rcube("c W0 1000");
    +    Qhull q(rcube,"Qc");  // cube with 1000 coplanar points
    +    QhullFacet f= q.firstFacet();
    +    QhullPointSet ps= f.coplanarPoints();
    +    QVERIFY(ps.count()>=3);  // Sometimes no coplanar points
    +    QhullPoint p2= ps.at(1);
    +
    +    bool isP2= false;
    +    int count= 0;
    +    QhullPointSetIterator i(f.coplanarPoints());
    +    while(i.hasNext()){
    +        QhullPoint p= i.next();
    +        QCOMPARE(i.peekPrevious(), p);
    +        ++count;
    +        if(p==p2){
    +            isP2= true;
    +            QCOMPARE(count, 2);
    +        }
    +    }
    +    QVERIFY(isP2);
    +    QCOMPARE(count, ps.count());
    +}//t_java_iterator
    +
    +void QhullPointSet_test::
     t_io()
     {
         ostringstream os;
    diff -Nru qhull-2015.2/src/qhulltest/QhullPoints_test.cpp qhull-2020.2/src/qhulltest/QhullPoints_test.cpp
    --- qhull-2015.2/src/qhulltest/QhullPoints_test.cpp	2016-01-17 01:25:45.000000000 +0000
    +++ qhull-2020.2/src/qhulltest/QhullPoints_test.cpp	2020-07-24 20:41:17.000000000 +0000
    @@ -1,8 +1,8 @@
     /****************************************************************************
     **
    -** Copyright (p) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullPoints_test.cpp#3 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    +** Copyright (p) 2009-2020 C.B. Barber. All rights reserved.
    +** $Id: //main/2019/qhull/src/qhulltest/QhullPoints_test.cpp#3 $$Change: 3001 $
    +** $DateTime: 2020/07/24 20:43:28 $$Author: bbarber $
     **
     ****************************************************************************/
     
    @@ -34,8 +34,10 @@
         void t_element();
         void t_iterator();
         void t_const_iterator();
    +    void t_foreach();
         void t_search();
         void t_points_iterator();
    +    void t_java_iterator();
         void t_io();
     };//QhullPoints_test
     
    @@ -430,6 +432,36 @@
         // QhullPoints is const-only
     }//t_const_iterator
     
    +void QhullPoints_test::
    +t_foreach()
    +{
    +    RboxPoints rcube("c");
    +    Qhull q(rcube, "QR0");  // rotated unit cube
    +    QhullPoints ps= q.points();
    +    QhullPoint p2= ps.at(1);
    +
    +    bool isP2= false;
    +    int count= 0;
    +    foreach(QhullPoint p, q.points()) { // Qt only
    +        ++count;
    +        if(p==p2){
    +            isP2= true;
    +        }
    +    }
    +    QVERIFY(isP2);
    +    QCOMPARE(count, ps.count());
    +
    +    isP2= false;
    +    count= 0;
    +    for(QhullPoint p : q.points()) {
    +        ++count;
    +        if(p==p2){
    +            isP2= true;
    +        }
    +    }
    +    QVERIFY(isP2);
    +    QCOMPARE(count, ps.count());
    +}//t_foreach
     
     void QhullPoints_test::
     t_search()
    @@ -535,6 +567,29 @@
     }//t_points_iterator
     
     void QhullPoints_test::
    +t_java_iterator()
    +{
    +    RboxPoints rcube("c");
    +    Qhull q(rcube, "QR0");  // rotated unit cube
    +    QhullPoints ps= q.points();
    +    QhullPoint p2= ps.at(1);
    +
    +    bool isP2= false;
    +    int count= 0;
    +    QhullPointsIterator i(q.points());
    +    while(i.hasNext()){
    +        QhullPoint p= i.next();
    +        QCOMPARE(i.peekPrevious(), p);
    +        ++count;
    +        if(p==p2){
    +            isP2= true;
    +        }
    +    }
    +    QVERIFY(isP2);
    +    QCOMPARE(count, ps.count());
    +}//t_java_iterator
    +
    +void QhullPoints_test::
     t_io()
     {
         Qhull q;
    diff -Nru qhull-2015.2/src/qhulltest/QhullPoint_test.cpp qhull-2020.2/src/qhulltest/QhullPoint_test.cpp
    --- qhull-2015.2/src/qhulltest/QhullPoint_test.cpp	2016-01-17 01:25:44.000000000 +0000
    +++ qhull-2020.2/src/qhulltest/QhullPoint_test.cpp	2020-07-25 02:25:08.000000000 +0000
    @@ -1,8 +1,8 @@
     /****************************************************************************
     **
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullPoint_test.cpp#3 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    +** Copyright (c) 2008-2020 C.B. Barber. All rights reserved.
    +** $Id: //main/2019/qhull/src/qhulltest/QhullPoint_test.cpp#5 $$Change: 3006 $
    +** $DateTime: 2020/07/29 18:28:16 $$Author: bbarber $
     **
     ****************************************************************************/
     
    @@ -42,7 +42,9 @@
         void t_operator();
         void t_iterator();
         void t_const_iterator();
    +    void t_foreach();
         void t_qhullpoint_iterator();
    +    void t_java_iterator();
         void t_method();
         void t_io();
     };//QhullPoint_test
    @@ -355,6 +357,39 @@
     }//t_const_iterator
     
     void QhullPoint_test::
    +t_foreach()
    +{
    +    RboxPoints rcube("c");
    +    Qhull q(rcube, "QR0");  // rotated unit cube
    +    QhullPoint p= q.firstVertex().point();
    +    coordT c2= (p.coordinates())[1];
    +
    +    bool isC2= false;
    +    int count= 0;
    +    foreach(coordT c, q.firstVertex().point()){  // Qt only
    +        ++count;
    +        if(c==c2){
    +            isC2= true;
    +            QCOMPARE(count, 2);
    +        }
    +    }
    +    QVERIFY(isC2);
    +    QCOMPARE(count, p.dimension());
    +
    +    isC2= false;
    +    count= 0;
    +    for(coordT c : q.firstVertex().point()){
    +        ++count;
    +        if(c==c2){
    +            isC2= true;
    +            QCOMPARE(count, 2);
    +        }
    +    }
    +    QVERIFY(isC2);
    +    QCOMPARE(count, p.dimension());
    +}//t_foreach
    +
    +void QhullPoint_test::
     t_qhullpoint_iterator()
     {
         RboxPoints rcube("c");
    @@ -369,7 +404,7 @@
         QVERIFY(!i.hasNext());
         QVERIFY(!i.hasPrevious());
     
    -    QhullPoint p = q.firstVertex().point();
    +    QhullPoint p= q.firstVertex().point();
         QhullPointIterator i2(p);
         QCOMPARE(p.dimension(), 3);
         i= p;
    @@ -403,12 +438,36 @@
     }//t_qhullpoint_iterator
     
     void QhullPoint_test::
    +t_java_iterator()
    +{
    +    RboxPoints rcube("c");
    +    Qhull q(rcube, "QR0");  // rotated unit cube
    +    QhullPoint p= q.firstVertex().point();
    +    coordT c2= (p.coordinates())[1];
    +
    +    bool isC2= false;
    +    int count= 0;
    +    QhullPointIterator i(q.firstVertex().point());
    +    while(i.hasNext()){
    +        coordT c= i.next();
    +        QCOMPARE(i.peekPrevious(), c);
    +        ++count;
    +        if(c==c2){
    +            isC2= true;
    +            QCOMPARE(count, 2);
    +        }
    +    }
    +    QVERIFY(isC2);
    +    QCOMPARE(count, p.dimension());
    +}//t_java_iterator
    +
    +void QhullPoint_test::
     t_method()
     {
         // advancePoint tested above
         RboxPoints rcube("c");
         Qhull q(rcube, "");
    -    QhullPoint p = q.firstVertex().point();
    +    QhullPoint p= q.firstVertex().point();
         double dist= p.distance(q.origin());
         QCOMPARE(dist, sqrt(double(2.0+1.0))/2); // half diagonal of unit cube
     }//t_qhullpoint_iterator
    diff -Nru qhull-2015.2/src/qhulltest/QhullRidge_test.cpp qhull-2020.2/src/qhulltest/QhullRidge_test.cpp
    --- qhull-2015.2/src/qhulltest/QhullRidge_test.cpp	2016-01-17 01:25:45.000000000 +0000
    +++ qhull-2020.2/src/qhulltest/QhullRidge_test.cpp	2020-07-24 20:26:17.000000000 +0000
    @@ -1,8 +1,8 @@
     /****************************************************************************
     **
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullRidge_test.cpp#3 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    +** Copyright (c) 2008-2020 C.B. Barber. All rights reserved.
    +** $Id: //main/2019/qhull/src/qhulltest/QhullRidge_test.cpp#4 $$Change: 3001 $
    +** $DateTime: 2020/07/24 20:43:28 $$Author: bbarber $
     **
     ****************************************************************************/
     
    @@ -34,6 +34,7 @@
         void t_construct();
         void t_getSet();
         void t_foreach();
    +    void t_java_iterator();
         void t_io();
     };//QhullRidge_test
     
    @@ -90,6 +91,9 @@
             while(i.hasNext()){
                 const QhullRidge r= i.next();
                 cout << r.id() << endl;
    +            QhullRidge r2;
    +            r2.setRidgeT(r.qh(), r.getRidgeT());
    +            QCOMPARE(r, r2);
                 QVERIFY(r.bottomFacet()!=r.topFacet());
                 QCOMPARE(r.dimension(), 2); // Ridge one-dimension less than facet
                 QVERIFY(r.id()>=0 && r.id()<9*27);
    @@ -109,10 +113,10 @@
         {
             Qhull q(rcube, "QR0"); // rotated cube
             QhullFacet f(q.firstFacet());
    -        foreach (const QhullRidge &r, f.ridges()){  // Qt only
    +        foreach(const QhullRidge &r, f.ridges()){  // Qt only
                 QhullVertexSet vs= r.vertices();
                 QCOMPARE(vs.count(), 2);
    -            foreach (const QhullVertex &v, vs){  // Qt only
    +            foreach(const QhullVertex &v, vs){  // Qt only
                     QVERIFY(f.vertices().contains(v));
                 }
             }
    @@ -133,10 +137,62 @@
             }
             QCOMPARE(vs.count(), rs.count());
             QCOMPARE(count, rs.count());
    +
    +        r2= rs.at(1);
    +        bool isR2= false;
    +        count= 0;
    +        foreach(const QhullRidge &r, f.ridges()) {  // Qt only
    +            ++count;
    +            if(r==r2){
    +                isR2= true;
    +                QCOMPARE(count, 2);
    +            }
    +        }
    +        QVERIFY(isR2);
    +        QCOMPARE(count, rs.count());
    +
    +        isR2= false;
    +        count= 0;
    +        for(const QhullRidge &r : f.ridges()) {
    +            ++count;
    +            if(r==r2){
    +                isR2= true;
    +                QCOMPARE(count, 2);
    +            }
    +        }
    +        QVERIFY(isR2);
    +        QCOMPARE(count, rs.count());
         }
     }//t_foreach
     
     void QhullRidge_test::
    +t_java_iterator()
    +{
    +    RboxPoints rcube("c");  // cube
    +    {
    +        Qhull q(rcube, "QR0"); // rotated cube
    +        QhullFacet f(q.firstFacet());
    +        QhullRidgeSet rs= f.ridges();
    +        QhullRidge r2= rs.at(1);
    +
    +        bool isR2= false;
    +        int count= 0;
    +        QhullRidgeSetIterator i(f.ridges());
    +        while(i.hasNext()){
    +            QhullRidge r= i.next();
    +            QCOMPARE(i.peekPrevious(), r);
    +            ++count;
    +            if(r==r2){
    +                isR2= true;
    +                QCOMPARE(count, 2);
    +            }
    +        }
    +        QVERIFY(isR2);
    +        QCOMPARE(count, rs.count());
    +    }
    +}//t_java_iterator
    +
    +void QhullRidge_test::
     t_io()
     {
         RboxPoints rcube("c");
    diff -Nru qhull-2015.2/src/qhulltest/QhullSet_test.cpp qhull-2020.2/src/qhulltest/QhullSet_test.cpp
    --- qhull-2015.2/src/qhulltest/QhullSet_test.cpp	2016-01-17 01:25:45.000000000 +0000
    +++ qhull-2020.2/src/qhulltest/QhullSet_test.cpp	2020-07-30 23:15:33.000000000 +0000
    @@ -1,8 +1,8 @@
     /****************************************************************************
     **
    -** Copyright (c) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullSet_test.cpp#3 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    +** Copyright (c) 2009-2020 C.B. Barber. All rights reserved.
    +** $Id: //main/2019/qhull/src/qhulltest/QhullSet_test.cpp#5 $$Change: 3009 $
    +** $DateTime: 2020/07/30 19:25:22 $$Author: bbarber $
     **
     ****************************************************************************/
     
    @@ -36,6 +36,7 @@
         void t_iterator();
         void t_const_iterator();
         void t_qhullset_iterator();
    +    void t_java_iterator();
         void t_io();
     };//QhullSet_test
     
    @@ -62,8 +63,8 @@
         {
             Qhull q(rcube,"QR0");  // triangulation of rotated unit cube
             // Fake an empty set.  Default constructor not defined.  No memory allocation.
    -        QhullFacet f4 = q.beginFacet();
    -        QhullFacetSet fs = f4.neighborFacets();
    +        QhullFacet f4= q.beginFacet();
    +        QhullFacetSet fs= f4.neighborFacets();
             fs.defineAs(q.qh()->other_points); // Force an empty set
             QVERIFY(fs.isEmpty());
             QCOMPARE(fs.count(), 0);
    @@ -71,7 +72,7 @@
             QCOMPARE(fs.begin(), fs.end()); // beginPointer(), endPointer()
             QVERIFY(QhullSetBase::isEmpty(fs.getSetT()));
     
    -        QhullRidgeSet rs = f4.ridges();
    +        QhullRidgeSet rs= f4.ridges();
             QVERIFY(!rs.isEmpty());
             QCOMPARE(rs.count(), 4);
             QCOMPARE(rs.size(), 4u);
    @@ -82,8 +83,8 @@
             QCOMPARE(rs2, rs);
     
             QCOMPARE(q.facetCount(), 6);
    -        QhullFacet f = q.beginFacet();
    -        QhullFacetSet fs2 = f.neighborFacets();
    +        QhullFacet f= q.beginFacet();
    +        QhullFacetSet fs2= f.neighborFacets();
             QCOMPARE(fs2.count(), 4);
             QCOMPARE(fs2.size(), 4u);
             QVERIFY(!fs2.isEmpty());
    @@ -125,8 +126,8 @@
     
             Qhull q2(rcube,"Qt QR0");  // triangulation of rotated unit cube
             QCOMPARE(q2.facetCount(), 12);
    -        QhullFacet f2 = q2.beginFacet();
    -        QhullFacetSet fs = f2.neighborFacets();
    +        QhullFacet f2= q2.beginFacet();
    +        QhullFacetSet fs= f2.neighborFacets();
             QCOMPARE(fs.size(), 3U);
             std::vector vs= fs.toStdVector();
             QCOMPARE(vs.size(), fs.size());
    @@ -149,15 +150,15 @@
     {
         RboxPoints rcube("c");
         Qhull q(rcube,"QR0");  // rotated unit cube
    -    QhullFacet f = q.beginFacet();
    -    QhullFacetSet fs = f.neighborFacets();
    +    QhullFacet f= q.beginFacet();
    +    QhullFacetSet fs= f.neighborFacets();
     
         QCOMPARE(fs.at(1), fs[1]);
         QCOMPARE(fs.first(), fs[0]);
         QCOMPARE(fs.front(), fs.first());
         QCOMPARE(fs.last(), fs.at(3));
         QCOMPARE(fs.back(), fs.last());
    -    facetT **d = fs.data();
    +    facetT **d= fs.data();
         facetT * const *d2= fs.data();
         facetT * const *d3= fs.constData();
         QVERIFY(d==d2);
    @@ -187,8 +188,8 @@
     {
         RboxPoints rcube("c");
         Qhull q(rcube,"QR0");  // rotated unit cube
    -    QhullFacet f = q.beginFacet();
    -    QhullFacetSet fs = f.neighborFacets();
    +    QhullFacet f= q.beginFacet();
    +    QhullFacetSet fs= f.neighborFacets();
         QhullFacet f2= *fs.begin();
         QhullFacet f3= fs.last();
         QVERIFY(fs.contains(f2));
    @@ -215,8 +216,8 @@
         RboxPoints rcube("c");
         {
             Qhull q(rcube,"QR0");  // rotated unit cube
    -        QhullFacet f = q.beginFacet();
    -        QhullFacetSet fs = f.neighborFacets();
    +        QhullFacet f= q.beginFacet();
    +        QhullFacetSet fs= f.neighborFacets();
             QhullFacetSet::Iterator i= fs.begin();
             QhullFacetSet::iterator i2= fs.begin();
             QVERIFY(i==i2);
    @@ -295,8 +296,8 @@
         RboxPoints rcube("c");
         {
             Qhull q(rcube,"QR0");  // rotated unit cube
    -        QhullFacet f = q.beginFacet();
    -        QhullFacetSet fs = f.neighborFacets();
    +        QhullFacet f= q.beginFacet();
    +        QhullFacetSet fs= f.neighborFacets();
             QhullFacetSet::ConstIterator i= fs.begin();
             QhullFacetSet::const_iterator i2= fs.begin();
             QVERIFY(i==i2);
    @@ -354,8 +355,8 @@
         RboxPoints rcube("c");
         Qhull q(rcube,"QR0");  // rotated unit cube
         // Fake an empty set.  Default constructor not defined.  No memory allocation.
    -    QhullFacet f = q.beginFacet();
    -    QhullFacetSet fs = f.neighborFacets();
    +    QhullFacet f= q.beginFacet();
    +    QhullFacetSet fs= f.neighborFacets();
         fs.defineAs(q.qh()->other_points);
         QhullFacetSetIterator i(fs);
         QCOMPARE(fs.count(), 0);
    @@ -365,8 +366,8 @@
         QVERIFY(!i.hasNext());
         QVERIFY(!i.hasPrevious());
     
    -    QhullFacet f2 = q.beginFacet();
    -    QhullFacetSet fs2 = f2.neighborFacets();
    +    QhullFacet f2= q.beginFacet();
    +    QhullFacetSet fs2= f2.neighborFacets();
         QhullFacetSetIterator i2(fs2);
         QCOMPARE(fs2.count(), 4);
         i= fs2;
    @@ -382,7 +383,7 @@
         QVERIFY(!i.hasPrevious());
     
         // i at front, i2 at end/back, 4 neighbors
    -    QhullFacetSet fs3 = f2.neighborFacets(); // same as fs2
    +    QhullFacetSet fs3= f2.neighborFacets(); // same as fs2
         QhullFacet f3(fs2[0]);
         QhullFacet f4= fs3[0];
         QCOMPARE(f3, f4);
    @@ -410,6 +411,48 @@
     }//t_qhullset_iterator
     
     void QhullSet_test::
    +t_java_iterator()
    +{
    +    RboxPoints rcube("c");
    +    Qhull q(rcube, "QR0");  // rotated unit cube
    +    QhullVertexSet vs= q.firstFacet().vertices();
    +    QhullVertex v2= vs.at(1);
    +
    +    bool isV2= false;
    +    int count= 0;
    +    QhullVertexSetIterator i(q.firstFacet().vertices());
    +    while(i.hasNext()){
    +        QhullVertex v= i.next();
    +        QCOMPARE(i.peekPrevious(), v);
    +        ++count;
    +        if(v==v2){
    +            isV2= true;
    +            QCOMPARE(count, 2);
    +        }
    +    }
    +    QVERIFY(isV2);
    +    QCOMPARE(count, vs.count());
    +
    +    QhullRidgeSet rs= q.firstFacet().ridges();
    +    QhullRidge r2= rs.at(1);
    +
    +    bool isR2= false;
    +    count= 0;
    +    QhullRidgeSetIterator ir(q.firstFacet().ridges());
    +    while(ir.hasNext()){
    +        QhullRidge r= ir.next();
    +        QCOMPARE(ir.peekPrevious(), r);
    +        ++count;
    +        if(r==r2){
    +            isR2= true;
    +            QCOMPARE(count, 2);
    +        }
    +    }
    +    QVERIFY(isR2);
    +    QCOMPARE(count, rs.count());
    +}//t_java_iterator
    +
    +void QhullSet_test::
     t_io()
     {
         RboxPoints rcube("c");
    diff -Nru qhull-2015.2/src/qhulltest/qhulltest.cpp qhull-2020.2/src/qhulltest/qhulltest.cpp
    --- qhull-2015.2/src/qhulltest/qhulltest.cpp	2016-01-17 22:18:33.000000000 +0000
    +++ qhull-2020.2/src/qhulltest/qhulltest.cpp	2020-07-24 22:31:41.000000000 +0000
    @@ -1,22 +1,19 @@
     /****************************************************************************
     **
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/qhulltest.cpp#4 $$Change: 2064 $
    -** $DateTime: 2016/01/18 12:36:08 $$Author: bbarber $
    +** Copyright (c) 2008-2020 C.B. Barber. All rights reserved.
    +** $Id: //main/2019/qhull/src/qhulltest/qhulltest.cpp#5 $$Change: 3001 $
    +** $DateTime: 2020/07/24 20:43:28 $$Author: bbarber $
     **
     ****************************************************************************/
     
     //pre-compiled headers
    -extern "C" {
    -    #include "libqhull_r/user_r.h"
    -}
    +#include "libqhull_r/user_r.h"
    +
     #include 
     #include "RoadTest.h" // QT_VERSION
     
     #include "libqhullcpp/RoadError.h"
    -extern "C" {
    -    #include "libqhull_r/qhull_ra.h"
    -}
    +#include "libqhull_r/qhull_ra.h"
     
     #include 
     #include 
    @@ -29,6 +26,8 @@
     
     void addQhullTests(QStringList &args)
     {
    +    // Default tests, use Qhull_test for qhulltest-ok.txt
    +    TESTadd_(add_PointCoordinates_test);
         TESTadd_(add_Qhull_test);
     
         if(args.contains("--all")){
    @@ -88,7 +87,7 @@
         return status;
     }
     
    -}//orgQhull
    +}//namespace orgQhull
     
     int main(int argc, char *argv[])
     {
    diff -Nru qhull-2015.2/src/qhulltest/Qhull_test.cpp qhull-2020.2/src/qhulltest/Qhull_test.cpp
    --- qhull-2015.2/src/qhulltest/Qhull_test.cpp	2016-01-17 01:25:44.000000000 +0000
    +++ qhull-2020.2/src/qhulltest/Qhull_test.cpp	2020-07-30 23:56:43.000000000 +0000
    @@ -1,25 +1,29 @@
     /****************************************************************************
     **
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/Qhull_test.cpp#4 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    +** Copyright (c) 2008-2020 C.B. Barber. All rights reserved.
    +** $Id: //main/2019/qhull/src/qhulltest/Qhull_test.cpp#9 $$Change: 3010 $
    +** $DateTime: 2020/07/30 22:14:11 $$Author: bbarber $
     **
     ****************************************************************************/
     
     //pre-compiled headers
     #include 
    +#include  // setw
    +
     #include "qhulltest/RoadTest.h" // QT_VERSION
     
     #include "libqhullcpp/Qhull.h"
     #include "libqhullcpp/QhullError.h"
     #include "libqhullcpp/RboxPoints.h"
     #include "libqhullcpp/QhullFacetList.h"
    +#include "libqhullcpp/QhullFacetSet.h"
    +#include "libqhullcpp/QhullVertexSet.h"
     
     using std::cout;
     using std::endl;
     using std::string;
     
    -namespace orgQhull {
    +namespace orgQhull{
     
     //! Test C++ interface to Qhull
     //! See eg/q_test for tests of Qhull commands
    @@ -37,7 +41,7 @@
         void t_getQh();
         void t_getValue();
         void t_foreach();
    -    void t_modify();
    +    void t_diamond();
     };//Qhull_test
     
     void
    @@ -56,7 +60,7 @@
     void Qhull_test::
     t_construct()
     {
    -    {
    +   {
             Qhull q;
             QCOMPARE(q.dimension(),0);
             QVERIFY(q.qh()!=0);
    @@ -65,19 +69,19 @@
             try{
                 QCOMPARE(q.area(),0.0);
                 QFAIL("area() did not fail.");
    -        }catch (const std::exception &e) {
    +        }catch (const std::exception &e){
                 cout << "INFO   : Caught " << e.what();
             }
         }
    -    {
    +   {
             RboxPoints rbox("10000");
             Qhull q(rbox, "QR0"); // Random points in a randomly rotated cube.
             QCOMPARE(q.dimension(),3);
             QVERIFY(q.volume() < 1.0);
             QVERIFY(q.volume() > 0.99);
         }
    -    {
    -        double points[] = {
    +   {
    +        double points[]={
                 0, 0,
                 1, 0,
                 1, 1
    @@ -87,6 +91,10 @@
             QCOMPARE(q.facetCount(),3);
             QCOMPARE(q.vertexCount(),3);
             QCOMPARE(q.dimension(),2);
    +        double area= (2.0 + sqrt(2.0));
    +        double delta= fabs(q.area() - area);
    +        double qtDelta= 0.000000000001 * area;
    +        cout << "area delta " << delta << ". qFuzzyCompare delta " << qtDelta << endl;
             QCOMPARE(q.area(), 2.0+sqrt(2.0)); // length of boundary
             QCOMPARE(q.volume(), 0.5);        // the 2-d area
         }
    @@ -96,8 +104,8 @@
     t_attribute()
     {
         RboxPoints rcube("c");
    -    {
    -        double normals[] = {
    +   {
    +        double normals[]={
                 0,  -1, -0.5,
                -1,   0, -0.5,
                 1,   0, -0.5,
    @@ -118,6 +126,7 @@
             q.qh()->disableOutputStream();  // Same as q.disableOutputStream()
             cout << "Expecting no output from qh_fprintf() in Qhull.cpp\n";
             q.outputQhull();
    +        cout << "Expecting output from ~Qhull\n";
         }
     }//t_attribute
     
    @@ -126,7 +135,7 @@
     t_message()
     {
         RboxPoints rcube("c");
    -    {
    +   {
             Qhull q;
             QCOMPARE(q.qhullMessage(), string(""));
             QCOMPARE(q.qhullStatus(), qh_ERRnone);
    @@ -134,11 +143,11 @@
             try{
                 q.runQhull(rcube, "Fd");
                 QFAIL("runQhull Fd did not fail.");
    -        }catch (const std::exception &e) {
    +        }catch (const std::exception &e){
                 const char *s= e.what();
                 cout << "INFO   : Caught " << s;
                 QCOMPARE(QString::fromStdString(s).left(6), QString("QH6029"));
    -            // FIXUP QH11025 -- review decision to clearQhullMessage at QhullError()            // Cleared when copied to QhullError
    +            // QH11025 FIX: review decision to clearQhullMessage at QhullError()            // Cleared when copied to QhullError
                 QVERIFY(!q.hasQhullMessage());
                 // QCOMPARE(q.qhullMessage(), QString::fromStdString(s).remove(0, 7));
                 // QCOMPARE(q.qhullStatus(), 6029);
    @@ -154,7 +163,7 @@
             QVERIFY(!q.hasQhullMessage());
             QCOMPARE(QString::fromStdString(q.qhullMessage()), QString(""));
         }
    -    {
    +   {
             cout << "INFO   : Error stream without output stream\n";
             Qhull q;
             q.setErrorStream(&cout);
    @@ -162,17 +171,17 @@
             try{
                 q.runQhull(rcube, "Fd");
                 QFAIL("runQhull Fd did not fail.");
    -        }catch (const QhullError &e) {
    +        }catch (const QhullError &e){
                 cout << "INFO   : Caught " << e;
                 QCOMPARE(e.errorCode(), 6029);
             }
    -        //FIXUP QH11025 Qhullmessage cleared when QhullError thrown.  Switched to e
    +        //QH11025 FIX: Qhullmessage cleared when QhullError thrown.  Switched to e
             //QVERIFY(q.hasQhullMessage());
             //QCOMPARE(QString::fromStdString(q.qhullMessage()).left(6), QString("QH6029"));
             q.clearQhullMessage();
             QVERIFY(!q.hasQhullMessage());
         }
    -    {
    +   {
             cout << "INFO   : Error output sent to output stream without error stream\n";
             Qhull q;
             q.setErrorStream(0);
    @@ -180,19 +189,19 @@
             try{
                 q.runQhull(rcube, "Tz H0");
                 QFAIL("runQhull TZ did not fail.");
    -        }catch (const std::exception &e) {
    +        }catch (const std::exception &e){
                 const char *s= e.what();
                 cout << "INFO   : Caught " << s;
                 QCOMPARE(QString::fromLatin1(s).left(6), QString("QH6023"));
             }
    -        //FIXUP QH11025 Qhullmessage cleared when QhullError thrown.  Switched to e
    +        //QH11025 FIX: Qhullmessage cleared when QhullError thrown.  Switched to e
             //QVERIFY(q.hasQhullMessage());
             //QCOMPARE(QString::fromStdString(q.qhullMessage()).left(17), QString("qhull: no message"));
             //QCOMPARE(q.qhullStatus(), 6023);
             q.clearQhullMessage();
             QVERIFY(!q.hasQhullMessage());
         }
    -    {
    +   {
             cout << "INFO   : No error stream or output stream\n";
             Qhull q;
             q.setErrorStream(0);
    @@ -200,12 +209,12 @@
             try{
                 q.runQhull(rcube, "Fd");
                 QFAIL("outputQhull did not fail.");
    -        }catch (const std::exception &e) {
    +        }catch (const std::exception &e){
                 const char *s= e.what();
                 cout << "INFO   : Caught " << s;
                 QCOMPARE(QString::fromLatin1(s).left(6), QString("QH6029"));
             }
    -        //FIXUP QH11025 Qhullmessage cleared when QhullError thrown.  Switched to e
    +        //QH11025 FIX: QhullMessage cleared when QhullError thrown.  Switched to e
             //QVERIFY(q.hasQhullMessage());
             //QCOMPARE(QString::fromStdString(q.qhullMessage()).left(9), QString("qhull err"));
             //QCOMPARE(q.qhullStatus(), 6029);
    @@ -218,7 +227,7 @@
     t_getSet()
     {
         RboxPoints rcube("c");
    -    {
    +   {
             Qhull q;
             QVERIFY(!q.initialized());
             q.runQhull(rcube, "s");
    @@ -230,7 +239,7 @@
             q.setErrorStream(&cout);
             q.outputQhull();
         }
    -    {
    +   {
             Qhull q;
             q.runQhull(rcube, "");
             q.setOutputStream(&cout);
    @@ -242,7 +251,7 @@
     t_getQh()
     {
         RboxPoints rcube("c");
    -    {
    +   {
             Qhull q;
             q.runQhull(rcube, "s");
             QCOMPARE(QString(q.qhullCommand()), QString("qhull s"));
    @@ -268,7 +277,7 @@
     t_getValue()
     {
         RboxPoints rcube("c");
    -    {
    +   {
             Qhull q;
             q.runQhull(rcube, "");
             QCOMPARE(q.area(), 6.0);
    @@ -280,7 +289,7 @@
     t_foreach()
     {
         RboxPoints rcube("c");
    -    {
    +   {
             Qhull q;
             QCOMPARE(q.beginFacet(),q.endFacet());
             QCOMPARE(q.beginVertex(),q.endVertex());
    @@ -307,12 +316,13 @@
             coordT *c3= q.pointCoordinateEnd();
             QVERIFY(c3[-1]==0.5 || c3[-1]==-0.5);
             QCOMPARE(c3-c, 8*3);
    -        QCOMPARE(q.vertexList().count(), 8);
    +        QhullVertexList vertexList= q.vertexList();
    +        QCOMPARE(vertexList.count(), 8);
         }
     }//t_foreach
     
     void Qhull_test::
    -t_modify()
    +t_diamond()
     {
         //addPoint() tested in t_foreach
         RboxPoints diamond("d");
    @@ -320,19 +330,66 @@
         q.setOutputStream(&cout);
         cout << "Expecting vertexList and facetList of a 3-d diamond.\n";
         q.outputQhull();
    +
    +    cout << "Expecting the same output using std::vector and Qhull classes\n";
    +    int dim= q.hullDimension();
    +    int numfacets= q.facetList().count();
    +    int totneighbors= numfacets*dim;  /* incorrect for non-simplicial facets, see qh_countfacets */
    +    cout << dim << "\n" << q.points().size() << " " << numfacets << " " << totneighbors/2 << "\n";
    +    std::vector > points;
    +    for(QhullPoint point : q.points()){
    +        points.push_back(point.toStdVector());
    +    }
    +    for(std::vector point : points){
    +        size_t n= point.size();
    +        for(size_t i= 0; i < n; ++i){
    +            if(i < n - 1){
    +                cout << std::setw(6) << point[i] << " ";
    +            }else{
    +                cout << std::setw(6) << point[i] << "\n";
    +            }
    +        }
    +    }
    +    QhullFacetList facets= q.facetList();
    +    std::vector > facetVertices;
    +    for(QhullFacet f : facets){
    +        std::vector vertices;
    +        if(!f.isTopOrient() && f.isSimplicial()){ /* orient the vertices like option 'o' */
    +            QhullVertexSet vs= f.vertices();
    +            vertices.push_back(vs[1].point().id());
    +            vertices.push_back(vs[0].point().id());
    +            for(int i= 2; i < (int)vs.size(); ++i){
    +                vertices.push_back(vs[i].point().id());
    +            }
    +        }else{  /* note: for non-simplicial facets, this code does not duplicate option 'o', see qh_facet3vertex and qh_printfacetNvertex_nonsimplicial */
    +            for(QhullVertex vertex : f.vertices()){
    +                QhullPoint p= vertex.point();
    +                vertices.push_back(p.id());
    +            }
    +        }
    +        facetVertices.push_back(vertices);
    +    }
    +    for(std::vector vertices : facetVertices){
    +        size_t n= vertices.size();
    +        cout << n << " ";
    +        for(size_t i= 0; i char * QTest::
     toString(const std::string &s)
     {
    -    QByteArray ba = s.c_str();
    +    QByteArray ba= s.c_str();
         return qstrdup(ba.data());
     }
     #endif
    diff -Nru qhull-2015.2/src/qhulltest/QhullVertexSet_test.cpp qhull-2020.2/src/qhulltest/QhullVertexSet_test.cpp
    --- qhull-2015.2/src/qhulltest/QhullVertexSet_test.cpp	2016-01-17 01:25:45.000000000 +0000
    +++ qhull-2020.2/src/qhulltest/QhullVertexSet_test.cpp	2020-07-30 23:15:33.000000000 +0000
    @@ -1,8 +1,8 @@
     /****************************************************************************
     **
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullVertexSet_test.cpp#3 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    +** Copyright (c) 2008-2020 C.B. Barber. All rights reserved.
    +** $Id: //main/2019/qhull/src/qhulltest/QhullVertexSet_test.cpp#4 $$Change: 3009 $
    +** $DateTime: 2020/07/30 19:25:22 $$Author: bbarber $
     **
     ****************************************************************************/
     
    @@ -36,6 +36,7 @@
         void t_convert();
         void t_readonly();
         void t_foreach();
    +    void t_java_iterator();
         void t_io();
     };//QhullVertexSet_test
     
    @@ -114,9 +115,56 @@
         QVERIFY(vs.contains(vs.last()));
         QCOMPARE(vs.first(), *vs.begin());
         QCOMPARE(*(vs.end()-1), vs.last());
    +    QhullVertex v2= vs.at(1);
    +
    +    bool isV2= false;
    +    int count= 0;
    +    foreach(QhullVertex v, q.firstFacet().vertices()){ // Qt only
    +        ++count;
    +        if(v==v2){
    +            isV2= true;
    +        }
    +    }
    +    QVERIFY(isV2);
    +    QCOMPARE(count, vs.count());
    +
    +    isV2= false;
    +    count= 0;
    +    for(QhullVertex v : q.firstFacet().vertices()){
    +        ++count;
    +        if(v==v2){
    +            isV2= true;
    +        }
    +    }
    +    QVERIFY(isV2);
    +    QCOMPARE(count, vs.count());
     }//t_foreach
     
     void QhullVertexSet_test::
    +t_java_iterator()
    +{
    +    RboxPoints rcube("c");
    +    Qhull q(rcube, "QR0");  // rotated unit cube
    +    QhullVertexSet vs= q.firstFacet().vertices();
    +    QhullVertex v2= vs.at(1);
    +
    +    bool isV2= false;
    +    int count= 0;
    +    QhullVertexSetIterator i(q.firstFacet().vertices());
    +    while(i.hasNext()){
    +        QhullVertex v= i.next();
    +        QCOMPARE(i.peekPrevious(), v);
    +        ++count;
    +        if(v==v2){
    +            isV2= true;
    +            QCOMPARE(count, 2);
    +        }
    +    }
    +    QVERIFY(isV2);
    +    QCOMPARE(count, vs.count());
    +}//t_java_iterator
    +
    +void QhullVertexSet_test::
     t_io()
     {
         RboxPoints rcube("c");
    diff -Nru qhull-2015.2/src/qhulltest/QhullVertex_test.cpp qhull-2020.2/src/qhulltest/QhullVertex_test.cpp
    --- qhull-2015.2/src/qhulltest/QhullVertex_test.cpp	2016-01-17 01:25:45.000000000 +0000
    +++ qhull-2020.2/src/qhulltest/QhullVertex_test.cpp	2020-07-24 18:52:34.000000000 +0000
    @@ -1,8 +1,8 @@
     /****************************************************************************
     **
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullVertex_test.cpp#3 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    +** Copyright (c) 2008-2020 C.B. Barber. All rights reserved.
    +** $Id: //main/2019/qhull/src/qhulltest/QhullVertex_test.cpp#4 $$Change: 3001 $
    +** $DateTime: 2020/07/24 20:43:28 $$Author: bbarber $
     **
     ****************************************************************************/
     
    @@ -97,14 +97,35 @@
                 QCOMPARE(v.dimension(),3);
                 QVERIFY(v.id()>=0 && v.id()<9);
                 QVERIFY(v.isValid());
    +            QhullVertex v2;
    +            v2.setVertexT(v.qh(), v.getVertexT());
    +            QCOMPARE(v, v2);
                 if(i.hasNext()){
                     QCOMPARE(v.next(), i.peekNext());
                     QVERIFY(v.next()!=v);
    -                QVERIFY(v.next().previous()==v);
    -            }
    +                QCOMPARE(v.next().previous(), v);
    +                QVERIFY(v.hasNext());
    +                QVERIFY(v.next().hasPrevious());
    +            }else
    +              QVERIFY(!v.hasNext());
                 QVERIFY(i.hasPrevious());
                 QCOMPARE(v, i.peekPrevious());
             }
    +        while(i.hasPrevious()){
    +          const QhullVertex v= i.previous();
    +          cout << v.id() << endl;
    +          QVERIFY(v.isValid());
    +          if(i.hasPrevious()){
    +            QVERIFY(v.hasPrevious());
    +            QCOMPARE(v.previous(), i.peekPrevious());
    +            QVERIFY(v.previous()!=v);
    +            QVERIFY(v.previous().hasNext());
    +            QCOMPARE(v.previous().next(), v);
    +          }else
    +            QVERIFY(!v.hasPrevious());
    +          QVERIFY(i.hasNext());
    +          QCOMPARE(v, i.peekNext());
    +        }
     
             // test point()
             foreach (QhullVertex v, q.vertexList()){  // Qt only
    @@ -119,16 +140,31 @@
     void QhullVertex_test::
     t_foreach()
     {
    +    //!\see QhullLinkedList_test::t_java_iterator for test of QhullVertexListIterator
         RboxPoints rcube("c W0 300");  // 300 points on surface of cube
         {
             Qhull q(rcube, "QR0 Qc"); // keep coplanars, thick facet, and rotate the cube
    -        foreach (QhullVertex v, q.vertexList()){  // Qt only
    +        int count= 0;
    +        foreach(QhullVertex v, q.vertexList()){  // Qt only
    +            ++count;
    +            QhullFacetSet fs= v.neighborFacets();
    +            QCOMPARE(fs.count(), 3);
    +            foreach(QhullFacet f, v.neighborFacets()){  // Qt only
    +                QVERIFY(f.vertices().contains(v));
    +            }
    +        }
    +        QCOMPARE(count, q.vertexCount());
    +
    +        count= 0;
    +        for(QhullVertex v : q.vertexList()) { 
    +            ++count;
                 QhullFacetSet fs= v.neighborFacets();
                 QCOMPARE(fs.count(), 3);
    -            foreach (QhullFacet f, fs){  // Qt only
    +            foreach(QhullFacet f, v.neighborFacets()){
                     QVERIFY(f.vertices().contains(v));
                 }
             }
    +        QCOMPARE(count, q.vertexCount());
         }
     }//t_foreach
     
    diff -Nru qhull-2015.2/src/qhulltest/RboxPoints_test.cpp qhull-2020.2/src/qhulltest/RboxPoints_test.cpp
    --- qhull-2015.2/src/qhulltest/RboxPoints_test.cpp	2016-01-17 01:25:45.000000000 +0000
    +++ qhull-2020.2/src/qhulltest/RboxPoints_test.cpp	2020-07-30 23:55:58.000000000 +0000
    @@ -1,8 +1,8 @@
     /****************************************************************************
     **
    -** Copyright (c) 2006-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/RboxPoints_test.cpp#2 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    +** Copyright (c) 2006-2020 C.B. Barber. All rights reserved.
    +** $Id: //main/2019/qhull/src/qhulltest/RboxPoints_test.cpp#5 $$Change: 3010 $
    +** $DateTime: 2020/07/30 22:14:11 $$Author: bbarber $
     **
     ****************************************************************************/
     
    @@ -157,6 +157,21 @@
         orgQhull::Coordinates::ConstIterator cci4= rp.beginCoordinates(4);
         orgQhull::Coordinates::ConstIterator cci5= rp.endCoordinates();
         QCOMPARE(cci5-cci4, 4*3);
    +
    +    //! Qt's foreach is not available since the copy constructor is private.  PointCoordinates makes a copy of std::vector point_coordinates
    +
    +    QhullPoint p2= rp.at(1);
    +    bool isP2= false;
    +    int count= 0;
    +    for(QhullPoint p : rp){
    +        ++count;
    +        if(p==p2){
    +            isP2= true;
    +            QCOMPARE(count, 2);
    +        }
    +    }
    +    QVERIFY(isP2);
    +    QCOMPARE(count, rp.count());
     }//t_foreach
     
     void RboxPoints_test::
    @@ -191,7 +206,7 @@
         orgQhull::Coordinates::ConstIterator cie= rp2.beginCoordinates(8);
         QCOMPARE(*cie, 0.0);
         RboxPoints rp3;
    -    coordT points[] = { 0, 1,1,0,1,1,0,0};
    +    coordT points[]= { 0, 1,1,0,1,1,0,0};
         rp3.setDimension(2);
         rp3.append(8,points);
         QCOMPARE(rp3.count(), 4);
    diff -Nru qhull-2015.2/src/qhulltest/RoadTest.cpp qhull-2020.2/src/qhulltest/RoadTest.cpp
    --- qhull-2015.2/src/qhulltest/RoadTest.cpp	2016-01-16 16:09:02.000000000 +0000
    +++ qhull-2020.2/src/qhulltest/RoadTest.cpp	2020-05-22 02:00:58.000000000 +0000
    @@ -1,8 +1,8 @@
     /****************************************************************************
     **
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/RoadTest.cpp#2 $$Change: 2062 $
    -** $Date: 2016/01/17 $$Author: bbarber $
    +** Copyright (c) 2008-2020 C.B. Barber. All rights reserved.
    +** $Id: //main/2019/qhull/src/qhulltest/RoadTest.cpp#2 $$Change: 2953 $
    +** $Date: 2020/05/21 $$Author: bbarber $
     **
     ****************************************************************************/
     
    diff -Nru qhull-2015.2/src/qhulltest/RoadTest.h qhull-2020.2/src/qhulltest/RoadTest.h
    --- qhull-2015.2/src/qhulltest/RoadTest.h	2016-01-17 17:40:27.000000000 +0000
    +++ qhull-2020.2/src/qhulltest/RoadTest.h	2020-07-30 23:12:03.000000000 +0000
    @@ -1,8 +1,8 @@
     /****************************************************************************
     **
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/RoadTest.h#2 $$Change: 2062 $
    -** $Date: 2016/01/17 $$Author: bbarber $
    +** Copyright (c) 2008-2020 C.B. Barber. All rights reserved.
    +** $Id: //main/2019/qhull/src/qhulltest/RoadTest.h#3 $$Change: 3009 $
    +** $Date: 2020/07/30 $$Author: bbarber $
     **
     ****************************************************************************/
     
    @@ -58,10 +58,10 @@
     #//!\name Class globals
     protected:
         static QList
    -                        s_testcases; ///! List of testcases to execute.  Initialized via add_...()
    -    static int          s_test_count; ///! Total number of tests executed
    -    static int          s_test_fail; ///! Number of failed tests
    -    static QStringList  s_failed_tests; ///! List of failed tests
    +                        s_testcases;    //! List of testcases to execute.  Initialized via add_...()
    +    static int          s_test_count;   //! Total number of tests executed
    +    static int          s_test_fail;    //! Number of failed tests
    +    static QStringList  s_failed_tests; //! List of failed tests
     
     #//!\name Test slots
     public slots:
    diff -Nru qhull-2015.2/src/qhull-warn.pri qhull-2020.2/src/qhull-warn.pri
    --- qhull-2015.2/src/qhull-warn.pri	2016-01-18 23:59:11.000000000 +0000
    +++ qhull-2020.2/src/qhull-warn.pri	2020-09-02 18:36:14.000000000 +0000
    @@ -6,9 +6,10 @@
     #   CONFIG += qhull_warn_shadow     # Warn in Qt about shadowing of functions and fields
     # -------------------------------------------------
     
    +# Define qhull_VERSION in CMakeLists.txt, Makefile, and qhull-warn.pri
     # [apr'11] VERSION works erratically for msvc builds
    -# VERSION = 7.2.0
    -qhull_SOVERSION = 7
    +# VERSION= 8.0.2
    +qhull_SOVERSION= 8.0
     
     # Uncomment to report warnings as errors
     #CONFIG += qhull_warn_error
    diff -Nru qhull-2015.2/src/qvoronoi/qvoronoi.c qhull-2020.2/src/qvoronoi/qvoronoi.c
    --- qhull-2015.2/src/qvoronoi/qvoronoi.c	2016-01-18 22:03:00.000000000 +0000
    +++ qhull-2020.2/src/qvoronoi/qvoronoi.c	2020-05-22 02:00:58.000000000 +0000
    @@ -7,7 +7,7 @@
     
        see unix.c for full interface
     
    -   Copyright (c) 1993-2015, The Geometry Center
    +   Copyright (c) 1993-2020, The Geometry Center
     */
     
     #include "libqhull/libqhull.h"
    @@ -18,12 +18,7 @@
     #include 
     #include 
     
    -#if __cplusplus
    -extern "C" {
    -  int isatty(int);
    -}
    -
    -#elif _MSC_VER
    +#if defined(_MSC_VER)
     #include 
     #define isatty _isatty
     /* int _isatty(int); */
    @@ -41,18 +36,18 @@
     
       notes:
         restricted version of libqhull.c
    -
    -  see:
    -    concise prompt below
    +    same text as unix.c
    +    see concise prompt below
    +    limit maximum literal to 1800 characters
     */
     
     /* duplicated in qvoron_f.htm and qvoronoi.htm
        QJ and Qt are deprecated, but allowed for backwards compatibility
     */
    -char hidden_options[]=" d n m v H U Qb QB Qc Qf Qg Qi Qm Qr QR Qv Qx TR E V Fa FA FC Fp FS Ft FV Pv Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
    +char hidden_options[]=" d n m v H U Qb QB Qc Qf Qg Qi Qm Qr Qv Qx TR E V Fa FA FC FM Fp FS Ft FV Gt Pv Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q15 ";
     
     char qh_prompta[]= "\n\
    -qvoronoi- compute the Voronoi diagram\n\
    +qvoronoi -- compute the Voronoi diagram\n\
         http://www.qhull.org  %s\n\
     \n\
     input (stdin):\n\
    @@ -64,29 +59,41 @@
         Qu   - compute furthest-site Voronoi diagram\n\
     \n\
     Qhull control options:\n\
    +    Qa   - allow input with fewer or more points than coordinates\n\
    +    QRn  - random rotation (n=seed, n=0 time, n=-1 time/no rotate)\n\
    +    Qs   - search all points for the initial simplex\n\
         Qz   - add point-at-infinity to Voronoi diagram\n\
     %s%s%s%s";  /* split up qh_prompt for Visual C++ */
     char qh_promptb[]= "\
    -    Qs   - search all points for the initial simplex\n\
    +\n\
    +Qhull extra options:\n\
         QGn  - Voronoi vertices if visible from point n, -n if not\n\
         QVn  - Voronoi vertices for input point n, -n if not\n\
    +    Qw   - allow option warnings\n\
    +    Q12  - allow wide facets and wide dupridge\n\
    +    Q14  - merge pinched vertices that create a dupridge\n\
    +\n\
    +T options:\n\
    +    TFn  - report summary when n or more facets created\n\
    +    TI file - input file, may be enclosed in single quotes\n\
    +    TO file - output file, may be enclosed in single quotes\n\
    +    Ts   - statistics\n\
    +    Tv   - verify result: structure, convexity, and in-circle test\n\
    +    Tz   - send all output to stdout\n\
     \n\
     ";
     char qh_promptc[]= "\
     Trace options:\n\
         T4   - trace at level n, 4=all, 5=mem/gauss, -1= events\n\
    +    Ta   - annotate output with message codes\n\
    +    TAn  - stop qhull after adding n vertices\n\
    +     TCn - stop qhull after building cone for point n\n\
    +     TVn - stop qhull after adding point n, -n for before\n\
         Tc   - check frequently during execution\n\
    -    Ts   - statistics\n\
    -    Tv   - verify result: structure, convexity, and in-circle test\n\
    -    Tz   - send all output to stdout\n\
    -    TFn  - report summary when n or more facets created\n\
    -    TI file - input data from file, no spaces or single quotes\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    +    Tf   - flush each qh_fprintf for debugging segfaults\n\
         TPn  - turn on tracing when point n added to hull\n\
          TMn - turn on tracing at merge n\n\
          TWn - trace merge facets when width > n\n\
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)\n\
    -     TCn - stop qhull after building cone for point n (see TVn)\n\
     \n\
     Precision options:\n\
         Cn   - radius of centrum (roundoff added).  Merge facets if non-convex\n\
    @@ -95,12 +102,12 @@
         Rn   - randomly perturb computations by a factor of [1-n,1+n]\n\
         Wn   - min facet width for non-coincident point (before roundoff)\n\
     \n\
    -Output formats (may be combined; if none, produces a summary to stdout):\n\
    -    s    - summary to stderr\n\
    +Output formats (may be combined; if none, summary to stdout):\n\
         p    - Voronoi vertices\n\
    -    o    - OFF format (dim, Voronoi vertices, and Voronoi regions)\n\
    -    i    - Delaunay regions (use 'Pp' to avoid warning)\n\
    +    s    - summary to stderr\n\
         f    - facet dump\n\
    +    i    - Delaunay regions (use 'Pp' to avoid warning)\n\
    +    o    - OFF format (dim, Voronoi vertices, and Voronoi regions)\n\
     \n\
     ";
     char qh_promptd[]= "\
    @@ -127,24 +134,24 @@
     \n\
     ";
     char qh_prompte[]= "\
    -Geomview options (2-d only)\n\
    +Geomview output (2-d only)\n\
         Ga   - all points as dots\n\
          Gp  -  coplanar points and vertices as radii\n\
          Gv  -  vertices as spheres\n\
    +    Gc   - centrums\n\
    +    GDn  - drop dimension n in 3-d and 4-d output\n\
    +    Gh   - hyperplane intersections\n\
         Gi   - inner planes only\n\
          Gn  -  no planes\n\
          Go  -  outer planes only\n\
    -    Gc   - centrums\n\
    -    Gh   - hyperplane intersections\n\
         Gr   - ridges\n\
    -    GDn  - drop dimension n in 3-d and 4-d output\n\
     \n\
     Print options:\n\
         PAn  - keep n largest Voronoi vertices by 'area'\n\
         Pdk:n - drop facet if normal[k] <= n (default 0.0)\n\
         PDk:n - drop facet if normal[k] >= n\n\
    -    Pg   - print good Voronoi vertices (needs 'QGn' or 'QVn')\n\
         PFn  - keep Voronoi vertices whose 'area' is at least n\n\
    +    Pg   - print good Voronoi vertices (needs 'QGn' or 'QVn')\n\
         PG   - print neighbors of good Voronoi vertices\n\
         PMn  - keep n Voronoi vertices with most merges\n\
         Po   - force output.  If error, output neighborhood of facet\n\
    @@ -152,6 +159,7 @@
     \n\
         .    - list of all options\n\
         -    - one line descriptions of all options\n\
    +    -?   - help with examples\n\
         -V   - version\n\
     ";
     /* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    @@ -163,7 +171,7 @@
         synopsis for qhull
     */
     char qh_prompt2[]= "\n\
    -qvoronoi- compute the Voronoi diagram.  Qhull %s\n\
    +qvoronoi -- compute the Voronoi diagram.  Qhull %s\n\
         input (stdin): dimension, number of points, point coordinates\n\
         comments start with a non-numeric character\n\
     \n\
    @@ -172,24 +180,26 @@
         Tv   - verify result: structure, convexity, and in-circle test\n\
         .    - concise list of all options\n\
         -    - one-line description of all options\n\
    +    -?   - this message\n\
         -V   - version\n\
     \n\
     output options (subset):\n\
    -    s    - summary of results (default)\n\
    -    p    - Voronoi vertices\n\
    -    o    - OFF file format (dim, Voronoi vertices, and Voronoi regions)\n\
    +    Fi   - separating hyperplanes for bounded regions, 'Fo' for unbounded\n\
         FN   - count and Voronoi vertices for each Voronoi region\n\
         Fv   - Voronoi diagram as Voronoi vertices between adjacent input sites\n\
    -    Fi   - separating hyperplanes for bounded regions, 'Fo' for unbounded\n\
         G    - Geomview output (2-d only)\n\
    +    o    - OFF file format (dim, Voronoi vertices, and Voronoi regions)\n\
    +    p    - Voronoi vertices\n\
         QVn  - Voronoi vertices for input point n, -n if not\n\
    -    TO file- output results to file, may be enclosed in single quotes\n\
    +    s    - summary of results (default)\n\
    +    TI file - input file, may be enclosed in single quotes\n\
    +    TO file - output file, may be enclosed in single quotes\n\
     \n\
     examples:\n\
    -rbox c P0 D2 | qvoronoi s o         rbox c P0 D2 | qvoronoi Fi\n\
    -rbox c P0 D2 | qvoronoi Fo          rbox c P0 D2 | qvoronoi Fv\n\
    -rbox c P0 D2 | qvoronoi s Qu Fv     rbox c P0 D2 | qvoronoi Qu Fo\n\
    -rbox c G1 d D2 | qvoronoi s p       rbox c P0 D2 | qvoronoi s Fv QV0\n\
    +    rbox c P0 D2 | qvoronoi s o         rbox c P0 D2 | qvoronoi Fi\n\
    +    rbox c P0 D2 | qvoronoi Fo          rbox c P0 D2 | qvoronoi Fv\n\
    +    rbox c P0 D2 | qvoronoi s Qu Fv     rbox c P0 D2 | qvoronoi Qu Fo\n\
    +    rbox c G1 d D2 | qvoronoi s p       rbox c P0 D2 | qvoronoi s Fv QV0\n\
     \n\
     ";
     /* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    @@ -201,28 +211,33 @@
         concise prompt for qhull
     */
     char qh_prompt3[]= "\n\
    -Qhull %s.\n\
    +Qhull %s\n\
     Except for 'F.' and 'PG', upper-case options take an argument.\n\
     \n\
    - OFF_format     p_vertices     i_delaunay     summary        facet_dump\n\
    + facet-dump     Geomview       i-delaunay     off-format     p-vertices\n\
    + summary\n\
     \n\
    - Fcoincident    Fd_cdd_in      FD_cdd_out     FF-dump-xridge Fi_bounded\n\
    - Fxtremes       Fmerges        Fneighbors     FNeigh_region  FOptions\n\
    - Fo_unbounded   FPoint_near    FQvoronoi      Fsummary       Fvoronoi\n\
    - FIDs\n\
    + Fcoincident    Fd-cdd-in      FD-cdd-out     FF-dump-xridge Fi-bounded\n\
    + FIDs           Fmerges        Fneighbors     FNeigh-region  Fo-unbounded\n\
    + FOptions       FPoint-near    FQvoronoi      Fsummary       Fvoronoi\n\
    + Fxtremes\n\
     \n\
    - Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
    - Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
    + Gall-points    Gcentrums      GDrop-dim      Ghyperplanes   Ginner\n\
    + Gno-planes     Gouter         Gpoints        Gridges        Gvertices\n\
     \n\
    - PArea_keep     Pdrop d0:0D0   Pgood          PFacet_area_keep\n\
    - PGood_neighbors PMerge_keep   Poutput_forced Pprecision_not\n\
    + PArea-keep     Pdrop-d0:0D0   PFacet-area-keep  Pgood       PGood-neighbors\n\
    + PMerge-keep    Poutput-forced Pprecision-not\n\
     \n\
    - QG_vertex_good Qsearch_1st    Qupper_voronoi QV_point_good  Qzinfinite\n\
    - T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
    - TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
    - TWide_trace    TVertex_stop   TCone_stop\n\
    + Qallow-short   QG-vertex-good QRotate        Qsearch-all    Qupper-voronoi\n\
    + QV-point-good  Qwarn-allow    Qzinfinite     Q12-allow-wide Q14-merge-pinched\n\
     \n\
    - Angle_max      Centrum_size   Random_dist    Wide_outside\n\
    + TFacet-log     TInput-file    TOutput-file   Tstatistics    Tverify\n\
    + Tz-stdout\n\
    +\n\
    + T4-trace       Tannotate      TAdd-stop      Tcheck-often   TCone-stop\n\
    + Tflush         TMerge-trace   TPoint-trace   TVertex-stop   TWide-trace\n\
    +\n\
    + Angle-max      Centrum-size   Random-dist    Wide-outside\n\
     ";
     
     /*- 1 && *argv[1] == '-' && (*(argv[1] + 1) == '?' || *(argv[1] + 1) == '-')) { /* -? or --help */
    +    fprintf(stdout, qh_prompt2, qh_version);
    +    exit(qh_ERRnone);
    +  }
       if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) {
         fprintf(stdout, qh_prompta, qh_version,
                     qh_promptb, qh_promptc, qh_promptd, qh_prompte);
    @@ -276,10 +295,6 @@
         qh_checkflags(qh qhull_command, hidden_options);
         qh_initflags(qh qhull_command);
         points= qh_readpoints(&numpoints, &dim, &ismalloc);
    -    if (dim >= 5) {
    -      qh_option("_merge-exact", NULL, NULL);
    -      qh MERGEexact= True; /* 'Qx' always */
    -    }
         qh_init_B(points, numpoints, dim, ismalloc);
         qh_qhull();
         qh_check_output();
    @@ -295,7 +310,7 @@
       qh_freeqhull(!qh_ALL);
       qh_memfreeshort(&curlong, &totlong);
       if (curlong || totlong)
    -    qh_fprintf_stderr(6263, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
    +    qh_fprintf_stderr(7079, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
            totlong, curlong);
     #endif
       return exitcode;
    diff -Nru qhull-2015.2/src/qvoronoi/qvoronoi_r.c qhull-2020.2/src/qvoronoi/qvoronoi_r.c
    --- qhull-2015.2/src/qvoronoi/qvoronoi_r.c	2016-01-18 22:05:11.000000000 +0000
    +++ qhull-2020.2/src/qvoronoi/qvoronoi_r.c	2020-05-22 02:26:21.000000000 +0000
    @@ -1,13 +1,13 @@
    -/*
      -
      ---------------------------------
     
    -   qvoronoi.c
    +   qvoronoi_r.c
          compute Voronoi diagrams and furthest-point Voronoi
          diagrams using qhull
     
    -   see unix.c for full interface
    +   see unix_r.c for full interface
     
    -   Copyright (c) 1993-2015, The Geometry Center
    +   Copyright (c) 1993-2020, The Geometry Center
     */
     
     #include "libqhull_r/libqhull_r.h"
    @@ -18,12 +18,12 @@
     #include 
     #include 
     
    -#if __cplusplus
    +#ifdef __cplusplus
     extern "C" {
       int isatty(int);
     }
     
    -#elif _MSC_VER
    +#elif defined(_MSC_VER)
     #include 
     #define isatty _isatty
     /* int _isatty(int); */
    @@ -33,26 +33,26 @@
                        if "Undefined symbol" this can be deleted along with call in main() */
     #endif
     
    -/*---------------------------------
     
       qh_prompt
         long prompt for qhull
     
       notes:
    -    restricted version of libqhull.c
    -
    -  see:
    -    concise prompt below
    +    restricted version of libqhull_r.c
    +    same text as unix_r.c
    +    see concise prompt below
    +    limit maximum literal to 1800 characters
     */
     
     /* duplicated in qvoron_f.htm and qvoronoi.htm
        QJ and Qt are deprecated, but allowed for backwards compatibility
     */
    -char hidden_options[]=" d n m v H U Qb QB Qc Qf Qg Qi Qm Qr QR Qv Qx TR E V Fa FA FC Fp FS Ft FV Pv Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
    +char hidden_options[]=" d n m v H U Qb QB Qc Qf Qg Qi Qm Qr Qv Qx TR E V Fa FA FC FM Fp FS Ft FV Gt Pv Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q15 ";
     
     char qh_prompta[]= "\n\
    -qvoronoi- compute the Voronoi diagram\n\
    +qvoronoi -- compute the Voronoi diagram\n\
         http://www.qhull.org  %s\n\
     \n\
     input (stdin):\n\
    @@ -64,29 +64,41 @@
         Qu   - compute furthest-site Voronoi diagram\n\
     \n\
     Qhull control options:\n\
    +    Qa   - allow input with fewer or more points than coordinates\n\
    +    QRn  - random rotation (n=seed, n=0 time, n=-1 time/no rotate)\n\
    +    Qs   - search all points for the initial simplex\n\
         Qz   - add point-at-infinity to Voronoi diagram\n\
     %s%s%s%s";  /* split up qh_prompt for Visual C++ */
     char qh_promptb[]= "\
    -    Qs   - search all points for the initial simplex\n\
    +\n\
    +Qhull extra options:\n\
         QGn  - Voronoi vertices if visible from point n, -n if not\n\
         QVn  - Voronoi vertices for input point n, -n if not\n\
    +    Qw   - allow option warnings\n\
    +    Q12  - allow wide facets and wide dupridge\n\
    +    Q14  - merge pinched vertices that create a dupridge\n\
    +\n\
    +T options:\n\
    +    TFn  - report summary when n or more facets created\n\
    +    TI file - input file, may be enclosed in single quotes\n\
    +    TO file - output file, may be enclosed in single quotes\n\
    +    Ts   - statistics\n\
    +    Tv   - verify result: structure, convexity, and in-circle test\n\
    +    Tz   - send all output to stdout\n\
     \n\
     ";
     char qh_promptc[]= "\
     Trace options:\n\
         T4   - trace at level n, 4=all, 5=mem/gauss, -1= events\n\
    +    Ta   - annotate output with message codes\n\
    +    TAn  - stop qhull after adding n vertices\n\
    +     TCn - stop qhull after building cone for point n\n\
    +     TVn - stop qhull after adding point n, -n for before\n\
         Tc   - check frequently during execution\n\
    -    Ts   - statistics\n\
    -    Tv   - verify result: structure, convexity, and in-circle test\n\
    -    Tz   - send all output to stdout\n\
    -    TFn  - report summary when n or more facets created\n\
    -    TI file - input data from file, no spaces or single quotes\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    +    Tf   - flush each qh_fprintf for debugging segfaults\n\
         TPn  - turn on tracing when point n added to hull\n\
          TMn - turn on tracing at merge n\n\
          TWn - trace merge facets when width > n\n\
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)\n\
    -     TCn - stop qhull after building cone for point n (see TVn)\n\
     \n\
     Precision options:\n\
         Cn   - radius of centrum (roundoff added).  Merge facets if non-convex\n\
    @@ -95,12 +107,12 @@
         Rn   - randomly perturb computations by a factor of [1-n,1+n]\n\
         Wn   - min facet width for non-coincident point (before roundoff)\n\
     \n\
    -Output formats (may be combined; if none, produces a summary to stdout):\n\
    -    s    - summary to stderr\n\
    +Output formats (may be combined; if none, summary to stdout):\n\
         p    - Voronoi vertices\n\
    -    o    - OFF format (dim, Voronoi vertices, and Voronoi regions)\n\
    -    i    - Delaunay regions (use 'Pp' to avoid warning)\n\
    +    s    - summary to stderr\n\
         f    - facet dump\n\
    +    i    - Delaunay regions (use 'Pp' to avoid warning)\n\
    +    o    - OFF format (dim, Voronoi vertices, and Voronoi regions)\n\
     \n\
     ";
     char qh_promptd[]= "\
    @@ -127,24 +139,24 @@
     \n\
     ";
     char qh_prompte[]= "\
    -Geomview options (2-d only)\n\
    +Geomview output (2-d only)\n\
         Ga   - all points as dots\n\
          Gp  -  coplanar points and vertices as radii\n\
          Gv  -  vertices as spheres\n\
    +    Gc   - centrums\n\
    +    GDn  - drop dimension n in 3-d and 4-d output\n\
    +    Gh   - hyperplane intersections\n\
         Gi   - inner planes only\n\
          Gn  -  no planes\n\
          Go  -  outer planes only\n\
    -    Gc   - centrums\n\
    -    Gh   - hyperplane intersections\n\
         Gr   - ridges\n\
    -    GDn  - drop dimension n in 3-d and 4-d output\n\
     \n\
     Print options:\n\
         PAn  - keep n largest Voronoi vertices by 'area'\n\
         Pdk:n - drop facet if normal[k] <= n (default 0.0)\n\
         PDk:n - drop facet if normal[k] >= n\n\
    -    Pg   - print good Voronoi vertices (needs 'QGn' or 'QVn')\n\
         PFn  - keep Voronoi vertices whose 'area' is at least n\n\
    +    Pg   - print good Voronoi vertices (needs 'QGn' or 'QVn')\n\
         PG   - print neighbors of good Voronoi vertices\n\
         PMn  - keep n Voronoi vertices with most merges\n\
         Po   - force output.  If error, output neighborhood of facet\n\
    @@ -152,18 +164,19 @@
     \n\
         .    - list of all options\n\
         -    - one line descriptions of all options\n\
    +    -?   - help with examples\n\
         -V   - version\n\
     ";
     /* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
     
    -/*---------------------------------
     
       qh_prompt2
         synopsis for qhull
     */
     char qh_prompt2[]= "\n\
    -qvoronoi- compute the Voronoi diagram.  Qhull %s\n\
    +qvoronoi -- compute the Voronoi diagram.  Qhull %s\n\
         input (stdin): dimension, number of points, point coordinates\n\
         comments start with a non-numeric character\n\
     \n\
    @@ -172,60 +185,67 @@
         Tv   - verify result: structure, convexity, and in-circle test\n\
         .    - concise list of all options\n\
         -    - one-line description of all options\n\
    +    -?   - this message\n\
         -V   - version\n\
     \n\
     output options (subset):\n\
    -    s    - summary of results (default)\n\
    -    p    - Voronoi vertices\n\
    -    o    - OFF file format (dim, Voronoi vertices, and Voronoi regions)\n\
    +    Fi   - separating hyperplanes for bounded regions, 'Fo' for unbounded\n\
         FN   - count and Voronoi vertices for each Voronoi region\n\
         Fv   - Voronoi diagram as Voronoi vertices between adjacent input sites\n\
    -    Fi   - separating hyperplanes for bounded regions, 'Fo' for unbounded\n\
         G    - Geomview output (2-d only)\n\
    +    o    - OFF file format (dim, Voronoi vertices, and Voronoi regions)\n\
    +    p    - Voronoi vertices\n\
         QVn  - Voronoi vertices for input point n, -n if not\n\
    -    TO file- output results to file, may be enclosed in single quotes\n\
    +    s    - summary of results (default)\n\
    +    TI file - input file, may be enclosed in single quotes\n\
    +    TO file - output file, may be enclosed in single quotes\n\
     \n\
     examples:\n\
    -rbox c P0 D2 | qvoronoi s o         rbox c P0 D2 | qvoronoi Fi\n\
    -rbox c P0 D2 | qvoronoi Fo          rbox c P0 D2 | qvoronoi Fv\n\
    -rbox c P0 D2 | qvoronoi s Qu Fv     rbox c P0 D2 | qvoronoi Qu Fo\n\
    -rbox c G1 d D2 | qvoronoi s p       rbox c P0 D2 | qvoronoi s Fv QV0\n\
    +    rbox c P0 D2 | qvoronoi s o         rbox c P0 D2 | qvoronoi Fi\n\
    +    rbox c P0 D2 | qvoronoi Fo          rbox c P0 D2 | qvoronoi Fv\n\
    +    rbox c P0 D2 | qvoronoi s Qu Fv     rbox c P0 D2 | qvoronoi Qu Fo\n\
    +    rbox c G1 d D2 | qvoronoi s p       rbox c P0 D2 | qvoronoi s Fv QV0\n\
     \n\
     ";
     /* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
     
    -/*---------------------------------
     
       qh_prompt3
         concise prompt for qhull
     */
     char qh_prompt3[]= "\n\
    -Qhull %s.\n\
    +Qhull %s\n\
     Except for 'F.' and 'PG', upper-case options take an argument.\n\
     \n\
    - OFF_format     p_vertices     i_delaunay     summary        facet_dump\n\
    + facet-dump     Geomview       i-delaunay     off-format     p-vertices\n\
    + summary\n\
     \n\
    - Fcoincident    Fd_cdd_in      FD_cdd_out     FF-dump-xridge Fi_bounded\n\
    - Fxtremes       Fmerges        Fneighbors     FNeigh_region  FOptions\n\
    - Fo_unbounded   FPoint_near    FQvoronoi      Fsummary       Fvoronoi\n\
    - FIDs\n\
    + Fcoincident    Fd-cdd-in      FD-cdd-out     FF-dump-xridge Fi-bounded\n\
    + FIDs           Fmerges        Fneighbors     FNeigh-region  Fo-unbounded\n\
    + FOptions       FPoint-near    FQvoronoi      Fsummary       Fvoronoi\n\
    + Fxtremes\n\
     \n\
    - Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
    - Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
    + Gall-points    Gcentrums      GDrop-dim      Ghyperplanes   Ginner\n\
    + Gno-planes     Gouter         Gpoints        Gridges        Gvertices\n\
     \n\
    - PArea_keep     Pdrop d0:0D0   Pgood          PFacet_area_keep\n\
    - PGood_neighbors PMerge_keep   Poutput_forced Pprecision_not\n\
    + PArea-keep     Pdrop-d0:0D0   PFacet-area-keep  Pgood       PGood-neighbors\n\
    + PMerge-keep    Poutput-forced Pprecision-not\n\
     \n\
    - QG_vertex_good Qsearch_1st    Qupper_voronoi QV_point_good  Qzinfinite\n\
    - T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
    - TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
    - TWide_trace    TVertex_stop   TCone_stop\n\
    + Qallow-short   QG-vertex-good QRotate        Qsearch-all    Qupper-voronoi\n\
    + QV-point-good  Qwarn-allow    Qzinfinite     Q12-allow-wide Q14-merge-pinched\n\
     \n\
    - Angle_max      Centrum_size   Random_dist    Wide_outside\n\
    + TFacet-log     TInput-file    TOutput-file   Tstatistics    Tverify\n\
    + Tz-stdout\n\
    +\n\
    + T4-trace       Tannotate      TAdd-stop      Tcheck-often   TCone-stop\n\
    + Tflush         TMerge-trace   TPoint-trace   TVertex-stop   TWide-trace\n\
    +\n\
    + Angle-max      Centrum-size   Random-dist    Wide-outside\n\
     ";
     
    -/*---------------------------------
     
       main( argc, argv )
    @@ -254,6 +274,10 @@
         fprintf(stdout, qh_prompt2, qh_version);
         exit(qh_ERRnone);
       }
    +  if (argc > 1 && *argv[1] == '-' && (*(argv[1] + 1) == '?' || *(argv[1] + 1) == '-')) { /* -? or --help */
    +    fprintf(stdout, qh_prompt2, qh_version);
    +    exit(qh_ERRnone);
    +  }
       if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) {
         fprintf(stdout, qh_prompta, qh_version,
                     qh_promptb, qh_promptc, qh_promptd, qh_prompte);
    @@ -270,7 +294,7 @@
       qh_init_A(qh, stdin, stdout, stderr, argc, argv);  /* sets qh->qhull_command */
       exitcode= setjmp(qh->errexit); /* simple statement for CRAY J916 */
       if (!exitcode) {
    -    qh->NOerrexit = False;
    +    qh->NOerrexit= False;
         qh_option(qh, "voronoi  _bbound-last  _coplanar-keep", NULL, NULL);
         qh->DELAUNAY= True;     /* 'v'   */
         qh->VORONOI= True;
    @@ -278,10 +302,6 @@
         qh_checkflags(qh, qh->qhull_command, hidden_options);
         qh_initflags(qh, qh->qhull_command);
         points= qh_readpoints(qh, &numpoints, &dim, &ismalloc);
    -    if (dim >= 5) {
    -      qh_option(qh, "_merge-exact", NULL, NULL);
    -      qh->MERGEexact= True; /* 'Qx' always */
    -    }
         qh_init_B(qh, points, numpoints, dim, ismalloc);
         qh_qhull(qh);
         qh_check_output(qh);
    @@ -297,7 +317,7 @@
       qh_freeqhull(qh, !qh_ALL);
       qh_memfreeshort(qh, &curlong, &totlong);
       if (curlong || totlong)
    -    qh_fprintf_stderr(6263, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
    +    qh_fprintf_stderr(7079, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
            totlong, curlong);
     #endif
       return exitcode;
    diff -Nru qhull-2015.2/src/rbox/rbox.c qhull-2020.2/src/rbox/rbox.c
    --- qhull-2015.2/src/rbox/rbox.c	2016-01-19 03:54:05.000000000 +0000
    +++ qhull-2020.2/src/rbox/rbox.c	2019-11-11 03:25:52.000000000 +0000
    @@ -22,9 +22,9 @@
     #endif
     
     char prompt[]= "\n\
    --rbox- generate various point distributions.  Default is random in cube.\n\
    +rbox -- generate various point distributions.  Default is random in cube.\n\
     \n\
    -args (any order, space separated):                    Version: 2016/01/18\n\
    +args (any order, space separated):                    Version: 2019/11/10\n\
       3000    number of random points in cube, lens, spiral, sphere or grid\n\
       D3      dimension 3-d\n\
       c       add a unit cube to the output ('c G2.0' sets size)\n\
    @@ -34,7 +34,7 @@
       s       generate cospherical points\n\
       x       generate random points in simplex, may use 'r' or 'Wn'\n\
       y       same as 'x', plus simplex\n\
    -  Cn,r,m  add n nearly coincident points within radius r of m points\n\
    +  Cn,r,m  add n nearly adjacent points within radius r of m points\n\
       Pn,m,r  add point [n,m,r] first, pads with 0, maybe repeated\n\
     \n\
       Ln      lens distribution of radius n.  Also 's', 'r', 'G', 'W'.\n\
    @@ -52,6 +52,7 @@
       tn      use n as the random number seed\n\
       z       print integer coordinates, default 'Bn' is %2.2g\n\
     ";
    +/* Not including 'V' for rbox version, clumsy coordination with rboxlib.c */
     
     /*--------------------------------------------
     -rbox-  main procedure of rbox application
    @@ -65,17 +66,20 @@
     
       if (argc == 1) {
         printf(prompt, qh_DEFAULTbox, qh_DEFAULTzbox);
    -    return 1;
    +    return qh_ERRnone;
       }
       if (argc == 2 && strcmp(argv[1], "D4")==0)
         qh_fprintf_stderr(0, "\nStarting the rbox smoketest for qhull.  An immediate failure indicates\nthat non-reentrant rbox was linked to reentrant routines.  An immediate\nfailure of qhull may indicate that qhull was linked to the wrong\nqhull library.  Also try 'rbox D4 | qhull T1'\n");
     
       command_size= qh_argv_to_command_size(argc, argv);
    -  if ((command= (char *)qh_malloc((size_t)command_size))) {
    +  if (command_size < 1) {
    +    qh_fprintf_stderr(6419, "rbox internal error: expecting qh_argv_to_command_size >= 1.  Got %d.  Exit with error\n", command_size);
    +    return_status= qh_ERRqhull;
    +  }else if ((command= (char *)qh_malloc((size_t)command_size))) {
         if (!qh_argv_to_command(argc, argv, command, command_size)) {
           qh_fprintf_stderr(6264, "rbox internal error: allocated insufficient memory (%d) for arguments\n", command_size);
    -      return_status= qh_ERRinput;
    -    }else{
    +      return_status= qh_ERRqhull;
    +    }else {
           return_status= qh_rboxpoints(stdout, stderr, command);
         }
         qh_free(command);
    diff -Nru qhull-2015.2/src/rbox/rbox_r.c qhull-2020.2/src/rbox/rbox_r.c
    --- qhull-2015.2/src/rbox/rbox_r.c	2016-01-19 03:54:24.000000000 +0000
    +++ qhull-2020.2/src/rbox/rbox_r.c	2019-11-11 03:26:20.000000000 +0000
    @@ -1,8 +1,8 @@
     
    -/*
      -
      ---------------------------------
     
    -   rbox.c
    +   rbox_r.c
          rbox program for generating input points for qhull.
     
        notes:
    @@ -11,7 +11,7 @@
     */
     
     #include "libqhull_r/libqhull_r.h"
    -#include "libqhull/random_r.h"
    +#include "libqhull_r/random_r.h"
     
     #include 
     #include 
    @@ -23,9 +23,9 @@
     #endif
     
     char prompt[]= "\n\
    --rbox- generate various point distributions.  Default is random in cube.\n\
    +rbox -- generate various point distributions.  Default is random in cube.\n\
     \n\
    -args (any order, space separated):                    Version: 2016/01/18 r\n\
    +args (any order, space separated):                    Version: 2019/11/10\n\
       3000    number of random points in cube, lens, spiral, sphere or grid\n\
       D3      dimension 3-d\n\
       c       add a unit cube to the output ('c G2.0' sets size)\n\
    @@ -35,7 +35,7 @@
       s       generate cospherical points\n\
       x       generate random points in simplex, may use 'r' or 'Wn'\n\
       y       same as 'x', plus simplex\n\
    -  Cn,r,m  add n nearly coincident points within radius r of m points\n\
    +  Cn,r,m  add n nearly adjacent points within radius r of m points\n\
       Pn,m,r  add point [n,m,r] first, pads with 0, maybe repeated\n\
     \n\
       Ln      lens distribution of radius n.  Also 's', 'r', 'G', 'W'.\n\
    @@ -53,11 +53,14 @@
       tn      use n as the random number seed\n\
       z       print integer coordinates, default 'Bn' is %2.2g\n\
     ";
    +/* Not including 'V' for rbox version, clumsy coordination with rboxlib_r.c */
     
     /*--------------------------------------------
     -rbox-  main procedure of rbox application
     */
     int main(int argc, char **argv) {
    +  char *command;
    +  int command_size;
       int return_status;
       qhT qh_qh;
       qhT *qh= &qh_qh;
    @@ -66,7 +69,7 @@
     
       if (argc == 1) {
         printf(prompt, qh_DEFAULTbox, qh_DEFAULTzbox);
    -    return 1;
    +    return qh_ERRnone;
       }
       if (argc == 2 && strcmp(argv[1], "D4")==0)
         qh_fprintf_stderr(0, "\nStarting the rbox smoketest for qhull.  An immediate failure indicates\nthat reentrant rbox was linked to non-reentrant routines.  An immediate\nfailure of qhull may indicate that qhull was linked to the wrong\nqhull library.  Also try 'rbox D4 | qhull T1'\n");
    diff -Nru qhull-2015.2/src/testqset/testqset.c qhull-2020.2/src/testqset/testqset.c
    --- qhull-2015.2/src/testqset/testqset.c	2016-01-17 17:34:46.000000000 +0000
    +++ qhull-2020.2/src/testqset/testqset.c	2020-05-22 02:00:58.000000000 +0000
    @@ -66,9 +66,9 @@
         SETsecondt_ -- 2 tests
         SETtruncate_ -- 2 tests
     
    -    Copyright (c) 2012-2015 C.B. Barber. All rights reserved.
    -    $Id: //main/2015/qhull/src/testqset/testqset.c#4 $$Change: 2062 $
    -    $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    +    Copyright (c) 2012-2020 C.B. Barber. All rights reserved.
    +    $Id: //main/2019/qhull/src/testqset/testqset.c#7 $$Change: 2953 $
    +    $DateTime: 2020/05/21 22:05:32 $$Author: bbarber $
     */
     
     #include "libqhull/user.h"  /* QHULL_CRTDBG */
    @@ -83,19 +83,19 @@
     typedef int i2T;
     #define MAXerrorCount 100 /* quit after n errors */
     
    -#define FOREACHint_( ints ) FOREACHsetelement_( i2T, ints, i2)
    -#define FOREACHint4_( ints ) FOREACHsetelement_( i2T, ints, i4)
    -#define FOREACHint_i_( ints ) FOREACHsetelement_i_( i2T, ints, i2)
    -#define FOREACHintreverse_( ints ) FOREACHsetelementreverse_( i2T, ints, i2)
    -#define FOREACHintreverse12_( ints ) FOREACHsetelementreverse12_( i2T, ints, i2)
    +#define FOREACHint_( ints ) FOREACHsetelement_(i2T, ints, i2)
    +#define FOREACHint_i_(ints) FOREACHsetelement_i_(i2T, ints, i2)
    +/* not tested -- #define FOREACHint4_( ints ) FOREACHsetelement_(i2T, ints, i4) */
    +/* not tested -- #define FOREACHintreverse_(ints) FOREACHsetelementreverse_(i2T, ints, i2) */
    +/* not tested -- #define FOREACHintreverse12_( ints ) FOREACHsetelementreverse12_(i2T, ints, i2) */
     
     enum {
    -    MAXint= 0x7fffffff,
    +    MAXint= 0x7fffffff
     };
     
    -char prompt[]= "testqset N [M] [T5] -- Test qset.c and mem.c\n\
    +char prompt[]= "testqset N [M] [T5] -- Test non-rentrant qset.c and mem.c\n\
       \n\
    -  If this test fails then qhull will not work.\n\
    +  If this test fails then non-rentrant Qhull will not work.\n\
       \n\
       Test qsets of 0..N integers with a check every M iterations (default ~log10)\n\
       Additional checking and logging if M is 1\n\
    @@ -114,13 +114,15 @@
     /* Macros normally defined in user.h */
     
     #define realT double
    +#define qh_ERRinput 1    /* input inconsistency */
    +#define qh_ERRmem   4    /* insufficient memory, matches mem.h */
    +#define qh_ERRqhull 5    /* internal error detected, matches mem.h, calls qh_printhelp_internal */
     #define qh_MEMalign ((int)(fmax_(sizeof(realT), sizeof(void *))))
     #define qh_MEMbufsize 0x10000       /* allocate 64K memory buffers */
     #define qh_MEMinitbuf 0x20000      /* initially allocate 128K buffer */
     
     /* Macros normally defined in QhullSet.h */
     
    -
     /* Functions normally defined in user.h for usermem.c */
     
     void    qh_exit(int exitcode);
    @@ -128,8 +130,9 @@
     void    qh_free(void *mem);
     void   *qh_malloc(size_t size);
     
    -/* Normally defined in user.c */
    +/* Normally defined in user.c, use void instead of facetT/ridgeT for testqset.c */
     
    +void    qh_errexit(int exitcode, void *f, void *r);
     void    qh_errexit(int exitcode, void *f, void *r)
     {
         (void)f; /* unused */
    @@ -139,17 +142,18 @@
     
     /* Normally defined in userprintf.c */
     
    +void    qh_fprintf(FILE *fp, int msgcode, const char *fmt, ... );
     void    qh_fprintf(FILE *fp, int msgcode, const char *fmt, ... )
     {
    -    static int needs_cr= 0;  /* True if qh_fprintf needs a CR */
    +    static int needs_cr= 0;  /* True if qh_fprintf needs a CR. testqset is not itself reentrant */
     
         size_t fmtlen= strlen(fmt);
         va_list args;
     
         if (!fp) {
             /* Do not use qh_fprintf_stderr.  This is a standalone program */
    -        fprintf(stderr, "QH6232 qh_fprintf: fp not defined for '%s'", fmt);
    -        qh_errexit(6232, NULL, NULL);
    +        fprintf(stderr, "QH6232 testqset (qh_fprintf): fp not defined for '%s'\n", fmt);
    +        qh_errexit(qh_ERRqhull, NULL, NULL);
         }
         if(fmtlen>0){
             if(fmt[fmtlen-1]=='\n'){
    @@ -162,7 +166,7 @@
             }
         }
         if(msgcode>=6000 && msgcode<7000){
    -        fprintf(fp, "Error TQ%d ", msgcode);
    +        fprintf(fp, "Error QH%d ", msgcode);
         }
         va_start(args, fmt);
         vfprintf(fp, fmt, args);
    @@ -190,8 +194,9 @@
         int *intarray= NULL;
         int numInts;
         int checkEvery= MAXint;
    -    int curlong, totlong;
    -    int traceLevel= 4; /* 4 normally, no tracing since qset does not log.  5 for memory tracing */
    +    int curlong, totlong;  /* used if !qh_NOmem */
    +    int traceLevel= 4; /* 4 normally, no tracing since qset does not log.  Option 'T5' for memory tracing */
    +
     
     #if defined(_MSC_VER) && defined(_DEBUG) && defined(QHULL_CRTDBG)  /* user.h */
         _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_DELAY_FREE_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) );
    @@ -210,17 +215,21 @@
         testSettemp(numInts, intarray, checkEvery);
         testSetlastEtc(numInts, intarray, checkEvery);
         testSetdelsortedEtc(numInts, intarray, checkEvery);
    -    printf("\n\nNot testing qh_setduplicate and qh_setfree2.\n  These routines use heap-allocated set contents.  See qhull tests.\n");
    +    qh_fprintf(stderr, 8083, "\nNot testing qh_setduplicate and qh_setfree2.  These routines use heap-allocated,\n\
    +set contents.  See qhull tests in eg/q_test and bin/qhulltest.\n\n");
     
    -    qh_memstatistics(stdout);
    +    qh_memstatistics(stderr);
    +#ifndef qh_NOmem
         qh_memfreeshort(&curlong, &totlong);
         if (curlong || totlong){
    -        qh_fprintf(stderr, 8043, "qh_memfreeshort: did not free %d bytes of long memory(%d pieces)\n", totlong, curlong);
    +        qh_fprintf(stderr, 8084, "testqset: did not free %d bytes of long memory(%d pieces)\n", totlong, curlong);
             error_count++;
         }
    +#endif
    +    fflush(NULL);
         if(error_count){
    -        qh_fprintf(stderr, 8012, "testqset: %d errors\n\n", error_count);
    -        exit(1);
    +        qh_fprintf(stderr, 8088, "testqset: %d errors\n\n", error_count);
    +        exit(qh_ERRqhull);
         }else{
             printf("testqset: OK\n\n");
         }
    @@ -240,12 +249,12 @@
         }
         numIntsArg= strtol(argv[1], &endp, 10);
         if(numIntsArg<1){
    -        qh_fprintf(stderr, 6301, "First argument should be 1 or greater.  Got '%s'\n", argv[1]);
    -        exit(1);
    +        qh_fprintf(stderr, 6301, "testqset: First argument should be 1 or greater.  Got '%s'\n", argv[1]);
    +        exit(qh_ERRinput);
         }
         if(numIntsArg>MAXint){
    -        qh_fprintf(stderr, 6302, "qset does not currently support 64-bit ints.  Maximum count is %d\n", MAXint);
    -        exit(1);
    +        qh_fprintf(stderr, 6302, "testqset: qset does not currently support 64-bit ints.  Maximum count is %d\n", MAXint);
    +        exit(qh_ERRinput);
         }
         *numInts= (int)numIntsArg;
     
    @@ -256,20 +265,20 @@
         if(argc==4 || (argc==3 && !isTracing)){
             checkEveryArg= strtol(argv[2], &endp, 10);
             if(checkEveryArg<1){
    -            qh_fprintf(stderr, 6321, "checkEvery argument should be 1 or greater.  Got '%s'\n", argv[2]);
    -            exit(1);
    +            qh_fprintf(stderr, 6321, "testqset: checkEvery argument should be 1 or greater.  Got '%s'\n", argv[2]);
    +            exit(qh_ERRinput);
             }
             if(checkEveryArg>MAXint){
    -            qh_fprintf(stderr, 6322, "qset does not currently support 64-bit ints.  Maximum checkEvery is %d\n", MAXint);
    -            exit(1);
    +            qh_fprintf(stderr, 6322, "testqset: qset does not currently support 64-bit ints.  Maximum checkEvery is %d\n", MAXint);
    +            exit(qh_ERRinput);
             }
             if(argc==4){
                 if(argv[3][0]=='T' && argv[3][1]=='5' ){
                     isTracing= 1;
                     *traceLevel= 5;
                 }else{
    -                qh_fprintf(stderr, 6242, "Optional third argument must be 'T5'.  Got '%s'\n", argv[3]);
    -                exit(1);
    +                qh_fprintf(stderr, 6242, "testqset: Optional third argument must be 'T5'.  Got '%s'\n", argv[3]);
    +                exit(qh_ERRinput);
                 }
             }
             *checkEvery= (int)checkEveryArg;
    @@ -280,27 +289,27 @@
     {
         int i;
         if(numInts<0 || numInts*(int)sizeof(int)<0){
    -        qh_fprintf(stderr, 6303, "qset does not currently support 64-bit ints.  Integer overflow\n");
    -        exit(1);
    +        qh_fprintf(stderr, 6303, "testqset: qset does not currently support 64-bit ints.  Integer overflow\n");
    +        exit(qh_ERRinput);
         }
    -    *intarray= qh_malloc(numInts * sizeof(int));
    +    *intarray= (int *)qh_malloc((unsigned int)numInts * sizeof(int));
         if(!*intarray){
    -        qh_fprintf(stderr, 6304, "Failed to allocate %d bytes of memory\n", numInts * sizeof(int));
    -        exit(1);
    +        qh_fprintf(stderr, 6304, "testqset: Failed to allocate %d bytes of memory\n", numInts * (int)sizeof(int));
    +        exit(qh_ERRmem);
         }
         for(i= 0; i=2){
             isCheck= log_i(ints, "n", numInts/2, numInts, checkEvery);
             qh_settruncate(ints, numInts/2);
    @@ -327,7 +336,7 @@
         qh_settruncate(ints, 0);
         checkSetContents("qh_settruncate", ints, 0, -1, -1, -1);
     
    -    qh_fprintf(stderr, 8003, "\n\nTesting qh_setappend2ndlast 0,0..%d.  Test 0", numInts-1);
    +    qh_fprintf(stderr, 8122, "\n\nTesting qh_setappend2ndlast 0,0..%d.  Test 0", numInts-1);
         qh_setfree(&ints);
         ints= qh_setnew(4);
         qh_setappend(&ints, intarray+0);
    @@ -338,7 +347,7 @@
                 checkSetContents("qh_setappend2ndlast", ints, i+2, 0, 0, -1);
             }
         }
    -    qh_fprintf(stderr, 8015, "\n\nTesting SETtruncate_ %d and 0.  Test", numInts/2);
    +    qh_fprintf(stderr, 8146, "\n\nTesting SETtruncate_ %d and 0.  Test", numInts/2);
         if(numInts>=2){
             isCheck= log_i(ints, "n", numInts/2, numInts, checkEvery);
             SETtruncate_(ints, numInts/2);
    @@ -356,7 +365,7 @@
         setT *ints=qh_setnew(1);
         int i,j,isCheck;
     
    -    qh_fprintf(stderr, 8003, "\n\nTesting qh_setdelnthsorted and qh_setaddnth 1..%d. Test", numInts-1);
    +    qh_fprintf(stderr, 8147, "\n\nTesting qh_setdelnthsorted and qh_setaddnth 1..%d. Test", numInts-1);
         for(j=1; j0){
                     if(qh_setequal(ints, ints2)){
    -                    qh_fprintf(stderr, 6324, "testSetequalInEtc: non-empty set equal to empty set\n", j);
    +                    qh_fprintf(stderr, 6324, "testqset (testSetequalInEtc): non-empty set equal to empty set\n", j);
                         error_count++;
                     }
                     qh_setfree(&ints3);
    @@ -542,27 +551,27 @@
                         checkSetContents("qh_setreplace 3", ints3, j, 0, j/2+1, j/2+1);
                     }
                     if(qh_setequal(ints, ints3)){
    -                    qh_fprintf(stderr, 6325, "testSetequalInEtc: modified set equal to original set at %d/2\n", j);
    +                    qh_fprintf(stderr, 6325, "testqset (testSetequalInEtc): modified set equal to original set at %d/2\n", j);
                         error_count++;
                     }
                     if(!qh_setequal_except(ints, intarray+j/2, ints3, intarray+j/2+1)){
    -                    qh_fprintf(stderr, 6326, "qh_setequal_except: modified set not equal to original set except modified\n", j);
    +                    qh_fprintf(stderr, 6326, "testqset (qh_setequal_except): modified set not equal to original set except modified\n", j);
                         error_count++;
                     }
                     if(qh_setequal_except(ints, intarray+j/2, ints3, intarray)){
    -                    qh_fprintf(stderr, 6327, "qh_setequal_except: modified set equal to original set with wrong excepts\n", j);
    +                    qh_fprintf(stderr, 6327, "testqset (qh_setequal_except): modified set equal to original set with wrong excepts\n", j);
                         error_count++;
                     }
                     if(!qh_setequal_skip(ints, j/2, ints3, j/2)){
    -                    qh_fprintf(stderr, 6328, "qh_setequal_skip: modified set not equal to original set except modified\n", j);
    +                    qh_fprintf(stderr, 6328, "testqset (qh_setequal_skip): modified set not equal to original set except modified\n", j);
                         error_count++;
                     }
                     if(j>2 && qh_setequal_skip(ints, j/2, ints3, 0)){
    -                    qh_fprintf(stderr, 6329, "qh_setequal_skip: modified set equal to original set with wrong excepts\n", j);
    +                    qh_fprintf(stderr, 6329, "testqset (qh_setequal_skip): modified set equal to original set with wrong excepts\n", j);
                         error_count++;
                     }
                     if(intarray+j/2+1!=qh_setdel(ints3, intarray+j/2+1)){
    -                    qh_fprintf(stderr, 6330, "qh_setdel: failed to find added element\n", j);
    +                    qh_fprintf(stderr, 6330, "testqset (qh_setdel): failed to find added element\n", j);
                         error_count++;
                     }
                     checkSetContents("qh_setdel", ints3, j-1, 0, j-1, (j==1 ? -1 : j/2+1));  /* swaps last element with deleted element */
    @@ -571,31 +580,31 @@
                         checkSetContents("qh_setdelnth", ints3, j-2, 0, j-2, (j==2 ? -1 : j/2+1));
                     }
                     if(qh_setin(ints3, intarray+j/2)){
    -                    qh_fprintf(stderr, 6331, "qh_setin: found deleted element\n");
    +                    qh_fprintf(stderr, 6331, "testqset (qh_setin): found deleted element\n");
                         error_count++;
                     }
                     if(j>4 && !qh_setin(ints3, intarray+1)){
    -                    qh_fprintf(stderr, 6332, "qh_setin: did not find second element\n");
    +                    qh_fprintf(stderr, 6332, "testqset (qh_setin): did not find second element\n");
                         error_count++;
                     }
                     if(j>4 && !qh_setin(ints3, intarray+j-2)){
    -                    qh_fprintf(stderr, 6333, "qh_setin: did not find last element\n");
    +                    qh_fprintf(stderr, 6333, "testqset (qh_setin): did not find last element\n");
                         error_count++;
                     }
                     if(-1!=qh_setindex(ints2, intarray)){
    -                    qh_fprintf(stderr, 6334, "qh_setindex: found element in empty set\n");
    +                    qh_fprintf(stderr, 6334, "testqset (qh_setindex): found element in empty set\n");
                         error_count++;
                     }
                     if(-1!=qh_setindex(ints3, intarray+j/2)){
    -                    qh_fprintf(stderr, 6335, "qh_setindex: found deleted element in set\n");
    +                    qh_fprintf(stderr, 6335, "testqset (qh_setindex): found deleted element in set\n");
                         error_count++;
                     }
                     if(0!=qh_setindex(ints, intarray)){
    -                    qh_fprintf(stderr, 6336, "qh_setindex: did not find first in set\n");
    +                    qh_fprintf(stderr, 6336, "testqset (qh_setindex): did not find first in set\n");
                         error_count++;
                     }
                     if(j-1!=qh_setindex(ints, intarray+j-1)){
    -                    qh_fprintf(stderr, 6337, "qh_setindex: did not find last in set\n");
    +                    qh_fprintf(stderr, 6337, "testqset (qh_setindex): did not find last in set\n");
                         error_count++;
                     }
                 }
    @@ -616,40 +625,40 @@
         setT *ints2= NULL;
         int i,j,prepend;
     
    -    qh_fprintf(stderr, 8020, "\n\nTesting qh_setlast, qh_setnew_delnthsorted, qh_setunique, and qh_setzero 0..%d. Test", numInts-1);
    +    qh_fprintf(stderr, 8152, "\n\nTesting qh_setlast, qh_setnew_delnthsorted, qh_setunique, and qh_setzero 0..%d. Test", numInts-1);
         for(j=0; j0){
                     if(intarray+j-1!=qh_setlast(ints)){
    -                    qh_fprintf(stderr, 6338, "qh_setlast: wrong last element\n");
    +                    qh_fprintf(stderr, 6338, "testqset (qh_setlast): wrong last element\n");
                         error_count++;
                     }
                     prepend= (j<100 ? j/4 : 0);
                     ints2= qh_setnew_delnthsorted(ints, qh_setsize(ints), j/2, prepend);
                     if(qh_setsize(ints2)!=j+prepend-1){
    -                    qh_fprintf(stderr, 6345, "qh_setnew_delnthsorted: Expecting %d elements, got %d\n", j+prepend-1, qh_setsize(ints2));
    +                    qh_fprintf(stderr, 6345, "testqset (qh_setnew_delnthsorted): Expecting %d elements, got %d\n", j+prepend-1, qh_setsize(ints2));
                         error_count++;
                     }
                     /* Define prepended elements.  Otherwise qh_setdelnthsorted may fail */
    @@ -664,7 +673,7 @@
                     if(j>2){
                         qh_setzero(ints2, j/2, j-1);  /* max size may be j-1 */
                         if(qh_setsize(ints2)!=j-1){
    -                        qh_fprintf(stderr, 6342, "qh_setzero: Expecting %d elements, got %d\n", j, qh_setsize(ints2));
    +                        qh_fprintf(stderr, 6342, "testqset (qh_setzero): Expecting %d elements, got %d\n", j, qh_setsize(ints2));
                             error_count++;
                         }
                         qh_setcompact(ints2);
    @@ -687,7 +696,7 @@
         setT *ints3= NULL;
         int i,j;
     
    -    qh_fprintf(stderr, 8021, "\n\nTesting qh_settemp* 0..%d. Test", numInts-1);
    +    qh_fprintf(stderr, 8153, "\n\nTesting qh_settemp* 0..%d. Test", numInts-1);
         for(j=0; j=1){
                     scale *= 10;
                     e++;
                 }
                 if(i==numInts-1){
    -                qh_fprintf(stderr, 8008, " %s%d", s, i);
    +                qh_fprintf(stderr, 8158, " %s%d", s, i);
                 }else if(i==scale){
                     if(i<=1000){
    -                    qh_fprintf(stderr, 8010, " %s%d", s, i);
    +                    qh_fprintf(stderr, 8159, " %s%d", s, i);
                     }else{
    -                    qh_fprintf(stderr, 8009, " %s1e%d", s, e);
    +                    qh_fprintf(stderr, 8160, " %s1e%d", s, e);
                     }
                 }
             }
    @@ -781,38 +790,38 @@
         if(set){
             SETreturnsize_(set, actualSize);  /* normally used only when speed is critical */
             if(*qh_setendpointer(set)!=NULL){
    -            qh_fprintf(stderr, 6344, "%s: qh_setendpointer(), 0x%x, is not NULL terminator of set 0x%x", name, qh_setendpointer(set), set);
    +            qh_fprintf(stderr, 6344, "testqset (%s): qh_setendpointer(set), 0x%x, is not NULL terminator of set 0x%x\n", name, qh_setendpointer(set), set);
                 error_count++;
             }
         }
         if(actualSize!=qh_setsize(set)){
    -        qh_fprintf(stderr, 6305, "%s: SETreturnsize_() returned %d while qh_setsize() returns %d\n", name, actualSize, qh_setsize(set));
    +        qh_fprintf(stderr, 6305, "testqset (%s): SETreturnsize_() returned %d while qh_setsize() returns %d\n", name, actualSize, qh_setsize(set));
             error_count++;
         }else if(actualSize!=count){
    -        qh_fprintf(stderr, 6306, "%s: Expecting %d elements for set.  Got %d elements\n", name, count, actualSize);
    +        qh_fprintf(stderr, 6306, "testqset (%s): Expecting %d elements for set.  Got %d elements\n", name, count, actualSize);
             error_count++;
         }
         if(SETempty_(set)){
             if(count!=0){
    -            qh_fprintf(stderr, 6307, "%s: Got empty set instead of count %d, rangeA %d, rangeB %d, rangeC %d\n", name, count, rangeA, rangeB, rangeC);
    +            qh_fprintf(stderr, 6307, "testqset (%s): Got empty set instead of count %d, rangeA %d, rangeB %d, rangeC %d\n", name, count, rangeA, rangeB, rangeC);
                 error_count++;
             }
         }else{
             /* Must be first, otherwise trips msvc 8 */
             i2T **p= SETaddr_(set, i2T);
             if(*p!=SETfirstt_(set, i2T)){
    -            qh_fprintf(stderr, 6309, "%s: SETaddr_(set, i2t) [%p] is not the same as SETfirst_(set) [%p]\n", name, SETaddr_(set, i2T), SETfirst_(set));
    +            qh_fprintf(stderr, 6309, "testqset (%s): SETaddr_(set, i2t) [%p] is not the same as SETfirst_(set) [%p]\n", name, SETaddr_(set, i2T), SETfirst_(set));
                 error_count++;
             }
             first= *(int *)SETfirst_(set);
             if(SETfirst_(set)!=SETfirstt_(set, i2T)){
    -            qh_fprintf(stderr, 6308, "%s: SETfirst_(set) [%p] is not the same as SETfirstt_(set, i2T [%p]\n", name, SETfirst_(set), SETfirstt_(set, i2T));
    +            qh_fprintf(stderr, 6308, "testqset (%s): SETfirst_(set) [%p] is not the same as SETfirstt_(set, i2T [%p]\n", name, SETfirst_(set), SETfirstt_(set, i2T));
                 error_count++;
             }
             if(qh_setsize(set)>1){
                 second= *(int *)SETsecond_(set);
                 if(SETsecond_(set)!=SETsecondt_(set, i2T)){
    -                qh_fprintf(stderr, 6310, "%s: SETsecond_(set) [%p] is not the same as SETsecondt_(set, i2T) [%p]\n", name, SETsecond_(set), SETsecondt_(set, i2T));
    +                qh_fprintf(stderr, 6310, "testqset (%s): SETsecond_(set) [%p] is not the same as SETsecondt_(set, i2T) [%p]\n", name, SETsecond_(set), SETsecondt_(set, i2T));
                     error_count++;
                 }
             }
    @@ -825,11 +834,11 @@
             }
             prev= *i2;
             if(SETindex_(set, i2)!=i){
    -            qh_fprintf(stderr, 6311, "%s: Expecting SETIndex_(set, pointer-to-%d) to be %d.  Got %d\n", name, *i2, i, SETindex_(set, i2));
    +            qh_fprintf(stderr, 6311, "testqset (%s): Expecting SETindex_(set, pointer-to-%d) to be %d.  Got %d\n", name, *i2, i, SETindex_(set, i2));
                 error_count++;;
             }
             if(i2!=SETref_(i2)){
    -            qh_fprintf(stderr, 6312, "%s: SETref_(i2) [%p] does not point to i2 (the %d'th element)\n", name, SETref_(i2), i);
    +            qh_fprintf(stderr, 6312, "testqset (%s): SETref_(i2) [%p] does not point to i2 (the %d'th element)\n", name, SETref_(i2), i);
                 error_count++;;
             }
             i++;
    @@ -838,22 +847,22 @@
             /* Must be first conditional, otherwise it trips up msvc 8 */
             i2T **p= SETelemaddr_(set, i2_i, i2T);
             if(i2!=*p){
    -            qh_fprintf(stderr, 6320, "%s: SETelemaddr_(set, %d, i2T) [%p] does not point to i2\n", name, i2_i, SETelemaddr_(set, i2_i, int));
    +            qh_fprintf(stderr, 6320, "testqset (%s): SETelemaddr_(set, %d, i2T) [%p] does not point to i2\n", name, i2_i, SETelemaddr_(set, i2_i, int));
                 error_count++;;
             }
             if(i2_i==0){
                 if(first!=*i2){
    -                qh_fprintf(stderr, 6314, "%s: First element is %d instead of SETfirst %d\n", name, *i2, first);
    +                qh_fprintf(stderr, 6314, "testqset (%s): First element is %d instead of SETfirst %d\n", name, *i2, first);
                     error_count++;;
                 }
                 if(rangeA!=*i2){
    -                qh_fprintf(stderr, 6315, "%s: starts with %d instead of rangeA %d\n", name, *i2, rangeA);
    +                qh_fprintf(stderr, 6315, "testqset (%s): starts with %d instead of rangeA %d\n", name, *i2, rangeA);
                     error_count++;;
                 }
                 prev= rangeA;
             }else{
                 if(i2_i==1 && second!=*i2){
    -                qh_fprintf(stderr, 6316, "%s: Second element is %d instead of SETsecond %d\n", name, *i2, second);
    +                qh_fprintf(stderr, 6316, "testqset (%s): Second element is %d instead of SETsecond %d\n", name, *i2, second);
                     error_count++;;
                 }
                 if(prev+1==*i2){
    @@ -869,22 +878,22 @@
                         rangeCount++;
                     }else{
                         prev++;
    -                    qh_fprintf(stderr, 6317, "%s: Expecting %d'th element to be %d.  Got %d\n", name, i2_i, prev, *i2);
    +                    qh_fprintf(stderr, 6317, "testqset (%s): Expecting %d'th element to be %d.  Got %d\n", name, i2_i, prev, *i2);
                         error_count++;
                     }
                 }
             }
             if(i2!=SETelem_(set, i2_i)){
    -            qh_fprintf(stderr, 6318, "%s: SETelem_(set, %d) [%p] is not i2 [%p] (the %d'th element)\n", name, i2_i, SETelem_(set, i2_i), i2, i2_i);
    +            qh_fprintf(stderr, 6318, "testqset (%s): SETelem_(set, %d) [%p] is not i2 [%p] (the %d'th element)\n", name, i2_i, SETelem_(set, i2_i), i2, i2_i);
                 error_count++;;
             }
             if(SETelemt_(set, i2_i, i2T)!=SETelem_(set, i2_i)){   /* Normally SETelemt_ is used for generic sets */
    -            qh_fprintf(stderr, 6319, "%s: SETelemt_(set, %d, i2T) [%p] is not SETelem_(set, %d) [%p] (the %d'th element)\n", name, i2_i, SETelemt_(set, i2_i, int), i2_i, SETelem_(set, i2_i), i2_i);
    +            qh_fprintf(stderr, 6319, "testqset (%s): SETelemt_(set, %d, i2T) [%p] is not SETelem_(set, %d) [%p] (the %d'th element)\n", name, i2_i, SETelemt_(set, i2_i, int), i2_i, SETelem_(set, i2_i), i2_i);
                 error_count++;;
             }
         }
         if(error_count>=MAXerrorCount){
    -        qh_fprintf(stderr, 8011, "testqset: Stop testing after %d errors\n", error_count);
    +        qh_fprintf(stderr, 8161, "testqset (checkSetContents): Stop testing after %d errors\n", error_count);
             exit(1);
         }
     }/*checkSetContents*/
    diff -Nru qhull-2015.2/src/testqset_r/testqset_r.c qhull-2020.2/src/testqset_r/testqset_r.c
    --- qhull-2015.2/src/testqset_r/testqset_r.c	2016-01-18 05:24:00.000000000 +0000
    +++ qhull-2020.2/src/testqset_r/testqset_r.c	2020-05-22 02:00:58.000000000 +0000
    @@ -1,12 +1,12 @@
    -/*
      -
      ---------------------------------
     
    -   testset.c -- test qset.c and its use of mem.c
    +   testset_r.c -- test qset_r.c and its use of mem_r.c
     
        The test sets are pointers to int.  Normally a set is a pointer to a type (e.g., facetT, ridgeT, etc.).
        For consistency in notation, an "int" is typedef'd to i2T
     
    -Functions and macros from qset.h.  Counts occurrences in this test.  Does not correspond to thoroughness.
    +Functions and macros from qset_r.h.  Counts occurrences in this test.  Does not correspond to thoroughness.
         qh_setaddsorted -- 4 tests
         qh_setaddnth -- 1 test
         qh_setappend -- 7 tests
    @@ -66,9 +66,9 @@
         SETsecondt_ -- 2 tests
         SETtruncate_ -- 2 tests
     
    -    Copyright (c) 2012-2015 C.B. Barber. All rights reserved.
    -    $Id: //main/2015/qhull/src/testqset_r/testqset_r.c#5 $$Change: 2064 $
    -    $DateTime: 2016/01/18 12:36:08 $$Author: bbarber $
    +    Copyright (c) 2012-2020 C.B. Barber. All rights reserved.
    +    $Id: //main/2019/qhull/src/testqset_r/testqset_r.c#5 $$Change: 2953 $
    +    $DateTime: 2020/05/21 22:05:32 $$Author: bbarber $
     */
     
     #include "libqhull_r/user_r.h"  /* QHULL_CRTDBG */
    @@ -84,14 +84,14 @@
     typedef int i2T;
     #define MAXerrorCount 100 /* quit after n errors */
     
    -#define FOREACHint_( ints ) FOREACHsetelement_( i2T, ints, i2)
    -#define FOREACHint4_( ints ) FOREACHsetelement_( i2T, ints, i4)
    -#define FOREACHint_i_( qh, ints ) FOREACHsetelement_i_( qh, i2T, ints, i2)
    -#define FOREACHintreverse_( qh, ints ) FOREACHsetelementreverse_( qh, i2T, ints, i2)
    -#define FOREACHintreverse12_( ints ) FOREACHsetelementreverse12_( i2T, ints, i2)
    +#define FOREACHint_( ints ) FOREACHsetelement_(i2T, ints, i2)
    +#define FOREACHint_i_(qh, ints) FOREACHsetelement_i_(qh, i2T, ints, i2)
    +/* not tested -- #define FOREACHint4_( ints ) FOREACHsetelement_(i2T, ints, i4) */
    +/* not tested -- #define FOREACHintreverse_(qh, ints) FOREACHsetelementreverse_(qh, i2T, ints, i2) */
    +/* not tested -- #define FOREACHintreverse12_( ints ) FOREACHsetelementreverse12_(i2T, ints, i2) */
     
     enum {
    -    MAXint= 0x7fffffff,
    +    MAXint= 0x7fffffff
     };
     
     char prompt[]= "testqset_r N [M] [T5] -- Test reentrant qset_r.c and mem_r.c\n\
    @@ -109,7 +109,7 @@
     
     int error_count= 0;  /* Global error_count.  checkSetContents(qh) keeps its own error count.  It exits on too many errors */
     
    -/* Macros normally defined in geom.h */
    +/* Macros normally defined in geom_r.h */
     #define fmax_( a,b )  ( ( a ) < ( b ) ? ( b ) : ( a ) )
     
     /* Macros normally defined in QhullSet.h */
    @@ -121,8 +121,9 @@
     void    qh_free(void *mem);
     void   *qh_malloc(size_t size);
     
    -/* Normally defined in user_r.c */
    +/* Normally defined in user_r.c, use void instead of facetT/ridgeT for testqset_r.c */
     
    +void    qh_errexit(qhT *qh, int exitcode, facetT *f, ridgeT *r);
     void    qh_errexit(qhT *qh, int exitcode, facetT *f, ridgeT *r)
     {
         (void)f; /* unused */
    @@ -131,8 +132,9 @@
         qh_exit(exitcode);
     }
     
    -/* Normally defined in userprintf.c */
    +/* Normally defined in userprintf_r.c */
     
    +void    qh_fprintf(qhT *qh, FILE *fp, int msgcode, const char *fmt, ... );
     void    qh_fprintf(qhT *qh, FILE *fp, int msgcode, const char *fmt, ... )
     {
         static int needs_cr= 0;  /* True if qh_fprintf needs a CR. testqset_r is not itself reentrant */
    @@ -143,10 +145,10 @@
         if (!fp) {
             /* Do not use qh_fprintf_stderr.  This is a standalone program */
             if(!qh)
    -            fprintf(stderr, "QH6241 qh_fprintf: fp and qh not defined for '%s'", fmt);
    +            fprintf(stderr, "QH6043 testqset_r (qh_fprintf): fp and qh not defined for '%s'\n", fmt);
             else
    -            fprintf(stderr, "QH6232 qh_fprintf: fp is 0.  Was wrong qh_fprintf called for '%s'", fmt);
    -        qh_errexit(qh, 6232, NULL, NULL);
    +            fprintf(stderr, "QH6232 testqset_r (qh_fprintf): fp is 0.  Was wrong qh_fprintf called for '%s'\n", fmt);
    +        qh_errexit(qh, qh_ERRqhull, NULL, NULL);
         }
         if(fmtlen>0){
             if(fmt[fmtlen-1]=='\n'){
    @@ -159,7 +161,7 @@
             }
         }
         if(msgcode>=6000 && msgcode<7000){
    -        fprintf(fp, "Error TQ%d ", msgcode);
    +        fprintf(fp, "Error QH%d ", msgcode);
         }
         va_start(args, fmt);
         vfprintf(fp, fmt, args);
    @@ -187,7 +189,7 @@
         int *intarray= NULL;
         int numInts;
         int checkEvery= MAXint;
    -    int curlong, totlong;
    +    int curlong, totlong;  /* used if !qh_NOmem */
         int traceLevel= 4; /* 4 normally, no tracing since qset does not log.  Option 'T5' for memory tracing */
         qhT qh_qh;
         qhT *qh= &qh_qh;
    @@ -209,17 +211,21 @@
         testSettemp(qh, numInts, intarray, checkEvery);
         testSetlastEtc(qh, numInts, intarray, checkEvery);
         testSetdelsortedEtc(qh, numInts, intarray, checkEvery);
    -    printf("\n\nNot testing qh_setduplicate and qh_setfree2.\n  These routines use heap-allocated set contents.  See qhull tests.\n");
    +    qh_fprintf(qh, stderr, 8083, "\nNot testing qh_setduplicate and qh_setfree2.  These routines use heap-allocated,\n\
    +set contents.  See qhull tests in eg/q_test and bin/qhulltest.\n\n");
     
    -    qh_memstatistics(qh, stdout);
    +    qh_memstatistics(qh, stderr);
    +#ifndef qh_NOmem
         qh_memfreeshort(qh, &curlong, &totlong);
         if (curlong || totlong){
    -        qh_fprintf(qh, stderr, 8043, "qh_memfreeshort: did not free %d bytes of long memory(%d pieces)\n", totlong, curlong);
    +        qh_fprintf(qh, stderr, 8084, "testqset_r: did not free %d bytes of long memory(%d pieces)\n", totlong, curlong);
             error_count++;
         }
    +#endif
    +    fflush(NULL);
         if(error_count){
    -        qh_fprintf(qh, stderr, 8012, "testqset: %d errors\n\n", error_count);
    -        exit(1);
    +        qh_fprintf(qh, stderr, 8088, "testqset_r: %d errors\n\n", error_count);
    +        exit(qh_ERRqhull);
         }else{
             printf("testqset_r: OK\n\n");
         }
    @@ -239,12 +245,12 @@
         }
         numIntsArg= strtol(argv[1], &endp, 10);
         if(numIntsArg<1){
    -        qh_fprintf(qh, stderr, 6301, "First argument should be 1 or greater.  Got '%s'\n", argv[1]);
    -        exit(1);
    +        qh_fprintf(qh, stderr, 6301, "testqset_r: First argument should be 1 or greater.  Got '%s'\n", argv[1]);
    +        exit(qh_ERRinput);
         }
         if(numIntsArg>MAXint){
    -        qh_fprintf(qh, stderr, 6302, "qset does not currently support 64-bit ints.  Maximum count is %d\n", MAXint);
    -        exit(1);
    +        qh_fprintf(qh, stderr, 6302, "testqset_r: qset does not currently support 64-bit ints.  Maximum count is %d\n", MAXint);
    +        exit(qh_ERRinput);
         }
         *numInts= (int)numIntsArg;
     
    @@ -255,20 +261,20 @@
         if(argc==4 || (argc==3 && !isTracing)){
             checkEveryArg= strtol(argv[2], &endp, 10);
             if(checkEveryArg<1){
    -            qh_fprintf(qh, stderr, 6321, "checkEvery argument should be 1 or greater.  Got '%s'\n", argv[2]);
    -            exit(1);
    +            qh_fprintf(qh, stderr, 6321, "testqset_r: checkEvery argument should be 1 or greater.  Got '%s'\n", argv[2]);
    +            exit(qh_ERRinput);
             }
             if(checkEveryArg>MAXint){
    -            qh_fprintf(qh, stderr, 6322, "qset does not currently support 64-bit ints.  Maximum checkEvery is %d\n", MAXint);
    -            exit(1);
    +            qh_fprintf(qh, stderr, 6322, "testqset_r: qset does not currently support 64-bit ints.  Maximum checkEvery is %d\n", MAXint);
    +            exit(qh_ERRinput);
             }
             if(argc==4){
                 if(argv[3][0]=='T' && argv[3][1]=='5' ){
                     isTracing= 1;
                     *traceLevel= 5;
                 }else{
    -                qh_fprintf(qh, stderr, 6242, "Optional third argument must be 'T5'.  Got '%s'\n", argv[3]);
    -                exit(1);
    +                qh_fprintf(qh, stderr, 6242, "testqset_r: Optional third argument must be 'T5'.  Got '%s'\n", argv[3]);
    +                exit(qh_ERRinput);
                 }
             }
             *checkEvery= (int)checkEveryArg;
    @@ -279,13 +285,13 @@
     {
         int i;
         if(numInts<0 || numInts*(int)sizeof(int)<0){
    -        qh_fprintf(qh, stderr, 6303, "qset does not currently support 64-bit ints.  Integer overflow\n");
    -        exit(1);
    +        qh_fprintf(qh, stderr, 6303, "testqset_r: qset does not currently support 64-bit ints.  Integer overflow\n");
    +        exit(qh_ERRinput);
         }
    -    *intarray= qh_malloc(numInts * sizeof(int));
    +    *intarray= (int *)qh_malloc((unsigned int)numInts * sizeof(int));
         if(!*intarray){
    -        qh_fprintf(qh, stderr, 6304, "Failed to allocate %d bytes of memory\n", numInts * sizeof(int));
    -        exit(1);
    +        qh_fprintf(qh, stderr, 6304, "testqset_r: Failed to allocate %d bytes of memory\n", numInts * (int)sizeof(int));
    +        exit(qh_ERRmem);
         }
         for(i= 0; i=2){
             isCheck= log_i(qh, ints, "n", numInts/2, numInts, checkEvery);
             qh_settruncate(qh, ints, numInts/2);
    @@ -326,7 +332,7 @@
         qh_settruncate(qh, ints, 0);
         checkSetContents(qh, "qh_settruncate", ints, 0, -1, -1, -1);
     
    -    qh_fprintf(qh, stderr, 8003, "\n\nTesting qh_setappend2ndlast 0,0..%d.  Test 0", numInts-1);
    +    qh_fprintf(qh, stderr, 8122, "\n\nTesting qh_setappend2ndlast 0,0..%d.  Test 0", numInts-1);
         qh_setfree(qh, &ints);
         ints= qh_setnew(qh, 4);
         qh_setappend(qh, &ints, intarray+0);
    @@ -337,7 +343,7 @@
                 checkSetContents(qh, "qh_setappend2ndlast", ints, i+2, 0, 0, -1);
             }
         }
    -    qh_fprintf(qh, stderr, 8015, "\n\nTesting SETtruncate_ %d and 0.  Test", numInts/2);
    +    qh_fprintf(qh, stderr, 8146, "\n\nTesting SETtruncate_ %d and 0.  Test", numInts/2);
         if(numInts>=2){
             isCheck= log_i(qh, ints, "n", numInts/2, numInts, checkEvery);
             SETtruncate_(ints, numInts/2);
    @@ -355,7 +361,7 @@
         setT *ints=qh_setnew(qh, 1);
         int i,j,isCheck;
     
    -    qh_fprintf(qh, stderr, 8003, "\n\nTesting qh_setdelnthsorted and qh_setaddnth 1..%d. Test", numInts-1);
    +    qh_fprintf(qh, stderr, 8147, "\n\nTesting qh_setdelnthsorted and qh_setaddnth 1..%d. Test", numInts-1);
         for(j=1; j0){
                     if(qh_setequal(ints, ints2)){
    -                    qh_fprintf(qh, stderr, 6324, "testSetequalInEtc: non-empty set equal to empty set\n", j);
    +                    qh_fprintf(qh, stderr, 6324, "testqset_r (testSetequalInEtc): non-empty set equal to empty set\n", j);
                         error_count++;
                     }
                     qh_setfree(qh, &ints3);
    @@ -541,27 +547,27 @@
                         checkSetContents(qh, "qh_setreplace 3", ints3, j, 0, j/2+1, j/2+1);
                     }
                     if(qh_setequal(ints, ints3)){
    -                    qh_fprintf(qh, stderr, 6325, "testSetequalInEtc: modified set equal to original set at %d/2\n", j);
    +                    qh_fprintf(qh, stderr, 6325, "testqset_r (testSetequalInEtc): modified set equal to original set at %d/2\n", j);
                         error_count++;
                     }
                     if(!qh_setequal_except(ints, intarray+j/2, ints3, intarray+j/2+1)){
    -                    qh_fprintf(qh, stderr, 6326, "qh_setequal_except: modified set not equal to original set except modified\n", j);
    +                    qh_fprintf(qh, stderr, 6326, "testqset_r (qh_setequal_except): modified set not equal to original set except modified\n", j);
                         error_count++;
                     }
                     if(qh_setequal_except(ints, intarray+j/2, ints3, intarray)){
    -                    qh_fprintf(qh, stderr, 6327, "qh_setequal_except: modified set equal to original set with wrong excepts\n", j);
    +                    qh_fprintf(qh, stderr, 6327, "testqset_r (qh_setequal_except): modified set equal to original set with wrong excepts\n", j);
                         error_count++;
                     }
                     if(!qh_setequal_skip(ints, j/2, ints3, j/2)){
    -                    qh_fprintf(qh, stderr, 6328, "qh_setequal_skip: modified set not equal to original set except modified\n", j);
    +                    qh_fprintf(qh, stderr, 6328, "testqset_r (qh_setequal_skip): modified set not equal to original set except modified\n", j);
                         error_count++;
                     }
                     if(j>2 && qh_setequal_skip(ints, j/2, ints3, 0)){
    -                    qh_fprintf(qh, stderr, 6329, "qh_setequal_skip: modified set equal to original set with wrong excepts\n", j);
    +                    qh_fprintf(qh, stderr, 6329, "testqset_r (qh_setequal_skip): modified set equal to original set with wrong excepts\n", j);
                         error_count++;
                     }
                     if(intarray+j/2+1!=qh_setdel(ints3, intarray+j/2+1)){
    -                    qh_fprintf(qh, stderr, 6330, "qh_setdel: failed to find added element\n", j);
    +                    qh_fprintf(qh, stderr, 6330, "testqset_r (qh_setdel): failed to find added element\n", j);
                         error_count++;
                     }
                     checkSetContents(qh, "qh_setdel", ints3, j-1, 0, j-1, (j==1 ? -1 : j/2+1));  /* swaps last element with deleted element */
    @@ -570,31 +576,31 @@
                         checkSetContents(qh, "qh_setdelnth", ints3, j-2, 0, j-2, (j==2 ? -1 : j/2+1));
                     }
                     if(qh_setin(ints3, intarray+j/2)){
    -                    qh_fprintf(qh, stderr, 6331, "qh_setin: found deleted element\n");
    +                    qh_fprintf(qh, stderr, 6331, "testqset_r (qh_setin): found deleted element\n");
                         error_count++;
                     }
                     if(j>4 && !qh_setin(ints3, intarray+1)){
    -                    qh_fprintf(qh, stderr, 6332, "qh_setin: did not find second element\n");
    +                    qh_fprintf(qh, stderr, 6332, "testqset_r (qh_setin): did not find second element\n");
                         error_count++;
                     }
                     if(j>4 && !qh_setin(ints3, intarray+j-2)){
    -                    qh_fprintf(qh, stderr, 6333, "qh_setin: did not find last element\n");
    +                    qh_fprintf(qh, stderr, 6333, "testqset_r (qh_setin): did not find last element\n");
                         error_count++;
                     }
                     if(-1!=qh_setindex(ints2, intarray)){
    -                    qh_fprintf(qh, stderr, 6334, "qh_setindex: found element in empty set\n");
    +                    qh_fprintf(qh, stderr, 6334, "testqset_r (qh_setindex): found element in empty set\n");
                         error_count++;
                     }
                     if(-1!=qh_setindex(ints3, intarray+j/2)){
    -                    qh_fprintf(qh, stderr, 6335, "qh_setindex: found deleted element in set\n");
    +                    qh_fprintf(qh, stderr, 6335, "testqset_r (qh_setindex): found deleted element in set\n");
                         error_count++;
                     }
                     if(0!=qh_setindex(ints, intarray)){
    -                    qh_fprintf(qh, stderr, 6336, "qh_setindex: did not find first in set\n");
    +                    qh_fprintf(qh, stderr, 6336, "testqset_r (qh_setindex): did not find first in set\n");
                         error_count++;
                     }
                     if(j-1!=qh_setindex(ints, intarray+j-1)){
    -                    qh_fprintf(qh, stderr, 6337, "qh_setindex: did not find last in set\n");
    +                    qh_fprintf(qh, stderr, 6337, "testqset_r (qh_setindex): did not find last in set\n");
                         error_count++;
                     }
                 }
    @@ -615,40 +621,40 @@
         setT *ints2= NULL;
         int i,j,prepend;
     
    -    qh_fprintf(qh, stderr, 8020, "\n\nTesting qh_setlast, qh_setnew_delnthsorted, qh_setunique, and qh_setzero 0..%d. Test", numInts-1);
    +    qh_fprintf(qh, stderr, 8152, "\n\nTesting qh_setlast, qh_setnew_delnthsorted, qh_setunique, and qh_setzero 0..%d. Test", numInts-1);
         for(j=0; j0){
                     if(intarray+j-1!=qh_setlast(ints)){
    -                    qh_fprintf(qh, stderr, 6338, "qh_setlast: wrong last element\n");
    +                    qh_fprintf(qh, stderr, 6338, "testqset_r (qh_setlast): wrong last element\n");
                         error_count++;
                     }
                     prepend= (j<100 ? j/4 : 0);
                     ints2= qh_setnew_delnthsorted(qh, ints, qh_setsize(qh, ints), j/2, prepend);
                     if(qh_setsize(qh, ints2)!=j+prepend-1){
    -                    qh_fprintf(qh, stderr, 6345, "qh_setnew_delnthsorted: Expecting %d elements, got %d\n", j+prepend-1, qh_setsize(qh, ints2));
    +                    qh_fprintf(qh, stderr, 6345, "testqset_r (qh_setnew_delnthsorted): Expecting %d elements, got %d\n", j+prepend-1, qh_setsize(qh, ints2));
                         error_count++;
                     }
                     /* Define prepended elements.  Otherwise qh_setdelnthsorted may fail */
    @@ -663,7 +669,7 @@
                     if(j>2){
                         qh_setzero(qh, ints2, j/2, j-1);  /* max size may be j-1 */
                         if(qh_setsize(qh, ints2)!=j-1){
    -                        qh_fprintf(qh, stderr, 6342, "qh_setzero: Expecting %d elements, got %d\n", j, qh_setsize(qh, ints2));
    +                        qh_fprintf(qh, stderr, 6342, "testqset_r (qh_setzero): Expecting %d elements, got %d\n", j, qh_setsize(qh, ints2));
                             error_count++;
                         }
                         qh_setcompact(qh, ints2);
    @@ -686,7 +692,7 @@
         setT *ints3= NULL;
         int i,j;
     
    -    qh_fprintf(qh, stderr, 8021, "\n\nTesting qh_settemp* 0..%d. Test", numInts-1);
    +    qh_fprintf(qh, stderr, 8153, "\n\nTesting qh_settemp* 0..%d. Test", numInts-1);
         for(j=0; j=1){
                     scale *= 10;
                     e++;
                 }
                 if(i==numInts-1){
    -                qh_fprintf(qh, stderr, 8008, " %s%d", s, i);
    +                qh_fprintf(qh, stderr, 8158, " %s%d", s, i);
                 }else if(i==scale){
                     if(i<=1000){
    -                    qh_fprintf(qh, stderr, 8010, " %s%d", s, i);
    +                    qh_fprintf(qh, stderr, 8159, " %s%d", s, i);
                     }else{
    -                    qh_fprintf(qh, stderr, 8009, " %s1e%d", s, e);
    +                    qh_fprintf(qh, stderr, 8160, " %s1e%d", s, e);
                     }
                 }
             }
    @@ -780,38 +786,38 @@
         if(set){
             SETreturnsize_(set, actualSize);  /* normally used only when speed is critical */
             if(*qh_setendpointer(set)!=NULL){
    -            qh_fprintf(qh, stderr, 6344, "%s: qh_setendpointer(set), 0x%x, is not NULL terminator of set 0x%x", name, qh_setendpointer(set), set);
    +            qh_fprintf(qh, stderr, 6344, "testqset_r (%s): qh_setendpointer(set), 0x%x, is not NULL terminator of set 0x%x\n", name, qh_setendpointer(set), set);
                 error_count++;
             }
         }
         if(actualSize!=qh_setsize(qh, set)){
    -        qh_fprintf(qh, stderr, 6305, "%s: SETreturnsize_(qh) returned %d while qh_setsize(qh) returns %d\n", name, actualSize, qh_setsize(qh, set));
    +        qh_fprintf(qh, stderr, 6305, "testqset_r (%s): SETreturnsize_(qh) returned %d while qh_setsize(qh) returns %d\n", name, actualSize, qh_setsize(qh, set));
             error_count++;
         }else if(actualSize!=count){
    -        qh_fprintf(qh, stderr, 6306, "%s: Expecting %d elements for set.  Got %d elements\n", name, count, actualSize);
    +        qh_fprintf(qh, stderr, 6306, "testqset_r (%s): Expecting %d elements for set.  Got %d elements\n", name, count, actualSize);
             error_count++;
         }
         if(SETempty_(set)){
             if(count!=0){
    -            qh_fprintf(qh, stderr, 6307, "%s: Got empty set instead of count %d, rangeA %d, rangeB %d, rangeC %d\n", name, count, rangeA, rangeB, rangeC);
    +            qh_fprintf(qh, stderr, 6307, "testqset_r (%s): Got empty set instead of count %d, rangeA %d, rangeB %d, rangeC %d\n", name, count, rangeA, rangeB, rangeC);
                 error_count++;
             }
         }else{
             /* Must be first, otherwise trips msvc 8 */
             i2T **p= SETaddr_(set, i2T);
             if(*p!=SETfirstt_(set, i2T)){
    -            qh_fprintf(qh, stderr, 6309, "%s: SETaddr_(set, i2t) [%p] is not the same as SETfirst_(set) [%p]\n", name, SETaddr_(set, i2T), SETfirst_(set));
    +            qh_fprintf(qh, stderr, 6309, "testqset_r (%s): SETaddr_(set, i2t) [%p] is not the same as SETfirst_(set) [%p]\n", name, SETaddr_(set, i2T), SETfirst_(set));
                 error_count++;
             }
             first= *(int *)SETfirst_(set);
             if(SETfirst_(set)!=SETfirstt_(set, i2T)){
    -            qh_fprintf(qh, stderr, 6308, "%s: SETfirst_(set) [%p] is not the same as SETfirstt_(set, i2T [%p]\n", name, SETfirst_(set), SETfirstt_(set, i2T));
    +            qh_fprintf(qh, stderr, 6308, "testqset_r (%s): SETfirst_(set) [%p] is not the same as SETfirstt_(set, i2T [%p]\n", name, SETfirst_(set), SETfirstt_(set, i2T));
                 error_count++;
             }
             if(qh_setsize(qh, set)>1){
                 second= *(int *)SETsecond_(set);
                 if(SETsecond_(set)!=SETsecondt_(set, i2T)){
    -                qh_fprintf(qh, stderr, 6310, "%s: SETsecond_(set) [%p] is not the same as SETsecondt_(set, i2T) [%p]\n", name, SETsecond_(set), SETsecondt_(set, i2T));
    +                qh_fprintf(qh, stderr, 6310, "testqset_r (%s): SETsecond_(set) [%p] is not the same as SETsecondt_(set, i2T) [%p]\n", name, SETsecond_(set), SETsecondt_(set, i2T));
                     error_count++;
                 }
             }
    @@ -824,11 +830,11 @@
             }
             prev= *i2;
             if(SETindex_(set, i2)!=i){
    -            qh_fprintf(qh, stderr, 6311, "%s: Expecting SETindex_(set, pointer-to-%d) to be %d.  Got %d\n", name, *i2, i, SETindex_(set, i2));
    +            qh_fprintf(qh, stderr, 6311, "testqset_r (%s): Expecting SETindex_(set, pointer-to-%d) to be %d.  Got %d\n", name, *i2, i, SETindex_(set, i2));
                 error_count++;;
             }
             if(i2!=SETref_(i2)){
    -            qh_fprintf(qh, stderr, 6312, "%s: SETref_(i2) [%p] does not point to i2 (the %d'th element)\n", name, SETref_(i2), i);
    +            qh_fprintf(qh, stderr, 6312, "testqset_r (%s): SETref_(i2) [%p] does not point to i2 (the %d'th element)\n", name, SETref_(i2), i);
                 error_count++;;
             }
             i++;
    @@ -837,22 +843,22 @@
             /* Must be first conditional, otherwise it trips up msvc 8 */
             i2T **p= SETelemaddr_(set, i2_i, i2T);
             if(i2!=*p){
    -            qh_fprintf(qh, stderr, 6320, "%s: SETelemaddr_(set, %d, i2T) [%p] does not point to i2\n", name, i2_i, SETelemaddr_(set, i2_i, int));
    +            qh_fprintf(qh, stderr, 6320, "testqset_r (%s): SETelemaddr_(set, %d, i2T) [%p] does not point to i2\n", name, i2_i, SETelemaddr_(set, i2_i, int));
                 error_count++;;
             }
             if(i2_i==0){
                 if(first!=*i2){
    -                qh_fprintf(qh, stderr, 6314, "%s: First element is %d instead of SETfirst %d\n", name, *i2, first);
    +                qh_fprintf(qh, stderr, 6314, "testqset_r (%s): First element is %d instead of SETfirst %d\n", name, *i2, first);
                     error_count++;;
                 }
                 if(rangeA!=*i2){
    -                qh_fprintf(qh, stderr, 6315, "%s: starts with %d instead of rangeA %d\n", name, *i2, rangeA);
    +                qh_fprintf(qh, stderr, 6315, "testqset_r (%s): starts with %d instead of rangeA %d\n", name, *i2, rangeA);
                     error_count++;;
                 }
                 prev= rangeA;
             }else{
                 if(i2_i==1 && second!=*i2){
    -                qh_fprintf(qh, stderr, 6316, "%s: Second element is %d instead of SETsecond %d\n", name, *i2, second);
    +                qh_fprintf(qh, stderr, 6316, "testqset_r (%s): Second element is %d instead of SETsecond %d\n", name, *i2, second);
                     error_count++;;
                 }
                 if(prev+1==*i2){
    @@ -868,22 +874,22 @@
                         rangeCount++;
                     }else{
                         prev++;
    -                    qh_fprintf(qh, stderr, 6317, "%s: Expecting %d'th element to be %d.  Got %d\n", name, i2_i, prev, *i2);
    +                    qh_fprintf(qh, stderr, 6317, "testqset_r (%s): Expecting %d'th element to be %d.  Got %d\n", name, i2_i, prev, *i2);
                         error_count++;
                     }
                 }
             }
             if(i2!=SETelem_(set, i2_i)){
    -            qh_fprintf(qh, stderr, 6318, "%s: SETelem_(set, %d) [%p] is not i2 [%p] (the %d'th element)\n", name, i2_i, SETelem_(set, i2_i), i2, i2_i);
    +            qh_fprintf(qh, stderr, 6318, "testqset_r (%s): SETelem_(set, %d) [%p] is not i2 [%p] (the %d'th element)\n", name, i2_i, SETelem_(set, i2_i), i2, i2_i);
                 error_count++;;
             }
             if(SETelemt_(set, i2_i, i2T)!=SETelem_(set, i2_i)){   /* Normally SETelemt_ is used for generic sets */
    -            qh_fprintf(qh, stderr, 6319, "%s: SETelemt_(set, %d, i2T) [%p] is not SETelem_(set, %d) [%p] (the %d'th element)\n", name, i2_i, SETelemt_(set, i2_i, int), i2_i, SETelem_(set, i2_i), i2_i);
    +            qh_fprintf(qh, stderr, 6319, "testqset_r (%s): SETelemt_(set, %d, i2T) [%p] is not SETelem_(set, %d) [%p] (the %d'th element)\n", name, i2_i, SETelemt_(set, i2_i, int), i2_i, SETelem_(set, i2_i), i2_i);
                 error_count++;;
             }
         }
         if(error_count>=MAXerrorCount){
    -        qh_fprintf(qh, stderr, 8011, "testqset: Stop testing after %d errors\n", error_count);
    +        qh_fprintf(qh, stderr, 8161, "testqset_r (checkSetContents): Stop testing after %d errors\n", error_count);
             exit(1);
         }
     }/*checkSetContents*/
    diff -Nru qhull-2015.2/src/user_eg/user_eg.c qhull-2020.2/src/user_eg/user_eg.c
    --- qhull-2015.2/src/user_eg/user_eg.c	2016-01-18 21:43:36.000000000 +0000
    +++ qhull-2020.2/src/user_eg/user_eg.c	2019-06-26 14:37:34.000000000 +0000
    @@ -2,7 +2,7 @@
       >--------------------------------
     
       user_eg.c
    -  sample code for calling qhull() from an application
    +  sample code for calling qhull() from an application.  Uses non-reentrant libqhull
     
       call with:
     
    @@ -45,7 +45,6 @@
        see libqhull.h for data structures, macros, and user-callable functions.
     */
     
    -#define qh_QHimport
     #include "libqhull/qhull_a.h"
     
     /*-------------------------------------------------
    @@ -58,7 +57,7 @@
     void makehalf(coordT *points, int numpoints, int dim);
     
     /*-------------------------------------------------
    --print_summary()
    +-print_summary( )
     */
     void print_summary(void) {
       facetT *facet;
    @@ -103,10 +102,10 @@
       coordT *point, realr;
     
       printf("seed: %d\n", seed);
    -  qh_RANDOMseed_( seed);
    +  qh_RANDOMseed_(seed);
       for (j=0; jlocate a facet with qh_findbestfacet()
       calls qh_setdelaunay() to project the point to a parabaloid
     warning:
    -  This is not implemented for tricoplanar facets ('Qt'),
    -  See locate a facet with qh_findbestfacet()
    +  Errors if it finds a tricoplanar facet ('Qt').  The corresponding Delaunay triangle
    +  is in the set of tricoplanar facets or one of their neighbors.  This search
    +  is not implemented here.
     */
     void findDelaunay(int dim) {
       int k;
    @@ -130,12 +131,12 @@
       facetT *facet;
       vertexT *vertex, **vertexp;
     
    -  for (k= 0; k < dim; k++)
    +  for (k=0; k < dim; k++)
         point[k]= 0.5;
       qh_setdelaunay(dim+1, 1, point);
       facet= qh_findbestfacet(point, qh_ALL, &bestdist, &isoutside);
       if (facet->tricoplanar) {
    -    fprintf(stderr, "findDelaunay: not implemented for triangulated, non-simplicial Delaunay regions (tricoplanar facet, f%d).\n",
    +    fprintf(stderr, "findDelaunay: search not implemented for triangulated, non-simplicial Delaunay regions (tricoplanar facet, f%d).\n",
            facet->id);
         qh_errexit(qh_ERRqhull, facet, NULL);
       }
    @@ -194,17 +195,20 @@
       FILE *errfile= stderr;    /* error messages from qhull code */
       int exitcode;             /* 0 if no error from qhull */
       facetT *facet;            /* set by FORALLfacets */
    -  int curlong, totlong;     /* memory remaining after qh_memfreeshort */
    +  int curlong, totlong;     /* memory remaining after qh_memfreeshort, used if !qh_NOmem  */
       int i;
     
       QHULL_LIB_CHECK
     
    -  printf("This is the output from user_eg.c\n\n\
    -It shows how qhull() may be called from an application using the qhull\n\
    -shared library.  user_eg is not part of qhull itself.  If it appears\n\
    -accidently, please remove user_eg.c from your project.  If it fails\n\
    -immediately, user_eg.c was incorrectly linked to the reentrant library.\n\
    -Also try 'user_eg T1 2>&1'\n\n");
    +
    +  printf("\n========\nuser_eg 'cube qhull options' 'Delaunay options' 'halfspace options'\n\
    +\n\
    +This is the output from user_eg.c.  It shows how qhull() may be called from\n\
    +an application, via Qhull's shared, non-rentrant library.  user_eg is not part of\n\
    +Qhull itself.  If user_eg fails immediately, user_eg.c was incorrectly linked\n\
    +to Qhull's reentrant library, libqhull_r.\n\
    +Try -- user_eg 'T1' 'T1' 'T1'\n\
    +\n");
     
     #if qh_QHpointer  /* see user.h */
       if (qh_qh){
    @@ -218,15 +222,17 @@
       /*
         Run 1: convex hull
       */
    -  printf( "\ncompute convex hull of cube after rotating input\n");
    +  printf( "\n========\ncompute convex hull of cube after rotating input\n");
       sprintf(flags, "qhull s Tcv %s", argc >= 2 ? argv[1] : "");
       numpoints= SIZEcube;
       makecube(points, numpoints, DIM);
       for (i=numpoints; i--; )
         rows[i]= points+dim*i;
       qh_printmatrix(outfile, "input", rows, numpoints, dim);
    +  fflush(NULL);
       exitcode= qh_new_qhull(dim, numpoints, points, ismalloc,
                           flags, outfile, errfile);
    +  fflush(NULL);
       if (!exitcode) {                  /* if no error */
         /* 'qh facet_list' contains the convex hull */
         print_summary();
    @@ -234,24 +240,30 @@
            /* ... your code ... */
         }
       }
    +#ifdef qh_NOmem
    +  qh_freeqhull(qh_ALL);
    +#else
       qh_freeqhull(!qh_ALL);                   /* free long memory  */
       qh_memfreeshort(&curlong, &totlong);    /* free short memory and memory allocator */
       if (curlong || totlong)
         fprintf(errfile, "qhull internal warning (user_eg, #1): did not free %d bytes of long memory (%d pieces)\n", totlong, curlong);
    +#endif
     
       /*
    -    Run 2: Delaunay triangulation
    +    Run 2: Delaunay triangulation, reusing the previous qh/qh_qh
       */
     
    -  printf( "\ncompute %d-d Delaunay triangulation\n", dim);
    +  printf( "\n========\ncompute %d-d Delaunay triangulation\n", dim);
       sprintf(flags, "qhull s d Tcv %s", argc >= 3 ? argv[2] : "");
       numpoints= SIZEcube;
       makeDelaunay(points, numpoints, dim, (int)time(NULL));
       for (i=numpoints; i--; )
         rows[i]= points+dim*i;
       qh_printmatrix(outfile, "input", rows, numpoints, dim);
    +  fflush(NULL);
       exitcode= qh_new_qhull(dim, numpoints, points, ismalloc,
                           flags, outfile, errfile);
    +  fflush(NULL);
       if (!exitcode) {                  /* if no error */
         /* 'qh facet_list' contains the convex hull */
         /* If you want a Voronoi diagram ('v') and do not request output (i.e., outfile=NULL),
    @@ -260,10 +272,10 @@
         FORALLfacets {
            /* ... your code ... */
         }
    -    printf( "\nfind %d-d Delaunay triangle closest to [0.5, 0.5, ...]\n", dim);
    +    printf( "\nfind %d-d Delaunay triangle or adjacent triangle closest to [0.5, 0.5, ...]\n", dim);
         exitcode= setjmp(qh errexit);
         if (!exitcode) {
    -      /* Trap Qhull errors in findDelaunay().  Without the setjmp(), Qhull
    +      /* Trap Qhull errors from findDelaunay().  Without the setjmp(), Qhull
              will exit() after reporting an error */
           qh NOerrexit= False;
           findDelaunay(DIM);
    @@ -275,7 +287,7 @@
         qhT *oldqhA, *oldqhB;
         coordT pointsB[DIM*TOTpoints]; /* array of coordinates for each point */
     
    -    printf( "\nsave first triangulation and compute a new triangulation\n");
    +    printf( "\n========\nCompute a new triangulation as a separate instance of Qhull\n");
         oldqhA= qh_save_qhull();
         sprintf(flags, "qhull s d Tcv %s", argc >= 3 ? argv[2] : "");
         numpoints= SIZEcube;
    @@ -283,11 +295,13 @@
         for (i=numpoints; i--; )
           rows[i]= pointsB+dim*i;
         qh_printmatrix(outfile, "input", rows, numpoints, dim);
    +    fflush(NULL);
         exitcode= qh_new_qhull(dim, numpoints, pointsB, ismalloc,
                           flags, outfile, errfile);
    +    fflush(NULL);
         if (!exitcode)
           print_summary();
    -    printf( "\nsave second triangulation and restore first one\n");
    +    printf( "\n========\nFree memory allocated by the new instance of Qhull, and redisplay the old results.\n");
         oldqhB= qh_save_qhull();
         qh_restore_qhull(&oldqhA);
         print_summary();
    @@ -295,36 +309,48 @@
         qh_freeqhull(qh_ALL);               /* free short and long memory used by first call */
                                              /* do not use qh_memfreeshort */
         qh_restore_qhull(&oldqhB);
    +    printf( "\n\n");
         print_summary();
       }
     #endif
    +
    +#ifdef qh_NOmem
    +  qh_freeqhull(qh_ALL);
    +#else
       qh_freeqhull(!qh_ALL);                 /* free long memory */
       qh_memfreeshort(&curlong, &totlong);  /* free short memory and memory allocator */
       if (curlong || totlong)
         fprintf(errfile, "qhull internal warning (user_eg, #2): did not free %d bytes of long memory (%d pieces)\n", totlong, curlong);
    +#endif
     
       /*
         Run 3: halfspace intersection about the origin
       */
    -  printf( "\ncompute halfspace intersection about the origin for a diamond\n");
    +  printf( "\n========\ncompute halfspace intersection about the origin for a diamond\n");
       sprintf(flags, "qhull H0 s Tcv %s", argc >= 4 ? argv[3] : "Fp");
       numpoints= SIZEcube;
       makehalf(points, numpoints, dim);
       for (i=numpoints; i--; )
         rows[i]= points+(dim+1)*i;
       qh_printmatrix(outfile, "input as halfspace coefficients + offsets", rows, numpoints, dim+1);
    +  fflush(NULL);
       /* use qh_sethalfspace_all to transform the halfspaces yourself.
          If so, set 'qh feasible_point and do not use option 'Hn,...' [it would retransform the halfspaces]
       */
       exitcode= qh_new_qhull(dim+1, numpoints, points, ismalloc,
                           flags, outfile, errfile);
    +  fflush(NULL);
       if (!exitcode)
         print_summary();
    +#ifdef qh_NOmem
    +  qh_freeqhull(qh_ALL);
    +#else
       qh_freeqhull(!qh_ALL);
       qh_memfreeshort(&curlong, &totlong);
       if (curlong || totlong)  /* could also check previous runs */
         fprintf(stderr, "qhull internal warning (user_eg, #3): did not free %d bytes of long memory (%d pieces)\n",
            totlong, curlong);
    +#endif
       return exitcode;
     } /* main */
     
    diff -Nru qhull-2015.2/src/user_eg/user_eg_r.c qhull-2020.2/src/user_eg/user_eg_r.c
    --- qhull-2015.2/src/user_eg/user_eg_r.c	2016-01-17 21:51:14.000000000 +0000
    +++ qhull-2020.2/src/user_eg/user_eg_r.c	2019-06-26 13:27:22.000000000 +0000
    @@ -42,10 +42,9 @@
     
        compiled by 'make bin/user_eg'
     
    -   see libqhull.h for data structures, macros, and user-callable functions.
    +   see libqhull_r.h for data structures, macros, and user-callable functions.
     */
     
    -#define qh_QHimport
     #include "libqhull_r/qhull_ra.h"
     
     /*-------------------------------------------------
    @@ -96,7 +95,7 @@
     -makeDelaunay- set points for dim Delaunay triangulation of random points
       points is numpoints X dim.
     notes:
    -  makeDelaunay() in user_eg2.c uses qh_setdelaunay() to project points in place.
    +  makeDelaunay() in user_eg2_r.c uses qh_setdelaunay() to project points in place.
     */
     void makeDelaunay(qhT *qh, coordT *points, int numpoints, int dim, int seed) {
       int j,k;
    @@ -106,7 +105,7 @@
       qh_RANDOMseed_(qh, seed);
       for (j=0; jlocate a facet with qh_findbestfacet()
       calls qh_setdelaunay() to project the point to a parabaloid
     warning:
    -  This is not implemented for tricoplanar facets ('Qt'),
    -  See locate a facet with qh_findbestfacet()
    +  Errors if it finds a tricoplanar facet ('Qt').  The corresponding Delaunay triangle
    +  is in the set of tricoplanar facets or one of their neighbors.  This search
    +  is not implemented here.
     */
     void findDelaunay(qhT *qh, int dim) {
       int k;
    @@ -130,12 +131,12 @@
       facetT *facet;
       vertexT *vertex, **vertexp;
     
    -  for (k= 0; k < dim; k++)
    +  for (k=0; k < dim; k++)
         point[k]= 0.5;
       qh_setdelaunay(qh, dim+1, 1, point);
       facet= qh_findbestfacet(qh, point, qh_ALL, &bestdist, &isoutside);
       if (facet->tricoplanar) {
    -    fprintf(stderr, "findDelaunay: not implemented for triangulated, non-simplicial Delaunay regions (tricoplanar facet, f%d).\n",
    +    fprintf(stderr, "findDelaunay: search not implemented for triangulated, non-simplicial Delaunay regions (tricoplanar facet, f%d).\n",
            facet->id);
         qh_errexit(qh, qh_ERRqhull, facet, NULL);
       }
    @@ -174,7 +175,7 @@
     #define TOTpoints (SIZEcube + SIZEdiamond)
     
     /*--------------------------------------------------
    --main- derived from Qhull-template in user.c
    +-main- derived from Qhull-template in user_r.c
     
       see program header
     
    @@ -194,7 +195,7 @@
       FILE *errfile= stderr;    /* error messages from qhull code */
       int exitcode;             /* 0 if no error from qhull */
       facetT *facet;            /* set by FORALLfacets */
    -  int curlong, totlong;     /* memory remaining after qh_memfreeshort */
    +  int curlong, totlong;     /* memory remaining after qh_memfreeshort, used if !qh_NOmem  */
       int i;
     
       qhT qh_qh;                /* Qhull's data structure.  First argument of most calls */
    @@ -204,25 +205,29 @@
     
       qh_zero(qh, errfile);
     
    -  printf("This is the output from user_eg_r.c\n\n\
    -It shows how qhull() may be called from an application using the qhull\n\
    -reentrant library.  user_eg is not part of qhull itself.  If it appears\n\
    -accidently, please remove user_eg_r.c from your project.  If it fails\n\
    -immediately, user_eg_r.c was incorrectly linked to the non-reentrant library.\n\
    -Also try 'user_eg T1 2>&1'\n\n");
    +  printf("\n========\nuser_eg 'cube qhull options' 'Delaunay options' 'halfspace options'\n\
    +\n\
    +This is the output from user_eg_r.c.  It shows how qhull() may be called from\n\
    +an application, via Qhull's shared, reentrant library.  user_eg is not part of\n\
    +Qhull itself.  If user_eg fails immediately, user_eg_r.c was incorrectly linked\n\
    +to Qhull's non-reentrant library, libqhull.\n\
    +Try -- user_eg 'T1' 'T1' 'T1'\n\
    +\n");
     
       /*
         Run 1: convex hull
       */
    -  printf( "\ncompute convex hull of cube after rotating input\n");
    +  printf( "\n========\ncompute convex hull of cube after rotating input\n");
       sprintf(flags, "qhull s Tcv %s", argc >= 2 ? argv[1] : "");
       numpoints= SIZEcube;
       makecube(points, numpoints, DIM);
       for (i=numpoints; i--; )
         rows[i]= points+dim*i;
       qh_printmatrix(qh, outfile, "input", rows, numpoints, dim);
    +  fflush(NULL);
       exitcode= qh_new_qhull(qh, dim, numpoints, points, ismalloc,
                           flags, outfile, errfile);
    +  fflush(NULL);
       if (!exitcode) {                  /* if no error */
         /* 'qh->facet_list' contains the convex hull */
         print_summary(qh);
    @@ -230,24 +235,30 @@
            /* ... your code ... */
         }
       }
    +#ifdef qh_NOmem
    +  qh_freeqhull(qh, qh_ALL);
    +#else
       qh_freeqhull(qh, !qh_ALL);                   /* free long memory  */
       qh_memfreeshort(qh, &curlong, &totlong);    /* free short memory and memory allocator */
       if (curlong || totlong)
         fprintf(errfile, "qhull internal warning (user_eg, #1): did not free %d bytes of long memory (%d pieces)\n", totlong, curlong);
    +#endif
     
       /*
         Run 2: Delaunay triangulation, reusing the previous qh/qh_qh
       */
     
    -  printf( "\ncompute %d-d Delaunay triangulation\n", dim);
    +  printf( "\n========\ncompute %d-d Delaunay triangulation\n", dim);
       sprintf(flags, "qhull s d Tcv %s", argc >= 3 ? argv[2] : "");
       numpoints= SIZEcube;
       makeDelaunay(qh, points, numpoints, dim, (int)time(NULL));
       for (i=numpoints; i--; )
         rows[i]= points+dim*i;
       qh_printmatrix(qh, outfile, "input", rows, numpoints, dim);
    +  fflush(NULL);
       exitcode= qh_new_qhull(qh, dim, numpoints, points, ismalloc,
                           flags, outfile, errfile);
    +  fflush(NULL);
       if (!exitcode) {                  /* if no error */
         /* 'qh->facet_list' contains the convex hull */
         /* If you want a Voronoi diagram ('v') and do not request output (i.e., outfile=NULL),
    @@ -256,10 +267,10 @@
         FORALLfacets {
            /* ... your code ... */
         }
    -    printf( "\nfind %d-d Delaunay triangle closest to [0.5, 0.5, ...]\n", dim);
    +    printf( "\nfind %d-d Delaunay triangle or adjacent triangle closest to [0.5, 0.5, ...]\n", dim);
         exitcode= setjmp(qh->errexit);
         if (!exitcode) {
    -      /* Trap Qhull errors in findDelaunay().  Without the setjmp(), Qhull
    +      /* Trap Qhull errors from findDelaunay().  Without the setjmp(), Qhull
              will exit() after reporting an error */
           qh->NOerrexit= False;
           findDelaunay(qh, DIM);
    @@ -273,54 +284,69 @@
         qhT *qhB= &qh_qhB;
         qh_zero(qhB, errfile);
     
    -    printf( "\nCompute a new triangulation as a separate instance of Qhull\n");
    +    printf( "\n========\nCompute a new triangulation as a separate instance of Qhull\n");
         sprintf(flags, "qhull s d Tcv %s", argc >= 3 ? argv[2] : "");
         numpoints= SIZEcube;
         makeDelaunay(qhB, pointsB, numpoints, dim, (int)time(NULL)+1);
         for (i=numpoints; i--; )
           rows[i]= pointsB+dim*i;
         qh_printmatrix(qhB, outfile, "input", rows, numpoints, dim);
    +    fflush(NULL);
         exitcode= qh_new_qhull(qhB, dim, numpoints, pointsB, ismalloc,
                           flags, outfile, errfile);
    +    fflush(NULL);
         if (!exitcode)
           print_summary(qhB);
    -    printf( "\nFree memory allocated by the new instance of Qhull, and redisplay the old results.\n");
    +    printf( "\n========\nFree memory allocated by the new instance of Qhull, and redisplay the old results.\n");
    +#ifdef qh_NOmem
    +    qh_freeqhull(qh, qh_ALL);
    +#else
         qh_freeqhull(qhB, !qh_ALL);                 /* free long memory */
         qh_memfreeshort(qhB, &curlong, &totlong);  /* free short memory and memory allocator */
         if (curlong || totlong)
             fprintf(errfile, "qhull internal warning (user_eg, #4): did not free %d bytes of long memory (%d pieces)\n", totlong, curlong);
    -
    +#endif
         printf( "\n\n");
         print_summary(qh);  /* The other instance is unchanged */
         /* Exiting the block frees qh_qhB */
       }
    +#ifdef qh_NOmem
    +  qh_freeqhull(qh, qh_ALL);
    +#else
       qh_freeqhull(qh, !qh_ALL);                 /* free long memory */
       qh_memfreeshort(qh, &curlong, &totlong);  /* free short memory and memory allocator */
       if (curlong || totlong)
         fprintf(errfile, "qhull internal warning (user_eg, #2): did not free %d bytes of long memory (%d pieces)\n", totlong, curlong);
    +#endif
     
       /*
         Run 3: halfspace intersection about the origin
       */
    -  printf( "\ncompute halfspace intersection about the origin for a diamond\n");
    +  printf( "\n========\ncompute halfspace intersection about the origin for a diamond\n");
       sprintf(flags, "qhull H0 s Tcv %s", argc >= 4 ? argv[3] : "Fp");
       numpoints= SIZEcube;
       makehalf(points, numpoints, dim);
       for (i=numpoints; i--; )
         rows[i]= points+(dim+1)*i;
       qh_printmatrix(qh, outfile, "input as halfspace coefficients + offsets", rows, numpoints, dim+1);
    +  fflush(NULL);
       /* use qh_sethalfspace_all to transform the halfspaces yourself.
          If so, set 'qh->feasible_point and do not use option 'Hn,...' [it would retransform the halfspaces]
       */
       exitcode= qh_new_qhull(qh, dim+1, numpoints, points, ismalloc,
                           flags, outfile, errfile);
    +  fflush(NULL);
       if (!exitcode)
         print_summary(qh);
    +#ifdef qh_NOmem
    +  qh_freeqhull(qh, qh_ALL);
    +#else
       qh_freeqhull(qh, !qh_ALL);
       qh_memfreeshort(qh, &curlong, &totlong);
       if (curlong || totlong)  /* could also check previous runs */
         fprintf(stderr, "qhull internal warning (user_eg, #3): did not free %d bytes of long memory (%d pieces)\n",
            totlong, curlong);
    +#endif
       return exitcode;
     } /* main */
     
    diff -Nru qhull-2015.2/src/user_eg2/user_eg2.c qhull-2020.2/src/user_eg2/user_eg2.c
    --- qhull-2015.2/src/user_eg2/user_eg2.c	2016-01-18 22:09:40.000000000 +0000
    +++ qhull-2020.2/src/user_eg2/user_eg2.c	2019-06-28 16:14:03.000000000 +0000
    @@ -9,7 +9,8 @@
       The method used here and in unix.c gives you additional
       control over Qhull.
     
    -  See user_eg3/user_eg3_r.cpp for a C++ example
    +   For a C++ example, see user_eg3/user_eg3_r.cpp
    +
     
       call with:
     
    @@ -66,7 +67,7 @@
     void addhalf(coordT *points, int numpoints, int numnew, int dim, coordT *feasible);
     
     /*-------------------------------------------------
    --print_summary()
    +-print_summary( )
     */
     void print_summary(void) {
       facetT *facet;
    @@ -119,7 +120,10 @@
       boolT isoutside;
       realT bestdist;
     
    -  for (j= 0; j < numnew ; j++) {
    +  if (qh JOGGLEmax < REALmax/2 && !qh PREmerge)
    +    qh_fprintf(qh ferr, 7096, "qhull warning (user_eg2/adddiamond): joggle 'QJ' is enabled.  Output is simplicial (i.e., triangles in 2-D)\n");
    +
    +  for (j=0; j < numnew ; j++) {
         point= points + (numpoints+j)*dim;
         if (points == qh first_point)  /* in case of 'QRn' */
           qh num_points= numpoints+j+1;
    @@ -158,10 +162,10 @@
     
       seed= (int)time(NULL); /* time_t to int */
       printf("seed: %d\n", seed);
    -  qh_RANDOMseed_( seed);
    +  qh_RANDOMseed_(seed);
       for (j=0; jlocate a facet with qh_findbestfacet()
       calls qh_setdelaunay() to project the point to a parabaloid
     warning:
    -  This is not implemented for tricoplanar facets ('Qt'),
    -  See locate a facet with qh_findbestfacet()
    +  Errors if it finds a tricoplanar facet ('Qt').  The corresponding Delaunay triangle
    +  is in the set of tricoplanar facets or one of their neighbors.  This search
    +  is not implemented here.
     */
     void findDelaunay(int dim) {
       int k;
    @@ -234,12 +243,12 @@
       facetT *facet;
       vertexT *vertex, **vertexp;
     
    -  for (k= 0; k < dim-1; k++)
    +  for (k=0; k < dim-1; k++)
         point[k]= 0.5;
       qh_setdelaunay(dim, 1, point);
       facet= qh_findbestfacet(point, qh_ALL, &bestdist, &isoutside);
       if (facet->tricoplanar) {
    -    fprintf(stderr, "findDelaunay: not implemented for triangulated, non-simplicial Delaunay regions (tricoplanar facet, f%d).\n",
    +    fprintf(stderr, "findDelaunay: search not implemented for triangulated, non-simplicial Delaunay regions (tricoplanar facet, f%d).\n",
            facet->id);
         qh_errexit(qh_ERRqhull, facet, NULL);
       }
    @@ -300,7 +309,10 @@
       boolT isoutside;
       realT bestdist;
     
    -  for (j= 0; j < numnew ; j++) {
    +  if (qh JOGGLEmax < REALmax/2 && !qh PREmerge)
    +    qh_fprintf(qh ferr, 7098, "qhull warning (user_eg2/addhalf): joggle 'QJ' is enabled.  Output is simplicial (i.e., triangles in 2-D)\n");
    +
    +  for (j=0; j < numnew ; j++) {
         offset= -1.0;
         for (k=dim; k--; ) {
           if (j/2 == k) {
    @@ -335,7 +347,7 @@
     #define TOTpoints (SIZEcube + SIZEdiamond)
     
     /*--------------------------------------------------
    --main- derived from unix.c
    +-main- Similar to unix.c, the main program for qhull
     
       see program header
     
    @@ -345,21 +357,25 @@
     */
     int main(int argc, char *argv[]) {
       boolT ismalloc;
    -  int curlong, totlong, exitcode;
    +  int curlong, totlong, exitcode;  /* used if !qh_NOmem */
       char options [2000];
     
       QHULL_LIB_CHECK
     
    -  printf("This is the output from user_eg2.c\n\n\
    -It shows how qhull() may be called from an application in the same way as\n\
    -qconvex.  It is not part of qhull itself.  If it appears accidently,\n\
    -please remove user_eg2.c from your project.\n\n");
    +  printf("\n========\nuser_eg2 'cube qhull options' 'Delaunay options' 'halfspace options'\n\
    +\n\
    +This is the output from user_eg2.c.  It shows how qhull() may be called from\n\
    +an application, via Qhull's static, non-reentrant library.  user_eg2 is not part\n\
    +of Qhull itself.  If user_eg2 fails immediately, user_eg2.c was incorrectly\n\
    +linked to Qhull's reentrant library, libqhullstatic_r.\n\
    +Try -- user_eg2 'T1' 'T1' 'T1'\n\
    +\n");
     
     #if qh_QHpointer  /* see user.h */
       if (qh_qh){
    -      printf("QH6237: Qhull link error.  The global variable qh_qh was not initialized\n\
    -              to NULL by global.c.  Please compile user_eg2.c with -Dqh_QHpointer_dllimport\n\
    -              as well as -Dqh_QHpointer, or use libqhullstatic, or use a different tool chain.\n\n");
    +      printf("QH6237: Qhull link error.  The global variable qh_qh was not initialized to NULL by global.c.\n\
    +Please compile user_eg2.c with -Dqh_QHpointer_dllimport and -Dqh_QHpointer,\n\
    +or use libqhull_r or libqhullstatic, or use a different tool chain.\n\n");
           return -1;
       }
     #endif
    @@ -374,32 +390,40 @@
       if (!exitcode) {
         coordT array[TOTpoints][DIM];
     
    -    strcat(qh rbox_command, "user_eg cube");
    +    qh NOerrexit= False;
    +    strcat(qh rbox_command, "user_eg2 cube example");
         sprintf(options, "qhull s Tcv Q11 %s ", argc >= 2 ? argv[1] : "");
         qh_initflags(options);
    -    printf( "\ncompute triangulated convex hull of cube after rotating input\n");
    +    printf( "\n========\ncompute triangulated convex hull of cube after rotating input\n");
         makecube(array[0], SIZEcube, DIM);
    +    fflush(NULL);
         qh_init_B(array[0], SIZEcube, DIM, ismalloc);
         qh_qhull();
         qh_check_output();
         qh_triangulate();  /* requires option 'Q11' if want to add points */
         print_summary();
    -    if (qh VERIFYoutput && !qh STOPpoint && !qh STOPcone)
    +    if (qh VERIFYoutput && !qh FORCEoutput && !qh STOPadd && !qh STOPcone && !qh STOPpoint)
           qh_check_points();
    +    fflush(NULL);
         printf( "\nadd points in a diamond\n");
         adddiamond(array[0], SIZEcube, SIZEdiamond, DIM);
         qh_check_output();
         print_summary();
         qh_produce_output();  /* delete this line to help avoid io.c */
    -    if (qh VERIFYoutput && !qh STOPpoint && !qh STOPcone)
    +    if (qh VERIFYoutput && !qh FORCEoutput && !qh STOPadd && !qh STOPcone && !qh STOPpoint)
           qh_check_points();
    +    fflush(NULL);
       }
       qh NOerrexit= True;
    +#ifdef qh_NOmem
    +  qh_freeqhull(qh_ALL);
    +#else
       qh_freeqhull(!qh_ALL);
       qh_memfreeshort(&curlong, &totlong);
       if (curlong || totlong)
    -    fprintf(stderr, "qhull warning (user_eg, run 1): did not free %d bytes of long memory (%d pieces)\n",
    -       totlong, curlong);
    +    fprintf(stderr, "qhull warning (user_eg2, run 1): did not free %d bytes of long memory (%d pieces)\n",
    +          totlong, curlong);
    +#endif
     
       /*
         Run 2: Delaunay triangulation
    @@ -409,10 +433,11 @@
       if (!exitcode) {
         coordT array[TOTpoints][DIM];
     
    -    strcat(qh rbox_command, "user_eg Delaunay");
    +    qh NOerrexit= False;
    +    strcat(qh rbox_command, "user_eg2 Delaunay example");
         sprintf(options, "qhull s d Tcv %s", argc >= 3 ? argv[2] : "");
         qh_initflags(options);
    -    printf( "\ncompute %d-d Delaunay triangulation\n", DIM-1);
    +    printf( "\n========\ncompute %d-d Delaunay triangulation\n", DIM-1);
         makeDelaunay(array[0], SIZEcube, DIM);
         /* Instead of makeDelaunay with qh_setdelaunay, you may
            produce a 2-d array of points, set DIM to 2, and set
    @@ -427,23 +452,29 @@
         qh_check_output();
         print_summary();
         qh_produce_output();  /* delete this line to help avoid io.c */
    -    if (qh VERIFYoutput && !qh STOPpoint && !qh STOPcone)
    +    if (qh VERIFYoutput && !qh FORCEoutput && !qh STOPadd && !qh STOPcone && !qh STOPpoint)
           qh_check_points();
    -    printf( "\nadd points to triangulation\n");
    +    fflush(NULL);
    +    printf( "\n========\nadd points to triangulation\n");
         addDelaunay(array[0], SIZEcube, SIZEdiamond, DIM);
         qh_check_output();
    +    printf("\nfind Delaunay triangle or adjacent triangle closest to [0.5, 0.5, ...]\n");
    +    findDelaunay(DIM);
         qh_produce_output();  /* delete this line to help avoid io.c */
    -    if (qh VERIFYoutput && !qh STOPpoint && !qh STOPcone)
    +    if (qh VERIFYoutput && !qh FORCEoutput && !qh STOPadd && !qh STOPcone && !qh STOPpoint)
           qh_check_points();
    -    printf( "\nfind Delaunay triangle closest to [0.5, 0.5, ...]\n");
    -    findDelaunay(DIM);
    +    fflush(NULL);
       }
       qh NOerrexit= True;
    +#ifdef qh_NOmem
    +  qh_freeqhull(qh_ALL);
    +#else
       qh_freeqhull(!qh_ALL);
       qh_memfreeshort(&curlong, &totlong);
       if (curlong || totlong)
    -    fprintf(stderr, "qhull warning (user_eg, run 2): did not free %d bytes of long memory (%d pieces)\n",
    -       totlong, curlong);
    +    fprintf(stderr, "qhull warning (user_eg2, run 2): did not free %d bytes of long memory (%d pieces)\n",
    +         totlong, curlong);
    +#endif
     
       /*
         Run 3: halfspace intersection
    @@ -454,35 +485,43 @@
         coordT array[TOTpoints][DIM+1];  /* +1 for halfspace offset */
         pointT *points;
     
    -    strcat(qh rbox_command, "user_eg halfspaces");
    +    qh NOerrexit= False;
    +    strcat(qh rbox_command, "user_eg2 halfspace example");
         sprintf(options, "qhull H0 s Tcv %s", argc >= 4 ? argv[3] : "");
         qh_initflags(options);
    -    printf( "\ncompute halfspace intersection about the origin for a diamond\n");
    +    printf( "\n========\ncompute halfspace intersection about the origin for a diamond\n");
         makehalf(array[0], SIZEcube, DIM);
         qh_setfeasible(DIM); /* from io.c, sets qh feasible_point from 'Hn,n' */
         /* you may malloc and set qh feasible_point directly.  It is only used for
            option 'Fp' */
    -    points= qh_sethalfspace_all( DIM+1, SIZEcube, array[0], qh feasible_point);
    +    points= qh_sethalfspace_all(DIM+1, SIZEcube, array[0], qh feasible_point);
         qh_init_B(points, SIZEcube, DIM, True); /* qh_freeqhull frees points */
         qh_qhull();
    +    fflush(NULL);
         qh_check_output();
         qh_produce_output();  /* delete this line to help avoid io.c */
    -    if (qh VERIFYoutput && !qh STOPpoint && !qh STOPcone)
    +    if (qh VERIFYoutput && !qh FORCEoutput && !qh STOPadd && !qh STOPcone && !qh STOPpoint)
           qh_check_points();
    -    printf( "\nadd halfspaces for cube to intersection\n");
    +    fflush(NULL);
    +    printf( "\n========\nadd halfspaces for cube to intersection\n");
         addhalf(array[0], SIZEcube, SIZEdiamond, DIM, qh feasible_point);
         qh_check_output();
         qh_produce_output();  /* delete this line to help avoid io.c */
    -    if (qh VERIFYoutput && !qh STOPpoint && !qh STOPcone)
    +    if (qh VERIFYoutput && !qh FORCEoutput && !qh STOPadd && !qh STOPcone && !qh STOPpoint)
           qh_check_points();
    +    fflush(NULL);
       }
       qh NOerrexit= True;
       qh NOerrexit= True;
    +#ifdef qh_NOmem
    +  qh_freeqhull(qh_ALL);
    +#else
       qh_freeqhull(!qh_ALL);
       qh_memfreeshort(&curlong, &totlong);
       if (curlong || totlong)
    -    fprintf(stderr, "qhull warning (user_eg, run 3): did not free %d bytes of long memory (%d pieces)\n",
    -       totlong, curlong);
    +    fprintf(stderr, "qhull warning (user_eg2, run 3): did not free %d bytes of long memory (%d pieces)\n",
    +          totlong, curlong);
    +#endif
       return exitcode;
     } /* main */
     
    @@ -498,7 +537,7 @@
       QHULL_UNUSED(ridge);
     
       if (qh ERREXITcalled) {
    -    fprintf(qh ferr, "qhull error while processing previous error.  Exit program\n");
    +    fprintf(qh ferr, "qhull error while handling previous error in qh_errexit.  Exit program\n");
         exit(1);
       }
       qh ERREXITcalled= True;
    @@ -544,10 +583,10 @@
     
       /* remove these calls to help avoid io.c */
       qh_printbegin(qh ferr, qh_PRINTfacets, facetlist, facets, printall);/*io.c*/
    -  FORALLfacet_(facetlist)                                              /*io.c*/
    -    qh_printafacet(qh ferr, qh_PRINTfacets, facet, printall);          /*io.c*/
    -  FOREACHfacet_(facets)                                                /*io.c*/
    -    qh_printafacet(qh ferr, qh_PRINTfacets, facet, printall);          /*io.c*/
    +  FORALLfacet_(facetlist)                                             /*io.c*/
    +    qh_printafacet(qh ferr, qh_PRINTfacets, facet, printall);         /*io.c*/
    +  FOREACHfacet_(facets)                                               /*io.c*/
    +    qh_printafacet(qh ferr, qh_PRINTfacets, facet, printall);         /*io.c*/
       qh_printend(qh ferr, qh_PRINTfacets, facetlist, facets, printall);  /*io.c*/
     
       FORALLfacet_(facetlist)
    diff -Nru qhull-2015.2/src/user_eg2/user_eg2_r.c qhull-2020.2/src/user_eg2/user_eg2_r.c
    --- qhull-2015.2/src/user_eg2/user_eg2_r.c	2016-01-18 05:23:07.000000000 +0000
    +++ qhull-2020.2/src/user_eg2/user_eg2_r.c	2019-06-28 15:24:54.000000000 +0000
    @@ -9,7 +9,7 @@
       The method used here and in unix_r.c gives you additional
       control over Qhull.
     
    -  See user_eg3/user_eg3_r.cpp for a C++ example
    +  For a C++ example, see user_eg3/user_eg3_r.cpp
     
       call with:
     
    @@ -39,12 +39,12 @@
     
        summaries are sent to stderr if other output formats are used
     
    -   derived from unix.c and compiled by 'make bin/user_eg2'
    +   derived from unix_r.c and compiled by 'make bin/user_eg2'
     
    -   see libqhull.h for data structures, macros, and user-callable functions.
    +   see libqhull_r.h for data structures, macros, and user-callable functions.
     
        If you want to control all output to stdio and input to stdin,
    -   set the #if below to "1" and delete all lines that contain "io.c".
    +   set the #if below to "1" and delete all lines that contain "io_r.c".
        This prevents the loading of io.o.  Qhull will
        still write to 'qh->ferr' (stderr) for error reporting and tracing.
     
    @@ -119,7 +119,10 @@
       boolT isoutside;
       realT bestdist;
     
    -  for (j= 0; j < numnew ; j++) {
    +  if (qh->JOGGLEmax < REALmax/2 && !qh->PREmerge)
    +    qh_fprintf(qh, qh->ferr, 7096, "qhull warning (user_eg2/adddiamond): joggle 'QJ' is enabled.  Output is simplicial (i.e., triangles in 2-D)\n");
    +
    +  for (j=0; j < numnew ; j++) {
         point= points + (numpoints+j)*dim;
         if (points == qh->first_point)  /* in case of 'QRn' */
           qh->num_points= numpoints+j+1;
    @@ -161,7 +164,7 @@
       qh_RANDOMseed_(qh, seed);
       for (j=0; jJOGGLEmax < REALmax/2 && !qh->PREmerge)
    +    qh_fprintf(qh, qh->ferr, 7097, "qhull warning (user_eg2/addDelaunay): joggle 'QJ' is enabled.  Output is simplicial (i.e., triangles in 2-D)\n");
    +
    +  for (j=0; j < numnew ; j++) {
         point= points + (numpoints+j)*dim;
         if (points == qh->first_point)  /* in case of 'QRn' */
           qh->num_points= numpoints+j+1;
    @@ -194,7 +200,7 @@
            allocate the point elsewhere.  If so, qh_addpoint records
            the point's address in qh->other_points
         */
    -    for (k= 0; k < dim-1; k++) {
    +    for (k=0; k < dim-1; k++) {
           realr= qh_RANDOMint;
           point[k]= 2.0 * realr/(qh_RANDOMmax+1) - 1.0;
         }
    @@ -218,13 +224,15 @@
     } /*.addDelaunay.*/
     
     /*--------------------------------------------------
    --findDelaunay- find Delaunay triangle for [0.5,0.5,...]
    +-findDelaunay- find Delaunay triangle or adjacent triangle for [0.5,0.5,...]
       assumes dim < 100
     notes:
    +  See locate a facet with qh_findbestfacet()
       calls qh_setdelaunay() to project the point to a parabaloid
     warning:
    -  This is not implemented for tricoplanar facets ('Qt'),
    -  See locate a facet with qh_findbestfacet()
    +  Errors if it finds a tricoplanar facet ('Qt').  The corresponding Delaunay triangle
    +  is in the set of tricoplanar facets or one of their neighbors.  This search
    +  is not implemented here.
     */
     void findDelaunay(qhT *qh, int dim) {
       int k;
    @@ -234,12 +242,12 @@
       facetT *facet;
       vertexT *vertex, **vertexp;
     
    -  for (k= 0; k < dim-1; k++)
    +  for (k=0; k < dim-1; k++)
         point[k]= 0.5;
       qh_setdelaunay(qh, dim, 1, point);
       facet= qh_findbestfacet(qh, point, qh_ALL, &bestdist, &isoutside);
       if (facet->tricoplanar) {
    -    fprintf(stderr, "findDelaunay: not implemented for triangulated, non-simplicial Delaunay regions (tricoplanar facet, f%d).\n",
    +    fprintf(stderr, "findDelaunay: search not implemented for triangulated, non-simplicial Delaunay regions (tricoplanar facet, f%d).\n",
            facet->id);
         qh_errexit(qh, qh_ERRqhull, facet, NULL);
       }
    @@ -300,7 +308,10 @@
       boolT isoutside;
       realT bestdist;
     
    -  for (j= 0; j < numnew ; j++) {
    +  if (qh->JOGGLEmax < REALmax/2 && !qh->PREmerge)
    +    qh_fprintf(qh, qh->ferr, 7098, "qhull warning (user_eg2/addhalf): joggle 'QJ' is enabled.  Output is simplicial (i.e., triangles in 2-D)\n");
    +
    +  for (j=0; j < numnew ; j++) {
         offset= -1.0;
         for (k=dim; k--; ) {
           if (j/2 == k) {
    @@ -335,7 +346,7 @@
     #define TOTpoints (SIZEcube + SIZEdiamond)
     
     /*--------------------------------------------------
    --main- Similar to unix.c, the main program for qhull
    +-main- Similar to unix_r.c, the main program for qhull
     
       see program header
     
    @@ -345,19 +356,21 @@
     */
     int main(int argc, char *argv[]) {
       boolT ismalloc;
    -  int curlong, totlong, exitcode;
    +  int curlong, totlong, exitcode;  /* used if !qh_NOmem */
       char options [2000];
       qhT qh_qh;
    -  qhT *qh= &qh_qh;  /* Alternatively -- qhT *qh= (qhT*)malloc(sizeof(qhT)) */
    +  qhT *qh= &qh_qh;  /* Alternatively -- qhT *qh= (qhT *)malloc(sizeof(qhT)) */
     
       QHULL_LIB_CHECK
     
    -  printf("This is the output from user_eg2_r.c\n\n\
    -It shows how qhull() may be called from an application using qhull's\n\
    -static, reentrant library.  user_eg2 is not part of qhull itself.  If it\n\
    -appears accidently, please remove user_eg2_r.c from your project.  If it fails\n\
    -immediately, user_eg2_r.c was incorrectly linked to the non-reentrant library.\n\
    -Also try 'user_eg2 T1 2>&1'\n\n");
    +  printf("\n========\nuser_eg2 'cube qhull options' 'Delaunay options' 'halfspace options'\n\
    +\n\
    +This is the output from user_eg2_r.c.  It shows how qhull() may be called from\n\
    +an application, via Qhull's static, reentrant library.  user_eg2 is not part\n\
    +of Qhull itself. If user_eg2 fails immediately, user_eg2_r.c was incorrectly\n\
    +linked to Qhull's non-reentrant library, libqhullstatic.\n\
    +Try -- user_eg2 'T1' 'T1' 'T1'\n\
    +\n");
     
       ismalloc= False;      /* True if qh_freeqhull should 'free(array)' */
       /*
    @@ -372,29 +385,37 @@
         strcat(qh->rbox_command, "user_eg2 cube example");
         sprintf(options, "qhull s Tcv Q11 %s ", argc >= 2 ? argv[1] : "");
         qh_initflags(qh, options);
    -    printf( "\ncompute triangulated convex hull of cube after rotating input\n");
    +    printf( "\n========\ncompute triangulated convex hull of cube after rotating input\n");
         makecube(array[0], SIZEcube, DIM);
    +    fflush(NULL);
         qh_init_B(qh, array[0], SIZEcube, DIM, ismalloc);
         qh_qhull(qh);
         qh_check_output(qh);
         qh_triangulate(qh);  /* requires option 'Q11' if want to add points */
         print_summary(qh);
    -    if (qh->VERIFYoutput && !qh->STOPpoint && !qh->STOPcone)
    +    if (qh->VERIFYoutput && !qh->FORCEoutput && !qh->STOPadd && !qh->STOPcone && !qh->STOPpoint)
           qh_check_points(qh);
    +    fflush(NULL);
         printf( "\nadd points in a diamond\n");
         adddiamond(qh, array[0], SIZEcube, SIZEdiamond, DIM);
         qh_check_output(qh);
         print_summary(qh);
    -    qh_produce_output(qh);  /* delete this line to help avoid io.c */
    -    if (qh->VERIFYoutput && !qh->STOPpoint && !qh->STOPcone)
    +    qh_produce_output(qh);  /* delete this line to help avoid io_r.c */
    +    if (qh->VERIFYoutput && !qh->FORCEoutput && !qh->STOPadd && !qh->STOPcone && !qh->STOPpoint)
           qh_check_points(qh);
    +    fflush(NULL);
       }
       qh->NOerrexit= True;
    +#ifdef qh_NOmem
    +  qh_freeqhull(qh, qh_ALL);
    +#else
       qh_freeqhull(qh, !qh_ALL);
       qh_memfreeshort(qh, &curlong, &totlong);
       if (curlong || totlong)
    -      fprintf(stderr, "qhull warning (user_eg2, run 1): did not free %d bytes of long memory (%d pieces)\n",
    +    fprintf(stderr, "qhull warning (user_eg2, run 1): did not free %d bytes of long memory (%d pieces)\n",
               totlong, curlong);
    +#endif
    +
       /*
         Run 2: Delaunay triangulation
       */
    @@ -407,7 +428,7 @@
         strcat(qh->rbox_command, "user_eg2 Delaunay example");
         sprintf(options, "qhull s d Tcv %s", argc >= 3 ? argv[2] : "");
         qh_initflags(qh, options);
    -    printf( "\ncompute %d-d Delaunay triangulation\n", DIM-1);
    +    printf( "\n========\ncompute %d-d Delaunay triangulation\n", DIM-1);
         makeDelaunay(qh, array[0], SIZEcube, DIM);
         /* Instead of makeDelaunay with qh_setdelaunay, you may
            produce a 2-d array of points, set DIM to 2, and set
    @@ -421,24 +442,31 @@
            qh_setvoronoi_all() after qh_qhull() */
         qh_check_output(qh);
         print_summary(qh);
    -    qh_produce_output(qh);  /* delete this line to help avoid io.c */
    -    if (qh->VERIFYoutput && !qh->STOPpoint && !qh->STOPcone)
    +    qh_produce_output(qh);  /* delete this line to help avoid io_r.c */
    +    if (qh->VERIFYoutput && !qh->FORCEoutput && !qh->STOPadd && !qh->STOPcone && !qh->STOPpoint)
           qh_check_points(qh);
    -    printf( "\nadd points to triangulation\n");
    +    fflush(NULL);
    +    printf( "\n========\nadd points to triangulation\n");
         addDelaunay(qh, array[0], SIZEcube, SIZEdiamond, DIM);
         qh_check_output(qh);
    -    qh_produce_output(qh);  /* delete this line to help avoid io.c */
    -    if (qh->VERIFYoutput && !qh->STOPpoint && !qh->STOPcone)
    -      qh_check_points(qh);
    -    printf( "\nfind Delaunay triangle closest to [0.5, 0.5, ...]\n");
    +    printf("\nfind Delaunay triangle or adjacent triangle closest to [0.5, 0.5, ...]\n");
         findDelaunay(qh, DIM);
    +    qh_produce_output(qh);  /* delete this line to help avoid io_r.c */
    +    if (qh->VERIFYoutput && !qh->FORCEoutput && !qh->STOPadd && !qh->STOPcone && !qh->STOPpoint)
    +      qh_check_points(qh);
    +    fflush(NULL);
       }
       qh->NOerrexit= True;
    +#ifdef qh_NOmem
    +  qh_freeqhull(qh, qh_ALL);
    +#else
       qh_freeqhull(qh, !qh_ALL);
       qh_memfreeshort(qh, &curlong, &totlong);
    -  if (curlong || totlong) 
    -      fprintf(stderr, "qhull warning (user_eg2, run 2): did not free %d bytes of long memory (%d pieces)\n",
    +  if (curlong || totlong)
    +    fprintf(stderr, "qhull warning (user_eg2, run 2): did not free %d bytes of long memory (%d pieces)\n",
              totlong, curlong);
    +#endif
    +
       /*
         Run 3: halfspace intersection
       */
    @@ -452,32 +480,39 @@
         strcat(qh->rbox_command, "user_eg2 halfspace example");
         sprintf(options, "qhull H0 s Tcv %s", argc >= 4 ? argv[3] : "");
         qh_initflags(qh, options);
    -    printf( "\ncompute halfspace intersection about the origin for a diamond\n");
    +    printf( "\n========\ncompute halfspace intersection about the origin for a diamond\n");
         makehalf(array[0], SIZEcube, DIM);
    -    qh_setfeasible(qh, DIM); /* from io.c, sets qh->feasible_point from 'Hn,n' */
    +    qh_setfeasible(qh, DIM); /* from io_r.c, sets qh->feasible_point from 'Hn,n' */
         /* you may malloc and set qh->feasible_point directly.  It is only used for
            option 'Fp' */
         points= qh_sethalfspace_all(qh, DIM+1, SIZEcube, array[0], qh->feasible_point);
         qh_init_B(qh, points, SIZEcube, DIM, True); /* qh_freeqhull frees points */
         qh_qhull(qh);
    +    fflush(NULL);
         qh_check_output(qh);
    -    qh_produce_output(qh);  /* delete this line to help avoid io.c */
    -    if (qh->VERIFYoutput && !qh->STOPpoint && !qh->STOPcone)
    +    qh_produce_output(qh);  /* delete this line to help avoid io_r.c */
    +    if (qh->VERIFYoutput && !qh->FORCEoutput && !qh->STOPadd && !qh->STOPcone && !qh->STOPpoint)
           qh_check_points(qh);
    -    printf( "\nadd halfspaces for cube to intersection\n");
    +    fflush(NULL);
    +    printf( "\n========\nadd halfspaces for cube to intersection\n");
         addhalf(qh, array[0], SIZEcube, SIZEdiamond, DIM, qh->feasible_point);
         qh_check_output(qh);
    -    qh_produce_output(qh);  /* delete this line to help avoid io.c */
    -    if (qh->VERIFYoutput && !qh->STOPpoint && !qh->STOPcone)
    +    qh_produce_output(qh);  /* delete this line to help avoid io_r.c */
    +    if (qh->VERIFYoutput && !qh->FORCEoutput && !qh->STOPadd && !qh->STOPcone && !qh->STOPpoint)
           qh_check_points(qh);
    +    fflush(NULL);
       }
       qh->NOerrexit= True;
       qh->NOerrexit= True;
    +#ifdef qh_NOmem
    +  qh_freeqhull(qh, qh_ALL);
    +#else
       qh_freeqhull(qh, !qh_ALL);
       qh_memfreeshort(qh, &curlong, &totlong);
       if (curlong || totlong)
    -      fprintf(stderr, "qhull warning (user_eg2, run 3): did not free %d bytes of long memory (%d pieces)\n",
    +    fprintf(stderr, "qhull warning (user_eg2, run 3): did not free %d bytes of long memory (%d pieces)\n",
               totlong, curlong);
    +#endif
       return exitcode;
     } /* main */
     
    @@ -486,14 +521,14 @@
     -errexit- return exitcode to system after an error
       assumes exitcode non-zero
       prints useful information
    -  see qh_errexit2() in libqhull.c for 2 facets
    +  see qh_errexit2() in libqhull_r.c for 2 facets
     */
     void qh_errexit(qhT *qh, int exitcode, facetT *facet, ridgeT *ridge) {
       QHULL_UNUSED(facet);
       QHULL_UNUSED(ridge);
     
       if (qh->ERREXITcalled) {
    -    fprintf(qh->ferr, "qhull error while processing previous error.  Exit program\n");
    +    fprintf(qh->ferr, "qhull error while handling previous error in qh_errexit.  Exit program\n");
         exit(1);
       }
       qh->ERREXITcalled= True;
    @@ -537,13 +572,13 @@
     void qh_printfacetlist(qhT *qh, facetT *facetlist, setT *facets, boolT printall) {
       facetT *facet, **facetp;
     
    -  /* remove these calls to help avoid io.c */
    -  qh_printbegin(qh, qh->ferr, qh_PRINTfacets, facetlist, facets, printall);/*io.c*/
    -  FORALLfacet_(facetlist)                                              /*io.c*/
    -    qh_printafacet(qh, qh->ferr, qh_PRINTfacets, facet, printall);          /*io.c*/
    -  FOREACHfacet_(facets)                                                /*io.c*/
    -    qh_printafacet(qh, qh->ferr, qh_PRINTfacets, facet, printall);          /*io.c*/
    -  qh_printend(qh, qh->ferr, qh_PRINTfacets, facetlist, facets, printall);  /*io.c*/
    +  /* remove these calls to help avoid io_r.c */
    +  qh_printbegin(qh, qh->ferr, qh_PRINTfacets, facetlist, facets, printall);/*io_r.c*/
    +  FORALLfacet_(facetlist)                                                  /*io_r.c*/
    +    qh_printafacet(qh, qh->ferr, qh_PRINTfacets, facet, printall);         /*io_r.c*/
    +  FOREACHfacet_(facets)                                                    /*io_r.c*/
    +    qh_printafacet(qh, qh->ferr, qh_PRINTfacets, facet, printall);         /*io_r.c*/
    +  qh_printend(qh, qh->ferr, qh_PRINTfacets, facetlist, facets, printall);  /*io_r.c*/
     
       FORALLfacet_(facetlist)
         fprintf( qh->ferr, "facet f%d\n", facet->id);
    @@ -583,7 +618,7 @@
     \n\
     Qhull is currently using single precision arithmetic.  The following\n\
     will probably remove the precision problems:\n\
    -  - recompile qhull for realT precision(#define REALfloat 0 in user.h).\n");
    +  - recompile qhull for realT precision(#define REALfloat 0 in user_r.h).\n");
     #endif
         if (qh->DELAUNAY && !qh->SCALElast && qh->MAXabs_coord > 1e4)
           qh_fprintf(qh, fp, 9371, "\
    @@ -626,7 +661,7 @@
          Warn about a narrow hull
     
       notes:
    -    Alternatively, reduce qh_WARNnarrow in user.h
    +    Alternatively, reduce qh_WARNnarrow in user_r.h
     
     */
     void qh_printhelp_narrowhull(qhT *qh, FILE *fp, realT minangle) {
    @@ -709,7 +744,7 @@
                          qh->DISTround);
     #if REALfloat
         qh_fprintf(qh, fp, 9388, "\
    -  - recompile qhull for realT precision(#define REALfloat 0 in libqhull.h).\n");
    +  - recompile qhull for realT precision(#define REALfloat 0 in libqhull_r.h).\n");
     #endif
         qh_fprintf(qh, fp, 9389, "\n\
     If the input is lower dimensional:\n\
    diff -Nru qhull-2015.2/src/user_eg3/user_eg3_r.cpp qhull-2020.2/src/user_eg3/user_eg3_r.cpp
    --- qhull-2015.2/src/user_eg3/user_eg3_r.cpp	2016-01-16 16:20:07.000000000 +0000
    +++ qhull-2020.2/src/user_eg3/user_eg3_r.cpp	2020-07-31 00:02:51.000000000 +0000
    @@ -5,11 +5,16 @@
     #include "libqhullcpp/QhullQh.h"
     #include "libqhullcpp/QhullFacet.h"
     #include "libqhullcpp/QhullFacetList.h"
    +#include "libqhullcpp/QhullFacetSet.h"
     #include "libqhullcpp/QhullLinkedList.h"
    +#include "libqhullcpp/QhullPoint.h"
    +#include "libqhullcpp/QhullUser.h"
     #include "libqhullcpp/QhullVertex.h"
    +#include "libqhullcpp/QhullVertexSet.h"
     #include "libqhullcpp/Qhull.h"
     
     #include    /* for printf() of help message */
    +#include  // setw
     #include 
     #include 
     
    @@ -22,46 +27,68 @@
     using orgQhull::QhullError;
     using orgQhull::QhullFacet;
     using orgQhull::QhullFacetList;
    +using orgQhull::QhullFacetListIterator;
    +using orgQhull::QhullFacetSet;
    +using orgQhull::QhullFacetSetIterator;
    +using orgQhull::QhullPoint;
    +using orgQhull::QhullPoints;
    +using orgQhull::QhullPointsIterator;
     using orgQhull::QhullQh;
    -using orgQhull::RboxPoints;
    +using orgQhull::QhullUser;
     using orgQhull::QhullVertex;
    +using orgQhull::QhullVertexList;
    +using orgQhull::QhullVertexListIterator;
     using orgQhull::QhullVertexSet;
    +using orgQhull::QhullVertexSetIterator;
    +using orgQhull::RboxPoints;
     
     int main(int argc, char **argv);
     int user_eg3(int argc, char **argv);
     
    -char prompt[]= "\n\
    -user_eg3 -- demonstrate calling rbox and qhull from C++.\n\
    +char prompt[]= "\n========\n\
    +user_eg3 commands... -- demonstrate calling rbox and qhull from C++.\n\
    +\n\
    +user_eg3 is statically linked to qhullcpp and reentrant qhull.  If user_eg3\n\
    +fails immediately, it is probably linked to the non-reentrant qhull library.\n\
     \n\
    -user_eg3 is statically linked to reentrant qhull.  If user_eg3\n\
    -fails immediately, it is probably linked to the non-reentrant qhull.\n\
    -Try 'user_eg3 rbox qhull \"T1\"'\n\
    +Commands:\n\
    +  eg-100               Run the example in qh-code.htm\n\
    +  eg-convex            'rbox d | qconvex o' with std::vector and C++ classes\n\
    +  eg-delaunay          'rbox y c | qdelaunay o' with std::vector and C++ classes\n\
    +  eg-voronoi           'rbox y c | qvoronoi o' with std::vector and C++ classes\n\
    +  eg-fifo              'rbox y c | qvoronoi FN Fi Fo' with QhullUser and qh_fprintf\n\
     \n\
    -  eg-100                       Run the example in qh-code.htm\n\
    -  rbox \"200 D4\" ...            Generate points from rbox\n\
    -  qhull \"d p\" ...              Run qhull and produce output\n\
    -  qhull-cout \"o\" ...           Run qhull and produce output to cout\n\
    -  qhull \"T1\" ...               Run qhull with level-1 trace to cerr\n\
    -  facets                       Print facets when done\n\
    +Rbox and Qhull commands:\n\
    +  rbox \"200 D4\" ...    Generate points from rbox\n\
    +  qhull \"d p\" ...      Run qhull with options and produce output\n\
    +  qhull-cout \"o\" ...   Run qhull with options and produce output to cout\n\
    +  qhull \"T1\" ...       Run qhull with level-1 trace to cerr\n\
    +  qhull-cout \"T1z\" ... Run qhull with level-1 trace to cout\n\
    +  facets               Print qhull's facets when done\n\
     \n\
     For example\n\
       user_eg3 rbox qhull\n\
    +  user_eg3 rbox qhull T1\n\
       user_eg3 rbox qhull d\n\
    -  user_eg3 rbox \"10 D2\"  \"2 D2\" qhull  \"s p\" facets\n\
    -\n\
    +  user_eg3 rbox D2 10 2 \"s r 5\" qhull \"s p\" facets\n\
    +  user_eg3 eg-convex\n\
    +  user_eg3 rbox 10 eg-delaunay qhull \"d o\"\n\
    +  user_eg3 rbox D5 c P2 qhull d eg-delaunay\n\
    +  user_eg3 rbox \"D5 c P2\" qhull v eg-voronoi o\n\
    +  user_eg3 rbox D2 10 qhull \"v\" eg-fifo p Fi Fo\n\
     ";
    -
    +// single quotes OK in Unix but not OK in Windows cmd.exe
     
     /*--------------------------------------------
     -user_eg3-  main procedure of user_eg3 application
     */
    -int main(int argc, char **argv) {
    +int main(int argc, char **argv){
     
         QHULL_LIB_CHECK
     
         if(argc==1){
             cout << prompt;
    -        return 1;
    +        return 0;
         }
         try{
             return user_eg3(argc, argv);
    @@ -71,22 +98,489 @@
         }
     }//main
     
    -int user_eg3(int argc, char **argv)
    +void printDoubles(const std::vector &doubles)
     {
    -    if(strcmp(argv[1], "eg-100")==0){
    -        RboxPoints rbox("100");
    -        Qhull q(rbox, "");
    -        QhullFacetList facets= q.facetList();
    -        cout << facets;
    -        return 0;
    +    for(size_t i= 0; i < doubles.size(); i++){
    +        cout << std::setw(6) << doubles[i] << " ";
    +    }
    +}//printDoubles
    +
    +void printInts(const std::vector &ints)
    +{
    +    for(size_t i= 0; i < ints.size(); i++){
    +        cout << ints[i] << " ";
    +    }
    +}//printInts
    +
    +void qconvex_o(const Qhull &qhull)
    +{
    +    int dim= qhull.hullDimension();
    +    int numfacets= qhull.facetList().count();
    +    int totneighbors= numfacets * dim;  /* incorrect for non-simplicial facets, see qh_countfacets */
    +    cout << dim << "\n" << qhull.points().size() << " " << numfacets << " " << totneighbors/2 << "\n";
    +    std::vector > points;
    +    // for(QhullPoint point : qhull.points())
    +    for(QhullPoints::ConstIterator i= qhull.points().begin(); i != qhull.points().end(); ++i){
    +        QhullPoint point= *i;
    +        points.push_back(point.toStdVector());
    +    }
    +    // for(std::vector point : points){
    +    for(size_t j= 0; j < points.size(); ++j){
    +        std::vector point= points[j];
    +        size_t n= point.size();
    +        for(size_t i= 0; i < n; ++i){
    +            if(i < n-1){
    +                cout << std::setw(6) << point[i] << " ";
    +            }else{
    +                cout << std::setw(6) << point[i] << "\n";
    +            }
    +        }
    +    }
    +    QhullFacetList facets= qhull.facetList();
    +    std::vector > facetVertices;
    +    // for(QhullFacet f : facets)
    +    QhullFacetListIterator j(facets);
    +    while(j.hasNext()){
    +        QhullFacet f= j.next();
    +        std::vector vertices;
    +        if(!f.isGood()){
    +            // ignore facet
    +        }else if(!f.isTopOrient() && f.isSimplicial()){ /* orient the vertices like option 'o' */
    +            QhullVertexSet vs= f.vertices();
    +            vertices.push_back(vs[1].point().id());
    +            vertices.push_back(vs[0].point().id());
    +            for(int i= 2; i<(int)vs.size(); ++i){
    +                vertices.push_back(vs[i].point().id());
    +            }
    +            facetVertices.push_back(vertices);
    +        }else{  /* note: for non-simplicial facets, this code does not duplicate option 'o', see qh_facet3vertex and qh_printfacetNvertex_nonsimplicial */
    +            // for(QhullVertex vertex : f.vertices()){
    +            QhullVertexSetIterator k(f.vertices());
    +            while(k.hasNext()){
    +                QhullVertex vertex= k.next();
    +                QhullPoint p= vertex.point();
    +                vertices.push_back(p.id());
    +            }
    +            facetVertices.push_back(vertices);
    +        }
    +    }
    +    // for(std::vector vertices : facetVertices)
    +    for(size_t k= 0; k vertices= facetVertices[k];
    +        size_t n= vertices.size();
    +        cout << n << " ";
    +        for(size_t i= 0; i > inputSites;
    +    QhullPoints points= qhull.points();
    +    // for(QhullPoint point : points)
    +    QhullPointsIterator j(points);
    +    while(j.hasNext()){
    +        QhullPoint point= j.next();
    +        inputSites.push_back(point.toStdVector());
    +    }
    +
    +    // Printer header and Voronoi vertices
    +    QhullFacetList facets= qhull.facetList();
    +    int numFacets= facets.count();
    +    size_t numRidges= numFacets*hullDimension/2;  // only for simplicial facets
    +    cout << hullDimension << "\n" << inputSites.size() << " " << numFacets << " " << numRidges << "\n";
    +    // for(std::vector site : inputSites)
    +    for(size_t k= 0; k < inputSites.size(); ++k){
    +        std::vector site= inputSites[k];
    +        size_t n= site.size();
    +        for(size_t i= 0; i > regions;
    +    // for(QhullFacet f : facets)
    +    QhullFacetListIterator k(facets);
    +    while(k.hasNext()){
    +        QhullFacet f= k.next();
    +        std::vector vertices;
    +        if(!f.isUpperDelaunay()){
    +            if(!f.isTopOrient() && f.isSimplicial()){ /* orient the vertices like option 'o' */
    +                QhullVertexSet vs= f.vertices();
    +                vertices.push_back(vs[1].point().id());
    +                vertices.push_back(vs[0].point().id());
    +                for(int i= 2; i<(int)vs.size(); ++i){
    +                    vertices.push_back(vs[i].point().id());
    +                }
    +            }else{  /* note: for non-simplicial facets, this code does not duplicate option 'o', see qh_facet3vertex and qh_printfacetNvertex_nonsimplicial */
    +                // for(QhullVertex vertex : f.vertices()){
    +                QhullVertexSetIterator i(f.vertices());
    +                while(i.hasNext()){
    +                    QhullVertex vertex= i.next();
    +                    QhullPoint p= vertex.point();
    +                    vertices.push_back(p.id());
    +                }
    +            }
    +            regions.push_back(vertices);
    +        }
    +    }
    +    // for(std::vector vertices : regions)
    +    for(size_t k2= 0; k2 < regions.size(); ++k2){
    +        std::vector vertices= regions[k2];
    +        size_t n= vertices.size();
    +        cout << n << " ";
    +        for(size_t i= 0; iqh());
    +    qhull->outputQhull(printOption); // qh_fprintf writes its results into 'results'
    +    int n= results.numResults();
    +    if(results.firstCode()!=9231){
    +        cout << "user_eg3 error (qvoronoi_fifo): 'qhull " << printOption << "' did not produce output for 'Fi' or 'Fo'\nqh_fprintf codes: ";
    +        printInts(results.codes());
    +        cout << "\n";
    +        return;
    +    }else if(n != results.numDoubles() || n != results.numInts()){
    +        cout << "user_eg3 error (qvoronoi_fifo): Expecting doubles and ints for " << n << " results.  Got " << results.numDoubles() << " doubles and " << results.numInts() << " ints.  Did an error occur?\nqh_fprintf codes: ";
    +        printInts(results.codes());
    +        cout << "\n";
    +        return;
    +    }
    +    cout << n << "\n";
    +    for(int i= 0; i > voronoiVertices;
    +    std::vector vertexAtInfinity;
    +    for(int i= 0; i voronoiVertex : voronoiVertices)
    +    for(size_t k= 0; k < voronoiVertices.size(); ++k){
    +        std::vector voronoiVertex= voronoiVertices[k];
    +        size_t n= voronoiVertex.size();
    +        for(size_t i= 0; i > voronoiRegions(numpoints); // qh_printvoronoi calls qh_pointvertex via qh_markvoronoi
    +    // for(QhullVertex vertex : qhull.vertexList())
    +    QhullVertexListIterator j2(qhull.vertexList());
    +    while(j2.hasNext()){
    +        QhullVertex vertex= j2.next();
    +        size_t numinf= 0;
    +        std::vector voronoiRegion;
    +        //for(QhullFacet neighbor : vertex.neighborFacets())
    +        QhullFacetSetIterator k2(vertex.neighborFacets());
    +        while(k2.hasNext()){
    +            QhullFacet neighbor= k2.next();
    +            if(neighbor.visitId()==0){
    +                if(!numinf){
    +                    numinf= 1;
    +                    voronoiRegion.push_back(0); // the voronoiVertex at infinity indicates an unbounded region
    +                }
    +            }else if(neighbor.visitId() numinf){
    +            int siteId= vertex.point().id();
    +            if(siteId>=0 && siteId voronoiRegion : voronoiRegions)
    +    for(size_t k3= 0; k3 < voronoiRegions.size(); ++k3){
    +        std::vector voronoiRegion= voronoiRegions[k3];
    +        size_t n= voronoiRegion.size();
    +        cout << n;
    +        for(size_t i= 0; i > voronoiVertices;
    +    // for(QhullFacet facet : qhull.facetList())
    +    QhullFacetListIterator j(qhull.facetList());
    +    while(j.hasNext()){
    +        QhullFacet facet= j.next();
    +        if(facet.visitId() && facet.visitId() voronoiVertex : voronoiVertices)
    +    for(size_t k= 0; k < voronoiVertices.size(); ++k){
    +        std::vector voronoiVertex= voronoiVertices[k];
    +        size_t n= voronoiVertex.size();
    +        for(size_t i= 0; i > voronoiRegions(numpoints); // qh_printvoronoi calls qh_pointvertex via qh_markvoronoi
    +    //for(QhullVertex vertex : qhull.vertexList()){
    +    QhullVertexListIterator j2(qhull.vertexList());
    +    while(j2.hasNext()){
    +        QhullVertex vertex= j2.next();
    +        size_t numinf= 0;
    +        std::vector voronoiRegion;
    +        // for(QhullFacet neighbor : vertex.neighborFacets())
    +        QhullFacetSetIterator k(vertex.neighborFacets());
    +        while(k.hasNext()){
    +            QhullFacet neighbor= k.next();
    +            if(neighbor.visitId()==0){
    +                if(!numinf){
    +                    numinf= 1;
    +                    voronoiRegion.push_back(-1); // -1 indicates the Voronoi vertex at infinity
    +                }
    +            }else if(neighbor.visitId() numinf){
    +            int siteId= vertex.point().id();
    +            if(siteId>=0 && siteId voronoiRegion : voronoiRegions)
    +    for(size_t j3= 0; j3 < voronoiRegions.size(); ++j3){
    +        std::vector voronoiRegion= voronoiRegions[j3];
    +        size_t n= voronoiRegion.size();
    +        cout << n;
    +        for(size_t i= 0; i1){
    +            cout << "\nInput points and facetlist for '" << qhull.qhullCommand() << "' via C++ classes\n";
    +            qconvex_o(qhull);
    +        }else if(strcmp(argv[i], "eg-convex")==0 && !rbox.isEmpty()){
    +            Qhull q(rbox, "");
    +            cout << "\nInput points and facetlist for convex hull of " << q.rboxCommand() << " via C++ classes\n";
    +            qconvex_o(q);
    +            noRboxOutput= true;
    +        }else if(strcmp(argv[i], "eg-convex")==0){
    +            cout << "\nA 3-d diamond (rbox d)\n";
    +            RboxPoints diamond("d");
    +            cout << diamond;
    +            cout << "\nInput points and facetlist of its convex hull (qhull o)\n";
    +            Qhull q(diamond, "o");
    +            q.setOutputStream(&cout);
    +            q.outputQhull();
    +            // q.outputQhull("o") produces the same output
    +            cout << "\nInput points and facetlist using std::vector and C++ classes\n";
    +            qconvex_o(q);
    +            cout << "\nIts outward pointing normals as vector plus offset (qhull n)\n";
    +            q.outputQhull("n");
    +        }else if(strcmp(argv[i], "eg-delaunay")==0 && readingQhull>1 && qhull.isDelaunay()){
    +            cout << "\nVertices and Delaunay regions of paraboloid from '" << qhull.qhullCommand() << "' via C++ classes\n";
    +            qdelaunay_o(qhull);
    +        }else if(strcmp(argv[i], "eg-delaunay")==0 && !rbox.isEmpty()){
    +            cout << "\nDelaunay triangulation of " << rbox.count() << " points as " << rbox.dimension()+1 << "-d paraboloid via C++ classes\n";
    +            Qhull q(rbox, "d");
    +            qdelaunay_o(q);
    +            noRboxOutput= true;
    +        }else if(strcmp(argv[i], "eg-delaunay")==0){
    +            cout << "\nA 2-d triangle in a square (rbox y c D2)\n";
    +            RboxPoints triangleSquare("y c D2");
    +            cout << triangleSquare;
    +            cout << "\nThe 2-d input sites are lifted to a 3-d paraboloid.\n";
    +            cout << "A Delaunay region is a facet of the paraboloid's convex hull.\n";
    +            cout << "\nThe Delaunay triangulation as input sites and Delaunay regions (qhull d o)\n";
    +            Qhull q(triangleSquare, "d o");
    +            q.setOutputStream(&cout);
    +            q.outputQhull();
    +            // q.outputQhull("o") produces the same output
    +            cout << "\nThe same results using std::vector and C++ classes\n";
    +            qdelaunay_o(q);
    +        }else if(strcmp(argv[i], "eg-voronoi")==0 && readingQhull>1 && qhull.isDelaunay()){
    +            cout << "\nVoronoi vertices and regions for '" << qhull.qhullCommand() << "' via C++ classes\n";
    +            bool isLower;            //not used
    +            int voronoiVertexCount;  //not used
    +            qhull.prepareVoronoi(&isLower, &voronoiVertexCount); // not needed if previous output from Qhull
    +            qvoronoi_o(qhull);
    +        }else if(strcmp(argv[i], "eg-voronoi")==0 && !rbox.isEmpty()){
    +            Qhull q(rbox, "v");
    +            cout << "\nVoronoi vertices and regions for " << q.rboxCommand() << " via C++ classes\n";
    +            bool isLower;
    +            int voronoiVertexCount;
    +            q.prepareVoronoi(&isLower, &voronoiVertexCount);
    +            qvoronoi_o(q);
    +            noRboxOutput= true;
    +        }else if(strcmp(argv[i], "eg-voronoi")==0){
    +            cout << "\nA 2-d triangle in a square (rbox y c D2)\n";
    +            RboxPoints triangleSquare("y c D2");
    +            cout << triangleSquare;
    +            cout << "\nIts Voronoi diagram as vertices and regions (qhull v o)\n";
    +            cout << "The Voronoi diagram is the dual of the Delaunay triangulation\n";
    +            cout << "Voronoi vertices are Delaunay regions, and Voronoi regions are Delaunay input sites\n";
    +            cout << "The Voronoi vertex at infinity is represented as '-10.101 -10.101'\n";
    +            Qhull q(triangleSquare, "v o");
    +            q.setOutputStream(&cout);
    +            q.outputQhull();
    +            // q.outputQhull("o") produces the same output
    +            cout << "\nThe same results using std::vector and C++ classes\n";
    +            cout << "Qhull::prepareVoronoi assigns facetT.visit_id and vertexT.neighbors\n";
    +            cout << "The Voronoi regions are rotated by one Voronoi vertex (prepareVoronoi occurs twice)\n";
    +            bool isLower;
    +            int voronoiVertexCount;
    +            q.prepareVoronoi(&isLower, &voronoiVertexCount); // Also called by q.outputQhull("o"), hence the rotated vertices
    +            qvoronoi_o(q);
    +        }else if(strcmp(argv[i], "eg-fifo")==0 && readingQhull>1 && qhull.isDelaunay()){
    +            cout << "\nVoronoi vertices for '" << qhull.qhullCommand() << "' via C++ classes\n";
    +            bool isLower;
    +            int voronoiVertexCount;
    +            qhull.prepareVoronoi(&isLower, &voronoiVertexCount);
    +            qvoronoi_pfn(qhull);
    +            cout << "\nHyperplanes for bounded facets between Voronoi regions via QhullUser and qh_fprintf\n";
    +            qvoronoi_fifo(&qhull, "Fi");
    +            cout << "\nHyperplanes for unbounded facets between Voronoi regions via QhullUser and qh_fprintf\n";
    +            qvoronoi_fifo(&qhull, "Fo");
    +        }else if(strcmp(argv[i], "eg-fifo")==0 && !rbox.isEmpty()){
    +            Qhull q(rbox, "v");
    +            cout << "\nVoronoi vertices for " << q.rboxCommand() << " via QhullUser and qh_fprintf\n";
    +            bool isLower;
    +            int voronoiVertexCount;
    +            q.prepareVoronoi(&isLower, &voronoiVertexCount);
    +            qvoronoi_pfn(q);
    +            cout << "\nHyperplanes for bounded facets between Voronoi regions via QhullUser and qh_fprintf\n";
    +            qvoronoi_fifo(&q, "Fi");
    +            cout << "\nHyperplanes for unbounded facets between Voronoi regions via QhullUser and qh_fprintf\n";
    +            qvoronoi_fifo(&q, "Fo");
    +            noRboxOutput= true;
    +        }else if(strcmp(argv[i], "eg-fifo")==0){
    +            cout << "\nA 2-d triangle in a square (rbox y c D2)\n";
    +            RboxPoints triangleSquare("y c D2");
    +            cout << triangleSquare;
    +            cout << "\nIts Voronoi vertices (qhull v p)\n";
    +            cout << "This is the first part of eg-voronoi, but without infinity\n";
    +            Qhull q(triangleSquare, "v p");
    +            q.setOutputStream(&cout);
    +            q.outputQhull();
    +            cout << "\nIts Voronoi regions (qhull v FN)\n";
    +            cout << "This is the second part of eg-voronoi, with ids one less\n";
    +            cout << "Regions are ordered by the corresponding input site.\n";
    +            q.outputQhull("FN");
    +            // q.outputQhull("p FN") produces the same outputs
    +            cout << "\nThe same results as 'qhull v p FN' using std::vector and C++ classes\n";
    +            cout << "Qhull::prepareVoronoi assigns facet.visit_id and vertex.neighbors\n";
    +            cout << "prepareVoronoi is also called by q.outputQhull(\"FN\"), hence the rotated vertices\n";
    +            bool isLower;
    +            int voronoiVertexCount;
    +            q.prepareVoronoi(&isLower, &voronoiVertexCount); // Also called by q.outputQhull("o"), hence the rotated vertices
    +            qvoronoi_pfn(q);
    +            cout << "\nHyperplanes for bounded facets between Voronoi regions (qhull v Fi)\n";
    +            cout << "Each hyperplane is the perpendicular bisector of 2 input sites.\n";
    +            q.outputQhull("Fi");
    +            cout << "\nHyperplanes for unbounded rays of unbounded facets (qhull v Fo)\n";
    +            cout << "Each ray goes through the midpoint of 2 input sites, oriented outwards\n";
    +            q.outputQhull("Fo");
    +            cout << "\nThe same result as 'qhull v Fi' using QhullUser and its custom qh_fprintf\n";
    +            cout << "qh_fprintf captures the output from qh_eachvoronoi in io_r.c (qhull v Fi Fo Ta)\n";
    +            qvoronoi_fifo(&q, "Fi");
    +            cout << "\nThe same result as 'qhull v Fo' using QhullUser and its custom qh_fprintf\n";
    +            qvoronoi_fifo(&q, "Fo");
    +        }else if(strcmp(argv[i], "rbox")==0){
                 if(readingRbox!=0 || readingQhull!=0){
                     cerr << "user_eg3 -- \"rbox\" must be first" << endl;
                     return 1;
    @@ -103,9 +597,12 @@
                 }
                 if(rbox.isEmpty()){
                     if(readingRbox){
    -                    rbox.appendPoints("10 D2");
    +                    if(rbox.dimension()==0){
    +                        rbox.setDimension(2);
    +                    }
    +                    rbox.appendPoints("10");
                     }else{
    -                    cerr << "Enter dimension count coordinates.  End with ^Z (Windows) or ^D (Unix).\n";
    +                    cerr << "Enter dimension followed by count followed by coordinates.  End with ^Z (Windows) or ^D (Unix).\n";
                         rbox.appendPoints(cin);
                     }
                 }
    @@ -134,11 +631,11 @@
                     qhull.clearQhullMessage();
                 }
             }else{
    -            cerr << "user_eg3 error: Expecting qhull, qhull-cout, or rbox.  Got " << argv[i] << endl;
    +            cerr << "user_eg3 error: Expecting eg-100, eg-convex, eg-delaunay, eg-voronoi, eg-fifo, qhull, qhull-cout, or rbox.  Got " << argv[i] << endl;
                 return 1;
             }
         }//foreach argv
    -    if(readingRbox){
    +    if(readingRbox && !noRboxOutput){
             cout << rbox;
             return 0;
         }