iMSTK
Interactive Medical Simulation Toolkit
imstkBoneDrillingCH.h
1 /*
2 ** This file is part of the Interactive Medical Simulation Toolkit (iMSTK)
3 ** iMSTK is distributed under the Apache License, Version 2.0.
4 ** See accompanying NOTICE for details.
5 */
6 
7 #pragma once
8 
9 #include "imstkCollisionHandling.h"
10 #include "imstkMath.h"
11 #include "imstkMacros.h"
12 
13 namespace imstk
14 {
15 class CollisionData;
16 class CollidingObject;
17 class RigidObject2;
18 
27 {
28 public:
29  BoneDrillingCH() = default;
30  virtual ~BoneDrillingCH() override = default;
31 
32  IMSTK_TYPE_NAME(BoneDrillingCH)
33 
34 public:
38  void setInputObjectBone(std::shared_ptr<CollidingObject> boneObject) { setInputObjectA(boneObject); }
39 
43  void setInputObjectDrill(std::shared_ptr<RigidObject2> drillObject);
44 
45  std::shared_ptr<CollidingObject> getBoneObj() const { return getInputObjectA(); }
46  std::shared_ptr<RigidObject2> getDrillObj() const;
47 
48 public:
52  double getStiffness() const { return m_stiffness; }
56  void setStiffness(const double k) { m_stiffness = k; }
57 
61  double getDamping() const { return m_damping; }
65  void setDamping(const double d) { m_damping = d; }
66 
67 protected:
71  virtual void handle(
72  const std::vector<CollisionElement>& elementsA,
73  const std::vector<CollisionElement>& elementsB) override;
74 
78  void erodeBone(
79  const std::vector<CollisionElement>& elementsA,
80  const std::vector<CollisionElement>& elementsB);
81 
82 private:
83  double m_stiffness = 10e-01;
84  double m_damping = 0.005;
85 
86  double m_angularSpeed = 10 * PI;
87  double m_BoneHardness = 10;
88 
89  std::vector<double> m_nodalDensity;
90  double m_initialBoneDensity = 1.0;
91 
92 // std::vector<size_t> m_erodedNodes; /// \todo Unused variable
93  std::vector<bool> m_nodeRemovalStatus;
94  std::vector<std::vector<size_t>> m_nodalCardinalSet;
95 
96  bool m_initialStep = true;
97  Vec3d m_prevPos;
98 };
99 } // namespace imstk
void setInputObjectBone(std::shared_ptr< CollidingObject > boneObject)
Set the input bone.
void erodeBone(const std::vector< CollisionElement > &elementsA, const std::vector< CollisionElement > &elementsB)
Decrease the density at the nodal points and remove if the density goes below 0.
void setInputObjectA(std::shared_ptr< CollidingObject > objectA)
Set the input objects.
Compound Geometry.
void setStiffness(const double k)
Set stiffness.
virtual void handle(const std::vector< CollisionElement > &elementsA, const std::vector< CollisionElement > &elementsB) override
Does the bone drilling.
void setInputObjectDrill(std::shared_ptr< RigidObject2 > drillObject)
Set the input drill.
std::shared_ptr< CollidingObject > getInputObjectA() const
Get the input objects.
Base class for all collision handling classes.
double getDamping() const
Get damping coefficient.
void setDamping(const double d)
Set damping coefficient.
double getStiffness() const
Get stiffness.
Implements bone drilling collision handling.