123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- #pragma once
- #include <Mathematics/IntrCircle2Circle2.h>
- #include <Mathematics/Arc2.h>
- namespace WwiseGTE
- {
- template <typename Real>
- class FIQuery<Real, Arc2<Real>, Arc2<Real>>
- {
- public:
-
-
- enum
- {
- NO_INTERSECTION,
- NONCOCIRCULAR_ONE_POINT,
- NONCOCIRCULAR_TWO_POINTS,
- COCIRCULAR_ONE_POINT,
- COCIRCULAR_TWO_POINTS,
- COCIRCULAR_ONE_POINT_ONE_ARC,
- COCIRCULAR_ONE_ARC,
- COCIRCULAR_TWO_ARCS
- };
- struct Result
- {
-
- bool intersect;
-
- int configuration;
- Vector2<Real> point[2];
- Arc2<Real> arc[2];
- };
- Result operator()(Arc2<Real> const& arc0, Arc2<Real> const& arc1)
- {
-
-
- Result result;
- result.intersect = false;
- result.configuration = NO_INTERSECTION;
- result.point[0] = { (Real)0, (Real)0 };
- result.point[1] = { (Real)0, (Real)0 };
- Circle2<Real> circle0(arc0.center, arc0.radius);
- Circle2<Real> circle1(arc1.center, arc1.radius);
- FIQuery<Real, Circle2<Real>, Circle2<Real>> ccQuery;
- auto ccResult = ccQuery(circle0, circle1);
- if (!ccResult.intersect)
- {
-
- result.configuration = NO_INTERSECTION;
- return result;
- }
- if (ccResult.numIntersections == std::numeric_limits<int>::max())
- {
-
-
-
- if (arc1.Contains(arc0.end[0]))
- {
- result.intersect = true;
- if (arc1.Contains(arc0.end[1]))
- {
- if (arc0.Contains(arc1.end[0]) && arc0.Contains(arc1.end[1]))
- {
- if (arc0.end[0] == arc1.end[0] && arc0.end[1] == arc1.end[1])
- {
-
- result.configuration = COCIRCULAR_ONE_ARC;
- result.arc[0] = arc0;
- }
- else
- {
-
-
- if (arc0.end[0] != arc1.end[1])
- {
- if (arc1.end[0] != arc0.end[1])
- {
-
-
-
- result.configuration = COCIRCULAR_TWO_ARCS;
- result.arc[0] = Arc2<Real>(arc0.center, arc0.radius, arc0.end[0], arc1.end[1]);
- result.arc[1] = Arc2<Real>(arc0.center, arc0.radius, arc1.end[0], arc0.end[1]);
- }
- else
- {
-
-
- result.configuration = COCIRCULAR_ONE_POINT_ONE_ARC;
- result.point[0] = arc0.end[1];
- result.arc[0] = Arc2<Real>(arc0.center, arc0.radius, arc0.end[0], arc1.end[1]);
- }
- }
- else
- {
- if (arc1.end[0] != arc0.end[1])
- {
-
-
- result.configuration = COCIRCULAR_ONE_POINT_ONE_ARC;
- result.point[0] = arc0.end[0];
- result.arc[0] = Arc2<Real>(arc0.center, arc0.radius, arc1.end[0], arc0.end[1]);
- }
- else
- {
-
-
- result.configuration = COCIRCULAR_TWO_POINTS;
- result.point[0] = arc0.end[0];
- result.point[1] = arc0.end[1];
- }
- }
- }
- }
- else
- {
-
- result.configuration = COCIRCULAR_ONE_ARC;
- result.arc[0] = arc0;
- }
- }
- else
- {
- if (arc0.end[0] != arc1.end[1])
- {
-
- result.configuration = COCIRCULAR_ONE_ARC;
- result.arc[0] = Arc2<Real>(arc0.center, arc0.radius, arc0.end[0], arc1.end[1]);
- }
- else
- {
-
-
- result.configuration = COCIRCULAR_ONE_POINT;
- result.point[0] = arc0.end[0];
- }
- }
- return result;
- }
- if (arc1.Contains(arc0.end[1]))
- {
- result.intersect = true;
- if (arc0.end[1] != arc1.end[0])
- {
-
-
- result.configuration = COCIRCULAR_ONE_ARC;
- result.arc[0] = Arc2<Real>(arc0.center, arc0.radius, arc1.end[0], arc0.end[1]);
- }
- else
- {
-
-
- result.configuration = COCIRCULAR_ONE_POINT;
- result.point[0] = arc1.end[0];
- }
- return result;
- }
- if (arc0.Contains(arc1.end[0]))
- {
-
- result.intersect = true;
- result.configuration = COCIRCULAR_ONE_ARC;
- result.arc[0] = arc1;
- }
- else
- {
-
- result.configuration = NO_INTERSECTION;
- }
- return result;
- }
-
- int numIntersections = 0;
- for (int i = 0; i < ccResult.numIntersections; ++i)
- {
- if (arc0.Contains(ccResult.point[i]) && arc1.Contains(ccResult.point[i]))
- {
- result.point[numIntersections++] = ccResult.point[i];
- result.intersect = true;
- }
- }
- if (numIntersections == 2)
- {
- result.configuration = NONCOCIRCULAR_TWO_POINTS;
- }
- else if (numIntersections == 1)
- {
- result.configuration = NONCOCIRCULAR_ONE_POINT;
- }
- else
- {
- result.configuration = NO_INTERSECTION;
- }
- return result;
- }
- };
- }
|