Программа простейшего варианта имитации движения окружностей

Написание алгоритма в среде Microsoft Foundation Classes, который приводит окружности к их перемещению слава направо с последующим появлением окружностей в левой части экрана, при достижении ими правой границы. Листинг и результаты работы программы.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 25.05.2015
Размер файла 294,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Государственное образовательное учреждение

Высшего профессионального образования

«Санкт-Петербургский государственный технологический институт

(технический университет)»

Факультет информационных технологий и управления

Специальность: 230100 «Автоматизированные системы обработки информации и управления»

Кафедра систем автоматизированного

Проектирования и управления

Курсовая работа

По дисциплине: «Программирование»

Выполнил: Мордюк Д.О.

Группа № 321

Проверил: Брасов В.Н.

Санкт-Петербург

2013 г.

Постановка задачи:

Используя библиотеку MFC, необходимо разработать программу, которая позволит решить следующие задачи:

1. Создать 30 окружностей со случайными параметрами (координаты центра, радиус, цвет) и вывести их на экран.

2. Обеспечить интерфейс изменения параметров окружностей.

3. Созданные окружности должны перемещаться по определенному закону в соответствии с вариантами заданий.

Исходные данные:

Окружности перемещаются слева направо, при достижении правой границы они перемещаются скачком к левой границе и случайным образом меняется радиус окружностей в пределах 1 - 30.

Особые ситуации:

1. При инициализации окружности не должны накладываться друг на друга.

2. В процессе перемещения окружности не должны вылетать за указанные координаты экранной области.

Алгоритм решения задачи:

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

Структура программы:

Библиотека MFC (Microsoft Foundation Classes) предлагает поддержку модели документ/представление, в которой логика работы приложения явным образом отделяется от кода, ответственного за пользовательский интерфейс.

Разделение происходит как на уровне файлов (этот код содержится в разных единицах трансляции), так и на уровне классов - за хранение данных приложения и работу с ними отвечает один класс, а за реализацию пользовательского интерфейса - другой.

В нашем случае код этих классов размещён в следующих файлах:

Класс

Файл

Назначение

CSpheresDoc

SpheresDoc.h

Заголовочный файл документа, хранящего данные приложения.

SpheresDoc.cpp

Исходный файл документа, хранящего данные приложения.

CSpheresView

SpheresView.h

Заголовочный файл вида.

SpheresView.cpp

Исходный файл вида, отвечающий за отображение информации.

Форматы представления данных:

В программе использовались следующие константы:

Имя

Тип

Значение

Описание

min_radius

const int

1

Минимальный радиус окружности

max_radius

const int

40

Максимальный радиус окружности

nCircles

const int

30

Число создаваемых окружностей

nTries

const int

1000

Число попыток установить окружность

microsoft foundation classes алгоритм

Для хранения координат точки на экране (точками задаются центры окружностей), а также, для задания скорости смещения по осям X и Y во время перемещения используется структура: vec2d.

Для задания параметров окружностей используется структура Circle, в которой определены:

pos - структура vec2d, центр окружности (pos.x и pos.y координаты X и Y соответственно);

radius - радиус окружности;

velocity - структура vec2d, скорость перемещения (velocity.x и velocity.y скорости перемещения по осям);

color - цвет окружности.

В программе использовались следующие функции:

Имя

Описание

SpheresDoc.cpp

int GetCircleIndex(const CPoint& pt) const

Позволяет по точке в плоскости получить индекс окружности, которая содержит эту точку

Circle& GetCircleById(int id)

Возвращает ссылку на окружность по её индексу

void DrawCircle(CDC *pDC)

Отрисовка окружностей

bool IsIntersect(Circle)

Определение пересечения окружностей

void DoSimulation()

Функция содержит алгоритм движения

SpheresView.cpp

afx_msg void OnTimer(UINT_PTR nIDEvent)

Функция по таймеру осуществляет вызов DoSimulation() таким образом реализуя один шаг имитации движения

afx_msg void OnLButtonDown(UINT nFlags, CPoint point)

Отслеживание нажатия левой кнопки мыши

afx_msg void OnMouseMove(UINT nFlags, CPoint point)

Отслеживание перемещения мыши

afx_msg void OnLButtonUp(UINT nFlags, CPoint point)

Отслеживание отпускания левой кнопки мыши

afx_msg void OnActionStartsimulation()

Запустить имитацию движения окружностей посредством пункта меню или нажатия F5

afx_msg void OnActionStopsimulation()

Остановить имитацию движения окружностей посредством пункта меню или нажатия F6

afx_msg void OnRButtonDown(UINT nFlags, CPoint point)

Отслеживание нажатия правой кнопки мыши для вызова контекстного меню

afx_msg void PopupMenuCircleProps()

Вызов окна изменения радиуса окружностей

afx_msg void PopupMenuCircleColor()

Вызов окна изменения цвета окружностей

Результаты работы программы:

При запуске программы создаются окружности. Их можно перемещать курсором мыши, изменять радиус и цвет. Запустить/остановить имитацию движения окружностей можно с помощью соответствующего пункта меню Action или нажатием функциональных клавиш F5/F6.

Листинг программы

SpheresDoc.h

// SpheresDoc.h : interface of the CSpheresDoc class

//

#include<vector>

#pragma once

struct vec2d {

vec2d () {}

vec2d (double x, double y) : x(x), y(y){}

vec2d (vec2d const& other) : x(other.x), y(other.y){}

// ACCESSORS

double length() const;

// MANIPULATORS

vec2d& operator+=(vec2d const& other);

vec2d& operator-=(vec2d const& other);

vec2d& operator*=(double value);

vec2d& operator/=(double value);

vec2d& normalize();

double x,y;

};

struct Circle {

Circle() : velocity(1,0), color(RGB(0,0,0)) {}

vec2d pos;

vec2d velocity;

// Переменная color хранит информацию о цвете окружности

COLORREF color;

double radius;

};

class CSpheresDoc : public CDocument

{

protected: // create from serialization only

CSpheresDoc();

DECLARE_DYNCREATE(CSpheresDoc)

// Attributes

public:

std::vector<Circle> m_circles;

RECT m_area;

// Operations

public:

int GetCircleIndex(const CPoint& pt) const;

Circle& GetCircleById(int id);

// Описание метода DrawCircle для прорисовки окружностей в окне

void DrawCircle(CDC *pDC);

// Проверка на пересечение окружностей

bool IsIntersect(Circle);

// Моделирование движения окружностей

void DoSimulation();

// Overrides

public:

virtual BOOL OnNewDocument();

virtual void Serialize(CArchive& ar);

// Implementation

public:

virtual ~CSpheresDoc();

#ifdef _DEBUG

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const;

#endif

protected:

// Generated message map functions

protected:

DECLARE_MESSAGE_MAP()

};

SpheresDoc.cpp

// SpheresDoc.cpp : implementation of the CSpheresDoc class

//

#include "stdafx.h"

#include "Spheres.h"

#include <sstream>

#include "SpheresDoc.h"

#include <math.h>

#include <algorithm>

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

// CSpheresDoc

IMPLEMENT_DYNCREATE(CSpheresDoc, CDocument)

BEGIN_MESSAGE_MAP(CSpheresDoc, CDocument)

END_MESSAGE_MAP()

// CSpheresDoc construction/destruction

CSpheresDoc::CSpheresDoc()

{

// TODO: add one-time construction code here

}

CSpheresDoc::~CSpheresDoc(){}

const int bottom=660,right=660, min_radius=1, max_radius=40,nCircles = 30,nTries = 1000;

BOOL CSpheresDoc::OnNewDocument()

{

if (!CDocument::OnNewDocument())

return FALSE;

// TODO: add reinitialization code here

// (SDI documents will reuse this document)

if (!CDocument::OnNewDocument()) return FALSE;

// Размеры виртуальной области

m_area = CRect(0,0,bottom,right);

const int area_width = m_area.right - m_area.left;

const int area_high = m_area.bottom - m_area.top;

m_circles.clear();

for (int tries=0 ; tries < nTries && m_circles.size() < nCircles; tries++) {

Circle cir;

cir.pos.x = (int)(rand()%(area_width-2*max_radius)+max_radius);

cir.pos.y = (int)(rand()%(area_high-2*max_radius)+max_radius);

cir.radius= rand()%(max_radius-min_radius)+min_radius;

cir.color=RGB(rand()%255,rand()%255,rand()%255);

// Проверка на пересечение с существующими окружностями

if (!IsIntersect(cir))

m_circles.push_back(cir); // Пересечения нет - ставим окружность

}

return TRUE;

}

