Апроксимация рисованной линии, при переводе в вектор.

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Re: Апроксимация рисованной линии, при переводе в вектор.

Сообщение vitaly_l » 02.06.2017 18:17:18

vada писал(а):Осталось то всего-ничего - понять где кончается прямая, а начинается кривая. Мелочи

)))))))))))))) Да! Именно это, сейчас и пытаюсь понять, чтобы сделать в виде алгоритма.

Вот из какого-то примера на Си честно стырил. С помощью неё можно, найти мне кажется.
Код: Выделить всё
// Вычисление коэффициентов аппроксимирующей прямой
void getApprox(double **x, double *a, double *b, int n) {
  double sumx = 0;
  double sumy = 0;
  double sumx2 = 0;
  double sumxy = 0;
  for (int i = 0; i<n; i++) {
    sumx += x[0][i];
    sumy += x[1][i];
    sumx2 += x[0][i] * x[0][i];
    sumxy += x[0][i] * x[1][i];
  }
  *a = (n*sumxy - (sumx*sumy)) / (n*sumx2 - sumx*sumx);
  *b = (sumy - *a*sumx) / n;
  return;
}
https://prog-cpp.ru/mnk/
мат. формула: http://mathhelpplanet.com/viewtopic.php?f=37&t=630



        //сплайн по четырем координатам
        private void drawSpline(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4,
                                Pen pen)
        {
            //подсчет коэффициентов сплайна
            float a0 = countSplineCoefficient(0, x1, x2, x3, x4);
            float a1 = countSplineCoefficient(1, x1, x2, x3, x4);
            float a2 = countSplineCoefficient(2, x1, x2, x3, x4);
            float a3 = countSplineCoefficient(3, x1, x2, x3, x4);

            float b0 = countSplineCoefficient(0, y1, y2, y3, y4);
            float b1 = countSplineCoefficient(1, y1, y2, y3, y4);
            float b2 = countSplineCoefficient(2, y1, y2, y3, y4);
            float b3 = countSplineCoefficient(3, y1, y2, y3, y4);

            float xPrev = a0, yPrev = b0;

            for (int i = 1; i <= 20; i++) //разбиваем кривую на 20 отрезков
            {
                float t = i / 20.0f;
                float x = ((a3 * t + a2) * t + a1) * t + a0; //x(t)
                float y = ((b3 * t + b2) * t + b1) * t + b0; //y(t)

                g.DrawLine(pen, xPrev, yPrev, x, y); //соединяем подсчитанные точки
                xPrev = x;
                yPrev = y;
            }
        }

        //пересчет коэффициентов сплайна
        private float countSplineCoefficient(int index, int x1, int x2, int x3, int x4)
        {
            switch (index)
            {
                case 0:
                    return (x1 + 4 * x2 + x3) / 6.0f; //свободный член
                case 1:
                    return (-x1 + x3) / 2.0f; //коэффициент при t
                case 2:
                    return (x1 - 2 * x2 + x3) / 2.0f; //коэффициент при t^2
                case 3:
                    return (-x1 + 3 * x2 - 3 * x3 + x4) / 6.0f; //коэффициент при t^3
            }

            return 0;
        }
http://grafika.me/node/458

Последний раз редактировалось vitaly_l 02.06.2017 23:41:39, всего редактировалось 2 раз(а).
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3071
Зарегистрирован: 31.01.2012 16:41:41

Re: Апроксимация рисованной линии, при переводе в вектор.

Сообщение Лекс Айрин » 02.06.2017 18:33:02

vitaly_l писал(а):Именно это, сейчас и пытаюсь понять, чтобы сделать в виде алгоритма.


Продолжаешь прямую, пока есть возможность, пытаешься провести кривую с запасом... примерно посередине совпадающего отрезка и ставишь точку смены кривой/прямой и соответствующим образом отрисовываешь сегменты.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4097
Зарегистрирован: 19.02.2013 16:54:51

Re: Апроксимация рисованной линии, при переводе в вектор.

Сообщение vitaly_l » 02.06.2017 18:36:38

Лекс Айрин писал(а):Продолжаешь прямую, пока есть возможность

на словах просто, а на пикселях. это несколько сложнее, т.к. тогда вначале нужно было бы вычислить функцию прямой.
А с кривой... там вообще, засада. Одно дело нарисовать Cathmull-Rom, а вот вычислить из точек... :evil:
Последний раз редактировалось vitaly_l 02.06.2017 18:37:28, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3071
Зарегистрирован: 31.01.2012 16:41:41

Re: Апроксимация рисованной линии, при переводе в вектор.

Сообщение zub » 02.06.2017 18:36:49

vitaly_l
Лекс Айрин
Флеймисты - оптимисты
zub
долгожитель
 
Сообщения: 2259
Зарегистрирован: 14.11.2005 23:51:26

