Форум программистов, компьютерный форум, киберфорум
QBasic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
1104 / 480 / 33
Регистрация: 05.07.2018
Сообщений: 1,870
Записей в блоге: 7

Как нарисовать окружность прямо в БМП-файл?

14.02.2021, 11:22. Показов 3328. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Следует сразу заметить, что в bmp-файле можно нарисовать не только окружность, а и любую фигуру, график и вообще всё, что только может прийти вам в голову. Здесь я прилагаю программу, которая рисует окружность радиусом 150 пикселей и координатами центра (300, 300) в bmp-файл размером 500*400. В программе предусмотрено условие того, что если программа полезет рисовать вне файла, то она этого сделать не сможет. Просто будет рисовать то, что можно.

ОСОБЕННОСТЬ АЛГОРИТМА
я не стал записывать в программу заголовок bmp-файла. Его ведь вычислять замучаешься. А вот интересно, заголовок bmp-файла можно как-то не напрягаясь вычислить? Вот Windows это делает не глядя. Видимо есть готовый алгоритм. В общем сам bmp-файл создаётся на диске нужного размера с белым фоном (но фон вы можете в любом графическом редакторе задать тот, который вам больше нравится)

примечание
теперь можно считать, что задача "40 окружностей" подошла к логическому концу. Новых окружностей будет столько, сколько сможет поместиться в файле размером 6400*4800 (мне больше не надо). Надеюсь, что QB будет не слишком долго считать.

QBasic/QuickBASIC
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
REM
REM Программа рисует окружность прямо в BMP - файл
REM пример bmp - файла размером 500*400
REM объём файла = 3 * 500 * 400 + 54 = 600 054 байт
REM
 
CLS
CONST pi = 3.141593
CONST p2 = 2 * pi
OPEN "1.bmp" FOR BINARY AS #1
 
DIM x AS LONG
DIM y AS LONG
DIM z AS LONG
DIM O AS LONG
DIM u AS STRING * 1
u = "0"
A = 500
B = 400
O = 3 * A * B + 54
 
R = 150        'R - радиус окружности
k = 1 / R      'k - кривизна окружности
 
FOR fi = 0 TO p2 STEP k
   x = R * COS(fi) + 300
   y = R * SIN(fi) + 300
   z = 54 + 3 * (x + 500 * (y - 1))
 
   IF z > O OR z < 55 THEN 100
 
   PUT #1, z + 1, u
   PUT #1, z + 2, u
   PUT #1, z + 3, u
100
NEXT
END
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.02.2021, 11:22
Ответы с готовыми решениями:

Как нарисовать окружность?
Не могу понять как нарисовать примитивный круг с заданными координатами, радиусом и толщиной. Большая просьба, объясните непросвещённому,...

Как нарисовать окружность
Подскажите, пожалуйста, как нарисовать окружность в Microsoft Visual C++ .:thank_you:

Как нарисовать окружность?
Здравствуйте! Подскажите как нарисовать единичную окружность. В ВБ6 через метод scale размечался ПБ а в ВБ 2010 этот метод работает по...

14
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
14.02.2021, 17:45
Какие‐то сложности.

Вот как можно сохранить экран в файл на фрибесике:
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'set graphics screen 640 x 480 pixels, 32 bit colors
Const W = 640, H = 480 'width & hight
ScreenRes W, H, 32
 
'draw a smiley at screen center
Circle (W \ 2, H \ 2), 180, &h00ffff00, , , , f 'yellow circle
Circle (W \ 2 - 55, H \ 2 - 70), 35, &h00000000, , , 1.5, f 'left eye
Circle (W \ 2 + 55, H \ 2 - 60), 35, &h00000000, , , 1.5, f 'right eye
Circle (W \ 2, H \ 2 + 80), 70, &h00000000, , , 0.4, f 'mouth
 
'save image buffer to file
Dim As String fileName = "Smiley.bmp"
 
If BSave(fileName, 0) = 0 Then
    Print "Saved succesful: " + fileName
Else
    Print "Error saving: " + fileName
End If
 
'keep graphics screen open until key press
Sleep
1
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
14.02.2021, 18:04
Лучший ответ Сообщение было отмечено wer1 как решение

