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:

kreisfläche ausfüllen

 
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
REZK



Anmeldungsdatum: 28.10.2004
Beiträge: 109
Wohnort: Stuttgart

BeitragVerfasst am: 14.10.2005, 19:38    Titel: kreisfläche ausfüllen Antworten mit Zitat

hallo,

ich bin gerade dabei ein einfaches 2d Spiel zu programmieren. Nun will ich einen Kreis mit Farbe ausfüllen. Da der Hintergrund nicht gleichmäßig ist, kann ich nicht PAINT verwenden.

Also habe ich folgende Konstruktion verwandt


screen 12
for a= 1 to 50
circle (100,100),a
next a

Leider ist der Kreis jetzt durch viele "Störpunkte" verunstaltet, die ich zeitaufwändig entfernen muss.


Gibt es eine einfachere Lösung, die einfach einen Kreis erzeugt, der mit der gleichen Farbe ausgefüllt ist, die auch die "äußere" Umrahmung des Kreises hat. Irgendwie mit der Sinus Funktion und Line?

Danke im voraus,

REZK
_________________
Meine sämtlichen QB Projekte findet ihr hier
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 14.10.2005, 19:52    Titel: Antworten mit Zitat

Lass doch eine Linie um den Mittelpunkt rotieren.

Code:

SUB Kreis(x AS INTEGER, y AS INTEGER, r AS INTEGER, f AS INTEGER)

 DIM PI AS DOUBLE, w AS DOUBLE
 PI = 4 * ATN(1)

  FOR w = 0 TO 2 STEP .001
   
   winkel = PI * w
   
   xneu = x + COS(winkel) * r
   yneu = y + SIN(winkel) * r

   LINE(x, y)-(xneu, yneu), f

  NEXT w

END SUB


Man sollte vielleicht nur noch die Trigonomitrietabellen vorzeitig berechnen, um mehr Speed rauszukitzeln.

/EDIT: Jetzt hab ich ca 5mal ge-editet, und jetzt stimmt der Code, wenngleich er auch recht langsam ist peinlich

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Thomas Antoni



Anmeldungsdatum: 12.10.2004
Beiträge: 220
Wohnort: Erlangen

BeitragVerfasst am: 14.10.2005, 20:19    Titel: Dazu habe ich mir Folgendes für die MonsterFAQ vorgemerkt... Antworten mit Zitat

Dazu habe ich mir Folgendes für die MonsterFAQ vorgemerkt:

---------------------------------------------------------------------------------

Frage deutsch
~~~~~~~~~~~~~~~~
Wie fülle ich ein Dreieck oder einen Kreis mit Farbe?


Question English
~~~~~~~~~~~~~~~~
How to fill a triangle or a circle with a color?


Antwort
~~~~~~~~~~~~~~~~
[ von verschiedenen Teilnehmern im QB-Forum, 5.2005 - 10.2005 ]

*** Mit PAINT

Das folgende Programm zeichent ein Dreieck mit den Punkten (10 | 10). (100 | 10)
und (10 |100). Wichtig ist, dass die im PAINT-Befehl angegebenen Koordinaten im Dreieck liegen

SCREEN 12
LINE(10,10)-(100,10)
LINE (10,10)-(10,100)
LINE (10,100)-(100,10)
PAINT(15,15)

Und dieses Programm füllt einen Kreis mit der Randfarbe rot aus:

SCREEN 12
CIRCLE (100, 100), 50, 4
'Kreis mit den Mittelpunkt (100), Radius 50 und Randfarbe rot (=4)
PAINT (100, 100), 4
'Flaeche ausgehend vom Mittelpunkt rot ausmalen bis die
'Randlinie erreicht wird




*** Mit DRAW

Mann kann statt PAINT auch den DRAW-Befehl verwenden:

Beispiel für das Ausfüllen eines Dreiecks

SCREEN 12
Color 14
Line (200,200)-(100,100)
Line (100,100)-(300,200)
Line (200,200)-(300,200) 'zeichnet das Dreieck
Draw "BM 150,150" ' rückt den Cursor der Draw-Anweisung an die Position 150, 150.
Draw "P 9, 14" ' Befehl zum Ausfüllen des Dreiecks

P = Anweisung zum Ausfüllen
9 = die Farbe, mit der das Dreieck ausgefüllt werden soll, also dunkelblau
14 = die Umrandungsfarbe des Dreiecks, also die Farbe, bis zu der die Figur von innen heraus ausgefüllt werden soll.


*** Mit Einzellinien

Auf Dreaels Webseite gibt es ein Funktionsplotterprogramm unter

www.hofen.ch/~andreas/Deutsch/Download/Funktionsdarstellung.html

