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