はじめに
こちらの記事で紹介しましたSwiftyCreativesというSwift製のクリエイティブコーディングフレームワークを用いてL-Systemを実装していきます。
L-Systemとは
L-Systemはフラクタル図形を描画するためのアルゴリズムです。プログラムの再帰性を用いて簡単にフラクタルが描画できるようになっています。
実装結果
実装
コードはとてもシンプルです。
実装方法についてはたくさん記事が出ているのでそちらをみていただけると助かります。
この記事ではSwiftyCreativesを用いた実装を紹介します。
Processingライクに書くことができます。
.swift
import SwiftyCreatives
import CoreGraphics
import AppKit
final class TreeSketch: Sketch {
// これを用いて描画する
var tree = "F"
override func setupCamera(camera: some MainCameraBase) {
// カメラの初期位置を設定
camera.setTranslate(0, -20, -40)
}
override func update(camera: some MainCameraBase) {
// 毎フレーム0.01radカメラを回転させる
camera.rotateAroundY(0.01)
}
override func draw(encoder: SCEncoder) {
for t in tree {
compile(char: t)
}
}
// 何かキー入力がされたら枝を増やす
override func keyDown(with event: NSEvent, camera: some MainCameraBase, viewFrame: CGRect) {
var currentTree = ""
for t in tree {
if t == "F" {
currentTree += "FyF+[+FyF-yB]-y[-yF+YP]"
} else {
currentTree += String(t)
}
}
tree = currentTree
}
func compile(char: Character) {
switch char {
case "B":
color(0.5, 0.5, 1.0, 1.0)
boldline(0, 0, 0, 0, 1, 0, width: 0.1)
translate(0, 1, 0)
case "P":
color(1.0, 0.3, 1.0, 1.0)
boldline(0, 0, 0, 0, 1, 0, width: 0.1)
translate(0, 1, 0)
case "F":
color(0.9, 1.0, 1.0, 0.8)
boldline(0, 0, 0, 0, 1, 0, width: 0.1)
translate(0, 1, 0)
case "+":
rotateZ(0.3)
case "-":
rotateZ(-0.3)
case "[":
pushMatrix()
case "]":
popMatrix()
case "y":
rotateY(0.15)
case "Y":
rotateY(-0.15)
default:
break
}
}
}
MacOSアプリへの導入
SwiftUIのViewとして使えます。
.swift
ZStack {
SketchView<MainCameraConfig, MainDrawConfig>(TreeSketch())
}
.background(.black)
iOSアプリへの導入
同じくSwiftUIのViewとして使えます。
ただ、keyDown()がiOSでは使えないので、touchesBegin()などで代用してください。