Cadeia de freeman em desenho livre

Boa tarde pessoal tudo bem ?

Poderiam me ajudar por gentileza em um projeto da faculdade ?

Realizei a confecção do código abaixo, e minha dúvida é a seguinte:

Como faço para que esse código me mostre as coordenadas do desenho, por exemplo, estou desenhando um quadrado e assim que terminar de desenha-lo ele me mostra o passo a passo de como foi feito através de uma coordenada onde 8 seria para cima, 6 para o lado direito, 2 para baixo e 4 para o lado esquerdo. Mostrando assim em uma box a sequencia 8624 que desenha um quadrado.

import java.awt.BorderLayout;

import java.awt.Cursor;

import java.awt.EventQueue;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Point;

import java.awt.RenderingHints;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.awt.event.MouseMotionAdapter;

import java.util.ArrayList;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.border.EmptyBorder;

//Essa classe tem o objetivo de imitar o recurso de desenhar linhas do softwere paint, da Microsoft.

public class DrawingSketch extends JFrame {

private static final long serialVersionUID = 5661286812709693531L;

private JPanel contentPane;

private JPanel draft;

private ArrayList points = new ArrayList<>();

/**

  • Launch the application.

*/

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {

public void run() {

try {

DrawingSketch frame = new DrawingSketch();

frame.setVisible(true);

} catch (Exception e) {

e.printStackTrace();

}

}

});

}

/**

  • Create the frame.

*/

public DrawingSketch() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setBounds(100, 100, 900, 700);

setLocationRelativeTo(null);

contentPane = new JPanel();

contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

contentPane.setLayout(new BorderLayout(0, 0));

setContentPane(contentPane);

draft = new Draft();

draft.addMouseMotionListener(new MouseMotionAdapter() {

@Override

public void mouseDragged(MouseEvent e) {

setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));

points.add(e.getPoint());

draft.repaint();

}

});

draft.addMouseListener(new MouseAdapter() {

@Override

public void mouseReleased(MouseEvent e) {

// adiciona uma coordenada nula para ignorarmos

// no paintComponent

points.add(e.getPoint());

points.add(new Point(-1, -1));

setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));

}

});

contentPane.add(draft, BorderLayout.CENTER);

draft.setLayout(null);

}

public class Draft extends JPanel {

/**

*/

private static final long serialVersionUID = 4886600019364448097L;

public Draft() {

}

@Override

protected void paintComponent(Graphics g) {

// TODO Auto-generated method stub

super.paintComponent(g);

int i = 0;

while (i < points.size() - 1) {

Point currentPoint = points.get(i);

Point nextPoint = points.get(i + 1);

if (nextPoint.x != -1 && nextPoint.y != -1) {

Graphics2D g1 = (Graphics2D) g;

RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING,

RenderingHints.VALUE_ANTIALIAS_ON);

g1.setRenderingHints(rh);

g1.drawLine(currentPoint.x, currentPoint.y, nextPoint.x, nextPoint.y);

i++;

} else {

// quando as coordenadas do ponto seguinte forem (-1, -1),

// pulamos essa iteração para evitar que a linha anterior

// seja ligada a nova linha que está sendo desenhada

i += 2;

}

}

}

}

}

Muito Obrigado!

Edita o seu post e formata o código Java com o botão de texto pré-formatado, identificado pelo símbolo </>.

São somente 4 direções?

E as diagonais, como seria por exemplo a diagonal superior direita?

  • Seria o número 9?
  • Seria o número 8 seguido do 6?
  • Seria o número 6 seguido do 8?

Abaixo um exemplo considerando 8 direções:

import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

/**
 * Essa classe tem o objetivo de imitar o recurso de desenhar linhas do softwere paint, da Microsoft.
 */
public class DrawingSketch extends JFrame {

    private class Draft extends JPanel {

        private static final long serialVersionUID = 1L;

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            int i = 0;
            while (i < points.size() - 1) {
                Point current = points.get(i);
                Point next = points.get(i + 1);
                if (next.x == -1 && next.y == -1) {
                    // quando as coordenadas do ponto seguinte forem (-1, -1),
                    // pulamos essa iteração para evitar que a linha anterior
                    // seja ligada a nova linha que está sendo desenhada
                    i += 2;
                    continue;
                }
                Graphics2D g1 = (Graphics2D) g;
                RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                g1.setRenderingHints(rh);
                g1.drawLine(current.x, current.y, next.x, next.y);
                i++;
            }
        }
    }

    private static final long serialVersionUID = 1L;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    DrawingSketch frame = new DrawingSketch();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private List<Point> points = new ArrayList<>();

    private Draft draft;
    private JTextField path;

    /**
     * Create the frame.
     */
    public DrawingSketch() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 900, 700);
        setLocationRelativeTo(null);

        JPanel contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        draft = new Draft();
        draft.addMouseMotionListener(new MouseMotionAdapter() {

            @Override
            public void mouseDragged(MouseEvent e) {
                desenhar(e.getPoint());
            }
        });

        draft.addMouseListener(new MouseAdapter() {

            @Override
            public void mousePressed(MouseEvent e) {
                iniciar(e.getPoint());
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                parar(e.getPoint());
            }
        });

        path = new JTextField();
        path.setEditable(false);

        contentPane.add(path, BorderLayout.NORTH);
        contentPane.add(draft, BorderLayout.CENTER);
        draft.setLayout(null);
    }

    private void atualizarCadeia() {
        StringBuilder text = new StringBuilder();
        int i = 0;
        while (i < points.size() - 1) {
            Point current = points.get(i);
            Point next = points.get(i + 1);
            if (next.x == -1 && next.y == -1) {
                text.append("    ");
                i += 2;
                continue;
            }
            text.append(direcao(current, next));
            i++;
        }
        path.setText(text.toString());
    }

    private void desenhar(Point point) {
        points.add(point);
        draft.repaint();
    }

    private String direcao(Point a, Point b) {
        boolean cima = b.y < a.y;
        boolean baixo = b.y > a.y;
        boolean direita = b.x > a.x;
        boolean esquerda = b.x < a.x;
        if (cima) {
            if (direita) {
                return "9";
            }
            if (esquerda) {
                return "7";
            }
            return "8";
        }
        if (baixo) {
            if (direita) {
                return "3";
            }
            if (esquerda) {
                return "1";
            }
            return "2";
        }
        if (direita) {
            return "6";
        }
        if (esquerda) {
            return "4";
        }
        return "";
    }

    private void iniciar(Point point) {
        setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
    }

    private void parar(Point point) {
        points.add(new Point(-1, -1)); // adiciona uma coordenada nula para ignorarmos no paintComponent
        atualizarCadeia();
        setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
    }
}

Se você quiser só 4 direções, vai ter ajustar a lógica do método direcao para retornar os valores adequados quando um ponto se deslocou na diagonal.