|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
1 c; W3 k: W8 a: q* m, X
5 U& ?: Z" j% O2 A6 _; U9 _: M; \
【二次开发源码】一种基于点投影,获取投影原始点的方法, B0 |& g. [( f; y' ?. ?
( m- _7 U x& Z& h/ i
一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角7 Y, e- u2 X* r/ S% e% t* }
然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
- D9 W* ^4 T" M8 a( \2 Z; w8 K/ j
. n* S4 y4 p9 U6 P" g
/ E }% v% x/ R. n+ y; O- //这里仅仅考虑Z轴方向4 `/ c5 {/ j# c+ R, _6 {
- void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])
0 t8 u" \4 J4 C) c# @; v - {+ ]; o1 U: g2 _2 }' b8 }
- double dotResult;) l7 j( v& v6 ~0 y3 d0 v) M/ l
- double longDistance;
+ N. y. p* {; _ - double zDir[3] = { 0.0,0.0,1.0 };
N% Z6 W; W+ J" r% @9 E - //直线距离* d4 l$ w3 o: G$ a% ?* J! C8 w- N
- double deltaProjectDistance = fabs(maxZValue - basePoint[2]);7 K4 @# i4 `1 x2 V9 h0 N( a6 Y1 ^
- 7 p" e6 g* [' W5 u) H' _
- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);2 u6 f O. J; }9 Y9 V7 J
- - C0 X/ R4 ?) d/ W1 N/ G" x! T
- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回! c, R, |; P( j+ c* h
- {; I( F2 o1 G! E9 ^5 O
- UF_VEC3_copy(basePoint, newOriginalPoint);3 [- A* \8 z! J9 B4 C
- return;/ M' D p: x( y6 a
- }
{8 t( S+ F5 j/ M9 U$ A - 7 l1 P' ^* U8 O& [0 V; e8 U7 {
- //计算夹角,通过单位矢量
6 j! j% M/ G, K1 T, H! z7 @8 R - //faceDir 可能反向
- n; Q& B3 E# _& }. U* L, b% W - UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);
- K S: B- B& C4 \! j' g - // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle) : c0 Z. G* M5 k% D" ?% K
- double cosAngle = fabs(dotResult);
: z9 F/ E* @; N" t - % k5 {* t- ^/ r0 _( }7 Y/ O" I2 I8 `
- //斜边距离6 N" b* u7 t- d
- if (EQ_is_zero(cosAngle, MINTOL))
' r b, F1 n: Z- t3 ~7 V - {
+ @ o$ E+ }* x - longDistance = deltaProjectDistance;" E1 U8 k5 j5 G1 f" D. x4 Q
- }
) d1 T7 |: | A( d4 W% P0 s - else
% Q- v' r# F4 t& Q8 I; P' Q3 [" V - {
, K) K: d$ ^; k2 U- n7 f - longDistance = deltaProjectDistance / cosAngle;5 h9 h1 \7 M* I0 j9 S; W
- } w4 }! o2 t: ~; q# @
-
2 r2 U1 D9 S9 q5 I - //这里可能出现方向相反,我们需要进行一次判定5 r+ @- l- U( |7 g: o/ j
9 I: m) b( h8 N0 A- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);. z' Z1 R* P3 g# Y/ P' ?8 k
, ]$ [5 W+ G' e, D0 F* E- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]); v: d; @4 O9 R5 J0 e
- - q7 F4 u. ^' B: N1 Z
- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))
7 N5 m/ c8 h A% v1 c( T - {
# P: i: }0 ?( G. L q' R! a/ A - UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);8 @; [$ ~8 {2 |: {, ^; H
- }
8 {! T7 U* q/ P
8 R8 M7 j! p% Y5 X8 A: G- 4 i- k- b$ f; N# }; S7 w
- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);
" Y ~4 h( |$ g0 a, _ - }
复制代码 7 i* K1 Z9 b/ m* z# b
) N- a+ e' u) f- T" R
|
|