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); } }
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; } }