ベジェ曲線の描画(T)         <TOP>


ベジェ曲線を描画します。例ではハートを描画しています。

PolyBezier ベジェ曲線を描画

 

ベジェ曲線は黒で描画されています。

ベジェ曲線を描くには4つの点(順にA、B、C、D)を指定し、その結果Eが描画されます。

ベジェ曲線は点A、点Dをそれぞれ始点、終点とし、この2点を必ず通り、線分AB、線分CDはベジェ曲線の接線となります。また、ベジェ曲線は四角形ABCDの内部に必ず収まります。

 

 

'================================================================
'= ベジェ曲線の描画
'=    (PolyBezier.bas)
'================================================================
#include "Windows.bi"

Type POINTAPI
    x As Long
    y As Long
End Type

' ベジェ曲線を描画
Declare Function Api_PolyBezier& Lib "gdi32" Alias "PolyBezier" (ByVal hDC&, lppt As POINTAPI, ByVal cPoints&)

' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得
Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&)

' デバイスコンテキストを解放
Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&)

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var pts(3) As POINTAPI
    Var hDC As Long
    Var Ret As Long

    For x = 0 To GetWidth Step 10
        Line(x, 0) - (x, GetHeight), , 14
    Next
    For y = 0 To GetHeight Step 10
        Line(0, y) - (GetWidth, y), , 14
    Next

    hDC = Api_GetDC(GethWnd)

    pts(0).x = 120 : pts(0).y = 90
    pts(1).x = 160 : pts(1).y = 10
    pts(2).x = 230 : pts(2).y = 50
    pts(3).x = 220 : pts(3).y = 130
    GoSub *DrawBezier

    pts(0).x = 120 : pts(0).y = 90
    pts(1).x = 80 : pts(1).y = 10
    pts(2).x = 10 : pts(2).y = 50
    pts(3).x = 20 : pts(3).y = 130
    GoSub *DrawBezier

    pts(0).x = 220 : pts(0).y = 130
    pts(1).x = 220 : pts(1).y = 190
    pts(2).x = 160 : pts(2).y = 150
    pts(3).x = 120 : pts(3).y = 250
    GoSub *DrawBezier

    pts(0).x = 20 : pts(0).y = 130
    pts(1).x = 20 : pts(1).y = 190
    pts(2).x = 80 : pts(2).y = 150
    pts(3).x = 120 : pts(3).y = 250
    GoSub *DrawBezier

    Ret = Api_ReleaseDC(GethWnd, hDC)
    Exit Sub

    *DrawBezier
    Ret = Api_PolyBezier(hDC, pts(0), 4)
    Line(pts(0).x, pts(0).y) - (pts(1).x, pts(1).y), , 5
    Line(pts(2).x, pts(2).y) - (pts(3).x, pts(3).y), , 2

    SetDrawWidth 3

    For i = 0 To 3
        If i < 2 Then col = 5 else col = 2
        pset(pts(i).x, pts(i).y),col
    Next

    SetDrawWidth 0
    Return
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End