Эффективный способ реализации графика на JavaFX?

#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;
    }

} ```