角度は、最初の点から始まり、見出しの方向に終わる小さな線をプロットすることで確認できます。角度が正しければ、xy の次の点の方向を指します。すべては、どこから 0 度を定義するか (真上など) と、正の角度が反時計回り (私はそうします) か時計回りかによって異なります。MATLAB では、モジュロを使用して 0 ~ 360 の数値を取得できます。または、結果に 180 を追加することもできますが、これにより 0 度マークの定義が変更されます。
少し複雑な次のスクリプトを作成しましたが、すべてのポイントの方向/角度をベクトル形式で計算して表示する方法を示しています。
xy =[ 796.995391705069 151.755760368664
794.490825688073 150.036697247706
788.098591549296 145.854460093897
786.617021276596 144.327659574468
781.125000000000 140.093750000000
779.297872340426 138.072340425532
775.294642857143 133.879464285714];
% t = linspace(0,3/2*pi, 14)';
% xy = [sin(t), cos(t)];
% calculate the angle:
myDiff = diff(xy);
myAngle = mod(atan2(myDiff(:,1), myDiff(:,2))*180/pi, 360);
% Plot the original Data:
figure(1);
clf;
subplot(1,3,1);
plot(xy(:,1), xy(:,2), '-bx', 'markersize', 12);
hold all
axis equal;grid on;
title('Original Data');
% Plot the calculated angle:
subplot(1,3,2);
plot(myAngle);
axis tight; grid on;
title('Heading');
% Now plot the result with little lines pointing int he heading:
subplot(1,3,3);
plot(xy(:,1), xy(:,2), '-bx', 'markersize', 12);
hold all
% Just for visualization:
vectorLength = max(.8, norm(xy(1,:)- xy(2,:)));
for ind = 1:length(xy)-1
startPoint = xy(ind,:)';
endPoint = startPoint + vectorLength*[sind(myAngle(ind)); cosd(myAngle(ind))];
myLine = [startPoint, endPoint];
plot(myLine(1,:), myLine(2, :), ':r ', 'linewidth', 2)
end
axis equal;grid on;
title('Original Data with Heading Drawn On');
たとえば、私のテストデータを使用する場合
t = linspace(0,3/2*pi, 14)';
xy = [sin(t), cos(t)];
以下が得られます。
そして、あなたがあなたのことをすれば、あなたは得る
小さな赤い線が元のデータ ポイントから始まり、次のポイントの方向に移動していることに注意してください。これは、ポイントを結ぶ元の青い線と同じです。
diff
また、コード内で を使用して、すべてのポイントを一度に適切に区別することにも注意してください。これはより高速で、方向に関する問題を回避します。あなたの場合、それが交換されたように見えます。