Pegar a distância de um ponto ao outro, implementação de um círculo

4 respostas
guilherme.thcarlos

Galera do GUJ, beleza?

Eu estou fazendo um trabalho para a faculdade em que preciso implementar algumas funções em um programa estilo Paint. Atualmente na função de círculo, eu estou tendo problema para pegar o raio correto.

Ele funciona da seguinte maneira: Circulo(coordenada_x, coordenada_y, raio), onde o usuario irá clicar em algum ponto inicial da tela e em outro para definir o limite do círculo.

Como eu pego a distância entre o ponto inicial (centro do circulo) até aonde o usuario clicou (limite do circulo)? Estou usando o método p1.getX() e p1.getY() para pegar as coordenadas do ponto inicial.

segue alguns trechos (que julgo eu) serem importantes:

else
                if(esperaInicioCirculo)
                {
                    p1 = new Ponto(e.getX(), e.getY(), corAtual);
                    
                    esperaInicioCirculo = false;
                    esperaFimCirculo = true;
                    statusBar1.setText("Mensagem: clique o limite do círculo");
                }
            else
                if(esperaFimCirculo)
                {
                    esperaInicioCirculo = false;
                    esperaFimCirculo = false;
                    figuras.add (new Circulo(p1.getX(), p1.getY(), p1.getX()-p1.getY(), corAtual));
                    figuras.get(figuras.size()-1).torneSeVisivel(pnlDesenho.getGraphics());
                    statusBar1.setText("Mensagem:");
                }
public class Circulo extends Figura
{
    protected Ponto centro;
    protected int   raio;
	
    public Circulo (int x, int y, int r)
    {
        super ();

        this.centro = new Ponto (x,y);
        this.raio   = r;
    }
	
    public Circulo (int x, int y, int r, Color cor)
    {
        super (cor);

        this.centro = new Ponto (x,y);
        this.raio   = r;
    }
public void setRaio (int r)
    {
        this.raio = r;
    }

    public Ponto getCentro ()
    {
        return this.centro;
    }

    public int getRaio ()
    {
        return this.raio;
    }

    public void torneSeVisivel (Graphics g)
    {
        g.setColor (this.cor);
        g.drawOval (this.centro.getX()-raio, this.centro.getY()-raio, 2*raio, 2*raio);
			
    }

Alguma ajuda?

4 Respostas

fernandosavio

olá guilherme.thcarlos
Acho que o seu problema não é código e sim cálculo…
Estou meio enferrujado mas pensa comigo…
Se você tem duas coordenadas x,y você pode calcular a diferença entre os dois x e dpois os dois y…
Aí pega esses valores e aplica no Teorema de Pitágoras
Vê se é isso mesmo que tu quer.

guilherme.thcarlos

Eu acho que consegui fazer isso que você falou, mas agora simplesmente não vai… não aparece meu círculo…

Olha o que fiz até agora:

int raio_x = (e.getX() - p1.getX()) * (e.getX() - p1.getX());
int raio_y = (e.getY() - p1.getY()) * (e.getY() - p1.getY());
int raio = (int) ((raio_x + raio_y)* 0.5);
figuras.add (new Circulo(p1.getX(), p1.getY(), raio, corAtual));
figuras.get(figuras.size()-1).torneSeVisivel(pnlDesenho.getGraphics());

Eu fui forçado a colocar esse cast, mas não entendi direito o motivo.

E

Hum… um probleminha que todo mundo tem em Java ao criar um programa de desenho é que você nunca, nunca, nunca deve desenhar uma coisa “diretamente”, tal como você fez. (Pelo que estou imaginando, seu professor também não sabe disso).

Um sintoma desses é que quando você move ou redimensiona ou minimiza ou faz qualquer coisa com a janela, ela simplesmente desaparece.

Há duas maneiras de se tratar disso:

a) Você cria uma estrutura de dados que contém uma representação geométrica das figuras a serem desenhadas (ou redesenhadas) na tela, e faz com que o método paintComponent de uma classe derivada de JPanel redesenhe a tela de acordo com essa estrutura de dados. (Usualmente é uma lista de primitivas geométricas, tais como Points, Shapes etc.). Para atualizar esse desenho, deve-se então chamar o método repaint() dessa classe derivada de JPanel.
b) Ou você cria uma BufferedImage e desenha nela, e então você, no método paintComponent, mostra essa BufferedImage.

Procure aqui no GUJ por exemplos que o ViniGodoy escreveu.

Outra coisa que é complicada em Java é simplesmente você saber que você clicou em uma determinada posição da tela com o mouse. Sempre tem de fazer um monte de contas.

E

De qualquer forma, para poder achar o raio de um círculo, você precisa de um pouquinho de geometria. O pessoal já lhe informou sobre o teorema de Pitágoras. Pelo que imagino, você quer algo parecido com a animação Flash que aparece nesta página, não?

http://www.mathopenref.com/radius.html

Criado 27 de setembro de 2011
Ultima resposta 28 de set. de 2011
Respostas 4
Participantes 3