2016-11-27 1 views
0

J'ai deux objets de classe Polygon que je veux unir en utilisant la méthode union() de javafx.scene.shape.Shape et j'ai besoin que la sortie soit également un objet de classe Polygon. J'ai trouvé plusieurs exemples où la sortie est objet Path:Comment unir deux polygones pour que la sortie soit polygone pas path (javafx)?

Path path = Path.union(shape1, shape2) 

Ou est-il possible de convertir le chemin en polygone? J'ai essayé de google mais sans chance.

+0

Pourquoi la sortie doit-elle être un objet de classe Polygon? – Sedrick

+0

@SedrickJefferson Nous avons un programme qui visualise ces polygones sur la scène. Le polygone uni doit être un objet de classe Polygon pour pouvoir interpréter toutes les autres règles et conditions qui ont été définies pour les objets de classe Polygon. – Brita

+0

Je ne pense pas que vous serez capable d'utiliser Path. Je pense qu'ils ont construit Path.union avec l'idée que si vous fusionnez deux formes du même type, le résultat ne sera pas une forme du type original. Exemple Polygon union Polygon! = Polygon. Ceci étant dit. Je pense que vous devriez créer votre propre méthode d'union. Cela prend deux polygones et renvoie un polygone qui correspond à vos idées. – Sedrick

Répondre

0

Lorsque vous prenez l'union de deux polygones alors vous obtenez un objet chemin que vous avez déclaré. Il est possible de convertir cet objet path en un objet Polygon (pas le code le plus agréable mais faisable).

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

Ceci peut ne pas fonctionner si les polygones ne se croisent pas, mais devraient fonctionner autrement. S'il n'y a pas d'intersection, vous aurez deux instructions MoveTo au lieu d'une.

0

Voici de quoi je parle.

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

deux polygones originaux.

enter image description here

Union des deux polygones originaux. L'union des deux polygones ne donne pas dans un polygone.

enter image description here

Union à partir d'une méthode que je crée. Cette méthode utilise les points des deux polygones d'origine et crée un nouveau polygone.

enter image description here