Autor Beitrag
klezmor
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: Mo 11.06.07 22:40 
Also folgendes Problem: Ich habe ein punkt moveto(x,y) und einen punkt lineTo(x,y) welche ich im Canvas mit einer Linie verbinden will. Diese Linie ist ein paar Pixel breit. Nun soll überprüft werden, ob die linie welche mit obigen funktionen gezeichnet wird mit einem andersfarbigen pixel kollidiert wird, denn die linien befinden sich auf einen Schwarzen hintergrund und sollen nur gezeichnet, wenn sich zwischen Start- und Zielpunkt kein andersfarbiges Pixel befindet.

Gruß Klezmor.

_________________
"Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 12.06.07 11:09 
Tja. Du hast ein visuelles Problem, das du analytisch lösen willst...

Entweder Du zeichnest die Linie selbst (Bresenham-Algorithmus) und prüfst vorher, ob dort Pixel sind, oder Du hast eine Liste der Punkte und prüfst, ob einer der Punkte zur Gerade einen bestimmten Abstand (1/2 Liniendicke) unterschreitet.

_________________
Na denn, dann. Bis dann, denn.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 12.06.07 12:23 
Moin!

user profile iconalzaimar hat folgendes geschrieben:
prüfst vorher, ob dort Pixel sind,

Idee dazu: ;)
Zeichne die Linie in ein weiteres, schwarz-weißes Masken-Bitmap, dass du dazu verwendet, die Linienpixel aus dem Original-Bitmap "auszuschneiden". Das prüfst du dann auf "überhaupt Pixel enthalten". :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
klezmor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: Do 14.06.07 00:30 
Narses deinen Ansatz habe ich leider nicht ganz verstanden.

_________________
"Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 14.06.07 00:42 
Moin!

OK, nochmal langsam: ;)
  1. MaskenBitmap anlegen, gleiche Größe wie ZielBitmap, aber S/W, mit "weiß" füllen
  2. "neue" Linie schwarz ins MaskenBitmap zeichnen
  3. das MaskenBitmap Pixel-für-Pixel durchgehen und auf "schwarz" prüfen; wenn schwarzen Pixel gefunden, weißt du, dass hier ein Linien-Punkt im ZielBitmap ist -> dort untersuchen
  4. wenn keine Kollision aufgetreten ist, Linie auch im Zielbitmap zeichnen

Jetzt ist das pixelweise Durchsuchen nicht unbedingt performant (naja, je nach dem, wie man´s macht, halt), deshalb könnte man mit einem geeigneten CopyMode für BitBlt mit der Maske die Linienpixel aus dem ZielBitmap "ausschneiden" -> wenn noch Pixel im MaskenBitmap verlieben sind, dann haste eine Kollision. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
klezmor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: Do 14.06.07 00:59 
ok also hab das jetzt schon verstanden, aber wie du richtigerweise sagtest wird die performance wohl ziemlich darunter leiden.
Und diese Copy procedure zu schreiben ist auch net grad sonderlich einfach(denk mal bresenham grad anderesrum).
Also hab mir auch schon überlegt das ganze Canvas in ein binäres Raster einzuteilen.
Die boolschen Werte würde ich dann in nem 2-Dim Array speichern.
Allerdings stellt sich dann die frage wie groß das raster bzw. fein es sein sollte.
Außerdem würde ich ja dann die einzelnen Rasterpunkte mit linien verbinden und diese sähe dann womöglich auch nicht gerade sonderlich gut aus.
Denk mal einige von euch wissen woher das problem rührt, es dreht sich um das spiel achtung die kurve download link frage mich die die Kollision abfragen. Bei geringer Stepwidth ist das selbstverständlich kein Problem, allerdings muss ich bei geringer performance die stepwidth ein wenig hochfahren, da sonst die linien zu langsam gezeichnet würden. Folglich sind die Zeichenschritte also größer und es kann vorkommen, das ein schritt so groß wird, dass eine ganze linie dazwischen passt, Eine Abfrage auf pixel kollision folglich unmöglich ist.

_________________
"Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Do 14.06.07 07:42 
Klezmor, löse die Sache analytisch. Du erstellst dir Listen aller Objekte und ihrer Bounding Box. Dann hast Du ja die Bewegungsrichtung und Geschwindigkeit, womit Du dann die Kollisionen ausrechnen kannst.

_________________
Na denn, dann. Bis dann, denn.
klezmor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: Do 14.06.07 15:36 
Der Aufwand ist halt meiner meinung nach zu groß. Es wäre doch sinnvoller einfach die linien zu zeichnen und dann die farbe gewisser bereiche zu überprüfen.

_________________
"Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth