Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/29: Рейтинг темы: голосов - 29, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 29.11.2020
Сообщений: 14

Как вывести на экран множество точек

29.11.2020, 05:11. Показов 6986. Ответов 36

Студворк — интернет-сервис помощи студентам
Уважаемые форумчане, добрый вечер! Пишу игру "Жизнь", нужно вывести на экран массив точек. Просто точек, не соединенных линиями.

Как нарисовать этот массив? Есть ли какая-нибудь glDrawPoints?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.11.2020, 05:11
Ответы с готовыми решениями:

Дано множество A из N точек на плоскости. Найти точку (вывести её номер и значение) среди всех точек этого множества
Дано множество A из N точек на плоскости. Найти точку (вывести её номер и значение) среди всех точек этого множества, лежащих в первой...

Сформировать множество S1, элементами которого есть целые числа, вывести это множество на экран
Также нужно посчитать количество отрицательных чисел, которые имеються в множестве. Помогите написать програму, пожалуйста :read:

Множество точек сферы и множество точек плоскости эквивалентны
Доказать, что множество точек сферы и множество точек плоскости эквивалентны.

36
249 / 79 / 31
Регистрация: 29.03.2020
Сообщений: 497
03.12.2020, 13:33
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от wxthplvl65 Посмотреть сообщение
Вот в компиляторе DevC++ была команда putpixel (x, y , цвет);
Надо было еще подключить <graphics.h>
Очень удобная команда, а в visual-studio ее нет.
библиотека graphics — это такая штука от борланд, не принятая стандартом, которая умеет рисовать графику и при этом если надо нарисовать какой-нибудь прямоугольник, не требует никаких монструозных конструкций из указателей, векторов и прочих страшных для новичка вещей. Достаточно просто ввести rectangle() и в скобках указать координаты верхней левой и правой нижней точек прямоугольника
а opengl по другому принципу работает
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
03.12.2020, 14:10
Цитата Сообщение от wxthplvl65 Посмотреть сообщение
Есть ли в opengl похожая команда, чтобы строила точку по координатам и с нужным цветом; сразу, без ссылки на массив цветов?
Цитата Сообщение от snake32 Посмотреть сообщение
glBegin(GL_POINTS);
glColor3f(1.0, 0.0, 0.0);
Закольцевал карту и поправил правила. Очень похоже работает. Есть бактерии летающие как на видео, только мелкие.
Я вот не могу понять…это разве не одинаковые условия?
Вход целые.
if(SUM <2 || SUM>3)
//if(SUM!=2 || SUM!=3)
Верхнее пашет а нижнее не хочет- магия.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#include <gl/glut.h>
//#include <iostream>  // нужен для отладки  cout печатать массивы, переменные т.д.
//using namespace std;
#include <stdlib.h> // тут есть генератор рандома rand()
 
//-------опции
int pt=5;// размер точки,целые
float m=0.8; //порог шума 
#define N 50   // кол-во  клеток на квадратной стороне 
//-------опции
 
 
bool render_complete=0;
unsigned int size=N; 
bool arr[N][N]={0}; 
bool arr2[N][N]={0}; 
 
