Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2009, 19:56   #1
G@sh!sh
Пользователь
 
Регистрация: 07.09.2008
Сообщений: 14
По умолчанию Сглаживание кривых безье, чтобы смотрелись плавно

Всем здраствуйте. Хочу сгладить кривую безье, чтоб смотрелась плавно, но не знаю как. Весь гугл облазил, но ничего не нашёл. Подскажите хотябы идею.
G@sh!sh вне форума Ответить с цитированием
Старый 21.11.2009, 20:56   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

сглаживайте любыми полиномами, например: лангранджа, логарифмической-линейной-степенной-гиперболической-показательной-экспотенйциальной-параболической регрессии. Даю пример:
Код:
//Полином экспоненциальной регрессии
function expreg(serin:tchartseries;xin:real):real;
var i,n:integer;
    a,b,c,d,e,f:real;
begin
 n:=serin.xValues.Count;
 a:=0; b:=0; c:=0; d:=0;
 for i:=0 to n-1 do begin
  a:=a+serin.xvalue[i];
  b:=b+ln(serin.yValue[i]+h);
  c:=c+sqr(serin.xValue[i]);
  d:=d+serin.XValue[i]*ln(serin.yValue[i]+h);
 end;
 e:=(a*b-n*d)/(sqr(a)-n*c+h);
 f:=exp((b-e*a)/(h+n));
 result:=f*exp(xin*e);
end;

//сглаживание
procedure sgl(seriesin,seriesout:TChartSeries;pt,ps,func:smallint);
var i,j,n:integer;k:real;
    ser:tchartseries;
begin
 j:=0;
 if Seriesin.xValues.count=0 then exit;
 //
 n:=seriesin.XValues.count-1;
 ser:=tlineseries.Create(ser);
 //
 for i:=0 to n do
  begin
   inc(j);
   ser.AddXY(seriesin.XValues[i],seriesin.yvalues[i]);
   if j=pt then
    begin
     try
     case func of
      0: seriesout.AddXY(seriesin.XValue[i-(j div 2)],ps+langr(ser,seriesin.XValue[i-(j div 2)]));
      1: seriesout.AddXY(seriesin.XValue[i-(j div 2)],ps+logreg(ser,seriesin.XValue[i-(j div 2)]));
      2: seriesout.AddXY(seriesin.XValue[i-(j div 2)],ps+linreg(ser,seriesin.XValue[i-(j div 2)]));
      3: seriesout.AddXY(seriesin.XValue[i-(j div 2)],ps+step(ser,seriesin.XValue[i-(j div 2)]));
      4: seriesout.AddXY(seriesin.XValue[i-(j div 2)],ps+hyper(ser,seriesin.XValue[i-(j div 2)]));
      5: seriesout.AddXY(seriesin.XValue[i-(j div 2)],ps+expreg(ser,seriesin.XValue[i-(j div 2)]));
      6: seriesout.AddXY(seriesin.XValue[i-(j div 2)],ps+parab(ser,seriesin.XValue[i-(j div 2)]));
      7: seriesout.AddXY(seriesin.XValue[i-(j div 2)],ps+pokaz(ser,seriesin.XValue[i-(j div 2)]));
     end;except end;
     ser.Clear;j:=0;
    end;
  end;
 //
 ser.Destroy;
end;
в seriesin- содержиться набор-массив точек входной последовательности, в seriesout- сглаженная последовательность. Степень сглаживания -ps от 0 и выше с нужным вам шагом.

зы: остальные виды регрессии вы найдете в любом математическом справочнике или гугль-поиск рулит
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 22.11.2009, 14:16   #3
G@sh!sh
Пользователь
 
Регистрация: 07.09.2008
Сообщений: 14
По умолчанию

Вы наверное неправельно меня поняли или я плохо объяснил. Вот когда рисуешь линию в фотошопе, то она рисуется плавно 'без ступенек'. Для сглаживания линий и эллипсов я использую алгоритм Ву, а чтоб 'убрать ступеньки' в кривых этот алгоритм не очень подходит. Вот за этим я и обратился.
G@sh!sh вне форума Ответить с цитированием
Старый 22.11.2009, 14:39   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

думаю вы не пояснили, где вы рисуете
не знаю как в фотошопе, но в кореле есть инструмент сглаживания
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 22.11.2009, 16:38   #5
G@sh!sh
Пользователь
 
Регистрация: 07.09.2008
Сообщений: 14
По умолчанию

Я не в какой программе не рисую, фотошоп привел для примера. Я хочу создать метод, который рисует сглаженную кривую безье (программно, без использования каких-либо апи или библиотек).
G@sh!sh вне форума Ответить с цитированием
Старый 22.11.2009, 16:59   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
Я не в какой программе не рисую, фотошоп привел для примера. Я хочу создать метод, который рисует сглаженную кривую безье (программно, без использования каких-либо апи или библиотек).
э, не товарищ... не пойдет, у каждой программы-редактора свое видение вопроса и методы решения так сказать... похвально, что вы ищите метод сглаживания, то бишь алгоритм, но он у вас перед глазами - работа с массивом точек (пост #2). Принцип заключается в интерполяции и пропуске точек, еще есть такое понятие как - усреднение.

что касается
Цитата:
который рисует сглаженную кривую безье (программно, без использования каких-либо апи или библиотек)
что по вашему рисует программно? это где? в какой среде? если алгоритм, то программно тут причем?

зы: и определитесь чего вы хотите, нарисовать кривую безье или сгладить уже готовую (как в посте #1)


UPD
-------

Цитата:
Вы мне написали алгоритм геометрического сглаживания, это не то что мне надо
не геометрического, а параметрического... вы кстати знаете, что такое аппроксимация и интерполяция? так вот в вики приведена интерполяция...
что тут могу сказать, вы искали сглаживание и методу все равно кривая это безье или набор хаотических данных, отличие лишь будет на выходе
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 22.11.2009 в 19:42.
raxp вне форума Ответить с цитированием
Старый 22.11.2009, 19:28   #7
G@sh!sh
Пользователь
 
Регистрация: 07.09.2008
Сообщений: 14
По умолчанию

Вот тут описан алгоритм сглаживания для прямой http://ru.m.wikipedia.org/wiki/Алгор...edirected=true
Я хочу сделать тоже самое, но для кривой безье. Вы мне написали алгоритм геометрического сглаживания, это не то что мне надо.
G@sh!sh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
NURBS и Безье ser70 Общие вопросы C/C++ 1 06.08.2014 11:52
Кривая Безье. Muaxaxa Помощь студентам 2 28.11.2011 00:49
Положение точки относительно кривых Безье Александр Кедрик Общие вопросы C/C++ 2 10.08.2011 17:36
Плавно увеличить громкость KurtWagner Общие вопросы Delphi 10 02.02.2009 10:37
Кривая Безье ELL Помощь студентам 4 20.05.2008 22:56