news 2026/10/28 14:15:11

多棱锥展开图计算与纸模落地:从斜高到钣金参数化出图

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
多棱锥展开图计算与纸模落地:从斜高到钣金参数化出图

做多棱锥纸模这事情,说起来就几个字——几个三角形加一个底面,剪下来折上去粘住就行。可真动手做第一个的时候,十有八九会卡在同一处:展开图上量出来的那条"三角形的高",跟棱锥本身的高压根不是一回事。照着棱锥的高去画侧面,做出来的成品要么顶角合不拢,要么侧面往外鼓、底面翘成薯片。问题不在手笨,在于从立体退到平面这一步,有几个量在脑子里被混成同一个了。

这篇写的是多棱锥展开图怎么算、纸模怎么落地、以及同一张展开图在钣金、屋面、包装、吸音造型这些地方是怎么被用起来的。零基础也能跟着做,手里有 CAD 或者会一点脚本的,后半段有参数化出图的路子可以直接抄。我自己做过几轮三棱、四棱、六棱的纸模,也拿同样的几何去核对过钣金下料,踩过的坑基本都在下面。

1. 展开图摊开的到底是什么

1.1 展开不是投影,是沿棱剪开摊平

很多人第一反应是把棱锥"压扁",觉得压扁之后看到的就是展开图。这是错的。压扁是正投影,投影里的侧面会变形、会互相遮挡,边长根本不保真。展开图的定义是:沿着若干条棱把表面剪开,让每个面绕着自己剩下的那条棱旋转,直到全部躺进同一个平面,旋转过程中每个面自身的形状和大小完全不变。用生活里的话说,是"把纸盒拆开铺平",不是"从上面看纸盒"。

这个定义带来一个直接结论:展开图上的每一段长度,都等于立体上对应那条线段的真实长度。侧面三角形的两条腰,就是棱锥的侧棱;侧面三角形的底边,就是底面多边形的边长;而侧面三角形从顶点到底边中点的那条高,是侧面这个等腰三角形自身的高。这三条线在展开图上都能量,量出来就是真值,不用做任何投影修正。真正需要算的,是这些长度怎么从棱锥的两个已知条件(底面边长、棱锥高度)推出来。

1.2 斜高,才是画在展开图上的那条高

这是最容易翻车的一个点,值得单独拎出来说。棱锥的"高",是顶点到底面的垂直距离,方向垂直于底面,是一个实打实的立体量,通常记作 h。而侧面三角形的高,是从顶点到底边中点的距离,这条线躺在侧面这个平面里,业内一般叫斜高,记作 m。两者只有在一种极端情况下相等——侧面完全垂直于底面,也就是棱锥退化成棱柱的时候。其余情况,斜高永远大于棱锥的高。

为什么?把顶点、底面中心、底面某条边的中点这三个点连起来,得到一个直角三角形:竖直的直角边是 h,水平的直角边是底面中心到这条边的距离(也就是底面多边形的内切圆半径 r),斜边就是 m。所以

m = √(h² + r²)

拿四棱锥举例,底面正方形边长 a = 100 mm,高 h = 100 mm。底面内切圆半径 r = a/2 = 50 mm,于是 m = √(100² + 50²) = 111.80 mm。你要是拿 100 mm 去画侧面的高,做出来的锥体会明显比设计的高瘦,顶部合不拢,因为每个三角形的顶角被画小了。

同一套三角形还能算出侧棱长 l,用的是顶点、底面中心、底面顶点构成的另一个直角三角形:

l = √(h² + R²)

其中 R 是底面多边形的外接圆半径。还是这个四棱锥,R = a/√2 = 70.71 mm,l = √(100² + 70.71²) = 122.47 mm。这个数在展开图上是三角形两条腰的长度,画图时直接当半径用。

1.3 顶角处的缺口角,暴露了平面和立体的差别

把 n 个侧面三角形以顶点为中心、首尾相接排开,每个三角形的顶角是 α,那么顶点周围被占掉的角度是 nα。这个和永远小于 360°。这个差值,就是展开图在顶点处留下的那块"缺口"。

缺口不是画错了,恰恰相反,它是立体存在的证据。一个顶点周围角度和等于 360° 的形状,是平的;要变成立体的角,就必须"少掉"一块角度,少掉的那部分,正是这个顶点在三维里被"吃掉"的曲率。底面边数越多、锥体越矮,缺口越小;锥体越尖,缺口越大。四棱锥 a=100、h=100 的例子,侧面顶角 α = 2·arcsin(a/(2l)) = 2·arcsin(50/122.47) = 48.19°,四个加起来 192.76°,缺口 167.24°,快一半了。这意味着这个锥其实相当"尖",侧面几乎要立起来。

理解缺口还有一个实用价值:它决定了顶点处的粘接难度。缺口大,说明相邻两个侧面在顶点附近的夹角小,粘接翼片如果做成矩形,在顶点处会严重堆料、互相顶住,成品顶部必然鼓起一个疙瘩。后面讲翼片形状时会具体说怎么处理。

2. 动笔前必须锁定的几个量

2.1 从底面边长推出两个半径

底面是正 n 边形,只给一个边长 a 是不够的,画展开图必须同时知道外接圆半径 R 和内切圆半径 r。这两个量决定了侧棱和斜高,一步错,后面全错。

R = a / (2·sin(π/n))r = a / (2·tan(π/n))

推导不复杂:正 n 边形可以切成 n 个等腰三角形,每个的顶角是 2π/n,腰是 R,底是 a。用正弦定理和半角关系就能得到上面两式。实际使用时不用每次推,记住几个常用值更快:正三角形的 R = a/√3 ≈ 0.5774a,r = a/(2√3) ≈ 0.2887a;正方形 R = 0.7071a,r = 0.5a;正六边形 R = a,r = 0.8660a。正六边形那个"外接圆半径等于边长"的性质,是六棱锥纸模特别适合新手练手的原因之一,算起来几乎不出错。

顺带说一个直觉:n 越大,R 和 r 越接近,底面越"圆"。当 n 趋于无穷,两者都收敛到 a·n/(2π),也就是底面圆周长除以 2π 的那个半径。所以高棱锥(n 很大)在工程上经常直接用圆锥的扇形展开来近似,误差可以控制在很小的范围。但纸模这种小尺寸、手工粘接的场景,n=6 到 n=8 就别近似了,老老实实按多边形算,否则最后一条棱会差出半毫米,粘的时候难受。

2.2 侧面顶角决定排布是否拥挤

侧面顶角 α 的算法有两个等价路径,用哪个取决于你手上有什么数据。

已知侧棱 l 和底边 a:α = 2·arcsin(a / (2l))已知斜高 m 和底边 a:α = 2·arctan(a / (2m))

两条路算出来结果一样,因为 l、m、a/2 构成直角三角形。实际画图时我更常用第二个,因为斜高 m 本来就要算,顺手就用了。

α 这个值的大小,直接关系到展开图的排布能不能"平铺"。当 nα 接近 360° 时,n 个三角形几乎能拼成一个完整的圆盘,排布非常紧凑,出图省纸;当 nα 只有 150°、180° 时,三角形之间张得很开,展开图会占很大一块面积,A4 纸可能放不下一个大尺寸的六棱锥。这是很多人在打印阶段才发现的问题——图上算得好好的,一打印发现超边了。所以在定尺寸之前,先粗略估一下 nα,心里有个数。

2.3 一张速查表,三种常见棱锥

光看公式容易飘,直接上数。下面三种都是纸模里最常做的规格,参数取整方便手算,可以直接拿去用。

参数正三棱锥正四棱锥正六棱锥
底面边长 a100 mm100 mm50 mm
棱锥高 h150 mm100 mm80 mm
底面外接圆半径 R57.74 mm70.71 mm50.00 mm
底面内切圆半径 r28.87 mm50.00 mm43.30 mm
斜高 m152.75 mm111.80 mm90.96 mm
侧棱 l160.73 mm122.47 mm94.34 mm
侧面顶角 α36.26°48.19°30.74°
nα 之和108.78°192.76°184.44°
侧面积22913 mm²22361 mm²13644 mm²

侧面积那一栏用的是统一公式:侧面积 = 底面周长 × 斜高 ÷ 2。这个公式对任意正棱锥都成立,和圆锥的侧面积公式形式一致,因为它就是把每个侧面三角形的面积 a·m/2 乘以 n 得到的。做屋面估算、钣金备料的时候,这一栏就是你的用量基数。

表格里还藏着一个值得注意的现象:三棱锥和六棱锥的 nα 都在 110° 到 190° 之间,而四棱锥反而最大。原因不在 n,在"高径比"。三棱锥那个例子的 h/a = 1.5,非常瘦高,所以缺口大;六棱锥 h/a = 1.6,也瘦。四棱锥 h/a = 1.0,相对矮胖,缺口其实不算极端。所以判断"尖不尖",不能只看边数,要看 h 和 r 的比值。

3. 排布方式,比计算更容易决定成败

3.1 十字排布和扇形排布,选哪个

同样一套面,摆在纸上有两种主流排法,做出来的东西手感完全不同。

