You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据给定数字获取螺旋图案中的对应网格位置?

How to Map a Number to Its Position in a Spiral Grid

Hey there! Let's break down how to find the (x,y) coordinate for a given ID in the spiral grid you provided. First, let's understand the structure of this spiral—it's made up of concentric square "layers," and once we nail down which layer an ID belongs to, we can pinpoint its exact position.

Step 1: Identify the Layer of the ID

The spiral is built from layers starting at the center (ID=1, layer 0):

  • Layer 0: 1x1 square (only ID=1 at (0,0))
  • Layer 1: 3x3 square (IDs 2–9)
  • Layer 2: 5x5 square (IDs 10–25)
  • For any layer k, the square has a side length of 2k + 1, and covers IDs from (2k-1)² + 1 to (2k+1)² (for k ≥ 1)

To find which layer an ID is in, calculate the smallest k where (2k+1)² ≥ ID. You can compute this with a quick formula:

import math

def get_layer(id_num):
    if id_num == 1:
        return 0
    sqrt_id = math.sqrt(id_num)
    return math.ceil((sqrt_id - 1) / 2)

Example checks:

  • ID=6 → sqrt(6)≈2.45, (2.45-1)/2≈0.72 → ceil gives 1 (layer 1)
  • ID=21 → sqrt(21)≈4.58, (4.58-1)/2≈1.79 → ceil gives 2 (layer 2)
  • ID=16 → sqrt(16)=4, (4-1)/2=1.5 → ceil gives 2 (layer 2)

Step 2: Calculate Position Within the Layer

Once you have the layer k, we need to find where the ID sits relative to the layer's edges. Let's define some bounds first:

  • side_length = 2k + 1: Side of the layer's square
  • max_id = (2k+1)²: Largest ID in the layer
  • edge_length = side_length - 1 = 2k: Number of IDs per edge (excluding shared corners)
  • offset_from_max = max_id - id_num: How far the ID is from the layer's largest ID

Now, we can map the offset to one of four edges (matching your spiral's direction):

  1. Top Edge (moving left, y=-k): If offset_from_max < edge_length
    • x = k - offset_from_max
    • y = -k
  2. Left Edge (moving down, x=-k): If edge_length ≤ offset_from_max < 2*edge_length
    • adjusted_offset = offset_from_max - edge_length
    • x = -k
    • y = -k + adjusted_offset
  3. Bottom Edge (moving right, y=k): If 2*edge_length ≤ offset_from_max < 3*edge_length
    • adjusted_offset = offset_from_max - 2*edge_length
    • x = -k + adjusted_offset
    • y = k
  4. Right Edge (moving up, x=k): If 3*edge_length ≤ offset_from_max < 4*edge_length
    • adjusted_offset = offset_from_max - 3*edge_length
    • x = k
    • y = k - adjusted_offset

Working Code (Matches Your Sample)

Here's a function that puts it all together, tested against your example IDs:

import math

def spiral_position(id_num):
    if id_num == 1:
        return (0, 0)
    
    k = get_layer(id_num)
    max_id = (2*k + 1)**2
    edge_length = 2*k
    offset_from_max = max_id - id_num
    
    if offset_from_max < edge_length:
        # Top edge
        x = k - offset_from_max
        y = -k
    elif offset_from_max < 2 * edge_length:
        # Left edge
        adjusted_offset = offset_from_max - edge_length
        x = -k
        y = -k + adjusted_offset
    elif offset_from_max < 3 * edge_length:
        # Bottom edge
        adjusted_offset = offset_from_max - 2 * edge_length
        x = -k + adjusted_offset
        y = k
    else:
        # Right edge
        adjusted_offset = offset_from_max - 3 * edge_length
        x = k
        y = k - adjusted_offset
    
    return (x, y)

# Test your sample IDs
print(spiral_position(16))  # (2, -2) ✔️
print(spiral_position(19))  # (-1, -2) ✔️
print(spiral_position(20))  # (-2, -2) ✔️
print(spiral_position(21))  # (-2, -1) ✔️
print(spiral_position(6))   # (-1, -1) ✔️
print(spiral_position(4))   # (1, -1) ✔️

Quick Explanation

The spiral you shared counts IDs from the center outward in a clockwise direction. By breaking the grid into layers, we can isolate the edge an ID falls on, then calculate its exact (x,y) by measuring its distance from the edge's starting corner.

内容的提问来源于stack exchange,提问作者Justin808

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:07:47