예제 #1
0
    private List <ICuttableEdge> MakeOcclusionLoop(CirclePrimitive player, CirclePrimitive obstacle, float radius_shift)
    {
        Vector2 center2center = player.center - obstacle.center;

        float      cp_param     = Mathf.Atan2(center2center.y, center2center.x);
        float      param_spread = Mathf.Acos(Mathf.Min((player.radius + obstacle.radius) / center2center.magnitude, 1.0f));
        CircleEdge circle_edge  = new CircleEdge(
            new CircleArc
        {
            center  = obstacle.center,
            radius  = obstacle.radius * (1 + radius_shift),
            t_start = cp_param - param_spread,
            t_end   = cp_param + param_spread
        },
            false);

        var      circle_end = circle_edge.Eval(0);
        LineEdge edge1      = new LineEdge(
            new LineSegment
        {
            p0 = circle_end.pt,
            p1 = circle_end.pt - circle_end.dir * 100
        },
            false);

        circle_end = circle_edge.Eval(1);
        LineEdge edge2 = new LineEdge(
            new LineSegment
        {
            p0 = circle_end.pt,
            p1 = circle_end.pt + circle_end.dir * 100
        },
            true);

        List <ICuttableEdge> res = new List <ICuttableEdge>();

        res.Add(edge1);

        for (int i = 0; i < 5; ++i)
        {
            res.Add(new LineEdge(new LineSegment {
                p0 = circle_edge.Eval(1.0f * i / 5).pt, p1 = circle_edge.Eval(1.0f * (i + 1) / 5).pt
            }, true));
        }
        res.Add(edge2);

        return(res);
    }
예제 #2
0
    private List <ICuttableEdge> MakeMiddleZone(CirclePrimitive player, CirclePrimitive target)
    {
        // 4 circle edges
        CircleArc       arc       = new CircleArc();
        CirclePrimitive primitive = MakeMiddlePrimitive(player, target);

        arc.radius  = primitive.radius;
        arc.center  = primitive.center;
        arc.t_start = 0;
        arc.t_end   = Mathf.PI * 2;

        var res = new List <ICuttableEdge>();

        var circle_edge = new CircleEdge(arc, false);

        for (int i = 0; i < 100; ++i)
        {
            res.Add(new LineEdge(new LineSegment {
                p0 = circle_edge.Eval(1.0f * i / 100).pt, p1 = circle_edge.Eval(1.0f * (i + 1) / 100).pt
            }, true));
        }

        return(res);
    }