Как рисовать в консоли c
Перейти к содержимому

Как рисовать в консоли c

  • автор:

Рисование в консоли windows на С++

В консоли windows можно рисовать как и в обычном окне. Для этого используется библиотека libgdi. Я использую Qt Creator, и для подключения библиотеки libgdi пришлось прописать в .pro файл проекта путь к libgdi32.a

 LIBS += C:\Qt\Tools\mingw810_64\x86_64-w64-mingw32\lib\libgdi32.a 

Нарисуем минималистичный рисунок в консоли, пусть это будет белая линия от начала координат (0, 0) в точку (300, 300). По умолчанию, перо которым рисуется в консоли — черного цвета и на черном цвете консоли трудно различимо, поэтому у нас добавляется несколько строчек по созданию белого пера и привязки его к консольному окну. Также возникла ситуация что рисунок появлялся в консоли не при каждом запуске программы, было сделано предположение что рисует быстрее чем заканчиваются вывод консоли на экран и перерисовки консоли стирают рисунок. Предположение подтвердилось путем введения задержки после запуска функцией Sleep(100) и получением стабильной отрисовки.

 #include // GetConsoleWindow(), GetDC(). int main() < Sleep(100); // Задержка 100 мс, без этого, иногда, перерисовка окна затирает рисунок HWND hwnd = GetConsoleWindow(); // Находим дескриптор (handle) консольного окна HDC hdc = GetDC(hwnd); // Находим контекст устройства DC - device context HPEN hPen = CreatePen(PS_SOLID, 5, RGB(255, 255, 255)); // Создаем (сплошное перо, толщиной 5 пикселов, белого цвета) SelectObject(hdc, hPen);// Привязываем перо к экрану LineTo(hdc, 300, 300); // Рисуем линию от текущих координат (0, 0) к (300, 300) >

Рисование линии в консоли С++

Результат работы программы.

Усложним задачу и нарисуем толстыми, цветными, градиентными линиями синус.

 #include // GetConsoleWindow(), GetDC(). #include // std::cout #include // sin() #include // system() int main() < system("chcp 65001"); // Active code page: 65001 (Устанавливает UTF-8) system("cls"); // Очищает окно от предыдущего вывода HWND hwnd = GetConsoleWindow(); // Находим дескриптор (handle) консольного окна HDC hdc = GetDC(hwnd); // Находим контекст устройства DC - device context int x = 0; // Координата x for (float i = 0; i < 3.14 * 30; i += 0.05)< // Итерации рисования int R = fabs(sin(i * 1.3 - 0.3)) * 255; // Циклически меняем значение цвета int G = fabs(sin(i * 1.1 - 0.5)) * 255; // Циклически меняем значение цвета int B = fabs(sin(i * 1.7 - 0.7)) * 255; // Циклически меняем значение цвета COLORREF color = RGB(R, G, B); // Цвет (R, G, B) 0. 255 Меняем цвет в процессе HPEN hPen = CreatePen(PS_SOLID, 5, color); // Создаем перо SelectObject(hdc, hPen); // Привязываем перо к экрану int y = 350 - 340 * sin(i); // Координата y LineTo(hdc, x, y); // Рисуем линию x += 1; // Увеличиваем x для рисования следующей точки DeleteObject(hPen); // Освобождаем ресурсы >ReleaseDC(hwnd, hdc); // Освобождаем ресурсы std::cout 

Рисование градиентного синуса в консоли С++

Результат работы программы.

Понравилась страница?
Добавить в закладки
Или поделиться!

рисовать в консоли

Чисто в учебных целях появилась необходимость рисовать в консоли графические объекты (круги , линии , квадраты и т.д.) c++.
Желательно реализовать самому с помощью ASCII знаков .
Заморачиваться на изучение ncurses и т.п. не входит в мои цели.
Какие средства представляет консоль для этого ? В поиске не нашёл ничего полезного.

kitov ★★★
20.11.05 22:04:36 MSK

Как рисовать в консоли c

Или чтобы рисовать в текстовом режиме: функции установки курсора и вывода на консоль (псевдографики из ASCII).

Сообщ. #7 , 09.12.06, 13:21

