Важная информация

User Tag List

Страница 3 из 3 ПерваяПервая 123
Показано с 21 по 28 из 28

Тема: Алгоритмы рисования окружности и OVER 1

  1. #21
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,598
    Спасибо Благодарностей отдано 
    2,182
    Спасибо Благодарностей получено 
    137
    Поблагодарили
    103 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Спасибо! Отличное решение, Reobne. И оно оптимальнее исходного по скорости (за счёт отказа от рисования лишних точек). А байтики - то уже такое, процедурка всё равно некрупная. Теперь меня в принципе всё устраивает. Но маленькое отличие кружков в OVER 0 и OVER 1 всё-таки есть. См. самый маленький, как он отличается (справа - OVER 1):
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	BibleCircles.png 
Просмотров:	161 
Размер:	3.9 Кб 
ID:	53664  
    Последний раз редактировалось Oleg N. Cher; 06.10.2015 в 22:16.

  2. #22
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,598
    Спасибо Благодарностей отдано 
    2,182
    Спасибо Благодарностей получено 
    137
    Поблагодарили
    103 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    P.S. У месье гурманов есть какие-то претензии к красивости полученных "библейским" способом окружностей?

  3. #23
    Veteran
    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,042
    Спасибо Благодарностей отдано 
    934
    Спасибо Благодарностей получено 
    227
    Поблагодарили
    122 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ещё заплатки сделал, чтобы R=0 и R=1 были нормальные.
    Код:
    ;--------------------------------------------------
    ;9. Окружность, на входе в HL,127+87*256 (x=127, y=87)
    ;--------------------------------------------------
    
    CIRCLE  LD HL,127+87*256         ;(x=127, y=87)
            LD D,1                  ;r=50
            LD C,D: LD B,0
            CALL DOT
            LD A,C: NEG: RET Z: LD C,A: CALL DOT
            LD B,C: LD C,0
            CALL DOT
            LD A,B: NEG: LD B,A: CALL DOT
            DEC D: RET Z
            jr DLOOP
    LOOP    CALL DOT                             ;sector 1
            LD A,B: NEG: LD B,A: CALL DOT        ;sector 4
            LD A,C: NEG: LD C,A: CALL DOT        ;sector 5
            LD A,B: NEG: LD B,A: CALL DOT        ;sector 8
    HLOOP
            LD A,C: LD C,B: LD B,A: CALL DOT     ;sector 3
            LD A,C: NEG: LD C,A: CALL DOT        ;sector 6
            LD A,B: NEG: LD B,A: CALL DOT        ;sector 7
            LD A,C: NEG: LD C,A: CALL DOT        ;sector 8
            LD A,C: LD C,B: LD B,A
    DLOOP
            INC C
            LD A,D: SUB C: LD D,A: JR NC,LOOP
            DEC B
            LD A,D: ADD A,B: LD D,A
            LD A,C: CP B: JR C,LOOP
            JP Z,HLOOP
            RET
    
    DOT     PUSH HL: PUSH DE: PUSH BC
            LD A,H: ADD A,B: LD B,A
            LD A,L: ADD A,C: LD C,A
            CALL #22e5
            POP bc: POP DE: POP HL
            RET

  4. #24
    Activist Аватар для Sergey
    Регистрация
    23.12.2006
    Адрес
    Славный город Самара
    Сообщений
    473
    Спасибо Благодарностей отдано 
    94
    Спасибо Благодарностей получено 
    12
    Поблагодарили
    8 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Я протестировал его с фиксом, предложенным Destr, - запоминать координаты предыдущей точки и если текущие совпадают с ними, то не рисовать... Причина - некоторые (но не все) точки по одним координатам рисуются не подряд.
    Ну я же уже объяснил, почему точки дублируются. Алогритм Destr`а, априори, не мог помочь. Контролируйте текущие x/y на нулевые значения.
    С уважением,
    Gris / Red Triangle.
    _____________________________________
    ZX-EVO/TS-Labs config/NGS/HDD/SD-card
    Amiga A1200/Blizzard 1230@50/32/60GB
    Amiga A1200/Apollo 1260@66/32/60GB
    UnAmiga (C5) AGA GM7123 VideoDAC

  5. #25
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,598
    Спасибо Благодарностей отдано 
    2,182
    Спасибо Благодарностей получено 
    137
    Поблагодарили
    103 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Было бы хорошо нам иметь централизованное хранилище таких базовых вещей. Например, вот эта процедура (с правками Reobne конечно) вполне достойна быть включенной туда на правах минималистичной, хотя наверное и не самой идеальной с плане красивости отрисовки окружности. Ну можно и другую процедуру, которая побольше, но красивше рисует. Я просто не знаю такого хранилища, вместо него на просторах инета, на форумах и в прессе туча различных процедур, среди которых довольно много плохо закодированных. И всё это надо разгребать, тестировать, ругаться и т.д.

    Но в ZXDev уже вошла. Reobne, огромное спасибо тебе.

  6. #26
    Master Аватар для GM BIT
    Регистрация
    27.11.2008
    Адрес
    Красноярск
    Сообщений
    747
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я что-то забросил сбор таких важностей

  7. #27
    Activist
    Регистрация
    15.01.2005
    Сообщений
    201
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    7
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    всё велосипеды чудите...
    хотя бы
    ld a,x:neg:ld x,a на xor a:sub x:ld x,a
    поменяли...

  8. #28
    Activist
    Регистрация
    15.01.2005
    Сообщений
    201
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    7
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    вот, кстати, тогда - аж заэкранно рисующая процедура, из старинного DEJA VU журнала, с алгоритмом хитро вложенных друг в друга CALL'ов:
    http://www.zxpress.ru/article.php?id=7876
    Код:
    ;----------------------------------------;
    _NULL   EQU     0
    ;----------------------------------------;
    ATTR_P  EQU     23693 ;атрибуты экрана
    ;----------------------------------------;
    ;биты:   0 - over 0/1,   2 - inverse 0/1
    ;      4 - ink & paper 9 (прозрачные атр.)
    P_FLAG  EQU     23697
    ;----------------------------------------;
    
    ;----------------------------------------;
    ;Algorythm designed by SerzhSoft (c)1996
    ;рисование окружности
    ; HL=x, DE=y (-32768..+23767)
    ; A=радиус (0..255) ;при 0 - точка
    CIRCLE
            ld      (X_CIRC),hl
            ld      (Y_CIRC),de
            ld      e,a
            ld      c,#00
            ld      b,c
            ld      d,c
            srl     a
    LPCIR1  ex      af,af'
    LPCIR2  call    PUT8PX
            inc     c
            ex      af,af'
            sub     c
            jr      nc,LPCIR1
            dec     e
            add     a,e
            ex      af,af'
            ld      a,e
            cp      c
            jr      nc,LPCIR2
            ret
    ;
    PUT8PX  call    PUT4PX
    ;
    PUT4PX  ld      a,c
            ld      c,e
            ld      e,a
            ld      hl,_NULL
    X_CIRC  equ     $-2
            push    hl
            add     hl,bc
            call    PUT2PX
            pop     hl
            sbc     hl,bc
    ;
    PUT2PX  inc     h
            dec     h
            ret     nz
            ld      a,l
            ld      (X_NEW),a
            ld      hl,_NULL
    Y_CIRC  equ     $-2
            push    hl
            add     hl,de
            call    PUT1PX
            pop     hl
            sbc     hl,de
    ;
    PUT1PX  inc     h
            dec     h
            ret     nz
            ld      a,l
            cp      #C0
            ret     nc
            push    de
            ld      d,a
            ld      e,_NULL
    X_NEW   equ     $-1
            push    bc
            call    PLOT
            pop     bc
            pop     de
            ret
    ;----------------------------------------;
    
    ;----------------------------------------;
    ;выч. адреса и проверка состояния точки
    POINT
            LD      B,#07
            LD      A,D
            RRA
            SCF
            RRA
            RRA
            AND     #5F
            LD      H,A
            XOR     E
            AND     B
            XOR     E
            RRCA
            RRCA
            RRCA
            LD      L,A
            LD      A,D
            XOR     H
            AND     B
            XOR     H
            LD      H,A
            LD      A,E
            AND     B
            LD      B,A
            LD      A,#80
            JR      Z,GO_PNT
    LP_PNT  RRCA
            DJNZ    LP_PNT
    GO_PNT  LD      C,A
            AND     (HL)
            RET
    ;
    POINTHL
            PUSH    HL
            CALL    POINT
            POP     HL
            RET
    ;----------------------------------------;
    ;установка точки
    PLOT
            CALL    POINT
            LD      A,(P_FLAG)
            PUSH    HL
            LD      HL,#A9A9 ;over 1, inv. 1
            BIT     0,A
            JR      NZ,IF_PLT1
            LD      L,#B1 ;[or c] - over 0
    IF_PLT1 BIT     2,A
            JR      NZ,IF_PLT2
            LD      H,#00 ;[nop] - inverse 1
    IF_PLT2 LD      (OVR_PLT),HL
            POP     HL
            LD      A,(HL)
    OVR_PLT OR      C
    INV_PLT XOR     C
    ;
    TO_PLOT ;вход для пр-ры заливки и др.
            LD      (HL),A
            LD      A,(P_FLAG)
            BIT     4,A
            RET     NZ
            LD      A,H
            RRA
            RRA
            RRA
            AND     #03
            OR      #58
            LD      H,A
            LD      A,(ATTR_P)
            LD      (HL),A
            RET
    ;----------------------------------------;
    для over 1 добавляем:

    Код:
    ...
    
    PUT8PX  call    PUT4PX
     ld a,c
     cp e
     ret z
    
    ...
    
            call    PUT2PX
            pop     hl
     ld a,c
     or a
     ret z
    
    ...
    
            call    PUT1PX
            pop     hl
     ld a,e
     or a
     ret z
    и багфикс для 0 радиуса ( когда E сразу вываливается на 255 и пытается нарисовать к точке еще и окружность ), - заменить srl a:

    or a
    jr z,PUT4PX
    rra
    Последний раз редактировалось char; 23.10.2015 в 02:26.

Страница 3 из 3 ПерваяПервая 123

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

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

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

Похожие темы

  1. Окружности Брезенхема
    от ALKO в разделе Программирование
    Ответов: 3
    Последнее: 14.06.2014, 20:28
  2. Алгоритмы теста памяти
    от ILoveSpeccy в разделе Память
    Ответов: 10
    Последнее: 22.10.2013, 16:44
  3. крипто-алгоритмы и стойкость
    от White_Hunter в разделе Программирование
    Ответов: 52
    Последнее: 28.07.2009, 18:08
  4. Вероятностные алгоритмы в механике?
    от andrews в разделе Программирование
    Ответов: 9
    Последнее: 26.12.2008, 11:50
  5. Ответов: 7
    Последнее: 27.11.2008, 14:59

Ваши права

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