七巧板复原算法——多边形的表示
按:笔者此时已经完成了一个不完美的版本,已经把笔者的真实的七巧板解法算到了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
祝大家五一快乐!
七巧板复原算法——多边形的表示相关推荐
- 七巧板复原算法探讨之二——七巧板的表示
通常意义的七巧板就是个多边形,凸的或者凹的,因此只要确定了顶点,这个七巧板就确定了.简单查了一下多边形的表示方法,我决定采用顶点表示法,再加上考虑后面的计算需要,初步采用下面的链表结构,C# 表示法. ...
- 七巧板复原算法——计算机图形学基本算法之一, 点在多边形内部的判断
注:此时我已经完成了一个演示版本,但是为了文章的渐进性,我将把开发过程一步步的写出来,用来记录. 本实验代码用到的图形学关系和算法列举如下: 基本计算机图形学关系和算法 1.点在多边形内部的 点在多边 ...
- 七巧板复原算法之小结局——给出一个最大结果集
按:之所以用小结局而非大结局,因为笔者的解法并没有给出理论上的全部解,只是给出了大部分解法. 算法描述如下 #1 初始化 #完成七巧板组件的初始化以及盛放七巧板的容器的初始化: #2 采用DFS 方法 ...
- 七巧板复原算法——摆放和贴合算法的改进
写了一点基础代码了,例如点在线段上的判断,线段相交的判断等等.(当然还是上网查了一下,没有自己推导,发现的确有更好的数学方法,谢谢各味图形学达人) 前文说到了摆放和贴合等等,用的基准图是下图中的 G1 ...
- 七巧板复原算法之四——边沿贴合和空腔查找
越想越复杂啊,一个一个的来吧.根据上文的讨论,把新的七巧板部件进行拼接时,可能会围成新的空腔,也可能是多个空腔,如图示: 空腔查找 G3-G5 都是摆放部件后形成的新的空腔,要把这些多边形找出来,并放 ...
- 七巧板复原算法之三——摆放算法
假设我们已经进行了一定的步骤,此时七巧板的摆放情况如下图示: 红色部分已经完成摆放的区域,蓝色部分是空的区域,分别用G1和G2表示.根据我们的人工摆放方法,可以得到摆放方法如下: 1)定位初始顶点和初 ...
- 七巧板复原算法——计算机图形学基本算法之二,线段相交判断
判断线段相交,朴素的方法(初中直线方程的判断方法),就是先计算两条直线的交点,然后再判断交点是否在其中一条的线段上.这也是笔者能唯一想到的方法,后来抱着试试看有没有更好方法的想法,搜了一下网络.哦, ...
- 七巧板复原之匹配算法之代码实现
因为各种原因,想顺着我的开发思路写,但是现在感觉这么写太啰嗦了,直接写核心代码吧. 算法依然是之前的小文的算法,通过代码验证算法是可行的,并没有太大的疏漏.根据代码吧算法又进行了归纳,流程图如下: 说 ...
- 计算机颅面研究,颅面复原算法研究-计算机应用技术专业论文.docx
颅面复原算法研究-计算机应用技术专业论文 优秀毕业论文 精品参考文献资料 浙江工业大学 硕士学位论文 颅面复原算法研究 姓名:林瑶磊 申请学位级别:硕士 专业:计算机应用技术 指导教师:梁荣华浙江工业 ...
最新文章
- 收藏!84页PPT讲解电力变压器参数计算
- ArcGIS AddIN开发异常之--修饰符“static”对该项无效
- javaweb学习总结(三十八)——事务
- kprobe原理解析
- 计算机基础知识菜鸟教程,机器学习基础知识整理归纳
- iframe内容适应div大小_使用lt;iframegt;方式在WordPress中插入视频并自适应屏幕尺寸
- python天气查询_Python学习笔记——天气查询代码
- python随机画圆_python生成随机图形验证码详解
- python编辑器是什么_python开发用什么编辑器
- kpconv与point transformer异同、算法讲解
- 实习阶段修改的第一个bug(完成了一个需求)
- 设计模式系列 — 模板方法模式
- 一个基于.NET Core3.1的开源项目帮你彻底搞懂WPF框架Prism
- Hybird Astar算法原理
- 回归模型中截距项的意义_计量经济学第12讲(时间序列计量经济学模型:协整与误差修正模型)...
- android语言包,安卓系统添加多国语言包
- 新能源汽车技术与市场
- 视频教程-程序员的数学:线性代数-Python
- 固态硬盘的计算机需要进行磁盘碎片整理吗,有问有答:固态硬盘需要磁盘碎片整理吗?...
- 信息安全技术——(九)基于MATLAB数字水印系统设计