已知平面内三点,求其平面的法向量

三点平面法向量

设三点坐标为A(x1,y1,z1),B(x2,y2,z2),C(x3,y3,z3)

向量AB=(x2-x1,y2-y1,z2-z1),AC=(x3-x1,y3-y1,z3-z1)

AB、AC所在平面的法向量即AB×AC=(a,b,c),其中:

a=(y2-y1)(z3-z1)-(z2-z1)(y3-y1)

b=(z2-z1)(x3-x1)-(z3-z1)(x2-x1)

c=(x2-x1)(y3-y1)-(x3-x1)(y2-y1)

设 a=(ax,ay,az), b=(bx,by,bz)。i,j,k分别是X,Y,Z轴方向的单位向量,则:

a×b=(aybz-azby)i+(azbx-axbz)j+(axby-aybx)k

a·b=(axbx+ayby+az*bz)

Python代码

python 复制代码
def normal_vector(p1, p2, p3):
    x1, y1, z1 = p1
    x2, y2, z2 = p2
    x3, y3, z3 = p3

    a = (y2 - y1) * (z3 - z1) - (z2 - z1) * (y3 - y1)
    b = (z2 - z1) * (x3 - x1) - (x2 - x1) * (z3 - z1)
    c = (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1)

    return (a, b, c)

if __name__ == '__main__':
    p1 = 1.0, 5.2, 0.0
    p2 = 2.8, 3.9, 1.0
    p3 = 7.6, 8.4, 2.0
    p4 = normal_vector(p1, p2, p3)
    print(p4)

    # output (-5.800000000000001, 3.0, 14.340000000000002)

C++代码

cpp 复制代码
#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);
}

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);   
	// 法向量为:-5.81 0.78 14.34;

	Vec3d v1(1.0, 5.2, 0.0);
	Vec3d v2(2.8, 3.9, 1.0);
	Vec3d v3(7.6, 8.4, 2.0);
	// 法向量为:-5.8 3 14.34
	
	Vec3d vn;
	Cal_Normal_3D(v1, v2, v3, vn);
	// cout <<"法向量为:"<< vn.x << '\t' << vn.y << '\t' << vn.z << '\n';
    cout <<"法向量为:"<< vn.x << " " << vn.y << " " << vn.z << '\n';

	return 0;
}
相关推荐
奋进的小暄13 分钟前
贪心算法(15)(java)用最小的箭引爆气球
算法·贪心算法
Scc_hy25 分钟前
强化学习_Paper_1988_Learning to predict by the methods of temporal differences
人工智能·深度学习·算法
巷北夜未央26 分钟前
Python每日一题(14)
开发语言·python·算法
javaisC28 分钟前
c语言数据结构--------拓扑排序和逆拓扑排序(Kahn算法和DFS算法实现)
c语言·算法·深度优先
爱爬山的老虎29 分钟前
【面试经典150题】LeetCode121·买卖股票最佳时机
数据结构·算法·leetcode·面试·职场和发展
SWHL30 分钟前
rapidocr 2.x系列正式发布
算法
爱代码的小黄人1 小时前
相平面案例分析爱情故事
平面
雾月551 小时前
LeetCode 914 卡牌分组
java·开发语言·算法·leetcode·职场和发展
想跑步的小弱鸡1 小时前
Leetcode hot 100(day 4)
算法·leetcode·职场和发展
Fantasydg1 小时前
DAY 35 leetcode 202--哈希表.快乐数
算法·leetcode·散列表