Skip to content

Commit 3fae9af

Browse files
committed
[operations] Created a ContainsPoint operation
* Checks whether a point is inside an element * Works with an element or a proximity type as input
1 parent ebd68b8 commit 3fae9af

File tree

6 files changed

+107
-0
lines changed

6 files changed

+107
-0
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#include <sofa/collisionAlgorithm/operations/ContainsPoint.h>
2+
#include <sofa/collisionAlgorithm/proximity/TetrahedronProximity.h>
3+
#include <sofa/collisionAlgorithm/proximity/TriangleProximity.h>
4+
5+
namespace sofa::collisionAlgorithm::Operations::ContainsPointInElement
6+
{
7+
8+
int register_ContainsPoint_Triangle =
9+
Operation::register_func<TriangleElement>(&toolbox::TriangleToolBox::containsPoint);
10+
11+
int register_ContainsPoint_Tetrahedron =
12+
Operation::register_func<TetrahedronElement>(&toolbox::TetrahedronToolBox::containsPoint);
13+
14+
} // namespace sofa::collisionAlgorithm::Operations::ContainsPointInElement
15+
16+
namespace sofa::collisionAlgorithm::Operations::ContainsPointInProximity
17+
{
18+
19+
int register_ContainsPointInProximity_Triangle =
20+
Operation::register_func<TriangleElement>(&containsPoint<TriangleProximity>);
21+
22+
int register_ContainsPointInProximity_Tetrahedron =
23+
Operation::register_func<TetrahedronElement>(&containsPoint<TetrahedronProximity>);
24+
25+
} // namespace sofa::collisionAlgorithm::Operations::ContainsPointInProximity
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#pragma once
2+
3+
#include <sofa/collisionAlgorithm/BaseElement.h>
4+
#include <sofa/collisionAlgorithm/BaseOperation.h>
5+
6+
namespace sofa::collisionAlgorithm::Operations::ContainsPointInElement
7+
{
8+
9+
typedef bool Result;
10+
11+
class Operation : public GenericOperation<Operation, // Type of the operation
12+
Result, // Default return type
13+
const type::Vec3&, const BaseElement::SPtr& // Parameters
14+
>
15+
{
16+
public:
17+
Result defaultFunc(const type::Vec3&, const BaseElement::SPtr&) const override { return false; }
18+
19+
void notFound(const std::type_info& id) const override
20+
{
21+
std::cerr << "ERROR the operation ContainsPointOperation is not registered with for type = "
22+
<< sofa::helper::NameDecoder::decodeFullName(id) << std::endl;
23+
}
24+
};
25+
26+
typedef Operation::FUNC FUNC;
27+
28+
} // namespace sofa::collisionAlgorithm::Operations::ContainsPointInElement
29+
30+
namespace sofa::collisionAlgorithm::Operations::ContainsPointInProximity
31+
{
32+
33+
typedef bool Result;
34+
35+
class Operation
36+
: public GenericOperation<Operation, // Type of the operation
37+
Result, // Default return type
38+
const type::Vec3&, const BaseProximity::SPtr& // Parameters
39+
>
40+
{
41+
public:
42+
Result defaultFunc(const type::Vec3&, const BaseProximity::SPtr&) const override
43+
{
44+
return false;
45+
}
46+
47+
void notFound(const std::type_info& id) const override
48+
{
49+
std::cerr << "ERROR the operation ContainsPointProximityOperation is not registered with "
50+
"for type = "
51+
<< sofa::helper::NameDecoder::decodeFullName(id) << std::endl;
52+
}
53+
};
54+
55+
template <typename PROX>
56+
Result containsPoint(const type::Vec3& P, const typename std::shared_ptr<PROX>& prox)
57+
{
58+
auto elem = prox->element();
59+
auto containsPointInElem =
60+
sofa::collisionAlgorithm::Operations::ContainsPointInElement::Operation::get(elem);
61+
return containsPointInElem(P, elem);
62+
}
63+
64+
typedef Operation::FUNC FUNC;
65+
66+
} // namespace sofa::collisionAlgorithm::Operations::ContainsPointInProximity

