Ejemplo n.º 1
0
        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;
            }

            //====== Освобождаем временный буфер
        }
Ejemplo n.º 2
0
        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;
            }

            //====== Освобождаем временный буфер
        }