JavaFX Application Circle intersect detection

Description

JavaFX Application Circle intersect detection

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.geometry.Pos;
import javafx.scene.paint.Color;

public class Main extends Application {
   protected TextField tfCircle1CenterX = new TextField();
   protected TextField tfCircle1CenterY = new TextField();
   protected TextField tfCircle1Radius = new TextField();
   protected TextField tfCircle2CenterX = new TextField();
   protected TextField tfCircle2CenterY = new TextField();
   protected TextField tfCircle2Radius = new TextField();
   protected Circle circle1 = getCircle(52.0, 60.0, 30);
   protected Circle circle2 = getCircle(180.0, 56.0, 40);
   protected Rectangle rectangle = getRectangle();
   protected Pane circlesPane = new Pane(rectangle, circle1, circle2);

   @Override//from  ww w.j  a  v a  2  s  .  co m
   public void start(Stage primaryStage) {
      setTextProperties();

      // Create table for circle1 
      VBox paneForTable1 = getTable(tfCircle1CenterX, 
         tfCircle1CenterY, tfCircle1Radius, 1);
      
      // Create table for circle2 
      VBox paneForTable2 = getTable(tfCircle2CenterX, 
         tfCircle2CenterY, tfCircle2Radius, 2);
      
      // Place tables in a hbox
      HBox paneForTables = new HBox(5);
      paneForTables.setAlignment(Pos.CENTER);
      paneForTables.getChildren().addAll(paneForTable1, paneForTable2);

      // Create a button
      Button btRedrawCircles = new Button("Redraw Circles");

      // Create a vbox
      VBox pane = new VBox();
      pane.setAlignment(Pos.CENTER);
      pane.getChildren().addAll(intersect(), circlesPane, 
         paneForTables, btRedrawCircles);

      // Create and register the handlers
      // Invoke redraw and set for intersect
      btRedrawCircles.setOnAction(e -> {
         redraw();
         pane.getChildren().remove(0);
         pane.getChildren().add(0, intersect());
      });

      // Drag circle1 using mouse and test for intesect
      circle1.setOnMouseDragged(e -> {
         if (circle1.contains(e.getX(), e.getY())) {
            circle1.setCenterX(e.getX());
            circle1.setCenterY(e.getY());
            tfCircle1CenterX.setText(String.valueOf(e.getX()));
            tfCircle1CenterY.setText(String.valueOf(e.getY()));
         }
         pane.getChildren().remove(0);
         pane.getChildren().add(0, intersect());
      });

      // Drag circle2 using mouse and test for intesect
      circle2.setOnMouseDragged(e -> {
         if (circle2.contains(e.getX(), e.getY())) {
            circle2.setCenterX(e.getX());
            circle2.setCenterY(e.getY());
            tfCircle2CenterX.setText(String.valueOf(e.getX()));
            tfCircle2CenterY.setText(String.valueOf(e.getY()));
         }
         pane.getChildren().remove(0);
         pane.getChildren().add(0, intersect());
      });

      // Create a scene and place it in the stage
      Scene scene = new Scene(pane);
      primaryStage.setTitle("java2s.com");
      primaryStage.setScene(scene);
      primaryStage.show();

      // Create two listeners
      // Set a new width for rectangle
      pane.widthProperty().addListener(ov ->
         rectangle.widthProperty().bind(pane.widthProperty())
      );

      // Set a new height for rectangle
      pane.heightProperty().addListener(ov ->
         rectangle.heightProperty().bind(pane.heightProperty().multiply(0.5))
      );
   }

   /** Creates a text stating if circles intersect */
   private Text intersect() {
      return new Text("Two circles intersect? " +
         (isIntersect() ? "Yes" : "No"));
   }

   /** Returns true if circles inIntersect */
   private boolean isIntersect() {
      return Math.sqrt(Math.pow(circle1.getCenterX() - circle2.getCenterX(), 2) + 
             Math.pow(circle1.getCenterY() - circle2.getCenterY(), 2)) 
             <= circle1.getRadius() + circle2.getRadius();
   }

