 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Type
Anmeldungsdatum: 24.02.2006 Beiträge: 187 Wohnort: Dresden
|
Verfasst am: 24.02.2006, 15:46 Titel: CIRCLE durch PSET ersetzen |
|
|
Hallo Leute,
bin neu hier...
Ich möchte den Befehl CIRCLE mit PSET "nachstellen", also wenn X, Y und der RADIUS gegeben sind. Ich bräuchte dafür ja dann eine Formel bzw. Routine.
Leider fällt mir nichts ein die Forensuche hat mir 'nen Interessanten Quelltext gezeigt, leider gibt es keinen geschlossenen Rahmen, wenn ich versuche das Progamm auf PSET umzuschreiben.
Code: |
'*************************************************************
' KREISFUL.BAS = Kreis mit Farbe fuellen ohne PAINT und DRAW
' ============
' Dieses Q(uick)Basic-Programm fuellt einen Kreis mit Farbe
' ohne den naheliegenden PAINT oder DRAW-Befehl zu verwenden.
' Das Faellen wird durch das Ziehen waagerechter farbiger
' Linien bewerkstelligt. Ein Zeichnen des Kreises selbst
' mit dem CIRCLE-Befehl ist nicht erforderlich
'
' (c) Helium, 14.10.2005 ]
'*************************************************************
'
SCREEN 12
SLEEP
mx = 100 'x-Koordinate des Kreis-Mittelpunkts
my = 150 'y-Koordinate des Kreis-Mittelpunkts
radius = 80
farbe = 4 'rot
radiusSqr = radius * radius
FOR y = my - radius TO my + radius
x = SQR(radiusSqr - (y - my) * (y - my))
LINE (mx - x, y)-(mx + x, y), farbe
PSET (mx - x, y) 'Das hab ich reineditiert
PSET (mx + x, y) 'Das hab ich reineditiert
NEXT
SLEEP
|
Ich hoffe, ihr habt die Problematik einigermaßen verstanden.
Danke! - Schonmal im Voraus
MfG - Type |
|
Nach oben |
|
 |
Thomas Antoni

