使用dda/bresenham算法使用OpenGL鼠标函数绘制直线
所以我必须用鼠标功能画一条线。当鼠标单击两个点时,程序需要绘制一条连接它们的线 我需要制作一个想象中的10x10阵列,映射上面的点,然后连接点。窗口大小无关紧要 我不知道该怎么处理这个虚构的数组,也不知道如何保存鼠标坐标,这样我就可以找到它们了。帮助使用dda/bresenham算法使用OpenGL鼠标函数绘制直线,opengl,mouseevent,bresenham,dda,Opengl,Mouseevent,Bresenham,Dda,所以我必须用鼠标功能画一条线。当鼠标单击两个点时,程序需要绘制一条连接它们的线 我需要制作一个想象中的10x10阵列,映射上面的点,然后连接点。窗口大小无关紧要 我不知道该怎么处理这个虚构的数组,也不知道如何保存鼠标坐标,这样我就可以找到它们了。帮助 #include <glut.h> #include<stdio.h> void RenderScene(void) //점 { glClear(GL_COLOR_BUFFER_BIT); // Flush
#include <glut.h>
#include<stdio.h>
void RenderScene(void) //점
{
glClear(GL_COLOR_BUFFER_BIT);
// Flush drawing commands
glFlush();
}
void SetupRC(void) //바탕
{
// setup clear color
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}
void ChangeSize(GLsizei w, GLsizei h) {
GLfloat aspectRatio;
// Prevent a divide by zero
if (h == 0)
h = 1;
// Set Viewport to window dimensions
glViewport(0, 0, w, h);
// Reset coordinate system
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Establish clipping volume (left, right, bottom, top, near, far)
aspectRatio = (GLfloat)w / (GLfloat)h;
glOrtho(0, w, h, 0, 1.0, -1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void myRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2){
glPointSize(10);
////ddaLine
int dx, dy;
int m = (y2 - y1) / (x2 - x1);
for (int i = x1; i <= x2; i++)
{
if (m <= 1)
{
dx = 1;
dy = m * dx;
}
else
{
dy = 1;
dx = dy / m;
}
x1 += dx;
y1 += dy;
glBegin(GL_POINTS);
glVertex3f(x1, y1, 0.f);
glEnd();
}
/////breline
while (x1 < x2)
{
int dx = x2 - x1;
int dy = y2 - y1;
int di = 2 * dy - dx;
int ds = 2 * dy;
int dt = 2 * (dy - dx);
x1++;
if (di < 0)
di += ds;
else
{
y1++;
di += dt;
}
glBegin(GL_POINTS);
glVertex3f(x1, y1, 0.f);
glEnd();
}
}
GLfloat g_x = -1000.f, g_y = -1000.f;
void MouseHandler(int button, int state, int x, int y){
if (button == GLUT_LEFT_BUTTON
&& state == GLUT_DOWN){
g_x = x; g_y = y;
printf("%d,%d \n", x, y);
}
glutPostRedisplay();
}
void main(int argc, char* argv[]){
int array[10][10];
glutInit(&argc, argv); // initialize GL context
// single or double buffering | RGBA color mode
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
glutCreateWindow("Lec01");
// callback function
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
SetupRC(); // initialize render context(RC)
glutMouseFunc(MouseHandler);
glutMainLoop(); // run GLUT framework
}
#包括
#包括
void RenderScene(void)//점
{
glClear(GLU颜色缓冲位);
//刷新图形命令
glFlush();
}
无效设置RC(无效)//바탕
{
//设置清晰的颜色
glClearColor(0.0f、0.0f、1.0f、1.0f);
}
无效更改大小(GLsizei w、GLsizei h){
GLfloat aspectRatio;
//防止被零除
如果(h==0)
h=1;
//将视口设置为窗口尺寸
glViewport(0,0,w,h);
//重置坐标系
glMatrixMode(GL_投影);
glLoadIdentity();
//建立剪裁体积(左、右、下、上、近、远)
aspectRatio=(GLfloat)w/(GLfloat)h;
格洛托(0,w,h,0,1.0,-1.0);
glMatrixMode(GLU模型视图);
glLoadIdentity();
}
void myRectf(GLfloat x1、GLfloat y1、GLfloat x2、GLfloat y2){
gl点大小(10);
////达林
int-dx,dy;
int m=(y2-y1)/(x2-x1);
对于(int i=x1;i