Advertisement
CheeseKeg

Triangle Solver 1.2 - Programmed with Monkey

Apr 4th, 2011
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ' This program is written for Monkey
  2. ' It's designed to be exported for HTML5
  3.  
  4. '''''''''''''''''''''''''''''''''''''''''''
  5. ''    --    Triangle Solver 1.2    --    ''
  6. ''          by Brandon DeRosier          ''
  7. '''''''''''''''''''''''''''''''''''''''''''
  8. '' Feel free to modify and redistribute! ''
  9. '''''''''''''''''''''''''''''''''''''''''''
  10. ''              Change Log!              ''
  11. ''---------------------------------------''
  12. '' v1.2:                                 ''
  13. '' - Area now solved using numerically   ''
  14. ''   stable version of Heron's formula.  ''
  15. ''   (Thanks mathwanker of Reddit!)      ''
  16. '' - Formulas used to solve missing      ''
  17. ''   sides and angles are now displayed. ''
  18. ''   (Thanks ninjarob of Reddit!)        ''
  19. '' - Input validation for angles added.  ''
  20. ''   (Thanks azadder of Reddit!)         ''
  21. '' - Sound is disabled by default.       ''
  22. '' v1.1:                                 ''
  23. '' - Calculates the area of solved       ''
  24. ''   triangles.                          ''
  25. '' - Support for radians implemented.    ''
  26. '' - Fixed some rounding bugs.           ''
  27. '' - Made UI a little easier. (Mouse     ''
  28. ''   selection, backspace/delete works)  ''
  29. '' - Added sounds.                       ''
  30. '''''''''''''''''''''''''''''''''''''''''''
  31.  
  32. Strict
  33.  
  34. Import mojo.app
  35. Import mojo.graphics
  36. Import mojo.input
  37. Import mojo.audio
  38.  
  39. Class Vector3
  40.     Field a:Float, b:Float, c:Float
  41.    
  42.     Method New(_a:Float = 0, _b:Float = 0, _c:Float = 0)
  43.         a = _a
  44.         b = _b
  45.         c = _c
  46.     End
  47.    
  48.     Method propagate:Void(variable:String)
  49.         If variable = "a"
  50.             b = a
  51.             c = a
  52.         Else If variable = "b"
  53.             a = b
  54.             c = b
  55.         Else If variable = "c"
  56.             a = c
  57.             b = c
  58.         End
  59.     End
  60. End
  61.  
  62. Class Triangle
  63.     Field angles:Vector3, sides:Vector3
  64.    
  65.     Method New(angleA:Float = 0, angleB:Float = 0, angleC:Float = 0, sideA:Float = 0, sideB:Float = 0, sideC:Float = 0)
  66.         While (angleA >= 180)
  67.             angleA -= 180
  68.         End
  69.         While (angleB >= 180)
  70.             angleB -= 180
  71.         End
  72.         While (angleC >= 180)
  73.             angleC -= 180
  74.         End
  75.         angles = New Vector3(angleA, angleB, angleC)
  76.         sides = New Vector3(sideA, sideB, sideC)
  77.     End
  78.    
  79.     Method PrintValues:Void()
  80.         Print("Angle A: " + String(angles.a))
  81.         Print("Angle B: " + String(angles.b))
  82.         Print("Angle C: " + String(angles.c))
  83.         Print("Side A: " + String(sides.a))
  84.         Print("Side B: " + String(sides.b))
  85.         Print("Side C: " + String(sides.c))
  86.     End
  87. End
  88.  
  89. Class TextObject
  90.     Field x:Int, y:Int
  91.     Field text:String
  92.    
  93.     Method New(_text:String, _x:Int, _y:Int)
  94.         text = _text
  95.         x = _x
  96.         y = _y
  97.     End
  98.    
  99.     Method Render:Void()
  100.         DrawText text, x, y
  101.     End
  102. End
  103.  
  104. Class TriangleMath
  105.     ' Basement functionality
  106.     Method LoC:Float(angleA:Float, sideB:Float, sideC:Float) ' Law of Cosines - Solve for side
  107.         Return Sqrt(Pow(sideB, 2) + Pow(sideC, 2) - 2.0*sideB*sideC*Cos(angleA))
  108.     End
  109.    
  110.     Method iLoC:Float(sideA:Float, sideB:Float, sideC:Float) ' Inverse Law of Cosines - Solve for angle
  111.         Return ACos((Pow(sideB, 2) + Pow(sideC, 2) - Pow(sideA, 2)) / (2.0*sideB*sideC))
  112.     End
  113.    
  114.     Method LoS:Float(angleA:Float, angleB:Float, sideB:Float) ' Law of Sines - Solve for side
  115.         Return Sin(angleA)*(sideB/Sin(angleB))
  116.     End
  117.    
  118.     Method iLoS:Float(angleB:Float, sideA:Float, sideB:Float) ' Inverse Law of Sines - Solve for angle
  119.         Return ASin(sideA/(sideB/Sin(angleB)))
  120.     End
  121.    
  122.     Method TST:Float(angleB:Float, angleC:Float) ' Triangle Sum Theory - Solve for angle
  123.         Local angleA:Float = 180.0 - (angleB + angleC)
  124.         If (angleA < 0)
  125.             Return 0
  126.         End
  127.         Return angleA
  128.     End
  129.    
  130.     Method HF:Float(sideA:Float, sideB:Float, sideC:Float) ' Heron's Formula - Solve for area
  131.         Return Sqrt((sideA + (sideB + sideC))*(sideC - (sideA - sideB))*(sideC + (sideA - sideB))*(sideA + (sideB - sideC)))/4.0
  132.     End
  133.    
  134.     ' Lobby functionality
  135.     Method SSS:Triangle(sideA:Float, sideB:Float, sideC:Float) ' Side-Side-Side
  136.         Local angleA:Float = iLoC(sideA, sideB, sideC)
  137.         Local angleB:Float = iLoC(sideB, sideA, sideC)
  138.         Local angleC:Float = TST(angleA, angleB)
  139.         Local result:Triangle = New Triangle(angleA, angleB, angleC, sideA, sideB, sideC)
  140.         Return result
  141.     End
  142.    
  143.     Method SAS:Triangle(sideC:Float, angleA:Float, sideB:Float, variation:Int = 0) ' Side-Angle-Side - Three variations: 0-sCaAsB, 1-sAaBsC, 2-sBaCsA
  144.         Local sideA:Float = LoC(angleA, sideB, sideC)
  145.         Local angleB:Float = iLoC(sideB, sideA, sideC)
  146.         Local angleC:Float = TST(angleA, angleB)
  147.         Local result:Triangle
  148.         If (variation = 1) ' Inputs assumed to be sAaBsC
  149.             result = New Triangle(angleC, angleA, angleB, sideC, sideA, sideB)
  150.         Else If (variation = 2) ' Inputs assumed to be sBaCsA
  151.             result = New Triangle(angleB, angleC, angleA, sideB, sideC, sideA)
  152.         Else ' Inputs assumed to be sCaAsB
  153.             result = New Triangle(angleA, angleB, angleC, sideA, sideB, sideC)
  154.         End
  155.         Return result
  156.     End
  157.    
  158.     Method ASA:Triangle(angleB:Float, sideC:Float, angleA:Float, variation:Int = 0) ' Angle-Side-Angle - Three variations: 0-aBsCaA, 1-aCsAaB, 2-aAsBaC
  159.         Local angleC:Float = TST(angleA, angleB)
  160.         Local sideB:Float = LoS(angleB, angleC, sideC)
  161.         Local sideA:Float = LoC(angleA, sideB, sideC)
  162.         Local result:Triangle
  163.         If (variation = 1) ' Inputs assumed to be aBsCaA
  164.             result = New Triangle(angleC, angleA, angleB, sideC, sideA, sideB)
  165.         Else If (variation = 2) ' Inputs assumed to be aCsAaB
  166.             result = New Triangle(angleB, angleC, angleA, sideB, sideC, sideA)
  167.         Else ' Inputs assumed to be aAsBaC
  168.             result = New Triangle(angleA, angleB, angleC, sideA, sideB, sideC)
  169.         End
  170.         Return result
  171.     End
  172. End
  173.  
  174. Class Widget Abstract
  175.     Field x:Float, y:Float, width:Float, height:Float
  176.    
  177.     Method New(_x:Float, _y:Float, _width:Float, _height:Float)
  178.         x = _x
  179.         y = _y
  180.         width = _width
  181.         height = _height
  182.     End
  183.    
  184.     Method Update:Void() Abstract
  185.    
  186.     Method Render:Void() Abstract
  187. End
  188.  
  189. Class LabelInput Extends Widget
  190.     Field label:String, input:String
  191.     Field labelColor:Vector3
  192.     Field keyCode:Int
  193.     Field rollOver:Bool
  194.    
  195.     Method New(_x:Float = 0, _y:Float = 0, _label:String = "Input", _keyCode:Int = KEY_ESCAPE, _labelColor:Vector3 = New Vector3(255, 255, 255))
  196.         Super.New(_x, _y, 0, 0)
  197.         label = _label
  198.         input = ""
  199.         labelColor = _labelColor
  200.         keyCode = _keyCode
  201.         rollOver = False
  202.     End
  203.    
  204.     Method Update:Void()
  205.         If (widgetFocus = keyCode)
  206.             Local character:Int = GetChar()
  207.             If ((character >= 48 And character <= 57) Or character = 46)
  208.                 If (((character = 46 And Not input.Contains(".")) Or character <> 46) And input.Length < 14)
  209.                     ChannelSound(typeSound)
  210.                     input += String.FromChar(character)
  211.                 Else
  212.                     ChannelSound(selectSound)
  213.                 End
  214.             Else If (character = CHAR_BACKSPACE Or character = CHAR_DELETE)
  215.                 If (input.Length > 0)
  216.                     input = input[0..input.Length-1]
  217.                     ChannelSound(typeSound)
  218.                 Else
  219.                     ChannelSound(selectSound)
  220.                 End
  221.             End
  222.             If (KeyHit(KEY_R))
  223.                 ChannelSound(typeSound)
  224.                 input = ""
  225.             End
  226.         End
  227.         If (MouseY() > y - 3 And MouseY() < y + 15)
  228.             rollOver = True
  229.             If (MouseHit(MOUSE_LEFT))
  230.                 ChannelSound(selectSound)
  231.                 widgetFocus = keyCode
  232.             End
  233.         Else
  234.             rollOver = False
  235.         End
  236.         If (KeyHit(keyCode))
  237.             ChannelSound(selectSound)
  238.             widgetFocus = keyCode
  239.         End
  240.     End
  241.    
  242.     Method Render:Void()
  243.         If (widgetFocus = keyCode)
  244.             SetColor 255, 0, 0
  245.             DrawCircle(x - 5, y + 5, 5)
  246.         Else If (rollOver)
  247.             SetColor 0, 255, 0
  248.             DrawCircle(x - 5, y + 5, 5)
  249.         End
  250.         If (input = "" And widgetFocus <> keyCode)
  251.             DrawText(label + " = Undefined", x, y)
  252.         Else
  253.             DrawText(label + " = " + input, x, y)
  254.         End
  255.     End
  256. End
  257.  
  258. Global solution:Int = 0
  259. Global widgetFocus:Int
  260. Global typeSound:Sound, selectSound:Sound, backSound:Sound
  261. Global soundChannel:Int = 0
  262. Global playSound:Bool
  263.  
  264. Function ChannelSound:Void(snd:Sound)
  265.     If (playSound)
  266.         If (soundChannel < 10)
  267.             soundChannel += 1
  268.         Else
  269.             soundChannel = 0
  270.         End
  271.         StopChannel(soundChannel)
  272.         PlaySound(snd)
  273.     End
  274. End
  275.  
  276. Class KegSolver Extends App
  277.     Field tMath:TriangleMath
  278.     Field solved:Triangle, solvedArea:Float
  279.     Field inputs:LabelInput[6]
  280.     Field solutionInfo:TextObject[7]
  281.     Field mode:Int
  282.    
  283.     Method OnCreate:Void()
  284.         SetUpdateRate 60
  285.         tMath = New TriangleMath()
  286.         solved = New Triangle(0, 0, 0, 0, 0, 0)
  287.         typeSound = LoadSound("type.wav")
  288.         selectSound = LoadSound("tick.wav")
  289.         inputs[0] = New LabelInput(50, 50, "A) Angle A", KEY_A)
  290.         inputs[1] = New LabelInput(50, 70, "S) Angle B", KEY_S)
  291.         inputs[2] = New LabelInput(50, 90, "D) Angle C", KEY_D)
  292.         inputs[3] = New LabelInput(50, 130, "Z) Side A", KEY_Z)
  293.         inputs[4] = New LabelInput(50, 150, "X) Side B", KEY_X)
  294.         inputs[5] = New LabelInput(50, 170, "C) Side C", KEY_C)
  295.         For Local i:Int = 0 To 6
  296.             Local j:Int = 0
  297.             If (i >= 3 And i < 6)
  298.                 j = 20
  299.             Else If (i >= 6)
  300.                 j = 40
  301.             End
  302.             solutionInfo[i] = New TextObject("Given", DeviceWidth() - 370, (i*20) + 260 + j)
  303.         End
  304.         mode = 0
  305.         playSound = False
  306.     End
  307.    
  308.     Method OnUpdate:Void()
  309.         For Local input:LabelInput = Eachin inputs
  310.             input.Update()
  311.         End
  312.         If (KeyHit(KEY_ENTER))
  313.             ChannelSound(selectSound)
  314.             Local fInputs:Float[6]
  315.             For Local i:Int = 0 To 5
  316.                 If (inputs[i].input = "")
  317.                     fInputs[i] = 0
  318.                 Else
  319.                     Local inputValue:Float = Float(inputs[i].input)
  320.                     If (i < 3)
  321.                         fInputs[i] = convertInput(inputValue)
  322.                     Else
  323.                         fInputs[i] = inputValue
  324.                     End
  325.                 End
  326.             Next
  327.             Local unsolved:Triangle = New Triangle(fInputs[0], fInputs[1], fInputs[2], fInputs[3], fInputs[4], fInputs[5])
  328.             solved = Solve(unsolved)
  329.             If (solution > 1)
  330.                 solvedArea = tMath.HF(solved.sides.a, solved.sides.b, solved.sides.c)
  331.                 solutionInfo[6].text = "Sqrt((a+(b+c))*(c-(a-b))*(c+(a-b))*(a+(b-c)))/4"
  332.             End
  333.         End
  334.         If (KeyHit(KEY_M))
  335.             ChannelSound(selectSound)
  336.             If (mode = 0)
  337.                 mode = 1
  338.                 inputs[0].input = floatToString(toRadians(Float(inputs[0].input)))
  339.                 inputs[1].input = floatToString(toRadians(Float(inputs[1].input)))
  340.                 inputs[2].input = floatToString(toRadians(Float(inputs[2].input)))
  341.             Else
  342.                 mode = 0
  343.                 inputs[0].input = floatToString(toDegrees(Float(inputs[0].input)))
  344.                 inputs[1].input = floatToString(toDegrees(Float(inputs[1].input)))
  345.                 inputs[2].input = floatToString(toDegrees(Float(inputs[2].input)))
  346.             End
  347.         End
  348.         If (KeyHit(KEY_T))
  349.             If (playSound)
  350.                 playSound = False
  351.             Else
  352.                 playSound = True
  353.                 ChannelSound(selectSound)
  354.             End
  355.         End
  356.     End
  357.    
  358.     Method OnRender:Void()
  359.         Cls 0, 0, 0
  360.         For Local input:LabelInput = Eachin inputs
  361.             input.Render()
  362.         End
  363.         DrawText "Input three values and press Enter (press R to reset a field):", 50, 20
  364.         Local modeText:String
  365.         If (mode = 0)
  366.             modeText = "Degrees"
  367.         Else If (mode = 1)
  368.             modeText = "Radians"
  369.         End
  370.         DrawText "Angle units: " + modeText, DeviceWidth() - 320, DeviceHeight() - 30
  371.         Local soundText:String
  372.         If (playSound)
  373.             soundText = "Enabled"
  374.         Else
  375.             soundText = "Disabled"
  376.         End
  377.         DrawText "Sound: " + soundText, DeviceWidth() - 140, DeviceHeight() - 30
  378.         If (solution = 0)
  379.             DrawText "Triangle Solver 1.2 by Brandon DeRosier, 2011.", 50, 230
  380.             DrawText "Navigation:", 50, 260
  381.             DrawText "- Press A, S, D, Z, X, or C to focus on corresponding angle/side inputs.", 60, 280
  382.             DrawText "- Press R to reset the focused input field.", 60, 300
  383.             DrawText "- Press M to toggle between degrees and radians for angle measurements.", 60, 320
  384.             DrawText "- Press T to toggle sound.", 60, 340
  385.             DrawText "- Press Enter to solve the triangle based on the inputs given.", 60, 360
  386.         Else If (solution = 1)
  387.             DrawText "Impossible to solve..", 50, 230
  388.             DrawText "Guidelines:", 50, 260
  389.             DrawText "- Three value inputs are needed.", 60, 280
  390.             DrawText "- At least one of the inputs should be a side length.", 60, 300
  391.             DrawText "- The sum of all angles must be less than 180 degrees (PI radians).", 60, 320
  392.         Else If (solution > 1)
  393.             If (solution = 2)
  394.                 DrawText "Solved using SSS (Side-Side-Side)", 50, 230
  395.             Else If (solution = 3)
  396.                 DrawText "Solved using SAS (Side-Angle-Side) [First variation]", 50, 230
  397.             Else If (solution = 4)
  398.                 DrawText "Solved using SAS (Side-Angle-Side) [Second variation]", 50, 230
  399.             Else If (solution = 5)
  400.                 DrawText "Solved using SAS (Side-Angle-Side) [Third variation]", 50, 230
  401.             Else If (solution = 6)
  402.                 DrawText "Solved using ASA (Angle-Side-Angle) [First variation]", 50, 230
  403.             Else If (solution = 7)
  404.                 DrawText "Solved using ASA (Angle-Side-Angle) [Second variation]", 50, 230
  405.             Else If (solution = 8)
  406.                 DrawText "Solved using ASA (Angle-Side-Angle) [Third variation]", 50, 230
  407.             End
  408.             DrawText "Angle A = " + convertValue(solved.angles.a), 50, 260
  409.             DrawText "Angle B = " + convertValue(solved.angles.b), 50, 280
  410.             DrawText "Angle C = " + convertValue(solved.angles.c), 50, 300
  411.             DrawText "Side A = " + solved.sides.a, 50, 340
  412.             DrawText "Side B = " + solved.sides.b, 50, 360
  413.             DrawText "Side C = " + solved.sides.c, 50, 380
  414.             DrawText "Area = " + solvedArea, 50, 420
  415.             For Local info:TextObject = Eachin solutionInfo
  416.                 info.Render()
  417.             End
  418.         End
  419.     End
  420.    
  421.     ' Attic functionality
  422.     Method toRadians:Float(degrees:Float)
  423.         If (String(degrees) = "NaN")
  424.             degrees = 0
  425.         End
  426.         Return (degrees*PI)/180.0
  427.     End
  428.    
  429.     Method toDegrees:Float(radians:Float)
  430.         If (String(radians) = "NaN")
  431.             radians = 0
  432.         End
  433.         Return (radians*180.0)/PI
  434.     End
  435.    
  436.     Method convertValue:Float(number:Float)
  437.         If (mode = 1)
  438.             Return toRadians(number)
  439.         End
  440.         Return number
  441.     End
  442.    
  443.     Method convertInput:Float(number:Float)
  444.         If (mode = 1)
  445.             Return toDegrees(number)
  446.         End
  447.         Return number
  448.     End
  449.    
  450.     Method floatToString:String(number:Float)
  451.         If (number = 0)
  452.             Return ""
  453.         End
  454.         Return String(number)
  455.     End
  456.    
  457.     Method Solve:Triangle(tri:Triangle)
  458.         Local result:Triangle
  459.         solution = 0
  460.         For Local info:TextObject = Eachin solutionInfo
  461.             info.text = "Given"
  462.         End
  463.         If (tri.angles.a > 0 And tri.angles.b > 0 And tri.angles.c = 0) ' Prerequisite - Solve last angle
  464.             tri.angles.c = tMath.TST(tri.angles.a, tri.angles.b)
  465.             solutionInfo[2].text = "TST: C = 180 - ( A + B )"
  466.         Else If (tri.angles.c > 0 And tri.angles.a > 0 And tri.angles.b = 0)
  467.             tri.angles.b = tMath.TST(tri.angles.a, tri.angles.c)
  468.             solutionInfo[1].text = "TST: B = 180 - ( A + C )"
  469.         Else If (tri.angles.b > 0 And tri.angles.c > 0 And tri.angles.a = 0)
  470.             tri.angles.a = tMath.TST(tri.angles.b, tri.angles.c)
  471.             solutionInfo[0].text = "TST: A = 180 - ( B + C )"
  472.         End
  473.         If (tri.sides.a > 0 And tri.sides.b > 0 And tri.sides.c > 0) ' SSS
  474.             result = tMath.SSS(tri.sides.a, tri.sides.b, tri.sides.c)
  475.             solutionInfo[0].text = "iLoC: A = ACos( ( b^2 + c^2 - a^2 ) / 2bc )"
  476.             solutionInfo[1].text = "iLoC: B = ACos( ( a^2 + c^2 - b^2 ) / 2ac )"
  477.             If (tri.angles.c = 0)
  478.                 solutionInfo[2].text = "TST: C = 180 - ( A + B )"
  479.             End
  480.             solution = 2
  481.         Else If (tri.sides.c > 0 And tri.angles.a > 0 And tri.sides.b > 0) ' SAS original
  482.             result = tMath.SAS(tri.sides.c, tri.angles.a, tri.sides.b, 0)
  483.             solutionInfo[3].text = "LoC: a = Sqrt( b^2 + c^2 - 2bc*Cos( A ) )"
  484.             solutionInfo[1].text = "iLoC: B = ACos( ( a^2 + c^2 - b^2 ) / 2ac )"
  485.             If (tri.angles.c = 0)
  486.                 solutionInfo[2].text = "TST: C = 180 - ( A + B )"
  487.             End
  488.             solution = 3
  489.         Else If (tri.sides.a > 0 And tri.angles.b > 0 And tri.sides.c > 0) ' SAS morph 1
  490.             result = tMath.SAS(tri.sides.a, tri.angles.b, tri.sides.c, 1)
  491.             solutionInfo[4].text = "LoC: b = Sqrt( a^2 + c^2 - 2ac*Cos( B ) )"
  492.             solutionInfo[2].text = "iLoC: C = ACos( ( a^2 + b^2 - c^2 ) / 2ab )"
  493.             If (tri.angles.a = 0)
  494.                 solutionInfo[0].text = "TST: A = 180 - ( B + C )"
  495.             End
  496.             solution = 4
  497.         Else If (tri.sides.b > 0 And tri.angles.c > 0 And tri.sides.a > 0) ' SAS morph 2
  498.             result = tMath.SAS(tri.sides.b, tri.angles.c, tri.sides.a, 2)
  499.             solutionInfo[5].text = "LoC: c = Sqrt( a^2 + b^2 - 2ab*Cos( C ) )"
  500.             solutionInfo[0].text = "iLoC: A = ACos( ( b^2 + c^2 - a^2 ) / 2bc )"
  501.             If (tri.angles.b = 0)
  502.                 solutionInfo[1].text = "TST: B = 180 - ( A + C )"
  503.             End
  504.             solution = 5
  505.         End
  506.         If (solution = 0)
  507.             If (tri.angles.b > 0 And tri.sides.c > 0 And tri.sides.b > 0 And tri.angles.c = 0) ' SSA original
  508.                 tri.angles.c = tMath.iLoS(tri.angles.b, tri.sides.c, tri.sides.b)
  509.                 tri.angles.a = tMath.TST(tri.angles.b, tri.angles.c)
  510.                 solutionInfo[2].text = "iLoS: C = ASin( c / ( b / Sin( B ) ) )"
  511.                 If (tri.angles.a = 0)
  512.                     solutionInfo[0].text = "TST: A = 180 - ( B + C )"
  513.                 End
  514.             Else If (tri.angles.c > 0 And tri.sides.a > 0 And tri.sides.c > 0 And tri.angles.a = 0) ' SSA morph 1
  515.                 tri.angles.a = tMath.iLoS(tri.angles.c, tri.sides.a, tri.sides.c)
  516.                 tri.angles.b = tMath.TST(tri.angles.a, tri.angles.c)
  517.                 solutionInfo[0].text = "iLoS: A = ASin( a / ( c / Sin( C ) ) )"
  518.                 If (tri.angles.b = 0)
  519.                     solutionInfo[1].text = "TST: B = 180 - ( A + C )"
  520.                 End
  521.             Else If (tri.angles.a > 0 And tri.sides.b > 0 And tri.sides.a > 0 And tri.angles.b = 0) ' SSA morph 2
  522.                 tri.angles.b = tMath.iLoS(tri.angles.a, tri.sides.b, tri.sides.a)
  523.                 tri.angles.c = tMath.TST(tri.angles.a, tri.angles.b)
  524.                 solutionInfo[1].text = "iLoS: B = ASin( b / ( a / Sin( A ) ) )"
  525.                 If (tri.angles.c = 0)
  526.                     solutionInfo[2].text = "TST: C = 180 - ( A + B )"
  527.                 End
  528.             Else If (tri.angles.c > 0 And tri.sides.b > 0 And tri.sides.c > 0 And tri.angles.b = 0) ' SSA morph 3
  529.                 tri.angles.b = tMath.iLoS(tri.angles.c, tri.sides.b, tri.sides.c)
  530.                 tri.angles.a = tMath.TST(tri.angles.b, tri.angles.c)
  531.                 solutionInfo[1].text = "iLoS: B = ASin( b / ( c / Sin( C ) ) )"
  532.                 If (tri.angles.a = 0)
  533.                     solutionInfo[0].text = "TST: A = 180 - ( B + C )"
  534.                 End
  535.             Else If (tri.angles.a > 0 And tri.sides.c > 0 And tri.sides.a > 0 And tri.angles.c = 0) ' SSA morph 4
  536.                 tri.angles.c = tMath.iLoS(tri.angles.a, tri.sides.c, tri.sides.a)
  537.                 tri.angles.b = tMath.TST(tri.angles.a, tri.angles.c)
  538.                 solutionInfo[2].text = "iLoS: C = ASin( c / ( a / Sin( A ) ) )"
  539.                 If (tri.angles.b = 0)
  540.                     solutionInfo[1].text = "TST: B = 180 - ( A + C )"
  541.                 End
  542.             Else If (tri.angles.b > 0 And tri.sides.a > 0 And tri.sides.b > 0 And tri.angles.a = 0) ' SSA morph 5
  543.                 tri.angles.a = tMath.iLoS(tri.angles.b, tri.sides.a, tri.sides.b)
  544.                 tri.angles.c = tMath.TST(tri.angles.a, tri.angles.b)
  545.                 solutionInfo[0].text = "iLoS: A = ASin( a / ( b / Sin( B ) ) )"
  546.                 If (tri.angles.c = 0)
  547.                     solutionInfo[2].text = "TST: C = 180 - ( A + B )"
  548.                 End
  549.             End
  550.             If (tri.angles.b > 0 And tri.sides.c > 0 And tri.angles.a > 0) ' ASA original
  551.                 result = tMath.ASA(tri.angles.b, tri.sides.c, tri.angles.a, 0)
  552.                 If (tri.angles.c = 0)
  553.                     solutionInfo[2].text = "TST: C = 180 - ( A + B )"
  554.                 End
  555.                 solutionInfo[4].text = "LoS: b = Sin( B )*( c / Sin( C ) )"
  556.                 solutionInfo[3].text = "LoC: a = Sqrt( b^2 + c^2 - 2bc*Cos( A ) )"
  557.                 solution = 6
  558.             Else If (tri.angles.c > 0 And tri.sides.a > 0 And tri.angles.b > 0) ' ASA morph 1
  559.                 result = tMath.ASA(tri.angles.c, tri.sides.a, tri.angles.b, 1)
  560.                 If (tri.angles.a = 0)
  561.                     solutionInfo[0].text = "TST: A = 180 - ( B + C )"
  562.                 End
  563.                 solutionInfo[5].text = "LoS: c = Sin( C )*( a / Sin( A ) )"
  564.                 solutionInfo[4].text = "LoC: b = Sqrt( a^2 + c^2 - 2ac*Cos( B ) )"
  565.                 solution = 7
  566.             Else If (tri.angles.a > 0 And tri.sides.b > 0 And tri.angles.c > 0) ' ASA morph 2
  567.                 result = tMath.ASA(tri.angles.a, tri.sides.b, tri.angles.c, 2)
  568.                 If (tri.angles.b = 0)
  569.                     solutionInfo[1].text = "TST: B = 180 - ( A + C )"
  570.                 End
  571.                 solutionInfo[3].text = "LoS: a = Sin( A )*( b / Sin( B ) )"
  572.                 solutionInfo[5].text = "LoC: c = Sqrt( a^2 + b^2 - 2ab*Cos( C ) )"
  573.                 solution = 8
  574.             Else ' Can't solve
  575.                 result = New Triangle(0, 0, 0, 0, 0, 0)
  576.             End
  577.         End
  578.         If (result.angles.a <= 0 Or result.angles.b <= 0 Or result.angles.c <= 0 Or result.sides.a <= 0 Or result.sides.b <= 0 Or result.sides.c <= 0)
  579.             solution = 1
  580.         End
  581.         Return result
  582.     End
  583. End
  584.  
  585. Function Main:Int()
  586.     New KegSolver
  587.     Return 0
  588. End
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement