Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Pixelgenau Kollision zwischen kreisen & Rechtecken (https://www.delphipraxis.net/120764-pixelgenau-kollision-zwischen-kreisen-rechtecken.html)

Kytrix 16. Sep 2008 12:45


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:
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;
Rechteck
Delphi-Quellcode:
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;
(Die kreise sind in Bewegeung)
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.

jfheins 16. Sep 2008 13:10

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:

Kytrix 16. Sep 2008 13:26

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 ? ^^

Spiderpig_GER_15 16. Sep 2008 13:31

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:

jfheins 16. Sep 2008 15:46

Re: Pixelgenau Kollision zwischen kreisen & Rechtecken
 
Das sind sie, ja ;)

Ich hab da weas gefunden, was dir weiterhelfen sollte ;)

http://www.gamedev.net/community/for...topic_id=91617

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

;)

Kytrix 16. Sep 2008 22:01

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;

jfheins 16. Sep 2008 22:12

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 ?

Kytrix 16. Sep 2008 22:28

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 17. Sep 2008 05:35

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Multimedia" verschoben.
Delphi-Frage

jfheins 17. Sep 2008 10:21

Re: Pixelgenau Kollision zwischen kreisen & Rechtecken
 
Zitat:

Zitat von Kytrix
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

Naja - die Lösung hab ich ja in #5 umrissen, aber wenn dir diese Lösung reicht, ists ja in Ordnung ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:31 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz