 |
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 |
REZK
Anmeldungsdatum: 28.10.2004 Beiträge: 109 Wohnort: Stuttgart
|
Verfasst am: 14.10.2005, 19:38 Titel: kreisfläche ausfüllen |
|
|
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 |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 14.10.2005, 19:52 Titel: |
|
|
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
jb |
|
Nach oben |
|
 |
Thomas Antoni

Anmeldungsdatum: 12.10.2004 Beiträge: 220 Wohnort: Erlangen
|
Verfasst am: 14.10.2005, 20:19 Titel: Dazu habe ich mir Folgendes für die MonsterFAQ vorgemerkt... |
|
|
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 |
|
 |
helium

Anmeldungsdatum: 10.09.2004 Beiträge: 397 Wohnort: Leverkusen
|
Verfasst am: 15.10.2005, 17:18 Titel: |
|
|
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 |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
 |
REZK
Anmeldungsdatum: 28.10.2004 Beiträge: 109 Wohnort: Stuttgart
|
Verfasst am: 16.10.2005, 12:34 Titel: |
|
|
danke! _________________ Meine sämtlichen QB Projekte findet ihr hier |
|
Nach oben |
|
 |
Triton

Anmeldungsdatum: 10.09.2004 Beiträge: 155 Wohnort: Berlin
|
|
Nach oben |
|
 |
helium

Anmeldungsdatum: 10.09.2004 Beiträge: 397 Wohnort: Leverkusen
|
Verfasst am: 16.10.2005, 16:57 Titel: |
|
|
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 |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 16.10.2005, 17:41 Titel: |
|
|
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 |
|
 |
|
|
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.
|
|