Delphi project: Katten-oog


download programma
download Delphi project

een katten-oog indicator

ook genoemd cat's eye of magic eye, is een a fluorescerende cathodestraal buis gebruikt
voor de afstemming van radio ontvangers.

Een spanning bepaalt de grootte van het verlichte oppervlak.

Dit Delphi project behandelt het tekenen van een kattenoog, te gebruiken als o.a.
indicator van de voortgang van een proces.

De afbeelding hieronder toont het oog in werking:

Tekenen geschiedt op een TImage component.
De rotation knop (eigen maak) levert een getal van 0..100 als percentage van de cirkel.
De reset knop geeft het TImage canvas de kleur van het form..
Tekenen van het kattenoog verandert geen pixels buiten de cirkel.

Analyse




Variable i stapt van height-1 naar 0.
Het tekenen gaat met horizontale lijnen voor elke waarde van i.
Middelpunt C heeft coördinaten (0,0) bij de berekeningen.
Straal r := height div 2.
Hoek a (radialen) hangt af van het percentage v.
a := 0.01*v*pi {pi = 180 graden}
ta := tan(a) de helling van de lijn CA.
De vertikale ordinaat van A is ybound := round(r*(1+cos(a)))
x1,x2 worden voor elke waarde van i berekend.
x2 := round(sqrt(r2 - sqr(i-r)))..........op de cirkel
x1 := round((i-r)*ta).....................op de lijn



De volgende gevallen treden op:
    1. rood : -x2 .. x2
    2. wit: -x2 .. -x1, rood: -x1 .. x1, wit: x1 .. x2
    3. rood: -x2 .. -x1, wit -x1 .. x1,rood: x1 .. x2
    4. wit: -x2 .. x2



Deze gevallen worden bepaald door twee vlaggen (Booleaanse variabelen):
BF := i > ybound
RF := i > r
De kleuren c1,c2 hangen af van BF,RF
procedure line(xstart,xend,color ) tekent een lijn voor y = i
Bij de x-ordinaat wordt r geteld.

Tenslotte wordt een zwarte cirkel getekend.
Voor (BF xor RF)=true zijn drie lijnen nodig, anders één.

Image dimensies

Breedte en hoogte kunnen variëren.
Maak wel de breedte gelijk aan de hoogte.
Beter is om breedte en hoogte oneven te maken zodat middelpunt C ook echt het midden is.

De teken procedure

procedure paintCatsEye(v : byte);
//v is percentage 0..100
var i,r,r2,x1,x2,ybound : smallInt;
    a,ta : single;
    BF,RF : boolean;
    c1,c2 : dword;   //colors

    procedure line(a,b: smallInt; col : dword);
    begin
     with form1.Image1.Canvas do
      begin
       pen.Color := col;
       moveto(a+r,i);
       lineto(b+r,i);
      end;
    end;

begin
 with form1.Image1 do
  begin
   r := width shr 1;
   r2 := r*r;
   a := 0.01*v*pi;   //angle in radians
   if v = 50 then ta := 10000 else ta := tan(a);
   ybound := round(r*(1+cos(a)));
   for i := height-1 downto 0 do
    begin
     BF := i > ybound;
     RF := i > r;
     x2 := round(sqrt(r2 - sqr(i-r)));
     if BF then begin
                 c1 := $ff;
                 c2 := $ffffff;
                end
      else begin
            c1 := $ffffff;
            c2 := $ff;
           end;
     if RF xor BF then
      begin
       x1 := round((i-r)*ta);
       line(-x2,-x1,c1);
       line(-x1,x1,c2);
       line(x1,x2,c1);
      end
      else line(-x2,x2,c1);
    end;//for i
   with canvas do
    begin
     brush.style := bsClear;
     pen.color := 0;
     ellipse(0,0,width,height);
    end;
  end;//with
end;

Het image initialiseren

procedure InitCatsEye;
begin
 with form1.Image1 do with canvas do
  begin
   brush.style := bsSolid;
   brush.Color := form1.Canvas.Brush.color;
   fillrect(rect(0,0,width,height));
  end;
end;
Tot zover deze beschrijving van het katten-oog tekenen.

Een beschrijving van de rotation button is [HIER] te vinden.