java - जांच कैसे करें कि आयताकार नोड विंडो में है या नहीं



javafx (1)

यदि एक आयत दूसरे से बाहर है तो इसका मतलब दो चीजें हैं:

  • वे छेद नहीं करते हैं
  • बड़ा एक पूरी तरह से छोटे एक को शामिल नहीं करता है

तो आपकी पद्धति अगले रास्ते देख सकती है:

private boolean inTheWindow(Rectangle rect) {
    return rect.getBoundsInParent().intersects(root.getLayoutBounds()) 
        || root.getLayoutBounds().contains(rect.getBoundsInParent());
}

प्रदर्शित करने के लिए यहां MCVE है:

public class FXBounds extends Application {

    private Pane root;

    @Override
    public void start(Stage primaryStage) {

        root = new Pane();

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

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

        check(1,1,50,50, true);
        check(100,100,50,50, true);
        check(-5,-5,30,30, true);
        check(-50,0,30,30, false);
    }

    private void check(int x, int y, int width, int height, boolean in) {
        Rectangle rect = new Rectangle(x, y, width, height);
        root.getChildren().add(rect);
        System.out.println(in == inTheWindow(rect));
    }

    private boolean inTheWindow(Rectangle rect) {
        return rect.getBoundsInParent().intersects(root.getLayoutBounds()) || root.getLayoutBounds().contains(rect.getBoundsInParent());
    }
}

अब तक मैंने एक जावाएक्सएक्स एप्लिकेशन को कोडित किया है जिसमें कुछ आयताकार चारों ओर घूमते हैं। अब मैं यह जांचने के लिए एक विधि बनाना चाहता हूं कि क्या विंडो में एक आयत अभी भी दिखाई दे रहा है या पहले से ही इसे बाहर निकाल दिया गया है या नहीं। मेरा कोड ऐसा दिखता है:

import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.geometry.Point2D;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class Test extends Application {
    private Pane root = new Pane();
    private Rectangle rect = new Rectangle(150,150,15,15);
    private Point2D velocity = new Point2D(2,1);

    private Pane createContent(){
        root.setPrefSize(500,500);
        root.getChildren().add(rect);

        AnimationTimer timer = new AnimationTimer() {
            @Override
            public void handle(long now) {
                update();
            }
        };
        timer.start();

        return root;
    }

    private void update(){
        if (outOfWindow(rect)) {
            System.out.println("out of window...\n");

        }else {
            System.out.println("in window...\n");
        }

        rect.setTranslateX(rect.getTranslateX() + velocity.getX());
        rect.setTranslateY(rect.getTranslateY() + velocity.getY());
    }

    private boolean outOfWindow(Node node) {
        if (node.getBoundsInParent().intersects(node.getBoundsInParent().getWidth(), node.getBoundsInParent().getHeight(),
            root.getPrefWidth() - node.getBoundsInParent().getWidth() * 2,
            root.getPrefHeight() - node.getBoundsInParent().getHeight() * 2)){
            return false;
        }
        return true;
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setScene(new Scene(createContent()));
        primaryStage.show();
    }

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

outOfWindow() विधि यह देखने की मेरी कोशिश है कि क्या आयत की स्थिति अभी भी खिड़की में है। यह काम करता हैं। लेकिन क्या कोई बेहतर तरीका है या यह पता लगाने का एक तरीका है कि किनारे की सीमा को किनारों से पार कर गया?





javafx