Domanda

Ho il compito di disegnare un cerchio e poi riempire con il maggior numero di cerchi senza toccare i lati. Posso disegnare il cerchio e posso creare dei loop per imballare il cerchio in un formato esagonale / a nido d'ape, ma non posso controllare se si trovano all'interno o all'esterno del cerchio.

Ho usato questo: g.drawOval (50, 50, 300, 300); per specificare la mia cerchia. Dato che in realtà sto specificando un quadrato come i miei confini, non posso effettivamente determinare dove si trovano i confini del cerchio. Quindi fondamentalmente sto impaccando il quadrato pieno di cerchi piuttosto che il cerchio pieno di cerchi.

Qualcuno può indicarmi la giusta direzione? Sono nuovo di Java, quindi non sono sicuro di averlo fatto nel modo sbagliato. Il mio codice è sotto. Ho un'altra classe per il frame e un'altra con il main in esso.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class DrawCircle extends JPanel
{
    private int width, height, diameter;
    public DrawFrame d;

    public DrawCircle()
    {
        width = 400;
        height = 400;
        diameter = 300;
    }


    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(Color.blue);
        g.drawOval(50, 50, 300, 300);

        for(int i=50; i<200; i=i+20)
        {
            for(int j=50; j<350; j=j+10)
            {
                g.drawOval(j, i, 10, 10);
            }
        }

        for(int i=60; i<200; i=i+20)
        {
            for(int j=55; j<350; j=j+10)
            {
                g.drawOval(j, i, 10, 10);
            }
        }

        for(int i=330; i>190; i=i-20)
        {
            for(int j=340; j>40; j=j-10)
            {
                g.drawOval(j, i, 10, 10);
            }
        }

        for(int i=340; i>190; i=i-20)
        {
            for(int j=345; j>40; j=j-10)
            {
                g.drawOval(j, i, 10, 10);
            }
        }




    }
}
È stato utile?

Soluzione

Tutti quei numeri magici mi fanno rabbrividire un po '. Sei nuovo di Java, e sono i compiti, quindi capisco perché lo stai facendo, ma non lo consiglierei se farai molta programmazione in futuro.

Hai bisogno di un algoritmo o di una ricetta per decidere quando un piccolo cerchio all'interno cade al di fuori di quello grande che stai cercando di impacchettare. Pensa ai modi in cui potresti farlo:

  1. Se la distanza tra il centro del cerchio grande e il cerchio piccolo è maggiore della differenza nei loro raggi, il cerchio piccolo si sovrapporrà al cerchio grande o cadrà completamente al di fuori di esso.

Puoi aggiungere questo controllo al tuo codice: appena prima di disegnare il cerchio, esegui questo controllo. Disegna solo se quel cerchio passa.

Non preoccuparti di Java per un secondo; disegna te stesso su un pezzo di carta, disegna quel cerchio chiuso e impacchettato e vedi se quell'affermazione è corretta. Quindi pensa a qualsiasi situazione d'angolo che potrebbe non coprire, proprio come un controllo.

Farò altri due consigli. Innanzitutto, esegui questa operazione manualmente senza computer una volta, così vedrai che cosa "giusto" la risposta potrebbe apparire. In secondo luogo, vedere se è possibile separare il calcolo dei cerchi dalla parte del disegno. Potrebbe semplificarti il ??lavoro, perché puoi concentrarti su una cosa alla volta. Si chiama "decomposizione". Risolvi problemi complessi suddividendoli in pezzi più piccoli e più gestibili. In questo caso, viene anche chiamato "separazione vista modello". Potrebbe essere necessario saperlo un giorno.

Forse un altro modo di pensare a questo problema sarebbe quello di immaginare una disposizione 2D di cerchi, raggruppata nella loro disposizione più vicina, che si estende all'infinito in entrambe le direzioni xe y. Ora prendi il tuo cerchio che lo circonda, mettilo sopra la disposizione 2D ed elimina tutti i cerchi che si sovrappongono al cerchio grande. Non so se sarà ottimale, ma è facile da visualizzare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top