public void GenerateStrokes() { bool isReversed = false; foreach (var line in _Lines) { if (line.Pixels.Count == 1 || line.Pixels.Count == 0) { continue;//throw new Exception("Пока не придумал что с этим делать"); } LinkedList <FreeMotionStroke> lineStrokes = new LinkedList <FreeMotionStroke>(); Pixel firstDarkPixel = null; Pixel strokeBegining = null; List <double> strokeIntensities = new List <double>(); foreach (var curPixel in line.Pixels) { if (strokeBegining == null) { if (curPixel.Intensity != 1) { strokeBegining = curPixel; if (firstDarkPixel == null) { firstDarkPixel = strokeBegining; } strokeIntensities.Clear(); } } else if (Math.Abs(strokeBegining.Intensity - curPixel.Intensity) > SAME_INTENSITY) { AddStroke(lineStrokes, isReversed, strokeBegining, curPixel, 1 - strokeIntensities.Average()); strokeBegining = curPixel; strokeIntensities.Clear(); } strokeIntensities.Add(curPixel.Intensity); } if (strokeBegining == null) //Выходим, так как строка вся белая { continue; } Pixel lastPixel = line.Pixels[line.Pixels.Count - 1]; if (strokeBegining.Intensity == 1) { lastPixel = strokeBegining; } else if (lastPixel != strokeBegining) { AddStroke(lineStrokes, isReversed, strokeBegining, lastPixel, 1 - strokeIntensities.Average()); } if (isReversed) { if (_UseIdleZones) { lineStrokes.AddFirst(new IdleStroke(lastPixel)); lineStrokes.AddLast(new IdleStroke(firstDarkPixel + (firstDarkPixel - lastPixel).Normalize() * _IdleDistance)); lineStrokes.AddFirst(new FreeMotionStroke(lastPixel + (lastPixel - firstDarkPixel).Normalize() * _IdleDistance)); } else { lineStrokes.AddFirst(new FreeMotionStroke(lastPixel)); } } else { if (_UseIdleZones) { lineStrokes.AddFirst(new IdleStroke(firstDarkPixel)); lineStrokes.AddLast(new IdleStroke(lastPixel + (lastPixel - firstDarkPixel).Normalize() * _IdleDistance)); lineStrokes.AddFirst(new FreeMotionStroke(firstDarkPixel + (firstDarkPixel - lastPixel).Normalize() * _IdleDistance)); } else { lineStrokes.AddFirst(new FreeMotionStroke(firstDarkPixel)); } } Strokes.AddRange(lineStrokes); if (_DoubleDirections) { isReversed = !isReversed; } } }