鼠标输入x和y指向使用线方程算法创建一条线(open gl)

时间:2014-06-29 03:17:45

标签: c++ algorithm opengl draw equation

我需要使用线方程算法创建线,其中x1,y1和x2,y2的值是通过鼠标输入。这是我漫长的编码 -

#include <stdio.h>;
#include <GL/glut.h>;

int counter;
int x1, x2;
int y1, y2;

void setPixel(int x, int y)
{
    float m;
    float b;
    float x3, y3;

    x3 = x2-x1;
    y3 = y2-y1;

    if(counter==1)
    {
        glPointSize(9.0f);
        glBegin(GL_POINTS);

        m = y3 / x3;

        while(x1 <= x2)
        {
            b =  y - (m*x2);
            y = (m*x1)+b;
            y = 400-y;
            glVertex2i(x1,y);
            x1++;

        }

        glEnd();
        glFlush();
    }

}
void myMouse(int button, int state, int x, int y)
{

    if(button ==  GLUT_LEFT_BUTTON && state == GLUT_DOWN )
    {

        setPixel(x,y);
        counter++;

        if(counter==0)
        { 
            x1 = x;
            y1 = y;

        }
        if(counter==1)

        { 
            x2 = x;
            y2 = y;

        }
    }
}

void myKeyboardAct(unsigned char c, int x, int y)
{
    switch(c)
    {
        case 's' : //show coordinates' x and y

            printf("what where and what are x and y %d %d \n" ,x,y);
            printf("what where and what are x and y %d %d \n" ,x2,y2);

            break;

        case 'e' : //flush and draw

            glFlush();
            break;
    }
}

void myDisplay(void)
{
    glClearColor(0,0,0,0);
    glColor3f(200.0,0.00,0);
    gluOrtho2D(-300.0,300.0,-200.0,200.0);
    //gluOrtho2D(0.0,600.0,400.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glutMouseFunc(myMouse);

    glFlush();

}

int main(int argc, char** argv)
{
    glutInitWindowSize(600,400);
    //glutInitWindowSize(1024,800);
    glutInitWindowPosition(100,100);
    glutCreateWindow("HELLO THERE YOU CAN JUST DRAW AWAYYYY DRAW       AWAAAAAYYYYYYYYYYYYYYYYYYYY");
    glutDisplayFunc(myDisplay);
    glutKeyboardFunc(myKeyboardAct);
    glutMainLoop ();
    return 0;
}
然而,我遇到的问题是该线似乎出现在我点击的上方几点或几点以下。另一件事是,如果渐变为负,则不会出现该行。

1 个答案:

答案 0 :(得分:0)

首先测试是否从鼠标获得正确的坐标。

  • 所以在这些点上划一些交叉
  • 所以你实际看到鼠标和十字架之间是否有一些偏移。
  • 在调整窗口大小后也尝试这样做(除非是全屏)。

在将鼠标位置复制到点之前调用setPixel()!试试这样:

void myMouse(int button, int state, int x, int y)
 {
 if(button ==  GLUT_LEFT_BUTTON && state == GLUT_DOWN )
  {
  if(counter==0) { x1=x; y1=y; counter++; }
  if(counter==1) { x2=x; y2=y; }      
  setPixel(x,y);
  }
 }

你的Draw系列有很多错误,这是一个分配因此我不会修复它只是给你提示

  • 为什么称它为setPixel(x,y)?当它画一条线
    • 使用x1,y1,x2,y2作为输入点时x,y是什么
    • 这就是为什么你的线路被窃听!!!
  • 为什么x3,y3不能调用dx,dy所以它对其他人来说更具可读性?
  • 你正在摧毁x1 !!!
    • 因此,在另一次点击/ setPixel调用后,您将丢失行
  • 你总是使用x作为主轴(如果| dx |&lt; | dy |那么你的线上会有洞)
  • 如果x1&gt; x2?,您总是增加x1 ++
    • 交换(x1,y1)和(x2,y2)
    • 或代替x1 ++使用x1 + = dir ...并根据x1&lt; 1将方向设置为+/- 1。 X2
  • 你为每个像素计算b常数为什么?在循环之前移动它
  • 为什么y = 400-y?
    • 你不应该使用屏幕y尺寸吗?
    • 如果您的OpenGL屏幕高度不是400px,那么它将生成偏移!!!