コード例 #1
0
        public void ZoomPlot(bool zoom)
        {
            double k = 1.5;

            if (zoom)
            {
                counter++;

                PointF center0_cont = new PointF(gr.pt2.X + (gr.pt3.X - gr.pt2.X) / 2, gr.pt1.Y - (gr.pt1.Y - gr.pt2.Y) / 2);
                PointF center0_dec  = gr.ConvertValues(center0_cont, CoordType.GetRectangleCoord);

                gr.Config.PriceForPointOX = gr.Config.PriceForPointOX / k;
                gr.Config.PriceForPointOY = gr.Config.PriceForPointOY / k;

                PointF center1_cont = gr.ConvertValues(center0_dec, CoordType.GetControlCoord);
                PointF vector       = new PointF(center1_cont.X - center0_cont.X, center1_cont.Y - center0_cont.Y);
                gr.RealCenter = new Point(gr.RealCenter.X - (int)vector.X, gr.RealCenter.Y - (int)vector.Y);
            }
            else
            {
                PointF center0_cont = new PointF(gr.pt2.X + (gr.pt3.X - gr.pt2.X) / 2, gr.pt1.Y - (gr.pt1.Y - gr.pt2.Y) / 2);
                PointF center0_dec  = gr.ConvertValues(center0_cont, CoordType.GetRectangleCoord);

                gr.Config.PriceForPointOX = gr.Config.PriceForPointOX * k;
                gr.Config.PriceForPointOY = gr.Config.PriceForPointOY * k;

                PointF center1_cont = gr.ConvertValues(center0_dec, CoordType.GetControlCoord);
                PointF vector       = new PointF(center1_cont.X - center0_cont.X, center1_cont.Y - center0_cont.Y);
                gr.RealCenter = new Point(gr.RealCenter.X - (int)vector.X, gr.RealCenter.Y - (int)vector.Y);
            }
        }
