Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

12.03.2013, 18:45

2D-Algorithmus Sichtbarkeit

Gegeben ist folgende 2D-Matrix:

Quellcode

1
2
3
4
5
6
7
8
9
 00 | 10 | 20 | 30 | 40
----+----+----+----+----
 01 | 11 | 21 | 31 | 41
----+----+----+----+----
 02 | 12 | 22 | 32 | 42
----+----+----+----+----
 03 | 13 | 23 | 33 | 43
----+----+----+----+----
 04 | 14 | 24 | 34 | 44


Feld 23 ist eine undurchsichtige Wand.
Feld 24 ist der Startpunkt mit Blickrichtung auf Feld 23.

Ich suche nun Algorithmen oder Lösungsansätze, um sichtbare oder unsichtbare Felder bestimmen zu können und würde mich sehr über Tipps von euch freuen.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

2

12.03.2013, 19:03

Im einfachsten Fall ermittelst Du mittels Bresenhams Linienalgorithmus alle Felder zwischen Start und Ziel, und nimmst "Nicht sichtbar" an, falls eines der Felder besetzt ist.

Das wird bei so groben Feldern aber nur sehr grobe Ergebnisse liefern. Etwas besser wird es, wenn Du einen Strahl von Mitte des Startfelds zur Mitte des Zielfelds schießt und diesen Strahl gegen alle Grenz-Liniensegmente von besetzten Feldern schneidest. Noch besser wird es allerdings, wenn Du ein kleines Flächenintegral entlang einer "Linie mit Dicke" aufsetzt. Das kann mathematisch etwas herausfordernd werden, aber Du kannst es auch ganz profan imitieren, indem Du ein ganzes Rudel Strahlen verschickst und dabei Start- und Zielposition innerhalb eines gewissen Radius zufällig streust.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

3

12.03.2013, 19:05

Du musst schon ein wenig mehr zu dem Problem sagen. So wie du es jetzt schilderst weisst du ja, dass 23 undurchsichtig ist. Also warum benutzt du nicht einfach die Position + Blickrichtung und bestimmst dann das nächste Feld und durch Zugriff auf die Matrix kannst du auslesen ob man durchsieht oder nicht.

Ganz simpel. Ansonsten musst du das Problem genauer beschreiben!

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

12.03.2013, 19:36

Ich denke hier geht es um einen Effekt wie er bei dem Spiel Die Hard verwendet wird. Das Spielgeschehen wird von oben gezeigt, aber Flächen, welche die Spielfigur theoretisch nicht sehen würde werden schwarz gefärbt. Dafür müsste man natürlich den Sichtkegel bestimmen. Dazu hat Schrompf ja schon eine ganz gute Antwort gegeben.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

5

12.03.2013, 19:48

Den Bresenham-Algorithmus habe ich mir heute bereits angeschaut, danke.
Über einen Tipp im Chat bin ich gestern darüber gestolpert.

Wenn man vom Startpunkt aus nur in eine Richtung schaut, könnte ich mir eine Lösung mit Bresenham vorstellen.

Drakon:
Natürlich wissen wir, dass das Feld 23 nicht durchsichtig ist.
Und wir wissen auch, dass die Felder 22, 21 und 20 ebenfalls nicht sichtbar sind.
Aber wie schaut es z.B. mit den Feldern 10, 11 und 12 aus?
Oder 30, 31 und 32?

Muss ich einen Kreis mit einem Radius entsprechend einer "Sichtweite" um den Startpunkt ziehen, um anschließend per Bresenham-Algorithmus eine Linie zu jeden Punkt auf der Kreislinie zu ziehen? Vom Gefühl her fühlt sich das falsch an.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

6

12.03.2013, 20:20

Wenn man wissen will, ob Feld x,y sichtbar ist, muss man doch lediglich ueberpruefen, ob sich zwischen der aktuellen Position und x,y ein Hindernis befindet, welches die Sicht blockiert. Das mit dem Kreis sollte funktionieren, ist aber wahrscheinlich sehr aufwendig, vor allem wenn der Kreis sehr gross ist. Ich wuerde die Frage einfach rekursiv loesen. Man beginnt mit dem ersten Tile, bei dem man sicher ist, das es sichtbar ist. naemlich das auf dem man gerade steht. Dann betrachtet man alle 4 Nachbarn davon. Ist so ein Feld nicht durchsichtig, so kann das Feld nicht gesehen werden und kann als unsichtbar markiert werden, super. Oder man muss von dem Feld in Richtung aktueller Position gehen, man ueberschreitet irgendwann die Grenze des Tiles und kommt auf das Naechste. Man trifft dann auf dein Tile, das entweder sichtbar oder unsichtbar ist, und damit ist auch bewiesen, ob dieses Feld sichtbar ist. Dann macht man das mit den Nachbarn der Nachbarn usw. Dabei betrachtet man nie ein Feld doppelt wie bei der Kreismethode wo der Strahl zum oberen Viertel ja immer durch das Feld noerdlich der Startposition laeuft und dessen Sichtbarkeit so zig mal berechnet wird.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

7

12.03.2013, 20:31

Warum rekursiv?

Also wenn er nur wissen will ob in bestimmtes Feld sichtbar ist von einer Position, dann kann man ja einfach in die Richtung des Ziel Tiles marschieren (Bresenham) und dann ist man irgendwann dort und weiss die Antwort (oder hat schon vorher abgebrochen). Das geht eigentlich ähnlich, wenn du einen ganzen Sichtkegel hast. Du hast einfach verschiedene Linien (obwohl man da dann den Raum dazwischen noch gut handeln muss).

Wenn du allerdings eine Matrix haben möchtest, wo drin steht welche Tiles alle sichtbar sind von einer gegebenen Position, dann ist die rekursive Variante von TGGC sicher die Wahl. Im schlimmsten Fall O(n^2) wenn es korrekt implementiert ist, aber das ist, denke ich, auch die untere Schranke.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

8

12.03.2013, 20:49

Also wenn n die Anzahl der Felder ist, dann ist hat der Algorithmus Laufzeit O(n). Die Frage nach dem Nachbarfeld ist immer gleich schwer.

Warum rekursiv?
Weil ich mir das am leichtesten vorstellen kann. ;-)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

12.03.2013, 21:03

Algorithmus Laufzeit O(n).

Oh, Natürlich. Habe die Breite des Feldes angenommen. Aber auch dann wäre es bei nicht-quadratischen Feldern O(m*n) gewesen. ^^
Bezüglich rekursiv:
Ich habe während des schreibens bemerkt, dass nicht ganz klar ist was er genau möchte. (Start-Ein-Ende oder Start-Beliebiges-Ende). Da macht rekursiv je nachdem schon Sinn.

10

12.03.2013, 21:20

https://www.youtube.com/watch?v=C-ScURIRTGA
https://www.youtube.com/watch?v=8gHitl2GRPo
Soetwas strebe ich an.
Iirc ist das Stichwort Raycasting gestern im Chat gefallen.
Ich schaue es mir auf jeden Fall an.

Werbeanzeige