两个三维向量叉积_直线和平面的外法线向量

本文介绍了如何求解直线AB的法线向量和平面的法向量,强调了在三维坐标系中使用向量叉乘法则,并遵循右手定则。此外,还探讨了向量叉积在计算平行四边形面积和平行六面体体积中的应用,以及在MATLAB中如何利用向量叉积判断点与直线的位置关系。
摘要由CSDN通过智能技术生成

37ea56d18faa75e8ca43be43d4952123.png

直线AB的法线向量n

(1)

(2)

40af8c8b3bad9713f345870d692a3242.png
图 1 直线法向量

因此当求一个四边形 四条边的外法线向量时有

aaf57fc45d432a6b1fcff222a6bbe272.png
图2 四边形边界上外法线向量

平面的法向量

三维坐标系中平面的法线向量采用向量叉乘法则,方向根据右手定则来判断,向量叉积公式

bbff1f8c8daa79147451de537ef17ee2.png

其中i,j,k为基向量,故向量叉乘结果为

向量点积的结果为

两向量叉积的模为两向量构成平行四边形的面积

两向量的叉积在与另一向量的点积为,叉积向量构成平面与点积向量所构成的平行六面体的体积

0e6fe77601472b6417429561db2c2795.png
图3 叉积、点积图片描述

MATLAB 判断点与直线的位置关系

在MATLAB 判断点与向量的位置关系也是利用了向量的叉积,另外还可以判断点在直线的左右,此时直线没有方向可参考以下连接

判断点在线的左边、右边 - carekee - 博客园​www.cnblogs.com

,
判断c点在直线ab的左右

08805fb9f9438db959247b5d978fd8a2.png

向量ab叉乘ac产生了平行于z轴的向量,所以

c点在向量ab的左侧

c点在向量ab的右侧
以下是C#代码实现三维中两条线段是否相交并返回交点,包括线段在内和线段在的情况: ```csharp using System; using System.Collections.Generic; using System.Text; namespace LineIntersection { class Program { static void Main(string[] args) { Point3d p1 = new Point3d(0, 0, 0); Point3d p2 = new Point3d(1, 1, 1); Point3d p3 = new Point3d(0, 1, 0); Point3d p4 = new Point3d(1, 0, 1); Point3d intersection = new Point3d(); bool isIntersect = LineIntersection(p1, p2, p3, p4, out intersection); if (isIntersect) { Console.WriteLine("The two lines intersect at point ({0}, {1}, {2}).", intersection.X, intersection.Y, intersection.Z); } else { Console.WriteLine("The two lines do not intersect."); } Console.ReadLine(); } // 判断两条线段是否相交,并返回交点 public static bool LineIntersection(Point3d p1, Point3d p2, Point3d p3, Point3d p4, out Point3d intersection) { intersection = new Point3d(); // 计算向量 Vector3d v1 = new Vector3d(p1, p2); Vector3d v2 = new Vector3d(p3, p4); Vector3d v3 = new Vector3d(p1, p3); // 计算向量 Vector3d n1 = Vector3d.CrossProduct(v1, v2); Vector3d n2 = Vector3d.CrossProduct(v1, n1); // 计算交点 double t = Vector3d.DotProduct(n1, v3) / Vector3d.DotProduct(n1, v1); double s = Vector3d.DotProduct(n2, v3) / Vector3d.DotProduct(n2, v2); if (t < 0 || t > 1 || s < 0 || s > 1) { // 无交点 return false; } intersection = p1 + v1 * t; return true; } } // 三维点类 public class Point3d { public double X { get; set; } public double Y { get; set; } public double Z { get; set; } public Point3d(double x, double y, double z) { X = x; Y = y; Z = z; } } // 三维向量类 public class Vector3d { public double X { get; set; } public double Y { get; set; } public double Z { get; set; } public Vector3d(double x, double y, double z) { X = x; Y = y; Z = z; } public Vector3d(Point3d p1, Point3d p2) { X = p2.X - p1.X; Y = p2.Y - p1.Y; Z = p2.Z - p1.Z; } // 向量点积 public static double DotProduct(Vector3d v1, Vector3d v2) { return v1.X * v2.X + v1.Y * v2.Y + v1.Z * v2.Z; } // 向量叉积 public static Vector3d CrossProduct(Vector3d v1, Vector3d v2) { double x = v1.Y * v2.Z - v1.Z * v2.Y; double y = v1.Z * v2.X - v1.X * v2.Z; double z = v1.X * v2.Y - v1.Y * v2.X; return new Vector3d(x, y, z); } // 向量数乘 public static Vector3d operator *(Vector3d v1, double s) { return new Vector3d(v1.X * s, v1.Y * s, v1.Z * s); } // 向量 public static Point3d operator +(Point3d p, Vector3d v) { return new Point3d(p.X + v.X, p.Y + v.Y, p.Z + v.Z); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值