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

Вниз

Куб   Найти похожие ветки 

 
set ©   (2010-09-17 15:09) [0]

Здравствуйте!!! Я хотел нарисовать куб с помощью GDI чтобы он крутился на месте, много в интернете искал каким образом можно это сделать и выбрал способ с мировой матрицей. Проблема в том, что куб у меня сдвигается по оси у в верх и сжимается. Помогите разобратся пожалуйста, вот исходный код...

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls;

type
 TForm1 = class(TForm)
   Timer1: TTimer;
   procedure FormPaint(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 MIntVerKyb: array[1..8,1..3] of integer; //Массив координат вершин куба
 ReaYgolKyb: real; //Счетчик угла

implementation

{$R *.dfm}

/////////////////////////////До загрузки формы//////////////////////////////////
procedure TForm1.FormCreate(Sender: TObject);
begin
//Первначальные координаты вершин куба
MIntVerKyb[1, 1]:= 100;
MIntVerKyb[1, 2]:= 100;
MIntVerKyb[1, 3]:= 200;

MIntVerKyb[2, 1]:= 200;
MIntVerKyb[2, 2]:= 100;
MIntVerKyb[2, 3]:= 200;

MIntVerKyb[3, 1]:= 200;
MIntVerKyb[3, 2]:= 200;
MIntVerKyb[3, 3]:= 200;

MIntVerKyb[4, 1]:= 100;
MIntVerKyb[4, 2]:= 200;
MIntVerKyb[4, 3]:= 200;

MIntVerKyb[5, 1]:= 100;
MIntVerKyb[5, 2]:= 100;
MIntVerKyb[5, 3]:= 100;

MIntVerKyb[6, 1]:= 200;
MIntVerKyb[6, 2]:= 100;
MIntVerKyb[6, 3]:= 100;

MIntVerKyb[7, 1]:= 200;
MIntVerKyb[7, 2]:= 200;
MIntVerKyb[7, 3]:= 100;

MIntVerKyb[8, 1]:= 100;
MIntVerKyb[8, 2]:= 200;
MIntVerKyb[8, 3]:= 100;
end;

//////////////////////Рисование и вычисление координат куба/////////////////////
procedure TForm1.FormPaint(Sender: TObject);
var
i: integer;//Счетчик цикла
X, Y: integer;//Координаты линий
BlnF: boolean;//Завершает цикл

begin
BlnF:= false;
i:= 0;

With Form1.Canvas do
 begin
  Pen.Color:= clRed;//Цвет карандаша
  Brush.Color:= clBlack;//Цвет кисти
  While i <= 4 do
   begin
//Рисуем верхний квадрат куба
    i:= i + 1;
    //Ниже производится вычисление и перевод координат из трехмерного пространства в двумерное
    //Куб рисуется во фронтально диметрической проекуции
    //
    //                              z
    //                              z
    //                              z
    //                              z
    //                              z
    //                              z
    //                              0 x x x x x x x x x x x x
    //                                y
    //                                  y
    //                                    y
    //                                      y
    //                                        y
    //                                          y
    //
    X:= Trunc(MIntVerKyb[i, 1] + ((MIntVerKyb[i, 2] / 2) * sin(0.785)));
    Y:= Trunc((MIntVerKyb[i, 2] / 2) * sin(0.785) + MIntVerKyb[i, 3]);
    MoveTo(X,Y);
    If i = 4 then
     begin
      i:= 0;
      BlnF:= true;
     end;
    i:= i + 1;
    X:= Trunc(MIntVerKyb[i, 1] + ((MIntVerKyb[i, 2] / 2) * sin(0.785)));
    Y:= Trunc((MIntVerKyb[i, 2] / 2) * sin(0.785) + MIntVerKyb[i, 3]);
    LineTo(X,Y);
    i:= i - 1;
    If BlnF = true then break;
   end;

//Рисуем нижний квадрат куба
  BlnF:= false;
  i:= 4;
  While i <= 8 do
   begin
    i:= i + 1;
    X:= Trunc(MIntVerKyb[i, 1] + ((MIntVerKyb[i, 2] / 2) * sin(0.785)));
    Y:= Trunc((MIntVerKyb[i, 2] / 2) * sin(0.785) + MIntVerKyb[i, 3]);
    MoveTo(X,Y);
    If i = 8 then
     begin
      i:= 4;
      BlnF:= true;
     end;
    i:= i + 1;
    X:= Trunc(MIntVerKyb[i, 1] + ((MIntVerKyb[i, 2] / 2) * sin(0.785)));
    Y:= Trunc((MIntVerKyb[i, 2] / 2) * sin(0.785) + MIntVerKyb[i, 3]);
    LineTo(X,Y);
    i:= i - 1;
    If BlnF = true then break;
   end;

//Рисуем Вертикальные линии соединяющие верхний и нижний квадрат
  BlnF:= false;
  i:= 0;
  While i <= 8 do
   begin
    i:= i + 1;
    X:= Trunc(MIntVerKyb[i, 1] + ((MIntVerKyb[i, 2] / 2) * sin(0.785)));
    Y:= Trunc((MIntVerKyb[i, 2] / 2) * sin(0.785) + MIntVerKyb[i, 3]);
    MoveTo(X,Y);

    i:= i + 4;
    X:= Trunc(MIntVerKyb[i, 1] + ((MIntVerKyb[i, 2] / 2) * sin(0.785)));
    Y:= Trunc((MIntVerKyb[i, 2] / 2) * sin(0.785) + MIntVerKyb[i, 3]);
    LineTo(X,Y);
    If i = 8 then break;
    i:= i - 4;
   end;
 end;

ReaYgolKyb:= ReaYgolKyb + 0.01;//Счетчик угла поворота
//С помощью мировой матрицы начинаем вращать куб вокруг оси х
For i:= 1 to 8 do
 begin
  MIntVerKyb[i, 2]:=Trunc((MIntVerKyb[i, 2] * cos(ReaYgolKyb)) - (MIntVerKyb[i, 3] * sin(ReaYgolKyb)));
  MIntVerKyb[i, 3]:=Trunc((MIntVerKyb[i, 2] * sin(ReaYgolKyb)) + (MIntVerKyb[i, 3] * cos(ReaYgolKyb)));
 end;

end;

///////////////////////////Перерисовка каждые 35 милесекунд/////////////////////
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Repaint;//Перерисовываем форму
end;

end.


 
12 ©   (2010-09-17 15:15) [1]


>   MIntVerKyb[i, 2]:=Trunc((MIntVerKyb[i, 2] * cos(ReaYgolKyb))
> - (MIntVerKyb[i, 3] * sin(ReaYgolKyb)));
>   MIntVerKyb[i, 3]:=Trunc((MIntVerKyb[i, 2] * sin(ReaYgolKyb))
> + (MIntVerKyb[i, 3] * cos(ReaYgolKyb)));

не надо портить исходные данные, из-за машинной погрешности может быть смещение

вращайте лучше копию


 
set ©   (2010-09-17 15:27) [2]


> 12 ©   (17.09.10 15:15) [1]
> >   MIntVerKyb[i, 2]:=Trunc((MIntVerKyb[i, 2] * cos(ReaYgolKyb))
> > - (MIntVerKyb[i, 3] * sin(ReaYgolKyb)));>   MIntVerKyb[i,
>  3]:=Trunc((MIntVerKyb[i, 2] * sin(ReaYgolKyb)) > + (MIntVerKyb[i,
>  3] * cos(ReaYgolKyb)));не надо портить исходные данные,
>  из-за машинной погрешности может быть смещение вращайте
> лучше копию

Что то я непонял что за копию вращать?


 
12 ©   (2010-09-17 15:43) [3]

копию куба

> MIntVerKyb
не трогать
новые положения точек рассчитывать на основании его, но в какой-нить MIntVerKyb2

и рисовать его, MIntVerKyb2.


 
set ©   (2010-09-17 16:05) [4]

Мысль понятна, но как это сделать немогу даже представить


 
12 ©   (2010-09-17 16:17) [5]

автор кода и не может разобраться? :)


 
Ega23 ©   (2010-09-17 16:32) [6]


