Additives Farbsystem

Status
Nicht offen für weitere Antworten.

Gentle

Mitglied
Grüße!

Ich überlegte mir, ein java-applet zu machen, in dem man farben mischen kann - und zwar additiv, so wie es unser bildschirm macht. Das Applet könnt ihr hier ansehen:
gentle.gym.wenzgasse.at/Java/Farbsys/RGB.html

Der Quelltext ist hier (für einen Thread eventuell zu lang? Sorry, bin erst seit kurzem hier in der Community, k.A. was euch lieber ist :)
http://gentle.gym.wenzgasse.at/Java/Farbsys/RGB.java



Jau... zwei Dinge;

erstmal, bei den rechtecken seht ihr, die wirken additiv - allerdings ist das nur ein fake, da sie nicht wirklich additiv wirken, sondern es sind einfach 7 Rechtecke mit verschiedenen Fülloptionen.

Links seht ihr Kreise, sie überdecken sich (nicht subtraktiv) - und bei denen will ich auch eine additive ineinadermischung erzielen. Wie also könnte ich das angehen?


Frage zwei bzgl. der update/repaint-Geschichte, ich hab das nicht so ganz durchschaut, und es ist glaube ich ein fehler, den ich hier mache. wie geht es richtig bzw. wieso? :)


Danke schon ma,

Gentle ;)
 

Wildcard

Top Contributor
*Lach* das Ding braucht 100% CPU.
Schon richtig, das mit dem zeichnen passt so noch nicht.
An deiner Stelle würde ich übrigens ein JApplet nehmen (Swing) dann kannst du dir die Späße mit dem BufferedImage sparen (ist schon doppelt gepuffer).
Dann überschreibst du einfach paint oder paintComponent (je nachdem auf was du zeichnen willst) und setzt dort den Code zum zeichnen rein.
Wenn einer deiner Listener dann eine Veränderung registriert ruft er einfach repaint() auf, und fertig :wink:
 

Gentle

Mitglied
Ich glaub, ich hab ne repaint-endlosschleife dirn, deshalb das mit der CPU :D

Mh, mit swing... hab mich noch nicht damit auseinandergesetzt, werd ich aber noch machen. Danke für den Tipp :)
 

Gentle

Mitglied
Jop, das wars, jetzt passt es :)
und ich habe endlich verstanden, wie repaint und update funktionieren, juhuu! :)


Also, jetzt zurück zur eigentlichen Frage...: additive überlagerung.. :bahnhof:
 

Marco13

Top Contributor
Du kannst, bevor du zeichnest, auf XOR-Modus (mit Schwarz als XOR-Farbe) gehen. Dann brauchst du auch bei den Rechtecken nichtmehr zu cheaten :wink:

Code:
/*
 * RGB.java
 *
 * Created on 15. Jänner 2007, 00:25
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

//package schule;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
/**
 *
 * @author Dr. Tobias Sommer
 */
public class RGB extends Applet implements AdjustmentListener{


    public int r=127, b=64, g=80;

    Scrollbar rot = new java.awt.Scrollbar(Scrollbar.HORIZONTAL,r,1,0,255);
    Scrollbar gruen = new java.awt.Scrollbar(Scrollbar.HORIZONTAL,g,1,0,255);
    Scrollbar blau = new java.awt.Scrollbar(Scrollbar.HORIZONTAL,b,1,0,255);

    public void adjustmentValueChanged(AdjustmentEvent e) {
        r = rot.getValue();
        g = gruen.getValue();
        b = blau.getValue();
        repaint();
    }


    /** Initialization method that will be called after the applet is loaded
     *  into the browser.
     */
    public void init() {
        setBackground(Color.BLACK);

        add(rot);
        add(gruen);
        add(blau);
        rot.addAdjustmentListener(this);
        gruen.addAdjustmentListener(this);
        blau.addAdjustmentListener(this);
    }

    Image buffer;
    Graphics2D gbuffer;
    public void paint(Graphics graph)
    {

        if (buffer==null)
        {
            buffer = createImage(500,500);
            gbuffer = (Graphics2D)buffer.getGraphics();
        }
        gbuffer.clearRect(0,0,this.getSize().width,this.getSize().height);
        gbuffer.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);


        rot.setBounds(35,110,80,10);
        gruen.setBounds(135,110,80,10);
        blau.setBounds(235,110,80,10);

        gbuffer.setColor(new Color(255,0,0,r));
        gbuffer.fillRect(50,50,50,50);
        gbuffer.setColor(new Color(0,255,0,g));
        gbuffer.fillRect(150,50,50,50);
        gbuffer.setColor(new Color(0,0,255,b));
        gbuffer.fillRect(250,50,50,50);

        for (int i=0;i<3;i++)
        {
            gbuffer.setColor(Color.white);
            gbuffer.drawRect(50+i*100,50,50,50);
        }
        gbuffer.drawString("Rot: " + r,50,45);
        gbuffer.drawString("Grün: " + g,150,45);
        gbuffer.drawString("Blau: " + b,250,45);
        gbuffer.drawString("Auch additives Farbsystem ;-)",30,340);
        gbuffer.drawString("Additives Farbsystem",210,340);


        drawCircles(gbuffer);
        drawRects(gbuffer);

        graph.drawImage(buffer,0,0,this);

    }


    private void drawCircles(Graphics gr)
    {
        gr.setXORMode(new Color(0,0,0));

        gr.setColor(new Color(r,0,0));
        gr.fillOval(30,200,100,100);

        gr.setColor(new Color(0,g,0));
        gr.fillOval(50,170,100,100);

        gr.setColor(new Color(0,0,b));
        gr.fillOval(70,200,100,100);

        gr.setPaintMode();
    }

    private void drawRects(Graphics gr)
    {
        gr.setXORMode(new Color(0,0,0));

        gr.setColor(new Color(r,0,0));
        gr.fillRect(200,210,100,100);

        gr.setColor(new Color(0,g,0));
        gr.fillRect(220,170,100,100);

        gr.setColor(new Color(0,0,b));
        gr.fillRect(240,180,100,100);

        gr.setPaintMode();
    }


       public void update(Graphics graph){ paint(graph); }
    // TODO overwrite start(), stop() and destroy() methods
}
 

Gentle

Mitglied
Geil, danke Marco!

Hab in meinem Java-Buch auch Xor gefunden, allerdings null Plan gehabt, was es bewirken könnte.. super :)
Daumen HOCH!
 
Status
Nicht offen für weitere Antworten.

Oben