Pixel in einem Kreis

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

aMul

Sieger des Minimalist Compo 01/13

Betreff: Pixel in einem Kreis

BeitragSa, Jan 21, 2006 12:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
Ich bin gerade dabei mir einen kleinen 2D-Shooter zu programieren, und da soll die Landschaft komplett zerstörbar sein.

Und da wollte ich fragen, wie man feststellt, welche Pixel in einem Kreis (z.B. um eine Explosion) liegen.

Schon mal im voraus THX für alle Antworten.

MfG
aMul
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

BtbN

BeitragSa, Jan 21, 2006 12:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Sin/Cos + 2 for-Schleifen

Erklärung:
Die eine For-Schleife(Die äußere) geht von 0 bis 359 durch, die andere(innere) von 0 bis zum Radius deines Kreises, nun kannst du mist Sinus und Cosinus den Pixel berechnen, auf dem du gerade bist.

aMul

Sieger des Minimalist Compo 01/13

BeitragSa, Jan 21, 2006 12:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, werd ich gleich mal ausprobiern.

MfG
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

SpionAtom

BeitragSa, Jan 21, 2006 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder wenn du einen einzelnen Punkt hast, von dem du wissen möchtest, ob er im Kreis liegt, nimm diese Abstandsformel:

Code: [AUSKLAPPEN]

     mx, my ;Mitelpunktskooridnaten des Kreises
     radius ;Radius des Kreises
     px,py  ;Punkt der überprüft wird

     If radius^2 < (mx - px)^2 + (my - py)^2 Then
        ;Punkt liegt im Kreis
        ;.....
     End If
 

Steffen

BeitragSa, Jan 21, 2006 13:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

BORNtobeNAMELESS hat Folgendes geschrieben:
Sin/Cos + 2 for-Schleifen

Erklärung:
Die eine For-Schleife(Die äußere) geht von 0 bis 359 durch, die andere(innere) von 0 bis zum Radius deines Kreises, nun kannst du mist Sinus und Cosinus den Pixel berechnen, auf dem du gerade bist.


Das ist eine schlechte Lösung. Wenn du z.B. 1 Grad Schritte machst, dann wird auf den inneren Ringen jedes Pixel mehrfach geprüft. Das ist unnötiger Rechenaufwand. Bei einem großen Kreis gibt es außen Lücken, wenn der Umfang größer ist, als 360 Pixel.
Außerdem musst du bei jedem Pixel sin/cos ausrechnen, was langsam ist.
Hier die bessere Lösung, die jeden Pixel genau einmal trifft und weniger sin/cos Berechnungen kostet(nicht getestet):
Code: [AUSKLAPPEN]

;r=radius in Pixeln
;mx=x-Koordinate des Mittelpunktes
;my=y-Koordinate des Mittelpunktes
for i=0 to r
    w#=acos#(i/r) ;Winkel
    k=sin#(w#)*r
    for j=0 to k
        machwas(mx+i,my+j)
        machwas(mx+i,my-j)
        machwas(mx-i,my+j)
        machwas(mx-i,my-j)
    next
next


Das macht 2*r sin/cos-Aufrufe. Bei der Methode oben sind es 720*r.
Die 4 Aufrufe sind für die Pixel in den 4 Quadranten. Man könnte daraus auch 1 Aufruf machen, das wären dann allerdings 4x mehr sin/cos-Berechnungen und Schleifendurchläufe.
>PC: Pentium III 750MHz, ATI Rage 128 mit 32Mb, Windows Me, Blitz3D 1.87
>Laptop: Pentium M 1,4GHz, 512 Mb DDR, ATI Mobility Radeon 9000 mit 64Mb DDR, Windows XP Home, Blitz3D 1.87

Triton

BeitragSa, Jan 21, 2006 15:16
Antworten mit Zitat
Benutzer-Profile anzeigen
...trotzdem unnötig Kompliziert.

SpionAtoms Lösung ist die einzig vernünftige.
Coding: silizium-net.de | Portfolio: Triton.ch.vu

aMul

Sieger des Minimalist Compo 01/13

BeitragSa, Jan 21, 2006 15:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Also funktionieren tun beide Lösungen sehr schnell, aber ich nehm wahrscheinlich die von SpionAtom, weil das die einzige ist, die ich kapier:P

MfG
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

aMul

Sieger des Minimalist Compo 01/13

BeitragSa, Jan 21, 2006 17:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Nochmal Danke an euch alle, klappt jetzt hervorragend.

