/// <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);
        }
Exemple #2
0
        /// <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);
            }
        }