/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package grafrajz;
import grafrajz.utils.DrawableEdge;
import grafrajz.utils.DrawableNode;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
import javax.swing.JPanel;
/**
*
* @author adam_fejes_dell
* A rajzterület megvalósítása. A paintComponent metódus felülírásával valósítja meg a gráf elemeinek kirajzolását
*/
public class MyCanvas extends JPanel{
private GraphLogic gLogic;
private ArrayList<DrawableEdge> edges;
private ArrayList<DrawableNode> nodes;
final private int NODE_SIZE;
public MyCanvas(GraphLogic gLogic, int nodeSize) {
this.gLogic = gLogic;
this.edges = gLogic.getDrawableEdges();
this.nodes = gLogic.getDrawableNodes();
this.NODE_SIZE = nodeSize;
setBackground(Color.WHITE);
}
/**
* Gráf elemeinek kirajzolása
* @param g
*/
@Override
public void paintComponent(Graphics g) {
Graphics2D g2D=(Graphics2D) g;
for(DrawableEdge edge : edges){
g.setColor(edge.getEdge().getColor());
g2D.drawLine(edge.getsPoint().x, edge.getsPoint().y, edge.getDestPoint().x, edge.getDestPoint().y);
/**
* Ha gráf irényított, nyilakat rajzol az élek végére
*/
if(gLogic.isDirected()){
int x1 = edge.getsPoint().x, x2 = edge.getDestPoint().x, y1 = edge.getsPoint().y, y2 = edge.getDestPoint().y;
double[] dir = {x2-x1, y2-y1}; //irány vektor gyártása
int dist =(int) Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)); //vektor hossza
dir[0] /= dist; dir[1] /= dist; //normalizálom az irány vektort
int arrowTipx, arrowWing1x, arrowWing2x, arrowTipy, arrowWing1y, arrowWing2y;
//Nyílhegy pozíciója
arrowTipx = (int) (x1 + (dist - NODE_SIZE / 2) * dir[0]);
arrowTipy = (int) (y1 + (dist - NODE_SIZE / 2) * dir[1]);
//Nyíl egyik szárnyvégének a pozíciója
arrowWing1x = (int) (x1 + (dist - NODE_SIZE) * dir[0] + dir[1] * 10);
arrowWing1y = (int) (y1 + (dist - NODE_SIZE) * dir[1] + dir[0] * 10 * -1);
//Nyíl másik szárnyvégének a pozíciója
arrowWing2x = (int) (x1 + (dist - NODE_SIZE) * dir[0] + dir[1] * 10 * -1);
arrowWing2y = (int) (y1 + (dist - NODE_SIZE) * dir[1] + dir[0] * 10);
int[] xArray = new int[] {arrowWing1x, arrowTipx, arrowWing2x};
int[] yArray = new int[] {arrowWing1y, arrowTipy, arrowWing2y};
g2D.drawPolyline(xArray, yArray, 3);
}
/**
* Ha a gráf súlyozott, berajzolja az élek címkéit
*/
if(gLogic.isWeightened()){
g.setColor(Color.red);
g2D.drawString(
String.valueOf(edge.getEdge().getWeight()),
(edge.getDestPoint().x + edge.getsPoint().x) / 2 ,
(edge.getDestPoint().y + edge.getsPoint().y) / 2 );
}
}
g.setColor(Color.blue);
for(DrawableNode node : nodes){
//Csúcs kirajzolása
g.setColor(Color.blue);
g2D.fillOval(node.getPos().x, node.getPos().y, NODE_SIZE, NODE_SIZE);
//Csúcs címke kirajzolása
g.setColor(Color.white);
g2D.drawString(node.getNode().getName(), node.getPos().x + (int)NODE_SIZE / 7 * 3, node.getPos().y + (int)NODE_SIZE / 7 * 3);
}
//System.out.println("PAINTED!");
}
}