void setup() 
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClearColor(0, 0, 0, 0);
//------------------генерация первого поколения
// если от рандома приходит число больше 0.5 записать 1 иначе ничего
srand(10); //число сид генератора
for(int i = 0; i < size; i++)
{
float k=0;
        for (int j = 0; j < size; j++)
        {
            k=(float) rand()/RAND_MAX;
            if(k>m)
 
 
            {
                arr[i][j]=1;
            }
                //cout<<(float)arr[i][j];// для отладки показ массива
        }
}
//------------------генерация первого поколения
}
 
 
void draw() 
{
glClear(GL_COLOR_BUFFER_BIT);
//------------
glColor3f(1, 1, 1);
glPointSize(pt);
glBegin(GL_POINTS);
int SUM;
    for(int i = 1; i < size+2; i++)
    {
        for(int j = 1; j < size+2; j++)
            {
SUM=0;
//закольцовка карты по XY
unsigned int  a,b,max=size+1;
a=i-1;
b=j+1;
if(a==0) {a=size;}
if(a==max) {a=1;}
if(b==0) {b=size;}
if(b==max) {b=1;}
SUM+=arr[a][b];
a=i;
b=j+1;
if(a==0) {a=size;}
if(a==max) {a=1;}
if(b==0) {b=size;}
if(b==max) {b=1;}
SUM+=arr[a][b];
a=i+1;
b=j+1;
if(a==0) {a=size;}
if(a==max) {a=1;}
if(b==0) {b=size;}
if(b==max) {b=1;}
SUM+=arr[a][b];
a=i-1;
b=j;
if(a==0) {a=size;}
if(a==max) {a=1;}
if(b==0) {b=size;}
if(b==max) {b=1;}
SUM+=arr[a][b];
a=i+1;
b=j;
if(a==0) {a=size;}
if(a==max) {a=1;}
if(b==0) {b=size;}
if(b==max) {b=1;}
SUM+=arr[a][b];
a=i-1;
b=j-1;
if(a==0) {a=size;}
if(a==max) {a=1;}
if(b==0) {b=size;}
if(b==max) {b=1;}
SUM+=arr[a][b];
a=i;
b=j-1;
if(a==0) {a=size;}
if(a==max) {a=1;}
if(b==0) {b=size;}
if(b==max) {b=1;}
SUM+=arr[a][b];
a=i+1;
b=j-1;
if(a==0) {a=size;}
if(a==max) {a=1;}
if(b==0) {b=size;}
if(b==max) {b=1;}
SUM+=arr[a][b];
 
if(arr[i][j]==0) //  K==0 если SUM==3 то K=1
{       
    if(SUM ==3) 
    {
        arr2[i][j]=1; 
    }
}
else{
// K==1 если SUM<2 или SUM>3 то K=0
    if(SUM <2 || SUM>3)
    //if(SUM!=2 || SUM!=3) 
    {
        arr2[i][j]=0; 
    }
}
 
 
 
 
 
 
if(arr2[i][j]==1) // если есть живая то получаем координаты для рисвания
{
    float t1=float(i-1)/size;
    float x=(1-t1)*-0.9+t1*0.9; 
    float t2=float(j-1)/size;
    float y=(1-t2)*-0.9+t2*0.9;
    glVertex2f(x,y);
    SUM=0;
}
 
}
}
glEnd();
 
//копируем буферный массив в рисуемый
for(int k = 1; k < size+2; k++)
{
    for(int m = 1; m < size+2; m++)
    {
    arr[k][m]=arr2[k][m];
    }
}
render_complete=1;
}
 
 
 
void Timer(int value) 
{
 
if(render_complete==1) 
{
    glutSwapBuffers();
    render_complete=0;
    glutTimerFunc(33, Timer, 1);
    draw();
}
 
}
 
int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(400, 400); 
    glutCreateWindow("Game of life");
    setup();
    draw();
    glutTimerFunc(0, Timer, 1);
    glutMainLoop(); 
    return 0;
}
Добавлено через 6 минут
Вот так надобыло,
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Читаем клетку, применяя правила анализ 8 соседей и записываем состояние клетки во второй массив. Переписываем второй в первый.
это указано на русской вики я просто недочитал =)).
Значит первый алгоритм вообще рекурсия рекурсии..очень сложный клеточный автомат. А этот намного проще. Но жизнь тут быстро угасает и скучно, надобы сделать прворку каждого фрейма: если живых точек меньше Порог то поменять правила для размножения, чтобы анимация оставалась а не зависала скучно и однообразно.
Также хотел сделать проверку не области 3 на 3 а 5 на 5 с выбором какие точки брать, но не хочет пахать..где-то неуловимый баг.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
03.12.2020, 14:16
Кликните здесь для просмотра всего текста

