Proportionale und quadratische Schrift für Terminals?

CyborgBeta

Captain
Registriert
Jan. 2021
Beiträge
3.806
Hi,

ich versuche, einen Candlestick-Chart auf dem Windows-Terminal zu zeichnen (wie in den 80ern :D). Dafür wäre es vorteilig, wenn jedes Zeichen eine feste Breite und Höhe hätte, die gleich sind.

Also ein Beispiel: Es soll 100 Zeilen mit je 100 Zeichen geben und jedes Zeichen soll inkl. Zeilenzwischenraum nicht größer als sagen wir 8x8 Pixel sein. Damit ergibt sich eine Fläche von 800x800 Pixel, auf der ich zeichnen kann.

Gibt es so eine Schriftart?
 
Es ist ja nicht so, dass es nur die eine Suchmaschine mit dem datenhungrigen "G" gibt...

Aber so als Anregung: Panoptic monospace könnte da was passendes sein...
 
  • Gefällt mir
Reaktionen: CyborgBeta
  • Gefällt mir
Reaktionen: CyborgBeta
VoodooMax schrieb:
Panoptic monospace

Sieht vielversprechend aus. Danke.

1724007064662.png
 
  • Gefällt mir
Reaktionen: |Moppel|
Bleibt noch die Frage offen, wie ich den Zeilenzwischenabstand auf 0 setzen kann.
 
Hm, ich zeichne jetzt doch nur eine normale Grafik, weil mit dem Terminal werde ich so eine Darstellung eh nicht hinbekommen:

1724056289305.png


Java:
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.*;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.*;


public class Main {
  record Candle(
      long openTime,
      double open,
      double high,
      double low,
      double close,
      double volume,
      long closeTime) {}


  private static void drawCandles(String symbol, int limit) {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    CandleJPanel panel = getChartPanel(getCandles(symbol, limit), 1250, 800);
    frame.add(panel);
    frame.pack();
    frame.setVisible(true);
    frame.repaint();
    try {
      ImageIO.write(panel.getImage(), "png", new java.io.File("chart.png"));
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  }

  static class CandleJPanel extends JPanel {
    public BufferedImage getImage() {
      Dimension size = getPreferredSize();
      BufferedImage image = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_RGB);
      Graphics g = image.getGraphics();
      paint(g);
      g.dispose();
      return image;
    }
  }

  private static CandleJPanel getChartPanel(List<Candle> candles, int width, int height) {
    long min_x = candles.get(0).openTime();
    long max_x = candles.get(candles.size() - 1).openTime();
    double mul_x = (double) (width - 50) / (max_x - min_x);
    double step_x = (double) (width - 50) / candles.size();
    double temp1 = Double.MAX_VALUE;
    double temp2 = Double.MIN_VALUE;
    for (Candle candle : candles) {
      if (candle.low() < temp1) {
        temp1 = candle.low();
      }
      if (candle.high() > temp2) {
        temp2 = candle.high();
      }
    }
    double min_y = temp1;
    double max_y = temp2;
    double mul_y = (double) (height - 50) / (max_y - min_y);
    CandleJPanel panel =
        new CandleJPanel() {
          @Override
          public void paint(Graphics g) {
            super.paint(g);
            Graphics2D g2d = (Graphics2D) g;
            for (int i = 0; i < candles.size(); i++) {
              Candle c1 = candles.get(i);
              int x0 = 25 + (int) Math.round(step_x * i);
              int x1 = 25 + (int) Math.round(step_x * (i + 1));
              int y0 = 25 + (int) Math.round(mul_y * (max_y - c1.high()));
              int y1 = 25 + (int) Math.round(mul_y * (max_y - c1.low()));
              g2d.setColor(Color.RED);
              g2d.fillRect(x0, y0, x1 - x0 - 1, y1 - y0);
            }
          }
        };
    panel.setPreferredSize(new Dimension(width, height));
    return panel;
  }
}
 
CyborgBeta schrieb:
Hm, ich zeichne jetzt doch nur eine normale Grafik, weil mit dem Terminal werde ich so eine Darstellung eh nicht hinbekommen:
Warum nicht? Es ist doch mittlerweile fast alles möglich. Schau dir mal diesen Screenshot von Cascadia Code an:
326980955-52d6a10a-7e33-40fd-9df3-00fe85003c3c-2.png
 
  • Gefällt mir
Reaktionen: CyborgBeta
Zurück
Oben