GARANTIR DESCONTO

Fórum Trabalhando com Graphics e MouseEvent - Java desktop #554225

19/05/2016

0

Boa noite ,
Estou fazendo um projeto da faculdade para a disciplina de Computação grafica,
onde a aplicação solicita que o usúario crie pontos na tela e depois ao clicar em um botao gerar um curva bezier.
essa parte eu consegui fazer com exito depois de muito trabalho. Porém preciso colocar alguns metodos novos ,
solicitadas pelo professor , são eles:
1 - Ao selecionar um ponto ja criado na tela , vc poder alterar a sua posição
e depois gerar uma nova curva;
2 - Além de criar uma curva , tbm cria uma reta que liga cada ponto;
3 - E ao ives de usar um botão para executa a geração da curva,
criar um metodo que faça automaticamente a partir do 3 ponto
a curva , sendo atualizada a cada ponto que ser adicionado.
4 - informa as cordenadas selecionas ao lado dos pontos escolhidos
EX: P1(122,234) P2(252,345)


Estou tentando fazer porém estou tendo muita dificuldade ness processo, será que alguém poderia me da uma força?
segue abaixo o código da aplicação.
des de já agraceço qualquer ajuda!
Obrigado.
    

package br.com.appbezier2;  
      
    import java.awt.BorderLayout;  
    import java.awt.Color;  
    import java.awt.Graphics;  
    import java.awt.Point;  
    import java.awt.Toolkit;  
    import java.awt.event.ActionEvent;  
    import java.awt.event.ActionListener;  
    import java.awt.event.MouseAdapter;  
    import java.awt.event.MouseEvent;  
    import java.util.ArrayList;  
    import javax.swing.*;  
      
    /** 
     * Aplicação simples para desenhar uma curva de Bezier . 
     * 
     * @author Márcio Santos 
     */  
    public class AppBezier {  
      
        private JFrame frame;  
        private JPanel painel;  
        private JLabel campo;  
        private JButton JBGerarCurva;  
        private JButton JBNovo;  
        private JSpinner spinner;  
        private SpinnerModel modelo;  
        private ArrayList<Point> pontos;  
        private ClickListener mouseClick;  
      
        /** 
         * Construtor da classe Criação da interface gráfica 
         */  
        public AppBezier() {  
      
            pontos = new ArrayList<>();  
            frame = new JFrame("Aplicativo - Gerador de Curvas Bezier | @Autor Márcio Santos"<img src="http://javafree.uol.com.br/forum/images/smiles/icon_wink.gif">;  
            frame.setSize(800, 600);  
            frame.setVisible(true);  
            frame.setResizable(false);  
            frame.setLocationRelativeTo(null);  
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
            setPainel();  
            inicializarComponentes();  
            setIcon();  
      
        }  
      
        /** 
         * Método que inicia os componentes de execução 
         */  
        public void inicializarComponentes() {  
      
            painel.addMouseListener(  
                    new MouseAdapter() {  
      
                @Override  
                public void mousePressed(MouseEvent e) {  
      
                    painel.getGraphics().fillOval(e.getX() - 5, e.getY() - 5, 10, 10);  
                    pontos.add(new Point(e.getX(), e.getY()));  
      
                }  
      
      
            }  
            );  
      
            modelo = new SpinnerNumberModel(200, 1, 1000, 10);  
            spinner = new JSpinner(modelo);  
      
            JBNovo.addActionListener(  
                    new ActionListener() {  
      
                @Override  
                public void actionPerformed(ActionEvent e) {  
      
                    painel.repaint();  
                    pontos.clear();  
      
                }  
      
            }  
            );  
      
            JBGerarCurva.addActionListener(  
                    new ActionListener() {  
      
                @Override  
                public void actionPerformed(ActionEvent e) {  
                    gerarCurva(painel.getGraphics(), pontos, (int) modelo.getValue());  
                    pontos.clear();  
      
                }  
      
            }  
            );  
      
        }  
      
        /** 
         * Executa a aplicação 
         */  
        public static void main(String[] args) {  
      
            new AppBezier();  
      
        }  
      
        /** 
         * Método que cria a curva bezier 
         * 
         * @param g - objeto gráfico para desenhar na tela 
         * @param pontos - os Pontos de controle capturados para desenhar a curva 
         * @param numeroPuntos - O número de Pontos que formam a curva ( quanto mais 
         * a curva tem maior qualidade, mas requer mais processamento ) 
         */  
        public void gerarCurva(Graphics g, ArrayList<Point> pontos, int numeroPuntos) {  
      
            //Variáveis ​​para armazenar os pontos calculados  
            double pontoX = 0, pontoY = 0;  
            g.setColor(Color.BLUE);  
              
            // Esta lista armazena os pontos  
            // Desenhando ponto a ponto  
            ArrayList<int[]> anteriores = new ArrayList<>();  
            double avance = 1 / ((double) numeroPuntos);  
            int tamLista = pontos.size();  
      
            //Este ciclo realiza o número de interações que o usuário deseja fazer  
            for (double u = 0; u <= 1; u += avance) {  
                //Este ciclo repete o Pontos que vai desenhar e calcula o próximo ponto na curva  
                for (int k = 0; k < tamLista; k++) {  
                    double b = calcularB(u, tamLista - 1, k);  
                    pontoX += pontos.get(k).getX() * b;  
                    pontoY += pontos.get(k).getY() * b;  
                }  
      
                //Eles são armazenados e desenhados encima dos pontos calculados  
                anteriores.add(new int[]{(int) pontoX, (int) pontoY});  
                g.drawLine((int) pontoX, (int) pontoY, (int) pontoX, (int) pontoY);  
      
                // A linha a partir do ponto anterior é desenhado para o recém calculada  
                // Dessa forma, não calculamos ponto por ponto de toda a curva  
                if (anteriores.size() > 1) {  
                    g.drawLine(anteriores.get(anteriores.size() - 2)[0], anteriores.get(anteriores.size() - 2)[1], (int) pontoX, (int) pontoY);  
                    // Nós removemos o primeiro item que não é mais usado  
                    anteriores.remove(0);  
                }  
      
                //Nós apagamos os valores antigos para a próxima iteração  
                pontoX = pontoY = 0;  
            }  
      
            //A última perna da curva é desenhada  
            g.drawLine((int) anteriores.get(anteriores.size() - 1)[0], (int) anteriores.get(anteriores.size() - 1)[1],  
                    (int) pontos.get(tamLista - 1).getX(), (int) pontos.get(tamLista - 1).getY());  
      
        }  
      
        /** 
         * Método de cálculo B é a função de ordem k Combinação N + 1 Pontos 
         * controlar . 
         * 
         * @param u - número de iteração atual 
         * @ Param N - número de Pontos de controle 
         * @ Param K - o número de ponto atual 
         * 
         * @return b 
         */  
        private double calcularB(double u, int n, int k) {  
      
            return (factorial(n) / (factorial(k) * factorial(n - k)))  
                    * Math.pow(u, k) * Math.pow(1 - u, n - k);  
      
        }  
      
        /** 
         * Método de cálculo do fatorial de um número . 
         * 
         * @ Param N - número que recebe o valor do fatorial 
         * 
         * @return Fatorial de n 
         */  
        private double factorial(int n) {  
      
            double factorial = 1;  
      
            if (n == 0 || n == 1) {  
                return factorial;  
            } else {  
                for (int i = 2; i <= n; i++) {  
                    factorial *= i;  
                }  
      
                return factorial;  
            }  
      
        }  
      
        /** 
         * Método que adiciona o logo do aplicativo na GUI . 
         */  
        public void setIcon() {  
            frame.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("icone.png"<img src="http://javafree.uol.com.br/forum/images/smiles/icon_wink.gif">));  
        }  
      
        /** 
         * Método que adiciona o componentes de execução do aplicativo passando seus 
         * devidos tamanhos e posições na GUI(Botões) 
         */  
        public void setPainel() {  
            painel = new JPanel();  
            painel.setBackground(Color.LIGHT_GRAY);  
            painel.setBounds(0, 0, 150, 600);  
            painel.setLayout(new BorderLayout());  
            JBNovo = new JButton("LIMPAR"<img src="http://javafree.uol.com.br/forum/images/smiles/icon_wink.gif">;  
            JBNovo.setBounds(250, 490, 150, 50);  
            painel.add(JBNovo);  
            JBGerarCurva = new JButton("GERAR CURVA"<img src="http://javafree.uol.com.br/forum/images/smiles/icon_wink.gif">;  
            JBGerarCurva.setBounds(400, 490, 150, 50);  
            painel.add(JBGerarCurva);  
            frame.add(painel);  
            campo = new JLabel();  
            campo.setBounds(0, 450, 150, 150);  
            painel.add(campo);  
      
        }  
      
    }  
Márcio Santos

Márcio Santos

Responder

Post mais votado

24/05/2016

A parte de ir alterando a curva a partir do terceiro ponto é mais simples, dentro do evento que e chamado quando o mouse é clicado para adicionar um novo ponto coloque uma verificação no size do array se ele for igual a três você chama o método que desenha a curva se não for não faz nada, agora não entendi muito bem essa parte mas com a explicação você deve se desenrolar, se cada curva é gerada a cada três pontos então você verifica se o arrayList tem size múltiplo de 3, mas se a mesma curva puder conter mais de três pontos você só verifica se o size() é maior que 2 e pronto chama o método pra desenhar a curva.

No caso da mudança de coordenada dos pontos você deve adicionar um Listener em cada novo ponto criado assim quando ele for clicado após a criação você pode implementar um mecanismo que solicite as novas coordenadas e as mude, como um JOptionPane ou até mesmo drag n drop já que você agora tem o listener e pode implementar as funções onDragStar e onDragEnd.

Para informar as coordenadas de um ponto selecionado dependendo de quem a classe ponto herda você poderá utilizar um tooltip, se isso não for possível por herança recorra ao listener de onMouseOver e dentro dele pegue as coordenadas desse ponto dê uma andada pro lado e desenhe um componente na tela com essas coordenadas ao retirar o mouse de cima do ponto o mouse vai disparar outro evento indicando a saida do mouse de cima do objeto a você remove o objeto desenhado da tela usando a instância criada anteriormente e pronto.

Renan Di

Renan Di
Responder

Gostei + 1

Mais Posts

25/05/2016

Márcio Santos

Obrigado pela ajuda amigo, consegui fazer os outros passos. Porém estou com problema na parte de mover os pontos e excluir, será que poderia me explicar melhor como fazer com algum código ?
des de já agradeço!
Responder

Gostei + 0

25/05/2016

Renan Di

Cara é o seguinte dei uma olhada na parte do seu código e vi que a classe que modela os pontos apenas guarda as coordenadas e não é de fato um objeto visual, isso complica um pouco as coisas pois se ele fosse um objeto de verdade como um ComboBox ou uma Lista você poderia clicar segurar e arrastar e usar as propriedades de Drag and Drop que o java tem, mas como a sua curva é desenhada a partir das coordenadas você vai ter um trabalhinho a mais pra fazer isso.
Minha sugestão para o cenário atual, registre um listener na sua tela para o evento de mousePressed ou seja quando o usuário clicar e segurar em uma área da tela onde possa haver um ponto, dentro desse listener capture as coordenadas do mouse varra o seu array de pontos e compare se há algum ponto no local clicado, lembre-se será muito difícil para o usuário clicar exatamente naquele ponto então dê uma margem para o seu cálculo exemplo, o mouse retornou x=5 e y=5 você poderá considerar qualquer ponto com até dois pixels de diferença x=3 ou x=7 fica a seu critério, após soltar o mouse em um novo ponto da tela outro evento será disparado o mouseReleased se não me engano, ai vem a mudança de posição com a instância do ponto que você achou no primeiro evento você deve implementar uma forma de passa-la para este segundo evento, como uma variável global por exemplo, daí você substitui os valores antigos pelos novos e chama o código pra redesenhar a tela agora com os novos valores.
Para excluir é bem parecido, só que ao invés de usar os eventos pressed e released você se valerá do onClick seguido do evento de teclado keyPressed, nele você identifica se foi pressionada a tecla DELETE, só não esqueça que em ambos os casos se o primeiro evento se repetir sem que o segundo aconteça a variável que você usa pra passar a referência dos pontos entre os métodos deve ser limpa pois se não poderia ocorrer de o usuário clicar num ponto depois clicar em outro lugar onde não tem um ponto válido e apertar DELETE e apagar o ponto anterior sem querer, ou seja, clicou no ponto e apertou delete apaga, clicou no ponto e apertou qualquer outra coisa ou clicou fora da seleção limpa a seleção tipo varivavel=null

Abaixo alguns links que podem ajudar a entender o que eu falei, se ficar muito complicado você pode continuar a perguntar, no entanto se conseguir fazer tudo avisa também:

Tutorial Drag N Drop Parte 1
Tutorial Drag N Drop parte 2
Tutorial Drag N Drop parte 3
Oracle MouseListener
Responder

Gostei + 1

26/05/2016

Márcio Santos

Boa noite Renan, muito obrigado pelas suas dicas todas elas foram bem aproveitas.
Pós então , a opção de excluir um ponto eu ate conseguir fazer, porém to naquele problema de acertar exatamente as coordenadas do ponto ja criado
para realizar a exclusão do mesmo. Já a de mover eu ainda não tentei, pós comecei pelo método de exclusão.
segue o código atualizado pra vc dar uma melhor analizada e tentar ve se pode me ajudar de alguma forma.
des de já agradeço pelo sua atenção , não é todo mundo que tem essa boa vontade de gastar seu valorozo
tempo para ajudar alguém nos dias de hoje.
Parabéns pela sua atitude :D
e mais uma vez muito obrigado!

package br.com.appbezier2;

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.*;

/**
 * Aplicação simples para desenhar uma curva de Bezier .
 *
 * @author Márcio Santos
 */
public class AppBezier {

    private JFrame frame;
    private JLabel label;
    private JPanel painel;
    private JButton btnLimpar;
    private JSpinner spinner;
    private SpinnerModel SpinnerModelo;
    private ArrayList<Point> pontos;
    private Graphics2D g2;
    private MouseClick mouseClick;

    /**
     * Construtor da classe Criação da interface gráfica
     */
    public AppBezier() {

        pontos = new ArrayList<>();
        frame = new JFrame("Aplicativo - Gerador de Curvas Bezier | @Autores Márcio Santos/Vinicios Araujo");
        frame.setSize(800, 600);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setPainel();
        inicializarComponentes();
        setIcon();

    }

    /**
     * Método que inicia os componentes de execução
     */
    public void inicializarComponentes() {
        
        painel.addMouseListener(new MouseAdapter(){
        
        @Override
        public void mouseReleased(MouseEvent e){
            System.out.println("Coord("+e.getX()+":"+e.getY()+")");
            
            
        }
        });

        painel.addMouseListener(
                new MouseClick() {

            @Override
            public void singleClick(MouseEvent e) {

                switch (pontos.size()) {
                    case 0:
                        paint(e);
                        break;

                    case 1:
                        paint(e);
                        break;

                    case 2:
                        paint(e);
                        repaint(e);
                        break;

                    case 3:
                        repaintAlter(e);
                        paint(e);
                        repaint(e);
                        break;

                    default:
                        repaintAlter(e);
                        paint(e);
                        repaint(e);
                        break;

                }
            }

        }
        );

        painel.addMouseListener(new MouseClick() {

            @Override
            public void doubleClick(MouseEvent e) {
                for(int i=0;i<pontos.size();i++){
                System.out.println("Inicio - P"+(i+1)+":"+pontos.get(i).toString());
                removePonto(e);
                System.out.println("Fim - P"+(i+1)+":"+pontos.get(i).toString());
                System.out.println("<--------------------------------------------->");
                }
            }

        });

        SpinnerModelo = new SpinnerNumberModel(200, 1, 1000, 10);
        spinner = new JSpinner(SpinnerModelo);

        btnLimpar.addActionListener(
                new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                limparTela();

            }

        }
        );
    }

    /**
     * Executa a aplicação
     */
    public static void main(String[] args) {

        new AppBezier();

    }

    /*
    * Método que cria as linhas que ligam os pontos
     */
    public void criaPonto(MouseEvent e, Graphics g) {
        g2 = (Graphics2D) g;
        g2.setStroke(new BasicStroke(2));
        g2.setColor(Color.BLACK);
        g2.fillOval(e.getX() - 5, e.getY() - 5, 14, 14);
        
    }

    /*
    * Método que cria as linhas que ligam os pontos
     */
    public void criaLinha(Graphics g) {
        g2.setColor(Color.BLUE);
        if (pontos.size() > 1) {
            int n = pontos.size();
            for (int i = 0; i < n - 1; i++) {
                g2.drawLine((int) pontos.get(i).getX(), (int) pontos.get(i).getY(), (int) pontos.get(i + 1).getX(), (int) pontos.get(i + 1).getY());

            }

        }
    }

    /**
     * Método que cria a curva bezier
     *
     * @param g - objeto gráfico para desenhar na tela
     * @param pontos - os Pontos de controle capturados para desenhar a curva
     * @param numeroPontos - O número de Pontos que formam a curva ( quanto mais
     * a curva tem maior qualidade, mas requer mais processamento )
     */
    public void criaCurva(Graphics g, int numeroPontos, Color cor) {;
        g2.setColor(cor);

        //Variáveis ​​para armazenar os pontos calculados
        double pontoX = 0, pontoY = 0;
        int cont = 0;

        // Esta variasveis armazenam os pontos
        ArrayList<int[]> anteriores = new ArrayList<>();
        double avance = 1 / ((double) numeroPontos);
        int tamLista = pontos.size();

        //Este ciclo realiza o número de interações que o usuário deseja fazer
        for (double u = 0; u <= 1; u += avance) {
            //Este ciclo repete o Pontos que vai desenhar e calcula o próximo ponto na curva
            for (int k = 0; k < tamLista; k++) {
                double b = calcularB(u, tamLista - 1, k);
                pontoX += pontos.get(k).getX() * b;
                pontoY += pontos.get(k).getY() * b;
            }

            //Eles são armazenados e desenhados encima dos pontos calculados
            anteriores.add(new int[]{(int) pontoX, (int) pontoY});
            //g2.drawLine((int) pontoX, (int) pontoY, (int) pontoX, (int) pontoY);

            // A linha a partir do ponto anterior é desenhado para o recém calculada
            // Dessa forma, não calculamos ponto por ponto de toda a curva
            if (anteriores.size() > 1) {
                g2.drawLine(anteriores.get(anteriores.size() - 2)[cont], anteriores.get(anteriores.size() - 2)[cont + 1], (int) pontoX, (int) pontoY);
                // Nós removemos o primeiro item que não é mais usado
                anteriores.remove(cont);

            }

            //Nós apagamos os valores antigos para a próxima iteração
            pontoX = pontoY = 0;
        }

        //A última perna da curva é desenhada
        g2.drawLine((int) anteriores.get(anteriores.size() - 1)[cont], (int) anteriores.get(anteriores.size() - 1)[cont + 1],
                (int) pontos.get(tamLista - 1).getX(), (int) pontos.get(tamLista - 1).getY());

    }

    /**
     * Método de cálculo B é a função de ordem k Combinação N + 1 Pontos
     * controlar .
     *
     * @param u - número de iteração atual
     * @ Param N - número de Pontos de controle
     * @ Param K - o número de ponto atual
     *
     * @return b
     */
    private double calcularB(double u, int n, int k) {

        return (factorial(n) / (factorial(k) * factorial(n - k)))
                * Math.pow(u, k) * Math.pow(1 - u, n - k);

    }

    /**
     * Método de cálculo do fatorial de um número .
     *
     * @ Param N - número que recebe o valor do fatorial
     *
     * @return Fatorial de n
     */
    private double factorial(int n) {

        double factorial = 1;

        if (n == 0 || n == 1) {
            return factorial;
        } else {
            for (int i = 2; i <= n; i++) {
                factorial *= i;
            }

            return factorial;
        }

    }

    /**
     * Método que adiciona o logo do aplicativo na GUI .
     */
    public void setIcon() {
        frame.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("icone.png")));
    }

    /**
     * Método que adiciona o componentes de execução do aplicativo passando seus
     * devidos tamanhos e posições na GUI(Botões)
     */
    public void setPainel() {
        painel = new JPanel();
        painel.setBackground(Color.LIGHT_GRAY);
        painel.setBounds(0, 0, 150, 600);
        painel.setLayout(new BorderLayout());
        btnLimpar = new JButton("LIMPAR");
        btnLimpar.setBounds(250, 490, 300, 50);
        painel.add(btnLimpar);
        frame.add(painel);
        label = new JLabel();
        label.setBounds(0, 450, 150, 150);
        painel.add(label);

    }

    public void limparTela() {
        painel.repaint();
        pontos.clear();
    }

    public void removePonto(MouseEvent e) {
        for (int i = 0; i < pontos.size(); i++) {
            Point p = pontos.get(i);
            if (e.getPoint().equals(p)) {
                pontos.remove(p);
            }

        }

    }

    public void paint(MouseEvent e) {
        pontos.add(new Point(e.getX(), e.getY()));
        criaPonto(e, painel.getGraphics());
        criaLinha(painel.getGraphics());
        paintCoord(e, painel.getGraphics());
    }

    public void paintCoord(MouseEvent e, Graphics g) {
        g2.setColor(Color.BLACK);
        int p = pontos.size();
        int x = e.getX();
        int y = e.getY();
        g2.drawString("P" + p, e.getX() - 5, e.getY() - 5);
    }

    public void repaint(MouseEvent e) {
        criaCurva(painel.getGraphics(), (int) SpinnerModelo.getValue(), Color.RED);
    }

    public void repaintAlter(MouseEvent e) {
        criaCurva(painel.getGraphics(), (int) SpinnerModelo.getValue(), Color.LIGHT_GRAY);
    }

}
Responder

