在不与matplotlib相交的情况下在两个圆圈之间绘制椭圆线
Drawing elliptical lines between two circles without intersecting matplotlib
我正在尝试使用 matplotlib 绘制椭圆线来连接两个圆圈,但我想这样做使椭圆线不与任何一个圆圈相交。
目前我的设计是这样的:
如您所见,其中有线穿过圆 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
时,我得到:
如果我放大这个区域,虽然很容易看到它没有对齐:
我的问题是,我如何计算 adjustment
应该是多少?
我认为如果我认为它是一个完整的椭圆并减去其中一个圆圈中的重叠量并使用它来得到 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))
生成
.
我正在尝试使用 matplotlib 绘制椭圆线来连接两个圆圈,但我想这样做使椭圆线不与任何一个圆圈相交。
目前我的设计是这样的:
如您所见,其中有线穿过圆 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
时,我得到:
如果我放大这个区域,虽然很容易看到它没有对齐:
我的问题是,我如何计算 adjustment
应该是多少?
我认为如果我认为它是一个完整的椭圆并减去其中一个圆圈中的重叠量并使用它来得到 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))
生成