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

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

[复制链接]

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

2470

主题

1275

回帖

8万

积分

管理员

PLM之家站长

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

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

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

x
, ]* i$ h! R) p% o5 l9 P
- D3 v: Q. Y7 \+ E/ J% [0 |
4 L- l1 O( {+ M
【二次开发源码】一种基于点投影,获取投影原始点的方法0 q. m# _/ r% _0 P0 l& z6 d% h6 V
  `" v( N6 I$ {3 Z0 N7 k& D% r
一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
) y: f$ D0 ~# y, ~5 K然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
8 I- G8 `0 I, m& P2 a1 Y; d$ O: N
0 q" W# H2 p; B# D7 Q- F; M

  1. 9 v6 ]+ d1 D( f* w+ N: Z
  2. //这里仅仅考虑Z轴方向
    ( {( w4 R* N% k0 z. V# c
  3. void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])( J6 Q" u( m+ i; D: s" t7 Y& u1 Z1 y
  4. {  s5 ]* E# _# X1 u4 l
  5.         double dotResult;
    0 a0 ]+ s6 P# O- V9 I! z1 M8 q
  6.         double longDistance;/ g( Z8 k' I9 p2 n+ K
  7.         double zDir[3] = { 0.0,0.0,1.0 };
    ! C. y. P  s- L/ x  l) }% T, _
  8.         //直线距离5 u3 `# Y1 q1 i. f" T% B( T: A* Q
  9.         double deltaProjectDistance = fabs(maxZValue - basePoint[2]);8 W& N+ u) [4 t  s# ^4 k+ W
  10. $ j4 \$ B8 @1 D0 L4 ^. P
  11.         Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);  W# l. g* x8 ]3 r) P

  12. 3 W1 ], l% ~0 P  l
  13.         if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回* Z/ w2 T4 C0 n. c
  14.         {' ]* `( |- |" S5 \. I
  15.                 UF_VEC3_copy(basePoint, newOriginalPoint);
    0 i6 g5 W# t) z
  16.                 return;5 S0 W' a. \9 v" N% p7 U6 L
  17.         }' T+ N9 v. V. }5 P& z. P. N9 u2 w
  18. 9 ?8 g1 |! n* G) Y, t$ H" U
  19.         //计算夹角,通过单位矢量0 d9 f8 X" a- ^, U+ ]
  20.         //faceDir 可能反向
    % W3 @; \% |* V
  21.         UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);
    : c$ S* m0 P8 N7 E* Z) \
  22.         // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle)
    : R! H, @8 h0 n/ y6 r2 j% v! D! }' v1 c
  23.         double cosAngle = fabs(dotResult);
    + @6 a: P' `% E, M
  24.         . n& q$ k! f# \
  25.         //斜边距离
    / A. k8 L& B2 n1 M' i% w
  26.         if (EQ_is_zero(cosAngle, MINTOL)): u+ K: I; R5 K1 R/ g* J* H1 H
  27.         {
    + M6 R2 [8 S9 ]$ l0 F* H- B
  28.                 longDistance = deltaProjectDistance;
    % R5 }+ l6 E1 S2 A7 R
  29.         }
    - j; F: |6 ?# \% l& g1 d# r2 g
  30.         else
    ; t/ e3 t) H( Y
  31.         {
    / n2 v4 W3 \2 ]) S) V9 o
  32.                 longDistance = deltaProjectDistance / cosAngle;
    1 }' }- ~8 B- `7 T6 M
  33.         }, _, _/ x8 N3 P! U6 M
  34.         # C0 m) B: v- M/ z$ x; ]; o
  35.         //这里可能出现方向相反,我们需要进行一次判定
    4 Q/ y* E& n# ~/ F/ g
  36. " [! x" x1 }8 f, j2 K
  37.         UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);
    . l4 W6 i( q! B
  38. # [  E$ J4 {, F+ Z) ~
  39.         Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);. M* v  Z: C# A* s/ J, p
  40. 2 Z: T6 \' V" O  c8 O8 j/ g6 r" g( e# t
  41.         if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL)), ]) f3 y& U0 d/ O4 g$ s' H2 F
  42.         {+ d% ~& A, _2 o- D* \+ {
  43.                 UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
    $ E$ R. O  o) n. f6 [! s' ^- \
  44.         }
    4 J$ `% y5 l$ Z
  45. ( W4 E3 V- m& t# @) v6 {% v1 `
  46. , R* K' ?) ?4 h3 y7 v3 V% l5 N0 O5 w+ i
  47.         Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);' H1 E. g5 X$ S/ L. i3 w
  48. }
复制代码
' {; _5 u% u! ^# ?- C$ i" R
9 @" i, D3 C$ x9 R) A
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了