public static bool RectToCircle(float rX, float rY, float rW, float rH, Vector2 cPosition, float cRadius) { //Check if the rectangle contains the circle's center point if (Collide.RectToPoint(rX, rY, rW, rH, cPosition)) { return(true); } //Check the circle against the relevant edges Vector2 edgeFrom; Vector2 edgeTo; PointSectors sector = GetSector(rX, rY, rW, rH, cPosition); if ((sector & PointSectors.Top) != 0) { edgeFrom = new Vector2(rX, rY); edgeTo = new Vector2(rX + rW, rY); if (CircleToLine(cPosition, cRadius, edgeFrom, edgeTo)) { return(true); } } if ((sector & PointSectors.Bottom) != 0) { edgeFrom = new Vector2(rX, rY + rH); edgeTo = new Vector2(rX + rW, rY + rH); if (CircleToLine(cPosition, cRadius, edgeFrom, edgeTo)) { return(true); } } if ((sector & PointSectors.Left) != 0) { edgeFrom = new Vector2(rX, rY); edgeTo = new Vector2(rX, rY + rH); if (CircleToLine(cPosition, cRadius, edgeFrom, edgeTo)) { return(true); } } if ((sector & PointSectors.Right) != 0) { edgeFrom = new Vector2(rX + rW, rY); edgeTo = new Vector2(rX + rW, rY + rH); if (CircleToLine(cPosition, cRadius, edgeFrom, edgeTo)) { return(true); } } return(false); }
static public bool RectToCircle(float rX, float rY, float rW, float rH, Vector2 cPosition, float cRadius) { if (CircleToPoint(cPosition, cRadius, new Vector2(rX + rW / 2, rY + rH / 2)) == true) { return(true); } Vector2 edgeFrom; Vector2 edgeTo; PointSectors sector = GetSector(rX, rY, rW, rH, cPosition); if ((sector & PointSectors.Top) != 0) { edgeFrom = new Vector2(rX, rY); edgeTo = new Vector2(rX + rW, rY); if (CircleToLine(cPosition, cRadius, edgeFrom, edgeTo) == true) { return(true); } } if ((sector & PointSectors.Bottom) != 0) { edgeFrom = new Vector2(rX, rY + rH); edgeTo = new Vector2(rX + rW, rY + rH); if (CircleToLine(cPosition, cRadius, edgeFrom, edgeTo) == true) { return(true); } } if ((sector & PointSectors.Left) != 0) { edgeFrom = new Vector2(rX, rY); edgeTo = new Vector2(rX, rY + rH); if (CircleToLine(cPosition, cRadius, edgeFrom, edgeTo) == true) { return(true); } } if ((sector & PointSectors.Right) != 0) { edgeFrom = new Vector2(rX + rW, rY); edgeTo = new Vector2(rX + rW, rY + rH); if (CircleToLine(cPosition, cRadius, edgeFrom, edgeTo) == true) { return(true); } } return(false); }
static public PointSectors getSector(float rX, float rY, float rW, float rH, Vector2 point) { PointSectors sector = PointSectors.Center; if (point.X < rX) { sector |= PointSectors.Left; } else if (point.X >= rX + rW) { sector |= PointSectors.Right; } if (point.Y < rY) { sector |= PointSectors.Top; } else if (point.Y >= rY + rH) { sector |= PointSectors.Bottom; } return(sector); }
/* * Bitflags and helpers for using the Cohen–Sutherland algorithm * http://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm * * Sector bitflags: * 1001 1000 1010 * 0001 0000 0010 * 0101 0100 0110 */ static public PointSectors getSector(RectangleF rect, Vector2 point) { PointSectors sector = PointSectors.Center; if (point.X < rect.left) { sector |= PointSectors.Left; } else if (point.X >= rect.right) { sector |= PointSectors.Right; } if (point.Y < rect.top) { sector |= PointSectors.Top; } else if (point.Y >= rect.bottom) { sector |= PointSectors.Bottom; } return(sector); }
static PointSectors GetSector(Rectangle rect, Vector2 point) { PointSectors sector = PointSectors.Centre; if (point.X < rect.Left) { sector |= PointSectors.Left; } else if (point.X >= rect.Right) { sector |= PointSectors.Right; } if (point.Y < rect.Top) { sector |= PointSectors.Top; } else if (point.Y >= rect.Bottom) { sector |= PointSectors.Bottom; } return(sector); }
/* * Bitflags and helpers for using the Cohen–Sutherland algorithm * http://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm * * Sector bitflags: * 1001 1000 1010 * 0001 0000 0010 * 0101 0100 0110 */ static public PointSectors GetSector(RectangleF rect, System.Numerics.Vector2 point) { PointSectors sector = PointSectors.Center; if (point.X < rect.Left) { sector |= PointSectors.Left; } else if (point.X >= rect.Right) { sector |= PointSectors.Right; } if (point.Y < rect.Top) { sector |= PointSectors.Top; } else if (point.Y >= rect.Bottom) { sector |= PointSectors.Bottom; } return(sector); }
public static bool RectToLine(float rX, float rY, float rW, float rH, Vector2 lineFrom, Vector2 lineTo) { PointSectors fromSector = MyEngine.Collide.GetSector(rX, rY, rW, rH, lineFrom); PointSectors toSector = MyEngine.Collide.GetSector(rX, rY, rW, rH, lineTo); if (fromSector == PointSectors.Center || toSector == PointSectors.Center) { return(true); } else if ((fromSector & toSector) != 0) { return(false); } else { PointSectors both = fromSector | toSector; //Do line checks against the edges Vector2 edgeFrom; Vector2 edgeTo; if ((both & PointSectors.Top) != 0) { edgeFrom = new Vector2(rX, rY); edgeTo = new Vector2(rX + rW, rY); if (MyEngine.Collide.LineCheck(edgeFrom, edgeTo, lineFrom, lineTo)) { return(true); } } if ((both & PointSectors.Bottom) != 0) { edgeFrom = new Vector2(rX, rY + rH); edgeTo = new Vector2(rX + rW, rY + rH); if (MyEngine.Collide.LineCheck(edgeFrom, edgeTo, lineFrom, lineTo)) { return(true); } } if ((both & PointSectors.Left) != 0) { edgeFrom = new Vector2(rX, rY); edgeTo = new Vector2(rX, rY + rH); if (MyEngine.Collide.LineCheck(edgeFrom, edgeTo, lineFrom, lineTo)) { return(true); } } if ((both & PointSectors.Right) != 0) { edgeFrom = new Vector2(rX + rW, rY); edgeTo = new Vector2(rX + rW, rY + rH); if (MyEngine.Collide.LineCheck(edgeFrom, edgeTo, lineFrom, lineTo)) { return(true); } } } return(false); }
static public bool RectToLine(float rX, float rY, float rW, float rH, Vector2 lineFrom, Vector2 lineTo) { PointSectors fromSector = GetSector(rX, rY, rW, rH, lineFrom); PointSectors toSector = GetSector(rX, rY, rW, rH, lineTo); if (fromSector == PointSectors.Centre || toSector == PointSectors.Centre) { return(true); } else if ((fromSector & toSector) != 0) { return(false); } else { PointSectors both = fromSector | toSector; Vector2 edgeFrom; Vector2 edgeTo; if ((both & PointSectors.Top) != 0) { edgeFrom = new Vector2(rX, rY); edgeTo = new Vector2(rX + rW, rY); if (LineCheck(edgeFrom, edgeTo, lineFrom, lineTo) == true) { return(true); } } if ((both & PointSectors.Bottom) != 0) { edgeFrom = new Vector2(rX, rY + rH); edgeTo = new Vector2(rX + rW, rY + rH); if (LineCheck(edgeFrom, edgeTo, lineFrom, lineTo) == true) { return(true); } } if ((both & PointSectors.Left) != 0) { edgeFrom = new Vector2(rX, rY); edgeTo = new Vector2(rX, rY + rH); if (LineCheck(edgeFrom, edgeTo, lineFrom, lineTo) == true) { return(true); } } if ((both & PointSectors.Right) != 0) { edgeFrom = new Vector2(rX + rW, rY); edgeTo = new Vector2(rX + rW, rY + rH); if (LineCheck(edgeFrom, edgeTo, lineFrom, lineTo) == true) { return(true); } } } return(false); }
public static bool RectangleLine(float rX, float rY, float rW, float rH, Vector2 lineFrom, Vector2 lineTo) { //throw new Exception("rectangle-line collision not implemented."); PointSectors fromSector = Collision.GetSector(rX, rY, rW, rH, lineFrom); PointSectors toSector = Collision.GetSector(rX, rY, rW, rH, lineTo); if (fromSector == PointSectors.Center || toSector == PointSectors.Center) { return(true); } else if ((fromSector & toSector) != 0) { return(false); } else { PointSectors both = fromSector | toSector; //Do line checks against the edges Vector2 edgeFrom; Vector2 edgeTo; if ((both & PointSectors.Top) != 0) { edgeFrom = new Vector2(rX, rY); edgeTo = new Vector2(rX + rW, rY); if (Collision.LineCheck(edgeFrom, edgeTo, lineFrom, lineTo)) { return(true); } } if ((both & PointSectors.Bottom) != 0) { edgeFrom = new Vector2(rX, rY + rH); edgeTo = new Vector2(rX + rW, rY + rH); if (Collision.LineCheck(edgeFrom, edgeTo, lineFrom, lineTo)) { return(true); } } if ((both & PointSectors.Left) != 0) { edgeFrom = new Vector2(rX, rY); edgeTo = new Vector2(rX, rY + rH); if (Collision.LineCheck(edgeFrom, edgeTo, lineFrom, lineTo)) { return(true); } } if ((both & PointSectors.Right) != 0) { edgeFrom = new Vector2(rX + rW, rY); edgeTo = new Vector2(rX + rW, rY + rH); if (Collision.LineCheck(edgeFrom, edgeTo, lineFrom, lineTo)) { return(true); } } } return(false); }