Anmeldungsdatum: 12.10.2004 Beiträge: 220 Wohnort: Erlangen
|
Verfasst am: 24.02.2006, 17:01 Titel: Dazu habe ich mir Folgendes für die MonsterFAQ vorgemerkt... |
|
|
Dazu habe ich mir Folgendes für die QB-MonsterFAQ vorgemerkt...
Frage deutsch
~~~~~~~~~~~~~~~
Wie zeichne ich einen Kreis ohne CIRCLE?
Question English
~~~~~~~~~~~~~~~
Hoe to draw a circle without using the CIRCLE statment?
Antwort 1
~~~~~~~~
[ von Stephan im QB-Forum, 22.4.03 - 4.3.05 ]
Das geht so:
Code: |
SUB xcircle (x, y, radius)
FOR n = 0 TO 2*3.1419 'von 0 - 2*PI entspr. 0 - 360 Grad im Bogenmass
x0 = x + (SIN(n) * radius)
y0 = y + (COS(n) * radius)
PSET (x0, y0), 15
NEXT n
END SUB
|
Antwort 2
~~~~~~~~
[ von Weazel ( weazel77@gmx.de ) und Matthias Hecht ( matthias.jf.hecht@web.de ) im QB-Forum, 22.4.03 ]
Benutze statt SIN und COS lieber die Bresenham Kreis-Routine. Ich glaube nämlich, das ist die, die in Qbasic benutzt wird, denn sie benutzt nicht Sinus und Cosinus, sondern irgendwas mit rechtwinkligen Dreiecken (Pythagoras) und das ist ziemlich schnell.
Ich hab' mir für meine Assembler-LIB etwas überlegt. Ich nahm den Satz des Pythagoras: (a²+b²=c²) Die Länge der Hypotenuse muss
gleichlang wie der Radius des Kreises sein. Wenn wir also die länge der Hypothenuse (c) wissen kann man die Formel umformen: c²-a²=b² oder c²-b²=a². Nun muss man für b einfach alle Zahlen von 0 bis Radius\2 und für a alle von radius\2 bis radius durchgehen:
Ein QBasic-Beispiel:
Code: |
SCREEN 12
x = 100'x-Koordinate des Kreismittelpunktes
y = 100'y-Koordinate " "
radius = 50'Radius des Kreises
'
FOR a = 0 TO radius
punkt = (y - SQR((radius ^ 2) - (a ^ 2)))
'Errechnung der y-Koordinate
PSET (x + a, punkt), 15
NEXT a
'
FOR b = 0 TO radius
punkt = (x + SQR((radius ^ 2) - (b ^ 2))) \ 1
'Errechnung der x-Koordinate
PSET (punkt, y - b), 15
NEXT b
|
PS: Vielleicht ist diese Routine noch langsamer als die mit dem SINUS und dem COSINUS. Ich hab' sie noch nicht getestet...
PSS: Ich hoffe Du hast meinen Gedankengang verstanden!
Antwort 3
~~~~~~~~~
[ von greenbit ( info@greenbit.ch - www.greenbit.ch ) im QB-Forum, 22.4.03 ]
Durch das Programm in Antwort 1 werden genau 360 Pixel gezeichnet was z. B. bei einem Kreis mit Radius 200 Pixel zu Unterbrechungen führt. Man kann zwar die Anzahl der Pixel auf der Kreislinie berechnen (Pi * 2 * r), aber eine schön 1 Pixel dicke Kreislinie gibt's nur mit dem Bresenham Algorithmus. Ich habe ein Beispiel im Internet gefunden, es verbessert und in QB umgeschrieben:
Code: |
SUB kreis (xpos, ypos, radius)
'
x = 0: y = radius: p = 3 - radius * 4
'
DO
PSET (xpos - x, ypos - y)
PSET (xpos + x, ypos - y)
PSET (xpos - x, ypos + y)
PSET (xpos + x, ypos + y)
PSET (xpos - y, ypos - x)
PSET (xpos + y, ypos - x)
PSET (xpos - y, ypos + x)
PSET (xpos + y, ypos + x)
'
IF p < 0 THEN
p = p + x * 4 + 6
ELSE
p = p + (x - y) * 4 + 12
y = y - 1
END IF
'
x = x + 1
LOOP UNTIL x > y
'
END SUB
|
Antwort 4
~~~~~~~~~~~
[ von Helium ( m.beckah@gmx.de ) im QB-Forum, 21.7.2003 ]
Die schnelle Variante mit dem Bresenham-Algorithmus ohne Verwendung von SIN und COS funktioniert nach dem folgenden Rezept:
Code: |
screen 12
Function BresenhamCircle(XPos, YPos, Radius)
dim X, Y, P
X = 0 : Y = Radius : P = 3 - (Radius Shl 2)
'
While X < Y
Pset XPos - X,YPos - Y, 15
Pset XPos + X,YPos - Y, 15
Pset XPos - X,YPos + Y, 15
Pset XPos + X,YPos + Y, 15
Pset XPos - Y,YPos - X, 15
Pset XPos + Y,YPos - X, 15
Pset XPos - Y,YPos + X, 15
Pset XPos + Y,YPos + X, 15
If P < 0 Then
P = P + (X * 4) + 6
Else
P = P + ((X - Y) * 4) + 12
Y = Y - 1
EndIf
X = X + 1
Wend
If X = Y Then
Pset XPos - X,YPos - Y, 15
Pset XPos + X,YPos - Y, 15
Pset XPos - X,YPos + Y, 15
Pset XPos + X,YPos + Y, 15
EndIf
End Function
|
Antwort 5
~~~~~~~~~~~
[ von Thomas Antoni, 17.10.2003 ]
Im ABC-Archiv fand ich unter www.basicguru.com/abc/algor.htm das folgende Programm von Kurt Kuzba, das einen Kreis mit dem Mittelpunkt P1(x%|y%), dem Radius r% und der Randfarbe c% auf den Bildschirm zeichnet. Über die Variablen wide% und high% kann der Kreis gedehnt oder gestaucht werden. Damit kann man Ellipsen malen oder die unterschiedlichen Seitenverhältnisse des QBasic-SCREENs und des tatsächlichen Bildschirms ausgleichen.
Code: |
'******************************************************
' CIRCLE1.BAS = Einen Kreis zeichnen ohne CIRCLE
' =========== Bresenham Circle Drawing Algorithm
'
' Dieses QBasic-Programm zeichnet einen Kreis mit
' dem Bresenham-Algorithmus.
'
' (c) by Kurt Kuzba
' Adapted from BRESNHAM.C in Bob Stout's SNIPPETS.
'******************************************************
DECLARE SUB BCircle (xc%, yc%, r%, c%)
SCREEN 9
CLS
wide% = 2 'Breite 200% (gestreckter Kreis)
high% = 1 'Höhe 100%
CALL BCircle(320, 175, 80, 14)
'Kreis um den Mittelpunkt (320,175) mit dem Radius 80
'und der Randfarbe gelb=14
SLEEP
'
SUB BCircle (xc%, yc%, r%, c%)
SHARED wide%, high%
x% = 0: d% = 2 * (1 - r%): W% = 2 * wide% \ high%
WHILE r% >= 0
PSET (xc% + x%, yc% + r%), c%
PSET (xc% + x%, yc% - r%), c%
PSET (xc% - x%, yc% + r%), c%
PSET (xc% - x%, yc% - r%), c%
IF (d% + r%) > 0 THEN r% = r% - 1: d% = d% - W% * r% - 1
IF x% > d% THEN x% = x% + 1: d% = d% + 2 * x% + 1
WEND
END SUB
|
_________________ +++ Die beliebte QBasic CD-ROM von QBasic.de - 670 MB QBasic-Stuff mit komfortabler HTML-Oberfläche. Für nur 5 EUR bestellbar auf www.antonis.de/qbcdueb.htm +++ |
|
Nach oben |
|
 |
