Java program to generate Sierpinski Triangle (Fractal) of specified resolution using AND algorithm, even in high resolutions – tested for 32768x32768px with increased Java VM heap size – -Xmx8g option.

Note that size of image must be the power of 2, for example 1024.
Main.java
import javax.imageio.ImageIO; import java.io.File; // 2018 TheFlyingKeyboard and released under MIT License // theflyingkeyboard.net public class Main { public static void main(String[] args) { SierpinskiTriangle sierpinskiTriangle = new SierpinskiTriangle(); try { ImageIO.write(sierpinskiTriangle.generate(1024), "png", new File("SierpinskiTriangle.png")); } catch (Exception e) { e.printStackTrace(); } } }
SierpinskiTriangle.java
import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.DataBufferInt; // 2018 TheFlyingKeyboard and released under MIT License // theflyingkeyboard.net public class SierpinskiTriangle { private final int foregroundColor; private final int backgroundColor; public SierpinskiTriangle(){ this.foregroundColor = Color.BLACK.getRGB(); this.backgroundColor = Color.WHITE.getRGB(); } public SierpinskiTriangle(final Color foregroundColor, final Color backgroundColor){ this.foregroundColor = foregroundColor.getRGB(); this.backgroundColor = backgroundColor.getRGB(); } public BufferedImage generate(final int triangleSize){ BufferedImage bufferedImage = new BufferedImage(triangleSize, triangleSize, BufferedImage.TYPE_INT_RGB); int[] imagePixelData = ((DataBufferInt) bufferedImage.getRaster().getDataBuffer()).getData(); double counter = 0; for(int x = 0; x < triangleSize; ++x){ for(int y = 0; y < triangleSize; ++y){ if((x & y) == 0){ imagePixelData[y * triangleSize + x] = foregroundColor; }else{ imagePixelData[y * triangleSize + x] = backgroundColor; } ++counter; } System.out.println((counter / (triangleSize * triangleSize)) * 100.0f + "%"); } return bufferedImage; } }