Java语言程序设计基础篇_编程练习题18.36 (思瑞平斯基三角形)

目录

题目:18.36 (思瑞平斯基三角形)

代码示例 

代码逻辑

1. 应用程序入口

2. GUI设置

3. 事件处理

4. 绘制逻辑

5. 递归绘制

输出结果 


题目:18.36 (思瑞平斯基三角形)

  编写一个程序,让用户输入一个阶数,然后显示填充的思瑞平斯基三角形,如图18-18所示。

  • 代码示例 

 对原来的代码注释掉第66行即可,在order为0时不填充(默认填充黑色) 

编程练习题18_36SierpinskiTriangle.java

package chapter_18;

import javafx.application.Application;
import javafx.geometry.Point2D;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.scene.shape.Polygon;
import javafx.stage.Stage;

public class 编程练习题18_36SierpinskiTriangle extends Application{
	@Override
	public void start(Stage primaryStage) throws Exception {
		SierpinskiTrianglePane trianglePane = new SierpinskiTrianglePane();
		TextField tfOrder = new TextField();
		tfOrder.setOnAction(e ->trianglePane.setOrder(Integer.parseInt(tfOrder.getText())));
		tfOrder.setPrefColumnCount(4);
		tfOrder.setAlignment(Pos.BOTTOM_RIGHT);
		
		HBox hBox = new HBox(10);
		hBox.getChildren().addAll(new Label("Enter an order: "),tfOrder);
		hBox.setAlignment(Pos.CENTER);
		
		BorderPane borderPane = new BorderPane();
		borderPane.setCenter(trianglePane);
		borderPane.setBottom(hBox);
		
		Scene scene = new Scene(borderPane, 200, 210);
		primaryStage.setTitle("程序清单18_9SierpinskiTriangle");
		primaryStage.setScene(scene);
		primaryStage.show();
	}
	static class SierpinskiTrianglePane extends Pane{
		private int order = 0;
		
		public void setOrder(int order) {
			this.order = order;
			paint();
		}
		SierpinskiTrianglePane(){
		}
		protected void paint() {
			Point2D p1 = new Point2D(getWidth()/2, 10);
			Point2D p2 = new Point2D(10, getHeight() - 10);
			Point2D p3 = new Point2D(getWidth()-10, getHeight() -10);
			this.getChildren().clear();
			displayTriangles(order,p1,p2,p3);
		}
		private void displayTriangles(int order,Point2D p1,
				Point2D p2,Point2D p3) {
			if(order < 0) {
				System.out.println("Order must be non-negative");
				return;
			}
			if(order == 0){
				Polygon triangle = new Polygon();
				triangle.getPoints().addAll(p1.getX(),p1.getY()
						,p2.getX(),p2.getY(),p3.getX(),p3.getY());
				triangle.setStroke(Color.BLACK);
				//triangle.setFill(Color.WHITE);//注释掉这一行即可
				this.getChildren().add(triangle);
			}else {
				Point2D p12 = p1.midpoint(p2);
				Point2D p23 = p2.midpoint(p3);
				Point2D p31 = p3.midpoint(p1);
				
				displayTriangles(order-1, p1, p12, p31);
				displayTriangles(order-1, p12, p2, p23);
				displayTriangles(order-1, p31, p23, p3);
			}
			
		}
	}
	public static void main(String[] args) {
		Application.launch(args);
	}
}

  • 代码逻辑

1. 应用程序入口
  • 编程练习题18_36SierpinskiTriangle类继承自Application,是JavaFX应用程序的入口。
  • start(Stage primaryStage)方法是JavaFX应用程序的启动方法,它负责设置和显示图形用户界面(GUI)。
2. GUI设置
  • 创建一个SierpinskiTrianglePane实例(一个自定义的Pane),用于绘制谢尔宾斯基三角形。
  • 创建一个TextField,允许用户输入分形的迭代次数(order)。
  • 创建一个Label,用于指示用户输入的内容。
  • LabelTextField添加到HBox中,并将HBox设置为BorderPane的底部区域。
  • SierpinskiTrianglePane设置为BorderPane的中心区域。
  • 创建一个Scene,包含BorderPane,并将其设置为Stage的场景。
  • 显示Stage,即显示整个窗口。
3. 事件处理
  • 当用户在TextField中输入一个值并按下回车键(或触发其他动作)时,setOnAction事件处理器被调用。
  • 事件处理器从TextField中获取文本,尝试将其转换为整数,并调用SierpinskiTrianglePanesetOrder方法。
4. 绘制逻辑
  • SierpinskiTrianglePane类中的setOrder方法更新迭代次数(order),并调用paint方法重新绘制图形。
  • paint方法首先计算三个顶点的位置(基于Pane的宽度和高度),然后清除现有的子节点,并调用displayTriangles方法进行递归绘制。
  • displayTriangles方法是一个递归函数,它根据当前的order值决定是绘制一个基本的等边三角形(当order为0时),还是递归地在三个更小的三角形中绘制谢尔宾斯基三角形(当order大于0时)。
    • 如果order为0,则创建一个Polygon对象,将其顶点设置为计算出的三个点,并添加到Pane的子节点中。
    • 如果order大于0,则计算三个新顶点的中点(这些中点是原三角形各边中点),并递归地在这些中点形成的三个子三角形中调用displayTriangles方法。
5. 递归绘制
  • 递归调用displayTriangles时,order值每次减少1,直到order为0,此时开始绘制基本三角形。
  • 通过递归地移除每个三角形的中心部分,最终形成了谢尔宾斯基三角形的图案。

  • 输出结果 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值