Используя tetgen или треугольник (или meshpy), чтобы создать полый купол
Я использую тетген, чтобы попытаться создать полый купол. Я использовал треугольник, а затем просто триангулировал окружность и поднял значения z в соответствии с уравнением z = sqrt(abs(r^2 - x^2 - y^2)), но у меня было очень плохое растяжение вблизи краев.
Поэтому я хотел бы просто сгенерировать несколько точек этого купола, а затем создать сетку, не заполняя ее. Tetgen в основном делает это для меня, предоставляя файл.node и.faces, но проблема в том, что я все еще получаю дно и я не уверен, как от этого избавиться. Я довольно плохо знаком с tetgen и meshpy, поэтому если бы кто-нибудь мог дать мне рабочий процесс для этого, я был бы очень признателен. Ответ на самом деле может быть очень простым.
Например, я могу создать точки вокруг нижней части круга с помощью простой функции:
def gen_pts_on_circle(num_pts, radius):
pnts = []
theta = 360.0 / num_pts
# loop through circle using theta for point placement
for i in np.arange(0, 360, theta):
x = radius * np.cos(np.radians(i))
y = radius * np.sin(np.radians(i))
z = 0.0
pnts.append((x,y,z))
return np.array(pnts)
Затем я генерирую случайные точки на куполе, используя функцию:
def gen_random_pts(num_pts, radius):
pts = []
for i in xrange(num_pts):
q = np.random.random() * (np.pi * 2.0)
r = np.sqrt(np.random.random())
x = (radius * r) * np.cos(q)
y = (radius * r) * np.sin(q)
# Just the sphere equation with abs value to make a dome
z = np.sqrt(abs(r**2 - x**2 - y**2))
pts.append((x,y,z))
return np.array(pts)
Затем я просто удаляю заголовок из файла.node и запускаю tetgen, чтобы получить файл.face. Единственная проблема с этим подходом - это дно там, где мне нужно, чтобы он был открытым куполом.
Я бы предпочел использовать meshpy, но генерация этих точек и последующая их подача в meshpy ничего не дает...
from meshpy.tet import MeshInfo, build
# Generating all of the points using the functions
pts_circ = gen_pts_on_circle(100, 5)
points = np.vstack((pts_circle, gen_random_pts(500, 5)))
# Building with tet
mesh_info = MeshInfo()
mesh_info.set_points(points)
mesh = build(info)
print np.array (mesh.facets) и print np.array (mesh.points) теперь являются просто пустыми массивами.
У кого-нибудь есть идеи о том, как использовать meshpy, не устанавливая также все грани, или используя этот метод сборки для построения граней, как в командной строке tetgen? Это на самом деле не избавляет от моей проблемы, что нижняя часть купола не открыта, но кое-что я пытаюсь решить. Любая помощь будет принята с благодарностью. Спасибо!
1 ответ
На всякий случай, если кто-то еще ищет этот ответ, я получил его от создателя meshpy. По сути, вам нужно переопределить параметры, чтобы избавиться от стандартных команд 'pq'. Так
from meshpy.tet import MeshInfo, Options, build
opts = Options("") # Overriding 'pq' with no options or flags
mesh_info = MeshInfo()
mesh = build(mesh_info, options=opts)
Надеюсь, что это поможет любому, кто сталкивается с этой же проблемой.