def getConeSurfaceArea( r, h ): if not isinstance( r, RPNMeasurement ): return getConeSurfaceArea( RPNMeasurement( real( r ), 'meter' ), h ) if r.getDimensions( ) != { 'length' : 1 }: raise ValueError( '\'cone_area\' argument 1 must be a length' ) if not isinstance( h, RPNMeasurement ): return getConeSurfaceArea( r, RPNMeasurement( real( h ), 'meter' ) ) if h.getDimensions( ) != { 'length' : 1 }: raise ValueError( '\'cone_area\' argument 2 must be a length' ) hypotenuse = getRoot( add( getPower( r, 2 ), getPower( h, 2 ) ), 2 ) return getProduct( [ pi, r, add( r, hypotenuse ) ] )
def getDodecahedronSurfaceArea( n ): if not isinstance( n, RPNMeasurement ): return getDodecahedronSurfaceArea( RPNMeasurement( real( n ), 'meter' ) ) if n.getDimensions( ) != { 'length' : 1 }: raise ValueError( '\'dodecahedron_area\' argument must be a length' ) area = getProduct( [ 3, getRoot( add( 25, fmul( 10, sqrt( 5 ) ) ), 2 ), getPower( n, 2 ) ] ) return area.convert( 'meter^2' )
def getTriangleArea( a, b, c ): if not isinstance( a, RPNMeasurement ): return getTriangleArea( RPNMeasurement( real( a ), 'meter' ), b, c ) if a.getDimensions( ) != { 'length' : 1 }: raise ValueError( '\'triangle_area\' argument 1 must be a length' ) if not isinstance( b, RPNMeasurement ): return getTriangleArea( a, RPNMeasurement( real( b ), 'meter' ), c ) if b.getDimensions( ) != { 'length' : 1 }: raise ValueError( '\'triangle_area\' argument 2 must be a length' ) if not isinstance( c, RPNMeasurement ): return getTriangleArea( a, b, RPNMeasurement( real( c ), 'meter' ) ) if b.getDimensions( ) != { 'length' : 1 }: raise ValueError( '\'triangle_area\' argument 3 must be a length' ) if add( a, b ).isNotLarger( c ) or add( b, c ).isNotLarger( a ) or add( a, c ).isNotLarger( b ): raise ValueError( 'invalid triangle, the sum of any two sides must be longer than the third side' ) s = divide( getSum( [ a, b, c ] ), 2 ) # semi-perimeter return getRoot( getProduct( [ s, subtract( s, a ), subtract( s, b ), subtract( s, c ) ] ), 2 )
def getSum( n ): if isinstance( n, RPNGenerator ): return getSum( list( n ) ) elif isinstance( n[ 0 ], ( list, RPNGenerator ) ): return [ getSum( arg ) for arg in n ] result = None for i in n: if result is None: result = i else: result = add( result, i ) return result
def getPrismSurfaceArea( n, k, h ): if real( n ) < 3: raise ValueError( 'the number of sides of the prism cannot be less than 3,' ) if not isinstance( k, RPNMeasurement ): return getPrismSurfaceArea( n, RPNMeasurement( real( k ), 'meter' ), h ) if not isinstance( h, RPNMeasurement ): return getPrismSurfaceArea( n, k, RPNMeasurement( real( h ), 'meter' ) ) if k.getDimensions( ) != { 'length' : 1 }: raise ValueError( '\'prism_area\' argument 2 must be a length' ) if h.getDimensions( ) != { 'length' : 1 }: raise ValueError( '\'prism_area\' argument 3 must be a length' ) result = add( getProduct( [ fdiv( n, 2 ), getPower( k, 2 ), cot( fdiv( pi, n ) ) ] ), getProduct( [ n, k, h ] ) ) return result.convert( 'meter^2' )