BasicForceLayoutParameters.java

/**
 * Copyright (c) 2025, RTE (http://www.rte-france.com)
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 * SPDX-License-Identifier: MPL-2.0
 */

package com.powsybl.diagram.util.layout.algorithms.parameters;

/**
 * @author Nathan Dissoubray {@literal <nathan.dissoubray at rte-france.com>}
 */
public final class BasicForceLayoutParameters {
    private static final int DEFAULT_MAX_STEPS = 400;
    private static final double DEFAULT_MIN_ENERGY_THRESHOLD = 0.001;
    private static final double DEFAULT_DELTA_TIME = 0.1;
    private static final double DEFAULT_REPULSION = 800.0;
    private static final double DEFAULT_FRICTION = 500;
    private static final double DEFAULT_MAX_SPEED = 100;

    private final int maxSteps;
    private final double minEnergyThreshold;
    private final double deltaTime;
    private final double repulsion;
    private final double friction;
    private final double maxSpeed;
    private final boolean repulsionForceFromFixedPoints;
    private final boolean attractToCenterForce;

    private BasicForceLayoutParameters(
            int maxSteps,
            double minEnergyThreshold,
            double deltaTime,
            double repulsion,
            double friction,
            double maxSpeed,
            boolean repulsionForceFromFixedPoints,
            boolean attractToCenterForce
    ) {
        this.maxSteps = maxSteps;
        this.minEnergyThreshold = minEnergyThreshold;
        this.deltaTime = deltaTime;
        this.repulsion = repulsion;
        this.friction = friction;
        this.maxSpeed = maxSpeed;
        this.repulsionForceFromFixedPoints = repulsionForceFromFixedPoints;
        this.attractToCenterForce = attractToCenterForce;
    }

    public static class Builder {
        private int maxSteps = DEFAULT_MAX_STEPS;
        private double minEnergyThreshold = DEFAULT_MIN_ENERGY_THRESHOLD;
        private double deltaTime = DEFAULT_DELTA_TIME;
        private double repulsion = DEFAULT_REPULSION;
        private double friction = DEFAULT_FRICTION;
        private double maxSpeed = DEFAULT_MAX_SPEED;
        private boolean repulsionForceFromFixedPoints = true;
        private boolean attractToCenterForce = true;

        public Builder withMaxSteps(int maxSteps) {
            this.maxSteps = maxSteps;
            return this;
        }

        public Builder withMinEnergyThreshold(double minEnergyThreshold) {
            this.minEnergyThreshold = minEnergyThreshold;
            return this;
        }

        public Builder withDeltaTime(double deltaTime) {
            this.deltaTime = deltaTime;
            return this;
        }

        public Builder withRepulsion(double repulsion) {
            this.repulsion = repulsion;
            return this;
        }

        public Builder withFriction(double friction) {
            this.friction = friction;
            return this;
        }

        public Builder withMaxSpeed(double maxSpeed) {
            this.maxSpeed = maxSpeed;
            return this;
        }

        public Builder withRepulsionForceFromFixedPoints(boolean repulsionForceFromFixedPoints) {
            this.repulsionForceFromFixedPoints = repulsionForceFromFixedPoints;
            return this;
        }

        public Builder withAttractToCenterForce(boolean attractToCenterForce) {
            this.attractToCenterForce = attractToCenterForce;
            return this;
        }

        public BasicForceLayoutParameters build() {
            return new BasicForceLayoutParameters(
                    maxSteps,
                    minEnergyThreshold,
                    deltaTime,
                    repulsion,
                    friction,
                    maxSpeed,
                    repulsionForceFromFixedPoints,
                    attractToCenterForce
            );
        }
    }

    public int getMaxSteps() {
        return maxSteps;
    }

    public double getMinEnergyThreshold() {
        return minEnergyThreshold;
    }

    public double getDeltaTime() {
        return deltaTime;
    }

    public double getRepulsion() {
        return repulsion;
    }

    public double getFriction() {
        return friction;
    }

    public double getMaxSpeed() {
        return maxSpeed;
    }

    public boolean isRepulsionForceFromFixedPoints() {
        return repulsionForceFromFixedPoints;
    }

    public boolean isAttractToCenterForce() {
        return attractToCenterForce;
    }

}