找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1477|回复: 15

[ARX程序]:AcGeCurve3d类对象的求交问题

[复制链接]
发表于 2004-11-30 20:13:22 | 显示全部楼层 |阅读模式

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

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

×
在论坛中看到求相交域的话题,自己也按照各位的思路想试一试,在我的这段程序中:
1、先从图上选择两个圆,并建立两个AcGeCircArc3d对象,实现从DB—>GE;

2、得到两个AcGeCircArc3d对象的AcGeInterval值;

3、对两个AcGeInterval对象求交,得到结果intresult,但是没有得到预期的结果。
   输出的结果:
pGeCir1_lower=0.000000,pGeCir1_upper=6.283185
pGeCir2_lower=0.000000,pGeCir2_upper=6.283185
lower=0.000000,upper=6.283185

   下面就是这段程序,请各位指正。
void abc()
{
        ads_name circle;
        ads_point ept;

        AcDbEntity *pEnt;
        AcDbObjectId objId;
        AcDbCircle *pDbCir;
       
        AcGeCircArc3d *pGeCir1,*pGeCir2;
       
        AcGeInterval interval1,interval2,intresult;
        double lower,upper;
       
        BOOL choice1=false,choice2=false;

        if(acedEntSel("\n选择第一个圆: ", circle, ept)==RTNORM)
        {               
                acdbGetObjectId(objId,circle);
                acdbOpenObject(pEnt, objId, AcDb::kForRead);
                if(AcDbCircle::cast(pEnt))
                {
                        pDbCir=AcDbCircle::cast(pEnt);
                        pGeCir1=new AcGeCircArc3d(pDbCir->center(),pDbCir->normal(),pDbCir->radius());                       
                        choice1=true;
                        pDbCir->close();
                }
                pEnt->close();
        }

        if(choice1)
        {
                if(acedEntSel("\n选择第二个圆: ", circle, ept)==RTNORM)
                {                       
                        acdbGetObjectId(objId,circle);
                        acdbOpenObject(pEnt, objId, AcDb::kForRead);
                        if(AcDbCircle::cast(pEnt))
                        {
                                pDbCir=AcDbCircle::cast(pEnt);
                                pGeCir2=new AcGeCircArc3d(pDbCir->center(),pDbCir->normal(),pDbCir->radius());
                                choice2=true;
                                pDbCir->close();
                        }
                        pEnt->close();
                }
        }

        if(choice2)
        {
                pGeCir1->getInterval(interval1);
                interval1.getBounds(lower,upper);

                acutPrintf("\npGeCir1_lower=%f,pGeCir1_upper=%f",lower,upper);
               
                pGeCir2->getInterval(interval2);
                interval2.getBounds(lower,upper);

                acutPrintf("\npGeCir2_lower=%f,pGeCir2_upper=%f",lower,upper);

                if(interval1.intersectWith(interval2,intresult)==Adesk::kTrue)
                {
                        intresult.getBounds(lower,upper);
                        acutPrintf("\nlower=%f,upper=%f",lower,upper);
                }
                delete pGeCir1;
                delete pGeCir2;
        }
}

下面是截屏图:c:\2.bmp
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-12-1 16:20:21 | 显示全部楼层
我觉得是这么回事:你用 getInterval() 得到的是两个圆的参数区间, 它们的参数区间默认值[0,6.283185],即[0,2π],两个相等的参数区间求交当然是它们本身喽。你是想做曲线求交点呢还是其他什么呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-12-1 17:57:42 | 显示全部楼层
最初由 lchdut 发布
[B]我觉得是这么回事:你用 getInterval() 得到的是两个圆的参数区间, 它们的参数区间默认值[0,6.283185],即[0,2π],两个相等的参数区间求交当然是它们本身喽。你是想做曲线求交点呢还是其他什么呢? [/B]



谢谢你的回复,我是想求曲线的相交区间,你的意思是它们的参数区间可以不是默认值?要求相交区间是否应该对参数区间做一些处理,怎么处理呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-12-2 11:04:23 | 显示全部楼层
能具体讲一下吗?我还是弄不懂怎样将AcGeInterval==> AcDbCurve ,谢谢
最初由 XDSoft 发布
[B][4、下面我们看看AcGeInterval 类的查询方法:


代码:

AcGeInterval::getBounds Function void

getBounds(

double& lower,

double& upper) const;

lower Output lower bound
upper Output upper bound

Returns lower and upper bounds of this interval in the output arguments lower and upper respectively.
The bound has a meaningful value only if this interval is bounded in the corresponding direction.




上面得到的结果两个double 类型 lower,upper 对应的就是 result 范围的最小参数值和最大参数值(就是我们熟悉的AcDbCurve 类下面的 param )。

5、这样,我们就得到了我们要的两条几何曲线实体的“并”的范围的 最小参数和最大参数,反过去对应我们操作的两天几何曲线的范围,下面我们就可以把:

AcGeCurve2d,3d 根据参数范围 ==> AcDbCurve
[/B]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-12-2 16:19:19 | 显示全部楼层
应该先求交点,再求交点对应的参数值吧?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-12-2 16:30:12 | 显示全部楼层
AcGeInterval对象是一个参数区间,它指示的是对应的几何对象的范围,比如一个圆的参数区间是[0,6.283185],即[0,2π],你可以通过这个参数区间得到圆的几何对象。我是通过得到样本点的方法来得到AcDbCurve的。

下面的程序段是我的个人理解和实现你可以试试:
AcGeInterval interval;
AcGeCurve2d *pGeCurve;
double lower,upper;
AcGePoint3d point3;

int a,a1;
AcGePoint2dArray pointArray;
AcGeDoubleArray paramArray;
double approxEps=0.000001;
pGeCurve->getInterval(interval);
interval.getBounds(lower,upper);
pGeCurve->getSamplePoints(lower,upper,approxEps,pointArray,paramArray);       //得到几何对象在参数区间内的点集
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-12-2 18:21:05 | 显示全部楼层

Re: [ARX程序]:[ARX程序]:AcGeCurve3d类对象的求交问题

最初由 fxcyx 发布
[B]在论坛中看到求相交域的话题,自己也按照各位的思路想试一试,在我的这段程序中:
1、先从图上选择两个圆,并建立两个AcGeCircArc3d对象,实现从DB—>GE;

2、得到两个AcGeCircArc3d对象的AcGeInterval值;

3... [/B]

我用PLINE转成AcGeCurve2d,然后
Gpln0->getInterval(Ginv0);
Gpln1->getInterval(Ginv1);
double bv0,bv1;
Ginv1.getMerge(Ginv0,Ginv2);
//Ginv1.intersectWith(Ginv0,Ginv2);
Ginv0.getBounds(bv0,bv1);
ads_printf("\n0:bv0=%f,bv1=%f",bv0,bv1);
Ginv1.getBounds(bv0,bv1);
ads_printf("\n1:bv0=%f,bv1=%f",bv0,bv1);
Ginv2.getBounds(bv0,bv1);
ads_printf("\n2:bv0=%f,bv1=%f",bv0,bv1);
Ginv2的bv0,bv1总是和Ginv1、Ginv0其中一个的bv0,bv1一样,这是为什么?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-12-2 18:49:54 | 显示全部楼层
我也遇到了这样的问题。我现在已不用几何对象求交了,因为我要解决的问题都是闭合的,我用面域就能很好的解决求相交的面积,另外你的关于判断面域相交的闭合个数的方法我已回复了,你看看吧,我想可能还有别的方法吧,我的email:    fxcyxkxm@163.com
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-12-4 09:48:27 | 显示全部楼层
我是要将多个封闭POLINE求交后对求交后的区域填充,我发现用构造面域的方法速度太慢,有别人做出来了的程序速度非常快,应该是用几何对象求交实现的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-12-27 00:24:13 | 显示全部楼层
这个使用几何对象求交的问题,我也正在寻找答案,我用面类的方法实现过此类功能,但是说实话确实比较慢的,感觉不太满意,前段看到XD工具里的曲线布尔功能,觉得这才是解决问题的最佳办法,后来自己试试,同样也碰到搂主的问题,而且如果按照lchdut 说的,先求交点,再求交点对应的参数值吧,如果是简单的曲线相交还好说,但是如果是很复杂的情况,如何找到对应的部分可是不知道如何作好,不知道晓东能不能再说清楚一些,给我们一些思路呢。期待中,这部分我想应该还有不少同志不能理解,顶!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-12-28 10:45:36 | 显示全部楼层 |阅读模式

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

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

×
再D一下,XD怎么好久没见
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-12-28 12:06:56 | 显示全部楼层
AcGeCircArc3d

    Adesk::Boolean intersectWith  (const AcGeCircArc3d& arc, int& intn,
                                   AcGePoint3d& p1, AcGePoint3d& p2,
                                   const AcGeTol& tol = AcGeContext::gTol) const;

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

使用道具 举报

发表于 2004-12-30 15:30:10 | 显示全部楼层
最初由 tchg 发布
[B]AcGeCircArc3d

    Adesk::Boolean intersectWith  (const AcGeCircArc3d& arc, int& intn,
                                   AcGePoint3d& p1, AcGePoint3d& p2,
                                   const... [/B]

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

使用道具 举报

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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 00:41 , Processed in 0.441059 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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