Файловые операции
Создание тестовой поверхности, чтение данных из файла и хранение этих данных в контейнере мы будем делать так же, как и в проекте MFC. Для разнообразия используем другую формулу для описания поверхности по умолчанию, то есть того графика, который увидит пользователь элемента ActiveX при его инициализации в рамках окна контейнера. Вот эта формула:
Yi,j=exp[-(i+20*j)/256]*SIN[3*n*(i-Nz/2)/Nz]*SIN[3*n*(j-Nx/2)/Nx]
Приведем тело функции DefaultGraphic, которая генерирует значения этой функции над дискретной сеткой узлов в плоскости X-Z и записывает их в файл с именем "expidat". В теле этой функции мы вызываем другую вспомогательную функцию SetGraphPoints, которая наполняет контейнер точек типа CPointSD. При этом, как вы помните, она генерирует недостающие две координаты (z, x) и масштабирует ординаты (у) так, чтобы соблюсти разумные пропорции изображения графика на экране:
void COGView::DefaultGraphic() { //====== Размеры сетки узлов m_xSize = m_zSize = 33; //====== число ячеек на единицу меньше числа узлов UINTnz = m_zSize – 1, nx = m_xSize – 1; // Размер файла в байтах для хранения значений функции DWORD nSize = m_xSize * m_zSize * sizeof(float) + 2*sizeof(UINT); //====== Временный буфер для хранения данных BYTE *buff = new BYTE[nSize+1]; //====== Показываем на него указателем целого типа UINT *p = (UINT*)buff; // Размещаем данные целого типа *р++ = m_xSize; *р++ = m_zSize; //===== Меняем тип указателя, так как дальше //====== собираемся записывать вещественные числа float *pf = (float*)p; // Предварительно вычисляем коэффициенты уравнения double fi = atan(l.)*12, kx=fi/nx, kz=fi/nz; //=== В двойном цикле пробега по сетке узлов //=== вычисляем и помещаем в буфер данные типа float for (UINT i=0; i<m_zSize; for (UINT j=0; j<m_xSize; *pf++ = float (exp(-(i+20.*j)/256.) *sin(kz* (i-nz/2.)) *sin(kx* (j-nx/2.))); //=== Переменная для того, чтобы узнать сколько //=== байт было реально записано в файл DWORD nBytes; //=== Создание и открытие файла данных sin.dat HANDLE hFile = CreateFile(_T("sin.dat"), GENERIC_WRITE, 0.0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0) //=== Запись в файл всего буфера WriteFile(hFile, (LPCVOID)buff, nSize,SnBytes, 0); CloseHandle(hFile); // Закрываем файл //=== Создание динамического массива m cPoints SetGraphPoints (buff, nSize); //=== Освобождаем временный буфер delete [] buff; }