   /** Retrun a circle */
   private Circle getCircle(double x, double y, double r) {
      Circle circle = new Circle(x, y, r);
      circle.setFill(Color.WHITE);
      circle.setStroke(Color.BLACK);
      return circle;
   }

   /** Return a table */
   protected VBox getTable(
      TextField centerX, TextField centerY, TextField r, int n) {
      VBox vBox = new VBox(2);
      vBox.setStyle("-fx-border-color: Black");
      vBox.getChildren().addAll(new Label("Enter circle " + 
         n + " info:"), getGrid(centerX, centerY, r));
      return vBox;
   }

   /** Return a grid pane of circle info */
   protected GridPane getGrid(
      TextField centerX, TextField centerY, TextField r) {
      GridPane gridPane = new GridPane();
      gridPane.setHgap(5);
      gridPane.setVgap(2);
      gridPane.add(new Label("Center x:"), 0, 0);
      gridPane.add(centerX, 1, 0);
      gridPane.add(new Label("Center y:"), 0, 1);
      gridPane.add(centerY, 1, 1);
      gridPane.add(new Label("Radius:"), 0, 2);
      gridPane.add(r, 1, 2);
      return  gridPane;
   }

   /** Set text field properties */
   protected void setTextProperties() {
      tfCircle1CenterX.setPrefColumnCount(3);
      tfCircle1CenterY.setPrefColumnCount(3);
      tfCircle1Radius.setPrefColumnCount(3);
      tfCircle2CenterX.setPrefColumnCount(3);
      tfCircle2CenterY.setPrefColumnCount(3);
      tfCircle2Radius.setPrefColumnCount(3);
      tfCircle1CenterX.setText(String.valueOf(circle1.getCenterX()));
      tfCircle1CenterY.setText(String.valueOf(circle1.getCenterY()));
      tfCircle1Radius.setText(String.valueOf(circle1.getRadius()));
      tfCircle2CenterX.setText(String.valueOf(circle2.getCenterX()));
      tfCircle2CenterY.setText(String.valueOf(circle2.getCenterY()));
      tfCircle2Radius.setText(String.valueOf(circle2.getRadius()));
   }

   /** Redraw circles using table information */
   private void redraw() {
      if (Double.parseDouble(tfCircle1CenterX.getText()) 
         != circle1.getCenterX()) {
         circle1.setCenterX(
            Double.parseDouble(tfCircle1CenterX.getText()));
      }
      if (Double.parseDouble(tfCircle1CenterY.getText()) 
         != circle1.getCenterY()) {
         circle1.setCenterY(
            Double.parseDouble(tfCircle1CenterY.getText()));
      }
      if (Double.parseDouble(tfCircle2CenterX.getText()) 
         != circle2.getCenterX()) {
         circle2.setCenterX(
            Double.parseDouble(tfCircle2CenterX.getText()));
      }
      if (Double.parseDouble(tfCircle2CenterY.getText()) 
         != circle2.getCenterY()) {
         circle2.setCenterY(
            Double.parseDouble(tfCircle2CenterY.getText()));
      }
      if (Double.parseDouble(tfCircle1Radius.getText()) 
         != circle1.getRadius()) {
         circle1.setRadius(
            Double.parseDouble(tfCircle1Radius.getText()));
      }
      if (Double.parseDouble(tfCircle2Radius.getText()) 
         != circle2.getRadius()) {
         circle2.setRadius(
            Double.parseDouble(tfCircle2Radius.getText()));
      }
   }

   /** Return a rectangle */
   private Rectangle getRectangle() {
      Rectangle r = new Rectangle(0, 0, 250, 110);
      r.setStroke(Color.WHITE);
      r.setFill(Color.WHITE);
      return r;
   }
}



PreviousNext

Related