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); }
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); }