123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- #pragma once
- #include <Mathematics/Vector2.h>
- namespace WwiseGTE
- {
- template <typename Real>
- class PointInPolygon2
- {
- public:
-
-
-
- PointInPolygon2(int numPoints, Vector2<Real> const* points)
- :
- mNumPoints(numPoints),
- mPoints(points)
- {
- }
-
- bool Contains(Vector2<Real> const& p) const
- {
- bool inside = false;
- for (int i = 0, j = mNumPoints - 1; i < mNumPoints; j = i++)
- {
- Vector2<Real> const& U0 = mPoints[i];
- Vector2<Real> const& U1 = mPoints[j];
- Real rhs, lhs;
- if (p[1] < U1[1])
- {
- if (U0[1] <= p[1])
- {
- lhs = (p[1] - U0[1]) * (U1[0] - U0[0]);
- rhs = (p[0] - U0[0]) * (U1[1] - U0[1]);
- if (lhs > rhs)
- {
- inside = !inside;
- }
- }
- }
- else if (p[1] < U0[1])
- {
- lhs = (p[1] - U0[1]) * (U1[0] - U0[0]);
- rhs = (p[0] - U0[0]) * (U1[1] - U0[1]);
- if (lhs < rhs)
- {
- inside = !inside;
- }
- }
- }
- return inside;
- }
-
-
-
- bool ContainsConvexOrderN(Vector2<Real> const& p) const
- {
- for (int i1 = 0, i0 = mNumPoints - 1; i1 < mNumPoints; i0 = i1++)
- {
- Real nx = mPoints[i1][1] - mPoints[i0][1];
- Real ny = mPoints[i0][0] - mPoints[i1][0];
- Real dx = p[0] - mPoints[i0][0];
- Real dy = p[1] - mPoints[i0][1];
- if (nx * dx + ny * dy > (Real)0)
- {
- return false;
- }
- }
- return true;
- }
-
- bool ContainsConvexOrderLogN(Vector2<Real> const& p) const
- {
- return SubContainsPoint(p, 0, 0);
- }
-
-
-
-
- bool ContainsQuadrilateral(Vector2<Real> const& p) const
- {
- if (mNumPoints != 4)
- {
- return false;
- }
- Real nx = mPoints[2][1] - mPoints[0][1];
- Real ny = mPoints[0][0] - mPoints[2][0];
- Real dx = p[0] - mPoints[0][0];
- Real dy = p[1] - mPoints[0][1];
- if (nx * dx + ny * dy > (Real)0)
- {
-
- nx = mPoints[1][1] - mPoints[0][1];
- ny = mPoints[0][0] - mPoints[1][0];
- if (nx * dx + ny * dy > (Real)0.0)
- {
- return false;
- }
- nx = mPoints[2][1] - mPoints[1][1];
- ny = mPoints[1][0] - mPoints[2][0];
- dx = p[0] - mPoints[1][0];
- dy = p[1] - mPoints[1][1];
- if (nx * dx + ny * dy > (Real)0)
- {
- return false;
- }
- }
- else
- {
-
- nx = mPoints[0][1] - mPoints[3][1];
- ny = mPoints[3][0] - mPoints[0][0];
- if (nx * dx + ny * dy > (Real)0)
- {
- return false;
- }
- nx = mPoints[3][1] - mPoints[2][1];
- ny = mPoints[2][0] - mPoints[3][0];
- dx = p[0] - mPoints[3][0];
- dy = p[1] - mPoints[3][1];
- if (nx * dx + ny * dy > (Real)0)
- {
- return false;
- }
- }
- return true;
- }
- private:
-
- bool SubContainsPoint(Vector2<Real> const& p, int i0, int i1) const
- {
- Real nx, ny, dx, dy;
- int diff = i1 - i0;
- if (diff == 1 || (diff < 0 && diff + mNumPoints == 1))
- {
- nx = mPoints[i1][1] - mPoints[i0][1];
- ny = mPoints[i0][0] - mPoints[i1][0];
- dx = p[0] - mPoints[i0][0];
- dy = p[1] - mPoints[i0][1];
- return nx * dx + ny * dy <= (Real)0;
- }
-
- int mid;
- if (i0 < i1)
- {
- mid = (i0 + i1) >> 1;
- }
- else
- {
- mid = (i0 + i1 + mNumPoints) >> 1;
- if (mid >= mNumPoints)
- {
- mid -= mNumPoints;
- }
- }
-
- nx = mPoints[mid][1] - mPoints[i0][1];
- ny = mPoints[i0][0] - mPoints[mid][0];
- dx = p[0] - mPoints[i0][0];
- dy = p[1] - mPoints[i0][1];
- if (nx * dx + ny * dy > (Real)0)
- {
-
- return SubContainsPoint(p, i0, mid);
- }
- else
- {
-
- return SubContainsPoint(p, mid, i1);
- }
- }
- int mNumPoints;
- Vector2<Real> const* mPoints;
- };
- }
|