Freigeben über


Stroke.GetRectangleIntersections-Methode

Gibt ein Array von StrokeIntersection-Strukturen zurück, die angeben, wo ein Stroke-Objekt ein gegebenes Rechteck schneidet.

Namespace:  Microsoft.Ink
Assembly:  Microsoft.Ink (in Microsoft.Ink.dll)

Syntax

'Declaration
Public Function GetRectangleIntersections ( _
    intersectRectangle As Rectangle _
) As StrokeIntersection()
'Usage
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[]

Parameter

Rückgabewert

Typ: array<Microsoft.Ink.StrokeIntersection[]
Gibt ein Array von StrokeIntersection-Strukturen zurück, die angeben, wo ein Stroke-Objekt den intersectRectangle-Parameter schneidet.

Hinweise

Diese Methode gibt Null oder mehrere Sätze von Indizes zurück, die den Beginn und das Ende der Strichsegmente darstellen, die das Rechteck schneiden. Wenn ein Strich gerade durch ein Rechteck verläuft und dessen Umrisslinie an zwei Stellen schneidet, dann besteht der Satz an Indizes aus den Gleitkommaindexwerten der beiden Schnittpunkte. Schneidet ein Strich ein Rechteck mehr als zweimal, dann erhöht sich die Anzahl der Indizes um die Anzahl der Schnittpunkte.

Wenn der Strich innerhalb des Testrechtecks beginnt, dann wird die BeginIndex-Eigenschaft des ersten StrokeIntersection-Elements auf -1 festgelegt. Wenn der Strich innerhalb des Testrechtecks endet, dann wird die EndIndex-Eigenschaft des letzten StrokeIntersection-Elements auf -1 festgelegt. Befindet sich der gesamte Strich innerhalb des Rechtecks, dann enthält das zurückgegebene Array eine einzelne StrokeIntersection-Struktur, bei der sowohl die BeginIndex-Eigenschaft als auch die EndIndex-Eigenschaft auf -1 festgelegt sind. Liegt der Strich völlig außerhalb des Testrechtecks, dann wird ein leeres StrokeIntersection-Array zurückgegeben.

Wenn ein Stricht beispielsweise innerhalb des Testrechtecks beginnt, das Rechteck verlässt, wieder nach innen verläuft und erneut das Rechteck verlässt, dann gibt die GetRectangleIntersections-Methode möglicherweise das Ergebnis {{-1, 1.4}, {5.5, 10.1}} zurück, um die beiden Strichsegmente zu beschreiben, die sich innerhalb des Rechtecks befinden.

Die von dieser Methode zurückgegebenen StrokeIntersection-Strukturen enthalten Paare von Gleitkommaindexwerten, die die Positionen der Schnittpunkte angeben. Ein Gleitkommaindex ist ein Gleitkommawert, der eine beliebige Position zwischen zwei Punkten im Stroke-Objekt darstellt. Beispiele: Wenn 0,0 der erste Punkt im Strich und 1,0 der zweite Punkt im Strich ist, liegt 0,5 genau in der Mitte zwischen dem ersten und dem zweiten Punkt. Ebenso stellt ein Gleitkommaindexwert von 37,25 eine Position dar, die sich 25 Prozent entlang der Zeile zwischen den Punkten 37 und 38 des Strichs befindet.

Beispiele

In diesem Beispiel werden alle Segmente eines übergebenen Stroke-Objekts gelöscht, die sich in der angegebenen Rectangle-Struktur befinden. Dies geschieht, indem durch Überprüfen der StrokeIntersection-Strukturen bestimmt wird, wo das übergebene Stroke-Objekt geteilt werden soll und welche Segmente gelöscht werden sollen.

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

Plattformen

Windows Vista

.NET Framework und .NET Compact Framework unterstützen nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.

Versionsinformationen

.NET Framework

Unterstützt in: 3.0

Siehe auch

Referenz

Stroke-Klasse

Stroke-Member

Microsoft.Ink-Namespace

Stroke.FindIntersections

StrokeIntersection