绘制矩形时,为什么坐标x = y + y * 3 + y的坐标与x = y * 4不同?

时间:2016-09-20 18:46:01

标签: java recursion

对于作业,我的任务是创建一个递归方法,以便创建一个Sierpinski地毯。对于我的代码,我的一个计算没有给出正确的输出,所以我不得不将我的公式换成另一个应该给出相同结果但却没有。这是实际工作的代码。

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
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.layout.VBox;
import javafx.scene.shape.Line;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class HW2 extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        BorderPane pane = new BorderPane();
        Button enter = new Button("Display");
        Label number = new Label("Enter in Order:");
        TextField input = new TextField();
        HBox v = new HBox();
        HBox h = new HBox();
        Pane p = new Pane();
        h.getChildren().addAll(number, input, enter);
        h.setSpacing(10);
        pane.setBottom(h);
        // pane.setCenter(v);
        pane.setCenter(p);
        h.setAlignment(Pos.CENTER);
        v.setAlignment(Pos.CENTER);
        Scene scene = new Scene(pane, 900, 900);
        primaryStage.setTitle("Square Fractal");
        primaryStage.setScene(scene);
        primaryStage.show();
        enter.setOnAction(e -> {
            points(Integer.parseInt(input.getText()), p);
        });

    }

    public static void main(String[] args) {
        launch(args);
    }

    public static void points(int x, Pane p) {
        p.getChildren().clear();
            draw(200, 350, 350, p, x);
    }

    public static void draw(double size, double a, double b, Pane p) {
        Rectangle r = new Rectangle(a,b,size,size);
        p.getChildren().add(r);
    }

    public static void draw(double size, double a, double b, Pane p, double amt) {
        if (amt == 0) {
            draw(size, a, b, p);
        } else {
            draw(size, a, b, p);
            double size2 = size / 3;
            double a1, a2, a3, b1, b2, b3;
            a1 = a - 3 * size2 + size2;
            a2 = a + 3 * size2 + size2;
            a3 = a + size2;
            b1 = b + 3 * size2 + size2;
            b2 = b - 3 * size2 +  size2;
            b3 = b + size2;


            draw(size2, a1, b1, p, amt - 1);
            draw(size2, a1, b2, p, amt - 1);
            draw(size2, a2, b1, p, amt - 1);
            draw(size2, a2, b2, p, amt - 1);
            draw(size2, a1, b3, p, amt - 1);
            draw(size2, a2, b3, p, amt - 1);
            draw(size2, a3, b1, p, amt - 1);
            draw(size2, a3, b2, p, amt - 1);
        }
    }

}

代码块

 double size2 = size / 3;
    double a1, a2, a3, b1, b2, b3;
    a1 = a - 3 * size2 + size2;
    a2 = a + 3 * size2 + size2;
    a3 = a + size2;
    b1 = b + 3 * size2 + size2;
    b2 = b - 3 * size2 +  size2;
    b3 = b + size2;

如果我用

替换它
double size2 = size / 3;
double a1, a2, a3, b1, b2, b3;
a1 = a - 4 * size2;
a2 = a + 4 * size2;
a3 = a + size2;
b1 = b + 4 * size2;
b2 = b - 4 * size2;
b3 = b + size2;

矩形位置都不合适。

4 * size2与3 * size2 + size2有什么区别,为什么前者不起作用?

2 个答案:

答案 0 :(得分:0)

让我们看看这两行:

a1 = a - 3 * size2 + size2; // original
a1 = a - 4 * size2;  // replaced

那么,第一个会发生什么?您从a中减去3 * size2,然后添加size2。

第二个需要a并从中减去4 * size2

第一行几乎从a减去2倍size2,而第二行减去4次size2。

答案 1 :(得分:0)

数学上,(x = y + 3y + y)!=(x = 4y)。你问题中的第一个方程是简单的(x = 5y),当y = 0时,它只等于(x = 4y)。

真的,这里的问题是操作顺序。工作代码被解释为((a - (3 * size2))+ size2)。您的修订版被解释为(a - (4 * size2)),这两个将永远不会相等。