在 OpenSCAD 中创建“饼图”?

3D打印 3d模型 3d 设计 opencad
2021-05-06 21:37:39

在制作圆柱体时,有时我只需要取一个饼片。我目前正在使用这个巧妙的技巧为 90 度以下的角度制作馅饼切片。但是,我需要一些超过 90 度但低于 180 度的角度。有没有办法概括/扩展它以适用于这些更大的角度?

module pie_slice(r=3.0,a=30) {     
   intersection() {
    circle(r=r);
    square(r);
    rotate(a-90) square(r);  
  } 
}

pie_slice(r=10,a=15);
3个回答

我目前的解决方法是使用union而不是交叉。不幸的是,这意味着我必须使用一个if子句,使代码具有两条路径,而不是一种干净的方法。此外,与上述方法不同,这不会产生干净的圆柱形状,而是必须与适当的圆柱结合才能得到最终的饼图

   size = length + 2;
    if (angle_deg <= 90) {
      translate([0,0,-1]) 
      intersection() {
        cube(size);
        rotate(angle_deg-90) cube(size);
      }
    } else if (angle_deg <= 180) {
      translate([0,0,-1]) 
      union() {
        cube(size);
        rotate(angle_deg-90) cube(size);
      }      
    } else {
      echo(str("FAILURE - Angle cannot exceed 180"));
    } 


这是我使用的:

module pieSlice(a, r, h){
  // a:angle, r:radius, h:height
  rotate_extrude(angle=a) square([r,h]);
}
pieSlice(110,20,3);

尽管通过组合原始 OpenSCAD 形状来生成复杂的形状是一种成熟的传统,并且通常是所需要的,但在这种情况下,直接使用polygon函数和列表推导式生成饼图会更优雅

module pie_slice(r=3.0, a=30) {
  polygon(points=[
    [0, 0],
    for(theta=0; theta<a; theta=theta+$fa)
      [r*cos(theta), r*sin(theta)],
    [r*cos(a), r*sin(a)]
  ]);
}

请注意,上面的代码有点粗糙,因为它没有进行错误检查,但它可以工作。它使用$fa步距角特殊变量。