예제 #1
0
        protected override void CreatePoints()
        {
            var D = Dimension;

            var(r1, r2, f1) = GetRadius();

            var n = 0;
            var N = 1 + D * 2; // number of points per spline

            DXY = new List <(float dx, float dy)>(N);
            float dx = -r1, dy = r2, adx = r1 / D;

            Add(dx, 0);

            for (int i = 0; i < N; i++)
            {
                if (AddLobe())
                {
                    break;
                }
            }
            TransformPoints(Matrix3x2.CreateRotation(RadiansStart));

            bool AddLobe()
            {
                dx += adx;
                if (Add(dx, dy))
                {
                    return(true);
                }
                dx += adx;
                if (Add(dx, dy))
                {
                    return(true);
                }
                dx += adx;
                if (Add(dx, dy))
                {
                    return(true);
                }
                dx += adx;
                if (Add(dx, 0))
                {
                    return(true);
                }
                dy = -1 * dy;
                return(false);
            }

            bool Add(float x, float y)
            {
                DXY.Add(Limit(x, y));
                return(++n >= N);
            }
        }
예제 #2
0
        protected override void CreatePoints()
        {
            var D = Dimension;
            var n = 0;
            var N = 1 + D;

            DXY = new List <(float dx, float dy)>(N);

            var(r1, r2, f1) = GetRadius();

            var d  = D / 2;
            var ax = r1 * 2 / d; //ax step size
            var bx = ax * f1;
            var dx = -r1;
            var dy = r2;

            Add(dx, -dy);
            dx += bx;
            for (int i = 0; i < D; i++)
            {
                if (Add(dx + bx, dy))
                {
                    return;
                }
                dx += ax;
                if (Add(dx - bx, dy))
                {
                    return;
                }
                if (Add(dx + bx, -dy))
                {
                    return;
                }
                dx += ax;
                if (Add(dx - bx, -dy))
                {
                    return;
                }
            }
            TransformPoints(Matrix3x2.CreateRotation(RadiansStart));

            bool Add(float x, float y)
            {
                DXY.Add(Limit(x, y));
                return(++n >= N);
            }
        }
예제 #3
0
 internal bool TryAddPoint(int index, Vector2 p)
 {
     if (index < 0)
     {
         return(false);
     }
     if (index < DXY.Count)
     {
         DXY.Insert(index + 1, p);
         return(true);
     }
     else if (index == DXY.Count)
     {
         DXY.Add(p);
         return(true);
     }
     return(false);
 }
예제 #4
0
        protected override void CreatePoints()
        {
            var D = Dimension;

            var(r1, r2, f1) = GetRadius();

            var n = 0;
            var N = 1 + D * 2; // number of points per spline

            DXY = new List <(float dx, float dy)>(N);
            float dx = -r1, dy = r2, adx, bdx, cdx;

            var ps = (D < 7) ? PS.L1 : (D < 11) ? PS.L2 : (D < 15) ? PS.L3 : PS.L4;

            switch (ps)
            {
            case PS.L1:
                SetDelta(2 * r1 / 6);

                if (AddLobe(adx, -dy))
                {
                    break;                         // 1
                }
                if (AddLobe(bdx, dy))
                {
                    break;                         // 2
                }
                if (AddLobe(adx, -dy))
                {
                    break;                         // 3
                }
                break;

            case PS.L2:
                SetDelta(2 * r1 / 9);

                if (AddLobe(adx, -dy))
                {
                    break;                         // 1
                }
                if (AddLobe(bdx, dy))
                {
                    break;                         // 2
                }
                if (AddLobe(cdx, -dy))
                {
                    break;                         // 3
                }
                if (AddLobe(bdx, dy))
                {
                    break;                         // 4
                }
                if (AddLobe(adx, -dy))
                {
                    break;                         // 5
                }
                break;

            case PS.L3:
                SetDelta(2 * r1 / 12);

                if (AddLobe(adx, -dy))
                {
                    break;                         // 1
                }
                if (AddLobe(bdx, dy))
                {
                    break;                         // 2
                }
                if (AddLobe(cdx, -dy))
                {
                    break;                         // 3
                }
                if (AddLobe(bdx, dy))
                {
                    break;                         // 4
                }
                if (AddLobe(cdx, -dy))
                {
                    break;                         // 5
                }
                if (AddLobe(bdx, dy))
                {
                    break;                         // 6
                }
                if (AddLobe(adx, -dy))
                {
                    break;                         // 7
                }
                break;

            case PS.L4:
                SetDelta(2 * r1 / 14);

                if (AddLobe(adx, -dy))
                {
                    break;                         // 1
                }
                if (AddLobe(bdx, dy))
                {
                    break;                         // 2
                }
                if (AddLobe(cdx, -dy))
                {
                    break;                         // 3
                }
                if (AddLobe(bdx, dy))
                {
                    break;                         // 4
                }
                if (AddLobe(cdx, -dy))
                {
                    break;                         // 5
                }
                if (AddLobe(bdx, dy))
                {
                    break;                         // 6
                }
                if (AddLobe(cdx, -dy))
                {
                    break;                         // 7
                }
                if (AddLobe(bdx, dy))
                {
                    break;                         // 8
                }
                if (AddLobe(adx, -dy))
                {
                    break;                         // 9
                }
                break;
            }
            TransformPoints(Matrix3x2.CreateRotation(RadiansStart));

            void SetDelta(float ds)
            {
                adx = ds * 2;
                bdx = ds * -1;
                cdx = ds * 2.5f;
                Add(dx, 0);
            }

            bool AddLobe(float tdx, float tdy)
            {
                if (Add(dx, tdy))
                {
                    return(true);
                }
                dx += tdx;
                if (Add(dx, tdy))
                {
                    return(true);
                }
                dx += tdx;
                if (Add(dx, tdy))
                {
                    return(true);
                }
                if (Add(dx, 0))
                {
                    return(true);
                }
                return(false);
            }

            bool Add(float x, float y)
            {
                DXY.Add(Limit(x, y));
                return(++n >= N);
            }
        }