|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
) D4 R# t5 e" \: d
1 S6 E" _ t+ o$ v6 N
: N$ n( W7 m# q$ b! S0 x9 T【二次开发源码】一种基于点投影,获取投影原始点的方法
' F0 i7 M# \. j5 Z4 _" [6 I0 m5 @% X. r3 p6 m+ j/ r
一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角9 \+ h+ K8 L' p0 ~ A
然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
0 r8 U) u8 I2 @$ i
! `7 e! g# D; T3 @( c- $ J+ ?, ^' e' G( y3 V
- //这里仅仅考虑Z轴方向 H7 Q9 u% l" A' }2 i4 u
- void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])
) S) |) G+ M! Z - {- ^7 Q% O3 x. _+ w' C9 x7 X" o
- double dotResult;
' j$ B: G( p" O/ d2 ]0 O2 w - double longDistance;
$ @( t5 V8 S2 C* `$ j - double zDir[3] = { 0.0,0.0,1.0 };7 [; r7 D& i& i6 b4 _; y
- //直线距离
6 a5 Z) O0 F' G. S f. s" ] - double deltaProjectDistance = fabs(maxZValue - basePoint[2]);
( h# ~9 n' m$ f% ?1 O% {( ?. P
! M& J+ T9 j) a5 A# _; E- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);: m& {, ]1 ~# I' b
- : e$ X& ?' o4 ~- t. p
- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回3 l7 a4 M* u& B: v p
- {
f1 ?. c& E; ~/ S' P/ \1 I - UF_VEC3_copy(basePoint, newOriginalPoint);% L4 `' L: i3 T* i2 ^
- return;
3 D5 D# ?$ C0 X4 ] - }
0 }/ l, x( F8 ]$ [0 ` - & g9 C# B* e, a, l9 j! ^6 F
- //计算夹角,通过单位矢量7 Q7 M; Y9 N0 r |
- //faceDir 可能反向 - Z1 `1 h, P* J! ?0 {( N
- UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);' D% T# O% H# K `4 O
- // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle)
* j8 v, o7 ?& l$ M - double cosAngle = fabs(dotResult);
0 T5 T+ ?3 I! p - : M0 _8 T* }1 t/ o
- //斜边距离; K0 L! U$ ]( a
- if (EQ_is_zero(cosAngle, MINTOL))
3 A6 |; G# l- Q0 ?+ L( z - {$ Q# W5 ]" h2 E: E X& ?1 ?/ _
- longDistance = deltaProjectDistance;
1 c4 |% f1 n1 j' |$ W- j: A: ~ - }& n8 x& z: |$ e+ G! K3 }
- else
( L k7 A. k0 x ]6 m* ~7 q9 s - { B" d( Z; i6 h+ {& z) E
- longDistance = deltaProjectDistance / cosAngle;3 P- G! Q; e9 j0 A* ^
- }5 F- t$ ~5 C3 m% n1 M5 M
- B) t; ] O$ J3 F8 G6 h7 t
- //这里可能出现方向相反,我们需要进行一次判定; t" ^/ d5 m9 t* m' q, y& ]5 ~0 v8 R
% c' s" h5 V; x% P2 x- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);6 g% @5 i! |( W+ x' \% H* N2 s
- 1 G; X% g k5 [: B I L) R
- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);% r- D0 [8 I2 T& q! T
- 9 R2 w4 N2 ^* @0 b: Y8 V
- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))3 s5 w m* x8 e
- {
' A4 }8 A+ r5 ~4 [4 b - UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
$ m1 p# ]* A: W - }
+ p! z& l! p. l5 h v7 _& H6 X
4 O$ g [7 [6 O0 \- q) p7 k
1 u$ u* A" E, _9 ~- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);
. w' Q' A/ [5 a - }
复制代码
9 X6 n8 o: T7 G0 L- g! T+ ?- C5 @# @0 n. p2 h
|
|