Code covered by the BSD License  

Highlights from
Supply Chain Risk Simulator (SCRS)

from Supply Chain Risk Simulator (SCRS) by Marco Anisetti
Supply Chain simulator for risk assessment and incentive schemes.

bezier(varargin)
function b=bezier(varargin)
% construction of a Bezier curve
% Usage:
% 	b=bezier('coeffs',[ax,bx,cx,x0,ay,by,cy,y0]);
% 	b=bezier('points',[x0,y0,x1,y1,x2,y2,x3,y3]);
% 	b=bezier('xpoints',[x0,y0,x1,y1,x2,y2,x3,y3]);
% 	b=bezier(b1);

b = struct('ax',0,'bx',0,'cx',0,'ay',0,'by',0,'cy',0,...
  	   'x0',0,'y0',0,'x1',0,'y1',0,'x2',0,'y2',0,'x3',0,'y3',0);
b = class(b,'bezier');

f={'ax','bx','cx','ay','by','cy','x0','y0','x1','y1','x2','y2','x3','y3'};

if (nargin~=2 & nargin~=0 & nargin~=1)
	error('Can take only zero, one or two parameters');
end

if nargin==0
 return;
end

if nargin==1
  a=varargin{1};
  if isa(a,'bezier')
   b.x0=a.x0;
   b.x1=a.x1;
   b.x2=a.x2;
   b.x3=a.x3;
   b.y0=a.y0;
   b.y1=a.y1;
   b.y2=a.y2;
   b.y3=a.y3;
   b.ax=a.ax;
   b.bx=a.bx;
   b.cx=a.cx;
   b.ay=a.ay;
   b.by=a.by;
   b.cy=a.cy;
   return;
  else
    error('Possible usage is b=bezier(b1)');
  end
end


if nargin==2
  t=varargin{1};
  v=varargin{2};
  if strcmpi(t,'xpoints')
    if length(v)~=8
     error('The second parameter should consist of 8 elements');
    end
    % convert  physical points to coeffs
    v=num2cell(v(:)');
    [x0,y0,x1,y1,x2,y2,x3,y3]=deal(v{:});
    
    cx = 9*x1-11/2*x0+x3-9/2*x2;
    bx = -45/2*x1+9*x0-9/2*x3+18*x2;
    ax = 9/2*x3+27/2*x1-9/2*x0-27/2*x2;
    
    cy = 9*y1-11/2*y0+y3-9/2*y2;
    by = -45/2*y1+9*y0-9/2*y3+18*y2;
    ay = 9/2*y3+27/2*y1-9/2*y0-27/2*y2;

    [b.x0,b.ax,b.bx,b.cx,b.y0,b.ay,b.by,b.cy]=deal(x0,ax,bx,cx,y0,ay,by,cy);
    b=recalculate_points(b);
    return;
  end

  if strcmpi(t,'coeffs')
   if length(v)~=8
    error('The second parameter should consist of 8 elements');
   end
   b.ax=v(1);
   b.bx=v(2);
   b.cx=v(3);
   b.x0=v(4);
   b.ay=v(5);
   b.by=v(6);
   b.cy=v(7);
   b.y0=v(8);
   % recalculate points
   b=recalculate_points(b);
  return;
  end
  if strcmpi(t,'points')
   if length(v)~=8
    error('The second parameter should consist of 8 elements');
   end
   b.x0=v(1);
   b.x1=v(2);
   b.x2=v(3);
   b.x3=v(4);
   b.y0=v(5);
   b.y1=v(6);
   b.y2=v(7);
   b.y3=v(8);
  % recalculate coeffs
   b=recalculate_coeffs(b);
   return;
  end
  error('The first argument should be either ''coeffs'' or ''points''.');
end

Contact us at files@mathworks.com