十字排布是把底面多边形放在正中,n 个侧面三角形分别贴在它的 n 条边上,整个图形像一朵花或者一个十字。优点是直观,一眼就能看懂哪块是哪块,剪下来之后底面天然居中,粘的时候不容易歪。缺点是所有相邻的侧面之间都没有共享边,n 条侧棱全部需要粘接,粘缝多、受力点分散,做小尺寸还好,做大尺寸(边长超过 150 mm)的时候,顶部那个点要同时收拢 n 条缝,很容易出现一条缝对不齐、整圈跟着扭的情况。

扇形排布是把 n 个三角形以顶点为中心依次排开,连成一条"扇子",底面多边形只贴在其中一个三角形的底边上。这样 n-1 条侧棱是共享边,根本不用粘,只需要粘 1 条侧棱加上底面的 n-1 条边。粘缝数量从 2n-1 条降到 n 条,结构强度明显更好,顶角也只需要对准一个位置。

代价是扇形排布更费纸,因为三角形张开的面积大,而且图形不规则,裁切时边角料多。另外,底面贴在边上之后,整个图形变得很长,A4 竖版基本放不下大尺寸的。

我自己的取舍习惯是:底面边长 80 mm 以下用十字,80 mm 以上用扇形。小模型粘缝多点无所谓,剪裁方便更重要;大模型强度优先,宁可多费半张纸。还有一个折中方案,把扇形从中间断开成两条"半扇",分别排布,粘接时再接上,牺牲一条缝换取更好的排布利用率,做超大尺寸(边长 300 mm 以上)的展示模型时可以用。

3.2 翼片不是随便画个矩形就行

粘接翼片(也有叫粘接边、粘接舌片的)是展开图上额外长出来的一圈窄条,宽度一般 5 到 8 mm。它看起来是附属品,实际上对成品质量影响极大,尤其是靠近顶点的那一端。

最省事的做法是沿需要粘接的棱画一条等宽矩形。这个做法在小尺寸、钝角(侧面顶角大)的模型上勉强能用,但对尖锥体一定出问题。原因在前面提过:顶点周围角度不够,几条棱挤在一起,矩形翼片在顶点附近会互相重叠,纸有多厚就叠多厚,最后顶上是硬邦邦一坨,怎么压都压不平。

正确的做法是把翼片做成梯形,靠底边那端保持 6 到 8 mm 全宽,靠顶点那端收窄到 2 mm 左右,斜边与相邻的棱留出 1 到 2 mm 的间隙。这样在顶点收拢时,几条翼片是并排靠在一起而不是叠在一起,粘完之后顶部是一个相对干净的角。

还有一个细节容易被忽略:翼片如果贴在三角形的腰上(也就是侧棱位置),它会跟着侧面一起弯折,折叠的时候翼片本身也要折一道,等于多了一层厚度。更聪明的做法是尽量把翼片安排在底边上,让底面多边形多长出几条边来提供粘接面,这样折起来时翼片是平的,不参与侧面的弯折,粘出来更服帖。扇形排布天然适合这个思路——底面多边形的 n-1 条边全部做成翼片,侧棱那边一条缝用胶带或者窄条补强就够。

3.3 剪开哪条棱,是有讲究的

展开图必须剪开至少一条棱(扇形排布)或者全部侧棱(十字排布),剪在哪条上,成品的"伤疤"就在哪条上。

原则只有一条:把粘缝放在最不显眼的位置。做灯罩、摆件这类需要展示的东西,粘缝放在背面或者被遮挡的那一面;做教学模型,粘缝反而可以放在正面,因为它能直观展示"这条棱是接起来的",讲课时有讲解价值。做钣金件时这条规则更硬,因为钣金焊接或咬合之后会有明显痕迹,必须避开外露的装饰面,通常选择在阴角或者被其他构件覆盖的位置。

另外,剪开的那条棱会成为整个模型的"合拢缝",它决定了最后的收口难度。如果这条棱特别长(瘦高的锥体),合拢时两片纸容易错位,建议在剪开之前,先在这条棱的两侧各标一个对齐记号(比如中点位置打一个小点),合拢时对准记号再涂胶,比凭眼力对齐靠谱得多。

4. 从平面到立体,手上那几步

4.1 纸张克重,选错就白干

纸太薄,折起来棱线软塌,粘完站不住;纸太厚,压痕压不透,折的时候纸面起毛甚至断裂,翼片也贴不牢。下面这个对应关系是我试下来比较稳的区间,供参考。

成品尺寸(底边 a)建议克重说明
30–60 mm120–160 g小件,太厚反而折不动
60–120 mm180–230 g最常用的区间,成型和操作平衡
120–250 mm250–300 g需要支撑力,压痕必须用硬工具
250 mm 以上300 g 以上或加内衬单靠纸会塌,建议内部加骨架

