Einzelnen Beitrag anzeigen

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