首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在openGL下使用DDA动态绘制直线

在openGL下使用DDA动态绘制直线
EN

Stack Overflow用户
提问于 2016-09-29 02:30:57
回答 1查看 765关注 0票数 0

我是openGL的新手,我正在学习DDA算法。基本上,它只是使用glVertex2i(x, y)来画很多点,甚至画成一条线。

现在我想要达到动态效果。因此,我添加了一个sleep(0.5)语句,在每次绘制一个点之后延迟0.5秒,但是结果并不好。结果只是一段时间的空白,突然从整条线上出来了。

我还尝试了以下方法:

代码语言:javascript
复制
void delay(unsigned int mseconds)
{
    clock_t goal = mseconds + clock();
    while (goal > clock());
}

结果是一样的,画布一开始是空白的。

那么还有什么别的办法来拖延吗?

这是我的代码:

代码语言:javascript
复制
#include <GL/glut.h>
#include <iostream>
#include <math.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include<time.h>

using namespace std;

void delay(unsigned int mseconds)
{
    clock_t goal = mseconds + clock();
    while (goal > clock());
}

float xs = 0.0;
float ys = 0.0;
float xe = 0.0;
float ye = 0.0;

void LineDDA(int x0, int y0, int x1, int y1)
{
    float x = 0.0;
    float y = 0.0;
    float m = 0.0;
    float dx = x1 - x0;
    float dy = y1 - y0;
    if (dx != 0)
    {
        m = dy/dx;
        if (m <= 1 && m >= -1)
        {
            y = y0;
            for (x = x0; x <= x1; x++)
            {
                glVertex2i(x, int(y+0.5));
                delay(2000);
                y += m;
            }
        }
        if (m>1 || m<-1)
        {
            m = 1/m;
            x = x0;
            for (y=y0; y<=y1; y++)
            {
                glVertex2i(int(x+0.5), y);
                delay(2000);
                x += m;
            }
        }
    }
    else
    {
        int x = x0;
        int y = 0;
        y = (y0 <= y1) ? y0 : y1;
        int d = fabs((double) (y0 - y1));
        while (d >= 0)
        {
            glVertex2i(x, y);
            delay(2000);
            y++;
            d--;
        }
    }
}

void lineSegment()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0, 0.0, 0.0);
    glBegin(GL_POINTS);

    // Make sure changes appear onscreen
    glutSwapBuffers();

    LineDDA(xs, ys, xe, ye);
    glEnd();
    glFlush();
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);
    cout << "input the start and end(range is 0-500, 0-500):";
    cin >> xs >> ys >> xe >> ye;
    glutInitWindowPosition(50, 100);
    glutInitWindowSize(500, 500);
    glutCreateWindow("DDA Algothrim");
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0.0, 500, 0.0, 500.0);


    glutDisplayFunc(lineSegment);

    glutMainLoop();

    return 0;
}

下面是我的操作方式:

代码语言:javascript
复制
lzc@lzc-ubuntu:~/Workspace/Languages/openGL$ g++ dda.cpp -lglut -lGLU -lGL -lm
lzc@lzc-ubuntu:~/Workspace/Languages/openGL$ ./a.out 
input the start and end(range is 0-500, 0-500):0 0 200 300

我的g++版本是:gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.2)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-29 05:47:33

我想你的意图是把这条线画成动画。要做到这一点,您应该使用计时器。使用过剩,我们有两种方法将计时器集成到显示代码中。

  1. glutIdleFunc 这是直截了当的:只需将显示函数作为其参数,在您的例子中,就是lineSegment。 这种方法的局限性在于我们不能控制计时器的滴答频率。如果我们确实想设置我们自己的滴答频率,我们需要使用第二种方法。
  2. glutTimerFunc 它作为输入,触发每个回调的频率(以毫秒为单位)以及回调函数指针。 在这两种方法中,您都需要修改显示函数以增加每个滴答的值;在您的情况下,需要绘制点的索引。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39760434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档