Repository: zippy84/vtkbool Branch: master Commit: 167d78255bc0 Files: 37 Total size: 571.4 KB Directory structure: gitextract_hxnqu4v5/ ├── .github/ │ ├── FUNDING.yml │ └── workflows/ │ └── cmake.yml ├── CITATION.cff ├── CMakeLists.txt ├── Contact.cxx ├── Contact.h ├── LICENSE ├── Merger.cxx ├── Merger.h ├── Optimize.cxx ├── Optimize.h ├── README.md ├── Utilities.cxx ├── Utilities.h ├── module/ │ ├── CMakeLists.txt │ └── vtk.module ├── paraview/ │ ├── CMakeLists.txt │ ├── module/ │ │ ├── CMakeLists.txt │ │ ├── vtk.module │ │ └── vtkPolyDataBooleanFilter.xml │ └── paraview.plugin ├── run_some_tests.sh ├── testing/ │ ├── data/ │ │ ├── branched.vtk │ │ ├── branched3.vtk │ │ ├── branched4.vtk │ │ ├── branched6.vtk │ │ ├── cross.vtk │ │ ├── merger.vtk │ │ └── non-manifold.vtk │ ├── generate_frieze.py │ ├── pytest.ini │ ├── test_congruence.cxx │ ├── test_filter.py │ ├── test_merger.cxx │ └── test_python.py ├── vtkPolyDataBooleanFilter.cxx └── vtkPolyDataBooleanFilter.h ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/FUNDING.yml ================================================ ko_fi: zippy84 ================================================ FILE: .github/workflows/cmake.yml ================================================ name: CMake on: push: branches: - '*' jobs: Build: runs-on: ${{matrix.os}} strategy: matrix: os: [ubuntu-22.04, ubuntu-latest] cxx: [g++, clang++] build_type: [Debug, Release] steps: - uses: actions/checkout@v3 - name: Install Deps run: | sudo apt-get update sudo apt-get -y upgrade sudo DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata sudo apt-get -y install libvtk9-dev python3-vtk9 python3-pytest - name: Configure CMake run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.build_type}} env: CXX: ${{matrix.cxx}} CXXFLAGS: ${{matrix.cxxflags}} - name: Build run: cmake --build ${{github.workspace}}/build --config ${{matrix.build_type}} - name: Test working-directory: ${{github.workspace}}/build run: ctest --output-on-failure -C ${{matrix.build_type}} Coverage: if: github.ref == 'refs/heads/master' runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Install Deps run: | sudo apt-get update sudo apt-get -y upgrade sudo DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata sudo apt-get -y install libvtk9-dev python3-vtk9 python3-pytest gcovr - name: Configure CMake run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=Profile -DVTKBOOL_COVERAGE=ON - name: Build run: cmake --build ${{github.workspace}}/build - name: Test working-directory: ${{github.workspace}}/build run: | ctest --output-on-failure gcovr -r .. . --exclude-throw-branches --xml -o coverage.xml - name: Upload coverage reports to Codecov uses: codecov/codecov-action@v3 with: token: ${{secrets.CODECOV_TOKEN}} ================================================ FILE: CITATION.cff ================================================ cff-version: 1.2.0 title: vtkbool message: 'If you use this software, please cite it as below.' type: software authors: - family-names: Römer given-names: Ronald identifiers: - type: doi value: 10.5281/zenodo.10461186 repository-code: 'https://github.com/zippy84/vtkbool' license: Apache-2.0 version: 3.2.0 ================================================ FILE: CMakeLists.txt ================================================ # Copyright 2012-2025 Ronald Römer # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. cmake_minimum_required(VERSION 3.12 FATAL_ERROR) project(vtkbool VERSION 3.2 HOMEPAGE_URL https://github.com/zippy84/vtkbool) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_OUTPUT_EXTENSION_REPLACE 1) if(MSVC) add_compile_options(/EHsc) add_compile_definitions(_SCL_SECURE_NO_WARNINGS) add_compile_definitions(_USE_MATH_DEFINES) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) else() add_compile_options(-Wall -Wextra -fPIC -Wconversion) endif() option(VTKBOOL_PARAVIEW "" OFF) option(VTKBOOL_DEBUG "" OFF) option(VTKBOOL_COVERAGE "" OFF) mark_as_advanced(VTKBOOL_DEBUG) mark_as_advanced(VTKBOOL_COVERAGE) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND VTKBOOL_COVERAGE) set(CMAKE_C_FLAGS_PROFILE --coverage) set(CMAKE_CXX_FLAGS_PROFILE --coverage) add_link_options("--coverage") endif() include_directories(".") if(VTKBOOL_DEBUG) add_definitions(-DDEBUG) endif() if(VTKBOOL_PARAVIEW) find_package(ParaView REQUIRED) if(ParaView_FOUND) paraview_plugin_scan( PLUGIN_FILES "${CMAKE_CURRENT_SOURCE_DIR}/paraview/paraview.plugin" PROVIDES_PLUGINS plugins ENABLE_BY_DEFAULT ON) set(BUILD_SHARED_LIBS ON) include(GNUInstallDirs) paraview_plugin_build( PLUGINS ${plugins}) endif() else() find_package(VTK REQUIRED COMPONENTS FiltersSources IOLegacy FiltersExtraction FiltersGeometry FiltersModeling FiltersFlowPaths OPTIONAL_COMPONENTS WrappingPythonCore NO_MODULE) if(VTK_FOUND) if(VTK_VERSION VERSION_LESS "9.0.0") message(FATAL_ERROR "vtkbool requires VTK 9.0.0 or newer.") endif() vtk_module_scan( MODULE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/module/vtk.module" REQUEST_MODULES vtkbool PROVIDES_MODULES modules ENABLE_TESTS ON) set(BUILD_SHARED_LIBS ON) include(GNUInstallDirs) vtk_module_build(MODULES ${modules}) if (VTK_WrappingPythonCore_FOUND) vtk_module_wrap_python( MODULES ${modules} PYTHON_PACKAGE "vtkbool" BUILD_STATIC OFF INSTALL_HEADERS OFF) include(CTest) vtk_module_python_default_destination(python_default_destination) add_test(NAME "import_vtkbool" COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/testing/test_python.py) set_property(TEST "import_vtkbool" APPEND PROPERTY ENVIRONMENT "PYTHONPATH=${CMAKE_BINARY_DIR}/${python_default_destination}/vtkbool") add_test(NAME "test_filter" COMMAND ${Python3_EXECUTABLE} -m pytest WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/testing) set_property(TEST "test_filter" APPEND PROPERTY ENVIRONMENT "PYTHONPATH=${CMAKE_BINARY_DIR}/${python_default_destination}/vtkbool") add_executable(test_merger testing/test_merger.cxx) target_link_libraries(test_merger PRIVATE vtkbool ${VTK_LIBRARIES}) add_executable(test_congruence testing/test_congruence.cxx) target_link_libraries(test_congruence PRIVATE vtkbool ${VTK_LIBRARIES}) vtk_module_autoinit( TARGETS test_merger test_congruence MODULES ${VTK_LIBRARIES} ) add_test(NAME "test_merger" COMMAND test_merger WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/testing) add_test(NAME "test_congruence" COMMAND test_congruence WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/testing) add_test(NAME "generate_frieze" COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/testing/generate_frieze.py WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/testing) set_property(TEST "generate_frieze" APPEND PROPERTY ENVIRONMENT "PYTHONPATH=${CMAKE_BINARY_DIR}/${python_default_destination}/vtkbool") endif() endif() endif() ================================================ FILE: Contact.cxx ================================================ /* Copyright 2012-2025 Ronald Römer Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ #include "Contact.h" #include "Optimize.h" #include #include #include #include #include // #define _debA 0 // #define _debB 0 #if (defined(_debA) && defined(_debB)) vtkIdType _idA, _idB; #endif vtkSmartPointer Clean (vtkPolyData *pd) { auto clean = vtkSmartPointer::New(); clean->SetOutputPointsPrecision(vtkAlgorithm::DOUBLE_PRECISION); clean->SetTolerance(1e-6); clean->ConvertLinesToPointsOff(); clean->ConvertPolysToLinesOff(); clean->ConvertStripsToPolysOff(); clean->SetInputData(pd); clean->Update(); auto cleaned = clean->GetOutput(); vtkIdType numCells = cleaned->GetNumberOfCells(); auto newPd = vtkSmartPointer::New(); newPd->SetPoints(cleaned->GetPoints()); newPd->Allocate(numCells); auto cellIds = vtkSmartPointer::New(); cellIds->SetName("OrigCellIds"); cellIds->Allocate(numCells); vtkCellIterator *cellItr = cleaned->NewCellIterator(); vtkIdType cellId; vtkIdList *ptIds; vtkIdType num; const vtkIdType *pts; for (cellItr->InitTraversal(); !cellItr->IsDoneWithTraversal(); cellItr->GoToNextCell()) { cellId = cellItr->GetCellId(); ptIds = cellItr->GetPointIds(); if (cellItr->GetCellType() == VTK_TRIANGLE || cellItr->GetCellType() == VTK_POLYGON) { newPd->InsertNextCell(cellItr->GetCellType(), ptIds); cellIds->InsertNextValue(cellId); } else if (cellItr->GetCellType() == VTK_TRIANGLE_STRIP) { auto cells = vtkSmartPointer::New(); vtkTriangleStrip::DecomposeStrip(cellItr->GetNumberOfPoints(), ptIds->GetPointer(0), cells); for (cells->InitTraversal(); cells->GetNextCell(num, pts);) { if (pts[0] != pts[1] && pts[1] != pts[2] && pts[2] != pts[0]) { newPd->InsertNextCell(VTK_TRIANGLE, num, pts); cellIds->InsertNextValue(cellId); } } } else if (cellItr->GetCellType() == VTK_QUAD) { double pA[3], pB[3], pC[3], pD[3]; cleaned->GetPoint(ptIds->GetId(0), pA); cleaned->GetPoint(ptIds->GetId(1), pB); cleaned->GetPoint(ptIds->GetId(2), pC); cleaned->GetPoint(ptIds->GetId(3), pD); double det = vtkMath::Determinant3x3(pB[0]-pA[0], pC[0]-pA[0], pD[0]-pA[0], pB[1]-pA[1], pC[1]-pA[1], pD[1]-pA[1], pB[2]-pA[2], pC[2]-pA[2], pD[2]-pA[2]); if (std::abs(det) < 1e-10) { newPd->InsertNextCell(VTK_POLYGON, ptIds); cellIds->InsertNextValue(cellId); } else { const vtkIdType cellA[] = {ptIds->GetId(0), ptIds->GetId(1), ptIds->GetId(2)}; const vtkIdType cellB[] = {ptIds->GetId(2), ptIds->GetId(3), ptIds->GetId(0)}; newPd->InsertNextCell(VTK_TRIANGLE, 3, cellA); cellIds->InsertNextValue(cellId); newPd->InsertNextCell(VTK_TRIANGLE, 3, cellB); cellIds->InsertNextValue(cellId); } } } cellItr->Delete(); newPd->GetCellData()->SetScalars(cellIds); newPd->Squeeze(); return newPd; } Contact::Contact (vtkPolyData *newPdA, vtkPolyData *newPdB) : newPdA(newPdA), newPdB(newPdB) { assert(newPdA->GetCellData()->GetScalars("OrigCellIds") != nullptr); assert(newPdB->GetCellData()->GetScalars("OrigCellIds") != nullptr); pts = vtkSmartPointer::New(); pts->SetDataTypeToDouble(); lines = vtkSmartPointer::New(); lines->SetPoints(pts); lines->Allocate(1000); contA = vtkSmartPointer::New(); contB = vtkSmartPointer::New(); contA->Allocate(1000); contB->Allocate(1000); contA->SetName("cA"); contB->SetName("cB"); lines->GetCellData()->AddArray(contA); lines->GetCellData()->AddArray(contB); sourcesA = vtkSmartPointer::New(); sourcesB = vtkSmartPointer::New(); sourcesA->Allocate(1000); sourcesB->Allocate(1000); sourcesA->SetNumberOfComponents(2); sourcesB->SetNumberOfComponents(2); sourcesA->SetName("sourcesA"); sourcesB->SetName("sourcesB"); lines->GetCellData()->AddArray(sourcesA); lines->GetCellData()->AddArray(sourcesB); touchesEdgesA = false; touchesEdgesB = false; GetNonManifoldEdges(newPdA, edgesA); GetNonManifoldEdges(newPdB, edgesB); treeA = vtkSmartPointer::New(); treeA->SetDataSet(newPdA); treeA->BuildLocator(); treeB = vtkSmartPointer::New(); treeB->SetDataSet(newPdB); treeB->BuildLocator(); } vtkSmartPointer Contact::GetLines (vtkPolyData *pdA, vtkLinearTransform *transA, vtkPolyData *pdB, vtkLinearTransform *transB) { auto matrix = vtkSmartPointer::New(); if (pdA != nullptr) { newPdA = pdA; } if (pdB != nullptr) { newPdB = pdB; } auto matrixA = vtkSmartPointer::New(); if (transA != nullptr) { matrixA = transA->GetMatrix(); } auto matrixB = vtkSmartPointer::New(); if (transB != nullptr) { matrixB = transB->GetMatrix(); } auto tmpMatrix = vtkSmartPointer::New(); vtkMatrix4x4::Invert(matrixA, tmpMatrix); vtkMatrix4x4::Multiply4x4(tmpMatrix, matrixB, matrix); sourcesA->Reset(); sourcesB->Reset(); contA->Reset(); contB->Reset(); lines->Reset(); treeA->IntersectWithOBBTree(treeB, matrix, InterNodes, this); IntersectReplacements(); if (touchesEdgesA || touchesEdgesB) { throw std::runtime_error("Intersection goes through non-manifold edges."); } auto clean = vtkSmartPointer::New(); clean->SetInputData(lines); clean->ToleranceIsAbsoluteOn(); clean->SetAbsoluteTolerance(1e-5); clean->Update(); auto cleaned = clean->GetOutput(); vtkCellIterator *cellItr = cleaned->NewCellIterator(); vtkIdType cellId; for (cellItr->InitTraversal(); !cellItr->IsDoneWithTraversal(); cellItr->GoToNextCell()) { cellId = cellItr->GetCellId(); if (cellItr->GetCellType() != VTK_LINE) { cleaned->DeleteCell(cellId); } } cellItr->Delete(); cleaned->RemoveDeletedCells(); return cleaned; } void Contact::GetNonManifoldEdges (vtkPolyData *pd, NonManifoldEdgesType &edges) { pd->BuildLinks(); vtkCellIterator *cellItr = pd->NewCellIterator(); vtkIdType cellId; vtkIdList *ptIds; auto neigs = vtkSmartPointer::New(); vtkIdType i, j, k; vtkIdType idA, idB; vtkIdType n; vtkIdType num; const vtkIdType *pts; vtkIdType a, b; for (cellItr->InitTraversal(); !cellItr->IsDoneWithTraversal(); cellItr->GoToNextCell()) { cellId = cellItr->GetCellId(); ptIds = cellItr->GetPointIds(); for (i = 0; i < ptIds->GetNumberOfIds(); i++) { j = i+1; if (j == ptIds->GetNumberOfIds()) { j = 0; } idA = ptIds->GetId(i); idB = ptIds->GetId(j); pd->GetCellEdgeNeighbors(cellId, idA, idB, neigs); if (neigs->GetNumberOfIds() > 1) { n = 0; for (k = 0; k < neigs->GetNumberOfIds(); k++) { pd->GetCellPoints(neigs->GetId(k), num, pts); for (a = 0; a < num; a++) { b = a+1; if (b == num) { b = 0; } if (pts[a] == idB && pts[b] == idA) { n++; } } } if (n > 1) { edges.emplace(idA, idB); edges.emplace(idB, idA); } } } } cellItr->Delete(); } void Contact::InterEdgeLine (InterPtsType &interPts, const Point3d &pA, const Point3d &pB, Src src) { // schnitt mit x-achse double v[3]; Point3d::GetVec(pA, pB, v); double w[] = {-v[1], v[0]}; double c = w[0]*pA.x+w[1]*pA.y; if (std::abs(w[0]) < 1e-10) { if (std::abs(pA.y) < 1e-5 && std::abs(pB.y) < 1e-5) { interPts.emplace_back(pA.x, 0, 0, pA.x, pA.id, pB.id, End::A, src, PointSrc::Copied); interPts.emplace_back(pB.x, 0, 0, pB.x, pA.id, pB.id, End::B, src, PointSrc::Copied); } } else { double yA = pA.y-1e-6*v[1]; double yB = pB.y+1e-6*v[1]; if (std::signbit(yA) != std::signbit(yB)) { double x = c/w[0]; double sA[] = {pA.x-x, pA.y}; double sB[] = {pB.x-x, pB.y}; double dA = sA[0]*sA[0]+sA[1]*sA[1]; double dB = sB[0]*sB[0]+sB[1]*sB[1]; End end = dA < 1e-12 ? End::A : (dB < 1e-12 ? End::B : End::None); interPts.emplace_back(x, 0, 0, x, pA.id, pB.id, end, src, PointSrc::Calculated); } } } bool Contact::InterPolyLine (InterPtsType &interPts, const Base2 &base, const Poly &poly, Src src) { #if (defined(_debA) && defined(_debB)) if (_idA == _debA && _idB == _debB) { std::cout << "InterPolyLine()" << std::endl; } #endif Poly::const_iterator itrA, itrB; double q[3]; for (itrA = poly.begin(); itrA != poly.end(); ++itrA) { itrB = itrA+1; if (itrB == poly.end()) { itrB = poly.begin(); } InterEdgeLine(interPts, *itrA, *itrB, src); // schnitt mit x-achse } for (auto& p : interPts) { base.BackTransform(p.pt, q); std::copy_n(q, 3, p.pt); } std::sort(interPts.begin(), interPts.end(), [](auto &a, auto &b) { return a.t < b.t; }); struct Cmp { const double tol = 1e-5; bool operator() (const InterPt &lhs, const InterPt &rhs) const { if (lhs.pointSrc == PointSrc::Copied && rhs.pointSrc == PointSrc::Copied) { if (lhs.GetEnd() == rhs.GetEnd()) { return false; } } else if (lhs.pointSrc == PointSrc::Copied) { const vtkIdType end = lhs.GetEnd(); if (end == rhs.edge.f || end == rhs.edge.g) { return false; } } else if (rhs.pointSrc == PointSrc::Copied) { const vtkIdType end = rhs.GetEnd(); if (end == lhs.edge.f || end == lhs.edge.g) { return false; } } const double d = lhs.t-rhs.t; if (std::abs(d) < tol) { return false; } else { return d < 0; } } }; std::map grouped; std::vector sortedPts; for (auto &p : interPts) { grouped[p].push_back(p); } for (auto& [k, v] : grouped) { std::sort(v.begin(), v.end(), [](const InterPt &lhs, const InterPt &rhs) { return lhs.pointSrc > rhs.pointSrc; }); sortedPts.push_back(v); } std::map allEnds; decltype(sortedPts)::iterator itr; for (itr = sortedPts.begin(); itr != sortedPts.end(); ++itr) { if (itr == sortedPts.begin()) { if (itr->size() == 2) { itr->pop_back(); } } else if (itr == sortedPts.end()-1) { if (itr->size() == 2) { itr->pop_back(); } } else if (itr->size() == 1 && itr->back().end != End::None) { itr->push_back(itr->back()); } if (itr->back().end != End::None) { auto p = itr->back(); allEnds.emplace(p.end == End::A ? p.edge.f : p.edge.g, p.t); } // hier schneidet sich das polygon selbst if (itr->size() > 2) { return false; } if (itr->size() == 2) { // schnitt durch kongruente kanten if (itr->back().end == End::None) { return false; } auto &edgeA = itr->front().edge; auto &edgeB = itr->back().edge; if (edgeA.f == edgeB.g && edgeB.f == edgeA.g) { return false; } } } std::map> pts; for (auto &p : poly) { pts.emplace(p.id, p); } vtkIdType ind; vtkIdType prev, next; for (itr = sortedPts.begin(); itr != sortedPts.end(); ++itr) { auto p = itr->back(); if (p.end == End::None) { continue; } if (p.end == End::A) { ind = p.edge.f; next = p.edge.g; auto _itr = std::find_if(poly.begin(), poly.end(), [&ind](auto &p) { return p.id == ind; }); if (_itr == poly.begin()) { prev = poly.back().id; } else { prev = std::prev(_itr)->id; } } else { ind = p.edge.g; prev = p.edge.f; auto _itr = std::find_if(poly.begin(), poly.end(), [&ind](auto &p) { return p.id == ind; }); if (_itr == poly.end()-1) { next = poly.front().id; } else { next = std::next(_itr)->id; } } if (itr->size() == 2) { if (allEnds.count(prev) == 0 && allEnds.count(next) == 1) { const Point3d &q = pts.at(prev); if ((allEnds.at(next) < p.t && q.y < 0) || (allEnds.at(next) > p.t && q.y > 0)) { itr->pop_back(); } } else if (allEnds.count(prev) == 1 && allEnds.count(next) == 0) { const Point3d &q = pts.at(next); if ((allEnds.at(prev) < p.t && q.y > 0) || (allEnds.at(prev) > p.t && q.y < 0)) { itr->pop_back(); } } } if (allEnds.count(prev) == 0 && allEnds.count(next) == 0) { const Point3d &a = pts.at(prev); const Point3d &b = pts.at(next); if (std::signbit(a.y) != std::signbit(b.y)) { if (itr->size() == 2) { itr->pop_back(); } } else { if ((a.x > b.x) == std::signbit(a.y)) { itr->clear(); } } } } InterPtsType _interPts; for (const auto &pts : sortedPts) { std::copy(pts.begin(), pts.end(), std::back_inserter(_interPts)); } interPts.swap(_interPts); #if (defined(_debA) && defined(_debB)) if (_idA == _debA && _idB == _debB) { for (auto &p : interPts) { std::cout << p << std::endl; } } #endif return true; } void Contact::InterPolys (vtkIdType idA, vtkIdType idB) { #if (defined(_debA) && defined(_debB)) _idA = idA; _idB = idB; if (_idA == _debA && _idB == _debB) { std::cout << "InterPolys(" << idA << ", " << idB << ")" << std::endl; } #endif vtkIdType numA, numB; const vtkIdType *ptsA, *ptsB; newPdA->GetCellPoints(idA, numA, ptsA); newPdB->GetCellPoints(idB, numB, ptsB); Poly polyA, polyB; GetPoly(newPdA->GetPoints(), numA, ptsA, polyA); GetPoly(newPdB->GetPoints(), numB, ptsB, polyB); double nA[3], nB[3], r[3], s[3]; ComputeNormal(polyA, nA); ComputeNormal(polyB, nB); #if (defined(_debA) && defined(_debB)) if (_idA == _debA && _idB == _debB) { std::cout << "nA [" << nA[0] << ", " << nA[1] << ", " << nA[2] << "]" << std::endl; std::cout << "nB [" << nB[0] << ", " << nB[1] << ", " << nB[2] << "]" << std::endl; } #endif if (vtkMath::Dot(nA, nB) > .9999999999) { return; } double dA = polyA[0].x*nA[0]+polyA[0].y*nA[1]+polyA[0].z*nA[2]; double dB = polyB[0].x*nB[0]+polyB[0].y*nB[1]+polyB[0].z*nB[2]; vtkMath::Cross(nA, nB, r); vtkMath::Normalize(r); std::array, 3> dets { std::make_tuple(0, 1, 2, nA[0]*nB[1]-nB[0]*nA[1]), std::make_tuple(0, 2, 1, nA[0]*nB[2]-nB[0]*nA[2]), std::make_tuple(1, 2, 0, nA[1]*nB[2]-nB[1]*nA[2]) }; const auto& [i, j, k, det] = *std::max_element(dets.begin(), dets.end(), [](auto &a, auto &b) { return std::abs(std::get<3>(a)) < std::abs(std::get<3>(b)); }); s[i] = (dA*nB[j]-dB*nA[j])/det; s[j] = (dB*nA[i]-dA*nB[i])/det; s[k] = 0; #if (defined(_debA) && defined(_debB)) if (_idA == _debA && _idB == _debB) { std::cout << "det " << det << std::endl; std::cout << "r [" << r[0] << ", " << r[1] << ", " << r[2] << "]" << std::endl; std::cout << "s [" << s[0] << ", " << s[1] << ", " << s[2] << "]" << std::endl; } #endif Base2 baseA(s, r, nA); Base2 baseB(s, r, nB); Poly transA, transB; FlattenPoly2(polyA, transA, baseA); FlattenPoly2(polyB, transB, baseB); #if (defined(_debA) && defined(_debB)) if (_idA == _debA && _idB == _debB) { std::cout << "transA {"; for (auto& p : transA) { std::cout << p << ", "; } std::cout << std::endl; std::cout << "transB {"; for (auto& p : transB) { std::cout << p << ", "; } std::cout << std::endl; } #endif bool isPlanarA = std::find_if(transA.begin(), transA.end(), [](auto &p) { return std::abs(p.z) > 1e-6; }) == transA.end(); bool isPlanarB = std::find_if(transB.begin(), transB.end(), [](auto &p) { return std::abs(p.z) > 1e-6; }) == transB.end(); bool hasReplA = replsA.count(idA) == 1; bool hasReplB = replsB.count(idB) == 1; if (!isPlanarA && !hasReplA && newPdA->GetCellType(idA) != VTK_TRIANGLE) { try { auto newIds = PreventEqualCaptPoints::TriangulateCell(newPdA, idA, {}); replsA.emplace(idA, newIds); hasReplA = true; } catch (...) {} } if (!isPlanarB && !hasReplB && newPdB->GetCellType(idB) != VTK_TRIANGLE) { try { auto newIds = PreventEqualCaptPoints::TriangulateCell(newPdB, idB, {}); replsB.emplace(idB, newIds); hasReplB = true; } catch (...) {} } if (hasReplA || hasReplB) { pairs.emplace_back(idA, idB); return; } InterPtsType intersPtsA, intersPtsB; if (!InterPolyLine(intersPtsA, baseA, transA, Src::A)) { throw std::runtime_error("Found invalid intersection points."); } if (!InterPolyLine(intersPtsB, baseB, transB, Src::B)) { throw std::runtime_error("Found invalid intersection points."); } if (!CheckInters(intersPtsA, newPdA)) { std::stringstream ss; ss << "Intersection points do not lie on the edges (cells " << idA << ", " << idB << ")."; throw std::runtime_error(ss.str()); } if (!CheckInters(intersPtsB, newPdB)) { std::stringstream ss; ss << "Intersection points do not lie on the edges (cells " << idA << ", " << idB << ")."; throw std::runtime_error(ss.str()); } if ((intersPtsA.size() & 1) == 0 && (intersPtsB.size() & 1) == 0) { AddContactLines(intersPtsA, intersPtsB, idA, idB); } } bool Contact::CheckInters (const InterPtsType &interPts, vtkPolyData *pd) { #if (defined(_debA) && defined(_debB)) if (_idA == _debA && _idB == _debB) { std::cout << "CheckInters()" << std::endl; } #endif double ptA[3], ptB[3], v[3], w[3], k, l, alpha, d; for (auto &p : interPts) { #if (defined(_debA) && defined(_debB)) if (_idA == _debA && _idB == _debB) { std::cout << p << std::endl; } #endif pd->GetPoint(p.edge.f, ptA); pd->GetPoint(p.edge.g, ptB); vtkMath::Subtract(ptA, ptB, v); vtkMath::Normalize(v); vtkMath::Subtract(ptA, p.pt, w); k = vtkMath::Norm(w); l = vtkMath::Dot(v, w); alpha = std::acos(l/k); #if (defined(_debA) && defined(_debB)) if (_idA == _debA && _idB == _debB) { std::cout << "alpha " << alpha << std::endl; } #endif if (std::isnan(alpha)) { continue; } d = std::sin(alpha)*k; #if (defined(_debA) && defined(_debB)) if (_idA == _debA && _idB == _debB) { std::cout << "d " << d << std::endl; } #endif if (d < 1e-5) { continue; } return false; } return true; } void Contact::OverlapLines (OverlapsType &overlaps, InterPtsType &intersA, InterPtsType &intersB) { auto Add = [](InterPt &a, InterPt &b, InterPt &c, InterPt &d) { a.Merge(c); b.Merge(d); return std::make_tuple(a, b); }; InterPtsType::iterator itr, itr2; for (itr = intersA.begin(); itr != intersA.end(); itr += 2) { for (itr2 = intersB.begin(); itr2 != intersB.end(); itr2 += 2) { if (itr->t <= itr2->t && (itr+1)->t > itr2->t) { if ((itr2+1)->t < (itr+1)->t) { overlaps.push_back(Add(*itr2, *(itr2+1), *itr, *(itr+1))); } else { overlaps.push_back(Add(*itr2, *(itr+1), *itr, *(itr2+1))); } } else if (itr2->t <= itr->t && (itr2+1)->t > itr->t) { if ((itr+1)->t < (itr2+1)->t) { overlaps.push_back(Add(*itr, *(itr+1), *itr2, *(itr2+1))); } else { overlaps.push_back(Add(*itr, *(itr2+1), *itr2, *(itr+1))); } } } } } void Contact::AddContactLines (InterPtsType &intersA, InterPtsType &intersB, vtkIdType idA, vtkIdType idB) { if (intersA.size() == 0 || intersB.size() == 0) { return; } OverlapsType overlaps; OverlapLines(overlaps, intersA, intersB); OverlapsType::const_iterator itr; for (itr = overlaps.begin(); itr != overlaps.end(); ++itr) { auto &f = std::get<0>(*itr); auto &s = std::get<1>(*itr); if ((f.src == Src::A && edgesA.count(f.edge) == 1) || (s.src == Src::A && edgesA.count(s.edge) == 1)) { touchesEdgesA = true; } if ((f.src == Src::B && edgesB.count(f.edge) == 1) || (s.src == Src::B && edgesB.count(s.edge) == 1)) { touchesEdgesB = true; } vtkIdList *linePts = vtkIdList::New(); linePts->InsertNextId(pts->InsertNextPoint(f.pt)); linePts->InsertNextId(pts->InsertNextPoint(s.pt)); lines->InsertNextCell(VTK_LINE, linePts); linePts->Delete(); const vtkIdType tupleA[] = {f.srcA, s.srcA}; const vtkIdType tupleB[] = {f.srcB, s.srcB}; sourcesA->InsertNextTypedTuple(tupleA); sourcesB->InsertNextTypedTuple(tupleB); contA->InsertNextValue(idA); contB->InsertNextValue(idB); } } int Contact::InterNodes (vtkOBBNode *nodeA, vtkOBBNode *nodeB, vtkMatrix4x4 *vtkNotUsed(matrix), void *ptr) { auto _this = reinterpret_cast(ptr); vtkIdList *cellsA = nodeA->Cells; vtkIdList *cellsB = nodeB->Cells; vtkIdType numCellsA = cellsA->GetNumberOfIds(); vtkIdType numCellsB = cellsB->GetNumberOfIds(); vtkIdType i, j, cellA, cellB; for (i = 0; i < numCellsA; i++) { cellA = cellsA->GetId(i); for (j = 0; j < numCellsB; j++) { cellB = cellsB->GetId(j); _this->InterPolys(cellA, cellB); } } return 0; } void Contact::IntersectReplacements () { if (pairs.empty()) { return; } while (!pairs.empty()) { vtkIdType i; auto iterA = vtkArrayIteratorTemplate::New(); iterA->Initialize(contA); auto iterB = vtkArrayIteratorTemplate::New(); iterB->Initialize(contB); for (i = 0; i < iterA->GetNumberOfValues(); i++) { if (replsA.count(iterA->GetValue(i)) == 1 || replsB.count(iterB->GetValue(i)) == 1) { lines->DeleteCell(i); pairs.emplace_back(iterA->GetValue(i), iterB->GetValue(i)); } } PairsType current; current.swap(pairs); for (auto& [a, b] : current) { auto itrA = replsA.find(a); auto itrB = replsB.find(b); IdsType cellsA, cellsB; if (itrA == replsA.end()) { cellsA.push_back(a); } else { auto ids = itrA->second; std::copy(ids.begin(), ids.end(), std::back_inserter(cellsA)); } if (itrB == replsB.end()) { cellsB.push_back(b); } else { auto ids = itrB->second; std::copy(ids.begin(), ids.end(), std::back_inserter(cellsB)); } for (auto &idA : cellsA) { for (auto &idB : cellsB) { InterPolys(idA, idB); } } } } lines->RemoveDeletedCells(); contA = vtkIdTypeArray::SafeDownCast(lines->GetCellData()->GetScalars("cA")); contB = vtkIdTypeArray::SafeDownCast(lines->GetCellData()->GetScalars("cB")); sourcesA = vtkIdTypeArray::SafeDownCast(lines->GetCellData()->GetScalars("sourcesA")); sourcesB = vtkIdTypeArray::SafeDownCast(lines->GetCellData()->GetScalars("sourcesB")); // contA und contB aktualisieren auto oldCellIdsA = vtkSmartPointer::New(); auto oldCellIdsB = vtkSmartPointer::New(); oldCellIdsA->SetName("OldCellIds"); oldCellIdsB->SetName("OldCellIds"); vtkIdType numCellsA = newPdA->GetNumberOfCells(); vtkIdType numCellsB = newPdB->GetNumberOfCells(); oldCellIdsA->SetNumberOfValues(numCellsA); oldCellIdsB->SetNumberOfValues(numCellsB); vtkIdType i; for (i = 0; i < numCellsA; i++) { oldCellIdsA->SetValue(i, i); } for (i = 0; i < numCellsB; i++) { oldCellIdsB->SetValue(i, i); } newPdA->GetCellData()->AddArray(oldCellIdsA); newPdB->GetCellData()->AddArray(oldCellIdsB); for (auto& [k, v] : replsA) { newPdA->DeleteCell(k); } for (auto& [k, v] : replsB) { newPdB->DeleteCell(k); } newPdA->RemoveDeletedCells(); newPdB->RemoveDeletedCells(); numCellsA = newPdA->GetNumberOfCells(); numCellsB = newPdB->GetNumberOfCells(); oldCellIdsA = vtkIdTypeArray::SafeDownCast(newPdA->GetCellData()->GetScalars("OldCellIds")); oldCellIdsB = vtkIdTypeArray::SafeDownCast(newPdB->GetCellData()->GetScalars("OldCellIds")); std::map newCellIdsA, newCellIdsB; auto iterA = vtkArrayIteratorTemplate::New(); iterA->Initialize(oldCellIdsA); for (i = 0; i < numCellsA; i++) { newCellIdsA.emplace(iterA->GetValue(i), i); } auto iterB = vtkArrayIteratorTemplate::New(); iterB->Initialize(oldCellIdsB); for (i = 0; i < numCellsB; i++) { newCellIdsB.emplace(iterB->GetValue(i), i); } vtkIdType numLines = lines->GetNumberOfCells(); try { auto _iterA = vtkArrayIteratorTemplate::New(); _iterA->Initialize(contA); for (i = 0; i < numLines; i++) { _iterA->SetValue(i, newCellIdsA.at(_iterA->GetValue(i))); } auto _iterB = vtkArrayIteratorTemplate::New(); _iterB->Initialize(contB); for (i = 0; i < numLines; i++) { _iterB->SetValue(i, newCellIdsB.at(_iterB->GetValue(i))); } } catch (const std::out_of_range &e) { throw std::runtime_error(""); } newPdA->GetCellData()->RemoveArray("OldCellIds"); newPdB->GetCellData()->RemoveArray("OldCellIds"); } ================================================ FILE: Contact.h ================================================ /* Copyright 2012-2025 Ronald Römer Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ #ifndef __Contact_h #define __Contact_h #include "Utilities.h" #include #include #include enum class Src { A, B }; enum class End { None, A, B }; enum class PointSrc { Calculated, Copied }; class InterPt { public: InterPt () = delete; InterPt (double x, double y, double z, double t, vtkIdType a, vtkIdType b, End end, Src src, PointSrc pointSrc) : t(t), edge(a, b), end(end), src(src), srcA(NOTSET), srcB(NOTSET), pointSrc(pointSrc) { pt[0] = x; pt[1] = y; pt[2] = z; } double pt[3], t; Pair edge; End end; Src src; vtkIdType srcA, srcB; PointSrc pointSrc; friend std::ostream& operator<< (std::ostream &out, const InterPt &s) { out << "pt [" << s.pt[0] << ", " << s.pt[1] << ", " << s.pt[2] << "]" << ", t " << s.t << ", edge " << s.edge << ", end " << s.end << ", src " << s.src << ", pointSrc " << s.pointSrc; return out; } void Merge (const InterPt &other) { assert(src != other.src); if (src == Src::A) { srcA = GetEnd(); } else { srcB = GetEnd(); } if (std::abs(other.t-t) < 1e-5) { if (other.src == Src::A) { srcA = other.GetEnd(); } else { srcB = other.GetEnd(); } } } inline vtkIdType GetEnd () const { if (end == End::A) { return edge.f; } if (end == End::B) { return edge.g; } return NOTSET; } }; typedef std::vector InterPtsType; typedef std::vector> OverlapsType; typedef std::set NonManifoldEdgesType; typedef std::vector> PairsType; vtkSmartPointer Clean (vtkPolyData *pd); class Contact { public: Contact () = delete; Contact (vtkPolyData *newPdA, vtkPolyData *newPdB); vtkPolyData *newPdA, *newPdB; vtkSmartPointer pts; vtkSmartPointer lines; vtkSmartPointer contA, contB, sourcesA, sourcesB; bool touchesEdgesA, touchesEdgesB; NonManifoldEdgesType edgesA, edgesB; vtkSmartPointer treeA, treeB; vtkSmartPointer GetLines (vtkPolyData *pdA = nullptr, vtkLinearTransform *transA = nullptr, vtkPolyData *pdB = nullptr, vtkLinearTransform *transB = nullptr); void GetNonManifoldEdges (vtkPolyData *pd, NonManifoldEdgesType &edges); void InterEdgeLine (InterPtsType &interPts, const Point3d &pA, const Point3d &pB, Src src); bool InterPolyLine (InterPtsType &interPts, const Base2 &base, const Poly &poly, Src src); void InterPolys (vtkIdType idA, vtkIdType idB); bool CheckInters (const InterPtsType &interPts, vtkPolyData *pd); void OverlapLines (OverlapsType &overlaps, InterPtsType &intersA, InterPtsType &intersB); void AddContactLines (InterPtsType &intersA, InterPtsType &intersB, vtkIdType idA, vtkIdType idB); static int InterNodes (vtkOBBNode *nodeA, vtkOBBNode *nodeB, vtkMatrix4x4 *vtkNotUsed(matrix), void *ptr); PairsType pairs; std::map replsA, replsB; void IntersectReplacements (); }; #endif ================================================ FILE: LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS ================================================ FILE: Merger.cxx ================================================ /* Copyright 2012-2025 Ronald Römer Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ #include "Merger.h" #include Merger::Merger (vtkPolyData *pd, const PStrips &pStrips, const StripsType &strips, const IdsType &descIds, vtkIdType origId) : pd(pd), pStrips(pStrips), origId(origId) { const StripPtsType &pts = pStrips.pts; const Base &base = pStrips.base; vtkIdType i, num; const vtkIdType *cell; double pt[3]; for (auto id : descIds) { pd->GetCellPoints(id, num, cell); Poly p; for (i = 0; i < num; i++) { pd->GetPoint(cell[i], pt); double proj[2]; Transform(pt, proj, base); p.emplace_back(proj[0], proj[1], 0, cell[i]); } polys.push_back(p); pd->DeleteCell(id); } for (auto &strip : strips) { Poly p; for (auto &sp : strip) { const double *pt = pts.at(sp.ind).pt; double proj[2]; Transform(pt, proj, base); p.emplace_back(proj[0], proj[1], 0, NOTSET, sp.ind); } p.pop_back(); double n[3]; ComputeNormal(p, n); if (n[2] < 0) { Poly q(p.rbegin(), p.rend()); p.swap(q); } innerIds.push_back(polys.size()); polys.push_back(p); } } void Merger::Run () { // mergen mit hilfe von vtkKdTree und vtkModifiedBSPTree vtkPoints *pdPts = pd->GetPoints(); vtkIdTypeArray *origCellIds = vtkIdTypeArray::SafeDownCast(pd->GetCellData()->GetScalars("OrigCellIds")); assert(origCellIds != nullptr); std::vector groups(polys.size()); PolysType::const_iterator itrA, itrB; std::size_t i {0}; for (itrA = polys.begin(); itrA != polys.end(); ++itrA) { if (std::find(innerIds.begin(), innerIds.end(), i) != innerIds.end()) { std::size_t j {0}; for (itrB = polys.begin(); itrB != polys.end(); ++itrB) { if (itrA != itrB && PointInPoly(*itrB, *itrA->begin())) { groups[j].push_back(i); } j++; } } i++; } std::size_t parent = 0; for (auto &group : groups) { GroupType parents; for (auto &index : group) { const GroupType &_group = groups[index]; parents.insert(parents.end(), _group.begin(), _group.end()); } std::sort(group.begin(), group.end()); std::sort(parents.begin(), parents.end()); GroupType _group {parent++}; std::set_difference(group.begin(), group.end(), parents.begin(), parents.end(), std::back_inserter(_group)); #ifdef DEBUG std::cout << "["; for (auto &index : _group) { std::cout << index << ", "; } std::cout << "]" << std::endl; #endif PolysType merged; MergeGroup(_group, merged); std::map newIds; for (auto &poly : merged) { auto newCell = vtkSmartPointer::New(); for (auto &p : poly) { vtkIdType id = p.id; if (id == NOTSET) { auto itr = newIds.find(p.otherId); if (itr == newIds.end()) { auto &q = pStrips.pts.at(p.otherId); id = pdPts->InsertNextPoint(q.pt); newIds.emplace(p.otherId, id); } else { id = itr->second; } } newCell->InsertNextId(id); } pd->InsertNextCell(VTK_POLYGON, newCell); origCellIds->InsertNextValue(origId); } } } void Merger::MergeGroup (const GroupType &group, PolysType &merged) { if (group.size() == 1) { merged.push_back(polys.at(group.back())); return; } auto pts = vtkSmartPointer::New(); pts->SetDataTypeToDouble(); IndexedPolysType indexedPolys; ReferencedPointsType refPts; SourcesType sources; std::size_t src = 0; for (auto &index : group) { const Poly &poly = polys.at(index); IndexedPoly ids; for (auto &p : poly) { vtkIdType id = pts->InsertNextPoint(p.x, p.y, p.z); ids.push_back(id); sources.emplace(id, src); refPts.emplace(id, p); } indexedPolys.push_back(std::move(ids)); src++; } auto kdTree = vtkSmartPointer::New(); kdTree->OmitZPartitioning(); kdTree->BuildLocatorFromPoints(pts); auto linesA = vtkSmartPointer::New(); linesA->SetPoints(pts); linesA->Allocate(1); IndexedPoly::const_iterator itrA, itrB; for (const auto &ids : indexedPolys) { for (itrA = ids.begin(); itrA != ids.end(); ++itrA) { itrB = itrA+1; if (itrB == ids.end()) { itrB = ids.begin(); } vtkIdList *line = vtkIdList::New(); line->InsertNextId(*itrA); line->InsertNextId(*itrB); linesA->InsertNextCell(VTK_LINE, line); line->Delete(); } } #ifdef DEBUG WriteVTK("linesA.vtk", linesA); #endif auto bspTreeA = vtkSmartPointer::New(); bspTreeA->SetDataSet(linesA); int n = 0; PolyConnsType polyConns; FindConns(linesA, kdTree, bspTreeA, polyConns, indexedPolys, sources, n); PolyConnsType connected {{0, {}}}; _IdsType restricted; // keine der conns darf im gleichen punkt beginnen auto linesB = vtkSmartPointer::New(); linesB->SetPoints(pts); linesB->Allocate(1); auto bspTreeB = vtkSmartPointer::New(); bspTreeB->SetDataSet(linesB); ConnsType firstConns; std::size_t i, numPolys = indexedPolys.size(); double ptA[3], ptB[3]; while (connected.size() < numPolys) { bool foundOne = false; for (i = 1; i < numPolys; i++) { if (connected.count(i) == 0) { const ConnsType &conns = polyConns[i]; for (auto &conn : conns) { if (connected.count(sources.at(conn.j)) == 1 && restricted.count(conn.j) == 0) { pts->GetPoint(conn.i, ptA); pts->GetPoint(conn.j, ptB); if (bspTreeB->IntersectWithLine(ptA, ptB, 1e-5, nullptr, nullptr) == 0) { connected[sources.at(conn.i)].push_back(conn); // das andere poly auch aktualisieren connected[sources.at(conn.j)].emplace_back(conn.d, conn.j, conn.i); restricted.insert(conn.i); restricted.insert(conn.j); vtkIdList *line = vtkIdList::New(); line->InsertNextId(conn.i); line->InsertNextId(conn.j); linesB->InsertNextCell(VTK_LINE, line); line->Delete(); bspTreeB->Modified(); foundOne = true; firstConns.push_back(conn); break; } } } } } if (!foundOne) { if (!FindConns(linesA, kdTree, bspTreeA, polyConns, indexedPolys, sources, n)) { throw std::runtime_error("Merging failed."); } } } std::map> chains; PolyConnsType::const_iterator itrC; for (itrC = connected.begin(); itrC != connected.end(); ++itrC) { auto &chain = chains[itrC->first]; chain.push_back(itrC->first); while (chain.back() != 0) { chain.push_back(sources.at(connected.at(chain.back()).front().j)); } } #ifdef DEBUG std::cout << connected; decltype(chains)::const_iterator itrD; for (itrD = chains.begin(); itrD != chains.end(); ++itrD) { std::cout << itrD->first << ": ["; for (auto &id : itrD->second) { std::cout << id << ", "; } std::cout << "]" << std::endl; } #endif std::set solved {0}; std::deque searchInds; for (i = 1; i < numPolys; i++) { if (connected.at(i).size() == 1) { searchInds.push_back(i); } } while (!searchInds.empty()) { PriosType prios; for (auto ind : searchInds) { PolyPriosType polyPrios; #ifdef DEBUG std::cout << "ind " << ind << std::endl; #endif const Conn &first = connected.at(ind).back(); for (auto &conn : polyConns.at(ind)) { auto &src = sources.at(conn.j); if (polyPrios.count(src) == 1) { continue; } if (conn.i != first.i && conn.j != first.j && restricted.count(conn.i) == 0 && restricted.count(conn.j) == 0) { pts->GetPoint(conn.i, ptA); pts->GetPoint(conn.j, ptB); if (bspTreeB->IntersectWithLine(ptA, ptB, 1e-5, nullptr, nullptr) == 0) { auto &chainA = chains.at(ind), &chainB = chains.at(src); std::set _chainA(chainA.begin(), chainA.end()), _chainB(chainB.begin(), chainB.end()); // gemeinsame eltern std::set shared; std::set_intersection(_chainA.begin(), _chainA.end(), _chainB.begin(), _chainB.end(), std::inserter(shared, shared.end())); // gemeinsame eltern müssen sich alle in solved befinden if (std::includes(solved.begin(), solved.end(), shared.begin(), shared.end())) { std::set solvable; std::set_difference(_chainA.begin(), _chainA.end(), solved.begin(), solved.end(), std::inserter(solvable, solvable.end())); std::set_difference(_chainB.begin(), _chainB.end(), solved.begin(), solved.end(), std::inserter(solvable, solvable.end())); polyPrios.emplace(std::piecewise_construct, std::forward_as_tuple(src), std::forward_as_tuple(conn, solvable, -conn.d)); } } } } PolyPriosType::const_iterator itr; for (itr = polyPrios.begin(); itr != polyPrios.end(); ++itr) { prios.insert(itr->second); } } if (!prios.empty()) { auto &prio = *prios.rbegin(); #ifdef DEBUG std::cout << "found " << prio << std::endl; #endif auto &conns = connected.at(sources.at(prio.conn.i)); conns.push_back(prio.conn); connected.at(sources.at(prio.conn.j)).emplace_back(prio.conn.d, prio.conn.j, prio.conn.i); restricted.insert(prio.conn.i); restricted.insert(prio.conn.j); vtkIdList *line = vtkIdList::New(); line->InsertNextId(prio.conn.i); line->InsertNextId(prio.conn.j); linesB->InsertNextCell(VTK_LINE, line); line->Delete(); bspTreeB->Modified(); solved.insert(prio.solvable.begin(), prio.solvable.end()); searchInds.erase(std::find(searchInds.begin(), searchInds.end(), sources.at(prio.conn.i))); auto itr = std::find(searchInds.begin(), searchInds.end(), sources.at(prio.conn.j)); if (itr != searchInds.end()) { searchInds.erase(itr); } } else { if (!FindConns(linesA, kdTree, bspTreeA, polyConns, indexedPolys, sources, n)) { break; } } } #ifdef DEBUG std::cout << connected; #endif // fallback double pt[3]; if (!searchInds.empty()) { for (auto ind : searchInds) { std::vector newChain; for (auto c : chains.at(ind)) { if (solved.find(c) != solved.end()) { break; } newChain.push_back(c); } ConnsType &conns = connected.at(ind); decltype(newChain)::const_reverse_iterator itr; for (itr = newChain.rbegin(); itr != newChain.rend(); itr++) { // gesucht ist hier die kürzeste verbindung #ifdef DEBUG std::cout << "itr " << *itr << std::endl; #endif // polyConns.at(*itr) ist nach d sortiert std::shared_ptr found; for (auto &conn : polyConns.at(*itr)) { auto &src = sources.at(conn.j); if (solved.find(src) != solved.end()) { if (restricted.count(conn.i) == 0 // && restricted.count(conn.j) == 0 && std::find_if(conns.begin(), conns.end(), [&conn](const Conn &other) { return conn.i == other.i || conn.j == other.j; }) == conns.end()) { pts->GetPoint(conn.i, ptA); pts->GetPoint(conn.j, ptB); auto intersPts = vtkSmartPointer::New(); intersPts->SetDataTypeToDouble(); auto c = bspTreeB->IntersectWithLine(ptA, ptB, 1e-5, intersPts, nullptr); if (c == 0) { found = std::make_shared(conn); break; } // wenn schnittpunkte existieren, dann müssen alle mit ptB übereinstimmen vtkIdType i, numPts = intersPts->GetNumberOfPoints(); std::set foundPts {{ptB[0], ptB[1], ptB[2]}}; for (i = 0; i < numPts; i++) { intersPts->GetPoint(i, pt); foundPts.emplace(pt[0], pt[1], pt[2]); } if (foundPts.size() == 1) { found = std::make_shared(conn); break; } } } } if (found) { #ifdef DEBUG std::cout << "found " << *found << std::endl; #endif conns.push_back(*found); connected.at(sources.at(found->j)).emplace_back(found->d, found->j, found->i); restricted.insert(found->i); restricted.insert(found->j); vtkIdList *line = vtkIdList::New(); line->InsertNextId(found->i); line->InsertNextId(found->j); linesB->InsertNextCell(VTK_LINE, line); line->Delete(); bspTreeB->Modified(); solved.insert(*itr); } else { throw std::runtime_error("Merging failed."); } } } } #ifdef DEBUG WriteVTK("linesB.vtk", linesB); #endif ConnsType2 usedConns(firstConns.begin(), firstConns.end()); IndexedPoly polyA {indexedPolys.front()}; MergeStage1(indexedPolys, refPts, sources, firstConns, polyA); IndexedPolysType splitted {polyA}; ConnsType2 leftConns; for (itrC = connected.begin(); itrC != connected.end(); ++itrC) { if (itrC->first == 0) { continue; } auto &conns = itrC->second; ConnsType::const_iterator itr; for (itr = conns.begin()+1; itr != conns.end(); ++itr) { Conn conn(0, itr->j, itr->i); if (usedConns.find(conn) == usedConns.end()) { if (itr->i < itr->j) { leftConns.emplace(0, itr->i, itr->j); } else { leftConns.insert(std::move(conn)); } } } } #ifdef DEBUG std::cout << "leftConns: ["; for (auto &conn : leftConns) { std::cout << conn << ", "; } std::cout << "]" << std::endl; #endif MergeStage2(leftConns, refPts, usedConns, splitted); PolysType newPolys; GetPolys(refPts, splitted, newPolys); #ifdef DEBUG WritePolys("merged_stage2.vtk", newPolys); #endif std::move(newPolys.begin(), newPolys.end(), std::back_inserter(merged)); } bool Merger::FindConns (vtkPolyData *lines, vtkSmartPointer kdTree, vtkSmartPointer bspTree, PolyConnsType &polyConns, const IndexedPolysType &indexedPolys, const SourcesType &sources, int &n) { vtkPoints *pts = lines->GetPoints(); if (n > pts->GetNumberOfPoints()) { return false; } n += 10; auto foundPts = vtkSmartPointer::New(); vtkIdType i, numPts; vtkIdType idB; auto lineIds = vtkSmartPointer::New(); double ptA[3], ptB[3]; bool good; vtkIdType j; vtkIdType _idA, _idB; std::map> _polyConns; auto line = vtkSmartPointer::New(); for (const auto &ids : indexedPolys) { for (vtkIdType idA : ids) { pts->GetPoint(idA, ptA); kdTree->FindClosestNPoints(n, ptA, foundPts); numPts = foundPts->GetNumberOfIds(); for (i = 0; i < numPts; i++) { idB = foundPts->GetId(i); auto srcA = sources.at(idA), srcB = sources.at(idB); if (srcA == srcB) { continue; } pts->GetPoint(idB, ptB); good = true; if (bspTree->IntersectWithLine(ptA, ptB, 1e-5, nullptr, lineIds) == 1) { for (j = 0; j < lineIds->GetNumberOfIds(); j++) { lines->GetCellPoints(lineIds->GetId(j), line); _idA = line->GetId(0); _idB = line->GetId(1); if (_idA != idA && _idA != idB && _idB != idA && _idB != idB) { good = false; break; } } } if (good) { double d = vtkMath::Distance2BetweenPoints(ptA, ptB); _polyConns[srcA].emplace(d, idA, idB); _polyConns[srcB].emplace(d, idB, idA); } } } } decltype(_polyConns)::const_iterator itr; for (itr = _polyConns.begin(); itr != _polyConns.end(); ++itr) { auto &_conns = itr->second; ConnsType conns(_conns.begin(), _conns.end()); std::sort(conns.begin(), conns.end()); polyConns[itr->first].swap(conns); } return true; } void Merger::MergeStage1 (const IndexedPolysType &indexedPolys, [[maybe_unused]] const ReferencedPointsType &refPts, const SourcesType &sources, const ConnsType &conns, IndexedPoly &polyA) { for (const auto &conn : conns) { auto itrA = std::find(polyA.begin(), polyA.end(), conn.j); assert(itrA != polyA.end()); IndexedPoly polyB(indexedPolys.at(sources.at(conn.i))); auto itrB = std::find(polyB.begin(), polyB.end(), conn.i); assert(itrB != polyB.end()); std::rotate(polyA.begin(), itrA, polyA.end()); std::rotate(polyB.begin(), itrB, polyB.end()); IndexedPoly newPoly {polyA}; newPoly.push_back(polyA.front()); newPoly.push_back(polyB.front()); newPoly.insert(newPoly.end(), polyB.rbegin(), polyB.rend()); polyA.swap(newPoly); } #ifdef DEBUG PolysType newPolys; GetPolys(refPts, {polyA}, newPolys); WritePolys("merged_stage1.vtk", newPolys); #endif } void Merger::MergeStage2 (const ConnsType2 &conns, const ReferencedPointsType &refPts, const ConnsType2 &usedConns, IndexedPolysType &splitted) { std::set endPts; for (const Conn &conn : usedConns) { endPts.emplace(refPts.at(conn.i)); endPts.emplace(refPts.at(conn.j)); } IndexedPolysType::iterator itr; double vA[3], vB[3], w[3], ang, phi; const double n[] = {0, 0, 1}; IndexedPoly::iterator itrA, itrB; IndexedPoly::iterator prev, next; for (auto &conn : conns) { for (itr = splitted.begin(); itr != splitted.end(); ++itr) { IndexedPoly poly(itr->begin(), itr->end()); if (endPts.count(refPts.at(conn.i)) == 0) { itrA = std::find(poly.begin(), poly.end(), conn.i); } else { Point3d::GetVec(refPts.at(conn.i), refPts.at(conn.j), w); itrA = poly.begin(); while ((itrA = std::find(itrA, poly.end(), conn.i)) != poly.end()) { next = itrA+1; if (next == poly.end()) { next = poly.begin(); } if (itrA == poly.begin()) { prev = poly.end()-1; } else { prev = itrA-1; } Point3d::GetVec(refPts.at(conn.i), refPts.at(*next), vA); Point3d::GetVec(refPts.at(conn.i), refPts.at(*prev), vB); ang = GetAngle(vA, vB, n); phi = GetAngle(vA, w, n); if (phi < ang) { break; } ++itrA; } } if (itrA == poly.end()) { continue; } std::rotate(poly.begin(), itrA, poly.end()); if (endPts.count(refPts.at(conn.j)) == 0) { itrB = std::find(poly.begin(), poly.end(), conn.j); } else { Point3d::GetVec(refPts.at(conn.j), refPts.at(conn.i), w); itrB = poly.begin(); while ((itrB = std::find(itrB, poly.end(), conn.j)) != poly.end()) { next = itrB+1; if (next == poly.end()) { next = poly.begin(); } if (itrB == poly.begin()) { prev = poly.end()-1; } else { prev = itrB-1; } Point3d::GetVec(refPts.at(conn.j), refPts.at(*next), vA); Point3d::GetVec(refPts.at(conn.j), refPts.at(*prev), vB); ang = GetAngle(vA, vB, n); phi = GetAngle(vA, w, n); if (phi < ang) { break; } ++itrB; } } if (itrB == poly.end()) { continue; } IndexedPoly newPolyA(poly.begin(), itrB+1); IndexedPoly newPolyB(itrB, poly.end()); newPolyB.push_back(poly.front()); splitted.erase(itr); splitted.push_back(std::move(newPolyA)); splitted.push_back(std::move(newPolyB)); endPts.emplace(refPts.at(conn.i)); endPts.emplace(refPts.at(conn.j)); break; } } } ================================================ FILE: Merger.h ================================================ /* Copyright 2012-2025 Ronald Römer Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ #ifndef __Merger_h #define __Merger_h #include "vtkPolyDataBooleanFilter.h" typedef std::vector GroupType; typedef std::map SourcesType; class Conn { public: Conn () = delete; Conn (double d, vtkIdType i, vtkIdType j) : d(d), i(i), j(j) {} double d; vtkIdType i, j; bool operator< (const Conn &other) const { return d < other.d; } friend std::ostream& operator<< (std::ostream &out, const Conn &c) { out << "Conn(d=" << c.d << ", i=" << c.i << ", j=" << c.j << ")"; return out; } }; struct ConnCmp { bool operator() (const Conn &a, const Conn &b) const { return std::tie(a.i, a.j) < std::tie(b.i, b.j); } }; typedef std::vector ConnsType; typedef std::map PolyConnsType; typedef std::set ConnsType2; inline std::ostream& operator<< (std::ostream &out, const PolyConnsType& polyConns) { PolyConnsType::const_iterator itr; for (itr = polyConns.begin(); itr != polyConns.end(); ++itr) { out << itr->first << ": ["; for (auto &conn : itr->second) { out << conn << ", "; } out << "]" << std::endl; } return out; } class Prio { public: Prio () = delete; Prio (const Conn &conn, const std::set &solvable, double d) : conn(conn), solvable(solvable), d(d) {} Conn conn; std::set solvable; double d; friend std::ostream& operator<< (std::ostream &out, const Prio &p) { out << "Prio(conn=" << p.conn << ", d=" << p.d << ")"; return out; } }; struct Cmp { bool operator() (const Prio &a, const Prio &b) const { const auto _a = a.solvable.size(), _b = b.solvable.size(); return std::tie(_a, a.d) < std::tie(_b, b.d); } }; typedef std::set PriosType; typedef std::map PolyPriosType; class Merger { vtkPolyData *pd; const PStrips &pStrips; vtkIdType origId; PolysType polys; std::vector innerIds; public: Merger () = delete; Merger (vtkPolyData *pd, const PStrips &pStrips, const StripsType &strips, const IdsType &descIds, vtkIdType origId); void Run (); private: void MergeGroup (const GroupType &group, PolysType &merged); bool FindConns (vtkPolyData *lines, vtkSmartPointer kdTree, vtkSmartPointer bspTree, PolyConnsType &polyConns, const IndexedPolysType &indexedPolys, const SourcesType &sources, int &n); void MergeStage1 (const IndexedPolysType &indexedPolys, const ReferencedPointsType &refPts, const SourcesType &sources, const ConnsType &conns, IndexedPoly &polyA); void MergeStage2 (const ConnsType2 &conns, const ReferencedPointsType &refPts, const ConnsType2 &usedConns, IndexedPolysType &splitted); }; #endif ================================================ FILE: Optimize.cxx ================================================ /* Copyright 2012-2025 Ronald Römer Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ #include "Optimize.h" #include #include #include #include #include // #define _DEBUG PreventEqualCaptPoints::PreventEqualCaptPoints (vtkPolyData *pdA, vtkPolyData *pdB) : pdA(pdA), pdB(pdB) {} void PreventEqualCaptPoints::Run () { #ifdef _DEBUG WriteVTK("captA.vtk", pdA); WriteVTK("captB.vtk", pdB); #endif pdA->BuildLinks(); pdB->BuildLinks(); Find(pdA, pdB, "A"); #ifdef _DEBUG WriteVTK("modB.vtk", pdB); #endif Find(pdB, pdA, "B"); #ifdef _DEBUG WriteVTK("modA.vtk", pdA); #endif } void PreventEqualCaptPoints::Find (vtkPolyData *pd, vtkPolyData *other, [[maybe_unused]] const std::string &name) { #ifdef _DEBUG std::cout << "Find(" << name << ")" << std::endl; #endif vtkIdType num; const vtkIdType *poly; vtkIdType i, j; std::set lines; auto polyItr = vtk::TakeSmartPointer(pd->GetPolys()->NewIterator()); for (polyItr->GoToFirstCell(); !polyItr->IsDoneWithTraversal(); polyItr->GoToNextCell()) { polyItr->GetCurrentCell(num, poly); for (i = 0; i < num; i++) { j = i+1; if (j == num) { j = 0; } if (poly[i] < poly[j]) { lines.emplace(poly[i], poly[j]); } else { lines.emplace(poly[j], poly[i]); } } } auto tree = vtkSmartPointer::New(); tree->SetDataSet(other); tree->BuildLocator(); auto pts = vtkSmartPointer::New(); pts->SetDataTypeToDouble(); auto cells = vtkSmartPointer::New(); double pA[3], pB[3]; vtkIdType cellId; double tr[2]; #ifdef _DEBUG auto pdVerts = vtkSmartPointer::New(); pdVerts->Allocate(1); auto ptsVerts = vtkSmartPointer::New(); ptsVerts->SetDataTypeToDouble(); #endif std::map> pointSnaps; std::map> edgeSnaps; for (auto &line : lines) { pd->GetPoint(line.f, pA); pd->GetPoint(line.g, pB); if (tree->IntersectWithLine(pA, pB, 1e-5, pts, cells) == 0) { continue; } for (i = 0; i < pts->GetNumberOfPoints(); i++) { const double *pt = pts->GetPoint(i); Point3d sA(pt[0], pt[1], pt[2]); cellId = cells->GetId(i); other->GetCellPoints(cellId, num, poly); Base base(other->GetPoints(), num, poly); Poly polyA, polyB; GetPoly(other->GetPoints(), num, poly, polyA); FlattenPoly(polyA, polyB, base); Transform(pt, tr, base); Point3d sB(tr[0], tr[1], 0); if (PointInPoly(polyB, sB)) { #ifdef _DEBUG auto vert = vtkSmartPointer::New(); vert->InsertNextId(ptsVerts->InsertNextPoint(pt)); pdVerts->InsertNextCell(VTK_VERTEX, vert); #endif // snap auf ecke oder kante? auto snap = std::find_if(polyA.begin(), polyA.end(), [&](const Point3d &p) { return Point3d::GetDist(p, sA) < 1e-10; }); if (snap != polyA.end()) { double d = Point3d::GetDist(*snap, sA); pointSnaps[snap->id].emplace_back(cellId, line, *snap, sA, d); } else { // projektion auf kante auto edgeProj = GetEdgeProj(polyA, sA); if (edgeProj != nullptr) { edgeSnaps[edgeProj->proj].emplace_back(cellId, line, edgeProj->edge, edgeProj->proj, sA, edgeProj->d); } } } } } for (const auto& [id, snaps] : pointSnaps) { if (snaps.size() > 1) { #ifdef _DEBUG std::cout << "id " << id << ", snaps" << std::endl; for (const auto &s : snaps) { std::cout << s << std::endl; } #endif std::set allLines; std::transform(snaps.begin(), snaps.end(), std::inserter(allLines, allLines.end()), [](const SnapPoint &p) { return p.line; }); #ifdef _DEBUG std::cout << "allLines" << std::endl; for (const auto &line : allLines) { std::cout << line << std::endl; } #endif auto itrA = snaps.begin(); decltype(itrA) itrB; double d; bool collapse = true; for (; itrA != snaps.end()-1 && collapse; ++itrA) { for (itrB = itrA+1; itrB < snaps.end(); ++itrB) { d = Point3d::GetDist(itrA->inter, itrB->inter); #ifdef _DEBUG std::cout << d << std::endl; #endif if (d > 1e-10) { collapse = false; break; } } } if (collapse) { continue; } if (allLines.size() == 1) { std::shared_ptr proj; ProjOnLine(pd, snaps.back().line, snaps.back().point, proj); PreventEqualCaptPoints::MovePoint(other, id, *proj); } else { // gemeinsamen punkt ermitteln std::set allIds; for (auto &line : allLines) { allIds.insert(line.f); allIds.insert(line.g); } if (allIds.size() == allLines.size()+1) { std::vector _allLines(allLines.begin(), allLines.end()); vtkIdType s = _allLines[0] & _allLines[1]; #ifdef _DEBUG std::cout << "line " << _allLines[0] << " & " << _allLines[1] << " -> " << s << std::endl; #endif double pt[3]; pd->GetPoint(s, pt); Point3d p(pt[0], pt[1], pt[2]); PreventEqualCaptPoints::MovePoint(other, id, p); } else { throw std::runtime_error(""); } } } } using Snap = std::tuple; struct Cmp { bool operator() (const Snap &l, const Snap &r) const { return std::get<2>(l) < std::get<2>(r); } }; std::map> allEdgeSnaps; double pt[3], t; for (const auto& [proj, snaps] : edgeSnaps) { if (snaps.size() > 1) { if (snaps.size() > 2) { #ifdef _DEBUG std::cout << proj << std::endl; for (const auto &s : snaps) { std::cout << s << std::endl; auto &line = s.line; pd->GetPoint(line.f, pA); pd->GetPoint(line.g, pB); std::cout << Point3d(pA[0], pA[1], pA[2]) << std::endl; std::cout << Point3d(pB[0], pB[1], pB[2]) << std::endl; } #endif continue; } const auto &snapA = snaps[0]; const auto &snapB = snaps[1]; { Pair edge(snapA.edge); if (edge.f > edge.g) { std::swap(edge.f, edge.g); } std::shared_ptr p; if (snapA.line == snapB.line) { ProjOnLine(pd, snapA.line, snapA.proj, p); } else { vtkIdType s = snapA.line & snapB.line; pd->GetPoint(s, pt); p = std::make_shared(pt[0], pt[1], pt[2]); } other->GetPoint(edge.f, pt); Point3d q(pt[0], pt[1], pt[2]); t = Point3d::GetDist(q, snapA.proj); allEdgeSnaps[edge].emplace(snapA, *p, t); } } } std::map newCells; for (const auto& [edge, data] : allEdgeSnaps) { Points pts; for (const auto &d : data) { const auto &p = std::get<1>(d); pts.emplace_back(p.x, p.y, p.z, other->GetPoints()->InsertNextPoint(p.x, p.y, p.z)); } const auto &first = std::get<0>(*(data.begin())); auto neigs = vtkSmartPointer::New(); other->GetCellEdgeNeighbors(first.cellId, first.edge.f, first.edge.g, neigs); if (neigs->GetNumberOfIds() != 1) { throw std::runtime_error(""); } vtkIdType neig = neigs->GetId(0); auto _edge = Pair(first.edge.g, first.edge.f); if (edge == first.edge) { std::for_each(pts.begin(), pts.end(), [&](const Point3d &p) { newCells[first.cellId][first.edge].emplace_back(p); }); std::for_each(pts.rbegin(), pts.rend(), [&](const Point3d &p) { newCells[neig][_edge].emplace_back(p); }); } else { std::for_each(pts.rbegin(), pts.rend(), [&](const Point3d &p) { newCells[first.cellId][first.edge].emplace_back(p); }); std::for_each(pts.begin(), pts.end(), [&](const Point3d &p) { newCells[neig][_edge].emplace_back(p); }); } } for (const auto& [cellId, edges] : newCells) { PreventEqualCaptPoints::TriangulateCell(other, cellId, edges); other->DeleteCell(cellId); } other->RemoveDeletedCells(); #ifdef _DEBUG pdVerts->SetPoints(ptsVerts); auto fileName = "verts" + name + ".vtk"; WriteVTK(fileName.c_str(), pdVerts); #endif } IdsType PreventEqualCaptPoints::TriangulateCell (vtkPolyData *pd, vtkIdType cellId, const Edges &edges) { vtkIdTypeArray *origCellIds = vtkIdTypeArray::SafeDownCast(pd->GetCellData()->GetScalars("OrigCellIds")); IdsType newCellIds; vtkIdType num; const vtkIdType *poly; pd->GetCellPoints(cellId, num, poly); Poly _poly; double pt[3]; vtkIdType i, j; vtkIdType newNum = num; for (i = 0; i < num; i++) { j = i+1; if (j == num) { j = 0; } pd->GetPoint(poly[i], pt); _poly.emplace_back(pt[0], pt[1], pt[2], poly[i]); Pair edge(poly[i], poly[j]); auto itr = edges.find(edge); if (itr != edges.end()) { auto &pts = itr->second; for (const auto &p : pts) { _poly.emplace_back(p); newNum++; } } } auto vtkPoly = vtkSmartPointer::New(); vtkPoly->GetPointIds()->SetNumberOfIds(newNum); vtkPoly->GetPoints()->SetNumberOfPoints(newNum); Base base(pd->GetPoints(), num, poly); Poly flattened; FlattenPoly(_poly, flattened, base); for (const auto &p : flattened) { vtkPoly->GetPointIds()->SetId(p.id, p.id); vtkPoly->GetPoints()->SetPoint(p.id, p.x, p.y, p.z); } auto triangles = vtkSmartPointer::New(); #if (VTK_MAJOR_VERSION >= 9 && VTK_MINOR_VERSION > 3) if (vtkPoly->TriangulateLocalIds(0, triangles) != 1) { throw std::runtime_error(""); } #else if (vtkPoly->Triangulate(triangles) != 1) { throw std::runtime_error(""); } #endif auto ids = vtkSmartPointer::New(); for (const auto &p : _poly) { ids->InsertNextId(p.id); } double pA[3], pB[3], pC[3]; for (i = 0; i < triangles->GetNumberOfIds(); i += 3) { pd->GetPoint(ids->GetId(triangles->GetId(i)), pA); pd->GetPoint(ids->GetId(triangles->GetId(i+1)), pB); pd->GetPoint(ids->GetId(triangles->GetId(i+2)), pC); Poly p = { {pA[0], pA[1], pA[2]}, {pB[0], pB[1], pB[2]}, {pC[0], pC[1], pC[2]} }; double quality = GetTriangleQuality(p); if (quality < 0.001) { throw std::runtime_error(""); } } vtkIdType origId = origCellIds->GetValue(cellId); auto triangle = vtkSmartPointer::New(); triangle->SetNumberOfIds(3); for (i = 0; i < triangles->GetNumberOfIds(); i += 3) { triangle->SetId(0, ids->GetId(triangles->GetId(i))); triangle->SetId(1, ids->GetId(triangles->GetId(i+1))); triangle->SetId(2, ids->GetId(triangles->GetId(i+2))); newCellIds.push_back(pd->InsertNextCell(VTK_TRIANGLE, triangle)); origCellIds->InsertNextValue(origId); } return newCellIds; } void PreventEqualCaptPoints::MovePoint (vtkPolyData *pd, vtkIdType ind, const Point3d &p) { auto cells = vtkSmartPointer::New(); pd->GetPointCells(ind, cells); vtkIdType i, cellId; for (i = 0; i < cells->GetNumberOfIds(); i++) { cellId = cells->GetId(i); if (pd->GetCellType(cellId) == VTK_POLYGON) { PreventEqualCaptPoints::TriangulateCell(pd, cellId, {}); pd->DeleteCell(cellId); } } #ifdef _DEBUG double pt[3]; pd->GetPoints()->GetPoint(ind, pt); Point3d q(pt[0], pt[1], pt[2]); std::cout << q << " -> " << p << std::endl; #endif pd->GetPoints()->SetPoint(ind, p.x, p.y, p.z); } ================================================ FILE: Optimize.h ================================================ /* Copyright 2012-2025 Ronald Römer Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ #ifndef __Optimize_h #define __Optimize_h #include "Utilities.h" typedef std::map Edges; class SnapPoint { public: SnapPoint () = delete; SnapPoint (vtkIdType cellId, const Pair &line, const Point3d &point, const Point3d &inter, double d) : cellId(cellId), line(line), point(point), inter(inter), d(d) {} vtkIdType cellId; Pair line; Point3d point; Point3d inter; double d; friend std::ostream& operator<< (std::ostream &out, const SnapPoint &s) { out << "cellId " << s.cellId << ", line " << s.line << ", point " << s.point << ", inter " << s.inter << ", d " << s.d; return out; } }; class SnapEdge { public: SnapEdge () = delete; SnapEdge (vtkIdType cellId, const Pair &line, const Pair &edge, const Point3d &proj, const Point3d &inter, double d) : cellId(cellId), line(line), edge(edge), proj(proj), inter(inter), d(d) {} vtkIdType cellId; Pair line; Pair edge; Point3d proj; Point3d inter; double d; friend std::ostream& operator<< (std::ostream &out, const SnapEdge &s) { out << "cellId " << s.cellId << ", line " << s.line << ", edge " << s.edge << ", proj " << s.proj << ", inter " << s.inter << ", d " << s.d; return out; } }; class PreventEqualCaptPoints { vtkPolyData *pdA, *pdB; public: static IdsType TriangulateCell (vtkPolyData *pd, vtkIdType cellId, const Edges &edges); static void MovePoint (vtkPolyData *pd, vtkIdType ind, const Point3d &p); PreventEqualCaptPoints () = delete; PreventEqualCaptPoints (vtkPolyData *pdA, vtkPolyData *pdB); void Run (); private: void Find (vtkPolyData *pd, vtkPolyData *other, const std::string &name); }; #endif ================================================ FILE: README.md ================================================ # vtkbool [![CMake](https://github.com/zippy84/vtkbool/actions/workflows/cmake.yml/badge.svg)](https://github.com/zippy84/vtkbool/actions/workflows/cmake.yml) [![codecov](https://codecov.io/gh/zippy84/vtkbool/branch/master/graph/badge.svg?token=EUV9QKEW1M)](https://codecov.io/gh/zippy84/vtkbool) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.10461186.svg)](https://zenodo.org/doi/10.5281/zenodo.10461186) ## About This is an extension of the graphics library VTK. The goal of the extension is to equip the library with rebust boolean operations on polygonal meshes. I started the project at the end of my studies in mechanical engineering at the University of Applied Sciences ([HTWK](http://htwk-leipzig.de/)) in Leipzig. I used VTK to develop a program, which I had to create for a paper. At this time I would have wished, that this feature already exists. There was several implementations from third parties, but after some tests, I came to the conclusion, that none of them worked correct. I decided to start with my own implementation. This library is the result of my efforts. ## Features - based on VTK - 4 operation types available (union, intersection, difference and difference2 - difference with interchanged operands) - triangulation is not needed - all types of polygonal cells are supported (triangles, quads, polygons, triangle-strips) - triangle-strips and quads will be transformed into triangles (quads only if their points are not on the same plane) - non-convex polygons are allowed - meshes can be stacked (coplanar polygons are right handled) - the meshes don’t need to be watertight - CellData is passed (attached by the rules of vtkAppendPolyData) - contact-lines are available in the 3th output - the filter is able to embed holes - compileable as ParaView plugin - Python wrapped ## Limitations - the filter assumes well defined triangles, quads and polygons - PointData is not preserved - you have to do your own mapping with *OrigCellIdsA* and *OrigCellIdsB* ## Requirements - CMake >= 3.12 - VTK >= 9.0 - C++17 compiler ### Optional - ParaView >= 5.0 - Python 3.x ## Library To include vtkbool into your program, you have to compile it as a library. All you need is an installation of VTK with header files. If you have installed VTK over your package manager, CMake is able to find the required files. Otherwise you have to set **VTK\_DIR** manually. It must be a path like */home/zippy/VTK9/lib/cmake/vtk-9.1* or *C:/Users/zippy/VTK9/lib/cmake/vtk-9.1*. The usage of the library is very simple. Look at the example in the section below. You can set the operation mode by calling one of the named methods: - `SetOperModeToNone` - `SetOperModeToUnion` - `SetOperModeToIntersection` - `SetOperModeToDifference` - `SetOperModeToDifference2` The alternative is the more generic `SetOperMode`. The method must be called with the number of the desired operation, an integer between 0 and 4, with the same meaning as mentioned before. The default is Union. ### C++ Example Create a directory somewhere in your file system, download vtkbool and unpack it into that. ``` mkdir example cd example git clone https://github.com/zippy84/vtkbool.git ``` Then create the following two files: **test.cxx** ```C++ #include #include #include #include #include "vtkPolyDataBooleanFilter.h" int main (int argc, char *argv[]) { auto cube = vtkSmartPointer::New(); cube->SetYLength(.5); auto cyl = vtkSmartPointer::New(); cyl->SetResolution(32); cyl->SetHeight(.5); cyl->SetCenter(0, .5, 0); auto bf = vtkSmartPointer::New(); bf->SetInputConnection(0, cube->GetOutputPort()); bf->SetInputConnection(1, cyl->GetOutputPort()); bf->SetOperModeToDifference(); auto writer = vtkSmartPointer::New(); writer->SetInputConnection(bf->GetOutputPort()); writer->SetFileName("result.vtk"); writer->Update(); return 0; } ``` **CMakeLists.txt** ```CMake cmake_minimum_required(VERSION 3.12 FATAL_ERROR) project(test) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # find_package(VTK REQUIRED COMPONENTS FiltersSources IOLegacy) find_package(VTK REQUIRED COMPONENTS FiltersSources IOLegacy FiltersExtraction FiltersGeometry FiltersModeling FiltersFlowPaths WrappingPythonCore) if(VTK_FOUND) include_directories(vtkbool) add_subdirectory(vtkbool) add_executable(test test.cxx) target_link_libraries(test PRIVATE vtkbool ${VTK_LIBRARIES}) vtk_module_autoinit( TARGETS test MODULES ${VTK_LIBRARIES} ) endif(VTK_FOUND) ``` Inside the `example` directory, create a subdirectory called `build` and `cd` into it. You should have a directory structure that looks something like this: ``` example ├── build ├── CMakeLists.txt ├── test.cxx └── vtkbool ├── CMakeLists.txt ├── ... └── vtkPolyDataBooleanFilter.h ``` From inside the `build` directory, run `ccmake ..`, follow the instructions, and finally type `make`. Running `./test` will now produce the `result.vtk` file. ## ParaView Plugin To build the plugin you have to compile ParaView from source. Download the current version from and follow the compilation instructions. As soon as ParaView is compiled, it may take a while, you can build the plugin by activating the **VTKBOOL_PARAVIEW** option within CMake. In CMake you also have to point to **ParaView_DIR** if CMake can't found it and it is not installed in a common location like */usr/lib* or */usr/local/lib*. Make sure **PARAVIEW_INSTALL_DEVELOPMENT_FILES** is set. When everything has been compiled successfully, you can install the plugin. ## Python The Python module will be generated automatically, if three conditions are met: - vtkbool is configured as a library - Python 3 is installed with header files - VTK itself is wrapped to Python After a successful compilation, the module can be used as follows: ```python #!/usr/bin/env python import sys sys.path.append('/path/to/your/build/directory') # also look into the python files in the testing directory from vtkmodules.vtkFiltersSources import vtkCubeSource, vtkSphereSource from vtkmodules.vtkIOLegacy import vtkPolyDataWriter from vtkbool import vtkPolyDataBooleanFilter cube = vtkCubeSource() sphere = vtkSphereSource() sphere.SetCenter(.5, .5, .5) sphere.SetThetaResolution(20) sphere.SetPhiResolution(20) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cube.GetOutputPort()) bf.SetInputConnection(1, sphere.GetOutputPort()) bf.SetOperModeToDifference() # write the result, if you want ... writer = vtkPolyDataWriter() writer.SetInputConnection(bf.GetOutputPort()) writer.SetFileName('result.vtk') writer.Update() ``` Or with VTK >= 9.4: ```python #!/usr/bin/env python import sys sys.path.append('/path/to/your/build/directory') from vtkmodules.vtkFiltersSources import vtkCubeSource, vtkSphereSource from vtkmodules.vtkIOLegacy import vtkPolyDataWriter from vtkmodules.util.execution_model import select_ports from vtkbool import vtkPolyDataBooleanFilter, OPER_DIFFERENCE cube = vtkCubeSource() sphere = vtkSphereSource(center=[.5, .5, .5], theta_resolution=20, phi_resolution=20) bf = vtkPolyDataBooleanFilter(oper_mode=OPER_DIFFERENCE) cube >> bf sphere >> select_ports(1, bf) (bf >> vtkPolyDataWriter(file_name='result.vtk')).update() ``` ## Conda The library is also available at [conda-forge](https://anaconda.org/conda-forge/vtkbool). In your virtual environment you can install the package with: ``` conda install -c conda-forge vtkbool ``` Unlike in the python example, you need to import it like this: ```python from vtkbool.vtkbool import vtkPolyDataBooleanFilter ``` ## Errors and their meaning - *Contact failed with ...* - *Found invalid intersection points.* This problem occurs when an intersection point is located on congruent edges of a self-intersecting polygon. - *Intersection points do not lie on the edges (cells a, b).* At least one intersection point does not lie on the boundary of the intersected polygon. The points of the polygon do not lie on a plane. The polygon is degenerated. - *Intersection goes through non-manifold edges.* Non-manifold edges are generally not a problem. Unless they are part of the intersection. - *Cannot prevent equal capture points.* A capture point is the projection of a point onto one of the edges of the intersected polygon. This point, not the projection, is usually used by two lines that are assigned to the two adjacent polygons, sharing this edge. There is a case where two different points have the same projection. The error occurs when the problem could not be solved. - *There is no contact.* What it says. - *At least one line-end has only one neighbor.* The intersection is incomplete. Therefore the cell cannot be divided. - *Strips are invalid.* There are intersection lines that intersect themselves. Either one of the inputs contains an assembly or there is one self-intersecting polygon that is involved in the intersection. - *CutCells failed.* Will be printed out only, if some holes couldn't be merged into their outer polygons. - *Boolean operation failed.* A boolean operation can fail at the end, if some of the intersection lines are not part of the result. ## Copyright 2012-2025 Ronald Römer ## License Apache License, Version 2.0 ================================================ FILE: Utilities.cxx ================================================ /* Copyright 2012-2025 Ronald Römer Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ #include "Utilities.h" #include #include #include #include #include #include #include #include double ComputeNormal (vtkPoints *pts, double *n, vtkIdType num, const vtkIdType *poly) { n[0] = 0; n[1] = 0; n[2] = 0; double pA[3], pB[3]; vtkIdType i, a, b; for (i = 0; i < num; i++) { a = poly[i]; b = poly[i+1 == num ? 0 : i+1]; pts->GetPoint(a, pA); pts->GetPoint(b, pB); n[0] += (pA[1]-pB[1])*(pA[2]+pB[2]); n[1] += (pA[2]-pB[2])*(pA[0]+pB[0]); n[2] += (pA[0]-pB[0])*(pA[1]+pB[1]); } return vtkMath::Normalize(n); } void FindPoints (vtkKdTreePointLocator *pl, const double *pt, vtkIdList *pts, double tol) { pts->Reset(); vtkPolyData *pd = vtkPolyData::SafeDownCast(pl->GetDataSet()); vtkIdList *closest = vtkIdList::New(); pl->FindPointsWithinRadius(std::max(1e-3, tol), pt, closest); vtkIdType i, numPts = closest->GetNumberOfIds(); double c[3], v[3]; for (i = 0; i < numPts; i++) { pd->GetPoint(closest->GetId(i), c); vtkMath::Subtract(pt, c, v); if (vtkMath::Norm(v) < tol) { pts->InsertNextId(closest->GetId(i)); } } closest->Delete(); } #ifdef DEBUG void WriteVTK (const char *name, vtkPolyData *pd) { std::cout << "Writing " << name << std::endl; vtkPolyDataWriter *w = vtkPolyDataWriter::New(); w->SetInputData(pd); w->SetFileName(name); w->Update(); w->Delete(); } #endif double GetAngle (const double *vA, const double *vB, const double *n) { // http://math.stackexchange.com/questions/878785/how-to-find-an-angle-in-range0-360-between-2-vectors double _vA[3]; vtkMath::Cross(n, vA, _vA); double ang = std::atan2(vtkMath::Dot(_vA, vB), vtkMath::Dot(vA, vB)); if (ang < 0) { ang += 2*M_PI; } return ang; } Base::Base (vtkPoints *pts, vtkIdType num, const vtkIdType *poly) { ComputeNormal(pts, n, num, poly); double ptA[3], ptB[3]; pts->GetPoint(poly[0], ptA); pts->GetPoint(poly[1], ptB); ei[0] = ptB[0]-ptA[0]; ei[1] = ptB[1]-ptA[1]; ei[2] = ptB[2]-ptA[2]; vtkMath::Normalize(ei); ej[0] = n[1]*ei[2]-n[2]*ei[1]; ej[1] = -n[0]*ei[2]+n[2]*ei[0]; ej[2] = n[0]*ei[1]-n[1]*ei[0]; vtkMath::Normalize(ej); d = n[0]*ptA[0]+n[1]*ptA[1]+n[2]*ptA[2]; } void Transform (const double *in, double *out, const Base &base) { double x = base.ei[0]*in[0]+base.ei[1]*in[1]+base.ei[2]*in[2], y = base.ej[0]*in[0]+base.ej[1]*in[1]+base.ej[2]*in[2]; out[0] = x; out[1] = y; } /*void BackTransform (const double *in, double *out, const Base &base) { double x = in[0]*base.ei[0]+in[1]*base.ej[0]+base.d*base.n[0], y = in[0]*base.ei[1]+in[1]*base.ej[1]+base.d*base.n[1], z = in[0]*base.ei[2]+in[1]*base.ej[2]+base.d*base.n[2]; out[0] = x; out[1] = y; out[2] = z; }*/ double ComputeNormal (const Poly &poly, double *n) { n[0] = 0; n[1] = 0; n[2] = 0; Poly::const_iterator itrA, itrB; for (itrA = poly.begin(); itrA != poly.end(); ++itrA) { itrB = itrA+1; if (itrB == poly.end()) { itrB = poly.begin(); } const Point3d &ptA = *itrA, &ptB = *itrB; n[0] += (ptA.y-ptB.y)*(ptA.z+ptB.z); n[1] += (ptA.z-ptB.z)*(ptA.x+ptB.x); n[2] += (ptA.x-ptB.x)*(ptA.y+ptB.y); } return vtkMath::Normalize(n); } bool PointInPoly (const Poly &poly, const Point3d &p) { bool in = false; Poly::const_iterator itrA, itrB; for (itrA = poly.begin(); itrA != poly.end(); ++itrA) { itrB = itrA+1; if (itrB == poly.end()) { itrB = poly.begin(); } const Point3d &ptA = *itrA, &ptB = *itrB; if ((ptA.x <= p.x || ptB.x <= p.x) && ((ptA.y < p.y && ptB.y >= p.y) || (ptB.y < p.y && ptA.y >= p.y))) { // schnittpunkt mit bounding box und strahlensatz if (ptA.x+(p.y-ptA.y)*(ptB.x-ptA.x)/(ptB.y-ptA.y) < p.x) { in = !in; } } } return in; } #ifdef DEBUG void WritePolys (const char *name, const PolysType &polys) { auto pts = vtkSmartPointer::New(); pts->SetDataTypeToDouble(); auto pd = vtkSmartPointer::New(); pd->SetPoints(pts); pd->Allocate(1); for (auto &poly : polys) { auto cell = vtkSmartPointer::New(); for (auto &p : poly) { cell->InsertNextId(pts->InsertNextPoint(p.x, p.y, p.z)); } pd->InsertNextCell(VTK_POLYGON, cell); } WriteVTK(name, pd); } #endif void GetPolys (const ReferencedPointsType &pts, const IndexedPolysType &indexedPolys, PolysType &polys) { for (const auto &poly : indexedPolys) { Poly newPoly; for (auto &id : poly) { newPoly.push_back(pts.at(id)); } polys.push_back(std::move(newPoly)); } } void GetPoly (vtkPoints *pts, vtkIdType num, const vtkIdType *poly, Poly &out) { vtkIdType i; double p[3]; for (i = 0; i < num; i++) { pts->GetPoint(poly[i], p); out.emplace_back(p[0], p[1], p[2], poly[i]); } } void FlattenPoly (const Poly &poly, Poly &out, const Base &base) { double pt[3], tr[2]; vtkIdType i = 0; for (auto &p : poly) { pt[0] = p.x; pt[1] = p.y; pt[2] = p.z; Transform(pt, tr, base); out.emplace_back(tr[0], tr[1], 0, i++); } } void FlattenPoly2 (const Poly &poly, Poly &out, const Base2 &base) { double pt[3], tr[3]; for (auto &p : poly) { pt[0] = p.x; pt[1] = p.y; pt[2] = p.z; base.Transform(pt, tr); out.emplace_back(tr[0], tr[1], tr[2], p.id); } } std::shared_ptr GetEdgeProj (const Poly &poly, const Point3d &p) { Poly::const_iterator itrA, itrB; double d, t; std::shared_ptr proj; for (itrA = poly.begin(); itrA != poly.end(); ++itrA) { itrB = itrA+1; if (itrB == poly.end()) { itrB = poly.begin(); } ProjOnLine(*itrA, *itrB, p, &d, &t, proj); if (d > 0 && d < 1e-5 && t > 0 && t < 1) { return std::make_shared(itrA->id, itrB->id, *proj, d); } } return nullptr; } void ProjOnLine (const Point3d &a, const Point3d &b, const Point3d &p, double *d, double *t, std::shared_ptr &proj) { double v[3], w[3]; double v_ = Point3d::GetVec(a, b, v); double w_ = Point3d::GetVec(a, p, w); double pr = std::min(std::max(vtkMath::Dot(v, w), -1.), 1.); *d = std::sin(std::acos(pr))*w_; vtkMath::MultiplyScalar(v, std::sqrt(w_*w_-*d**d)); proj = std::make_shared(a.x+v[0], a.y+v[1], a.z+v[2]); *t = pr*w_/v_; } void ProjOnLine (vtkPolyData *pd, const Pair &line, const Point3d &p, std::shared_ptr &proj) { double pA[3], pB[3]; pd->GetPoint(line.f, pA); pd->GetPoint(line.g, pB); Point3d a(pA[0], pA[1], pA[2]); Point3d b(pB[0], pB[1], pB[2]); double d, t; ProjOnLine(a, b, p, &d, &t, proj); } vtkSmartPointer CreatePolyData (const PolysType &polys) { auto pts = vtkSmartPointer::New(); pts->SetDataTypeToDouble(); auto pd = vtkSmartPointer::New(); pd->SetPoints(pts); pd->Allocate(100); for (const auto &poly : polys) { auto cell = vtkSmartPointer::New(); for (const auto &p : poly) { cell->InsertNextId(pts->InsertNextPoint(p.x, p.y, p.z)); } pd->InsertNextCell(VTK_POLYGON, cell); } pd->Squeeze(); return pd; } double GetTriangleQuality (const Poly &poly) { double n[3]; double l = ComputeNormal(poly, n); double d = 0; Poly::const_iterator itrA, itrB; for (itrA = poly.begin(); itrA != poly.end(); ++itrA) { itrB = itrA+1; if (itrB == poly.end()) { itrB = poly.begin(); } d += std::sqrt(Point3d::GetDist(*itrA, *itrB)); } return 10.392304845413264*l/(d*d); } ================================================ FILE: Utilities.h ================================================ /* Copyright 2012-2025 Ronald Römer Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ #ifndef __Utilities_h #define __Utilities_h #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define NOTSET -1 double GetAngle (const double *vA, const double *vB, const double *n); double ComputeNormal (vtkPoints *pts, double *n, vtkIdType num, const vtkIdType *poly); void FindPoints (vtkKdTreePointLocator *pl, const double *pt, vtkIdList *pts, double tol = 1e-6); #ifdef DEBUG void WriteVTK (const char *name, vtkPolyData *pd); #endif class Point3d { public: const double x, y, z; vtkIdType id, otherId; Point3d () = delete; Point3d (const double x, const double y, const double z, vtkIdType id = NOTSET, vtkIdType otherId = NOTSET) : x(x), y(y), z(z), id(id), otherId(otherId) {} bool operator< (const Point3d &other) const { const long x1 = std::lround(x*1e5), y1 = std::lround(y*1e5), z1 = std::lround(z*1e5), x2 = std::lround(other.x*1e5), y2 = std::lround(other.y*1e5), z2 = std::lround(other.z*1e5); return std::tie(x1, y1, z1) < std::tie(x2, y2, z2); } bool operator== (const Point3d &other) const { return !(*this < other) && !(other < *this); } friend std::ostream& operator<< (std::ostream &out, const Point3d &p) { out << "Point3d(x=" << p.x << ", y=" << p.y << ", z=" << p.z << ", id=" << p.id << ", otherId=" << p.otherId << ")"; return out; } static double GetVec (const Point3d &a, const Point3d &b, double *v) { v[0] = b.x-a.x; v[1] = b.y-a.y; v[2] = b.z-a.z; return vtkMath::Normalize(v); } static double GetDist (const Point3d &a, const Point3d &b) { double dx = b.x-a.x; double dy = b.y-a.y; double dz = b.z-a.z; return dx*dx+dy*dy+dz*dz; } }; typedef std::vector IdsType; typedef std::set _IdsType; class Pair { public: vtkIdType f, g; Pair () = delete; Pair (vtkIdType f, vtkIdType g) : f(f), g(g) {} bool operator< (const Pair &other) const { return std::tie(f, g) < std::tie(other.f, other.g); } bool operator== (const Pair &other) const { return f == other.f && g == other.g; } vtkIdType operator& (const Pair &other) const { if (f == other.f || f == other.g) { return f; } return g; } friend std::ostream& operator<< (std::ostream &out, const Pair &p) { out << "(" << p.f << ", " << p.g << ")"; return out; } }; class Base { public: Base () {} Base (vtkPoints *pts, vtkIdType num, const vtkIdType *poly); double n[3], ei[3], ej[3], d; }; void Transform (const double *in, double *out, const Base &base); // void BackTransform (const double *in, double *out, const Base &base); class Base2 { public: Base2 () {} Base2 (double *_t, double *_ei, double *_ek) { std::copy_n(_t, 3, t); std::copy_n(_ei, 3, ei); std::copy_n(_ek, 3, ek); ej[0] = ek[1]*ei[2]-ek[2]*ei[1]; ej[1] = -ek[0]*ei[2]+ek[2]*ei[0]; ej[2] = ek[0]*ei[1]-ek[1]*ei[0]; vtkMath::Normalize(ej); } void Transform (const double *in, double *out) const { double R[][3] = { { ei[0], ei[1], ei[2] }, { ej[0], ej[1], ej[2] }, { ek[0], ek[1], ek[2] } }; double _t[] = { in[0]-t[0], in[1]-t[1], in[2]-t[2] }; out[0] = R[0][0]*_t[0]+R[0][1]*_t[1]+R[0][2]*_t[2]; out[1] = R[1][0]*_t[0]+R[1][1]*_t[1]+R[1][2]*_t[2]; out[2] = R[2][0]*_t[0]+R[2][1]*_t[1]+R[2][2]*_t[2]; } void BackTransform (const double *in, double *out) const { double R[][3] = { { ei[0], ej[0], ek[0] }, { ei[1], ej[1], ek[1] }, { ei[2], ej[2], ek[2] } }; double _out[] = { R[0][0]*in[0]+R[0][1]*in[1]+R[0][2]*in[2], R[1][0]*in[0]+R[1][1]*in[1]+R[1][2]*in[2], R[2][0]*in[0]+R[2][1]*in[1]+R[2][2]*in[2] }; out[0] = _out[0]+t[0]; out[1] = _out[1]+t[1]; out[2] = _out[2]+t[2]; } double t[3], ei[3], ej[3], ek[3]; }; template std::ostream& operator<< (typename std::enable_if::value, std::ostream>::type& stream, const T& e) { return stream << static_cast::type>(e); } typedef std::vector Poly, Points; typedef std::vector PolysType; double ComputeNormal (const Poly &poly, double *n); bool PointInPoly (const Poly &poly, const Point3d &p); #ifdef DEBUG void WritePolys (const char *name, const PolysType &polys); #endif typedef std::deque IndexedPoly; typedef std::vector IndexedPolysType; typedef std::map> ReferencedPointsType; void GetPolys (const ReferencedPointsType &pts, const IndexedPolysType &indexedPolys, PolysType &polys); void GetPoly (vtkPoints *pts, vtkIdType num, const vtkIdType *poly, Poly &out); void FlattenPoly (const Poly &poly, Poly &out, const Base &base); void FlattenPoly2 (const Poly &poly, Poly &out, const Base2 &base); class Proj { public: Proj (vtkIdType a, vtkIdType b, const Point3d &proj, double d) : edge(a, b), proj(proj), d(d) {} Pair edge; Point3d proj; double d; }; std::shared_ptr GetEdgeProj (const Poly &poly, const Point3d &p); void ProjOnLine (const Point3d &a, const Point3d &b, const Point3d &p, double *d, double *t, std::shared_ptr &proj); void ProjOnLine (vtkPolyData *pd, const Pair &line, const Point3d &p, std::shared_ptr &proj); vtkSmartPointer CreatePolyData (const PolysType &polys); double GetTriangleQuality (const Poly &poly); #endif ================================================ FILE: module/CMakeLists.txt ================================================ set(srcs ../Utilities.cxx ../Optimize.cxx ../Contact.cxx ../Merger.cxx ../vtkPolyDataBooleanFilter.cxx ) set(headers ../vtkPolyDataBooleanFilter.h ) vtk_module_add_module(vtkbool SOURCES ${srcs} HEADERS ${headers} ) ================================================ FILE: module/vtk.module ================================================ NAME vtkbool DEPENDS VTK::CommonCore VTK::CommonExecutionModel VTK::FiltersPoints VTK::IOLegacy VTK::FiltersFlowPaths TEST_DEPENDS VTK::FiltersSources DESCRIPTION This module contains a class to do polydata boolean operations. ================================================ FILE: paraview/CMakeLists.txt ================================================ paraview_add_plugin(PolyDataBooleanFilter VERSION "${vtkbool_VERSION}" MODULES vtkbool MODULE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/module/vtk.module") ================================================ FILE: paraview/module/CMakeLists.txt ================================================ set(srcs ../../Utilities.cxx ../../Optimize.cxx ../../Contact.cxx ../../Merger.cxx ../../vtkPolyDataBooleanFilter.cxx ) set(headers ../../vtkPolyDataBooleanFilter.h ) vtk_module_add_module(vtkbool FORCE_STATIC SOURCES ${srcs} HEADERS ${headers} ) paraview_add_server_manager_xmls( XMLS vtkPolyDataBooleanFilter.xml ) ================================================ FILE: paraview/module/vtk.module ================================================ NAME vtkbool DEPENDS VTK::CommonCore VTK::CommonExecutionModel VTK::FiltersPoints VTK::IOLegacy VTK::FiltersFlowPaths TEST_DEPENDS VTK::FiltersSources ================================================ FILE: paraview/module/vtkPolyDataBooleanFilter.xml ================================================ First polydata. Second polydata. Sets the operation mode. ================================================ FILE: paraview/paraview.plugin ================================================ NAME PolyDataBooleanFilter REQUIRES_MODULES VTK::CommonCore VTK::FiltersCore DESCRIPTION This module contains a class to do polydata boolean operations. ================================================ FILE: run_some_tests.sh ================================================ #!/bin/bash export PYTHONPATH=/home/zippy/vtkbool/build/lib/python3.13/site-packages/vtkbool:$PYTHONPATH pushd testing # pytest test_filter.py::test_triangle_strips -s # pytest test_filter.py::test_equal_capt_pts -s # pytest test_filter.py::test_equal_capt_pts_2 -s # pytest test_filter.py::test_equal_capt_pts_3 -s # gdb --args python -m pytest test_filter.py::test_simple -s pytest test_filter.py # pytest test_filter.py::test_simple -s popd ================================================ FILE: testing/data/branched.vtk ================================================ # vtk DataFile Version 5.1 vtk output ASCII DATASET POLYDATA POINTS 622 double 0.082297295332 0 0.86818063259 0.078269377351 0.025431262329 0.86818063259 0 0 0.875 0.066579908133 0.048373136669 0.86818063259 0.048373136669 0.066579908133 0.86818063259 0.025431262329 0.078269377351 0.86818063259 5.0392558428e-18 0.082297295332 0.86818063259 -0.025431262329 0.078269377351 0.86818063259 -0.048373136669 0.066579908133 0.86818063259 -0.066579908133 0.048373136669 0.86818063259 -0.078269377351 0.025431262329 0.86818063259 -0.082297295332 1.0078511686e-17 0.86818063259 -0.078269377351 -0.025431262329 0.86818063259 -0.066579908133 -0.048373136669 0.86818063259 -0.048373136669 -0.066579908133 0.86818063259 -0.025431262329 -0.078269377351 0.86818063259 -1.5117767942e-17 -0.082297295332 0.86818063259 0.025431262329 -0.078269377351 0.86818063259 0.048373136669 -0.066579908133 0.86818063259 0.066579908133 -0.048373136669 0.86818063259 0.078269377351 -0.025431262329 0.86818063259 0.16234973073 0 0.84790861607 0.15440377593 0.050168827176 0.84790861607 0.23797369003 0 0.81473690271 0.2263264358 0.073537915945 0.81473690271 0.30710634589 0 0.76957023144 0.29207551479 0.0949010849 0.76957023144 0.36786195636 0 0.71364080906 0.34985750914 0.11367559433 0.71364080906 0.41858324409 0 0.64847409725 0.39809632301 0.12934933603 0.64847409725 0.45788666606 0 0.57584768534 0.43547609448 0.14149476588 0.57584768534 0.48470014334 0 0.4977427423 0.4609772265 0.14978057146 0.4977427423 0.49829223752 0 0.41628968716 0.47390407324 0.15398077667 0.41628968716 0.49829223752 0 0.33371031284 0.47390407324 0.15398077667 0.33371031284 0.48470014334 0 0.2522572577 0.4609772265 0.14978057146 0.2522572577 0.45788666606 0 0.17415228486 0.43547609448 0.14149476588 0.17415228486 0.41858324409 0 0.10152591765 0.39809632301 0.12934933603 0.10152591765 0.36786195636 0 0.036359213293 0.34985750914 0.11367559433 0.036359213293 0.13134369254 0.095426782966 0.84790861607 0.19252476096 0.13987742364 0.81473690271 0.24845425785 0.1805125922 0.76957023144 0.29760658741 0.21622383595 0.71364080906 0.33864095807 0.24603705108 0.64847409725 0.37043809891 0.26913902164 0.57584768534 0.39213064313 0.2848995924 0.4977427423 0.40312689543 0.29288882017 0.41628968716 0.40312689543 0.29288882017 0.33371031284 0.39213064313 0.2848995924 0.2522572577 0.37043809891 0.26913902164 0.17415228486 0.33864095807 0.24603705108 0.10152591765 0.29760658741 0.21622383595 0.036359213293 0.095426782966 0.13134369254 0.84790861607 0.13987742364 0.19252476096 0.81473690271 0.1805125922 0.24845425785 0.76957023144 0.21622383595 0.29760658741 0.71364080906 0.24603705108 0.33864095807 0.64847409725 0.26913902164 0.37043809891 0.57584768534 0.2848995924 0.39213064313 0.4977427423 0.29288882017 0.40312689543 0.41628968716 0.29288882017 0.40312689543 0.33371031284 0.2848995924 0.39213064313 0.2522572577 0.26913902164 0.37043809891 0.17415228486 0.24603705108 0.33864095807 0.10152591765 0.21622383595 0.29760658741 0.036359213293 0.050168827176 0.15440377593 0.84790861607 0.073537915945 0.2263264358 0.81473690271 0.0949010849 0.29207551479 0.76957023144 0.11367559433 0.34985750914 0.71364080906 0.12934933603 0.39809632301 0.64847409725 0.14149476588 0.43547609448 0.57584768534 0.14978057146 0.4609772265 0.4977427423 0.15398077667 0.47390407324 0.41628968716 0.15398077667 0.47390407324 0.33371031284 0.14978057146 0.4609772265 0.2522572577 0.14149476588 0.43547609448 0.17415228486 0.12934933603 0.39809632301 0.10152591765 0.11367559433 0.34985750914 0.036359213293 9.9410541201e-18 0.16234973073 0.84790861607 1.4571686463e-17 0.23797369003 0.81473690271 1.880484115e-17 0.30710634589 0.76957023144 2.2525047905e-17 0.36786195636 0.71364080906 2.5630831518e-17 0.41858324409 0.64847409725 2.8037472151e-17 0.45788666606 0.57584768534 2.9679323096e-17 0.48470014334 0.4977427423 3.0511599142e-17 0.49829223752 0.41628968716 3.0511599142e-17 0.49829223752 0.33371031284 2.9679323096e-17 0.48470014334 0.2522572577 2.8037472151e-17 0.45788666606 0.17415228486 2.5630831518e-17 0.41858324409 0.10152591765 2.2525047905e-17 0.36786195636 0.036359213293 -0.050168827176 0.15440377593 0.84790861607 -0.073537915945 0.2263264358 0.81473690271 -0.0949010849 0.29207551479 0.76957023144 -0.11367559433 0.34985750914 0.71364080906 -0.12934933603 0.39809632301 0.64847409725 -0.14149476588 0.43547609448 0.57584768534 -0.14978057146 0.4609772265 0.4977427423 -0.15398077667 0.47390407324 0.41628968716 -0.15398077667 0.47390407324 0.33371031284 -0.14978057146 0.4609772265 0.2522572577 -0.14149476588 0.43547609448 0.17415228486 -0.12934933603 0.39809632301 0.10152591765 -0.11367559433 0.34985750914 0.036359213293 -0.095426782966 0.13134369254 0.84790861607 -0.13987742364 0.19252476096 0.81473690271 -0.1805125922 0.24845425785 0.76957023144 -0.21622383595 0.29760658741 0.71364080906 -0.24603705108 0.33864095807 0.64847409725 -0.26913902164 0.37043809891 0.57584768534 -0.2848995924 0.39213064313 0.4977427423 -0.29288882017 0.40312689543 0.41628968716 -0.29288882017 0.40312689543 0.33371031284 -0.2848995924 0.39213064313 0.2522572577 -0.26913902164 0.37043809891 0.17415228486 -0.24603705108 0.33864095807 0.10152591765 -0.21622383595 0.29760658741 0.036359213293 -0.13134369254 0.095426782966 0.84790861607 -0.19252476096 0.13987742364 0.81473690271 -0.24845425785 0.1805125922 0.76957023144 -0.29760658741 0.21622383595 0.71364080906 -0.33864095807 0.24603705108 0.64847409725 -0.37043809891 0.26913902164 0.57584768534 -0.39213064313 0.2848995924 0.4977427423 -0.40312689543 0.29288882017 0.41628968716 -0.40312689543 0.29288882017 0.33371031284 -0.39213064313 0.2848995924 0.2522572577 -0.37043809891 0.26913902164 0.17415228486 -0.33864095807 0.24603705108 0.10152591765 -0.29760658741 0.21622383595 0.036359213293 -0.15440377593 0.050168827176 0.84790861607 -0.2263264358 0.073537915945 0.81473690271 -0.29207551479 0.0949010849 0.76957023144 -0.34985750914 0.11367559433 0.71364080906 -0.39809632301 0.12934933603 0.64847409725 -0.43547609448 0.14149476588 0.57584768534 -0.4609772265 0.14978057146 0.4977427423 -0.47390407324 0.15398077667 0.41628968716 -0.47390407324 0.15398077667 0.33371031284 -0.4609772265 0.14978057146 0.2522572577 -0.43547609448 0.14149476588 0.17415228486 -0.39809632301 0.12934933603 0.10152591765 -0.34985750914 0.11367559433 0.036359213293 -0.16234973073 1.988210824e-17 0.84790861607 -0.23797369003 2.9143372925e-17 0.81473690271 -0.30710634589 3.76096823e-17 0.76957023144 -0.36786195636 4.5050095809e-17 0.71364080906 -0.41858324409 5.1261663035e-17 0.64847409725 -0.45788666606 5.6074944302e-17 0.57584768534 -0.48470014334 5.9358646193e-17 0.4977427423 -0.49829223752 6.1023198283e-17 0.41628968716 -0.49829223752 6.1023198283e-17 0.33371031284 -0.48470014334 5.9358646193e-17 0.2522572577 -0.45788666606 5.6074944302e-17 0.17415228486 -0.41858324409 5.1261663035e-17 0.10152591765 -0.36786195636 4.5050095809e-17 0.036359213293 -0.15440377593 -0.050168827176 0.84790861607 -0.2263264358 -0.073537915945 0.81473690271 -0.29207551479 -0.0949010849 0.76957023144 -0.34985750914 -0.11367559433 0.71364080906 -0.39809632301 -0.12934933603 0.64847409725 -0.43547609448 -0.14149476588 0.57584768534 -0.4609772265 -0.14978057146 0.4977427423 -0.47390407324 -0.15398077667 0.41628968716 -0.47390407324 -0.15398077667 0.33371031284 -0.4609772265 -0.14978057146 0.2522572577 -0.43547609448 -0.14149476588 0.17415228486 -0.39809632301 -0.12934933603 0.10152591765 -0.34985750914 -0.11367559433 0.036359213293 -0.13134369254 -0.095426782966 0.84790861607 -0.19252476096 -0.13987742364 0.81473690271 -0.24845425785 -0.1805125922 0.76957023144 -0.29760658741 -0.21622383595 0.71364080906 -0.33864095807 -0.24603705108 0.64847409725 -0.37043809891 -0.26913902164 0.57584768534 -0.39213064313 -0.2848995924 0.4977427423 -0.40312689543 -0.29288882017 0.41628968716 -0.40312689543 -0.29288882017 0.33371031284 -0.39213064313 -0.2848995924 0.2522572577 -0.37043809891 -0.26913902164 0.17415228486 -0.33864095807 -0.24603705108 0.10152591765 -0.29760658741 -0.21622383595 0.036359213293 -0.095426782966 -0.13134369254 0.84790861607 -0.13987742364 -0.19252476096 0.81473690271 -0.1805125922 -0.24845425785 0.76957023144 -0.21622383595 -0.29760658741 0.71364080906 -0.24603705108 -0.33864095807 0.64847409725 -0.26913902164 -0.37043809891 0.57584768534 -0.2848995924 -0.39213064313 0.4977427423 -0.29288882017 -0.40312689543 0.41628968716 -0.29288882017 -0.40312689543 0.33371031284 -0.2848995924 -0.39213064313 0.2522572577 -0.26913902164 -0.37043809891 0.17415228486 -0.24603705108 -0.33864095807 0.10152591765 -0.21622383595 -0.29760658741 0.036359213293 -0.050168827176 -0.15440377593 0.84790861607 -0.073537915945 -0.2263264358 0.81473690271 -0.0949010849 -0.29207551479 0.76957023144 -0.11367559433 -0.34985750914 0.71364080906 -0.12934933603 -0.39809632301 0.64847409725 -0.14149476588 -0.43547609448 0.57584768534 -0.14978057146 -0.4609772265 0.4977427423 -0.15398077667 -0.47390407324 0.41628968716 -0.15398077667 -0.47390407324 0.33371031284 -0.14978057146 -0.4609772265 0.2522572577 -0.14149476588 -0.43547609448 0.17415228486 -0.12934933603 -0.39809632301 0.10152591765 -0.11367559433 -0.34985750914 0.036359213293 -2.9823163188e-17 -0.16234973073 0.84790861607 -4.3715059388e-17 -0.23797369003 0.81473690271 -5.6414525104e-17 -0.30710634589 0.76957023144 -6.7575143714e-17 -0.36786195636 0.71364080906 -7.6892492899e-17 -0.41858324409 0.64847409725 -8.4112416453e-17 -0.45788666606 0.57584768534 -8.9037972598e-17 -0.48470014334 0.4977427423 -9.1534800733e-17 -0.49829223752 0.41628968716 -9.1534800733e-17 -0.49829223752 0.33371031284 -8.9037972598e-17 -0.48470014334 0.2522572577 -8.4112416453e-17 -0.45788666606 0.17415228486 -7.6892492899e-17 -0.41858324409 0.10152591765 -6.7575143714e-17 -0.36786195636 0.036359213293 0.050168827176 -0.15440377593 0.84790861607 0.073537915945 -0.2263264358 0.81473690271 0.0949010849 -0.29207551479 0.76957023144 0.11367559433 -0.34985750914 0.71364080906 0.12934933603 -0.39809632301 0.64847409725 0.14149476588 -0.43547609448 0.57584768534 0.14978057146 -0.4609772265 0.4977427423 0.15398077667 -0.47390407324 0.41628968716 0.15398077667 -0.47390407324 0.33371031284 0.14978057146 -0.4609772265 0.2522572577 0.14149476588 -0.43547609448 0.17415228486 0.12934933603 -0.39809632301 0.10152591765 0.11367559433 -0.34985750914 0.036359213293 0.095426782966 -0.13134369254 0.84790861607 0.13987742364 -0.19252476096 0.81473690271 0.1805125922 -0.24845425785 0.76957023144 0.21622383595 -0.29760658741 0.71364080906 0.24603705108 -0.33864095807 0.64847409725 0.26913902164 -0.37043809891 0.57584768534 0.2848995924 -0.39213064313 0.4977427423 0.29288882017 -0.40312689543 0.41628968716 0.29288882017 -0.40312689543 0.33371031284 0.2848995924 -0.39213064313 0.2522572577 0.26913902164 -0.37043809891 0.17415228486 0.24603705108 -0.33864095807 0.10152591765 0.21622383595 -0.29760658741 0.036359213293 0.13134369254 -0.095426782966 0.84790861607 0.19252476096 -0.13987742364 0.81473690271 0.24845425785 -0.1805125922 0.76957023144 0.29760658741 -0.21622383595 0.71364080906 0.33864095807 -0.24603705108 0.64847409725 0.37043809891 -0.26913902164 0.57584768534 0.39213064313 -0.2848995924 0.4977427423 0.40312689543 -0.29288882017 0.41628968716 0.40312689543 -0.29288882017 0.33371031284 0.39213064313 -0.2848995924 0.2522572577 0.37043809891 -0.26913902164 0.17415228486 0.33864095807 -0.24603705108 0.10152591765 0.29760658741 -0.21622383595 0.036359213293 0.15440377593 -0.050168827176 0.84790861607 0.2263264358 -0.073537915945 0.81473690271 0.29207551479 -0.0949010849 0.76957023144 0.34985750914 -0.11367559433 0.71364080906 0.39809632301 -0.12934933603 0.64847409725 0.43547609448 -0.14149476588 0.57584768534 0.4609772265 -0.14978057146 0.4977427423 0.47390407324 -0.15398077667 0.41628968716 0.47390407324 -0.15398077667 0.33371031284 0.4609772265 -0.14978057146 0.2522572577 0.43547609448 -0.14149476588 0.17415228486 0.39809632301 -0.12934933603 0.10152591765 0.34985750914 -0.11367559433 0.036359213293 0.32836531327 8.6818331113e-19 -2.8171179001e-17 0.3220653893 0.03977618435 -4.9487070846e-09 0.31859390657 0.06169429886 -4.9487070599e-09 0.31229398553 0.10147046475 2.5407916269e-17 0.29401088933 0.13735306108 5.1429095066e-09 0.28393623162 0.15712568324 5.1429095066e-09 0.2656531266 0.19300829687 6.9388939039e-18 0.23717652592 0.22148489755 0 0.22148489755 0.23717652592 0 0.19300829687 0.2656531266 0 0.15712568324 0.28393623162 -5.1429094891e-09 0.13735306108 0.29401088933 -5.1429095118e-09 0.10147046475 0.31229398553 -2.5197041461e-17 0.06169429886 0.31859390657 4.9487070318e-09 0.03977618435 0.3220653893 4.948707057e-09 1.8882986284e-17 0.32836531327 2.3493044647e-24 -0.03977618435 0.3220653893 -4.9487070858e-09 -0.06169429886 0.31859390657 -4.948707057e-09 -0.10147046475 0.31229398553 -4.4034066554e-18 -0.13735306108 0.29401088933 5.1429095118e-09 -0.15712568324 0.28393623162 5.1429095066e-09 -0.19300829687 0.2656531266 2.0768586122e-18 -0.22148489755 0.23717652592 0 -0.23717652592 0.22148489755 0 -0.2656531266 0.19300829687 0 -0.28393623162 0.15712568324 -5.1429094753e-09 -0.29401088933 0.13735306108 -5.1429095118e-09 -0.31229398553 0.10147046475 -2.5407916269e-17 -0.31859390657 0.06169429886 4.9487070561e-09 -0.3220653893 0.03977618435 4.9487070561e-09 -0.32836531327 3.8887509036e-17 4.8381435661e-24 -0.3220653893 -0.03977618435 -4.9487070852e-09 -0.31859390657 -0.06169429886 -4.9487070599e-09 -0.31229398553 -0.10147046475 -2.9741361642e-18 -0.29401088933 -0.13735306108 5.1429095066e-09 -0.28393623162 -0.15712568324 5.1429095066e-09 -0.2656531266 -0.19300829687 6.9388939039e-18 -0.23717652592 -0.22148489755 0 -0.22148489755 -0.23717652592 0 -0.19300829687 -0.2656531266 0 -0.15712568324 -0.28393623162 -5.1429094753e-09 -0.13735306108 -0.29401088933 -5.1429094753e-09 -0.10147046475 -0.31229398553 -2.540791296e-17 -0.06169429886 -0.31859390657 4.9487070561e-09 -0.03977618435 -0.3220653893 4.9487070565e-09 -5.8492876492e-17 -0.32836531327 -8.5284299912e-18 0.03977618435 -0.3220653893 -4.9487070556e-09 0.06169429886 -0.31859390657 -4.9487070591e-09 0.10147046475 -0.31229398553 -1.5448640187e-18 0.13735306108 -0.29401088933 5.1429095066e-09 0.15712568324 -0.28393623162 5.1429094891e-09 0.19300829687 -0.2656531266 -0 0.22148489755 -0.23717652592 -0 0.23717652592 -0.22148489755 -0 0.2656531266 -0.19300829687 -2.0768619209e-18 0.28393623162 -0.15712568324 -5.1429094753e-09 0.29401088933 -0.13735306108 -5.1429095118e-09 0.31229398553 -0.10147046475 2.9741345099e-18 0.31859390657 -0.06169429886 4.9487070561e-09 0.3220653893 -0.03977618435 4.9487070565e-09 0.082297295332 0 -0.86818063259 0 0 -0.875 0.078269377351 0.025431262329 -0.86818063259 0.066579908133 0.048373136669 -0.86818063259 0.048373136669 0.066579908133 -0.86818063259 0.025431262329 0.078269377351 -0.86818063259 5.0392558428e-18 0.082297295332 -0.86818063259 -0.025431262329 0.078269377351 -0.86818063259 -0.048373136669 0.066579908133 -0.86818063259 -0.066579908133 0.048373136669 -0.86818063259 -0.078269377351 0.025431262329 -0.86818063259 -0.082297295332 1.0078511686e-17 -0.86818063259 -0.078269377351 -0.025431262329 -0.86818063259 -0.066579908133 -0.048373136669 -0.86818063259 -0.048373136669 -0.066579908133 -0.86818063259 -0.025431262329 -0.078269377351 -0.86818063259 -1.5117767942e-17 -0.082297295332 -0.86818063259 0.025431262329 -0.078269377351 -0.86818063259 0.048373136669 -0.066579908133 -0.86818063259 0.066579908133 -0.048373136669 -0.86818063259 0.078269377351 -0.025431262329 -0.86818063259 0.36786195636 0 -0.036359213293 0.41858324409 0 -0.10152591765 0.39809632301 0.12934933603 -0.10152591765 0.34985750914 0.11367559433 -0.036359213293 0.45788666606 0 -0.17415228486 0.43547609448 0.14149476588 -0.17415228486 0.48470014334 0 -0.2522572577 0.4609772265 0.14978057146 -0.2522572577 0.49829223752 0 -0.33371031284 0.47390407324 0.15398077667 -0.33371031284 0.49829223752 0 -0.41628968716 0.47390407324 0.15398077667 -0.41628968716 0.48470014334 0 -0.4977427423 0.4609772265 0.14978057146 -0.4977427423 0.45788666606 0 -0.57584768534 0.43547609448 0.14149476588 -0.57584768534 0.41858324409 0 -0.64847409725 0.39809632301 0.12934933603 -0.64847409725 0.36786195636 0 -0.71364080906 0.34985750914 0.11367559433 -0.71364080906 0.30710634589 0 -0.76957023144 0.29207551479 0.0949010849 -0.76957023144 0.23797369003 0 -0.81473690271 0.2263264358 0.073537915945 -0.81473690271 0.16234973073 0 -0.84790861607 0.15440377593 0.050168827176 -0.84790861607 0.33864095807 0.24603705108 -0.10152591765 0.29760658741 0.21622383595 -0.036359213293 0.37043809891 0.26913902164 -0.17415228486 0.39213064313 0.2848995924 -0.2522572577 0.40312689543 0.29288882017 -0.33371031284 0.40312689543 0.29288882017 -0.41628968716 0.39213064313 0.2848995924 -0.4977427423 0.37043809891 0.26913902164 -0.57584768534 0.33864095807 0.24603705108 -0.64847409725 0.29760658741 0.21622383595 -0.71364080906 0.24845425785 0.1805125922 -0.76957023144 0.19252476096 0.13987742364 -0.81473690271 0.13134369254 0.095426782966 -0.84790861607 0.24603705108 0.33864095807 -0.10152591765 0.21622383595 0.29760658741 -0.036359213293 0.26913902164 0.37043809891 -0.17415228486 0.2848995924 0.39213064313 -0.2522572577 0.29288882017 0.40312689543 -0.33371031284 0.29288882017 0.40312689543 -0.41628968716 0.2848995924 0.39213064313 -0.4977427423 0.26913902164 0.37043809891 -0.57584768534 0.24603705108 0.33864095807 -0.64847409725 0.21622383595 0.29760658741 -0.71364080906 0.1805125922 0.24845425785 -0.76957023144 0.13987742364 0.19252476096 -0.81473690271 0.095426782966 0.13134369254 -0.84790861607 0.12934933603 0.39809632301 -0.10152591765 0.11367559433 0.34985750914 -0.036359213293 0.14149476588 0.43547609448 -0.17415228486 0.14978057146 0.4609772265 -0.2522572577 0.15398077667 0.47390407324 -0.33371031284 0.15398077667 0.47390407324 -0.41628968716 0.14978057146 0.4609772265 -0.4977427423 0.14149476588 0.43547609448 -0.57584768534 0.12934933603 0.39809632301 -0.64847409725 0.11367559433 0.34985750914 -0.71364080906 0.0949010849 0.29207551479 -0.76957023144 0.073537915945 0.2263264358 -0.81473690271 0.050168827176 0.15440377593 -0.84790861607 2.5630831518e-17 0.41858324409 -0.10152591765 2.2525047905e-17 0.36786195636 -0.036359213293 2.8037472151e-17 0.45788666606 -0.17415228486 2.9679323096e-17 0.48470014334 -0.2522572577 3.0511599142e-17 0.49829223752 -0.33371031284 3.0511599142e-17 0.49829223752 -0.41628968716 2.9679323096e-17 0.48470014334 -0.4977427423 2.8037472151e-17 0.45788666606 -0.57584768534 2.5630831518e-17 0.41858324409 -0.64847409725 2.2525047905e-17 0.36786195636 -0.71364080906 1.880484115e-17 0.30710634589 -0.76957023144 1.4571686463e-17 0.23797369003 -0.81473690271 9.9410541201e-18 0.16234973073 -0.84790861607 -0.12934933603 0.39809632301 -0.10152591765 -0.11367559433 0.34985750914 -0.036359213293 -0.14149476588 0.43547609448 -0.17415228486 -0.14978057146 0.4609772265 -0.2522572577 -0.15398077667 0.47390407324 -0.33371031284 -0.15398077667 0.47390407324 -0.41628968716 -0.14978057146 0.4609772265 -0.4977427423 -0.14149476588 0.43547609448 -0.57584768534 -0.12934933603 0.39809632301 -0.64847409725 -0.11367559433 0.34985750914 -0.71364080906 -0.0949010849 0.29207551479 -0.76957023144 -0.073537915945 0.2263264358 -0.81473690271 -0.050168827176 0.15440377593 -0.84790861607 -0.24603705108 0.33864095807 -0.10152591765 -0.21622383595 0.29760658741 -0.036359213293 -0.26913902164 0.37043809891 -0.17415228486 -0.2848995924 0.39213064313 -0.2522572577 -0.29288882017 0.40312689543 -0.33371031284 -0.29288882017 0.40312689543 -0.41628968716 -0.2848995924 0.39213064313 -0.4977427423 -0.26913902164 0.37043809891 -0.57584768534 -0.24603705108 0.33864095807 -0.64847409725 -0.21622383595 0.29760658741 -0.71364080906 -0.1805125922 0.24845425785 -0.76957023144 -0.13987742364 0.19252476096 -0.81473690271 -0.095426782966 0.13134369254 -0.84790861607 -0.33864095807 0.24603705108 -0.10152591765 -0.29760658741 0.21622383595 -0.036359213293 -0.37043809891 0.26913902164 -0.17415228486 -0.39213064313 0.2848995924 -0.2522572577 -0.40312689543 0.29288882017 -0.33371031284 -0.40312689543 0.29288882017 -0.41628968716 -0.39213064313 0.2848995924 -0.4977427423 -0.37043809891 0.26913902164 -0.57584768534 -0.33864095807 0.24603705108 -0.64847409725 -0.29760658741 0.21622383595 -0.71364080906 -0.24845425785 0.1805125922 -0.76957023144 -0.19252476096 0.13987742364 -0.81473690271 -0.13134369254 0.095426782966 -0.84790861607 -0.39809632301 0.12934933603 -0.10152591765 -0.34985750914 0.11367559433 -0.036359213293 -0.43547609448 0.14149476588 -0.17415228486 -0.4609772265 0.14978057146 -0.2522572577 -0.47390407324 0.15398077667 -0.33371031284 -0.47390407324 0.15398077667 -0.41628968716 -0.4609772265 0.14978057146 -0.4977427423 -0.43547609448 0.14149476588 -0.57584768534 -0.39809632301 0.12934933603 -0.64847409725 -0.34985750914 0.11367559433 -0.71364080906 -0.29207551479 0.0949010849 -0.76957023144 -0.2263264358 0.073537915945 -0.81473690271 -0.15440377593 0.050168827176 -0.84790861607 -0.41858324409 5.1261663035e-17 -0.10152591765 -0.36786195636 4.5050095809e-17 -0.036359213293 -0.45788666606 5.6074944302e-17 -0.17415228486 -0.48470014334 5.9358646193e-17 -0.2522572577 -0.49829223752 6.1023198283e-17 -0.33371031284 -0.49829223752 6.1023198283e-17 -0.41628968716 -0.48470014334 5.9358646193e-17 -0.4977427423 -0.45788666606 5.6074944302e-17 -0.57584768534 -0.41858324409 5.1261663035e-17 -0.64847409725 -0.36786195636 4.5050095809e-17 -0.71364080906 -0.30710634589 3.76096823e-17 -0.76957023144 -0.23797369003 2.9143372925e-17 -0.81473690271 -0.16234973073 1.988210824e-17 -0.84790861607 -0.39809632301 -0.12934933603 -0.10152591765 -0.34985750914 -0.11367559433 -0.036359213293 -0.43547609448 -0.14149476588 -0.17415228486 -0.4609772265 -0.14978057146 -0.2522572577 -0.47390407324 -0.15398077667 -0.33371031284 -0.47390407324 -0.15398077667 -0.41628968716 -0.4609772265 -0.14978057146 -0.4977427423 -0.43547609448 -0.14149476588 -0.57584768534 -0.39809632301 -0.12934933603 -0.64847409725 -0.34985750914 -0.11367559433 -0.71364080906 -0.29207551479 -0.0949010849 -0.76957023144 -0.2263264358 -0.073537915945 -0.81473690271 -0.15440377593 -0.050168827176 -0.84790861607 -0.33864095807 -0.24603705108 -0.10152591765 -0.29760658741 -0.21622383595 -0.036359213293 -0.37043809891 -0.26913902164 -0.17415228486 -0.39213064313 -0.2848995924 -0.2522572577 -0.40312689543 -0.29288882017 -0.33371031284 -0.40312689543 -0.29288882017 -0.41628968716 -0.39213064313 -0.2848995924 -0.4977427423 -0.37043809891 -0.26913902164 -0.57584768534 -0.33864095807 -0.24603705108 -0.64847409725 -0.29760658741 -0.21622383595 -0.71364080906 -0.24845425785 -0.1805125922 -0.76957023144 -0.19252476096 -0.13987742364 -0.81473690271 -0.13134369254 -0.095426782966 -0.84790861607 -0.24603705108 -0.33864095807 -0.10152591765 -0.21622383595 -0.29760658741 -0.036359213293 -0.26913902164 -0.37043809891 -0.17415228486 -0.2848995924 -0.39213064313 -0.2522572577 -0.29288882017 -0.40312689543 -0.33371031284 -0.29288882017 -0.40312689543 -0.41628968716 -0.2848995924 -0.39213064313 -0.4977427423 -0.26913902164 -0.37043809891 -0.57584768534 -0.24603705108 -0.33864095807 -0.64847409725 -0.21622383595 -0.29760658741 -0.71364080906 -0.1805125922 -0.24845425785 -0.76957023144 -0.13987742364 -0.19252476096 -0.81473690271 -0.095426782966 -0.13134369254 -0.84790861607 -0.12934933603 -0.39809632301 -0.10152591765 -0.11367559433 -0.34985750914 -0.036359213293 -0.14149476588 -0.43547609448 -0.17415228486 -0.14978057146 -0.4609772265 -0.2522572577 -0.15398077667 -0.47390407324 -0.33371031284 -0.15398077667 -0.47390407324 -0.41628968716 -0.14978057146 -0.4609772265 -0.4977427423 -0.14149476588 -0.43547609448 -0.57584768534 -0.12934933603 -0.39809632301 -0.64847409725 -0.11367559433 -0.34985750914 -0.71364080906 -0.0949010849 -0.29207551479 -0.76957023144 -0.073537915945 -0.2263264358 -0.81473690271 -0.050168827176 -0.15440377593 -0.84790861607 -7.6892492899e-17 -0.41858324409 -0.10152591765 -6.7575143714e-17 -0.36786195636 -0.036359213293 -8.4112416453e-17 -0.45788666606 -0.17415228486 -8.9037972598e-17 -0.48470014334 -0.2522572577 -9.1534800733e-17 -0.49829223752 -0.33371031284 -9.1534800733e-17 -0.49829223752 -0.41628968716 -8.9037972598e-17 -0.48470014334 -0.4977427423 -8.4112416453e-17 -0.45788666606 -0.57584768534 -7.6892492899e-17 -0.41858324409 -0.64847409725 -6.7575143714e-17 -0.36786195636 -0.71364080906 -5.6414525104e-17 -0.30710634589 -0.76957023144 -4.3715059388e-17 -0.23797369003 -0.81473690271 -2.9823163188e-17 -0.16234973073 -0.84790861607 0.12934933603 -0.39809632301 -0.10152591765 0.11367559433 -0.34985750914 -0.036359213293 0.14149476588 -0.43547609448 -0.17415228486 0.14978057146 -0.4609772265 -0.2522572577 0.15398077667 -0.47390407324 -0.33371031284 0.15398077667 -0.47390407324 -0.41628968716 0.14978057146 -0.4609772265 -0.4977427423 0.14149476588 -0.43547609448 -0.57584768534 0.12934933603 -0.39809632301 -0.64847409725 0.11367559433 -0.34985750914 -0.71364080906 0.0949010849 -0.29207551479 -0.76957023144 0.073537915945 -0.2263264358 -0.81473690271 0.050168827176 -0.15440377593 -0.84790861607 0.24603705108 -0.33864095807 -0.10152591765 0.21622383595 -0.29760658741 -0.036359213293 0.26913902164 -0.37043809891 -0.17415228486 0.2848995924 -0.39213064313 -0.2522572577 0.29288882017 -0.40312689543 -0.33371031284 0.29288882017 -0.40312689543 -0.41628968716 0.2848995924 -0.39213064313 -0.4977427423 0.26913902164 -0.37043809891 -0.57584768534 0.24603705108 -0.33864095807 -0.64847409725 0.21622383595 -0.29760658741 -0.71364080906 0.1805125922 -0.24845425785 -0.76957023144 0.13987742364 -0.19252476096 -0.81473690271 0.095426782966 -0.13134369254 -0.84790861607 0.33864095807 -0.24603705108 -0.10152591765 0.29760658741 -0.21622383595 -0.036359213293 0.37043809891 -0.26913902164 -0.17415228486 0.39213064313 -0.2848995924 -0.2522572577 0.40312689543 -0.29288882017 -0.33371031284 0.40312689543 -0.29288882017 -0.41628968716 0.39213064313 -0.2848995924 -0.4977427423 0.37043809891 -0.26913902164 -0.57584768534 0.33864095807 -0.24603705108 -0.64847409725 0.29760658741 -0.21622383595 -0.71364080906 0.24845425785 -0.1805125922 -0.76957023144 0.19252476096 -0.13987742364 -0.81473690271 0.13134369254 -0.095426782966 -0.84790861607 0.39809632301 -0.12934933603 -0.10152591765 0.34985750914 -0.11367559433 -0.036359213293 0.43547609448 -0.14149476588 -0.17415228486 0.4609772265 -0.14978057146 -0.2522572577 0.47390407324 -0.15398077667 -0.33371031284 0.47390407324 -0.15398077667 -0.41628968716 0.4609772265 -0.14978057146 -0.4977427423 0.43547609448 -0.14149476588 -0.57584768534 0.39809632301 -0.12934933603 -0.64847409725 0.34985750914 -0.11367559433 -0.71364080906 0.29207551479 -0.0949010849 -0.76957023144 0.2263264358 -0.073537915945 -0.81473690271 0.15440377593 -0.050168827176 -0.84790861607 POLYGONS 1161 3560 OFFSETS vtktypeint64 0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267 270 273 276 279 282 285 288 291 294 297 300 303 306 309 312 315 318 321 324 327 330 333 336 339 342 345 348 351 354 357 360 363 366 369 372 375 378 381 384 387 390 393 396 399 402 405 408 411 414 417 420 423 426 429 432 435 438 441 444 447 450 453 456 459 462 465 468 471 474 477 480 483 486 489 492 495 498 501 504 507 510 513 516 519 522 525 528 531 534 537 540 543 546 549 552 555 558 561 564 567 570 573 576 579 582 585 588 591 594 597 600 603 606 609 612 615 618 621 624 627 630 633 636 639 642 645 648 651 654 657 660 663 666 669 672 675 678 681 684 687 690 693 696 699 702 705 708 711 714 717 720 723 726 729 732 735 738 741 744 747 750 753 756 759 762 765 768 771 774 777 780 783 786 789 792 795 798 801 804 807 810 813 816 819 822 825 828 831 834 837 840 843 846 849 852 855 858 861 864 867 870 873 876 879 882 885 888 891 894 897 900 903 906 909 912 915 918 921 924 927 930 933 936 939 942 945 948 951 954 957 960 963 966 969 972 975 978 981 984 987 990 993 996 999 1002 1005 1008 1011 1014 1017 1020 1023 1026 1029 1032 1035 1038 1041 1044 1047 1050 1053 1056 1059 1062 1065 1068 1071 1074 1077 1080 1083 1086 1089 1092 1095 1098 1101 1104 1107 1110 1113 1116 1119 1122 1125 1128 1131 1134 1137 1140 1143 1146 1149 1152 1155 1158 1161 1164 1167 1170 1173 1176 1179 1182 1185 1188 1191 1194 1197 1200 1203 1206 1209 1212 1215 1218 1221 1224 1227 1230 1233 1236 1239 1242 1245 1248 1251 1254 1257 1260 1263 1266 1269 1272 1275 1278 1281 1284 1287 1290 1293 1296 1299 1302 1305 1308 1311 1314 1317 1320 1323 1326 1329 1332 1335 1338 1341 1344 1347 1350 1353 1356 1359 1362 1365 1368 1371 1374 1377 1380 1383 1386 1389 1392 1395 1398 1401 1404 1407 1410 1413 1416 1419 1422 1425 1428 1431 1434 1437 1440 1443 1446 1449 1452 1455 1458 1461 1464 1467 1470 1473 1476 1479 1482 1485 1488 1491 1494 1497 1500 1503 1506 1509 1512 1515 1518 1521 1524 1527 1530 1533 1536 1539 1542 1545 1548 1551 1554 1557 1560 1563 1566 1569 1572 1575 1578 1581 1584 1587 1590 1593 1596 1599 1602 1605 1608 1611 1614 1617 1620 1624 1628 1632 1636 1640 1644 1648 1652 1656 1660 1664 1668 1672 1676 1680 1684 1688 1692 1696 1700 1704 1708 1712 1716 1720 1724 1728 1732 1736 1740 1744 1748 1752 1756 1760 1764 1768 1772 1776 1780 1783 1786 1789 1792 1795 1798 1801 1804 1807 1810 1813 1816 1819 1822 1825 1828 1831 1834 1837 1840 1843 1846 1849 1852 1855 1858 1861 1864 1867 1870 1873 1876 1879 1882 1885 1888 1891 1894 1897 1900 1903 1906 1909 1912 1915 1918 1921 1924 1927 1930 1933 1936 1939 1942 1945 1948 1951 1954 1957 1960 1963 1966 1969 1972 1975 1978 1981 1984 1987 1990 1993 1996 1999 2002 2005 2008 2011 2014 2017 2020 2023 2026 2029 2032 2035 2038 2041 2044 2047 2050 2053 2056 2059 2062 2065 2068 2071 2074 2077 2080 2083 2086 2089 2092 2095 2098 2101 2104 2107 2110 2113 2116 2119 2122 2125 2128 2131 2134 2137 2140 2143 2146 2149 2152 2155 2158 2161 2164 2167 2170 2173 2176 2179 2182 2185 2188 2191 2194 2197 2200 2203 2206 2209 2212 2215 2218 2221 2224 2227 2230 2233 2236 2239 2242 2245 2248 2251 2254 2257 2260 2263 2266 2269 2272 2275 2278 2281 2284 2287 2290 2293 2296 2299 2302 2305 2308 2311 2314 2317 2320 2323 2326 2329 2332 2335 2338 2341 2344 2347 2350 2353 2356 2359 2362 2365 2368 2371 2374 2377 2380 2383 2386 2389 2392 2395 2398 2401 2404 2407 2410 2413 2416 2419 2422 2425 2428 2431 2434 2437 2440 2443 2446 2449 2452 2455 2458 2461 2464 2467 2470 2473 2476 2479 2482 2485 2488 2491 2494 2497 2500 2503 2506 2509 2512 2515 2518 2521 2524 2527 2530 2533 2536 2539 2542 2545 2548 2551 2554 2557 2560 2563 2566 2569 2572 2575 2578 2581 2584 2587 2590 2593 2596 2599 2602 2605 2608 2611 2614 2617 2620 2623 2626 2629 2632 2635 2638 2641 2644 2647 2650 2653 2656 2659 2662 2665 2668 2671 2674 2677 2680 2683 2686 2689 2692 2695 2698 2701 2704 2707 2710 2713 2716 2719 2722 2725 2728 2731 2734 2737 2740 2743 2746 2749 2752 2755 2758 2761 2764 2767 2770 2773 2776 2779 2782 2785 2788 2791 2794 2797 2800 2803 2806 2809 2812 2815 2818 2821 2824 2827 2830 2833 2836 2839 2842 2845 2848 2851 2854 2857 2860 2863 2866 2869 2872 2875 2878 2881 2884 2887 2890 2893 2896 2899 2902 2905 2908 2911 2914 2917 2920 2923 2926 2929 2932 2935 2938 2941 2944 2947 2950 2953 2956 2959 2962 2965 2968 2971 2974 2977 2980 2983 2986 2989 2992 2995 2998 3001 3004 3007 3010 3013 3016 3019 3022 3025 3028 3031 3034 3037 3040 3043 3046 3049 3052 3055 3058 3061 3064 3067 3070 3073 3076 3079 3082 3085 3088 3091 3094 3097 3100 3103 3106 3109 3112 3115 3118 3121 3124 3127 3130 3133 3136 3139 3142 3145 3148 3151 3154 3157 3160 3163 3166 3169 3172 3175 3178 3181 3184 3187 3190 3193 3196 3199 3202 3205 3208 3211 3214 3217 3220 3223 3226 3229 3232 3235 3238 3241 3244 3247 3250 3253 3256 3259 3262 3265 3268 3271 3274 3277 3280 3283 3286 3289 3292 3295 3298 3301 3304 3307 3310 3313 3316 3319 3322 3325 3328 3331 3334 3337 3340 3343 3346 3349 3352 3355 3358 3361 3364 3367 3370 3373 3376 3379 3382 3385 3388 3391 3394 3397 3400 3404 3408 3412 3416 3420 3424 3428 3432 3436 3440 3444 3448 3452 3456 3460 3464 3468 3472 3476 3480 3484 3488 3492 3496 3500 3504 3508 3512 3516 3520 3524 3528 3532 3536 3540 3544 3548 3552 3556 3560 CONNECTIVITY vtktypeint64 0 1 2 1 3 2 3 4 2 4 5 2 5 6 2 6 7 2 7 8 2 8 9 2 9 10 2 10 11 2 11 12 2 12 13 2 13 14 2 14 15 2 15 16 2 16 17 2 17 18 2 18 19 2 19 20 2 20 0 2 0 21 22 0 22 1 21 23 24 21 24 22 23 25 26 23 26 24 25 27 28 25 28 26 27 29 30 27 30 28 29 31 32 29 32 30 31 33 34 31 34 32 33 35 36 33 36 34 35 37 38 35 38 36 37 39 40 37 40 38 39 41 42 39 42 40 41 43 44 41 44 42 43 45 46 43 46 44 1 22 47 1 47 3 22 24 48 22 48 47 24 26 49 24 49 48 26 28 50 26 50 49 28 30 51 28 51 50 30 32 52 30 52 51 32 34 53 32 53 52 34 36 54 34 54 53 36 38 55 36 55 54 38 40 56 38 56 55 40 42 57 40 57 56 42 44 58 42 58 57 44 46 59 44 59 58 3 47 60 3 60 4 47 48 61 47 61 60 48 49 62 48 62 61 49 50 63 49 63 62 50 51 64 50 64 63 51 52 65 51 65 64 52 53 66 52 66 65 53 54 67 53 67 66 54 55 68 54 68 67 55 56 69 55 69 68 56 57 70 56 70 69 57 58 71 57 71 70 58 59 72 58 72 71 4 60 73 4 73 5 60 61 74 60 74 73 61 62 75 61 75 74 62 63 76 62 76 75 63 64 77 63 77 76 64 65 78 64 78 77 65 66 79 65 79 78 66 67 80 66 80 79 67 68 81 67 81 80 68 69 82 68 82 81 69 70 83 69 83 82 70 71 84 70 84 83 71 72 85 71 85 84 5 73 86 5 86 6 73 74 87 73 87 86 74 75 88 74 88 87 75 76 89 75 89 88 76 77 90 76 90 89 77 78 91 77 91 90 78 79 92 78 92 91 79 80 93 79 93 92 80 81 94 80 94 93 81 82 95 81 95 94 82 83 96 82 96 95 83 84 97 83 97 96 84 85 98 84 98 97 6 86 99 6 99 7 86 87 100 86 100 99 87 88 101 87 101 100 88 89 102 88 102 101 89 90 103 89 103 102 90 91 104 90 104 103 91 92 105 91 105 104 92 93 106 92 106 105 93 94 107 93 107 106 94 95 108 94 108 107 95 96 109 95 109 108 96 97 110 96 110 109 97 98 111 97 111 110 7 99 112 7 112 8 99 100 113 99 113 112 100 101 114 100 114 113 101 102 115 101 115 114 102 103 116 102 116 115 103 104 117 103 117 116 104 105 118 104 118 117 105 106 119 105 119 118 106 107 120 106 120 119 107 108 121 107 121 120 108 109 122 108 122 121 109 110 123 109 123 122 110 111 124 110 124 123 8 112 125 8 125 9 112 113 126 112 126 125 113 114 127 113 127 126 114 115 128 114 128 127 115 116 129 115 129 128 116 117 130 116 130 129 117 118 131 117 131 130 118 119 132 118 132 131 119 120 133 119 133 132 120 121 134 120 134 133 121 122 135 121 135 134 122 123 136 122 136 135 123 124 137 123 137 136 9 125 138 9 138 10 125 126 139 125 139 138 126 127 140 126 140 139 127 128 141 127 141 140 128 129 142 128 142 141 129 130 143 129 143 142 130 131 144 130 144 143 131 132 145 131 145 144 132 133 146 132 146 145 133 134 147 133 147 146 134 135 148 134 148 147 135 136 149 135 149 148 136 137 150 136 150 149 10 138 151 10 151 11 138 139 152 138 152 151 139 140 153 139 153 152 140 141 154 140 154 153 141 142 155 141 155 154 142 143 156 142 156 155 143 144 157 143 157 156 144 145 158 144 158 157 145 146 159 145 159 158 146 147 160 146 160 159 147 148 161 147 161 160 148 149 162 148 162 161 149 150 163 149 163 162 11 151 164 11 164 12 151 152 165 151 165 164 152 153 166 152 166 165 153 154 167 153 167 166 154 155 168 154 168 167 155 156 169 155 169 168 156 157 170 156 170 169 157 158 171 157 171 170 158 159 172 158 172 171 159 160 173 159 173 172 160 161 174 160 174 173 161 162 175 161 175 174 162 163 176 162 176 175 12 164 177 12 177 13 164 165 178 164 178 177 165 166 179 165 179 178 166 167 180 166 180 179 167 168 181 167 181 180 168 169 182 168 182 181 169 170 183 169 183 182 170 171 184 170 184 183 171 172 185 171 185 184 172 173 186 172 186 185 173 174 187 173 187 186 174 175 188 174 188 187 175 176 189 175 189 188 13 177 190 13 190 14 177 178 191 177 191 190 178 179 192 178 192 191 179 180 193 179 193 192 180 181 194 180 194 193 181 182 195 181 195 194 182 183 196 182 196 195 183 184 197 183 197 196 184 185 198 184 198 197 185 186 199 185 199 198 186 187 200 186 200 199 187 188 201 187 201 200 188 189 202 188 202 201 14 190 203 14 203 15 190 191 204 190 204 203 191 192 205 191 205 204 192 193 206 192 206 205 193 194 207 193 207 206 194 195 208 194 208 207 195 196 209 195 209 208 196 197 210 196 210 209 197 198 211 197 211 210 198 199 212 198 212 211 199 200 213 199 213 212 200 201 214 200 214 213 201 202 215 201 215 214 15 203 216 15 216 16 203 204 217 203 217 216 204 205 218 204 218 217 205 206 219 205 219 218 206 207 220 206 220 219 207 208 221 207 221 220 208 209 222 208 222 221 209 210 223 209 223 222 210 211 224 210 224 223 211 212 225 211 225 224 212 213 226 212 226 225 213 214 227 213 227 226 214 215 228 214 228 227 16 216 229 16 229 17 216 217 230 216 230 229 217 218 231 217 231 230 218 219 232 218 232 231 219 220 233 219 233 232 220 221 234 220 234 233 221 222 235 221 235 234 222 223 236 222 236 235 223 224 237 223 237 236 224 225 238 224 238 237 225 226 239 225 239 238 226 227 240 226 240 239 227 228 241 227 241 240 17 229 242 17 242 18 229 230 243 229 243 242 230 231 244 230 244 243 231 232 245 231 245 244 232 233 246 232 246 245 233 234 247 233 247 246 234 235 248 234 248 247 235 236 249 235 249 248 236 237 250 236 250 249 237 238 251 237 251 250 238 239 252 238 252 251 239 240 253 239 253 252 240 241 254 240 254 253 18 242 255 18 255 19 242 243 256 242 256 255 243 244 257 243 257 256 244 245 258 244 258 257 245 246 259 245 259 258 246 247 260 246 260 259 247 248 261 247 261 260 248 249 262 248 262 261 249 250 263 249 263 262 250 251 264 250 264 263 251 252 265 251 265 264 252 253 266 252 266 265 253 254 267 253 267 266 19 255 268 19 268 20 255 256 269 255 269 268 256 257 270 256 270 269 257 258 271 257 271 270 258 259 272 258 272 271 259 260 273 259 273 272 260 261 274 260 274 273 261 262 275 261 275 274 262 263 276 262 276 275 263 264 277 263 277 276 264 265 278 264 278 277 265 266 279 265 279 278 266 267 280 266 280 279 20 268 21 20 21 0 268 269 23 268 23 21 269 270 25 269 25 23 270 271 27 270 27 25 271 272 29 271 29 27 272 273 31 272 31 29 273 274 33 273 33 31 274 275 35 274 35 33 275 276 37 275 37 35 276 277 39 276 39 37 277 278 41 277 41 39 278 279 43 278 43 41 279 280 45 279 45 43 45 281 282 283 45 283 284 46 46 284 285 286 46 286 287 59 59 287 288 289 59 289 290 72 72 290 291 292 72 292 293 85 85 293 294 295 85 295 296 98 98 296 297 298 98 298 299 111 111 299 300 301 111 301 302 124 124 302 303 304 124 304 305 137 137 305 306 307 137 307 308 150 150 308 309 310 150 310 311 163 163 311 312 313 163 313 314 176 176 314 315 316 176 316 317 189 189 317 318 319 189 319 320 202 202 320 321 322 202 322 323 215 215 323 324 325 215 325 326 228 228 326 327 328 228 328 329 241 241 329 330 331 241 331 332 254 254 332 333 334 254 334 335 267 267 335 336 337 267 337 338 280 280 338 339 340 280 340 281 45 341 342 343 343 342 344 344 342 345 345 342 346 346 342 347 347 342 348 348 342 349 349 342 350 350 342 351 351 342 352 352 342 353 353 342 354 354 342 355 355 342 356 356 342 357 357 342 358 358 342 359 359 342 360 360 342 361 361 342 341 362 363 364 362 364 365 363 366 367 363 367 364 366 368 369 366 369 367 368 370 371 368 371 369 370 372 373 370 373 371 372 374 375 372 375 373 374 376 377 374 377 375 376 378 379 376 379 377 378 380 381 378 381 379 380 382 383 380 383 381 382 384 385 382 385 383 384 386 387 384 387 385 386 341 343 386 343 387 365 364 388 365 388 389 364 367 390 364 390 388 367 369 391 367 391 390 369 371 392 369 392 391 371 373 393 371 393 392 373 375 394 373 394 393 375 377 395 375 395 394 377 379 396 377 396 395 379 381 397 379 397 396 381 383 398 381 398 397 383 385 399 383 399 398 385 387 400 385 400 399 387 343 344 387 344 400 389 388 401 389 401 402 388 390 403 388 403 401 390 391 404 390 404 403 391 392 405 391 405 404 392 393 406 392 406 405 393 394 407 393 407 406 394 395 408 394 408 407 395 396 409 395 409 408 396 397 410 396 410 409 397 398 411 397 411 410 398 399 412 398 412 411 399 400 413 399 413 412 400 344 345 400 345 413 402 401 414 402 414 415 401 403 416 401 416 414 403 404 417 403 417 416 404 405 418 404 418 417 405 406 419 405 419 418 406 407 420 406 420 419 407 408 421 407 421 420 408 409 422 408 422 421 409 410 423 409 423 422 410 411 424 410 424 423 411 412 425 411 425 424 412 413 426 412 426 425 413 345 346 413 346 426 415 414 427 415 427 428 414 416 429 414 429 427 416 417 430 416 430 429 417 418 431 417 431 430 418 419 432 418 432 431 419 420 433 419 433 432 420 421 434 420 434 433 421 422 435 421 435 434 422 423 436 422 436 435 423 424 437 423 437 436 424 425 438 424 438 437 425 426 439 425 439 438 426 346 347 426 347 439 428 427 440 428 440 441 427 429 442 427 442 440 429 430 443 429 443 442 430 431 444 430 444 443 431 432 445 431 445 444 432 433 446 432 446 445 433 434 447 433 447 446 434 435 448 434 448 447 435 436 449 435 449 448 436 437 450 436 450 449 437 438 451 437 451 450 438 439 452 438 452 451 439 347 348 439 348 452 441 440 453 441 453 454 440 442 455 440 455 453 442 443 456 442 456 455 443 444 457 443 457 456 444 445 458 444 458 457 445 446 459 445 459 458 446 447 460 446 460 459 447 448 461 447 461 460 448 449 462 448 462 461 449 450 463 449 463 462 450 451 464 450 464 463 451 452 465 451 465 464 452 348 349 452 349 465 454 453 466 454 466 467 453 455 468 453 468 466 455 456 469 455 469 468 456 457 470 456 470 469 457 458 471 457 471 470 458 459 472 458 472 471 459 460 473 459 473 472 460 461 474 460 474 473 461 462 475 461 475 474 462 463 476 462 476 475 463 464 477 463 477 476 464 465 478 464 478 477 465 349 350 465 350 478 467 466 479 467 479 480 466 468 481 466 481 479 468 469 482 468 482 481 469 470 483 469 483 482 470 471 484 470 484 483 471 472 485 471 485 484 472 473 486 472 486 485 473 474 487 473 487 486 474 475 488 474 488 487 475 476 489 475 489 488 476 477 490 476 490 489 477 478 491 477 491 490 478 350 351 478 351 491 480 479 492 480 492 493 479 481 494 479 494 492 481 482 495 481 495 494 482 483 496 482 496 495 483 484 497 483 497 496 484 485 498 484 498 497 485 486 499 485 499 498 486 487 500 486 500 499 487 488 501 487 501 500 488 489 502 488 502 501 489 490 503 489 503 502 490 491 504 490 504 503 491 351 352 491 352 504 493 492 505 493 505 506 492 494 507 492 507 505 494 495 508 494 508 507 495 496 509 495 509 508 496 497 510 496 510 509 497 498 511 497 511 510 498 499 512 498 512 511 499 500 513 499 513 512 500 501 514 500 514 513 501 502 515 501 515 514 502 503 516 502 516 515 503 504 517 503 517 516 504 352 353 504 353 517 506 505 518 506 518 519 505 507 520 505 520 518 507 508 521 507 521 520 508 509 522 508 522 521 509 510 523 509 523 522 510 511 524 510 524 523 511 512 525 511 525 524 512 513 526 512 526 525 513 514 527 513 527 526 514 515 528 514 528 527 515 516 529 515 529 528 516 517 530 516 530 529 517 353 354 517 354 530 519 518 531 519 531 532 518 520 533 518 533 531 520 521 534 520 534 533 521 522 535 521 535 534 522 523 536 522 536 535 523 524 537 523 537 536 524 525 538 524 538 537 525 526 539 525 539 538 526 527 540 526 540 539 527 528 541 527 541 540 528 529 542 528 542 541 529 530 543 529 543 542 530 354 355 530 355 543 532 531 544 532 544 545 531 533 546 531 546 544 533 534 547 533 547 546 534 535 548 534 548 547 535 536 549 535 549 548 536 537 550 536 550 549 537 538 551 537 551 550 538 539 552 538 552 551 539 540 553 539 553 552 540 541 554 540 554 553 541 542 555 541 555 554 542 543 556 542 556 555 543 355 356 543 356 556 545 544 557 545 557 558 544 546 559 544 559 557 546 547 560 546 560 559 547 548 561 547 561 560 548 549 562 548 562 561 549 550 563 549 563 562 550 551 564 550 564 563 551 552 565 551 565 564 552 553 566 552 566 565 553 554 567 553 567 566 554 555 568 554 568 567 555 556 569 555 569 568 556 356 357 556 357 569 558 557 570 558 570 571 557 559 572 557 572 570 559 560 573 559 573 572 560 561 574 560 574 573 561 562 575 561 575 574 562 563 576 562 576 575 563 564 577 563 577 576 564 565 578 564 578 577 565 566 579 565 579 578 566 567 580 566 580 579 567 568 581 567 581 580 568 569 582 568 582 581 569 357 358 569 358 582 571 570 583 571 583 584 570 572 585 570 585 583 572 573 586 572 586 585 573 574 587 573 587 586 574 575 588 574 588 587 575 576 589 575 589 588 576 577 590 576 590 589 577 578 591 577 591 590 578 579 592 578 592 591 579 580 593 579 593 592 580 581 594 580 594 593 581 582 595 581 595 594 582 358 359 582 359 595 584 583 596 584 596 597 583 585 598 583 598 596 585 586 599 585 599 598 586 587 600 586 600 599 587 588 601 587 601 600 588 589 602 588 602 601 589 590 603 589 603 602 590 591 604 590 604 603 591 592 605 591 605 604 592 593 606 592 606 605 593 594 607 593 607 606 594 595 608 594 608 607 595 359 360 595 360 608 597 596 609 597 609 610 596 598 611 596 611 609 598 599 612 598 612 611 599 600 613 599 613 612 600 601 614 600 614 613 601 602 615 601 615 614 602 603 616 602 616 615 603 604 617 603 617 616 604 605 618 604 618 617 605 606 619 605 619 618 606 607 620 606 620 619 607 608 621 607 621 620 608 360 361 608 361 621 610 609 363 610 363 362 609 611 366 609 366 363 611 612 368 611 368 366 612 613 370 612 370 368 613 614 372 613 372 370 614 615 374 614 374 372 615 616 376 615 376 374 616 617 378 616 378 376 617 618 380 617 380 378 618 619 382 618 382 380 619 620 384 619 384 382 620 621 386 620 386 384 621 361 341 621 341 386 362 365 282 281 365 284 283 282 365 389 285 284 389 287 286 285 389 402 288 287 402 290 289 288 402 415 291 290 415 293 292 291 415 428 294 293 428 296 295 294 428 441 297 296 441 299 298 297 441 454 300 299 454 302 301 300 454 467 303 302 467 305 304 303 467 480 306 305 480 308 307 306 480 493 309 308 493 311 310 309 493 506 312 311 506 314 313 312 506 519 315 314 519 317 316 315 519 532 318 317 532 320 319 318 532 545 321 320 545 323 322 321 545 558 324 323 558 326 325 324 558 571 327 326 571 329 328 327 571 584 330 329 584 332 331 330 584 597 333 332 597 335 334 333 597 610 336 335 610 338 337 336 610 362 339 338 362 281 340 339 ================================================ FILE: testing/data/branched3.vtk ================================================ # vtk DataFile Version 5.1 vtk output ASCII DATASET POLYDATA POINTS 882 double 0.36786195636 0 0.33864077926 0.41858324409 0 0.27347406745 0.39809632301 0.12934933603 0.27347406745 0.34985750914 0.11367559433 0.33864077926 0.45788666606 0 0.20084771514 0.43547609448 0.14149476588 0.20084771514 0.48470014334 0 0.1227427423 0.4609772265 0.14978057146 0.1227427423 0.49829223752 0 0.041289672256 0.47390407324 0.15398077667 0.041289672256 0.49829223752 0 -0.041289672256 0.47390407324 0.15398077667 -0.041289672256 0.48470014334 0 -0.1227427423 0.4609772265 0.14978057146 -0.1227427423 0.45788666606 0 -0.20084771514 0.43547609448 0.14149476588 -0.20084771514 0.41858324409 0 -0.27347406745 0.39809632301 0.12934933603 -0.27347406745 0.36786195636 0 -0.33864077926 0.34985750914 0.11367559433 -0.33864077926 0.33864095807 0.24603705108 0.27347406745 0.29760658741 0.21622383595 0.33864077926 0.37043809891 0.26913902164 0.20084771514 0.39213064313 0.2848995924 0.1227427423 0.40312689543 0.29288882017 0.041289672256 0.40312689543 0.29288882017 -0.041289672256 0.39213064313 0.2848995924 -0.1227427423 0.37043809891 0.26913902164 -0.20084771514 0.33864095807 0.24603705108 -0.27347406745 0.29760658741 0.21622383595 -0.33864077926 0.24603705108 0.33864095807 0.27347406745 0.21622383595 0.29760658741 0.33864077926 0.26913902164 0.37043809891 0.20084771514 0.2848995924 0.39213064313 0.1227427423 0.29288882017 0.40312689543 0.041289672256 0.29288882017 0.40312689543 -0.041289672256 0.2848995924 0.39213064313 -0.1227427423 0.26913902164 0.37043809891 -0.20084771514 0.24603705108 0.33864095807 -0.27347406745 0.21622383595 0.29760658741 -0.33864077926 0.12934933603 0.39809632301 0.27347406745 0.11367559433 0.34985750914 0.33864077926 0.14149476588 0.43547609448 0.20084771514 0.14978057146 0.4609772265 0.1227427423 0.15398077667 0.47390407324 0.041289672256 0.15398077667 0.47390407324 -0.041289672256 0.14978057146 0.4609772265 -0.1227427423 0.14149476588 0.43547609448 -0.20084771514 0.12934933603 0.39809632301 -0.27347406745 0.11367559433 0.34985750914 -0.33864077926 2.5630831518e-17 0.41858324409 0.27347406745 2.2525047905e-17 0.36786195636 0.33864077926 2.8037472151e-17 0.45788666606 0.20084771514 2.9679323096e-17 0.48470014334 0.1227427423 3.0511599142e-17 0.49829223752 0.041289672256 3.0511599142e-17 0.49829223752 -0.041289672256 2.9679323096e-17 0.48470014334 -0.1227427423 2.8037472151e-17 0.45788666606 -0.20084771514 2.5630831518e-17 0.41858324409 -0.27347406745 2.2525047905e-17 0.36786195636 -0.33864077926 -0.12934933603 0.39809632301 0.27347406745 -0.11367559433 0.34985750914 0.33864077926 -0.14149476588 0.43547609448 0.20084771514 -0.14978057146 0.4609772265 0.1227427423 -0.15398077667 0.47390407324 0.041289672256 -0.15398077667 0.47390407324 -0.041289672256 -0.14978057146 0.4609772265 -0.1227427423 -0.14149476588 0.43547609448 -0.20084771514 -0.12934933603 0.39809632301 -0.27347406745 -0.11367559433 0.34985750914 -0.33864077926 -0.24603705108 0.33864095807 0.27347406745 -0.21622383595 0.29760658741 0.33864077926 -0.26913902164 0.37043809891 0.20084771514 -0.2848995924 0.39213064313 0.1227427423 -0.29288882017 0.40312689543 0.041289672256 -0.29288882017 0.40312689543 -0.041289672256 -0.2848995924 0.39213064313 -0.1227427423 -0.26913902164 0.37043809891 -0.20084771514 -0.24603705108 0.33864095807 -0.27347406745 -0.21622383595 0.29760658741 -0.33864077926 -0.33864095807 0.24603705108 0.27347406745 -0.29760658741 0.21622383595 0.33864077926 -0.37043809891 0.26913902164 0.20084771514 -0.39213064313 0.2848995924 0.1227427423 -0.40312689543 0.29288882017 0.041289672256 -0.40312689543 0.29288882017 -0.041289672256 -0.39213064313 0.2848995924 -0.1227427423 -0.37043809891 0.26913902164 -0.20084771514 -0.33864095807 0.24603705108 -0.27347406745 -0.29760658741 0.21622383595 -0.33864077926 -0.39809632301 0.12934933603 0.27347406745 -0.34985750914 0.11367559433 0.33864077926 -0.43547609448 0.14149476588 0.20084771514 -0.4609772265 0.14978057146 0.1227427423 -0.47390407324 0.15398077667 0.041289672256 -0.47390407324 0.15398077667 -0.041289672256 -0.4609772265 0.14978057146 -0.1227427423 -0.43547609448 0.14149476588 -0.20084771514 -0.39809632301 0.12934933603 -0.27347406745 -0.34985750914 0.11367559433 -0.33864077926 -0.41858324409 5.1261663035e-17 0.27347406745 -0.36786195636 4.5050095809e-17 0.33864077926 -0.45788666606 5.6074944302e-17 0.20084771514 -0.48470014334 5.9358646193e-17 0.1227427423 -0.49829223752 6.1023198283e-17 0.041289672256 -0.49829223752 6.1023198283e-17 -0.041289672256 -0.48470014334 5.9358646193e-17 -0.1227427423 -0.45788666606 5.6074944302e-17 -0.20084771514 -0.41858324409 5.1261663035e-17 -0.27347406745 -0.36786195636 4.5050095809e-17 -0.33864077926 -0.39809632301 -0.12934933603 0.27347406745 -0.34985750914 -0.11367559433 0.33864077926 -0.43547609448 -0.14149476588 0.20084771514 -0.4609772265 -0.14978057146 0.1227427423 -0.47390407324 -0.15398077667 0.041289672256 -0.47390407324 -0.15398077667 -0.041289672256 -0.4609772265 -0.14978057146 -0.1227427423 -0.43547609448 -0.14149476588 -0.20084771514 -0.39809632301 -0.12934933603 -0.27347406745 -0.34985750914 -0.11367559433 -0.33864077926 -0.33864095807 -0.24603705108 0.27347406745 -0.29760658741 -0.21622383595 0.33864077926 -0.37043809891 -0.26913902164 0.20084771514 -0.39213064313 -0.2848995924 0.1227427423 -0.40312689543 -0.29288882017 0.041289672256 -0.40312689543 -0.29288882017 -0.041289672256 -0.39213064313 -0.2848995924 -0.1227427423 -0.37043809891 -0.26913902164 -0.20084771514 -0.33864095807 -0.24603705108 -0.27347406745 -0.29760658741 -0.21622383595 -0.33864077926 -0.24603705108 -0.33864095807 0.27347406745 -0.21622383595 -0.29760658741 0.33864077926 -0.26913902164 -0.37043809891 0.20084771514 -0.2848995924 -0.39213064313 0.1227427423 -0.29288882017 -0.40312689543 0.041289672256 -0.29288882017 -0.40312689543 -0.041289672256 -0.2848995924 -0.39213064313 -0.1227427423 -0.26913902164 -0.37043809891 -0.20084771514 -0.24603705108 -0.33864095807 -0.27347406745 -0.21622383595 -0.29760658741 -0.33864077926 -0.12934933603 -0.39809632301 0.27347406745 -0.11367559433 -0.34985750914 0.33864077926 -0.14149476588 -0.43547609448 0.20084771514 -0.14978057146 -0.4609772265 0.1227427423 -0.15398077667 -0.47390407324 0.041289672256 -0.15398077667 -0.47390407324 -0.041289672256 -0.14978057146 -0.4609772265 -0.1227427423 -0.14149476588 -0.43547609448 -0.20084771514 -0.12934933603 -0.39809632301 -0.27347406745 -0.11367559433 -0.34985750914 -0.33864077926 -7.6892492899e-17 -0.41858324409 0.27347406745 -6.7575143714e-17 -0.36786195636 0.33864077926 -8.4112416453e-17 -0.45788666606 0.20084771514 -8.9037972598e-17 -0.48470014334 0.1227427423 -9.1534800733e-17 -0.49829223752 0.041289672256 -9.1534800733e-17 -0.49829223752 -0.041289672256 -8.9037972598e-17 -0.48470014334 -0.1227427423 -8.4112416453e-17 -0.45788666606 -0.20084771514 -7.6892492899e-17 -0.41858324409 -0.27347406745 -6.7575143714e-17 -0.36786195636 -0.33864077926 0.12934933603 -0.39809632301 0.27347406745 0.11367559433 -0.34985750914 0.33864077926 0.14149476588 -0.43547609448 0.20084771514 0.14978057146 -0.4609772265 0.1227427423 0.15398077667 -0.47390407324 0.041289672256 0.15398077667 -0.47390407324 -0.041289672256 0.14978057146 -0.4609772265 -0.1227427423 0.14149476588 -0.43547609448 -0.20084771514 0.12934933603 -0.39809632301 -0.27347406745 0.11367559433 -0.34985750914 -0.33864077926 0.24603705108 -0.33864095807 0.27347406745 0.21622383595 -0.29760658741 0.33864077926 0.26913902164 -0.37043809891 0.20084771514 0.2848995924 -0.39213064313 0.1227427423 0.29288882017 -0.40312689543 0.041289672256 0.29288882017 -0.40312689543 -0.041289672256 0.2848995924 -0.39213064313 -0.1227427423 0.26913902164 -0.37043809891 -0.20084771514 0.24603705108 -0.33864095807 -0.27347406745 0.21622383595 -0.29760658741 -0.33864077926 0.33864095807 -0.24603705108 0.27347406745 0.29760658741 -0.21622383595 0.33864077926 0.37043809891 -0.26913902164 0.20084771514 0.39213064313 -0.2848995924 0.1227427423 0.40312689543 -0.29288882017 0.041289672256 0.40312689543 -0.29288882017 -0.041289672256 0.39213064313 -0.2848995924 -0.1227427423 0.37043809891 -0.26913902164 -0.20084771514 0.33864095807 -0.24603705108 -0.27347406745 0.29760658741 -0.21622383595 -0.33864077926 0.39809632301 -0.12934933603 0.27347406745 0.34985750914 -0.11367559433 0.33864077926 0.43547609448 -0.14149476588 0.20084771514 0.4609772265 -0.14978057146 0.1227427423 0.47390407324 -0.15398077667 0.041289672256 0.47390407324 -0.15398077667 -0.041289672256 0.4609772265 -0.14978057146 -0.1227427423 0.43547609448 -0.14149476588 -0.20084771514 0.39809632301 -0.12934933603 -0.27347406745 0.34985750914 -0.11367559433 -0.33864077926 0.3283653157 -6.2943287406e-18 -0.375 0.32206539101 0.039776188896 -0.37500000495 0.3185939096 0.061694295065 -0.37500000495 0.31229398784 0.10147046551 -0.375 0.29401088955 0.13735306593 -0.37499999486 0.28393623568 0.15712568057 -0.37499999486 0.26565312857 0.1930082983 -0.375 0.23717652463 0.22148490223 -0.375 0.22148490223 0.23717652463 -0.375 0.1930082983 0.26565312857 -0.375 0.15712568057 0.28393623568 -0.37500000514 0.13735306593 0.29401088955 -0.37500000514 0.10147046551 0.31229398784 -0.375 0.061694295065 0.3185939096 -0.37499999505 0.039776188896 0.32206539101 -0.37499999505 2.5828452418e-17 0.3283653157 -0.375 -0.039776188896 0.32206539101 -0.37500000495 -0.061694295065 0.3185939096 -0.37500000495 -0.10147046551 0.31229398784 -0.375 -0.13735306593 0.29401088955 -0.37499999486 -0.15712568057 0.28393623568 -0.37499999486 -0.1930082983 0.26565312857 -0.375 -0.22148490223 0.23717652463 -0.375 -0.23717652463 0.22148490223 -0.375 -0.26565312857 0.1930082983 -0.375 -0.28393623568 0.15712568057 -0.37500000514 -0.29401088955 0.13735306593 -0.37500000514 -0.31229398784 0.10147046551 -0.375 -0.3185939096 0.061694295065 -0.37499999505 -0.32206539101 0.039776188896 -0.37499999505 -0.3283653157 4.1448352812e-17 -0.375 -0.32206539101 -0.039776188896 -0.37500000495 -0.3185939096 -0.061694295065 -0.37500000495 -0.31229398784 -0.10147046551 -0.375 -0.29401088955 -0.13735306593 -0.37499999486 -0.28393623568 -0.15712568057 -0.37499999486 -0.26565312857 -0.1930082983 -0.375 -0.23717652463 -0.22148490223 -0.375 -0.22148490223 -0.23717652463 -0.375 -0.1930082983 -0.26565312857 -0.375 -0.15712568057 -0.28393623568 -0.37500000514 -0.13735306593 -0.29401088955 -0.37500000514 -0.10147046551 -0.31229398784 -0.375 -0.061694295065 -0.3185939096 -0.37499999505 -0.039776188896 -0.32206539101 -0.37499999505 -6.1641014888e-17 -0.3283653157 -0.375 0.039776188896 -0.32206539101 -0.37500000495 0.061694295065 -0.3185939096 -0.37500000495 0.10147046551 -0.31229398784 -0.375 0.13735306593 -0.29401088955 -0.37499999486 0.15712568057 -0.28393623568 -0.37499999486 0.1930082983 -0.26565312857 -0.375 0.22148490223 -0.23717652463 -0.375 0.23717652463 -0.22148490223 -0.375 0.26565312857 -0.1930082983 -0.375 0.28393623568 -0.15712568057 -0.37500000514 0.29401088955 -0.13735306593 -0.37500000514 0.31229398784 -0.10147046551 -0.375 0.3185939096 -0.061694295065 -0.37499999505 0.32206539101 -0.039776188896 -0.37499999505 0.082297295332 0 -1.2431806326 0 0 -1.25 0.078269377351 0.025431262329 -1.2431806326 0.066579908133 0.048373136669 -1.2431806326 0.048373136669 0.066579908133 -1.2431806326 0.025431262329 0.078269377351 -1.2431806326 5.0392558428e-18 0.082297295332 -1.2431806326 -0.025431262329 0.078269377351 -1.2431806326 -0.048373136669 0.066579908133 -1.2431806326 -0.066579908133 0.048373136669 -1.2431806326 -0.078269377351 0.025431262329 -1.2431806326 -0.082297295332 1.0078511686e-17 -1.2431806326 -0.078269377351 -0.025431262329 -1.2431806326 -0.066579908133 -0.048373136669 -1.2431806326 -0.048373136669 -0.066579908133 -1.2431806326 -0.025431262329 -0.078269377351 -1.2431806326 -1.5117767942e-17 -0.082297295332 -1.2431806326 0.025431262329 -0.078269377351 -1.2431806326 0.048373136669 -0.066579908133 -1.2431806326 0.066579908133 -0.048373136669 -1.2431806326 0.078269377351 -0.025431262329 -1.2431806326 0.36786195636 0 -0.41135922074 0.41858324409 0 -0.47652593255 0.39809632301 0.12934933603 -0.47652593255 0.34985750914 0.11367559433 -0.41135922074 0.45788666606 0 -0.54915231466 0.43547609448 0.14149476588 -0.54915231466 0.48470014334 0 -0.6272572279 0.4609772265 0.14978057146 -0.6272572279 0.49829223752 0 -0.70871031284 0.47390407324 0.15398077667 -0.70871031284 0.49829223752 0 -0.79128968716 0.47390407324 0.15398077667 -0.79128968716 0.48470014334 0 -0.8727427721 0.4609772265 0.14978057146 -0.8727427721 0.45788666606 0 -0.95084768534 0.43547609448 0.14149476588 -0.95084768534 0.41858324409 0 -1.0234740973 0.39809632301 0.12934933603 -1.0234740973 0.36786195636 0 -1.0886408091 0.34985750914 0.11367559433 -1.0886408091 0.30710634589 0 -1.1445702314 0.29207551479 0.0949010849 -1.1445702314 0.23797369003 0 -1.1897368431 0.2263264358 0.073537915945 -1.1897368431 0.16234973073 0 -1.2229086161 0.15440377593 0.050168827176 -1.2229086161 0.33864095807 0.24603705108 -0.47652593255 0.29760658741 0.21622383595 -0.41135922074 0.37043809891 0.26913902164 -0.54915231466 0.39213064313 0.2848995924 -0.6272572279 0.40312689543 0.29288882017 -0.70871031284 0.40312689543 0.29288882017 -0.79128968716 0.39213064313 0.2848995924 -0.8727427721 0.37043809891 0.26913902164 -0.95084768534 0.33864095807 0.24603705108 -1.0234740973 0.29760658741 0.21622383595 -1.0886408091 0.24845425785 0.1805125922 -1.1445702314 0.19252476096 0.13987742364 -1.1897368431 0.13134369254 0.095426782966 -1.2229086161 0.24603705108 0.33864095807 -0.47652593255 0.21622383595 0.29760658741 -0.41135922074 0.26913902164 0.37043809891 -0.54915231466 0.2848995924 0.39213064313 -0.6272572279 0.29288882017 0.40312689543 -0.70871031284 0.29288882017 0.40312689543 -0.79128968716 0.2848995924 0.39213064313 -0.8727427721 0.26913902164 0.37043809891 -0.95084768534 0.24603705108 0.33864095807 -1.0234740973 0.21622383595 0.29760658741 -1.0886408091 0.1805125922 0.24845425785 -1.1445702314 0.13987742364 0.19252476096 -1.1897368431 0.095426782966 0.13134369254 -1.2229086161 0.12934933603 0.39809632301 -0.47652593255 0.11367559433 0.34985750914 -0.41135922074 0.14149476588 0.43547609448 -0.54915231466 0.14978057146 0.4609772265 -0.6272572279 0.15398077667 0.47390407324 -0.70871031284 0.15398077667 0.47390407324 -0.79128968716 0.14978057146 0.4609772265 -0.8727427721 0.14149476588 0.43547609448 -0.95084768534 0.12934933603 0.39809632301 -1.0234740973 0.11367559433 0.34985750914 -1.0886408091 0.0949010849 0.29207551479 -1.1445702314 0.073537915945 0.2263264358 -1.1897368431 0.050168827176 0.15440377593 -1.2229086161 2.5630831518e-17 0.41858324409 -0.47652593255 2.2525047905e-17 0.36786195636 -0.41135922074 2.8037472151e-17 0.45788666606 -0.54915231466 2.9679323096e-17 0.48470014334 -0.6272572279 3.0511599142e-17 0.49829223752 -0.70871031284 3.0511599142e-17 0.49829223752 -0.79128968716 2.9679323096e-17 0.48470014334 -0.8727427721 2.8037472151e-17 0.45788666606 -0.95084768534 2.5630831518e-17 0.41858324409 -1.0234740973 2.2525047905e-17 0.36786195636 -1.0886408091 1.880484115e-17 0.30710634589 -1.1445702314 1.4571686463e-17 0.23797369003 -1.1897368431 9.9410541201e-18 0.16234973073 -1.2229086161 -0.12934933603 0.39809632301 -0.47652593255 -0.11367559433 0.34985750914 -0.41135922074 -0.14149476588 0.43547609448 -0.54915231466 -0.14978057146 0.4609772265 -0.6272572279 -0.15398077667 0.47390407324 -0.70871031284 -0.15398077667 0.47390407324 -0.79128968716 -0.14978057146 0.4609772265 -0.8727427721 -0.14149476588 0.43547609448 -0.95084768534 -0.12934933603 0.39809632301 -1.0234740973 -0.11367559433 0.34985750914 -1.0886408091 -0.0949010849 0.29207551479 -1.1445702314 -0.073537915945 0.2263264358 -1.1897368431 -0.050168827176 0.15440377593 -1.2229086161 -0.24603705108 0.33864095807 -0.47652593255 -0.21622383595 0.29760658741 -0.41135922074 -0.26913902164 0.37043809891 -0.54915231466 -0.2848995924 0.39213064313 -0.6272572279 -0.29288882017 0.40312689543 -0.70871031284 -0.29288882017 0.40312689543 -0.79128968716 -0.2848995924 0.39213064313 -0.8727427721 -0.26913902164 0.37043809891 -0.95084768534 -0.24603705108 0.33864095807 -1.0234740973 -0.21622383595 0.29760658741 -1.0886408091 -0.1805125922 0.24845425785 -1.1445702314 -0.13987742364 0.19252476096 -1.1897368431 -0.095426782966 0.13134369254 -1.2229086161 -0.33864095807 0.24603705108 -0.47652593255 -0.29760658741 0.21622383595 -0.41135922074 -0.37043809891 0.26913902164 -0.54915231466 -0.39213064313 0.2848995924 -0.6272572279 -0.40312689543 0.29288882017 -0.70871031284 -0.40312689543 0.29288882017 -0.79128968716 -0.39213064313 0.2848995924 -0.8727427721 -0.37043809891 0.26913902164 -0.95084768534 -0.33864095807 0.24603705108 -1.0234740973 -0.29760658741 0.21622383595 -1.0886408091 -0.24845425785 0.1805125922 -1.1445702314 -0.19252476096 0.13987742364 -1.1897368431 -0.13134369254 0.095426782966 -1.2229086161 -0.39809632301 0.12934933603 -0.47652593255 -0.34985750914 0.11367559433 -0.41135922074 -0.43547609448 0.14149476588 -0.54915231466 -0.4609772265 0.14978057146 -0.6272572279 -0.47390407324 0.15398077667 -0.70871031284 -0.47390407324 0.15398077667 -0.79128968716 -0.4609772265 0.14978057146 -0.8727427721 -0.43547609448 0.14149476588 -0.95084768534 -0.39809632301 0.12934933603 -1.0234740973 -0.34985750914 0.11367559433 -1.0886408091 -0.29207551479 0.0949010849 -1.1445702314 -0.2263264358 0.073537915945 -1.1897368431 -0.15440377593 0.050168827176 -1.2229086161 -0.41858324409 5.1261663035e-17 -0.47652593255 -0.36786195636 4.5050095809e-17 -0.41135922074 -0.45788666606 5.6074944302e-17 -0.54915231466 -0.48470014334 5.9358646193e-17 -0.6272572279 -0.49829223752 6.1023198283e-17 -0.70871031284 -0.49829223752 6.1023198283e-17 -0.79128968716 -0.48470014334 5.9358646193e-17 -0.8727427721 -0.45788666606 5.6074944302e-17 -0.95084768534 -0.41858324409 5.1261663035e-17 -1.0234740973 -0.36786195636 4.5050095809e-17 -1.0886408091 -0.30710634589 3.76096823e-17 -1.1445702314 -0.23797369003 2.9143372925e-17 -1.1897368431 -0.16234973073 1.988210824e-17 -1.2229086161 -0.39809632301 -0.12934933603 -0.47652593255 -0.34985750914 -0.11367559433 -0.41135922074 -0.43547609448 -0.14149476588 -0.54915231466 -0.4609772265 -0.14978057146 -0.6272572279 -0.47390407324 -0.15398077667 -0.70871031284 -0.47390407324 -0.15398077667 -0.79128968716 -0.4609772265 -0.14978057146 -0.8727427721 -0.43547609448 -0.14149476588 -0.95084768534 -0.39809632301 -0.12934933603 -1.0234740973 -0.34985750914 -0.11367559433 -1.0886408091 -0.29207551479 -0.0949010849 -1.1445702314 -0.2263264358 -0.073537915945 -1.1897368431 -0.15440377593 -0.050168827176 -1.2229086161 -0.33864095807 -0.24603705108 -0.47652593255 -0.29760658741 -0.21622383595 -0.41135922074 -0.37043809891 -0.26913902164 -0.54915231466 -0.39213064313 -0.2848995924 -0.6272572279 -0.40312689543 -0.29288882017 -0.70871031284 -0.40312689543 -0.29288882017 -0.79128968716 -0.39213064313 -0.2848995924 -0.8727427721 -0.37043809891 -0.26913902164 -0.95084768534 -0.33864095807 -0.24603705108 -1.0234740973 -0.29760658741 -0.21622383595 -1.0886408091 -0.24845425785 -0.1805125922 -1.1445702314 -0.19252476096 -0.13987742364 -1.1897368431 -0.13134369254 -0.095426782966 -1.2229086161 -0.24603705108 -0.33864095807 -0.47652593255 -0.21622383595 -0.29760658741 -0.41135922074 -0.26913902164 -0.37043809891 -0.54915231466 -0.2848995924 -0.39213064313 -0.6272572279 -0.29288882017 -0.40312689543 -0.70871031284 -0.29288882017 -0.40312689543 -0.79128968716 -0.2848995924 -0.39213064313 -0.8727427721 -0.26913902164 -0.37043809891 -0.95084768534 -0.24603705108 -0.33864095807 -1.0234740973 -0.21622383595 -0.29760658741 -1.0886408091 -0.1805125922 -0.24845425785 -1.1445702314 -0.13987742364 -0.19252476096 -1.1897368431 -0.095426782966 -0.13134369254 -1.2229086161 -0.12934933603 -0.39809632301 -0.47652593255 -0.11367559433 -0.34985750914 -0.41135922074 -0.14149476588 -0.43547609448 -0.54915231466 -0.14978057146 -0.4609772265 -0.6272572279 -0.15398077667 -0.47390407324 -0.70871031284 -0.15398077667 -0.47390407324 -0.79128968716 -0.14978057146 -0.4609772265 -0.8727427721 -0.14149476588 -0.43547609448 -0.95084768534 -0.12934933603 -0.39809632301 -1.0234740973 -0.11367559433 -0.34985750914 -1.0886408091 -0.0949010849 -0.29207551479 -1.1445702314 -0.073537915945 -0.2263264358 -1.1897368431 -0.050168827176 -0.15440377593 -1.2229086161 -7.6892492899e-17 -0.41858324409 -0.47652593255 -6.7575143714e-17 -0.36786195636 -0.41135922074 -8.4112416453e-17 -0.45788666606 -0.54915231466 -8.9037972598e-17 -0.48470014334 -0.6272572279 -9.1534800733e-17 -0.49829223752 -0.70871031284 -9.1534800733e-17 -0.49829223752 -0.79128968716 -8.9037972598e-17 -0.48470014334 -0.8727427721 -8.4112416453e-17 -0.45788666606 -0.95084768534 -7.6892492899e-17 -0.41858324409 -1.0234740973 -6.7575143714e-17 -0.36786195636 -1.0886408091 -5.6414525104e-17 -0.30710634589 -1.1445702314 -4.3715059388e-17 -0.23797369003 -1.1897368431 -2.9823163188e-17 -0.16234973073 -1.2229086161 0.12934933603 -0.39809632301 -0.47652593255 0.11367559433 -0.34985750914 -0.41135922074 0.14149476588 -0.43547609448 -0.54915231466 0.14978057146 -0.4609772265 -0.6272572279 0.15398077667 -0.47390407324 -0.70871031284 0.15398077667 -0.47390407324 -0.79128968716 0.14978057146 -0.4609772265 -0.8727427721 0.14149476588 -0.43547609448 -0.95084768534 0.12934933603 -0.39809632301 -1.0234740973 0.11367559433 -0.34985750914 -1.0886408091 0.0949010849 -0.29207551479 -1.1445702314 0.073537915945 -0.2263264358 -1.1897368431 0.050168827176 -0.15440377593 -1.2229086161 0.24603705108 -0.33864095807 -0.47652593255 0.21622383595 -0.29760658741 -0.41135922074 0.26913902164 -0.37043809891 -0.54915231466 0.2848995924 -0.39213064313 -0.6272572279 0.29288882017 -0.40312689543 -0.70871031284 0.29288882017 -0.40312689543 -0.79128968716 0.2848995924 -0.39213064313 -0.8727427721 0.26913902164 -0.37043809891 -0.95084768534 0.24603705108 -0.33864095807 -1.0234740973 0.21622383595 -0.29760658741 -1.0886408091 0.1805125922 -0.24845425785 -1.1445702314 0.13987742364 -0.19252476096 -1.1897368431 0.095426782966 -0.13134369254 -1.2229086161 0.33864095807 -0.24603705108 -0.47652593255 0.29760658741 -0.21622383595 -0.41135922074 0.37043809891 -0.26913902164 -0.54915231466 0.39213064313 -0.2848995924 -0.6272572279 0.40312689543 -0.29288882017 -0.70871031284 0.40312689543 -0.29288882017 -0.79128968716 0.39213064313 -0.2848995924 -0.8727427721 0.37043809891 -0.26913902164 -0.95084768534 0.33864095807 -0.24603705108 -1.0234740973 0.29760658741 -0.21622383595 -1.0886408091 0.24845425785 -0.1805125922 -1.1445702314 0.19252476096 -0.13987742364 -1.1897368431 0.13134369254 -0.095426782966 -1.2229086161 0.39809632301 -0.12934933603 -0.47652593255 0.34985750914 -0.11367559433 -0.41135922074 0.43547609448 -0.14149476588 -0.54915231466 0.4609772265 -0.14978057146 -0.6272572279 0.47390407324 -0.15398077667 -0.70871031284 0.47390407324 -0.15398077667 -0.79128968716 0.4609772265 -0.14978057146 -0.8727427721 0.43547609448 -0.14149476588 -0.95084768534 0.39809632301 -0.12934933603 -1.0234740973 0.34985750914 -0.11367559433 -1.0886408091 0.29207551479 -0.0949010849 -1.1445702314 0.2263264358 -0.073537915945 -1.1897368431 0.15440377593 -0.050168827176 -1.2229086161 0.32206539101 0.039776188896 0.37499999505 0.3283653157 6.2943287406e-18 0.375 0.31229398784 0.10147046551 0.375 0.3185939096 0.061694295065 0.37499999505 0.29401088955 0.13735306593 0.37500000514 0.26565312857 0.1930082983 0.375 0.28393623568 0.15712568057 0.37500000514 0.23717652463 0.22148490223 0.375 0.1930082983 0.26565312857 0.375 0.22148490223 0.23717652463 0.375 0.15712568057 0.28393623568 0.37499999486 0.10147046551 0.31229398784 0.375 0.13735306593 0.29401088955 0.37499999486 0.061694295065 0.3185939096 0.37500000495 1.779775782e-17 0.3283653157 0.375 0.039776188896 0.32206539101 0.37500000495 -0.039776188896 0.32206539101 0.37499999505 -0.10147046551 0.31229398784 0.375 -0.061694295065 0.3185939096 0.37499999505 -0.13735306593 0.29401088955 0.37500000514 -0.1930082983 0.26565312857 0.375 -0.15712568057 0.28393623568 0.37500000514 -0.22148490223 0.23717652463 0.375 -0.26565312857 0.1930082983 0.375 -0.23717652463 0.22148490223 0.375 -0.28393623568 0.15712568057 0.37499999486 -0.31229398784 0.10147046551 0.375 -0.29401088955 0.13735306593 0.37499999486 -0.3185939096 0.061694295065 0.37500000495 -0.3283653157 3.7802275371e-17 0.375 -0.32206539101 0.039776188896 0.37500000495 -0.32206539101 -0.039776188896 0.37499999505 -0.31229398784 -0.10147046551 0.375 -0.3185939096 -0.061694295065 0.37499999505 -0.29401088955 -0.13735306593 0.37500000514 -0.26565312857 -0.1930082983 0.375 -0.28393623568 -0.15712568057 0.37500000514 -0.23717652463 -0.22148490223 0.375 -0.1930082983 -0.26565312857 0.375 -0.22148490223 -0.23717652463 0.375 -0.15712568057 -0.28393623568 0.37499999486 -0.10147046551 -0.31229398784 0.375 -0.13735306593 -0.29401088955 0.37499999486 -0.061694295065 -0.3185939096 0.37500000495 -5.7734190001e-17 -0.3283653157 0.375 -0.039776188896 -0.32206539101 0.37500000495 0.039776188896 -0.32206539101 0.37499999505 0.10147046551 -0.31229398784 0.375 0.061694295065 -0.3185939096 0.37499999505 0.13735306593 -0.29401088955 0.37500000514 0.1930082983 -0.26565312857 0.375 0.15712568057 -0.28393623568 0.37500000514 0.22148490223 -0.23717652463 0.375 0.26565312857 -0.1930082983 0.375 0.23717652463 -0.22148490223 0.375 0.28393623568 -0.15712568057 0.37499999486 0.31229398784 -0.10147046551 0.375 0.29401088955 -0.13735306593 0.37499999486 0.3185939096 -0.061694295065 0.37500000495 0.32206539101 -0.039776188896 0.37500000495 0.082297295332 0 1.2431806326 0.078269377351 0.025431262329 1.2431806326 0 0 1.25 0.066579908133 0.048373136669 1.2431806326 0.048373136669 0.066579908133 1.2431806326 0.025431262329 0.078269377351 1.2431806326 5.0392558428e-18 0.082297295332 1.2431806326 -0.025431262329 0.078269377351 1.2431806326 -0.048373136669 0.066579908133 1.2431806326 -0.066579908133 0.048373136669 1.2431806326 -0.078269377351 0.025431262329 1.2431806326 -0.082297295332 1.0078511686e-17 1.2431806326 -0.078269377351 -0.025431262329 1.2431806326 -0.066579908133 -0.048373136669 1.2431806326 -0.048373136669 -0.066579908133 1.2431806326 -0.025431262329 -0.078269377351 1.2431806326 -1.5117767942e-17 -0.082297295332 1.2431806326 0.025431262329 -0.078269377351 1.2431806326 0.048373136669 -0.066579908133 1.2431806326 0.066579908133 -0.048373136669 1.2431806326 0.078269377351 -0.025431262329 1.2431806326 0.16234973073 0 1.2229086161 0.15440377593 0.050168827176 1.2229086161 0.23797369003 0 1.1897368431 0.2263264358 0.073537915945 1.1897368431 0.30710634589 0 1.1445702314 0.29207551479 0.0949010849 1.1445702314 0.36786195636 0 1.0886408091 0.34985750914 0.11367559433 1.0886408091 0.41858324409 0 1.0234740973 0.39809632301 0.12934933603 1.0234740973 0.45788666606 0 0.95084768534 0.43547609448 0.14149476588 0.95084768534 0.48470014334 0 0.8727427721 0.4609772265 0.14978057146 0.8727427721 0.49829223752 0 0.79128968716 0.47390407324 0.15398077667 0.79128968716 0.49829223752 0 0.70871031284 0.47390407324 0.15398077667 0.70871031284 0.48470014334 0 0.6272572279 0.4609772265 0.14978057146 0.6272572279 0.45788666606 0 0.54915231466 0.43547609448 0.14149476588 0.54915231466 0.41858324409 0 0.47652593255 0.39809632301 0.12934933603 0.47652593255 0.36786195636 0 0.41135922074 0.34985750914 0.11367559433 0.41135922074 0.13134369254 0.095426782966 1.2229086161 0.19252476096 0.13987742364 1.1897368431 0.24845425785 0.1805125922 1.1445702314 0.29760658741 0.21622383595 1.0886408091 0.33864095807 0.24603705108 1.0234740973 0.37043809891 0.26913902164 0.95084768534 0.39213064313 0.2848995924 0.8727427721 0.40312689543 0.29288882017 0.79128968716 0.40312689543 0.29288882017 0.70871031284 0.39213064313 0.2848995924 0.6272572279 0.37043809891 0.26913902164 0.54915231466 0.33864095807 0.24603705108 0.47652593255 0.29760658741 0.21622383595 0.41135922074 0.095426782966 0.13134369254 1.2229086161 0.13987742364 0.19252476096 1.1897368431 0.1805125922 0.24845425785 1.1445702314 0.21622383595 0.29760658741 1.0886408091 0.24603705108 0.33864095807 1.0234740973 0.26913902164 0.37043809891 0.95084768534 0.2848995924 0.39213064313 0.8727427721 0.29288882017 0.40312689543 0.79128968716 0.29288882017 0.40312689543 0.70871031284 0.2848995924 0.39213064313 0.6272572279 0.26913902164 0.37043809891 0.54915231466 0.24603705108 0.33864095807 0.47652593255 0.21622383595 0.29760658741 0.41135922074 0.050168827176 0.15440377593 1.2229086161 0.073537915945 0.2263264358 1.1897368431 0.0949010849 0.29207551479 1.1445702314 0.11367559433 0.34985750914 1.0886408091 0.12934933603 0.39809632301 1.0234740973 0.14149476588 0.43547609448 0.95084768534 0.14978057146 0.4609772265 0.8727427721 0.15398077667 0.47390407324 0.79128968716 0.15398077667 0.47390407324 0.70871031284 0.14978057146 0.4609772265 0.6272572279 0.14149476588 0.43547609448 0.54915231466 0.12934933603 0.39809632301 0.47652593255 0.11367559433 0.34985750914 0.41135922074 9.9410541201e-18 0.16234973073 1.2229086161 1.4571686463e-17 0.23797369003 1.1897368431 1.880484115e-17 0.30710634589 1.1445702314 2.2525047905e-17 0.36786195636 1.0886408091 2.5630831518e-17 0.41858324409 1.0234740973 2.8037472151e-17 0.45788666606 0.95084768534 2.9679323096e-17 0.48470014334 0.8727427721 3.0511599142e-17 0.49829223752 0.79128968716 3.0511599142e-17 0.49829223752 0.70871031284 2.9679323096e-17 0.48470014334 0.6272572279 2.8037472151e-17 0.45788666606 0.54915231466 2.5630831518e-17 0.41858324409 0.47652593255 2.2525047905e-17 0.36786195636 0.41135922074 -0.050168827176 0.15440377593 1.2229086161 -0.073537915945 0.2263264358 1.1897368431 -0.0949010849 0.29207551479 1.1445702314 -0.11367559433 0.34985750914 1.0886408091 -0.12934933603 0.39809632301 1.0234740973 -0.14149476588 0.43547609448 0.95084768534 -0.14978057146 0.4609772265 0.8727427721 -0.15398077667 0.47390407324 0.79128968716 -0.15398077667 0.47390407324 0.70871031284 -0.14978057146 0.4609772265 0.6272572279 -0.14149476588 0.43547609448 0.54915231466 -0.12934933603 0.39809632301 0.47652593255 -0.11367559433 0.34985750914 0.41135922074 -0.095426782966 0.13134369254 1.2229086161 -0.13987742364 0.19252476096 1.1897368431 -0.1805125922 0.24845425785 1.1445702314 -0.21622383595 0.29760658741 1.0886408091 -0.24603705108 0.33864095807 1.0234740973 -0.26913902164 0.37043809891 0.95084768534 -0.2848995924 0.39213064313 0.8727427721 -0.29288882017 0.40312689543 0.79128968716 -0.29288882017 0.40312689543 0.70871031284 -0.2848995924 0.39213064313 0.6272572279 -0.26913902164 0.37043809891 0.54915231466 -0.24603705108 0.33864095807 0.47652593255 -0.21622383595 0.29760658741 0.41135922074 -0.13134369254 0.095426782966 1.2229086161 -0.19252476096 0.13987742364 1.1897368431 -0.24845425785 0.1805125922 1.1445702314 -0.29760658741 0.21622383595 1.0886408091 -0.33864095807 0.24603705108 1.0234740973 -0.37043809891 0.26913902164 0.95084768534 -0.39213064313 0.2848995924 0.8727427721 -0.40312689543 0.29288882017 0.79128968716 -0.40312689543 0.29288882017 0.70871031284 -0.39213064313 0.2848995924 0.6272572279 -0.37043809891 0.26913902164 0.54915231466 -0.33864095807 0.24603705108 0.47652593255 -0.29760658741 0.21622383595 0.41135922074 -0.15440377593 0.050168827176 1.2229086161 -0.2263264358 0.073537915945 1.1897368431 -0.29207551479 0.0949010849 1.1445702314 -0.34985750914 0.11367559433 1.0886408091 -0.39809632301 0.12934933603 1.0234740973 -0.43547609448 0.14149476588 0.95084768534 -0.4609772265 0.14978057146 0.8727427721 -0.47390407324 0.15398077667 0.79128968716 -0.47390407324 0.15398077667 0.70871031284 -0.4609772265 0.14978057146 0.6272572279 -0.43547609448 0.14149476588 0.54915231466 -0.39809632301 0.12934933603 0.47652593255 -0.34985750914 0.11367559433 0.41135922074 -0.16234973073 1.988210824e-17 1.2229086161 -0.23797369003 2.9143372925e-17 1.1897368431 -0.30710634589 3.76096823e-17 1.1445702314 -0.36786195636 4.5050095809e-17 1.0886408091 -0.41858324409 5.1261663035e-17 1.0234740973 -0.45788666606 5.6074944302e-17 0.95084768534 -0.48470014334 5.9358646193e-17 0.8727427721 -0.49829223752 6.1023198283e-17 0.79128968716 -0.49829223752 6.1023198283e-17 0.70871031284 -0.48470014334 5.9358646193e-17 0.6272572279 -0.45788666606 5.6074944302e-17 0.54915231466 -0.41858324409 5.1261663035e-17 0.47652593255 -0.36786195636 4.5050095809e-17 0.41135922074 -0.15440377593 -0.050168827176 1.2229086161 -0.2263264358 -0.073537915945 1.1897368431 -0.29207551479 -0.0949010849 1.1445702314 -0.34985750914 -0.11367559433 1.0886408091 -0.39809632301 -0.12934933603 1.0234740973 -0.43547609448 -0.14149476588 0.95084768534 -0.4609772265 -0.14978057146 0.8727427721 -0.47390407324 -0.15398077667 0.79128968716 -0.47390407324 -0.15398077667 0.70871031284 -0.4609772265 -0.14978057146 0.6272572279 -0.43547609448 -0.14149476588 0.54915231466 -0.39809632301 -0.12934933603 0.47652593255 -0.34985750914 -0.11367559433 0.41135922074 -0.13134369254 -0.095426782966 1.2229086161 -0.19252476096 -0.13987742364 1.1897368431 -0.24845425785 -0.1805125922 1.1445702314 -0.29760658741 -0.21622383595 1.0886408091 -0.33864095807 -0.24603705108 1.0234740973 -0.37043809891 -0.26913902164 0.95084768534 -0.39213064313 -0.2848995924 0.8727427721 -0.40312689543 -0.29288882017 0.79128968716 -0.40312689543 -0.29288882017 0.70871031284 -0.39213064313 -0.2848995924 0.6272572279 -0.37043809891 -0.26913902164 0.54915231466 -0.33864095807 -0.24603705108 0.47652593255 -0.29760658741 -0.21622383595 0.41135922074 -0.095426782966 -0.13134369254 1.2229086161 -0.13987742364 -0.19252476096 1.1897368431 -0.1805125922 -0.24845425785 1.1445702314 -0.21622383595 -0.29760658741 1.0886408091 -0.24603705108 -0.33864095807 1.0234740973 -0.26913902164 -0.37043809891 0.95084768534 -0.2848995924 -0.39213064313 0.8727427721 -0.29288882017 -0.40312689543 0.79128968716 -0.29288882017 -0.40312689543 0.70871031284 -0.2848995924 -0.39213064313 0.6272572279 -0.26913902164 -0.37043809891 0.54915231466 -0.24603705108 -0.33864095807 0.47652593255 -0.21622383595 -0.29760658741 0.41135922074 -0.050168827176 -0.15440377593 1.2229086161 -0.073537915945 -0.2263264358 1.1897368431 -0.0949010849 -0.29207551479 1.1445702314 -0.11367559433 -0.34985750914 1.0886408091 -0.12934933603 -0.39809632301 1.0234740973 -0.14149476588 -0.43547609448 0.95084768534 -0.14978057146 -0.4609772265 0.8727427721 -0.15398077667 -0.47390407324 0.79128968716 -0.15398077667 -0.47390407324 0.70871031284 -0.14978057146 -0.4609772265 0.6272572279 -0.14149476588 -0.43547609448 0.54915231466 -0.12934933603 -0.39809632301 0.47652593255 -0.11367559433 -0.34985750914 0.41135922074 -2.9823163188e-17 -0.16234973073 1.2229086161 -4.3715059388e-17 -0.23797369003 1.1897368431 -5.6414525104e-17 -0.30710634589 1.1445702314 -6.7575143714e-17 -0.36786195636 1.0886408091 -7.6892492899e-17 -0.41858324409 1.0234740973 -8.4112416453e-17 -0.45788666606 0.95084768534 -8.9037972598e-17 -0.48470014334 0.8727427721 -9.1534800733e-17 -0.49829223752 0.79128968716 -9.1534800733e-17 -0.49829223752 0.70871031284 -8.9037972598e-17 -0.48470014334 0.6272572279 -8.4112416453e-17 -0.45788666606 0.54915231466 -7.6892492899e-17 -0.41858324409 0.47652593255 -6.7575143714e-17 -0.36786195636 0.41135922074 0.050168827176 -0.15440377593 1.2229086161 0.073537915945 -0.2263264358 1.1897368431 0.0949010849 -0.29207551479 1.1445702314 0.11367559433 -0.34985750914 1.0886408091 0.12934933603 -0.39809632301 1.0234740973 0.14149476588 -0.43547609448 0.95084768534 0.14978057146 -0.4609772265 0.8727427721 0.15398077667 -0.47390407324 0.79128968716 0.15398077667 -0.47390407324 0.70871031284 0.14978057146 -0.4609772265 0.6272572279 0.14149476588 -0.43547609448 0.54915231466 0.12934933603 -0.39809632301 0.47652593255 0.11367559433 -0.34985750914 0.41135922074 0.095426782966 -0.13134369254 1.2229086161 0.13987742364 -0.19252476096 1.1897368431 0.1805125922 -0.24845425785 1.1445702314 0.21622383595 -0.29760658741 1.0886408091 0.24603705108 -0.33864095807 1.0234740973 0.26913902164 -0.37043809891 0.95084768534 0.2848995924 -0.39213064313 0.8727427721 0.29288882017 -0.40312689543 0.79128968716 0.29288882017 -0.40312689543 0.70871031284 0.2848995924 -0.39213064313 0.6272572279 0.26913902164 -0.37043809891 0.54915231466 0.24603705108 -0.33864095807 0.47652593255 0.21622383595 -0.29760658741 0.41135922074 0.13134369254 -0.095426782966 1.2229086161 0.19252476096 -0.13987742364 1.1897368431 0.24845425785 -0.1805125922 1.1445702314 0.29760658741 -0.21622383595 1.0886408091 0.33864095807 -0.24603705108 1.0234740973 0.37043809891 -0.26913902164 0.95084768534 0.39213064313 -0.2848995924 0.8727427721 0.40312689543 -0.29288882017 0.79128968716 0.40312689543 -0.29288882017 0.70871031284 0.39213064313 -0.2848995924 0.6272572279 0.37043809891 -0.26913902164 0.54915231466 0.33864095807 -0.24603705108 0.47652593255 0.29760658741 -0.21622383595 0.41135922074 0.15440377593 -0.050168827176 1.2229086161 0.2263264358 -0.073537915945 1.1897368431 0.29207551479 -0.0949010849 1.1445702314 0.34985750914 -0.11367559433 1.0886408091 0.39809632301 -0.12934933603 1.0234740973 0.43547609448 -0.14149476588 0.95084768534 0.4609772265 -0.14978057146 0.8727427721 0.47390407324 -0.15398077667 0.79128968716 0.47390407324 -0.15398077667 0.70871031284 0.4609772265 -0.14978057146 0.6272572279 0.43547609448 -0.14149476588 0.54915231466 0.39809632301 -0.12934933603 0.47652593255 0.34985750914 -0.11367559433 0.41135922074 POLYGONS 1601 4960 OFFSETS vtktypeint64 0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267 270 273 276 279 282 285 288 291 294 297 300 303 306 309 312 315 318 321 324 327 330 333 336 339 342 345 348 351 354 357 360 363 366 369 372 375 378 381 384 387 390 393 396 399 402 405 408 411 414 417 420 423 426 429 432 435 438 441 444 447 450 453 456 459 462 465 468 471 474 477 480 483 486 489 492 495 498 501 504 507 510 513 516 519 522 525 528 531 534 537 540 543 546 549 552 555 558 561 564 567 570 573 576 579 582 585 588 591 594 597 600 603 606 609 612 615 618 621 624 627 630 633 636 639 642 645 648 651 654 657 660 663 666 669 672 675 678 681 684 687 690 693 696 699 702 705 708 711 714 717 720 723 726 729 732 735 738 741 744 747 750 753 756 759 762 765 768 771 774 777 780 783 786 789 792 795 798 801 804 807 810 813 816 819 822 825 828 831 834 837 840 843 846 849 852 855 858 861 864 867 870 873 876 879 882 885 888 891 894 897 900 903 906 909 912 915 918 921 924 927 930 933 936 939 942 945 948 951 954 957 960 963 966 969 972 975 978 981 984 987 990 993 996 999 1002 1005 1008 1011 1014 1017 1020 1023 1026 1029 1032 1035 1038 1041 1044 1047 1050 1053 1056 1059 1062 1065 1068 1071 1074 1077 1080 1084 1088 1092 1096 1100 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148 1152 1156 1160 1164 1168 1172 1176 1180 1184 1188 1192 1196 1200 1204 1208 1212 1216 1220 1224 1228 1232 1236 1240 1243 1246 1249 1252 1255 1258 1261 1264 1267 1270 1273 1276 1279 1282 1285 1288 1291 1294 1297 1300 1303 1306 1309 1312 1315 1318 1321 1324 1327 1330 1333 1336 1339 1342 1345 1348 1351 1354 1357 1360 1363 1366 1369 1372 1375 1378 1381 1384 1387 1390 1393 1396 1399 1402 1405 1408 1411 1414 1417 1420 1423 1426 1429 1432 1435 1438 1441 1444 1447 1450 1453 1456 1459 1462 1465 1468 1471 1474 1477 1480 1483 1486 1489 1492 1495 1498 1501 1504 1507 1510 1513 1516 1519 1522 1525 1528 1531 1534 1537 1540 1543 1546 1549 1552 1555 1558 1561 1564 1567 1570 1573 1576 1579 1582 1585 1588 1591 1594 1597 1600 1603 1606 1609 1612 1615 1618 1621 1624 1627 1630 1633 1636 1639 1642 1645 1648 1651 1654 1657 1660 1663 1666 1669 1672 1675 1678 1681 1684 1687 1690 1693 1696 1699 1702 1705 1708 1711 1714 1717 1720 1723 1726 1729 1732 1735 1738 1741 1744 1747 1750 1753 1756 1759 1762 1765 1768 1771 1774 1777 1780 1783 1786 1789 1792 1795 1798 1801 1804 1807 1810 1813 1816 1819 1822 1825 1828 1831 1834 1837 1840 1843 1846 1849 1852 1855 1858 1861 1864 1867 1870 1873 1876 1879 1882 1885 1888 1891 1894 1897 1900 1903 1906 1909 1912 1915 1918 1921 1924 1927 1930 1933 1936 1939 1942 1945 1948 1951 1954 1957 1960 1963 1966 1969 1972 1975 1978 1981 1984 1987 1990 1993 1996 1999 2002 2005 2008 2011 2014 2017 2020 2023 2026 2029 2032 2035 2038 2041 2044 2047 2050 2053 2056 2059 2062 2065 2068 2071 2074 2077 2080 2083 2086 2089 2092 2095 2098 2101 2104 2107 2110 2113 2116 2119 2122 2125 2128 2131 2134 2137 2140 2143 2146 2149 2152 2155 2158 2161 2164 2167 2170 2173 2176 2179 2182 2185 2188 2191 2194 2197 2200 2203 2206 2209 2212 2215 2218 2221 2224 2227 2230 2233 2236 2239 2242 2245 2248 2251 2254 2257 2260 2263 2266 2269 2272 2275 2278 2281 2284 2287 2290 2293 2296 2299 2302 2305 2308 2311 2314 2317 2320 2323 2326 2329 2332 2335 2338 2341 2344 2347 2350 2353 2356 2359 2362 2365 2368 2371 2374 2377 2380 2383 2386 2389 2392 2395 2398 2401 2404 2407 2410 2413 2416 2419 2422 2425 2428 2431 2434 2437 2440 2443 2446 2449 2452 2455 2458 2461 2464 2467 2470 2473 2476 2479 2482 2485 2488 2491 2494 2497 2500 2503 2506 2509 2512 2515 2518 2521 2524 2527 2530 2533 2536 2539 2542 2545 2548 2551 2554 2557 2560 2563 2566 2569 2572 2575 2578 2581 2584 2587 2590 2593 2596 2599 2602 2605 2608 2611 2614 2617 2620 2623 2626 2629 2632 2635 2638 2641 2644 2647 2650 2653 2656 2659 2662 2665 2668 2671 2674 2677 2680 2683 2686 2689 2692 2695 2698 2701 2704 2707 2710 2713 2716 2719 2722 2725 2728 2731 2734 2737 2740 2743 2746 2749 2752 2755 2758 2761 2764 2767 2770 2773 2776 2779 2782 2785 2788 2791 2794 2797 2800 2803 2806 2809 2812 2815 2818 2821 2824 2827 2830 2833 2836 2839 2842 2845 2848 2851 2854 2857 2860 2864 2868 2872 2876 2880 2884 2888 2892 2896 2900 2904 2908 2912 2916 2920 2924 2928 2932 2936 2940 2944 2948 2952 2956 2960 2964 2968 2972 2976 2980 2984 2988 2992 2996 3000 3004 3008 3012 3016 3020 3024 3028 3032 3036 3040 3044 3048 3052 3056 3060 3064 3068 3072 3076 3080 3084 3088 3092 3096 3100 3104 3108 3112 3116 3120 3124 3128 3132 3136 3140 3144 3148 3152 3156 3160 3164 3168 3172 3176 3180 3183 3186 3189 3192 3195 3198 3201 3204 3207 3210 3213 3216 3219 3222 3225 3228 3231 3234 3237 3240 3243 3246 3249 3252 3255 3258 3261 3264 3267 3270 3273 3276 3279 3282 3285 3288 3291 3294 3297 3300 3303 3306 3309 3312 3315 3318 3321 3324 3327 3330 3333 3336 3339 3342 3345 3348 3351 3354 3357 3360 3363 3366 3369 3372 3375 3378 3381 3384 3387 3390 3393 3396 3399 3402 3405 3408 3411 3414 3417 3420 3423 3426 3429 3432 3435 3438 3441 3444 3447 3450 3453 3456 3459 3462 3465 3468 3471 3474 3477 3480 3483 3486 3489 3492 3495 3498 3501 3504 3507 3510 3513 3516 3519 3522 3525 3528 3531 3534 3537 3540 3543 3546 3549 3552 3555 3558 3561 3564 3567 3570 3573 3576 3579 3582 3585 3588 3591 3594 3597 3600 3603 3606 3609 3612 3615 3618 3621 3624 3627 3630 3633 3636 3639 3642 3645 3648 3651 3654 3657 3660 3663 3666 3669 3672 3675 3678 3681 3684 3687 3690 3693 3696 3699 3702 3705 3708 3711 3714 3717 3720 3723 3726 3729 3732 3735 3738 3741 3744 3747 3750 3753 3756 3759 3762 3765 3768 3771 3774 3777 3780 3783 3786 3789 3792 3795 3798 3801 3804 3807 3810 3813 3816 3819 3822 3825 3828 3831 3834 3837 3840 3843 3846 3849 3852 3855 3858 3861 3864 3867 3870 3873 3876 3879 3882 3885 3888 3891 3894 3897 3900 3903 3906 3909 3912 3915 3918 3921 3924 3927 3930 3933 3936 3939 3942 3945 3948 3951 3954 3957 3960 3963 3966 3969 3972 3975 3978 3981 3984 3987 3990 3993 3996 3999 4002 4005 4008 4011 4014 4017 4020 4023 4026 4029 4032 4035 4038 4041 4044 4047 4050 4053 4056 4059 4062 4065 4068 4071 4074 4077 4080 4083 4086 4089 4092 4095 4098 4101 4104 4107 4110 4113 4116 4119 4122 4125 4128 4131 4134 4137 4140 4143 4146 4149 4152 4155 4158 4161 4164 4167 4170 4173 4176 4179 4182 4185 4188 4191 4194 4197 4200 4203 4206 4209 4212 4215 4218 4221 4224 4227 4230 4233 4236 4239 4242 4245 4248 4251 4254 4257 4260 4263 4266 4269 4272 4275 4278 4281 4284 4287 4290 4293 4296 4299 4302 4305 4308 4311 4314 4317 4320 4323 4326 4329 4332 4335 4338 4341 4344 4347 4350 4353 4356 4359 4362 4365 4368 4371 4374 4377 4380 4383 4386 4389 4392 4395 4398 4401 4404 4407 4410 4413 4416 4419 4422 4425 4428 4431 4434 4437 4440 4443 4446 4449 4452 4455 4458 4461 4464 4467 4470 4473 4476 4479 4482 4485 4488 4491 4494 4497 4500 4503 4506 4509 4512 4515 4518 4521 4524 4527 4530 4533 4536 4539 4542 4545 4548 4551 4554 4557 4560 4563 4566 4569 4572 4575 4578 4581 4584 4587 4590 4593 4596 4599 4602 4605 4608 4611 4614 4617 4620 4623 4626 4629 4632 4635 4638 4641 4644 4647 4650 4653 4656 4659 4662 4665 4668 4671 4674 4677 4680 4683 4686 4689 4692 4695 4698 4701 4704 4707 4710 4713 4716 4719 4722 4725 4728 4731 4734 4737 4740 4743 4746 4749 4752 4755 4758 4761 4764 4767 4770 4773 4776 4779 4782 4785 4788 4791 4794 4797 4800 4804 4808 4812 4816 4820 4824 4828 4832 4836 4840 4844 4848 4852 4856 4860 4864 4868 4872 4876 4880 4884 4888 4892 4896 4900 4904 4908 4912 4916 4920 4924 4928 4932 4936 4940 4944 4948 4952 4956 4960 CONNECTIVITY vtktypeint64 0 1 2 0 2 3 1 4 5 1 5 2 4 6 7 4 7 5 6 8 9 6 9 7 8 10 11 8 11 9 10 12 13 10 13 11 12 14 15 12 15 13 14 16 17 14 17 15 16 18 19 16 19 17 3 2 20 3 20 21 2 5 22 2 22 20 5 7 23 5 23 22 7 9 24 7 24 23 9 11 25 9 25 24 11 13 26 11 26 25 13 15 27 13 27 26 15 17 28 15 28 27 17 19 29 17 29 28 21 20 30 21 30 31 20 22 32 20 32 30 22 23 33 22 33 32 23 24 34 23 34 33 24 25 35 24 35 34 25 26 36 25 36 35 26 27 37 26 37 36 27 28 38 27 38 37 28 29 39 28 39 38 31 30 40 31 40 41 30 32 42 30 42 40 32 33 43 32 43 42 33 34 44 33 44 43 34 35 45 34 45 44 35 36 46 35 46 45 36 37 47 36 47 46 37 38 48 37 48 47 38 39 49 38 49 48 41 40 50 41 50 51 40 42 52 40 52 50 42 43 53 42 53 52 43 44 54 43 54 53 44 45 55 44 55 54 45 46 56 45 56 55 46 47 57 46 57 56 47 48 58 47 58 57 48 49 59 48 59 58 51 50 60 51 60 61 50 52 62 50 62 60 52 53 63 52 63 62 53 54 64 53 64 63 54 55 65 54 65 64 55 56 66 55 66 65 56 57 67 56 67 66 57 58 68 57 68 67 58 59 69 58 69 68 61 60 70 61 70 71 60 62 72 60 72 70 62 63 73 62 73 72 63 64 74 63 74 73 64 65 75 64 75 74 65 66 76 65 76 75 66 67 77 66 77 76 67 68 78 67 78 77 68 69 79 68 79 78 71 70 80 71 80 81 70 72 82 70 82 80 72 73 83 72 83 82 73 74 84 73 84 83 74 75 85 74 85 84 75 76 86 75 86 85 76 77 87 76 87 86 77 78 88 77 88 87 78 79 89 78 89 88 81 80 90 81 90 91 80 82 92 80 92 90 82 83 93 82 93 92 83 84 94 83 94 93 84 85 95 84 95 94 85 86 96 85 96 95 86 87 97 86 97 96 87 88 98 87 98 97 88 89 99 88 99 98 91 90 100 91 100 101 90 92 102 90 102 100 92 93 103 92 103 102 93 94 104 93 104 103 94 95 105 94 105 104 95 96 106 95 106 105 96 97 107 96 107 106 97 98 108 97 108 107 98 99 109 98 109 108 101 100 110 101 110 111 100 102 112 100 112 110 102 103 113 102 113 112 103 104 114 103 114 113 104 105 115 104 115 114 105 106 116 105 116 115 106 107 117 106 117 116 107 108 118 107 118 117 108 109 119 108 119 118 111 110 120 111 120 121 110 112 122 110 122 120 112 113 123 112 123 122 113 114 124 113 124 123 114 115 125 114 125 124 115 116 126 115 126 125 116 117 127 116 127 126 117 118 128 117 128 127 118 119 129 118 129 128 121 120 130 121 130 131 120 122 132 120 132 130 122 123 133 122 133 132 123 124 134 123 134 133 124 125 135 124 135 134 125 126 136 125 136 135 126 127 137 126 137 136 127 128 138 127 138 137 128 129 139 128 139 138 131 130 140 131 140 141 130 132 142 130 142 140 132 133 143 132 143 142 133 134 144 133 144 143 134 135 145 134 145 144 135 136 146 135 146 145 136 137 147 136 147 146 137 138 148 137 148 147 138 139 149 138 149 148 141 140 150 141 150 151 140 142 152 140 152 150 142 143 153 142 153 152 143 144 154 143 154 153 144 145 155 144 155 154 145 146 156 145 156 155 146 147 157 146 157 156 147 148 158 147 158 157 148 149 159 148 159 158 151 150 160 151 160 161 150 152 162 150 162 160 152 153 163 152 163 162 153 154 164 153 164 163 154 155 165 154 165 164 155 156 166 155 166 165 156 157 167 156 167 166 157 158 168 157 168 167 158 159 169 158 169 168 161 160 170 161 170 171 160 162 172 160 172 170 162 163 173 162 173 172 163 164 174 163 174 173 164 165 175 164 175 174 165 166 176 165 176 175 166 167 177 166 177 176 167 168 178 167 178 177 168 169 179 168 179 178 171 170 180 171 180 181 170 172 182 170 182 180 172 173 183 172 183 182 173 174 184 173 184 183 174 175 185 174 185 184 175 176 186 175 186 185 176 177 187 176 187 186 177 178 188 177 188 187 178 179 189 178 189 188 181 180 190 181 190 191 180 182 192 180 192 190 182 183 193 182 193 192 183 184 194 183 194 193 184 185 195 184 195 194 185 186 196 185 196 195 186 187 197 186 197 196 187 188 198 187 198 197 188 189 199 188 199 198 191 190 1 191 1 0 190 192 4 190 4 1 192 193 6 192 6 4 193 194 8 193 8 6 194 195 10 194 10 8 195 196 12 195 12 10 196 197 14 196 14 12 197 198 16 197 16 14 198 199 18 198 18 16 18 200 201 202 18 202 203 19 19 203 204 205 19 205 206 29 29 206 207 208 29 208 209 39 39 209 210 211 39 211 212 49 49 212 213 214 49 214 215 59 59 215 216 217 59 217 218 69 69 218 219 220 69 220 221 79 79 221 222 223 79 223 224 89 89 224 225 226 89 226 227 99 99 227 228 229 99 229 230 109 109 230 231 232 109 232 233 119 119 233 234 235 119 235 236 129 129 236 237 238 129 238 239 139 139 239 240 241 139 241 242 149 149 242 243 244 149 244 245 159 159 245 246 247 159 247 248 169 169 248 249 250 169 250 251 179 179 251 252 253 179 253 254 189 189 254 255 256 189 256 257 199 199 257 258 259 199 259 200 18 260 261 262 262 261 263 263 261 264 264 261 265 265 261 266 266 261 267 267 261 268 268 261 269 269 261 270 270 261 271 271 261 272 272 261 273 273 261 274 274 261 275 275 261 276 276 261 277 277 261 278 278 261 279 279 261 280 280 261 260 281 282 283 281 283 284 282 285 286 282 286 283 285 287 288 285 288 286 287 289 290 287 290 288 289 291 292 289 292 290 291 293 294 291 294 292 293 295 296 293 296 294 295 297 298 295 298 296 297 299 300 297 300 298 299 301 302 299 302 300 301 303 304 301 304 302 303 305 306 303 306 304 305 260 262 305 262 306 284 283 307 284 307 308 283 286 309 283 309 307 286 288 310 286 310 309 288 290 311 288 311 310 290 292 312 290 312 311 292 294 313 292 313 312 294 296 314 294 314 313 296 298 315 296 315 314 298 300 316 298 316 315 300 302 317 300 317 316 302 304 318 302 318 317 304 306 319 304 319 318 306 262 263 306 263 319 308 307 320 308 320 321 307 309 322 307 322 320 309 310 323 309 323 322 310 311 324 310 324 323 311 312 325 311 325 324 312 313 326 312 326 325 313 314 327 313 327 326 314 315 328 314 328 327 315 316 329 315 329 328 316 317 330 316 330 329 317 318 331 317 331 330 318 319 332 318 332 331 319 263 264 319 264 332 321 320 333 321 333 334 320 322 335 320 335 333 322 323 336 322 336 335 323 324 337 323 337 336 324 325 338 324 338 337 325 326 339 325 339 338 326 327 340 326 340 339 327 328 341 327 341 340 328 329 342 328 342 341 329 330 343 329 343 342 330 331 344 330 344 343 331 332 345 331 345 344 332 264 265 332 265 345 334 333 346 334 346 347 333 335 348 333 348 346 335 336 349 335 349 348 336 337 350 336 350 349 337 338 351 337 351 350 338 339 352 338 352 351 339 340 353 339 353 352 340 341 354 340 354 353 341 342 355 341 355 354 342 343 356 342 356 355 343 344 357 343 357 356 344 345 358 344 358 357 345 265 266 345 266 358 347 346 359 347 359 360 346 348 361 346 361 359 348 349 362 348 362 361 349 350 363 349 363 362 350 351 364 350 364 363 351 352 365 351 365 364 352 353 366 352 366 365 353 354 367 353 367 366 354 355 368 354 368 367 355 356 369 355 369 368 356 357 370 356 370 369 357 358 371 357 371 370 358 266 267 358 267 371 360 359 372 360 372 373 359 361 374 359 374 372 361 362 375 361 375 374 362 363 376 362 376 375 363 364 377 363 377 376 364 365 378 364 378 377 365 366 379 365 379 378 366 367 380 366 380 379 367 368 381 367 381 380 368 369 382 368 382 381 369 370 383 369 383 382 370 371 384 370 384 383 371 267 268 371 268 384 373 372 385 373 385 386 372 374 387 372 387 385 374 375 388 374 388 387 375 376 389 375 389 388 376 377 390 376 390 389 377 378 391 377 391 390 378 379 392 378 392 391 379 380 393 379 393 392 380 381 394 380 394 393 381 382 395 381 395 394 382 383 396 382 396 395 383 384 397 383 397 396 384 268 269 384 269 397 386 385 398 386 398 399 385 387 400 385 400 398 387 388 401 387 401 400 388 389 402 388 402 401 389 390 403 389 403 402 390 391 404 390 404 403 391 392 405 391 405 404 392 393 406 392 406 405 393 394 407 393 407 406 394 395 408 394 408 407 395 396 409 395 409 408 396 397 410 396 410 409 397 269 270 397 270 410 399 398 411 399 411 412 398 400 413 398 413 411 400 401 414 400 414 413 401 402 415 401 415 414 402 403 416 402 416 415 403 404 417 403 417 416 404 405 418 404 418 417 405 406 419 405 419 418 406 407 420 406 420 419 407 408 421 407 421 420 408 409 422 408 422 421 409 410 423 409 423 422 410 270 271 410 271 423 412 411 424 412 424 425 411 413 426 411 426 424 413 414 427 413 427 426 414 415 428 414 428 427 415 416 429 415 429 428 416 417 430 416 430 429 417 418 431 417 431 430 418 419 432 418 432 431 419 420 433 419 433 432 420 421 434 420 434 433 421 422 435 421 435 434 422 423 436 422 436 435 423 271 272 423 272 436 425 424 437 425 437 438 424 426 439 424 439 437 426 427 440 426 440 439 427 428 441 427 441 440 428 429 442 428 442 441 429 430 443 429 443 442 430 431 444 430 444 443 431 432 445 431 445 444 432 433 446 432 446 445 433 434 447 433 447 446 434 435 448 434 448 447 435 436 449 435 449 448 436 272 273 436 273 449 438 437 450 438 450 451 437 439 452 437 452 450 439 440 453 439 453 452 440 441 454 440 454 453 441 442 455 441 455 454 442 443 456 442 456 455 443 444 457 443 457 456 444 445 458 444 458 457 445 446 459 445 459 458 446 447 460 446 460 459 447 448 461 447 461 460 448 449 462 448 462 461 449 273 274 449 274 462 451 450 463 451 463 464 450 452 465 450 465 463 452 453 466 452 466 465 453 454 467 453 467 466 454 455 468 454 468 467 455 456 469 455 469 468 456 457 470 456 470 469 457 458 471 457 471 470 458 459 472 458 472 471 459 460 473 459 473 472 460 461 474 460 474 473 461 462 475 461 475 474 462 274 275 462 275 475 464 463 476 464 476 477 463 465 478 463 478 476 465 466 479 465 479 478 466 467 480 466 480 479 467 468 481 467 481 480 468 469 482 468 482 481 469 470 483 469 483 482 470 471 484 470 484 483 471 472 485 471 485 484 472 473 486 472 486 485 473 474 487 473 487 486 474 475 488 474 488 487 475 275 276 475 276 488 477 476 489 477 489 490 476 478 491 476 491 489 478 479 492 478 492 491 479 480 493 479 493 492 480 481 494 480 494 493 481 482 495 481 495 494 482 483 496 482 496 495 483 484 497 483 497 496 484 485 498 484 498 497 485 486 499 485 499 498 486 487 500 486 500 499 487 488 501 487 501 500 488 276 277 488 277 501 490 489 502 490 502 503 489 491 504 489 504 502 491 492 505 491 505 504 492 493 506 492 506 505 493 494 507 493 507 506 494 495 508 494 508 507 495 496 509 495 509 508 496 497 510 496 510 509 497 498 511 497 511 510 498 499 512 498 512 511 499 500 513 499 513 512 500 501 514 500 514 513 501 277 278 501 278 514 503 502 515 503 515 516 502 504 517 502 517 515 504 505 518 504 518 517 505 506 519 505 519 518 506 507 520 506 520 519 507 508 521 507 521 520 508 509 522 508 522 521 509 510 523 509 523 522 510 511 524 510 524 523 511 512 525 511 525 524 512 513 526 512 526 525 513 514 527 513 527 526 514 278 279 514 279 527 516 515 528 516 528 529 515 517 530 515 530 528 517 518 531 517 531 530 518 519 532 518 532 531 519 520 533 519 533 532 520 521 534 520 534 533 521 522 535 521 535 534 522 523 536 522 536 535 523 524 537 523 537 536 524 525 538 524 538 537 525 526 539 525 539 538 526 527 540 526 540 539 527 279 280 527 280 540 529 528 282 529 282 281 528 530 285 528 285 282 530 531 287 530 287 285 531 532 289 531 289 287 532 533 291 532 291 289 533 534 293 533 293 291 534 535 295 534 295 293 535 536 297 535 297 295 536 537 299 536 299 297 537 538 301 537 301 299 538 539 303 538 303 301 539 540 305 539 305 303 540 280 260 540 260 305 281 284 201 200 284 203 202 201 284 308 204 203 308 206 205 204 308 321 207 206 321 209 208 207 321 334 210 209 334 212 211 210 334 347 213 212 347 215 214 213 347 360 216 215 360 218 217 216 360 373 219 218 373 221 220 219 373 386 222 221 386 224 223 222 386 399 225 224 399 227 226 225 399 412 228 227 412 230 229 228 412 425 231 230 425 233 232 231 425 438 234 233 438 236 235 234 438 451 237 236 451 239 238 237 451 464 240 239 464 242 241 240 464 477 243 242 477 245 244 243 477 490 246 245 490 248 247 246 490 503 249 248 503 251 250 249 503 516 252 251 516 254 253 252 516 529 255 254 529 257 256 255 529 281 258 257 281 200 259 258 0 3 541 542 3 543 544 541 3 21 545 543 21 546 547 545 21 31 548 546 31 549 550 548 31 41 551 549 41 552 553 551 41 51 554 552 51 555 556 554 51 61 557 555 61 558 559 557 61 71 560 558 71 561 562 560 71 81 563 561 81 564 565 563 81 91 566 564 91 567 568 566 91 101 569 567 101 570 571 569 101 111 572 570 111 573 574 572 111 121 575 573 121 576 577 575 121 131 578 576 131 579 580 578 131 141 581 579 141 582 583 581 141 151 584 582 151 585 586 584 151 161 587 585 161 588 589 587 161 171 590 588 171 591 592 590 171 181 593 591 181 594 595 593 181 191 596 594 191 597 598 596 191 0 599 597 0 542 600 599 601 602 603 602 604 603 604 605 603 605 606 603 606 607 603 607 608 603 608 609 603 609 610 603 610 611 603 611 612 603 612 613 603 613 614 603 614 615 603 615 616 603 616 617 603 617 618 603 618 619 603 619 620 603 620 621 603 621 601 603 601 622 623 601 623 602 622 624 625 622 625 623 624 626 627 624 627 625 626 628 629 626 629 627 628 630 631 628 631 629 630 632 633 630 633 631 632 634 635 632 635 633 634 636 637 634 637 635 636 638 639 636 639 637 638 640 641 638 641 639 640 642 643 640 643 641 642 644 645 642 645 643 644 646 647 644 647 645 602 623 648 602 648 604 623 625 649 623 649 648 625 627 650 625 650 649 627 629 651 627 651 650 629 631 652 629 652 651 631 633 653 631 653 652 633 635 654 633 654 653 635 637 655 635 655 654 637 639 656 637 656 655 639 641 657 639 657 656 641 643 658 641 658 657 643 645 659 643 659 658 645 647 660 645 660 659 604 648 661 604 661 605 648 649 662 648 662 661 649 650 663 649 663 662 650 651 664 650 664 663 651 652 665 651 665 664 652 653 666 652 666 665 653 654 667 653 667 666 654 655 668 654 668 667 655 656 669 655 669 668 656 657 670 656 670 669 657 658 671 657 671 670 658 659 672 658 672 671 659 660 673 659 673 672 605 661 674 605 674 606 661 662 675 661 675 674 662 663 676 662 676 675 663 664 677 663 677 676 664 665 678 664 678 677 665 666 679 665 679 678 666 667 680 666 680 679 667 668 681 667 681 680 668 669 682 668 682 681 669 670 683 669 683 682 670 671 684 670 684 683 671 672 685 671 685 684 672 673 686 672 686 685 606 674 687 606 687 607 674 675 688 674 688 687 675 676 689 675 689 688 676 677 690 676 690 689 677 678 691 677 691 690 678 679 692 678 692 691 679 680 693 679 693 692 680 681 694 680 694 693 681 682 695 681 695 694 682 683 696 682 696 695 683 684 697 683 697 696 684 685 698 684 698 697 685 686 699 685 699 698 607 687 700 607 700 608 687 688 701 687 701 700 688 689 702 688 702 701 689 690 703 689 703 702 690 691 704 690 704 703 691 692 705 691 705 704 692 693 706 692 706 705 693 694 707 693 707 706 694 695 708 694 708 707 695 696 709 695 709 708 696 697 710 696 710 709 697 698 711 697 711 710 698 699 712 698 712 711 608 700 713 608 713 609 700 701 714 700 714 713 701 702 715 701 715 714 702 703 716 702 716 715 703 704 717 703 717 716 704 705 718 704 718 717 705 706 719 705 719 718 706 707 720 706 720 719 707 708 721 707 721 720 708 709 722 708 722 721 709 710 723 709 723 722 710 711 724 710 724 723 711 712 725 711 725 724 609 713 726 609 726 610 713 714 727 713 727 726 714 715 728 714 728 727 715 716 729 715 729 728 716 717 730 716 730 729 717 718 731 717 731 730 718 719 732 718 732 731 719 720 733 719 733 732 720 721 734 720 734 733 721 722 735 721 735 734 722 723 736 722 736 735 723 724 737 723 737 736 724 725 738 724 738 737 610 726 739 610 739 611 726 727 740 726 740 739 727 728 741 727 741 740 728 729 742 728 742 741 729 730 743 729 743 742 730 731 744 730 744 743 731 732 745 731 745 744 732 733 746 732 746 745 733 734 747 733 747 746 734 735 748 734 748 747 735 736 749 735 749 748 736 737 750 736 750 749 737 738 751 737 751 750 611 739 752 611 752 612 739 740 753 739 753 752 740 741 754 740 754 753 741 742 755 741 755 754 742 743 756 742 756 755 743 744 757 743 757 756 744 745 758 744 758 757 745 746 759 745 759 758 746 747 760 746 760 759 747 748 761 747 761 760 748 749 762 748 762 761 749 750 763 749 763 762 750 751 764 750 764 763 612 752 765 612 765 613 752 753 766 752 766 765 753 754 767 753 767 766 754 755 768 754 768 767 755 756 769 755 769 768 756 757 770 756 770 769 757 758 771 757 771 770 758 759 772 758 772 771 759 760 773 759 773 772 760 761 774 760 774 773 761 762 775 761 775 774 762 763 776 762 776 775 763 764 777 763 777 776 613 765 778 613 778 614 765 766 779 765 779 778 766 767 780 766 780 779 767 768 781 767 781 780 768 769 782 768 782 781 769 770 783 769 783 782 770 771 784 770 784 783 771 772 785 771 785 784 772 773 786 772 786 785 773 774 787 773 787 786 774 775 788 774 788 787 775 776 789 775 789 788 776 777 790 776 790 789 614 778 791 614 791 615 778 779 792 778 792 791 779 780 793 779 793 792 780 781 794 780 794 793 781 782 795 781 795 794 782 783 796 782 796 795 783 784 797 783 797 796 784 785 798 784 798 797 785 786 799 785 799 798 786 787 800 786 800 799 787 788 801 787 801 800 788 789 802 788 802 801 789 790 803 789 803 802 615 791 804 615 804 616 791 792 805 791 805 804 792 793 806 792 806 805 793 794 807 793 807 806 794 795 808 794 808 807 795 796 809 795 809 808 796 797 810 796 810 809 797 798 811 797 811 810 798 799 812 798 812 811 799 800 813 799 813 812 800 801 814 800 814 813 801 802 815 801 815 814 802 803 816 802 816 815 616 804 817 616 817 617 804 805 818 804 818 817 805 806 819 805 819 818 806 807 820 806 820 819 807 808 821 807 821 820 808 809 822 808 822 821 809 810 823 809 823 822 810 811 824 810 824 823 811 812 825 811 825 824 812 813 826 812 826 825 813 814 827 813 827 826 814 815 828 814 828 827 815 816 829 815 829 828 617 817 830 617 830 618 817 818 831 817 831 830 818 819 832 818 832 831 819 820 833 819 833 832 820 821 834 820 834 833 821 822 835 821 835 834 822 823 836 822 836 835 823 824 837 823 837 836 824 825 838 824 838 837 825 826 839 825 839 838 826 827 840 826 840 839 827 828 841 827 841 840 828 829 842 828 842 841 618 830 843 618 843 619 830 831 844 830 844 843 831 832 845 831 845 844 832 833 846 832 846 845 833 834 847 833 847 846 834 835 848 834 848 847 835 836 849 835 849 848 836 837 850 836 850 849 837 838 851 837 851 850 838 839 852 838 852 851 839 840 853 839 853 852 840 841 854 840 854 853 841 842 855 841 855 854 619 843 856 619 856 620 843 844 857 843 857 856 844 845 858 844 858 857 845 846 859 845 859 858 846 847 860 846 860 859 847 848 861 847 861 860 848 849 862 848 862 861 849 850 863 849 863 862 850 851 864 850 864 863 851 852 865 851 865 864 852 853 866 852 866 865 853 854 867 853 867 866 854 855 868 854 868 867 620 856 869 620 869 621 856 857 870 856 870 869 857 858 871 857 871 870 858 859 872 858 872 871 859 860 873 859 873 872 860 861 874 860 874 873 861 862 875 861 875 874 862 863 876 862 876 875 863 864 877 863 877 876 864 865 878 864 878 877 865 866 879 865 879 878 866 867 880 866 880 879 867 868 881 867 881 880 621 869 622 621 622 601 869 870 624 869 624 622 870 871 626 870 626 624 871 872 628 871 628 626 872 873 630 872 630 628 873 874 632 873 632 630 874 875 634 874 634 632 875 876 636 875 636 634 876 877 638 876 638 636 877 878 640 877 640 638 878 879 642 878 642 640 879 880 644 879 644 642 880 881 646 880 646 644 646 542 541 544 646 544 543 647 647 543 545 547 647 547 546 660 660 546 548 550 660 550 549 673 673 549 551 553 673 553 552 686 686 552 554 556 686 556 555 699 699 555 557 559 699 559 558 712 712 558 560 562 712 562 561 725 725 561 563 565 725 565 564 738 738 564 566 568 738 568 567 751 751 567 569 571 751 571 570 764 764 570 572 574 764 574 573 777 777 573 575 577 777 577 576 790 790 576 578 580 790 580 579 803 803 579 581 583 803 583 582 816 816 582 584 586 816 586 585 829 829 585 587 589 829 589 588 842 842 588 590 592 842 592 591 855 855 591 593 595 855 595 594 868 868 594 596 598 868 598 597 881 881 597 599 600 881 600 542 646 ================================================ FILE: testing/data/branched4.vtk ================================================ # vtk DataFile Version 5.1 vtk output ASCII DATASET POLYDATA POINTS 1346 double 0.082297295332 0 -0.86818063259 0 0 -0.875 0.078269377351 0.025431262329 -0.86818063259 0.066579908133 0.048373136669 -0.86818063259 0.048373136669 0.066579908133 -0.86818063259 0.025431262329 0.078269377351 -0.86818063259 5.0392558428e-18 0.082297295332 -0.86818063259 -0.025431262329 0.078269377351 -0.86818063259 -0.048373136669 0.066579908133 -0.86818063259 -0.066579908133 0.048373136669 -0.86818063259 -0.078269377351 0.025431262329 -0.86818063259 -0.082297295332 1.0078511686e-17 -0.86818063259 -0.078269377351 -0.025431262329 -0.86818063259 -0.066579908133 -0.048373136669 -0.86818063259 -0.048373136669 -0.066579908133 -0.86818063259 -0.025431262329 -0.078269377351 -0.86818063259 -1.5117767942e-17 -0.082297295332 -0.86818063259 0.025431262329 -0.078269377351 -0.86818063259 0.048373136669 -0.066579908133 -0.86818063259 0.066579908133 -0.048373136669 -0.86818063259 0.078269377351 -0.025431262329 -0.86818063259 0.36786195636 0 -0.036359213293 0.41858324409 0 -0.10152591765 0.39809632301 0.12934933603 -0.10152591765 0.34985750914 0.11367559433 -0.036359213293 0.45788666606 0 -0.17415228486 0.43547609448 0.14149476588 -0.17415228486 0.48470014334 0 -0.2522572577 0.4609772265 0.14978057146 -0.2522572577 0.49829223752 0 -0.33371031284 0.47390407324 0.15398077667 -0.33371031284 0.49829223752 0 -0.41628968716 0.47390407324 0.15398077667 -0.41628968716 0.48470014334 0 -0.4977427423 0.4609772265 0.14978057146 -0.4977427423 0.45788666606 0 -0.57584768534 0.43547609448 0.14149476588 -0.57584768534 0.41858324409 0 -0.64847409725 0.39809632301 0.12934933603 -0.64847409725 0.36786195636 0 -0.71364080906 0.34985750914 0.11367559433 -0.71364080906 0.30710634589 0 -0.76957023144 0.29207551479 0.0949010849 -0.76957023144 0.23797369003 0 -0.81473690271 0.2263264358 0.073537915945 -0.81473690271 0.16234973073 0 -0.84790861607 0.15440377593 0.050168827176 -0.84790861607 0.33864095807 0.24603705108 -0.10152591765 0.29760658741 0.21622383595 -0.036359213293 0.37043809891 0.26913902164 -0.17415228486 0.39213064313 0.2848995924 -0.2522572577 0.40312689543 0.29288882017 -0.33371031284 0.40312689543 0.29288882017 -0.41628968716 0.39213064313 0.2848995924 -0.4977427423 0.37043809891 0.26913902164 -0.57584768534 0.33864095807 0.24603705108 -0.64847409725 0.29760658741 0.21622383595 -0.71364080906 0.24845425785 0.1805125922 -0.76957023144 0.19252476096 0.13987742364 -0.81473690271 0.13134369254 0.095426782966 -0.84790861607 0.24603705108 0.33864095807 -0.10152591765 0.21622383595 0.29760658741 -0.036359213293 0.26913902164 0.37043809891 -0.17415228486 0.2848995924 0.39213064313 -0.2522572577 0.29288882017 0.40312689543 -0.33371031284 0.29288882017 0.40312689543 -0.41628968716 0.2848995924 0.39213064313 -0.4977427423 0.26913902164 0.37043809891 -0.57584768534 0.24603705108 0.33864095807 -0.64847409725 0.21622383595 0.29760658741 -0.71364080906 0.1805125922 0.24845425785 -0.76957023144 0.13987742364 0.19252476096 -0.81473690271 0.095426782966 0.13134369254 -0.84790861607 0.12934933603 0.39809632301 -0.10152591765 0.11367559433 0.34985750914 -0.036359213293 0.14149476588 0.43547609448 -0.17415228486 0.14978057146 0.4609772265 -0.2522572577 0.15398077667 0.47390407324 -0.33371031284 0.15398077667 0.47390407324 -0.41628968716 0.14978057146 0.4609772265 -0.4977427423 0.14149476588 0.43547609448 -0.57584768534 0.12934933603 0.39809632301 -0.64847409725 0.11367559433 0.34985750914 -0.71364080906 0.0949010849 0.29207551479 -0.76957023144 0.073537915945 0.2263264358 -0.81473690271 0.050168827176 0.15440377593 -0.84790861607 2.5630831518e-17 0.41858324409 -0.10152591765 2.2525047905e-17 0.36786195636 -0.036359213293 2.8037472151e-17 0.45788666606 -0.17415228486 2.9679323096e-17 0.48470014334 -0.2522572577 3.0511599142e-17 0.49829223752 -0.33371031284 3.0511599142e-17 0.49829223752 -0.41628968716 2.9679323096e-17 0.48470014334 -0.4977427423 2.8037472151e-17 0.45788666606 -0.57584768534 2.5630831518e-17 0.41858324409 -0.64847409725 2.2525047905e-17 0.36786195636 -0.71364080906 1.880484115e-17 0.30710634589 -0.76957023144 1.4571686463e-17 0.23797369003 -0.81473690271 9.9410541201e-18 0.16234973073 -0.84790861607 -0.12934933603 0.39809632301 -0.10152591765 -0.11367559433 0.34985750914 -0.036359213293 -0.14149476588 0.43547609448 -0.17415228486 -0.14978057146 0.4609772265 -0.2522572577 -0.15398077667 0.47390407324 -0.33371031284 -0.15398077667 0.47390407324 -0.41628968716 -0.14978057146 0.4609772265 -0.4977427423 -0.14149476588 0.43547609448 -0.57584768534 -0.12934933603 0.39809632301 -0.64847409725 -0.11367559433 0.34985750914 -0.71364080906 -0.0949010849 0.29207551479 -0.76957023144 -0.073537915945 0.2263264358 -0.81473690271 -0.050168827176 0.15440377593 -0.84790861607 -0.24603705108 0.33864095807 -0.10152591765 -0.21622383595 0.29760658741 -0.036359213293 -0.26913902164 0.37043809891 -0.17415228486 -0.2848995924 0.39213064313 -0.2522572577 -0.29288882017 0.40312689543 -0.33371031284 -0.29288882017 0.40312689543 -0.41628968716 -0.2848995924 0.39213064313 -0.4977427423 -0.26913902164 0.37043809891 -0.57584768534 -0.24603705108 0.33864095807 -0.64847409725 -0.21622383595 0.29760658741 -0.71364080906 -0.1805125922 0.24845425785 -0.76957023144 -0.13987742364 0.19252476096 -0.81473690271 -0.095426782966 0.13134369254 -0.84790861607 -0.33864095807 0.24603705108 -0.10152591765 -0.29760658741 0.21622383595 -0.036359213293 -0.37043809891 0.26913902164 -0.17415228486 -0.39213064313 0.2848995924 -0.2522572577 -0.40312689543 0.29288882017 -0.33371031284 -0.40312689543 0.29288882017 -0.41628968716 -0.39213064313 0.2848995924 -0.4977427423 -0.37043809891 0.26913902164 -0.57584768534 -0.33864095807 0.24603705108 -0.64847409725 -0.29760658741 0.21622383595 -0.71364080906 -0.24845425785 0.1805125922 -0.76957023144 -0.19252476096 0.13987742364 -0.81473690271 -0.13134369254 0.095426782966 -0.84790861607 -0.39809632301 0.12934933603 -0.10152591765 -0.34985750914 0.11367559433 -0.036359213293 -0.43547609448 0.14149476588 -0.17415228486 -0.4609772265 0.14978057146 -0.2522572577 -0.47390407324 0.15398077667 -0.33371031284 -0.47390407324 0.15398077667 -0.41628968716 -0.4609772265 0.14978057146 -0.4977427423 -0.43547609448 0.14149476588 -0.57584768534 -0.39809632301 0.12934933603 -0.64847409725 -0.34985750914 0.11367559433 -0.71364080906 -0.29207551479 0.0949010849 -0.76957023144 -0.2263264358 0.073537915945 -0.81473690271 -0.15440377593 0.050168827176 -0.84790861607 -0.41858324409 5.1261663035e-17 -0.10152591765 -0.36786195636 4.5050095809e-17 -0.036359213293 -0.45788666606 5.6074944302e-17 -0.17415228486 -0.48470014334 5.9358646193e-17 -0.2522572577 -0.49829223752 6.1023198283e-17 -0.33371031284 -0.49829223752 6.1023198283e-17 -0.41628968716 -0.48470014334 5.9358646193e-17 -0.4977427423 -0.45788666606 5.6074944302e-17 -0.57584768534 -0.41858324409 5.1261663035e-17 -0.64847409725 -0.36786195636 4.5050095809e-17 -0.71364080906 -0.30710634589 3.76096823e-17 -0.76957023144 -0.23797369003 2.9143372925e-17 -0.81473690271 -0.16234973073 1.988210824e-17 -0.84790861607 -0.39809632301 -0.12934933603 -0.10152591765 -0.34985750914 -0.11367559433 -0.036359213293 -0.43547609448 -0.14149476588 -0.17415228486 -0.4609772265 -0.14978057146 -0.2522572577 -0.47390407324 -0.15398077667 -0.33371031284 -0.47390407324 -0.15398077667 -0.41628968716 -0.4609772265 -0.14978057146 -0.4977427423 -0.43547609448 -0.14149476588 -0.57584768534 -0.39809632301 -0.12934933603 -0.64847409725 -0.34985750914 -0.11367559433 -0.71364080906 -0.29207551479 -0.0949010849 -0.76957023144 -0.2263264358 -0.073537915945 -0.81473690271 -0.15440377593 -0.050168827176 -0.84790861607 -0.33864095807 -0.24603705108 -0.10152591765 -0.29760658741 -0.21622383595 -0.036359213293 -0.37043809891 -0.26913902164 -0.17415228486 -0.39213064313 -0.2848995924 -0.2522572577 -0.40312689543 -0.29288882017 -0.33371031284 -0.40312689543 -0.29288882017 -0.41628968716 -0.39213064313 -0.2848995924 -0.4977427423 -0.37043809891 -0.26913902164 -0.57584768534 -0.33864095807 -0.24603705108 -0.64847409725 -0.29760658741 -0.21622383595 -0.71364080906 -0.24845425785 -0.1805125922 -0.76957023144 -0.19252476096 -0.13987742364 -0.81473690271 -0.13134369254 -0.095426782966 -0.84790861607 -0.24603705108 -0.33864095807 -0.10152591765 -0.21622383595 -0.29760658741 -0.036359213293 -0.26913902164 -0.37043809891 -0.17415228486 -0.2848995924 -0.39213064313 -0.2522572577 -0.29288882017 -0.40312689543 -0.33371031284 -0.29288882017 -0.40312689543 -0.41628968716 -0.2848995924 -0.39213064313 -0.4977427423 -0.26913902164 -0.37043809891 -0.57584768534 -0.24603705108 -0.33864095807 -0.64847409725 -0.21622383595 -0.29760658741 -0.71364080906 -0.1805125922 -0.24845425785 -0.76957023144 -0.13987742364 -0.19252476096 -0.81473690271 -0.095426782966 -0.13134369254 -0.84790861607 -0.12934933603 -0.39809632301 -0.10152591765 -0.11367559433 -0.34985750914 -0.036359213293 -0.14149476588 -0.43547609448 -0.17415228486 -0.14978057146 -0.4609772265 -0.2522572577 -0.15398077667 -0.47390407324 -0.33371031284 -0.15398077667 -0.47390407324 -0.41628968716 -0.14978057146 -0.4609772265 -0.4977427423 -0.14149476588 -0.43547609448 -0.57584768534 -0.12934933603 -0.39809632301 -0.64847409725 -0.11367559433 -0.34985750914 -0.71364080906 -0.0949010849 -0.29207551479 -0.76957023144 -0.073537915945 -0.2263264358 -0.81473690271 -0.050168827176 -0.15440377593 -0.84790861607 -7.6892492899e-17 -0.41858324409 -0.10152591765 -6.7575143714e-17 -0.36786195636 -0.036359213293 -8.4112416453e-17 -0.45788666606 -0.17415228486 -8.9037972598e-17 -0.48470014334 -0.2522572577 -9.1534800733e-17 -0.49829223752 -0.33371031284 -9.1534800733e-17 -0.49829223752 -0.41628968716 -8.9037972598e-17 -0.48470014334 -0.4977427423 -8.4112416453e-17 -0.45788666606 -0.57584768534 -7.6892492899e-17 -0.41858324409 -0.64847409725 -6.7575143714e-17 -0.36786195636 -0.71364080906 -5.6414525104e-17 -0.30710634589 -0.76957023144 -4.3715059388e-17 -0.23797369003 -0.81473690271 -2.9823163188e-17 -0.16234973073 -0.84790861607 0.12934933603 -0.39809632301 -0.10152591765 0.11367559433 -0.34985750914 -0.036359213293 0.14149476588 -0.43547609448 -0.17415228486 0.14978057146 -0.4609772265 -0.2522572577 0.15398077667 -0.47390407324 -0.33371031284 0.15398077667 -0.47390407324 -0.41628968716 0.14978057146 -0.4609772265 -0.4977427423 0.14149476588 -0.43547609448 -0.57584768534 0.12934933603 -0.39809632301 -0.64847409725 0.11367559433 -0.34985750914 -0.71364080906 0.0949010849 -0.29207551479 -0.76957023144 0.073537915945 -0.2263264358 -0.81473690271 0.050168827176 -0.15440377593 -0.84790861607 0.24603705108 -0.33864095807 -0.10152591765 0.21622383595 -0.29760658741 -0.036359213293 0.26913902164 -0.37043809891 -0.17415228486 0.2848995924 -0.39213064313 -0.2522572577 0.29288882017 -0.40312689543 -0.33371031284 0.29288882017 -0.40312689543 -0.41628968716 0.2848995924 -0.39213064313 -0.4977427423 0.26913902164 -0.37043809891 -0.57584768534 0.24603705108 -0.33864095807 -0.64847409725 0.21622383595 -0.29760658741 -0.71364080906 0.1805125922 -0.24845425785 -0.76957023144 0.13987742364 -0.19252476096 -0.81473690271 0.095426782966 -0.13134369254 -0.84790861607 0.33864095807 -0.24603705108 -0.10152591765 0.29760658741 -0.21622383595 -0.036359213293 0.37043809891 -0.26913902164 -0.17415228486 0.39213064313 -0.2848995924 -0.2522572577 0.40312689543 -0.29288882017 -0.33371031284 0.40312689543 -0.29288882017 -0.41628968716 0.39213064313 -0.2848995924 -0.4977427423 0.37043809891 -0.26913902164 -0.57584768534 0.33864095807 -0.24603705108 -0.64847409725 0.29760658741 -0.21622383595 -0.71364080906 0.24845425785 -0.1805125922 -0.76957023144 0.19252476096 -0.13987742364 -0.81473690271 0.13134369254 -0.095426782966 -0.84790861607 0.39809632301 -0.12934933603 -0.10152591765 0.34985750914 -0.11367559433 -0.036359213293 0.43547609448 -0.14149476588 -0.17415228486 0.4609772265 -0.14978057146 -0.2522572577 0.47390407324 -0.15398077667 -0.33371031284 0.47390407324 -0.15398077667 -0.41628968716 0.4609772265 -0.14978057146 -0.4977427423 0.43547609448 -0.14149476588 -0.57584768534 0.39809632301 -0.12934933603 -0.64847409725 0.34985750914 -0.11367559433 -0.71364080906 0.29207551479 -0.0949010849 -0.76957023144 0.2263264358 -0.073537915945 -0.81473690271 0.15440377593 -0.050168827176 -0.84790861607 0.3220653893 0.03977618435 -4.9487070846e-09 0.32836531327 8.6818331113e-19 -2.8171179001e-17 0.31229398553 0.10147046475 2.5407916269e-17 0.31859390657 0.06169429886 -4.9487070599e-09 0.29401088933 0.13735306108 5.1429095066e-09 0.2656531266 0.19300829687 1.3877787808e-17 0.28393623162 0.15712568324 5.1429095066e-09 0.23717652592 0.22148489755 -0 0.19300829687 0.2656531266 -0 0.22148489755 0.23717652592 -0 0.15712568324 0.28393623162 -5.1429094891e-09 0.10147046475 0.31229398553 -2.5197041461e-17 0.13735306108 0.29401088933 -5.1429095118e-09 0.06169429886 0.31859390657 4.9487070318e-09 1.8882986284e-17 0.32836531327 2.3493044647e-24 0.03977618435 0.3220653893 4.948707057e-09 -0.03977618435 0.3220653893 -4.9487070858e-09 -0.10147046475 0.31229398553 -4.4034066554e-18 -0.06169429886 0.31859390657 -4.948707057e-09 -0.13735306108 0.29401088933 5.1429095118e-09 -0.19300829687 0.2656531266 2.0768586122e-18 -0.15712568324 0.28393623162 5.1429095066e-09 -0.22148489755 0.23717652592 0 -0.2656531266 0.19300829687 0 -0.23717652592 0.22148489755 0 -0.28393623162 0.15712568324 -5.1429094753e-09 -0.31229398553 0.10147046475 -2.5407916269e-17 -0.29401088933 0.13735306108 -5.1429095118e-09 -0.31859390657 0.06169429886 4.9487070561e-09 -0.32836531327 3.8887509036e-17 4.8381435661e-24 -0.3220653893 0.03977618435 4.9487070561e-09 -0.3220653893 -0.03977618435 -4.9487070852e-09 -0.31229398553 -0.10147046475 -2.9741361642e-18 -0.31859390657 -0.06169429886 -4.9487070599e-09 -0.29401088933 -0.13735306108 5.1429095066e-09 -0.2656531266 -0.19300829687 1.3877787808e-17 -0.28393623162 -0.15712568324 5.1429095066e-09 -0.23717652592 -0.22148489755 0 -0.19300829687 -0.2656531266 0 -0.22148489755 -0.23717652592 0 -0.15712568324 -0.28393623162 -5.1429094753e-09 -0.10147046475 -0.31229398553 -2.540791296e-17 -0.13735306108 -0.29401088933 -5.1429094753e-09 -0.06169429886 -0.31859390657 4.9487070561e-09 -6.0659279325e-17 -0.32836531327 -8.8442977687e-18 -0.03977618435 -0.3220653893 4.9487070565e-09 0.03977618435 -0.3220653893 -4.9487070556e-09 0.10147046475 -0.31229398553 -1.5448640187e-18 0.06169429886 -0.31859390657 -4.9487070591e-09 0.13735306108 -0.29401088933 5.1429095066e-09 0.19300829687 -0.2656531266 0 0.15712568324 -0.28393623162 5.1429094891e-09 0.22148489755 -0.23717652592 0 0.2656531266 -0.19300829687 -2.0768619209e-18 0.23717652592 -0.22148489755 0 0.28393623162 -0.15712568324 -5.1429094753e-09 0.31229398553 -0.10147046475 2.9741345099e-18 0.29401088933 -0.13735306108 -5.1429095118e-09 0.31859390657 -0.06169429886 4.9487070561e-09 0.3220653893 -0.03977618435 4.9487070565e-09 0.082297295332 0 0.86818063259 0.078269377351 0.025431262329 0.86818063259 0 0 0.875 0.066579908133 0.048373136669 0.86818063259 0.048373136669 0.066579908133 0.86818063259 0.025431262329 0.078269377351 0.86818063259 5.0392558428e-18 0.082297295332 0.86818063259 -0.025431262329 0.078269377351 0.86818063259 -0.048373136669 0.066579908133 0.86818063259 -0.066579908133 0.048373136669 0.86818063259 -0.078269377351 0.025431262329 0.86818063259 -0.082297295332 1.0078511686e-17 0.86818063259 -0.078269377351 -0.025431262329 0.86818063259 -0.066579908133 -0.048373136669 0.86818063259 -0.048373136669 -0.066579908133 0.86818063259 -0.025431262329 -0.078269377351 0.86818063259 -1.5117767942e-17 -0.082297295332 0.86818063259 0.025431262329 -0.078269377351 0.86818063259 0.048373136669 -0.066579908133 0.86818063259 0.066579908133 -0.048373136669 0.86818063259 0.078269377351 -0.025431262329 0.86818063259 0.16234973073 0 0.84790861607 0.15440377593 0.050168827176 0.84790861607 0.23797369003 0 0.81473690271 0.2263264358 0.073537915945 0.81473690271 0.30710634589 0 0.76957023144 0.29207551479 0.0949010849 0.76957023144 0.36786195636 0 0.71364080906 0.34985750914 0.11367559433 0.71364080906 0.41858324409 0 0.64847409725 0.39809632301 0.12934933603 0.64847409725 0.45788666606 0 0.57584768534 0.43547609448 0.14149476588 0.57584768534 0.48470014334 0 0.4977427423 0.4609772265 0.14978057146 0.4977427423 0.49829223752 0 0.41628968716 0.47390407324 0.15398077667 0.41628968716 0.49829223752 0 0.33371031284 0.47390407324 0.15398077667 0.33371031284 0.48470014334 0 0.2522572577 0.4609772265 0.14978057146 0.2522572577 0.45788666606 0 0.17415228486 0.43547609448 0.14149476588 0.17415228486 0.41858324409 0 0.10152591765 0.39809632301 0.12934933603 0.10152591765 0.36786195636 0 0.036359213293 0.34985750914 0.11367559433 0.036359213293 0.13134369254 0.095426782966 0.84790861607 0.19252476096 0.13987742364 0.81473690271 0.24845425785 0.1805125922 0.76957023144 0.29760658741 0.21622383595 0.71364080906 0.33864095807 0.24603705108 0.64847409725 0.37043809891 0.26913902164 0.57584768534 0.39213064313 0.2848995924 0.4977427423 0.40312689543 0.29288882017 0.41628968716 0.40312689543 0.29288882017 0.33371031284 0.39213064313 0.2848995924 0.2522572577 0.37043809891 0.26913902164 0.17415228486 0.33864095807 0.24603705108 0.10152591765 0.29760658741 0.21622383595 0.036359213293 0.095426782966 0.13134369254 0.84790861607 0.13987742364 0.19252476096 0.81473690271 0.1805125922 0.24845425785 0.76957023144 0.21622383595 0.29760658741 0.71364080906 0.24603705108 0.33864095807 0.64847409725 0.26913902164 0.37043809891 0.57584768534 0.2848995924 0.39213064313 0.4977427423 0.29288882017 0.40312689543 0.41628968716 0.29288882017 0.40312689543 0.33371031284 0.2848995924 0.39213064313 0.2522572577 0.26913902164 0.37043809891 0.17415228486 0.24603705108 0.33864095807 0.10152591765 0.21622383595 0.29760658741 0.036359213293 0.050168827176 0.15440377593 0.84790861607 0.073537915945 0.2263264358 0.81473690271 0.0949010849 0.29207551479 0.76957023144 0.11367559433 0.34985750914 0.71364080906 0.12934933603 0.39809632301 0.64847409725 0.14149476588 0.43547609448 0.57584768534 0.14978057146 0.4609772265 0.4977427423 0.15398077667 0.47390407324 0.41628968716 0.15398077667 0.47390407324 0.33371031284 0.14978057146 0.4609772265 0.2522572577 0.14149476588 0.43547609448 0.17415228486 0.12934933603 0.39809632301 0.10152591765 0.11367559433 0.34985750914 0.036359213293 9.9410541201e-18 0.16234973073 0.84790861607 1.4571686463e-17 0.23797369003 0.81473690271 1.880484115e-17 0.30710634589 0.76957023144 2.2525047905e-17 0.36786195636 0.71364080906 2.5630831518e-17 0.41858324409 0.64847409725 2.8037472151e-17 0.45788666606 0.57584768534 2.9679323096e-17 0.48470014334 0.4977427423 3.0511599142e-17 0.49829223752 0.41628968716 3.0511599142e-17 0.49829223752 0.33371031284 2.9679323096e-17 0.48470014334 0.2522572577 2.8037472151e-17 0.45788666606 0.17415228486 2.5630831518e-17 0.41858324409 0.10152591765 2.2525047905e-17 0.36786195636 0.036359213293 -0.050168827176 0.15440377593 0.84790861607 -0.073537915945 0.2263264358 0.81473690271 -0.0949010849 0.29207551479 0.76957023144 -0.11367559433 0.34985750914 0.71364080906 -0.12934933603 0.39809632301 0.64847409725 -0.14149476588 0.43547609448 0.57584768534 -0.14978057146 0.4609772265 0.4977427423 -0.15398077667 0.47390407324 0.41628968716 -0.15398077667 0.47390407324 0.33371031284 -0.14978057146 0.4609772265 0.2522572577 -0.14149476588 0.43547609448 0.17415228486 -0.12934933603 0.39809632301 0.10152591765 -0.11367559433 0.34985750914 0.036359213293 -0.095426782966 0.13134369254 0.84790861607 -0.13987742364 0.19252476096 0.81473690271 -0.1805125922 0.24845425785 0.76957023144 -0.21622383595 0.29760658741 0.71364080906 -0.24603705108 0.33864095807 0.64847409725 -0.26913902164 0.37043809891 0.57584768534 -0.2848995924 0.39213064313 0.4977427423 -0.29288882017 0.40312689543 0.41628968716 -0.29288882017 0.40312689543 0.33371031284 -0.2848995924 0.39213064313 0.2522572577 -0.26913902164 0.37043809891 0.17415228486 -0.24603705108 0.33864095807 0.10152591765 -0.21622383595 0.29760658741 0.036359213293 -0.13134369254 0.095426782966 0.84790861607 -0.19252476096 0.13987742364 0.81473690271 -0.24845425785 0.1805125922 0.76957023144 -0.29760658741 0.21622383595 0.71364080906 -0.33864095807 0.24603705108 0.64847409725 -0.37043809891 0.26913902164 0.57584768534 -0.39213064313 0.2848995924 0.4977427423 -0.40312689543 0.29288882017 0.41628968716 -0.40312689543 0.29288882017 0.33371031284 -0.39213064313 0.2848995924 0.2522572577 -0.37043809891 0.26913902164 0.17415228486 -0.33864095807 0.24603705108 0.10152591765 -0.29760658741 0.21622383595 0.036359213293 -0.15440377593 0.050168827176 0.84790861607 -0.2263264358 0.073537915945 0.81473690271 -0.29207551479 0.0949010849 0.76957023144 -0.34985750914 0.11367559433 0.71364080906 -0.39809632301 0.12934933603 0.64847409725 -0.43547609448 0.14149476588 0.57584768534 -0.4609772265 0.14978057146 0.4977427423 -0.47390407324 0.15398077667 0.41628968716 -0.47390407324 0.15398077667 0.33371031284 -0.4609772265 0.14978057146 0.2522572577 -0.43547609448 0.14149476588 0.17415228486 -0.39809632301 0.12934933603 0.10152591765 -0.34985750914 0.11367559433 0.036359213293 -0.16234973073 1.988210824e-17 0.84790861607 -0.23797369003 2.9143372925e-17 0.81473690271 -0.30710634589 3.76096823e-17 0.76957023144 -0.36786195636 4.5050095809e-17 0.71364080906 -0.41858324409 5.1261663035e-17 0.64847409725 -0.45788666606 5.6074944302e-17 0.57584768534 -0.48470014334 5.9358646193e-17 0.4977427423 -0.49829223752 6.1023198283e-17 0.41628968716 -0.49829223752 6.1023198283e-17 0.33371031284 -0.48470014334 5.9358646193e-17 0.2522572577 -0.45788666606 5.6074944302e-17 0.17415228486 -0.41858324409 5.1261663035e-17 0.10152591765 -0.36786195636 4.5050095809e-17 0.036359213293 -0.15440377593 -0.050168827176 0.84790861607 -0.2263264358 -0.073537915945 0.81473690271 -0.29207551479 -0.0949010849 0.76957023144 -0.34985750914 -0.11367559433 0.71364080906 -0.39809632301 -0.12934933603 0.64847409725 -0.43547609448 -0.14149476588 0.57584768534 -0.4609772265 -0.14978057146 0.4977427423 -0.47390407324 -0.15398077667 0.41628968716 -0.47390407324 -0.15398077667 0.33371031284 -0.4609772265 -0.14978057146 0.2522572577 -0.43547609448 -0.14149476588 0.17415228486 -0.39809632301 -0.12934933603 0.10152591765 -0.34985750914 -0.11367559433 0.036359213293 -0.13134369254 -0.095426782966 0.84790861607 -0.19252476096 -0.13987742364 0.81473690271 -0.24845425785 -0.1805125922 0.76957023144 -0.29760658741 -0.21622383595 0.71364080906 -0.33864095807 -0.24603705108 0.64847409725 -0.37043809891 -0.26913902164 0.57584768534 -0.39213064313 -0.2848995924 0.4977427423 -0.40312689543 -0.29288882017 0.41628968716 -0.40312689543 -0.29288882017 0.33371031284 -0.39213064313 -0.2848995924 0.2522572577 -0.37043809891 -0.26913902164 0.17415228486 -0.33864095807 -0.24603705108 0.10152591765 -0.29760658741 -0.21622383595 0.036359213293 -0.095426782966 -0.13134369254 0.84790861607 -0.13987742364 -0.19252476096 0.81473690271 -0.1805125922 -0.24845425785 0.76957023144 -0.21622383595 -0.29760658741 0.71364080906 -0.24603705108 -0.33864095807 0.64847409725 -0.26913902164 -0.37043809891 0.57584768534 -0.2848995924 -0.39213064313 0.4977427423 -0.29288882017 -0.40312689543 0.41628968716 -0.29288882017 -0.40312689543 0.33371031284 -0.2848995924 -0.39213064313 0.2522572577 -0.26913902164 -0.37043809891 0.17415228486 -0.24603705108 -0.33864095807 0.10152591765 -0.21622383595 -0.29760658741 0.036359213293 -0.050168827176 -0.15440377593 0.84790861607 -0.073537915945 -0.2263264358 0.81473690271 -0.0949010849 -0.29207551479 0.76957023144 -0.11367559433 -0.34985750914 0.71364080906 -0.12934933603 -0.39809632301 0.64847409725 -0.14149476588 -0.43547609448 0.57584768534 -0.14978057146 -0.4609772265 0.4977427423 -0.15398077667 -0.47390407324 0.41628968716 -0.15398077667 -0.47390407324 0.33371031284 -0.14978057146 -0.4609772265 0.2522572577 -0.14149476588 -0.43547609448 0.17415228486 -0.12934933603 -0.39809632301 0.10152591765 -0.11367559433 -0.34985750914 0.036359213293 -2.9823163188e-17 -0.16234973073 0.84790861607 -4.3715059388e-17 -0.23797369003 0.81473690271 -5.6414525104e-17 -0.30710634589 0.76957023144 -6.7575143714e-17 -0.36786195636 0.71364080906 -7.6892492899e-17 -0.41858324409 0.64847409725 -8.4112416453e-17 -0.45788666606 0.57584768534 -8.9037972598e-17 -0.48470014334 0.4977427423 -9.1534800733e-17 -0.49829223752 0.41628968716 -9.1534800733e-17 -0.49829223752 0.33371031284 -8.9037972598e-17 -0.48470014334 0.2522572577 -8.4112416453e-17 -0.45788666606 0.17415228486 -7.6892492899e-17 -0.41858324409 0.10152591765 -6.7575143714e-17 -0.36786195636 0.036359213293 0.050168827176 -0.15440377593 0.84790861607 0.073537915945 -0.2263264358 0.81473690271 0.0949010849 -0.29207551479 0.76957023144 0.11367559433 -0.34985750914 0.71364080906 0.12934933603 -0.39809632301 0.64847409725 0.14149476588 -0.43547609448 0.57584768534 0.14978057146 -0.4609772265 0.4977427423 0.15398077667 -0.47390407324 0.41628968716 0.15398077667 -0.47390407324 0.33371031284 0.14978057146 -0.4609772265 0.2522572577 0.14149476588 -0.43547609448 0.17415228486 0.12934933603 -0.39809632301 0.10152591765 0.11367559433 -0.34985750914 0.036359213293 0.095426782966 -0.13134369254 0.84790861607 0.13987742364 -0.19252476096 0.81473690271 0.1805125922 -0.24845425785 0.76957023144 0.21622383595 -0.29760658741 0.71364080906 0.24603705108 -0.33864095807 0.64847409725 0.26913902164 -0.37043809891 0.57584768534 0.2848995924 -0.39213064313 0.4977427423 0.29288882017 -0.40312689543 0.41628968716 0.29288882017 -0.40312689543 0.33371031284 0.2848995924 -0.39213064313 0.2522572577 0.26913902164 -0.37043809891 0.17415228486 0.24603705108 -0.33864095807 0.10152591765 0.21622383595 -0.29760658741 0.036359213293 0.13134369254 -0.095426782966 0.84790861607 0.19252476096 -0.13987742364 0.81473690271 0.24845425785 -0.1805125922 0.76957023144 0.29760658741 -0.21622383595 0.71364080906 0.33864095807 -0.24603705108 0.64847409725 0.37043809891 -0.26913902164 0.57584768534 0.39213064313 -0.2848995924 0.4977427423 0.40312689543 -0.29288882017 0.41628968716 0.40312689543 -0.29288882017 0.33371031284 0.39213064313 -0.2848995924 0.2522572577 0.37043809891 -0.26913902164 0.17415228486 0.33864095807 -0.24603705108 0.10152591765 0.29760658741 -0.21622383595 0.036359213293 0.15440377593 -0.050168827176 0.84790861607 0.2263264358 -0.073537915945 0.81473690271 0.29207551479 -0.0949010849 0.76957023144 0.34985750914 -0.11367559433 0.71364080906 0.39809632301 -0.12934933603 0.64847409725 0.43547609448 -0.14149476588 0.57584768534 0.4609772265 -0.14978057146 0.4977427423 0.47390407324 -0.15398077667 0.41628968716 0.47390407324 -0.15398077667 0.33371031284 0.4609772265 -0.14978057146 0.2522572577 0.43547609448 -0.14149476588 0.17415228486 0.39809632301 -0.12934933603 0.10152591765 0.34985750914 -0.11367559433 0.036359213293 0 0 0 0 0 -0.75 0.061722971499 0 -0.0051145111211 0.12176229805 0 -0.020318534225 0.17848026752 0 -0.045197341591 0.23032976687 0 -0.079072311521 0.27589645982 0 -0.12101940811 0.31393742561 0 -0.16989444196 0.34341499209 0 -0.2243642211 0.3635250926 0 -0.28294295073 0.37371918559 0 -0.34403273463 0.37371918559 0 -0.40596726537 0.3635250926 0 -0.46705704927 0.34341499209 0 -0.5256357789 0.31393742561 0 -0.58010554314 0.27589645982 0 -0.62898057699 0.23032976687 0 -0.67092770338 0.17848026752 0 -0.70480263233 0.12176229805 0 -0.72968149185 0.061722971499 0 -0.74488550425 0.058702033013 0.019073447213 -0.0051145111211 0.11580283195 0.037626620382 -0.020318534225 0.1697448194 0.055153436959 -0.045197341591 0.21905662119 0.071175813675 -0.079072311521 0.26239314675 0.085256695747 -0.12101940811 0.29857224226 0.097011998296 -0.16989444196 0.32660707831 0.10612107068 -0.2243642211 0.34573292732 0.11233543605 -0.28294295073 0.35542806983 0.11548557878 -0.34403273463 0.35542806983 0.11548557878 -0.40596726537 0.34573292732 0.11233543605 -0.46705704927 0.32660707831 0.10612107068 -0.5256357789 0.29857224226 0.097011998296 -0.58010554314 0.26239314675 0.085256695747 -0.62898057699 0.21905662119 0.071175813675 -0.67092770338 0.1697448194 0.055153436959 -0.70480263233 0.11580283195 0.037626620382 -0.72968149185 0.058702033013 0.019073447213 -0.74488550425 0.049934931099 0.036279853433 -0.0051145111211 0.098507769406 0.071570083499 -0.020318534225 0.14439357817 0.10490807146 -0.045197341591 0.18634068966 0.13538444042 -0.079072311521 0.22320492566 0.16216787696 -0.12101940811 0.253980726 0.18452778459 -0.16989444196 0.27782857418 0.20185427368 -0.2243642211 0.2940979898 0.2136746943 -0.28294295073 0.30234518647 0.21966663003 -0.34403273463 0.30234518647 0.21966663003 -0.40596726537 0.2940979898 0.2136746943 -0.46705704927 0.27782857418 0.20185427368 -0.5256357789 0.253980726 0.18452778459 -0.58010554314 0.22320492566 0.16216787696 -0.62898057699 0.18634068966 0.13538444042 -0.67092770338 0.14439357817 0.10490807146 -0.70480263233 0.098507769406 0.071570083499 -0.72968149185 0.049934931099 0.036279853433 -0.74488550425 0.036279853433 0.049934931099 -0.0051145111211 0.071570083499 0.098507769406 -0.020318534225 0.10490807146 0.14439357817 -0.045197341591 0.13538444042 0.18634068966 -0.079072311521 0.16216787696 0.22320492566 -0.12101940811 0.18452778459 0.253980726 -0.16989444196 0.20185427368 0.27782857418 -0.2243642211 0.2136746943 0.2940979898 -0.28294295073 0.21966663003 0.30234518647 -0.34403273463 0.21966663003 0.30234518647 -0.40596726537 0.2136746943 0.2940979898 -0.46705704927 0.20185427368 0.27782857418 -0.5256357789 0.18452778459 0.253980726 -0.58010554314 0.16216787696 0.22320492566 -0.62898057699 0.13538444042 0.18634068966 -0.67092770338 0.10490807146 0.14439357817 -0.70480263233 0.071570083499 0.098507769406 -0.72968149185 0.036279853433 0.049934931099 -0.74488550425 0.019073447213 0.058702033013 -0.0051145111211 0.037626620382 0.11580283195 -0.020318534225 0.055153436959 0.1697448194 -0.045197341591 0.071175813675 0.21905662119 -0.079072311521 0.085256695747 0.26239314675 -0.12101940811 0.097011998296 0.29857224226 -0.16989444196 0.10612107068 0.32660707831 -0.2243642211 0.11233543605 0.34573292732 -0.28294295073 0.11548557878 0.35542806983 -0.34403273463 0.11548557878 0.35542806983 -0.40596726537 0.11233543605 0.34573292732 -0.46705704927 0.10612107068 0.32660707831 -0.5256357789 0.097011998296 0.29857224226 -0.58010554314 0.085256695747 0.26239314675 -0.62898057699 0.071175813675 0.21905662119 -0.67092770338 0.055153436959 0.1697448194 -0.70480263233 0.037626620382 0.11580283195 -0.72968149185 0.019073447213 0.058702033013 -0.74488550425 3.7794419855e-18 0.061722971499 -0.0051145111211 7.4557907969e-18 0.12176229805 -0.020318534225 1.0928764847e-17 0.17848026752 -0.045197341591 1.4103631276e-17 0.23032976687 -0.079072311521 1.6893785928e-17 0.27589645982 -0.12101940811 1.9223123225e-17 0.31393742561 -0.16989444196 2.1028104113e-17 0.34341499209 -0.2243642211 2.225949315e-17 0.3635250926 -0.28294295073 2.2883700183e-17 0.37371918559 -0.34403273463 2.2883700183e-17 0.37371918559 -0.40596726537 2.225949315e-17 0.3635250926 -0.46705704927 2.1028104113e-17 0.34341499209 -0.5256357789 1.9223123225e-17 0.31393742561 -0.58010554314 1.6893785928e-17 0.27589645982 -0.62898057699 1.4103631276e-17 0.23032976687 -0.67092770338 1.0928764847e-17 0.17848026752 -0.70480263233 7.4557907969e-18 0.12176229805 -0.72968149185 3.7794419855e-18 0.061722971499 -0.74488550425 -0.019073447213 0.058702033013 -0.0051145111211 -0.037626620382 0.11580283195 -0.020318534225 -0.055153436959 0.1697448194 -0.045197341591 -0.071175813675 0.21905662119 -0.079072311521 -0.085256695747 0.26239314675 -0.12101940811 -0.097011998296 0.29857224226 -0.16989444196 -0.10612107068 0.32660707831 -0.2243642211 -0.11233543605 0.34573292732 -0.28294295073 -0.11548557878 0.35542806983 -0.34403273463 -0.11548557878 0.35542806983 -0.40596726537 -0.11233543605 0.34573292732 -0.46705704927 -0.10612107068 0.32660707831 -0.5256357789 -0.097011998296 0.29857224226 -0.58010554314 -0.085256695747 0.26239314675 -0.62898057699 -0.071175813675 0.21905662119 -0.67092770338 -0.055153436959 0.1697448194 -0.70480263233 -0.037626620382 0.11580283195 -0.72968149185 -0.019073447213 0.058702033013 -0.74488550425 -0.036279853433 0.049934931099 -0.0051145111211 -0.071570083499 0.098507769406 -0.020318534225 -0.10490807146 0.14439357817 -0.045197341591 -0.13538444042 0.18634068966 -0.079072311521 -0.16216787696 0.22320492566 -0.12101940811 -0.18452778459 0.253980726 -0.16989444196 -0.20185427368 0.27782857418 -0.2243642211 -0.2136746943 0.2940979898 -0.28294295073 -0.21966663003 0.30234518647 -0.34403273463 -0.21966663003 0.30234518647 -0.40596726537 -0.2136746943 0.2940979898 -0.46705704927 -0.20185427368 0.27782857418 -0.5256357789 -0.18452778459 0.253980726 -0.58010554314 -0.16216787696 0.22320492566 -0.62898057699 -0.13538444042 0.18634068966 -0.67092770338 -0.10490807146 0.14439357817 -0.70480263233 -0.071570083499 0.098507769406 -0.72968149185 -0.036279853433 0.049934931099 -0.74488550425 -0.049934931099 0.036279853433 -0.0051145111211 -0.098507769406 0.071570083499 -0.020318534225 -0.14439357817 0.10490807146 -0.045197341591 -0.18634068966 0.13538444042 -0.079072311521 -0.22320492566 0.16216787696 -0.12101940811 -0.253980726 0.18452778459 -0.16989444196 -0.27782857418 0.20185427368 -0.2243642211 -0.2940979898 0.2136746943 -0.28294295073 -0.30234518647 0.21966663003 -0.34403273463 -0.30234518647 0.21966663003 -0.40596726537 -0.2940979898 0.2136746943 -0.46705704927 -0.27782857418 0.20185427368 -0.5256357789 -0.253980726 0.18452778459 -0.58010554314 -0.22320492566 0.16216787696 -0.62898057699 -0.18634068966 0.13538444042 -0.67092770338 -0.14439357817 0.10490807146 -0.70480263233 -0.098507769406 0.071570083499 -0.72968149185 -0.049934931099 0.036279853433 -0.74488550425 -0.058702033013 0.019073447213 -0.0051145111211 -0.11580283195 0.037626620382 -0.020318534225 -0.1697448194 0.055153436959 -0.045197341591 -0.21905662119 0.071175813675 -0.079072311521 -0.26239314675 0.085256695747 -0.12101940811 -0.29857224226 0.097011998296 -0.16989444196 -0.32660707831 0.10612107068 -0.2243642211 -0.34573292732 0.11233543605 -0.28294295073 -0.35542806983 0.11548557878 -0.34403273463 -0.35542806983 0.11548557878 -0.40596726537 -0.34573292732 0.11233543605 -0.46705704927 -0.32660707831 0.10612107068 -0.5256357789 -0.29857224226 0.097011998296 -0.58010554314 -0.26239314675 0.085256695747 -0.62898057699 -0.21905662119 0.071175813675 -0.67092770338 -0.1697448194 0.055153436959 -0.70480263233 -0.11580283195 0.037626620382 -0.72968149185 -0.058702033013 0.019073447213 -0.74488550425 -0.061722971499 7.558883971e-18 -0.0051145111211 -0.12176229805 1.4911581594e-17 -0.020318534225 -0.17848026752 2.1857529694e-17 -0.045197341591 -0.23032976687 2.8207262552e-17 -0.079072311521 -0.27589645982 3.3787571857e-17 -0.12101940811 -0.31393742561 3.8446246449e-17 -0.16989444196 -0.34341499209 4.2056208226e-17 -0.2243642211 -0.3635250926 4.4518986299e-17 -0.28294295073 -0.37371918559 4.5767400367e-17 -0.34403273463 -0.37371918559 4.5767400367e-17 -0.40596726537 -0.3635250926 4.4518986299e-17 -0.46705704927 -0.34341499209 4.2056208226e-17 -0.5256357789 -0.31393742561 3.8446246449e-17 -0.58010554314 -0.27589645982 3.3787571857e-17 -0.62898057699 -0.23032976687 2.8207262552e-17 -0.67092770338 -0.17848026752 2.1857529694e-17 -0.70480263233 -0.12176229805 1.4911581594e-17 -0.72968149185 -0.061722971499 7.558883971e-18 -0.74488550425 -0.058702033013 -0.019073447213 -0.0051145111211 -0.11580283195 -0.037626620382 -0.020318534225 -0.1697448194 -0.055153436959 -0.045197341591 -0.21905662119 -0.071175813675 -0.079072311521 -0.26239314675 -0.085256695747 -0.12101940811 -0.29857224226 -0.097011998296 -0.16989444196 -0.32660707831 -0.10612107068 -0.2243642211 -0.34573292732 -0.11233543605 -0.28294295073 -0.35542806983 -0.11548557878 -0.34403273463 -0.35542806983 -0.11548557878 -0.40596726537 -0.34573292732 -0.11233543605 -0.46705704927 -0.32660707831 -0.10612107068 -0.5256357789 -0.29857224226 -0.097011998296 -0.58010554314 -0.26239314675 -0.085256695747 -0.62898057699 -0.21905662119 -0.071175813675 -0.67092770338 -0.1697448194 -0.055153436959 -0.70480263233 -0.11580283195 -0.037626620382 -0.72968149185 -0.058702033013 -0.019073447213 -0.74488550425 -0.049934931099 -0.036279853433 -0.0051145111211 -0.098507769406 -0.071570083499 -0.020318534225 -0.14439357817 -0.10490807146 -0.045197341591 -0.18634068966 -0.13538444042 -0.079072311521 -0.22320492566 -0.16216787696 -0.12101940811 -0.253980726 -0.18452778459 -0.16989444196 -0.27782857418 -0.20185427368 -0.2243642211 -0.2940979898 -0.2136746943 -0.28294295073 -0.30234518647 -0.21966663003 -0.34403273463 -0.30234518647 -0.21966663003 -0.40596726537 -0.2940979898 -0.2136746943 -0.46705704927 -0.27782857418 -0.20185427368 -0.5256357789 -0.253980726 -0.18452778459 -0.58010554314 -0.22320492566 -0.16216787696 -0.62898057699 -0.18634068966 -0.13538444042 -0.67092770338 -0.14439357817 -0.10490807146 -0.70480263233 -0.098507769406 -0.071570083499 -0.72968149185 -0.049934931099 -0.036279853433 -0.74488550425 -0.036279853433 -0.049934931099 -0.0051145111211 -0.071570083499 -0.098507769406 -0.020318534225 -0.10490807146 -0.14439357817 -0.045197341591 -0.13538444042 -0.18634068966 -0.079072311521 -0.16216787696 -0.22320492566 -0.12101940811 -0.18452778459 -0.253980726 -0.16989444196 -0.20185427368 -0.27782857418 -0.2243642211 -0.2136746943 -0.2940979898 -0.28294295073 -0.21966663003 -0.30234518647 -0.34403273463 -0.21966663003 -0.30234518647 -0.40596726537 -0.2136746943 -0.2940979898 -0.46705704927 -0.20185427368 -0.27782857418 -0.5256357789 -0.18452778459 -0.253980726 -0.58010554314 -0.16216787696 -0.22320492566 -0.62898057699 -0.13538444042 -0.18634068966 -0.67092770338 -0.10490807146 -0.14439357817 -0.70480263233 -0.071570083499 -0.098507769406 -0.72968149185 -0.036279853433 -0.049934931099 -0.74488550425 -0.019073447213 -0.058702033013 -0.0051145111211 -0.037626620382 -0.11580283195 -0.020318534225 -0.055153436959 -0.1697448194 -0.045197341591 -0.071175813675 -0.21905662119 -0.079072311521 -0.085256695747 -0.26239314675 -0.12101940811 -0.097011998296 -0.29857224226 -0.16989444196 -0.10612107068 -0.32660707831 -0.2243642211 -0.11233543605 -0.34573292732 -0.28294295073 -0.11548557878 -0.35542806983 -0.34403273463 -0.11548557878 -0.35542806983 -0.40596726537 -0.11233543605 -0.34573292732 -0.46705704927 -0.10612107068 -0.32660707831 -0.5256357789 -0.097011998296 -0.29857224226 -0.58010554314 -0.085256695747 -0.26239314675 -0.62898057699 -0.071175813675 -0.21905662119 -0.67092770338 -0.055153436959 -0.1697448194 -0.70480263233 -0.037626620382 -0.11580283195 -0.72968149185 -0.019073447213 -0.058702033013 -0.74488550425 -1.1338325956e-17 -0.061722971499 -0.0051145111211 -2.2367372391e-17 -0.12176229805 -0.020318534225 -3.2786292887e-17 -0.17848026752 -0.045197341591 -4.231089052e-17 -0.23032976687 -0.079072311521 -5.068135944e-17 -0.27589645982 -0.12101940811 -5.7669371329e-17 -0.31393742561 -0.16989444196 -6.3084313994e-17 -0.34341499209 -0.2243642211 -6.677847614e-17 -0.3635250926 -0.28294295073 -6.865110055e-17 -0.37371918559 -0.34403273463 -6.865110055e-17 -0.37371918559 -0.40596726537 -6.677847614e-17 -0.3635250926 -0.46705704927 -6.3084313994e-17 -0.34341499209 -0.5256357789 -5.7669371329e-17 -0.31393742561 -0.58010554314 -5.068135944e-17 -0.27589645982 -0.62898057699 -4.231089052e-17 -0.23032976687 -0.67092770338 -3.2786292887e-17 -0.17848026752 -0.70480263233 -2.2367372391e-17 -0.12176229805 -0.72968149185 -1.1338325956e-17 -0.061722971499 -0.74488550425 0.019073447213 -0.058702033013 -0.0051145111211 0.037626620382 -0.11580283195 -0.020318534225 0.055153436959 -0.1697448194 -0.045197341591 0.071175813675 -0.21905662119 -0.079072311521 0.085256695747 -0.26239314675 -0.12101940811 0.097011998296 -0.29857224226 -0.16989444196 0.10612107068 -0.32660707831 -0.2243642211 0.11233543605 -0.34573292732 -0.28294295073 0.11548557878 -0.35542806983 -0.34403273463 0.11548557878 -0.35542806983 -0.40596726537 0.11233543605 -0.34573292732 -0.46705704927 0.10612107068 -0.32660707831 -0.5256357789 0.097011998296 -0.29857224226 -0.58010554314 0.085256695747 -0.26239314675 -0.62898057699 0.071175813675 -0.21905662119 -0.67092770338 0.055153436959 -0.1697448194 -0.70480263233 0.037626620382 -0.11580283195 -0.72968149185 0.019073447213 -0.058702033013 -0.74488550425 0.036279853433 -0.049934931099 -0.0051145111211 0.071570083499 -0.098507769406 -0.020318534225 0.10490807146 -0.14439357817 -0.045197341591 0.13538444042 -0.18634068966 -0.079072311521 0.16216787696 -0.22320492566 -0.12101940811 0.18452778459 -0.253980726 -0.16989444196 0.20185427368 -0.27782857418 -0.2243642211 0.2136746943 -0.2940979898 -0.28294295073 0.21966663003 -0.30234518647 -0.34403273463 0.21966663003 -0.30234518647 -0.40596726537 0.2136746943 -0.2940979898 -0.46705704927 0.20185427368 -0.27782857418 -0.5256357789 0.18452778459 -0.253980726 -0.58010554314 0.16216787696 -0.22320492566 -0.62898057699 0.13538444042 -0.18634068966 -0.67092770338 0.10490807146 -0.14439357817 -0.70480263233 0.071570083499 -0.098507769406 -0.72968149185 0.036279853433 -0.049934931099 -0.74488550425 0.049934931099 -0.036279853433 -0.0051145111211 0.098507769406 -0.071570083499 -0.020318534225 0.14439357817 -0.10490807146 -0.045197341591 0.18634068966 -0.13538444042 -0.079072311521 0.22320492566 -0.16216787696 -0.12101940811 0.253980726 -0.18452778459 -0.16989444196 0.27782857418 -0.20185427368 -0.2243642211 0.2940979898 -0.2136746943 -0.28294295073 0.30234518647 -0.21966663003 -0.34403273463 0.30234518647 -0.21966663003 -0.40596726537 0.2940979898 -0.2136746943 -0.46705704927 0.27782857418 -0.20185427368 -0.5256357789 0.253980726 -0.18452778459 -0.58010554314 0.22320492566 -0.16216787696 -0.62898057699 0.18634068966 -0.13538444042 -0.67092770338 0.14439357817 -0.10490807146 -0.70480263233 0.098507769406 -0.071570083499 -0.72968149185 0.049934931099 -0.036279853433 -0.74488550425 0.058702033013 -0.019073447213 -0.0051145111211 0.11580283195 -0.037626620382 -0.020318534225 0.1697448194 -0.055153436959 -0.045197341591 0.21905662119 -0.071175813675 -0.079072311521 0.26239314675 -0.085256695747 -0.12101940811 0.29857224226 -0.097011998296 -0.16989444196 0.32660707831 -0.10612107068 -0.2243642211 0.34573292732 -0.11233543605 -0.28294295073 0.35542806983 -0.11548557878 -0.34403273463 0.35542806983 -0.11548557878 -0.40596726537 0.34573292732 -0.11233543605 -0.46705704927 0.32660707831 -0.10612107068 -0.5256357789 0.29857224226 -0.097011998296 -0.58010554314 0.26239314675 -0.085256695747 -0.62898057699 0.21905662119 -0.071175813675 -0.67092770338 0.1697448194 -0.055153436959 -0.70480263233 0.11580283195 -0.037626620382 -0.72968149185 0.058702033013 -0.019073447213 -0.74488550425 0 0 0.75 0 0 0 0.061722971499 0 0.74488550425 0.12176229805 0 0.72968149185 0.17848026752 0 0.70480263233 0.23032976687 0 0.67092770338 0.27589645982 0 0.62898057699 0.31393742561 0 0.58010554314 0.34341499209 0 0.5256357789 0.3635250926 0 0.46705704927 0.37371918559 0 0.40596726537 0.37371918559 0 0.34403273463 0.3635250926 0 0.28294295073 0.34341499209 0 0.2243642211 0.31393742561 0 0.16989444196 0.27589645982 0 0.12101940811 0.23032976687 0 0.079072311521 0.17848026752 0 0.045197341591 0.12176229805 0 0.020318534225 0.061722971499 0 0.0051145111211 0.058702033013 0.019073447213 0.74488550425 0.11580283195 0.037626620382 0.72968149185 0.1697448194 0.055153436959 0.70480263233 0.21905662119 0.071175813675 0.67092770338 0.26239314675 0.085256695747 0.62898057699 0.29857224226 0.097011998296 0.58010554314 0.32660707831 0.10612107068 0.5256357789 0.34573292732 0.11233543605 0.46705704927 0.35542806983 0.11548557878 0.40596726537 0.35542806983 0.11548557878 0.34403273463 0.34573292732 0.11233543605 0.28294295073 0.32660707831 0.10612107068 0.2243642211 0.29857224226 0.097011998296 0.16989444196 0.26239314675 0.085256695747 0.12101940811 0.21905662119 0.071175813675 0.079072311521 0.1697448194 0.055153436959 0.045197341591 0.11580283195 0.037626620382 0.020318534225 0.058702033013 0.019073447213 0.0051145111211 0.049934931099 0.036279853433 0.74488550425 0.098507769406 0.071570083499 0.72968149185 0.14439357817 0.10490807146 0.70480263233 0.18634068966 0.13538444042 0.67092770338 0.22320492566 0.16216787696 0.62898057699 0.253980726 0.18452778459 0.58010554314 0.27782857418 0.20185427368 0.5256357789 0.2940979898 0.2136746943 0.46705704927 0.30234518647 0.21966663003 0.40596726537 0.30234518647 0.21966663003 0.34403273463 0.2940979898 0.2136746943 0.28294295073 0.27782857418 0.20185427368 0.2243642211 0.253980726 0.18452778459 0.16989444196 0.22320492566 0.16216787696 0.12101940811 0.18634068966 0.13538444042 0.079072311521 0.14439357817 0.10490807146 0.045197341591 0.098507769406 0.071570083499 0.020318534225 0.049934931099 0.036279853433 0.0051145111211 0.036279853433 0.049934931099 0.74488550425 0.071570083499 0.098507769406 0.72968149185 0.10490807146 0.14439357817 0.70480263233 0.13538444042 0.18634068966 0.67092770338 0.16216787696 0.22320492566 0.62898057699 0.18452778459 0.253980726 0.58010554314 0.20185427368 0.27782857418 0.5256357789 0.2136746943 0.2940979898 0.46705704927 0.21966663003 0.30234518647 0.40596726537 0.21966663003 0.30234518647 0.34403273463 0.2136746943 0.2940979898 0.28294295073 0.20185427368 0.27782857418 0.2243642211 0.18452778459 0.253980726 0.16989444196 0.16216787696 0.22320492566 0.12101940811 0.13538444042 0.18634068966 0.079072311521 0.10490807146 0.14439357817 0.045197341591 0.071570083499 0.098507769406 0.020318534225 0.036279853433 0.049934931099 0.0051145111211 0.019073447213 0.058702033013 0.74488550425 0.037626620382 0.11580283195 0.72968149185 0.055153436959 0.1697448194 0.70480263233 0.071175813675 0.21905662119 0.67092770338 0.085256695747 0.26239314675 0.62898057699 0.097011998296 0.29857224226 0.58010554314 0.10612107068 0.32660707831 0.5256357789 0.11233543605 0.34573292732 0.46705704927 0.11548557878 0.35542806983 0.40596726537 0.11548557878 0.35542806983 0.34403273463 0.11233543605 0.34573292732 0.28294295073 0.10612107068 0.32660707831 0.2243642211 0.097011998296 0.29857224226 0.16989444196 0.085256695747 0.26239314675 0.12101940811 0.071175813675 0.21905662119 0.079072311521 0.055153436959 0.1697448194 0.045197341591 0.037626620382 0.11580283195 0.020318534225 0.019073447213 0.058702033013 0.0051145111211 3.7794419855e-18 0.061722971499 0.74488550425 7.4557907969e-18 0.12176229805 0.72968149185 1.0928764847e-17 0.17848026752 0.70480263233 1.4103631276e-17 0.23032976687 0.67092770338 1.6893785928e-17 0.27589645982 0.62898057699 1.9223123225e-17 0.31393742561 0.58010554314 2.1028104113e-17 0.34341499209 0.5256357789 2.225949315e-17 0.3635250926 0.46705704927 2.2883700183e-17 0.37371918559 0.40596726537 2.2883700183e-17 0.37371918559 0.34403273463 2.225949315e-17 0.3635250926 0.28294295073 2.1028104113e-17 0.34341499209 0.2243642211 1.9223123225e-17 0.31393742561 0.16989444196 1.6893785928e-17 0.27589645982 0.12101940811 1.4103631276e-17 0.23032976687 0.079072311521 1.0928764847e-17 0.17848026752 0.045197341591 7.4557907969e-18 0.12176229805 0.020318534225 3.7794419855e-18 0.061722971499 0.0051145111211 -0.019073447213 0.058702033013 0.74488550425 -0.037626620382 0.11580283195 0.72968149185 -0.055153436959 0.1697448194 0.70480263233 -0.071175813675 0.21905662119 0.67092770338 -0.085256695747 0.26239314675 0.62898057699 -0.097011998296 0.29857224226 0.58010554314 -0.10612107068 0.32660707831 0.5256357789 -0.11233543605 0.34573292732 0.46705704927 -0.11548557878 0.35542806983 0.40596726537 -0.11548557878 0.35542806983 0.34403273463 -0.11233543605 0.34573292732 0.28294295073 -0.10612107068 0.32660707831 0.2243642211 -0.097011998296 0.29857224226 0.16989444196 -0.085256695747 0.26239314675 0.12101940811 -0.071175813675 0.21905662119 0.079072311521 -0.055153436959 0.1697448194 0.045197341591 -0.037626620382 0.11580283195 0.020318534225 -0.019073447213 0.058702033013 0.0051145111211 -0.036279853433 0.049934931099 0.74488550425 -0.071570083499 0.098507769406 0.72968149185 -0.10490807146 0.14439357817 0.70480263233 -0.13538444042 0.18634068966 0.67092770338 -0.16216787696 0.22320492566 0.62898057699 -0.18452778459 0.253980726 0.58010554314 -0.20185427368 0.27782857418 0.5256357789 -0.2136746943 0.2940979898 0.46705704927 -0.21966663003 0.30234518647 0.40596726537 -0.21966663003 0.30234518647 0.34403273463 -0.2136746943 0.2940979898 0.28294295073 -0.20185427368 0.27782857418 0.2243642211 -0.18452778459 0.253980726 0.16989444196 -0.16216787696 0.22320492566 0.12101940811 -0.13538444042 0.18634068966 0.079072311521 -0.10490807146 0.14439357817 0.045197341591 -0.071570083499 0.098507769406 0.020318534225 -0.036279853433 0.049934931099 0.0051145111211 -0.049934931099 0.036279853433 0.74488550425 -0.098507769406 0.071570083499 0.72968149185 -0.14439357817 0.10490807146 0.70480263233 -0.18634068966 0.13538444042 0.67092770338 -0.22320492566 0.16216787696 0.62898057699 -0.253980726 0.18452778459 0.58010554314 -0.27782857418 0.20185427368 0.5256357789 -0.2940979898 0.2136746943 0.46705704927 -0.30234518647 0.21966663003 0.40596726537 -0.30234518647 0.21966663003 0.34403273463 -0.2940979898 0.2136746943 0.28294295073 -0.27782857418 0.20185427368 0.2243642211 -0.253980726 0.18452778459 0.16989444196 -0.22320492566 0.16216787696 0.12101940811 -0.18634068966 0.13538444042 0.079072311521 -0.14439357817 0.10490807146 0.045197341591 -0.098507769406 0.071570083499 0.020318534225 -0.049934931099 0.036279853433 0.0051145111211 -0.058702033013 0.019073447213 0.74488550425 -0.11580283195 0.037626620382 0.72968149185 -0.1697448194 0.055153436959 0.70480263233 -0.21905662119 0.071175813675 0.67092770338 -0.26239314675 0.085256695747 0.62898057699 -0.29857224226 0.097011998296 0.58010554314 -0.32660707831 0.10612107068 0.5256357789 -0.34573292732 0.11233543605 0.46705704927 -0.35542806983 0.11548557878 0.40596726537 -0.35542806983 0.11548557878 0.34403273463 -0.34573292732 0.11233543605 0.28294295073 -0.32660707831 0.10612107068 0.2243642211 -0.29857224226 0.097011998296 0.16989444196 -0.26239314675 0.085256695747 0.12101940811 -0.21905662119 0.071175813675 0.079072311521 -0.1697448194 0.055153436959 0.045197341591 -0.11580283195 0.037626620382 0.020318534225 -0.058702033013 0.019073447213 0.0051145111211 -0.061722971499 7.558883971e-18 0.74488550425 -0.12176229805 1.4911581594e-17 0.72968149185 -0.17848026752 2.1857529694e-17 0.70480263233 -0.23032976687 2.8207262552e-17 0.67092770338 -0.27589645982 3.3787571857e-17 0.62898057699 -0.31393742561 3.8446246449e-17 0.58010554314 -0.34341499209 4.2056208226e-17 0.5256357789 -0.3635250926 4.4518986299e-17 0.46705704927 -0.37371918559 4.5767400367e-17 0.40596726537 -0.37371918559 4.5767400367e-17 0.34403273463 -0.3635250926 4.4518986299e-17 0.28294295073 -0.34341499209 4.2056208226e-17 0.2243642211 -0.31393742561 3.8446246449e-17 0.16989444196 -0.27589645982 3.3787571857e-17 0.12101940811 -0.23032976687 2.8207262552e-17 0.079072311521 -0.17848026752 2.1857529694e-17 0.045197341591 -0.12176229805 1.4911581594e-17 0.020318534225 -0.061722971499 7.558883971e-18 0.0051145111211 -0.058702033013 -0.019073447213 0.74488550425 -0.11580283195 -0.037626620382 0.72968149185 -0.1697448194 -0.055153436959 0.70480263233 -0.21905662119 -0.071175813675 0.67092770338 -0.26239314675 -0.085256695747 0.62898057699 -0.29857224226 -0.097011998296 0.58010554314 -0.32660707831 -0.10612107068 0.5256357789 -0.34573292732 -0.11233543605 0.46705704927 -0.35542806983 -0.11548557878 0.40596726537 -0.35542806983 -0.11548557878 0.34403273463 -0.34573292732 -0.11233543605 0.28294295073 -0.32660707831 -0.10612107068 0.2243642211 -0.29857224226 -0.097011998296 0.16989444196 -0.26239314675 -0.085256695747 0.12101940811 -0.21905662119 -0.071175813675 0.079072311521 -0.1697448194 -0.055153436959 0.045197341591 -0.11580283195 -0.037626620382 0.020318534225 -0.058702033013 -0.019073447213 0.0051145111211 -0.049934931099 -0.036279853433 0.74488550425 -0.098507769406 -0.071570083499 0.72968149185 -0.14439357817 -0.10490807146 0.70480263233 -0.18634068966 -0.13538444042 0.67092770338 -0.22320492566 -0.16216787696 0.62898057699 -0.253980726 -0.18452778459 0.58010554314 -0.27782857418 -0.20185427368 0.5256357789 -0.2940979898 -0.2136746943 0.46705704927 -0.30234518647 -0.21966663003 0.40596726537 -0.30234518647 -0.21966663003 0.34403273463 -0.2940979898 -0.2136746943 0.28294295073 -0.27782857418 -0.20185427368 0.2243642211 -0.253980726 -0.18452778459 0.16989444196 -0.22320492566 -0.16216787696 0.12101940811 -0.18634068966 -0.13538444042 0.079072311521 -0.14439357817 -0.10490807146 0.045197341591 -0.098507769406 -0.071570083499 0.020318534225 -0.049934931099 -0.036279853433 0.0051145111211 -0.036279853433 -0.049934931099 0.74488550425 -0.071570083499 -0.098507769406 0.72968149185 -0.10490807146 -0.14439357817 0.70480263233 -0.13538444042 -0.18634068966 0.67092770338 -0.16216787696 -0.22320492566 0.62898057699 -0.18452778459 -0.253980726 0.58010554314 -0.20185427368 -0.27782857418 0.5256357789 -0.2136746943 -0.2940979898 0.46705704927 -0.21966663003 -0.30234518647 0.40596726537 -0.21966663003 -0.30234518647 0.34403273463 -0.2136746943 -0.2940979898 0.28294295073 -0.20185427368 -0.27782857418 0.2243642211 -0.18452778459 -0.253980726 0.16989444196 -0.16216787696 -0.22320492566 0.12101940811 -0.13538444042 -0.18634068966 0.079072311521 -0.10490807146 -0.14439357817 0.045197341591 -0.071570083499 -0.098507769406 0.020318534225 -0.036279853433 -0.049934931099 0.0051145111211 -0.019073447213 -0.058702033013 0.74488550425 -0.037626620382 -0.11580283195 0.72968149185 -0.055153436959 -0.1697448194 0.70480263233 -0.071175813675 -0.21905662119 0.67092770338 -0.085256695747 -0.26239314675 0.62898057699 -0.097011998296 -0.29857224226 0.58010554314 -0.10612107068 -0.32660707831 0.5256357789 -0.11233543605 -0.34573292732 0.46705704927 -0.11548557878 -0.35542806983 0.40596726537 -0.11548557878 -0.35542806983 0.34403273463 -0.11233543605 -0.34573292732 0.28294295073 -0.10612107068 -0.32660707831 0.2243642211 -0.097011998296 -0.29857224226 0.16989444196 -0.085256695747 -0.26239314675 0.12101940811 -0.071175813675 -0.21905662119 0.079072311521 -0.055153436959 -0.1697448194 0.045197341591 -0.037626620382 -0.11580283195 0.020318534225 -0.019073447213 -0.058702033013 0.0051145111211 -1.1338325956e-17 -0.061722971499 0.74488550425 -2.2367372391e-17 -0.12176229805 0.72968149185 -3.2786292887e-17 -0.17848026752 0.70480263233 -4.231089052e-17 -0.23032976687 0.67092770338 -5.068135944e-17 -0.27589645982 0.62898057699 -5.7669371329e-17 -0.31393742561 0.58010554314 -6.3084313994e-17 -0.34341499209 0.5256357789 -6.677847614e-17 -0.3635250926 0.46705704927 -6.865110055e-17 -0.37371918559 0.40596726537 -6.865110055e-17 -0.37371918559 0.34403273463 -6.677847614e-17 -0.3635250926 0.28294295073 -6.3084313994e-17 -0.34341499209 0.2243642211 -5.7669371329e-17 -0.31393742561 0.16989444196 -5.068135944e-17 -0.27589645982 0.12101940811 -4.231089052e-17 -0.23032976687 0.079072311521 -3.2786292887e-17 -0.17848026752 0.045197341591 -2.2367372391e-17 -0.12176229805 0.020318534225 -1.1338325956e-17 -0.061722971499 0.0051145111211 0.019073447213 -0.058702033013 0.74488550425 0.037626620382 -0.11580283195 0.72968149185 0.055153436959 -0.1697448194 0.70480263233 0.071175813675 -0.21905662119 0.67092770338 0.085256695747 -0.26239314675 0.62898057699 0.097011998296 -0.29857224226 0.58010554314 0.10612107068 -0.32660707831 0.5256357789 0.11233543605 -0.34573292732 0.46705704927 0.11548557878 -0.35542806983 0.40596726537 0.11548557878 -0.35542806983 0.34403273463 0.11233543605 -0.34573292732 0.28294295073 0.10612107068 -0.32660707831 0.2243642211 0.097011998296 -0.29857224226 0.16989444196 0.085256695747 -0.26239314675 0.12101940811 0.071175813675 -0.21905662119 0.079072311521 0.055153436959 -0.1697448194 0.045197341591 0.037626620382 -0.11580283195 0.020318534225 0.019073447213 -0.058702033013 0.0051145111211 0.036279853433 -0.049934931099 0.74488550425 0.071570083499 -0.098507769406 0.72968149185 0.10490807146 -0.14439357817 0.70480263233 0.13538444042 -0.18634068966 0.67092770338 0.16216787696 -0.22320492566 0.62898057699 0.18452778459 -0.253980726 0.58010554314 0.20185427368 -0.27782857418 0.5256357789 0.2136746943 -0.2940979898 0.46705704927 0.21966663003 -0.30234518647 0.40596726537 0.21966663003 -0.30234518647 0.34403273463 0.2136746943 -0.2940979898 0.28294295073 0.20185427368 -0.27782857418 0.2243642211 0.18452778459 -0.253980726 0.16989444196 0.16216787696 -0.22320492566 0.12101940811 0.13538444042 -0.18634068966 0.079072311521 0.10490807146 -0.14439357817 0.045197341591 0.071570083499 -0.098507769406 0.020318534225 0.036279853433 -0.049934931099 0.0051145111211 0.049934931099 -0.036279853433 0.74488550425 0.098507769406 -0.071570083499 0.72968149185 0.14439357817 -0.10490807146 0.70480263233 0.18634068966 -0.13538444042 0.67092770338 0.22320492566 -0.16216787696 0.62898057699 0.253980726 -0.18452778459 0.58010554314 0.27782857418 -0.20185427368 0.5256357789 0.2940979898 -0.2136746943 0.46705704927 0.30234518647 -0.21966663003 0.40596726537 0.30234518647 -0.21966663003 0.34403273463 0.2940979898 -0.2136746943 0.28294295073 0.27782857418 -0.20185427368 0.2243642211 0.253980726 -0.18452778459 0.16989444196 0.22320492566 -0.16216787696 0.12101940811 0.18634068966 -0.13538444042 0.079072311521 0.14439357817 -0.10490807146 0.045197341591 0.098507769406 -0.071570083499 0.020318534225 0.049934931099 -0.036279853433 0.0051145111211 0.058702033013 -0.019073447213 0.74488550425 0.11580283195 -0.037626620382 0.72968149185 0.1697448194 -0.055153436959 0.70480263233 0.21905662119 -0.071175813675 0.67092770338 0.26239314675 -0.085256695747 0.62898057699 0.29857224226 -0.097011998296 0.58010554314 0.32660707831 -0.10612107068 0.5256357789 0.34573292732 -0.11233543605 0.46705704927 0.35542806983 -0.11548557878 0.40596726537 0.35542806983 -0.11548557878 0.34403273463 0.34573292732 -0.11233543605 0.28294295073 0.32660707831 -0.10612107068 0.2243642211 0.29857224226 -0.097011998296 0.16989444196 0.26239314675 -0.085256695747 0.12101940811 0.21905662119 -0.071175813675 0.079072311521 0.1697448194 -0.055153436959 0.045197341591 0.11580283195 -0.037626620382 0.020318534225 0.058702033013 -0.019073447213 0.0051145111211 POLYGONS 2601 7880 OFFSETS vtktypeint64 0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267 270 273 276 279 282 285 288 291 294 297 300 303 306 309 312 315 318 321 324 327 330 333 336 339 342 345 348 351 354 357 360 363 366 369 372 375 378 381 384 387 390 393 396 399 402 405 408 411 414 417 420 423 426 429 432 435 438 441 444 447 450 453 456 459 462 465 468 471 474 477 480 483 486 489 492 495 498 501 504 507 510 513 516 519 522 525 528 531 534 537 540 543 546 549 552 555 558 561 564 567 570 573 576 579 582 585 588 591 594 597 600 603 606 609 612 615 618 621 624 627 630 633 636 639 642 645 648 651 654 657 660 663 666 669 672 675 678 681 684 687 690 693 696 699 702 705 708 711 714 717 720 723 726 729 732 735 738 741 744 747 750 753 756 759 762 765 768 771 774 777 780 783 786 789 792 795 798 801 804 807 810 813 816 819 822 825 828 831 834 837 840 843 846 849 852 855 858 861 864 867 870 873 876 879 882 885 888 891 894 897 900 903 906 909 912 915 918 921 924 927 930 933 936 939 942 945 948 951 954 957 960 963 966 969 972 975 978 981 984 987 990 993 996 999 1002 1005 1008 1011 1014 1017 1020 1023 1026 1029 1032 1035 1038 1041 1044 1047 1050 1053 1056 1059 1062 1065 1068 1071 1074 1077 1080 1083 1086 1089 1092 1095 1098 1101 1104 1107 1110 1113 1116 1119 1122 1125 1128 1131 1134 1137 1140 1143 1146 1149 1152 1155 1158 1161 1164 1167 1170 1173 1176 1179 1182 1185 1188 1191 1194 1197 1200 1203 1206 1209 1212 1215 1218 1221 1224 1227 1230 1233 1236 1239 1242 1245 1248 1251 1254 1257 1260 1263 1266 1269 1272 1275 1278 1281 1284 1287 1290 1293 1296 1299 1302 1305 1308 1311 1314 1317 1320 1323 1326 1329 1332 1335 1338 1341 1344 1347 1350 1353 1356 1359 1362 1365 1368 1371 1374 1377 1380 1383 1386 1389 1392 1395 1398 1401 1404 1407 1410 1413 1416 1419 1422 1425 1428 1431 1434 1437 1440 1443 1446 1449 1452 1455 1458 1461 1464 1467 1470 1473 1476 1479 1482 1485 1488 1491 1494 1497 1500 1503 1506 1509 1512 1515 1518 1521 1524 1527 1530 1533 1536 1539 1542 1545 1548 1551 1554 1557 1560 1563 1566 1569 1572 1575 1578 1581 1584 1587 1590 1593 1596 1599 1602 1605 1608 1611 1614 1617 1620 1624 1628 1632 1636 1640 1644 1648 1652 1656 1660 1664 1668 1672 1676 1680 1684 1688 1692 1696 1700 1704 1708 1712 1716 1720 1724 1728 1732 1736 1740 1744 1748 1752 1756 1760 1764 1768 1772 1776 1780 1783 1786 1789 1792 1795 1798 1801 1804 1807 1810 1813 1816 1819 1822 1825 1828 1831 1834 1837 1840 1843 1846 1849 1852 1855 1858 1861 1864 1867 1870 1873 1876 1879 1882 1885 1888 1891 1894 1897 1900 1903 1906 1909 1912 1915 1918 1921 1924 1927 1930 1933 1936 1939 1942 1945 1948 1951 1954 1957 1960 1963 1966 1969 1972 1975 1978 1981 1984 1987 1990 1993 1996 1999 2002 2005 2008 2011 2014 2017 2020 2023 2026 2029 2032 2035 2038 2041 2044 2047 2050 2053 2056 2059 2062 2065 2068 2071 2074 2077 2080 2083 2086 2089 2092 2095 2098 2101 2104 2107 2110 2113 2116 2119 2122 2125 2128 2131 2134 2137 2140 2143 2146 2149 2152 2155 2158 2161 2164 2167 2170 2173 2176 2179 2182 2185 2188 2191 2194 2197 2200 2203 2206 2209 2212 2215 2218 2221 2224 2227 2230 2233 2236 2239 2242 2245 2248 2251 2254 2257 2260 2263 2266 2269 2272 2275 2278 2281 2284 2287 2290 2293 2296 2299 2302 2305 2308 2311 2314 2317 2320 2323 2326 2329 2332 2335 2338 2341 2344 2347 2350 2353 2356 2359 2362 2365 2368 2371 2374 2377 2380 2383 2386 2389 2392 2395 2398 2401 2404 2407 2410 2413 2416 2419 2422 2425 2428 2431 2434 2437 2440 2443 2446 2449 2452 2455 2458 2461 2464 2467 2470 2473 2476 2479 2482 2485 2488 2491 2494 2497 2500 2503 2506 2509 2512 2515 2518 2521 2524 2527 2530 2533 2536 2539 2542 2545 2548 2551 2554 2557 2560 2563 2566 2569 2572 2575 2578 2581 2584 2587 2590 2593 2596 2599 2602 2605 2608 2611 2614 2617 2620 2623 2626 2629 2632 2635 2638 2641 2644 2647 2650 2653 2656 2659 2662 2665 2668 2671 2674 2677 2680 2683 2686 2689 2692 2695 2698 2701 2704 2707 2710 2713 2716 2719 2722 2725 2728 2731 2734 2737 2740 2743 2746 2749 2752 2755 2758 2761 2764 2767 2770 2773 2776 2779 2782 2785 2788 2791 2794 2797 2800 2803 2806 2809 2812 2815 2818 2821 2824 2827 2830 2833 2836 2839 2842 2845 2848 2851 2854 2857 2860 2863 2866 2869 2872 2875 2878 2881 2884 2887 2890 2893 2896 2899 2902 2905 2908 2911 2914 2917 2920 2923 2926 2929 2932 2935 2938 2941 2944 2947 2950 2953 2956 2959 2962 2965 2968 2971 2974 2977 2980 2983 2986 2989 2992 2995 2998 3001 3004 3007 3010 3013 3016 3019 3022 3025 3028 3031 3034 3037 3040 3043 3046 3049 3052 3055 3058 3061 3064 3067 3070 3073 3076 3079 3082 3085 3088 3091 3094 3097 3100 3103 3106 3109 3112 3115 3118 3121 3124 3127 3130 3133 3136 3139 3142 3145 3148 3151 3154 3157 3160 3163 3166 3169 3172 3175 3178 3181 3184 3187 3190 3193 3196 3199 3202 3205 3208 3211 3214 3217 3220 3223 3226 3229 3232 3235 3238 3241 3244 3247 3250 3253 3256 3259 3262 3265 3268 3271 3274 3277 3280 3283 3286 3289 3292 3295 3298 3301 3304 3307 3310 3313 3316 3319 3322 3325 3328 3331 3334 3337 3340 3343 3346 3349 3352 3355 3358 3361 3364 3367 3370 3373 3376 3379 3382 3385 3388 3391 3394 3397 3400 3404 3408 3412 3416 3420 3424 3428 3432 3436 3440 3444 3448 3452 3456 3460 3464 3468 3472 3476 3480 3484 3488 3492 3496 3500 3504 3508 3512 3516 3520 3524 3528 3532 3536 3540 3544 3548 3552 3556 3560 3563 3566 3569 3572 3575 3578 3581 3584 3587 3590 3593 3596 3599 3602 3605 3608 3611 3614 3617 3620 3623 3626 3629 3632 3635 3638 3641 3644 3647 3650 3653 3656 3659 3662 3665 3668 3671 3674 3677 3680 3683 3686 3689 3692 3695 3698 3701 3704 3707 3710 3713 3716 3719 3722 3725 3728 3731 3734 3737 3740 3743 3746 3749 3752 3755 3758 3761 3764 3767 3770 3773 3776 3779 3782 3785 3788 3791 3794 3797 3800 3803 3806 3809 3812 3815 3818 3821 3824 3827 3830 3833 3836 3839 3842 3845 3848 3851 3854 3857 3860 3863 3866 3869 3872 3875 3878 3881 3884 3887 3890 3893 3896 3899 3902 3905 3908 3911 3914 3917 3920 3923 3926 3929 3932 3935 3938 3941 3944 3947 3950 3953 3956 3959 3962 3965 3968 3971 3974 3977 3980 3983 3986 3989 3992 3995 3998 4001 4004 4007 4010 4013 4016 4019 4022 4025 4028 4031 4034 4037 4040 4043 4046 4049 4052 4055 4058 4061 4064 4067 4070 4073 4076 4079 4082 4085 4088 4091 4094 4097 4100 4103 4106 4109 4112 4115 4118 4121 4124 4127 4130 4133 4136 4139 4142 4145 4148 4151 4154 4157 4160 4163 4166 4169 4172 4175 4178 4181 4184 4187 4190 4193 4196 4199 4202 4205 4208 4211 4214 4217 4220 4223 4226 4229 4232 4235 4238 4241 4244 4247 4250 4253 4256 4259 4262 4265 4268 4271 4274 4277 4280 4283 4286 4289 4292 4295 4298 4301 4304 4307 4310 4313 4316 4319 4322 4325 4328 4331 4334 4337 4340 4343 4346 4349 4352 4355 4358 4361 4364 4367 4370 4373 4376 4379 4382 4385 4388 4391 4394 4397 4400 4403 4406 4409 4412 4415 4418 4421 4424 4427 4430 4433 4436 4439 4442 4445 4448 4451 4454 4457 4460 4463 4466 4469 4472 4475 4478 4481 4484 4487 4490 4493 4496 4499 4502 4505 4508 4511 4514 4517 4520 4523 4526 4529 4532 4535 4538 4541 4544 4547 4550 4553 4556 4559 4562 4565 4568 4571 4574 4577 4580 4583 4586 4589 4592 4595 4598 4601 4604 4607 4610 4613 4616 4619 4622 4625 4628 4631 4634 4637 4640 4643 4646 4649 4652 4655 4658 4661 4664 4667 4670 4673 4676 4679 4682 4685 4688 4691 4694 4697 4700 4703 4706 4709 4712 4715 4718 4721 4724 4727 4730 4733 4736 4739 4742 4745 4748 4751 4754 4757 4760 4763 4766 4769 4772 4775 4778 4781 4784 4787 4790 4793 4796 4799 4802 4805 4808 4811 4814 4817 4820 4823 4826 4829 4832 4835 4838 4841 4844 4847 4850 4853 4856 4859 4862 4865 4868 4871 4874 4877 4880 4883 4886 4889 4892 4895 4898 4901 4904 4907 4910 4913 4916 4919 4922 4925 4928 4931 4934 4937 4940 4943 4946 4949 4952 4955 4958 4961 4964 4967 4970 4973 4976 4979 4982 4985 4988 4991 4994 4997 5000 5003 5006 5009 5012 5015 5018 5021 5024 5027 5030 5033 5036 5039 5042 5045 5048 5051 5054 5057 5060 5063 5066 5069 5072 5075 5078 5081 5084 5087 5090 5093 5096 5099 5102 5105 5108 5111 5114 5117 5120 5123 5126 5129 5132 5135 5138 5141 5144 5147 5150 5153 5156 5159 5162 5165 5168 5171 5174 5177 5180 5183 5186 5189 5192 5195 5198 5201 5204 5207 5210 5213 5216 5219 5222 5225 5228 5231 5234 5237 5240 5243 5246 5249 5252 5255 5258 5261 5264 5267 5270 5273 5276 5279 5282 5285 5288 5291 5294 5297 5300 5303 5306 5309 5312 5315 5318 5321 5324 5327 5330 5333 5336 5339 5342 5345 5348 5351 5354 5357 5360 5363 5366 5369 5372 5375 5378 5381 5384 5387 5390 5393 5396 5399 5402 5405 5408 5411 5414 5417 5420 5423 5426 5429 5432 5435 5438 5441 5444 5447 5450 5453 5456 5459 5462 5465 5468 5471 5474 5477 5480 5483 5486 5489 5492 5495 5498 5501 5504 5507 5510 5513 5516 5519 5522 5525 5528 5531 5534 5537 5540 5543 5546 5549 5552 5555 5558 5561 5564 5567 5570 5573 5576 5579 5582 5585 5588 5591 5594 5597 5600 5603 5606 5609 5612 5615 5618 5621 5624 5627 5630 5633 5636 5639 5642 5645 5648 5651 5654 5657 5660 5663 5666 5669 5672 5675 5678 5681 5684 5687 5690 5693 5696 5699 5702 5705 5708 5711 5714 5717 5720 5723 5726 5729 5732 5735 5738 5741 5744 5747 5750 5753 5756 5759 5762 5765 5768 5771 5774 5777 5780 5783 5786 5789 5792 5795 5798 5801 5804 5807 5810 5813 5816 5819 5822 5825 5828 5831 5834 5837 5840 5843 5846 5849 5852 5855 5858 5861 5864 5867 5870 5873 5876 5879 5882 5885 5888 5891 5894 5897 5900 5903 5906 5909 5912 5915 5918 5921 5924 5927 5930 5933 5936 5939 5942 5945 5948 5951 5954 5957 5960 5963 5966 5969 5972 5975 5978 5981 5984 5987 5990 5993 5996 5999 6002 6005 6008 6011 6014 6017 6020 6023 6026 6029 6032 6035 6038 6041 6044 6047 6050 6053 6056 6059 6062 6065 6068 6071 6074 6077 6080 6083 6086 6089 6092 6095 6098 6101 6104 6107 6110 6113 6116 6119 6122 6125 6128 6131 6134 6137 6140 6143 6146 6149 6152 6155 6158 6161 6164 6167 6170 6173 6176 6179 6182 6185 6188 6191 6194 6197 6200 6203 6206 6209 6212 6215 6218 6221 6224 6227 6230 6233 6236 6239 6242 6245 6248 6251 6254 6257 6260 6263 6266 6269 6272 6275 6278 6281 6284 6287 6290 6293 6296 6299 6302 6305 6308 6311 6314 6317 6320 6323 6326 6329 6332 6335 6338 6341 6344 6347 6350 6353 6356 6359 6362 6365 6368 6371 6374 6377 6380 6383 6386 6389 6392 6395 6398 6401 6404 6407 6410 6413 6416 6419 6422 6425 6428 6431 6434 6437 6440 6443 6446 6449 6452 6455 6458 6461 6464 6467 6470 6473 6476 6479 6482 6485 6488 6491 6494 6497 6500 6503 6506 6509 6512 6515 6518 6521 6524 6527 6530 6533 6536 6539 6542 6545 6548 6551 6554 6557 6560 6563 6566 6569 6572 6575 6578 6581 6584 6587 6590 6593 6596 6599 6602 6605 6608 6611 6614 6617 6620 6623 6626 6629 6632 6635 6638 6641 6644 6647 6650 6653 6656 6659 6662 6665 6668 6671 6674 6677 6680 6683 6686 6689 6692 6695 6698 6701 6704 6707 6710 6713 6716 6719 6722 6725 6728 6731 6734 6737 6740 6743 6746 6749 6752 6755 6758 6761 6764 6767 6770 6773 6776 6779 6782 6785 6788 6791 6794 6797 6800 6803 6806 6809 6812 6815 6818 6821 6824 6827 6830 6833 6836 6839 6842 6845 6848 6851 6854 6857 6860 6863 6866 6869 6872 6875 6878 6881 6884 6887 6890 6893 6896 6899 6902 6905 6908 6911 6914 6917 6920 6923 6926 6929 6932 6935 6938 6941 6944 6947 6950 6953 6956 6959 6962 6965 6968 6971 6974 6977 6980 6983 6986 6989 6992 6995 6998 7001 7004 7007 7010 7013 7016 7019 7022 7025 7028 7031 7034 7037 7040 7043 7046 7049 7052 7055 7058 7061 7064 7067 7070 7073 7076 7079 7082 7085 7088 7091 7094 7097 7100 7103 7106 7109 7112 7115 7118 7121 7124 7127 7130 7133 7136 7139 7142 7145 7148 7151 7154 7157 7160 7163 7166 7169 7172 7175 7178 7181 7184 7187 7190 7193 7196 7199 7202 7205 7208 7211 7214 7217 7220 7223 7226 7229 7232 7235 7238 7241 7244 7247 7250 7253 7256 7259 7262 7265 7268 7271 7274 7277 7280 7283 7286 7289 7292 7295 7298 7301 7304 7307 7310 7313 7316 7319 7322 7325 7328 7331 7334 7337 7340 7343 7346 7349 7352 7355 7358 7361 7364 7367 7370 7373 7376 7379 7382 7385 7388 7391 7394 7397 7400 7403 7406 7409 7412 7415 7418 7421 7424 7427 7430 7433 7436 7439 7442 7445 7448 7451 7454 7457 7460 7463 7466 7469 7472 7475 7478 7481 7484 7487 7490 7493 7496 7499 7502 7505 7508 7511 7514 7517 7520 7523 7526 7529 7532 7535 7538 7541 7544 7547 7550 7553 7556 7559 7562 7565 7568 7571 7574 7577 7580 7583 7586 7589 7592 7595 7598 7601 7604 7607 7610 7613 7616 7619 7622 7625 7628 7631 7634 7637 7640 7643 7646 7649 7652 7655 7658 7661 7664 7667 7670 7673 7676 7679 7682 7685 7688 7691 7694 7697 7700 7703 7706 7709 7712 7715 7718 7721 7724 7727 7730 7733 7736 7739 7742 7745 7748 7751 7754 7757 7760 7763 7766 7769 7772 7775 7778 7781 7784 7787 7790 7793 7796 7799 7802 7805 7808 7811 7814 7817 7820 7823 7826 7829 7832 7835 7838 7841 7844 7847 7850 7853 7856 7859 7862 7865 7868 7871 7874 7877 7880 CONNECTIVITY vtktypeint64 0 1 2 2 1 3 3 1 4 4 1 5 5 1 6 6 1 7 7 1 8 8 1 9 9 1 10 10 1 11 11 1 12 12 1 13 13 1 14 14 1 15 15 1 16 16 1 17 17 1 18 18 1 19 19 1 20 20 1 0 21 22 23 21 23 24 22 25 26 22 26 23 25 27 28 25 28 26 27 29 30 27 30 28 29 31 32 29 32 30 31 33 34 31 34 32 33 35 36 33 36 34 35 37 38 35 38 36 37 39 40 37 40 38 39 41 42 39 42 40 41 43 44 41 44 42 43 45 46 43 46 44 45 0 2 45 2 46 24 23 47 24 47 48 23 26 49 23 49 47 26 28 50 26 50 49 28 30 51 28 51 50 30 32 52 30 52 51 32 34 53 32 53 52 34 36 54 34 54 53 36 38 55 36 55 54 38 40 56 38 56 55 40 42 57 40 57 56 42 44 58 42 58 57 44 46 59 44 59 58 46 2 3 46 3 59 48 47 60 48 60 61 47 49 62 47 62 60 49 50 63 49 63 62 50 51 64 50 64 63 51 52 65 51 65 64 52 53 66 52 66 65 53 54 67 53 67 66 54 55 68 54 68 67 55 56 69 55 69 68 56 57 70 56 70 69 57 58 71 57 71 70 58 59 72 58 72 71 59 3 4 59 4 72 61 60 73 61 73 74 60 62 75 60 75 73 62 63 76 62 76 75 63 64 77 63 77 76 64 65 78 64 78 77 65 66 79 65 79 78 66 67 80 66 80 79 67 68 81 67 81 80 68 69 82 68 82 81 69 70 83 69 83 82 70 71 84 70 84 83 71 72 85 71 85 84 72 4 5 72 5 85 74 73 86 74 86 87 73 75 88 73 88 86 75 76 89 75 89 88 76 77 90 76 90 89 77 78 91 77 91 90 78 79 92 78 92 91 79 80 93 79 93 92 80 81 94 80 94 93 81 82 95 81 95 94 82 83 96 82 96 95 83 84 97 83 97 96 84 85 98 84 98 97 85 5 6 85 6 98 87 86 99 87 99 100 86 88 101 86 101 99 88 89 102 88 102 101 89 90 103 89 103 102 90 91 104 90 104 103 91 92 105 91 105 104 92 93 106 92 106 105 93 94 107 93 107 106 94 95 108 94 108 107 95 96 109 95 109 108 96 97 110 96 110 109 97 98 111 97 111 110 98 6 7 98 7 111 100 99 112 100 112 113 99 101 114 99 114 112 101 102 115 101 115 114 102 103 116 102 116 115 103 104 117 103 117 116 104 105 118 104 118 117 105 106 119 105 119 118 106 107 120 106 120 119 107 108 121 107 121 120 108 109 122 108 122 121 109 110 123 109 123 122 110 111 124 110 124 123 111 7 8 111 8 124 113 112 125 113 125 126 112 114 127 112 127 125 114 115 128 114 128 127 115 116 129 115 129 128 116 117 130 116 130 129 117 118 131 117 131 130 118 119 132 118 132 131 119 120 133 119 133 132 120 121 134 120 134 133 121 122 135 121 135 134 122 123 136 122 136 135 123 124 137 123 137 136 124 8 9 124 9 137 126 125 138 126 138 139 125 127 140 125 140 138 127 128 141 127 141 140 128 129 142 128 142 141 129 130 143 129 143 142 130 131 144 130 144 143 131 132 145 131 145 144 132 133 146 132 146 145 133 134 147 133 147 146 134 135 148 134 148 147 135 136 149 135 149 148 136 137 150 136 150 149 137 9 10 137 10 150 139 138 151 139 151 152 138 140 153 138 153 151 140 141 154 140 154 153 141 142 155 141 155 154 142 143 156 142 156 155 143 144 157 143 157 156 144 145 158 144 158 157 145 146 159 145 159 158 146 147 160 146 160 159 147 148 161 147 161 160 148 149 162 148 162 161 149 150 163 149 163 162 150 10 11 150 11 163 152 151 164 152 164 165 151 153 166 151 166 164 153 154 167 153 167 166 154 155 168 154 168 167 155 156 169 155 169 168 156 157 170 156 170 169 157 158 171 157 171 170 158 159 172 158 172 171 159 160 173 159 173 172 160 161 174 160 174 173 161 162 175 161 175 174 162 163 176 162 176 175 163 11 12 163 12 176 165 164 177 165 177 178 164 166 179 164 179 177 166 167 180 166 180 179 167 168 181 167 181 180 168 169 182 168 182 181 169 170 183 169 183 182 170 171 184 170 184 183 171 172 185 171 185 184 172 173 186 172 186 185 173 174 187 173 187 186 174 175 188 174 188 187 175 176 189 175 189 188 176 12 13 176 13 189 178 177 190 178 190 191 177 179 192 177 192 190 179 180 193 179 193 192 180 181 194 180 194 193 181 182 195 181 195 194 182 183 196 182 196 195 183 184 197 183 197 196 184 185 198 184 198 197 185 186 199 185 199 198 186 187 200 186 200 199 187 188 201 187 201 200 188 189 202 188 202 201 189 13 14 189 14 202 191 190 203 191 203 204 190 192 205 190 205 203 192 193 206 192 206 205 193 194 207 193 207 206 194 195 208 194 208 207 195 196 209 195 209 208 196 197 210 196 210 209 197 198 211 197 211 210 198 199 212 198 212 211 199 200 213 199 213 212 200 201 214 200 214 213 201 202 215 201 215 214 202 14 15 202 15 215 204 203 216 204 216 217 203 205 218 203 218 216 205 206 219 205 219 218 206 207 220 206 220 219 207 208 221 207 221 220 208 209 222 208 222 221 209 210 223 209 223 222 210 211 224 210 224 223 211 212 225 211 225 224 212 213 226 212 226 225 213 214 227 213 227 226 214 215 228 214 228 227 215 15 16 215 16 228 217 216 229 217 229 230 216 218 231 216 231 229 218 219 232 218 232 231 219 220 233 219 233 232 220 221 234 220 234 233 221 222 235 221 235 234 222 223 236 222 236 235 223 224 237 223 237 236 224 225 238 224 238 237 225 226 239 225 239 238 226 227 240 226 240 239 227 228 241 227 241 240 228 16 17 228 17 241 230 229 242 230 242 243 229 231 244 229 244 242 231 232 245 231 245 244 232 233 246 232 246 245 233 234 247 233 247 246 234 235 248 234 248 247 235 236 249 235 249 248 236 237 250 236 250 249 237 238 251 237 251 250 238 239 252 238 252 251 239 240 253 239 253 252 240 241 254 240 254 253 241 17 18 241 18 254 243 242 255 243 255 256 242 244 257 242 257 255 244 245 258 244 258 257 245 246 259 245 259 258 246 247 260 246 260 259 247 248 261 247 261 260 248 249 262 248 262 261 249 250 263 249 263 262 250 251 264 250 264 263 251 252 265 251 265 264 252 253 266 252 266 265 253 254 267 253 267 266 254 18 19 254 19 267 256 255 268 256 268 269 255 257 270 255 270 268 257 258 271 257 271 270 258 259 272 258 272 271 259 260 273 259 273 272 260 261 274 260 274 273 261 262 275 261 275 274 262 263 276 262 276 275 263 264 277 263 277 276 264 265 278 264 278 277 265 266 279 265 279 278 266 267 280 266 280 279 267 19 20 267 20 280 269 268 22 269 22 21 268 270 25 268 25 22 270 271 27 270 27 25 271 272 29 271 29 27 272 273 31 272 31 29 273 274 33 273 33 31 274 275 35 274 35 33 275 276 37 275 37 35 276 277 39 276 39 37 277 278 41 277 41 39 278 279 43 278 43 41 279 280 45 279 45 43 280 20 0 280 0 45 21 24 281 282 24 283 284 281 24 48 285 283 48 286 287 285 48 61 288 286 61 289 290 288 61 74 291 289 74 292 293 291 74 87 294 292 87 295 296 294 87 100 297 295 100 298 299 297 100 113 300 298 113 301 302 300 113 126 303 301 126 304 305 303 126 139 306 304 139 307 308 306 139 152 309 307 152 310 311 309 152 165 312 310 165 313 314 312 165 178 315 313 178 316 317 315 178 191 318 316 191 319 320 318 191 204 321 319 204 322 323 321 204 217 324 322 217 325 326 324 217 230 327 325 230 328 329 327 230 243 330 328 243 331 332 330 243 256 333 331 256 334 335 333 256 269 336 334 269 337 338 336 269 21 339 337 21 282 340 339 341 342 343 342 344 343 344 345 343 345 346 343 346 347 343 347 348 343 348 349 343 349 350 343 350 351 343 351 352 343 352 353 343 353 354 343 354 355 343 355 356 343 356 357 343 357 358 343 358 359 343 359 360 343 360 361 343 361 341 343 341 362 363 341 363 342 362 364 365 362 365 363 364 366 367 364 367 365 366 368 369 366 369 367 368 370 371 368 371 369 370 372 373 370 373 371 372 374 375 372 375 373 374 376 377 374 377 375 376 378 379 376 379 377 378 380 381 378 381 379 380 382 383 380 383 381 382 384 385 382 385 383 384 386 387 384 387 385 342 363 388 342 388 344 363 365 389 363 389 388 365 367 390 365 390 389 367 369 391 367 391 390 369 371 392 369 392 391 371 373 393 371 393 392 373 375 394 373 394 393 375 377 395 375 395 394 377 379 396 377 396 395 379 381 397 379 397 396 381 383 398 381 398 397 383 385 399 383 399 398 385 387 400 385 400 399 344 388 401 344 401 345 388 389 402 388 402 401 389 390 403 389 403 402 390 391 404 390 404 403 391 392 405 391 405 404 392 393 406 392 406 405 393 394 407 393 407 406 394 395 408 394 408 407 395 396 409 395 409 408 396 397 410 396 410 409 397 398 411 397 411 410 398 399 412 398 412 411 399 400 413 399 413 412 345 401 414 345 414 346 401 402 415 401 415 414 402 403 416 402 416 415 403 404 417 403 417 416 404 405 418 404 418 417 405 406 419 405 419 418 406 407 420 406 420 419 407 408 421 407 421 420 408 409 422 408 422 421 409 410 423 409 423 422 410 411 424 410 424 423 411 412 425 411 425 424 412 413 426 412 426 425 346 414 427 346 427 347 414 415 428 414 428 427 415 416 429 415 429 428 416 417 430 416 430 429 417 418 431 417 431 430 418 419 432 418 432 431 419 420 433 419 433 432 420 421 434 420 434 433 421 422 435 421 435 434 422 423 436 422 436 435 423 424 437 423 437 436 424 425 438 424 438 437 425 426 439 425 439 438 347 427 440 347 440 348 427 428 441 427 441 440 428 429 442 428 442 441 429 430 443 429 443 442 430 431 444 430 444 443 431 432 445 431 445 444 432 433 446 432 446 445 433 434 447 433 447 446 434 435 448 434 448 447 435 436 449 435 449 448 436 437 450 436 450 449 437 438 451 437 451 450 438 439 452 438 452 451 348 440 453 348 453 349 440 441 454 440 454 453 441 442 455 441 455 454 442 443 456 442 456 455 443 444 457 443 457 456 444 445 458 444 458 457 445 446 459 445 459 458 446 447 460 446 460 459 447 448 461 447 461 460 448 449 462 448 462 461 449 450 463 449 463 462 450 451 464 450 464 463 451 452 465 451 465 464 349 453 466 349 466 350 453 454 467 453 467 466 454 455 468 454 468 467 455 456 469 455 469 468 456 457 470 456 470 469 457 458 471 457 471 470 458 459 472 458 472 471 459 460 473 459 473 472 460 461 474 460 474 473 461 462 475 461 475 474 462 463 476 462 476 475 463 464 477 463 477 476 464 465 478 464 478 477 350 466 479 350 479 351 466 467 480 466 480 479 467 468 481 467 481 480 468 469 482 468 482 481 469 470 483 469 483 482 470 471 484 470 484 483 471 472 485 471 485 484 472 473 486 472 486 485 473 474 487 473 487 486 474 475 488 474 488 487 475 476 489 475 489 488 476 477 490 476 490 489 477 478 491 477 491 490 351 479 492 351 492 352 479 480 493 479 493 492 480 481 494 480 494 493 481 482 495 481 495 494 482 483 496 482 496 495 483 484 497 483 497 496 484 485 498 484 498 497 485 486 499 485 499 498 486 487 500 486 500 499 487 488 501 487 501 500 488 489 502 488 502 501 489 490 503 489 503 502 490 491 504 490 504 503 352 492 505 352 505 353 492 493 506 492 506 505 493 494 507 493 507 506 494 495 508 494 508 507 495 496 509 495 509 508 496 497 510 496 510 509 497 498 511 497 511 510 498 499 512 498 512 511 499 500 513 499 513 512 500 501 514 500 514 513 501 502 515 501 515 514 502 503 516 502 516 515 503 504 517 503 517 516 353 505 518 353 518 354 505 506 519 505 519 518 506 507 520 506 520 519 507 508 521 507 521 520 508 509 522 508 522 521 509 510 523 509 523 522 510 511 524 510 524 523 511 512 525 511 525 524 512 513 526 512 526 525 513 514 527 513 527 526 514 515 528 514 528 527 515 516 529 515 529 528 516 517 530 516 530 529 354 518 531 354 531 355 518 519 532 518 532 531 519 520 533 519 533 532 520 521 534 520 534 533 521 522 535 521 535 534 522 523 536 522 536 535 523 524 537 523 537 536 524 525 538 524 538 537 525 526 539 525 539 538 526 527 540 526 540 539 527 528 541 527 541 540 528 529 542 528 542 541 529 530 543 529 543 542 355 531 544 355 544 356 531 532 545 531 545 544 532 533 546 532 546 545 533 534 547 533 547 546 534 535 548 534 548 547 535 536 549 535 549 548 536 537 550 536 550 549 537 538 551 537 551 550 538 539 552 538 552 551 539 540 553 539 553 552 540 541 554 540 554 553 541 542 555 541 555 554 542 543 556 542 556 555 356 544 557 356 557 357 544 545 558 544 558 557 545 546 559 545 559 558 546 547 560 546 560 559 547 548 561 547 561 560 548 549 562 548 562 561 549 550 563 549 563 562 550 551 564 550 564 563 551 552 565 551 565 564 552 553 566 552 566 565 553 554 567 553 567 566 554 555 568 554 568 567 555 556 569 555 569 568 357 557 570 357 570 358 557 558 571 557 571 570 558 559 572 558 572 571 559 560 573 559 573 572 560 561 574 560 574 573 561 562 575 561 575 574 562 563 576 562 576 575 563 564 577 563 577 576 564 565 578 564 578 577 565 566 579 565 579 578 566 567 580 566 580 579 567 568 581 567 581 580 568 569 582 568 582 581 358 570 583 358 583 359 570 571 584 570 584 583 571 572 585 571 585 584 572 573 586 572 586 585 573 574 587 573 587 586 574 575 588 574 588 587 575 576 589 575 589 588 576 577 590 576 590 589 577 578 591 577 591 590 578 579 592 578 592 591 579 580 593 579 593 592 580 581 594 580 594 593 581 582 595 581 595 594 359 583 596 359 596 360 583 584 597 583 597 596 584 585 598 584 598 597 585 586 599 585 599 598 586 587 600 586 600 599 587 588 601 587 601 600 588 589 602 588 602 601 589 590 603 589 603 602 590 591 604 590 604 603 591 592 605 591 605 604 592 593 606 592 606 605 593 594 607 593 607 606 594 595 608 594 608 607 360 596 609 360 609 361 596 597 610 596 610 609 597 598 611 597 611 610 598 599 612 598 612 611 599 600 613 599 613 612 600 601 614 600 614 613 601 602 615 601 615 614 602 603 616 602 616 615 603 604 617 603 617 616 604 605 618 604 618 617 605 606 619 605 619 618 606 607 620 606 620 619 607 608 621 607 621 620 361 609 362 361 362 341 609 610 364 609 364 362 610 611 366 610 366 364 611 612 368 611 368 366 612 613 370 612 370 368 613 614 372 613 372 370 614 615 374 614 374 372 615 616 376 615 376 374 616 617 378 616 378 376 617 618 380 617 380 378 618 619 382 618 382 380 619 620 384 619 384 382 620 621 386 620 386 384 386 282 281 284 386 284 283 387 387 283 285 287 387 287 286 400 400 286 288 290 400 290 289 413 413 289 291 293 413 293 292 426 426 292 294 296 426 296 295 439 439 295 297 299 439 299 298 452 452 298 300 302 452 302 301 465 465 301 303 305 465 305 304 478 478 304 306 308 478 308 307 491 491 307 309 311 491 311 310 504 504 310 312 314 504 314 313 517 517 313 315 317 517 317 316 530 530 316 318 320 530 320 319 543 543 319 321 323 543 323 322 556 556 322 324 326 556 326 325 569 569 325 327 329 569 329 328 582 582 328 330 332 582 332 331 595 595 331 333 335 595 335 334 608 608 334 336 338 608 338 337 621 621 337 339 340 621 340 282 386 622 642 624 622 660 642 622 678 660 622 696 678 622 714 696 622 732 714 622 750 732 622 768 750 622 786 768 622 804 786 622 822 804 622 840 822 622 858 840 622 876 858 622 894 876 622 912 894 622 930 912 622 948 930 622 966 948 622 624 966 659 623 641 677 623 659 695 623 677 713 623 695 731 623 713 749 623 731 767 623 749 785 623 767 803 623 785 821 623 803 839 623 821 857 623 839 875 623 857 893 623 875 911 623 893 929 623 911 947 623 929 965 623 947 983 623 965 641 623 983 643 625 624 642 643 624 644 626 625 643 644 625 645 627 626 644 645 626 646 628 627 645 646 627 647 629 628 646 647 628 648 630 629 647 648 629 649 631 630 648 649 630 650 632 631 649 650 631 651 633 632 650 651 632 652 634 633 651 652 633 653 635 634 652 653 634 654 636 635 653 654 635 655 637 636 654 655 636 656 638 637 655 656 637 657 639 638 656 657 638 658 640 639 657 658 639 659 641 640 658 659 640 661 643 642 660 661 642 662 644 643 661 662 643 663 645 644 662 663 644 664 646 645 663 664 645 665 647 646 664 665 646 666 648 647 665 666 647 667 649 648 666 667 648 668 650 649 667 668 649 669 651 650 668 669 650 670 652 651 669 670 651 671 653 652 670 671 652 672 654 653 671 672 653 673 655 654 672 673 654 674 656 655 673 674 655 675 657 656 674 675 656 676 658 657 675 676 657 677 659 658 676 677 658 679 661 660 678 679 660 680 662 661 679 680 661 681 663 662 680 681 662 682 664 663 681 682 663 683 665 664 682 683 664 684 666 665 683 684 665 685 667 666 684 685 666 686 668 667 685 686 667 687 669 668 686 687 668 688 670 669 687 688 669 689 671 670 688 689 670 690 672 671 689 690 671 691 673 672 690 691 672 692 674 673 691 692 673 693 675 674 692 693 674 694 676 675 693 694 675 695 677 676 694 695 676 697 679 678 696 697 678 698 680 679 697 698 679 699 681 680 698 699 680 700 682 681 699 700 681 701 683 682 700 701 682 702 684 683 701 702 683 703 685 684 702 703 684 704 686 685 703 704 685 705 687 686 704 705 686 706 688 687 705 706 687 707 689 688 706 707 688 708 690 689 707 708 689 709 691 690 708 709 690 710 692 691 709 710 691 711 693 692 710 711 692 712 694 693 711 712 693 713 695 694 712 713 694 715 697 696 714 715 696 716 698 697 715 716 697 717 699 698 716 717 698 718 700 699 717 718 699 719 701 700 718 719 700 720 702 701 719 720 701 721 703 702 720 721 702 722 704 703 721 722 703 723 705 704 722 723 704 724 706 705 723 724 705 725 707 706 724 725 706 726 708 707 725 726 707 727 709 708 726 727 708 728 710 709 727 728 709 729 711 710 728 729 710 730 712 711 729 730 711 731 713 712 730 731 712 733 715 714 732 733 714 734 716 715 733 734 715 735 717 716 734 735 716 736 718 717 735 736 717 737 719 718 736 737 718 738 720 719 737 738 719 739 721 720 738 739 720 740 722 721 739 740 721 741 723 722 740 741 722 742 724 723 741 742 723 743 725 724 742 743 724 744 726 725 743 744 725 745 727 726 744 745 726 746 728 727 745 746 727 747 729 728 746 747 728 748 730 729 747 748 729 749 731 730 748 749 730 751 733 732 750 751 732 752 734 733 751 752 733 753 735 734 752 753 734 754 736 735 753 754 735 755 737 736 754 755 736 756 738 737 755 756 737 757 739 738 756 757 738 758 740 739 757 758 739 759 741 740 758 759 740 760 742 741 759 760 741 761 743 742 760 761 742 762 744 743 761 762 743 763 745 744 762 763 744 764 746 745 763 764 745 765 747 746 764 765 746 766 748 747 765 766 747 767 749 748 766 767 748 769 751 750 768 769 750 770 752 751 769 770 751 771 753 752 770 771 752 772 754 753 771 772 753 773 755 754 772 773 754 774 756 755 773 774 755 775 757 756 774 775 756 776 758 757 775 776 757 777 759 758 776 777 758 778 760 759 777 778 759 779 761 760 778 779 760 780 762 761 779 780 761 781 763 762 780 781 762 782 764 763 781 782 763 783 765 764 782 783 764 784 766 765 783 784 765 785 767 766 784 785 766 787 769 768 786 787 768 788 770 769 787 788 769 789 771 770 788 789 770 790 772 771 789 790 771 791 773 772 790 791 772 792 774 773 791 792 773 793 775 774 792 793 774 794 776 775 793 794 775 795 777 776 794 795 776 796 778 777 795 796 777 797 779 778 796 797 778 798 780 779 797 798 779 799 781 780 798 799 780 800 782 781 799 800 781 801 783 782 800 801 782 802 784 783 801 802 783 803 785 784 802 803 784 805 787 786 804 805 786 806 788 787 805 806 787 807 789 788 806 807 788 808 790 789 807 808 789 809 791 790 808 809 790 810 792 791 809 810 791 811 793 792 810 811 792 812 794 793 811 812 793 813 795 794 812 813 794 814 796 795 813 814 795 815 797 796 814 815 796 816 798 797 815 816 797 817 799 798 816 817 798 818 800 799 817 818 799 819 801 800 818 819 800 820 802 801 819 820 801 821 803 802 820 821 802 823 805 804 822 823 804 824 806 805 823 824 805 825 807 806 824 825 806 826 808 807 825 826 807 827 809 808 826 827 808 828 810 809 827 828 809 829 811 810 828 829 810 830 812 811 829 830 811 831 813 812 830 831 812 832 814 813 831 832 813 833 815 814 832 833 814 834 816 815 833 834 815 835 817 816 834 835 816 836 818 817 835 836 817 837 819 818 836 837 818 838 820 819 837 838 819 839 821 820 838 839 820 841 823 822 840 841 822 842 824 823 841 842 823 843 825 824 842 843 824 844 826 825 843 844 825 845 827 826 844 845 826 846 828 827 845 846 827 847 829 828 846 847 828 848 830 829 847 848 829 849 831 830 848 849 830 850 832 831 849 850 831 851 833 832 850 851 832 852 834 833 851 852 833 853 835 834 852 853 834 854 836 835 853 854 835 855 837 836 854 855 836 856 838 837 855 856 837 857 839 838 856 857 838 859 841 840 858 859 840 860 842 841 859 860 841 861 843 842 860 861 842 862 844 843 861 862 843 863 845 844 862 863 844 864 846 845 863 864 845 865 847 846 864 865 846 866 848 847 865 866 847 867 849 848 866 867 848 868 850 849 867 868 849 869 851 850 868 869 850 870 852 851 869 870 851 871 853 852 870 871 852 872 854 853 871 872 853 873 855 854 872 873 854 874 856 855 873 874 855 875 857 856 874 875 856 877 859 858 876 877 858 878 860 859 877 878 859 879 861 860 878 879 860 880 862 861 879 880 861 881 863 862 880 881 862 882 864 863 881 882 863 883 865 864 882 883 864 884 866 865 883 884 865 885 867 866 884 885 866 886 868 867 885 886 867 887 869 868 886 887 868 888 870 869 887 888 869 889 871 870 888 889 870 890 872 871 889 890 871 891 873 872 890 891 872 892 874 873 891 892 873 893 875 874 892 893 874 895 877 876 894 895 876 896 878 877 895 896 877 897 879 878 896 897 878 898 880 879 897 898 879 899 881 880 898 899 880 900 882 881 899 900 881 901 883 882 900 901 882 902 884 883 901 902 883 903 885 884 902 903 884 904 886 885 903 904 885 905 887 886 904 905 886 906 888 887 905 906 887 907 889 888 906 907 888 908 890 889 907 908 889 909 891 890 908 909 890 910 892 891 909 910 891 911 893 892 910 911 892 913 895 894 912 913 894 914 896 895 913 914 895 915 897 896 914 915 896 916 898 897 915 916 897 917 899 898 916 917 898 918 900 899 917 918 899 919 901 900 918 919 900 920 902 901 919 920 901 921 903 902 920 921 902 922 904 903 921 922 903 923 905 904 922 923 904 924 906 905 923 924 905 925 907 906 924 925 906 926 908 907 925 926 907 927 909 908 926 927 908 928 910 909 927 928 909 929 911 910 928 929 910 931 913 912 930 931 912 932 914 913 931 932 913 933 915 914 932 933 914 934 916 915 933 934 915 935 917 916 934 935 916 936 918 917 935 936 917 937 919 918 936 937 918 938 920 919 937 938 919 939 921 920 938 939 920 940 922 921 939 940 921 941 923 922 940 941 922 942 924 923 941 942 923 943 925 924 942 943 924 944 926 925 943 944 925 945 927 926 944 945 926 946 928 927 945 946 927 947 929 928 946 947 928 949 931 930 948 949 930 950 932 931 949 950 931 951 933 932 950 951 932 952 934 933 951 952 933 953 935 934 952 953 934 954 936 935 953 954 935 955 937 936 954 955 936 956 938 937 955 956 937 957 939 938 956 957 938 958 940 939 957 958 939 959 941 940 958 959 940 960 942 941 959 960 941 961 943 942 960 961 942 962 944 943 961 962 943 963 945 944 962 963 944 964 946 945 963 964 945 965 947 946 964 965 946 967 949 948 966 967 948 968 950 949 967 968 949 969 951 950 968 969 950 970 952 951 969 970 951 971 953 952 970 971 952 972 954 953 971 972 953 973 955 954 972 973 954 974 956 955 973 974 955 975 957 956 974 975 956 976 958 957 975 976 957 977 959 958 976 977 958 978 960 959 977 978 959 979 961 960 978 979 960 980 962 961 979 980 961 981 963 962 980 981 962 982 964 963 981 982 963 983 965 964 982 983 964 625 967 966 624 625 966 626 968 967 625 626 967 627 969 968 626 627 968 628 970 969 627 628 969 629 971 970 628 629 970 630 972 971 629 630 971 631 973 972 630 631 972 632 974 973 631 632 973 633 975 974 632 633 974 634 976 975 633 634 975 635 977 976 634 635 976 636 978 977 635 636 977 637 979 978 636 637 978 638 980 979 637 638 979 639 981 980 638 639 980 640 982 981 639 640 981 641 983 982 640 641 982 984 1004 986 984 1022 1004 984 1040 1022 984 1058 1040 984 1076 1058 984 1094 1076 984 1112 1094 984 1130 1112 984 1148 1130 984 1166 1148 984 1184 1166 984 1202 1184 984 1220 1202 984 1238 1220 984 1256 1238 984 1274 1256 984 1292 1274 984 1310 1292 984 1328 1310 984 986 1328 1021 985 1003 1039 985 1021 1057 985 1039 1075 985 1057 1093 985 1075 1111 985 1093 1129 985 1111 1147 985 1129 1165 985 1147 1183 985 1165 1201 985 1183 1219 985 1201 1237 985 1219 1255 985 1237 1273 985 1255 1291 985 1273 1309 985 1291 1327 985 1309 1345 985 1327 1003 985 1345 1005 987 986 1004 1005 986 1006 988 987 1005 1006 987 1007 989 988 1006 1007 988 1008 990 989 1007 1008 989 1009 991 990 1008 1009 990 1010 992 991 1009 1010 991 1011 993 992 1010 1011 992 1012 994 993 1011 1012 993 1013 995 994 1012 1013 994 1014 996 995 1013 1014 995 1015 997 996 1014 1015 996 1016 998 997 1015 1016 997 1017 999 998 1016 1017 998 1018 1000 999 1017 1018 999 1019 1001 1000 1018 1019 1000 1020 1002 1001 1019 1020 1001 1021 1003 1002 1020 1021 1002 1023 1005 1004 1022 1023 1004 1024 1006 1005 1023 1024 1005 1025 1007 1006 1024 1025 1006 1026 1008 1007 1025 1026 1007 1027 1009 1008 1026 1027 1008 1028 1010 1009 1027 1028 1009 1029 1011 1010 1028 1029 1010 1030 1012 1011 1029 1030 1011 1031 1013 1012 1030 1031 1012 1032 1014 1013 1031 1032 1013 1033 1015 1014 1032 1033 1014 1034 1016 1015 1033 1034 1015 1035 1017 1016 1034 1035 1016 1036 1018 1017 1035 1036 1017 1037 1019 1018 1036 1037 1018 1038 1020 1019 1037 1038 1019 1039 1021 1020 1038 1039 1020 1041 1023 1022 1040 1041 1022 1042 1024 1023 1041 1042 1023 1043 1025 1024 1042 1043 1024 1044 1026 1025 1043 1044 1025 1045 1027 1026 1044 1045 1026 1046 1028 1027 1045 1046 1027 1047 1029 1028 1046 1047 1028 1048 1030 1029 1047 1048 1029 1049 1031 1030 1048 1049 1030 1050 1032 1031 1049 1050 1031 1051 1033 1032 1050 1051 1032 1052 1034 1033 1051 1052 1033 1053 1035 1034 1052 1053 1034 1054 1036 1035 1053 1054 1035 1055 1037 1036 1054 1055 1036 1056 1038 1037 1055 1056 1037 1057 1039 1038 1056 1057 1038 1059 1041 1040 1058 1059 1040 1060 1042 1041 1059 1060 1041 1061 1043 1042 1060 1061 1042 1062 1044 1043 1061 1062 1043 1063 1045 1044 1062 1063 1044 1064 1046 1045 1063 1064 1045 1065 1047 1046 1064 1065 1046 1066 1048 1047 1065 1066 1047 1067 1049 1048 1066 1067 1048 1068 1050 1049 1067 1068 1049 1069 1051 1050 1068 1069 1050 1070 1052 1051 1069 1070 1051 1071 1053 1052 1070 1071 1052 1072 1054 1053 1071 1072 1053 1073 1055 1054 1072 1073 1054 1074 1056 1055 1073 1074 1055 1075 1057 1056 1074 1075 1056 1077 1059 1058 1076 1077 1058 1078 1060 1059 1077 1078 1059 1079 1061 1060 1078 1079 1060 1080 1062 1061 1079 1080 1061 1081 1063 1062 1080 1081 1062 1082 1064 1063 1081 1082 1063 1083 1065 1064 1082 1083 1064 1084 1066 1065 1083 1084 1065 1085 1067 1066 1084 1085 1066 1086 1068 1067 1085 1086 1067 1087 1069 1068 1086 1087 1068 1088 1070 1069 1087 1088 1069 1089 1071 1070 1088 1089 1070 1090 1072 1071 1089 1090 1071 1091 1073 1072 1090 1091 1072 1092 1074 1073 1091 1092 1073 1093 1075 1074 1092 1093 1074 1095 1077 1076 1094 1095 1076 1096 1078 1077 1095 1096 1077 1097 1079 1078 1096 1097 1078 1098 1080 1079 1097 1098 1079 1099 1081 1080 1098 1099 1080 1100 1082 1081 1099 1100 1081 1101 1083 1082 1100 1101 1082 1102 1084 1083 1101 1102 1083 1103 1085 1084 1102 1103 1084 1104 1086 1085 1103 1104 1085 1105 1087 1086 1104 1105 1086 1106 1088 1087 1105 1106 1087 1107 1089 1088 1106 1107 1088 1108 1090 1089 1107 1108 1089 1109 1091 1090 1108 1109 1090 1110 1092 1091 1109 1110 1091 1111 1093 1092 1110 1111 1092 1113 1095 1094 1112 1113 1094 1114 1096 1095 1113 1114 1095 1115 1097 1096 1114 1115 1096 1116 1098 1097 1115 1116 1097 1117 1099 1098 1116 1117 1098 1118 1100 1099 1117 1118 1099 1119 1101 1100 1118 1119 1100 1120 1102 1101 1119 1120 1101 1121 1103 1102 1120 1121 1102 1122 1104 1103 1121 1122 1103 1123 1105 1104 1122 1123 1104 1124 1106 1105 1123 1124 1105 1125 1107 1106 1124 1125 1106 1126 1108 1107 1125 1126 1107 1127 1109 1108 1126 1127 1108 1128 1110 1109 1127 1128 1109 1129 1111 1110 1128 1129 1110 1131 1113 1112 1130 1131 1112 1132 1114 1113 1131 1132 1113 1133 1115 1114 1132 1133 1114 1134 1116 1115 1133 1134 1115 1135 1117 1116 1134 1135 1116 1136 1118 1117 1135 1136 1117 1137 1119 1118 1136 1137 1118 1138 1120 1119 1137 1138 1119 1139 1121 1120 1138 1139 1120 1140 1122 1121 1139 1140 1121 1141 1123 1122 1140 1141 1122 1142 1124 1123 1141 1142 1123 1143 1125 1124 1142 1143 1124 1144 1126 1125 1143 1144 1125 1145 1127 1126 1144 1145 1126 1146 1128 1127 1145 1146 1127 1147 1129 1128 1146 1147 1128 1149 1131 1130 1148 1149 1130 1150 1132 1131 1149 1150 1131 1151 1133 1132 1150 1151 1132 1152 1134 1133 1151 1152 1133 1153 1135 1134 1152 1153 1134 1154 1136 1135 1153 1154 1135 1155 1137 1136 1154 1155 1136 1156 1138 1137 1155 1156 1137 1157 1139 1138 1156 1157 1138 1158 1140 1139 1157 1158 1139 1159 1141 1140 1158 1159 1140 1160 1142 1141 1159 1160 1141 1161 1143 1142 1160 1161 1142 1162 1144 1143 1161 1162 1143 1163 1145 1144 1162 1163 1144 1164 1146 1145 1163 1164 1145 1165 1147 1146 1164 1165 1146 1167 1149 1148 1166 1167 1148 1168 1150 1149 1167 1168 1149 1169 1151 1150 1168 1169 1150 1170 1152 1151 1169 1170 1151 1171 1153 1152 1170 1171 1152 1172 1154 1153 1171 1172 1153 1173 1155 1154 1172 1173 1154 1174 1156 1155 1173 1174 1155 1175 1157 1156 1174 1175 1156 1176 1158 1157 1175 1176 1157 1177 1159 1158 1176 1177 1158 1178 1160 1159 1177 1178 1159 1179 1161 1160 1178 1179 1160 1180 1162 1161 1179 1180 1161 1181 1163 1162 1180 1181 1162 1182 1164 1163 1181 1182 1163 1183 1165 1164 1182 1183 1164 1185 1167 1166 1184 1185 1166 1186 1168 1167 1185 1186 1167 1187 1169 1168 1186 1187 1168 1188 1170 1169 1187 1188 1169 1189 1171 1170 1188 1189 1170 1190 1172 1171 1189 1190 1171 1191 1173 1172 1190 1191 1172 1192 1174 1173 1191 1192 1173 1193 1175 1174 1192 1193 1174 1194 1176 1175 1193 1194 1175 1195 1177 1176 1194 1195 1176 1196 1178 1177 1195 1196 1177 1197 1179 1178 1196 1197 1178 1198 1180 1179 1197 1198 1179 1199 1181 1180 1198 1199 1180 1200 1182 1181 1199 1200 1181 1201 1183 1182 1200 1201 1182 1203 1185 1184 1202 1203 1184 1204 1186 1185 1203 1204 1185 1205 1187 1186 1204 1205 1186 1206 1188 1187 1205 1206 1187 1207 1189 1188 1206 1207 1188 1208 1190 1189 1207 1208 1189 1209 1191 1190 1208 1209 1190 1210 1192 1191 1209 1210 1191 1211 1193 1192 1210 1211 1192 1212 1194 1193 1211 1212 1193 1213 1195 1194 1212 1213 1194 1214 1196 1195 1213 1214 1195 1215 1197 1196 1214 1215 1196 1216 1198 1197 1215 1216 1197 1217 1199 1198 1216 1217 1198 1218 1200 1199 1217 1218 1199 1219 1201 1200 1218 1219 1200 1221 1203 1202 1220 1221 1202 1222 1204 1203 1221 1222 1203 1223 1205 1204 1222 1223 1204 1224 1206 1205 1223 1224 1205 1225 1207 1206 1224 1225 1206 1226 1208 1207 1225 1226 1207 1227 1209 1208 1226 1227 1208 1228 1210 1209 1227 1228 1209 1229 1211 1210 1228 1229 1210 1230 1212 1211 1229 1230 1211 1231 1213 1212 1230 1231 1212 1232 1214 1213 1231 1232 1213 1233 1215 1214 1232 1233 1214 1234 1216 1215 1233 1234 1215 1235 1217 1216 1234 1235 1216 1236 1218 1217 1235 1236 1217 1237 1219 1218 1236 1237 1218 1239 1221 1220 1238 1239 1220 1240 1222 1221 1239 1240 1221 1241 1223 1222 1240 1241 1222 1242 1224 1223 1241 1242 1223 1243 1225 1224 1242 1243 1224 1244 1226 1225 1243 1244 1225 1245 1227 1226 1244 1245 1226 1246 1228 1227 1245 1246 1227 1247 1229 1228 1246 1247 1228 1248 1230 1229 1247 1248 1229 1249 1231 1230 1248 1249 1230 1250 1232 1231 1249 1250 1231 1251 1233 1232 1250 1251 1232 1252 1234 1233 1251 1252 1233 1253 1235 1234 1252 1253 1234 1254 1236 1235 1253 1254 1235 1255 1237 1236 1254 1255 1236 1257 1239 1238 1256 1257 1238 1258 1240 1239 1257 1258 1239 1259 1241 1240 1258 1259 1240 1260 1242 1241 1259 1260 1241 1261 1243 1242 1260 1261 1242 1262 1244 1243 1261 1262 1243 1263 1245 1244 1262 1263 1244 1264 1246 1245 1263 1264 1245 1265 1247 1246 1264 1265 1246 1266 1248 1247 1265 1266 1247 1267 1249 1248 1266 1267 1248 1268 1250 1249 1267 1268 1249 1269 1251 1250 1268 1269 1250 1270 1252 1251 1269 1270 1251 1271 1253 1252 1270 1271 1252 1272 1254 1253 1271 1272 1253 1273 1255 1254 1272 1273 1254 1275 1257 1256 1274 1275 1256 1276 1258 1257 1275 1276 1257 1277 1259 1258 1276 1277 1258 1278 1260 1259 1277 1278 1259 1279 1261 1260 1278 1279 1260 1280 1262 1261 1279 1280 1261 1281 1263 1262 1280 1281 1262 1282 1264 1263 1281 1282 1263 1283 1265 1264 1282 1283 1264 1284 1266 1265 1283 1284 1265 1285 1267 1266 1284 1285 1266 1286 1268 1267 1285 1286 1267 1287 1269 1268 1286 1287 1268 1288 1270 1269 1287 1288 1269 1289 1271 1270 1288 1289 1270 1290 1272 1271 1289 1290 1271 1291 1273 1272 1290 1291 1272 1293 1275 1274 1292 1293 1274 1294 1276 1275 1293 1294 1275 1295 1277 1276 1294 1295 1276 1296 1278 1277 1295 1296 1277 1297 1279 1278 1296 1297 1278 1298 1280 1279 1297 1298 1279 1299 1281 1280 1298 1299 1280 1300 1282 1281 1299 1300 1281 1301 1283 1282 1300 1301 1282 1302 1284 1283 1301 1302 1283 1303 1285 1284 1302 1303 1284 1304 1286 1285 1303 1304 1285 1305 1287 1286 1304 1305 1286 1306 1288 1287 1305 1306 1287 1307 1289 1288 1306 1307 1288 1308 1290 1289 1307 1308 1289 1309 1291 1290 1308 1309 1290 1311 1293 1292 1310 1311 1292 1312 1294 1293 1311 1312 1293 1313 1295 1294 1312 1313 1294 1314 1296 1295 1313 1314 1295 1315 1297 1296 1314 1315 1296 1316 1298 1297 1315 1316 1297 1317 1299 1298 1316 1317 1298 1318 1300 1299 1317 1318 1299 1319 1301 1300 1318 1319 1300 1320 1302 1301 1319 1320 1301 1321 1303 1302 1320 1321 1302 1322 1304 1303 1321 1322 1303 1323 1305 1304 1322 1323 1304 1324 1306 1305 1323 1324 1305 1325 1307 1306 1324 1325 1306 1326 1308 1307 1325 1326 1307 1327 1309 1308 1326 1327 1308 1329 1311 1310 1328 1329 1310 1330 1312 1311 1329 1330 1311 1331 1313 1312 1330 1331 1312 1332 1314 1313 1331 1332 1313 1333 1315 1314 1332 1333 1314 1334 1316 1315 1333 1334 1315 1335 1317 1316 1334 1335 1316 1336 1318 1317 1335 1336 1317 1337 1319 1318 1336 1337 1318 1338 1320 1319 1337 1338 1319 1339 1321 1320 1338 1339 1320 1340 1322 1321 1339 1340 1321 1341 1323 1322 1340 1341 1322 1342 1324 1323 1341 1342 1323 1343 1325 1324 1342 1343 1324 1344 1326 1325 1343 1344 1325 1345 1327 1326 1344 1345 1326 987 1329 1328 986 987 1328 988 1330 1329 987 988 1329 989 1331 1330 988 989 1330 990 1332 1331 989 990 1331 991 1333 1332 990 991 1332 992 1334 1333 991 992 1333 993 1335 1334 992 993 1334 994 1336 1335 993 994 1335 995 1337 1336 994 995 1336 996 1338 1337 995 996 1337 997 1339 1338 996 997 1338 998 1340 1339 997 998 1339 999 1341 1340 998 999 1340 1000 1342 1341 999 1000 1341 1001 1343 1342 1000 1001 1342 1002 1344 1343 1001 1002 1343 1003 1345 1344 1002 1003 1344 ================================================ FILE: testing/data/branched6.vtk ================================================ # vtk DataFile Version 5.1 vtk output ASCII DATASET POLYDATA POINTS 1232 double 0.082297295332 -0.36765038967 0.86818063259 0.078269377351 -0.34221912734 0.86818063259 0 -0.36765038967 0.875 0.066579908133 -0.319277253 0.86818063259 0.048373136669 -0.30107048154 0.86818063259 0.025431262329 -0.28938101232 0.86818063259 5.0392558428e-18 -0.28535309434 0.86818063259 -0.025431262329 -0.28938101232 0.86818063259 -0.048373136669 -0.30107048154 0.86818063259 -0.066579908133 -0.319277253 0.86818063259 -0.078269377351 -0.34221912734 0.86818063259 -0.082297295332 -0.36765038967 0.86818063259 -0.078269377351 -0.393081652 0.86818063259 -0.066579908133 -0.41602352634 0.86818063259 -0.048373136669 -0.4342302978 0.86818063259 -0.025431262329 -0.44591976702 0.86818063259 -1.5117767942e-17 -0.449947685 0.86818063259 0.025431262329 -0.44591976702 0.86818063259 0.048373136669 -0.4342302978 0.86818063259 0.066579908133 -0.41602352634 0.86818063259 0.078269377351 -0.393081652 0.86818063259 0.16234973073 -0.36765038967 0.84790861607 0.15440377593 -0.31748156249 0.84790861607 0.23797369003 -0.36765038967 0.81473690271 0.2263264358 -0.29411247372 0.81473690271 0.30710634589 -0.36765038967 0.76957023144 0.29207551479 -0.27274930477 0.76957023144 0.36786195636 -0.36765038967 0.71364080906 0.34985750914 -0.25397479534 0.71364080906 0.41858324409 -0.36765038967 0.64847409725 0.39809632301 -0.23830105364 0.64847409725 0.45788666606 -0.36765038967 0.57584768534 0.43547609448 -0.22615562379 0.57584768534 0.48470014334 -0.36765038967 0.4977427423 0.4609772265 -0.21786981821 0.4977427423 0.49829223752 -0.36765038967 0.41628968716 0.47390407324 -0.213669613 0.41628968716 0.49829223752 -0.36765038967 0.33371031284 0.47390407324 -0.213669613 0.33371031284 0.48470014334 -0.36765038967 0.2522572577 0.4609772265 -0.21786981821 0.2522572577 0.45788666606 -0.36765038967 0.17415228486 0.43547609448 -0.22615562379 0.17415228486 0.41858324409 -0.36765038967 0.10152591765 0.39809632301 -0.23830105364 0.10152591765 0.36786195636 -0.36765038967 0.036359213293 0.34985750914 -0.25397479534 0.036359213293 0.13134369254 -0.2722236067 0.84790861607 0.19252476096 -0.22777296603 0.81473690271 0.24845425785 -0.18713779747 0.76957023144 0.29760658741 -0.15142655372 0.71364080906 0.33864095807 -0.12161333859 0.64847409725 0.37043809891 -0.09851136803 0.57584768534 0.39213064313 -0.08275079727 0.4977427423 0.40312689543 -0.0747615695 0.41628968716 0.40312689543 -0.0747615695 0.33371031284 0.39213064313 -0.08275079727 0.2522572577 0.37043809891 -0.09851136803 0.17415228486 0.33864095807 -0.12161333859 0.10152591765 0.29760658741 -0.15142655372 0.036359213293 0.095426782966 -0.23630669713 0.84790861607 0.13987742364 -0.17512562871 0.81473690271 0.1805125922 -0.11919613182 0.76957023144 0.21622383595 -0.07004380226 0.71364080906 0.24603705108 -0.0290094316 0.64847409725 0.24603705108 -0.0290094316 0.10152591765 0.21622383595 -0.07004380226 0.036359213293 0.050168827176 -0.21324661374 0.84790861607 0.073537915945 -0.14132395387 0.81473690271 0.0949010849 -0.07557487488 0.76957023144 0.11367559433 -0.01779288053 0.71364080906 0.11367559433 -0.01779288053 0.036359213293 9.9410541201e-18 -0.20530065894 0.84790861607 1.4571686463e-17 -0.12967669964 0.81473690271 1.880484115e-17 -0.06054404378 0.76957023144 -0.050168827176 -0.21324661374 0.84790861607 -0.073537915945 -0.14132395387 0.81473690271 -0.0949010849 -0.07557487488 0.76957023144 -0.11367559433 -0.01779288053 0.71364080906 -0.095426782966 -0.23630669713 0.84790861607 -0.13987742364 -0.17512562871 0.81473690271 -0.1805125922 -0.11919613182 0.76957023144 -0.21622383595 -0.07004380226 0.71364080906 -0.24603705108 -0.0290094316 0.64847409725 -0.13134369254 -0.2722236067 0.84790861607 -0.19252476096 -0.22777296603 0.81473690271 -0.24845425785 -0.18713779747 0.76957023144 -0.29760658741 -0.15142655372 0.71364080906 -0.33864095807 -0.12161333859 0.64847409725 -0.37043809891 -0.09851136803 0.57584768534 -0.24603705108 -0.0290094316 0.10152591765 -0.21622383595 -0.07004380226 0.036359213293 -0.29760658741 -0.15142655372 0.036359213293 -0.33864095807 -0.12161333859 0.10152591765 -0.15440377593 -0.31748156249 0.84790861607 -0.2263264358 -0.29411247372 0.81473690271 -0.29207551479 -0.27274930477 0.76957023144 -0.34985750914 -0.25397479534 0.71364080906 -0.39809632301 -0.23830105364 0.64847409725 -0.43547609448 -0.22615562379 0.57584768534 -0.39213064313 -0.08275079727 0.4977427423 -0.4609772265 -0.21786981821 0.4977427423 -0.40312689543 -0.0747615695 0.41628968716 -0.47390407324 -0.213669613 0.41628968716 -0.40312689543 -0.0747615695 0.33371031284 -0.47390407324 -0.213669613 0.33371031284 -0.39213064313 -0.08275079727 0.2522572577 -0.4609772265 -0.21786981821 0.2522572577 -0.37043809891 -0.09851136803 0.17415228486 -0.43547609448 -0.22615562379 0.17415228486 -0.39809632301 -0.23830105364 0.10152591765 -0.34985750914 -0.25397479534 0.036359213293 -0.16234973073 -0.36765038967 0.84790861607 -0.23797369003 -0.36765038967 0.81473690271 -0.30710634589 -0.36765038967 0.76957023144 -0.36786195636 -0.36765038967 0.71364080906 -0.41858324409 -0.36765038967 0.64847409725 -0.45788666606 -0.36765038967 0.57584768534 -0.48470014334 -0.36765038967 0.4977427423 -0.49829223752 -0.36765038967 0.41628968716 -0.49829223752 -0.36765038967 0.33371031284 -0.48470014334 -0.36765038967 0.2522572577 -0.45788666606 -0.36765038967 0.17415228486 -0.41858324409 -0.36765038967 0.10152591765 -0.36786195636 -0.36765038967 0.036359213293 -0.15440377593 -0.41781921685 0.84790861607 -0.2263264358 -0.44118830561 0.81473690271 -0.29207551479 -0.46255147457 0.76957023144 -0.34985750914 -0.481325984 0.71364080906 -0.39809632301 -0.4969997257 0.64847409725 -0.43547609448 -0.50914515555 0.57584768534 -0.4609772265 -0.51743096113 0.4977427423 -0.47390407324 -0.52163116634 0.41628968716 -0.47390407324 -0.52163116634 0.33371031284 -0.4609772265 -0.51743096113 0.2522572577 -0.43547609448 -0.50914515555 0.17415228486 -0.39809632301 -0.4969997257 0.10152591765 -0.34985750914 -0.481325984 0.036359213293 -0.13134369254 -0.46307717264 0.84790861607 -0.19252476096 -0.50752781331 0.81473690271 -0.24845425785 -0.54816298187 0.76957023144 -0.29760658741 -0.58387422562 0.71364080906 -0.33864095807 -0.61368744075 0.64847409725 -0.37043809891 -0.63678941131 0.57584768534 -0.39213064313 -0.65254998207 0.4977427423 -0.40312689543 -0.66053920984 0.41628968716 -0.40312689543 -0.66053920984 0.33371031284 -0.39213064313 -0.65254998207 0.2522572577 -0.37043809891 -0.63678941131 0.17415228486 -0.33864095807 -0.61368744075 0.10152591765 -0.29760658741 -0.58387422562 0.036359213293 -0.095426782966 -0.49899408221 0.84790861607 -0.13987742364 -0.56017515063 0.81473690271 -0.1805125922 -0.61610464752 0.76957023144 -0.21622383595 -0.66525697708 0.71364080906 -0.24603705108 -0.70629134774 0.64847409725 -0.26913902164 -0.73808848858 0.57584768534 -0.2848995924 -0.7597810328 0.4977427423 -0.29288882017 -0.7707772851 0.41628968716 -0.29288882017 -0.7707772851 0.33371031284 -0.2848995924 -0.7597810328 0.2522572577 -0.26913902164 -0.73808848858 0.17415228486 -0.24603705108 -0.70629134774 0.10152591765 -0.21622383595 -0.66525697708 0.036359213293 -0.050168827176 -0.5220541656 0.84790861607 -0.073537915945 -0.59397682547 0.81473690271 -0.0949010849 -0.65972590446 0.76957023144 -0.11367559433 -0.71750789881 0.71364080906 -0.12934933603 -0.76574671268 0.64847409725 -0.14149476588 -0.80312648415 0.57584768534 -0.14978057146 -0.82862761617 0.4977427423 -0.15398077667 -0.84155446291 0.41628968716 -0.15398077667 -0.84155446291 0.33371031284 -0.14978057146 -0.82862761617 0.2522572577 -0.14149476588 -0.80312648415 0.17415228486 -0.12934933603 -0.76574671268 0.10152591765 -0.11367559433 -0.71750789881 0.036359213293 -2.9823163188e-17 -0.5300001204 0.84790861607 -4.3715059388e-17 -0.6056240797 0.81473690271 -5.6414525104e-17 -0.67475673556 0.76957023144 -6.7575143714e-17 -0.73551234603 0.71364080906 -7.6892492899e-17 -0.78623363376 0.64847409725 -8.4112416453e-17 -0.82553705573 0.57584768534 -8.9037972598e-17 -0.85235053301 0.4977427423 -9.1534800733e-17 -0.86594262719 0.41628968716 -9.1534800733e-17 -0.86594262719 0.33371031284 -8.9037972598e-17 -0.85235053301 0.2522572577 -8.4112416453e-17 -0.82553705573 0.17415228486 -7.6892492899e-17 -0.78623363376 0.10152591765 -6.7575143714e-17 -0.73551234603 0.036359213293 0.050168827176 -0.5220541656 0.84790861607 0.073537915945 -0.59397682547 0.81473690271 0.0949010849 -0.65972590446 0.76957023144 0.11367559433 -0.71750789881 0.71364080906 0.12934933603 -0.76574671268 0.64847409725 0.14149476588 -0.80312648415 0.57584768534 0.14978057146 -0.82862761617 0.4977427423 0.15398077667 -0.84155446291 0.41628968716 0.15398077667 -0.84155446291 0.33371031284 0.14978057146 -0.82862761617 0.2522572577 0.14149476588 -0.80312648415 0.17415228486 0.12934933603 -0.76574671268 0.10152591765 0.11367559433 -0.71750789881 0.036359213293 0.095426782966 -0.49899408221 0.84790861607 0.13987742364 -0.56017515063 0.81473690271 0.1805125922 -0.61610464752 0.76957023144 0.21622383595 -0.66525697708 0.71364080906 0.24603705108 -0.70629134774 0.64847409725 0.26913902164 -0.73808848858 0.57584768534 0.2848995924 -0.7597810328 0.4977427423 0.29288882017 -0.7707772851 0.41628968716 0.29288882017 -0.7707772851 0.33371031284 0.2848995924 -0.7597810328 0.2522572577 0.26913902164 -0.73808848858 0.17415228486 0.24603705108 -0.70629134774 0.10152591765 0.21622383595 -0.66525697708 0.036359213293 0.13134369254 -0.46307717264 0.84790861607 0.19252476096 -0.50752781331 0.81473690271 0.24845425785 -0.54816298187 0.76957023144 0.29760658741 -0.58387422562 0.71364080906 0.33864095807 -0.61368744075 0.64847409725 0.37043809891 -0.63678941131 0.57584768534 0.39213064313 -0.65254998207 0.4977427423 0.40312689543 -0.66053920984 0.41628968716 0.40312689543 -0.66053920984 0.33371031284 0.39213064313 -0.65254998207 0.2522572577 0.37043809891 -0.63678941131 0.17415228486 0.33864095807 -0.61368744075 0.10152591765 0.29760658741 -0.58387422562 0.036359213293 0.15440377593 -0.41781921685 0.84790861607 0.2263264358 -0.44118830561 0.81473690271 0.29207551479 -0.46255147457 0.76957023144 0.34985750914 -0.481325984 0.71364080906 0.39809632301 -0.4969997257 0.64847409725 0.43547609448 -0.50914515555 0.57584768534 0.4609772265 -0.51743096113 0.4977427423 0.47390407324 -0.52163116634 0.41628968716 0.47390407324 -0.52163116634 0.33371031284 0.4609772265 -0.51743096113 0.2522572577 0.43547609448 -0.50914515555 0.17415228486 0.39809632301 -0.4969997257 0.10152591765 0.34985750914 -0.481325984 0.036359213293 0.32836531327 -0.36765038967 -2.8171179001e-17 0.3220653893 -0.32787420532 -4.9487070846e-09 0.31859390657 -0.30595609081 -4.9487070599e-09 0.31229398553 -0.26617992492 2.5407916269e-17 0.29401088933 -0.23029732859 5.1429095066e-09 0.28393623162 -0.21052470643 5.1429095066e-09 0.2656531266 -0.1746420928 6.9388939039e-18 0.23717652592 -0.14616549212 0 0.22148489755 -0.13047386375 0 0.19300829687 -0.10199726307 0 0.15712568324 -0.08371415805 -5.1429094891e-09 0.13735306108 -0.07363950034 -5.1429095118e-09 0.10147046475 -0.05535640414 -2.5197041461e-17 0.06169429886 -0.0490564831 4.9487070318e-09 0.03977618435 -0.04558500037 4.948707057e-09 -0.11367559433 -0.01779288053 0.036359213293 -0.10147046475 -0.05535640414 -4.4034066554e-18 -0.13735306108 -0.07363950034 5.1429095118e-09 -0.15712568324 -0.08371415805 5.1429095066e-09 -0.19300829687 -0.10199726307 2.0768586122e-18 -0.22148489755 -0.13047386375 0 -0.23717652592 -0.14616549212 0 -0.2656531266 -0.1746420928 0 -0.28393623162 -0.21052470643 -5.1429094753e-09 -0.29401088933 -0.23029732859 -5.1429095118e-09 -0.31229398553 -0.26617992492 -2.5407916269e-17 -0.31859390657 -0.30595609081 4.9487070561e-09 -0.3220653893 -0.32787420532 4.9487070561e-09 -0.32836531327 -0.36765038967 4.8381435661e-24 -0.3220653893 -0.40742657402 -4.9487070852e-09 -0.31859390657 -0.42934468853 -4.9487070599e-09 -0.31229398553 -0.46912085442 -2.9741361642e-18 -0.29401088933 -0.50500345075 5.1429095066e-09 -0.28393623162 -0.52477607291 5.1429095066e-09 -0.2656531266 -0.56065868654 6.9388939039e-18 -0.23717652592 -0.58913528722 0 -0.22148489755 -0.60482691559 0 -0.19300829687 -0.63330351627 0 -0.15712568324 -0.65158662129 -5.1429094753e-09 -0.13735306108 -0.661661279 -5.1429094753e-09 -0.10147046475 -0.6799443752 -2.540791296e-17 -0.06169429886 -0.68624429624 4.9487070561e-09 -0.03977618435 -0.68971577897 4.9487070565e-09 -5.8492876492e-17 -0.69601570294 -8.5284299912e-18 0.03977618435 -0.68971577897 -4.9487070556e-09 0.06169429886 -0.68624429624 -4.9487070591e-09 0.10147046475 -0.6799443752 -1.5448640187e-18 0.13735306108 -0.661661279 5.1429095066e-09 0.15712568324 -0.65158662129 5.1429094891e-09 0.19300829687 -0.63330351627 0 0.22148489755 -0.60482691559 0 0.23717652592 -0.58913528722 0 0.2656531266 -0.56065868654 -2.0768619209e-18 0.28393623162 -0.52477607291 -5.1429094753e-09 0.29401088933 -0.50500345075 -5.1429095118e-09 0.31229398553 -0.46912085442 2.9741345099e-18 0.31859390657 -0.42934468853 4.9487070561e-09 0.3220653893 -0.40742657402 4.9487070565e-09 0.082297295332 -0.36765038967 -0.86818063259 0 -0.36765038967 -0.875 0.078269377351 -0.34221912734 -0.86818063259 0.066579908133 -0.319277253 -0.86818063259 0.048373136669 -0.30107048154 -0.86818063259 0.025431262329 -0.28938101232 -0.86818063259 5.0392558428e-18 -0.28535309434 -0.86818063259 -0.025431262329 -0.28938101232 -0.86818063259 -0.048373136669 -0.30107048154 -0.86818063259 -0.066579908133 -0.319277253 -0.86818063259 -0.078269377351 -0.34221912734 -0.86818063259 -0.082297295332 -0.36765038967 -0.86818063259 -0.078269377351 -0.393081652 -0.86818063259 -0.066579908133 -0.41602352634 -0.86818063259 -0.048373136669 -0.4342302978 -0.86818063259 -0.025431262329 -0.44591976702 -0.86818063259 -1.5117767942e-17 -0.449947685 -0.86818063259 0.025431262329 -0.44591976702 -0.86818063259 0.048373136669 -0.4342302978 -0.86818063259 0.066579908133 -0.41602352634 -0.86818063259 0.078269377351 -0.393081652 -0.86818063259 0.36786195636 -0.36765038967 -0.036359213293 0.41858324409 -0.36765038967 -0.10152591765 0.39809632301 -0.23830105364 -0.10152591765 0.34985750914 -0.25397479534 -0.036359213293 0.45788666606 -0.36765038967 -0.17415228486 0.43547609448 -0.22615562379 -0.17415228486 0.48470014334 -0.36765038967 -0.2522572577 0.4609772265 -0.21786981821 -0.2522572577 0.49829223752 -0.36765038967 -0.33371031284 0.47390407324 -0.213669613 -0.33371031284 0.49829223752 -0.36765038967 -0.41628968716 0.47390407324 -0.213669613 -0.41628968716 0.48470014334 -0.36765038967 -0.4977427423 0.4609772265 -0.21786981821 -0.4977427423 0.45788666606 -0.36765038967 -0.57584768534 0.43547609448 -0.22615562379 -0.57584768534 0.41858324409 -0.36765038967 -0.64847409725 0.39809632301 -0.23830105364 -0.64847409725 0.36786195636 -0.36765038967 -0.71364080906 0.34985750914 -0.25397479534 -0.71364080906 0.30710634589 -0.36765038967 -0.76957023144 0.29207551479 -0.27274930477 -0.76957023144 0.23797369003 -0.36765038967 -0.81473690271 0.2263264358 -0.29411247372 -0.81473690271 0.16234973073 -0.36765038967 -0.84790861607 0.15440377593 -0.31748156249 -0.84790861607 0.33864095807 -0.12161333859 -0.10152591765 0.29760658741 -0.15142655372 -0.036359213293 0.37043809891 -0.09851136803 -0.17415228486 0.39213064313 -0.08275079727 -0.2522572577 0.40312689543 -0.0747615695 -0.33371031284 0.40312689543 -0.0747615695 -0.41628968716 0.39213064313 -0.08275079727 -0.4977427423 0.37043809891 -0.09851136803 -0.57584768534 0.33864095807 -0.12161333859 -0.64847409725 0.29760658741 -0.15142655372 -0.71364080906 0.24845425785 -0.18713779747 -0.76957023144 0.19252476096 -0.22777296603 -0.81473690271 0.13134369254 -0.2722236067 -0.84790861607 0.24603705108 -0.0290094316 -0.10152591765 0.21622383595 -0.07004380226 -0.036359213293 0.24603705108 -0.0290094316 -0.64847409725 0.21622383595 -0.07004380226 -0.71364080906 0.1805125922 -0.11919613182 -0.76957023144 0.13987742364 -0.17512562871 -0.81473690271 0.095426782966 -0.23630669713 -0.84790861607 0.11367559433 -0.01779288053 -0.71364080906 0.0949010849 -0.07557487488 -0.76957023144 0.073537915945 -0.14132395387 -0.81473690271 0.050168827176 -0.21324661374 -0.84790861607 1.880484115e-17 -0.06054404378 -0.76957023144 1.4571686463e-17 -0.12967669964 -0.81473690271 9.9410541201e-18 -0.20530065894 -0.84790861607 -0.073537915945 -0.14132395387 -0.81473690271 -0.0949010849 -0.07557487488 -0.76957023144 -0.050168827176 -0.21324661374 -0.84790861607 -0.11367559433 -0.01779288053 -0.036359213293 -0.24603705108 -0.0290094316 -0.10152591765 -0.21622383595 -0.07004380226 -0.036359213293 -0.11367559433 -0.01779288053 -0.71364080906 -0.1805125922 -0.11919613182 -0.76957023144 -0.21622383595 -0.07004380226 -0.71364080906 -0.13987742364 -0.17512562871 -0.81473690271 -0.095426782966 -0.23630669713 -0.84790861607 -0.33864095807 -0.12161333859 -0.10152591765 -0.29760658741 -0.15142655372 -0.036359213293 -0.37043809891 -0.09851136803 -0.17415228486 -0.24603705108 -0.0290094316 -0.64847409725 -0.29760658741 -0.15142655372 -0.71364080906 -0.33864095807 -0.12161333859 -0.64847409725 -0.24845425785 -0.18713779747 -0.76957023144 -0.19252476096 -0.22777296603 -0.81473690271 -0.13134369254 -0.2722236067 -0.84790861607 -0.39809632301 -0.23830105364 -0.10152591765 -0.34985750914 -0.25397479534 -0.036359213293 -0.43547609448 -0.22615562379 -0.17415228486 -0.39213064313 -0.08275079727 -0.2522572577 -0.4609772265 -0.21786981821 -0.2522572577 -0.40312689543 -0.0747615695 -0.33371031284 -0.47390407324 -0.213669613 -0.33371031284 -0.40312689543 -0.0747615695 -0.41628968716 -0.47390407324 -0.213669613 -0.41628968716 -0.39213064313 -0.08275079727 -0.4977427423 -0.4609772265 -0.21786981821 -0.4977427423 -0.37043809891 -0.09851136803 -0.57584768534 -0.43547609448 -0.22615562379 -0.57584768534 -0.39809632301 -0.23830105364 -0.64847409725 -0.34985750914 -0.25397479534 -0.71364080906 -0.29207551479 -0.27274930477 -0.76957023144 -0.2263264358 -0.29411247372 -0.81473690271 -0.15440377593 -0.31748156249 -0.84790861607 -0.41858324409 -0.36765038967 -0.10152591765 -0.36786195636 -0.36765038967 -0.036359213293 -0.45788666606 -0.36765038967 -0.17415228486 -0.48470014334 -0.36765038967 -0.2522572577 -0.49829223752 -0.36765038967 -0.33371031284 -0.49829223752 -0.36765038967 -0.41628968716 -0.48470014334 -0.36765038967 -0.4977427423 -0.45788666606 -0.36765038967 -0.57584768534 -0.41858324409 -0.36765038967 -0.64847409725 -0.36786195636 -0.36765038967 -0.71364080906 -0.30710634589 -0.36765038967 -0.76957023144 -0.23797369003 -0.36765038967 -0.81473690271 -0.16234973073 -0.36765038967 -0.84790861607 -0.39809632301 -0.4969997257 -0.10152591765 -0.34985750914 -0.481325984 -0.036359213293 -0.43547609448 -0.50914515555 -0.17415228486 -0.4609772265 -0.51743096113 -0.2522572577 -0.47390407324 -0.52163116634 -0.33371031284 -0.47390407324 -0.52163116634 -0.41628968716 -0.4609772265 -0.51743096113 -0.4977427423 -0.43547609448 -0.50914515555 -0.57584768534 -0.39809632301 -0.4969997257 -0.64847409725 -0.34985750914 -0.481325984 -0.71364080906 -0.29207551479 -0.46255147457 -0.76957023144 -0.2263264358 -0.44118830561 -0.81473690271 -0.15440377593 -0.41781921685 -0.84790861607 -0.33864095807 -0.61368744075 -0.10152591765 -0.29760658741 -0.58387422562 -0.036359213293 -0.37043809891 -0.63678941131 -0.17415228486 -0.39213064313 -0.65254998207 -0.2522572577 -0.40312689543 -0.66053920984 -0.33371031284 -0.40312689543 -0.66053920984 -0.41628968716 -0.39213064313 -0.65254998207 -0.4977427423 -0.37043809891 -0.63678941131 -0.57584768534 -0.33864095807 -0.61368744075 -0.64847409725 -0.29760658741 -0.58387422562 -0.71364080906 -0.24845425785 -0.54816298187 -0.76957023144 -0.19252476096 -0.50752781331 -0.81473690271 -0.13134369254 -0.46307717264 -0.84790861607 -0.24603705108 -0.70629134774 -0.10152591765 -0.21622383595 -0.66525697708 -0.036359213293 -0.26913902164 -0.73808848858 -0.17415228486 -0.2848995924 -0.7597810328 -0.2522572577 -0.29288882017 -0.7707772851 -0.33371031284 -0.29288882017 -0.7707772851 -0.41628968716 -0.2848995924 -0.7597810328 -0.4977427423 -0.26913902164 -0.73808848858 -0.57584768534 -0.24603705108 -0.70629134774 -0.64847409725 -0.21622383595 -0.66525697708 -0.71364080906 -0.1805125922 -0.61610464752 -0.76957023144 -0.13987742364 -0.56017515063 -0.81473690271 -0.095426782966 -0.49899408221 -0.84790861607 -0.12934933603 -0.76574671268 -0.10152591765 -0.11367559433 -0.71750789881 -0.036359213293 -0.14149476588 -0.80312648415 -0.17415228486 -0.14978057146 -0.82862761617 -0.2522572577 -0.15398077667 -0.84155446291 -0.33371031284 -0.15398077667 -0.84155446291 -0.41628968716 -0.14978057146 -0.82862761617 -0.4977427423 -0.14149476588 -0.80312648415 -0.57584768534 -0.12934933603 -0.76574671268 -0.64847409725 -0.11367559433 -0.71750789881 -0.71364080906 -0.0949010849 -0.65972590446 -0.76957023144 -0.073537915945 -0.59397682547 -0.81473690271 -0.050168827176 -0.5220541656 -0.84790861607 -7.6892492899e-17 -0.78623363376 -0.10152591765 -6.7575143714e-17 -0.73551234603 -0.036359213293 -8.4112416453e-17 -0.82553705573 -0.17415228486 -8.9037972598e-17 -0.85235053301 -0.2522572577 -9.1534800733e-17 -0.86594262719 -0.33371031284 -9.1534800733e-17 -0.86594262719 -0.41628968716 -8.9037972598e-17 -0.85235053301 -0.4977427423 -8.4112416453e-17 -0.82553705573 -0.57584768534 -7.6892492899e-17 -0.78623363376 -0.64847409725 -6.7575143714e-17 -0.73551234603 -0.71364080906 -5.6414525104e-17 -0.67475673556 -0.76957023144 -4.3715059388e-17 -0.6056240797 -0.81473690271 -2.9823163188e-17 -0.5300001204 -0.84790861607 0.12934933603 -0.76574671268 -0.10152591765 0.11367559433 -0.71750789881 -0.036359213293 0.14149476588 -0.80312648415 -0.17415228486 0.14978057146 -0.82862761617 -0.2522572577 0.15398077667 -0.84155446291 -0.33371031284 0.15398077667 -0.84155446291 -0.41628968716 0.14978057146 -0.82862761617 -0.4977427423 0.14149476588 -0.80312648415 -0.57584768534 0.12934933603 -0.76574671268 -0.64847409725 0.11367559433 -0.71750789881 -0.71364080906 0.0949010849 -0.65972590446 -0.76957023144 0.073537915945 -0.59397682547 -0.81473690271 0.050168827176 -0.5220541656 -0.84790861607 0.24603705108 -0.70629134774 -0.10152591765 0.21622383595 -0.66525697708 -0.036359213293 0.26913902164 -0.73808848858 -0.17415228486 0.2848995924 -0.7597810328 -0.2522572577 0.29288882017 -0.7707772851 -0.33371031284 0.29288882017 -0.7707772851 -0.41628968716 0.2848995924 -0.7597810328 -0.4977427423 0.26913902164 -0.73808848858 -0.57584768534 0.24603705108 -0.70629134774 -0.64847409725 0.21622383595 -0.66525697708 -0.71364080906 0.1805125922 -0.61610464752 -0.76957023144 0.13987742364 -0.56017515063 -0.81473690271 0.095426782966 -0.49899408221 -0.84790861607 0.33864095807 -0.61368744075 -0.10152591765 0.29760658741 -0.58387422562 -0.036359213293 0.37043809891 -0.63678941131 -0.17415228486 0.39213064313 -0.65254998207 -0.2522572577 0.40312689543 -0.66053920984 -0.33371031284 0.40312689543 -0.66053920984 -0.41628968716 0.39213064313 -0.65254998207 -0.4977427423 0.37043809891 -0.63678941131 -0.57584768534 0.33864095807 -0.61368744075 -0.64847409725 0.29760658741 -0.58387422562 -0.71364080906 0.24845425785 -0.54816298187 -0.76957023144 0.19252476096 -0.50752781331 -0.81473690271 0.13134369254 -0.46307717264 -0.84790861607 0.39809632301 -0.4969997257 -0.10152591765 0.34985750914 -0.481325984 -0.036359213293 0.43547609448 -0.50914515555 -0.17415228486 0.4609772265 -0.51743096113 -0.2522572577 0.47390407324 -0.52163116634 -0.33371031284 0.47390407324 -0.52163116634 -0.41628968716 0.4609772265 -0.51743096113 -0.4977427423 0.43547609448 -0.50914515555 -0.57584768534 0.39809632301 -0.4969997257 -0.64847409725 0.34985750914 -0.481325984 -0.71364080906 0.29207551479 -0.46255147457 -0.76957023144 0.2263264358 -0.44118830561 -0.81473690271 0.15440377593 -0.41781921685 -0.84790861607 0.11367559433 -0.01779288053 -0.036359213293 -0.06169429886 -0.0490564831 -4.948707057e-09 -0.03977618435 -0.04558500037 -4.9487070858e-09 0.27192673088 -0 0.57584768534 0.27069649397 -0 0.5774751742 0.26711363272 4.1553108059e-17 0.58221496599 0.30937984586 -0 0.4977427423 0.30192517751 -0 0.51328875087 0.27314733197 -0 0.57330223674 0.32836532593 -0 0.41628968716 0.32266834667 -6.2825229394e-18 0.44073133224 0.31406304645 -0 0.47765049313 0.32836532593 -0 0.33371031284 0.32836532593 -0 0.36028577365 0.32836532593 -0 0.38971422635 0.30937984586 4.6419995184e-17 0.2522572577 0.31406304645 -0 0.27234950687 0.32266834667 -0 0.30926866776 0.27192673088 -0 0.17415228486 0.27314733197 4.0020505629e-17 0.17669773443 0.30192517751 4.6419995184e-17 0.2367112432 0.26711363272 -0 0.16778500813 0.27069649397 -0 0.172524797 0.18910284015 -1.3877787808e-17 0.64847409725 0.15567018303 3.1982502067e-09 0.66821801581 0.11945685202 8.213822419e-18 0.68960407547 0.21471874774 -9.1680539842e-10 0.62671700638 0.18910284015 -8.9702774348e-19 0.10152591765 0.21471874774 9.1680532811e-10 0.12328299513 0.11945685202 -7.3396281691e-18 0.060395944136 0.15567018303 -3.1982501979e-09 0.081782001353 0.0013357793734 5.8987374447e-17 0.71364080906 0.00026492740121 3.580072667e-11 0.71379694254 -7.2927397544e-17 4.4791795824e-17 0.71383556972 0.084245334712 -4.1420256797e-10 0.69676934902 0.0013357793734 2.0321142246e-18 0.036359213293 0.084245334712 4.1420255215e-10 0.053230671401 -0.00026492740121 -3.5800670328e-11 0.71379694254 -0.0013357793734 -2.0167190558e-17 0.71364080906 -0.084245334712 4.142025692e-10 0.69676934902 -0.11945685202 -8.213822419e-18 0.68960407547 -0.084245334712 -4.142025637e-10 0.053230671401 -0.0013357793721 -2.8086928153e-12 0.03635921329 -0.11945685202 0 0.060395944136 -0.15567018303 -3.1982502067e-09 0.66821801581 -0.18910284015 1.9235704642e-17 0.64847409725 -0.21471874774 9.1680539842e-10 0.62671700638 -0.26711363272 2.7755575616e-17 0.58221496599 -0.21471874774 -9.1680533409e-10 0.12328299513 -0.18910284015 7.1107605285e-18 0.10152591765 -0.26711363272 6.9388939039e-18 0.16778500813 -0.15567018303 3.1982502064e-09 0.081782001353 -0.27069649397 0 0.5774751742 -0.27192673088 0 0.57584768534 -0.27314733197 -1.7741792775e-17 0.57330223674 -0.30192517751 0 0.51328875087 -0.30937984586 0 0.4977427423 -0.31406304645 6.8087970166e-18 0.47765049313 -0.32266834667 6.2825229394e-18 0.44073133224 -0.32836532593 0 0.41628968716 -0.32836532593 0 0.38971422635 -0.32836532593 0 0.36028577365 -0.32836532593 0 0.33371031284 -0.32266834667 0 0.30926866776 -0.31406304645 0 0.27234950687 -0.30937984586 -4.6419995184e-17 0.2522572577 -0.30192517751 -3.2591634195e-17 0.2367112432 -0.27314733197 -4.0020505629e-17 0.17669773443 -0.27192673088 0 0.17415228486 -0.27069649397 0 0.172524797 1.8882986284e-17 -0.0392850764 2.3493044647e-24 7.4919300742e-16 1.2570311945e-16 0.036164452478 0.00026492740474 -3.2966321815e-11 0.036203079687 -0.00026492740474 3.2964535484e-11 0.036203079687 0.27192673088 -1.734723476e-17 -0.17415228486 0.27069649397 0 -0.172524797 0.26711363272 -1.1974942054e-17 -0.16778500813 0.30937984586 0 -0.2522572577 0.30192517751 0 -0.2367112432 0.27314733197 0 -0.17669773443 0.32836532593 0 -0.33371031284 0.32266834667 9.8462149666e-18 -0.30926866776 0.31406304645 0 -0.27234950687 0.32836532593 0 -0.41628968716 0.32836532593 0 -0.38971422635 0.32836532593 0 -0.36028577365 0.30937984586 2.1414328848e-17 -0.4977427423 0.31406304645 2.1700739201e-17 -0.47765049313 0.32266834667 0 -0.44073133224 0.27192673088 0 -0.57584768534 0.27314733197 -2.6409746232e-17 -0.57330223674 0.30192517751 0 -0.51328875087 0.26711363272 2.981762352e-17 -0.58221496599 0.27069649397 0 -0.5774751742 0.18910284015 1.4615867834e-19 -0.10152591765 0.15567018303 3.1982501993e-09 -0.081782001353 0.11945685202 -6.9388939039e-18 -0.060395944136 0.21471874774 -9.1680534009e-10 -0.12328299513 0.18910284015 7.6327832943e-17 -0.64847409725 0.21471874774 9.1680538064e-10 -0.62671700638 0.11945685202 -4.1246967093e-17 -0.68960407547 0.15567018303 -3.1982501175e-09 -0.66821801581 0.084245334712 -4.1420256382e-10 -0.053230671401 0.0013357793732 3.3328232481e-14 -0.036359213293 0.0013357793734 -1.8379180152e-20 -0.71364080906 0.084245334712 4.1420252463e-10 -0.69676934902 2.5130272163e-17 5.6342357555e-17 -0.71383556972 0.00026492740121 -3.5800634211e-11 -0.71379694254 -0.001335779373 -5.5709021832e-13 -0.036359213292 -0.084245334712 4.1420256259e-10 -0.053230671401 -0.11945685202 -2.8837501387e-19 -0.060395944136 -0.084245334712 -4.1420255572e-10 -0.69676934902 -0.0013357793734 -9.0124305588e-19 -0.71364080906 -0.11945685202 1.2064429234e-17 -0.68960407547 -0.00026492740121 3.5800726704e-11 -0.71379694254 -0.15567018303 -3.1982501959e-09 -0.081782001353 -0.18910284015 5.863387054e-20 -0.10152591765 -0.21471874774 9.1680533543e-10 -0.12328299513 -0.26711363272 1.1974942054e-17 -0.16778500813 -0.21471874774 -9.16805369e-10 -0.62671700638 -0.18910284015 -2.7168574339e-17 -0.64847409725 -0.26711363272 -2.981762352e-17 -0.58221496599 -0.15567018303 3.1982502117e-09 -0.66821801581 -0.27069649397 1.2313224346e-17 -0.172524797 -0.27192673088 -1.0408340856e-17 -0.17415228486 -0.27314733197 -1.6404615962e-17 -0.17669773443 -0.30192517751 -2.1976269538e-17 -0.2367112432 -0.30937984586 0 -0.2522572577 -0.31406304645 2.4627257152e-17 -0.27234950687 -0.32266834667 2.4100983075e-17 -0.30926866776 -0.32836532593 0 -0.33371031284 -0.32836532593 0 -0.36028577365 -0.32836532593 0 -0.38971422635 -0.32836532593 0 -0.41628968716 -0.32266834667 0 -0.44073133224 -0.31406304645 0 -0.47765049313 -0.30937984586 0 -0.4977427423 -0.30192517751 1.5062090412e-17 -0.51328875087 -0.27314733197 2.6409746232e-17 -0.57330223674 -0.27192673088 2.6252199938e-17 -0.57584768534 -0.27069649397 -3.0155905928e-17 -0.5774751742 0.00026492740119 3.5800326767e-11 -0.036203079689 -7.0437373612e-16 1.0134581512e-14 -0.036164452478 -0.00026492740119 -3.580032686e-11 -0.036203079689 0.082297295332 0.36765038967 0.86818063259 0.078269377351 0.393081652 0.86818063259 0 0.36765038967 0.875 0.066579908133 0.41602352634 0.86818063259 0.048373136669 0.4342302978 0.86818063259 0.025431262329 0.44591976702 0.86818063259 5.0392558428e-18 0.449947685 0.86818063259 -0.025431262329 0.44591976702 0.86818063259 -0.048373136669 0.4342302978 0.86818063259 -0.066579908133 0.41602352634 0.86818063259 -0.078269377351 0.393081652 0.86818063259 -0.082297295332 0.36765038967 0.86818063259 -0.078269377351 0.34221912734 0.86818063259 -0.066579908133 0.319277253 0.86818063259 -0.048373136669 0.30107048154 0.86818063259 -0.025431262329 0.28938101232 0.86818063259 -1.5117767942e-17 0.28535309434 0.86818063259 0.025431262329 0.28938101232 0.86818063259 0.048373136669 0.30107048154 0.86818063259 0.066579908133 0.319277253 0.86818063259 0.078269377351 0.34221912734 0.86818063259 0.16234973073 0.36765038967 0.84790861607 0.15440377593 0.41781921685 0.84790861607 0.23797369003 0.36765038967 0.81473690271 0.2263264358 0.44118830561 0.81473690271 0.30710634589 0.36765038967 0.76957023144 0.29207551479 0.46255147457 0.76957023144 0.36786195636 0.36765038967 0.71364080906 0.34985750914 0.481325984 0.71364080906 0.41858324409 0.36765038967 0.64847409725 0.39809632301 0.4969997257 0.64847409725 0.45788666606 0.36765038967 0.57584768534 0.43547609448 0.50914515555 0.57584768534 0.48470014334 0.36765038967 0.4977427423 0.4609772265 0.51743096113 0.4977427423 0.49829223752 0.36765038967 0.41628968716 0.47390407324 0.52163116634 0.41628968716 0.49829223752 0.36765038967 0.33371031284 0.47390407324 0.52163116634 0.33371031284 0.48470014334 0.36765038967 0.2522572577 0.4609772265 0.51743096113 0.2522572577 0.45788666606 0.36765038967 0.17415228486 0.43547609448 0.50914515555 0.17415228486 0.41858324409 0.36765038967 0.10152591765 0.39809632301 0.4969997257 0.10152591765 0.36786195636 0.36765038967 0.036359213293 0.34985750914 0.481325984 0.036359213293 0.13134369254 0.46307717264 0.84790861607 0.19252476096 0.50752781331 0.81473690271 0.24845425785 0.54816298187 0.76957023144 0.29760658741 0.58387422562 0.71364080906 0.33864095807 0.61368744075 0.64847409725 0.37043809891 0.63678941131 0.57584768534 0.39213064313 0.65254998207 0.4977427423 0.40312689543 0.66053920984 0.41628968716 0.40312689543 0.66053920984 0.33371031284 0.39213064313 0.65254998207 0.2522572577 0.37043809891 0.63678941131 0.17415228486 0.33864095807 0.61368744075 0.10152591765 0.29760658741 0.58387422562 0.036359213293 0.095426782966 0.49899408221 0.84790861607 0.13987742364 0.56017515063 0.81473690271 0.1805125922 0.61610464752 0.76957023144 0.21622383595 0.66525697708 0.71364080906 0.24603705108 0.70629134774 0.64847409725 0.26913902164 0.73808848858 0.57584768534 0.2848995924 0.7597810328 0.4977427423 0.29288882017 0.7707772851 0.41628968716 0.29288882017 0.7707772851 0.33371031284 0.2848995924 0.7597810328 0.2522572577 0.26913902164 0.73808848858 0.17415228486 0.24603705108 0.70629134774 0.10152591765 0.21622383595 0.66525697708 0.036359213293 0.050168827176 0.5220541656 0.84790861607 0.073537915945 0.59397682547 0.81473690271 0.0949010849 0.65972590446 0.76957023144 0.11367559433 0.71750789881 0.71364080906 0.12934933603 0.76574671268 0.64847409725 0.14149476588 0.80312648415 0.57584768534 0.14978057146 0.82862761617 0.4977427423 0.15398077667 0.84155446291 0.41628968716 0.15398077667 0.84155446291 0.33371031284 0.14978057146 0.82862761617 0.2522572577 0.14149476588 0.80312648415 0.17415228486 0.12934933603 0.76574671268 0.10152591765 0.11367559433 0.71750789881 0.036359213293 9.9410541201e-18 0.5300001204 0.84790861607 1.4571686463e-17 0.6056240797 0.81473690271 1.880484115e-17 0.67475673556 0.76957023144 2.2525047905e-17 0.73551234603 0.71364080906 2.5630831518e-17 0.78623363376 0.64847409725 2.8037472151e-17 0.82553705573 0.57584768534 2.9679323096e-17 0.85235053301 0.4977427423 3.0511599142e-17 0.86594262719 0.41628968716 3.0511599142e-17 0.86594262719 0.33371031284 2.9679323096e-17 0.85235053301 0.2522572577 2.8037472151e-17 0.82553705573 0.17415228486 2.5630831518e-17 0.78623363376 0.10152591765 2.2525047905e-17 0.73551234603 0.036359213293 -0.050168827176 0.5220541656 0.84790861607 -0.073537915945 0.59397682547 0.81473690271 -0.0949010849 0.65972590446 0.76957023144 -0.11367559433 0.71750789881 0.71364080906 -0.12934933603 0.76574671268 0.64847409725 -0.14149476588 0.80312648415 0.57584768534 -0.14978057146 0.82862761617 0.4977427423 -0.15398077667 0.84155446291 0.41628968716 -0.15398077667 0.84155446291 0.33371031284 -0.14978057146 0.82862761617 0.2522572577 -0.14149476588 0.80312648415 0.17415228486 -0.12934933603 0.76574671268 0.10152591765 -0.11367559433 0.71750789881 0.036359213293 -0.095426782966 0.49899408221 0.84790861607 -0.13987742364 0.56017515063 0.81473690271 -0.1805125922 0.61610464752 0.76957023144 -0.21622383595 0.66525697708 0.71364080906 -0.24603705108 0.70629134774 0.64847409725 -0.26913902164 0.73808848858 0.57584768534 -0.2848995924 0.7597810328 0.4977427423 -0.29288882017 0.7707772851 0.41628968716 -0.29288882017 0.7707772851 0.33371031284 -0.2848995924 0.7597810328 0.2522572577 -0.26913902164 0.73808848858 0.17415228486 -0.24603705108 0.70629134774 0.10152591765 -0.21622383595 0.66525697708 0.036359213293 -0.13134369254 0.46307717264 0.84790861607 -0.19252476096 0.50752781331 0.81473690271 -0.24845425785 0.54816298187 0.76957023144 -0.29760658741 0.58387422562 0.71364080906 -0.33864095807 0.61368744075 0.64847409725 -0.37043809891 0.63678941131 0.57584768534 -0.39213064313 0.65254998207 0.4977427423 -0.40312689543 0.66053920984 0.41628968716 -0.40312689543 0.66053920984 0.33371031284 -0.39213064313 0.65254998207 0.2522572577 -0.37043809891 0.63678941131 0.17415228486 -0.33864095807 0.61368744075 0.10152591765 -0.29760658741 0.58387422562 0.036359213293 -0.15440377593 0.41781921685 0.84790861607 -0.2263264358 0.44118830561 0.81473690271 -0.29207551479 0.46255147457 0.76957023144 -0.34985750914 0.481325984 0.71364080906 -0.39809632301 0.4969997257 0.64847409725 -0.43547609448 0.50914515555 0.57584768534 -0.4609772265 0.51743096113 0.4977427423 -0.47390407324 0.52163116634 0.41628968716 -0.47390407324 0.52163116634 0.33371031284 -0.4609772265 0.51743096113 0.2522572577 -0.43547609448 0.50914515555 0.17415228486 -0.39809632301 0.4969997257 0.10152591765 -0.34985750914 0.481325984 0.036359213293 -0.16234973073 0.36765038967 0.84790861607 -0.23797369003 0.36765038967 0.81473690271 -0.30710634589 0.36765038967 0.76957023144 -0.36786195636 0.36765038967 0.71364080906 -0.41858324409 0.36765038967 0.64847409725 -0.45788666606 0.36765038967 0.57584768534 -0.48470014334 0.36765038967 0.4977427423 -0.49829223752 0.36765038967 0.41628968716 -0.49829223752 0.36765038967 0.33371031284 -0.48470014334 0.36765038967 0.2522572577 -0.45788666606 0.36765038967 0.17415228486 -0.41858324409 0.36765038967 0.10152591765 -0.36786195636 0.36765038967 0.036359213293 -0.15440377593 0.31748156249 0.84790861607 -0.2263264358 0.29411247372 0.81473690271 -0.29207551479 0.27274930477 0.76957023144 -0.34985750914 0.25397479534 0.71364080906 -0.39809632301 0.23830105364 0.64847409725 -0.43547609448 0.22615562379 0.57584768534 -0.4609772265 0.21786981821 0.4977427423 -0.47390407324 0.213669613 0.41628968716 -0.47390407324 0.213669613 0.33371031284 -0.4609772265 0.21786981821 0.2522572577 -0.43547609448 0.22615562379 0.17415228486 -0.39809632301 0.23830105364 0.10152591765 -0.34985750914 0.25397479534 0.036359213293 -0.13134369254 0.2722236067 0.84790861607 -0.19252476096 0.22777296603 0.81473690271 -0.24845425785 0.18713779747 0.76957023144 -0.29760658741 0.15142655372 0.71364080906 -0.33864095807 0.12161333859 0.64847409725 -0.37043809891 0.09851136803 0.57584768534 -0.39213064313 0.08275079727 0.4977427423 -0.40312689543 0.0747615695 0.41628968716 -0.40312689543 0.0747615695 0.33371031284 -0.39213064313 0.08275079727 0.2522572577 -0.37043809891 0.09851136803 0.17415228486 -0.33864095807 0.12161333859 0.10152591765 -0.29760658741 0.15142655372 0.036359213293 -0.095426782966 0.23630669713 0.84790861607 -0.13987742364 0.17512562871 0.81473690271 -0.1805125922 0.11919613182 0.76957023144 -0.21622383595 0.07004380226 0.71364080906 -0.24603705108 0.0290094316 0.64847409725 -0.24603705108 0.0290094316 0.10152591765 -0.21622383595 0.07004380226 0.036359213293 -0.050168827176 0.21324661374 0.84790861607 -0.073537915945 0.14132395387 0.81473690271 -0.0949010849 0.07557487488 0.76957023144 -0.11367559433 0.01779288053 0.71364080906 -0.11367559433 0.01779288053 0.036359213293 -2.9823163188e-17 0.20530065894 0.84790861607 -4.3715059388e-17 0.12967669964 0.81473690271 -5.6414525104e-17 0.06054404378 0.76957023144 0.050168827176 0.21324661374 0.84790861607 0.073537915945 0.14132395387 0.81473690271 0.0949010849 0.07557487488 0.76957023144 0.11367559433 0.01779288053 0.71364080906 0.095426782966 0.23630669713 0.84790861607 0.13987742364 0.17512562871 0.81473690271 0.1805125922 0.11919613182 0.76957023144 0.21622383595 0.07004380226 0.71364080906 0.24603705108 0.0290094316 0.64847409725 0.13134369254 0.2722236067 0.84790861607 0.19252476096 0.22777296603 0.81473690271 0.24845425785 0.18713779747 0.76957023144 0.29760658741 0.15142655372 0.71364080906 0.33864095807 0.12161333859 0.64847409725 0.37043809891 0.09851136803 0.57584768534 0.24603705108 0.0290094316 0.10152591765 0.21622383595 0.07004380226 0.036359213293 0.29760658741 0.15142655372 0.036359213293 0.33864095807 0.12161333859 0.10152591765 0.15440377593 0.31748156249 0.84790861607 0.2263264358 0.29411247372 0.81473690271 0.29207551479 0.27274930477 0.76957023144 0.34985750914 0.25397479534 0.71364080906 0.39809632301 0.23830105364 0.64847409725 0.43547609448 0.22615562379 0.57584768534 0.39213064313 0.08275079727 0.4977427423 0.4609772265 0.21786981821 0.4977427423 0.40312689543 0.0747615695 0.41628968716 0.47390407324 0.213669613 0.41628968716 0.40312689543 0.0747615695 0.33371031284 0.47390407324 0.213669613 0.33371031284 0.39213064313 0.08275079727 0.2522572577 0.4609772265 0.21786981821 0.2522572577 0.37043809891 0.09851136803 0.17415228486 0.43547609448 0.22615562379 0.17415228486 0.39809632301 0.23830105364 0.10152591765 0.34985750914 0.25397479534 0.036359213293 0.32836531327 0.36765038967 -2.8171179001e-17 0.3220653893 0.40742657402 -4.9487070846e-09 0.31859390657 0.42934468853 -4.9487070599e-09 0.31229398553 0.46912085442 2.5407916269e-17 0.29401088933 0.50500345075 5.1429095066e-09 0.28393623162 0.52477607291 5.1429095066e-09 0.2656531266 0.56065868654 6.9388939039e-18 0.23717652592 0.58913528722 0 0.22148489755 0.60482691559 0 0.19300829687 0.63330351627 0 0.15712568324 0.65158662129 -5.1429094891e-09 0.13735306108 0.661661279 -5.1429095118e-09 0.10147046475 0.6799443752 -2.5197041461e-17 0.06169429886 0.68624429624 4.9487070318e-09 0.03977618435 0.68971577897 4.948707057e-09 1.8882986284e-17 0.69601570294 2.3493044647e-24 -0.03977618435 0.68971577897 -4.9487070858e-09 -0.06169429886 0.68624429624 -4.948707057e-09 -0.10147046475 0.6799443752 -4.4034066554e-18 -0.13735306108 0.661661279 5.1429095118e-09 -0.15712568324 0.65158662129 5.1429095066e-09 -0.19300829687 0.63330351627 2.0768586122e-18 -0.22148489755 0.60482691559 0 -0.23717652592 0.58913528722 0 -0.2656531266 0.56065868654 0 -0.28393623162 0.52477607291 -5.1429094753e-09 -0.29401088933 0.50500345075 -5.1429095118e-09 -0.31229398553 0.46912085442 -2.5407916269e-17 -0.31859390657 0.42934468853 4.9487070561e-09 -0.3220653893 0.40742657402 4.9487070561e-09 -0.32836531327 0.36765038967 4.8381435661e-24 -0.3220653893 0.32787420532 -4.9487070852e-09 -0.31859390657 0.30595609081 -4.9487070599e-09 -0.31229398553 0.26617992492 -2.9741361642e-18 -0.29401088933 0.23029732859 5.1429095066e-09 -0.28393623162 0.21052470643 5.1429095066e-09 -0.2656531266 0.1746420928 6.9388939039e-18 -0.23717652592 0.14616549212 0 -0.22148489755 0.13047386375 0 -0.19300829687 0.10199726307 0 -0.15712568324 0.08371415805 -5.1429094753e-09 -0.13735306108 0.07363950034 -5.1429094753e-09 -0.10147046475 0.05535640414 -2.540791296e-17 -0.06169429886 0.0490564831 4.9487070561e-09 -0.03977618435 0.04558500037 4.9487070565e-09 0.11367559433 0.01779288053 0.036359213293 0.10147046475 0.05535640414 -1.5448640187e-18 0.13735306108 0.07363950034 5.1429095066e-09 0.15712568324 0.08371415805 5.1429094891e-09 0.19300829687 0.10199726307 0 0.22148489755 0.13047386375 0 0.23717652592 0.14616549212 0 0.2656531266 0.1746420928 -2.0768619209e-18 0.28393623162 0.21052470643 -5.1429094753e-09 0.29401088933 0.23029732859 -5.1429095118e-09 0.31229398553 0.26617992492 2.9741345099e-18 0.31859390657 0.30595609081 4.9487070561e-09 0.3220653893 0.32787420532 4.9487070565e-09 0.082297295332 0.36765038967 -0.86818063259 0 0.36765038967 -0.875 0.078269377351 0.393081652 -0.86818063259 0.066579908133 0.41602352634 -0.86818063259 0.048373136669 0.4342302978 -0.86818063259 0.025431262329 0.44591976702 -0.86818063259 5.0392558428e-18 0.449947685 -0.86818063259 -0.025431262329 0.44591976702 -0.86818063259 -0.048373136669 0.4342302978 -0.86818063259 -0.066579908133 0.41602352634 -0.86818063259 -0.078269377351 0.393081652 -0.86818063259 -0.082297295332 0.36765038967 -0.86818063259 -0.078269377351 0.34221912734 -0.86818063259 -0.066579908133 0.319277253 -0.86818063259 -0.048373136669 0.30107048154 -0.86818063259 -0.025431262329 0.28938101232 -0.86818063259 -1.5117767942e-17 0.28535309434 -0.86818063259 0.025431262329 0.28938101232 -0.86818063259 0.048373136669 0.30107048154 -0.86818063259 0.066579908133 0.319277253 -0.86818063259 0.078269377351 0.34221912734 -0.86818063259 0.36786195636 0.36765038967 -0.036359213293 0.41858324409 0.36765038967 -0.10152591765 0.39809632301 0.4969997257 -0.10152591765 0.34985750914 0.481325984 -0.036359213293 0.45788666606 0.36765038967 -0.17415228486 0.43547609448 0.50914515555 -0.17415228486 0.48470014334 0.36765038967 -0.2522572577 0.4609772265 0.51743096113 -0.2522572577 0.49829223752 0.36765038967 -0.33371031284 0.47390407324 0.52163116634 -0.33371031284 0.49829223752 0.36765038967 -0.41628968716 0.47390407324 0.52163116634 -0.41628968716 0.48470014334 0.36765038967 -0.4977427423 0.4609772265 0.51743096113 -0.4977427423 0.45788666606 0.36765038967 -0.57584768534 0.43547609448 0.50914515555 -0.57584768534 0.41858324409 0.36765038967 -0.64847409725 0.39809632301 0.4969997257 -0.64847409725 0.36786195636 0.36765038967 -0.71364080906 0.34985750914 0.481325984 -0.71364080906 0.30710634589 0.36765038967 -0.76957023144 0.29207551479 0.46255147457 -0.76957023144 0.23797369003 0.36765038967 -0.81473690271 0.2263264358 0.44118830561 -0.81473690271 0.16234973073 0.36765038967 -0.84790861607 0.15440377593 0.41781921685 -0.84790861607 0.33864095807 0.61368744075 -0.10152591765 0.29760658741 0.58387422562 -0.036359213293 0.37043809891 0.63678941131 -0.17415228486 0.39213064313 0.65254998207 -0.2522572577 0.40312689543 0.66053920984 -0.33371031284 0.40312689543 0.66053920984 -0.41628968716 0.39213064313 0.65254998207 -0.4977427423 0.37043809891 0.63678941131 -0.57584768534 0.33864095807 0.61368744075 -0.64847409725 0.29760658741 0.58387422562 -0.71364080906 0.24845425785 0.54816298187 -0.76957023144 0.19252476096 0.50752781331 -0.81473690271 0.13134369254 0.46307717264 -0.84790861607 0.24603705108 0.70629134774 -0.10152591765 0.21622383595 0.66525697708 -0.036359213293 0.26913902164 0.73808848858 -0.17415228486 0.2848995924 0.7597810328 -0.2522572577 0.29288882017 0.7707772851 -0.33371031284 0.29288882017 0.7707772851 -0.41628968716 0.2848995924 0.7597810328 -0.4977427423 0.26913902164 0.73808848858 -0.57584768534 0.24603705108 0.70629134774 -0.64847409725 0.21622383595 0.66525697708 -0.71364080906 0.1805125922 0.61610464752 -0.76957023144 0.13987742364 0.56017515063 -0.81473690271 0.095426782966 0.49899408221 -0.84790861607 0.12934933603 0.76574671268 -0.10152591765 0.11367559433 0.71750789881 -0.036359213293 0.14149476588 0.80312648415 -0.17415228486 0.14978057146 0.82862761617 -0.2522572577 0.15398077667 0.84155446291 -0.33371031284 0.15398077667 0.84155446291 -0.41628968716 0.14978057146 0.82862761617 -0.4977427423 0.14149476588 0.80312648415 -0.57584768534 0.12934933603 0.76574671268 -0.64847409725 0.11367559433 0.71750789881 -0.71364080906 0.0949010849 0.65972590446 -0.76957023144 0.073537915945 0.59397682547 -0.81473690271 0.050168827176 0.5220541656 -0.84790861607 2.5630831518e-17 0.78623363376 -0.10152591765 2.2525047905e-17 0.73551234603 -0.036359213293 2.8037472151e-17 0.82553705573 -0.17415228486 2.9679323096e-17 0.85235053301 -0.2522572577 3.0511599142e-17 0.86594262719 -0.33371031284 3.0511599142e-17 0.86594262719 -0.41628968716 2.9679323096e-17 0.85235053301 -0.4977427423 2.8037472151e-17 0.82553705573 -0.57584768534 2.5630831518e-17 0.78623363376 -0.64847409725 2.2525047905e-17 0.73551234603 -0.71364080906 1.880484115e-17 0.67475673556 -0.76957023144 1.4571686463e-17 0.6056240797 -0.81473690271 9.9410541201e-18 0.5300001204 -0.84790861607 -0.12934933603 0.76574671268 -0.10152591765 -0.11367559433 0.71750789881 -0.036359213293 -0.14149476588 0.80312648415 -0.17415228486 -0.14978057146 0.82862761617 -0.2522572577 -0.15398077667 0.84155446291 -0.33371031284 -0.15398077667 0.84155446291 -0.41628968716 -0.14978057146 0.82862761617 -0.4977427423 -0.14149476588 0.80312648415 -0.57584768534 -0.12934933603 0.76574671268 -0.64847409725 -0.11367559433 0.71750789881 -0.71364080906 -0.0949010849 0.65972590446 -0.76957023144 -0.073537915945 0.59397682547 -0.81473690271 -0.050168827176 0.5220541656 -0.84790861607 -0.24603705108 0.70629134774 -0.10152591765 -0.21622383595 0.66525697708 -0.036359213293 -0.26913902164 0.73808848858 -0.17415228486 -0.2848995924 0.7597810328 -0.2522572577 -0.29288882017 0.7707772851 -0.33371031284 -0.29288882017 0.7707772851 -0.41628968716 -0.2848995924 0.7597810328 -0.4977427423 -0.26913902164 0.73808848858 -0.57584768534 -0.24603705108 0.70629134774 -0.64847409725 -0.21622383595 0.66525697708 -0.71364080906 -0.1805125922 0.61610464752 -0.76957023144 -0.13987742364 0.56017515063 -0.81473690271 -0.095426782966 0.49899408221 -0.84790861607 -0.33864095807 0.61368744075 -0.10152591765 -0.29760658741 0.58387422562 -0.036359213293 -0.37043809891 0.63678941131 -0.17415228486 -0.39213064313 0.65254998207 -0.2522572577 -0.40312689543 0.66053920984 -0.33371031284 -0.40312689543 0.66053920984 -0.41628968716 -0.39213064313 0.65254998207 -0.4977427423 -0.37043809891 0.63678941131 -0.57584768534 -0.33864095807 0.61368744075 -0.64847409725 -0.29760658741 0.58387422562 -0.71364080906 -0.24845425785 0.54816298187 -0.76957023144 -0.19252476096 0.50752781331 -0.81473690271 -0.13134369254 0.46307717264 -0.84790861607 -0.39809632301 0.4969997257 -0.10152591765 -0.34985750914 0.481325984 -0.036359213293 -0.43547609448 0.50914515555 -0.17415228486 -0.4609772265 0.51743096113 -0.2522572577 -0.47390407324 0.52163116634 -0.33371031284 -0.47390407324 0.52163116634 -0.41628968716 -0.4609772265 0.51743096113 -0.4977427423 -0.43547609448 0.50914515555 -0.57584768534 -0.39809632301 0.4969997257 -0.64847409725 -0.34985750914 0.481325984 -0.71364080906 -0.29207551479 0.46255147457 -0.76957023144 -0.2263264358 0.44118830561 -0.81473690271 -0.15440377593 0.41781921685 -0.84790861607 -0.41858324409 0.36765038967 -0.10152591765 -0.36786195636 0.36765038967 -0.036359213293 -0.45788666606 0.36765038967 -0.17415228486 -0.48470014334 0.36765038967 -0.2522572577 -0.49829223752 0.36765038967 -0.33371031284 -0.49829223752 0.36765038967 -0.41628968716 -0.48470014334 0.36765038967 -0.4977427423 -0.45788666606 0.36765038967 -0.57584768534 -0.41858324409 0.36765038967 -0.64847409725 -0.36786195636 0.36765038967 -0.71364080906 -0.30710634589 0.36765038967 -0.76957023144 -0.23797369003 0.36765038967 -0.81473690271 -0.16234973073 0.36765038967 -0.84790861607 -0.39809632301 0.23830105364 -0.10152591765 -0.34985750914 0.25397479534 -0.036359213293 -0.43547609448 0.22615562379 -0.17415228486 -0.4609772265 0.21786981821 -0.2522572577 -0.47390407324 0.213669613 -0.33371031284 -0.47390407324 0.213669613 -0.41628968716 -0.4609772265 0.21786981821 -0.4977427423 -0.43547609448 0.22615562379 -0.57584768534 -0.39809632301 0.23830105364 -0.64847409725 -0.34985750914 0.25397479534 -0.71364080906 -0.29207551479 0.27274930477 -0.76957023144 -0.2263264358 0.29411247372 -0.81473690271 -0.15440377593 0.31748156249 -0.84790861607 -0.33864095807 0.12161333859 -0.10152591765 -0.29760658741 0.15142655372 -0.036359213293 -0.37043809891 0.09851136803 -0.17415228486 -0.39213064313 0.08275079727 -0.2522572577 -0.40312689543 0.0747615695 -0.33371031284 -0.40312689543 0.0747615695 -0.41628968716 -0.39213064313 0.08275079727 -0.4977427423 -0.37043809891 0.09851136803 -0.57584768534 -0.33864095807 0.12161333859 -0.64847409725 -0.29760658741 0.15142655372 -0.71364080906 -0.24845425785 0.18713779747 -0.76957023144 -0.19252476096 0.22777296603 -0.81473690271 -0.13134369254 0.2722236067 -0.84790861607 -0.24603705108 0.0290094316 -0.10152591765 -0.21622383595 0.07004380226 -0.036359213293 -0.24603705108 0.0290094316 -0.64847409725 -0.21622383595 0.07004380226 -0.71364080906 -0.1805125922 0.11919613182 -0.76957023144 -0.13987742364 0.17512562871 -0.81473690271 -0.095426782966 0.23630669713 -0.84790861607 -0.11367559433 0.01779288053 -0.71364080906 -0.0949010849 0.07557487488 -0.76957023144 -0.073537915945 0.14132395387 -0.81473690271 -0.050168827176 0.21324661374 -0.84790861607 -5.6414525104e-17 0.06054404378 -0.76957023144 -4.3715059388e-17 0.12967669964 -0.81473690271 -2.9823163188e-17 0.20530065894 -0.84790861607 0.073537915945 0.14132395387 -0.81473690271 0.0949010849 0.07557487488 -0.76957023144 0.050168827176 0.21324661374 -0.84790861607 0.11367559433 0.01779288053 -0.036359213293 0.24603705108 0.0290094316 -0.10152591765 0.21622383595 0.07004380226 -0.036359213293 0.11367559433 0.01779288053 -0.71364080906 0.1805125922 0.11919613182 -0.76957023144 0.21622383595 0.07004380226 -0.71364080906 0.13987742364 0.17512562871 -0.81473690271 0.095426782966 0.23630669713 -0.84790861607 0.33864095807 0.12161333859 -0.10152591765 0.29760658741 0.15142655372 -0.036359213293 0.37043809891 0.09851136803 -0.17415228486 0.24603705108 0.0290094316 -0.64847409725 0.29760658741 0.15142655372 -0.71364080906 0.33864095807 0.12161333859 -0.64847409725 0.24845425785 0.18713779747 -0.76957023144 0.19252476096 0.22777296603 -0.81473690271 0.13134369254 0.2722236067 -0.84790861607 0.39809632301 0.23830105364 -0.10152591765 0.34985750914 0.25397479534 -0.036359213293 0.43547609448 0.22615562379 -0.17415228486 0.39213064313 0.08275079727 -0.2522572577 0.4609772265 0.21786981821 -0.2522572577 0.40312689543 0.0747615695 -0.33371031284 0.47390407324 0.213669613 -0.33371031284 0.40312689543 0.0747615695 -0.41628968716 0.47390407324 0.213669613 -0.41628968716 0.39213064313 0.08275079727 -0.4977427423 0.4609772265 0.21786981821 -0.4977427423 0.37043809891 0.09851136803 -0.57584768534 0.43547609448 0.22615562379 -0.57584768534 0.39809632301 0.23830105364 -0.64847409725 0.34985750914 0.25397479534 -0.71364080906 0.29207551479 0.27274930477 -0.76957023144 0.2263264358 0.29411247372 -0.81473690271 0.15440377593 0.31748156249 -0.84790861607 -0.11367559433 0.01779288053 -0.036359213293 0.06169429886 0.0490564831 -4.9487070591e-09 0.03977618435 0.04558500037 -4.9487070556e-09 -5.8492876492e-17 0.0392850764 -8.5284299912e-18 POLYGONS 2113 6688 OFFSETS vtktypeint64 0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267 270 273 276 279 282 285 288 291 294 297 300 303 306 309 312 315 318 321 324 327 330 333 336 339 342 345 348 351 354 357 360 363 366 369 372 375 378 381 384 387 390 393 396 399 402 405 408 411 414 417 420 423 426 429 432 435 438 441 444 447 450 453 456 459 462 465 468 471 474 477 480 483 486 489 492 495 498 501 504 507 510 513 516 519 522 525 528 531 534 537 540 543 546 549 552 555 558 561 564 567 570 573 576 579 582 585 588 591 594 597 600 603 606 609 612 615 618 621 624 627 630 633 636 639 642 645 648 651 654 657 660 663 666 669 672 675 678 681 684 687 690 693 696 699 702 705 708 711 714 717 720 723 726 729 732 735 738 741 744 747 750 753 756 759 762 765 768 771 774 777 780 783 786 789 792 795 798 801 804 807 810 813 816 819 822 825 828 831 834 837 840 843 846 849 852 855 858 861 864 867 870 873 876 879 882 885 888 891 894 897 900 903 906 909 912 915 918 921 924 927 930 933 936 939 942 945 948 951 954 957 960 963 966 969 972 975 978 981 984 987 990 993 996 999 1002 1005 1008 1011 1014 1017 1020 1023 1026 1029 1032 1035 1038 1041 1044 1047 1050 1053 1056 1059 1062 1065 1068 1071 1074 1077 1080 1083 1086 1089 1092 1095 1098 1101 1104 1107 1110 1113 1116 1119 1122 1125 1128 1131 1134 1137 1140 1143 1146 1149 1152 1155 1158 1161 1164 1167 1170 1173 1176 1179 1182 1185 1188 1191 1194 1197 1200 1203 1206 1209 1212 1215 1218 1221 1224 1227 1230 1233 1236 1239 1242 1245 1248 1251 1254 1257 1260 1263 1266 1269 1272 1275 1278 1281 1284 1287 1290 1293 1296 1299 1302 1305 1308 1311 1314 1317 1320 1323 1327 1331 1335 1339 1343 1347 1351 1355 1359 1363 1367 1371 1375 1379 1383 1387 1391 1395 1399 1403 1407 1411 1415 1419 1423 1427 1431 1435 1439 1443 1447 1451 1455 1459 1463 1467 1471 1474 1477 1480 1483 1486 1489 1492 1495 1498 1501 1504 1507 1510 1513 1516 1519 1522 1525 1528 1531 1534 1537 1540 1543 1546 1549 1552 1555 1558 1561 1564 1567 1570 1573 1576 1579 1582 1585 1588 1591 1594 1597 1600 1603 1606 1609 1612 1615 1618 1621 1624 1627 1630 1633 1636 1639 1642 1645 1648 1651 1654 1657 1660 1663 1666 1669 1672 1675 1678 1681 1684 1687 1690 1693 1696 1699 1702 1705 1708 1711 1714 1717 1720 1723 1726 1729 1732 1735 1738 1741 1744 1747 1750 1753 1756 1759 1762 1765 1768 1771 1774 1777 1780 1783 1786 1789 1792 1795 1798 1801 1804 1807 1810 1813 1816 1819 1822 1825 1828 1831 1834 1837 1840 1843 1846 1849 1852 1855 1858 1861 1864 1867 1870 1873 1876 1879 1882 1885 1888 1891 1894 1897 1900 1903 1906 1909 1912 1915 1918 1921 1924 1927 1930 1933 1936 1939 1942 1945 1948 1951 1954 1957 1960 1963 1966 1969 1972 1975 1978 1981 1984 1987 1990 1993 1996 1999 2002 2005 2008 2011 2014 2017 2020 2023 2026 2029 2032 2035 2038 2041 2044 2047 2050 2053 2056 2059 2062 2065 2068 2071 2074 2077 2080 2083 2086 2089 2092 2095 2098 2101 2104 2107 2110 2113 2116 2119 2122 2125 2128 2131 2134 2137 2140 2143 2146 2149 2152 2155 2158 2161 2164 2167 2170 2173 2176 2179 2182 2185 2188 2191 2194 2197 2200 2203 2206 2209 2212 2215 2218 2221 2224 2227 2230 2233 2236 2239 2242 2245 2248 2251 2254 2257 2260 2263 2266 2269 2272 2275 2278 2281 2284 2287 2290 2293 2296 2299 2302 2305 2308 2311 2314 2317 2320 2323 2326 2329 2332 2335 2338 2341 2344 2347 2350 2353 2356 2359 2362 2365 2368 2371 2374 2377 2380 2383 2386 2389 2392 2395 2398 2401 2404 2407 2410 2413 2416 2419 2422 2425 2428 2431 2434 2437 2440 2443 2446 2449 2452 2455 2458 2461 2464 2467 2470 2473 2476 2479 2482 2485 2488 2491 2494 2497 2500 2503 2506 2509 2512 2515 2518 2521 2524 2527 2530 2533 2536 2539 2542 2545 2548 2551 2554 2557 2560 2563 2566 2569 2572 2575 2578 2581 2584 2587 2590 2593 2596 2599 2602 2605 2608 2611 2614 2617 2620 2623 2626 2629 2632 2635 2638 2641 2644 2647 2650 2653 2656 2659 2662 2665 2668 2671 2674 2677 2680 2683 2686 2689 2692 2695 2698 2701 2704 2707 2710 2713 2716 2719 2722 2725 2728 2731 2734 2737 2740 2743 2746 2749 2752 2755 2758 2761 2764 2767 2770 2773 2776 2779 2782 2785 2788 2791 2794 2798 2802 2806 2810 2814 2818 2822 2826 2830 2834 2838 2842 2846 2850 2854 2858 2862 2866 2870 2874 2878 2882 2886 2890 2894 2898 2902 2906 2910 2914 2918 2922 2926 2930 2934 2938 2942 2946 2950 2954 2958 2962 2966 2970 2974 2978 2982 2986 2990 2995 2999 3003 3006 3009 3013 3018 3022 3026 3029 3032 3036 3041 3045 3048 3051 3056 3060 3063 3066 3070 3074 3079 3083 3087 3091 3095 3099 3103 3107 3111 3115 3119 3123 3127 3133 3138 3143 3147 3151 3155 3159 3163 3167 3171 3175 3179 3183 3187 3191 3196 3200 3204 3207 3210 3214 3219 3222 3225 3229 3234 3238 3241 3244 3248 3252 3257 3261 3264 3267 3271 3275 3280 3284 3288 3292 3296 3300 3304 3308 3312 3316 3320 3324 3328 3333 3338 3344 3347 3350 3353 3356 3359 3362 3365 3368 3371 3374 3377 3380 3383 3386 3389 3392 3395 3398 3401 3404 3407 3410 3413 3416 3419 3422 3425 3428 3431 3434 3437 3440 3443 3446 3449 3452 3455 3458 3461 3464 3467 3470 3473 3476 3479 3482 3485 3488 3491 3494 3497 3500 3503 3506 3509 3512 3515 3518 3521 3524 3527 3530 3533 3536 3539 3542 3545 3548 3551 3554 3557 3560 3563 3566 3569 3572 3575 3578 3581 3584 3587 3590 3593 3596 3599 3602 3605 3608 3611 3614 3617 3620 3623 3626 3629 3632 3635 3638 3641 3644 3647 3650 3653 3656 3659 3662 3665 3668 3671 3674 3677 3680 3683 3686 3689 3692 3695 3698 3701 3704 3707 3710 3713 3716 3719 3722 3725 3728 3731 3734 3737 3740 3743 3746 3749 3752 3755 3758 3761 3764 3767 3770 3773 3776 3779 3782 3785 3788 3791 3794 3797 3800 3803 3806 3809 3812 3815 3818 3821 3824 3827 3830 3833 3836 3839 3842 3845 3848 3851 3854 3857 3860 3863 3866 3869 3872 3875 3878 3881 3884 3887 3890 3893 3896 3899 3902 3905 3908 3911 3914 3917 3920 3923 3926 3929 3932 3935 3938 3941 3944 3947 3950 3953 3956 3959 3962 3965 3968 3971 3974 3977 3980 3983 3986 3989 3992 3995 3998 4001 4004 4007 4010 4013 4016 4019 4022 4025 4028 4031 4034 4037 4040 4043 4046 4049 4052 4055 4058 4061 4064 4067 4070 4073 4076 4079 4082 4085 4088 4091 4094 4097 4100 4103 4106 4109 4112 4115 4118 4121 4124 4127 4130 4133 4136 4139 4142 4145 4148 4151 4154 4157 4160 4163 4166 4169 4172 4175 4178 4181 4184 4187 4190 4193 4196 4199 4202 4205 4208 4211 4214 4217 4220 4223 4226 4229 4232 4235 4238 4241 4244 4247 4250 4253 4256 4259 4262 4265 4268 4271 4274 4277 4280 4283 4286 4289 4292 4295 4298 4301 4304 4307 4310 4313 4316 4319 4322 4325 4328 4331 4334 4337 4340 4343 4346 4349 4352 4355 4358 4361 4364 4367 4370 4373 4376 4379 4382 4385 4388 4391 4394 4397 4400 4403 4406 4409 4412 4415 4418 4421 4424 4427 4430 4433 4436 4439 4442 4445 4448 4451 4454 4457 4460 4463 4466 4469 4472 4475 4478 4481 4484 4487 4490 4493 4496 4499 4502 4505 4508 4511 4514 4517 4520 4523 4526 4529 4532 4535 4538 4541 4544 4547 4550 4553 4556 4559 4562 4565 4568 4571 4574 4577 4580 4583 4586 4589 4592 4595 4598 4601 4604 4607 4610 4613 4616 4619 4622 4625 4628 4631 4634 4637 4640 4643 4646 4649 4652 4655 4658 4661 4664 4667 4671 4675 4679 4683 4687 4691 4695 4699 4703 4707 4711 4715 4719 4723 4727 4731 4735 4739 4743 4747 4751 4755 4759 4763 4767 4771 4775 4779 4783 4787 4791 4795 4799 4803 4807 4811 4815 4818 4821 4824 4827 4830 4833 4836 4839 4842 4845 4848 4851 4854 4857 4860 4863 4866 4869 4872 4875 4878 4881 4884 4887 4890 4893 4896 4899 4902 4905 4908 4911 4914 4917 4920 4923 4926 4929 4932 4935 4938 4941 4944 4947 4950 4953 4956 4959 4962 4965 4968 4971 4974 4977 4980 4983 4986 4989 4992 4995 4998 5001 5004 5007 5010 5013 5016 5019 5022 5025 5028 5031 5034 5037 5040 5043 5046 5049 5052 5055 5058 5061 5064 5067 5070 5073 5076 5079 5082 5085 5088 5091 5094 5097 5100 5103 5106 5109 5112 5115 5118 5121 5124 5127 5130 5133 5136 5139 5142 5145 5148 5151 5154 5157 5160 5163 5166 5169 5172 5175 5178 5181 5184 5187 5190 5193 5196 5199 5202 5205 5208 5211 5214 5217 5220 5223 5226 5229 5232 5235 5238 5241 5244 5247 5250 5253 5256 5259 5262 5265 5268 5271 5274 5277 5280 5283 5286 5289 5292 5295 5298 5301 5304 5307 5310 5313 5316 5319 5322 5325 5328 5331 5334 5337 5340 5343 5346 5349 5352 5355 5358 5361 5364 5367 5370 5373 5376 5379 5382 5385 5388 5391 5394 5397 5400 5403 5406 5409 5412 5415 5418 5421 5424 5427 5430 5433 5436 5439 5442 5445 5448 5451 5454 5457 5460 5463 5466 5469 5472 5475 5478 5481 5484 5487 5490 5493 5496 5499 5502 5505 5508 5511 5514 5517 5520 5523 5526 5529 5532 5535 5538 5541 5544 5547 5550 5553 5556 5559 5562 5565 5568 5571 5574 5577 5580 5583 5586 5589 5592 5595 5598 5601 5604 5607 5610 5613 5616 5619 5622 5625 5628 5631 5634 5637 5640 5643 5646 5649 5652 5655 5658 5661 5664 5667 5670 5673 5676 5679 5682 5685 5688 5691 5694 5697 5700 5703 5706 5709 5712 5715 5718 5721 5724 5727 5730 5733 5736 5739 5742 5745 5748 5751 5754 5757 5760 5763 5766 5769 5772 5775 5778 5781 5784 5787 5790 5793 5796 5799 5802 5805 5808 5811 5814 5817 5820 5823 5826 5829 5832 5835 5838 5841 5844 5847 5850 5853 5856 5859 5862 5865 5868 5871 5874 5877 5880 5883 5886 5889 5892 5895 5898 5901 5904 5907 5910 5913 5916 5919 5922 5925 5928 5931 5934 5937 5940 5943 5946 5949 5952 5955 5958 5961 5964 5967 5970 5973 5976 5979 5982 5985 5988 5991 5994 5997 6000 6003 6006 6009 6012 6015 6018 6021 6024 6027 6030 6033 6036 6039 6042 6045 6048 6051 6054 6057 6060 6063 6066 6069 6072 6075 6078 6081 6084 6087 6090 6093 6096 6099 6102 6105 6108 6111 6114 6117 6120 6123 6126 6129 6132 6135 6138 6142 6146 6150 6154 6158 6162 6166 6170 6174 6178 6182 6186 6190 6194 6198 6202 6206 6210 6214 6218 6222 6226 6230 6234 6238 6242 6246 6250 6254 6258 6262 6266 6270 6274 6278 6282 6286 6290 6294 6298 6302 6306 6310 6314 6318 6322 6326 6330 6334 6339 6343 6347 6350 6353 6357 6362 6366 6370 6373 6376 6380 6385 6389 6392 6395 6400 6404 6407 6410 6414 6418 6423 6427 6431 6435 6439 6443 6447 6451 6455 6459 6463 6467 6471 6477 6482 6487 6491 6495 6499 6503 6507 6511 6515 6519 6523 6527 6531 6535 6540 6544 6548 6551 6554 6558 6563 6566 6569 6573 6578 6582 6585 6588 6592 6596 6601 6605 6608 6611 6615 6619 6624 6628 6632 6636 6640 6644 6648 6652 6656 6660 6664 6668 6672 6677 6682 6688 CONNECTIVITY vtktypeint64 0 1 2 1 3 2 3 4 2 4 5 2 5 6 2 6 7 2 7 8 2 8 9 2 9 10 2 10 11 2 11 12 2 12 13 2 13 14 2 14 15 2 15 16 2 16 17 2 17 18 2 18 19 2 19 20 2 20 0 2 0 21 22 0 22 1 21 23 24 21 24 22 23 25 26 23 26 24 25 27 28 25 28 26 27 29 30 27 30 28 29 31 32 29 32 30 31 33 34 31 34 32 33 35 36 33 36 34 35 37 38 35 38 36 37 39 40 37 40 38 39 41 42 39 42 40 41 43 44 41 44 42 43 45 46 43 46 44 1 22 47 1 47 3 22 24 48 22 48 47 24 26 49 24 49 48 26 28 50 26 50 49 28 30 51 28 51 50 30 32 52 30 52 51 32 34 53 32 53 52 34 36 54 34 54 53 36 38 55 36 55 54 38 40 56 38 56 55 40 42 57 40 57 56 42 44 58 42 58 57 44 46 59 44 59 58 3 47 60 3 60 4 47 48 61 47 61 60 48 49 62 48 62 61 49 50 63 49 63 62 50 51 64 50 64 63 57 58 65 58 59 66 58 66 65 4 60 67 4 67 5 60 61 68 60 68 67 61 62 69 61 69 68 62 63 70 62 70 69 65 66 71 5 67 72 5 72 6 67 68 73 67 73 72 68 69 74 68 74 73 6 72 75 6 75 7 72 73 76 72 76 75 73 74 77 73 77 76 74 78 77 7 75 79 7 79 8 75 76 80 75 80 79 76 77 81 76 81 80 77 78 82 77 82 81 78 83 82 8 79 84 8 84 9 79 80 85 79 85 84 80 81 86 80 86 85 81 82 87 81 87 86 82 83 88 82 88 87 83 89 88 90 91 92 90 92 93 9 84 94 9 94 10 84 85 95 84 95 94 85 86 96 85 96 95 86 87 97 86 97 96 87 88 98 87 98 97 88 89 99 88 99 98 89 100 101 89 101 99 100 102 103 100 103 101 102 104 105 102 105 103 104 106 107 104 107 105 106 108 109 106 109 107 108 93 110 108 110 109 93 92 111 93 111 110 10 94 112 10 112 11 94 95 113 94 113 112 95 96 114 95 114 113 96 97 115 96 115 114 97 98 116 97 116 115 98 99 117 98 117 116 99 101 118 99 118 117 101 103 119 101 119 118 103 105 120 103 120 119 105 107 121 105 121 120 107 109 122 107 122 121 109 110 123 109 123 122 110 111 124 110 124 123 11 112 125 11 125 12 112 113 126 112 126 125 113 114 127 113 127 126 114 115 128 114 128 127 115 116 129 115 129 128 116 117 130 116 130 129 117 118 131 117 131 130 118 119 132 118 132 131 119 120 133 119 133 132 120 121 134 120 134 133 121 122 135 121 135 134 122 123 136 122 136 135 123 124 137 123 137 136 12 125 138 12 138 13 125 126 139 125 139 138 126 127 140 126 140 139 127 128 141 127 141 140 128 129 142 128 142 141 129 130 143 129 143 142 130 131 144 130 144 143 131 132 145 131 145 144 132 133 146 132 146 145 133 134 147 133 147 146 134 135 148 134 148 147 135 136 149 135 149 148 136 137 150 136 150 149 13 138 151 13 151 14 138 139 152 138 152 151 139 140 153 139 153 152 140 141 154 140 154 153 141 142 155 141 155 154 142 143 156 142 156 155 143 144 157 143 157 156 144 145 158 144 158 157 145 146 159 145 159 158 146 147 160 146 160 159 147 148 161 147 161 160 148 149 162 148 162 161 149 150 163 149 163 162 14 151 164 14 164 15 151 152 165 151 165 164 152 153 166 152 166 165 153 154 167 153 167 166 154 155 168 154 168 167 155 156 169 155 169 168 156 157 170 156 170 169 157 158 171 157 171 170 158 159 172 158 172 171 159 160 173 159 173 172 160 161 174 160 174 173 161 162 175 161 175 174 162 163 176 162 176 175 15 164 177 15 177 16 164 165 178 164 178 177 165 166 179 165 179 178 166 167 180 166 180 179 167 168 181 167 181 180 168 169 182 168 182 181 169 170 183 169 183 182 170 171 184 170 184 183 171 172 185 171 185 184 172 173 186 172 186 185 173 174 187 173 187 186 174 175 188 174 188 187 175 176 189 175 189 188 16 177 190 16 190 17 177 178 191 177 191 190 178 179 192 178 192 191 179 180 193 179 193 192 180 181 194 180 194 193 181 182 195 181 195 194 182 183 196 182 196 195 183 184 197 183 197 196 184 185 198 184 198 197 185 186 199 185 199 198 186 187 200 186 200 199 187 188 201 187 201 200 188 189 202 188 202 201 17 190 203 17 203 18 190 191 204 190 204 203 191 192 205 191 205 204 192 193 206 192 206 205 193 194 207 193 207 206 194 195 208 194 208 207 195 196 209 195 209 208 196 197 210 196 210 209 197 198 211 197 211 210 198 199 212 198 212 211 199 200 213 199 213 212 200 201 214 200 214 213 201 202 215 201 215 214 18 203 216 18 216 19 203 204 217 203 217 216 204 205 218 204 218 217 205 206 219 205 219 218 206 207 220 206 220 219 207 208 221 207 221 220 208 209 222 208 222 221 209 210 223 209 223 222 210 211 224 210 224 223 211 212 225 211 225 224 212 213 226 212 226 225 213 214 227 213 227 226 214 215 228 214 228 227 19 216 229 19 229 20 216 217 230 216 230 229 217 218 231 217 231 230 218 219 232 218 232 231 219 220 233 219 233 232 220 221 234 220 234 233 221 222 235 221 235 234 222 223 236 222 236 235 223 224 237 223 237 236 224 225 238 224 238 237 225 226 239 225 239 238 226 227 240 226 240 239 227 228 241 227 241 240 20 229 21 20 21 0 229 230 23 229 23 21 230 231 25 230 25 23 231 232 27 231 27 25 232 233 29 232 29 27 233 234 31 233 31 29 234 235 33 234 33 31 235 236 35 235 35 33 236 237 37 236 37 35 237 238 39 237 39 37 238 239 41 238 41 39 239 240 43 239 43 41 240 241 45 240 45 43 45 242 243 244 45 244 245 46 46 245 246 247 46 247 248 59 59 248 249 250 59 250 251 66 66 251 252 253 66 253 254 71 71 254 255 256 257 258 259 260 257 260 261 91 91 261 262 263 91 263 264 92 92 264 265 266 92 266 267 111 111 267 268 269 111 269 270 124 124 270 271 272 124 272 273 137 137 273 274 275 137 275 276 150 150 276 277 278 150 278 279 163 163 279 280 281 163 281 282 176 176 282 283 284 176 284 285 189 189 285 286 287 189 287 288 202 202 288 289 290 202 290 291 215 215 291 292 293 215 293 294 228 228 294 295 296 228 296 297 241 241 297 298 299 241 299 242 45 300 301 302 302 301 303 303 301 304 304 301 305 305 301 306 306 301 307 307 301 308 308 301 309 309 301 310 310 301 311 311 301 312 312 301 313 313 301 314 314 301 315 315 301 316 316 301 317 317 301 318 318 301 319 319 301 320 320 301 300 321 322 323 321 323 324 322 325 326 322 326 323 325 327 328 325 328 326 327 329 330 327 330 328 329 331 332 329 332 330 331 333 334 331 334 332 333 335 336 333 336 334 335 337 338 335 338 336 337 339 340 337 340 338 339 341 342 339 342 340 341 343 344 341 344 342 343 345 346 343 346 344 345 300 302 345 302 346 324 323 347 324 347 348 323 326 349 323 349 347 326 328 350 326 350 349 328 330 351 328 351 350 330 332 352 330 352 351 332 334 353 332 353 352 334 336 354 334 354 353 336 338 355 336 355 354 338 340 356 338 356 355 340 342 357 340 357 356 342 344 358 342 358 357 344 346 359 344 359 358 346 302 303 346 303 359 348 347 360 348 360 361 354 355 362 355 356 363 355 363 362 356 357 364 356 364 363 357 358 365 357 365 364 358 359 366 358 366 365 359 303 304 359 304 366 362 363 367 363 364 368 363 368 367 364 365 369 364 369 368 365 366 370 365 370 369 366 304 305 366 305 370 367 368 371 368 369 372 368 372 371 369 370 373 369 373 372 370 305 306 370 306 373 371 372 374 371 374 375 372 373 376 372 376 374 373 306 307 373 307 376 377 378 379 380 375 381 380 381 382 375 374 383 375 383 381 374 376 384 374 384 383 376 307 308 376 308 384 379 378 385 379 385 386 378 387 385 388 382 389 388 389 390 382 381 391 382 391 389 381 383 392 381 392 391 383 384 393 383 393 392 384 308 309 384 309 393 386 385 394 386 394 395 385 387 396 385 396 394 387 397 398 387 398 396 397 399 400 397 400 398 399 401 402 399 402 400 401 403 404 401 404 402 403 405 406 403 406 404 405 390 407 405 407 406 390 389 408 390 408 407 389 391 409 389 409 408 391 392 410 391 410 409 392 393 411 392 411 410 393 309 310 393 310 411 395 394 412 395 412 413 394 396 414 394 414 412 396 398 415 396 415 414 398 400 416 398 416 415 400 402 417 400 417 416 402 404 418 402 418 417 404 406 419 404 419 418 406 407 420 406 420 419 407 408 421 407 421 420 408 409 422 408 422 421 409 410 423 409 423 422 410 411 424 410 424 423 411 310 311 411 311 424 413 412 425 413 425 426 412 414 427 412 427 425 414 415 428 414 428 427 415 416 429 415 429 428 416 417 430 416 430 429 417 418 431 417 431 430 418 419 432 418 432 431 419 420 433 419 433 432 420 421 434 420 434 433 421 422 435 421 435 434 422 423 436 422 436 435 423 424 437 423 437 436 424 311 312 424 312 437 426 425 438 426 438 439 425 427 440 425 440 438 427 428 441 427 441 440 428 429 442 428 442 441 429 430 443 429 443 442 430 431 444 430 444 443 431 432 445 431 445 444 432 433 446 432 446 445 433 434 447 433 447 446 434 435 448 434 448 447 435 436 449 435 449 448 436 437 450 436 450 449 437 312 313 437 313 450 439 438 451 439 451 452 438 440 453 438 453 451 440 441 454 440 454 453 441 442 455 441 455 454 442 443 456 442 456 455 443 444 457 443 457 456 444 445 458 444 458 457 445 446 459 445 459 458 446 447 460 446 460 459 447 448 461 447 461 460 448 449 462 448 462 461 449 450 463 449 463 462 450 313 314 450 314 463 452 451 464 452 464 465 451 453 466 451 466 464 453 454 467 453 467 466 454 455 468 454 468 467 455 456 469 455 469 468 456 457 470 456 470 469 457 458 471 457 471 470 458 459 472 458 472 471 459 460 473 459 473 472 460 461 474 460 474 473 461 462 475 461 475 474 462 463 476 462 476 475 463 314 315 463 315 476 465 464 477 465 477 478 464 466 479 464 479 477 466 467 480 466 480 479 467 468 481 467 481 480 468 469 482 468 482 481 469 470 483 469 483 482 470 471 484 470 484 483 471 472 485 471 485 484 472 473 486 472 486 485 473 474 487 473 487 486 474 475 488 474 488 487 475 476 489 475 489 488 476 315 316 476 316 489 478 477 490 478 490 491 477 479 492 477 492 490 479 480 493 479 493 492 480 481 494 480 494 493 481 482 495 481 495 494 482 483 496 482 496 495 483 484 497 483 497 496 484 485 498 484 498 497 485 486 499 485 499 498 486 487 500 486 500 499 487 488 501 487 501 500 488 489 502 488 502 501 489 316 317 489 317 502 491 490 503 491 503 504 490 492 505 490 505 503 492 493 506 492 506 505 493 494 507 493 507 506 494 495 508 494 508 507 495 496 509 495 509 508 496 497 510 496 510 509 497 498 511 497 511 510 498 499 512 498 512 511 499 500 513 499 513 512 500 501 514 500 514 513 501 502 515 501 515 514 502 317 318 502 318 515 504 503 516 504 516 517 503 505 518 503 518 516 505 506 519 505 519 518 506 507 520 506 520 519 507 508 521 507 521 520 508 509 522 508 522 521 509 510 523 509 523 522 510 511 524 510 524 523 511 512 525 511 525 524 512 513 526 512 526 525 513 514 527 513 527 526 514 515 528 514 528 527 515 318 319 515 319 528 517 516 529 517 529 530 516 518 531 516 531 529 518 519 532 518 532 531 519 520 533 519 533 532 520 521 534 520 534 533 521 522 535 521 535 534 522 523 536 522 536 535 523 524 537 523 537 536 524 525 538 524 538 537 525 526 539 525 539 538 526 527 540 526 540 539 527 528 541 527 541 540 528 319 320 528 320 541 530 529 322 530 322 321 529 531 325 529 325 322 531 532 327 531 327 325 532 533 329 532 329 327 533 534 331 533 331 329 534 535 333 534 333 331 535 536 335 535 335 333 536 537 337 536 337 335 537 538 339 537 339 337 538 539 341 538 341 339 539 540 343 539 343 341 540 541 345 540 345 343 541 320 300 541 300 345 321 324 243 242 324 245 244 243 324 348 246 245 348 248 247 246 348 361 249 248 361 251 250 249 361 542 252 251 542 254 253 252 377 258 543 544 377 379 259 258 379 261 260 259 379 386 262 261 386 264 263 262 386 395 265 264 395 267 266 265 395 413 268 267 413 270 269 268 413 426 271 270 426 273 272 271 426 439 274 273 439 276 275 274 439 452 277 276 452 279 278 277 452 465 280 279 465 282 281 280 465 478 283 282 478 285 284 283 478 491 286 285 491 288 287 286 491 504 289 288 504 291 290 289 504 517 292 291 517 294 293 292 517 530 295 294 530 297 296 295 530 321 298 297 321 242 299 298 51 52 545 546 51 546 547 64 52 53 548 549 52 549 550 545 53 54 551 552 53 552 553 548 54 55 554 555 54 555 556 551 55 56 557 558 55 558 559 554 56 57 560 561 56 561 562 557 57 65 563 564 560 63 64 565 566 63 566 567 70 64 547 568 64 568 565 65 569 570 563 65 71 571 572 569 69 70 573 574 69 574 575 74 70 567 576 70 576 573 71 577 578 571 74 575 579 580 78 78 580 581 582 257 583 584 257 585 583 78 582 586 587 83 83 587 588 589 90 590 591 90 592 590 257 91 593 585 91 90 591 593 83 589 594 595 89 100 596 597 598 100 89 595 596 102 599 600 601 102 100 598 599 104 602 603 604 104 102 601 602 106 605 606 607 106 104 604 605 108 608 609 610 108 106 607 608 90 93 611 592 93 108 610 611 71 256 612 613 614 577 612 544 543 615 613 543 258 257 584 615 347 349 616 617 347 617 618 360 349 350 619 620 349 620 621 616 350 351 622 623 350 623 624 619 351 352 625 626 351 626 627 622 352 353 628 629 352 629 630 625 353 354 631 632 353 632 633 628 354 362 634 635 631 361 360 636 637 361 637 638 542 360 618 639 360 639 636 362 640 641 634 362 367 642 643 640 542 638 644 542 644 645 367 646 647 642 367 371 648 649 646 377 650 651 652 380 653 654 380 655 653 371 375 656 648 375 380 654 656 377 652 657 658 378 378 658 659 660 388 661 662 388 663 661 380 382 664 655 382 388 662 664 378 660 665 666 387 397 667 668 669 397 387 666 667 399 670 671 672 399 397 669 670 401 673 674 675 401 399 672 673 403 676 677 678 403 401 675 676 405 679 680 681 405 403 678 679 388 390 682 663 390 405 681 682 542 645 683 255 254 612 256 255 683 684 377 544 612 684 685 650 686 687 688 687 689 688 689 690 688 690 691 688 691 692 688 692 693 688 693 694 688 694 695 688 695 696 688 696 697 688 697 698 688 698 699 688 699 700 688 700 701 688 701 702 688 702 703 688 703 704 688 704 705 688 705 706 688 706 686 688 686 707 708 686 708 687 707 709 710 707 710 708 709 711 712 709 712 710 711 713 714 711 714 712 713 715 716 713 716 714 715 717 718 715 718 716 717 719 720 717 720 718 719 721 722 719 722 720 721 723 724 721 724 722 723 725 726 723 726 724 725 727 728 725 728 726 727 729 730 727 730 728 729 731 732 729 732 730 687 708 733 687 733 689 708 710 734 708 734 733 710 712 735 710 735 734 712 714 736 712 736 735 714 716 737 714 737 736 716 718 738 716 738 737 718 720 739 718 739 738 720 722 740 720 740 739 722 724 741 722 741 740 724 726 742 724 742 741 726 728 743 726 743 742 728 730 744 728 744 743 730 732 745 730 745 744 689 733 746 689 746 690 733 734 747 733 747 746 734 735 748 734 748 747 735 736 749 735 749 748 736 737 750 736 750 749 737 738 751 737 751 750 738 739 752 738 752 751 739 740 753 739 753 752 740 741 754 740 754 753 741 742 755 741 755 754 742 743 756 742 756 755 743 744 757 743 757 756 744 745 758 744 758 757 690 746 759 690 759 691 746 747 760 746 760 759 747 748 761 747 761 760 748 749 762 748 762 761 749 750 763 749 763 762 750 751 764 750 764 763 751 752 765 751 765 764 752 753 766 752 766 765 753 754 767 753 767 766 754 755 768 754 768 767 755 756 769 755 769 768 756 757 770 756 770 769 757 758 771 757 771 770 691 759 772 691 772 692 759 760 773 759 773 772 760 761 774 760 774 773 761 762 775 761 775 774 762 763 776 762 776 775 763 764 777 763 777 776 764 765 778 764 778 777 765 766 779 765 779 778 766 767 780 766 780 779 767 768 781 767 781 780 768 769 782 768 782 781 769 770 783 769 783 782 770 771 784 770 784 783 692 772 785 692 785 693 772 773 786 772 786 785 773 774 787 773 787 786 774 775 788 774 788 787 775 776 789 775 789 788 776 777 790 776 790 789 777 778 791 777 791 790 778 779 792 778 792 791 779 780 793 779 793 792 780 781 794 780 794 793 781 782 795 781 795 794 782 783 796 782 796 795 783 784 797 783 797 796 693 785 798 693 798 694 785 786 799 785 799 798 786 787 800 786 800 799 787 788 801 787 801 800 788 789 802 788 802 801 789 790 803 789 803 802 790 791 804 790 804 803 791 792 805 791 805 804 792 793 806 792 806 805 793 794 807 793 807 806 794 795 808 794 808 807 795 796 809 795 809 808 796 797 810 796 810 809 694 798 811 694 811 695 798 799 812 798 812 811 799 800 813 799 813 812 800 801 814 800 814 813 801 802 815 801 815 814 802 803 816 802 816 815 803 804 817 803 817 816 804 805 818 804 818 817 805 806 819 805 819 818 806 807 820 806 820 819 807 808 821 807 821 820 808 809 822 808 822 821 809 810 823 809 823 822 695 811 824 695 824 696 811 812 825 811 825 824 812 813 826 812 826 825 813 814 827 813 827 826 814 815 828 814 828 827 815 816 829 815 829 828 816 817 830 816 830 829 817 818 831 817 831 830 818 819 832 818 832 831 819 820 833 819 833 832 820 821 834 820 834 833 821 822 835 821 835 834 822 823 836 822 836 835 696 824 837 696 837 697 824 825 838 824 838 837 825 826 839 825 839 838 826 827 840 826 840 839 827 828 841 827 841 840 828 829 842 828 842 841 829 830 843 829 843 842 830 831 844 830 844 843 831 832 845 831 845 844 832 833 846 832 846 845 833 834 847 833 847 846 834 835 848 834 848 847 835 836 849 835 849 848 697 837 850 697 850 698 837 838 851 837 851 850 838 839 852 838 852 851 839 840 853 839 853 852 840 841 854 840 854 853 841 842 855 841 855 854 842 843 856 842 856 855 843 844 857 843 857 856 844 845 858 844 858 857 845 846 859 845 859 858 846 847 860 846 860 859 847 848 861 847 861 860 848 849 862 848 862 861 698 850 863 698 863 699 850 851 864 850 864 863 851 852 865 851 865 864 852 853 866 852 866 865 853 854 867 853 867 866 854 855 868 854 868 867 855 856 869 855 869 868 856 857 870 856 870 869 857 858 871 857 871 870 858 859 872 858 872 871 859 860 873 859 873 872 860 861 874 860 874 873 861 862 875 861 875 874 699 863 876 699 876 700 863 864 877 863 877 876 864 865 878 864 878 877 865 866 879 865 879 878 866 867 880 866 880 879 873 874 881 874 875 882 874 882 881 700 876 883 700 883 701 876 877 884 876 884 883 877 878 885 877 885 884 878 879 886 878 886 885 881 882 887 701 883 888 701 888 702 883 884 889 883 889 888 884 885 890 884 890 889 702 888 891 702 891 703 888 889 892 888 892 891 889 890 893 889 893 892 890 894 893 703 891 895 703 895 704 891 892 896 891 896 895 892 893 897 892 897 896 893 894 898 893 898 897 894 899 898 704 895 900 704 900 705 895 896 901 895 901 900 896 897 902 896 902 901 897 898 903 897 903 902 898 899 904 898 904 903 899 905 904 906 907 908 906 908 909 705 900 910 705 910 706 900 901 911 900 911 910 901 902 912 901 912 911 902 903 913 902 913 912 903 904 914 903 914 913 904 905 915 904 915 914 905 916 917 905 917 915 916 918 919 916 919 917 918 920 921 918 921 919 920 922 923 920 923 921 922 924 925 922 925 923 924 909 926 924 926 925 909 908 927 909 927 926 706 910 707 706 707 686 910 911 709 910 709 707 911 912 711 911 711 709 912 913 713 912 713 711 913 914 715 913 715 713 914 915 717 914 717 715 915 917 719 915 719 717 917 919 721 917 721 719 919 921 723 919 723 721 921 923 725 921 725 723 923 925 727 923 727 725 925 926 729 925 729 727 926 927 731 926 731 729 731 928 929 930 731 930 931 732 732 931 932 933 732 933 934 745 745 934 935 936 745 936 937 758 758 937 938 939 758 939 940 771 771 940 941 942 771 942 943 784 784 943 944 945 784 945 946 797 797 946 947 948 797 948 949 810 810 949 950 951 810 951 952 823 823 952 953 954 823 954 955 836 836 955 956 957 836 957 958 849 849 958 959 960 849 960 961 862 862 961 962 963 862 963 964 875 875 964 965 966 875 966 967 882 882 967 968 969 882 969 970 887 887 970 971 972 973 974 975 976 973 976 977 907 907 977 978 979 907 979 980 908 908 980 981 982 908 982 983 927 927 983 984 985 927 985 928 731 986 987 988 988 987 989 989 987 990 990 987 991 991 987 992 992 987 993 993 987 994 994 987 995 995 987 996 996 987 997 997 987 998 998 987 999 999 987 1000 1000 987 1001 1001 987 1002 1002 987 1003 1003 987 1004 1004 987 1005 1005 987 1006 1006 987 986 1007 1008 1009 1007 1009 1010 1008 1011 1012 1008 1012 1009 1011 1013 1014 1011 1014 1012 1013 1015 1016 1013 1016 1014 1015 1017 1018 1015 1018 1016 1017 1019 1020 1017 1020 1018 1019 1021 1022 1019 1022 1020 1021 1023 1024 1021 1024 1022 1023 1025 1026 1023 1026 1024 1025 1027 1028 1025 1028 1026 1027 1029 1030 1027 1030 1028 1029 1031 1032 1029 1032 1030 1031 986 988 1031 988 1032 1010 1009 1033 1010 1033 1034 1009 1012 1035 1009 1035 1033 1012 1014 1036 1012 1036 1035 1014 1016 1037 1014 1037 1036 1016 1018 1038 1016 1038 1037 1018 1020 1039 1018 1039 1038 1020 1022 1040 1020 1040 1039 1022 1024 1041 1022 1041 1040 1024 1026 1042 1024 1042 1041 1026 1028 1043 1026 1043 1042 1028 1030 1044 1028 1044 1043 1030 1032 1045 1030 1045 1044 1032 988 989 1032 989 1045 1034 1033 1046 1034 1046 1047 1033 1035 1048 1033 1048 1046 1035 1036 1049 1035 1049 1048 1036 1037 1050 1036 1050 1049 1037 1038 1051 1037 1051 1050 1038 1039 1052 1038 1052 1051 1039 1040 1053 1039 1053 1052 1040 1041 1054 1040 1054 1053 1041 1042 1055 1041 1055 1054 1042 1043 1056 1042 1056 1055 1043 1044 1057 1043 1057 1056 1044 1045 1058 1044 1058 1057 1045 989 990 1045 990 1058 1047 1046 1059 1047 1059 1060 1046 1048 1061 1046 1061 1059 1048 1049 1062 1048 1062 1061 1049 1050 1063 1049 1063 1062 1050 1051 1064 1050 1064 1063 1051 1052 1065 1051 1065 1064 1052 1053 1066 1052 1066 1065 1053 1054 1067 1053 1067 1066 1054 1055 1068 1054 1068 1067 1055 1056 1069 1055 1069 1068 1056 1057 1070 1056 1070 1069 1057 1058 1071 1057 1071 1070 1058 990 991 1058 991 1071 1060 1059 1072 1060 1072 1073 1059 1061 1074 1059 1074 1072 1061 1062 1075 1061 1075 1074 1062 1063 1076 1062 1076 1075 1063 1064 1077 1063 1077 1076 1064 1065 1078 1064 1078 1077 1065 1066 1079 1065 1079 1078 1066 1067 1080 1066 1080 1079 1067 1068 1081 1067 1081 1080 1068 1069 1082 1068 1082 1081 1069 1070 1083 1069 1083 1082 1070 1071 1084 1070 1084 1083 1071 991 992 1071 992 1084 1073 1072 1085 1073 1085 1086 1072 1074 1087 1072 1087 1085 1074 1075 1088 1074 1088 1087 1075 1076 1089 1075 1089 1088 1076 1077 1090 1076 1090 1089 1077 1078 1091 1077 1091 1090 1078 1079 1092 1078 1092 1091 1079 1080 1093 1079 1093 1092 1080 1081 1094 1080 1094 1093 1081 1082 1095 1081 1095 1094 1082 1083 1096 1082 1096 1095 1083 1084 1097 1083 1097 1096 1084 992 993 1084 993 1097 1086 1085 1098 1086 1098 1099 1085 1087 1100 1085 1100 1098 1087 1088 1101 1087 1101 1100 1088 1089 1102 1088 1102 1101 1089 1090 1103 1089 1103 1102 1090 1091 1104 1090 1104 1103 1091 1092 1105 1091 1105 1104 1092 1093 1106 1092 1106 1105 1093 1094 1107 1093 1107 1106 1094 1095 1108 1094 1108 1107 1095 1096 1109 1095 1109 1108 1096 1097 1110 1096 1110 1109 1097 993 994 1097 994 1110 1099 1098 1111 1099 1111 1112 1098 1100 1113 1098 1113 1111 1100 1101 1114 1100 1114 1113 1101 1102 1115 1101 1115 1114 1102 1103 1116 1102 1116 1115 1103 1104 1117 1103 1117 1116 1104 1105 1118 1104 1118 1117 1105 1106 1119 1105 1119 1118 1106 1107 1120 1106 1120 1119 1107 1108 1121 1107 1121 1120 1108 1109 1122 1108 1122 1121 1109 1110 1123 1109 1123 1122 1110 994 995 1110 995 1123 1112 1111 1124 1112 1124 1125 1111 1113 1126 1111 1126 1124 1113 1114 1127 1113 1127 1126 1114 1115 1128 1114 1128 1127 1115 1116 1129 1115 1129 1128 1116 1117 1130 1116 1130 1129 1117 1118 1131 1117 1131 1130 1118 1119 1132 1118 1132 1131 1119 1120 1133 1119 1133 1132 1120 1121 1134 1120 1134 1133 1121 1122 1135 1121 1135 1134 1122 1123 1136 1122 1136 1135 1123 995 996 1123 996 1136 1125 1124 1137 1125 1137 1138 1124 1126 1139 1124 1139 1137 1126 1127 1140 1126 1140 1139 1127 1128 1141 1127 1141 1140 1128 1129 1142 1128 1142 1141 1129 1130 1143 1129 1143 1142 1130 1131 1144 1130 1144 1143 1131 1132 1145 1131 1145 1144 1132 1133 1146 1132 1146 1145 1133 1134 1147 1133 1147 1146 1134 1135 1148 1134 1148 1147 1135 1136 1149 1135 1149 1148 1136 996 997 1136 997 1149 1138 1137 1150 1138 1150 1151 1137 1139 1152 1137 1152 1150 1139 1140 1153 1139 1153 1152 1140 1141 1154 1140 1154 1153 1141 1142 1155 1141 1155 1154 1142 1143 1156 1142 1156 1155 1143 1144 1157 1143 1157 1156 1144 1145 1158 1144 1158 1157 1145 1146 1159 1145 1159 1158 1146 1147 1160 1146 1160 1159 1147 1148 1161 1147 1161 1160 1148 1149 1162 1148 1162 1161 1149 997 998 1149 998 1162 1151 1150 1163 1151 1163 1164 1150 1152 1165 1150 1165 1163 1152 1153 1166 1152 1166 1165 1153 1154 1167 1153 1167 1166 1154 1155 1168 1154 1168 1167 1155 1156 1169 1155 1169 1168 1156 1157 1170 1156 1170 1169 1157 1158 1171 1157 1171 1170 1158 1159 1172 1158 1172 1171 1159 1160 1173 1159 1173 1172 1160 1161 1174 1160 1174 1173 1161 1162 1175 1161 1175 1174 1162 998 999 1162 999 1175 1164 1163 1176 1164 1176 1177 1170 1171 1178 1171 1172 1179 1171 1179 1178 1172 1173 1180 1172 1180 1179 1173 1174 1181 1173 1181 1180 1174 1175 1182 1174 1182 1181 1175 999 1000 1175 1000 1182 1178 1179 1183 1179 1180 1184 1179 1184 1183 1180 1181 1185 1180 1185 1184 1181 1182 1186 1181 1186 1185 1182 1000 1001 1182 1001 1186 1183 1184 1187 1184 1185 1188 1184 1188 1187 1185 1186 1189 1185 1189 1188 1186 1001 1002 1186 1002 1189 1187 1188 1190 1187 1190 1191 1188 1189 1192 1188 1192 1190 1189 1002 1003 1189 1003 1192 1193 1194 1195 1196 1191 1197 1196 1197 1198 1191 1190 1199 1191 1199 1197 1190 1192 1200 1190 1200 1199 1192 1003 1004 1192 1004 1200 1195 1194 1201 1195 1201 1202 1194 1203 1201 1204 1198 1205 1204 1205 1206 1198 1197 1207 1198 1207 1205 1197 1199 1208 1197 1208 1207 1199 1200 1209 1199 1209 1208 1200 1004 1005 1200 1005 1209 1202 1201 1210 1202 1210 1211 1201 1203 1212 1201 1212 1210 1203 1213 1214 1203 1214 1212 1213 1215 1216 1213 1216 1214 1215 1217 1218 1215 1218 1216 1217 1219 1220 1217 1220 1218 1219 1221 1222 1219 1222 1220 1221 1206 1223 1221 1223 1222 1206 1205 1224 1206 1224 1223 1205 1207 1225 1205 1225 1224 1207 1208 1226 1207 1226 1225 1208 1209 1227 1208 1227 1226 1209 1005 1006 1209 1006 1227 1211 1210 1008 1211 1008 1007 1210 1212 1011 1210 1011 1008 1212 1214 1013 1212 1013 1011 1214 1216 1015 1214 1015 1013 1216 1218 1017 1216 1017 1015 1218 1220 1019 1218 1019 1017 1220 1222 1021 1220 1021 1019 1222 1223 1023 1222 1023 1021 1223 1224 1025 1223 1025 1023 1224 1225 1027 1224 1027 1025 1225 1226 1029 1225 1029 1027 1226 1227 1031 1226 1031 1029 1227 1006 986 1227 986 1031 1007 1010 929 928 1010 931 930 929 1010 1034 932 931 1034 934 933 932 1034 1047 935 934 1047 937 936 935 1047 1060 938 937 1060 940 939 938 1060 1073 941 940 1073 943 942 941 1073 1086 944 943 1086 946 945 944 1086 1099 947 946 1099 949 948 947 1099 1112 950 949 1112 952 951 950 1112 1125 953 952 1125 955 954 953 1125 1138 956 955 1138 958 957 956 1138 1151 959 958 1151 961 960 959 1151 1164 962 961 1164 964 963 962 1164 1177 965 964 1177 967 966 965 1177 1228 968 967 1228 970 969 968 1193 974 1229 1230 1193 1195 975 974 1195 977 976 975 1195 1202 978 977 1202 980 979 978 1202 1211 981 980 1211 983 982 981 1211 1007 984 983 1007 928 985 984 867 868 595 594 867 594 589 880 868 869 598 597 868 597 596 595 869 870 601 600 869 600 599 598 870 871 604 603 870 603 602 601 871 872 607 606 871 606 605 604 872 873 610 609 872 609 608 607 873 881 592 611 610 879 880 587 586 879 586 582 886 880 589 588 880 588 587 881 591 590 592 881 887 585 593 591 885 886 580 579 885 579 575 890 886 582 581 886 581 580 887 584 583 585 890 575 574 573 894 894 573 576 567 973 578 577 973 571 578 894 567 566 565 899 899 565 568 547 906 570 569 906 563 570 973 907 572 571 907 906 569 572 899 547 546 545 905 916 550 549 548 916 905 545 550 918 553 552 551 918 916 548 553 920 556 555 554 920 918 551 556 922 559 558 557 922 920 554 559 924 562 561 560 924 922 557 562 906 909 564 563 909 924 560 564 887 972 1231 613 615 584 1231 1230 1229 614 613 1229 974 973 577 614 1163 1165 666 665 1163 665 660 1176 1165 1166 669 668 1165 668 667 666 1166 1167 672 671 1166 671 670 669 1167 1168 675 674 1167 674 673 672 1168 1169 678 677 1168 677 676 675 1169 1170 681 680 1169 680 679 678 1170 1178 663 682 681 1177 1176 658 657 1177 657 652 1228 1176 660 659 1176 659 658 1178 662 661 663 1178 1183 655 664 662 1228 652 651 1228 651 650 1183 654 653 655 1183 1187 648 656 654 1193 645 644 638 1196 647 646 1196 642 647 1187 1191 649 648 1191 1196 646 649 1193 638 637 636 1194 1194 636 639 618 1204 641 640 1204 634 641 1196 1198 643 642 1198 1204 640 643 1194 618 617 616 1203 1213 621 620 619 1213 1203 616 621 1215 624 623 622 1215 1213 619 624 1217 627 626 625 1217 1215 622 627 1219 630 629 628 1219 1217 625 630 1221 633 632 631 1221 1219 628 633 1204 1206 635 634 1206 1221 631 635 1228 650 685 971 970 1231 972 971 685 684 1193 1230 1231 684 683 645 ================================================ FILE: testing/data/cross.vtk ================================================ # vtk DataFile Version 5.1 vtk output ASCII DATASET POLYDATA POINTS 70 double 0.5 1 0 0.43301269412 1 -0.25 0.25 1 -0.43301269412 3.0616171315e-17 1 -0.5 -0.25 1 -0.43301269412 -0.43301269412 1 -0.25 -0.5 1 -6.1232342629e-17 -0.43301269412 1 0.25 -0.25 1 0.43301269412 -9.1848507326e-17 1 0.5 0.25 1 0.43301269412 0.43301269412 1 0.25 0.43301269412 -1 0.25 0.25 -1 0.43301269412 -9.1848507326e-17 -1 0.5 -0.25 -1 0.43301269412 -0.43301269412 -1 0.25 -0.5 -1 -6.1232342629e-17 -0.43301269412 -1 -0.25 -0.25 -1 -0.43301269412 3.0616171315e-17 -1 -0.5 0.25 -1 -0.43301269412 0.43301269412 -1 -0.25 0.5 -1 0 0.43301269412 -0.43301269412 -0.25 0.5 -0.5 0 0.5 0.5 0 0.43301269412 0.43301269412 -0.25 0.25 -0.25 -0.43301269412 0.25 0.25 -0.43301269412 4.4290609559e-16 -1.1830696364e-18 -0.5 -0.25 -0.25 -0.43301269412 -0.25 0.25 -0.43301269412 -0.43301269412 -0.43301269412 -0.25 -0.43301269412 0.43301269412 -0.25 -0.5 -0.5 -5.7130552552e-17 -0.5 0.5 0 -0.43301269412 -0.43301269412 0.25 -0.43301269412 0.43301269412 0.25 -0.25 -0.25 0.43301269412 -0.25 0.25 0.43301269412 -8.5695822653e-17 1.3634875996e-16 0.5 0.25 -0.25 0.43301269412 0.25 0.25 0.43301269412 0.43301269412 -0.43301269412 0.25 0.43301269412 0.43301269412 0.25 -1 0.5 0 -1 0.43301269412 -0.25 -1 0.25 -0.43301269412 -1 2.5266076962e-16 -0.5 -1 -0.25 -0.43301269412 -1 -0.43301269412 -0.25 -1 -0.5 -6.1232342629e-17 -1 -0.43301269412 0.25 -1 -0.25 0.43301269412 -1 1.301960976e-16 0.5 -1 0.25 0.43301269412 -1 0.43301269412 0.25 1 0.43301269412 0.25 1 0.25 0.43301269412 1 -3.1389309902e-16 0.5 1 -0.25 0.43301269412 1 -0.43301269412 0.25 1 -0.5 -6.1232342629e-17 1 -0.43301269412 -0.25 1 -0.25 -0.43301269412 1 -1.9142844023e-16 -0.5 1 0.25 -0.43301269412 1 0.43301269412 -0.25 1 0.5 0 POLYGONS 53 240 OFFSETS vtktypeint64 0 12 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 132 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 CONNECTIVITY vtktypeint64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 23 22 24 25 0 26 27 1 22 21 28 24 1 27 29 2 21 20 30 28 2 29 30 3 20 19 31 30 3 30 32 4 19 18 33 31 4 32 34 5 18 17 35 33 5 34 36 6 17 16 37 35 6 36 38 7 16 15 39 37 7 38 40 8 15 14 41 39 8 40 41 9 14 13 42 41 9 41 43 10 13 12 44 42 10 43 45 11 12 23 25 44 11 45 26 0 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 46 36 34 47 69 68 27 26 47 34 32 48 68 67 29 27 48 32 30 49 67 66 30 29 49 30 31 50 66 65 28 30 50 31 33 51 65 64 24 28 51 33 35 52 64 63 25 24 52 35 37 53 63 62 44 25 53 37 39 54 62 61 42 44 54 39 41 55 61 60 41 42 55 41 40 56 60 59 43 41 56 40 38 57 59 58 45 43 57 38 36 46 58 69 26 45 ================================================ FILE: testing/data/merger.vtk ================================================ # vtk DataFile Version 5.1 vtk output ASCII DATASET POLYDATA POINTS 24 double -0.4 0 0.5 -0.4 0 -0.5 0 -0.4 0.5 0 -0.4 -0.5 0.4 0 0.5 0.4 0 -0.5 0 0.4 0.5 0 0.4 -0.5 -0.25 0 0.5 -0.25 0 -0.5 -0.15 -0.1 0.5 -0.15 -0.1 -0.5 -0.05 0 0.5 -0.05 0 -0.5 -0.15 0.1 0.5 -0.15 0.1 -0.5 0.05 0 0.5 0.05 0 -0.5 0.15 -0.1 0.5 0.15 -0.1 -0.5 0.25 0 0.5 0.25 0 -0.5 0.15 0.1 0.5 0.15 0.1 -0.5 POLYGONS 17 84 OFFSETS vtktypeint64 0 9 18 27 36 40 44 48 52 56 60 64 68 72 76 80 84 CONNECTIVITY vtktypeint64 0 2 4 20 18 16 12 10 8 4 6 0 8 14 12 16 22 20 5 3 1 9 11 13 17 19 21 1 7 5 21 23 17 13 15 9 0 1 3 2 2 3 5 4 4 5 7 6 6 7 1 0 8 10 11 9 10 12 13 11 12 14 15 13 14 8 9 15 16 18 19 17 18 20 21 19 20 22 23 21 22 16 17 23 ================================================ FILE: testing/data/non-manifold.vtk ================================================ # vtk DataFile Version 5.1 vtk output ASCII DATASET POLYDATA POINTS 58 double -1 -0.5 -1 -1 0.5 -1 1 0.5 -1 1 -0.5 -1 -1 -0.5 1 1 -0.5 1 1 0.5 1 -1 0.5 1 1 -0.5 0.6950153131 1 0.5 0.6950153131 1 0.5 -0.6950153131 1 -0.5 -0.6950153131 0.88023614883 0.5 -0.73860579729 0.88023614883 -0.5 -0.73860579729 0.61976385117 0.5 -0.73860579729 0.61976385117 -0.5 -0.73860579729 0.375 0.5 -0.64951902628 0.375 -0.5 -0.64951902628 0.17546667159 0.5 -0.48209071159 0.17546667159 -0.5 -0.48209071159 0.045230533928 0.5 -0.2565151155 0.045230533928 -0.5 -0.2565151155 0.045230533928 0.5 0.2565151155 0.17546667159 0.5 0.48209071159 0.17546667159 -0.5 0.48209071159 0.045230533928 -0.5 0.2565151155 0.375 0.5 0.64951902628 0.375 -0.5 0.64951902628 0.61976385117 0.5 0.73860579729 0.61976385117 -0.5 0.73860579729 0.88023614883 0.5 0.73860579729 0.88023614883 -0.5 0.73860579729 -1 0.5 0.6950153131 -1 -0.5 0.6950153131 -1 -0.5 -0.6950153131 -1 0.5 -0.6950153131 -0.88023614883 -0.5 0.73860579729 -0.61976385117 -0.5 0.73860579729 -0.375 -0.5 0.64951902628 -0.17546667159 -0.5 0.48209071159 -0.045230533928 -0.5 0.2565151155 0 -0.5 0 -0.045230533928 -0.5 -0.2565151155 -0.17546667159 -0.5 -0.48209071159 -0.375 -0.5 -0.64951902628 -0.61976385117 -0.5 -0.73860579729 -0.88023614883 -0.5 -0.73860579729 0 0.5 0 -0.045230533928 0.5 0.2565151155 -0.17546667159 0.5 0.48209071159 -0.375 0.5 0.64951902628 -0.61976385117 0.5 0.73860579729 -0.88023614883 0.5 0.73860579729 -0.88023614883 0.5 -0.73860579729 -0.61976385117 0.5 -0.73860579729 -0.375 0.5 -0.64951902628 -0.17546667159 0.5 -0.48209071159 -0.045230533928 0.5 -0.2565151155 POLYGONS 35 180 OFFSETS vtktypeint64 0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 79 94 109 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 CONNECTIVITY vtktypeint64 0 1 2 3 4 5 6 7 6 5 8 9 3 2 10 11 10 12 13 11 12 14 15 13 14 16 17 15 16 18 19 17 18 20 21 19 22 23 24 25 23 26 27 24 26 28 29 27 28 30 31 29 30 9 8 31 4 7 32 33 0 34 35 1 25 24 27 29 31 8 5 4 33 36 37 38 39 40 41 0 3 11 13 15 17 19 21 41 42 43 44 45 46 34 7 6 9 30 28 26 23 22 47 48 49 50 51 52 32 1 35 53 54 55 56 57 47 20 18 16 14 12 10 2 20 47 41 21 22 25 41 47 47 57 42 41 57 56 43 42 56 55 44 43 55 54 45 44 54 53 46 45 53 35 34 46 36 33 32 52 52 51 37 36 51 50 38 37 50 49 39 38 49 48 40 39 48 47 41 40 ================================================ FILE: testing/generate_frieze.py ================================================ #!/usr/bin/env python # *-* coding: UTF-8 *-* # Copyright 2012-2025 Ronald Römer # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import sys sys.path.extend(['/home/zippy/vtkbool/build/lib/python3.11/site-packages/vtkbool']) from vtkmodules.vtkCommonCore import vtkIdList, vtkPoints from vtkmodules.vtkCommonDataModel import vtkPolyData, VTK_POLYGON from vtkmodules.vtkCommonTransforms import vtkTransform from vtkmodules.vtkIOLegacy import vtkPolyDataReader, vtkPolyDataWriter from vtkmodules.vtkIOGeometry import vtkSTLWriter from vtkmodules.vtkFiltersCore import vtkAppendPolyData, vtkCleanPolyData, vtkReverseSense, vtkPolyDataNormals from vtkmodules.vtkFiltersSources import vtkPlaneSource from vtkmodules.vtkFiltersGeneral import vtkTransformPolyDataFilter from vtkmodules.vtkFiltersModeling import vtkLinearExtrusionFilter from vtkmodules.vtkCommonExecutionModel import vtkTrivialProducer from vtkbool import vtkPolyDataBooleanFilter import math import os import re from collections import namedtuple Bnds = namedtuple('Bounds', 'x1 x2 y1 y2 z1 z2') def extrude(pts, h, z=0): cell = vtkIdList() _pts = vtkPoints() _pts.SetDataTypeToDouble() for pt in pts: cell.InsertNextId(_pts.InsertNextPoint(pt[0], pt[1], z)) pd = vtkPolyData() pd.Allocate(1) pd.SetPoints(_pts) pd.InsertNextCell(VTK_POLYGON, cell) prod = vtkTrivialProducer() prod.SetOutput(pd) extr = vtkLinearExtrusionFilter() extr.SetInputConnection(prod.GetOutputPort()) extr.SetVector(0, 0, h) pn = vtkPolyDataNormals() pn.SetInputConnection(extr.GetOutputPort()) pn.AutoOrientNormalsOn() return pn class Frieze: def __init__ (self, usr_cfg): self.cfg = { 'w': 39, 'a': 3.25/6, 'b': 1, 'c': .4333333333, 'e': .15/2, 'f': 3.25/3, 'q': 1.0833333, 'r': .625, 'end': 'A', 'flip': False, 'ang': 45, 'end_seqs': [(), ()], 'shift': 0, 'sym': False } self.cfg.update(usr_cfg) if self.cfg['end'] == 'A': self.cfg.update({ 'o_a': self.cfg['a'], 'o_b': 0, 'o_c': 0 }) elif self.cfg['end'] == 'B': self.cfg.update({ 'o_a': -self.cfg['b'], 'o_b': 0, 'o_c': self.cfg['b'] }) elif self.cfg['end'] == 'C': self.cfg.update({ 'o_a': 0, 'o_b': self.cfg['a'], 'o_c': 0 }) elif self.cfg['end'] == 'D': self.cfg.update({ 'o_a': -self.cfg['a'], 'o_b': 2*self.cfg['a'], 'o_c': 0 }) def draw_bricks(self, seq, end_seq): seq = list(seq) pts = [] if self.cfg['sym']: assert self.cfg['end'] == 'D' fixed = sum(seq[1:-1])+sum(end_seq) print(fixed) w = self.cfg['w']+2*self.cfg['a'] i = 0 while True: curr = (i*seq[-1]+fixed)*self.cfg['f'] if (w-curr)/2 < seq[0]*self.cfg['f']: break i += 1 offs = (w-curr)/2 seq_ = [0] + seq[1:-1] + [seq[-1]]*i + list(reversed(end_seq)) for i in range(1, len(seq_)): seq_[i] += seq_[i-1] print(seq_) for s in seq_: mid = self.cfg['a']-offs-s*self.cfg['f'] pts.extend([[mid+self.cfg['e'], -self.cfg['a']], [mid+self.cfg['e'], -self.cfg['a']+2*self.cfg['e']], [mid-self.cfg['e'], -self.cfg['a']+2*self.cfg['e']], [mid-self.cfg['e'], -self.cfg['a']]]) else: n, m = divmod(self.cfg['w']+self.cfg['o_b'], self.cfg['f']) if abs(m-self.cfg['f']) < 1e-5: n += 1 m = 0 print(n, m) n = int(n) n, m_ = divmod(n-sum(seq[:-1]), seq[-1]) print('->', n, m_) seq.extend([seq[-1]]*(n-1)) print(seq) if m_ == 0 and m < 1e-5: del seq[-1] if end_seq: seq[-len(end_seq):] = reversed(end_seq) # wenn 0, dann löschen seq = [ s for s in seq if s > 0 ] for i in range(1, len(seq)): seq[i] += seq[i-1] for s in seq: mid = self.cfg['a']-s*self.cfg['f'] pts.extend([[mid+self.cfg['e'], -self.cfg['a']], [mid+self.cfg['e'], -self.cfg['a']+2*self.cfg['e']], [mid-self.cfg['e'], -self.cfg['a']+2*self.cfg['e']], [mid-self.cfg['e'], -self.cfg['a']]]) pts.extend([[-self.cfg['w']+self.cfg['o_a'], -self.cfg['a']], [-self.cfg['w']+self.cfg['o_a'], self.cfg['b']], [self.cfg['a'], self.cfg['b']], [self.cfg['a'], -self.cfg['a']]]) return pts def draw_zz_bricks(self): j = int(self.cfg['shift']//self.cfg['c'])+1 self.cfg['shift'] = self.cfg['shift']%self.cfg['c'] n, m = divmod(self.cfg['w']+self.cfg['o_c']-self.cfg['shift'], self.cfg['c']) n = int(n) print(n, m) if self.cfg['sym']: self.cfg['shift'] = m/2 pts = [ [-i*self.cfg['c']-self.cfg['shift'], ((i+j)%2)*self.cfg['c']] for i in range(n+1) ] if m > 1e-3: f = -1 if pts[-1][1] > 1e-5 else 1 pts.append([ pts[-1][0]-m, pts[-1][1]+f*m ]) pts.extend([ [-self.cfg['w']-self.cfg['o_c'], self.cfg['b']], [0, self.cfg['b']] ]) if self.cfg['shift'] > 1e-5: y = self.cfg['c']-self.cfg['shift'] if j%2 == 0 else self.cfg['shift'] pts.append([0, y]) return pts def draw_spacer(self): pts = [[-self.cfg['w']+self.cfg['o_a'], 2*self.cfg['e']], [-self.cfg['w']+self.cfg['o_a'], self.cfg['b']], [self.cfg['a'], self.cfg['b']], [self.cfg['a'], 2*self.cfg['e']]] if self.cfg['end'] == 'B': pts[:1] = [[-self.cfg['w']-2*self.cfg['e'], 2*self.cfg['e']], [-self.cfg['w']-2*self.cfg['e'], -self.cfg['a']], [-self.cfg['w']-self.cfg['b'], -self.cfg['a']]] return pts def export(self, name): extr = extrude(self.draw_bricks(self.cfg['seqs'][0], self.cfg['end_seqs'][0]), self.cfg['r'], self.cfg['q']/2) extr1 = extrude(self.draw_spacer(), 2*self.cfg['e'], self.cfg['q']/2+self.cfg['r']) extr2 = extrude(self.draw_bricks(self.cfg['seqs'][1], self.cfg['end_seqs'][1]), -self.cfg['r'], -self.cfg['q']/2) extr3 = extrude(self.draw_spacer(), -2*self.cfg['e'], -self.cfg['q']/2-self.cfg['r']) extr4 = extrude(self.draw_zz_bricks(), self.cfg['q'], -self.cfg['q']/2) # extr + extr1 bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(extr.GetOutputPort()) bf.SetInputConnection(1, extr1.GetOutputPort()) # extr2 + extr3 bf1 = vtkPolyDataBooleanFilter() bf1.SetInputConnection(extr2.GetOutputPort()) bf1.SetInputConnection(1, extr3.GetOutputPort()) app = vtkAppendPolyData() app.AddInputConnection(bf.GetOutputPort()) app.AddInputConnection(bf1.GetOutputPort()) bf2 = vtkPolyDataBooleanFilter() bf2.SetInputConnection(app.GetOutputPort()) bf2.SetInputConnection(1, extr4.GetOutputPort()) ang = math.radians(self.cfg['ang']) v = [0, 5] _v = [math.cos(ang)*v[0]-math.sin(ang)*v[1], math.sin(ang)*v[0]+math.cos(ang)*v[1]] plane = vtkPlaneSource() plane.SetOrigin(0, 0, 0) plane.SetPoint1(0, 0, 5) plane.SetPoint2(_v[0], _v[1], 0) plane.SetCenter(0, 0 , 0) plane.SetResolution(2, 2) bf3 = vtkPolyDataBooleanFilter() bf3.SetInputConnection(bf2.GetOutputPort()) bf3.SetInputConnection(1, plane.GetOutputPort()) bf3.SetOperModeToDifference() result = bf3 if self.cfg['end'] == 'D': _v = [math.cos(-ang)*v[0]-math.sin(-ang)*v[1], math.sin(-ang)*v[0]+math.cos(-ang)*v[1]] plane1 = vtkPlaneSource() plane1.SetOrigin(0, 0, 0) plane1.SetPoint2(0, 0, 5) plane1.SetPoint1(_v[0], _v[1], 0) plane1.SetCenter(-self.cfg['w'], 0 , 0) plane1.SetResolution(2, 2) bf4 = vtkPolyDataBooleanFilter() bf4.SetInputConnection(result.GetOutputPort()) bf4.SetInputConnection(1, plane1.GetOutputPort()) bf4.SetOperModeToDifference() result = bf4 if 'clip' in self.cfg: plane2 = vtkPlaneSource() plane2.SetOrigin(0, 0, 0) plane2.SetPoint1(0, 0, 5) plane2.SetPoint2(v[0], v[1], 0) plane2.SetCenter(-self.cfg['clip'], 0 , 0) plane2.SetResolution(2, 2) bf5 = vtkPolyDataBooleanFilter() bf5.SetInputConnection(result.GetOutputPort()) bf5.SetInputConnection(1, plane2.GetOutputPort()) bf5.SetOperModeToDifference() result = bf5 if 'pins' in self.cfg: app1 = vtkAppendPolyData() t = self.cfg.get('clip', 0) fake_w = self.cfg.get('fake_w', self.cfg['w']) u = (fake_w-t)/self.cfg['pins']/2 off = .2 # offset, sodass man die pins leichter hineinstecken kann h = self.cfg['q']+2*self.cfg['r']-off half_w = (5-off)/2 mids = [] for i in range(self.cfg['pins']): mid = t+u*(1+i*2) pin = extrude([ [-mid-half_w, self.cfg['b']], [-mid-half_w, self.cfg['b']+1.5], [-mid+half_w, self.cfg['b']+1.5], [-mid+half_w, self.cfg['b']] ], h, -h/2) app1.AddInputConnection(pin.GetOutputPort()) mids.append(mid) print('mids', mids) bf6 = vtkPolyDataBooleanFilter() bf6.SetInputConnection(result.GetOutputPort()) bf6.SetInputConnection(1, app1.GetOutputPort()) result = bf6 if self.cfg['flip']: tra = vtkTransform() tra.Scale(-1, 1, 1) tf = vtkTransformPolyDataFilter() tf.SetInputConnection(result.GetOutputPort()) tf.SetTransform(tra) rf = vtkReverseSense() rf.SetInputConnection(tf.GetOutputPort()) rf.Update() bnds = Bnds(*rf.GetOutput().GetBounds()) tra2 = vtkTransform() tra2.Translate(0, 0, -bnds.z1) tf2 = vtkTransformPolyDataFilter() tf2.SetInputConnection(rf.GetOutputPort()) tf2.SetTransform(tra2) clean = vtkCleanPolyData() clean.SetInputConnection(tf2.GetOutputPort()) writer = vtkPolyDataWriter() writer.SetInputConnection(clean.GetOutputPort()) writer.SetFileName(name) writer.Update() else: result.Update() bnds = Bnds(*result.GetOutput().GetBounds()) tra2 = vtkTransform() tra2.Translate(0, 0, -bnds.z1) tf2 = vtkTransformPolyDataFilter() tf2.SetInputConnection(result.GetOutputPort()) tf2.SetTransform(tra2) clean = vtkCleanPolyData() clean.SetInputConnection(tf2.GetOutputPort()) writer = vtkPolyDataWriter() writer.SetInputConnection(clean.GetOutputPort()) writer.SetFileName(name) writer.Update() if __name__ == '__main__': cfgs = [ { 'seqs': [(2, 2), (2, 1, 2)], 'w': 39., 'pins': 2, 'fake_w': 40*3.25/3 }, # 0 { 'seqs': [(1, 1), (1, 1)], 'w': 3.25, 'end': 'B', 'flip': True }, { 'seqs': [(2, 2), (2, 1, 2)], 'w': 40*3.25/3, 'pins': 2 }, { 'seqs': [(1, 1), (1, 1)], 'w': 11.375, 'end': 'C', 'flip': True, 'pins': 1 }, # 3 { 'seqs': [(2, 2), (2, 1, 2)], 'w': 91*3.25/3, 'end': 'D', 'end_seqs': [(), (1,)], 'pins': 5 }, { 'seqs': [(1, 1), (1, 1)], 'w': 85*3.25/3, 'end': 'C', 'end_seqs': [(0,), (0,)], 'shift': 3*.4333333333/2, 'pins': 5 }, { 'seqs': [(2, 1, 2), (2, 2)], 'w': 40*3.25/3, 'end': 'C', 'flip': True, 'end_seqs': [(), (1, 2)], 'pins': 2 }, # 6 { 'seqs': [(1, 1), (1, 1)], 'w': 3.25, 'end': 'B' }, { 'seqs': [(2, 2), (2, 1, 2)], 'w': 40*3.25/3, 'flip': True, 'clip': 8*3.25/3, 'pins': 2 }, { 'seqs': [(1, 1), (1, 1)], 'w': 7*3.25/3, 'end': 'B', 'flip': True, 'ang': 22.5, 'pins': 1, 'fake_w': 7*3.25/3+1 }, # 9 { 'seqs': [(1, 1), (1, 1)], 'w': 47*3.25/3, 'ang': 22.5, 'pins': 3 }, { 'seqs': [(2, 2), (2, 1, 2)], 'w': 18.3848, 'end': 'D', 'ang': 22.5, 'sym': True, 'end_seqs': [(1,), ()], 'pins': 1 }, { 'seqs': [(1,), (1,)], 'w': 3.25/3, 'end': 'B', 'flip': True }, # 12 { 'seqs': [(1, 1), (1, 1)], 'w': 11.5*3.25/3, 'end': 'C', 'pins': 1 }, { 'seqs': [(1, 1), (1, 1)], 'w': 11.5*3.25/3, 'end': 'C', 'flip': True, 'pins': 1 } ] os.makedirs('einzeln', exist_ok=True) os.makedirs('stl', exist_ok=True) cell_counts = [524, 98, 576, 264, 1274, 1867, 582, 98, 472, 194, 1048, 272, 56, 284, 284] for i, cfg in enumerate(cfgs): print(f'~~ {i} ~~') f = f'einzeln/test{i}.vtk' Frieze(cfg).export(f) assert os.path.exists(f) reader = vtkPolyDataReader() reader.SetFileName(f) writer = vtkSTLWriter() writer.SetInputConnection(reader.GetOutputPort()) writer.SetFileName(f'stl/test{i}.stl') writer.Update() assert reader.GetOutput().GetNumberOfCells() == cell_counts[i] ================================================ FILE: testing/pytest.ini ================================================ [pytest] log_cli = True addopts = --basetemp=out xfail_strict = True ================================================ FILE: testing/test_congruence.cxx ================================================ /* Copyright 2012-2025 Ronald Römer Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ #include "Contact.h" int main() { auto pdA = CreatePolyData({ { {0, 0, 0}, {1, 0, 0}, {1, 1, 0}, {0, 1, 0} } }); double z = std::tan(0.0005/180*M_PI)*.5; auto pdB = CreatePolyData({ { {0, 0, 0}, {0, .5, 0}, {1, .5, 0}, {1, 0, 0} }, { {1, .5, 0}, {0, .5, 0}, {0, 1, z}, {1, 1, z} } }); auto _pdA = Clean(pdA); auto _pdB = Clean(pdB); auto lines = Contact(_pdA, _pdB).GetLines(); if (lines->GetNumberOfCells() == 0) { return EXIT_FAILURE; } #ifdef DEBUG WriteVTK("lines.vtk", lines); #endif return EXIT_SUCCESS; } ================================================ FILE: testing/test_filter.py ================================================ #!/usr/bin/env python # *-* coding: UTF-8 *-* # Copyright 2012-2025 Ronald Römer # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import sys sys.path.extend(['/home/zippy/vtkbool/build/lib/python3.13/site-packages/vtkbool']) from collections import defaultdict from operator import itemgetter import math import pytest from functools import reduce from vtkmodules.vtkCommonCore import vtkIdList, vtkIdTypeArray, vtkPoints from vtkmodules.vtkCommonDataModel import vtkPolyData, VTK_POLYGON from vtkmodules.vtkFiltersSources import vtkCubeSource, vtkCylinderSource, vtkSphereSource, vtkPolyLineSource from vtkmodules.vtkCommonDataModel import vtkKdTreePointLocator from vtkmodules.vtkFiltersCore import vtkAppendPolyData, vtkCleanPolyData, vtkPolyDataNormals from vtkmodules.vtkIOLegacy import vtkPolyDataWriter, vtkPolyDataReader from vtkmodules.vtkCommonExecutionModel import vtkTrivialProducer from vtkmodules.vtkFiltersModeling import vtkRotationalExtrusionFilter from vtkmodules.vtkFiltersGeneral import vtkTransformPolyDataFilter from vtkmodules.vtkCommonTransforms import vtkTransform from vtkmodules.vtkCommonExecutionModel import vtkAlgorithm from vtkmodules.vtkFiltersModeling import vtkLinearExtrusionFilter from vtkbool import vtkPolyDataBooleanFilter def check_result(bf, expected_regs=None): lines = bf.GetOutput(2) lines.BuildLinks() pdA = bf.GetOutput(0) pdB = bf.GetOutput(1) pdA.BuildLinks() pdB.BuildLinks() contsA = lines.GetCellData().GetArray('cA') contsB = lines.GetCellData().GetArray('cB') assert isinstance(contsA, vtkIdTypeArray) assert isinstance(contsB, vtkIdTypeArray) regionsA = pdA.GetPointData().GetArray('RegionId') regionsB = pdB.GetPointData().GetArray('RegionId') assert isinstance(regionsA, vtkIdTypeArray) assert isinstance(regionsB, vtkIdTypeArray) valuesA = set(regionsA.GetValue(i) for i in range(regionsA.GetNumberOfValues())) valuesB = set(regionsB.GetValue(i) for i in range(regionsB.GetNumberOfValues())) if isinstance(expected_regs, list): assert len(valuesA) == expected_regs[0] assert len(valuesB) == expected_regs[1] else: print([len(valuesA), len(valuesB)]) for name, pd in [('pdA', pdA), ('pdB', pdB)]: print(f'checking {name}') loc = vtkKdTreePointLocator() loc.SetDataSet(pd) loc.BuildLocator() it = lines.GetLines().NewIterator() while not it.IsDoneWithTraversal(): line = it.GetCurrentCell() # print('line', it.GetCurrentCellId()) idA = line.GetId(0) idB = line.GetId(1) linkedA = vtkIdList() linkedB = vtkIdList() lines.GetPointCells(idA, linkedA) lines.GetPointCells(idB, linkedB) _linkedA = linkedA.GetNumberOfIds() _linkedB = linkedB.GetNumberOfIds() ptA = lines.GetPoint(idA) ptB = lines.GetPoint(idB) # print(ptA) # print(ptB) ptsA = vtkIdList() ptsB = vtkIdList() loc.FindPointsWithinRadius(1e-5, ptA, ptsA) loc.FindPointsWithinRadius(1e-5, ptB, ptsB) neigs = defaultdict(list) for pts in [ptsA, ptsB]: polys = vtkIdList() for i in range(pts.GetNumberOfIds()): pd.GetPointCells(pts.GetId(i), polys) for j in range(polys.GetNumberOfIds()): neigs[polys.GetId(j)].append(pts.GetId(i)) direct_neigs = {} for poly_id, point_ids in neigs.items(): if len(point_ids) > 1: equal_points = defaultdict(list) for point_id in point_ids: x, y, z = pd.GetPoint(point_id) equal_points[f'{x:.5f},{y:.5f},{z:.5f}'].append(point_id) groups = list(equal_points.values()) if len(groups) == 2: poly = vtkIdList() pd.GetCellPoints(poly_id, poly) next_inds = [ i+1 for i in range(poly.GetNumberOfIds()-1) ] + [0] groups_ = [ [ (id_, poly.IsId(id_)) for id_ in group ] for group in groups ] for group in groups_: if len(group) > 1: group.sort(key=itemgetter(1)) # mehr als 2 punkte an gleicher stelle? assert len(group) < 3 it_a = map(itemgetter(1), group + group[:1]) it_b = iter(it_a) next(it_b) for a, b in zip(it_a, it_b): # benachbart? c = next_inds[a] assert c != b group_a, group_b = groups_ possible_edges = [ [i, j] for i in group_a for j in group_b ] edges = [] for a, b in possible_edges: id_i, i = a id_j, j = b next_i = next_inds[i] next_j = next_inds[j] if next_i == j \ or next_j == i: # reihenfolge ist dann nicht mehr wichtig edges.append([id_i, id_j]) # print(edges) direct_neigs[poly_id] = edges # print(direct_neigs) match len(direct_neigs): case 2: a, b = direct_neigs.values() assert len(a) == 1 assert len(b) == 1 ids = set(a[0] + b[0]) if _linkedA == _linkedB: assert len(ids) == 4 elif _linkedA == 2: end_ids = set() for i in range(_linkedA): _line = vtkIdList() lines.GetCellPoints(linkedA.GetId(i), _line) end_ids.add(_line.GetId(0)) end_ids.add(_line.GetId(1)) end_ids.remove(idA) if len(end_ids) == 2: assert len(ids) == 4 else: assert len(ids) == 3 elif _linkedB == 2: end_ids = set() for i in range(_linkedB): _line = vtkIdList() lines.GetCellPoints(linkedB.GetId(i), _line) end_ids.add(_line.GetId(0)) end_ids.add(_line.GetId(1)) end_ids.remove(idB) if len(end_ids) == 2: assert len(ids) == 4 else: assert len(ids) == 3 else: # bspw. bei _linkedA == 4, _linkedB == 6 assert len(ids) == 4 case 1: a, *_ = direct_neigs.values() assert len(a) == 2 ids = set(sum(a, [])) if _linkedA == 2 \ or _linkedB == 2: assert len(ids) == 3 else: assert len(ids) == 4 case 0: assert False it.GoToNextCell() print('-> ok') def write_result(bf, d): for i, name in enumerate(['pdA', 'pdB', 'lines']): writer = vtkPolyDataWriter() writer.SetFileName(d / f'{name}.vtk') writer.SetInputConnection(bf.GetOutputPort(i)) writer.Update() def extrude_polygon(poly, z): cell = vtkIdList() pts = vtkPoints() pts.SetDataTypeToDouble() for pt in poly: cell.InsertNextId(pts.InsertNextPoint(*pt, 0)) pd = vtkPolyData() pd.Allocate(1) pd.SetPoints(pts) pd.InsertNextCell(VTK_POLYGON, cell) extr = vtkLinearExtrusionFilter() extr.SetInputData(pd) extr.SetVector(0, 0, z) normals = vtkPolyDataNormals() normals.SetInputConnection(extr.GetOutputPort()) normals.AutoOrientNormalsOn() return normals def create_polydata(pts, polys): _pts = vtkPoints() _pts.SetDataTypeToDouble() for pt in pts: _pts.InsertNextPoint(*pt) pd = vtkPolyData() pd.Allocate(1) pd.SetPoints(_pts) for poly in polys: cell = vtkIdList() for i in poly: cell.InsertNextId(i) pd.InsertNextCell(VTK_POLYGON, cell) prod = vtkTrivialProducer() prod.SetOutput(pd) return prod def test_simple(tmp_path): cube = vtkCubeSource() cube.SetYLength(.5) cyl = vtkCylinderSource() cyl.SetResolution(32) cyl.SetHeight(.5) cyl.SetCenter(0, .5, 0) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cube.GetOutputPort()) bf.SetInputConnection(1, cyl.GetOutputPort()) bf.SetOperModeToNone() bf.Update() write_result(bf, tmp_path) check_result(bf, [2, 2]) def test_simple_2(tmp_path): cube = vtkCubeSource() cube.SetYLength(.5) cyl = vtkCylinderSource() cyl.SetResolution(32) cyl.SetHeight(.5) cyl.SetCenter(0, .25, 0) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cube.GetOutputPort()) bf.SetInputConnection(1, cyl.GetOutputPort()) bf.SetOperModeToNone() bf.Update() write_result(bf, tmp_path) check_result(bf, [2, 2]) def test_simple_3(tmp_path): cube = vtkCubeSource() cube.SetYLength(.5) cyl = vtkCylinderSource() cyl.SetResolution(32) cyl.SetHeight(.5) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cube.GetOutputPort()) bf.SetInputConnection(1, cyl.GetOutputPort()) bf.SetOperModeToNone() bf.Update() write_result(bf, tmp_path) check_result(bf, [6, 6]) def test_simple_4(tmp_path): cube = vtkCubeSource() cyl = vtkPolyData() cyl.Allocate(1) pts = vtkPoints() pts.SetDataTypeToDouble() bottom = vtkIdList() top = vtkIdList() phi = math.pi/16 for i in range(32): x0 = .5*math.cos(i*phi) z0 = .5*math.sin(i*phi) x1 = .5*math.cos((i+1)*phi) z1 = .5*math.sin((i+1)*phi) top.InsertNextId(pts.InsertNextPoint(x0, .75, z0)) bottom.InsertNextId(pts.InsertNextPoint(x0, -.25, z0)) for j in range(4): side = vtkIdList() side.InsertNextId(pts.InsertNextPoint(x0, -.25+j/4, z0)) side.InsertNextId(pts.InsertNextPoint(x0, -.25+(j+1)/4, z0)) side.InsertNextId(pts.InsertNextPoint(x1, -.25+(j+1)/4, z1)) side.InsertNextId(pts.InsertNextPoint(x1, -.25+j/4, z1)) cyl.InsertNextCell(VTK_POLYGON, side) cyl.SetPoints(pts) cyl.ReverseCell(cyl.InsertNextCell(VTK_POLYGON, top)) cyl.InsertNextCell(VTK_POLYGON, bottom) prod = vtkTrivialProducer() prod.SetOutput(cyl) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cube.GetOutputPort()) bf.SetInputConnection(1, prod.GetOutputPort()) bf.SetOperModeToNone() bf.Update() write_result(bf, tmp_path) check_result(bf, [2, 2]) def test_same(tmp_path): sphere = vtkSphereSource() bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, sphere.GetOutputPort()) bf.SetInputConnection(1, sphere.GetOutputPort()) bf.SetOperModeToNone() bf.Update() write_result(bf, tmp_path) check_result(bf, [56, 56]) @pytest.mark.xfail def test_intersecting_strips(): cubeA = vtkCubeSource() cubeA.SetBounds(-5, 5, -2.5, 2.5, -1.25, 1.25) cubeB = vtkCubeSource() cubeB.SetBounds(-1.25, 1.25, -1.25, 1.25, -1.25, 1.25) traA = vtkTransform() traA.Translate(-1.25, 0, 0) traA.RotateZ(45) traB = vtkTransform() traB.Translate(1.25, 0, 0) traB.RotateZ(45) tfA = vtkTransformPolyDataFilter() tfA.SetTransform(traA) tfA.SetInputConnection(cubeB.GetOutputPort()) tfB = vtkTransformPolyDataFilter() tfB.SetTransform(traB) tfB.SetInputConnection(cubeB.GetOutputPort()) app = vtkAppendPolyData() app.AddInputConnection(tfA.GetOutputPort()) app.AddInputConnection(tfB.GetOutputPort()) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cubeA.GetOutputPort()) bf.SetInputConnection(1, app.GetOutputPort()) bf.SetOperModeToNone() bf.Update() check_result(bf) @pytest.mark.xfail def test_intersecting_strips_2(): cube = vtkCubeSource() cube.SetBounds(-10, 10, 0, 12, 0, 10) poly = [ [-5, 0], [3, 8], [-3, 8], [5, 0], [8, 0], [8, 10], [-8, 10], [-8, 0] ] pd = extrude_polygon(poly, 10) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cube.GetOutputPort()) bf.SetInputConnection(1, pd.GetOutputPort()) bf.SetOperModeToNone() bf.Update() check_result(bf) def test_touch(tmp_path): cube = vtkCubeSource() cylinder = vtkCylinderSource() cylinder.SetResolution(32) cylinder.SetRadius(.25) cylinder.SetCenter(.25, 0, 0) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cube.GetOutputPort()) bf.SetInputConnection(1, cylinder.GetOutputPort()) bf.SetOperModeToNone() bf.Update() write_result(bf, tmp_path) check_result(bf, [3, 3]) def test_merger(tmp_path): cube = vtkCubeSource() cyl = vtkCylinderSource() cyl.SetRadius(.25) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cube.GetOutputPort()) bf.SetInputConnection(1, cyl.GetOutputPort()) bf.SetOperModeToNone() bf.Update() write_result(bf, tmp_path) check_result(bf, [3, 3]) def test_merger_2(tmp_path): cube = vtkCubeSource() reader = vtkPolyDataReader() reader.SetFileName('data/merger.vtk') bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cube.GetOutputPort()) bf.SetInputConnection(1, reader.GetOutputPort()) bf.SetOperModeToNone() bf.Update() write_result(bf, tmp_path) check_result(bf, [7, 5]) def test_quads(tmp_path): sphereA = vtkSphereSource() sphereA.LatLongTessellationOn() sphereA.SetCenter(-.25, 0, 0) sphereB = vtkSphereSource() sphereB.LatLongTessellationOn() sphereB.SetCenter(.25, 0, 0) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, sphereA.GetOutputPort()) bf.SetInputConnection(1, sphereB.GetOutputPort()) bf.SetOperModeToNone() bf.Update() write_result(bf, tmp_path) check_result(bf, [2, 2]) def test_triangle_strips(tmp_path): line = vtkPolyLineSource() line.SetNumberOfPoints(19) phi = math.pi/18 for i in range(19): line.SetPoint(i, 0, math.cos(i*phi), math.sin(i*phi)) extr = vtkRotationalExtrusionFilter() extr.SetInputConnection(line.GetOutputPort()) extr.SetResolution(18) extr.SetRotationAxis(0, 1, 0) sphere = vtkSphereSource() sphere.SetRadius(1) tra = vtkTransform() tra.RotateX(90) tf = vtkTransformPolyDataFilter() tf.SetInputConnection(sphere.GetOutputPort()) tf.SetTransform(tra) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, extr.GetOutputPort()) bf.SetInputConnection(1, tf.GetOutputPort()) bf.SetOperModeToNone() bf.Update() write_result(bf, tmp_path) check_result(bf, [49, 49]) def test_special(tmp_path): cubeA = vtkCubeSource() cubeA.SetBounds(-5, 5, -10, 0, 0, 10) poly = [ [0, 0], [1, 0], [2, -1], [3, 0], [4, -1], [5, 0], [5, 10], [-5, 10], [-5, 0], [-4, 1], [-3, 0], [-2, 1], [-1, 0] ] cubeB = extrude_polygon(poly, 10) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cubeA.GetOutputPort()) bf.SetInputConnection(1, cubeB.GetOutputPort()) bf.SetOperModeToNone() bf.Update() write_result(bf, tmp_path) assert bf.GetOutput(2).GetNumberOfCells() == 32 @pytest.mark.xfail def test_non_manifolds(): reader = vtkPolyDataReader() reader.SetFileName('data/non-manifold.vtk') cyl = vtkCylinderSource() cyl.SetCenter(.75, 0, 0) cyl.SetRadius(.75) cyl.SetResolution(18) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, reader.GetOutputPort()) bf.SetInputConnection(1, cyl.GetOutputPort()) bf.SetOperModeToNone() bf.Update() check_result(bf) def test_branched(tmp_path): reader = vtkPolyDataReader() reader.SetFileName('data/branched.vtk') cube = vtkCubeSource() cube.SetBounds(-.3283653157, .3283653157, -.5, .5, -.375, .375) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cube.GetOutputPort()) bf.SetInputConnection(1, reader.GetOutputPort()) bf.SetOperModeToNone() bf.Update() write_result(bf, tmp_path) check_result(bf, [4, 4]) def test_branched_2(tmp_path): reader = vtkPolyDataReader() reader.SetFileName('data/branched.vtk') cube = vtkCubeSource() cube.SetBounds(-.3283653157, .3283653157, -.5, .5, -.75, .75) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cube.GetOutputPort()) bf.SetInputConnection(1, reader.GetOutputPort()) bf.SetOperModeToNone() bf.Update() write_result(bf, tmp_path) check_result(bf, [8, 8]) @pytest.mark.xfail def test_branched_3(): reader = vtkPolyDataReader() reader.SetFileName('data/branched3.vtk') cube = vtkCubeSource() cube.SetBounds(-.3283653157, .3283653157, -.5, .5, -.75, .75) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cube.GetOutputPort()) bf.SetInputConnection(1, reader.GetOutputPort()) bf.SetOperModeToNone() bf.Update() check_result(bf) def test_branched_4(tmp_path): reader = vtkPolyDataReader() reader.SetFileName('data/branched4.vtk') cube = vtkCubeSource() cube.SetBounds(-.3283653157, .3283653157, -.5, .5, -.375, .375) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cube.GetOutputPort()) bf.SetInputConnection(1, reader.GetOutputPort()) bf.SetOperModeToNone() bf.Update() write_result(bf, tmp_path) check_result(bf, [6, 7]) def test_branched_5(tmp_path): reader = vtkPolyDataReader() reader.SetFileName('data/branched.vtk') traA = vtkTransform() traA.Translate(0, -.5, 0) tfA = vtkTransformPolyDataFilter() tfA.SetInputConnection(reader.GetOutputPort()) tfA.SetTransform(traA) traB = vtkTransform() traB.Translate(0, .5, 0) tfB = vtkTransformPolyDataFilter() tfB.SetInputConnection(reader.GetOutputPort()) tfB.SetTransform(traB) app = vtkAppendPolyData() app.AddInputConnection(tfA.GetOutputPort()) app.AddInputConnection(tfB.GetOutputPort()) cube = vtkCubeSource() cube.SetBounds(-.3283653157, .3283653157, -1, 1, -.375, .375) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cube.GetOutputPort()) bf.SetInputConnection(1, app.GetOutputPort()) bf.SetOperModeToNone() bf.Update() write_result(bf, tmp_path) check_result(bf, [7, 8]) def test_branched_6(tmp_path): reader = vtkPolyDataReader() reader.SetFileName('data/branched6.vtk') cube = vtkCubeSource() cube.SetBounds(-.3283653157, .3283653157, -1, 1, -.33371031284, .33371031284) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cube.GetOutputPort()) bf.SetInputConnection(1, reader.GetOutputPort()) bf.SetOperModeToNone() bf.Update() write_result(bf, tmp_path) check_result(bf, [6, 5]) def test_bad_shaped(tmp_path): cubeA = vtkCubeSource() cubeA.SetBounds(-2.5, 2.5, 0, 5, 0, 5) z = 4.75 pts = [ [2.5, -2.5, 0], [2.5, -2.5, 5], [0, -2.5, z], [-2.5, -2.5, 5], [-2.5, -2.5, 0], [-2.5, 2.5, 0], [-2.5, 2.5, 5], [0, 2.5, z], [2.5, 2.5, 5], [2.5, 2.5, 0], ] polys = [ [0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [9, 8, 1, 0], [4, 3, 6, 5], [9, 0, 4, 5], [1, 8, 7, 6, 3, 2] ] cubeB = create_polydata(pts, polys) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cubeA.GetOutputPort()) bf.SetInputConnection(1, cubeB.GetOutputPort()) bf.SetOperModeToNone() bf.Update() write_result(bf, tmp_path) check_result(bf, [5, 5]) @pytest.mark.xfail def test_self_intersecting_polys(): cubeA = vtkCubeSource() cubeA.SetCenter(0, 0, 1.375) # 1, 1.25, 1.375 pts = [ [.5, .5, 0], [-.5, .5, 0], [-.5, -.5, 0], [.5 , -.5, 0], [.5, 0, .5], # 4 [0, .5, .5], [-.5, 0, .5], [0, -.5, .5], [.5, 0, .75], # 8 [0, .5, .75], [-.5, 0, .75], [0, -.5, .75], [.5, 0, 1], # 12 [.5, .5, 1], [0, .5, 1], [-.5, .5, 1], [-.5, 0, 1], # 16 [-.5, -.5, 1], [0, -.5, 1], [.5, -.5, 1] ] polys = [ [3, 2, 1, 0], [12, 13, 14, 15, 16, 17, 18, 19], [3, 19, 18, 11, 7, 11, 18, 17, 2], [0, 13, 12, 8, 4, 8, 12, 19, 3], [1, 15, 14, 9, 5, 9, 14, 13, 0], [2, 17, 16, 10, 6, 10, 16, 15, 1] ] cubeB = create_polydata(pts, polys) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cubeA.GetOutputPort()) bf.SetInputConnection(1, cubeB.GetOutputPort()) bf.SetOperModeToNone() bf.Update() check_result(bf) def test_equal_capt_pts(tmp_path): cyl = vtkCylinderSource() cyl.SetHeight(2) cyl.SetResolution(12) z = .0000025 # z = .0000075 # verursacht ein anderes bekanntes problem tra = vtkTransform() tra.RotateZ(90) tra.Translate(0, 0, z) tf = vtkTransformPolyDataFilter() tf.SetTransform(tra) tf.SetInputConnection(cyl.GetOutputPort()) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cyl.GetOutputPort()) bf.SetInputConnection(1, tf.GetOutputPort()) bf.SetOperModeToNone() bf.Update() write_result(bf, tmp_path) check_result(bf, [4, 4]) def test_equal_capt_pts_2(tmp_path): reader = vtkPolyDataReader() reader.SetFileName('data/cross.vtk') z = .000001 tra = vtkTransform() tra.RotateZ(45) tra.Translate(0, 0, z) tf = vtkTransformPolyDataFilter() tf.SetTransform(tra) tf.SetInputConnection(reader.GetOutputPort()) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, reader.GetOutputPort()) bf.SetInputConnection(1, tf.GetOutputPort()) bf.SetOperModeToNone() bf.Update() write_result(bf, tmp_path) check_result(bf, [24, 24]) def test_equal_capt_pts_3(tmp_path): z = .000005 poly = [ [0, 0], [3, 3], [6, 0], [9, 3], [12, 0], [15, 3], [18, 0], [21, 3], [24, 0], [24, -8], [0, -8] ] rack = extrude_polygon(poly, 20) cyl = vtkCylinderSource() cyl.SetHeight(30) cyl.SetRadius(5) cyl.SetResolution(12) cyl.SetOutputPointsPrecision(vtkAlgorithm.DOUBLE_PRECISION) tra = vtkTransform() tra.Translate(12, -2-z, 10) tra.RotateZ(90) tf = vtkTransformPolyDataFilter() tf.SetTransform(tra) tf.SetInputConnection(cyl.GetOutputPort()) bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, rack.GetOutputPort()) bf.SetInputConnection(1, tf.GetOutputPort()) bf.SetOperModeToNone() bf.Update() write_result(bf, tmp_path) check_result(bf, [6, 6]) def test_transform_matrix(tmp_path): cubeA = vtkCubeSource() cubeA.SetBounds(-1.5, 1.5, -1.5, 1.5, -1.5, 1.5) cubeB = vtkCubeSource() cubeB.SetBounds(-3, 3, -.5, .5, -.5, .5) transform = vtkTransform() matrix = transform.GetMatrix() bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cubeA.GetOutputPort()) bf.SetInputConnection(1, cubeB.GetOutputPort()) bf.SetOperModeToNone() bf.SetMatrix(1, matrix) for i in range(18): transform.Identity() transform.RotateY(i*10) matrix = transform.GetMatrix() # bf.SetMatrix(1, matrix) print(bf.GetMatrix(1)) bf.Update() path = tmp_path / f'transformed_{i}' path.mkdir() write_result(bf, path) check_result(bf, [3, 3]) ================================================ FILE: testing/test_merger.cxx ================================================ /* Copyright 2012-2025 Ronald Römer Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ #include #include #include #include #include #include "Merger.h" Poly CreateRegularPoly (double r, vtkIdType step, double x, double y, double rotate = 0) { Poly poly; double phi = 2*M_PI/static_cast(step); vtkIdType i; double x1, y1, x2, y2; double alpha = rotate*M_PI/180; for (i = 0; i < step; i++) { double _i = static_cast(i); x1 = r*std::cos(_i*phi); y1 = r*std::sin(_i*phi); x2 = std::cos(alpha)*x1-std::sin(alpha)*y1; y2 = std::sin(alpha)*x1+std::cos(alpha)*y1; poly.emplace_back(x2+x, y2+y, 0); } return poly; } bool Test (vtkPolyData *pd, PolysType &polys, vtkIdType numCells, [[maybe_unused]] const char *name) { auto cellIds = vtkSmartPointer::New(); cellIds->SetName("OrigCellIds"); cellIds->InsertNextValue(0); pd->GetCellData()->SetScalars(cellIds); PStrips pStrips {pd, 0}; Base &base = pStrips.base; base.ei[0] = 1; base.ei[1] = 0; base.ei[2] = 0; base.ej[0] = 0; base.ej[1] = 1; base.ej[2] = 0; base.n[0] = 0; base.n[1] = 0; base.n[2] = 1; base.d = 0; StripsType holes; vtkIdType ind {0}; std::size_t stripId {0}; for (auto &poly : polys) { StripType strip; poly.push_back(poly.front()); for (const auto &p : poly) { StripPt sp; sp.ind = ind; sp.polyId = 0; sp.pt[0] = p.x; sp.pt[1] = p.y; sp.pt[2] = p.z; pStrips.pts.emplace(ind, std::move(sp)); strip.emplace_back(ind, stripId); ind++; } holes.push_back(strip); stripId++; } IdsType descIds {0}; try { Merger(pd, pStrips, holes, descIds, 0).Run(); } catch (const std::runtime_error &e) { return false; } // dafür ist der Merger nicht zuständig pd->RemoveDeletedCells(); { // schneiden sich die einzelnen polygone selbst? vtkIdType i, num; const vtkIdType *cell; double pt[3]; auto cellItr = vtk::TakeSmartPointer(pd->GetPolys()->NewIterator()); for (cellItr->GoToFirstCell(); !cellItr->IsDoneWithTraversal(); cellItr->GoToNextCell()) { cellItr->GetCurrentCell(num, cell); std::set poly; for (i = 0; i < num; i++) { pd->GetPoint(cell[i], pt); if (!poly.emplace(pt[0], pt[1], pt[2]).second) { // schlägt fehl, wenn bereits vorhanden return false; } } } } #ifdef DEBUG WriteVTK(name, pd); #endif if (pd->GetNumberOfCells() != numCells) { return false; } return true; } int main() { auto pdA = CreatePolyData({ CreateRegularPoly(8, 18, 0, 0) }); PolysType polysA { CreateRegularPoly(.25, 6, 3.5, 0), CreateRegularPoly(.25, 6, -3.5, 0), CreateRegularPoly(.5, 6, 1, 0), CreateRegularPoly(.5, 6, -1, 0), CreateRegularPoly(.5, 6, 0, 1, 30), CreateRegularPoly(.5, 6, 0, -1, 30) }; if (!Test(pdA, polysA, 10, "polysA")) { return EXIT_FAILURE; } auto pdB = CreatePolyData({ { {5, 5, 0}, {-5, 5, 0}, {-5, -5, 0}, {5, -5, 0} } }); Poly polyA = CreateRegularPoly(4, 18, 0, 0, 10); Poly polyB = CreateRegularPoly(3, 18, 0, 0, 10); std::copy(polyB.rbegin(), polyB.rend(), std::back_inserter(polyA)); PolysType polysB { CreateRegularPoly(2, 18, 0, 0, 5), polyA }; if (!Test(pdB, polysB, 5, "polysB")) { return EXIT_FAILURE; } const double y = 7.5-1.5/std::cos(M_PI/6)-std::tan(M_PI/6)*4.5; auto pdC = CreatePolyData({ { {0, 0, 0}, {25, 0, 0}, {25, 25, 0}, {0, 25, 0} } }); PolysType polysC { { {2, 5, 0}, {17, 5, 0}, {17, 20, 0}, {2, 20, 0}, {7.5/std::tan(M_PI/6)+2, 12.5, 0} }, { {6.5, 12.5-y, 0}, {y/std::tan(M_PI/6)+6.5, 12.5, 0}, {6.5, 12.5+y, 0} } }; if (!Test(pdC, polysC, 5, "polysC")) { return EXIT_FAILURE; } return EXIT_SUCCESS; } ================================================ FILE: testing/test_python.py ================================================ #!/usr/bin/env python # *-* coding: UTF-8 *-* # Copyright 2012-2025 Ronald Römer # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import sys sys.path.extend(['/home/zippy/vtkbool/build/lib/python3.13/site-packages/vtkbool']) from vtkmodules.vtkFiltersSources import vtkCubeSource from vtkmodules.vtkIOLegacy import vtkPolyDataWriter from vtkbool import vtkPolyDataBooleanFilter cubeA = vtkCubeSource() cubeB = vtkCubeSource() bf = vtkPolyDataBooleanFilter() bf.SetInputConnection(0, cubeA.GetOutputPort()) bf.SetInputConnection(1, cubeB.GetOutputPort()) bf.Update() ================================================ FILE: vtkPolyDataBooleanFilter.cxx ================================================ /* Copyright 2012-2025 Ronald Römer Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "vtkPolyDataBooleanFilter.h" #include "Utilities.h" #include "Optimize.h" #include "Contact.h" #include "Merger.h" vtkStandardNewMacro(vtkPolyDataBooleanFilter); vtkPolyDataBooleanFilter::vtkPolyDataBooleanFilter () { SetNumberOfInputPorts(2); SetNumberOfOutputPorts(3); timePdA = 0; timePdB = 0; contLines = vtkSmartPointer::New(); modPdA = vtkSmartPointer::New(); modPdB = vtkSmartPointer::New(); cellDataA = vtkSmartPointer::New(); cellDataB = vtkSmartPointer::New(); cellIdsA = vtkSmartPointer::New(); cellIdsB = vtkSmartPointer::New(); OperMode = OPER_UNION; matrices[0] = nullptr; matrices[1] = nullptr; transforms[0] = nullptr; transforms[1] = nullptr; timeMatrixA = 0; timeMatrixB = 0; } vtkPolyDataBooleanFilter::~vtkPolyDataBooleanFilter () { if (matrices[0] != nullptr) { matrices[0]->Delete(); } if (matrices[1] != nullptr) { matrices[1]->Delete(); } if (transforms[0] != nullptr) { transforms[0]->Delete(); } if (transforms[1] != nullptr) { transforms[1]->Delete(); } } int vtkPolyDataBooleanFilter::RequestData(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector) { if (request->Has(vtkDemandDrivenPipeline::REQUEST_DATA())) { vtkInformation *inInfoA = inputVector[0]->GetInformationObject(0); vtkInformation *inInfoB = inputVector[1]->GetInformationObject(0); vtkPolyData *pdA = vtkPolyData::SafeDownCast(inInfoA->Get(vtkDataObject::DATA_OBJECT())); vtkPolyData *pdB = vtkPolyData::SafeDownCast(inInfoB->Get(vtkDataObject::DATA_OBJECT())); vtkInformation *outInfoA = outputVector->GetInformationObject(0); vtkInformation *outInfoB = outputVector->GetInformationObject(1); vtkInformation *outInfoC = outputVector->GetInformationObject(2); resultA = vtkPolyData::SafeDownCast(outInfoA->Get(vtkDataObject::DATA_OBJECT())); resultB = vtkPolyData::SafeDownCast(outInfoB->Get(vtkDataObject::DATA_OBJECT())); resultC = vtkPolyData::SafeDownCast(outInfoC->Get(vtkDataObject::DATA_OBJECT())); using clock = std::chrono::steady_clock; std::vector times; clock::time_point start; vtkMTimeType timeA = pdA->GetMTime(); vtkMTimeType timeB = pdB->GetMTime(); if (timeA > timePdA || timeB > timePdB || (matrices[0] != nullptr && matrices[0]->GetMTime() > timeMatrixA) || (matrices[1] != nullptr && matrices[1]->GetMTime() > timeMatrixB)) { if (contact == nullptr || timeA > timePdA || timeB > timePdB) { // CellData sichern cellDataA->DeepCopy(pdA->GetCellData()); cellDataB->DeepCopy(pdB->GetCellData()); cleanA = Clean(pdA); cleanB = Clean(pdB); #ifdef DEBUG WriteVTK("modPdA.vtk", cleanA); WriteVTK("modPdB.vtk", cleanB); #endif try { PreventEqualCaptPoints(cleanA, cleanB).Run(); } catch (const std::runtime_error &e) { vtkErrorMacro("Cannot prevent equal capture points."); return 1; } contact = std::make_shared(cleanA, cleanB); } start = clock::now(); modPdA = vtkSmartPointer::New(); modPdB = vtkSmartPointer::New(); if (transforms[0] != nullptr) { auto tfA = vtkSmartPointer::New(); tfA->SetInputData(cleanA); tfA->SetTransform(transforms[0]); tfA->Update(); modPdA->DeepCopy(tfA->GetOutput()); } else { modPdA->DeepCopy(cleanA); } if (transforms[1] != nullptr) { auto tfB = vtkSmartPointer::New(); tfB->SetInputData(cleanB); tfB->SetTransform(transforms[1]); tfB->Update(); modPdB->DeepCopy(tfB->GetOutput()); } else { modPdB->DeepCopy(cleanB); } modPdA->EditableOn(); modPdB->EditableOn(); try { contLines = contact->GetLines(modPdA, transforms[0], modPdB, transforms[1]); } catch (const std::runtime_error &e) { std::stringstream ss; ss << std::quoted(e.what()); vtkErrorMacro("Contact failed with " << ss.str()); return 1; } times.push_back(clock::now()-start); #ifdef DEBUG WriteVTK("modPdA_1.vtk", modPdA); WriteVTK("modPdB_1.vtk", modPdB); WriteVTK("contLines.vtk", contLines); #endif if (contLines->GetNumberOfCells() == 0) { vtkErrorMacro("There is no contact."); return 1; } vtkIdType i; auto cells = vtkSmartPointer::New(); for (i = 0; i < contLines->GetNumberOfPoints(); i++) { contLines->GetPointCells(i, cells); if (cells->GetNumberOfIds() == 1) { vtkErrorMacro("At least one line-end has only one neighbor."); return 1; } } // in den CellDatas steht drin, welche polygone einander schneiden contsA = vtkIdTypeArray::SafeDownCast(contLines->GetCellData()->GetScalars("cA")); contsB = vtkIdTypeArray::SafeDownCast(contLines->GetCellData()->GetScalars("cB")); vtkIdTypeArray *sourcesA = vtkIdTypeArray::SafeDownCast(contLines->GetCellData()->GetScalars("sourcesA")); vtkIdTypeArray *sourcesB = vtkIdTypeArray::SafeDownCast(contLines->GetCellData()->GetScalars("sourcesB")); // sichert die OrigCellIds vtkIdTypeArray *origCellIdsA = vtkIdTypeArray::SafeDownCast(modPdA->GetCellData()->GetScalars("OrigCellIds")); vtkIdTypeArray *origCellIdsB = vtkIdTypeArray::SafeDownCast(modPdB->GetCellData()->GetScalars("OrigCellIds")); cellIdsA->DeepCopy(origCellIdsA); cellIdsB->DeepCopy(origCellIdsB); vtkIdType numCellsA = modPdA->GetNumberOfCells(); vtkIdType numCellsB = modPdB->GetNumberOfCells(); for (i = 0; i < numCellsA; i++) { origCellIdsA->SetValue(i, i); } for (i = 0; i < numCellsB; i++) { origCellIdsB->SetValue(i, i); } start = clock::now(); if (GetPolyStrips(modPdA, contsA, sourcesA, polyStripsA) || GetPolyStrips(modPdB, contsB, sourcesB, polyStripsB)) { vtkErrorMacro("Strips are invalid."); return 1; } // löscht bestimmte strips if (CleanStrips()) { vtkErrorMacro("There is no contact."); return 1; } times.push_back(clock::now()-start); // trennt die polygone an den linien start = clock::now(); if (CutCells(modPdA, polyStripsA) || CutCells(modPdB, polyStripsB)) { vtkErrorMacro("CutCells failed."); return 1; } times.push_back(clock::now()-start); #ifdef DEBUG WriteVTK("modPdA_2.vtk", modPdA); WriteVTK("modPdB_2.vtk", modPdB); #endif start = clock::now(); RestoreOrigPoints(modPdA, polyStripsA); RestoreOrigPoints(modPdB, polyStripsB); times.push_back(clock::now()-start); #ifdef DEBUG WriteVTK("modPdA_3.vtk", modPdA); WriteVTK("modPdB_3.vtk", modPdB); #endif start = clock::now(); ResolveOverlaps(modPdA, polyStripsA); ResolveOverlaps(modPdB, polyStripsB); times.push_back(clock::now()-start); #ifdef DEBUG WriteVTK("modPdA_4.vtk", modPdA); WriteVTK("modPdB_4.vtk", modPdB); #endif start = clock::now(); AddAdjacentPoints(modPdA, contsA, polyStripsA); AddAdjacentPoints(modPdB, contsB, polyStripsB); times.push_back(clock::now()-start); #ifdef DEBUG WriteVTK("modPdA_5.vtk", modPdA); WriteVTK("modPdB_5.vtk", modPdB); #endif start = clock::now(); DisjoinPolys(modPdA, polyStripsA); DisjoinPolys(modPdB, polyStripsB); times.push_back(clock::now()-start); #ifdef DEBUG WriteVTK("modPdA_6.vtk", modPdA); WriteVTK("modPdB_6.vtk", modPdB); #endif start = clock::now(); MergePoints(modPdA, polyStripsA); MergePoints(modPdB, polyStripsB); times.push_back(clock::now()-start); #ifdef DEBUG WriteVTK("modPdA_7.vtk", modPdA); WriteVTK("modPdB_7.vtk", modPdB); #endif timePdA = pdA->GetMTime(); timePdB = pdB->GetMTime(); if (matrices[0] != nullptr) { timeMatrixA = matrices[0]->GetMTime(); } if (matrices[1] != nullptr) { timeMatrixB = matrices[1]->GetMTime(); } } start = clock::now(); if (CombineRegions()) { vtkErrorMacro("Boolean operation failed."); return 1; } times.push_back(clock::now()-start); #ifdef DEBUG double sum = std::chrono::duration_cast>(std::accumulate(times.begin(), times.end(), clock::duration())).count(); std::vector::const_iterator itr; for (itr = times.begin(); itr != times.end(); itr++) { double time = std::chrono::duration_cast>(*itr).count(); std::cout << "Time " << (itr-times.begin()) << ": " << time << "s (" << (time/sum*100) << "%)" << std::endl; } #endif } return 1; } void vtkPolyDataBooleanFilter::GetStripPoints (vtkPolyData *pd, vtkIdTypeArray *sources, PStrips &pStrips, IdsType &lines) { #ifdef DEBUG std::cout << "GetStripPoints()" << std::endl; #endif StripPtsType &pts = pStrips.pts; const IdsType &poly = pStrips.poly; double a[3], b[3], sA[3], sB[3], u[3], v[3], w[3], n, t, d; std::map allPts; std::map links; auto line = vtkSmartPointer::New(); for (auto lineId : lines) { contLines->GetCellPoints(lineId, line); // std::cout << "? " << contsA->GetValue(lineId) // << ", " << contsB->GetValue(lineId) // << ", [" << line->GetId(0) // << ", " << line->GetId(1) // << "]" // << std::endl; allPts.emplace(line->GetId(0), sources->GetTypedComponent(lineId, 0)); allPts.emplace(line->GetId(1), sources->GetTypedComponent(lineId, 1)); links[line->GetId(0)]++; links[line->GetId(1)]++; } decltype(allPts)::const_iterator itr; for (itr = allPts.begin(); itr != allPts.end(); ++itr) { StripPt sp; sp.ind = itr->first; // die koordinaten contLines->GetPoint(sp.ind, sp.pt); IdsType::const_iterator itrA, itrB; for (itrA = poly.begin(); itrA != poly.end(); ++itrA) { itrB = itrA+1; if (itrB == poly.end()) { itrB = poly.begin(); } if (itr->second != NOTSET && *itrA != itr->second) { continue; } pd->GetPoint(*itrA, a); pd->GetPoint(*itrB, b); vtkMath::Subtract(a, sp.pt, sA); vtkMath::Subtract(b, sp.pt, sB); // richtungsvektor und länge der kante vtkMath::Subtract(b, a, u); n = vtkMath::Norm(u); // d und t zur kante vtkMath::Subtract(sp.pt, a, v); t = vtkMath::Dot(v, u)/(n*n); vtkMath::Cross(v, u, w); d = vtkMath::Norm(w)/n; if (d < 1e-5 && t > -1e-5 && t < 1+1e-5) { sp.edge[0] = *itrA; sp.edge[1] = *itrB; sp.t = std::min(1., std::max(0., t)); if (vtkMath::Norm(sA) < 1e-5) { std::copy_n(a, 3, sp.captPt); sp.capt = Capt::A; } else if (vtkMath::Norm(sB) < 1e-5) { std::copy_n(b, 3, sp.captPt); sp.capt = Capt::B; } else { // u ist nicht normiert vtkMath::MultiplyScalar(u, t); double x[3]; vtkMath::Add(a, u, x); // projektion std::copy_n(x, 3, sp.captPt); sp.capt = Capt::Edge; } } // std::cout << "? " // << sp.ind // << ", " << d // << ", " << t // << ", " << sp.capt // << std::endl; } if (itr->second != NOTSET && sp.edge[0] == NOTSET) { sp.catched = false; } if (sp.capt == Capt::Not && links[sp.ind] > 2) { sp.capt = Capt::Branched; } pts.emplace(sp.ind, std::move(sp)); } StripPtsType::iterator itr2; for (itr2 = pts.begin(); itr2 != pts.end(); ++itr2) { StripPt &sp = itr2->second; if (sp.capt & Capt::Boundary) { if (sp.capt == Capt::B) { sp.t = 0; sp.edge[0] = sp.edge[1]; auto itrA = std::find(poly.begin(), poly.end(), sp.edge[0]), itrB = itrA+1; if (itrB == poly.end()) { itrB = poly.begin(); } sp.edge[1] = *itrB; sp.capt = Capt::A; } // für den schnitt werden die eingerasteten koordinaten verwendet std::copy_n(sp.captPt, 3, sp.cutPt); } else { std::copy_n(sp.pt, 3, sp.cutPt); } } #ifdef DEBUG for (itr2 = pts.begin(); itr2 != pts.end(); ++itr2) { std::cout << itr2->first << ": " << itr2->second << std::endl; } #endif } bool vtkPolyDataBooleanFilter::GetPolyStrips (vtkPolyData *pd, vtkIdTypeArray *conts, vtkIdTypeArray *sources, PolyStripsType &polyStrips) { #ifdef DEBUG std::cout << "GetPolyStrips()" << std::endl; #endif polyStrips.clear(); std::map polyLines; for (vtkIdType i = 0; i < conts->GetNumberOfTuples(); i++) { vtkIdType poly = conts->GetValue(i); /*if (poly != 1641) { continue; }*/ polyLines[poly].push_back(i); } std::vector> notCatched; std::map::iterator itr; for (itr = polyLines.begin(); itr != polyLines.end(); ++itr) { IdsType &lines = itr->second; RemoveDuplicates(lines); polyStrips.emplace(std::piecewise_construct, std::forward_as_tuple(itr->first), std::forward_as_tuple(pd, itr->first)); PStrips &pStrips = polyStrips.at(itr->first); GetStripPoints(pd, sources, pStrips, lines); for (auto &sp : pStrips.pts) { sp.second.polyId = itr->first; if (!sp.second.catched) { notCatched.push_back(sp.second); } } } auto Next = [](const IdsType &ids, vtkIdType id) -> vtkIdType { IdsType::const_iterator itr; itr = std::find(ids.begin(), ids.end(), id); if (++itr == ids.end()) { itr = ids.begin(); } return *itr; }; for (StripPt &sp : notCatched) { for (itr = polyLines.begin(); itr != polyLines.end(); ++itr) { const PStrips &pStrips = polyStrips.at(itr->first); try { const StripPt &corr = pStrips.pts.at(sp.ind); if (&corr != &sp) { if (corr.capt == Capt::A) { sp.capt = Capt::A; sp.edge[0] = corr.edge[0]; sp.edge[1] = Next(polyStrips.at(sp.polyId).poly, sp.edge[0]); sp.t = 0; std::copy_n(corr.captPt, 3, sp.captPt); std::copy_n(sp.captPt, 3, sp.cutPt); sp.catched = true; } } } catch (...) {} } #ifdef DEBUG if (!sp.catched) { std::cout << sp << std::endl; } #endif assert(sp.catched); } // sucht nach gleichen captPts { std::map> collapsed; PolyStripsType::iterator itr; StripPtsType::iterator itr2; for (itr = polyStrips.begin(); itr != polyStrips.end(); ++itr) { PStrips &pStrips = itr->second; StripPtsType &pts = pStrips.pts; for (itr2 = pts.begin(); itr2 != pts.end(); ++itr2) { StripPt &sp = itr2->second; if (sp.capt & Capt::Boundary) { Point3d p(sp.cutPt[0], sp.cutPt[1], sp.cutPt[2]); collapsed[p].emplace(sp.ind); if (collapsed[p].size() == 2) { return true; } } } } } for (itr = polyLines.begin(); itr != polyLines.end(); ++itr) { PStrips &pStrips = polyStrips.at(itr->first); const IdsType &lines = itr->second; const StripPtsType &pts = pStrips.pts; StripsType &strips = pStrips.strips; // zusammensetzen std::deque _lines; vtkIdList *linePts = vtkIdList::New(); for (auto &i : lines) { contLines->GetCellPoints(i, linePts); _lines.emplace_back(linePts->GetId(0), linePts->GetId(1)); } linePts->Delete(); decltype(_lines)::iterator _itr; auto FindRight = [&pts, &_lines, &_itr](StripType &strip, const std::size_t &id) -> bool { auto &right = strip.back(); if (pts.at(right.ind).capt == Capt::Not) { for (_itr = _lines.begin(); _itr != _lines.end(); ++_itr) { if (_itr->f == right.ind) { strip.emplace_back(_itr->g, id); _lines.erase(_itr); return true; } else if (_itr->g == right.ind) { strip.emplace_back(_itr->f, id); _lines.erase(_itr); return true; } } } return false; }; auto FindLeft = [&pts, &_lines, &_itr](StripType &strip, const std::size_t &id) -> bool { auto &left = strip.front(); if (pts.at(left.ind).capt == Capt::Not) { for (_itr = _lines.begin(); _itr != _lines.end(); ++_itr) { if (_itr->f == left.ind) { strip.emplace_front(_itr->g, id); _lines.erase(_itr); return true; } else if (_itr->g == left.ind) { strip.emplace_front(_itr->f, id); _lines.erase(_itr); return true; } } } return false; }; std::size_t stripId {0}; while (!_lines.empty()) { auto &last = _lines.back(); StripType strip {{last.f, stripId}, {last.g, stripId}}; _lines.pop_back(); while (FindRight(strip, stripId)) {} while (FindLeft(strip, stripId)) {} strips.push_back(std::move(strip)); stripId++; } CompleteStrips(pStrips); } // sucht nach schnitten zw. den strips { PolyStripsType::const_iterator itr; StripType::const_iterator itr2; for (itr = polyStrips.begin(); itr != polyStrips.end(); ++itr) { const PStrips &pStrips = itr->second; const StripsType &strips = pStrips.strips; const StripPtsType &pts = pStrips.pts; const Base &base = pStrips.base; auto treePts = vtkSmartPointer::New(); treePts->SetDataTypeToDouble(); auto treePd = vtkSmartPointer::New(); treePd->Allocate(1); std::map ptIds; double pt[2]; for (const auto &p : pts) { Transform(p.second.pt, pt, base); ptIds.emplace(p.first, treePts->InsertNextPoint(pt[0], pt[1], 0)); } for (const StripType &strip : strips) { for (itr2 = strip.begin(); itr2 != strip.end()-1; ++itr2) { vtkIdList *line = vtkIdList::New(); line->InsertNextId(ptIds[itr2->ind]); line->InsertNextId(ptIds[(itr2+1)->ind]); treePd->InsertNextCell(VTK_LINE, line); line->Delete(); } } treePd->SetPoints(treePts); auto tree = vtkSmartPointer::New(); tree->SetDataSet(treePd); tree->BuildLocator(); vtkIdType numA, numB; const vtkIdType *lineA, *lineB; auto lineItr = vtk::TakeSmartPointer(treePd->GetLines()->NewIterator()); for (lineItr->GoToFirstCell(); !lineItr->IsDoneWithTraversal(); lineItr->GoToNextCell()) { lineItr->GetCurrentCell(numA, lineA); double ptA[3], ptB[3]; treePts->GetPoint(lineA[0], ptA); treePts->GetPoint(lineA[1], ptB); auto lineIds = vtkSmartPointer::New(); tree->IntersectWithLine(ptA, ptB, 1e-5, nullptr, lineIds); for (vtkIdType i = 0; i < lineIds->GetNumberOfIds(); i++) { treePd->GetCellPoints(lineIds->GetId(i), numB, lineB); if (lineB[0] != lineA[0] && lineB[1] != lineA[0] && lineB[0] != lineA[1] && lineB[1] != lineA[1]) { // schnitt gefunden return true; } } } } } return false; } void vtkPolyDataBooleanFilter::RemoveDuplicates (IdsType &lines) { typedef std::tuple LineType; std::vector _lines; _lines.reserve(lines.size()); auto line = vtkSmartPointer::New(); vtkIdType a, b; for (const vtkIdType &id : lines) { contLines->GetCellPoints(id, line); a = line->GetId(0); b = line->GetId(1); if (std::find_if(_lines.begin(), _lines.end(), [&](const LineType &_line) { return (std::get<1>(_line) == a && std::get<2>(_line) == b) || (std::get<1>(_line) == b && std::get<2>(_line) == a); }) == _lines.end()) { _lines.emplace_back(id, a, b); } } if (_lines.size() != lines.size()) { lines.clear(); for (const auto &_line : _lines) { lines.push_back(std::get<0>(_line)); } lines.shrink_to_fit(); } } void vtkPolyDataBooleanFilter::CompleteStrips (PStrips &pStrips) { StripsType::iterator itr; for (itr = pStrips.strips.begin(); itr != pStrips.strips.end(); ++itr) { const StripPt &start = pStrips.pts[itr->front().ind], &end = pStrips.pts[itr->back().ind]; if (start.ind != end.ind) { if (start.capt == Capt::Not) { StripType s(itr->rbegin(), itr->rend()-1); itr->insert(itr->begin(), s.begin(), s.end()); } else if (end.capt == Capt::Not) { StripType s(itr->rbegin()+1, itr->rend()); itr->insert(itr->end(), s.begin(), s.end()); } } } } bool vtkPolyDataBooleanFilter::HasArea (const StripType &strip) const { bool area = true; std::size_t i, n = strip.size(); if (n%2 == 1) { for (i = 0; i < (n-1)/2; i++) { area = strip[i].ind != strip[n-i-1].ind; } } return area; } bool vtkPolyDataBooleanFilter::CleanStrips () { #ifdef DEBUG std::cout << "CleanStrips()" << std::endl; #endif _IdsType inds; auto FindHoles = [&](PolyStripsType &polyStrips) { PolyStripsType::iterator itr; for (itr = polyStrips.begin(); itr != polyStrips.end(); ++itr) { PStrips &pStrips = itr->second; StripsType &strips = pStrips.strips; StripPtsType &pts = pStrips.pts; strips.erase(std::remove_if(strips.begin(), strips.end(), [&](const StripType &strip) { if (pts.at(strip.front().ind).capt == Capt::Not && pts.at(strip.back().ind).capt == Capt::Not && !HasArea(strip)) { for (const StripPtR &p : strip) { inds.emplace(p.ind); } return true; } return false; }), strips.end()); } }; FindHoles(polyStripsA); FindHoles(polyStripsB); #ifdef DEBUG std::cout << "inds: ["; for (auto &ind : inds) { std::cout << ind << ", "; } std::cout << "]" << std::endl; #endif auto CleanOther = [&](PolyStripsType &polyStrips) { PolyStripsType::iterator itr; for (itr = polyStrips.begin(); itr != polyStrips.end(); ++itr) { PStrips &pStrips = itr->second; StripsType &strips = pStrips.strips; strips.erase(std::remove_if(strips.begin(), strips.end(), [&](const StripType &strip) { auto found = std::find_if(strip.begin(), strip.end(), [&](const StripPtR &p) { return inds.find(p.ind) != inds.end(); }); return found != strip.end(); }), strips.end()); } }; CleanOther(polyStripsA); CleanOther(polyStripsB); auto lines = vtkSmartPointer::New(); vtkIdType i, j, numLines; for (vtkIdType ind : inds) { contLines->GetPointCells(ind, lines); numLines = lines->GetNumberOfIds(); for (i = 0; i < numLines; i++) { contLines->DeleteCell(lines->GetId(i)); } } j = 0; numLines = contLines->GetNumberOfCells(); for (i = 0; i < numLines; i++) { if (contLines->GetCellType(i) == VTK_EMPTY_CELL) { j++; } } if (j == numLines) { return true; } return false; } template void ComputeNormal (const StripPtsType &pts, const _RefsType &poly, double *n) { n[0] = 0; n[1] = 0; n[2] = 0; typename _RefsType::const_iterator itrA, itrB; for (itrA = poly.begin(); itrA != poly.end(); ++itrA) { itrB = itrA+1; if (itrB == poly.end()) { itrB = poly.begin(); } const StripPtR &spA = *itrA, &spB = *itrB; auto pA = pts.find(spA.ind); auto pB = pts.find(spB.ind); const double *ptA = pA->second.cutPt, *ptB = pB->second.cutPt; n[0] += (ptA[1]-ptB[1])*(ptA[2]+ptB[2]); n[1] += (ptA[2]-ptB[2])*(ptA[0]+ptB[0]); n[2] += (ptA[0]-ptB[0])*(ptA[1]+ptB[1]); } vtkMath::Normalize(n); } void CleanPoly (vtkPolyData *pd, IdsType &poly) { IdsType newPoly; newPoly.reserve(poly.size()); double pt[3]; std::map _pts; for (vtkIdType id : poly) { pd->GetPoint(id, pt); _pts.emplace(std::piecewise_construct, std::forward_as_tuple(id), std::forward_as_tuple(pt[0], pt[1], pt[2])); } IdsType::const_iterator itrA, itrB; for (itrA = poly.begin(); itrA != poly.end(); ++itrA) { itrB = itrA+1; if (itrB == poly.end()) { itrB = poly.begin(); } auto _a = _pts.find(*itrA); auto _b = _pts.find(*itrB); if (_a->second == _b->second) {} else { newPoly.push_back(*itrA); } } newPoly.shrink_to_fit(); poly.swap(newPoly); } bool vtkPolyDataBooleanFilter::CutCells (vtkPolyData *pd, PolyStripsType &polyStrips) { #ifdef DEBUG std::cout << "CutCells()" << std::endl; #endif vtkPoints *pdPts = pd->GetPoints(); vtkIdTypeArray *origCellIds = vtkIdTypeArray::SafeDownCast(pd->GetCellData()->GetScalars("OrigCellIds")); PolyStripsType::iterator itrA; for (itrA = polyStrips.begin(); itrA != polyStrips.end(); ++itrA) { const vtkIdType &polyInd = itrA->first; PStrips &pStrips = itrA->second; StripsType &strips = pStrips.strips; StripPtsType &pts = pStrips.pts; IdsType &poly = pStrips.poly; vtkIdType origId = origCellIds->GetValue(polyInd); if (std::all_of(pts.begin(), pts.end(), [](const auto &p) { return p.second.capt & Capt::A || p.second.capt & Capt::B; })) { Poly _poly; for (auto &id : poly) { auto pt = pd->GetPoint(id); _poly.emplace_back(pt[0], pt[1], pt[2]); } std::set ptsA(_poly.begin(), _poly.end()), ptsB; for (const auto& [ind, sp] : pts) { ptsB.emplace(sp.cutPt[0], sp.cutPt[1], sp.cutPt[2]); } if (ptsA == ptsB) { vtkIdList *cell = vtkIdList::New(); for (auto &p : _poly) { cell->InsertNextId(pdPts->InsertNextPoint(p.x, p.y, p.z)); } pd->InsertNextCell(VTK_POLYGON, cell); origCellIds->InsertNextValue(origId); cell->Delete(); pd->DeleteCell(polyInd); continue; } } double _t = 0; std::map absoluteT; for (auto &id : poly) { absoluteT.emplace(id, _t++); } #ifdef DEBUG std::cout << "polyInd " << polyInd << ", poly ["; for (auto &id : poly) { std::cout << id << ", "; } std::cout << "]" << std::endl; #endif // alle strips gültig? if (std::find_if(strips.begin(), strips.end(), [&](const StripType &s) { return pts[s.front().ind].capt == Capt::Branched && pts[s.back().ind].capt == Capt::Branched; }) != strips.end()) { return true; } // holes sichern StripsType holes; auto fct = [&](const StripType &s) { return pts[s.front().ind].capt == Capt::Not && pts[s.back().ind].capt == Capt::Not; }; std::copy_if(strips.begin(), strips.end(), std::back_inserter(holes), fct); strips.erase(std::remove_if(strips.begin(), strips.end(), fct), strips.end()); std::map> stripsM; for (auto &strip : strips) { stripsM.emplace(strip.front().strip, strip); } // init for (auto &strip : strips) { #ifdef DEBUG std::cout << "strip ["; for (auto &p : strip) { std::cout << p.ind << ", "; } std::cout << "] :: " << strip.front().strip << std::endl; #endif // enden auf gleichem edge if (pts[strip.front().ind].edge[0] == pts[strip.back().ind].edge[0] && strip.front().ind != strip.back().ind && pts[strip.front().ind].t > pts[strip.back().ind].t) { std::reverse(strip.begin(), strip.end()); } // branched strip if (pts[strip.front().ind].capt == Capt::Branched && pts[strip.back().ind].capt & Capt::Boundary) { std::reverse(strip.begin(), strip.end()); } StripPt &start = pts[strip.front().ind], &end = pts[strip.back().ind]; strip.front().side = Side::Start; strip.front().ref = start.edge[0]; if (end.capt & Capt::Boundary) { strip.back().side = Side::End; strip.back().ref = end.edge[0]; } for (auto &p : strip) { StripPt &sp = pts[p.ind]; p.desc[0] = pdPts->InsertNextPoint(sp.cutPt); p.desc[1] = pdPts->InsertNextPoint(sp.cutPt); #ifdef DEBUG std::cout << sp << " => " << p << std::endl; #endif } } std::deque polys; polys.push_back(poly); // gruppiert die branched strips std::map groups; for (auto &strip : strips) { if (pts[strip.back().ind].capt == Capt::Branched) { groups[strip.back().ind].emplace_back(strip); } } std::vector assembled; double n[3], ang, pt[3], proj[2]; decltype(groups)::iterator itrB; for (itrB = groups.begin(); itrB != groups.end(); ++itrB) { _StripsType &_strips = itrB->second; // sortiert die strips std::sort(_strips.begin(), _strips.end(), [&](const StripType &a, const StripType &b) { if (a.front().ind == b.front().ind) { ConstRefsType poly_(b.begin(), b.end()); poly_.insert(poly_.end(), a.rbegin(), a.rend()); ComputeNormal(pts, poly_, n); ang = vtkMath::Dot(pStrips.n, n); return ang > .999999; } else { const StripPt &pA = pts[a.front().ind], &pB = pts[b.front().ind]; return absoluteT[pA.edge[0]]+pA.t < absoluteT[pB.edge[0]]+pB.t; } }); // die klassische sanduhr auto next = std::find_if(polys.begin(), polys.end(), [&_strips](const IdsType &p) { return std::find(p.begin(), p.end(), _strips.front().get().front().ref) != p.end(); }); assert(next != polys.end()); std::for_each(_strips.begin(), _strips.end(), [&assembled](const StripType &s) { assembled.push_back(s.front().strip); }); std::vector newPolys; newPolys.reserve(_strips.size()+1); _StripsType::const_iterator _itrA, _itrB; StripType::const_iterator _itrC; StripType::const_reverse_iterator _itrD; for (_itrA = _strips.begin(); _itrA != _strips.end(); ++_itrA) { _itrB = _itrA+1; if (_itrB == _strips.end()) { _itrB = _strips.begin(); } const StripType &stripA = *_itrA, &stripB = *_itrB; IdsType newPoly; for (_itrC = stripB.begin(); _itrC != stripB.end(); ++_itrC) { newPoly.push_back(_itrC->desc[0]); } for (_itrD = stripA.rbegin()+1; _itrD != stripA.rend(); ++_itrD) { newPoly.push_back(_itrD->desc[1]); } // punkte zw. den enden einfügen if (stripA.front().ref != stripB.front().ref) { auto posA = std::find(next->begin(), next->end(), stripA.front().ref); auto posB = std::find(next->begin(), next->end(), stripB.front().ref); for (;;) { posA++; if (posA == next->end()) { posA = next->begin(); } newPoly.push_back(*posA); if (posA == posB) { break; } } } CleanPoly(pd, newPoly); Poly _poly; for (vtkIdType &id : newPoly) { pd->GetPoint(id, pt); Transform(pt, proj, pStrips.base); _poly.emplace_back(proj[0], proj[1], 0); } // refs aktualisieren const StripPt &pA = pts[stripA.front().ind], &pB = pts[stripB.front().ind]; for (auto &s : strips) { if (std::find(assembled.begin(), assembled.end(), s.front().strip) != assembled.end()) { continue; } // noch nicht eingebaut const StripPt &endA = pts[s.front().ind], &endB = pts[s.back().ind]; if (endA.capt & Capt::Boundary && pA.edge[0] == endA.edge[0] && endA.t > pA.t && (pA.edge[0] != pB.edge[0] || endA.t < pB.t)) { s.front().ref = stripA.front().desc[1]; if (endB.ind == pA.ind) { s.back().ref = stripA.front().desc[1]; } else if (endB.ind == pB.ind) { s.back().ref = stripB.front().desc[0]; } } if (endB.capt & Capt::Boundary && pA.edge[0] == endB.edge[0] && endB.t > pA.t && (pA.edge[0] != pB.edge[0] || endB.t < pB.t)) { s.back().ref = stripA.front().desc[1]; if (endA.ind == pA.ind) { s.front().ref = stripA.front().desc[1]; } else if (endA.ind == pB.ind) { s.front().ref = stripB.front().desc[0]; } } if (endA.ind == pA.ind && endB.ind == pB.ind) { s.front().ref = stripA.front().desc[1]; s.back().ref = stripB.front().desc[0]; } else if (endB.ind == pA.ind && endA.ind == pB.ind) { s.back().ref = stripA.front().desc[1]; s.front().ref = stripB.front().desc[0]; } if (endB.capt == Capt::Branched) { Transform(endB.pt, proj, pStrips.base); if (PointInPoly(_poly, {proj[0], proj[1], 0})) { if (endA.ind == pA.ind) { s.front().ref = stripA.front().desc[1]; } else if (endA.ind == pB.ind) { s.front().ref = stripB.front().desc[0]; } } } } newPolys.push_back(std::move(newPoly)); } polys.erase(next); polys.insert(polys.end(), newPolys.begin(), newPolys.end()); } // restliche strips einbauen std::vector newPolys; for (auto &next : polys) { _StripsType _strips; for (auto &strip : strips) { if (pts[strip.back().ind].capt != Capt::Branched && std::find(next.begin(), next.end(), strip.front().ref) != next.end()) { _strips.emplace_back(strip); } } if (_strips.empty()) { newPolys.push_back(next); continue; } std::deque _newPolys {next}; std::map edges; for (auto &s : _strips) { StripType &strip = s; const StripPt &a = pts[strip.front().ind], &b = pts[strip.back().ind]; edges[a.edge[0]].push_back(std::ref(strip.front())); edges[b.edge[0]].push_back(std::ref(strip.back())); } // sortiert die punkte auf den kanten double n[3], ang, r, rA, rB; decltype(edges)::iterator itrC; for (itrC = edges.begin(); itrC != edges.end(); ++itrC) { const vtkIdType &id = itrC->first; RefsType &edge = itrC->second; #ifdef DEBUG std::cout << "edge (" << id << ", _)" << std::endl; #endif std::sort(edge.begin(), edge.end(), [&](const StripPtR &a, const StripPtR &b) { const StripPt &a_ = pts[a.ind], &b_ = pts[b.ind]; if (a_.ind == b_.ind) { // strips beginnen im gleichen punkt if (a.strip != b.strip) { // gehören nicht dem gleichen strip an StripType &stripA = stripsM.at(a.strip), &stripB = stripsM.at(b.strip); // andere enden ermitteln const vtkIdType eA = a.ind == stripA.front().ind ? stripA.back().ind : stripA.front().ind, eB = b.ind == stripB.front().ind ? stripB.back().ind : stripB.front().ind; const StripPt &eA_ = pts[eA], &eB_ = pts[eB]; if (eA_.ind != eB_.ind) { r = absoluteT[id]+a_.t; rA = absoluteT[eA_.edge[0]]+eA_.t; rB = absoluteT[eB_.edge[0]]+eB_.t; rA = rA > r ? rA-r : rA+_t-r, rB = rB > r ? rB-r : rB+_t-r; return rB < rA; } else { RefsType poly_; if (a.side == Side::Start) { poly_.insert(poly_.end(), stripA.begin(), stripA.end()); } else { poly_.insert(poly_.end(), stripA.rbegin(), stripA.rend()); } if (b.side == Side::Start) { poly_.insert(poly_.end(), stripB.rbegin()+1, stripB.rend()-1); } else { poly_.insert(poly_.end(), stripB.begin()+1, stripB.end()-1); } ComputeNormal(pts, poly_, n); ang = vtkMath::Dot(pStrips.n, n); return ang < .999999; } } else { // gleicher strip StripType &strip = stripsM.at(a.strip); if (HasArea(strip)) { RefsType poly_(strip.begin(), strip.end()-1); ComputeNormal(pts, poly_, n); ang = vtkMath::Dot(pStrips.n, n); if (ang > .999999) { std::reverse(strip.begin(), strip.end()); return true; } else { return false; } } else { // reihenfolge von a und b bereits richtig return false; } } } else { return a_.t < b_.t; } }); #ifdef DEBUG for (auto& e : edge) { std::cout << e << ", t " << pts[e.get().ind].t << std::endl; } #endif } // strips einbauen IdsType::iterator _itrA; StripType::reverse_iterator _itrB; for (auto &s : _strips) { StripType &strip = s; const StripPtR &start = strip.front(), &end = strip.back(); #ifdef DEBUG std::cout << "strip " << start.strip << ", refs (" << start.ref << ", " << end.ref << ")" << std::endl; #endif std::size_t cycle = 0; while (true) { if (cycle == _newPolys.size()) { break; } IdsType _next = _newPolys.front(); _newPolys.pop_front(); std::vector splitted(2); if (std::find(_next.begin(), _next.end(), start.ref) != _next.end()) { if (start.ref == end.ref) { for (_itrA = _next.begin(); _itrA != _next.end(); ++_itrA) { splitted[0].push_back(*_itrA); #ifdef DEBUG std::cout << "adding " << *_itrA << " to 0" << std::endl; #endif if (*_itrA == start.ref) { for (auto &p : strip) { splitted[0].push_back(p.desc[0]); #ifdef DEBUG std::cout << "adding " << p.desc[0] << " to 0" << std::endl; #endif } } } // strip selbst ist ein polygon for (_itrB = strip.rbegin(); _itrB != strip.rend(); ++_itrB) { splitted[1].push_back(_itrB->desc[1]); #ifdef DEBUG std::cout << "adding " << _itrB->desc[1] << " to 1" << std::endl; #endif } } else { std::size_t curr = 0; for (_itrA = _next.begin(); _itrA != _next.end(); ++_itrA) { IdsType &poly = splitted[curr]; poly.push_back(*_itrA); #ifdef DEBUG std::cout << "adding " << *_itrA << " to " << curr << std::endl; #endif if (*_itrA == start.ref) { for (auto &p : strip) { poly.push_back(p.desc[0]); #ifdef DEBUG std::cout << "adding " << p.desc[0] << " to " << curr << std::endl; #endif } curr = curr == 0 ? 1 : 0; } else if (*_itrA == end.ref) { for (_itrB = strip.rbegin(); _itrB != strip.rend(); ++_itrB) { poly.push_back(_itrB->desc[1]); #ifdef DEBUG std::cout << "adding " << _itrB->desc[1] << " to " << curr << std::endl; #endif } curr = curr == 0 ? 1 : 0; } } } } if (!splitted[1].empty()) { // refs aktualisieren for (itrC = edges.begin(); itrC != edges.end(); ++itrC) { RefsType &edge = itrC->second; RefsType::iterator _itrA; for (_itrA = edge.begin()+1; _itrA != edge.end(); ++_itrA) { StripPtR &sp = *_itrA; if (sp.strip > start.strip) { #ifdef DEBUG std::cout << "ind " << sp.ind << ", strip " << sp.strip << std::endl; #endif RefsType::const_reverse_iterator _itrB(_itrA); std::shared_ptr _p; for (; _itrB != edge.rend(); ++_itrB) { const StripPtR &p = *_itrB; if (p.strip != sp.strip) { if (p.strip <= start.strip) { vtkIdType _ref; if (p.side == Side::End) { _ref = p.desc[0]; } else { _ref = p.desc[1]; } #ifdef DEBUG if (sp.ref != _ref) { std::cout << "*1 ref " << sp.ref << " -> " << _ref << " (from strip " << p.strip << ", ind " << p.ind << ")" << std::endl; } #endif sp.ref = _ref; _p = std::make_shared(p); break; } } else { #ifdef DEBUG if (sp.ref != p.ref) { std::cout << "*2 ref " << sp.ref << " -> " << p.ref << " (from strip " << p.strip << ", ind " << p.ind << ")" << std::endl; } #endif sp.ref = p.ref; break; } } RefsType::const_iterator _itrC(_itrA); ++_itrC; for (; _itrC != edge.end(); ++_itrC) { const StripPtR &p = *_itrC; if (p.ind != sp.ind) { break; } if (p.strip <= start.strip) { if (_p && p.ind == _p->ind && p.strip < _p->strip) { break; } vtkIdType _ref; if (p.side == Side::Start) { _ref = p.desc[0]; } else { _ref = p.desc[1]; } #ifdef DEBUG if (sp.ref != _ref) { std::cout << "*3 ref " << sp.ref << " -> " << _ref << " (from strip " << p.strip << ", ind " << p.ind << ")" << std::endl; } #endif sp.ref = _ref; break; } } } } // sonderfall if (edge.size() > 1) { StripPtR &a = edge.front(), &b = *(edge.begin()+1); if (a.ind == b.ind && b.strip == start.strip && pts[a.ind].capt == Capt::A) { // sollte weg vtkIdType _ref; if (b.side == Side::Start) { _ref = b.desc[0]; } else { _ref = b.desc[1]; } #ifdef DEBUG if (a.ref != _ref) { std::cout << "*4 ref " << a.ref << " -> " << _ref << " (from strip " << b.strip << ", ind " << b.ind << ")" << std::endl; } #endif a.ref = _ref; } } } // doppelte punkte entfernen for (auto &p : splitted) { CleanPoly(pd, p); } // prüft, ob die erstellten _newPolys gültig sind if (splitted[0].size() > 2) { _newPolys.push_back(splitted[0]); } if (HasArea(strip) && splitted[1].size() > 2) { _newPolys.push_back(splitted[1]); } cycle = 0; break; } else { _newPolys.push_back(_next); cycle++; } } } newPolys.insert(newPolys.end(), _newPolys.begin(), _newPolys.end()); } // erzeugte polys hinzufügen IdsType descIds; descIds.reserve(newPolys.size()); for (auto &p : newPolys) { vtkIdList *cell = vtkIdList::New(); for (vtkIdType &id : p) { cell->InsertNextId(id); } descIds.emplace_back(pd->InsertNextCell(VTK_POLYGON, cell)); origCellIds->InsertNextValue(origId); cell->Delete(); } pd->DeleteCell(polyInd); // holes einbauen if (!holes.empty()) { try { Merger(pd, pStrips, holes, descIds, origId).Run(); } catch (const std::runtime_error &e) { return true; } } } pd->RemoveDeletedCells(); pd->BuildCells(); return false; } void vtkPolyDataBooleanFilter::RestoreOrigPoints (vtkPolyData *pd, PolyStripsType &polyStrips) { #ifdef DEBUG std::cout << "RestoreOrigPoints()" << std::endl; #endif pd->DeleteLinks(); pd->BuildLinks(); vtkKdTreePointLocator *loc = vtkKdTreePointLocator::New(); loc->SetDataSet(pd); loc->BuildLocator(); PolyStripsType::const_iterator itr; StripPtsType::const_iterator itr2; auto pts = vtkSmartPointer::New(); vtkIdType i, numPts; for (itr = polyStrips.begin(); itr != polyStrips.end(); ++itr) { const PStrips &pStrips = itr->second; for (itr2 = pStrips.pts.begin(); itr2 != pStrips.pts.end(); ++itr2) { const StripPt &sp = itr2->second; if (sp.capt & Capt::Boundary) { FindPoints(loc, sp.cutPt, pts); numPts = pts->GetNumberOfIds(); for (i = 0; i < numPts; i++) { pd->GetPoints()->SetPoint(pts->GetId(i), sp.pt); } } } } loc->FreeSearchStructure(); loc->Delete(); } void vtkPolyDataBooleanFilter::DisjoinPolys (vtkPolyData *pd, PolyStripsType &polyStrips) { #ifdef DEBUG std::cout << "DisjoinPolys()" << std::endl; #endif pd->DeleteLinks(); pd->BuildLinks(); vtkKdTreePointLocator *loc = vtkKdTreePointLocator::New(); loc->SetDataSet(pd); struct Cmp { bool operator() (const StripPt &l, const StripPt &r) const { return l.ind < r.ind; } }; PolyStripsType::const_iterator itr; StripPtsType::const_iterator itr2; std::set, Cmp> ends; for (itr = polyStrips.begin(); itr != polyStrips.end(); ++itr) { const PStrips &pStrips = itr->second; for (itr2 = pStrips.pts.begin(); itr2 != pStrips.pts.end(); ++itr2) { const StripPt &sp = itr2->second; if (sp.capt == Capt::A) { ends.emplace(sp); } } } vtkIdList *pts = vtkIdList::New(); vtkIdList *cells = vtkIdList::New(); vtkIdType i, j, numPts, numCells; for (const StripPt &sp : ends) { FindPoints(loc, sp.pt, pts); numPts = pts->GetNumberOfIds(); for (i = 0; i < numPts; i++) { pd->GetPointCells(pts->GetId(i), cells); numCells = cells->GetNumberOfIds(); if (numCells > 1) { for (j = 0; j < numCells; j++) { pd->ReplaceCellPoint(cells->GetId(j), pts->GetId(i), pd->GetPoints()->InsertNextPoint(sp.pt)); } } } } cells->Delete(); pts->Delete(); loc->FreeSearchStructure(); loc->Delete(); } void vtkPolyDataBooleanFilter::ResolveOverlaps (vtkPolyData *pd, PolyStripsType &polyStrips) { #ifdef DEBUG std::cout << "ResolveOverlaps()" << std::endl; #endif typedef std::pair, std::reference_wrapper> _Type; std::map> _pts; PolyStripsType::const_iterator itr; StripPtsType::const_iterator itr2; for (itr = polyStrips.begin(); itr != polyStrips.end(); ++itr) { const PStrips &pStrips = itr->second; const StripPtsType &pts = pStrips.pts; for (itr2 = pts.begin(); itr2 != pts.end(); ++itr2) { const StripPt &sp = itr2->second; if (sp.capt == Capt::Edge) { _pts[sp.ind].emplace_back(pts, sp); } } } decltype(_pts)::iterator itr3; StripPtsType::const_iterator itr4; for (itr3 = _pts.begin(); itr3 != _pts.end(); ++itr3) { auto &pairs = itr3->second; if (pairs.size() == 2) { auto &pairA = pairs[0]; auto &pairB = pairs[1]; if (pairA.second.get().edge[1] != pairB.second.get().edge[0]) { pairA.swap(pairB); } auto edgeA = pairA.second.get().edge; auto edgeB = pairB.second.get().edge; if (edgeA[1] == edgeB[0] && edgeA[0] != edgeB[1]) { #ifdef DEBUG std::cout << itr3->first << ": " << edgeA[0] << ", " << edgeA[1] << ", " << edgeB[0] << ", " << edgeB[1] << std::endl; #endif auto &ptsA = pairA.first.get(); auto &ptsB = pairB.first.get(); std::deque> _edgeA, _edgeB; for (itr4 = ptsA.begin(); itr4 != ptsA.end(); ++itr4) { auto &sp = itr4->second; if (sp.edge[0] == edgeA[0] && sp.edge[1] == edgeA[1]) { _edgeA.emplace_back(sp); } } for (itr4 = ptsB.begin(); itr4 != ptsB.end(); ++itr4) { auto &sp = itr4->second; if (sp.edge[0] == edgeB[0] && sp.edge[1] == edgeB[1]) { _edgeB.emplace_back(sp); } } std::sort(_edgeA.begin(), _edgeA.end(), [](const StripPt &l, const StripPt &r) { return l.t < r.t; }); std::sort(_edgeB.begin(), _edgeB.end(), [](const StripPt &l, const StripPt &r) { return l.t < r.t; }); #ifdef DEBUG for (const StripPt &sp : _edgeA) { std::cout << sp << std::endl; } for (const StripPt &sp : _edgeB) { std::cout << sp << std::endl; } #endif assert(_edgeA.back().get().ind == itr3->first); assert(_edgeB.front().get().ind == itr3->first); _edgeA.pop_back(); _edgeB.pop_front(); double pA[3], pB[3]; if (_edgeA.empty()) { pd->GetPoint(edgeA[0], pA); } else { std::copy_n(_edgeA.back().get().pt, 3, pA); } if (_edgeB.empty()) { pd->GetPoint(edgeB[1], pB); } else { std::copy_n(_edgeB.front().get().pt, 3, pB); } Point3d a {pA[0], pA[1], pA[2]}; Point3d b {pB[0], pB[1], pB[2]}; auto cells = vtkSmartPointer::New(), cell = vtkSmartPointer::New(); pd->GetPointCells(edgeA[1], cells); vtkIdType i, j, numCells = cells->GetNumberOfIds(); double pt[3]; vtkIdType id; for (i = 0; i < numCells; i++) { pd->GetCellPoints(cells->GetId(i), cell); Poly poly; for (j = 0; j < cell->GetNumberOfIds(); j++) { pd->GetPoint(cell->GetId(j), pt); poly.emplace_back(pt[0], pt[1], pt[2]); } if (std::find(poly.begin(), poly.end(), a) != poly.end() && std::find(poly.begin(), poly.end(), b) != poly.end()) { contLines->GetPoint(itr3->first, pt); id = pd->GetPoints()->InsertNextPoint(pt); #ifdef DEBUG std::cout << cells->GetId(i) << ": " << edgeA[1] << " -> " << id << std::endl; #endif pd->ReplaceCellPoint(cells->GetId(i), edgeA[1], id); break; } } } } } } void vtkPolyDataBooleanFilter::AddAdjacentPoints (vtkPolyData *pd, vtkIdTypeArray *conts, PolyStripsType &polyStrips) { #ifdef DEBUG std::cout << "AddAdjacentPoints()" << std::endl; #endif pd->DeleteLinks(); pd->BuildLinks(); vtkIdTypeArray *origCellIds = vtkIdTypeArray::SafeDownCast(pd->GetCellData()->GetScalars("OrigCellIds")); struct Cmp { bool operator() (const StripPt &l, const StripPt &r) const { return l.t < r.t; } }; auto loc = vtkSmartPointer::New(); loc->SetDataSet(pd); loc->BuildLocator(); auto lines = vtkSmartPointer::New(); vtkIdType i, j, numLines; auto ptsA = vtkSmartPointer::New(); auto ptsB = vtkSmartPointer::New(); vtkIdType numPtsA, numPtsB; auto cells = vtkSmartPointer::New(); vtkIdType numCells; auto poly = vtkSmartPointer::New(); auto newPoly = vtkSmartPointer::New(); vtkIdType numPts; vtkIdType idA, idB; PolyStripsType::const_iterator itr; StripPtsType::const_iterator itr2; for (itr = polyStrips.begin(); itr != polyStrips.end(); ++itr) { const PStrips &pStrips = itr->second; std::map, Cmp>> edgePts; for (itr2 = pStrips.pts.begin(); itr2 != pStrips.pts.end(); ++itr2) { const StripPt &sp = itr2->second; if (sp.capt == Capt::Edge) { edgePts[{sp.edge[0], sp.edge[1]}].emplace(sp); } } decltype(edgePts)::iterator itr3; for (itr3 = edgePts.begin(); itr3 != edgePts.end(); ++itr3) { const Pair &edge = itr3->first; auto pts = itr3->second; StripPt spA, spB; pd->GetPoint(edge.f, spA.pt); pd->GetPoint(edge.g, spB.pt); spA.t = 0; spB.t = 1; pts.emplace(spA); pts.emplace(spB); std::vector _pts(pts.rbegin(), pts.rend()); decltype(_pts)::const_iterator itrA, itrB, itrC; itrA = _pts.begin(); while (itrA != _pts.end()-1) { itrB = itrA+1; while (itrB != _pts.end()-1) { contLines->GetPointCells(itrB->get().ind, lines); numLines = lines->GetNumberOfIds(); _IdsType involved; for (i = 0; i < numLines; i++) { involved.emplace(conts->GetValue(lines->GetId(i))); } if (involved.size() > 1) { break; } ++itrB; } if (itrA+1 != itrB) { FindPoints(loc, itrA->get().pt, ptsA); FindPoints(loc, itrB->get().pt, ptsB); numPtsA = ptsA->GetNumberOfIds(); numPtsB = ptsB->GetNumberOfIds(); std::vector polysA, polysB; for (i = 0; i < numPtsA; i++) { pd->GetPointCells(ptsA->GetId(i), cells); numCells = cells->GetNumberOfIds(); for (j = 0; j < numCells; j++) { polysA.emplace_back(cells->GetId(j), ptsA->GetId(i)); } } for (i = 0; i < numPtsB; i++) { pd->GetPointCells(ptsB->GetId(i), cells); numCells = cells->GetNumberOfIds(); for (j = 0; j < numCells; j++) { polysB.emplace_back(cells->GetId(j), ptsB->GetId(i)); } } /*for (const Pair &pA : polysA) { std::cout << "pA " << pA << std::endl; } for (const Pair &pB : polysB) { std::cout << "pB " << pB << std::endl; }*/ for (const Pair &pA : polysA) { for (const Pair &pB : polysB) { if (pA.f == pB.f && pd->GetCellType(pA.f) != VTK_EMPTY_CELL) { pd->GetCellPoints(pA.f, poly); numPts = poly->GetNumberOfIds(); newPoly->Reset(); for (i = 0; i < numPts; i++) { newPoly->InsertNextId(poly->GetId(i)); idA = poly->GetId(i); idB = i+1 == numPts ? poly->GetId(0) : poly->GetId(i+1); if (pA.g == idA && pB.g == idB) { for (itrC = itrA+1; itrC != itrB; ++itrC) { // newPoly->InsertNextId(pd->InsertNextLinkedPoint(itrC->get().pt, 1)); pd->InsertNextLinkedPoint(1); newPoly->InsertNextId(pd->GetPoints()->InsertNextPoint(itrC->get().pt)); } } pd->RemoveReferenceToCell(idA, pA.f); } pd->DeleteCell(pA.f); pd->InsertNextLinkedCell(VTK_POLYGON, newPoly->GetNumberOfIds(), newPoly->GetPointer(0)); origCellIds->InsertNextValue(origCellIds->GetValue(pA.f)); break; } } } } itrA = itrB; } } } loc->FreeSearchStructure(); pd->RemoveDeletedCells(); } void vtkPolyDataBooleanFilter::MergePoints (vtkPolyData *pd, PolyStripsType &polyStrips) { #ifdef DEBUG std::cout << "MergePoints()" << std::endl; #endif pd->BuildCells(); pd->DeleteLinks(); pd->BuildLinks(); contLines->DeleteLinks(); contLines->BuildLinks(); auto loc = vtkSmartPointer::New(); loc->SetDataSet(pd); PolyStripsType::const_iterator itr; StripsType::const_iterator itr2; std::map neighPts; auto pts = vtkSmartPointer::New(); vtkIdType i, j, numPts; for (itr = polyStrips.begin(); itr != polyStrips.end(); ++itr) { const PStrips &pStrips = itr->second; for (itr2 = pStrips.strips.begin(); itr2 != pStrips.strips.end(); ++itr2) { const StripType &strip = *itr2; const StripPtR &spA = strip.front(), &spB = strip.back(); const auto beforeA = pStrips.pts.find((strip.begin()+1)->ind), beforeB = pStrips.pts.find((strip.end()-2)->ind); FindPoints(loc, beforeA->second.pt, pts); numPts = pts->GetNumberOfIds(); for (i = 0; i < numPts; i++) { neighPts[spA.ind].insert(pts->GetId(i)); } FindPoints(loc, beforeB->second.pt, pts); numPts = pts->GetNumberOfIds(); for (i = 0; i < numPts; i++) { neighPts[spB.ind].insert(pts->GetId(i)); } } } double pt[3]; auto polys = vtkSmartPointer::New(); auto poly = vtkSmartPointer::New(); vtkIdType ind, polyId, _numPts, before, after; decltype(neighPts)::const_iterator itr3; for (itr3 = neighPts.begin(); itr3 != neighPts.end(); ++itr3) { const auto &inds = itr3->second; std::map> pairs; contLines->GetPoint(itr3->first, pt); FindPoints(loc, pt, pts); numPts = pts->GetNumberOfIds(); for (i = 0; i < numPts; i++) { ind = pts->GetId(i); pd->GetPointCells(ind, polys); if (polys->GetNumberOfIds() > 0) { polyId = polys->GetId(0); pd->GetCellPoints(polyId, poly); _numPts = poly->GetNumberOfIds(); for (j = 0; j < _numPts; j++) { if (poly->GetId(j) == ind) { break; } } // wieder davor und danach ermitteln before = poly->GetId(j == 0 ? _numPts-1 : j-1); after = poly->GetId(j+1 == _numPts ? 0 : j+1); if (std::find(inds.begin(), inds.end(), before) == inds.end()) { pd->GetPoint(before, pt); pairs[{pt[0], pt[1], pt[2]}].emplace_back(polyId, ind); } if (std::find(inds.begin(), inds.end(), after) == inds.end()) { pd->GetPoint(after, pt); pairs[{pt[0], pt[1], pt[2]}].emplace_back(polyId, ind); } } } std::deque>> Pairs; decltype(pairs)::const_iterator itr4; for (itr4 = pairs.begin(); itr4 != pairs.end(); ++itr4) { const auto &p = itr4->second; if (p.size() == 2) { auto _pts = {std::ref(p.front()), std::ref(p.back())}; // std::initializer_list Pairs.emplace_back(_pts); } } decltype(Pairs)::iterator itr5; /*for (itr5 = Pairs.begin(); itr5 != Pairs.end(); ++itr5) { for (auto &p : *itr5) { std::cout << p.get() << ", "; } std::cout << std::endl; }*/ decltype(Pairs)::value_type group; decltype(group)::const_iterator itr6; while (!Pairs.empty()) { if (group.empty()) { group = Pairs.front(); Pairs.pop_front(); } itr5 = Pairs.begin(); while (itr5 != Pairs.end()) { const auto &next = *itr5; if (next.front().get() == group.front().get()) { group.emplace_front(next.back()); Pairs.erase(itr5); itr5 = Pairs.begin(); } else if (next.front().get() == group.back().get()) { group.emplace_back(next.back()); Pairs.erase(itr5); itr5 = Pairs.begin(); } else if (next.back().get() == group.front().get()) { group.emplace_front(next.front()); Pairs.erase(itr5); itr5 = Pairs.begin(); } else if (next.back().get() == group.back().get()) { group.emplace_back(next.front()); Pairs.erase(itr5); itr5 = Pairs.begin(); } else { ++itr5; } } if (itr5 == Pairs.end()) { for (itr6 = group.begin()+1; itr6 != group.end(); ++itr6) { pd->ReplaceCellPoint(itr6->get().f, itr6->get().g, group.front().get().g); } group.clear(); } } } loc->FreeSearchStructure(); } enum class Congr { Equal, Opposite, Not }; class PolyAtEdge { vtkPolyData *pd; public: PolyAtEdge (vtkPolyData *_pd, vtkIdType _polyId, vtkIdType _ptIdA, vtkIdType _ptIdB) : pd(_pd), polyId(_polyId), ptIdA(_ptIdA), ptIdB(_ptIdB), loc(Loc::None) { double ptA[3], ptB[3]; pd->GetPoint(ptIdA, ptA); pd->GetPoint(ptIdB, ptB); vtkMath::Subtract(ptB, ptA, e); vtkMath::Normalize(e); const vtkIdType *poly; vtkIdType numPts; pd->GetCellPoints(polyId, numPts, poly); ComputeNormal(pd->GetPoints(), n, numPts, poly); vtkMath::Cross(e, n, r); } vtkIdType polyId, ptIdA, ptIdB; double n[3], e[3], r[3]; Loc loc; friend std::ostream& operator<< (std::ostream &out, const PolyAtEdge &p) { out << "polyId " << p.polyId << ", ptIdA " << p.ptIdA << ", ptIdB " << p.ptIdB; return out; } static constexpr double eps {.99999999}; // ~.0081deg Congr IsCongruent (const PolyAtEdge &p) const { double cong = vtkMath::Dot(n, p.n); if (cong > eps || cong < -eps) { double ang = vtkMath::Dot(r, p.r); if (ang > eps) { if (cong > eps) { // normalen sind gleich ausgerichtet return Congr::Equal; } else { return Congr::Opposite; } } } return Congr::Not; } }; class PolyPair { public: PolyPair (PolyAtEdge _pA, PolyAtEdge _pB) : pA(_pA), pB(_pB) {} PolyAtEdge pA, pB; void GetLoc (PolyAtEdge &pT, vtkIdType mode) { Congr cA = pA.IsCongruent(pT), cB = pB.IsCongruent(pT); #ifdef DEBUG std::cout << "GetLoc() -> polyId " << pT.polyId << ", cA " << cA << ", cB " << cB << std::endl; if (cA != Congr::Not || cB != Congr::Not) { assert(cA != cB); } #endif if (cA == Congr::Equal || cA == Congr::Opposite) { if (cA == Congr::Opposite) { // normalen sind entgegengesetzt gerichtet if (mode == OPER_INTERSECTION) { pA.loc = Loc::Outside; pT.loc = Loc::Outside; } else { pA.loc = Loc::Inside; pT.loc = Loc::Inside; } } else if (mode == OPER_UNION || mode == OPER_INTERSECTION) { pA.loc = Loc::Inside; pT.loc = Loc::Outside; } } else if (cB == Congr::Equal || cB == Congr::Opposite) { if (cB == Congr::Opposite) { // normalen sind entgegengesetzt gerichtet if (mode == OPER_INTERSECTION) { pB.loc = Loc::Outside; pT.loc = Loc::Outside; } else { pB.loc = Loc::Inside; pT.loc = Loc::Inside; } } else if (mode == OPER_UNION || mode == OPER_INTERSECTION) { pB.loc = Loc::Inside; pT.loc = Loc::Outside; } } else { double alpha = GetAngle(pA.r, pB.r, pA.e), beta = GetAngle(pA.r, pT.r, pA.e); if (beta > alpha) { pT.loc = Loc::Inside; } else { pT.loc = Loc::Outside; } } } }; std::shared_ptr GetEdgePolys (vtkPolyData *pd, vtkIdList *ptsA, vtkIdList *ptsB) { #ifdef DEBUG std::cout << "GetEdgePolys()" << std::endl; #endif std::vector p; vtkIdType numPtsA = ptsA->GetNumberOfIds(), numPtsB = ptsB->GetNumberOfIds(); vtkIdList *polys = vtkIdList::New(); vtkIdType i, j, numCells; for (i = 0; i < numPtsA; i++) { pd->GetPointCells(ptsA->GetId(i), polys); numCells = polys->GetNumberOfIds(); for (j = 0; j < numCells; j++) { p.emplace_back(ptsA->GetId(i), polys->GetId(j)); } } for (i = 0; i < numPtsB; i++) { pd->GetPointCells(ptsB->GetId(i), polys); numCells = polys->GetNumberOfIds(); for (j = 0; j < numCells; j++) { p.emplace_back(ptsB->GetId(i), polys->GetId(j)); } } polys->Delete(); std::map pEdges; std::vector::const_iterator itr; for (itr = p.begin(); itr != p.end(); ++itr) { pEdges[itr->g].push_back(itr->f); } std::vector opp; vtkIdList *poly = vtkIdList::New(); vtkIdType numPts, a, b; std::map::const_iterator itr2; for (itr2 = pEdges.begin(); itr2 != pEdges.end(); ++itr2) { const IdsType &pts = itr2->second; if (pts.size() > 1) { pd->GetCellPoints(itr2->first, poly); numPts = poly->GetNumberOfIds(); for (i = 0; i < numPts; i++) { a = poly->GetId(i); b = i+1 == numPts ? poly->GetId(0) : poly->GetId(i+1); if (std::find(pts.begin(), pts.end(), a) != pts.end() && std::find(pts.begin(), pts.end(), b) != pts.end()) { opp.emplace_back(pd, itr2->first, a, b); } } } } poly->Delete(); #ifdef DEBUG for (auto &op : opp) { std::cout << op << std::endl; } #endif if (opp.size() != 2) { return nullptr; } return std::make_shared(opp[0], opp[1]); } bool vtkPolyDataBooleanFilter::CombineRegions () { #ifdef DEBUG std::cout << "CombineRegions()" << std::endl; #endif auto filterdA = vtkSmartPointer::New(); filterdA->DeepCopy(modPdA); auto filterdB = vtkSmartPointer::New(); filterdB->DeepCopy(modPdB); // ungenutzte punkte löschen auto cleanA = vtkSmartPointer::New(); cleanA->PointMergingOff(); cleanA->SetInputData(filterdA); auto cleanB = vtkSmartPointer::New(); cleanB->PointMergingOff(); cleanB->SetInputData(filterdB); // regionen mit skalaren ausstatten auto cfA = vtkSmartPointer::New(); cfA->SetExtractionModeToAllRegions(); cfA->ColorRegionsOn(); cfA->SetInputConnection(cleanA->GetOutputPort()); auto cfB = vtkSmartPointer::New(); cfB->SetExtractionModeToAllRegions(); cfB->ColorRegionsOn(); cfB->SetInputConnection(cleanB->GetOutputPort()); cfA->Update(); cfB->Update(); vtkPolyData *pdA = cfA->GetOutput(); vtkPolyData *pdB = cfB->GetOutput(); #ifdef DEBUG WriteVTK("modPdA_8.vtk", pdA); WriteVTK("modPdB_8.vtk", pdB); #endif if (OperMode == OPER_NONE) { resultA->ShallowCopy(pdA); resultB->ShallowCopy(pdB); contLines->RemoveDeletedCells(); resultC->ShallowCopy(contLines); return false; } auto plA = vtkSmartPointer::New(); plA->SetDataSet(pdA); plA->BuildLocator(); auto plB = vtkSmartPointer::New(); plB->SetDataSet(pdB); plB->BuildLocator(); pdA->DeleteLinks(); pdA->BuildLinks(); pdB->DeleteLinks(); pdB->BuildLinks(); vtkIdTypeArray *scalarsA = vtkIdTypeArray::SafeDownCast(pdA->GetPointData()->GetScalars()); vtkIdTypeArray *scalarsB = vtkIdTypeArray::SafeDownCast(pdB->GetPointData()->GetScalars()); auto line = vtkSmartPointer::New(); double ptA[3], ptB[3]; auto fptsA = vtkSmartPointer::New(); auto lptsA = vtkSmartPointer::New(); auto fptsB = vtkSmartPointer::New(); auto lptsB = vtkSmartPointer::New(); std::map locsA, locsB; vtkIdType i, j, numLines = contLines->GetNumberOfCells(); IdsType _failed; for (i = 0; i < numLines; i++) { if (contLines->GetCellType(i) == VTK_EMPTY_CELL) { continue; } contLines->GetCellPoints(i, line); contLines->GetPoint(line->GetId(0), ptA); contLines->GetPoint(line->GetId(1), ptB); FindPoints(plA, ptA, fptsA); FindPoints(plB, ptA, fptsB); #ifdef DEBUG std::cout << "line " << i << std::endl; #else // bereits behandelte regionen werden nicht noch einmal untersucht vtkIdType notLocated = 0; for (j = 0; j < fptsA->GetNumberOfIds(); j++) { if (locsA.count(scalarsA->GetValue(fptsA->GetId(j))) == 0) { notLocated++; } } for (j = 0; j < fptsB->GetNumberOfIds(); j++) { if (locsB.count(scalarsB->GetValue(fptsB->GetId(j))) == 0) { notLocated++; } } if (notLocated == 0) { continue; } #endif FindPoints(plA, ptB, lptsA); FindPoints(plB, ptB, lptsB); auto ppA = GetEdgePolys(pdA, fptsA, lptsA); auto ppB = GetEdgePolys(pdB, fptsB, lptsB); if (ppA && ppB) { ppB->GetLoc(ppA->pA, OperMode); ppB->GetLoc(ppA->pB, OperMode); ppA->GetLoc(ppB->pA, OperMode); ppA->GetLoc(ppB->pB, OperMode); vtkIdType fsA = scalarsA->GetValue(ppA->pA.ptIdA); vtkIdType lsA = scalarsA->GetValue(ppA->pB.ptIdA); vtkIdType fsB = scalarsB->GetValue(ppB->pA.ptIdA); vtkIdType lsB = scalarsB->GetValue(ppB->pB.ptIdA); #ifdef DEBUG std::cout << "polyId " << ppA->pA.polyId << ", sA " << fsA << ", loc " << ppA->pA.loc << std::endl; std::cout << "polyId " << ppA->pB.polyId << ", sA " << lsA << ", loc " << ppA->pB.loc << std::endl; std::cout << "polyId " << ppB->pA.polyId << ", sB " << fsB << ", loc " << ppB->pA.loc << std::endl; std::cout << "polyId " << ppB->pB.polyId << ", sB " << lsB << ", loc " << ppB->pB.loc << std::endl; if (locsA.count(fsA) > 0 && locsA[fsA] != ppA->pA.loc) { std::cout << "sA " << fsA << ": " << locsA[fsA] << " -> " << ppA->pA.loc << std::endl; } if (locsA.count(lsA) > 0 && locsA[lsA] != ppA->pB.loc) { std::cout << "sA " << lsA << ": " << locsA[lsA] << " -> " << ppA->pB.loc << std::endl; } if (locsB.count(fsB) > 0 && locsB[fsB] != ppB->pA.loc) { std::cout << "sB " << fsB << ": " << locsB[fsB] << " -> " << ppB->pA.loc << std::endl; } if (locsB.count(lsB) > 0 && locsB[lsB] != ppB->pB.loc) { std::cout << "sB " << lsB << ": " << locsB[lsB] << " -> " << ppB->pB.loc << std::endl; } #endif locsA.emplace(fsA, ppA->pA.loc); locsA.emplace(lsA, ppA->pB.loc); locsB.emplace(fsB, ppB->pA.loc); locsB.emplace(lsB, ppB->pB.loc); } else { _failed.push_back(i); } } if (_failed.size() > 0) { #ifdef DEBUG for (auto i : _failed) { std::cout << "failed at " << i << std::endl; } #endif return true; } // reale kombination der ermittelten regionen Loc comb[] = {Loc::Outside, Loc::Outside}; if (OperMode == OPER_INTERSECTION) { comb[0] = Loc::Inside; comb[1] = Loc::Inside; } else if (OperMode == OPER_DIFFERENCE) { comb[1] = Loc::Inside; } else if (OperMode == OPER_DIFFERENCE2) { comb[0] = Loc::Inside; } vtkIdType numA = cfA->GetNumberOfExtractedRegions(), numB = cfB->GetNumberOfExtractedRegions(); cfA->SetExtractionModeToSpecifiedRegions(); cfB->SetExtractionModeToSpecifiedRegions(); std::map::const_iterator itr; for (itr = locsA.begin(); itr != locsA.end(); itr++) { if (itr->second == comb[0]) { cfA->AddSpecifiedRegion(itr->first); } } for (itr = locsB.begin(); itr != locsB.end(); itr++) { if (itr->second == comb[1]) { cfB->AddSpecifiedRegion(itr->first); } } // nicht beteiligte regionen hinzufügen if (OperMode == OPER_UNION || OperMode == OPER_DIFFERENCE) { for (i = 0; i < numA; i++) { if (locsA.count(i) == 0) { cfA->AddSpecifiedRegion(i); } } } if (OperMode == OPER_UNION || OperMode == OPER_DIFFERENCE2) { for (i = 0; i < numB; i++) { if (locsB.count(i) == 0) { cfB->AddSpecifiedRegion(i); } } } // nach innen zeigende normalen umkehren cfA->Update(); cfB->Update(); vtkPolyData *regsA = cfA->GetOutput(); vtkPolyData *regsB = cfB->GetOutput(); scalarsA = vtkIdTypeArray::SafeDownCast(regsA->GetPointData()->GetScalars()); scalarsB = vtkIdTypeArray::SafeDownCast(regsB->GetPointData()->GetScalars()); if (OperMode != OPER_INTERSECTION) { vtkCellIterator *cellItr; vtkIdType cellId; vtkIdList *ptIds; if (comb[0] == Loc::Inside) { cellItr = regsA->NewCellIterator(); for (cellItr->InitTraversal(); !cellItr->IsDoneWithTraversal(); cellItr->GoToNextCell()) { cellId = cellItr->GetCellId(); ptIds = cellItr->GetPointIds(); if (locsA.count(scalarsA->GetValue(ptIds->GetId(0))) == 1) { regsA->ReverseCell(cellId); } } cellItr->Delete(); } if (comb[1] == Loc::Inside) { cellItr = regsB->NewCellIterator(); for (cellItr->InitTraversal(); !cellItr->IsDoneWithTraversal(); cellItr->GoToNextCell()) { cellId = cellItr->GetCellId(); ptIds = cellItr->GetPointIds(); if (locsB.count(scalarsB->GetValue(ptIds->GetId(0))) == 1) { regsB->ReverseCell(cellId); } } cellItr->Delete(); } } // OrigCellIds und CellData vtkIdTypeArray *origCellIdsA = vtkIdTypeArray::SafeDownCast(regsA->GetCellData()->GetScalars("OrigCellIds")); vtkIdTypeArray *origCellIdsB = vtkIdTypeArray::SafeDownCast(regsB->GetCellData()->GetScalars("OrigCellIds")); vtkIdTypeArray *newOrigCellIdsA = vtkIdTypeArray::New(); newOrigCellIdsA->SetName("OrigCellIdsA"); vtkIdTypeArray *newOrigCellIdsB = vtkIdTypeArray::New(); newOrigCellIdsB->SetName("OrigCellIdsB"); vtkCellData *newCellDataA = vtkCellData::New(); newCellDataA->CopyAllocate(cellDataA); vtkCellData *newCellDataB = vtkCellData::New(); newCellDataB->CopyAllocate(cellDataB); vtkIdType cellId; for (i = 0; i < regsA->GetNumberOfCells(); i++) { cellId = cellIdsA->GetValue(origCellIdsA->GetValue(i)); newOrigCellIdsA->InsertNextValue(cellId); newOrigCellIdsB->InsertNextValue(-1); newCellDataA->CopyData(cellDataA, cellId, i); } for (i = 0; i < regsB->GetNumberOfCells(); i++) { cellId = cellIdsB->GetValue(origCellIdsB->GetValue(i)); newOrigCellIdsB->InsertNextValue(cellId); newOrigCellIdsA->InsertNextValue(-1); newCellDataB->CopyData(cellDataB, cellId, i); } regsA->GetCellData()->Initialize(); regsB->GetCellData()->Initialize(); regsA->GetCellData()->ShallowCopy(newCellDataA); regsB->GetCellData()->ShallowCopy(newCellDataB); newCellDataA->Delete(); newCellDataB->Delete(); // zusammenführung vtkAppendPolyData *app = vtkAppendPolyData::New(); app->AddInputData(regsA); app->AddInputData(regsB); // entfernt ungenutzte punkte vtkCleanPolyData *cleanApp = vtkCleanPolyData::New(); cleanApp->PointMergingOff(); cleanApp->SetInputConnection(app->GetOutputPort()); // färbt die regionen nochmal neu ein, damit mehrere regionen nicht die gleiche farbe haben vtkPolyDataConnectivityFilter *cfApp = vtkPolyDataConnectivityFilter::New(); cfApp->SetExtractionModeToAllRegions(); cfApp->ColorRegionsOn(); cfApp->SetInputConnection(cleanApp->GetOutputPort()); cfApp->Update(); vtkPolyData *cfPd = cfApp->GetOutput(); // resultB bleibt hier leer resultA->ShallowCopy(cfPd); resultA->GetCellData()->AddArray(newOrigCellIdsA); resultA->GetCellData()->AddArray(newOrigCellIdsB); contLines->RemoveDeletedCells(); resultC->ShallowCopy(contLines); // aufräumen cfApp->Delete(); cleanApp->Delete(); app->Delete(); newOrigCellIdsB->Delete(); newOrigCellIdsA->Delete(); plB->FreeSearchStructure(); plA->FreeSearchStructure(); return false; } void vtkPolyDataBooleanFilter::SetMatrix (int i, vtkMatrix4x4 *matrix) { if (i != 0 && i != 1) { return; } if (matrices[i] == matrix) { return; } if (transforms[i] != nullptr) { transforms[i]->Delete(); transforms[i] = nullptr; } if (matrices[i] != nullptr) { matrices[i]->Delete(); matrices[i] = nullptr; } if (matrix != nullptr) { matrices[i] = matrix; matrix->Register(this); auto transform = vtkMatrixToLinearTransform::New(); transform->Register(this); transform->Delete(); transform->SetInput(matrix); transforms[i] = transform; } Modified(); } vtkMatrix4x4* vtkPolyDataBooleanFilter::GetMatrix (int i) { if (i != 0 && i != 1) { return nullptr; } return matrices[i]; } vtkMTimeType vtkPolyDataBooleanFilter::GetMTime () { std::vector times = { MTime.GetMTime() }; if (matrices[0] != nullptr) { times.push_back(matrices[0]->GetMTime()); } if (matrices[1] != nullptr) { times.push_back(matrices[1]->GetMTime()); } return *std::max_element(times.begin(), times.end()); } ================================================ FILE: vtkPolyDataBooleanFilter.h ================================================ /* Copyright 2012-2025 Ronald Römer Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ #ifndef __vtkPolyDataBooleanFilter_h #define __vtkPolyDataBooleanFilter_h #include #include #include #include #include #include #include #include #include #include #include #include #include "Contact.h" #include "Utilities.h" enum OperMode { OPER_NONE = 0, OPER_UNION, OPER_INTERSECTION, OPER_DIFFERENCE, OPER_DIFFERENCE2 }; enum class Capt { Not = 1 << 0, Edge = 1 << 1, A = 1 << 2, B = 1 << 3, Branched = 1 << 4, Boundary = 0xe }; // inline std::underlying_type_t operator| (Capt lhs, Capt rhs) { // return static_cast>(lhs) | // static_cast>(rhs); // } inline std::underlying_type_t operator& (Capt lhs, Capt rhs) { return static_cast>(lhs) & static_cast>(rhs); } enum class Side { None, Start, End }; enum class Loc { None, Inside, Outside }; class StripPt { public: StripPt () : t(0), capt(Capt::Not), catched(true) { edge[0] = NOTSET; edge[1] = NOTSET; } double t; Capt capt; double captPt[3]; vtkIdType ind, edge[2]; double pt[3]; double cutPt[3]; friend std::ostream& operator<< (std::ostream &out, const StripPt &s) { out << "ind " << s.ind << ", edge [" << s.edge[0] << ", " << s.edge[1] << "]" << ", t " << s.t << ", capt " << s.capt << ", polyId " << s.polyId; return out; } vtkIdType polyId; bool catched; }; class StripPtR { public: StripPtR () = delete; StripPtR (vtkIdType ind, std::size_t strip) : ind(ind), strip(strip), ref(NOTSET), side(Side::None) { desc[0] = NOTSET; desc[1] = NOTSET; } vtkIdType ind; std::size_t strip; vtkIdType ref, desc[2]; Side side; friend std::ostream& operator<< (std::ostream &out, const StripPtR &s) { out << "ind " << s.ind << ", desc [" << s.desc[0] << ", " << s.desc[1] << "]" << ", strip " << s.strip << ", side " << s.side << ", ref " << s.ref; return out; } }; typedef std::map StripPtsType; typedef std::deque StripType; typedef std::vector StripsType; typedef std::vector> _StripsType; class PStrips { public: PStrips (vtkPolyData *pd, vtkIdType cellId) { const vtkIdType *cell; vtkIdType numPts; pd->GetCellPoints(cellId, numPts, cell); for (vtkIdType i = 0; i < numPts; i++) { poly.push_back(cell[i]); } ComputeNormal(pd->GetPoints(), n, numPts, cell); base = Base(pd->GetPoints(), numPts, cell); } StripPtsType pts; StripsType strips; double n[3]; IdsType poly; Base base; }; typedef std::map PolyStripsType; typedef std::vector> RefsType; typedef std::vector> ConstRefsType; class VTK_EXPORT vtkPolyDataBooleanFilter : public vtkPolyDataAlgorithm { vtkPolyData *resultA, *resultB, *resultC; vtkSmartPointer modPdA, modPdB, contLines; vtkSmartPointer cellDataA, cellDataB; vtkSmartPointer cellIdsA, cellIdsB; vtkIdTypeArray *contsA, *contsB; vtkMTimeType timePdA, timePdB; PolyStripsType polyStripsA, polyStripsB; void GetStripPoints (vtkPolyData *pd, vtkIdTypeArray *sources, PStrips &pStrips, IdsType &lines); bool GetPolyStrips (vtkPolyData *pd, vtkIdTypeArray *conts, vtkIdTypeArray *sources, PolyStripsType &polyStrips); bool CleanStrips (); void RemoveDuplicates (IdsType &lines); void CompleteStrips (PStrips &pStrips); bool HasArea (const StripType &strip) const; bool CutCells (vtkPolyData *pd, PolyStripsType &polyStrips); void RestoreOrigPoints (vtkPolyData *pd, PolyStripsType &polyStrips); void DisjoinPolys (vtkPolyData *pd, PolyStripsType &polyStrips); void ResolveOverlaps (vtkPolyData *pd, PolyStripsType &polyStrips); void AddAdjacentPoints (vtkPolyData *pd, vtkIdTypeArray *conts, PolyStripsType &polyStrips); void MergePoints (vtkPolyData *pd, PolyStripsType &polyStrips); bool CombineRegions (); int OperMode; vtkMatrix4x4 *matrices[2]; vtkLinearTransform *transforms[2]; vtkSmartPointer cleanA, cleanB; std::shared_ptr contact; vtkMTimeType timeMatrixA, timeMatrixB; public: vtkTypeMacro(vtkPolyDataBooleanFilter, vtkPolyDataAlgorithm); static vtkPolyDataBooleanFilter* New (); vtkSetClampMacro(OperMode, int, OPER_NONE, OPER_DIFFERENCE2); vtkGetMacro(OperMode, int); void SetOperModeToNone () { OperMode = OPER_NONE; Modified(); } void SetOperModeToUnion () { OperMode = OPER_UNION; Modified(); } void SetOperModeToIntersection () { OperMode = OPER_INTERSECTION; Modified(); } void SetOperModeToDifference () { OperMode = OPER_DIFFERENCE; Modified(); } void SetOperModeToDifference2 () { OperMode = OPER_DIFFERENCE2; Modified(); } void SetMatrix (int i, vtkMatrix4x4 *matrix); vtkMatrix4x4* GetMatrix (int i); vtkMTimeType GetMTime () override; protected: vtkPolyDataBooleanFilter (); ~vtkPolyDataBooleanFilter (); int RequestData (vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector) override; void PrintSelf (ostream&, vtkIndent) override {}; private: vtkPolyDataBooleanFilter (const vtkPolyDataBooleanFilter&) = delete; void operator= (const vtkPolyDataBooleanFilter&) = delete; }; #endif