Python中的右急性和钝角三角形

时间:2016-03-18 20:18:44

标签: python function python-3.x math trigonometry

我正在尝试为三角形程序编写代码,提示用户输入任何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

有人可以纠正/改进我的代码,以便确定正确,敏锐和迟钝的措施吗?谢谢!

这是我的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

2 个答案:

答案 0 :(得分:1)

如果您想让您的代码更简洁,您可以在一个函数中进行主要计算:

(不要重复自己!)

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失败,因为BCAB的长度相同

- &GT; var2已被AC分配,您有错误的一面!

将我的代码更改为正确。要么使用那个,要么在每个功能中进行更改。 (不确定sorted()在python 3中的工作方式是否相同...试试看^^)

EDIT2: 更改了相等性检查,因为浮点数是一个痛苦-_-

答案 1 :(得分:0)

这不是一个编程问题,而是纯粹的计算。如果没有具体的代码,我会尝试简短地“即兴发挥”。

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

选择最长的一面,如你所知,并取两个其他的点积(这意味着你需要将两面作为向量,并使用np.dot或手动计算:x1*x2 + y1*y2 )。然后此点积的符号(np.sign或自编if - 子句)确定角度是90°(如果为0)还是更大(如果dot为负)或更少(如果是正面的)。

就是这样,你可以让你的功能输出这三个选项中的一个。使用三个不同的函数并不好,因为它们的结果不是独立的:你总是得到三个选择中的一个。