JavaFX-是否可以将一个形状划分为两个或多个形状?
例如,我有这个 我想把它分成5个部分(和划分比萨饼完全一样) 这可以通过使用 然而,这样它看起来像5个对象,但实际上它仍然是1个对象 有没有可能把这个对象分成5个,这样我就不必一个接一个地创建它们了 多谢各位 更新: 当然,当我修改start方法时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
@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);
}
}