package graphtea.extensions.algorithms;
import graphtea.graph.graph.GPoint;
import graphtea.graph.graph.GraphModel;
import graphtea.graph.graph.Vertex;
import graphtea.platform.core.BlackBoard;
import graphtea.plugins.algorithmanimator.core.GraphAlgorithm;
import graphtea.plugins.algorithmanimator.extension.AlgorithmExtension;
import javax.swing.*;
/**
* author: rostam
* author: azin
*/
public class EndomorphismAnimator extends GraphAlgorithm implements AlgorithmExtension {
public EndomorphismAnimator(BlackBoard blackBoard) {
super(blackBoard);
}
@Override
public void doAlgorithm() {
GraphModel g = graphData.getGraph();
step("start the algorithm.");
String str = JOptionPane.showInputDialog(null,
"Enter the homomorphism map size: ",
"Homomorphism Size", 1);
int mapSize = Integer.parseInt(str);
Vertex[] vs = new Vertex[2*mapSize];
GPoint[] directions = new GPoint[mapSize];
for(int i=0;i<2*mapSize;i=i+2) {
vs[i] = requestVertex(g, "select the" + i + "th vertex.");
vs[i+1] = requestVertex(g, "select the" + i + "th vertex.");
if(g.isEdge(vs[i],vs[i+1])) {step("The vertices have edge together.");return;}
GPoint directionVector = GPoint.sub(vs[i].getLocation(), vs[i+1].getLocation());
directions[i/2] = GPoint.div(directionVector, directionVector.norm());
}
boolean[] isThere = new boolean[mapSize];
int numOfThere = 0;
for(int i=0;i < mapSize;i++) isThere[i]=false;
for(int j=0;j < 100;j++) {
if(numOfThere == mapSize) break;
step(j+"th step");
for(int i=0;i<2*mapSize;i=i+2) {
if(isThere[i/2]) continue;
vs[i].setLocation(new GPoint(
vs[i].getLocation().getX()-directions[i/2].getX() * 10,
vs[i].getLocation().getY()+directions[i/2].getY() * 10));
if(vs[i].getLocation().distance(vs[i+1].getLocation()) < 10) {
isThere[i/2] = true;
numOfThere++;
}
}
}
step("the end of the algorithm.");
}
@Override
public String getName() {
return "Endomorphism Animator ";
}
@Override
public String getDescription() {
return "The visualization of the endomorphism maps in practice";
}
}