Как оптимизировать определение границ произвольной фигуры ?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Pavia писал(а):В Delphi есть автоматическое разиминовывание(^) указателей.

я как раз эти штуки не люблю, мне лучше чтобы я видел, где что и как происходит.

zub писал(а):конечно гонит, но и суть конечно есть)) ВСЁ ХОРОШО В МЕРУ И ПОДЕЛУ

Не ну это серьёзный вопрос: Как быстрее будет обрабатывать?

Код: Выделить всё

arrayOfUkazatelByte[x]^[y] := 222; // <== человек, там говорит что это уже анахронизм.
arrayOfArrayOfByte[x,y] := 222; // <== а вот так всё тип-топ и круто.

Гонит, он или не гонит?

zub писал(а):BeginUpdate\EndUpdate

В данном коде в их нет смысла, т.к. происходит только чтение.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

если человек это говорит безапиляционно и не привязываясь к конкретной реализации чегото - умножаем его слова на ноль.
>>Не ну это серьёзный вопрос: Как быстрее будет обрабатывать?
Странный ты, это зависит от того как объявлены данные массивы
думаю что самым оптимальным будет arrayOfArrayOfByte если он статический. если динамический - то разницы в вариантах почти небудет

Добавлено спустя 1 минуту 14 секунд:
Re: Как оптимизировать определение границ произвольной фигуры ?
>>В данном коде в их нет смысла, т.к. происходит только чтение.
я не о смысле, а о том что в этих чудесных процедурах происходит. ато медведя уже поделили
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

zub писал(а):статический

Так он там говорит правду? Круто... надо проверить, с секундомером...
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Круто... надо проверить, с секундомером
что крутого? Я почемуто не сомневался - художники неумеют в указатели
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

zub писал(а):Я почемуто не сомневался художники неумеют в указатели

А чего там уметь? Фигулька слева, назначил. Фигуька справа разыменовал. А и ещё кругляшку, с буквой "а" посередине - нужно печатать, когда адрес присваиваешь. Вот и вся наука. Нет?
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Вот и вся наука. Нет?
Главная наука - где они ненадо, где можно, где без них никак.
Идеальная программа это "где они ненадо", но жизнь иногда заставляет "без них никак".
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

zub писал(а):но жизнь иногда заставляет

Не ну когда рекорды, с фигульками удобно... а вот когда просто массивы... необходимость в них есть или нет? Вот в чём суть фишки.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>> необходимость в них есть или нет?
На ровном месте необходимости в них никакой нет

>>фишки
нет тут никаких фишек
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

zub писал(а):На ровном месте необходимости в них никакой нет

А зачем тогда их в битмапе делают? По строчкам скакать? Но какой смысл, скакать по строчкам, когда их все подряд перебирают? Соответственно, куча лишних итераций, при сканлайне происходит. А без сканлайна, всё будет на 0.00001 секунды быстрее.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Вот и вся наука
Как ты себе это представляешь без них? разницу между статическим и динамическим массивом понимаешь?
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

zub писал(а):Как ты себе это представляешь без них?

Там же Data - это одномерный массив. Перебирается for i := 0 to pred(x * y) do Data[i] := $ffffff; и в итоге, в цикле будут всё те же самые значения.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Давай подробней, телепаты не телепатируют
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

zub писал(а):Давай подробней, телепаты не телепатируют

Да в общем-то я всё написал. Перебор одного массива - это максимальная скорость при обработке битмапа, когда его перебирают целиком. Это быстрее чем сканлайном.
Либо так:

Код: Выделить всё

for i := 0 to pred(x * y) do Data[i] := $ffffff;

Либо так:

Код: Выделить всё

for i := 0 to pred(x * y) do begin
Data^ := $ffffff;
inc(Data);
end;
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Да в общем-то я всё написал
какуюто ерунду написал. что такое Data, x, y...? про что вообще данный кусок?
Ну и в который раз повторяю - нету прямого доступа к пикселям изображения на экране
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

zub писал(а):нету прямого доступа к пикселям изображения на экране

А при чём здесь экран? Мы битмапку курочим.

Вот код Alex2013 уже его приводил:
Alex2013 писал(а):procedure TRawForm.Button1Click(Sender: TObject);
begin
Image1.Picture.Bitmap.BeginUpdate;

   With  Image1.Picture.Bitmap.RawImage do begin

     FillByte(Data^,  DataSize  ,60);//Заполнение через RawImage
   
end;
   Image1.Picture.Bitmap.EndUpdate;
   Image1.Refresh;

end;


Добавлено спустя 6 минут 42 секунды:
Re: Как оптимизировать определение границ произвольной фигуры ?
А в BGRA - это выглядит так:

Код: Выделить всё

       
 p := bmp.Data;
        for x := 0 to pred(bmp.NbPixels) do begin
          p^.red := not p^.red;  //invert red channel
          inc(p);
          end;
 
Ответить