Objekte ausschneiden (transparent PShape)

Hallo meine sehr geehrten Herren/innen! Ich hoffe Sie hatten einen angenehmen Tag… doch wie wir alle wissen soll man den Tag nicht vor dem Abend loben. Deswegen wollte ich fragen, ob jemand weiß, wie man Objekte voneinander differenzieren kann. Ich habe eine Variation an Himmelskörpern modelliert und bin bei dem Mond auf das Problem gestoßen, dass die Körper (wenn ich einen anderen Hintergrund nehme) nicht die gewünschte Form annehmen. Die frage ist jetzt, ob es irgendwie möglich ist zwei Körper auszuschneiden oder einen Körper transparent für den Hintergrund zu machen. Ich hoffe Ihr habt einen schönen Tag und könnt mir helfen, da bei mir mittlerweile Hopfen und Malz verloren ist!

Anbei der Processing Code:

<void setup () {
size (1920,1080);
background(255);
}

public void cloud(int a, int b, int c) {
noStroke();
fill(#F5F0F0);
ellipse(a,b,c,c);
ellipse(a-0.6c,b+0.15c,c,c);
ellipse(a-1.2c,b+0.5c,c,c);
ellipse(a+0.6c,b+0.15c,c,c);
ellipse(a+1.2c,b+0.5c,c,c);
rect(a-1.2c,b+0.4c,2.4c,0.6c);

}

public void moon(int a, int b, int c,int f){
//Mond
noStroke();
fill(#F5EEAF);
ellipse (a, b,c, c);
fill (f);
ellipse (a+0.4c, b,c1.1, c*1.1);
}

public void sun(int x, int y, int w, int h, int w1, int h1, int x1, int y1){
// Sonne
noStroke();
fill (255,255,0);
ellipse (x, y,w, h);

//Sonnenstrahlen
rect (x-w10.5, y-y1, w1, -h1);
rect(x-w1
0.5, y+y1, w1, h1);
rect (x-x1,y-w10.5,-h1,w1);
rect (x+x1,y-w1
0.5,h1,w1);
translate(x,y);
rotate(PI/4);
rect (0.5w1, -h-0.25h1, w1, h1);
rect (0.5w1, 0.5h+0.25h1, w1, h1);
rotate(PI/4);
rotate(PI/4);
rect (0.5
w1, -h-0.25h1, w1, h1);
rect (0.5
w1, 0.5h+0.25h1, w1, h1);
rotate(PI/4);
rotate(PI);
translate(-x,-y);

}

void draw(){
sun(700,250,200,200,5,100,115,115);

moon(1000,400,300, 0);
cloud(500,600,250);

  • List item
1 Like

ich bin nicht sicher, was du meinst.

Du kannst translate und rotate für die Sonne anwenden, und das von den anderen Himmelskörpern isolieren, in dem du pushMatrix(); und popMatrix(); darum schreibst.

  • pushMatrix(); speichert das Koordinatensystem
  • popMatrix(); setzt es wieder zurück

du kannst den Mond durch einen anderen fill Befehl transparent machen: s.u.



void setup () {
  size (1920, 1080);
  background(255);
}

void draw() {
  moon(1000, 400, 300, 0);
  sun(700, 250, 200, 200, 5, 100, 115, 115);

  cloud(500, 600, 250);
}

// ----------------------------------------------------------------------

public void cloud(int a, int b, int c) {
  noStroke();
  fill(#F5F0F0);
  ellipse(a, b, c, c);
  ellipse(a-0.6*c, b+0.15*c, c, c);
  ellipse(a-1.2*c, b+0.5*c, c, c);
  ellipse(a+0.6*c, b+0.15*c, c, c);
  ellipse(a+1.2*c, b+0.5*c, c, c);
  rect(a-1.2*c, b+0.4*c, 2.4*c, 0.6*c);
}

public void moon(int a, int b, int c, int f) {
  //Mond
  noStroke();
  fill(#F5EEAF, 10);
  ellipse (a, b, c, c);
  fill (f, 10);
  ellipse (a+0.4*c, b, c*1.1, c*1.1);
}

public void sun(int x, int y,
  int w, int h,
  int w1, int h1,
  int x1, int y1) {

  // Sonne

  pushMatrix();

  noStroke();
  fill (255, 255, 0);
  ellipse (x, y, w, h);

  //Sonnenstrahlen
  rect (x-w*10.5, y-y1, w1, -h1);
  rect(x-w*10.5, y+y1, w1, h1);
  rect (x-x1, y-w*10.5, -h1, w1);
  rect (x+x1, y-w*10.5, h1, w1);
  translate(x, y);
  rotate(PI/4);
  rect (0.5*w1, -h-0.25*h1, w1, h1);
  rect (0.5*w1, 0.5*h+0.25*h1, w1, h1);
  rotate(PI/4);
  rotate(PI/4);
  rect (0.5*w1, -h-0.25*h1, w1, h1);
  rect (0.5*w1, 0.5*h+0.25*h1, w1, h1);
  rotate(PI/4);
  rotate(PI);
  translate(-x, -y);

  popMatrix();
}

//

Das wäre noFill(); also keine Füllung plus
stroke(0); als Umrandung der Fläche.
Dann ist der Mond durchsichtig.

Siehe Reference Reference / Processing.org

  • Im Beispiel oben habe ich die Stärke der Transparenz des Mondes sehr schwach eingestellt mit 10 beim fill() Befehl
1 Like

Vielen Dank für die Antworten!
Das Problem liegt aber bei dem Mond, da ich ein Bild als Hintergrund einfügen will und so ich somit nicht einfach zwei Kreise überlagern kann. Vielleicht geht es eventuell, aber ich wüsste nicht wie. Da der Hintergrund mehr als eine Farbe hat, kann ich diese Mond-Funktion nicht 1:1 übertragen. Man würde immer die Farbe des rechten Kreises zu Gesicht bekommen. Und meine Frage lautet daher, ob es in Processing möglich ist, ein geschlossenes Objekt zu erstellen, so wie in GAM zum Beispiel. Man würde den linken Kreis mit der Hilfe des rechten “ausschneiden”. Nichtsdestotrotz, vielen Dank für Ihre Antworten.

Mit processischen Grüßen,

boolan

1 Like

Ok.

Du wirst bessere Antworten bekommen, wenn du auf Englisch schreibst.

Vielleicht hilft dir der mask() Befehl: Crop multiple images to any (quad) shape and place them side by side filling the canvas (comic strip) - #5 by josephh

Moon: How to draw a crescent

Hallo :slight_smile:
Wie @Chrisir schon gesagt hat, könntest Du es mit mask() probieren.

→ siehe das Alphamask Beispiel bei den Processing Beispielen.
Ich denke das man das auch mit einem PGraphics (in das Du den Mond hineinreichest, bevor du es maskierst) machen kann.

Ganz allgemein: ich vermute, das Du einfach keinen Vollmond zeichnen willst…

Wenn deine Projekte etwas “komplizierter” werden, wirst Du sehr wahrscheinlich mit einfachen Grundformen wie Rechtecken oder Kreisen irgendwann nicht mehr auskommen wollen.

Daher würde ich mir PShape anschauen… In der reference findest Du zb.:

Das zweite Beispiel ist schon sehr halbmondartig, man muss nur die Punkte entsprechend wählen.

Ich vermute das Du mit der Möglichkeit, kompliziertere Formen damit zeichnen zu können, ziemlich glücklich werden könntest.

Du könntest Dir auch die geomerative library anschauen. Die kann soweit ich weiß auch boole’sche Operationen, aber das ist dann wieder eine neue Lernkurve… :slight_smile:

Ich habe es nun ausprobiert und bin nun endlich zu einem passablen Ergebnis gekommen. Herzlichen Dank für den Vorschlag Hyperion65!
DANKE! LG

1 Like