// Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology
// Distributed under the terms of the GNU Lesser General Public License (LGPL): http://www.gnu.org/licenses/
package graphtea.extensions.generators;
import graphtea.graph.graph.Edge;
import graphtea.graph.graph.GPoint;
import graphtea.graph.graph.GraphModel;
import graphtea.graph.graph.Vertex;
import graphtea.platform.StaticUtils;
import graphtea.platform.lang.CommandAttitude;
import graphtea.platform.parameter.Parameter;
import graphtea.platform.parameter.Parametrizable;
import graphtea.plugins.graphgenerator.core.PositionGenerators;
import graphtea.plugins.graphgenerator.core.extension.GraphGeneratorExtension;
import java.awt.*;
@CommandAttitude(name = "generate_banana_tree", abbreviation = "_g_banana", description = "generates a Banana graph")
public class BananaTreeGenerator implements GraphGeneratorExtension, Parametrizable {
//the depth should be positive, and also if it is very large the
//generated graph is too large to generate.
@Parameter(description = "N")
public int n = 4;
@Parameter(description = "K")
public int k = 4; //num of each star vertices
public String checkParameters() {
if( n<0 || k<0 )return " Both k & n must be positive!";
else
return null; //the parameters are well defined.
}
public String getName() {
return "Banana tree";
}
public String getDescription() {
return "generates a banana tree with n k-stars";
}
public GraphModel generateGraph() {
return generateBananaTree(n, k);
}
private static GraphModel generateBananaTree(int n, int k) {
//num of tree vertices
GraphModel g = new GraphModel(false);
Vertex root = new Vertex();
g.insertVertex(root);
root.setLocation(new GPoint(0, 0));
Vertex curv;
//generating edges and setting positions
Point[] fR = PositionGenerators.circle(3000, 0, 0, n);
Vertex[] firstDepth = new Vertex[n];
//generating first level vertices
for (int i = 0; i < n; i++) {
Point center = fR[i];
curv = new Vertex();
setloc(curv, center);
firstDepth[i] = curv;
g.insertVertex(curv);
g.insertEdge(new Edge(root, curv));
}
//generating second level vertices
for (int i = 0; i < n; i++) {
Point center = fR[i];
Vertex centerv = firstDepth[i];
Point[] sR;
sR = PositionGenerators.circle(1000, center.x, center.y, k);
for (int j = 0; j < k; j++) {
if(j == (i + k/2)%n) continue;
curv = new Vertex();
g.insertVertex(curv);
setloc(curv, sR[j]);
g.insertEdge(new Edge(centerv, curv));
}
}
return g;
}
private static void setloc(Vertex vv, Point gp) {
vv.setLocation(new GPoint(gp.x, gp.y));
}
public static void main(String[] args) {
graphtea.platform.Application.main(args);
StaticUtils.loadSingleExtension(BananaTreeGenerator.class);
}
@Override
public String getCategory() {
return "Trees";
}
}