Pergunta

Eu tenho uma tarefa para desenhar um círculo e, em seguida, preencher com a maior quantidade de círculos sem tocar os lados. Posso desenhar o círculo, e eu posso fazer loops para embalar o círculo em um formato hexagonal / favo de mel, mas não pode controlar se eles estão dentro ou fora do círculo.

Eu tenho usado este: g.drawOval (50, 50, 300, 300); para especificar o meu círculo. Dada Na verdade, estou especificando um quadrado como meus limites Eu não pode realmente determinar onde as fronteiras círculo são. Então, eu estou basicamente embalar a praça cheia de círculos em vez do círculo cheio de círculos.

Pode algum por favor me aponte na direção certa? Eu sou novo em java então não tenho certeza se eu fiz isso da maneira errada completa. Meu código está abaixo. Eu tenho outra classe para o quadro e outro com o principal nele.

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);
            }
        }




    }
}
Foi útil?

Solução

Todos esses números mágicos me fazer encolher um pouco. Você é novo para Java, e é a lição de casa, então eu entendo por que você está fazendo isso, mas eu não recomendo se você faz muita programação no futuro.

Você precisa de um algoritmo ou receita para decidir quando um pequeno círculo no interior cai fora da grande você está tentando embalar. Pense sobre as maneiras que você pode fazer isso:

  1. Se a distância entre o centro do grande círculo e o círculo pequeno é é maior do que a diferença de seus raios, o pequeno círculo irá sobrepor-se ao grande círculo ou cair completamente fora dele.

Você pode adicionar essa verificação ao seu código: Pouco antes de você desenhar o círculo, realizar esta verificação. Apenas chamar se que o círculo passa.

Não se preocupe em Java para um segundo; desenhar-se uma imagem em um pedaço de papel, desenhe que delimitador e círculo embalado, e ver se essa afirmação é correta. Então, pense sobre quaisquer situações de canto que pode não cobertura, assim como um cheque.

Eu vou fazer mais duas recomendações. Em primeiro lugar, fazer isso manualmente sem um computador, uma vez que você vai ver o que a resposta "certa" pode parecer. Em segundo lugar, veja se você pode separar o cálculo dos círculos da parte desenho. Pode fazer o seu trabalho mais fácil, porque você pode se concentrar em uma coisa de cada vez. É chamado de "decomposição". Você resolver problemas complexos quebrando-os em pedaços menores e mais gerenciáveis. Neste caso, também é chamado de "model-view separação". Você pode precisar de saber que algum dia.

Talvez uma outra maneira de pensar sobre este problema seria de imaginar um arranjo 2D de círculos, embalado em sua disposição mais próximo, estendendo-se até ao infinito, tanto no xey direções. Agora pegue seu círculo delimitador, colocá-lo em cima do arranjo 2D, e eliminar todos os círculos que se sobrepõem a grande círculo. Eu não sei se ele vai ser o ideal, mas é fácil de visualizar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top