Area of intersection of two circles code

A few days ago, my daughters wanted to know how to find out the bounded area of two intersecting circles. This program is an attempt to teach them both Trigonometry as well as computer science. We started off doing only the basic condition when both circles play nice and intersect with the distance between centers parallel to the horizontal axis. Slowly, we extended the code to cater for other cases where the circles only touch at one point, may not touch at all or one circle is completely inside the other circle.

Basically, the input takes three parameters -> the distance between the centers of the two circles and the radii of the two circles in question. The common area is the output of the program.

Looking for ways to make this a more optimal program as I'm new to python.

import sys import math # Return the area of the smaller circle def smallercirclearea(r1, r2): radsmaller = min(r1, r2) return math.pi * radsmaller * radsmaller def calcAreaIntersectingCircles(d, rad1, rad2): rad1sqr = rad1 * rad1 rad2sqr = rad2 * rad2 #if the circle centers are the same if d == 0: print ('\nCircles have the same center. Intersecting area will be area of smaller circle') return smallercirclearea(rad1,rad2) angle1 = (rad1sqr + (d * d) - rad2sqr) / (2 * rad1 * d) angle2 = (rad2sqr + (d * d) - rad1sqr) / (2 * rad2 * d) # Check to see if the circles are overlapping if ((angle1 < 1 and angle1 >= -1) or (angle2 < 1 and angle2 >= -1)): theta1 = (math.acos(angle1) * 2) theta2 = (math.acos(angle2) * 2) area1 = (0.5 * theta2 * rad2sqr) - (0.5 * rad2sqr * math.sin(theta2)) area2 = (0.5 * theta1 * rad1sqr) - (0.5 * rad1sqr * math.sin(theta1)) return area1 + area2 elif angle1 == 1 and angle2 == 1: print ('\nCircles touch at a single degenerate point and do not intersect\n') return 0 elif angle1 < -1 or angle2 < -1: print('\nSmaller circle is completely inside the larger circle. Intersecting area will be area of smaller circle') return smallercirclearea(rad1,rad2) else: print ('\nImaginary touch points\n') return -1 #Read the distance and radii from the command line if len(sys.argv) == 4: distance = int(sys.argv[1]) radiusCircle1 = int(sys.argv[2]) radiusCircle2 = int(sys.argv[3]) if distance < 0 or radiusCircle1 < 0 or radiusCircle2 < 0: print('Values cannot be negative. Goodbye') exit(1) print('\nThe intersecting area of the two circles is', round(calcAreaIntersectingCircles(float(distance), float(radiusCircle1), float(radiusCircle2)), 2), 'square units\n') else: print('\nNEED 3 VALUES IN THE INPUT!!\n') exit(1)

Once suspended, bacchu will not be able to comment or publish posts until their suspension is removed.

Once unsuspended, bacchu will be able to comment and publish posts again.

Once unpublished, all posts by bacchu will become hidden and only accessible to themselves.

If bacchu is not suspended, they can still re-publish their posts from their dashboard.

Thanks for keeping DEV Community safe. Here is what you can do to flag bacchu:

Make all posts by bacchu less visible

bacchu consistently posts content that violates DEV Community's code of conduct because it is harassing, offensive or spammy.

Report other inappropriate conduct

Unflagging bacchu will restore default visibility to their posts.