- /
-
rock hammer
on 29 Nov 2023
- 13
- 97
- 0
- 3
- 1794
drawframe(25);
Write your drawframe function below
function drawframe(f)
% more geology >:D
close
% draw stuff
% i had to recenter these bc i drew this out on paper first and forgot
% to set my coordinate system in a way that makes sense haha :')
% hammer head
hm=[21 27 27 22 17 15 15 16 12 13 13 11 6 1 1 7 11 17;
38 36 35 36 36 34 25 23 23 25 34 36 36 35 36 38 39 39];
% want to rotate around the point that's the middle of the handle
hm=hm-([14;15].*ones(size(hm)));
% hammer handle
hd=[16 16 17 16 12 11 12 12;
23 7 2 1 1 2 7 23];
% want to rotate around the point that's the middle of the handle
hd=hd-([14;15].*ones(size(hd)));
% left half of the rock
rl=[16 14 16 15 16 15 16 13 8 5 3 2 1 2 5 7 9 10 11 14;
18 14 11 8 5 3 2 2 3 4 5 8 10 13 15 15 16 16 17 17];
% want to rotate around the point that's the bottom right
rl=rl-([16;2].*ones(size(rl)));
% right half of the rock
rr=[16 19 22 24 28 29 29 30 30 29 26 24 22 19 16 15 16 15 16 14;
18 18 17 17 15 12 11 10 9 8 7 5 4 3 2 3 5 8 11 14];
% want to rotate around the point that's the bottom left
rr=rr-([16;2].*ones(size(rr)));
% the crack
% i pre-centered this HA
cr = [ 0 -2 0 -1 0 -1 0;
16 12 9 6 3 1 0];
% colors
hdcol=[122, 94, 53]/256; % handle
hmcol=[0.7 0.7 0.8]; % hammer head
rcol=[94, 89, 80]/256; % rock
if f<=12 % swing the hammer
th=f*90/12;
hm=(hm'*rotate(th));
mv=([10 0].*ones(size(hm)));
hm=hm-mv;
hd=(hd'*rotate(th));
mv=([10 0].*ones(size(hd)));
hd=hd-mv;
rl=rl-([-11;29].*ones(size(rl)));
rr=rr-([-11;29].*ones(size(rr)));
patch(hm(:,1),hm(:,2),hmcol)
patch(hd(:,1),hd(:,2),hdcol)
patch(rl(1,:),rl(2,:),rcol,'EdgeColor',rcol)
patch(rr(1,:),rr(2,:),rcol,'EdgeColor',rcol)
end
if f>12 % now the rock changes
hm=(hm'*rotate(90));
mv=([10 0].*ones(size(hm)));
hm=hm-mv;
hd=(hd'*rotate(90));
mv=([10 0].*ones(size(hd)));
hd=hd-mv;
patch(hm(:,1),hm(:,2),hmcol)
patch(hd(:,1),hd(:,2),hdcol)
if f<25 % crack forms
rl=rl-([-11;29].*ones(size(rl)));
rr=rr-([-11;29].*ones(size(rr)));
patch(rl(1,:),rl(2,:),rcol,'EdgeColor',rcol)
patch(rr(1,:),rr(2,:),rcol,'EdgeColor',rcol)
i = floor((f-10)/2)
cr=cr-([-11;29].*ones(size(cr)))
hold on
plot(cr(1,1:i),cr(2,1:i),'-k')
hold on
end
if f>=25 % rock breaks
th=(f-24)*0.9;
rl=(rl'*rotate(-0.75*th));
mv=([-11 29].*ones(size(rl)));
rl=rl-mv;
rr=(rr'*rotate(1.2*th));
mv=([-11 29].*ones(size(rr)));
rr=rr-mv;
patch(rl(:,1),rl(:,2),rcol,'EdgeColor',rcol)
patch(rr(:,1),rr(:,2),rcol,'EdgeColor',rcol)
end
end
xlim([-30 30]);
ylim([-35 25]);
xticks([]); yticks([]); xticklabels([]); yticklabels([]);
end
function rt = rotate(th)
rt=[cosd(th) -sind(th); sind(th) cosd(th)];
end