Skip to content

colors (Farben)

Farbnamen

Die zwölf Farben des Farbkreises von Itten zusammen mit ihren Aliassen bzw. Synonymen:

  • yellow: Gelb, Hellgelb
  • yellow orange: orange yellow, gold, Gelb-Orange, Orange-Gelb, Golden, Dunkelgelb
  • orange: Orange
  • red orange: orange red, brick red, brick, Rot-Orange, Orange-Rot, Ziegelrot, Hellrot
  • red: Rot
  • red purple: purple red, magenta, pink, Rot-Violett, Violett-Rot, Rosa
  • purple: Violet, Violett, Lila
  • blue purple: purple blue, indigo, Violett Blau, Blau Violett
  • blue: Blau
  • blue green: green blue, cyan, Blau-Grün, Grün-Blau, Türkis
  • green: Grün
  • yellow green: green yellow, lime, lime green, Gelb-Grün, Grün-Gelb, Limetten Grün, Limette, Hellgrün

Diese Farben sind ebenfalls im Speicher für Farben enthalten (gehören aber nicht zum Farbkreis von Itten):

  • brown: Braun
  • white: Weiß
  • gray: grey, Grau
  • black: Schwarz

Die Klassen mit Farbbezug:

Farbschema

public class ColorWheelIttenDemo extends Scene implements KeyStrokeListener
{
    private final int NUMBER_SEGMENTS = 12;

    private final double SEGMENT_ANGLE = 360.0 / NUMBER_SEGMENTS;

    private final double INNER_RADIUS = 5.0;

    /**
     * Die farbigen Segmente in der Form eines Trapezes mit einer der zwölf
     * Farben des Farbkreises von Itten. Zwölf Segmente ergeben einen Kreis.
     *
     * @see Polygon
     */
    private final Actor[] WHEEL_AREAS;

    /**
     * @see Polygon
     */
    private final Actor[] PRIMARY_AREAS;

    /**
     * @see Polygon
     */
    private final Actor[] SECONDARY_AREAS;

    /**
     * @see Rectangle
     */
    private final Actor[] EXTRA_AREAS;

    /**
     * Der Name des Farbschemas
     */
    private final Text NAME;

    public ColorWheelIttenDemo()
    {
        info().title("Farbschemata-Demo").description(
                "Demonstiert die Farbschemata, die die Engine Pi mitliefert anhand des Farbkreises von Itten.")
                .help("Ein beliebiger Tastendruck schalten zum nächsten Farbschema weiter.");
        WHEEL_AREAS = drawWheelColors();
        // Zuerst Primär, denn die müssen übermalt werden.
        PRIMARY_AREAS = drawPrimaryColors();
        SECONDARY_AREAS = drawSecondaryColors();
        EXTRA_AREAS = drawExtraColors();
        NAME = new Text("");
        NAME.position(-8, 7);
        NAME.color("white");
        add(NAME);
        setNextColorScheme();
        backgroundColor("#444444");
    }

    /**
     * Berechnet einen Punkt auf der Kreislinie.
     *
     * @param radius Der Radius des Kreises.
     * @param angle Der Winkel, der die Lage des Punktes angibt (0 = rechts, 90
     *     = oben, 180 = links, 270 = unten).
     *
     * @return Ein Punkt, der auf der Kreislinie liegt.
     *
     */
    private Vector getCirclePoint(double radius, double angle)
    {
        return Vector.ofAngle(angle).multiply(radius);
    }

    /**
     * Ein farbiges Segment in der Form eines Trapezes mit einer der zwölf
     * Farben des Farbkreises von Itten. Zwölf Segmente ergeben einen Kreis.
     *
     * @param index Der Farbindex. 0 = gelb
     * @param angle Der Winkel deutet auf die Mitte des Segments.
     */
    private Actor createWheelArea(int index, double angle)
    {
        // Erster Winkel
        double HALF_SEGMENT_ANGLE = SEGMENT_ANGLE / 2.0;
        double start = angle - HALF_SEGMENT_ANGLE;
        // Zweiter Winkel
        double end = angle + HALF_SEGMENT_ANGLE;
        double OUTER_RADIUS = 7.0;
        Polygon polygon = new Polygon(getCirclePoint(OUTER_RADIUS, start),
                getCirclePoint(INNER_RADIUS, start),
                getCirclePoint(INNER_RADIUS, end),
                getCirclePoint(OUTER_RADIUS, end));
        add(polygon);
        return polygon;
    }

    /**
     * Zeichnet alle zwölf Farben des <b>Farbkreises</b>.
     *
     * @see Polygon
     */
    private Actor[] drawWheelColors()
    {
        Actor[] areas = new Actor[NUMBER_SEGMENTS];
        for (int i = 0; i < NUMBER_SEGMENTS; i++)
        {
            double angle = (i * SEGMENT_ANGLE * -1) + 90;
            Vector textPosition = getCirclePoint(7.5, angle);
            add(new Text(i + "", 0.5)
                    .position(textPosition.x(), textPosition.y())
                    .color("weiß"));
            areas[i] = createWheelArea(i, angle);
        }
        return areas;
    }

