欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > CAD-Tool笔记1 正交投影重建 c++ 顶点处理

CAD-Tool笔记1 正交投影重建 c++ 顶点处理

2025/6/17 11:29:13 来源:https://blog.csdn.net/njsgcs/article/details/148606284  浏览:    关键词:CAD-Tool笔记1 正交投影重建 c++ 顶点处理

https://github.com/manishtanwar/CAD-Tool

manishtanwar/CAD-Tool | DeepWik

https://github.com/manishtanwar/CAD-Tool/blob/master/doc/Mathematical_Model.pdf

https://www.sciencedirect.com/science/article/abs/pii/0010448594900205?via%3Dihub

markdown在线转jpg - www.strerr.com

左乘行变换

  第3视角

define

.

核心转换函数

CAD-Tool使用two_d_to_three_d函数来执行从2D到3D的转换: 2d__to__3d_8h.html:112-113

该函数接受两个参数:

  • file: 包含2D正交视图数据的输入文件路径
  • outFile: 生成3D模型的输出文件路径(.obj格式)

输入数据格式

系统需要特定格式的文本文件,包含三个正交视图(顶视图、前视图、侧视图)的数据: README.md:73-87

每个顶点需要提供在三个视图中的2D坐标:

  • 顶视图投影坐标 (t.x, t.y)
  • 前视图投影坐标 (f.x, f.y)
  • 侧视图投影坐标 (s.x, s.y)

转换过程

转换过程包含以下步骤:

  1. 数据解析: 从输入文件读取顶点和边的信息
  2. 坐标变换: 应用坐标系转换 v.x = -b, v.y = a
  3. 对象构建: 创建object_2d对象存储三个视图的数据
  4. 3D重建: 通过Object_3d构造函数执行几何重建算法
  5. 输出生成: 将结果写入OBJ格式文件

输出格式

系统生成标准的Wavefront OBJ格式文件: README.md:111-120

输出包含:

  • 顶点坐标 (v x y z)
  • 面定义 (f v1 v2 v3...)

相关头文件和依赖

从源码结构可以看出,Object_3d.cpp 包含了实现这些算法所需的关键头文件: _object__3d_8cpp.html:95-103

这些头文件对应重建过程中的关键算法:

  • planar_graph_generator.h: 平面图生成算法
  • faceloop_generator.h: 面环生成算法
  • body_loop.h: 实体部分生成算法
  • general_methods.h: 通用几何计算方法

 

输入 

205 0
5 0
0 05 3
5 0
3 02 3
2 0
3 02 5
2 0
5 05 5
5 0
5 05 6
5 0
6 00 6
0 0
6 00 0
0 0
0 05 2
5 2
2 25 3
5 2
3 22 3
2 2
3 22 5
2 2
5 25 5
5 2
5 25 6
5 2
6 20 6
0 2
6 20 2
0 2
2 20 2
0 5
2 55 2
5 5
2 55 0
5 5
0 50 0
0 5
0 513
0 6 5 6
5 6 5 5
5 5 2 5
2 5 2 3
2 3 5 3
5 3 5 2
5 2 0 2
0 2 0 6
0 2 0 0
0 0 0 6
0 0 5 0
5 0 5 2
5 0 5 314
0 0 2 0
0 0 5 0
2 0 5 0
0 2 2 2
0 2 5 2
2 2 5 2
0 5 5 5
0 0 0 2
0 0 0 5
0 2 0 5
2 0 2 2
5 0 5 2
5 0 5 5
5 2 5 518
0 0 0 5
2 5 2 2
3 2 3 0
5 2 5 0
6 2 6 0
0 5 2 5
0 0 3 0
0 0 5 0
0 0 6 0
3 0 5 0
3 0 6 0
5 0 6 0
2 2 3 2
2 2 5 2
2 2 6 2
3 2 5 2
3 2 6 2
5 2 6 2

这是CAD工具的输入文件格式,用于描述3D几何体的顶点和边的连接关系。

文件格式结构

这个格式包含三个主要部分:

1. 顶点定义部分

开头的数字20表示总共有20个顶点,然后每3行定义一个顶点的x、y、z坐标:

5 0  <- x坐标  
5 0  <- y坐标    
0 0  <- z坐标  

input:1-5

2. 边连接定义部分

接下来的数字131418分别表示三个不同视图或投影中的边数量,每行用四个数字定义一条边,格式为:

起点x 起点y 终点x 终点y  

例如:0 6 5 6表示从点(0,6)到点(5,6)的一条边。 input:83-96

3. 多个投影视图

这个格式支持多个投影视图的定义,每个视图都有自己的边集合,用于从不同角度描述同一个3D对象。 input:98-112

用途

这种格式被CAD工具用于:

  • 2D到3D的转换处理
  • 几何体的多视图表示
  • 边界表示(B-rep)建模

Notes

这个输入格式在CAD-Tool项目的测试文件中广泛使用,类似的格式也出现在其他测试文件中,如input1input2_Tetrahedron_Pyramid等,都遵循相同的结构模式:顶点数量→顶点坐标→边数量→边连接关系。


是的,这确实是一个顶点的3D坐标。

在CAD-Tool的2D到3D转换输入格式中,每个顶点用连续的三行来定义其在三个不同视图中的投影坐标:

5 0  <- 顶视图投影 (top view projection)  
5 0  <- 前视图投影 (front view projection)    
0 0  <- 侧视图投影 (side view projection)  

input:3-5

根据README文档的说明,这种格式的结构是: README.md:76-87

所以5 0, 5 0, 0 0这三行表示第一个顶点V(0)在三个正交视图中的投影坐标:

  • 在顶视图中的坐标是(5, 0)
  • 在前视图中的坐标是(5, 0)
  • 在侧视图中的坐标是(0, 0)

通过这三个投影坐标,CAD工具可以重建出该顶点在3D空间中的实际位置。


你问的0 6 5 6是CAD-Tool输入文件中边的定义格式。

边的定义格式

在2D到3D转换的输入文件中,13表示顶视图中有13条边,接下来的每一行定义一条边:

0 6 5 6  

这表示从坐标点(0,6)到坐标点(5,6)的一条边。格式是:

  • 第1个数字:起点的x坐标 (0)
  • 第2个数字:起点的y坐标 (6)
  • 第3个数字:终点的x坐标 (5)
  • 第4个数字:终点的y坐标 (6) input:83-84

在文件格式中的位置

根据README文档的说明,这种边定义出现在2D到3D输入格式的边连接部分: README.md:89-94

所以0 6 5 6就是顶视图中第一条边,连接(0,6)和(5,6)两个点。

Notes

这个边定义格式在CAD-Tool的所有2D到3D测试输入文件中都是一致的,用于描述各个视图中线段的连接关系,帮助系统重建3D几何体的拓扑结构。

inFile>>a>>b

Object_3d::Object_3d(object_2d o)
{add_vertices(o.T_vertices, o.F_vertices, o.S_vertices);decision_tree(o);RER();std::vector< Full_plane > f_list;f_list = planar_graph_generator(v3d_list, e3d_list);std::vector< face_loop > face_loop_list;for(auto z : f_list){std::vector< face_loop > qface_loop_list;qface_loop_list = generate_face_loops(z.p, z.vertices_on_it, z.edges_on_it, v3d_list);for(auto zz : qface_loop_list){face_loop_list.pb(zz);}}std::vector< body_loop > body_loop_list = generate_body_loop(face_loop_list, v3d_list);for(int i=0;i<(int)body_loop_list[0].face_loop_list.size();i++){//side_of_face_loopfor(auto zz : body_loop_list[0].face_loop_list[i].basic_loop_list){std::vector<int> add_loop; add_loop.pb(zz.edge_list[0].f);for(auto z1 : zz.edge_list){add_loop.pb(z1.s);}if(zz.inner)std::reverse(add_loop.begin(), add_loop.end());if(body_loop_list[0].side_of_face_loop[i])std::reverse(add_loop.begin(), add_loop.end());surface_list.pb(add_loop);}}
}

不是三角面

v 5 0 0
v 5 3 0
v 2 3 0
v 2 5 0
v 5 5 0
v 5 6 0
v 0 6 0
v 0 0 0
v 5 2 2
v 5 3 2
v 2 3 2
v 2 5 2
v 5 5 2
v 5 6 2
v 0 6 2
v 0 2 2
v 0 2 5
v 5 2 5
v 5 0 5
v 0 0 5
f 6 7 8 1 2 3 4 5 6 
f 6 5 4 3 2 1 8 7 6 
f 2 3 11 10 2 
f 2 10 11 3 2 
f 3 4 12 11 3 
f 3 11 12 4 3 
f 4 5 13 12 4 
f 4 12 13 5 4 
f 6 7 15 14 6 
f 6 14 15 7 6 
f 14 15 16 9 10 11 12 13 14 
f 14 13 12 11 10 9 16 15 14 
f 16 9 18 17 16 
f 16 17 18 9 16 
f 5 6 14 13 5 
f 9 10 2 1 19 18 9 
f 5 13 14 6 5 
f 9 18 19 1 2 10 9 
f 17 18 19 20 17 
f 17 20 19 18 17 
f 15 16 17 20 8 7 15 
f 15 7 8 20 17 16 15 
f 1 8 20 19 1 
f 1 19 20 8 1 

freecad会先处理成mesh 

obj导出

# FreeCAD v1.0 build0 Arch module
# https://www.freecad.org
mtllib 1-_________001.mtl
o _________001
usemtl color_cccce6
v 5.0 0.0 3.0
v 0.0 0.0 0.0
v 5.0 0.0 0.0
v 2.0 0.0 3.0
v 0.0 0.0 6.0
v 5.0 0.0 5.0
v 5.0 0.0 6.0
v 2.0 0.0 5.0
v 0.0 -5.0 0.0
v 5.0 -5.0 0.0
v 5.0 -2.0 3.0
v 2.0 -2.0 3.0
v 2.0 -2.0 5.0
v 5.0 -2.0 5.0
v 0.0 -2.0 6.0
v 5.0 -2.0 6.0
v 0.0 -2.0 2.0
v 5.0 -2.0 2.0
v 0.0 -5.0 2.0
v 5.0 -5.0 2.0
f 1 2 3
f 4 2 1
f 5 6 7
f 8 2 4
f 5 8 6
f 5 2 8
f 9 3 10
f 2 3 9
f 11 4 12
f 1 4 11
f 13 4 12
f 8 4 13
f 13 6 14
f 8 6 13
f 15 7 16
f 5 7 15
f 11 17 18
f 12 17 11
f 15 14 16
f 13 17 12
f 15 13 14
f 15 17 13
f 19 18 20
f 17 18 19
f 14 7 16
f 6 7 14
f 3 20 10
f 11 3 1
f 3 18 20
f 18 3 11
f 9 20 10
f 19 20 9
f 15 2 5
f 9 17 19
f 17 2 15
f 2 17 9

转solid可以编辑 

它的3d数据是点边的,不是obj的点面

20
-5 0 0 
-5 3 0 
-2 3 0 
-2 5 0 
-5 5 0 
-5 6 0 
0 6 0 
0 0 0 
-5 2 -2 
-5 3 -2 
-2 3 -2 
-2 5 -2 
-5 5 -2 
-5 6 -2 
0 6 -2 
0 2 -2 
0 2 -5 
-5 2 -5 
-5 0 -5 
0 0 -5 30
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 0
8 9
9 10
10 11
11 12
12 13
13 14
14 15
15 8
16 17
17 18
18 19
19 16
7 19
0 18
8 17
15 16
1 9
2 10
3 11
4 12
5 13
6 14

不想写了

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词