针的起点坐标为中心(200,120),假设针的长度为lineLength,针的旋转角度为angle,则由三角函数可以求出针的末端坐标(xEnd,yEnd)。完整代码参看。
Sub 游戏执行过程(hWndForm As hWnd)
Dim gg As yGDI = hWndForm
Dim pi As Single = 3.1415926 / 180
Dim lineLength As Long = 100 ' 针的长度
Dim As Long xEnd, yEnd ' 针的末端坐标(针起始位置为圆心)
Dim As Long angle = 300 '针的旋转角度
xEnd = 200 + lineLength *Cos(angle * pi) '计算针的末端坐标
yEnd = 120 + lineLength *Sin(angle * pi)
gg.Pen 3, BGR(0, 0, 0) '线宽为3,这样针看起来更明显
gg.Brush '不填充色彩
gg.DrawLine 200, 120, xEnd, yEnd
gg.Pen 2, BGR(255, 0, 0) '设置圆盘线条颜色为红色
gg.DrawEllipse 160, 80, 80, 80
End Sub
正弦函数sin()、余弦函数cos(),它的参数是弧度,并不是角度,因此 需要 Dim pi As Single = 3.1415926 / 180 来把角度转换成弧度。
程序运行后输出效果如图5-3所示。

进一步,假设针的旋转速度为rotateSpeed,在DO循环中让针的角度逐渐增加(angle = angle + rotateSpeed),即实现了针的旋转动画效果。完整代码参看
Sub 游戏执行过程(hWndForm As hWnd)
Dim gg As yGDI = hWndForm
Dim pi As Single = 3.1415926 / 180
Dim lineLength As Long = 100 ' 针的长度
Dim As Long xEnd, yEnd ' 针的末端坐标(针起始位置为圆心)
Dim As Long angle = 300 '针的旋转角度
gg.Brush '不填充色彩
Dim rotateSpeed As Long = 2
Do
gg.Cls
angle = angle + rotateSpeed '角度增加
xEnd = 200 + lineLength *Cos(angle * pi) '计算针的末端坐标
yEnd = 120 + lineLength *Sin(angle * pi)
gg.Pen 3, BGR(0, 0, 0) '线宽为3,这样针看起来更明显
gg.DrawLine 200, 120, xEnd, yEnd
gg.Pen 2, BGR(255, 0, 0) '设置圆盘线条颜色为红色
gg.DrawEllipse 160, 80, 80, 80
gg.Redraw
Sleep 10
Loop
End Sub
程序运行后,指针不停的转动
还有一个不容易发现的BUG,FB语言中的整数、浮点数均有值域,为了防止角度变量angle无限增大,设定当angle>360时,应当执行angle = 0。
Do
gg.Cls
angle = angle + rotateSpeed '角度增加
If angle > 360 Then angle = 0
xEnd = 200 + lineLength *Cos(angle * pi) '计算针的末端坐标
练习题5-1:编程绘制图5-5所示的sin(x)函数曲线。

评论一下?