Программа простейшего варианта имитации движения окружностей
Написание алгоритма в среде 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.2009Java 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