コード例 #2
0
        private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
        {
            //Рисование фигуры
            if (drawingLine || drawingEllipse)
            {
                if (numPt < 2)
                {
                    numPt++;
                    if (numPt == 1)
                    {
                        First = e.Location;
                    }
                    else
                    {
                        Second = e.Location;
                    }
                }
                if (numPt == 2)
                {
                    if (drawingLine)
                    {
                        Line line;
                        if (drawingArrow)
                        {
                            line         = new Line(First, Second, Color.Black, pictureBox1, true, "lineArrow" + Figure.Lines.Count);
                            drawingArrow = false;
                            drawingLine  = false;
                            стрелкаToolStripMenuItem.Checked = false;
                        }
                        else
                        {
                            line        = new Line(First, Second, Color.Black, pictureBox1, false, "line" + Figure.Lines.Count);
                            drawingLine = false;
                            линияToolStripMenuItem.Checked = false;
                        }

                        Figure.Lines.Add(line);
                        numPt = 0;
                        pictureBox1.Cursor = Cursors.Default;
                        return;
                    }
                    else if (drawingEllipse)
                    {
                        Ellipse ellipse;
                        if (drawingRect)
                        {
                            ellipse     = new Ellipse(First, Second, Color.Red, pictureBox1, "ellipse" + Figure.Ellipses.Count, true);
                            drawingRect = false;
                            прямоугольникToolStripMenuItem.Checked = false;
                        }
                        else
                        {
                            ellipse = new Ellipse(First, Second, Color.Red, pictureBox1, "ellipse" + Figure.Ellipses.Count, false);
                            эллипсToolStripMenuItem.Checked = false;
                        }
                        Figure.Ellipses.Add(ellipse);
                        numPt              = 0;
                        drawingEllipse     = false;
                        pictureBox1.Cursor = Cursors.Default;
                        return;
                    }
                }
                return;
            }

            //Рассчёт площади под графиком
            if (CountSquare)
            {
                Graphics g = pictureBox1.CreateGraphics();

                int MouseX = e.X;
                if (Lines < 2)
                {
                    g.DrawLine(new Pen(Color.Black), MouseX, pictureBox1.Height, MouseX, 0);
                    Lines++;
                    if (Lines == 1)
                    {
                        firstX = MouseX;
                    }
                    else
                    {
                        secondX = MouseX;
                    }
                }
                if (Lines == 2)
                {
                    int x1, x2; //пределы интегрирования в координатах pictureBox
                    if (secondX > firstX)
                    {
                        x1 = firstX;
                        x2 = secondX;
                    }
                    else if (firstX > secondX)
                    {
                        x1 = secondX;
                        x2 = firstX;
                    }
                    else
                    {
                        MessageBox.Show("Недопустимый интервал!");
                        return;
                    }
                    //ValueX1, ValueX2 - пределы интегрирования в прямоугольной системе координат
                    double       ValueX1 = Math.Round((x1 - graph.RealCenter.X) * graph.Config.PriceForPointOX / graph.Config.StepOX, 1);
                    double       ValueX2 = Math.Round((x2 - graph.RealCenter.X) * graph.Config.PriceForPointOX / graph.Config.StepOX, 1);
                    DialogResult result  =
                        MessageBox.Show("Вы действительно хотите расчитать площадь под кривой на интервале от " + ValueX1.ToString() + " до " + ValueX2.ToString() + "?",
                                        "Рассчёт площади под кривой", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (result == DialogResult.Yes)
                    {
                        // строка названий кривых для формы
                        string[] a = new string[graph.GraphCurves.Count];
                        for (int k = 0; k < graph.GraphCurves.Count; k++)
                        {
                            a[k] = graph.GraphCurves[k].Legend;
                        }
                        CountSquare_AskingForm af = new CountSquare_AskingForm(a);
                        af.ShowDialog();

                        int      n = 5000;
                        Graphics g1 = pictureBox1.CreateGraphics();
                        PointF[] polygon = new PointF[4];
                        double   X1Poly, X2Poly, Y1Poly, Y2Poly;
                        double   delta = (ValueX2 - ValueX1) / n;
                        double   square = 0;
                        double   X1 = 0, Y1 = 0, X2 = 0, Y2 = 0;

                        for (int i = 0; i < n; i++)
                        {
                            X1           = ValueX1 + delta * i;
                            X1Poly       = graph.RealCenter.X + X1 * graph.Config.StepOX / graph.Config.PriceForPointOX;
                            polygon[0].X = (float)X1Poly; polygon[0].Y = graph.RealCenter.Y;

                            foreach (Curves curve in graph.GraphCurves)
                            {
                                if (curve.Legend == CountSquare_AskingForm.Answer)
                                {
                                    for (int j = 0; j < curve.PointsToDraw.Length; j++)
                                    {
                                        if (curve.PointsToDraw[0].X > X1)
                                        {
                                            break;
                                        }
                                        else if (curve.PointsToDraw[j].X == X1)
                                        {
                                            Y1           = Math.Round(curve.PointsToDraw[j].Y, 2);
                                            Y1Poly       = graph.RealCenter.Y - Y1 * graph.Config.StepOY / graph.Config.PriceForPointOY;
                                            polygon[1].X = polygon[0].X; polygon[1].Y = (float)Y1Poly;
                                            break;
                                        }
                                        else if (curve.PointsToDraw[j].X > X1)
                                        {
                                            Y1 = (curve.PointsToDraw[j].Y - curve.PointsToDraw[j - 1].Y) / (curve.PointsToDraw[j].X - curve.PointsToDraw[j - 1].X) *
                                                 (X1 - curve.PointsToDraw[j - 1].X) + curve.PointsToDraw[j - 1].Y;
                                            Y1Poly       = graph.RealCenter.Y - Y1 * graph.Config.StepOY / graph.Config.PriceForPointOY;
                                            polygon[1].X = polygon[0].X; polygon[1].Y = (float)Y1Poly;
                                            break;
                                        }
                                    }
                                }
                            }

                            X2           = X1 + delta;
                            X2Poly       = graph.RealCenter.X + X2 * graph.Config.StepOX / graph.Config.PriceForPointOX;
                            polygon[3].X = (float)X2Poly; polygon[3].Y = graph.RealCenter.Y;

                            foreach (Curves curve in graph.GraphCurves)
                            {
                                if (curve.Legend == CountSquare_AskingForm.Answer)
                                {
                                    for (int j = 0; j < curve.PointsToDraw.Length; j++)
                                    {
                                        if (curve.PointsToDraw[0].X > X2)
                                        {
                                            break;
                                        }
                                        else if (curve.PointsToDraw[j].X == X2)
                                        {
                                            Y2           = Math.Round(curve.PointsToDraw[j].Y, 2);
                                            Y2Poly       = graph.RealCenter.Y - Y2 * graph.Config.StepOY / graph.Config.PriceForPointOY;
                                            polygon[1].X = polygon[3].X; polygon[1].Y = (float)Y2Poly;
                                            break;
                                        }
                                        else if (curve.PointsToDraw[j].X > X2)
                                        {
                                            Y2 = (curve.PointsToDraw[j].Y - curve.PointsToDraw[j - 1].Y) / (curve.PointsToDraw[j].X - curve.PointsToDraw[j - 1].X) *
                                                 (X2 - curve.PointsToDraw[j - 1].X) + curve.PointsToDraw[j - 1].Y;
                                            Y2Poly       = graph.RealCenter.Y - Y2 * graph.Config.StepOY / graph.Config.PriceForPointOY;
                                            polygon[2].X = polygon[3].X; polygon[2].Y = (float)Y2Poly;
                                            break;
                                        }
                                    }
                                }
                            }
                            double k = (Y2 + Y1) * delta / 2;
                            square += k;
                            g.FillPolygon(new SolidBrush(Color.FromArgb(120, 255, 0, 0)), polygon);
                        }
                        MessageBox.Show("Square: " + Math.Round(square, 2) + " sq. un.");
                        Lines  = 0;
                        firstX = secondX = 0;
                        рассчитатьПлощадьПодКривойToolStripMenuItem.Checked = false;
                        CountSquare = false;
                        graph.DrawDiagram();
                        return;
                    }
                    else if (result == DialogResult.No)
                    {
                        Lines  = 0;
                        firstX = secondX = 0;
                        рассчитатьПлощадьПодКривойToolStripMenuItem.Checked = false;
                        CountSquare = false;
                        graph.DrawDiagram();
                        return;
                    }
                }
            }

            //Выризание части графика
            if (CutMode)
            {
                Graphics g      = pictureBox1.CreateGraphics();
                int      MouseX = e.X;
                //int MouseY = e.Y;
                if (numLines < 2)
                {
                    g.DrawLine(new Pen(Color.Black), MouseX, pictureBox1.Height, MouseX, 0);
                    numLines++;
                    if (numLines == 1)
                    {
                        firstX = MouseX;
                    }
                    else
                    {
                        secondX = MouseX;
                    }
                }
                if (numLines == 2)
                {
                    int x1, x2;
                    if (secondX > firstX)
                    {
                        x1 = firstX;
                        x2 = secondX;
                    }
                    else if (firstX > secondX)
                    {
                        x1 = secondX;
                        x2 = firstX;
                    }
                    else
                    {
                        MessageBox.Show("Недопустимый интервал!");
                        return;
                    }
                    g.FillRectangle(new SolidBrush(Color.FromArgb(100, 255, 0, 0)),
                                    new RectangleF(x1, 0, Math.Abs(firstX - secondX), pictureBox1.Height));

                    double       ValueX1 = Math.Round((x1 - graph.RealCenter.X) * graph.Config.PriceForPointOX / graph.Config.StepOX, 1);
                    double       ValueX2 = Math.Round((x2 - graph.RealCenter.X) * graph.Config.PriceForPointOX / graph.Config.StepOX, 1);
                    DialogResult result  =
                        MessageBox.Show("Вы действительно хотите удалить участок кривой от " + ValueX1.ToString() + " до " + ValueX2.ToString() + "?",
                                        "Удаление промежутка кривой", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                    if (result == DialogResult.Yes)
                    {
                        for (int i = 0; i < graph.GraphCurves.Count; i++)
                        {
                            if (graph.GraphCurves[i].Legend == cmb_CutCurveLeg.Text)
                            {
                                //обнуление значений в массиве
                                int ZeroPT = 0;
                                for (int j = 0; j < graph.GraphCurves[i].PointsToDraw.Length; j++)
                                {
                                    if (graph.GraphCurves[i].PointsToDraw[j].X >= ValueX1 && graph.GraphCurves[i].PointsToDraw[j].X <= ValueX2)
                                    {
                                        graph.GraphCurves[i].PointsToDraw[j].X = 0;
                                        graph.GraphCurves[i].PointsToDraw[j].Y = 0;
                                        ZeroPT++;
                                    }
                                }
                                //заполнение нового массива
                                PointF[] temp         = new PointF[graph.GraphCurves[i].PointsToDraw.Length - ZeroPT];
                                int      CountNotZero = 0;
                                for (int j = 0; j < graph.GraphCurves[i].PointsToDraw.Length; j++)
                                {
                                    if (graph.GraphCurves[i].PointsToDraw[j].X == 0 &&
                                        graph.GraphCurves[i].PointsToDraw[j].Y == 0)
                                    {
                                    }
                                    else
                                    {
                                        temp[CountNotZero].X = graph.GraphCurves[i].PointsToDraw[j].X;
                                        temp[CountNotZero].Y = graph.GraphCurves[i].PointsToDraw[j].Y;
                                        CountNotZero++;
                                    }
                                }
                                graph.GraphCurves[i] = new Curves(temp, graph.GraphCurves[i].CurveColor,
                                                                  graph.GraphCurves[i].CurveThickness, graph.GraphCurves[i].Legend);
                                graph.DrawDiagram();
                                x1       = x2 = 0;
                                numLines = 0;
                                CutMode  = false;
                                GC.Collect();
                                break;
                            }
                        }
                        return;
                    }
                    else
                    {
                        x1       = x2 = 0;
                        numLines = 0;
                        CutMode  = false;
                        graph.DrawDiagram();
                        return;
                    }
                }
            }

            if (e.Button == MouseButtons.Left)
            {
                double x = graph.ConvertValues(e.Location.X, e.Location.Y, CoordType.GetRectangleCoord).X;
                double y = graph.ConvertValues(e.Location.X, e.Location.Y, CoordType.GetRectangleCoord).Y;

                foreach (Figure ln in Figure.Lines)
                {
                    if (ln.BelongsToFigure(x, y))
                    {
                        ln.SelectedFigure();
                        CurrentFigure = ln;
                        return;
                    }
                    else
                    {
                        graph.DrawDiagram();
                        Figure.DrawAllFigures();
                        CurrentFigure = null;
                    }
                }
                foreach (Figure el in Figure.Ellipses)
                {
                    if (el.BelongsToFigure(x, y))
                    {
                        el.SelectedFigure();
                        CurrentFigure = el;
                        return;
                    }
                    else
                    {
                        graph.DrawDiagram();
                        Figure.DrawAllFigures();
                        CurrentFigure = null;
                    }
                }
                return;
            }
        }