enhanced web structure images

This commit is contained in:
Michael Peter Christen 2012-10-23 18:11:19 +02:00
parent b7ac1da6a3
commit 9eaede50e7
5 changed files with 106 additions and 52 deletions

View File

@ -181,15 +181,15 @@
#(linkstructure)#::
<script type="text/javascript">
<!--
imagestub = "WebStructurePicture_p.png?host=#[hosts]#&depth=3&width=1024&height=576&nodes=300&time=1000&colortext=888888&colorback=FFFFFF&colordot=11BB11&colorline=222222&colorlineend=333333";
imagestub = "WebStructurePicture_p.png?host=#[hosts]#&depth=3&width=1024&height=512&nodes=300&time=1000&colortext=888888&colorback=FFFFFF&colordot=11BB11&colorline=222222&colorlineend=333333";
idx = 0;
setTimeout("doanimation()", 2000);
function doanimation() {
setTimeout("doanimation(500)", 500);
function doanimation(nexttimeout) {
var accessPicture = document.getElementById("WebPicture");
if (accessPicture != null) {
idx++;
accessPicture.src = imagestub + "&idx=" + idx;
setTimeout("doanimation()", 1000);
setTimeout("doanimation(" + (nexttimeout > 3000 ? 3000 : nexttimeout * 1.2) + ")", nexttimeout);
}
}
-->

View File

@ -18,21 +18,6 @@
text-align:right;
}
</style>
<script type="text/javascript">
<!--
imagestub = "WebStructurePicture_p.png?host=#[besthost]#&depth=#[depth]#&width=#[width]#&height=#[height]#&nodes=#[nodes]#&time=#[time]#&colortext=#[colortext]#&colorback=#[colorback]#&colordot=#[colordot]#&colorline=#[colorline]#&colorlineend=#[colorlineend]#";
idx = 0;
setTimeout("doanimation()", 3000);
function doanimation() {
var accessPicture = document.getElementById("WebPicture");
if (accessPicture != null) {
idx++;
accessPicture.src = imagestub + "&idx=" + idx;
setTimeout("doanimation()", 3000);
}
}
-->
</script>
</head>
<body id="WebStructure" style="margin:0px;">
#%env/templates/header.template%#
@ -65,9 +50,7 @@ Click the API icon to see the XML file.
To see a list of all APIs, please visit the <a href="http://www.yacy-websuche.de/wiki/index.php/Dev:API">API wiki page</a>.</span>
</div>
<h2>Web Structure</h2>
#(hosts)#::
<fieldset><legend>Host List</legend>
#{list}#
@ -78,7 +61,6 @@ To see a list of all APIs, please visit the <a href="http://www.yacy-websuche.de
#{/list}#
</fieldset>
#(/hosts)#
<div id="left">
<form action="/WatchWebStructure_p.html" accept-charset="UTF-8" onsubmit="return checkform(this);">
<fieldset>
@ -118,7 +100,7 @@ To see a list of all APIs, please visit the <a href="http://www.yacy-websuche.de
</fieldset>
</form>
</div><br />
<div style="text-align:right;">
<div style="text-align:left;">
<img id="WebPicture" src="WebStructurePicture_p.png?host=#[besthost]#&amp;depth=#[depth]#&amp;width=#[width]#&amp;height=#[height]#&amp;nodes=#[nodes]#&amp;time=#[time]#&amp;colortext=#[colortext]#&amp;colorback=#[colorback]#&amp;colordot=#[colordot]#&amp;colorline=#[colorline]#&amp;colorlineend=#[colorlineend]#" alt="WebStructurePicture"/>
</div>
#%env/templates/footer.template%#

View File

