Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];

Вниз

поворот спрайта (програмно)   Найти похожие ветки 

 
TButton ©   (2005-10-25 02:30) [0]

не совсем уверен, что знаю как реализовать сабж
для реализации не исползуется ни DX, ни OGL
просто софтварно
моё предположение
нужно вычислять полярные координаты кадого поворачиваемого пиксела
относительно точки поворота,
изменять угол на угол поворота
и выводить пиксель
но, боюсь появления гапов
(дырок в которую не попал ни один пиксель)

есть другие варианты (алгоритмы)?


 
Antonn ©   (2005-10-25 06:20) [1]

сам мучался, вот глянь то, что получилось:
http://kladovka.net.ru/index.cgi?pid=list&rid=252


 
JUS   (2005-10-25 06:32) [2]

Ща заценю.

А я вот панель сегодня до утра аж рисовал в Corel"е часов пять. Всё придумывал как что разместить, кое как закончил. Нарисовал красиво, аж неверится самому что это я сам нарисовал, самому нравится.


 
JUS   (2005-10-25 06:35) [3]

Круто


 
JUS   (2005-10-25 06:50) [4]

А я вот панель сегодня до утра аж рисовал в Corel"е часов пять. Всё придумывал как что разместить, кое как закончил. Нарисовал красиво, аж неверится самому что это я сам нарисовал, самому нравится.

это я веткой ошибся, сорри!


 
TButton ©   (2005-10-25 13:24) [5]


> сам мучался, вот глянь то, что получилось:

я из тех, кто
> идут лесом:)
код поворота вообще никак не откоментирован
все в перемешку
в принципе
у меня всё работает
минус один - гапы...
попробовал увеличить дискретизацию вдвое
пока не помогло
гапы сменились глюками =)


 
MBo ©   (2005-10-25 14:27) [6]

>минус один - гапы...
Для избавления от них - делай обратное маппирование - т.е. для каждой точке новой картинки находи соотв. точку исходной.

Полярные координаты - не нужны, лишняя работа.

XOld = XCenter + (XNew-XCenter)*Cos(fi) - (YNew-YCenter)*Sin(fi)
YNew=YCenter +  (XNew-XCenter)*Sin(fi) + (YNew-YCenter)*Cos(fi)


 
MBo ©   (2005-10-25 14:31) [7]

Во второй строчке слева - YOld


 
TButton ©   (2005-10-26 00:53) [8]

2 MBo
хм... я уже полярными замутил
починил я таки глюк с повышением частоты дискретизации
теперь каждый пиксель отрисовывается 4 раза
гапов нет, но потеря в скорости чувствуется

просто у меня модуль для работы с направлениями и расстояниями без дела валялся =)
> XOld = XCenter + (XNew-XCenter)*Cos(fi) - (YNew-YCenter)*Sin(fi)
> YNew=YCenter +  (XNew-XCenter)*Sin(fi) + (YNew-YCenter)*Cos(fi)
а прямое без полярных как выглядит?
или достаточно ограничиться этим, обозначив зону поиска как окружность с радиусом равным половине диагонали спрайта?


 
MBo ©   (2005-10-26 07:33) [9]

>а прямое без полярных как выглядит?
Из этих же формул можно выразить.
Будет почти тот же вид, только знаки слагаемых с синусами поменяются.


 
TButton ©   (2005-10-26 14:52) [10]


> Из этих же формул можно выразить.

и действительно...
что-то я протупил с утра по-раньше


 
Zer0 ©   (2005-10-28 02:38) [11]

извращенцы блин. гуглить софтверную отрисовку (растеризацию) затекстуреных треугольников или rotozoom
ускорение по сравнению с предложенными вариантами на порядок


 
TButton ©   (2005-10-28 04:39) [12]


> извращенцы блин. гуглить софтверную отрисовку (растеризацию)
> затекстуреных треугольников или rotozoom
> ускорение по сравнению с предложенными вариантами на порядок

