ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 如何实现这样的小球分布?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-8-13 23:04 | 显示全部楼层 |阅读模式
本帖最后由 zhanglei1371 于 2019-8-14 10:38 编辑

如下图所示:
360截图20190813230100351.jpg

最好是能点击后弹出对话框,输入任意数字后能生成均匀环绕分布的效果,多谢各位了!输入数字6,生成6个蓝色球围绕红球分布,
输入数字8,生成8个球围绕红球分布;
图中默认是按数字7进行的;
小球分布问题求助.rar (38.78 KB, 下载次数: 10)



TA的精华主题

TA的得分主题

发表于 2019-8-14 10:20 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-8-14 11:05 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-8-14 11:09 | 显示全部楼层
出个编程小题目:n个人围成圈报数踢出最后剩下几号?
http://club.excelhome.net/thread-1306612-1-1.html
(出处: ExcelHome技术论坛)

24L、50L可参考

TA的精华主题

TA的得分主题

发表于 2019-8-14 11:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
yjh_27 发表于 2019-8-14 11:09
出个编程小题目:n个人围成圈报数踢出最后剩下几号?
http://club.excelhome.net/thread-1306612-1-1.html ...

我去,坛子里好多资源。。。。
关键是。。。你怎么找到的?最强大脑?

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-8-14 13:46 | 显示全部楼层
本帖最后由 zhanglei1371 于 2019-8-14 16:38 编辑

解了一上午方程,终于不完美的自己解决了。之所以不完美,因为会出现方向错乱的问题。不稳定。不过凑合有效果了。
  1. Sub 坐标计算并复制旋转图形()
  2. Dim sha0 As Shape, sha1 As Shape, sha2 As ShapeRange, sha3 As ShapeRange
  3. Dim arr(), brr(), crr()
  4.     形状个数 = InputBox("请输入最终环绕的图形个数:", "图形个数", 6)
  5.     ReDim arr(1 To 形状个数), brr(1 To 形状个数), crr(1 To 形状个数)
  6.     i = 1
  7.     While jd < 360 - 360 / 形状个数
  8.     arr(i) = 360 / 形状个数 + jd
  9.     i = i + 1
  10.     jd = arr(i - 1)
  11.     Wend
  12.     For i = 1 To 形状个数 - 1
  13.         jiaodu = arr(i)
  14.         Set sha0 = ActiveWindow.Selection.SlideRange(1).Shapes("Oval 42")
  15.         Set sha1 = ActiveWindow.Selection.SlideRange(1).Shapes("ABC")
  16.         sha0_l = sha0.Left: sha0_t = sha0.Top: sha0_w = sha0.Width: sha0_h = sha0.Height
  17.         sha1_l = sha1.Left: sha1_t = sha1.Top: sha1_w = sha1.Width: sha1_h = sha1.Height
  18.         x0 = sha0_l + sha0_w / 2: y0 = sha0_t + sha0_h / 2
  19.         x1 = sha1_l + sha1_w / 2: y1 = sha1_t + sha1_h / 2
  20.         x0 = x0 / 10
  21.         x1 = x1 / 10
  22.         y0 = y0 / 10
  23.         y1 = y1 / 10
  24.         a = 2 * (x1 - x0)
  25.         B = 2 * (y1 - y0)
  26.         If B = 0 Then B = 0.0001
  27.         If a = 0 Then a = 0.0001
  28.         r = ((x1 - x0) ^ 2 + (y1 - y0) ^ 2) ^ (1 / 2)
  29.         c = r ^ 2 - 4 * r ^ 2 * (Sin(jiaodu / 2 / 180 * 3.1415927)) ^ 2 + x1 ^ 2 + y1 ^ 2 - x0 ^ 2 - y0 ^ 2
  30.         D = 1 + a ^ 2 / B ^ 2
  31.         E = 2 * x0 + 2 * a * c / (B ^ 2) - 2 * a * y0 / B
  32.         F = x0 ^ 2 + y0 ^ 2 + c ^ 2 / B ^ 2 - r ^ 2 - 2 * c * y0 / B
  33.         If jiaodu = 180 Then
  34.             x2 = (E) / (2 * D)
  35.             y2 = (c - a * x2) / B
  36.             x3 = x2: y3 = y2
  37.         Else
  38.             x2 = (E + (E ^ 2 - 4 * D * F) ^ (1 / 2)) / (2 * D)
  39.             y2 = (c - a * x2) / B
  40.             x3 = (E - (E ^ 2 - 4 * D * F) ^ (1 / 2)) / (2 * D)
  41.             y3 = (c - a * x3) / B
  42.         End If
  43.         If jiaodu = 180 Then
  44.             Set sha4 = sha1.Duplicate
  45.             sha4.Left = (x2 + x3) / 2 * 10 - sha4.Width / 2
  46.             sha4.Top = (y2 + y3) / 2 * 10 - sha4.Height / 2
  47.             sha4.IncrementRotation jiaodu
  48.         ElseIf jiaodu < 180 Then
  49.             Set sha3 = sha1.Duplicate
  50.             sha3.Left = x3 * 10 - sha3.Width / 2
  51.             sha3.Top = y3 * 10 - sha3.Height / 2
  52.             sha3.IncrementRotation jiaodu
  53.         Else
  54.             Set sha2 = sha1.Duplicate
  55.             sha2.Left = x2 * 10 - sha2.Width / 2
  56.             sha2.Top = y2 * 10 - sha2.Height / 2
  57.             sha2.IncrementRotation jiaodu
  58.             sha2.Line.ForeColor.RGB = RGB(0, 255, 0)
  59.         End If
  60.     Next
  61. End Sub
复制代码
示例效果【ppt】:
456.gif


TA的精华主题

TA的得分主题

发表于 2019-8-14 14:51 | 显示全部楼层
Sub test()
    n = InputBox("请输入蓝色球的个数!", "输入个数")
    ActiveSheet.Shapes.AddShape(msoShapeOval, 300, 200, 50, 50).Select
    With Selection.ShapeRange.Fill
        .ForeColor.RGB = RGB(255, 0, 0)
    End With
   
    Selection.ShapeRange.Line.Visible = msoFalse
   
    For i = 1 To n
        x = 300 + Sin((i / n) * 360 * 3.142 / 180) * 100
        y = 200 - Cos((i / n) * 360 * 3.142 / 180) * 100
        ActiveSheet.Shapes.AddShape(msoShapeOval, x, y, 50, 50).Select
        Selection.ShapeRange.Line.Visible = msoFalse
        
        x2 = 325 + Sin((i / n) * 360 * 3.142 / 180) * 45
        y2 = 225 - Cos((i / n) * 360 * 3.142 / 180) * 45
        
        x1 = 325 + Sin((i / n) * 360 * 3.142 / 180) * 75
        y1 = 225 - Cos((i / n) * 360 * 3.142 / 180) * 75
        
        ActiveSheet.Shapes.AddConnector(msoConnectorStraight, x1, y1, x2, y2).Select
        Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
        With Selection.ShapeRange.Line
        .Visible = msoTrue
        .DashStyle = msoLineSysDot
        End With
        
    Next i
   
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-8-14 16:03 | 显示全部楼层
好强大,还可以这样,学习学习
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-20 13:13 , Processed in 0.042211 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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