“类”中的简单任务我无法弄清楚

问题描述 投票:0回答:1

我对编码非常陌生,我需要一些关于这个简单代码的帮助。我似乎无法弄清楚,为什么这段代码没有为我的所有测试返回正确的值?我需要使用定义的方程来计算任何给定多边形的周长...

PS: 我需要使用某种 numpy,并且我相信 testinput 是一个数组,我无法追加等。如果可能的话,我通常更喜欢一些逻辑上更简单的解决方案来解决问题。谢谢:D

def get_perimeter(self):

    c_i_anden = 0
    xliste = list(self.x)
    yliste = list(self.y)
    xrolled = (np.roll(self.x,-1))
    yrolled = (np.roll(self.y,-1))
    for i in range(len(self.points)):
        c_i_anden += (xliste[i]-xrolled[i])**2+(yliste[i]-yrolled[i])**2
    c_i_anden = np.abs(c_i_anden)
    return math.sqrt(c_i_anden)

P = 多边形([(24, 12), (40, 16), (36, 8), (44, 4), (28, 0), (18, 4), (12, 0), (0 ,4), (8, 12), (4, 16)]) 打印(P.get_perimeter())

#应该是 118.87057243365838 但不是...-_-

python numpy loops class polygon
1个回答
0
投票

你不需要像“roll”这样的东西。只需运行一次列表,计算这一点和最后一点之间的差异。请注意,您不能取总和的开方;您必须对平方根求和。 sqrt(3+4+5) 与 sqrt(3)+sqrt(4)+sqrt(5) 有很大不同。

import math

class Polygon:
    def __init__(self, pts):
        self.x = [a[0] for a in pts]
        self.y = [a[1] for a in pts]

    def get_perimeter(self):
        x0 = self.x[-1]
        y0 = self.y[-1]
        perim = 0
        for x,y in zip(self.x,self.y):
            perim += math.sqrt((x-x0)**2 + (y-y0)**2)
            x0,y0 = x,y
        return perim

P = Polygon([(24, 12), (40, 16), (36, 8), (44, 4), (28, 0), (18, 4), (12, 0), (0,4), (8, 12), (4, 16)]) 
print(P.get_perimeter())

输出:

118.87057243365838
© www.soinside.com 2019 - 2024. All rights reserved.