Создание компоненты, реализующей модель движущегося человека

 











Создание компоненты, реализующей модель движущегося человека



1. Анализ предметной области. Выявление состава, структуры, и возможных состояний объекта



Физическая модель, движущегося в реальной жизни человека, очень трудна. У него много составных подвижных частей, который могут изменять свое положение в трех измерениях. При составлении математической модели, было принято решение выделить только основные части тела, характерные человеку. А так же ограничиться только двумя степенями свободы для вращающихся частей тела.

К вращающимся частям тела относятся руки, состоящие из плеч и предплечий, и ног состоящие соответственно из бедер и голеней. Они представляют собой отрезки с заданным началом (центром вращения), углом и длиной (более подробное описание составляющих встретится ниже). Так же в тело человека входят Голова, представленная окружностью, и туловище, отображаемое как прямая линия.

Класс вращающаяся часть тела

Вращающаяся часть тела, как говорилось ранние, представляет собой отрезок, положение которого задается углом, начальной точкой и длиной. Но для вращения так же характерно направление «положительного» движения: почасовой или против часовой стрелки (под «положительным» движение понимается движение, при котором конечная точка отрезка станет выше предыдущего положения ()). Это необходимо для того, чтобы при команде такой как «Поднять_часть_тела_вверх», части тела, принадлежащие левой стороне двигались по часовой стрелке (т.е. увеличивая угол ?), а принадлежащие правой стороне, соответственно против часовой (т.е. уменьшая угол ?) (см. рис. 2)



Любая вращающаяся часть тела имеет предельные углы: начальный и конечный, выход за которые не допустим. При этом учитывается направление «положительного» вращения. Иными словами, допустимый диапазон углов может быть разный при одинаковых начальном и конечном углах, но при разных направлениях. (см. рис. 3)


Можно так же заметить, что некоторые части тела связаны с другими, т.е. у них есть общая точка (например: плечо и предплечье). Что при движении одной части приводит к изменению другой.

Основываясь на выше сказанном, класс должен иметь следующее:

Поля:

.Начальный точка (центр вращения)

.Текущий угол

.Длина

.Начальный угол

.Конечный угол

.Угловая скорость (общее поле для всех экземпляров)

.Направление движения

.Связанная часть тела (экз. такого же класса)

Свойства:

.Чтение / Изменение начального угла

.Чтение / Изменение конечного угла

.Чтение / Изменение текущего угла (при изменении проверяется допустимый диапазон углов, а так же угол приводится к виду когда он всегда положительный (>= 0 и <=360))

.Чтение начальной точки

.Чтение / Изменение координат начальной точки

.Чтение конечной точки (расчет на основе угла и длины)

.Чтение / Изменение угловой скорости

Функции:

1.Обновление координат связанной части тела

.Проверка принадлежности угла допустимому диапазону

.Рисования части тела

.Задание диапазона углов

.Вращать по направлению «положительного» вращения

.Вращать против направления «положительного» вращения

Класс голова

Голова представляет собой окружность некоторого радиуса с определенными координатами центра.

Класс Голова должна иметь:

Поля:

.Радиус;

.Центр;

И у нее должна быть следующая функция:

.Функция рисования себя.

Класс человек

Как известно, у человека две руки и две ноги, каждые из которых состоят из двух связанных вращающихся частей тела (плечо и предплечье, бедро и голень). Итого таких частей всего 8. А так же голова, представленная отдельным классом, и туловище. В виду малой возложенной функциональности на туловище, было решено не выделять его как отдельный класс, а просто графически представить как элементарный отрезок.

Класс Человек состоит из:

Поля:

.Координаты начальной точки туловища

.Длина туловища

.Цвет

.Экземпляры класса Вращающаяся Часть Тела (8 шт.)

.Экземпляр класса Голова

Функции: Рисование человека


2. Выбор и обоснование программного решения


Наша компонента наследуется от класса UserControl, который в свою очередь порождается от класса Control. Это означает, что мы имеем дело с элементом управления. UserControl предоставляет контекст графического устройства для рисования как Graphics.

Компонента наследуется от класса UserControl, но это не означает, что ее нельзя реализовать, унаследовав от другого класса. Например, можно воспользоваться готовым классом компоненты Component, содержащий «минимальный» интерфейс. Но данный класс не имеет собственного Graphics. То есть данный класс не может себя прорисовывать без помощи извне. А наш класс должен иметь пользовательский интерфейс (то есть являться визуальным).

Таким образом, можно заключить, что наследование от класса UserControl хоть и не является единственно верным путем к созданию компоненты, но в тоже время такой способ имеет право на существование.

Теперь перейдем непосредственно к разработке.

Наша компонента будет состоять из простейших геометрических фигур: окружностей и прямых.

Создаваемая компонента представляет собой класс, порождённый от UserControl и включающий в себя иерархию классов, показанную выше.


3. Разработка интерфейса и состава необходимых средств в виде свойств, событий и методов


