より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

Javaグラフィックス完全制覇をUnityで実装してみる〜シェルピンスキーのギャスケット

書籍「Javaグラフィックス完全制覇」を参考にシェルピンスキーのギャスケットを描画してみます。

UnityなのでLineRendererを用います。

三角形一つについてLineRendererが必要になるので、LineRendererを追加したGameObjectをPrefabとして描画していきます。

f:id:rimever:20210924185235p:plain

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public class SierpinskiGasketManager : MonoBehaviour
{
    void Start()
    {
        var startVertices = new List<Vector3>();
        float radius = 4f;
        for (int i = 0; i < 3; i++)
        {
            var x = -radius * Mathf.Sin(2 * Mathf.PI * i / 3);
            var y = radius * Mathf.Cos(2 * Mathf.PI * i / 3);
            startVertices.Add(new Vector3(x, y, 0));
        }

        DrawSierpinskiGasket(startVertices.ToArray(), 0, 10);
    }

    public GameObject Prefab;

    // Start is called before the first frame update

    private void DrawSierpinskiGasket(Vector3[] vertices, int currentIndex, int n)
    {
        if (currentIndex == 0)
        {
            DrawPolygon(vertices);
        }

        if (currentIndex < n)
        {
            var m = new Vector3[3];
            m[0] = (vertices[1] + vertices[2]) / 2;
            m[1] = (vertices[2] + vertices[0]) / 2;
            m[2] = (vertices[0] + vertices[1]) / 2;
            DrawPolygon(m);
            var pp = new Vector3[3];
            pp[0] = vertices[0];
            pp[1] = m[2];
            pp[2] = m[1];
            DrawSierpinskiGasket(pp, currentIndex + 1, n);
            pp[0] = m[2];
            pp[1] = vertices[1];
            pp[2] = m[0];
            DrawSierpinskiGasket(pp, currentIndex + 1, n);
            pp[0] = m[1];
            pp[1] = m[0];
            pp[2] = vertices[2];
            DrawSierpinskiGasket(pp, currentIndex + 1, n);
            
        }
    }

    private void DrawPolygon(Vector3[] vertices)
    {
        var o = Instantiate(Prefab);
        var lineRenderer = o.GetComponent<LineRenderer>();
        var v = new Vector3[vertices.Length + 1];
        vertices.CopyTo(v, 0);
        v[v.Length - 1] = vertices[0];
        lineRenderer.positionCount = v.Length;
        lineRenderer.SetPositions(v.ToArray());
    }
}

Reference

docs.unity3d.com