No BSD License  

Highlights from
Fast points-in-polygon test

image thumbnail
from Fast points-in-polygon test by Darren Engwirda
Fast test to determine points located inside general polygon regions. Should be significantly faster

polydemo
function polydemo

% Demo function for inpoly
%
% Does some inpoly vs inpolygon comparisons
%
% Example:
%
%   polydemo        % Runs the demo

% Darren Engwirda - 2006

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                           Circle
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

answer = lower(input(['This is a demo function for inpoly. \n'                                                     ...
                      '\n'                                                                                         ...
                      'The following is a circle made up of 150 line segments \n'                                  ...
                      '\n'                                                                                         ...
                      'Continue?? [y/n] \n'],'s'));

if ~strcmp(answer,'y')
    return
end

% Geometry
dtheta = pi/150;
theta  = (-pi:dtheta:(pi-dtheta))';
node   = [cos(theta) sin(theta)];
n      = size(node,1);
cnect  = [(1:n-1)' (2:n)'; n 1];

% Test points
p = 3*(rand(10000,2)-0.5);


% Call inpolygon
tic, in = inpolygon(p(:,1),p(:,2),node(:,1),node(:,2)); t2 = toc;

% Call inpoly
tic, in = inpoly(p,node,cnect); t1 = toc;


cost_in_sec = struct('inpoly',t1,'inpolygon',t2)

figure, plot(p(in,1),p(in,2),'b.',p(~in,1),p(~in,2),'r.'), title('Inside points (blue) & outside points (red)')

% Plot geometry
patch('faces',cnect,'vertices',node,'facecolor','none','edgecolor','k'), axis equal


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                           Lake
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

answer = lower(input(['A lake outline from my mesh generator (mesh2d.m) \n' ...
                      '\n'                                                  ...
                      'Continue?? [y/n] \n'],'s'));

if ~strcmp(answer,'y')
    return
end

close all

%       From:
%       Computer Solutions Europe AB
%       Bjornnasvagen 21
%       S-113 47 Stockholm
%       SWEDEN
%       Tel:    +46 8 15 30 22
%       Fax:    +46 8 15 76 35
%       E-mail: info@comsol.se
%       URL:    http://www.comsol.se/

