按:笔者此时已经完成了一个不完美的版本,已经把笔者的真实的七巧板解法算到了216 个,应该是不重复的。至于是不是还有更多的解法,目前不知道。因为我的算法的某些情况没有处理,因此不是一个完美的做法。本着循序渐进的宗旨,介绍一下笔者使用的自定义的类。

多边形的传统表示使用点集,至少三个点。为了便于多边形的各种计算,笔者采用了一种具有方向的结构来表示,即链表结构。请参考如下代码:

public class TangramPolygon{public readonly Vertex[] m_VertexArr;// The set of all the vertex of the polygon public readonly PointF[] m_OrgPointArr;// The set of all the vertex of the polygon public int firstPntIdx;// used to recored the first point of the polygon which is is dynamic onepublic bool bArrayOrgOrder = true;// the the oder of the array elements , true: the original oder, false after fliped.public bool bFliped = false;// if the polygon has been fliped. public int usingIdx;// the index that is being used to match the box, based from 0public TangramPolygon usingBoxPlg;// the box polygon is being used.public TangramPolygon mountedPlg;// the part polygon is being fixed or set, used to draw the last diagrame.private Dictionary<int, TangramPolygon> m_AllStatesPlg ; // record all of the rotated and flipped unique from of this parent polygonprivate int m_StatePlgIndex;// the index of the state polygon being used....}

其中用到的 Vertex 定义如下:

public class Vertex{public Vertex(){m_Point = new PointF();}public PointF m_Point;public int idx;public int last_idx;public int next_idx;}

根据Vertex的定义,就可以建立一个链表结构。
这个结构就是一个普通形式的链表结构,下面把 TangramPolygon 中的几个关键成员变量介绍一下

m_OrgPointArr 原始点的数组,所谓原始点就是没有经过计算的原始数据点。在计算过程当中,除非指定,不参与旋转平移等坐标变换。

firstPntIdx: 目前定义是值得多边形的top-left点(屏幕坐标系)对应的点的下标编号,即索引值。在初始状态下,一般都是0. 但是经过旋转之后,可能会发生变化。

bArrayOrgOrder : 指的是m_VertexArr 中的点的顺序是否可初始状态一致,一致则为true。 初始状态的点的顺序是逆时针方向的。

bFliped : 这个多边形是否经过翻转运算。

usingIdx:指得是点或边的索引,这个索引标明在进行多边形匹配时的启示匹配边的索引。
usingBoxPlg:如果这个部件多边形已经放入了盒子中,该值记录的是放入时盒子空余部分的多边形。

如图示:

红色区域是F部件要放入的区域(包括F那个区域, 即下图中的红色区域),这个区域就是usingBoxPlg。 它用于重复摆放,便于回溯。


mountedPlg: 即安装好的多边形,即上图中的F。用于记录中间过程,回放时会使用。
m_AllStatesPlg : 这是几个本多边形进行旋转和反转后的多边形字典,目的是提前做好准备,这样在具体摆放时不用在进行旋转和反转计算。事实证明,这样做将速度提高近100倍。

说明:本人采用的算法要按照一定的顺序,从某条边开始匹配盒子多边形;很显然,有的多边形的第一边和其余变边在反转和旋转后并没有任何区别,例如一个正方形,因此正好行的贴合匹配计算只要看一条边就够了。根据这种思想,可以事先计算好旋转和翻转后的多边形,然后记录本变量中。这种多边形,我命名为stateboxplg
m_StatePlgIndex: 上述多边形在m_AllStatesPlg 中索引(键值)

这个类里面还有很多函数,暂不介绍。

今天是51, 北京为了清零,为了为了什么,所有餐饮业暂停营业。

maraSun 于 BJFWDQ

2022-05-01

祝大家五一快乐!

七巧板复原算法——多边形的表示相关推荐

  1. 七巧板复原算法探讨之二——七巧板的表示

    通常意义的七巧板就是个多边形,凸的或者凹的,因此只要确定了顶点,这个七巧板就确定了.简单查了一下多边形的表示方法,我决定采用顶点表示法,再加上考虑后面的计算需要,初步采用下面的链表结构,C# 表示法. ...

  2. 七巧板复原算法——计算机图形学基本算法之一, 点在多边形内部的判断

    注:此时我已经完成了一个演示版本,但是为了文章的渐进性,我将把开发过程一步步的写出来,用来记录. 本实验代码用到的图形学关系和算法列举如下: 基本计算机图形学关系和算法 1.点在多边形内部的 点在多边 ...

