本节介绍如何在矢体概念的基础上,逐步形成上述数据结构的一种方法。图2-1-2是块体单元识别方法的基本流程图。整个块体单元识别系统由7个子模块组成,分别是数据输入INPUT、点的信息生成POINT、边的信息生成LINE、面的信息生成FACE、体的信息生成BODY、结果输出OUTPUT以及图形显示DRAW。
图2-1-2 块体单元识别方法基本流程图
1.点的数据结构信息生成
每个点都由3个或3个以上的平面相交而成。如果考虑到不规则地形面,那么点也可以是两个或两个以上的平面与地形面的交点。因此,在计算出所有结构面(包括不规则地形面)彼此相交形成的交点坐标之后,即可生成所有点的数据结构信息。若计算出来的点有重复,则说明有4个或4个以上的结构面(包括不规则地形面)共点,这可以在点的结构面相关信息中反映出来。所有的顶点必须通过辅助性检查,以排除虚点。辅助性检查的主要内容有:①检查点是否在计算区域内;②检查点是否在地形面下;③检查点是否在结构面的真实出露范围内。
点的信息生成步骤如下:
(1)输入结构面资料和地形面资料。
(2)对地形面进行曲面拟合,并视为最后一个弯曲结构面。
(3)对结构面进行三重循环,每次选择3个结构面。
(4)若选出的是3个平面,则调用三平面求交子程序;若有地形面,则调用两平面与地形面求交子程序。
(5)若有交点,则对其进行辅助性检查;否则,返回步骤(3)。
(6)若不能通过辅助性检查,则返回步骤(3);否则,判断交点是否与已求出的顶点重合。
(7)若不重合,记录新顶点的信息,返回步骤(3);否则,修改重合点的结构面相关信息,返回步骤(3)。
(8)重复步骤(3)~(7),直到所有结构面循环完毕,然后输出所有顶点的信息。
(9)结束。
2.矢边的数据结构信息生成
在所有点的数据结构信息生成以后,即可进行矢边的数据结构信息生成。对所有位于同一条直线(两个结构面的交线)上的点,即所有同时与这两个结构面相关的点,进行排序,可以生成所有的矢边。同理,若生成的矢边有重复,则说明有3个或3个以上的结构面(包括不规则地形面)共边,这可以在矢边的结构面相关信息中反映出来。
矢边的信息生成步骤如下:
(1)输入顶点信息。
(2)对结构面进行两重循环,每次选择两个结构面。
(3)对所有顶点循环,找出同时与这两个结构面相关的顶点;若顶点数小于2,则返回步骤(2)。
(4)若两个结构面都是平面,调用直线上的点排序子程序,生成直线上所有的矢边,并记录新的矢边信息,然后返回步骤(2)。
(5)若有地形面,则调用曲线上的点排序子程序,生成曲线上所有的点,并记录新的矢边信息和离散点的信息,然后返回步骤(2)。
(6)重复步骤(2)~(5),直到所有结构面循环完毕,然后输出所有矢边的信息。
(7)结束。
3.矢面的数据结构信息生成
在所有边的数据结构信息生成以后,即可进行矢面的数据结构信息生成。对所有位于同一结构面或地形面上的边,即所有与这个结构面相关的边,按照逆时针旋转生成内角最小(即外角最大)的原则,进行首尾相接排序组合(图2-1-3)。当矢边组合已经闭合,满足矢面的完备性时,即成为一个面。由于可能存在多连通面,在矢面生成时还必须满足“无内点”这一附属条件。所谓“无内点”,就是矢面内不能有不是它的顶点的多余结点,即矢面内的所有结点要么是它的内边界顶点,要么是无效结点而被删除。
图2-1-3 矢面的识别
图2-1-4 结构面上的矢面
由于每个结构面上所有的边都将作为两个矢边(大小相等,方向相反)而被组合到矢面上,因此可以在结构面上将每条边记为结点顺序相反的两条边。例如,某个实际结构面上有n条边,则记为有2n条边,且第n+i(i=1,2,…,n)条边与第i条边的结点编号相反。然后给这2n条边定义一个导向参数(Orientation),初始值都等于1。当某条边作为一个矢边被组合到矢面上以后,其导向参数值就变为0。
当一个结构面上的每条边都被组合到矢面上以后,即其导向参数值都变为0时,该结构面上的矢面就生成完毕。然后去掉其中的一个虚拟矢面(结构面的外边界矢面)。图2-1-4中的一个结构面上共生成3个矢面:ABCDA、CEFDC和ADFECBA。由于矢面ADFECBA的面积为负值,而且其绝对值等于该结构面上的所有其他矢面面积之和,因此它是这个结构面的外边界矢面,是一个虚拟矢面,应该删除。故实际生成了两个矢面ABCDA和CEFDC。(www.xing528.com)
矢面的生成步骤如下:
(1)输入边的信息。
(2)对所有结构面进行循环。
(3)对所有的边循环,找出所有与这个结构面相关的边。将每条边记为两条边,然后给它们的导向参数赋初值1。
(4)选择一条导向参数为1的边作为初始活动边。
(5)以活动边的终点作为将要生成的新矢边的始点,活动边的导向参数值变为0。
1)找出所有以该点作为始点且导向参数等于1的边,分别计算它们与活动边逆时针旋转所形成的内角。
2)将形成内角最小的边作为新的活动边。
3)若新活动边的终点与初始活动边的始点相同,则生成了一个矢面;否则,返回步骤(5)。
(6)若所有的边的导向参数值都为0,则该结构面上的矢面生成结束;否则,返回步骤(4)。
(7)计算结构面上生成的矢面的面积。
1)判断它是否满足“无内点”条件。
2)若某矢面面积为负值,且其绝对值等于其他所有矢面面积的绝对值之和,则为虚拟矢面,将它删除。
3)若某矢面面积为负值,且其顶点都是另一矢面的内点,则形成多连通矢面。
(8)删除矢面中的无效边,计算矢面的面矢和各边矢,并记录结构面上矢面的信息,然后返回步骤(2)。
(9)重复步骤(2)~(8),直到结构面循环完毕,输出所有矢面的信息。
(10)结束。
4.矢体的数据结构信息生成
对所有生成的矢面,按照绕公共边逆时针旋转形成内角最小(即外角最大)的原则,进行首尾相接排序组合(图2-1-5)。当某个矢面组合已经闭合,满足矢体的完备性时,即生成一个矢体。矢体中的每条线段必须而且只能与该矢体中的两个矢面相关,这是检验矢体是否闭合的标准。
图2-1-5 矢体的识别
当每个面都被作为两个大小相等、方向相反的矢面,被组合到矢体上以后,矢体生成过程结束。因此,将每个面记为两个结点编号顺序相反,面矢相反的两个矢面,也给它们一个导向参数,初始值都为1。同样也存在虚拟矢体的问题,该虚拟矢体代表的是实际计算范围的整个外边界,其体积为负值,应该删除。
矢体生成的步骤如下:
(1)输入矢面的信息。
(2)选择一个导向参数值不为0的矢面作为初始活动面,并选择它上面的一条矢边作为活动边;初始活动面是待生成的矢体的第一个矢面元素。
(3)找出所有与活动边的反向线段相关且导向参数值不为0的矢面,分别计算它们与活动面绕活动边逆时针旋转形成的内角。
(4)选择形成内角最小的矢面作为待生成的矢体的新矢面元素,该矢面的导向参数值变为0。
(5)判断已知的矢面元素上是否还有矢边可以作为活动边。若没有,则待生成的矢体已闭合,新的矢体已生成;否则,以该边作为新的活动边,以活动边所在的矢面作为新的活动面,返回步骤(3)。
(6)检查新生成的矢体是否满足矢体的完备性,若不满足,则矢体生成失败,返回步骤(3)。
(7)计算新生成矢体的体积,若为负值,则是虚拟矢体,将其删除。
(8)若所有矢面的导向参数值都为0,则矢体生成结束;否则,返回步骤(2)。
(9)记录所有矢体的信息。
(10)结束。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。