Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
vjik24
0 / 0 / 0
Регистрация: 12.12.2013
Сообщений: 10
#1

Разобрать код рисования - C++

09.05.2015, 16:21. Просмотров 288. Ответов 2
Метки нет (Все метки)

Помогите разобрать код до функции рисования,дальше вроде все понятно

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
231
232
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <GL/glut.h>
 
int width;
int height;
 
float rotation = 0.0;
 
float ambient[] = {0.5,0.5,0.5,1.0};
 
double field[8][8] = {{15,20,48,35},{13,24,38,17},{17,35,40,25},{24,30,40,20}};
int steps_x = 30;
int steps_y = 30;
 
double interpolateCubic(double* field, double x) {
    x -= 1.5;
 
    double f_1 = 6.0 * (field[0] - 2.0 * field[1] + field[2]);
    double f_2 = 6.0 * (field[1] - 2.0 * field[2] + field[3]);
 
    double m_1 = (4.0 * f_1 - f_2) / 15.0;
    double m_2 = f_1 - 4.0 * m_1;
 
    double m[] = {0.0, m_1, m_2, 0.0};
 
    int i;
    double o;
 
    if (x <= -0.5) {
        // phi 1
        i = 0;
        o = -1.5;
    }
    else if (x <= 0.5) {
        // phi 2
        i = 1;
        o = -0.5;
    }
    else {
        // phi 3
        i = 2;
        o = 0.5;
    }
 
    double a = (m[i + 1] - m[i]) / 6.0;
    double b = m[i] / 2.0;
    double c = (field[i + 1] - field[i]) - (m[i + 1] + 2.0 * m[i]) / 6.0;
    double d = field[i];
 
    double p = (x - o);
 
    return a * p * p * p + b * p * p + c * p + d;
}
 
/*double interpolateLinear(double* field, double x) {
    x -= 1.5;
 
    int i;
    double o;
 
    if (x <= -0.5) {
        i = 0;
        o = -1.5;
    }
    else if (x <= 0.5) {
        i = 1;
        o = -0.5;
    }
    else {
        i = 2;
        o = 0.5;
    }
 
    return field[i] + (field[i + 1] - field[i]) * (x - o);
}*/
 
double interpolate2D(double x, double y, double (*interpol)(double*, double)) {
    double field_y[] = {interpol(field[0], y),interpol(field[1], y),interpol(field[2], y),interpol(field[3], y)};
    return interpol(field_y, x);
}
 
void reshape(int w, int h) {
    width = w;
    height = h;
}
 
void draw(double x, double y, double z, double (*interpol)(double*, double))
{
    glPushMatrix();
    glTranslated(x,y,z);
    glRotatef(rotation, 0.0,0.5, 0.0);
        // Рисуем точки
    glColor3f(1.0, 0.0, 0.0);
    for (int x = 0; x < 4; x++) {
        for (int y = 0; y < 4; y++) {
            glPushMatrix();
            glTranslated((double) x - 1.5, field[x][y] / 48, (double) y - 1.5);
            glutSolidSphere(0.08, 10, 10);
            glPopMatrix();
        }
    }
    // Рисуем сетку
    
            glColor3f(0.5, 0.5, 0.5);
    glBegin(GL_LINES);
 
    for (int x = 0; x <4; x++)
    { 
        glVertex3d((double) x - 1.5, -1.5, -1.5);
        glVertex3d((double) x - 1.5, -1.5, 1.5);
        
        for (int y = 0; y <4; y++)
        {
            glVertex3d(-1.5, -1.5, (double) y - 1.5);
        glVertex3d(1.5, -1.5, (double) y - 1.5);
            
            glVertex3d((double) x - 1.5, 1.5, (double) y - 1.5);
            glVertex3d((double) x - 1.5, -2, (double) y - 1.5);
        }}
 
    glEnd();
 
    
 
    glColor3f(0.0, 1.0, 0.0);
    for (int x = 0; x < 4; x++) {
        for (int j = 0; j < steps_y; j++) {
            double y = (double) j / (double) (steps_y - 1) * 3.0;
 
            glPushMatrix();
            glTranslated((double) x - 1.5, interpol(field[x], y) / 48, y - 1.5);
            glutSolidSphere(0.04, 5, 5);
            glPopMatrix();
        }
    }
 
    glColor3f(0.0, 1.0, 0.0);
    for (int i = 0; i < steps_x; i++) {
        for (int y = 0; y < 4; y++) {
            double x = (double) i / (double) (steps_x - 1) * 3.0;
            double temp[] = {field[0][y], field[1][y], field[2][y], field[3][y]};
 
            glPushMatrix();
            glTranslated(x - 1.5, interpol(temp, x) / 48, (double) y - 1.5);
            glutSolidSphere(0.04, 5, 5);
            glPopMatrix();
        }
    }
 
    glColor3f(0.0, 0.0, 1.0);
    for (int i = 0; i < steps_x; i++) {
        for (int j = 0; j < steps_y; j++) {
            double x = (double) i / (double) (steps_x - 1) * 3.0;
            double y = (double) j / (double) (steps_y - 1) * 3.0;
 
            glPushMatrix();
            glTranslated(x - 1.5, interpolate2D(x, y, interpol) / 48, y - 1.5);
            glutSolidSphere(0.03, 4, 4);
            glPopMatrix();
        }
    }
    glPopMatrix();
    
}
 
 
 
 
void display() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
    glViewport(0, 0, width, height);
 
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60, (double) width / (double) height, 1.0, 100.0);
 
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0, 3, 6, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    
    rotation += 0.5;
 
    // Меняем в случайном порядке точки
    for (int x = 0; x <4; x++)
    {
        for (int y = 0; y < 4; y++)
        {
            if (!(rand() % 1000))
            {
                field[x][y] += ((rand() % 3) - 1) * (rand() % 20);
            }
        }
    }
 
    // Рисуем сцены
    //draw(-2.5,0,0,interpolateLinear);
    draw(2.5,0,0,interpolateCubic);
 
    glutSwapBuffers();
}
 
int main(int argc, char** argv) {
    srand(time(NULL));
 
    glutInit(&argc, argv);
    glutInitWindowSize(600, 400);
    glutInitWindowPosition(100, 100);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
 
    int window = glutCreateWindow("3D Интерполяция");
 
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_COLOR_MATERIAL);
    
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
    glShadeModel(GL_SMOOTH);
    
    glClearColor(0.0, 0.0, 0.0, 0.0);
 
    glutReshapeFunc(reshape);
    glutDisplayFunc(display);
    glutIdleFunc(display);
    
    glutMainLoop();
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2015, 16:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разобрать код рисования (C++):

Ищу код рисования цилиндров - C++ Builder
код рисования цилиндров С++ Builder

код для рисования картинки - C++ Builder
Вопрос вот в чем, есть у меня есть код для рисования картинки Canvas-&gt;MoveTo(10, 10); Canvas-&gt;LineTo(50, 10); Canvas-&gt;MoveTo(60, 10);...

Разобрать приведенный код - C++ Builder
//--------------------------------------------------------------------------- #include &lt;vcl.h&gt; #pragma hdrstop #include...

Разобрать код проверки на ошибку - C++ Builder
Помогите разобрать код. Напиште какой метод тестирования здесь находиться, и где он в самом коде. sl-&gt;LoadFromFile(&quot;error.txt&quot;); ...

библиотеки рисования - C++ Builder
В программировании и сабже опыта мало. Сижу, делаю различные программки в билдере в VCL. Тут появилась задачи нарисовать различные объекты...

Компоненты рисования - C++ Builder
Всем привет! Давайте обсудим тему написания программы простенького построения блок-схем или чего подобного по установленным параметрам......

2
vjik24
0 / 0 / 0
Регистрация: 12.12.2013
Сообщений: 10
09.05.2015, 16:31  [ТС] #2
вот исходник
0
Вложения
Тип файла: 7z rrr.7z (7.42 Мб, 0 просмотров)
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,532
Завершенные тесты: 1
13.05.2015, 11:56 #3
Цитата Сообщение от vjik24 Посмотреть сообщение
код до функции рисования
Интерполяция матрицы.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2015, 11:56
Привет! Вот еще темы с ответами:

Прекращение рисования - C++ Builder
Проблема вот в чем!!! Работаю в С++ Builder 2007 рисую картинку таким методом Canvas-&gt;MoveTo(x, y); Canvas-&gt;LineTo(x1, y2); и так...

Остановка рисования в Image - C++ Builder
Добрый день! Не могу придумать как останавливать рисование: При движении мыши на Image рисуется кривая + создается массив с координатами...

Xe10 рисования текста - C++ Builder
Ребята подскажите как в Xe10 воспользоваться функцией drawtext, TextOutA как я полагаю не реализованна... Цель нарисовать на картинке...

Программа рисования полигонов - C++ Builder
Здравствуйте! Набросал такую програмку рисования полигона.(в архиве) И вроде все хорошо , решил проверить на “чистом” компьютере. ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru