admin 发表于 2023-2-28 20:27:29

【二次开发源码】一种基于点投影,获取投影原始点的方法




【二次开发源码】一种基于点投影,获取投影原始点的方法

一直斜边和一个直边的向量,单位向量可以通过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]
查看完整版本: 【二次开发源码】一种基于点投影,获取投影原始点的方法