一种家装设计图的区域合并方法及系统转让专利

申请号 : CN201910949760.X

文献号 : CN110781541B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 陈旋周海王洪建

申请人 : 江苏艾佳家居用品有限公司

摘要 :

本发明公开了一种家装设计图的区域合并方法及系统,属于计算机辅助设计技术领域。本发明可以让用户在家装设计过程中,对设计师手绘制后的客厅,餐厅区域进行有效合并,避免因为精度误差而引起客餐厅合并时出现的多边形不闭合,多边形不是单一合并区域,或者引起多边形线条错乱的问题,可以便捷地支持客餐厅相关的业务。当然该技术不仅仅局限在客餐厅区域,可以拓展到任意两个相邻的多边形。

权利要求 :

1.一种家装设计图的区域处理方法,其特征在于,包括如下步骤:

步骤a,获取通过手绘得到的户型图中的餐厅和客厅的多边形区域数据,所述的区域数据中包括房间轮廓线段以及线段上的端点;

步骤b,对餐厅多边形上的每个点进行遍历,执行如下操作:计算每个点到客厅多边形的每一条边的距离,并得到每个点与客厅多边形的线段之间最短的距离,当所述的最短的距离小于设定第一阈值时,将满足条件的点归于待选交点集合中;

步骤c,对客厅多边形上的每个点进行遍历,执行如下操作:计算每个点到餐厅多边形的每一条边的距离,并得到每个点与餐厅多边形的线段之间最短的距离,当满足以下条件:(1)所述的最短的距离小于设定第一阈值时,(2)每个点与步骤b中得到的待选交点集合中所有的点的距离大于第二阈值;将满足条件(1)和条件(2)的点归于待选交点集合中;

步骤d,对步骤c中得到的待选交点集合中的点的数目进行计算,如果数量是2个,则进入步骤e,如果数量是3个,则进入步骤f;

步骤e,删除掉餐厅和客户相互贴合且平行的两条线段,并将餐厅和客厅多边形剩余的点按照顺时针或逆时针顺序依次连接,使餐厅和客户多边形合并;

步骤f,删除掉餐厅和客户相互贴合且平行的两条线段,删除掉待选交点集合中的相互紧贴的点,再将餐厅和客厅多边形剩余的点按照顺时针或逆时针顺序依次连接,使餐厅和客户多边形合并。

2.根据权利要求1所述的家装设计图的区域处理方法,其特征在于,所述的第一阈值是

5cm;所述的第二阈值是3.5‑4cm。

3.根据权利要求1所述的家装设计图的区域处理方法,其特征在于,步骤e中,相互贴合且平行的判定中,贴合是指相互距离小于5cm,相互平行是指相互之间的直线夹角是0‑2°。

4.根据权利要求1所述的家装设计图的区域处理方法,其特征在于,步骤f中,相互紧贴是指点和点之间的距离小于5cm。

5.一种家装设计图的区域处理系统,其特征在于,包括:

区域数据获取模块,用于获取通过手绘得到的户型图中的餐厅和客厅的多边形区域数据,所述的区域数据中包括房间轮廓线段以及线段上的端点;

餐厅交点获取模块,用于对餐厅多边形上的每个点进行遍历,执行如下操作:计算每个点到客厅多边形的每一条边的距离,并得到每个点与客厅多边形的线段之间最短的距离,当所述的最短的距离小于设定第一阈值时,将该点归于待选交点集合中;

客厅交点获取模块,对客厅多边形上的满足条件的点每个点进行遍历,执行如下操作:计算每个点到餐厅多边形的每一条边的距离,并得到每个点与餐厅多边形的线段之间最短的距离,当满足以下条件:(1)所述的最短的距离小于设定第一阈值时,(2)每个点与步骤b中得到的待选交点集合中所有的点的距离大于第二阈值;将满足条件(1)和条件(2)的点归于待选交点集合中;

分类模块,用于对待选交点集合中的点的数目进行计算,如果数量是2个,则通过第一合并模块处理;如果数量是3个,则通过第二合并模块处理;

第一合并模块,用于删除掉餐厅和客户相互贴合且平行的两条线段,并将餐厅和客厅多边形剩余的点按照顺时针或逆时针顺序依次连接,使餐厅和客户多边形合并;

第二合并模块,用于删除掉餐厅和客户相互贴合且平行的两条线段,删除掉待选交点集合中的相互紧贴的点,再将餐厅和客厅多边形剩余的点按照顺时针或逆时针顺序依次连接,使餐厅和客户多边形合并。

6.根据权利要求5所述的家装设计图的区域处理系统,其特征在于,所述的第一阈值是

5cm;所述的第二阈值是3.5‑4cm。

7.根据权利要求5所述的家装设计图的区域处理系统,其特征在于,第一合并模块中,相互贴合且平行的判定中,贴合是指相互距离小于5cm,相互平行是指相互之间的直线夹角是0‑2°。

8.根据权利要求5所述的家装设计图的区域处理系统,其特征在于,第二合并模块中,相互紧贴是指点和点之间的距离小于5cm。

9.一种计算机可读取介质,其特征在于,记载有可以运行权利要求1所述的家装设计图的区域处理方法的程序。

说明书 :

一种家装设计图的区域合并方法及系统

技术领域

[0001] 本发明公开了一种家装设计图的区域合并方法及系统,属于计算机辅助设计技术领域。

背景技术

