private void InitGraphic(float[][] buff) { //====== Размеры сетки узлов m_xSize = (uint)buff.Length; m_zSize = (uint)buff[0].Length; // Размер буфера для хранения значений функции ulong nSize = m_xSize * m_zSize; //====== Создание динамического массива m_cPoints //====== Готовимся к расшифровке данных буфера //====== Проверка на непротиворечивость if (m_xSize < 2 || m_zSize < 2 || m_xSize * m_zSize != nSize) { MessageBox.Show("Данные противоречивы"); return; } //====== Изменяем размер контейнера //====== При этом его данные разрушаются m_cPoints = new CPoint3D[m_xSize * m_zSize]; if (m_cPoints.Length == 0) { MessageBox.Show("Не возможно разместить данные"); return; } //====== Подготовка к циклу пробега по буферу //====== и процессу масштабирования float x, z, //====== Считываем первую ординату fMinY = buff[0][0], fMaxY = buff[0][0], right = (m_xSize - 1) / 2.0f, left = -right, rear = (m_zSize - 1) / 2.0f, front = -rear, range = (right + rear) / 2.0f; uint n; //====== Вычисление размаха изображаемого объекта m_fRangeY = range; m_fRangeX = (float)m_xSize; m_fRangeZ = (float)m_zSize; //====== Величина сдвига вдоль оси Z m_zTrans = -1.5f * m_fRangeZ; //====== Генерируем координаты сетки (X-Z) //====== и совмещаем с ординатами Y из буфера int i = 0, j = 0; for (z = front, i = 0, n = 0; i < m_zSize; i++, z += 1.0f) { for (x = left, j = 0; j < m_xSize; j++, x += 1.0f, n++) { if (buff[i][j] > fMaxY) { fMaxY = buff[i][j]; // Претендент на максимум } else if (buff[i][j] < fMinY) { fMinY = buff[i][j]; // Претендент на минимум } m_cPoints[n] = new CPoint3D(x, z, buff[i][j]); } } //====== Масштабирование ординат float zoom = fMaxY > fMinY ? range / (fMaxY - fMinY) : 1.0f; for (n = 0; n < m_xSize * m_zSize; n++) { m_cPoints[n].y = zoom * (m_cPoints[n].y - fMinY) - range / 2.0f; } //====== Освобождаем временный буфер }
private void InitGraphic(float[][] buff) { //====== Размеры сетки узлов m_xSize = (uint)buff.Length; m_zSize = (uint)buff[0].Length; // Размер буфера для хранения значений функции ulong nSize = m_xSize * m_zSize; //====== Создание динамического массива m_cPoints //====== Готовимся к расшифровке данных буфера //====== Проверка на непротиворечивость if (m_xSize < 2 || m_zSize < 2 || m_xSize * m_zSize != nSize) { MessageBox.Show("Данные противоречивы"); return; } //====== Изменяем размер контейнера //====== При этом его данные разрушаются m_cPoints = new CPoint3D[m_xSize * m_zSize]; if (m_cPoints.Length == 0) { MessageBox.Show("Не возможно разместить данные"); return; } //====== Подготовка к циклу пробега по буферу //====== и процессу масштабирования float x, z, //====== Считываем первую ординату fMinY = buff[0][0], fMaxY = buff[0][0], right = (m_xSize - 1) / 2.0f, left = -right, rear = (m_zSize - 1) / 2.0f, front = -rear, range = (right + rear) / 2.0f; uint n; //====== Вычисление размаха изображаемого объекта m_fRangeY = range; m_fRangeX = (float)m_xSize; m_fRangeZ = (float)m_zSize; //====== Величина сдвига вдоль оси Z m_zTrans = -1.5f * m_fRangeZ; //====== Генерируем координаты сетки (X-Z) //====== и совмещаем с ординатами Y из буфера int i = 0, j = 0; for (z = front, i = 0, n = 0; i < m_zSize; i++, z += 1.0f) { for (x = left, j = 0; j < m_xSize; j++, x += 1.0f, n++) { if (buff[i][j] > fMaxY) fMaxY = buff[i][j]; // Претендент на максимум else if (buff[i][j] < fMinY) fMinY = buff[i][j]; // Претендент на минимум m_cPoints[n] = new CPoint3D(x, z, buff[i][j]); } } //====== Масштабирование ординат float zoom = fMaxY > fMinY ? range / (fMaxY - fMinY) : 1.0f; for (n = 0; n < m_xSize * m_zSize; n++) { m_cPoints[n].y = zoom * (m_cPoints[n].y - fMinY) - range / 2.0f; } //====== Освобождаем временный буфер }