本技術(shù)方案涉及一種判斷觸點(diǎn)是否在不規(guī)則多邊形內(nèi)部的方法。
背景技術(shù):
為了能在移動(dòng)設(shè)備中以傳統(tǒng)讀報(bào)的習(xí)慣閱讀報(bào)紙,需要將一塊圖片區(qū)域?qū)?yīng)到具體的報(bào)道內(nèi)容,因此就產(chǎn)生了如何識別用戶點(diǎn)擊的圖片區(qū)域的問題。目前常規(guī)的處理辦法存在如下缺陷:首先是將圖片區(qū)域通過標(biāo)準(zhǔn)的4點(diǎn)劃分為多個(gè)標(biāo)準(zhǔn)的矩形,若頁面排版不是規(guī)矩的矩形,那么對圖片的劃分就與實(shí)際不相符,會(huì)導(dǎo)致用戶點(diǎn)擊文章A的區(qū)域打開文章B的情況。其次是實(shí)現(xiàn)了對不規(guī)則區(qū)域的標(biāo)記,但是會(huì)出現(xiàn)用戶點(diǎn)擊某個(gè)位置時(shí)激活兩個(gè)區(qū)域,不能準(zhǔn)確識別用戶的意圖。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于提供一種判斷觸點(diǎn)是否在不規(guī)則多邊形內(nèi)部的方法,運(yùn)用此方法能將圖片區(qū)域劃分成多個(gè)不規(guī)則的形狀,并可有效的識別用戶的點(diǎn)擊區(qū)域。
實(shí)現(xiàn)本發(fā)明目的的技術(shù)方案是:一種判斷觸點(diǎn)是否在不規(guī)則多邊形內(nèi)部的方法,其特征在于:包括以下步驟:
1.1.將不規(guī)則多邊形的所有坐標(biāo)點(diǎn)集合作為一個(gè)數(shù)組輸入進(jìn)行計(jì)算;
1.2.將觸點(diǎn)坐標(biāo)作為一個(gè)數(shù)組輸入進(jìn)行計(jì)算;
1.3.判斷點(diǎn)(a,b)與點(diǎn)(c,d)連線,是否與點(diǎn)(0,y)與觸點(diǎn)坐標(biāo)(x,y)連線有交點(diǎn),并返回布爾值供后續(xù)計(jì)算;
1.4.將觸點(diǎn)的x軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù),如果步驟1.3中返回的布爾值為真,則將x軸焦點(diǎn)數(shù)計(jì)數(shù)+1;
1.5.判斷點(diǎn)(a,b)與點(diǎn)(c,d)連線,是否與點(diǎn)(x,0)與觸點(diǎn)坐標(biāo)(x,y)連線有交點(diǎn),并返回布爾值供后續(xù)計(jì)算;
1.6.將觸點(diǎn)的y軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù),如果步驟1.5中返回的布爾值為真,則將y軸焦點(diǎn)數(shù)計(jì)數(shù)+1;
1.7.判斷是否還有未計(jì)算的點(diǎn),將步驟1.1中輸入的坐標(biāo)集和數(shù)組減去步驟1.3與步驟1.4中已經(jīng)計(jì)算了的坐標(biāo)點(diǎn),若得出的值大于0則還有未計(jì)算的點(diǎn);
1.8.若還有未參與計(jì)算的點(diǎn),則將步驟1.3中后2個(gè)數(shù)與步驟1.7中剩余的點(diǎn)取前2個(gè)數(shù),替換為abcd,代入步驟1.3至1.7中循環(huán);
1.9.若全部點(diǎn)都參與了計(jì)算,則將最后2個(gè)點(diǎn)(i,j)與點(diǎn)(a,b)替換為abcd代入步驟1.3至1.6中計(jì)算;
1.10.判斷x軸焦點(diǎn)數(shù)與y軸焦點(diǎn)數(shù)是否都是奇數(shù):判斷步驟1.4和步驟1.6的計(jì)數(shù)值是否都為奇數(shù),并輸出布爾值;
1.11.若步驟1.10輸出的布爾值為真,則得到結(jié)論觸點(diǎn)在多邊形內(nèi)部,反之則得到結(jié)論觸點(diǎn)在多邊形外部。
本發(fā)明的優(yōu)點(diǎn)在于:1.能將圖片區(qū)域劃分成多個(gè)不規(guī)則的形狀,并可有效的識別用戶的點(diǎn)擊區(qū)域。2.點(diǎn)擊的位置歸屬識別準(zhǔn)確。技術(shù)實(shí)現(xiàn)未依賴第三方工具,完全基于最基本的數(shù)學(xué)定理計(jì)算。3.語法簡單。因?yàn)閮H使用了大于、小于的比較及短路與和短路或計(jì)算,能夠方便快速到移植到各計(jì)算機(jī)語言平臺(tái)。
附圖說明
圖1是本發(fā)明的邏輯流程圖;
圖2是實(shí)施例一的附圖;
圖3是實(shí)施例二的附圖。
具體實(shí)施方式
本發(fā)明涉及一種判斷觸點(diǎn)是否在不規(guī)則多邊形內(nèi)部的方法,其特征在于:包括以下步驟:
1.1.將不規(guī)則多邊形的所有坐標(biāo)點(diǎn)集合作為一個(gè)數(shù)組輸入進(jìn)行計(jì)算;
1.2.將觸點(diǎn)坐標(biāo)作為一個(gè)數(shù)組輸入進(jìn)行計(jì)算;
1.3.判斷點(diǎn)(a,b)與點(diǎn)(c,d)連線,是否與點(diǎn)(0,y)與觸點(diǎn)坐標(biāo)(x,y)連線有交點(diǎn),并返回布爾值供后續(xù)計(jì)算;
1.4.將觸點(diǎn)的x軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù),如果步驟1.3中返回的布爾值為真,則將x軸焦點(diǎn)數(shù)計(jì)數(shù)+1;
1.5.判斷點(diǎn)(a,b)與點(diǎn)(c,d)連線,是否與點(diǎn)(x,0)與觸點(diǎn)坐標(biāo)(x,y)連線有交點(diǎn),并返回布爾值供后續(xù)計(jì)算;
1.6.將觸點(diǎn)的y軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù),如果步驟1.5中返回的布爾值為真,則將y軸焦點(diǎn)數(shù)計(jì)數(shù)+1;
1.7.判斷是否還有未計(jì)算的點(diǎn),將步驟1.1中輸入的坐標(biāo)集和數(shù)組減去步驟1.3與步驟1.4中已經(jīng)計(jì)算了的坐標(biāo)點(diǎn),若得出的值大于0則還有未計(jì)算的點(diǎn);
1.8.若還有未參與計(jì)算的點(diǎn),則將步驟1.3中后2個(gè)數(shù)與步驟1.7中剩余的點(diǎn)取前2個(gè)數(shù),替換為abcd,代入步驟1.3至1.7中循環(huán);
1.9.若全部點(diǎn)都參與了計(jì)算,則將最后2個(gè)點(diǎn)(i,j)與點(diǎn)(a,b)替換為abcd代入步驟1.3至1.6中計(jì)算;
1.10.判斷x軸焦點(diǎn)數(shù)與y軸焦點(diǎn)數(shù)是否都是奇數(shù):判斷步驟1.4和步驟1.6的計(jì)數(shù)值是否都為奇數(shù),并輸出布爾值;
1.11.若步驟1.10輸出的布爾值為真,則得到結(jié)論觸點(diǎn)在多邊形內(nèi)部,反之則得到結(jié)論觸點(diǎn)在多邊形外部。
實(shí)施例一、
A、如圖2,輸入不規(guī)則多邊形順時(shí)針坐標(biāo)集合(1,5,3,5,3,3,4,3,4,1,1,1)
B、輸入觸點(diǎn)的坐標(biāo):(2,2);
C、判斷點(diǎn)(1,5)與點(diǎn)(3,5)的連線,是否與點(diǎn)(0,2)與觸點(diǎn)坐標(biāo)(2,2)連線有交點(diǎn),(1>2&&2>3&&2>5&&2>5)||(1<2&&2<3&&2>5&&2>5)=false ,故無交點(diǎn)。
D、觸點(diǎn)的x軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):0;
E、點(diǎn)(1,5)與點(diǎn)(3,5)連線,是否與點(diǎn)(2,0)與觸點(diǎn)坐標(biāo)(2,2)連線有交點(diǎn),(5>2&&2>5&&2>1&&2>3)||(5<2&&2<5&&2>1&&2>3)=false ,故無交點(diǎn)
F、觸點(diǎn)的y軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):0;
G、是否還有未計(jì)算的點(diǎn):一共12個(gè)點(diǎn),已計(jì)算4個(gè)點(diǎn),還有8個(gè)點(diǎn)未計(jì)算。
H、將未計(jì)算的2個(gè)數(shù)與上一步驟中后2個(gè)數(shù)替換為abcd進(jìn)入循環(huán):步驟C中后2個(gè)數(shù)與步驟G中剩余的點(diǎn)取前2個(gè)數(shù)(3,5,3,3),代入步驟C、D、E、F中循環(huán)
C、(3>2&&2>3&&2>5&&2>3)||(3<2&&2<3&&2>5&&2>3)=false
D、觸點(diǎn)的x軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):0;
E、(5>2&&2>3&&2>3&&2>3)||(5<2&&2<3&&2>3&&2>3)=false
F、觸點(diǎn)的y軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):0;
G、是否還有未計(jì)算的點(diǎn):一共12個(gè)點(diǎn),已計(jì)算6個(gè)點(diǎn),還有6個(gè)點(diǎn)未計(jì)算。
H、將未計(jì)算的2個(gè)數(shù)與上一步驟中后2個(gè)數(shù)替換為abcd進(jìn)入循環(huán):步驟C中后2個(gè)數(shù)與步驟G中剩余的點(diǎn)取前2個(gè)數(shù)(3,3,4,3),代入步驟C、D、E、F中循環(huán):
C、(3>2&&2>4&&2>3&&2>3)||(3<2&&2<4&&2>3&&2>3)=false
D、觸點(diǎn)的x軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):0;
E、(3>2&&2>3&&2>3&&2>4)||(3<2&&2<3&&2>3&&2>4)=false
F、觸點(diǎn)的y軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):0
G、是否還有未計(jì)算的點(diǎn):一共12個(gè)點(diǎn),已計(jì)算8個(gè)點(diǎn),還有4個(gè)點(diǎn)未計(jì)算。
H、將未計(jì)算的2個(gè)數(shù)與上一步驟中后2個(gè)數(shù)替換為abcd進(jìn)入循環(huán):步驟C中后2個(gè)數(shù)與步驟G中剩余的點(diǎn)取前2個(gè)數(shù)(4,3,4,1),代入步驟C、D、E、F中循環(huán)
C、(4>2&&2>4&&2>3&&2>1)||(4<2&&2<4&&2>3&&2>1)=false
D、觸點(diǎn)的x軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):0;
E、(3>2&&2>1&&2>4&&2>4)||(3<2&&2<1&&2>4&&2>4)=false
F、觸點(diǎn)的y軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):0;
G、是否還有未計(jì)算的點(diǎn):一共12個(gè)點(diǎn),已計(jì)算10個(gè)點(diǎn),還有2個(gè)點(diǎn)未計(jì)算。
H、將未計(jì)算的2個(gè)數(shù)與上一步驟中后2個(gè)數(shù)替換為abcd進(jìn)入循環(huán):步驟C中后2個(gè)數(shù)與步驟G中剩余的點(diǎn)取前2個(gè)數(shù)(4,1,1,1),代入步驟C、D、E、F中循環(huán)
C、(4>2&&2>1&&2>1&&2>1)||(4<2&&2<1&&2>1&&2>1)=true
D、觸點(diǎn)的x軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):1;
E、(1>2&&2>1&&2>4&&2>1)||(1<2&&2<1&&2>4&&2>1)=false
F、觸點(diǎn)的y軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):0;
I、最后2個(gè)點(diǎn)(1,1)與起始點(diǎn)(1,5)的連線是否被計(jì)算:在步驟G中循環(huán)剩余2個(gè)點(diǎn)或0個(gè)點(diǎn)是否與第一個(gè)坐標(biāo)進(jìn)行步驟C、D、E、F的計(jì)算;
J、將最后2個(gè)點(diǎn)(1,1)與點(diǎn)(1,5)替換為abcd進(jìn)入計(jì)算:步驟A中最后的2個(gè)點(diǎn)與為首的2個(gè)點(diǎn),一起代入步驟C、D、E、F中循環(huán)
C、(1>2&&2>1&&2>1&&2>5)||(1<2&&2<1&&2>1&&2>5)=false
D、觸點(diǎn)的x軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):1;
E、(1>2&&2>5&&2>1&&2>1)||(1<2&&2<5&&2>1&&2>1)=true
F、觸點(diǎn)的y軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):1;
K、判斷x軸焦點(diǎn)數(shù)與y軸焦點(diǎn)數(shù)是否都是奇數(shù):判斷步驟D計(jì)數(shù)值為1和步驟F的計(jì)數(shù)值為1,都為奇數(shù),并輸出布爾值true;
L、得出結(jié)論觸點(diǎn)在多邊形內(nèi)部:K輸出的布爾值為真,則得到結(jié)論觸點(diǎn)在多邊形內(nèi)部;
實(shí)施例二、
A、如圖3,輸入不規(guī)則多邊形順時(shí)針坐標(biāo)集合(1,5,3,5,3,3,4,3,4,1,1,1)
B、輸入觸點(diǎn)的坐標(biāo):(4,5);
C、判斷點(diǎn)(1,5)與點(diǎn)(3,5)的連線,是否與點(diǎn)(0,5)與觸點(diǎn)坐標(biāo)(4,5)連線有交點(diǎn),(1>4&&4>3&&5>5&&5>5)||(1<4&&4<3&&5>5&&5>5)=false ,故無交點(diǎn)。
D、觸點(diǎn)的x軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):0;
E、點(diǎn)(1,5)與點(diǎn)(3,5)連線,是否與點(diǎn)(4,0)與觸點(diǎn)坐標(biāo)(4,5)連線有交點(diǎn),(5>5&&5>5&&4>1&&4>3)||(5<5&&5<5&&4>1&&4>3)= false,故無交點(diǎn)
F、觸點(diǎn)的y軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):0;
G、是否還有未計(jì)算的點(diǎn):一共12個(gè)點(diǎn),已計(jì)算4個(gè)點(diǎn),還有8個(gè)點(diǎn)未計(jì)算。
H、將未計(jì)算的2個(gè)數(shù)與上一步驟中后2個(gè)數(shù)替換為abcd進(jìn)入循環(huán):步驟C中后2個(gè)數(shù)與步驟G中剩余的點(diǎn)取前2個(gè)數(shù)(3,5,3,3),代入步驟C、D、E、F中循環(huán)
C、(3>4&&4>3&&5>5&&5>3)||(3<4&&4<3&&5>5&&5>3)=false
D、觸點(diǎn)的x軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):0;
E、(5>5&&5>3&&4>3&&4>3)||(5<5&&5<3&&4>3&&4>3)= false
F、觸點(diǎn)的y軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):0;
G、是否還有未計(jì)算的點(diǎn):一共12個(gè)點(diǎn),已計(jì)算6個(gè)點(diǎn),還有6個(gè)點(diǎn)未計(jì)算。
H、將未計(jì)算的2個(gè)數(shù)與上一步驟中后2個(gè)數(shù)替換為abcd進(jìn)入循環(huán):步驟C中后2個(gè)數(shù)與步驟G中剩余的點(diǎn)取前2個(gè)數(shù)(3,3,4,3),代入步驟C、D、E、F中循環(huán):
C、(3>4&&4>4&&5>3&&5>3)||(3<4&&4<4&&5>3&&5>3)= false
D、觸點(diǎn)的x軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):0;
E、(3>5&&5>3&&4>3&&4>4)||(3<5&&5<3&&4>3&&4>4)=false
F、觸點(diǎn)的y軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):0;
G、是否還有未計(jì)算的點(diǎn):一共12個(gè)點(diǎn),已計(jì)算8個(gè)點(diǎn),還有4個(gè)點(diǎn)未計(jì)算。
H、將未計(jì)算的2個(gè)數(shù)與上一步驟中后2個(gè)數(shù)替換為abcd進(jìn)入循環(huán):步驟C中后2個(gè)數(shù)與步驟G中剩余的點(diǎn)取前2個(gè)數(shù)(4,3,4,1),代入步驟C、D、E、F中循環(huán)
C、(4>4&&4>4&&5>3&&5>1)||(4<4&&4<4&&5>3&&5>1)= false
D、觸點(diǎn)的x軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):0;
E、(3>5&&5>1&&4>4&&4>4)||(3<5&&5<1&&4>4&&4>4)=false
F、觸點(diǎn)的y軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):0;
G、是否還有未計(jì)算的點(diǎn):一共12個(gè)點(diǎn),已計(jì)算10個(gè)點(diǎn),還有2個(gè)點(diǎn)未計(jì)算。
H、將未計(jì)算的2個(gè)數(shù)與上一步驟中后2個(gè)數(shù)替換為abcd進(jìn)入循環(huán):步驟C中后2個(gè)數(shù)與步驟G中剩余的點(diǎn)取前2個(gè)數(shù)(4,1,1,1),代入步驟C、D、E、F中循環(huán)
C、(4>4&&4>1&&5>1&&5>1)||(4<4&&4<1&&5>1&&5>1)= false
D、觸點(diǎn)的x軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):0;
E、(1>5&&5>1&&4>4&&4>1)||(1<5&&5<1&&4>4&&4>1)=false
F、觸點(diǎn)的y軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):0;
I、最后2個(gè)點(diǎn)(1,1)與起始點(diǎn)(1,5)的連線是否被計(jì)算:在步驟G中循環(huán)剩余2個(gè)點(diǎn)或0個(gè)點(diǎn)是否與第一個(gè)坐標(biāo)進(jìn)行步驟C、D、E、F的計(jì)算;
J、將最后2個(gè)點(diǎn)(1,1)與點(diǎn)(1,5)替換為abcd進(jìn)入計(jì)算:步驟A中最后的2個(gè)點(diǎn)與為首的2個(gè)點(diǎn),一起代入步驟C、D、E、F中循環(huán)
C、(1>4&&4>1&&5>1&&5>5)||(1<4&&4<1&&5>1&&5>5)=false
D、觸點(diǎn)的x軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):0;
E、(1>5&&5>5&&4>1&&4>1)||(1<5&&5<5&&4>1&&4>1)=false
F、觸點(diǎn)的y軸的平行線與每一條邊的焦點(diǎn)數(shù)計(jì)數(shù):0;
K、判斷x軸焦點(diǎn)數(shù)與y軸焦點(diǎn)數(shù)是否都是奇數(shù):判斷步驟D計(jì)數(shù)值為0和步驟F的計(jì)數(shù)值為0,都不是奇數(shù),并輸出布爾值flase;
L、得出結(jié)論觸點(diǎn)在多邊形外部:E輸出的布爾值為假,則得到結(jié)論觸點(diǎn)在多邊形外部。