Condividi tramite


Metodo Stroke.GetRectangleIntersections

Aggiornamento: novembre 2007

Restituisce una matrice di strutture StrokeIntersection che indicano il punto in cui un oggetto Stroke interseca un oggetto Rectangle specificato.

Spazio dei nomi:  Microsoft.Ink
Assembly:  Microsoft.Ink (in Microsoft.Ink.dll)

Sintassi

'Dichiarazione
Public Function GetRectangleIntersections ( _
    intersectRectangle As Rectangle _
) As StrokeIntersection()
'Utilizzo
Dim instance As Stroke
Dim intersectRectangle As Rectangle
Dim returnValue As StrokeIntersection()

returnValue = instance.GetRectangleIntersections(intersectRectangle)
public StrokeIntersection[] GetRectangleIntersections(
    Rectangle intersectRectangle
)
public:
array<StrokeIntersection>^ GetRectangleIntersections(
    Rectangle intersectRectangle
)
public StrokeIntersection[] GetRectangleIntersections(
    Rectangle intersectRectangle
)
public function GetRectangleIntersections(
    intersectRectangle : Rectangle
) : StrokeIntersection[]

Parametri

Valore restituito

Tipo: array<Microsoft.Ink.StrokeIntersection[]
Restituisce una matrice di strutture StrokeIntersection che indicano il punto in cui un oggetto Stroke interseca il parametro intersectRectangle.

Note

Questo metodo restituisce zero o più insiemi di indici che rappresentano l'inizio e la fine dei segmenti del tratto che intersecano il rettangolo. Se un tratto passa in modo diritto all'interno di un rettangolo, intersecando il limite in due posti, l'insieme di indici è costituito dai valori di indice a virgola mobile per ogni intersezione. Se un tratto interseca un rettangolo più di due volte, il numero di indici viene aumentato in base al numero di intersezioni.

Se il tratto inizia all'interno del rettangolo di prova, la proprietà BeginIndex del primo elemento StrokeIntersection viene impostata su -1. Se il tratto termina all'interno del rettangolo di prova, la proprietà EndIndex dell'ultimo elemento StrokeIntersection viene impostata su -1. Se il tratto è contenuto completamente all'interno del rettangolo, la matrice restituita disporrà di una sola struttura StrokeIntersection con le proprietà BeginIndex e EndIndex impostate su -1. Se il tratto si trova completamente all'esterno del rettangolo di prova, viene restituita una matrice StrokeIntersection vuota.

Ad esempio, se un tratto inizia all'interno del rettangolo di prova, esce dai limiti del rettangolo, ne ritorna all'interno e poi ne esce di nuovo, il metodo GetRectangleIntersections potrebbe restituire {{-1, 1,4}, {5,5, 10,1}} per descrivere i due segmenti del tratto che rientrano nel rettangolo.

Le strutture StrokeIntersection restituite da questo metodo contengono valori di indice a virgola mobile abbinati che indicano le posizioni in cui si verificano le intersezioni. Un indice a virgola mobile è un valore float che rappresenta una posizione tra due punti nell'oggetto Stroke. Ad esempio, se 0,0 è il primo punto nel tratto e 1,0 è il secondo punto nel tratto, 0,5 si trova in posizione intermedia tra il primo e il secondo punto. Allo stesso modo, un valore di indice a virgola mobile di 37,25 rappresenta una posizione che si trova al 25 percento sulla riga tra i punti 37 e 38 del tratto.

Esempi

In questo esempio, vengono eliminati tutti i segmenti di un oggetto Stroke passato che si trovano nella struttura Rectangle specificata. A tale scopo vengono esaminate le strutture StrokeIntersection per determinare in quali punti suddividere l'oggetto Stroke passato e quali segmenti eliminare.

Private Sub DeleteInsideRectangle(ByVal S As Stroke, ByVal R As Rectangle)
    ' get the StrokeIntersection array
    Dim SI() As StrokeIntersection = S.GetRectangleIntersections(R)
    ' examine each StrokeIntersection
    ' must work backwards through the array so that when splitting, 
    ' the remaining intersections are still valid for S
    For k As Integer = SI.Length - 1 To 0 Step -1

        Dim enterRect As Single = SI(k).BeginIndex
        Dim exitRect As Single = SI(k).EndIndex

        ' check if the whole stroke is inside the rectangle
        ' if so, delete the stroke
        If enterRect = -1 And exitRect = -1 Then
            S.Ink.DeleteStroke(S)
            Continue For
        End If

        ' check if a segment enters and exits the rectangle
        ' if so, split and delete the segment inside the rectangle
        If enterRect > 0 And exitRect > 0 Then
            ' the stroke resulting from split() is outside, keep it
            S.Split(exitRect)
            ' the stroke from this split() is inside, delete it
            Dim temp As Stroke = S.Split(enterRect)
            temp.Ink.DeleteStroke(temp)
            Continue For
        End If

        ' check if stroke starts inside the rectangle and goes outside
        ' if so, split and delete the segment inside the rectangle
        If enterRect = -1 And exitRect > 0 Then
            ' the stroke resulting from split() is outside, keep it
            S.Split(exitRect)
            ' delete the remaining segment of the stroke
            S.Ink.DeleteStroke(S)
            Continue For
        End If

        ' check if stroke starts outside the rectangle and ends inside
        ' if so, split and delete the segment inside the rectangle
        If enterRect > 0 And exitRect = -1 Then
            Dim temp2 As Stroke = S.Split(enterRect)
            temp2.Ink.DeleteStroke(temp2)
        End If
    Next
End Sub
private void DeleteInsideRectangle(Stroke S, Rectangle R)
{
    // get the StrokeIntersection array
    StrokeIntersection[] SI = S.GetRectangleIntersections(R);

    // examine each StrokeIntersection
    // must work backwards through the array so that when splitting, 
    // the remaining intersections are still valid for S
    for (int k = SI.Length - 1; k >= 0; k--)
    {
        float enterRect = SI[k].BeginIndex;
        float exitRect = SI[k].EndIndex;

        // check if the whole stroke is inside the rectangle
        // if so, delete the stroke
        if (enterRect == -1 && exitRect == -1)
        {
            S.Ink.DeleteStroke(S);
            continue;
        }

        // check if a segment enters and exits the rectangle
        // if so, split and delete the segment inside the rectangle
        if (enterRect > 0 && exitRect > 0)
        {
            // the stroke resulting from split() is outside, keep it
            S.Split(exitRect);
            // the stroke from this split() is inside, delete it
            Stroke temp = S.Split(enterRect);
            temp.Ink.DeleteStroke(temp);
            continue;
        }

        // check if stroke starts inside the rectangle and goes outside
        // if so, split and delete the segment inside the rectangle
        if (enterRect == -1 && exitRect > 0)
        {
            // the stroke resulting from split() is outside, keep it
            S.Split(exitRect);
            // delete the remaining segment of the stroke
            S.Ink.DeleteStroke(S);
            continue;
        }

        // check if stroke starts outside the rectangle and ends inside
        // if so, split and delete the segment inside the rectangle
        if (enterRect > 0 && exitRect == -1)
        {
            Stroke temp2 = S.Split(enterRect);
            temp2.Ink.DeleteStroke(temp2);
        }
    }
}

Piattaforme

Windows Vista

.NET Framework e .NET Compact Framework non supportano tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema di .NET Framework.

Informazioni sulla versione

.NET Framework

Supportato in: 3.0

Vedere anche

Riferimenti

Stroke Classe

Membri Stroke

Spazio dei nomi Microsoft.Ink

Stroke.FindIntersections

StrokeIntersection