查看: 1468|回复: 0

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

[复制链接]

6

主题

4

回帖

60

积分

管理员

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

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

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

×
* ~* x5 A6 [7 |' O) G
. r4 P7 h7 A  _- j
9 j& R* O8 P. @
【二次开发源码】一种基于点投影,获取投影原始点的方法
7 d- r) m& r. b: V% M. V3 o' o9 u' u; b0 Z# n7 p
一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
, W" V8 R8 P0 q. x% x然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
6 Z% J% r1 ~% @/ m- f) g" L) r
6 r- \+ ]% P. M' H

  1. : W$ I0 Q/ J& X, v+ O8 Y( v
  2. //这里仅仅考虑Z轴方向0 m9 F; \( Z9 j- Y+ J1 \
  3. void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])
    6 X& _. S% N! j$ K% p# U
  4. {
    - [! B( Z% L6 O5 w7 q
  5.         double dotResult;* L$ U2 Z3 T, _1 s
  6.         double longDistance;* z) M% N3 T5 d* H0 f( b; p
  7.         double zDir[3] = { 0.0,0.0,1.0 };# `8 P7 s% s$ ^7 y
  8.         //直线距离+ C8 j4 k" K$ n5 E5 P
  9.         double deltaProjectDistance = fabs(maxZValue - basePoint[2]);8 i# k  B: a3 @' s( f' N1 r

  10. 0 t5 e' H  A* |  t
  11.         Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);. M9 l2 p& Q  l% }& |4 T8 s: E

  12. 5 U, n3 }2 _. B2 D0 h
  13.         if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回
    8 B0 a; k, u2 @2 k8 D* J" Z
  14.         {
      i% f4 y- e. J. U/ `
  15.                 UF_VEC3_copy(basePoint, newOriginalPoint);
    / V  ~: Z. C5 S# Y1 q
  16.                 return;0 a4 A" ?4 h! g4 _5 f
  17.         }
    9 F2 c5 L" G5 }1 ?4 g8 T- `

  18. ! M& s8 W; ^& L8 ~( T
  19.         //计算夹角,通过单位矢量0 G. |3 h* e* e) L$ E; Y) E8 ^
  20.         //faceDir 可能反向 / g+ S8 Q: _1 K9 V  G
  21.         UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);
    ; K5 l& J5 j9 e6 J& _( E
  22.         // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle) - h8 ]2 B6 g6 E  y; `7 P
  23.         double cosAngle = fabs(dotResult);
    ; @3 ^. r3 \8 R7 W
  24.         2 E8 B+ h! f. \" C0 y& e% e# b, @& r3 R
  25.         //斜边距离
    5 G/ l# p/ f- u  P) _( B
  26.         if (EQ_is_zero(cosAngle, MINTOL))
    $ F7 ^; u0 ?+ H8 S
  27.         {
    ' ?6 b5 {8 N7 D  o5 W' L# K& x* ^1 G
  28.                 longDistance = deltaProjectDistance;# ], r, C# {7 h" E
  29.         }
    1 o% ?- g2 E4 \
  30.         else
    & j4 Q* K1 b! t8 z# t* B% N
  31.         {: l& d& b* t/ Q, l
  32.                 longDistance = deltaProjectDistance / cosAngle;
    : o$ M6 }! _+ ?3 o6 f
  33.         }
    3 m& Y0 N; d0 d( m* o% l* Q
  34.           J/ ~% b, O5 E( k
  35.         //这里可能出现方向相反,我们需要进行一次判定( C, e9 K. O: F
  36. , Q, B& p" n" z, G, N+ P) h
  37.         UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);, C* p9 U6 P) @, d
  38. : n* H; ]$ l, r* S. I
  39.         Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);, T; m8 i9 ~3 Y' o1 i% N

  40. 6 d% U9 j; ?" s/ [( e' P0 }$ M
  41.         if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))) K. H0 s+ i% I; u$ w- O
  42.         {
    5 G( q5 Q1 y& X; Q
  43.                 UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);) w, U" U+ E# L# x/ e9 e8 a
  44.         }
    0 [# z% v1 ]7 ^  n9 D" ]
  45. # p; w7 Y3 Y( T

  46. 3 c' z5 G( W3 k: s7 j& G+ {: j
  47.         Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);
    1 g/ Q! e& z( a% H
  48. }
复制代码
) B, f5 i" T% Z$ n- O, J
. k% O2 g2 e, U: y+ x3 Z! G2 f0 x
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

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

本版积分规则

在本版发帖
关注公众号
QQ客服返回顶部