0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SwiftでL-System

Last updated at Posted at 2023-02-09

はじめに

こちらの記事で紹介しましたSwiftyCreativesというSwift製のクリエイティブコーディングフレームワークを用いてL-Systemを実装していきます。

L-Systemとは

L-Systemはフラクタル図形を描画するためのアルゴリズムです。プログラムの再帰性を用いて簡単にフラクタルが描画できるようになっています。

実装結果

QuickTime Player - 画面収録 2023-02-10 1.53.14.mov 2023年-02月-10日 2.55.14.gif

実装

コードはとてもシンプルです。
実装方法についてはたくさん記事が出ているのでそちらをみていただけると助かります。
この記事では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()などで代用してください。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?