Python 3-graphicalTriangle-字符串格式/函数

Python 3-graphicalTriangle-字符串格式/函数,python,python-3.x,Python,Python 3.x,我想知道是否有人能指出我在最后一个字符串(区域、周界)中的错误-非常感谢任何帮助。) ####完整代码##### 有几个问题 直接的问题是,您正试图格式化函数“permiture”和未定义的变量“a”。“f”格式说明符需要一个浮点数,所以它可能对此表示不满 另一个大问题是,您没有调用permiture()和area()函数 下一个问题可能还没有出现,因为函数没有被调用,那就是周长函数和面积函数使用的变量是主函数的局部变量 您需要修改周长()和面积()以将p1、p2和p3作为参数,类似于距离()将

我想知道是否有人能指出我在最后一个字符串(区域、周界)中的错误-非常感谢任何帮助。)

####完整代码#####


有几个问题

直接的问题是,您正试图格式化函数“permiture”和未定义的变量“a”。“f”格式说明符需要一个浮点数,所以它可能对此表示不满

另一个大问题是,您没有调用permiture()和area()函数

下一个问题可能还没有出现,因为函数没有被调用,那就是周长函数和面积函数使用的变量是主函数的局部变量

您需要修改周长()和面积()以将p1、p2和p3作为参数,类似于距离()将p1和p2作为参数的方式。然后需要更新代码和对format()的调用,以便实际调用周长和面积函数。可能是这样的:

p = perimeter(p1,p2,p3)
a = area(p1,p2,p3)
message = Text(Point(5, 0.5),"The perimeter is: {0:0.2f}".format(p))
message.draw(win)
message2 = Text(Point(5, 1),"The area is: {0:0.2f}".format(a))

如果我对问题的理解正确,则面积计算的结果不正确。我看到两个问题

首先,您没有调用
周界
区域
函数。您需要调用它们,并可能将点集合作为参数传入。(我写这篇文章的时候,耶利米也很清楚地回答了这一部分。)

第二个问题是,我认为你对三角形面积的计算是错误的。您试图应用公式
area=base*height/2
,但您在开始时没有基准或高度,并且计算不正确

虽然可以确定您的基础和高度计算,但我建议使用不同的(但数学上等效的)公式,更好地匹配您的数据。下面是一种方法,使用我找到的公式:

另一个选项是使用,因为您也在计算周长。为了有效地执行此操作,您需要在同一个函数中找到周长和面积,因此您只能计算一次边的长度:

def perimeter_and_area(p0, p1, p2):
    a = distance(p0, p1)
    b = distance(p1, p2)
    c = distance(p2, p0)

    perimeter = a+b+c

    s = perimeter / 2   # semiperimeter
    area = math.sqrt(s * (s-a) * (s-b) * (s-c))

    return perimeter, area

感谢您的帮助,耶利米:

分配工作代码
谢谢你的帮助,杰里米·哈夫特读了布尔克恩特的帖子(非常感谢)我不确定我的面积函数的准确性。将在我使用该公式后重新发布代码。我想我在不知不觉中做了很多苍鹭的事
p = perimeter(p1,p2,p3)
a = area(p1,p2,p3)
message = Text(Point(5, 0.5),"The perimeter is: {0:0.2f}".format(p))
message.draw(win)
message2 = Text(Point(5, 1),"The area is: {0:0.2f}".format(a))
def area(p0, p1, p2):                      # This code assumes points are tuples
    return abs((p0[0]*(p1[1]-p2[1]) +      # but the formula can work with any
                p1[0]*(p2[1]-p0[1]) +      # sort of point, just replace the
                p2[0]*(p0[1]-p1[1])) / 2)  # indexing with accessor calls.
def perimeter_and_area(p0, p1, p2):
    a = distance(p0, p1)
    b = distance(p1, p2)
    c = distance(p2, p0)

    perimeter = a+b+c

    s = perimeter / 2   # semiperimeter
    area = math.sqrt(s * (s-a) * (s-b) * (s-c))

    return perimeter, area
import math

from graphics import *

def square(x):
    return x * x

def distance(p1, p2):
    # calculate distance between two points
    dist = math.sqrt(square(p2.getX() - p1.getX()) + square(p2.getY() - p1.getY()))
    return dist

def perimeter(tri):
    # Calculate the perimeter of the triangle
    points = tri.getPoints()
    p1 = points[0]
    p2 = points[1]
    p3 = points[2]
    perim = distance(p1,p2) + distance(p2,p3) + distance(p3,p1)
    return perim 

 def area(tri):
    # Calculate the area of the triangle
    points = tri.getPoints()
    p1 = points[0]
    p2 = points[1]
    p3 = points[2]
    base = (distance(p3, p1) * (1 / 2))
    height = ((base) ** 2) - (distance(p1, p2) ** 2)
    h = math.sqrt(square(height))
    a = (1/2) * ((base) * (h))
    return a


def main():
    # Setup graphWin
    win = GraphWin("Draw a Triangle")
    win.setCoords(0.0, 0.0, 10.0, 10.0)
    message = Text(Point(5, 0.5), "Click on three points")
    message.draw(win)

    # Get and draw three vertices of triangle
    p1 = win.getMouse()
    p1.draw(win)
    p2 = win.getMouse()
    p2.draw(win)
    p3 = win.getMouse()
    p3.draw(win)

    # Use Polygon object to draw the triangle
    triangle = Polygon(p1,p2,p3)
    triangle.setFill("black")
    triangle.setOutline("blue")
    triangle.draw(win)
    p = perimeter(triangle)
    a = area(triangle)

    # write text to graphWin
    message2 = Text(Point(5, 1),"The perimeter is: {0:0.2f}".format(p))
    message2.draw(win)
    message3 = Text(Point(5, 2),"The area is: {0:0.2f}".format(a))
    message3.draw(win)
    message.setText("Click again to close")

    # Wait for another click to exit
    win.getMouse()
    win.close()

main()