7 #include "imstkPointSetToSphereCD.h" 8 #include "imstkCollisionData.h" 9 #include "imstkCollisionUtils.h" 10 #include "imstkParallelUtils.h" 11 #include "imstkPointSet.h" 12 #include "imstkSphere.h" 16 PointSetToSphereCD::PointSetToSphereCD()
18 setRequiredInputType<PointSet>(0);
19 setRequiredInputType<Sphere>(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<PointSet> pointSet = std::dynamic_pointer_cast<
PointSet>(geomA);
30 std::shared_ptr<Sphere> sphere = std::dynamic_pointer_cast<
Sphere>(geomB);
33 const double r = sphere->getRadius();
35 std::shared_ptr<VecDataArray<double, 3>> vertexData = pointSet->getVertexPositions();
38 ParallelUtils::parallelFor(vertices.size(),
41 Vec3d sphereContactPt, sphereContactNormal;
44 if (CollisionUtils::testSphereToPoint(
45 spherePos, r, vertices[idx],
46 sphereContactPt, sphereContactNormal, depth))
49 elemA.dir = sphereContactNormal;
51 elemA.penetrationDepth = depth;
54 elemB.dir = -sphereContactNormal;
55 elemB.pt = sphereContactPt;
56 elemB.penetrationDepth = depth;
59 elementsA.push_back(elemA);
60 elementsB.push_back(elemB);
63 }, vertices.size() > 100);
68 std::shared_ptr<Geometry> geomA,
69 std::shared_ptr<Geometry> geomB,
70 std::vector<CollisionElement>& elementsA)
72 std::shared_ptr<PointSet> pointSet = std::dynamic_pointer_cast<
PointSet>(geomA);
73 std::shared_ptr<Sphere> sphere = std::dynamic_pointer_cast<
Sphere>(geomB);
76 const double r = sphere->getRadius();
78 std::shared_ptr<VecDataArray<double, 3>> vertexData = pointSet->getVertexPositions();
81 ParallelUtils::parallelFor(vertices.size(),
84 Vec3d sphereContactPt, sphereContactNormal;
87 if (CollisionUtils::testSphereToPoint(
88 spherePos, r, vertices[idx],
89 sphereContactPt, sphereContactNormal, depth))
92 elemA.dir = sphereContactNormal;
94 elemA.penetrationDepth = depth;
97 elementsA.push_back(elemA);
100 }, vertices.size() > 100);
105 std::shared_ptr<Geometry> geomA,
106 std::shared_ptr<Geometry> geomB,
107 std::vector<CollisionElement>& elementsB)
109 std::shared_ptr<PointSet> pointSet = std::dynamic_pointer_cast<
PointSet>(geomA);
110 std::shared_ptr<Sphere> sphere = std::dynamic_pointer_cast<
Sphere>(geomB);
113 const double r = sphere->getRadius();
115 std::shared_ptr<VecDataArray<double, 3>> vertexData = pointSet->getVertexPositions();
118 ParallelUtils::parallelFor(vertices.size(),
121 Vec3d sphereContactPt, sphereContactNormal;
124 if (CollisionUtils::testSphereToPoint(
125 spherePos, r, vertices[idx],
126 sphereContactPt, sphereContactNormal, depth))
129 elemB.dir = -sphereContactNormal;
130 elemB.pt = sphereContactPt;
131 elemB.penetrationDepth = depth;
134 elementsB.push_back(elemB);
137 }, vertices.size() > 100);
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 AB simultaneously.
void unlock()
End a thread-safe region.
Base class for all geometries represented by discrete points and elements The pointsets follow a pipe...
Vec3d getPosition(DataType type=DataType::PostTransform)
Get the local or global position (post transformed)
void computeCollisionDataA(std::shared_ptr< Geometry > geomA, std::shared_ptr< Geometry > geomB, std::vector< CollisionElement > &elementsA) override
Compute collision data for side A.
void computeCollisionDataB(std::shared_ptr< Geometry > geomA, std::shared_ptr< Geometry > geomB, std::vector< CollisionElement > &elementsB) override
Compute collision data for side B.
void lock()
Start a thread-safe region, where only one thread can execute at a time until a call to the unlock fu...
Represents a sphere via its position & radius.
Direclty gives a point-direction contact as its collision data, point given by index.
Direclty gives a point-direction contact as its collision data.