外界物体反射来的光线依次经过怎样的程序后,产生视觉

外界物体反射来的光线依次经过怎样的程序后,产生视觉,第1张

视觉形成的大致过程是:外界物体反射光线,依次经过角膜、瞳孔、晶状体和玻璃体,并经晶状体等的折射,最终落在视网膜上,形成一个物象。视网膜上对光线敏感的细胞,将图像信息通过视觉神经传给大脑的一定区域,人就产生了视觉

(摘自《生物学》)

function []=test()

body{1}=[300,400380,400380,320300,320300,400]

body{2}=[400,400480,400480,320400,320400,400]

body{3}=[200,300380,300380,220200,220200,300]

%顺时针连起来的反射体边缘

range=[150,500500,500500,150150,150150,500]

%定义最大范围的边框

nbody=length(body)%反射体数目

lightsource=cell(1,10)

for ii=1:10

lightsource{ii}=[250,400,-45-3*ii+3]%光源位置和光线方向与x轴正方向夹角

end

nls=length(lightsource)%光源数目

num=9%反射次数

lightline=countline(lightsource,body,range,num)%计算光线轨迹

figure(1)

clf

plot(range(:,1),range(:,2),'k','linewidth',2)%画最外面方框

hold on

for ii=1:nbody

  fill(body{ii}(:,1),body{ii}(:,2),'y','edgecolor','k')%填充反射体

end

for ii=1:nls

 plot(lightline{ii}(:,1),lightline{ii}(:,2),'b')%画光线

end

hold off

grid on

end

function [lineout]=countline(ls,body,range,num)

body=[body,range]

edges=[]

for ii=1:length(body)

  x1=body{ii}(1:end-1,1)

  x2=body{ii}(2:end,1)

  y1=body{ii}(1:end-1,2)

  y2=body{ii}(2:end,2)

  deg=mod(rad2deg(atan2(y2-y1,x2-x1))+90,360)%发现方向与x轴正方向夹角

  edges=[edges[x1 y1 x2 y2 deg]]

end %提取body和rage的所有边的两点坐标,并计算边的法线方向

lineout=cell(size(ls))

for ii=1:length(ls)

  s=ls{ii}        %s是当前光源

  lin=[s(1),s(2)] %过线第一点就是光源的位置

  n=1

  while(~isnan(s(3))&&n<=num) %未射到range边缘前计算num次反射

      s=newsource(s,edges) %用newsource函数计算经过反射后的边缘

      lin=[lin[s(1) s(2)]]%光线轨迹增加一个点

      n=n+1 %加一次折射次数

  end

  lineout{ii}=lin       %输出一条轨迹

end

end

function [sout]=newsource(s,edges)

  x0=s(1)y0=s(2)deg0=s(3)

  x1=edges(:,1)x2=edges(:,3)

  y1=edges(:,2)y2=edges(:,4)

  deg=edges(:,5)

  t=((y0-y1).*(x1-x2)-(x0-x1).*(y1-y2))./...     %解方程确定光线和边的交点

      (cosd(deg0).*(y1-y2)-sind(deg0).*(x1-x2))

  xn=cosd(deg0).*t+x0

  yn=sind(deg0).*t+y0

  mask=t>0&(xn-x1).*(xn-x2)<=0&(yn-y1).*(yn-y2)<=0

  x=xn(mask)y=yn(mask)deg=deg(mask) %排除交点在边外或射线反方向的交点

  d=sqrt((x-x0).^2+(y-y0).^2)         %计算交点和光源的距离

  ind=find(d==min(d))                 %寻找最小的距离

  if(isempty(ind))

      sout=[nan nan nan]           

  else

      dd=mod(deg(ind(1))-deg0,360)    %计算射线和法向量夹角

      if cosd(dd)>=0

          dout=nan%如果夹角小于90度,不会反射,是到达反射体内边缘的情况

      else

          dout=2*deg(ind(1))-180-deg0%计算反射光方向

      end

      sout=[x(ind(1)) y(ind(1)) dout]%输出反射光源

  end

end

以上内容存到 test.m文件,运行就可以了

随便定义了几个反射体和光源,效果如下

本人从日本回来,单位要求评估一下virtuallab这个软件。本人从事衍射光学设计,在日本和Virtuallab的日本代理有很多的交流,得知这个软件在日本和美国都卖不动,基本上没有人愿意使用这个软件,本人试用了多次,总结其原因如下: E5w75,

1. 建模能力有限 ,不能支持CAD文件的导入;很多的面型需要编程来实现,采用C#和VB的编程方式反而没有matlab等数学软件编程方便。 <Dd>- K

2. 光学元件类型有限,没有反射镜模型,就是说不能考虑反射镜的模型;不能倾斜和偏心;在光栅工具只能考虑透射场;没有棱镜模型。 <h/%jM>9/

3. 此软件号称做衍射光学元件很强,可是仔细一看,只有傅里叶迭代的优化算法,居然没有常见的模拟退火和遗传算法-----。 0f^{Rp6

4. LED整形,只有微机构光栅模型,没有微结构棱镜和微结构的mirror模型,也就是用来能看看。 V)j[`,M:

5. 所谓的激光工具只是一个摆设,激光的简单的模型都不能分析。 A*EOn1hN

6. 光栅工具的光源只能用理想的平面波;不能考虑反射场。 FEaT}/h

7. 没见到号称所有的模拟技术都整合在一起,却是只见到几种简单的模拟技术,甚至没有FDTD算法。 rm iOeS`:

-----------------不一一例举了----- J@s>Pe)

综上所述,此软件只是适合于高校的教学演示使用。相比而言,没有matlab方便以及适用面广泛,没有能应用的实用价值。 <kak9 6A

回到国内,发现很多的研究所(如上海光机所和长光所)和高校(如南京理工和长春理工)均买了这个软件,而且价格很贵,听说要上100W了,在中国的报价比在美国和日本等地方的价格要高出很多倍,相信大家都懂这是什么原因。如此软件在欧美,使用者基本上没有,在中国却发扬光大。不知道国内的购买者用来做什么,难道需要这么贵的软件来进行教学演示吗?由此可知,软件本身的功能并不是重点,在这种交易后面的东西才是重要。一个愿意买,一个愿意卖,中间各得好处。本人有日本和美国的报价单,价格和国内相比,相差6倍左右,如此不堪一用的软件,居然能够在国内如此高价出售,大家都知道其中的原因。在这个软件所有的功能,本人通过自编程序或者matlab编程均可以实现。 Y@UkP+{f=

国内的购买者再怎么差劲,不至于让人如此欺骗吧--------


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11570111.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存