Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
yur@
7 / 7 / 3
Регистрация: 06.03.2014
Сообщений: 106
1

Сделать функцию универсальной

12.12.2015, 19:21. Просмотров 230. Ответов 5

Добрый вечер, форумчане. Работаю с набором фигур выгруженных из файла. Каждую фигуру надо отрисовать в окне OpenGL. При этом заранее неизвестно какая фигура будет выгружена из файла и ее размеры. То есть, как можно реализовать функцию которая будет подбирать нужные значения для размеров фигур чтобы они корректно отрисовывались. А то у меня пока 5 фигур и я жестко сделал функции отрисовки именно под них. Но фигуры могут добавляться и соответственно их надо отрисовать...
пока имею следующее(жесткое задание размеров для типов фигур):
вызов методов:
C++
1
2
3
4
for (std::size_t i = 0; i<figures.size(); ++i)
    {
        figures[i]->draw(coeff);
    }
метод отрисовки квадрата:
C++
1
2
3
4
5
6
7
8
void Square::draw(double coeff){
    glBegin(GL_POLYGON);
    glVertex2f(topLeft_.x()*coeff - 0.9, topLeft_.y()*coeff + 0.6);
    glVertex2f((topLeft_.x() + width_)*coeff - 0.9, topLeft_.y()*coeff + 0.6);
    glVertex2f((topLeft_.x() + width_)*coeff - 0.9, (topLeft_.y() - width_)*coeff + 0.6);
    glVertex2f(topLeft_.x()*coeff - 0.9, (topLeft_.y() - width_)*coeff + 0.6);
    glEnd();
}
метод отрисовки круга:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void Cirсle::draw(double coeff){
    glBegin(GL_POLYGON);
    int segCount = 90;
    for (int i = 0; i < segCount; i++)
    {
        float theta = (2 * 3.1415926f) * (float(i) / float(segCount));
        float X = 2*radius_*0.004 * cosf(theta);
        float Y = 2 * radius_*0.004 * sinf(theta);
        glVertex2f(X-0.6, Y-0.3);
    }
    glEnd();
}
Все методы приводить не буду так как это не имеет смысла. Результат выполнения показан на скрине.
Сделать функцию универсальной
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2015, 19:21
Ответы с готовыми решениями:

Написать шаблонную функцию для универсальной отрисовки данных, содержащихся в объектах, засунутых в вектор
Существует базовый класс и два класса наследника от него. Хочу сделать функцию...

Сделать функцию ввода элементов, функцию вывода элементов, и функцию обработки
Добрый день форумчане, помогите сделать функцию ввода элементов, функцию вывода...

Сделать задачу через функцию (добавить функцию)
#pragma hdrstop #pragma argsused #include &lt;tchar.h&gt; #include &lt;iostream.h&gt;...

подпрограмма для универсальной сортировки
извините за то, что опять прошу помощи. нужно разработать алгоритм и описать...

Использование универсальной инициализации для объектов своего класса
Здравствуйте! Все мы знаем, что поля структуры мы можем красиво...

5
yur@
7 / 7 / 3
Регистрация: 06.03.2014
Сообщений: 106
13.12.2015, 00:24  [ТС] 2
Подскажите, пожалуйста

Добавлено через 2 часа 51 минуту
Up!

Добавлено через 1 час 32 минуты
Up!
0
rikimaru2013
C++ Game Dev
2473 / 1141 / 349
Регистрация: 30.11.2013
Сообщений: 3,709
13.12.2015, 00:29 3
Ладно, давайте я вам помогу. Только перепишите вопрос нормально: "Есть ряд строк(неважно откуда) по шаблону:
Circle ( Size: 10, Color: Red)" и надо отрисовать круг размером 10? Нивижу проблем? Проблема в том, что в коде отрисовки вынезнаете как задать координаты учитывая размер? Так это проблема реализации - мы то тут причем)
0
nonedark2008
1119 / 829 / 247
Регистрация: 28.07.2012
Сообщений: 2,322
13.12.2015, 00:58 4
Цитата Сообщение от yur@ Посмотреть сообщение
жесткое задание размеров для типов фигур
Обычно загружаемая фигура имеет жестко заданный размер, тут ты не прогадал.
Но... фигура обычно рисуется в начале координат.
Далее, чтобы отрисовать нужную фигуру в нужном месте и с нужным размером,
используют матрицы преобразования, в случае OpenGl применяются функции glTranslatef и glScalef.
2
yur@
7 / 7 / 3
Регистрация: 06.03.2014
Сообщений: 106
13.12.2015, 04:51  [ТС] 5
nonedark2008, спасибо за ответ. С этим я разобрался. но появился еще один вопрос. по предыдущему вопросу я придумал решение рисовать все введенные фигуры в строчку на окне openGL, а потом с помощью обработки клавиатуры пройтись по списку всех фигур. Но у меня почему то функция обработки в обоих случаях идет в -х. Сама функция вот
C++
1
2
3
4
5
6
7
8
9
10
void GLKeyDown(int key, int x, int y)
{
    if (key == GLUT_KEY_LEFT){
        glTranslated(x*0.0015 - 0.01, 0, 0);
    }
    if (key == GLUT_KEY_RIGHT){
        glTranslated(x*0.0015+0.01, 0, 0);
    }
    glutPostRedisplay(); 
}
может неправильное условие задаю в glTranslated?
0
nonedark2008
1119 / 829 / 247
Регистрация: 28.07.2012
Сообщений: 2,322
13.12.2015, 11:06 6
yur@, glTranslated да и все другие умножают текущую матрицу на соответствующую матрицу преобразования, т.е. ,например, перемещение через glTranslated добавляется ко всем предыдущим, если матрицу дополнительно не сбрасывать каждый кадр через glLoadIdentity.
C++
1
2
3
4
5
6
if (key == GLUT_KEY_LEFT){
    glTranslated(-0.01, 0, 0);
}
if (key == GLUT_KEY_RIGHT){
    glTranslated(+0.01, 0, 0);
}
Лучше читай документацию для любой используемой функции, я не хочу это делать за тебя.
И да, думай о своем рисунке с точки зрения трехмерной графики, а не двумерной.
Также советую нарисовать координатные оси x,y,z разных цветов, чтобы лучше понимать что куда сдвигается.
1
13.12.2015, 11:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2015, 11:06

Дан массив из прототипов функций или указателей на функцию, сделать функцию, возвращающую этот массив
Не охота создавать лишнею тему извиняюсь заранее Вопрос такой Можете...

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив)
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось...

Сделать функцию
Добрый вечер, уважаемые программисты. Есть небольшая просьба - переделать...


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

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

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