private void DrawNextLayer(int[,] matrix, int[] topHorizonHeight, int[] bottomHorizonHeight, ProjectionBounds bounds, Params parameters, Func <int, int, double> GetX, Func <int, int, double> GetY, int iteration) { var points = GetNewLine(matrix, parameters, iteration, bounds, GetX, GetY); var resultPoints = DrawContinuousLine(points, topHorizonHeight, bottomHorizonHeight); foreach (var point in resultPoints) { PutPixel(matrix, point, point.Color); } }
private ProjectionBounds GetBounds(Params parameters, Func <int, int, double> GetX, Func <int, int, double> GetY) { var bounds = new ProjectionBounds(); for (var i = 0; i < parameters.n; i++) { for (var j = 0; j < parameters.m; j++) { var x = GetX(i, j); var y = GetY(i, j); var z = parameters.Function(x, y); var currentPoint = new PointDouble(x, y, z, parameters); bounds.MaxX = Math.Max(bounds.MaxX, currentPoint.X); bounds.MaxY = Math.Max(bounds.MaxY, currentPoint.Y); bounds.MinX = Math.Min(bounds.MinX, currentPoint.X); bounds.MinY = Math.Min(bounds.MinY, currentPoint.Y); } } return(bounds); }
private List <PointInt> GetNewLine(int[, ] matrix, Params parameters, int iteration, ProjectionBounds bounds, Func <int, int, double> GetX, Func <int, int, double> GetY) { var result = new List <PointInt>(); for (var i = 0; i < parameters.m; i++) { var x = GetX(iteration, i); var y = GetY(iteration, i); var z = parameters.Function(x, y); var currentPointDouble = new PointDouble(x, y, z, parameters); var transformed = new PointDouble() { X = (currentPointDouble.X - bounds.MinX) / (bounds.MaxX - bounds.MinX) * (parameters.Width - 1), Y = (currentPointDouble.Y - bounds.MinY) / (bounds.MaxY - bounds.MinY) * (parameters.Height - 1) }; result.Add(new PointInt(transformed)); } return(result); }