![]() |
![]() |
|||||||||
een katten-oog indicator ook genoemd cat's eye of magic eye, is een a fluorescerende cathodestraal buis gebruiktvoor de afstemming van radio ontvangers.
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:
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. |
||||||||||
![]() |
![]() |