• Wir präsentieren Dir heute ein Stellenangebot für einen Frontend-Entwickler Angular / Java in Braunschweig. Hier geht es zur Jobanzeige

Kreismuster auf Bestehendem Kreis erstellen

N

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
 
mihe7

mihe7

Top Contributor
Du sollst auf konzentrischen Kreisen Kreise mit bestimmten Abstand zueinander anordnen?
 
N

Nightx3

Mitglied
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
 
mihe7

mihe7

Top Contributor
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.
 
mihe7

mihe7

Top Contributor
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.
 
N

Nightx3

Mitglied
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 ) :D
 
mihe7

mihe7

Top Contributor
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());
    }
}
 
mihe7

mihe7

Top Contributor
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.
 
Blender3D

Blender3D

Top Contributor
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.
Mihes code:
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());
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Neues Objekt mit Beziehung zu bereits bestehendem Objekt Java Basics - Anfänger-Themen 4
E Kreis soll eine Raupe darstellen Java Basics - Anfänger-Themen 37
C Kleinsten Kreis einer Punktmenge bestimmen Java Basics - Anfänger-Themen 4
UnknownInnocent Interface Kleine Kreise in großem Kreis anordnen Java Basics - Anfänger-Themen 3
Y Kreis auf einer Kreisbahn bewegen Java Basics - Anfänger-Themen 5
P Erste Schritte Kreis animieren Java Basics - Anfänger-Themen 2
A Kreisumfang/-Fläche vom Kreis berechnen Java Basics - Anfänger-Themen 39
H Kreis verschieben Java Basics - Anfänger-Themen 10
Z Object Kreis am Frame abprallen lassen! Java Basics - Anfänger-Themen 12
X Kreis/Linie Programmieren Java Basics - Anfänger-Themen 1
D Algorithmus für Punkte auf einem Kreis Java Basics - Anfänger-Themen 0
L Dreieck Kreis Java Basics - Anfänger-Themen 12
A Kreis,Radius Programm Java Basics - Anfänger-Themen 3
N Per Button Kreis zeichnen Java Basics - Anfänger-Themen 8
C Kreis nach Mausklick zeichnen Java Basics - Anfänger-Themen 5
A wie Kreis mit Schleife versetzten? Java Basics - Anfänger-Themen 25
O Punkte auf einem Kreis "wandern" lassen Java Basics - Anfänger-Themen 3
U Kreis um Textfelder zeichnen Java Basics - Anfänger-Themen 4
D Kreis mit Pfeiltaste bewegen Java Basics - Anfänger-Themen 3
K Bild auf Kreis packen Java Basics - Anfänger-Themen 2
E Kreis erstellen Java Basics - Anfänger-Themen 10
B Einen Kreis erzeugen Java Basics - Anfänger-Themen 3
S Erzeuge einen Kreis Java Basics - Anfänger-Themen 16
B Kreis,Punkt,Zylinder Java Basics - Anfänger-Themen 6
D Punktberechnung im Kreis Java Basics - Anfänger-Themen 15
TheKing Bild nur in Kreis sichtbar machen Java Basics - Anfänger-Themen 6
K Kreis mit neuer Position zeichnen Java Basics - Anfänger-Themen 3
M Umfang von Rechteck oder Kreis anhand der Parameter Java Basics - Anfänger-Themen 2
L Klickbarer Bereich in einem Kreis Java Basics - Anfänger-Themen 13
D kreis gelb gefüllt aber schwarzer rand. Java Basics - Anfänger-Themen 2
K Kreis Zeichnen ? Code Richtig aber keine Zeichung Java Basics - Anfänger-Themen 8
L Kreis der sich bewegt Java Basics - Anfänger-Themen 11
G Kreis auf JComponent zeichnen Java Basics - Anfänger-Themen 8
0 Klasse Kreis Java Basics - Anfänger-Themen 4
P Java-Applet, Kreis zeichnen Java Basics - Anfänger-Themen 4
E Kreis in Frame ,den man mit der Maus versetzen kann? Java Basics - Anfänger-Themen 2
7 Kreis zeichnen Java Basics - Anfänger-Themen 4
J Kreis herumfliegen & abprallen von Rändern Java Basics - Anfänger-Themen 7
G contains - Punkt in Kreis enthalten? Java Basics - Anfänger-Themen 6
A Kreis mit gedrückter Maustaste bewegen. Java Basics - Anfänger-Themen 2
S Thread - Kugel im Kreis hin-und herflitzen lassen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Anzeige

Neue Themen


Oben