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.

varargout=edit_curve_Payoff(varargin)
function varargout=edit_curve_Payoff(varargin)
% WYSIWYG editor for bezier curve
% function edit_curve(bezier)
% function bezier2=edit_curve(bezier)
% function edit_curve(bezier,figure)

if nargout>1
 error('edit_curve expects zero or 1 output parameters.');
end

b=varargin{1};   
if ~strcmpi(class(b),'bezier') 
   error('Invalid arguments') 
end    


t=0:0.01:1;
t2=t.^2;
t3=t2.*t;
x=b.ax*t3+b.bx*t2+b.cx*t+b.x0;
y=b.ay*t3+b.by*t2+b.cy*t+b.y0;

if nargin==1 
 % draw the curve from scratch    
    f=figure;
    set(f,'Name','Edit Bezier Curve');
    axes_handle=axes;
    set(axes_handle,'Title',text('String','Payoff-Probability','Color','k','FontSize',12,'FontWeight','bold'));
    set(axes_handle,'XLim',[0 1],'YLim',[0 1]); 
    set(get(axes_handle,'XLabel'),'String','Values of X','FontSize',12,'FontWeight','bold');
    set(get(axes_handle,'YLabel'),'String','Values of Y','FontSize',12,'FontWeight','bold');
    hold on;
    l=[];
    l=[l,text([b.x0],[b.y0],'(x_0,y_0)')]; 
	l=[l,text([b.x1],[b.y1],'(x_1,y_1)')]; 
	l=[l,text([b.x2],[b.y2],'(x_2,y_2)')]; 
	l=[l,text([b.x3],[b.y3],'(x_3,y_3)')]; 
    set(l(1),'tag','text1');
    set(l(2),'tag','text2');
    set(l(3),'tag','text3');
    set(l(4),'tag','text4');
    h=plot(x,y,'b',...
     [b.x0,b.x1],[b.y0,b.y1],'r',...
     [b.x2,b.x3],[b.y2,b.y3],'r',...
     [b.x1],[b.y1],'ro',...
     [b.x2],[b.y2],'ro',...
     [b.x3],[b.y3],'r*',...
     [b.x0],[b.y0],'r*');
    set(h(1),'tag','spline');
    set(h(2),'tag','control line 1');
    set(h(3),'tag','control line 2');
    set(h(4),'tag','p1');
    set(h(5),'tag','p2');
    set(h(6),'tag','p3');
    set(h(7),'tag','p0');
    ud.bezier=b;
    ud.mode='normal'; % opposite to drag
    ud.point_to_drag=-1; % nothing is to drag
    set(gca,'UserData',ud);
    set(h(4),'ButtonDownFcn','edit_bezier(''down'',1)');
    set(h(5),'ButtonDownFcn','edit_bezier(''down'',2)');
    set(h(6),'ButtonDownFcn','edit_bezier(''down'',3)');
    set(h(7),'ButtonDownFcn','edit_bezier(''down'',0)');

    set(f,'WindowButtonUpFcn','edit_bezier(''up'',0)');
    set(f,'WindowButtonMotionFcn','edit_bezier(''move'',0)');

    set(f,'CloseRequestFcn','uiresume;');
    
    if nargout==1
      uiwait;
      ud=get(gca,'UserData');
      b=ud.bezier;
      clear ud;
      delete(gcf); 
      varargout{1}=b;
  end
end


if nargin==2 
 % redraw existing bezier curve

    f=varargin{2};   

    if ~ishandle(f)
       error('Invalid arguments') 
    end    
    
    t=findobj(f,'tag','text1');
    set(t,'Position',[b.x0,b.y0]);
    t=findobj(f,'tag','text2');
    set(t,'Position',[b.x1,b.y1]);
    t=findobj(f,'tag','text3');
    set(t,'Position',[b.x2,b.y2]);
    t=findobj(f,'tag','text4');
    set(t,'Position',[b.x3,b.y3]);

    t=findobj(f,'tag','p0');
    set(t,'XData',[b.x0]); set(t,'YData',[b.y0])
    t=findobj(f,'tag','p1');
    set(t,'XData',[b.x1]); set(t,'YData',[b.y1])
    t=findobj(f,'tag','p2');
    set(t,'XData',[b.x2]); set(t,'YData',[b.y2])
    t=findobj(f,'tag','p3');
    set(t,'XData',[b.x3]); set(t,'YData',[b.y3])
  
    t=findobj(f,'tag','spline');
    set(t,'XData',x); set(t,'YData',y)
    t=findobj(f,'tag','control line 1');
    set(t,'XData',[b.x0,b.x1]); set(t,'YData',[b.y0,b.y1])
    t=findobj(f,'tag','control line 2');
    set(t,'XData',[b.x2,b.x3]); set(t,'YData',[b.y2,b.y3])

end 

Contact us at files@mathworks.com