gpt4 book ai didi

algorithm - 计算正方形内的列宽以控制圆周上的项目距离

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:50:27 25 4
gpt4 key购买 nike

我正在努力阐明这个问题,所以我会尽我最大的努力,随着我的理解的提高来清理它。

假设我们有一个正方形,该正方形通过线分成多个垂直段。在我们的正方形内,我们还有一个完美契合的圆圈。

在每个垂直段内,我放置了一个直接位于圆周上的项目。

是否有一种算法可以定义每个段的宽度,以便每个段内的项目在位于圆周上时彼此之间的距离也相等?

这是我惊人的场景草图:

enter image description here

最佳答案

我希望你有这样的想法。

enter image description here

这是使用下面描述的数学生成上面图像的 Python。

#!/usr/bin/env python3
import math
import sys


def layout(n):
assert isinstance(n, int)
assert n >= 1
divisions = [0.0] * (n + 1)
divisions[0] = -1.0
divisions[n] = 1.0
for i in range(1, (n + 1) // 2):
box = -math.cos(i / (n + 1) * math.pi)
divisions[i] = 2.0 * box - divisions[i - 1]
divisions[n - i] = -divisions[i]
return divisions


def quality(divisions):
n = len(divisions) - 1
boxes = [0.5 * (divisions[i] + divisions[i + 1]) for i in range(n)]
angles = [math.asin(box) for box in boxes]
differences = [angles[i] - angles[i + 1] for i in range(n - 1)]
return max(differences) - min(differences)


def eps(divisions):
n = len(divisions) - 1
print('%!PS-Adobe-3.0 EPSF-3.0')
print('%%BoundingBox: 0 0 216 216')
print('0.008 setlinewidth')
print('108 108 translate')
print('90 90 scale')
print('newpath 1 1 moveto -1 1 lineto -1 -1 lineto 1 -1 lineto closepath stroke')
print('newpath 0 0 1 0 360 arc closepath stroke')
for i in range(n):
x = 0.5 * (divisions[i] + divisions[i + 1])
print('newpath {} {} moveto 0.05 0.05 rmoveto -0.1 0 rlineto 0 -0.1 rlineto 0.1 0 rlineto 0 0.1 closepath fill'.format(x, math.sqrt(1 - x ** 2)))
print('[0.016 0.016] 0 setdash')
for i in range(1, n):
print('newpath {} 1 moveto 0 -2 rlineto stroke'.format(divisions[i]))


if __name__ == '__main__':
eps(layout(11))
for m in range(2, 12):
print(quality(layout(m)), file=sys.stderr)

像这样假设标准数学坐标。

         +y
^
|
(-1,1) | (1,1)
+-+
-x <-----|O|-----> +x
+-+
(-1,-1) | (1,-1)
|
v
-y

由于盒子在圆上应该有等距的中心,因此这些中心应该有固定间隔的角度。角度θ(以弧度为单位)的点是(cos θ, sin θ)。圆的顶部是 θ = π/2,因此您示例中的角度可能是(从左到右)11π/12、3π/4、7π/12、5π/12 , π/4, π/12(区间为-π/6)。

设这些点的 x 坐标为 b(1) ≤ b(2) ≤ ... ≤ b(n)(b 为框)。我们想要找到分隔符位置 d(1) ≤ d(2) ≤ ... ≤ d(n-1) 使得每个框都以两个相邻分隔符的中点为中心,即,

       d(0) + d(1)
b(1) = -----------
2

d(1) + d(2)
b(2) = -----------
2

...

d(n-1) + d(n)
b(n) = ------------- ,
2

其中 d(0) = -1d(n) = 1 是盒子的边缘。

这是一个 n 方程组,n-1 变量。对于b(i) 的一般值,该系统不会有解。幸运的是,可以展示可以实现的 b(i) 的特定选择。

b(i) = -cos((i/(n+1)) pi)

关于algorithm - 计算正方形内的列宽以控制圆周上的项目距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26549592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com