您可以通过绘制一条从第一个点开始并在航向方向结束的小线来验证角度。如果角度正确,它将指向 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
在代码中使用 可以一次正确地区分所有点。这更快并且避免了方向上的任何问题——在你的情况下看起来它被交换了。