User Tag List

Страница 6 из 8 ПерваяПервая ... 2345678 ПоследняяПоследняя
Показано с 51 по 60 из 80

Тема: Демонстрационные программы для Специалиста

  1. #51

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,391
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    38 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Понятно, а то меня удивил наезд на emu80 (фактически и на emu, т.к. там аналогично), а дело все же было не в эмуляторах.

  2. #52

    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    5,213
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    706
    Спасибо Благодарностей получено 
    1,644
    Поблагодарили
    572 сообщений
    Mentioned
    50 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Привнёс цвета

    Вложения Вложения
    • Тип файла: 7z SGIDEMO.7z (804 байт, Просмотров: 14)
    С уважением, Станислав.

    Эти 2 пользователя(ей) поблагодарили CityAceE за это полезное сообщение:

    fifan(14.09.2025), Oleg N. Cher(14.09.2025)

  3. #53

    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    5,213
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    706
    Спасибо Благодарностей получено 
    1,644
    Поблагодарили
    572 сообщений
    Mentioned
    50 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Показал ИИ исходники SGIDEMO. Вот такой вердикт по главной процедуре рисования линии:

    Код:
    ; ==================================================
    ; === ФУНКЦИЯ РИСОВАНИЯ ЛИНИИ: line ===
    ; ==================================================
    ; Входные параметры:
    ;   DE = начальная точка (X,Y) — D=X, E=Y
    ;   HL = конечная точка (X,Y) — H=X, L=Y
    ; Выходные параметры:
    ;   DE, HL — не изменены (сохранены)
    ;   Рисует прямую линию между точками на экране, используя алгоритм Брезенхэма (упрощённый)
    ;   Использует putpixel для отрисовки пикселей.
    ;
    ; Примечание: код очень сложный, дублирующийся, с "жёстко закодированными" проверками.
    ; Не оптимизирован, но работает.
    
    line:
    Задача воспроизведения алгоритма Bresenham'а для i8080 решалась уже многократно, и я полагаю, что вылизана "от" и "до". Поделитесь пожалуйста! А за одно интересует реализация рисования окружности и эллипса по его же алгоритму.
    С уважением, Станислав.

  4. #54

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,391
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    38 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Прошу прощения за то, что приведу ссылку на свой пост со ссылками на две процедуры рисования линий, но в том посте есть комментарии.
    Если Брезенхем не обязателен, то окружности и компания (1, 2).
    Еще в прекрасме можно нажать на рыбу и выбрать процедуру, но там вроде не всё самое последнее.

    Этот пользователь поблагодарил ivagor за это полезное сообщение:

    CityAceE(15.09.2025)

  5. #55

    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,926
    Спасибо Благодарностей отдано 
    105
    Спасибо Благодарностей получено 
    290
    Поблагодарили
    216 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А про алгоритм Минчера там есть? Вот тема была: https://zx-pk.ru/threads/25602-algor...r-1/page2.html
    Интересно, что чуть ниже (18-й пост) тоже похожий алгоритм, но без умножения на 4, чуть кривовато, но всё равно окружность.

  6. #56

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,391
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    38 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Из нетрадиционных алгоритмов для окружностей пробовал "метод Jesko" из английской вики, он немного быстрее Мичнера, но при маленьких радиусах менее круглые окружности.

  7. #57

    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,926
    Спасибо Благодарностей отдано 
    105
    Спасибо Благодарностей получено 
    290
    Поблагодарили
    216 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А, ну очень похоже на метод Jesko. Вот, например из вики (с учётом того, что я избавился от переменной t2):
    Код:
    t1 = r / 16
    x = r
    y = 0
    Repeat Until x < y
        Pixel (x, y)
        y = y + 1
        t1 = t1 + y
        If t1 >= x
            t1 = t1 - x
            x = x - 1
    А вот из темы по моей ссылке:
    Код:
    t1 = r
    x = r
    y = 0
    Repeat
        Pixel (x, y)
        y = y + 1
        t1 = t1 - y
        If t1 < 0
            x = x - 1
            t1 = t1 + x
    Until x < y
    Разница лишь в том, что не учитывается 1/16 радиуса, и переменная t1 работает в сторону уменьшения (не от нуля до х, а наоборот). Ну и х уменьшается до использования корркекции t1.
    Может это и есть причина "кривоватости" того алгоритма.

    - - - Добавлено - - -

    Интересно, можно ли так вычерчивать эллипс?

    - - - Добавлено - - -

    К примеру:
    1. доработать алгоритм, чтобы он вычерчивал 1/4, а не 1/8
    2. покрутить с константами при увеличении/уменьшении t1

    - - - Добавлено - - -

    По первому пункту:
    Код:
    t1 = r/2
    x = r
    y = 0
    Repeat
        Pixel (x, y)
        If t1 >= 0
            y = y + 1
            t1 = t1 - y
        If t1 < 0
            x = x - 1
            t1 = t1 + x
    Until x < 0
    - - - Добавлено - - -

    Код:
        function ellipse(r,k) {
          let t1=r/2,x=r,y=0;
          while(x>=0) {
            pset(x,y);
            if(t1>=0) { ++y; t1-=y*k; }
            if(t1<0) { --x; t1+=x; }
          }
        }
    
        ellipse(80,4);
        ellipse(40,1);
    Почему-то коэффициент сжатия нужно удваивать...

    - - - Добавлено - - -

    Код:
        function ellipse(r,ky,kx) {
          let t1=r/2,x=r,y=0;
          while(x>=0) {
            pset(x,y);
            if(t1>=0) { ++y; t1-=y*ky; }
            if(t1<0) { --x; t1+=x*kx; }
          }
        }
    
        ellipse(40,1,1);
        ellipse(80,1,1);
        ellipse(80,2,1);
        ellipse(80,4,1);
        ellipse(40,1,2);
        ellipse(40,1,4);
    Нажмите на изображение для увеличения. 

