Matplotlib: Как рисовать линии краев в Arc - патчи

1

Учитывая центр и два угла повернутого эллипса Arc от matplotlib.patches, я хочу построить две линии, начинающиеся от центра Дуги до концов Дуги.

Вот фрагмент кода, который делает это:

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

fig, ax = plt.subplots(1,1)

r = 2 #Radius
a = 0.2*r #width 
b = 0.5*r #height

#center of the ellipse
x = 0.5
y = 0.5

ax.add_patch(Arc((x, y), a, b, angle = 20,
             theta1=0, theta2=120, 
             edgecolor='b', lw=1.1))
#Now look for the ends of the Arc and manually set the limits
ax.plot([x,0.687],[y,0.567], color='r',lw=1.1)
ax.plot([x,0.248],[y,0.711], color='r',lw=1.1)

plt.show()

В результате

Изображение 174551.

Здесь красные линии были тщательно очерчены на концах дуги. Однако, поскольку Arc не позволяет заполнить дугу для оптимизации, мне интересно, есть ли способ сделать это автоматически для любого центра и углов.

Теги:
matplotlib

1 ответ

0
Лучший ответ

Согласно Википедии, эллипс в его полярной форме выглядит

Изображение 174551

Используя это, вы можете рассчитать конечные точки линий.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Arc

fig, ax = plt.subplots(1,1)

r = 2 #Radius
a = 0.2*r #width 
b = 0.5*r #height

#center of the ellipse
x = 0.5; y = 0.5

# angle
alpha = 20

ax.add_patch(Arc((x, y), a, b, angle = alpha,
             theta1=0, theta2=120, 
             edgecolor='b', lw=1.1))

def ellipse(x0,y0,a,b,alpha,phi):
    r = a*b/np.sqrt((b*np.cos(phi))**2 + (a*np.sin(phi))**2)
    return [x0+r*np.cos(phi+alpha), y0+r*np.sin(phi+alpha)]

x1,y1 = ellipse(x, y, a/2., b/2., np.deg2rad(alpha), np.deg2rad(0))
ax.plot([x,x1],[y,y1], color='r',lw=1.1)

x2,y2 = ellipse(x, y, a/2., b/2., np.deg2rad(alpha), np.deg2rad(120))
ax.plot([x,x2],[y,y2], color='r',lw=1.1)

ax.set_aspect("equal")
plt.show()

Изображение 174551

Ещё вопросы

Сообщество Overcoder
Наверх
Меню