Farbuebergaenge plotten

Don83

Bekanntes Mitglied
Hallo,
ich arbeite gerade an meiner Diplomarbeit und wuerde gerne ein paar schoene Farbverlaufe in Java plotten. Bin leider kein Java profi, das mal vorweg.

Also was ich mir vorstelle ist folgendes.
Ich habe ein array mit Feldern die mit Zahlen zwischen 0 und 1 belegt sind. Z.B:
0.8481454992997655
0.04514589351156695
0.8405723132101109
0.8034380466496315
0.18388681392709605
0.008247015123625467
usw.

Jetzt moechte ich folgenden plot erstellen. Jedes Feld soll eine bestimmte grosse einnehmen. Z.B. 2mm.
Ich moechte dann einen Farbstreifen der in etwa wie folgend aussieht.
| | | | | | | | | | | | | | | | |
Jedes Feld hier drin soll nun eine Farbe bekommen je nachdem Wert der im Array zu finden ist.
Z.B. je hoeher der Wert umso roetlicher, anfangend bei gruen. Aber die farben an sich sind eigentlich egal, hauptsache man erkennt wenn eine zahl hoeher ist und wenn eine zahl niedriger ist.

So mit meinen beschraenkten Faehigkeiten habe ich mir jetzt erstmal ein Testarray erstellt.
Code:
public class ChromosomePainting {
	public static void main(String[] args) {
		//Create a random number array representing % with a size of 100!
		double[] segments = new double[100];
		for(int i=0;i<segments.length;i++){
			double random_value = Math.random();
			segments[i]=random_value;
			System.out.println(segments[i]);
		}
		
	}
	
}

So nun wie gesagt mein Problem,ich weis ehrlich gesagt gar nicht wie ich anfangen soll, bzw. wonach ich googeln sollte da ich noch nie grafiken mit Java erstellt habe. Eventuell koennte mir ja jemand die Richtung weisen. (Das soll nicht heissen, dass das nun jemand fuer mich programmieren soll - ich weis nur gerade wirklich nicht wie ich hierbei anfangen sollte).
 

Don83

Bekanntes Mitglied
Hallo nochmals,
also ich glaube das Grundgeruest steht nun:
Code:
import java.awt.*;
import java.util.Random;
import javax.swing.*;

public class ColorBox extends JPanel {
	private static Random r = new Random();

	@Override
	protected void paintComponent(Graphics g) {
		g.clearRect(0, 0, getWidth(), getHeight());
	
	//Getting the values! And colors!
	double[] segments = new double[200];
	for(int i=0;i<segments.length;i++){
		double random_value = Math.random();
		segments[i]=random_value;
		System.out.println(segments[i]);
	}
	//Painting the rectangles
		for (int x = 0; x < 1000; x+= 5) {
			int color=(int) ((segments[x/5]*256-1));
			g.setColor(new Color(200, color, color));
			g.fillRect(x, 10, 5, 25);
			g.drawRect(x-1, 10, 5, 25);
		}
	}

	public static void main(String[] args) {
		JFrame f = new JFrame("Chromosome Painting");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(1000, 100);
		f.add(new ColorBox());
		f.setVisible(true);
	}
}

Nun haette ich nur gerne einen schoeneren Farbuebergang.
Also in etwa so wie hier:
MATLAB Central - File detail - colorscale

Also einfach eine Klasse die Werte zwischen 0-1 umwandelt. Also z.B je hoeher ein wert umso bunter der wert. Momentan nimmt bei mir nur die intensitaet einer farbe ab bzw. zu.

Zudem - weis jemand vielleicht wie man das was im JFrame ist in eine bilddatei abspeichert?
 

Don83

Bekanntes Mitglied
Ok der farbuebergang hat sich nun auch erledigt :D.
Habe einfach mal den gimp geoffnet und festgestellt, dass der farbverlauf den ich haben will recht leicht herzustellen war.
Nun muesste ich nurnoch herausfinden wie man die fenster in Bild-Dateien abspeicher. Any hints?

Anbei mein code, falls es wen interessieren sollte:
Code:
import java.awt.*;
import java.util.Random;
import javax.swing.*;

public class ColorBox extends JPanel {
	private static Random r = new Random();

	@Override
	protected void paintComponent(Graphics g) {
		g.clearRect(0, 0, getWidth(), getHeight());
	
	//Getting the values! And colors!
	double[] segments = new double[200];
	for(int i=0;i<segments.length;i++){
		double random_value = (0.49*i)/100;
		segments[i]=random_value;
		//System.out.println(segments[i]);
	}
	//Painting the rectangles
	//blau oben 
	//dann gruen hoch 255
	//blau runter 510
	//rot hoch 735
	//gruen runter 990 farbticks
	
		for (int x = 0; x < 1000; x+= 5) {
			double actual_value = segments[x/5];
			//Man muss hier die colorticks zaehlen
			int bluex=0;
			int greenx=0;
			int redx=0;
			int color_ticks = (int) (actual_value *990);
			if(color_ticks<=255){
				bluex = 255;
				greenx=color_ticks;
				redx=0;				
			}
			if((color_ticks>255) && (color_ticks<=510)){
				bluex = 255-(color_ticks-255);
				greenx=255;
				redx=0;				
			}
			if((color_ticks>510) && (color_ticks<=735)){
				bluex = 0;
				greenx=255;
				redx=color_ticks-510;				
			}
			if((color_ticks>735) && (color_ticks<=990)){
				bluex = 0;
				greenx=255-(color_ticks-735);
				redx=255;				
			}
			
			
			g.setColor(new Color(redx, greenx, bluex));
			g.fillRect(x, 10, 5, 25);
			g.drawRect(x-1, 10, 5, 25);
		}
	}

	public static void main(String[] args) {
		
		
		
		
		JFrame f = new JFrame("Chromosome Painting");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(1000, 100);
		f.add(new ColorBox());
		f.setVisible(true);
	}
}
 

jgh

Top Contributor
per Screenshot bspw:


Java:
	public static void main(String[] args) {

		JFrame f = new JFrame("Chromosome Painting");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(1000, 100);
		ColorBox c = new ColorBox();
		f.add(c);
		f.setVisible(true);
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		makeScreenShot("test.png", c);
	}

	public static void makeScreenShot(String outFileName, JPanel panel) {

		Rectangle screenRect = new Rectangle((int) panel.getLocationOnScreen()
				.getX(), (int) panel.getLocationOnScreen().getY(), panel
				.getWidth(), panel.getHeight());

		Robot robot = null;
		try {
			robot = new Robot();
		} catch (AWTException e1) {
			e1.printStackTrace();
		}
		BufferedImage image = robot.createScreenCapture(screenRect);

		try {
			ImageIO.write(image, "png", new File(outFileName));
		} catch (IOException e1) {
			e1.printStackTrace();
		}

	}
}
 

Ähnliche Java Themen

Neue Themen


Oben