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