我试图用Python中的Shapely绘制一堆重叠的圆。我可以选择圆心和半径,但我很难确定圆心应该在哪里,以制作生命之花的设计。
我发现了这个super cool tutorial,但是我没有使用Javascript的经验,我想用Python应该不难做到。我希望有一个几何Python的书呆子可以帮助我!
以下是我目前的发现:
import matplotlib.pyplot as plt
from shapely.geometry import Point, LineString, Polygon, MultiPoint, MultiPolygon
from shapely.ops import unary_union
from math import sqrt, floor, pi, cos, sin, acos, asin
# two functions for plotting
def plot_coords(coords):
pts = list(coords)
x, y = zip(*pts)
plt.plot(x,y)
def plot_polys(polys):
for poly in polys:
plot_coords(poly.exterior.coords)
plt.fill_between(*poly.exterior.xy, alpha=.5)
# buffer points to make circles
circles = []
x = 100
y = 100
center = Point(x,y)
radius = 10
circle1 = circles.append(center.buffer(radius))
# if you want to view the one circle:
plot_polys(circles)
plt.show()
如果第二个圆与第一个圆的圆心成60 °角,我应该可以这样画出它们(这里迫切需要帮助画一个圆):
center2 = Point(x + radius * cos(60), y + radius * sin(60))
circles.append(center2.buffer(radius))
center3 = Point(x + radius * cos(60*2), y + radius * sin(60*2))
circles.append(center3.buffer(radius))
center4 = Point(x + radius * cos(60*3), y + radius * sin(60*3))
circles.append(center4.buffer(radius))
center5 = Point(x + radius * cos(60*4), y + radius * sin(60*4))
circles.append(center5.buffer(radius))
center6 = Point(x + radius * cos(60*5), y + radius * sin(60*5))
circles.append(center6.buffer(radius))
plot_polys(circles)
plt.xlim([50,150])
plt.ylim([50,150])
plt.show()
产量:
所以,这显然是错误的。这是弧度/度的问题吗?从我所读到的,我认为Shapely会默认为度?
我想画出一个像生命之花的情节,这前6个圆应该是第一个环,但它们的位置不对,除了修正这个问题,我还需要考虑如何计算下一个环的圆。
任何帮助是非常感谢!
1条答案
按热度按时间oknrviil1#
你的问题有点误导人,因为看起来你的主要问题是你忽略了
math
中的三角函数使用弧度而不是度,所以它实际上与shapely
本身无关。可以使用
math.radians(x)
将度转换为弧度,然后使用cos
和sin
函数。除此之外,我认为你错过了第一环的一个圆圈。应该有6个围绕1,总共7个。
我想我只需要计算一次30度的余弦,这样你就可以得到所有6个位置(即,两个在通过原始中心的垂直线上,另外四个在与通过原始中心的水平线成30度的方向上,只是方向不同)。
对于每一个更远的外环,你只需在迭代/递归方法中加/减相同的数字。