找回密码 注册 QQ登录
开思网工业级高精度在线3D打印服务

iCAx开思网

CAD/CAM/CAE/设计/模具 高清视频【积分说明】如何快速获得积分?快速3D打印 手板模型CNC加工服务在线3D打印服务,上传模型,自动报价
查看: 17006|回复: 13
打印 上一主题 下一主题

[求助] 求助:关于一个point3 是否在一个已知face上

[复制链接]
跳转到指定楼层
1
发表于 2008-12-2 20:51:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多同行朋友,交流,分享,学习。

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

x
各位大侠:

我是NXOPEN 的新手,目前遇到一个问题,已经卡住很久了。

我从X3D 文件里提取出来一个面的描述(一连串的点的坐标: 比如point="-4.325 -1.394 0.974, -4.325 -0.146 1.694, -4.35 -0.139 1.669, -4.35 -1.376 0.955"), 我把这个坐标存在了一个link list (point3List)里, 并试图用这些坐标来确认一个part中的face。我用
void evaluateClosestPoint (
const Point3 & reference_point,
double * parameter,
Point3 * closest_point ) const;

来获取一个面上离已知的点最近的点closest_point,然后用这个点再和那个已知点来比较,
bool isEqual (
const Point3 & point,
double tolerance ) const


如果这两个点相同,那么在处理link list里的下一个点。如果坐标中所有点都在这个面上,那么理论上这两个面就印证了。 可是事实上却不工作。


哪位大侠知道更好的函数来解决这个问题呢?也许我用的函数不对,或者太繁琐?我的代码如下:

       // check if this point on any face
        UgIterator < UgFace > curFace;
        while ( !curFace.isFinished ( ) )
        {
                // point3List 是个link list,含有X3D文档中提取的用来描述一个面的坐标。
                point3ListIt = point3List->begin();

                while( point3ListIt != point3List->end() )
                {
                        Point3 *closestPoint = new Point3( );
                        (*curFace)->evaluateClosestPoint ( *point3ListIt, &parameter_u, &parameter_v, closestPoint);

                        // once found the matching face, check the next point
                        if ( closestPoint->isEqual( *point3ListIt, 0.0000001f) == true)
                        {
                                cout<< "current point is equal" << endl;
                                bMatched = true;
                                point3ListIt++;
                        }

                        // else try next face in the part then
                        else
                        {
                                cout<< "current point is not equal" << endl;
                                point3ListIt = point3List->begin();
                                bMatched = false;
                                break;
                        }
                }

                // if all points in this array(Face) matching with this face, the two faces are matching
                if(point3ListIt == point3List->end() && bMatched == true)
                {
                        // Get the name of the matching face
                        faceName = (*curFace)->getName ( );
                        return faceName;
                }
                else
                {
                        curFace.findNext( );
                }
        }

SOS!!!!!!!!!!!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 赞一下!赞一下!
2
发表于 2008-12-2 20:53:47 | 只看该作者
大侠们救命啊~
3
发表于 2008-12-3 08:00:35 | 只看该作者
你求距离不行吗?如果点和面的距离小于一个值(0.01?)就认为点在面上。
4
发表于 2008-12-3 16:27:07 | 只看该作者

回复 3楼 dianzi24 的帖子

当然可以了。我的法子只是个笨法子。那求距离怎么求啊? 尽情赐教啊!
5
发表于 2008-12-3 17:03:32 | 只看该作者
UF_MODL_ask_minimum_dist
6
发表于 2008-12-3 23:27:38 | 只看该作者
UF_MODL_ask_minimum_dist就最小距离就可以了
7
发表于 2008-12-16 01:12:30 | 只看该作者
多谢大侠们的救命之恩。可是只救活了一半啊。

我发现UF_MODL_ask_minimum_dist并不能总是算出正确的距离。N久的测试之后,发现这个函数返回的最小距离是通过一个对象上猜测出来的Guess point来计算的,而这个guess point误差时大时小,如果是在加减0.001就符合要求,但是很多时候都大于这个误差。

大侠们,谁能想到更好的解决确认一个点是否在一个面上的问题呢?
8
发表于 2008-12-16 08:19:19 | 只看该作者
别使用猜测点
9
发表于 2008-12-17 10:38:20 | 只看该作者
不太了解X3D文件,但是你要是已经有了NX face tag, 可以考虑使用UF_MODL_ask_point_containment

还有一个,函数UF_MODL_ask_minimum_dist已经有UF_MODL_ask_minimum_dist_2, UF_MODL_ask_minimum_dist_3, 以后尽量考虑用最新的吧
10
发表于 2008-12-18 16:00:34 | 只看该作者

回复 9楼 jackie2003 的帖子

多谢帮忙 UF_MODL_ask_point_containment 我之前试验过,因为这个函数不能设置tolerance误差更大。

UF_MODL_ask_minimum_dist_2, UF_MODL_ask_minimum_dist_3 还没有试过,因为后面的那个accuracy 不知道怎么设置,没有见过范例。等试验后,我再来汇报,呵呵

多谢多谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3D打印手板模型快速制作服务,在线报价下单!

QQ 咨询|手机版|联系我们|iCAx开思网  

GMT+8, 2024-12-29 14:30 , Processed in 0.030692 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

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