ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: micch

[分享] 偶尔兴致来了,练习一些图表,记录一下

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2024-6-30 18:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
micch 发表于 2024-6-30 17:29
费劲算了半天没算对,(0,0)出发,右上15度,第三次在左侧边反弹,反弹后的方向是指向右下角。

不知 ...
  1. Dim x!(1 To 3), y!(1 To 3), deg, rad!, tg!, res(), rig As Boolean, _
  2. down As Boolean, tp, bt, lf, rg, fx, fy
  3. Const maxx = 20, maxy = 10

  4. Sub Main()
  5. ReDim tp(1 To 4), bt(1 To 4), lf(1 To 4), rg(1 To 4), res(1 To 2)
  6. Dim i%, keep(1 To 2), s As Series, co As Shape, ns%
  7. tp(1) = 0: tp(2) = maxy: tp(3) = maxx: tp(4) = maxy     ' 上边线
  8. bt(1) = 0: bt(2) = 0: bt(3) = maxx: bt(4) = 0           ' 下边线
  9. lf(1) = 0: lf(2) = 0: lf(3) = 0: lf(4) = maxy           ' 左边线
  10. rg(1) = maxx: rg(2) = 0: rg(3) = maxx: rg(4) = maxy     ' 右边线
  11. rig = True
  12. ns = 23
  13. ReDim fx(1 To ns), fy(1 To ns)
  14. down = False
  15. x(1) = 1: y(1) = 3             ' 起始点
  16. res(1) = x(1): res(2) = y(1)
  17. x(2) = x(1) + maxx
  18. y(2) = y(1): x(3) = x(2)
  19. deg = 80                        ' 度数
  20. rad = deg * 3.14159 / 180       ' 弧度
  21. tg = Tan(rad)
  22. y(3) = tg * (x(2) - x(1)) + y(2)
  23. fx(1) = x(1): fy(1) = y(1)
  24. For i = 2 To ns                 ' 步数
  25.    If rig And down Then
  26.      keep(1) = res(1): keep(2) = res(2)
  27.      Walk rg, False, False
  28.      If res(1) = 0 And res(2) = 0 Then
  29.        res(1) = keep(1): res(2) = keep(2)
  30.        Walk bt, False, False
  31.        down = Not down
  32.      Else
  33.        rig = Not rig
  34.      End If
  35.    ElseIf rig And Not down Then            ' 向右上
  36.      keep(1) = res(1): keep(2) = res(2)
  37.      Walk tp, False, True
  38.      If res(1) = 0 And res(2) = 0 Then
  39.        res(1) = keep(1): res(2) = keep(2)
  40.        Walk rg, False, True
  41.        rig = Not rig
  42.      Else
  43.        down = Not down
  44.      End If
  45.    ElseIf Not rig And down Then            ' 左下
  46.      keep(1) = res(1): keep(2) = res(2)
  47.      Walk bt, True, False
  48.      If res(1) = 0 And res(2) = 0 Then   ' 没有有效的交叉
  49.        res(1) = keep(1): res(2) = keep(2)
  50.        Walk lf, True, False
  51.        rig = Not rig
  52.      Else
  53.        down = Not down
  54.      End If
  55.    ElseIf Not rig And Not down Then        ' 左上
  56.      keep(1) = res(1): keep(2) = res(2)
  57.      Walk lf, True, True
  58.      If res(1) = 0 And res(2) = 0 Then
  59.        res(1) = keep(1): res(2) = keep(2)
  60.        Walk tp, True, True
  61.        down = Not down
  62.      Else
  63.        rig = Not rig
  64.      End If
  65.    End If
  66.    fx(i) = res(1): fy(i) = res(2)
  67. Next
  68. Set co = ActiveSheet.Shapes.AddChart2(240, xlXYScatterLines)
  69. Set s = co.Chart.SeriesCollection.NewSeries
  70. s.Values = fy
  71. s.XValues = fx
  72. With co.Chart
  73.    .ChartTitle.Text = "Start is " & fx(1) & "," & fy(1) & " - " & _
  74.    WorksheetFunction.Unichar(952) & "=" & deg
  75.    If .SeriesCollection.Count > 1 Then
  76.      .SeriesCollection(1).Delete
  77.      .Axes(xlValue).MaximumScale = maxy
  78.      .Axes(xlCategory).MaximumScale = maxx
  79.      .Axes(xlCategory).MinimumScale = 0
  80.      .Axes(xlValue).MinimumScale = 0
  81.     End If
  82. End With
  83. End Sub

  84. Sub Walk(con, left As Boolean, up As Boolean)
  85. Dim hor
  86. If left Then hor = -maxx
  87. If Not left Then hor = maxx
  88. x(1) = res(1): y(1) = res(2)
  89. x(2) = x(1) + hor
  90. y(2) = y(1): x(3) = x(2)
  91. y(3) = tg * (x(2) - x(1)) + y(2)                    ' 是三角形
  92. If Not up And Not left Then y(3) = 2 * y(1) - y(3)  ' 正确象限
  93. If up And left Then y(3) = 2 * y(1) - y(3)
  94. res = inter(x(1), y(1), x(3), y(3), con)
  95. End Sub

  96. Function inter(x1!, y1!, x2!, y2!, con) ' 两线之间的交叉
  97. Dim tp, den, ua!, ub!, x3!, y3!, x4!, y4!
  98. x3 = con(1): y3 = con(2): x4 = con(3): y4 = con(4)
  99. ReDim tp(1 To 2)
  100. If ((x1 = x2 And y1 = y2) Or (x3 = x4 And y3 = y4)) Then
  101.    tp(1) = 0
  102.    tp(2) = 0
  103.    inter = tp
  104.    Exit Function
  105. End If
  106. den = ((y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1))
  107. If den = 0 Then
  108.    tp(1) = 0
  109.    tp(2) = 0
  110.    inter = tp
  111.    Exit Function
  112. End If
  113. ua = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / den
  114. ub = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / den
  115. If ua < 0 Or ua > 1 Or ub < 0 Or ub > 1 Then
  116.    tp(1) = 0
  117.    tp(2) = 0
  118.    inter = tp
  119.    Exit Function
  120. End If
  121. tp(1) = x1 + ua * (x2 - x1)
  122. tp(2) = y1 + ua * (y2 - y1)
  123. inter = tp
  124. End Function

