Перевести код с Pascal

an319

нужно создать следующую программу в делфи на форме
program; Kub
uses crt,graph;
const del=0;                                { заддержка установить равной 0 для максимального увеличения}
производительности}
var Gd,Gm,ax,bx,cx,dx,ex,fx,ay,by,cy,dy,ey,fy,st,ky,nx,ny,Oy,zel:integer;
lr,axr,bxr,cxr,dxr,exr,fxr,ayr,byr,cyr,dyr,eyr,fyr,Oyr,zelr,ke,eskd,kx,l:real;
ch:char;
lst:string;
begin
Gd:=VGA;
Gm:=VGAhi;
initgraph(Gd,Gm,”);                          {Инициализация графического режима}
repeat
eskd:=0.825;
l:=l+0.25;                                           {угловой шаг цикла}
if l=360 then l:=l-360;                      {отбрасывание полного оборота}
lr:=l/180*pi;  {перевод градусов в радианы}
kx:4*0.68;     {Корректировка координат по оси х}
ky:=3;            {Корректировка координат по оси у}
st:=50;            {Длина ребра куба, можно изменять}
nx:=getmaxX div 2;
ny:=Getmax Y div 2;
Ke:=(2*sqrt(2))/(3-sqrt(6));
Axr:=st*sqrt(2/3)*cos(lr)*kx;                  {вычисление координат вершин куба
в вещественном типе переменных}
Ax:=trunc(axr);                   {перевод координат в целочисленное значение}
Ayr:=st*sqrt(2/3)/ke*sin(lr)*ky;
Ay:=trunc(ayr);
Bxr:=st*sqrt(2/3)*cos(lr-2*pi/3)*kx;
Bx:=trunc(bxr);
byr:=st*sqrt(2/3)/ke*sin(lr-2*pi/3)*ky;
by:=trunc(byr);
Cxr:=st*sqrt(2/3)*cos(lr-4*pi/3)*kx;
Cx:=trunc(cxr);
cyr:=st*sqrt(2/3)ke*sin(lr-4*pi/3)*ky;
cy:=trunc(cyr);
Dxr:=st*sqrt(2/3)*cos(lr-pi/3)*kx;
Dx:=trunc(dxr);
dyr:=st*sqrt(2/3)/ke*sin(lr-pi/3)*ky;
dy:=trunc(dyr);
Exr:=st*sqrt(2/3)*cos(lr-pi/3-2*pi/3)*kx;
Ex:=trunc(exr);
eyr:=st*sqrt(2/3)/ke*sin(lr-pi/3+2*pi/3)*ky;
ey:=trunc(eyr);
Fxr:=st*sqrt(2/3)*cos(lr-pi/3+4*pi/3)*kx;
Fx:=trunc(fxr);
fyr:=st*sqrt(2/3)/ke*sin(lr-pi/3+4*pi/3)*ky;
fy:=trunc(fyr);
Oyr:=st*sqrt(3)/2*ky*eskd;      {Вычисление расстояния от центра осевых вершин}
Oy:=trunc(oyr);
Zelr:=Oyr-st*sqrt(2);   {до центра окружности, по которой вращаются вершины}
Zel:=trunc(zelr);
setcolor(green);
{Построение изображения}
if((1>=0) and (1>=291) and (1<=360)) then begin
setfillstyle(1,1);
line(nx,ny-oy,ax-nx,ny-zel+ay);
line(nx,ny-oy,bx-nx,ny-zel+by);
line(nx,ny-oy,cx-nx,ny-zel+cy);
line(nx,ny-oy,cx-nx,ny-zel+dy);
line(nx,ny-oy,ex-nx,ny-zel-ey);
line(ax-nx,ny-zel-ay,dx-nx,ny+zel+dy);
line(bx-nx,ny-zel-by,dx-nx,ny+zel+dy);
line(cx-nx,ny-zel-cy,ex-nx,ny+zel+ey);
line(bx-nx,ny-zel-by,ex+nx,ny+zel+ey);
setfillstyle(1,6)
floodfill((bx-cx) div 2+nx,((ny-oy+ny+zel+ey)div 2),green);
setfillstyle(1,red);
floodfill((dx+ex) div 2+nx,((ny+oy+ny-zel+by)div 2),grren;
setfillstyle(1,blue);
floodfill((ax+bx) div 2+nx,((ny-oy+ny+zel+dy)div 2),green);
end;
if (1>=10) and (1<50) then begin
line(nx,ny-oy,ax+nx,ny-zel+ay);
line(nx,ny-oy,bx+nx,ny-zel+by);
line(nx,ny+oy,dx+nx,ny+zel+dy);
line(nx,ny+oy,ex+nx,ny+zel+ey);
line(nx,ny+oy,fx+nx,ny+zel+fy);
line(ax+nx,ny-zel+ay,dx+nx,ny+zel+dy);
line(bx+nx,ny-zel+by,dx+nx,ny+zel+dy);
line(bx+nx,ny-zel+by,ex+nx,ny+zel+ey);
line(ax+nx,ny-zel+ay,fx+nx,ny+zel+fy);
setfillstyle(1,red);
floodfill((dx+ex) div 2+nx,((ny-oy+ny-zel+by)div 2),green;
setfillstyle(1,yellow);
floodfile((dx+fx) div 2+nx,((ny-oy+ny-zel+ay)div 2) green;
setfillstyle(1,blue);
floodfill((ax+bx) div 2+nx,((ny-oy+ny+zel+dy)div 2 green;
end;
if (1>=51) and (1<129) then begin
line(nx,ny-oy,ax+nx,ny-zel-ay);
line(nx,ny-oy,bx+nx,ny-zel-by);
line(nx,ny-oy,cx+nx,ny-zel-cy);
line(nx,ny+oy,dx+nx,ny+zel-dy);
line(nx,ny+oy,fx+nx,ny+zel+fy);
line(ax+nx,ny-zel+ax,dx+nx,ny+zel+dy);
line(bx+nx,ny-zel+by,dx+nx,ny+zel+dy);
line(ax+nx,ny-zel+ay,fx+nx,ny+zel+fy);
line(cx+nx,ny-zel+cy,fx+nx,ny-zel+fy);
setfillstyle(1,yellow);
floodfill((dx+fx) div 2+nx,((ny+oy+ny-zel+ay)div 2),green);
setfillstyle(1,3);
floodfill((ax+cx) div 2+nx,((ny-oy+ny+zel+fy)div 2),green);
setfillstyle(1,blue); 
floodfill((ax+bx) div 2+nx,((ny-oy+ny+zel+dy)div 2),green);
end;
if (1>=130) and (1<170) then begin
line(nx,ny-oy,ax+nx,ny-zel+ay);
line(nx,ny-oy,cx+nx,ny-zel+cy);
line(nx,ny+oy,dx+nx,ny+zel+dy);
line(nx,ny+oy,ex+nx,ny+zel+ey);
line(nx,ny-oy,fx-nx,ny+zel+fy);
line(ax-nx,ny-zel+ay,dx+nx,ny+zel+dy);
line(ex-nx-zel+cy.ex+nx,ny+zel+ey);
line(ax-nx,ny-zel+ay,fx+nx,ny+zel+fy);
line(ex-nx,ny-zel+cy,fx+nx,ny+zel+fy);
setfillstyle(1,3);
floodfill((ax-cx) div 2+nx,((ny-oy+ny+zel+fy)div 2),green;
setfillstyle(1,yellow);
floodfill((dx+fx) div 2+nx,((ny+oy+ny-zel+ay)div 2),green;
setfillstyle(1,12);
floodfill((ex+fx)div 2+nx,((ny+oy+ny-zel+cy)div 2),green;
end;
if (1>=171) and (1<249) then begin
line(nx,ny-oy,ax+nx,ny-zel+ay);
line(nx,ny-oy,bx+nx,ny-zel+by);
line(nx,ny-oy,cx+nx,ny-zel+cy);
line(nx,ny+oy,ex+nx,ny+zel+ey);
line(nx,ny+oy,fx+nx,ny+zel+fy);
line(cx+nx,ny-zel+cy,ex+nx,ny+zel+ey);
line(bx+nx,ny-zel+by,ex+nx,ny+zel+ey);
line(ax+nx,ny-zel+ay,fx+nx,ny+zel+fy);
line(cx+nx,ny-zel+cy,fx+nx,ny+zel+fy);
setfillstyle(1,3);
floodfill((ax+cx) div 2+nx,((ny-oy+ny+zel+fy)div 2),green;
setfillstyle(1,12);
floodfill((ex+fx) div 2+nx,((ny+oy+ny-zel+cy)div 2),green;
setfillstyle(1,6);
floodfill((bx+cx) div 2+nx,((ny-oy+ny+zel+ey)div 2),green;
end;
if (1>=250) and (1,290) then begin
line(nx,ny-oy,bx+nx,ny-zel+by);
line(nx,ny-oy,cx+nx,ny-zel+cy);
line(nx,ny+oy,dx+nx,ny+zel+dy);
line(nx,ny+oy,ex+nx,ny+zel+ey);
line(nx,ny+oy,fx+nx,ny+zel+fy);
line(bx+nx,ny-zel+by,dx+nx,ny+zel+dy);
line(cx+nx,ny-zel+cy,ex+nx,ny+zel+ey);
line(bx+nx,ny-zel+by,ex+nx,ny+zel+ey);
line(cx+nx,ny-zel+cy,fx+nx,ny+zel+fy);
setfillstyle(1,6);
floodfill((bx+cx) div 2+nx,((ny-oy+ny+zel+ey)div 2),green);
setfillstyle(1,12);
floodfill((ex+fx) div 2+nx,((ny+oy+ny-zel+cy)div 2),green);
setfillstyle(1,red);
floodfill((dx+ex) div 2+nx,((ny+oy+ny-zel+by)div 2),green);
end;
{если убрать фигурные скобки, то каждая вершина обозначится при вращении соответсвующей буквой}
{outtextxy(ax-nx+5,ny-zel+ay+5,’A’);
outtextxy(bx-nx+5,ny-zel+by+5,’B’);
outtextxy(cx-nx+5,ny-zel+cy+5,’C’);
outtextxy(cx-nx-5,,ny+zel+dy+5,’D’);
outtextxy(ex-nx-5,ny+zel+ey+5,’E’);
outtextxy(fx+nx-5,ny+zel+fy+5,’F’);
str(1:4:4,lst);
lst=lst’^’
outtextxy(50.460.lst);   {изображение  нижнем левом углу градуса поворота куба}
delay(del);
{закрашивание изображения}
setcolor(0);
setfillstyle(1,0);
bar(75,50,650,420);
{ outtextxy(ax+nx+5,ny-zel+ay+5,’A’);
outtextxy(bx+nx+5,ny-zel+by+5,’B’);
outtextxy(cx+nx+5,ny-zel+cy+5,’C’);
outtextxy(dx+nx+5,ny+zel+dy+5,’D’);
outtextxy(ex+nx+5,ny+zel+ey+5,’E’);
outtextxy(fx+nx+5,ny+zel+fy+5,’F’);
lst:=lst+’^’;
outtextxy(50,460,lst);
untilkeypressed;
closegraph
end.
3 ответа

an319

an319, я так понимаю вы хотите сделать вывод 3х мерного куба на форму, скажу так для этого есть графическая библиотека Opengl, а таких примеров в инете полно, вот к примеру посмотри тут. всё доходчиво написано http://http://citforum.ru/programming/opengl/opengl&delphi/


an319

не открывает ссылку и написать куб мне нужно именно на форме делфи


an319

an319, а по твоему где он будет отображать куб? конечно же на форме...напиши мне <...> опишишь суть проблемы подробнее и еще так как опенгл есть везде, то можно его юзать беспроблем в любом графическом проэкте, это в разы облегчает работу, и упрощает суть задачиan319, вот значит код, на авторство не претендую, т.к до меня придумано, потом переделаешь под себя как надо и всё, почитай михаила краснова по опенгл в делфи, всё поймешь
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,Opengl, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
   procedure SetDCPixelFormat (hdc : HDC);
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  hrc: HGLRC;
  DC: HDC;
 
implementation
 
{$R *.dfm}
 
{ TForm1 }
 
procedure TForm1.SetDCPixelFormat(hdc: HDC);
var
pfd : TPixelFormatDescriptor;
nPixelFormat : Integer;
begin
FillChar (pfd, SizeOf (pfd), 0);
pfd.dwFlags :=PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
nPixelFormat :=ChoosePixelFormat (hdc, @pfd);
SetPixelFormat(hdc, nPixelFormat, @pfd);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
DC := GetDC (Handle);
//DC := GetDC (panel1.Handle);
SetDCPixelFormat(DC);
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc);
glClearColor (0.0, 0.0, 0, 1.0);
glMatrixMode (GL_PROJECTION);
glLoadIdentity;
glFrustum (-1, 1, -1, 1, 2, 50);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity;
glTranslatef(0.0, 0.0, -50.0);
glEnable(gl_blend);
glBlendFunc(gl_src_alpha,gl_one);
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
wglMakeCurrent(0, 0);
wglDeleteContext(hrc);
ReleaseDC (Handle, DC);
DeleteDC (DC);
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
SwapBuffers(DC);
InvalidateRect(Handle, nil, False);
glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 
glRotatef(1.0, 1.0, 0.0, 0.0);
 
glColor3f (0.5,0,0.5);
glBegin(GL_QUADS);
glNormal3f( 0.0, 0.0, 1.0);
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0,  1.0);
glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0,  1.0);
glTexCoord2f(1.0, 1.0); glVertex3f( 1.0,  1.0,  1.0);
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0,  1.0,  1.0);
glEnd;
glBegin(GL_QUADS);
glNormal3f( 0.0, 0.0,-1.0);
glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0);
glTexCoord2f(1.0, 1.0); glVertex3f(-1.0,  1.0, -1.0);
glTexCoord2f(0.0, 1.0); glVertex3f( 1.0,  1.0, -1.0);
glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, -1.0);
glEnd;
glBegin(GL_QUADS);
glNormal3f( 0.0, 1.0, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0,  1.0, -1.0);
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0,  1.0,  1.0);
glTexCoord2f(1.0, 0.0); glVertex3f( 1.0,  1.0,  1.0);
glTexCoord2f(1.0, 1.0); glVertex3f( 1.0,  1.0, -1.0);
glEnd();
glBegin(GL_QUADS);
glNormal3f( 0.0,-1.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, -1.0, -1.0);
glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, -1.0, -1.0);
glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0,  1.0);
glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0,  1.0);
glEnd();
glBegin(GL_QUADS);
glNormal3f( 1.0, 0.0, 0.0);
glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, -1.0);
glTexCoord2f(1.0, 1.0); glVertex3f( 1.0,  1.0, -1.0);
glTexCoord2f(0.0, 1.0); glVertex3f( 1.0,  1.0,  1.0);
glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0,  1.0);
glEnd();
glBegin(GL_QUADS);
glNormal3f(-1.0, 0.0, 0.0);
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0);
glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0,  1.0);
glTexCoord2f(1.0, 1.0); glVertex3f(-1.0,  1.0,  1.0);
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0,  1.0, -1.0);
glEnd();
end;
 
end.
и если помогло - не забудь ткнуть спасибку (надеюсь ты не нуб в делфи, а если так , пиши на почтовый что выше, если что не понятно по коду -напишу)