/// <summary> /// Adds the handles for the given bezier point. /// </summary> /// <param name="index">The index of the <c>KimonoBezierPoint</c> that handles are /// being created for.</param> /// <param name="bezierPoint">The <c>KimonoBezierPoint</c> that is getting handles.</param> public void AddHandlesForPoint(int index, KimonoBezierPoint bezierPoint) { // Add new control point handle var controlPoint = new KimonoHandle(bezierPoint.ControlPoint.X - KimonoHandle.DrawOffset, bezierPoint.ControlPoint.Y - KimonoHandle.DrawOffset) { Index = index, HandleType = KimonoHandleType.BezierControlPoint }; controlPoint.Moved += (pt) => { // Move attached point Points[controlPoint.Index].ControlPoint = pt; }; ControlPoints.Add(controlPoint); // Add new end point handle var endPoint = new KimonoHandle(bezierPoint.EndPoint.X - KimonoHandle.DrawOffset, bezierPoint.EndPoint.Y - KimonoHandle.DrawOffset) { Index = index }; endPoint.Moved += (pt) => { // Move attached point Points[endPoint.Index].EndPoint = pt; }; ControlPoints.Add(endPoint); }
/// <summary> /// Clone this instance. /// </summary> /// <returns>The clone.</returns> public KimonoBezierPoint Clone() { // Make new copy var newPoint = new KimonoBezierPoint(this.ControlPoint.X, this.ControlPoint.Y, this.EndPoint.X, this.EndPoint.Y); // Return new copy return(newPoint); }
/// <summary> /// Adds the given point to the shape. /// </summary> /// <param name="point">The new <c>SKPoint</c> to add.</param> public void AddPoint(SKPoint point) { // is this the first point added? if (Points.Count > 0) { // No, grab first point var firstPoint = Points[0]; // Is the new point within five pixels of the first point? if (point.X > (firstPoint.EndPoint.X - 5) && point.X < (firstPoint.EndPoint.X + 5) && point.Y > (firstPoint.EndPoint.Y - 5) && point.Y < (firstPoint.EndPoint.Y + 5)) { // Yes, close the shape and complete editing point.X = firstPoint.EndPoint.X; point.Y = firstPoint.EndPoint.Y; State = KimonoShapeState.Finalizing; } } // Get defaul control point locations var x = point.X; var y = point.Y; // Was there a last point added? if (LastPoint != null) { // Yes, calculate default quad position x = LastPoint.EndPoint.X + ((point.X - LastPoint.EndPoint.X) / 2f); y = LastPoint.EndPoint.Y + ((point.Y - LastPoint.EndPoint.Y) / 2f); } // Add point and recalculate bounds var bezierPoint = new KimonoBezierPoint(x, y, point.X, point.Y); Points.Add(bezierPoint); RecalculateVectorBounds(); // Are we in the editing mode? if (State == KimonoShapeState.Editing || State == KimonoShapeState.Finalizing) { // Add a new drag handle for the new point AddHandlesForPoint(Points.Count - 1, bezierPoint); } }