复制代码

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-6-30 18:17 | 显示全部楼层
micch 发表于 2024-6-30 17:29
费劲算了半天没算对,(0,0)出发,右上15度,第三次在左侧边反弹,反弹后的方向是指向右下角。

不知 ...

https://mp.weixin.qq.com/s/E-eOoCGHn8rK1uvBs-P8hg

反正我是没看明白

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-30 18:23 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-30 20:07 | 显示全部楼层
木槿花西月锦绣 发表于 2024-6-30 18:17
https://mp.weixin.qq.com/s/E-eOoCGHn8rK1uvBs-P8hg

反正我是没看明白

代码没看明白,不过,我计算逻辑中有个正负号写反了,改了后能对上了

image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-30 20:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
挺好玩,84次反弹后,回到(0,0)点
image.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-6-30 21:42 | 显示全部楼层
micch 发表于 2024-6-30 20:15
挺好玩,84次反弹后,回到(0,0)点

你们玩儿你们的,我就看看

TA的精华主题

TA的得分主题

发表于 2024-6-30 21:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
micch 发表于 2024-6-30 20:15
挺好玩,84次反弹后,回到(0,0)点

给你点赞!可以做个弹球游戏!

TA的精华主题

TA的得分主题

发表于 2024-7-1 11:22 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-7-1 18:06 | 显示全部楼层

个人认为,如果进入点恰好是四个角的顶点。例如(0,0)应该按原路返回(弹回)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-7-3 14:58 , Processed in 0.039093 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表