ベジェ曲線の描画(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