pointsandfaces – rotierende Extrusion

Das Prinzip, jede Reihe zu schließen, indem die letzte Spalte mit der ersten verbunden wird, passt nicht nur zu Rohren, aber für das pointsandfaces Funktions-Pendant zum OpenSCAD module rotate_extrude().

Hier ist ein einfaches Beispiel. Um die Kanten wie auf dem Bild zu sehen, <Strg>+F1 drücken.

use <inc/pnf/pnf.scad>
use <inc/pnf/pnf_rotate_extrude.scad>

fn = 6;
P = [[20,20],[30,20],[40,10],[30,0],[20,0]];
v = pnf_rotate_extrude_pnf_v(P=P,fn=fn);
PnfDebugPoints(v[0],true);
echo(v);
% polyhedron(v[0],v[1],4);

Dieses mal verzichte ich darauf, hier die komplette Ausgabe des echo()-Statements aufzulisten. Ich lasse auch die Punkte weg, weil man sie auf dem Bild sehen kann, und ich liste nur die ersten und letzten paar Dreiecke auf.

Die erste Reihe der oben-links Dreiecke: [ 0, 5, 6], [ 1, 6, 7], [ 2, 7, 8], [ 3, 8, 9], [ 4, 9, 5]
Die erste Reihe der unten-rechts Dreiecke: [ 0, 6, 1], [ 1, 7, 2], [ 2, 8, 3], [ 3, 9, 4], [ 4, 5, 0]
Die letzte Reihe der oben-links Dreiecke: [25, 0, 1], [26, 1, 2], [27, 2, 3], [28, 3, 4], [29, 4, 0],
Die letzte Reihe der unten-rechts Dreiecke: [25, 1, 26], [26, 2, 27], [27, 3, 28], [28, 4, 29], [29, 0, 25]

Wie man sieht, ist das erste Dreieck [ 0, 5, 6] auf der Oberseite und von außen gesehen im Uhrzeigersinn. Die folgenden Dreiecke folgen auch diesem Schema, das wir schon vom letzten Kapitel kennen. [1, 6, 7] ist das nächste in der Zeile, und so weiter. Eigentlich ist das wie ein Rohr, nur mit Spalten als Reihen und Reihen als Spalten.

Aber was ist der Vorteil gegenüber dem OpenSCAD Modul rotate_extrude()? Welche Art von Veränderung kann an dem Punkte-Feld vorgenommen werden? Werfen wir einen Blick auf das folgende Listing und das resultierende Objekt.

use <inc/pnf/pnf.scad>
use <inc/pnf/pnf_rotate_extrude.scad>

fn = 360;
P = [[50,0],[60,20],[50,40],[30,40],[30,0]];

v = pnf_rotate_extrude_pnf_v(P=P,fn=fn);
v_s = 
[
    for (i = [0 : len(v[0]) - 1])
    let
    (
        w = atan2(v[0][i][1],v[0][i][0])+360,
        rw = (w % 20 > 15) ? 60 : 50
    )
    [
        (i % len(P) == 1) // if outer ring index
            ? rw * cos(w) // use angle-dependet value
            : v[0][i][0], // else keep value
        (i % len(P) == 1) // same here..
            ? rw * sin(w)
            : v[0][i][1],
        v[0][i][2] // z remains z.
    ]
];
polyhedron(v_s,pnf_turn_sides_faces_v(v[1]),4);

Ähnlich, aber ohne zu schließen, indem ein Kreis geschlossen wird, arbeitet Schrauben-Extrusion, das nächste Kapitel.