在Python中的右锐角三角形和钝角三角形

2024-04-19 04:38:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图写一个三角形程序的代码,提示用户输入任何6个坐标,程序确定三角形是锐利的,钝角的,直角的,不等边的,等腰的。它还可以找到程序的面积和周长,并确定6个坐标是否构成三角形。我成功地完成了程序的大部分工作,但是我在编写代码以确定三角形是否锐利、正确和迟钝时遇到了困难。这是我的代码右,锐利和钝角三角形。我的主要问题是,当程序运行时,无论我放什么坐标,它总是给我一个“尖锐”的答案。我试过用坐标来表示正确和迟钝,但我还是变得敏锐起来。我想我在逻辑上有问题。在

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

迟钝的

^{pr2}$

还有急性病

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

有人能纠正/即兴修改我的代码,以便它确定正确、敏锐和迟钝的措施吗?谢谢!在

这是我的边长函数

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

Tags: returnx1x2verticesy1x3var1var2
2条回答

如果要使代码更简洁,可以在单个函数中执行主计算:

(不要重复自己!)在

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"

但我认为这个问题应该在代码评审中提出,而不是在这里,因为您的代码可以工作,您只想知道如何编写得更好(我相信?)在

编辑

发现错误:

^{pr2}$

如果两个较短的边具有相同的长度,并且AC是最长的,则这部分代码将导致错误。在

发生以下情况:

假设AC最大,AB = var1

第一个if失败,因为AB==var1

第二个if失败,因为BC和{}的长度相同

->;var2被分配了AC,而你有错误的一面!在

把我的代码改成正确的。要么使用它,要么在每个函数中改变它。(不确定sorted()在Python3中的工作方式是否相同。。。试试看^^)

编辑2: 更改了相等性检查,因为浮点数字很麻烦

这不是一个编程问题,而是纯粹的计算问题。我将尝试在没有具体代码的情况下进行短暂的“即兴创作”。在

首先,为什么要使用三个函数,使它们成为一个,如下所示:

选择最长的边,就像你已经做的那样,取另外两个边的点积(这意味着您需要这两个边作为向量,使用np.dot或手工计算:x1*x2 + y1*y2)。然后这个点积的符号(np.sign或自写的if-从句)决定角度是90°(如果是0),还是更大(如果dot是负数)还是更小(如果是正)。在

仅此而已,您可以将函数输出设为以下三个选项之一。使用三个不同的函数是不好的,因为它们的结果不是独立的:您总是得到三个选择中的一个。在

相关问题 更多 >