[英]Calculating all angles of a triangle given two vectors in matlab
對於該示例,請考慮以下幾點:
x=[-1.6794 -2.6072 0.4175 0.1898 -0.7749 1.8392 1.7411];
y=[7.9969 9.5312 8.0302 7.2956 6.5550 9.9890 7.9462];
參考點:
xc = -0.9311; yc = 9.1109;
繪制散點:
figure(1)
hold on
scatter(x,y,'.b')
scatter(xc,yc,'.r')
xlim([-10 10]); ylim([0 15]);
我可以通過以下方式計算以[xc,yc]
開頭的所有向量之間的所有角度:
v=[x-xc;y-yc]';
dot_v=v*v';
norm_v=sqrt(v(:,1).^2+v(:,2).^2);
angles=acosd(dot_v./(norm_v.*norm_v'));
下圖將可視化矢量和它們之間的角度:
figure(1)
hold on
scatter(x,y,'.b')
scatter(xc,yc,'.r')
xlim([-10 10]); ylim([0 15]);
for i=1:length(x)
for j=1:length(x)
hh1=plot([xc x(i)],[yc y(i)]);
hh2=plot([xc x(j)],[yc y(j)]);
th=title(num2str(angles(i,j)));
pause
delete(hh1); delete(hh2); delete(th);
end
end
但是,我想獲得由這兩個向量創建的三角形中的所有角度,例如:
我可以使用循環並計算由數據中的兩個點組成的每個矢量之間的角度,但是,我擁有的數據包含大量的點,因此我想避免使用循環並利用matlab功能用矩陣形式編寫事物時,請提供一個優雅而有效的答案。
實際上,創建三角形的缺失線是很容易的……它由以下坐標給出:
[x(i) x(j)] [y(i) y(j)]
取回代碼,可以達到以下預期效果:
x = [-1.6794 -2.6072 0.4175 0.1898 -0.7749 1.8392 1.7411];
y = [7.9969 9.5312 8.0302 7.2956 6.5550 9.9890 7.9462];
xc = -0.9311;
yc = 9.1109;
v = [x - xc; y - yc].';
d = v * v.';
n = sqrt(v(:,1).^2 + v(:,2).^2);
angles = acosd(d ./ (n .* n.'));
angles = round(real(angles),2);
f = figure();
hold on;
scatter(x,y,'.b');
scatter(xc,yc,'.r');
xlim([-10 10]);
ylim([0 15]);
hold off;
len = numel(x);
for i = 1:len
for j = 1:len
ang = angles(i,j);
if (ang == 0)
continue;
end
xi = x(i); xj = x(j);
yi = y(i); yj = y(j);
hold on;
p1 = plot([xc xi],[yc yi],'b');
p2 = plot([xc xj],[yc yj],'b');
p3 = plot([xi xj],[yi yj],'b');
t = title(num2str(ang));
hold off;
pause(2);
delete(p1);
delete(p2);
delete(p3);
delete(t);
end
end
A對此做了一些調整:
.'
)而不是共軛轉置函數( '
),在這種情況下,應使用此函數。 angle = 0
)的繪圖。 當使用向量化代碼時,Matlab會產生驚人的性能……但這並非總是可行的。 我知道如何將兩個循環簡化為一個循環...但是,如果您想使用這種繪圖方法,遲早必須在代碼中實現至少一個迭代,而您對此無能為力。 這是您最多可以實現的目標:
f = figure();
hold on;
scatter(x,y,'.b');
scatter(xc,yc,'.r');
xlim([-10 10]);
ylim([0 15]);
hold off;
len = numel(x);
ang = angles(:);
ang_ok = ang ~= 0;
ang = ang(ang_ok);
idx = [repelem((1:len).',len,1) repmat((1:len).',len,1)];
idx = idx(ang_ok,:);
for k = 1:size(idx,1)
i = idx(k,1);
j = idx(k,2);
xi = x(i); xj = x(j);
yi = y(i); yj = y(j);
hold on;
p1 = plot([xc xi],[yc yi],'b');
p2 = plot([xc xj],[yc yj],'b');
p3 = plot([xi xj],[yi yj],'b');
t = title(num2str(ang(k)));
hold off;
pause(2);
delete(p1);
delete(p2);
delete(p3);
delete(t);
end
內角(一旦完成三角形就創建的內角)可以使用當前使用的方法在循環本身內部進行計算,只需移動坐標即可。 實際上,由於三角形內的角度之和為180°
...您只需要計算其中的兩個,就可以使用以下公式獲得第三個角度: AngleC = 180 - AngleA - AngleB
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.