Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.12.12;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.013 c
2-1284816217
KuJIoBaT
2010-09-18 17:23
2010.12.12
2 формы на делфи


3-1239312888
Кевларвестов Семен
2009-04-10 01:34
2010.12.12
Не удается выполнить хранимую процедуру Firebird.


2-1284781399
mfender
2010-09-18 07:43
2010.12.12
Ссылки-невозвращенцы из BPL


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


15-1283718575
Юрий
2010-09-06 00:29
2010.12.12
С днем рождения ! 6 сентября 2010 понедельник