2015-08-05 9 views
0

J'essaie d'écrire une simulation qui va déplacer une source de lumière sur la surface d'un objet, à chaque étape mesurer l'intensité de la lumière réfléchie à la source de lumière.Intensité de surface pour une source de lumière en mouvement

Puis tracez l'intensité de chaque point de la surface. Avec chaque étape ajoutant à la première intrigue. Construisant ainsi une image de la topographie de surface.

Il est un peu brouillon si vous pouvez suggérer un moyen de ranger.

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; 


for i=1:ylength 
    t=t+1; 
    for 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') 
    for 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 

Ceci est aussi loin que je l'ai.

+1

Il n'y a pas assez d'informations pour répondre (et quelle est la question exacte par le chemin?). Vous devez donner un échantillon minimal pour 'X',' Y' et 'z' afin que l'on puisse exécuter votre code. Vous devez également décrire plus ce qui ne fonctionne pas comme prévu dans votre code et ce qui devrait être la sortie désirée. – Hoki

+0

Maintenant, le code fonctionne, merci. La question n'est toujours pas claire. Y a-t-il un problème avec la sortie? Ou voulez-vous juste "ranger"? Si plus tard vous pouvez commencer en supprimant toute la double boucle 'for' du haut où vous définissez' D, s, z1, z2, etc ... 'parce que vous ne les utiliserez jamais à l'écran plus tard. – Hoki

+2

Cela pourrait être plus approprié sur [codereview.se]? – Dan

Répondre

0

Un code qui fait exactement ce que le vôtre: (grâce @Hoki pour l'aide à simplifier le code encore plus)

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 the linestyle because it looks cooler 
axis([xmin xmax ymin ymax]) 

xlabel('X') 
ylabel('Y') 
zlabel('Z') 
% Added repetitions and decreased step size, plus making it go forward and backward. 
repetitions=4; 
for jj=1:repetitions 

    hl = light('position',[-10,0,50]) ;  %// create the light source 
    for i=-10:2.5:10 
     set(hl,'position',[i,0,50]) ;  %// set the new light position 
     drawnow        %// flush graphic pipeline 
     pause (0.1)       %// let human user see something 
    end 
    delete(hl) %// delete the light source 
end 

Cela donne le gif suivant:

A propos la partie restante du code ....

Rappelez-vous que

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 

est littéralement la même chose que:

if (t>=d && t<=d+5) 
    D(s,t)=z(s,t); 
else 
    D(s,t)=0; 
end 

Cela devrait vous aider à réduire le code. Il y a aussi la vectorisation.

vous pouvez faire

D(s,(t>=d && t<=d+5))=z(s,(t>=d && t<=d+5))); 

pour toutes les valeurs de s ... etc etc Espérons que cela vous arrive d'aller;)

+0

Merci, j'ai réussi à réduire massivement la taille du code –