Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "StdAfx.h"
- #include "GF.h"
- #include <iostream>
- #include <vector>
- using namespace std;
- #ifndef M_PI
- const double M_PI = 3.1415926535897932384626433832795;
- #endif
- enum { LEFT, RIGHT, BEYOND, BEHIND, ORIGIN, DEST, BETWEEN, COLLINEAR, PARALLEL, CROSS, SKEW, SKEW_CROSS,
- SKEW_NO_CROSS, CROSS_LEFT, CROSS_RIGHT, INESSNTIAL, TOUCHING, COMPLEX, SIMPLE, CONVEX, NON_CONVEX,
- INSIDE, OUTSIDE, CLOCKWISE, COUNTERCLOCKWISE };
- // Ваша реализация необходимых вам функций
- void DrawLine( int x0, int y0, int x1, int y1, RGBPIXEL color )
- {
- int dx = abs(x1 - x0); //
- int dy = abs(y1 - y0);
- int signX = x1 > x0 ? 1 : -1; //if x1>x0 -> 1
- int signY = y1 > y0 ? 1 : -1;
- if (dx == 0 && dy == 0)
- {
- gfSetPixel(x0, y0, color); //ставит один пиксель
- }
- else
- {
- if (dx - dy >= 0) //прямоульгольник вытянут по x
- {
- int x = x0;
- int y = y0;
- int E = 2 * dy - dx; //ошибка
- while (x != x1 || y != y1) //пока не дойдем в кон точку
- {
- gfSetPixel(x, y, color);
- if (signY >= 0) //усл для того чтобы одинаковая прямая от x0 и обратно
- {
- if (E >= 0) //всегда измен x, иногда измен y
- {
- E -= 2 * dx;
- y += signY;
- }
- }
- else
- {
- if (E > 0)
- {
- E -= 2 * dx;
- y += signY;
- }
- }
- x += signX; //увеличиваем или умен на шаг в 1 пиксель
- E += 2 * dy;
- }
- gfSetPixel(x, y, color);
- }
- else //прям вытянут по y
- {
- int x = x0;
- int y = y0;
- int E = 2 * dx - dy;
- while (x != x1 || y != y1)
- {
- gfSetPixel(x, y, color);
- if (signX >= 0)
- {
- if (E >= 0)
- {
- E -= 2 * dy;
- x += signX;
- }
- }
- else
- {
- if (E > 0)
- {
- E -= 2 * dy;
- x += signX;
- }
- }
- y += signY;
- E += 2 * dx;
- }
- gfSetPixel(x, y, color);
- }
- }
- }
- void DrawPolygon(vector<vector<int>>& P, RGBPIXEL color) // рисуем полигон. в динамический массиве 2 x n сначала x,потом y
- {
- if (P.size() == 2) //проверка что два столбика
- {
- if (P[0].size() == P[1].size()) //количество x должно совпадать с y
- {
- for (int i = 0; i < P[0].size() - 1; i++)
- {
- DrawLine(P[0][i], P[1][i], P[0][i + 1], P[1][i + 1], color);
- }
- DrawLine(P[0][P[0].size() - 1], P[1][P[0].size() - 1], P[0][0], P[1][0], color); //прорисовываем отдельно последнюю строчку
- }
- }
- }
- int Classify(int x1, int y1, int x2, int y2, int x, int y) //где лежит точка относительно прямой
- {
- int ax = x2 - x1; //вектор a=(ax,ay) совпадает с прямой
- int ay = y2 - y1;
- int bx = x - x1;
- int by = y - y1;
- int s = ax * by - bx * ay; //определитель смотрим знак у k
- if (s > 0)
- return LEFT;
- if (s < 0)
- return RIGHT;
- //если прошел сюда то векторы колинеарны
- if ((ax * bx < 0) || (ay * by < 0)) //на прямой продолжающей отрезок сзади
- return BEHIND;
- if ((ax * ax + ay * ay) < (bx * bx + by * by)) // спереди
- return BEYOND;
- if ((x == x1) && (y == y1)) //в начало попали
- return ORIGIN;
- if ((x == x2) && (y == y2))
- return DEST;
- return BETWEEN; // попали четко на отрезок
- }
- int PolyTypeConv(vector<vector<int>>& P) //определяет тип полигона: выпуклый, невыпуклый
- {
- if (P[0].size() <= 2) //чтобы было 3 x,y
- {
- return -1; //не полигон
- }
- int type0 = Classify(P[0][0], P[1][0], P[0][1], P[1][1], P[0][2], P[1][2]); //запоминаем тип 3 точки относительно отрезка 1-2 точек
- for (int j = 0; j < P[0].size() - 1; j++) //пробегаем по всем ребрам
- for (int i = j + 2; i < P[0].size() + j - 1; i++) //пробегаем по точкам, кроме ребра
- {
- int type = Classify(P[0][j], P[1][j], P[0][j + 1], P[1][j + 1], P[0][i % P[0].size()], P[1][i % P[0].size()]);
- if (type == DEST || type == ORIGIN || type == BEYOND || type == BEHIND)
- {
- return -1; //не полигон
- }
- if (type != type0) {
- return NON_CONVEX; //невыпуклый полигон
- }
- }
- return CONVEX;
- }
- int Intersect(int xa, int ya, int xb, int yb, int xc, int yc, int xd, int yd, double& t) //пересекаются 2 прямые ab и cd или нет
- {
- int nx = yd - yc; //направляющий вектор
- int ny = xc - xd;
- int denom = nx * (xb - xa) + ny * (yb - ya); //знаменатель
- if (denom == 0)
- {
- int type = Classify(xc, yc, xd, yd, xa, ya);
- if ((type == LEFT) || (type == RIGHT))
- return PARALLEL;
- else
- return COLLINEAR; //на одной прямой
- }
- int num = nx * (xa - xc) + ny * (ya - yc);
- t = -double(num) / double(denom); //именно для отрезков пересечение если t от 0 до 1
- return CROSS;
- }
- int PolyTypeSimp(vector<vector<int>>& P) //простой или самопересечениями
- {
- if (PolyTypeConv(P) == -1)
- {
- return -1; //не полигон
- }
- if (PolyTypeConv(P) == CONVEX) {
- return SIMPLE;
- }
- for (int j = 0; j < P[0].size() - 1; j++)
- for (int i = j + 2; i < j + P[0].size() - 1; i++)
- {
- double t1 = -1; //заданы произвольно, меняются в intersect
- double t2 = -2;
- int type1 = Intersect(P[0][j], P[1][j], P[0][j + 1], P[1][j + 1], P[0][(i % P[0].size())], P[1][(i % P[0].size())], P[0][((i + 1) % P[0].size())], P[1][((i + 1) % P[0].size())], t1);
- int type2 = Intersect(P[0][(i % P[0].size())], P[1][(i % P[0].size())], P[0][((i + 1) % P[0].size())], P[1][((i + 1) % P[0].size())], P[0][j], P[1][j], P[0][j + 1], P[1][j + 1], t2);
- if (type1 == CROSS && type2 == CROSS)
- if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1) { //если обе t находятся от 0 до 1
- return COMPLEX; //сложный
- }
- }
- return SIMPLE;
- }
- int EdgeType(int x0, int y0, int x1, int y1, int x, int y) //каким образом прямая из точки x,y пересекает прямую. для заливки
- {
- switch (Classify(x0, y0, x1, y1, x, y))
- {
- case LEFT:
- if (y > y0 && y <= y1)
- return CROSS_LEFT;
- else
- return INESSNTIAL; // не пересекает
- case RIGHT:
- if (y > y1 && y <= y0)
- return CROSS_RIGHT;
- else
- return INESSNTIAL;
- case BETWEEN:
- case ORIGIN:
- case DEST:
- return TOUCHING;
- default:
- return INESSNTIAL;
- }
- }
- int PInPolyEO(int x, int y, vector<vector<int>>& P) // even-odd(считает число пересевчений, направл не интересует) закрашивает тольок ушки звезды
- {
- int prm = 0;
- for (int i = 0; i < P[0].size(); i++)
- {
- switch (EdgeType(P[0][i], P[1][i], P[0][(i + 1) % P[0].size()], P[1][(i + 1) % P[0].size()], x, y))
- {
- case TOUCHING:
- return INSIDE;
- case CROSS_LEFT:
- case CROSS_RIGHT:
- prm = 1 - prm;
- break;
- }
- }
- if (prm == 0)
- return OUTSIDE;
- else
- return INSIDE;
- }
- int PInPolyNZW(int x, int y, vector<vector<int>>& P) // закрасит всю звезду (учитывает и направления тоже)
- {
- int prm = 0;
- for (int i = 0; i < P[0].size(); i++)
- {
- switch (EdgeType(P[0][i], P[1][i], P[0][(i + 1) % P[0].size()], P[1][(i + 1) % P[0].size()], x, y))
- {
- case TOUCHING:
- return INSIDE;
- case CROSS_LEFT:
- prm = prm + 1;
- break;
- case CROSS_RIGHT:
- prm = prm - 1;
- break;
- }
- }
- if (prm != 0)
- return INSIDE;
- else
- return OUTSIDE;
- }
- int Max_El_1D(vector<int>& P) //максимальный элемент одномерного массива
- {
- int max = P[0];
- for (int i = 0; i < P.size(); i++)
- {
- if (P[i] > max)
- max = P[i];
- }
- return max;
- }
- int Min_El_1D(vector<int>& P)
- {
- int min = P[0];
- for (int i = 0; i < P.size(); i++)
- {
- if (P[i] < min)
- min = P[i];
- }
- return min;
- }
- void FillingEO(vector<vector<int>>& P, RGBPIXEL color)
- {
- int x_max = Max_El_1D(P[0]);
- int x_min = Min_El_1D(P[0]);
- int y_max = Max_El_1D(P[1]);
- int y_min = Min_El_1D(P[1]);
- for (int y = y_min; y <= y_max; y++) //увеличиваем по пикселю и закрашиваем если внутри
- for (int x = x_min; x <= x_max; x++)
- {
- if (PInPolyEO(x, y, P) == INSIDE)
- gfSetPixel(x, y, color);
- }
- }
- void FillingNZW(vector<vector<int>>& P, RGBPIXEL color)
- {
- int x_max = Max_El_1D(P[0]);
- int x_min = Min_El_1D(P[0]);
- int y_max = Max_El_1D(P[1]);
- int y_min = Min_El_1D(P[1]);
- for (int y = y_min; y <= y_max; y++)
- for (int x = x_min; x <= x_max; x++)
- {
- if (PInPolyNZW(x, y, P) == INSIDE)
- gfSetPixel(x, y, color);
- }
- }
- //2 ЛР
- vector<int> R3(double t, vector<vector<int>>& P) // параметрическое задание кривой безье 3 порядка
- {
- vector<int> R = { 0 , 0 }; //точка
- R[0] = int((1 - t) * (1 - t) * (1 - t) * P[0][0] + 3 * t * (1 - t) * (1 - t) * P[0][1] + 3 * t * t * (1 - t) * P[0][2] + t * t * t * P[0][3]);
- R[1] = int((1 - t) * (1 - t) * (1 - t) * P[1][0] + 3 * t * (1 - t) * (1 - t) * P[1][1] + 3 * t * t * (1 - t) * P[1][2] + t * t * t * P[1][3]);
- return R;
- }
- int dist(int x, int y)
- {
- return abs(x) + abs(y);
- }
- void DrawBesie3(vector<vector<int>>& P, RGBPIXEL color)
- {
- int D = Max(dist(P[0][0] - 2 * P[0][1] + P[0][2], P[1][0] - 2 * P[1][1] + P[1][2]), dist(P[0][1] - 2 * P[0][2] + P[0][3], P[1][1] - 2 * P[1][2] + P[1][3]));
- double N = 1 + sqrt(3 * D);
- double dt = 1 / N;
- double t = dt;
- vector<int> P1, P2;
- P1 = R3(0, P); //нач точка
- while (t <= 1)
- {
- P2 = R3(t, P);
- t += dt;
- DrawLine(P1[0], P1[1], P2[0], P2[1], color);
- P1 = P2;
- }
- P2 = R3(1, P);
- DrawLine(P1[0], P1[1], P2[0], P2[1], color);
- }
- int PolyTypeConvOrient(vector<vector<int>>& P, int& t) //проверка на ориентацию
- {
- t = -1;
- if (P[0].size() <= 2)
- {
- gfDrawText(300, 300, "Not polygon", RGBPIXEL::Cyan());
- return -1;
- }
- int type0 = Classify(P[0][0], P[1][0], P[0][1], P[1][1], P[0][2], P[1][2]);
- for (int j = 0; j < P[0].size() - 1; j++)
- for (int i = j + 2; i < P[0].size() + j - 1; i++)
- {
- int type = Classify(P[0][j], P[1][j], P[0][j + 1], P[1][j + 1], P[0][i % P[0].size()], P[1][i % P[0].size()]);
- if (type == DEST || type == ORIGIN || type == BEYOND || type == BEHIND)
- {
- gfDrawText(300, 300, "Not polygon", RGBPIXEL::Cyan());
- return -1;
- }
- if (type != type0)
- return NON_CONVEX;
- }
- if (type0 == LEFT)
- t = CLOCKWISE; //по часовой(система левосторонняя)
- if (type0 == RIGHT)
- t = COUNTERCLOCKWISE;
- return CONVEX;
- }
- void ClipLine(vector<vector<int>>& line, vector<vector<int>>& Poly, RGBPIXEL color) //алгоритм отсечения Кируса-Бека
- {
- int n = Poly[0].size(); //количество вершин(точек)
- int trigger = -1; //отвечает за по\против часовой (ориентация)
- int type = PolyTypeConvOrient(Poly, trigger);
- if (type == NON_CONVEX)
- gfDrawText(500, 100, "Невыпуклый", RGBPIXEL::Red());
- else
- {
- if (trigger == CLOCKWISE) //переворачиваем, делаем копию buff и меняем
- {
- vector<vector<int>> buff = Poly;
- for (int j = 0; j < 2; j++)
- for (int i = 1; i < n; i++)
- {
- buff[j][i] = Poly[j][n - i];
- }
- Poly = buff;
- }
- double t0 = 0, t1 = 1, t;
- int sx = line[0][1] - line[0][0];
- int sy = line[1][1] - line[1][0];
- int nx, ny;
- double num, denom;
- for (int i = 0; i < n; i++)
- {
- nx = Poly[1][(i + 1) % n] - Poly[1][i];
- ny = Poly[0][i] - Poly[0][(i + 1) % n];
- denom = nx * sx + ny * sy;
- num = nx * (line[0][0] - Poly[0][i]) + ny * (line[1][0] - Poly[1][i]);
- if (abs(denom) > 0.01)
- {
- t = -num / denom;
- if (denom > 0)
- {
- if (t > t0)
- t0 = t;
- }
- else
- {
- if (t < t1)
- t1 = t;
- }
- }
- }
- if (t0 <= t1) //&& t1>0)
- DrawLine(int(line[0][0] + t0 * sx), int(line[1][0] + t0 * sy), int(line[0][0] + t1 * sx), int(line[1][0] + t1 * sy), color);
- }
- }
- // Вызывается один раз в самом начале при инициализации приложения
- bool gfInitScene()
- {
- // 1 лр
- gfSetWindowSize(1150, 600);
- DrawLine(100, 100, 160, 160, RGBPIXEL::Green());
- DrawLine(100, 100, 160, 120, RGBPIXEL(200, 200, 200));
- DrawLine(100, 100, 160, 100, RGBPIXEL::Cyan());
- DrawLine(100, 100, 160, 60, RGBPIXEL(100, 100, 0));
- DrawLine(100, 100, 160, 40, RGBPIXEL::Red());
- DrawLine(100, 100, 120, 40, RGBPIXEL(100, 100, 0));
- DrawLine(100, 100, 100, 40, RGBPIXEL::Yellow());
- DrawLine(100, 100, 80, 40, RGBPIXEL(150, 100, 0));
- DrawLine(100, 100, 40, 40, RGBPIXEL::Blue());
- DrawLine(100, 100, 40, 60, RGBPIXEL(100, 100, 0));
- DrawLine(100, 100, 40, 100, RGBPIXEL::White());
- DrawLine(100, 100, 40, 120, RGBPIXEL(150, 100, 10));
- DrawLine(100, 100, 40, 160, RGBPIXEL::Magenta());
- DrawLine(100, 100, 80, 160, RGBPIXEL(200, 150, 0));
- DrawLine(100, 100, 100, 160, RGBPIXEL::DkCyan());
- DrawLine(100, 100, 120, 160, RGBPIXEL(200, 200, 0));
- vector<vector<int>> Poly = { {40, 160, 100, 40}, {240, 240, 200, 300} };
- DrawPolygon(Poly, RGBPIXEL::Red());
- if (PolyTypeConv(Poly) == CONVEX) gfDrawText(60, 310, "CONVEX", RGBPIXEL::Blue());
- else gfDrawText(60, 310, "NON CONVEX", RGBPIXEL::Blue());
- if (PolyTypeSimp(Poly) == SIMPLE) gfDrawText(60, 330, "SIMPLE", RGBPIXEL::Blue());
- else gfDrawText(60, 330, "COMPLEX", RGBPIXEL::Blue());
- vector<vector<int>> Poly0 = { {300, 360, 240, 360, 240}, {40, 160, 80, 80, 160} };
- DrawPolygon(Poly0, RGBPIXEL::Cyan());
- if (PolyTypeConv(Poly0) == CONVEX) gfDrawText(260, 170, "CONVEX", RGBPIXEL::Blue());
- else gfDrawText(260, 170, "NON CONVEX", RGBPIXEL::Blue());
- if (PolyTypeSimp(Poly0) == SIMPLE) gfDrawText(260, 200, "SIMPLE", RGBPIXEL::Blue());
- else gfDrawText(260, 200, "COMPLEX", RGBPIXEL::Blue());
- vector<vector<int>> PolyStar = { {300, 320, 360, 320, 300, 280, 240, 280}, {240, 280, 300, 320, 360, 320, 300, 280} };
- DrawPolygon(PolyStar, RGBPIXEL::Cyan());
- if (PolyTypeConv(PolyStar) == CONVEX) gfDrawText(260, 380, "CONVEX", RGBPIXEL::Blue());
- else gfDrawText(260, 380, "NON CONVEX", RGBPIXEL::Blue());
- if (PolyTypeSimp(PolyStar) == SIMPLE) gfDrawText(260, 400, "SIMPLE", RGBPIXEL::Blue());
- else gfDrawText(260, 400, "COMPLEX", RGBPIXEL::Blue());
- vector<vector<int>> Poly1 = { {500, 560, 440, 560, 440}, {40, 160, 80, 80, 160} };
- DrawPolygon(Poly1, RGBPIXEL::Cyan());
- gfDrawText(470, 10, "EVEN-ODD", RGBPIXEL::Blue());
- FillingEO(Poly1, RGBPIXEL::Yellow());
- if (PolyTypeConv(Poly1) == CONVEX) gfDrawText(460, 170, "CONVEX", RGBPIXEL::Blue());
- else gfDrawText(460, 170, "NON CONVEX", RGBPIXEL::Blue());
- if (PolyTypeSimp(Poly1) == SIMPLE) gfDrawText(460, 200, "SIMPLE", RGBPIXEL::Blue());
- else gfDrawText(460, 200, "COMPLEX", RGBPIXEL::Blue());
- vector<vector<int>> Poly2 = { {500 + 200, 560 + 200, 440 + 200, 560 + 200, 440 + 200}, {40, 160, 80, 80, 160} };
- DrawPolygon(Poly2, RGBPIXEL::Magenta());
- gfDrawText(630, 10, "NON-ZERO-WINDING", RGBPIXEL::Blue());
- FillingNZW(Poly2, RGBPIXEL::Yellow());
- if (PolyTypeConv(Poly2) == CONVEX) gfDrawText(460+200, 170, "CONVEX", RGBPIXEL::Blue());
- else gfDrawText(460+200, 170, "NON CONVEX", RGBPIXEL::Blue());
- if (PolyTypeSimp(Poly2) == SIMPLE) gfDrawText(460+200, 200, "SIMPLE", RGBPIXEL::Blue());
- else gfDrawText(460+200, 200, "COMPLEX", RGBPIXEL::Blue());
- //2 лр
- vector<vector<int>> LineBesie1 = { {450,700,400,600},{400,200,200,400} };
- DrawBesie3(LineBesie1, RGBPIXEL::Red());
- vector<vector<int>> LineBesie2 = { {650,700,700,750},{400,200,200,400} };
- DrawBesie3(LineBesie2, RGBPIXEL::Green());
- vector<vector<int>> ConvexPoly = { {850,1000, 1050, 1050, 900},{60, 60, 150, 400, 400} };
- DrawPolygon(ConvexPoly, RGBPIXEL::Red());
- vector<vector<int>> LineFirst = { {800, 1100},{450, 350}};
- DrawLine(LineFirst[0][0], LineFirst[1][0], LineFirst[0][1], LineFirst[1][1], RGBPIXEL::Blue());
- ClipLine(LineFirst, ConvexPoly, RGBPIXEL::Green());
- vector<vector<int>> LineSecond = { {800, 950},{250, 300} };
- DrawLine(LineSecond[0][0], LineSecond[1][0], LineSecond[0][1], LineSecond[1][1], RGBPIXEL::Blue());
- ClipLine(LineSecond, ConvexPoly, RGBPIXEL::Green());
- vector<vector<int>> LineThird = { {900, 1100},{150, 150} };
- DrawLine(LineThird[0][0], LineThird[1][0], LineThird[0][1], LineThird[1][1], RGBPIXEL::Blue());
- ClipLine(LineThird, ConvexPoly, RGBPIXEL::Green());
- vector<vector<int>> LineFourth = { {800, 820},{300, 400} };
- DrawLine(LineFourth[0][0], LineFourth[1][0], LineFourth[0][1], LineFourth[1][1], RGBPIXEL::Blue());
- ClipLine(LineFourth, ConvexPoly, RGBPIXEL::Green());
- vector<vector<int>> Linefifth = { {970, 990},{260, 340} };
- DrawLine(Linefifth[0][0], Linefifth[1][0], Linefifth[0][1], Linefifth[1][1], RGBPIXEL::Blue());
- ClipLine(Linefifth, ConvexPoly, RGBPIXEL::Green());
- //ClipLine(line, Poly, RGBPIXEL::Red());
- //gfSetPixel( 20, 20, RGBPIXEL(255, 255, 0) );
- //FillingEO(Poly, RGBPIXEL::Red());
- //FillingNZW(Poly2, RGBPIXEL::Red());
- //gfDrawRectangle( 100, 120, 170, 150, RGBPIXEL(255, 255, 0) );
- //gfDrawText( 200, 200, "Hello World", RGBPIXEL(0, 128, 255));
- //gfDisplayMessage("Message!");
- /* int l = 5;
- vector<vector<int>> line1 = { {430, 590, 590, 430}, {300+l/2, 300+l/2, 300-l/2, 300-l/2} };
- DrawPolygon(line1, RGBPIXEL::Red());
- FillingEO(line1, RGBPIXEL::Red());
- l = 5;
- vector<vector<int>> line2 = { {510, 590, 590, 510}, {300 + l / 2, 240 + l / 2, 240 - l / 2, 300 - l / 2} };
- DrawPolygon(line2, RGBPIXEL::Yellow());
- FillingEO(line2, RGBPIXEL::Yellow());
- l = 5;
- vector<vector<int>> line3 = { {510+l/2, 510+l/2, 510-l/2, 510-l/2}, {300, 240, 240, 300} };
- DrawPolygon(line3, RGBPIXEL::Cyan());
- FillingEO(line3, RGBPIXEL::Cyan());
- l = 5;
- vector<vector<int>> line4 = { {510, 430, 430, 510}, {300 + l / 2, 240 + l / 2, 240 - l / 2, 300 - l / 2} };
- DrawPolygon(line4, RGBPIXEL::Blue());
- FillingEO(line4, RGBPIXEL::Blue());
- */
- return true;
- }
- // Вызывается в цикле до момента выхода из приложения.
- // Следует использовать для создания анимационных эффектов
- void gfDrawScene()
- {
- //gfClearScreen(RGBPIXEL::Black());
- //static int x = 0;
- //gfDrawRectangle(x, 100, x + 50, 130, RGBPIXEL::Blue());
- //x = (x + 1) % gfGetWindowWidth() ;
- //int x = gfGetMouseX(),
- // y = gfGetMouseY();
- //gfDrawRectangle(x - 10, y - 10, x + 10, y + 10, RGBPIXEL::Green());
- }
- // Вызывается один раз перед выходом из приложения.
- // Следует использовать для освобождения выделенных
- // ресурсов (памяти, файлов и т.п.)
- void gfCleanupScene()
- {
- }
- // Вызывается когда пользователь нажимает левую кнопку мыши
- void gfOnLMouseClick( int x, int y )
- {
- x; y;
- gfDrawRectangle(x - 10, y - 10, x + 10, y + 10, RGBPIXEL::Green());
- }
- // Вызывается когда пользователь нажимает правую кнопку мыши
- void gfOnRMouseClick( int x, int y )
- {
- x; y;
- }
- // Вызывается когда пользователь нажимает клавишу на клавиатуре
- void gfOnKeyDown( UINT key )
- {
- key;
- if( key == 'A' )
- gfDisplayMessage( "'A' key has been pressed" );
- }
- // Вызывается когда пользователь отжимает клавишу на клавиатуре
- void gfOnKeyUp( UINT key )
- {
- key;
- //if( key == 'B' )
- // gfDisplayMessage( "'B' key has been un-pressed" );
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement