pointsandfaces – ein einfaches Beispiel

Wir werden ein kleines Stück Rohr konstruieren und dabei die Funktion tube_pnf_v()  pnf_cylinder.scad vorstellen.

Betrachten wir das folgende Listing und die erzeugte Ausgabe auf dem folgenden Bild.

use <inc/pnf/pnf_cylinder.scad>
fn = 128;
height = 100;
outer_radius = 30;
wall_thickness = 4;
v = tube_pnf_v(
    r = outer_radius,
    h = height,
    wt = wall_thickness, nz = 1, fn = fn);
polyhedron(v[0], v[1], 4);

Und, was ist so besonders daran? Warum sollten wir es nicht einfach wie folgt machen?

linear_extrude(height=height)
   difference()
   {
        circle(r=outer_radius, $fn=fn);
        circle(r=outer_radius-wall_thickness, $fn=fn);
   }

Das würde die gleiche Ausgabe erzeugen:

Der Unterschied fängt da an, wenn man etwas anderes machen will. Mit der üblichen OpenSCAD Funktionalität ist es leicht, Teile abzuschneiden oder komplexere Strukturen durch das Zusammenfügen mehrer Teile zu bauen, aber man ist immer auf das beschränkt, was man von den grundlegenden Zeichenprimitiven erhält.

Man kann rotate_extrude() auf ein difference() von zwei circle() anwenden und aus dem Ergebnis 1/4 herausschneiden, um ein um 90° gebogenes Rohr zu erhalten, oder man kann rotate_extrude() auf eine gebogene Line, deren Stützpunkte mit einer for()-Zuweisung erzeugt wurden, anwenden, um ein mittig verjüngtes Rohr zu erhalten, aber man kann nicht beide Mutationen gleichzeitig an einem Objekt anwenden.

Ein gebogenes Rohr, konstruiert mit einer Intersection und Rotationsextrudierung einer Differenz zweier Kreise.
fn = 128;
outer_radius = 30;
bending_radius = 40;
wall_thickness = 4;
height = 3.1415 * bending_radius / 2;

translate([outer_radius, 0, 0])
    rotate([90, 0, 180])
        intersection()
        {
            rotate_extrude($fn = fn, convexity = 4)
                translate([bending_radius, 0, 0])
                    difference()
                    {
                        circle(r = outer_radius, $fn = fn);
                        circle(r = outer_radius-wall_thickness, $fn = fn);
                    }
            translate([0,0,-outer_radius-1])
                cube([outer_radius + bending_radius + 1, 
                    outer_radius + bending_radius + 1, 
                    outer_radius * 2 + 2]);
        }
Ein verjüngtes Rohr, konstruiert durch dir Rotationsextrusion des Längsschnitts einer verjüngten Wand.
fn = 128;
outer_radius = 30;
narrowing = 10;
wall_thickness = 4;
height = 100;
v = concat(
[ for (y=[0:height/fn*4:height+0.01]) 
    [outer_radius-cos((y-height/2)/height*360)*narrowing,y]],
[ for (y=[height+0.01:-height/fn*4:0]) 
    [outer_radius-wall_thickness-cos((y-height/2)/height*360)*narrowing,y] ]
);
rotate_extrude($fn=fn)
{
    polygon(v);
}

Wie wäre es nun mit einem gebogenen Rohr mit einer verjüngten Mitte? Dann lass uns einen Blick auf ein weniger einfaches Beispiel werfen.