【问题标题】:How to fix: This factory function only works once如何修复:这个工厂函数只工作一次
【发布时间】:2019-06-01 17:51:44
【问题描述】:

这个功能只能工作一次,然后不能再有人能告诉我我做错了什么吗?

from vpython import *
def create_cube(pos,size,front,back,left,right,bottom,top):
    c = [ pyramid(pos=pos-vector(0.5,0,0),size=size,color=left),
    pyramid(pos=pos+vector(0.5,0,0),size=size,color=right).rotate(angle=radians(180),axis=vector(0,1,0)),
    pyramid(pos=pos+vector(0,0,0.5),size=size,color=front).rotate(angle=radians(90),axis=vector(0,1,0)),
    pyramid(pos=pos-vector(0,0,0.5),size=size,color=back).rotate(angle=radians(270),axis=vector(0,1,0)),
    pyramid(pos=pos-vector(0,0.5,0),size=size,color=bottom).rotate(angle=radians(90),axis=vector(0,0,1)),
    pyramid(pos=pos+vector(0,0.5,0),size=size,color=top).rotate(angle=radians(270),axis=vector(0,0,1)),
    box(pos=pos,size = vector(0.9,0.9,0.9),color=color.black)]
    return compound(c)

topleftfrontcorner = create_cube(vector(-1,1,1),vector(0.5,0.90,0.90),color.red,color.black,color.blue,color.black,color.black,color.yellow)
topmiddlefrontside = create_cube(vector(0,0,0),vector(0.5,0.90,0.90),color.red,color.black,color.black,color.black,color.black,color.yellow)

我希望这个函数每次调用它时都会输出一个自定义的“立方体”,而不仅仅是一次。

【问题讨论】:

  • “只工作一次”是什么意思?确切的行为是什么?是否有任何错误消息或警告?
  • 预期行为是它在 i pos 所在的任何位置创建一个自定义多维数据集,但在第一次调用后它不会在第二次调用时输出另一个多维数据集。
  • 当我试图发布以下答案时,它被删除了,因为它“没有解决问题”。所以我再说一遍:金字塔的建造者是有缺陷的。它们的形式为 pyramid(...).rotate(...) 后跟“,axis=vector(0,1,0)”,这使得这些轴计算成为复合元素,您会收到错误,因为“ axis=vector(0,1,0" 不是 3D 对象。

标签: python vpython


【解决方案1】:

您应该返回c,并在topleftfrontcorner 和topmiddlefrontside 上使用compound:

from vpython import *
def create_cube(pos,size,front,back,left,right,bottom,top):
    c = [ pyramid(pos=pos-vector(0.5,0,0),size=size,color=left),
    pyramid(pos=pos+vector(0.5,0,0),size=size,color=right).rotate(angle=radians(180),axis=vector(0,1,0)),
    pyramid(pos=pos+vector(0,0,0.5),size=size,color=front).rotate(angle=radians(90),axis=vector(0,1,0)),
    pyramid(pos=pos-vector(0,0,0.5),size=size,color=back).rotate(angle=radians(270),axis=vector(0,1,0)),
    pyramid(pos=pos-vector(0,0.5,0),size=size,color=bottom).rotate(angle=radians(90),axis=vector(0,0,1)),
    pyramid(pos=pos+vector(0,0.5,0),size=size,color=top).rotate(angle=radians(270),axis=vector(0,0,1)),
    box(pos=pos,size = vector(0.9,0.9,0.9),color=color.black)]
    return c

topleftfrontcorner = create_cube(vector(-1,1,1),vector(0.5,0.90,0.90),color.red,color.black,color.blue,color.black,color.black,color.yellow)
topmiddlefrontside = create_cube(vector(0,0,0),vector(0.5,0.90,0.90),color.red,color.black,color.black,color.black,color.black,color.yellow)
compound(topleftfrontcorner, topmiddlefrontside)

这样做会给我:

也许更熟悉vpython 的人可以解释得更多,但总的来说,创建立方体和渲染立方体是有区别的。在 sn-p 中看不到两个立方体的原因是程序仍在渲染第一个立方体(阻塞操作),甚至还没有评估第二个函数调用。您可以通过在两个函数调用之间放置一个print("hello!") 来看到这种情况; "hello!" 永远不会被打印,因为程序仍在忙于渲染 topleftfrontcorner。

在更新的代码sn-p中,我们构造了两个立方体,然后同时渲染它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 2021-01-15
    相关资源
    最近更新 更多