更改实例变量后类函数不是最新的

2024-05-14 07:57:20 发布

您现在位置:Python中文网/ 问答频道 /正文

对不起,我的代码太长了。本作业处理三维平面上的矩形。该类从用户输入的centerX、centerY、centerZ、width、height和depth创建一个在xyz轴上有8个点的长方体。类中的另一个函数setCenter更改centerX、centerY和centerZ。在下面的示例中,box1.overlaps(box2)应该返回True。你知道吗

>box1 = Box(10.0, 5.0, 0.0, 2.0, 1.0, 1.0)
>
>box2 = Box(0, 0, 0, 3.5, 2.5, 1.0)
>
>box1.overlaps(box2)
>Out[4]: False
>
>box1.setCenter(2.75, 0.0, 0.0)
>
>box1.overlaps(box2)
>Out[6]: False

如果我用它被改变的中心来初始化这个框,它会返回True

>box1 = Box(2.75,0,0,2,1,1)
>
>box1.overlaps(box2)
>Out[10]: True

我怎样才能解决这个问题?这是因为我在使用实例变量,而我应该使用类变量吗?如果是的话,我怎么做?你知道吗

你知道吗编辑:更新为更改点仍然无法使其按预期工作

class Box:
    def __init__(self, centerX, centerY, centerZ, width, height, depth):
        self.prop = [centerX,centerY,centerZ,width,height,depth]
        self.topleft1 = [(centerX - (0.5*width)), 
            (centerY + (0.5*height)),
            (centerZ + (0.5*depth))]
        self.topright1 = [(centerX + (0.5*width)), 
            (centerY + (0.5*height)),
            (centerZ + (0.5*depth))]
        self.bottomleft1 = [(centerX - (0.5*width)), 
            (centerY - (0.5*height)),
            (centerZ + (0.5*depth))]
        self.bottomright1 = [(centerX + (0.5*width)), 
            (centerY - (0.5*height)),
            (centerZ + (0.5*depth))]
        self.topleft2 = [(centerX - (0.5*width)), 
            (centerY + (0.5*height)),
            (centerZ - (0.5*depth))]
        self.topright2 = [(centerX + (0.5*width)),
            (centerY + (0.5*height)),
            (centerZ - (0.5*depth))]
        self.bottomleft2 = [(centerX - (0.5*width)), 
        (centerY - (0.5*height)),
        (centerZ - (0.5*depth))]
        self.bottomright2 = [(centerX + (0.5*width)), 
                (centerY - (0.5*height)),
                (centerZ - (0.5*depth))]
        self.coord = [self.topleft1,self.topright1,self.bottomleft1,self.bottomright1,self.topleft2,
                  self.topright2,self.bottomleft2,self.bottomright2]
    def setCenter(self, x1, y1, z1):
        self.prop[0] = x1
        self.prop[1] = y1
        self.prop[2] = z1
        self.topleft1 = [(self.prop[0] - (0.5*self.prop[3])), 
        (self.prop[1] + (0.5*self.prop[4])),
        (self.prop[2] + (0.5*self.prop[5]))]
        self.topright1 = [(self.prop[0] + (0.5*self.prop[3])), 
        (self.prop[1] + (0.5*self.prop[4])),
        (self.prop[2] + (0.5*self.prop[5]))]
        self.bottomleft1 = [(self.prop[0] - (0.5*self.prop[3])), 
        (self.prop[1] - (0.5*self.prop[4])),
        (self.prop[2] + (0.5*self.prop[5]))]
        self.bottomright1 = [(self.prop[0] + (0.5*self.prop[3])), 
        (self.prop[1] - (0.5*self.prop[4])),
        (self.prop[2] + (0.5*self.prop[5]))]
        self.topleft2 = [(self.prop[0] - (0.5*self.prop[3])), 
        (self.prop[1] + (0.5*self.prop[4])),
        (self.prop[2] - (0.5*self.prop[5]))]
        self.topright2 = [(self.prop[0] + (0.5*self.prop[3])), 
        (self.prop[1] + (0.5*self.prop[4])),
        (self.prop[2] - (0.5*self.prop[5]))]
        self.bottomleft2 = [(self.prop[0] - (0.5*self.prop[3])), 
        (self.prop[1] - (0.5*self.prop[4])),
        (self.prop[2] - (0.5*self.prop[5]))]
        self.bottomright2 = [(self.prop[0] + (0.5*self.prop[3])), 
        (self.prop[1] - (0.5*self.prop[4])),
        (self.prop[2] - (0.5*self.prop[5]))]
    def setWidth(self, width):
        self.prop[3] = width
        self.topleft1 = [(self.prop[0] - (0.5*self.prop[3])), 
        (self.prop[1] + (0.5*self.prop[4])),
        (self.prop[2] + (0.5*self.prop[5]))]
        self.topright1 = [(self.prop[0] + (0.5*self.prop[3])), 
        (self.prop[1] + (0.5*self.prop[4])),
        (self.prop[2] + (0.5*self.prop[5]))]
        self.bottomleft1 = [(self.prop[0] - (0.5*self.prop[3])), 
        (self.prop[1] - (0.5*self.prop[4])),
        (self.prop[2] + (0.5*self.prop[5]))]
        self.bottomright1 = [(self.prop[0] + (0.5*self.prop[3])), 
        (self.prop[1] - (0.5*self.prop[4])),
        (self.prop[2] + (0.5*self.prop[5]))]
        self.topleft2 = [(self.prop[0] - (0.5*self.prop[3])), 
        (self.prop[1] + (0.5*self.prop[4])),
        (self.prop[2] - (0.5*self.prop[5]))]
        self.topright2 = [(self.prop[0] + (0.5*self.prop[3])), 
        (self.prop[1] + (0.5*self.prop[4])),
        (self.prop[2] - (0.5*self.prop[5]))]
        self.bottomleft2 = [(self.prop[0] - (0.5*self.prop[3])), 
        (self.prop[1] - (0.5*self.prop[4])),
        (self.prop[2] - (0.5*self.prop[5]))]
        self.bottomright2 = [(self.prop[0] + (0.5*self.prop[3])), 
        (self.prop[1] - (0.5*self.prop[4])),
        (self.prop[2] - (0.5*self.prop[5]))]
    def setHeight(self, height):
        self.prop[4] = height
        self.topleft1 = [(self.prop[0] - (0.5*self.prop[3])), 
        (self.prop[1] + (0.5*self.prop[4])),
        (self.prop[2] + (0.5*self.prop[5]))]
        self.topright1 = [(self.prop[0] + (0.5*self.prop[3])), 
        (self.prop[1] + (0.5*self.prop[4])),
        (self.prop[2] + (0.5*self.prop[5]))]
        self.bottomleft1 = [(self.prop[0] - (0.5*self.prop[3])), 
        (self.prop[1] - (0.5*self.prop[4])),
        (self.prop[2] + (0.5*self.prop[5]))]
        self.bottomright1 = [(self.prop[0] + (0.5*self.prop[3])), 
        (self.prop[1] - (0.5*self.prop[4])),
        (self.prop[2] + (0.5*self.prop[5]))]
        self.topleft2 = [(self.prop[0] - (0.5*self.prop[3])), 
        (self.prop[1] + (0.5*self.prop[4])),
        (self.prop[2] - (0.5*self.prop[5]))]
        self.topright2 = [(self.prop[0] + (0.5*self.prop[3])), 
        (self.prop[1] + (0.5*self.prop[4])),
        (self.prop[2] - (0.5*self.prop[5]))]
        self.bottomleft2 = [(self.prop[0] - (0.5*self.prop[3])), 
        (self.prop[1] - (0.5*self.prop[4])),
        (self.prop[2] - (0.5*self.prop[5]))]
        self.bottomright2 = [(self.prop[0] + (0.5*self.prop[3])), 
        (self.prop[1] - (0.5*self.prop[4])),
        (self.prop[2] - (0.5*self.prop[5]))]
    def setDepth(self, depth):
        self.prop[5] = depth
        self.topleft1 = [(self.prop[0] - (0.5*self.prop[3])), 
        (self.prop[1] + (0.5*self.prop[4])),
        (self.prop[2] + (0.5*self.prop[5]))]
        self.topright1 = [(self.prop[0] + (0.5*self.prop[3])), 
        (self.prop[1] + (0.5*self.prop[4])),
        (self.prop[2] + (0.5*self.prop[5]))]
        self.bottomleft1 = [(self.prop[0] - (0.5*self.prop[3])), 
        (self.prop[1] - (0.5*self.prop[4])),
        (self.prop[2] + (0.5*self.prop[5]))]
        self.bottomright1 = [(self.prop[0] + (0.5*self.prop[3])), 
        (self.prop[1] - (0.5*self.prop[4])),
        (self.prop[2] + (0.5*self.prop[5]))]
        self.topleft2 = [(self.prop[0] - (0.5*self.prop[3])), 
        (self.prop[1] + (0.5*self.prop[4])),
        (self.prop[2] - (0.5*self.prop[5]))]
        self.topright2 = [(self.prop[0] + (0.5*self.prop[3])), 
        (self.prop[1] + (0.5*self.prop[4])),
        (self.prop[2] - (0.5*self.prop[5]))]
        self.bottomleft2 = [(self.prop[0] - (0.5*self.prop[3])), 
        (self.prop[1] - (0.5*self.prop[4])),
        (self.prop[2] - (0.5*self.prop[5]))]
        self.bottomright2 = [(self.prop[0] + (0.5*self.prop[3])), 
        (self.prop[1] - (0.5*self.prop[4])),
        (self.prop[2] - (0.5*self.prop[5]))]
    def volume(self):
        return (self.prop[3]*self.prop[4]*self.prop[5])
    def surfaceArea(self):
        return (self.prop[3]*self.prop[4])*2+(self.prop[3]*self.prop[5])*2+(self.prop[4]*self.prop[5])*2
    def insideOf(self, point):
        if all([point[0]>=self.topleft1[0],point[0]<=self.topright1[0],point[1]>=self.bottomleft1[1],point[1]<=self.topleft1[1],point[2]>=self.topleft2[2],point[2]<=self.topleft1[2]]):
            return True
        else:
            return False
    def overlaps(self, otherBox):
        result = False
        for i in otherBox.coord:
            if self.insideOf(i) == True:
                result = True
        for i in self.coord:
            if otherBox.insideOf(i) == True:
                result = True
        return result
    def contains(self, otherBox):
        if self.insideOf(otherBox.topleft1) and self.insideOf(otherBox.bottomright1) and self.insideOf(otherBox.topleft2) and self.insideOf(otherBox.bottomright2) == True:
            return True
        else:
            return False
    def __repr__(self):
        if self.prop[3] == int(self.prop[3]):
            self.x = int(self.prop[3])
        else:
            self.x = self.prop[3]
        if self.prop[4] == int(self.prop[4]):
            self.y = int(self.prop[4])
        else:
            self.y = self.prop[4]
        if self.prop[5] == int(self.prop[5]):
            self.z = int(self.prop[5])
        else:
            self.z = self.prop[5]
        self.dimensions = str(self.x)+'-by-'+str(self.y)+'-by-'+str(self.z)
        if self.prop[5] == 0:
            self.D = ' 2D'
        else:
            self.D = ' 3D'
            self.center = '('+str(self.prop[0])+','+str(self.prop[1])+','+str(self.prop[2])+')'

        return '< '+self.dimensions+self.D+' box with center at '+self.center+' >'

Tags: selftruereturnifdefwidthheightdepth
1条回答
网友
1楼 · 发布于 2024-05-14 07:57:20

问题出在setCenter()方法上。在它中,您正在更新框的中心,但不更新topleft1、topright1、bottomleft1等

更改setCenter()方法以同时更新这些属性,它应该可以工作。(您还必须将此更改添加到其他setX方法中。您应该将这些计算抽象到它们自己的私有方法中,并在每个setX方法的末尾调用它)。你知道吗

相关问题 更多 >

    热门问题