    /**
     * Zeichnet die drei <b>Sekundärfarben</b>.
     *
     * @see Polygon
     */
    private Actor[] drawSecondaryColors()
    {
        Actor[] areas = new Actor[3];
        // 90 Grad ist oben
        int START_ANGLE = 90;
        // 0, 4, 8 -> erste Ecke des Dreiecks
        for (int i = 0; i < NUMBER_SEGMENTS; i += 4)
        {
            double radius = INNER_RADIUS - 0.2;
            int angle = START_ANGLE - (i * 30);
            // Zeichnen des Dreiecks
            Polygon area = new Polygon(getCirclePoint(radius, angle),
                    getCirclePoint(radius, angle - 60),
                    getCirclePoint(radius, angle - 120));
            add(area);
            areas[i / 4] = area;
        }
        return areas;
    }

    /**
     * Zeichnet die drei <b>Pimärfarben</b>.
     *
     * @see Polygon
     */
    private Actor[] drawPrimaryColors()
    {
        Actor[] areas = new Actor[3];
        // 90 Grad ist oben
        int START_ANGLE = 90;
        // 0, 4, 8 -> Spitze
        for (int i = 0; i < NUMBER_SEGMENTS; i += 4)
        {
            double radius = INNER_RADIUS - 0.2;
            int angle = START_ANGLE - (i * 30);
            // Zeichnen eines Vierecks
            Polygon area = new Polygon(getCirclePoint(radius, angle + 60),
                    getCirclePoint(radius, angle),
                    getCirclePoint(radius, angle - 60), new Vector(0, 0));
            add(area);
            areas[i / 4] = area;
        }
        return areas;
    }

    /**
     * Zeichnet die vier <b>zusätzlichen</b> Farben: Braun, Weiß, Grau und
     * Schwarz.
     *
     * @see Rectangle
     */
    private Actor[] drawExtraColors()
    {
        Actor[] areas = new Actor[4];
        for (int i = 0; i < 4; i++)
        {
            Rectangle rectange = new Rectangle(1, 1);
            rectange.position(-8 + i, -8);
            areas[i] = rectange;
            add(rectange);
        }
        return areas;
    }

    private void setColorScheme(ColorScheme scheme)
    {
        NAME.content(scheme.name());
        int i = 0;
        for (Color color : scheme.wheelColors())
        {
            WHEEL_AREAS[i].color(color);
            i++;
        }
        i = 0;
        for (Color color : scheme.primaryColors())
        {
            PRIMARY_AREAS[i].color(color);
            i++;
        }
        i = 0;
        for (Color color : scheme.secondaryColors())
        {
            SECONDARY_AREAS[i].color(color);
            i++;
        }
        i = 0;
        for (Color color : scheme.extraColors())
        {
            EXTRA_AREAS[i].color(color);
            i++;
        }
    }

    private void setNextColorScheme()
    {
        setColorScheme(colorScheme.next());
    }

    @Override
    public void onKeyDown(KeyEvent event)
    {
        setNextColorScheme();
    }

    public void cycle()
    {
        repeat(1, () -> {
            setNextColorScheme();
        });
    }

    public static void main(String[] args)
    {
        Controller.instantMode(false);
        ColorWheelIttenDemo demo = new ColorWheelIttenDemo();
        Controller.start(demo, 520, 520);
        // demo.cycle();
    }
}
Zum Java-Code: demos/docs/resources/color/ColorWheelIttenDemo.java

Farben in der Klasse Actor

In der ersten Reihe sind mehrere Bilder zu sehen, in der Reihe unterhalb Rechtecke mit der Durchschnittsfarbe der Bilder, in der letzten Reihe die Komplementärfarben der entsprechenden Bilder.

public class ImageAverageColorDemo extends Scene
{
    public ImageAverageColorDemo()
    {
        info().title("Figurfarben-Demo").description(
                "Demonstriert die Methoden Actor#color() und Actor#complementaryColor().")
                .help("In der ersten Reihe sind die originalen Bilder zusehen, "
                        + "in der zweiten Reihe die Durchschnittsfarbe und "
                        + "in der dritten Reihe die Komplementärfarbe der Durchschnittsfarbe.");
        camera().meter(90);
        double x = -4;
        for (String filepath : new String[] { "car/background-color-grass.png",
                "car/wheel-back.png", "car/truck-240px.png",
                "dude/background/snow.png", "dude/box/obj_box001.png",
                "dude/moon.png" })
        {
            createImageWithAverageColor(filepath, x);
            x = x + 1.2;
        }
    }

    private void createImageWithAverageColor(String filepath, double x)
    {
        var image = new Image(filepath, 1, 1).position(x, 0);
        add(image);
        add(new Rectangle(1.0, 1.0).position(x, -1.2).color(image.color()));
        add(new Rectangle(1.0, 0.5).position(x, -1.9)
                .color(image.complementaryColor()));
    }

    public static void main(String[] args)
    {
        Controller.instantMode(false);
        Controller.start(new ImageAverageColorDemo());
    }
}
Zum Java-Code: demos/docs/resources/color/ImageAverageColorDemo.java

ALT + d aktiviert den Debug-Modus: Die Bilder werden von Umrissen in den Komplementärfarben umrahmt.

Alt + a blendet die Figurenfüllungen aus. Es sind nur noch die Umrisse zu sehen.