static void Main(string[] args) { //int h, int w, int n, int seed ProblemMap pm = new ProblemMap(5, 5, 5, 2); int x = 1; var x1 = new Point(3, 4); var x2 = new Point(0, 2); var xd = new LinearParameters(x2, x1); foreach (var item in pm.vertices) { Console.WriteLine(item.Point.X + " : " + item.Point.Y); } pm.RandomizeConnections(ref pm.vertices); var verticesAll = pm.SetColors(3); //int ind = 1; for (int i = 0; i < verticesAll.Count; i++) { Console.WriteLine("\n\n\n\n"); foreach (var item in verticesAll[i]) { Console.WriteLine("\n" + i + ". point | " + item.Point.X + " : " + item.Point.Y + " | C: " + item.Color); foreach (var item2 in item.Neighbors) { Console.WriteLine(item2.Point.X + " : " + item2.Point.Y + " | C: " + item2.Color); } } } }
private void SmoothEntireTree(double treeHeight, LinearParameters treeRadiusParameters) { var nodes = GetAllNodesAsVector(); var heights = nodes.Select(x => x.Center.Z).ToArray(); Point previousFirstFocal = null; var firstFocis = new List <Point>(); var secondFocis = new List <Point>(); foreach (var node in nodes) { if (previousFirstFocal == null) { firstFocis.Add(node.Ellipse.FirstFocal); secondFocis.Add(node.Ellipse.SecondFocal); previousFirstFocal = node.Ellipse.FirstFocal; continue; } var dist1 = Distance(previousFirstFocal, node.Ellipse.FirstFocal, EuclideanSquare, EDimension.X, EDimension.Y); var dist2 = Distance(previousFirstFocal, node.Ellipse.SecondFocal, EuclideanSquare, EDimension.X, EDimension.Y); var dist1LessDist2 = dist1 < dist2; previousFirstFocal = dist1LessDist2 ? node.Ellipse.FirstFocal : node.Ellipse.SecondFocal; firstFocis.Add(dist1LessDist2 ? node.Ellipse.FirstFocal : node.Ellipse.SecondFocal); secondFocis.Add(dist1LessDist2 ? node.Ellipse.SecondFocal : node.Ellipse.FirstFocal); } var xp1 = Regression(heights, firstFocis.Select(p => p.X).ToArray()); var yp1 = Regression(heights, firstFocis.Select(p => p.Y).ToArray()); var xp2 = Regression(heights, secondFocis.Select(p => p.X).ToArray()); var yp2 = Regression(heights, secondFocis.Select(p => p.Y).ToArray()); foreach (var node in nodes) { var height = node.Center.Z; if (node.Ellipse == null) { node.Ellipse = new Ellipsis( new Point(xp1.A * height + xp1.B, yp1.A * height + yp1.B, height), new Point(xp2.A * height + xp2.B, yp2.A * height + yp2.B, height), 0.0); node.ApproximateEllipse(treeHeight - height, treeRadiusParameters); } else { node.Ellipse.SetFirstFocal(EDimension.X, (float)(xp1.A * height + xp1.B)); node.Ellipse.SetFirstFocal(EDimension.Y, (float)(yp1.A * height + yp1.B)); node.Ellipse.SetSecondFocal(EDimension.X, (float)(xp2.A * height + xp2.B)); node.Ellipse.SetSecondFocal(EDimension.Y, (float)(yp2.A * height + yp2.B)); } } }
private static void RegressSectionEllipses(double treeHeight, Node highest, LinearParameters treeRadiusParameters) { var current = highest.Parent; while (current != null) { if (current.Ellipse == null && treeHeight - current.Center.Z > 0) { current.ApproximateEllipse(treeHeight - current.Center.Z, treeRadiusParameters); } current = current.Parent; } }