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; |