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

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

14.02.2021, 11:22. Показов 3378. Ответов 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
Эксперт по электронике
6815 / 3240 / 337
Регистрация: 28.10.2011
Сообщений: 12,654
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru