Esempio n. 1
0
        private List <BezierCurvePoint> CalculateCurveControlPoints(List <BezierCurvePoint> points)
        {
            var dx1 = points[0].X - points[1].X;
            var dy1 = points[0].Y - points[1].Y;
            var dx2 = points[1].X - points[2].X;
            var dy2 = points[1].Y - points[2].Y;

            var m1 = new BezierCurvePoint((points[0].X + points[1].X) / 2, (points[0].Y + points[1].Y) / 2);
            var m2 = new BezierCurvePoint((points[1].X + points[2].X) / 2, (points[1].Y + points[2].Y) / 2);

            var l1 = Math.Sqrt(dx1 * dx1 + dy1 * dy1);
            var l2 = Math.Sqrt(dx2 * dx2 + dy2 * dy2);

            var dxm = m1.X - m2.X;
            var dym = m1.Y - m2.Y;

            var k  = l2 / (l1 + l2);
            var cm = new BezierCurvePoint(m2.X + dxm * k, m2.Y + dym * k);

            var tx = points[1].X - cm.X;
            var ty = points[1].Y - cm.Y;

            return(new List <BezierCurvePoint>()
            {
                new BezierCurvePoint(m1.X + tx, m1.Y + ty),
                new BezierCurvePoint(m2.X + tx, m2.Y + ty),
            });
        }
Esempio n. 2
0
        private void AddPoint(BezierCurvePoint point)
        {
            this.Points.Add(point);

            if (this.Points.Count > 2)
            {
                if (this.Points.Count == 3)
                {
                    this.Points.Insert(0, this.Points[0]);
                }

                var startPoint    = this.Points[1];
                var controlPoint1 = this.CalculateCurveControlPoints(new List <BezierCurvePoint>()
                {
                    this.Points[0], this.Points[1], this.Points[2],
                })[1];
                var controlPoint2 = this.CalculateCurveControlPoints(new List <BezierCurvePoint>()
                {
                    this.Points[1], this.Points[2], this.Points[3],
                })[0];
                var endPoint = this.Points[2];

                var curve = new BezierCurve(startPoint, controlPoint1, controlPoint2, endPoint);

                this.AddCurve(curve);

                this.Points.RemoveAt(0);
            }
        }
Esempio n. 3
0
 public BezierCurve(
     BezierCurvePoint startPoint,
     BezierCurvePoint controlPoint1,
     BezierCurvePoint controlPoint2,
     BezierCurvePoint endPoint)
 {
     this.StartPoint    = startPoint;
     this.ControlPoint1 = controlPoint1;
     this.ControlPoint2 = controlPoint2;
     this.EndPoint      = endPoint;
 }
Esempio n. 4
0
 private void DrawPoint(BezierCurvePoint point, double width)
 {
     this.MyCanvas.Children.Add(
         new Ellipse()
     {
         HorizontalAlignment = HorizontalAlignment.Left,
         VerticalAlignment   = VerticalAlignment.Top,
         Width  = width,
         Height = width,
         Fill   = this.penColor,
         Stroke = this.penColor,
         Margin = new Thickness(point.X, point.Y, 0, 0),
     });
 }
Esempio n. 5
0
        private void DrawCurve(BezierCurve curve, double startWidth, double endWidth)
        {
            var widthDelta = endWidth - startWidth;
            var drawSteps  = Math.Floor(curve.Length);

            for (int i = 0; i < drawSteps; i++)
            {
                var t   = i / drawSteps;
                var tt  = t * t;
                var ttt = tt * t;

                var u   = 1 - t;
                var uu  = u * u;
                var uuu = uu * u;

                var x     = curve.StartPoint.X * uuu + 3 * curve.ControlPoint1.X * uu * t + 3 * curve.ControlPoint2.X * u * tt + curve.EndPoint.X * ttt;
                var y     = curve.StartPoint.Y * uuu + 3 * curve.ControlPoint1.Y * uu * t + 3 * curve.ControlPoint2.Y * u * tt + curve.EndPoint.Y * ttt;
                var point = new BezierCurvePoint(x, y);

                var width = startWidth + ttt * widthDelta;

                this.DrawPoint(point, width);
            }
        }
Esempio n. 6
0
 private void StrokeDraw(BezierCurvePoint point)
 {
     this.DrawPoint(point, this.LastWidth);
 }
Esempio n. 7
0
 private double DistanceTo(BezierCurvePoint point)
 {
     return(Math.Sqrt(Math.Pow(this.X - point.X, 2) + Math.Pow(this.Y - point.Y, 2)));
 }
Esempio n. 8
0
 public double VelocityFrom(BezierCurvePoint start)
 {
     return(this.Time != start.Time ? this.DistanceTo(start) / (this.Time - start.Time).Milliseconds : 0);
 }