public GDI_BrokenLine(List <PointF> pts) : base(pts) { tools = new GDIPlusTools(this, this, pts.GetBounds()); tools.Drawing += Tools_Drawing; //tools.Preparing += Tools_Preparing; PropertyChanged += GDI_BrokenLine_PropertyChanged; }
public void WriteTo(List<CloudTag> tags, Color[] colors = null) { string outputSourceName = "out.png"; float width; float height; tags.GetBounds(out width, out height); var random = new Random(); using (var image = new Bitmap((int)width+1, (int)height+1)) using (var g = Graphics.FromImage(image)) { foreach (var tag in tags) g.DrawString(tag.Word, new Font("Times New Roman", tag.Frequency), new SolidBrush(GetRandomColor(random, colors)), tag.X, tag.Y); image.Save(outputSourceName, ImageFormat.Png); } }
public void BoundsOfLineString() { var lineString = new List <double[]> { new double[] { -1, -5 }, new double[] { 1, 22 } }.ToLineString(); var bounds = lineString.GetBounds(); Assert.Equal(-1, bounds.XMin); Assert.Equal(1, bounds.XMax); Assert.Equal(-5, bounds.YMin); Assert.Equal(22, bounds.YMax); Assert.Equal(0, bounds.ZMin); Assert.Equal(0, bounds.ZMax); }
public static void LoadKML(this C1VectorLayer vl, Stream stream, bool centerAndZoom, ProcessVectorItem processVector) { using (StreamReader sr = new StreamReader(stream)) { string s = sr.ReadToEnd(); List <C1VectorItemBase> vects = KmlReader.Read(s); vl.BeginUpdate(); foreach (C1VectorItemBase vect in vects) { if (processVector != null) { if (!processVector(vect)) { continue; } } vl.Children.Add(vect); } vl.EndUpdate(); if (centerAndZoom) { Rect bnds = vects.GetBounds(); C1Maps maps = ((IMapLayer)vl).ParentMaps; if (maps != null) { maps.Center = new Point(bnds.Left + 0.5 * bnds.Width, bnds.Top + 0.5 * bnds.Height); double scale = Math.Max(bnds.Width / 360 * maps.ActualWidth, bnds.Height / 180 * maps.ActualHeight);; double zoom = Math.Log(512 / scale, 2.0); maps.TargetZoom = maps.Zoom = zoom > 0 ? zoom : 0; } } sr.Close(); } }
public void BoundsOfListofLineString() { var c1 = new List <double[]> { new double[] { -1, -6 }, new double[] { 1, 22 } }.ToLineString(); var c2 = new List <double[]> { new double[] { -3, -5 }, new double[] { 8, 7 } }.ToLineString(); var lines = new List <LineString> { c1, c2 }; var bounds = lines.GetBounds(); Assert.Equal(-3, bounds.XMin); Assert.Equal(8, bounds.XMax); Assert.Equal(-6, bounds.YMin); Assert.Equal(22, bounds.YMax); Assert.Equal(0, bounds.ZMin); Assert.Equal(0, bounds.ZMax); }
private void RebuildUI() { if (DataSource == null) { //todo: clear return; } panel.Children.Clear(); int width = DataSource.Width; int height = DataSource.Height; bounds = DataSource.Grid.GetGridBounds(); fieldWrapper = new UniformFieldWrapper(DataSource.Data, width, height); List<Point[]> tracks = new List<Point[]>(pointsNum); for (int i = 0; i < pointsNum; i++) { var track = new List<Point>(); var start = rnd.NextPoint(bounds.XMin, bounds.XMax, bounds.YMin, bounds.YMax); track.Add(start); int maxLength = Math.Max(width, height); var position = start; double length = 0; do { var K1 = fieldWrapper.GetVector(position); K1.Normalize(); //var shift = K1; var K2 = fieldWrapper.GetVector(position + (K1 / 2).DecreaseLength(width, height)); K2.Normalize(); var K3 = fieldWrapper.GetVector(position + (K2 / 2).DecreaseLength(width, height)); K3.Normalize(); var K4 = fieldWrapper.GetVector(position + K3.DecreaseLength(width, height)); K4.Normalize(); var shift = ((K1 + 2 * K2 + 2 * K3 + K4) / 6); //shift.Normalize(); if (shift.X.IsNaN() || shift.Y.IsNaN()) break; var next = position + shift; track.Add(next); if (!OccupyCells(position, next, bounds)) break; position = next; length += shift.Length; } while (length < maxLength); Polyline line = new Polyline { Stroke = Brushes.Orange, StrokeThickness = 1, Stretch = Stretch.Fill, Points = new PointCollection(track), Effect = new DropShadowEffect { Color = Colors.Black, Direction = 245, BlurRadius = 3 } }; ViewportPanel.SetViewportBounds(line, track.GetBounds()); panel.Children.Add(line); } }
public override RectangleF GetBounds() { return(__points.GetBounds()); }
protected void DrawLine(Point point) { double maxLength = LineLengthFactor * Math.Max(DataSource.Width, DataSource.Height); const int maxIterations = 300; Action <double, List <Point> > pointTracking = (directionSign, track) => { int i = 0; var position = point; double length = 0; bool finished = false; do { double x = position.X; double y = position.Y; if (x < 0 || x > 1 || y < 0 || y > 1 || x.IsNaN() || y.IsNaN()) { break; } double xFactor = 1.0 / width; double yFactor = 1.0 / height; var K1 = fieldWrapper.GetVector(position).ChangeLength(xFactor, yFactor); var K2 = fieldWrapper.GetVector(position + K1 / 2).ChangeLength(xFactor, yFactor); var K3 = fieldWrapper.GetVector(position + K2 / 2).ChangeLength(xFactor, yFactor); var K4 = fieldWrapper.GetVector(position + K3).ChangeLength(xFactor, yFactor); var shift = (K1 + 2 * K2 + 2 * K3 + K4) / 6; if (shift.X.IsNaN() || shift.Y.IsNaN()) { break; } //shift /= 10; Point next = position + directionSign * shift; Point viewportPoint = PointToViewport(next); track.Add(viewportPoint); position = next; length += shift.Length; i++; finished = !(length < maxLength && i < maxIterations); } while (!finished); }; var forwardTrack = new List <Point>(); forwardTrack.Add(PointToViewport(point)); pointTracking(+1, forwardTrack); Polyline forwardLine = CreateLine(forwardTrack); ViewportPanel.SetViewportBounds(forwardLine, forwardTrack.GetBounds()); if (forwardTrack.Count > 1) { panel.Children.Add(forwardLine); } var backwardTrack = new List <Point>(); backwardTrack.Add(PointToViewport(point)); pointTracking(-1, backwardTrack); var backwardLine = CreateLine(backwardTrack); ViewportPanel.SetViewportBounds(backwardLine, backwardTrack.GetBounds()); if (backwardTrack.Count > 1) { panel.Children.Add(backwardLine); } }
private void CreateAndAddPath(IEnumerable <IndexWrapper <Point> > indexedPoints, out int globalMinIndex, out int globalMaxIndex, CoordinateTransform transform) { var screenPoints = indexedPoints.DataToScreen(transform); var parts = screenPoints.Split(pathLength); var splittedParts = from part in parts select missingValueSplitter.SplitMissingValue(part); bool isSmoothJoin = UseSmoothJoin; Point?lastPoint = null; globalMinIndex = Int32.MaxValue; globalMaxIndex = Int32.MinValue; foreach (var shortSegment in splittedParts) { foreach (var part in shortSegment) { if (part.MinIndex < globalMinIndex) { globalMinIndex = part.MinIndex; } if (part.MaxIndex > globalMaxIndex) { globalMaxIndex = part.MaxIndex; } List <Point> list = part.GetPoints().ToList(); if (list.Count == 0) { continue; } if (part.Splitted) { lastPoint = null; } StreamGeometry geometry = new StreamGeometry(); using (var context = geometry.Open()) { var start = lastPoint ?? list[0]; context.BeginFigure(start, isFilled: false, isClosed: false); context.PolyLineTo(list, isStroked: true, isSmoothJoin: isSmoothJoin); } lastPoint = list.Last(); Path path = pathsPool.GetOrCreate(); drawnPaths.Add(path); PointChartBase.SetIndexRange(path, new Range <int>(part.MinIndex, part.MaxIndex)); LineChartBase.SetPointsCount(path, list.Count); DataRect localBounds = list.GetBounds(); PointChartBase.SetContentBounds(path, localBounds); //if (path.CacheMode == null) // path.CacheMode = new BitmapCache(); // todo for debug purpose //path.Stroke = ColorHelper.RandomBrush; path.SetBinding(Path.StrokeProperty, strokeBinding); path.SetBinding(Path.StrokeThicknessProperty, strokeThicknessBinding); path.SetBinding(Path.StrokeDashArrayProperty, strokeDashArrayBinding); path.SetBinding(Panel.ZIndexProperty, zIndexBinding); path.SetBinding(Path.IsHitTestVisibleProperty, isHitTestVisibleBinding); path.SetBinding(Path.VisibilityProperty, visibilityBinding); path.SetBinding(Path.ToolTipProperty, tooltipBinding); path.Data = geometry; canvas.Children.Add(path); } } }
protected void DrawLine(Point point) { double maxLength = LineLengthFactor * Math.Max(DataSource.Width, DataSource.Height); const int maxIterations = 300; Action<double, List<Point>> pointTracking = (directionSign, track) => { int i = 0; var position = point; double length = 0; bool finished = false; do { double x = position.X; double y = position.Y; if (x < 0 || x > 1 || y < 0 || y > 1 || x.IsNaN() || y.IsNaN()) break; double xFactor = 1.0 / width; double yFactor = 1.0 / height; var K1 = fieldWrapper.GetVector(position).ChangeLength(xFactor, yFactor); var K2 = fieldWrapper.GetVector(position + K1 / 2).ChangeLength(xFactor, yFactor); var K3 = fieldWrapper.GetVector(position + K2 / 2).ChangeLength(xFactor, yFactor); var K4 = fieldWrapper.GetVector(position + K3).ChangeLength(xFactor, yFactor); var shift = (K1 + 2 * K2 + 2 * K3 + K4) / 6; if (shift.X.IsNaN() || shift.Y.IsNaN()) break; //shift /= 10; Point next = position + directionSign * shift; Point viewportPoint = PointToViewport(next); track.Add(viewportPoint); position = next; length += shift.Length; i++; finished = !(length < maxLength && i < maxIterations); } while (!finished); }; var forwardTrack = new List<Point>(); forwardTrack.Add(PointToViewport(point)); pointTracking(+1, forwardTrack); Polyline forwardLine = CreateLine(forwardTrack); ViewportPanel.SetViewportBounds(forwardLine, forwardTrack.GetBounds()); if (forwardTrack.Count > 1) panel.Children.Add(forwardLine); var backwardTrack = new List<Point>(); backwardTrack.Add(PointToViewport(point)); pointTracking(-1, backwardTrack); var backwardLine = CreateLine(backwardTrack); ViewportPanel.SetViewportBounds(backwardLine, backwardTrack.GetBounds()); if (backwardTrack.Count > 1) panel.Children.Add(backwardLine); }
private void RebuildUI() { if (DataSource == null) { //todo: clear return; } panel.Children.Clear(); int width = DataSource.Width; int height = DataSource.Height; bounds = DataSource.Grid.GetGridBounds(); fieldWrapper = new UniformFieldWrapper(DataSource.Data, width, height); List <Point[]> tracks = new List <Point[]>(pointsNum); for (int i = 0; i < pointsNum; i++) { var track = new List <Point>(); var start = rnd.NextPoint(bounds.XMin, bounds.XMax, bounds.YMin, bounds.YMax); track.Add(start); int maxLength = Math.Max(width, height); var position = start; double length = 0; do { var K1 = fieldWrapper.GetVector(position); K1.Normalize(); //var shift = K1; var K2 = fieldWrapper.GetVector(position + (K1 / 2).DecreaseLength(width, height)); K2.Normalize(); var K3 = fieldWrapper.GetVector(position + (K2 / 2).DecreaseLength(width, height)); K3.Normalize(); var K4 = fieldWrapper.GetVector(position + K3.DecreaseLength(width, height)); K4.Normalize(); var shift = ((K1 + 2 * K2 + 2 * K3 + K4) / 6); //shift.Normalize(); if (shift.X.IsNaN() || shift.Y.IsNaN()) { break; } var next = position + shift; track.Add(next); if (!OccupyCells(position, next, bounds)) { break; } position = next; length += shift.Length; } while (length < maxLength); Polyline line = new Polyline { Stroke = Brushes.Orange, StrokeThickness = 1, Stretch = Stretch.Fill, Points = new PointCollection(track), Effect = new DropShadowEffect { Color = Colors.Black, Direction = 245, BlurRadius = 3 } }; ViewportPanel.SetViewportBounds(line, track.GetBounds()); panel.Children.Add(line); } }