Files
2025-05-13 04:46:54 +03:00

70 lines
1.8 KiB
C#

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]);
}
}
}
}