E1M1 Posted October 9, 2011 Posted October 9, 2011 (edited) Does anyone know why my script mixes up acute and obtuse? 2nd test should be acute angle3rd should be obtuse angle expandcollapse popupMsgBox(0,0,Test("1 0 2 0 1 2")) MsgBox(0,0,Test("3 0 4 2 5 0")) MsgBox(0,0,Test("6 0 7 0 8 2")) ;~ $TriangleCoords = "x1 xy x2 y2 x3 y3" ;~ Angles: If 1 of the angles are: ; < 90 acute angle ; > 90 obtuse angle ; = 90 square corner Func Test($TriangleCoords) ConsoleWrite(@CRLF) $Triangle = $TriangleCoords $Triangle = StringSplit($Triangle, " ") Dim $A[2], $B[2], $C[2], $AB[2], $BC[2], $CA[2] $A[0] = Number($Triangle[1]) $A[1] = Number($Triangle[2]) $B[0] = Number($Triangle[3]) $B[1] = Number($Triangle[4]) $C[0] = Number($Triangle[5]) $C[1] = Number($Triangle[6]) $AB[0] = $B[0] - $A[0] $AB[1] = $B[1] - $A[1] $BC[0] = $C[0] - $B[0] $BC[1] = $C[1] - $B[1] $CA[0] = $A[0] - $C[0] $CA[1] = $A[1] - $C[1] $ABLen = Sqrt($AB[0] ^ 2 + $AB[1] ^ 2) $BCLen = Sqrt($BC[0] ^ 2 + $BC[1] ^ 2) $CALen = Sqrt($CA[0] ^ 2 + $CA[1] ^ 2) If $ABLen = 0 Or $BCLen = 0 Or $CALen = 0 Then Return "ERROR" $pi = 3.14159265358979 $radToDeg = 180 / $pi $BA_BC_Angle = Angle($AB,$BC) $AB_AC_Angle = Angle($AB,$CA) $CA_CB_angle = Angle($CA,$BC) ConsoleWrite($BA_BC_Angle&@CRLF) ConsoleWrite($AB_AC_Angle&@CRLF) ConsoleWrite($CA_CB_angle&@CRLF) If $BA_BC_Angle = 0 Or $AB_AC_Angle = 0 Or $CA_CB_angle = 0 Then Return "square corner" $BA_BC_Angle = ToTirstQuater(Abs(ACos($BA_BC_Angle) * $radToDeg)) $AB_AC_Angle = ToTirstQuater(Abs(ACos($AB_AC_Angle) * $radToDeg)) $CA_CB_angle = ToTirstQuater(Abs(ACos($CA_CB_angle) * $radToDeg)) ConsoleWrite($BA_BC_Angle&@CRLF) ConsoleWrite($AB_AC_Angle&@CRLF) ConsoleWrite($CA_CB_angle&@CRLF) If $BA_BC_Angle < 90 and $AB_AC_Angle < 90 and $CA_CB_angle < 90 Then Return "acute angle" Return "obtuse angle" EndFunc ;==>Test Func ScalarProduct($u,$v) Return $u[0]*$v[0] + $u[1]*$v[1] EndFunc Func Angle($u,$v) Return ScalarProduct($u,$v)/(Sqrt($u[0] ^ 2 + $u[1] ^ 2)*Sqrt($v[0] ^ 2 + $v[1] ^ 2)) EndFunc Func ToTirstQuater($iAnge) If $iAnge > 90 Then Return 180 - $iAnge Return $iAnge EndFunc Pic shows triangles used in 3 tests Edited October 9, 2011 by E1M1 edited
jaberwacky Posted October 11, 2011 Posted October 11, 2011 (edited) Edit: Actually, I now think the problem lies within this section of your code: $AB[0] = $B[0] - $A[0] $AB[1] = $B[1] - $A[1] $BC[0] = $C[0] - $B[0] $BC[1] = $C[1] - $B[1] $CA[0] = $A[0] - $C[0] $CA[1] = $A[1] - $C[1] Well, no that can't be it because it correctly determines a right triangle. Ok, nevermind that and continue reading. I think you're problem lies within this function: ToTirstQuater. Here is my version of the code which, I believe, demonstrates the problem: expandcollapse popupMsgBox(0, 0, Test("1 0 2 0 1 2")) MsgBox(0, 0, Test("3 0 5 0 4 2")) MsgBox(0, 0, Test("6 0 7 0 8 2")) ;~ $TriangleCoords = "x1 y1 x2 y2 x3 y3" ;~ Angles: If 1 of the angles are: ; < 90 acute angle ; > 90 obtuse angle ; = 90 square corner Func Test($TriangleCoords) Local Const $Triangle = StringSplit($TriangleCoords, " ") Local $A[2] $A[0] = Number($Triangle[1]) $A[1] = Number($Triangle[2]) Local $B[2] $B[0] = Number($Triangle[3]) $B[1] = Number($Triangle[4]) Local $C[2] $C[0] = Number($Triangle[5]) $C[1] = Number($Triangle[6]) Local $AB[2] $AB[0] = $B[0] - $A[0] $AB[1] = $B[1] - $A[1] Local $BC[2] $BC[0] = $C[0] - $B[0] $BC[1] = $C[1] - $B[1] Local $CA[2] $CA[0] = $A[0] - $C[0] $CA[1] = $A[1] - $C[1] Local Const $ABLen = Sqrt($AB[0] ^ 2 + $AB[1] ^ 2) Local Const $BCLen = Sqrt($BC[0] ^ 2 + $BC[1] ^ 2) Local Const $CALen = Sqrt($CA[0] ^ 2 + $CA[1] ^ 2) If $ABLen = 0 Or $BCLen = 0 Or $CALen = 0 Then Return "ERROR" Local $BA_BC_Angle = Angle($AB, $BC) Local $AB_AC_Angle = Angle($AB, $CA) Local $CA_CB_Angle = Angle($CA, $BC) ConsoleWrite("-----------------------------------------" & @CRLF) ConsoleWrite("$BA_BC_Angle: " & $BA_BC_Angle & @CRLF) ConsoleWrite("$AB_AC_Angle: " & $AB_AC_Angle & @CRLF) ConsoleWrite("$CA_CB_Angle: " & $CA_CB_Angle & @CRLF & @CRLF) ConsoleWrite("Sum: " & $BA_BC_Angle + $AB_AC_Angle + $CA_CB_Angle & @CRLF) If $BA_BC_Angle = 90 Or $AB_AC_Angle = 90 Or $CA_CB_Angle = 90 Then ConsoleWrite("-----------------------------------------" & @CRLF & @CRLF) Return "square corner" EndIf $BA_BC_Angle = ToTirstQuater($BA_BC_Angle) $AB_AC_Angle = ToTirstQuater($AB_AC_Angle) $CA_CB_Angle = ToTirstQuater($CA_CB_Angle) ConsoleWrite(@CRLF & "$BA_BC_Angle: " & $BA_BC_Angle & @CRLF) ConsoleWrite("$AB_AC_Angle: " & $AB_AC_Angle & @CRLF) ConsoleWrite("$CA_CB_Angle: " & $CA_CB_Angle & @CRLF & @CRLF) ConsoleWrite("Sum: " & $BA_BC_Angle + $AB_AC_Angle + $CA_CB_Angle & @CRLF) ConsoleWrite("-----------------------------------------" & @CRLF & @CRLF) If $BA_BC_Angle > 90 Or $AB_AC_Angle > 90 Or $CA_CB_Angle > 90 Then Return "obtuse angle" If $BA_BC_Angle < 90 And $AB_AC_Angle < 90 And $CA_CB_Angle < 90 Then Return "acute angle" EndFunc ;==>Test Func dot_product($v, $u) Return $v[0] * $u[0] + $v[1] * $u[1] EndFunc ;==>ScalarProduct Func angle($v, $u) Local Const $dot_product = dot_product($v, $u) Local Const $length_of_v = Sqrt($v[0] ^ 2 + $v[1] ^ 2) Local Const $length_of_u = Sqrt($u[0] ^ 2 + $u[1] ^ 2) Local Const $cos_theta = ($dot_product / ($length_of_v * $length_of_u)) Return Round(ACos($cos_theta) * (180 / 3.14159265358979), 3) EndFunc Func ToTirstQuater($iAnge) If $iAnge > 90 Then Return Abs(180 - $iAnge) Return Abs($iAnge) EndFunc ;==>ToTirstQuater This has been a lot of fun. I've learned more about trigonometry than I ever learned in school. Edited October 11, 2011 by LaCastiglione Helpful Posts and Websites: AutoIt Wiki | Can't find what you're looking for on the Forum? My scripts: Guiscape | Baroque AU3 Code Formatter | MouseHoverCalltips | SciTe Customization GUI | ActiveWindowTrack Toy | Monitor Configuration UDF
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now