Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pixel der Kreisaussen Linie (https://www.delphipraxis.net/86228-pixel-der-kreisaussen-linie.html)

Thorben_K 11. Feb 2007 12:02


Pixel der Kreisaussen Linie
 
Hallo

ich habe einen Kreis mit einem Mittelpunkt der bekannt ist. Ich brauche jeden Pixel des Kreises, das probleme ist nur das er Kreis ein TShape ist, und ich ja nicht einfach von Top to Top + Heigth durch gehen kann, weil er dann ja zu viel nehmen würde...

Ich habe mir gedacht ich gehe da mit dem Satz des Pythagoras dran, leider geht es so nicht...

Delphi-Quellcode:
function TSchuss.Colision: Boolean;
var
  x, h : LongInt;
  r : LongInt;
  x1, y1, y2 : LongInt;
begin
  result := False;
  r := (height div 2);

  for x := FMitte.X to Left + Width do
  begin
    h := Round(Sqrt((Sqr(x -FMitte.X )) + Sqr(r)));
    x1 := x;
    y1 := FMitte.Y +h;
    y2 := FMitte.Y -h;
    if (getColor(x1, y1)<>FBackGroundColor)or(getColor(x1, y2)<>FBackGroundColor) then
    begin
      result := True;
      Exit;
    end;
  end;

  for x := Left to FMitte.X do
  begin
    h := Round(Sqrt((Sqr(FMitte.X) -x) + Sqr(r)));
    x1 := x;
    y1 := FMitte.Y +h;
    y2 := FMitte.Y -h;
    if (getColor(x1, y1)=FBackGroundColor)or(getColor(x1, y2)=FBackGroundColor) then
    begin
      result := True;
      Exit;
    end;
  end;
end;
Die Farbe finde ich so raus

Delphi-Quellcode:
function TSchuss.GetColor(x, y : LongInt): TColor;
var canvas: TCanvas;
  p : TPoint;
begin
  // vom Koordinatensystem des Formulars ins System des Screens umsteigen
  p := Parent.ClientToScreen(Point(x,y));
  canvas:=TCanvas.Create;
  try
    canvas.Handle:=GetWindowDC(GetDesktopWindow);
    Result:=canvas.Pixels[p.x, p.y];
  finally
    canvas.Free;
  end;
end
Hoffe mir kann einer Helfen, entweder jemand findet den Fehler oder hat ne bessere idee :)

gruss Thorben

PS: FMitte ist der Mittelpunkt des Kreises von typ TPoint

Phoenix 11. Feb 2007 12:22

Re: Pixel der Kreisaussen Linie
 
Stichwort ist der Bresenham-Algorithmus zum Zeichnen von Kreisen eines bestimmten Radiuses.

Such da mal nach.

marabu 11. Feb 2007 14:27

Re: Pixel der Kreisaussen Linie
 
Hallo Thorben,

für eine Kollisionserkennung zwischen zwei Kreisen brauchst du eigentlich nie alle Pixel auf den Kreisen - es genügt den Abstand zwischen den beiden Mittelpunkten zu berechnen:

Delphi-Quellcode:
function TProjectile.Collision(pt: TPoint; r: Integer): Boolean;
var
  xDelta, yDelta, safeDistance: Integer;
begin
  xDelta := Center.X - pt.X;
  yDelta := Center.Y - pt.Y;
  safeDistance := r + Radius;
  Result := (xDelta * xDelta + yDelta * yDelta) < (safeDistance * safeDistance);
end;
Center ist eine Eigenschaft des Projektils vom Typ TPoint und Radius beschreibt seine Kreisform dann vollständig. Die Übergabeparameter beschreiben ein beliebiges Objekt mit kreisförmiger Hülle. Bresenhams Algorithmus wird von den Zeichenroutinen der Grafikprimitiven verwendet, mit denen sich die Shapes auf den Canvas zeichnen. Da dieser Algorithmus von den Rastergrafikroutinen des GDI implementiert wird, sehe ich so direkt keinen Bedarf dafür auf der Anwendungsebene.

Grüße vom marabu

Thorben_K 11. Feb 2007 16:48

Re: Pixel der Kreisaussen Linie
 
Da hast du absolut recht, da denk ich 2 Tage über ne möglichkeit nach, und komm zu keinem ergebniss...

Danke dir :D

dino 11. Feb 2007 18:21

Re: Pixel der Kreisaussen Linie
 
ich hate das Problem, dass man immer wieter Punkte auf die Form zeichnen durfte, von denen mein kreis abstürzt

hab bisher es so gemacht, dass er in nem rechteck alle punkte nacheinande durchgeht, erst berechnet, ob sie weit genug weg sind, um nicht der Kreis selbst sein zu können und dann, ob sie nah genug dran sind, um als kollision zu gelten und dann per bmp.canvas.pixels[xi,yi] geprüft ob da ne farbe ist

quellcode kann ich im moment nicht dienen, da ich das alles auf der 80 GB Festplatte habe, die mein bios nicht unterstützt

ist das auch ne lösung oder ist das zu lahm?

hab ja mal gehört, dass die pixels abfrage extrem langsam sein soll

kann man dafür was anderes nehmen?

marabu 11. Feb 2007 20:07

Re: Pixel der Kreisaussen Linie
 
Hallo,

wenn die Kollisionen mit Objekten zu erwarten sind, die durch Parameter beschrieben werden können, dann dürfte der von mir gegebene Ansatz - eventuell mit Anpassungen - immer besser sein, als eine Erkennung über die Farbe. Selbst wenn die Objekte nicht durch reguläre geometrische Figuren dargestellt werden können, funktioniert der Ansatz oft noch, wenn man eine sogenannte coast line speichert - die Hülle als offenes oder geschlossenes Polygon.

Gute Nacht


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:15 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