Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 17
На сайте нет зарегистрированных пользователей

Пользователей: 13,361
новичок: uehuat
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

База данных междугородних телефонных разговоров на Delphi
База данных студентов на Delphi + Microsoft SQL Server
Моделирование процесса обработки заданий на вычислительном центре на GP...

Проектирование методов объектов

         Методы TPoint достаточно простые: Constructor Init заполняет О-поля объекта; процедура Rotate вычисляет новые координаты точки по формулам геометрического поворота вокруг заданной оси на угол step, величина которого зависит от требуемой скорости вращения объекта и процедура Show скорее  служит прототипом для дальнейшего наследования, чем для самостоятельного использования. Роль Destructora обсуждалась ранее.

       В Constructore  TLine обратите внимание, что объекты pn и pk инициализируются отдельно, поскольку каждый из них должен быть связан с таблицей VMT типа TPoint, а в методе Show значение входного параметра col определяет рисование или стирание линии.

       Аналогично осуществляется инициализация сторон квадрата в TSquare и

перекрытие виртуальных методов Show и Rotate собственными. После инициализации положение квадрата соответствует верхнему левому углу экрана.

     

(********  Методы TPoint  ********************)

Constructor TPoint .Init ( xx, yy   :Real; col :Byte );

Begin    x:=xx;   y:=yy;   Pcolor := col;      End;

{---------------------------------------------------------------}

Procedure   TPoint .Rotate ( xOs,yOs :Integer );

Var xx, yy :Real;

Begin  xx := (x - xOs)*Cos(step) - (y - yOs)*Sin(step)  + xOs;

           yy := (x - xOs)*Sin (step) + (y - yOs)*Cos(step) + yOs;

           x :=xx;     y:=yy;

End;

{---------------------------------------------------------------}

Procedure   TPoint .Show   ( col :Byte );

Begin  PutPixel ( Round(x), Round(y), Pcolor ); End;

{---------------------------------------------------------------}

Destructor  TPoint .Done;

Begin End;

 

 (********  Методы TLine  ********************)

Constructor TLine .Init ( x1,y1,x2,y2 :Real; col :Byte );

Begin pn.Init(x1,y1,col);   pk.Init(x2,y2,col);   Lcolor:=col;  End;

{---------------------------------------------------------------}

Procedure   TLine .Rotate ( xOs,yOs :Integer );

Begin pn.Rotate( xOs,yOs );   pk.Rotate( xOs,yOs ); End;

{---------------------------------------------------------------}

Procedure   TLine .Show ( col :Byte );

Begin  If col=0 Then SetColor ( col ) Else SetColor ( Lcolor ) ;

       Line(Round(pn.x),Round(pn.y),Round(pk.x),Round(pk.y));

End;

{---------------------------------------------------------------}

Destructor  TLine .Done;

Begin End;

 

 (*****************  Методы TSquare  ****************************)

Constructor TSquare .Init ( aa, colK :Byte );

Begin

  as := aa;                                              { установка размера стороны квадрата}

  Sides[0]. Init ( as, as,  0, as, colK );   { инициализация сторон квадрата }

  Sides[1]. Init (  0, as,  0,  0, colK );

  Sides[2]. Init (  0,  0, as,  0, colK );

  Sides[3]. Init ( as,  0, as, as, colK );

  Scolor := colK;

End;

{----------------------------------------------------------------}

 

 

 

Procedure TSquare .Rotate ( xOs, yOs :Integer );

{ реализует вращение квадрата путем поворота каждой из его сторон вокруг оси }

Var i :Byte;

Begin For i:=0 To kv-1 Do Sides[i] .Rotate ( xOs,yOs ); End;

{----------------------------------------------------------------}

Procedure TSquare .Show( col :Byte ); { рисует(стирает) изображение квадрата }

Var  i :Byte;

Begin  For i := 0 To kv-1 Do  Sides[i].Show ( col ); End;

{----------------------------------------------------------------}

Destructor  TSquare .Done;

Begin End;

 

(*****************  Методы TScreen  ******************************)

Constructor TScreen .Init ( aa, colK, colG :Byte;   dG :Integer );

Var  i :Byte;

Begin

   GraphInit;                             { инициализация графического режима VGAHi }

   Inherited Init ( aa, colK );    { инициализация родителя }

   Gdisp := dG;                         { задание Y-смещения поверхности качения }  

   For i := 0 To kv-1 Do  With Sides[i] Do Begin {перенос квадрата на поверхность}

     pn.y := pn.y + Gdisp - as;

     pk.y := pk.y + Gdisp - as;

   End;

   Gcolor := colG;                     { задание цвета поверхности качения }  

   OsX := as;    OsY := Gdisp;  { задание начальных координат оси вращения }  

   angle := 0;                             { задание начального значения угла поворота }  

   DrawGround;                        { рисование  поверхности качения }     

End;

{---------------------------------------------------------------}

Procedure TScreen .GraphInit;   { инициализация графического режима VGAHi }

Var gd, gm, ErrorCode :Integer;

Begin     gd := Detect;

  InitGraph ( gd, gm, '');

  ErrorCode := GraphResult;

  If ErrorCode <> grOk Then Begin

     Writeln('Ошибка графики:', GraphErrorMsg ( ErrorCode ) );

     Halt(1);

  End;

