private bool is_biarc_inside_ball(Biarc2d biarc, Circle2F ball) { if (biarc.Pm.DistanceTo(ball.Center) > ball.Radius) { return(false); } Point2F start = biarc.P1; Point2F end = biarc.P2; Line2F insects; if (biarc.Seg1 is Line2F) { insects = ball.LineIntersect((Line2F)biarc.Seg1); } else { insects = ((Arc2F)biarc.Seg1).CircleIntersect(ball); } if ((!insects.p1.IsUndefined) && insects.p1.DistanceTo(start) < _general_tolerance) { insects.p1 = Point2F.Undefined; } if ((!insects.p2.IsUndefined) && insects.p2.DistanceTo(start) < _general_tolerance) { insects.p2 = Point2F.Undefined; } if (!(insects.p1.IsUndefined && insects.p2.IsUndefined)) { return(false); } if (biarc.Seg2 is Line2F) { insects = ball.LineIntersect((Line2F)biarc.Seg2); } else { insects = ((Arc2F)biarc.Seg2).CircleIntersect(ball); } if ((!insects.p1.IsUndefined) && insects.p1.DistanceTo(end) < _general_tolerance) { insects.p1 = Point2F.Undefined; } if ((!insects.p2.IsUndefined) && insects.p2.DistanceTo(end) < _general_tolerance) { insects.p2 = Point2F.Undefined; } if (!(insects.p1.IsUndefined && insects.p2.IsUndefined)) { return(false); } return(true); }
public void Add(Biarc2d biarc, double tolerance) { if (biarc.Seg1 is Arc2F) { this.Add((Arc2F)biarc.Seg1, tolerance); } else { this.Add((Line2F)biarc.Seg1, tolerance); } if (biarc.Seg2 is Arc2F) { this.Add((Arc2F)biarc.Seg2, tolerance); } else { this.Add((Line2F)biarc.Seg2, tolerance); } }
private Sliced_path_item connect_slices_with_biarc(Slice dst, Slice src) { Point2F start = src.End; Point2F end = dst.Start; // unit normals to points Vector2d vn_start = new Vector2d(src.Center, start).Unit(); Vector2d vn_end = new Vector2d(dst.Center, end).Unit(); // tangents to points Vector2d vt_start; Vector2d vt_end; if (src.Dir == RotationDirection.CW) { vt_start = new Vector2d(vn_start.Y, -vn_start.X); } else { vt_start = new Vector2d(-vn_start.Y, vn_start.X); } if (dst.Dir == RotationDirection.CW) { vt_end = new Vector2d(vn_end.Y, -vn_end.X); } else { vt_end = new Vector2d(-vn_end.Y, vn_end.X); } Biarc2d biarc = new Biarc2d(start, vt_start, end, vt_end); if (!is_biarc_inside_ball(biarc, src.Ball)) { return(null); } Sliced_path_item path = new Sliced_path_item(Sliced_path_item_type.SMOOTH_CHORD); path.Add(biarc, _general_tolerance); return(path); }