Advertisement
Guest User

Polygon Generator

a guest
Apr 26th, 2022
4,237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.38 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class PolygonGenerator : MonoBehaviour
  6. {
  7.     #region setup
  8.     //mesh properties
  9.     Mesh mesh;
  10.     public Vector3[] polygonPoints;
  11.     public int[] polygonTriangles;
  12.  
  13.     //polygon properties
  14.     public bool isFilled;
  15.     public int polygonSides;
  16.     public float polygonRadius;
  17.     public float centerRadius;
  18.    
  19.     void Start()
  20.     {
  21.         mesh = new Mesh();
  22.         this.GetComponent<MeshFilter>().mesh = mesh;
  23.     }
  24.    
  25.     void Update()
  26.     {
  27.         if(isFilled)
  28.         {
  29.             DrawFilled(polygonSides,polygonRadius);
  30.         }
  31.         else
  32.         {
  33.             DrawHollow(polygonSides, polygonRadius, centerRadius);
  34.         }
  35.     }
  36.     #endregion
  37.  
  38.     void DrawFilled(int sides, float radius)
  39.     {
  40.         polygonPoints = GetCircumferencePoints(sides,radius).ToArray();
  41.         polygonTriangles = DrawFilledTriangles(polygonPoints);
  42.         mesh.Clear();
  43.         mesh.vertices = polygonPoints;
  44.         mesh.triangles = polygonTriangles;
  45.     }
  46.  
  47.     void DrawHollow(int sides, float outerRadius, float innerRadius)
  48.     {
  49.         List<Vector3> pointsList = new List<Vector3>();
  50.         List<Vector3> outerPoints = GetCircumferencePoints(sides,outerRadius);
  51.         pointsList.AddRange(outerPoints);
  52.         List<Vector3> innerPoints = GetCircumferencePoints(sides,innerRadius);
  53.         pointsList.AddRange(innerPoints);
  54.  
  55.         polygonPoints = pointsList.ToArray();
  56.        
  57.         polygonTriangles = DrawHollowTriangles(polygonPoints);
  58.         mesh.Clear();
  59.         mesh.vertices = polygonPoints;
  60.         mesh.triangles = polygonTriangles;
  61.     }
  62.  
  63.     int[] DrawHollowTriangles(Vector3[] points)
  64.     {
  65.         int sides = points.Length/2;
  66.         int triangleAmount = sides*2;
  67.        
  68.         List<int> newTriangles = new List<int>();
  69.         for(int i = 0; i<sides;i++)
  70.         {
  71.             int outerIndex = i;
  72.             int innerIndex = i+sides;
  73.  
  74.             //first triangle starting at outer edge i
  75.             newTriangles.Add(outerIndex);
  76.             newTriangles.Add(innerIndex);
  77.             newTriangles.Add((i+1)%sides);
  78.            
  79.             //second triangle starting at outer edge i
  80.             newTriangles.Add(outerIndex);
  81.             newTriangles.Add(sides+((sides+i-1)%sides));
  82.             newTriangles.Add(outerIndex+sides);
  83.         }
  84.         return newTriangles.ToArray();
  85.     }
  86.    
  87.     List<Vector3> GetCircumferencePoints(int sides, float radius)  
  88.     {
  89.         List<Vector3> points = new List<Vector3>();
  90.         float circumferenceProgressPerStep = (float)1/sides;
  91.         float TAU = 2*Mathf.PI;
  92.         float radianProgressPerStep = circumferenceProgressPerStep*TAU;
  93.        
  94.         for(int i = 0; i<sides; i++)
  95.         {
  96.             float currentRadian = radianProgressPerStep*i;
  97.             points.Add(new Vector3(Mathf.Cos(currentRadian)*radius, Mathf.Sin(currentRadian)*radius,0));
  98.         }
  99.         return points;
  100.     }
  101.    
  102.     int[] DrawFilledTriangles(Vector3[] points)
  103.     {  
  104.         int triangleAmount = points.Length - 2;
  105.         List<int> newTriangles = new List<int>();
  106.         for(int i = 0; i<triangleAmount; i++)
  107.         {
  108.             newTriangles.Add(0);
  109.             newTriangles.Add(i+2);
  110.             newTriangles.Add(i+1);
  111.         }
  112.         return newTriangles.ToArray();
  113.     }
  114. }
  115.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement