• 已知空间三点组成的面求该面上某点的Z值


    已知空间三点,那么可以就可以确定空间三点组成的平面。此时可以根据某一点的X值和Y值,来求取该点在平面上的Z值。这个过程对于求三角面片上某点的高程或者权值特别有用,其本身也可以看作一种线性插值。

    其算法思路也特别简单,首先算出其三点组成的平面法向量(可参看《已知三点求平面法向量》);然后根据平面法向量(n=(A,B,C))和平面上某点(m=(x0,y0,z0)),有平面的点法式方程:

    [A(X-x0)+B(Y-y0)+C(Z-z0)=0 ]

    最后根据欲求点的X、Y值,代入公式解算Z值即可。

    具体实现代码如下:

    #include<iostream>
    
    using namespace std;
    
    //三维double矢量
    struct Vec3d
    {
    	double x, y, z;
    
    	Vec3d()
    	{
    		x = 0.0;
    		y = 0.0;
    		z = 0.0;
    	}
    	Vec3d(double dx, double dy, double dz)
    	{
    		x = dx;
    		y = dy;
    		z = dz;
    	}
    	void Set(double dx, double dy, double dz)
    	{
    		x = dx;
    		y = dy;
    		z = dz;
    	}
    };
    
    //计算三点成面的法向量
    void Cal_Normal_3D(const Vec3d& v1, const Vec3d& v2, const Vec3d& v3, Vec3d &vn)
    {
    	//v1(n1,n2,n3);
    	//平面方程: na * (x – n1) + nb * (y – n2) + nc * (z – n3) = 0 ;
    	double na = (v2.y - v1.y)*(v3.z - v1.z) - (v2.z - v1.z)*(v3.y - v1.y);
    	double nb = (v2.z - v1.z)*(v3.x - v1.x) - (v2.x - v1.x)*(v3.z - v1.z);
    	double nc = (v2.x - v1.x)*(v3.y - v1.y) - (v2.y - v1.y)*(v3.x - v1.x);
    
    	//平面法向量
    	vn.Set(na, nb, nc);
    }
    
    void CalPlanePointZ(const Vec3d& v1, const Vec3d& v2, const Vec3d& v3, Vec3d& vp)
    {
    	Vec3d vn;
    	Cal_Normal_3D(v1, v2, v3, vn);	
    
    	if (vn.z != 0)				//如果平面平行Z轴
    	{
    		vp.z = v1.z - (vn.x * (vp.x - v1.x) + vn.y * (vp.y - v1.y)) / vn.z;			//点法式求解
    	}	
    }
    
    int main()
    {
    	Vec3d v1(1.0, 5.2, 3.7);
    	Vec3d v2(2.8, 3.9, 4.5);
    	Vec3d v3(7.6, 8.4, 6.2);
    	Vec3d vp;
    	vp.x = 5.6;
    	vp.y = 6.4;
    	vp.z = 0.0;
    
    	CalPlanePointZ(v1, v2, v3, vp);
    
    	return 0;
    }
    
  • 相关阅读:
    uni-app 发起请求,Toast 消息提示 ,跳转页面
    uView初识
    uni-app初识
    docker目录 /var/lib/docker/containers 日志清理
    Linux中使用pigz工具更快的压缩和解压文件
    docker 修改默认网段
    LayaAir提示:版本不匹配!全局tsc(2.7.2)!=VS Code的语言服务(2.1.5)。可能出现不一致的编译错误
    C++ 格式化 浮点为字符串
    安装 ta-lib
    编译 python 代码
  • 原文地址:https://www.cnblogs.com/charlee44/p/12109904.html
Copyright © 2020-2023  润新知