From 9bd0e2dce8e8259710561bd782e877099f985fdb Mon Sep 17 00:00:00 2001 From: nawazishkhan1-nk Date: Wed, 5 Apr 2023 06:36:28 -0600 Subject: [PATCH 1/2] symmetric point to cell clean method from prev branch --- .gitignore | 1 + Libs/Mesh/Mesh.cpp | 36 ++++++++++++++++++++++++++++++++ Libs/Mesh/Mesh.h | 2 +- Libs/Python/ShapeworksPython.cpp | 1 + 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 4f259a3bbd..87df35565d 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,7 @@ .DS_* .directory .idea/ +.vscode/ # PYC files *.pyc diff --git a/Libs/Mesh/Mesh.cpp b/Libs/Mesh/Mesh.cpp index 753c484efa..5646cdd40b 100644 --- a/Libs/Mesh/Mesh.cpp +++ b/Libs/Mesh/Mesh.cpp @@ -556,6 +556,42 @@ std::vector Mesh::distance(const Mesh& target, const DistanceMethod metho } } break; + case SymmetricPointToCell: { + /* + referenceMesh (point) -> targetMesh (cell) (and get closestPoint) + referenceMesh (cell) -> targetMesh (closestPoint) + */ + auto targetCellLocator = vtkSmartPointer::New(); + targetCellLocator->SetDataSet(target.poly_data_); + targetCellLocator->BuildLocator(); + + auto refCellLocator = vtkSmartPointer::New(); + refCellLocator->SetDataSet(poly_data_); + refCellLocator->BuildLocator(); + + double dist2_target, dist2_ref; + auto cell_target = vtkSmartPointer::New(); + auto cell_ref = vtkSmartPointer::New(); + vtkIdType cellId_target, cellId_ref; + int subId_target, subId_ref; + Point3 closestPoint_target, closestPoint_ref; + + + for (int i = 0; i < numPoints(); i++) { + poly_data_->GetPoint(i, currentPoint.GetDataPointer()); // ref point + // ref mesh point -> target mesh cell + targetCellLocator->FindClosestPoint(currentPoint.GetDataPointer(), closestPoint_target.GetDataPointer(), cell_target, cellId_target, + subId_target, dist2_target); + // target mesh closest point -> ref mesh cell + refCellLocator->FindClosestPoint(closestPoint_target.GetDataPointer(), closestPoint_ref.GetDataPointer(), cell_ref, cellId_ref, + subId_ref, dist2_ref); + + ids->SetValue(i, cellId_target); + auto mean_sym_dist = (std::sqrt(dist2_target) + std::sqrt(dist2_ref))/2; + distance->SetValue(i, mean_sym_dist); + } + } break; + default: throw std::invalid_argument("invalid distance method"); } diff --git a/Libs/Mesh/Mesh.h b/Libs/Mesh/Mesh.h index e6f81e198a..31681f5982 100644 --- a/Libs/Mesh/Mesh.h +++ b/Libs/Mesh/Mesh.h @@ -19,7 +19,7 @@ class Mesh { public: enum FieldType { Point, Face }; enum AlignmentType { Rigid, Similarity, Affine }; - enum DistanceMethod { PointToPoint, PointToCell }; + enum DistanceMethod { PointToPoint, PointToCell, SymmetricPointToCell }; enum CurvatureType { Principal, Gaussian, Mean }; enum SubdivisionType { Butterfly, Loop }; diff --git a/Libs/Python/ShapeworksPython.cpp b/Libs/Python/ShapeworksPython.cpp index 6144379233..30f5bbec1f 100644 --- a/Libs/Python/ShapeworksPython.cpp +++ b/Libs/Python/ShapeworksPython.cpp @@ -901,6 +901,7 @@ PYBIND11_MODULE(shapeworks_py, m) py::enum_(mesh, "DistanceMethod") .value("PointToPoint", Mesh::DistanceMethod::PointToPoint) .value("PointToCell", Mesh::DistanceMethod::PointToCell) + .value("SymmetricPointToCell", Mesh::DistanceMethod::SymmetricPointToCell) .export_values(); ; From 6bff57e88b62ae8b88a593446763e3c8c05086da Mon Sep 17 00:00:00 2001 From: nawazishkhan1-nk Date: Wed, 5 Apr 2023 06:41:23 -0600 Subject: [PATCH 2/2] add new distance method in studio --- Studio/Visualization/Viewer.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Studio/Visualization/Viewer.cpp b/Studio/Visualization/Viewer.cpp index a557769494..715c452f58 100644 --- a/Studio/Visualization/Viewer.cpp +++ b/Studio/Visualization/Viewer.cpp @@ -714,7 +714,9 @@ void Viewer::display_shape(std::shared_ptr shape) { } Mesh m2(compare_poly_data); - auto field = m.distance(m2)[0]; + auto field = m.distance(m2, Mesh::DistanceMethod::SymmetricPointToCell)[0]; + // TODO: disable debug + std::cout << "Debug Mode | Computing distance with SymmetricPointToCell method in Studio Viewer " << std::endl; m.setField("distance", field, Mesh::Point); }