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

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

Диплом - база данных поставщиков на Delphi (MS Sql Server)+ Пояснительна...
Моделирование работы узла коммутации сообщений на GPSS + Пояснительная з...
Моделирование автовокзала + Отчет + Блок схема

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

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

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
MpegPlay
Базы данных в Инт...
Xrumer 4 Platinum...
GPSS World Studen...
Цветной Grid
Prolog Interprete...
Меню проводника в...
Панель для реклам...
«Философия» прогр...
Основы Delphi
Алгоритмы шифрова...
Запрет гостям ск...
Пример OpenGL гра...
C# в кратком изло...
Программа рисует ...
Delphix Sample [И...
Создание Web-сайт...
TmxOutlookBarPro
Векторный редакто...
TrayComp

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97838
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14192
Borland Delphi ... 10292
Turbo Pascal fo... 7374
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
Сортировка числово...
Определения служб
Границы ячейки
Draughts на Strawb...
MATCH (СИНХРОНИЗИР...
АМ-MSK модулятор
11. Компьютеры мог...
Правила транспорта
службы поддержки в...
Локализация имен в...
Сканирование фотог...
Лайв ставки на киб...
Функция GetMaxColo...
Инициализация конс...
Программируем на PHP
Ц - Алфавитный ука...
Этапы решения комп...
Приемы синтезаторов.
Постоянно продолжа...
Поместите все подд...
Инструменты Visual...
Технология Drag-an...
Оповещения SNMP, с...
Подключение общего...
База данных на пас...
Статистика



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


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