2017-08-03 38 views
2

散乱点の間に曲線を生成し、各点の曲線の単位法線を識別する必要があります。ここでのポイントクラウドの一例であるMatlabは散乱点の間に滑らかな曲線を生成します

figure 
x = [1 2 0 0 1 1 2 3 4 2]; 
y = [4 6 9 1 1 2 4 9 2 3]; 
scatter(x,y) 
hold on 
line(x,y) 
xlim([0 4]) 
ylim([0 10]) 

enter image description here

注:y軸に沿った2点が私が作成したいのですが、代わりに、点の間の線の

に接続されています。滑らかな曲線。私はxとyの点が繰り返されるときにこれをどうやって行うのか分かりません。 splineを使用しようとすると失敗します。私が曲線を知った後、私は各点で単位法線を見つける必要があります。これについてどうすればいいですか?

編集: 基本的にはpolyfitのここに表示されているものをmatlab docsにしたいと思います。私の場合はxが一意であると仮定すると、これは問題ではないでしょう。私は多項式を識別でき、その点で評価された多項式関数から単位法線を決定することができます。しかし、私の場合、xとyのデータが繰り返されるので、単純なアプリケーションはうまくいきません。

+0

私はあなたが求めているのかわからないんだけど、基本的にはエンドポイントの一つで開始し、代わりに直線の滑らかな曲線でドットを接続します。次に、点の位置でその曲線の単位法線を見つける必要があります。私が知る必要があるのは、そのような関数を定義する方法と、単位法線に達するためにいくつかの微係数を行うことであると考えられます。 – ThatsRightJack

答えて

2

滑らかなパスを得る1つの方法は、これをパラメトリック関数として扱い、xとyを別々に補間することです。あなたがサンプル点の周りの2つの線分の平均の正常を取ることができ法線を推定するために

x = [1 2 0 0 1 1 2 3 4 2]; 
y = [4 6 9 1 1 2 4 9 2 3]; 
t = 1:numel(x); 

tq = 1:0.1:t(end); 
xq = interp1(t,x,tq,'v5cubic'); 
yq = interp1(t,y,tq,'v5cubic'); 

plot(x,y,' ob',xq,yq,'-r'); 

。このコードは少し醜いですが、それは仕事を完了します。

n = zeros(2,numel(x)); 
for tidx = 1:numel(t) 
    tt = t(tidx); 
    idx1 = find(tq <= tt,1,'last'); 
    idx0 = idx1 - 1; 
    idx2 = idx1 + 1; 
    if idx0 > 0 
     n1 = [yq(idx1) - yq(idx0); xq(idx0) - xq(idx1)]; 
     n(:,tidx) = n(:,tidx) + n1/norm(n1); 
    end 
    if idx2 <= numel(tq) 
     n2 = [yq(idx2) - yq(idx1); xq(idx1) - xq(idx2)]; 
     n(:,tidx) = n(:,tidx) + n2/norm(n2); 
    end 
    n(:,tidx) = n(:,tidx)/norm(n(:,tidx)); 
end 

plot(x,y,' ob',xq,yq,'-r',[x.' x.'+n(1,:).'].', [y.' y.'+n(2,:).'].',' -k'); 
axis equal; 

enter image description here

あなたは補間法にpchipの代わりv5cubicを使用する場合、あなたは、サンプル点の周りに多くの対称性を得ることができます。しかし、鋭いターン(90度以上)は平滑化されていないように見える。

enter image description here

+0

ハ...面白い!私はちょうどこの答えを見直し終えました:https://stackoverflow.com/questions/25292114/matlab-interpolating-a-2d-curve-with-multiple-ys-per-x?rq=1解決策と私はあなたが多かれ少なかれ同じ概念に従ったのを見る。私はあなたのソリューションを実装しようとし、それが動作するかどうかを見てみましょう。 – ThatsRightJack

関連する問題