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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2008, 16:35   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
Смех Помогите оптимизировать!

Привет всем!
Вот написал функцию градиальной заливки... Но помойму слишкрм громостко. Поделитесь опытом оптимезации!
Код:
function{ градивльная заливка }gradial(const cl1, cl2: tColor; w, h: integer): tBitmap;
var
b: tBitmap;
temp: integer;
cl: array of tColor;
s_rgb, e_rgb: integer;
rg, gg, bg: real;
rd, gd, bd: integer;
rs, gs, bs: integer;
re, ge, be: integer;
begin
   setLength(cl, h);

   b := tBitmap.Create;
   b.Width := w;
   b.Height := h;

   s_rgb := cl1;
   e_rgb := cl2;

   rs := getRValue(s_rgb);
   gs := getGValue(s_rgb);
   bs := getBValue(s_rgb);

   re := getRValue(e_rgb);
   ge := getGValue(e_rgb);
   be := getBValue(e_rgb);

   rd := re - rs;
   gd := ge - gs;
   bd := be - bs;

   rg := rd / h;
   gg := gd / h;
   bg := bd / h;

   for temp := 0 to 100 do
   begin
      re := round(rs + temp*rg);
      ge := round(gs + temp*gg);
      be := round(bs + temp*bg);
      cl[temp] := RGB(re, ge, be);
   end;

   for temp := 0 to 100 do
   begin
      b.Canvas.Pen.Color := cl[temp];
      b.Canvas.MoveTo(0, temp);
      b.Canvas.LineTo(200, temp);
   end;
   //result := tBitmap.Create;
   result := b;
  // b.Free;
end;
Спасибо заранее!!!
Altera вне форума Ответить с цитированием
Старый 25.03.2008, 16:40   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Может градиентной?

Код:
procedure TForm1.FormPaint(Sender: TObject);
var
  Row, Ht: Word;
begin
 Ht := (ClientHeight + 255) div 256;
   for Row := 0 to 255 do 
     with Canvas do
      begin
       Brush.Color := RGB(0, 0, Row);
       FillRect(Rect(0, Row * Ht, ClientWidth, (Row + 1) * Ht));
      end;
end;
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 25.03.2008, 16:48   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

два последних цикла объединить в один и массив cl нафиг не нужен. посчитали цвет и сразу присваиваем в Canvas.Pen.Color
pu4koff вне форума Ответить с цитированием
Старый 25.03.2008, 16:49   #4
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Может градиентной?

Код:
view plaincopy to clipboardprint?

Код:
procedure TForm1.FormPaint(Sender: TObject);  
var  
  Row, Ht: Word;  
begin  
 Ht := (ClientHeight + 255) div 256;  
   for Row := 0 to 255 do   
     with Canvas do  
      begin  
       Brush.Color := RGB(0, 0, Row);  
       FillRect(Rect(0, Row * Ht, ClientWidth, (Row + 1) * Ht));  
      end;  
end;

Тут цвета не настраиваются?
Altera вне форума Ответить с цитированием
Старый 25.03.2008, 19:01   #5
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Всё зависит от конкретно поставленной задачи. Можно извратиться и все сделать через DirectDraw или OpenGL. Под вопросом остается, что есть оптимизация: красота кода или же скорость выполнения данного кода?
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 25.03.2008, 19:09   #6
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Скорость на первом месте! Но и код если выглядит безобразно и не читабельно, тоже плохой тон!
Altera вне форума Ответить с цитированием
Старый 25.03.2008, 20:09   #7
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Тут цвета не настраиваются?
Это горизонтальный градиент синего цвета. То, что он синий, можно понять не запуская из этой строки:
Brush.Color := RGB(0, 0, Row);
Причем градиент масштабируемый (не зависит от высоты заливаемой области). Если понять как он работает, доработать его до цветного не составит труда.

Цитата:
Скорость на первом месте! Но и код если выглядит безобразно и не читабельно, тоже плохой тон!
Для каждой задачи свой подход. Если скорость критична, кому нужен этот тон? Если же скорость не особо важна, можно уделить внимание читабельности кода. Я так думаю...!
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите оптимизировать процедуру Cold Went Компоненты Delphi 4 29.04.2008 15:11
Оптимизировать код NeiL Помощь студентам 2 21.02.2008 08:57
Помогите оптимизировать HTML код после Publisher Гербера HTML и CSS 16 03.12.2007 11:46
помогите оптимизировать процедуру _XspeC_ Общие вопросы Delphi 12 08.04.2007 02:05
Помогите оптимизировать сайт Nadejda HTML и CSS 4 07.01.2007 21:04