|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
; E, n7 s# D) r' a) v/ D
/ t9 p& w0 u6 v" h& g2 [, \# j5 | A7 @
【二次开发源码】一种基于点投影,获取投影原始点的方法) j, Z/ R: ^% e' Y1 b4 f) L
: t4 t) ^3 u( L0 E! R* P/ j一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
* S. _" }+ ~$ ~$ i$ ~然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量% r9 G9 |) G5 M' q
7 B1 ~: _: f* C& S
% [3 |; ~ p; D; C: b! c& G9 E- //这里仅仅考虑Z轴方向8 E7 Y0 ~- s1 ^; u7 e
- void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])* G8 d6 S+ K$ Z2 g& i
- {2 v8 K/ r0 M; i+ Z
- double dotResult;3 D5 p2 E& r9 }; `. i- ?6 A
- double longDistance;! N0 X9 c" S3 |5 B% B9 x7 S
- double zDir[3] = { 0.0,0.0,1.0 };
& E; E# x+ t" F, P - //直线距离3 [; g* [- J: T3 u1 d5 ` ~( R
- double deltaProjectDistance = fabs(maxZValue - basePoint[2]);2 ]+ Q" _+ Y4 H9 O( w; }6 f8 ]
- # V G' k L! T* F& U: d6 Y6 f
- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);
' Y" o4 C$ L4 a* c
) s% f/ |( i$ J4 {1 @- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回; M* a$ i Z6 l; O5 ^/ }/ a3 h
- {
, N" J* O$ K- Z2 e) X1 G, O* c! t - UF_VEC3_copy(basePoint, newOriginalPoint);6 s& i0 \3 h# h, q* h" x' u& A# Z. d. B
- return;
) b; U# h0 N9 F: O9 g - }
- z9 V% R x$ I f4 d- o6 H( U8 G! p - + w; Z" G0 T! b3 h* ?
- //计算夹角,通过单位矢量
" F9 `8 O7 |# e, n! O/ q) ~& u - //faceDir 可能反向 * X1 E8 |2 j$ H6 v7 E
- UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);* |5 b9 f4 U/ U8 M6 G6 p2 ~4 X3 C$ a
- // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle)
6 X5 O7 u! T( _, O0 A4 k6 h% ~) V - double cosAngle = fabs(dotResult);' o4 z: s3 Z5 t0 w
-
4 j) b8 R G6 R/ E - //斜边距离
/ ~0 z" |$ R- S; [ - if (EQ_is_zero(cosAngle, MINTOL)); l$ a, a9 ~" R7 W q1 z
- {
0 k9 U5 P7 L; j' t. _ - longDistance = deltaProjectDistance;4 k" M' [7 x& v# |4 K
- }# L, t4 J% `/ R, O9 y- O
- else* H) b O2 X% B# V
- {# D5 `% x, t6 L" ^. i* c
- longDistance = deltaProjectDistance / cosAngle;: Z$ r8 R+ v) w# F4 t2 C3 x; I$ ]
- }
S; l2 C+ z0 ^( a - 1 ~) D; K, z6 S
- //这里可能出现方向相反,我们需要进行一次判定' y$ _$ g- z4 P# d) n6 c- t/ K
- # B# B! A5 Y. o- |- r
- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);
) n. `8 U4 p- [$ m* H - ' G: ]8 ?- z9 e' x2 ~# q
- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);9 u- U* @9 {0 P5 M% i: O
3 d) A9 d- I/ g4 M8 |8 ^1 i- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))
2 G L3 O9 D( D0 ~, N2 ?# t - {# f5 ~ A7 \6 l4 |; q' y
- UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
5 f; i9 R2 g* F - }
- Z% T/ Y2 C- N - & c2 o: m/ ]0 Q A/ \
- ; s; n7 |# |5 Z0 Q* x
- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);
$ X7 R- y& l y9 ]4 U* O - }
复制代码 9 y! s' Y5 Z. v* S) h
6 [0 m, a; Y* g$ {# R, ^9 n: |
|
|