|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
7 y/ \; N' l% X# l
- y* y9 C0 Z5 s* V% m
- `- g2 g% C& U+ `- C3 A1 j
【二次开发源码】一种基于点投影,获取投影原始点的方法
( U+ F4 U3 N6 h6 L4 Z- G
/ U9 e: T5 F$ Z: Q6 b7 }, k& V一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
3 z+ a: Y0 r+ u7 T2 f! Z然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量$ _. @( A7 K. _6 N5 I" ~
& m W+ Q3 t' V2 }- ! |. M6 J+ ^0 i6 B* ] Y
- //这里仅仅考虑Z轴方向
% J- D- W1 F; M k! F - void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])
% E5 K+ H% r0 w' d% P6 ^6 A5 n! C - {
- ~% D5 Q6 h+ b: U& `! O - double dotResult;
! D7 f) ?5 b7 B# W - double longDistance;7 W; R0 p% m1 L! N; J; ^
- double zDir[3] = { 0.0,0.0,1.0 };) z! `7 e% ~! n' a$ r, O( O( Q
- //直线距离
% b/ I. i2 y, T8 t$ p - double deltaProjectDistance = fabs(maxZValue - basePoint[2]);
* Q7 n# {% V0 G; S. k
: V3 D H% y! M1 o/ `# l4 i1 M. [- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);, l. w% S) Y/ s* x7 G
- & u1 V X/ B' w" G* R% c
- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回
3 ?% o& Z* g$ g; v5 L8 G ], \ - {( G/ A7 L! [! `2 k- l
- UF_VEC3_copy(basePoint, newOriginalPoint);
) g4 c' U7 W, [, m1 }. q7 n) a - return;
v$ d" t, k5 X8 ` - }
* p/ ]& D( ?2 Z - % V( Q f o' N+ W c7 G
- //计算夹角,通过单位矢量
' m) |) d* b Q" F J) v - //faceDir 可能反向 ; ?3 f* ~2 F) |! e2 `
- UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);; Y9 K' o; l. p# F+ e
- // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle) ; V f; Q2 \; e
- double cosAngle = fabs(dotResult);
; A4 F' m* j# }7 | -
* r- L& ?6 t$ R3 L5 {9 @7 R6 p - //斜边距离
+ B% n5 h: r2 ?( O! F& n) i% M - if (EQ_is_zero(cosAngle, MINTOL))
5 ?" o! N, _5 z- `0 C- n$ B - {
9 ]2 X" E+ W4 T, ^/ k5 E - longDistance = deltaProjectDistance;
* K8 j! i- [* n; x - }' c( U; t/ `- {$ Q; f* c
- else' y6 J4 _' ~/ M$ [
- {" d8 g+ U' V6 V- W+ W
- longDistance = deltaProjectDistance / cosAngle;4 m! B0 t0 j" h b/ s
- }' z. z5 V' s9 Y# d, U5 d
-
9 |' v- `" n* B4 L. G0 c - //这里可能出现方向相反,我们需要进行一次判定
, w& q0 ?9 q+ R$ o6 d3 o - % b3 k+ _- f+ ?( j
- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);
0 L( H6 }$ U/ [3 B. _3 T
, U6 w1 C2 i7 B" e- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);
$ [6 v7 W2 X2 `! C
& [* w- ~' X) @- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))% @! F0 j& W/ s7 J
- {& d& s: {4 d# B {. D
- UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
7 M1 u8 K: ]& N* P R& A - }
* H5 J- I& K# @8 n+ D/ f( t3 h - : W% D% L, A4 C, L W' S
- ; Q6 a; z3 }4 j1 L. E6 [
- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance); ~+ Z9 C5 N* @# [2 `/ E0 _2 h
- }
复制代码
; S% D& Y4 F" a2 B- k1 @2 @
8 p$ Q4 ] {# \* Y# ^ |
|