Gostei + 0

26/05/2016

Renan Di

Cara boa madrugada pra você rsrsrsrs... vou tentar te ajudar com essa dúvida ai, no seu método:

public void removePonto(MouseEvent e) {
        for (int i = 0; i < pontos.size(); i++) {
            Point p = pontos.get(i);
            if (e.getPoint().equals(p)) {
                pontos.remove(p);
            }
 
        }
 
    }

O seu método usa o equal da class Point para saber se um ponto é igual ao outro mas o que você na verdade quer saber é se a distância entre o ponto clicado e o ponto a ser excluído é maior que uma determinada distância que você deve definir, como eu havia dado o exemplo antes a distância era de 2px, o cálculo para a distância entre dois pontos é a hipotenusa do triângulo, o que você tem que fazer é calcular isso e ver se o resultado é maior que a margem que você estabelecu(ex: 2px) se ela for menor que a sua margem provavelmente o usuário clicou exatamente em cima do ponto(muito difícil) ou bem próximo dele ai você pode deletar o ponto.

Digamos que a coordenada do ponto era (0, 0) e o usuário clicou em (1,1) o cáculo daria 1px de distância que estaria dentro da margem de erro definida logo ele passaria no if e deletaria o ponto. Nós não sabemos de fato qual a implementação do equals então ele pode por exemplo estar comparando se a instância dos dois objetos é a mesma o que sempre dará false na sua implementação já que você sempre cria um novo ponto então tenta fazer dessa maneira usando o cálculo que te falei e definindo uma margem pois volto a dizer que acho muito difícil acertar exatamente no mesmo ponto clicado anteriormente, se tiver mais dúvidas manda ai!
Responder

