计算机图形学实验七:交互显示测地线

#include <igl/readOBJ.h>
#include <igl/readOFF.h>
#include <igl/opengl/glfw/Viewer.h>
#include <igl/png/readPNG.h>
#include <igl/exact_geodesic.h>
#include <igl/parula.h>
#include <igl/unproject_onto_mesh.h>
#include <iostream>
#include <igl/isolines_map.h>
#include <igl/PI.h>
#include <igl/png/writePNG.h>
#include "stdafx.h"
#include "geodesic_mesh.h"
#include "geodesic_algorithm_exact.h" 


Eigen::MatrixXd V;
Eigen::MatrixXi F;
igl::opengl::glfw::Viewer viewer;
Eigen::Matrix<unsigned char, Eigen::Dynamic, Eigen::Dynamic> R, G, B, A;

char OBJfile_name[] = "D:/0Graphics/exp7/kitten_simplified.obj";
char PNGfile_name[] = "D:/0Graphics/exp7/MyColorBar2.png";

void update_distance(int vid) {
    Eigen::VectorXd d;
    std::cout << "Computing geodesic distance to vertex " << vid << "..." << std::endl;

    std::vector<double> points;
    std::vector<unsigned> faces;
    std::vector<int> realIndex;
    int originalVertNum = 0;
    // Load Mesh
    bool success = geodesic::read_mesh_from_file(OBJfile_name, points, faces, realIndex, originalVertNum);
 
    // Build Mesh
    geodesic::Mesh mesh;
    mesh.initialize_mesh_data(points, faces);		//create internal mesh data structure including edges

    geodesic::GeodesicAlgorithmExact algorithm(&mesh);
    // Propagation
    algorithm.propagate(vid);	//cover the whole mesh

    algorithm.print_statistics();
    d.resize(mesh.vertices().size(), 1);
    for (unsigned i = 0; i < mesh.vertices().size(); ++i)
    {
        d(i) = mesh.vertices()[i].geodesic_distance();
        
    }
    // Plot the mesh

    viewer.data().set_mesh(V, F);
    viewer.core().align_camera_center(V);
    viewer.data().show_texture = true;
    viewer.data().set_texture(R, G, B);
    viewer.data().set_data(d);
}




int main(int argc, char* argv[])
{
   
	igl::readOBJ(OBJfile_name, V, F);
	igl::png::readPNG(PNGfile_name,R,G,B,A);
    // Plot a distance when a vertex is picked
    viewer.callback_mouse_down =
        [&](igl::opengl::glfw::Viewer& viewer, int, int)->bool
    {
        int fid;
        Eigen::Vector3f bc;
        // Cast a ray in the view direction starting from the mouse position
        double x = viewer.current_mouse_x;
        double y = viewer.core().viewport(3) - viewer.current_mouse_y;
        if (igl::unproject_onto_mesh(Eigen::Vector2f(x, y),viewer.core().view,viewer.core().proj,viewer.core().viewport,V,F,fid,bc))
        {
            int max;
            bc.maxCoeff(&max);
            int vid = F(fid, max);
            update_distance(vid);
            return true;
        }
        return false;
    };
    viewer.data().set_mesh(V, F);
    viewer.data().show_lines = false;

    std::cout << "Click on mesh to define new source.\n" << std::endl;
	viewer.launch();
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值