public bool RectInside(GeomRect rect) { return (this.PointInside(rect.x1, rect.y1) || this.PointInside(rect.x2, rect.y2) || this.PointInside(rect.x1, rect.y1) || this.PointInside(rect.x2, rect.y2)); }
private static CollisionInfo rectToRect(GeomBase geom1, GeomBase geom2) { GeomRect rect1 = (GeomRect)geom1; GeomRect rect2 = (GeomRect)geom2; Vector2D centerDistanceVertor = rect1.center.clone().subtract(rect2.center); Vector2D[] axes = new Vector2D[] { rect1.axisX, rect1.axisY, rect2.axisX, rect2.axisY, }; help.isHit = true; for (int i = 0, len = axes.Length; i < len; i++) { if (rect1.getProjectionRadius(axes[i]) + rect2.getProjectionRadius(axes[i]) <= Math.Abs(centerDistanceVertor.dotProd(axes[i]))) { help.isHit = false; break; } } centerDistanceVertor.clear(); return(help); }
private static CollisionInfo circleToRect(GeomBase geom1, GeomBase geom2) { GeomCircle circle = (GeomCircle)geom1; GeomRect rect = (GeomRect)geom2; Vector2D unRotated = circle.center.clone().subtract(rect.center); unRotated.angle -= rect.angle; unRotated = unRotated.add(rect.center); Vector2D closest = Vector2D.createVector(); if (unRotated.x < rect.x) { closest.x = rect.x; } else if (unRotated.x > rect.right) { closest.x = rect.right; } else { closest.x = unRotated.x; } if (unRotated.y < rect.y) { closest.y = rect.y; } else if (unRotated.y > rect.bottom) { closest.y = rect.bottom; } else { closest.y = unRotated.y; } help.isHit = unRotated.dist(closest) < circle.radius; unRotated.clear(); closest.clear(); return(help); }
public static GeomBase createGeom(FightEntity entity, object[] datas, object[] offset = null) { GeomBase result = null; switch (datas.Length) { case 1: result = new GeomCircle(entity.map); break; case 2: result = new GeomRect(entity.map); break; case 3: case 4: result = new GeomSector(entity.map); break; } result.entity = entity; result.parseData(datas, offset); return(result); }