データはいつでも自分で変換できます:(@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);