私はOpenGLを初めて使用しており、DDAアルゴリズムを学習しています。基本的には、多くの点を塗りつぶすために、またラインにさえも塗りつぶすには、glVertex2i(x, y)
を使用するだけです。OpenGLでDDAを使用して線を動的に描画
今、私は動的効果を達成したいと思います。だから毎回ポイントをペイントした後にsleep(0.5)
ステートメントを追加すると0.5秒遅れるが、結果は良くない。結果はしばらく空白になり、突然全体の行から出てきます。
void delay(unsigned int mseconds)
{
clock_t goal = mseconds + clock();
while (goal > clock());
}
結果は同じであるが、キャンバスが最初でしばらく空白になります。
は、私はまた、以下の方法を試してみてください。
他の方法はありますか?ここで
は私のコードです:
#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;
}
そして、ここでは、私はそれを実行する方法である:
[email protected]:~/Workspace/Languages/openGL$ g++ dda.cpp -lglut -lGLU -lGL -lm
[email protected]:~/Workspace/Languages/openGL$ ./a.out
input the start and end(range is 0-500, 0-500):0 0 200 300
マイグラム++バージョンは次のとおりです。gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.2)
フレームを表示するには、いくつかのswap-buffers関数を呼び出す必要がありますか? – immibis
@immibis DDA関数の前に 'glutSwapBuffers()'呼び出しを追加しますが、結果は同じです。 –