![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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...
|
|
#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 этак быстрее. Последний раз редактировалось 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. Кол-во интераций вычислено до начала цикла - более быстро, опять же. |
|
#9
|
||||
|
||||
|
Быстрее практически не будет, т.к. пустой проход цикла процессорного времени почти не занимает, а вот умножение/деление очень даже занимают. Плюс к этому дополнительная память под переменные. В итоге время будет практически то-же.
Скажем 20-кратный прогон моего кода дал 270Мс, прогон твоего варианта 269Мс. Выигрыш сомнительный. |
|
#10
|
|||
|
|||
|
Все! Спасибо вам большое, спасибо большое!
|
|
#11
|
||||
|
||||
|
Цитата:
|
|
#12
|
|||
|
|||
|
Характеристика компа здесь не важна. Оба алгоритма выполняются на одной и той же машине, а значит с четко будет видена скорость алгоритма и выигрыш/проигрыш во времени.
|