ich habe ein wenig versucht, mit Swing-Zeichnen,
links in etwa wie vorgegeben in Grau, in der Mitte runde Ecken ohne viel Fortschritt,
rechts mit etwas Aufhellung zu den Ecken hin, bisher nur für die Kante oben links (+ unten rechts),
immerhin einige Abschwächung des Effekts, finde ich,
vielleicht mit manch Parameteränderung noch besser zu machen,
wobei auch Gefahr dass es zu hell wird so dass unnatürliche helle Linie im Bild
Code dazu, der nun wirklich nicht zu empfehlen ist, nur bei starken Interesse an Weiterarbeit
lieber nicht öffnen, Leser haften für ihre Augen
[spoiler]```public class Test2
{
static int height = 400;
public static void main(String[] args)
{
JFrame f = new JFrame();
f.add(new TestPanel());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(height * 4, height + 100);
f.setVisible(true);
}
}
class TestPanel
extends JPanel
{
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
// Anzahl Stufen
int n = 30;
int k = 200 / n;
int max = Test2.height;
int p = max / n;
int p2 = max / 2 / n;
Color[] allC = new Color[255];
for (int i = 0; i < 255; i++)
allC** = new Color(i, i, i);
// Stufen-Farben
Color[] cc = new Color[n];
int ccc = 230;
for (int i = 0; i + 10 < n; i++)
{
cc** = new Color(ccc, ccc, ccc);
ccc -= k;
}
for (int i = n - 10; i < n; i++)
cc** = cc[n - 11];
// linkes Quadrat
int min = 0;
int w = max;
for (int i = 0; i + 10 < n; i++)
{
g.setColor(cc**);
g.fillRect(min, min + 40, w, w);
min += p2;
w -= p;
}
// mittleres Quadrat
min = 0;
w = max;
int shiftX = (int)(max * 1.1);
int d2 = max / n;
int r = max / 2 / n;
int d = d2 * 2;
for (int i = 0; i + 10 < n; i++)
{
g.setColor(cc**);
int x = min + shiftX;
int y = min + 40;
// zwei Rechtecke, Ecken für Viertelkreise frei gelassen
g.fillRect(x + r, y - p2, w - d2, w + p);
g.fillRect(x - p2, y + r, w + p, w - d2);
// 4 Viertelkreise
int xArc = x - p2;
int yArc = y - p2;
int wArc = w - d2;
g.fillArc(xArc, yArc, d, d, 90, 90);
g.fillArc(xArc + wArc - 1, yArc, d, d, 90, -90);
g.fillArc(xArc + wArc - 1, yArc + wArc - 1, d, d, 270, 90);
g.fillArc(xArc, yArc + wArc - 1, d, d, 270, -90);
min += p2;
w -= p;
}
// drittes Quadrat
min = 0;
w = max;
shiftX = (int)(max * 2.222);
int intv = 1 + (max / 2 / n);
// Breite des Bereichts in der Ecke der aufgehellt wird, variable
int gr = 30;
int tGr = gr * gr;
for (int i = 0; i < max; i++)
{
for (int j = 0; j < max; j++)
{
int x = i + shiftX;
int y = j + 40;
// Grund-Stufe bestimmen
int km = Math.min(i, j);
km = Math.min(km, max - i);
km = Math.min(km, max - j);
int index = km / intv;
Color c = cc[index];
// falls i und j nahe beieinander, dann aufhellen,
// nur eine der Diagonalen im Moment
int ab = Math.abs(i - j);
if (ab < gr && index > 0)
{
int maxC = cc[index - 1].getBlue();
int minC = cc[index].getBlue();
if (minC != maxC)
{
// quadrieren, sehr nahe an Diagonale stärker aufhellen
int ab2 = 100 * ((gr - ab) * (gr - ab)) / tGr;
int nc = minC + ab2 * (maxC - minC) / 100;
c = allC[nc];
}
}
g.setColor(c);
g.drawLine(x, y, x, y);
}
}
}
}```[/spoiler]