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;