```%S=[10 3 6 1 11 20 25 3;2 1 5 6 7 4 8 11]
%S=[22 10 18 -7 -3 20 2 9;-1 5 27 11 26 7 27 13]
%S=[0 0 10 4 4 6 6 10;0 10 0 4 6 4 6 10]
S=[0 0 10 4 4 5 5 10;0 11 0 4 8 4 8 11]

%Given an ordered set of S=(Sx;Sy) (2 by N matrix) of N points in R2 from which we may
%choose any W points, then there are a total of (N choose W) combinations forming
%verticies of a W-gon.

Sx=S(1,:);Sy=S(2,:);   %S(1,:) defines the 1st row vector
N=length(Sx);
W=5;                   %Number of vertices. W=5 for a pentagon.
index=combnk(1:N,W);   %Indexed set of all combinations of W-gon vertices [1:W]
[L,W]=size(index);     %L=(N choose W)

%The next part of the algorithm orders the points defined by S(:,index)
%so that they can be SEQUENTIALLY connected in a pentagon structure.

K=[0 1 0 0 0;
0 0 1 0 0;
0 0 0 1 0;
0 0 0 0 1;
1 0 0 0 0];         % indexk Transformation matrix [1 2 3 4 5] -> [2 3 4 5 1]
k=1:W;
indexk=K*k';
indexk=indexk';
count1=0;
count2=0;
hold on

for i=1:L
indexi=index(i,:);
So=S(:,indexi);    %Choose W points of S according to the index(i,:)
%arrangement (2 by W matrix) with first row
%x=So(1,:) and y=So(2,:). The colon means the set of
%all column elements.
ro=mean(So');      %takes the mean value of the xy-coordinates. The prime'
%is a matrix transpose of So with x-coor=So(:,1),y-coor=So(2,:)
Ravg=[ro(1)*ones(1,W);ro(2)*ones(1,W)]; %(2 by W matrix)
dR=So-Ravg;        %set of vector differences wrt ro
theta=zeros(1,W);

for j=1:W                       %Find angle theta(j) of dR wrt positive x-direction
dX=dR(1,j);dY=dR(2,j);
theta(j)=acos(dX/norm(dR(:,j)))*180/pi;
if dY<0
theta(j)=360-theta(j);  %since inverse cosine bijective on [0,180]
end
end
[thetaSort,ithetaSort]=sort(theta);
SO=So(:,ithetaSort);            %This is our sorted set of W CCW ordered points
dRR=dR(:,ithetaSort);           %Set of sorted vectors defining the verticies wrt the distribution center Ravg

%Construct set of CCW orriented vectors defining the edge of the pentagon
phi=zeros(1,W);

dr=SO(:,indexk)-SO(:,k);   %Vectors defining pentagons edges. Note SO has already been ordered in CCW direction.
for m=1:W
%Acute angle between dr(:,indexm(m)) and dr(:,m) vectors
DOT1=dot(dr(:,indexk(m)),dr(:,m));
CROSS1=cross([dr(:,indexk(m));0],[dr(:,m);0]);
phim=acos(abs(DOT1)/(norm(dr(:,indexk(m)))*norm(dr(:,m))))*180/pi;
if DOT1>0              %Defines obtuse angles if they exist
phim=180-phim;
end
if CROSS1==0
Disp('A set three collinear points was found. Please redefine \nthese points so they are not collinear with each other, \nor any other points.')
count=count+1;
break
end
phi(m)=phim;
end
plot(SO(1,:),SO(2,:),'b-o',S(1,:),S(2,:),'o')
SM=sum(phi);
if count1==1
break
end
if SM<180*(W-2)
continue               %Implies one of the interior angles is larger than 180 deg.
else
fprintf(1, 'Unfortunately a convex pentagon can be formed by connedcting CCW orriented lines using the points (%2f),(%2f),(%2f),(%2f),(%2f). \n',ithetaSort)
count2=1;
break
end
end
hold off

%To plot a convex W-gon.
if count2==1
plot(SO(1,:),SO(2,:),'b-o',S(1,:),S(2,:),'o')
end

%If no convex W-gons are found... done!
if i==L
fprintf('CONGRATULATIONS, your selected set of points has NO convex %2.0f -gons!! \n',W)
end
```