|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
; j$ Z, r) s$ F3 e, t* _
' @5 |; g1 l( d/ Z
. |" s1 r- G% ]+ A& X5 L I8 p【二次开发源码】一种基于点投影,获取投影原始点的方法
$ M. n2 V8 J% @, R) ^7 a7 x0 {+ f0 R) C- m$ Z) ~, E; M
一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
* p& y6 k s: U7 d然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
( Q2 A& F& j6 q: r/ w% O( k: ]; G6 Q
9 j' }& F9 e& \- //这里仅仅考虑Z轴方向
& ?/ t. P6 F% Q" B& X - void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3]): r- q+ b7 z# M! k
- {
) B7 G/ W; F9 O - double dotResult;
& t5 }0 @% t, W2 O+ G# H6 K - double longDistance;
6 B9 Q- I2 B" x# Y% A9 P3 e - double zDir[3] = { 0.0,0.0,1.0 };
3 L8 s0 Y5 E, G - //直线距离
/ a) e) B+ g& N/ @* u - double deltaProjectDistance = fabs(maxZValue - basePoint[2]);* c, c* O* ~ g- i9 o) i* r' }6 f
, N5 [, R* t$ r$ w- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);
4 F) f/ c& a( A" f9 E4 W - $ x% Q, ?2 S1 r# h) {
- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回$ K; ~8 b, y# k5 G' w. K7 s
- {8 c4 [3 L: o/ w/ C0 U7 L a4 C
- UF_VEC3_copy(basePoint, newOriginalPoint);+ g& _8 D. H& H% M5 [( r
- return;
: {2 M3 [7 `+ f$ O$ D7 g. l+ T - }
8 R! e& V# _) r# Q) d; a; d
F- Z" z1 D6 p* P- //计算夹角,通过单位矢量
4 y+ k* [8 B# Z5 w: m! w - //faceDir 可能反向 # c0 b/ r5 l5 c' Y' r, g
- UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);1 v, j( l5 L! I9 J$ D. q
- // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle)
& K) W" D7 e' ~. Y/ D - double cosAngle = fabs(dotResult);7 ]$ p* V. b8 |- O( G
-
% u1 q. e& S& j% B - //斜边距离
9 B% l2 X8 Y9 @ - if (EQ_is_zero(cosAngle, MINTOL))3 ]% [. Q; ]5 P! C
- {6 t5 D7 H: y I8 A. h- q) W
- longDistance = deltaProjectDistance;
: D6 e! {! i" C - }3 ^. D! \; W, {3 U/ u
- else
' Y6 g. Z/ h2 H0 [ - {4 x* d) F8 ]7 f' p
- longDistance = deltaProjectDistance / cosAngle;- {# E. k* t$ G
- }7 M8 @9 _' I' Q; b- j# L7 ~
-
T# z! V4 ~/ c: l+ { - //这里可能出现方向相反,我们需要进行一次判定3 m) z; D/ ^7 r+ N3 c$ g9 E3 M
- + Y& A9 E7 t1 @' P$ V
- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);: O: ?% S3 J7 s+ Q) @
- 1 T3 @( f; P! O0 P1 y8 [
- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);. h' @* ]( m* a: u7 q, M3 n
! y) u9 A( Y) {9 i- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))( Q4 |, v! Q. g$ M. t2 M9 c
- {
4 l7 @9 S% E9 Y! V1 D: q8 `7 U- e0 y - UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
1 W0 O& t* c9 Y# c" C - }, @% H. q" L2 j, e& \
/ h1 A+ A# b4 O
* N" k8 e' O- B) r- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);6 j% F |% \6 ^3 k* f1 \( L4 ?3 N" G7 H
- }
复制代码 ; H! j# ]! `4 o3 T5 A
* k1 J) H1 }* i0 G8 B/ m |
|