matlab - Surface intensity for a moving light source -
i’m trying write simulation move light source on surface of object, on each step measure intensity of reflected light light source.
then plot intensity each point of surface. each step adding first plot. building picture of surface topography.
it bit messy if can suggest way tidy up.
x = -10:0.25:10; y = -10:0.25:10; xlength=length(x); ylength=length(y); ymin=min(y); ymax=max(y); xmin=min(x); xmax=max(x); d=zeros(xlength); [x,y] = meshgrid(x,y); z = 10-(x.^2)-(y.^2)+5*sin(x); rnd=rand(xlength); c=randi(xlength); d=randi(xlength); s=1; t=0; i=1:ylength t=t+1; j=1:xlength if s==c if t==d d(s,t)=z(s,t); elseif t==d+1 d(s,t)=z(s,t); elseif t==d+2 d(s,t)=z(s,t); elseif t==d+3 d(s,t)=z(s,t); elseif t==d+4 d(s,t)=z(s,t); elseif t==d+5 d(s,t)=z(s,t); else d(s,t)=0; end elseif s==c+1 if t==d d(s,t)=z(s,t); elseif t==d+1 d(s,t)=z(s,t); elseif t==d+2 d(s,t)=z(s,t); elseif t==d+3 d(s,t)=z(s,t); elseif t==d+4 d(s,t)=z(s,t); elseif t==d+5 d(s,t)=z(s,t); else d(s,t)=0; end elseif s==c+2 if t==d d(s,t)=z(s,t); elseif t==d+1 d(s,t)=z(s,t); elseif t==d+2 d(s,t)=z(s,t); elseif t==d+3 d(s,t)=z(s,t); elseif t==d+4 d(s,t)=z(s,t); elseif t==d+5 d(s,t)=z(s,t); else d(s,t)=0; end elseif s==c+3 if t==d d(s,t)=z(s,t); elseif t==d+1 d(s,t)=z(s,t); elseif t==d+2 d(s,t)=z(s,t); elseif t==d+3 d(s,t)=z(s,t); elseif t==d+4 d(s,t)=z(s,t); elseif t==d+5 d(s,t)=z(s,t); else d(s,t)=0; end elseif s==(c+4) if t==d d(s,t)=z(s,t); elseif t==d+1 d(s,t)=z(s,t); elseif t==d+2 d(s,t)=z(s,t); elseif t==d+3 d(s,t)=z(s,t); elseif t==d+4 d(s,t)=z(s,t); elseif t==d+5 d(s,t)=z(s,t); else d(s,t)=0; end else d(s,t)=0; end s=s+1; end s=1; end z1=z -(d/20); z2=z1-z; s=0; figure surf(x,y,z) axis([xmin xmax ymin ymax]) xlabel('x') ylabel('y') zlabel('z') i=-10:2.5:10 hold on light('position',[i,0,50]) surf(x,y,z,'edgecolor', 'none') axis([xmin xmax ymin ymax]) drawnow pause (1) delete(findall(gcf,'type','light')) hold off end
this far have got .
a code yours does: (thanks @hoki in simplifying code more)
clear;clc x = -10:0.25:10; y = -10:0.25:10; xlength=length(x); ylength=length(y); ymin=min(y); ymax=max(y); xmin=min(x); xmax=max(x); [x,y] = meshgrid(x,y); z = 10-(x.^2)-(y.^2)+5*sin(x); %% plot! figure surf(x,y,z,'edgecolor', 'none','linestyle','none') % taken out linestyle because looks cooler axis([xmin xmax ymin ymax]) xlabel('x') ylabel('y') zlabel('z') % added repetitions , decreased step size, plus making go forward , backward. repetitions=4; jj=1:repetitions hl = light('position',[-10,0,50]) ; %// create light source i=-10:2.5:10 set(hl,'position',[i,0,50]) ; %// set new light position drawnow %// flush graphic pipeline pause (0.1) %// let human user see end delete(hl) %// delete light source end
this gives following gif:
http://i.imgur.com/42ffyll.gifv
about rest part of code....
remember
if t==d d(s,t)=z(s,t); elseif t==d+1 d(s,t)=z(s,t); elseif t==d+2 d(s,t)=z(s,t); elseif t==d+3 d(s,t)=z(s,t); elseif t==d+4 d(s,t)=z(s,t); elseif t==d+5 d(s,t)=z(s,t); else d(s,t)=0; end
is literally same as:
if (t>=d && t<=d+5) d(s,t)=z(s,t); else d(s,t)=0; end
this should reduce code. there vectorization.
you can do
d(s,(t>=d && t<=d+5))=z(s,(t>=d && t<=d+5)));
for values of s
... etc etc. hope gets going ;)
Comments
Post a Comment