除了克重,纸的纤维方向也要留意。卡纸通常有一个"顺纹"方向,顺着纹路折,折痕干净利落;逆着纹路折,折痕容易毛糙、开裂。判断方法很简单,撕一小条纸,顺着撕裂方向平直的是顺纹,撕裂边缘起毛、走偏的是逆纹。如果展开图上的主要折线方向一致,尽量让那条方向跟顺纹对齐。这一点在批量做的时候差别特别明显,做十个八个可能感觉不到,做几十个就受不了了。

纸的表面处理也有讲究。哑光卡纸比铜版纸更适合做纸模,因为铜版纸表面有涂层,胶水渗透不进去,粘接强度差,而且折痕处涂层容易开裂露白。喷墨打印的话,选专门的"喷墨卡纸",普通卡纸吸墨后会轻微起皱,展开图上的直线会变成波浪线,量尺寸就不准了。

4.2 压痕,决定棱线锐不锐

这一步是纯手工纸模和"看着像那么回事"的分水岭。不压痕直接折,纸会沿着纤维最弱的地方自己找一条路,那条路通常不在你画的线上,偏个一两毫米是常事,几条棱累积下来,顶角就歪了。

压痕的工具不用买,一支写不出水的圆珠笔、一根钝头骨笔、甚至一把圆头指甲锉都能用。关键是压痕的位置:压痕要压在折角的外侧,也就是折起来之后被拉伸的那一面。

具体到棱锥纸模,如果展开图打印的是外表面(大多数人的做法),那么侧棱处的折痕从外面看是凸起的脊,属于山折,纸是被"拉开"的,压痕应该做在背面;底边处的折痕从外面看是凹进去的角,属于谷折,压痕做在正面。搞反了会怎样?折出来的棱线会变成圆的,不是一条锐利的直线,视觉上一下子就露怯了。

压痕的力度也要控制。太轻没效果,太重会把纸压出明显的凹槽甚至压穿表面,折起来之后棱线处出现白色裂纹。合适的力度大概是:纸背面能看到一条浅浅的压沟,正面完全看不出痕迹。300 g 以上的卡纸,建议先用废料试压两三道,找到手感再上正式件。

4.3 折的顺序和粘的顺序,反了就麻烦

折的时候,先把所有的折痕都预折一遍,正反各折一次,让纸"记住"位置,再开始正式折叠。预折的好处是纸的回弹力被提前释放,正式折的时候不会一边折一边翘。

粘接顺序,扇形排布和十字排布不一样。

扇形排布:先沿所有侧棱折起,把 n 个三角形围成一圈,用首尾那条棱上的翼片粘合,形成一个没有底的"锥裙";然后把底面多边形的翼片逐条折起,从对面开始往回收,最后合拢到第一条边上。这个顺序的好处是,锥裙成型的阶段底面是自由的,手可以伸进去从内侧压平每条缝。

十字排布:先把 n 个侧面全部向上折起到位,然后依次把相邻的侧棱两两粘合。粘的时候不要一次涂满整条边,先在对齐记号处点一点胶固定,确认两边对正了,再从中点向两端分段补胶。整条边一次涂胶的后果是,胶水没干之前纸会滑动,等你发现歪了,胶已经把位置锁死了。

胶水的选择,白乳胶(木工胶)比胶棒好用得多。胶棒干得快但初粘力弱,纸稍微有点回弹就崩开;白乳胶初粘力也不强,但它渗透进纸纤维之后强度高,而且干得慢,留给你调整的时间。涂胶量宁少勿多,薄薄一层就够,涂多了纸会吸水膨胀,干了之后收缩,接缝处出现一道凹下去的沟。双面胶适合做临时定位,不适合做最终粘接,时间长了会渗油、脱胶。

4.4 打印缩放,一个几乎人人踩的坑

展开图是 1:1 画的,打印的时候必须保证 1:1 输出。几乎所有打印对话框里都有一个"适应页面"或者"缩放以适合"的默认选项,勾上之后,你的 100 mm 底边可能变成 96 mm 或者 104 mm,误差 4% 听起来不多,但几个棱累积下来,最后一条缝能差出 8 mm,完全粘不上。

正确做法是:在打印设置里选"实际大小"或者"100%",然后在输出之前,在图纸上加一个 100 mm 长的标尺条。打出来用尺子量一下标尺,量出来是 100 mm 才动手剪。这个动作只需要五秒钟,能省掉一整张纸和半小时。

还有一个隐藏的坑:某些软件的 SVG 或者 PDF 导出默认单位是 pt 或者 px,不是 mm。如果导出时没指定单位,打开之后整张图会按 0.75 倍或者 1.33 倍走。稳妥的做法是在文件里写死毫米单位,或者干脆导出一张带尺寸标注的图,打印后对照标注核一遍。

