기하학은 라틴어로 “지구를 측정하는 학문”이라는 뜻을 가진 말로, 도형의 성질과 공간의 구조를 연구하는 수학의 한 분야입니다. 기하학은 우리가 생활하는 공간에서 일어나는 다양한 현상들을 수학적으로 이해하고 모델링하는 데 사용됩니다.

기하학은 대개 점, 선, 면, 공간 등의 개념을 다룹니다. 이를 통해 도형의 크기, 모양, 위치 등을 이해할 수 있으며, 그것들을 수학적으로 설명하고 분류할 수 있습니다. 또한, 기하학은 현대 공학 분야에서도 중요한 역할을 합니다. 예를 들어 건축, 컴퓨터 그래픽스, 로봇공학 등 다양한 분야에서 기하학적 개념과 원리를 활용하여 다양한 문제를 해결하고 설계합니다.

Shape

정이십면체(icosahedron)는 기하학적으로 플라토닉 솔리드 중 하나입니다. 플라토닉 솔리드는 정다면체로 알려져 있으며, 모든 면, 모서리, 꼭짓점이 균일하게 정렬된 볼록 다면체입니다. 총 5개의 플라토닉 솔리드가 존재하며, 정이십면체는 그 중 하나입니다.

정이십면체는 다음과 같은 특성을 가집니다.

  1. 총 12개의 꼭짓점이 있습니다.
  2. 총 30개의 모서리가 있습니다.
  3. 총 20개의 면이 있으며, 각 면은 정삼각형입니다.
  4. 각 꼭짓점에는 5개의 정삼각형 면이 모입니다.
  5. 정이십면체의 대칭성은 정삼각형의 회전 및 반사 대칭성을 가집니다.

정이십면체는 다양한 분야에서 활용됩니다. 예를 들어, 컴퓨터 그래픽스, 게임, 구조 설계, 화학(분자 구조), 수학 등에서 사용됩니다. 이러한 응용 분야 중 일부에서는 정이십면체를 시작점으로 하여 다양한 해상도의 구 형태를 나타내기 위해 분할 및 정교화하는 작업을 수행하기도 합니다.

정이십면체(Icosahedron)를 생성하려면, 정이십면체의 정점과 삼각형을 정의해야 합니다. 정이십면체는 12개의 꼭짓점과 20개의 동일한 정삼각형 면으로 구성됩니다.

정이십면체의 정점 좌표를 계산하기 위해 다음과 같은 상수가 필요합니다.

  • 황금비 (Golden Ratio, φ): 약 1.618033988749895
float t = (1f + Mathf.Sqrt(5f)) / 2f;

Vector3[] vertices = {
    new Vector3(-1,  t,  0).normalized,
    new Vector3( 1,  t,  0).normalized,
    new Vector3(-1, -t,  0).normalized,
    new Vector3( 1, -t,  0).normalized,
    new Vector3( 0, -1,  t).normalized,
    new Vector3( 0,  1,  t).normalized,
    new Vector3( 0, -1, -t).normalized,
    new Vector3( 0,  1, -t).normalized,
    new Vector3( t,  0, -1).normalized,
    new Vector3( t,  0,  1).normalized,
    new Vector3(-t,  0, -1).normalized,
    new Vector3(-t,  0,  1).normalized
};

int[] triangles = {
    0, 11, 5,
    0, 5, 1,
    0, 1, 7,
    0, 7, 10,
    0, 10, 11,
    1, 5, 9,
    5, 11, 4,
    11, 10, 2,
    10, 7, 6,
    7, 1, 8,
    3, 9, 4,
    3, 4, 2,
    3, 2, 6,
    3, 6, 8,
    3, 8, 9,
    4, 9, 5,
    2, 4, 11,
    6, 2, 10,
    8, 6, 7,
    9, 8, 1
};

보로노이(Voronoi) 다이어그램은 2차원 평면이나 고차원 공간에서 주어진 점들을 기반으로 분할된 영역을 나타내는 그래픽 표현입니다. 각각의 영역은 입력 점들 중 하나와 연관되어 있으며, 해당 영역의 모든 점은 연관된 입력 점에 가장 가까운 점입니다.

다시 말해, 보로노이 다이어그램은 각 입력 점에 대해 그 점과 가장 가까운 모든 점들의 영역을 정의합니다. 결과적으로, 각 입력 점은 자신만의 고유한 영역을 갖게 되며, 영역들은 서로 겹치지 않습니다.

보로노이 다이어그램은 다양한 분야에서 활용되며, 컴퓨터 그래픽스, 기하학, 지리 정보 시스템(GIS), 로봇 공학 및 통계 등 여러 분야에서 응용되고 있습니다. 주요 사용 사례로는 최근접 이웃 검색, 경계 생성, 영역 분할, 자원 할당 등이 있습니다.

