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;
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));
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());
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()) );
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);
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);
75 return CP.length() <= CA.length();