2017-06-10 14 views
1

個人的なプロジェクトの一環として、正方形の格子(整数点の2乗)を生成する必要があります。ここでJavaで直立正方格子を生成する

コードです:

論理的
private ArrayList<Point> generateSquare(int area, Point center) { 
    int length = (int) Math.rint(Math.sqrt(area)); 
    Point startingPoint = new Point((int) Math.rint(center.getX() - (length/2)), (int) Math.rint(center.getY() - (length/2))); // get bottom left corner 
    ArrayList<Point> squarePoints = new ArrayList<>(); 
    for (int i = 0; i <= length - 1; i++) { // iterate for the length of the square 
     squarePoints.add(new Point(startingPoint.x + i, startingPoint.y)); 
    } 
    for (int i = 0; i <= length - 2; i++) { // iterate for the length of the square minus one since I already have the first row. 2 is subtracted to to account for index 0. This iterates for each row. 
     for (int j = 0; j <= length - 1; j++) { // iterates for the points in each row. Index 0 is needed, so length is minus one. 
      Point tempPoint = squarePoints.get(i); // gets the point to manipulate 
      squarePoints.add(new Point(tempPoint.x, startingPoint.y + j)); 
     } 
    } 
    return squarePoints; 
} 

、これは私がしようとしているものです:

  1. 私が生成される格子の中心点を与えています。 から、私は左下隅を見つけることができます。これは startingPointとして格納されます。
  2. 次に、正方形の長さについて を繰り返し、squarePointsと呼ばれるArrayList に新しいポイントを追加することによって、正方形のポイントの一番下の行を生成します。
  3. 次に、最初の行が既にあるので、 があるため、1の長さから1を引いて繰り返します。
  4. このforループの中で、私は再び正方形の長さを繰り返します。 ここでは、現在の反復の値のインデックスにあるsquarePoints ArrayListからのポイントであるtempPointを取得します。 これを行う理由は、 元の行からポイントを操作しているためです。次に、同じx 座標を持つ新しいポイントをtempPointとして追加し、y座標に startingPointプラス現在の繰り返しを加えます。

このプロセスの目的は、正方形の残りの行をすべて追加することです。

現在のところ、私が実行すると、不正なポイント数が返されます。他の誰かが私のコードで問題を特定し、より良い解決策を提供できることを期待しています。

また、これはコンソールアプリケーションであるため、AWTのPointクラスを使用することは悪い習慣ですか?

何か助けていただければ幸いです。

ありがとうございました。

+0

予想される結果は何ですか?正方形の領域内のすべての整数点?または周辺の点だけ? – c0der

答えて

0

次のコードは、ソリューションを提供していますが、ヨーヨーが間違っているかを調べる方法をお勧めしません。

private ArrayList<Point> generateSquare(int area, Point center) { 

    ArrayList<Point> squarePoints = new ArrayList<>(); 
    int length = (int) Math.sqrt(area); 
    System.out.println("length = "+length); 


    Point startingPoint = new Point((int) Math.rint(center.getX() - (length/2)), (int) Math.rint(center.getY() - (length/2))); // get bottom left corner 
    System.out.println("startingPoint = "+startingPoint); //is this bottom left ? 

    for (int i = 0; i <= (length - 1); i++) { // iterate for the length of the square 

     Point point = new Point(startingPoint.x + i, startingPoint.y); 
     System.out.println("First loop added "+ point); //does it add what expected ? 
     squarePoints.add(point); 
    } 

    //.....removed 
    return squarePoints; 
} 

単純なアプローチが可能に:minとmax X、Yの値を計算し、反復:

for (int x = minX; x <= maxX; x++) { 

     for (int y = minY; y <= maxY; y++) { 
      squarePoints.add(new Point(x,y)); 
     } 
    } 
関連する問題