Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在给定1-4个相邻连接的2维中查找匹配对象_Python_Algorithm_Modular - Fatal编程技术网

Python 在给定1-4个相邻连接的2维中查找匹配对象

Python 在给定1-4个相邻连接的2维中查找匹配对象,python,algorithm,modular,Python,Algorithm,Modular,背景 我试图在Maya中编写一些模块化样式代码(它是3D的,但我现在是2D样式),在这里创建一个对象,并使用每一侧(x,y,-x,-y)定义一个连接器。每侧可以有多个连接件,每侧可以有多个连接件/对象。连接器和对象上也有机会值,以确定生成它们的频率 如果我最终能够管理,我将使它能够生成自己的内容,因此在某种程度上这是项目的主干。这是我从自顶向下的视图中绘制的一个快速示例,它显示了对象名称和连接器名称,因此您可以看到我设计它的工作方式,目前是基于平铺的方式- 问题 我让选择代码的基本部分正常工作

背景
我试图在Maya中编写一些模块化样式代码(它是3D的,但我现在是2D样式),在这里创建一个对象,并使用每一侧(x,y,-x,-y)定义一个连接器。每侧可以有多个连接件,每侧可以有多个连接件/对象。连接器和对象上也有机会值,以确定生成它们的频率

如果我最终能够管理,我将使它能够生成自己的内容,因此在某种程度上这是项目的主干。这是我从自顶向下的视图中绘制的一个快速示例,它显示了对象名称和连接器名称,因此您可以看到我设计它的工作方式,目前是基于平铺的方式-

问题
我让选择代码的基本部分正常工作,它将获取一个对象,查找所有连接器,选择一个,查找所有具有匹配连接器的对象,然后选择一个,以实现无缝过渡。然而,我意识到这只在连接到单个块时有用,如果你有更多的块,它会导致问题,而拥有更多的块会使整个过程更加复杂

所以,如果有一个相邻的块,那么需要做的就是选择一个边。如果选择了“x”,只需说它已连接到“connector1”,代码将在“connector1”中搜索使用它的所有对象,选择一个,并将其放置在正确的位置。
现在,如果有两个相邻块,它需要找到与两侧的两个连接器匹配的内容。如果边是'x'和'y',连接器是'xconnector'和'yconnector',它需要搜索任何同时使用'xconnector'和'yconnector'且两边相邻的块,这意味着它可以是xy,-xy,x-y,-x-y,正常或镜像,因此有8种可能的匹配组合。
然而,它可能要复杂得多,特别是对于3或4个相邻的块,所以我需要编写一些东西来处理向它抛出的任何值



因此,基本上,我希望我已经解释得足够好了,但它有点超出了我的理解范围,因此如果有人对此有任何想法,我可以提供一些帮助:)

如果这会有所帮助,下面是我当前代码的一些部分,底部链接中有一个示例存储列表:
向列表添加/删除对象:
选择连接边(适用于单面):

输出存储的对象(用于了解发生了什么):

恐怕您的术语真的不清楚——我对链接的图像感到非常惊讶!例如,“在制作一个对象时,每边(x,y,-x,-y)定义一条‘边’”——在我忘记了“(x,y,-x,-y)”试图指定线段的端点后,这表明“对象”有4条“边”。但唯一有意义的方法是如果“object”=“tile”,这是我最初的想法,但我认为你的意思是一个对象类似于“一条河”或“一条路”。因此,是的,我更新了图像并尝试稍微改进术语,你对tile的想法完全正确,抱歉我解释得不够好,river的想法只是显示通过“river”连接器连接在一起的块的不同变体。我想你的意思是“它将在哪里放置一个对象,查找所有连接器,选择一个,查找所有具有匹配连接器的对象”“如果对象已占用一个或多个放置的磁贴,但尚未完成,请在该对象占用的磁贴上查找所有连接线,并且这些连接线尚未与另一个磁贴相邻,请选择一个,然后查找所有具有匹配连接线的磁贴类型“……无论如何,我认为你是对的——我会建立15个瓷砖列表,为所有4个边的{邻居在场,邻居缺席}的每个有效组合创建一个列表(总共有16个组合,但你永远不会尝试添加一个与任何边上的相邻瓷砖不相邻的瓷砖)。如果您以某种方式对连接器进行排序(可以是完全任意的,例如,通过为连接器分配不同的字符串或整数),并保持每个列表的排序(请参见下面的注释),则可以对这些列表进行二进制搜索,以快速找到有效的分幅。您的15个列表将具有不同数量的连接器约束(从1到4)。您需要一个多键(字典)排序来处理这些问题——例如,在“x存在,-y存在,y存在,rest不存在”的列表中,每个元素将由一个由3个连接器组成的数组组成,描述其约束,加上平铺本身的描述,而在“-y存在,rest不存在”的列表中每个元素将由一个连接器“约束”和平铺本身的描述组成。