Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Компьютерная графика.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
4.56 Mб
Скачать

1.2.2 Среда разработки ms Visual Studio 2010

Код программы

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

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

{

//получили указатель на объект-документ

CPainterDoc *pDoc=GetDocument();

//проверим не исчерпали ли ресурс

if(pDoc->m_nIndex==MAXPOINTS)

AfxMessageBox(_T("Слишком много точек"));

else

{

//запоминаем точку

pDoc->m_Points[pDoc->m_nIndex++]=point;

//указываем, что окно надо перерисовать

Invalidate();

// указываем, что документ изменен

pDoc->SetModifiedFlag();

}

CView::OnLButtonDown(nFlags, point);

}

2. Добавим в метод OnDraw() класса cPainterView строки, которые будут выполнять вывод на экран линий, соединяющих опорные точки.

void CPR1View::OnDraw(CDC* pDC)

{

CPainterDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if (!pDoc)

return;

//если имеются опорные точки

CPen aPen;

aPen.CreatePen(PS_SOLID,2,RGB(255,0,0));;

CPen* pOldPen=pDC->SelectObject(&aPen);

if(pDoc->m_nIndex>0)

//поместим перо в первую из них

pDC->MoveTo(pDoc->m_Points[0]);

//пока не кончатся опорные точки будем их соединять

for(int i=1; i<pDoc->m_nIndex; i++)

pDC->LineTo(pDoc->m_Points[i]);

pDC->SelectObject(pOldPen);

}

3. Создание нового рисунка. Добавим в метод OnNewDocument() класса cPainterDoc

BOOL CPainterDoc::OnNewDocument()

{

if (!CDocument::OnNewDocument())

return FALSE;

// TODO: добавьте код повторной инициализации

// (Документы SDI будут повторно использовать этот документ)

// сбросили счетчик

m_nIndex=0;

// перерисовали

UpdateAllViews(NULL);

return TRUE;

}

4. Сохранение рисунков в файл. Модифицируем функцию Serialize() класса cPainterDoc в файле PainterDoc.Cpp

// сериализация CPainterDoc

void CPainterDoc::Serialize(CArchive& ar)

{

if (ar.IsStoring())

{

//сохраняем количество точек

ar << m_nIndex;

//сохраняем значения координат точек

for(int i=0; i<m_nIndex; i++) ar << m_Points[i];

}

else

{

//загружаем количество точек

ar >> m_nIndex;

//загружаем значения координат точек

for(int i=0; i<m_nIndex; i++) ar >> m_Points[i];

}

}

Запуск программы

1. Запусть файл Painter.exe

Рис. 35 Результат работы программы рисования линии (MS Visual C++ 2010)

Лабораторная работа №2 Фракталы

Цель работы: Получить теоретические знания и практические навыки в использовании Microsoft Visual C++ 2010 для формализации приложения формализующего отображение фрактала Мандельброта.

Используемые приемы и технологии: Visual C++ 2010 Professional, Microsoft Visual Studio 6, библиотеки графических интерфейсов Windows Forms (WF) и Microsoft Foundation Classes (MFC).

Ключевые термины: фрактал, среда программирования MS Visual Studio 2010, MS Visual Studio 6, общеязыковая среда исполнения (Common Language Runtime (CLR)), Visual C++.NET, Windows Forms, Microsoft Foundation Classes Library.

Теоретическое введение:

Фракта́л — сложная геометрическая фигура, обладающая свойством самоподобия, то есть составленная из нескольких частей, каждая из которых подобна всей фигуре целиком.

Мно́жество Мандельброта – это множество точек c на комплексной плоскости, для которых итеративная последовательность z0=0,zn=zn-12+c (n=1, 2, 3, …) не уходит на бесконечность. То есть, это множество таких c, для которых существует действительное R, что неравенство |zn|<R выполняется при всех натуральных n.

М атематическое описание:

Код программы

Среда разработки MS Visual Studio 2010

//Определение констант

#define CImMAX 1.25 //с увеличением значения рисунок смещается по

//вертикали вниз

#define CImMIN -1.25 //с уменьшением значения рисунок смещается по

//вертикали вверх

#define CReMAX 1.25 //с увеличением значения рисунок смещается влево

#define CReMIN -2.0 //с уменьшением значения рисунок смещается вправо

#define MAX_ITERATION 128 //количество итераций

//Таблица цветов

DWORD ColorTable [6] =

{0x0000ff, //красный -RGB(255,0,0)

0x00ff00, //зеленый -RGB(0,255,0)

0xff0000, //синий - RGB(0,0,255)

0x00ffff, //желтый - RGB(255,255,0)

0xffff00, //бирюзовый - RGB(0,255,255)

0xff00ff, //сиреневый - RGB(255,0,255)

};

//Функция рисования фрактала

void CMandelView::DrawCol(void)

{

CClientDC ClientDC (this);

int Iteration; //номер текущей итерации

float Im; //значение мнимой части комплексной переменной

float ImSqr; //квадрат мнимой части комплексной переменной

float ReSqr; //квадрат действительной части комплексной

//переменной

float Re; //значение действительной части комплексной

//переменной

int Row; //текущая строка рисунка - номер позиции в

//столбце пикселов

//если заполнен последний столбец или окно минимизировано, то выход

if (m_Col >= m_ColMax || GetParentFrame ()->IsIconic ())

return;

m_CIm = CImMAX; //текущее значение мнимой части комплексной

//переменной

for (Row = 0; Row < m_RowMax; ++Row) //проход по всему столбцу

{

Re =0.0;

Im = 0.0;

ReSqr = 0.0;

ImSqr = 0.0;

Iteration = 0;

//пока не закончились все итерации и точка не вышла из круга

//радиуса 2

while (Iteration < MAX_ITERATION && ReSqr + ImSqr < 4)

{

++Iteration; //перейти к следующей итерации

ReSqr = Re * Re; //вычислить составляющие произведения

//двух комплексных переменных

ImSqr = Im * Im;

Im = 2 * Im * Re + m_CIm;

Re = ReSqr - ImSqr + m_CRe;

}

//отобразить пиксел заданным цветом

ClientDC.SetPixelV (m_Col, Row, ColorTable [Iteration % 6]);

m_CIm -= m_DCIm; //прирастить мнимую часть комплексной

//переменной

}

m_Col++; //перейти к следующему столбцу

m_CRe += m_DCRe; //прирастить действительную часть комплексной

//переменной

}

4. Запуск программы

1. Запусть файл Mandel.exe

Рис.36 Множество Мандельброта