示例#1
0
 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));
 }
示例#2
0
    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);
    }
示例#3
0
    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);
    }
示例#4
0
    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);
    }