通常意义的七巧板就是个多边形,凸的或者凹的,因此只要确定了顶点,这个七巧板就确定了。简单查了一下多边形的表示方法,我决定采用顶点表示法,再加上考虑后面的计算需要,初步采用下面的链表结构,C# 表示法。 采用自定义的混合链表结构,这样遍历和定位时比较方便。
结构定义
class Vertex {
Point pnt;
int idx;
int last_idx;
int next_idx;
double center ;// the angle formed by the two sides from this vertex、
double lastLen;// the side length to the last point
double nextLen:// the side length to the next point
class Polygon{
private vertex[] vertex;// The set of all the vertex of the polygon
private int firstPnt;// used to recored the first point of the polygon which is is dynamic one
Public Vertex GetLastVertex(int idx);
Public Vertex GetNexVertex(int idx);
Public Rotate(Point pnt);
}
坐标系
坐标系的建立,以七巧板的盒子的两条边为XY轴建立平面直角坐标系,为了减少计算量,准备让它的Y轴方向和屏幕坐标一致。
如图示:
七巧板的部件的初始定义坐标, 首个顶点就是(0,0),按顺时针方向,第一条边和X轴重合,计算过程当中要进行平移和旋转。
如图示:
盒子的表示,显然是相同的坐标系,采用和七巧板相同的表示法,是一个矩形。
可能用到 函数
覆盖检测,边界检测,角度匹配,长度匹配,这里面要考虑计算误差,因为实际的七巧板是有误差的,数据准备时也会存在误差。
覆盖检测
可以采用两种方式,一种是利用图像处理有关的API,将七巧板部件和容器都转换成IMG ,将七巧板部件在这个容器里,通过图像的计算技术,检测是否有覆盖。这种方法比较简单,但是效率会很低。另一种方法就是利用计算机图形学技术,计算点线面的空间几何关系。
经过思考,只要考察部件的顶点是否在多边形内部就可以了。而这样的算法是已经很成熟了,网上有很多。原理简介如下(抄的)
判断一个点是否在多边形内部的方法有很多,射线法是其中比较容易理解且容易实现的算法。
参考:
原文引用如下:
判断平面内点是否在多边形内有多种算法,其中射线法是其中比较好理解的一种,而且能够支持凹多边形的情况。该算法的思路很简单,就是从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。如下图所示:
该图出处同上
特殊处理:
此图出处:
maraSun 2022-03-21 BJFWDQ
思路渐渐清晰,文章可能比较乱。我会在代码完成之后,慢慢整理。