Un peu d'aide sur un programme Java pour dessiner un arc-en-ciel
Je vais être franc à ce sujet; c'est un devoir à la maison, mais quelqu'un peut-il me guider dans la bonne direction et m'expliquer comment certaines parties du code sont censés travailler? Les directions sont ci-dessous le code et les questions.
C'est mon code pour l'instant:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Rainbow extends JPanel
{
//Declare skyColor:
private final Color skyColor = Color.CYAN;
public Rainbow()
{
setBackground(skyColor);
}
//Draws the rainbow.
public void paintComponent(Graphics g)
{
super.paintComponent(g);
int width = getWidth();
int height = getHeight();
//Declare and initialize local int variables xCenter, yCenter
//that represent the center of the rainbow rings:
int xCenter = width/2;
int yCenter = (height * 3) /4;
//Declare and initialize the radius of the large semicircle:
int largeRadius = width/4;
g.setColor(Color.RED);
//Draw the large semicircle:
g.fillArc(xCenter,yCenter,largeRadius,height,0,180);
//Declare and initialize the radii of the small and medium
//semicircles and draw them:
int smallRadius = height/4;
g.setColor(Color.MAGENTA);
g.fillArc(xCenter,yCenter,width,height,0,180);
int mediumRadius = (int) Math.sqrt(smallRadius * largeRadius);
g.setColor(Color.GREEN);
g.fillArc(xCenter,yCenter,width,height,0,180);
//Calculate the radius of the innermost (sky-color) semicircle
//so that the width of the middle (green) ring is the
//arithmetic mean of the widths of the red and magenta rings:
//Draw the sky-color semicircle:
g.fillArc(xCenter,yCenter,width,height,0,180);
}
public static void main(String[] args)
{
JFrame w = new JFrame("Rainbow");
w.setBounds(300, 300, 300, 200);
w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = w.getContentPane();
c.add(new Rainbow());
w.setVisible(true);
}
}
Mes questions: Comment fonctionne exactement fillArc travail; je comprends ce qui se passe dans le paramètre, mais que doit-on faire de sorte que chaque arc diffère de l'un à l'autre?
Comment peut-on définir une couleur pour chaque arc? J'ai essayé de le faire, et j'ai fini avec la couleur énumérées plus proche de la fin en montrant et en remplaçant les autres.
Je vais probablement avoir plus tant que je continue à code.
Ces directions:
![entrez la description de l'image ici][1]
“Arc-en-ciel” est composé de quatre demi-cercles qui se chevauchent. L'anneau extérieur est rouge (la Couleur.ROUGE), celui du milieu est vert (la Couleur.En VERT), et la bague intérieure a la couleur magenta (Couleur.MAGENTA). Au plus profond du demi-cercle a la même couleur que l'arrière-plan.
Suivez les instructions ci-dessous et de remplir les espaces vides dans Rainbow.java.
-
Démarrer le projet arc-en-ciel.
-
Ajoutez un commentaire d'en-tête avec vos nom, avant la déclaration de la classe dans le haut du fichier.
-
Ajouter à l'arc-en-ciel de la classe une déclaration de finale privée champ skyColor du type de Couleur, initialisé à la Couleur.CYAN (la couleur du ciel). Dans l'arc-en-ciel du constructeur, la fenêtre de l'arrière-plan de skyColor plutôt que la Couleur.BLANC.
-
Dans la méthode de peinture, de déclarer local des variables de type entier xCenter et yCenter que représentent les coordonnées du centre des anneaux. Les initialiser à 1/2 3/4 de la largeur et de la hauteur (vers le bas) de la fenêtre de contenu, respectivement. (Rappelons que l'origine des coordonnées graphiques en Java, dans le coin supérieur gauche de la fenêtre de contenu avec l'axe des y vers le bas.) Ne branchez pas des numéros fixes à partir de la fenêtre de dimensions.
-
Déclarer une variable locale largeRadius que représente le rayon de la plus grande (rouge) demi-cercle et l'initialiser à 1/4 de la largeur.
-
Un appel de méthode.g.fillArc(x, y, taille, taille, d', degrés) (avec tous les arguments entiers) dessine un secteur de cercle. x et y sont les coordonnées du coin supérieur gauche du rectangle (dans ce cas un carré) dans lequel l'ovale est (logiquement) inscrit; la taille est du côté de la place (et le diamètre du cercle); de est le point de départ de l'arc en degrés (de 0 à le point le plus oriental de la partie horizontale de diamètre), et les degrés (un nombre positif) est la mesure de l'arc, va dans le sens antihoraire. Ajouter une déclaration à la méthode de peinture pour attirer le plus grand (rouge) demi-cercle. Tester votre programme.
-
Ajouter pour afficher la moyenne (vert) et les petits (magenta) en demi-cercles. Le rayon du demi-cercle magenta doit être de 1/4 de la hauteur. Le rayon de la verte devrait être la moyenne géométrique (la racine carrée du produit du rayon du demi-cercle rouge et le rayon du demi-cercle magenta, arrondi à l'entier le plus proche. (Un appel aux Mathématiques.sqrt(x) renvoie la valeur de la racine carrée de x, d'un lit double.) Un nouveau test de programme.
-
Ajouter déclarations d'affichage au plus profond du demi-cercle de l'arrière-plan (“ciel”) couleur pour terminer l'arc-en-ciel. Utiliser le skyColor constante pour cette demi-cercle de couleur. Choisissez le rayon du ciel-couleur-cercle, de telle manière que la largeur de la moyenne (vert) de l'anneau est la moyenne arithmétique des largeurs de le rouge et le magenta anneaux.
-
Tester votre programme.
-
Soumettre votre programme et l'exécuter de sortie. Votre course de sortie (l'arc-en-ciel de l'image) peut être inclus par la capture de la sortie de l'écran (Alt-PrintScrn), de la coller dans un logiciel de graphisme (comme MS Paint) et puis enregistrer l'image sur votre projet Eclipse répertoire.
import java.awt.Color; import java.awt.Graphics; import java.awt.Container; import javax.swing.JFrame; import javax.swing.JPanel; public class Rainbow extends JPanel { //Declare skyColor: private final Color skyColor = Color.CYAN; public Rainbow() { setBackground(skyColor); } //Draws the rainbow. public void paintComponent(Graphics g) { super.paintComponent(g); int width = getWidth(); int height = getHeight(); //Declare and initialize local int variables xCenter, yCenter //that represent the center of the rainbow rings: int xCenter = width/2; int yCenter = (height * 3) /4; //Declare and initialize the radius of the large semicircle: int largeRadius = width/4; g.setColor(Color.RED); //Draw the large semicircle: g.fillArc(xCenter - largeRadius,yCenter - largeRadius ,largeRadius,largeRadius,0,180); //Declare and initialize the radii of the small and medium //semicircles and draw them: int smallRadius = height/4; int mediumRadius = (int) Math.sqrt(smallRadius * largeRadius); g.setColor(Color.GREEN); g.fillArc(xCenter-(largeRadius+mediumRadius)/2,yCenter- (largeRadius+mediumRadius)/2,mediumRadius,mediumRadius,0,180); g.setColor(Color.MAGENTA); g.fillArc(xCenter-(largeRadius+smallRadius)/2,yCenter-(largeRadius+smallRadius)/2,smallRadius,smallRadius,0,180); //Calculate the radius of the innermost (sky-color) semicircle //so that the width of the middle (green) ring is the //arithmetic mean of the widths of the red and magenta rings: int skyRadius = (int)((2 * Math.sqrt(smallRadius * largeRadius)) - width/4); //Draw the sky-color semicircle: g.setColor(skyColor); g.fillArc(xCenter-skyRadius,yCenter-skyRadius,skyRadius,skyRadius,0,180); } public static void main(String[] args) { JFrame w = new JFrame("Rainbow"); w.setBounds(300, 300, 300, 200); w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = w.getContentPane(); c.add(new Rainbow()); w.setVisible(true); } }
Vous avez une question à propos de quelque chose de spécifique que vous ne comprenez pas?
OriginalL'auteur user1629075 | 2012-10-04
Vous devez vous connecter pour publier un commentaire.
fillArc() remplit une section du cercle de base sur les paramètres que vous lui avez donné. Par exemple, si votre premier arc.
Vous êtes le dessin, le remplissage de l'arc, qui dans ce cas est un demi-cercle, de la couleur rouge.
Il y a notre fillArc. Qui n'a pas l'air comme un arc-en-ciel. Afin d'obtenir l'arc-en-ciel de la forme, nous devons tirer un petit arc à l'intérieur de lui. Dans votre cas, la prochaine est en vert. Donc, nous ne fillArc de nouveau après le réglage de la couleur au vert. Mais, nous avons diminué le rayon d'un peu de sorte que le vert ne permet pas de couvrir l'ensemble de la section rouge.
Garder à l'esprit lorsque l'on tire, nous sommes de dessin sur le dessus, donc si vous avez dessiné le vert sur le premier il serait couvert par le rouge.
Puis nous dessiner une autre arc à l'intérieur de ce une fois de plus, mais de ce faire un à la couleur du ciel (blanc dans ce cas). Cela crée le final de l'arc-en-ciel forme. Donc, nous ne fillArc de nouveau, mais avec un petit peu plus petit rayon et la couleur blanche.
Et là, nous avons dessiné un arc-en-ciel.
Au centre de cette belle création, nous avons à comprendre certaines choses sur la fillArc fonction.
Les paramètres sont les suivants:
int x, int y représentent les coordonnées du coin supérieur gauche de l'arc que vous dessinez. La raison que votre code n'est pas le centrage est à cause de la façon dont vous êtes le dessin de l'arc.
J'ai pris un peu de l'excès de trucs. Vous voyez comment vous êtes en soustrayant l' (largeRadius+smallRadius)/2 et (largeRadius+mediumRadius)/2? Ce décalage de l'arc-en-ciel pour le rendre hors du centre. Ce que vous devez avoir est plutôt:
Cela va du centre de l'arc-en-ciel. Voici pourquoi.
C'est le point où ils vont commencer le dessin de l'arc. Si vous voulez centrer l'ensemble de l'arc-en-ciel, vous aimeriez passer plus de la moitié de toute la largeur. Donc, si vous voulez le centre rouge de l'arc, vous feriez
Comme c'est le réglage du début de x vers la gauche par la moitié. Vous ne voudriez pas inclure largeRadius dans les autres arcs, comme vous êtes de centrage autour de ce point. Ainsi, vous voulez passer plus de la moitié de leur largeur, qui est pourquoi leurs positions x sont
Centrage sur l'axe des Y travaille différemment. Vous devez considérer que la hauteur de l'arc-en-ciel global est 1/4 de la largeRadius. Votre code utilise yCenter = 3/4 * en hauteur, de sorte que les modifications qu'il est un peu.
C'est ma solution
Jetons un coup d'oeil. J'ai soustrait le largeRadius/2 (et de rayons respectifs) pour le même principe que dans x. Mais ensuite, j'ai ajouté largeRadius/4, car nous devons passer l'ensemble de l'arc-en-ciel vers le bas. C'est parce que la soustraction de la respectifs rayon/2 seuls les centres de l'arc-en-ciel comme si c'était un cercle, pas de demi-cercles.
Ajoutant largeRadius/4 quarts de l'arc-en-ciel vers le bas par l'ensemble de la moitié de sa hauteur, en le centrant correctement pour un demi-cercle. Enfin, en soustrayant la hauteur/4 modifie la yCenter à hauteur/2, depuis 3/4 * hauteur est une exigence dans votre mission.
Désolé pour tous les problèmes dans les commentaires, j'espère que ça effacée.
Oh mon dieu, je pense que vous êtes en droit D:
Est le but de xCenter et yCenter juste pour localiser le point sur l'écran où le dessin va commencer?
Pensez à xCenter et yCenter que le centre du cercle, le demi-cercle est de.
J'ai fini la plupart de l'arc-en-ciel, mais je vais avoir du mal à obtenir le plus profond pour s'adapter à des conditions: Ajouter des instructions pour afficher les tréfonds du demi-cercle de l'arrière-plan (“ciel”) couleur pour terminer l'arc-en-ciel. Utiliser le skyColor constante pour cette demi-cercle de couleur. Choisissez le rayon du ciel-couleur-cercle, de telle manière que la largeur de la moyenne (vert) de l'anneau est la moyenne arithmétique des largeurs de le rouge et le magenta anneaux. Je vais poster mon code mis à jour dans la question.
OriginalL'auteur Clark
J'ai modifié une partie de votre code afin de vous faire une idée. Rappelez-vous que votre xCenter et yCenter représentent le centre de votre cercle, pas les coordonnées que vous devez utiliser dans le fillArc méthode. Les instructions que vous avez fourni expliquer assez bien. Vous pouvez avoir une idée de ce que j'ai fait ici, et figure le reste par vous-même.
Pour vous skyRadius considérer:
si j'ai fait le calcul rightyou obtenir: skyRadius = smallRadius - 2*(mediumRadius-smallRadius)+largeRadius-mediumRadius
OriginalL'auteur Robert P.
Beaucoup plus simple équation pour
skyRadius
est:OriginalL'auteur Eric Roy