7 #include "imstkProximitySurfaceSelector.h" 8 #include "imstkGeometryUtilities.h" 9 #include "imstkLogger.h" 10 #include "imstkSurfaceMesh.h" 11 #include "imstkVecDataArray.h" 15 ProximitySurfaceSelector::ProximitySurfaceSelector()
18 setRequiredInputType<SurfaceMesh>(0);
19 setRequiredInputType<SurfaceMesh>(1);
22 setOutput(std::shared_ptr<SurfaceMesh>(), 0);
23 setOutput(std::shared_ptr<SurfaceMesh>(), 1);
27 ProximitySurfaceSelector::setInputMeshes(
28 std::shared_ptr<SurfaceMesh> inputMeshA,
29 std::shared_ptr<SurfaceMesh> inputMeshB)
35 std::shared_ptr<SurfaceMesh>
36 ProximitySurfaceSelector::getOutputMeshA()
const 38 return std::static_pointer_cast<SurfaceMesh>(
getOutput(0));
41 std::shared_ptr<SurfaceMesh>
42 ProximitySurfaceSelector::getOutputMeshB()
const 44 return std::static_pointer_cast<SurfaceMesh>(
getOutput(1));
54 std::pair<std::vector<int>, std::vector<int>> closeSurfaces;
57 std::pair<std::shared_ptr<SurfaceMesh>, std::shared_ptr<SurfaceMesh>> subMeshes;
59 subMeshes.first = std::make_shared<SurfaceMesh>();
60 subMeshes.second = std::make_shared<SurfaceMesh>();
63 double minDist = IMSTK_DOUBLE_MAX;
64 for (
int vertId_a = 0; vertId_a < meshA->getNumVertices(); vertId_a++)
66 for (
int vertId_b = 0; vertId_b < meshB->getNumVertices(); vertId_b++)
68 const auto& vertA = meshA->getVertexPosition(vertId_a);
69 const auto& vertB = meshB->getVertexPosition(vertId_b);
70 minDist = std::min(minDist, (vertA - vertB).norm());
74 if (minDist > m_proximity)
76 LOG(WARNING) <<
"No SurfaceMeshes generated, the meshes are further apart than the requested proximity";
81 std::shared_ptr<VecDataArray<int, 3>> meshACellsPtr = meshA->getCells();
83 std::shared_ptr<VecDataArray<double, 3>> meshAVertsPtr = meshA->getVertexPositions();
86 std::shared_ptr<VecDataArray<int, 3>> meshBCellsPtr = meshB->getCells();
88 std::shared_ptr<VecDataArray<double, 3>> meshBVertsPtr = meshB->getVertexPositions();
94 auto subIndicesPtrA = std::make_shared<VecDataArray<int, 3>>();
97 auto subIndicesPtrB = std::make_shared<VecDataArray<int, 3>>();
100 for (
int cellId_a = 0; cellId_a < meshACells.size(); cellId_a++)
103 const Vec3i& triangleVertexIdsA = meshACells[cellId_a];
104 Vec3d cellACenter = (meshA->getVertexPosition(triangleVertexIdsA(0))
105 + meshA->getVertexPosition(triangleVertexIdsA(1))
106 + meshA->getVertexPosition(triangleVertexIdsA(2))) / 3.0;
109 for (
int cellId_b = 0; cellId_b < meshBCells.size(); cellId_b++)
111 const Vec3i& triangleVertexIdsB = meshBCells[cellId_b];
112 Vec3d cellBCenter = (meshB->getVertexPosition(triangleVertexIdsB(0))
113 + meshB->getVertexPosition(triangleVertexIdsB(1))
114 + meshB->getVertexPosition(triangleVertexIdsB(2))) / 3.0;
116 if ((cellACenter - cellBCenter).squaredNorm() <= m_proximity * m_proximity)
119 if (std::find(closeSurfaces.first.begin(), closeSurfaces.first.end(), cellId_a) == closeSurfaces.first.end())
123 const Vec3i& triangleVertexIds = meshACells[cellId_a];
124 subIndicesA.
push_back(triangleVertexIds);
126 if (std::find(closeSurfaces.second.begin(), closeSurfaces.second.end(), cellId_b) == closeSurfaces.second.end())
128 closeSurfaces.second.push_back(cellId_b);
130 const Vec3i& triangleVertexIds = meshBCells[cellId_b];
131 subIndicesB.
push_back(triangleVertexIds);
138 subMeshes.first->initialize(meshAVertsPtr, subIndicesPtrA);
142 subMeshes.second->initialize(meshBVertsPtr, subIndicesPtrB);
void requestUpdate() override
Users can implement this for the logic to be run.
std::shared_ptr< Geometry > getInput(size_t port=0) const
Returns input geometry given port, returns nullptr if doesn't exist.
void push_back(const ValueType &val)
Append the data array to hold the new value, resizes if neccesary.
void setNumOutputPorts(const size_t numPorts)
Get/Set the amount of output ports.
std::shared_ptr< Geometry > getOutput(size_t port=0) const
Returns output geometry given port, returns nullptr if doesn't exist.
void setInput(std::shared_ptr< Geometry > inputGeometry, size_t port=0)
Set the input at the port.
Represents a set of triangles & vertices via an array of Vec3d double vertices & Vec3i integer indice...
void setOutput(std::shared_ptr< Geometry > inputGeometry, const size_t port=0)
Set the output at the port.
void setNumInputPorts(const size_t numPorts)
Get/Set the amount of input ports.