Dort ist sonst eine spezielle SUB-Routine ZeiDreieck() für gefüllte Dreiecke enthalten,
welche auf horizontale Linien basiert


--------------------------------------------------------------------------------
_________________
+++ 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
helium



Anmeldungsdatum: 10.09.2004
Beiträge: 397
Wohnort: Leverkusen

BeitragVerfasst am: 15.10.2005, 17:18    Titel: Antworten mit Zitat

Probiers mal hiermit:
Kreis von oben nach unten durchlaufen und jeweils berechnen, von wo bis wo in der Zeile ne Linie gezogen werden muss.
Code:

sub DrawFilledCircle (xm, ym, radius, col)

radiusSqr = radius * radius

FOR y = my - radius TO my + radius
   x = SQR(radiusSqr - (y - my) * (y - my))

   LINE (mx - x, y)-(mx + x, y), col

NEXT

end sub

_________________
Bevor Sie aufhören sich körperlich zu betätigen sollten Sie ihren Doktor befragen. Körperliche Inaktivität ist abnormal und gefährlich für Ihre Gesundheit.


Zuletzt bearbeitet von helium am 16.10.2005, 11:18, insgesamt 3-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


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

BeitragVerfasst am: 15.10.2005, 17:28    Titel: Antworten mit Zitat

Mathematik ist hier das Zauberwort, Basis Kreisgleichung und Satz des Pythagoras. Dazu das Beispiel Billardsimulation unter

http://www.dreael.ch/Deutsch/Download/Billard-Simulation.html

genauer anschauen - dort habe ich das Problem des gefüllten Kreises mit horizontalen Linien gelöst.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
REZK



Anmeldungsdatum: 28.10.2004
Beiträge: 109
Wohnort: Stuttgart

BeitragVerfasst am: 16.10.2005, 12:34    Titel: Antworten mit Zitat

danke!
_________________
Meine sämtlichen QB Projekte findet ihr hier
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Triton



Anmeldungsdatum: 10.09.2004
Beiträge: 155
Wohnort: Berlin

BeitragVerfasst am: 16.10.2005, 15:47    Titel: Antworten mit Zitat

for x = 1 to 50
for y = 1 to 50
abstand zu 25,25 ermitteln
if abstand < r-kreis plot x,y
next
next

Zum Thema mit den Dreiecken:
http://www.silizium-net.de/bbcodeb5.htm

Ist zwar bb, lässt sich aber leicht portieren.
_________________
Coding: silizium-net.de | Portfolio: Triton.ch.vu
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
helium



Anmeldungsdatum: 10.09.2004
Beiträge: 397
Wohnort: Leverkusen

BeitragVerfasst am: 16.10.2005, 16:57    Titel: Antworten mit Zitat

Zitat:
for x = 1 to 50
for y = 1 to 50
abstand zu 25,25 ermitteln
if abstand < r-kreis plot x,y
next
next

Das prinzip hatte ich auch ausprobiert, ist aber in QB viel langsamer, als meine andere Variante.
_________________
Bevor Sie aufhören sich körperlich zu betätigen sollten Sie ihren Doktor befragen. Körperliche Inaktivität ist abnormal und gefährlich für Ihre Gesundheit.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


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

BeitragVerfasst am: 16.10.2005, 17:41    Titel: Antworten mit Zitat

Der Algorithmus in meiner Billard-Simulation beruht mathematisch auf dem selben Prinzip wie Tritons Variante, ausser dass ich die Ungleichung (Liegt der Pixel in der Kreisfläche oder nicht?) in eine Funktion überführt habe. Ist in diesem speziellen Fall eine Wurzelfunktion (fehlende Kathete in einem rechtwinkligen Dreieck berechnen).

Codeausschnitt aus BILL_SI2.BAS:
Code:
  yo! = my! - Ra!(n%)
  yu! = my! + Ra!(n%)
  y1% = CINT(INT(yo!))
  y2% = CINT(INT(yu!))
  FOR y% = y1% + 1 TO y2%
    yh! = CSNG(y%)
    h! = SQR((yh! - yo!) * (yu! - yh!)) * kf!
    x1% = CINT(mx! - h!)
    x2% = CINT(mx! + h!)
    IF x2% > x1% THEN
      LINE (x1% + 1, y%)-(x2%, y%), , BF
    END IF
  NEXT y%

Hinweis: Hatte seinerzeit das Ganze bereits möglich gut zeitoptimiert - sprich Anzahl benötigte Math-Coprozessor-Operationen auf das Minimum reduziert. Bei der Billardsimulation war noch die Berücksichtigung der Kommastellen wichtig, sonst wäre die Animation einer sich relativ langsam bewegenden Kugel nicht so geschmeidig.
_________________
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