Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 20.11.2025
Сообщений: 10

Рисование линий символами

02.01.2026, 18:27. Показов 2146. Ответов 6

Студворк — интернет-сервис помощи студентам
Для начала я писал сам а не нейросеть. Уточняю потому, что, кроме моей тупости в прошлой теме, мне сказали, что писала нейросеть.
Хотя я писал сам.

А так по теме: у меня не работает вывод 3 линии.
Формула вроде правильная, но не работает.

Не понимаю почему, помогите разобраться.
И, пожалуйста, без советов, просто сухо по теме, что не так.
А дальше сам разберусь.
Заранее спасибо за помощь!
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
#include <iostream>
#include <string>
#include <cstdlib>
#include <Windows.h>
// разрешение экрана
int x_max = 280, y_max = 70;
// данные вывода на экран
char (*data_screen)[280] = new char[70][280];
// готовые данный для вывода
std::string screen;
// проэцирует линию в 2д
void line(int x1, int y1, int x2, int y2)
{
    int x3 = x1, y3 = y1;
    int x_long = x2 / y2;
    if (x2 >= x1)
    {
        if (y1 < y2)
        {
            for (int y = 0; y < y2; y++)
            {
                for (int x = 0; x < x_long; x++)
                {
                    data_screen[y3][x3] = '$';
                    x3++;
                }
                y3++;
            }
        }
        if (y1 > y2)
        {
            for (int y = 0; y < y2; y++)
            {
                for (int x = 0; x < x_long; x++)
                {
                    data_screen[y3][x3] = '$';
                    x3++;
                }
                y3--;
            }
        }
    }
    if (x2 < x1)
    {
        if (y1 < y2)
        {
            for (int y = 0; y < y2; y++)
            {
                for (int x = 0; x < x_long; x++)
                {
                    data_screen[y3][x3] = '$';
                    x3--;
                }
                y3++;
            }
        }
        if (y1 > y2)
        {
            for (int y = 0; y < y2; y++)
            {
                for (int x = 0; x < x_long; x++)
                {
                    data_screen[y3][x3] = '$';
                    x3--;
                }
                y3--;
            }
        }
    }
}
// опряделяет количество кадров в секунду
void max_fps(int fps)
{
    int time = 1000 / fps;
    Sleep(time);
}
 
int main()
{
    std::ios::sync_with_stdio(false);
    while (true)
    {
        // заполняем масив пробелами
        for (int y = 0; y < y_max - 1; y++)
        {
            for (int x = 0; x < x_max - 1; x++)
            {
                data_screen[y][x] = ' ';
            }
        }
 
        line(2, 2, 100, 20); // первая линия
        line(100, 22, 60, 50); // вторая линия
        line(60, 50, 2, 2); //третья линия
 
        // обработка данных экрана
        screen = "";
        for (int y = 0; y < y_max - 1; y++)
        {
            for (int x = 0; x < x_max - 1; x++)
            {
                screen += data_screen[y][x];
            }
            screen += "\n";
        }
        // вывод данных на экран
        system("cls");
        std::cout << screen << std::flush;
        // количество кадров в секунду
        max_fps(60);
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.01.2026, 18:27
Ответы с готовыми решениями:

Убедиться, что можно проложить не более двух линий метро так, чтобы все станции лежали хотя бы на одной из линий
Ограничение времени 1 секунда Ограничение памяти 512Mb Ввод стандартный ввод или input.txt...

TImage:рисование линий
проблема такого характера: 1)нужно с помощю мыши нарисовать линию. 2)высчитать длину линии в...

Рисование линий в формах
Здравствуйте! Изучала C/C#/C++ еще на 2м курсе, и теперь совсем забыла некоторые вещи... Вот...

6
фрилансер
 Аватар для Алексей1153
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
02.01.2026, 19:04
h1le, условие не понятно, нужно больше точек и запятых.

Цитата Сообщение от h1le Посмотреть сообщение
// проэцирует линию в 2д
void line(int x1, int y1, int x2, int y2)
так она и так 2D

Добавлено через 9 минут
а зачем нужен data_screen, почему сразу в screen не рисовать?

И где в data_screen завершающий ноль ?

Добавлено через 37 секунд
ну а так - чёт шаволится. Но без гарантии https://onlinegdb.com/l6HO-aqNm

Добавлено через 8 минут
без дополнительного буфера https://onlinegdb.com/XRy0YyUM-
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
#include <iostream>
#include <string>
#include <cstdlib>
#include <chrono>
#include <thread>
 
// разрешение экрана
int x_max = 80, y_max = 20;
 
std::string screen;
 
