通常意义的七巧板就是个多边形,凸的或者凹的,因此只要确定了顶点,这个七巧板就确定了。简单查了一下多边形的表示方法,我决定采用顶点表示法,再加上考虑后面的计算需要,初步采用下面的链表结构,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轴方向和屏幕坐标一致。

如图示:

七巧板python代码 七巧板秘籍_Public


七巧板的部件的初始定义坐标, 首个顶点就是(0,0),按顺时针方向,第一条边和X轴重合,计算过程当中要进行平移和旋转。

如图示:

七巧板python代码 七巧板秘籍_ide_02


盒子的表示,显然是相同的坐标系,采用和七巧板相同的表示法,是一个矩形。

可能用到 函数

覆盖检测,边界检测,角度匹配,长度匹配,这里面要考虑计算误差,因为实际的七巧板是有误差的,数据准备时也会存在误差。

覆盖检测

可以采用两种方式,一种是利用图像处理有关的API,将七巧板部件和容器都转换成IMG ,将七巧板部件在这个容器里,通过图像的计算技术,检测是否有覆盖。这种方法比较简单,但是效率会很低。另一种方法就是利用计算机图形学技术,计算点线面的空间几何关系。
经过思考,只要考察部件的顶点是否在多边形内部就可以了。而这样的算法是已经很成熟了,网上有很多。原理简介如下(抄的)

判断一个点是否在多边形内部的方法有很多,射线法是其中比较容易理解且容易实现的算法。

参考:
原文引用如下:

判断平面内点是否在多边形内有多种算法,其中射线法是其中比较好理解的一种,而且能够支持凹多边形的情况。该算法的思路很简单,就是从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。如下图所示:

该图出处同上

七巧板python代码 七巧板秘籍_链表_03


特殊处理:

此图出处:

七巧板python代码 七巧板秘籍_七巧板python代码_04


maraSun 2022-03-21 BJFWDQ

思路渐渐清晰,文章可能比较乱。我会在代码完成之后,慢慢整理。