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

Вниз

Направте на правильный путь решения проблеммы..   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.036 c
9-1074649900
Barlok
2004-01-21 04:51
2004.05.30
экспорт из 3d studio max?


3-1083842843
}|{yk
2004-05-06 15:27
2004.05.30
Две связанные таблицы имеют триггеры на update


14-1084523671
Соловьев
2004-05-14 12:34
2004.05.30
Доступ по ФТП


8-1079335711
Oyster
2004-03-15 10:28
2004.05.30
Как проиграть стандартный клип Windows?


6-1081497901
bykopor
2004-04-09 12:05
2004.05.30
Программная шара!!! NetShareAdd





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский