7,763
社区成员
发帖
与我相关
我的任务
分享
Dim X0 As Long, Y0 As Long '坐标原点在picture中的坐标
Dim lngBorder As Long '图像相对于picture边框留空距离
Dim XMAX As Double, YMAX As Double '坐标上 XY所能表示的最大值,这里默认最小值为0,懒得倒腾负数了,有需要自己改
Private Sub Command1_Click()
Picture1.Width = 6000
Picture1.Height = 6000
Picture1.ScaleHeight = Picture1.Height
Picture1.ScaleWidth = Picture1.Width
Dim test(1 To 10) As Double
Dim i As Integer
For i = 1 To 10
test(i) = Exp(i + (Rnd() - 0.5) * i * 0.3) 'f(i) = exp(i) 在ln坐标系下应该是一条直线,加一点随机干扰让线条不要太直
Next
Render test
End Sub
Private Sub Render(data() As Double)
XMAX = 10: YMAX = 37000 'Y最大值根据用例,最大可能值是 exp(10.5) = 36315 我们取 37000
lngBorder = 400
X0 = lngBorder: Y0 = Picture1.ScaleHeight - lngBorder '坐标原点定义
Picture1.Cls
'画坐标系
Picture1.DrawWidth = 1
Dim i As Long, j As Long
Picture1.Line (X0 - lngBorder / 2, Y0)-(Picture1.ScaleWidth - lngBorder / 2, Y0), vbBlue
Picture1.Line (X0, Y0 + lngBorder / 2)-(X0, lngBorder / 2), vbBlue
For j = 0 To 4
For i = 10 ^ j To 10 ^ (j + 1) Step 10 ^ j
Picture1.Line (X0, TRANY(i))-(Picture1.ScaleWidth - lngBorder / 2, TRANY(i)), RGB(200, 200, 255)
Next
Picture1.CurrentX = 0: Picture1.CurrentY = TRANY(i - 1) - 100: Picture1.Print Trim(Str(i - 10 ^ j))
Next
'画曲线
Picture1.CurrentX = X0 + LBound(data) / XMAX * (Picture1.ScaleWidth - lngBorder * 2)
Picture1.CurrentY = TRANY(data(LBound(data)))
Picture1.DrawWidth = 2
For i = LBound(data) To UBound(data)
Picture1.Line -(X0 + i / XMAX * (Picture1.ScaleWidth - lngBorder * 2), TRANY(data(i))), RGB(255, 0, 0)
Next
'标注数值
For i = LBound(data) To UBound(data)
Picture1.CurrentX = X0 + i / XMAX * (Picture1.ScaleWidth - lngBorder * 2)
Picture1.CurrentY = TRANY(data(i)) + 100
Picture1.Print Round(data(i), 2)
Next
End Sub
Private Function TRANY(ByVal dblIn As Double) As Double
TRANY = Y0 - (Log(dblIn) / Log(YMAX)) * (Picture1.ScaleHeight - lngBorder * 2)
End Function