惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recorded Future
Recorded Future
小众软件
小众软件
C
Check Point Blog
MyScale Blog
MyScale Blog
V
Visual Studio Blog
博客园_首页
J
Java Code Geeks
人人都是产品经理
人人都是产品经理
腾讯CDC
云风的 BLOG
云风的 BLOG
爱范儿
爱范儿
量子位
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
博客园 - 叶小钗
H
Help Net Security
T
The Blog of Author Tim Ferriss
月光博客
月光博客
博客园 - 三生石上(FineUI控件)
P
Proofpoint News Feed
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
WordPress大学
WordPress大学
美团技术团队
有赞技术团队
有赞技术团队
Microsoft Azure Blog
Microsoft Azure Blog
IT之家
IT之家
M
MIT News - Artificial intelligence
S
Secure Thoughts
U
Unit 42
Google Online Security Blog
Google Online Security Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Recent Announcements
Recent Announcements
F
Full Disclosure
The GitHub Blog
The GitHub Blog
V2EX - 技术
V2EX - 技术
D
DataBreaches.Net
Webroot Blog
Webroot Blog
Y
Y Combinator Blog
The Last Watchdog
The Last Watchdog
aimingoo的专栏
aimingoo的专栏
W
WeLiveSecurity
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
Martin Fowler
Martin Fowler
阮一峰的网络日志
阮一峰的网络日志
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
V
V2EX
T
Tailwind CSS Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog

博客园 - 我才是银古

第16章:常见问题、排错与最佳实践 第15章:扩展生态、MCAD 与外部集成 第12章:实战案例:机械结构与 3D 打印零件 第14章:构建、测试、调试与贡献流程 第13章:OpenSCAD 源码架构与核心执行流程 第11章:预览、渲染、网格精度与性能优化 第08章:参数化零件库与复用设计 第10章:导入导出、命令行与自动化 第06章:CSG 布尔建模方法 第07章:二维图形、拉伸、旋转与投影 第05章:基础几何、坐标系与变换 第04章:参数、变量、函数、模块与作用域 OpenSCAD 教程目录 第03章:OpenSCAD 语言基础 第02章:安装、环境配置与开发工作流 第01章:OpenSCAD 项目全景与学习路线 第02章:源码获取、编译与开发环境配置 第01章:OCCT项目全景与学习路线 第18章:二次开发实战与综合案例 第17章:与 Qt VTK Python pythonOCC 生态集成 第18章:综合实战案例 第17章:数据交换与协同 第16章:源码架构与二次开发 第15章:插件与自定义工作台开发 第14章:Python脚本宏与自动化 第13章:FEM仿真分析 第12章:CAM数控加工 第11章:SurfaceMesh与逆向工程 第10章:Draft二维绘图与BIM建筑 第09章:工程图TechDraw 第07章:参数化表达式与Spreadsheet 第08章:装配设计Assembly 第06章:Part工作台与几何内核 第05章:PartDesign实体特征建模 第04章:草图Sketcher约束建模 第02章:安装版本与工作环境配置 第03章:界面工作台与基础操作 第01章:项目全景与学习路线 第十二章:插件开发、研究功能与最佳实践 第十章:定时任务与自动化(Cron) 第七章:技能、记忆与自学习闭环 第八章:MCP 集成与上下文文件 第六章:工具系统与终端后端 第五章:模型供应商与配置体系 Hermes Agent 教程目录 第十一章:语音、视觉、浏览器与子代理协作 第四章:CLI/TUI 与会话管理 第十二章:学习路线、实战方案与最佳实践 第十一章:源码结构、开发调试与插件开发 第十章:自动化、远程访问、日志与排障 第九章:Control UI、节点、Canvas 与语音能力 第七章:工具、技能、插件与能力扩展 第八章:安全模型、访问控制与沙箱实践 第六章:Agent 工作区、会话与多智能体路由 第五章:多通道消息接入与聊天平台配置 第四章:配置体系、模型接入与认证管理 第三章:Gateway 架构、协议与运行机制 第二章:安装、环境准备与快速上手 第一章:OpenClaw 项目概览与核心定位 oh-my-openagent 教程目录 09-命令模型回退与配置参考 10-实战案例最佳实践与故障排除 05-工作模式-Ultrawork-Prometheus-Atlas 08-Hooks与MCP系统 06-Category与Skill系统 07-核心工具链 04-智能体全景详解 03-安装与环境配置 02-整体架构与多模型编排机制 01-项目简介与核心理念 01-项目概览与学习路线 02-安装部署与工具适配 03-Skill机制与using-superpowers 05-TDD系统化调试与完成前验证 04-需求澄清方案设计与计划编写 07-并行智能体子智能体与Git-Worktree 第六章:代码审查、反馈处理与分支收尾 08-中国特色Skills与本土团队落地 09-MCP构建工作流执行与自定义Skill 第23章:FreeCAD-Python-API Clipper2 C# 源码解读教程 第19章:PolyTree 多边形树结构 第20章:实际应用与最佳实践 第18章:Minkowski 和与差 第17章:RectClip 矩形裁剪优化 第16章:ClipperOffset 偏移类详解 第15章:填充规则详解 第14章:布尔运算执行流程 第13章:ClipperD 浮点裁剪类 第11章:OutRec 与 OutPt 输出结构 第9章:Active 活动边结构 第10章:Vertex 顶点与 LocalMinima 局部极小值 第12章:Clipper64 裁剪类详解 第7章:高精度运算与128位整数 第8章:ClipperBase 基类详解 第5章:枚举类型与常量定义 第6章:InternalClipper 内部工具类 第2章:核心数据结构 - Point64、PointD 第3章:路径与多边形表示 - Path64、PathD、Paths64、PathsD 第4章:矩形边界 - Rect64、RectD
第09章:列表推导、递归与算法建模
我才是银古 · 2026-05-06 · via 博客园 - 我才是银古