Sphere

Ico Sphere는 일반적으로 이음매가 있는 이십면체(Icosahedron)를 가지고 만들어진 구체입니다. 이 구체는 이십개의 삼각형으로 이루어진 이십면체의 각 면의 중심에서 발생하는 동일한 크기의 삼각형으로 쪼개어진 후, 이들을 서로 연결하여 만듭니다.

Ico Sphere는 경량화된 고체 재료로 제작될 수 있으며, Geodesic Sphere와 같이 강한 구조적 안정성과 견고함을 유지하면서도 내부 공간을 효율적으로 이용할 수 있습니다. 이러한 특성 때문에, Ico Sphere는 3D 모델링 및 컴퓨터 그래픽스에서 자주 사용됩니다.

특히, Ico Sphere는 구를 모사하는 데 사용되는 경우가 많습니다. 구체를 만드는 데 사용되는 전통적인 방법인 구분(구를 육면체로 나누어 그 위에 적절한 수의 삼각형을 그리는 것)에 비해, Ico Sphere는 더 정교한 모델링을 가능하게 하고 표면을 더 자연스럽게 표현할 수 있습니다.

다음은 Unity에서 IcoSphere을 만드는 코드입니다.

using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class IcoSphereGenerator : MonoBehaviour
{
    public int subdivisions = 2;
    public float radius = 1f;

    private Mesh mesh;

    private void Start()
    {
        GenerateIcoSphere();
    }

    private void GenerateIcoSphere()
    {
        gameObject.AddComponent<MeshFilter>();
        gameObject.AddComponent<MeshRenderer>();

        mesh = new Mesh();
        GetComponent<MeshFilter>().mesh = mesh;

        IcoSphere.Create(out List<Vector3> vertices, out List<int> triangles, subdivisions, radius);

        mesh.vertices = vertices.ToArray();
        mesh.triangles = triangles.ToArray();
        mesh.RecalculateNormals();
    }
}

public static class IcoSphere
{
    private static Vector3[] directions = {
        - new Vector3(-1, 1, 1), - new Vector3(1, 1, 1), - new Vector3(-1, -1, 1), - new Vector3(1, -1, 1),
        - new Vector3(-1, 1, -1), - new Vector3(1, 1, -1), - new Vector3(-1, -1, -1), - new Vector3(1, -1, -1)
    };

    public static void Create(out List<Vector3> vertices, out List<int> triangles, int subdivisions, float radius)
    {
        vertices = new List<Vector3>();
        triangles = new List<int>();

        foreach (var direction in directions)
        {
            vertices.Add(direction.normalized * radius);
        }

        triangles.AddRange(new int[] {
            0, 1, 2, 1, 3, 2, 4, 0, 6, 0, 2, 6, 5, 4, 7, 4, 6, 7,
            1, 0, 5, 0, 4, 5, 3, 1, 7, 1, 5, 7, 2, 3, 6, 3, 7, 6
        });
        for (int i = 0; i < subdivisions; i++)
        {
            Subdivide(vertices, triangles);
        }

        for (int i = 0; i < vertices.Count; i++)
        {
            vertices[i] = vertices[i].normalized * radius;
        }
    }

    private static void Subdivide(List<Vector3> vertices, List<int> triangles)
    {
        List<int> newTriangles = new List<int>();

        for (int i = 0; i < triangles.Count; i += 3)
        {
            int a = GetMiddlePoint(triangles[i], triangles[i + 1], vertices);
            int b = GetMiddlePoint(triangles[i + 1], triangles[i + 2], vertices);
            int c = GetMiddlePoint(triangles[i + 2], triangles[i], vertices);

            newTriangles.AddRange(new int[] {
            triangles[i], a, c,
            triangles[i + 1], b, a,
            triangles[i + 2], c, b,
            a, b, c
        });
        }

        triangles.Clear();
        triangles.AddRange(newTriangles);
    }

    private static int GetMiddlePoint(int a, int b, List<Vector3> vertices)
    {
        Vector3 middle = (vertices[a] + vertices[b]) * 0.5f;
        int index = vertices.Count;
        vertices.Add(middle);
        return index;
    }
}

기하학에서 Geodesic Sphere는 공간을 가능한 한 가장 효율적으로 덮는 구조물 중 하나입니다. 이는 주로 정다면체(Platonic Solids)나 정다면체의 변형체를 이용하여 만들어지며, 이들 도형의 모든 면이 같은 크기가 되도록 조합됩니다.

Geodesic Sphere는 고체의 내부 공간을 최대한 이용할 수 있으며, 강한 구조적 안정성과 경량성을 가지고 있습니다. 이러한 특성 때문에, Geodesic Sphere는 우주 탐사선 및 천문학적 관측장비에 사용되는 더 큰 크기의 구조물을 만드는 데도 사용됩니다.

