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...
Nie jesteś zalogowany. Proszę się zalogować lub zarejestrować.
Zmarł twórca języka BASIC Zmarł Thomas E. Kurtz twórca języka BASIC
Zmiana serwera atari.area Serwis przeszedł właśnie ważną aktualizację infrastruktury
4th Atari ASCII Compo - wyniki Dostępne są już wyniki tegorocznego ATASCII Compo.
thing neo 1.60 Olivier Landemarre wydał nową wersję desktopu Thing.
VIII. Basque Tournament of Atari 2600 Kolejna relacja, wśród otrzymywanych od naszego przyjaciela Egoitza z Kraju Basków.
atari.area forum » Programowanie - 8 bit » rysowanie koła
Zaloguj się lub zarejestruj by napisać odpowiedź
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...
o panu Bresenhamie poczytaj
LOL, przeczytałem "rysowanie kota"
:D
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
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
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
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
@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.
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.
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.
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.
Gotowy kod w Turbo Basicu XL:
CIRCLE X,Y,R
Gotowy kod w Turbo Basicu XL
ale chodziło chyba o Atari Basic?
czy zna ktoś szybką procedurę rysowania koła o dowolnym promieniu w Atari Basic?
Jasne, to była tylko kontynuacja lekkiego offtopiku. :)
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ć ;)
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)
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 :)
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).
czy turbobejowe circle jest szybsze od tego skryptu ?
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.
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ę.
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 :)
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
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).
Czyli co..... troszke ponad 3,6 raza szybsze jest Circle :P
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
Zaloguj się lub zarejestruj by napisać odpowiedź
atari.area forum » Programowanie - 8 bit » rysowanie koła
Wygenerowano w 0.032 sekund, wykonano 65 zapytań