投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/4/3 16:41:06
> 〇は〇で表示されずに栗みたいなとっかりぼうやみたいになりました。
「とっかりぼうや」が何のことか、検索してもわからなかったのですが、
とにかく、円をうまく描けなかったということで理解しました。

座標点をより細かくプロットしてみては如何でしょうか。

元々、フリーハンドで描かれる前提なので、
ペンやスタイラス(あるいは指やマウス)をよほど高速に動かさない限り、
一つ一つの座標は、近しい位置にプロットされると思います。


> besier曲線とかいうものでしょうか?
下記のページで、イメージが掴めるかも知れません。
https://mizucoffee.github.io/nth-order-bezier-curves-canvas/index.html
https://nixeneko.hatenablog.com/entry/2015/06/26/075022


> 手で入力したストロークをデータに取り出せたら、理解ができるかもしれませんが、
> やりかたがわかりません。御教授願えますでしょうか?

ジェスチャーのストロークなら、Gesture イベントの Strokes 引数を使います。
インクからなら、InkPicture1.Ink.Strokes です。
これらを For Each で列挙すれば、個々のストロークが得られますので、
そのストロークが保持している座標群を、GetPoints メソッドで取り出します。
(GetFlattenedBezierPoints なんてのもあります。


Option Explicit
Option Base 0
Private Sub CommandButton1_Click()
    'ジェスチャーモードの場合、インクが時間経過で消えてしまい、 
    '解析中に元のインクが Deleted になることがあります。 
    'それを避けるため、列挙前にあらかじめ元のインクを複製しておきます。 
    Dim Ink As InkDisp
    Set Ink = InkPicture1.Ink.Clone()

    'インクデータ内のストロークを解析して Sheet1 に表示します。 
    Sheet1.Cells.Clear
    Dim st As IInkStrokeDisp
    Dim points() As Long, matrix() As Long
    Dim x As Integer, y As Integer
    x = 1
    For Each st In Ink.Strokes
        'GetPoints メソッドは、プロットされた座標群のうち、 
        'Index 番目か始まる Count 組までの座標を 
        'X1,Y1,X2,Y2,…形式な Long 型の一次元配列で返します。 
        
        '引数 Count:=3 を指定すれば 3 組となり、 
        'points(0)~points(5) の 6 つの値が返されます。 
        
        '引数を省略した場合(Index:=ISC_FirstElement, Count:=AllElements)は、 
        '全ての座標が返されます。 
        
        points = st.GetPoints()
        
        '確認のため、取得した座標を Sheet1 に表示させてみます。 
        matrix = GetMatrixFromPoints(points)
        y = UBound(matrix, 1) + 1
        Sheet1.Cells(1, x + 0).Value = "#" & CStr(st.id) & "のX値"
        Sheet1.Cells(1, x + 1).Value = "#" & CStr(st.id) & "のY値"
        Sheet1.Range(Sheet1.Cells(2, x + 0), Sheet1.Cells(y + 1, x + 1)).Value = matrix
        x = x + 3
    Next
End Sub

'X, Y 座標が順に並んだ一次元配列を、2 次元配列に変換します 
Private Function GetMatrixFromPoints(ByRef p() As LongAs Long()
    Dim matrix() As Long
    Dim l As Long, u As Long
    u = UBound(p, 1)
    ReDim matrix(u \ 2, 2) As Long
    For l = 0 To u Step 2
        matrix(l \ 2, 0) = p(l + 0)
        matrix(l \ 2, 1) = p(l + 1)
    Next
    GetMatrixFromPoints = matrix
End Function