Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > GL_POINTS в OPEN GL


Автор: Piff 7.9.2012, 04:31
Помогите пожалуйста решить вопрос с написанием программы для университета. Нужно в OpenGL на С++ написать моё имя при помощи функции GL_POINTS. Я так понимаю, что даная функция выводит только лишь точки, координаты которых я сам и задаю. Но вот как сделать имя? Помогите написать только имя, остальное я сам допишу.

 Так же, подскажите, как нарисовать простые фигуры, такие как: круг, звезда, треугольник и трапеция.

 Спасибо большое за помощь. Я уже написал основу для программы:

Код

# include<gl\glut.h>

void Draw()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0, 0.0, 0.0);
    glBegin(GL_POINTS);
        glVertex2f(0.0, 0.0);
    glEnd();
    glFlush();
}
void Initialize()
{
    glClearColor(0.8, 1.0, 0.6, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-200.0, 200.0, -200.0, 200.0, -5.0, -5.0);
}

int main (int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowSize(400,400);
    glutInitWindowPosition(100, 200);
    glutCreateWindow("Lab # 01");
    glutDisplayFunc(Draw);
    Initialize();
    glutMainLoop();
    return 0;
}



Автор: LeonidPr 7.9.2012, 07:45
Код

glBegin(GL_POINTS);
  glVertex3f(x1,y1,z1);
  glVertex3f(x2,y2,z2);
  ...
glEnd();


ну и так далее, набирая из точек все что угодно. Хотя лучше наверное будет линиями это сделать. Точки разрозненно будут выглядеть.
Умея рисовать точки, вы можете набрать ими все что вам угодно. Просто подставляйте нужные координаты.
А фигуры то же рисуются по координатам углов.

Код

glBegin(GL_LINES);

  glVertex3f(-10,-10,0);
  glVertex3f(0,10,0);

  glVertex3f(0,10,0);
  glVertex3f(10,-10,0);

  glVertex3f(10,-10,0);
  glVertex3f(-10,-10,0);

glEnd();

Это треугольник. дальше думаю сами сделаете.
Вспомните как в школе на Бейсике рисовали, тут почти что так же, можете взять листочек с карандашом и сначала расставить координаты точек для нужной вам фигуры, а потом запихать их в glVertex.

Добавлено через 7 минут и 1 секунду
P.S.Давно в OpenGL ничего не делал. пример с треугольником компактнее будет сделать через GL_LINE_STRIP.

Автор: Piff 7.9.2012, 09:12
Так это было бы легко, нам нужно только точки использовать и сделать прямую из точек пр помощи алгоритма Брезенхэма. Я не знаю как его реализовать в OpenGL. Хотя я пытался через цикл выкрутиться, программа вообще не показывает точки :(

Автор: LeonidPr 7.9.2012, 09:53
Так, вопрос: вам в задании сказано OpenGL использовать, или это вы сами решили? Просто имхо, это извращение - реализовывать алгоритм Брезенхэма в OpenGL. Просто в окошке с использованием GDI я еще понимаю.
А вообще какая разница, как рисовать точку. Сделайте функцию DrawPoint(float x, float y). И при реализации алгоритма рисования линии когда нужно поставить пиксел, вызывайте эту функцию с нужными координатами.

Автор: Piff 7.9.2012, 18:37
В задании сказано. Я учусь в университете в США. Вот так нас тут гоняют smile))
Я пытался через for выкрутится, не работает :(
for (int i=-0.85; i=0.85; i+=0.01)
glVertex2f(i, 0);
glVertex2f(0, i);

Но он почему-то не рисует. Почему делаю 0.01, так как у меня окно 1000 на 1000, но точка с координатой 1, 1 вылезает за окно. Работаю с тысячными, не знаю поему.

Помогите пожалуйста реализовать этот алгоритм.

Вот он есть на С++, но как переделать его???

Код

void drawLine(int x1, int y1, int x2, int y2) {
    const int deltaX = abs(x2 - x1);
    const int deltaY = abs(y2 - y1);
    const int signX = x1 < x2 ? 1 : -1;
    const int signY = y1 < y2 ? 1 : -1;
    //
    int error = deltaX - deltaY;
    //
    setPixel(x2, y2);
    while(x1 != x2 || y1 != y2) {
        setPixel(x1, y1);
        const int error2 = error * 2;
        //
        if(error2 > -deltaY) {
            error -= deltaY;
            x1 += signX;
        }
        if(error2 < deltaX) {
            error += deltaX;
            y1 += signY;
        }
    }
 
}

Автор: tzirechnoy 7.9.2012, 18:44
Цитата
for (int i=-0.85; i=0.85; i+=0.01)


int i =-0.85 -- это очень херовая идея.

Автор: Alexeis 7.9.2012, 20:35
Не знаю можно ли вам так делать, но я бы отренедерил текст на битмапе средствами GDI, затем прошелся по массиву пикселей битмапа и там где цвет пикселя отличается от белого поставил бы соответствующую точку.

Автор: Piff 8.9.2012, 01:33
Так кто-нибудь может помочь переписать алгоритм с С++ на OpenGL?

Автор: Amp 8.9.2012, 11:58
Так а в чем проблема я так и не понял? Устанавливаешь ортографическую проекцию в координатах окна (left = 0, right = width, bottom = 0, top = height) и рисуешь точки в этих координатах, словно у тебя GDI какой-нибудь.

Автор: LeonidPr 8.9.2012, 16:45
Я же написал про функцию DrawPoint(float x, float y). В вашем коде её роль выполняет SetPixel.
Код

void SetPixel(int x, int y) {
  glVertex3f(x,y,0);
}


Попробуйте!

Автор: Piff 8.9.2012, 22:58
Я в СИ почти не разбираюсь. Вы не могли бы с кодом подсказать, пожалуйста?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)