python3 中的苍鹭公式

Herons formula in python3

你好,我的苍鹭配方有问题,想知道你是否可以看一下。我知道我是个菜鸟。不过,非常感谢您花时间查看这段代码。我也会给你提示的。

import math


#Part 1
def vert(k,n):
 x = math.cos(2*math.pi*k/n)
 y = math.sin(2*math.pi*k/n)
 return(x, y)

#Part 2
def vertices(n):
 vertic = []
 for k in range(n):
  vertic.append(vert(k,n))
 return(vertic)

## return a list of tuples


##Part 3
def dist(p1, p2):
 distance =  math.sqrt((p2[0]-p1[0])**2 + (p2[1]- p1[1])**2)
 return distance




#Part 4
def perimeter(vertic):
 perimeter = 0
 z = len(vertic)
 for i in range(z):
     w = (i + 1) % z
     currentdistance = dist(vertic[i], vertic[w])
     perimeter += currentdistance
 return perimeter



#Part 5
def heron(p1, p2, p3):
    side1 = dist(p1,p2)
    side2 = dist(p2,p3)
    side3 = dist(p3,p1)
    s = (side1+side2+side3)/2
    a = math.sqrt(s*(s-side1)*(s-side2)*(s-side3))
    return a

        #Part 6  
def area(vertic):
 calcarea = 0
 z = len(vertic)     
 p1 = v[0]
 p2 = v[1]
 p3 = v[2]
 a = dist(p1,p2)
 b = dist(p2,p3)
 c = dist(p3,p1)
 s = (a+b+c)/2
 z = len(v)
 for i in range(z):
   calcarea += heron(p1,p2,p3)
   calcarea = ((s*(s-a)*(s-b)*(s-c)) ** 0.5)   
 return calcarea

##Main program

ntest = 3
v = vertices(ntest)
n = 3
actualperimeter = perimeter(v)
actualarea = area(v)
for n in range(n,1004,100):
    r = (actualperimeter,actualarea)
    newval= (actualperimeter*actualperimeter)/(4.0*actualarea)
    print(n, actualperimeter, actualarea, newval)

提示为:::

写一个函数 heron(p1, p2, p3) 来找到 具有给定顶点的三角形的面积。 (同样,p1、p2 和 p3 是表示 (x,y) 对的元组)

写一个函数 heron(p1, p2, p3) 来找到 具有给定顶点的三角形的面积。 (同样,p1、p2 和 p3 是表示 (x,y) 对的元组)

倒数第二部分 - 写一个函数 area(vertices(n)) 找到 给定其 n 个顶点列表的正三角形面积。

LAAST PART___write 生成的主程序 n = 3, 103, 203, ... 1003 的正多边形的顶点 对于每个多边形,查找并打印 n,周长,面积,周长**2/(4.0*面积)

我只是对超过 3 边形的多边形后的输出感到困惑,因为我们应该在循环中获得这些结果。

3 5.196152422706632 1.299038105676658 5.196152422706632
103 6.2822111395091325 3.139644590113289 3.1425672292376063
203 6.282934505126809 3.141091067504141 3.141843482675548
303 6.283072732486377 3.1413675078339525 3.1417052337290965
403 6.283121669116721 3.141465378624226 3.141656293393
503 6.283144457227955 3.1415109541646187 3.1416335042584804
603 6.283156882658976 3.1415358047799495 3.1416210784576846
703 6.283164394134183 3.141550827624372 3.1416135668230454
803 6.283169278529815 3.1415605963637927 3.141608682350027
903 6.28317263204446 3.1415673033654166 3.1416053287941073

my results are

3 5.196152422706632 1.299038105676658 5.196152422706632
103 5.196152422706632 1.299038105676658 5.196152422706632
203 5.196152422706632 1.299038105676658 5.196152422706632
303 5.196152422706632 1.299038105676658 5.196152422706632
403 5.196152422706632 1.299038105676658 5.196152422706632
503 5.196152422706632 1.299038105676658 5.196152422706632
603 5.196152422706632 1.299038105676658 5.196152422706632
703 5.196152422706632 1.299038105676658 5.196152422706632
803 5.196152422706632 1.299038105676658 5.196152422706632
903 5.196152422706632 1.299038105676658 5.196152422706632
1003 5.196152422706632 1.299038105676658 5.196152422706632

所以我知道区域内或我的苍鹭有问题。

感谢您的宝贵时间

您忘记在循环内重新计算顶点和值,因此使用了初始顶点列表而忽略了 n

只需更改循环体:

for n in range(3, 1004, 100):
    v = vertices(n)
    actualperimeter = perimeter(v)
    actualarea = area(v)
    r = (actualperimeter,actualarea)
    newval= (actualperimeter*actualperimeter)/(4.0*actualarea)
    print(n, actualperimeter, actualarea, newval)