Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том2)" -> 62

Visual С++ 6. Полное руководство: В 2 т.(том2) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том2) — Бином, 2006. — 530 c.
Скачать (прямая ссылка): vicualcc2006t2.djvu
Предыдущая << 1 .. 56 57 58 59 60 61 < 62 > 63 64 65 66 67 68 .. 173 >> Следующая

Примечание
При создании рекурсивного узора программа Mandel обрабатывает следующий столбец узора и проверяет ожидаемое сообщение для его обработки, если оно имеется. В гл. 22 описана альтернативная версия программы Mandel, использующая более простой и эффективный метод выполнения длительных графических операций: запуск отдельного потока управления, рисующего весь графический узор, пока основной поток продолжает обрабатывать сообщения.
Следующее действие — добавление к классу представления обработчика сообщений wm_size. Для этого в окне мастера ClassWizard откройте вкладку Message Maps и выберите класс CMandelview в списке Class name. Потом в списке ObjectIDs выберите класс CMandelview, в списке Messages — WM__SIZE и щелкните на кнопке Add Function, чтобы создать обработчик, называемый OnSize. Затем откройте файл MandelView.h и в начало определения класса добавьте определения, выделенные полужирным шрифтом.
// MandelView.h: интерфейс класса CMandelview //
I/11/111/111/111111111111111111111111 III 11111111111111111111111II
class CMandelview : public CView
{
private:
int m_Col;
int m_ColMax;
float m_CR;
float m_DCI;
float m _DCR;
int m_RowMax; public:
void DrawCol (); // оставшаяся часть определения класса CMandelview ... '
Переменная m_Col используется для сохранения номера следующего столбца пикселей внутри рекурсивного узора. Переменные m_ColMax и m_rowMax сохраняют номера последней строки и столбца. Эти значения зависят от размера окна представления. Далее вы узнаете, как они устанавливаются. Переменные mCR, m_CDi и m_CDR используются при генерации рекурсивных узоров, а функция DrawColor — для рисования каждой колонки изображения.
Теперь откройте MandelView.cpp и добавьте в начале файла определения, выделенные полужирным шрифтом.
// MandelView.срр : определение класса CMandelView //
#include "stdafx.h" #include "Mandel.h"
#include "MandelDoc.h" #include "MandelView.h"
ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_.FILE[ ] = _FILE__;
#endif
// определение набора констант Мандельброта:
#define СШАХ 1.2
#define CIMIN -1.2
#define CRMAX 1.0
#define CRMIN -2.0
#define NMAX 128
// цвета, используемые для создания узора Мандельброта: DWORD ColorTable [6] =
{OxOOOOff, // красный
OxOOffOO, // зеленый
OxffOOOO, // синий
OxOOffff, // желтый
OxffffOO, // бирюзовый
OxffOOff}; // сиреневый
Константы и массив ColorTable используются при генерации графического узора. Оставьте файл MandelView.cpp открытым, так как еще не все изменения внесены. Добавьте следующую инициализацию конструктора класса CMandelView
CMandelView::CMandelView() {
// TODO: здесь добавьте код конструктора m_Col = 0;
}
и добавьте определение функции DrawCol в конце файла.
void CMandelView::DrawCol () {
CClientDG ClientDC (this);
float CI;
int ColorVal;
float I;
float ISqr;
float R;
int Row;
float RSqr;
if (m_Col >= m_ColMax I I GetParentFrame ()->IsIconic ()) return;
CI = (float)CTMAX;
for (Row = 0; Row < mJRowMax; ++Row) {
R = (float)0.0; I = (float)0.0; RSqr = (float)0.0; ISqr = (float)0.0; ColorVal = 0;
while (ColorVal < NMAX && RSqr + ISqr < 4) {
++ColorVal;
RSqr = R * R;
ISqr =1 * I;
I *= R;
I += I + CI;
R = RSqr - ISqr + m__CR;
}
ClientDC.SetPixelV (m_Col, Row, ColorTable [ColorVal % 6] ) ;
CI -= m_DCI;
}
m_Col++;
m_CR += m_DCR;
}
При каждом вызове функция DrawCol рисует следующий столбец пикселей внутри рекурсивного узора, продвигаясь слева направо. Функция DrawCol создает объект контекста устройства класса cclientoc, а потом использует уравнение Мандельброта для вычисления цветового кода каждого пикселя в столбце. Чтобы закрасить пиксель, она вызывает функцию SetPixe.lv класса CDC. (Описание метода вычисления цветового кода каждого пикселя во множестве Мандельброта в этой книге не приводится. Можете обратиться к книгам и статьям, посвященным рекурсивным методам, например, Fractal Programming in С Роджера Стивенса (Roger Т. Stevens), издательство М&Т Books.) Обратите внимание: функция DrawCol возвращает управление сразу, без рисования столбца, если главное окно минимизировано, т.е. если CWr.d: : isiconic возвращает значение TRUE. Адрес объекта главного окна, используемый для вызова этой функции, получен вызовом функции CWnd: ¦.GetParentFrame.
Заметим: рекурсивный узор полностью заполняет окно представления, следовательно, значения переменных, используемых для его создания, зависят от размера окна. Они устанавливаются в ответ на сообщение WM_SIZE, передаваемое при первичном создании окна и при каждом изменении его размеров. В файле MandelView.срр добавьте в обработчик OnSize этого сообщения следующий фрагмент программы.
void CMandelView::OnSize(UINT nType, int cx, int cy)
{
CVievj:: OnSize (nType,. cx, cy) ;
// TODO: Здесь добавьте собственный код обработчика
if (сх <= 1 | | су <= 1) // проверка деления на ноль
return; m_ColMax = сх; m_RowMax = су;
m_DCR = (float)((CRMAX - CRMIN) / (m_ColMax-l)); m_DCI = (float)((CIMAX - CIMIN) / <m_RowMax-l));
Предыдущая << 1 .. 56 57 58 59 60 61 < 62 > 63 64 65 66 67 68 .. 173 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100