コード例 #1
0
        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);
                    }
                }
            }
        }
コード例 #2
0
        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));
                }
            }
        }
コード例 #3
0
        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;
            }
        }