Poniżej znajduje się przykład użycia klasy PixelWriter na JavaFX canvas, użytej do zapisania obrazu na Canvas.
Klasa Listing25_61
Ściągnij klasę Listing25_61
package rozdzial25c; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.image.PixelWriter; import javafx.scene.image.WritableImage; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class Listing25_61 extends Application { private static final int w = 560; private static final double min = -2.0; private static final double max = 2.0; private static final double scale = (max - min) / w; private static final double s = 2.0; public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { try { WritableImage image = new WritableImage(w, w); PixelWriter pw = image.getPixelWriter(); for (int i = 0; i < w; i++) { for (int j = 0; j < w; j++) { double zr = min + j * scale; double zi = min + i * scale; int licz = liczIter(zr, zi); int a = 255; int r = licz << 7; int g = licz << 5; int b = licz << 6; pw.setArgb(j, i, ARGBtoInt(a, r, g, b)); } } Canvas canvas = new Canvas(w,w); GraphicsContext gc = canvas.getGraphicsContext2D(); gc.drawImage(image, 0,0); StackPane root = new StackPane(); root.getChildren().addAll(canvas); Scene scene = new Scene(root); stage.setScene(scene); stage.show(); } catch (Exception e) { e.printStackTrace(); } } static int ARGBtoInt(int a, int r, int g, int b) { return (a << 24) | (r << 16) | (g << 8) | b; } private int liczIter(double zre, double zim) { double kwad = 0; int licznik = 0; int liczbaIteracji = 512; while ((kwad < s * s) && (licznik < liczbaIteracji)) { double re = -0.6; double temp = zre * zre - zim * zim + re; double im = 0.4; zim = s * zre * zim + im; zre = temp; kwad = zim * zim + zre * zre; licznik++; } return liczbaIteracji - licznik; } }
Wynik
Po uruchomieniu na konsoli otrzymujemy (Rys. 1):