// проэцирует линию в 2д
void line(int x1, int y1, int x2, int y2)
{
    screen.resize(x_max*y_max,' ');
    
    int x3 = x1, y3 = y1;
    int x_long = x2 / y2;
    if (x2 >= x1)
    {
        if (y1 < y2)
        {
            for (int y = 0; y < y2; y++)
            {
                for (int x = 0; x < x_long; x++)
                {
                    if(y3<y_max && x3<x_max)
                    {
                        screen[y3*x_max+x3] = '$';
                    }
                    x3++;
                }
                y3++;
            }
        }
        if (y1 > y2)
        {
            for (int y = 0; y < y2; y++)
            {
                for (int x = 0; x < x_long; x++)
                {
                    if(y3<y_max && x3<x_max)
                    {
                        screen[y3*x_max+x3] = '$';
                    }
                    x3++;
                }
                y3--;
            }
        }
    }
    if (x2 < x1)
    {
        if (y1 < y2)
        {
            for (int y = 0; y < y2; y++)
            {
                for (int x = 0; x < x_long; x++)
                {
                    if(y3<y_max && x3<x_max)
                    {
                        screen[y3*x_max+x3] = '$';
                    }
                    x3--;
                }
                y3++;
            }
        }
        if (y1 > y2)
        {
            for (int y = 0; y < y2; y++)
            {
                for (int x = 0; x < x_long; x++)
                {
                    if(y3<y_max && x3<x_max)
                    {
                        screen[y3*x_max+x3] = '$';
                    }
                    x3--;
                }
                y3--;
            }
        }
    }
}
// опряделяет количество кадров в секунду
void max_fps(int fps)
{
    int time = 1000 / fps;
    std::this_thread::sleep_for(std::chrono::milliseconds{time});
}
 
int main()
{
    std::cout<<"\33[?25l";
    std::ios::sync_with_stdio(false);
    while (true)
    {
        line(2, 2, 100, 20); // первая линия
        line(0, 20, 60, 10); // вторая линия
 
        //тут я немного схалтурил, ширина экрана на 1 меньше будет.
        //расстановка переводов строки
        for(size_t i=x_max;i<screen.size();i+=x_max)
        {
            screen[i]='\n';
        }
 
        // вывод данных на экран
        std::cout<<"\33[;H";
        std::cout << screen << std::flush;
        // количество кадров в секунду
        max_fps(60);
    }
}
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,238
02.01.2026, 19:18
Цитата Сообщение от h1le Посмотреть сообщение
но не работает не понимаю по чему
Так объясните сначала, почему он должен работать.

Что это за циклы

C++
1
for (int y = 0; y < y2; y++)
? Почему от 0 и до y2?

Что вообще означают параметры функции:

C++
1
void line(int x1, int y1, int x2, int y2)
Объясните подробно, что такое x1, y1, x2, y2?
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,956
Записей в блоге: 2
02.01.2026, 19:35
Цитата Сообщение от h1le Посмотреть сообщение
int x_long = x2 / y2;
Это неверно хотя бы потому что x2, y2 - целые числа (но не только). То что Вы хотите делает алгоритм Брезенхема (для рисования линии), проще и лучше его освоить, это классика.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,238
02.01.2026, 19:56
Цитата Сообщение от Igor3D Посмотреть сообщение
Это неверно хотя бы потому что x2, y2 - целые числа (но не только).
??? С чего бы это "неверно"? Все алгоритмы растеризации основаны на целочисленном делении, включая упомянутый вами алгоритм Брезенхема. Причем вот именно на этом самом делении. Здесь есть нюансы, но никакого "неверно" тут нет.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,956
Записей в блоге: 2
02.01.2026, 22:22
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
С чего бы это "неверно"?
Хотя бы с того что при x_long = 0 ничего не рисуется.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Все алгоритмы растеризации основаны на целочисленном делении, включая упомянутый вами алгоритм Брезенхема. Причем вот именно на этом самом делении.
Брезенхем использует "выравнивающий фактор" без всякого деления, выходит коротко и красиво. Я бы его привел, но
Цитата Сообщение от h1le Посмотреть сообщение
И, пожалуйста, без советов, просто сухо по теме,
Уже пытается "рулить" Налицо талант начальника (не программиста)
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6229 / 2930 / 1047
Регистрация: 01.06.2021
Сообщений: 10,880
04.01.2026, 13:35
Цитата Сообщение от h1le Посмотреть сообщение
Для начала я писал сам а не нейросеть. Уточняю потому, что, кроме моей тупости в прошлой теме, мне сказали, что писала нейросеть.
Хотя я писал сам.

верю, что сами написали. Никогда не поверю, что нейросеть напишет такое даже при сильном галлюцинировании:

C++
1
2
3
4
5
6
7
8
9
10
11
int x_max = 280, y_max = 70;
 
char (*data_screen)[280] = new char[70][280];
 
for (int y = 0; y < y_max - 1; y++)
        {
            for (int x = 0; x < x_max - 1; x++)
            {
                data_screen[y][x] = ' ';
            }
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.01.2026, 13:35
Помогаю со студенческими работами здесь

Рисование линий и запись координат в файл
Добрый день!!!задание состоит в следующем, есть Image1, на на него выводится сетка(кординаты х,у...

Рисование линий
Дорогие друзья! Я создаю что-то типа редактора изображений. Но вдруг у меня из памяти вылетело. Как...

Рисование линий по координатам
Здравствуйте! Возникла необходимость нарисовать линию по координатам. Есть ли в С++ ф-я,...

Рисование квадратов символами
Где-то тут недавно видел задачу, которая из разных символов рисует квадраты с вписанными квадратами...

Рисование в консоли (не символами)
Есть ли у кого пример рисования в консоли не символами. Буду очень признателен :-|


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru