User Tag List

Страница 7 из 8 ПерваяПервая ... 345678 ПоследняяПоследняя
Показано с 61 по 70 из 80

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

  1. #61

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

    По умолчанию

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

    Вот ещё пример:
    Код:
        ellipse(30,1,1);
        ellipse(45,1,1);
        ellipse(60,1,1);
        ellipse(90,1,1);
        ellipse(90,4,1);
        ellipse(90,9,1);
        ellipse(30,1,4);
        ellipse(30,1,9);
    Потестировать можно тут.

  2. #61
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #62

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

    По умолчанию

    Вариант быстрый и компактный, особенно если принять kx=1, но в графической библиотеке общего назначения я бы предпочел алгоритм средней точки, там удобно и понятно можно задавать радиусы по x и y.

  4. #63

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

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    я бы предпочел алгоритм средней точки
    Ага, блин, там такие вычисления (rx * rx * ry * ry), 16-битной арифметики не хватит. Вобщем, "для полной ясности надо сравнивать реализации для 8080"

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

    Да, задание радиусов - не очевидно:
    Код:
        for(let x=40; x<90; x+=5) ellipse(x,(x/40)*(x/40),1);
        for(let y=40; y<90; y+=5) ellipse(40,1,(y/40)*(y/40));
    - - - Добавлено - - -

    Во ещё как можно:
    Код:
        for(let x=40; x<90; x+=5) ellipse(x,x/40,40/x);
        for(let y=40; y<90; y+=5) ellipse(40,40/y,y/40);
    - - - Добавлено - - -

    Или так:
    Код:
        for(let x=40; x<90; x+=5) ellipse(x,x*x,40*40);
        for(let y=40; y<90; y+=5) ellipse(40,40*40,y*y);
    Общая форма ellipse(rx, rx*rx, ry*ry)

  5. #64

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

    По умолчанию

    Цитата Сообщение от b2m Посмотреть сообщение
    Вобщем, "для полной ясности надо сравнивать реализации для 8080"
    После того, как реализовал твой вариант, я уже их и сравниваю. Да, средняя точка намного сложнее, больше по размеру и медленнее, для условной элиты непригодно, но по моему мнению лучше подходит для графической библиотеки общего назначения. Хотя скорее так - все зависит от задач.

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

    Цитата Сообщение от b2m Посмотреть сообщение
    Общая форма ellipse(rx, rx*rx, ry*ry)
    Это я не пробовал на 8080, надо увеличивать разрядность переменных.

  6. #65

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

    По умолчанию

    А если так: function ellipse2(rx,ry) { ellipse(rx,rx*rx/ry,ry); } ?

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

    ivagor(15.09.2025)

  7. #66

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

    По умолчанию

    Цитата Сообщение от b2m Посмотреть сообщение
    А если так: function ellipse2(rx,ry) { ellipse(rx,rx*rx/ry,ry); } ?
    Работает и это намного проще средней точки, но при радиусах <=3 получаются ромбы.

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

    Ну и при больших радиусах срединная точка все же покрасивше, для сравнения JeskoB2m:
    Нажмите на изображение для увеличения. 

Название:	ellipseJeskoB2m.gif 
Просмотров:	31 
Размер:	4.4 Кб 
ID:	82802
    А JeskoB2m компактнее и быстрее.

  8. #67

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

    По умолчанию

    Покрутил алгоритм методом проб и ошибок, вот так выглядит вроде лучше (только я не понял, почему):
    Код:
        const ellipse = function(r,ky,kx) {
          let t1=(r+kx*ky)/4,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; }
          }
        }
    Мда, если ky округлять, всё не так красиво. Напрашивается фиксированная точка.
    Последний раз редактировалось b2m; 16.09.2025 в 10:12.

  9. #68

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

    По умолчанию

    Скорее всего лучше из-за увеличения разрядности t1 с 16 до 24 (ну или 22) бит. Вряд ли я это буду пробовать для 8080, планирую выложить вчерашний вариант, желающие смогут покрутить.

  10. #69

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

    По умолчанию

    Как тебе такой алгоритм эллипса:
    Код:
        const ellibase = function(r,r2,swap) {
          let t=r/2,t1=t,t2=0,x=r,y=0;
          while(x>=0) {
            if(swap) pset(y,x); else pset(x,y);
            if(t1>=0) { if((t-=r2)<0) { t+=r; ++y; } ++t2; t1-=t2; }
            if(t1<0) { --x; t1+=x; }
          }
        }
    
        const ellipse = function(rx,ry) {
          if(rx>ry)
            ellibase(rx,ry,0);
          else
            ellibase(ry,rx,1);
        }
    Тут вообще нет умножения, все переменные, за исключением t1, могут быть 8-битными.
    Его, конечно, нужно бы доработать (ставить точку только если было смещение по x или y), иначе эллипс слегка "толстоват"

    Потестировать можно тут.

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

    Цитата Сообщение от b2m Посмотреть сообщение
    за исключением t1
    А может и она влезает в 8 бит, всё равно крутится около ноля.

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

    Цитата Сообщение от b2m Посмотреть сообщение
    ставить точку только если было смещение по x или y
    Простая доработка не помогает, тут надо откладывать рисование на одну/две точки и сравнивать координаты...

  11. #70

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

    По умолчанию

    Воспользовался процедурой рисования линии, которую предложил blackmirror. Стало всё ГОРАЗДО быстрее, даже удивительно!



    ИИ глядя на эту процедуру, тоже в восторг пришёл, назвав её предельно оптимизированной.

    Помимо замены процедуры рисования линии, я расширил холст с 256*192 до 256*256. Автор демки уверяет, что никакого родства со Спектрумом нет, а источников вдохновения послужила демка с IBM PC arty4, написанная на Borland Pascal. Почему был выбран именно такой размер окна он уже не помнит. И вот я подумал, что может быть в прямоугольном окне интереснее фигуры получаются?

    Также приложу сюда сразу переделанную под i8080 и SJAsmPlus процедуру рисования линии. Там вроде бы и команд Z80 было раз два и обчёлся, но у меня почему-то слишком много времени заняло, чтобы заставить всё это работать корректно на Специалисте.

    Код:
        align 8
    PixMask db    128, 64, 32, 16, 8, 4, 2, 1
    
    SetPix    macro
        xor    (hl)
        ld    (hl), a
        endm
    
    LineTo:                    ; (hl - x1y1)
        ld    de, 0x0000
        ld    (LineTo + 1), hl
    Line:                    ; (hl - x1y1, de - x2y2)
        ld    a, d
        sub    h
        jp    nc, LineGm
        cpl
        inc    a
        ex    de, hl            ; swap p1, p2
    LineGm: 
        ld    d, a            ; dx
        ld    bc, PixMask    
        ld    a, 7
        and    h
        add    c
        ld    c, a
        ld    a, h
        or    a
        rra 
        or    a
        rra
        or    a
        rra
        add    0x90 + 8        ; Старший байт адреса начала экрана Специалиста
        ld    h, a
        ld    a, (bc)
        ld    b, a
    LineDy: 
        ld    a, e
        sub    l
        jp    nc, LineXi
        cpl 
        inc    a
    LineXd: 
        ld    e, a            ; dy
        sub    d
        jp    nc, LineYd
        cpl
        inc    a
        ld    (LineXdd + 1), a    ; dx-dy
        ld    a, 0x2D            ; dec l
        ld    (LineXmm), a
        jp    LineXi1
    
    LineYd: 
        ld    (LineYdd + 1), a    ; dy-dx
        ld    a, 0x2D            ; dec l
        ld    (LineYy), a
        ld    (LineYyy), a
        jp    LineYi1
    
    LineXi: 
        ld    e, a
        sub    d
        jp    nc, LineYi
        cpl
        inc    a
        ld    (LineXdd + 1), a    ; dx-dy
        ld    a, 0x2C            ; inc l
        ld    (LineXmm), a
    LineXi1:
        ld    c, d            ;cnt
        inc    c
        ld    a, d
        or    a
        rra
        ld    d, a
        ld    a, b
    LineXp:
        SetPix
        dec    c
        ret    z
        ld    a, d
        sub    e
        ld    d, a
        jp    nc, LineXpp
    LineXmm:
        dec    l
        ld    a, b
        rrca
        ld    b, a
        jp    nc, LineXm
        inc    h
    LineXm:
        SetPix
        dec    c
        ret    z
        ld    a, d
    LineXdd:
        add    0
        ld    d, a
        jp    nc, LineXmm
    LineXpp:
        ld    a, b
        rrca
        ld    b, a
        jp    nc, LineXp
        inc    h
        jp    LineXp
    
    LineYi: 
        ld    (LineYdd + 1), a    ; dy-dx
        ld    a, 0x2C            ; inc l
        ld    (LineYy), a
        ld    (LineYyy), a
    LineYi1:
        ld    c, e            ; cnt
        inc    c
        ld    a, e
        or    a
        rra
        ld    e, a
        ld    a, b
    LineYp:
        SetPix
        dec    c
        ret    z
    LineYy: 
        inc    l            ; ++y
        ld    a, e
        sub    d
        ld    e, a
        ld    a, b
        jp    nc, LineYp
        rrca
        ld    b, a
        jp    nc, LineYm
        inc    h            ; ++x
    LineYm: 
        SetPix
        dec    c
        ret    z
    LineYyy:
        inc    l            ; ++y
        ld    a, e
    LineYdd:
        add    0
        ld    e, a
        ld    a, b
        jp    c, LineYp
        rrca 
        ld    b, a
        jp    nc, LineYm
        inc    h
        jp    LineYm
    Вложения Вложения
    С уважением, Станислав.

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

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

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

Эту тему просматривают: 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

Ваши права

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