JavaFX Intersect Problem mit Shapes

Janeirio

Mitglied
Hallo,
Ich möchte mithilfe der Intersect Methode eine Linie in ein Polygon einzeichnen dabei ergibt sich bei mir ein Problem welches ich am besten mal mit dem folgendem Bild darstelle...

path.JPG

Java:
package application;

import java.util.ArrayList;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Line;
import javafx.scene.shape.Shape;

public class Triangulation {
 
    private ArrayList<Point> points;
    private Shape poly;
 
    private Pane drawPane;
 
    public Triangulation(ArrayList<Point> points, Shape poly, Pane DrawPane){
        this.drawPane = DrawPane;
        this.poly = poly;
        this.points = points;
    }
 
    public void triangulate(){
     
        Line line = new Line();
        line.setStartX(points.get(0).getXPos());
        line.setStartY(points.get(0).getYPos());
        line.setEndX(points.get(3).getXPos());
        line.setEndY(points.get(3).getYPos());
     
        Shape path = Shape.intersect(poly, line);
     
     
        drawPane.getChildren().add(path);
    }
 
}

die Linie hat auf jeden Fall die richtigen Koordinaten
ich verstehe nicht ganz wie dieses Problem zustande kommt...
Ich hoffe mir kann da jemand helfen.

LG Martin
 
Gut das du ein Bild angehängt hast, aber trotzdem wäre es hilfreich wenn du noch das Problem beschreibst 😉
Nur anhand des Bildes wird mir nicht klar was das Problem sein soll.
 
Gut das du ein Bild angehängt hast, aber trotzdem wäre es hilfreich wenn du noch das Problem beschreibst 😉
Nur anhand des Bildes wird mir nicht klar was das Problem sein soll.
Ich vermute, dass die Linie nicht komplett von einem Eckpunkt zum anderen gezeichnet wird.

Mhhh, @Janeirio bist du sicher, dass das Shape poly tatsächlich durch die Punkte in der ArrayList beschrieben wird?
Könntest du vielleicht ein kurzes Programm bauen, welches uns den Code ausführen lässt?
 
Ja das Problem ist das die Linie nicht durchgezeichnet wird...
und Ja das Polygon wird ganz sicher durch die Punkte im Array beschrieben :/

Java:
import java.util.ArrayList;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Line;
import javafx.scene.shape.Shape;

public class Triangulation {
   
    private ArrayList<Point> points;
    private MyPolygon poly;
   
    private Pane drawPane;
   
    public Triangulation(ArrayList<Point> points, MyPolygon poly, Pane DrawPane){
        this.drawPane = DrawPane;
        this.poly = poly;
        this.points = points;
    }
   
    public void triangulate(){
       
        Line line = new Line();
        line.setStartX(poly.getPointArray().get(0).getXPos());
        line.setStartY(poly.getPointArray().get(0).getYPos());
        line.setEndX(poly.getPointArray().get(3).getXPos());
        line.setEndY(poly.getPointArray().get(3).getYPos());
       
        Shape path = Shape.intersect(poly, line);
       
       
        drawPane.getChildren().add(path);
    }
   
}

habe das nochmal etwas umgebaut um es zu verdeutlichen. andere Punkte enthält das Polygon nicht...

wenn ich
Java:
drawPane.getChildren().add(path);
mit
Java:
drawPane.getChildren().add(line);
austausche zieht er die Linie ja auch durch aber dieser Ansatz ist in meinem Fall eben nicht ausreichend da ich ja auch stellen aus dem Polygon ausschneiden muss.
 
Zuletzt bearbeitet:
ja ich werde mal eine simple Anwendung schreiben und hoffen, dass ich das so selber reproduzieren kann.
Ich melde mich wenn ich das fertig habe.
 
Also ich habe das ganze nun mal sehr stark gekürzt und so funktioniert es einwandfrei... ich scheine wirklich irgendwo einen Fehler mit den Punkten oder den Arrays gemacht zu haben. Da bleibt mir wohl nichts anderes übrig als meinen gesamten Code auf den Kopf zu stellen.

Klasse : Main
Java:
package application;
   
import java.util.ArrayList;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Line;
import javafx.scene.shape.Path;
import javafx.stage.Stage;

public class Main extends Application {
   
