Помощь - Поиск - Пользователи - Календарь
Полная версия: Графика на Паскале
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
RoachSka
Ребята, мне написали программу в Паскале котрая выводит конус который вращается вокруг оси(X,Y,Z), входными данными являются высота, радиус, ось вращения, сторона вращения, помогите написать что за что отвечает в этой программе. Вот текст программы
unit Unit_Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OpenGL, StdCtrls, ExtCtrls, Spin;

type
TMainForm = class(TForm)
Panel: TPanel;
RadioGroupDir: TRadioGroup;
RadioGroupAxis: TRadioGroup;
Timer: TTimer;
SpinEdit1: TSpinEdit;
Label1: TLabel;
SpinEdit2: TSpinEdit;
Label2: TLabel;
procedure FormPaint(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure TimerTimer(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure SpinEdit2Change(Sender: TObject);
private
hrc: HGLRC;
angleX, angleY, angleZ: Integer;
A,B:integer;
quadObj:GLUquadricObj;
public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

procedure SetDCPixelFormat(hdc: HDC);
var
  pfd: TPixelFormatDescriptor;
  nPixelFormat: Integer;
begin
  FillChar(pfd, SizeOf(pfd), 0);
  pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
  nPixelFormat := ChoosePixelFormat(hdc, @pfd);
  SetPixelFormat(hdc, nPixelFormat, @pfd);
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  SetDCPixelFormat(Canvas.Handle);
  hrc := wglCreateContext(Canvas.Handle);
  A:=SpinEdit1.Value;
  B:=SpinEdit2.Value;  
  quadObj:=gluNewQuadric;
  gluQuadricDrawStyle(quadObj,GLU_FILL);
  gluQuadricOrientation(quadObj,GLU_INSIDE);
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  wglDeleteContext(hrc);
end;

procedure TMainForm.FormPaint(Sender: TObject);
begin
  wglMakeCurrent(Canvas.Handle, hrc);
  glViewPort(0, 0, ClientWidth-Panel.ClientWidth, ClientHeight);
  glClearColor(0.0, 0.0, 0.0, 1.0);
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_COLOR_MATERIAL);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  glFrustum(-1, 1, -1, 1, 4, 10);
  glMatrixMode (GL_MODELVIEW);
  glLoadIdentity;

  glTranslatef(0.0, 0.0, -8.0);

  glColor3f(0.0, 0.0, 1.0);
  glBegin(GL_LINES);
   glNormal3f(0.0, 0.0, 2.0);
   glVertex3f(0.0, 0.0, 0.0);
   glVertex3f(1.7, 0.0, 0.0);
   glVertex3f(0.0, 0.0, 0.0);
   glVertex3f(0.0, 1.7, 0.0);
   glVertex3f(0.0, 0.0, 0.0);
   glVertex3f(-1.0, -1.0, 1.0);
  glEnd;
  glColor3f(1.0, 1.0, 0.0);
  glPushMatrix;
  glTranslatef(1.7,0,0);
  glRotatef(90,0,1,0);
  gluCylinder(quadObj,0.05,0.0,0.1,10,10);
  glPopMatrix;
  glPushMatrix;
  glTranslatef(-1.0,-1.0,1.0);
  glRotatef(-30,-1,1,1);
  gluCylinder(quadObj,0.05,0.0,0.1,10,10);
  glPopMatrix;
  glPushMatrix;
  glTranslatef(0.0,1.7,0.0);
  glRotatef(-90,1,0,0);
  gluCylinder(quadObj,0.05,0.0,0.1,10,10);
  glPopMatrix;

  glColor3f(1.0, 0.0, 0.0);

  glRotatef(angleX+20, 1.0, 0.0, 0.0); // поворот объекта - ось X
  glRotatef(angleY, 0.0, 1.0, 0.0); // поворот объекта - ось Y
  glRotatef(angleZ, 0.0, 0.0, 1.0); // поворот объекта - ось Z

  glRotatef(90, -1.0, 0.0, 0.0);
  gluCylinder(quadObj,0.01*B,0.0,0.01*A,10,10);
  gluQuadricOrientation(quadObj,GLU_INSIDE);
  gluDisk(quadObj,0.0,0.01*B,10,10);
  gluQuadricOrientation(quadObj,GLU_OUTSIDE);
  SwapBuffers(Canvas.Handle);
  wglMakeCurrent(0, 0);
end;

procedure TMainForm.TimerTimer(Sender: TObject);
const
  delta = 6;
var
  d_angle: Integer;
begin
  if RadioGroupDir.ItemIndex = 0 then
    d_angle := delta
  else
    d_angle := -delta;
  case RadioGroupAxis.ItemIndex of
    0: begin
         angleX := (angleX + d_angle) mod 360;
         angleY := 0;
         angleZ := 0;
       end;
    1: begin
         angleX := 0;
         angleY := (angleY + d_angle) mod 360;
         angleZ := 0;
       end;
    2: begin
         angleX := 0;
         angleY := -30;
         angleZ := (angleZ + d_angle) mod 360;
       end;
    3: begin
         angleX := (angleX + d_angle) mod 360;
         angleY := (angleY + d_angle) mod 360;
         angleZ := (angleZ + d_angle) mod 360;
       end;
  end;
  InvalidateRect(Handle, nil, False);
end;

procedure TMainForm.SpinEdit1Change(Sender: TObject);
 begin
  A:=SpinEdit1.Value;
 end;

procedure TMainForm.SpinEdit2Change(Sender: TObject);
 begin
  B:=SpinEdit2.Value;
 end;

end.
Заранее благодарен.
klem4
Начнем с того что программа написана на Delphi, это во-первых, а во-вторых

Цитата
мне написали программу... помогите написать что за что отвечает в этой программе


Автора не пробовал попросить ? Или ты действительно думаешь что кто-то будет сидеть, разбираться в куче чужего кода, тем более графика ... и еще это дело комментировать ? Не теряй время и не жди,этого не будет.
мисс_граффити
тем более, что в теме 2 нарушения правил (не тот раздел и не использованы теги для кода).
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.