1

witam
czy zna ktoś szybką procedurę rysowania koła o dowolnym promieniu w Atari Basic?
używałem funkcji sinus i cosinus w przedziale 0-360st, ale to strasznie długo rysuje.

można też z postaci wielomianowej, ale coś mi nie wychodzi...

2

o panu Bresenhamie poczytaj

3

LOL, przeczytałem "rysowanie kota"

:D

I Ty zostaniesz big endianem...

4 Ostatnio edytowany przez seban (2010-01-04 22:46:00)

http://en.wikipedia.org/wiki/Midpoint_circle_algorithm

Miker, rysowanie kota mówisz, dało by się tym:

http://pl.wikipedia.org/wiki/IFS_%28geo … aktalna%29

hi hi hi ;)

pozdr
Seban

5

A tak przekopiowałem ze zrodel Scorcha......

xcircle i ycircle - współrzędne środka

 R=30
 XC=0:YC=R
 FX=0:FY=8*R:FS=4*R+3
 WHILE FX<FY
   splot8    //splot8 are eight plotz around the circle
   XC=XC+1
   FX=FX+8
   IF FS>0
     FS=FS-FX-4
   ELSE
     YC=YC-1
     FY=FY-8
     FS=FS-FX-4+FY
   ENDIF
 WEND

splot8
 plot xcircle+XC,ycircle+YC
 plot xcircle+XC,ycircle-YC
 plot xcircle-XC,ycircle-YC
 plot xcircle-XC,ycircle+YC

 plot xcircle+YC,ycircle+XC
 plot xcircle+YC,ycircle-XC
 plot xcircle-YC,ycircle-XC
 plot xcircle-YC,ycircle+XC
Bla bla bla bla, bla bla bla. Bla bla bla - bla - bla. Blabla bleee.

6

na razie zrobiłem coś takiego i... rysuje wolno jak cholera, popróbuję z innymi procedurami.
step 5 w linii 40 można pominąć, przez to narysuje cały okrąg ale wolniej.

10 gr.8
20 deg
30 input R
40 for i=0 to 360 step 5
50 y=sin(i)*R
60 x=cos(i)*R
70 color 1
80 plot x+150,y+100
90 next i

7

A spróbuj dopisać:

81 plot 150-x,100+y
82 plot 150-x,100-y
83 plot 150+x,100-y

i zapewne okaże się, że mozna liczyc sinus i cosinus tylko dla I ćwiartki układu współrzędnych czyli linia 40 to:

40 for i=0 to 90

8 Ostatnio edytowany przez mono (2010-01-05 18:34:37)

@stRing:

10 R=50
20 S=5
30 X=150
40 Y=100
50 N=90/S
60 DIM DX(N),DY(N)
70 DEG 
80 A=0
90 FOR I=0 TO N
100 DX(I)=R*COS(A)
110 DY(I)=R*SIN(A)
120 A=A+S
130 NEXT I
140 GRAPHICS 8
150 COLOR 1
160 FOR I=1 TO N
170 PLOT X+DX(I-1),Y+DY(I-1)
180 DRAWTO X+DX(I),Y+DY(I)
190 PLOT X-DX(I-1),Y+DY(I-1)
200 DRAWTO X-DX(I),Y+DY(I)
210 PLOT X+DX(I-1),Y-DY(I-1)
220 DRAWTO X+DX(I),Y-DY(I)
230 PLOT X-DX(I-1),Y-DY(I-1)
240 DRAWTO X-DX(I),Y-DY(I)
250 NEXT I

Edit: Jak to BartoszP napisał; poza tym:
1. Wyciągaj ile się da obliczeń poza pętlę.
2. Użyj plot+drawto.
3. Cos(a) to Sin(90+a) więc nie licz dwóch tablic.
4. Licz też sin nie dla ćwiartki a dla jednej ósmej.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

9 Ostatnio edytowany przez Pecus (2010-01-06 09:31:15)

A wkleiłem wcześniej gotowy kod.... co prawda był bez numerów linii i w Turbo Basicu.... ale działał.

Przepisałem więc do zwykłego basica i też działa:

10 GRAPHICS 8:COLOR 1
20 INPUT R
30 XCIRCLE=150:YCIRCLE=100
40 REM 
50 XC=0:YC=R
60 FX=0:FY=8*R:FS=4*R+3
70 REM GLOWNA PETLA
80 GOSUB 200
90 XC=XC+1:FX=FX+8
100 IF FS>0 THEN FS=FS-FX-4:GOTO 120
110 YC=YC-1:FY=FY-8:FS=FS-FX-4+FY
120 IF FX<=FY THEN GOTO 80
130 END 
199 REM PROCEDURA SPLOT
200 PLOT XCIRCLE+XC,YCIRCLE+YC
210 PLOT XCIRCLE+XC,YCIRCLE-YC
220 PLOT XCIRCLE-XC,YCIRCLE-YC
230 PLOT XCIRCLE-XC,YCIRCLE+YC
240 PLOT XCIRCLE+YC,YCIRCLE+XC
250 PLOT XCIRCLE+YC,YCIRCLE-XC
260 PLOT XCIRCLE-YC,YCIRCLE-XC
270 PLOT XCIRCLE-YC,YCIRCLE+XC
280 RETURN

Wszystko liczy się tutaj na liczbach całkowitych, nie ma sinusów, dzieleń itp., mnożenia tylko przez potęgi 2, więc łatwo przerobić na assembler można. A do tego szybkie jest.
Przypomnij sobie twierdzenie Pitagorasa, załóż, że przeciwprostokątna się nie zmienia (promień), zmieniaj jedną z przyprostokątnych od 0 do promienia (współrzędna X np.) i wyliczaj drugą (czyli Y)..... i masz narysowaną 1/4 okręgu. W zasadzie to przyprostokątna może się zmieniać tylko do zrównania się z drugą przyprostokątną - stąd końcowy warunek pętli (bo ta ćwiartka jest także symetryczna i wystarczy odpowiednio stawiać dwa punkty jednocześnie) i masz gotowy algorytm :)

Procedura "splot" jest wyciągnięta na zewnątrz pętli ot tak sobie :), można wstawić te 8 plotów zamiast GOSUB i będzie jeszcze trochę szybciej.

Bla bla bla bla, bla bla bla. Bla bla bla - bla - bla. Blabla bleee.

10

Pecus napisał/a:

co prawda był bez numerów linii i w Turbo Basicu....

Hm, tak na marginesie, przydałoby się napisać instrukcję do "nowych" instrukcji TBXL, ta wiedza chyba jakoś zginęła i ludzie obecnie (poza nielicznymi wyjątkami) nie mają pojęcia o istnieniu w Turbo BASIC-u WHILE/WEND, REPEAT/UNTIL, IF/ELSE/ENDIF, PROC/ENDPROC/EXEC, etykietach itp.

KMK
? HEX$(6670358)

11 Ostatnio edytowany przez mono (2010-01-05 19:25:35)

Gotowy kod dla 1/8:

10 R=50
20 S=5
30 X=150
40 Y=100
50 DEG 
60 N=45/S
70 A=0
80 GRAPHICS 8
90 COLOR 1
100 FOR I=0 TO N
110 DX=R*COS(A)
120 DY=R*SIN(A)
130 DXP=X+DX
140 DXM=X-DX
150 DYP=Y+DY
160 DYM=Y-DY
170 CXP=X+DY
180 CXM=X-DY
190 CYP=Y+DX
200 CYM=Y-DX
210 PLOT DXP,DYP
220 PLOT DXM,DYP
230 PLOT DXP,DYM
240 PLOT DXM,DYM
250 PLOT CXP,CYP
260 PLOT CXM,CYP
270 PLOT CXP,CYM
280 PLOT CXM,CYM
290 A=A+S
300 NEXT I

Edit: Pecus mnie uprzedził - jego procedura jest lepsza :) i pewnie szybsza.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

12

Gotowy kod w Turbo Basicu XL:

CIRCLE X,Y,R
Hitler, Stalin, totalniak, SSman, NKWDzista, kaczor dyktator, za długo byłem w ChRL, wypowiadam się afektywnie.

13 Ostatnio edytowany przez seban (2010-01-05 20:51:29)

epi napisał/a:

Gotowy kod w Turbo Basicu XL

ale chodziło chyba o Atari Basic?

stRing napisał/a:

czy zna ktoś szybką procedurę rysowania koła o dowolnym promieniu w Atari Basic?

14

Jasne, to była tylko kontynuacja lekkiego offtopiku. :)

Hitler, Stalin, totalniak, SSman, NKWDzista, kaczor dyktator, za długo byłem w ChRL, wypowiadam się afektywnie.

15 Ostatnio edytowany przez seban (2010-01-06 11:06:16)

Epi... fakt :) ... od postu Mikey-a jest jedyne słuszne rozwiązanie, potem podane z wiki a potem na tacy przez Pecusia :) Więc nie wiem po co mieszać do tego sin/cos :)

Jedyne co można by zrobić dla prędkości to napisać to w asm i rzuć na "szóstą stronę" i wywoływać jako USR. Jeżeli do tego zrobić własnego plot-a to będzie śmigać ;)

