from Yet another Bezier curve demo by Xenya Petrova
Bezier class allowing WYSYWIG editing

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