找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3880|回复: 8

[ARX程序]:ARX程序中怎样求多义线的长度

[复制链接]
发表于 2002-6-11 03:09:53 | 显示全部楼层 |阅读模式

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

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

×
ARX程序中怎样求多义线的长度?
十万火急,恳请帮忙.
我用先求各顶点之间的距离,再根据凸度求出曲线段的长度的方法
累加得到其长度,但误差很大.
根据凸度求出曲线段的长度的方法为:
根据两点距离和凸度可求出弓高,再用三点画弧求出半径,
再求出圆心角,最后算出弧长.
各位有何简便的方法,万望不吝赐教!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-6-11 06:34:02 | 显示全部楼层

Re: [ARX程序]:ARX程序中怎样求多义线的长度

最初由 bluesolar 发布
[B]ARX程序中怎样求多义线的长度?
十万火急,恳请帮忙.
我用先求各顶点之间的距离,再根据凸度求出曲线段的长度的方法
累加得到其长度,但误差很大.
根据凸度求出曲线段的长度的方法为:
根据两点距离和凸度可求出弓高... [/B]


因为ARX提供了强大的AcGe几何库,所以几何图形学算法都不用我们操心了。

如果是AcDbPolyline类对象,那么可以方便的直接用AcDbCurve方法,首先用AcDbCurve::getEndParam(...)得到终点的参数值,然后用AcDbCurve::getDistAtParam(...)得到终点参数值处到曲线起点的长度,就是你要的了。

如果是AcDb2dPolyline对象,那么简单的方法是用:AcDbPolyline::convertFrom(...)转换成AcDbPolyline对象,然后用上面的方法求。

复杂的方法是遍历AcDb2dPolyline的AcDbVertex子实体对象,然后用:然后根据段类型,构筑AcGe对象,然后用AcDbLineSeg2d,AcGeCircArc2d类的方法,计算长度。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-6-11 06:41:55 | 显示全部楼层
给你一个求“老”的多义线AcDb2dPolyline对象长度的代码


  1. [FONT=courier new]
  2. Acad::ErrorStatus acdcGetAcDb2dPolylineLength(double& length,AcDb2dPolyline*
  3. p2dPoly){
  4.    if (p2dPoly==NULL)
  5.     return Acad::eNullObjectPointer;
  6.    length =0;
  7.    Acad::ErrorStatus es;
  8.    AcDbObjectIterator* pI;
  9.    if ((pI=p2dPoly->vertexIterator())==NULL)
  10.     return Acad::eOutOfMemory;
  11.    AcDb2dVertex* pV1,*pV2;
  12.    AcGePoint3d v1,v2;
  13.    Adesk::Boolean bDone = Adesk::kFalse;
  14.    AcDb::Vertex2dType type;
  15.    if ((es=p2dPoly->openVertex(pV1,pI->objectId(),AcDb::kForRead))==Acad::eOk){
  16.     while (Adesk::kTrue){
  17.         if (!bDone)
  18.         pI->step();
  19.         if
  20. ((es=p2dPoly->openVertex(pV2,pI->objectId(),AcDb::kForRead))==Acad::eOk){
  21.         switch (type = pV1->vertexType()){
  22.         case AcDb::k2dVertex:
  23.         case AcDb::k2dSplineFitVertex:
  24.         case AcDb::k2dCurveFitVertex:
  25.             {
  26.             while (pV2->vertexType()==AcDb::k2dSplineCtlVertex){
  27.                 pV2->close();
  28.                 pI->step();
  29.                 if
  30. ((es=p2dPoly->openVertex(pV2,pI->objectId(),AcDb::kForRead))!=Acad::eOk)
  31.                 break;
  32.             }
  33.             if (es!=Acad::eOk)
  34.                 break;
  35.             v1 = pV1->position();
  36.             v2 = pV2->position();
  37.             double A = 4*atan(pV1->bulge()); //angle
  38.             double D = (v2-v1).length();
  39.             if (fabs(A)<AcGeContext::gTol.equalPoint()){
  40.                 length+=D;
  41.             } else {
  42.                 double R= fabs(D/(2*sin(A/2)));//radius
  43.                 length+= R*fabs(A);//length
  44.             }
  45.             pV1->close();
  46.             pV1=pV2;
  47.             break;
  48.             }
  49.         case AcDb::k2dSplineCtlVertex:
  50.             pV1->close();
  51.             pV1=pV2;
  52.             break;
  53.         default:
  54.             assert(0);//should never happen
  55.         }
  56.         if (bDone)
  57.             break;
  58.         } else {
  59.         if (p2dPoly->isClosed())
  60.             pI->start();
  61.         else
  62.             break;
  63.         bDone = Adesk::kTrue;
  64.         }
  65.     }
  66.     pV1->close();
  67.    }
  68.    delete pI;
  69.    return Acad::eOk;
  70. }
  71. [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-6-13 14:57:26 | 显示全部楼层
非常感谢晓东,已经作出来了。
再问一下,将弧度化为CSting的角度,该怎么办呢?
谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-6-13 18:16:04 | 显示全部楼层
最初由 bluesolar 发布
[B]非常感谢晓东,已经作出来了。
再问一下,将弧度化为CSting的角度,该怎么办呢?
谢谢! [/B]


int
acdbAngToS(
    ads_real v,
    int unit,
    int prec,

    char* str);

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

使用道具 举报

 楼主| 发表于 2002-6-16 11:23:15 | 显示全部楼层
但不知int unit,
int prec,各代表什么意思?不好意思,手头的资料全还到北图了,很远的,现在一本资料也没有。
在作一个铁路线路平面设计的小软件,功能很简单的。程序在我的机器上(宿舍内,上传文件很慢),我现在在机房上机,没带。后天毕业答辩,之后我再贴上来吧。
功能太简单了,都有点不好意思贴上来,怕大家笑话。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-6-16 12:31:02 | 显示全部楼层
最初由 bluesolar 发布
[B]但不知int unit,
int prec,各代表什么意思?不好意思,手头的资料全还到北图了,很远的,现在一本资料也没有。
在作一个铁路线路平面设计的小软件,功能很简单的。程序在我的机器上(宿舍内,上传文件很慢),我... [/B]


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

使用道具 举报

 楼主| 发表于 2002-6-21 14:45:31 | 显示全部楼层
所有的文件都在。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2015-7-15 15:49:17 | 显示全部楼层
:):funk::L:o:P
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-10 23:28 , Processed in 0.414593 second(s), 48 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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