Compartir a través de


Stroke.SelfIntersections (Propiedad)

Actualización: noviembre 2007

Obtiene las autointersecciones del objeto Stroke.

Espacio de nombres:  Microsoft.Ink
Ensamblado:  Microsoft.Ink (en Microsoft.Ink.dll)

Sintaxis

'Declaración
Public ReadOnly Property SelfIntersections As Single()
'Uso
Dim instance As Stroke
Dim value As Single()

value = instance.SelfIntersections
public float[] SelfIntersections { get; }
public:
property array<float>^ SelfIntersections {
    array<float>^ get ();
}
/** @property */
public float[] get_SelfIntersections()
public function get SelfIntersections () : float[]

Valor de propiedad

Tipo: array<System.Single[]
Matriz de valores de índice de punto flotante que representa las autointersecciones de un objeto Stroke.

Comentarios

Una autointersección es el punto de un trazo donde el trazo se atraviesa a sí mismo.

Un índice de punto flotante es un valor flotante que representa una ubicación situada en algún lugar entre dos puntos del trazo. Por ejemplo, si 0,0 es el primer punto del trazo y 1,0 el segundo punto, 0,5 se encontrará a mitad de camino entre el primer y el segundo punto. De igual forma, un valor de índice de punto flotante de 37,25 representa una ubicación que se encuentra en el 25 por ciento de la línea que une los puntos 37 y 38 del trazo.

Nota

Se devuelve un índice de punto flotante por cada intersección y combinación de segmentos de línea. Si un trazo tiene una intersección, la propiedad SelfIntersections devolverá dos autointersecciones, una por cada segmento de línea que forma parte de la intersección.

Ejemplos

En este ejemplo de C# se muestran los diferentes tipos de información que se registran con cada objeto Stroke. El programa que realiza la llamada usa elementos de menú para alternar la presentación de los puntos del trazo, los vértices de polilíneas, los puntos Bézier, los vértices Bézier y las autointersecciones. El método InkSpaceToPixel del objeto Renderer se usa con el fin de convertir los puntos para su presentación. El método LocatePoint se usa para interpolar las ubicaciones de las autointersecciones.

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);
}

En este ejemplo de Microsoft Visual Basic .NET se muestran los diferentes tipos de información que se registran con cada objeto Stroke. El programa que realiza la llamada usa elementos de menú para alternar la presentación de los puntos del trazo, los vértices de polilíneas, los puntos Bézier, los vértices Bézier y las autointersecciones. El método InkSpaceToPixel del objeto Renderer se usa con el fin de convertir los puntos para su presentación. El método LocatePoint se usa para interpolar las ubicaciones de las autointersecciones.

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

Plataformas

Windows Vista

.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.

Información de versión

.NET Framework

Compatible con: 3.0

Vea también

Referencia

Stroke (Clase)

Stroke (Miembros)

Microsoft.Ink (Espacio de nombres)