From a585b4d41b5136dac1e8a04df3c79c62da80ac5f Mon Sep 17 00:00:00 2001 From: orbiter Date: Tue, 22 May 2007 15:20:50 +0000 Subject: [PATCH] added web structure image see http://localhost:8080/WatchWebStructure_p.html git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@3747 6c8d7289-2bf4-0310-a012-ef5d649a1542 --- htroot/WatchCrawler_p.html | 4 +- htroot/WatchWebStructure_p.html | 15 ++ htroot/WatchWebStructure_p.java | 14 ++ htroot/WebStructurePicture_p.java | 132 ++++++++++++++++ htroot/env/templates/submenuCrawler.template | 7 + htroot/imagetest.java | 8 +- htroot/xml/webstructure.java | 33 +++- htroot/xml/webstructure.xml | 2 +- source/de/anomic/plasma/plasmaGrafics.java | 6 +- .../de/anomic/plasma/plasmaWebStructure.java | 44 +++++- source/de/anomic/ymage/ymageCaptcha.java | 2 +- source/de/anomic/ymage/ymageChart.java | 10 +- source/de/anomic/ymage/ymageDemoApplet.java | 2 +- source/de/anomic/ymage/ymageGraph.java | 142 ++++++++++++++++++ source/de/anomic/ymage/ymageMatrix.java | 14 +- source/de/anomic/ymage/ymageToolPrint.java | 11 +- 16 files changed, 414 insertions(+), 32 deletions(-) create mode 100644 htroot/WatchWebStructure_p.html create mode 100644 htroot/WatchWebStructure_p.java create mode 100644 htroot/WebStructurePicture_p.java create mode 100644 htroot/env/templates/submenuCrawler.template create mode 100644 source/de/anomic/ymage/ymageGraph.java diff --git a/htroot/WatchCrawler_p.html b/htroot/WatchCrawler_p.html index 784108152..6282d0314 100644 --- a/htroot/WatchCrawler_p.html +++ b/htroot/WatchCrawler_p.html @@ -7,7 +7,9 @@ - #%env/templates/header.template%# + +#%env/templates/header.template%# +#%env/templates/submenuCrawler.template%#

Crawler Monitor

Next update in seconds. empty

diff --git a/htroot/WatchWebStructure_p.html b/htroot/WatchWebStructure_p.html new file mode 100644 index 000000000..f262a6a4f --- /dev/null +++ b/htroot/WatchWebStructure_p.html @@ -0,0 +1,15 @@ + + + +YaCy '#[clientname]#': Web Structure +#%env/templates/metas.template%# + + +#%env/templates/header.template%# +#%env/templates/submenuCrawler.template%# +

Web Structure

