|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
5 e; h3 L1 W- {# u: u% P
" N, ~8 l8 a/ @! ?
I5 r% C/ j8 E5 m5 m# ?* s! K【二次开发源码】一种基于点投影,获取投影原始点的方法5 @: T9 _( B/ t3 x1 Z
5 Y& P8 { R4 y6 p
一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角) r3 G: n$ f; L. E7 U& ^) L5 i
然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量! O* m, v0 _) \
; `& Y+ ]$ ?8 v+ c/ n3 T) w- 7 [) l2 m" T; y& S
- //这里仅仅考虑Z轴方向
1 r7 e' ?& q& ~0 k, E: R( _$ D P - void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])
! T! [- u& E' b. G0 K$ \' t- K - {
% N4 g$ p- x7 G2 W- b" z - double dotResult;
" [8 N, p' w% ]7 k8 l+ G z% t - double longDistance;4 }. P0 a p8 X; c
- double zDir[3] = { 0.0,0.0,1.0 };
) w8 A8 w$ J0 I1 O0 G8 ^1 T) t - //直线距离% V- Q4 u2 a" S8 n: Q- `0 w
- double deltaProjectDistance = fabs(maxZValue - basePoint[2]);
) @/ i4 }- k4 f* }+ I! ^
+ o' ^$ S% v0 W) j1 U4 Z- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);
3 h9 r s9 D9 b. f# j- t, @
9 q/ z! v) {9 Z D b1 V1 L- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回& E; [9 f/ y. Q
- {
2 a! r: A( ?& M* g2 S, I! r - UF_VEC3_copy(basePoint, newOriginalPoint);
4 z; N. K' b7 g; J, [. }4 n - return;
* o# z: m$ z5 G: a) v1 X - }
' m4 v8 J5 x0 x' G' C) o - " f4 ?5 Q7 |8 `4 @
- //计算夹角,通过单位矢量% ~7 t ?; b) v9 S* S3 g1 x
- //faceDir 可能反向 " X6 c5 p& V5 Q
- UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);. |4 Q' d, u( S. X6 h& b
- // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle)
6 C) m6 H1 `' x8 K t0 G$ e - double cosAngle = fabs(dotResult);
6 ~3 r6 ^5 ~/ \) I! \ - 8 l6 S' ^, Y: H, k5 B2 ]
- //斜边距离
4 |% r i- y3 u: Z! x4 Y! J/ B - if (EQ_is_zero(cosAngle, MINTOL))' r( J* }" \; i7 X) t5 a l. |5 m, R" a
- {
; \5 O+ {7 ?9 a# V. d4 `, s0 p - longDistance = deltaProjectDistance;
9 J+ d6 m. u( K6 v* w5 I - }1 S7 @( J' m2 a# V3 F
- else
/ y! {" Q0 p2 ] - {
1 \' H4 W. U$ I9 F - longDistance = deltaProjectDistance / cosAngle;
. |* k( P+ L8 @8 |: Z' i - }
' d" C/ ?& w/ T+ c! u' E -
h" e$ L& i1 `, L' k7 N - //这里可能出现方向相反,我们需要进行一次判定
( ~" L1 P3 T, r8 n$ k; K7 h* i - / a( Y* j1 C+ d, l
- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);! Z4 L8 {& ?2 F5 p
- 3 x5 v4 H- }& P* h8 L. T! }! ]! K
- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);
7 U C. L, {+ f1 Y, [
& y% \8 @/ v+ d2 K1 z* Z- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))( u8 e; r4 H) c! q- t$ |
- {
$ X3 Q: _ ^' _& J3 s - UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
- S7 S$ V1 t2 m+ _ - }
! k- E- J M3 | O9 X1 _
d1 B+ d ~' }* k2 } J- 8 `' A' D! Y* f' K
- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);7 Z$ \: Q# Z8 c$ H
- }
复制代码 1 s2 G7 i f3 A& A/ e0 E, _0 k
2 W2 C; L: \4 `5 b V& l n |
|