【发布时间】:2015-03-05 09:49:59
【问题描述】:
几周前,我收到了一个脚本,我认为该脚本计算了一个点与参考线(直角)的距离,并返回沿参考线的距离以及从参考线到该点的距离观点。老实说,我认为它是这样做的,但是我并不完全理解这个脚本,即使它只有 26 行长。
由于我认为脚本是另一个依赖它的脚本变得不稳定的问题,我认为真正了解正在发生的事情实际上很方便。我曾希望有人能帮我解决这个问题。
脚本(用 Matlab 编写,但如果需要,我也可以在 python 中获得):
function [sp,np]=locate(s,x,y,xp,yp)
ipp=0;
ns=length(s);
for ip=1:length(xp);
for i=1:ns-2
cosa=(x(i+2)-x(i))/(s(i+2)-s(i));
sina=(y(i+2)-y(i))/(s(i+2)-s(i));
sproj=s(i)+(xp(ip)-x(i))*cosa+(yp(ip)-y(i))*sina;
if sproj<s(1)
ipp=ipp+1;
sp(ipp)=sproj;
np(ipp)=-(xp(ip)-x(1))*sina+(yp(ip)-y(1))*cosa;
break
elseif sproj>=s(i)&sproj<=s(i+2)
ipp=ipp+1;
sp(ipp)=sproj;
np(ipp)=-(xp(ip)-x(i))*sina+(yp(ip)-y(i))*cosa;
break
elseif sproj>s(ns)
ipp=ipp+1;
sp(ipp)=sproj;
np(ipp)=-(xp(ip)-x(ns))*sina+(yp(ip)-y(ns))*cosa;
break
end
end
end
这里 s 是沿参考线的距离,x 和 y 是参考线上的 x 和 y 点,xp 和 yp 也是与线的距离(直角)的点的坐标因为需要计算沿参考线的距离。脚本调用如下:
dist(1)=0;
for i=2:length(xref);
dist(i)=dist(i-1)+sqrt((xref(i)-xref(i-1))^2+(yref(i)-yref(i-1))^2);
end
%% Create computational grid
ds=(dist(end)-dist(1))/(ns-1); % stepsize
s=0:ds:dist(end); % distance
xr=spline(dist,xref,s); % x of line grid points
yr=spline(dist,yref,s); % y of line grid points
%% Compute locations of initial line
[si,ni]=locate(s,xr,yr,xi,yi);
n=interp1(si,ni,s,'linear','extrap'); % distance change at right angle
有没有人可以帮助我解释第一个脚本中究竟发生了什么,因为我真的无法理解它。
【问题讨论】:
标签: matlab math geometry computational-geometry