ece210/hw5/feedback/JamesRyan_HW5_ECE210_feedback.m

151 lines
4.3 KiB
Matlab

%%%% ECE-210-B HW5 - Advanced Manipulations - James Ryan
% James Ryan, 03/18/24
% preamble
close all; clc; clear;
%% On the Air
% 1
R = [-9:9] + fliplr([-9:9]).'.*j;
% 2
n = [1:50];
t = [linspace(0,1,1e5)].';
sin_int = sum(trapz(sin(t.^n)) .* (t(2) - t(1)), 'all');
% <-.02> erm... the integral calculation seems to be correct
% (though `trapz` has an independent variable argument), but
% why the `sum` at the end? should have said this was supposed
% to be 50 different integral estimates in parallel. :p
% 3
% a
[theta, phi] = meshgrid(...
linspace(0, 2*pi, 5), ...
linspace(0, pi, 5));
% b
x = sin(phi) .* cos(theta);
y = sin(phi) .* sin(theta);
z = cos(phi);
% c
figure;
surf(x,y,z);
pbaspect([1 1 1]);
colormap winter;
title("The best sphere");
xlabel("over axis")
ylabel("yonder axis")
zlabel("up axis")
%% Under the Sea
% 1
interest = sin(linspace(0,5,100).*linspace(-5,0,100).');
half_extract = ( abs(interest - .5) < (5/1000) ) .* interest; % < min quantized val
indices = find(half_extract);
% <-.06> two things:
% 1. the minimum quantized value is pretty uncertain after
% you pass the input through the sine function -- in fact,
% the nearest points are (i think) significantly closer than
% this. you'll have to use `min` to find them.
% 2. i did say something about 2D indices, but that's less
% important -- linear indices often work just as well.
% 2
X = linspace(-5,5,100);
[x, y] = meshgrid(X, X);
intersect = (1/4).*sqrt(x.^2 + y.^2) < exp(-(1-x.*y).^2);
% integral(end) = volume
integral = cumtrapz(X, cumtrapz(X, exp(-(1-x.*y).^2).*intersect, 2));
% <-.02> not, alas, the volume contained between the surfaces,
% but just the volume under the first surface and above the
% xy-plane. i think that's just a small oversight, though.
figure;
surf(x, y, exp(-(1-x.*y).^2).*intersect);
xlabel("X Axis");
ylabel("Y Axis");
zlabel("Z Axis");
title('Volume representing $\frac{1}{4}\sqrt{x^2 + y^2} < e^{-(1-x * y)^2}$',...
'interpreter', 'latex');
pbaspect([4 4 3])
% <+.02> volume is consistent with the above, so i'll give a
% few points.
%% I Need a Vacation
% 1
A_vals = sqrt(...
([1:256] - 99).^2 + ...
([1:256].' - 99).^2);
A = A_vals < 29;
% What's happening here is that our A indices are taken, shifted "down" 99
% values, and then a norm is taken on them. If its final norm is < 29, its true!
% otherwise, they're false.
% Theres a circle localized around an origin of (i,j) = (99,99), and extends
% out. This makes sense! relative to everywhere else, this is our lowest value,
% and it creates the smallest norm we see (zer0).
% This holds experimentally! If we change 29 to 1, we just get a single teeny
% pixel at (99,99), surrounded by a false sea. So, the equality we have acts
% to give our circle some radius.
figure;
imshow(A);
% 2
B_vals = sqrt(...
([1:256] - 62).^2 + ...
([1:256].' - 62).^2);
B = B_vals < 58;
% Close to the previous idea, however we shift down only by 68 units, so our
% origin is (68, 68).
% We have a larger radius, given we doubled our tolerance for whats true.
figure;
imshow(B);
% 3
C_vals = [1:256] - 4.*sin(([1:256].'./10));
C = C_vals > 200;
% <-.02> traditionally, the i index is the first index in the
% MATLAB sense -- that is, the index which increments down each
% column, not across each row. in short, (x, y) ←→ (j, i),
% whereas you effectively have y equivalent to j.
% We get a vertical ripple!! The ripple runs along our y axis and has a period
% of 10 and a peak-to-trough distance of 8. This acts as a wavefront from our
% true shoreline and our false sea.
figure;
imshow(C);
% 4
S_vals = rand(256, 256, 3);
S = permute(permute(S_vals,[3 1 2]) .* [0 0 1].', [2 3 1]);
% Interpreting this as a 256 x 256 image with 3 color channels, it looks
% like we applied a filter to kill R and G! We're left with the blue channel
figure;
imshow(S);
% 5
M = A & ~B;
% We get a crescent moon! The portion of B that cast over A was negated and
% compared, which resulted in that poriton being removed.
% We're left with the parts of A that was free from B's grasp
figure;
imshow(M);
% 6
Z = (C .* S) + M;
% Its a scene of a beach! Our moon is casting its light onto the dark beach,
% as the water casts itself onto the shore.
% reminds me of good times :D
figure;
imshow(Z);
% ahhhh, that it does me. figured y'all could use something
% calming.