Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
17 / 17 / 6
Регистрация: 10.12.2013
Сообщений: 740
1

Масштабирование

29.03.2014, 08:50. Просмотров 969. Ответов 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
#include <iostream>
#include <Windows.h>
#include <glut.h>
using namespace std;
 
const int width = 800;
const int height = 600;
GLdouble a,b,c,d;
void Init()
{
    glClearColor(1.0,1.0,1.0,0.0);
    glColor3f(0.0f, 0.0f, 0.0f);
    glPointSize(1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0,(GLdouble)width,0.0,(GLdouble)height);
    a=width/5.0;
    b=0.0;
    c=height/2.0;
    d=c;
}
void Pixel()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_POINTS);
    for(GLdouble x=-5;x<=5.0;x+=0.003){
        GLdouble y = x;
        glVertex2d(a*x+b,c*y+d);
    }
    glEnd();
    glFlush();
}
void main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowSize(800,600);
    glutCreateWindow("График функции");
    glutDisplayFunc(Pixel);
    Init();
    glutMainLoop();
}
Я не могу понять, как правильно масштабировать, чтоб график был в центре окна. Подскажите, пожалуйста. Или хотя бы где можно почитать про масштабирование?
И еще. Я хотел бы добавить координатную плоскость в программу. Вот мой код самой примитивной плоскости.
C++
1
2
3
4
5
6
7
glBegin(GL_LINES);
    glVertex2i(400,600);
    glVertex2i(400,0);
    glVertex2i(0,300);
    glVertex2i(800,300);
    glEnd();
    glFlush();
Но я не понимаю, куда надо вставить этот код, чтобы программа нарисовала все вместе - и координатную плоскость,и сам график. Я понимаю, что нужно создать отдельную функцию, но как ее потом вызвать, если в
C++
1
glutDisplayFunc()
уже есть функция? Заранее спасибо за ответ.

Добавлено через 38 минут
Все, с координатной плоскостью разобрался. Исправил вот так.
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
#include <iostream>
#include <Windows.h>
#include <glut.h>
using namespace std;
 
const int width = 800;
const int height = 600;
GLdouble a,b,c,d;
void Init()
{
    glClearColor(1.0,1.0,1.0,0.0);
    glColor3f(0.0f, 0.0f, 0.0f);
    glPointSize(1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0,(GLdouble)width,0.0,(GLdouble)height);
    a=width/4.0;
    b=0.0;
    c=height/2.0;
    d=c;
}
void drawing()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_LINES);
    glVertex2i(400,600);
    glVertex2i(400,0);
    glVertex2i(0,300);
    glVertex2i(800,300);
    glEnd();
    glBegin(GL_POINTS);
    for(GLdouble x=-5;x<=5.0;x+=0.003){
        GLdouble y = x;
        glVertex2d(a*x+b,c*y-d);
    }
    glEnd();
    glFlush();
}
void main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowSize(800,600);
    glutCreateWindow("График функции");
    glutDisplayFunc(drawing);
    Init();
    glutMainLoop();
}
Получилось вроде то, что нужно. Но с масштабированием все равно не могу разобраться. Подскажите, где можно про него почитать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2014, 08:50
Ответы с готовыми решениями:

Масштабирование в OpenGL
Здравствуйте. Подскажите пожалуйста, как увеличить масштаб? gluOrtho2D(0, 35, 0, 35); ...

OpenGL - масштабирование
Добрый день! Недавно стал разбираться ГЛ, т.к. потребовалось научиться строить поверхности в своей...

Масштабирование области видимости
glm::mat4 g_projMatrix = glm::ortho( x1, x2, y1, y2, z1, z2); А вот...

Масштабирование графика с объектами
Не могу понять как сделать масштабирование графика с объектами, чтобы он отдалялся и приближался. Я...

2
0 / 0 / 0
Регистрация: 30.03.2014
Сообщений: 11
30.03.2014, 14:48 2
Ты можешь объявить координатную систему так, чтобы центр ее был в [0, 0] с помощью glOrtho. Можешь подравнять все с помощью высокоуровневых функций для настройки матриц glScale*(масштабирование), glTranslate*(перемещение), glRotate*(поворот). Все дело вкуса...
0
17 / 17 / 6
Регистрация: 10.12.2013
Сообщений: 740
30.03.2014, 22:09  [ТС] 3
дело в том, что я только начал изучать OpenGL. нашел книгу Ф.Хилла "Программирование компьютерной графики". Там приводятся формулы для масштабирования:
https://www.cyberforum.ru/cgi-bin/latex.cgi?sx = Ax + B
https://www.cyberforum.ru/cgi-bin/latex.cgi?sy = Cy + D
Но как я ни экспериментирую с константами А и С, график находится где-то слева.
Если, допустим, я поменяю формулу на
https://www.cyberforum.ru/cgi-bin/latex.cgi?y=x*x
то параболы вообще не видно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.03.2014, 22:09

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Масштабирование фрактала c++/openGL
Есть код вывода фрактала на форме. Подскажите как можно реализовать масштабирование фрактала?...

Масштабирование окна. Как запретить?
Как запретить масштабирование окна, создаваемого средствами opengl? glutInitWindowSize (screenW,...

Стрелка для вектора, масштабирование
Привет. необходимо сделать следующее : рисуется ломанная в 3д (с перемещением и масштабированием) ...

Масштабирование моделей
Здравствуйте! Подскажите, пожалуйста, какой функцией масштабировать модель?

Масштабирование панели.
Ребят моделирую в блендере уже давно, но сейчас во время работы блендер подзавис и случайным...

Масштабирование физических величин
Здравствуйте! Помогите, пожалуйста, разобраться: как правильно масштабировать физические...


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

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

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