5. 同一张展开图,在工程里怎么用

5.1 钣金下料,斜接和折弯补偿跑不掉

纸模的展开图可以直接当成钣金件的毛坯形状参考,但有两处必须修正,否则做出来的件装不上。

第一处是折弯补偿。金属板折弯时,内侧受压、外侧受拉,中间有一层长度不变的"中性层"。展开料的长度要按中性层算,公式是:

BA = π × (R + K·T) × θ / 180

BA 是折弯补偿长度,R 是内折弯半径,T 是板厚,θ 是折弯角度(度),K 是中性层系数。K 的取值跟材料、R/T 比值有关,软钢在 R≈T 时常用 0.33 到 0.42 这个区间,具体数值最好按材料供应商给的表来,或者自己做一组折弯试样实测反推。这一步在纸模里完全不用考虑,但到了 1.5 mm 厚的钢板上,一条棱少算 2 mm,四个面就是 8 mm 的缺口。

第二处是斜接。棱锥的相邻两个侧面之间的夹角不是 90°,折弯线也不是等宽的直条。真正下料时,两个面在棱线处是"斜接"关系,需要把每片三角形的边缘切出对应的斜角,两块拼起来才能严丝合缝。这个斜角由相邻侧面之间的二面角决定。二面角的算法用三维向量最直接:把底面顶点坐标和锥顶坐标写出来,分别求两个相邻侧面的法向量,法向量夹角取补角就是二面角。手算比较烦,实际都在 CAD 里量,SolidWorks、Fusion 这类软件建个棱锥实体,直接测量两面夹角就行。要注意法向量的朝向,朝内朝外算出来的结果差 180°,量完拿纸模对一下角度,能立刻发现对不对。

侧棱的斜接角还有一条经验:它是二面角的一半。所以知道二面角之后,每片三角形边缘切掉的角就是 (180° - 二面角)/2,这个数在激光切割或者等离子切割的排版程序里可以直接当参数输进去。

5.2 四坡尖顶,椽长就是斜高

建筑上的四坡尖顶(金字塔顶)本质上就是一个正四棱锥的屋面。做这类屋面估算的时候,两个数最关键:椽条长度和屋面面积。

椽条长度直接等于斜高 m,前提是椽条从檐口沿屋面直线走到锥顶。实际施工时还要加上檐口挑出的部分和锥顶的连接余量,通常各留 200 到 300 mm。屋面面积就是前面那张表里的侧面积,等于底面周长乘斜高除以二。这个公式比"分成四个三角形分别算再相加"快得多,也更不容易出错。

有个容易忽略的点:屋面材料的用量不能直接按侧面积算,因为瓦片、金属板都有搭接和裁剪损耗。平板类材料(比如金属屋面板)的损耗率跟板宽与坡面长度的匹配程度关系很大,坡面越长、板越窄,裁剪浪费越多。实际操作中会先按侧面积乘一个 1.1 到 1.2 的系数做预算,再按排版图精算。另外,锥顶附近是四块板交汇的地方,收边件必须定制,这块的成本经常被漏算。

坡度也值得说一句。屋面坡度用侧面与水平面的夹角表示,也就是前面算的侧面与底面的二面角 β,tan β = h / r。四棱锥 a=100、h=100 的例子,tan β = 100/50 = 2,β = 63.4°,这是相当陡的坡度,排水快但材料用量大。一般屋面坡度做到 25° 到 45° 之间比较常见,对应 h/r 大约 0.47 到 1.0。

5.3 包装和展示道具,展开图就是刀模图

棱锥形的包装结构在礼盒、化妆品盒、节日装饰里很常见,原因很实在:锥形在货架上辨识度高,而且用料比同体积的方盒省。这类包装的展开图,去掉粘接翼片、加上压痕线和模切线之后,就是生产用的刀模图。

三棱锥立牌(放在桌面上的广告牌)是个典型例子。它的展开图通常是扇形排布,一条侧棱粘接,底面留一条边做插舌或者直接粘死。设计时要注意的是,包装用的纸板一般在 300 到 400 g,比手工纸模厚得多,折弯半径不能忽略。直角折痕在厚纸板上会"爆线"——外层纸面被拉裂,露出里面的白色纸芯。解决办法是压痕线做成双线(两条平行的压痕),或者沿着折线做微小的"打点"处理,让纸板有地方释放应力。

还有一个包装特有的问题:内装物的干涉。棱锥内部的空间是个上小下大的锥形,很多人按底面尺寸设计内衬,结果内衬的上半部分顶到侧面,盖子盖不严。正确的做法是按棱锥在不同高度上的截面尺寸来设计内衬,截面边长随高度线性收缩,收缩率等于 (1 - z/h),其中 z 是距底面的高度。这个关系是线性的,算起来很快。

