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ć.
SillyVenture 2025SE - nowe wiadomości Ruszyła sekcja regulaminów i uploadu prac. Zaktualizowano regulamin i dodano nową kategorię muzyczną
Doom8088 dla Atari ST Nowy port Dooma na Atari ST bazuje na wersji dla 8088 i wspiera tylko pierwszy epizod
Altirra 4.40 test 13 z Floppy Board Nowa wersja testowa Altirry dodaje wsparcie dla Black Box Floppy Board
Piszemy grę - część 3. już 17 czerwca Trzeci odcinek kursu tworzenia gier na Atari 8-bit będzie o rysowaniu postaci.
Wee Ninja - również na Atari 8-bit! Gra Wee Ninja dostępna także dla Atari 8-bit z 48K RAM - najlepiej z Joy 2B+
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.230 sekund, wykonano 8 zapytań