一群人和我自己的工作人员试图围绕这个问题,但找不到一个干净,有效的数学方法来解决这个问题.这里是:
给定一个标准的笛卡尔平面和一系列图像(所有正方形和相同的维度,我们只说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画布小部件上放置彩色方块: