2016-09-22 11 views
3

私はopenglでフリーハンドを描く方法を知っていますが、マウスをあまりに速く動かすとギャップがないようにしたいと思います。これは私が持っているものです。OpenGLの一貫したフリーハンドライン

void myMovedMouse(int mouseX, int mouseY) 
{ 
    int x = mouseX; 
    int y = IMAGE_Y - mouseY - 1; 
    //int brushSize = 20; 
    //glRecti(x, y, x + brushSize, y + brushSize); 
    drawDot(x, y); 
    glFlush(); 
} 

//in main 
glutDisplayFunc(myDisplay); 
glutMotionFunc(myMovedMouse); 

私もGL_LINE_LOOPを使用しようとしましたが、もちろん動作しませんでしたという。

+0

は、あなたは、このアプローチにすぎ取得するつもりはない、遅く長くあなたが徐々に取得するつもりだ「描きます。」 –

答えて

2

追加のマウス位置:ところで

#include <GL/glut.h> 
#include <vector> 

std::vector<int> points; 
void mouse(int button, int state, int x, int y) 
{ 
    if(state == GLUT_DOWN) 
     points.clear(); 
    points.push_back(x); 
    points.push_back(y); 
    glutPostRedisplay(); 
} 

void motion(int x, int y) 
{ 
    points.push_back(x); 
    points.push_back(y); 
    glutPostRedisplay(); 
} 

void display() 
{ 
    glClearColor(0, 0, 0, 1); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    double w = glutGet(GLUT_WINDOW_WIDTH); 
    double h = glutGet(GLUT_WINDOW_HEIGHT); 
    glOrtho(0, w, h, 0, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glBegin(GL_LINE_STRIP); 
    glColor3ub(255, 0, 0); 
    for(size_t i = 0; i < points.size(); i += 2) 
    { 
     glVertex2i(points[i+0], points[i+1]); 
    } 
    glEnd(); 

    glutSwapBuffers(); 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); 
    glutCreateWindow("GLUT"); 
    glutMouseFunc(mouse); 
    glutMotionFunc(motion); 
    glutDisplayFunc(display); 
    glutMainLoop(); 
    return 0; 
} 
+0

著者がマウスボタンを使用している場合は、ギャップを許さない。また、彼はカラーバッファをクリアしていないように見えるので、再描画によって多くのパフォーマンスが失われます。 @WolvenOmega、それを詳しく解説できますか(マウスボタン、カラーバッファー?) –

+0

代わりにライン(ポイントのペア)を保存してGL_LINESを使うことができました。 – pleluron

+0

私は前の図を保持して、私が「ペンを持ち上げて」発言しても続けることができるので、カラーバッファをクリアしません。また、そのまま、マウスボタンをクリックすると、プログラムが描画されます。この部分が機能したら、マウスの右ボタンでキャンバスをクリアします。 –

2

最後の更新からのマウスの位置をグローバル変数に保存します。次に、新しい場所に回線を使用して接続します。

int lastMouseX, lastMouseY; 

void myMovedMouse(int mouseX, int mouseY) 
{ 
    int x = mouseX; 
    int y = IMAGE_Y - mouseY - 1; 

    glBegin(GL_LINES); 
    glVertex2i(lastMouseX, lastMouseY); 
    glVertex2i(x, y); 
    glEnd(); 
    glFlush(); 

    lastMouseX = x; 
    lastMouseY = y; 
} 

描画にマウスボタンを使用している場合は、ボタンを押したときの最後の位置のみを更新します。また、ボタンを再度押すと、最後の位置をマウスの位置に初期化します。初期化が必要なので、最初のストロークは原点(0,0)から開始せず、それ以上のストロークは前のストロークに接続しません。 std::vector &使用GL_LINE_STRIP

関連する問題