70 lines
1.8 KiB
C#
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]);
|
|
}
|
|
}
|
|
}
|
|
}
|