Canvas - relogio feito com elipses (maluco)

Top  Previous  Next

    procedure RelogioMaluco(

        c: TCanvas;

        x0, y0: integer; // Centro das circunferências

        ri, re: integer; // Raio da circunferência interna e da externa

        n: integer; // Qtde de pontos

        n1, n2: integer // Índice dos pontos a serem ligados

    );

    var p: TPoint;

        i: integer;

        a: double; // Ângulo para cada ponto

        p1, p2: TPoint; // Pontos a serem ligados

        d: double; // Distância entre os pontos

        rm: double; // Raio médio das circunferências

        rs: integer; // Raio da semicircunferência

    begin

        // Muda o modo de desenho

        // do canvas para não preencher

        c.Brush.Style := bsClear;

        // Desenha circunferências externa e interna

        c.Ellipse(x0 - re, y0 - re, x0 + re, y0 + re);

        c.Ellipse(x0 - ri, y0 - ri, x0 + ri, y0 + ri);

        // Calcula o ângulo

        a := 2 * Pi / n;

        // O cálulo dos pontos usa o raio médio

        // das duas circunferências

        rm := (re + ri) / 2.0;

        // Desenha pontos, considerando o primeiro ponto

        // na posição das 12 horas do relógio

        for i := 0 to Pred(n) do begin

            // Calcula ponto

            p.x := Round(rm * sin(a * i)) + x0;

            // O sinal de - em y é devido ao fato do sistema de

            // coordenadas MM_TEXT ter o y positivo para cima

            p.y := -Round(rm * cos(a * i)) + y0;

            // Se o índice coincide com um dos pontos, salva

            // coordenadas

            if Succ(i) = n1 then p1 := p;

            if Succ(i) = n2 then p2 := p;            

            // Escreve os valores. Fica fácil aqui adicionar

            // uma linha para desenhar os pontos

            c.TextOut(p.x, p.y, IntToStr(Succ(i)));

        end;

        // A semicircunferência terá o centro no ponto médio

        p.x := (p1.x + p2.x) div 2;

        p.y := (p1.y + p2.y) div 2;

        // Seu raio será metade da distância entre os pontos

        d := sqrt(sqr(p1.x - p2.x) + sqr(p1.y - p2.y));

        rs := Round(d / 2);

        // Desenha uma elipse delimitada pelos pontos

        c.Arc(p.x - rs, p.y - rs, p.x + rs, p.y + rs,

        p2.x, p2.y, p1.x, p1.y);

    end;

        

 

    procedure TForm1.FormPaint(Sender: TObject);

    begin

        RelogioMaluco(

            Canvas,

            ClientWidth div 2,

            ClientHeight div 2,

            ClientHeight div 3,

            ClientHeight div 4,

            12,

            1,

            4

        );

    end;