Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.06.2010, 14:20
live_4_ever live_4_ever вне форума
Прохожий
 
Регистрация: 01.06.2010
Сообщения: 19
Репутация: 12
По умолчанию Изменение цвета пикселей

Знаю как поменять цвет у определенного пикселя

Код:
var PColor:TColor;
R,G,B:byte;
begin
PColor:=Form1.Canvas.Pixels[1,1];
R:=GetRValue(PColor);
G:=GetGValue(PColor);
B:=GetBValue(PColor);
Form1.Canvas.Pixels[5,5]:=RGB(R+30,G+30,B);

А как поменять цвет остальных пикселей на форме, находящихся на одинаковом расстоянии друг от друга ? <<--- Не понятное сморозил ;P
Вообщем, пытаюсь сделать что-то вроде точек, как в компиляторе на форме.

Ответить с цитированием
  #2  
Старый 11.06.2010, 19:37
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Можно просто делать циклом вывод тех-же точек, но это не самый быстрый способ:
Код:
procedure TForm1.FormPaint(Sender: TObject);
var
  x,y: Integer;
begin
for y := 0 to Form1.Height
do for x := 0 to Form1.Width
    do if (y mod 5 = 0) and (x mod 5 = 0)
        then Form1.Canvas.Pixels[x,y] := clBlack;
end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 11.06.2010, 20:35
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Тов. Страдалецъ, как и многие, иногда путает Height с ClientHeight, и Width с ClientWidth...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #4  
Старый 11.06.2010, 21:33
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Ты меня как-то в тупик этим замечанием поставил. Поясни глыбину своей мысли на примере.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 12.06.2010, 00:34
live_4_ever live_4_ever вне форума
Прохожий
 
Регистрация: 01.06.2010
Сообщения: 19
Репутация: 12
По умолчанию

Цитата:
Сообщение от Страдалецъ
Код:
procedure TForm1.FormPaint(Sender: TObject);
var
  x,y: Integer;
begin
for y := 0 to Form1.Height
do for x := 0 to Form1.Width
    do if (y mod 5 = 0) and (x mod 5 = 0)
        then Form1.Canvas.Pixels[x,y] := clBlack;
end;


Цитата:
Сообщение от DJ PhoeniX
Тов. Страдалецъ, как и многие, иногда путает Height с ClientHeight, и Width с ClientWidth...




Код:
procedure TForm1.FormPaint(Sender: TObject);
var
  x,y: Integer;
begin
for y := 0 to Form1.ClientHeight
do for x := 0 to Form1.ClientWidth
    do if (y mod 5 = 0) and (x mod 5 = 0)
        then Form1.Canvas.Pixels[x,y] := clBlack;
end;

Так что ли?
Ответить с цитированием
  #6  
Старый 12.06.2010, 01:05
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Да, так. Хотя по видимому результату разницы никакой, в моем варианте будет использована вся высота и вся ширина формы, включая и заголовок с бордюром, а в случае ClientHeight, ClientWidth будет использована часть формы без бордюра и заголовка. Но поскольку вызов события OnPaint для формы идет перед отрисовкой бордюра и заголовка, то никаких артефактов не будет.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #7  
Старый 12.06.2010, 01:32
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

live_4_ever, именно.

Тов. Страдалецъ, Артефактов, может, и не будет, но эти 30х8 пикселей (примерно) нафиг не надо прорисовывать, и, думаю, лишние такты процессора можно потратить на более ценные задачи...
И, кстати, не совсем верный подход у Вас, тов. Страдалецъ. Вместо того, чтоб проходить все пиксели, и проверять, надо ли их "перекрашивать" - лучше пройти количество интераций, например, в 5 раз меньше, но с шагом в 5 точек (умножением, то бишь, координаты высчитывать). Будет раз в 5 этак быстрее.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj

Последний раз редактировалось PhoeniX, 12.06.2010 в 01:36.
Ответить с цитированием
  #8  
Старый 12.06.2010, 01:49
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Код:
procedure TForm1.FormPaint(Sender: TObject);
var
  x,y: Integer; // для двух циклов
  w,h: integer; // количество интераций по ширине и высоте.
begin
  //Высчитываем количество интераций
  w:=Form1.ClientWidth div 5 + 1; // Ширина / 5 + 1 (чтоб запас был)
  h:=Form1.ClientHeight div 5 + 1; // Высота
  for y := 0 to h do
    for x := 0 to w do
      Form1.Canvas.Pixels[x*5, y*5] := clBlack;
end;

Идеальный вариант, который можно осуществить через канву:
1. Минимальное количество интераций - минимальное кол-во тактов - минимальное время
2. Кол-во интераций вычислено до начала цикла - более быстро, опять же.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #9  
Старый 12.06.2010, 03:28
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Быстрее практически не будет, т.к. пустой проход цикла процессорного времени почти не занимает, а вот умножение/деление очень даже занимают. Плюс к этому дополнительная память под переменные. В итоге время будет практически то-же.
Скажем 20-кратный прогон моего кода дал 270Мс, прогон твоего варианта 269Мс. Выигрыш сомнительный.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #10  
Старый 13.06.2010, 17:46
live_4_ever live_4_ever вне форума
Прохожий
 
Регистрация: 01.06.2010
Сообщения: 19
Репутация: 12
По умолчанию

Все! Спасибо вам большое, спасибо большое!
Ответить с цитированием
  #11  
Старый 21.06.2010, 13:23
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Цитата:
Сообщение от Страдалецъ
20-кратный прогон моего кода дал 270Мс, прогон твоего варианта 269Мс. Выигрыш сомнительный.
Откуда такие цифры? Тестирование проводилось? С какими размерами формы? Какие характеристики компа?
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #12  
Старый 23.08.2010, 21:33
RootDevice RootDevice вне форума
Прохожий
 
Регистрация: 23.08.2010
Адрес: г. Смоленск
Сообщения: 41
Репутация: 10
По умолчанию

Характеристика компа здесь не важна. Оба алгоритма выполняются на одной и той же машине, а значит с четко будет видена скорость алгоритма и выигрыш/проигрыш во времени.
__________________
Люблю спать, пить пиво за компом, день зарплаты... И что бы все работало само по себе.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:38.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter