GARANTIR DESCONTO

Fórum Desenhar Seta usando Canvas #282120

18/05/2005

0

Olá a todos.

Estou desenvolvendo uma tela onde o usuário poderá determinar o fluxo de um determinado processo de forma visual.

Para isso, ele joga dois TButtons em um TPanel e faz uma ligação entre os dois TButtons. Esta ligação estou representando desenhado uma reta via Canvas.

Mas quando o fluxo fica complexo, simplesmente não se sabe da onde sai e para onde vai aquela reta. dai a necessidade de eu desenhar uma seta. Mas acontece que eu não consigo (não sei) calcular os pontos necessário (X, Y) dos vértices deste triângulo que irá representar esta seta, pois este cálculo, já percebi, está condicionado a vários fatores.

Um exemplo do que eu quero fazer está na própria IDE do Delphi, na aba Diagram da unit, onde você faz uma ligação entre dois TMemos.

Consegui ´quebrar um galho´ desenhado um circulo, na posição Top, Left do TButton que recebe a seta, mas o resultado deixa a desejar.

Se alguém tiver uma idéia de como se faz isto ou puder indicar algum material, ficarei grato, muito grato.

Um forte abraço a todos,

O link abaixo mostra a tela que foi desenvolvida...

[url]http://marioguedes.vila.bol.com.br/fluxo.jpg[/url]


Marioguedes

Marioguedes

Responder

Posts

18/05/2005

Ericlemes

Putz...´

Que probleminha chato, hein?

Não tenho nenhuma solução pronta, mas creio que vc deva encontrar por aí componentes específicos relacionados à computação gráfica onde deve ter algorítmos prontos pra essas coisas... me lembro de ter visto algo na DSP (Delphi Super Page). Nem sei se existe mais isso.

Eu já tive um trabalho enorme com essa coisa de desenhar em canvas, qdo resolvi tentar fazer um software pra desenhar diagramas E/R (na época isso parecia útil), mas no meu caso, eu só usava ângulos de 90º. Aí era mais fácil desenhar as setas, pq elas eram pra cima, baixo, esquerda, ou direita.


[]´s

Eric Lemes


Responder

Gostei + 0

19/05/2005

Marioguedes

Sobe!


Responder

Gostei + 0

19/05/2005

Edilcimar

crie um triângulo retângulo a partir do ponto final da reta

------------------ (aqui, faça de conta que está bem desenhado)
| /
| /
|/
ao ponto final você conhece, um ponto qualquer sobre a reta você conhece, traçar um perpendicular sobre um reta em um ponto dado é matemática e depois ligue o ponto final da perpendicular até o fim da reta e depois faça o mesmo para o outro lado([color=red:2d82d2b387]vai dar trabalho[/color:2d82d2b387])


Responder

Gostei + 0

23/05/2005

Marioguedes

sobe, pois sou brasileiro e não desisto nunca!


Responder

Gostei + 0

24/05/2005

Ericlemes

O problema é esse ´trace uma perpendicular´...
Que falta estão fazendo as aulas q eu matei na 5a série... ehhehehhe


[]´s

Eric Lemes


Responder

Gostei + 0

24/05/2005

Marioguedes

Olá a todos.

Bom, enfim achei alguém que já passou pelo problema.
Pesquisando na net, topei com o seguinte tópico:

[url]http://www.qualyinf.com.br/forum/delphi/messages/2838.html[/url]

Desta forma, mandei um e-mail para o [b:125f5f598e]Evandro Andre[/b:125f5f598e] que gentilmente me cedeu o código abaixo.

Realmente Eric, é aquela velha história: [i:125f5f598e]´Pra que eu vou usar isso?´[/i:125f5f598e]

  {Desenha a Seta!}
  procedure DesenharSeta(OCor: TColor; OLargura: Integer; Origem, Destino: TPoint);
  const
  ANGULO = 15;
  PONTA  = LADO;
  var
  AlphaRota, Alpha, Beta       : Extended;
  vertice1, vertice2, vertice3 : TPoint;
  begin
  Self.Canvas.Pen.Color   := OCor;
  Self.Canvas.Brush.Color := OCor;
  if (Destino.X >= Origem.X) then
    begin
    if (Destino.Y >= Origem.Y) then
      begin
      AlphaRota := Destino.X - Origem.X;
      if (AlphaRota <> 0)
        then Alpha := ArcTan((Destino.Y - Origem.Y) / AlphaRota)
        else Alpha := ArcTan(Destino.Y - Origem.Y);
      Beta := (ANGULO * (PI / 180)) / 2;
      vertice1.X := Destino.X - Round(Cos(Alpha + Beta));
      vertice1.Y := Destino.Y - Round(Sin(Alpha - Beta));
      vertice2.X := Round(vertice1.X - PONTA * Cos(Alpha + Beta));
      vertice2.Y := Round(vertice1.Y - PONTA * Sin(Alpha + Beta));
      vertice3.X := Round(vertice1.X - PONTA * Cos(Alpha - Beta));
      vertice3.Y := Round(vertice1.Y - PONTA * Sin(Alpha - Beta));
      Self.Canvas.Polygon([vertice1,vertice2,vertice3]);
      end
    else
      begin
      AlphaRota := Destino.Y - Origem.Y;
      if (AlphaRota <> 0)
        then Alpha := ArcTan((Destino.X - Origem.X) / AlphaRota)
        else Alpha := ArcTan(Destino.X - Origem.X);
      Beta := (ANGULO * (PI / 180)) / 2;
      vertice1.X := Destino.X - Round(Cos(Alpha + Beta));
      vertice1.Y := Destino.Y - Round(Sin(Alpha - Beta));
      vertice2.X := Round(vertice1.X + PONTA * Sin(Alpha + Beta));
      vertice2.Y := Round(vertice1.Y + PONTA * Cos(Alpha + Beta));
      vertice3.X := Round(vertice1.X + PONTA * Sin(Alpha - Beta));
      vertice3.Y := Round(vertice1.Y + PONTA * Cos(Alpha - Beta));
      Self.Canvas.Polygon([vertice1,vertice2,vertice3]);
      end;
    end
  else
    begin
    Alpha := ArcTan((Destino.Y - Origem.Y) / (Destino.X - Origem.X));
    Beta := (ANGULO * (PI / 180)) / 2;
    vertice1.X := Destino.X - Round(Cos(Alpha + Beta));
    vertice1.Y := Destino.Y - Round(Sin(Alpha - Beta));
    vertice2.X := Round(vertice1.X + PONTA * Cos(Alpha + Beta));
    vertice2.Y := Round(vertice1.Y + PONTA * Sin(Alpha + Beta));
    vertice3.X := Round(vertice1.X + PONTA * Cos(Alpha - Beta));
    vertice3.Y := Round(vertice1.Y + PONTA * Sin(Alpha - Beta));
    Self.Canvas.Polygon([vertice1,vertice2,vertice3]);
    end;
  end;


Um exemplo do resultado pode ser visto em:

[url]http://marioguedes.vilabol.uol.com.br/fluxo.jpg[/url]

Sucesso a todos!


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar