簡體   English   中英

在 java 中創建無盡的網格螺旋

[英]Create endless grid spiral in java

我想像這樣在 java 中創建無盡的螺旋:

無盡的螺旋

我只是想傳遞一個 1-∞ 的數字並得到它的螺旋形 map。

例子:

getPoints(0); 將導致答案 (0;0)

getPoints(5); 將導致答案 (-1;0)

用算法思考。 識別模式。

模式是你走圓周,一次一層。

  • 在第 0 輪中,您位於中心點(0,0)
  • 在第 1 輪中,您繞着它走 8 個牢房。
  • 在第 2 輪中,您繞着 16 個牢房走。
  • 在第 3 輪中,你繞着它走 24 個牢房。

現在看模式:

  • 每輪每邊多走2步,每輪總共多走8步。
  • 每輪從左上角右側的 1 個單元格開始。
  • 每邊行走從拐角處開始 1 個單元格。

所以,現在你看到了模式,你可以這樣做:

  • 計算你在哪一輪。
  • 對於這一輪,計算你在哪一邊。
  • 然后計算你在那一邊走了多少步。
  • 最后,從中計算坐標。
import java.util.Scanner;

class spiral 
{
    private static String getXZForMap(int np)
    {         
        // (dx, dy) is a vector - direction in which we move right now
        int dx = 0;
        int dy = 1;
        // length of current segment
        int segment_length = 1;

        // current position (x, y) and how much of current segment we passed
        int x = 0;
        int y = 0;
        int segment_passed = 0;
        if (np == 0){
            return ("(" + y + ";" + x + ")");
        }
        for (int n = 0; n < np; ++n) {
            // make a step, add 'direction' vector (dx, dy) to current position (x, y)
            x += dx;
            y += dy;
            ++segment_passed;

            if (segment_passed == segment_length) {
                // done with current segment
                segment_passed = 0;

                // 'rotate' directions
                int buffer = dy;
                dy = -dx;
                dx = buffer;

                // increase segment length if necessary
                if (dx == 0) {
                    ++segment_length;
                }
            }
        }
        return("(" + y + ";" + x + ")");
    }

    public static void main(String[] args){

        Scanner sc = new Scanner(System.in);
        int NUMBER_OF_POINTS = Integer.valueOf(args[0]);   // or delete this line  
        String spiral_map = getXZForMap(NUMBER_OF_POINTS); // and put your int here
        System.out.println(spiral_map);
    } 
}

改編自這個答案: Algorithm for iterate over an outpiration on a discret 2D grid from the origin

演示:

$ java spiral 0
(0;0)
$ java spiral 5
(-1;0)
public int[] getPoints(int n){ int[] k = new int[2]; if(n == 0){ k[0] = 0; k[1] = 0; return k; } n--; int r = (int) (Math.floor((Math.sqrt(n + 1) -1) / 2) + 1); int p = (8 * r * (r - 1)) / 2; int a = (1 + n - p) % (r * 8); switch ((int) Math.floor(a / (r * 2))) { case 0: k[0] = a - r; k[1] = -r; return k; case 1: k[0] = r; k[1] = (a % (r * 2)) - r; return k; case 2: k[0] = r - (a % (r * 2)); k[1] = r; return k; case 3: k[0] = -r; k[1] = r - (a % (r * 2)); return k; } return null; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM