Wie zeichne ich die grünen Kreise?

Reykja

Aktives Mitglied
n gibt die Anzahl der Kreise an die vertikal und horizontal gezeichnet werden. Unter dem Code befindet sich noch ein Hinweis zu den grünen Kreisen allerdings weiß ich nicht genau wie ich die durch die Schleife unterschiedlich erzeugten Kreise richtig platziere, so dass es für jedes n übernommen wird.

Java:
public class Aufgabe5 {
    
    public static void main(String[] args) {

        int width = 300;
        int height = 300;
        StdDraw.setCanvasSize(width, height);
        StdDraw.setScale(0, 300);

        double n = 5;
        double r = 300/n;

        for (int a = 1; a <= n / 2; a++) {                                          
        StdDraw.setPenColor(StdDraw.GREEN);
        StdDraw.setPenRadius(0.006);

        StdDraw.circle(150, 150, r / 2);
        StdDraw.circle((Math.sqrt(2* Math.pow(r, 2)) * a)/2+width/2 , (Math.sqrt(2 * Math.pow(r, 2)) * a)/2+width/2, r/2); //rechts oben
        //StdDraw.circle((Math.sqrt(2* Math.pow(r, 2)) * a)/2, (Math.sqrt(2 * Math.pow(r, 2)) * a)/2, r/2);
        //StdDraw.circle((Math.sqrt(2* Math.pow(r, 2)) * a) /2, (Math.sqrt(2 * Math.pow(r, 2)) * a) /2, r/2);
        //StdDraw.circle((Math.sqrt(2* Math.pow(r, 2)) * a) /2, (Math.sqrt(2 * Math.pow(r, 2)) * a) /2, r/2);

        }
    }
}

Bildschirmfoto 2020-11-05 um 15.02.30.png
LG Reykja
 
B

BestGoalkeeper

Gast
Ich denke so wurde das gezeichnet (die Diagonalen sind hervorgehoben):

[CODE lang="java" highlight="13-14"]import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.Arrays;
import java.util.function.BiFunction;

import javax.swing.JFrame;

public class Kreismuster {
private final int N = 5;

BiFunction<Integer, Integer, Color> diagonal1 = (x, y) -> x.equals(y) ? Color.green : null;
BiFunction<Integer, Integer, Color> diagonal2 = (x, y) -> y.equals(N - 1 - x) ? Color.green : null;
BiFunction<Integer, Integer, Color> west_east = (x, y) -> x.equals(0) || x.equals(N - 1) ? Color.red : null;
BiFunction<Integer, Integer, Color> north_south = (x, y) -> y.equals(0) || y.equals(N - 1) ? Color.blue : null;
BiFunction<Integer, Integer, Color> all = (x, y) -> Arrays.asList(diagonal1, diagonal2, west_east, north_south)
.stream().filter(bf -> bf.apply(x, y) != null).findFirst().orElse((x1, y1) -> null).apply(x, y);

public Canvas getCanvas() {
return new Canvas() {
private static final long serialVersionUID = 1L;
private final int wh = 300;

@Override
public void paint(Graphics g) {
int len = wh / N;
for (int y = 0; y < N; y++) {
for (int x = 0; x < N; x++) {
Color c = all.apply(x, y);
if (c != null) {
g.setColor(c);
g.drawOval(x * len, y * len, len, len);
}
}
}
}

@Override
public Dimension getPreferredSize() {
return new Dimension(wh, wh);
}
};
}

public static void main(String[] args) {
Kreismuster k = new Kreismuster();
JFrame jf = new JFrame("Kreismuster");
jf.add(k.getCanvas());
jf.pack();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
}
}[/CODE]

km1.png

Du musst Es also nur in ein Raster einteilen...

lg
 
B

BestGoalkeeper

Gast
Sorry so sieht es genau so aus wie in der Abbildung
[CODE lang="java" highlight="38-46"]import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.Arrays;
import java.util.function.BiFunction;

import javax.swing.JFrame;

public class Kreismuster {
private final int N = 7;

BiFunction<Integer, Integer, Color> diagonal1 = (x, y) -> x.equals(y) ? Color.green : null;
BiFunction<Integer, Integer, Color> diagonal2 = (x, y) -> y.equals(N - 1 - x) ? Color.green : null;
BiFunction<Integer, Integer, Color> west_east = (x, y) -> x.equals(0) || x.equals(N - 1) ? Color.red : null;
BiFunction<Integer, Integer, Color> north_south = (x, y) -> y.equals(0) || y.equals(N - 1) ? Color.blue : null;
BiFunction<Integer, Integer, Color> all = (x, y) -> Arrays.asList(/* diagonal1,diagonal2, */west_east, north_south)
.stream().filter(bf -> bf.apply(x, y) != null).findFirst().orElse((x1, y1) -> null).apply(x, y);

public Canvas getCanvas() {
return new Canvas() {
private static final long serialVersionUID = 1L;
private final int wh = 500;

@Override
public void paint(Graphics g) {
int len = wh / N;
for (int y = 0; y < N; y++) {
for (int x = 0; x < N; x++) {
Color c = all.apply(x, y);
if (c != null) {
g.setColor(c);
g.drawOval(x * len, y * len, len, len);
}
}
}

double d = Math.sqrt(2.0 * (len / 2.0) * (len / 2.0));
double e = wh / 2.0 - len / 2.0;
g.setColor(Color.green);
for (int i = 0; i < N / 2 + 1; i++) {
g.drawOval((int) (e + d * i), (int) (e + d * i), len, len);
g.drawOval((int) (e - d * i), (int) (e - d * i), len, len);
g.drawOval((int) (e - d * i), (int) (e + d * i), len, len);
g.drawOval((int) (e + d * i), (int) (e - d * i), len, len);
}
}

@Override
public Dimension getPreferredSize() {
return new Dimension(wh, wh);
}
};
}

public static void main(String[] args) {
Kreismuster k = new Kreismuster();
JFrame jf = new JFrame("Kreismuster");
jf.add(k.getCanvas());
jf.pack();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
}
}[/CODE]

n=7
Unbenannt.png
 

MoxxiManagarm

Top Contributor

Wie zeichne ich die grünen Kreise?​

Ich liefere dir mal noch eine Erklärung zu der Lösung von @BestGoalkeeper. Ein grüner Kreis müsste dir klar sein, das ist der ganz in der Mitte. Dessen Mittelpunkt liegt genau auf der Mitte von dem Zeichencontainer. Der nächste Kreis liegt einen Durchmesser in 45° vom Mittelkreis entfernt. Das ist ein gleichschenkliges und rechteckiges Dreieck. Von diesem Dreieck benötigst du die Gegen- und Ankathade als Differenz in x- und y-Richtung. Da das Dreieck aber gleichschenklig ist reicht es den Wert einmal zu berechnen. Die Dreiecksberechung ruft den Satz des Pythagoras hervor, welche du bei @BestGoalkeeper wiederfindest.

d² = x² + y² = 2x² --> x = y = (d²/2)

1604649783616.png
 
B

BestGoalkeeper

Gast
Ohje, ist mir gestern gar nicht aufgefallen, aber @MoxxiManagarm hat vollkommen recht. Zeile 38 ließe sich einfacher schreiben:
Java:
                double d = Math.sqrt(len * len / 2.0); // Pythagoras
                double e = wh / 2.0 - len / 2.0; // Center x and y
//...
(Ich hatte einfach die angegebene Formel verwendet, ohne nachzudenken)
d Dach in @MoxxiManagarm s Zeichnung ist quasi das, was bei mir d ist - also die Länge die wir ein eine Richtung wandern.

Jetzt sollten alle Unklarheiten beseitigt sein :D
 

MoxxiManagarm

Top Contributor
Mir ist gerade noch aufgefallen, dass ja mit r gerechnet wird. Wie wir alle wissen ist d = 2r. Demnach ist nach obiger Formel

x = y = (d²/2) = ((2r)²/2) = (4r²/2) = (2r²)

Und dieser Term steht im übrigen auch so in der Aufgabenstellung. 🤭
 
B

BestGoalkeeper

Gast
Und was lernen wir aus dem Spaß? Die Diagonalen sind länger als die Seiten. 🤭
 

Ähnliche Java Themen

Neue Themen


Oben