using System.Collections; using System.Collections.Generic; using UnityEngine; public class Plot2D : MonoBehaviour { public Function2D Function; public Vector4 ArgsBounds = new Vector4(0, 0, 1, 1); public Vector4 ViewBounds = new Vector4(0, 0, 1, 1); public int USamples = 10; public int VSamples = 10; private Vector3[] _points; private void OnValidate() { if(USamples < 2) { USamples = 2; } if (VSamples < 2) { VSamples = 2; } } private void OnDrawGizmos() { if(Function == null) { return; } var pointsCount = USamples * VSamples; if(_points == null || _points.Length != pointsCount) { _points = new Vector3[USamples * VSamples]; } for (int vI = 0; vI < VSamples; ++vI) { double lV = (double)vI / (VSamples - 1); for (int uI = 0; uI < USamples; ++uI) { double lU = (double)uI / (USamples - 1); double u = lU * ArgsBounds.z + ArgsBounds.x; double v = lV * ArgsBounds.w + ArgsBounds.y; double z = Function.Evaluate(u, v); double x = lU * ViewBounds.z + ViewBounds.x; double y = lV * ViewBounds.w + ViewBounds.y; _points[vI * USamples + uI] = new Vector3((float)x, (float)z, (float)y); } } for(int y = 0; y < VSamples; ++y) { for (int x = 1; x < USamples; ++x) { Gizmos.DrawLine(_points[y * USamples + (x - 1)], _points[y * USamples + x]); } } for (int y = 1; y < VSamples; ++y) { for (int x = 0; x < USamples; ++x) { Gizmos.DrawLine(_points[(y - 1) * USamples + x], _points[y * USamples + x]); } } } }