Ejemplo n.º 1
0
        /// <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);
                //    }
                //}
            }
        }
Ejemplo n.º 2
0
        /// <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
            }
        }
Ejemplo n.º 3
0
        /// <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
            }
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        /// <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();
                }
            }
        }
Ejemplo n.º 6
0
        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);
            }
        }
Ejemplo n.º 7
0
        /// <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
                                );
                }
            }
        }
Ejemplo n.º 8
0
    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);
    }
Ejemplo n.º 9
0
        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();
        }
Ejemplo n.º 10
0
        /// <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();
        }