Нарисуйте дугу как многоугольник, используя начало, конец, центр и радиус, используя Python Matplotlib - PullRequest
0 голосов
/ 15 мая 2018

Я использовал приведенный ниже код только с входами start_point и end_point:

import matplotlib.pyplot as plt
from matplotlib.path import Path
import matplotlib.patches as patches

start_point = (25, 50)
end_point = (50, 25)
center = (25, 25)
radius = (25
# We need to some how automatically calculate this midpoint
mid_point = (45, 45)
verts = [start_point, mid_point, end_point]
codes = [Path.MOVETO, Path.CURVE3, Path.CURVE3]#, Path.CLOSEPOLY]

path = Path(verts, codes)
shape = patches.PathPatch(path, facecolor='none', lw=0.75)
plt.gca().add_patch(shape)
plt.axis('scaled')

Я получаю следующий вывод

enter image description here

Мне нужен следующий вывод (я создал следующий вывод, используя MS Paint)

[ Объяснение : преобразовал дугу в набор точек, соединенных в виде прямых линий.Мне нужны эти наборы точек в виде списка]

enter image description here

1 Ответ

0 голосов
/ 15 мая 2018

Чтобы получить координаты вдоль пути, который был определен с помощью кривых (CURVE3 или CURVE4), вы можете использовать метод Path '.to_polygons().Это даст массив координат N x 2.

poly, = path.to_polygons()
plt.plot(*zip(*poly), marker="o", ls="None")

enter image description here


Невозможно манипулировать количеством точек, созданных .to_polygon.Если это требование, вы можете вместо этого создать собственную кривую Безье из заданных точек, как показано ниже.Здесь мы выбираем 32 точки вдоль пути.

import matplotlib.pyplot as plt
import numpy as np
from scipy.special import binom

bernstein = lambda n, k, t: binom(n,k)* t**k * (1.-t)**(n-k)

def bezier(points, num=200):
    N = len(points)
    t = np.linspace(0, 1, num=num)
    curve = np.zeros((num, 2))
    for i in range(N):
        curve += np.outer(bernstein(N - 1, i, t), points[i])
    return curve

start_point = (25, 50)
end_point = (50, 25)
mid_point = (45, 45)

nodes1 = np.array([start_point, mid_point, end_point])
curve1 = bezier(nodes1, num=32)

plt.plot(curve1[:,0], curve1[:,1], color="red", ls="", marker="o", ms=3)
plt.axis('scaled')

plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...