using System.Collections; using System.Collections.Generic; using UnityEngine; public class InverseTri : MonoBehaviour { Mesh mesh; public int minX; public int maxX; public enum InverseTriTpye { Arcsin, Arccos, Arctan } public InverseTriTpye inverseTriTpye; // Start is called before the first frame update void Start() { mesh = new Mesh { name = "InverseTri" }; } // Update is called once per frame void Update() { } public void DrawInverseTri() { mesh.Clear(); if(inverseTriTpye != InverseTriTpye.Arctan) { float step = 0.01f; Vector3[] vectors = new Vector3[100 * 2 + 1]; int k = 0; for (float i = -1; i <= 1; i = i + step) { float y = i; switch (inverseTriTpye) { case InverseTriTpye.Arcsin: y = Mathf.Asin(y); break; case InverseTriTpye.Arccos: y = Mathf.Acos(y); break; default: break; } vectors[k] = new Vector3(i, y, 0); k++; } switch (inverseTriTpye) { case InverseTriTpye.Arcsin: vectors[100 * 2] = new Vector3(1, Mathf.Asin(1), 0); break; case InverseTriTpye.Arccos: vectors[100 * 2] = new Vector3(1, Mathf.Acos(1), 0); break; default: break; } mesh.vertices = vectors; int[] triangle = new int[100 * 2 * 2]; for (int i = 0; i < vectors.Length - 1; ++i) { if (vectors[i].y * vectors[i + 1].y >= 0) { triangle[2 * i] = i; triangle[2 * i + 1] = i + 1; } else { triangle[2 * i] = i; triangle[2 * i + 1] = i; } } mesh.SetIndices(triangle, MeshTopology.Lines, 0); } else { float step = 0.01f; Vector3[] vectors = new Vector3[100 * (maxX - minX) + 1]; int k = 0; for (float i = -1; i <= 1; i = i + step) { float y = i; y = Mathf.Atan(y); vectors[k] = new Vector3(i, y, 0); k++; } vectors[100 * (maxX - minX)] = new Vector3(maxX, Mathf.Atan(maxX), 0); mesh.vertices = vectors; int[] triangle = new int[100 * (maxX - minX) * 2]; for (int i = 0; i < vectors.Length - 1; ++i) { if (vectors[i].y * vectors[i + 1].y >= 0) { triangle[2 * i] = i; triangle[2 * i + 1] = i + 1; } else { triangle[2 * i] = i; triangle[2 * i + 1] = i; } } mesh.SetIndices(triangle, MeshTopology.Lines, 0); } GetComponent().mesh = mesh; } }