gpt4 book ai didi

python - 在不与matplotlib相交的情况下在两个圆圈之间绘制椭圆线

转载 作者:太空狗 更新时间:2023-10-30 02:51:53 28 4
gpt4 key购买 nike

我正在尝试使用 matplotlib 绘制椭圆线来连接两个圆圈,但我想这样做使椭圆线不与任何一个圆圈相交。

目前我的设计是这样的: enter image description here

如您所见,其中有穿过圆 A 和 B 的线。我决定使用 matplotlib.patches.Arc 因为我不想填充它并且它允许我绘制左右部分。这是我所拥有的:

from matplotlib import pyplot
from matplotlib.patches import Arc
import math

def calculate_perimeter(a, b):
perimeter = math.pi * (3*(a+b) - math.sqrt( (3*a + b) * (a + 3*b) ))
return perimeter

def draw_circle(xy, radius, text):
circle = pyplot.Circle(xy, radius=radius, fill=False)
pyplot.gca().add_patch(circle)
pyplot.gca().annotate(text, xy=xy, fontsize=10, ha='center', va='center')

def draw_arc(xy1, xy2, a, b, theta1, theta2):
# Calculate center of the elliptical arc
center = (xy1[0], (xy1[1] + xy2[1])/2.0)
arc = Arc(center, a, b, theta1=theta1, theta2=theta2)
pyplot.gca().add_patch(arc)

if __name__ == '__main__':
pyplot.figure()
center_circle1 = (5, 5)
center_circle2 = (5, 20)
dist_y = center_circle2[1] - center_circle1[1]
adjustment = 5.3 # @TODO: How do I calculate what this needs to be?
# Circles
draw_circle(center_circle1, 1, 'A')
draw_circle(center_circle2, 1, 'B')
# Draw right side of arc
theta1 = 270.0 + adjustment
theta2 = 90.0 - adjustment
draw_arc(center_circle1, center_circle2, 3, dist_y, theta1, theta2)
# Draw left side of arc
theta1 = 90.0 + adjustment
theta2 = 270.0 - adjustment
draw_arc(center_circle1, center_circle2, 3, dist_y, theta1, theta2)
pyplot.axis('scaled')
pyplot.axis('off')
pyplot.show()

例如,当我输入 adjustment = 5.3 时,我得到: enter image description here

如果我放大这个区域,虽然很容易看到它没有对齐: enter image description here

然后我的问题就变成了,我该如何计算adjustment应该是多少?

如果我认为它是一个完整的椭圆并减去其中一个圆圈中的重叠量并使用它来获得调整,我认为我能够计算出周长,但我是不确定这是否可行或如何计算内部有多少重叠。如有任何帮助,我们将不胜感激。

最佳答案

与其手动调整图形,不如考虑在 Patch 构造函数中使用 zorder

绘图上的各种艺术家垂直堆叠在一起,zorder 最高的艺术家在最上面。因此,通过设置 zorder,您将导致在椭圆上绘制圆圈,使其模糊。

示例代码:

from matplotlib import pyplot as plt
from matplotlib.patches import Circle, Arc

fig, ax = plt.subplots(figsize=(6, 6))

ax.add_patch(Circle((0.5, 0.75), 0.05, edgecolor='black', facecolor='white', zorder=3))
ax.add_patch(Circle((0.5, 0.25), 0.05, edgecolor='black', facecolor='white', zorder=3))
ax.add_patch(Arc((0.5, 0.5), 0.1, 0.5))

生成

this .

关于python - 在不与matplotlib相交的情况下在两个圆圈之间绘制椭圆线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54526951/

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