|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
, |& {% k% @6 `# j
4 P s1 Y, }2 z( E, M7 \
/ M, G! X5 D" u+ r6 m. w( T% ~【二次开发源码】一种基于点投影,获取投影原始点的方法1 I4 ^5 E) o& e) `; Y
' y% e, H) n# v1 o2 q4 q3 F
一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
; L, {1 t! o) t/ ~/ D. D$ `/ u然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量% ~! \6 I% q7 R: _$ Y2 h( }2 o
9 S9 H* [) Y, Y7 s a& k
* ]0 ~0 f# C. r' X8 D- //这里仅仅考虑Z轴方向( g7 m# w& n; l% X( o6 i
- void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])& u- A5 a, P- H- x8 _7 L% }1 p
- {! a" y, [% W* D( [+ I; E
- double dotResult;
5 k! j4 y' A0 V6 n( u2 I# N - double longDistance;1 J" G) l) N* O0 J0 v
- double zDir[3] = { 0.0,0.0,1.0 };
) U7 v2 X1 a& K8 ]. I- g - //直线距离! ~2 Q# O+ R& J
- double deltaProjectDistance = fabs(maxZValue - basePoint[2]);
$ N. Y# m9 t( ~3 b; b: k' q! k! d! R% ~ - ( G @9 h2 Z3 l u% b0 K5 @7 Y
- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);
* v; r5 ]; F n; P% O3 p
& o6 |$ f8 j0 \- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回
& y% |; {. j* m - {8 {. `( }0 g$ }# [
- UF_VEC3_copy(basePoint, newOriginalPoint);& m. a6 z5 {" Q" z( {2 a4 i7 b
- return;
( Y/ F, P2 _( |6 f: j - }
5 u* Y& _8 B U# K3 L& f* q - $ @7 I) v/ T5 F+ R) c/ }
- //计算夹角,通过单位矢量 T# ?: T# j& U! z0 g+ w- x, Z3 m
- //faceDir 可能反向 9 m. _5 Z! q0 x
- UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);0 {7 E' z- Q/ k& F
- // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle)
4 {- C& g# C# S$ C- P5 I# q - double cosAngle = fabs(dotResult);
u( ]$ j2 t: t$ m& f -
/ t5 H W! f" @: G2 w4 ] - //斜边距离8 n* b {& m9 T) x! N$ L
- if (EQ_is_zero(cosAngle, MINTOL)) b6 B+ h9 }3 h# B' f" O1 I- |2 M
- {' k! u2 m; d% G
- longDistance = deltaProjectDistance;% I& C: V. {: w, U: r5 t
- }
: a( |0 G# n: ~7 S - else" U% S$ T0 i/ d. Z1 j7 T- T
- {' q6 _7 M9 i. e7 r, m+ w- t
- longDistance = deltaProjectDistance / cosAngle;5 r4 x, q' p) X% C k
- }
, }/ Y5 s8 l6 C7 { - 9 b8 y/ V# h7 j' R& d3 e
- //这里可能出现方向相反,我们需要进行一次判定
% K8 I- u0 L) `
6 p, F4 Q& C' R; G4 u- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);0 ~) f a' ?8 q4 r
X" t! B5 g- B9 z" _- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);4 }; R# F2 i3 L! n! W/ Q
) z8 J* C: O8 k" ~+ D- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))) S& D; g k1 ]9 R+ d" z
- { d) x Y# @0 c# f u1 X/ g& n" I, }
- UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);7 v2 f F2 G' h
- }9 J3 H2 c1 f1 ^) p: l9 O
! c* G/ G+ d4 {2 {( `7 t
- `- M) B5 n P& b- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);2 n0 D V5 @0 k8 a( b9 i
- }
复制代码
1 M) j, r. [5 l& z: Z+ E
: f& P7 R+ `0 w' U% H' Y; f2 `5 ? |
|