123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- #pragma once
- #include <Mathematics/IntrConvexPolygonHyperplane.h>
- #include <Mathematics/Triangle.h>
- #include <Mathematics/Vector2.h>
- namespace WwiseGTE
- {
-
-
-
- template <typename Real>
- class TIQuery<Real, Triangle2<Real>, Triangle2<Real>>
- {
- public:
- struct Result
- {
- bool intersect;
- };
- Result operator()(Triangle2<Real> const& triangle0, Triangle2<Real> const& triangle1)
- {
- Result result =
- {
- !Separated(triangle0, triangle1) && !Separated(triangle1, triangle0)
- };
- return result;
- }
- protected:
-
-
-
-
-
- int WhichSide(Triangle2<Real> const& triangle, Vector2<Real> const& P, Vector2<Real> const& D) const
- {
- int positive = 0, negative = 0;
- for (int i = 0; i < 3; ++i)
- {
- Real t = Dot(D, triangle.v[i] - P);
- if (t > (Real)0)
- {
- ++positive;
- }
- else if (t < (Real)0)
- {
- --negative;
- }
- if (positive && negative)
- {
-
-
-
- return 0;
- }
- }
-
- return (positive > 0 ? +1 : -1);
- }
- bool Separated(Triangle2<Real> const& triangle0, Triangle2<Real> const& triangle1) const
- {
-
-
-
-
-
- for (int i0 = 2, i1 = 0; i1 < 3; i0 = i1++)
- {
-
- Vector2<Real> P = triangle0.v[i0];
- Vector2<Real> D = Perp(triangle0.v[i1] - triangle0.v[i0]);
- if (WhichSide(triangle1, P, D) > 0)
- {
-
-
- return true;
- }
- }
- return false;
- }
- };
-
-
-
- template <typename Real>
- class FIQuery<Real, Triangle2<Real>, Triangle2<Real>>
- {
- public:
- struct Result
- {
-
- std::vector<Vector2<Real>> intersection;
- };
- Result operator()(Triangle2<Real> const& triangle0, Triangle2<Real> const& triangle1)
- {
- Result result;
-
- std::vector<Vector2<Real>> polygon =
- {
- triangle1.v[0], triangle1.v[1], triangle1.v[2]
- };
- typedef FIQuery<Real, std::vector<Vector<2, Real>>, Hyperplane<2, Real>> PPQuery;
- PPQuery ppQuery;
- for (int i1 = 2, i0 = 0; i0 < 3; i1 = i0++)
- {
-
-
- Vector2<Real> P = triangle0.v[i0];
- Vector2<Real> N = Perp(triangle0.v[i1] - triangle0.v[i0]);
- Hyperplane<2, Real> clippingLine(N, Dot(N, P));
-
- auto ppResult = ppQuery(polygon, clippingLine);
- if (ppResult.positivePolygon.size() == 0)
- {
-
- return result;
- }
- polygon = std::move(ppResult.positivePolygon);
- }
- result.intersection = polygon;
- return result;
- }
- };
- }
|