diff --git a/CMakeLists.txt b/CMakeLists.txt index 902960c..eefa052 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,11 @@ if (NOT LIBIGL_FOUND) message(FATAL_ERROR "libigl not found --- You can download it using: \n git clone --recursive https://github.com/libigl/libigl.git ${PROJECT_SOURCE_DIR}/../libigl") endif() +if (NOT EIGEN_FOUND) + find_package(Eigen) + include_directories(Eigen ${EIGEN_INCLUDE_DIRS}) +endif (NOT EIGEN_FOUND) + if(MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /bigobj" ) ### Enable parallel compilation for Visual Studio set(CMAKE_CXX_FLAGS_RELEASE "/MT") diff --git a/cmake/FindEigen.cmake b/cmake/FindEigen.cmake new file mode 100644 index 0000000..6355284 --- /dev/null +++ b/cmake/FindEigen.cmake @@ -0,0 +1,36 @@ +# - Find Eigen +# This module searches for the Eigen C++ library. +# +# The module defines the following variables: +# EIGEN_INCLUDE_DIRS, where to find Eigen/Core, etc. +# EIGEN_FOUND, if false, do not try to use EIGEN. +# +# Variables used by this module, they can change the default behavior and need +# to be set before calling find_package: +# +# EIGEN_ROOT_DIR - The prefered installation prefix when searching for Eigen +# + +include(FindPackageHandleStandardArgs) + +# Finds the include files directory +find_path(EIGEN_INCLUDE_DIRS + NAMES Eigen/Core + HINTS "${EIGEN_ROOT_DIR}" + PATHS + $ENV{EIGEN_INC} + $ENV{EIGEN_PATH} + ${PROJECT_SOURCE_DIR}/python/pymesh/third_party/include + /opt/local/include + /usr/local/include + /usr/include + PATH_SUFFIXES eigen3 + DOC "The directory where Eigen/Core resides" + NO_DEFAULT_PATH + ) + +if(EIGEN_INCLUDE_DIRS) + mark_as_advanced(EIGEN_INCLUDE_DIRS) +endif() + +FIND_PACKAGE_HANDLE_STANDARD_ARGS(Eigen DEFAULT_MSG EIGEN_INCLUDE_DIRS) diff --git a/data/cube.ply b/data/cube.ply new file mode 100644 index 0000000..3a34912 Binary files /dev/null and b/data/cube.ply differ diff --git a/data/sphere.obj b/data/sphere.obj new file mode 100644 index 0000000..a662e08 --- /dev/null +++ b/data/sphere.obj @@ -0,0 +1,1923 @@ +# Generated with PyMesh +v -0.5257311121191336 0.85065080835204 0 +v 0.5257311121191336 0.85065080835204 0 +v -0.5257311121191336 -0.85065080835204 0 +v 0.5257311121191336 -0.85065080835204 0 +v 0 -0.5257311121191336 0.85065080835204 +v 0 0.5257311121191336 0.85065080835204 +v 0 -0.5257311121191336 -0.85065080835204 +v 0 0.5257311121191336 -0.85065080835204 +v 0.85065080835204 0 -0.5257311121191336 +v 0.85065080835204 0 0.5257311121191336 +v -0.85065080835204 0 -0.5257311121191336 +v -0.85065080835204 0 0.5257311121191336 +v -0.8090169943749475 0.5 0.3090169943749474 +v -0.5 0.3090169943749474 0.8090169943749475 +v -0.3090169943749474 0.8090169943749475 0.5 +v 0.3090169943749474 0.8090169943749475 0.5 +v 0 1 0 +v 0.3090169943749474 0.8090169943749475 -0.5 +v -0.3090169943749474 0.8090169943749475 -0.5 +v -0.5 0.3090169943749474 -0.8090169943749475 +v -0.8090169943749475 0.5 -0.3090169943749474 +v -1 0 0 +v 0.5 0.3090169943749474 0.8090169943749475 +v 0.8090169943749475 0.5 0.3090169943749474 +v -0.5 -0.3090169943749474 0.8090169943749475 +v 0 0 1 +v -0.8090169943749475 -0.5 -0.3090169943749474 +v -0.8090169943749475 -0.5 0.3090169943749474 +v 0 0 -1 +v -0.5 -0.3090169943749474 -0.8090169943749475 +v 0.8090169943749475 0.5 -0.3090169943749474 +v 0.5 0.3090169943749474 -0.8090169943749475 +v 0.8090169943749475 -0.5 0.3090169943749474 +v 0.5 -0.3090169943749474 0.8090169943749475 +v 0.3090169943749474 -0.8090169943749475 0.5 +v -0.3090169943749474 -0.8090169943749475 0.5 +v 0 -1 0 +v -0.3090169943749474 -0.8090169943749475 -0.5 +v 0.3090169943749474 -0.8090169943749475 -0.5 +v 0.5 -0.3090169943749474 -0.8090169943749475 +v 0.8090169943749475 -0.5 -0.3090169943749474 +v 1 0 0 +v -0.6817183540715489 0.7165669224151787 0.1476209044221631 +v -0.5877852522924731 0.6881909602355868 0.4253254041760199 +v -0.4428627132664893 0.8641878268373419 0.2388556408050596 +v -0.7165669224151787 0.1476209044221631 0.6817183540715489 +v -0.6881909602355868 0.4253254041760199 0.5877852522924731 +v -0.8641878268373419 0.2388556408050596 0.4428627132664893 +v -0.1476209044221631 0.6817183540715489 0.7165669224151787 +v -0.4253254041760199 0.5877852522924731 0.6881909602355868 +v -0.2388556408050596 0.4428627132664893 0.8641878268373419 +v -0.1624598481164531 0.9510565162951535 0.2628655560595668 +v -0.2952418088443262 0.9554225632202383 0 +v 0.1476209044221631 0.6817183540715489 0.7165669224151787 +v 0 0.8506508083520399 0.5257311121191336 +v 0.2952418088443262 0.9554225632202383 0 +v 0.1624598481164531 0.9510565162951535 0.2628655560595668 +v 0.4428627132664893 0.8641878268373419 0.2388556408050596 +v -0.1624598481164531 0.9510565162951535 -0.2628655560595668 +v -0.4428627132664893 0.8641878268373419 -0.2388556408050596 +v 0.4428627132664893 0.8641878268373419 -0.2388556408050596 +v 0.1624598481164531 0.9510565162951535 -0.2628655560595668 +v -0.1476209044221631 0.6817183540715489 -0.7165669224151787 +v 0 0.8506508083520399 -0.5257311121191336 +v 0.1476209044221631 0.6817183540715489 -0.7165669224151787 +v -0.5877852522924731 0.6881909602355868 -0.4253254041760199 +v -0.6817183540715489 0.7165669224151787 -0.1476209044221631 +v -0.2388556408050596 0.4428627132664893 -0.8641878268373419 +v -0.4253254041760199 0.5877852522924731 -0.6881909602355868 +v -0.8641878268373419 0.2388556408050596 -0.4428627132664893 +v -0.6881909602355868 0.4253254041760199 -0.5877852522924731 +v -0.7165669224151787 0.1476209044221631 -0.6817183540715489 +v -0.8506508083520399 0.5257311121191336 0 +v -0.9554225632202383 0 -0.2952418088443262 +v -0.9510565162951535 0.2628655560595668 -0.1624598481164531 +v -0.9510565162951535 0.2628655560595668 0.1624598481164531 +v -0.9554225632202383 0 0.2952418088443262 +v 0.5877852522924731 0.6881909602355868 0.4253254041760199 +v 0.6817183540715489 0.7165669224151787 0.1476209044221631 +v 0.2388556408050596 0.4428627132664893 0.8641878268373419 +v 0.4253254041760199 0.5877852522924731 0.6881909602355868 +v 0.8641878268373419 0.2388556408050596 0.4428627132664893 +v 0.6881909602355868 0.4253254041760199 0.5877852522924731 +v 0.7165669224151787 0.1476209044221631 0.6817183540715489 +v -0.2628655560595668 0.1624598481164531 0.9510565162951535 +v 0 0.2952418088443262 0.9554225632202383 +v -0.7165669224151787 -0.1476209044221631 0.6817183540715489 +v -0.5257311121191336 0 0.8506508083520399 +v 0 -0.2952418088443262 0.9554225632202383 +v -0.2628655560595668 -0.1624598481164531 0.9510565162951535 +v -0.2388556408050596 -0.4428627132664893 0.8641878268373419 +v -0.9510565162951535 -0.2628655560595668 0.1624598481164531 +v -0.8641878268373419 -0.2388556408050596 0.4428627132664893 +v -0.8641878268373419 -0.2388556408050596 -0.4428627132664893 +v -0.9510565162951535 -0.2628655560595668 -0.1624598481164531 +v -0.6817183540715489 -0.7165669224151787 0.1476209044221631 +v -0.8506508083520399 -0.5257311121191336 0 +v -0.6817183540715489 -0.7165669224151787 -0.1476209044221631 +v -0.5257311121191336 0 -0.8506508083520399 +v -0.7165669224151787 -0.1476209044221631 -0.6817183540715489 +v 0 0.2952418088443262 -0.9554225632202383 +v -0.2628655560595668 0.1624598481164531 -0.9510565162951535 +v -0.2388556408050596 -0.4428627132664893 -0.8641878268373419 +v -0.2628655560595668 -0.1624598481164531 -0.9510565162951535 +v 0 -0.2952418088443262 -0.9554225632202383 +v 0.4253254041760199 0.5877852522924731 -0.6881909602355868 +v 0.2388556408050596 0.4428627132664893 -0.8641878268373419 +v 0.6817183540715489 0.7165669224151787 -0.1476209044221631 +v 0.5877852522924731 0.6881909602355868 -0.4253254041760199 +v 0.7165669224151787 0.1476209044221631 -0.6817183540715489 +v 0.6881909602355868 0.4253254041760199 -0.5877852522924731 +v 0.8641878268373419 0.2388556408050596 -0.4428627132664893 +v 0.6817183540715489 -0.7165669224151787 0.1476209044221631 +v 0.5877852522924731 -0.6881909602355868 0.4253254041760199 +v 0.4428627132664893 -0.8641878268373419 0.2388556408050596 +v 0.7165669224151787 -0.1476209044221631 0.6817183540715489 +v 0.6881909602355868 -0.4253254041760199 0.5877852522924731 +v 0.8641878268373419 -0.2388556408050596 0.4428627132664893 +v 0.1476209044221631 -0.6817183540715489 0.7165669224151787 +v 0.4253254041760199 -0.5877852522924731 0.6881909602355868 +v 0.2388556408050596 -0.4428627132664893 0.8641878268373419 +v 0.1624598481164531 -0.9510565162951535 0.2628655560595668 +v 0.2952418088443262 -0.9554225632202383 0 +v -0.1476209044221631 -0.6817183540715489 0.7165669224151787 +v 0 -0.8506508083520399 0.5257311121191336 +v -0.2952418088443262 -0.9554225632202383 0 +v -0.1624598481164531 -0.9510565162951535 0.2628655560595668 +v -0.4428627132664893 -0.8641878268373419 0.2388556408050596 +v 0.1624598481164531 -0.9510565162951535 -0.2628655560595668 +v 0.4428627132664893 -0.8641878268373419 -0.2388556408050596 +v -0.4428627132664893 -0.8641878268373419 -0.2388556408050596 +v -0.1624598481164531 -0.9510565162951535 -0.2628655560595668 +v 0.1476209044221631 -0.6817183540715489 -0.7165669224151787 +v 0 -0.8506508083520399 -0.5257311121191336 +v -0.1476209044221631 -0.6817183540715489 -0.7165669224151787 +v 0.5877852522924731 -0.6881909602355868 -0.4253254041760199 +v 0.6817183540715489 -0.7165669224151787 -0.1476209044221631 +v 0.2388556408050596 -0.4428627132664893 -0.8641878268373419 +v 0.4253254041760199 -0.5877852522924731 -0.6881909602355868 +v 0.8641878268373419 -0.2388556408050596 -0.4428627132664893 +v 0.6881909602355868 -0.4253254041760199 -0.5877852522924731 +v 0.7165669224151787 -0.1476209044221631 -0.6817183540715489 +v 0.8506508083520399 -0.5257311121191336 0 +v 0.9554225632202383 0 -0.2952418088443262 +v 0.9510565162951535 -0.2628655560595668 -0.1624598481164531 +v 0.9510565162951535 -0.2628655560595668 0.1624598481164531 +v 0.9554225632202383 0 0.2952418088443262 +v 0.2628655560595668 0.1624598481164531 0.9510565162951535 +v 0.2628655560595668 -0.1624598481164531 0.9510565162951535 +v 0.5257311121191336 0 0.8506508083520399 +v -0.5877852522924731 -0.6881909602355868 0.4253254041760199 +v -0.4253254041760199 -0.5877852522924731 0.6881909602355868 +v -0.6881909602355868 -0.4253254041760199 0.5877852522924731 +v -0.4253254041760199 -0.5877852522924731 -0.6881909602355868 +v -0.5877852522924731 -0.6881909602355868 -0.4253254041760199 +v -0.6881909602355868 -0.4253254041760199 -0.5877852522924731 +v 0.5257311121191336 0 -0.8506508083520399 +v 0.2628655560595668 -0.1624598481164531 -0.9510565162951535 +v 0.2628655560595668 0.1624598481164531 -0.9510565162951535 +v 0.9510565162951535 0.2628655560595668 0.1624598481164531 +v 0.9510565162951535 0.2628655560595668 -0.1624598481164531 +v 0.8506508083520399 0.5257311121191336 0 +v -0.6040434718285418 0.7938632042573209 0.07009063466413208 +v -0.5685192202902353 0.7991326580327285 0.1953788397604234 +v -0.4906344426489245 0.8639538389214531 0.1134090291796173 +v -0.709910635852268 0.5991063585226795 0.3702680924431961 +v -0.6440048006169802 0.7107897965621175 0.2829057827006495 +v -0.7523439028017583 0.6176706970007558 0.2290448907607829 +v -0.3817414846013048 0.8467155877615388 0.3706024182004535 +v -0.5174854883476929 0.7889830317777987 0.3312318597542557 +v -0.4504468207386603 0.7594638151136077 0.4693744509658757 +v -0.7938632042573209 0.07009063466413208 0.6040434718285418 +v -0.7991326580327285 0.1953788397604234 0.5685192202902353 +v -0.8639538389214531 0.1134090291796173 0.4906344426489245 +v -0.5991063585226795 0.3702680924431961 0.709910635852268 +v -0.7107897965621176 0.2829057827006495 0.6440048006169802 +v -0.6176706970007558 0.2290448907607829 0.7523439028017583 +v -0.8467155877615388 0.3706024182004535 0.3817414846013048 +v -0.7889830317777987 0.3312318597542557 0.5174854883476929 +v -0.7594638151136077 0.4693744509658757 0.4504468207386603 +v -0.07009063466413208 0.6040434718285418 0.7938632042573209 +v -0.1953788397604234 0.5685192202902353 0.7991326580327285 +v -0.1134090291796173 0.4906344426489245 0.8639538389214531 +v -0.3702680924431961 0.709910635852268 0.5991063585226795 +v -0.2829057827006495 0.6440048006169802 0.7107897965621176 +v -0.2290448907607829 0.7523439028017583 0.6176706970007558 +v -0.3706024182004535 0.3817414846013048 0.8467155877615388 +v -0.3312318597542557 0.5174854883476929 0.7889830317777987 +v -0.4693744509658757 0.4504468207386603 0.7594638151136077 +v -0.6465777917977316 0.5642542117657714 0.5133754412304479 +v -0.5642542117657714 0.5133754412304479 0.6465777917977316 +v -0.5133754412304479 0.6465777917977316 0.5642542117657714 +v -0.3731403805298119 0.9198834216871895 0.120750763654461 +v -0.4205438079847925 0.9072722334369382 0 +v -0.2405361848863923 0.8891957226704116 0.3891957226704115 +v -0.3127729408627245 0.915502344047086 0.2530386245385746 +v -0.1526965938405219 0.9882731152012093 0 +v -0.2345797056470434 0.9638284211006921 0.1265193122692873 +v -0.0801787282954641 0.988302081193091 0.1297319075568038 +v 0.07009063466413208 0.6040434718285418 0.7938632042573209 +v 0 0.6892699839446963 0.7245045819267661 +v 0.1603574565909282 0.8396425434090717 0.5189276302272153 +v 0.07819323521568113 0.7705241128862675 0.6325965613464364 +v 0.2290448907607829 0.7523439028017583 0.6176706970007558 +v -0.07819323521568113 0.7705241128862675 0.6325965613464364 +v -0.1603574565909282 0.8396425434090717 0.5189276302272153 +v 0.4205438079847925 0.9072722334369382 0 +v 0.3731403805298119 0.9198834216871895 0.120750763654461 +v 0.4906344426489245 0.8639538389214531 0.1134090291796173 +v 0.0801787282954641 0.988302081193091 0.1297319075568038 +v 0.2345797056470434 0.9638284211006921 0.1265193122692873 +v 0.1526965938405219 0.9882731152012093 0 +v 0.3817414846013048 0.8467155877615388 0.3706024182004535 +v 0.3127729408627245 0.915502344047086 0.2530386245385746 +v 0.2405361848863923 0.8891957226704116 0.3891957226704115 +v -0.08232358003196016 0.9129824929322991 0.3996070517018511 +v 0.08232358003196016 0.9129824929322991 0.3996070517018511 +v 0 0.9638612634676226 0.2664047011345674 +v -0.3731403805298119 0.9198834216871895 -0.120750763654461 +v -0.4906344426489245 0.8639538389214531 -0.1134090291796173 +v -0.0801787282954641 0.988302081193091 -0.1297319075568038 +v -0.2345797056470434 0.9638284211006921 -0.1265193122692873 +v -0.3817414846013048 0.8467155877615388 -0.3706024182004535 +v -0.3127729408627245 0.915502344047086 -0.2530386245385746 +v -0.2405361848863923 0.8891957226704116 -0.3891957226704115 +v 0.4906344426489245 0.8639538389214531 -0.1134090291796173 +v 0.3731403805298119 0.9198834216871895 -0.120750763654461 +v 0.2405361848863923 0.8891957226704116 -0.3891957226704115 +v 0.3127729408627245 0.915502344047086 -0.2530386245385746 +v 0.3817414846013048 0.8467155877615388 -0.3706024182004535 +v 0.2345797056470434 0.9638284211006921 -0.1265193122692873 +v 0.0801787282954641 0.988302081193091 -0.1297319075568038 +v -0.07009063466413208 0.6040434718285418 -0.7938632042573209 +v 0 0.6892699839446963 -0.7245045819267661 +v 0.07009063466413208 0.6040434718285418 -0.7938632042573209 +v -0.1603574565909282 0.8396425434090717 -0.5189276302272153 +v -0.07819323521568113 0.7705241128862675 -0.6325965613464364 +v -0.2290448907607829 0.7523439028017583 -0.6176706970007558 +v 0.2290448907607829 0.7523439028017583 -0.6176706970007558 +v 0.07819323521568113 0.7705241128862675 -0.6325965613464364 +v 0.1603574565909282 0.8396425434090717 -0.5189276302272153 +v 0 0.9638612634676226 -0.2664047011345674 +v 0.08232358003196016 0.9129824929322991 -0.3996070517018511 +v -0.08232358003196016 0.9129824929322991 -0.3996070517018511 +v -0.5685192202902353 0.7991326580327285 -0.1953788397604234 +v -0.6040434718285418 0.7938632042573209 -0.07009063466413208 +v -0.4504468207386603 0.7594638151136077 -0.4693744509658757 +v -0.5174854883476929 0.7889830317777987 -0.3312318597542557 +v -0.7523439028017583 0.6176706970007558 -0.2290448907607829 +v -0.6440048006169802 0.7107897965621175 -0.2829057827006495 +v -0.709910635852268 0.5991063585226795 -0.3702680924431961 +v -0.1134090291796173 0.4906344426489245 -0.8639538389214531 +v -0.1953788397604234 0.5685192202902353 -0.7991326580327285 +v -0.4693744509658757 0.4504468207386603 -0.7594638151136077 +v -0.3312318597542557 0.5174854883476929 -0.7889830317777987 +v -0.3706024182004535 0.3817414846013048 -0.8467155877615388 +v -0.2829057827006495 0.6440048006169802 -0.7107897965621176 +v -0.3702680924431961 0.709910635852268 -0.5991063585226795 +v -0.8639538389214531 0.1134090291796173 -0.4906344426489245 +v -0.7991326580327285 0.1953788397604234 -0.5685192202902353 +v -0.7938632042573209 0.07009063466413208 -0.6040434718285418 +v -0.7594638151136077 0.4693744509658757 -0.4504468207386603 +v -0.7889830317777987 0.3312318597542557 -0.5174854883476929 +v -0.8467155877615388 0.3706024182004535 -0.3817414846013048 +v -0.6176706970007558 0.2290448907607829 -0.7523439028017583 +v -0.7107897965621176 0.2829057827006495 -0.6440048006169802 +v -0.5991063585226795 0.3702680924431961 -0.709910635852268 +v -0.5133754412304479 0.6465777917977316 -0.5642542117657714 +v -0.5642542117657714 0.5133754412304479 -0.6465777917977316 +v -0.6465777917977316 0.5642542117657714 -0.5133754412304479 +v -0.6892699839446963 0.7245045819267661 0 +v -0.8396425434090717 0.5189276302272153 -0.1603574565909282 +v -0.7705241128862675 0.6325965613464364 -0.07819323521568113 +v -0.7705241128862675 0.6325965613464364 0.07819323521568113 +v -0.8396425434090717 0.5189276302272153 0.1603574565909282 +v -0.9072722334369382 0 -0.4205438079847925 +v -0.9198834216871895 0.120750763654461 -0.3731403805298119 +v -0.988302081193091 0.1297319075568038 -0.0801787282954641 +v -0.9638284211006921 0.1265193122692873 -0.2345797056470434 +v -0.9882731152012093 0 -0.1526965938405219 +v -0.915502344047086 0.2530386245385746 -0.3127729408627245 +v -0.8891957226704116 0.3891957226704115 -0.2405361848863923 +v -0.9198834216871895 0.120750763654461 0.3731403805298119 +v -0.9072722334369382 0 0.4205438079847925 +v -0.8891957226704116 0.3891957226704115 0.2405361848863923 +v -0.915502344047086 0.2530386245385746 0.3127729408627245 +v -0.9882731152012093 0 0.1526965938405219 +v -0.9638284211006921 0.1265193122692873 0.2345797056470434 +v -0.988302081193091 0.1297319075568038 0.0801787282954641 +v -0.9129824929322991 0.3996070517018511 -0.08232358003196016 +v -0.9638612634676226 0.2664047011345674 0 +v -0.9129824929322991 0.3996070517018511 0.08232358003196016 +v 0.5685192202902353 0.7991326580327285 0.1953788397604234 +v 0.6040434718285418 0.7938632042573209 0.07009063466413208 +v 0.4504468207386603 0.7594638151136077 0.4693744509658757 +v 0.5174854883476929 0.7889830317777987 0.3312318597542557 +v 0.7523439028017583 0.6176706970007558 0.2290448907607829 +v 0.6440048006169802 0.7107897965621175 0.2829057827006495 +v 0.709910635852268 0.5991063585226795 0.3702680924431961 +v 0.1134090291796173 0.4906344426489245 0.8639538389214531 +v 0.1953788397604234 0.5685192202902353 0.7991326580327285 +v 0.4693744509658757 0.4504468207386603 0.7594638151136077 +v 0.3312318597542557 0.5174854883476929 0.7889830317777987 +v 0.3706024182004535 0.3817414846013048 0.8467155877615388 +v 0.2829057827006495 0.6440048006169802 0.7107897965621176 +v 0.3702680924431961 0.709910635852268 0.5991063585226795 +v 0.8639538389214531 0.1134090291796173 0.4906344426489245 +v 0.7991326580327285 0.1953788397604234 0.5685192202902353 +v 0.7938632042573209 0.07009063466413208 0.6040434718285418 +v 0.7594638151136077 0.4693744509658757 0.4504468207386603 +v 0.7889830317777987 0.3312318597542557 0.5174854883476929 +v 0.8467155877615388 0.3706024182004535 0.3817414846013048 +v 0.6176706970007558 0.2290448907607829 0.7523439028017583 +v 0.7107897965621176 0.2829057827006495 0.6440048006169802 +v 0.5991063585226795 0.3702680924431961 0.709910635852268 +v 0.5133754412304479 0.6465777917977316 0.5642542117657714 +v 0.5642542117657714 0.5133754412304479 0.6465777917977316 +v 0.6465777917977316 0.5642542117657714 0.5133754412304479 +v -0.120750763654461 0.3731403805298119 0.9198834216871895 +v 0 0.4205438079847925 0.9072722334369382 +v -0.3891957226704115 0.2405361848863923 0.8891957226704116 +v -0.2530386245385746 0.3127729408627245 0.915502344047086 +v 0 0.1526965938405219 0.9882731152012093 +v -0.1265193122692873 0.2345797056470434 0.9638284211006921 +v -0.1297319075568038 0.0801787282954641 0.988302081193091 +v -0.7938632042573209 -0.07009063466413208 0.6040434718285418 +v -0.7245045819267661 0 0.6892699839446963 +v -0.5189276302272153 -0.1603574565909282 0.8396425434090717 +v -0.6325965613464364 -0.07819323521568113 0.7705241128862675 +v -0.6176706970007558 -0.2290448907607829 0.7523439028017583 +v -0.6325965613464364 0.07819323521568113 0.7705241128862675 +v -0.5189276302272153 0.1603574565909282 0.8396425434090717 +v 0 -0.4205438079847925 0.9072722334369382 +v -0.120750763654461 -0.3731403805298119 0.9198834216871895 +v -0.1134090291796173 -0.4906344426489245 0.8639538389214531 +v -0.1297319075568038 -0.0801787282954641 0.988302081193091 +v -0.1265193122692873 -0.2345797056470434 0.9638284211006921 +v 0 -0.1526965938405219 0.9882731152012093 +v -0.3706024182004535 -0.3817414846013048 0.8467155877615388 +v -0.2530386245385746 -0.3127729408627245 0.915502344047086 +v -0.3891957226704115 -0.2405361848863923 0.8891957226704116 +v -0.3996070517018511 0.08232358003196016 0.9129824929322991 +v -0.3996070517018511 -0.08232358003196016 0.9129824929322991 +v -0.2664047011345674 0 0.9638612634676226 +v -0.9198834216871895 -0.120750763654461 0.3731403805298119 +v -0.8639538389214531 -0.1134090291796173 0.4906344426489245 +v -0.988302081193091 -0.1297319075568038 0.0801787282954641 +v -0.9638284211006921 -0.1265193122692873 0.2345797056470434 +v -0.8467155877615388 -0.3706024182004535 0.3817414846013048 +v -0.915502344047086 -0.2530386245385746 0.3127729408627245 +v -0.8891957226704116 -0.3891957226704115 0.2405361848863923 +v -0.8639538389214531 -0.1134090291796173 -0.4906344426489245 +v -0.9198834216871895 -0.120750763654461 -0.3731403805298119 +v -0.8891957226704116 -0.3891957226704115 -0.2405361848863923 +v -0.915502344047086 -0.2530386245385746 -0.3127729408627245 +v -0.8467155877615388 -0.3706024182004535 -0.3817414846013048 +v -0.9638284211006921 -0.1265193122692873 -0.2345797056470434 +v -0.988302081193091 -0.1297319075568038 -0.0801787282954641 +v -0.6040434718285418 -0.7938632042573209 0.07009063466413208 +v -0.6892699839446963 -0.7245045819267661 0 +v -0.6040434718285418 -0.7938632042573209 -0.07009063466413208 +v -0.8396425434090717 -0.5189276302272153 0.1603574565909282 +v -0.7705241128862675 -0.6325965613464364 0.07819323521568113 +v -0.7523439028017583 -0.6176706970007558 0.2290448907607829 +v -0.7523439028017583 -0.6176706970007558 -0.2290448907607829 +v -0.7705241128862675 -0.6325965613464364 -0.07819323521568113 +v -0.8396425434090717 -0.5189276302272153 -0.1603574565909282 +v -0.9638612634676226 -0.2664047011345674 0 +v -0.9129824929322991 -0.3996070517018511 -0.08232358003196016 +v -0.9129824929322991 -0.3996070517018511 0.08232358003196016 +v -0.7245045819267661 0 -0.6892699839446963 +v -0.7938632042573209 -0.07009063466413208 -0.6040434718285418 +v -0.5189276302272153 0.1603574565909282 -0.8396425434090717 +v -0.6325965613464364 0.07819323521568113 -0.7705241128862675 +v -0.6176706970007558 -0.2290448907607829 -0.7523439028017583 +v -0.6325965613464364 -0.07819323521568113 -0.7705241128862675 +v -0.5189276302272153 -0.1603574565909282 -0.8396425434090717 +v 0 0.4205438079847925 -0.9072722334369382 +v -0.120750763654461 0.3731403805298119 -0.9198834216871895 +v -0.1297319075568038 0.0801787282954641 -0.988302081193091 +v -0.1265193122692873 0.2345797056470434 -0.9638284211006921 +v 0 0.1526965938405219 -0.9882731152012093 +v -0.2530386245385746 0.3127729408627245 -0.915502344047086 +v -0.3891957226704115 0.2405361848863923 -0.8891957226704116 +v -0.1134090291796173 -0.4906344426489245 -0.8639538389214531 +v -0.120750763654461 -0.3731403805298119 -0.9198834216871895 +v 0 -0.4205438079847925 -0.9072722334369382 +v -0.3891957226704115 -0.2405361848863923 -0.8891957226704116 +v -0.2530386245385746 -0.3127729408627245 -0.915502344047086 +v -0.3706024182004535 -0.3817414846013048 -0.8467155877615388 +v 0 -0.1526965938405219 -0.9882731152012093 +v -0.1265193122692873 -0.2345797056470434 -0.9638284211006921 +v -0.1297319075568038 -0.0801787282954641 -0.988302081193091 +v -0.3996070517018511 0.08232358003196016 -0.9129824929322991 +v -0.2664047011345674 0 -0.9638612634676226 +v -0.3996070517018511 -0.08232358003196016 -0.9129824929322991 +v 0.1953788397604234 0.5685192202902353 -0.7991326580327285 +v 0.1134090291796173 0.4906344426489245 -0.8639538389214531 +v 0.3702680924431961 0.709910635852268 -0.5991063585226795 +v 0.2829057827006495 0.6440048006169802 -0.7107897965621176 +v 0.3706024182004535 0.3817414846013048 -0.8467155877615388 +v 0.3312318597542557 0.5174854883476929 -0.7889830317777987 +v 0.4693744509658757 0.4504468207386603 -0.7594638151136077 +v 0.6040434718285418 0.7938632042573209 -0.07009063466413208 +v 0.5685192202902353 0.7991326580327285 -0.1953788397604234 +v 0.709910635852268 0.5991063585226795 -0.3702680924431961 +v 0.6440048006169802 0.7107897965621175 -0.2829057827006495 +v 0.7523439028017583 0.6176706970007558 -0.2290448907607829 +v 0.5174854883476929 0.7889830317777987 -0.3312318597542557 +v 0.4504468207386603 0.7594638151136077 -0.4693744509658757 +v 0.7938632042573209 0.07009063466413208 -0.6040434718285418 +v 0.7991326580327285 0.1953788397604234 -0.5685192202902353 +v 0.8639538389214531 0.1134090291796173 -0.4906344426489245 +v 0.5991063585226795 0.3702680924431961 -0.709910635852268 +v 0.7107897965621176 0.2829057827006495 -0.6440048006169802 +v 0.6176706970007558 0.2290448907607829 -0.7523439028017583 +v 0.8467155877615388 0.3706024182004535 -0.3817414846013048 +v 0.7889830317777987 0.3312318597542557 -0.5174854883476929 +v 0.7594638151136077 0.4693744509658757 -0.4504468207386603 +v 0.5133754412304479 0.6465777917977316 -0.5642542117657714 +v 0.6465777917977316 0.5642542117657714 -0.5133754412304479 +v 0.5642542117657714 0.5133754412304479 -0.6465777917977316 +v 0.6040434718285418 -0.7938632042573209 0.07009063466413208 +v 0.5685192202902353 -0.7991326580327285 0.1953788397604234 +v 0.4906344426489245 -0.8639538389214531 0.1134090291796173 +v 0.709910635852268 -0.5991063585226795 0.3702680924431961 +v 0.6440048006169802 -0.7107897965621175 0.2829057827006495 +v 0.7523439028017583 -0.6176706970007558 0.2290448907607829 +v 0.3817414846013048 -0.8467155877615388 0.3706024182004535 +v 0.5174854883476929 -0.7889830317777987 0.3312318597542557 +v 0.4504468207386603 -0.7594638151136077 0.4693744509658757 +v 0.7938632042573209 -0.07009063466413208 0.6040434718285418 +v 0.7991326580327285 -0.1953788397604234 0.5685192202902353 +v 0.8639538389214531 -0.1134090291796173 0.4906344426489245 +v 0.5991063585226795 -0.3702680924431961 0.709910635852268 +v 0.7107897965621176 -0.2829057827006495 0.6440048006169802 +v 0.6176706970007558 -0.2290448907607829 0.7523439028017583 +v 0.8467155877615388 -0.3706024182004535 0.3817414846013048 +v 0.7889830317777987 -0.3312318597542557 0.5174854883476929 +v 0.7594638151136077 -0.4693744509658757 0.4504468207386603 +v 0.07009063466413208 -0.6040434718285418 0.7938632042573209 +v 0.1953788397604234 -0.5685192202902353 0.7991326580327285 +v 0.1134090291796173 -0.4906344426489245 0.8639538389214531 +v 0.3702680924431961 -0.709910635852268 0.5991063585226795 +v 0.2829057827006495 -0.6440048006169802 0.7107897965621176 +v 0.2290448907607829 -0.7523439028017583 0.6176706970007558 +v 0.3706024182004535 -0.3817414846013048 0.8467155877615388 +v 0.3312318597542557 -0.5174854883476929 0.7889830317777987 +v 0.4693744509658757 -0.4504468207386603 0.7594638151136077 +v 0.6465777917977316 -0.5642542117657714 0.5133754412304479 +v 0.5642542117657714 -0.5133754412304479 0.6465777917977316 +v 0.5133754412304479 -0.6465777917977316 0.5642542117657714 +v 0.3731403805298119 -0.9198834216871895 0.120750763654461 +v 0.4205438079847925 -0.9072722334369382 0 +v 0.2405361848863923 -0.8891957226704116 0.3891957226704115 +v 0.3127729408627245 -0.915502344047086 0.2530386245385746 +v 0.1526965938405219 -0.9882731152012093 0 +v 0.2345797056470434 -0.9638284211006921 0.1265193122692873 +v 0.0801787282954641 -0.988302081193091 0.1297319075568038 +v -0.07009063466413208 -0.6040434718285418 0.7938632042573209 +v 0 -0.6892699839446963 0.7245045819267661 +v -0.1603574565909282 -0.8396425434090717 0.5189276302272153 +v -0.07819323521568113 -0.7705241128862675 0.6325965613464364 +v -0.2290448907607829 -0.7523439028017583 0.6176706970007558 +v 0.07819323521568113 -0.7705241128862675 0.6325965613464364 +v 0.1603574565909282 -0.8396425434090717 0.5189276302272153 +v -0.4205438079847925 -0.9072722334369382 0 +v -0.3731403805298119 -0.9198834216871895 0.120750763654461 +v -0.4906344426489245 -0.8639538389214531 0.1134090291796173 +v -0.0801787282954641 -0.988302081193091 0.1297319075568038 +v -0.2345797056470434 -0.9638284211006921 0.1265193122692873 +v -0.1526965938405219 -0.9882731152012093 0 +v -0.3817414846013048 -0.8467155877615388 0.3706024182004535 +v -0.3127729408627245 -0.915502344047086 0.2530386245385746 +v -0.2405361848863923 -0.8891957226704116 0.3891957226704115 +v 0.08232358003196016 -0.9129824929322991 0.3996070517018511 +v -0.08232358003196016 -0.9129824929322991 0.3996070517018511 +v 0 -0.9638612634676226 0.2664047011345674 +v 0.3731403805298119 -0.9198834216871895 -0.120750763654461 +v 0.4906344426489245 -0.8639538389214531 -0.1134090291796173 +v 0.0801787282954641 -0.988302081193091 -0.1297319075568038 +v 0.2345797056470434 -0.9638284211006921 -0.1265193122692873 +v 0.3817414846013048 -0.8467155877615388 -0.3706024182004535 +v 0.3127729408627245 -0.915502344047086 -0.2530386245385746 +v 0.2405361848863923 -0.8891957226704116 -0.3891957226704115 +v -0.4906344426489245 -0.8639538389214531 -0.1134090291796173 +v -0.3731403805298119 -0.9198834216871895 -0.120750763654461 +v -0.2405361848863923 -0.8891957226704116 -0.3891957226704115 +v -0.3127729408627245 -0.915502344047086 -0.2530386245385746 +v -0.3817414846013048 -0.8467155877615388 -0.3706024182004535 +v -0.2345797056470434 -0.9638284211006921 -0.1265193122692873 +v -0.0801787282954641 -0.988302081193091 -0.1297319075568038 +v 0.07009063466413208 -0.6040434718285418 -0.7938632042573209 +v 0 -0.6892699839446963 -0.7245045819267661 +v -0.07009063466413208 -0.6040434718285418 -0.7938632042573209 +v 0.1603574565909282 -0.8396425434090717 -0.5189276302272153 +v 0.07819323521568113 -0.7705241128862675 -0.6325965613464364 +v 0.2290448907607829 -0.7523439028017583 -0.6176706970007558 +v -0.2290448907607829 -0.7523439028017583 -0.6176706970007558 +v -0.07819323521568113 -0.7705241128862675 -0.6325965613464364 +v -0.1603574565909282 -0.8396425434090717 -0.5189276302272153 +v 0 -0.9638612634676226 -0.2664047011345674 +v -0.08232358003196016 -0.9129824929322991 -0.3996070517018511 +v 0.08232358003196016 -0.9129824929322991 -0.3996070517018511 +v 0.5685192202902353 -0.7991326580327285 -0.1953788397604234 +v 0.6040434718285418 -0.7938632042573209 -0.07009063466413208 +v 0.4504468207386603 -0.7594638151136077 -0.4693744509658757 +v 0.5174854883476929 -0.7889830317777987 -0.3312318597542557 +v 0.7523439028017583 -0.6176706970007558 -0.2290448907607829 +v 0.6440048006169802 -0.7107897965621175 -0.2829057827006495 +v 0.709910635852268 -0.5991063585226795 -0.3702680924431961 +v 0.1134090291796173 -0.4906344426489245 -0.8639538389214531 +v 0.1953788397604234 -0.5685192202902353 -0.7991326580327285 +v 0.4693744509658757 -0.4504468207386603 -0.7594638151136077 +v 0.3312318597542557 -0.5174854883476929 -0.7889830317777987 +v 0.3706024182004535 -0.3817414846013048 -0.8467155877615388 +v 0.2829057827006495 -0.6440048006169802 -0.7107897965621176 +v 0.3702680924431961 -0.709910635852268 -0.5991063585226795 +v 0.8639538389214531 -0.1134090291796173 -0.4906344426489245 +v 0.7991326580327285 -0.1953788397604234 -0.5685192202902353 +v 0.7938632042573209 -0.07009063466413208 -0.6040434718285418 +v 0.7594638151136077 -0.4693744509658757 -0.4504468207386603 +v 0.7889830317777987 -0.3312318597542557 -0.5174854883476929 +v 0.8467155877615388 -0.3706024182004535 -0.3817414846013048 +v 0.6176706970007558 -0.2290448907607829 -0.7523439028017583 +v 0.7107897965621176 -0.2829057827006495 -0.6440048006169802 +v 0.5991063585226795 -0.3702680924431961 -0.709910635852268 +v 0.5133754412304479 -0.6465777917977316 -0.5642542117657714 +v 0.5642542117657714 -0.5133754412304479 -0.6465777917977316 +v 0.6465777917977316 -0.5642542117657714 -0.5133754412304479 +v 0.6892699839446963 -0.7245045819267661 0 +v 0.8396425434090717 -0.5189276302272153 -0.1603574565909282 +v 0.7705241128862675 -0.6325965613464364 -0.07819323521568113 +v 0.7705241128862675 -0.6325965613464364 0.07819323521568113 +v 0.8396425434090717 -0.5189276302272153 0.1603574565909282 +v 0.9072722334369382 0 -0.4205438079847925 +v 0.9198834216871895 -0.120750763654461 -0.3731403805298119 +v 0.988302081193091 -0.1297319075568038 -0.0801787282954641 +v 0.9638284211006921 -0.1265193122692873 -0.2345797056470434 +v 0.9882731152012093 0 -0.1526965938405219 +v 0.915502344047086 -0.2530386245385746 -0.3127729408627245 +v 0.8891957226704116 -0.3891957226704115 -0.2405361848863923 +v 0.9198834216871895 -0.120750763654461 0.3731403805298119 +v 0.9072722334369382 0 0.4205438079847925 +v 0.8891957226704116 -0.3891957226704115 0.2405361848863923 +v 0.915502344047086 -0.2530386245385746 0.3127729408627245 +v 0.9882731152012093 0 0.1526965938405219 +v 0.9638284211006921 -0.1265193122692873 0.2345797056470434 +v 0.988302081193091 -0.1297319075568038 0.0801787282954641 +v 0.9129824929322991 -0.3996070517018511 -0.08232358003196016 +v 0.9638612634676226 -0.2664047011345674 0 +v 0.9129824929322991 -0.3996070517018511 0.08232358003196016 +v 0.120750763654461 0.3731403805298119 0.9198834216871895 +v 0.1297319075568038 0.0801787282954641 0.988302081193091 +v 0.1265193122692873 0.2345797056470434 0.9638284211006921 +v 0.2530386245385746 0.3127729408627245 0.915502344047086 +v 0.3891957226704115 0.2405361848863923 0.8891957226704116 +v 0.120750763654461 -0.3731403805298119 0.9198834216871895 +v 0.3891957226704115 -0.2405361848863923 0.8891957226704116 +v 0.2530386245385746 -0.3127729408627245 0.915502344047086 +v 0.1265193122692873 -0.2345797056470434 0.9638284211006921 +v 0.1297319075568038 -0.0801787282954641 0.988302081193091 +v 0.7245045819267661 0 0.6892699839446963 +v 0.5189276302272153 0.1603574565909282 0.8396425434090717 +v 0.6325965613464364 0.07819323521568113 0.7705241128862675 +v 0.6325965613464364 -0.07819323521568113 0.7705241128862675 +v 0.5189276302272153 -0.1603574565909282 0.8396425434090717 +v 0.2664047011345674 0 0.9638612634676226 +v 0.3996070517018511 -0.08232358003196016 0.9129824929322991 +v 0.3996070517018511 0.08232358003196016 0.9129824929322991 +v -0.5685192202902353 -0.7991326580327285 0.1953788397604234 +v -0.4504468207386603 -0.7594638151136077 0.4693744509658757 +v -0.5174854883476929 -0.7889830317777987 0.3312318597542557 +v -0.6440048006169802 -0.7107897965621175 0.2829057827006495 +v -0.709910635852268 -0.5991063585226795 0.3702680924431961 +v -0.1953788397604234 -0.5685192202902353 0.7991326580327285 +v -0.4693744509658757 -0.4504468207386603 0.7594638151136077 +v -0.3312318597542557 -0.5174854883476929 0.7889830317777987 +v -0.2829057827006495 -0.6440048006169802 0.7107897965621176 +v -0.3702680924431961 -0.709910635852268 0.5991063585226795 +v -0.7991326580327285 -0.1953788397604234 0.5685192202902353 +v -0.7594638151136077 -0.4693744509658757 0.4504468207386603 +v -0.7889830317777987 -0.3312318597542557 0.5174854883476929 +v -0.7107897965621176 -0.2829057827006495 0.6440048006169802 +v -0.5991063585226795 -0.3702680924431961 0.709910635852268 +v -0.5133754412304479 -0.6465777917977316 0.5642542117657714 +v -0.5642542117657714 -0.5133754412304479 0.6465777917977316 +v -0.6465777917977316 -0.5642542117657714 0.5133754412304479 +v -0.1953788397604234 -0.5685192202902353 -0.7991326580327285 +v -0.3702680924431961 -0.709910635852268 -0.5991063585226795 +v -0.2829057827006495 -0.6440048006169802 -0.7107897965621176 +v -0.3312318597542557 -0.5174854883476929 -0.7889830317777987 +v -0.4693744509658757 -0.4504468207386603 -0.7594638151136077 +v -0.5685192202902353 -0.7991326580327285 -0.1953788397604234 +v -0.709910635852268 -0.5991063585226795 -0.3702680924431961 +v -0.6440048006169802 -0.7107897965621175 -0.2829057827006495 +v -0.5174854883476929 -0.7889830317777987 -0.3312318597542557 +v -0.4504468207386603 -0.7594638151136077 -0.4693744509658757 +v -0.7991326580327285 -0.1953788397604234 -0.5685192202902353 +v -0.5991063585226795 -0.3702680924431961 -0.709910635852268 +v -0.7107897965621176 -0.2829057827006495 -0.6440048006169802 +v -0.7889830317777987 -0.3312318597542557 -0.5174854883476929 +v -0.7594638151136077 -0.4693744509658757 -0.4504468207386603 +v -0.5133754412304479 -0.6465777917977316 -0.5642542117657714 +v -0.6465777917977316 -0.5642542117657714 -0.5133754412304479 +v -0.5642542117657714 -0.5133754412304479 -0.6465777917977316 +v 0.7245045819267661 0 -0.6892699839446963 +v 0.5189276302272153 -0.1603574565909282 -0.8396425434090717 +v 0.6325965613464364 -0.07819323521568113 -0.7705241128862675 +v 0.6325965613464364 0.07819323521568113 -0.7705241128862675 +v 0.5189276302272153 0.1603574565909282 -0.8396425434090717 +v 0.120750763654461 -0.3731403805298119 -0.9198834216871895 +v 0.1297319075568038 -0.0801787282954641 -0.988302081193091 +v 0.1265193122692873 -0.2345797056470434 -0.9638284211006921 +v 0.2530386245385746 -0.3127729408627245 -0.915502344047086 +v 0.3891957226704115 -0.2405361848863923 -0.8891957226704116 +v 0.120750763654461 0.3731403805298119 -0.9198834216871895 +v 0.3891957226704115 0.2405361848863923 -0.8891957226704116 +v 0.2530386245385746 0.3127729408627245 -0.915502344047086 +v 0.1265193122692873 0.2345797056470434 -0.9638284211006921 +v 0.1297319075568038 0.0801787282954641 -0.988302081193091 +v 0.3996070517018511 -0.08232358003196016 -0.9129824929322991 +v 0.2664047011345674 0 -0.9638612634676226 +v 0.3996070517018511 0.08232358003196016 -0.9129824929322991 +v 0.9198834216871895 0.120750763654461 0.3731403805298119 +v 0.988302081193091 0.1297319075568038 0.0801787282954641 +v 0.9638284211006921 0.1265193122692873 0.2345797056470434 +v 0.915502344047086 0.2530386245385746 0.3127729408627245 +v 0.8891957226704116 0.3891957226704115 0.2405361848863923 +v 0.9198834216871895 0.120750763654461 -0.3731403805298119 +v 0.8891957226704116 0.3891957226704115 -0.2405361848863923 +v 0.915502344047086 0.2530386245385746 -0.3127729408627245 +v 0.9638284211006921 0.1265193122692873 -0.2345797056470434 +v 0.988302081193091 0.1297319075568038 -0.0801787282954641 +v 0.6892699839446963 0.7245045819267661 0 +v 0.8396425434090717 0.5189276302272153 0.1603574565909282 +v 0.7705241128862675 0.6325965613464364 0.07819323521568113 +v 0.7705241128862675 0.6325965613464364 -0.07819323521568113 +v 0.8396425434090717 0.5189276302272153 -0.1603574565909282 +v 0.9638612634676226 0.2664047011345674 0 +v 0.9129824929322991 0.3996070517018511 -0.08232358003196016 +v 0.9129824929322991 0.3996070517018511 0.08232358003196016 +f 1 163 165 +f 43 164 163 +f 45 165 164 +f 163 164 165 +f 13 166 168 +f 44 167 166 +f 43 168 167 +f 166 167 168 +f 15 169 171 +f 45 170 169 +f 44 171 170 +f 169 170 171 +f 43 167 164 +f 44 170 167 +f 45 164 170 +f 167 170 164 +f 12 172 174 +f 46 173 172 +f 48 174 173 +f 172 173 174 +f 14 175 177 +f 47 176 175 +f 46 177 176 +f 175 176 177 +f 13 178 180 +f 48 179 178 +f 47 180 179 +f 178 179 180 +f 46 176 173 +f 47 179 176 +f 48 173 179 +f 176 179 173 +f 6 181 183 +f 49 182 181 +f 51 183 182 +f 181 182 183 +f 15 184 186 +f 50 185 184 +f 49 186 185 +f 184 185 186 +f 14 187 189 +f 51 188 187 +f 50 189 188 +f 187 188 189 +f 49 185 182 +f 50 188 185 +f 51 182 188 +f 185 188 182 +f 13 180 166 +f 47 190 180 +f 44 166 190 +f 180 190 166 +f 14 189 175 +f 50 191 189 +f 47 175 191 +f 189 191 175 +f 15 171 184 +f 44 192 171 +f 50 184 192 +f 171 192 184 +f 47 191 190 +f 50 192 191 +f 44 190 192 +f 191 192 190 +f 1 165 194 +f 45 193 165 +f 53 194 193 +f 165 193 194 +f 15 195 169 +f 52 196 195 +f 45 169 196 +f 195 196 169 +f 17 197 199 +f 53 198 197 +f 52 199 198 +f 197 198 199 +f 45 196 193 +f 52 198 196 +f 53 193 198 +f 196 198 193 +f 6 200 181 +f 54 201 200 +f 49 181 201 +f 200 201 181 +f 16 202 204 +f 55 203 202 +f 54 204 203 +f 202 203 204 +f 15 186 206 +f 49 205 186 +f 55 206 205 +f 186 205 206 +f 54 203 201 +f 55 205 203 +f 49 201 205 +f 203 205 201 +f 2 207 209 +f 56 208 207 +f 58 209 208 +f 207 208 209 +f 17 210 212 +f 57 211 210 +f 56 212 211 +f 210 211 212 +f 16 213 215 +f 58 214 213 +f 57 215 214 +f 213 214 215 +f 56 211 208 +f 57 214 211 +f 58 208 214 +f 211 214 208 +f 15 206 195 +f 55 216 206 +f 52 195 216 +f 206 216 195 +f 16 215 202 +f 57 217 215 +f 55 202 217 +f 215 217 202 +f 17 199 210 +f 52 218 199 +f 57 210 218 +f 199 218 210 +f 55 217 216 +f 57 218 217 +f 52 216 218 +f 217 218 216 +f 1 194 220 +f 53 219 194 +f 60 220 219 +f 194 219 220 +f 17 221 197 +f 59 222 221 +f 53 197 222 +f 221 222 197 +f 19 223 225 +f 60 224 223 +f 59 225 224 +f 223 224 225 +f 53 222 219 +f 59 224 222 +f 60 219 224 +f 222 224 219 +f 2 226 207 +f 61 227 226 +f 56 207 227 +f 226 227 207 +f 18 228 230 +f 62 229 228 +f 61 230 229 +f 228 229 230 +f 17 212 232 +f 56 231 212 +f 62 232 231 +f 212 231 232 +f 61 229 227 +f 62 231 229 +f 56 227 231 +f 229 231 227 +f 8 233 235 +f 63 234 233 +f 65 235 234 +f 233 234 235 +f 19 236 238 +f 64 237 236 +f 63 238 237 +f 236 237 238 +f 18 239 241 +f 65 240 239 +f 64 241 240 +f 239 240 241 +f 63 237 234 +f 64 240 237 +f 65 234 240 +f 237 240 234 +f 17 232 221 +f 62 242 232 +f 59 221 242 +f 232 242 221 +f 18 241 228 +f 64 243 241 +f 62 228 243 +f 241 243 228 +f 19 225 236 +f 59 244 225 +f 64 236 244 +f 225 244 236 +f 62 243 242 +f 64 244 243 +f 59 242 244 +f 243 244 242 +f 1 220 246 +f 60 245 220 +f 67 246 245 +f 220 245 246 +f 19 247 223 +f 66 248 247 +f 60 223 248 +f 247 248 223 +f 21 249 251 +f 67 250 249 +f 66 251 250 +f 249 250 251 +f 60 248 245 +f 66 250 248 +f 67 245 250 +f 248 250 245 +f 8 252 233 +f 68 253 252 +f 63 233 253 +f 252 253 233 +f 20 254 256 +f 69 255 254 +f 68 256 255 +f 254 255 256 +f 19 238 258 +f 63 257 238 +f 69 258 257 +f 238 257 258 +f 68 255 253 +f 69 257 255 +f 63 253 257 +f 255 257 253 +f 11 259 261 +f 70 260 259 +f 72 261 260 +f 259 260 261 +f 21 262 264 +f 71 263 262 +f 70 264 263 +f 262 263 264 +f 20 265 267 +f 72 266 265 +f 71 267 266 +f 265 266 267 +f 70 263 260 +f 71 266 263 +f 72 260 266 +f 263 266 260 +f 19 258 247 +f 69 268 258 +f 66 247 268 +f 258 268 247 +f 20 267 254 +f 71 269 267 +f 69 254 269 +f 267 269 254 +f 21 251 262 +f 66 270 251 +f 71 262 270 +f 251 270 262 +f 69 269 268 +f 71 270 269 +f 66 268 270 +f 269 270 268 +f 1 246 163 +f 67 271 246 +f 43 163 271 +f 246 271 163 +f 21 272 249 +f 73 273 272 +f 67 249 273 +f 272 273 249 +f 13 168 275 +f 43 274 168 +f 73 275 274 +f 168 274 275 +f 67 273 271 +f 73 274 273 +f 43 271 274 +f 273 274 271 +f 11 276 259 +f 74 277 276 +f 70 259 277 +f 276 277 259 +f 22 278 280 +f 75 279 278 +f 74 280 279 +f 278 279 280 +f 21 264 282 +f 70 281 264 +f 75 282 281 +f 264 281 282 +f 74 279 277 +f 75 281 279 +f 70 277 281 +f 279 281 277 +f 12 174 284 +f 48 283 174 +f 77 284 283 +f 174 283 284 +f 13 285 178 +f 76 286 285 +f 48 178 286 +f 285 286 178 +f 22 287 289 +f 77 288 287 +f 76 289 288 +f 287 288 289 +f 48 286 283 +f 76 288 286 +f 77 283 288 +f 286 288 283 +f 21 282 272 +f 75 290 282 +f 73 272 290 +f 282 290 272 +f 22 289 278 +f 76 291 289 +f 75 278 291 +f 289 291 278 +f 13 275 285 +f 73 292 275 +f 76 285 292 +f 275 292 285 +f 75 291 290 +f 76 292 291 +f 73 290 292 +f 291 292 290 +f 2 209 294 +f 58 293 209 +f 79 294 293 +f 209 293 294 +f 16 295 213 +f 78 296 295 +f 58 213 296 +f 295 296 213 +f 24 297 299 +f 79 298 297 +f 78 299 298 +f 297 298 299 +f 58 296 293 +f 78 298 296 +f 79 293 298 +f 296 298 293 +f 6 300 200 +f 80 301 300 +f 54 200 301 +f 300 301 200 +f 23 302 304 +f 81 303 302 +f 80 304 303 +f 302 303 304 +f 16 204 306 +f 54 305 204 +f 81 306 305 +f 204 305 306 +f 80 303 301 +f 81 305 303 +f 54 301 305 +f 303 305 301 +f 10 307 309 +f 82 308 307 +f 84 309 308 +f 307 308 309 +f 24 310 312 +f 83 311 310 +f 82 312 311 +f 310 311 312 +f 23 313 315 +f 84 314 313 +f 83 315 314 +f 313 314 315 +f 82 311 308 +f 83 314 311 +f 84 308 314 +f 311 314 308 +f 16 306 295 +f 81 316 306 +f 78 295 316 +f 306 316 295 +f 23 315 302 +f 83 317 315 +f 81 302 317 +f 315 317 302 +f 24 299 310 +f 78 318 299 +f 83 310 318 +f 299 318 310 +f 81 317 316 +f 83 318 317 +f 78 316 318 +f 317 318 316 +f 6 183 320 +f 51 319 183 +f 86 320 319 +f 183 319 320 +f 14 321 187 +f 85 322 321 +f 51 187 322 +f 321 322 187 +f 26 323 325 +f 86 324 323 +f 85 325 324 +f 323 324 325 +f 51 322 319 +f 85 324 322 +f 86 319 324 +f 322 324 319 +f 12 326 172 +f 87 327 326 +f 46 172 327 +f 326 327 172 +f 25 328 330 +f 88 329 328 +f 87 330 329 +f 328 329 330 +f 14 177 332 +f 46 331 177 +f 88 332 331 +f 177 331 332 +f 87 329 327 +f 88 331 329 +f 46 327 331 +f 329 331 327 +f 5 333 335 +f 89 334 333 +f 91 335 334 +f 333 334 335 +f 26 336 338 +f 90 337 336 +f 89 338 337 +f 336 337 338 +f 25 339 341 +f 91 340 339 +f 90 341 340 +f 339 340 341 +f 89 337 334 +f 90 340 337 +f 91 334 340 +f 337 340 334 +f 14 332 321 +f 88 342 332 +f 85 321 342 +f 332 342 321 +f 25 341 328 +f 90 343 341 +f 88 328 343 +f 341 343 328 +f 26 325 336 +f 85 344 325 +f 90 336 344 +f 325 344 336 +f 88 343 342 +f 90 344 343 +f 85 342 344 +f 343 344 342 +f 12 284 346 +f 77 345 284 +f 93 346 345 +f 284 345 346 +f 22 347 287 +f 92 348 347 +f 77 287 348 +f 347 348 287 +f 28 349 351 +f 93 350 349 +f 92 351 350 +f 349 350 351 +f 77 348 345 +f 92 350 348 +f 93 345 350 +f 348 350 345 +f 11 352 276 +f 94 353 352 +f 74 276 353 +f 352 353 276 +f 27 354 356 +f 95 355 354 +f 94 356 355 +f 354 355 356 +f 22 280 358 +f 74 357 280 +f 95 358 357 +f 280 357 358 +f 94 355 353 +f 95 357 355 +f 74 353 357 +f 355 357 353 +f 3 359 361 +f 96 360 359 +f 98 361 360 +f 359 360 361 +f 28 362 364 +f 97 363 362 +f 96 364 363 +f 362 363 364 +f 27 365 367 +f 98 366 365 +f 97 367 366 +f 365 366 367 +f 96 363 360 +f 97 366 363 +f 98 360 366 +f 363 366 360 +f 22 358 347 +f 95 368 358 +f 92 347 368 +f 358 368 347 +f 27 367 354 +f 97 369 367 +f 95 354 369 +f 367 369 354 +f 28 351 362 +f 92 370 351 +f 97 362 370 +f 351 370 362 +f 95 369 368 +f 97 370 369 +f 92 368 370 +f 369 370 368 +f 11 261 372 +f 72 371 261 +f 100 372 371 +f 261 371 372 +f 20 373 265 +f 99 374 373 +f 72 265 374 +f 373 374 265 +f 30 375 377 +f 100 376 375 +f 99 377 376 +f 375 376 377 +f 72 374 371 +f 99 376 374 +f 100 371 376 +f 374 376 371 +f 8 378 252 +f 101 379 378 +f 68 252 379 +f 378 379 252 +f 29 380 382 +f 102 381 380 +f 101 382 381 +f 380 381 382 +f 20 256 384 +f 68 383 256 +f 102 384 383 +f 256 383 384 +f 101 381 379 +f 102 383 381 +f 68 379 383 +f 381 383 379 +f 7 385 387 +f 103 386 385 +f 105 387 386 +f 385 386 387 +f 30 388 390 +f 104 389 388 +f 103 390 389 +f 388 389 390 +f 29 391 393 +f 105 392 391 +f 104 393 392 +f 391 392 393 +f 103 389 386 +f 104 392 389 +f 105 386 392 +f 389 392 386 +f 20 384 373 +f 102 394 384 +f 99 373 394 +f 384 394 373 +f 29 393 380 +f 104 395 393 +f 102 380 395 +f 393 395 380 +f 30 377 388 +f 99 396 377 +f 104 388 396 +f 377 396 388 +f 102 395 394 +f 104 396 395 +f 99 394 396 +f 395 396 394 +f 8 235 398 +f 65 397 235 +f 107 398 397 +f 235 397 398 +f 18 399 239 +f 106 400 399 +f 65 239 400 +f 399 400 239 +f 32 401 403 +f 107 402 401 +f 106 403 402 +f 401 402 403 +f 65 400 397 +f 106 402 400 +f 107 397 402 +f 400 402 397 +f 2 404 226 +f 108 405 404 +f 61 226 405 +f 404 405 226 +f 31 406 408 +f 109 407 406 +f 108 408 407 +f 406 407 408 +f 18 230 410 +f 61 409 230 +f 109 410 409 +f 230 409 410 +f 108 407 405 +f 109 409 407 +f 61 405 409 +f 407 409 405 +f 9 411 413 +f 110 412 411 +f 112 413 412 +f 411 412 413 +f 32 414 416 +f 111 415 414 +f 110 416 415 +f 414 415 416 +f 31 417 419 +f 112 418 417 +f 111 419 418 +f 417 418 419 +f 110 415 412 +f 111 418 415 +f 112 412 418 +f 415 418 412 +f 18 410 399 +f 109 420 410 +f 106 399 420 +f 410 420 399 +f 31 419 406 +f 111 421 419 +f 109 406 421 +f 419 421 406 +f 32 403 414 +f 106 422 403 +f 111 414 422 +f 403 422 414 +f 109 421 420 +f 111 422 421 +f 106 420 422 +f 421 422 420 +f 4 423 425 +f 113 424 423 +f 115 425 424 +f 423 424 425 +f 33 426 428 +f 114 427 426 +f 113 428 427 +f 426 427 428 +f 35 429 431 +f 115 430 429 +f 114 431 430 +f 429 430 431 +f 113 427 424 +f 114 430 427 +f 115 424 430 +f 427 430 424 +f 10 432 434 +f 116 433 432 +f 118 434 433 +f 432 433 434 +f 34 435 437 +f 117 436 435 +f 116 437 436 +f 435 436 437 +f 33 438 440 +f 118 439 438 +f 117 440 439 +f 438 439 440 +f 116 436 433 +f 117 439 436 +f 118 433 439 +f 436 439 433 +f 5 441 443 +f 119 442 441 +f 121 443 442 +f 441 442 443 +f 35 444 446 +f 120 445 444 +f 119 446 445 +f 444 445 446 +f 34 447 449 +f 121 448 447 +f 120 449 448 +f 447 448 449 +f 119 445 442 +f 120 448 445 +f 121 442 448 +f 445 448 442 +f 33 440 426 +f 117 450 440 +f 114 426 450 +f 440 450 426 +f 34 449 435 +f 120 451 449 +f 117 435 451 +f 449 451 435 +f 35 431 444 +f 114 452 431 +f 120 444 452 +f 431 452 444 +f 117 451 450 +f 120 452 451 +f 114 450 452 +f 451 452 450 +f 4 425 454 +f 115 453 425 +f 123 454 453 +f 425 453 454 +f 35 455 429 +f 122 456 455 +f 115 429 456 +f 455 456 429 +f 37 457 459 +f 123 458 457 +f 122 459 458 +f 457 458 459 +f 115 456 453 +f 122 458 456 +f 123 453 458 +f 456 458 453 +f 5 460 441 +f 124 461 460 +f 119 441 461 +f 460 461 441 +f 36 462 464 +f 125 463 462 +f 124 464 463 +f 462 463 464 +f 35 446 466 +f 119 465 446 +f 125 466 465 +f 446 465 466 +f 124 463 461 +f 125 465 463 +f 119 461 465 +f 463 465 461 +f 3 467 469 +f 126 468 467 +f 128 469 468 +f 467 468 469 +f 37 470 472 +f 127 471 470 +f 126 472 471 +f 470 471 472 +f 36 473 475 +f 128 474 473 +f 127 475 474 +f 473 474 475 +f 126 471 468 +f 127 474 471 +f 128 468 474 +f 471 474 468 +f 35 466 455 +f 125 476 466 +f 122 455 476 +f 466 476 455 +f 36 475 462 +f 127 477 475 +f 125 462 477 +f 475 477 462 +f 37 459 470 +f 122 478 459 +f 127 470 478 +f 459 478 470 +f 125 477 476 +f 127 478 477 +f 122 476 478 +f 477 478 476 +f 4 454 480 +f 123 479 454 +f 130 480 479 +f 454 479 480 +f 37 481 457 +f 129 482 481 +f 123 457 482 +f 481 482 457 +f 39 483 485 +f 130 484 483 +f 129 485 484 +f 483 484 485 +f 123 482 479 +f 129 484 482 +f 130 479 484 +f 482 484 479 +f 3 486 467 +f 131 487 486 +f 126 467 487 +f 486 487 467 +f 38 488 490 +f 132 489 488 +f 131 490 489 +f 488 489 490 +f 37 472 492 +f 126 491 472 +f 132 492 491 +f 472 491 492 +f 131 489 487 +f 132 491 489 +f 126 487 491 +f 489 491 487 +f 7 493 495 +f 133 494 493 +f 135 495 494 +f 493 494 495 +f 39 496 498 +f 134 497 496 +f 133 498 497 +f 496 497 498 +f 38 499 501 +f 135 500 499 +f 134 501 500 +f 499 500 501 +f 133 497 494 +f 134 500 497 +f 135 494 500 +f 497 500 494 +f 37 492 481 +f 132 502 492 +f 129 481 502 +f 492 502 481 +f 38 501 488 +f 134 503 501 +f 132 488 503 +f 501 503 488 +f 39 485 496 +f 129 504 485 +f 134 496 504 +f 485 504 496 +f 132 503 502 +f 134 504 503 +f 129 502 504 +f 503 504 502 +f 4 480 506 +f 130 505 480 +f 137 506 505 +f 480 505 506 +f 39 507 483 +f 136 508 507 +f 130 483 508 +f 507 508 483 +f 41 509 511 +f 137 510 509 +f 136 511 510 +f 509 510 511 +f 130 508 505 +f 136 510 508 +f 137 505 510 +f 508 510 505 +f 7 512 493 +f 138 513 512 +f 133 493 513 +f 512 513 493 +f 40 514 516 +f 139 515 514 +f 138 516 515 +f 514 515 516 +f 39 498 518 +f 133 517 498 +f 139 518 517 +f 498 517 518 +f 138 515 513 +f 139 517 515 +f 133 513 517 +f 515 517 513 +f 9 519 521 +f 140 520 519 +f 142 521 520 +f 519 520 521 +f 41 522 524 +f 141 523 522 +f 140 524 523 +f 522 523 524 +f 40 525 527 +f 142 526 525 +f 141 527 526 +f 525 526 527 +f 140 523 520 +f 141 526 523 +f 142 520 526 +f 523 526 520 +f 39 518 507 +f 139 528 518 +f 136 507 528 +f 518 528 507 +f 40 527 514 +f 141 529 527 +f 139 514 529 +f 527 529 514 +f 41 511 522 +f 136 530 511 +f 141 522 530 +f 511 530 522 +f 139 529 528 +f 141 530 529 +f 136 528 530 +f 529 530 528 +f 4 506 423 +f 137 531 506 +f 113 423 531 +f 506 531 423 +f 41 532 509 +f 143 533 532 +f 137 509 533 +f 532 533 509 +f 33 428 535 +f 113 534 428 +f 143 535 534 +f 428 534 535 +f 137 533 531 +f 143 534 533 +f 113 531 534 +f 533 534 531 +f 9 536 519 +f 144 537 536 +f 140 519 537 +f 536 537 519 +f 42 538 540 +f 145 539 538 +f 144 540 539 +f 538 539 540 +f 41 524 542 +f 140 541 524 +f 145 542 541 +f 524 541 542 +f 144 539 537 +f 145 541 539 +f 140 537 541 +f 539 541 537 +f 10 434 544 +f 118 543 434 +f 147 544 543 +f 434 543 544 +f 33 545 438 +f 146 546 545 +f 118 438 546 +f 545 546 438 +f 42 547 549 +f 147 548 547 +f 146 549 548 +f 547 548 549 +f 118 546 543 +f 146 548 546 +f 147 543 548 +f 546 548 543 +f 41 542 532 +f 145 550 542 +f 143 532 550 +f 542 550 532 +f 42 549 538 +f 146 551 549 +f 145 538 551 +f 549 551 538 +f 33 535 545 +f 143 552 535 +f 146 545 552 +f 535 552 545 +f 145 551 550 +f 146 552 551 +f 143 550 552 +f 551 552 550 +f 6 320 300 +f 86 553 320 +f 80 300 553 +f 320 553 300 +f 26 554 323 +f 148 555 554 +f 86 323 555 +f 554 555 323 +f 23 304 557 +f 80 556 304 +f 148 557 556 +f 304 556 557 +f 86 555 553 +f 148 556 555 +f 80 553 556 +f 555 556 553 +f 5 443 333 +f 121 558 443 +f 89 333 558 +f 443 558 333 +f 34 559 447 +f 149 560 559 +f 121 447 560 +f 559 560 447 +f 26 338 562 +f 89 561 338 +f 149 562 561 +f 338 561 562 +f 121 560 558 +f 149 561 560 +f 89 558 561 +f 560 561 558 +f 10 309 432 +f 84 563 309 +f 116 432 563 +f 309 563 432 +f 23 564 313 +f 150 565 564 +f 84 313 565 +f 564 565 313 +f 34 437 567 +f 116 566 437 +f 150 567 566 +f 437 566 567 +f 84 565 563 +f 150 566 565 +f 116 563 566 +f 565 566 563 +f 26 562 554 +f 149 568 562 +f 148 554 568 +f 562 568 554 +f 34 567 559 +f 150 569 567 +f 149 559 569 +f 567 569 559 +f 23 557 564 +f 148 570 557 +f 150 564 570 +f 557 570 564 +f 149 569 568 +f 150 570 569 +f 148 568 570 +f 569 570 568 +f 3 469 359 +f 128 571 469 +f 96 359 571 +f 469 571 359 +f 36 572 473 +f 151 573 572 +f 128 473 573 +f 572 573 473 +f 28 364 575 +f 96 574 364 +f 151 575 574 +f 364 574 575 +f 128 573 571 +f 151 574 573 +f 96 571 574 +f 573 574 571 +f 5 335 460 +f 91 576 335 +f 124 460 576 +f 335 576 460 +f 25 577 339 +f 152 578 577 +f 91 339 578 +f 577 578 339 +f 36 464 580 +f 124 579 464 +f 152 580 579 +f 464 579 580 +f 91 578 576 +f 152 579 578 +f 124 576 579 +f 578 579 576 +f 12 346 326 +f 93 581 346 +f 87 326 581 +f 346 581 326 +f 28 582 349 +f 153 583 582 +f 93 349 583 +f 582 583 349 +f 25 330 585 +f 87 584 330 +f 153 585 584 +f 330 584 585 +f 93 583 581 +f 153 584 583 +f 87 581 584 +f 583 584 581 +f 36 580 572 +f 152 586 580 +f 151 572 586 +f 580 586 572 +f 25 585 577 +f 153 587 585 +f 152 577 587 +f 585 587 577 +f 28 575 582 +f 151 588 575 +f 153 582 588 +f 575 588 582 +f 152 587 586 +f 153 588 587 +f 151 586 588 +f 587 588 586 +f 7 495 385 +f 135 589 495 +f 103 385 589 +f 495 589 385 +f 38 590 499 +f 154 591 590 +f 135 499 591 +f 590 591 499 +f 30 390 593 +f 103 592 390 +f 154 593 592 +f 390 592 593 +f 135 591 589 +f 154 592 591 +f 103 589 592 +f 591 592 589 +f 3 361 486 +f 98 594 361 +f 131 486 594 +f 361 594 486 +f 27 595 365 +f 155 596 595 +f 98 365 596 +f 595 596 365 +f 38 490 598 +f 131 597 490 +f 155 598 597 +f 490 597 598 +f 98 596 594 +f 155 597 596 +f 131 594 597 +f 596 597 594 +f 11 372 352 +f 100 599 372 +f 94 352 599 +f 372 599 352 +f 30 600 375 +f 156 601 600 +f 100 375 601 +f 600 601 375 +f 27 356 603 +f 94 602 356 +f 156 603 602 +f 356 602 603 +f 100 601 599 +f 156 602 601 +f 94 599 602 +f 601 602 599 +f 38 598 590 +f 155 604 598 +f 154 590 604 +f 598 604 590 +f 27 603 595 +f 156 605 603 +f 155 595 605 +f 603 605 595 +f 30 593 600 +f 154 606 593 +f 156 600 606 +f 593 606 600 +f 155 605 604 +f 156 606 605 +f 154 604 606 +f 605 606 604 +f 9 521 411 +f 142 607 521 +f 110 411 607 +f 521 607 411 +f 40 608 525 +f 157 609 608 +f 142 525 609 +f 608 609 525 +f 32 416 611 +f 110 610 416 +f 157 611 610 +f 416 610 611 +f 142 609 607 +f 157 610 609 +f 110 607 610 +f 609 610 607 +f 7 387 512 +f 105 612 387 +f 138 512 612 +f 387 612 512 +f 29 613 391 +f 158 614 613 +f 105 391 614 +f 613 614 391 +f 40 516 616 +f 138 615 516 +f 158 616 615 +f 516 615 616 +f 105 614 612 +f 158 615 614 +f 138 612 615 +f 614 615 612 +f 8 398 378 +f 107 617 398 +f 101 378 617 +f 398 617 378 +f 32 618 401 +f 159 619 618 +f 107 401 619 +f 618 619 401 +f 29 382 621 +f 101 620 382 +f 159 621 620 +f 382 620 621 +f 107 619 617 +f 159 620 619 +f 101 617 620 +f 619 620 617 +f 40 616 608 +f 158 622 616 +f 157 608 622 +f 616 622 608 +f 29 621 613 +f 159 623 621 +f 158 613 623 +f 621 623 613 +f 32 611 618 +f 157 624 611 +f 159 618 624 +f 611 624 618 +f 158 623 622 +f 159 624 623 +f 157 622 624 +f 623 624 622 +f 10 544 307 +f 147 625 544 +f 82 307 625 +f 544 625 307 +f 42 626 547 +f 160 627 626 +f 147 547 627 +f 626 627 547 +f 24 312 629 +f 82 628 312 +f 160 629 628 +f 312 628 629 +f 147 627 625 +f 160 628 627 +f 82 625 628 +f 627 628 625 +f 9 413 536 +f 112 630 413 +f 144 536 630 +f 413 630 536 +f 31 631 417 +f 161 632 631 +f 112 417 632 +f 631 632 417 +f 42 540 634 +f 144 633 540 +f 161 634 633 +f 540 633 634 +f 112 632 630 +f 161 633 632 +f 144 630 633 +f 632 633 630 +f 2 294 404 +f 79 635 294 +f 108 404 635 +f 294 635 404 +f 24 636 297 +f 162 637 636 +f 79 297 637 +f 636 637 297 +f 31 408 639 +f 108 638 408 +f 162 639 638 +f 408 638 639 +f 79 637 635 +f 162 638 637 +f 108 635 638 +f 637 638 635 +f 42 634 626 +f 161 640 634 +f 160 626 640 +f 634 640 626 +f 31 639 631 +f 162 641 639 +f 161 631 641 +f 639 641 631 +f 24 629 636 +f 160 642 629 +f 162 636 642 +f 629 642 636 +f 161 641 640 +f 162 642 641 +f 160 640 642 +f 641 642 640 diff --git a/include/igl/CMakeLists.txt b/include/igl/CMakeLists.txt index fe39ce7..701f573 100644 --- a/include/igl/CMakeLists.txt +++ b/include/igl/CMakeLists.txt @@ -3,4 +3,4 @@ file(GLOB TEST_INC_FILES *.h *.inl) add_executable(igl_tests ${TEST_SRC_FILES} ${TEST_INC_FILES}) target_link_libraries(igl_tests ${COMMON_LIBRARIES}) -add_custom_command(TARGET igl_tests POST_BUILD COMMAND igl_tests) +add_custom_target(run_igl_tests ALL igl_tests DEPENDS igl_tests) diff --git a/include/igl/copyleft/boolean/mesh_boolean.cpp b/include/igl/copyleft/boolean/mesh_boolean.cpp deleted file mode 100644 index 4dc2f84..0000000 --- a/include/igl/copyleft/boolean/mesh_boolean.cpp +++ /dev/null @@ -1,103 +0,0 @@ -#include - -#include - -#include -#include -#include -#include -#include -#include - -namespace mesh_boolean_test { - - template - void assert_no_exterior_edges( - const Eigen::PlainObjectBase& F) { - Eigen::MatrixXi Eb; - igl::exterior_edges(F, Eb); - - ASSERT_EQ(0, Eb.rows()); - } - - template - void assert_is_manifold( - const Eigen::PlainObjectBase& V, - const Eigen::PlainObjectBase& F) { - Eigen::MatrixXi B; - ASSERT_TRUE(igl::is_vertex_manifold(F, B)); - ASSERT_TRUE(igl::is_edge_manifold(F)); - } - - template - void assert_genus_eq( - const Eigen::PlainObjectBase& V, - const Eigen::PlainObjectBase& F, - const int genus) { - const int num_vertices = V.rows(); - const int num_faces = F.rows(); - - Eigen::Matrix< - typename DerivedF::Scalar, - Eigen::Dynamic, - Eigen::Dynamic> - E, uE, EMAP; - std::vector > uE2E; - igl::unique_edge_map(F, E, uE, EMAP, uE2E); - - const int num_edges = uE.rows(); - const int euler = num_vertices - num_edges + num_faces; - ASSERT_EQ(euler, 2 - 2 * genus); - } - -TEST(MeshBoolean, TwoCubes) { - Eigen::MatrixXd V1; - Eigen::MatrixXi F1; - test_common::load_mesh("two-boxes-bad-self-union.ply", V1, F1); - - Eigen::MatrixXd V2(0, 3); - Eigen::MatrixXi F2(0, 3); - - Eigen::MatrixXd Vo; - Eigen::MatrixXi Fo; - - igl::copyleft::cgal::mesh_boolean(V1, F1, V2, F2, - igl::MESH_BOOLEAN_TYPE_UNION, - Vo, Fo); - - assert_no_exterior_edges(Fo); - assert_is_manifold(Vo, Fo); - assert_genus_eq(Vo, Fo, 0); -} - -TEST(MeshBoolean, MinusTest) { - // Many thanks to Eric Yao for submitting this test case. - Eigen::MatrixXd V1, V2, Vo; - Eigen::MatrixXi F1, F2, Fo; - test_common::load_mesh("boolean_minus_test_cube.obj", V1, F1); - test_common::load_mesh("boolean_minus_test_green.obj", V2, F2); - - igl::copyleft::cgal::mesh_boolean(V1, F1, V2, F2, - igl::MESH_BOOLEAN_TYPE_MINUS, - Vo, Fo); - - assert_no_exterior_edges(Fo); - assert_is_manifold(Vo, Fo); - assert_genus_eq(Vo, Fo, 1); -} - -TEST(MeshBoolean, IntersectWithSelf) { - Eigen::MatrixXd V1, Vo; - Eigen::MatrixXi F1, Fo; - test_common::load_mesh("cube.obj", V1, F1); - - igl::copyleft::cgal::mesh_boolean(V1, F1, V1, F1, - igl::MESH_BOOLEAN_TYPE_INTERSECT, - Vo, Fo); - - assert_no_exterior_edges(Fo); - assert_is_manifold(Vo, Fo); - assert_genus_eq(Vo, Fo, 0); -} - -} diff --git a/include/igl/copyleft/cgal/CMakeLists.txt b/include/igl/copyleft/cgal/CMakeLists.txt index 9b7d017..11bbcce 100644 --- a/include/igl/copyleft/cgal/CMakeLists.txt +++ b/include/igl/copyleft/cgal/CMakeLists.txt @@ -12,5 +12,5 @@ file(GLOB TEST_INC_FILES *.h *.inl) add_executable(igl_cgal_tests ${TEST_SRC_FILES} ${TEST_INC_FILES}) target_link_libraries(igl_cgal_tests ${COMMON_LIBRARIES} ${CGAL_LIBRARIES}) -add_custom_command(TARGET igl_cgal_tests POST_BUILD COMMAND igl_cgal_tests) +add_custom_target(run_igl_cgal_tests ALL igl_cgal_tests DEPENDS igl_cgal_tests) diff --git a/include/igl/copyleft/cgal/CSGTree.cpp b/include/igl/copyleft/cgal/CSGTree.cpp index 8d47841..ea22e96 100644 --- a/include/igl/copyleft/cgal/CSGTree.cpp +++ b/include/igl/copyleft/cgal/CSGTree.cpp @@ -1,6 +1,7 @@ #include #include +#include TEST(CSGTree, extrusion) { Eigen::MatrixXd V; @@ -15,3 +16,59 @@ TEST(CSGTree, extrusion) { ASSERT_EQ(V.rows(), V2.rows()); ASSERT_EQ(F.rows(), F2.rows()); } + +TEST(CSGTree, cube) { + Eigen::MatrixXd V; + Eigen::MatrixXi F; + test_common::load_mesh("cube.obj", V, F); + + igl::copyleft::cgal::CSGTree tree({V, F}, {V, F}, "u"); + Eigen::MatrixXd V2 = tree.cast_V(); + Eigen::MatrixXi F2 = tree.F(); + + ASSERT_EQ(V.rows(), V2.rows()); + ASSERT_EQ(F.rows(), F2.rows()); +} + +TEST(CSGTree, A_minus_B__union__A_intersect_B) { + Eigen::MatrixXd VA, VB; + Eigen::MatrixXi FA, FB; + test_common::load_mesh("cube.obj", VA, FA); + test_common::load_mesh("TinyTorus.obj", VB, FB); + + igl::copyleft::cgal::CSGTree tree{ + {{VA, FA}, {VB, FB}, "minus"}, + {{VA, FA}, {VB, FB}, "intersect"}, + "union" + }; + + Eigen::MatrixXd VC = tree.cast_V(); + Eigen::MatrixXi FC = tree.F(); + + Eigen::VectorXd area_A, area_C; + igl::doublearea(VA, FA, area_A); + igl::doublearea(VC, FC, area_C); + + ASSERT_FLOAT_EQ(area_A.sum(), area_C.sum()); +} + +TEST(CSGTree, A_xor_B___minus___A_union_B__minus__A_intersect_B) { + Eigen::MatrixXd VA, VB; + Eigen::MatrixXi FA, FB; + test_common::load_mesh("cube.obj", VA, FA); + test_common::load_mesh("decimated-knight.obj", VB, FB); + + igl::copyleft::cgal::CSGTree tree{ + {{VA, FA}, {VB, FB}, "xor"}, + { + {{VA, FA}, {VB, FB}, "union"}, + {{VA, FA}, {VB, FB}, "intersect"}, + "minus" + }, "minus" + }; + Eigen::MatrixXd VC = tree.cast_V(); + Eigen::MatrixXi FC = tree.F(); + + ASSERT_EQ(0, VC.rows()); + ASSERT_EQ(0, FC.rows()); +} diff --git a/include/igl/copyleft/cgal/mesh_boolean.cpp b/include/igl/copyleft/cgal/mesh_boolean.cpp new file mode 100644 index 0000000..63abb4f --- /dev/null +++ b/include/igl/copyleft/cgal/mesh_boolean.cpp @@ -0,0 +1,200 @@ +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace mesh_boolean_test { + + template + void assert_no_exterior_edges( + const Eigen::PlainObjectBase& F) { + Eigen::MatrixXi Eb; + igl::exterior_edges(F, Eb); + + ASSERT_EQ(0, Eb.rows()); + } + + template + void assert_is_manifold( + const Eigen::PlainObjectBase& V, + const Eigen::PlainObjectBase& F) { + Eigen::MatrixXi B; + ASSERT_TRUE(igl::is_vertex_manifold(F, B)); + ASSERT_TRUE(igl::is_edge_manifold(F)); + } + + template + void assert_genus_eq( + const Eigen::PlainObjectBase& V, + const Eigen::PlainObjectBase& F, + const int genus) { + const int num_vertices = V.rows(); + const int num_faces = F.rows(); + + Eigen::Matrix< + typename DerivedF::Scalar, + Eigen::Dynamic, + Eigen::Dynamic> + E, uE, EMAP; + std::vector > uE2E; + igl::unique_edge_map(F, E, uE, EMAP, uE2E); + + const int num_edges = uE.rows(); + const int euler = num_vertices - num_edges + num_faces; + ASSERT_EQ(euler, 2 - 2 * genus); + } + +TEST(MeshBoolean, TwoCubes) { + Eigen::MatrixXd V1; + Eigen::MatrixXi F1; + test_common::load_mesh("two-boxes-bad-self-union.ply", V1, F1); + + Eigen::MatrixXd V2(0, 3); + Eigen::MatrixXi F2(0, 3); + + Eigen::MatrixXd Vo; + Eigen::MatrixXi Fo; + + igl::copyleft::cgal::mesh_boolean(V1, F1, V2, F2, + igl::MESH_BOOLEAN_TYPE_UNION, + Vo, Fo); + + assert_no_exterior_edges(Fo); + assert_is_manifold(Vo, Fo); + assert_genus_eq(Vo, Fo, 0); +} + +TEST(MeshBoolean, MinusTest) { + // Many thanks to Eric Yao for submitting this test case. + Eigen::MatrixXd V1, V2, Vo; + Eigen::MatrixXi F1, F2, Fo; + test_common::load_mesh("boolean_minus_test_cube.obj", V1, F1); + test_common::load_mesh("boolean_minus_test_green.obj", V2, F2); + + igl::copyleft::cgal::mesh_boolean(V1, F1, V2, F2, + igl::MESH_BOOLEAN_TYPE_MINUS, + Vo, Fo); + + assert_no_exterior_edges(Fo); + assert_is_manifold(Vo, Fo); + assert_genus_eq(Vo, Fo, 1); +} + +TEST(MeshBoolean, IntersectWithSelf) { + Eigen::MatrixXd V1, Vo; + Eigen::MatrixXi F1, Fo; + test_common::load_mesh("cube.obj", V1, F1); + + igl::copyleft::cgal::mesh_boolean(V1, F1, V1, F1, + igl::MESH_BOOLEAN_TYPE_INTERSECT, + Vo, Fo); + + assert_no_exterior_edges(Fo); + assert_is_manifold(Vo, Fo); + assert_genus_eq(Vo, Fo, 0); +} + +TEST(MeshBoolean, UnionWithSelf) { + Eigen::MatrixXd V1, Vo; + Eigen::MatrixXi F1, Fo; + test_common::load_mesh("cube.obj", V1, F1); + + igl::copyleft::cgal::mesh_boolean(V1, F1, V1, F1, + igl::MESH_BOOLEAN_TYPE_UNION, + Vo, Fo); + + assert_no_exterior_edges(Fo); + assert_is_manifold(Vo, Fo); + assert_genus_eq(Vo, Fo, 0); +} + +TEST(MeshBoolean, MinusSelf) { + Eigen::MatrixXd V1, Vo; + Eigen::MatrixXi F1, Fo; + test_common::load_mesh("cube.obj", V1, F1); + + igl::copyleft::cgal::mesh_boolean(V1, F1, V1, F1, + igl::MESH_BOOLEAN_TYPE_MINUS, + Vo, Fo); + + ASSERT_EQ(0, Vo.rows()); + ASSERT_EQ(0, Fo.rows()); +} + +TEST(MeshBoolean, EmptyMeshShouldNOTFail) { + Eigen::Matrix V1, V2, Vo; + Eigen::Matrix F1, F2, Fo; + + igl::copyleft::cgal::mesh_boolean(V1, F1, V2, F2, + igl::MESH_BOOLEAN_TYPE_UNION, + Vo, Fo); + + ASSERT_EQ(0, Vo.rows()); + ASSERT_EQ(0, Fo.rows()); +} + +TEST(MeshBoolean, CubeWithFold) { + Eigen::Matrix V1, V2, Vo; + Eigen::Matrix F1, F2, Fo; + test_common::load_mesh("cube_with_fold.ply", V1, F1); + + // Self union. + igl::copyleft::cgal::mesh_boolean(V1, F1, V2, F2, + igl::MESH_BOOLEAN_TYPE_UNION, + Vo, Fo); + + assert_no_exterior_edges(Fo); + assert_is_manifold(Vo, Fo); + assert_genus_eq(Vo, Fo, 0); +} + +TEST(MeshBoolean, UnionWithRotatedSelf) { + Eigen::Matrix V1, V2, Vo; + Eigen::Matrix F1, F2, Fo; + test_common::load_mesh("cube_with_fold.ply", V1, F1); + + Eigen::Vector3d axis(1.0, 1.0, 1.0); + axis.normalize(); + Eigen::AngleAxis rot(M_PI - 1e-12, axis); + + V2 = (rot.toRotationMatrix() * V1.transpose()).transpose(); + F2 = F1; + + igl::copyleft::cgal::mesh_boolean(V1, F1, V2, F2, + igl::MESH_BOOLEAN_TYPE_UNION, + Vo, Fo); + + assert_no_exterior_edges(Fo); + assert_is_manifold(Vo, Fo); + assert_genus_eq(Vo, Fo, 0); +} + +TEST(MeshBoolean, RepeatedUnionWithRotatedSelf) { + const size_t N = 10; + Eigen::Matrix V1, V2, Vo; + Eigen::Matrix F1, F2, Fo; + test_common::load_mesh("cube.obj", V1, F1); + + Eigen::Vector3d axis(1.0, 1.0, 1.0); + axis.normalize(); + + for (size_t i=0; i rot(double(i)/double(N) * 2 * M_PI, axis); + V2 = (rot.toRotationMatrix() * V1.transpose()).transpose(); + F2 = F1; + igl::copyleft::cgal::mesh_boolean(Vo, Fo, V2, F2, + igl::MESH_BOOLEAN_TYPE_UNION, + Vo, Fo); + } + assert_no_exterior_edges(Fo); +} + +} diff --git a/include/igl/delaunay_triangulation.cpp b/include/igl/delaunay_triangulation.cpp new file mode 100644 index 0000000..bb0eb03 --- /dev/null +++ b/include/igl/delaunay_triangulation.cpp @@ -0,0 +1,102 @@ +#include +#include + +class delaunay_triangulation : public ::testing::TestWithParam {}; + + +namespace git_issue { + +constexpr static double EPSILON_LENGTH = 0.0005; // Sketchup support 1/1000 precision +constexpr static double EPSILON_ANGLE = 0.0000000000005; +constexpr static double INV_EPSILON_LENGTH = 2000.0; + +template +inline int orient2d(const T &pa, const T &pb, const T &pc) { + double acx, bcx, acy, bcy; + acx = pa[0] - pc[0]; + bcx = pb[0] - pc[0]; + acy = pa[1] - pc[1]; + bcy = pb[1] - pc[1]; + + double val = acx * bcy - acy * bcx; + if (val < -EPSILON_LENGTH) { + return -1; + } else if (val > EPSILON_LENGTH) { + return 1; + } else { + return 0; + } + return 0; +} + +template +inline int incircle(const T &pa, const T &pb, const T &pc, const T &pd) { + double adx, ady, bdx, bdy, cdx, cdy; + double abdet, bcdet, cadet; + double alift, blift, clift; + + adx = pa[0] - pd[0]; + ady = pa[1] - pd[1]; + bdx = pb[0] - pd[0]; + bdy = pb[1] - pd[1]; + cdx = pc[0] - pd[0]; + cdy = pc[1] - pd[1]; + + abdet = adx * bdy - bdx * ady; + bcdet = bdx * cdy - cdx * bdy; + cadet = cdx * ady - adx * cdy; + alift = adx * adx + ady * ady; + blift = bdx * bdx + bdy * bdy; + clift = cdx * cdx + cdy * cdy; + + double val = alift * bcdet + blift * cadet + clift * abdet; + if (val < -EPSILON_LENGTH) { + return -1; + } else if (val > EPSILON_LENGTH) { + return 1; + } else { + return 0; + } + return 0; +} +} + + +TEST(delaunay_triangulation, git_issue_521) { + using namespace Eigen; + using namespace git_issue; + MatrixXd V(16, 2); + MatrixXi F; + + V << 4.55E-13, 2.33E-12, + 248.718, 249.939, + 463.602, 36.1059, + 764.953, 338.937, + -1002.42, 2097.68, + -1303.78, 1794.85, + -1120.79, 1612.75, + -1369.5, 1362.81, + -1552.49, 1544.91, + -1843.04, 1252.94, + -75.6625, -505.806, + 214.883, -213.834, + -191.721, 190.784, + -1166.14, 1160.44, + -917.424, 1410.38, + 56.9975, 440.723; + + const auto &orient2d_predicates = [](const double * pa, const double * pb, const double * pc) { + return orient2d(pa, pb, pc); + }; + const auto &incircle_predicates = [](const double * pa, const double * pb, const double * pc, const double * pd) { + return incircle(pa, pb, pc, pd); + }; + + igl::delaunay_triangulation(V, orient2d_predicates, incircle_predicates, F); + + ASSERT_LT(0, F.rows()); + ASSERT_EQ(3, F.cols()); + ASSERT_GT(16, F.maxCoeff()); + ASSERT_EQ(0, F.minCoeff()); +} + diff --git a/include/igl/guess_extension.cpp b/include/igl/guess_extension.cpp deleted file mode 100644 index 0e0cf28..0000000 --- a/include/igl/guess_extension.cpp +++ /dev/null @@ -1,30 +0,0 @@ - -#include -#include -#include -#include - -class guess_extension : public ::testing::TestWithParam {}; - -TEST_P(guess_extension, all_meshes) -{ - Eigen::MatrixXd V; - Eigen::MatrixXi F; - std::string path(test_common::data_path(GetParam())); - // Load example mesh: GetParam() will be name of mesh file - std::string d,b,e,f; - igl::pathinfo(path,d,b,e,f); - // Convert extension to lower case - std::transform(e.begin(), e.end(), e.begin(), ::tolower); - FILE * fp = fopen(path.c_str(),"r"); - std::string guess = igl::guess_extension(fp); - ASSERT_EQ(guess,e); -} - -INSTANTIATE_TEST_CASE_P -( - all_meshes, - guess_extension, - ::testing::ValuesIn(test_common::all_meshes()), - test_common::string_test_name -); diff --git a/include/igl/readPLY.cpp b/include/igl/readPLY.cpp new file mode 100644 index 0000000..d3f31e5 --- /dev/null +++ b/include/igl/readPLY.cpp @@ -0,0 +1,33 @@ +#include +#include + +using namespace test_common; + +TEST(readPLY, file_does_not_exist){ + Eigen::MatrixXd V; + Eigen::MatrixXi F; + igl::readPLY(test_common::data_path("file_does_not_exist.ply"), V, F); +} + +TEST(readPLY, cube){ + Eigen::MatrixXd V; + Eigen::MatrixXi F; + igl::readPLY(test_common::data_path("cube.ply"), V, F); + + ASSERT_EQ(8, V.rows()); + ASSERT_EQ(12, F.rows()); +} + +TEST(readPLY, two_boxes_bad_self_union){ + Eigen::MatrixXd V; + Eigen::MatrixXi F; + for (size_t i=0; i<100; i++) { + igl::readPLY(test_common::data_path("two-boxes-bad-self-union.ply"), V, F); + ASSERT_EQ(486, V.rows()); + ASSERT_EQ(708, F.rows()); + + igl::readPLY(test_common::data_path("cube.ply"), V, F); + ASSERT_EQ(8, V.rows()); + ASSERT_EQ(12, F.rows()); + } +}