Senior Member
Рейтинг (т): 1
да не не псевдографика надо нарисовать как можно проще график синуса
Сообщ. #8 , 09.12.06, 13:50
Рейтинг (т): 26
Что-то вроде
const int N = 100;
const double PI = 3.141592;
const double T = 2; // число периодов
TCHAR title[MAX_PATH];
POINT pts[N];
int _tmain(int argc, _TCHAR* argv[])
GetConsoleTitle(title, MAX_PATH);
HWND hwnd = FindWindow(NULL, title);
HDC hdc = GetDC(hwnd);
GetClientRect(hwnd, &rc);
HPEN hpen = CreatePen(PS_SOLID, 1, RGB(0xFF, 0, 0));
SelectObject(hdc, hpen);
MoveToEx(hdc, 0, (rc.bottom — rc.top)/2, 0);
for(int i = 0; i < N ; ++i) pts[i].x = (rc.right - rc.left)*i/100; pts[i].y = (rc.bottom - rc.top)/2*(1.0 + sin(i*T*2.0*PI/N)); Polyline(hdc, pts, N); DeleteObject(hpen); ReleaseDC(hwnd, hdc); Сообщ. #9 , 09.12.06, 23:42 Unregistered LPBOY, работает только в линейке NT/2000/XP.
Сообщ. #10 , 10.12.06, 07:43
Рейтинг (т): 26
Сообщ. #11 , 10.12.06, 08:47
Unregistered
Не знаю. Вопрос к Мелкософтам. Пробовал — в 9х ничерта не рисует. В ХП — рисует.
Сообщ. #12 , 10.12.06, 14:15

пропагандист
Рейтинг (т): 188

В консоли можно рисовать график синуса, помечая символами ‘*’ точки на графике, отрисовывая с некоторым шагом.

Сообщ. #13 , 10.12.06, 15:03
Unregistered

Да многое можно. Но какое-то нехорошее чувство подсказывает, что великомудрый препод на самом деле просто хочет ДОСовскую прогу, и свято уверен, что это называется «консольной».

Сообщ. #14 , 02.06.07, 07:31
Unregistered

Доброе утро.
Немного другая проблема.

Есть dosпрога, написанная когда-то давно на Turbo C. Хочется запустить ее в Builder C++ 6.0.

float z,h,x1,y1,x2,y2,x3,y3,r,t=0;
int Driver = DETECT, Mode;
setbkcolor (BLACK);
printf («\n What way do you want to enter data?»);
P: printf («\n To use keyboard press 1»);
printf («\n To use entering from file press 2: «);
if (z==1) goto M;
else if (z==2)
0″);
J: x1=300+r*sin(t);
y1=200+r*cos(t);
x2=300+r*sin(t);
y2=200+r*cos(t);
x3=300+r*sin(t);
y3=200+r*cos(t);
line (x1,y1,x2,y2);
line (x1,y1,x3,y3);
line (x2,y2,x3,y3);

Скачал файлик graphics.h. Кинул в папку include.
Функция initgraph теперь выглядит так: initgraph(&Driver, &Mode, «»);
Пытаюсь скомпилить, появляется ошибка:
[C++ Fatal Error] graphics.h(10): F1003 Error directive: BGI graphics not supported under Windows
Как можно переделать прогу, чтобы она заработала. Рисовать нужно именно в консоли.
ОС WinXP SP2
компилятор C++ Builder 6.0

Сообщ. #15 , 02.06.07, 10:00
Unregistered

IGV, во-первых, незачем поднимать такие старые темы — для новых вопросов обычно создаются новые топики. Во-вторых, если используешь

Цитата IGV @ 02.06.07, 07:31
компилятор C++ Builder 6.0

то у тебя есть два варианта: либо рисовать непосредственно на канве формы (или одного из компонентов, специально для этого предназначенных — TPaintBox, TImage и т.д.), используя соответствующие методы и свойства (Pixels, LineTo, MoveTo, Arc и пр.), либо обратить внимание в сторону проекта Dos Graphics Migration Library.

0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:

  • Предыдущая тема
  • C/C++: Общие вопросы
  • Следующая тема

Рисование в консоли Visual Studio c++

Учился писать код в паскале. По ходу учебы перешел на с++ и Visual Studio. В борланд паскале был удобный канвас в котором можно было рисовать фигуры/графики функций etc. есть ли в visual studio аналог?

Отслеживать
задан 29 ноя 2017 в 11:31
Андрей Лобанович Андрей Лобанович
129 1 1 золотой знак 1 1 серебряный знак 7 7 бронзовых знаков
Псевдографикой?
29 ноя 2017 в 11:33
неа, нужно качать дополнительные библиотеки из вне
29 ноя 2017 в 11:38
@user272591, что за библиотеки?
29 ноя 2017 в 11:49
@VladimirGamalyan да, почему нет.
29 ноя 2017 в 11:50

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

В Windows на окне можно рисовать средствами GDI, консольное окно не исключение. Естественно такое решение будет непереносимым. Пример:

#include #include #include int main() < HWND hwnd = GetConsoleWindow(); HDC hdc = GetDC(hwnd); int x = 0; for (float i = 0; i < 3.14 * 10; i += 0.05) < SetPixel(hdc, x, 50 + 25 * cos(i), RGB(255, 255, 255)); x += 1; >ReleaseDC(hwnd, hdc); std::cin.ignore(); return 0; > 

введите сюда описание изображения

Кроме установки пикселя в наличии большое кол-во функций для рисования различных примитивов, с применением разных кистей (толщины, узора и т.п.).

Внимание! Работает сносно только в старых версиях Windows (Windows XP). Не использовать для современных систем, начиная с Vista.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *