/// <summary> /// 2й по важности метод класса. Разбивает массив точек на контура, в зависимости от того, с какими областями\объектами они граничат. В связке с <see cref="ImagePrData"/> фактически полностью векторизирует изображение. /// </summary> /// <param name="arr">Массив для выделения контуров</param> private VPointEx[][] SortPointArray(VPointEx[] arr) { VPointEx[][] result = new VPointEx[0][]; while (arr.Length > 0) { var a = arr[0].BordWith; var tm = new VPointEx[0]; Helper.InsertToArray(ref tm, arr[0]); Helper.DeleteFromArray(1, ref arr); var needtodelete = new int[0]; for (int i = 0; i <= arr.Length - 1; i++) { if (arr[i].BordWith == a) { Helper.InsertToArray(ref tm, arr[i]); Helper.InsertToArray(ref needtodelete, i + 1); } } if (arr.Length != 0) { if (needtodelete != null) { Array.Sort(needtodelete); for (int ii = needtodelete.Length - 1; ii >= 0; ii--) { Helper.DeleteFromArray(needtodelete[ii], ref arr); } } } Helper.InsertToArray(ref result, tm); } return(result); }
/// <summary> /// Загружает вектор формата .PCV. /// </summary> /// <param name="filename">Имя файла для загрузки</param> private void LoadVectPCV(string filename) { VPointEx[][] contours = new VPointEx[0][]; string s = new string(GetBytesAndRemoveHeader(filename).Select(pp => (char)pp).ToArray()); //TODO: Это по прежнему не совместимо с PCV старого образца, с VectArch. //Нид сделать что-то по типу удаления того "хедера" и читать его. var data = s.Split(';'); var head = new VectHeader(); var header_ = data[0].Split(','); head.Width = float.Parse(header_[1], CultureInfo.InvariantCulture); head.Height = float.Parse(header_[2], CultureInfo.InvariantCulture); switch (header_[3].ToLower().Trim()) { case ("rastr"): head.VectType = VectType.Rastr; break; case ("func"): head.VectType = VectType.Func; break; case ("curve"): head.VectType = VectType.Curve; break; case ("svgvector"): head.VectType = VectType.SvgVector; break; default: throw new ArgumentException("Указан неверный тип вектора"); } //try { head.CountOfCont = int.Parse(header_[4]); } catch { throw new ArgumentException("Указано неверное число контуров вектора"); } var p = data[1].Split('?'); head.CountOfCont = p.Length; contours = new VPointEx[p.Length][]; for (int i = 0; i <= p.Length - 1; i++) { var data1 = p[i]; var data2 = data1.Split(':'); var countofpoints = data2.Length; contours[i] = new VPointEx[countofpoints - 1]; for (int ii = 0; ii <= data2.Length - 2; ii++) { var Coordinates = data2[ii].Split(','); var xs = Coordinates[0]; var ys = Coordinates[1]; contours[i][ii] = new VPointEx(float.Parse(xs, CultureInfo.InvariantCulture), float.Parse(ys, CultureInfo.InvariantCulture), 0, Color.Black); } } Helper.DeleteFromArray(contours.Length, ref contours); Header = head; RawData = contours; }