> Мысль понятна, но как это сделать немогу даже представить

Так код-то чей, твой или нет?


 
set ©   (2010-09-17 16:36) [7]

Немогу разобратся, я не мастер математики. Попробовал так:

For i:= 1 to 8 do
 begin
  MIntVerKyb2[i, 2]:=Trunc((MIntVerKyb[i, 2] * cos(ReaYgolKyb)) - (MIntVerKyb[i, 3] * sin(ReaYgolKyb)));
  MIntVerKyb2[i, 3]:=Trunc((MIntVerKyb[i, 2] * sin(ReaYgolKyb)) + (MIntVerKyb[i, 3] * cos(ReaYgolKyb)));
 end;

по оси игрек куб вверх вниз пругать стал и то сжимается то разжимается.


 
han_malign   (2010-09-17 16:37) [8]


> но как это сделать немогу даже представить

два текущих угла поворота, по ним достаточно построить два ортогональных  вектора, чтобы рассчитать остальные вершины куба...


 
set ©   (2010-09-17 16:37) [9]

код писал я сам. Просто прочитав информацию с сайта.


 
Ega23 ©   (2010-09-17 16:41) [10]


> два текущих угла поворота, по ним достаточно построить два
> ортогональных  вектора, чтобы рассчитать остальные вершины
> куба...


