Programming a cat's eye indicator


download cat's eye program
download cat's eye Delphi project

A cat's eye indicator

also called magic eye, is a fluorescent cathode ray indicator used for radio receiver tuning.

A voltage controls the size of illumination.
This Delphi project paints a cat's eye indicator to be used for progress reporting.

Picure below shows the project at work:

Painting is done on a TImage component.
A rotation button (home brew component) supplies a number 0..100 as percentage to the cat's eye paint procedure.
The reset button causes the TImage to set it's canvas to the form color.
Drawing of the cat's eye does not alter pixels outside the circle.

Analyses




Variable i steps from height-1 downto 0.
Painting is done by drawing horizontal lines for each i.
Center C has coordinates (0,0) during calculations.
Radius r := height div 2.
Angle a (radians) depends on the percentage v.
a := 0.01*v*pi {pi = 180 degrees}
ta := tan(a) the slope of line CA.
Vertical coordinate of A is ybound := round(r*(1+cos(a)))
x1,x2 are calculated for each i.
x2 := round(sqrt(r2 - sqr(i-r)))..........on circle
x1 := round((i-r)*ta).....................on line



The following cases for line drawing are observed:
    1. red : -x2 to x2
    2. white: -x2 to -x1, red: -x1 to x1, white: x1 to x2
    3. red: -x2 to -x1, white -x1 to x1,red: x1 to x2
    4. white: -x2 to x2



To distinguish between these cases 2 flags (Boolean variables) are used:
BF := i > ybound
RF := i > r
Colors c1,c2 are set to red or white according to BF,RF
Then procedure line(xstart,xend,color ) is called to draw the lines at y = i
Also the line procedure adds r to the x coordinates

Finally the black circle is drawn.
Three lines are required if (BF xor RF) is true.
In the other cases one line is sufficient.
Please refer to the source code for more details.

Image dimensions

Different image dimensions may be selected.
Make sure that width = height.
Best is to make width and height odd, so center C is really the center of the circle.

The cat's eye paint 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;

The procedure to initialize the image

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;
This concludes the cat's eye paint description.

The rotation button description and source code may be found [HERE]