You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

98 lines
2.4 KiB

// This file is part of libigl, a simple c++ geometry processing library.
//
// Copyright (C) 2020 Alec Jacobson <alecjacobson@gmail.com>
//
// This Source Code Form is subject to the terms of the Mozilla Public License
// v. 2.0. If a copy of the MPL was not distributed with this file, You can
// obtain one at http://mozilla.org/MPL/2.0/.
#include <igl/opengl/glfw/Viewer.h>
#include <igl/readMESH.h>
#include <igl/barycenter.h>
#include <igl/volume.h>
#include <igl/exploded_view.h>
#include <igl/colormap.h>
int main(int argc, char *argv[])
{
Eigen::MatrixXd V;
Eigen::MatrixXi T,F;
igl::readMESH(argc>1?argv[1]: TUTORIAL_SHARED_PATH "/octopus-low.mesh",V,T,F);
// Some per-tet data
Eigen::VectorXd D;
{
Eigen::MatrixXd BC;
igl::barycenter(V,T,BC);
Eigen::VectorXd vol;
igl::volume(V,T,vol);
const Eigen::RowVectorXd c = vol.transpose()*BC/vol.array().sum();
D = (BC.rowwise()-c).rowwise().norm();
}
// Plot the mesh
igl::opengl::glfw::Viewer viewer;
double t = 1;
double s = 1;
const auto update = [&]()
{
Eigen::MatrixXd EV;
Eigen::MatrixXi EF;
Eigen::VectorXi I,J;
igl::exploded_view(V,T,s,t,EV,EF,I,J);
Eigen::VectorXd DJ = D(J);
static bool first = true;
if(first)
{
viewer.data().clear();
viewer.data().set_mesh(EV,EF);
first = false;
}else
{
viewer.data().set_vertices(EV);
}
viewer.data().set_face_based(true);
Eigen::MatrixXd C;
igl::colormap(igl::COLOR_MAP_TYPE_VIRIDIS,DJ,true,C);
viewer.data().set_colors(C);
};
int mod = 0;
float prev_y;
viewer.callback_mouse_move = [&](igl::opengl::glfw::Viewer &, int x, int y)->bool
{
if((mod & IGL_MOD_SHIFT)||(mod & IGL_MOD_ALT))
{
if(mod & IGL_MOD_SHIFT)
{
t = std::min(std::max(t+0.001*(y-prev_y),1.),2.);
}
if(mod & IGL_MOD_ALT)
{
s = std::min(std::max(s+0.001*(y-prev_y),0.),1.);
}
prev_y = y;
update();
return true;
}
return false;
};
// get modifier
viewer.callback_key_down =
[&](igl::opengl::glfw::Viewer &, unsigned char key, int _mod)->bool
{
prev_y = viewer.current_mouse_y;
mod = _mod;
return false;
};
viewer.callback_key_up =
[&](igl::opengl::glfw::Viewer &, unsigned char key, int _mod)->bool
{
mod = _mod;
return false;
};
update();
viewer.launch();
}