5.4 造型件:灯罩、吸音扩散体、装饰构件

棱锥阵列在声学处理里用得不少。锥形扩散体的原理是把入射声波在不同方向上的路径差打散,让反射声不是集中回到一个方向,而是均匀散开。单个棱锥的"井深"(也就是棱锥的高 h)决定了它能有效扩散的最低频率,井深越大,能作用的频率越低。做这类构件的展开图和纸模的逻辑完全一样,只是材料换成了木饰面板、石膏或者发泡材料,加工方式换成了 CNC 雕刻。纸模在这个流程里的角色是"打样"——先用纸做一个 1:5 的缩小模型,摆在现场看效果、看比例,确认之后再上真材料。这一步能省掉大量返工,因为纸模做错一个,损失的是半小时;木饰面做错一个,损失的是整块料。

棱锥灯罩是另一个高频应用。做灯罩时,展开图要多考虑一件事:透光均匀性。棱锥的棱线处纸是双层的(折过去自身重叠),透光会明显暗一些,形成一条条暗线。如果想要均匀的光斑,可以在内侧贴一层薄描图纸做匀光,或者把棱线设计成"软棱"——不折死,折成圆弧过渡。后者的代价是展开图上的边长要重新算,因为圆弧过渡会吃掉一部分长度,通常每条棱要留出 1 到 2 mm 的补偿量,具体多少跟纸厚和圆弧半径有关,试两次就摸出来了。

6. 用脚本批量生成展开图

6.1 什么时候值得写代码

做一两个模型,CAD 或者手绘就够了。但下面这几种情况,写脚本的收益很大:需要试一系列不同高度、不同边数的方案做对比;需要按不同比例批量出图(比如同时出 1:1、1:2、1:5 三个版本);需要把展开图直接输出成激光切割机能读的矢量文件。这三种情况的共同点是"重复计算多、参数经常变",正是脚本擅长的。

写脚本的另一个好处是,它强迫你把每个量的定义搞清楚。手算的时候容易糊弄过去,代码里变量名写错一次,运行结果就会明显不对,反而帮你发现了概念上的混淆。

6.2 计算和出图的关键几步

核心思路很简单:先算出 R、r、m、l、α,然后把 n 个三角形按扇形排布生成坐标,再补上底面多边形和翼片,最后输出 SVG。下面是关键部分,用 Python 写,不依赖第三方库。

import math def pyramid_net(n, a, h, tab_w=6.0, tab_min=2.0): R = a / (2 * math.sin(math.pi / n)) # 底面外接圆半径 r = a / (2 * math.tan(math.pi / n)) # 底面内切圆半径 m = math.hypot(h, r) # 斜高 L = math.hypot(h, R) # 侧棱 alpha = 2 * math.asin(a / (2 * L)) # 侧面顶角,弧度 # 扇形排布:所有三角形共用顶点(0,0) tris = [] for k in range(n): t1, t2 = k * alpha, (k + 1) * alpha p1 = (L * math.cos(t1), L * math.sin(t1)) p2 = (L * math.cos(t2), L * math.sin(t2)) tris.append(((0.0, 0.0), p1, p2)) return {"R": R, "r": r, "m": m, "L": L, "alpha_deg": math.degrees(alpha), "tris": tris}

底面多边形的生成,关键是确定它的朝向——必须贴在第一个三角形底边的外侧,也就是远离顶点的那一侧:

def base_polygon(p1, p2, n, r): mx, my = (p1[0] + p2[0]) / 2, (p1[1] + p2[1]) / 2 dx, dy = p2[0] - p1[0], p2[1] - p1[1] ln = math.hypot(dx, dy) nx, ny = -dy / ln, dx / ln if nx * mx + ny * my < 0: # 翻转法向,指向远离原点 nx, ny = -nx, -ny cx, cy = mx + nx * r, my + ny * r a0 = math.atan2(p1[1] - cy, p1[0] - cx) Rv = math.hypot(p1[0] - cx, p1[1] - cy) return [(cx + Rv * math.cos(a0 + 2 * math.pi * k / n), cy + Rv * math.sin(a0 + 2 * math.pi * k / n)) for k in range(n)]

这里有个小陷阱:a0 必须从 p1 起算而不是任意起点,否则生成的多边形虽然形状对,但顶点顺序和三角形的底边对不上,翼片会贴错位置。判断对不对的方法很直观——把生成的坐标画出来,看底面是否严丝合缝地接在三角形底边上。

