依然是計算幾何。
射線法判斷點與多邊形關系原理如下:
從待判斷點引出一條射線,射線與多邊形相交,如果交點為偶數,則點不在多邊形內,如果交點為奇數,則點在多邊形內。
原理雖是這樣,有些細節還是要注意一下,比如射線過多邊形頂點或射線與多邊形其中一邊重合等情況還需特別判斷。
這里就不特別判斷了,因為我只是熟悉原理,並不是實際運用。
好吧,我實際是太懶了,不想判斷了。
結果如下:
結果圖和線性分類器的組合有幾分相似。
matlab代碼如下:
clear all;close all;clc; polyn=20; poly=rand(polyn,2); poly=createSimplyPoly(poly); %創建簡單多邊形 polyn=polyn+1; %連線方便,把第一個點添加到最后一個點后面 poly(polyn,:)=poly(1,:); pn=500; p=rand(pn,2); hold on; for i=1:pn flag=0; for j=2:polyn x1=poly(j-1,1); %多邊形前后兩個點 y1=poly(j-1,2); x2=poly(j,1); y2=poly(j,2); k=(y1-y2)/(x1-x2); %多邊形一條邊直線 b=y1-k*x1; x=p(i,1); %過當前點直線和多邊形交點 y=k*x+b; if min([x1 x2])<=x && x<=max([x1 x2]) && ... %點同時在射線和多邊形邊上 min([y1 y2])<=y && y<=max([y1 y2]) && y>=p(i,2) flag=flag+1; end end if mod(flag,2)==0 %偶數則在外部 plot(p(i,1),p(i,2),'r.'); else %奇數則在內部 plot(p(i,1),p(i,2),'g.'); end end plot(poly(:,1),poly(:,2));
其中createSimplyPoly函數在這里可以找到。