|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
! X% q1 S8 j& s/ A( w7 e6 Q! w, i
& l* C9 R) k' }& Y
' k7 L I9 r3 Y8 D% F! C9 Z+ Q【二次开发源码】一种基于点投影,获取投影原始点的方法% a3 h& t8 a/ u5 c* D
2 C) i1 p1 T p8 C一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
- U3 ] N: w* w% b) D9 w' R然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
[! T( A) j$ {8 {4 K4 }- A
$ K- d7 N/ e& v& l) C- 5 M( s6 ^1 L) {( Y1 ~8 F; T3 f3 o
- //这里仅仅考虑Z轴方向) O8 o: m) J& r- r3 P
- void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])
( W/ x5 }; N4 W* R3 i5 k - {& G6 U% T1 v) q9 @. P7 H+ y2 P. Q
- double dotResult;7 d# D& K4 }$ E
- double longDistance;
5 S9 j2 D% S" ^* ?3 w - double zDir[3] = { 0.0,0.0,1.0 };% [$ [& E, n$ c u- i
- //直线距离
4 b9 s& m3 R) u/ ~. {" p9 @6 v - double deltaProjectDistance = fabs(maxZValue - basePoint[2]);- w; ^+ L7 k; N2 ]2 H2 B! T9 f( L7 r
, i! b3 {+ m/ k- H- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);: e2 A& n" w" j
- ' F2 x8 u2 `- s6 ~& j% C; M
- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回
+ F3 n6 h$ h2 _) @# B - {* {( V* U: K3 Q0 Z( p; l1 z
- UF_VEC3_copy(basePoint, newOriginalPoint);) x" J( ]9 \( o- j f' z
- return;: R* c+ x9 l+ b# e( L4 H, Q) D" \
- }; F" [" ~$ [- a: b1 a) x3 G
- 8 `% l$ Q6 G( d" d
- //计算夹角,通过单位矢量- }" \+ \1 Q2 u6 Q2 z8 H
- //faceDir 可能反向 . M B9 O; E2 S: P
- UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);
. `6 _1 m3 L' T D. }5 g - // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle)
/ x: M9 u6 m W3 ~% z+ Z - double cosAngle = fabs(dotResult);- d+ Q6 A, B' x9 A% d/ H
-
" b7 X- @- s6 [, f7 w - //斜边距离* P- l0 }$ r$ W: C0 r$ I! z
- if (EQ_is_zero(cosAngle, MINTOL))/ H$ P1 G6 N+ a8 A8 p0 q
- {0 m \' d; H$ Y0 j# N
- longDistance = deltaProjectDistance;
% Q% @3 O% C7 `. F - }
# B" P5 p: H8 G! ] - else: Q* P6 [/ e/ w
- {7 Z8 p0 I1 ]% C/ [5 |7 k6 e3 X
- longDistance = deltaProjectDistance / cosAngle;
H* g% g' Z7 f/ I9 g4 w# U - }9 \1 Q8 f9 r7 c6 U
- : Q4 w% U4 ?: _
- //这里可能出现方向相反,我们需要进行一次判定$ q! }# H% _/ Y) U) L L
- : ]5 r, | z7 ]& D
- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);
|' |+ U3 s6 A+ J. G' E( W
# `/ B0 O$ ?& H& M" }! `- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);
% q$ {. x- M I( g7 Y
4 B# n# V! ?8 u# L$ t- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))
' l" F2 T% W3 k, z( E5 ^+ o - {; s& z1 J: A o& E5 x# U6 ?- |
- UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
4 z* j6 r6 _$ d5 i5 V6 O7 d - }
9 B; m y- C, {7 w- B - ' W3 e! G6 `7 H5 I5 B# p6 } P
- ' l x5 V. C# w# [7 M5 \6 h
- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);
6 f* C. n6 ]. M9 P9 L% ^5 j' H - }
复制代码
$ m$ M) ?9 B$ [% a: C4 A; M% k; ]$ j7 L: s4 f9 |" y: q, a
|
|