У меня есть два объекта класса Polygon, которые я хочу объединить с помощью метода union () из javafx.scene.shape.Shape, и мне нужно, чтобы результат также был объектом класса Polygon. Я нашел несколько примеров, где на выходе получается объект Path:

Path path = Path.union(shape1, shape2)

Или возможно преобразовать путь в многоугольник? Я пытался погуглить, но безуспешно.

0
Brita 27 Ноя 2016 в 18:58

2 ответа

Лучший ответ

Когда вы берете объединение двух полигонов, вы получаете объект Path, как вы заявили. Можно преобразовать этот объект пути в объект Polygon (не самый приятный код, но выполнимый).

//createing both polygon objects p1 and p2
Polygon p1 = new Polygon();
p1.getPoints().addAll(new Double[]{
            0.0, 0.0,
            20.0, 10.0,
            10.0, 20.0 });

Polygon p2 = new Polygon();
p2.getPoints().addAll(new Double[]{
            10.0, 0.0,
            25.0, 10.0,
            5.0, 20.0 });

// Taking the union that results in a Path object
Path p3 = (Path) Polygon.union(p1, p2);

// Array of points for the new polygon
Double[] points = new Double[(p3.getElements().size() - 1)*2];

int i = 0;
// going through all the path elements in the path and adding the x and y coordinates to points
for(PathElement el : p3.getElements()){
    if(el instanceof MoveTo){
        MoveTo mt = (MoveTo) el;
        points[i] = mt.getX();
        points[i+1] = mt.getY();
    }
    if(el instanceof LineTo){
        LineTo lt = (LineTo) el;
        points[i] = lt.getX();
        points[i+1] = lt.getY();
    }
    i += 2;
}

// creating new Polygon with these points
Polygon newPolygon = new Polygon();
newPolygon.getPoints().addAll(points);

Это может не работать, если многоугольники не пересекаются, но должно работать в противном случае. Если пересечения нет, у вас будет два оператора MoveTo вместо одного.

0
Kristiina 29 Ноя 2016 в 11:39

Вот о чем я говорю.

import java.util.ArrayList;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Polygon;
import javafx.scene.shape.Shape;
import javafx.stage.Stage;



public class JavaFXApplication31 extends Application {

    @Override
    public void start(Stage primaryStage) {

        Polygon p1 = new Polygon();
        p1.getPoints().addAll(new Double[]{
            60.0, 60.0,
            80.0, 70.0,
            70.0, 80.0 });

        Polygon p2 = new Polygon();
        p2.getPoints().addAll(new Double[]{
            40.0, 40.0,
            60.0, 50.0,
            50.0, 60.0 });        

        AnchorPane root = new AnchorPane();


        Button btn = new Button();
        btn.setText("Click me!'");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                System.out.println("Polygon unioned!");
                Shape union = Polygon.union(p1, p2);
                union.setFill(Color.BLUE);
                root.getChildren().add(union);
            }
        });

        Button btn2 = new Button();
        btn2.setText("New Polygon union!'");
        btn2.setLayoutX(100);
        btn2.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                Polygon p3 = createNewPolygonUnion(p1, p2);
                p3.setFill(Color.RED);
                root.getChildren().add(p3);
            }
        });

        root.getChildren().addAll(p1, p2, btn, btn2);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }


    Polygon createNewPolygonUnion(Polygon one, Polygon two)
    {
        Polygon p3 = new Polygon();

        ArrayList<Double> onePoints = new ArrayList();
        ArrayList<Double> twoPoints = new ArrayList();
        ArrayList<Double> threePoints = new ArrayList();

        for(int i = 0; i < one.getPoints().size(); i++)
        {
            onePoints.add(one.getPoints().get(i));   
            twoPoints.add(two.getPoints().get(i));            
        }

        for(int i = 0; i < onePoints.size(); i++)
        {
            threePoints.add(onePoints.get(i) + twoPoints.get(i));
        }

        p3.getPoints().addAll(threePoints);

        return p3;
    }
}

Исходные два полигона.

enter image description here

Объединение двух исходных полигонов. Объединение двух полигонов не дает многоугольника.

enter image description here

Союз из созданного мной метода. Этот метод использует точки из двух исходных многоугольников и создает новый многоугольник.

enter image description here

0
Sedrick 28 Ноя 2016 в 21:17