VB 画lg坐标系,两个纵轴

dou1746 2018-01-02 03:03:27
有大神 做过lg坐标系的吗?
纵坐标是lg
做出来的效果个excel的lg一样
...全文
530 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-01-04
  • 打赏
  • 举报
回复
自绘是早晚要学会的技能。
脆皮大雪糕 2018-01-03
  • 打赏
  • 举报
回复
闲着,写个例子吧,新建工程,窗体拉大点,放一个picturebox,一个按钮,然后黏贴下面的代码



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




脆皮大雪糕 2018-01-02
  • 打赏
  • 举报
回复
无非就是数值经过Log计算以后再映射到Y坐标上咯

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