次の方法で共有


Stroke.BezierPoints プロパティ

ストロークのベジエ概算値を表す制御点の配列を取得します。

名前空間 :  Microsoft.Ink
アセンブリ :  Microsoft.Ink (Microsoft.Ink.dll 内)

構文

'宣言
Public ReadOnly Property BezierPoints As Point()
'使用
Dim instance As Stroke
Dim value As Point()

value = instance.BezierPoints
public Point[] BezierPoints { get; }
public:
property array<Point>^ BezierPoints {
    array<Point>^ get ();
}
/** @property */
public Point[] get_BezierPoints()
public function get BezierPoints () : Point[]

プロパティ値

型 : array<System.Drawing.Point[]
ストロークのベジエ概算値を表す制御点の配列。

解説

BezierPoints プロパティが返す制御点は、元のストロークの滑らかな概算値を示しており、必ずしもストローク上に存在するわけではありません。

この 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

参照

参照

Stroke クラス

Stroke メンバ

Microsoft.Ink 名前空間

Stroke