Hab aber noch ne andere Frage:
Gibt es eine Möglichkeit, die Pixel einer "gedachten" Linie zwischen zwei bekannten Punkten zu ermitteln?

MfG
aMul


EDIT:
Frage hat sich geklärt, hab ne bessere Lösung gefunden.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver
 

Steffen

BeitragSa, Jan 21, 2006 18:06
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Triton: Meiner Ansicht nach ist das, was wir geschrieben haben genau die Antwort auf die Frage. Er wollte eine Methode, um alle Pixel rauszufinden, die im Kreis liegen und nicht eine, dieprüft, ob ein Pixel im Kreis liegt.
Zitat:
Und da wollte ich fragen, wie man feststellt, welche Pixel in einem Kreis (z.B. um eine Explosion) liegen.

Und genau diese Frage haben wir beantwortet. Wenn er sin/cos nicht kann, ist das nicht unsere Schuld.

Beweiscode, dass alle Punkte im Kreis ermittelt werden:
Code: [AUSKLAPPEN]
Graphics 1024, 768
Color 255,255,255

mx=512
my=384
r=384
for i=0 to r
    w#=ACos#(Float(i)/r) ;Winkel
    k=sin#(w#)*r
    for j=0 to k
        WritePixel mx+i,my+j,255
        WritePixel mx+i,my-j,255
        WritePixel mx-i,my+j,255
        WritePixel mx-i,my-j,255
    Next
Next

WaitKey


Und die Methode von BORNtobeNAMELESS Lücken erzeugt:
Code: [AUSKLAPPEN]

Graphics 1024, 768
Color 255,255,255

mx=512
my=384
r=384
For i=0 To 359
    For j=0 To r
        WritePixel mx+Sin(i)*j,my+Cos(i)*j,255
    Next
Next

WaitKey


Mit dem Pythagoras müsste man alle Pixel in einem Quadrat(2r*2r Pixel) prüfen. Und ich glaube kaum, dass das schnell ist.
>PC: Pentium III 750MHz, ATI Rage 128 mit 32Mb, Windows Me, Blitz3D 1.87
>Laptop: Pentium M 1,4GHz, 512 Mb DDR, ATI Mobility Radeon 9000 mit 64Mb DDR, Windows XP Home, Blitz3D 1.87

SpionAtom

BeitragSa, Jan 21, 2006 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
---WEGEDIT 1. Teil, weil ich was falsch verstanden habe ----


Diesen tollen Bresenham-Algorithmus (ja, seit dem sinnlosen Thread Evil or Very Mad weiter unten im Forum, wissen wir alle, wie man Algorithmus schreibt)
habe ich noch gefunden, der ganz ohne Sinus und Kosinus einen Kreis zeichnet. Er lässt sich leicht so umschreiben, dass er einen ausgefüllten Kreis zeichnet.

Code: [AUSKLAPPEN]

Function Kreis(XPos,YPos,Radius)

Local X,Y,P
X = 0 : Y = Radius : P = 3 - (Radius Shl 2)

While X < Y
Plot XPos - X,YPos - Y
Plot XPos + X,YPos - Y
Plot XPos - X,YPos + Y
Plot XPos + X,YPos + Y
Plot XPos - Y,YPos - X
Plot XPos + Y,YPos - X
Plot XPos - Y,YPos + X
Plot XPos + Y,YPos + X

If P < 0 Then
P = P + (X Shl 2) + 6
Else
P = P + ((X - Y) Shl 2) + 12
Y = Y - 1
EndIf

X = X + 1
Flip()
WaitKey
Wend

If X = Y Then
Plot XPos - X,YPos - Y
Plot XPos + X,YPos - Y
Plot XPos - X,YPos + Y
Plot XPos + X,YPos + Y
EndIf

End Function
  • Zuletzt bearbeitet von SpionAtom am Sa, Jan 21, 2006 20:53, insgesamt einmal bearbeitet
 

Dreamora

BeitragSa, Jan 21, 2006 20:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Es geht auch mit obiger Gleichung recht einfach und beträchtlich schneller als Sin-Cos spielereien:

Code: [AUSKLAPPEN]

for i = -radius to radius
   for j = -radius to radius
      if (x+i)*(x+i) + (y+j)*(y+j) < radius * radius
         ' Pixel ist im Kreis
      endif
   next
next


Optimierungen durch Symmetriebetrachtungen sind möglich, hier aber zur einfachen Verständlichkeit ausgelassen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

aMul

