Автор работы: Пользователь скрыл имя, 06 Ноября 2013 в 10:43, курсовая работа
Разработать программную модель взаимного качения квадрата и эллипса по плоской поверхности.
Цель работы
Ознакомиться с применением объектно-ориентированного программирования при создании больших программ.
Постановка задачи
В целом задача сводится к реализации вращения квадрата и эллипса вокруг заданной оси и перемещения оси вращения.
Задание………………………………………………………..……...3
Цель работы…………………………………………………...……..3
Постановка задачи…………………………………………..……….3
Анализ и разработка алгоритма……………………………..……..3
Алгоритм программы…………………………………………...…..8
Текст программы……………………………………………...……..9
Результаты моделирования программы на ЭВМ……………..….16
Вывод...………………………………………………….…………...17
Литература………………………………………………….……….18
Содержание
Задание………………………………………………………..
Цель работы…………………………………………………
Постановка задачи…………………………………
Анализ и разработка алгоритма……………………………..……..3
Алгоритм программы…………………………………………...….
Текст программы……………………………………………...…
Результаты моделирования программы на ЭВМ……………..….16
Вывод...………………………………………………….……
Литература………………………………………………….
Задание
Разработать программную модель взаимного качения квадрата и эллипса по плоской поверхности.
Цель работы
Ознакомиться с применением объектно-ориентированного программирования при создании больших программ.
Постановка задачи
В целом задача сводится к реализации вращения квадрата и эллипса вокруг заданной оси и перемещения оси вращения.
Анализ и разработка алгоритма
В результате выполнения программы на экране должно быть следующее:
Здесь К – это ось вращения квадрата, а Э – ось вращения эллипса.
Квадрат совершает обкат по поверхности эллипса. Основными структурными элементами (объектами) этого изображения являются точки и линии, и из них могут быть построены квадрат и эллипс и скомпонована вся сцена на экране, причем эти элементы образуют следующую иерархию:
Опишем эти объекты в соответствии с положениями ООП-программирования.
,где х0 , у0 – начальные координаты точки; х, у – координаты после поворота; а – угол поворота; OsX, OsY – координаты оси вращения.
Координаты оси вращения имеют вещественный тип и задаются извне (являются входными параметрами метода). Вещественные значения координат оси обусловлены тем, что длина отрезков, из которых состоит эллипс, может быть как целой, так и вещественной.
Методы TPoint достаточно простые: Constructor Init заполняет О-поля объекта; процедура Rotate, как описано выше вычисляет новые координаты точки по формулам геометрического поворота вокруг заданной оси на угол step, величина которого зависит от требуемой скорости вращения объекта и процедура Show скорее служит прототипом для дальнейшего наследования, чем для самостоятельного использования.
x=a*cos(t); y=b*sin(t), t=
где а и b – горизонтальный и вертикальный радиусы эллипса, а t вычисляется в зависимости от номера точки i и значения константы det. Процедура инициализации располагает центр эллипса в верхнем левом углу экрана.
A=yk - yn; B := xn - xk; C := xk * yn - xn * yk,
где xn, yn, xk, yk – координаты начала и конца отрезка прямой.
В методе Dist вычисляется расстояние (координата) точки (вершины эллипса) до соответствующей оси по формуле:
Dist= ,
Если обе полученные координаты по абсолютной величине меньше половины длины стороны квадрата, то данная точка эллипса входит в пределы квадрата, поэтому ось вращения перемещается в эту вершину эллипса. Факт смены оси вращения отмечается в результате функции ShiftOsXY значением True. Метод Rotateall обеспечивает вращение квадрата и эллипса вокруг точки вращения эллипса. Метод Go реализует продвижение изображения на один кадр при срабатывании таймера и регенерацию сцены при достижении эллипсом края окна.
Алгоритм программы
Блок-схема основной процедуры программы TScreen.go:
program Kursovik;
uses
Forms,
Kurspas in 'Kurspas.pas' {Form1},
ElSq in 'ElSq.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
unit Kurspas;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ElSq;
Const
sizeSq = 100; { размер квадрата }
colorEl = clBlue; {цвет эллипса}
colorSq = clYellow; { цвет квадрата }
colorG = ClGreen; { цвет поверхности качения }
type {описание формы}
TForm1 = class(TForm)
Image1: TImage;
Button1: TButton;
Button2: TButton;
Timer1: TTimer;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
Var screen: TScreen; {определение объекта типа TScreen}
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); {при нажатии кнопки Go}
begin
timer1.Enabled:=true; {активировать таймер}
end;
procedure TForm1.Button2Click(Sender: TObject); {при нажатии кнопки Exit}
begin
screen.Done; {вызвать деструктор}
Close; {завершить выполнение приложения}
end;
procedure TForm1.Timer1Timer(Sender: TObject); {при срабатывании таймера}
begin
Screen .Go; {запустить процедуру анимации экрана}
end;
procedure TForm1.FormCreate(Sender: TObject); {при запуске приложения}
begin
Screen.Init(sizeSq, colorEl, colorSq, colorG, Image1.height-30,Image1 );
{инициализировать объект Screen}
end;
procedure TForm1.Button3Click(Sender: TObject); {при нажатии кнопки Stop}
begin
timer1.Enabled:=false; {остановить таймер}
end;
end.
unit ElSq;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
Const
det = 36; {количество вершин для построения эллипса}
xrad = 40; {горизонтальный радиус эллипса}
yrad = 25; {вертикальный радиус эллипса}
kv = 4; {количество сторон квадрата}
speed1 = 0.9; {скорость вращения эллипса}
speed = 1.5; {скорость вращения квадрата}
one = pi/180; {один градус в радинах}
step = one*speed; {шаг поворота квадрата}
step1 = one*speed1; {шаг поворота эллипса}
Type TPoint = Object {О-тип точка}
x,y :Real; {координаты точки}
Pcolor :Byte; {цвет точки}
Constructor Init ( xx,yy :Real; col :Byte );
Procedure Rotate ( xOs, yOs, spd :real ); Virtual;
Procedure Show ( col :Byte; var image1:TImage ); Virtual;
Destructor Done;
End;
TSide = array [1..det] of TPoint; {тип для описания вершин эллипса}
TEllipse=Object ( TPoint ) {О-тип эллипс}
line :TSide; {вершины эллипса}
EColor :Byte; {его цвет}
Constructor init (colE :byte);
procedure Rotate (xOsE, yOsE, spd:real); Virtual;
Procedure Show (col:Byte; var image1:TImage); Virtual;
Destructor Done;
end;
TLine = Object ( TPoint ) {О-тип отрезок}
pn, pk :TPoint; {начальная и конечная точки отрезка}
Lcolor :Byte; {его цвет}
Constructor Init ( x1,y1,x2,y2 :Real; col :Byte );
Procedure Rotate ( xOs, yOs, spd :real ); Virtual;
Procedure Show ( col :Byte; var image1:TImage ); Virtual;
Destructor Done;
End;
TSides = Array [ 0..kv-1 ] Of TLine; {тип для описания сторон квадрата}
TSquare = Object ( TLine ) {О-тип квадрат}
as :Byte; {длина стороны квадрата}
Sides :TSides; {стороны квадрата}
Scolor :Byte; {его цвет}
Constructor Init ( aa, colK :Byte );
Procedure Rotate ( xOs, yOs, spd :real ); Virtual;
Procedure Show ( col :Byte; var image1:TImage ); Virtual;
Destructor Done;
End;
TScreen = Object ( TEllipse ) {О-тип сцена}
image1 :TImage; {адрес картинки}
Elps :TEllipse; {эллипс}
Sqre :Tsquare; {квадрат}
Gdisp :Integer; {смещение поверхности качения}
Gcolor :TColor; {цвет поверхности качения}
line0 :TSide; {переменные для запоминание текущего положения фигур}
sides0 :TSides;
OsXE,OsYE,nom :Integer; {переменные для хранения координат осей вращения}
Constructor Init ( aa:Byte; colE, colK, colG :TColor; dG :Integer; var image:TImage );
Function ShiftOsXY :Boolean; Virtual;
Function ShiftOsXYE :Boolean;
Procedure CalcABC( Var S1,S2 :TLine; Var A,B,C :Real );
Function Dist( A,B,C, xx,yy :Real) :Real;
Procedure Rotateall(xOs,yOs:Integer; spd:real);
Procedure Go; Virtual;
Procedure DrawGround; Virtual;
Destructor Done;
End;
{TForm2 = class(TForm)
private }
{ Private declarations}
Информация о работе Программная модель взаимного качения квадрата и эллипса по плоской поверхности