|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
( Y& K# o2 y+ C5 l7 c
- a# \) [0 r) G( n0 ~+ Z3 c1 \, H, I$ q
【二次开发源码】一种基于点投影,获取投影原始点的方法
% K N7 f4 E1 b L# v+ c/ }2 I, ^8 e
- }9 k$ H& } ]" W一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角5 q2 d1 @! D% O$ ~" |1 S
然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
& [% L/ [0 L% w! p a8 P# \- [
4 {- ]. H0 F L+ y) C% _- ; ~3 [; L& m+ v, `: p0 i
- //这里仅仅考虑Z轴方向
; \- m4 w) ^2 h$ Y+ k# i - void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])) l# q" x5 q( x5 r) ~( T; v
- {
n8 Q) p y! j" w& V, W - double dotResult;+ V) d) J x0 D; z. i+ ?
- double longDistance;
8 Q b* g6 `7 G; x7 v( W5 U - double zDir[3] = { 0.0,0.0,1.0 };
6 {) ?: X0 D) B$ @6 j5 g7 D1 g - //直线距离 V7 g/ k" M5 ^ L T9 ]9 Z# T% R
- double deltaProjectDistance = fabs(maxZValue - basePoint[2]);
+ Z& V8 I" N) }; l' ^( L } - 2 u `& ^" m$ |' j
- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);3 Y) [" P( W1 k) D* E7 Q
- . D+ J" s. {! x; N! `( _
- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回6 ?9 \5 p; t |9 m- _
- {
: \4 m V3 x% d6 A- ?. A - UF_VEC3_copy(basePoint, newOriginalPoint);
& T$ q' [8 b* _( M: C1 l - return;
8 B% P1 k. ]# Q - }
$ x/ K9 k" Z* {7 a
; o6 p+ r# K! k/ y- //计算夹角,通过单位矢量
2 ^) \: O, ^9 @' }! E: z - //faceDir 可能反向 $ _: |$ i$ W. c# }2 t+ i
- UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);
/ w+ ?* K9 L+ P( L' u - // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle) 8 j$ v6 S: I2 _+ \/ X" H6 [
- double cosAngle = fabs(dotResult);
! {4 q/ G) W2 i8 `4 _" w, c2 B -
1 u S# P! G3 I9 W! R/ ?$ Y! R - //斜边距离' c( @% K8 Q& ]+ r+ J; p: t
- if (EQ_is_zero(cosAngle, MINTOL))
) @# c+ {- X3 J4 G8 F2 _ - {
9 T1 i$ H F: H( t( W2 d( p - longDistance = deltaProjectDistance;
7 d& t! C5 T" z* d/ S - }+ i+ x/ B. a3 z* U& i1 @' L
- else
! G& l; ?4 G( P* E/ s# a0 ~: a ` - {+ |; w2 ]! j( m% P, U
- longDistance = deltaProjectDistance / cosAngle;! k. c& `2 ]$ |, n+ n( _( C
- } O1 ]8 x4 t7 C/ a7 m8 q
-
5 D, V/ Q# F7 U( i2 a - //这里可能出现方向相反,我们需要进行一次判定
8 S' Z3 w, K9 k m2 B' E( U
8 b1 ^, q3 k* Y, e- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);/ l% N3 t E. z3 B& ~( f# l% E7 O
- 5 l) q5 `9 z: ]7 [2 M
- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);
4 |" m# j/ r, j G- {, X - 5 E. w7 p j0 j7 F4 x
- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))
: H$ v) N( g# d9 h* k- C - {# g" S9 j4 p9 e+ U' O! p2 M6 |
- UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint); {' g0 s9 O1 P, F! D0 L! D; `. C% U
- }
& Y( p: I; ~- M4 m
8 J5 S: l+ x" N: C
) e9 F" }" R" F* j# Y' k; i- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);' u, [( W) @8 i0 Z$ X5 I
- }
复制代码
' }+ ^/ g3 X! y) m6 M6 v5 K& U) a- v8 R. u/ R1 v2 c9 M
|
|