Решение

Цитата Сообщение от wer1 Посмотреть сообщение
А вот интересно, заголовок bmp-файла можно как-то не напрягаясь вычислить?
Вот тут расписано прямо по пальцам
1
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
14.02.2021, 18:27
Лучший ответ Сообщение было отмечено wer1 как решение

Решение

Цитата Сообщение от wer1 Посмотреть сообщение
которая рисует окружность радиусом 150 пикселей и координатами центра (300, 300)
Зачем рисовать окружность через тригонометрию?
Для попиксельной прорисовки окружности хорошо подходит алгоритм Брезенхэма
1
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
14.02.2021, 18:52
Думаю прога не работает. Потому что нет структуры BMP, идентификатора, заголовка, палитры.
К тому же на QB он вдруг захотел полноцветное, домножает на три. Места много видать на диске.

Короче геху это не надо. Пусть играется с FB, там можно имадж создать и писать в файл,
например 4000x4000 точно можно, больше не проверял, но, наверное, можно. Большего ему не надо.
1
1104 / 480 / 33
Регистрация: 05.07.2018
Сообщений: 1,870
Записей в блоге: 7
14.02.2021, 20:42  [ТС]
Цитата Сообщение от m-ch Посмотреть сообщение
Зачем рисовать окружность через тригонометрию?
Для попиксельной прорисовки окружности хорошо подходит алгоритм Брезенхэма
m-ch,
спасибо! Я посмотрел этот алгоритм. Там даже программа прилагается на паскале. Нет, код сложнее и непонятнее. Хотя может быть и быстрее. Мне тригонометрия ближе. Синусы и косинусы душу греют, а Брезенхэма как нибудь ещё посмотрю более внимательно на досуге. Но всё-равно спасибо!

Добавлено через 7 минут
Ребята,
я свою программу дописал. Она рисует прямо в файл уже 121 окружность. Можно было и больше. Но больше мне не нужно. Я рекорды не ставлю. Бейсик молодец, быстро рисует. Хотя там точек ну где-то тысяч 10. А всё остальное это пустое пространство. Недаром даже перевод файла в zip-файл вызвало сжатие в 400 раз. Пустота она легко сжимается.
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
15.02.2021, 08:33
Цитата Сообщение от wer1 Посмотреть сообщение
Нет, код сложнее и непонятнее. Хотя может быть и быстрее
Как-то реализовывал алгоритм Брезенхэма на FreeBasic для линий и окружностей - см. вложение
можно легко перенести на QBasic
Вложения
Тип файла: zip Bresen.zip (102.3 Кб, 0 просмотров)
1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
15.02.2021, 08:39
Цитата Сообщение от m-ch Посмотреть сообщение
можно легко перенести на QBasic
Но зачем, когда можно писать на фрибесике сразу Circle?
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
15.02.2021, 10:02
Цитата Сообщение от Замабувараев Посмотреть сообщение
Но зачем, когда можно писать на фрибесике сразу Circle?
У ТС - QBasic, а у меня его нет, могу написать только на FB или VBA
Поэтому и скинул рабочий алгоритм рисования окружностей, который можно перенести на любой Basic
Ну или писать сразу в файл (конечно не 1млн на 1 млн, а вот 30 тыс на 30 тыс пикселей, думаю возможно)
0
1104 / 480 / 33
Регистрация: 05.07.2018
Сообщений: 1,870
Записей в блоге: 7
15.02.2021, 13:16  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
Но зачем, когда можно писать на фрибесике сразу Circle?
Или я вас не понял или вы меня? Разве Circle позволяет делать запись прямо в файл? По-моему только цвет точки (точнее цвет близкий к чёрному, хотя можно и любой другой). Если точка принадлежит окружности, то у меня в программе это символ "0". Он даёт практически чёрный цвет.

