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), }); }
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); } }
public BezierCurve( BezierCurvePoint startPoint, BezierCurvePoint controlPoint1, BezierCurvePoint controlPoint2, BezierCurvePoint endPoint) { this.StartPoint = startPoint; this.ControlPoint1 = controlPoint1; this.ControlPoint2 = controlPoint2; this.EndPoint = endPoint; }
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), }); }
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); } }
private void StrokeDraw(BezierCurvePoint point) { this.DrawPoint(point, this.LastWidth); }
private double DistanceTo(BezierCurvePoint point) { return(Math.Sqrt(Math.Pow(this.X - point.X, 2) + Math.Pow(this.Y - point.Y, 2))); }
public double VelocityFrom(BezierCurvePoint start) { return(this.Time != start.Time ? this.DistanceTo(start) / (this.Time - start.Time).Milliseconds : 0); }