    private Pane pane;
    private boolean isClosed;
    private ArrayList<Point> points;
   
    public static void main(String[] args) {
        launch(args);
    }
   
    @Override
    public void start(Stage primaryStage) {
        try {
            pane = new Pane();
            Scene scene = new Scene(pane);
            points = new ArrayList<Point>();
           
            pane.setPrefSize(800, 800);
           
            primaryStage.setScene(scene);
            primaryStage.show();
           
            isClosed = false;
           
            addListener();
           
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
   
    private void addListener(){
        pane.setOnMouseClicked(new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent e) {
                if(e.getButton().name() == "PRIMARY" && isClosed == false){
                    System.out.println("point added");
                    points.add(new Point(e.getX(),e.getY()));
                }else{
                    System.out.println("is Closed");
                   
                    if(!isClosed){
                        buildPolygon();
                    }
                   
                    isClosed = true;
                }
            }
        });
    }
   
    private void buildPolygon(){
        MyPolygon poly = new MyPolygon(points);
        pane.getChildren().add(poly);
       
        //Intersect Line
        Line line = new Line();
       
        line.setStartX(points.get(0).getXPos());
        line.setStartY(points.get(0).getYPos());
        line.setEndX(points.get(2).getXPos());
        line.setEndY(points.get(2).getYPos());
       
        Path path = (Path) Path.intersect(poly, line);
       
        pane.getChildren().add(path);
    }
}

Klasse : Point
Java:
package application;

public class Point {

    private double xPos;
    private double yPos;
   
    public Point(double xPos, double yPos){
        this.xPos = xPos;
        this.yPos = yPos;
    }
   
    public double getXPos(){
        return xPos;
    }
   
    public double getYPos(){
        return yPos;
    }
   
    public void setXPos(double xPos){
        this.xPos = xPos;
    }
   
    public void setYPos(double yPos){
        this.yPos = yPos;
    }
}

Klasse : MyPolygon
Java:
package application;

import java.util.ArrayList;

import javafx.scene.paint.Color;
import javafx.scene.shape.Polygon;

public class MyPolygon extends Polygon {

    private ArrayList<Point> points;
   
    public MyPolygon(ArrayList<Point> points){
        this.points = points;
        this.setFill(Color.BLUE);
        this.setOpacity(0.3);
        buildPolygon();
    }
   
    private void buildPolygon(){
        ArrayList<Double> pointsDouble = new ArrayList<Double>();
       
        for (Point point : points) {
            pointsDouble.add(point.getXPos());
            pointsDouble.add(point.getYPos());
        }
       
        this.getPoints().addAll(pointsDouble);
    }
}

falls ihr den Code dennoch braucht und etwas testen wollt... vielleicht habt ihr ja eine Ahnung wie man das reproduzieren kann, würde mir schon deutlich weiter helfen. Ansonsten sag ich euch woran es lag sobald ich es herausgefunden habe.
 
Also ich habe das ganze nun mal sehr stark gekürzt und so funktioniert es einwandfrei... ich scheine wirklich irgendwo einen Fehler mit den Punkten oder den Arrays gemacht zu haben. Da bleibt mir wohl nichts anderes übrig als meinen gesamten Code auf den Kopf zu stellen.
Das ist manchmal auch eine Art Probleme beim Softwareentwickeln zu lösen. Problem isolieren und dann Schritt für Schritt wieder einbauen, damit man merkt bei welchem Schritt etwas nicht funktioniert, wie man das eigentlich gedacht hat.

Es hätte gereicht ... für das Beispiel feste Werte für das Polygon zu nehmen. Der MouseListener war zunächst auch verwirrend, aber okay... das Problem konnte ja eh nicht reproduziert werden ..
Einen Point in Dimension 2 bietet JavaFX schon hier an: https://docs.oracle.com/javase/8/javafx/api/javafx/geometry/Point2D.html (Dann braucht man keine eigenen Klasse mehr...)
 
Also ich habe das Problem inzwischen gefunden aber nicht ganz verstanden warum es zustande kommt...
wenn ich die Intersect Methode ausführe während ich dem Pane das Polygon als Children hinzugefügt habe kommt es zu dem Problem. tue ich dies erst nachdem ich die Intersect Methode ausgeführt habe tritt das Problem nicht auf.
 

Zurück
Oben