|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
3 O2 N2 l3 C9 }1 I8 P
2 x7 ~- v( O1 w% J# Y6 ]6 O3 n2 V4 a+ e1 A' Q
【二次开发源码】一种基于点投影,获取投影原始点的方法
7 O8 L5 r j8 @, d8 q. C- O9 ^6 m& G/ t y+ J
一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角, V8 a2 o+ U' k, H% C" W2 o
然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
7 c1 y# w3 P# p# y; t* i1 D$ d' n O2 H. |3 ] j
- * O# H2 u0 B, J
- //这里仅仅考虑Z轴方向
, W- o( ~4 C& t! l9 v! w - void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])) Z J7 w3 R$ m0 l
- {
7 `1 Q* M( s/ s - double dotResult;& N0 C" O4 L5 i. U1 E6 h
- double longDistance;
- P( A- i. j! X' ?* V7 ^0 d - double zDir[3] = { 0.0,0.0,1.0 };
* H2 r& u! C/ `# J* k" J: s( a) \5 N - //直线距离8 g& o, m2 X" i* o8 `
- double deltaProjectDistance = fabs(maxZValue - basePoint[2]);
& J" n" N T+ P( n - ) v4 A: ]7 L( F2 d9 V
- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);
; E, Z1 u; e$ o7 N# E - ! @4 k6 v# {8 i( H9 ~0 J( a( G% W
- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回
1 I9 |. @5 N) T3 ?+ X! b" V( a& ?/ w - {
' o7 K+ w. _5 q" z4 ^& G4 Q0 j - UF_VEC3_copy(basePoint, newOriginalPoint);4 ~5 @) l5 D; G& |9 Y
- return;
. [# D0 Q2 J) Q; I# U9 b& D - }) E# U, j9 o' D% X
- & J9 D; }- W# q$ N3 l3 I3 d$ z
- //计算夹角,通过单位矢量
% ^& l$ Q7 A/ m3 r8 n' {1 C& f1 n - //faceDir 可能反向
$ y5 f6 Z4 P L/ z8 \6 h+ k* f4 i. l - UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);% b- \" }! h& F
- // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle) 0 J. ]3 `1 X- L/ P
- double cosAngle = fabs(dotResult);3 |6 |3 M8 B' |2 d
-
: S9 ^6 x! K4 z, R6 C - //斜边距离# d7 o% V4 r( n" v; J' A) n6 C$ ~. m0 x
- if (EQ_is_zero(cosAngle, MINTOL))
3 A3 M! ?) ?- z$ ? - {
5 g5 {3 q; o: H o. n1 d" D - longDistance = deltaProjectDistance;& j# h! v3 @. |$ u5 _7 A9 g6 [' ?
- }
- m1 O: Z: e6 L- r; t - else
$ L, p* v, [9 G# h) i; r2 ` - {. D# m# L5 f+ W! L4 j
- longDistance = deltaProjectDistance / cosAngle;$ `+ T5 W- u! c* Z8 h4 d# @
- }
9 V7 o/ `+ g- \) ?/ a1 `8 t. u8 n: { -
+ Z: q8 T/ f& x6 p4 T - //这里可能出现方向相反,我们需要进行一次判定+ \/ D0 V" A4 a
3 w4 e+ }6 z/ p- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);
& ~+ R$ t8 ?+ V - ) K6 m* s5 o, j" f' P
- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);
* D% [( X/ P- k. J' y
% l6 D2 r$ m: a, C9 j6 K( ]% W- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))
8 z' p @7 ?# E) I, L7 ?) T" C - {
! X+ a3 w& N+ @3 Q" m* M - UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint); N7 w6 r' B2 _4 v5 J
- }( l& h/ [# i+ V7 x1 q
- 3 I% k* R/ Z9 C, J7 ]% `1 {+ {7 w" \
K0 j( a F; z& Z- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);; [9 J4 P# @& P6 o
- }
复制代码
! ^5 E' ?, \6 P( ?2 k& ^
0 y- a) _3 @( C; s |
|