node=[
-8.9154147   1.6615920	
-8.8847064   1.5538653
-8.7270571   1.4396306
-8.6780329   1.3310253
-8.2763869   1.3642085
-7.7589437   1.5521208
-7.3399811   1.5866412
-7.2064877   1.7400111
-6.9871610   1.7838988
-6.9190874   1.6751018
-6.6594362   1.8237880
-6.4705078   2.0285109
-6.3982459   2.0257761
-6.1776033   2.1236043
-5.9683636   1.9041636
-6.0500631   1.6420917
-6.2751037   1.4382319
-6.2083449   1.2768143
-6.3593873   1.1233594
-6.4379782   0.9672913
-6.4389687   0.9408290
-6.3308569   0.9103191
-5.9216680   1.1606956
-5.8853530   1.1594465
-5.5306989   0.8827500
-5.4571118   0.9068911
-5.2776995   0.8218321
-4.6882658   1.0696109
-4.4325551   1.1157840
-3.9867787   1.5284986
-3.6232783   1.5733560
-3.5156848   1.5181578
-3.1151141   1.6162773
-2.6031886   1.9253444
-2.4201615   2.0814581
-2.0576784   2.1825510
-1.9469493   2.3929843
-1.6564457   2.6016249
-1.4385855   2.8113568
-1.1857180   2.9681802
-0.8965760   3.2839699
-0.4656316   3.4939341
-0.0715676   3.6520868
 0.3221563   3.5994536
 0.6089023   3.4943945
 0.6092879   3.3885375
 0.3942456   3.3878929
 0.2866788   3.4141384
 0.0717038   3.3345153
 0.0896864   3.2286668
 0.1076576   3.1757488
-0.1436793   3.0169900
-0.3235837   2.8584538
-0.4676923   2.7529346
-0.9391942   2.0668111
-1.0495193   1.7498742
-1.0882363   1.3531376
-1.0158452   1.3262275
-0.9424102   1.4845979
-0.6152380   1.7477533
-0.5061946   1.9061816
-0.2890742   2.0115316
-0.5066670   1.7473959
-0.6160022   1.5360392
-0.3979720   1.8000363
-0.1808403   1.8525961
 0.2894343   1.7998173
 0.5431103   1.6681146
 0.9058832   1.5373304
 0.9432856   1.3258124
 1.0534256   1.1147328
 1.1641909   0.8507940
 1.3109203   0.6930545
 1.3117251   0.5871977
 1.4214690   0.5351345
 1.9317215   0.5400872
 2.2226054   0.5965222
 2.3340522   0.4391798
 2.4073552   0.4137156
 2.4449497   0.3348350
 2.5909063   0.3369578
 2.6249835   0.4962917
 2.7343488   0.4979874
 2.8454551   0.3938967
 2.9366470   0.3954205
 2.9201944   0.2892562
 2.9931921   0.2905022
 3.3135431   0.7199108
 3.3863589   0.7213257
 3.9960329   1.1315466
 4.0705567   1.0538628
 4.6490632   1.1744760
 4.9039980   1.1550887
 5.4495532   1.1450567
 5.9850466   1.4278414
 6.1653805   1.4607402
 6.3476152   1.4409063
 6.6355959   1.5048353
 6.5309084   1.3948027
 6.4623697   1.2862027
 6.4803085   0.8098819
 6.4094979   0.7542354
 6.4100090   0.7012564
 6.4882671   0.5981826
 6.7068647   0.6065329
 6.8546905   0.5593290
 6.9296957   0.5093111
 7.3625916   0.6332439
 7.4195041   0.5826584
 7.4810256   0.4262426
 7.6622000   0.4606821
 7.7339418   0.4903887
 7.6927729   0.5946095
 7.6199031   0.5913803
 7.5788199   0.6956243
 7.4649955   0.7967085
 7.4604098   0.9025555
 7.6668095   1.1767640
 7.7709460   1.2875089
 7.7298813   1.3917132
 7.6707366   1.4951115
 7.6356734   1.4670289
 7.6246141   1.3074531
 7.5532118   1.2777792
 7.5280861   1.4357493
 7.5345391   1.7011603
 7.7131429   1.7621690
 7.8603274   1.7158544
 7.9228745   1.9308907
 7.7348899   2.0813402
 7.3713821   2.1182087
 7.2698318   1.9547751
 7.1885795   2.1633926
 7.1152657   2.1868122
 7.0441691   2.1573400
 6.9336956   2.2058041
 6.9676141   2.2602054
 7.0648074   2.5292990
 7.0897106   2.7954185
 7.2917362   3.1221593
 7.3230152   3.2295634
 7.2074219   3.4101256
 7.0987913   3.4319941
 7.0562590   3.5892427
 6.8349672   3.7390777
 6.5426013   3.8863685
 6.3538119   4.1440578
 6.6493349   4.7917061
 6.5385166   4.8932842
 6.7052993   5.1650313
 6.7009764   5.2708721
 5.7441174   5.2345817
 5.5686945   5.1755508
 4.7886070   5.1509481
 4.4636817   5.3536511
 4.2075761   5.6646354
 3.6075780   7.1858876
 3.3873644   7.6576363
 3.2804384   7.7613007
 3.1762847   7.7327191
 3.0381962   7.6506117
 2.8286881   7.6467634
 2.8598071   7.8590921
 2.6845531   7.9089847
 2.5468001   7.8008409
 2.4437671   7.6933492
 2.3390419   7.6917801
 2.1983122   7.7691861
 2.1616242   7.9010276
 2.0918985   7.9000964
 2.0235167   7.7933405
 1.9540682   7.7660064
 1.5705080   7.7353016
 1.5002116   7.7875578
 1.2547448   7.9442315
 0.7309650   8.1526824
 0.4522013   8.2575018
 0.1738657   8.3098811
-0.0694533   8.5215153
-0.1737495   8.4157382
-0.2084645   8.4422444
-0.3476150   8.3630957
-0.4518238   8.3898231
-0.5558115   8.4695476
-0.5215963   8.3106439
-0.5221188   8.1518584
-0.4879606   7.9400337
-0.2092654   7.8335660
-0.2097517   7.4630660
-0.5257651   7.0403597
-0.5604465   7.1463352
-0.7716285   6.9354925
-0.9473082   6.8835005
-0.9833619   6.7249256
-1.1593398   6.6731632
-1.2287946   6.7795396
-1.1574372   6.9378046
-0.6994015   7.4115277
-0.5933112   7.7286747
-0.6973173   7.8878837
-0.9759166   7.9422776
-1.1175557   7.6256239
-1.1194069   7.3609825
-1.2951661   7.2564438
-1.5483098   6.4117610
-1.9366363   6.3100700
-1.8637764   6.5209552
-1.7582839   6.5197737
-1.7202965   6.7840348
-1.5427314   6.9939696
-1.5417155   7.0998256
-1.5762336   7.1530937
-1.9985176   6.9989869
-2.3506579   6.8978706
-2.5645144   6.6893724
-2.5351899   6.3183276
-2.7562921   5.7395724
-3.7980607   5.0191439
-4.3373509   4.7676755
-4.9834948   4.5740477
-5.9256532   4.1282314
-7.0382285   3.1643631
-7.4517045   2.7580044
-8.2033903   2.1245258
-8.7235361   1.8639192
];

