首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >移动光源的表面强度

移动光源的表面强度
EN

Stack Overflow用户
提问于 2015-08-05 10:27:15
回答 1查看 123关注 0票数 0

我试图写一个模拟,它将一个光源移动到物体的表面,每一步测量反射光的强度回到光源。

然后从表面的每一点绘制强度图。将每一步添加到第一幅图中。从而形成了一幅关于表面形貌的图片。

如果你能提出一种清理的方法,那就有点麻烦了。

代码语言:javascript
复制
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

这就是我所能得到的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-05 12:00:21

一种与您的代码完全相同的代码:(感谢@Hoki帮助简化代码)

代码语言:javascript
复制
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

这给出了以下gif:

http://i.imgur.com/42ffYll.gifv

关于密码的其余部分..。

记住这一点

代码语言:javascript
复制
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

实际上与以下内容相同:

代码语言:javascript
复制
if (t>=d && t<=d+5)
   D(s,t)=z(s,t);
else
    D(s,t)=0;
end

这将帮助您减少代码。也有向量化。

你可以做到

代码语言:javascript
复制
D(s,(t>=d && t<=d+5))=z(s,(t>=d && t<=d+5)));

所有的s值..。等等,希望这能让你走;)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31829847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档