Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >CGAL::Surface_mesh_parameterization:按原来的顺序将顶点写为off

CGAL::Surface_mesh_parameterization:按原来的顺序将顶点写为off
EN

Stack Overflow用户
提问于 2019-02-06 05:36:23
回答 1查看 560关注 0票数 0

我试图修改CGAL-4.13/examples/Surface_mesh_parameterization/lscm.cpp,以便生成的off文件中顶点的顺序与输入文件中的顺序相同。

更新:示例

获取具有以下简单内容的文件input.off

代码语言:javascript
运行
AI代码解释
复制
OFF
4 2 0
-0.9310345 0.4333333 0 
-1 0.4333333 0 
-0.9310345 0.5 0 
-1 0.5 0 
3 1 0 2
3 2 3 1

当我从CGAL调用标准lscm

代码语言:javascript
运行
AI代码解释
复制
/path/to/CGAL-4.13-build/examples/Surface_mesh_parameterization/lscm input.off

我获得了包含coords.off

代码语言:javascript
运行
AI代码解释
复制
OFF
4 2 0
-1 0.5 0
-0.931034 0.5 0
-0.931034 0.433333 0
-1 0.433333 0
3 3 2 1
3 1 0 3

uvmap.off

代码语言:javascript
运行
AI代码解释
复制
OFF
4 2 0
-0.0166567 0.982769 0
1 1 0
1.01666 0.0172311 0
0 0 0
3 3 2 1
3 1 0 3

文件coords.offuvmap.off以相同的顺序包含顶点及其参数对(与input.off中的不同)。相反,我希望uvmap.off中的参数按与input.off对应的顺序排列。特别是,我希望uvmap.off看起来像这样:

代码语言:javascript
运行
AI代码解释
复制
OFF
4 2 0
1.01666 0.0172311 0
0 0 0
1 1 0
-0.0166567 0.982769 0
3 1 0 2
3 2 3 1

基本上,这使得coords.off变得多余,因为我可以在它的角色中使用input.off

解决方案的努力

据我所知,通过使用6个参数(而不是4个参数)调用output_uvmap_to_off(...) (这两个版本都可以在CGAL-4.13/include/CGAL/Surface_mesh_parameterization/IO/File_off.h中找到),这是可能的。由于其中一个参数是VertexIndexMap,我可能也应该使用

代码语言:javascript
运行
AI代码解释
复制
CGAL::Surface_mesh_parameterization::LSCM_parameterizer_3< TriangleMesh_, BorderParameterizer_, SolverTraits_ >::parameterize(...)

而不是

代码语言:javascript
运行
AI代码解释
复制
CGAL::Surface_mesh_parameterization::parameterize(...)

在示例中使用。

下面是一个很小的例子(不是很好用)。它是从lscm.cpp派生出来的,但为了保持简洁,我抛弃了很多东西。

代码语言:javascript
运行
AI代码解释
复制
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/boost/graph/Seam_mesh.h>
#include <CGAL/Surface_mesh_parameterization/IO/File_off.h>
#include <CGAL/Surface_mesh_parameterization/parameterize.h>
#include <CGAL/Surface_mesh_parameterization/Two_vertices_parameterizer_3.h>
#include <CGAL/Surface_mesh_parameterization/LSCM_parameterizer_3.h>
#include <CGAL/Polygon_mesh_processing/measure.h>
#include <boost/foreach.hpp>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>

typedef CGAL::Simple_cartesian<double>      Kernel;
typedef Kernel::Point_2                     Point_2;
typedef Kernel::Point_3                     Point_3;
typedef CGAL::Surface_mesh<Kernel::Point_3> SurfaceMesh;
typedef boost::graph_traits<SurfaceMesh>::edge_descriptor SM_edge_descriptor;
typedef boost::graph_traits<SurfaceMesh>::halfedge_descriptor SM_halfedge_descriptor;
typedef boost::graph_traits<SurfaceMesh>::vertex_descriptor SM_vertex_descriptor;
typedef SurfaceMesh::Property_map<SM_halfedge_descriptor, Point_2> UV_pmap;
typedef SurfaceMesh::Property_map<SM_edge_descriptor, bool> Seam_edge_pmap;
typedef SurfaceMesh::Property_map<SM_vertex_descriptor, bool> Seam_vertex_pmap;
typedef CGAL::Seam_mesh<SurfaceMesh, Seam_edge_pmap, Seam_vertex_pmap> Mesh;
typedef boost::graph_traits<Mesh>::vertex_descriptor vertex_descriptor;
typedef boost::graph_traits<Mesh>::halfedge_descriptor halfedge_descriptor;
typedef boost::graph_traits<Mesh>::face_descriptor face_descriptor;

namespace SMP = CGAL::Surface_mesh_parameterization;

