7 #include "imstkTetraToLineMeshCD.h" 8 #include "imstkCollisionData.h" 9 #include "imstkCollisionUtils.h" 10 #include "imstkLineMesh.h" 11 #include "imstkParallelUtils.h" 12 #include "imstkTetrahedralMesh.h" 16 TetraToLineMeshCD::TetraToLineMeshCD()
18 setRequiredInputType<TetrahedralMesh>(0);
19 setRequiredInputType<LineMesh>(1);
24 std::shared_ptr<Geometry> geomA,
25 std::shared_ptr<Geometry> geomB,
26 std::vector<CollisionElement>& elementsA,
27 std::vector<CollisionElement>& elementsB)
29 std::shared_ptr<TetrahedralMesh> tetMesh = std::dynamic_pointer_cast<
TetrahedralMesh>(geomA);
30 std::shared_ptr<LineMesh> lineMesh = std::dynamic_pointer_cast<
LineMesh>(geomB);
32 std::shared_ptr<VecDataArray<int, 4>> tetsPtr = tetMesh->getCells();
33 std::shared_ptr<VecDataArray<double, 3>> tetVerticesPtr = tetMesh->getVertexPositions();
37 std::shared_ptr<VecDataArray<int, 2>> linesPtr = lineMesh->getCells();
38 std::shared_ptr<VecDataArray<double, 3>> verticesPtr = lineMesh->getVertexPositions();
44 ParallelUtils::parallelFor(lines.size(), [&](
int i)
46 const Vec3d& x0 = lineVerts[lines[i][0]];
47 const Vec3d& x1 = lineVerts[lines[i][1]];
48 for (
int j = 0; j < tets.size(); j++)
50 std::array<Vec3d, 4> tet;
51 tet[0] = tetVerts[tets[j][0]];
52 tet[1] = tetVerts[tets[j][1]];
53 tet[2] = tetVerts[tets[j][2]];
54 tet[3] = tetVerts[tets[j][3]];
55 if (CollisionUtils::testTetToSegment(tet, x0, x1))
60 elemA.cellType = IMSTK_TETRAHEDRON;
65 elemB.cellType = IMSTK_EDGE;
68 elementsA.push_back(elemA);
69 elementsB.push_back(elemB);
void unlock()
End a thread-safe region.
void computeCollisionDataAB(std::shared_ptr< Geometry > geomA, std::shared_ptr< Geometry > geomB, std::vector< CollisionElement > &elementsA, std::vector< CollisionElement > &elementsB) override
Compute collision data for both sides simultaneously.
Represents a set of tetrahedrons & vertices via an array of Vec3d double vertices & Vec4i integer ind...
void lock()
Start a thread-safe region, where only one thread can execute at a time until a call to the unlock fu...
Base class for all volume mesh types.
Represents a cell by a single cell id OR by N vertex ids. Which case can be determined by the idCount...