Ejemplo n.º 1
0
        /// <summary>
        /// 初始化匀速贝塞尔路径运动
        /// </summary>
        /// <param name="points">贝塞尔点(0:P1, 1:P1右控制点, 2:P2_左控制点, 3: P2)</param>
        /// <param name="fullTime">完成曲线运动的期望总时间(ms)</param>
        /// <param name="interval">精度</param>
        /// <param name="UniformBezierRouteCallBack">匀速化贝塞尔点回调函数</param>
        public BezierRoute(Point[] points, int fullTime, int interval, UniformBezierRouteCallBack uniformBezierRouteCallBack)
        {
            Start          = false;
            FullTime       = fullTime;
            Interval       = interval;
            CallBack       = uniformBezierRouteCallBack;
            timer          = new Timer(interval);
            timer.Elapsed += Timer_Elapsed;
            this.points    = points;
            b3             = new Bezier_3();
            length         = b3.beze_length(points, 1);
            for (int i = 0; i < points.Length && i < 4; i++)
            {
                switch (i)
                {
                case 0: P1 = points[0]; break;

                case 1: P1_Control = points[1]; break;

                case 2: P2_Control = points[2]; break;

                case 3: P2 = points[3]; break;

                default:
                    break;
                }
            }
        }
Ejemplo n.º 2
0
        private void timerHandlerThread()
        {
            int    uniform = 0, ununiform = 1, timer = 3, beze_length = 4;
            int    way    = uniform;
            double length = 0;

            if (way != timer)
            {
                TimeSpan ts2 = (DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0)) - ts;
                timeSigma = ts2.TotalMilliseconds;
            }
            if (way == beze_length)
            {
                length = b3.beze_length(p, 1);
            }
            double deltaTime = timeSigma - lastTime;

            // Console.WriteLine(deltaTime);
            lastTime = timeSigma;
            if (timeSigma <= timeFull)
            {
                Point realPoint   = new Point();
                Point unrealPoint = new Point();

                if (way == uniform)
                {
                    // Uniform
                    double rt = b3.t2rt(p, timeSigma / timeFull);
                    realPoint = b3.b3_c(p, rt);
                    int deltaX = realPoint.X - lastX;
                    lastX = realPoint.X;
                    //Console.WriteLine((double)deltaX / deltaTime);

                    lock (this)
                    {
                        // x(Uniform)
                        g.DrawRectangle(pen, new Rectangle(realPoint.X - 1, p[0].Y - 1, 2, 2));

                        // y(Ease)
                        g.DrawRectangle(pen, new Rectangle(p[0].X - 1, realPoint.Y - 1, 2, 2));

                        // CurveMotion
                        g.DrawRectangle(pen, new Rectangle(realPoint.X - 2, realPoint.Y - 2, 4, 4));
                    }
                }
                else if (way == ununiform)
                {
                    // Ununiform
                    unrealPoint = b3.b3_c(p, timeSigma / timeFull);
                    int deltaX = unrealPoint.X - lastX;
                    lastX = unrealPoint.X;
                    //Console.WriteLine((double)deltaX / deltaTime);

                    lock (this)
                    {
                        // x(Uniform)
                        g.DrawRectangle(pen, new Rectangle(unrealPoint.X - 1, p[0].Y - 1, 2, 2));

                        // y(Ease)
                        g.DrawRectangle(pen, new Rectangle(p[0].X - 1, unrealPoint.Y - 1, 2, 2));

                        // CurveMotion
                        g.DrawRectangle(pen, new Rectangle(unrealPoint.X - 2, unrealPoint.Y - 2, 4, 4));
                    }
                }
                else if (way == timer)
                {
                    // Timer
                    timeSigma  += timer1.Interval;
                    unrealPoint = b3.b3_c(p, timeSigma / timeFull);

                    lock (this)
                    {
                        // x(Uniform)
                        g.DrawRectangle(pen, new Rectangle(unrealPoint.X - 1, p[0].Y - 1, 2, 2));

                        // y(Ease)
                        g.DrawRectangle(pen, new Rectangle(p[0].X - 1, unrealPoint.Y - 1, 2, 2));

                        // CurveMotion
                        g.DrawRectangle(pen, new Rectangle(unrealPoint.X - 2, unrealPoint.Y - 2, 4, 4));
                    }
                }
                else if (way == beze_length)
                {
                    lock (this)
                    {
                        // BeizeLength
                        double rt = b3.t2rt_by_baze_length(p, length * timeSigma / timeFull);
                        realPoint = b3.b3_c(p, rt);

                        // x(Uniform)
                        g.FillRectangle(new SolidBrush(pen.Color), new Rectangle(realPoint.X - 1, p[0].Y - 1, 2, 2));

                        // y(Ease)
                        g.FillRectangle(new SolidBrush(pen.Color), new Rectangle(p[0].X - 1, realPoint.Y - 1, 2, 2));

                        // CurveMotion
                        g.FillRectangle(new SolidBrush(pen.Color), new Rectangle(realPoint.X - 3, realPoint.Y - 3, 6, 6));
                    }
                }

                // Console.WriteLine("timeSigma = " + timeSigma + ", t = " + timeSigma / timeFull + ", rt = " + rt);

                //double shiftRate = (realPoint.Y - p[0].Y) / (p[3].Y - p[0].Y); // 位移率,当前y轴(位移)量占始末点总位移量的矢量比例
                //button1.BeginInvoke(new Action(() => button1.Left = (int)(easeX_Start + (easeX_End - easeX_Start) * shiftRate)));
                // Console.WriteLine(button1.Left);
            }
            else
            {
                timeSigma      = 0;
                timer1.Enabled = false;
                finish         = true;
            }
        }