Ejemplo n.º 1
0
 /// <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);
 }
Ejemplo n.º 2
0
        /// <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;
        }