int main(int argc, char** argv)
{
  std::ifstream in_mesh((argc>1) ? argv[1] : "data/lion.off");
  if(!in_mesh){
    std::cerr << "Error: problem loading the input data" << std::endl;
    return EXIT_FAILURE;
  }

  SurfaceMesh sm;
  in_mesh >> sm;

  Seam_edge_pmap seam_edge_pm = sm.add_property_map<SM_edge_descriptor, bool>("e:on_seam", false).first;
  Seam_vertex_pmap seam_vertex_pm = sm.add_property_map<SM_vertex_descriptor, bool>("v:on_seam", false).first;

  Mesh mesh(sm, seam_edge_pm, seam_vertex_pm);
  UV_pmap uv_pm = sm.add_property_map<SM_halfedge_descriptor, Point_2>("h:uv").first;

  halfedge_descriptor bhd = CGAL::Polygon_mesh_processing::longest_border(mesh, CGAL::Polygon_mesh_processing::parameters::all_default()).first;

  typedef SMP::Two_vertices_parameterizer_3<Mesh>                Border_parameterizer;
  typedef SMP::LSCM_parameterizer_3<Mesh, Border_parameterizer>  Parameterizer;

  // Here's where the big changes start.
  SurfaceMesh::Property_map<SM_halfedge_descriptor, int> vimap = sm.add_property_map<SM_halfedge_descriptor, int>("h:vi").first;
  SurfaceMesh::Property_map<SM_halfedge_descriptor, bool> vpmap = sm.add_property_map<SM_halfedge_descriptor, bool>("h:vp").first;
  Parameterizer parameterizer;
  parameterizer.parameterize(mesh, bhd, uv_pm, vimap, vpmap);

  const char* uvmap_file = "uvmap.off";
  std::ofstream uvmap_out(uvmap_file);
  SMP::IO::output_uvmap_to_off(mesh,sm.vertices(),sm.faces(),uv_pm,vimap,uvmap_out);

  return EXIT_SUCCESS;
}

这不编译,抱怨在File_off.h的第131行上需要进行转换。

实际问题

  • vimap是否正确初始化?
  • 这是朝着我的目标,以同样的顺序写顶点的合理方向吗?
  • 如果是,如何将正确的参数传递给output_uvmap_to_off(...)?例如,它请求一个VertexContainer,而我提供了一个Vertex_range (因此产生了编译错误,我想)。我是应该按照建议的这里这里收集顶点,还是有更优雅的方法?
  • 如果没有,什么是正确的行动方针?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-27 08:03:52

下面的问题回答了这个问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54554910

复制
相关文章
\[vscode issue\] Golang Debug 无法命中断点
Kevinello
2023/10/18
6391
\[vscode issue\] Golang Debug 无法命中断点
MySQL的order by该如何避免“未命中索引“
  要学会如何使用,你先要搞清楚:1、怎么看SQL是否用上了索引;2、怎么写SQL能避开出错点。