// CSpheresDoc serialization

void CSpheresDoc::Serialize(CArchive& ar)

{

if (ar.IsStoring())

{

// TODO: add storing code here

}

else

{

// TODO: add loading code here

}

}

// CSpheresDoc diagnostics

#ifdef _DEBUG

void CSpheresDoc::AssertValid() const

{

CDocument::AssertValid();

}

void CSpheresDoc::Dump(CDumpContext& dc) const

{

CDocument::Dump(dc);

}

#endif //_DEBUG

// CSpheresDoc commands

int CSpheresDoc::GetCircleIndex(const CPoint& pt) const

{

for (int i=(int)m_circles.size()-1; i >= 0; i--)

if ( pow(pt.x-m_circles[i].pos.x,2) +

pow(pt.y-m_circles[i].pos.y,2) < pow(m_circles[i].radius,2))

return i;

return -1;

}

Circle& CSpheresDoc::GetCircleById(int id)

{

return m_circles[id];

}

// Проверка на пересечение с существующими окружностями

bool CSpheresDoc::IsIntersect(Circle cir)

{

for(unsigned int i=0; i<m_circles.size(); i++)

if (sqrt(pow(cir.pos.x - m_circles[i].pos.x, 2) +

pow(cir.pos.y - m_circles[i].pos.y, 2)) <=

cir.radius+m_circles[i].radius)

return true;

return false;

}

void CSpheresDoc::DrawCircle(CDC *pDC)

{

int x, y, r;

const int min_drawable_radius=2;

for(unsigned int i=0; i<m_circles.size(); i++)

{

x = (int)m_circles[i].pos.x;

y = (int)m_circles[i].pos.y;

r = (int)max(m_circles[i].radius, min_drawable_radius);

CPen pen(PS_SOLID,1,m_circles[i].color);

pDC->SelectObject(&pen);

pDC->Ellipse(x-r,y-r,x+r,y+r);

}

}

bool obn=false;

int mass[nCircles];

void CSpheresDoc::DoSimulation()

{

int ch=1;

if(!obn)

{

for(int i=0; i<nCircles; i++)

mass[i]=-1;

obn=true;

}

for(unsigned int i=0; i<m_circles.size(); i++)

{

if(mass[i]!=i)

{

if((m_circles[i].pos.x+m_circles[i].radius)>=bottom)

{

mass[i]=i;

m_circles[i].color=RGB(rand()%255,rand()%255,rand()%255);

m_circles[i].pos.x -=ch;

}

else

m_circles[i].pos.x +=ch;

}

else

{

if((m_circles[i].pos.x-m_circles[i].radius)<=0)

{

mass[i]=-1;

m_circles[i].color=RGB(rand()%255,rand()%255,rand()%255);

m_circles[i].pos.x +=ch;

}

else

{

m_circles[i].pos.x -=ch+3;

m_circles[i].radius=rand()%max_radius+min_radius;

}

}

}

UpdateAllViews(NULL);

}

SpheresView.h

// SpheresView.h : interface of the CSpheresView class

//

#pragma once

class CSpheresView : public CView

{

protected: // create from serialization only

CSpheresView();

DECLARE_DYNCREATE(CSpheresView)

// Attributes

public:

CSpheresDoc* GetDocument() const;

int selected_circle;

// Operations

public:

// Overrides

public:

virtual void OnDraw(CDC* pDC); // overridden to draw this view

virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

protected:

// Implementation

public:

virtual ~CSpheresView();

#ifdef _DEBUG

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const;

#endif

protected:

// Generated message map functions

protected:

DECLARE_MESSAGE_MAP()

public:

afx_msg void OnTimer(UINT_PTR nIDEvent);

afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

afx_msg void OnMouseMove(UINT nFlags, CPoint point);

afx_msg void OnLButtonUp(UINT nFlags, CPoint point);

afx_msg void OnActionStartsimulation();

afx_msg void OnActionStopsimulation();

afx_msg void OnRButtonDown(UINT nFlags, CPoint point);

afx_msg void PopupMenuCircleProps();

afx_msg void PopupMenuCircleColor();

afx_msg void OnActionStopsimulaton();

};

#ifndef _DEBUG // debug version in SpheresView.cpp

inline CSpheresDoc* CSpheresView::GetDocument() const

{ return reinterpret_cast<CSpheresDoc*>(m_pDocument); }

#endif

SpheresView.cpp

// SpheresView.cpp : implementation of the CSpheresView class

//

#include "stdafx.h"

#include "Spheres.h"

#include "SpheresDoc.h"

#include "SpheresView.h"

#include "DlgCircleProps.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

// CSpheresView

IMPLEMENT_DYNCREATE(CSpheresView, CView)

BEGIN_MESSAGE_MAP(CSpheresView, CView)

// ON_WM_TIMER()

ON_WM_LBUTTONDOWN()

ON_WM_MOUSEMOVE()

ON_WM_LBUTTONUP()

//ON_WM_CONTEXTMENU()

ON_COMMAND(ID_ACTION_STARTSIMULATION, &CSpheresView::OnActionStartsimulation)

ON_COMMAND(ID_ACTION_STOPSIMULATION, &CSpheresView::OnActionStopsimulation)

ON_WM_TIMER()

ON_WM_RBUTTONDOWN()

ON_COMMAND(ID__PROPERTIES, &CSpheresView::PopupMenuCircleProps)

ON_COMMAND(ID__COLOR, &CSpheresView::PopupMenuCircleColor)

ON_COMMAND(ID_ACTION_STOPSIMULATON, &CSpheresView::OnActionStopsimulaton)

END_MESSAGE_MAP()

// CSpheresView construction/destruction

CSpheresView::CSpheresView() : selected_circle(-1)

{

// TODO: add construction code here

}

CSpheresView::~CSpheresView()

{

}

BOOL CSpheresView::PreCreateWindow(CREATESTRUCT& cs)

{

// TODO: Modify the Window class or styles here by modifying

// the CREATESTRUCT cs

return CView::PreCreateWindow(cs);

}

// CSpheresView drawing

void CSpheresView::OnDraw(CDC* pDC)

{

// Получение указателя на документ и проверка его валидности

CSpheresDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if (!pDoc)

return;

// Рисование окружностей

pDoc->DrawCircle(pDC);

}

// CSpheresView diagnostics

#ifdef _DEBUG

void CSpheresView::AssertValid() const

{

CView::AssertValid();

}

void CSpheresView::Dump(CDumpContext& dc) const

{

CView::Dump(dc);

}

CSpheresDoc* CSpheresView::GetDocument() const // non-debug version is inline

{

ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSpheresDoc)));

return (CSpheresDoc*)m_pDocument;

}

#endif //_DEBUG

void CSpheresView::OnLButtonDown(UINT nFlags, CPoint point)

{

// Получение указателя на документ и проверка его валидности

CSpheresDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if (!pDoc)

return;

// Запросить индекс окружности, в которой находится точка

selected_circle = pDoc->GetCircleIndex(point);

CView::OnLButtonDown(nFlags, point);

}

void CSpheresView::OnMouseMove(UINT nFlags, CPoint point)

{

// Получение указателя на документ и проверка его валидности

CSpheresDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if (!pDoc)

return;

if(selected_circle != -1){

// Перемещение окружности в точку, указанную мышью

pDoc->GetCircleById(selected_circle).pos.x = point.x;

pDoc->GetCircleById(selected_circle).pos.y = point.y;

Invalidate();

}

CView::OnMouseMove(nFlags, point);

}

void CSpheresView::OnLButtonUp(UINT nFlags, CPoint point)

{

selected_circle = -1;

CView::OnLButtonUp(nFlags, point);

}

void CSpheresView::OnActionStartsimulation()

{

SetTimer(1,0,NULL);

}

void CSpheresView::OnActionStopsimulation()

{

KillTimer(1);

}

void CSpheresView::OnActionStopsimulaton()

{

KillTimer(1);

}

void CSpheresView::OnTimer(UINT_PTR nIDEvent)

{

CSpheresDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if (!pDoc)

return;

pDoc->DoSimulation();

CView::OnTimer(nIDEvent);

}

void CSpheresView::OnRButtonDown(UINT nFlags, CPoint point)

{

CSpheresDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if (!pDoc)

return;

CPoint screen_point(point);

ClientToScreen(&screen_point);

selected_circle = pDoc->GetCircleIndex(point);

if (selected_circle != -1) {

// Popup menu

CMenu popup;

popup.LoadMenu(IDR_MENU_POPUP);

CMenu* real_menu=popup.GetSubMenu(0);

real_menu->TrackPopupMenu(TPM_LEFTALIGN,screen_point.x,screen_point.y,this);

}

CView::OnRButtonDown(nFlags, point);

}

