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);}}
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: Dabei werden verschiedene
Anteile der Grundfarben gemischt, 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 somit 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:
newColor(intred,intgreen,intblue)
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
Alpha-Werte
Ein weiterer Vorteil der Klasse Color ist
die Möglichkeit, Farben zu einem gewissen Anteil durchsichtig zu machen. Dieser
Grad der Durchsichtigkeit wird als Alpha-Helligkeit oder Opacity bezeichnet.
Auch diese lässt sich mit einem Wert zwischen 0 und 255 beschreiben. Bei
einem Wert von 255 ist die Farbe vollständig sichtbar, bei einem Wert von 0
vollständig durchsichtig, also unsichtbar.1
Nachfolgend der Konstruktor der Klasse Color, mit dem der Alphawert angegeben werden kann:
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());}}