我自己写了一个判断两条多段线重叠的算法。希望大家给点意见或建议。
2012-09-13 15:40
435 查看
我自己写了一个判断两条多段线重叠的算法。希望大家给点意见或建议。
以下为源码:
// 判断两条多段线是否重叠//
// 返回值:-1——(pl1<pl2)
// 0——(pl1=pl2)
// 1——(pl1>pl2)
int PlineOverlap(AcDbPolyline* pl1, AcDbPolyline* pl2)
{
int rtn1(1), rtn2(1);
Acad::ErrorStatus es1, es2;
AcGePoint3d pt1, pt2;
double param1(0), param2(0);
int i,j;
// 先判断其中一条线的所有结点是否在另一条线上
for (i=0,j=1; j<pl1->numVerts(); i++,j++)
{
pl1->getPointAt(i, pt1);
pl1->getPointAt(j, pt2);
if (pl2->getParamAtPoint(pt1, param1)!=Acad::eOk
|| pl2->getParamAtPoint(pt2, param2)!=Acad::eOk)
{
es1 = Acad::ePointNotOnEntity;
break;
}
else
{ //再判断两条线的子段是否有交点
AcDbPolyline* pl2Sub = GetSplitPline(pl2, param1, param2);
if (HasInter(pt1, pt2, pl2Sub))
{
break;
}
rtn1 ++;
}
}
for (i=0,j=1; j<pl2->numVerts(); i++,j++)
{
pl2->getPointAt(i, pt1);
pl2->getPointAt(j, pt2);
if (pl1->getParamAtPoint(pt1, param1)!=Acad::eOk
|| pl1->getParamAtPoint(pt2, param2)!=Acad::eOk)
{
es2 = Acad::ePointNotOnEntity;
break;
}
else
{
AcDbPolyline* pl1Sub = GetSplitPline(pl1, param1, param2);
if (HasInter(pt1, pt2, pl1Sub))
{
break;
}
rtn2 ++;
}
}
if (rtn1==pl1->numVerts()
&& rtn2==pl2->numVerts())
{
return 0;
}
else if (rtn1==pl1->numVerts())
{
return -1;
}
else if (rtn2==pl2->numVerts())
{
return 1;
}
else
{
return (-99);
}
}
//判断线段与多段线是否有交点
BOOL HasInter(AcGePoint3d ptFrom, AcGePoint3d ptTo, AcDbPolyline* pl, BOOL bExtend=FALSE)
{
int i,j;
AcGePoint3d pt1, pt2;
for (i=0,j=1; j<pl->numVerts(); i++,j++)
{
pl->getPointAt(i, pt1);
pl->getPointAt(j, pt2);
ads_point inter;
int teston;
if (bExtend) teston=0;
else teston=1;
if (acdbInters(asDblArray(ptFrom), asDblArray(ptTo), asDblArray(pt1), asDblArray(pt2), teston, inter)==RTNORM)
{
return TRUE;
}
}
return FALSE;
}
//取中间段
AcDbPolyline* GetSplitPline(AcDbPolyline* pl, double param1, double param2)
{
AcGeDoubleArray params;
if (param1<param2)
{
params.append(param1);
params.append(param2);
}
else
{
params.append(param2);
params.append(param1);
}
AcDbVoidPtrArray segs;
if (pl->getSplitCurves(params, segs)==Acad::eOk)
{
if (segs.length()==1)
{
return static_cast<AcDbPolyline*>(segs.at(0));
}
else if (segs.length()==2)
{
if (params.at(0)==0)
{
return static_cast<AcDbPolyline*>(segs.at(0));
}
if (params.at(1)==(pl->numVerts()-1))
{
return static_cast<AcDbPolyline*>(segs.at(1));
}
}
else if (segs.length()==3)
{
return static_cast<AcDbPolyline*>(segs.at(1));
}
}
return pl;
}
以下为源码:
// 判断两条多段线是否重叠//
// 返回值:-1——(pl1<pl2)
// 0——(pl1=pl2)
// 1——(pl1>pl2)
int PlineOverlap(AcDbPolyline* pl1, AcDbPolyline* pl2)
{
int rtn1(1), rtn2(1);
Acad::ErrorStatus es1, es2;
AcGePoint3d pt1, pt2;
double param1(0), param2(0);
int i,j;
// 先判断其中一条线的所有结点是否在另一条线上
for (i=0,j=1; j<pl1->numVerts(); i++,j++)
{
pl1->getPointAt(i, pt1);
pl1->getPointAt(j, pt2);
if (pl2->getParamAtPoint(pt1, param1)!=Acad::eOk
|| pl2->getParamAtPoint(pt2, param2)!=Acad::eOk)
{
es1 = Acad::ePointNotOnEntity;
break;
}
else
{ //再判断两条线的子段是否有交点
AcDbPolyline* pl2Sub = GetSplitPline(pl2, param1, param2);
if (HasInter(pt1, pt2, pl2Sub))
{
break;
}
rtn1 ++;
}
}
for (i=0,j=1; j<pl2->numVerts(); i++,j++)
{
pl2->getPointAt(i, pt1);
pl2->getPointAt(j, pt2);
if (pl1->getParamAtPoint(pt1, param1)!=Acad::eOk
|| pl1->getParamAtPoint(pt2, param2)!=Acad::eOk)
{
es2 = Acad::ePointNotOnEntity;
break;
}
else
{
AcDbPolyline* pl1Sub = GetSplitPline(pl1, param1, param2);
if (HasInter(pt1, pt2, pl1Sub))
{
break;
}
rtn2 ++;
}
}
if (rtn1==pl1->numVerts()
&& rtn2==pl2->numVerts())
{
return 0;
}
else if (rtn1==pl1->numVerts())
{
return -1;
}
else if (rtn2==pl2->numVerts())
{
return 1;
}
else
{
return (-99);
}
}
//判断线段与多段线是否有交点
BOOL HasInter(AcGePoint3d ptFrom, AcGePoint3d ptTo, AcDbPolyline* pl, BOOL bExtend=FALSE)
{
int i,j;
AcGePoint3d pt1, pt2;
for (i=0,j=1; j<pl->numVerts(); i++,j++)
{
pl->getPointAt(i, pt1);
pl->getPointAt(j, pt2);
ads_point inter;
int teston;
if (bExtend) teston=0;
else teston=1;
if (acdbInters(asDblArray(ptFrom), asDblArray(ptTo), asDblArray(pt1), asDblArray(pt2), teston, inter)==RTNORM)
{
return TRUE;
}
}
return FALSE;
}
//取中间段
AcDbPolyline* GetSplitPline(AcDbPolyline* pl, double param1, double param2)
{
AcGeDoubleArray params;
if (param1<param2)
{
params.append(param1);
params.append(param2);
}
else
{
params.append(param2);
params.append(param1);
}
AcDbVoidPtrArray segs;
if (pl->getSplitCurves(params, segs)==Acad::eOk)
{
if (segs.length()==1)
{
return static_cast<AcDbPolyline*>(segs.at(0));
}
else if (segs.length()==2)
{
if (params.at(0)==0)
{
return static_cast<AcDbPolyline*>(segs.at(0));
}
if (params.at(1)==(pl->numVerts()-1))
{
return static_cast<AcDbPolyline*>(segs.at(1));
}
}
else if (segs.length()==3)
{
return static_cast<AcDbPolyline*>(segs.at(1));
}
}
return pl;
}
相关文章推荐
- 黑马程序员-昨天研究一个通俗易懂的螺旋输出数组的算法,希望大家给点建议!!
- 我自己做了一个质数合数判断器,程序和源码都有,大家来给些建议吧
- 一个简单的算法题目,搞了半天,希望大家能给点意见
- 我的几个新站点,希望大家提点意见或者建议.
- 今天带来的是一个对图书编号和价格设定程序 不是很完善希望大家给与建议进行修改
- (技术小白)最近搭建了一个博客小站,希望大家多多提出建议。谢谢大家
- 现在正在搞博士的东西,导师要求将一个二维的图片转换成现实生活中的三维图片,实现仿真,这个课题真有点难度,现在还莫不着头绪,查了相关的一些知识,可就是没有一个系统的,希望大家各抒己见,提一些好的建议,好的文章
- 我写的一个jquery的表格树插件,希望大家提出意见
- 发布一个分页算法,希望大家一起讨论,彻底解决分页之苦
- 一个建议,看看大家的意见。
- 有个想法,希望得到大家的意见和建议!
- 基于跨数据库的事务的一个讨论,希望参考下大家的意见
- 和大家分享一个判断点是否在多边形范围内的算法
- 设计一个算法,判断给定的一棵二叉树是否是二叉排序树(二叉树的所有关键字均为正整数)
- 【算法题】如何判断一个二叉树是平衡二叉树
- (转贴)反转一个字节 和 判断32位整数二进制中1的个数 的算法
- 点在多边形内算法——判断一个点是否在一个复杂多边形的内部
- 12、一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。 请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。
- 判断一个点是不是在三角形中 用面积算法
- 第二次编程作业:判断一个正整数是否为质数的算法和 随机生成一个n bit位的长整数