输出 SVG 时,把 width 和 height 直接写成毫米,并带上 viewBox,这样大多数切割软件和打印驱动都能正确识别尺寸:

def to_svg(polys, path, pad=10.0): xs = [p[0] for poly in polys for p in poly] ys = [p[1] for poly in polys for p in poly] x0, y0 = min(xs) - pad, min(ys) - pad w, h = max(xs) - min(xs) + 2 * pad, max(ys) - min(ys) + 2 * pad with open(path, "w", encoding="utf-8") as f: f.write(f'<svg xmlns="http://www.w3.org/2000/svg" ' f'width="{w:.2f}mm" height="{h:.2f}mm" ' f'viewBox="{x0:.2f} {y0:.2f} {w:.2f} {h:.2f}">\n') for poly in polys: pts = " ".join(f"{x:.2f},{y:.2f}" for x, y in poly) f.write(f' <polygon points="{pts}" fill="none" ' f'stroke="black" stroke-width="0.3"/>\n') f.write('</svg>\n')

翼片用同样的思路生成:沿需要粘接的那条边,向内侧偏移 tab_w,两端各收窄一点。最简单的实现是构造一个梯形多边形,靠边的一端宽度取 tab_w,靠端点的一端宽度取 tab_min。

6.3 输出给切割机之前要知道的三件事

第一,线宽有实际意义。激光切割软件通常按颜色或者图层区分"切割线"和"雕刻线",0.1 mm 的红线切透,0.3 mm 的黑线只刻不切。如果你的展开图上折痕线和轮廓线一个颜色,机器会把折痕也切穿,模型就散架了。出图时一定要把两类线分层。

第二,切割缝宽要补偿。激光有 0.1 到 0.2 mm 的切缝,切出来的件会比图纸小一圈。做小尺寸模型时这个误差可以忽略,做拼装结构(榫卯)时必须补偿,通常的做法是在轮廓上整体外扩半个缝宽。纸模用刀手工裁的话,这个补偿不用做,但要注意刀刃要垂直,斜着切会让上下表面的尺寸不一致。

第三,排版留间距。切割件之间至少留 3 mm 间距,太近了热影响区会连在一起,边缘发黄。如果材料是亚克力,间距还要更大一些,因为热量积累会让边缘融化。

7. 做砸了之后怎么查

7.1 顶端裂开或者鼓包

顶端合不拢,最常见的原因是侧面顶角算小了。检验方法很简单:把 n 个三角形的顶角加起来,用 360° 减去这个和,得到缺口角。如果缺口角明显小于理论值,说明 α 算错了。回想一下是不是用了棱锥的高 h 去代替斜高 m 算顶角——这是最高频的错误,因为 h 这个数在题目里最先给出来,手一滑就用上了。

如果缺口角对,但顶端还是鼓包,那问题出在翼片。矩形翼片在顶点处堆叠是硬伤,换成梯形翼片,或者干脆在顶点附近 5 mm 范围内把翼片完全剪掉,用一小块补强纸从内侧贴住,效果比硬折好得多。这个技巧我在做很尖的锥体(nα 小于 150°)时必用,成功率明显高于纯靠翼片粘接。

7.2 底面翘曲、四角不平

底面不平,八成是折痕没压实。侧棱的折痕如果没有折到底,纸会保持一个回弹角,n 条回弹角累积起来,底面就被拉着往上翘。检查方法:把模型扣在桌面上,从侧面看四个角是否都接触桌面。如果有角悬空,找到靠近这个角的那条棱,用骨笔重新压一遍,压实到位。

另一种可能是粘接顺序造成的应力。如果所有缝都粘完了再想调整,已经晚了。所以粘接时要在胶水半干的状态下做一次"整平"——把模型放在平板上,用手掌轻轻压住压到全干。白乳胶的开放时间大约 10 到 15 分钟,这段时间内都还能微调。

还有一个不太常见但确实存在的原因:纸的含水率。纸受潮会膨胀,干燥会收缩,而且不同方向收缩率不一样。如果展开图是刚打印出来的(喷墨打印机会让纸吸水),立刻剪下来做,等它干了之后尺寸会变。稳妥的做法是打印完放平压几个小时,或者用重物压一夜,让纸的含水率稳定下来再动手。

7.3 侧面扭转、棱线不竖直

把模型立在桌上,从正上方往下看,如果发现棱线不是从底面顶点垂直往上走,而是斜着的,那说明底面多边形的朝向错了。这种情况在扇形排布里最容易发生,因为底面是贴在侧面底边上的,如果底面的旋转起点没找准,整个底面会绕着自己的中心转一个角度,粘上去之后棱线就对不齐。

