- •Компьютерная графика
- •Лабораторная работа №1 Графические примитивы
- •Задание
- •Последовательность выполнения задания
- •Программный код
- •1.2.1 Среда программирования Microsoft Visual Studio 6. (мастер приложений AppWizard)
- •1.2.2 Среда разработки ms Visual Studio 2010
- •1. Добавим строки, сохраняющие координаты указателя мыши в момент нажатия левой кнопки мыши
- •2. Добавим в метод OnDraw() класса cPainterView строки, которые будут выполнять вывод на экран линий, соединяющих опорные точки.
- •3. Создание нового рисунка. Добавим в метод OnNewDocument() класса cPainterDoc
- •4. Сохранение рисунков в файл. Модифицируем функцию Serialize() класса cPainterDoc в файле PainterDoc.Cpp
- •Лабораторная работа №2 Фракталы
- •Лабораторная работа №3
- •Сплайны. Кривая Безье
- •Задание
- •Последовательность выполнения задания
- •Программный код
- •Лабораторная работа №4
- •Цель работы:
- •Теоретическое введение:
- •Лабораторная работа №5 «Закрашивание. Метод Фонга»
- •Контрольная работа
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 Множество Мандельброта
