3D 海龜繪圖

March 14, 2022

想像有隻海龜,只會前進與轉彎,在海裡游泳,游過的路線都會留下痕跡,如果這隻海龜很特別,行走時有個規律,那它就會是隻有藝術感的海龜!

t3d 函式

如果想知道怎麼實作 3D 海龜繪圖,可以參考〈CadQuery〉的〈3D 海龜繪圖〉,不過,會想使用海龜繪圖,應該是不太想知道怎麼實作吧…XD

如果想直接基於 3D 海龜來繪圖,dotSCAD 提供了 t3d 函式,它的操作與〈2D 海龜繪圖〉的 t2d 函式類似;當然,因為是 3D,除了 forwardturn(繞自身 z 軸轉動,左轉為正角度)以外,還有 roll(繞自身 x 軸轉動,左翻身為正角度)與 pitch(繞自身 y 軸轉動,抬頭為正角度)。

最主要的是,必須從海龜自身觀點來操作(想像你就是海龜),而不是從世界座標的觀點來作。

來看看基於〈2D 海龜繪圖〉的星形畫法,若是加上抬頭的重複,可以繪製出什麼圖案呢?

use <polyline_join.scad>
use <turtle/t3d.scad>

angle = 144;
length = 10;
n = 5;
width = 1;
commands = [["turn", angle], ["forward", length]];

module repeat(t, commands, n, width) {
    if(n > 0) {
        new_t = t3d(t, commands);
        polyline_join([t3d(t, "point"), t3d(new_t, "point")])
            sphere(width / 2);
        repeat(new_t, commands, n - 1, width);
    }
}

t = t3d();
for(a = [0:360/n:360]) {
    repeat(t3d(t, [["pitch", a]]), commands, n, width);
}

這可以畫出五個立體的五角星形:

3D 海龜繪圖

footprints3 函式

t2d 有個對應的 footprints2 函式,t3d 也有個對應的 footprints3 函式,它只接受 "forward""turn""roll""pitch" 指令,函式會自動生成、管理海龜,如果你只是單純地想讓海龜前進、轉彎、翻身、抬頭,記錄海龜走過的路徑,使用 footprints3 會簡單許多。例如:

use <polyline_join.scad>
use <turtle/footprints3.scad>

angle = 144;
length = 10;
n = 5;
width = 1;

commands = [
    for(i = [0:n]) 
    each [["turn", angle], ["forward", length]]
];

for(a = [0:360/n:360]) {
    path = footprints3([["pitch", a], each commands]);
    polyline_join(path)
        sphere(width / 2);
}

這會繪製方才看到的五角星形,來試著使用 footprints3 畫個盤旋:

use <polyline_join.scad>
use <turtle/footprints3.scad>

length = 10;
width = 2;
n = 200;

$fn = 24;

turn_a = 360 / $fn;
pitch_a = 5;

path = footprints3([
    for(i = [0:n])
    each [
        ["forward", length], 
        ["turn", turn_a],
        ["pitch", pitch_a]
    ]
]);

polyline_join(path)
    sphere(width / 2, $fn = 4);

這會繪製出以下的結果:

3D 海龜繪圖

是不是簡單多了呢?當然,t3d 可以做的事情比較多,這意謂著它可以做到更多 footprints3 做不到的事,像是一些碎形圖案,這就留到下一篇文件再來談了。

分享到 LinkedIn 分享到 Facebook 分享到 Twitter