1

円を描いてから、側面に触れずに最も多くの円を塗りつぶすというタスクがあります。円を描くことはできますし、ループを作成して円を六角形/ハニカム形式でパックすることもできますが、それらが円の内側にあるか外側にあるかを制御することはできません。

私はこれを使用しました: g.drawOval(50, 50, 300, 300); 私のサークルを指定します。実際に境界として正方形を指定しているとすれば、円の境界がどこにあるかを実際に判断することはできません。だから私は基本的に円でいっぱいの円ではなく、円でいっぱいの正方形を詰めています。

正しい方向に向けてください。私はJavaが初めてなので、これを完全に間違った方法で行ったかどうかはわかりません。私のコードは以下です。フレーム用の別のクラスと、メインを含む別のクラスがあります。

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




    }
}
4

1 に答える 1

3

これらすべての魔法の数字は、私を少しうんざりさせます。あなたは Java の初心者であり、宿題なので、あなたが Java を使用する理由は理解できますが、将来多くのプログラミングを行う場合にはお勧めしません。

内側の小さな円が、パックしようとしている大きな円の外側にある場合を判断するためのアルゴリズムまたはレシピが必要です。これを行う方法について考えてみてください。

  1. 大きな円と小さな円の中心間の距離が半径の差よりも大きい場合、小さな円は大きな円に重なるか、完全に大きな円の外に出ます。

このチェックをコードに追加できます。円を描く直前に、このチェックを実行します。その円が通過した場合にのみ描画します。

Java について少し心配する必要はありません。一枚の紙に自分の絵を描き、それを囲んで詰まった円を描き、その記述が正しいかどうかを確認してください. 次に、チェックとして、カバーできない可能性のあるコーナーの状況について考えます。

あと2つおすすめします。まず、これをコンピューターなしで 1 回手で行い、「正しい」答えがどのように見えるかを確認します。次に、円の計算を描画部分から分離できるかどうかを確認します。一度に 1 つのことに集中できるので、仕事が楽になるかもしれません。「分解」といいます。複雑な問題をより小さく扱いやすい部分に分割することで、問題を解決します。この場合、「モデルとビューの分離」とも呼ばれます。いつかそれを知る必要があるかもしれません。

おそらく、この問題を考える別の方法は、x 方向と y 方向の両方に無限に広がる、最も近い配置に詰め込まれた円の 2D 配置を想像することです。次に、囲んでいる円を 2D 配置の上に置き、大きな円に重なっているすべての円を削除します。最適かどうかはわかりませんが、視覚化するのは簡単です。

于 2009-06-20T11:46:25.193 に答える