Eu estou fazendo um applet que desenha polígonos unindo pontos do click do mouse
Cada click determina um vértice do polígono e a cada 2 vértices tem uma ARESTA
caso a aresta passo por algum ponto, eu preciso identificar este ponto e destacá-lo.
Eu tentei criar uma linha da classe Line2D.Float a cada 2 vértices e usar o método contains dessa linha em cada ponto, mas não funcionou em nada T_T
Alguém sabe a forma correta de usar?
Código do Applet:
[code]import javax.swing.JApplet;
public class NewJApplet1 extends JApplet {
@Override
public void init() {
add(new NewClass1(this.getWidth(), this.getHeight()));
}
}[/code]
Código do JPanel usado no Applet:
[code]import java.awt.AlphaComposite;
import java.awt.Color;
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.geom.GeneralPath;
import java.awt.geom.Line2D;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JPanel;
public class NewClass1 extends JPanel{
Point malha[][]; //Matriz que armazena os pontos da malha
Point area; // area.x = largura do applet, area.y = altura do applet
Point foco; // variavel responsavel por aramzenar qual ponto está sob o foco do mouse
List<Point> vertices; // Lista dos vértices
List<Point> pontosAresta; // Lista dos pontos nas arestas
GeneralPath path; // Path para desenhar o Polígono
int passo; // distância entre os pontos da malha
int k; // Quantidade de pontos em cada linha
int l; // Quantidade de pontos em cada coluna
NewClass1(int width, int height) {
//inicia as variáveis
foco = new Point();
vertices = new LinkedList<Point>();
pontosAresta = new LinkedList<Point>();
path = new GeneralPath();
area = new Point(width, height); //obtém a largura e altura do Applet
desenhaMalha(10); //desenha a malha de pontos com 10px de espaçamento entre cada
addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
/* Sempre que o mouse se mover atribui à variável foco o ponto
mais próximo do mouse, que esteja há uma distância (passo/2) ou
menor */
foco.setLocation(-1, -1);
for (int i = 0; i < k; i++) {
if (((malha[i][0].x - (passo / 2)) < e.getX())
&& (e.getX() < (malha[i][0].x + (passo / 2)))) {
for (int j = 0; j < l; j++) {
if (((malha[i][j].y - (passo / 2)) < e.getY())
&& (e.getY() < (malha[i][j].y + (passo / 2)))) {
foco.setLocation(malha[i][j]);
}
}
}
}
repaint();
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if ((foco.x > 0)) { // se o click foi sobre um ponto
vertices.add(new Point(foco)); // adiciona esse ponto como vértice
}
// A CADA CLICK O PATH TODO É REFEITO
path.reset(); // limpa o path
if (!vertices.isEmpty()) { // e se houverem vértices
path.moveTo(vertices.get(0).x, vertices.get(0).y); // começa a desenhar o path no primeiro vértice
for (Point p : vertices) { // e para cada vértice
path.lineTo(p.x, p.y); // desenha uma linhapartindo do primeiro
}
// ESSA FUNÇÃO DEVERIA OBTER OS PONTOS QUE ESTÃO NAS ARESTAS (ENTRE 2 VÉRTICES)
getPontosNasArestas();
}
repaint();
}
});
}
/* Função responsável por desenhar a malha de pontos*/
public void desenhaMalha(int passo) {
this.passo = passo; //passo é a distância entre cada ponto em pixels
k = area.x / passo; //k é o número de pontos nas linhas
l = area.y / passo; // l é o número de pontos nas colunas
malha = new Point[k][l]; // inicia a malha
for (int i = 0; i < k; i++) { // popula a malha com seus determinados pontos
for (int j = 0; j < l; j++) {
malha[i][j] = new Point(i * passo, j * passo);
}
}
repaint();
}
// ESSA FUNÇÃO DEVERIA OBTER OS PONTOS QUE ESTÃO NAS ARESTAS (ENTRE 2 VÉRTICES)
private void getPontosNasArestas() {
pontosAresta.clear(); // limpa a variável que armazena os pontos nas arestas
Line2D linha = new Line2D.Float(); // inicializa uma Linha2D
if (vertices.size() > 1) { // caso haja mais de 1 vértice
for (int h = 0; h < (vertices.size() - 1); h++) {
linha.setLine(vertices.get(h), vertices.get(h + 1)); // desenha uma linha a cada 2 vértices
for (int i = 0; i < k; i++) { // testa cada ponto da malha
for (int j = 0; j < l; j++) {
if (linha.contains(malha[i][j])){ // se a linha contiver o ponto
pontosAresta.add(malha[i][j]); // adiciona o ponto no vetor de pontos nas arestas
}
}
}
}
}
}
@Override
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, area.x, area.y);
Graphics2D g2d2 = (Graphics2D) g.create();
g2d2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d2.setColor(Color.BLUE);
g2d2.draw(path);
AlphaComposite
alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float) 0.1);
g2d2.setComposite(alpha);
g2d2.fill(path);
g2d.setColor(Color.black);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
for (int i = 0; i < k; i++) {
for (int j = 0; j< l; j++) {
g2d.drawOval((malha[i][j].x - 1), (malha[i][j].y - 1), 1, 1);
}
}
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
if (!vertices.isEmpty()) {
g2d.setColor(Color.blue);
for (Point p : vertices) {
g2d.fillOval((p.x - 3), (p.y - 3), 6, 6);
}
}
if (!pontosAresta.isEmpty()) {
g2d.setColor(Color.red);
for (Point p : pontosAresta) {
g2d.fillOval((p.x - 2), (p.y - 2), 4, 4);
}
}
if (foco.x > 0) {
g2d.setColor(Color.red);
g2d.fillOval((foco.x - 2), (foco.y - 2), 4, 4);
}
g2d.dispose();
}
}[/code]