Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX-是否可以将一个形状划分为两个或多个形状?_Java_Javafx_Path_Shapes - Fatal编程技术网

JavaFX-是否可以将一个形状划分为两个或多个形状?

JavaFX-是否可以将一个形状划分为两个或多个形状?,java,javafx,path,shapes,Java,Javafx,Path,Shapes,例如,我有这个 我想把它分成5个部分(和划分比萨饼完全一样) 这可以通过使用 然而,这样它看起来像5个对象,但实际上它仍然是1个对象 有没有可能把这个对象分成5个,这样我就不必一个接一个地创建它们了 多谢各位 更新: 当然,当我修改start方法时 @Override public void start(Stage primaryStage) { var pane = new Pane(); var moveTo = new MoveTo(200, 380); var

例如,我有这个

我想把它分成5个部分(和划分比萨饼完全一样)

这可以通过使用

然而,这样它看起来像5个对象,但实际上它仍然是1个对象

有没有可能把这个对象分成5个,这样我就不必一个接一个地创建它们了

多谢各位

更新:

当然,当我修改start方法时

@Override
public void start(Stage primaryStage) {
    var pane = new Pane();
    var moveTo = new MoveTo(200, 380);
    var lineTo = new LineTo(0, 300);
    var arc_big = 300;
    var arc_small = 180;
    for (var deg = 198; deg <= 270; deg += 18) {
        var path = new Path(moveTo, lineTo);
        lineTo = new LineTo(300 + arc_big * Math.cos(Math.toRadians(deg)), 300 + arc_big * Math.sin(Math.toRadians(deg)));
        path.getElements().add(new ArcTo(arc_big, arc_big, 0, lineTo.getX(), lineTo.getY(), false, true));
        var move = new MoveTo(380 + arc_small * Math.cos(Math.toRadians(deg)), 380 + arc_small * Math.sin(Math.toRadians(deg)));
        path.getElements().addAll(new LineTo(move.getX(), move.getY()),
        new ArcTo(arc_small, arc_small, 0, moveTo.getX(), moveTo.getY(), false, false));
        moveTo = move;
        path.setFill(Color.color(Math.random(), Math.random(), Math.random()));
        pane.getChildren().add(path);
    }
    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(new Scene(pane));
    primaryStage.show();
}
@覆盖
公共无效开始(阶段primaryStage){
var pane=new pane();
var moveTo=新moveTo(200380);
var lineTo=新lineTo(0,300);
var arc_big=300;
var arc_small=180;

对于(var deg=198;deg,可以使用圆弧对象而不是路径来执行此操作 在这段代码中,我制作了五个18度的圆弧,每个圆弧和一个淡入淡出动画,以使路径透明。动画结束后,我将路径从子窗格中删除
`


您可以使用圆弧对象而不是路径来执行此操作 在这段代码中,我制作了五个18度的圆弧,每个圆弧和一个淡入淡出动画,以使路径透明。动画结束后,我将路径从子窗格中删除
`

< P>当代码变得过于复杂时,考虑将其重构为短的单任务可重用方法:

import javafx.application.Application;
import javafx.geometry.Point2D;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.ArcTo;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
import javafx.scene.shape.Shape;
import javafx.stage.Stage;

public class ConvinienceMethodsExample extends Application {

    private static final double OUTER_RADIUS =300, INNER_RADIUS = 180, ORIGIN_X = 300, ORIGIN_Y = 300;
    private static final double START_ANGLE =20, END_ANGLE = 70, STEP_ANGEL = 10;

    @Override
    public void start(Stage primaryStage) {

        Group group = new Group();

        for(double angle =  START_ANGLE; angle < END_ANGLE ; angle += STEP_ANGEL ){

            Point2D innerArcStart = getPoint(INNER_RADIUS, angle);
            Point2D innerArcEnd = getPoint(INNER_RADIUS, angle + STEP_ANGEL);
            Point2D outerArcStart = getPoint(OUTER_RADIUS, angle);
            Point2D outerArcEnd = getPoint(OUTER_RADIUS, angle + STEP_ANGEL);
            var path = getPath(innerArcStart, innerArcEnd, outerArcStart, outerArcEnd);
            group.getChildren().add(path);
        }
        primaryStage.setScene(new Scene(new Pane(group)));
        primaryStage.show();
    }

    private Point2D getPoint(double radius, double angle){

        double x = ORIGIN_X - radius * Math.cos(Math.toRadians(angle));
        double y = ORIGIN_Y - radius * Math.sin(Math.toRadians(angle));
        return new Point2D(x, y);
    }

    private Shape getPath(Point2D innerArcStart, Point2D innerArcEnd, Point2D outerArcStart, Point2D outerArcEnd){
        var path = new Path(
                new MoveTo(innerArcStart.getX(), innerArcStart.getY()),
                new LineTo(outerArcStart.getX(), outerArcStart.getY()), //left line
                new ArcTo(OUTER_RADIUS, OUTER_RADIUS, 0, outerArcEnd.getX(), outerArcEnd.getY(), false, true), //outer arc
                new LineTo(innerArcEnd.getX(),innerArcEnd.getY()), //right line
                new ArcTo(INNER_RADIUS, INNER_RADIUS, 0, innerArcStart.getX(), innerArcStart.getY(), false, false)
                );
        path.setFill(Color.color(Math.random(), Math.random(), Math.random()));
        return path;
    }

    public static void main(String args[]){
        launch(args);
    }
} 
导入javafx.application.application;
导入javafx.geometry.Point2D;
导入javafx.scene.Group;
导入javafx.scene.scene;
导入javafx.scene.layout.Pane;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.ArcTo;
导入javafx.scene.shape.LineTo;
导入javafx.scene.shape.MoveTo;
导入javafx.scene.shape.Path;
导入javafx.scene.shape.shape;
导入javafx.stage.stage;
公共类ConvinienceMethodsExample扩展了应用程序{
专用静态最终双外半径=300,内半径=180,原点X=300,原点Y=300;
专用静态最终双启动角=20,结束角=70,步进角=10;
@凌驾
公共无效开始(阶段primaryStage){
组=新组();
用于(双角度=开始角度;角度<结束角度;角度+=步进角度){
Point2D innerArcStart=getPoint(内半径、角度);
Point2D innerArcEnd=getPoint(内半径、角度+步进角度);
Point2D outerArcStart=getPoint(外半径、角度);
Point2D Outerarchend=getPoint(外半径、角度+步进角度);
var path=getPath(innerArcStart、innerArcEnd、outerArcStart、outerArcEnd);
group.getChildren().add(路径);
}
初始阶段。设置场景(新场景(新窗格(组));
primaryStage.show();
}
专用点2D getPoint(双半径、双角度){
double x=原点x-半径*Math.cos(Math.toRadians(角度));
双y=原点_y-半径*Math.sin(Math.toRadians(角度));
返回新的点2d(x,y);
}
私有形状getPath(Point2D innerArcStart、Point2D innerArcEnd、Point2D outerArcStart、Point2D outerArcEnd){
var路径=新路径(
新建MoveTo(innerArcStart.getX(),innerArcStart.getY()),
new LineTo(outerArcStart.getX(),outerArcStart.getY()),//左行
新弧到(外弧半径,外弧半径,0,outerarchend.getX(),outerarchend.getY(),false,true),//外弧
new LineTo(innerArcEnd.getX(),innerArcEnd.getY()),//右行
新建ArcTo(内半径,内半径,0,innerArcStart.getX(),innerArcStart.getY(),false,false)
);
setFill(Color.Color(Math.random(),Math.random(),Math.random());
返回路径;
}
公共静态void main(字符串参数[]){
发射(args);
}
} 

< P>当代码变得过于复杂时,考虑将其重构为短的单任务可重用方法:

import javafx.application.Application;
import javafx.geometry.Point2D;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.ArcTo;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
import javafx.scene.shape.Shape;
import javafx.stage.Stage;

public class ConvinienceMethodsExample extends Application {

    private static final double OUTER_RADIUS =300, INNER_RADIUS = 180, ORIGIN_X = 300, ORIGIN_Y = 300;
    private static final double START_ANGLE =20, END_ANGLE = 70, STEP_ANGEL = 10;

    @Override
    public void start(Stage primaryStage) {

        Group group = new Group();

        for(double angle =  START_ANGLE; angle < END_ANGLE ; angle += STEP_ANGEL ){

            Point2D innerArcStart = getPoint(INNER_RADIUS, angle);
            Point2D innerArcEnd = getPoint(INNER_RADIUS, angle + STEP_ANGEL);
            Point2D outerArcStart = getPoint(OUTER_RADIUS, angle);
            Point2D outerArcEnd = getPoint(OUTER_RADIUS, angle + STEP_ANGEL);
            var path = getPath(innerArcStart, innerArcEnd, outerArcStart, outerArcEnd);
            group.getChildren().add(path);
        }
        primaryStage.setScene(new Scene(new Pane(group)));
        primaryStage.show();
    }

    private Point2D getPoint(double radius, double angle){

        double x = ORIGIN_X - radius * Math.cos(Math.toRadians(angle));
        double y = ORIGIN_Y - radius * Math.sin(Math.toRadians(angle));
        return new Point2D(x, y);
    }

    private Shape getPath(Point2D innerArcStart, Point2D innerArcEnd, Point2D outerArcStart, Point2D outerArcEnd){
        var path = new Path(
                new MoveTo(innerArcStart.getX(), innerArcStart.getY()),
                new LineTo(outerArcStart.getX(), outerArcStart.getY()), //left line
                new ArcTo(OUTER_RADIUS, OUTER_RADIUS, 0, outerArcEnd.getX(), outerArcEnd.getY(), false, true), //outer arc
                new LineTo(innerArcEnd.getX(),innerArcEnd.getY()), //right line
                new ArcTo(INNER_RADIUS, INNER_RADIUS, 0, innerArcStart.getX(), innerArcStart.getY(), false, false)
                );
        path.setFill(Color.color(Math.random(), Math.random(), Math.random()));
        return path;
    }

    public static void main(String args[]){
        launch(args);
    }
} 
导入javafx.application.application;
导入javafx.geometry.Point2D;
导入javafx.scene.Group;
导入javafx.scene.scene;
导入javafx.scene.layout.Pane;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.ArcTo;
导入javafx.scene.shape.LineTo;
导入javafx.scene.shape.MoveTo;
导入javafx.scene.shape.Path;
导入javafx.scene.shape.shape;
导入javafx.stage.stage;
公共类ConvinienceMethodsExample扩展了应用程序{
专用静态最终双外半径=300,内半径=180,原点X=300,原点Y=300;
专用静态最终双启动角=20,结束角=70,步进角=10;
@凌驾
公共无效开始(阶段primaryStage){
组=新组();
用于(双角度=开始角度;角度<结束角度;角度+=步进角度){
Point2D innerArcStart=getPoint(内半径、角度);
Point2D innerArcEnd=getPoint(内半径、角度+步进角度);
Point2D outerArcStart=getPoint(外半径、角度);
Point2D Outerarchend=getPoint(外半径、角度+步进角度);
var path=getPath(innerArcStart、innerArcEnd、outerArcStart、outerArcEnd);
group.getChildren().add(路径);
}
初始阶段。设置场景(新场景(新窗格(组));
primaryStage.show();
}
专用点2D getPoint(双半径、双角度){
double x=原点x-半径*Math.cos(Math.toRadians(角度));
双y=原点_y-半径*Math.sin(Math.toRadians(角度));
返回新的点2d(x,y);
}
私有形状getPath(Point2D innerArcStart、Point2D innerArcEnd、Point2D outerArcStart、Point2D outerArcEnd){
var路径=新路径(
新建MoveTo(innerArcStart.getX(),innerArcStart.getY()),
new LineTo(outerArcStart.getX(),outerArcStart.getY()),//左行
新弧到(外弧半径,外弧半径,0,outerarchend.getX(),outerarchend.getY(),false,true),//外弧
new LineTo(innerArcEnd.getX(),innerArcEnd.getY()),//右行
新Ar
import javafx.application.Application;
import javafx.geometry.Point2D;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.ArcTo;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
import javafx.scene.shape.Shape;
import javafx.stage.Stage;

public class ConvinienceMethodsExample extends Application {

    private static final double OUTER_RADIUS =300, INNER_RADIUS = 180, ORIGIN_X = 300, ORIGIN_Y = 300;
    private static final double START_ANGLE =20, END_ANGLE = 70, STEP_ANGEL = 10;

    @Override
    public void start(Stage primaryStage) {

        Group group = new Group();

        for(double angle =  START_ANGLE; angle < END_ANGLE ; angle += STEP_ANGEL ){

            Point2D innerArcStart = getPoint(INNER_RADIUS, angle);
            Point2D innerArcEnd = getPoint(INNER_RADIUS, angle + STEP_ANGEL);
            Point2D outerArcStart = getPoint(OUTER_RADIUS, angle);
            Point2D outerArcEnd = getPoint(OUTER_RADIUS, angle + STEP_ANGEL);
            var path = getPath(innerArcStart, innerArcEnd, outerArcStart, outerArcEnd);
            group.getChildren().add(path);
        }
        primaryStage.setScene(new Scene(new Pane(group)));
        primaryStage.show();
    }

    private Point2D getPoint(double radius, double angle){

        double x = ORIGIN_X - radius * Math.cos(Math.toRadians(angle));
        double y = ORIGIN_Y - radius * Math.sin(Math.toRadians(angle));
        return new Point2D(x, y);
    }

    private Shape getPath(Point2D innerArcStart, Point2D innerArcEnd, Point2D outerArcStart, Point2D outerArcEnd){
        var path = new Path(
                new MoveTo(innerArcStart.getX(), innerArcStart.getY()),
                new LineTo(outerArcStart.getX(), outerArcStart.getY()), //left line
                new ArcTo(OUTER_RADIUS, OUTER_RADIUS, 0, outerArcEnd.getX(), outerArcEnd.getY(), false, true), //outer arc
                new LineTo(innerArcEnd.getX(),innerArcEnd.getY()), //right line
                new ArcTo(INNER_RADIUS, INNER_RADIUS, 0, innerArcStart.getX(), innerArcStart.getY(), false, false)
                );
        path.setFill(Color.color(Math.random(), Math.random(), Math.random()));
        return path;
    }

    public static void main(String args[]){
        launch(args);
    }
}