Last active
December 11, 2015 10:58
-
-
Save pcalcao/4590779 to your computer and use it in GitHub Desktop.
My solution for http://programmingpraxis.com/2013/01/18/triangle-trilemma/
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
#!/usr/bin/env python | |
def is_triangle(a, b, c): | |
return not collinear(a, b, c) | |
def collinear(a, b, c): | |
return slope(a, b) == slope(b, c) | |
def slope(point1, point2): | |
""" | |
Returns the slope of two points, or none if they have the same 'x' value, | |
since slope for a vertical line is undefined. | |
""" | |
if point1[0] == point2[0]: | |
return None | |
else: | |
return (point1[1] - point2[1]) / (point1[0] - point2[0]) | |
def square_of_distance(pointA, pointB): | |
return (pointA[0] - pointB[0]) ** 2 + (pointA[1] - pointB[1]) ** 2 | |
def get_distances_squared(a, b, c): | |
return square_of_distance(a,b), square_of_distance(a,c), square_of_distance(b,c) | |
def classify_shape(side1, side2, side3): | |
distances = set([side1, side2, side3]) | |
if len(distances) == 1: | |
tri_type = "equilateral" | |
elif len(distances) == 2: | |
tri_type = "isosceles" | |
elif len(distances) == 3: | |
tri_type = "scalene" | |
return tri_type | |
def classify_angles(side1, side2, side3): | |
sides = sorted([side1, side2, side3]) | |
#Pythagorean theorem, and the other cases | |
if (sides[0] + sides[1]) == sides[2]: | |
angles_type = "right" | |
elif (sides[0] + sides[1]) < sides[2]: | |
angles_type = "obtuse" | |
else: | |
angles_type = "acute" | |
return angles_type | |
def classify_triangle(a, b, c): | |
if is_triangle(a, b, c): | |
side1, side2, side3 = get_distances_squared(a, b, c) | |
shape = classify_shape(side1, side2, side3) | |
angles = classify_angles(side1, side2, side3) | |
print shape + " -> " + angles | |
else: | |
print "Not a triangle" | |
if __name__ == '__main__': | |
classify_triangle((0, 0), (0, 4), (1, 2)) | |
classify_triangle((1, 1), (1, 4), (3, 2)) | |
classify_triangle((2, 2), (2, 4), (4, 3)) | |
classify_triangle((3, 3), (3, 4), (5, 3)) | |
classify_triangle((4, 4), (4, 5), (5, 6)) | |
classify_triangle((5, 5), (5, 6), (6, 5)) | |
classify_triangle((6, 6), (6, 7), (6, 8)) | |
classify_triangle((7, 7), (7, 7), (7, 7)) | |
#tests: | |
classify_triangle((0, 1), (0, 2), (0, 3)) | |
classify_triangle((0, 0), (1, 5), (2, 0)) | |
classify_triangle((0, 0), (10, 5), (20, 0)) | |
classify_triangle((0, 0), (0, 5), (5, 0)) | |
classify_triangle((0, 0), (10, 5), (20, 1)) | |
classify_triangle((0, 0), (0, 3), (4, 0)) | |
classify_triangle((0, 0), (2, 4), (4, 1)) | |
classify_triangle((0, 0), (1, 1), (2, 2)) | |
classify_triangle((0, 0), (0, 2), (0, 0)) | |
classify_triangle((0, 0), (0, 2), (0, 1)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment