您始终可以自己转换数据:(使用与@Shai 相同的符号)
x = 0:0.1:10;
y = x;
m = 10*sin(x);
所以你需要的是每个数据点处曲线的法线向量:
dx = diff(x); % backward finite differences for 2:end points
dx = [dx(1) dx]; % forward finite difference for 1th point
dy = diff(y);
dy = [dy(1) dy];
curve_tang = [dx ; dy];
% rotate tangential vectors 90° counterclockwise
curve_norm = [-dy; dx];
% normalize the vectors:
nrm_cn = sqrt(sum(abs(curve_norm).^2,1));
curve_norm = curve_norm ./ repmat(sqrt(sum(abs(curve_norm).^2,1)),2,1);
将该向量乘以测量值 ( m
),用数据点坐标偏移它,就完成了:
mx = x + curve_norm(1,:).*m;
my = y + curve_norm(2,:).*m;
绘制它:
figure; hold on
axis equal;
scatter(x,y,[],m);
plot(mx,my)
这正是您想要的。这个例子只有一条直线作为坐标,但是这段代码可以很好地处理任何曲线:
x=0:0.1:10;y=x.^2;m=sin(x);
t=0:pi/50:2*pi;x=5*cos(t);y=5*sin(t);m=sin(5*t);