Как создать сетку по ориентации многоугольника - PullRequest
0 голосов
/ 08 декабря 2018

Как я могу сделать сетку в соответствии с ориентацией многоугольника с некоторым интервалом, где многоугольник всегда имеет 4 точки данных с различной ориентацией, например, мой многоугольник выглядит так:

x1 = np.array([50,0,150,200,50])
y1 = np.array([10,-50,-60,0,10])

иЯ хочу сделать сетку так:

enter image description here

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Вы можете создать LineCollection «линий сетки», разделив ребра многоугольника на равноотстоящие части, как показано ниже.В функции grid, nx и ny - количество линий, создаваемых для измерения многоугольника.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
from matplotlib.collections import LineCollection

def grid(x,y, nx, ny, **kwargs):
    def verts(a,b,c,d,n):
        l1x = np.linspace(x[a],x[b], n)
        l1y = np.linspace(y[a],y[b], n)
        l2x = np.linspace(x[d],x[c], n)
        l2y = np.linspace(y[d],y[c], n)
        return np.stack((np.c_[l1x, l2x], np.c_[l1y, l2y]), axis=-1)
    v = np.concatenate((verts(0,1,2,3,ny), verts(1,2,3,4,nx)), axis=0)
    return LineCollection(v, **kwargs)

x1 = np.array([50,0,150,200,50])
y1 = np.array([10,-50,-60,0,10])


fig, ax = plt.subplots()

ax.add_collection(grid(x1,y1,5,6, color="gray"))

rect=Polygon(np.c_[x1,y1], edgecolor="C0", linewidth=2, facecolor="none", zorder=3)
ax.add_patch(rect)

ax.autoscale()
plt.show()

enter image description here

0 голосов
/ 08 декабря 2018

Вы можете использовать функцию интерполяции для каждой координаты:

from scipy.interpolate import interp2d

x = np.array([0, 1], dtype=np.float)
y = np.array([0, 1], dtype=np.float)

Теперь нам нужно создать функцию интерполяции, чтобы на квадрате малых единиц (0,1) x (0,1) мыполучить желаемый результат.

zx = np.array([[0, 150],[50, 200]])
fx = interp2d(x, y, zx)

fx(0.5, 0.5)

Сделайте то же самое для zy, чтобы получить y координату внутри полигона.

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