|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
: N) u2 ~3 L) `. O$ a( r: P0 B8 O
) d7 E2 v8 m: }, ?. J& r
, L; T, f: z* l
【二次开发源码】一种基于点投影,获取投影原始点的方法
! }- ^( v- c+ }1 B+ I0 E5 F8 A% F) q* U
一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角6 ^) a+ D6 k4 X6 o
然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
' o; P0 Q+ J$ X; r7 t1 l. Q f7 h* k) e. }/ S# [
- / Y: l) S1 }8 x
- //这里仅仅考虑Z轴方向
5 @ d# {8 h! K - void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3]); V, X X0 U' J4 _/ V) F$ c- }
- {4 V) V/ n9 D1 T1 k
- double dotResult;5 q; k4 S. R* H
- double longDistance;, T1 G0 n4 J+ T4 H/ t [- @4 U
- double zDir[3] = { 0.0,0.0,1.0 };
% c3 ]2 ]1 J( r P) e3 m7 } - //直线距离
- i' R$ q" Z& G$ v - double deltaProjectDistance = fabs(maxZValue - basePoint[2]);( I( [% A* A1 U% F6 J% U7 k
- : q% A$ c: j9 G
- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);0 s- a# @6 k h" Z$ F+ O% e2 w
S: o: W3 y7 p- A- {- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回1 P- |; M' k/ X& {0 K+ h5 j5 ]
- {
+ d6 p$ J& ^" T' n& e7 _ - UF_VEC3_copy(basePoint, newOriginalPoint);* z; ]( V& B5 E/ g% Y/ ^5 A, b7 d
- return;6 `( {6 b, u, ]
- }- F1 z3 h& f: j5 e8 ]2 I, g! s
- 9 I, z4 w1 t3 c0 p. v8 g+ I
- //计算夹角,通过单位矢量
W$ s8 j* w+ ?9 S - //faceDir 可能反向
* i3 P7 H9 ]) K2 ]( h+ u5 g# z - UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);8 h, S& N. \2 Q
- // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle) # g( n, v4 q/ d
- double cosAngle = fabs(dotResult);
3 q0 j% m/ A! ? -
+ T! K6 L6 G0 E; _: `$ F4 c) D - //斜边距离2 \4 z) T$ g( o3 p: M& `+ u
- if (EQ_is_zero(cosAngle, MINTOL)) ] t& z5 @; _/ [# F! e# Q4 i
- {
& S0 |$ N% W7 b( B' v' m( M, _9 ^2 r - longDistance = deltaProjectDistance;- Y% w2 M; ]0 P# F- }2 U$ E5 u
- }! e# `0 O* ^2 [/ J% v4 a
- else
" C7 w! L/ U/ o - {
9 E' R3 S. Y. } - longDistance = deltaProjectDistance / cosAngle;
& E' Q* h$ @* _' j: U - }4 `$ B$ R- e4 ^) v
- 0 a5 h' i3 m# b* F' `
- //这里可能出现方向相反,我们需要进行一次判定' H4 @7 E9 o8 G, w* p) R
- 6 U: n- `) A s+ W0 S. X
- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);+ w* S1 `8 \ C
4 ]+ X& L# Q4 f1 k0 x; Q- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);
- _8 Y2 {; l( s! c" G. j" J - * C" q, O/ j; M
- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))* b8 n; k, a# u. U8 w7 U2 C' n6 D
- {. i" J+ s1 A: Z. W5 `3 E
- UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
7 c& ^" |, M, X* K7 S4 W3 `- Z8 m/ w - }
! M8 S% W9 |: R% T8 A - ! N4 n @& S# R. S' B
! U) S( M' r% w% P3 ^- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);
+ e6 _) ^ H( x5 i) { - }
复制代码 + G2 M7 @' k& P. i. E& n
( N2 e6 i! Y4 J% z2 [
|
|