C++简单几何图形的识别和编辑系统设计+PPT演示 第6页
// 判断该圆是否与指定图形相同
// 将指定图形强制转化为CCircle类型,比较其参数圆心坐标和半径,
// 若小于指定阈值,则返回Ture,否则返回False。
bool similarWith(CShape * argShape);
// 合并同一圆上的两个圆弧
// 若目标图形与该图形属同一圆,进行合并,返回True;
// 否则返回False。
void mergeWith(CShape * argShape);
// 判断是否选择该圆进行编辑。
// 计算指定点(x, y)到圆心的距离,并与半径比较,
// 如果小于指定阈值则返回True,否则False。
bool isClickOnShape(int x, int y);
// 取得鼠标形状。
// 圆上点时返回水平的双向箭头形状表示改变半径;
// 圆心时返回垂直的四个方向箭头的形状表示移动
TCursor getCursor(int x, int y);
// 更新圆
bool update(int x, int y);
};
4. 图形容器类(CShapes)
4.1 描述
图形容器类是图形类的集合类,由C++ Builder的TList继承得到。用来组织对图像的识别结果、组织当前编辑工作的图形对象集。提供添加图形、删除图形、图形编辑等接口。
4.2 实现
class CShapes : public TList {
public:
/* 初始化 */
CShapes();
// 从TreeView得到Shapes
CShapes(TTreeView * tree);
//在目标位图上画出所有的图形
void drawShapes(Graphics::TBitmap * argDest);
//描述图形
void discript(TTreeView * tree);
};
5. 点类(CPoint)
5.1 描述
点类对于与图像上的前景点。由于识别时需要判断是否为交点,在一般的点的基础上增加是否为交点的属性。由C++ Builder的TPoint继承得到。
5.2 实现
class CPoint : public TPoint {
public:
/* 初始化 */
CPoint() {isCrossPoint = false; };
CPoint(int argx, int argy, bool isCross);
CPoint(int argx, int argy, Graphics::TBitmap * argImg);
/* 属性:是否为交点 */
bool isCrossPoint;
};
6. 单义域类(CSegment)
6.1 描述
在“基于单义域的图形识别算法”中,单义域和多义域的唯一区别就是多义域不是单一的几何元素,其在存储结构上是一样的,在本系统中,都由CSegment类实现,姑且命名为单义域类。
单义域类为点的集合类,由C++ Builder的TList类继承得到。提供添加点、删除点、判断该单义域是否有识别价值、识别该单义域等接口和方法。
6.2 实现
class CSegment : public TList {
public:
/* 初始化 */
CSegment(CPoint * p);
/* 识别该单义域:实现算法中对单义域的识别部分 */
// 如果识别成功(得到圆或线段)返回True,否则返回False
bool recognize();
/* 尝试添加新的点到该单义域 */
// 判断该点是否属于该单义域并确定是在头部还是在尾部,并将其插入到适当位置;如果该点为交点,则将相应的方向关闭增长;若加入成功返回True,否则返回False。
bool addNewPoint();
/* 判断该单义域是否有识别价值 */
// 如果该单义域含有的点数太少,则没有价值返回False,否则返回True。
bool checkValue();
/* 属性:识别出的图形 */
CShape * shape;
};
7. 基于单义域识别类(CSegments)
7.1 描述
基于单义域识别类是实现“基于单义域的直线和圆识别算法”的主要类。它实现了对目标图像的分割、对分割结果的显示、对识别得到的多义域进行分割、对单义域识别结果的总体考虑,最终得到识别结果集。
基于单义域识别类同时是单义域的集合类,由C++ Builder的TList类继承得到。用来组织对图像的单义域分割后的结果。。
7.2 实现
class CSegments : public TList {
public:
/* 构造和析构函数 */
CSegments();
~CSegments();
/* 扫描图像,得到多义域 */
// 从上往下,从左往右扫描图像,对于每一个前景点
// 1。生成新的CPoint实例
// 2。对于本类中的所有单义域,将该点尝试加入
// 3。如果加入失败,以该点为头生成新的单义域并加入。
void segmentize(Graphics::TBitmap * argSrc);
/* 在指定的位图上显示分割得到的多义域、单义域 */
void displaySegments(Graphics::TBitmap * argDes);
/* 识别该集合中的元素 */
// 1。调用单义域的checkValue(),如果得到False,删除该单义域;
// 2。调用单义域的recognize(),如果返回False,对该单义域进行分割;
// 将新得到的2个单义域取代当前的单义域,并进行识别
// 3。所有的单义域识别完毕后,对各个单义域的识别结果进行合并
// 4。返回得到的图形容器类。
CShapes * recognize();
/* 删除集合中的指定位置的元素 */
void removeItemOnly(int index);
void removeItemAndFreePoints(int index);
};
8. 霍夫变换识别直线类(CHTLine)
8.1 描述
实现霍夫变换识别直线算法。
8.2 实现
class CHTLine {
public:
/* 构造和析构函数 */
CHTLine ();
~ CHTLine ();
/* 对源位图按照直线识别算法进行霍夫变换 */
// argRho, argTheta分别是对 和 的分割的份数。
void recognize(Graphics::TBitmap * argSource, int argRho, int argTheta);
/* 在目标位图上显示参数坐标的信息 */
// 以参数坐标的最大值为灰度最大值,按比例灰度在位图上显示。
void displayPramater(Graphics::TBitmap * argDest);
/* 按照argRate指定的概率取得识别出的直线列表 */
void getLines(TList * argList, double argRate);
};
9. 霍夫变换识别圆类(CHTCircle)
9.1 描述
实现霍夫变换识别圆算法。
9.2 实现
class CHTCircle {
public:
/* 构造和析构函数 */
CHTCircle ();
~ CHTCircle ();
/* 对源位图按照圆的识别算法进行霍夫变换 */
void recognize(Graphics::TBitmap * argRes);
/* 在目标位图上显示参数坐标的信息 */
// 以参数坐标的最大值为灰度最大值,按比例灰度在位图上显示参数坐标中指定半径的二维平面的数据。
void displayPramater(Graphics::TBitmap * argDest, int argR);
/* 按照argRate指定的概率取得识别出的直线列表 */
void getCircles(TList * argList, double argRate);
上一页 [1] [2] [3] [4] [5] [6] [7] [8] 下一页