Добавлено через 3 минуты
Цитата Сообщение от m-ch Посмотреть сообщение
Ну или писать сразу в файл (конечно не 1млн на 1 млн, а вот 30 тыс на 30 тыс пикселей, думаю возможно)
Мне вот интересно... А Windows откроет такой большой файл для показа картинки?
0
Эксперт по электронике
6510 / 3140 / 331
Регистрация: 28.10.2011
Сообщений: 12,340
Записей в блоге: 7
15.02.2021, 14:02
Цитата Сообщение от m-ch Посмотреть сообщение
Ну или писать сразу в файл (конечно не 1млн на 1 млн, а вот 30 тыс на 30 тыс пикселей, думаю возможно)
24 на 24 тысячи без проблем создался этим кодом.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
UsePNGImageEncoder()
 
If CreateImage(0, 24000, 24000)
  If StartDrawing(ImageOutput(0))
    
    Box(0, 0, OutputWidth(), OutputHeight(), RGB(255, 255, 255))
    Circle(OutputWidth()/2, OutputHeight()/2, (OutputWidth()+OutputHeight())/8, 0)
    StopDrawing()
    
    SaveImage(0, "D:\TestImg.png", #PB_ImagePlugin_PNG)
  EndIf
EndIf
Для открытия картинки нужно x64 приложение.
Вложения
Тип файла: zip TestImg.zip (146.9 Кб, 4 просмотров)
1
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
15.02.2021, 14:31
Цитата Сообщение от wer1 Посмотреть сообщение
А Windows откроет такой большой файл для показа картинки?
Максимально можно создать в Фотошопе 300000х300000 пикселей. Но это если у вас есть столько памяти на диске С:/- образ создается там. Мне не удалось, нет такого размера памяти.
1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
15.02.2021, 14:51
Цитата Сообщение от wer1 Посмотреть сообщение
Разве Circle позволяет делать запись прямо в файл?
Вот код на фрибесике:
PureBasic
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
Const W = 640, H = 480 'width & hight
ScreenRes W, H, 32
 
'allocate memory for image buffer
Dim As Any Ptr pImageBuffer = ImageCreate(W, H)
 
'draw a smiley at file
Circle pImageBuffer, (W \ 2, H \ 2), 180, &h00ffff00, , , , f 'yellow circle
Circle pImageBuffer, (W \ 2 - 55, H \ 2 - 70), 35, &h00000000, , , 1.5, f 'left eye
Circle pImageBuffer, (W \ 2 + 55, H \ 2 - 60), 35, &h00000000, , , 1.5, f 'right eye
Circle pImageBuffer, (W \ 2, H \ 2 + 80), 70, &h00000000, , , 0.4, f 'mouth
 
'save image buffer to file
Dim As String fileName = "Smiley.bmp"
 
If BSave(fileName, pImageBuffer) = 0 Then
    Print "Saved succesful: " + fileName
Else
    Print "Error saving: " + fileName
End If
 
'free memory for image buffer
ImageDestroy(pImageBuffer)
 
'keep graphics screen open until key press
Sleep
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
15.02.2021, 15:50
Цитата Сообщение от wer1 Посмотреть сообщение
в файле размером 6400*4800 (мне больше не надо).
По сути вам надо не то, что предлагают, полноцветные изображения, а 1 битный BMP, где на черном фоне белый круг:

При размере 6400*4800 файл будет всего 3.66МБ, писать туда данные нужно не пикселями, как тут привыкли, а байтами, в которых каждым бите звкодирован цвет, 0 это черный цвет, а 1 белый. Т.е. обычно пиксель это 4 байта в виде RGBA, а тут 8 пикселей в 1 байте, дикая экономия.
1
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
15.02.2021, 18:38
Цитата Сообщение от Pro_grammer Посмотреть сообщение
а 1 битный BMP, где на черном фоне белый круг
Про 1 бит одновременно почти))) крик души)))
https://www.cyberforum.ru/post15263032.html
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.02.2021, 18:38
Помогаю со студенческими работами здесь

Как нарисовать окружность
Привет! срочно нужна помощь!!! Нужно нарисовать окружность с задаваемым радиусом и эксцентриситетом радиус вычисляется по формуле...

Как нарисовать окружность?
Как нарисовать окружность?

Как нарисовать закрашенную окружность?
Есть такая функция в graphics?

Как нарисовать окружность в окружности?
Как нарисовать окружность в окружности?

Как нарисовать на сфере окружность?
Как нарисовать на сфере окружность?


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru