C++ 鼠标输入x和y点,使用直线方程算法创建直线(OpenGL)
我需要使用直线方程算法创建直线,其中x1,y1和x2,y2的值是通过鼠标输入的。这是我的长代码-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;
#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编码是我的讲师给我的,所以我所做的就是使用他提供的内容并一步一步地编辑它。你问的很多问题都被我的讲师修改了,没有给我明确的解释,即使我问他时,他似乎有点急于回答。他在实验室中进行了编码,这是可以的,但当我在我的笔记本电脑出现了错误。不管怎样,谢谢你,我会尽我最大的努力在我自己的第一与你的提示!