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);
    }
Example #2
0
 public void Visit(CircleEdge circle)
 {
     if (m_e1c != null || m_e1l != null)
     {
         if (m_e1c != null)
         {
             m_res = m_intersector.Intersect(m_e1c, circle);
         }
         else
         {
             m_res = m_intersector.Intersect(m_e1l, circle, false);
         }
     }
     else
     {
         m_e1c = circle;
     }
 }
    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);
    }
Example #4
0
 public List <Intersection> Intersect(CircleEdge target, CircleEdge tool)
 {
     throw new System.NotImplementedException();
 }
Example #5
0
 public List <Intersection> Intersect(LineEdge target, CircleEdge tool, bool flip)
 {
     /*
      * var target_data = target.Data;
      * var tool_data = tool.Data;
      *
      * float line_closest_param = target_data.ClosestPointParam( tool_data.center );
      * Vector2 line2center = ( target_data.Eval( line_closest_param ) - tool_data.center );
      * float line2center_dist = line2center.magnitude;
      *
      * var res = new List<Intersection>();
      * if ( line2center_dist <= tool_data.radius )
      * {
      *  float base_param = tool_data.GetClosestPoint( target_data.Eval( line_closest_param ) );
      *  float spread = Mathf.Acos( line2center_dist / tool_data.radius );
      *  if ( spread < 1.0e-3 )
      *      spread = 1.0e-3f;
      *
      *  for ( int i = -1; i <= 1; i += 2 )
      *  {
      *      float curve_param = base_param + spread * i;
      *
      *      float line_param = target_data.ClosestPointParam( tool_data.Eval( curve_param ) );
      *      if ( line_param > -1.0e-5 && line_param < 1.0 + 1.0e-5 )
      *      {
      *          bool in_edge_found = false;
      *          float min_dist = Mathf.PI * 4;
      *          curve_param -= Mathf.PI * 2;
      *          float corrected_curve_param = curve_param;
      *          while ( curve_param < Mathf.PI * 6 )
      *          {
      *              if ( curve_param >= tool_data.t_start && curve_param <= tool_data.t_end )
      *              {
      *                  corrected_curve_param = curve_param;
      *                  in_edge_found = true;
      *                  break;
      *              }
      *
      *              if ( curve_param < tool_data.t_start && ( tool_data.t_start - curve_param ) < min_dist )
      *              {
      *                  corrected_curve_param = curve_param;
      *                  min_dist = ( tool_data.t_start - curve_param );
      *              }
      *
      *              if ( curve_param > tool_data.t_end && ( curve_param - tool_data.t_end ) < min_dist )
      *              {
      *                  corrected_curve_param = curve_param;
      *                  min_dist = ( curve_param - tool_data.t_end );
      *                  break;
      *              }
      *
      *              curve_param += Mathf.PI * 2;
      *          }
      *
      *          if ( in_edge_found || min_dist < 1.0e-5 )
      *          {
      *              Intersection intersection = new Intersection
      *              {
      *                  face_edge_param = line_param,
      *                  cut_param = Mathf.InverseLerp( tool_data.t_start, tool_data.t_end, corrected_curve_param )
      *              };
      *              if ( !target.Sense )
      *                  intersection.face_edge_param = 1 - intersection.face_edge_param;
      *              if ( !tool.Sense )
      *                  intersection.cut_param = 1 - intersection.cut_param;
      *
      *              if ( !flip )
      *              {
      *                  intersection.tool_edge_enters = Utils.TestLeftHemiplane( line2center, target_data.p1 - target_data.p0 );
      *              }
      *              else
      *              {
      *                  intersection.tool_edge_enters = !Utils.TestLeftHemiplane( line2center, target_data.p1 - target_data.p0 );
      *              }
      *
      *              {
      *                  if ( i > 0 )
      *                      intersection.tool_edge_enters = !intersection.tool_edge_enters;
      *                  if ( ! target.Sense )
      *                      intersection.tool_edge_enters = !intersection.tool_edge_enters;
      *                  if ( ! tool.Sense )
      *                      intersection.tool_edge_enters = !intersection.tool_edge_enters;
      *
      *                  if ( flip )
      *                  {
      *                      float temp = intersection.cut_param;
      *                      intersection.cut_param = intersection.face_edge_param;
      *                      intersection.face_edge_param = temp;
      *                  }
      *
      *                  res.Add( intersection );
      *              }
      *          }
      *      }
      *  }
      *
      *  if ( res.Count == 2 )
      *  {
      *
      *      if ( flip && res[0].face_edge_param > res[1].face_edge_param
      || !flip && res[0].cut_param > res[1].cut_param )
      ||     {
      ||         var temp = res[0];
      ||         res[0] = res[1];
      ||         res[1] = temp;
      ||     }
      || }
      ||
      ||}
      */
     throw new System.NotImplementedException();
 }
Example #6
0
 public void Visit(CircleEdge circle)
 {
     throw new System.NotImplementedException();
 }