Редактор примитивов, обработка клавиш мыши и модификаторов Ctrl, Alt или Shift
#include <iostream>
#include <cmath>
#include <string>
#include <vector>
#include "glut.h"
using namespace std;
#define xmax 10
#define xmin -10
#define ymax 10
#define ymin -10
char buffer[10];
bool curs=true;
GLfloat cx=0,cy=0;
vector<GLfloat> vx;
vector<GLfloat> vy;
int primitiv=0;
int color=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);
glPointSize(3);
glLineWidth(2);
if (color==0) glColor3f(1.0, 0.0, 0.0);
else if (color==1) glColor3f(0.0, 1.0, 0.0);
else if (color==2) glColor3f(0.0, 0.0, 1.0);
//синусоида штрихами GL_LINES
glBegin(primitiv);
//if (vx.size()>1)
for (int i=0;i<vx.size();i++)
glVertex2f(vx[i], vy[i]);
glEnd();
glLineWidth(1);
glColor3f(0.0, 1.0, 0.0);
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));
//vx.push_back((cx*20)/ glutGet(GLUT_WINDOW_WIDTH) -10);
glRasterPos2f(9,9);
drawString (gcvt (-(cy*20)/glutGet(GLUT_WINDOW_HEIGHT) +10, 2, buffer));
//vy.push_back(-(cy*20)/glutGet(GLUT_WINDOW_HEIGHT) +10);
}
glRasterPos2f(6.5,8);
if (primitiv==0)
drawString("POINTS");
else if (primitiv==1)
drawString("GL_LINES");
else if (primitiv==2)
drawString("GL_LINE_LOOP");
else if (primitiv==3)
drawString("GL_LINE_STRIP");
else if (primitiv==4)
drawString("GL_TRIANGLES");
else if (primitiv==5)
drawString("GL_TRIANGLE_STRIP");
else if (primitiv==6)
drawString("GL_TRIANGLE_FAN");
else if (primitiv==7)
drawString("GL_QUADS");
else if (primitiv==8)
drawString("GL_QUAD_STRIP");
else if (primitiv==9)
drawString("GL_POLYGON");
glRasterPos2f(8,7);
if (color==0)drawString("RED");
else if (color==1)drawString("GREEN");
else if (color==2)drawString("BLUE");
glFlush();//постоянная отрисовка
}
void mouse(int button,int state,int x,int y)
{
int specialKey = glutGetModifiers();
switch(button)
{
case GLUT_LEFT_BUTTON://Если ЛКМ
if (state==GLUT_DOWN)//Если нажата ЛКМ
{
curs=true;
cx=x;
cy=y;
vx.push_back( (cx*20)/glutGet(GLUT_WINDOW_WIDTH) -10 );
vy.push_back(-(cy*20)/glutGet(GLUT_WINDOW_HEIGHT) +10 );
glutPostRedisplay();
}
break;
case GLUT_RIGHT_BUTTON: //Если нажата ПКМ
curs=0;
if (state==GLUT_DOWN && specialKey!=GLUT_ACTIVE_CTRL )
{
vx.clear();
vy.clear();
primitiv++;
if (primitiv>9) primitiv=0;
}
if (state == GLUT_DOWN && specialKey == GLUT_ACTIVE_CTRL)
{
color++;
if (color>2)color=0;
}
glutPostRedisplay();
break;
case GLUT_MIDDLE_BUTTON:
exit(0);
}
}
void main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(150, 50);
glutInitWindowSize(800,600);
glutCreateWindow("Redactor");
init();
glutDisplayFunc(draw);
glutMouseFunc(mouse);
glutMainLoop();
}
Для самостоятельной работы:
1. Сделайте выбор примитива по нажатию на нарисованную иконку примитива.
2. Сделайте выбор цвета по нажатию на нарисованную палитру.