簡體   English   中英

在MATLAB中給定兩個向量的情況下計算三角形的所有角度

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM