[問題] 求三角形的內角角度已回收

看板MATLAB作者 (無常似冰!!)時間16年前 (2009/05/25 02:01), 編輯推噓2(202)
留言4則, 2人參與, 最新討論串1/1
本來以為利用內積的方式來解決 AdotB = |A|*|B|*Cosθ 再用 acosd( AdotB / |A|*|B| ) = θ 得到角度 但執行起來,總會一個角度 會算成其中一個角的補角 EX:若 A = 40,B = 70,C = 70 則算出來可能會得到 A' = 40 , B' = 110 ,C' = 70 也就是當 B' = A' + C' 時 , B 的正確答案應該是 180-B' 以此條件做為判斷時,MatLab計算時 會產生誤差 =====================附上CODE===================== BC= B-C; AB = A-B; AC = A-C; AB_BC = dot(AB,BC); AB_AC = dot(AB,AC); AC_BC = dot(AC,BC); len_AB = ((AB(1).^2) + (AB(2).^2)).^(1/2); len_AC = ((AC(1).^2) + (AC(2).^2)).^(1/2); len_BC = ((BC(1).^2) + (BC(2).^2)).^(1/2); ANG_A = acosd (AB_AC/(len_AB*len_AC)); ANG_B = acosd (AB_BC/(len_AB*len_BC)); ANG_C = acosd (AC_BC/(len_AC*len_BC)); if (ANG_A == ANG_B+ANG_C) ANG_A = 180 - ANG_A; elseif (ANG_B == ANG_A + ANG_C) ANG_B = 180 - ANG_B; elseif (ANG_C == ANG_A + ANG_B) ANG_C = 180 - ANG_C; else fprintf('ERROR\n') end ANG_A ANG_B ANG_C ================================================= 有時候會跑出ERROR ERROR ANG_A =18.4349 ANG_B =45.0000 ANG_C =26.5651 但 18.4349 + 26.5651 = 45 也有時會因為進位的誤差 造成 B 不等於 A + C 請問各位前輩 還有其他方法可以求出三角形的三內角嗎? 或是有可以解決此誤差的方法 寫的有點亂 感謝前輩們耐心看完^^ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.166.238.7

05/25 02:32, , 1F
1.acos本來就差pi 2.numetric error
05/25 02:32, 1F

05/25 12:07, , 2F
把AB_BC = dot(AB,BC);改成AB_BC = dot(AB,-BC);
05/25 12:07, 2F

05/25 12:08, , 3F
然後判斷式整個拿掉試試
05/25 12:08, 3F

05/25 12:10, , 4F
另外判斷A、B是否相等最好用abs(A-B)<=eps的形式
05/25 12:10, 4F
文章代碼(AID): #1A6OjYg- (MATLAB)
文章代碼(AID): #1A6OjYg- (MATLAB)