Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Collisionsabfrage von Bildern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
27.02.2006, 13:13 Uhr
Gap



Hallo

Ich mach meine Collision zZ so, das ich das Überlappungsrechteck bei zwei Bildern nach gemeinsamen Pixel such, die beide nicht Durchsichtig sind.
Das funktioniert zwar, ist aber recht langsam.

Jetzt meine Frage: Gibt es noch andere Wege, die Collision zu prüfen, wenn nein, wie kann man die von mir optimieren?

Danke
Gap
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.02.2006, 16:15 Uhr
Oliver
S2-Pixelgeneral


Du könntest prüfen, ob sich die beiden Rechtecke überlappen.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.02.2006, 17:12 Uhr
Gap



Ja so mach ichs ja zur Zeit.

Aber es muss Pixelgenau sein und schnell.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
27.02.2006, 17:21 Uhr
KaraHead



mit ANSI C/C++ geht das doch gar nicht, nicht oder?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.02.2006, 11:14 Uhr
Gap



Es kommt ja bloß auf die überprüfung an, also gehts schon mit Ansi C++, oder?

Vereinfacht:

C++:
for( int w = 0; w < width; w++ )
{
for( int h = 0; h < height; h++ )
{
  if( main_surface[left+w+(h+top)*pitch] != DURCHSICHTIGE_KONSTANTE &&
      other_surface[left+w+(h+top)*pitch] != DURCHSICHTIGE_KONSTANTE )
   return true;
}
}

return false;



Da ist ja nichts API-Spezifisches dabei.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
28.02.2006, 11:46 Uhr
virtual
Sexiest Bit alive
(Operator)


1. Lösungsansatz
=============
Also wenn ich jetzt so ein Object habe (_ steht für Durchsichtig):

Code:
___XXXXXX___
___XYYYYX___
___XYYYYX___
___XYYYYX___
___XXXXXX___


Dann braucht man eigentlich nur den Umriß zu überprüfen, dh die mit X markierten Pixel. Vermutlich wirst Du ein fragileres Objekt haben, was nicht streng quadratisch ist. Aber möglicherweise ist es performanter, zu jdem Objekt eine Liste von Rechtecken zu verwalten, die solche Checks erlauben. zB:

Code:
__XXX___________________
__XXX___________________
__XXXXXXX_______________
__XXXXXXXXXXXXXX_______
_____XXXXXXX____________
_____XXXXXXXXXXXXXX____
_____XXXXXXXXXXXXXXXX__
_____XXXXXXXXXXXXXX____
_____XXXXXXX____________
__XXXXXXXXXXXXXX_______
__XXXXXXX_______________
__XXX___________________
__XXX___________________


Könnte man in die Rechteeck A-I wie folgt aufteilen:

Code:
__AAA___________________
__AAA___________________
__AAACCCC_______________
__AAADDDDDDDGGGG_______
_____DDDDDDD____________
_____DDDDDDDFFFFFFF____
_____DDDDDDDFFFFFFFII__
_____DDDDDDDFFFFFFF____
_____DDDDDDD____________
__BBBDDDDDDDHHHH_______
__BBBEEEE_______________
__BBB___________________
__BBB___________________


Ingesamt besteht das Objekt also aus den 9 Rechtecken A-I. Zu kollosionsabfrage sind pro rechteck 4 Vergleiche und eine AND Verknüpfung notwendig. Wenn die alle das gleiche kosten, komme ich auch 9*4+9 = 45.

Wenn die die Pixel einzeln vergleiche, dann ist die Rechteckfläche das Kostenmaß:
F(A)+...F(H) = 9 + 9 + 4 + 36 + 4 + 4 + 21 + 4 + 2 = 93 Also mindestens doppelt so teuer, die Pixel einzeln abzufragen.

Dann ist noch die Frage wichtig, wie teuer es ist, die einzelnen Pixel anzusprechen... Das kann auch enorm teuer sein.

Die Herausforderung dieses Ansatzes besteht darin, die Rechtecke zu finden.


2. Lösungsansatz
=============
Du erstellst BitMasken der nicht durchsichtigen (und damit zu überprüfenden objekte). Die sind recht kompakt, weil 1 Pixel == 1 Bit. Letztlich werden die Masken als unsigned werte gespeichert. Man kann das recht gut hinbekommen, denke ich. Eine Kollisionsabfrage zweier Objekte besteht darin, daß man die einzelnen, sie überlappenden Bitmasken UND verknüpft. Kommt da irgendwo was !=0 raus, handelt es sich um eine Kollision.

Die eigentliche Herausforderung dieses Ansatzes besteht in der Bitfummelei, weil man die bitmasken jeweils entsprechend der relativen Position der Objekte nochmal verschieben muß.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
28.02.2006, 14:06 Uhr
Gap



Hm, also der erste Lösungsansatz erscheint mir recht kompliziert.
Die Rechtecke zu finden könnte ziemlich schwer sein.

Der zweite Lösungsansatz hört sich ziemlich vielversprechend an, wobei die Bitfummelei noch nie so mein Ding war
Wie soll man außerdem die BitMasken herausfinden?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
28.02.2006, 15:09 Uhr
virtual
Sexiest Bit alive
(Operator)


Ob etwas durchsichtig ist oder nicht ist normalerweise Bestandteil der Bilddaten (Aplha-Channel). Und da hängt es vom Datenformat ab. Im Idealfall sind die Daten bereits als Bitmaske vorhanden.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
28.02.2006, 15:55 Uhr
Oliver
S2-Pixelgeneral



Zitat:

Aber es muss Pixelgenau sein und schnell.



Das widerspricht sich ein bisschen. Wenn du es ganz genau willst, musst du halt auf pixelgenaue Kollision prüfen, ansonsten kannste du wie gesagt auch 2 Rechtecke auf Kollision prüfen, das ist natürlich ungenauer aber wesentlich schneller, kommt auf die Art deiner Figur an und was du machen willst. Bei einer pixelgenauen solltest du deine Bilddaten halt möglichst in den Hauptspeicher laden ( in welcher Form auch immer ) und nicht erst vom Grafikspeicher holen, das ist extrem lahm.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
28.02.2006, 17:37 Uhr
Gap



Ok, ich werd mal schaun was sich aus den Vorschlägen machen lässt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: