我正在寻找一种算法(或伪代码),该算法可以计算最大直径(s)的(较小)圆的数量,该最大数量可以压缩到半径为“ r”的另一个(较大)圆的圆周中。 ..
图片:http://teasy.space/images/terracolony-squeezingcircles2.jpg
如果愿意,可以在半径/直径等之间切换-因为这是我仅有的两个参数(除了中心(大圆)坐标),即已知的... 外圈可能不会重叠,但可以“贴合”在一起...
经过多年的例行升级之后,我目前使用的算法并不完美(它必须是准确的,否则星系会大声笑) 在较小的外圆直径和较大的内圆圆周之间进行宽插值,以某种程度准确地绘制出多边形样式拟合模式中的圆数,这在使用较大的外圆时会引起问题(即重叠)...
; try to fit a random number of circles
num_Circles = Rand( min,max )
; check if the number of circles exceed the maximum that can fit
If num_Circles * SmallCircle_Diameter > LargeCircle_Circumference
; adjust the amount accordingly
num_Circles = LargeCircle_Circumference / SmallCircle_Diameter
End If
另一个假设是,较小的外圈的大小永远不会超过较大的内圈的大小... 无需担心的事情;)
我将这个算法用于我的一个名为Terra Colony的项目中,该项目基于Gravity Well,这是一个具有月亮,行星,恒星,黑/白洞等的二维空间/重力实时殖民模拟游戏,
图片:http://teasy.space/images/terracolony-squeezingcircles1.jpg
这个问题困扰了这个项目十多年了! 希望你能指出正确的方向:D
我以前做过许多实验,并编写了不同的程序来寻找解决方案,并上网浏览了一些公式和解决方案,这些公式和解决方案最终非常接近,但还不够接近! :P
谢谢! <3
Teasy
P.S。我尝试添加标签“周长”,但显然需要“ 1500信誉”(我想这是为了防止垃圾邮件)
答案 0 :(得分:1)
有一个公式可以确定大圆半径 R ,小圆半径 r 和(触摸)小圆 N
$driverName = null;
if(isset($bus->Driver_id) && $bus->driver && $bus->driver->first_name) $driverName = $bus->driver->first_name.' '.$bus->driver->last_name.' '.$bus->driver->third_name;
return $driverName;
因此,可能发现的最大小圆圈数量为
R = r / Sin(Pi/N)
示例:
Sin(Pi/N) = r / R
Pi / N = arcsin(r / R)
and finally
N = Pi / arcsin(r / R)