|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
8 a) H6 C% N4 v( g4 s
7 _: J0 W5 s4 n& C$ i
3 B* a- W# U. H: a r【二次开发源码】一种基于点投影,获取投影原始点的方法
9 s* _/ W9 k) Q; A
$ X1 D- ~% S4 e9 s: L! v一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角: {1 [0 ?$ l, W5 M, t% a
然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量/ ~+ U$ \+ }4 P0 u0 _1 d# j
4 M/ U3 o4 _& i0 g! a- 6 k5 O5 ^$ n* t8 d. Y/ ?7 v
- //这里仅仅考虑Z轴方向" \/ u& @$ ^, o
- void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])6 t# }3 {0 J6 R, k5 P
- {
2 O# g) u/ v) g" _ - double dotResult;, K+ P# w* w. _+ o+ w; k
- double longDistance;
$ v8 n% R5 V- ?; z0 k - double zDir[3] = { 0.0,0.0,1.0 };& ^5 U+ w( d9 q- @- W# ~/ V3 T8 n1 i
- //直线距离3 x9 h6 L6 N) S( ?. ^: g3 }( L# z
- double deltaProjectDistance = fabs(maxZValue - basePoint[2]);
+ {8 M* d: ?' J& {
4 |- U, G& K" f8 m- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);
/ u8 N$ H* @& F& D3 L& n6 |; r+ w - 2 B2 }1 H& Y, [
- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回0 z- I# x2 j9 m/ a! l
- {0 x+ N) M: N; X& o
- UF_VEC3_copy(basePoint, newOriginalPoint);
! n( e4 C; |( s6 \0 u* s2 N - return;
! Z; s6 Z7 @9 {# [ - }
( V/ ^& `" D F, N
. ~( N# @! [$ o2 b3 w- //计算夹角,通过单位矢量
0 R2 D8 s, u( U - //faceDir 可能反向
+ ^ Y* c$ H, N- v - UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);8 E: [ n0 D. u J" h4 f) u
- // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle) 4 _' Y" |( v. _9 s3 V& o
- double cosAngle = fabs(dotResult);
1 i0 ~0 X( s# r. {& R - , a! Z+ J/ g5 U. x K, b
- //斜边距离
6 C4 j N. _+ K" I6 X - if (EQ_is_zero(cosAngle, MINTOL))
+ s9 P2 m% i. ~4 _$ q1 D5 ^ - {$ Y! @& P% ^7 Q8 m
- longDistance = deltaProjectDistance;
! G# ?# R3 t: p( ] - }. \9 u% R9 z. U) M$ i& m A# s- g
- else, K& _+ C) k7 |, X6 K2 m; b- j2 O
- {
' v) ~! t5 w4 t( Z* [ - longDistance = deltaProjectDistance / cosAngle;8 _. R) Y9 |; y5 _
- }
! i- O v( o0 D4 {( V" z - 9 W$ d! f4 X ~1 g0 T4 y
- //这里可能出现方向相反,我们需要进行一次判定* [7 y5 S5 x! R" X
9 ]) X0 }+ u9 w+ A! ^ A- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);+ L$ l& S' ~! T" i) q9 @
- % m- r* u8 @- ]
- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);+ H1 S8 R* [% ? }& [! z4 B
3 c: A5 ^$ A9 v" d3 i9 G- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))
& Z" j; F6 _- Y9 I) S$ ? - {
% N& p0 [0 d2 a# G$ f" L" V+ r - UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
4 T. O4 N$ [: z+ p - }
% u" Z" [1 n; T& {( D
! r' k# Y: L* z* K. `9 o$ \0 _- 3 a! e m4 L! y' }* C$ n
- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);* Q! _' l5 H( r4 w5 d+ g& J( C
- }
复制代码
6 x* U% B% R# M# | W: o' z' W% Z3 o2 g- y( R) I7 f$ b5 u
|
|