Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 鼠标拖动的连续线_Opengl_Window_Mouseevent_Glut - Fatal编程技术网

Opengl 鼠标拖动的连续线

Opengl 鼠标拖动的连续线,opengl,window,mouseevent,glut,Opengl,Window,Mouseevent,Glut,我正在制作一个基本的OpenGl程序,这是我的周末项目。 说明:如果我在窗口屏幕上拖动鼠标,松开按钮(左)后,会出现一条线,显示拖动鼠标的路径,一个圆圈会从头到尾穿过该线。 我的代码工作得很好,但问题是画的线不是连续的(而是虚线),这可能是因为OS屏幕到OpenGL屏幕的映射。 那么,如果我做错了什么,有没有办法创建一个连续的行路径或纠正我的错误呢这是我的代码: #include <iostream> #include <glut.h> #include <stri

我正在制作一个基本的OpenGl程序,这是我的周末项目。
说明:如果我在窗口屏幕上拖动鼠标,松开按钮(左)后,会出现一条线,显示拖动鼠标的路径,一个圆圈会从头到尾穿过该线。
我的代码工作得很好,但问题是画的线不是连续的(而是虚线),这可能是因为OS屏幕到OpenGL屏幕的映射。 那么,如果我做错了什么,有没有办法创建一个连续的行路径或纠正我的错误呢
这是我的代码:

#include <iostream>
#include <glut.h>
#include <string.h>
#define WIDTH 600
#define HEIGHT 600

using namespace std;

double arr[5000][4];
int z=0;
int flag=0;
float radius=0.03;
int ptr=0;
int faltu_bit=1;
float color[3][3]={{1.0,1.0,1.0},{1.0,1.0,0.0},{0.0,1.0,0.0}};

void drawText(char *str,float x,float y,int id) 
{
    int i;
    int len=strlen(str);
    //glLoadIdentity();
    glColor3f(color[id][0],color[id][1],color[id][2]);
    glRasterPos2f(x,y);
    for(i=0;i<len;i++)
        glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,str[i]);
}


void init()
{
    glClearColor( 0.0, 0.0, 0.0, 1.0);
    glMatrixMode( GL_PROJECTION);
    gluOrtho2D(0.0,WIDTH,0.0,HEIGHT);
    memset(arr,0,5000);
    glPointSize(20.0);
}

void resetAll()
{ 
    memset(arr,0,5000);
    z=0;
} 

///OPENGL MAPPING///
float getOpenGLX(int x)
{
    double ox = x/ (double)WIDTH*(WIDTH);
    return ox;
}

float getOpenGLY(int y)
{
    double oy = (1 - y/ (double) HEIGHT)*HEIGHT;
    return oy;
}

void drawPoints()
{ 
    glBegin( GL_POINTS );
    glColor3f( 0.0,1.0,0.0 );
    for ( int i = 0; i < z; i++ )
    {
        glVertex2f( arr[i][0],arr[i][1]);
    }
    glEnd();
}

void drawBall(float x,float y)
{
    glBegin( GL_POINTS);
    glColor3f( 1.0,1.0,0.0 );
    glVertex2f(x,y);
    glEnd();
}

void drawLines()
{
    glBegin(GL_LINES);
    glColor3f(1.0,0.0,0.0);
    for(int i=0;i<z;i++)
    {
        glVertex2f(arr[i][0],arr[i][1]);
    }
    glEnd();
}



void addValue(int x,int y)
{
    arr[z][0]=getOpenGLX(x);
    arr[z++][1]=getOpenGLY(y);
} 

void trackBall()
{
    drawPoints();
}


void myDisplay()
{
    glClear( GL_COLOR_BUFFER_BIT);
    if(!flag)
    {
        drawLines();
        if(!faltu_bit)
        drawBall(arr[ptr][0],arr[ptr][1]);
    }
    if(faltu_bit)
    {
        drawText("Project by: Adil Ansar [10 CSS-32]",50.0,500.0,0);
        drawText("Welcome",250.0,300.0,1);
        drawText("Drag the Mouse Any Where in the Window to see the Path",10.0,200.0,2);
    }
    glutSwapBuffers();
    glutPostRedisplay();
    glFlush();
}


