#define _USE_MATH_DEFINES #include #include "CVT/CVTGenerator.h" //#include "CVT/utils.h" #include #include #include #include #include "mex.hpp" #include "mexAdapter.hpp" #include "MatlabDataArray.hpp" #include class MexFunction : public matlab::mex::Function { public: void operator()(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs) { checkArguments(outputs, inputs); matlab::data::TypedArray seeds = std::move(inputs[0]); //matlab::data::TypedArray query_pnts = std::move(inputs[1]); // points need to be projected mexVoronoi(seeds); matlab::data::ArrayFactory factory; matlab::data::TypedArray m_edges = factory.createArray({ 1, 1 }); m_edges[0][0] = 0; // for each patch: return projected center cbns, orignal boundary cbns // return each cell, each patch outputs[0] = m_edges; } // TODO: void checkArguments(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs) { std::shared_ptr matlabPtr = getEngine(); matlab::data::ArrayFactory factory; if (inputs.size() != 1) { matlabPtr->feval(u"error", 0, std::vector({ factory.createScalar("Four inputs required") })); } if (inputs[0].getDimensions()[1] != 3) { matlabPtr->feval(u"error", 0, std::vector({ factory.createScalar("Seeds input 1 must be NX2 dimension") })); } if (inputs[0].getType() != matlab::data::ArrayType::DOUBLE || inputs[0].getType() == matlab::data::ArrayType::COMPLEX_DOUBLE) { matlabPtr->feval(u"error", 0, std::vector({ factory.createScalar("Seeds Input 1 must be a noncomplex scalar double") })); } if (outputs.size() > 1) { matlabPtr->feval(u"error", 0, std::vector({ factory.createScalar("Only one output is returned") })); } } void mexVoronoi(matlab::data::TypedArray seeds) { Eigen::MatrixXd V; Eigen::MatrixXi F; igl::readOBJ("F:\\project\\7-current_opt\\opt-cvt-3D\\data\\model\\cylinder.obj", V, F); std::cout << "V: " << V.rows() << " " << V.cols() << std::endl; std::cout << "F: " << F.rows() << " " << F.cols() << std::endl; CVTGenerator generator(V, F); int p_n = 10; std::vector samples; Eigen::AlignedBox3d box; box.min() = V.colwise().minCoeff(); box.max() = V.colwise().maxCoeff(); // random sample in bounding box for (int i = 0; i < p_n; ++i) { Eigen::Vector3d p; p.x() = box.min().x() + (box.max().x() - box.min().x()) * rand() / (RAND_MAX + 1.0); p.y() = box.min().y() + (box.max().y() - box.min().y()) * rand() / (RAND_MAX + 1.0); p.z() = box.min().z() + (box.max().z() - box.min().z()) * rand() / (RAND_MAX + 1.0); samples.push_back(p); std::cout << p.transpose() << std::endl; } std::vector cells = generator.get_patched_cvt(samples, 10); } };