Пиксельное рисование в Java с задержкой - PullRequest
0 голосов
/ 06 ноября 2018

Я пытался нарисовать треугольник Серпинского за пикселем за пикселем, используя Java. И это было успешно. Но теперь я хочу нарисовать каждый пиксель с небольшой задержкой. Я использовал разные типы методов, но они оказались безуспешными.

  • Таймер анимации Javafx
  • Thread.sleep (100)

Это мой Main.class

import java.util.Random;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.stage.Stage;

public class Main extends Application {

    private Point[] triangle;
    private static int points = 1000000;
    private static Point midPoint;

    private int width = 600, height = 600;

    @Override
    public void start(Stage primaryStage) {

        Canvas canvas = new Canvas(width,height);
        GraphicsContext gc = canvas.getGraphicsContext2D();

        Scene scene = new Scene(new Group(canvas));
        primaryStage.setScene(scene);
        primaryStage.show();

        Random ran = new Random();
        triangle = new Point[3];
        triangle[1] = new Point(0d, 0d);
        triangle[0] = new Point(width/2d, (double)height);
        triangle[2] = new Point((double)width, 0d);
        midPoint = Point.findMidTo(triangle[0], triangle[1], triangle[2]);
        while(points-- > 0){
                int r = ran.nextInt(3);
                midPoint = midPoint.findMidTo(triangle[r]);
                gc.fillOval(midPoint.getX(), midPoint.getY(),1,1);
                /*
                    Need a delay for each iteration  (Problem !!!!!!!!!!)
                */
        }
    }

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

И это Point.class , в котором хранятся координаты x и y и некоторые полезные функции клавиш для пикселя

class Point {

    private double x, y; 

    public Point(double x, double y) { 
        this.x = x;
        this.y = y;
    }

    public double getX() { return this.x; } 
    public double getY() { return this.y; } 

    // bunch of overloaded functions 
    public Point findMidTo(Point p) { 
    return new Point((this.getX() + p.getX())/2, (this.getY() + p.getY())/2);
    }

    public Point findMidTo(Point p1, Point p2) { 
    return new Point((this.getX() + p1.getX() + p2.getX())/3, 
             (this.getY() + p1.getY() + p2.getY())/3 ); 
    }

    public static Point findMidTo(Point p1, Point p2, Point p3) {
        return new Point((p1.getX() + p2.getX() + p3.getX())/3,
             (p1.getY() + p2.getY() + p3.getY())/3 ); 
    }
}

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Используется поток, это лучший вариант, чтобы отложить некоторые задачи в Java-программе

0 голосов
/ 06 ноября 2018

Мне действительно нравится ответ @ bakcsa83, но я бы использовал Timeline. Это дает вам больше встроенного контроля над тем, как быстро вы хотите, чтобы точки заполнялись.

import java.util.Random;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Main extends Application
{

    Timeline timer;

    private Point[] triangle;
    private static int points = 1000000;
    private static Point midPoint;

    private int width = 600, height = 600;

    @Override
    public void start(Stage primaryStage)
    {
        Canvas canvas = new Canvas(width, height);
        GraphicsContext gc = canvas.getGraphicsContext2D();

        Scene scene = new Scene(new Group(canvas));
        primaryStage.setScene(scene);
        primaryStage.show();

        Random ran = new Random();
        triangle = new Point[3];
        triangle[1] = new Point(0d, 0d);
        triangle[0] = new Point(width / 2d, (double) height);
        triangle[2] = new Point((double) width, 0d);
        midPoint = Point.findMidTo(triangle[0], triangle[1], triangle[2]);

        timer = new Timeline(new KeyFrame(Duration.millis(.1), (ActionEvent event) -> {
            if (points-- > 0) {
                int r = ran.nextInt(3);
                midPoint = midPoint.findMidTo(triangle[r]);
                gc.fillOval(midPoint.getX(), midPoint.getY(), 1, 1);
            }
            else {
                System.out.println("Stopping!");
                timer.stop();
            }
        }));
        timer.setCycleCount(Timeline.INDEFINITE);
        timer.play();

    }

    public static void main(String[] args)
    {
        launch(args);
    }
}
0 голосов
/ 06 ноября 2018

Таймер анимации работает.

Главная

import java.util.Random;

import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.stage.Stage;

public class Main extends Application{
    private Point[] triangle;
    private static int points = 1000000;
    private static Point midPoint;

    private int width = 600, height = 600;

    @Override
    public void start(Stage primaryStage) {

        Canvas canvas = new Canvas(width,height);
        GraphicsContext gc = canvas.getGraphicsContext2D();

        Scene scene = new Scene(new Group(canvas));
        primaryStage.setScene(scene);
        primaryStage.show();

        Random ran = new Random();
        triangle = new Point[3];
        triangle[1] = new Point(0d, 0d);
        triangle[0] = new Point(width/2d, (double)height);
        triangle[2] = new Point((double)width, 0d);
        midPoint = Point.findMidTo(triangle[0], triangle[1], triangle[2]);


        AnimationTimer timer = new AnimationTimer(){
            @Override
            public void handle(long now){
                if(points-- > 0) {
                    int r = ran.nextInt(3);
                    midPoint = midPoint.findMidTo(triangle[r]);
                    gc.fillOval(midPoint.getX(), midPoint.getY(),1,1);
                }
            }
        };
        timer.start();

    }

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