Sieger des Minimalist Compo 01/13

BeitragSa, Jan 21, 2006 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei größeren Kreisen ist Steffens Code von der Geschwindigkeit her allerdings klar im Vorteil.
Hab jetzt keine Lust zu testen, wie das bei kleineren Kreisen ist, denke aber das dort die Pythagoras-Formel ein klein wenig schneller sein wird..

MfG
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Ctuchik

BeitragSo, Jan 22, 2006 0:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Am einfachsten und vermutlich auch wenigsten rechenlastig lässt sich eine zerstörbare Landschaft bewerkstelligen, wenn du die Landschaft in einem Bild speicherst. Wenn dann eine Explosion entsteht malst du einfach einen Kreis mit der Transparenzfarbe in dieses Bild. Dadurch kriegst du wunderschöne kreisförmige Löcher ohne pixelgenaue Berechnungen durchführen zu müssen.

Allerdings kann es sein, dass BB mit großen Bildern (größer als der Bildschirm???) Probleme hat (meine ich hier im Forum mal gelesen zu haben!?). Dann müsste man das eventuell in kleinere Bilder aufteilen.
Zu den Nebenwirkungen gehören trockener Mund, Übelkeit, Erbrechen, Harnstau, schmerzhafter rektaler Juckreiz, Halluzinationen, Demenz, Psychose, Koma, Tod und Mundgeruch!
Magie eignet sich nicht für alle!
Fraget euren Arzt oder Apotheker!

5k41

BeitragSo, Jan 22, 2006 15:20
Antworten mit Zitat
Benutzer-Profile anzeigen
mh also das kann ich niht sagen...als ich mein erstes spiel programmiert hab (hatte ca. 10 Seiten EINES buchs gelesen) hab ich einfach eine riesife (25MB) große karte gemalt...und alles hat super funktioniert...(auch wenn ich mich immernoch dafür schäme was ich getan hab Very Happy )
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

aMul

Sieger des Minimalist Compo 01/13

BeitragSo, Jan 22, 2006 16:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab mein Problem schon längst(gerade eben) gelöst.
Hier die Dl-Links:
www.amul.de.vu/Sonstiges/Partikel%20V1.zip <-Mit Flip 1
www.amul.de.vu/Sonstiges/PartikelV1.zip <-Mit Flip 0
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

5k41

BeitragSo, Jan 22, 2006 16:36
Antworten mit Zitat
Benutzer-Profile anzeigen
respekt! nur noch einen kleinen fehler hab ich gefunden: wenn man unter der pixelquelle einen strich machn und dadrunter noch einen schrägen dann fließt der sand oder was das auch immer darstellen soll immer zur spitze des berges der sich bildet und nicht grade runter...GOTT DAS IST SCHWIERIG ZU ERKLÄREN^^ hoffe du weisst was ich meine!
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

aMul

Sieger des Minimalist Compo 01/13

BeitragSo, Jan 22, 2006 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab mir deinen Post fünfmal durchgelesen, und ich weiß immer noch nicht was du meinst...
Ich versuch das mal zu rekonstruieren, oder du musst mir einem Screenshot machen.

Achja, danke das es dir gefällt!^^


EDIT:
Fals du meinst, das der Sand schräg fällt, das ist der Wind^^
Und das er so gleichmäßig/in einer Reihe fällt is schwer wegzubekomm...
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Jan 22, 2006 17:07
Antworten mit Zitat
Benutzer-Profile anzeigen
@eMul, ebenfalls respekt. Das mit dem perfekt angeordneten Sand würde ich nicht bemängeln. Sand fällt nun mal auch in der Realität 'fast' so. In der Realität ist nur schwierig eine Störungsfreie Umgebung zu schaffen.

5k41

BeitragSo, Jan 22, 2006 17:10
Antworten mit Zitat
Benutzer-Profile anzeigen
ne also es war so, das sich ein aufen gebildet hat und der strom des sandes ist immer der spitze des haufens gefolgt bis sie irgendwann zu weit weg war...wenn das trozdem der wind war dann ist ja alles ok^^...hoffe nun hab ich mich verständlicher ausgedrückt...
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

aMul

Sieger des Minimalist Compo 01/13

BeitragSo, Jan 22, 2006 17:36
Antworten mit Zitat
Benutzer-Profile anzeigen
@hectic:
Danke.

@5k41
Ich glaub jetzt versteh ich was du meinst.
Und wenn ich das richtig verstehe, dann ist es der Wind.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group