|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Изменение цвета пикселей
Знаю как поменять цвет у определенного пикселя
Код:
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
|
||||
|
||||
Можно просто делать циклом вывод тех-же точек, но это не самый быстрый способ:
Код:
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
|
||||
|
||||
Тов. Страдалецъ, как и многие, иногда путает Height с ClientHeight, и Width с ClientWidth...
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#4
|
||||
|
||||
Ты меня как-то в тупик этим замечанием поставил. Поясни глыбину своей мысли на примере.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#5
|
|||
|
|||
Цитата:
Код:
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
|
||||
|
||||
Да, так. Хотя по видимому результату разницы никакой, в моем варианте будет использована вся высота и вся ширина формы, включая и заголовок с бордюром, а в случае ClientHeight, ClientWidth будет использована часть формы без бордюра и заголовка. Но поскольку вызов события OnPaint для формы идет перед отрисовкой бордюра и заголовка, то никаких артефактов не будет.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#7
|
||||
|
||||
live_4_ever, именно.
Тов. Страдалецъ, Артефактов, может, и не будет, но эти 30х8 пикселей (примерно) нафиг не надо прорисовывать, и, думаю, лишние такты процессора можно потратить на более ценные задачи... И, кстати, не совсем верный подход у Вас, тов. Страдалецъ. Вместо того, чтоб проходить все пиксели, и проверять, надо ли их "перекрашивать" - лучше пройти количество интераций, например, в 5 раз меньше, но с шагом в 5 точек (умножением, то бишь, координаты высчитывать). Будет раз в 5 этак быстрее. Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 12.06.2010 в 01:36. |
#8
|
||||
|
||||
Код:
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
|
||||
|
||||
Быстрее практически не будет, т.к. пустой проход цикла процессорного времени почти не занимает, а вот умножение/деление очень даже занимают. Плюс к этому дополнительная память под переменные. В итоге время будет практически то-же.
Скажем 20-кратный прогон моего кода дал 270Мс, прогон твоего варианта 269Мс. Выигрыш сомнительный. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#10
|
|||
|
|||
Все! Спасибо вам большое, спасибо большое!
|
#11
|
||||
|
||||
Цитата:
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#12
|
|||
|
|||
Характеристика компа здесь не важна. Оба алгоритма выполняются на одной и той же машине, а значит с четко будет видена скорость алгоритма и выигрыш/проигрыш во времени.
Люблю спать, пить пиво за компом, день зарплаты... И что бы все работало само по себе. |