3Д отсутствует напрочь
физически отсутствует
двиган ориентирован на чисто софтверный просчёт
и пиксельную графику


 
TButton ©   (2005-10-28 04:56) [13]

2 MBo
нифига не выйдет
для вычисления XNew мне понадобится YNew
и наоборот...


 
MBo ©   (2005-10-28 06:55) [14]

>TButton ©   (28.10.05 04:56) [13]
Еще раз повторю - обратное маппирование эффективнее, бесплатно избавляет от дырок.

А для прямого, если все же очень хочется -

XNew = XCenter + (XOld-XCenter)*Cos(fi) + (YOld-YCenter)*Sin(fi)
YNew=YCenter  -  (XOld-XCenter)*Sin(fi) + (YOld-YCenter)*Cos(fi)

Это фактически умножение исходного вектора (в однородных координатах)
(XOld, YOld, 1) на произведение матриц афинного преобразования -переноса, поворота, и обратного переноса


 
TButton ©   (2005-10-28 08:17) [15]


> на произведение матриц афинного преобразования -переноса,
>  поворота, и обратного переноса

я технарь, с высшей математикой - напряг
но в общих чертах понял =)
просто у нас ещё раньше возникло непонимание
я понял твой пост, как
необходимость дополнять прямое мапирование обратным =)


 
MBo ©   (2005-10-28 08:28) [16]

>я понял твой пост, как
необходимость дополнять прямое мапирование обратным =)

Ну теперь разобрался, что прямое вообще не нужно?

Пример, правда, усложненный, есть в статье:
http://www.delphimaster.ru/articles/pixels/index.html


 
TButton ©   (2005-10-29 01:10) [17]


> Ну теперь разобрался, что прямое вообще не нужно?

да =) ещё раз спасибо =)
> http://www.delphimaster.ru/articles/pixels/index.html

собсна с этого я и начинал =)


 
Fenik ©   (2005-10-30 00:38) [18]

> TButton ©

посмотри это
http://delphimaster.net/view/9-1129046372/


 
Antonn ©   (2005-10-30 06:05) [19]

или вот, "очеловеченая" процедурка из модуля(пост [1])
_SourceBitmap - поворачиываемый спрайт
_DestBitmap - битмап вывода
_x,_y - координаты левого верхнего угла выводимого спрайта на _DestBitmap
centerX,centerY - точка поворота(можно и не только относительно центра) _SourceBitmap
transparentColor - "прозрачный цвет"
_angle - угол поворота в радианах

procedure CopyRotateTransparentBitmap(_SourceBitmap,_DestBitmap: TBitmap; _x,_y,centerX,centerY:integer; transparentColor:Tcolor; _angle: Double);
const Pixels = MaxInt div SizeOf(TRGBTriple);
type PRGBArray = ^TRGBArray;
TRGBArray = array[0..Pixels-1] of TRGBTriple;
var cosRadians,sinRadians : Double;
x,y,x_cor,y_cor,x_corS,y_corS,inXOut,inXPr,inXRotated,inYOut,inYPr,inYRotated: Integer;
RowOut, RowIn: PRGBArray;
rc1, bc1, gc1:byte;
begin
if (_x)> _DestBitmap.Width-1 then exit; if (_x+_DestBitmap.Width)< 0 then exit;   //проверки на "вхождение" хоть части вращаемого битмапа в выводимый
if (_y)> _DestBitmap.Height-1 then exit; if (_y+_DestBitmap.Height)< 0 then exit;

_SourceBitmap.PixelFormat:=pf24bit; //убрать, если изначально этот формат
_DestBitmap.PixelFormat:=pf24bit;  //убрать, если изначально этот формат

sinRadians:=Sin(_angle);
cosRadians:=Cos(_angle);

