2009-06-20 6 views
1

J'ai une tâche à dessiner un cercle et ensuite remplir avec le plus de cercles sans toucher les côtés. Je peux dessiner le cercle, et je peux faire des boucles pour emballer le cercle dans un format hexagonal/nid d'abeilles, mais je ne peux pas contrôler si elles sont à l'intérieur ou à l'extérieur du cercle.cercle emballage - java

J'ai utilisé ceci: g.drawOval (50, 50, 300, 300); pour spécifier mon cercle. Étant donné que je spécifie un carré en tant que mes limites, je ne peux pas déterminer où sont les limites du cercle. Donc, je suis en train d'emballer le carré plein de cercles plutôt que le cercle plein de cercles.

Est-ce que certains peuvent me diriger dans la bonne direction? Je suis nouveau à Java, donc je ne sais pas si j'ai fait cela dans le mauvais sens. Mon code est ci-dessous. J'ai une autre classe pour le cadre et une autre avec le principal dedans.

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




    } 
} 

Répondre

3

Tous ces nombres magiques me font un peu grincer des dents. Vous êtes novice en Java, et c'est un devoir, donc je comprends pourquoi vous le faites, mais je ne le recommanderais pas si vous faites beaucoup de programmation à l'avenir.

Vous avez besoin d'un algorithme ou d'une recette pour décider quand un petit cercle à l'intérieur tombe à l'extérieur du grand cercle que vous essayez d'emballer. Pensez aux façons dont vous pourriez faire:

  1. Si la distance entre le centre du grand cercle et le petit cercle est supérieure à la différence de leurs rayons, le petit cercle se chevauchent le grand cercle ou tomber complètement à l'extérieur.

Vous pouvez ajouter cette vérification à votre code: Juste avant de dessiner le cercle, effectuez cette vérification. Ne dessinez que si ce cercle passe.

Ne vous inquiétez pas pour Java une seconde; dessine-toi une image sur un morceau de papier, dessine ce cercle fermé et emballé et vois si cette affirmation est correcte. Pensez ensuite à toutes les situations de coin qu'il pourrait ne pas couvrir, juste comme une vérification.

Je vais faire deux autres recommandations. D'abord, faites-le à la main sans ordinateur une fois afin de voir à quoi ressemblera la «bonne» réponse. Deuxièmement, voyez si vous pouvez séparer le calcul des cercles de la partie de dessin. Cela pourrait faciliter votre travail, car vous pouvez vous concentrer sur une chose à la fois. C'est ce qu'on appelle la "décomposition". Vous résolvez des problèmes complexes en les décomposant en morceaux plus petits et plus faciles à gérer. Dans ce cas, il est également appelé "séparation vue-modèle". Vous pourriez avoir besoin de le savoir un jour. Peut-être qu'une autre façon de penser à ce problème serait d'imaginer une disposition 2D de cercles, emballés dans leur arrangement le plus proche, s'étendant à l'infini dans les deux directions x et y. Prenez maintenant votre cercle entourant, mettez-le au-dessus de l'arrangement 2D, et éliminez tous les cercles qui chevauchent le grand cercle. Je ne sais pas si ce sera optimal, mais c'est facile à visualiser.

+0

Merci. Je n'utilise généralement pas de nombres magiques, mais j'essaie juste de le faire fonctionner d'abord et ensuite je vais les changer plus tard. J'ai vraiment réfléchi à la façon dont vous y pensiez, mais je ne savais pas comment y arriver. Maintenant que vous l'avez mentionné, je ne peux pas croire que je n'ai pas vu. Je cherchais quelque chose de plus difficile et je me demandais en même temps quelles fonctions de la bibliothèque pourraient être disponibles et que je ne suis pas au courant. –

+0

Très bien, JR. Inquiétez-vous moins sur les bibliothèques et plus sur votre problème. Votre cerveau est le meilleur outil que vous avez. Si vous pouvez le faire sur papier, vous pouvez indiquer à un ordinateur ce qu'il doit faire. Vous allez trier rapidement, j'en suis sûr. – duffymo

Questions connexes