ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 圆形填充

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-11-19 12:07 | 显示全部楼层 |阅读模式
圆形填充并不稀奇,一般使用填充一个圆形的方法。


有些困扰的一是圆形的弦高计算,一是水平线。

弦高的计算:
附件使用的网上摘抄的函数迭代法,这是一种用牛顿法计算弦高的方法。
实际上,对计算方法有了解的应该知道,计算方法包括迭代、插值、差分等方法,这种迭代法是比较常见的。

2023-11-19_120212.png


水平线:
以前一直使用散点图模拟水平线,要计算起止角度、线端开始和线端结束,相对麻烦一些。
附件使用的是柱形图的阴影,因为填充的圆形是实体,圆形外是空,空没有阴影,只有实体才有阴影,这样就变相的给弦形加了一条线,恰巧解决了弦形无水平线的问题。

2023-11-19_120149.png


2023-11-19_120349.png



20231118-圆形填充 函数迭代弦高 水平线.zip

49.84 KB, 下载次数: 21

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-11-19 20:02 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
列一个对照表,弓形的弦高h(间隔0.0001,从0到直径1)与百分比(弓形的面积/圆的面积),弓形的面积可以百度,有h和r即可计算

然后,根据百分比反查对应的弦高h即可
或者直接vba写个函数,循环到某个值退出,即可求出百分比对应的h值

水平线
当求得h的值后,水平线y值即为已知
利用勾股定理就可以求得水平线与圆的交点的x值

TA的精华主题

TA的得分主题

发表于 2023-11-19 20:03 | 显示全部楼层
列一个对照表,弓形的弦高h(间隔0.0001,从0到直径1)与百分比(弓形的面积/圆的面积),弓形的面积可以百度,有h和r即可计算

然后,根据百分比反查对应的弦高h即可
或者直接vba写个函数,循环到某个值退出,即可求出百分比对应的h值

水平线
当求得h的值后,水平线y值即为已知
利用勾股定理就可以求得水平线与圆的交点的x值

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-11-19 21:50 来自手机 | 显示全部楼层
493861364 发表于 2023-11-19 20:03
列一个对照表,弓形的弦高h(间隔0.0001,从0到直径1)与百分比(弓形的面积/圆的面积),弓形的面积可以百 ...

你说的列表或者代码计算,都不是优秀的算法。

迭代或者插值的方法,计算量极小,就算代码计算,也能节省成千上万倍的计算量。

事实上,计算器的计算也基本都是迭代和插值计算出来的,否则就不可能秒出,算上十几秒都是常态

TA的精华主题

TA的得分主题

发表于 2023-11-19 23:03 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wangg913 发表于 2023-11-19 21:50
你说的列表或者代码计算,都不是优秀的算法。

迭代或者插值的方法,计算量极小,就算代码计算,也能节 ...

提供一个简单粗暴的解题思路,方法比较直来直去,肯定算不上最优解,

TA的精华主题

TA的得分主题

发表于 2023-11-20 00:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
493861364 发表于 2023-11-19 20:02
列一个对照表,弓形的弦高h(间隔0.0001,从0到直径1)与百分比(弓形的面积/圆的面积),弓形的面积可以百 ...

image.jpg


因为有三角函数计算的原因,无法精确反算,不要求足够精度只是四舍五入百分比的话,用插值法可以算一个高度出来
  1. Sub Main()
  2.     Const p As Double = 3.14159265358979
  3.     Const n  As Integer = 1000
  4.     Const r As Integer = 10
  5.    
  6.     Dim ar, s#, s1#, s2#
  7.     Dim i%, j%, k%
  8.     Dim L#, h#, t#
  9.     Dim A, B
  10.    
  11.     s = p * r ^ 2
  12.     ReDim ar(0 To n, 0 To 11)
  13.     t = 2 * p / n
  14.     For i = 0 To n
  15.         A = i * t
  16.         B = A / (p * 2)
  17.         s1 = B * s
  18.         
  19.         L = r * VBA.Sin(A / 2)
  20.         h = VBA.Abs(r * VBA.Cos(A / 2))
  21.         s2 = L * h
  22.         
  23.         ar(i, 0) = i
  24.         ar(i, 1) = B * 100
  25.         ar(i, 2) = A
  26.         ar(i, 3) = B * 360
  27.         ar(i, 4) = s1
  28.         ar(i, 5) = s2
  29.         ar(i, 6) = L * 2
  30.                
  31.         If A > p Then
  32.         ar(i, 7) = r + h
  33.         ar(i, 9) = s1 + s2
  34.         Else
  35.         ar(i, 7) = r - h
  36.         ar(i, 9) = s1 - s2
  37.         End If
  38.         ar(i, 8) = ar(i, 7) / (r * 2)
  39.         ar(i, 10) = ar(i, 9) / s
  40.         If i Then ar(i, 11) = ar(i, 10) / ar(i, 8) Else ar(i, 11) = 0
  41.     Next
  42.     Sheet2.Range("b1:l1").Value = Array("序号", "角度百分比", "弧度", "角度", "扇形面积", "三角形面积", "弦长", "高度", "高度百分比", "面积", "面积百分比")
  43.     Sheet2.Range("b2").Resize(n + 1, 12).Value = ar
  44. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2023-11-20 15:58 | 显示全部楼层
本帖最后由 493861364 于 2023-11-20 16:11 编辑
micch 发表于 2023-11-20 00:19
因为有三角函数计算的原因,无法精确反算,不要求足够精度只是四舍五入百分比的话,用插值法可以算 ...

把计算精度再提高一个数量级,0.0001
虽然会有点误差,但直接lookup出来的结果,精度就足够用了
跟版主的那个结果,差异最大也就在万分之2~3

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-5 21:54 , Processed in 0.042575 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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