function Y = HyperSphere(X,varargin)

% n-dimensional hypersphere
% 
% syntax: Y = HyperSphere(X,r)
%         Y = HyperSphere(X)
% 
% INPUT ARGUMENTS
%     
%         -X      (n - 1) x (N) every row of this matrix is a tuple
%                 of n-1 parametric coordinates. If the number of points is 
%                 N, the number of rows is N
%                 
%         -r      the radius, default value: r = 1
%         
% OUTPUT ARGUMENTS
% 
%         Y       (n) x (N) every row of this matrix is a tuple 
%                 of n  catesian coordinates of the n-dimensional hypersphere
% 
% this function calculates the cartesian coordinates of an n-dimensional hypersphere
% given the n-1 dimensions vector 'X' of parametric coordinates and the
% radius 'r'
% 
% 
% The n-hypersphere (often simply called the n-sphere) is a generalization 
% of the circle (2-sphere) and usual sphere (the 3-sphere) to dimensions n > 3. 
% The n-sphere is therefore defined as the set of n-tuples of points 
% (x1,x2,x3, ...,xn ) such that 
%     
% x1^2 + x2^2 + x3^2 + ... + xn^2 = r^2
% 
% where r is the radius of the hypersphere. 
% 
% 
% EXAMPLES
% 
%
% % linspace points on a 2-sphere line:
%
% N = 20;
% X = linspace(0,2*pi, N);
% r = 2;
% Y = HyperSphere(X,r);
% plot(Y(1,:),Y(2,:),'r.');
% 
% 
% % random points on 3-sphere surface:
%
% N = 1000;
% X = 2*pi*rand(2,N);
% r = .5;
% Y = HyperSphere([X],r);
% plot3(Y(1,:),Y(2,:),Y(3,:),'r.');



if nargin == 2
    r = varargin{1};
else
    r = 1;
end

N = size(X,1) + 1;                  
n = size(X,2);                      
Y = ones(N,n);

for i = 1:N - 1
    y = [repmat(cos(X(i,:)),i,1)];
    y = [y ; sin(X(i,:))];
    y = [y ; ones(N - i - 1,n)];
    
    Y = Y.*y;
end

Y = Y*r;