找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 8587|回复: 27

[求助] 请问如何判断多段线中圆弧是顺时针还是逆时针啊?

[复制链接]
发表于 2013-8-15 21:47:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
请问如何判断多段线中圆弧是顺时针还是逆时针啊?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 13个

财富等级: 恭喜发财

发表于 2013-8-15 21:59:49 | 显示全部楼层
仔细看下帮助文件,里面都告诉你了。

QQ截图20130815215753.png

点评

可是我求出来的凸度没有负数 if (pPoly->segType(m)==AcDbPolyline::kArc) { double dStartAngle =arc.startAng(); double dEndAngle = arc.endAng(); double dAlfa = RtoG(dEndAngle -  详情 回复 发表于 2013-8-15 22:18
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-15 22:18:01 | 显示全部楼层
LoveArx 发表于 2013-8-15 21:59
仔细看下帮助文件,里面都告诉你了。

可是我求出来的凸度没有负数
if (pPoly->segType(m)==AcDbPolyline::kArc)
  {      
    double dStartAngle =arc.startAng();   
    double dEndAngle = arc.endAng();
    double dAlfa = RtoG(dEndAngle - dStartAngle);//RtoG()弧度转角度
    gBulge=tan(0.25*dAlfa*3.1415926/180);
}

点评

凸度不用你用公式自己算啊,你自己算的当然没符号了。 上面的帮助文件不就是求凸度的方法吗? 你把顶点索引参数给它,他就给你算出凸度了。  详情 回复 发表于 2013-8-15 22:33
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2013-8-15 22:33:23 | 显示全部楼层
yzf_fs 发表于 2013-8-15 22:18
可是我求出来的凸度没有负数
if (pPoly->segType(m)==AcDbPolyline::kArc)
  {      

凸度不用你用公式自己算啊,你自己算的当然没符号了。

上面的帮助文件不就是求凸度的方法吗? 你把顶点索引参数给它,他就给你算出凸度了。

Acad::ErrorStatus

getBulgeAt(

unsigned int index,

double& bulge) const;

indexInput index (0 based) of the vertex for start of bulge
bulgeOutput bulge value at vertex index

点评

可以了,非常感谢。。。。再问一个,问什么多段线里有几段圆弧取只能输出一段圆弧的信息。。 AcDbPolyline *pPoly; int n=pPoly->numVerts(); double R=arc.radius(); double L; AcGePoint2d pt  详情 回复 发表于 2013-8-15 22:54
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-15 22:54:40 | 显示全部楼层
LoveArx 发表于 2013-8-15 22:33
凸度不用你用公式自己算啊,你自己算的当然没符号了。

上面的帮助文件不就是求凸度的方法吗? 你把顶 ...

可以了,非常感谢{:soso_e113:}。。。。再问一个,问什么多段线里有几段圆弧取只能输出一段圆弧的信息。。
AcDbPolyline *pPoly;
int n=pPoly->numVerts();
double R=arc.radius();
double L;
AcGePoint2d ptCen=arc.center();

for(int m=0;m<n;m++)   
{
  pPoly->getPointAt(m,pt1[m]);
   if (pPoly->segType(m)==AcDbPolyline::kArc)
  {
acutPrintf(_T("第%d个圆心坐标为:%.3f,%.3f,半径为:%4.3f\n"),m,ptCen.x,ptCen.y,R);
}

点评

你把你完整的代码贴上来,不可能你刚声明了 pPoly, 后面就接着用 取顶点数的代码。  详情 回复 发表于 2013-8-15 23:03
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2013-8-15 23:03:24 | 显示全部楼层
yzf_fs 发表于 2013-8-15 22:54
可以了,非常感谢。。。。再问一个,问什么多段线里有几段圆弧取只能输出一段圆弧的信息。 ...

你把你完整的代码贴上来,不可能你刚声明了 pPoly, 后面就接着用  取顶点数的代码。

点评

AcGeVoidPointerArray geCurves; AcDbPolyline *pPoly; AcDbBlockTable *pBlockTable; ads_name entName; AcGeLineSeg2d line, *pLine; AcGeCircArc2d arc, *pArc; long len; AcDbObjectId entId;  详情 回复 发表于 2013-8-16 09:23
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-16 09:23:42 | 显示全部楼层
LoveArx 发表于 2013-8-15 23:03
你把你完整的代码贴上来,不可能你刚声明了 pPoly, 后面就接着用  取顶点数的代码。

AcGeVoidPointerArray geCurves;
AcDbPolyline *pPoly;
AcDbBlockTable *pBlockTable;
ads_name entName;
AcGeLineSeg2d line, *pLine;
AcGeCircArc2d arc, *pArc;
long len;

AcDbObjectId entId;
acdbGetObjectId(entId, entName);
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable,AcDb::kForRead);
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForRead);
AcDbBlockTableRecordIterator *pBlockIterator;
pBlockTableRecord->newIterator(pBlockIterator);

for(pBlockIterator->start();!pBlockIterator->done();pBlockIterator->step())
{
  AcDbEntity *pEntity;
  pBlockIterator->getEntity(pEntity,AcDb::kForWrite);
pPoly=AcDbPolyline::cast(pEntity);
   }
pBlockTable->close();
pBlockTableRecord->close();

acedSSGet(NULL,NULL,NULL,NULL,entName);
if (RTNORM==acedSSLength(entName,&len))
{
  acutPrintf("\n已选择%d个实体.", len);
}

  Adesk::Boolean bClosed= pPoly->isClosed();

int n=pPoly->numVerts();
  for(int i=0;i<n;i++)
{
  if (pPoly->segType(i) ==   AcDbPolyline::kLine)
  {  
   pPoly->getLineSegAt(i, line);
   pLine = new AcGeLineSeg2d(line);
   geCurves.append(pLine);     
  }
  else if (pPoly->segType(i)==AcDbPolyline::kArc)
  {
   pPoly->getArcSegAt(i,arc);
   pArc=new AcGeCircArc2d(arc);
   geCurves.append(pArc);
  
  }
}

if(bClosed!=Adesk::kTrue)
{
  pPoly->setClosed(!bClosed);
  }

for(int l=1,m=0;m<n;m++,l++)   
{
  pPoly->getPointAt(m,pt1[m]);
  if (pPoly->segType(m)==AcDbPolyline::kArc)
  {      
    acutPrintf(_T("第%d个圆心坐标为:%.3f,%.3f,半径为:%4.3f\n"),m,ptCen.x,ptCen.y,R);
  }
acutPrintf(_T("第%d点坐标为:%.3f,%.3f\n"),m,pt1[m].x,pt1[m].y);
}
acedSSFree(entName);
pPoly->close();}

点评

在最后一个循环里面,你在 if (pPoly->segType(m)==AcDbPolyline::kArc) 上面加行打印语句,显示下m 和 segType(m) 的值,看看都是什么?  详情 回复 发表于 2013-8-16 09:50
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2013-8-16 09:50:10 | 显示全部楼层
yzf_fs 发表于 2013-8-16 09:23
AcGeVoidPointerArray geCurves;
AcDbPolyline *pPoly;
AcDbBlockTable *pBlockTable;

在最后一个循环里面,你在
if (pPoly->segType(m)==AcDbPolyline::kArc)

上面加行打印语句,显示下m 和 segType(m) 的值,看看都是什么?

点评

请问问题出在哪里呢  详情 回复 发表于 2013-8-16 18:49
segType(m) 的值怎么看  详情 回复 发表于 2013-8-16 09:58
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-16 09:58:17 | 显示全部楼层
LoveArx 发表于 2013-8-16 09:50
在最后一个循环里面,你在
if (pPoly->segType(m)==AcDbPolyline::kArc)

segType(m)
的值怎么看
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-16 10:01:45 | 显示全部楼层

你看看

本帖最后由 yzf_fs 于 2013-8-16 10:05 编辑

你看看



QQ图片20130816100445.jpg
@`9I}630~RCRDPY(_DA%JYH.jpg
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2013-8-16 18:49:55 | 显示全部楼层
LoveArx 发表于 2013-8-16 09:50
在最后一个循环里面,你在
if (pPoly->segType(m)==AcDbPolyline::kArc)

请问问题出在哪里呢

点评

如果要用打印信息调试,那么就把无关的地方的打印关闭,我现在看你上面的图片,有两个地方显示凸度,说明有两圆弧。 其他地方打印语句我不知道哪个是哪个地方的, 如果你认为有问题,你把无关的打印关掉,就留  详情 回复 发表于 2013-8-16 19:39
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2013-8-16 19:39:36 | 显示全部楼层
yzf_fs 发表于 2013-8-16 18:49
请问问题出在哪里呢

如果要用打印信息调试,那么就把无关的地方的打印关闭,我现在看你上面的图片,有两个地方显示凸度,说明有两圆弧。

其他地方打印语句我不知道哪个是哪个地方的,

如果你认为有问题,你把无关的打印关掉,就留最后的那个segtype上面的,把M和类型打印出来。

点评

你再看看怎样  详情 回复 发表于 2013-8-16 21:24
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-16 21:24:58 | 显示全部楼层
LoveArx 发表于 2013-8-16 19:39
如果要用打印信息调试,那么就把无关的地方的打印关闭,我现在看你上面的图片,有两个地方显示凸度,说明 ...

你再看看怎样
11.jpg
00.jpg

点评

这不显示的两个段有圆心吗,说明有两个弧段啊 让你把 pPoly->segType(m) 的类型打印出来,你对照H文件,就能知道每个顶点的段的类型。[/backcolor] [/backcolor]  详情 回复 发表于 2013-8-16 21:51
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2013-8-16 21:51:41 | 显示全部楼层

这不显示的两个段有圆心吗,说明有两个弧段啊

让你把  pPoly->segType(m) 的类型打印出来,你对照H文件,就能知道每个顶点的段的类型。



点评

是有两个圆弧啊,但是就只能识别一个圆弧的坐标和半径,segType(m)怎样打 acutPrintf(_T("segType(m)"%f,segType(m))这样打不了,显示错误  详情 回复 发表于 2013-8-16 22:07
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-16 22:07:04 | 显示全部楼层
LoveArx 发表于 2013-8-16 21:51
这不显示的两个段有圆心吗,说明有两个弧段啊

让你把  pPoly->segType(m) 的类型打印出来,你对照H文 ...

是有两个圆弧啊,但是就只能识别一个圆弧的坐标和半径,segType(m)怎样打
acutPrintf(_T("segType(m)"%f,segType(m))这样打不了,显示错误

点评

你试试转换成整形打印。 另外,你上面的图片,圆心明显是两个啊,半径相同。  详情 回复 发表于 2013-8-16 22:10
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 05:48 , Processed in 0.835703 second(s), 77 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表