PLM之家PLMHome-工业软件践行者

[二次开发源码] 【二次开发源码】一种基于点投影,获取投影原始点的方法

[复制链接]

2023-2-28 20:27:29 1191 0

2470

主题

1275

回帖

8万

积分

管理员

PLM之家站长

积分
82162
QQ
发表于 2023-2-28 20:27:29 | 显示全部楼层 |阅读模式

请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!

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

x

8 g2 e3 r4 z' N4 j7 G' r$ U) q
% Q! u- B6 g& b1 V. w7 W5 N' p3 L# V( V+ @, ^9 g+ v, Z: C
【二次开发源码】一种基于点投影,获取投影原始点的方法- {4 B6 m! d  ?: Y7 j$ T0 C# Y

4 G& j8 `# y4 b6 o1 F一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
: y0 A! E" c1 B然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量; n* `- a% R/ g0 {7 [+ U( ?; g
- N! n1 s+ H7 S6 {* l

  1. ' i( V) m) C& v5 {
  2. //这里仅仅考虑Z轴方向/ o' I3 ]# X/ T; k0 Q8 b& ^& X
  3. void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])9 I; |3 T9 t7 ]4 D) A
  4. {
    - \; v( {1 h+ P9 b4 T) V/ E
  5.         double dotResult;5 z' v( j4 h& `# [$ J) a/ h8 K$ j, ~' V1 G
  6.         double longDistance;. G( @/ E! V$ e+ ?/ f, c! E
  7.         double zDir[3] = { 0.0,0.0,1.0 };
    - q! ^6 ]/ w( R
  8.         //直线距离
    - w2 t1 ~8 F. z7 s! S
  9.         double deltaProjectDistance = fabs(maxZValue - basePoint[2]);2 ]; H. f3 b  E# Q# z( }
  10. 7 E- k9 x* q3 f% y# Z
  11.         Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);# |! |; d+ `) E0 ?6 _$ ~' t& e

  12. ) W/ ~" L/ M  }  {2 g* S& i% l
  13.         if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回5 C" W: l) J2 P( J9 f
  14.         {
    4 O( y& a1 _5 O5 [
  15.                 UF_VEC3_copy(basePoint, newOriginalPoint);. k. G) u3 b  {2 M; Z# |
  16.                 return;
    ( K7 L3 ^2 H! [% t5 e
  17.         }
    ! r. b, \2 o! r: p( B7 n! P5 B& |
  18. ) }) W+ \9 r1 A" ^( `7 i
  19.         //计算夹角,通过单位矢量
    1 Z* [1 D; F3 s& X/ W: |3 @
  20.         //faceDir 可能反向
    - ~- _( |) h# l6 N1 w7 _
  21.         UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);
    ! F, s0 s3 G  v; c, l/ B2 h
  22.         // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle)
    3 _9 x4 E, U1 \$ k1 \5 @3 D
  23.         double cosAngle = fabs(dotResult);
    , `# t# A! c8 P2 K
  24.         5 n& i" x( `  y: J; r5 u1 Q9 e
  25.         //斜边距离, R! Q- q1 U6 \/ e$ n9 y7 _
  26.         if (EQ_is_zero(cosAngle, MINTOL))
    3 e$ X6 v$ B% {+ l
  27.         {
    ' \7 ]# k' ^) O0 @7 y+ @. j
  28.                 longDistance = deltaProjectDistance;: c0 a' ]9 g) ]# |* ~) W/ f
  29.         }  I7 |- R' M' @# z; }8 ~6 o9 r
  30.         else: P1 L) v$ I  \4 u! S
  31.         {
    1 k: c9 M- B& f
  32.                 longDistance = deltaProjectDistance / cosAngle;
    * z9 x/ P. a+ x+ ~+ F
  33.         }' [4 Q9 F0 S& s6 ~7 W
  34.         2 y  g9 c  G9 k2 x, j: p! p! n/ u
  35.         //这里可能出现方向相反,我们需要进行一次判定
    1 y8 v4 l% \% l; ?
  36. # }& I# s3 k5 G( `! `: r
  37.         UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);* K/ M, A$ `1 e, D
  38. - N- w) F) _; r* I) N6 E
  39.         Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);3 J8 Z; \" H4 C! s+ z1 _% X" ]+ y

  40. 4 M3 [+ Y/ o* h. Q
  41.         if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))( ^7 `0 P% ^; W7 f
  42.         {
    $ B+ o+ J1 I& x, v
  43.                 UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);, P  ]# N- J2 t1 Y1 w6 z5 I+ K
  44.         }
    0 p4 S; p# o+ C# x: G0 Z6 E
  45. ' M5 }2 m& O8 \% |2 y

  46. 3 q7 S2 H0 x- h7 Q8 e: Z/ h7 `
  47.         Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);% c" j8 f  j1 p$ J
  48. }
复制代码
$ i7 }% Y; u# ]1 Q$ m1 ]1 c9 L7 M# e
- Z; L5 q3 U8 }6 d- U' s1 @
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复

使用道具 举报

发表回复

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

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了