public static void Simplify(this RawOutline rgnOutline, float tolerance = 0.5f, bool heighQualityEnable = false) { int j = rgnOutline._contours.Count; for (int i = 0; i < j; ++i) { RawContour contour = rgnOutline._contours[i]; List <Point> simplifiedPoints = new List <Point>(contour._xyCoords.Count); PixelFarm.CpuBlit.VertexProcessing.SimplificationHelpers.Simplify( contour._xyCoords, (p1, p2) => p1 == p2, p => p.X, p => p.Y, simplifiedPoints, tolerance, heighQualityEnable); //replace current raw contour with the new one #if DEBUG System.Diagnostics.Debug.WriteLine("simplification before:" + contour._xyCoords.Count + ",after" + simplifiedPoints.Count); #endif //create a new raw contour, //but you can replace internal data of the old contour too, RawContour newContour = new RawContour(); newContour.IsOutside = contour.IsOutside; foreach (Point point in simplifiedPoints) { newContour.AddPoint(point); } rgnOutline._contours[i] = newContour; } }
public void MakeVxs(VertexStore vxs) { int contourCount = _contours.Count; for (int i = 0; i < contourCount; ++i) { //each contour RawContour contour = _contours[i]; List <Point> xyCoords = contour._xyCoords; int count = xyCoords.Count; if (count > 1) { if (contour.IsOutside) { Point p = xyCoords[0]; vxs.AddMoveTo(p.X, p.Y); for (int n = 1; n < count; ++n) { p = xyCoords[n]; vxs.AddLineTo(p.X, p.Y); } vxs.AddCloseFigure(); } else { Point p = xyCoords[count - 1]; vxs.AddMoveTo(p.X, p.Y); for (int n = count - 1; n >= 0; --n) { p = xyCoords[n]; vxs.AddLineTo(p.X, p.Y); } vxs.AddCloseFigure(); } } } }
internal void BeginContour(bool outside) { _currentContour = new RawContour(); _currentContour.IsOutside = outside; _contours.Add(_currentContour); }