Получаем координаты графика с помощью мыши
#include <iostream>
#include <cmath>
#include <string>
#include "glut.h"
using namespace std;
#define xmax 10
#define xmin -10
#define ymax 10
#define ymin -10
char buffer[10];
bool curs=false;
GLfloat cx=0,cy=0;
//функция для отображения текста
void drawString (char *s)
{
for (int i = 0; i < strlen (s); i++)
glutBitmapCharacter (GLUT_BITMAP_HELVETICA_12, s[i]);
}
//функция для инициализации OPENGL
void init()
{
//заливаем окно белым цветом r=1 g=1 b=1
glClearColor(1.0, 1.0, 1.0, 0.0);
//ортогональная проекция
gluOrtho2D(xmin, xmax, ymin, ymax);
}
void draw()
{
// очистка экрана цветом из буфера
glClear(GL_COLOR_BUFFER_BIT);
//горизонтальная сетка
glColor3f(0.0, 1.0, 0.0);
glBegin(GL_LINES);
for (float x=xmin;x<=xmax;x+=xmax/10)
{
glVertex2f(x, ymax);
glVertex2f(x, ymin);
}
//вертикальная сетка
for (float y=ymin;y<=ymax;y+=ymax/10)
{
glVertex2f(xmax, y);
glVertex2f(xmin, y);
}
glEnd();
//горизонтальная насечка
glColor3f(0.0, 0.0, 0.0);
glBegin(GL_LINES);
for (float x=xmin-1;x<=xmax-1;x++)
{
glVertex2f(x, 0.1);
glVertex2f(x, -0.1);
}
//вертикальная насечка
for (float y=ymin-1;y<=ymax-1;y++)
{
glVertex2f(0.1, y);
glVertex2f(-0.1, y);
}
glEnd();
//подписи
for (float x=xmin-1;x<=xmax-1;x++)
{
if (x<0)glRasterPos2f(x-0.1,-0.4);
else glRasterPos2f(x,-0.4);
//перевод из int в строку char*, ияпользуя буфер и 10-ю с/с
drawString (itoa(x,buffer,10));
}
//вертикальная насечка
for (float y=ymin-1;y<=ymax-1;y++)
{
if (y==0) continue;
glRasterPos2f(0.2,y-0.05);
drawString (itoa(y,buffer,10));
}
glColor3f(1.0, 0.0, 0.0);
//ось y
glBegin(GL_LINES);
glVertex2f(ymax, 0);
glVertex2f(ymin, 0);
glEnd();
//ось x
glBegin(GL_LINES);
glVertex2f(0, xmax);
glVertex2f(0, xmin);
glEnd();
glRasterPos2f(0.3,ymax-0.5);
drawString ("Y");
glRasterPos2f(xmax-0.5,0.4);
drawString ("X");
//стрелка по Y
glBegin(GL_LINES);
glVertex2f(-ymax*0.01, ymax*0.9);
glVertex2f(0, ymax);
glVertex2f(0, ymax);
glVertex2f(ymax*0.01, ymax*0.9);
glEnd();
//стрелка по X
glBegin(GL_LINES);
glVertex2f(xmax*0.9, -xmax*0.01);
glVertex2f(xmax, 0);
glVertex2f(xmax, 0);
glVertex2f(xmax*0.9, xmax*0.01);
glEnd();
glColor3f(0.0, 0.0, 1.0);
//синусоида штрихами GL_LINES
glBegin(GL_LINES);
for (float x=-6.28;x<=6.28;x+=0.1)
glVertex2f(x, sin(x));
glEnd();
glColor3f(1.0, 0.0, 1.0);
//синусоида штрихами GL_LINES
glBegin(GL_LINE_STRIP);
for (float x=-6.28;x<=6.28;x+=0.1)
glVertex2f(x, 2*sin(x));
glEnd();
glColor3f(0.5, 0.6, 0.4);
//парабола y=x^2
glBegin(GL_LINE_STRIP);
for (float x=-3;x<=3;x+=0.1)
glVertex2f(x, x*x);
glEnd();
if (curs)//рисуем перекрстие, если была нажата ЛКМ
{
glBegin(GL_LINES);
glVertex2f(xmin,-(cy*20)/glutGet(GLUT_WINDOW_HEIGHT)+10);//Y
glVertex2f(xmax,-(cy*20)/glutGet(GLUT_WINDOW_HEIGHT)+10);//Y
glVertex2f((cx*20)/glutGet(GLUT_WINDOW_WIDTH)-10,ymin); //X
glVertex2f((cx*20)/glutGet(GLUT_WINDOW_WIDTH)-10,ymax); //X
glEnd();
glRasterPos2f(9,9.5);
//перевод из float в строку char* с точностью = 2
drawString (gcvt ((cx*20)/ glutGet(GLUT_WINDOW_WIDTH) -10, 2, buffer));
glRasterPos2f(9,9);
drawString (gcvt (-(cy*20)/glutGet(GLUT_WINDOW_HEIGHT) +10, 2, buffer));
}
glFlush();//постоянная отрисовка
}
void mouse(int button,int state,int x,int y)
{
switch(button)
{
case GLUT_LEFT_BUTTON://Если ЛКМ
if (state==GLUT_DOWN)//Если нажата ЛКМ
{
curs=true;
cx=x;
cy=y;
glutPostRedisplay();
}
break;
case GLUT_RIGHT_BUTTON: //Если нажата ПКМ
if (state==GLUT_DOWN)
{
curs=0;
//glutIdleFunc(NULL);
glutPostRedisplay();
}
break;
case GLUT_MIDDLE_BUTTON:
exit(0);
}
}
void main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(50, 150);
glutInitWindowSize(800,600);
glutCreateWindow("GL draw");
init();
glutDisplayFunc(draw);
glutMouseFunc(mouse);
glutMainLoop();
}
Для самостоятельной работы:
1. Написать функция обработки события мыши, которая позволяет по нажатия клавиши мыши менять цвет фона.
2. Написать функция обработки события мыши, которая позволяет по нажатия клавиш мыши рисовать выбранные примитивы. Пусть по нажатию правой кнопки меняется тип примитива, по нажатию левой кнопки задаются координаты вершин.
3.Постройте график в полярных координатах, например, кардиоида r = 2a(1+cos(alfa)), где a - константа, alfa - угол из интервала [0,360].