Skip to content

Commit 1ebf69f

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 1ebf69f

File tree

6 files changed

+95
-0
lines changed

6 files changed

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

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)