AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Pixelgenau Kollision zwischen kreisen & Rechtecken
Thema durchsuchen
Ansicht
Themen-Optionen

Pixelgenau Kollision zwischen kreisen & Rechtecken

Ein Thema von Kytrix · begonnen am 16. Sep 2008 · letzter Beitrag vom 17. Sep 2008
Antwort Antwort
Seite 1 von 2  1 2      
Kytrix

Registriert seit: 26. Nov 2007
54 Beiträge
 
#1

Pixelgenau Kollision zwischen kreisen & Rechtecken

  Alt 16. Sep 2008, 12:45
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.
Miniaturansicht angehängter Grafiken
unbenannt_738.gif  
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

Re: Pixelgenau Kollision zwischen kreisen & Rechtecken

  Alt 16. Sep 2008, 13:10
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.

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.)
Kreisradius abziehen. Also Vektor = Vektor * (1 - Radius/Betrag(Vektor))

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 ... Mist
  Mit Zitat antworten Zitat
Kytrix

Registriert seit: 26. Nov 2007
54 Beiträge
 
#3

Re: Pixelgenau Kollision zwischen kreisen & Rechtecken

  Alt 16. Sep 2008, 13:26
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 ? ^^
  Mit Zitat antworten Zitat
Benutzerbild von Spiderpig_GER_15
Spiderpig_GER_15

Registriert seit: 17. Mär 2008
298 Beiträge
 
Delphi 7 Personal
 
#4

Re: Pixelgenau Kollision zwischen kreisen & Rechtecken

  Alt 16. Sep 2008, 13:31
du könntest einfach beim Rechteck schauen ob an den Kanten ein grünes Pixel ist.

Ist aber wahrscheinlich eine eher "unelegante" Lösung
---Zufall ist das Inkognito Gottes---
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#5

Re: Pixelgenau Kollision zwischen kreisen & Rechtecken

  Alt 16. Sep 2008, 15:46
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

  Mit Zitat antworten Zitat
Kytrix

Registriert seit: 26. Nov 2007
54 Beiträge
 
#6

Re: Pixelgenau Kollision zwischen kreisen & Rechtecken

  Alt 16. Sep 2008, 22:01
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;
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#7

Re: Pixelgenau Kollision zwischen kreisen & Rechtecken

  Alt 16. Sep 2008, 22:12
Ähhhh .. das kann nicht dein Erst sein

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 ?
  Mit Zitat antworten Zitat
Kytrix

Registriert seit: 26. Nov 2007
54 Beiträge
 
#8

Re: Pixelgenau Kollision zwischen kreisen & Rechtecken

  Alt 16. Sep 2008, 22:28
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
  Mit Zitat antworten Zitat
17. Sep 2008, 05:35
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Multimedia" verschoben.
Delphi-Frage
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#10

Re: Pixelgenau Kollision zwischen kreisen & Rechtecken

  Alt 17. Sep 2008, 10:21
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:21 Uhr.
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