  3. 七巧板复原算法之小结局——给出一个最大结果集

    按:之所以用小结局而非大结局,因为笔者的解法并没有给出理论上的全部解,只是给出了大部分解法. 算法描述如下 #1 初始化 #完成七巧板组件的初始化以及盛放七巧板的容器的初始化: #2 采用DFS 方法 ...

  4. 七巧板复原算法——摆放和贴合算法的改进

    写了一点基础代码了,例如点在线段上的判断,线段相交的判断等等.(当然还是上网查了一下,没有自己推导,发现的确有更好的数学方法,谢谢各味图形学达人) 前文说到了摆放和贴合等等,用的基准图是下图中的 G1 ...

  5. 七巧板复原算法之四——边沿贴合和空腔查找

    越想越复杂啊,一个一个的来吧.根据上文的讨论,把新的七巧板部件进行拼接时,可能会围成新的空腔,也可能是多个空腔,如图示: 空腔查找 G3-G5 都是摆放部件后形成的新的空腔,要把这些多边形找出来,并放 ...

  6. 七巧板复原算法之三——摆放算法

    假设我们已经进行了一定的步骤,此时七巧板的摆放情况如下图示: 红色部分已经完成摆放的区域,蓝色部分是空的区域,分别用G1和G2表示.根据我们的人工摆放方法,可以得到摆放方法如下: 1)定位初始顶点和初 ...

  7. 七巧板复原算法——计算机图形学基本算法之二,线段相交判断

    判断线段相交,朴素的方法(初中直线方程的判断方法),就是先计算两条直线的交点,然后再判断交点是否在其中一条的线段上.这也是笔者能唯一想到的方法,后来抱着试试看有没有更好方法的想法,搜了一下网络.哦, ...

  8. 七巧板复原之匹配算法之代码实现

    因为各种原因,想顺着我的开发思路写,但是现在感觉这么写太啰嗦了,直接写核心代码吧. 算法依然是之前的小文的算法,通过代码验证算法是可行的,并没有太大的疏漏.根据代码吧算法又进行了归纳,流程图如下: 说 ...

  9. 计算机颅面研究,颅面复原算法研究-计算机应用技术专业论文.docx

    颅面复原算法研究-计算机应用技术专业论文 优秀毕业论文 精品参考文献资料 浙江工业大学 硕士学位论文 颅面复原算法研究 姓名:林瑶磊 申请学位级别:硕士 专业:计算机应用技术 指导教师:梁荣华浙江工业 ...

最新文章

  1. 收藏!84页PPT讲解电力变压器参数计算
  2. ArcGIS AddIN开发异常之--修饰符“static”对该项无效
  3. javaweb学习总结(三十八)——事务
  4. kprobe原理解析
  5. 计算机基础知识菜鸟教程,机器学习基础知识整理归纳
  6. iframe内容适应div大小_使用lt;iframegt;方式在WordPress中插入视频并自适应屏幕尺寸
  7. python天气查询_Python学习笔记——天气查询代码
  8. python随机画圆_python生成随机图形验证码详解
  9. python编辑器是什么_python开发用什么编辑器
  10. kpconv与point transformer异同、算法讲解
  11. 实习阶段修改的第一个bug(完成了一个需求)
  12. 设计模式系列 — 模板方法模式
  13. 一个基于.NET Core3.1的开源项目帮你彻底搞懂WPF框架Prism
  14. Hybird Astar算法原理
  15. 回归模型中截距项的意义_计量经济学第12讲(时间序列计量经济学模型:协整与误差修正模型)...
  16. android语言包,安卓系统添加多国语言包
  17. 新能源汽车技术与市场
  18. 视频教程-程序员的数学:线性代数-Python
  19. 固态硬盘的计算机需要进行磁盘碎片整理吗,有问有答:固态硬盘需要磁盘碎片整理吗?...
  20. 信息安全技术——(九)基于MATLAB数字水印系统设计

热门文章

  1. 使用 object 和 embed 标签播放SWF文件
  2. 杨澜给二十几岁女孩子的忠告
  3. Eclipse安装阿里巴巴代码规范插件p3c
  4. 在Closing事件中,将e.Cancle设置成true,则Windows无法关机和重启系统的解决办法
  5. 小米官网的设计 致敬
  6. PCIe_TX/RX测试步骤
  7. Linux 运行和控制 shell 脚本
  8. Mybatis 批量插入报ORA-00933: SQL 命令未正确结束
  9. WAP与WEB的区别
  10. 无方向盘!通用汽车宣布2019年生产无人驾驶汽车 | 消息