16

W assemblerze i z wlasnym plotem jest to na tyle szybkie, ze w Scorchered Earth sa ta procedura robione eksplozje (rysowanie okregow o zwiekszajacym sie promieniu, a potem czyszczenie o zmniejszajacym)

Bla bla bla bla, bla bla bla. Bla bla bla - bla - bla. Blabla bleee.

17 Ostatnio edytowany przez seban (2010-01-06 08:47:09)

w demie Overmind rysowałem tą metodą kilkanaście okręgów w ramkę ;) także to naprawdę jest szybkie o ile się da użyć fixed-point :) W przypadku BASIC-a cała para idzie w gwizdek trochę - bo każda liczba jest Floating-Point :( Jednak wydaje mi się iż to będzie szybsze niż rysowanie klasyczną metodą używającą sin/cos. Action! by się idealnie nadawało do tego jak ktoś nie chce używać ASM :)

18

Bresenham jest najszybszy i najdokładniejszy.

Chyba w Bajtku był artykuł o optymalizacji rysowania okręgu - zaczęto od sin+cos, później wykorzystano symetrię, a później równanie okręgu (pętla FOR po X z krokiem 3, wyliczanie Y, DRAWTO).

https://www.youtube.com/watch?v=jofNR_WkoCE

19

czy turbobejowe circle jest szybsze od tego skryptu ?

___
Press play on tape...

20

dzięki za pomoc, na razie jestem w robocie i nie mogę sobie programować, ale przeanalizuję Wasze propozycje i wklepie je w domu.

teraz już wiem, że jakby trzeba było narysować okręg w jak najdłuższym czasie to tylko z sinusami :) kombinowanie z wielomianem x2+y2=r2, czyli de facto z trójkątem wydaje się być ciekawsze i szybsze.

21

Tu jest trochę teorii wraz z algorytmami: http://januszg.hg.pl/teksty/index.html

Zwróć też uwagę na to, że w różnych trybach może być konieczne zastosowanie współczynnika zwężenia/spłaszczenia okręgu aby skompensować różną szerokość/wysokość piksla...czyli trzeba w efekcie rysować elipsę.

22

maw napisał/a:

czy turbobejowe circle jest szybsze od tego skryptu ?

Jest trochę szybsze, ale (moim zdaniem) rysuje brzydsze okręgi.. Ale najbrzydsze i tak rysuje Basic na ZX Spectrum :)

Bla bla bla bla, bla bla bla. Bla bla bla - bla - bla. Blabla bleee.

23 Ostatnio edytowany przez Pin (2010-01-07 11:25:45)

maw napisał/a:

czy turbobejowe circle jest szybsze od tego skryptu ?

a chyba kilkaset razy ;)-

Najlepszą modyfikacją AtariBasic jest zastąpienie tegoż poprzez Turbo-Basic XL :)

Pecuś: Na czym polega "brzydszy okrąg"? - czy jest w kształcie "odwróconego koła"? :D:P

Kontakt: pin@usdk.pl

24 Ostatnio edytowany przez Pecus (2010-01-07 12:10:46)

Pin jak zawsze nie sprawdzi i pisze :P

Otóż napisałem specjalnie program (fakt że w Turbo Basicu, ale akurat w tym przypadku dużo szybszy od zwykłego Basica nie jest), który to porównuje.
Masz na obrazku dwa okręgi, zgadnij, który wyrysowała instrukcja Circle, a który podana przeze mnie wcześniej procedura.
Pod spodem masz czasy 20-to krotnego wykonania się procedury, oraz tyle samo razy instrukcji Circle (jednostka czasu to oczywiście tyknięcie zegara (instrukcja TIME z Turbo Basica).

http://dl.dropbox.com/u/1756153/atari_circle.gif

Czyli co..... troszke ponad 3,6 raza szybsze jest Circle :P

Bla bla bla bla, bla bla bla. Bla bla bla - bla - bla. Blabla bleee.

25 Ostatnio edytowany przez ilmenit (2010-01-07 12:35:11)

Jak chodzi o podstawowe procedury graficzne, to biblioteka TGI dla CC65 ma całkiem fajne. Polecam obejrzeć tgi-preview.zip ze strony http://atari.isgreat.org
Odpalać z ATR, bo na nim ma zapisane ładowane sterowniki do tego trybu graficznego.
Ma też wektorowe fonty :)

Ponieważ są problemy z dostępem do tej strony, plik wrzuciłem na:
http://alamak0ta.republika.pl/tgi-preview.atr