|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
8 g2 e3 r4 z' N4 j7 G' r$ U) q
% Q! u- B6 g& b1 V. w7 W5 N' p3 L# V( V+ @, ^9 g+ v, Z: C
【二次开发源码】一种基于点投影,获取投影原始点的方法- {4 B6 m! d ?: Y7 j$ T0 C# Y
4 G& j8 `# y4 b6 o1 F一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
: y0 A! E" c1 B然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量; n* `- a% R/ g0 {7 [+ U( ?; g
- N! n1 s+ H7 S6 {* l
' i( V) m) C& v5 {- //这里仅仅考虑Z轴方向/ o' I3 ]# X/ T; k0 Q8 b& ^& X
- void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])9 I; |3 T9 t7 ]4 D) A
- {
- \; v( {1 h+ P9 b4 T) V/ E - double dotResult;5 z' v( j4 h& `# [$ J) a/ h8 K$ j, ~' V1 G
- double longDistance;. G( @/ E! V$ e+ ?/ f, c! E
- double zDir[3] = { 0.0,0.0,1.0 };
- q! ^6 ]/ w( R - //直线距离
- w2 t1 ~8 F. z7 s! S - double deltaProjectDistance = fabs(maxZValue - basePoint[2]);2 ]; H. f3 b E# Q# z( }
- 7 E- k9 x* q3 f% y# Z
- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);# |! |; d+ `) E0 ?6 _$ ~' t& e
) W/ ~" L/ M } {2 g* S& i% l- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回5 C" W: l) J2 P( J9 f
- {
4 O( y& a1 _5 O5 [ - UF_VEC3_copy(basePoint, newOriginalPoint);. k. G) u3 b {2 M; Z# |
- return;
( K7 L3 ^2 H! [% t5 e - }
! r. b, \2 o! r: p( B7 n! P5 B& | - ) }) W+ \9 r1 A" ^( `7 i
- //计算夹角,通过单位矢量
1 Z* [1 D; F3 s& X/ W: |3 @ - //faceDir 可能反向
- ~- _( |) h# l6 N1 w7 _ - UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);
! F, s0 s3 G v; c, l/ B2 h - // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle)
3 _9 x4 E, U1 \$ k1 \5 @3 D - double cosAngle = fabs(dotResult);
, `# t# A! c8 P2 K - 5 n& i" x( ` y: J; r5 u1 Q9 e
- //斜边距离, R! Q- q1 U6 \/ e$ n9 y7 _
- if (EQ_is_zero(cosAngle, MINTOL))
3 e$ X6 v$ B% {+ l - {
' \7 ]# k' ^) O0 @7 y+ @. j - longDistance = deltaProjectDistance;: c0 a' ]9 g) ]# |* ~) W/ f
- } I7 |- R' M' @# z; }8 ~6 o9 r
- else: P1 L) v$ I \4 u! S
- {
1 k: c9 M- B& f - longDistance = deltaProjectDistance / cosAngle;
* z9 x/ P. a+ x+ ~+ F - }' [4 Q9 F0 S& s6 ~7 W
- 2 y g9 c G9 k2 x, j: p! p! n/ u
- //这里可能出现方向相反,我们需要进行一次判定
1 y8 v4 l% \% l; ? - # }& I# s3 k5 G( `! `: r
- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);* K/ M, A$ `1 e, D
- - N- w) F) _; r* I) N6 E
- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);3 J8 Z; \" H4 C! s+ z1 _% X" ]+ y
4 M3 [+ Y/ o* h. Q- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))( ^7 `0 P% ^; W7 f
- {
$ B+ o+ J1 I& x, v - UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);, P ]# N- J2 t1 Y1 w6 z5 I+ K
- }
0 p4 S; p# o+ C# x: G0 Z6 E - ' M5 }2 m& O8 \% |2 y
3 q7 S2 H0 x- h7 Q8 e: Z/ h7 `- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);% c" j8 f j1 p$ J
- }
复制代码 $ i7 }% Y; u# ]1 Q$ m1 ]1 c9 L7 M# e
- Z; L5 q3 U8 }6 d- U' s1 @
|
|