|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
×
* ~* x5 A6 [7 |' O) G
. r4 P7 h7 A _- j
9 j& R* O8 P. @
【二次开发源码】一种基于点投影,获取投影原始点的方法
7 d- r) m& r. b: V% M. V3 o' o9 u' u; b0 Z# n7 p
一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
, W" V8 R8 P0 q. x% x然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
6 Z% J% r1 ~% @/ m- f) g" L) r
6 r- \+ ]% P. M' H
: W$ I0 Q/ J& X, v+ O8 Y( v- //这里仅仅考虑Z轴方向0 m9 F; \( Z9 j- Y+ J1 \
- void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])
6 X& _. S% N! j$ K% p# U - {
- [! B( Z% L6 O5 w7 q - double dotResult;* L$ U2 Z3 T, _1 s
- double longDistance;* z) M% N3 T5 d* H0 f( b; p
- double zDir[3] = { 0.0,0.0,1.0 };# `8 P7 s% s$ ^7 y
- //直线距离+ C8 j4 k" K$ n5 E5 P
- double deltaProjectDistance = fabs(maxZValue - basePoint[2]);8 i# k B: a3 @' s( f' N1 r
0 t5 e' H A* | t- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);. M9 l2 p& Q l% }& |4 T8 s: E
5 U, n3 }2 _. B2 D0 h- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回
8 B0 a; k, u2 @2 k8 D* J" Z - {
i% f4 y- e. J. U/ ` - UF_VEC3_copy(basePoint, newOriginalPoint);
/ V ~: Z. C5 S# Y1 q - return;0 a4 A" ?4 h! g4 _5 f
- }
9 F2 c5 L" G5 }1 ?4 g8 T- `
! M& s8 W; ^& L8 ~( T- //计算夹角,通过单位矢量0 G. |3 h* e* e) L$ E; Y) E8 ^
- //faceDir 可能反向 / g+ S8 Q: _1 K9 V G
- UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);
; K5 l& J5 j9 e6 J& _( E - // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle) - h8 ]2 B6 g6 E y; `7 P
- double cosAngle = fabs(dotResult);
; @3 ^. r3 \8 R7 W - 2 E8 B+ h! f. \" C0 y& e% e# b, @& r3 R
- //斜边距离
5 G/ l# p/ f- u P) _( B - if (EQ_is_zero(cosAngle, MINTOL))
$ F7 ^; u0 ?+ H8 S - {
' ?6 b5 {8 N7 D o5 W' L# K& x* ^1 G - longDistance = deltaProjectDistance;# ], r, C# {7 h" E
- }
1 o% ?- g2 E4 \ - else
& j4 Q* K1 b! t8 z# t* B% N - {: l& d& b* t/ Q, l
- longDistance = deltaProjectDistance / cosAngle;
: o$ M6 }! _+ ?3 o6 f - }
3 m& Y0 N; d0 d( m* o% l* Q - J/ ~% b, O5 E( k
- //这里可能出现方向相反,我们需要进行一次判定( C, e9 K. O: F
- , Q, B& p" n" z, G, N+ P) h
- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);, C* p9 U6 P) @, d
- : n* H; ]$ l, r* S. I
- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);, T; m8 i9 ~3 Y' o1 i% N
6 d% U9 j; ?" s/ [( e' P0 }$ M- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))) K. H0 s+ i% I; u$ w- O
- {
5 G( q5 Q1 y& X; Q - UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);) w, U" U+ E# L# x/ e9 e8 a
- }
0 [# z% v1 ]7 ^ n9 D" ] - # p; w7 Y3 Y( T
3 c' z5 G( W3 k: s7 j& G+ {: j- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);
1 g/ Q! e& z( a% H - }
复制代码 ) B, f5 i" T% Z$ n- O, J
. k% O2 g2 e, U: y+ x3 Z! G2 f0 x
|
|