Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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
C++ 二维平铺世界中矩形的并集_C++_Stl_Computational Geometry_2d Games - Fatal编程技术网

C++ 二维平铺世界中矩形的并集

C++ 二维平铺世界中矩形的并集,c++,stl,computational-geometry,2d-games,C++,Stl,Computational Geometry,2d Games,我试图在二维平铺世界中找到一组相邻单元(行、列)(可转换为矩形)的边界多边形 在for循环中处理单元,并使用相邻单元的邻域属性,我可以消除所有内部边并存储其余边。 边存储在std::vector中 现在我需要合并有一个公共顶点和斜率相同的边。 合并边后,我需要从逆时针方向的顶点开始创建边界多边形 请帮助找到一种方法使之成为可能。我认为这是一个实现这一点的简单算法 我们将此作为输入: | | | | | | -+---+---+---+---+---+- | | |

我试图在二维平铺世界中找到一组相邻单元(行、列)(可转换为矩形)的边界多边形

在for循环中处理单元,并使用相邻单元的邻域属性,我可以消除所有内部边并存储其余边。 边存储在std::vector中

现在我需要合并有一个公共顶点和斜率相同的边。 合并边后,我需要从逆时针方向的顶点开始创建边界多边形


请帮助找到一种方法使之成为可能。

我认为这是一个实现这一点的简单算法

我们将此作为输入:

 |   |   |   |   |   |
-+---+---+---+---+---+-
 |   |   |   |   |   |
-+---+---+---+---+---+-
 |   |   | a |   |   |
-+---+---+---+---+---+-
 |   | b | c | d |   |
-+---+---+---+---+---+-
 |   |   | e |   |   |
-+---+---+---+---+---+-
 |   |   |   |   |   |
其中,
a
b
c
d
e
是作为成对向量(坐标)存储的输入分幅:

该算法的工作原理如下:

Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2),(0,2)} 

