Brendan Gillatt
Trigonometry Calculator

What It Does & Why

I wrote this little script to do my year 9 maths homework. I don't count it as cheating - I did a lot more, and probably varied, maths than I would have by just answering the questions.

The script is used to perform simple trigonometry functions on right angled triangles.

The program runs from the command line and operates in two modes:

Please note that this particular script is licensed under the MIT license because I really have no use for it anymore.

Usage

The script is launched from the command line without arguments. The interface is wizard-like. All entered figures are length.

Get The Code

Requirements:

Download TXT source

#! /usr/local/bin/python
# -*- coding: latin-1 -*-
# Trigonometry
#
# Brendan Gillatt
#
# Released under the MIT License: http://www.opensource.org/licenses/mit-license.php
#

import math

# Here Be Dragons from now on ;]

def sine(inv, opp=0, hyp=0, ang=0):
	opp = float(opp)# convert to float
	hyp = float(hyp)
	ang = float(ang)
	if inv == 'a': # if angle is required to be calculated
		ans = math.degrees(math.asin(opp/hyp)) # return inverse sine of opp divided by hyp, converted to degrees
		return ans
	elif inv == 's': # if a side is required to be calculated
		sinetab = math.sin(math.radians(ang)) # return sine of angle
		sinetab = float(sinetab) # convert to float
		if hyp != 0: # if hyp is empty
			ans = sinetab*hyp 
		elif opp != 0: # if opp is empty
			ans = opp/sinetab
		else:
			print "Error, both sides are non-empty - you've already got your answer!"
		return ans

def cosine(inv, adj=0, hyp=0, ang=0):
	adj = float(adj)# convert to float
	hyp = float(hyp)
	ang = float(ang)
	if inv == 'a': # if angle is required to be calculated
		ans = math.degrees(math.acos(adj/hyp)) # return inverse cosine of adj divided by hyp, converted to degrees
		return ans
	elif inv == 's': # if a side is required to be calculated
		cosinetab = math.cos(math.radians(ang)) # return cosine of angle
		cosinetab = float(cosinetab) # convert to float
		if hyp != 0: # if hyp is empty
			ans = cosinetab*hyp 
		elif adj != 0: # if adj is empty
			ans = adj/cosinetab
		else:
			print "Error, both sides are non-zero - you've already got your answer!"
		return ans

def tan(inv, opp=0, adj=0, ang=0):
	adj = float(adj)# convert to float
	opp = float(opp)
	ang = float(ang)
	if inv == 'a': # if angle is required to be calculated
		ans = math.degrees(math.atan(opp/adj)) # return inverse tan of opp divided by adj, converted to degrees
		return ans
	elif inv == 's': # if a side is required to be calculated
		tantab = math.tan(math.radians(ang)) # return cosine of angle
		if opp != 0: # if opp is empty
			ans = tantab*opp
		elif adj != 0: # if opp is empty
			ans = adj/tantab
		else:
			print "Error, both sides are non-empty - you've already got your answer!"
		return ans


def sincahtoa():
	as = '' # Working out an angle or a side length
	typ = '' # Are we using SOAH CAH or TOA
	
	while as != 'A' and as != 'S': # while an unintelligable entry made. 
		as = raw_input('Work out Angle or a Side? A/S: ') # poll the user for an entry
	
	while typ != 'Sin' and typ != 'Cos' and typ != 'Tan' and typ != 'SOH' and typ != 'CAH' and typ != 'TOA': # while we don't know which sides to use from SOH CAH TOA
		typ = raw_input('Enter type [Sin, Cos, Tan] or [SOH, CAH, TOA]: ') # Poll the user for an entry
	
	if typ == 'Sin' or typ == 'SOH': # if we are calculating something that requires Sine.
		if as == 'A': # If we are working out the angle from the Opposite and Hypotinuse side lengths
			opp = float(raw_input('Enter Opposite: ')) # poll for side length
			hyp = float(raw_input('Enter Hypotinuse: ')) # poll for side length
			print 'Angle:', sine('a',opp,hyp,0), 'ø' # pretty print it including DOS degrees sign.
		else: # We are working either the length of the Opposite or Hypotinuse side.
			ang = float(raw_input('Enter Angle: ')) # poll for the angle known
			opp = float(raw_input('Enter Opposite, 0 for unknown: ')) # poll for Opposite
			hyp = float(raw_input('Enter Hypotinuse, 0 for unknown: ')) # pll for Hypotinuse
			print 'Side:', sine('s',opp,hyp,ang)
	
	elif typ == 'Cos' or typ == 'CAH': # Same as bove but for Cosine
		if as =='A':
			adj = float(raw_input('Enter Adjacent: '))
			hyp = float(raw_input('Enter Hypotinuse: '))
			print 'Angle:', cosine('a',adj,hyp,0), 'ø'
		else:
			ang = float(raw_input('Enter Angle: '))
			adj = float(raw_input('Enter Adjacent, 0 for unknown: '))
			hyp = float(raw_input('Enter Hypotinuse, 0 for unknown: '))
			print 'Side:', cosine('s',adj,hyp,ang)
	
	elif typ == 'Tan' or typ == 'TOA': # Same as bove but for Tangent
		if as =='A':
			adj = float(raw_input('Enter Adjacent: '))
			opp = float(raw_input('Enter Opposite: '))
			print 'Angle:', tan('a',opp,adj,0), 'ø'
		else:
			ang = float(raw_input('Enter Angle: '))
			opp = float(raw_input('Enter Opposite, 0 for unknown: '))
			adj = float(raw_input('Enter Adjacent, 0 for unknown: '))
			print 'Side:', tan('s',adj,opp,ang)

def hypotinuse(s1, s2):
	print math.sqrt(s1**2+s2**2)

def side(h1, s1):
	print math.sqrt(h1**2-s1**2)

def pythag():
	typ = ''
	while typ != 'H' and typ != 'S':
		typ = raw_input('Compute Hypotinuse or Side? H/S: ')
	if typ == 'H':
		s1 = float(raw_input('Enter first side of triangle: '))
		s2 = float(raw_input('Enter second side of triangle: '))
		hypotinuse(s1, s2)
	if typ == 'S':
		h1 = float(raw_input('Enter hypotinuse of triangle: '))
		s1 = float(raw_input('Enter side of triangle: '))
		side(h1, s1)

print "\nBrendan's Trigonometry Calculator \nPlease note that it works to a maximum precision of 10 float point digits.\n"

typ = ''
while typ != 'P' and typ != 'S':
	typ = raw_input('Pythagoras or SOHCAHTOA? P/S: ')

if typ == 'P':
	pythag()
elif typ == 'S':
	sincahtoa()