具体实施方式
考虑到三维图形显示加速硬件最终是把复杂的三维模型转换为三角形来显示的,它的基本显示对象单元就是三角形,所以把多边形转换为三角形来显示是最直接和高效的方法。本发明是一种在三维图形显示加速设备上实现的二维地图背景的显示方案,把多边形的背景数据拆分为多个三角形显示出来后,显示效果保持不变。
下面结合附图进一步详述本发明。
实施分为两个步骤:
其一、在数据编译阶段,把多边形背景数据(多边形顶点数组)转换为对应的小三角形数据(多个三角形集合数组),并保存在定义的三角形背景数据格式文件中。本步骤是对二维地图背景数据的加工,其中的多边形背景数据按照顺序编号,并将编号和其对应的一组三角形背景数据一一对应。
其二、在数据使用阶段,根据要显示的多边形编号在三角形背景数据格式文件中查找到对应的三角形数据,用三维图形显示加速设备显示出来。本步骤包括对二维地图背景数据的解析,即从二维地图背景数据格式文件中读取和解析数据;以及二维地图背景数据的三维表现,即把解析后的数据用三维图形显示加速设备显示成三维背景图形。
上述各步骤均用软件实现,并一起配套组合成为一种完整的二维地图背景在三维图形显示加速设备上的显示解决方案。
其中的多边形转三角形的工作过程的说明:
在图1中,描述多边形转三角形的工作流程。步骤S1输入多边形背景数据,然后转到S2。步骤S2把重复的顶点从多边形背景数据中删除,然后转到S3。步骤S3统计多边形顶点数目,然后转到S4。步骤S4如果多边形顶点的数目少于3,则退出并提示多边形数据错误,否则转到S5(包括S5a和S5b)。步骤S5a在多边形数据中检查是否有边相交(见图4说明)的情况发生,如果有边相交的情况则退出并提示多边形数据错误,否则转到S5b。步骤S5b进行多边形到三角形的转换(见图2说明),然后转到S6。步骤S6输出转换后的三角形数据,最后退出。
在图2中,描述多边形转三角形的算法流程。步骤S501输入处理后多边形数据和多边形顶点数目。步骤S502判断多边形顶点数目是否为4,如果顶点数目为4则转到S504,否则转到S503。步骤S503判断多边形顶点数目是否为3,如果顶点数目为3则转到S506,否则转到S505。步骤S504进行四边形转三角形转换(见图3说明),转换完成后结束流程。步骤S505设置考察顶点为多边形的第一个顶点,并转到S507。步骤S506登记三角形,并结束流程。步骤S507获取考察顶点的非相邻的最短距离的顶点,再转到S509。步骤S509如果考察线段(这里的考察线段是指由当前考察顶点和它的非相邻的最短距离的顶点所形成的线段)与多边形的任一条边不相交,则转到S511,否则转到S510。步骤S511如果考察线段的中点在多边形内则转到S512,否则转到S510。步骤S510如果考察完所有的多边形顶点,则错误退出,否则转到S508。步骤S508设置考察顶点为多边形的下一个顶点,转到S507。步骤S512,以当前的考察线段为公共边把多边形转换成为两个多边形,转到S513。步骤S513转回至S501,嵌套调用多边形转换算法,分别转换两个多边形,转换完成后结束。
在图3中,描述四边形转三角形的算法流程。输入四边形顶点数据后,然后考察一对非相邻顶点,判断该对非相邻顶点的连线的中点是否在四边形内,如果其中点在四边形内,则以此对非相邻顶点的连线为公共边分割四边形为两个三角形,并分别登记分割后的这两个三角形;如果其中点不在四边形内,则考察另一对非相邻顶点的连线的中点是否在四边形内,如果该中点在四边形内,则以该对非相邻顶点的连线为公共边分割四边形为两个三角形,并分别登记分割后的这两个三角形,如果该中点仍然不在四边形内,则报错退出。
在图4中,说明多边形发生边相交的情况。如果多边形的两条非邻边所确定的直线相交于唯一的一点,且交点不在这两条边的延长线上,则认为这两条边相交。如图所示,多边形的边A1B1、C1D1相交。出现边相交的多边形不能做从多边形到三角形的转换。
在图5中,说明多边形中的一对可拆分顶点。如图所示,多边形A2B2C2D2E2F2G2H2I2,其中A2F2为一对可拆分顶点。对于多边形中的任选一个顶点A2,找到与A2点距离最短的非相邻顶点F2,如果线段A2F2不于多边形的任一条边相交,且线段A2F2的中点在多边形内,则可判定顶点A2、F2为一对可拆分顶点。以一对多边形可拆分顶点所组成的线段为公共边,可以把多边形分割为两个独立的小多边形。
在图6中,说明多边形A3B3C3D3E3F3G3H3I3转换为三角形后的结果。转换过程如表1所示:
表1多边形转三角形过程示例1
序号 |
考察顶点 |
考察多边形 |
考察多边形的顶点数为3 |
考察顶点最短距离非相邻顶点 |
考察线段与考察多边形的边相交 |
考察线段的中点在考察多边形内。 |
第一多边形 |
第二多边形 |
得到三角形 |
1 |
A3 |
A3B3C3D3E3F3G3H3I3 |
否 |
C3 |
否 |
是 |
A3B3C3 |
A3C3D3E3F3G3H3I3 |
A3B3C3 |
2 |
C3 |
A3C3D3E3F3G3H3I3 |
否 |
H3 |
否 |
是 |
A3C3H3I3 |
C3D3E3F3G3H3 |
无 |
3 |
A3 |
A3C3H3I3 |
是 |
H3 |
不检查 |
是 |
A3C3H3 |
H3I3A3 |
A3C3H3H3I3A3 |
3 |
C3 |
C3D3E3F3G3H3 |
否 |
E3 |
否 |
是 |
C3D3E3 |
C3E3F3G3H3 |
无 |
5 |
C3 |
C3E3F3G3H3 |
否 |
G3 |
否 |
否 |
无 |
无 |
无 |
6 |
E3 |
C3E3F3G3H3 |
否 |
H3 |
否 |
是 |
C3E3H3 |
E3F3G3H3 |
C3E3H3 |
7 |
E3 |
E3F3G3H3 |
是 |
G3 |
不检查 |
是 |
E3F3G3 |
E3G3H3 |
E3F3G3、E3G3H3 |
在图7中,说明多边形A4B4C4D4E4F4G4H4I4转换为三角形后的结果。转换过程如表2所示:
表2多边形转三角形过程示例2
序号 |
考察顶点 |
考察多边形 |
考察多边形的顶点数为3 |
考察顶点最短距离非相邻顶点 |
考察线段与考察多边形的边相交 |
考察线段的中点在考察多边形内。 |
第一多边形 |
第二多边形 |
得到三角形 |
1 |
A4 |
A4B4C4D4E4F4G4H4I4 |
否 |
H4 |
否 |
否 |
无 |
无 |
无 |
2 |
B4 |
A4B4C4D4E4F4G4H4I4 |
否 |
D4 |
否 |
是 |
B4C4D4 |
A4B4D4E4F4G4H4I4 |
B4C4D4 |
3 |
B4 |
A4B4D4E4F4G4H4I4 |
否 |
I4 |
否 |
是 |
B4I4A4 |
B4D4E4F4G4H4I4 |
B4I4A4 |
3 |
B4 |
B4D4E4F4G4H4I4 |
否 |
H4 |
否 |
否 |
无 |
无 |
无 |
4 |
D4 |
B4D4E4F4G4H4I4 |
否 |
I4 |
否 |
是 |
B4D4I4 |
D4E4F4G4H4I4 |
B4D4I4 |
6 |
D4 |
D4E4F4G4H4I4 |
否 |
H4 |
否 |
是 |
D4H4I4 |
D4E4F4G4H4 |
D4H4I4 |
7 |
D4 |
D4E4F4G4H4 |
否 |
F4 |
否 |
是 |
D4E4F4 |
D4F4G4H4 |
D4E4F4 |
8 |
D4 |
D4F4G4H4 |
是 |
G4 |
不检查 |
否 |
无 |
无 |
无 |
序号 |
考察顶点 |
考察多边形 |
考察多边形的顶点数为3 |
考察顶点最短距离非相邻顶点 |
考察线段与考察多边形的边相交 |
考察线段的中点在考察多边形内。 |
第一多边形 |
第二多边形 |
得到三角形 |
9 |
F4 |
D4F4G4H4 |
是 |
H4 |
不检查 |
是 |
F4G4H4 |
F4H4D4 |
F4G4H4、F4H4D4 |
在图8中,说明了一种三角形背景数据文件格式,用于保存和索引在数据编译后的与原多边形背景数据相对应的小三角形数据。该文件格式从文件起始到末尾依次包括文件头、地址分配表和三角形数据区。
三角形背景数据文件格式说明依次见表3~表5:
表3三角形背景数据文件的文件头
序号 |
项目 |
字节长度 |
数据格式 |
内容说明 |
1 |
文件标识符 |
4 |
字符串 |
固定为字符串”TRIB” |
2 |
多边形个数N |
4 |
无符号整形 |
|
3 |
经度数据的字节宽度 |
4 |
无符号整形 |
|
4 |
纬度数据的字节宽度 |
4 |
无符号整形 |
|
5 |
地址分配表的起始地址 |
4 |
无符号整形 |
|
6 |
三角形数据区起始地址 |
4 |
无符号整形 |
|
表4三角形背景数据文件的地址分配表
序号 |
项目 |
字节长度 |
数据格式 |
内容说明 |
1 |
多边形背景编号1 |
4 |
无符号整形 |
|
2 |
编号1的多边形背景对应的三角形个数M1 |
4 |
无符号整形 |
|
3 |
编号1的多边形背景三角形数据区起始地址 |
4 |
无符号整形 |
|
4 |
多边形背景编号2 |
4 |
无符号整形 |
|
5 |
编号2的多边形背景对应的三角形个数M2 |
4 |
无符号整形 |
|
6 |
编号2的多边形背景三角形数据区起始地址 |
4 |
无符号整形 |
|
序号 |
项目 |
字节长度 |
数据格式 |
内容说明 |
... |
... |
... |
... |
|
3*N |
多边形背景编号N |
4 |
无符号整形 |
|
3*N+1 |
编号N的多边形背景对应的三角形个数Mn |
4 |
无符号整形 |
|
3*N+2 |
编号N的多边形背景三角形数据区起始地址 |
4 |
无符号整形 |
|
表5三角形背景数据文件的三角形数据格式
序号 |
多边形背景编号 |
角形编 |
三角形顶点编 |
项目 |
字节长度 |
内容说明 |
1 |
1 |
1 |
1 |
经度和纬度数据 |
8 |
经度和纬度数据都是无符号整形数,各占4个字节。 |
2 |
1 |
1 |
2 |
经度和纬度数据 |
8 |
|
3 |
1 |
1 |
3 |
经度和纬度数据 |
8 |
|
4 |
1 |
2 |
1 |
经度和纬度数据 |
8 |
|
5 |
1 |
2 |
2 |
经度和纬度数据 |
8 |
|
6 |
1 |
2 |
3 |
经度和纬度数据 |
8 |
|
... |
... |
... |
... |
... |
... |
|
3*M1 |
1 |
M1 |
1 |
经度和纬度数据 |
8 |
|
3*M1+1 |
1 |
M1 |
2 |
经度和纬度数据 |
8 |
|
3*M1+2 |
1 |
M1 |
3 |
经度和纬度数据 |
8 |
|
... |
... |
... |
... |
... |
... |
|
1 |
M |
1 |
1 |
经度和纬度数据 |
8 |
|
序号 |
多边形背景编号 |
角形编 |
三角形顶点编 |
项目 |
字节长度 |
内容说明 |
2 |
M |
1 |
2 |
经度和纬度数据 |
8 |
|
3 |
M |
1 |
3 |
经度和纬度数据 |
8 |
|
4 |
M |
2 |
1 |
经度和纬度数据 |
8 |
|
5 |
M |
2 |
2 |
经度和纬度数据 |
8 |
|
6 |
M |
2 |
3 |
经度和纬度数据 |
8 |
|
... |
... |
... |
... |
... |
... |
|
3*Mn |
M |
Mn |
1 |
经度和纬度数据 |
8 |
|
3*Mn+1 |
M |
Mn |
2 |
经度和纬度数据 |
8 |
|
3*Mn+2 |
M |
Mn |
3 |
经度和纬度数据 |
8 |
|
附注:
1)无符号整数的长度为4个字节,取值范围是从0到232-1,其值的计算公式为:字节0的值*223+字节1的值*216+字节2的值*28+字节3的值;
2)三角形背景数据的查找方法是根据多边形的编号在三角形背景数据文件的地址分配表中查找到对应的三角形数据的起始地址和三角形的个数,然后再从三角形数据区指定的数据起始地址读取到三角形数据。