1

所以我正在尝试使用递归函数构建一个简单的缩放立方体堆栈:

function stack(levels) = (
  levels <= 0
  ? cube([1,1,1], center=true)
  : union() {
    cube([1,1,1], center=true);
    translate([0, 0, 0.9]) scale([1, 1, 0.9]) stack(levels - 1);
  }
);

stack(5);

现在由于某种原因,我目前不明白 OpenSCAD 告诉我第 4 行出现语法错误,将编辑器标记为:

上述代码中突出显示的语法错误

可悲的是控制台只产生这个输出:

错误:第 4 行中的解析器错误:语法错误

错误:编译失败!

所以我很难弄清楚我到底做错了什么。我想有一种方法可以使用for,但我认为递归方法更具可读性。

我会尝试用模块来做到这一点,如果这不起作用,我可以求助于for与我想的模块结合使用 - 我更希望它能够工作并发现它非常易读。


更新:所以从OpenSCAD 用户手册我得到这个片段: OpenSCAD 模块和功能定义

我倾向于解释这一点,这样就不可能按照我想象的方式创建递归结构。

相反,我可以:

  • 使用辅助函数生成多维数据集参数并随后计算它们的并集。
  • for用循环重写结构。

我不确定我的信念是否正确,但理由是这样的:

  1. 我不能在函数中创建对象,因为那样会产生影响。
  2. 我不能递归地使用模块,因为它不返回结果,并且变量在 OpenSCAD 中的工作方式可能会干扰这个想法。
4

1 回答 1

3

您可以制作一个递归模块,唯一的问题是三元运算符采用值而不是对象:

module stack(levels) {
  if(levels) {
    cube([1,1,1], center=true);
    translate([0, 0, 0.9]) scale([1, 1, 0.9]) stack(levels-1);      
  } else {
    cube([1,1,1], center=true);
  }
}

stack(5);

这是另一个例子:https ://github.com/cashlo/OpenSCAN-Objects/blob/master/xmas-tree.scad

于 2018-12-20T13:21:07.327 回答