翻转坐标,就好像它们是网格一样

时间:2019-03-03 02:25:27

标签: python grid coordinates

我已经使用了很长时间,但是无法完成我想做的事情。我正在尝试找到一种基于对象列表及其坐标列表来翻转坐标的方法。

objects = [1, 2, 3, 4, 5]
grid_placement = [(0,0), (32, 0), (64, 0), (0, -32), (0, -64)]

我想获取它们所在位置的翻转轴坐标

因此理想的翻转Y输出本质上是:

placement = [(0, -64), (32, -64), (64, -64), (0, -32), (0, 0)]

理想的X翻转输出为:

placement = [(64, 0), (32, -64), (0,0), (64, -32), (64, -64)]

因此,基本上,如果某项位于右上角,则在翻转X后将位于左上角。它们的索引位置在列表中将保持不变,但坐标会更改。

我整理的代码在Y轴上工作正常,但我无法使X轴正常工作。搞几个小时,我的大脑有点炸了,任何外部建议都将不胜感激。

这是我的代码(混乱)

    gridSize = 32
    if axis == "x":
        columns = defaultdict(dict)

        for gridOffset in self.offsetList:
            row = gridOffset[1] // gridSize
            col = gridOffset[0] // gridSize
            columns[col][gridOffset] = row

        new_order = []
        order = list(reversed(list(columns.keys())))
        for col in order:
            for offset in self.offsetList:
                if offset in columns[col]:
                    new_order.append((col * gridSize, columns[col][offset] * gridSize))

    elif axis == "y":
        rows = defaultdict(dict)

        for gridOffset in self.offsetList:
            row = gridOffset[1] // gridSize
            col = gridOffset[0] // gridSize
            rows[row][gridOffset] = col

        new_order = []
        order = list(reversed(list(rows.keys())))
        for offset in self.offsetList:
            for row in order:
                if offset in rows[row]:
                    new_order.append((rows[row][offset] * gridSize, row * -gridSize))

    self.offsetList = new_order

1 个答案:

答案 0 :(得分:0)

您的示例建议您要交换对象坐标,而不是“翻转”它们。要实际在笛卡尔平面上翻转,您需要一个枢轴点。如果该点是(0,0),则翻转等于将要翻转的X或Y坐标的符号反转。

另一方面,如果要在对象之间交换坐标,请使用zip:

# vertical swap
grid_placement = [(F[0],B[1]) for F,B in zip(grid_placement, grid_placement[::-1])

# horizontal swap
grid_placement = [(F[1],B[0]) for F,B in zip(grid_placement, grid_placement[::-1])