Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

CIRCLE durch PSET ersetzen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Type



Anmeldungsdatum: 24.02.2006
Beiträge: 187
Wohnort: Dresden

BeitragVerfasst am: 24.02.2006, 15:46    Titel: CIRCLE durch PSET ersetzen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Thomas Antoni



Anmeldungsdatum: 12.10.2004
Beiträge: 220
Wohnort: Erlangen

BeitragVerfasst am: 24.02.2006, 17:01    Titel: Dazu habe ich mir Folgendes für die MonsterFAQ vorgemerkt... Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Type



Anmeldungsdatum: 24.02.2006
Beiträge: 187
Wohnort: Dresden

BeitragVerfasst am: 24.02.2006, 20:53    Titel: Hat funktioniert Antworten mit Zitat

Danke! Das hat mir echt geholfen! Jetzt kann ich endlich weiterschreiben! *lechz* zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OdinX



Anmeldungsdatum: 29.07.2005
Beiträge: 253
Wohnort: SG Schweiz

BeitragVerfasst am: 27.02.2006, 15:12    Titel: Antworten mit Zitat

in Antwort 1 ist der Wert von PI nicht richtig.

PI ist 3.1415 (bzw. 3.1416 wenn gerundet)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Thomas Antoni



Anmeldungsdatum: 12.10.2004
Beiträge: 220
Wohnort: Erlangen

BeitragVerfasst am: 27.02.2006, 19:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 27.02.2006, 22:00    Titel: Ein nostalgischer Ausblick... Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz