2015-07-30 2 views
1

Вы знаете, как получить пересечение (соответствующий) тома/сетки двух многоугольных сеток, состоящих из множества граней и вершин в Matlab?Как получить объем пересечения двух сеток (граней и вершин)?

+2

что вы уже пробовали? –

+0

У меня есть два набора (многоугольные сетки) граней и вершин. Каждая сетка (вершины и грани) имеет объем пересечения. Поэтому я хотел бы получить объем пересечения двух сеток. –

+0

Как выглядит ваш код в формате matlab? каковы ваши входные данные? –

ответ

1

Я не знаю встроенного метода MATLAB для этого. Но через функции mex вы можете использовать ready-made C++ libraries.

В следующем примере используется libigl's boolean mesh operation.

Это некоторая зависимость, я установил их на Ubuntu Linux с помощью:

$ sudo apt-get install libcgal-dev git mercurial 
$ cd /opt/ 
$ hg clone https://bitbucket.org/eigen/eigen/ 
$ git clone https://github.com/libigl/libigl.git 

get_intersection_mesh.cpp

#include "mex.h" 

#include <Eigen/Core> 
#include <igl/matlab/prepare_lhs.h> 
#include <igl/matlab/parse_rhs.h> 
#include <igl/boolean/mesh_boolean.h> 

void mexFunction(
    int   nlhs, 
    mxArray  *plhs[], 
    int   nrhs, 
    const mxArray *prhs[] 
    ) 
{ 
    using namespace Eigen; 
    if (nrhs != 4) 
    { 
    mexErrMsgIdAndTxt("MATLAB:mexcpp:nargin", 
     "get_intersection_mesh requires 4 input parameters: F1, V1, F2, V2"); 
    } 
    if (nlhs != 2) 
    { 
    mexErrMsgIdAndTxt("MATLAB:mexcpp:nargout", 
     "get_intersection_mesh requires 2 output parameters: F, V"); 
    } 

    MatrixXd V1, V2, V_i; 
    MatrixXi F1, F2, F_i; 

    // read input meshes 
    igl::matlab::parse_rhs_index(prhs+0, F1); 
    igl::matlab::parse_rhs_double(prhs+1,V1); 
    igl::matlab::parse_rhs_index(prhs+2, F2); 
    igl::matlab::parse_rhs_double(prhs+3,V2); 

    // calculate intersection 
    igl::boolean::mesh_boolean(V1,F1,V2,F2,igl::boolean::MESH_BOOLEAN_TYPE_INTERSECT,V_i,F_i); 

    // write output 
    igl::matlab::prepare_lhs_index(F_i,plhs+1); 
    igl::matlab::prepare_lhs_double(V_i,plhs); 
} 

Вы скомпилировать его в MATLAB с помощью:

mex get_intersection_mesh.cpp -I/opt/libigl/include -I/opt/eigen -lboost_thread -lCGAL -lmpfr -lgmp -lboost_system 

Вы бы затем использовать его как это:

[V_i, F_i] = get_intersection_mesh(fv1.faces, fv1.vertices, fv2.faces, fv2.vertices); 

% plot intersection mesh 
patch('Faces',F_i,'Vertices',V_i, 'FaceColor','w'); 
+0

Спасибо за ваш ответ. Моя среда разработки теперь не такая же, как у вас. Могу ли я получить все скомпилированные файлы для использования функции get_intersection_mesh() Matlab? Я просто хочу сначала проверить эту функцию с помощью своих наборов данных. –

+0

@JoonAn Нет необходимости компилировать его самостоятельно, так как зависимости должны быть одинаковыми, операционная система должна соответствовать и т. Д. –

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