Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package line;
- import java.awt.Point;
- import java.awt.image.BufferedImage;
- import java.io.File;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Random;
- import javax.imageio.ImageIO;
- import snake.Image;
- public class Lines {
- private final static int NB_LINES = 5000;
- private final static int MIN_LENGTH = 10;
- private final static int MAX_LENGTH = 50;
- public static void main(String[] args) throws IOException {
- BufferedImage src = ImageIO.read(Image.class.getClassLoader().getResourceAsStream("joconde.png"));
- BufferedImage dest = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_INT_RGB);
- int [] bgColor = {0, 0, 0};
- int avgRed = 0, avgGreen = 0, avgBlue = 0, count = 0;
- for (int y = 0; y < src.getHeight(); y++) {
- for (int x = 0; x < src.getWidth(); x++) {
- int colsrc = src.getRGB(x, y);
- avgRed += colsrc & 255;
- avgGreen += (colsrc >> 8) & 255;
- avgBlue += (colsrc >> 16) & 255;
- count++;
- }
- }
- bgColor[0] = avgBlue/count; bgColor[1] = avgGreen/count; bgColor[2] = avgRed/count;
- for (int y = 0; y < src.getHeight(); y++) {
- for (int x = 0; x < src.getWidth(); x++) {
- dest.getRaster().setPixel(x, y, bgColor);
- }
- }
- List<List<Point>> lines = new ArrayList<List<Point>>();
- Random rand = new Random();
- for (int i = 0; i < NB_LINES; i++) {
- int length = rand.nextInt(MAX_LENGTH - MIN_LENGTH) + MIN_LENGTH;
- double ang = rand.nextDouble() * Math.PI;
- int lx = (int)(Math.cos(ang) * length); // can be negative or positive
- int ly = (int)(Math.sin(ang) * length); // positive only
- int sx = rand.nextInt(dest.getWidth() -1 - Math.abs(lx));
- int sy = rand.nextInt(dest.getHeight() - 1- Math.abs(ly));
- List<Point> line;
- if (lx > 0) {
- line = line(sx, sy, sx+lx, sy+ly);
- } else {
- line = line(sx+Math.abs(lx), sy, sx, sy+ly);
- }
- lines.add(line);
- }
- // render the picture
- int [] color = {0, 0, 0};
- for (List<Point> line : lines) {
- avgRed = 0; avgGreen = 0; avgBlue = 0;
- count = 0;
- for (Point p : line) {
- int colsrc = src.getRGB(p.x, p.y);
- avgRed += colsrc & 255;
- avgGreen += (colsrc >> 8) & 255;
- avgBlue += (colsrc >> 16) & 255;
- count++;
- }
- avgRed /= count; avgGreen /= count; avgBlue /= count;
- color[0] = avgBlue; color[1] = avgGreen; color[2] = avgRed;
- for (Point p : line) {
- dest.getRaster().setPixel(p.x, p.y, color);
- }
- }
- ImageIO.write(dest, "png", new File("a0.png"));
- }
- private static List<Point> line(int x0, int y0, int x1, int y1) {
- List<Point> points = new ArrayList<Point>();
- int deltax = x1 - x0;
- int deltay = y1 - y0;
- int tmp;
- double error = 0;
- double deltaerr = 0;
- if (Math.abs(deltax) >= Math.abs(deltay)) {
- if (x0 > x1) { // swap the 2 points
- tmp = x0; x0 = x1; x1 = tmp;
- tmp = y0; y0 = y1; y1 = tmp;
- deltax = - deltax; deltay = -deltay;
- }
- deltaerr = Math.abs (((double)deltay) / deltax);
- int y = y0;
- for (int x = x0; x <= x1; x++) {
- points.add(new Point(x, y));
- error += deltaerr;
- if (error >= 0.5) {
- if (y0 < y1) y++; else y--;
- error -= 1.0;
- }
- }
- } else {
- if (y0 > y1) { // swap the 2 points
- tmp = x0; x0 = x1; x1 = tmp;
- tmp = y0; y0 = y1; y1 = tmp;
- deltax = - deltax; deltay = -deltay;
- }
- deltaerr = Math.abs (((double)deltax) / deltay); // Assume deltay != 0 (line is not horizontal),
- int x = x0;
- for (int y = y0; y <= y1; y++) {
- points.add(new Point(x, y));
- error += deltaerr;
- if (error >= 0.5) {
- if (x0 < x1) x++; else x--;
- error -= 1.0;
- }
- }
- }
- return points;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement