Fórum Desenhar Seta usando Canvas #282120
18/05/2005
0
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
Curtir tópico
+ 0Posts
18/05/2005
Ericlemes
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
Gostei + 0
19/05/2005
Marioguedes
Gostei + 0
19/05/2005
Edilcimar
------------------ (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])
Gostei + 0
23/05/2005
Marioguedes
Gostei + 0
24/05/2005
Ericlemes
Que falta estão fazendo as aulas q eu matei na 5a série... ehhehehhe
[]´s
Eric Lemes
Gostei + 0
24/05/2005
Marioguedes
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!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)