【问题标题】:How to skip specific cycle loops?如何跳过特定的循环循环?
【发布时间】:2021-01-23 22:39:50
【问题描述】:

我想创建这样的形状。

只需画一个Circle,然后画Lines

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

public class SkipPartsOfCycle extends Application {

    @Override
    public void start(Stage stage) {
        var pane = new Pane();
        pane.getChildren().add(new Circle(500, 500, 100, Color.GREEN));
        drawLine(pane, 0, 20, 5);
        drawLine(pane, 70, 110, 5);
        drawLine(pane, 160, 200, 5);
        drawLine(pane, 250, 290, 5);
        drawLine(pane, 340, 360, 5);
        stage.setScene(new Scene(pane, 1000, 1000));
        stage.show();
    }

    public static void drawLine (Pane pane, int start, int end, int increment) {
        for (var i = start; i <= end; i += increment) {
            pane.getChildren().add(new Line(500,500, 500 + (100 * Math.sin(Math.toRadians(i))), 500 + (100 * Math.cos(Math.toRadians(i)))));
        }
    }

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

此代码有效。问题是要跳过循环的特定部分,我会在特定范围内多次调用它。另一种解决方案是将条件插入循环中,但这会不必要地复杂。

最大的问题是,由于我调用了好几次,当改变时(例如0-30,60-120,150-210,240-300,330-360)需要修改所有的方法调用,而不是一个。

请问有更简单的解决方案吗?

【问题讨论】:

  • “继续”关键字是你的朋友。
  • 通过有关 Java 语言基础的教程来学习如何编写条件代码以及如何适当地重构东西 - 这里没有什么特别的 fx

标签: java for-loop javafx cycle


【解决方案1】:

只要循环的步长在 0、90、180 和 270 度角之前或之后的 20 度以内,您就可以将问题归结为画线,因此一些分支逻辑应该可以让您一次绘制图形.

事实上,就开销而言,创建一个方法并调用它五次并不是什么大问题,更不用说使您的代码更加灵活,因此您的解决方案实际上还不错。

for (var i = 0; i <= 360; i += 5) {
            if((i <= 20) || 
              (i >= 70 && i <= 110) ||
              (i >= 160 && i <= 200) ||
              (i >= 250 && i <= 290)
              (i >= 340))
            {
                pane.getChildren().add(new Line(500,500, 500 + (100 * Math.sin(Math.toRadians(i))), 500 + (100 * Math.cos(Math.toRadians(i)))));
            }
        }

【讨论】:

  • 对不起,我拼错了问题,没有说出主要内容。这种方式可以用,但是我马上拒绝了,因为结果是要评估几百个条件。但是,我忘了说,在更改时(例如0-30,60-120,150-210,240-300,330-360),需要修改所有方法调用。这就是主要问题。
  • 分解它:创建一个以 m 间隔绘制 n 行的类/方法,然后保留一些 n/m 对的列表并遍历它以向类/方法发送消息
  • @MichalRama “修改所有方法调用”是什么意思?您的意思是您希望一种方法能够使用相同的参数来响应不断变化的条件?
  • @MarsAtomic 当然,这不会自行改变。我要做的就是让值易于更改。
  • @MichelRama 我明白了。如何将绘图循环打包到一个方法中,并为锚定绘图的“基本角度”添加参数,以及在基本角度之前的偏移量和在基本角度之后的偏移量,以及您调用五次的方法中的其他参数。基本角度 arg 将是 90,offset1 是 20,offset2 是 20,您可以修改我的分支逻辑以使用 args 而不是硬编码的幻数。让我知道这是否清楚。如果没有,我可以编辑代码。
猜你喜欢
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 2014-11-09
  • 1970-01-01
相关资源
最近更新 更多