PolyBezier ベジエ曲線の描画

VBの宣言:

Declare Function PolyBezier Lib "gdi32" ( _
    ByVal hDC As Long, _
    ByRef Points As POINT, _
    ByVal PointNum As Long) As Long

説明:

Pointsで指定された座標群を元にベジエ曲線群を描画する。

Pointsで指定した配列中の一番目の座標が一番目のベジエ曲線の始点となる。二番目、三番目の座標が一番目のベジエ曲線の制御点となる。四番目の座標は、一番目のベジエ曲線の終点となると共に二番目のベジエ曲線の始点となる。以下同様に、3n+1番目の座標はn番目のベジエ曲線の終点となると共にn+1番目のベジエ曲線の始点となり、3n+2番目および3n+3番目の座標がn+1番目のベジエ曲線の制御点となる。

現在位置は更新されない。

引数の意味は以下の通り。
hDC 描画先のデバイスコンテキストのハンドル。
Points ベジエ曲線群を描画する元の情報となる座標の配列。
PointNum Pointsで指定した配列の要素の数。n個のベジエ曲線を描画する場合、3n+1でなければならない。

戻り値は、関数の実行に成功したか否かを表す真偽値である。

VBのサンプル:

連続する複数のベジエ曲線群を、アニメーションさせながらランダムに描画する。
Private Sub Command1_Click()
    Const Speed As Single = 1
    Const PointNum As Long = 31 '3の倍数+1
    
    Dim Points(PointNum - 1) As POINT
    Dim X(PointNum - 1) As Single
    Dim Y(PointNum - 1) As Single
    Dim DX(PointNum - 1) As Single
    Dim DY(PointNum - 1) As Single
    Dim I As Long
    Dim J As Long
    
    For I = 0 To PointNum - 1
        X(I) = Rnd * 200
        Y(I) = Rnd * 200
        DX(I) = Rnd * Speed - Speed / 2
        DY(I) = Rnd * Speed - Speed / 2
    Next
    
    Picture1.AutoRedraw = True
    
    For J = 0 To 3000
        For I = 0 To PointNum - 1
            If X(I) + DX(I) < 0 Or X(I) + DX(I) > 200 Then DX(I) = -DX(I)
            If Y(I) + DY(I) < 0 Or Y(I) + DY(I) > 200 Then DY(I) = -DY(I)
            X(I) = X(I) + DX(I)
            Y(I) = Y(I) + DY(I)
            Points(I).X = X(I)
            Points(I).Y = Y(I)
        Next
    
'よりなめらかな曲線を書くには、以下のコメントを外す
'        For I = 3 To PointNum - 2 Step 3
'            Points(I).X = (X(I - 1) + X(I + 1)) / 2
'            Points(I).Y = (Y(I - 1) + Y(I + 1)) / 2
'        Next
        
        Picture1.Cls
        PolyBezier Picture1.hDC, Points(0), PointNum
    
        DoEvents
    Next
End Sub

(original text:1999/02/23 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。