2015-03-17 4 views
0

Я использую tetgen, чтобы попытаться создать полый купол. Я использовал треугольник, а затем просто триангулировал круг и поднимал значения z в соответствии с уравнением z = sqrt (abs (r^2 - x^2 - y^2)), но я очень сильно растягивался вблизи краев.Использование tetgen или треугольника (или сетки) для создания полого купола

Поэтому я хотел бы просто создать кучу точек этого купола, а затем сшить его, не заполнив его. 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) и печати np.array (mesh.points) теперь представляют собой просто пустые массивы.

Есть ли у кого-нибудь идеи о том, как использовать meshpy, не устанавливая также все грани, или используя этот метод сборки для построения граней, подобных командной строке tetgen? Это действительно не избавляет от моей проблемы, что нижняя часть купола не открыта, но что-то я пытался выработать. Любая помощь будет принята с благодарностью. Благодаря!

+0

Можете ли вы предоставить (в своем первоначальном посте) минимальный код, который устанавливает геометрию купола? –

ответ

0

На всякий случай кто-либо еще ищет этот ответ, я получил его от создателя 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) 

Надеюсь, это поможет любому, кто наткнулся на эту же проблему.

 Смежные вопросы

  • Нет связанных вопросов^_^