% Function to make ramps test surface for shape from shapelet testing
%
% Usage:
%           function [z,s,t] = testp(noise)
%
% Arguments:
%              noise - An optional parameter specifying the standard
%                      deviation of Gaussian noise to add to the slant and tilt
%                      values. 
% Returns;
%              z     - A 2D array of surface height values which can be
%                      viewed using surf(z)
%              s,t   - Corresponding arrays of slant and tilt angles in
%                      radians for each point on the surface.

% Copyright (c) 2003-2005 Peter Kovesi
% www.peterkovesi.com
% 
% Permission is hereby granted, free of charge, to any person obtaining a copy
% of this software and associated documentation files (the "Software"), to deal
% in the Software without restriction, subject to the following conditions:
% 
% The above copyright notice and this permission notice shall be included in 
% all copies or substantial portions of the Software.
%
% The Software is provided "as is", without warranty of any kind.

% July      2003  - Original version
% August    2005  - Changes to accommodate Octave
% September 2008  - Needle plot reinstated for Octave
% January   2013  - Separate code path for Octave no longer needed (random()
%                   is part of statistics package) 

function [z,s,t] = testp(noise)

    if nargin == 0
        noise = 0;
    end
    
    p1 = [zeros(1,15) [0:.2:10] zeros(1,15)];
    p2 = zeros(1,length(p1));
    n = ceil(length(p1)/2);
    p3 = [1:n n:-1:1]/n*6;
    p3 = p3(1:length(p1));
    
    z = [ones(15,1)*p2
         ones(15,1)*p1
         ones(15,1)*p3
         ones(15,1)*p2];
    
    
    figure(1); clf;% surfl(z), shading interp; colormap(copper);
    surf(z);       % colormap(white);
    
    [dx, dy] = gradient(z);
    [s,t] = grad2slanttilt(dx,dy);
    
    [rows,cols] = size(s);

    if noise
        t = t + random('Normal',0,noise,rows,cols);  % add noise to tilt
        s = s + random('Normal',0,noise,rows,cols);  % ... and slant
        % constrain noisy slant values to 0-pi
        s = max(s, 0);
        s = min(s, pi/2-0.05);  % -0.05 to avoid infinite gradient
    end
    
    figure(2),needleplotst(s,t,5,2), axis('off')