+ + +#%env/templates/footer.template%# + + diff --git a/htroot/WatchWebStructure_p.java b/htroot/WatchWebStructure_p.java new file mode 100644 index 000000000..b86c2a581 --- /dev/null +++ b/htroot/WatchWebStructure_p.java @@ -0,0 +1,14 @@ + +import de.anomic.http.httpHeader; +import de.anomic.plasma.plasmaSwitchboard; +import de.anomic.server.serverObjects; +import de.anomic.server.serverSwitch; + + +public class WatchWebStructure_p { + public static serverObjects respond(httpHeader header, serverObjects post, serverSwitch env) { + plasmaSwitchboard sb = (plasmaSwitchboard) env; + serverObjects prop = new serverObjects(); + return prop; + } +} diff --git a/htroot/WebStructurePicture_p.java b/htroot/WebStructurePicture_p.java new file mode 100644 index 000000000..019cf1bae --- /dev/null +++ b/htroot/WebStructurePicture_p.java @@ -0,0 +1,132 @@ +// WebStructurePicture.java +// (C) 2007 by Michael Peter Christen; mc@anomic.de, Frankfurt a. M., Germany +// first published 22.05.2007 on http://yacy.net +// +// This is a part of YaCy, a peer-to-peer based web search engine +// +// $LastChangedDate: 2006-04-02 22:40:07 +0200 (So, 02 Apr 2006) $ +// $LastChangedRevision: 1986 $ +// $LastChangedBy: orbiter $ +// +// LICENSE +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +import java.net.MalformedURLException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Map; + +import de.anomic.http.httpHeader; +import de.anomic.kelondro.kelondroBase64Order; +import de.anomic.net.URL; +import de.anomic.plasma.plasmaSwitchboard; +import de.anomic.plasma.plasmaURL; +import de.anomic.plasma.plasmaWebStructure; +import de.anomic.server.serverObjects; +import de.anomic.server.serverSwitch; +import de.anomic.ymage.ymageGraph; +import de.anomic.ymage.ymageMatrix; + +public class WebStructurePicture_p { + + private static final double maxlongd = (double) Long.MAX_VALUE; + + public static ymageMatrix respond(httpHeader header, serverObjects post, serverSwitch env) { + plasmaSwitchboard sb = (plasmaSwitchboard) env; + + int width = 768; + int height = 576; + int depth = 3; + String host = null; + + if (post != null) { + width = post.getInt("width", 768); + height = post.getInt("height", 576); + depth = post.getInt("depth", 3); + host = post.get("host", null); + } + + //too small values lead to an error, too big to huge CPU/memory consumption, resulting in possible DOS. + if (width < 320 ) width = 320; + if (width > 1920) width = 1920; + if (height < 240) height = 240; + if (height > 1920) height = 1920; + if (depth > 8) depth = 8; + if (depth < 1) depth = 1; + + // find start point + if (host == null) { + // find domain with most references + host = sb.webStructure.hostWithMaxReferences(); + } + // find start hash + String hash = null; + try { + hash = plasmaURL.urlHash(new URL("http://" + host)).substring(6); + } catch (MalformedURLException e) {e.printStackTrace();} + assert (sb.webStructure.references(hash) != null); + + // recursively find domains, up to a specific depth + ymageGraph graph = new ymageGraph(); + place(graph, sb.webStructure, hash, host, 0.0, 0.0, 0, depth); + //graph.print(); + + return graph.draw(width, height, 20, 20, 20, 20); + + } + + private static final void place(ymageGraph graph, plasmaWebStructure structure, String centerhash, String centerhost, double x, double y, int nextlayer, int maxlayer) { + // returns the host string + assert centerhost != null; + ymageGraph.coordinate center = graph.getPoint(centerhost); + if (center == null) center = graph.addPoint(centerhost, x, y, nextlayer); + if (nextlayer == maxlayer) return; + nextlayer++; + Map next = structure.references(centerhash); + Map.Entry entry; + String targethash, targethost; + // first set points to next hosts + Iterator i = next.entrySet().iterator(); + ArrayList targets = new ArrayList(); + while (i.hasNext()) { + entry = (Map.Entry) i.next(); + targethash = (String) entry.getKey(); + targethost = structure.resolveDomHash2DomString(targethash); + if (targethost == null) continue; + targets.add(new String[] {targethash, targethost}); + if (graph.getPoint(targethost) != null) continue; + // set a new point. It is placed on a circle around the host point + double angle = ((double) kelondroBase64Order.enhancedCoder.cardinal((targethash + "____").getBytes())) / maxlongd * 2 * Math.PI; + System.out.println("ANGLE = " + angle); + double radius = 1.0 / ((double) (1 << nextlayer)); + graph.addPoint(targethost, x + radius * Math.cos(angle), y + radius * Math.sin(angle), nextlayer); + } + // recursively set next hosts + i = targets.iterator(); + String[] target; + while (i.hasNext()) { + target = (String[]) i.next(); + targethash = target[0]; + targethost = target[1]; + ymageGraph.coordinate c = graph.getPoint(targethost); + assert c != null; + place(graph, structure, targethash, targethost, c.x, c.y, nextlayer, maxlayer); + graph.setBorder(centerhost, targethost); + } + return; + } + +} diff --git a/htroot/env/templates/submenuCrawler.template b/htroot/env/templates/submenuCrawler.template new file mode 100644 index 000000000..63467593c --- /dev/null +++ b/htroot/env/templates/submenuCrawler.template @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/htroot/imagetest.java b/htroot/imagetest.java index e1004a66d..004dd6cd9 100644 --- a/htroot/imagetest.java +++ b/htroot/imagetest.java @@ -88,8 +88,8 @@ public class imagetest { img.setMode(ymageMatrix.MODE_SUB); img.setColor(ymageMatrix.SUBTRACTIVE_BLACK); - for (int y = 0; y < 600; y = y + 50) ymageToolPrint.print(img, 0, 6 + y, 0, "" + y, true); - for (int x = 0; x < 800; x = x + 50) ymageToolPrint.print(img, x, 6 , 0, "" + x, true); + for (int y = 0; y < 600; y = y + 50) ymageToolPrint.print(img, 0, 6 + y, 0, "" + y, -1); + for (int x = 0; x < 800; x = x + 50) ymageToolPrint.print(img, x, 6 , 0, "" + x, -1); img.setColor(ymageMatrix.SUBTRACTIVE_RED); img.dot(550, 110, 90, true); img.setColor(ymageMatrix.SUBTRACTIVE_GREEN); @@ -102,9 +102,9 @@ public class imagetest { img.arc(220, 110, 50, 90, 30, 110); img.arc(210, 120, 50, 90, 30, 110); img.setColor(ymageMatrix.SUBTRACTIVE_BLACK); - ymageToolPrint.print(img, 50, 110, 0, "BROADCAST MESSAGE #772: NODE %882 BLACK abcefghijklmnopqrstuvwxyz", true); + ymageToolPrint.print(img, 50, 110, 0, "BROADCAST MESSAGE #772: NODE %882 BLACK abcefghijklmnopqrstuvwxyz", -1); img.setColor(ymageMatrix.SUBTRACTIVE_GREEN); - ymageToolPrint.print(img, 50, 120, 0, "BROADCAST MESSAGE #772: NODE %882 GREEN abcefghijklmnopqrstuvwxyz", true); + ymageToolPrint.print(img, 50, 120, 0, "BROADCAST MESSAGE #772: NODE %882 GREEN abcefghijklmnopqrstuvwxyz", -1); for (long i = 0; i < 256; i++) { img.setColor(i); img.dot(10 + 14 * (int) (i / 16), 200 + 14 * (int) (i % 16), 6, true); diff --git a/htroot/xml/webstructure.java b/htroot/xml/webstructure.java index 23ba36d23..a254d88c1 100644 --- a/htroot/xml/webstructure.java +++ b/htroot/xml/webstructure.java @@ -1,3 +1,30 @@ +// webstructure.java +// (C) 2007 by Michael Peter Christen; mc@anomic.de, Frankfurt a. M., Germany +// first published 22.05.2007 on http://yacy.net +// +// This is a part of YaCy, a peer-to-peer based web search engine +// +// $LastChangedDate: 2006-04-02 22:40:07 +0200 (So, 02 Apr 2006) $ +// $LastChangedRevision: 1986 $ +// $LastChangedBy: orbiter $ +// +// LICENSE +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + package xml; import java.util.Iterator; @@ -14,8 +41,7 @@ public class webstructure { public static serverObjects respond(httpHeader header, serverObjects post, serverSwitch env) { serverObjects prop = new serverObjects(); plasmaSwitchboard sb = (plasmaSwitchboard) env; - plasmaWebStructure structure = sb.webStructure; - Iterator i = structure.structureEntryIterator(); + Iterator i = sb.webStructure.structureEntryIterator(); int c = 0, d; plasmaWebStructure.structureEntry sentry; Map.Entry refentry; @@ -32,7 +58,7 @@ public class webstructure { refloop: while (k.hasNext()) { refentry = (Map.Entry) k.next(); refhash = (String) refentry.getKey(); - refdom = structure.resolveDomHash2DomString(refhash); + refdom = sb.webStructure.resolveDomHash2DomString(refhash); if (refdom == null) continue refloop; prop.put("domains_" + c + "_citations_" + d + "_refhash", refhash); prop.put("domains_" + c + "_citations_" + d + "_refdom", refdom); @@ -44,6 +70,7 @@ public class webstructure { c++; } prop.put("domains", c); + prop.put("maxref", plasmaWebStructure.maxref); // return rewrite properties return prop; diff --git a/htroot/xml/webstructure.xml b/htroot/xml/webstructure.xml index 87f04c1f6..79acdc859 100644 --- a/htroot/xml/webstructure.xml +++ b/htroot/xml/webstructure.xml @@ -1,6 +1,6 @@ - + #{domains}# #{citations}# diff --git a/source/de/anomic/plasma/plasmaGrafics.java b/source/de/anomic/plasma/plasmaGrafics.java index 54d1b2b20..d419a427d 100644 --- a/source/de/anomic/plasma/plasmaGrafics.java +++ b/source/de/anomic/plasma/plasmaGrafics.java @@ -252,9 +252,9 @@ public class plasmaGrafics { // draw description networkPicture.setColor(COL_HEADLINE); networkPicture.setMode(ymageMatrix.MODE_SUB); - ymageToolPrint.print(networkPicture, 2, 8, 0, "THE YACY NETWORK", true); - ymageToolPrint.print(networkPicture, 2, 16, 0, "DRAWING OF " + totalCount + " SELECTED PEERS", true); - ymageToolPrint.print(networkPicture, width - 2, 8, 0, "SNAPSHOT FROM " + new Date().toString().toUpperCase(), false); + ymageToolPrint.print(networkPicture, 2, 8, 0, "THE YACY NETWORK", -1); + ymageToolPrint.print(networkPicture, 2, 16, 0, "DRAWING OF " + totalCount + " SELECTED PEERS", -1); + ymageToolPrint.print(networkPicture, width - 2, 8, 0, "SNAPSHOT FROM " + new Date().toString().toUpperCase(), 1); // set timestamp networkPictureDate = System.currentTimeMillis(); diff --git a/source/de/anomic/plasma/plasmaWebStructure.java b/source/de/anomic/plasma/plasmaWebStructure.java index 7a3a32c24..039ab815c 100644 --- a/source/de/anomic/plasma/plasmaWebStructure.java +++ b/source/de/anomic/plasma/plasmaWebStructure.java @@ -45,6 +45,7 @@ public class plasmaWebStructure { public static int maxCRLDump = 500000; public static int maxCRGDump = 200000; + public static int maxref = 10; // maximum number of references, to avoid overflow when a large link farm occurs (i.e. wikipedia) private StringBuffer crg; // global citation references private serverLog log; @@ -147,7 +148,7 @@ public class plasmaWebStructure { } } - public static TreeMap refstr2map(String refs) { + private static TreeMap refstr2map(String refs) { if ((refs == null) || (refs.length() <= 8)) return new TreeMap(); TreeMap map = new TreeMap(); String c; @@ -188,6 +189,7 @@ public class plasmaWebStructure { } public TreeMap references(String domhash) { + // returns a map with a domhash(String):refcount(Integer) relation assert domhash.length() == 6; SortedMap tailMap = structure.tailMap(domhash); if ((tailMap == null) || (tailMap.size() == 0)) return new TreeMap(); @@ -214,6 +216,8 @@ public class plasmaWebStructure { private void learn(URL url, StringBuffer reference /*string of b64(12digits)-hashes*/) { String domhash = plasmaURL.urlHash(url).substring(6); + + // parse the new reference string and join it with the stored references TreeMap refs = references(domhash); assert reference.length() % 12 == 0; String dom; @@ -226,8 +230,27 @@ public class plasmaWebStructure { } refs.put(dom, new Integer(++c)); } - structure.put(domhash + "," + url.getHost(), map2refstr(refs)); + // check if the maxref is exceeded + if (refs.size() > maxref) { + // shrink the references: the entry with the smallest number of references is removed + int minrefcount = Integer.MAX_VALUE; + String minrefkey = null; + Iterator i = refs.entrySet().iterator(); + Map.Entry entry; + while (i.hasNext()) { + entry = (Map.Entry) i.next(); + if (((Integer) entry.getValue()).intValue() < minrefcount) { + minrefcount = ((Integer) entry.getValue()).intValue(); + minrefkey = (String) entry.getKey(); + } + } + // remove the smallest + if (minrefkey != null) refs.remove(minrefkey); + } + + // store the map back to the structure + structure.put(domhash + "," + url.getHost(), map2refstr(refs)); } public void saveWebStructure() { @@ -238,6 +261,23 @@ public class plasmaWebStructure { } } + public String hostWithMaxReferences() { + // find domain with most references + Iterator i = structure.entrySet().iterator(); + int refsize, maxref = 0; + String maxhost = null; + Map.Entry entry; + while (i.hasNext()) { + entry = (Map.Entry) i.next(); + refsize = ((String) entry.getValue()).length(); + if (refsize > maxref) { + maxref = refsize; + maxhost = ((String) entry.getKey()).substring(7); + } + } + return maxhost; + } + public Iterator structureEntryIterator() { // iterates objects of type structureEntry return new structureIterator(); diff --git a/source/de/anomic/ymage/ymageCaptcha.java b/source/de/anomic/ymage/ymageCaptcha.java index e958b4adf..998ccf877 100644 --- a/source/de/anomic/ymage/ymageCaptcha.java +++ b/source/de/anomic/ymage/ymageCaptcha.java @@ -71,7 +71,7 @@ public class ymageCaptcha extends ymageMatrix { for(int i=0;i s1max) s1max = s1.length(); - ymageToolPrint.print(this, (left) ? leftborder - 4 : width - rightborder + 4, y, 0, s1, (!left)); + ymageToolPrint.print(this, (left) ? leftborder - 4 : width - rightborder + 4, y, 0, s1, (left) ? 1 : -1); y -= pixelperscale; s += scale; } setColor(colorNaming); - ymageToolPrint.print(this, (left) ? x - s1max * 6 - 6 : x + s1max * 6 + 9, topborder, 90, name, false); + ymageToolPrint.print(this, (left) ? x - s1max * 6 - 6 : x + s1max * 6 + 9, topborder, 90, name, 1); line(x, topborder - 4, x, height - bottomborder + 4); } diff --git a/source/de/anomic/ymage/ymageDemoApplet.java b/source/de/anomic/ymage/ymageDemoApplet.java index e01fae869..05d3b4c0d 100644 --- a/source/de/anomic/ymage/ymageDemoApplet.java +++ b/source/de/anomic/ymage/ymageDemoApplet.java @@ -62,7 +62,7 @@ public class ymageDemoApplet extends Applet implements Runnable { ymageMatrix.demoPaint(m); int y = (int) (System.currentTimeMillis() / 10 % 300); m.setColor(ymageMatrix.SUBTRACTIVE_BLACK); - ymageToolPrint.print(m, 0, y, 0, "Hello World", true); + ymageToolPrint.print(m, 0, y, 0, "Hello World", -1); } } diff --git a/source/de/anomic/ymage/ymageGraph.java b/source/de/anomic/ymage/ymageGraph.java new file mode 100644 index 000000000..e0f0da796 --- /dev/null +++ b/source/de/anomic/ymage/ymageGraph.java @@ -0,0 +1,142 @@ +package de.anomic.ymage; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; + +/* this class does not really draw graphes, it is only a container for graph coordinates. + * all coordinates are given in a artificial corrdinate system, in the range from + * -1 to +1. The lower left point of the graph has the coordinate -1, -1 and the upper + * right is 1,1 + * 0,0 is the center of the graph + */ + +public class ymageGraph { + + // a ymageGraph is a set of points and borders between the points + // to reference the points, they must all have a nickname + + HashMap points; + HashSet borders; + double leftmost, rightmost, topmost, bottommost; + + public ymageGraph() { + points = new HashMap(); + borders = new HashSet(); + leftmost = 1.0; + rightmost = -1.0; + topmost = -1.0; + bottommost = 1.0; + } + + public coordinate getPoint(String name) { + return (coordinate) points.get(name); + } + + public coordinate[] getBorder(String name) { + int p = name.indexOf("$"); + if (p < 0) return null; + coordinate from = getPoint(name.substring(0, p)); + coordinate to = getPoint(name.substring(p + 1)); + if ((from == null) || (to == null)) return null; + return new coordinate[] {from, to}; + } + + public coordinate addPoint(String name, double x, double y, int layer) { + coordinate newc = new coordinate(x, y, layer); + coordinate oldc = (coordinate) points.put(name, newc); + assert oldc == null; // all add shall be unique + if (x > rightmost) rightmost = x; + if (x < leftmost) leftmost = x; + if (y > topmost) topmost = y; + if (y < bottommost) bottommost = y; + return newc; + } + + public boolean hasBorder(String fromPoint, String toPoint) { + return borders.contains(fromPoint + "-" + toPoint); + } + + public void setBorder(String fromPoint, String toPoint) { + coordinate from = (coordinate) points.get(fromPoint); + coordinate to = (coordinate) points.get(toPoint); + assert from != null; + assert to != null; + borders.add(fromPoint + "$" + toPoint); + } + + public class coordinate { + public double x, y; + public int layer; + public coordinate(double x, double y, int layer) { + assert x >= -1; + assert x <= 1; + assert y >= -1; + assert y <= 1; + this.x = x; + this.y = y; + this.layer = layer; + } + } + + public void print() { + // for debug purpose: print out all coordinates + Iterator i = points.entrySet().iterator(); + Map.Entry entry; + String name; + coordinate c; + while (i.hasNext()) { + entry = (Map.Entry) i.next(); + name = (String) entry.getKey(); + c = (coordinate) entry.getValue(); + System.out.println("point(" + c.x + ", " + c.y + ", " + c.layer + ") [" + name + "]"); + } + i = borders.iterator(); + while (i.hasNext()) { + System.out.println("border(" + i.next() + ")"); + } + } + + private static final long color_back = ymageMatrix.SUBTRACTIVE_WHITE; + private static final long color_dot = 0x4444AA; + private static final long color_line = 0x333333; + private static final long color_text = ymageMatrix.SUBTRACTIVE_BLACK; + + public ymageMatrix draw(int width, int height, int leftborder, int rightborder, int topborder, int bottomborder) { + ymageMatrix image = new ymageMatrix(width, height, color_back); + double xfactor = (width - leftborder - rightborder) / (rightmost - leftmost); + double yfactor = (height - topborder - bottomborder) / (topmost - bottommost); + image.setMode(ymageMatrix.MODE_SUB); + + Iterator i = points.entrySet().iterator(); + Map.Entry entry; + String name; + coordinate c; + int x, y; + while (i.hasNext()) { + entry = (Map.Entry) i.next(); + name = (String) entry.getKey(); + c = (coordinate) entry.getValue(); + x = (int) (leftborder + (c.x - leftmost) * xfactor); + y = (int) (height - bottomborder - (c.y - bottommost) * yfactor); + image.setColor(color_dot); + image.dot(x, y, 5, true); + image.setColor(color_text); + ymageToolPrint.print(image, x, y + 10, 0, name.toUpperCase(), 0); + } + i = borders.iterator(); + coordinate[] border; + image.setColor(color_line); + while (i.hasNext()) { + border = getBorder((String) i.next()); + if (border == null) continue; + image.line( + (int) (leftborder + (border[0].x - leftmost) * xfactor), + (int) (height - bottomborder - (border[0].y - bottommost) * yfactor), + (int) (leftborder + (border[1].x - leftmost) * xfactor), + (int) (height - bottomborder - (border[1].y - bottommost) * yfactor)); + } + return image; + } +} diff --git a/source/de/anomic/ymage/ymageMatrix.java b/source/de/anomic/ymage/ymageMatrix.java index 36ac9cff2..4619cd672 100644 --- a/source/de/anomic/ymage/ymageMatrix.java +++ b/source/de/anomic/ymage/ymageMatrix.java @@ -255,25 +255,25 @@ public class ymageMatrix /*implements Cloneable*/ { public static void demoPaint(ymageMatrix m) { m.setMode(MODE_SUB); m.setColor(SUBTRACTIVE_CYAN); - m.line(0, 10, 100, 10); ymageToolPrint.print(m, 0, 5, 0, "Cyan", true); + m.line(0, 10, 100, 10); ymageToolPrint.print(m, 0, 5, 0, "Cyan", -1); m.line(50, 0, 50, 300); m.setColor(SUBTRACTIVE_MAGENTA); - m.line(0, 30, 100, 30); ymageToolPrint.print(m, 0, 25, 0, "Magenta", true); + m.line(0, 30, 100, 30); ymageToolPrint.print(m, 0, 25, 0, "Magenta", -1); m.line(55, 0, 55, 300); m.setColor(SUBTRACTIVE_YELLOW); - m.line(0, 50, 100, 50); ymageToolPrint.print(m, 0, 45, 0, "Yellow", true); + m.line(0, 50, 100, 50); ymageToolPrint.print(m, 0, 45, 0, "Yellow", -1); m.line(60, 0, 60, 300); m.setColor(SUBTRACTIVE_BLACK); - m.line(0, 70, 100, 70); ymageToolPrint.print(m, 0, 65, 0, "Black", true); + m.line(0, 70, 100, 70); ymageToolPrint.print(m, 0, 65, 0, "Black", -1); m.line(65, 0, 65, 300); m.setColor(SUBTRACTIVE_RED); - m.line(0, 90, 100, 90); ymageToolPrint.print(m, 0, 85, 0, "Red", true); + m.line(0, 90, 100, 90); ymageToolPrint.print(m, 0, 85, 0, "Red", -1); m.line(70, 0, 70, 300); m.setColor(SUBTRACTIVE_GREEN); - m.line(0, 110, 100, 110); ymageToolPrint.print(m, 0, 105, 0, "Green", true); + m.line(0, 110, 100, 110); ymageToolPrint.print(m, 0, 105, 0, "Green", -1); m.line(75, 0, 75, 300); m.setColor(SUBTRACTIVE_BLUE); - m.line(0, 130, 100, 130); ymageToolPrint.print(m, 0, 125, 0, "Blue", true); + m.line(0, 130, 100, 130); ymageToolPrint.print(m, 0, 125, 0, "Blue", -1); m.line(80, 0, 80, 300); } diff --git a/source/de/anomic/ymage/ymageToolPrint.java b/source/de/anomic/ymage/ymageToolPrint.java index c70cad8d7..41573862a 100644 --- a/source/de/anomic/ymage/ymageToolPrint.java +++ b/source/de/anomic/ymage/ymageToolPrint.java @@ -43,14 +43,17 @@ public class ymageToolPrint { } } - public static void print(ymageMatrix matrix, int x, int y, int angle, String message, boolean alignLeft) { + public static void print(ymageMatrix matrix, int x, int y, int angle, String message, int align) { + // align = -1 : left + // align = 1 : right + // align = 0 : center int xx = 0, yy = 0; if (angle == 0) { - xx = (alignLeft) ? x : x - 6 * message.length(); + xx = (align == -1) ? x : (align == 1) ? x - 6 * message.length() : x - 3 * message.length(); yy = y; } else if (angle == 90) { xx = x; - yy = (alignLeft) ? y : y + 6 * message.length(); + yy = (align == -1) ? y : (align == 1) ? y + 6 * message.length() : y + 3 * message.length(); } for (int i = 0; i < message.length(); i++) { print(matrix, xx, yy, angle, message.charAt(i)); @@ -72,7 +75,7 @@ public class ymageToolPrint { int xp = x - 3 * message.length(); if ((angle > (90 + arcDist)) && (angle < (270 - arcDist))) xp = x - 6 * message.length(); if ((angle < (90 - arcDist)) || (angle > (270 + arcDist))) xp = x; - print(matrix, xp, yp, 0, message, true); + print(matrix, xp, yp, 0, message, -1); }