发明内容
本发明的目的在于提供自动绘制斜坡线方法和装置,以解决上述的问题。
在本发明的实施例中提供了一种自动绘制斜坡线方法,包括步骤:
步骤A,绘制斜坡线的坡顶线、坡底线并显示,所述坡顶线为多条有向线段组成的折线段,有向线段的连接点为节点;
步骤B,依次遍历所述节点和所述节点两侧的坡面线,获取坡面线与坡面线相交的第一坡面线集合和坡面线与坡底线相交的第二坡面线集合以及无相交的坡面线的第三坡面线集合;
步骤C,将所述第一坡面线集合和所述第二坡面线集合中的坡面线进行剪枝后绘制并显示,将第三坡面线集合的坡面线直接绘制并显示。
其中,所述步骤B中依次遍历所述节点和所述节点两侧的坡面线,获取坡面线与坡面线相交的第一坡面线集合,包括步骤:
步骤B1,遍历所述节点,判断遍历是否结束,结束,则执行步骤C,否,则执行步骤B2;
步骤B2,判断由当前节点连接的有向线段的方向夹角大小是否小于180°,是,则执行步骤B3,否,则跳过当前节点,继续遍历后续节点;
步骤B3,依据用户指定的地形图斜坡线图式得到坡面线间隔,根据坡面线数量=有向线段长度/坡面线间隔,计算当前节点两侧坡面线数量;
步骤B4,遍历坡面线数量相对多的一侧的坡面线,判断遍历是否结束,是,则返回执行步骤B1,否,则执行步骤B5;
步骤B5,判断当前坡面线是否与当前节点另一侧的坡面线相交,相交则保存当前坡面线和与之相交的坡面线的线序号及节点序号,并添加到所述第一坡面线集合中,并跳转到当前侧的下一条坡面线的判断,不相交则循环判断当前坡面线是否与另一侧的下一条坡面线相交,相交则保存当前坡面线和与之相交的坡面线的线序号和节点序号,并添加到所述第一坡面线集合中,并跳转到下一条坡面线继续判断。
其中,所述步骤B中依次遍历所述节点和所述节点两侧的坡面线,获取坡面线与坡面线相交的第一坡面线集合,还包括步骤:
步骤B6,循环判断当前坡面线是否与下一节点的另一侧坡面线相交,相交则保存当前坡面线和与之相交的坡面线的线序号和节点序号,并添加到所述第一坡面线集合中,不相交则跳到下一个节点并重复步骤B6。
其中,所述步骤B中获取坡面线与坡底线相交的第二坡面线集合和无相交的坡面线的第三坡面线集合,包括步骤:
步骤B7,当判定当前坡面线与后续所有节点的另一侧的坡面线都不相交时,则判断此坡面线是否与坡底线相交,相交则将当前坡面线添加到所述第二坡面线集合,否则添加到所述第三坡面线集合,并跳转到下一坡面线重复步骤B7。
其中,所述步骤B7中判断当前坡面线是否与坡底线相交,包括步骤:
检测坡顶线和坡底线构成的最小外包多边形;
当当前坡面线与所述最小外包多边形相交,则判定该坡面线与坡底线相交,否,则判定无相交。
其中,所述步骤B1之前还包括步骤:
为每一条坡面线分配线序号进行标记,为每一个节点分配节点序号进行标记。
本发明还提供一种自动绘制斜坡线装置,包括绘制模块和获取模块;
所述绘制模块,用于绘制斜坡线的坡顶线、坡底线并显示,并将所述第一坡面线集合和所述第二坡面线集合中的坡面线进行剪枝后绘制并显示,将第三坡面线集合的坡面线直接绘制并显示;
所述获取模块,用于依次遍历所述节点和所述节点两侧的坡面线,获取坡面线与坡面线相交的第一坡面线集合和坡面线与坡底线相交的第二坡面线集合以及无相交的坡面线的第三坡面线集合。
其中,所述获取模块,用于:
遍历所述节点,判断遍历是否结束,结束,则执行后续步骤,否,则判断由当前节点连接的有向线段的方向夹角大小是否小于180°,否,则跳过当前节点,继续遍历后续节点;是,则依据用户指定的地形图斜坡线图式得到坡面线间隔,根据坡面线数量=有向线段长度/坡面线间隔,计算当前节点两侧坡面线数量;遍历坡面线数量相对多的一侧的坡面线,判断遍历是否结束,是,则返回执行前述步骤,否,则判断当前坡面线是否与当前节点另一侧的坡面线相交,相交则保存当前坡面线和与之相交的坡面线的线序号及节点序号,并添加到所述第一坡面线集合中,并跳转到当前侧的下一条坡面线的判断,不相交则循环判断当前坡面线是否与另一侧的下一条坡面线相交,相交则保存当前坡面线和与之相交的坡面线的线序号和节点序号,并添加到所述第一坡面线集合中,并跳转到下一条坡面线继续判断。
其中,所述获取模块,还用于:
循环判断当前坡面线是否与下一节点的另一侧坡面线相交,相交则保存当前坡面线和与之相交的坡面线的线序号和节点序号,并添加到所述第一坡面线集合中,不相交则跳到下一个节点并重复判断。
其中,所述获取模块,还用于:
当判定当前坡面线与后续所有节点的另一侧的坡面线都不相交时,则判断此坡面线是否与坡底线相交,相交则将当前坡面线添加到所述第二坡面线集合,否则添加到所述第三坡面线集合,并跳转到下一坡面线重复判断。
本发明上述实施例的自动绘制斜坡线方法和装置,通过遍历节点以及节点两侧的坡面线,获取坡面线之间相交的坡面线集合以及坡面线与破底线相交的坡面线集合,并对这些集合进行剪枝处理,这样无需人工干预,绘制出的坡面线就是经过剪枝处理后的较为到位的坡面线,减少了人工剪枝的工作量。
具体实施方式
下面通过具体的实施例子并结合附图对本发明做进一步的详细描述。
本发明实施例提供了一种自动绘制斜坡线方法,参见图1所示,包括步骤:
步骤S10:绘制斜坡线的坡顶线、坡底线并显示。
所述坡顶线为多条有向线段组成的折线段,有向线段的连接点为节点。即所述绘制的坡顶线和坡底线是由多个节点构成的有向折线。
步骤S11:依次遍历所述节点和所述节点两侧的坡面线,获取坡面线与坡面线相交的第一坡面线集合和坡面线与坡底线相交的第二坡面线集合以及无相交的坡面线的第三坡面线集合。
优选地,作为一种可实施方式,第一坡面线集合和第二坡面线集合通过如下方式获取:
步骤S111,遍历所述节点,判断遍历是否结束,结束,则执行步骤S12,否,则执行步骤S112。
步骤S112,判断由当前节点连接的有向线段的方向夹角大小是否小于180°,是,则执行步骤S113,否,则跳过当前节点,继续遍历后续节点。
步骤S113,依据用户指定的地形图斜坡线图式得到坡面线间隔,根据坡面线数量=有向线段长度/坡面线间隔,计算当前节点两侧坡面线数量。
步骤S114,遍历坡面线数量相对多的一侧的坡面线,判断遍历是否结束,是,则返回执行步骤S111,否,则执行步骤S115。
步骤S115,判断当前坡面线是否与当前节点另一侧的坡面线相交,相交则保存当前坡面线和与之相交的坡面线的线序号及节点序号,并添加到所述第一坡面线集合中,并跳转到当前侧的下一条坡面线的判断,不相交则循环判断当前坡面线是否与另一侧的下一条坡面线相交,相交则保存当前坡面线和与之相交的坡面线的线序号和节点序号,并添加到所述第一坡面线集合中,并跳转到下一条坡面线继续判断。
优选地,应预先为每一条坡面线分配线序号进行标记,为每一个节点分配节点序号进行标记。即,所述线序号,为坡面线的编号,用于区分不同的坡面线,所述节点序号,为节点的编号,用于区分不同的节点。
步骤S116,循环判断当前坡面线是否与下一节点的另一侧坡面线相交,相交则保存当前坡面线和与之相交的坡面线的线序号和节点序号,并添加到所述第一坡面线集合中,不相交则跳到下一个节点并重复步骤S116。
步骤S117,当判定当前坡面线与后续所有节点的另一侧的坡面线都不相交时,则判断此坡面线是否与坡底线相交,相交则将当前坡面线添加到所述第二坡面线集合,否则添加到所述第三坡面线集合,并跳转到下一坡面线重复步骤S117。
步骤S12:将所述第一坡面线集合和所述第二坡面线集合中的坡面线进行剪枝后绘制并显示,将第三坡面线集合的坡面线直接绘制并显示。
下面再对上述步骤进行整体性描述:
首先,遍历构成坡顶线的节点集合,如果遍历结束,则跳到步骤S12。依据地形图斜坡线图式得到坡面线间隔,计算当前节点左右两侧坡面线数量;遍历坡面线数量多的一侧坡面线,如果遍历结束则返回最开始的步骤。
判断此坡面线是否与节点另一侧的坡面线相交,相交则保存此组坡面线序号及节点序号,并跳转到下一条坡面线,否则循环判断此坡面线是否与另一侧的下一条坡面线相交,如果相交则保存此组坡面线,并跳转到下一条坡面线继续判断。
循环判断此坡面线是否与下一节点的另一侧坡面线相交,相交则保存此组坡面线,否则跳到下一个节点并重复此步骤。
如果之前的步骤中判定的此坡面线与后续所有节点另一侧的坡面线都不相交,则判断此坡面线是否与坡底线相交,如果相交则将此坡面线保存到与坡底线相交的坡面线集合,否则保存到无相交的坡面线集合,并跳转到下一条坡面线重复此步骤。
遍历有相交的坡面线组集合,剪枝后进行绘制,遍历与坡底线相交的坡面线集合,剪枝后进行绘制,遍历无需剪枝的坡面线集合,直接进行绘制,最终生成一条美观的斜坡线。
其中需要注意的是,绘制坡面线时,必须依据斜坡线图式的坡面线间隔,以及当前的地图比例尺进行绘制,绘制一条美观的坡面线有三种可能情况,情况一是此坡面线与其他坡面线相交,情况二是此坡面线与坡底线相交,情况三是此坡面线无相交,其中情况一需保存有相交的一组坡面线,情况二和情况三则只需保存此条坡面线。
在判断坡面线与坡面线是否相交时,由于绘制的坡面线垂直于坡顶线,所以某个节点同侧的坡面线不会相交,因此如果绘制的是等长坡面线,可首先判断节点两侧的第一组坡面线是否有相交,无相交则可直接跳到判断坡面线与坡底线是否相交的步骤,如果绘制的是长短相间的坡面线,可首先判断此节点两侧各两条坡面线是否有相交,无相交同样可直接跳到判断坡面线与坡底线是否相交的步骤,有相交则保存此组坡面线到有相交的坡面线组集合,并继续遍历此节点一侧的坡面线;如果此坡面线与另一侧的坡面线无相交,则需判断此坡面线是否与后续节点的某侧坡面线是否有相交,有相交则保存此组坡面线到有相交的坡面线组集合,无相交则同样可直接跳到判断坡面线与坡底线是否相交的步骤;其中后续节点的选择依据是,当前坡面线所处的折线段与后续节点某侧的折线段构成的方向夹角小于180°。
其中,判断坡面线与坡底线是否相交,采用的是判断坡面线是否与坡顶线及坡底线构成的最小外包多边形有相交,有相交则保存此坡面线到与坡底线相交的坡面线集合,否则保存到无相交的坡面线集合。
生成一条美观的坡面线,必须对有相交的一组坡面线延长部分进行剪枝,以及对与坡底线的坡面线延长部分进行剪枝。
列举一个具体示例,对本发明的实施步骤作进一步说明,参见图2所示。
第一步为绘制斜坡线的坡顶线和坡底线,如附图2所示。
其中,坡顶线为自左向右的有向折线段构成,其中节点记为Di,i∈(1,3),折线段记为Li,i∈(1,4),坡面线记为Pi,i∈(1,14)。
第二步为遍历构成坡顶线的节点集合,获取有相交的坡面线组集合,获取与坡底线相交的坡面线集合,以及获取无相交的坡面线集合,第二步包括以下子步骤:
2.1)遍历构成坡顶线的节点集合,如果遍历结束,则跳到步骤2.6)。例如,首先判断构成节点的方向夹角大小是否小于180°,当节点为D1时,执行下一步,当循环到D2时,由于方向夹角大于180°,则跳到节点D3继续执行下一步。
2.2)依据地形图斜坡线图式得到坡面线间隔,计算当前节点左右两侧坡面线数量,坡面线数量=折线段长度/坡面线间隔。例如,D1节点左侧的坡面线数量=4,右侧的坡面线数量=2。
2.3)遍历坡面线数量多的一侧坡面线,如果遍历结束则跳到步骤2.1)。例如,由于节点D1左侧坡面线数量>右侧的坡面线数量,因此选择首先遍历D1左侧的坡面线,并且从离节点最近的坡面线p4开始,进行递减循环遍历。
2.4)判断此坡面线是否与节点另一侧的坡面线相交,相交则保存此组坡面线序号及节点序号,并跳转到下一条坡面线重复步骤2.3),否则循环判断此坡面线是否与另一侧的下一条坡面线相交,如果相交则保存此组坡面线,并跳转到下一条坡面线重复步骤2.3)。例如,首先判断p4与p5是否相交,并保存一组坡面线,记为pairList[(p4,p5)],同样判断p3与p6是否相交,添加并保存为pairList[(p4,p5),(p3,p6)]。
2.5)循环判断此坡面线是否与下一节点的另一侧坡面线相交,相交则保存此组坡面线,否则跳到下一个节点并重复步骤2.5)。例如,判断坡面线p2的相交情况,首先判断有向折线段L1与节点D2的有向折线段L3无相交,跳到有向折线段L4,L1与L4的方向夹角小于180°,因此开始遍历L4的所有坡面线,并判断p2是否与L4的坡面线有相交,保存并记为pairList[(p4,p5),(p3,p6),(p2,p13)]。
2.6)如果步骤2.4)判定的此坡面线与后续所有节点另一侧的坡面线都不相交,则判断此坡面线是否与坡底线相交,如果相交则将此坡面线保存到与坡底线相交的坡面线集合,否则保存到无相交的坡面线集合,并跳转到下一条坡面线重复步骤2.6)。例如,p1与坡底线无相交,保存并记为wxjList[p1],此时L1的坡面线遍历结束,则跳到下一节点继续重复子步骤2.1),p14与坡底线有相交,保存并记为xjList[p14]。
3)遍历有相交的坡面线组集合,剪枝后进行绘制,遍历与坡底线相交的坡面线集合,剪枝后进行绘制,遍历无需剪枝的坡面线集合,直接进行绘制,最终生成一条美观的斜坡线。
例如,循环坡面线组集合pairList中的所有元素并进行剪枝绘制,循环坡面线组集合xjList中的所有元素并进行剪枝绘制,循环并绘制wxjList中的所有坡面线。
该具体示例的流程图参见图3所示。其中,坡顶线是由有向折线段组成,坡面线集合分为三种类型,分别是:两两相交的坡面线:与坡底线相交的坡面线:无相交的坡面线。
判断是否遍历完位于Li的坡面线时,假设当节点的左右两侧折线段分别为Li,Lj并且Li的坡面线数量大于Lj的坡面线数量。
本发明还提供一种自动绘制斜坡线装置,参见图4所示,包括绘制模块1和获取模块2。
所述绘制模块1,用于绘制斜坡线的坡顶线、坡底线并显示,并将所述第一坡面线集合和所述第二坡面线集合中的坡面线进行剪枝后绘制并显示,将第三坡面线集合的坡面线直接绘制并显示。
所述获取模块2,用于依次遍历所述节点和所述节点两侧的坡面线,获取坡面线与坡面线相交的第一坡面线集合和坡面线与坡底线相交的第二坡面线集合以及无相交的坡面线的第三坡面线集合。
所述获取模块2,用于:
遍历所述节点,判断遍历是否结束,结束,则执行后续步骤,否,则判断由当前节点连接的有向线段的方向夹角大小是否小于180°,否,则跳过当前节点,继续遍历后续节点;是,则依据用户指定的地形图斜坡线图式得到坡面线间隔,根据坡面线数量=有向线段长度/坡面线间隔,计算当前节点两侧坡面线数量;遍历坡面线数量相对多的一侧的坡面线,判断遍历是否结束,是,则返回执行前述步骤,否,则判断当前坡面线是否与当前节点另一侧的坡面线相交,相交则保存当前坡面线和与之相交的坡面线的线序号及节点序号,并添加到所述第一坡面线集合中,并跳转到当前侧的下一条坡面线的判断,不相交则循环判断当前坡面线是否与另一侧的下一条坡面线相交,相交则保存当前坡面线和与之相交的坡面线的线序号和节点序号,并添加到所述第一坡面线集合中,并跳转到下一条坡面线继续判断。
所述获取模块2,还用于:
循环判断当前坡面线是否与下一节点的另一侧坡面线相交,相交则保存当前坡面线和与之相交的坡面线的线序号和节点序号,并添加到所述第一坡面线集合中,不相交则跳到下一个节点并重复判断。
优选地,所述获取模块2,还用于:
当判定当前坡面线与后续所有节点的另一侧的坡面线都不相交时,则判断此坡面线是否与坡底线相交,相交则将当前坡面线添加到所述第二坡面线集合,否则添加到所述第三坡面线集合,并跳转到下一坡面线重复判断。
本方法充分利用了计算机图形学的方法,避免遍历所有坡面线的相交关系,并通过保存坡面线的相交关系,大大提高了无相交斜坡线的绘制效率。本方法在使用计算机制作地形图中的应用前景较为广阔。
显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。