Trabalhando com Graphics e MouseEvent - Java desktop
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.
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
Curtidas 0
Melhor post
Renan Di
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.
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.
GOSTEI 1
Mais Respostas
Márcio Santos
19/05/2016
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!
des de já agradeço!
GOSTEI 0
Renan Di
19/05/2016
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
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
GOSTEI 1
Márcio Santos
19/05/2016
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!
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);
}
}
GOSTEI 0
Renan Di
19/05/2016
Cara boa madrugada pra você rsrsrsrs... vou tentar te ajudar com essa dúvida ai, no seu método:
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!
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!
GOSTEI 0
Renan Di
19/05/2016
Cara boa madrugada pra você rsrsrsrs... vou tentar te ajudar com essa dúvida ai, no seu método:
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!
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!
GOSTEI 0