【问题标题】:Split hollow sphere based on circumscribed Dodecahedron sides基于外接十二面体边的分割空心球
【发布时间】:2015-05-01 12:53:44
【问题描述】:

我正在尝试在我的 Printrbot 上打印出一个 300 毫米的空心球体,方法是将球体的内腔塑造为规则的外接多面体,并根据外接多面体的侧面分割球体。我首先用一个立方体进行了尝试,得到了 6 个面和可 3d 打印的平底,但是由于打印机的构建体积有限(150x150x150 毫米),生成的边约 175 毫米的边缘不适合。

下一个合理的步骤似乎是将外接多面体更改为十二面体并打印出 12 个边而不是 6 个,但是,我在弄清楚如何正确地将五边形投影到球体上并将其切片时遇到了一些麻烦因此。有没有办法得到球体和投影十二面体边的交点?我当前的代码如下。

$fn = 72;

diameter=300;

side();

module side()
{
    difference()
    {
        hollow_sphere(diameter);
        rotate([180,0,0])
        fiveSideMask();
    }
}

// A cubic mask to remove all sides but one from the circle
module fiveSideMask()
{
    union()
    {
        rotate([45,0,0])
        translate([0,-diameter/4, 0])
        cube([diameter, diameter/2, diameter], center=true);
        rotate([-45,0,0])
        translate([0,-diameter/4, 0])
        cube([diameter, diameter/2, diameter], center=true);
        rotate([0,0,45])
        translate([0,-diameter/4, 0])
        cube([diameter, diameter/2, diameter], center=true);
        rotate([0,0,-45])
        translate([0,-diameter/4, 0])
        cube([diameter, diameter/2, diameter], center=true);
    }
}


module hollow_sphere(diameter=300, shell_thickness=5)
{
    difference()
    {
        sphere(d=diameter, center=true);
        //Sphere internal cavity
        //sphere(d=(diameter-(shell_thickness*2)), center=true);

        //Cube internal cavity
        cube(CubeEdgeFromDiag(diameter - shell_thickness * 2), center=true);

        //Dodecahedron internal cavity
        //rotate([90,0,0])
        //dodecahedron(225);
    }
}

function CubeEdgeFromDiag(diagLength) = (sqrt(3) * diagLength) / 3;

module dodecahedron(size)
{
    dihedral = 116.565;
    intersection()
    {
        box(size);
        intersection_for(i=[1:5])
        {
            rotate([dihedral, 0, 360 / 5 * i])  box(size);
        }
    }
}

module box(size)
{
    cube([2*size, 2*size, size], center = true);
}

【问题讨论】:

    标签: 3d geometry polyhedra openscad


    【解决方案1】:

    您实际上可以使用类似于您现有的技术 fiveSideMask 模块,但不是围绕四角锥切割,而是围绕五角锥切割:

    // A mask to remove everything from the sphere but the projection of the face.
    module sideMask() {
        union() {
            radius = diameter / 2;
    
            dihedral_angle = acos(-1/sqrt(5));
            // Five slabs adjacent to the pentagonal-pyramind that projects out
            // around the face.
            for (theta = [0:360/5:359]) {
                rotate([90 - dihedral_angle,0,theta])
                    translate([-diameter/2,0, 0])
                        cube([diameter, radius, diameter]);
            }
            // We also want to mask out the opposite side of the sphere.
            translate([-radius, -radius, -radius])
                cube([diameter, diameter, radius]);
        }
    }
    

    您还可以通过在side 中使用hull 来简化hollow_sphere(并使其名称更准确)。这在计算上更加昂贵,但大大简化了代码。传递给hollow_sphereshell_thickness 最终将成为十二面体顶点处的最小厚度:

    module side() {
        // hull() is pretty expensive, but it nicely flattens out the bottom of the
        // shape, making for something easily printable.
        hull() difference() {
            hollow_sphere(diameter);
            rotate([180,0,0])
            sideMask();
        }
    }
    
    module hollow_sphere(diameter=300, shell_thickness=15) {
        difference() {
            sphere(d=diameter);
            sphere(d=diameter - shell_thickness);
        }
    }
    

    您需要保留的唯一其他内容是文件顶部的几行...

    $fn = 72;
    
    diameter=300;
    
    side();
    

    ...你会得到这样的东西:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      相关资源
      最近更新 更多