matplotlib 圆几何图形和Shapely彩色打印

gz5pxeao  于 2023-03-03  发布在  其他
关注(0)|答案(1)|浏览(140)

我试图用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个圆应该是第一个环,但它们的位置不对,除了修正这个问题,我还需要考虑如何计算下一个环的圆。
任何帮助是非常感谢!

oknrviil

oknrviil1#

你的问题有点误导人,因为看起来你的主要问题是你忽略了math中的三角函数使用弧度而不是度,所以它实际上与shapely本身无关。
可以使用math.radians(x)将度转换为弧度,然后使用cossin函数。
除此之外,我认为你错过了第一环的一个圆圈。应该有6个围绕1,总共7个。
我想我只需要计算一次30度的余弦,这样你就可以得到所有6个位置(即,两个在通过原始中心的垂直线上,另外四个在与通过原始中心的水平线成30度的方向上,只是方向不同)。
对于每一个更远的外环,你只需在迭代/递归方法中加/减相同的数字。

相关问题