Не по теме:

Цитата Сообщение от Excalibur921 Посмотреть сообщение
Верхнее пашет а нижнее не хочет- магия.
Ну так это не одно и то-же.
if(SUM!=2 && SUM!=3)

0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
03.12.2020, 15:28
Да, забыл символ в 2 часа ночи…
//if(SUM <2 || SUM>3)
if(SUM!=2 && SUM!=3)

Добавлено через 46 минут
Сделал коррекцию правил. Вместо
if(SUM <2 || SUM>3)
параметр R, меняет R=3 на R=4 это приводит к плавному размножению.
if(SUM <2 || SUM>R)

Если процент живых больше LimLifeUP то R=3, иначе если процент живых меньше LimLifeDN то R=4.
Теперь игра бесконечна =). Надо поискать клеточные автоматы посложней…

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
#include <gl/glut.h>
//#include <iostream>  // нужен для отладки  cout печатать массивы, переменные т.д.
//using namespace std;
#include <stdlib.h> // тут есть генератор рандома rand()
 
//-------опции
int pt=4;// размер точки,целые
float m=0.8; //порог шума 
#define N 100   // кол-во  клеток на квадратной стороне 
float LimLifeUP=0.3; //верхний процент лиимита живых,включаеться нормальный режим
float LimLifeDN=0.1; //нижний процент лиимита живых,включаеться разамножение
//-------опции
 
float LifeCellProc=0; //процент живых клеток
int SUM2=0;
int R=0;
bool render_complete=0;
unsigned int size=N; 
bool arr[N][N]={0}; 
bool arr2[N][N]={0}; 
 