判断方法:量一下底面某条边与它对应侧面底边的重合度。如果两条线完全重合,方向就是对的;如果成一个角度,那就是上面这个问题。改法很简单,生成底面坐标时,起点必须严格取侧面底边的两个端点,不能自己另选。

如果方向对但整体还是歪的,检查一下是不是每条侧棱的折痕都折到了同一个角度。人的手很难做到完全一致,差个两三度在单个面看不出来,几个面加起来就明显了。这种情况下用硬模板辅助会好很多——找一块硬卡纸切出侧面顶角的形状,折每条棱的时候把模板卡在中间,强制角度一致。

7.4 一个五分钟的自检流程

养成出图之后、动手之前的自检习惯,能省掉大量返工。

检查项判定标准不合格的后果
nα 之和明显小于 360°,差值即缺口角等于 360° 说明算成了平面
斜高 m大于棱锥高 h等于或小于 h 说明公式用错
侧棱 l大于斜高 m反过来说明 R、r 用混了
侧面积底面周长×m÷2与逐面相加的结果应一致
打印标尺实测 100 mm偏差超过 0.5 mm 需重打
折痕方向山折在背面压痕压反了棱线会变圆

这个表里的前四项,其实是对同一套公式的四个交叉验证。四个量互相之间的关系是死的,任何一个算错,都会在另外几项上露馅。我自己的习惯是出图前扫一眼这四个数,十秒钟,比事后拆一个做废的模型划算太多。

最后一件事,关于练手顺序。三棱锥、四棱锥、六棱锥这三个,如果只做一个,选六棱锥——外接圆半径等于边长,计算几乎不出错,粘缝数量适中,做出来的成品也好看。四棱锥看着简单,实际上因为侧面顶角大、缺口也大,顶端收口的难度反而最高,不建议作为第一个。三棱锥最尖,顶点处的材料最少,稍微用力就破,适合已经做过一两个、手上有点感觉之后再去挑战。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/28 14:13:28

零基础入门PyTorch:从张量到训练循环的实战指南

简介&#xff1a;《Deep Learning with PyTorch》官方样本PDF面向希望入门深度学习框架的开发者与学习者&#xff0c;聚焦PyTorch在模型训练与项目实践中的基础应用。内容围绕训练循环搭建、训练统计收集、tqdm进度报告、DataLoader与Dataset使用&#xff0c;以及回归模型项目的…

作者头像 李华
网站建设 2026/10/28 14:12:54

Transformer在高光谱图像少样本目标检测中的应用

1. 项目概述"基于Transformer的跨域少样本学习高光谱目标检测"这个标题包含了当前计算机视觉领域的多个前沿技术方向。简单来说&#xff0c;这是一套利用Transformer架构&#xff0c;实现在数据量有限且跨不同场景条件下&#xff0c;对高光谱图像中特定目标进行检测的…

作者头像 李华
网站建设 2026/10/28 14:12:42

端口占用排查与安全防护:从查看、处理到防护的完整链路

网络不通、服务起不来、端口被莫名占用&#xff0c;这类问题几乎每个跟服务器打交道的人都遇到过。我印象最深的一次是帮朋友排查一个内部服务&#xff0c;应用日志里只写了一句“Address already in use”&#xff0c;他折腾了大半天&#xff0c;重启机器、重装软件都试过&…

作者头像 李华
网站建设 2026/10/28 14:12:32

JavaScript空值判断:从基础到最佳实践

1. 前端开发中空值判断的必要性在日常前端开发中&#xff0c;处理变量值为undefined或null的情况几乎无处不在。这两种特殊值虽然都表示"无值"的概念&#xff0c;但在JavaScript中却有着本质区别&#xff1a;undefined通常表示变量已声明但未赋值&#xff0c;或是对象…

作者头像 李华
网站建设 2026/10/28 14:12:24

生物神经网络如何启发现代编程语言设计

1. 生物神经网络与编程语言的跨界探索生物神经网络是自然界经过亿万年进化形成的精密计算系统&#xff0c;而编程语言则是人类创造的抽象思维工具。当这两个看似不相关的领域相遇时&#xff0c;迸发出的创新火花令人惊叹。作为一名长期关注计算模型演进的开发者&#xff0c;我发…

作者头像 李华
网站建设 2026/10/28 14:12:20

COSCon‘25开源论坛:AI与开源商业化的未来趋势

1. 开源无界&#xff1a;COSCon25全球开源发展愿景论坛全景解读当全球开发者都在讨论"AI是否会取代程序员"时&#xff0c;2025中国开源年会(COSCon25)用一场聚焦未来的论坛给出了答案。这场名为"开源无界&#xff0c;共筑未来"的全球开源发展愿景论坛&…

作者头像 李华