![]() |
1
12
可能有一种数学上聪明的方法可以做到这一点,但我不知道。
我认为这有点复杂,因为几何图形对于每个不同数量的正方形都是不同的;对于4,它是菱形,对于5,它是五角大楼,依此类推。
我要做的是把这些正方形放在一个1单位的圆上(太小了,我知道,请忍受),均匀分布在上面。这很简单,只需将360度除以平方数就可以了。然后,只需测试所有的方块是否与相邻方块重叠;如果它们重叠,请增加半径。
通过使用智能算法接近正确的大小,您可以使此过程比听起来更简单。我在考虑牛顿的算法:假设两个连续的猜测,其中一个太小,一个太大,您的下一个猜测需要是这两个的平均值。
您可以迭代到您喜欢的任何精度。当猜测之间的距离小于某个任意小误差范围时停止。
编辑 我有更好的解决方案: 我在想,如果你问,“我怎么知道正方形是否重叠?”这给了我一个如何精确计算圆大小的想法,只需一步: 把你的正方形放在一个非常小的圆圈上。你知道怎么做:计算你的360/N角与它相交的圆上的点,然后把正方形的中心放在那里。实际上,您还不需要放置正方形,接下来的步骤只需要中点。
计算一个正方形与其相邻的最小距离:计算x的差和中点y的差,并取其中的最小值。x和y实际上只是圆上的余弦和正弦。
您需要对其邻居(顺时针,比如说)求最小值 any square。因此,你需要绕着圆圈努力找到最小的一个。
方格之间的最小(x或y)距离需要变为1.0。所以只要取最小距离的倒数,再乘以圆的大小。普雷斯托,你的圆圈是正确的大小。
编辑 在不失去一般性的情况下,我认为有可能把我的解决方案定下来一点,这样它就接近于编码了。这里有一个改进:
|
![]() |
2
4
我会计算最小半径的上界,通过使用包围正方形的圆而不是正方形本身。 我的计算结果是: rmin<=x/(sqrt(2)*sin(180/n)) 在哪里? x是平方边长,n是所需的平方数。 我假设这些圆的位置使它们的中心落在大圆的圆周上。 --编辑—— 利用下面评论中Dave的想法,我们也可以通过考虑圆圈在正方形内(因此半径为x/2)来计算一个很好的下界。这个界限是: rmin>=x/(2*sin(180/n))。 |
![]() |
3
1
如前所述,在圆的圆周上等距定位n个点的问题很小。问题的(不是非常困难的)部分是找出圆的半径,以给出一个令人满意的广场布局。我建议你遵循其他答案中的一个,并考虑到正方形在一个足够大的圆形“缓冲区”内,以容纳正方形和足够的空间来满足你的审美要求。然后检查公式 chord length 在相邻广场的中心之间。现在你有一个角度,在圆的中心,被圆心之间的弦所对,可以很容易地用三角形的三角学计算圆的半径。
关于你的后续问题:我建议你解决边长平方的问题。
|
![]() |
4
0
我会这样解决: 为了找出半径r和长度l之间的关系,让我们分析无量纲表示法。
这是最优解,可以用r=f(l)来求解。 通过调整xlr[i]和yul[i+1]的公式,解决方案可以适应矩形。 将尝试给出一些伪代码。
编辑:
|
![]() |
5
0
假设您解决了3或4个平方的问题。 如果你有 n >=5个正方形,将一个正方形放在圆的顶部,另一个正方形将落在与圆同心的笛卡尔平面的第一象限中。 问题是找到半径 R 对于圆,使圆的左侧靠近顶部,而顶部圆的右侧不“交叉”。 这个 X 顶圆右侧坐标为 X1 = L 2,在哪里 L 是正方形的边。这个 X 靠近顶部圆的左边的坐标是 X2 = R 余弦 一 - L 2,在哪里 R 是半径和 一 是每对方形中心之间的角度( 一 = 360 n 度数)。 所以我们需要解决 X1 & = X2 从而导致 R = L COS 一 . L 和 一 大家都知道,所以我们结束了:—) |
![]() |
6
0
从任意圆开始(例如,直径为
最后根据找到的比例因子的最大值缩放圆。 编辑: 这是确切的解决方案。但是,稍微考虑一下就可以进一步优化速度:
|
![]() |
danial · 如何在多个字符串的每个位置找到最频繁的字符 2 年前 |
![]() |
Manny · 如何比较Perl中的字符串? 2 年前 |
![]() |
Diret · 获取范围内每个数字的子倍数的算法 2 年前 |
![]() |
Saif · 排序时python如何决定何时调用比较器? 2 年前 |