DartBoard

KatKo

Mitglied
Guten Tag,
ich programmiere gerade ein Dartboard in Java. Zeichne mit Swing einfach die Kreise des Boards auf und habe mir auf dem äußeren Ring die Punkte errechnet an denen die Linien zum Mittelpunkt hin starten sollen. (siehe Bild)
Jetzt geht es aber ans einfärben. Nach ein wenig überlegen bin ich aber auf noch keine wirklich gute Methode gekommen um jedes Teilsegment(also da wo sich die jeweiligen Kreise mit den Linien kreuzen) zu färben...Am einfachsten wäre es meiner Meinung nach wenn ich irgendwie eine neue "shape" erstellen könnte welche dadurch definiert währe dass an einer der Linien bzw Kreise anliegt.
Jedoch weiß ich nicht wie man das machen sollte...
Oder irgendwie abfragen "wenn zwischen der und der Linie und zwischen dem und dem Kreis dann färbe Rot" zb...
Hätte jemand eine andere Idee wie ich das schlau anstellen könnte?
Vielen dank schon mal!!!
 

Anhänge

  • dartboard.PNG
    dartboard.PNG
    27 KB · Aufrufe: 1
Zuletzt bearbeitet:

Robert Zenz

Top Contributor
Du kannst ein Polygon erstellen welches die Flaeche angibt welche du faerben willst. Du musst dir dafuer "nur" die Eckpunkte von den Flaechen ausrechnen. Aber wenn ich dich richtig verstanden habe hast du das ohnehin schon fast soweit.

Achne, hab' die Rundungen vergessen...eventuell geht's mit einem Path, bin mir da aber gerade nicht sicher.
 

mihe7

Top Contributor
Du suchst vermutlich etwas in der Richtung:
Java:
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

public class Dartboard extends JComponent {
    private final int compartments = 20;
    private final double compartmentDegrees = 360 / compartments;

    // relative Groessenangaben
    private final int units = 18; 
    private final int INNER_BULL = 1;
    private final int OUTER_BULL = INNER_BULL + 1;
    private final int INNER_COMPARTMENT = OUTER_BULL + 7;
    private final int INNER_BORDER = INNER_COMPARTMENT + 1;
    private final int OUTER_COMPARTMENT = INNER_BORDER + 4;
    private final int OUTER_BORDER = OUTER_COMPARTMENT + 1;

    // Farbgebung
    private final Color BOARD = Color.BLACK;
    private final Color SMALL1 = Color.RED;
    private final Color LARGE1 = Color.BLACK;
    private final Color SMALL2 = Color.GREEN;
    private final Color LARGE2 = Color.LIGHT_GRAY;
    private final Color BULL_INNER = Color.RED;
    private final Color BULL_OUTER = Color.GREEN;

    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;

        double radius = getBoardRadius();        
        
        g2.setColor(BOARD);
        g2.fill(new Arc2D.Double(0, 0, radius*2, radius*2, 0, 360, Arc2D.PIE));

        double currentDegrees = 0;
        boolean toggle = false;
        while (currentDegrees + 1 < 360) {
            g2.setColor(toggle ? LARGE1 : LARGE2);
            g2.fill(createPie(OUTER_BORDER, currentDegrees));
            g2.setColor(toggle ? SMALL1 : SMALL2);
            g2.fill(createSector(OUTER_BORDER, OUTER_COMPARTMENT, currentDegrees));
            g2.setColor(toggle ? SMALL1 : SMALL2);
            g2.fill(createSector(INNER_BORDER, INNER_COMPARTMENT, currentDegrees));
            toggle = !toggle;
            currentDegrees += compartmentDegrees;
        }
        g2.setColor(BULL_OUTER);
        g2.fill(circle(OUTER_BULL));
        g2.setColor(BULL_INNER);
        g2.fill(circle(INNER_BULL));
    }

    private double getBoardRadius() {
        Insets insets = getInsets();

        int diameter = Math.min(getWidth() - insets.left - insets.right, 
                                getHeight() - insets.top - insets.bottom);
        return diameter / 2.0;
    }


    private Shape circle(double circleRadius) {
        double radius = getBoardRadius();
        double unit = radius / units;
        double shift = (units - circleRadius) * unit;
        double diameter = 2*(radius - shift);
        return new Arc2D.Double(shift, shift, diameter, diameter, 0, 360, Arc2D.CHORD);
    }

    private Shape createSector(double outer, double inner, double degrees) {
        Area sector = new Area(createPie(outer, degrees));
        sector.subtract(new Area(createPie(inner, degrees)));
        return sector;
    }

    private Shape createPie(double pieRadius, double degrees) {
        double radius = getBoardRadius();
        double unit = radius / units;

        double shift = (units - pieRadius) * unit;
        double pieDiameter = 2 * (radius - shift);
        
        return new Arc2D.Double(shift, shift, pieDiameter, pieDiameter,
                degrees - compartmentDegrees/2, compartmentDegrees, Arc2D.PIE);
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(new Dartboard());
        frame.setSize(600, 400);
        frame.setVisible(true);
    }   
}
 

KatKo

Mitglied
Du kannst ein Polygon erstellen welches die Flaeche angibt welche du faerben willst. Du musst dir dafuer "nur" die Eckpunkte von den Flaechen ausrechnen. Aber wenn ich dich richtig verstanden habe hast du das ohnehin schon fast soweit.

Achne, hab' die Rundungen vergessen...eventuell geht's mit einem Path, bin mir da aber gerade nicht sicher.
Auch danke für die Antwort, hab mich mal bisschen in Paths reingelesen, auch sehr interessant.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
cosmic Dartboard in JFrame umsetzen AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen


Oben