本發(fā)明涉及圖形碰撞檢測(cè)領(lǐng)域,具體地,涉及一種SVG圖形碰撞檢測(cè)方法及裝置。
背景技術(shù):
可縮放矢量圖形(SVG,Scalable Vector Graphics)是基于可擴(kuò)展標(biāo)記語言(標(biāo)準(zhǔn)通用標(biāo)記語言的子集)、用于描述二維矢量圖形的一種圖形格式。在實(shí)際應(yīng)用中,有時(shí)需要檢測(cè)兩個(gè)SVG圖形之間是否發(fā)生碰撞。其中,SVG圖形發(fā)生碰撞的情形可以包括:兩個(gè)SVG圖形相交,或者一個(gè)SVG圖形內(nèi)嵌于另一個(gè)SVG圖形之中。相關(guān)技術(shù)中,常用的SVG圖形碰撞檢測(cè)方法是矩形檢測(cè)法。圖1示出了這種檢測(cè)法的示意圖。如圖1所示,假設(shè)要檢測(cè)SVG圖形101和SVG圖形102之間是否發(fā)生碰撞,則基于矩形檢測(cè)法,首先獲取SVG圖形101的外接矩形103和SVG圖形102的外接矩形104,通過判斷外接矩形103與外接矩形104是否為相交或者內(nèi)嵌的關(guān)系,來確定SVG圖形101與SVG圖形102之間是否發(fā)生碰撞。然而,采用這種矩形檢測(cè)法,有時(shí)會(huì)出現(xiàn)誤檢。例如,如圖1所示,外接矩形103與外接矩形104之間相交于A點(diǎn),通過矩形檢測(cè)法,得到的結(jié)論是SVG圖形101與SVG圖形102之間發(fā)生碰撞。然而實(shí)際上,如圖1所示,兩個(gè)SVG圖形之間并未發(fā)生碰撞。由此可以看出,現(xiàn)有的矩形檢測(cè)法在SVG圖形碰撞檢測(cè)方面存在準(zhǔn)確度不高的問題。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是提供一種SVG圖形碰撞檢測(cè)方法及裝置,以提高SVG圖形碰撞檢測(cè)的準(zhǔn)確度。
為了實(shí)現(xiàn)上述目的,本發(fā)明提供一種SVG圖形碰撞檢測(cè)方法,所述方法包括:在第一SVG圖形上獲取第一檢測(cè)點(diǎn)集合,所述第一檢測(cè)點(diǎn)集合用于形成內(nèi)接于所述第一SVG圖形中的第一多邊形;在第二SVG圖形上獲取第二檢測(cè)點(diǎn)集合,所述第二檢測(cè)點(diǎn)集合用于形成內(nèi)接于所述第二SVG圖形中的第二多邊形;判斷所述第一檢測(cè)點(diǎn)集合中是否包括落入到所述第二多邊形的范圍內(nèi)的檢測(cè)點(diǎn);在確定所述第一檢測(cè)點(diǎn)集合中包括落入到所述第二多邊形的范圍內(nèi)的檢測(cè)點(diǎn)時(shí),確定所述第一SVG圖形與所述第二SVG圖形之間發(fā)生碰撞。
可選地,所述在第一SVG圖形上獲取第一檢測(cè)點(diǎn)集合的步驟包括:在所述第一SVG圖形上獲取第一初始位置點(diǎn);以所述第一初始位置點(diǎn)為起點(diǎn)、按照第一預(yù)設(shè)步長(zhǎng)、沿所述第一SVG圖形獲取多個(gè)第一中間位置點(diǎn);基于所述第一初始位置點(diǎn)和所述多個(gè)第一中間位置點(diǎn),形成所述第一檢測(cè)點(diǎn)集合;所述在第二SVG圖形上獲取第二檢測(cè)點(diǎn)集合的步驟包括;在所述第二SVG圖形上獲取第二初始位置點(diǎn);以所述第二初始位置點(diǎn)為起點(diǎn)、按照第二預(yù)設(shè)步長(zhǎng)、沿所述第二SVG圖形獲取多個(gè)第二中間位置點(diǎn);基于所述第二初始位置點(diǎn)和所述多個(gè)第二中間位置點(diǎn),形成所述第二檢測(cè)點(diǎn)集合。
可選地,所述判斷所述第一檢測(cè)點(diǎn)集合中是否包括落入到所述第二多邊形的范圍內(nèi)的檢測(cè)點(diǎn)的步驟包括:遍歷所述第一檢測(cè)點(diǎn)集合,判斷是否存在滿足第一預(yù)設(shè)條件的第一檢測(cè)點(diǎn),其中,所述第一預(yù)設(shè)條件為:所述第一檢測(cè)點(diǎn)所在的水平線在該第一檢測(cè)點(diǎn)的左側(cè)與所述第二多邊形的交點(diǎn)的總數(shù)為奇數(shù),且在該第一檢測(cè)點(diǎn)的右側(cè)與所述第二多邊形的交點(diǎn)的總數(shù)為奇數(shù);當(dāng)所述第一檢測(cè)點(diǎn)集合中存在滿足所述第一預(yù)設(shè)條件的第一檢測(cè)點(diǎn)時(shí),確定所述第一檢測(cè)點(diǎn)集合中包括落入到所述第二多邊形的范圍內(nèi)的檢測(cè)點(diǎn)。
可選地,所述第一檢測(cè)點(diǎn)所在的水平線在該第一檢測(cè)點(diǎn)的左側(cè)與所述第二多邊形的交點(diǎn)的總數(shù)為:所述第二多邊形中位于所述第一檢測(cè)點(diǎn)所在的垂直線的左側(cè)、且位于所述第一檢測(cè)點(diǎn)所在的水平線的下方的部分與該水平線的交點(diǎn)的總數(shù);以及,所述第一檢測(cè)點(diǎn)所在的水平線在該第一檢測(cè)點(diǎn)的右側(cè)與所述第二多邊形的交點(diǎn)的總數(shù)為:所述第二多邊形中位于所述第一檢測(cè)點(diǎn)所在的垂直線的右側(cè)、且位于所述第一檢測(cè)點(diǎn)所在的水平線的下方的部分與該水平線的交點(diǎn)的總數(shù)。
可選地,所述方法還包括:在確定所述第一檢測(cè)點(diǎn)集合中不包括落入到所述第二多邊形的范圍內(nèi)的檢測(cè)點(diǎn)時(shí),判斷所述第二檢測(cè)點(diǎn)集合中是否包括落入到所述第一多邊形的范圍內(nèi)的檢測(cè)點(diǎn);在所述第二檢測(cè)點(diǎn)集合中包括落入到所述第一多邊形的范圍內(nèi)的檢測(cè)點(diǎn)時(shí),確定所述第一SVG圖形與所述第二SVG圖形之間發(fā)生碰撞。
可選地,所述判斷所述第二檢測(cè)點(diǎn)集合中是否包括落入到所述第一多邊形的范圍內(nèi)的檢測(cè)點(diǎn)的步驟包括:遍歷所述第二檢測(cè)點(diǎn)集合,判斷是否存在滿足第二預(yù)設(shè)條件的第二檢測(cè)點(diǎn),其中,所述第二預(yù)設(shè)條件為:所述第二檢測(cè)點(diǎn)所在的水平線在該第二檢測(cè)點(diǎn)的左側(cè)與所述第一多邊形的交點(diǎn)的總數(shù)為奇數(shù),且在該第二檢測(cè)點(diǎn)的右側(cè)與所述第一多邊形的交點(diǎn)的總數(shù)為奇數(shù);當(dāng)所述第二檢測(cè)點(diǎn)集合中存在滿足所述第二預(yù)設(shè)條件的第二檢測(cè)點(diǎn)時(shí),確定所述第二檢測(cè)點(diǎn)集合中包括落入到所述第一多邊形的范圍內(nèi)的檢測(cè)點(diǎn)。
可選地,所述第二檢測(cè)點(diǎn)所在的水平線在該第二檢測(cè)點(diǎn)的左側(cè)與所述第一多邊形的交點(diǎn)的總數(shù)為:所述第一多邊形中位于所述第二檢測(cè)點(diǎn)所在的垂直線的左側(cè)、且位于所述第二檢測(cè)點(diǎn)所在的水平線的下方的部分與該水平線的交點(diǎn)的總數(shù);所述第二檢測(cè)點(diǎn)所在的水平線在該第二檢測(cè)點(diǎn)的右側(cè)與所述第一多邊形的交點(diǎn)的總數(shù)為:所述第一多邊形中位于所述第二檢測(cè)點(diǎn)所在的垂直線的右側(cè)、且位于所述第二檢測(cè)點(diǎn)所在的水平線的下方的部分與該水平線的交點(diǎn)的總數(shù)。
本發(fā)明還提供一種SVG圖形碰撞檢測(cè)裝置,所述裝置包括:第一獲取模塊,用于在第一SVG圖形上獲取第一檢測(cè)點(diǎn)集合,所述第一檢測(cè)點(diǎn)集合用于形成內(nèi)接于所述第一SVG圖形中的第一多邊形;第二獲取模塊,用于在第二SVG圖形上獲取第二檢測(cè)點(diǎn)集合,所述第二檢測(cè)點(diǎn)集合用于形成內(nèi)接于所述第二SVG圖形中的第二多邊形;第一判斷模塊,用于判斷所述第一檢測(cè)點(diǎn)集合中是否包括落入到所述第二多邊形的范圍內(nèi)的檢測(cè)點(diǎn);碰撞檢測(cè)模塊,用于在確定所述第一檢測(cè)點(diǎn)集合中包括落入到所述第二多邊形的范圍內(nèi)的檢測(cè)點(diǎn)時(shí),確定所述第一SVG圖形與所述第二SVG圖形之間發(fā)生碰撞。
可選地,所述第一獲取模塊包括:第一獲取子模塊,用于在所述第一SVG圖形上獲取第一初始位置點(diǎn);第二獲取子模塊,用于以所述第一初始位置點(diǎn)為起點(diǎn)、按照第一預(yù)設(shè)步長(zhǎng)、沿所述第一SVG圖形獲取多個(gè)第一中間位置點(diǎn);第一檢測(cè)點(diǎn)集合形成子模塊,用于基于所述第一初始位置點(diǎn)和所述多個(gè)第一中間位置點(diǎn),形成所述第一檢測(cè)點(diǎn)集合;所述第二獲取模塊包括;第三獲取子模塊,用于在所述第二SVG圖形上獲取第二初始位置點(diǎn);第四獲取子模塊,用于以所述第二初始位置點(diǎn)為起點(diǎn)、按照第二預(yù)設(shè)步長(zhǎng)、沿所述第二SVG圖形獲取多個(gè)第二中間位置點(diǎn);第二檢測(cè)點(diǎn)集合形成子模塊,用于基于所述第二初始位置點(diǎn)和所述多個(gè)第二中間位置點(diǎn),形成所述第二檢測(cè)點(diǎn)集合。
可選地,所述第一判斷模塊包括:第一判斷子模塊,用于遍歷所述第一檢測(cè)點(diǎn)集合,判斷是否存在滿足第一預(yù)設(shè)條件的第一檢測(cè)點(diǎn),其中,所述第一預(yù)設(shè)條件為:所述第一檢測(cè)點(diǎn)所在的水平線在該第一檢測(cè)點(diǎn)的左側(cè)與所述第二多邊形的交點(diǎn)的總數(shù)為奇數(shù),且在該第一檢測(cè)點(diǎn)的右側(cè)與所述第二多邊形的交點(diǎn)的總數(shù)為奇數(shù);第一確定子模塊,用于當(dāng)所述第一檢測(cè)點(diǎn)集合中存在滿足所述第一預(yù)設(shè)條件的第一檢測(cè)點(diǎn)時(shí),確定所述第一檢測(cè)點(diǎn)集合中包括落入到所述第二多邊形的范圍內(nèi)的檢測(cè)點(diǎn)。
可選地,所述第一檢測(cè)點(diǎn)所在的水平線在該第一檢測(cè)點(diǎn)的左側(cè)與所述第二多邊形的交點(diǎn)的總數(shù)為:所述第二多邊形中位于所述第一檢測(cè)點(diǎn)所在的垂直線的左側(cè)、且位于所述第一檢測(cè)點(diǎn)所在的水平線的下方的部分與該水平線的交點(diǎn)的總數(shù);以及,所述第一檢測(cè)點(diǎn)所在的水平線在該第一檢測(cè)點(diǎn)的右側(cè)與所述第二多邊形的交點(diǎn)的總數(shù)為:所述第二多邊形中位于所述第一檢測(cè)點(diǎn)所在的垂直線的右側(cè)、且位于所述第一檢測(cè)點(diǎn)所在的水平線的下方的部分與該水平線的交點(diǎn)的總數(shù)。
可選地,所述裝置還包括:第二判斷模塊,用于在確定所述第一檢測(cè)點(diǎn)集合中不包括落入到所述第二多邊形的范圍內(nèi)的檢測(cè)點(diǎn)時(shí),判斷所述第二檢測(cè)點(diǎn)集合中是否包括落入到所述第一多邊形的范圍內(nèi)的檢測(cè)點(diǎn);所述碰撞檢測(cè)模塊還用于在所述第二檢測(cè)點(diǎn)集合中包括落入到所述第一多邊形的范圍內(nèi)的檢測(cè)點(diǎn)時(shí),確定所述第一SVG圖形與所述第二SVG圖形之間發(fā)生碰撞。
可選地,所述第二判斷模塊包括:第二判斷子模塊,用于遍歷所述第二檢測(cè)點(diǎn)集合,判斷是否存在滿足第二預(yù)設(shè)條件的第二檢測(cè)點(diǎn),其中,所述第二預(yù)設(shè)條件為:所述第二檢測(cè)點(diǎn)所在的水平線在該第二檢測(cè)點(diǎn)的左側(cè)與所述第一多邊形的交點(diǎn)的總數(shù)為奇數(shù),且在該第二檢測(cè)點(diǎn)的右側(cè)與所述第一多邊形的交點(diǎn)的總數(shù)為奇數(shù);第二確定子模塊,用于當(dāng)所述第二檢測(cè)點(diǎn)集合中存在滿足所述第二預(yù)設(shè)條件的第二檢測(cè)點(diǎn)時(shí),確定所述第二檢測(cè)點(diǎn)集合中包括落入到所述第一多邊形的范圍內(nèi)的檢測(cè)點(diǎn)。
可選地,所述第二檢測(cè)點(diǎn)所在的水平線在該第二檢測(cè)點(diǎn)的左側(cè)與所述第一多邊形的交點(diǎn)的總數(shù)為:所述第一多邊形中位于所述第二檢測(cè)點(diǎn)所在的垂直線的左側(cè)、且位于所述第二檢測(cè)點(diǎn)所在的水平線的下方的部分與該水平線的交點(diǎn)的總數(shù);所述第二檢測(cè)點(diǎn)所在的水平線在該第二檢測(cè)點(diǎn)的右側(cè)與所述第一多邊形的交點(diǎn)的總數(shù)為:所述第一多邊形中位于所述第二檢測(cè)點(diǎn)所在的垂直線的右側(cè)、且位于所述第二檢測(cè)點(diǎn)所在的水平線的下方的部分與該水平線的交點(diǎn)的總數(shù)。
在上述技術(shù)方案中,通過在兩個(gè)SVG圖形上分別獲取檢測(cè)點(diǎn),并利用各個(gè)檢測(cè)點(diǎn),形成分別內(nèi)接于兩個(gè)SVG圖形中的兩個(gè)多邊形。通過判斷其中一個(gè)多邊形上的檢測(cè)點(diǎn)是否落入到另一個(gè)多邊形的范圍內(nèi),可以有效確定出兩個(gè)多邊形是否發(fā)生相交,進(jìn)而得出兩個(gè)SVG圖形是否發(fā)生碰撞的結(jié)論。通過這一方式,可以提高SVG圖形碰撞檢測(cè)的準(zhǔn)確度,能夠?yàn)榛赟VG圖形碰撞檢測(cè)結(jié)果進(jìn)行的后續(xù)相關(guān)處理提供準(zhǔn)確且可靠的決策支持。
本發(fā)明的其他特征和優(yōu)點(diǎn)將在隨后的具體實(shí)施方式部分予以詳細(xì)說明。
附圖說明
附圖是用來提供對(duì)本發(fā)明的進(jìn)一步理解,并且構(gòu)成說明書的一部分,與下面的具體實(shí)施方式一起用于解釋本發(fā)明,但并不構(gòu)成對(duì)本發(fā)明的限制。在附圖中:
圖1是矩形檢測(cè)法示意圖;
圖2是根據(jù)本發(fā)明的一實(shí)施方式的SVG圖形碰撞檢測(cè)方法的流程圖;
圖3是根據(jù)本發(fā)明的一實(shí)施方式的SVG圖形碰撞檢測(cè)的場(chǎng)景示意圖;
圖4至圖6是三種確定檢測(cè)點(diǎn)所在的水平線在該檢測(cè)點(diǎn)的左側(cè)與多邊形之間的交點(diǎn)的總數(shù)的場(chǎng)景示意圖;
圖7是根據(jù)本發(fā)明的另一實(shí)施方式的SVG圖形碰撞檢測(cè)的場(chǎng)景示意圖;
圖8是根據(jù)本發(fā)明的另一實(shí)施方式的SVG圖形碰撞檢測(cè)方法的流程圖;
圖9A和圖9B是根據(jù)本發(fā)明的多種實(shí)施方式的SVG圖形碰撞檢測(cè)裝置的結(jié)構(gòu)框圖。
具體實(shí)施方式
以下結(jié)合附圖對(duì)本發(fā)明的具體實(shí)施方式進(jìn)行詳細(xì)說明。應(yīng)當(dāng)理解的是,此處所描述的具體實(shí)施方式僅用于說明和解釋本發(fā)明,并不用于限制本發(fā)明。
圖2是根據(jù)本發(fā)明的一種實(shí)施方式的SVG圖形碰撞檢測(cè)方法的流程圖。如圖2所示,該方法可以包括以下步驟。
在步驟201中,在第一SVG圖形上獲取第一檢測(cè)點(diǎn)集合,該第一檢測(cè)點(diǎn)集合用于形成內(nèi)接于該第一SVG圖形中的第一多邊形。
在步驟202中,在第二SVG圖形上獲取第二檢測(cè)點(diǎn)集合,該第二檢測(cè)點(diǎn)集合用于形成內(nèi)接于該第二SVG圖形中的第二多邊形。
示例地,如圖3所示,在第一SVG圖形20上獲取若干個(gè)檢測(cè)點(diǎn),例如,檢測(cè)點(diǎn)201~20n,其中,n為第一SVG圖形20上的檢測(cè)點(diǎn)的總數(shù),這些檢測(cè)點(diǎn)201~20n形成第一檢測(cè)點(diǎn)集合。通過將檢測(cè)點(diǎn)201~20n順次連接,可以形成內(nèi)接于第一SVG圖形20中的第一多邊形40。
另外,在第二SVG圖形30上獲取若干個(gè)檢測(cè)點(diǎn),例如,檢測(cè)點(diǎn)301~30m,其中,m為第二SVG圖形30上的檢測(cè)點(diǎn)的總數(shù),這些檢測(cè)點(diǎn)301~30m形成第二檢測(cè)點(diǎn)集合。通過將檢測(cè)點(diǎn)301~30m順次連接,可以形成內(nèi)接于第二SVG圖形30中的第二多邊形50。
示例地,在一個(gè)實(shí)施方式中,可以通過以下方式來獲取第一檢測(cè)點(diǎn)集合和第二檢測(cè)點(diǎn)集合。例如,如圖3所示,針對(duì)第一檢測(cè)點(diǎn)集合:首先,在第一SVG圖形20上獲取第一初始位置點(diǎn),例如,檢測(cè)點(diǎn)201,之后,以該第一初始位置點(diǎn)為起點(diǎn)、按照第一預(yù)設(shè)步長(zhǎng)、沿第一SVG圖形20獲取多個(gè)第一中間位置點(diǎn),例如,檢測(cè)點(diǎn)202~20n。最后,基于所述第一初始位置點(diǎn)和所述多個(gè)第一中間位置點(diǎn),形成該第一檢測(cè)點(diǎn)集合。接下來,針對(duì)第二檢測(cè)點(diǎn)集合,采用上述相同的方式,即,首先,在第二SVG圖形30上獲取第二初始位置點(diǎn),例如,檢測(cè)點(diǎn)301,之后,以該第二初始位置點(diǎn)為起點(diǎn)、按照第二預(yù)設(shè)步長(zhǎng)、沿第二SVG圖形30獲取多個(gè)第二中間位置點(diǎn),例如,檢測(cè)點(diǎn)302~30m。最后,基于所述第二初始位置點(diǎn)和所述多個(gè)第二中間位置點(diǎn),形成該第二檢測(cè)點(diǎn)集合。在本發(fā)明中,第一預(yù)設(shè)步長(zhǎng)可以與第二預(yù)設(shè)步長(zhǎng)相等,或者也可以不相等,這兩者都可以根據(jù)實(shí)際所需的檢測(cè)精度來設(shè)定。
返回到圖2,上述SVG圖形碰撞檢測(cè)方法還可以包括以下步驟。
在步驟203中,判斷第一檢測(cè)點(diǎn)集合中是否包括落入到第二多邊形的范圍內(nèi)的檢測(cè)點(diǎn)。
示例地,可以遍歷第一檢測(cè)點(diǎn)集合中的各個(gè)檢測(cè)點(diǎn),判斷該檢測(cè)點(diǎn)是否落入到第二多邊形的范圍內(nèi)。在確定當(dāng)前遍歷到的檢測(cè)點(diǎn)落入到第二多邊形的范圍內(nèi)時(shí),可以結(jié)束上述遍歷過程,并得出第一檢測(cè)點(diǎn)集合中包括落入到第二多邊形的范圍內(nèi)的檢測(cè)點(diǎn)的結(jié)論。此外,如果遍歷完第一檢測(cè)點(diǎn)集合中的各個(gè)檢測(cè)點(diǎn),確定各個(gè)檢測(cè)點(diǎn)均未落入到第二多邊形的范圍內(nèi)時(shí),可以得出第一檢測(cè)點(diǎn)集合中不包括落入到第二多邊形的范圍內(nèi)的檢測(cè)點(diǎn)的結(jié)論。
如圖3所示,通過步驟203,可以確定出第一檢測(cè)點(diǎn)集合中的檢測(cè)點(diǎn)203落入到第二多邊形50的范圍內(nèi)。
在步驟204中,在確定第一檢測(cè)點(diǎn)集合中包括落入到第二多邊形的范圍內(nèi)的檢測(cè)點(diǎn)時(shí),確定第一SVG圖形與第二SVG圖形之間發(fā)生碰撞。示例地,如圖3所示,由于第一檢測(cè)點(diǎn)集合中的檢測(cè)點(diǎn)203落入到第二多邊形50的范圍內(nèi),因此,可以確定第一SVG圖形20與第二SVG圖形30之間發(fā)生碰撞。
綜上,在上述技術(shù)方案中,通過在兩個(gè)SVG圖形上分別獲取檢測(cè)點(diǎn),并利用各個(gè)檢測(cè)點(diǎn),形成分別內(nèi)接于兩個(gè)SVG圖形中的兩個(gè)多邊形。通過判斷其中一個(gè)多邊形上的檢測(cè)點(diǎn)是否落入到另一個(gè)多邊形的范圍內(nèi),可以有效確定出兩個(gè)多邊形是否發(fā)生相交,進(jìn)而得出兩個(gè)SVG圖形是否發(fā)生碰撞的結(jié)論。通過這一方式,可以提高SVG圖形碰撞檢測(cè)的準(zhǔn)確度,能夠?yàn)榛赟VG圖形碰撞檢測(cè)結(jié)果進(jìn)行的后續(xù)相關(guān)處理提供準(zhǔn)確且可靠的決策支持。
在具體判斷某個(gè)檢測(cè)點(diǎn)是否落入到某個(gè)多邊形的范圍內(nèi)時(shí),可以采用以下方式,不過應(yīng)當(dāng)理解的是,下述方式僅僅是一種示例實(shí)施方式,僅用于說明本發(fā)明,并不用于限制本發(fā)明。
示例地,在判斷第一檢測(cè)點(diǎn)集合中是否包括落入到第二多邊形的范圍內(nèi)的檢測(cè)點(diǎn)時(shí),可以首先遍歷該第一檢測(cè)點(diǎn)集合,判斷是否存在滿足第一預(yù)設(shè)條件的第一檢測(cè)點(diǎn),其中,該第一預(yù)設(shè)條件為:第一檢測(cè)點(diǎn)所在的水平線在該第一檢測(cè)點(diǎn)的左側(cè)與第二多邊形的交點(diǎn)的總數(shù)為奇數(shù),且在該第一檢測(cè)點(diǎn)的右側(cè)與第二多邊形的交點(diǎn)的總數(shù)為奇數(shù)。
下面以圖3所示的三個(gè)檢測(cè)點(diǎn)(分別是檢測(cè)點(diǎn)201、檢測(cè)點(diǎn)202和檢測(cè)點(diǎn)203)為例進(jìn)行說明。首先,當(dāng)遍歷到檢測(cè)點(diǎn)201時(shí),該檢測(cè)點(diǎn)201所在的水平線在該檢測(cè)點(diǎn)201的左側(cè)與第二多邊形50的交點(diǎn)的總數(shù)為0,且在該檢測(cè)點(diǎn)201的右側(cè)與第二多邊形50的交點(diǎn)的總數(shù)為0,不滿足上述第一預(yù)設(shè)條件,因此,該檢測(cè)點(diǎn)201不為上述第一檢測(cè)點(diǎn)。接下來,當(dāng)遍歷到檢測(cè)點(diǎn)202時(shí),同理,該檢測(cè)點(diǎn)202所在的水平線在該檢測(cè)點(diǎn)202的左側(cè)與第二多邊形50的交點(diǎn)的總數(shù)為0,且在該檢測(cè)點(diǎn)202的右側(cè)與第二多邊形50的交點(diǎn)的總數(shù)為0,不滿足上述第一預(yù)設(shè)條件,因此,該檢測(cè)點(diǎn)202不為上述第一檢測(cè)點(diǎn)。繼續(xù)遍歷,當(dāng)遍歷到檢測(cè)點(diǎn)203時(shí),該檢測(cè)點(diǎn)203所在的水平線在該檢測(cè)點(diǎn)203的左側(cè)與第二多邊形50的交點(diǎn)的總數(shù)為1,且在該檢測(cè)點(diǎn)203的右側(cè)與第二多邊形50的交點(diǎn)的總數(shù)為1,滿足上述第一預(yù)設(shè)條件,因此,該檢測(cè)點(diǎn)203為上述第一檢測(cè)點(diǎn)。
當(dāng)確定第一檢測(cè)點(diǎn)集合中存在滿足上述第一預(yù)設(shè)條件的第一檢測(cè)點(diǎn)時(shí),確定該第一檢測(cè)點(diǎn)集合中包括落入到第二多邊形的范圍內(nèi)的檢測(cè)點(diǎn)。并且,可選地,可以跳出上述遍歷過程,不再對(duì)其他檢測(cè)點(diǎn)進(jìn)行判斷,并執(zhí)行步驟204,直接得出第一SVG圖形20與第二SVG圖形30之間發(fā)生碰撞的結(jié)論。
示例地,第一檢測(cè)點(diǎn)所在的水平線在該第一檢測(cè)點(diǎn)的左側(cè)與第二多邊形的交點(diǎn)的總數(shù)為:第二多邊形中位于第一檢測(cè)點(diǎn)所在的垂直線的左側(cè)、且位于第一檢測(cè)點(diǎn)所在的水平線的下方的部分與該水平線的交點(diǎn)的總數(shù)。此外,第一檢測(cè)點(diǎn)所在的水平線在該第一檢測(cè)點(diǎn)的右側(cè)與第二多邊形的交點(diǎn)的總數(shù)為:第二多邊形中位于第一檢測(cè)點(diǎn)所在的垂直線的右側(cè)、且位于第一檢測(cè)點(diǎn)所在的水平線的下方的部分與該水平線的交點(diǎn)的總數(shù)。
圖4至圖6示出了三種確定檢測(cè)點(diǎn)所在的水平線在該檢測(cè)點(diǎn)的左側(cè)與多邊形之間的交點(diǎn)的總數(shù)的場(chǎng)景示意圖。首先,如圖4至圖6所示,檢測(cè)點(diǎn)60所在的垂直線如虛線70所示,該檢測(cè)點(diǎn)60所在的水平線如虛線80所示。如圖4所示,多邊形90中位于檢測(cè)點(diǎn)60所在的垂直線的左側(cè)、且位于檢測(cè)點(diǎn)60所在的水平線的下方的部分總共包括三條邊線,分別是邊線901、邊線902和邊線903。確定檢測(cè)點(diǎn)60所在的水平線與這些邊線之間的交點(diǎn)總數(shù),例如,如圖3所示,交點(diǎn)總數(shù)為1。
此外,如圖5所示,多邊形90中位于檢測(cè)點(diǎn)60所在的垂直線的左側(cè)、且位于檢測(cè)點(diǎn)60所在的水平線的下方的部分總共包括三條邊線,分別是邊線901、邊線902和邊線903。確定檢測(cè)點(diǎn)60所在的水平線與這些邊線之間的交點(diǎn)總數(shù),例如,如圖5所示,交點(diǎn)總數(shù)為1。由于選擇了多邊形90中位于檢測(cè)點(diǎn)60所在的垂直線的左側(cè)、且位于檢測(cè)點(diǎn)60所在的水平線的下方的部分,因此,即便是多邊形90中位于檢測(cè)點(diǎn)60所在的水平線的上方的邊線904和邊線905與該檢測(cè)點(diǎn)60所在的水平線之間相交,在確定該檢測(cè)點(diǎn)60所在的水平線在該檢測(cè)點(diǎn)60的左側(cè)與多邊形90之間的交點(diǎn)的總數(shù)時(shí),該相交情況也不予考慮,即,算作是此處沒有交點(diǎn)。
此外,如圖6所示,多邊形90中位于檢測(cè)點(diǎn)60所在的垂直線的左側(cè)、且位于檢測(cè)點(diǎn)60所在的水平線的下方的部分總共包括三條邊線,分別是邊線901、邊線902和邊線903。確定檢測(cè)點(diǎn)60所在的水平線與這些邊線之間的交點(diǎn)總數(shù),例如,如圖6所示,交點(diǎn)總數(shù)為3。在該示例中,邊線902與該水平線的交點(diǎn)和邊線903與該水平線的交點(diǎn)重合,此時(shí),此處算作具有兩個(gè)交點(diǎn)。
雖然上面以圖4至圖6為例描述了如何確定檢測(cè)點(diǎn)所在的水平線在該檢測(cè)點(diǎn)的左側(cè)與多邊形的交點(diǎn)的總數(shù)的實(shí)施方式,不過應(yīng)當(dāng)理解的是,確定檢測(cè)點(diǎn)所在的水平線在該檢測(cè)點(diǎn)的右側(cè)與多邊形的交點(diǎn)的總數(shù)的實(shí)施方式與之相同,因此,本發(fā)明不再進(jìn)行贅述。
在實(shí)際情況中,除了如圖3所示的兩個(gè)SVG圖形之間發(fā)生碰撞是由于這兩個(gè)SVG圖形之間相交的場(chǎng)景之外,兩個(gè)SVG圖形之間發(fā)生碰撞還存在另一種場(chǎng)景,即,其中一個(gè)SVG圖形內(nèi)嵌于另一個(gè)SVG圖形之中,如圖7所示的場(chǎng)景。在這種情況下,第一SVG圖形20上的檢測(cè)點(diǎn)沒有位于內(nèi)接于第二SVG圖形30中的第二多邊形50的范圍內(nèi)的,如果僅通過判斷第一SVG圖形20上的第一檢測(cè)點(diǎn)集合中是否包括落入到第二多邊形50的范圍內(nèi)的檢測(cè)點(diǎn),來做出關(guān)于兩個(gè)SVG圖形是否發(fā)生碰撞的結(jié)論,針對(duì)此種場(chǎng)景,可能會(huì)做出誤判。因此,在本發(fā)明的另一個(gè)實(shí)施方式中,如圖8所示,上述SVG圖形碰撞檢測(cè)方法還可以包括以下步驟。
在步驟205中,在確定第一檢測(cè)點(diǎn)集合中不包括落入到第二多邊形的范圍內(nèi)的檢測(cè)點(diǎn)時(shí),判斷第二檢測(cè)點(diǎn)集合中是否包括落入到第一多邊形的范圍內(nèi)的檢測(cè)點(diǎn)。
示例地,可以遍歷第二檢測(cè)點(diǎn)集合中的各個(gè)檢測(cè)點(diǎn),判斷該檢測(cè)點(diǎn)是否落入到第一多邊形的范圍內(nèi)。在確定當(dāng)前遍歷到的檢測(cè)點(diǎn)落入到第一多邊形的范圍內(nèi)時(shí),可以結(jié)束上述遍歷過程,并得出第二檢測(cè)點(diǎn)集合中包括落入到第一多邊形的范圍內(nèi)的檢測(cè)點(diǎn)的結(jié)論。此外,如果遍歷完第二檢測(cè)點(diǎn)集合中的各個(gè)檢測(cè)點(diǎn),確定各個(gè)檢測(cè)點(diǎn)均未落入到第一多邊形的范圍內(nèi)時(shí),可以得出第二檢測(cè)點(diǎn)集合中不包括落入到第一多邊形的范圍內(nèi)的檢測(cè)點(diǎn)的結(jié)論。
在步驟206中,在確定第二檢測(cè)點(diǎn)集合中包括落入到第一多邊形的范圍內(nèi)的檢測(cè)點(diǎn)時(shí),確定第一SVG圖形與第二SVG圖形之間發(fā)生碰撞。否則,確定第一SVG圖形與第二SVG圖形之間未發(fā)生碰撞。
通過這一實(shí)施方式,可以有效且準(zhǔn)確地檢測(cè)出當(dāng)一個(gè)SVG圖形內(nèi)嵌于另一個(gè)SVG圖形中時(shí),兩個(gè)SVG圖形發(fā)生碰撞的情況,從而可以進(jìn)一步提高碰撞檢測(cè)的準(zhǔn)確度。
示例地,同上面描述的如何判斷第一檢測(cè)點(diǎn)集合中是否包括落入到第二多邊形的范圍內(nèi)的實(shí)施方式相類似,在判斷第二檢測(cè)點(diǎn)集合中是否包括落入到第一多邊形的范圍內(nèi)的檢測(cè)點(diǎn)時(shí),可以采用如下方式:
遍歷第二檢測(cè)點(diǎn)集合,判斷是否存在滿足第二預(yù)設(shè)條件的第二檢測(cè)點(diǎn),其中,該第二預(yù)設(shè)條件為:第二檢測(cè)點(diǎn)所在的水平線在該第二檢測(cè)點(diǎn)的左側(cè)與第一多邊形的交點(diǎn)的總數(shù)為奇數(shù),且在該第二檢測(cè)點(diǎn)的右側(cè)與第一多邊形的交點(diǎn)的總數(shù)為奇數(shù)。當(dāng)?shù)诙z測(cè)點(diǎn)集合中存在滿足第二預(yù)設(shè)條件的第二檢測(cè)點(diǎn)時(shí),確定第二檢測(cè)點(diǎn)集合中包括落入到第一多邊形的范圍內(nèi)的檢測(cè)點(diǎn)。
此外,第二檢測(cè)點(diǎn)所在的水平線在該第二檢測(cè)點(diǎn)的左側(cè)與第一多邊形的交點(diǎn)的總數(shù)可以為:第一多邊形中位于第二檢測(cè)點(diǎn)所在的垂直線的左側(cè)、且位于第二檢測(cè)點(diǎn)所在的水平線的下方的部分與該水平線的交點(diǎn)的總數(shù)。并且,第二檢測(cè)點(diǎn)所在的水平線在該第二檢測(cè)點(diǎn)的右側(cè)與第一多邊形的交點(diǎn)的總數(shù)可以為:第一多邊形中位于第二檢測(cè)點(diǎn)所在的垂直線的右側(cè)、且位于第二檢測(cè)點(diǎn)所在的水平線的下方的部分與該水平線的交點(diǎn)的總數(shù)。
圖9A和圖9B是根據(jù)本發(fā)明的多種實(shí)施方式的SVG圖形碰撞檢測(cè)裝置900的結(jié)構(gòu)框圖。如圖9A所示,該裝置900可以包括:第一獲取模塊901,用于在第一SVG圖形上獲取第一檢測(cè)點(diǎn)集合,所述第一檢測(cè)點(diǎn)集合用于形成內(nèi)接于所述第一SVG圖形中的第一多邊形;第二獲取模塊902,用于在第二SVG圖形上獲取第二檢測(cè)點(diǎn)集合,所述第二檢測(cè)點(diǎn)集合用于形成內(nèi)接于所述第二SVG圖形中的第二多邊形;第一判斷模塊903,用于判斷所述第一檢測(cè)點(diǎn)集合中是否包括落入到所述第二多邊形的范圍內(nèi)的檢測(cè)點(diǎn);碰撞檢測(cè)模塊904,用于在確定所述第一檢測(cè)點(diǎn)集合中包括落入到所述第二多邊形的范圍內(nèi)的檢測(cè)點(diǎn)時(shí),確定所述第一SVG圖形與所述第二SVG圖形之間發(fā)生碰撞。
在上述技術(shù)方案中,通過在兩個(gè)SVG圖形上分別獲取檢測(cè)點(diǎn),并利用各個(gè)檢測(cè)點(diǎn),形成分別內(nèi)接于兩個(gè)SVG圖形中的兩個(gè)多邊形。通過判斷其中一個(gè)多邊形上的檢測(cè)點(diǎn)是否落入到另一個(gè)多邊形的范圍內(nèi),可以有效確定出兩個(gè)多邊形是否發(fā)生相交,或者是否其中一個(gè)內(nèi)嵌于另一個(gè)中,進(jìn)而得出兩個(gè)SVG圖形是否發(fā)生碰撞的結(jié)論。通過這一方式,可以提高SVG圖形碰撞檢測(cè)的準(zhǔn)確度,能夠?yàn)榛赟VG圖形碰撞檢測(cè)結(jié)果進(jìn)行的后續(xù)相關(guān)處理提供準(zhǔn)確且可靠的決策支持。
可選地,所述第一獲取模塊901可以包括:第一獲取子模塊,用于在所述第一SVG圖形上獲取第一初始位置點(diǎn);第二獲取子模塊,用于以所述第一初始位置點(diǎn)為起點(diǎn)、按照第一預(yù)設(shè)步長(zhǎng)、沿所述第一SVG圖形獲取多個(gè)第一中間位置點(diǎn);第一檢測(cè)點(diǎn)集合形成子模塊,用于基于所述第一初始位置點(diǎn)和所述多個(gè)第一中間位置點(diǎn),形成所述第一檢測(cè)點(diǎn)集合;所述第二獲取模塊802可以包括;第三獲取子模塊,用于在所述第二SVG圖形上獲取第二初始位置點(diǎn);第四獲取子模塊,用于以所述第二初始位置點(diǎn)為起點(diǎn)、按照第二預(yù)設(shè)步長(zhǎng)、沿所述第二SVG圖形獲取多個(gè)第二中間位置點(diǎn);第二檢測(cè)點(diǎn)集合形成子模塊,用于基于所述第二初始位置點(diǎn)和所述多個(gè)第二中間位置點(diǎn),形成所述第二檢測(cè)點(diǎn)集合。
可選地,所述第一判斷模塊903可以包括:第一判斷子模塊,用于遍歷所述第一檢測(cè)點(diǎn)集合,判斷是否存在滿足第一預(yù)設(shè)條件的第一檢測(cè)點(diǎn),其中,所述第一預(yù)設(shè)條件為:所述第一檢測(cè)點(diǎn)所在的水平線在該第一檢測(cè)點(diǎn)的左側(cè)與所述第二多邊形的交點(diǎn)的總數(shù)為奇數(shù),且在該第一檢測(cè)點(diǎn)的右側(cè)與所述第二多邊形的交點(diǎn)的總數(shù)為奇數(shù);第一確定子模塊,用于當(dāng)所述第一檢測(cè)點(diǎn)集合中存在滿足所述第一預(yù)設(shè)條件的第一檢測(cè)點(diǎn)時(shí),確定所述第一檢測(cè)點(diǎn)集合中包括落入到所述第二多邊形的范圍內(nèi)的檢測(cè)點(diǎn)。
可選地,所述第一檢測(cè)點(diǎn)所在的水平線在該第一檢測(cè)點(diǎn)的左側(cè)與所述第二多邊形的交點(diǎn)的總數(shù)為:所述第二多邊形中位于所述第一檢測(cè)點(diǎn)所在的垂直線的左側(cè)、且位于所述第一檢測(cè)點(diǎn)所在的水平線的下方的部分與該水平線的交點(diǎn)的總數(shù);以及,所述第一檢測(cè)點(diǎn)所在的水平線在該第一檢測(cè)點(diǎn)的右側(cè)與所述第二多邊形的交點(diǎn)的總數(shù)為:所述第二多邊形中位于所述第一檢測(cè)點(diǎn)所在的垂直線的右側(cè)、且位于所述第一檢測(cè)點(diǎn)所在的水平線的下方的部分與該水平線的交點(diǎn)的總數(shù)。
可選地,如圖9B所示,所述裝置900還可以包括:第二判斷模塊905,用于在確定所述第一檢測(cè)點(diǎn)集合中不包括落入到所述第二多邊形的范圍內(nèi)的檢測(cè)點(diǎn)時(shí),判斷所述第二檢測(cè)點(diǎn)集合中是否包括落入到所述第一多邊形的范圍內(nèi)的檢測(cè)點(diǎn)。在這種情況下,所述碰撞檢測(cè)模塊904還可以用于在所述第二檢測(cè)點(diǎn)集合中包括落入到所述第一多邊形的范圍內(nèi)的檢測(cè)點(diǎn)時(shí),確定所述第一SVG圖形與所述第二SVG圖形之間發(fā)生碰撞。
可選地,所述第二判斷模塊905可以包括:第二判斷子模塊,用于遍歷所述第二檢測(cè)點(diǎn)集合,判斷是否存在滿足第二預(yù)設(shè)條件的第二檢測(cè)點(diǎn),其中,所述第二預(yù)設(shè)條件為:所述第二檢測(cè)點(diǎn)所在的水平線在該第二檢測(cè)點(diǎn)的左側(cè)與所述第一多邊形的交點(diǎn)的總數(shù)為奇數(shù),且在該第二檢測(cè)點(diǎn)的右側(cè)與所述第一多邊形的交點(diǎn)的總數(shù)為奇數(shù);第二確定子模塊,用于當(dāng)所述第二檢測(cè)點(diǎn)集合中存在滿足所述第二預(yù)設(shè)條件的第二檢測(cè)點(diǎn)時(shí),確定所述第二檢測(cè)點(diǎn)集合中包括落入到所述第一多邊形的范圍內(nèi)的檢測(cè)點(diǎn)。
可選地,所述第二檢測(cè)點(diǎn)所在的水平線在該第二檢測(cè)點(diǎn)的左側(cè)與所述第一多邊形的交點(diǎn)的總數(shù)為:所述第一多邊形中位于所述第二檢測(cè)點(diǎn)所在的垂直線的左側(cè)、且位于所述第二檢測(cè)點(diǎn)所在的水平線的下方的部分與該水平線的交點(diǎn)的總數(shù);所述第二檢測(cè)點(diǎn)所在的水平線在該第二檢測(cè)點(diǎn)的右側(cè)與所述第一多邊形的交點(diǎn)的總數(shù)為:所述第一多邊形中位于所述第二檢測(cè)點(diǎn)所在的垂直線的右側(cè)、且位于所述第二檢測(cè)點(diǎn)所在的水平線的下方的部分與該水平線的交點(diǎn)的總數(shù)。
以上結(jié)合附圖詳細(xì)描述了本發(fā)明的優(yōu)選實(shí)施方式,但是,本發(fā)明并不限于上述實(shí)施方式中的具體細(xì)節(jié),在本發(fā)明的技術(shù)構(gòu)思范圍內(nèi),可以對(duì)本發(fā)明的技術(shù)方案進(jìn)行多種簡(jiǎn)單變型,這些簡(jiǎn)單變型均屬于本發(fā)明的保護(hù)范圍。
另外需要說明的是,在上述具體實(shí)施方式中所描述的各個(gè)具體技術(shù)特征,在不矛盾的情況下,可以通過任何合適的方式進(jìn)行組合。為了避免不必要的重復(fù),本發(fā)明對(duì)各種可能的組合方式不再另行說明。
此外,本發(fā)明的各種不同的實(shí)施方式之間也可以進(jìn)行任意組合,只要其不違背本發(fā)明的思想,其同樣應(yīng)當(dāng)視為本發(fā)明所公開的內(nèi)容。