у тебя есть два варианта рисования точек в круге.
1ый когда количество точек четное
2ой когда оно нечетное
в варианте с четным количеством все будет ОК
в варианте с нечетным последняя точка будет рисоваться 2 раза.
у тебя есть два варианта рисования точек в круге.
1ый когда количество точек четное
2ой когда оно нечетное
в варианте с четным количеством все будет ОК
в варианте с нечетным последняя точка будет рисоваться 2 раза.
С уважением,
Jerri / Red Triangle.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Спасибо! Отличное решение, Reobne. И оно оптимальнее исходного по скорости (за счёт отказа от рисования лишних точек). А байтики - то уже такое, процедурка всё равно некрупная. Теперь меня в принципе всё устраивает. Но маленькое отличие кружков в OVER 0 и OVER 1 всё-таки есть. См. самый маленький, как он отличается (справа - OVER 1):
Последний раз редактировалось Oleg N. Cher; 06.10.2015 в 22:16.
P.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
Было бы хорошо нам иметь централизованное хранилище таких базовых вещей. Например, вот эта процедура (с правками Reobne конечно) вполне достойна быть включенной туда на правах минималистичной, хотя наверное и не самой идеальной с плане красивости отрисовки окружности. Ну можно и другую процедуру, которая побольше, но красивше рисует. Я просто не знаю такого хранилища, вместо него на просторах инета, на форумах и в прессе туча различных процедур, среди которых довольно много плохо закодированных. И всё это надо разгребать, тестировать, ругаться и т.д.
Но в ZXDev уже вошла.Reobne, огромное спасибо тебе.
Я что-то забросил сбор таких важностей
всё велосипеды чудите...
хотя бы
ld a,x:neg:ld x,a на xor a:sub x:ld x,a
поменяли...
вот, кстати, тогда - аж заэкранно рисующая процедура, из старинного DEJA VU журнала, с алгоритмом хитро вложенных друг в друга CALL'ов:
http://www.zxpress.ru/article.php?id=7876
для over 1 добавляем:Код:;----------------------------------------; _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 ;----------------------------------------;
и багфикс для 0 радиуса ( когда E сразу вываливается на 255 и пытается нарисовать к точке еще и окружность ), - заменить srl a:Код:... 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
or a
jr z,PUT4PX
rra
Последний раз редактировалось char; 23.10.2015 в 02:26.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)