Пишу приложение на 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 (включил антиалисинг), улучшил качество рендера, не особо что изменилось (линия потолще стала и всё, если масштаб увеличить, стало чуть лучше, и всё).
Вот:
Здесь не изменено ничего, кроме настроек рендера. Выглядит немного по-другому, но всё равно не так, как хотелось бы. Если кто скажет, что лучше сделать нельзя, вот пример: Скриншот с сайта по построению графиков. Хотелось бы получить именно такой результат.
Есть настройка рендера, где можно включить антиалайзинг:
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.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Всем добрый деньВстала задача из XSD получить результирующую структуру XML
Есть такая библиотека twoway-view которая позволяет создать кастомный recycler view как мне нужно