|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
) f% A, A" y6 N) o, C1 D3 R& x$ t( G' s$ e8 a
0 {! _1 b9 A' e7 p& O
【二次开发源码】一种基于点投影,获取投影原始点的方法8 `+ ]: `$ y: u3 P' z8 {
0 T! I. b. R9 V+ Z$ u7 D& b一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
" X) ]* W: I! h+ i- R然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
# e) B8 l: n2 M1 A" r8 Y, x7 ~/ p: h, N
' j/ B. i, m% _; R6 z2 i- //这里仅仅考虑Z轴方向4 Q9 i* o: r4 I6 d0 |
- void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])
2 h! F- J4 @4 A9 ~5 F - {- Q. y% I6 p2 m; Y/ F
- double dotResult;
3 a x6 q- Q4 L; F# Y" w3 z# ] - double longDistance;
) i9 g; L2 T: j - double zDir[3] = { 0.0,0.0,1.0 };& D- C2 m6 @5 j, W' u; X% W4 k
- //直线距离' i7 W( g" d' }. V6 I4 u; o; v
- double deltaProjectDistance = fabs(maxZValue - basePoint[2]);
; o1 P" s/ B4 g# i( v - / @9 n; I5 ]; |" Q, i$ V* p2 O
- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);5 L- E, w$ @" [6 @
- & u: s4 J2 i) O) K
- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回. E8 ^0 w* N* B8 q( @# a" w4 P
- {' M' u H$ Z6 J! y& w
- UF_VEC3_copy(basePoint, newOriginalPoint);
. }5 y# |1 \+ u - return;+ Y% Y# G6 J6 O- O2 O6 @% [4 q) v
- }
7 o0 ~+ W# k1 ?7 Q - ; ~' T0 V) H2 ^* n+ T1 j7 [
- //计算夹角,通过单位矢量
1 f& a; J9 i& s& O - //faceDir 可能反向
- ^! s- ~' H* ? - UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);5 f8 X: ?$ O2 `8 X4 y4 [% w, O' g/ {
- // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle)
/ n) d1 p1 c* C$ x - double cosAngle = fabs(dotResult);
1 l% w# m& }) O* D$ o - 7 W1 a# Y& y. R( |
- //斜边距离' J7 K8 l- I& M7 ^8 h" y& ~
- if (EQ_is_zero(cosAngle, MINTOL))
; E. g4 W: U$ }% r" ^/ O% R l - {* i6 P' t% ]6 |& W$ N
- longDistance = deltaProjectDistance;5 O5 L5 v* T6 H+ U0 \, Y N
- }$ v; y/ w$ B+ Q9 ]- Z" i9 A
- else
8 c* Q7 \# z# }' C/ o - {
! k1 d% J1 _. Y- Y2 x - longDistance = deltaProjectDistance / cosAngle;1 o) B9 M. d% Q; ?$ s2 `
- }0 ^; Q& m3 c" Z, C; {* Z O
-
: ]" `, p' P8 z - //这里可能出现方向相反,我们需要进行一次判定9 u3 l% u& L! v2 B" d0 h
# o. n8 q4 d/ D' j0 C- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);9 H4 ]; `9 b: n
$ z4 b2 L. x: ^' o' z2 c- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);
: T2 p. W: \" g/ s8 g7 U0 A - 5 Z4 }( j- E" w% `+ R
- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))
* G6 c+ n" J9 D* i! m( L0 J - {
0 {, Q. Y' m: p! J6 x - UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);5 S: V n) R4 m( D
- }
# z* s" U; p. J/ Z% c
# g+ w( j- H: e: I9 |
& H4 c {3 V {7 b2 U+ R- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);4 M6 ~ U4 m( R% s
- }
复制代码 ; P# e2 N& g2 s5 d# C
0 _! x% J8 K4 r; P- M
|
|