從圓到弧

March 6, 2022

想要繪製曲線,必須先知道規則,具體而言,就是數學公式,連續曲線都可以找到公式來描述,只是你找不找得出來罷了…XD

圓的組成

在無數的曲線當中,圓應該是大家最熟悉的一個,若半徑為 radius,圓的公式是 (radius * cos(θ), radius * sin(θ)),θ 從 0 到 360,這個公式先前曾經使用過幾次,例如在〈list 表示式〉曾經用這個公式來畫過弧(arc),如果想畫個圓也很簡單:

use <polyline_join.scad>

radius = 10;
thickness = 2;

points = [
    for(a = [0:360]) 
        radius * [cos(a), sin(a)]
];
polyline_join(points)
    circle(thickness / 2, $fn = 24);

這邊使用了 dotSCAD 的 polyline_join 模組,將指定的一組點,以指定的 circle 作為接點,兩兩 hull 後就可以畫出多個線段,由於線段很多,看來就像個圓了:

從圓到弧

在 OpenSCAD 中,圓其實是以正多邊形來表示,在〈圖形布林運算〉談過 $fn 特殊變數,可用來設置正多邊形的邊數,這時你會想,可否根據 $fn 來繪製方才的圓呢?是可以!你可以自己實現看看,不過 dotSCAD 提供了 shape_circle 函式,可以產生正多邊形的頂點,也支援 $fn 特殊變數。例如:

use <shape_circle.scad>
use <polyline_join.scad>

radius = 10;
thickness = 2;

points = shape_circle(radius, $fn = 12);
polygon(points);

translate([radius * 3, 0])
polyline_join(points)
    circle(thickness / 2, $fn = 24);

在 dotSCAD 中,shape_ 開頭的函式,可產生供 polygon 使用的多邊形頂點,就上例來而言,shape_circle 設置了 $fn 為 12,會產生 12 個頂點,如果想當成是曲線的頂點來使用也是可以,範例繪製的結果會是:

從圓到弧

右邊看來是個弧,若想畫出一個圓,可以將最後一個頂點與第一個頂點相接,例如將上例的 polyline_join(points) 改為 polyline_join([each points, points[0]]),就可以畫出圓。

跟圓有關的特殊變數,除了 $fn,其實還有 $fs$fa,因為圓在 OpenSCAD 是以正多邊形表示,$fs 可以用來控制正多邊形的邊長;圓也可以看成是邊上兩個頂點與圓心相關的三角形其中一邊,三角形的銳角越小,需要的三角形就越多,圓就越細緻,這可以使用 $fa 特殊變數控制:

從圓到弧

大部份的情況下會使用 $fn,必要時可考慮使用 $fa$fs,dotSCAD 與圓相關的模組或函式,$fn$fs$fa 都支援。

建立弧線

方才的範例,由於將最後一個頂點與第一個頂點相接,基於 polyline_join 畫了弧線,不過,因為指定 polyline_joincircle 連接,弧線起點與終點的形狀,就是基於 circle

如果想要弧線的起點與終點是平的,並可以指定起始與終止角度,可以使用 arc 模組,例如:

use <arc.scad>

radius = 10;

$fn = 24;

arc(radius, angle = [45, 290], width = 2);
%circle(radius); 

translate([radius * 3, 0]) {
    arc(radius, angle = [45, 290], width = 2, width_mode = "LINE_OUTWARD");
    %circle(radius); 
}

translate([radius * 6, 0]) {
    arc(radius, angle = [45, 290], width = 2, width_mode = "LINE_INWARD");
    %circle(radius); 
}

arc 模組支援 $fn 等特殊變數,width_mode 可設定線是在圓上(預設)、圓外還是圓內,這會繪製出以下的模型:

從圓到弧

shape_ 的擠出

dotSCAD 有個 shape_arc 函式,它產生的頂點可以提供給 polygon 繪製多邊形,事實上 arc 模組內部就是基於 shape_arcpolygon 實現。

dotSCAD 中 shape_ 開頭的函式,除了可以給 polygon 繪製多邊形、作為曲線的頂點資訊,還有個作用,它們都可以透過〈2D Shape Extrusion〉模組來進行擠出。

例如,ring_extrude 可以實現環狀擠出,可以視為 rotate_extrude 的進階版,因為它還支援 twistscale 等參數:

use <shape_arc.scad>
use <ring_extrude.scad>

radius = 10;

$fn = 24;
arc = shape_arc(radius, angle = [45, 290], width = 5);
ring_extrude(arc, radius = 50, angle = 270, twist = 90, scale = 2);

twist 可以在擠出過程設定扭轉總角度,scale 可設定縮放級數,這會繪製出以下的模型:

從圓到弧

想要建個莫比烏斯帶嗎?以下的程式碼就可以完成喔!

use <shape_square.scad>
use <ring_extrude.scad>

rect = shape_square(size = [15, 5]);
ring_extrude(rect, radius = 30, twist = 180);

這會建立以下的結果:

從圓到弧

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