Здравствуйте, мне нужно написать программу вращения куба вокруг оси. куб должен проецироваться изометрически. проблема в том, что проекция точек у меня обратная необходимому виду( то есть куб вращается вокруг переднего ребра). вот программа.
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Menus, XPMAN;
type
TForm1 = class(TForm)
Button2: TButton;
Image1: TImage;
Button1: TButton;
Timer1: TTimer;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
Button8: TButton;
Timer2: TTimer;
Timer3: TTimer;
Timer4: TTimer;
Timer5: TTimer;
Button10: TButton;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
OY1: TMenuItem;
OZ1: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
Timer6: TTimer;
Timer7: TTimer;
Button11: TButton;
Button12: TButton;
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure Timer3Timer(Sender: TObject);
procedure Timer4Timer(Sender: TObject);
procedure Button10Click(Sender: TObject);
procedure OZ1Click(Sender: TObject);
procedure OY1Click(Sender: TObject);
procedure Timer6Timer(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure Timer7Timer(Sender: TObject);
procedure Button11Click(Sender: TObject);
procedure Button12Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
a,h,b: integer;
k: real;
x: array [1..65] of real;
y: array [1..65] of real;
z: array [1..65] of real;
x1: array [1..65] of integer;
y1: array [1..65] of integer;
const
alfa=45;
f=1/2;
t=24.1;
l=35.26;
implementation
{$R *.dfm}
procedure kub(a: integer);
var
osn: array [1..22] of TPoint;
ptc: array [0..1] of integer;
centr_x, centr_y: integer;
begin
centr_x:=(Form1.Image1.Width div 2)-0; //точки положения куба
centr_y:=(Form1.Image1.Height div 2)-0;
//
with Form1.Image1.Canvas do
begin
osn[1].x:=centr_x+x1[50];
osn[1].y:=centr_y-y1[1];
osn[2].x:=centr_x+x1[2];
osn[2].y:=centr_y-y1[2];
osn[3].x:=centr_x+x1[3];
osn[3].y:=centr_y-y1[3];
osn[4].x:=centr_x+x1[4];
osn[4].y:=centr_y-y1[4];
osn[5].x:=centr_x+x1[8];
osn[5].y:=centr_y-y1[8];
osn[6].x:=centr_x+x1[7];
osn[6].y:=centr_y-y1[7];
osn[7].x:=centr_x+x1[3];
osn[7].y:=centr_y-y1[3];
osn[8].x:=centr_x+x1[2];
osn[8].y:=centr_y-y1[2];
osn[9].x:=centr_x+x1[6];
osn[9].y:=centr_y-y1[6];
osn[10].x:=centr_x+x1[7];
osn[10].y:=centr_y-y1[7];
osn[11].x:=centr_x+x1[8];
osn[11].y:=centr_y-y1[8];
osn[12].x:=centr_x+x1[5];
osn[12].y:=centr_y-y1[5];
osn[13].x:=centr_x+x1[6];
osn[13].y:=centr_y-y1[6];
osn[14].x:=centr_x+x1[2];
osn[14].y:=centr_y-y1[2];
osn[15].x:=centr_x+x1[1];
osn[15].y:=centr_y-y1[1];
osn[16].x:=centr_x+x1[5];
osn[16].y:=centr_y-y1[5];
osn[17].x:=centr_x+x1[8];
osn[17].y:=centr_y-y1[8];
osn[18].x:=centr_x+x1[4];
osn[18].y:=centr_y-y1[4];
osn[19].x:=centr_x+x1[1];
osn[19].y:=centr_y-y1[1];
//
ptc[0]:=19;
PolyPolygon(Form1.Image1.Canvas.Handle,osn,ptc,1);
end;
end;
procedure proekcia(x,y,z: real; var x1,y1: integer);
begin
x1:=Round(x*cos(alfa)-z*sin(alfa));
y1:=Round(y*cos(l)-z*sin(t)-x*sin(t));
end;
procedure povoroty(x,y: real;var fi: real; var x22,y22: real);
begin
x22:=x*cos(fi)-y*sin(fi);
y22:=y*cos(fi)+x*sin(fi);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
begin
k:=0;
with Image1.Canvas do
begin
Pen.Color:=clRed; //цвет куба
Rectangle(0,0,1400,1400); //малая цифра - шлейф
end;
// Кубик
x[1]:=0;
y[1]:=0;
z[1]:=0;
x[2]:=0;
y[2]:=0;
z[2]:=100;
x[3]:=0;
y[3]:=100;
z[3]:=100;
x[4]:=0;
y[4]:=100;
z[4]:=0;
//
x[5]:=100;
y[5]:=0;
z[5]:=0;
x[6]:=100;
y[6]:=0;
z[6]:=100;
x[7]:=100;
y[7]:=100;
z[7]:=100;
x[8]:=100;
y[8]:=100;
z[8]:=0;
k:=0;
for i:=1 to 8 do // построение проекции фигуры
proekcia(x[i],y[i],z[i],x1[i],y1[i]);
kub(a);
Timer1.Enabled:=false;
Timer2.Enabled:=false;
Timer3.Enabled:=false;
Timer4.Enabled:=false;
Timer6.Enabled:=false;
Timer7.Enabled:=false;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.Canvas.Brush.Color:=clBlack; //цвет фона
Image1.Canvas.Rectangle(0,0,1400,1400); //малая цифра - шлейф
Button2.Click;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
x2,y2: real;
begin
k:=0.1;
with Image1.Canvas do
begin
Rectangle(0,0,1400,1400); //малая цифра - шлейф
for i:=1 to 65 do
begin
povoroty(x[i],y[i],k,x2,y2);
x[i]:=x2;
y[i]:=y2;
proekcia(x[i],y[i],z[i],x1[i],y1[i]);
end;
kub(a);
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Button1.Click;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Timer1.Enabled:=true;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
i: integer;
x2,y2: real;
begin
k:=-0.1;
with Image1.Canvas do
begin
Rectangle(0,0,1400,1400); //малая цифра - шлейф
for i:=1 to 65 do
begin
povoroty(x[i],y[i],k,x2,y2);
x[i]:=x2;
y[i]:=y2;
proekcia(x[i],y[i],z[i],x1[i],y1[i]);
end;
kub(a);
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
var
i: integer;
x2,y2: real;
begin
k:=0.1;
with Image1.Canvas do
begin
Rectangle(0,0,1400,1400); //малая цифра - шлейф
for i:=1 to 65 do
begin
povoroty(y[i],z[i],k,x2,y2);
y[i]:=x2;
z[i]:=y2;
proekcia(x[i],y[i],z[i],x1[i],y1[i]);
end;
kub(a);
end;
end;
procedure TForm1.Button6Click(Sender: TObject);
var
i: integer;
x2,y2: real;
begin
k:=-0.1;
with Image1.Canvas do
begin
Rectangle(0,0,1400,1400); //малая цифра - шлейф
for i:=1 to 60 do
begin
povoroty(y[i],z[i],k,x2,y2);
y[i]:=x2;
z[i]:=y2;
proekcia(x[i],y[i],z[i],x1[i],y1[i]);
end;
kub(a);
end;
end;
procedure TForm1.Button7Click(Sender: TObject);
var
i: integer;
x2,y2: real;
begin
k:=0.1;
with Image1.Canvas do
begin
Rectangle(0,0,1400,1400); //малая цифра - шлейф
for i:=1 to 65 do
begin
povoroty(z[i],x[i],k,x2,y2);
z[i]:=x2;
x[i]:=y2;
proekcia(x[i],y[i],z[i],x1[i],y1[i]);
end;
kub(a);
end;
end;
procedure TForm1.Button8Click(Sender: TObject);
var
i: integer;
x2,y2: real;
begin
k:=-0.1;
with Image1.Canvas do
begin
Rectangle(0,0,1400,1400); //малая цифра - шлейф
for i:=1 to 65 do
begin
povoroty(z[i],x[i],k,x2,y2);
z[i]:=x2;
x[i]:=y2;
proekcia(x[i],y[i],z[i],x1[i],y1[i]);
end;
kub(a);
end;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
Button5.Click;
end;
procedure TForm1.Timer3Timer(Sender: TObject);
begin
Button7.Click;
end;
procedure TForm1.Timer4Timer(Sender: TObject);
var
ch: integer;
begin
ch:=Random(5)+1;
case ch of
1:
begin
Timer1.Enabled:=true;
Timer2.Enabled:=false;
Timer3.Enabled:=false;
Timer6.Enabled:=false;
Timer7.Enabled:=false;
end;
2:
begin
Timer1.Enabled:=false;
Timer2.Enabled:=true;
Timer3.Enabled:=false;
Timer6.Enabled:=false;
Timer7.Enabled:=false;
end;
3:
begin
Timer1.Enabled:=false;
Timer2.Enabled:=false;
Timer3.Enabled:=true;
Timer6.Enabled:=false;
Timer7.Enabled:=false;
end;
4:
begin
Timer1.Enabled:=false;
Timer2.Enabled:=false;
Timer3.Enabled:=false;
Timer6.Enabled:=true;
Timer7.Enabled:=false;
end;
5:
begin
Timer1.Enabled:=false;
Timer2.Enabled:=false;
Timer3.Enabled:=false;
Timer6.Enabled:=false;
Timer7.Enabled:=true;
end;
end;
end;
procedure TForm1.Button10Click(Sender: TObject);
begin
close;
end;
procedure TForm1.OZ1Click(Sender: TObject);
begin
Timer1.Enabled:=true;
end;
procedure TForm1.OY1Click(Sender: TObject);
begin
Timer6.Enabled:=true;
end;
procedure TForm1.Timer6Timer(Sender: TObject);
begin
Button7.Click;
end;
procedure TForm1.N2Click(Sender: TObject);
begin
Timer7.Enabled:=true;
end;
procedure TForm1.Timer7Timer(Sender: TObject);
begin
Button5.Click;
end;
procedure TForm1.Button11Click(Sender: TObject);
begin
Timer6.Enabled:=true;
end;
procedure TForm1.Button12Click(Sender: TObject);
begin
Timer7.Enabled:=true;
end;
end.
заранее благодарю ха помощь.