Objeto Canvas
Estou parado com programação a dois anos e me deparei com o seguinte problema ao voltar:
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
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
Curtidas 0
Respostas
Edilcimar
26/03/2008
O polígono vc pode criar e mudar de posição, quanto a calcular a área não tem como, pois cada polígono, se for regular, tem uma fórmula diferente, e se for irregular aí então é que piorou. Alguns polígonos usam integrais para cálculo de área
GOSTEI 0
Rodc
26/03/2008
Pô Edicilmar, segunda vez hoje que te vejo dar uma resposta sem dar a solução. Assim é fácil passar de 2500 posts no forum. :D
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:
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
Edilcimar
26/03/2008
rodc a resposta que dei está correta, é possível criar sim, pegando as posições X e Y, porém a questão da área vai cair em uma integral, a qual vai variar de acordo com o polígono desenhado, portanto se formos basear em respostas, você também não respondeu nada, eu pelo menos falei na integral, o que você nem ao menos fez
GOSTEI 0