User Tag List

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 28

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

  1. #11

    Регистрация
    23.12.2006
    Адрес
    Славный город Самара
    Сообщений
    484
    Спасибо Благодарностей отдано 
    135
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    12 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вот Мичнер в более приятной для Олега паскалевидной форме:
    Код:
    procedure bres_circle(xc,yc,r:interger):
     var x,y,d:integer:
     procedure sim(x,y;integer);
      begin
        putpixel(x+xc,y+yc,White);
        putpixel(x+xc,-y+yc,White);
        putpixel(-x+xc,-y+yc,White);
        putpixel(-x+xc,y+yc,White);
        putpixel(y+xc,x+yc,White);
        putpixel(y+xc,-x+yc,White);
        putpixel(-y+xc,-x+yc,White);
        putpixel(-y+xc,x+yc,White);
      end;
      begin
      d:=3-2*y;
      x:=0;
      y:=r;
      while(x <= y) do
        begin
         sim(x,y);
         if d<0    then d:=d+4*x+6
         else begin
         d:=d+4*(x-y)+10;
         dec(y)
        end;
      inc(x)
      end;
     end;
    Кстати, воспринимается полегче, чем Си.
    С уважением,
    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

  2. #12

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,681
    Спасибо Благодарностей отдано 
    2,717
    Спасибо Благодарностей получено 
    170
    Поблагодарили
    130 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sergey Посмотреть сообщение
    Не могу сказать, сколько раз рисуются точки, - это, вообще, странно слышать, что одна точка несколько раз рисуется.
    Вот-вот, а я-то как удивился.

    Цитата Сообщение от Sergey Посмотреть сообщение
    Зачем, также, этот кривой ПЗУшный алгоритм?
    Разве что для полного соответствия ZX-Бейсику или экономии памяти. Ну и реверанс в сторону Ревю и книжек по графике, где окружность предлагалось рисовать только алгоритмом из ПЗУ.

    Цитата Сообщение от Sergey Посмотреть сообщение
    Рекомендую алгоритм Мичнера. Мне его окружности больше глаз радуют.
    Спасибо! Полезно и для не-ZX. Если будет целиком в машкоде (или адаптированный для Спека) — буду рад увидеть код.

  3. #13

    Регистрация
    23.12.2006
    Адрес
    Славный город Самара
    Сообщений
    484
    Спасибо Благодарностей отдано 
    135
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    12 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Хотелось бы найти быструю и корректную в этом смысле процедуру. Что посоветуете?
    Решил пока воздержаться от изобретания велосипеда, - вот нашёл:
    http://icereijo.com/a-circle-algorithm-for-zx-spectrum/
    там и исходники, и тапка, и видео даже.
    С уважением,
    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

  4. #14

    Регистрация
    23.12.2006
    Адрес
    Славный город Самара
    Сообщений
    484
    Спасибо Благодарностей отдано 
    135
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    12 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    То есть некоторые точки рисуются по два раза. И даже если вообще никто не рисует окружности в режиме OVER 1, то всё равно это - потеря производительности.
    Эврика. Выбранная тобой процедура, используя свойства симметрии, рисует точки по октетам. При одной из координат равной 0, количество вариантов расположения точек вырождается до 4-х: смещения от оси симметрии равны +0/-0. Поэтому точки при этом рисуются на одном и том же месте. Избежать этого можно, если для случаев x=0 / y=0 сделать специальные п/п рисования точек.
    С уважением,
    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. #15

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

    По умолчанию

    а как включить режим OVER 1 для #22Е5 через код?

  6. #16

    Регистрация
    26.03.2008
    Адрес
    Питкяранта
    Сообщений
    1,823
    Спасибо Благодарностей отдано 
    275
    Спасибо Благодарностей получено 
    122
    Поблагодарили
    95 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от GM BIT Посмотреть сообщение
    а как включить режим OVER 1 для #22Е5 через код?
    На скорую руку вот так включал #5C91=1
    Но это без передачи управления бейсику, иначе он обратно вернёт.

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

  8. #17

    Регистрация
    23.12.2006
    Адрес
    Славный город Самара
    Сообщений
    484
    Спасибо Благодарностей отдано 
    135
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    12 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Пробуйте. Не должно быть повторных точек. Учитывает края экрана.
    Расплата: 14 и 20 тактов на точку соответственно.
    Код:
    void circle3(unsigned char cx, unsigned char cy, unsigned char r) __naked
    { cx,cy,r;
    __asm
    	ld  hl,#2
    	add hl,sp
    	ld  b,(hl)
    	inc hl
    	ld  c,(hl)
    	inc hl
    	ld  l,(hl)
    
    	ld	(xcyc+1),bc ; b = x, c = y. , переменная в коде команды.
    	xor	a,a
    	ld	c,l ; y = r;
    	ld	b,a ; x = 0;
    	ld	h,a
    	add	hl,hl
    	ld 	de,#5
    	ex 	de,hl
    	or 	a,a
    	sbc hl,de
    	ld 	(var_d+1),hl ; d = 5 - 2r;
    
    loop:
    	ld	a,b
    	cp	c
    	jp	c,q0
    	call	z,pixels
    	ret
    q0:	call	pixels
    var_d:
    	ld	de,#0 ;	_d	 переменная в коде команды.
    	bit	7,d
    	jp	z,q1
    ; d < 0:
    	ld 	h,#0
    	ld	l,b
    	add	hl,hl
    	add	hl,hl
    	add	hl,de
    	ld	de,#6
    	add	hl,de
    	ld	(var_d+1),hl
    	inc	b	; ++x
    	jp	loop
    
    q1:	ld	a,b	; x-y
    	sub c
    	ld 	l,a
    	sbc a,a
    	ld 	h,a ; sign is extended
    	add	hl,hl
    	add	hl,hl
    	add	hl,de
    q3:	ld	de,#10
    	add	hl,de
    	ld	(var_d+1),hl
    	dec	c	; --y
    	inc b 	; ++x
    	jp	loop
    
    pixels:
    	;xc+x, yc+y
    xcyc:	ld 	hl,#0	;(xcyc)
    	ld 	a,b
    	or  a,a
    	jp  z,p1
    	add	a,h
    	jp	c,p1
    	ld 	d,a
    	ld	a,c
    	or  a,a
    	jp  z,p1
    	add a,l
    	cp 	a,#192
    	jp	nc,p1
    	ld 	e,a
    	call	plote
    	; xc+x, yc-y
    	ld 	hl,(xcyc+1)
    p1:	ld 	a,b
        or  a,a
        jp  z,p2
    	add	a,h
    	jp	c,p2
    	ld 	d,a
    	ld	a,l
    	sub a,c
    	jp	c,p2
    	ld 	e,a
    	call	plote
    	; xc-x, yc-y
    	ld 	hl,(xcyc+1)
    p2:	ld	a,h
    	sub	a,b
    	jp	c,p3
    	ld	d,a
    	ld 	a,l
    	sub a,c
    	jp	c,p3
    	ld	e,a
    	call	plote
    	; xc-x, yc+y
    	ld 	hl,(xcyc+1)
    p3:	ld	a,h
    	sub	a,b
    	jp	c,p4
    	ld	d,a
    	ld 	a,l
    	or  a,a
    	jp  z,p4
    	add a,c
    	cp 	#192
    	jp	nc,p4
    	ld 	e,a
    	call	plote
    	; xc+y, yc+x
    	ld 	hl,(xcyc+1)
    p4:	ld 	a,h
        or  a,a
        jp  z,p5
    	add	a,c
    	jp	c,p5
    	ld 	d,a
    	ld	a,b
    	or  a,a
    	jp  z,p5
    	add a,l
    	cp 	#192
    	jp	nc,p5
    	ld 	e,a
    	call	plote
    	; xc+y, yc-x
    	ld 	hl,(xcyc+1)
    p5:	ld	a,c
        or  a,a
        jp  z,p6
    	add	a,h
    	jr	c,p6
    	ld	d,a
    	ld	a,l
    	sub a,b
    	jr	c,p6
    	ld 	e,a
    	call	plote
    	; xc-y, yc-x
    	ld 	hl,(xcyc+1)
    p6:	ld	a,h
    	sub	a,c
    	jr	c,p7
    	ld	d,a
    	ld	a,l
    	sub	a,b
    	jr 	c,p7
    	ld 	e,a
    	call	plote
    	; xc-y, yc+x
    	ld 	hl,(xcyc+1)
    p7:	ld	a,h
    	sub	a,c
    	ret	c
    	ld	d,a
    	ld	a,b
    	or  a,a
    	ret z
    	add	a,l
    	ret	c
    	ld 	e,a
    	call	plote
    	ret
    plote:  ; (C)SATSOFT, Body #07.
    	push	bc
    ;    LD	D,10	;КООРДИНАТА Х
    ;	LD	E,11	;КООРДИНАТА Y
    	LD	A,#0xAF	;РАСЧЕТ АДРЕСА ПО КООРДИНАТАМ
    	SUB	E
    	jp	c,exit
    	LD	E,A
    	AND	A
    	RRA
    	SCF
    	RRA
    	AND	A
    	RRA
    	XOR	A,E
    	AND	#0xF8
    	XOR	A,E
    	LD	H,A
    	LD	A,D
    	RLCA
    	RLCA
    	RLCA
    	XOR	A,E
    	AND	#0xC7
    	XOR	A,E
    	RLCA
    	RLCA
    	LD	L,A
    	LD	A,D	    ;КООРДИНАТА Х
    	AND	#0x07	;МАСКИРОВАНИЕ
    	LD	B,A	    ;ОСТАТОК ОТ ДЕЛЕНИЯ Х НА 8
    	INC	B	    ;+1
    	LD	A,#0xFE	;ВВЕЛИ БАЙТ 11111110
    PLOOP:
        RRCA		;ВРАЩЕНИЕ N+1 РАЗ
    	DJNZ	PLOOP
    	LD	B,#0xFF	;ИНВЕРСИЯ,ЧТОБЫ ПЕЧАТЬ ТОЧКИ БЫЛА ЧЕРНЫМ
    	XOR	A,B	    ;ПО БЕЛОМУ
    	LD	B,A	    ;ЗАПОМНИЛИ В РЕГИСТРЕ 'B'
    	LD	A,(HL)	;В 'А' ГРУЗИМ ЗНАЧЕНИЕ ИЗ ЭКРАНА
    	OR	A,B	    ;ВКЛЮЧЕМ ТРЕБУЕМЫЙ БИТ
    	LD	(HL),A	;ГРУЗИМ В ЭКРАН ПОЛУЧЕННЫЙ РЕЗУЛЬТАТ
    exit:
        pop bc
    	RET		;ВЫХОД ИЗ ПРОЦЕДУРЫ	:)
    
    __endasm;
    }
    Вложения Вложения
    С уважением,
    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

  9. #18

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,681
    Спасибо Благодарностей отдано 
    2,717
    Спасибо Благодарностей получено 
    170
    Поблагодарили
    130 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Как всё-таки можно зафиксить "библейский" алгоритм рисования окружности под OVER 1 ? (см. первый пост темы).

    Скрытый текст

    Код:
    ;--------------------------------------------------
    ;9. Окружность, на входе в HL,127+87*256 (x=127, y=87)
    ;--------------------------------------------------
    
    CIRCLE  LD HL,127+87*256         ;(x=127, y=87)
            LD D,50                  ;r=50
            LD C,0: LD B,D
    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
            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
            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,B: CP C: JR NC,LOOP
            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
    [свернуть]

    Я протестировал его с фиксом, предложенным Destr, - запоминать координаты предыдущей точки и если текущие совпадают с ними, то не рисовать.

    Код:
    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
    WRAP ; fixed for OVER 1 by Destr
            LD HL,#ffff: LD (WRAP+1),BC
            AND A: SBC HL,BC: CALL NZ,#22e5
            POP bc: POP DE: POP HL
            RET
    Не получается. Причина - некоторые (но не все) точки по одним координатам рисуются не подряд.

    Зафиксить бы, братцы, - уж больно процедурка хороша. Компактная такая.
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	BibleCircleFixed.png 
Просмотров:	157 
Размер:	10.3 Кб 
ID:	53658  

  10. #19

    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,867
    Спасибо Благодарностей отдано 
    328
    Спасибо Благодарностей получено 
    311
    Поблагодарили
    235 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    у тебя есть два варианта рисования точек в круге.

    1ый когда количество точек четное
    2ой когда оно нечетное
    в варианте с четным количеством все будет ОК
    в варианте с нечетным последняя точка будет рисоваться 2 раза.
    С уважением,
    Jerri / Red Triangle.

  11. #20

    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,104
    Спасибо Благодарностей отдано 
    1,341
    Спасибо Благодарностей получено 
    323
    Поблагодарили
    152 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Oleg N. Cher, Тупо сделал заплатку.
    Код:
    ;--------------------------------------------------
    ;9. Окружность, на входе в HL,127+87*256 (x=127, y=87)
    ;--------------------------------------------------
    
    CIRCLE  LD HL,127+87*256         ;(x=127, y=87)
            LD D,56                  ;r=50
            LD C,D: LD B,0
            CALL DOT
            LD A,C: NEG: LD C,A: CALL DOT
            LD B,C: LD C,0
            CALL DOT
            LD A,B: NEG: LD B,A: CALL DOT
            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


    ---------- Post added at 23:18 ---------- Previous post was at 23:13 ----------

    JP Z,HLOOP можно поменять на JR Z,HLOOP
    jr DLOOP можно убрать.( тупо отрисуются лишние 8 точек, зато экономия байтов )
    Это по вкусу.

Страница 2 из 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

Ваши права

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