void setup() 
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClearColor(0, 0, 0, 0);
//------------------генерация первого поколения
// если от рандома приходит число больше 0.5 записать 1 иначе ничего
srand(10); //число сид генератора
for(int i = 0; i < size; i++)
{
float k=0;
        for (int j = 0; j < size; j++)
        {
            k=(float) rand()/RAND_MAX;
            if(k>m)
 
 
            {
                arr[i][j]=1;
            }
                //cout<<(float)arr[i][j];// для отладки показ массива
        }
}
//------------------генерация первого поколения
}
 
 
void draw() 
{
glClear(GL_COLOR_BUFFER_BIT);
//------------
glColor3f(1, 1, 1);
glPointSize(pt);
glBegin(GL_POINTS);
int SUM;
    for(int i = 1; i < size+2; i++)
    {
        for(int j = 1; j < size+2; j++)
            {
SUM=0;
//закольцовка карты по XY
unsigned int  a,b,max=size+1;
a=i-1;
b=j+1;
if(a==0) {a=size;}
if(a==max) {a=1;}
if(b==0) {b=size;}
if(b==max) {b=1;}
SUM+=arr[a][b];
a=i;
b=j+1;
if(a==0) {a=size;}
if(a==max) {a=1;}
if(b==0) {b=size;}
if(b==max) {b=1;}
SUM+=arr[a][b];
a=i+1;
b=j+1;
if(a==0) {a=size;}
if(a==max) {a=1;}
if(b==0) {b=size;}
if(b==max) {b=1;}
SUM+=arr[a][b];
a=i-1;
b=j;
if(a==0) {a=size;}
if(a==max) {a=1;}
if(b==0) {b=size;}
if(b==max) {b=1;}
SUM+=arr[a][b];
a=i+1;
b=j;
if(a==0) {a=size;}
if(a==max) {a=1;}
if(b==0) {b=size;}
if(b==max) {b=1;}
SUM+=arr[a][b];
a=i-1;
b=j-1;
if(a==0) {a=size;}
if(a==max) {a=1;}
if(b==0) {b=size;}
if(b==max) {b=1;}
SUM+=arr[a][b];
a=i;
b=j-1;
if(a==0) {a=size;}
if(a==max) {a=1;}
if(b==0) {b=size;}
if(b==max) {b=1;}
SUM+=arr[a][b];
a=i+1;
b=j-1;
if(a==0) {a=size;}
if(a==max) {a=1;}
if(b==0) {b=size;}
if(b==max) {b=1;}
SUM+=arr[a][b];
 
 
 
//----------
if(arr[i][j]==0) //  K==0 если SUM==3 то K=1
{       
    if(SUM ==3) 
    {
        arr2[i][j]=1; 
    }
}
else{
// K==1 если SUM<2 или SUM>3 то K=0
    if(SUM <2 || SUM>R)
    //if(SUM!=2 && SUM!=3) 
    {
        arr2[i][j]=0; 
    }
}
 
 
 
 
 
 
if(arr2[i][j]==1) // если есть живая то получаем координаты для рисвания
{
    float t1=float(i-1)/size;
    float x=(1-t1)*-0.9+t1*0.9; 
    float t2=float(j-1)/size;
    float y=(1-t2)*-0.9+t2*0.9;
    glVertex2f(x,y);
    SUM=0;
}
 
}
}
glEnd();
 
//копируем буферный массив в рисуемый
for(int k = 1; k < size+2; k++)
{
    for(int m = 1; m < size+2; m++)
    {
    arr[k][m]=arr2[k][m];
    }
}
 
 
 
//корректировка правил чтобы жизнь не угасала на экране, иначе скучно там.
//вот в этой строке if(SUM <2 || SUM>3) замена на  if(SUM <2 || SUM>R) 
//если в рисуемом массиве живых меньше чем такой процент LimLifeCel то
//R=4 ( росто популяции) иначе R=3 (обычное значение).
SUM2=0;
    for(int p = 1; p < size+2; p++)
    {
        for(int s = 1; s < size+2; s++)
            {
                if(arr[p][s]==1){SUM2+=arr[p][s];}
            }
    }
    R=3;
    LifeCellProc=(float)SUM2/(size*size);
    if(LifeCellProc<LimLifeDN)  
    {
        R=4;
    }
    else 
    {
        if(LifeCellProc>LimLifeUP)
        {
        R=3;
        }
    }
SUM2=0;
 
 
 
 
render_complete=1;
}
 
 
 
void Timer(int value) 
{
 
if(render_complete==1) 
{
    glutSwapBuffers();
    render_complete=0;
    glutTimerFunc(33, Timer, 1);
    draw();
}
 
}
 
int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(600, 600); 
    glutCreateWindow("Game of life");
    setup();
    draw();
    glutTimerFunc(0, Timer, 1);
    glutMainLoop(); 
    return 0;
}
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
03.12.2020, 19:33
Цитата Сообщение от transetor Посмотреть сообщение
а opengl по другому принципу работает
что там растеризатор, что там растеризатор только вот вопрос вот в чем, где происходит растеризация на gpu или на cpu?
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
03.12.2020, 22:40
На старом глуте и компе разбрасывал порядка 100 000 точек с альфой при 60 фпс. Значит растеризует на ГПУ =).
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
03.12.2020, 22:50
Цитата Сообщение от Excalibur921 Посмотреть сообщение
На старом глуте и компе разбрасывал порядка 100 000 точек с альфой при 60 фпс. Значит растеризует на ГПУ =).
прочитай интересно же
https://ru.wikipedia.org/wiki/... 0%B8%D1%8F
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
03.12.2020, 23:45
Antikl, Сделайте тест вывода пару млн. точек пусть выводит glpoint жирный такой квадратик пикселей 10 и софтверно. Очень сомневаюсь что ЦПУ такое вытянет.

