首页 > 编程语言 >Java语言程序设计基础篇_编程练习题**15.17 (几何问题:寻找边界矩形)

Java语言程序设计基础篇_编程练习题**15.17 (几何问题:寻找边界矩形)

时间:2024-07-22 15:24:58浏览次数:12  
标签:练习题 Java Pane double scene pane import Circle 15.17

**15.17 (几何问題:寻找边界矩形)
  • 请编写一个程序,让用户可以在一个二维面板上动态地增加和移除点,如图15-29a所示。当点加入和移除的时候,一个最小的边界矩形更新显示。假设每个点的半径是 10 像素

解题思路:

  • 这道题可以从编程练习题15.15修改
  1. 新建一个面板Pane(),方法外部新建一个私有Circle类型的ArrayList,和一个私有类型的Rectangle()
  2. 编写一个用于绘制矩形的方法,接受面板参数Pane()
  3. 在绘制矩形的方法内找出这些点最大最小的xy值,如果边界矩形已存在,则从pane中移除,如果ArrayList中至少有一个Circle,创建一个新的Rectangle对象,使用计算出的边界值,并将其添加到Pane中。
  4. Rectangle的填充颜色设为透明,这样它只显示边框,而不会覆盖Circle
  5. 在start方法中为面板注册一个事件(鼠标点击:setOnMouseClicked)
  6. 如果鼠标点的是左键:e.getButton() == MouseButton.PRIMARY,则新建一个圆,同时添加到布局和ArrayList中,更新边界矩形。
  7. 如果点的是右键,创建一个迭代器iterator用于遍历存储所有圆圈的ArrayList<Circle>列表,使用contains()方法检查鼠标位置是否在圆圈内, 如果是,那么同时在List和Pane中删除圆圈,更新边界矩形。

 

示例代码:编程练习题15_17BoundaryRectangle.java

package chapter_15;

import java.util.ArrayList;
import java.util.Iterator;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.input.MouseButton;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class 编程练习题15_17BoundaryRectangle extends Application{
	private ArrayList<Circle> list = new ArrayList<>();
	private Rectangle boundaryRectangle;
	@Override
	public void start(Stage primaryStage) throws Exception {
		
		Pane pane = new Pane();
		pane.setOnMouseClicked(e ->{
			double x = e.getX();
			double y = e.getY();
			if(e.getButton() == MouseButton.PRIMARY) {
				Circle circle = new Circle(x,y,10);
				circle.setFill(Color.WHITE);
				circle.setStroke(Color.BLACK);
				pane.getChildren().add(circle);
				list.add(circle);
				BoundaryRectangle(pane);
			}
			 else if (e.getButton() == MouseButton.SECONDARY) {
	                Iterator<Circle> iterator = list.iterator();
	                while (iterator.hasNext()) {
	                    Circle c = iterator.next();
	                    if (c.contains(x, y)) {
	                        pane.getChildren().remove(c);
	                        iterator.remove(); // 使用迭代器的remove方法
	                        BoundaryRectangle(pane);
	                    }
	                }
	            }
		});
		Scene scene = new Scene(pane, 300, 300);
        primaryStage.setTitle("编程练习题15_17BoundaryRectangle");
        primaryStage.setScene(scene);
        primaryStage.show();
	}
	public static void main(String[] args) {
		Application.launch(args);
	}
	private void BoundaryRectangle(Pane pane) {
		double minX = Double.MAX_VALUE;
		double maxX = -Double.MAX_VALUE;
		double minY = Double.MAX_VALUE;
		double maxY = -Double.MAX_VALUE;
		for(Circle c:list) {
			double x = c.getCenterX();
			double y = c.getCenterY();
			double r = c.getRadius();
			minX = Math.min(minX, x-r);
			maxX = Math.max(maxX, x+r);
			minY = Math.min(minY, y-r);
			maxY = Math.max(maxY, y+r);
		}
		if(boundaryRectangle != null) {
			pane.getChildren().remove(boundaryRectangle);
		}
		if(!list.isEmpty()) {
			boundaryRectangle = new Rectangle(minX,minY, maxX-minX, maxY-minY);
			boundaryRectangle.setFill(Color.TRANSPARENT);
			boundaryRectangle.setStroke(Color.BLACK);
			pane.getChildren().add(boundaryRectangle);
		}
	}
}
  • 代码结果 

标签:练习题,Java,Pane,double,scene,pane,import,Circle,15.17
From: https://blog.csdn.net/2301_78998594/article/details/140608601

相关文章

  • 【GeoJSON】Java 使用 GeoTools 将 SHP 文件转成 GeoJSON 文件
    文章目录引言Mavensettings.xml配置配置项目中的pom.xml引入GeoToolsJar包使用引言在使用GeoTools时,我们没办法直接使用Maven中央库的GeoTools,所以就需要我们配置一下关于GeoTools自己的镜像,所以我们才需要以下这几个步骤:1、检查一下自己本机maven的......
  • 科普文:TransmittableThreadLocal通过javaAgent实现线程传递并支持ForkJoin
    概叙TransmittableThreadLocal的介绍,直接看官网:https://github.com/alibaba/transmittable-thread-local目前使用中的稳定发布版本v2.x在 分支2.x上。帮助文档:https://github.com/alibaba/transmittable-thread-local#-%E5%8A%9F%E8%83%BD这篇文章主要介绍了Transmitta......
  • Java计算机毕业设计旅行分享平台(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在数字化时代,旅游行业正经历着前所未有的变革。随着人们生活水平的提高和休闲方式的多样化,旅行已成为现代人追求生活品质、拓宽视野的重要方式之一。......
  • Java计算机毕业设计旅游网站的设计与实现(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网的普及和人们生活水平的提高,旅游已成为现代人休闲娱乐的重要方式之一。然而,面对繁多的旅游信息、复杂的行程规划与预订流程,传统的旅游服务......
  • Java计算机毕业设计健美操社团活动信息管理系统设计与实现(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在当今高校校园文化日益丰富的背景下,健美操社团作为促进学生身心健康、增强团队协作能力的重要平台,其活动组织与管理效率直接影响到社团的活力与影响......
  • Java计算机毕业设计健身场馆预约(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着人们对健康生活的日益重视,健身已成为现代都市人不可或缺的生活方式之一。然而,传统健身场馆在管理和服务上常面临诸多挑战,如会员管理混乱、场地资......
  • 【校招+社招】华为OD机试 - 拼接URL(Java、JavaScript、Python、C、C++)
    鱼弦:公众号【红尘灯塔】,CSDN博客专家、内容合伙人、新星导师、全栈领域优质创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)算法概述URL拼接(URL拼接)是指将多个URL组件(方案、主机、端口、路径、查询参......
  • Java常见的超时及设计
    在Java编程中,处理超时通常涉及到几种不同的场景,包括网络请求超时、线程执行超时、数据库操作超时等。合理设计超时机制可以提高程序的健壮性和用户体验。以下是一些常见超时设计的方法:1.网络请求超时对于HTTP请求或任何网络IO操作,可以使用URLConnection、HttpURLConnection、Ok......
  • 现代Web开发的JavaScript核心概念
    在当今的Web开发中,JavaScript不仅是一种优势,更是必不可少的工具。它不断带来新功能、新术语和新概念,使Web应用程序更加互动、高效和用户友好。无论你是刚刚踏上Web开发之路,还是想提升自己的技能,掌握JavaScript的基本术语都是至关重要的。在这篇综合指南中,我们将探讨每......
  • Java中的代码比较工具
    大家好,我是城南。在如今的编程世界里,代码比较工具已经成为开发者不可或缺的一部分。不论是代码审查、版本控制,还是调试,代码比较工具都能帮助我们高效地进行工作。今天我们就来深入探讨一下Java中的代码比较工具,从它们的功能、特点到使用技巧,全方位了解这些工具如何提升我们......