Более чёткий график на java

371
14 февраля 2017, 18:42

Пишу приложение на Java (сторонние библиотеки не предлагайте, пожалуйста), нужно нарисовать график вводимой с клавиатуры функции. Пользовался g.drawPolyLine(xArray[], yArray[], numOfPoints), g - объект класса Graphics, также пробовал g2.draw(new Line2D.Double(double x1, double y1, double x2, double y2)), g2 - объект класса Graphics2D, думал, что во втором варианте график будет более чётким, но всё равно получаются одни пиксели, которые резко бросаются в глаза, вот пример:

Если сделать "перо" потолще, результат тот же. Пробовал посмотреть, как рисуют нормальные графики на сайтах в интернете - там толщина "пера" 2 пиксела, и один из них более светлый, и создаётся иллюзия того, что пикселизацию не видно. Можно ли добиться такого же результата другим способом или же как реализовать такой же (как на сайтах)?

Попробовал поставить KEY_ANTIALIASING значение VALUE_ANTIALIAS_ON (включил антиалисинг), улучшил качество рендера, не особо что изменилось (линия потолще стала и всё, если масштаб увеличить, стало чуть лучше, и всё).
Вот:

Здесь не изменено ничего, кроме настроек рендера. Выглядит немного по-другому, но всё равно не так, как хотелось бы. Если кто скажет, что лучше сделать нельзя, вот пример: Скриншот с сайта по построению графиков. Хотелось бы получить именно такой результат.

Answer 1

Есть настройка рендера, где можно включить антиалайзинг:

graphics.setRenderingHint(
    RenderingHints.KEY_ANTIALIASING,
    RenderingHints.VALUE_ANTIALIAS_ON);

Подробнее тут.

Могу также предложить альтернативу, JavaFX:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;

public class LineChartSample extends Application {

    @Override public void start(Stage stage) {
        stage.setTitle("Line Chart Sample");
        //Задаем оси
        final NumberAxis xAxis = new NumberAxis();
        final NumberAxis yAxis = new NumberAxis();
        //Имя оси
        xAxis.setLabel("Something");
        //Добавляем их на график
        final LineChart<Number,Number> lineChart = 
                new LineChart<Number,Number>(xAxis,yAxis);
        //Его имя
        lineChart.setTitle("Stock Monitoring, 2010");
        //Создаем линию графика
        XYChart.Series series = new XYChart.Series();
        series.setName("My portfolio");
        //Втыкаем данные
        series.getData().add(new XYChart.Data(1, 23));
        series.getData().add(new XYChart.Data(2, 14));
        series.getData().add(new XYChart.Data(3, 15));
        series.getData().add(new XYChart.Data(4, 24));
        series.getData().add(new XYChart.Data(5, 34));
        series.getData().add(new XYChart.Data(6, 36));
        series.getData().add(new XYChart.Data(7, 22));
        series.getData().add(new XYChart.Data(8, 45));
        series.getData().add(new XYChart.Data(9, 43));
        series.getData().add(new XYChart.Data(10, 17));
        series.getData().add(new XYChart.Data(11, 29));
        series.getData().add(new XYChart.Data(12, 25));
        //Создаем окно с результатом.
        Scene scene  = new Scene(lineChart,800,600);
        lineChart.getData().add(series);
        stage.setScene(scene);
        stage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}

Подробнее тут. Библиотека входит в пакет библиотек jdk.

READ ALSO
Синхронизация коллекций HashSet java

Синхронизация коллекций HashSet java

Есть две коллекции:

325
XSD Java: получить структуру

XSD Java: получить структуру

Всем добрый деньВстала задача из XSD получить результирующую структуру XML

378
Как импортировать библиотеку twoway-view?

Как импортировать библиотеку twoway-view?

Есть такая библиотека twoway-view которая позволяет создать кастомный recycler view как мне нужно

374