![]() |
Pixelgenau Kollision zwischen kreisen & Rechtecken
Liste der Anhänge anzeigen (Anzahl: 1)
Hi, also ich erstelle Kreise und Rechtecke auf meiner Form.
Kreis
Delphi-Quellcode:
Rechteck
procedure TKreis.Zeichnen(XPos, YPos, Größe, pR, pG, pB,
bR, bG, bB: Integer); begin SelectObject(DC,GetStockObject(DC_BRUSH)); SetDCBrushColor(DC, RGB(bR, bG, bB)); SelectObject(DC,GetStockObject(DC_PEN)); SetDCPenColor(DC, RGB(pR, pG, pB)); Ellipse(DC, XPos, YPos, XPos+Größe, YPos+Größe); end;
Delphi-Quellcode:
(Die kreise sind in Bewegeung)
procedure TRecheck.Zeichnen(XPos, YPos, Größe, pR, pG, pB,
bR, bG, bB: Integer); begin SelectObject(DC,GetStockObject(DC_BRUSH)); SetDCBrushColor(DC, RGB(bR, bG, bB)); SelectObject(DC,GetStockObject(DC_PEN)); SetDCPenColor(DC, RGB(pR, pG, pB)); Rectangle(DC, XPos, YPos, XPos+Größe, YPos+Größe); end; nun möchte ich gerne erreichen dass wenn ein Kreis das Rechteck bzw auf die grünen Pixel trifft (Kreis und Rechteck überlappen) eine Meldung ausgegeben wird .... kurz gesagt eine Kollisionsabfrage realisieren ich habe jedoch keine ahnung wie. |
Re: Pixelgenau Kollision zwischen kreisen & Rechtecken
Hm . das ist nicht so einfach.
1. Da die Berechnung etwas mehr Zeit kostet, solltest du mit BoundaryBox-oder -Circle überprüfen, ob sie sich schneiden können. (optional, kannte auch erst machen, wenn du Performanceprobleme bekommst.) Dann die eigentliche überprüfung: Mein Ansatrtz wäre wie folgt: Ausgangswete: 1 Ortsvektor_Kreis, 1 Ortsvektor_Rechteck, Radius_Kreis, Höhe_Rechteck, Breite_Rechteck. :arrow: 1. Bilde den Differenzvektor. (Wenn du keine BoundaryBox verwendest, kannst du hier übeprüfen: wenn länge > (radius + sqrt(rechtechhöhe²+rechteckbreite²)) dann berühren sie sich nicht.) :arrow: Kreisradius abziehen. Also Vektor = Vektor * (1 - Radius/Betrag(Vektor)) :arrow: Wenn jetzt Betrag(Vektor_x) kleiner ist als die Breite, oder Betrag(Vektor_y) kleiner ist als die Höhe, dann berühren sie sich ;) Hmmm ... neee, nochmal nachgedacht, das passt irgendwie noch nicht so richtig ... :gruebel: Mist :mrgreen: |
Re: Pixelgenau Kollision zwischen kreisen & Rechtecken
hmm darüber muss ich erstmal nachdenken ^^ ... aber mein ansatz wäre in der umgebung des kreises (-> also vom mittelpunkt ausgehernd im abstand R (radius) 360° um den mittelpunkt) nach grünen pixeln zu suchen .... aber wie setze ich das um ? ^^
|
Re: Pixelgenau Kollision zwischen kreisen & Rechtecken
du könntest einfach beim Rechteck schauen ob an den Kanten ein grünes Pixel ist.
Ist aber wahrscheinlich eine eher "unelegante" Lösung :zwinker: |
Re: Pixelgenau Kollision zwischen kreisen & Rechtecken
Das sind sie, ja ;)
Ich hab da weas gefunden, was dir weiterhelfen sollte ;) ![]() Rechteck: R_X =xKoordinate, R_W =breite, R_H =höhe Kreis: K_X und K_R =Radius Du musst also erstmal überprüfen, ob der Kreis im Rechteck ist. Wenn nicht, dann ob er über/unter dem Rechteck ist (R_X-R_W < K_X < R_X+R_W) (Kollision durech Y-Koordinate) Wenn nicht, obs rechts/links ist (Y checken, Kollision über X Koordinate) Wenn das auch nicht, dann ist er bei einer Ecke ==> Kollision wenn (K_X - R_B)^2 + (K_Y - R_H)^2 < K_R^2 ;) |
Re: Pixelgenau Kollision zwischen kreisen & Rechtecken
ich habe die Lösung =)
Delphi-Quellcode:
function TKreis.KollisionsTest(XPos, YPos, Größe: Integer): Boolean;
Var UmgebungsPixel: Colorref; Radius, i, XConst, YConst, XZen, YZen, XRand, YRand: Integer; R, G, B: Byte; begin XConst:=XPos; YConst:=YPos; for i := 1 to 8 do begin XZen:=XConst+(Größe div 2); // Zentrum des YZen:=YConst+(Größe div 2); // Kreises Radius:=(Größe div 2); // Test ob Zentraler Punkt des Kreises stimmt {SelectObject(DC,GetStockObject(DC_PEN)); SetDCPenColor(DC, RGB(255, 0, 0)); Ellipse(DC, XZen, YZen, XZen+2, YZen+2);} // case i of 1 :begin XRand:=XZen+Radius; YRand:=YZen; end; 2 :begin XRand:=XZen-Radius; YRand:=YZen; end; 3 :begin YRand:=YZen+Radius; XRand:=XZen; end; 4 :begin YRand:=YZen-Radius; XRand:=XZen; end; 5 :begin XRand:=Round( XZen+ sqrt( ( (sqr(Radius) ) / 2 )) ); YRand:=Round( YZen+ sqrt( ( (sqr(Radius) ) / 2 )) ); end; 6 :begin XRand:=Round( XZen+ sqrt( ( (sqr(Radius) ) / 2 )) ); YRand:=Round( YZen- sqrt( ( (sqr(Radius) ) / 2 )) ); end; 7 :begin XRand:=Round( XZen- sqrt( ( (sqr(Radius) ) / 2 )) ); YRand:=Round( YZen+ sqrt( ( (sqr(Radius) ) / 2 )) ); end; 8 :begin XRand:=Round( XZen- sqrt( ( (sqr(Radius) ) / 2 )) ); YRand:=Round( YZen- sqrt( ( (sqr(Radius) ) / 2 )) ); end; end; // Test ob kollisionspunkte stimmen {SelectObject(DC,GetStockObject(DC_PEN)); SetDCPenColor(DC, RGB(0, 0, 255)); Ellipse(DC, XRand, YRand, XRand+2, YRand+2);} // UmgebungsPixel:=Windows.GetPixel(DC, XRand, YRand); R:= GetRValue(UmgebungsPixel); G:= GetGValue(UmgebungsPixel); B:= GetBValue(UmgebungsPixel); if (R=124) and (G=252) and (B=0) then begin result:= true; end; end; end; |
Re: Pixelgenau Kollision zwischen kreisen & Rechtecken
Ähhhh .. das kann nicht dein Erst sein :shock:
Was ist, wenn sich mal die Farbe der Rechtecke ändert, oder es unterscheidliche Rechtecke geben soll? Außerdem trifft sie nicht immer zu. Bsp: Kreis trifft Ecke vom Rechteck mit einem beliebigen Punkt, der nicht einer der 8 getesteten ist. Oder was ist, wenn du ein Hintergrundbild einfügst, in dem solche Pixel drin sind? Oder andere Kreise die gleiche Farbe haben ? |
Re: Pixelgenau Kollision zwischen kreisen & Rechtecken
Kann ich zum glück alles ausschließen ^^ ... ja ungenau ist es leider aber ich weiß nicht wie ich alle punkte der umfangs errechnen soll
|
DP-Maintenance
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Multimedia" verschoben.
Delphi-Frage |
Re: Pixelgenau Kollision zwischen kreisen & Rechtecken
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz