Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Быстрый сдвиг массива точек на дробное значение точек. [D7, WinXP]


Дмитрий Белькевич ©   (2005-07-10 17:29:00) 

Нужно _быстро_ сдвинуть картинку 512x512 на дробное число точек. Сделал, что называется, 'в лоб'. 'В лоб' медленно:

    for i := BegCountX to EndCountX do
     for j := BegCountY to EndCountY do
      Buff8[j * Width + i] := Round(
       ABuff8[(j - IntY) * Width + i - IntX + FirstShift] * FirstInt +
       ABuff8[(j - IntY) * Width + i - IntX + SecShift] * SecondInt +
       ABuff8[(j - IntY) * Width + i - IntX + ThirdShift] * ThirdInt +
       ABuff8[(j - IntY) * Width + i - IntX + FourtShift] * FourthInt);

Считаю интенсивности четырех точек (FirstInt - FourthInt), и их относительные координаты (FirstShift-FourtShift).
IntY, IntX - целые части сдвига.
Точки лежат в двух линейных массивах. ABuff8 - оригинальный массив массив, Buff8 - получаемый.


Магнитон Борыч   (2005-07-10 22:16:00) [1]

Оптимизация в лоб:

 pp1 := BegCountX - IntX + FirstShift;
 pp2 := BegCountX - IntX + SecShift;
 pp3 := BegCountX - IntX + ThirdShift;
 pp4 := BegCountX - IntX + FourtShift;
 for i := BegCountX to EndCountX do begin
   aa := BegCountY * Width + i;
   dd := (BegCountY - IntY) * Width;
   for j := BegCountY to EndCountY do begin
     Buff8[aa] := Round(
       ABuff8[dd + pp1] * FirstInt +
       ABuff8[dd + pp2] * SecondInt +
       ABuff8[dd + pp3] * ThirdInt +
       ABuff8[dd + pp4] * FourthInt);
     Inc(aa, Width);
     Inc(dd, Width);
   end;
   pp1 := pp1 + 1;
   pp2 := pp2 + 1;
   pp3 := pp3 + 1;
   pp4 := pp4 + 1;
 end;


Если

Я так и не понял что значит "сдвинуть картинку 512x512 на дробное число точек"? Данные в массиве ABuff8 дробные? Как он и Buff8 связаны с картинкой?


Магнитон Борыч   (2005-07-10 21:50:00) [2]

А как обращаешься к пикселам?


Virgo_Style   (2005-07-10 21:18:00) [3]

По идее, переход к целым числам и, соответственно, отказ от Round должен кое-что дать... Хотя вряд ли это сильно поможет, но все же - попробуй избавиться от дробных чисел.

Например, Round(X*0.5)-> (X*5 div 10)


Наверх

Титульная страница Поиск, карта сайта Написать письмо