[0002] 家装设计过程中每个空间区域跟业务密切相关,对于独立空间区域(即与其它区域不存在交接点),其空间以及对应的业务相对容易衔接,但是对于客餐厅,通常是相连接在一起,设计师出于在业务层考虑,通常手动绘制出客厅的交接线以及餐厅的交接线;但是,在家装软件的展示过程、软装的自动生成过程等步骤中,往往是需要将餐厅和客厅作为一个整体来考虑的,主要是由于这两个功能区域较为接近,且没有明显的墙体分隔,并且在装饰风格上需要近似。因此,在家装设计软件中,需要将这两个功能区域进行合并之后,进行整体设计、效果展示、耗材计算等。
[0003] 但是,从而由于人为手绘的原因,常常引起误差,软件不能较好地识别出家装设计师的手绘效果;并且,不同的户型中,餐厅和客厅的形状、位置等关系都有较大的区别,这就造成客厅与餐厅区域合并为一个整体空间区域时造成困难。

发明内容

[0004] 本发明的目的是:针对现有的家装软件不能有效地识别由设计师手绘得到的户型图中餐厅和客厅的相互之间的图形位置关系,导致不能有效地实现这两者之间的空间合并。
[0005] 本发明提供了一种基于设计师手绘的户型图中餐厅和客厅的区域合并方法,本方法能够有效地针对不同的户型情况下的餐厅和客厅边界的识别与合并。
[0006] 技术方案如下:
[0007] 一种家装设计图的区域处理方法,包括如下步骤:
[0008] 步骤a,获取通过手绘得到的户型图中的餐厅和客厅的多边形区域数据,所述的区域数据中包括房间轮廓线段以及线段上的端点;
[0009] 步骤b,对餐厅多边形上的每个点进行遍历,执行如下操作:计算每个点到客厅多边形的每一条边的距离,并得到每个点与客厅多边形的线段之间最短的距离,当所述的最短的距离小于设定第一阈值时,将该点归于待选交点集合中;
[0010] 步骤c,对客厅多边形上的每个点进行遍历,执行如下操作:计算每个点到餐厅多边形的每一条边的距离,并得到每个点与餐厅多边形的线段之间最短的距离,当满足以下条件:(1)所述的最短的距离小于设定第一阈值时,(2)每个点与步骤b中得到的待选交点集合中所有的点的距离大于第二阈值;将该点归于待选交点集合中;
[0011] 步骤d,对步骤c中得到的待选交点集合中的点的数目进行计算,如果数量是2个,则进入步骤e,如果数量是3个,则进入步骤f;
[0012] 步骤e,删除掉餐厅和客厅相互贴合且平行的两条线段,并将餐厅和客厅多边形剩余的点按照顺时针或逆时针顺序依次连接,使餐厅和客户多边形合并;
[0013] 步骤f,删除掉餐厅和客厅相互贴合且平行的两条线段,删除掉待选交点集合中的相互紧贴的点,再将餐厅和客厅多边形剩余的点按照顺时间或逆时针顺序依次连接,使餐厅和客户多边形合并。
[0014] 在一个实施方式中,所述的第一阈值是5cm;所述的第二阈值是3.5‑4cm。
[0015] 在一个实施方式中,步骤e中,相互贴合且平行的判定中,贴合是指相互距离小于5cm,相互平行是指相互之间的直线夹角是0‑2°。
[0016] 在一个实施方式中,步骤f中,相互紧贴是指点和点之间的距离小于5cm。
[0017] 一种家装设计图的区域处理系统,包括:
[0018] 区域数据区域模块,用于获取通过手绘得到的户型图中的餐厅和客厅的多边形区域数据,所述的区域数据中包括房间轮廓线段以及线段上的端点;
[0019] 餐厅交点获取模块,用于对餐厅多边形上的每个点进行遍历,执行如下操作:计算每个点到客厅多边形的每一条边的距离,并得到每个点与客厅多边形的线段之间最短的距离,当所述的最短的距离小于设定第一阈值时,将该点归于待选交点集合中;
[0020] 客厅交点获取模块,对客厅多边形上的每个点进行遍历,执行如下操作:计算每个点到餐厅多边形的每一条边的距离,并得到每个点与餐厅多边形的线段之间最短的距离,当满足以下条件:(1)所述的最短的距离小于设定第一阈值时,(2)每个点与步骤b中得到的待选交点集合中所有的点的距离大于第二阈值;将该点归于待选交点集合中;
[0021] 分类模块,用于对待选交点集合中的点的数目进行计算,如果数量是2个,则通过第一合并模块处理;如果数量是3个,则通过第二合并模块处理;
[0022] 第一合并模块,用于删除掉餐厅和客户相互贴合且平行的两条线段,并将餐厅和客厅多边形剩余的点按照顺时间或逆时针顺序依次连接,使餐厅和客户多边形合并;
[0023] 第二合并模块,用于删除掉餐厅和客户相互贴合且平行的两条线段,删除掉待选交点集合中的相互紧贴的点,再将餐厅和客厅多边形剩余的点按照顺时间或逆时针顺序依次连接,使餐厅和客户多边形合并。
[0024] 在一个实施方式中,所述的第一阈值是5cm;所述的第二阈值是3.5‑4cm。
[0025] 在一个实施方式中,第一合并模块中,相互贴合且平行的判定中,贴合是指相互距离小于5cm,相互平行是指相互之间的直线夹角是0‑2°。
[0026] 在一个实施方式中,第二合并模块中,相互紧贴是指点和点之间的距离小于5cm。
[0027] 一种计算机可读取介质,记载有可以运行上述家装设计图的区域处理方法的程序。
[0028] 有益效果
[0029] 本发明可以让用户在家装设计过程中,对设计师手绘制后的客厅,餐厅区域进行有效合并,避免因为精度误差而引起客餐厅合并时出现的多边形不闭合,多边形不是单一合并区域,或者引起多边形线条错乱的问题,可以便捷地支持客餐厅相关的业务。当然该技术不仅仅局限在客餐厅区域,可以拓展到任意两个相邻的多边形。

