问题是:创建一个类Shape
,将二维顶点列表作为输入。例如:
tri = Shape([[0,0],[0,1],[1,0]])
# or
sqr = Shape([[0,0],[0,1],[1,1], [1,0]])
该类应存储两个属性,顶点本身以self.verts
和顶点数以self.n
。然后类应该有一个方法calcSideLength()
,该方法采用介于 0 和形状边数之间的整数参数,并返回边的长度。例如形状:
tri = Shape([[0,0],[0,1],[1,0]])
有三面SIDE0: [0,0] --- [0,1]
SIDE1: [0,1] --- [1,0]
和SIDE2: [1,0] --- [0,0]
。
每条边的长度由欧几里得距离给出:
sqrt(( 1− ′1)^2+( 2− ′2)^2)
因此,三条边的长度将是 1、1.414 和 1。
然后创建一个新的类Triangle
它是Shape
的子类。它应该包括一个新的方法calculateArea()
返回三角形的面积。当然,这是 1/2× 小时×小时 .长度和高度是三角形较短的两条边。
这就是我得到的:
import math
class Shape:
def __init__(self, verts):
self.verts = verts
self.n = len(self.verts)
def calcSideLength(self,side):
if(0 <= side < self.n):
x1 = self.verts[side]
x2 = self.verts[side+1]
return math.sqrt((x1[0]-x2[0])**2 + (x1[1]-x2[1])**2)
class Triangle(Shape):
def __init__(self, verts):
Shape.__init__(self, verts)
def calculateArea(self):
side = []
for i in range(self.n):
side.append(self.calcSideLength(i))
side.sort()
area = 1/2 * side[1]* side[0]
return area
代码不起作用,我不知道出了什么问题,任何人都可以帮忙吗
首先,您不使用 CamelCase 而是snake_case来命名方法。在编写代码之前阅读 PEP8。
此外,您不必使用超级调用覆盖父母的初始化,因为它是多余的
第三,当你尝试计算最后一个边长时,你会遇到一个问题,因为你必须 x1 是最后一个顶点,x2 是第一个顶点(这个逻辑不会出现在你的代码中)
第四,你用1/2 * side * heigth
计算面积,但你的边都不代表高度,所以你必须使用苍鹭公式
S = sqrt(p * (p - a) * (p - b) * (p - c))
其中a, b, c
边长和边长p = (a + b + c) / 2
考虑到上述所有内容,您的代码必须如下所示
import math
class Shape:
def __init__(self, verts):
self.verts = verts
self.n = len(self.verts)
def calc_side_length(self, side):
if 0 <= side < self.n - 1:
x1 = self.verts[side]
x2 = self.verts[side + 1]
elif side == self.n - 1:
x1 = self.verts[side]
x2 = self.verts[0]
else:
raise
return math.sqrt((x1[0] - x2[0]) ** 2 + (x1[1] - x2[1]) ** 2)
class Triangle(Shape):
def calculate_area(self):
sides = []
for i in range(self.n):
sides.append(self.calc_side_length(i))
p = sum(sides) / 2 # p = (a + b + c) / 2
return math.sqrt(p * (p - sides[0]) * (p - sides[1]) * (p - sides[2]))