/// <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; } } }
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; } }