Skip to content
Snippets Groups Projects
CircleSegmentGenerator.cs 3.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • using System.Collections.Generic;
    
    using UnityEngine;
    
    [RequireComponent(typeof(MeshFilter))]
    public class CircleSegmentGenerator : MonoBehaviour
    {
        public float radius;
        public float height;
    
        private Mesh mesh;
    
        //Every 0.5° of the circle segment, there starts a new triangle
        private float angleAccuracy = 0.5f;
    
        public void setAngle(float angle)
        {
            CreateSegment(angle, radius);
        }
    
        private void CreateSegment(float angle, float radius)
        {
            float absoluteAngle = Mathf.Abs(angle);
            List<Vector3> verticeList = new List<Vector3>();
            List<int> triangleList = new List<int>();
    
            //Center-Point of lower side
            Vector3 center0 = new Vector3(0, 0, 0);
            int center0Index = 0;
            verticeList.Add(center0);
    
            //Center-Point of upper side
            Vector3 center1 = new Vector3(0, height, 0);
            int center1Index = 1;
            verticeList.Add(center1);
    
            float posAngle = absoluteAngle / 2;
            float negAngle = posAngle * -1;
    
            int i = 2;
            for (float x = negAngle; x < posAngle; x += angleAccuracy)
            {
                float nextAngle;
    
                if (x + angleAccuracy > posAngle)
                    nextAngle = posAngle;
                else
                    nextAngle = x + angleAccuracy;
    
                float newPointX = radius * Mathf.Cos(nextAngle * Mathf.Deg2Rad);
                float newPointZ = radius * Mathf.Sin(nextAngle * Mathf.Deg2Rad);
    
    
                if (i == 2)
                {
                    //Add first Points at the beginning of the angle
                    float firstPointX = radius * Mathf.Cos(negAngle * Mathf.Deg2Rad);
                    float firstPointZ = radius * Mathf.Sin(negAngle * Mathf.Deg2Rad);
                    verticeList.Add(new Vector3(firstPointX, 0, firstPointZ));
                    verticeList.Add(new Vector3(firstPointX, height, firstPointZ));
    
                    //Adding triangles for left side
    
                    if (absoluteAngle != 360)
                    {
                        triangleList.Add(center0Index);
                        triangleList.Add(center1Index);
                        triangleList.Add(i + 1);
                        triangleList.Add(center0Index);
                        triangleList.Add(i + 1);
                        triangleList.Add(i);
                    }
    
    
                    i += 2;
                }
    
                verticeList.Add(new Vector3(newPointX, 0, newPointZ));
                verticeList.Add(new Vector3(newPointX, height, newPointZ));
    
                //Adding triangles for upper- and lower-side
                triangleList.Add(center0Index);
                triangleList.Add(i - 2);
                triangleList.Add(i);
                triangleList.Add(center1Index);
                triangleList.Add(i + 1);
                triangleList.Add(i - 1);
                //Adding triangles for front side
                triangleList.Add(i - 2);
                triangleList.Add(i - 1);
                triangleList.Add(i + 1);
                triangleList.Add(i - 2);
                triangleList.Add(i + 1);
                triangleList.Add(i);
    
    
                if (nextAngle == posAngle && absoluteAngle != 360)
    
                {
                    //Adding triangles for right side
                    triangleList.Add(center0Index);
                    triangleList.Add(i + 1);
                    triangleList.Add(center1Index);
                    triangleList.Add(center0Index);
                    triangleList.Add(i);
                    triangleList.Add(i + 1);
                }
    
                i += 2;
            }
    
            mesh = new Mesh();
            mesh.vertices = verticeList.ToArray();
            mesh.triangles = triangleList.ToArray();
            GetComponent<MeshFilter>().mesh = mesh;
            mesh.RecalculateNormals();
        }
    }