Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Load packages
- library(Rcpp)
- library(viridis)
- # output parameters
- output_width = 1920 * 4
- output_height = 1080 * 4
- N_points = 50e6
- point_alpha = 0.05 #point transperancy
- # Attractor parameters
- params <- c(1.886,-2.357,-0.328, 0.918)
- # C++ function to rapidly generate points
- cliff_rcpp <- cppFunction(
- "
- NumericMatrix cliff(int nIter, double A, double B, double C, double D) {
- NumericMatrix x(nIter, 2);
- for (int i=1; i < nIter; ++i) {
- x(i,0) = sin(A*x(i-1,1)) + C*cos(A*x(i-1,0));
- x(i,1) = sin(B*x(i-1,0)) + D*cos(B*x(i-1,1));
- }
- return x;
- }"
- )
- # Function for mapping a point to a colour
- map2color <- function(x, pal, limits = NULL) {
- if (is.null(limits))
- limits = range(x)
- pal[findInterval(x,
- seq(limits[1], limits[2], length.out = length(pal) + 1),
- all.inside = TRUE)]
- }
- # Obtain matrix of points
- cliff_points <- cliff_rcpp(N_points, params[1], params[2], params[3], params[4])
- # Calculate angle between successive points
- cliff_angle <- atan2(
- (cliff_points[, 1] - c(cliff_points[-1, 1], 0)),
- (cliff_points[, 2] - c(cliff_points[-1, 2], 0))
- )
- # Obtain colours for points
- available_cols <-
- viridis(
- 1024,
- alpha = point_alpha,
- begin = 0,
- end = 1,
- direction = 1
- )
- cliff_cols <- map2color(
- cliff_angle,
- c(available_cols, rev(available_cols))
- )
- # Output image directly to disk
- jpeg(
- "clifford_attractor.jpg",
- width = output_width,
- height = output_height,
- pointsize = 1,
- bg = "black",
- quality = 100
- )
- plot(
- cliff_points[-1, ],
- bg = "black",
- pch = ".",
- col = cliff_cols
- )
- dev.off()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement