Kreismuster auf Bestehendem Kreis erstellen

Nightx3

Mitglied
Guten Abend liebe Com. ich hab so ein kleines Problem in meiner Programmieren und muss einen Kreis erzeugen und diese als SVG datei ausgeben lassen, das Klappt auch soweit ganz gut der Kreis wird richtig ausgegeben.

Jetzt zu meinem eigentlichen Problem ich muss auf diesem Kreis ein Kreismuster erzeugen mit Löchern. Abstand und Durchmesser der Löcher muss vom Benutzer abgefragt werden und sollen dann im Kreis erstellt werden dies soll so oft passieren bis wir den Rand vom vorher Abgefragten " Hauptkreis" erreicht haben.
Ich habe aber absolut keine Ahnung wie man sowas realisieren soll.
ich hoffe ihr versteht mein Problem
 
Ein Loch liegt genau im Mittelpunkt des Bleches.
Die Mittelpunkte der weiteren Löcher sollen jeweils auf Teilkreisen liegen. Dabei sollen die
Durchmesser der Teilkreise in einer aufsteigenden Reihe aufeinander folgen.
Der Abstand zwischen den Teilkreisen soll beim Start des Programms vom Benutzer abgefragt
werden.
Das Programm muss prüfen, ob durch den Abstand zwischen den Teilkreisen und dem Durchmesser
der Löcher Überschneidungen auftreten könnten. Wenn dies der Fall ist, muss das
Programm eine Fehlermeldung ausgeben und nach neuen Werten fragen.

Hoffe jetzt versteht man das besser
 
Die Mittelpunkte der weiteren Löcher sollen jeweils auf Teilkreisen liegen. Dabei sollen die
Durchmesser der Teilkreise in einer aufsteigenden Reihe aufeinander folgen.
Ja, das sind konzentrische Kreise 🙂

Zum Rest ist mir noch nicht klar, welchen Abstand die Löcher, die auf einem "Teilkreis" liegen, voneinander haben sollen.
 
Gut, dann schauen wir uns das mal für einen Teilkreis an. Der habe den Durchmesser d. Der Umfang u ist dann Pi mal Daumen, also u=PI*d. Der Lochdurchmesser sei l (kleines L) und der Abstand a soll das fünffache des Lochdurchmessers sein, also a =5l. Dann passen in den Teilkreis u/a Löcher. Diese verteilt man nun gleichmäßig auf die 360° (2*PI) und erhält so einen Winkel von w = 2*PI/a.

Jetzt kann man mit cos und sin die x bzw. y-Koordinate des Lochmittelpunkts für das n-te Loch (n>=0) ausrechnen:
x = cos(n*w)*d/2
y = sin(n*w)*d/2

Das sollte es gewesen sein.
 
Dafür danke ich dir schonmal, hab jetzt gerade noch irgendwie ein Brett vor dem Kopf und mir fällt gerade keine Methode ein wie ich das dem Programm jetzt beibringe das es dies selbstständig anordnet hast du da eine Idee ? (sitze vermutlich auch schon zulange vor dem PC ) 😀
 
Mal schnell zusammengeschustert:

Java:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.Arc2D;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;

public class Test {
    private static class Canvas extends JPanel {
        private List<Shape> shapes = new ArrayList<>();

        public void add(Shape shape) {
            shapes.add(shape);
            repaint();
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            for (Shape shape : shapes) {
                g2.draw(shape);
            }
        }
    }

    private Canvas canvas;


    public void run() {
        canvas = new Canvas();
        for (int diam = 10; diam < 300; diam += 40) {
            drawCircles(150, 150, diam, 10);
        }
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(canvas);
        frame.setSize(800, 600);
        frame.setVisible(true);
    }

    private void drawCircles(double x, double y, double diameter, int holeDiam) {
        double radius = diameter / 2.0;
        double holeRadius = holeDiam / 2.0;
        canvas.add(new Arc2D.Double(x - radius, y - radius, diameter, diameter, 0, 360, Arc2D.OPEN));
        double circum = Math.PI * diameter;
        double holeDist = 5 * holeDiam;
        int holeCount = (int)(circum / holeDist);
        double angle = 2*Math.PI / holeCount;
        for (int i = 0; i < holeCount; i++) {
            double cx = x + Math.cos(i*angle)*radius;
            double cy = y + Math.sin(i*angle)*radius;
            Shape circle = new Arc2D.Double(cx - holeRadius, cy - holeRadius, holeDiam, holeDiam, 
                                            0, 360, Arc2D.OPEN);
            canvas.add(circle);
        } 
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 
Beachte, dass das nur eine erste, grobe Skizze ist. Ich verteile im Code z. B. die Kreise nach Anzahl, so dass sich ein Mindestabstand des Fünffachen Lochdurchmessers ergibt. Wenn genau der Abstand eingehalten werden soll, muss der Winkel exakt berechnet werden, was am Ende 2*holeDist / diameter ergibt. Um mal ein Beispiel zu nennen.
 
double angle = 2*Math.PI / holeCount;
Ich denke mit Abstand der Löcher ist der Abstand von Loch Rand zu Loch Rand gemeint. Es ergibt sich dann auch ein harmonischeres Muster.
1610991382757.png

Code von @mihe7 etwas nachbearbeitet.
[CODE lang="java" title="Mihes code" highlight="79-80"]import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.geom.Arc2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Test {
private final static int WIDTH = 800;
private final static int HEIGHT = 600;

private Canvas canvas = new Canvas();

@SuppressWarnings("serial")
private static class Canvas extends JComponent {
private List<Shape> shapes = new ArrayList<>();

public void add(Shape shape) {
shapes.add(shape);
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
Graphics2D g2 = (Graphics2D) g;
for (Shape shape : shapes)
g2.draw(shape);
}
}

public void run() {
addCircles(15, 5 * 15, 3.85);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(canvas);
frame.setSize(WIDTH, HEIGHT);
frame.setResizable(false);
frame.setVisible(true);
}

/**
* @param holeDiam
* Lochdruchmesser
* @param holeDist
* Abstand der Löcher am Kreis
* @param circleDist
* Abstand der Kreise
*/
private void addCircles(double holeDiam, double holeDist, double circleDist) {
double x = WIDTH / 2;
double y = HEIGHT / 2 - holeDiam;
canvas.add(getCircle(x, y, holeDiam));// add center hole
for (double diam = circleDist * holeDiam; diam < HEIGHT - 2 * holeDiam; diam += circleDist * holeDiam)
addCircleRing(x, y, diam, holeDiam, holeDist); // add circle with holes
}

private void addCircleRing(double x, double y, double diam, double holeDiam, double distance) {
canvas.add(getCircle(x, y, diam)); // add current ring circle
double radius = diam / 2.0;
double holeCount = getHoleCount(diam, holeDiam, distance);
double angle = 2 * Math.PI / holeCount;
for (int i = 0; i < holeCount; i++) {
double cx = x + Math.cos(i * angle) * radius;
double cy = y + Math.sin(i * angle) * radius;
canvas.add(getCircle(cx, cy, holeDiam)); // ring's holes
}
}

private static Shape getCircle(double x, double y, double diam) {
return new Arc2D.Double(x - diam / 2, y - diam / 2, diam, diam, 0, 360, Arc2D.OPEN);
}

private static int getHoleCount(double diam, double holeDiam, double distance) {
double circum = Math.PI * diam;
return (int) (circum / (holeDiam + distance));
}

public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new Test().run());
}
}[/CODE]
 

Zurück
Oben