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