#java #javafx #graph
Вопрос:
Я реализую проект, в котором пользователь сможет имитировать электрическое поле с несколькими зарядами.
Для этого я пытаюсь реализовать график в проекте JavaFX, чтобы запустить на нем симуляцию. Я использовал стековую панель и вставил несколько строк с определенным промежутком между ними (ровно 54 пикселя). Я хочу наложить линейную диаграмму с изменяемым размером под линиями, чтобы пользователь мог узнать расстояние между линиями (в метрах). Пользователь должен иметь возможность разместить один или несколько зарядов в любом месте графика. Затем программа вычислит и нарисует чистые векторы на каждом пересечении.
Однако я обнаружил, что было очень сложно точно изменить размер каждой оси на идеальную длину в пикселях.
Это лучшее, что я могу сделать прямо сейчас:
Есть ли лучший способ реализовать эту идею? Будет намного проще, если я смогу нарисовать каждую ось по отдельности.
Это код моей сетки, отображаемый на пограничной панели:
private int rows;
private int columns;
private LineChart lineChart;
private double height;
private double width;
private Position[][] position;
public Grid(int columns, int rows, double width, double height) {
this.columns = columns;
this.rows = rows;
//this.setStyle("-fx-background-color: black;");
this.width = width;
this.height = height;
this.setAlignment(Pos.TOP_CENTER);
this.getStyleClass().add("grid");
insertLineChart();
insertClip();
insertGrid();
position = new Position[rows][columns];
}
private void insertClip(){
final Rectangle outputClip = new Rectangle();
this.setClip(outputClip);
this.layoutBoundsProperty().addListener((ov, oldValue, newValue) -> {
outputClip.setWidth(newValue.getWidth());
outputClip.setHeight(newValue.getHeight());
});
}
private void insertLineChart() {
NumberAxis xAxis = new NumberAxis();
double x = 1;
double g = 54.0;
xAxis.setLabel("x-position");
xAxis.setAutoRanging(false);
xAxis.setUpperBound(width);
xAxis.setTickMarkVisible(true);
xAxis.setTickLength(g*x);
NumberAxis yAxis = new NumberAxis();
yAxis.setAutoRanging(false);
yAxis.setLabel("y-position");
yAxis.setUpperBound(height);
lineChart = new LineChart(xAxis, yAxis);
lineChart.setHorizontalGridLinesVisible(true);
lineChart.setVerticalGridLinesVisible(true);
lineChart.setMaxSize(g*(columns), g*(rows));
lineChart.setMinSize(g*(columns), g*(rows));
lineChart.getXAxis().setAutoRanging(true);
lineChart.setVerticalZeroLineVisible(true);
lineChart.setHorizontalZeroLineVisible(true);
lineChart.setTranslateX(-64);
lineChart.setTranslateY(59);
//lineChart.setBorder(new Border(new BorderStroke(Paint.valueOf("red"), BorderStrokeStyle.SOLID, new CornerRadii(5), BorderWidths.DEFAULT)));
insertElement(lineChart);
this.setAlignment(lineChart, Pos.BOTTOM_LEFT);
}
private void insertGrid(){
int g = 54;
for(int i = 0; i<columns; i ){
Line line = new Line(0, 0, 0, (rows-1)*g);
line.setTranslateX(i*g);
insertElement(line);
this.setAlignment(line, Pos.BOTTOM_LEFT);
}
for(int j = 0; j<rows; j ){
Line line = new Line(0, 0, (columns-1)*g, 0);
line.setTranslateY(-(j*g));
insertElement(line);
this.setAlignment(line, Pos.BOTTOM_LEFT);
}
}
private void insertElement(Node n){
this.getChildren().add(n);
}
public int getRows() {
return rows;
}
public int getColumns() {
return columns;
}
public double getGridHeight() {
return height;
}
public double getGridWidth() {
return width;
}
public Position[][] getPosition() {
return position;
}
public void setGridHeight(double height) {
this.height = height;
}
public void setGridWidth(double width) {
this.width = width;
}
} ```