Created
April 16, 2015 21:18
-
-
Save tarunbod/aebd2c0e94ff6992d2ce to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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