三维重建项目文档2.0

三维重建二维转三维担架部分项目文档2.0

1. 总体概览

1.1 输入

每个担架的三视图的杆件及对应的二维坐标

杆件ID: [左端点(x,y),右端点(x,y)]

  • 正视图:coordinatesFront_data
  • 底视图:coordinatesBottom_data
  • 顶视图:coordinatesOverhead_data
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
coordinatesFront_data={
106:[(646.0281930611799,342.53768195250086),(660.2590727783954,613.9408879879702)],
105:[(203.7373011800923,347.7106748399989),(620.4367599213521,639.6744403396317)],
103:[(240.64789004321037,885.0975728601636),(1088.2557311595408,337.3654300449176)],
101:[(203.7373011800923,347.7106748399989),(1088.2557311595408,337.3654300449176)],
}
coordinatesBottom_data={
119:[(630.1258693028335,518.7340651761596),(1278.9278879433205,620.6886681053786)],
103:[(310.11096106234515,725.8634556230776),(983.3900198457354,290.0841295496858)],
104:[(784.4021660422503,1254.0464061958883),(1278.9278879433205,620.6886681053786)],
118:[(983.3900198457354,290.0841295496858),(1018.1405904800162,954.6887929303084)],
116:[(626.3346511498411,521.1879280583553),(784.4021660422503,1254.0464061958883)],
117:[(310.11096106234515,725.8634556230776),(1018.6215195146591,954.0728489822498)],
}
coordinatesOverhead_data={
102:[(96.6401359210612,475.9291642161667),(961.9289558665229,611.903121636168)],
108:[(98.2077827818514,1150.819369486731),(552.7310243183496,547.6005895357405)],
110:[(556.2979668323961,1077.868239473998),(961.9289558665229,611.903121636168)],
101:[(98.2077827818514,1150.819369486731),(964.1463078156362,1012.9181523853322)],
109:[(96.6401359210612,475.9291642161667),(551.1408795062896,1078.6895086500524)],
111:[(560.3147685231477,548.7923207679231),(964.1463078156362,1012.9181523853322)],
112:[(961.9289558665229,611.903121636168),(964.1463078156362,1012.9181523853322)],
}

1.2 输出

输出分两部分:

  • 节点的三维信息:(节点编号:X坐标,Y坐标,Z坐标,对称性)
  • 杆件的三维信息:(杆件编号:起点节点,终点节点,对称性)

1.2.1 对称性

节点和杆件的对称性

  • 0:代表没有对称性,就这一个单独的节点/杆件
  • 1:左右对称(对称性1)
  • 2:前后对称(对称性2)
  • 3:关于Z轴对称(对称性3)
  • 4:以及四角对称(对称性4)

1.2.2 XYZ坐标的表示

  • 一类节点(一类杆件的两个端点):真实的(x,y,z)三维坐标表示
  • 二类节点(非一类节点):x坐标用真实值(y,z)分别用一类杆件的两个端点节点编号表示(引用表示法)

1.2.3 XYZ坐标轴的方向

  • X轴:从左往右
  • Y轴:从前往后
  • Z轴:从上到下

2. 构建步骤

整体分为两大部分:

  1. 只有两根主杆的:以前图纸以及直流塔的 01、02 号担架:使用 xintrans.py 中的通用重建流程。
  2. 有不止两根主杆的:直流塔的 03、04、05、06 号复合担架:总调度仍在 xintrans.py,正视图的特殊骨架和二类结构由 zhiliu_near_front_reconstruction.py 处理,底视图、顶视图以及三类结构尽量复用通用流程。

2.0 流程图

通用重建流程

直流塔复合担架重建流程

2.1 通用重建流程

针对只有两根主杆(一类杆件)的担架

2.1.1 一类杆件和一类节点的重建

A. 找到确定一类杆件

  • 找到两根最长的杆件并且这两根杆件的编号最小,则认为是两根主杆

B. 生成一类节点

也就是生成两根一类杆件的两个端点的三维节点坐标

  1. 塔身连接点
  • 两根正视图一类杆件的连接端直接复用 pj 中由塔身传入的节点编号和真实三维坐标,不重复创建新节点。
  1. 尖点
    • 两根一类杆件端点的相交点,得到真实的三维(x,y,z)
1
2
3
4
5
6
7
尖点由 `calc_jiandian_xyz()` 计算,基本路线如下:

1. 在用于标定的底视图或顶视图中,分别计算两根一类杆件起点的中点和终点的中点。
2. 两个中点之间的像素距离表示担架从塔身连接端到尖端的轴向长度。
3. 一类杆件在塔身连接侧的像素半宽,与 `pj` 中连接点的实际横向坐标绝对值共同确定“真实长度/像素长度”的比例。
4. 根据担架位于塔身左侧还是右侧,沿正或负方向计算尖点真实 X。
5. 尖端剩余半宽乘比例得到真实 Y;真实 Z 沿用对应上连接点或下连接点的 Z。

C. 生成一类杆件信息

正视图的两根一类杆件分别连接:

  • 上连接点与尖点;
  • 下连接点与尖点。

底视图、顶视图识别出的两根杆主要作为同一空间骨架在不同视图中的投影基准,用来确定节点和其他杆件,不在通用分支中重复添加为新的实体主杆。

2.1.2 二类杆件和二类节点的重建

A. 查找并计算二类节点

遍历当前视图中除两根一类杆件以外的所有杆件:

  1. 两个端点都在一类杆件上的杆件为二类杆件
  2. 为这些端点生成三维节点信息

二类节点保存(引用表示法):

  • X:按二维比例计算得到的真实值;
  • Y、Z:以字符串形式引用该节点所在一类杆件的两个真实端点。

B. 生成二类杆件

将二类节点的二维位置重新与当前视图所有杆件端点匹配,建立“杆件编号 → 节点编号列表”的映射。只有恰好匹配到两个端点节点的杆件才写入输出。

2.1.3 三类杆件和三类节点的重建

A. 找出尚未生成的杆件

比较当前视图二维杆件编号和本视图已经生成的二类杆件编号,并排除一类杆件。剩余杆件作为三类杆件候选。

B. 找到三类节点并计算三类节点

检查每根候选杆件的二维端点是否落在:

  • 已生成的二类杆件上;
  • 当前视图的两根一类杆件上。

对于真正的新交点,代码沿基准一类杆件的二维范围进行比例换算,得到真实 X,并用该交点所在已有杆件的两个端点编号表达另外两个坐标引用。

C. 生成三类杆件

新生成的三类节点再次与二维杆件端点匹配。仅当候选三类杆件最终拥有两个不同的有效节点时,才生成杆件记录。

2.1.4 底视图和顶视图同理构建

2.2 直流塔复合担架重建流程

直流塔由 03 和 04 组成一套复合担架,右侧由 05 和 06 组成一套复合担架

正视图

  1. 一类节点和一类杆件:确定三根主杆(分为两根一类主杆和一根一类副杆),生成真实三维xyz的一类节点,生成一类杆件信息

  1. 二类节点和二类杆件:划分为两片需要处理的框架,处理逻辑和以前一样
    • 水平主杆与斜主杆之间;
    • 水平主杆与一类副杆之间。

底视图和顶视图复用以前的代码逻辑