PDA

View Full Version : [java - awt] facile o difficile?


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

PGI-Bis
24-02-2007, 12:15
Prova a mettere

graphics.setColor(Color.YELLOW);
graphics.fillRect(dt.x, dt.y, dt.widht, dt.height);
graphics.setColor(Color.BLACK);

prima di:

graphics.drawRect(dt.x, dt.y, dt.width, dt.height);

nel metodo draw.

Dovrebbe colorarti i nodi di giallo. Se funziona allora è sufficiente creare una mappa o array indice-colore e trasformare la cosa in:

graphics.setColor(getColorePerAltezza(dt.height));
graphics.fillRect(dt.x, dt.y, dt.widht, dt.height);
graphics.setColor(Color.BLACK);
graphics.drawRect(dt.x, dt.y, dt.width, dt.height);

dnarod
24-02-2007, 13:37
si immaginavo anch io qualcosa di simile; grazie dello spunto, ora provo...certo che ne sai una piu del diavolo tu eh?

Andrea16v
24-02-2007, 19:07
Hai mica uno screen dell'output generato da questo codice su un alberello di prova? :cool:

dnarod
24-02-2007, 20:05
http://img126.imageshack.us/img126/9959/immaginekr8.th.jpg (http://img126.imageshack.us/my.php?image=immaginekr8.jpg)