Название:	ellipse.png 
Просмотров:	17 
Размер:	3.2 Кб 
ID:	82801
    Последний раз редактировалось b2m; 15.09.2025 в 16:15.

  8. #58

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,391
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    38 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Это проще, чем Мичнер с умножением для эллипса, а с другой стороны алгоритм средней точки без умножения, но там разрядность больше. Для полной ясности надо сравнивать реализации для 8080.

    - - - Добавлено - - -

    Цитата Сообщение от ivagor Посмотреть сообщение
    без умножения
    в смысле без умножений внутри цикла

  9. #59

    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,926
    Спасибо Благодарностей отдано 
    105
    Спасибо Благодарностей получено 
    290
    Поблагодарили
    216 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    в смысле без умножений внутри цикла
    Дык окружность тоже без умножения. Мичнер с умножением для эллипса не нашёл.

    - - - Добавлено - - -

    Цитата Сообщение от ivagor Посмотреть сообщение
    алгоритм средней точки без умножения
    Для эллипса тоже есть?

    - - - Добавлено - - -

    От умножения в цикле можно избавиться:
    Код:
        function ellipse(r,ky,kx) {
          let t1=r/2,x=r,y=0,ty=0,tx=kx*r;
          while(x>=0) {
            pset(x,y);
            if(t1>=0) { ++y; ty+=ky; t1-=ty; }
            if(t1<0) { --x; tx-=kx; t1+=tx; }
          }
        }

    Этот пользователь поблагодарил b2m за это полезное сообщение:

    ivagor(15.09.2025)

  10. #60

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,391
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    38 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от b2m Посмотреть сообщение
    От умножения в цикле можно избавиться
    Этот вариант мне понравился, только не понял насчет kx. Или я ошибся или kx это коэффициент увеличения по y? А ky - коэффициент сжатия по y?
    Ссылки я тут приводил.

Страница 6 из 8 ПерваяПервая ... 2345678 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Конвертор ZX-картинок для Специалиста
    от CityAceE в разделе Специалист
    Ответов: 19
    Последнее: 08.05.2025, 18:04
  2. Ответов: 153
    Последнее: 16.12.2021, 19:07
  3. Элита для Специалиста
    от jerri в разделе Специалист
    Ответов: 77
    Последнее: 20.11.2021, 20:22
  4. Ответов: 70
    Последнее: 22.01.2018, 21:06
  5. OriNET для Специалиста ?
    от SYR-ALEX в разделе Специалист
    Ответов: 22
    Последнее: 21.07.2017, 07:40

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •