Fórum Objeto Canvas #355985
26/03/2008
0
Preciso desenhar um poligono fechado de n lados onde cada vertice é dado pelo clique do mouse.
Efetuar o calculo da area desse poligo (gostaria de saber se existe alguma funcao que faça isso)
Preciso por ultimo, permitir que o usuario clique em qualquer vertice do poligono e possa arrasta-lo para redimensionar o desenho sem que perca os demais pontos e novamente efetuar o calculo da sua area.
Obrigado desde ja
Mahamot
Curtir tópico
+ 0Posts
26/03/2008
Edilcimar
Gostei + 0
26/03/2008
Rodc
mahamot, você precisa trabalhar com o Canvas (ex: Form1.Canvas).
Para montar os pontos você terá de ter um vetor de TPoint e cada clique que o usuário dá você guarda o ponto neste vetor, desenhando logo em seguida com a função Polyline() do Canvas. Este função irá desenhar o polígono sem fechá-lo.
Após terminar de preencher os pontos, você desenha o polígono fechado usando a função Polygon(). Porém esta função irá preencher o polígono com a cor definida na propriedade Brush do canvas. Mude o Style do Brush para ficar transparente.
Para calcular a área do polígono não tem função pronta no VCL (não que eu saiba). Procure no google que possívelmente alguém já deve ter feito uma função para este caso.
Para redimensionar os cantos do polígono você terá de usar Regions (áreas ´quentes´). Para criar os Regions você pode usar as funções CreateEllipticRgn, CreateRectRgn entre outras. Consulte o Help do SDK sobre Regions.
Após criar um Region, você deve armazená-lo num vetor de Regions para depois no evento OnMouseMove poder verificar se o mouse está sobre algum dos Regions usando a função PtInRegion.
Se o mouse passar sobre um region você faz aparecer um círculo (sugiro usar TShape) no ponto do referente Region para que o usuário possa clicar e arrastar o componente. E claro, ao arrastar o componente você atualizar o TPoint referente ao ponto e repinta o Polígono.
Espero não ter explicado muito confusamente. Vale lembrar que nunca fiz isto. É apenas teoria, tem que testar e ir fazendo ajustes conforme for preciso.
Happy coding :wink:
Gostei + 0
26/03/2008
Edilcimar
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)