如何处理随机值以获得xy坐标?

时间:2018-04-11 13:17:30

标签: python python-imaging-library

所以我尝试使用PIL绘制一些RGB值来创建图像。

我用于绘图的代码如下:

from PIL import Image, ImageDraw

class DrawDisplay(object):
    def __init__(self, size_x, size_y):
        self.size_x = size_x                                       #Length of the image
        self.size_y = size_y                                       #Width of the image
        self.img = Image.new("RGB", (self.size_x, self.size_y))    #Creates the drawing canvas
    def plot(self, xy, colour):
        d = ImageDraw.Draw(self.img)
        d.point(xy, colour)                                        #xy is co-ordinate in form of tuple, colour is rgb value in form of tuple
    def write(self, filename):
        self.img.save(filename)                                    #Saves image with the variable filename as the name

我知道上面的代码没有问题,因为我已经用以下代码进行了测试:

dd = DrawDisplay(64, 64)                                           #Utilises the drawing class
for i in range(64):
    for j in range(64):
        r = i * 4    #Pretty colours
        g = j * 4
        b = 0
        dd.plot((i, j),(r, g, b))                                  #Uses method from earlier with i and j as x and y
dd.write("testname.png")                                           #Saves the image as testname

如果我点击我的文件夹中的testname.png

,我会得到漂亮漂亮的图片

Like this

现在说我有一个无序数组,每个数字直到64 ^ 2或4096:

my_list = shuffle(range(4096))

现在这是我需要帮助的地方,我如何处理my_list中的每个值以使用公式/函数获得xy坐标元组?

以下是查看此问题的另一种方法:

想象一下4x4网格。如果我将1放入此函数,我的输出将是(1,1)(或者(0,0),如果你想使这个问题更简单。)

  1 2 3 4    #Visualised
1 1 - - -
2 - - - -
3 - - - -
4 - - - -

16作为输入将输出(4,4)(或(3,3)):

  1 2 3 4
1 - - - -
2 - - - -
3 - - - -
4 - - - 16

7输出(3,2)(或(2,1)):

  1 2 3 4
1 - - - -
2 - - 7 -
3 - - - -
4 - - - -

我的公式/功能是什么?

3 个答案:

答案 0 :(得分:0)

我认为应该这样做:

def idx2point(idx):
   return (idx/64,idx%64)

如果要从1而不是0开始计数,可以为每个坐标添加1。

答案 1 :(得分:0)

如果您有各种网格尺寸,那么这可以提供帮助。它不是最优雅的,但它有效

def fun(val, grid):
    pos = []
    for val in lst:
        x = val//grid[1]
        r = val%grid[1]
        if(r==0):
            pos.append([x, grid[1]])
        else:
            pos.append([x+1, val-(x*grid[1]])
   return pos

答案 2 :(得分:0)

我有另一个计算坐标的函数:

from math import floor, sqrt

def f(num):
    a = floor(sqrt(num))
    if a**2 == num:
        return (a, a)
    b = (num - a**2 + 1) // 2
    if num % 2 == a % 2:
        return (b, a+1)
    else:
        return (a+1, b)

这给出了以下结果:

f(1)
>>> (1, 1)
f(9)
>>> (3, 3)
f(10)
>>> (4, 1)
f(11)
>>> (1, 4)
f(12)
>>> (4, 2)