Навигация
Главная
Поиск
Форум
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
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Создание отчето... 63925
Модуль Forms 63639
ТЕХНОЛОГИИ ДОСТ... 60503
Пример работы с... 59916
Имитационное мо... 55976
Реклама
Сейчас на сайте
Гостей: 10
На сайте нет зарегистрированных пользователей

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

Поиск пути в графе заданном списками инцедентности на Turbo Pascal
Лабораторная работа по динамическим спискам на Turbo Pascal (перемещение...
Моделирование вычислительного центра на GPSS + Отчет + Блок схема

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Модификация программы

Следующий пример демонстрирует возможности ООП-программирования при разработке новых программ на основе ранее созданных.  Свойства наследования и полиморфизма позволяют существенно экономить трудозатраты за счет использования ранее созданных объектов. Пусть ставится задача моделирования качения квадрата по некоторой, достаточно гладкой, криволинейной поверхности (рельефу)(рис. 10). Новый объект TScreen1, удовлетворяющий условиям задачи, может быть получен наследованием из объекта TScreen. Он содержит дополнительное поле Ground в виде целочисленного массива ординат рельефа и поле Sides0 для промежуточного хранения предыдущих координат сторон квадрата в процессе качения. Очевидно, что должны быть переопределены методы Init, DrawGround, ShiftOsXY и Go. Кроме того, понадобятся новые методы CalcABC и Dist для реализации подалгоритмов переопределяемых методов.

Модификация программы

Рис. 10. Качение квадрата по криволинейной поверхности.

 

Далее приведен текст программы, полученный указанным способом.

 

{*********** Качение квадрата по заданному рельефу ************}

Program PrimerМ_OOP;

 

Uses  SqUnit, Crt, Graph;

 

Const sizeSq = 80;  colorSq = 12; colorG = 2;    deltaG = 400; 

 

 

Type  TScreen1 = Object( TScreen )

               Ground     :Array [ 0..n-1 ]  Of Integer;          { массив для рельефа}

               Sides0       :TSides;                          { буфер сохранения квадрата }

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

               Procedure   DrawGround;                  Virtual;

               Procedure   CalcABC ( Var S1,S2 :TLine; Var A,B,C :Real );

               Function    Dist( A, B, C, xx, yy :Real) :Real;    Virtual;

               Function    ShiftOsXY :Boolean;       Virtual;

               Procedure   Go;                                   Virtual;

               Destructor  Done;

           End;

 

Var  Screen1 :TScreen1;

 

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

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

Procedure   TScreen1 .DrawGround; {  рисование рельефа на экране }

Var i :Integer;

Begin

   SetColor(colorG);  ClearDevice;

   For i:=0 To 640 Do Begin MoveTo(i,Ground[i]); LineTo(i,GetMaxY); End;

End;

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

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

Var   i, j, A1, T1, D1, A2, T2, D2:  Integer;

Begin

 Randomize;       { генерация амплитуды, частоты и фазы гармоник }

 A1:=Random(45)+5;    T1:=Random(40)+20;  D1:=Random(T1);

 A2:=Random(25)+5;    T2:=Random(40)+20;  D2:=Random(T2);

 For i:=0 To n-1 Do  { цикл заполнения ординат рельефа, dG-смещение }

  Ground[i] := dG + Round(A1 * Sin( i / T1 + D1)  +   A2 * Sin( i / T2 + D2 ));

 Gdisp := MaxInt;

 For i := 0 To aa Do  { поиск места начальной установки квадрата }

      If Ground[i] < Gdisp Then Begin Gdisp := Ground[i]; j:=i; End;

 Inherited Init ( aa, colK, colG, Gdisp-1 );       { инициализация квадрата }

 OsX:=j;                            { уст-ка координаты х оси вращения }

 DrawGround;                   { нарисовать рельеф }

End;

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

Function TScreen1 .Dist( A,B,C, xx,yy :Real) :Real;

{ ф-ция расстояния между прямой Ax+By+C=0 и точкой(xx,yy) }

Begin Dist := Abs((A*xx+B*yy+C) / Sqrt(A*A+B*B)); End;

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

 

 

Procedure  TScreen1 .CalcABC( Var S1,S2 :TLine; Var A,B,C :Real );

{ вычисление параметров A,B,C уравнения прямой, проходящей через центр } { квадрата параллельно двум его противоположным сторонам }

Var    xn,yn,xk,yk   :Real;

Begin  xn := (S1.pn.x+S2.pk.x)/2;  yn := (S1.pn.y+S2.pk.y)/2;

           xk := (S1.pk.x+S2.pn.x)/2;   yk := (S1.pk.y+S2.pn.y)/2;

            A := yk - yn;       B := xn - xk;     C := xk * yn - xn * yk;

End;

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

Function  TScreen1 .ShiftOsXY :Boolean;

{ Если в процессе качения какая-либо точка квадрата переходит границу  { рельефа, то функция смещает ось вращения и возвращает True }

Var Ax, Bx, Cx, Ay, By, Cy, xx, yy :Real;     i :Integer;

Begin

  ShiftOsXY := False;

{ вычисление пар-ров прямых – осей локальной системы координат x10y1 }

  CalcABC( Sides[1], Sides[3],  Ax, Bx, Cx );

  CalcABC( Sides[0], Sides[2],  Ay, By, Cy );

  For i := OsX + 1  To  OsX + 3*as Div 2  Do  { перебор точек рельефа }

    Begin

     yy := Dist( Ay, By, Cy, i, Ground[i] ); { координаты i-ой точки рельефа }

     xx := Dist( Ax, Bx, Cx, i, Ground[i] );  {  в лок-ой системе   x10y1  }

     If ( xx <= as Div 2 + 1 ) And ( yy <= as Div 2 + 1 ) { если точка рельефа  }

      Then Begin                                                               {внутри квадрата , то}

                          Sides := Sides0;  { восст-ть предыд. положение  квадрата  }

                          OsX := i;     OsY := Ground[i];      {и сместить ось вращения }

                          ShiftOsXY := True;

                          Exit;

               End;

    End;

End;

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

Procedure   TScreen1 .Go;     { моделирует движение квадрата }

Begin

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

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

     Repeat

          Sides0 := Sides;  { запоминание текущих коорд-т квадрата в буфере}

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

     Until Not ShiftOsXY;  { если была смена оси вращения, то пропустить }

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

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

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

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

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

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

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

End;

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

Destructor  TScreen1 .Done;

Begin Inherited Done; End;

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

 

{*********** Головная программа ****************************}

Begin

   With Screen1 Do Begin

       Init ( sizeSq, colorSq, colorG, deltaG );

       Go;

       Done;

    End;

End.

{***********************************************************}

 

В constructor’е  Init  в начале генерируются точки рельефа путем сложения нескольких гармоник со случайными параметрами: амплитудой, частотой и фазой. Затем квадрат устанавливается в свое начальное положение. Для этого, среди первых аа точек (аа - размер стороны квадрата) массива Ground, находится минимальное значение Gdisp, которое определяет положение нижней стороны квадрата. По ней вычисляются положения остальных сторон вызовом constructor’а Init родительского типа. Значение минимума Gdisp и его смещение в массиве Ground  определяют положение точки контакта квадрата с поверхностью качения, следовательно и начальные координаты OsX, OsY оси вращения. После прорисовки рельефа на экране constructor Init завершает свою работу. Следующим важным для работы программы является метод ShiftOsXY, который контролирует контакт с рельефом и своевременно смещает ось вращения в новую позицию. Для определения момента пересечения квадрата поверхности рельефа после очередного поворота его на небольшой угол step проводятся испытания всех точек рельефа в диапазоне от OsX+1 до OsX + 1.5*as на предмет попадания их во внутрь квадрата. С этой целью вычисляются координаты каждой из этих точек в локальной системе координат X10Y1 квадрата (см. рис.10). Указанный алгоритм реализуется методами CalcABC и Dist. В методе CalcABC вычисляются параметры прямой Ax+By+C=0 – одной из осей локальной системы координат  X10Y1, а в методе Dist вычисляется расстояние (координата) точки до соответствующей оси по формуле:

Если каждая из полученных координат по абсолютной величине меньше половины длины стороны квадрата, то данная точка рельефа попадает во внутрь квадрата, поэтому данное положение квадрата не отображается на экране, а восстанавливаются предыдущие координаты квадрата (оператор Sides:=Sides0) и ось вращения перемещается в отмеченную ранее точку. Факт смены оси вращения отмечается в результате функции ShiftOsXY значением True. Метод Go обеспечивает перемещение квадрата и его отображение на экране, а алгоритм практически не отличается от прототипа в TScreen. Как видим, получение новой версии программы не потребовало существенных трудозатрат за счет использования преимуществ объектно-ориентированного программирования. Возможны дальнейшие модификации программы, например, перевести ее в режим двухстраничного отображения, что устранит мелькания изображения на экране.  Для более углубленного изучения ОО-программирования предлагается еще один более сложный пример.

Опубликовал Kest April 03 2014 02:15:50 · 0 Комментариев · 3818 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Синтаксический ан...
XPATComponents
Библия хакера 2. ...
Программирование ...
Программирование ...
AUTOWEB
Профессиональное ...
Отключение и вклю...
Microsoft SQL Ser...
3d Tank [Исходник...
PHP: Полезные приемы
45 уроков по дельфи
C++ Builder в за...
Панель "ссылки"
Самоучитель C++
PolyFlow
Report
SODA [Исходник на...
ZipTV
Рисование PopupMenu

Топ загрузок
Приложение Клие... 100449
Delphi 7 Enterp... 85838
Converter AMR<-... 20067
GPSS World Stud... 12518
Borland C++Buil... 11578
Borland Delphi ... 8505
Turbo Pascal fo... 7023
Visual Studio 2... 4989
Калькулятор [Ис... 4739
FreeSMS v1.3.1 3536
Случайные статьи
Права пользователя...
Синхронизация буфе...
Осторожное резонан...
Метод Фурье
Управление контентом
7.10. Просеивай ...
Предварительная по...
Что делают маршрут...
Разновидности Б-де...
Иерархии ЦС менее ...
dll) поддерживает ...
Библиотека STL - ч...
Способы фильтрации...
Выбор размера сегм...
Поиск строки в файле
ПРЕОБРАЗОВАНИЕ СТР...
• Решите, какой IP...
Средства отладки -...
Управление памятью...
Коридор колебания ...
Я преподаю этот ме...
Устраняйте причину...
blueyonder
Ван Вайк решил про...
Устойчивость к сбоям
Статистика



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


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