Создайте три angular сетку не прямоугольной angular фигуры в 2D в Python - PullRequest
0 голосов
/ 30 марта 2020

Предположим, у меня есть набор точек, определяющих периметр непрямой angular фигуры в 2-й плоскости.

Мне нужна функция для создания сетки tri angular, где я могу изменить количество ячеек треугольника и вернуть координаты (x, y) каждой ячейки.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 30 марта 2020

Вы, вероятно, должны проверить

(я автор dm sh и pygm sh.)

1 голос
/ 01 апреля 2020

Я пост, что я наконец сделал. При работе с Python3 обнаружены некоторые проблемы. Я советую запустить на GoogleColab.

Источник: https://github.com/inducer/meshpy/blob/master/examples/test_triangle.py

Запустите Google Colab, если у вас есть python3, и вы не хотите понижать до python2

!pip install Meshpy
!pip install pybind11
!pip install pyvtk

from __future__ import division
from __future__ import absolute_import

import meshpy.triangle as triangle
import numpy as np
import numpy.linalg as la
from six.moves import range
import matplotlib.pyplot as pt

def round_trip_connect(start, end):
    return [(i, i+1) for i in range(start, end)] + [(end, start)]



points = [(100,400),
          (400,400),
          (400,280),
          (320,270), 
          (320,160), 
          (120,160), 
          (120,250), 
          (100,250)]

facets = round_trip_connect(0, len(points)-1)

circ_start = len(points)
points.extend((3 * np.cos(angle), 3 * np.sin(angle)) for angle in np.linspace(0, 2*np.pi, 30, endpoint=False))

facets.extend(round_trip_connect(circ_start, len(points)-1))


def needs_refinement(vertices, area):
    bary = np.sum(np.array(vertices), axis=0)/3
    max_area = 5 + (la.norm(bary, np.inf)-1)*5
    return bool(area > max_area)

info = triangle.MeshInfo()
info.set_points(points)
info.set_holes([(0, 0)])
info.set_facets(facets)

mesh = triangle.build(info, refinement_func=needs_refinement)

mesh_points = np.array(mesh.points)
mesh_tris = np.array(mesh.elements)


pt.triplot(mesh_points[:, 0], mesh_points[:, 1], mesh_tris)
pt.show()

print (mesh_points)
...