Пишу приложение на 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.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости