Навигация
Главная
Поиск
Форум
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
Реклама
Сейчас на сайте
Гостей: 12
На сайте нет зарегистрированных пользователей

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

Моделирование процесса обеспечивающего надежность функционирования АСУ Т...
База данных студентов на Delphi + Microsoft SQL Server
Выбор наилучших альтернатив с использованием методов оптимизации на Delp...

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

Следующий пример демонстрирует возможности ООП-программирования при разработке новых программ на основе ранее созданных.  Свойства наследования и полиморфизма позволяют существенно экономить трудозатраты за счет использования ранее созданных объектов. Пусть ставится задача моделирования качения квадрата по некоторой, достаточно гладкой, криволинейной поверхности (рельефу)(рис. 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 02 2014 22:15:50 · 0 Комментариев · 5073 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
39 статьи по Delphi
Dnavigator
DelphiXIsoDemo1
Handles
Создание лабиринт...
Усложнённый кальк...
Шаблон для новост...
Flash MP3 Player ...
Просмотр файлов и...
Exe in exe
Geo-Whois
3d Tank [Исходник...
Win-Prolog 3.618
IMtale
Delphi 2005 Учимс...
Illusion
Панель случайной ...
Платформа програм...
PDJ_Anima
SODA [Исходник на...

Топ загрузок
Приложение Клие... 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
Случайные статьи
Starda Casino
Установка Service ...
Подготовка удаленн...
Преобразование типов
Кроссбраузерная по...
Служба имен доменов
Разрешение фотогра...
Модификации устрой...
Обсуждение итогов
Настраиваемые инте...
ПОСТРОЕНИЕ ЭКСПЕРТ...
Services for Macin...
Draughts на Strawb...
OpenGL. Пример рис...
Указатели "единица"
Специальный маршалинг
Изменение внешнего...
Стабильный заработ...
Есть много других ...
Кодирование
Программисту нужно...
• Распространите S...
Процедура DetectGr...
Тайные улицы Парижа
Урок 3. Продолжаем...
Статистика



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


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