![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Быстрый сдвиг массива точек на дробное значение точек. [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)