Итак, я попытался создать формы кардиоидного типа с чистой анимацией, используя JavaFX. Вот мой код:
public class Main extends Application {
ArrayList<Circle> circles = new ArrayList<>();
ArrayList<Line> lines = new ArrayList<>();
Group g;
int counter = 0;
int factor = 1;
int total = 100;
int j = 0;
static AnimationTimer draw;
static AnimationTimer deleteLines;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
g = new Group();
Scene s = new Scene(g, 600, 600);
s.setFill(Color.BLACK);
primaryStage.setScene(s);
primaryStage.show();
Circle c = new Circle(300, 300,300);
c.setFill(Color.BLACK);
c.setStroke(Color.BLACK);
drawCircle(g);
g.getChildren().addAll(c);
draw = new AnimationTimer(){
@Override
public void handle(long now) {
if(counter == total){
total++;
counter = 0;
deleteLines.start();
lines.clear();
g.getChildren().removeAll(circles);
circles.clear();
factor++;
drawCircle(g);
} else {
drawLines(g);
counter++;
}
}
};
deleteLines = new AnimationTimer() {
@Override
public void handle(long now) {
if (j < lines.size()){
draw.stop();
g.getChildren().removeIf(node -> node == lines.get(j));
j++;
} else {
j = 0;
this.stop();
draw.start();
}
}
};
draw.start();
}
private void drawLines(Group g) {
for (int i = 0; i < total; i++) {
Line l = new Line(circles.get(counter % total).getCenterX(), circles.get(counter % total).getCenterY(), circles.get(counter * factor % total).getCenterX(), circles.get(counter * factor % total).getCenterY());
l.setStroke(Color.PURPLE);
g.getChildren().add(l);
lines.add(l);
}
}
private void drawCircle(Group g) {
for (int i = 0; i < total; i++) {
Circle dot = new Circle(Math.cos(2*Math.PI/ total * i + Math.PI / 2)* 300 + 300,Math.sin(2*Math.PI/ total * i + Math.PI / 2 )* 300 + 300, 5);
dot.setFill(Color.PURPLE);
circles.add(dot);
}
g.getChildren().addAll(circles);
}
}
Моя цель состояла в том, чтобы отобразить все строки по одной, а затем удалить их один за другим (я сделал это с помощью
g.getChildren().removeAll(lines);
, но это не то что я хочу). Итак, вот моя проблема:
deleteLines = new AnimationTimer() {
@Override
public void handle(long now) {
if (j < lines.size()){
draw.stop();
g.getChildren().removeIf(node -> node == lines.get(j));
j++;
} else {
j = 0;
this.stop();
draw.start();
}
}
};
В этой части
g.getChildren().removeIf(node -> node == lines.get(j));
работает. Он удаляет только из root не на экране, и я хочу знать, почему.