Добавлено через 2 минуты
А как ставить точку putpixel? Лезть в ассемблер? =)) Гуглите Нарисовать квадрат ассемблер…
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
04.12.2020, 01:09
Цитата Сообщение от Excalibur921 Посмотреть сообщение
А как ставить точку putpixel? Лезть в ассемблер?
зачем есть вулкан и opengl не говоря про другие, можно нарисовать на winapi, конечно ты просто вызвал эту функцию и все вот тебе твоя точка, но на этом все ты не понял как она работает что такое графика и как работает Opengl по сути ты не здвинулся с места, поэтому про нее забыли еще когда мамонты бегали, ну хотя Pascal ABC еще помню у другана было в универе еще то было на нем графику выводить но я ему помогал хотя там не учился))
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
09.12.2020, 16:33
Вспомнил, давно спрашивал тоже самое.
Нарисовать массив glDrawPixels
Вот пофиксил на цветной рандом.
Не уверен нужен ли тут такое
data[y][x][0] = (int)255*(float)rand()/RAND_MAX;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//рисует массив цвет RGB(255,255,255) через glDrawPixels
#include <GL/glut.h>
#include <stdlib.h>
const  int W = 300;
const  int H = 300;
GLubyte data[W][H][3] = {0};
 
 void Init(void)
 { 
 glClearColor (0.0, 0.0, 0.0, 0.0);
 
    for( int y = 0; y < W; y++ )
    {
        for( int x = 0; x < H; x++ )
        {
            //(float)rand()/RAND_MAX
            data[y][x][0] = (int)255*(float)rand()/RAND_MAX; 
            data[y][x][1] = (int)255*(float)rand()/RAND_MAX; 
            data[y][x][2] = (int)255*(float)rand()/RAND_MAX; 
        }
    }
 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
 glPixelStorei(GL_UNPACK_ROW_LENGTH, W); //длина строки
 glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); // сколько строк пропустить?
 glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); // сколько пикселов пропустить в каждой строке?
 }
 
 void Reshape(int w, int h)
 {
 glViewport(0, 0, (GLsizei) w, (GLsizei) h);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluOrtho2D(-w/2., w/2., -h/2., h/2.);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 }
 
 void Draw(void)
 {
 glClear(GL_COLOR_BUFFER_BIT);
 //glRasterPos2i(-256, -256); 
 glRasterPos2i(-150, -150); // <--- тут нужен сдвиг на половину разрешения  квадратного массива
 glDrawPixels(
     W, 
     H, 
     GL_RGB, 
     GL_UNSIGNED_BYTE, //GL_UNSIGNED_BYTE, 
     data);
 glutSwapBuffers();
 }
 
 int main(int argc, char** argv)
 {
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
 glutInitWindowSize(300, 300);
 glutInitWindowPosition(100, 100);
 glutCreateWindow("Raster Test");
 Init();
 glutDisplayFunc(Draw);
 glutReshapeFunc(Reshape);
 glutMainLoop();
 return 0; 
 }
Жаль нет такого примера на шейдерах чтобы цвет каждого пикселя считался отдельно в некотором потоке, тогдаб и фракталы можно рисовать быстро.
0
0 / 0 / 0
Регистрация: 29.11.2020
Сообщений: 14
25.12.2020, 11:07  [ТС]
Продолжаю возиться с точками. Хочу вывести "решетку" из красных точек 10x10.

