0

我需要使用 JavaFX 绘制一个甜甜圈形状GraphicsContext- 一个中心有一个洞的实心圆圈,以澄清。

我一直在搜索,我在网上找不到任何例子。

我认为您会使用该fillarc功能,但我不明白。我找不到任何示例,文档也没有太大帮助。(什么是arcExtent?所有文档都说这是弧的范围......)

我不想填充两个重叠的圆圈,因为我想在绘图时保持中心透明。(我下面已经画了东西,不能干涉)

4

1 回答 1

3

这里有几个示例解决方案,一个使用圆的形状减法,另一个使用Arc。这两个示例都使用场景图进行绘制。

样本

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

public class DonutHole extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        // donut by shape subtraction.
        Circle whole = new Circle(20, 20, 20);
        Circle inside = new Circle(20, 20, 10);
        Shape donutShape = Shape.subtract(whole, inside);
        donutShape.setFill(Color.BLUE);

        // donut by arc.
        Arc donutArc = new Arc(60, 20, 10, 10, 0, 360);
        donutArc.setStrokeWidth(10);
        donutArc.setStrokeType(StrokeType.OUTSIDE);
        donutArc.setStroke(Color.RED);
        donutArc.setStrokeLineCap(StrokeLineCap.BUTT);
        donutArc.setFill(null);

        Scene scene = new Scene(new Group(donutShape, donutArc), Color.PALEGREEN);
        stage.setScene(scene);
        stage.show();
    }

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

另一种解决方案也可以使用带有弧段和线段的路径,但我没有在这里展示。如果你想要一个 3D 甜甜圈,你可以创建一个Torus


这是另一个在 GraphicsContext 中使用 fillArc 的示例。

充满

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

public class DonutHoleGraphics extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        Canvas canvas = new Canvas(40, 40);

        GraphicsContext gc = canvas.getGraphicsContext2D();
        gc.setLineWidth(10);
        gc.setStroke(Color.YELLOW);
        gc.setLineCap(StrokeLineCap.BUTT);
        gc.strokeArc(5, 5, 30, 30, 0, 360, ArcType.OPEN);

        Scene scene = new Scene(new Group(canvas), Color.PALEGREEN);
        stage.setScene(scene);
        stage.show();
    }

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

有关的:

于 2017-07-28T21:23:38.577 回答