7 #include "imstkPointSetToCylinderCD.h" 8 #include "imstkCylinder.h" 9 #include "imstkCollisionData.h" 10 #include "imstkCollisionUtils.h" 11 #include "imstkParallelUtils.h" 12 #include "imstkPointSet.h" 13 #include "imstkVecDataArray.h" 17 PointSetToCylinderCD::PointSetToCylinderCD()
19 setRequiredInputType<PointSet>(0);
20 setRequiredInputType<Cylinder>(1);
25 std::shared_ptr<Geometry> geomA,
26 std::shared_ptr<Geometry> geomB,
27 std::vector<CollisionElement>& elementsA,
28 std::vector<CollisionElement>& elementsB)
30 std::shared_ptr<PointSet> pointSet = std::dynamic_pointer_cast<
PointSet>(geomA);
31 std::shared_ptr<Cylinder> cylinder = std::dynamic_pointer_cast<
Cylinder>(geomB);
34 const Vec3d cylinderAxis = cylinder->getOrientation().toRotationMatrix().col(1);
35 const double cylinderLength = cylinder->getLength();
36 const double cylinderRadius = cylinder->getRadius();
38 std::shared_ptr<VecDataArray<double, 3>> vertexData = pointSet->getVertexPositions();
41 ParallelUtils::parallelFor(vertices.size(),
44 Vec3d cylinderContactPt;
45 Vec3d cylinderContactNormal, pointContactNormal;
47 if (CollisionUtils::testCylinderToPoint(
48 cylinderPos, cylinderAxis, cylinderLength, cylinderRadius,
50 cylinderContactPt, cylinderContactNormal, pointContactNormal, depth))
53 elemA.dir = pointContactNormal;
55 elemA.penetrationDepth = depth;
58 elemB.dir = cylinderContactNormal;
59 elemB.pt = cylinderContactPt;
60 elemB.penetrationDepth = depth;
63 elementsA.push_back(elemA);
64 elementsB.push_back(elemB);
67 }, vertices.size() > 100);
72 std::shared_ptr<Geometry> geomA,
73 std::shared_ptr<Geometry> geomB,
74 std::vector<CollisionElement>& elementsA)
76 std::shared_ptr<PointSet> pointSet = std::dynamic_pointer_cast<
PointSet>(geomA);
77 std::shared_ptr<Cylinder> cylinder = std::dynamic_pointer_cast<
Cylinder>(geomB);
80 const Vec3d cylinderAxis = cylinder->getOrientation().toRotationMatrix().col(1);
81 const double cylinderLength = cylinder->getLength();
82 const double cylinderRadius = cylinder->getRadius();
84 std::shared_ptr<VecDataArray<double, 3>> vertexData = pointSet->getVertexPositions();
87 ParallelUtils::parallelFor(vertices.size(),
90 Vec3d cylinderContactPt;
91 Vec3d cylinderContactNormal, pointContactNormal;
93 if (CollisionUtils::testCylinderToPoint(
94 cylinderPos, cylinderAxis, cylinderLength, cylinderRadius,
96 cylinderContactPt, cylinderContactNormal, pointContactNormal, depth))
99 elemA.dir = pointContactNormal;
101 elemA.penetrationDepth = depth;
104 elementsA.push_back(elemA);
107 }, vertices.size() > 100);
112 std::shared_ptr<Geometry> geomA,
113 std::shared_ptr<Geometry> geomB,
114 std::vector<CollisionElement>& elementsB)
116 std::shared_ptr<PointSet> pointSet = std::dynamic_pointer_cast<
PointSet>(geomA);
117 std::shared_ptr<Cylinder> cylinder = std::dynamic_pointer_cast<
Cylinder>(geomB);
120 const Vec3d cylinderAxis = cylinder->getOrientation().toRotationMatrix().col(1);
121 const double cylinderLength = cylinder->getLength();
122 const double cylinderRadius = cylinder->getRadius();
124 std::shared_ptr<VecDataArray<double, 3>> vertexData = pointSet->getVertexPositions();
127 ParallelUtils::parallelFor(vertices.size(),
130 Vec3d cylinderContactPt;
131 Vec3d cylinderContactNormal, pointContactNormal;
133 if (CollisionUtils::testCylinderToPoint(
134 cylinderPos, cylinderAxis, cylinderLength, cylinderRadius,
136 cylinderContactPt, cylinderContactNormal, pointContactNormal, depth))
139 elemB.dir = cylinderContactNormal;
140 elemB.pt = cylinderContactPt;
141 elemB.penetrationDepth = depth;
144 elementsB.push_back(elemB);
147 }, vertices.size() > 100);
void unlock()
End a thread-safe region.
Base class for all geometries represented by discrete points and elements The pointsets follow a pipe...
Cylinder geometry, default configuration is at origin with length running up the y axes...
Vec3d getPosition(DataType type=DataType::PostTransform)
Get the local or global position (post transformed)
virtual 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 lock()
Start a thread-safe region, where only one thread can execute at a time until a call to the unlock fu...
virtual void computeCollisionDataA(std::shared_ptr< Geometry > geomA, std::shared_ptr< Geometry > geomB, std::vector< CollisionElement > &elementsA) override
Compute collision data for side A.
virtual void computeCollisionDataB(std::shared_ptr< Geometry > geomA, std::shared_ptr< Geometry > geomB, std::vector< CollisionElement > &elementsB) override
Compute collision data for side B.
Direclty gives a point-direction contact as its collision data, point given by index.
Direclty gives a point-direction contact as its collision data.