iCAx开思工具箱

标题: 【求助】点到平面的距离的疑惑 [打印本页]

作者: tari    时间: 2004-9-13 14:18
标题: 【求助】点到平面的距离的疑惑
用一个基准平面分割实体,使用函数UF_MODL_ask_bounding_box_aligned()得到min_corner,请问min_corner是不是一定在基准平面上?(csys是根据基准面的法向生成的)
恳请指点!
作者: CATIA_Boy    时间: 2004-9-13 14:21
这是一个到线的距离,你参考一下
  //
  // Computation of the coordinates of the point projected onto the line
    //
  // X1,Y1 coordinates of the first limit point of the input line
  // X2,Y2 coordinates of the second limit point of the input line
  // X3,Y3 coordinates of the input point
  // X4,Y4 coordinates of the projected point onto the line
  
  double X1,Y1,X2,Y2,X3,Y3,X4,Y4;
  
  // Compute Normal Point
  
  if ( abs(Y1-Y2) < 0.1 )
  {
    // Horizontal Line
    X4 = X3;
    Y4 = Y1;
  }
  else if (abs(X1-X2) < 0.1)
  {
    // Vertical Line  
    X4 = X1;
    Y4 = Y3;
  }
  else
  {
    // General Case
    double a1 = (Y1-Y2) / (X1-X2);
    double b1 = Y1-a1*X1;
    double a2 = (X1-X2) / (Y2-Y1);
    double b2 = ( (X2-X1)*X3+(Y2-Y1)*Y3 )/(Y2-Y1);
  
    X4 = (b2-b1) / (a1-a2);
    Y4 = a1*X4 + b1;  
  }  
作者: zhjb113    时间: 2004-9-13 14:36
CATIA_Boy  
他需要的是UG函数
作者: tari    时间: 2004-9-13 14:56
谢谢两位!
我使用UF_MODL_ask_minimum_dist()得到距离为什么没有一个是0呢?代码如下:恳请指点!
UF_MODL_split_body(body_count,tag_solid,eids[0],[$num_split_bodies,&split_bodies)]
for(int tt=0;tt<num_split_bodies;tt++)
{
    UF_MODL_ask_bounding_box_aligned(split_bodies[tt],csys,expand,min_corner,directions,distances);
   UF_CURVE_create_point(min_corner,[$point_obj)]
   UF_MODL_ask_minimum_dist(eids[0],point_obj,given1,guess1,        given2,guess2,[$distance,point1,point2)]
}
作者: tari    时间: 2004-9-13 14:58
我通过基准面切割实体,(csys是通过基准面的法向定义的)想通过距离判断是否小于系统误差来判断哪个实体在面的上面,哪个实体在面的下面?恳请指点!
作者: csftiger    时间: 2004-9-13 15:35
UF_VEC3_distance_to_plane可以求点到平面的距离
作者: tari    时间: 2004-9-13 15:43
第二个参数怎么设置,做个投影?谢谢!
csftiger wrote:
UF_VEC3_distance_to_plane可以求点到平面的距离

作者: csftiger    时间: 2004-9-13 16:03
平面是由一个点和一个矢量构成的, 第二参数是平面的基点
作者: csftiger    时间: 2004-9-13 16:24
其实min_corner当然不一定在基准面上,你可以认为min_corner and max_corner 两个点组成了一个Block,而这个Block将你的Oject整个包络起来。
你可以如下解决你的问题:
首先得到 min_corner and max_corner的中点,  
然后建立基准面的平面方程, 将中点的X, Y值输入,得到Z值
再比较这个Z值和中点Z值的大小,
如果中点Z值大,说明object在基准面的上面,否则在基准面的下面
作者: tari    时间: 2004-9-13 16:34
当基准平面的法向不是z方向时也行吗?
作者: csftiger    时间: 2004-9-13 16:44
yes
作者: csftiger    时间: 2004-9-13 16:46
除非你的基准面平行于Z轴, 那就没有上下之分了
作者: tari    时间: 2004-9-13 20:06
谢谢csftiger兄!
不好意思,我没说清楚,其实在程序中基准面的方向是不定的(靠交互选择平面得到),其实我想区分的是那一部分实体在基准面的法向方向边,那一部分实体在基准面的法向反方向
作者: csftiger    时间: 2004-9-14 08:15
如果这样,min_corner and max_corner对你没有意义。
你应该在Body上任取一点(可以通过edge or face),注意这一点不能在基准面上,否则重新选取。然后将该点投影到基准面,得到投影点。
通过选取点减去投影点得到一个Vector,并将Vector单位化,
将基准面法向量单位化
通过函数UF_VEC3_is_equal比较两个单位化的Vector
如果相等说明body在法向量一侧,否则在反向侧。
作者: tari    时间: 2004-9-14 08:37
谢谢!
在你的提示下,我昨晚也想到这个方法,呵呵
还有一个问题就是,点投影到平面的函数是什么?
作者: csftiger    时间: 2004-9-14 09:02
其实几何的问题尽量用数学函数解决,不得以才通过作图实现。你可用函数UF_VEC3_distance_to_plane 先求距离,如果distance有正负的化,一切直接OK。如果distance没有正负区分的化,可以将点沿normal方向平移distance,然后再求点到面距离,如果大于0,说明body在法向侧,如果等于0,说明body在反侧。平移方法:
  
point_trans[0] = normal_unit[0] * distance + point[0],
point_trans[1] = normal_unit[1] * distance + point[1],
point_trans[2] = normal_unit[2] * distance + point[2],
  
你学什么专业的?
作者: tari    时间: 2004-9-14 09:40
谢谢!我以为会有二次开发函数求这个,没想通过解析几何法来求,呵呵,我学的是机械




欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3