(摘自《生物学》)
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=
国内的购买者再怎么差劲,不至于让人如此欺骗吧--------
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)