dnarod
24-02-2007, 09:49
private class DrawingPanel extends JPanel
{
private int fromLeftMargin = 2;
private Graphics graphics;
//private int hScale = 40;
private int vScale = 40;
DrawingTree build(AVLNode t, int level)
{
if(t.isEmpty()) return null;
else
{
DrawingTree left = build(t.left, level + 1);
String str = t.element.toString() + "|" + t.height;
Rectangle2D rect = graphics.getFontMetrics().getStringBounds(str, graphics);
int width = (int)Math.round(rect.getWidth())+2;
int height = (int)Math.round(rect.getHeight());
int dx = (int)Math.round(rect.getCenterX());
int dy = (int)Math.round(rect.getCenterY());
int x = fromLeftMargin + dx + 2;
int y = vScale*level + dy;
fromLeftMargin += width;
DrawingTree right = build(t.right, level + 1);
return new DrawingTree(t.element, x, y, width, height, left, right, t.height);
}
}
void draw(DrawingTree dt)
{
if(dt != null)
{
String str = dt.element.toString() + "|" + dt.nodeHeight;
graphics.drawRect(dt.x, dt.y, dt.width, dt.height);
graphics.drawString(str, dt.x+1, dt.y + dt.height - 2);
if(dt.left != null)
{
int x1 = dt.x + dt.width/2;
int y1 = dt.y + dt.height;
int x2 = dt.left.x + dt.left.width/2;
int y2 = dt.left.y;
graphics.drawLine(x1, y1, x2, y2);
}
draw(dt.left);
if(dt.right != null)
{
int x1 = dt.x + dt.width/2;
int y1 = dt.y + dt.height;
int x2 = dt.right.x + dt.right.width/2;
int y2 = dt.right.y;
graphics.drawLine(x1, y1, x2, y2);
}
draw(dt.right);
}
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
graphics = g;
DrawingTree dt = build(root,1);
draw(dt);
fromLeftMargin = 2;
}
}
mi è stata data questa roba che disegna un albero binario da qualche parte...produce una rappresentazione un po sgrausa ma efficace; i nodi sono formati da dei rettangoli con dentro elemento.toString()...quello che mi chiedo è: mi piacerebbe (trattandosi nel mio caso specifico di alberi avl con altezza memorizzata nel nodo) colorare l interno di questi rettangolini (senza inficiare la lettura dei dati dell elemento ovviamente) per livello; in altre parole vorrei che tutti i nodi di altezza x abbiano colore uguale, tutti quelli di altexxa y abbiano colore uguale, eccetera...
avendo ancora quasi zero esperienza di grafica mi chiedevo se cio fosse una stupidaggine da realizzare o se, per come è fatta quella classetta (credo fatta ad hoc per far provare la semplice esercitazione che ha dato sugli alberi), sarebbe difficile
{
private int fromLeftMargin = 2;
private Graphics graphics;
//private int hScale = 40;
private int vScale = 40;
DrawingTree build(AVLNode t, int level)
{
if(t.isEmpty()) return null;
else
{
DrawingTree left = build(t.left, level + 1);
String str = t.element.toString() + "|" + t.height;
Rectangle2D rect = graphics.getFontMetrics().getStringBounds(str, graphics);
int width = (int)Math.round(rect.getWidth())+2;
int height = (int)Math.round(rect.getHeight());
int dx = (int)Math.round(rect.getCenterX());
int dy = (int)Math.round(rect.getCenterY());
int x = fromLeftMargin + dx + 2;
int y = vScale*level + dy;
fromLeftMargin += width;
DrawingTree right = build(t.right, level + 1);
return new DrawingTree(t.element, x, y, width, height, left, right, t.height);
}
}
void draw(DrawingTree dt)
{
if(dt != null)
{
String str = dt.element.toString() + "|" + dt.nodeHeight;
graphics.drawRect(dt.x, dt.y, dt.width, dt.height);
graphics.drawString(str, dt.x+1, dt.y + dt.height - 2);
if(dt.left != null)
{
int x1 = dt.x + dt.width/2;
int y1 = dt.y + dt.height;
int x2 = dt.left.x + dt.left.width/2;
int y2 = dt.left.y;
graphics.drawLine(x1, y1, x2, y2);
}
draw(dt.left);
if(dt.right != null)
{
int x1 = dt.x + dt.width/2;
int y1 = dt.y + dt.height;
int x2 = dt.right.x + dt.right.width/2;
int y2 = dt.right.y;
graphics.drawLine(x1, y1, x2, y2);
}
draw(dt.right);
}
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
graphics = g;
DrawingTree dt = build(root,1);
draw(dt);
fromLeftMargin = 2;
}
}
mi è stata data questa roba che disegna un albero binario da qualche parte...produce una rappresentazione un po sgrausa ma efficace; i nodi sono formati da dei rettangoli con dentro elemento.toString()...quello che mi chiedo è: mi piacerebbe (trattandosi nel mio caso specifico di alberi avl con altezza memorizzata nel nodo) colorare l interno di questi rettangolini (senza inficiare la lettura dei dati dell elemento ovviamente) per livello; in altre parole vorrei che tutti i nodi di altezza x abbiano colore uguale, tutti quelli di altexxa y abbiano colore uguale, eccetera...
avendo ancora quasi zero esperienza di grafica mi chiedevo se cio fosse una stupidaggine da realizzare o se, per come è fatta quella classetta (credo fatta ad hoc per far provare la semplice esercitazione che ha dato sugli alberi), sarebbe difficile