Example #1
0
        private void drawGraph()
        {
            try
            {
                Bitmap   bmpGraphs = new Bitmap(pbox.Width, pbox.Height);
                Graphics g         = Graphics.FromImage(bmpGraphs);
                g.Clear(Color.White);
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Low;
                for (int i = 0; i < Edges.Count(); i++)
                {
                    for (int j = 0; j < Edges[i].Count(); j++)
                    {
                        if (!directed || !Edges[i][j].isOpposed)
                        {
                            Pen        linePen      = new Pen(Color.DarkBlue);
                            SolidBrush brushArrow   = new SolidBrush(Color.DarkBlue);
                            SolidBrush brushEllipse = new SolidBrush(Color.White);
                            SolidBrush brushString  = new SolidBrush(Color.Black);
                            linePen.Width = 5;
                            if (Edges[i][j].visited)
                            {
                                linePen.Color     = Color.LightSkyBlue;
                                brushArrow.Color  = Color.LightSkyBlue;
                                brushString.Color = Color.LightSkyBlue;
                            }
                            if (Edges[i][j].selected)
                            {
                                linePen.Color     = Color.DarkRed;
                                brushArrow.Color  = Color.DarkRed;
                                brushString.Color = Color.DarkRed;
                            }
                            PointF firstPoint   = Vertexes[i].position;
                            PointF secondPoint  = Vertexes[Edges[i][j].destination].position;
                            PointF middlePoint  = ExtraMath.GetMiddlePoint(firstPoint, secondPoint);
                            PointF quarterPoint = ExtraMath.GetMiddlePoint(middlePoint, secondPoint);
                            try
                            {
                                g.DrawLine(linePen, firstPoint, secondPoint);
                            }
                            catch { }
                            if (directed)
                            {
                                double   thetaLeft     = ExtraMath.ToRadians(150);
                                double   thetaRight    = ExtraMath.ToRadians(210);
                                PointF   rotationPoint = ExtraMath.GetPointAlongLine(quarterPoint, firstPoint, 25);
                                PointF   leftPart      = ExtraMath.RotateAroundPoint(quarterPoint, rotationPoint, thetaLeft);
                                PointF   rightPart     = ExtraMath.RotateAroundPoint(quarterPoint, rotationPoint, thetaRight);
                                PointF[] arrow         = { quarterPoint, leftPart, rightPart, quarterPoint };
                                try
                                {
                                    g.FillPolygon(brushArrow, arrow, System.Drawing.Drawing2D.FillMode.Alternate);
                                }
                                catch { }
                            }
                            if (weighted)
                            {
                                try
                                {
                                    g.FillEllipse(brushEllipse, middlePoint.X - 15, middlePoint.Y - 15, 30, 30);
                                    g.DrawString(Edges[i][j].weight.ToString(), new Font("Adobe Gothic Std B", 14),
                                                 brushString, middlePoint.X - 10, middlePoint.Y - 10);
                                }
                                catch { }
                            }
                        }
                    }
                }
                foreach (Vertex v in Vertexes)
                {
                    SolidBrush brushVertex = new SolidBrush(Color.Blue);
                    SolidBrush brushText   = new SolidBrush(Color.White);
                    if (v.visited)
                    {
                        brushVertex.Color = Color.LightSkyBlue;
                    }
                    if (v.selected)
                    {
                        brushVertex.Color = Color.DarkRed;
                    }
                    try
                    {
                        g.FillEllipse(brushVertex, v.position.X - VertexRadius, v.position.Y - VertexRadius, VertexRadius * 2, VertexRadius * 2);
                        g.DrawString(v.distance.ToString(), new Font("Adobe Gothic Std B", 15), brushText, v.position.X - VertexRadius + 10, v.position.Y - VertexRadius + 10);
                    }
                    catch { }
                }

                try
                {
                    pbox.Image = bmpGraphs;
                    pbox.Update();
                }
                catch
                {
                }
                GC.Collect();
                System.Threading.Thread.Sleep(10);
            }
            catch
            {
            }
        }
        public void DisplaySort()
        {
            if (Reversed)
            {
                numbers.Reverse();
            }

            try
            {
                if (Type != VisualTypes.Bars)
                {
                    bmp = new Bitmap(mainForm.pbox_sorts.Width * 2, mainForm.pbox_sorts.Height * 2);
                }
                else
                {
                    bmp = new Bitmap(1100, 1100);
                }
                Graphics g = Graphics.FromImage(bmp);
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Low;
                g.Clear(Color.White);
                float space = 1;
                Int16 drawn = 0;
                switch (Type)
                {
                case VisualTypes.Bars:
                    space = (float)bmp.Size.Width / size;
                    break;

                case VisualTypes.Spiral:
                    space = (float)360 / size;
                    break;

                case VisualTypes.Pyramid:
                    space = (float)bmp.Size.Height / size;
                    break;
                }
                SolidBrush brsh = new SolidBrush(Color.Blue);
                for (int j = 0; j < numbers.Count; j++)
                {
                    Int16 i = numbers[j];
                    if (numbers.isSelected(j))
                    {
                        brsh.Color = Color.Red;
                    }
                    else if (Colored)
                    {
                        int value = (int)ExtraMath.MapNumberToRange <float>((float)i, (float)0, (float)maxValue, (float)0, (float)255);
                        brsh.Color = Color.FromArgb(0, 0, 255 - value);
                    }
                    else
                    {
                        brsh.Color = Color.Blue;
                    }
                    float      mapped;
                    RectangleF rect;
                    switch (Type)
                    {
                    case VisualTypes.Bars:
                        mapped = ExtraMath.MapNumberToRange <float>((float)i, (float)0, (float)maxValue, (float)0, (float)bmp.Height);
                        rect   = new RectangleF((float)space * drawn, bmp.Height - mapped, (float)space - 0, mapped);
                        g.FillRectangle(brsh, rect);
                        break;

                    case VisualTypes.Spiral:
                        mapped = ExtraMath.MapNumberToRange <float>((float)i, (float)minValue, (float)maxValue, (float)0, (float)Math.Min(bmp.Width / 2, bmp.Height / 2));
                        PointF   Point1 = ExtraMath.GetPointAlongTrajectory(new PointF(bmp.Width / 2, bmp.Height / 2), ExtraMath.ToRadians(drawn * space), 10);
                        PointF   Point2 = ExtraMath.GetPointAlongTrajectory(new PointF(bmp.Width / 2, bmp.Height / 2), ExtraMath.ToRadians(drawn * (space)), mapped + 10);
                        PointF   Point3 = ExtraMath.GetPointAlongTrajectory(new PointF(bmp.Width / 2, bmp.Height / 2), ExtraMath.ToRadians((drawn + 1) * (space) - 0.1), mapped + 10);
                        PointF[] Points = { Point1, Point2, Point3 };
                        g.FillPolygon(brsh, Points);
                        break;

                    case VisualTypes.Pyramid:
                        mapped = ExtraMath.MapNumberToRange <float>((float)i, (float)0, (float)maxValue, (float)0, (float)bmp.Width / 2);
                        rect   = new RectangleF(mapped, (drawn + 1) * space, bmp.Width - mapped - mapped, space);
                        g.FillRectangle(brsh, rect);
                        break;
                    }

                    drawn++;
                }
                try
                {
                    mainForm.pbox_sorts.Image = bmp;
                    mainForm.pbox_sorts.Update();
                }
                catch
                { }
                System.Threading.Thread.Sleep(20);
            }
            catch { }
            if (Reversed)
            {
                numbers.Reverse();
            }
            GC.Collect();
        }