Изменение ширины штриха кривой в JavaFX

#javafx-8 #curve #variations #thickness

#javafx-8 #кривая #варианты #толщина

Вопрос:

Есть ли способ создать кривую в JavaFX с изменяющейся шириной штриха? Например, начиная с 10 точек и заканчивая 1 точкой.

Ответ №1:

Вы не можете изменять ширину штриха.

Однако вы можете имитировать это поведение, создав путь, который накладывает несколько кривых, которые начинаются с разных начальных позиций, но сходятся к одной точке.

путь

 import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.*;
import javafx.stage.Stage;

import java.util.Random;

public class DividedPath extends Application {

    private static final double WIDTH = 400, HEIGHT = 400;
    private static final Random random = new Random(42);

    @Override public void start(Stage stage) {
        CubicCurve curve = randomCurve(WIDTH, HEIGHT);

        Path path = new Path();
        for (int i = -5; i <=  5; i  ) {
            path.getElements().addAll(
                    new MoveTo(curve.getStartX()   i, curve.getStartY()),
                    new CubicCurveTo(
                            curve.getControlX1(),
                            curve.getControlY1(),
                            curve.getControlX2(),
                            curve.getControlY2(),
                            curve.getEndX(),
                            curve.getEndY()
                    )
            );
        }
        path.setStroke(Color.FORESTGREEN);

        Group root = new Group();
        curve.setFill(null);
        root.getChildren().addAll(
                path,
                curve
        );

        Scene scene = new Scene(
                root,
                WIDTH, HEIGHT,
                Color.rgb(35,39,50)
        );

        stage.setScene(scene);
        stage.setResizable(false);
        stage.show();
    }

    private CubicCurve randomCurve(double mx, double my) {
        return new CubicCurve(
                random.nextDouble() * mx,
                random.nextDouble() * my,
                random.nextDouble() * mx,
                random.nextDouble() * my,
                random.nextDouble() * mx,
                random.nextDouble() * my,
                random.nextDouble() * mx,
                random.nextDouble() * my
        );
    }
}