n     = size(node,1);
cnect =  [(1:n-1)', (2:n)'; n, 1];

% Test points
num = 20000;
p   = [20*(rand(num,1)-0.5),10*rand(num,1)];


% Call inpolygon
tic, in = inpolygon(p(:,1),p(:,2),node(:,1),node(:,2)); t2 = toc;

% Call inpoly
tic, in = inpoly(p,node,cnect); t1 = toc;


cost_in_sec = struct('inpoly',t1,'inpolygon',t2)

figure, plot(p(in,1),p(in,2),'b.',p(~in,1),p(~in,2),'r.'), title('Inside points (blue) & outside points (red)')

% Plot geometry
patch('faces',cnect,'vertices',node,'facecolor','none','edgecolor','k'), axis equal



answer = lower(input(['inpoly can also deal with domains with "islands" in them. inpolygon cannot.  \n' ...
                      '\n'                                                                              ...
                      'Continue?? [y/n] \n'],'s'));

if ~strcmp(answer,'y')
    return
end

close all

p1 = node;

p2=[
-6.0222359   1.4026510
-5.9152018   1.5578835
-5.8726343   1.5299217
-5.7920161   1.5536639
-5.8345898   1.5816055
-5.8318773   1.6609928
-5.6635570   1.7083083
-5.5966615   1.7590827
-5.6808641   1.8413432
-5.7929717   1.7391469
-6.0818599   1.5637339
-6.0865686   1.4314222
];

p3=[
-5.7324455   1.9225485
-5.5683675   1.9594866
-5.5335991   1.9159672
-5.5318777   1.9688923
-5.4498160   2.0457126
-5.4914569   2.1000333
-5.7297704   2.0019357
-5.7677013   1.9502324
];

p4=[
-5.2706487   2.2254789
-5.2257103   2.2770640
-5.2196558   2.3563407
-5.1911650   2.4614151
-5.2924029   2.4539566
-5.3166868   2.3699543
-5.3193455   2.2852741
-5.3444930   2.1748120
];

p5=[
-2.6285090   4.8904087
-2.5231726   4.8093509
-2.4524965   4.7818143
-2.1664250   4.9101487
-1.8814086   4.9860466
-2.0588911   4.9881727
-2.0937130   5.0415487
-1.9150532   5.1452403
-1.7011793   5.2487523
-1.5239785   5.2470098
-1.1676824   5.5087407
-1.2022868   5.6148538
-0.9185046   5.7718016
-0.8828910   5.8245348
-0.9532116   5.8778612
-1.3075201   5.7215257
-1.5563954   5.5649116
-1.6276655   5.5126727
-1.7340945   5.4872998
-1.8405570   5.4619959
-2.0900008   5.3326514
-2.3756722   5.1777288
-2.5904890   5.0486276
];

p6=[
-0.1745905   7.6482740
-0.1048759   7.4629629
-0.0174793   7.4629295
-0.0349355   7.5687895
 0.0349007   7.7275752
 0.2267794   7.7806613
 0.3839078   7.7280333
 0.5583180   7.7550129
 0.6632222   7.7024853
 0.8201638   7.7296796
 0.7325480   7.8086476
 0.6273773   7.9405222
 0.4880418   7.9135694
 0.1393711   7.9922753
 0.0348428   7.9922181
-0.1743299   7.8864526
];

p7=[
 4.5964504   4.4039327
 4.8814214   4.4120893
 4.9866866   4.4681990
 5.1274771   4.5254771
 5.1614199   4.5795088
 5.0886198   4.6302255
 4.9818982   4.6269721
 4.8364965   4.7285905
 4.5535316   4.6675729
 4.3785074   4.5569131
 4.3813116   4.4510625
];


n1 = size(p1,1);
n2 = size(p2,1);
n3 = size(p3,1);
n4 = size(p4,1);
n5 = size(p5,1);
n6 = size(p6,1);
n7 = size(p7,1);

c1 = [(1:n1-1)', (2:n1)'; n1, 1];
c2 = [(1:n2-1)', (2:n2)'; n2, 1];
c3 = [(1:n3-1)', (2:n3)'; n3, 1];
c4 = [(1:n4-1)', (2:n4)'; n4, 1];
c5 = [(1:n5-1)', (2:n5)'; n5, 1];
c6 = [(1:n6-1)', (2:n6)'; n6, 1];
c7 = [(1:n7-1)', (2:n7)'; n7, 1];

node  = [p1; p2; p3; p4; p5; p6; p7];
cnect = [
        c1
        c2+n1
        c3+n2+n1
        c4+n3+n2+n1
        c5+n4+n3+n2+n1
        c6+n5+n4+n3+n2+n1
        c7+n6+n5+n4+n3+n2+n1
        ];
   
% Test points
num = 50000;
p   = [20*(rand(num,1)-0.5),10*rand(num,1)];        
        
        
 % Call inpoly
tic, in = inpoly(p,node,cnect); t1 = toc;


cost_in_sec = struct('inpoly',t1,'inpolygon',NaN)

figure, plot(p(in,1),p(in,2),'b.',p(~in,1),p(~in,2),'r.'), title('Inside points (blue) & outside points (red)')

% Plot geometry
patch('faces',cnect,'vertices',node,'facecolor','none','edgecolor','k'), axis equal    



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                           Square
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

answer = lower(input(['inpoly can also detect points on the polygon boundaries. \n' ...
                      '\n'                                                          ...
                      'Continue?? [y/n] \n'],'s'));

if ~strcmp(answer,'y')
    return
end

close all

node = [
       0  0
       1  0
       1  1
       0  1
       ];
       
% Test points
[x,y] = meshgrid(-0.5:0.1:1.5);
p     = [x(:),y(:)];
        
        
 % Call inpoly
tic, [in,bnd] = inpoly(p,node); t1 = toc;


cost_in_sec = struct('inpoly',t1,'inpolygon',NaN)

figure, plot(p(in,1),p(in,2),'b.',p(~in,1),p(~in,2),'r.',p(bnd,1),p(bnd,2),'g.')

title('Inside points (blue), outside points (red) & boundary points (green)')

% Plot geometry
nn    = size(node,1);
cnect = [(1:nn-1)',(2:nn)'; nn,1];
patch('faces',cnect,'vertices',node,'facecolor','none','edgecolor','k'), axis equal        

        

Contact us at files@mathworks.com