Type
Anmeldungsdatum: 24.02.2006 Beiträge: 187 Wohnort: Dresden
|
Verfasst am: 24.02.2006, 20:53 Titel: Hat funktioniert |
|
|
Danke! Das hat mir echt geholfen! Jetzt kann ich endlich weiterschreiben! *lechz*  |
|
Nach oben |
|
 |
OdinX

Anmeldungsdatum: 29.07.2005 Beiträge: 253 Wohnort: SG Schweiz
|
Verfasst am: 27.02.2006, 15:12 Titel: |
|
|
in Antwort 1 ist der Wert von PI nicht richtig.
PI ist 3.1415 (bzw. 3.1416 wenn gerundet) |
|
Nach oben |
|
 |
Thomas Antoni

Anmeldungsdatum: 12.10.2004 Beiträge: 220 Wohnort: Erlangen
|
Verfasst am: 27.02.2006, 19:45 Titel: |
|
|
Zitat: | PI ist 3.1415 (bzw. 3.1416 wenn gerundet) |
Danke für den Hinweis. Ich habs in meiner MonsterFAQ-Arbeitsversion schon bereinigt _________________ +++ Die beliebte QBasic CD-ROM von QBasic.de - 670 MB QBasic-Stuff mit komfortabler HTML-Oberfläche. Für nur 5 EUR bestellbar auf www.antonis.de/qbcdueb.htm +++ |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 27.02.2006, 22:00 Titel: Ein nostalgischer Ausblick... |
|
|
Da ich ja seinerzeit mit dem Commodore 64 startete: Dort gab es noch keinerlei Grafikbefehle, sondern man musste alles mittels PEEK() und POKE selber erledigen. Aus Geschwindigkeitsgründen wurde seinerzeit das Meiste mit Assembler realisiert; dort war man logischerweise auf solche Algorithmen auf reiner Integerarithmetik wie der hier vorgestellte Bresenham-Algorithmus voll angewiesen, damit die Kreisroutine entsprechend schnell arbeitete. Aber auch in BASIC hatte man damals seine Kreisroutine ähnlich wie hier gezeigt realisiert. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|