Для отрисовки компоненты используем обработчик события private void ManControl_Paint (object sender, PaintEventArgs e) предоставленный в классе UserControl специально для воспроизведения изображения оконных компонент.

Для взаимодействия с пользователем используются следующие функции:

public void GetLeftArmUp() - поднять левую рукуvoid GetLeftLegUp() - поднять левую ногуvoid GetRigthLegUp() - поднять правую ногуvoid GetRightArmUp() - поднять правую рукуvoid GetLeftArmDown() - опустить левюу рукуvoid GetLeftLegDown() - опустить левую ногуvoid GetRigthLegDown() - опустить правую ногуvoid GetRightArmDown() - опустить правую руку

Свойства:

public double dAngle - задает угловую скорость вращенияColor Color - задает цвет отображаемого человека



Добавление иконки к компоненте, описания к компоненте, добавление компоненты на Палитру элементов.

Добавление иконки компоненты

Чтобы добавить иконку к компоненте, нужно:

.Сначала нужно нарисовать значок размером 16х16, палитра 16 цветов и формата BMP или ICO. Сохранить его нужно в папке, где написан наш проект.

.Так как значок должен храниться внутри *.dll компоненты, то соответствующий файл нужно добавить к проекту (меню Project/Add Existing Item).

.В свойствах файла иконки параметру Build Action нужно установить в значение Embedded Resource (Внедренный ресурс).


модель человек движущийся программа

4.Добавить атрибуты, указывающие как найти значок, перед объявлением класса компоненты (мы указываем тип, к которому добавляем иконку, а так же название рисунка для иконки):

[ToolboxBitmap (typeof(ManControl), «Man.bmp»)]partial class ManControl: UserControl // класс компоненты

Добавление описания компоненты.

Чтобы добавить описание, нужно добавить следующий атрибут перед объявлением класса компоненты:

[Description («Двжущийся человек»)]partial class ManControl: UserControl // класс компоненты

Он будет виден в сплывающей подсказке, при наведении курсора на компонент в Панели компонентов.

Добавление компоненты на палитру

Чтобы наша компонента была доступна в любых оконных разрабатываемых приложениях, нужно добавить ее на Палитру компонентов. Для этого нужно выполнить следующие действия:

1.Выбрать команду Choose Items (Выбрать элементы) в контекстном меню панели Toolbox (Инструменты) в нужной группе компонент.


2.Появится диалоговое окно, предлагающие выбрать компоненты (*.dll), которые будут отображаться в этой группе компонент. Если мы не находим нужную нам в предложенном списке, мы можем подгрузить её самостоятельно, нажав кнопку Browse и выбрать путь к файлу <Название компоненты>.dll



3.После этого компоненты появится в списке. Выбираем ее и закрываем диалоговое окно. Компонент <Название компоненты> появится в палитре компонентов. Так же, как и картинка, и описание.


Текст программы Rotary.cs

using System;System. Collections. Generic;System. Linq;System. Text;System. Drawing;ManComponent

