|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
, A' M+ a7 f f x) R, m( J- ^4 Z8 g5 c( q# ?
: }" T* y: _7 m/ U: E0 b# M2 Z/ Y& ^
【二次开发源码】一种基于点投影,获取投影原始点的方法
! u- `- a4 I& O' d2 Y1 d: v1 ~& B3 ?$ _0 i
一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角; C+ d9 ~1 z# ~) [8 K/ _7 I
然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
Z0 y8 Q- o6 a& }+ G6 @+ s0 I
- x s# Z: Y0 r* R% x2 f: u- F6 Q9 S; L! Z
- //这里仅仅考虑Z轴方向3 F; i. E* z0 O* ~+ Z
- void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])$ L! }( _7 F4 R5 p. Y: n
- {$ }: q0 R1 ^0 P/ I% Y, Y+ C
- double dotResult;1 L- _: n: b6 V2 G
- double longDistance;
1 W% ]( \0 |* x3 z- b( F/ Z" h - double zDir[3] = { 0.0,0.0,1.0 };
6 D0 q4 o2 ]# o, m& Y. h - //直线距离9 b9 z+ W2 Q& o4 R7 o, N
- double deltaProjectDistance = fabs(maxZValue - basePoint[2]);) d4 z9 E1 E; h' u5 [9 X
- # ?$ B; A* U6 I9 ]. D- m+ g5 L
- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);
7 Y$ r' a% V; G; J
# K, K/ |; L. P- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回
8 R% M6 }8 }* u3 M t - {
1 k2 M8 e3 i! k3 j! k( B' i - UF_VEC3_copy(basePoint, newOriginalPoint);
( X+ ^: Y6 ~& h) _& T9 N - return;6 a% m5 C# t% O
- }
" Y+ @3 H& n" g" C( x+ A) h& h! n - . {$ y: k; M. }1 m
- //计算夹角,通过单位矢量5 H$ G" M2 D* ^4 T* Z2 y5 q0 L
- //faceDir 可能反向
% c2 h, W6 ]$ K' J1 M - UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);
+ g) ^7 ]- M8 I - // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle) 8 d# e- U; u: G; R" ~
- double cosAngle = fabs(dotResult);, _% y: j" r3 R V4 t
- 6 ~8 x8 z" I2 c
- //斜边距离7 k: H3 e8 ^- O: c g
- if (EQ_is_zero(cosAngle, MINTOL))
7 b7 P$ l" W" `" y1 u* J1 V - {. t2 e. H) p7 d$ U! \% G
- longDistance = deltaProjectDistance;# O5 V k: ^' B* j0 ?
- }
$ v, W8 _: w# N4 e6 e1 i - else
. q) _& F8 Q' ]/ h7 B - {" G" e" l: Y7 a* { V4 {
- longDistance = deltaProjectDistance / cosAngle;, u- w. H3 n! d4 f6 _0 L- x2 b M
- }
' _; I$ f+ D! s! j -
+ T6 S- ^, R. x, K, O - //这里可能出现方向相反,我们需要进行一次判定
/ Q6 r* z9 g+ G5 C' _
* ~; M+ K) q. [! y! Z! o- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);) G/ M* x. x( {; M( _
- 5 V+ X. l. y$ U( j& V
- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);' i2 p! D+ p, p
- 9 |3 ^6 r9 [9 o9 e# R
- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))5 {9 U: U- U, X+ x' G9 Z
- {
; T4 ?9 t" }& `0 ~ - UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
* u7 A- `- f: H1 D; |$ r/ X$ t) N - }
% Q% L( D. B9 w) a3 X
1 r1 C* m8 e# u( ]; F A+ b7 s
7 @% O4 g3 H7 S- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);- y& Q4 Y+ ]9 k+ a* ]* ]
- }
复制代码 9 n7 c) x* e) U3 W' W) g6 `
& i2 E3 v" N3 w' ^ |
|