Stroke.SelfIntersections プロパティ
Stroke オブジェクトの自己交差を取得します。
名前空間 : Microsoft.Ink
アセンブリ : Microsoft.Ink (Microsoft.Ink.dll 内)
構文
'宣言
Public ReadOnly Property SelfIntersections As Single()
'使用
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[]
プロパティ値
型 : array<System.Single[]
Stroke オブジェクトの自己交差を表す浮動小数点インデックス値の配列。
解説
自己交差は、ストロークが自分自身と交差するポイントです。
浮動小数点インデックスは、ストローク内の 2 つのポイントの間のある場所を表す浮動小数点値です。たとえば、0.0 がストローク内の最初のポイントで、1.0 がストローク内の 2 番目のポイントの場合、0.5 が最初のポイントと 2 番目のポイントの間の中間です。同様に、浮動小数点インデックス値 37.25 は、ストロークのポイント 37 と 38 の間の線に沿って 25 パーセント進んだ位置を表しています。
メモ : |
---|
交差部分と線分の組み合わせごとに、浮動小数点インデックスが返されます。ストロークに交差部分が 1 つある場合、SelfIntersections プロパティは 2 つの自己交差 (交差部分の一部である線分ごとに 1 つずつ) を返します。 |
例
この C# の例では、各 Stroke オブジェクトを使用して記録された数種類の情報を示します。呼び出し元のプログラムでは、各ストロークのポイント、ポリライン尖点、ベジエ ポイント、ベジエ尖点、および自己交差の表示を切り替えるメニュー項目が使用されます。Renderer オブジェクトの InkSpaceToPixel メソッドは、表示するポイントの変換に使用されます。LocatePoint メソッドは、自己交差の位置の補間に使用されます。
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);
}
この Microsoft Visual Basic .NET の例では、各 Stroke オブジェクトを使用して記録された数種類の情報を示します。呼び出し元のプログラムでは、各ストロークのポイント、ポリライン尖点、ベジエ ポイント、ベジエ尖点、および自己交差の表示を切り替えるメニュー項目が使用されます。Renderer オブジェクトの InkSpaceToPixel メソッドは、表示するポイントの変換に使用されます。LocatePoint メソッドは、自己交差の位置の補間に使用されます。
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
プラットフォーム
Windows Vista
.NET Framework および .NET Compact Framework では、各プラットフォームのすべてのバージョンはサポートしていません。サポートされているバージョンについては、「.NET Framework システム要件」を参照してください。
バージョン情報
.NET Framework
サポート対象 : 3.0