예제 #1
0
        public static Ellipse2D FromFivePoints(GeoPoint2D[] p, bool isFull)
        {
            Ellipse2D res = FromFivePoints(p);

            if (res != null)
            {
                double mindist = double.MaxValue;
                double p0      = res.PositionOf(p[0]);
                for (int i = 1; i < 5; i++)
                {
                    double p1 = res.PositionOf(p[i]);
                    if (Math.Abs(p1 - p0) < Math.Abs(mindist))
                    {
                        mindist = p1 - p0;
                    }
                    p0 = p1;
                }
                if (mindist < 0)
                {
                    res.Reverse();
                }
                if (!isFull)
                {
                    double sp = res.PositionOf(p[0]);
                    double ep = res.PositionOf(p[4]);
                    double mp = res.PositionOf(p[2]);
                    if (sp < ep)
                    {
                        if (sp < mp && mp < ep)
                        {
                            res = res.Trim(sp, ep) as Ellipse2D;
                        }
                        else
                        {
                            res = res.Trim(ep, sp) as Ellipse2D;
                        }
                    }
                    else
                    {   // to be tested!
                        if (sp < mp && mp < ep)
                        {
                            res = res.Trim(ep, sp) as Ellipse2D;
                        }
                        else
                        {
                            res = res.Trim(sp, ep) as Ellipse2D;
                        }
                    }
                }
            }
            return(res);
        }
예제 #2
0
        private static void RefineIntersectionPoint(Ellipse2D e1, Ellipse2D e2, ref GeoPoint2DWithParameter ip)
        {   // hier mir Param arbeiten, da es sich auch um einen Ellipsenbogen handeln kann
            double     par1    = e1.ParamOf(ip.p);
            double     par2    = e2.ParamOf(ip.p);
            GeoPoint2D p1      = e1.PointAtParam(par1);
            GeoPoint2D p2      = e2.PointAtParam(par2);
            int        counter = 0;

            while (!Precision.IsEqual(p1, p2))
            {
                GeoVector2D d1 = e1.DirectionAtParam(par1);
                GeoVector2D d2 = e2.DirectionAtParam(par2);
                GeoPoint2D  p;
                if (Geometry.IntersectLL(p1, d1, p2, d2, out p))
                {
                    par1 = e1.ParamOf(p);
                    par2 = e2.ParamOf(p);
                    p1   = e1.PointAtParam(par1);
                    p2   = e2.PointAtParam(par2);
                    ip.p = p;
                }
                else
                {
                    break;
                }
                ++counter;
                if (counter > 100)
                {
                    break;
                }
            }
            ip.par1 = e1.PositionOf(ip.p); // richtige Werte auch für Arc
            ip.par2 = e2.PositionOf(ip.p);
        }
예제 #3
0
        /// <summary>
        /// Overrides <see cref="CADability.Curve2D.GeneralCurve2D.Intersect (ICurve2D)"/>
        /// </summary>
        /// <param name="IntersectWith"></param>
        /// <returns></returns>
        public override GeoPoint2DWithParameter[] Intersect(ICurve2D IntersectWith)
        {   // gesucht sind alle Schnittpunkte, also auch in der Verlängerung!
            Line2D l2d = IntersectWith as Line2D;

            if (l2d != null)
            {
                GeoPoint2D ip;
                if (Geometry.IntersectLL(startPoint, endPoint, l2d.StartPoint, l2d.EndPoint, out ip))
                {
                    double pos1 = this.PositionOf(ip);
                    double pos2 = l2d.PositionOf(ip);
                    GeoPoint2DWithParameter pwp = new GeoPoint2DWithParameter();
                    pwp.p    = ip;
                    pwp.par1 = pos1;
                    pwp.par2 = pos2;
                    return(new GeoPoint2DWithParameter[] { pwp });
                }
                else
                {
                    return(new GeoPoint2DWithParameter[0]);
                }
            }
            Circle2D c2d = IntersectWith as Circle2D;

            if (c2d != null)
            {
                GeoPoint2D[] isp = Geometry.IntersectLC(startPoint, endPoint, c2d.Center, c2d.Radius);
                GeoPoint2DWithParameter[] res = new GeoPoint2DWithParameter[isp.Length];
                for (int i = 0; i < isp.Length; ++i)
                {
                    res[i].p    = isp[i];
                    res[i].par1 = this.PositionOf(isp[i]);
                    res[i].par2 = c2d.PositionOf(isp[i]);
                }
                return(res);
            }
            Ellipse2D e2d = IntersectWith as Ellipse2D;

            if (e2d != null)
            {
                GeoPoint2D[] isp = Geometry.IntersectEL(e2d.center, e2d.majorAxis.Length, e2d.minorAxis.Length, e2d.majorAxis.Angle, startPoint, endPoint);
                GeoPoint2DWithParameter[] res = new GeoPoint2DWithParameter[isp.Length];
                for (int i = 0; i < isp.Length; ++i)
                {
                    res[i].p    = isp[i];
                    res[i].par1 = this.PositionOf(isp[i]);
                    res[i].par2 = e2d.PositionOf(isp[i]);
                }
                return(res);
            }
            Polyline2D p2d = IntersectWith as Polyline2D;

            if (p2d != null)
            {
                GeoPoint2DWithParameter[] res = p2d.Intersect(this); // sorum geht es
                for (int i = 0; i < res.Length; ++i)
                {
                    double t = res[i].par1;
                    res[i].par1 = res[i].par2;
                    res[i].par2 = t;
                }
                return(res);
            }
            Path2D pa2d = IntersectWith as Path2D;

            if (pa2d != null)
            {
                GeoPoint2DWithParameter[] res = pa2d.Intersect(this); // sorum geht es
                for (int i = 0; i < res.Length; ++i)
                {
                    double t = res[i].par1;
                    res[i].par1 = res[i].par2;
                    res[i].par2 = t;
                }
                return(res);
            }
            BSpline2D b2d = IntersectWith as BSpline2D;

            if (b2d != null)
            {
                GeoPoint2DWithParameter[] res = b2d.Intersect(this); // sorum geht es
                for (int i = 0; i < res.Length; ++i)
                {
                    double t = res[i].par1;
                    res[i].par1 = res[i].par2;
                    res[i].par2 = t;
                }
                return(res);
            }
            return(base.Intersect(IntersectWith));
        }