Gostei + 0

26/05/2016

Renan Di

Cara boa madrugada pra você rsrsrsrs... vou tentar te ajudar com essa dúvida ai, no seu método:

public void removePonto(MouseEvent e) {
        for (int i = 0; i < pontos.size(); i++) {
            Point p = pontos.get(i);
            if (e.getPoint().equals(p)) {
                pontos.remove(p);
            }
 
        }
 
    }

O seu método usa o equal da class Point para saber se um ponto é igual ao outro mas o que você na verdade quer saber é se a distância entre o ponto clicado e o ponto a ser excluído é maior que uma determinada distância que você deve definir, como eu havia dado o exemplo antes a distância era de 2px, o cálculo para a distância entre dois pontos é a hipotenusa do triângulo, o que você tem que fazer é calcular isso e ver se o resultado é maior que a margem que você estabelecu(ex: 2px) se ela for menor que a sua margem provavelmente o usuário clicou exatamente em cima do ponto(muito difícil) ou bem próximo dele ai você pode deletar o ponto.

Digamos que a coordenada do ponto era (0, 0) e o usuário clicou em (1,1) o cáculo daria 1px de distância que estaria dentro da margem de erro definida logo ele passaria no if e deletaria o ponto. Nós não sabemos de fato qual a implementação do equals então ele pode por exemplo estar comparando se a instância dos dois objetos é a mesma o que sempre dará false na sua implementação já que você sempre cria um novo ponto então tenta fazer dessa maneira usando o cálculo que te falei e definindo uma margem pois volto a dizer que acho muito difícil acertar exatamente no mesmo ponto clicado anteriormente, se tiver mais dúvidas manda ai!
Responder

Gostei + 0

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

Aceitar