Java语言程序设计基础篇_编程练习题**16.9 (几何:两个矩形相交吗?)

目录

题目:**16.9 (几何:两个矩形相交吗?)

习题思路

代码示例

 结果展示


题目:**16.9 (几何:两个矩形相交吗?)

    编写一个程序,让用户指定两个矩形的位置和大小,并且显示两个矩形是否相交,如图16-39b所示。用户可以通过鼠标单击矩形内部区域并且拖动矩形。矩形被拖动时,文本域中的矩形中心坐标被更新。

  • 习题思路
  1. 创建一个总VBox,以后的所有布局都添加到这个VBox中
  2. 创建一个HBox(放置文本),新建一个Text放置在布局中
  3. 创建一个Pane(放置矩形),新建两个矩形Rectangle并添加到Pane中
  4. 创建一个HBox(放置两个矩形的信息设置),再分别创建两个VBox,用TextField与Label交替的方式设置组件(x、y、width、height),最后将两个小VHox放在HBox中
  5. 创建一个HBox(放置绘制按钮),新建一个Button放置在布局中
  6. 依次把 2、3、4 、5的布局添加到VBox中
  7. 为两个矩形设置拖动事件(将鼠标的位置设置为矩形的位置),为TextField设置键盘事件(当按下Enter键时把相应的参数改为输入框里的值),为Button注册事件(将所有节点的参数设置为默认值),在每个事件中调用判断两个矩形是否重叠的方法
  8. (判断两个矩形是否重叠的方法) 如果 (x1 < x4 && x2 > x3) && (y1 < y4 && y2 > y3) 为true,两个矩形重叠,否则不重叠,(x1,y1和x2,y2是第一个矩形左上角和右下角的坐标,x3,y3和x4,y4是第二个矩形左上角和右下角的坐标)
  9. 根据是否重叠重新设置text的内容
  • 代码示例

 编程练习题16_9DoTwoRectangleIntersect.java

package chapter_16;

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

