私はこれについて率直になります。これは宿題ですが、誰かが私を正しい方向に導き、コードの一部がどのように機能するかを説明してくれますか?指示はコードと質問の下にあります。
これはこれまでの私のコードです:
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);
}
}
私の質問:fillArcはどのように正確に機能しますか。パラメータに何が含まれるかは理解していますが、各アークが互いに異なるようにするにはどうすればよいですか?アークごとに1つの色をどのように設定しますか?そうしようとすると、最後に最も近い色が表示され、他の色が上書きされてしまいました。コーディングを続けると、おそらくもっと増えるでしょう。
これらは方向性でした:
![ここに画像の説明を入力してください] [1]
「虹」は、4つの重なり合う半円で構成されています。外輪は赤(Color.RED)、中輪は緑(Color.GREEN)、内輪はマゼンタ色(Color.MAGENTA)です。最も内側の半円は背景と同じ色です。
以下の手順に従って、Rainbow.javaの空欄に記入してください。
Rainbowプロジェクトを開始します。
ファイルの先頭にあるクラス宣言の前に、自分の名前を含む完全なコメントヘッダーを追加します。
Rainbowクラスに、Color.CYAN(空の色)に初期化されたColorタイプのプライベート最終フィールドskyColorの宣言を追加します。Rainbowのコンストラクターで、ウィンドウの背景をColor.WHITEではなくskyColorに設定します。
paintメソッドで、リングの中心の座標を表すローカル整数変数xCenterおよびyCenterを宣言します。コンテンツペインの幅1/2と高さ3/4(下)にそれぞれ初期化します。(Javaのグラフィック座標の原点は、コンテンツペインの左上隅にあり、y軸が下を向いていることを思い出してください。)ウィンドウの寸法から固定数を差し込まないでください。
最大(赤)の半円の半径を表すローカル変数largeRadiusを宣言し、幅の1/4に初期化します。
g.fillArc(x、y、size、size、from、degrees)(すべての整数引数を使用)を呼び出すメソッドは、円の扇形を描画します。xとyは、楕円が(論理的に)内接する長方形(この場合は正方形)の左上隅の座標です。サイズは正方形の辺(および円の直径)です。fromは度単位の円弧の開始点(水平直径の最東端に0があります)であり、度(正の数)は反時計回りに進む円弧の測定値です。ペイントメソッドにステートメントを追加して、最大の(赤の)半円を描画します。プログラムをテストします。
ステートメントを追加して、中(緑)と小(マゼンタ)の半円を表示します。マゼンタの半円の半径は、高さの1/4にする必要があります。緑の半径は、赤の半円の半径とマゼンタの半円の半径の幾何平均(積の平方根)で、最も近い整数に丸められている必要があります。(Math.sqrt(x)を呼び出すと、xの平方根の値であるdoubleが返されます。)プログラムを再テストします。
虹を完成させるために、背景(「空」)の色の最も内側の半円を表示するステートメントを追加します。この半円の色にはskyColor定数を使用します。真ん中(緑)のリングの幅が赤とマゼンタのリングの幅の算術平均になるように、空の色の半円の半径を選択します。
プログラムをテストします。
完成したプログラムを送信し、出力を実行します。画面出力(Alt-PrintScrn)をキャプチャし、それをグラフィックプログラム(MSペイントなど)に貼り付けてから、画像をEclipseプロジェクトディレクトリに保存することで、実行出力(虹の画像)を含めることができます。
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); } }