PLM之家PLMHome-国产软件践行者

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

[复制链接]

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

admin 发表于 2023-2-28 20:27:29 |阅读模式

admin 楼主

2023-2-28 20:27:29

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

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

x
7 y/ \; N' l% X# l
- y* y9 C0 Z5 s* V% m
- `- g2 g% C& U+ `- C3 A1 j
【二次开发源码】一种基于点投影,获取投影原始点的方法
( U+ F4 U3 N6 h6 L4 Z- G
/ U9 e: T5 F$ Z: Q6 b7 }, k& V一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
3 z+ a: Y0 r+ u7 T2 f! Z然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量$ _. @( A7 K. _6 N5 I" ~

& m  W+ Q3 t' V2 }
  1. ! |. M6 J+ ^0 i6 B* ]  Y
  2. //这里仅仅考虑Z轴方向
    % J- D- W1 F; M  k! F
  3. void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])
    % E5 K+ H% r0 w' d% P6 ^6 A5 n! C
  4. {
    - ~% D5 Q6 h+ b: U& `! O
  5.         double dotResult;
    ! D7 f) ?5 b7 B# W
  6.         double longDistance;7 W; R0 p% m1 L! N; J; ^
  7.         double zDir[3] = { 0.0,0.0,1.0 };) z! `7 e% ~! n' a$ r, O( O( Q
  8.         //直线距离
    % b/ I. i2 y, T8 t$ p
  9.         double deltaProjectDistance = fabs(maxZValue - basePoint[2]);
    * Q7 n# {% V0 G; S. k

  10. : V3 D  H% y! M1 o/ `# l4 i1 M. [
  11.         Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);, l. w% S) Y/ s* x7 G
  12. & u1 V  X/ B' w" G* R% c
  13.         if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回
    3 ?% o& Z* g$ g; v5 L8 G  ], \
  14.         {( G/ A7 L! [! `2 k- l
  15.                 UF_VEC3_copy(basePoint, newOriginalPoint);
    ) g4 c' U7 W, [, m1 }. q7 n) a
  16.                 return;
      v$ d" t, k5 X8 `
  17.         }
    * p/ ]& D( ?2 Z
  18. % V( Q  f  o' N+ W  c7 G
  19.         //计算夹角,通过单位矢量
    ' m) |) d* b  Q" F  J) v
  20.         //faceDir 可能反向 ; ?3 f* ~2 F) |! e2 `
  21.         UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);; Y9 K' o; l. p# F+ e
  22.         // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle) ; V  f; Q2 \; e
  23.         double cosAngle = fabs(dotResult);
    ; A4 F' m* j# }7 |
  24.        
    * r- L& ?6 t$ R3 L5 {9 @7 R6 p
  25.         //斜边距离
    + B% n5 h: r2 ?( O! F& n) i% M
  26.         if (EQ_is_zero(cosAngle, MINTOL))
    5 ?" o! N, _5 z- `0 C- n$ B
  27.         {
    9 ]2 X" E+ W4 T, ^/ k5 E
  28.                 longDistance = deltaProjectDistance;
    * K8 j! i- [* n; x
  29.         }' c( U; t/ `- {$ Q; f* c
  30.         else' y6 J4 _' ~/ M$ [
  31.         {" d8 g+ U' V6 V- W+ W
  32.                 longDistance = deltaProjectDistance / cosAngle;4 m! B0 t0 j" h  b/ s
  33.         }' z. z5 V' s9 Y# d, U5 d
  34.        
    9 |' v- `" n* B4 L. G0 c
  35.         //这里可能出现方向相反,我们需要进行一次判定
    , w& q0 ?9 q+ R$ o6 d3 o
  36. % b3 k+ _- f+ ?( j
  37.         UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);
    0 L( H6 }$ U/ [3 B. _3 T

  38. , U6 w1 C2 i7 B" e
  39.         Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);
    $ [6 v7 W2 X2 `! C

  40. & [* w- ~' X) @
  41.         if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))% @! F0 j& W/ s7 J
  42.         {& d& s: {4 d# B  {. D
  43.                 UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
    7 M1 u8 K: ]& N* P  R& A
  44.         }
    * H5 J- I& K# @8 n+ D/ f( t3 h
  45. : W% D% L, A4 C, L  W' S
  46. ; Q6 a; z3 }4 j1 L. E6 [
  47.         Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);  ~+ Z9 C5 N* @# [2 `/ E0 _2 h
  48. }
复制代码

; S% D& Y4 F" a2 B- k1 @2 @
8 p$ Q4 ]  {# \* Y# ^
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了