public class 编程练习题16_9DoTwoRectangleIntersect extends Application{
	Text text = new Text("");
	@Override
	public void start(Stage primaryStage) throws Exception {
		//总布局
		VBox vBox = new VBox();
		
		HBox textBox = new HBox();
		textBox.getChildren().add(text);
		textBox.setAlignment(Pos.CENTER);
		textBox.setPadding(new Insets(10, 10, 10, 10));
		
		Pane pane = new Pane();
		Rectangle r1 = new Rectangle(100, 100, 20, 30);
		Rectangle r2 = new Rectangle(200, 100, 20, 30);
		r1.setFill(Color.TRANSPARENT);
		r2.setFill(Color.TRANSPARENT);
		r1.setStroke(Color.BLACK);
		r2.setStroke(Color.BLACK);
		
		
		pane.getChildren().addAll(r1, r2);
		
		HBox settingInfo = new HBox();//
		settingInfo.setPadding(new Insets(10, 10, 10, 10));
		settingInfo.setSpacing(20);
		VBox vBox1 = new VBox();
		
		Label lbInfo = new Label("Enter Rectangle info:");
		TextField tfX = new TextField("100");
		tfX.setPrefWidth(50);
		Label lbX = new Label("X",tfX);
		lbX.setContentDisplay(ContentDisplay.RIGHT);
		
		TextField tfY = new TextField("100");
		Label lbY = new Label("Y",tfY);
		tfY.setPrefWidth(50);
		lbY.setContentDisplay(ContentDisplay.RIGHT);
		
		TextField tfW = new TextField("20");
		Label lbW = new Label("Width",tfW);
		tfW.setPrefWidth(50);
		lbW.setContentDisplay(ContentDisplay.RIGHT);
		
		TextField tfH = new TextField("20");
		Label lbH = new Label("Height",tfH);
		tfH.setPrefWidth(50);
		lbH.setContentDisplay(ContentDisplay.RIGHT);
		
		vBox1.getChildren().addAll(lbInfo,lbX,tfX, lbY,tfY, lbW,tfW,lbH,tfH);
		vBox1.setAlignment(Pos.CENTER_LEFT);
		vBox1.setPadding(new Insets(5, 5, 5, 5));
		vBox1.setStyle("-fx-border-Color:black");
		
		VBox vBox2 = new VBox();
		
		Label lbInfo2 = new Label("Enter rectangle info:");
		TextField tfX2 = new TextField("200");
		tfX2.setPrefWidth(50);
		Label lbX2 = new Label("X",tfX2);
		lbX2.setContentDisplay(ContentDisplay.RIGHT);
		
		TextField tfY2 = new TextField("100");
		tfY2.setPrefWidth(50);
		Label lbY2 = new Label("Y",tfY2);
		lbY2.setContentDisplay(ContentDisplay.RIGHT);
		
		TextField tfW2 = new TextField("20");
		Label lbW2 = new Label("Width",tfW2);
		tfW2.setPrefWidth(50);
		lbW2.setContentDisplay(ContentDisplay.RIGHT);
		
		TextField tfH2 = new TextField("20");
		Label lbH2 = new Label("Height",tfH2);
		tfH2.setPrefWidth(50);
		lbH2.setContentDisplay(ContentDisplay.RIGHT);
		
		vBox2.getChildren().addAll(lbInfo2,lbX2,tfX2, lbY2,tfY2, lbW2,tfW2,tfH2,lbH2);
		vBox2.setAlignment(Pos.CENTER_RIGHT);
		vBox2.setPadding(new Insets(5, 5, 5, 5));
		vBox2.setStyle("-fx-border-Color:black");
		
		settingInfo.getChildren().addAll(vBox1,vBox2);
		
		HBox drawBox = new HBox();
		Button btDraw = new Button("Redraw Circles");
		drawBox.getChildren().add(btDraw);
		drawBox.setAlignment(Pos.CENTER);
		
		vBox.getChildren().addAll(textBox, pane, settingInfo,drawBox);
		DoesIntersect(r1, r2);

		r1.setOnMouseDragged(e ->{
			r1.setX(e.getX());
			r1.setY(e.getY());
			tfX.setText(e.getX()+"");
			tfY.setText(e.getY()+"");
			DoesIntersect(r1, r2);
		});
		r2.setOnMouseDragged(e ->{
			r2.setX(e.getX());
			r2.setY(e.getY());
			tfX2.setText(e.getX()+"");
			tfY2.setText(e.getY()+"");
			DoesIntersect(r1, r2);
		});
		
		tfX.setOnKeyPressed(e ->{
			if(e.getCode() == KeyCode.ENTER&&tfX.getText()!="") {
				r1.setX(Double.parseDouble(tfX.getText()));
				DoesIntersect(r1, r2);
			}
		});
		tfY.setOnKeyPressed(e ->{
			if(e.getCode() == KeyCode.ENTER&&tfY.getText()!="") {
				r1.setY(Double.parseDouble(tfY.getText()));
				DoesIntersect(r1, r2);
			}
		});
		tfW.setOnKeyPressed(e ->{
			if(e.getCode() == KeyCode.ENTER&&tfW.getText()!="") {
				r1.setWidth(Double.parseDouble(tfW.getText()));
				DoesIntersect(r1, r2);
			}
		});
		tfH.setOnKeyPressed(e ->{
			if(e.getCode() == KeyCode.ENTER&&tfH.getText()!="") {
				r1.setHeight(Double.parseDouble(tfH.getText()));
				DoesIntersect(r1, r2);
			}
		});
		tfX2.setOnKeyPressed(e ->{
			if(e.getCode() == KeyCode.ENTER&&tfX2.getText()!="") {
				r2.setX(Double.parseDouble(tfX2.getText()));
				DoesIntersect(r1, r2);
			}
		});
		tfY2.setOnKeyPressed(e ->{
			if(e.getCode() == KeyCode.ENTER&&tfY2.getText()!="") {
				r2.setY(Double.parseDouble(tfY2.getText()));
				DoesIntersect(r1, r2);
			}
		});
		tfW2.setOnKeyPressed(e ->{
			if(e.getCode() == KeyCode.ENTER&&tfW2.getText()!="") {
				r2.setWidth(Double.parseDouble(tfW2.getText()));
				DoesIntersect(r1, r2);
			}
		});
		tfH2.setOnKeyPressed(e ->{
			if(e.getCode() == KeyCode.ENTER&&tfH2.getText()!="") {
				r2.setHeight(Double.parseDouble(tfH2.getText()));
				DoesIntersect(r1, r2);
			}
		});
		
		btDraw.setOnAction(e ->{
			r1.setX(100);
			r1.setY(100);
			r1.setWidth(20);
			r1.setHeight(30);
			r2.setX(200);
			r2.setY(100);
			r2.setWidth(20);
			r2.setHeight(30);
			tfX.setText("100");
			tfY.setText("100");
			tfW.setText("20");
			tfH.setText("30");
			tfX2.setText("200");
			tfY2.setText("100");
			tfW2.setText("20");
			tfH2.setText("30");
			DoesIntersect(r1, r2);
		});
		
		Scene scene = new Scene(vBox,280, 350);
		primaryStage.setTitle("编程练习题16_9DoTwoRectangleIntersect");
		primaryStage.setScene(scene);
		primaryStage.show();
	}
	public static void main(String[] args) {
		Application.launch(args);
	}
	public void DoesIntersect(Rectangle r1, Rectangle r2) {
		double x1 = r1.getX();
		double y1 = r1.getY();
		double w1 = r1.getWidth();
		double h1 = r1.getHeight();
		double x2 = r1.getX()+w1;
		double y2 = r1.getY()+h1;
		
		double x3 = r2.getX();
		double y3 = r2.getY();
		double w2 = r1.getWidth();
		double h2 = r1.getHeight();
		double x4 = r2.getX()+w2;
		double y4 = r2.getY()+h2;
		
		if((x1 < x4 && x2 > x3) && (y1 < y4 && y2 > y3)) {
			text.setText("Two circles intersect? Yes");
		}else {
			text.setText("Two circles intersect? No");
		}
	}
}
  •  结果展示

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值