private static void Normalize(VectorImageData vectorImageData) { var sequencesUnflattened = new List <IEnumerable <PointsSequence> >(); sequencesUnflattened.Add(vectorImageData.Polygons ?? System.Linq.Enumerable.Empty <PointsSequence>()); sequencesUnflattened.Add(vectorImageData.PolyLines ?? System.Linq.Enumerable.Empty <PointsSequence>()); var sequences = sequencesUnflattened.Flatten(); var points = sequences.SelectMany(sequence => sequence.Points).ToList(); var xs = points.Select(pnt => pnt.X).ToArray(); var ys = points.Select(pnt => pnt.Y).ToArray(); var minX = xs.Min(); var maxX = xs.Max(); var minY = ys.Min(); var maxY = ys.Max(); var tx = (maxX + minX) / 2; var sx = (maxX - minX) / 2; var ty = (maxY + minY) / 2; var sy = (maxY - minY) / 2; var scale = Math.Max(sx, sy); foreach (var seq in sequences) { foreach (var idx in System.Linq.Enumerable.Range(0, seq.Points.Length)) { // get the point var point = seq.Points[idx]; // modify the point point.X = point.X - tx; point.Y = point.Y - ty; if (sx > 0) { point.X = point.X / scale; } if (sy > 0) { point.Y = point.Y / scale; } // put the modified point seq.Points[idx] = point; } } }
private IObservable <SketchData> LoadModellingDataAsync(string modelFile, VectorImageData vectorImage) { Func <SketchData> loadAction = () => { SketchData sketchData; if (File.Exists(modelFile)) { using (var stream = File.OpenRead(modelFile)) using (var compressed = new DeflateStream(stream, CompressionMode.Decompress, true)) { var serializer = new BinaryFormatter(); sketchData = (SketchData)serializer.Deserialize(compressed); } } else { sketchData = new SketchData(); } if (sketchData.Curves == null) { sketchData.Curves = vectorImage.PolyLines.Cast <PointsSequence>().Concat(vectorImage.Polygons).ToArray(); } if (sketchData.DistanceTransforms == null) { sketchData.DistanceTransforms = sketchData.Curves .AsParallel() .Select(c => ComputeDistanceTransform(c)) .ToArray(); Parallel.ForEach(sketchData.DistanceTransforms, dt => Negate(dt)); } return(sketchData); }; return(Observable.ToAsync(loadAction)()); }
private VectorImageData LoadSvg(string fileName) { var polygons = new List <Polygon>(); var polylines = new List <Polyline>(); var figures = LoadFigures(fileName); foreach (var figure in figures) { Contract.Assume(figure.Segments.Cast <PolyLineSegment>().Count() == 1); var points = new List <Point>(); points.Add(figure.StartPoint); var segment = figure.Segments.Cast <PolyLineSegment>().First(); points.AddRange(segment.Points); if (figure.IsClosed) { polygons.Add(new Polygon(points)); } else { polylines.Add(new Polyline(points)); } } var result = new VectorImageData { PolyLines = polylines.ToArray(), Polygons = polygons.ToArray(), }; Normalize(result); return(result); }
public void SetTitleIcon(VectorImageData imgIcon) { imgTitleIcon.vectorImageData = imgIcon; }