Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Pixelvalues in einem Kreis lesen (https://www.delphipraxis.net/14614-pixelvalues-einem-kreis-lesen.html)

brandtson 12. Jan 2004 15:59


Pixelvalues in einem Kreis lesen
 
Hallo alle Miteinander!

Ich versuche gerade mir die Pixelwerte in einem Graustufenbild anzeigen zu lassen und zwar nur diejenigen die von einem Kreis umschlossen sind. An die Werte zu bekommen ist ja mittels Scanline kein Problem, doch wie mache ich Delphi jetzt klar, dass ich nur die Werte aus dem Kreis will? Ich habe da mal ein bischen in der Mathematik geschnüffelt und folgendes gefunden:

Delphi-Quellcode:
procedure tkreis.kreisroi;

var help,help2,i,j,yobererhalbkreis,yuntererhalbkreis: integer;

begin
  setlength(xywerte,breite,hoehe);
  for i:=0 to breite-1 do
  for j:=0 to hoehe-1 do
    xywerte[i,j]:=true;
  for i:=0 to breite-1 do
    begin
      help:= sqr(rd)-sqr(i-x);
      if help>0 then
        begin
          help2:=round(sqrt(help));
          yobererhalbkreis:=y+help2;
          yuntererhalbkreis:=y-help2;
          for j:=0 to hoehe-1 do
            begin
              if j<=yobererhalbkreis then
              if j>=yobererhalbkreis then
                xywerte[i,j]:=false;
            end;
        end;
    end;
    for i:=0 to breite-1 do
    for j:=0 to hoehe-1 do
     if xywerte[i,j]=true then
       begin
         zahler:= zahler+pixelwerte[i,j];
       end;
end;
Das stammt alles von der Formel y=y0 +- sqrt(r²-(x-x0)²)! XYWerte ist ein Array vom Typ wordbool und der Array pixelwerte vom Typ integer gefüllt mit den Werten der einzelnen Pixel.
Ich bekomme als Ergebniss aber immer nur Null. Freue mich über jeden Tip oder Alternativen, die mich davon abhalten meinen Computer zu verhackstücken.

gruß Brandtson

Seniman 12. Jan 2004 23:02

Re: Pixelvalues in einem Kreis lesen
 
Hallo brandtson,

wenn ich das Problem angehen würde, würde ich es mit dem Satz von Pythagoras machen.
Angenommen du willst überprüfen, ob der Punkt (x,y) im Kreis um den Punkt (mx,my) mit Radius r liegt, dann gilt:
Code:
sqrt(sqr(mx-x)+sqr(my-y))<r
Darüberhinaus kann man beide seiten Quadrieren, denn beide sollten positiv sein, dann kann man folgendes benutzen:

Code:
(sqr(mx-x)+sqr(my-y))<sqr(r)
Das zweite ist wahrscheinlich ein kleinerer Rechenaufwand.
So kannst du jeden Pixel überprüfen, ob er im gegebenen Kreis liegt.

Noch ein Hinweis zu deinem Code:
Statt
Delphi-Quellcode:
 if xywerte[i,j]=true then
würde auch folgendes reichen:
Delphi-Quellcode:
 if xywerte[i,j] then
-> Siehe Datentyp Boolean

Grüße
Seniman

brandtson 13. Jan 2004 10:35

Re: Pixelvalues in einem Kreis lesen
 
Hi Seniman,

danke für deinen guten Ratschlag! Jetzt klappts, die Source ist auch um einiges kürzer geworden.

Delphi-Quellcode:
procedure tkreis.kreisroi2;

var mx,my: integer;

begin
  pixelcount:= 0;
  setlength(xywerte,breite,hoehe);
    for mx:=0 to breite-1 do
      for my:=0 to hoehe-1 do
        begin
          if (sqr(mx-x)+sqr(my-y))<sqr(rd) then
            begin
              xywerte[mx,my]:=true;
              zahler:=zahler+pixelwerte[mx,my];
              pixelcount:= pixelcount+1;
            end;
        end;
end;
gruß brandtson


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