void myMouseStat(int button,int state,int x, int y)
{
    if(button==GLUT_LEFT_BUTTON && state==GLUT_DOWN)
    {
        if(!flag)
        {
            if(faltu_bit)
            {
                faltu_bit=0;
            }
            resetAll();
            flag=1;
        }
    }
    else if(button==GLUT_LEFT_BUTTON && state==GLUT_UP)
    {
        if(flag)
        { 
            ptr=0;
            flag=0;
        }
    }
}


void myPressedMove(int x,int y)
{
    if(flag)
    {
        addValue(x,y);
    }
}



void myTimer(int t)
{
    if(ptr!=z)
    {
         ptr++;
    }
    else
{
    ptr=0;
}
    glutTimerFunc(100,myTimer,0);
}

int main( int argc, char ** argv)
{
    glutInit( &argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE| GLUT_RGB);
    glutInitWindowPosition( 100, 100);
    glutInitWindowSize(WIDTH,HEIGHT);
    glutCreateWindow( "Testing");
    init();
    glutDisplayFunc(myDisplay);
    glutMouseFunc(myMouseStat);
    glutMotionFunc(myPressedMove);
    glutTimerFunc(100,myTimer,0);
    glutMainLoop();
    return 0;
}
#包括
#包括
#包括
#定义宽度600
#定义高度600
使用名称空间std;
双arr[5000][4];
int z=0;
int标志=0;
浮动半径=0.03;
int-ptr=0;
int faltu_位=1;
浮动颜色[3][3]={{1.0,1.0,1.0},{1.0,1.0,0.0},{0.0,1.0,0.0};
void drawText(字符*str、浮点x、浮点y、整数id)
{
int i;
int len=strlen(str);
//glLoadIdentity();
glColor3f(颜色[id][0],颜色[id][1],颜色[id][2]);
glRasterPos2f(x,y);
对于本规范中的(i=0;i)

void drawLines()
{
    glBegin(GL_LINES);
    glColor3f(1.0,0.0,0.0);
    for(int i=0;i<z;i++)
    {
        glVertex2f(arr[i][0],arr[i][1]);
    }
    glEnd();
}
正如您所见,它更短、更简洁、更易于阅读,并且避免了执行
z+3
函数调用,每个调用都需要一些时间来执行

重要OpenGL能够消化多维数组
arr
的原因在于,多维数组的静态分配存储总是连续的。如果您将指针数组分配给数组,则无法工作(动态分配多维数组的天真方法).

在此代码中

void drawLines()
{
    glBegin(GL_LINES);
    glColor3f(1.0,0.0,0.0);
    for(int i=0;i<z;i++)
    {
        glVertex2f(arr[i][0],arr[i][1]);
    }
    glEnd();
}
正如您所见,它更短、更简洁、更易于阅读,并且避免了执行
z+3
函数调用,每个调用都需要一些时间来执行


重要OpenGL能够消化多维数组
arr
的原因在于,多维数组的静态分配存储总是连续的。如果您将指针数组分配给数组,则无法工作(动态分配多维数组的天真方法).

谢谢你的回答和关于使用顶点数组的非常好的信息。.这就像charmI还有一个问题。当我在我朋友的电脑上使用上述代码的exe时,有一个方形框代替了一个圆形点来遍历路径。这可能是什么原因?@adil:通常情况下,点平滑的方形点是di启用点平滑的sabled和round点。我看不到您的程序启用点平滑。但是实现在解释点时有一定的回旋余地(我建议阅读本主题的规范)你的朋友可能已经在驱动程序中启用了抗锯齿功能,这使得点看起来很圆。我几周前就开始学习openGL了…所以感谢你给我正确的答案和关于使用顶点数组的非常好的信息。这就像charmI一样工作。我还有一个问题。当我在朋友的pc上使用上述代码的exe时n路径上没有圆形点,而是有一个方形框。这可能是什么原因?@adil:通常情况下,点平滑的方形点被禁用,而点平滑的圆形点被启用。我看不到您的程序启用点平滑。但是实现在解释点时有一定的回旋余地(我建议您阅读该主题的规范)您的朋友可能在驱动程序中启用了抗锯齿功能,这使得这一点显得很全面。我几周前就开始学习openGL了……所以感谢您正确地指导我