我想沿著另一個圓圈放置一組圓圈,以使“子”圓圈彼此不重疊。我知道所有圓的半徑,以及目標圓的位置。
目標圓將始終足夠大以適合所有圓。
看這個圖:
:
interface Circle {
radius: number;
x: number;
y: number;
}
const childRadii = [1, 3, 2, 5, 1, 2];
const largeCircle = { radius: 10, x: 0, y: 0 };
const arrangedCircles = positionCirclesOnCircle(largeCircle, childRadii);
function positionCirclesOnCircle(
largeCircle: Circle,
radii: number[]
): Circle[] {
const arrangedCircles: Circle[] = [];
//for each of our radii find the correct x and y position along largeCircle
for (let index = 0; index < radii.length; index ) {
//find the x and y pos for this circle
//push to arrangedCircles
}
return arrangedCircles;
}
我不確定應該用什么樣的方程或數學來找到每個子圓的 x 和 y 位置。
我看到在數學論壇上
關于裝修:
- 如果它們的半徑之和大于大圓的直徑,則不可能放置兩個相鄰的圓。
- 的值
f[i] > 2 * Pi意味著不能添加更多的非重疊圓。
uj5u.com熱心網友回復:
這是另一種方法。我試圖避免使用“計算成本高”的函式arcsin,sin并且只cos使用昂貴的函式來代替它們sqrt,您可以嘗試使以下代碼適應您的需要。
import math
import numpy as np
def initial_child_cetner(large_circle, argument):
cos_arg = math.cos(math.pi * argument / 180)
sin_arg = math.sin(math.pi * argument / 180)
rotation = np.array([[ cos_arg, -sin_arg],
[ sin_arg, cos_arg]])
initial_center = large_circle['radius'] * np.array([1., 0.])
return rotation.dot(initial_center)
def cos_sin_angle(large_radius, chord):
cos_angle = 1 - ( chord )**2 / (2*large_radius**2)
sin_angle = math.sqrt(1 - cos_angle**2)
return cos_angle, sin_angle
def next_child_center(large_circle_center, current_child_center, large_radius, chord):
cos_a, sin_a = cos_sin_angle(large_radius, chord)
rotation = np.array([[ cos_a, sin_a],
[-sin_a, cos_a]])
child_center_next = large_circle_center rotation.dot(current_child_center - large_circle_center)
return child_center_next
def chain_of_child_circles(large_circle, child_radii, argument):
n = len(child_radii)
child_centers = np.empty((n, 2), dtype = float)
child_centers[0, :] = initial_child_cetner(large_circle, argument)
large_center = np.array([large_circle['x'], large_circle['y']])
for i in range(n-1):
chord = child_radii[i] child_radii[i 1]
child_centers[i 1, :] = next_child_center(large_center,
child_centers[i, :],
large_circle['radius'],
chord)
return child_centers
childRadii = [1, 3, 2, 5, 1, 2]
largeCircle = { 'radius': 10, 'x': 0, 'y': 0 }
childCircleCenters = chain_of_child_circles(largeCircle, childRadii, -90)
fig, axs = plt.subplots()
axs.plot(childCircleCenters[:,0], childCircleCenters[:,1], 'bo')
axs.plot(childCircleCenters[:,0], childCircleCenters[:,1])
axs.set_aspect('equal')
plt.grid()
plt.show()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/337039.html