@ -27,8 +27,8 @@ public class WatchWebStructure_p {
String color_line = "222222";
String color_lineend = "333333";
int width = 1024;
int height = 576;
int width = 1280;
int height = 720;
int depth = 3;
int nodes = 300; // maximum number of host nodes that are painted
int time = -1;
@ -36,10 +36,10 @@ public class WatchWebStructure_p {
String besthost;
if (post != null) {
width = post.getInt("width", 1024);
height = post.getInt("height", 576);
width = post.getInt("width", 1280);
height = post.getInt("height", 720);
depth = post.getInt("depth", 3);
nodes = post.getInt("nodes", width * height * 300 / 1024 / 576);
nodes = post.getInt("nodes", width * height * 300 / width / height);
time = post.getInt("time", -1);
host = post.get("host", "auto");
color_text = post.get("colortext", color_text);

View File

@ -133,7 +133,8 @@ public class WebStructurePicture_p {
}
// draw the graph
graphPicture = graph.draw(width, height, 40, 40, 16, 16, color_back, color_dot, color_line, color_lineend, color_text);
graph.normalize();
graphPicture = graph.draw(width, height, 40, 40, 16, 16, 12, 6, color_back, color_dot, color_line, color_lineend, color_text);
}
// print headline
graphPicture.setColor(color_text);

View File

@ -26,6 +26,7 @@
package net.yacy.visualization;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@ -47,7 +48,7 @@ public class GraphPlotter implements Cloneable {
// a ymageGraph is a set of points and borders between the points
// to reference the points, they must all have a nickname
private final Map<String, Point> nodes; // the interconnected objects
private Map<String, Point> nodes; // the interconnected objects
private final Set<String> edges; // the links that connect pairs of vertices
private double leftmost, rightmost, topmost, bottommost;
@ -168,6 +169,75 @@ public class GraphPlotter implements Cloneable {
return new Point[] {from, to};
}
private String getLeftmost() {
if (this.nodes.size() == 0) return null;
String ns = "";
double ps = Double.MAX_VALUE;
for (Map.Entry<String, Point> node: this.nodes.entrySet()) {
if (node.getValue().x < ps) {ns = node.getKey(); ps = node.getValue().x;}
}
assert ns != null;
return ns;
}
private String getBottommost() {
if (this.nodes.size() == 0) return null;
String ns = "";
double ps = Double.MAX_VALUE;
for (Map.Entry<String, Point> node: this.nodes.entrySet()) {
if (node.getValue().y < ps) {ns = node.getKey(); ps = node.getValue().y;}
}
assert ns != null;
return ns;
}
public int normalizeVertical() {
Map<String, Point> nc = new HashMap<String, Point>();
int d = 0;
while (this.nodes.size() > 0) {
String n = getBottommost();
Point p = this.nodes.remove(n);
p.y = d++;
nc.put(n, p);
}
this.nodes = nc;
this.bottommost = 0.0d;
this.topmost = d - 1;
return d;
}
public int normalizeHorizontal() {
ArrayList<Map.Entry<String, Point>> l = new ArrayList<Map.Entry<String, Point>>();
int d = 0;
Point p;
while (this.nodes.size() > 0) {
String n = getLeftmost();
p = this.nodes.remove(n);
p.x = d++;
l.add(new AbstractMap.SimpleEntry<String, Point>(n, p));
}
for (int i = 0; i < l.size() / 5; i++) {
p = l.get(i).getValue(); p.x = p.x + 3 * l.get(i).getKey().length() / 2; this.rightmost = Math.max(p.x, this.rightmost);
p = l.get(l.size() - i - 1).getValue(); p.x = p.x - 3 * l.get(i).getKey().length() / 2; this.leftmost = Math.min(p.x, this.leftmost);
}
this.leftmost = Double.MAX_VALUE;
this.rightmost = Double.MIN_VALUE;
Map<String, Point> nc = new HashMap<String, Point>();
for (Map.Entry<String, Point> entry: l) {
p = entry.getValue();
nc.put(entry.getKey(), p);
if (p.x - entry.getKey().length() < this.leftmost) this.leftmost = p.x - entry.getKey().length();
if (p.x + entry.getKey().length() > this.rightmost) this.rightmost = p.x + entry.getKey().length();
}
this.nodes = nc;
return d;
}
public void normalize() {
normalizeVertical();
normalizeHorizontal();
}
public Point addNode(final String node, Point p) {
this.nodes.put(node, p);
if (p.x > this.rightmost) this.rightmost = p.x;
@ -228,16 +298,12 @@ public class GraphPlotter implements Cloneable {
}
public RasterPlotter draw(
final int width,
final int height,
final int leftborder,
final int rightborder,
final int topborder,
final int bottomborder,
final String color_back,
final String color_dot,
final String color_line,
final String color_lineend,
final int width, final int height,
final int leftborder, final int rightborder,
final int topborder, final int bottomborder,
final int xraster, final int yraster,
final String color_back, final String color_dot,
final String color_line, final String color_lineend,
final String color_text
) {
final RasterPlotter.DrawMode drawMode = (RasterPlotter.darkColor(color_back)) ? RasterPlotter.DrawMode.MODE_ADD : RasterPlotter.DrawMode.MODE_SUB;
@ -256,12 +322,12 @@ public class GraphPlotter implements Cloneable {
entry = i.next();
name = entry.getKey();
c = entry.getValue();
x = (xfactor == 0.0) ? width / 2 : (int) (leftborder + (c.x - this.leftmost) * xfactor);
y = (yfactor == 0.0) ? height / 2 : (int) (height - bottomborder - (c.y - this.bottommost) * yfactor);
x = (xfactor == 0.0) ? raster(width / 2, xraster) : leftborder + raster((c.x - this.leftmost) * xfactor, xraster);
y = (yfactor == 0.0) ? raster(height / 2, yraster) : height - bottomborder - raster((c.y - this.bottommost) * yfactor, yraster);
image.setColor(color_dot);
image.dot(x, y, 6, true, 100);
image.setColor(color_text);
PrintTool.print(image, x, y + 10, 0, name.toUpperCase(), 0);
PrintTool.print(image, x, y + 10, 0, name.toUpperCase(), 0 /*x < 2 * width / 5 ? 1 : x > 3 * width / 5 ? -1 : 0*/);
}
// draw lines
@ -273,18 +339,18 @@ public class GraphPlotter implements Cloneable {
border = getEdge(j.next());
if (border == null) continue;
if (xfactor == 0.0) {
x0 = width / 2;
x1 = width / 2;
x0 = raster(width / 2, xraster);
x1 = raster(width / 2, xraster);
} else {
x0 = (int) (leftborder + (border[0].x - this.leftmost) * xfactor);
x1 = (int) (leftborder + (border[1].x - this.leftmost) * xfactor);
x0 = leftborder + raster((border[0].x - this.leftmost) * xfactor, xraster);
x1 = leftborder + raster((border[1].x - this.leftmost) * xfactor, xraster);
}
if (yfactor == 0.0) {
y0 = height / 2;
y1 = height / 2;
y0 = raster(height / 2, yraster);
y1 = raster(height / 2, yraster);
} else {
y0 = (int) (height - bottomborder - (border[0].y - this.bottommost) * yfactor);
y1 = (int) (height - bottomborder - (border[1].y - this.bottommost) * yfactor);
y0 = height - bottomborder - raster((border[0].y - this.bottommost) * yfactor, yraster);
y1 = height - bottomborder - raster((border[1].y - this.bottommost) * yfactor, yraster);
}
// draw the line, with the dot at the beginning of the line
image.lineDot(x1, y1, x0, y0, 3, 4, color_line, color_lineend);
@ -292,4 +358,9 @@ public class GraphPlotter implements Cloneable {
return image;
}
private int raster(final double pos, final int raster) {
if (raster <= 1) return (int) pos;
return ((int) (pos / raster)) * raster;
}
}