В качестве хранителя данных использую трехмерный массив 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++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#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][1] = i;  //координата X
 
                    A[i][j][2] = j;  //координата Y
 
                    A[i][j][3] = 1;  //красный цвет
 
                }
 
 
            }
 
 
 
            // Первоначальное заполнение "Массива вершин" координатами первого и второго слоя из массива А. Перескакиваем через два столбца.
 
            for (i = 0; i < 10; i++)
            {
 
                for (j = 0; j < 10; j = j + 2)
                {
                    vertices[i] = A[i][j][1];
 
                    vertices[i + 1] = A[i][j][2];
 
 
                }
 
 
            }
 
 
 
            // Заполнение "Массива цветов" координатами третьего, четвертого и пятого слоя из массива А. Красный цвет - третий. Синий и зеленый оставляем нули.
 
            for (i = 0; i < 10; i++)
            {
 
                for (j = 0; j < 10; j = j + 3)
                {
                    colors[i] = A[i][j][3];
 
                    colors[i + 1] = A[i][j][4];
 
                    colors[i + 2] = A[i][j][5];
 
                }
 
 
            }
 
 
            Z = 1;
            
    }
 
    else
    {     
 
            // Работа с массивом цветов (с координатами третьего слоя массива А). Перескакиваем через три столбца.
 
            for (i = 0; i < 10; i++)
            {
 
                for (j = 0; j < 10; j = j + 3)
                {
                    colors[i] = A[i][j][3];
 
                    colors[i + 1] = A[i][j][4];
 
                    colors[i + 2] = A[i][j][5];
 
                }
 
 
            }
 
    }
 
 
    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; 
 
}
Миниатюры
Как вывести на экран множество точек  
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
25.12.2020, 13:40
Сделал по этому примеру
https://www.firststeps.ru/mfc/opengl/r.php?26
Работает.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <gl/glut.h>
 
const int imSiz=200; // размер картинки
 
GLfloat Vertex[4][2];
GLfloat Colors[4][3];
 
 
void FillArr()
{
Vertex[0][0] = -0.9f;
Vertex[0][1] = -0.9f;
Colors[0][0] = 0.1f;
Colors[0][1] = 0.5f;
Colors[0][2] = 0.85f;
 
Vertex[1][0] = -0.9f;
Vertex[1][1] = 0.9f;
Colors[1][0] = 0.85f;
Colors[1][1] = 0.1f;
Colors[1][2] = 0.5f;
 
Vertex[2][0] = 0.9f;
Vertex[2][1] = 0.9f;
Colors[2][0] = 0.85f;
Colors[2][1] = 0.85f;
Colors[2][2] = 0.85f;
 
Vertex[3][0] = 0.9f;
Vertex[3][1] = -0.9f;
Colors[3][0] = 0.5f;
Colors[3][1] = 0.85f;
Colors[3][2] = 0.1f;
}
 
void Draw()
{
    glVertexPointer(2, GL_FLOAT, 0, Vertex);
    glColorPointer(3, GL_FLOAT, 0, Colors);
    
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    
    //glDrawArrays(GL_POLYGON, 0, 4);
    glDrawArrays(GL_POINTS, 0, 4);
 
    glDisableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);
    glutSwapBuffers();
}
 
void SetupGL() 
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    //glOrtho(0, imSiz , imSiz, 0, -1, 1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClearColor(0, 0, 0, 0);
    glPointSize(5.0); //<---
}
 
int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(imSiz, imSiz); 
    glutInitWindowPosition(500, 200);
    glutCreateWindow("Reaction Diffusion");
    SetupGL();
    FillArr();
    Draw();
    glutMainLoop();
    return 0;
}
Добавлено через 57 минут
С инт массивами вроде не пашет без отчета об ошибке( спасибо разработчикам), вроде там float это внутренний формат gl если это для скорости. Если даже будет инт в коде или еще как то он будет переводиться во флоат скрыто.
Вот наколдовал.

Бреинфаково выглядит это, не думаю что это правильно, как проще хз.
C++
1
2
float dx=1.8f/((float)pointsNumX-1.0f);
float dy=1.8f/((float)pointsNumY-1.0f);
И вот это не стиль opengl окрас по функциям
C++
1
2
3
            Colors[VertNum][0] = 0.5f+0.4f*sin(15.1f*x+1.6f);
            Colors[VertNum][1] = 0.5f+0.4f*sin(13.1f*x+0.4f);
            Colors[VertNum][2] = 0.5f+0.45f*sin(14.2f*x-1.5f);