*---* 
|   |  
*   *-------*    
|           | 
*---*       |  
    |       |  
    *-------* 
  • 构建一个布尔数组,将整个瓷砖集包围起来。您必须遍历集合才能找到该矩形的边界。将表示集合平铺的数组位置设置为true,否则设置为false。
    示例中的输出为(T为
    true
    ,f为
    false
    ):

  • 现在必须遍历外壳多边形的边界。从标志数组中标记为
    true
    的第一个元素开始,使用以下规则沿相同方向移动顶点,直到再次到达第一个顶点:

    • 如果当前方向/位置前面的两个平铺为false,则顺时针旋转并将顶点添加到输出列表(多边形): (
      *
      是添加到多边形的顶点,
      X
      是当前顶点,箭头是当前方向)

    • 如果一个磁贴为假,一个为真,则朝同一方向移动(请注意,true false或false true表示您处于边框中):

    • 如果两个平铺均为真,则逆时针旋转并将顶点添加到输出列表中(请注意,真表示已到达平铺集的一部分,即“墙”):

  • 考虑事项: tilemap坐标与标志阵列坐标 flag数组表示放置平铺的平铺贴图的矩形区域。因此,其第一个元素(平铺)的平铺贴图坐标为
    (左,上)
    ,其中
    是所选平铺集的最小x坐标,
    是所选平铺集的最小y坐标

    在agorithm的第二步中,使用阵列作为向导,遍历一组瓷砖的边界(border)。请注意,您真正使用的是该数组,因此必须将坐标从标志坐标(逻辑坐标)转换为tilemap坐标(物理坐标)以存储多边形的顶点。当然这很容易

    还请注意,该算法提取的步骤是边缘顶点(物理平铺坐标),而不是逻辑坐标。您必须确定“我在那个顶点”是什么意思,以及“前进”和“转弯”在旗子数组坐标方面的含义

    边界条件和前瓷砖检查 我们已经定义了三条规则来沿着瓷砖组的边界前进。我们使用旗帜阵列作为指导来决定要做什么(前进、顺时针转动或逆时针转动)。请注意,当当前顶点位于数组的边框时,<>强>您可以(认为)它具有具有假值的相邻瓦片。 例如:

    +---+---+---+  
    | f | f | f |  |  
    *---+---*---+  |  
    | T | T | f |  v
    *---+---+---+  
    | f | T | f ]  
    +---+---X---+  
    

    +---+---+---+  
    | f | f | f |  
    *---+---*---+  <--
    | T | T | f |  
    *---+---+---+  
    | f | T | f ]  
    +---X---*---+  
    
    可能的优化 第一步计算标志数组,因为算法将选定的分片集作为向量。如果平铺引擎支持它,则可以向平铺添加属性(
    bool selected
    )并直接传递平铺贴图,避免计算和顶点坐标变换

    例子 给定此标志数组:

    +---+---+---+  
    | T | f | f |    
    +---+---+---+    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    执行工作如下所示(注意,图纸是执行步骤后的状态)

    Current position: (0,1)
    Polygon: {(0,1)} 
    
    +---+---+---+ ^ 
    | T | f | f | |  
    X---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (0,0)
    Polygon: {(0,1)} 
    
    X---+---+---+ ^ 
    | T | f | f | |  
    *---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (1,0)
    Polygon: {(0,1),(0,0)} 
    
    *---X---+---+ 
    | T | f | f |   
    *---+---+---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,1)
    Polygon: {(0,1),(0,0),(1,0)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---X---+---+ |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---X---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---+---X     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---X  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (3,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---X 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---+---X---* 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---X---+---* 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    *---*---+---* |   
    | T | T | T | |
    +---X---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2)} 
    
    *---*---+---+ 
    | T | f | f | 
    *---*---+---*    
    | T | T | T | <---
    X---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,1)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2),(0,2)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    X---*---+---* |   
    | T | T | T | |
    *---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
  • 找到第一个
    true
    tile。在这种情况下,
    (0,0)
    。因此,我们从它的一个顶点开始(例如,左下角的顶点,向上看)。请注意,因为它是第一个真正的平铺,所以可以使用该顶点,确保它属于多边形。因此将第一个顶点添加到多边形中):

  • 启动trasverse。在这种情况下,前面的分幅为
    假-真
    ,因此前进

    Current position: (0,1)
    Polygon: {(0,1)} 
    
    +---+---+---+ ^ 
    | T | f | f | |  
    X---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (0,0)
    Polygon: {(0,1)} 
    
    X---+---+---+ ^ 
    | T | f | f | |  
    *---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (1,0)
    Polygon: {(0,1),(0,0)} 
    
    *---X---+---+ 
    | T | f | f |   
    *---+---+---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,1)
    Polygon: {(0,1),(0,0),(1,0)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---X---+---+ |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---X---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---+---X     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---X  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (3,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---X 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---+---X---* 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---X---+---* 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    *---*---+---* |   
    | T | T | T | |
    +---X---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2)} 
    
    *---*---+---+ 
    | T | f | f | 
    *---*---+---*    
    | T | T | T | <---
    X---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,1)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2),(0,2)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    X---*---+---* |   
    | T | T | T | |
    *---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
  • 前面的瓷砖是
    false
    (我们在一个边框中),因此顺时针旋转并添加顶点:

    Current position: (0,1)
    Polygon: {(0,1)} 
    
    +---+---+---+ ^ 
    | T | f | f | |  
    X---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (0,0)
    Polygon: {(0,1)} 
    
    X---+---+---+ ^ 
    | T | f | f | |  
    *---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (1,0)
    Polygon: {(0,1),(0,0)} 
    
    *---X---+---+ 
    | T | f | f |   
    *---+---+---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,1)
    Polygon: {(0,1),(0,0),(1,0)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---X---+---+ |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---X---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---+---X     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---X  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (3,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---X 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---+---X---* 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---X---+---* 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    *---*---+---* |   
    | T | T | T | |
    +---X---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2)} 
    
    *---*---+---+ 
    | T | f | f | 
    *---*---+---*    
    | T | T | T | <---
    X---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,1)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2),(0,2)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    X---*---+---* |   
    | T | T | T | |
    *---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
  • 现在,前面的分幅是
    false
    (一个在数组之外,另一个是
    false
    顺时针旋转并添加顶点

    Current position: (0,1)
    Polygon: {(0,1)} 
    
    +---+---+---+ ^ 
    | T | f | f | |  
    X---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (0,0)
    Polygon: {(0,1)} 
    
    X---+---+---+ ^ 
    | T | f | f | |  
    *---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (1,0)
    Polygon: {(0,1),(0,0)} 
    
    *---X---+---+ 
    | T | f | f |   
    *---+---+---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,1)
    Polygon: {(0,1),(0,0),(1,0)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---X---+---+ |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---X---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---+---X     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---X  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (3,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---X 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---+---X---* 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---X---+---* 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    *---*---+---* |   
    | T | T | T | |
    +---X---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2)} 
    
    *---*---+---+ 
    | T | f | f | 
    *---*---+---*    
    | T | T | T | <---
    X---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,1)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2),(0,2)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    X---*---+---* |   
    | T | T | T | |
    *---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
  • 两个前瓷砖为
    true
    逆时针旋转并添加顶点

    Current position: (0,1)
    Polygon: {(0,1)} 
    
    +---+---+---+ ^ 
    | T | f | f | |  
    X---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (0,0)
    Polygon: {(0,1)} 
    
    X---+---+---+ ^ 
    | T | f | f | |  
    *---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (1,0)
    Polygon: {(0,1),(0,0)} 
    
    *---X---+---+ 
    | T | f | f |   
    *---+---+---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,1)
    Polygon: {(0,1),(0,0),(1,0)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---X---+---+ |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---X---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---+---X     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---X  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (3,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---X 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---+---X---* 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---X---+---* 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    *---*---+---* |   
    | T | T | T | |
    +---X---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2)} 
    
    *---*---+---+ 
    | T | f | f | 
    *---*---+---*    
    | T | T | T | <---
    X---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,1)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2),(0,2)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    X---*---+---* |   
    | T | T | T | |
    *---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
  • 一个磁贴是
    false
    ,另一个是
    true
    Advance

    Current position: (0,1)
    Polygon: {(0,1)} 
    
    +---+---+---+ ^ 
    | T | f | f | |  
    X---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (0,0)
    Polygon: {(0,1)} 
    
    X---+---+---+ ^ 
    | T | f | f | |  
    *---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (1,0)
    Polygon: {(0,1),(0,0)} 
    
    *---X---+---+ 
    | T | f | f |   
    *---+---+---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,1)
    Polygon: {(0,1),(0,0),(1,0)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---X---+---+ |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---X---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---+---X     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---X  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (3,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---X 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---+---X---* 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---X---+---* 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    *---*---+---* |   
    | T | T | T | |
    +---X---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2)} 
    
    *---*---+---+ 
    | T | f | f | 
    *---*---+---*    
    | T | T | T | <---
    X---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,1)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2),(0,2)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    X---*---+---* |   
    | T | T | T | |
    *---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
  • 两个
    false
    平铺(均不在阵列中):顺时针旋转并添加顶点

    Current position: (0,1)
    Polygon: {(0,1)} 
    
    +---+---+---+ ^ 
    | T | f | f | |  
    X---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (0,0)
    Polygon: {(0,1)} 
    
    X---+---+---+ ^ 
    | T | f | f | |  
    *---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (1,0)
    Polygon: {(0,1),(0,0)} 
    
    *---X---+---+ 
    | T | f | f |   
    *---+---+---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,1)
    Polygon: {(0,1),(0,0),(1,0)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---X---+---+ |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---X---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---+---X     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---X  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (3,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---X 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---+---X---* 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---X---+---* 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    *---*---+---* |   
    | T | T | T | |
    +---X---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2)} 
    
    *---*---+---+ 
    | T | f | f | 
    *---*---+---*    
    | T | T | T | <---
    X---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,1)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2),(0,2)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    X---*---+---* |   
    | T | T | T | |
    *---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
  • 一个
    true
    和一个
    false
    (数组外):Advance

    Current position: (0,1)
    Polygon: {(0,1)} 
    
    +---+---+---+ ^ 
    | T | f | f | |  
    X---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (0,0)
    Polygon: {(0,1)} 
    
    X---+---+---+ ^ 
    | T | f | f | |  
    *---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (1,0)
    Polygon: {(0,1),(0,0)} 
    
    *---X---+---+ 
    | T | f | f |   
    *---+---+---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,1)
    Polygon: {(0,1),(0,0),(1,0)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---X---+---+ |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---X---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---+---X     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---X  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (3,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---X 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---+---X---* 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---X---+---* 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    *---*---+---* |   
    | T | T | T | |
    +---X---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2)} 
    
    *---*---+---+ 
    | T | f | f | 
    *---*---+---*    
    | T | T | T | <---
    X---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,1)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2),(0,2)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    X---*---+---* |   
    | T | T | T | |
    *---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
  • 两个
    false
    (阵列外)前分幅:顺时针旋转并添加顶点

    Current position: (0,1)
    Polygon: {(0,1)} 
    
    +---+---+---+ ^ 
    | T | f | f | |  
    X---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (0,0)
    Polygon: {(0,1)} 
    
    X---+---+---+ ^ 
    | T | f | f | |  
    *---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (1,0)
    Polygon: {(0,1),(0,0)} 
    
    *---X---+---+ 
    | T | f | f |   
    *---+---+---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,1)
    Polygon: {(0,1),(0,0),(1,0)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---X---+---+ |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---X---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---+---X     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---X  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (3,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---X 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---+---X---* 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---X---+---* 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    *---*---+---* |   
    | T | T | T | |
    +---X---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2)} 
    
    *---*---+---+ 
    | T | f | f | 
    *---*---+---*    
    | T | T | T | <---
    X---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,1)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2),(0,2)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    X---*---+---* |   
    | T | T | T | |
    *---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
  • false-false
    (一个
    false
    和一个越界):顺时针旋转并添加顶点

    Current position: (0,1)
    Polygon: {(0,1)} 
    
    +---+---+---+ ^ 
    | T | f | f | |  
    X---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (0,0)
    Polygon: {(0,1)} 
    
    X---+---+---+ ^ 
    | T | f | f | |  
    *---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (1,0)
    Polygon: {(0,1),(0,0)} 
    
    *---X---+---+ 
    | T | f | f |   
    *---+---+---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,1)
    Polygon: {(0,1),(0,0),(1,0)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---X---+---+ |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---X---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---+---X     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---X  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (3,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---X 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---+---X---* 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---X---+---* 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    *---*---+---* |   
    | T | T | T | |
    +---X---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2)} 
    
    *---*---+---+ 
    | T | f | f | 
    *---*---+---*    
    | T | T | T | <---
    X---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,1)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2),(0,2)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    X---*---+---* |   
    | T | T | T | |
    *---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
  • true
    前瓷砖:逆时针旋转并添加顶点

    Current position: (0,1)
    Polygon: {(0,1)} 
    
    +---+---+---+ ^ 
    | T | f | f | |  
    X---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (0,0)
    Polygon: {(0,1)} 
    
    X---+---+---+ ^ 
    | T | f | f | |  
    *---+---+---+ |    
    | T | T | T |
    +---+---+---+  
    | f | T | T |  
    +---+---+---+  
    
    Current position: (1,0)
    Polygon: {(0,1),(0,0)} 
    
    *---X---+---+ 
    | T | f | f |   
    *---+---+---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,1)
    Polygon: {(0,1),(0,0),(1,0)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---X---+---+ |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---X---+     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1)} 
    
    *---*---+---+ 
    | T | f | f |   
    *---*---+---X     
    | T | T | T | --->
    +---+---+---+  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---X  
    | f | T | T |  
    +---+---+---+ 
    
    Current position: (3,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1)} 
    
    *---*---+---+ 
    | T | f | f | | 
    *---*---+---* |   
    | T | T | T | v
    +---+---+---+  
    | f | T | T |  
    +---+---+---X 
    
    Current position: (2,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---+---X---* 
    
    Current position: (1,3)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3)} 
    
    *---*---+---+ 
    | T | f | f |  
    *---*---+---*    
    | T | T | T | <---
    +---+---+---+  
    | f | T | T |  
    +---X---+---* 
    
    Current position: (1,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    *---*---+---* |   
    | T | T | T | |
    +---X---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,2)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2)} 
    
    *---*---+---+ 
    | T | f | f | 
    *---*---+---*    
    | T | T | T | <---
    X---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
    Current position: (0,1)
    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2),(0,2)} 
    
    *---*---+---+ 
    | T | f | f | ^ 
    X---*---+---* |   
    | T | T | T | |
    *---*---+---+  
    | f | T | T |  
    +---*---+---* 
    
  • 当前顶点是多边形的第一个顶点:执行已完成。结果如下:

    Polygon: {(0,1),(0,0),(1,0),(1,1),(3,1),(3,3),(1,3),(1,2),(0,2)} 
    
    *---* 
    |   |  
    *   *-------*    
    |           | 
    *---*       |  
        |       |  
        *-------* 
    

  • 因为瓷砖,这是一个特殊的c