/// <summary> /// 在Visual中绘制折线 /// </summary> /// <param name="visual"></param> /// <param name="brush"></param> /// <param name="thickness"></param> /// <param name="index">几组数据</param> /// <param name="p1"></param> /// <param name="p2"></param> private void DrawingLinesOnVisual(DrawingVisual visual, BrokenLine brokenLine, Int32 index) { using (DrawingContext dc = visual.RenderOpen()) { int count = brokenLine.Points.Count; //每n个绘制一次 int n = count / 200 + 1; for (int i = n; i < brokenLine.Points.Count; i += n) { DrawingRectangle(dc, brokenLine.Brush, brokenLine.Thickness, //brokenLine.Points[i - n], brokenLine.Points[i], i / (brokenLine.Points.Count + 0.0), index //组数 ); } #region //缩略图不需要绘制线帽 //if (brokenLine.BrokenLineCapType != BrokenLineCapType.None) //{ // //线帽比线条的个数多一个 // for (int i = 0; i < brokenLine.Points.Count; i += n) // { // DrawLineCap(dc, // brokenLine.Brush, // brokenLine.Points[i], brokenLine.BrokenLineCapType); // } //} } }
/// <summary> /// 在Visual中绘制折线 /// </summary> /// <param name="visual"></param> /// <param name="brush"></param> /// <param name="thickness"></param> /// <param name="p1"></param> /// <param name="p2"></param> /// <param name="index">组数</param> private void DrawingLinesOnVisual(DrawingVisual visual, BrokenLine brokenLine, int index) { using (DrawingContext dc = visual.RenderOpen()) { //int count = brokenLine.Points.Count; ////每n个绘制一次 //int n = count / 200 + 1; for (int i = 1; i < brokenLine.Points.Count; i += 1) { DrawingLine(dc, brokenLine.Thickness, brokenLine.Points[i - 1], brokenLine.Points[i], index + 1 ); } #region //缩略图不需要绘制线帽 //if (brokenLine.BrokenLineCapType != BrokenLineCapType.None) //{ // //线帽比线条的个数多一个 // for (int i = 0; i < brokenLine.Points.Count; i += n) // { // DrawLineCap(dc, // brokenLine.Brush, // brokenLine.Points[i], brokenLine.BrokenLineCapType); // } //} #endregion } }
/// <summary> /// 在Visual中绘制折线 /// </summary> /// <param name="visual"></param> /// <param name="brokenLine"></param> /// <param name="index">组数</param> private void DrawingLinesOnVisual(DrawingVisual visual, BrokenLine brokenLine, int index) { using (DrawingContext dc = visual.RenderOpen()) { int pointCount = (int)(brokenLine.Points.Count * (1 - (ScaleRatioAxisX - 1) / ScaleRatioAxisX)); for (int i = 1; i < pointCount; ++i) { DrawingRectangle(dc, brokenLine.Brush, brokenLine.Thickness, //brokenLine.Points[i - n], brokenLine.Points[i], i / (brokenLine.Points.Count + 0.0), index //组数 ); } #region //if (IsCapShow && brokenLine.BrokenLineCapType != BrokenLineCapType.None) //{ // //线帽比线条的个数多一个 // for (int i = 0; i < pointCount; ++i) // { // DrawLineCap(dc, // brokenLine.Brush, // brokenLine.Points[i], brokenLine.BrokenLineCapType); // } //} #endregion } }
private BrokenLine initBrokenLine() { var broken = new BrokenLine(Color.Red); broken.DrawTo(new structures.Point(10, 10)); broken.DrawTo(new structures.Point(20, 20)); broken.DrawTo(new structures.Point(30, 10)); broken.DrawTo(new structures.Point(40, 20)); return(broken); }
/// <summary> /// Function to draw BrokenLine on canvas point by point. /// </summary> /// <param name="sender">The <see cref="Canvas"/> that the action is for</param> /// <param name="e">Arguments that the implementor of this event may find useful.</param> private void ProcessDrawingOfBrokenLine(object sender, MouseButtonEventArgs e) { if (currentMode == Mode.Drawing) { if (currentDrawingBrokenLine.Count < MainWindow.countOfPoints) { var mousePos = e.GetPosition(DrawingPanel); currentDrawingBrokenLine.Add(new Point(mousePos.X, mousePos.Y)); if (expectedBrokenLine == null) { expectedBrokenLine = new Polyline { Stroke = currentBorderColor, Opacity = 1, StrokeThickness = 2 }; DrawingPanel.Children.Add(expectedBrokenLine); expectedLine = Util.GetLine( new Point(currentDrawingBrokenLine[0].X, currentDrawingBrokenLine[0].Y), new Point(mousePos.X, mousePos.Y), currentBorderColor); expectedLine.StrokeThickness = 2; DrawingPanel.Children.Add(expectedLine); } expectedBrokenLine.Points.Add(new System.Windows.Point(mousePos.X, mousePos.Y)); } if (currentDrawingBrokenLine.Count == MainWindow.countOfPoints) { var brokenLine = new BrokenLine( $"BrokenLine_{currentChosenBrokenLineId + 1}", currentDrawingBrokenLine, currentBorderColor).ToPolyline(); currentChosenBrokenLineId++; pictureIsSaved = false; brokenLine.KeyDown += MoveBrokenLineWithKeys; DrawingPanel.Children.Add(brokenLine); Canvas.SetLeft(brokenLine, 0); Canvas.SetTop(brokenLine, 0); var newMenuItem = new MenuItem { Header = brokenLine.Name }; newMenuItem.Click += SetCurrentBrokenLineFromMenu; ShapesMenu.Items.Add(newMenuItem); ClearExpectedBrokenLine(); } } }
public void TestConstructor(string inputName, List <Point> inputPoints, byte r, byte g, byte b, BrokenLine expectedBrokenLine) { var actualBrokenLine = new BrokenLine(inputName, inputPoints, new SolidColorBrush(Color.FromRgb(r, g, b))); Assert.Equal(expectedBrokenLine.Name, actualBrokenLine.Name); Assert.Equal(expectedBrokenLine.ColorBorder.R, actualBrokenLine.ColorBorder.R); Assert.Equal(expectedBrokenLine.ColorBorder.G, actualBrokenLine.ColorBorder.G); Assert.Equal(expectedBrokenLine.ColorBorder.B, actualBrokenLine.ColorBorder.B); Assert.NotNull(actualBrokenLine.Points); Assert.Equal(expectedBrokenLine.Points.Length, actualBrokenLine.Points.Length); for (var i = 0; i < actualBrokenLine.Points.Length; i++) { Assert.Equal(expectedBrokenLine.Points[i].X, actualBrokenLine.Points[i].X); Assert.Equal(expectedBrokenLine.Points[i].Y, actualBrokenLine.Points[i].Y); } }
/// <summary> /// 在Visual中绘制折线 /// </summary> /// <param name="visual"></param> /// <param name="brokenLine"></param> /// <param name="index">组数</param> private void DrawingLinesOnVisual(DrawingVisual visual, BrokenLine brokenLine, int index) { using (DrawingContext dc = visual.RenderOpen()) { int pointCount = (int)(brokenLine.Points.Count * (1 - (ScaleRatioAxisX - 1) / ScaleRatioAxisX)); for (int i = 1; i < pointCount; ++i) { DrawingLine(dc, brokenLine.Thickness, brokenLine.Points[i - 1], brokenLine.Points[i], index + 1 ); } } }
public void EditorDraw() { Arrow t1 = new Arrow(), t2 = new Arrow(); t1.start = rightTangent.tangentStart; t1.direction = rightTangent.tangentEnd - rightTangent.tangentStart; t2.start = leftTangent.tangentStart; t2.direction = leftTangent.tangentEnd - leftTangent.tangentStart; GizmosHelper.DrawGizmosShape(t1); GizmosHelper.DrawGizmosShape(t2); BrokenLine curve = new BrokenLine(); curve.points = new List <Vector3>(points); curve.shapeColor = Color.green; GizmosHelper.DrawGizmosShape(curve); }
private void Window_Loaded(object sender, RoutedEventArgs e) { //每条曲线点的个数 int pNum = 5000; //曲线1 List <StatePoint> points1 = new List <StatePoint>(); int p = new Random().Next(0, pNum / 2); points1.Add(new StatePoint() { state = 0, point = new Point(0, 0) }); int i = 1; for (; p < pNum; ++i) { //Y轴坐标暂时不计算 points1.Add(new StatePoint() { state = i, point = new Point(p / (pNum + 0.0), 0) }); p += new Random().Next(0, pNum / 2); } points1.Add(new StatePoint() { state = i, point = new Point(1, 0) }); BrokenLine line1 = new BrokenLine(points1, 10, "状态1"); thumbnail.BrokenLines.Add(line1); thumbnail.BrokenLines.Add(line1); //开始时间 thumbnail.StartTime = new DateTime(2017, 1, 1); //结束时间 thumbnail.EndTime = new DateTime(2018, 1, 1); //初始化 thumbnail.Init(); }
/// <summary> /// Function to save BrokenLines to xml file. /// </summary> /// <param name="canvas">Canvas from which BrokenLines are to be saved.</param> public static void SaveBrokenLines(ref Canvas canvas) { var sfd = new SaveFileDialog { Filter = @"Xml files (*.xml)|*.xml", DefaultExt = "xml", FileName = "BrokenLines", AddExtension = true }; if (sfd.ShowDialog() != true) { return; } var brokenLines = new List <BrokenLine>(); foreach (var item in canvas.Children) { if (item is Polyline polyline) { brokenLines.Add(BrokenLine.FromPolyline(polyline)); } } Serialization.SerializeBrokenLines(sfd.FileName, brokenLines); }
/// <summary> /// 载入控件时调用 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Window_Loaded(object sender, RoutedEventArgs e) { #region 柱状图逻辑 //每种柱状点的个数 int pNum = 500; List <Double> list1 = new List <Double>(); for (int i = 0; i < pNum; ++i) { list1.Add(new Random(Guid.NewGuid().GetHashCode()).Next(0, 100) / 100.0); } BrokenLine line1 = new BrokenLine(list1, new SolidColorBrush(Color.FromRgb(79, 188, 195)), 3, BrokenLineCapType.Circle, "柱状1"); thumbnail.BrokenLines.Add(line1); List <Double> list2 = new List <Double>(); for (int i = 0; i < pNum; ++i) { list2.Add(new Random(Guid.NewGuid().GetHashCode()).Next(0, 100) / 100.0); } BrokenLine line2 = new BrokenLine(list2, new SolidColorBrush(Colors.Red), 3, BrokenLineCapType.Circle, "柱状2"); thumbnail.BrokenLines.Add(line2); List <Double> list3 = new List <Double>(); for (int i = 0; i < pNum; ++i) { list3.Add(new Random(Guid.NewGuid().GetHashCode()).Next(0, 100) / 100.0); } BrokenLine line3 = new BrokenLine(list3, new SolidColorBrush(Colors.Green), 3, BrokenLineCapType.Circle, "柱状3"); thumbnail.BrokenLines.Add(line3); List <Double> list4 = new List <Double>(); for (int i = 0; i < pNum; ++i) { list4.Add(new Random(Guid.NewGuid().GetHashCode()).Next(0, 100) / 100.0); } BrokenLine line4 = new BrokenLine(list4, new SolidColorBrush(Colors.Black), 3, BrokenLineCapType.Circle, "柱状4"); thumbnail.BrokenLines.Add(line4); List <Double> list5 = new List <Double>(); for (int i = 0; i < pNum; ++i) { list5.Add(new Random(Guid.NewGuid().GetHashCode()).Next(0, 100) / 100.0); } BrokenLine line5 = new BrokenLine(list5, new SolidColorBrush(Color.FromRgb(153, 0, 255)), 3, BrokenLineCapType.Circle, "柱状5"); thumbnail.BrokenLines.Add(line5); List <Double> list6 = new List <Double>(); for (int i = 0; i < pNum; ++i) { //Guid.NewGUID() 生成一个新的 GUID 唯一值 random.next(int32,int32)在这个范围内产生的随机数 list6.Add(new Random(Guid.NewGuid().GetHashCode()).Next(0, 100) / 100.0); } BrokenLine line6 = new BrokenLine(list6, new SolidColorBrush(Color.FromRgb(241, 194, 50)), 3, BrokenLineCapType.Circle, "柱状6"); thumbnail.BrokenLines.Add(line6); #endregion #region // //每条曲线点的个数 // int pNum = 500; // //曲线1 // List<Point> points1 = new List<Point>(); // for (int i = 0; i < pNum; ++i) // { // //正弦曲线 // points1.Add(new Point(1.0 / (pNum - 1) * i, //(thumbnail.CanvasHeight / 2 + Math.Sin(i / 180.0 * Math.PI) * 15) / thumbnail.CanvasHeight)); // } // BrokenLine line1 = new BrokenLine(points1, new SolidColorBrush(Color.FromRgb(79, 188, 195)), 1, BrokenLineCapType.Diamond, "曲线1"); // thumbnail.BrokenLines.Add(line1); // //曲线2 // List<Point> points2 = new List<Point>(); // for (int i = 0; i < pNum; ++i) // { // //余弦曲线 // points2.Add(new Point(1.0 / (pNum - 1) * i, //(thumbnail.CanvasHeight / 2 + Math.Cos(i / 180.0 * Math.PI) * 15) / thumbnail.CanvasHeight)); // } // BrokenLine line2 = new BrokenLine(points2, new SolidColorBrush(Color.FromRgb(141, 222, 166)), 1, BrokenLineCapType.Square, "曲线2"); // thumbnail.BrokenLines.Add(line2); // //曲线3 // List<Point> points3 = new List<Point>(); // for (int i = 0; i < pNum; ++i) // { // points3.Add(new Point(1.0 / (pNum - 1) * i, //(thumbnail.CanvasHeight / 2 + Math.Sin(i / 180.0 * Math.PI) * 15 / 2) / thumbnail.CanvasHeight)); // } // BrokenLine line3 = new BrokenLine(points3, new SolidColorBrush(Color.FromRgb(186, 233, 93)), 1, BrokenLineCapType.RectangleH, "曲线3"); // thumbnail.BrokenLines.Add(line3); // //曲线4 // List<Point> points4 = new List<Point>(); // for (int i = 0; i < pNum; ++i) // { // points4.Add(new Point(1.0 / (pNum - 1) * i, //(thumbnail.CanvasHeight / 2 + Math.Cos(i / 180.0 * Math.PI) * 15 / 2) / thumbnail.CanvasHeight)); // } // BrokenLine line4 = new BrokenLine(points4, new SolidColorBrush(Color.FromRgb(97, 198, 58)), 1, BrokenLineCapType.Triangle, "曲线4"); // thumbnail.BrokenLines.Add(line4); // //曲线5 // List<Point> points5 = new List<Point>(); // for (int i = 0; i < pNum; ++i) // { // points5.Add(new Point(1.0 / (pNum - 1) * i, //(thumbnail.CanvasHeight / 2 + Math.Sin(i / 180.0 * Math.PI) * 15 / 4) / thumbnail.CanvasHeight)); // } // BrokenLine line5 = new BrokenLine(points5, new SolidColorBrush(Color.FromRgb(190, 185, 226)), 1, BrokenLineCapType.RectangleV, "曲线5"); // thumbnail.BrokenLines.Add(line5); // //曲线6 // List<Point> points6 = new List<Point>(); // for (int i = 0; i < pNum; ++i) // { // points6.Add(new Point(1.0 / (pNum - 1) * i, //(thumbnail.CanvasHeight / 2 + Math.Cos(i / 180.0 * Math.PI) * 15 / 4) / thumbnail.CanvasHeight)); // } // BrokenLine line6 = new BrokenLine(points6, new SolidColorBrush(Color.FromRgb(130, 181, 247)), 1, BrokenLineCapType.TriangleR, "曲线6"); // thumbnail.BrokenLines.Add(line6); #endregion //开始时间 thumbnail.StartTime = new DateTime(2017, 1, 1); //结束时间 thumbnail.EndTime = new DateTime(2018, 1, 1); //初始化 thumbnail.Init(); }