AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Pixel der Kreisaussen Linie

Ein Thema von Thorben_K · begonnen am 11. Feb 2007 · letzter Beitrag vom 11. Feb 2007
Antwort Antwort
Thorben_K

Registriert seit: 22. Okt 2006
Ort: Darmstadt
105 Beiträge
 
Delphi 2006 Professional
 
#1

Pixel der Kreisaussen Linie

  Alt 11. Feb 2007, 12:02
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
Thorben
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#2

Re: Pixel der Kreisaussen Linie

  Alt 11. Feb 2007, 12:22
Stichwort ist der Bresenham-Algorithmus zum Zeichnen von Kreisen eines bestimmten Radiuses.

Such da mal nach.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Pixel der Kreisaussen Linie

  Alt 11. Feb 2007, 14:27
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
  Mit Zitat antworten Zitat
Thorben_K

Registriert seit: 22. Okt 2006
Ort: Darmstadt
105 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Pixel der Kreisaussen Linie

  Alt 11. Feb 2007, 16:48
Da hast du absolut recht, da denk ich 2 Tage über ne möglichkeit nach, und komm zu keinem ergebniss...

Danke dir
Thorben
  Mit Zitat antworten Zitat
dino

Registriert seit: 15. Jul 2006
Ort: Bad Münstereifel
627 Beiträge
 
Delphi 5 Professional
 
#5

Re: Pixel der Kreisaussen Linie

  Alt 11. Feb 2007, 18:21
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?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Pixel der Kreisaussen Linie

  Alt 11. Feb 2007, 20:07
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:30 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