我正在使用tetgen来尝试创建一个空心圆顶。我使用三角形,然后只是对一个圆进行三角测量,并根据方程z=sqrt(abs(r^2-x^2-y^2))提高z值,但我在边缘附近的拉伸效果很差。
所以我只想生成这个圆顶的一堆点,然后在不填充的情况下对其进行网格划分。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)
打印np.array(mesh.facets)和print np.array(mesh.points)现在只是空数组。
有人知道如何在不设置所有facet的情况下使用meshpy,或者像命令行tetgen那样使用这种构建方法来构建facet吗?这并不能真正解决我的问题,即圆顶底部没有打开,但这是我一直在努力解决的问题。如有任何帮助,我们将不胜感激。谢谢
为了防止其他人在寻找这个答案,我从meshpy的创建者那里得到了答案。基本上,您需要覆盖Options以摆脱默认的"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)
希望这能帮助任何在这个问题上遇到麻烦的人。