Skip to content

Instantly share code, notes, and snippets.

@davidluzgouveia
Last active March 4, 2018 15:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save davidluzgouveia/7490346 to your computer and use it in GitHub Desktop.
Save davidluzgouveia/7490346 to your computer and use it in GitHub Desktop.
Point inside polygon with tolerance using ellipses as edges
public static bool Inside(IList<Vector2> polygon, Vector2 position, bool toleranceOnOutside = true)
{
Vector2 point = position;
const float epsilon = 0.5f;
bool inside = false;
// Must have 3 or more edges
if (polygon.Count < 3) return false;
Vector2 oldPoint = polygon[polygon.Count - 1];
float oldSqDist = Vector2.DistanceSquared(oldPoint, point);
for (int i = 0; i < polygon.Count; i++)
{
Vector2 newPoint = polygon[i];
float newSqDist = Vector2.DistanceSquared(newPoint, point);
if (oldSqDist + newSqDist + 2.0f * System.Math.Sqrt(oldSqDist * newSqDist) - Vector2.DistanceSquared(newPoint, oldPoint) < epsilon)
return toleranceOnOutside;
Vector2 left;
Vector2 right;
if (newPoint.X > oldPoint.X)
{
left = oldPoint;
right = newPoint;
}
else
{
left = newPoint;
right = oldPoint;
}
if (left.X < point.X && point.X <= right.X && (point.Y - left.Y) * (right.X - left.X) < (right.Y - left.Y) * (point.X - left.X))
inside = !inside;
oldPoint = newPoint;
oldSqDist = newSqDist;
}
return inside;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment