|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
6 y/ l ^/ o, ?
1 F. y7 h$ x+ h; h# Z% @8 x' }7 d
! @: d b1 h4 r3 X9 \
【二次开发源码】一种基于点投影,获取投影原始点的方法
' P; y W/ [$ k k$ ]- U2 z
8 N1 G# I! g" C) o* a0 k) j一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
- D( ~# p6 e9 O# T然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
1 O, f; P) D; U3 B0 e/ v! M
' X& _' L" J3 n( I6 p- 6 g& g6 z3 Y+ p+ G, @9 ]4 r
- //这里仅仅考虑Z轴方向' W% s; [& O% O1 j
- void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])
' x. `+ [9 H j* S+ r/ Z - {' n' |. C! O& t$ T
- double dotResult;# M- n$ j6 _+ O+ i1 J' K
- double longDistance;
# u) O& b! H5 B4 `. A6 H0 Q0 K - double zDir[3] = { 0.0,0.0,1.0 };
9 O1 `' v2 i& t! j* Q( S' |8 `0 p - //直线距离
$ A6 a8 d- [6 V; V# q/ @; O5 Q9 I - double deltaProjectDistance = fabs(maxZValue - basePoint[2]);
: B2 C* `7 W+ i5 W
9 x/ q* V, j% w6 T% h: Y# S- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);5 P& M8 V) q+ ?- A" I
- ) w: b& C/ J" q' K/ U; o% }0 Z
- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回
0 o# x) H' y- p. F: G% ?1 {( l+ A - {
( ]' X1 B% b* s% G3 ~0 D - UF_VEC3_copy(basePoint, newOriginalPoint);
/ F% _( H$ y2 j+ |. ^ - return;
# `/ e8 i! f2 s7 U7 }* w' V - }- y) ^0 h3 K' Z4 T4 ?
- 6 _( s3 d' b5 }! T* d1 O0 S
- //计算夹角,通过单位矢量+ w) e5 O* x7 C7 Z, z9 V
- //faceDir 可能反向
. }. ]% a: h; J& ]: } - UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);
' r- w! ?$ s% {7 E9 p0 l - // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle) ) g. z1 x7 K+ \% t" D/ \1 z
- double cosAngle = fabs(dotResult);! d. O4 o4 B5 _1 C3 y9 @
-
8 K8 Q& v4 R: b' C) t - //斜边距离9 Z( {" j* S8 L: r: z# k
- if (EQ_is_zero(cosAngle, MINTOL))
7 o; D6 g. k" m' L - {" \* |( J, \* I) w
- longDistance = deltaProjectDistance;
$ ~# u( B, m: T7 y - }
$ v- O3 g5 m8 q5 q2 b9 K - else9 l4 l: }3 d: y9 ^5 e4 ~
- {
# H* v* O. H* S; I - longDistance = deltaProjectDistance / cosAngle;9 ^+ ^2 U2 v- O& e: W# j% H
- }
5 _4 a" ` K" |& T. s -
- G. f5 v$ T! p6 k8 C* { - //这里可能出现方向相反,我们需要进行一次判定
/ q$ W4 {9 s3 x0 {2 k
% P# g8 u( e7 D) n! a& L# w# v- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);
[" _) N* u- |7 D - 9 X' D* Y6 _& C- z' E( r9 Q
- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);
2 p' J' t+ W8 c' a" S5 M - # T3 H N% e G7 i$ m# V1 B
- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))
+ H- A9 `3 a# _& u - {0 C4 h+ z3 V( _- ]
- UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
3 A& z$ q( r2 r1 s - } l" E, G; Z" R6 y1 W
- ' ~& w4 y/ I0 q0 \8 i9 e6 }
2 H. L0 k/ W4 s7 T: s0 ?: V- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);
! v: I, s2 x7 {3 I4 a# Y - }
复制代码
) l3 t1 a/ l' _' K! W% r9 ]8 K P$ D9 r- N( [/ x2 D6 c I
|
|