示例#1
0
        private void WriteArc(DxfDocument doc, Arc arc)
        {
            var radius = CADPoint.Distance(arc.center, arc.startPoint);

            doc.AddEntity(new netDxf.Entities.Arc(new Vector2(arc.center.X, arc.center.Y),
                                                  radius, arc.startAngle, arc.endAngle));
        }
示例#2
0
        internal override bool Cross(Bounding selectBound, Entity entity)
        {
            Arc arc = entity as Arc;

            if (arc == null)
            {
                return(false);
            }

            Bounding arcBounding = arc.Bounding;

            if (selectBound.Contains(arcBounding))
            {
                return(true);
            }

            if (!selectBound.IntersectWith(arcBounding))
            {
                return(false);
            }

            Circle   circle            = new Circle(arc.center, arc.radius);
            CADPoint nearestPntOnBound = new CADPoint(
                System.Math.Max(selectBound.left, System.Math.Min(circle.center.X, selectBound.right)),
                System.Math.Max(selectBound.bottom, System.Math.Min(circle.center.Y, selectBound.top)));

            if (CADPoint.Distance(nearestPntOnBound, circle.center) <= circle.radius)
            {
                double bdLeft   = selectBound.left;
                double bdRight  = selectBound.right;
                double bdTop    = selectBound.top;
                double bdBottom = selectBound.bottom;

                List <CADPoint> pnts = new List <CADPoint>();
                pnts.Add(new CADPoint(bdLeft, bdTop));
                pnts.Add(new CADPoint(bdLeft, bdBottom));
                pnts.Add(new CADPoint(bdRight, bdTop));
                pnts.Add(new CADPoint(bdRight, bdBottom));
                CADVector xp = new CADVector(1, 0);
                foreach (CADPoint pnt in pnts)
                {
                    if (CADPoint.Distance(pnt, circle.center) >= circle.radius)
                    {
                        CADVector v   = pnt - circle.center;
                        double    rad = CADVector.AngleInRadian(xp, v);
                        if (CADVector.Cross(xp, v) < 0)
                        {
                            rad = System.Math.PI * 2 - rad;
                        }

                        if (AngleInRange(rad, arc.startAngle, arc.endAngle))
                        {
                            return(true);
                        }
                    }
                }

                return(false);
            }
            else
            {
                return(false);
            }
        }