![]() |
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:
Die Farbe finde ich so raus
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;
Delphi-Quellcode:
Hoffe mir kann einer Helfen, entweder jemand findet den Fehler oder hat ne bessere idee :)
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 gruss Thorben PS: FMitte ist der Mittelpunkt des Kreises von typ TPoint |
Re: Pixel der Kreisaussen Linie
Stichwort ist der Bresenham-Algorithmus zum Zeichnen von Kreisen eines bestimmten Radiuses.
Such da mal nach. |
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:
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.
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; Grüße vom marabu |
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 |
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? |
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 10:25 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 by Thomas Breitkreuz