math – 将正方形放置在笛卡尔平面上,并根据序列号计算出它们的X,Y坐标

一群人和我自己的工作人员试图围绕这个问题,但找不到一个干净,有效的数学方法来解决这个问题.这里是:

给定一个标准的笛卡尔平面和一系列图像(所有正方形和相同的维度,我们只说1个单位)我们如何组织它们,使它们绕着原点(0,0)旋转.左上角的飞机.但更具体地说,如果给出数字25(例如序列中的第25个方格),它的X是什么,Y坐标是什么?

希望这张粗糙的图像有助于解释序列.放置在网格上的第一个正方形将是红色,然后是蓝色,黄色,紫色,绿色,黑色,棕色,然后如点所示.

我们希望是否有一个“相对”简单的数学公式,但也许这是一厢情愿的想法.

最佳答案 (在编辑时:我添加了第二个函数,它可以直接获得笛卡尔坐标版本.)

在我的头部爆炸之前我已经走了这么远.它是闭合形式,它给出了百万分之一平方的坐标,而不需要将它们一个接一个地放在一个循环中.写下来不会给出一个很好的公式,但你可以写成一个8件的分段定义公式.答案以1为基础的网格坐标给出.第一个坐标指示您在y轴的右侧或左侧有多少个方格,第二个坐标显示向上或向下的距离.从这些数字可以比较容易地例如得到左上角的笛卡尔坐标.我用Python实现它:

from math import sqrt, ceil

def coordinates(m):
    n = ceil(sqrt(m)/2) #shell number
    i = m - 4*(n-1)**2 #index in shell
    if i <= n:
        return (n,-i)
    elif i <= 2*n-1:
        return (2*n - i, -n)
    elif i <= 3*n - 1:
        return (2*n - 1 - i, -n)
    elif i <= 4*n - 2:
        return (-n, -4*n + 1  + i)
    elif i <= 5*n - 2:
        return (-n, -4*n + 2 + i)
    elif i <= 6*n - 3:
        return (-6*n + 2 + i, n)
    elif i <= 7*n - 3:
        return (-6*n + 3 + i,n)
    else:
        return (n, 8*n -3 - i)

要从(i,j)网格坐标获得左上角的(x,y)笛卡尔坐标,可以使用以下函数,该函数具有可选的宽度参数以允许非单位正方形:

def cartesianFromGrid(i,j,w = 1):
    x = w * (i if i < 0 else i - 1)
    y = w * (j if j > 0 else j + 1)
    return (x,y)

可以直接获得左上角的笛卡尔坐标,而无需先通过网格坐标.由此产生的公式涉及较少的情况(因为我不需要从1直接跳到-1,反之亦然)虽然我在答案中保留了两个公式,因为在很多方面网格透视更自然:

def  cartCoordinates(m):
    n = ceil(sqrt(m)/2) #shell number
    i = m - 4*(n-1)**2 #index in shell
    if i <= n:
        return (n-1,-i+1)
    elif i <= 3*n - 1:
        return (2*n - 1 - i, -n + 1)
    elif i <= (5*n - 2):
        return (-n, -4*n + 2 + i)
    elif i <= 7*n - 3:
        return (-6*n + 2 + i, n)
    else:
        return (n-1, 8 * n - 3 - i)

输出为1-16:

>>> for n in range(1,17):
    print(n, ': grid coords =', coordinates(n),
          'Cartesian =',cartesianFromGrid(*coordinates(n)))


1 : grid coords = (1, -1) Cartesian = (0, 0)
2 : grid coords = (-1, -1) Cartesian = (-1, 0)
3 : grid coords = (-1, 1) Cartesian = (-1, 1)
4 : grid coords = (1, 1) Cartesian = (0, 1)
5 : grid coords = (2, -1) Cartesian = (1, 0)
6 : grid coords = (2, -2) Cartesian = (1, -1)
7 : grid coords = (1, -2) Cartesian = (0, -1)
8 : grid coords = (-1, -2) Cartesian = (-1, -1)
9 : grid coords = (-2, -2) Cartesian = (-2, -1)
10 : grid coords = (-2, -1) Cartesian = (-2, 0)
11 : grid coords = (-2, 1) Cartesian = (-2, 1)
12 : grid coords = (-2, 2) Cartesian = (-2, 2)
13 : grid coords = (-1, 2) Cartesian = (-1, 2)
14 : grid coords = (1, 2) Cartesian = (0, 2)
15 : grid coords = (2, 2) Cartesian = (1, 2)
16 : grid coords = (2, 1) Cartesian = (1, 1)

万一你想知道:

>>> coordinates(1000000)
(500, 1)

最后一个答案是有道理的,因为百万分之一的正方形是1000×1000正方形网格的顶点.

我使用上面的方法在tkinter画布小部件上放置彩色方块:

《math – 将正方形放置在笛卡尔平面上,并根据序列号计算出它们的X,Y坐标》

点赞