Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2009, 13:49   #1
Seran4ek
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 94
По умолчанию Работа с Классом и кое что по OpenGl

Добрый день. Возник такой вот вопрос. В кодовм юните создал класс TElectrons, который описывает электроны.
Код:
unit Electrons;
interface
uses
Opengl;
type
TElectrons=class
constructor Create(x,y,z:double);
end;
implementation

constructor TElectrons.Create(x,y,z:double);
begin
Inherited Create;
 glEnable(GL_POINT_SMOOTH);
 glColor3f(0, 0, 0);
 glPointSize(5);
 glBegin(GL_POINTS);
  glVertex3f(x,y,z);
 glEnd;
end;
end.
Конструктор я вызываю по таймеру.
Код:
procedure TForm1.PointTimerTimer(Sender: TObject);
begin
TElectrons.Create(random(5),random(5),random(5));
SwapBuffers(DC);
end;
и на рандомной координате создается точка.
Но вся соль в том, что по следующему срабатыванию таймера первая исчезает. а мне нужно что она оставалась(она потом должна двигаться) и создавалась другая. Помогите, как мне это зделать?

ЗЫ: еще пожалуйста, раскажите на "нубском" языке о дерективах Public и Private. я знаю на уровне теории, но мне не ясно, в чом его практический смысл. спасибо
Seran4ek вне форума Ответить с цитированием
Старый 28.11.2009, 15:01   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

во-первых, класс вы вызываете один и тот-же каждый раз, и где собственно хранение?
во-вторых, рациональнее создать динамический массив объектов (лучше записей), чтоб иметь доступ к конкретным координатам конкретной точки и соответственно вызывать движение определенного объекта (электрона)... тестовый пример см.во вложении
Вложения
Тип файла: zip объекты.zip (3.0 Кб, 10 просмотров)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 28.11.2009, 16:03   #3
Seran4ek
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 94
По умолчанию

тоесть, Электрон, это record, в котом поля координаты и номер.
и в VAR создать переменную массива этих Record?

потом конструктором создавать массив нужной длинны и для каждого элемента массива путем рандома своя траектория?
я правильно предположил?

тоесть можно и без классов обойтись вовсе
Seran4ek вне форума Ответить с цитированием
Старый 28.11.2009, 16:54   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
тоесть, Электрон, это record, в котом поля координаты и номер.
и в VAR создать переменную массива этих Record?

потом конструктором создавать массив нужной длинны и для каждого элемента массива путем рандома своя траектория?
я правильно предположил?
имхо, это все есть во вложении выше... классы для данной задачи это перебор
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 28.11.2009, 17:06   #5
Seran4ek
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 94
По умолчанию

я разбирал вложение. но только запутался. не могли бы Вы, пожалуйста, частями выложить код касающийся самих точек: создание, рисовки, инициализация с пояснениями? очень прошу.
Seran4ek вне форума Ответить с цитированием
Старый 28.11.2009, 17:32   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
я разбирал вложение. но только запутался. не могли бы Вы, пожалуйста, частями выложить код касающийся самих точек: создание, рисовки, инициализация с пояснениями?
если вы не заметили, то код я снабдил комментариями...
Код:
type
 tpo = record
  x,y,z: glfloat;
  num: integer;
 end;

var
  frmGL: TfrmGL;
  dc: thandle;
  dev1 : array of tpo; // динамический массив записей
  x: integer;

...
procedure TfrmGL.tpo_paint(x,y,z: glfloat; num: integer); // перерисовка объекта
begin
 glNewList(num, GL_Compile); // буферизация для быстрого вызова

 glColor3f (255, 255, 0);
 glPointSize (3);
 glBegin (GL_POINTS);
  glVertex3f(x,y,z);
 glEnd;

 glendlist
end;

procedure TfrmGL.tpoCreate(x,y,z: glfloat);  //создание объекта
begin
 setlength(dev1,length(dev1)+1);
 dev1[length(dev1)-1].x:= x; // для хранения координат
 dev1[length(dev1)-1].y:= y;
 dev1[length(dev1)-1].z:= z;

 tpo_paint(x,y,z, length(dev1))