{RotateDir

{, // по часовой стрелки// против часовой стрелки

}

// класс описывающий вращающюся часть тела, относительно его центраRotary

{

// ПОЛЯpos; // начальная точка (центр вращения)angle; // уголlength; // длинаminAngle; // начальный уголmaxAngle; // конечный угол - углы задают пределы вращенияRotateDir dir; // положительное направление вращенияchild; // другая вращ. часть тела, нач, точка которой совпадает с конечной

// стачичная переменая класса - «общая» для всехdouble da = Math.PI / 20d; // угловая скорость вращения

// СВОЙСТВАdouble MaxAngle {get {return maxAngle;} set {maxAngle = value;}}double MinAngle {get {return minAngle;} set {minAngle = value;}}double Angle

{{return angle;}

{ // преобразуем новый угол, если он отрицательный или больше чем 360 градусовa = value;(value >= 2 * Math.PI)= value - Math.PI * 2;if (value < 0)= 2 * Math.PI + value;

// если новый угол попадает в заданый диапозон (между min и max)(IsAbleToRotate(a))

{= a;();;

}

// если угол находится радом с границей заданного диапазонаif (Math. Abs (maxAngle - value) < da)= maxAngle;if (Math. Abs (minAngle - value) < da)= minAngle;();

}

}PointF Pos {get {return pos;}}PointF EndPoint {get {return new PointF (X + (float) Math. Cos(angle) * length, Y + (float) Math. Sin(angle) * length);}}float X {get {return pos.X;} set {pos.X = value;}}float Y {get {return pos.Y;} set {pos.Y = value;}}

// стачиное свойства да переменой dastatic double dAngle {get {return da;} set {if (value >= 0 && value < Math.PI * 2) da = value;}}Initialize (float x, float y, float len, int ang, RotateDir direction)

{= new PointF((float) x, (float) y);= direction;= (double) ang/180d*Math.PI; length = len;= null;= 0; maxAngle = 2 * Math.PI;

}Rotary (float x, float y, float len, int ang, RotateDir direction, Rotary ch)

{(x, y, len, ang, direction);= ch;.dir = dir;();

}Rotary (float x, float y, float len, int ang, RotateDir direction)

{(x, y, len, ang, direction);

}Rotary (float len, int ang)

{(0, 0, len, ang, RotateDir. ClockWise);

}UpdateChild()

{(child!= null)

{.X = X + (float) Math. Cos(angle) * length;.Y = Y + (float) Math. Sin(angle) * length;

}

}void Draw (Graphics g, Color color)

{. DrawLine (new Pen (color, 5), pos, EndPoint);(child!= null). Draw (g, color);. FillEllipse (new SolidBrush(color), EndPoint.X-5f, EndPoint.Y -5f, 10,10);

}IsAbleToRotate (double a)

{lb = minAngle; // нижняя границаub = maxAngle; // (dir ==RotateDir. CounterClockWise)

{= minAngle;= maxAngle;

}(ub > lb)(a >= lb && a <= ub) return true;return false;if ((a >= lb && a < Math.PI * 2) || (a >= 0 && a < ub))true;return false;

}void SetRange (int min, int max)

{= (double) min/180d*Math.PI;= (double) max/180d*Math.PI;

}void RotateUp() // вращать по направлению

{(dir == RotateDir. CounterClockWise)-= da;Angle += da;

}void RotateDown() // вращать против направления

{(dir == RotateDir. CounterClockWise)+= da;Angle -= da;

}

}

Man.cs

using System;System. Collections. Generic;System. Linq;System. Text;System. Drawing;ManComponent

{Head

{int r = 25;x, y;Head (int X, int Y)

{= X; y = Y;

}void Draw (Graphics g, Color color) {g. FillEllipse (new SolidBrush(color), x-r/2, y-r/2, r, r);}

}Man

{x, y, len;Color color;Rotary lArm, lElbow, rArm, rElbow, lLeg, lKnee, rLeg, rKnee;Head head;Man (int X, int Y, int length)

{ // положение человечка центр головы, длина туловища= X; y = Y; len = length;= Color. Blue;= new Rotary (30,90); // левый локоть(предплечее). SetRange (90,270);= new Rotary (x, y+length*0.2f, 30, 135, RotateDir. ClockWise, lElbow); // левая рука. SetRange (135,225);= new Rotary (35, 90);. SetRange (90, 180);= new Rotary (x, y + len, 35, 135, RotateDir. ClockWise, lKnee);. SetRange (125, 180);= new Rotary (30, 90); // правый локоть. SetRange (90,270);= new Rotary (x, y + length * 0.2f, 30, 45, RotateDir. CounterClockWise, rElbow); // правая рука. SetRange (45, 315);= new Rotary (35, 90);. SetRange (90, 0);= new Rotary (x, y + len, 35,45, RotateDir. CounterClockWise, rKnee);. SetRange (45, 0);= new Head (x, y);

}void Draw (Graphics g)

{. Draw (g, color); // левая рука. Draw (g, color); // правая рука. Draw (g, color); // левая нога. Draw (g, color); // правая нога. Draw (g, color); // голова. DrawLine (new Pen (color, 5), x, y, x, y + len);

}

}

ManControl.cs

using System;System. Collections. Generic;System. ComponentModel;System. Drawing;System. Data;System. Linq;System. Text;System. Windows. Forms;ManComponent

{

[ToolboxBitmap (typeof(ManControl), «Man.bmp»)]

[Description («Двжущийся человек»)]partial class ManControl: UserControlman;


[Category («Движущийся человек»), Description («Угловая скорость»), Browsable(true)]double dAngle {get {return Rotary.dAngle;} set {if (value >= 0 && value < Math.PI * 2) Rotary.dAngle = value;}}

[Category («Движущийся человек»), Description («Цвет человека»), Browsable(true)]Color Color {get {return man.color;} set {man.color = value; Refresh();}}ManControl()();= new Man (Width/2,40,80);= Color. Black;

}void ManControl_Paint (object sender, PaintEventArgs e)

{. Draw (this. CreateGraphics());

}.lArm. RotateUp();.lElbow. RotateUp();();

}void GetLeftLegUp()

{.lLeg. RotateUp();.lKnee. RotateUp();();

}void GetRigthLegUp()

{.rLeg. RotateUp();.rKnee. RotateUp();();

}void GetRightArmUp()

{.rArm. RotateUp();.rElbow. RotateUp();();

}void GetLeftArmDown()

{.lArm. RotateDown();.lElbow. RotateDown();();

}void GetLeftLegDown()

{.lLeg. RotateDown();.lKnee. RotateDown();();

}void GetRigthLegDown()

{.rLeg. RotateDown();.rKnee. RotateDown();();

}void GetRightArmDown()

{.rArm. RotateDown();.rElbow. RotateDown();();

}

}

}



Создание компоненты, реализующей модель движущегося человека 1. Анализ предметной области. Выявление состава,

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