Форум: "Начинающим";
Текущий архив: 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