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

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

Вращение битмапа [D7, WinXP]


X-Disa ©   (2004-12-01 14:00:00) 

Здрасте. Вот вопрос, как быстро повернуть битмап вокруг заданной точки на какой-то угол?


X-Disa   (2004-12-06 16:33:00) [1]

Можно поподробней, че то не понял как эта штука работает :(


Ozone   (2004-12-05 14:23:00) [2]

PlgBlt


Студент_   (2004-12-05 12:52:00) [3]

Извиняюсь - перепутал height и width.


X-Disa   (2004-12-05 12:52:00) [4]

Это я сам так писал, на картинке белые точки появляются. Как можно без искажения?


Студент_   (2004-12-04 21:31:00) [5]

И не забыть подключить math в uses.
А вообще выбор функции зависит от конкретной задачи.


Студент_   (2004-12-04 20:17:00) [6]

Вообще для этого, что в OpenGL'e, что в Direct'e существуют специальные функции, работающие довольно быстро. Но если не знаем их или не хотим использовать - можно вручную, заглянув в справочник по математике (куда ж без него:)

...
var
 Form1: TForm1;
 angle: integer = 0;
 bmp: TBitmap;
...
procedure TForm1.rotate;
var
i, j, x, y: integer;
ang:  extended;
c, s: real;

begin
 inc(angle);
 ang:= degtorad(angle);
 s:=sin(ang);
 c:=cos(ang);
 caption:=inttostr(angle);
 for i:=0 to bmp.height do
         for j:=0 to bmp.Width do
         begin
            x:=ceil(i*c + j*s);
            y:=ceil(-i*s + j*c);
            canvas.Pixels[x+200,y+200]:=bmp.canvas.Pixels[i,j];
         end;
end;

200 - отступ от края экрана, чтобы помеcтился рисунок. angle - угол поворота - рекомендую для примера засунуть его в ontimer.
Естественно, bmp в начале нужно загрузить из файла.

procedure TForm1.FormCreate(Sender: TObject);
begin
 bmp:=TBitmap.Create;
 bmp.LoadFromFile('an.bmp');
end;

И в конце очистить:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 bmp.Free;
end;

Работает довольно медленно и немного искажает картинку, но зато вручную :))


Наверх

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