using System;
using System.Collections.Generic;
namespace Science.Mathematics.PartialDifferentialEquation
{
///
/// Present an equal value surface for a given 3d solution and a value.
///
public class EqualValueSurface
{
public EqualValueSurface()
{
}
public EqualValueSurface(double[,,] solution)
{
solution3D = solution;
}
public EqualValueSurface(double[,,] solution, double equalValue)
{
solution3D = solution;
val = equalValue;
}
double[,,] solution3D;
public double[,,] Solution3D
{
set { solution3D = value; }
}
private double val;
public double EqualValue
{
set { val = value; }
}
private List spx = new List();
public List SurfacePointX
{
get { return spx; }
}
private List spy = new List();
public List SurfacePointY
{
get { return spy; }
}
private List spz = new List();
public List SurfacePointZ
{
get { return spz; }
}
private double v1, v2, v3, v4;
public void FindSurface()
{
for (int k = 3; k < solution3D.GetLength(0)-4; k++)
{
for (int m = 3; m < solution3D.GetLength(1)-4; m++)
{
for (int n = 3; n < solution3D.GetLength(2)-4; n++)
{
v1 = solution3D[k, m, n] - val;
v2 = solution3D[k + 1, m, n] - val;
v3 = solution3D[k, m + 1, n] - val;
v4 = solution3D[k, m, n + 1] - val;
if (v1 * v2 < 0.0)
{
spx.Add((double)k + Math.Abs(v1) / (Math.Abs(v1) + Math.Abs(v2)));
spy.Add((double)m);
spz.Add((double)n);
}
if (v1 * v3 < 0.0)
{
spx.Add((double)k);
spy.Add((double)m + Math.Abs(v1) / (Math.Abs(v1) + Math.Abs(v3)));
spz.Add((double)n);
}
if (v1 * v4 < 0.0)
{
spx.Add((double)k);
spy.Add((double)m);
spz.Add((double)n + Math.Abs(v1) / (Math.Abs(v1) + Math.Abs(v4)));
}
}
}
}
}
}
}