0
0

More than 1 year has passed since last update.

プログラミングで、2次元平面のある点の周囲の点の座標を表現する方法

Posted at

内容

タイトルの通りで、
プログラミングで、ある座標の周囲にある8つの点(8方位の点)をXY座標でどのように表すかという内容です。

原典はAtCoderの問題の解説です。 個人的に、解説の理解に時間を要したので、わかりやすく噛み砕いて説明しようと思います。

コード

SurroundingCoordinates.java
public class SurroundingCoordinates {
    public static void main(String[] args) {
        int x = 0;
        int y = 0;

        // (1)
        int[] distances = {-1,0,1};
        int size = 0;

        // (2)
        for(int dx : distances){
            for(int dy : distances){
                if(dx == 0 && dy == 0) continue;

                int x2 = x + dx;
                int y2 = y + dy;

                size++;

                //座標の出力
                System.out.println("("+x2+","+y2+")");
            }
        }

        System.out.println("size : "+size);
    }
}

解説

(1) 変数の宣言

表現したい座標たちはこのようになります。

8方位の座標.png

この8つの座標には見ての通り法則があり、
すべてのXY座標は以下の性質を組み合わせることで表現することができます。
中心からみてx座標が1つ左 or 等しい or 1つ右
中心からみてy座標が1つ下 or 等しい or 1つ上

SurroundingCoordinates.java
        int x = 0;
        int y = 0;

        //中心からみて座標が1つ下 or 等しい or 1つ上
        int[] distances = {-1,0,1};

(2) 処理

SurroundingCoordinates.java
        for(int dx : distances){
            for(int dy : distances){
                if(dx == 0 && dy == 0) continue;

                int x2 = x + dx;
                int y2 = y + dy;
            }
        }

まず、中央の座標と同じ点は無視します。

SurroundingCoordinates.java
                if(dx == 0 && dy == 0) continue;

そして、(1)のとおり、 x座標とy座標に加算する数の種類が3通りずつあるので 3×3 で 9通り の座標が出力されます。
3×3の場合のそれぞれについて処理を行うために、2重のfor文で処理しています。

(2) 出力

出力が(1)の画像と同じようになっていると思います。

(-1,-1)
(-1,0)
(-1,1)
(0,-1)
(0,1)
(1,-1)
(1,0)
(1,1)
size : 8

この処理を応用することで、複数の座標を処理することももちろん可能です。

参考文献

Minesweeper [AtCoder Beginner Contest 075 B] の解説 ↓

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0