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 对象的自交点。
备注
自交点是笔画 与自身的交点。
浮点索引是一个浮点值,表示笔画中两点之间的某个位置。例如,如果 0.0 是笔画中的第一个点,而 1.0 是笔画中的第二个点,则 0.5 位于第一个点和第二个点的正中间。与之类似,浮点索引值 37.25 表示位于笔画点 37 和 38 之间连线的 25% 的位置。
备注
对于每个交点和线段组合,都会返回一个浮点索引。如果笔画有一个交点,则 SelfIntersections 属性将返回两个自交点,每个自交点都是该交点的一部分,分别对应一个线段。
示例
此 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