Polygon

기하학에서 세분화(subdivision) 또는 세분화(subdivide)는 기존의 도형이나 메시를 더 작은 도형이나 메시로 분할하는 과정을 의미합니다. 이는 그래픽스, 3D 모델링, 컴퓨터 애니메이션, 게임 개발 등 다양한 분야에서 사용되며, 도형이나 메시의 세부사항을 더 잘 표현하거나, 더 많은 정보를 포함하도록 만들어 주는 기술입니다.

세분화 과정은 각 도형이나 메시의 정점, 에지, 면을 분석하고, 추가적인 정점을 생성한 다음, 이를 사용하여 도형이나 메시를 더 작은 부분으로 나눕니다. 여러 세분화 알고리즘이 있으며, 이들은 각각 다양한 성능 및 품질 특성을 가지고 있습니다.

세분화의 일반적인 예로는 다음과 같은 것들이 있습니다:

  1. 메시 세분화: 3D 메시의 정점, 에지, 면을 분석하여, 메시의 해상도를 높이고, 더 부드러운 표면을 얻기 위해 더 작은 삼각형으로 나눕니다.
  2. 곡선 세분화: 곡선의 정점을 분석하고, 곡선의 해상도를 높이기 위해 추가 정점을 생성합니다. 이를 통해 곡선을 더 많은 선분으로 나눌 수 있으며, 이를 통해 곡선의 표현이 더 부드러워집니다.
  3. 텍스쳐 세분화: 텍스쳐의 해상도를 높이기 위해 텍스쳐를 더 작은 픽셀로 분할하는 과정입니다. 이를 통해 텍스쳐의 세부사항을 더 잘 표현할 수 있습니다.

세분화는 그래픽스 및 모델링 작업에서 더 높은 품질의 결과물을 얻기 위해 핵심적인 기술 중 하나입니다.

다음은 Unity에서 간단한 세분화 알고리즘입니다.

    public static class SubdivideMeshGenerator
    {
        public static Mesh SubdivideMesh(Mesh mesh)
        {
            Vector3[] originalVertices = mesh.vertices;
            int[] originalTriangles = mesh.triangles;

            List<Vector3> newVertices = new List<Vector3>(originalVertices);
            List<int> newTriangles = new List<int>();

            for (int i = 0; i < originalTriangles.Length; i += 3)
            {
                SubdivideTriangle(ref newVertices, ref newTriangles, originalTriangles[i], originalTriangles[i + 1], originalTriangles[i + 2]);
            }

            Mesh newMesh = new Mesh();
            newMesh.vertices = newVertices.ToArray();
            newMesh.triangles = newTriangles.ToArray();
            newMesh.RecalculateNormals();

            return newMesh;
        }

        private static void SubdivideTriangle(ref List<Vector3> vertices, ref List<int> triangles, int a, int b, int c)
        {
            Vector3 ab = (vertices[a] + vertices[b]) * 0.5f;
            Vector3 bc = (vertices[b] + vertices[c]) * 0.5f;
            Vector3 ca = (vertices[c] + vertices[a]) * 0.5f;

            int abIndex = vertices.Count;
            vertices.Add(ab);
            int bcIndex = vertices.Count;
            vertices.Add(bc);
            int caIndex = vertices.Count;
            vertices.Add(ca);

            triangles.Add(a);
            triangles.Add(abIndex);
            triangles.Add(caIndex);

            triangles.Add(abIndex);
            triangles.Add(b);
            triangles.Add(bcIndex);

            triangles.Add(caIndex);
            triangles.Add(bcIndex);
            triangles.Add(c);

            triangles.Add(abIndex);
            triangles.Add(bcIndex);
            triangles.Add(caIndex);
        }
    }

Truncation

다각형의 절단(Truncation)은 기하학에서 다각형의 일부를 제거하여 새로운 다각형을 생성하는 프로세스를 의미합니다. 일반적으로 절단은 다각형의 꼭짓점이나 변을 잘라내거나, 다각형을 분할하는 평면을 사용하여 이루어집니다. 결과적으로 절단된 다각형은 원래 다각형과 다른 형태와 크기를 가지게 됩니다.

3D 그래픽에서 다각형 절단은 메시를 수정하거나 조작하는 데 사용되는 기술 중 하나입니다. 이는 렌더링, 애니메이션, 충돌 감지 및 물리 시뮬레이션과 같은 다양한 애플리케이션에서 사용됩니다.

예를 들어, 평면을 사용하여 다각형을 절단하는 경우, 평면의 한쪽에 있는 모든 꼭짓점과 변을 제거하고, 평면을 따라 새로운 변을 생성하여 완전한 다각형을 얻을 수 있습니다. 이를 통해 원래 메시에서 일부분만을 추출하거나, 두 개의 서로 다른 메시로 분할할 수 있습니다.