一 个 办 法 是 利 用 API函 数 PolyBezier绘 制 Bezier曲 线 , 下 面 就 是 一 个 例 子 : Private Type POINTL x As Long y As Long End Type Private Declare Function PolyBezier Lib "gdi32" (ByVal hdc As Long, lppt As POINTL, ByVal cPoints As Long) As Long Private Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private apt(0 To 3) As POINTL Private Declare Function MoveTo Lib "gdi32" Alias "MoveToEx" ( _ ByVal hdc As Long, ByVal x As Long, ByVal y As Long, _ Optional lpPoint As Any = 0) As Long Sub InitBezier(cxClient As Long, cyClient As Long) apt(0).x = ScaleX(cxClient / 2, vbTwips, vbPixels) apt(0).y = ScaleY(cyClient / 10, vbTwips, vbPixels) apt(1).x = ScaleX(cxClient / 4, vbTwips, vbPixels) apt(1).y = ScaleY(cyClient / 2, vbTwips, vbPixels) apt(2).x = ScaleX(3 * cxClient / 4, vbTwips, vbPixels) apt(2).y = ScaleY(cyClient / 2, vbTwips, vbPixels) apt(3).x = ScaleX(cxClient / 2, vbTwips, vbPixels) apt(3).y = ScaleY(9 * cyClient / 10, vbTwips, vbPixels) ForeColor = vbRed End Sub
Sub DrawBezier() DrawStyle = vbSolid PolyBezier hdc, apt(0), 4 DrawStyle = vbDot MoveTo hdc, apt(0).x, apt(0).y LineTo hdc, apt(1).x, apt(1).y MoveTo hdc, apt(2).x, apt(2).y LineTo hdc, apt(3).x, apt(3).y End Sub
Private Type POINTL
x As Long
y As Long
End Type
Private Declare Function PolyBezier Lib "gdi32" (ByVal hdc As Long, lppt As POINTL, ByVal cPoints As Long) As Long
Private Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private apt(0 To 3) As POINTL
Private Declare Function MoveTo Lib "gdi32" Alias "MoveToEx" ( _
ByVal hdc As Long, ByVal x As Long, ByVal y As Long, _
Optional lpPoint As Any = 0) As Long
Sub InitBezier(cxClient As Long, cyClient As Long)
apt(0).x = ScaleX(cxClient / 2, vbTwips, vbPixels)
apt(0).y = ScaleY(cyClient / 10, vbTwips, vbPixels)
apt(1).x = ScaleX(cxClient / 4, vbTwips, vbPixels)
apt(1).y = ScaleY(cyClient / 2, vbTwips, vbPixels)
apt(2).x = ScaleX(3 * cxClient / 4, vbTwips, vbPixels)
apt(2).y = ScaleY(cyClient / 2, vbTwips, vbPixels)
apt(3).x = ScaleX(cxClient / 2, vbTwips, vbPixels)
apt(3).y = ScaleY(9 * cyClient / 10, vbTwips, vbPixels)
ForeColor = vbRed
End Sub
Sub DrawBezier()
DrawStyle = vbSolid
PolyBezier hdc, apt(0), 4
DrawStyle = vbDot
MoveTo hdc, apt(0).x, apt(0).y
LineTo hdc, apt(1).x, apt(1).y
MoveTo hdc, apt(2).x, apt(2).y
LineTo hdc, apt(3).x, apt(3).y
End Sub
Private Sub Form_Click()
InitBezier ScaleWidth, ScaleHeight
DrawBezier
End Sub
不 过 , 从 这 个 例 子 你 可 以 看 出 , Bezier曲 线 并 不 通 过 事 先 指 定 的 所 有 点 。 而 我 们 有 时 希 望 圆 滑 曲 线 通 过 所 有 采 样 点 。 这 时 你 应 该 采 用 插 值 的 办 法 来 绘 制 圆 滑 曲 线 。 一 般 在 工 科 的 数 学 书 或 计 算 机 算 法 书 上 都 可 以 找 到 插 值 的 公 式 , 并 根 据 你 的 实 际 情 况 选 择 适 当 的 插 值 方 法 。
能否 对以上问题 做出 很详细的回答。。 。
上面4个问题。。 每个25分。。 谢谢各位 帮忙!