Graphics 将选项板指定给图像的平铺,使其适合N个选项板(每个选项板有K种颜色)

Graphics 将选项板指定给图像的平铺,使其适合N个选项板(每个选项板有K种颜色),graphics,dynamic-programming,combinatorics,color-palette,gameboy,Graphics,Dynamic Programming,Combinatorics,Color Palette,Gameboy,我正在编写一个用于处理平铺图像的工具。一个功能是将整个图像转换为平铺集和平铺贴图,例如,160x144px图像将具有一组独特的8x8平铺和20x18平铺ID贴图 下一个目标是支持选项板。在一些使用平铺图形的旧平台上,可能有8个选项板,每个选项板有4种颜色,或者16个选项板中有16个。我想使用尽可能少的选项板,自动创建一组符合N-x-K限制的选项板;并将这些选项板指定给tilemap,如果不可能,则发出警报 有一些明显的第一步:如果任何一块瓷砖使用的颜色超过K,这是不可能的;一旦检查完毕,任何颜色

我正在编写一个用于处理平铺图像的工具。一个功能是将整个图像转换为平铺集和平铺贴图,例如,160x144px图像将具有一组独特的8x8平铺和20x18平铺ID贴图

下一个目标是支持选项板。在一些使用平铺图形的旧平台上,可能有8个选项板,每个选项板有4种颜色,或者16个选项板中有16个。我想使用尽可能少的选项板,自动创建一组符合N-x-K限制的选项板;并将这些选项板指定给tilemap,如果不可能,则发出警报

有一些明显的第一步:如果任何一块瓷砖使用的颜色超过K,这是不可能的;一旦检查完毕,任何颜色是另一个颜色子集的瓷砖都可以轻松共享其调色板。难点在于处理部分重叠的选项板。考虑17个瓷砖,每个有15个独特的颜色;如果有足够的重叠,它们可以放在16x16调色板中,但这可能是不可能的

我希望动态规划解决方案能在这里发挥作用。在问题的任何阶段,都会将部分瓷砖分配给调色板;决定是将下一个磁贴分配给N个选项板中的哪一个。(瓦片可能甚至没有任何颜色与当时的调色板的最佳选择相同;考虑4个瓷砖,每个都有4种独特的颜色,它们都可以使用一个16色调色板。)

这个问题已经解决了吗?是否有一个已知的算法,或者只是所有动态编程的一般提示?

能够为一些系统实现这一点,包括SNES(16个调色板,8种颜色/调色板)和GBC(8个调色板,4种颜色/调色板)。它也是开源的,所以他们的算法是可用的

事实证明,对于给定实际大小的图像,“足够好”的解决方案,动态规划是不必要的。(我不知道这对大型飞机有多好,但对我来说并不重要。)

这是他们算法到Python的翻译:

def优化调色板(tilepals,N,K):
"""
返回给定平铺集的优化调色板集。
tilepals——用于图像每个平铺的一组独特颜色的列表
N—一个图像的最大选项板数
K——一个瓷砖调色板的最大颜色数
"""
#检查每个瓷砖是否符合颜色限制
如果有(瓷砖中的长度大于K):
引发溢出错误,“一个磁贴具有%d种以上的唯一颜色”%K
#移除重复的瓷砖
集合=[]
对于瓷砖中的s:
如果不是成套的:
集合。追加
#删除作为其他瓷砖的适当子集的瓷砖
sets=[s表示集合中的s(如果没有)(c!=s和s.ISUBSET(c)表示集合中的c)]
#将瓷砖从最多颜色到最少颜色进行排序
set.sort(key=len,reverse=True)
#组合瓷砖,只要它们符合颜色限制
opt=[]
对于集合中的s:
对于加入opt的cs:
如果len(s | cs)N:
引发溢出错误,“有超过%d个选项板”%N
返回选项
能够在一些系统上实现这一点,包括SNES(16个调色板,8种颜色/调色板)和GBC(8个调色板,4种颜色/调色板)。它也是开源的,所以他们的算法是可用的

事实证明,对于给定实际大小的图像,“足够好”的解决方案,动态规划是不必要的。(我不知道这对大型飞机有多好,但对我来说并不重要。)

这是他们算法到Python的翻译:

def优化调色板(tilepals,N,K):
"""
返回给定平铺集的优化调色板集。
tilepals——用于图像每个平铺的一组独特颜色的列表
N—一个图像的最大选项板数
K——一个瓷砖调色板的最大颜色数
"""
#检查每个瓷砖是否符合颜色限制
如果有(瓷砖中的长度大于K):
引发溢出错误,“一个磁贴具有%d种以上的唯一颜色”%K
#移除重复的瓷砖
集合=[]
对于瓷砖中的s:
如果不是成套的:
集合。追加
#删除作为其他瓷砖的适当子集的瓷砖
sets=[s表示集合中的s(如果没有)(c!=s和s.ISUBSET(c)表示集合中的c)]
#将瓷砖从最多颜色到最少颜色进行排序
set.sort(key=len,reverse=True)
#组合瓷砖,只要它们符合颜色限制
opt=[]
对于集合中的s:
对于加入opt的cs:
如果len(s | cs)N:
引发溢出错误,“有超过%d个选项板”%N
返回选项