Skip to content

Instantly share code, notes, and snippets.

@tarunbod
Created April 16, 2015 21:18
Show Gist options
  • Save tarunbod/aebd2c0e94ff6992d2ce to your computer and use it in GitHub Desktop.
Save tarunbod/aebd2c0e94ff6992d2ce to your computer and use it in GitHub Desktop.
from math import *
class TrigHelper:
@staticmethod
def sin(deg):
return sin(radians(deg))
@staticmethod
def cos(deg):
return cos(radians(deg))
@staticmethod
def tan(deg):
return tan(radians(deg))
@staticmethod
def asin(ratio):
return degrees(asin(ratio))
@staticmethod
def acos(ratio):
return degrees(acos(ratio))
@staticmethod
def atan(ratio):
return degrees(atan(ratio))
class Triangle:
def __init__(self, angle1=0, angle2=0, angle3=0, leg1=0, leg2=0, leg3=0):
self.angle1 = angle1
self.angle2 = angle2
self.angle3 = angle3
self.leg1 = leg1
self.leg2 = leg2
self.leg3 = leg3
def __repr__(self):
values = (self.angle1, self.angle2, self.angle3, self.leg1, self.leg2, self.leg3)
return "Angle 1: %f, Angle 2: %f, Angle 3: %f, Leg 1: %f, Leg 2: %f, Leg 3: %f" % values
class RightTriangle(Triangle):
def __init__(self, angle1=0, angle2=0, leg1=0, leg2=0, leg3=0):
super().__init__(angle1, angle2, 90, leg1, leg2, leg3)
def calculate(self):
if self.angle1 != 0 or self.angle2 != 0:
if self.leg1 != 0 or self.leg2 != 0 or self.leg3 != 0:
if self.angle1 != 0:
if self.leg1 != 0:
self.leg3 = (self.leg1 / TrigHelper.cos(self.angle1))
self.leg2 = (TrigHelper.tan(self.angle1) * self.leg1)
elif self.leg2 != 0:
self.leg3 = (self.leg2 / TrigHelper.sin(self.angle1))
self.leg1 = (self.leg2 / TrigHelper.tan(self.angle1))
elif self.leg3 != 0:
self.leg1 = (TrigHelper.cos(self.angle1) * self.leg3)
self.leg2 = (TrigHelper.sin(self.angle1) * self.leg3)
self.angle2 = (180 - (90 + self.angle1))
elif self.angle2 != 0:
if self.leg1 != 0:
self.leg3 = (self.leg1 / TrigHelper.sin(self.angle2))
self.leg2 = (self.leg1 / TrigHelper.tan(self.angle2))
elif self.leg2 != 0:
self.leg3 = (self.leg2 / TrigHelper.cos(self.angle2))
self.leg1 = (TrigHelper.tan(self.angle2) * self.leg2)
elif self.leg3 != 0:
self.leg1 = (TrigHelper.sin(self.angle2) * self.leg3)
self.leg2 = (TrigHelper.cos(self.angle2) * self.leg3)
self.angle1 = (180 - (90 + self.angle2))
else:
raise Exception("Invalid Triangle!")
elif (self.leg1 != 0 and self.leg2 != 0) or (self.leg1 != 0 and self.leg3 != 0) or (self.leg2 != 0 and self.leg3 != 0):
if self.leg1 != 0 and self.leg2 != 0:
self.leg3 = sqrt(self.leg1**2 + self.leg2**2)
self.angle1 = TrigHelper.atan(self.leg2 / self.leg1)
self.angle2 = TrigHelper.atan(self.leg1 / self.leg2)
elif self.leg1 != 0 and self.leg3 != 0:
self.leg2 = sqrt(self.leg3**2 - self.leg1**2)
self.angle1 = TrigHelper.acos(self.leg1 / self.leg3)
self.angle2 = TrigHelper.asin(self.leg1 / self.leg3)
elif self.leg2 != 0 and self.leg3 != 0:
self.leg1 = sqrt(self.leg3**2 - self.leg2**2)
self.angle1 = TrigHelper.asin(self.leg2 / self.leg3)
self.angle2 = TrigHelper.acos(self.leg2 / self.leg3)
else:
raise Exception("Invalid Triangle!")
return self
if __name__ == '__main__':
'''
Makes a 45-45-90, triangle, with one of the legs set to 10.
Basic Trig tells us that both legs will have to be 10, and the hypotenuse will be 10 * the square root of 2
'''
triangle = RightTriangle(angle1=45, leg1=10)
triangle.calculate()
print(triangle)
'''
Makes a 30-60-90 triangle, with the shortest leg set to 5
Again, simple trig will calculate this triangle such that the first leg will be 5 * the square root of 3,
and such that the hypotenuse will be 10.
'''
triangle = RightTriangle(angle1=30, leg2=5)
triangle.calculate()
print(triangle)
'''
This doesn't only work for special right triangles though!
Any right triangle you input, all you need is one angle and one side, and it will be solved.
Support for ANY triangle is coming soon!
'''
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment