Java语言程序设计基础篇_编程练习题**18.27 (科赫雪花分形)

目录

题目:**18.27 (科赫雪花分形)

代码示例 

 输出结果


题目:**18.27 (科赫雪花分形)

本章给出了思瑞平斯基三角形分形。本练习要编写一个程序,显示另一个称为科赫雪花(Koch snowflake)的分形,这是根据一位著名的瑞典数学家的名字命名的。

  • 科赫雪花按如下方式产生:
  1. 从一个等边三角形开始,将其作为0阶(或0级)科赫分形,如图18-14a所示。
  2. 三角形中的每条边分成三个相等的线段,以中间的线段作为底边向外画一个等边三角形,产生1阶科赫分形,如图18-14b所示。
  3. 重复步骤2产生2阶科赫分形,3阶科赫分形,···,如图18-14c-d所示
  • 代码示例 

编程练习题18_27KochSnowflakeFractal.java 

package chapter_18;

import java.util.ArrayList;

import javafx.application.Application;
import javafx.geometry.Point2D;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.ContentDisplay;
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.shape.Line;
import javafx.stage.Stage;

public class 编程练习题18_27KochSnowflakeFractal extends Application{
	private double WIDTH = 400;
	private double HEIGHT = 400;
	private TextField tfOrder;
	private Pane trianglePane = new Pane();
	
	
	@Override
	public void start(Stage primaryStage) throws Exception {
		tfOrder = new TextField();
		Label lbOrder = new Label("Enter an order: ",tfOrder);
		lbOrder.setContentDisplay(ContentDisplay.RIGHT);
		HBox hBox = new HBox(lbOrder);
		hBox.setAlignment(Pos.CENTER);
		drawBaseTriangle(0);
		tfOrder.setOnKeyPressed(e ->{
			if(!tfOrder.getText().isEmpty()) {
				trianglePane.getChildren().clear();
				drawBaseTriangle(Integer.valueOf(tfOrder.getText()));
			}
		});
		BorderPane borderPane = new BorderPane();
		borderPane.setCenter(trianglePane);
		borderPane.setBottom(hBox);
		
		Scene scene = new Scene(borderPane,WIDTH,HEIGHT+20);
		primaryStage.setTitle("编程练习题18_27KochSnowflakeFractal");
		primaryStage.setScene(scene);
		primaryStage.show();
	}
	private void drawBaseTriangle(int order) {
		 double length = HEIGHT - 100;
	        Line l1 = new Line(WIDTH / 2, 0, (WIDTH / 2) + length * Math.cos(1 * (Math.PI * 2 / 6)),
	                0 + length * Math.sin(1 * (Math.PI * 2 / 6)));
	        Line l2 = new Line(l1.getEndX(), l1.getEndY(), l1.getEndX() - length, l1.getEndY());
	        Line l3 = new Line(l2.getEndX(), l2.getEndY(), l1.getStartX(), l1.getStartY());
	        trianglePane.getChildren().addAll(l1, l2, l3);
	        if (order > 0) {
	            draw(order);
	        }
	}
	public void draw(int order) {
		if(order == 0)
			return;
		
		ArrayList<Line> lines = new ArrayList<Line>();
		for(Node node:trianglePane.getChildren()) {
			if(node instanceof Line) {
				lines.add((Line)node);
			}
		}
		for(Line l:lines) {
			drawFractalTriangle(l);
			/*double x1 = l.getStartX();
			double y1 = l.getStartY();
			double x2 = l.getEndX();
			double y2 = l.getEndY();
			drawFractalTriangle(x1,y1,x2,y2, order);;*/
		}
		draw(order-1);
	}
	public void drawFractalTriangle(Line line) {  
		double DIST = getLength(line) / 3;
        double dy = (line.getStartY() - line.getEndY());
        double dx = (line.getEndX() - line.getStartX());
        double th = Math.atan2(dy, dx);

        double x1 = line.getStartX() + DIST * Math.cos(th);
        double y1 = line.getStartY() - DIST * Math.sin(th);

        double x2 = line.getEndX() + DIST * Math.cos(th + Math.toRadians(180));
        double y2 = line.getEndY() - DIST * Math.sin(th + Math.toRadians(180));

        double x3 = x2 + DIST * Math.cos(th + Math.toRadians(120));
        double y3 = y2 - DIST * Math.sin(th + Math.toRadians(120));

        Line l1 = new Line(line.getStartX(), line.getStartY(), x1, y1);
        Line l2 = new Line(x2, y2, line.getEndX(), line.getEndY());
        Line l3 = new Line(l1.getEndX(), l1.getEndY(), x3, y3);
        Line l4 = new Line(l3.getEndX(), l3.getEndY(), x2, y2);

        trianglePane.getChildren().remove(line);
        trianglePane.getChildren().addAll(l1, l2, l3, l4);
	}
	 private double getLength(Line line) {
	        return Math.sqrt(Math.pow(line.getEndX() - line.getStartX(), 2) + Math.pow(line.getEndY() - line.getStartY(),
	                2));
	    }
	public static void main(String[] args) {
		Application.launch(args);
	}
}
  •  输出结果

以下是Python绘制分形图的基础方法,包括曼德勃罗集、分形树叶、科赫曲线、分形龙、谢尔宾斯基三角等。 1. 曼德勃罗集 曼德勃罗集是一种非常著名的分形图形,可以用Python来绘制。代码如下: ```python import numpy as np import matplotlib.pyplot as plt def mandelbrot(c, max_iters=100): z = c n = 0 while abs(z) <= 2 and n < max_iters: z = z*z + c n += 1 if n == max_iters: return 0 else: return n def mandelbrot_set(xmin, xmax, ymin, ymax, width, height, max_iters=100): r1 = np.linspace(xmin, xmax, width) r2 = np.linspace(ymin, ymax, height) return np.array([[mandelbrot(complex(r, i), max_iters) for r in r1] for i in r2]) plt.imshow(mandelbrot_set(-2.0, 0.5, -1.25, 1.25, 1000, 1000, 100), cmap='hot') plt.axis('off') plt.show() ``` 2. 分形树叶 分形树叶是一种美丽的分形图形,可以用Python来绘制。代码如下: ```python import turtle def draw_branch(branch_len, pensize): if branch_len > 5: turtle.forward(branch_len) turtle.right(20) turtle.pensize(pensize - 1) draw_branch(branch_len - 15, pensize - 1) turtle.left(40) draw_branch(branch_len - 15, pensize - 1) turtle.right(20) turtle.backward(branch_len) turtle.speed('fastest') turtle.left(90) turtle.penup() turtle.backward(200) turtle.pendown() turtle.pensize(10) turtle.color('brown') draw_branch(100, 10) turtle.done() ``` 3. 科赫曲线 科赫曲线是一种经典的分形图形,可以用Python来绘制。代码如下: ```python import turtle def koch_curve(length, depth): if depth == 0: turtle.forward(length) return length = length / 3 koch_curve(length, depth - 1) turtle.left(60) koch_curve(length, depth - 1) turtle.right(120) koch_curve(length, depth - 1) turtle.left(60) koch_curve(length, depth - 1) turtle.penup() turtle.goto(-300, -100) turtle.pendown() turtle.color('blue') turtle.pensize(2) koch_curve(600, 4) turtle.done() ``` 4. 分形分形龙是一种神奇的分形图形,可以用Python来绘制。代码如下: ```python import turtle def dragon_curve(length, depth, sign=1): if depth == 0: turtle.forward(length) return turtle.right(45 * sign) dragon_curve(length / (2 ** 0.5), depth - 1, 1) turtle.left(90 * sign) dragon_curve(length / (2 ** 0.5), depth - 1, -1) turtle.right(45 * sign) turtle.penup() turtle.goto(-200, -200) turtle.pendown() turtle.color('green') turtle.pensize(2) dragon_curve(400, 12) turtle.done() ``` 5. 谢尔宾斯基三角 谢尔宾斯基三角是一种经典的分形图形,可以用Python来绘制。代码如下: ```python import turtle def sierpinski_triangle(length, depth): if depth == 0: for i in range(3): turtle.forward(length) turtle.left(120) return sierpinski_triangle(length / 2, depth - 1) turtle.forward(length / 2) sierpinski_triangle(length / 2, depth - 1) turtle.backward(length / 2) turtle.left(60) turtle.forward(length / 2) turtle.right(60) sierpinski_triangle(length / 2, depth - 1) turtle.left(60) turtle.backward(length / 2) turtle.right(60) turtle.penup() turtle.goto(-200, -200) turtle.pendown() turtle.color('orange') turtle.pensize(2) sierpinski_triangle(400, 5) turtle.done() ``` 以上是Python绘制分形图的基础方法,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值