TopoMesh
Topological mesh, triangulations and operations
predicate.h
1 #ifndef PREDICATE_HPP
2 #define PREDICATE_HPP
3 
4 #include <QVector3D>
5 
13 static bool isTrigoOriented(const QVector3D &p, const QVector3D &q, const QVector3D &r) {
14  return (p.x() - r.x()) * (q.y() - r.y()) - (q.x() - r.x()) * (p.y() - r.y()) >= 0;
15 }
16 
25 static bool isInTriangle(const QVector3D &p, const QVector3D &q, const QVector3D &r, const QVector3D &n) {
26  bool b1 = isTrigoOriented(n, p, q);
27  bool b2 = isTrigoOriented(n, q, r);
28  bool b3 = isTrigoOriented(n, r, p);
29  return ((b1 == b2) && (b2 == b3));
30 }
31 
40 static bool isInCircumscribedCircle(const QVector3D &p, const QVector3D &q, const QVector3D &r, const QVector3D &s) {
41  double qp2 = (q.x()-p.x())*(q.x()-p.x()) + (q.y()-p.y())*(q.y()-p.y());
42  double rp2 = (r.x()-p.x())*(r.x()-p.x()) + (r.y()-p.y())*(r.y()-p.y());
43  double sp2 = (s.x()-p.x())*(s.x()-p.x()) + (s.y()-p.y())*(s.y()-p.y());
44 
45  double d1 = (q.x()-p.x()) * ( (r.y()-p.y())*sp2 - rp2*(s.y()-p.y()) );
46  double d2 = (r.x()-p.x()) * ( (q.y()-p.y())*sp2 - qp2*(s.y()-p.y()) );
47  double d3 = (s.x()-p.x()) * ( (q.y()-p.y())*rp2 - qp2*(r.y()-p.y()) );
48 
49  return d1-d2+d3 < 0;
50 }
51 
60 static bool intersectSegments(const QVector3D &A, const QVector3D &B, const QVector3D &C, const QVector3D &D) {
61  return isTrigoOriented(C,D,A) != isTrigoOriented(C,D,B) && isTrigoOriented(A,B,C) != isTrigoOriented(A,B,D);
62 }
63 
71 static bool isInDiametralCircle(const QVector3D &A, const QVector3D &B, const QVector3D &P) {
72  QVector3D C((A.x()+B.x())/2, (A.y()+B.y())/2, 0);
73  QVector3D CA = A - C;
74  QVector3D CP = P - C;
75  return CP.length() <= CA.length();
76 }
77 
78 #endif