src/sofa/collisionAlgorithm/toolbox/TetrahedronToolBox.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ Operations::CreateCenterProximity::Result TetrahedronToolBox::createCenterProxim
1010
return TetrahedronProximity::create(tetra, 1.0/4.0,1.0/4.0,1.0/4.0,1.0/4.0);
1111
}
1212

13+
Operations::ContainsPointInElement::Result TetrahedronToolBox::containsPoint(const type::Vec3 & P, const TetrahedronElement::SPtr & tetra) {
14+
TetrahedronProximity::SPtr prox = TetrahedronProximity::create(tetra, 1.0/4.0,1.0/4.0,1.0/4.0,1.0/4.0);
15+
double f0(prox->f0()), f1(prox->f1()), f2(prox->f2()), f3(prox->f3());
16+
return isInTetra(P,tetra->getTetrahedronInfo(),f0,f1,f2,f3);
17+
}
18+
1319
Operations::Project::Result TetrahedronToolBox::project(const type::Vec3 & P, const TetrahedronElement::SPtr & tetra) {
1420
double fact[4];
1521
projectOnTetra(P, tetra->getTetrahedronInfo(),fact[0],fact[1],fact[2],fact[3]);

src/sofa/collisionAlgorithm/toolbox/TetrahedronToolBox.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class TetrahedronToolBox {
1212

1313
static Operations::CreateCenterProximity::Result createCenterProximity(const TetrahedronElement::SPtr & tetra);
1414

15+
static Operations::ContainsPointInElement::Result containsPoint(const type::Vec3 & P, const TetrahedronElement::SPtr & tetra);
16+
1517
static Operations::Project::Result project(const type::Vec3 & P, const TetrahedronElement::SPtr & tetra);
1618

1719
static void projectOnTetra(const type::Vec3d projectP, const TetrahedronElement::TetraInfo & teinfo, double & fact_u, double & fact_v, double & fact_w,double & fact_x);

src/sofa/collisionAlgorithm/toolbox/TriangleToolBox.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ Operations::CreateCenterProximity::Result TriangleToolBox::createCenterProximity
88
return TriangleProximity::create(tri, 1.0/3.0,1.0/3.0,1.0/3.0);
99
}
1010

11+
Operations::ContainsPointInElement::Result TriangleToolBox::containsPoint(const type::Vec3 & P, const TriangleElement::SPtr & tri) {
12+
TriangleProximity::SPtr prox = TriangleProximity::create(tri, 1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0);
13+
double f0(prox->f0()), f1(prox->f1()), f2(prox->f2());
14+
return isInTriangle(P,tri->getTriangleInfo(),f0,f1,f1);
15+
}
16+
1117
//Barycentric coordinates are computed according to
1218
//http://gamedev.stackexchange.com/questions/23743/whats-the-most-efficient-way-to-find-barycentric-coordinates
1319
Operations::Project::Result TriangleToolBox::project(const type::Vec3 & P, const TriangleElement::SPtr & tri) {

src/sofa/collisionAlgorithm/toolbox/TriangleToolBox.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class TriangleToolBox {
1212

1313
static Operations::CreateCenterProximity::Result createCenterProximity(const TriangleElement::SPtr & tri);
1414

15+
static Operations::ContainsPointInElement::Result containsPoint(const type::Vec3 & P, const TriangleElement::SPtr & tri);
16+
1517
static Operations::Project::Result project(const type::Vec3 & P, const TriangleElement::SPtr & tri);
1618

1719
static void computeTriangleBaryCoords(const type::Vec3d & proj_P, const TriangleElement::TriangleInfo & tinfo, double & fact_u, double & fact_v, double & fact_w);

0 commit comments

Comments
 (0)