/// <summary> /// Determines if the specified polygon at the specified position and rotation contains the specified point /// </summary> /// <param name="poly">The polygon</param> /// <param name="pos">Origin of the polygon</param> /// <param name="rot">Rotation of the polygon</param> /// <param name="point">Point to check</param> /// <param name="strict">True if the edges do not count as inside</param> /// <returns>If the polygon at pos with rotation rot about its center contains point</returns> public static bool Contains(Polygon2 poly, Vector2 pos, Rotation2 rot, Vector2 point, bool strict) { if (!Rect2.Contains(poly.AABB, pos, point, strict)) { return(false); } // Calculate the area of the triangles constructed by the lines of the polygon. If it // matches the area of the polygon, we're inside the polygon. float myArea = 0; var center = poly.Center + pos; var last = Math2.Rotate(poly.Vertices[poly.Vertices.Length - 1], poly.Center, rot) + pos; for (int i = 0; i < poly.Vertices.Length; i++) { var curr = Math2.Rotate(poly.Vertices[i], poly.Center, rot) + pos; myArea += Math2.AreaOfTriangle(center, last, curr); last = curr; } return(Math2.Approximately(myArea, poly.Area, poly.Area / 1000)); }
/// <summary> /// Determines if the specified circle an rectangle intersect at their given positions. /// </summary> /// <param name="circle">The circle</param> /// <param name="rect">The rectangle</param> /// <param name="pos1">The top-left of the circles bounding box</param> /// <param name="pos2">The origin of the rectangle</param> /// <param name="strict">If overlap is required for intersection</param> /// <returns>If circle at pos1 intersects rect at pos2</returns> public static bool Intersects(Circle2 circle, Rect2 rect, Vector2 pos1, Vector2 pos2, bool strict) { var circleCenter = new Vector2(pos1.X + circle.Radius, pos1.Y + circle.Radius); return(CircleIntersectsHorizontalLine(circle, new Line2(rect.Min + pos2, rect.UpperRight + pos2), circleCenter, strict) || CircleIntersectsHorizontalLine(circle, new Line2(rect.LowerLeft + pos2, rect.Max + pos2), circleCenter, strict) || CircleIntersectsVerticalLine(circle, new Line2(rect.Min + pos2, rect.LowerLeft + pos2), circleCenter, strict) || CircleIntersectsVerticalLine(circle, new Line2(rect.UpperRight + pos2, rect.Max + pos2), circleCenter, strict) || Rect2.Contains(rect, pos2, new Vector2(pos1.X + circle.Radius, pos1.Y + circle.Radius), strict)); }