Там есть вроде некая подпрограмма итератор 1D colortable как-то так называеться хз =).


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//Вывод точек массивами с окрасом из массива
#include <gl/glut.h>
//#include <iostream> 
//#include <iomanip>
#include <math.h>
//using namespace std;
 
const int imSiz=500; // размер картинки
const int pointsNumX=100; //точек по осям
const int pointsNumY=100;
 
 
const int pointsNum=pointsNumX*pointsNumY; // расчет длинны массива
GLfloat Vertex[pointsNum][2];
GLfloat Colors[pointsNum][3];
 
 
 
void FillArr()
{
int VertNum=0;
float dx=1.8f/((float)pointsNumX-1.0f);
float dy=1.8f/((float)pointsNumY-1.0f);
    for(float x=-0.9f;x<0.9f;x+=dx)
    {
        //cout<<setw(5)<<fixed<<setprecision(3)<<x<<"\n";
        for(float y=-0.9f;y<0.9f;y+=dy)
        {
            Vertex[VertNum][0] = x;
            Vertex[VertNum][1] = y;
            Colors[VertNum][0] = 0.5f+0.4f*sin(15.1f*x+1.6f);
            Colors[VertNum][1] = 0.5f+0.4f*sin(13.1f*x+0.4f);
            Colors[VertNum][2] = 0.5f+0.45f*sin(14.2f*x-1.5f);
            VertNum++;
        }
    }
 
}
 
void Draw()
{
    glVertexPointer(2, GL_FLOAT, 0, Vertex);
    glColorPointer(3, GL_FLOAT, 0, Colors);
    
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    
    //glDrawArrays(GL_POLYGON, 0, 4);
    glDrawArrays(GL_POINTS, 0, pointsNum);
 
    glDisableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);
    glutSwapBuffers();
}
 
void SetupGL() 
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    //glOrtho(0, imSiz , imSiz, 0, -1, 1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClearColor(0, 0, 0, 0);
    glPointSize(2.0); //<---
}
 
