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
- intersectRectangle
Typ: System.Drawing.Rectangle
Die Rectangle-Struktur in Freihandbereichkoordinaten, die den Trefferüberprüfungsbereich beschreibt.
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