Текущий архив: 2004.05.30;
Скачать: CL | DM;
ВнизНаправте на правильный путь решения проблеммы.. Найти похожие ветки
← →
Rule © (2004-05-14 10:14) [0]необходимо в зависимости от определенных условий отображать картинку под разным углом, который изменяется от 0 до 90 градусов, как мне сделать так чтобы быстро разворачивать картинку, есть два варианта
первы в лоб, но тупой сделать 90 картинок в фотошопе и отображать ту что надо
второй способ есть алгоритмы томже делфиворлд по развороту картинок, но разворачивает он долго а мне нада быстро
чего посоветуете, с графикой я не дружу не приходилось както
вообще проблемма заключается в том что у меня вертолетный тренажер и на экране отображается один из приборов на котором как бы самолетик нарисован и он наклоняется в зависимости от наклона вертолета, ну в общем вот так, всем спасибо за внимание
← →
DVM © (2004-05-14 10:16) [1]Может за DirectX взяться? Там разворот на пару порядков быстрее можно сделать, чем на GDI, я не говорю уже о VCL.
← →
Rule © (2004-05-14 10:23) [2]>DVM © (14.05.04 10:16) [1]
>Может за DirectX взяться? Там разворот на пару порядков быстрее
>можно сделать, чем на GDI, я не говорю уже о VCL.
тоесть ты хочешь сказать что там есть готовые функции для этого, я уже думал о директаз даже библиотеку поставил DelphiX, но как это сделать и есть ли это самый рациональный вариант (вопросы надо поставить наоборот ибо непопорядку)
← →
Паниковский © (2004-05-14 10:40) [3]Надо также не забывать, что Си использует для своих функций радианы, а не
градусы, и все вызовы тригонометрических функций должны передавать в
параметрах также радианы. Для того, чтобы перевести радианы в градусы, мы
должны написать простые макросы.
Deg_To_Rad(deg) {pi*deg/180;}
Rad_To_Deg(rad) {180*rad/pi;}
Другими словами, это значит, что в круге 360 градусов или 2хPi радиан.
Теперь нам нужно написать функцию для вращения объекта. Давайте просто
используем формулы, не задумываясь о том, как и почему они работают.
new_x = x*cos(angle) - y*sin(angle);
new_y = y*cos(angle) + y*sin(angle);
поворот обьекта на градус angle
"Программирование игр в Дос" Андрэ Ла Мот
/*Название может быть не точным*/
← →
Rule © (2004-05-14 10:47) [4]>Паниковский © (14.05.04 10:40) [3]
ну переводить крадусы в радианы и обратно уж както имею, а вот ссылка на вот это вот не помешает :), есть реальные ещё предложения ?
← →
Alx2 © (2004-05-14 10:49) [5]>Rule © (14.05.04 10:14)
Статья есть на форме про QPixels
← →
Alx2 © (2004-05-14 10:49) [6]На форуме, то есть :)
← →
Люцифер (2004-05-14 10:50) [7]ну и копируеш точку на новое место
← →
Rule © (2004-05-14 10:56) [8]>http://dmgunknown.chat.ru/docs/ft.htm
нашел вот статью но она на си, хотелось бы на делфи (си плохо знаю)
← →
Паниковский © (2004-05-14 10:58) [9]Rule
поворачиваеш координаты пиксела копиреш на новое место.
а DirectX может оказатся жирно для какой то фичи.
← →
Паниковский © (2004-05-14 11:08) [10]function TfrmD3D.InitPoints : HRESULT;
var
pVertices : PByte;
hRet : HRESULT;
i : Integer;
begin
for i := 0 to 5 do
with VPoints [i] do begin
X := 150 + cos (Angle + i * 2 * Pi / 5) * Radius;
Y := 150 + sin (Angle + i * 2 * Pi / 5) * Radius;
Z := 0.0;
RHW := 0.0;
Color := D3DCOLOR_XRGB(255, 0, 0);
end;
for i := 0 to 4 do
with VPoints [6 + i] do begin
X := 150 + cos (-Angle - i * Pi / 2) * Radius / 2;
Y := 150 + sin (-Angle - i * Pi / 2) * Radius / 2;
Z := 0.0;
RHW := 0.0;
Color := D3DCOLOR_XRGB(0, 0, 255);
end;
hRet := FD3DDevice.CreateVertexBuffer(SizeOf(VPoints),
D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, FD3DVB);
if Failed (hRet) then begin
Result := hRet;
Exit;
end;
hRet := FD3DVB.Lock(0, SizeOf(VPoints), pVertices, 0);
if Failed (hRet) then begin
Result := hRet;
Exit;
end;
Move (VPoints, pVertices^, SizeOf(VPoints));
hRet := FD3DVB.Unlock;
if Failed (hRet) then begin
Result := hRet;
Exit;
end;
hRet := FD3DDevice.SetStreamSource(0, FD3DVB, SizeOf(TCUSTOMVERTEX));
if Failed (hRet) then begin
Result := hRet;
Exit;
end;
Result := FD3DDevice.SetVertexShader(D3DFVF_CUSTOMVERTEX);
end;
"DirectX графика в прoектах Delphi"
Михаил Краснов
← →
Alx2 © (2004-05-14 11:09) [11]Вот поградусный поворот на 360 градусов с использованием QPixels, про которую есть статья на форуме:
Procedure TForm1.Button1Click(Sender: TObject);
Const
BinaryFactor = 10;
Function rnd(Const x, y: Integer): TPoint;
Begin
Result.X := x Shr BinaryFactor;
Result.Y := y Shr BinaryFactor;
End;
Var
bm1, bm2: TBitmap;
q1, q2: TQuickPixels;
w, h, k, x_new, y_new, x0, y0: integer;
cosphi, sinphi, x, y : integer;
Begin
bm1 := tbitmap.Create;
bm2 := TBitmap.Create;
q1 := TQuickPixels.Create;
q2 := TQuickPixels.Create;
Try
bm1.loadfromfile("somefile.BMP");
w := bm1.width;
h := bm1.height;
bm2.Width := w;
bm2.height := H;
bm2.PixelFormat := bm1.PixelFormat;
q1.Attach(bm1);
q2.Attach(bm2);
x0 := w Div 2;
y0 := h Div 2;
For k := 1 To 360 {полный поворот на 360 градусов} Do
Begin
cosphi := round(cos(k * Pi / 180) * (2 Shl (BinaryFactor - 1)));
sinphi := round(sin(k * Pi / 180) * (2 Shl (BinaryFactor - 1)));
For x_new := 0 To w - 1 Do
Begin
y := ((-x_new + x0) * sinphi - y0 * cosphi) + (y0 Shl BinaryFactor);
x := ((-x0 + x_new) * cosphi - y0 * sinphi) + (x0 Shl BinaryFactor);
For y_new := 0 To h - 1 Do
Begin
With rnd(x, y) Do
If (x >= 0) And (x < w) And (y >= 0) And (y < h) Then
q2.SetPixel(x_new, y_new, q1.getpixel(x, y));
inc(y, cosphi);
inc(x, sinphi);
End;
End;
BitBlt(Canvas.Handle, 0, 0, w, h, bm2.canvas.handle, 0, 0, srccopy);
End;
Finally
q1.free;
q2.free;
bm1.Free;
bm2.free;
End;
End;
Для поднятия скорости работаем с целыми числами.
← →
Паниковский © (2004-05-14 11:10) [12]Посмотри CopyRect в хелпе.
Forward.
← →
Паниковский © (2004-05-14 11:12) [13]Удалено модератором
Примечание: Offtopic
← →
Rule © (2004-05-14 11:23) [14]Паниковский © (14.05.04 10:58) [9]
да чего, если есть готовая функция, чего бы и не воспользоваться?
вот и хотелось бы поинтересоваться, есть ли готовое решение для такой вот фичи, ну там функции в директах или ещё чего ?
Зачем придумывать велосипед, ведь руки ни чем не связаны...и программа не на выставку а в единственном экземпляре, раз показать лишь бы работало
← →
Паниковский © (2004-05-14 11:25) [15]Rule
Тогда посмотри TCanvas.CopyRect(...) на сколько я помню он поворачивает.
← →
Rule © (2004-05-14 11:28) [16]>Паниковский © (14.05.04 11:12) [13]
>
>А счас придет Зотов и будет раздавать LMD...
в CopyRect нет фичи под углом, смотрел (может не тот хлеп), а за коды огромное спасибо, чегото я пропустил, а ведь смотрел,
а до прихода Юрия нада сматываться, а то как дадут такой значек ...:)
← →
Rule © (2004-05-14 11:37) [17]Copies part of an image from another canvas into the canvas.
Delphi syntax:
procedure CopyRect(const Dest: TRect; Canvas: TCanvas; const Source: TRect);
C++ syntax:
void __fastcall CopyRect(const TRect &Dest, TCanvas* Canvas, const TRect &Source);
Description
Use CopyRect to transfer part of the image on another canvas to the image of the TCanvas object. Dest specifies the rectangle on the canvas where the source image will be copied. The Canvas parameter specifies the canvas with the source image. Source specifies a rectangle bounding the portion of the source canvas that will be copied.
The portion of the source canvas is copied using the mode specified by CopyMode.
вот это вот хелп по копирект, но про угол тут ничего не сказано, только про прямоугольники
← →
1g0r © (2004-05-14 11:39) [18]OpenGL
если подойдет - TGLPanel из кладовки
else мыло, icq
все равно сижу заняться нечем
← →
Паниковский © (2004-05-14 11:41) [19]procedure CopyRect(const Dest: TRect; Canvas: TCanvas; const Source: TRect);
Принимающие передающие координаты переверни. Вообщем посмотри он это делал!
← →
Alx2 © (2004-05-14 11:43) [20]>Rule © (14.05.04 11:37) [17]
Тебе же написали уже готовое решение.
В моем посте от 11:09 поворот делаем так:
x_new - положение точки x после поворота вокруг точки (x0,y0).
y_new - положение точки y после поворота вокруг точки (x0,y0).
cosphi = cos(phi) - косинус угла поворота.
sinphi = sinphi) - косинус угла поворота.
Для заданного x_new и y_new вычисляем "оригинал":
y := ((-x_new + x0) * sinphi - y0 * cosphi) + y0;
x := ((-x0 + x_new) * cosphi - y0 * sinphi) + x0;
Потом берем "старую" точку с координатами (x,y) и ставим ее (на новом битмапе) на новое место с координатами (x_new, y_new).
← →
Rule © (2004-05-14 11:53) [21]>Паниковский © (14.05.04 11:41) [19]
>procedure CopyRect(const Dest: TRect; Canvas: TCanvas; const
>Source: TRect);
>Принимающие передающие координаты переверни. Вообщем посмотри он
>это делал!
опа, во блин заработался, а действитлеьно (смеется громко над собой), и не подумал даже о такомвот решении.
спасибо огромное за терпение, а то туплю, с каждым бывает :)
2Alx2 © (14.05.04 11:43) [20]
да-да-да-да!!! я все понял, ток протупил малек, не обижайтесь :)
все получилось и работает нормально (удовлетворительно номам), всем огромное спасибо за внимание и за оказанную и предложенную помощь
Страницы: 1 вся ветка
Текущий архив: 2004.05.30;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.035 c