if _x < 0 then x_corS:=abs(_x) else x_corS:=0;  //находим TRect исходного битмапа, который будет выводится,
if _y < 0 then y_corS:=abs(_y) else y_corS:=0;  //на тот случай, если выводим вращающийся битмап скраю на выводимый
if (_x+_SourceBitmap.Width)> _DestBitmap.Width then x_cor:=_x+_SourceBitmap.Width-_DestBitmap.Width else x_cor:=0;
if (_y+_SourceBitmap.Height)> _DestBitmap.Height then y_cor:=_y+_SourceBitmap.Height-_DestBitmap.Height else y_cor:=0;

rc1:=GetRValue(transparentColor);  //цвет прозрачности, не копируется
gc1:=GetGValue(transparentColor);
bc1:=GetBValue(transparentColor);

for x:=_SourceBitmap.Height-1-y_cor downto y_corS do begin
RowIn:=_SourceBitmap.Scanline[x+_y];
inXPr:=2*(x-centerY)+1;
for y:=_SourceBitmap.Width-1-x_cor downto x_corS do begin
inYPr:=2*(y-centerX)+1;

inYRotated:=Round(inYPr*CosRadians-inXPr*sinRadians);
inXRotated:=Round(inYPr*sinRadians+inXPr*cosRadians);

inYOut:=(inYRotated-1) div 2 + centerX;
inXOut:=(inXRotated-1) div 2 + centerY;

if (inYOut >=0)and(inYOut <=_SourceBitmap.Width-1)and(inXOut >=0)and(inXOut <=_SourceBitmap.Height-1) then begin

RowOut:=_SourceBitmap.Scanline[inXOut];
if not((RowOut[inYOut].rgbtRed=rc1)and(RowOut[inYOut].rgbtGreen=gc1)and(RowOut[inYOut].rgbtBlue=bc1)) then
RowIn[y+_x] := RowOut[inYOut];
end;
end;
end;
end;


 
OSokin ©   (2005-11-01 18:33) [20]

procedure DrawRotated(DC: HDC; Bitmap: HBitmap; X, Y: Integer; Angle: Real);
var
 TempDC: HDC;
 BmpSize: SIZE;
 t: Real;
 Points: Array[0..2] of TPoint;
 Xc, Yc: integer;
begin
 TempDC := CreateCompatibleDC(DC);
 SelectObject(TempDC, Bitmap);
 GetBitmapDimensionEx(Bitmap, BmpSize);

 Xc := X + (BmpSize.cX div 2); //I"a`o~i^a"e`i` o"a*i"o`?
 Yc := Y + (BmpSize.cY div 2);

 t := Angle * 0.0174533;

 Points[0].X := Round((X - Xc) * cos(t) - (Y - Yc) * sin(t) + Xc);
 Points[0].Y := Round((Y - Yc) * cos(t) + (X - Xc) * sin(t) + Yc);

 Points[1].X := Round((X + BmpSize.cX - Xc) * cos(t) - (Y - Yc) * sin(t) + Xc);
 Points[1].Y := Round((Y - Yc) * cos(t) + (X + BmpSize.cX - Xc) * sin(t) + Yc);

 Points[2].X := Round((X - Xc) * cos(t) - (Y + BmpSize.cY - Yc) * sin(t) + Xc);
 Points[2].Y := Round((Y + BmpSize.cY - Yc) * cos(t) + (X - Xc) * sin(t) + Yc);

 PlgBlt(DC, Points, TempDC, 0, 0, BmpSize.cX, BmpSize.cY, 0, 0, 0);
 DeleteDC(TempDC);
end;



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

Форум: "Игры";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.011 c
1-1145334556
Layner
2006-04-18 08:29
2006.05.28
TChart > Axis > Scales > Automatic, но как показать график чуть


4-1141514317
Piter
2006-03-05 02:18
2006.05.28
Как добавить иконку во всплывающее меню?


15-1146597572
kilonet
2006-05-02 23:19
2006.05.28
Перевод книги в электронный формат


2-1147433954
Ламот
2006-05-12 15:39
2006.05.28
Запуск/закрытие стороннего приложения


1-1145271748
Viper_Omsk
2006-04-17 15:02
2006.05.28
Как передать данные из Excel в StringGrid?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский