在我的 Thingiverse 作品 中,有個 Characters container generator,算是還蠻受歡迎的:
繞圓的文字
其實這作品做來不難,就只是將文字繞圓,然後加個空心圓,拉高之後加個底而已,而在〈圓的組成〉中我們看過怎麼自行畫圓,其中一種方式是用線段,只要將線段取代為文字,自然就可以讓文字繞圓了。
radius = 50;
chars = "IT WORKS ON MY MACHINE ";
module revolve_text(radius, chars) {
PI = 3.14159;
circumference = 2 * PI * radius;
chars_len = len(chars);
font_size = circumference / chars_len;
step_angle = 360 / chars_len;
for(i = [0 : chars_len - 1]) {
rotate(-i * step_angle)
translate([0, radius + font_size / 2, 0])
text(
chars[i],
font = "Courier New; Style = Bold",
size = font_size,
valign = "center", halign = "center"
);
}
}
revolve_text(radius, chars);
這是一種設計方式,在指定半徑的情況下,圓周固定,字的多少決定了每個字的大小,字越多字越小,記得嗎?畫圓時實際上可以由一個一個線段組成, 因此就算字本身並不是一小段圓弧,字越多,看來就越像是個圓。
Characters container generator 就是屬於這種設計方式,因為想要讓其他使用者在自訂文字時,可以輸入完整意義的句子,當然半徑固定的情況下,字太多而使得字太小會是個問題,因此字多的話,就要增大半徑 囉!
在我另一個作品 Character tower generator 則是採一圈字數固定的方式來設計(之後文件會看看怎麼設計),視你想要的模型效果,也可以採字的大小固定的方式來設計。
加上圓
想在這個文字旁邊加上圓環,是件輕而易舉的事,只是畫個圓然後再一個小圓,取差集就好了對吧!那麼你的圓會怎麼畫,這樣嗎?
我的 Characters
container generator 是在剛學 OpenSCAD
不久時設計的,一開始也沒想太多,因此就只是隨意地畫了個圓,不過仔細看看上面的圖片,文字與圓的線並不是垂直的,我故意讓圓的 $fn
為 12,以突顯這個情況。
這樣又會如何呢?不規則的交集會使得模型的複雜度變高,render 時會比較久,過程中耗費的記憶體會比較大,模型檔案會變大,另一方面也容易產生一些不必要的錯誤或警告。
我希望的是,字數有多少,$fn
就有多少,而且圓的每一段線與字是垂直的,這樣除了可以避免以上的問題之外,建出來的模型也會比較美觀。
觀察 circle
模組的繪製起點,都是與 X 軸夾 0 度開始,因為上面的文字是從與 Y 軸 0
度開始,因此,設計上就將圓先轉 90 度,然後再轉 360 / $fn
/ 2,這樣圓的線與字就能垂直了。
revolve_text(radius, chars);
rotate(90 + 180 / len(chars))
circle(radius, $fn = len(chars));
仔細看看上面的圖,是不是每個字都與圓的線垂直了呢?接下來要如何完成 Characters container generator,應該不用我再介紹了吧!
就當是個練習用的功課,想辦法做出一個你的 Characters container generator 吧!