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

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

其算法思路也特别简单,首先算出其三点组成的平面法向量(可参看《已知三点求平面法向量》);然后根据平面法向量 n = ( A , B , C ) n=(A,B,C) n=(A,B,C)和平面上某点 m = ( x 0 , y 0 , z 0 ) m=(x0,y0,z0) m=(x0,y0,z0),有平面的点法式方程:
A ( X − x 0 ) + B ( Y − y 0 ) + C ( Z − z 0 ) = 0 A(X-x0)+B(Y-y0)+C(Z-z0)=0 A(Xx0)+B(Yy0)+C(Zz0)=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;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
步骤如下: 1. 定义圆锥体的参数,包括底半径、高度、顶坐标等。 2. 生成底圆的坐标。 2.1 计算圆心坐标,即底圆心与顶坐标的中。 2.2 生成圆弧上若干的坐标。 2.3 添加圆心坐标到坐标数组中。 3. 生成侧三角形的坐标。 3.1 计算圆上每个与顶的连线与底圆上相邻的连线的夹角。 3.2 计算三角形的三个顶坐标。 3.3 依次添加三角形的三个顶坐标到坐标数组中。 4. 使用patch函数绘制圆锥体。 下是示例代码: ```matlab % 定义圆锥体参数 r = 1; % 底半径 h = 2; % 高度 v = [0, 0, 0]; % 顶坐标 % 生成底圆的坐标 theta = linspace(0, 2*pi, 50); % 圆弧角度 center = (v + [0, 0, h/2]) / 2; % 圆心坐标 x = r * cos(theta) + center(1); % 圆弧上的x坐标 y = r * sin(theta) + center(2); % 圆弧上的y坐标 z = center(3) * ones(size(theta)); % 圆弧上的z坐标 points = [center; [x', y', z]]; % 添加圆心坐标 % 生成侧三角形的坐标 for i = 1:length(theta) % 计算三角形的三个顶坐标 p1 = [x(i), y(i), z(i)]; p2 = [x(mod(i,length(theta))+1), y(mod(i,length(theta))+1), z(mod(i,length(theta))+1)]; p3 = v; % 添加三角形的三个顶坐标 points = [points; p1; p2; p3]; end % 绘制圆锥体 patch('Vertices', points, 'Faces', reshape(1:size(points,1), 3, [])') axis equal; ``` 运行结果如下图所示: ![cone](https://i.loli.net/2021/06/29/H1lIaJ3QvP8fscC.png)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

charlee44

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值