陈哈哈
2022/05/31
2.6K0
MySQL的order by该如何避免“未命中索引“
GPU编程(四): 并行规约优化
如果之前没有用过gdb, 可以速学一下, 就几个指令. 想要用cuda-gdb对程序进行调试, 首先你要确保你的gpu没有在运行操作系统界面, 比方说, 我用的是ubuntu, 我就需 要用sudo service lightdm stop关闭图形界面, 进入tty1这种字符界面. 当然用ssh远程访问也是可以的. 接下来, 使用第二篇中矩阵加法的例子. 但是注意, 编译的使用需要改变一下, 加入-g -G参数, 其实和gdb是相似的.
sean_yang
2019/03/04
1.7K1
GPU编程(四): 并行规约优化
CUDA编程.内核调用
首先我说一下什么叫内核,这里的内核很狭义就是ANSI C关键字+CUDA扩展关键字编写的设备代码~
云深无际
2021/03/12
9460
CUDA编程.内核调用
Unity3D 判断点击命中物体对象和命中环境
一个大的空对象包含很多小的物体,在大的空对象上面添加一个脚本,这个脚本核心就是通过 Update 方法里面拿到鼠标点击,判断当前是不是点击这个对象
林德熙
2022/08/12
4180
linux内核断点调试入门
上篇文章 编译一个默认输出hello world的linux内核 中,我们已经知道如何编译一个可以自运行的linux内核,这篇文章我们来看下如何对内核进行断点调试。
KINGYT
2020/04/13
3.5K0
GIS算法—判断点在面内
牛老师讲GIS
2023/05/27
7790
GIS算法—判断点在面内
CUDA编程之线程模型
一个kernel结构如下:Kernel<<>>(param1, param2, …)
AI异构
2020/07/29
2.8K0
CUDA编程之线程模型
CUDA编程.配置内核参数+API函数
为了我们获得并行能力,需要做一些配置CIA可以,这个配置在内核启动中写。它们指定了Grid中块的数量,和每一个块中线程的数量。每个快上面有512或者1024个线程。
云深无际
2021/03/12
7490
CUDA编程.配置内核参数+API函数
CUDA 02 - 逻辑模型
CUDA逻辑模型是异构模型, 需要CPU和GPU协同工作. 在CUDA中, host和device是两个重要概念, host是指CPU及其内存, device是指GPU及其内存. 典型的CUDA程序的执行流程如下:
Reck Zhang
2021/08/11
5290
CUDA 02 - 逻辑模型
腾讯云CDN+日志服务统计URL未命中top10
文章参考自官方文档,但无奈官方文档写的demo未联合说明怎么改,顺便mark下来做记录
105号运维实习生
2020/11/13
1.5K2
腾讯云CDN+日志服务统计URL未命中top10
使用显卡程序加速(opencl、cuda)
CPU使用冯诺依曼结构,缓存大,处理单元少 GPU处理图像每个像素可以单独处理,缓存小,处理单元很多
sofu456
2020/12/08
1.4K0
AI部署篇 | CUDA学习笔记1:向量相加与GPU优化(附CUDA C代码)
GPU并不是一个独立运行的计算平台,而需要与CPU协同工作,也可以把GPU看成是CPU的协处理器,因此当在说GPU并行计算时,其实是指的基于CPU+GPU的异构计算架构。在异构计算架构中,GPU与CPU通过PCIe总线连接在一起进行协同工作,CPU所在位置称为为主机端(host),而GPU所在位置称为设备端(device),如下图所示。
集智书童公众号
2022/01/05
2.8K0
AI部署篇 | CUDA学习笔记1:向量相加与GPU优化(附CUDA C代码)
新手,想用Nisight调试CUDA代码,但断点无效怎么破?
新手,刚接触CUDA编程,搭好了环境,想用nsight来调试,在vs里面,在核函数里面设置了断点,用CUDA Debugging,但断点就是不生效,电脑左下角会弹出Night 连接成功,程序跑完后,Night会提示Disconnected 整个电脑环境: 显卡: GF GTX1050 CPU: i3-4170 3.70GH 硬盘: 2T 软件:VS2013 + CUDA9.1 + Nsight 5.4 GPU世界论坛 bbs.gpuworld.cn Hi, 楼主, 这个
GPUS Lady
2018/04/24
3.2K0
《GPU高性能编程 CUDA实战》(CUDA By Example)读书笔记
写在最前 这本书是2011年出版的,按照计算机的发展速度来说已经算是上古书籍了,不过由于其简单易懂,仍旧被推荐为入门神书。先上封面: 由于书比较老,而且由于学习的目的不同,这里只介绍了基础
用户1148523
2018/01/09
2.9K0
《GPU高性能编程 CUDA实战》(CUDA By Example)读书笔记
CUDA-GDB安装+环境配置
在GPU上开发大规模并行应用程序时,需要一个调试器,GDB调试器能够处理系统中每个GPU上同时运行的数千个线程。CUDA-GDB提供了无缝的调试体验,可以同时调试应用程序的CPU和GPU部分。
云深无际
2021/03/12
2.6K0
CUDA-GDB安装+环境配置
CUDA编程.打印
首先是注意,所有的cuda代码都是cu的后缀 #include<iostream> #include<cuda_runtime.h> __global__ void myfirstkernel(voi
云深无际
2021/03/12
7470
CUDA编程.打印
判断点在多边形内算法的C++实现
判断平面内点是否在多边形内有多种算法,其中射线法是其中比较好理解的一种,而且能够支持凹多边形的情况。该算法的思路很简单,就是从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。如下图所示:
charlee44
2019/08/13
6.1K0
DAY36:阅读”执行空间&扩展修饰符
B. C Language Extensions B.1. Function Execution Space Specifiers Function execution space specifiers denote whether a function executes on the host or on the device and whether it is callable from the host or from the device. B.1.1. __device__ The __dev
GPUS Lady
2018/06/25
5460
Udacity并行计算课程笔记-The GPU Programming Model
一、传统的提高计算速度的方法 faster clocks (设置更快的时钟) more work over per clock cycle(每个时钟周期做更多的工作) more processors(更多处理器) 二、CPU & GPU CPU更加侧重执行时间,做到延时小 GPU则侧重吞吐量,能够执行大量的计算 更形象的理解就是假如我们载一群人去北京,CPU就像那种敞篷跑车一样速度贼快,但是一次只能坐两个人,而GPU就像是大巴车一样,虽然可能速度不如跑车,但是一次能载超多人。 总结起来相比于CPU,GPU有
marsggbo
2018/01/23
1.2K0
Udacity并行计算课程笔记-The GPU Programming Model

相似问题

CUDA __global__函数未调用

13

断点未命中

40

Firebug -断点未命中

1123

未命中javascript断点

59

MonoDevelop -断点未命中

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档