Нет ничего невозможного
Вот новый вариант, постарался сделать максимально похожим на алгоритм окружности, чтобы было видно саму идею:
Код выделенным шрифтом убирает утолщения.Код:const circle = function(r) { let t=r/2,x=r,y=0; while(x>=0) { pset(x,y); if(t>=0) { ++y; t-=y; } if(t<0) { --x; t+=x; } } } const ellibase = function(r,r1,swap) { let t=r/2,x=r,y=0,t1=t,y1=0,py=0; while(x>=0) { py=y1; if(swap) pset(y1,x); else pset(x,y1); if(t>=0) { ++y; t-=y; if((t1-=r1)<0) { t1+=r; ++y1; } } if(t<0) { --x; t+=x; if(py==y1 && t>y && t1<r1) { ++y; t-=y; t1+=r-r1; ++y1; } } } } const ellipse = function(rx,ry) { if(rx>ry) ellibase(rx,ry,0); else ellibase(ry,rx,1); }
Ссылка для тестирования та-же.
Попробуй (64,16) или (16,64). Для этих случаев картинка чуть изменилась, но утолщения на концах остались.
Нет, в этом алгоритме (со "сплющиванием" окружности) похоже совсем идеальный эллипс не нарисовать.
Идеальный вот:
- - - Добавлено - - -Код:const ellipse = function(rx,ry) { let ky=rx*rx/ry; let t=rx*rx/6,x=rx,y=0,dx=rx*ry,dy=0; while(x>=0) { pset(x,y); if(t>=0) { ++y; dy+=ky; t-=dy; } if(t<0) { --x; dx-=ry; t+=dx; } } }
В целых числах (но тут третья степень радиусов):
Код:const ellipse = function(rx,ry) { let kx=ry*ry,ky=rx*rx; let t=ry*ky/6,x=rx,y=0,dx=rx*kx,dy=0; while(x>=0) { pset(x,y); if(t>=0) { ++y; dy+=ky; t-=dy; } if(t<0) { --x; dx-=kx; t+=dx; } } }
Последний раз редактировалось b2m; 17.09.2025 в 14:32.
Вероятно я ошибся в реализации, у меня на картинке занижает радиус по y.
Последний раз редактировалось ivagor; 17.09.2025 в 16:39. Причина: убрал про дробную часть t, дело не в ней
ivagor(17.09.2025)
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Это помогло.
Единственный недостаток по сравнению со средней точкой - "Jeskoвые" ромбы при самых маленьких радиусах, зато при больших красиво. Этот вариант получился средний по красоте, размеру и скорости между этой твоей модификацией Jesko и средней точкой. Теперь есть из чего выбрать.
Осторожно, под спойлером есть негатив
На мой субъективный взгляд в такой беспощадной рванине мало смысла, это тяжело смотреть и еще тяжелее получать какое-то удовольствие. Есть 2 основных варианта борьбы с разрывами:
1. Выравнивание кода до кратности кадру + ручная подстройка, как здесь (кстати, теперь это работает и в emu и в современных версиях emu80). Таким макаром можно выводить (очень простую, состоящую из повторяющихся в столбце блоков 8x6) динамическую картинку разрешением примерно до 2/3 спековского экрана (256x128 или близко). Пример того, что можно реализовать - первый эффект из векторовской демы From Sunset To Dawn. Основной ограничивающий фактор - сложно поддерживать постоянный период выполнения кода по мере его усложнения.
При наличии таймера очевидно все резко упрощается, один раз подстроились в начале, потом пользуемся без особых ограничений.
Забыл сразу написать про второй ограничивающий фактор - сейчас существуют клоны специалиста с отличающимися параметрами развертки. Тут все зависит от желания и возможностей по отладке, или можно поддержать один самый распространенный вариант или те варианты, к которым есть доступ.
2. Не полное устранение, а уменьшение заметности разрывов. 1) Построчный (не постолбцовый) вывод из теневого буфера, 2) бОльшую часть картинки должны занимать однородные (сплошные черные или белые) участки. Пример реализации такого подхода - jet set. Ну и тут неприятная зависимость - чем меньше FPS, тем реже разрывы.[свернуть]
Последний раз редактировалось ivagor; 18.09.2025 в 07:31. Причина: дополнил первый пункт про разные варианты развертки
CityAceE(18.09.2025)
А что, если таким образом выводить текст? Понятно, что символы не 6х8, а 8х10, но всё же. Я думаю ускорение будет заметно. Какой-нибудь скроллер забабахать. Шрифт, правда, в два раза распухнет...
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)