Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.07;
Скачать: CL | DM;

Вниз

Вывода битмапа по маске и под углом   Найти похожие ветки 

 
Evgnevius ©   (2009-12-09 14:31) [40]

а что такое xForm?


 
Рамиль ©   (2009-12-09 15:28) [41]


> а что такое xForm?

Матрица аффинного преобразования (в виде рекорда).     XFORM = record
         eM11 : Single;
         eM12 : Single;
         eM21 : Single;
         eM22 : Single;
         eDx : Single;
         eDy : Single;
      end;
    LPXFORM = ^XFORM;
    _XFORM = XFORM;
    TXFORM = XFORM;
    PXFORM = ^XFORM;

   
Трудно нажать Ctrl и щелкнуть?


 
antonn ©   (2009-12-09 15:48) [42]


> Этот перебор и есть главный тормоз не смотря на то, что
> используется ScanLine.

попробуй фастлиб


 
Evgnevius ©   (2009-12-09 15:59) [43]

Рамиль, спасибо за ваше терпение. Я нажимал Ctrl и щёлкал. Кроме того, нажимал ещё и F1.
antonn, Если фастлиб не использует видеокарту, то спасибо. Процессор не хочу напрягать, так как пишу плагин, в котором на одном битмапе другой должен выводиться в разных пропорциях и с разными углами поворотов от нескольких сотен до нескольких тысяч раз. Координаты вывода для каждого битмапа должны пересчитываться динамически. Спасибо за предложенную помощь.


 
antonn ©   (2009-12-09 16:05) [44]

не стоит выкидывать процессор, он не так уж плох :)
если нужно выводить с последующим отображением на экране, то зачем делать это несколько тысяч раз?


 
Evgnevius ©   (2009-12-11 23:10) [45]

Несколько тысяч - это конечно многовато. Скорее - несколько сотен раз. А зачем - это уже зависит от поставленной задачи. Если хотите, можете поглядеть, на наше творчество 2-х летней давности, то, что мы сделали без использования OpenGL, чисто на ресурсах процессора.

www.ntlab.su


 
Evgnevius ©   (2009-12-12 00:10) [46]

Ладно, ребят. Вижу, что все вы хотите мне помочь, однако, как я понял, специалисты по OpenGL на этот топик не заходили. Придётся исхитряться


 
Рамиль_   (2009-12-12 16:28) [47]

GDI+ за глаза.
Почитайте книжку про компьютерную графику, будет намного легче.


 
Sapersky   (2009-12-12 19:24) [48]

Evgnevius ©   (09.12.09 01:22) [37]

М-да, похоже, чукча катастрофически не читатель.
Ткну носом в фастлибовский код (вариант без сглаживания). Разницу с твоим в кол-ве операций замечаешь?

for y:=0 to Dst.Height-1 do begin
 dy:=cy-y;
 sdx:=(ax+(isin*dy))+xd;
 sdy:=(ay-(icos*dy))+yd;
 for x:=0 to Dst.Width-1 do begin
   dx:=sdx shr 16;
   dy:=sdy shr 16;
   if(dx<Src.Width)and(dy<Src.Height)then pc^:=Src.Pixels24[dy,dx];
   Inc(sdx,icos);
   Inc(sdy,isin);
   Inc(pc);
 end;
 pc:=Ptr(Integer(pc)+Dst.Gap);
end;

Теория, если коротко, такова:
1) Вращение - это аффинное преобразование, и сводится к операции умножения на матрицу (уже писали). Точнее, конкретно для вращения (+ пропорционального масштабирования) достаточно иметь два коэфф-та, синус-косинус, ну и смещение (ещё два числа).
2) Для поддержки масштабирования/сглаживания удобнее считать обратное преобразование, т.е. результирующая картинка считается неповёрнутой, а из исходной пиксели выбираются с поворотом.
3) Можно упростить формулу преобразования за счёт того, что последовательно считаются соседние по горизонтали пиксели, и в результате свести всё к двум сложениям на пиксель.
4) Желательно использовать fixed point (эмуляцию дробных чисел целыми), т.к. с плавающей точкой Round тормозит.

Хотя сотни FPS на высоких разрешениях результирующей картинки этот код может не потянуть (старичок P3-1200, 800*600, 8 бит: без сглаживания - 70 FPS, со сглаживанием - 40), но по сравнению с твоим - в десятки-сотни раз быстрее.

Видеокарта, конечно, повернёт быстрее, но там свои проблемы. Передача данных в видеопамять не мгновенна, а если понадобится в обратном направлении (для доп. обработки на CPU) - наверняка растеряешь на этом всё ускорение, разве что на самых последних картах оно не очень тормозит (GF GTS, возможно GF 8000-9000 серий). Как вариант - перенести вообще всю обработку картинок на видеокарту (шейдеры, GPGPU...). Но это, прямо скажем, непросто, а для каких-то специфических алгоритмов может быть вообще невозможно.



Страницы: 1 2 вся ветка

Текущий архив: 2010.02.07;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.012 c
2-1260364091
abhtr
2009-12-09 16:08
2010.02.07
Помогите перевести str1 := =?UTF-8?B?0JrQsNC6INC/0L7QsdC...


15-1259732695
ZeroDivide
2009-12-02 08:44
2010.02.07
Портятся ли блоки питания без нагрузки?


2-1260456472
Taras
2009-12-10 17:47
2010.02.07
Печать с помощью QuickReport


4-1228802818
DimonS
2008-12-09 09:06
2010.02.07
Как реализовать чтение iButton?


4-1228475749
[RU].banOK
2008-12-05 14:15
2010.02.07
Пр0блемка с T00lHelp32