|
0 / 0 / 0
Регистрация: 25.02.2017
Сообщений: 11
|
||||||
Рисование спиралей и окружностей (некорректная отрисовка окружностей)30.10.2018, 22:55. Показов 4107. Ответов 14
Метки нет (Все метки)
Здравствуйте!
Возникла проблема, разобраться в которой не получается Задача:нарисовать две спирали (по часовой и против) цвет которых чередуется от 1 до 255, в точках пересечения которых рисует окружность заданного радиуса и цвета. Проблема: окружности в точках пересечения рисуются не до конца, не могу понять, в чем причина Код:
0
|
||||||
| 30.10.2018, 22:55 | |
|
Ответы с готовыми решениями:
14
Движение двух окружностей Даны координаты центров n окружностей и их радиусы. Определить число пересекающихся окружностей
|
|
Модератор
|
|
| 30.10.2018, 23:38 | |
|
Ошибка где-то в процедуре drawCircle - она не рисует окружность. Там какая-то ошибка.
0
|
|
|
0 / 0 / 0
Регистрация: 25.02.2017
Сообщений: 11
|
|
| 31.10.2018, 09:53 [ТС] | |
|
ФедосеевПавел,
Это понятно Там дело в цикле, не могу в толк взять, какое значение является триггером для окончания цикла Первые окружности отрисовываются корректно, но чем дальше от центра, тем больше недорисовываются эти окружности
0
|
|
|
Ушел с форума
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
|
|
| 31.10.2018, 10:23 | |
|
sryv,
F.A.Q. mov cx,0C470h ;количество итераций цикла у меня mov cx,20200 ;количество итераций цикла у тебя 0C470h=50288, а всё остальное сперто с минимальными изменениями, разумеется без ссылки на автора
2
|
|
|
0 / 0 / 0
Регистрация: 25.02.2017
Сообщений: 11
|
|
| 31.10.2018, 10:46 [ТС] | |
|
Mikl___,
Виноват, что не указал ссылку Код не мой, я просто хочу в нем разобраться Проблема же не в этом: mov cx,0C470h Это цикл для вывода спирали, а вывод спирали работает хорошо, некорректно выводятся сами окружности, т.е. изъян в процедуре drawCircle, и там явно проблема с количеством итераций цикла, собственно что я и не могу разобрать
0
|
|
|
Модератор
|
|
| 31.10.2018, 12:32 | |
|
Сделайте новую процедуру вывода окружности на основе
подобие алгоритма Брезенхэма вычисления с FPU (модификация исходника из книги Зубкова)
0
|
|
|
Модератор
|
|||||||||||
| 01.11.2018, 22:47 | |||||||||||
Сообщение было отмечено sryv как решение
Решение
Окружность - методом Мичнера.
Судя по всему это первоисточник http://ermak.cs.nstu.ru/kg_riv... tth_sEc0.3 а здесь уже приводится более компактно http://algolist.manual.ru/grap... circle.php
Мне не понравился код построения спирали из FAQ - много обращений к памяти, да и условие завершения какое-то невнятное, ни к чему не привязанное. Переделал - всё то же самое, но значения переменных берутся из стека FPU, а не из памяти. У меня ощущение, что вы не все окружности проставляете. При расчётах вычисляете 2 точки, а на пересечение проверяете лишь одну из них. Хотя на рисунке всё нормально. С этим самостоятельно разберётесь.
1
|
|||||||||||
|
Asm/C++/Delphi/Py/PHP/VBA
|
|||||||||||
| 05.11.2018, 20:06 | |||||||||||
|
Вот очень простая прога для рисования окружности.
Инициализируем угол значением A = 0 (радиан) и делаем цикл из 2*Pi*R итераций, увеличивая каждый раз угол на 1/R радиан. В цикле рисуем точку в координатах X=Cos(A)*R, R=Sin(A)*R.
Для эллипса:
4
|
|||||||||||
|
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
|
||||||
| 06.11.2018, 13:27 | ||||||
Сообщение было отмечено Mikl___ как решение
Решение
Jin X, а вот и мой "каноничный" вариант (FASM):
3
|
||||||
|
Asm/C++/Delphi/Py/PHP/VBA
|
|||||||||||
| 07.11.2018, 13:07 | |||||||||||
|
В общем, я капец как заморочился и сделал универсальную процедуру, которая рисует окружности, эллипсы, дуги и спирали (иногда получаются даже сплайны и разные забавные фигуры). См. скриншот.
В архиве содержится несколько исходников, в т.ч. универсальный: с настройкой режима вывода (через BIOS или прямой доступ к видеопамяти) и оптимизации (по размеру или скорости). Плюс демонстрационные примеры. В отдельных папках – варианты с минимальным кол-вом условных директив (более понятные). p.s. На данный момент имеется небольшой баг: если разница начального и конечного радиуса очень большая (несколько десятков витков), конечный угол может быть заметно сдвинут. Это происходит из-за потери точности при постепенном приращении угла. Но это решаемо (надеюсь, у меня дойдут руки исправить это) ![]() Здесь приведу только вариант отрисовки через BIOS с оптимизацией по размеру кода (файл bios\spiral_bios.inc):
3
|
|||||||||||
|
Модератор
|
|
| 07.11.2018, 13:32 | |
|
Jin X, я пробовал алгоритмы Брезенхема и Мичнера из-за анимации - перемещении двух окружностей и текста. Вариант с применением FPU будет так же мерцать или качество анимации возрастёт?
Вычисление выражение и прорисовка ответа в овале Моя собственная реализация алгоритма Мичнера неоптимальна - можно ускорить за счёт сокращения ветвлений.
0
|
|
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
| 07.11.2018, 14:05 | |
|
ФедосеевПавел, а какая связь между алгоритмом и мерцанием? Тут же не в алгоритме дело, а в том, как организован вывод и буферизация.
Обычно, если вывод производится либо сразу в видеопамять, то в этом случае либо нет анимации (точнее, необходимости очищать экран, а также перекрывающихся элементов), либо попиксельно заполняется весь экран слева направо и сверху вниз, а расчёт цвета осуществляется исходя из позиции X, Y (к примеру, чтобы нарисовать заполненный круг, можно посчитать расстояние от текущей рисуемой точки до центра, и если оно не больше радиуса, то ставить, допустим, красный пиксель, иначе чёрный; так можно даже анимацию сделать, меняя радиус и центр, и ничего мерцать не будет, особенно если добавить кадровую синхронизацию). В остальных случаях, чтобы мерцания не было, используется промежуточный буфер (в обычной памяти), при этом при необходимости чтения пикселей из него, работа будет гораздо быстрее, ибо видеопамять жутко медленная. Этот буфер можно полностью очистить и перерисовать что нужно поэлементно (надписи, круги, линии, спрайты, закрашивание и пр, с перекрытием одних элементов другими) – на экране ничего видно не будет. После заполнения его содержимое просто копируется в видеопамять целиком. В этом случае никакого мерцания не будет. Если же очищать видеопамять и перерисовывать элементы, соответственно мерцание будет (что вполне логично). Мы не можем "заморозить" видеопамять (по крайней мере, я не знаю и не слышал о таком), чтобы выводимое в неё содержимое не отображалось на экране на время перерисовки. А по вашей ссылке код почти на 700 строк, причём без графики, поэтому я не очень понял, зачем эта ссылка. Добавлено через 6 минут Другое дело, что если мы работаем через функции BIOS с попиксельной отрисовкой (ah=0Ch/int 10h). Как вариант, можно выводить на разные видеостраницы и переключать их с одной на другую (если данный видеорежим поддерживает несколько страниц).
2
|
|
|
Модератор
|
|
| 07.11.2018, 15:22 | |
|
Это у ТС из той темы 700+ строк. Я ему показал окружности по Midpoint circle algorithm и текст 400 строк.
По сравнению с другой темой с этим же заданием, где я показывал другому ТС вычисления с FPU - отрисовка быстрее, но всё равно мерцает. Поэтому у меня появился бзик на тему ускорения прорисовки окружностей. В текущёй теме нужно отрисовать с десяток окружностей. Проверка Midpoint_circle_algorithm показала, что на малых радиусах получаются квадраты - пришлось подыскать замену. На примере той темы с анимацией просто хотел привлечь внимание, что построение при помощи FPU - значительно медленнее. Наверное, переработаю реализации и добавлю в FAQ.
0
|
|
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
| 07.11.2018, 16:01 | |
|
Если рисуем через BIOS, то важно свести к минимуму кол-во точек. У меня на ровных кругах дублирования должно быть немного, но есть. На спиралях будет много наложений на ту же точку (лишний то есть).
0
|
|
| 07.11.2018, 16:01 | |
|
Помогаю со студенческими работами здесь
15
Найти геометрическое место центров окружностей, касающихся двух данных окружностей
Найти геометрическое место центров окружностей, проходящих через точку А и касающихся окружностей Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера 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. Пошагово создадим проект для загрузки изображения. . .
|