using System; using System.Collections.Generic; namespace Science.Mathematics.VectorCalculus { public class LevelCurve { private Function.ToLastType f; private double c; private Domain2D U; public LevelCurve(Function.ToLastType function, double constant, Domain2D domain) { f = function; c = constant; U = domain; } public double Constant { set { c = value; } } private List spx = new List(1); public List CurvePointX { get { return spx; } } private List spy = new List(1); public List CurvePointY { get { return spy; } } public void FindCurve(double meshSize) { int nx = (int)((U.UpperBoundOfX - U.LowerBoundOfX) / meshSize); int ny = (int)((U.UpperBoundOfY - U.LowerBoundOfY) / meshSize); double x, y; double v1, v2, v3; for (int k = 0; k < nx - 1; k++) { for (int m = 0; m < ny - 1; m++) { x = U.LowerBoundOfX + meshSize * k; y = U.LowerBoundOfX + meshSize * m; if (U.Check(x, y)) { v1 = f(x, y) - c; v2 = f(x + meshSize, y) - c; v3 = f(x, y + meshSize) - c; if (v1 * v2 <= 0.0) { spx.Add(x + meshSize * Math.Abs(v1) / (Math.Abs(v1) + Math.Abs(v2))); spy.Add(y); } if (v1 * v3 <= 0.0) { spx.Add(x); spy.Add(y + meshSize * Math.Abs(v1) / (Math.Abs(v1) + Math.Abs(v3))); } } } } } } }