void CSpheresView::PopupMenuCircleProps()

{

CSpheresDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if (!pDoc)

return;

// Создание диалога

DlgCircleProps dlg;

// Инициализация данных диалога

dlg.m_radius=pDoc->GetCircleById(selected_circle).radius;

// Отображение диалога и проверка выхода по нажатию «ОК»

if (dlg.DoModal() == IDOK)

// Если радиус был изменён

if ( pDoc->GetCircleById(selected_circle).radius != dlg.m_radius ) {

// Обновить радиус

pDoc->GetCircleById(selected_circle).radius = dlg.m_radius;

// Перерисовать окно

Invalidate();

}

selected_circle = -1;

}

void CSpheresView::PopupMenuCircleColor()

{

CSpheresDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if (!pDoc)

return;

CColorDialog dlg;

if (dlg.DoModal() == IDOK)

if ( pDoc->GetCircleById(selected_circle).color != dlg.GetColor() ) {

pDoc->GetCircleById(selected_circle).color = dlg.GetColor();

Invalidate();

}

selected_circle = -1;

}

Размещено на Allbest.ru


Подобные документы

  • Рабочее приложение для вычисления принадлежности точки заданной области. Реализация и проверка корректности ввода данных: радиуса, условий попарного пересечения окружностей, принадлежности центров окружностей одной прямой, заключенной внутри окружностей.

    курсовая работа [596,7 K], добавлен 13.01.2014

  • Программа, моделирующая систему массового обслуживания (СМО). Моделирование программы имитации работы турникетов на стадионе (многоканальная СМО) в визуальной среде Delphi 7. Описание программного модуля, листинг программы и руководство пользователя.

    курсовая работа [3,8 M], добавлен 20.08.2009

  • Java Foundation Classes, основные концепции. Исходная иерархия классов Abstract Window Toolkit. Представители пользовательского интерфейса. Обработка событий в JavaBeans. Элементы управления, многострочное поле JText. Листинг программы TextEditor.

    курсовая работа [220,6 K], добавлен 26.06.2013

  • Использование DirectX для решения задач по выводу и обработке графики в Microsoft Windows. Описание используемых DirectX-функций. Исходный текст отлаженной программы. Техника работы с окнами. Результаты работы программы, составление алгоритма, листинг.

    контрольная работа [226,0 K], добавлен 18.05.2014

  • Назначение и область применения промышленных роботов. Разработка программы "Кинематическое движение" в среде Delphi для определения основных параметров кинематического движения. Описание работы и листинг программы. Руководство программиста и оператора.

    курсовая работа [499,1 K], добавлен 17.11.2014

  • Программа на языке VBA, которая выводит исходные данные на экран и выполняет расчеты и предназначена для учета на складе мастерской индивидуального пошива. Описание переменных и алгоритма программы. Листинг программы, примеры произведенных расчетов.

    реферат [25,4 K], добавлен 10.12.2010

  • Разработка программы на языке Pascal. Описание переменных. Действия, которые должна выполнить программа согласно выбранного алгоритма. Детализация графической части программы. Листинг и тестирование программы. Вывод массива данных на экран монитора.

    контрольная работа [360,4 K], добавлен 13.06.2012

  • Описание алгоритма решения задачи по вычислению суммы элементов строк матрицы с использованием графического способа. Детализация укрупненной схемы алгоритма и разработка программы для решения задачи в среде Turbo Pascal. Листинг и тестирование программы.

    курсовая работа [446,0 K], добавлен 19.06.2014

  • Математическое описание задачи решения обыкновенного дифференциального уравнения численным явным методом Рунге-Кутта, разработка схемы алгоритма и написание программы в среде программирования Microsoft Visual Studio 2010. Тестирование работы программы.

    курсовая работа [1,1 M], добавлен 22.01.2014

  • Разработка и написание программы по моделированию движения снаряда при заданных параметрах пути, максимальной высоты, времени полета и траектории. Анализ методов построения модели, разработка алгоритма, написание и отладка программы в среде Delphi.

    курсовая работа [214,5 K], добавлен 11.02.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.