end;

// Перерисовка окна
procedure TfrmGL.FormPaint(Sender: TObject);
var
 i : integer;
 ps: TPaintStruct;
begin
 BeginPaint(panel1.Handle, ps);
 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

 glViewPort (0, 0, ClientWidth, ClientHeight);

 glClear (GL_COLOR_BUFFER_BIT);     // очистка буфера цвета

 for i:= 0 to length(dev1) do // перебираем объекты и выводим
  glCallList(i);

 SwapBuffers(dc);        // содержимое буфера - на экран
 EndPaint(panel1.Handle, ps)
end;

// Формат пикселя
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 TfrmGL.FormCreate(Sender: TObject);
var nPixelFormat: Integer;
    pfd: TPixelFormatDescriptor;
begin
 DC:= GetDC(panel1.handle); // используем panel
 FillChar(pfd,SizeOf(pfd),0);
 with pfd do begin
  nSize     := sizeof(pfd);
  nVersion  := 1;
  dwFlags   := PFD_DRAW_TO_WINDOW or
               PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER
               or PFD_GENERIC_ACCELERATED ;
  iPixelType:= PFD_TYPE_RGBA;
  cColorBits:= 32;
  cDepthBits:= 32;
  iLayerType:= PFD_MAIN_PLANE;
 end;
 nPixelFormat:= ChoosePixelFormat(DC, @pfd);
 SetPixelFormat(DC,nPixelFormat,@pfd);
 
 hrc:= wglCreateContext(DC);
 wglMakeCurrent(DC, hrc);
 panel1.DoubleBuffered:= true; // буферизируем для уменьшения мерцания

 //
 setlength(dev1,0);

// пока статические
 tpoCreate(0.1, 0.2, 0.1);   // 1- объект
 tpoCreate(0.3, 0.1, 0.51); // 2
 tpoCreate(0.7, 0.5, 0.41); // 3
 tpoCreate(0.2, 0.1, 0.0);  // 4
end;

//Конец работы приложения
procedure TfrmGL.FormDestroy(Sender: TObject);
begin
 wglDeleteContext(hrc);
  wglMakeCurrent(0, 0);
end;

// для примера движение-
procedure TfrmGL.Timer1Timer(Sender: TObject);
var yy,xx: glfloat;
begin
 inc(x);
 xx:= 0.3*sin(x*pi/180);
 yy:= 0.3*cos(x*pi/180);;

  tpo_paint(-xx,-yy,0.0, 2); // двигаем 2 объект по окружности
  tpo_paint(xx,yy,0.0, 1);   // двигаем 1 объект
  // остальные объекты не трогаем, они статические

 Refresh; // обновляем
end;
кроме того, можно обойтись и без хранения координат, если перед созданием объекта использовать функу- glloadname(), тогда становится возможным и "двигать" объекты вручную...
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 28.11.2009 в 17:38.
raxp вне форума Ответить с цитированием
Старый 28.11.2009, 18:49   #7
Seran4ek
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 94
По умолчанию

все мне ясно стало, спасибо)
как это реализовать с помощью Записей более менее понял
а вот как быть с классом? что мне нужно делать, что вызов конструктора добовлял новый объект не уничтожая старый? уж простите за столь глупые вопросы, ОО часть начал подчитывать недавно совсем
Seran4ek вне форума Ответить с цитированием
Старый 28.11.2009, 21:11   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

ну заведите себе массив tobject при создании класса, правда особых преимуществ не вижу... можете еще с tlist поиграться
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа с классом и объектами (Что в программе нужно изменить?) wepoTWR Помощь студентам 0 17.11.2009 19:26
C++ работа с классом VadEr Помощь студентам 2 17.05.2009 12:33
Взаимодействие с виндой и еще кое-что Manitu Помощь студентам 5 25.03.2008 09:28
разъесните мне кое что! Veltis Общие вопросы Delphi 4 25.06.2007 21:21
кое-что о MainMenu itisiam Компоненты Delphi 2 25.05.2007 21:47