Pixel in einem Kreis
Übersicht

![]() |
aMulSieger des Minimalist Compo 01/13Betreff: Pixel in einem Kreis |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
...trotzdem unnötig Kompliziert.
SpionAtoms Lösung ist die einzig vernünftige. |
||
Coding: silizium-net.de | Portfolio: Triton.ch.vu |
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@ 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
---WEGEDIT 1. Teil, weil ich was falsch verstanden habe ----
Diesen tollen Bresenham-Algorithmus (ja, seit dem sinnlosen Thread ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group