Re: Апроксимация рисованной линии, при переводе в вектор.

Сообщение vitaly_l » 02.06.2017 18:40:09

zub писал(а):Флеймисты - оптимисты

Зуууб-ик... Так Вы знаете формулу? Типа знаю но не скажу? ага....

Вот смотрите:
Была такая притча, там умная ворона, сыр во рту держала. Держала, держала.. Держала, держала.. А тут глупая лиса подходит и говорит:
zub, а самому что, слабо посчитать и показать результат в коде?
Последний раз редактировалось vitaly_l 02.06.2017 18:43:53, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3071
Зарегистрирован: 31.01.2012 16:41:41

Re: Апроксимация рисованной линии, при переводе в вектор.

Сообщение zub » 02.06.2017 18:43:00

Стряпайте сами, у меня пирожков нет))
zub
долгожитель
 
Сообщения: 2259
Зарегистрирован: 14.11.2005 23:51:26

Re: Апроксимация рисованной линии, при переводе в вектор.

Сообщение Лекс Айрин » 02.06.2017 18:44:15

zub, я лишь предложил))))
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4097
Зарегистрирован: 19.02.2013 16:54:51

Re: Апроксимация рисованной линии, при переводе в вектор.

Сообщение vitaly_l » 02.06.2017 18:44:35

zub писал(а):Стряпайте сами, у меня пирожков нет))

И ангельский должно быть это код?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3071
Зарегистрирован: 31.01.2012 16:41:41

Re: Апроксимация рисованной линии, при переводе в вектор.

Сообщение Лекс Айрин » 02.06.2017 19:02:14

vitaly_l, идеальным код бывает редко.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4097
Зарегистрирован: 19.02.2013 16:54:51

Re: Апроксимация рисованной линии, при переводе в вектор.

Сообщение Pavia » 02.06.2017 19:03:15

А смысл озвучивать формулу если ТЗ до сих пор вилами по воде писано?
Аватара пользователя
Pavia
постоялец
 
Сообщения: 172
Зарегистрирован: 07.01.2011 12:46:51

Re: Апроксимация рисованной линии, при переводе в вектор.

Сообщение vitaly_l » 02.06.2017 19:06:00

Pavia писал(а):А смысл озвучивать формулу если ТЗ до сих пор вилами по воде писано?

А вдруг эта Ваша формула тоже кому-то пригодится? Народу на форум заходит много.... формула одна...

Так значит вкусный сыр у Вас?


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3071
Зарегистрирован: 31.01.2012 16:41:41

Re: Апроксимация рисованной линии, при переводе в вектор.

Сообщение Pavia » 02.06.2017 19:38:03

Почему одна? Я знаю кучу формул. А в задаче выделения контуров каждый год появляются новые формулы. Вот к примеру рейтинг
Изображение
Картинка кликабельна.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 172
Зарегистрирован: 07.01.2011 12:46:51

Re: Апроксимация рисованной линии, при переводе в вектор.

Сообщение vitaly_l » 02.06.2017 19:55:35

Pavia писал(а):А в задаче выделения контуров каждый год появляются новые формулы

Я не решаю задачу выделения контуров или их detection. Мне нужно сделать векторную аппроксимацию контура. Например буква P состоит из 111 точек. А мне нужно сделать аппроксимацию, чтобы осталось всего только три точки и две линии (одна из которых Безье = Cathmull-Rom).
Последний раз редактировалось vitaly_l 02.06.2017 20:03:11, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3071
Зарегистрирован: 31.01.2012 16:41:41

Re: Апроксимация рисованной линии, при переводе в вектор.

Сообщение Pavia » 02.06.2017 20:01:33

vitaly_l писал(а):Я не решаю задачу выделения контуров. Мне нужно сделать векторную аппроксимацию контура. Например буква P состоит из 111 точек. А мне нужно сделать аппроксимацию, чтобы осталось всего только три точки и две линии (одна из которых Безье).

Эти задачи имеют много общего. Во-вторых кривизна кривой Безье не позволяет точно описать букву «Р». Тут как минимум надо 3 штуки этих кривых. Хотя если точностью пожертвовать, то можно и одну оставить.
Последний раз редактировалось Pavia 02.06.2017 20:04:56, всего редактировалось 1 раз.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 172
Зарегистрирован: 07.01.2011 12:46:51

Re: Апроксимация рисованной линии, при переводе в вектор.

Сообщение Лекс Айрин » 02.06.2017 20:04:10

vitaly_l писал(а):чтобы осталось всего только три точки и две линии (одна из которых Безье = Cathmull-Rom).


Вообще-то в букве "Р" пять точек, три прямых линии и одна полуокружность. Если, конечно, считать ее линии однопиксельными.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4097
Зарегистрирован: 19.02.2013 16:54:51

Пред.След.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru