2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Вывести сетку из красных точек на OpenGL
Сообщение26.12.2020, 17:47 


31/08/17
34
Уважаемые участники, хочу вывести "решетку" из красных точек 10x10 в OpenGL. Пишу на C++ в Visual Studio 2019.

В качестве "хранителя данных" использую трехмерный массив A с пятью слоями.

Первый слой - координаты точек X, просто индексы. Второй слой - координаты Y, тоже индексы. Третий, четвертый и пятый - цвета R, G и B. Заполняю единицами только красный, синий и зеленый - нули.

В функции void display сделал условие. Если запуск функции первый (IF Z = 0, и тут же меняем на Z = 1) , то заполняем массивы vertex и colors из трехмерного массива (из первого слоя берем X, из второго Y, из третьего красный цвет).

Выводим решетку на экран.

Когда первоначальная инициализация прошла (Z = 1), в условии ELSE заполняем красный цвет из массива A еще раз. Просто так, потом буду менять цвет в точках.

Вместо решетки почему-то выводятся четыре разноцветных точки.

На 95 строке пишет предупреждение "C6385: Чтение недопустимых данных из A[i][j]. Доступный для чтения объем равен 20 байт, однако считать можно только 24 байт". Что ему не нравится?

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>
#include <cstdlib>
#include <glut.h>
#include <windows.h>

using namespace std;

unsigned int i, j, k, w;

float x, y, c;

int Z;


float vertices[200] = { 0 }; // { 0,0 , 0,0 , 0,0 , 0,0 }

float colors[300] = { 0 }; // { 0,0,0 , 0,0,0 , 0,0,0 , 0,0,0 }


float A[10][10][5] = { 0 };


void display()
{
   
    glClear(GL_COLOR_BUFFER_BIT);
    glClear(GL_DEPTH_BUFFER_BIT);
   
   
    if (Z == 0)
    {

            /* Инициализация рабочего массива A, массивов vertex и colors и их первый вывод ------------------
               Массив A : первый слой    - координата x
                          второй слой    - координата y
                          третий слой    - цвет R
                          четвертый слой - цвет G
                          пятый слой     - цвет B
            */

       
       
       
       
       
            // Первоначальное заполнение координатами первого и второго слоя "Рабочего массива A" индексами. Третий слой заполняем единицами (красный).

            for (i = 0; i < 10; i++)
            {

                for (j = 0; j < 10; j++)
                {
                    A[i][j][0] = i;  //координата X

                    A[i][j][1] = j;  //координата Y

                    A[i][j][2] = 1;  //красный цвет

                }


            }



            // Первоначальное заполнение "Массива вершин" координатами первого и второго слоя из массива А. Перескакиваем через два столбца.

            for (i = 0; i < 10; i++)
            {

                for (j = 0; j < 10; j = j + 2)
                {
                    vertices[i] = A[i][j][0];

                    vertices[i + 1] = A[i][j][1];


                }


            }



            // Заполнение "Массива цветов" координатами третьего, четвертого и пятого слоя из массива А. Красный цвет - третий. Синий и зеленый оставляем нули.

            for (i = 0; i < 10; i++)
            {

                for (j = 0; j < 10; j = j + 3)
                {
                    colors[i] = A[i][j][2];

                    colors[i + 1] = A[i][j][3];

                    colors[i + 2] = A[i][j][4];

                }


            }


            Z = 1;
           
    }

    else
    {    

            // Работа с массивом цветов (с координатами третьего слоя массива А). Перескакиваем через три столбца.

            for (i = 0; i < 10; i++)
            {

                for (j = 0; j < 10; j = j + 3)
                {
                    colors[i] = A[i][j][2];

                    colors[i + 1] = A[i][j][3];

                    colors[i + 2] = A[i][j][4];

                }


            }

    }


    glVertexPointer(2, GL_FLOAT, 0, &vertices);

    glColorPointer(3, GL_FLOAT, 0, &colors);

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);


        glDrawArrays(GL_POINTS, 0, 200);


    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);

    glutSwapBuffers();

}



// Настройки таймера ***********************************************************

void TimerFunction(int value)
{
    glutPostRedisplay();  //перерисовываем экран
    glutTimerFunc(1000, TimerFunction, 1);  //запускаем таймер заново
}

//******************************************************************************




// Настройки OpenGL -------------------------------------------

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(50, 50);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Massiv 10 10 Red");

    glLoadIdentity();


        glOrtho(0, 60, 0, 60, 0, 1);


    glClearColor(1.0, 1.0, 1.0, 1.0);
    glPointSize(8);

    glutDisplayFunc(display);
    glutTimerFunc(1000, TimerFunction, 1);

    Z = 0;

        glutMainLoop();

    return 0;

}

 Профиль  
                  
 
 Posted automatically
Сообщение26.12.2020, 18:44 
Заслуженный участник


09/05/12
25179
 i  Тема перемещена из форума «Программирование» в форум «Карантин»
по следующим причинам:

- оформите код с помощью тэга подсветки синтакиса (возможно, заодно еще и нормальное форматирование сохранится, если оно в оригинале было);
- отдельные команды в тексте лучше выделить тэгом моноширинного шрифта, читать проще будет.

 Профиль  
                  
 
 Posted automatically
Сообщение26.12.2020, 22:04 
Заслуженный участник


09/05/12
25179
 i  Тема перемещена из форума «Карантин» в форум «Программирование»

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group