int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(imSiz, imSiz); 
    glutInitWindowPosition(500, 200);
    glutCreateWindow("Reaction Diffusion");
    SetupGL();
    FillArr();
    Draw();
    glutMainLoop();
    return 0;
}
Добавлено через 3 минуты
Вообще более правильно так
C++
1
2
3
4
5
6
7
float dx=2.0f/((float)pointsNumX-1.0f);
float dy=2.0f/((float)pointsNumY-1.0f);
    for(float x=-1.0f;x<1.0f;x+=dx)
    {
        //cout<<setw(5)<<fixed<<setprecision(3)<<x<<"\n";
        for(float y=-1.0f;y<1.0f;y+=dy)
        {
Просто рисуют обычно от -0.9 а не от -1.0

Добавлено через 6 минут
вот так тоже пашет
C++
1
2
3
4
//float dx=2.0f/((float)pointsNumX-1.0f);
//float dy=2.0f/((float)pointsNumY-1.0f);
float dx=2.0f/(pointsNumX-1);
float dy=2.0f/(pointsNumY-1);
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
26.12.2020, 16:24
Может кто знает как сделать раздельную компиляцию этого кода пост 32?
Раздельная компиляция
0
0 / 0 / 0
Регистрация: 29.11.2020
Сообщений: 14
27.12.2020, 09:22  [ТС]
Если упростить задачу. Берем два двумерных массива: в одном координаты X, в другом координаты Y. Как мне их склеить в одномерный массив вершин?
Я написал два вложенных цикла for. Но почему-то опять не работает ((

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 for (i = 0; i < 10; i++)
            {
 
                for (j = 0; j < 10; j++)
                {
                    vertices[j] = X[i][j];
 
                    vertices[j + 1] = Y[i][j];
 
 
                }
 
 
            }
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
27.12.2020, 13:12
wxthplvl65, Вам уже написали 3 варианта рисования + пару вообще готовых прог.
1)Пост 24. Мой мод бесконечная игра жизнь. Рисует glBegin(GL_POINTS);
2)Пост 30. Рисует glDrawPixels.
3)Пост 32. Рисует glDrawArrays.
10 000 точек с заданием цвета каждой.

А тут вчера раздолбал пример раздельная компиляция этой же проги, каждая функция в отдельном файле с парой десяток строк.
Раздельная компиляция
Это намного удобней листания простыни из 100500 строк и кучей функций которые отвлекают. Так делают уже настоящие программисты в больших проектах.

Что вам еще надо для экспериментов? Хз…

Берите работающий пример и изменяйте под себя.
0
 Аватар для snake32
3577 / 1707 / 236
Регистрация: 26.02.2009
Сообщений: 8,605
Записей в блоге: 6
27.12.2020, 14:23
Цитата Сообщение от wxthplvl65 Посмотреть сообщение
Я написал два вложенных цикла for. Но почему-то опять не работает ((
массиву vertices нужно удваивать индекс, а colors утраивать (так как 3 элемента RGB на вершину)
+ в одномерном массиве нужно учитывать строку - добавлять смещение целую строку из 10 эл-тов i*10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (i = 0; i < 10; i++)
{
    for (j = 0; j < 10; j++)
    {
        int offs= i*10 + j; // 2d -> 1d row offset
        
        vertices[ offs*2 ] = i;
        vertices[ offs*2 + 1] = j;
        
        colors[ offs*3 ] = 1.0; //red
        colors[ offs*3 + 1 ] = 0.0;  //green
        colors[ offs*3 + 2 ] = 0.0;  //blue
    }
}
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
27.12.2020, 20:13
Сравните бреинфак код
Цитата Сообщение от snake32 Посмотреть сообщение
int offs= i*10 + j; // 2d -> 1d row offset
vertices[ offs*2 ] = i;
vertices[ offs*2 + 1] = j;
colors[ offs*3 ] = 1.0; //red
colors[ offs*3 + 1 ] = 0.0; //green
colors[ offs*3 + 2 ] = 0.0; //blue
и
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Vertex[VertNum][0] = x;
Vertex[VertNum][1] = y;
Colors[VertNum][0] = 0.5f+0.4f*sin(15.1f*x+1.6f);
Colors[VertNum][1] = 0.5f+0.4f*sin(13.1f*x+0.4f);
Colors[VertNum][2] = 0.5f+0.45f*sin(14.2f*x-1.5f);
VertNum++;
Там наверно нужно указатель на массив прибавлять а не переменную.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.12.2020, 20:13
Помогаю со студенческими работами здесь

Из множества целых чисел 1.10 выделить множество чисел, на которые делится без остатка число 7. Вывести это множество на экран
Из множества целых чисел 1..10 выделить множество чисел, на которые делится без остатка число 7. Вывести это множество на экран. Найдите...

Сформировать множество точек по заданному правилу и вывести координату последней точки
На оси абцисс берём точку A с координатой 1. Зеркально отражаем её относительно начала оси абсцисс и получаем точку B. Зеркально отражаем...

Вывести на экран монитора преобразованное множество, запись или строку, а также вывести результаты вычислений
Помогите пожалуйста:help: 1. Ввести множество, запись или строку с помощью клавиатуры. 2. Вывести на экран монитора исходную запись,...

Вывести множество на экран
Есть 2 множества: Set1:=; Set2:=; Нужно вывести эти 2 множества. Я попытался сделать это так: //выводим первое...

На плоскости заданы множество точек А и множество прямых В (каждая прямая задается значениями коэффициентов ур
На плоскости заданы множество точек А и множество прямых В (каждая прямая задается значениями коэффициентов уравнения). Найти две такие...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
Диалоги с ИИ
zorxor 23.05.2026
Насколько я понимаю - Вы - Искусственный Интеллект. Это так? Да, всё верно. Я — искусственный интеллект. Я представляю собой большую языковую модель, созданную для помощи в самых разных задачах. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru