【二次开发源码】一种基于点投影,获取投影原始点的方法
【二次开发源码】一种基于点投影,获取投影原始点的方法
一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
//这里仅仅考虑Z轴方向
void Get_Projection_OrignalPoint(double basePoint,double maxZValue,double projectOrignialUnitDir, double newOriginalPoint)
{
double dotResult;
double longDistance;
double zDir = { 0.0,0.0,1.0 };
//直线距离
double deltaProjectDistance = fabs(maxZValue - basePoint);
Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);
if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回
{
UF_VEC3_copy(basePoint, newOriginalPoint);
return;
}
//计算夹角,通过单位矢量
//faceDir 可能反向
UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);
// cos() faceDir.zDir = |FaceDir||ZDir|cos(angle)
double cosAngle = fabs(dotResult);
//斜边距离
if (EQ_is_zero(cosAngle, MINTOL))
{
longDistance = deltaProjectDistance;
}
else
{
longDistance = deltaProjectDistance / cosAngle;
}
//这里可能出现方向相反,我们需要进行一次判定
UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);
Echo("maxZValue: %f ,newOriginalPoint:%.3f", maxZValue, newOriginalPoint);
if (!EQ_is_eq(maxZValue,newOriginalPoint,MINTOL))
{
UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
}
Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);
}
页:
[1]