# Lineal mit Zahlen zeichnen



## flashdog (30. Mrz 2010)

Hallo,
zuerst liest der Code die folgende Eingabedatei ein:

```
0
0
0
0
0
0
0
0
0
0
3
3
3
3
3
3
3
3
3
3
4
4
4
4
4
8
8
8
8
8
```

Der Code sieht wie folgt aus:

```
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import javax.imageio.ImageIO;

public class TestRuler {

  public static void main(String[] args) throws FileNotFoundException, IOException {
    final int IMAGE_HEIGHT = 100;                   
    final int SNP_WIDTH = 1;

    String fileName = "testruler.txt";
    String outputImg = fileName + ".png";


    BufferedReader br = new BufferedReader(new FileReader(fileName));
    ArrayList<Integer> numbersFromFile = new ArrayList<Integer>();

    String line;
    while ((line = br.readLine()) != null) {
      int temp = Integer.parseInt(line.trim());
        numbersFromFile.add(temp);
    }

    Color color[] = {
      Color.BLACK, Color.BLUE, Color.CYAN, Color.DARK_GRAY, Color.GRAY,
      Color.GREEN, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE, Color.PINK,
      Color.RED, Color.WHITE, Color.YELLOW
    };
    BufferedImage chr = new BufferedImage(numbersFromFile.size(), IMAGE_HEIGHT,
            BufferedImage.TYPE_INT_ARGB);

    Graphics2D g2 = chr.createGraphics();

    g2.setColor(Color.WHITE);
    int x = 0;
    for (int median : numbersFromFile) {
      g2.setColor(color[median]);
      g2.fillRect(x++, 20, SNP_WIDTH, IMAGE_HEIGHT-20);

      if (x % 10  == 0){
        g2.setColor(Color.MAGENTA);
        g2.fillRect(x, 15, SNP_WIDTH, 5);
        g2.drawString(x + "M", x, 10);
      }
    }
    ImageIO.write(chr, "png", new File(outputImg));
  }
}
```

Dieser Code zeichnet das Lineal (jede 10te stelle ein strich), aber leider weiss ich nicht wie man die dazugehörigen Zahlen umdrehen kann so dass diese die Striche benenn?

Viele Gruesse


----------



## Kr0e (30. Mrz 2010)

Graphics2D unterstützt die Methode "rotate". Damit kannst du den Grafikkontext drehen. Musst ihn aber zurück drehen, da jeder Zeichenbefehl von da an gedreht ist...


----------



## flashdog (31. Mrz 2010)

Danke, für den tip mit 2 * rotate.

Jetzt habe ich nur das Problem den Text mit drawString zentriert über jeden Lineal-Strich zu setzen.


----------



## andre111 (31. Mrz 2010)

Du kannst mithilfe von FontMetrics die Breite eines Strings mit einer bestimmten Font bestimmen. So kannst du dann auch die Position des Strings zentrieren.


----------



## flashdog (15. Apr 2010)

Leider weiss ich immer noch nicht wie man mit FontMetrics den Text an jeder Messeinheit zentriert bekommt. 

Gibt es irgendwo Beispiele?


----------



## SlaterB (15. Apr 2010)

http://www.java-forum.org/allgemeine-java-themen/95494-drawstring-rechtsbuendig.html


----------



## flashdog (17. Apr 2010)

Habe den Code aktualisiert, aber nun verschwinden die Messeinheiten und ich habe immer noch nicht verstanden wie  FontMetrics mir helfen kann.

Der aktuelle Code sieht wie folgt aus:

```
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import javax.imageio.ImageIO;

public class TestRuler {

  public static void main(String[] args) throws FileNotFoundException, IOException {
    final int IMAGE_HEIGHT = 100;                   
    final int SNP_WIDTH = 1;

    
    String fileName = "/media/disk/testruler.txt";
    String outputImg = fileName + ".png";


    BufferedReader br = new BufferedReader(new FileReader(fileName));
    ArrayList<Integer> numbersFromFile = new ArrayList<Integer>();

    String line;
    while ((line = br.readLine()) != null) {
      int temp = Integer.parseInt(line.trim());
        numbersFromFile.add(temp);
    }

    Color color[] = {
      Color.BLACK, Color.BLUE, Color.CYAN, Color.DARK_GRAY, Color.GRAY,
      Color.GREEN, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE, Color.PINK,
      Color.RED, Color.WHITE, Color.YELLOW
    };
    BufferedImage chr = new BufferedImage(numbersFromFile.size(), IMAGE_HEIGHT,
            BufferedImage.TYPE_INT_ARGB);

    Graphics2D g2 = chr.createGraphics();

    g2.setColor(Color.WHITE);
    int x = 0;
    for (int median : numbersFromFile) {
      g2.setColor(color[median]);
      g2.fillRect(x++, 20, SNP_WIDTH, IMAGE_HEIGHT-20);

      if (x % 10  == 0){
        g2.setColor(Color.MAGENTA);
        g2.fillRect(x, 15, SNP_WIDTH, 5);

        g2.setFont(new Font( "SansSerif", Font.BOLD, 7));
        FontMetrics metrics = g2.getFontMetrics();
        g2.rotate(-Math.toRadians(70));


        g2.drawString(x + "M", x, 45);
        g2.rotate(Math.toRadians(70));
      }
    }
    ImageIO.write(chr, "png", new File(outputImg));
  }
}
```

Was mache ich falsch?


----------



## SlaterB (17. Apr 2010)

schau dir das verlinkte Beispiel an, da steht z.B.
SwingUtilities.computeStringWidth(fm, text)
drin, was das bedeutet kann man ja einigermaßen erahnen, oder nachlesen oder auch ausprobieren,

nimm 5 Strings
a
ab
abc
abcd
abcde
und rechne erstmal deren Länge aus und gib sie mit System.out.println aus,
gar nicht mit komplizierten malen anfangen wobei dieses Rechnen wahrscheinlich nur innerhalb der paint-Methode ordentlich geht

in deinem Code nutzt du jedenfalls das FontMetrics-Objekt bisher nicht, das kann dir noch gar nichts kaputtmachen,
für meinen Geschmack hast du auch ansonstern zuviel Krimskrams drin,
immer einfach anfangen, ohne Schleife, erstmal nur wenig Text, dann langsam verschieben, rotieren, so dass du immer weißt, was wo passiert


----------

