Python 中的直角锐角三角形和钝角三角形
Right Acute and Obtuse Triangles in Python
我正在尝试为三角形程序编写代码,提示用户输入任意 6 个坐标,程序确定三角形是锐角三角形、钝角三角形、右三角形、斜角三角形、等边三角形还是等腰三角形。它还求出程序的面积和周长,并判断这 6 个坐标是否完全构成一个三角形。我成功地完成了程序的大部分工作,但是我在编写代码来确定三角形是锐角、右角还是钝角时遇到了困难。这是我的直角三角形、锐角三角形和钝角三角形的代码。我的主要问题是当程序运行时,无论我输入什么坐标,它总是给我 "Acute" 的答案。我已经尝试了右坐标和钝坐标,但我仍然很敏锐。我觉得我逻辑有问题
def right(x1, y1, x2, y2, x3, y3):
# Using Pythagoras theorem
sideAB = sideLength(x1, y1, x2, y2)
sideBC = sideLength(x2, y2, x3, y3)
sideAC = sideLength(x3, y3, x1, y1)
largest = max(sideAB, sideBC, sideAC)
var1 = min(sideAB, sideBC, sideAC)
if sideAB != largest and sideAB != var1:
var2 = sideAB
elif sideBC != largest and sideBC != var1:
var2 = sideBC
else:
var2 = sideAC
if (largest) ** 2 == ((var1 ** 2 + (var2) ** 2)):
return True
else:
return False
对于迟钝
def obtuse(x1, y1, x2, y2, x3, y3):
sideAB = sideLength(x1, y1, x2, y2)
sideBC = sideLength(x2, y2, x3, y3)
sideAC = sideLength(x3, y3, x1, y1)
largest = max(sideAB, sideBC, sideAC)
var1 = min(sideAB, sideBC, sideAC)
if sideAB != largest and sideAB != var1:
var2 = sideAB
elif sideBC != largest and sideBC != var1:
var2 = sideBC
else:
var2 = sideAC
if (largest) ** 2 > ((var1) ** 2 + (var2) ** 2):
return True
else:
return False
对于急性
def acute(x1, y1, x2, y2, x3, y3):
sideAB = sideLength(x1, y1, x2, y2)
sideBC = sideLength(x2, y2, x3, y3)
sideAC = sideLength(x3, y3, x1, y1)
largest = max(sideAB, sideBC, sideAC)
var1 = min(sideAB, sideBC, sideAC)
if sideAB != largest and sideAB != var1:
var2 = sideAB
elif sideBC != largest and sideBC != var1:
var2 = sideBC
else:
var2 = sideAC
if (largest) ** 2 < ((var1) ** 2 + (var2) ** 2):
return True
else:
return False
有人可以 correct/improvise 我的代码,以便确定正确、敏锐和迟钝的度量吗?谢谢!
这是我的 sideLength 函数
def sideLength(x1, y1, x2, y2):
length = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
return length
# Using the min function to find out the shortest side.
def findAllSides(vertices):
x1 = vertices[0][0]
y1 = vertices[0][1]
x2 = vertices[1][0]
y2 = vertices[1][1]
x3 = vertices[2][0]
y3 = vertices[2][1]
sideAB = sideLength(x1, y1, x2, y2)
sideBC = sideLength(x2, y2, x3, y3)
sideAC = sideLength(x3, y3, x1, y1)
lst=[sideAB, sideAC, sideBC]
return lst
这不是编程问题,而是纯粹的计算问题。我将尝试在没有具体代码的情况下简要 'improvise'。
一、为什么要用三个函数,把它们做成一个,如下:
选择最长的边,就像您已经选择的那样,并取其他两条边的点积(这意味着您需要将这两条边作为向量,然后使用 np.dot
或手动计算:x1*x2 + y1*y2
).然后此点积的符号(np.sign
或自写的 if
子句)确定角度是否为 90°(如果为 0)或更大(如果 dot
为负) 或更少(如果为正)。
就是这样,您可以让您的函数输出这三个选项之一。使用三个不同的函数并不好,因为它们的结果不是独立的:你总是得到三个选择中的一个。
如果你想让你的代码更简洁,你可以在一个函数中完成主要计算:
(不要重复自己!)
def typeObtuseRightAcute(x1, y1, x2, y2, x3, y3):
#no idea if this is a good value but works for example
#and should be low enough to give right answers for all but crazy close triangles
epsilon=10**-8
# Using Pythagoras theorem
sideAB = sideLength(x1, y1, x2, y2)
sideBC = sideLength(x2, y2, x3, y3)
sideAC = sideLength(x3, y3, x1, y1)
#use this instead
[var1,var2,largest] = sorted([sideAB, sideBC, sideAC])
if abs((largest) ** 2-((var1 ** 2 + (var2) ** 2)))<epsilon:
return "right"
elif (largest) ** 2 > ((var1 ** 2 + (var2) ** 2)):
return "obtuse"
else:
return "acute"
def acute(x1,y1,x2,y2,x3,y3):
return typeObtuseRightAcute(x1,y1,x2,y2,x3,y3)=="acute"
def right(x1,y1,x2,y2,x3,y3):
return typeObtuseRightAcute(x1,y1,x2,y2,x3,y3)=="right"
def obtuse(x1,y1,x2,y2,x3,y3):
return typeObtuseRightAcute(x1,y1,x2,y2,x3,y3)=="obtuse"
但我认为这个问题应该在 Code Review 中而不是在这里提出,因为您的代码可以工作并且您只是想知道如何更好地编写它(我相信?)
编辑
发现错误:
if sideAB != largest and sideAB != var1:
var2 = sideAB
elif sideBC != largest and sideBC != var1:
var2 = sideBC
else:
var2 = sideAC
如果两条较短的边长度相同,且AC是最长的,这部分代码会出错
发生以下情况:
假设 AC
最大,AB = var1
第一个 if
失败,因为 AB==var1
第二个 if
失败,因为 BC
和 AB
的长度相同
-> var2
被赋值 AC
而你有错误的一面!
更改我的代码以使其正确。要么使用那个,要么在每个函数中改变它。 (不确定 sorted() 在 python 中是否以相同的方式工作 3...试试吧^^)
编辑2:
更改了相等性检查,因为浮点数很麻烦 -_-
我正在尝试为三角形程序编写代码,提示用户输入任意 6 个坐标,程序确定三角形是锐角三角形、钝角三角形、右三角形、斜角三角形、等边三角形还是等腰三角形。它还求出程序的面积和周长,并判断这 6 个坐标是否完全构成一个三角形。我成功地完成了程序的大部分工作,但是我在编写代码来确定三角形是锐角、右角还是钝角时遇到了困难。这是我的直角三角形、锐角三角形和钝角三角形的代码。我的主要问题是当程序运行时,无论我输入什么坐标,它总是给我 "Acute" 的答案。我已经尝试了右坐标和钝坐标,但我仍然很敏锐。我觉得我逻辑有问题
def right(x1, y1, x2, y2, x3, y3):
# Using Pythagoras theorem
sideAB = sideLength(x1, y1, x2, y2)
sideBC = sideLength(x2, y2, x3, y3)
sideAC = sideLength(x3, y3, x1, y1)
largest = max(sideAB, sideBC, sideAC)
var1 = min(sideAB, sideBC, sideAC)
if sideAB != largest and sideAB != var1:
var2 = sideAB
elif sideBC != largest and sideBC != var1:
var2 = sideBC
else:
var2 = sideAC
if (largest) ** 2 == ((var1 ** 2 + (var2) ** 2)):
return True
else:
return False
对于迟钝
def obtuse(x1, y1, x2, y2, x3, y3):
sideAB = sideLength(x1, y1, x2, y2)
sideBC = sideLength(x2, y2, x3, y3)
sideAC = sideLength(x3, y3, x1, y1)
largest = max(sideAB, sideBC, sideAC)
var1 = min(sideAB, sideBC, sideAC)
if sideAB != largest and sideAB != var1:
var2 = sideAB
elif sideBC != largest and sideBC != var1:
var2 = sideBC
else:
var2 = sideAC
if (largest) ** 2 > ((var1) ** 2 + (var2) ** 2):
return True
else:
return False
对于急性
def acute(x1, y1, x2, y2, x3, y3):
sideAB = sideLength(x1, y1, x2, y2)
sideBC = sideLength(x2, y2, x3, y3)
sideAC = sideLength(x3, y3, x1, y1)
largest = max(sideAB, sideBC, sideAC)
var1 = min(sideAB, sideBC, sideAC)
if sideAB != largest and sideAB != var1:
var2 = sideAB
elif sideBC != largest and sideBC != var1:
var2 = sideBC
else:
var2 = sideAC
if (largest) ** 2 < ((var1) ** 2 + (var2) ** 2):
return True
else:
return False
有人可以 correct/improvise 我的代码,以便确定正确、敏锐和迟钝的度量吗?谢谢!
这是我的 sideLength 函数
def sideLength(x1, y1, x2, y2):
length = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
return length
# Using the min function to find out the shortest side.
def findAllSides(vertices):
x1 = vertices[0][0]
y1 = vertices[0][1]
x2 = vertices[1][0]
y2 = vertices[1][1]
x3 = vertices[2][0]
y3 = vertices[2][1]
sideAB = sideLength(x1, y1, x2, y2)
sideBC = sideLength(x2, y2, x3, y3)
sideAC = sideLength(x3, y3, x1, y1)
lst=[sideAB, sideAC, sideBC]
return lst
这不是编程问题,而是纯粹的计算问题。我将尝试在没有具体代码的情况下简要 'improvise'。
一、为什么要用三个函数,把它们做成一个,如下:
选择最长的边,就像您已经选择的那样,并取其他两条边的点积(这意味着您需要将这两条边作为向量,然后使用 np.dot
或手动计算:x1*x2 + y1*y2
).然后此点积的符号(np.sign
或自写的 if
子句)确定角度是否为 90°(如果为 0)或更大(如果 dot
为负) 或更少(如果为正)。
就是这样,您可以让您的函数输出这三个选项之一。使用三个不同的函数并不好,因为它们的结果不是独立的:你总是得到三个选择中的一个。
如果你想让你的代码更简洁,你可以在一个函数中完成主要计算:
(不要重复自己!)
def typeObtuseRightAcute(x1, y1, x2, y2, x3, y3):
#no idea if this is a good value but works for example
#and should be low enough to give right answers for all but crazy close triangles
epsilon=10**-8
# Using Pythagoras theorem
sideAB = sideLength(x1, y1, x2, y2)
sideBC = sideLength(x2, y2, x3, y3)
sideAC = sideLength(x3, y3, x1, y1)
#use this instead
[var1,var2,largest] = sorted([sideAB, sideBC, sideAC])
if abs((largest) ** 2-((var1 ** 2 + (var2) ** 2)))<epsilon:
return "right"
elif (largest) ** 2 > ((var1 ** 2 + (var2) ** 2)):
return "obtuse"
else:
return "acute"
def acute(x1,y1,x2,y2,x3,y3):
return typeObtuseRightAcute(x1,y1,x2,y2,x3,y3)=="acute"
def right(x1,y1,x2,y2,x3,y3):
return typeObtuseRightAcute(x1,y1,x2,y2,x3,y3)=="right"
def obtuse(x1,y1,x2,y2,x3,y3):
return typeObtuseRightAcute(x1,y1,x2,y2,x3,y3)=="obtuse"
但我认为这个问题应该在 Code Review 中而不是在这里提出,因为您的代码可以工作并且您只是想知道如何更好地编写它(我相信?)
编辑
发现错误:
if sideAB != largest and sideAB != var1:
var2 = sideAB
elif sideBC != largest and sideBC != var1:
var2 = sideBC
else:
var2 = sideAC
如果两条较短的边长度相同,且AC是最长的,这部分代码会出错
发生以下情况:
假设 AC
最大,AB = var1
第一个 if
失败,因为 AB==var1
第二个 if
失败,因为 BC
和 AB
的长度相同
-> var2
被赋值 AC
而你有错误的一面!
更改我的代码以使其正确。要么使用那个,要么在每个函数中改变它。 (不确定 sorted() 在 python 中是否以相同的方式工作 3...试试吧^^)
编辑2: 更改了相等性检查,因为浮点数很麻烦 -_-