JavaFX - рисовать пончик

Мне нужно нарисовать форму пончика, используя JavaFX GraphicsContext - заполненный круг с отверстием в центре, чтобы уточнить.

Я искал, и я не могу найти примеры в Интернете.

Я думаю, что вы использовали бы fillarc функционировать, но я этого не понимаю. Нет примеров, которые я мог бы найти, и документы не сильно помогают. (Что такое arcExtent? Все документы говорят, что это степень дуги...)

Я не хочу заполнять два перекрывающихся круга, потому что я хочу держать центр прозрачным во время рисования. (Я уже нарисовал вещи внизу, я не могу вмешиваться в это)

1 ответ

Решение

Вот несколько примеров решений: одно использует вычитание формы для кругов, другое использует дугу. Оба примера используют граф сцены для рисования.

образец

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.


Вот еще один пример, который использует fillArc в GraphicsContext.

заполнить

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);
    }
}

Связанные с:

Другие вопросы по тегам