123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- /*
- * Copyright (C) 2015 iZc
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- package de.nplusc.izc.logblockheatmapper;
- import ar.com.hjg.pngj.ImageInfo;
- import ar.com.hjg.pngj.ImageLineHelper;
- import ar.com.hjg.pngj.ImageLineInt;
- import ar.com.hjg.pngj.PngWriter;
- import java.awt.*;
- import java.awt.geom.Point2D;
- import java.awt.image.BufferedImage;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.FileReader;
- import javax.imageio.ImageIO;
- /**
- *
- * @author iZc <nplusc.de>
- */
- public class LogBlockHeatmapper
- {
- //x y
- static int[ ][ ] dataField ;
- static int max=0;
- static int maxx = 0;
- static int maxy=0;
- static int targetBlockID=-1;
- static boolean removalsOnly=false;
- static boolean placemode = false;
- static BufferedImage gradient = new BufferedImage(1024,1,BufferedImage.TYPE_4BYTE_ABGR);
- /**
- * @param args the command line arguments
- * @throws java.lang.Exception
- */
- public static void main(String[] args)throws Exception
- {
- if(args.length<2)
- {
- throw new UnsupportedOperationException("not enough parameters");
- }
- if(args.length>2)
- {
- if(args[2].equals("place"))
- {
- placemode=true;
- }
- else
- {
- targetBlockID = Integer.valueOf(args[2]);
- if(args.length>3)
- {
- removalsOnly = Boolean.valueOf(args[3]);
- }
- }
- }
- int size = Integer.valueOf(args[1]);
- Point2D start = new Point2D.Float(0, 0);
- Point2D end = new Point2D.Float(1023, 0);
- Color[] colors = {Color.blue, Color.green, Color.YELLOW, Color.RED};
- float[] steps = {0.0f,0.2f,0.6f,1.0f};
- Paint p = new LinearGradientPaint(start,end,steps,colors);
- Graphics2D lw = (Graphics2D) gradient.getGraphics();
- lw.setPaint(p);
- lw.fillRect(0, 0, 1023, 1);
- ImageIO.write(gradient,"png",new File("Debug.png"));
-
- System.out.println("Initializing Datastructures, this may take a while....");
- dataField = new int[size][size];
- BufferedReader br = new BufferedReader(new FileReader(args[0]));
- br.lines().forEach((xx)->
- {
-
- //4 als 5 und nen bisschen arithmetik gibt seitwärts-schnittansicht
- //id_0 oldblox_1 newblox_2 newdv_3 X_4 height_5 y_6
- //10 5 0 0 -1373 27 4008
- xx = xx.replace("\"", "");
- xx = xx.replace(",", "\t");
- String[] xes = xx.split("\\t");
- int l = Integer.parseInt(xes[0]);
- boolean register=false;
- int f = 0;//Integer.parseInt(xes[1]);
- int t = 1;//Integer.parseInt(xes[2]);
- if((targetBlockID<0||targetBlockID==f||targetBlockID==t))
- {
- register=true;
- }
- if(removalsOnly&&t==targetBlockID)
- {
- register=false;
- }
- int x= Integer.parseInt(xes[4])+size/2,y= Integer.parseInt(xes[6])+size/2;
- //-y=up
- if(x<size&&x>=0&&y<size&&y>=0&®ister)
- {
- //minecraftlogik.....
- dataField[y][x]+=1;
- if(dataField[y][x]>max)
- {
- max=dataField[y][x];
- maxx= Integer.parseInt(xes[4]);
- maxy = Integer.parseInt(xes[6]);
- }
- }
- if(l%10000==0)
- {
- System.out.print(l+"changes so far\r");
- }
-
-
- });
- System.out.print("Database crunched to 100%\n maximum changes on coordinates were:" +max + "at x:"+maxx + " y:"+maxy +"\n");
- //max=Math.min(max, 1000);
- //int steps=max/256;
- //BufferedWriter bw = new BufferedWriter(new FileWriter(new File("D:/emc2/arca_slash/database/crunched.pgm")));
- //bw.write("P6");
- //bw.newLine();
- //bw.write("20000 20000");
- //bw.newLine();
- //bw.write("255");
- //bw.newLine();
- //BufferedImage bi = new BufferedImage(size,size, BufferedImage.TYPE_4BYTE_ABGR);
- //SELECT id, replaced, `type`, `data`, x, y, z
- //FROM `lb-surv`
- //INTO OUTFILE 'D:/emc2/arca_slash/database/lbcrunchsurvival.csv';
- ImageInfo imi = new ImageInfo(dataField.length, dataField.length, 8, false); // 8 bits per channel, no alpha
- // open image for writing to a output stream
- PngWriter png = new PngWriter(new FileOutputStream("map.png"), imi);
- // add some optional metadata (chunks)
- png.getMetadata().setDpi(100.0);
- png.getMetadata().setTimeNow(0); // 0 seconds fron now = now
- //0-49 1 stufe=1 farbschritt 50 -1049: 10 stufen pro farbschritt: rest gleichmäßig aufgeteilt bis maximum
- for (int i = 0; i < dataField.length; i++)
- {
- ImageLineInt iline = new ImageLineInt(imi);
- int[] is = dataField[i];
- for (int j = 0; j < is.length; j++)
- {
- int color=Color.white.getRGB();
- int k = is[j];
- if(k==0)
- {
- color=Color.white.getRGB();
- //bw.write("255 255 255");
- //bw.write(255);bw.write(255);bw.write(255);
- }
- else
- {
- if(placemode)
- {
- k=k/10;
- //k/=steps;
- if(k<50)
- {
- color= gradient.getRGB(k*16, 0);
- }
- else
- {
- if(k<1050)
- {
- k-=50;
- color= gradient.getRGB(800+k/10, 0);
- }
- else
- {
- k-=1050;
- int stepWidth = (max-1050)/(123);
- if(stepWidth==0)
- stepWidth++;
- color= gradient.getRGB(Math.min(1023,900+k/stepWidth), 0);
- }
- int r=(color&0xFF0000)>>16;
- int g=(color&0xff00)>>8;
- int b=color&0xff;
- //bw.write(r);bw.write(g);bw.write(b);
- //writeBy(r+" "+g+" "+b);
- }
- }
- else if(max>1050)
- {
- //k/=steps;
- if(k<50)
- {
- color= gradient.getRGB(k*16, 0);
- }
- else
- {
- if(k<1050)
- {
- k-=50;
- color= gradient.getRGB(800+k/10, 0);
- }
- else
- {
- k-=1050;
- int stepWidth = (max-1050)/(123);
- if(stepWidth==0)
- stepWidth++;
- color= gradient.getRGB(Math.min(1023,900+k/stepWidth), 0);
- }
- int r=(color&0xFF0000)>>16;
- int g=(color&0xff00)>>8;
- int b=color&0xff;
- //bw.write(r);bw.write(g);bw.write(b);
- //writeBy(r+" "+g+" "+b);
- }
- }
- else
- {
- if(k<25)
- {
- color= gradient.getRGB(k*32, 0);
- }
- else
- {
- int stepWidth = (max-50)/(223);
- if(stepWidth==0)
- stepWidth++;
- color= gradient.getRGB(Math.min(1023,800+k/stepWidth+1), 0);
- }
- }
- }
- ImageLineHelper.setPixelRGB8(iline, j,color);
- //bi.setRGB(i,j,k<<16&k<<8&k);
- //if(j<19999)
- // {
- //bw.write(" ");
- // }
- }
- //if(i<19999)
- // bw.newLine();
- png.writeRow(iline);
- System.out.print(i+"lines rasterized\r");
- }
- //bw.close();
- png.end();
- //ImageIO.write(bi, "png",new File( "map.png"));
- }
-
- }
- //use mcserver;
- //mysql> SELECT id,replaced,type,data,x,y,z from `lb-surv` into outfile D:\\emc2\\arca_slash\\heatmap.tsv FIELDS TERMINATED BY `\t` LINES TERMINATED BY `\n`
|