/// <summary> /// Handles drawing a vertical arrow pointing up on the screen /// </summary> /// <param name="arrowPoint">the location of the tip of the arrow</param> public void DrawArrow(PointF arrowPoint, PaintEventArgs e) { const int penThickness = 7; bool Draw = true; if (arrowPoint.X > GraphPane.XAxis.Scale.Max || arrowPoint.X < GraphPane.XAxis.Scale.Min || arrowPoint.Y > GraphPane.YAxis.Scale.Max || arrowPoint.Y < GraphPane.YAxis.Scale.Min) { Draw = false; } if (Draw) { Graphics g = e.Graphics; PointF drawPoint = GraphPane.GeneralTransform(arrowPoint, CoordType.AxisXYScale); g.SmoothingMode = SmoothingMode.AntiAlias; Pen p = new Pen(Color.Black, penThickness); p.StartCap = LineCap.Square; p.EndCap = LineCap.ArrowAnchor; //These are the coordinates on the screen of where the arrow will start and End Point pointStart = new Point((int)(drawPoint.X + .5), (int)(drawPoint.Y + 20.5)); Point pointEnd = new Point((int)(drawPoint.X + .5), (int)(drawPoint.Y + .5)); g.DrawLine(p, pointStart, pointEnd); g.DrawString(arrowPoint.X.ToString("0.0"), new Font(FontFamily.GenericSerif, 8), Brushes.Black, new PointF(pointStart.X - penThickness, pointStart.Y + 3)); //p.Dispose(); } }
/// <summary> /// Обработчик события нажатия на кнопку мыши /// </summary> /// <returns>Метод возвращает true, если нужно запретить дальнейшую встроенную обработку события (показ контекстного меню, начало выделения и т.п.), и false, если обработка события должна быть продолжена</returns> bool zedGraph_MouseDownEvent(ZedGraphControl sender, MouseEventArgs e) { GraphPane pane = zedGraph.GraphPane; // Координаты, которые переданы в событие Point eventPoint = new Point(e.X, e.Y); eventCoord.Text = string.Format("({0}; {1})", eventPoint.X, eventPoint.Y); // Координаты, пересчитанные в систему координат графика double graphX, graphY; // Пересчитать координаты из системы координат, связанной с контролом zedGraph // в систему координат, связанную с графиком pane.ReverseTransform(new PointF(e.X, e.Y), out graphX, out graphY); graphCoord.Text = string.Format("({0:F3}; {1:F3})", graphX, graphY); // Пересчитаем в обратную сторону из системы координат графика // в систему координат контрола. // Должны получить те же значения, что и в eventPoint // (с точностью до погрешности округления) // Последний параметр CoordType.AxisXYScale обозначает, // в какой системе координат заданы координаты, переданные в первых двух параметрах. PointF controlPoint = pane.GeneralTransform(new PointF((float)graphX, (float)graphY), CoordType.AxisXYScale); controlCoord.Text = string.Format("({0}; {1})", controlPoint.X, controlPoint.Y); return(false); }
/// <summary> /// 获取指定坐标点的速度值 /// </summary> /// <param name="x"></param> /// <param name="z"></param> /// <returns>返回速度值</returns> private float GetV(int x, int z) { float v = 0; GraphPane myPane = zedGraphControl.GraphPane; PointF pointF = myPane.GeneralTransform(x, z, CoordType.AxisXYScale); PointF pointXYAxis_Min = zedGraphControl.GraphPane.GeneralTransform(myPane.XAxis.Scale.Min, myPane.YAxis.Scale.Min, CoordType.AxisXYScale); PointF pointXYAxis_Max = zedGraphControl.GraphPane.GeneralTransform(myPane.XAxis.Scale.Max, myPane.YAxis.Scale.Max, CoordType.AxisXYScale); //if ((pointF.X - pointXYAxis_Min.X) < 3 || (pointF.Y - pointXYAxis_Min.Y) < 3) //{ // pointF.X += 10; // pointF.Y += 10; //} // 如果点在Y轴上 if (pointF.X == pointXYAxis_Min.X) { pointF.X += 10; } // 如果点在X轴上 if (pointF.Y == pointXYAxis_Min.Y) { pointF.Y += 10; } Color color = GetColor((int)pointF.X, (int)pointF.Y); for (int i = 0; i < rockFormations.Count; i++) { if (rockFormations[i].Color.ToArgb() == color.ToArgb()) { v = float.Parse(rockFormations[i].Speed); break; } if (LineColor.ToArgb() == color.ToArgb()) { if (rockFormations[i].Color.ToArgb() == GetColor((int)pointF.X + 2, ((int)pointF.Y + 2)).ToArgb()) { v = float.Parse(rockFormations[i].Speed); break; } } if (AxisColor.ToArgb() == color.ToArgb()) { if (rockFormations[i].Color.ToArgb() == GetColor((int)pointF.X + 10, ((int)pointF.Y + 10)).ToArgb()) { v = float.Parse(rockFormations[i].Speed); break; } } if (backColor.ToArgb() == color.ToArgb()) { v = -1; } } return(v); }
private void setAxisEqualScale() { GraphPane pane = zedGraph.GraphPane; double Xmin = pane.XAxis.Scale.Min; double Xmax = pane.XAxis.Scale.Max; double Ymin = pane.YAxis.Scale.Min; double Ymax = pane.YAxis.Scale.Max; PointF PointMin = pane.GeneralTransform(Xmin, Ymin, CoordType.AxisXYScale); PointF PointMax = pane.GeneralTransform(Xmax, Ymax, CoordType.AxisXYScale); double dX = Math.Abs(Xmax - Xmin); double dY = Math.Abs(Ymax - Ymin); double Kx = dX / Math.Abs(PointMax.X - PointMin.X); double Ky = dY / Math.Abs(PointMax.Y - PointMin.Y); double K = Kx / Ky; //MessageBox.Show(K.ToString()); if (K > 1.0) { pane.YAxis.Scale.Min = pane.YAxis.Scale.Min - dY * (K - 1.0) / 2.0; pane.YAxis.Scale.Max = pane.YAxis.Scale.Max + dY * (K - 1.0) / 2.0; } else { K = 1.0 / K; pane.XAxis.Scale.Min = pane.XAxis.Scale.Min - dX * (K - 1.0) / 2.0; pane.XAxis.Scale.Max = pane.XAxis.Scale.Max + dX * (K - 1.0) / 2.0; } // Обновим данные об осях zedGraph.AxisChange(); // Обновляем график zedGraph.Invalidate(); }
private void xxxGraph_KeyUp(object sender, KeyEventArgs e) { ZedGraphControl zgc = (ZedGraphControl)sender; GraphPane pane = zgc.GraphPane; double xaxis_min = volatility_xaxis_min; double xaxis_max = volatility_xaxis_max; double xaxis_maj = volatility_xaxis_maj; double xaxis_mor = volatility_xaxis_mor; double yaxis_min = volatility_yaxis_min; double yaxis_max = volatility_yaxis_max; double yaxis_maj = volatility_yaxis_maj; double yaxis_mor = volatility_yaxis_mor; switch (e.KeyCode) { case Keys.Up: pane.YAxis.Scale.Min += pane.YAxis.Scale.MajorStep; pane.YAxis.Scale.Max += pane.YAxis.Scale.MajorStep; xxxGraph_ZoomEvent(zgc, null, null); break; case Keys.Down: if (pane.YAxis.Scale.Min > pane.YAxis.Scale.MajorStep) { pane.YAxis.Scale.Max -= pane.YAxis.Scale.MajorStep; pane.YAxis.Scale.Min -= pane.YAxis.Scale.MajorStep; } else { pane.YAxis.Scale.Max -= pane.YAxis.Scale.Min; pane.YAxis.Scale.Min = 0; } xxxGraph_ZoomEvent(zgc, null, null); break; case Keys.Left: if (pane.XAxis.Scale.Min > pane.XAxis.Scale.MajorStep) { pane.XAxis.Scale.Max -= pane.XAxis.Scale.MajorStep; pane.XAxis.Scale.Min -= pane.XAxis.Scale.MajorStep; } else { pane.XAxis.Scale.Max -= pane.XAxis.Scale.Min; pane.XAxis.Scale.Min = 0; } xxxGraph_ZoomEvent(zgc, null, null); break; case Keys.Right: if (pane.XAxis.Scale.Max + pane.XAxis.Scale.MajorStep < xaxis_max) { pane.XAxis.Scale.Min += pane.XAxis.Scale.MajorStep; pane.XAxis.Scale.Max += pane.XAxis.Scale.MajorStep; } else { pane.XAxis.Scale.Min += xaxis_max - pane.XAxis.Scale.Max; pane.XAxis.Scale.Max = xaxis_max; } xxxGraph_ZoomEvent(zgc, null, null); break; case Keys.PageUp: case Keys.PageDown: PointF centerP = pane.GeneralTransform((pane.XAxis.Scale.Min + pane.XAxis.Scale.Max) / 2, (pane.YAxis.Scale.Min + pane.YAxis.Scale.Max) / 2, CoordType.AxisXYScale); zgc.ZoomPane(pane, (1 + (e.KeyCode == Keys.PageUp ? 1.0 : -1.0) * zgc.ZoomStepFraction), centerP, true); if (pane.XAxis.Scale.Min < 0) { pane.XAxis.Scale.Min = 0; } if (pane.XAxis.Scale.Max > xaxis_max) { pane.XAxis.Scale.Max = xaxis_max; } if (pane.YAxis.Scale.Min < 0) { pane.YAxis.Scale.Min = 0; } xxxGraph_ZoomEvent(zgc, null, null); break; case Keys.Space: xxxGraph_ScaleToDefault(sender, null); xxxGraph_ZoomEvent(zgc, null, null); break; } }
public PointF TransformCoordinates(double x, double y, CoordType coordType = CoordType.AxisXYScale) { return(GraphPane.GeneralTransform(new PointF((float)x, (float)y), coordType)); }