Ejemplo n.º 1
0
            public TaxonCircularInfo TaxonNextPoint()
            {
                TaxonCircularInfo result = new TaxonCircularInfo {
                    Angle = CurrentIndex * AnglePerTaxon
                };

                CurrentIndex++;
                result.Dx = Math.Cos(result.Angle);
                result.Dy = Math.Sin(result.Angle);
                result.X  = CenterX + result.Dx * Radius;
                result.Y  = CenterY + result.Dy * Radius;
                result.Nx = -result.Dy;
                result.Ny = result.Dx;

                double dx = TaxonHeightO2 * result.Nx;
                double dy = TaxonHeightO2 * result.Ny;

                result.Points      = new PointF[4];
                result.Points[0].X = (float)(result.X + dx);
                result.Points[0].Y = (float)(result.Y + dy);
                result.Points[3].X = (float)(result.X - dx);
                result.Points[3].Y = (float)(result.Y - dy);
                //dx = TaxonWidth * result.Dx;
                //dy = TaxonWidth * result.Dy;
                dx = 10 * result.Dx;
                dy = 10 * result.Dy;
                result.Points[1].X = (float)(result.Points[0].X + dx);
                result.Points[1].Y = (float)(result.Points[0].Y + dy);
                result.Points[2].X = (float)(result.Points[3].X + dx);
                result.Points[2].Y = (float)(result.Points[3].Y + dy);

                result.InternalPoint = false;
                result.LengthBefore  = (float)(DemiRadiusPart + (TaxonMaxLevel - CurrentLevel - 1) * RadiusPart);

                float xmin = result.Points[0].X, xmax = xmin, ymin = result.Points[0].Y, ymax = ymin;

                for (int i = 1; i < 4; i++)
                {
                    if (result.Points[i].X < xmin)
                    {
                        xmin = result.Points[i].X;
                    }
                    if (result.Points[i].X > xmax)
                    {
                        xmax = result.Points[i].X;
                    }
                    if (result.Points[i].Y < ymin)
                    {
                        ymin = result.Points[i].Y;
                    }
                    if (result.Points[i].Y > ymax)
                    {
                        ymax = result.Points[i].Y;
                    }
                }
                result.Bounds = Rectangle.FromLTRB((int)xmin, (int)ymin, (int)xmax, (int)ymax);

                return(result);
            }
Ejemplo n.º 2
0
            public TaxonCircularInfo TaxonInternalPoint(double angle1, double angle2, int _level)
            {
                TaxonCircularInfo result = new TaxonCircularInfo {
                    Angle = (angle1 + angle2) / 2
                };

                result.Dx = Math.Cos(result.Angle);
                result.Dy = Math.Sin(result.Angle);
                result.X  = CenterX + result.Dx * RadiusPerLevel[_level];
                result.Y  = CenterY + result.Dy * RadiusPerLevel[_level];
                result.Nx = -result.Dy;
                result.Ny = result.Dx;

                result.InternalPoint = true;

                double angleStep = 0.01f;
                float  radius    = (float)(RadiusPerLevel[_level] + DemiRadiusPart);
                int    nb        = (int)((angle2 - angle1) / angleStep);

                if (nb > 0)
                {
                    angleStep = (angle2 - angle1);
                    if (angleStep < 0)
                    {
                        angleStep += Math.PI * 2;
                    }
                    angleStep /= nb;
                    nb--;
                }

                result.Points = new PointF[nb + 2];
                float x = (float)Math.Cos(angle1);
                float y = (float)Math.Sin(angle1);

                result.Points[0].X = (float)(CenterX + x * radius);
                result.Points[0].Y = (float)(CenterY + y * radius);

                for (int i = 1; i <= nb; i++)
                {
                    float angle = (float)(angle1 + angleStep * i);
                    x = (float)Math.Cos(angle);
                    y = (float)Math.Sin(angle);
                    result.Points[i].X = (float)(CenterX + x * radius);
                    result.Points[i].Y = (float)(CenterY + y * radius);
                }
                x = (float)Math.Cos(angle2);
                y = (float)Math.Sin(angle2);
                result.Points[nb + 1].X = (float)(CenterX + x * radius);
                result.Points[nb + 1].Y = (float)(CenterY + y * radius);

                result.LengthBefore = (float)(DemiRadiusPart + (TaxonMaxLevel - _level) * radius);

                return(result);
            }
Ejemplo n.º 3
0
        void ComputeLayoutCircularInternal(CircularParams _cp)
        {
            if (WidthWithChildren == R.Width)
            {
                CircularInfo = _cp.TaxonNextPoint();
                return;
            }

            if (Children.Count == 0)
            {
                CircularInfo = null;
                return;
            }

            _cp.TaxonLevelUp();

            int xmin = int.MaxValue;
            int xmax = int.MinValue;
            int ymin = int.MaxValue;
            int ymax = int.MinValue;

            foreach (TaxonTreeNode child in Children)
            {
                child.ComputeLayoutCircularInternal(_cp);
                if (child.CircularInfo.Bounds.Left < xmin)
                {
                    xmin = child.CircularInfo.Bounds.Left;
                }
                if (child.CircularInfo.Bounds.Right > xmax)
                {
                    xmax = child.CircularInfo.Bounds.Right;
                }
                if (child.CircularInfo.Bounds.Top < ymin)
                {
                    ymin = child.CircularInfo.Bounds.Top;
                }
                if (child.CircularInfo.Bounds.Bottom > ymax)
                {
                    ymax = child.CircularInfo.Bounds.Bottom;
                }
            }
            _cp.TaxonLevelDown();

            double firstAngle  = Children[0].CircularInfo.Angle;
            double secondAngle = Children[Children.Count - 1].CircularInfo.Angle;

            CircularInfo = _cp.TaxonInternalPoint(firstAngle, secondAngle, _cp.CurrentLevel);
            if (CircularInfo.X < xmin)
            {
                xmin = (int)CircularInfo.X;
            }
            if (CircularInfo.X > xmax)
            {
                xmax = (int)CircularInfo.X;
            }
            if (CircularInfo.Y < ymin)
            {
                ymin = (int)CircularInfo.Y;
            }
            if (CircularInfo.Y > ymax)
            {
                ymax = (int)CircularInfo.Y;
            }
            CircularInfo.Bounds = Rectangle.FromLTRB(xmin, ymin, xmax, ymax);
        }