left_width = 13.5;                
right_width = 3;                   
grade = 0.02;                      
normal_crossfall = -0.03;         
superelevated_crossfall = 0.06;    
transition_length = 70;            
contour_interval = 0.20;           
num_segments = 50;                 
num_width_points = 20;             
x = linspace(-left_width, right_width, num_width_points); 
y = linspace(0, transition_length, num_segments + 1);     
elevation = zeros(length(x), length(y)); 
for i = 1:length(y)
    segment_length = y(i);
    for j = 1:length(x)
        
        longitudinal_elevation = grade * segment_length;  
        
        start_elevation = longitudinal_elevation + (normal_crossfall * (-x(j)));
        end_elevation = longitudinal_elevation + (superelevated_crossfall * (-x(j)));
        elevation(j, i) = interp1([0, transition_length], [start_elevation, end_elevation], segment_length);
    end
end
[X, Y] = meshgrid(x, y);
figure;
contourf(X, Y, elevation', 'LineColor', 'none'); 
hold on;
contour_levels = min(elevation(:)):contour_interval:max(elevation(:));
contour(X, Y, elevation', contour_levels, 'LineColor', 'k'); 
colorbar;
title('2D Contour Plot of Superelevation Transition');
xlabel('Width of Road (m)');
ylabel('Length of Transition (m)');
axis equal; 
[grad_x, grad_y] = gradient(elevation'); 
magnitude = sqrt(grad_x.^2 + grad_y.^2);
grad_x = -grad_x ./ magnitude;  
grad_y = -grad_y ./ magnitude;  
lowest_x = min(x); 
startY = transition_length:-5:0; 
streamlines = streamline(X, Y, grad_x, grad_y, lowest_x * ones(size(startY)), startY);
quiver(X, Y, grad_x, grad_y, 'Color', 'r', 'AutoScale', 'off'); 
hold off;