Add volume of hollow circular cylinder, Exceptions (#6441)

* Add volume of hollow circular cylinder, Exceptions

* Update volume.py

* floats, zeroes tests added

* Update volume.py

* f-strings
This commit is contained in:
Rohan R Bharadwaj 2022-10-13 00:04:01 +05:30 committed by GitHub
parent f676055bc6
commit 922887c386
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,6 +1,5 @@
""" """
Find Volumes of Various Shapes. Find Volumes of Various Shapes.
Wikipedia reference: https://en.wikipedia.org/wiki/Volume Wikipedia reference: https://en.wikipedia.org/wiki/Volume
""" """
from __future__ import annotations from __future__ import annotations
@ -11,12 +10,21 @@ from math import pi, pow
def vol_cube(side_length: int | float) -> float: def vol_cube(side_length: int | float) -> float:
""" """
Calculate the Volume of a Cube. Calculate the Volume of a Cube.
>>> vol_cube(1) >>> vol_cube(1)
1.0 1.0
>>> vol_cube(3) >>> vol_cube(3)
27.0 27.0
>>> vol_cube(0)
0.0
>>> vol_cube(1.6)
4.096000000000001
>>> vol_cube(-1)
Traceback (most recent call last):
...
ValueError: vol_cube() only accepts non-negative values
""" """
if side_length < 0:
raise ValueError("vol_cube() only accepts non-negative values")
return pow(side_length, 3) return pow(side_length, 3)
@ -24,10 +32,23 @@ def vol_spherical_cap(height: float, radius: float) -> float:
""" """
Calculate the Volume of the spherical cap. Calculate the Volume of the spherical cap.
:return 1/3 pi * height ^ 2 * (3 * radius - height) :return 1/3 pi * height ^ 2 * (3 * radius - height)
>>> vol_spherical_cap(1, 2) >>> vol_spherical_cap(1, 2)
5.235987755982988 5.235987755982988
>>> vol_spherical_cap(1.6, 2.6)
16.621119532592402
>>> vol_spherical_cap(0, 0)
0.0
>>> vol_spherical_cap(-1, 2)
Traceback (most recent call last):
...
ValueError: vol_spherical_cap() only accepts non-negative values
>>> vol_spherical_cap(1, -2)
Traceback (most recent call last):
...
ValueError: vol_spherical_cap() only accepts non-negative values
""" """
if height < 0 or radius < 0:
raise ValueError("vol_spherical_cap() only accepts non-negative values")
return 1 / 3 * pi * pow(height, 2) * (3 * radius - height) return 1 / 3 * pi * pow(height, 2) * (3 * radius - height)
@ -36,7 +57,6 @@ def vol_spheres_intersect(
) -> float: ) -> float:
""" """
Calculate the volume of the intersection of two spheres. Calculate the volume of the intersection of two spheres.
The intersection is composed by two spherical caps and therefore its volume is the The intersection is composed by two spherical caps and therefore its volume is the
sum of the volumes of the spherical caps. First, it calculates the heights (h1, h2) sum of the volumes of the spherical caps. First, it calculates the heights (h1, h2)
of the spherical caps, then the two volumes and it returns the sum. of the spherical caps, then the two volumes and it returns the sum.
@ -49,10 +69,27 @@ def vol_spheres_intersect(
/ (2 * centers_distance) / (2 * centers_distance)
if centers_distance is 0 then it returns the volume of the smallers sphere if centers_distance is 0 then it returns the volume of the smallers sphere
:return vol_spherical_cap(h1, radius_2) + vol_spherical_cap(h2, radius_1) :return vol_spherical_cap(h1, radius_2) + vol_spherical_cap(h2, radius_1)
>>> vol_spheres_intersect(2, 2, 1) >>> vol_spheres_intersect(2, 2, 1)
21.205750411731103 21.205750411731103
>>> vol_spheres_intersect(2.6, 2.6, 1.6)
40.71504079052372
>>> vol_spheres_intersect(0, 0, 0)
0.0
>>> vol_spheres_intersect(-2, 2, 1)
Traceback (most recent call last):
...
ValueError: vol_spheres_intersect() only accepts non-negative values
>>> vol_spheres_intersect(2, -2, 1)
Traceback (most recent call last):
...
ValueError: vol_spheres_intersect() only accepts non-negative values
>>> vol_spheres_intersect(2, 2, -1)
Traceback (most recent call last):
...
ValueError: vol_spheres_intersect() only accepts non-negative values
""" """
if radius_1 < 0 or radius_2 < 0 or centers_distance < 0:
raise ValueError("vol_spheres_intersect() only accepts non-negative values")
if centers_distance == 0: if centers_distance == 0:
return vol_sphere(min(radius_1, radius_2)) return vol_sphere(min(radius_1, radius_2))
@ -74,40 +111,81 @@ def vol_cuboid(width: float, height: float, length: float) -> float:
""" """
Calculate the Volume of a Cuboid. Calculate the Volume of a Cuboid.
:return multiple of width, length and height :return multiple of width, length and height
>>> vol_cuboid(1, 1, 1) >>> vol_cuboid(1, 1, 1)
1.0 1.0
>>> vol_cuboid(1, 2, 3) >>> vol_cuboid(1, 2, 3)
6.0 6.0
>>> vol_cuboid(1.6, 2.6, 3.6)
14.976
>>> vol_cuboid(0, 0, 0)
0.0
>>> vol_cuboid(-1, 2, 3)
Traceback (most recent call last):
...
ValueError: vol_cuboid() only accepts non-negative values
>>> vol_cuboid(1, -2, 3)
Traceback (most recent call last):
...
ValueError: vol_cuboid() only accepts non-negative values
>>> vol_cuboid(1, 2, -3)
Traceback (most recent call last):
...
ValueError: vol_cuboid() only accepts non-negative values
""" """
if width < 0 or height < 0 or length < 0:
raise ValueError("vol_cuboid() only accepts non-negative values")
return float(width * height * length) return float(width * height * length)
def vol_cone(area_of_base: float, height: float) -> float: def vol_cone(area_of_base: float, height: float) -> float:
""" """
Calculate the Volume of a Cone. Calculate the Volume of a Cone.
Wikipedia reference: https://en.wikipedia.org/wiki/Cone Wikipedia reference: https://en.wikipedia.org/wiki/Cone
:return (1/3) * area_of_base * height :return (1/3) * area_of_base * height
>>> vol_cone(10, 3) >>> vol_cone(10, 3)
10.0 10.0
>>> vol_cone(1, 1) >>> vol_cone(1, 1)
0.3333333333333333 0.3333333333333333
>>> vol_cone(1.6, 1.6)
0.8533333333333335
>>> vol_cone(0, 0)
0.0
>>> vol_cone(-1, 1)
Traceback (most recent call last):
...
ValueError: vol_cone() only accepts non-negative values
>>> vol_cone(1, -1)
Traceback (most recent call last):
...
ValueError: vol_cone() only accepts non-negative values
""" """
if height < 0 or area_of_base < 0:
raise ValueError("vol_cone() only accepts non-negative values")
return area_of_base * height / 3.0 return area_of_base * height / 3.0
def vol_right_circ_cone(radius: float, height: float) -> float: def vol_right_circ_cone(radius: float, height: float) -> float:
""" """
Calculate the Volume of a Right Circular Cone. Calculate the Volume of a Right Circular Cone.
Wikipedia reference: https://en.wikipedia.org/wiki/Cone Wikipedia reference: https://en.wikipedia.org/wiki/Cone
:return (1/3) * pi * radius^2 * height :return (1/3) * pi * radius^2 * height
>>> vol_right_circ_cone(2, 3) >>> vol_right_circ_cone(2, 3)
12.566370614359172 12.566370614359172
>>> vol_right_circ_cone(0, 0)
0.0
>>> vol_right_circ_cone(1.6, 1.6)
4.289321169701265
>>> vol_right_circ_cone(-1, 1)
Traceback (most recent call last):
...
ValueError: vol_right_circ_cone() only accepts non-negative values
>>> vol_right_circ_cone(1, -1)
Traceback (most recent call last):
...
ValueError: vol_right_circ_cone() only accepts non-negative values
""" """
if height < 0 or radius < 0:
raise ValueError("vol_right_circ_cone() only accepts non-negative values")
return pi * pow(radius, 2) * height / 3.0 return pi * pow(radius, 2) * height / 3.0
@ -116,12 +194,25 @@ def vol_prism(area_of_base: float, height: float) -> float:
Calculate the Volume of a Prism. Calculate the Volume of a Prism.
Wikipedia reference: https://en.wikipedia.org/wiki/Prism_(geometry) Wikipedia reference: https://en.wikipedia.org/wiki/Prism_(geometry)
:return V = Bh :return V = Bh
>>> vol_prism(10, 2) >>> vol_prism(10, 2)
20.0 20.0
>>> vol_prism(11, 1) >>> vol_prism(11, 1)
11.0 11.0
>>> vol_prism(1.6, 1.6)
2.5600000000000005
>>> vol_prism(0, 0)
0.0
>>> vol_prism(-1, 1)
Traceback (most recent call last):
...
ValueError: vol_prism() only accepts non-negative values
>>> vol_prism(1, -1)
Traceback (most recent call last):
...
ValueError: vol_prism() only accepts non-negative values
""" """
if height < 0 or area_of_base < 0:
raise ValueError("vol_prism() only accepts non-negative values")
return float(area_of_base * height) return float(area_of_base * height)
@ -130,12 +221,25 @@ def vol_pyramid(area_of_base: float, height: float) -> float:
Calculate the Volume of a Pyramid. Calculate the Volume of a Pyramid.
Wikipedia reference: https://en.wikipedia.org/wiki/Pyramid_(geometry) Wikipedia reference: https://en.wikipedia.org/wiki/Pyramid_(geometry)
:return (1/3) * Bh :return (1/3) * Bh
>>> vol_pyramid(10, 3) >>> vol_pyramid(10, 3)
10.0 10.0
>>> vol_pyramid(1.5, 3) >>> vol_pyramid(1.5, 3)
1.5 1.5
>>> vol_pyramid(1.6, 1.6)
0.8533333333333335
>>> vol_pyramid(0, 0)
0.0
>>> vol_pyramid(-1, 1)
Traceback (most recent call last):
...
ValueError: vol_pyramid() only accepts non-negative values
>>> vol_pyramid(1, -1)
Traceback (most recent call last):
...
ValueError: vol_pyramid() only accepts non-negative values
""" """
if height < 0 or area_of_base < 0:
raise ValueError("vol_pyramid() only accepts non-negative values")
return area_of_base * height / 3.0 return area_of_base * height / 3.0
@ -144,27 +248,44 @@ def vol_sphere(radius: float) -> float:
Calculate the Volume of a Sphere. Calculate the Volume of a Sphere.
Wikipedia reference: https://en.wikipedia.org/wiki/Sphere Wikipedia reference: https://en.wikipedia.org/wiki/Sphere
:return (4/3) * pi * r^3 :return (4/3) * pi * r^3
>>> vol_sphere(5) >>> vol_sphere(5)
523.5987755982989 523.5987755982989
>>> vol_sphere(1) >>> vol_sphere(1)
4.1887902047863905 4.1887902047863905
>>> vol_sphere(1.6)
17.15728467880506
>>> vol_sphere(0)
0.0
>>> vol_sphere(-1)
Traceback (most recent call last):
...
ValueError: vol_sphere() only accepts non-negative values
""" """
if radius < 0:
raise ValueError("vol_sphere() only accepts non-negative values")
return 4 / 3 * pi * pow(radius, 3) return 4 / 3 * pi * pow(radius, 3)
def vol_hemisphere(radius: float): def vol_hemisphere(radius: float) -> float:
"""Calculate the volume of a hemisphere """Calculate the volume of a hemisphere
Wikipedia reference: https://en.wikipedia.org/wiki/Hemisphere Wikipedia reference: https://en.wikipedia.org/wiki/Hemisphere
Other references: https://www.cuemath.com/geometry/hemisphere Other references: https://www.cuemath.com/geometry/hemisphere
:return 2/3 * pi * radius^3 :return 2/3 * pi * radius^3
>>> vol_hemisphere(1) >>> vol_hemisphere(1)
2.0943951023931953 2.0943951023931953
>>> vol_hemisphere(7) >>> vol_hemisphere(7)
718.3775201208659 718.3775201208659
>>> vol_hemisphere(1.6)
8.57864233940253
>>> vol_hemisphere(0)
0.0
>>> vol_hemisphere(-1)
Traceback (most recent call last):
...
ValueError: vol_hemisphere() only accepts non-negative values
""" """
if radius < 0:
raise ValueError("vol_hemisphere() only accepts non-negative values")
return 2 / 3 * pi * pow(radius, 3) return 2 / 3 * pi * pow(radius, 3)
@ -172,26 +293,93 @@ def vol_circular_cylinder(radius: float, height: float) -> float:
"""Calculate the Volume of a Circular Cylinder. """Calculate the Volume of a Circular Cylinder.
Wikipedia reference: https://en.wikipedia.org/wiki/Cylinder Wikipedia reference: https://en.wikipedia.org/wiki/Cylinder
:return pi * radius^2 * height :return pi * radius^2 * height
>>> vol_circular_cylinder(1, 1) >>> vol_circular_cylinder(1, 1)
3.141592653589793 3.141592653589793
>>> vol_circular_cylinder(4, 3) >>> vol_circular_cylinder(4, 3)
150.79644737231007 150.79644737231007
>>> vol_circular_cylinder(1.6, 1.6)
12.867963509103795
>>> vol_circular_cylinder(0, 0)
0.0
>>> vol_circular_cylinder(-1, 1)
Traceback (most recent call last):
...
ValueError: vol_circular_cylinder() only accepts non-negative values
>>> vol_circular_cylinder(1, -1)
Traceback (most recent call last):
...
ValueError: vol_circular_cylinder() only accepts non-negative values
""" """
if height < 0 or radius < 0:
raise ValueError("vol_circular_cylinder() only accepts non-negative values")
return pi * pow(radius, 2) * height return pi * pow(radius, 2) * height
def vol_conical_frustum(height: float, radius_1: float, radius_2: float): def vol_hollow_circular_cylinder(
inner_radius: float, outer_radius: float, height: float
) -> float:
"""Calculate the Volume of a Hollow Circular Cylinder.
>>> vol_hollow_circular_cylinder(1, 2, 3)
28.274333882308138
>>> vol_hollow_circular_cylinder(1.6, 2.6, 3.6)
47.50088092227767
>>> vol_hollow_circular_cylinder(-1, 2, 3)
Traceback (most recent call last):
...
ValueError: vol_hollow_circular_cylinder() only accepts non-negative values
>>> vol_hollow_circular_cylinder(1, -2, 3)
Traceback (most recent call last):
...
ValueError: vol_hollow_circular_cylinder() only accepts non-negative values
>>> vol_hollow_circular_cylinder(1, 2, -3)
Traceback (most recent call last):
...
ValueError: vol_hollow_circular_cylinder() only accepts non-negative values
>>> vol_hollow_circular_cylinder(2, 1, 3)
Traceback (most recent call last):
...
ValueError: outer_radius must be greater than inner_radius
>>> vol_hollow_circular_cylinder(0, 0, 0)
Traceback (most recent call last):
...
ValueError: outer_radius must be greater than inner_radius
"""
if inner_radius < 0 or outer_radius < 0 or height < 0:
raise ValueError(
"vol_hollow_circular_cylinder() only accepts non-negative values"
)
if outer_radius <= inner_radius:
raise ValueError("outer_radius must be greater than inner_radius")
return pi * (pow(outer_radius, 2) - pow(inner_radius, 2)) * height
def vol_conical_frustum(height: float, radius_1: float, radius_2: float) -> float:
"""Calculate the Volume of a Conical Frustum. """Calculate the Volume of a Conical Frustum.
Wikipedia reference: https://en.wikipedia.org/wiki/Frustum Wikipedia reference: https://en.wikipedia.org/wiki/Frustum
:return 1/3 * pi * height * (radius_1^2 + radius_top^2 + radius_1 * radius_2) :return 1/3 * pi * height * (radius_1^2 + radius_top^2 + radius_1 * radius_2)
>>> vol_conical_frustum(45, 7, 28) >>> vol_conical_frustum(45, 7, 28)
48490.482608158454 48490.482608158454
>>> vol_conical_frustum(1, 1, 2) >>> vol_conical_frustum(1, 1, 2)
7.330382858376184 7.330382858376184
>>> vol_conical_frustum(1.6, 2.6, 3.6)
48.7240076620753
>>> vol_conical_frustum(0, 0, 0)
0.0
>>> vol_conical_frustum(-2, 2, 1)
Traceback (most recent call last):
...
ValueError: vol_conical_frustum() only accepts non-negative values
>>> vol_conical_frustum(2, -2, 1)
Traceback (most recent call last):
...
ValueError: vol_conical_frustum() only accepts non-negative values
>>> vol_conical_frustum(2, 2, -1)
Traceback (most recent call last):
...
ValueError: vol_conical_frustum() only accepts non-negative values
""" """
if radius_1 < 0 or radius_2 < 0 or height < 0:
raise ValueError("vol_conical_frustum() only accepts non-negative values")
return ( return (
1 1
/ 3 / 3
@ -204,18 +392,21 @@ def vol_conical_frustum(height: float, radius_1: float, radius_2: float):
def main(): def main():
"""Print the Results of Various Volume Calculations.""" """Print the Results of Various Volume Calculations."""
print("Volumes:") print("Volumes:")
print("Cube: " + str(vol_cube(2))) # = 8 print(f"Cube: {vol_cube(2) = }") # = 8
print("Cuboid: " + str(vol_cuboid(2, 2, 2))) # = 8 print(f"Cuboid: {vol_cuboid(2, 2, 2) = }") # = 8
print("Cone: " + str(vol_cone(2, 2))) # ~= 1.33 print(f"Cone: {vol_cone(2, 2) = }") # ~= 1.33
print("Right Circular Cone: " + str(vol_right_circ_cone(2, 2))) # ~= 8.38 print(f"Right Circular Cone: {vol_right_circ_cone(2, 2) = }") # ~= 8.38
print("Prism: " + str(vol_prism(2, 2))) # = 4 print(f"Prism: {vol_prism(2, 2) = }") # = 4
print("Pyramid: " + str(vol_pyramid(2, 2))) # ~= 1.33 print(f"Pyramid: {vol_pyramid(2, 2) = }") # ~= 1.33
print("Sphere: " + str(vol_sphere(2))) # ~= 33.5 print(f"Sphere: {vol_sphere(2) = }") # ~= 33.5
print("Hemisphere: " + str(vol_hemisphere(2))) # ~= 16.75 print(f"Hemisphere: {vol_hemisphere(2) = }") # ~= 16.75
print("Circular Cylinder: " + str(vol_circular_cylinder(2, 2))) # ~= 25.1 print(f"Circular Cylinder: {vol_circular_cylinder(2, 2) = }") # ~= 25.1
print("Conical Frustum: " + str(vol_conical_frustum(2, 2, 4))) # ~= 58.6 print(
print("Spherical cap: " + str(vol_spherical_cap(1, 2))) # ~= 5.24 f"Hollow Circular Cylinder: {vol_hollow_circular_cylinder(1, 2, 3) = }"
print("Spheres intersetion: " + str(vol_spheres_intersect(2, 2, 1))) # ~= 21.21 ) # ~= 28.3
print(f"Conical Frustum: {vol_conical_frustum(2, 2, 4) = }") # ~= 58.6
print(f"Spherical cap: {vol_spherical_cap(1, 2) = }") # ~= 5.24
print(f"Spheres intersetion: {vol_spheres_intersect(2, 2, 1) = }") # ~= 21.21
if __name__ == "__main__": if __name__ == "__main__":