第09章:列表推导、递归与算法建模

1. 算法建模的意义

OpenSCAD 不只是把基本体拼起来。它也可以通过列表推导、函数、递归和数学公式生成复杂结构,例如齿轮、晶格、螺旋、蜂窝、曲线路径、参数化孔阵列和装饰纹理。算法建模的优势是可控、可复现、可批量生成。

2. 范围与循环

for (i = [0:5])
    translate([i * 10, 0, 0]) cube(5, center = true);

for (a = [0:30:330])
    rotate(a) translate([30, 0, 0]) cylinder(h = 4, d = 3, center = true);

范围 [start:step:end] 非常适合角度、索引和阵列。应避免让步长产生过多对象,尤其是在每个对象都包含高面数曲面时。

3. 列表推导

points = [for (a = [0:45:315]) [20*cos(a), 20*sin(a)]];
polygon(points);

列表推导适合生成点集、孔位、尺寸表和选择结果。结合函数可以让几何生成非常清晰。

4. let 表达式

let 可在表达式内定义局部变量:

function ring_point(r, a) = let(x = r*cos(a), y = r*sin(a)) [x, y];

它有助于把复杂公式拆成可读片段。

5. 递归函数

OpenSCAD 支持递归函数,可用于累加、生成序列和树形结构:

function sum(v, i = 0) = i >= len(v) ? 0 : v[i] + sum(v, i + 1);
echo(sum([1,2,3,4]));

递归要注意深度和性能。对于简单列表,优先使用内置函数或列表推导;递归适合表达无法直接循环返回的结构。

6. 螺旋点列

function helix_point(r, pitch, a) = [r*cos(a), r*sin(a), pitch*a/360];
points = [for (a = [0:10:720]) helix_point(20, 5, a)];

for (p = points)
    translate(p) sphere(1.2, $fn = 12);

这只是点列示意。若要生成真实螺旋实体,需要沿路径扫掠或用多面体构造,复杂度更高。

7. 蜂窝结构

module hex_cell(r = 5, h = 3) {
    cylinder(h = h, r = r, $fn = 6, center = true);
}

module honeycomb(rows = 5, cols = 8, r = 5, wall = 1, h = 3) {
    spacing_x = r * sqrt(3);
    spacing_y = r * 1.5;
    difference() {
        cube([cols*spacing_x, rows*spacing_y, h], center = true);
        for (row = [0:rows-1])
            for (col = [0:cols-1])
                translate([(col-(cols-1)/2)*spacing_x + (row%2)*spacing_x/2,
                           (row-(rows-1)/2)*spacing_y, 0])
                    hex_cell(r = r-wall, h = h+1);
    }
}

honeycomb();

蜂窝结构需要考虑最小壁厚、桥接、清理难度和强度方向。

8. 齿形思路

齿轮建模可从极坐标生成齿顶和齿根点开始。真实渐开线齿轮较复杂,应优先使用成熟库;教学时可用简化齿形理解算法建模。

function tooth_points(teeth, r1, r2) = [
    for (i = [0:teeth-1])
        each [
            [r1*cos(i*360/teeth), r1*sin(i*360/teeth)],
            [r2*cos((i+0.5)*360/teeth), r2*sin((i+0.5)*360/teeth)]
        ]
];

linear_extrude(5)
    polygon(tooth_points(16, 18, 22));

9. 随机与确定性

OpenSCAD 有随机相关函数时,应注意种子和可复现性。工程模型应尽量确定,艺术纹理可以使用随机扰动,但要能通过固定种子复现。

10. 性能边界

算法生成最容易导致对象数量爆炸。优化原则:

  • 限制循环层级和对象数量。
  • 低精度预览,高精度导出。
  • 把重复复杂几何简化为二维拉伸或 hull。
  • 不要在大阵列中使用高 $fn 球体。
  • 将调试对象和最终对象分开。
  • 必要时拆分零件导出。

11. 算法建模检查清单

  • 参数变化后是否仍生成合法几何?
  • 点列是否闭合、顺序是否一致?
  • 循环数量是否可控?
  • 是否可以用二维计算替代三维布尔?
  • 是否需要成熟库而不是自写复杂标准件?
  • 是否在代码中说明数学公式的来源和限制?