Stroke.PolylineCusps Property
Stroke.PolylineCusps Property |
Gets an array that contains the indices of the cusps of the Stroke object.
Definition
Visual Basic .NET Public ReadOnly Property PolylineCusps As Integer() C# public int[] PolylineCusps { get; } Managed C++ public: __property int* get_PolylineCusps();
Property Value
System.Int32[]. An array of the indices of the points that make up the cusps of the Stroke object.
This property is read-only. This property has no default value.
Remarks
The array returned by the BezierCusps property is a subset of the array returned by the BezierPoints property. Each index in the BezierCusps property corresponds to a point in the array returned by the BezierPoints property that is a cusp of the Bezier control points for the stroke.
A cusp is a point on the stroke where the direction of writing changes in a discontinuous fashion. For example, if the stroke represents the capital letter "L", this property returns three cusps: two corresponding to the first and last control points on the stroke and the third representing the corner of the "L".
The location of a cusp can be determined by using the cusp as an index into the array returned by the GetPoints method.
Examples
[C#]
This C# example demonstrates several kinds of information that is recorded with each Stroke object. The calling program uses menu items to toggle the display of each stroke's points, polyline cusps, Bezier points, Bezier cusps, and self-intersections. The Renderer object's InkSpaceToPixel method is used to convert the points for display. The LocatePoint method is used to interpolate the locations of the self-intersections.
Microsoft.Ink.InkCollector theInkCollector; // Event handler for the form's load event. private void Form1_Load(object sender, System.EventArgs e) { // Create the InkCollector. theInkCollector = new InkCollector(this.Handle); // Attach an event handler for the Stroke event. theInkCollector.Stroke += new InkCollectorStrokeEventHandler(theInkCollector_Stroke); // Enable the InkCollector. theInkCollector.Enabled = true; } // Event handler for the InkCollector's Stroke event. private void theInkCollector_Stroke(object sender, InkCollectorStrokeEventArgs e) { // Force the form to repaint. Refresh(); } // Event handler for the Clear menu's Click event. private void menuClear_Click(object sender, System.EventArgs e) { // Delete the strokes in the InkCollector. theInkCollector.Ink.DeleteStrokes(); // Force the form to repaint. Refresh(); } private void menuExit_Click(object sender, System.EventArgs e) { this.Close(); } // Event handler for the Click event for subitems of the Display menu. private void menuDisplayItem_Click(object sender, System.EventArgs e) { // Check each subitem to see if it was clicked. foreach (System.Windows.Forms.MenuItem menu in menuDisplay.MenuItems) { if (sender == menu) { // Toggle the menu item's checked property. menu.Checked = !menu.Checked; } } // Force the form to repaint. this.Refresh(); } // Event handler for the form's Paint event. private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { Graphics g = e.Graphics; // Highlight specific points or cusps of each stroke. Strokes theStrokes = theInkCollector.Ink.Strokes; foreach (Stroke theStroke in theStrokes) { // Convert the stroke's points and Bezier points from ink space to pixel coordinates. Point [] ptBezierPoints = theStroke.BezierPoints; Point [] ptStrokePoints = theStroke.GetPoints(); theInkCollector.Renderer.InkSpaceToPixel(g, ref ptBezierPoints); theInkCollector.Renderer.InkSpaceToPixel(g, ref ptStrokePoints); // If all points is checked, highlight the points of the stroke. if (menuAllPoints.Checked) { foreach (Point pt in ptStrokePoints) { // draw a little diagonal line from each point g.DrawEllipse(Pens.Magenta, pt.X-2, pt.Y-2, 4, 4); } } // If polyline cusps is checked, highlight the cusps of the stroke. if (menuPolylineCusps.Checked) { int[] theCusps = theStroke.PolylineCusps; foreach (int i in theCusps) { // Draw a little rectangle around each polyline cusp. g.DrawEllipse(Pens.BlueViolet, ptStrokePoints[i].X - 3, ptStrokePoints[i].Y - 3, 6, 6); } } // If Bezier points is checked, highlight the Bezier points of the stroke. if (menuBezierPoints.Checked) { foreach (Point pt in ptBezierPoints) { // Draw a little diagonal line from each Bezier point. g.DrawEllipse(Pens.Goldenrod, pt.X-4, pt.Y-4, 8, 8); } } // If Bezier cusps is checked, highlight the Bezier cusps of the stroke. if (menuBezierCusps.Checked) { int [] theCusps = theStroke.BezierCusps; foreach (int i in theCusps) { // Draw a little rectangle around each Bezier cusp. g.DrawEllipse(Pens.Blue, ptBezierPoints[i].X-5, ptBezierPoints[i].Y-5, 10, 10); } } // If self intersections is checked, highlight the self intersections of the stroke. if (menuSelfIntersections.Checked) { float [] theSelfIntersectionLocationsArray = theStroke.SelfIntersections; foreach (float f in theSelfIntersectionLocationsArray) { Point pt = LocatePoint(theStroke, f); theInkCollector.Renderer.InkSpaceToPixel(g, ref pt); // Draw a little circle around each intersection. g.DrawEllipse(Pens.Red, pt.X-7, pt.Y-7, 14, 14); } } } } // This function returns the approximate point along // a stroke represented by a float, as a Point. private Point LocatePoint(Stroke theStroke, float theFIndex) { // Get the two nearest points to the point of interest. Point [] ptStrokePoints = theStroke.GetPoints((int)Math.Floor(theFIndex), 2); // Get fractional part to interpolate the distance between the points. float theFraction = theFIndex - (float)Math.Floor(theFIndex); int deltaX = (int)((ptStrokePoints[1].X - ptStrokePoints[0].X) * theFraction); int deltaY = (int)((ptStrokePoints[1].Y - ptStrokePoints[0].Y) * theFraction); // Return the interpolated point. return new Point(ptStrokePoints[0].X + deltaX, ptStrokePoints[0].Y + deltaY); }
[Visual Basic .NET]
This Microsoft® Visual Basic® .NET example demonstrates several kinds of information that is recorded with each Stroke object. The calling program uses menu items to toggle the display of each stroke's points, polyline cusps, Bezier points, Bezier cusps, and self-intersections. The Renderer object's InkSpaceToPixel method is used to convert the points for display. The LocatePoint method is used to interpolate the locations of the self-intersections.
Dim WithEvents theInkCollector As Microsoft.Ink.InkCollector ' Event handler for the form's Load event. Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ' Create and enable the InkCollector theInkCollector = New Microsoft.Ink.InkCollector(Me.Handle) theInkCollector.Enabled = True ' Associate the Click event handler with subitems of the Display menu. AddHandler menuAllPoints.Click, AddressOf menuDisplayItem_Click AddHandler menuPolylineCusps.Click, AddressOf menuDisplayItem_Click AddHandler menuBezierPoints.Click, AddressOf menuDisplayItem_Click AddHandler menuBezierCusps.Click, AddressOf menuDisplayItem_Click AddHandler menuSelfIntersections.Click, AddressOf menuDisplayItem_Click End Sub ' Event handler for the InkCollector's Stroke event. Private Sub theInkCollector_Stroke(ByVal sender As Object, _ ByVal e As Microsoft.Ink.InkCollectorStrokeEventArgs) Handles theInkCollector.Stroke ' Force the form to repaint. Me.Refresh() End Sub ' Event handler for the Clear menu's Click event. Private Sub menuClear_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles menuClear.Click ' Delete the strokes in the InkCollector. theInkCollector.Ink.DeleteStrokes() ' Force the form to repaint. Me.Refresh() End Sub ' Event handler for the Click event for subitems of the Display menu. Private Sub menuDisplayItem_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) ' Check each subitem to see if it was clicked. For Each menu As System.Windows.Forms.MenuItem In menuDisplay.MenuItems If (sender Is menu) Then ' Toggle the menu item's checked property. menu.Checked = Not menu.Checked End If Next ' Force the form to repaint. Me.Refresh() End Sub ' Event handler for the form's Paint event. Private Sub Form1_Paint(ByVal sender As Object, _ ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint Dim g As Graphics = e.Graphics ' Highlight specific points or cusps of each stroke. Dim theStrokes As Microsoft.Ink.Strokes = theInkCollector.Ink.Strokes For Each theStroke As Microsoft.Ink.Stroke In theStrokes ' Convert the stroke's points and Bezier points from ink space to pixel coordinates. Dim ptBezierPoints() As Point = theStroke.BezierPoints Dim ptStrokePoints() As Point = theStroke.GetPoints() theInkCollector.Renderer.InkSpaceToPixel(g, ptBezierPoints) theInkCollector.Renderer.InkSpaceToPixel(g, ptStrokePoints) ' If all points is checked, highlight the points of the stroke. If (menuAllPoints.Checked) Then For Each pt As Point In ptStrokePoints ' draw a little diagonal line from each point g.DrawEllipse(Pens.Magenta, pt.X - 2, pt.Y - 2, 4, 4) Next End If ' If polyline cusps is checked, highlight the cusps of the stroke. If (menuPolylineCusps.Checked) Then Dim theCusps() As Integer = theStroke.PolylineCusps For Each i As Integer In theCusps ' Draw a little rectangle around each polyline cusp. g.DrawEllipse(Pens.BlueViolet, ptStrokePoints(i).X - 3, ptStrokePoints(i).Y - 3, 6, 6) Next End If ' If Bezier points is checked, highlight the Bezier points of the stroke. If (menuBezierPoints.Checked) Then For Each pt As Point In ptBezierPoints ' Draw a little diagonal line from each Bezier point. g.DrawEllipse(Pens.Goldenrod, pt.X - 4, pt.Y - 4, 8, 8) Next End If ' If Bezier cusps is checked, highlight the Bezier cusps of the stroke. If (menuBezierCusps.Checked) Then Dim theCusps() As Integer = theStroke.BezierCusps For Each i As Integer In theCusps ' Draw a little rectangle around each Bezier cusp. g.DrawEllipse(Pens.Blue, ptBezierPoints(i).X - 5, ptBezierPoints(i).Y - 5, 10, 10) Next End If ' If self intersections is checked, highlight the self intersections of the stroke. If (menuSelfIntersections.Checked) Then Dim theSelfIntersectionLocationsArray() As Single = theStroke.SelfIntersections For Each f As Single In theSelfIntersectionLocationsArray Dim pt As Point = LocatePoint(theStroke, f) theInkCollector.Renderer.InkSpaceToPixel(g, pt) ' Draw a little circle around each intersection. g.DrawEllipse(Pens.Red, pt.X - 7, pt.Y - 7, 14, 14) Next End If Next End Sub ' This function returns the approximate point along ' a stroke represented by a float, as a Point. Private Function LocatePoint(ByVal theStroke As Microsoft.Ink.Stroke, _ ByVal theFIndex As Single) As Point ' Get the two nearest points to the point of interest. Dim ptStrokePoints() As Point = theStroke.GetPoints(Math.Floor(theFIndex), 2) ' Get fractional part to interpolate the distance between the points. Dim theFraction As Single = theFIndex - Math.Floor(theFIndex) Dim deltaX As Integer = (ptStrokePoints(1).X - ptStrokePoints(0).X) * theFraction Dim deltaY As Integer = (ptStrokePoints(1).Y - ptStrokePoints(0).Y) * theFraction ' Return the interpolated point. LocatePoint = New Point(ptStrokePoints(0).X + deltaX, ptStrokePoints(0).Y + deltaY) End Function
See Also