附图说明

[0030] 图1是户型中某一区域的边界有序点集(逆时针或者顺时针)
[0031] 图2是餐厅区域显示示意图(粗实线条部分)
[0032] 图3是客厅区域显示(粗实线条部分)
[0033] 图4是合并后的客餐厅区域示意图
[0034] 图5两个区域交集的点个数为2的情况
[0035] 图6两个区域交集的点个数为3的情况
[0036] 图7Case1对应的两区域情况的示意图
[0037] 图8Case2对应的两区域情况的示意图
[0038] 图9Case3对应的两区域情况的示意图
[0039] 图10 Case4对应的区域情况的示意图
[0040] 图11 Case5对应的两区域情况的示意图
[0041] 图12三交点情况下的示意图
[0042] 图13Case6对应的两区域的情况
[0043] 图14Case7对应的两区域的情况
[0044] 图15Case8对应的两区域的情况

具体实施方式

[0045] 为了更清楚地说明本申请的实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单的介绍。显而易见地,下面描述中的附图仅仅是本申请的一些示例或实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图将本申请应用于其他类似情景。应当理解,给出这些示例性实施例仅是为了使相关领域的技术人员能够更好地理解进而实现本发明,而并非以任何方式限制本发明的范围。
[0046] 如本申请和权利要求书中所示,除非上下文明确提示例外情形,“一”、“一个”、“一种”和/或“该”等词并非特指单数,也可包括复数。一般说来,术语“包括”与“包含”仅提示包括已明确标识的步骤和元素,而这些步骤和元素不构成一个排它性的罗列,方法或者设备也可能包含其他的步骤或元素。
[0047] 虽然本申请对根据本申请的实施例的系统中的某些系统、模块或单元做出了各种引用,然而,任何数量的不同模块可以被使用并运行在客户端和/或服务器上。所述模块仅是说明性的,并且所述系统和方法的不同方面可以使用不同模块。
[0048] 同时,本申请使用了特定词语来描述本申请的实施例。如“一个实施例”、“一实施例”、和/或“一些实施例”意指与本申请至少一个实施例相关的某一特征、结构或特点。因此,应强调并注意的是,本说明书中在不同位置两次或多次提及的“一实施例”或“一个实施例”或“一替代性实施例”并不一定是指同一实施例。此外,本申请的一个或多个实施例中的某些特征、结构或特点可以进行适当的组合。
[0049] 本发明所要解决的技术问题是:在由设计师直接手绘得到的户型图中,相邻的餐厅和客厅之间的分界线存在着手绘误差,导致了软件需要将两个区域进行合并时,不易识别出不同户型条件下的餐厅和客厅的交界情况,从而无法准确地将餐厅和区域进行简并处理。
[0050] 本方法中,首先需要分别得到餐厅和客厅的房间形状的有序点集,如图1所示,需要基于2D户型数据获取整个户型所有区域的边界有序点集,如图1所示户型中一个区域的边界点集;首先在基于3D户型数据中,获取地面的平面图(本发明中,需要至少识别出客厅和餐厅这两个功能区域,分别将其作为一个区域进行处理;也可以选择为其它的相邻的功能区域进行相应的合并处理),对于其中的某一个区域,在平面图中能够读取出所有的边界点,获取整个户型方法所有区域的边界有序点集,如图1所示户型中一个区域的边界点集,这些点按照在平面上的旋转顺序(顺时针或者逆时针)依次编号,在图中是以逆时针为例。通过该步骤,就分别得到了餐厅和客厅的功能区域的有序点集图。
[0051] 在一个典型的户型图中,餐厅和客厅的位置关系如图2和图3所示,它们理想的合并后的效果如图4所示。
[0052] 通过以上的步骤,可以获取由设计师手绘的户型图中的餐厅和客厅的区域数据,即多个多边形,获得得到的数据包括由线段表示出的房间区域,以及线段的两端端点,以及线段内部可能存在的点;
[0053] 假设我们命名餐厅多边形为PolygonA,客厅多边形为PolygonB;(例如图5所示);
[0054] 接下来,分别计算PolygonA以及PolygonB的周长,以较短的周长的作为PolygonA(本例中是餐厅),较长的周长的作为PolygonB(本例中是客厅),用PolygonB尽量去贴合PolygonA,使得两个多边形的交界的点集统一,避免因为数值误差造成两个区域交界点不一致。
[0055] 下面的步骤是为了找到餐厅和客户之间的近似交点:
[0056] 计算PolygonA(餐厅)上每一点PointA到PolygonB(客厅)的每一条线段的距离,那么可以获得PointA到各条线段的距离,然后从这些距离中选择出最短的一条,将最短的这条距离命名为DisToSegA,若该距离小于或者等于一个阈值(例如,5厘米,数值可以自定义,用于表示PointA与一条线段非常接近),这个时候,说明这个PointA是一个备选的餐厅和客厅的相交点,则将此时PointA放入到临时待判定的交点集合中,称为TempInterSectPs;接下来,对PointA上的其它的点依次遍历,执行同样的操作,将符合上述的距离判定规则的点也纳入至集合TempInterSectPs中。在图5中,作为餐厅的多边形IJKL中,L和I这两点就因为分别与HG线段距离非常接近,而纳入至这个集合TempInterSectPs中。
[0057] 接下来,再从PolygonB(客厅)中依次对各个点进行遍历,在图5中是ABCDEFGH多边形,计算其与PolygonA(餐厅)上的线段的距离,具体的过程与上述步骤类似,本步骤的目的是为了找到客厅这个多边形上与餐厅交界点,可以防止存在着交界点遗漏的情况。在图5中,GH线段上没有点与餐厅接近,因此,不能得到相应的点集;而在如图6当中,P点位于PolygonB(客厅)的PG边上,如果只从PolygonA(餐厅)上的点来判定的话,只能找到L和I这两个点,并将P点遗漏。因此,通过PolygonB(客厅)上的点再执行一次计算之后,可以识别出P点。计算过程也是分别计算PolygonB(客厅)上的每一个点PointB到PolygonA(餐厅)的每一线段的距离,并得到各个距离中的最小距离,作该距离命名为DisToSegB,若该距离小于或者等于一个阈值(例如,5厘米,数值可以自定义,用于表示PointB与一条线段非常接近);接下来,需要进一步地判定对选取出的这个PointB中的点与集合TempInterSectPs中的点是否会存在足够接近的情况(这主要是在手绘的过程中,会有一些点相互距离非常靠近的点,如果将这些点分别统计时,往往会造成无法将图形合并,因此,需要考虑将一些距离较近的点进行简并处理),例如在图5中,如果有一个点L’与L点足够接近,I’与I足够接近,那些L’和I’会影响到后续的合并线段的生成,因此,需要判定选取出的这个PointB中的点与集合TempInterSectPs中的点是否会存在足够接近的情况,例如是否存在着小于某一个阈值的情况(例如3.5‑4厘米),如果小于这个阈值,那么舍弃掉这个点;如果大于这个阈值,则将这个点纳入备选,继续对PolygonB(客厅)中的其它的点进行遍历,得到选出的点,再将将选出的点纳入至集合TempInterSectPs中。在图5中,经过搜索交点以及后续的简并处理之后,可以得到TempInterSectPs中的点为I、L,在图6中,TempInterSectPs中的点为L、Q、P。
[0058] 至此,当完成了双向的端点的距离判定后,在集合TempInterSectPs中的备选点就是可能的交界点,对上述过程中的待判定的交点集合TempInterSectPs进行进一步的过滤操作,即从中剔除重复的点集,具体方法如下:从TempInterSectPs中获取第一个点,放入到一个新的实际交点集合中,该集合记为InterSectPs,并将该点从TempInterSectPs中移除掉;遍历TempInterSectPs中剩余的点,判定该点与InterSectPs中每一点是否相同,若不相同,则继续将该点放入到InterSectPs集合中;若相同,则将该点从TempInterSectPs中删除;依次重复上述的步骤,直到从TempInterSectPs中所有的点处理完毕,此时得到最后的经过了去除重复点的“相交点集” InterSectPs;在图5中,经过去重处理后的集合InterSectPs中包含了I、L、这2个点;在图6中,去重的集合InterSectPs中包含了L、I、P这3个点。
[0059] 接下来,需要进行点的替换处理,其目的是用于分别将两个需要合并的多边形的点集当中的与InterSectPs集合位置相近的点集合并,可以解决手绘的户型图中线段上的点的误差。本步骤的目的是在获得了上述的InterSectPs点集的基础上,对餐厅或客厅中的位于交界点附近的点进行重新替换处理,具体的步骤如下:
[0060] 遍历InterSectPs的每一点TempPoint,计算PolygonA(餐厅)中的每一点,记为PointA,计算TempPoint到PointA的距离,该距离记为DisA; 选择一个较小的距离阈值,此时的阈值用来判定两点之间的接近程度,建议设置为λ=0.001;若上述流程中的两点距离值DisA<=λ,则判定此时PolygonA(餐厅)上的该点与InterSectPs中对应的点是同一个点,用InterSectPs中对应的点替换PolygonA(餐厅)中对应的点;至此,就在获得了InterSectPs相交点集的基础上,对两个多边形中与相交点相似的点进行了简化处理。
[0061] 在对餐厅和客厅上的边界点进行了合并处理之后,需要进行餐厅和客厅的合并处理;此时的计算过程,是需要根据以上的计算结果进行分情况处理。
[0062] 第一大类情况,InterSectPs中的点集的个数为2个;
[0063] 在此情况下,需要得到两个数值。
[0064] 第一个数值,是统计PolygonA(餐厅)中点集与InterSectPs中的点集中存在相同点的个数,记为Acount;例如,在图5的情况下,InterSectPs的点集为I、L,并且PolygonA(餐厅)的点集是I、J、K、L,那么可以得到此时的Acount为2,在图6的情况下,InterSectPs的点集为L、I、P,并且PolygonA(餐厅)的点集是L、I、J、K,那么相同的点为L、I,那么此时的Acount为2;
[0065] 第二个数值,是统计PolygonB(客厅)中点集与InterSectPs中相同的点的个数,记为Bcount;例如,在图5的情况下,InterSectPs的点集为I、L,PolygonB(客厅)的点集是ABCDEFGH,并没有点与InterSectPs的点集相同,因此Bcount为0。而在图6的情况下,PolygonB(客厅)的点集ABCDEFGHPQH,因此,P点是归属InterSectPs的点集,因此,Bcount为1。
[0066] 同时进一步记录PolygonB中的点与InterSectPs中点相同的Index,记录点集PSets中的最后一个点在PolygonB的索引,记为TargetPIndex,以及记录其与InterSectPs中对应的点的索引,记为FinalIndex;
[0067] 分以下几种情况:
[0068] Case1:若上述步骤中的Acount=2,Bcount=0(是指A/B点作为Acount的计数,Bcount中无有效点集),利用上述步骤中得到的InterSectPs的点构建相交线段记录为Segment,
[0069] 该情况对应的两区域情形如图7所示,设计师手动绘制了区域ABCD,作为餐厅,绘制了区域EFGHIJKL,作为客厅。此时相交线段集合,即Segment为线段AB。
[0070] 将PolygonA中所有的线段(即线段AB,BC,CD,DA)放到一个线段集合中,记录为Asegs;
[0071] 将PolygonB中所有的线段(即线段EF,FG,GH,HI,IJ,JK,KL,LE)放到一个线段集合中,记录为Bsegs;
[0072] 剔除PolygonB中与PolygonA相交的线段,具体方法如下:计算PolygonB中每一条线段(即Bsegs中的每条线段)与Segment之间的距离SegToSegDis,若SegToSegDis小于等于5厘米,再进一步判定该线段与Segment是否平行,若平行,记录此时需要待筛除的边的Index,记录为RemoveBSegIndex(对应图7中的边IJ在多边形EFGHIJKL的边的索引); 利用上述步骤中待删除的边对应的两个端点以及Segment两个端点的位置关系(如图7所示,即判定点I以及点J与点A,点B的位置关系),判定B中需要新增加的线段,记为AddSeg1,AddSeg2(如图7所示,添加线段AJ以及线段IB到Bsegs里面; 利用Segment的两个端点与PolygonA中每一线段的端点,若出现相等,则将对应的PolygonA中的边的Index标记为需要待删除的边,记录为RemoveASegIndex(即线段AB在多边形ABCD中的边的索引); 将PolygonA以及PolygonB中待删除的边去掉,利用更新后的线段的端点数值,重新构建PolygonA对应的有向顺序线段AreorderPoints(即PolygonB中剔除线段IJ后新增线段AJ,IB后的点序AJKLEFGHIB),以及PolygonB对应的有向顺序线段BreorderPoints(即PolygonA中剔除线段AB后的点序BCDA);然后两区域合并后的点序为:BCDAJKLEFGHI,当然此处合并后的点序不唯一,但是最终生成合并后的区域由上述点序中的点首尾相连构成的一个封闭多边形)。
[0073] Case2:若上述步骤中的Acount=1,Bcount=1,(如图8所示,在图中,也分为两种情况,在情况1下,Acount对应的点集是B,Bcount对应的点集是H;在情况2下,Acount对应的点集是A,Bcount对应的点集是G)。
[0074] 利用上述步骤中得到的RealInterSectPs的点构建相交线段记录为Segment;该情况对应的两区域情形如图8所示,设计师手动绘制了区域ABCD,作为餐厅,绘制了区域EFGH,作为客厅。若如图8中情形1所示,此时相交线段为线段HB,即Segment为线段HB,若如图8中情形2所示,此时相交线段为线段AG,即Segmentg为线段AG。
[0075] 我们以图8中情形1所示叙述:
[0076] 将PolygonA中所有的线段(即线段AB,BC,CD,DA)放到一个线段集合中,记录为Asegs;
[0077] 将PolygonB中所有的线段(即线段EF,FG,GH,HE)放到一个线段集合中,记录为Bsegs;
[0078] 剔除PolygonB中与PolygonA相交的线段,具体方法如下:
[0079] 计算PolygonB中每一条线段(即Bsegs中每条线段)与Segment之间的距离SegToSegDis,若SegToSegDis小于等于5厘米,再进一步判定该线段与Segment是否平行,若平行,记录此时需要待筛除的边的Index,记录为RemoveBSegIndex(即图8中情形1所示的边GH在多边形EFGH中的索引);
[0080] 计算PolygonA中每一条线段(即Asegs中每条线段)与Segment之间的距离SegToSegDis,若SegToSegDis小于等于5厘米,再进一步判定该线段与Segment是否平行,若平行,记录此时需要待筛除的边的Index,记录为RemoveASegIndex(即图8中情形1所示的边AB在多边形ABCD中的索引);
[0081] 若Segment的长度小于或者等于PolygonA中需要删除的边的长度,Segment的长度小于或者等于PolygonB中需要删除的边的长度,且PolygonA中需要删除的边的长度与PolygonB中需要删除的边的长度不相等时:
[0082] 进一步判定:利用PolygonA中待删除边的端点以及Segment的端点坐标关系(即判定点A以及点B与线段HB两端点之间的位置关系),重新构建PolygonA中新增加的边(即新增的边HA),记录为AddSeg1,同时将PolygonA中待删除边移除;同理新增PolygonB中新增加的边(即新增边GB),记录为AddSeg2,同时将PolygonB中待删除边移除;
[0083] 同步更新PolygonA以及PolygonB的新的有向顺序线段(即PolygonA剔除线段AB,新增线段HA后,新的点序为HADCB;PolygonB剔除线段GH,新增线段GB后新的点序为HEFGB,然后两区域合并后得到合并后的区域点序为:BCDAHEFG, 当然此处合并后的点序不唯一,但是最终生成合并后的区域由上述点序中的点首尾相连构成的一个封闭多边形);
[0084] 同理图8中(2)的情形,合并区域的方法与上述步骤类似。
[0085] Case3:若上述步骤中的Acount=2,Bcount=1,(如图9所示,在情形1下,Acount对应的点集是A/B,Bcount对应的点集是H;在情形2下,Acount对应的点集是A/B,Bcount对应的点集是G)构建相交线段,记录为Segment;
[0086] 利用上述步骤中得到的RealInterSectPs的点构建相交线段记录为Segment;
[0087] 该情况对应的两区域情形如图9所示,设计师手动绘制了区域ABCD,作为餐厅,绘制了区域EFGH,作为客厅。此时相交线段,即Segment为线段AB。
[0088] 我们以图9中情形1所示叙述:
[0089] 将PolygonA中所有的线段(即线段AB,BC,CD,DA)放到一个线段集合中,记录为Asegs;
[0090] 将PolygonB中所有的线段(即线段EF,FG,GH,HE)放到一个线段集合中,记录为Bsegs;
[0091] 剔除PolygonB中与PolygonA相交的线段,具体方法如下:
[0092] 计算PolygonB中每一条线段(即Bsegs中每一条线段)与Segment之间的距离SegToSegDis,若SegToSegDis小于等于5厘米,再进一步判定该线段与Segment是否平行,以及PolygonB中判定的线段的长度与Segment进行比较,若PolygonB此时长度大于等于Segment的长度且两者平行,记录此时需要待筛除的边的Index,记录为RemoveBSegIndex(即图 9 中情形1边GH在多边形EFGH中的索引);
[0093] 计算PolygonA中每一条线段(即Asegs中每一条线段)与Segment之间的距离SegToSegDis,若SegToSegDis小于等于5厘米,再进一步判定该线段与Segment是否平行,若平行,记录此时需要待筛除的边的Index,记录为RemoveASegIndex(即图9中情形1边AB在多边形ABCD中的索引);
[0094] 与上述方法类似,新增PolygonB中的线段(即在PolygonB中新增线段GB);
[0095] 同理,更新PolygonA以及PolygonB的新的有向顺序线段(即PolygonA剔除线段AB后的新的点序:BCDA;PolygonB剔除线段GH,新增线段GB后新的点序:AEFGB,两区域合并后的区域点序为:BCDAEFG, 当然此处合并后的点序不唯一,但是最终生成合并后的区域由上述点序中的点首尾相连构成的一个封闭多边形)。
[0096] 同理,图9中情形2合并区域的方法与上述步骤类似。
[0097] 如图10所示,Case4.若上述步骤中的Acount=2,Bcount=2(Acount对应的点集是AB、Bcount对应的点集是HG),构建相交线段,记录为Segment;
[0098] 利用上述步骤中得到的InterSectPs的点构建相交线段记录为Segment;
[0099] 该情况对应的两区域情形如图10所示,设计师手动绘制了区域ABCD,作为餐厅,绘制了区域EFGH,作为客厅。此时相交线段即Segment为线段AB。
[0100] 将PolygonA中所有的线段(即线段AB,BC,CD,DA)放到一个线段集合中,记录为Asegs;
[0101] 将PolygonB中所有的线段(即线段EF,FG,GH,HE)放到一个线段集合中,记录为Bsegs;
[0102] 剔除PolygonB中与PolygonA相交的线段,具体方法如下:
[0103] 计算PolygonB中每一条线段(即Bsegs中每条线段)与Segment之间的距离SegToSegDis,若SegToSegDis小于等于5厘米,再进一步判定该线段与Segment是否平行,以及PolygonB中判定的线段的长度与Segment进行比较,若PolygonB此时长度大于等于Segment的长度且两者平行,记录此时需要待筛除的边的Index,记录为RemoveBSegIndex(即图10中边GH在多边形EFGH中的索引);计算PolygonA中每一条线段(即Asegs中每条线段)与Segment之间的距离SegToSegDis,若SegToSegDis小于等于5厘米,再进一步判定该线段与Segment是否平行,若平行,记录此时需要待筛除的边的Index,记录为
RemoveASegIndex(即图10中边AB在多边形ABCD中的索引);同理,更新PolygonA以及PolygonB的新的有向顺序线段,合并后的区域点序为BCDAEF;当然此处合并后的点序不唯一,但是最终生成合并后的区域由上述点序中的点首尾相连构成的一个封闭多边形。
[0104] 如图11所示的Case5. 若上述步骤中的Acount=1,Bcount=2(在图11的情形1中,Acount对应的点集是B,Bcount对应的点集是I/J;在图11的情形1中,Acount对应的点集是A,Bcount对应的点集是I/J;),构建相交线段,记录为Segment;
[0105] 利用上述步骤中得到的RealInterSectPs的点构建相交线段记录为Segment;
[0106] 该情况对应的两区域情形如图11所示,设计师手动绘制了区域ABCD,作为餐厅,绘制了区域EFGHIJ,作为客厅。若如图11中情形(1)所示,此时相交线段即Segment为线段BJ,若如图11中情形(2)所示,此时相交线段即Segment为线段IA。
[0107] 我们以图11中情形(1)所示叙述:
[0108] 将PolygonA中所有的线段(即线段AB,BC,CD,DA)放到一个线段集合中,记录为Asegs;
[0109] 将PolygonB中所有的线段(即线段EF,FG,GH,HI,IJ,JE)放到一个线段集合中,记录为Bsegs;
[0110] 剔除PolygonB中与PolygonA相交的线段,具体方法如下:
[0111] 计算PolygonB中每一条线段(即Bsegs中每条线段)与Segment之间的距离SegToSegDis,若SegToSegDis小于等于5厘米,再进一步判定该线段与Segment是否平行,以及PolygonB中判定的线段的长度与Segment进行比较,若PolygonB中此时某条线段长度大于等于Segment的长度且两者平行,记录此时需要待筛除的边的Index,记录为
RemoveBSegIndex(即线段IJ在多边形EFGHIJ中的索引);
[0112] 计算PolygonA中每一条线段(即Asegs中每条线段)与Segment之间的距离SegToSegDis,若SegToSegDis小于等于5厘米,再进一步判定该线段与Segment是否平行,若平行,记录此时需要待筛除的边的Index,记录为RemoveASegIndex(即线段AB在多边形ABCD中的索引);
[0113] 和以上方法类似,新增PolygonA以及PolygonB中的线段,此时PolygonA中新增线段JA;
[0114] 同理,更新PolygonA以及PolygonB的新的有向顺序线段(即两区域合并后的区域点序为:BCDAJEFGH,当然此处合并后的点序不唯一,但是最终生成合并后的区域由上述点序中的点首尾相连构成的一个封闭多边形);
[0115] 同理图11中(2)的区域也类似按照上述步骤处理。
[0116] 对于本类情况,还可以有其它的实现方法,例如:当InterSectPs的点为2时,删除掉餐厅和客户相互贴合且平行的两条线段,并将餐厅和客厅多边形剩余的点按照顺时间或逆时针顺序依次连接,使餐厅和客户多边形合并;以图7为例,餐厅的线段AB和客厅的线段IJ,近似相互平行并且距离非常接近,因此,将这两条线段删除,然后再将剩余的点作为一个完全的集合,按空间的顺时间或逆时针排序之后,得到了一个完整的合并多边形;同理,在图8的情况下,餐厅的AB线段和客厅的HG线段是相互平行且接近,将这两条线段删除后,其余的点可以依次重新相连,构成了一个完整的合并多边形。
[0117] 第二大类情况,InterSectPs中的点集的个数为3个;
[0118] 如图13所示的,InterSectPs中的点集为A、B、H;在接下来,需要将这对InterSectPs中的点集中按顺序标记。标记排序的方法如下:
[0119] 如图12所示,分别两两之间构建向量,例如:这三个点分别为P0,P1,P2;记为:, , ; ;
[0120] 将上述向量统一归一化处理得到: , , , ,计算向量 与向量 的内积,该值为Res1;
[0121] 计算向量 与向量 的内积,该值为Res2;
[0122] 计算向量 与向量 的内积,该值为Res3;
[0123] 若上述步骤中的Res1的绝对值小于或者等于0.01,则将P0,P1,P2依次放入一个新的虚拟墙体线段顺序点集中,该集合命名为OrderedPs;
[0124] 若上述步骤中的Res2的绝对值小于或者等于0.01,则将P1,P0,P2依次放入到OrderedPs中;若上述步骤中的Res3的绝对值小于或者等于0.01,则将P0,P2,P1依次放入到OrderedPs中。
[0125] 再依照InterSectPs中的点集的个数为2个时计算Acount和Bcount;类似的,也可以分为以下三种情况:
[0126] Case6: 若上述步骤中的Acount=2,Bcount=2(在情形1时,Acount点集是A、B;Bcount点集是I、H;在情形2时,Acount点集是A、B,Bcount点集是I、H),构建相交线段,记录为Segment1,Segment2;
[0127] 利用上述步骤中得到的RealInterSectPs的三点构建相交线段记录为Segment1,Segment2;
[0128] 该情况对应的两区域情形如图13所示,设计师手动绘制了区域ABCD,作为餐厅,绘制了区域EFGHIJ,作为客厅。若如图13情形中(1)所示,此时相交线段即Segment1为线段AB,Segment2为线段BH, 若如图13中(2)所示,此时相交线段即Segment1为线段AB,Segmentg2为线段AI。
[0129] 我们以图13中情形(1)所示叙述:
[0130] 与上述删除边的方法类似,记录PolygonA中需要待删除的边的index的集合(即图13中(1)所示的边AB以及BC在多边形ABCD中的索引),以及PolygonB中需要待删除的边的index的集合(即图13中(1)所示的边HI以及IJ在多边形EFGHIJ中的索引),更新PolygonA以及PolygonB中的线段(PolygonA新增线段HC,PolygonB新增线段AJ),顺序连接构成有向线段,即两区域合并后的点序为:HCDAJEFG;
[0131] 同理图13中(2)所示的区域合并的方法与上述步骤类似。
[0132] Case7: 如图14,若上述步骤中的Acount=3,Bcount=1(在情形1中,Acount点集是A、B、C,Bcount点集是I;在情形2中,Acount点集是D、A、B,Bcount点集是H),构建相交线段,记录为Segment1,Segment2;
[0133] 利用上述步骤中得到的RealInterSectPs的三点构建相交线段记录为Segment1,Segment2;
[0134] 该情况对应的两区域情形如图14所示,设计师手动绘制了区域ABCD,作为餐厅,绘制了区域EFGHIJ,作为客厅。若如图14中(1)所示,此时相交线段即Segment1为线段AB,Segment2为线段BC, 若如图14中(2)所示,此时相交线段即Segment1为线段AB,Segmentg2为线段AD。
[0135] 我们以图14中(1)所示叙述:
[0136] 与上述Case6中删除边的方法类似,记录PolygonA中需要待删除的边的index的集合(即边AB以及BC在多边形ABCD中的索引),以及PolygonB中需要待删除的边的index的集合(即HI以及IJ在多边形EFGHIJ中的索引),更新PolygonA以及PolygonB中的线段(即剔除相应边之后,在PolygonB中新增边HC以及边AJ),顺序连接构成有向线段(即两区域合并后区域的点序为:CDAJEFGHC,当然此处合并后的点序不唯一,但是最终生成合并后的区域由上述点序中的点首尾相连构成的一个封闭多边形);
[0137] 同理图14中(2)所示的区域合并的方法与上述步骤类似。
[0138] 如图15所示,Case8: 若上述步骤中的Acount=2,Bcount=3(在情形1中,Acount点集是A、B,Bcount点集是I、I、J;在情形2中,Acount点集是A、B,Bcount点集是G、H、I),构建相交线段,记录为Segment1,Segment2;
[0139] 利用上述步骤中得到的RealInterSectPs的三点构建相交线段记录为Segment1,Segment2;
[0140] 该情况对应的两区域情形如图15所示,设计师手动绘制了区域ABCD,作为餐厅,绘制了区域EFGHIJ,作为客厅。若如图15中(1)所示,此时相交线段即Segment1为线段AB,Segment2为线段BH, 若如图15中(2)所示,此时相交线段即Segment1为线段AB,Segmentg2为线段AI。
[0141] 我们以图15中(1)所示叙述:
[0142] 与上述Case7中删除边的方法类似,记录PolygonA中需要待删除的边的index的集合(即边AB以及BC在多边形ABCD中的索引),以及PolygonB中需要待删除的边的index的集合(即边HI以及IJ在多边形EFGHIJ中的索引),更新PolygonA以及PolygonB中的线段(即剔除相交线段后,在PolygonA中新增线段HC,合并两区域后的点序为:CDAEFGH,当然此处合并后的点序不唯一,但是最终生成合并后的区域由上述点序中的点首尾相连构成的一个封闭多边形)。
[0143] 对于本类情况,还可以有其它的实现方法,例如:删除掉餐厅和客户相互贴合且平行的两条线段,删除掉待选交点集合中的相互紧贴的点,再将餐厅和客厅多边形剩余的点按照顺时间或逆时针顺序依次连接,使餐厅和客户多边形合并。以图14的情况(1)为例,餐厅和客户之间相平行且相邻的线段共有AB、BC、IJ、IH,将这四条线段删除,又由于InterSectPs的点集为A/B/I/C,这四个点中,I和B的距离非常靠近,需要将餐厅和客厅的多边形中的点集中删除,那么餐厅和客户剩余的点集就是由AJEFGHCD构成,将余下的点按照顺时针或者逆时针依次连接线段,就可以得到了一个完整的合并后的多边形。同理,对于图15的情况(1)为例,删除掉餐厅和客厅之间相邻且平行的直线AB/BH/JI/HI之后,
InterSectPs的点集ABHIJ中的BI点相邻,将这两点删除,并将剩余的点AJEFGHCD依次连接成线段之后,就成为了完整的合并后的多边形。
[0144] 此外,本领域技术人员可以理解,本申请的各方面可以通过若干具有可专利性的种类或情况进行说明和描述,包括任何新的和有用的工序、机器、产品或物质的组合,或对他们的任何新的和有用的改进。相应地,本申请的各个方面可以完全由硬件执行、可以完全由软件(包括固件、常驻软件、微码等)执行、也可以由硬件和软件组合执行。以上硬件或软件均可被称为“数据块”、“模块”、“引擎”、“单元”、“组件”或“系统”。此外,本申请的各方面可能表现为位于一个或多个计算机可读介质中的计算机产品,该产品包括计算机可读程序编码。
[0145] 计算机可读信号介质可能包含一个内含有计算机程序编码的传播数据信号,例如在基带上或作为载波的一部分。该传播信号可能有多种表现形式,包括电磁形式、光形式等等、或合适的组合形式。计算机可读信号介质可以是除计算机可读存储介质之外的任何计算机可读介质,该介质可以通过连接至一个指令执行系统、装置或设备以实现通讯、传播或传输供使用的程序。位于计算机可读信号介质上的程序编码可以通过任何合适的介质进行传播,包括无线电、电缆、光纤电缆、射频信号、或类似介质、或任何上述介质的组合。
[0146] 本申请各部分操作所需的计算机程序编码可以用任意一种或多种程序语言编写,包括面向对象编程语言如Java、Scala、Smalltalk、Eiffel、JADE、Emerald、C++、C#、VB.NET、Python等,常规程序化编程语言如C语言、Visual Basic、Fortran 2003、Perl、COBOL 2002、PHP、ABAP,动态编程语言如Python、Ruby和Groovy,或其他编程语言等。该程序编码可以完全在用户计算机上运行、或作为独立的软件包在用户计算机上运行、或部分在用户计算机上运行部分在远程计算机运行、或完全在远程计算机或服务器上运行。在后种情况下,远程计算机可以通过任何网络形式与用户计算机连接,比如局域网(LAN)或广域网(WAN),或连接至外部计算机(例如通过因特网),或在云计算环境中,或作为服务使用如软件即服务(SaaS)。
[0147] 此外,除非权利要求中明确说明,本申请所述处理元素和序列的顺序、数字字母的使用、或其他名称的使用,并非用于限定本申请流程和方法的顺序。尽管上述披露中通过各种示例讨论了一些目前认为有用的发明实施例,但应当理解的是,该类细节仅起到说明的目的,附加的权利要求并不仅限于披露的实施例,相反,权利要求旨在覆盖所有符合本申请实施例实质和范围的修正和等价组合。例如,虽然以上所描述的系统组件可以通过硬件设备实现,但是也可以只通过软件的解决方案得以实现,如在现有的服务器或移动设备上安装所描述的系统。