Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/34: Рейтинг темы: голосов - 34, средняя оценка - 4.53
13 / 13 / 4
Регистрация: 01.12.2010
Сообщений: 95

Рисование графических примитивов

12.04.2020, 16:20. Показов 7025. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
никогда не рисовал в С/С++, всегда делал консольные приложения в CodeBlocks. А тут потребовалось вывести один круг, один прямоугольник и один треугольник. С чего начать? Какие заголовочные файлы нужны? Сейчас работаю в CodeBlocks для Windows (с компилятором mingw), версия 17
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.04.2020, 16:20
Ответы с готовыми решениями:

Рисование графических примитивов
Приложение, которое читает данные из файла о координатах и размерах различных графических примитивов (отрезок, прямоугольник, эллипс,...

Отображение графических примитивов
не подскажите как нарисовать круг, треугольник и домик. Ищу в интернете не как не могу найти(

Хранение, вывод и изменение графических примитивов
Здравствуйте! Помогите новичку организовать хранение, вывод и изменение графических примитивов. Буду благодарен за хорошую литературу. ...

23
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
12.04.2020, 16:29
Qt лучше возьми.
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,965
Записей в блоге: 232
14.04.2020, 14:57
Если вы хотите принципиально работать в CodeBlocks, то можно подключить к этой среде библиотеку SFML или SDL2. Как их подключить - можно погуглить. Эти библиотеки позволяют очень просто рисовать круги и другие примитивы, а так же текст, изображения, даже спрайтовые анимации и т.д.

Можно рисовать с помощью OpenGL. Туториал для начала:
  • Перевод на русский, но не до конца перевели: learnopengl. Урок 1.1 — OpenGL / Хабр - Habr
  • Оригинал на английском: https://learnopengl.com/ Этот сайт не открывается на территории РФ, нужно ставить VPN, например, плагин для браузеров - Browsec, но не забывайте его отключать, потому что скорость интернета у вас упадёт.

Написал сейчас пример рисования треугольника на WebGL и JavaScript. WebGL и OpenGL - это одно и тоже. На C++ будет очень похоже использование OpenGL. Воспринимайте, как псевдокод:

Песочница

Исходники

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<!doctype html>
 
<html>
  <head>
    <title>Triangle. WebGL 1.0, JavaScript</title>
  </head>
 
  <body>
    <canvas id="renderCanvas" width="300" height="300"></canvas>
 
    <script>
      var canvas = document.getElementById("renderCanvas");
      var gl = canvas.getContext("webgl");
      
      var vertexShaderSource = [
        "attribute vec3 aPosition;",
        "void main()",
        "{",
        "    gl_Position = vec4(aPosition, 1.0);",
        "    gl_PointSize = 10.0;",
        "}"
      ].join("\n");
 
      var fragmentShaderSource = [
        "void main()",
        "{",
        "    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);",
        "}"
      ].join("\n");
 
      var vShader = getShader(vertexShaderSource, gl.VERTEX_SHADER, "Vert");
      var fShader = getShader(fragmentShaderSource, gl.FRAGMENT_SHADER, "Frag");
 
      var program = gl.createProgram();
      gl.attachShader(program, vShader);
      gl.attachShader(program, fShader);
      gl.linkProgram(program);
      var message = gl.getProgramInfoLog(program);
      if (message.length > 0) console.log("Linking error: " + message);
      gl.useProgram(program);
 
      var vertexPositions = new Float32Array([
        -0.5, -0.5, 0.0,
        0.5, -0.5, 0.0,
        0.0, 0.5, 0.0
      ]);
 
      var vertexPosBuffer = gl.createBuffer();
      gl.bindBuffer(gl.ARRAY_BUFFER, vertexPosBuffer);
      gl.bufferData(gl.ARRAY_BUFFER, vertexPositions, gl.STATIC_DRAW);
 
      var aPositionLocation = gl.getAttribLocation(program, "aPosition");
      gl.vertexAttribPointer(aPositionLocation, 3, gl.FLOAT, false, 0, 0);
      gl.enableVertexAttribArray(aPositionLocation);
 
      gl.clearColor(0.9, 0.9, 0.9, 1.0);
      gl.clear(gl.COLOR_BUFFER_BIT);
      gl.drawArrays(gl.TRIANGLES, 0, 3);
 
      function getShader(source, type, sName)
      {
        var shader = gl.createShader(type);
        gl.shaderSource(shader, source);
        gl.compileShader(shader);
        var message = gl.getShaderInfoLog(shader);
        if (message.length > 0) console.log(sName + ": " + message);
        return shader;
      }
    </script>
  </body>
</html>


Название: triangle-webgl10-ts.png
Просмотров: 205

Размер: 1.8 Кб
0
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,061
Записей в блоге: 3
14.04.2020, 15:28
Цитата Сообщение от starikNAD Посмотреть сообщение
всегда делал консольные приложения
Цитата Сообщение от starikNAD Посмотреть сообщение
А тут потребовалось вывести один круг
в консоле тоже можно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
///----------------------------------------------------------------------------|
/// Настройки для MinGW GCC
///     -lmingw32
///      libgdi32.a
///----------------------------------------------------------------------------:
#include <windows.h>
#include <iostream>
#include <сmath>
#include <conio.h>
 
const float PI_2 = 6.28f;
///----------------------------------------------------------------------------|
/// Класс для рисования гексы.
///----------------------------------------------------------------------------:
struct sGexagon
{   sGexagon(float r) : radius (r),
                        deltax (0.f),
                        deltay (0.f),
                        rot    (0.f),
                        DELT_PI(PI_2/6),
                        side_  (6)
    {       hWnd     = GetConsoleWindow();
            hDC      = GetDC(hWnd);
            cP       = CreatePen(PS_SOLID, 7, RGB(0,255,0));
            cP_black = CreatePen(PS_SOLID, 7, RGB(0,0,0));
        SelectObject(hDC, cP);
    }
    
    struct sPlot
    {   float x;
        float y;
    };
    
    void draw()
    {   POINT pp; 
 
        sPlot p = get(0);
        for(int i = 0; i < side_; i++)
        {   MoveToEx(hDC, p.x, p.y,  &pp);
            p = get(i+1);
            LineTo(hDC, p.x, p.y);
        }
    }
    
    void move(float x, float y)
    {   deltax = x;
        deltay = y;
    }
    
    void color(int r, int g, int b)
    {   /// TODO: закрыть предыдущий пен?!
        DeleteObject(cP);
        cP = CreatePen(PS_SOLID, 7, RGB(r,g,b));
        SelectObject(hDC, cP);
    }
    
    void cls()
    {   SelectObject(hDC, cP_black);
        draw();
        SelectObject(hDC, cP);
    }
    
    void side(int n)
    {   DELT_PI = PI_2/n;
        side_   = n;
    }
    
    float rot;
private:
    float radius;
    float deltax, deltay;
    HWND  hWnd;
    HDC   hDC;
    HPEN  cP, cP_black;
    float DELT_PI;
    int   side_;
    
    sPlot get(int a)
    {   sPlot p;
        p.x = radius * sin(DELT_PI*a + rot) + deltax;
        p.y = radius * cos(DELT_PI*a + rot) + deltay;
        return p;
    }
};
 
///----------------------------------------------------------------------------|
/// Градусы в радианы.(для удобства управления).
///----------------------------------------------------------------------------:
float to_rad(float gradus){ return 6.28f * gradus / 360;}
 
///----------------------------------------------------------------------------|
/// Анимация гексы.
///----------------------------------------------------------------------------:
class cAnimation
{   
    sGexagon* gex;
public:
    cAnimation(sGexagon* _gex) : gex(_gex)
    {   anim();
    }
    
    void anim()
    {   float x = 100.f;
        float y;
        float m = 1.f;
        while(true)
        {   for(int i = 0; i < 360; i++)
            {   gex->move(x, 120.f+y);
                gex->rot += m * to_rad(1.5f);
                gex->draw();
                std::cout << "\rАнимация желтого круга...                ";
                Sleep(20);
                gex->cls();
                x += m * 1.f;
                y = 50.f * sin(2.f*to_rad(i));
            }
            m *= -1.f;
        }
    }
};
 
///----------------------------------------------------------------------------|
/// Старт.
///----------------------------------------------------------------------------:
int main()
{   setlocale(0, "");
 
    sGexagon gex(100.f);
    
    std::cout << "\rЗеленная гекса...        press any key.";
    gex.move(100.f, 130.f);
    gex.draw();
    
    _getch();
    gex.cls();
    
    std::cout << "\rКрасный треугольник...   press any key.";
    gex.side(3);            // Кол-во сторон.
    gex.color(255, 0, 0);   // Цвет.
    gex.move(150.f, 150.f); // Позиция.
    gex.rot = to_rad(15);   // Вращение.
    gex.draw();
    
    _getch();
    gex.cls();
    
    std::cout << "\rСиний квадрат...         press any key.";
    gex.side(4);            // Кол-во сторон.
    gex.color(0, 0, 255);   // Цвет.
    gex.move(150.f, 150.f); // Позиция.
    gex.rot = to_rad(15);   // Вращение.
    gex.draw();
    
    _getch();
    gex.cls();
    
    std::cout << "\rСиний пентагон...        press any key.";
    gex.side(5);            // Кол-во сторон.
    gex.move(150.f, 150.f); // Позиция.
    gex.rot = to_rad(15);   // Вращение.
    gex.draw();             // Процесс отрисовки...
    
    _getch();
    gex.cls();
    
    std::cout << "\rАнимация желтого круга... press any key.";
    gex.side(32);
    gex.color(255, 255, 0);
    cAnimation animation(&gex);
    
    return 0;
}

exe:
15.rar
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,276
14.04.2020, 16:39
Qt рулит.
Миниатюры
Рисование графических примитивов  
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,965
Записей в блоге: 232
14.04.2020, 23:30
Цитата Сообщение от XLAT Посмотреть сообщение
exe:
15.rar
Из-за чего может не выводиться текст на русском языке?

Название: hexagon-webl10-ts.png
Просмотров: 194

Размер: 5.2 Кб
1
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,061
Записей в блоге: 3
14.04.2020, 23:52
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Из-за чего может не выводиться текст на русском языке?
вот запустите три раза по разу для каждого варианта(нужно раскоментить/закоментить)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/// сам исходник у меня в win-1251
#include <iostream>
int main()
{   //-------------------------1
    //setlocale(0, "");
 
    //-------------------------2
    //SetConsoleCP(1251);
    //SetConsoleOutputCP(1251);
    
    //-------------------------3
    setlocale(LC_ALL,"russian");
    
    std::cout << "Русский язык!\n";
}

Появится ли у вас русский язык?

у меня все рабочие

Доп:
другая причина наличие самого русского шрифта в консоле?

НО в целом для себя я проблему понял:
релизы нужно делать в юникоде!
1
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,965
Записей в блоге: 232
15.04.2020, 00:12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <Windows.h>
 
int main()
{   //-------------------------1
    setlocale(0, "");
    std::cout << "Первый вариант:\n";
 
    //-------------------------2
    //SetConsoleCP(1251);
    //SetConsoleOutputCP(1251);
    //std::cout << "Второй вариант:\n";
 
    //-------------------------3
    //setlocale(LC_ALL, "russian");
    //std::cout << "Третий вариант:\n";
 
    std::cout << "Русский язык!\n";
}
Название: 001_RussianText_Cpp.png
Просмотров: 192

Размер: 4.6 Кб

Название: 002_RussianText_Cpp.png
Просмотров: 192

Размер: 4.6 Кб

Название: 003_RussianText_Cpp.png
Просмотров: 193

Размер: 4.6 Кб
1
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,965
Записей в блоге: 232
15.04.2020, 00:18
Я попробовал собрать в Release первый вариант:

C++
1
2
    setlocale(0, "");
    std::cout << "Первый вариант:\n";
Работает:

Название: 004_RussianText_Cpp_Release.png
Просмотров: 192

Размер: 3.1 Кб
1
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,965
Записей в блоге: 232
15.04.2020, 00:23
Цитата Сообщение от XLAT Посмотреть сообщение
НО в целом для себя я проблему понял:
релизы нужно делать в юникоде!
По умолчанию в VS стоит Юникод? Где в настройках вы изменяли на что-то другое? Там где-то ASCII можно выставить?
0
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,061
Записей в блоге: 3
15.04.2020, 00:28
Цитата Сообщение от 8Observer8 Посмотреть сообщение
По умолчанию в VS стоит Юникод?
15.exe был скомпилирован вот этим:
tdm-gcc 9.2
1
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,965
Записей в блоге: 232
15.04.2020, 00:36
Я нашёл "Advanced" > "Character Set". У меня было установлено "Use Unicode Character Set". Я выставил: "Use Multi-Byte Character Set". Собрал в релиз, но всё равно выводит русский. Почему в том EXE не выводится русский? Не знаю, если честно, чем они отличаются. Unicode, вроде, из двух байт состоит. "Multi-Byte" - значит, больше чем один байт и тоже русский поддерживает. Там нет однобайтовой настройки. Я попробовал даже "Not Set", но тоже Release EXE выводит русский.

Добавлено через 3 минуты
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Почему в том EXE не выводится русский?
Цитата Сообщение от XLAT Посмотреть сообщение
15.exe был скомпилирован вот этим:
tdm-gcc 9.2
Окей
0
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,061
Записей в блоге: 3
15.04.2020, 00:38
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Окей
вот поколдовал чуть:

???
Вложения
Тип файла: rar 15.rar (520.0 Кб, 3 просмотров)
0
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,061
Записей в блоге: 3
15.04.2020, 00:44
+ вариант с флажками gcc -ansi:

у мя везде язык нормально отображается.
Вложения
Тип файла: rar 15.rar (251.0 Кб, 4 просмотров)
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,965
Записей в блоге: 232
15.04.2020, 01:07
Теперь вообще никакой текст не выводит:

Название: Shape_001_without_text.png
Просмотров: 186

Размер: 7.1 Кб
0
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,061
Записей в блоге: 3
15.04.2020, 01:52
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Теперь вообще никакой текст не выводит:
мда,

а вот старый GCC 4.9
Вложения
Тип файла: rar 15.rar (183.7 Кб, 3 просмотров)
0
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,061
Записей в блоге: 3
15.04.2020, 01:58
вариант-17
и ещё тож же старый gcc 4.9
cо сброшенными флагами:
Вложения
Тип файла: rar 15.rar (183.5 Кб, 3 просмотров)
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,965
Записей в блоге: 232
15.04.2020, 01:58
Работает!

Название: Shape_002_with_Russian_text.png
Просмотров: 180

Размер: 5.4 Кб
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,965
Записей в блоге: 232
15.04.2020, 02:00
Цитата Сообщение от XLAT Посмотреть сообщение
cо сброшенными флагами:
Тоже работает.
1
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,061
Записей в блоге: 3
15.04.2020, 02:23
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Тоже работает.
спасибо, но это только сужает круг

в 16 варианте был такой вывод:
C++
1
std::wcout << L"\rАнимация желтого круга... press any key.";
а в 17 варианте был такой:
C++
1
std::cout << "\rАнимация желтого круга... press any key.";
+мелочи.

короче, текущий вывод:
старый компилятор борозды не испортит,
но и глубоко не вспашет, блин (

проблема моя, нужно сварганить виртуалку с win10,
чтобы действительно тестить, как бы с широким зацепом...

но хоть это и интересно, но всё же мелочи мелкие,
по сравнению с внедрением каких-нибудь умопомрачительных матоалгоритмов
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.04.2020, 02:23
Помогаю со студенческими работами здесь

Операция объединения для графических примитивов
Есть задача: создать систему классов, реализующих графические примитивы (круг, треугольник, квадрат) на плоскости с реализацией операций...

Отображение графических примитивов
не подскажите как нарисовать круг, треугольник и домик. Ищу в интернете не как не могу найти(

Создание графических примитивов
Здравствуйте ,помогите пожалуйста С помощью средства Visual C++ создать на экране чертеж.

Отрисовка графических примитивов QPainter
Всем привет! Помогите решить проблему, надо нарисовать такой рисунок. Пока сделал вот что, но ума не приложу как отрисовать выделенные...

Отображение и удаление графических примитивов, программа - индикатор нагрузки
Подскажите как мне быть. Есть индикатор нагрузки на пямять. Вот текст программы. Программа считает процент нагрузки, если больше 10%...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru