Last active
March 4, 2018 15:07
-
-
Save davidluzgouveia/7490346 to your computer and use it in GitHub Desktop.
Point inside polygon with tolerance using ellipses as edges
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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