C++ 鼠标输入x和y点,使用直线方程算法创建直线(OpenGL)

C++ 鼠标输入x和y点,使用直线方程算法创建直线(OpenGL),c++,algorithm,opengl,draw,equation,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;

我需要使用直线方程算法创建直线,其中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;
}
#包括;
#包括,;
整数计数器;
int-x1,x2;
int y1,y2;
无效设置像素(整数x,整数y)
{
浮动m;
浮球b;
浮动x3,y3;
x3=x2-x1;
y3=y2-y1;
如果(计数器==1)
{
glPointSize(9.0f);
glBegin(总分);
m=y3/x3;

而(x1如果从鼠标获得正确的坐标,则首先进行测试

  • 因此,在这些点上画一些十字
  • 所以你们可以看到鼠标和十字线之间是否有偏移
  • 调整窗口大小后也可以尝试此操作(除非是全屏)
在将鼠标位置复制到点之前,请调用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);
  }
 }
您的绘制线有很多错误,这是一个辅助,所以我不会修复它,只是给您一些提示

  • 为什么叫它setPixel(x,y)?当它画一条线的时候
    • 当您使用x1、y1、x2、y2作为输入点时,x、y是什么
    • 这就是你的线路被窃听的原因
  • 为什么x3、y3不调用dx、dy,以便其他人更容易阅读
  • 你正在摧毁x1!!!
    • 因此,在再次单击/设置像素通话后,您将丢失线路
  • 始终使用x作为主轴(如果| dx | x2?
    • 用(x2,y2)交换(x1,y1)
    • 或者使用x1+=dir…代替x1++,并根据x1
  • 你们计算每个像素的b常数为什么?在循环之前移动它
  • 为什么y=400-y?
    • 您不应该使用屏幕y尺寸来代替吗
    • 如果您的OpenGL屏幕高度不是400px,那么它将生成偏移

您的代码示例相当长。您是否想过将问题缩小到一个部分,并向我们展示该部分?请尝试使用调试器逐步检查代码。跳出的一件事是,您只需递增
计数器
,并在递增后进行
计数器==0
测试。它不可能是0。并且他
counter==1
test只有在您第一次输入该代码时才是正确的。@La comadreja对此表示抱歉,但我不确定错误在哪里,因为我的讲师给了我们关于如何操作的提示。@RetoKoradi哦,是的,我很抱歉我已经更新了计数器==1和计数器==2,它没有多大作用。谢谢您的提示。真相是main编码是我的讲师给我的,所以我所做的就是使用他提供的内容并一步一步地编辑它。你问的很多问题都被我的讲师修改了,没有给我明确的解释,即使我问他时,他似乎有点急于回答。他在实验室中进行了编码,这是可以的,但当我在我的笔记本电脑出现了错误。不管怎样,谢谢你,我会尽我最大的努力在我自己的第一与你的提示!