Mover ponto criados com Graphics e MouseEvent - Java desktop

0 respostas
muvip360

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 é uma imagem da aplicação executando.
des de já agraceço qualquer ajuda!

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 &#8203;&#8203;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); } }
Obrigado.

Criado 20 de maio de 2016
Respostas 0
Participantes 1