Потом Z-ордер построить и по нему грани закрасить.


 
12 ©   (2010-09-17 16:51) [11]

ну просто же


> //С помощью мировой матрицы начинаем вращать куб вокруг
> оси х
> For i:= 1 to 8 do
>  begin
>   MIntVerKyb[i, 2]:=Trunc((MIntVerKyb[i, 2] * cos(ReaYgolKyb))
> - (MIntVerKyb[i, 3] * sin(ReaYgolKyb)));
>   MIntVerKyb[i, 3]:=Trunc((MIntVerKyb[i, 2] * sin(ReaYgolKyb))
> + (MIntVerKyb[i, 3] * cos(ReaYgolKyb)));
>  end;

тут надо MIntVerKyb2 := MIntVerKyb
т.е. копию делаем из исходного

и везде, где рисуется, поменять на MIntVerKyb2, т.е. рисуем по копии


 
set ©   (2010-09-17 18:02) [12]

вот я сделал рисование по копии но куб не крутится  :(((


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls;

type
 TForm1 = class(TForm)
   Timer1: TTimer;
   procedure FormPaint(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 MIntVerKyb: array[1..8,1..3] of integer; //Массив координат вершин куба
 MIntVerKyb2: array[1..8,1..3] of integer;
 ReaYgolKyb: real; //Счетчик угла

implementation

{$R *.dfm}

/////////////////////////////До загрузки формы//////////////////////////////////
procedure TForm1.FormCreate(Sender: TObject);
var
i, j: integer;

begin
//Первначальные координаты вершин куба
MIntVerKyb[1, 1]:= 100;
MIntVerKyb[1, 2]:= 100;
MIntVerKyb[1, 3]:= 200;

MIntVerKyb[2, 1]:= 200;
MIntVerKyb[2, 2]:= 100;
MIntVerKyb[2, 3]:= 200;

MIntVerKyb[3, 1]:= 200;
MIntVerKyb[3, 2]:= 200;
MIntVerKyb[3, 3]:= 200;

MIntVerKyb[4, 1]:= 100;
MIntVerKyb[4, 2]:= 200;
MIntVerKyb[4, 3]:= 200;

MIntVerKyb[5, 1]:= 100;
MIntVerKyb[5, 2]:= 100;
MIntVerKyb[5, 3]:= 100;

MIntVerKyb[6, 1]:= 200;
MIntVerKyb[6, 2]:= 100;
MIntVerKyb[6, 3]:= 100;

MIntVerKyb[7, 1]:= 200;
MIntVerKyb[7, 2]:= 200;
MIntVerKyb[7, 3]:= 100;

MIntVerKyb[8, 1]:= 100;
MIntVerKyb[8, 2]:= 200;
MIntVerKyb[8, 3]:= 100;

For i:= 1 to 8 do
 begin
  for j:= 1 to 3 do
   begin
    MIntVerKyb2[i, j]:= MIntVerKyb[i, j];
   end;
 end;


end;

//////////////////////Рисование и вычисление координат куба/////////////////////
procedure TForm1.FormPaint(Sender: TObject);
var
i: integer;//Счетчик цикла
X, Y: integer;//Координаты линий
BlnF: boolean;//Завершает цикл

begin
BlnF:= false;
i:= 0;

With Form1.Canvas do
 begin
  Pen.Color:= clRed;//Цвет карандаша
  Brush.Color:= clBlack;//Цвет кисти
  While i <= 4 do
   begin
//Рисуем верхний квадрат куба
    i:= i + 1;
    //Ниже производится вычисление и перевод координат из трехмерного пространства в двумерное
    //Куб рисуется во фронтально диметрической проекуции
    //
    //                              z
    //                              z
    //                              z
    //                              z
    //                              z
    //                              z
    //                              0 x x x x x x x x x x x x
    //                                y
    //                                  y
    //                                    y
    //                                      y
    //                                        y
    //                                          y
    //
    X:= Trunc(MIntVerKyb2[i, 1] + ((MIntVerKyb[i, 2] / 2) * sin(0.785)));
    Y:= Trunc((MIntVerKyb2[i, 2] / 2) * sin(0.785) + MIntVerKyb[i, 3]);
    MoveTo(X,Y);
    If i = 4 then
     begin
      i:= 0;
      BlnF:= true;
     end;
    i:= i + 1;
    X:= Trunc(MIntVerKyb2[i, 1] + ((MIntVerKyb[i, 2] / 2) * sin(0.785)));
    Y:= Trunc((MIntVerKyb2[i, 2] / 2) * sin(0.785) + MIntVerKyb[i, 3]);
    LineTo(X,Y);
    i:= i - 1;
    If BlnF = true then break;
   end;

//Рисуем нижний квадрат куба
  BlnF:= false;
  i:= 4;
  While i <= 8 do
   begin
    i:= i + 1;
    X:= Trunc(MIntVerKyb2[i, 1] + ((MIntVerKyb[i, 2] / 2) * sin(0.785)));
    Y:= Trunc((MIntVerKyb2[i, 2] / 2) * sin(0.785) + MIntVerKyb[i, 3]);
    MoveTo(X,Y);
    If i = 8 then
     begin
      i:= 4;
      BlnF:= true;
     end;
    i:= i + 1;
    X:= Trunc(MIntVerKyb2[i, 1] + ((MIntVerKyb[i, 2] / 2) * sin(0.785)));
    Y:= Trunc((MIntVerKyb2[i, 2] / 2) * sin(0.785) + MIntVerKyb[i, 3]);
    LineTo(X,Y);
    i:= i - 1;
    If BlnF = true then break;
   end;

//Рисуем Вертикальные линии соединяющие верхний и нижний квадрат
  BlnF:= false;
  i:= 0;
  While i <= 8 do
   begin
    i:= i + 1;
    X:= Trunc(MIntVerKyb2[i, 1] + ((MIntVerKyb[i, 2] / 2) * sin(0.785)));
    Y:= Trunc((MIntVerKyb2[i, 2] / 2) * sin(0.785) + MIntVerKyb[i, 3]);
    MoveTo(X,Y);

    i:= i + 4;
    X:= Trunc(MIntVerKyb2[i, 1] + ((MIntVerKyb[i, 2] / 2) * sin(0.785)));
    Y:= Trunc((MIntVerKyb2[i, 2] / 2) * sin(0.785) + MIntVerKyb[i, 3]);
    LineTo(X,Y);
    If i = 8 then break;
    i:= i - 4;
   end;
 end;

ReaYgolKyb:= ReaYgolKyb + 0.01;//Счетчик угла поворота
//С помощью мировой матрицы начинаем вращать куб вокруг оси х
For i:= 1 to 8 do
 begin
  MIntVerKyb2[i, 2]:=Trunc((MIntVerKyb[i, 2] * cos(ReaYgolKyb)) - (MIntVerKyb[i, 3] * sin(ReaYgolKyb)));
  MIntVerKyb2[i, 3]:=Trunc((MIntVerKyb[i, 2] * sin(ReaYgolKyb)) + (MIntVerKyb[i, 3] * cos(ReaYgolKyb)));
 end;

end;

///////////////////////////Перерисовка каждые 35 милесекунд/////////////////////
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Repaint;//Перерисовываем форму
end;

end.


 
set ©   (2010-09-18 08:58) [13]

Всем огромное спасибо до моего мозга дошли ваши мысли и у меня получилось вращать его. :))))))))))))))))))))))))))



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

Форум: "Начинающим";
Текущий архив: 2010.12.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.003 c
15-1283783209
ocean
2010-09-06 18:26
2010.12.12
Wifi


15-1283507963
Медвежонок Пятачок
2010-09-03 13:59
2010.12.12
про кита


15-1283256546
AlexDn
2010-08-31 16:09
2010.12.12
Поисковики и регион


15-1283286578
Юрий
2010-09-01 00:29
2010.12.12
С днем рождения ! 1 сентября 2010 среда


2-1284824389
Festil
2010-09-18 19:39
2010.12.12
Влияние действий друг на друга





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