- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
二维轮廓线提取
一、目的与应用
二维轮廓线提取的目的是当给定在二维平面内一组线段时,用户选择一
个点,然后提取包含这个点的最小封闭多边形。可以应用于建筑软件上,当
给定一组墙时,根据选择的点来寻找房间。
二、基本思想与实现
数据结构:
设计了两个类 CSegment 和 CNode
class CSegment
{
public:
//指向左右接点
CNode* m_LeftNode;
CNode* m_RightNode;
//记录所有线段的指针,指向下一个线段
CSegment* m_pAllNext;
//在接点中的以极角排序的链中的指针,指向下一个线段
//L 为左接点的链表,R 为右接点的链表,都是双向循环的
CSegment* m_pSegmentLNext;
CSegment* m_pSegmentLprev;
CSegment* m_pSegmentRNext;
CSegment* m_pSegmentRprev;
//在左接点的极角
double m_LAngle;
//在右接点的极角
double m_RAngle;
//查找状态
int m_IsChecked;
//查找时贡献的角度
double m_ContibuteAngle;
//所求轮廓线链中的指针
CSegment* m_pNeedNext;
public:
CSegment();
virtual ~CSegment();
//计算极角
double GetAngle(CNode *Node);
//为线段设置左右接点
BOOL SetNode(CNode *Node1,CNode *Node2);
//判断是否端点
BOOL IsNode(DPOINT CrossPoint);
// 由点得到Node
CNode* GetNodeByPoint(DPOINT Point);
//得到左右接点
CNode* GetLeftNode();
CNode* GetRightNode();
//得到线段的与A 不同的另一个接点
CNode* GetOtherNode(CNode* A);
};
//为了计算准确,点的坐标使用了double 型
typedef struct tagpoint
{
double x;
double y;
}DPOINT;
class CNode
{
public:
//记录点的位置
DPOINT m_Location;
//记录以该点为端点的按照极角排序的线段双向循环莲表
CSegment* m_SegList;
//在所有接点中的下一个接点
CNode* m_pAllNext;
//新加入线段中的所有接点中的下一个接点
CNode* m_pNodeNext;
//所求轮廓线的所有接点链
CNode* m_pNodeNeed;
public:
CNode();
virtual ~CNode();
// 向本接点加入线段主要是设置m_SegList 链
BOOL AddSegment(CSegment* pSegment);
//设置m_Location
BOOL SetLocation(DPOINT point);
//得到在查找过程中
原创力文档


文档评论(0)