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
Farben über RGB
Zur Darstellung von Farben als Zeichenketten gibt es eine Alternative, mit der
sich jede Farbe exakt maßschneidern lässt. Ein Farbton lässt sich über die
Anteile der drei Farben Rot, Grün und Blau beschreiben. Diese Anteile können
zwischen 0 und 100 % liegen.
Man kann das als digitales Farbenmischen betrachten: Man mischt verschiedene
Anteile der Grundfarben zusammen, um den gewünschten Farbton zu erhalten. Diese
Anteile werden jedoch nicht in Prozent, sondern als Zahlen zwischen 0 (≙ 0 %
Anteil) und 255 (≙ 100 % Anteil) angegeben. Eine Farbe lässt sich also durch
drei Zahlen beschreiben, die die Anteile von Rot, Grün und Blau angeben. Dies
wird mit R/G/B abgekürzt.1
Color ist eine vordefinierte Java-Klasse. Sie beschreibt eine Farbe und lässt sich sehr leicht instanzieren. Nachfolgend der Konstruktor der Klasse Color:
Color(intr,intg,intb)
Die drei Zahlenwerte müssen Zahlen zwischen 0 und 255 liegen und entsprechen den Anteilen der entsprechenden Grundfarbe, die zum "Mischen" verwendet werden soll.
So erhält man zum Beispiel:
Schwarz
newColor(0,0,0);
Weiß
newColor(255,255,255);
Orange
newColor(255,200,0);
Cyan/Türkis
newColor(0,255,255);
Natürlich sind auch alle anderen Zahlenkombinationen mit Werten zwischen 0 und 255 möglich.1
Methoden zum Färben
Alle färbbaren Klassen (z.B. Text und alle Geometrie-Klassen) verfügen zum Festlegen der Farbe über nachfolgende zwei Methoden:1
Ein weiterer Vorteil der Klasse Farbe ist die Möglichkeit, Farben zu einem
gewissen Anteil durchsichtig machen zu können. Die "Nichtdurchsichtigkeit" (oder
auch Opacity) einer Farbe wird als Alpha-Helligkeit bezeichnet. Auch diese lässt
sich mit einem Wert zwischen 0 und 255 beschreiben. Bei einem Wert von 255 ist
die Farbe gänzlich sichtbar und bei einem Wert von 0 absolut durchsichtig, d. h.
unsichtbar. Alle Werte dazwischen sorgen für eine unterschiedlich stark
durchsichtige, geister- oder glasartige Farbe.1
Hierfür gibt es dann den vollen Konstruktor der Klasse Farbe:
public Farbe(int r, int g, int b, int alpha)
Ein sehr einfaches Beispiel, es wird ein halbdurchsichtiges Rechteck erstellt:
/ In der spielsteuernden Klasse (wegen der “wurzel“) /
// Erstelle in der linken oberen Bildecke ein Quadrat mit der Seitenlänge 200
Rechteck recht = new Rechteck(0, 0 200, 200);
// Erstelle der Fuellfarbe
Farbe fuellFarbe = new Farbe(178, 255, 255, 200);
// Dem Quadrat die Füllfarbe zuweisen
recht.farbeSetzen(fuellFarbe);
// Das Rechteck an der Wurzel anmelden, um es sichtbar zu machen
wurzel.add(recht);
publicclassColorWheelIttenDemoextendsSceneimplementsKeyStrokeListener{privatefinalintNUMBER_SEGMENTS=12;privatefinaldoubleSEGMENT_ANGLE=360.0/NUMBER_SEGMENTS;privatefinaldoubleINNER_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 */privatefinalActor[]WHEEL_AREAS;/** * @see Polygon */privatefinalActor[]PRIMARY_AREAS;/** * @see Polygon */privatefinalActor[]SECONDARY_AREAS;/** * @see Rectangle */privatefinalActor[]EXTRA_AREAS;/** * Der Name des Farbschemas */privatefinalTextNAME;publicColorWheelIttenDemo(){info().title("Farbschemata-Demo").description("Demonstiert die Farbschemata, die die Engine Pi mitliefert anhand des Farbkreises von Itten.").help("Ein beliebiger Tastendruck schaltet 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=newText("");NAME.anchor(-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. * */privateVectorgetCirclePoint(doubleradius,doubleangle){returnVector.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. */privateActorcreateWheelArea(intindex,doubleangle){// Erster WinkeldoubleHALF_SEGMENT_ANGLE=SEGMENT_ANGLE/2.0;doublestart=angle-HALF_SEGMENT_ANGLE;// Zweiter Winkeldoubleend=angle+HALF_SEGMENT_ANGLE;doubleOUTER_RADIUS=7.0;Polygonpolygon=newPolygon(getCirclePoint(OUTER_RADIUS,start),getCirclePoint(INNER_RADIUS,start),getCirclePoint(INNER_RADIUS,end),getCirclePoint(OUTER_RADIUS,end));add(polygon);returnpolygon;}/** * Zeichnet alle zwölf Farben des <b>Farbkreises</b>. * * @see Polygon */privateActor[]drawWheelColors(){Actor[]areas=newActor[NUMBER_SEGMENTS];for(inti=0;i<NUMBER_SEGMENTS;i++){doubleangle=(i*SEGMENT_ANGLE*-1)+90;VectortextPosition=getCirclePoint(7.5,angle);add(newText(i+"").height(0.5).anchor(textPosition.x(),textPosition.y()).color("weiß"));areas[i]=createWheelArea(i,angle);}returnareas;}/** * Zeichnet die drei <b>Sekundärfarben</b>. * * @see Polygon */privateActor[]drawSecondaryColors(){Actor[]areas=newActor[3];// 90 Grad ist obenintSTART_ANGLE=90;// 0, 4, 8 -> erste Ecke des Dreiecksfor(inti=0;i<NUMBER_SEGMENTS;i+=4){doubleradius=INNER_RADIUS-0.2;intangle=START_ANGLE-(i*30);// Zeichnen des DreiecksPolygonarea=newPolygon(getCirclePoint(radius,angle),getCirclePoint(radius,angle-60),getCirclePoint(radius,angle-120));add(area);areas[i/4]=area;}returnareas;}/** * Zeichnet die drei <b>Pimärfarben</b>. * * @see Polygon */privateActor[]drawPrimaryColors(){Actor[]areas=newActor[3];// 90 Grad ist obenintSTART_ANGLE=90;// 0, 4, 8 -> Spitzefor(inti=0;i<NUMBER_SEGMENTS;i+=4){doubleradius=INNER_RADIUS-0.2;intangle=START_ANGLE-(i*30);// Zeichnen eines VierecksPolygonarea=newPolygon(getCirclePoint(radius,angle+60),getCirclePoint(radius,angle),getCirclePoint(radius,angle-60),newVector(0,0));add(area);areas[i/4]=area;}returnareas;}/** * Zeichnet die vier <b>zusätzlichen</b> Farben: Braun, Weiß, Grau und * Schwarz. * * @see Rectangle */privateActor[]drawExtraColors(){Actor[]areas=newActor[4];for(inti=0;i<4;i++){Rectanglerectange=newRectangle(1,1);rectange.anchor(-8+i,-8);areas[i]=rectange;add(rectange);}returnareas;}privatevoidsetColorScheme(ColorSchemescheme){NAME.content(scheme.name());inti=0;for(Colorcolor:scheme.wheelColors()){WHEEL_AREAS[i].color(color);i++;}i=0;for(Colorcolor:scheme.primaryColors()){PRIMARY_AREAS[i].color(color);i++;}i=0;for(Colorcolor:scheme.secondaryColors()){SECONDARY_AREAS[i].color(color);i++;}i=0;for(Colorcolor:scheme.extraColors()){EXTRA_AREAS[i].color(color);i++;}}privatevoidsetNextColorScheme(){setColorScheme(colorScheme.next());}@OverridepublicvoidonKeyDown(KeyEventevent){setNextColorScheme();}publicvoidcycle(){repeat(1,()->{setNextColorScheme();});}publicstaticvoidmain(String[]args){Controller.instantMode(false);ColorWheelIttenDemodemo=newColorWheelIttenDemo();Controller.start(demo,520,520);}}
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.
publicclassImageAverageColorDemoextendsScene{publicImageAverageColorDemo(){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);doublex=-4;for(Stringfilepath:newString[]{"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;}}privatevoidcreateImageWithAverageColor(Stringfilepath,doublex){varimage=newImage(filepath).size(1,1).anchor(x,0);add(image);add(newRectangle(1.0,1.0).anchor(x,-1.2).color(image.color()));add(newRectangle(1.0,0.5).anchor(x,-1.9).color(image.complementaryColor()));}publicstaticvoidmain(String[]args){Controller.instantMode(false);Controller.start(newImageAverageColorDemo());}}