iCAx开思网

标题: 求助:关于一个point3 是否在一个已知face上 [打印本页]

作者: Chunlei_li    时间: 2008-12-2 20:51
标题: 求助:关于一个point3 是否在一个已知face上
各位大侠:

我是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!!!!!!!!!!!
作者: Chunlei_li    时间: 2008-12-2 20:53
大侠们救命啊~
作者: dianzi24    时间: 2008-12-3 08:00
你求距离不行吗?如果点和面的距离小于一个值(0.01?)就认为点在面上。
作者: Chunlei_li    时间: 2008-12-3 16:27
标题: 回复 3楼 dianzi24 的帖子
当然可以了。我的法子只是个笨法子。那求距离怎么求啊? 尽情赐教啊!
作者: dianzi24    时间: 2008-12-3 17:03
UF_MODL_ask_minimum_dist
作者: tangxu12    时间: 2008-12-3 23:27
UF_MODL_ask_minimum_dist就最小距离就可以了
作者: Chunlei_li    时间: 2008-12-16 01:12
多谢大侠们的救命之恩。可是只救活了一半啊。

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

大侠们,谁能想到更好的解决确认一个点是否在一个面上的问题呢?
作者: dianzi24    时间: 2008-12-16 08:19
别使用猜测点
作者: jackie2003    时间: 2008-12-17 10:38
不太了解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, 以后尽量考虑用最新的吧
作者: Chunlei_li    时间: 2008-12-18 16:00
标题: 回复 9楼 jackie2003 的帖子
多谢帮忙 UF_MODL_ask_point_containment 我之前试验过,因为这个函数不能设置tolerance误差更大。

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

多谢多谢
作者: htc850905    时间: 2008-12-28 04:58
抱歉,我是用GRIP开发的,帮不了你了
作者: jk5168    时间: 2009-1-17 18:42
tag_t a_face,a_ptid;
double junk[3],ok_dist;
UF_MODL_ask_minimum_dist(a_face, a_ptid, FALSE, junk,
             FALSE, junk, &ok_dist, junk, junk);
這函數我用的多了! 要直接表面id與點id 來求取

如果不用點id  是pt [3]

tag_t a_face;
double pt[3],junk[3],ok_dist;

UF_MODL_ask_minimum_dist(NULL_TAG,a_face, TRUE, pt,
                FALSE, NULL, &mini_dist, junk, junk);
作者: sualpha    时间: 2009-1-24 00:09
有点讨论的气氛,不过今晚不能再研究了
作者: Chunlei_li    时间: 2009-1-24 05:46
标题: 回复 12楼 jk5168 的帖子
问题是就是这个函数UF_MODL_ask_minimum_dist( );捣的乱。每次计算出来的距离偏差特别大。我的要求是误差要在加减0.001. 可是它返回的值总是经常大于这个数,造成明明点在面上,它却说不在面上。

还有NX取出来的值总是不精确,好比我给一个点的坐标如果是(2.000, 1.000, 2.500)这个数,NX经常给的float point是(1.9998, 1.0011,2.4999) 等等,我从debugger里看到的。 会不会是因为这个造成的误差呢? 总之就是误差很大了。

有没有什么解决办法啊? 有什么没说清楚的,我可以继续解释。大侠帮帮忙~ 我的项目刚起步,这只是最基础的开端,可是却卡在这里很久很久了,用NX API的人也非常少,求助阿!




欢迎光临 iCAx开思网 (https://www.icax.org/) Powered by Discuz! X3.3