End;

{---------------------------------------------------------------}

Procedure  TScreen .DrawGround;  { рисование  поверхности качения }

Begin SetColor ( Gcolor );

      Line ( 0, Round( Gdisp + 1 ), GetMaxX, Round( Gdisp + 1 ) );

End;

{---------------------------------------------------------------}

Function  TScreen .ShiftOsXY :Boolean;

{ определяет момент и реализует смещение оси вращения квадрата по оси X}

Begin  If angle > pi/2                             { если наступил момент  переноса оси поворота,  }

         Then Begin OsX := OsX + as; ShiftOsXY := True; End  { то сместить ось по X на as}

         Else ShiftOsXY := False;

End;

{----------------------------------------------------------------------}

Procedure TScreen .Go;  {реализует движение квадрата и анимацию его изображения}

Begin

 Repeat                               { цикл возобновления сцены }

   Repeat                             { цикл качения  по поверхности и анимации  }

     angle := angle + step;    { накопление угла поворота}

     If ShiftOsXY                 { если была смена оси вращения, }

          Then Begin angle:=0; Continue; End;  { то пропустить вращение и анимацию }

     Rotate ( OsX, OsY );     { вращение квадрата  вокруг текущей оси }

     Show(Scolor);                              { рисует изображение квадрата }

     Delay( ms );                                 { задержка  }

     Show(0);                                      { стирает изображение квадрата }

     If KeyPressed Then Exit;            { если клавиша нажата, то выход из процедуры}

   Until OsX > GetMaxX;                 { если квадрат достиг правого края экрана, то }

   Init ( as, Scolor, Gcolor, Gdisp  ); { возобновление сцены }

   DrawGround;                                 { рисование  поверхности качения }    

 Until False;                                       { повторение работы до нажатия любой клавиши }

End;

{----------------------------------------------------------------------}

Destructor TScreen .Done;

Begin  CloseGraph;   End;                 {закрытие графического режима }

{----------------------------------------------------------------------}

                  

     Более сложные действия выполняются  в Constructore  TScreen. После  перехода в графический режим осуществляется инициализация квадрата оператором  Inherited Init ( aa, colK ); , где  ключевое слово Inherited означает – унаследованный, то есть происходит вызов Constructora типа TSquare. Отметим, что вызов унаследованного  Constructora  при проектировании Constructor’ов дочерних типов считается хорошим стилем в ООП-программировании.  Далее квадрат «устанавливается» на поверхность качения путем коррекции координат Y его вершин на величину смещения этой поверхности на экране. Обратите внимание на оператор With, который, как и при обработке записей, позволяет вынести имя объекта в заголовок  и избавляет от необходимости писать  длинные составные имена. После этого назначаются  координаты оси вращения OsX, OsY, совпадающие с координатами вершины 1 квадрата (см. рис. 8). Поскольку рисунок рельефа является статической частью сцены и, при движении квадрата остается неизменной, в конце процедуры следует  прорисовка поверхности виртуальным методом DrawGround. Виртуальность метода обусловлена возможностью изменения формы (а значит и метода прорисовки) поверхности качения у потомков. По этой же причине виртуальны метод ShifOsXY( контролирующий положение оси вращения по мере движения квадрата по поверхности) и метод Go. В последнем реализуются основные действия, происходящие на экране. Метод состоит из двух вложенных циклов: во внутреннем моделируется качение квадрата начиная с левого края до правого края экрана и анимация его изображения, во внешнем – обновление всей сцены и повторение указанных действий. Остальные подробности алгоритмов описанных методов даны в приведенных их текстах.

Опубликовал Kest April 02 2014 22:10:59 · 0 Комментариев · 5005 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Пример работы с р...
Handles
База каталогов ( ...
Calendar
Редактор анимаций
Mass Photo Upload
Preview
Java 2. Наиболее ...
С/C++ Программиро...
Размещение элемен...
PDJPack
Дарахвелидзе П., ...
C++ Builder в за...
Мод "проверочный ...
AUTOWEB
Панель "ссылки"
Учебник для продв...
Защита от спама ...
JBlabel3D
Цветной Grid

Топ загрузок
Приложение Клие... 100772
Delphi 7 Enterp... 97809
Converter AMR<-... 20260
GPSS World Stud... 17014
Borland C++Buil... 14189
Borland Delphi ... 10267
Turbo Pascal fo... 7372
Калькулятор [Ис... 5972
Visual Studio 2... 5206
Microsoft SQL S... 3661
Случайные статьи
Я хочу, чтобы окно...
Варианты дисплея с...
Как увидеть пробле...
Типизированные файлы
Где ареометры купить
параметры политики...
Программирование: ...
Функция list1
Воспроизведение ау...
НАЗНАЧЕНИЕ РЕФЛЕКС...
Акселерометры и ор...
Коммуникационное п...
Сегментирование кл...
Ставки на спорт
СПОСОБЫ РАСПОЗНАВА...
Режим воспроизведе...
Советы тем, кто же...
Глава 10
АНТИПАТТЕРН: ПРЕДП...
Проблема представл...
Компоненты доступа...
Как быть, если мас...
Типы онлайновой ин...
Некоторые встроенн...
Как сделать URL по...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?