2016-11-29 16 views
-1

クラスプロジェクトでは、文字の2D配列に三角形を描画する必要があります。アルゴリズム的に私はそれを行う方法を考えることができません。2D配列に三角形を描画する方法(Java)

私の現在のコードは、(それは動作しません)これです:

public void fill() { 
     for (int i = 0; i < h; i++) { 
      double x=h; 
      while(x<=0){ 
       drawing.setPoint(i, x, myChar); 
       x=Math.ceil(x/2); 
      } 
     } 
    } 

私は、出力は次のようになりたい:

....*.... 
...***... 
..*****.. 
.*******. 
********* 

私たちはどんな既存を使用することはできません描画に関連するメソッドまたはクラス。

ご協力ありがとうございました

+1

期待している出力は何ですか? – bradimus

+0

@bradimus私はそれを更新しました –

+0

h <= 0でない限り、あなたはwhileループを入力することはありません。そうであればforループも入力しません。 – dogwin

答えて

3

図面に基づいて、5行に9列が必要です。だから、

int height = 5; 
int width = 2*height - 1; 

は、私はdrawing.setPoint(i, x, myChar);が何をするかわからないにもかかわらず、私は、この例では、あなたが軌道に乗るだろうと思います。私はcharに基づいてStringを作ります。

char fill = '*'; 
char blank = '.'; 

私は0で行を開始しますが、1で列を開始して、数学を少し明確にします。

row = 0の場合、....*....には、column = 5に1つの星座が必要です。

row = 1の場合、...***...には、column = 4,5,6に3つの星が必要です。

row = 3の場合、.*******.には、column = 2,3,4,5,6,7,8に7つの星が必要です。 height = 5column j間の距離は以下iと等しい場合row iのためにあなたがcolumn jで星を必要とする

注意してください。 | height - column | <= row

for (int row = 0; row < height; row ++) { 
    StringBuilder line = new StringBuilder(width); 
    for (int column = 1; column <= width; column ++) { 
     char out = Math.abs(column - height) <= row ? fill : blank; 
     line.append(out); 
    } 
    System.out.println(line); 
} 

これは

....*.... 
...***... 
..*****.. 
.*******. 
********* 

を生成するときには、私はあなたの例では、Math.ceilを持っているので、あなたがMath.absを使用できることを前提としています。そうでない場合はMath.absifに変更することができます。

1

これに対処する方法はたくさんあります。また、行単位で画像を描画する答えが1つあります。

char[][]を作成し、その配列の配列内の文字を画面に表示するルーチンをすでに持っていると仮定します。あたかも既にsetPoint()メソッドを持っているかのように見えて、構造体にポイントを突き刺します。

初心者として、私はそれがあなたに解決策を与えるのに役立つとは思わない。自分自身で解決するには、正しい方向を指す必要があります。

多くの経験豊富なコーダーでは、テストドリブンデザインを使用しています。これから学ぶことができます:単純なケースから始め、そのテストを作成し、そのテストをパスし、書き込むテストがなくなるまで。

最後に、jUnitのようなテストフレームワークを学ぶ必要がありますが、今はプログラムを実行するだけで "テスト"できます。だから最初のテストは、それはheight == 1のために働くのですか?

あなたはと(今その手段のために、プログラムを実行し、出力が右に見えることを確認)このテストに合格することができます

public void drawTriangle(int height) { 
     drawing.setPoint(0,5,'*') 
    } 

仕事を行って。

それはheight==2のために働くようにする:

public void drawTriangle(int height) { 
     drawing.setPoint(0,5,'*'); 
     if(height == 2) { 
     drawing.setPoint(1,4,'*'); 
     drawing.setPoint(1,5,'*'); 
     drawing.setPoint(1,6,'*'); 
     } 
    } 

これはまだheight == 1のために動作しますが、またheight == 2のために働きます。

しかし、ループがこれらの3つのコマンドを2番目の行に置き換える機会をすぐに見ることができます。だから、:

public void drawTriangle(int height) { 
     drawing.setPoint(0,5,'*'); 
     if(height == 2) { 
     for(int 4; i<7; i++) { 
      drawing.setPoint(1,i,'*'); 
     } 
     } 
    } 

...そして、あなたはメソッドにそれを引き出すことができます。これは、リファクタリングと呼ばれている

public void drawTriangle(int height) { 
     drawing.setPoint(0,5,'*'); 
     if(height == 2) { 
      drawRow2(); 
     } 
    } 

    private void drawRow2() { 
     for(int 4; i<7; i++) { 
     drawing.setPoint(1,i,'*'); 
     } 
    } 

- 働く何かを書くことが、最善の方法を書かれていませんそれが動作することを確認するためにテストし、一度に1ステップずつ書かれた方法を変更するので、それはまだ動作しますが、ちょっとした方法で動作します。

うまくいけば、これがどこにあるのか分かります。 drawRow2()をより一般的なもの(drawRow(int rowNumber))に変更し、その中のリテラル番号を徐々にrowNumberから派生した変数に置き換えることができます。次に、drawRow(0)を使用して最初の行を描画し、drawRow(1)を使用して2番目の行を描画することができます。次に、drawRow(2)を追加して3行の三角形を描くことができます。そして、代わりにループを使用して改善することができます。

関連する問題