using System.Collections; using System.Collections.Generic; using UnityEngine; public class Trigonometric : MonoBehaviour { Mesh mesh; public int minX; public int maxX; public TriType triType; public float a; public float b; public float factor; public enum TriType { Sin, Cos, Tan } // Start is called before the first frame update void Start() { mesh = new Mesh { name = "Trigonometric" }; } // Update is called once per frame void Update() { } public void DrawTrigonometric() { mesh.Clear(); float step = 0.01f; Vector3[] vectors = new Vector3[100 * (maxX - minX) + 1]; int k = 0; for (float i = minX; i <= maxX; i = i + step) { float y = a * i + b; switch (triType) { case TriType.Sin: y = Mathf.Sin(y); break; case TriType.Cos: y = Mathf.Cos(y); break; case TriType.Tan: y = Mathf.Tan(y); break; default: break; } y *= factor; vectors[k] = new Vector3(i, y, 0); k++; } switch (triType) { case TriType.Sin: vectors[100 * (maxX - minX)] = new Vector3(maxX, Mathf.Sin(a * maxX + b) * factor, 0); break; case TriType.Cos: vectors[100 * (maxX - minX)] = new Vector3(maxX, Mathf.Cos(a * maxX + b) * factor, 0); break; case TriType.Tan: vectors[100 * (maxX - minX)] = new Vector3(maxX, Mathf.Tan(a * maxX + b) * factor, 0); break; default: break; } 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; } public void DrawTrigonometric3D() { mesh.Clear(); float step = 0.01f; Vector3[] vectors = new Vector3[200 * (maxX - minX) + 2]; int k = 0; for (float i = minX; i <= maxX; i = i + step) { float y = a * i + b; switch (triType) { case TriType.Sin: y = Mathf.Sin(y); break; case TriType.Cos: y = Mathf.Cos(y); break; case TriType.Tan: y = Mathf.Tan(y); break; default: break; } y *= factor; vectors[k] = new Vector3(i, y, -5); k++; vectors[k] = new Vector3(i, y, 5); k++; } switch (triType) { case TriType.Sin: vectors[200 * (maxX - minX)] = new Vector3(maxX, Mathf.Sin(a * maxX + b) * factor, -5); vectors[200 * (maxX - minX) + 1] = new Vector3(maxX, Mathf.Sin(a * maxX + b) * factor, 5); break; case TriType.Cos: vectors[200 * (maxX - minX)] = new Vector3(maxX, Mathf.Cos(a * maxX + b) * factor, -5); vectors[200 * (maxX - minX) + 1] = new Vector3(maxX, Mathf.Cos(a * maxX + b) * factor, 5); break; case TriType.Tan: vectors[200 * (maxX - minX)] = new Vector3(maxX, Mathf.Tan(a * maxX + b) * factor, -5); vectors[200 * (maxX - minX) + 1] = new Vector3(maxX, Mathf.Tan(a * maxX + b) * factor, 5); break; default: break; } mesh.vertices = vectors; Vector2[] uvs = new Vector2[vectors.Length]; for (int i = 0; i < uvs.Length; i++) { uvs[i] = new Vector2(0, vectors[i].y / 100); } mesh.uv = uvs; int[] triangle = new int[100 * (maxX - minX) * 6]; for (int i = 0; i < 100 * (maxX - minX); ++i) { if(vectors[2 * i].y * vectors[2 * i + 2].y >= 0) { triangle[6 * i] = 2 * i; triangle[6 * i + 1] = 2 * i + 1; triangle[6 * i + 2] = 2 * i + 2; triangle[6 * i + 3] = 2 * i + 1; triangle[6 * i + 4] = 2 * i + 3; triangle[6 * i + 5] = 2 * i + 2; } else { triangle[6 * i] = 2 * i; triangle[6 * i + 1] = 2 * i + 1; triangle[6 * i + 2] = 2 * i; triangle[6 * i + 3] = 2 * i + 3; triangle[6 * i + 4] = 2 * i + 3; triangle[6 * i + 5] = 2 * i + 2; } } mesh.SetIndices(triangle, MeshTopology.Triangles, 0); GetComponent().mesh = mesh; } public void MeshClear() { mesh.Clear(); GetComponent().mesh = mesh; } }