标签:product png sqrt log 属性 平面 点积 lock 参考
点乘的意义
下图所示,oa是向量,ob是向量,求op的距离和p点坐标.
现象就是a点投影到P点上,会呈现一个90度直角...而且oa实际上是任意的,不需要和x轴重合(带角度也可以).
虽然说B站有视频教程,但是直接看代码貌似理解更方便...
代码:
///
/// 点积,点乘就是将oa向量投影到ob向量上面
///
/// 原点
///
///
/// 求出来的就是oa在ob上的投影长度
public static Vector3d DotProduct(Point3d o, Point3d a, Point3d b)
{
var oa_vector = o.GetVectorTo(a);
var ob_vector = o.GetVectorTo(b);
//单位向量,cad自带的
Vector3d ob_UnitVector = ob_vector.GetNormal();
//求得op长度
var op_length = oa_vector.DotProduct(ob_UnitVector);//点乘,=(v1.X * v2.X) + (v1.Y * v2.Y) + (v1.Z * v2.Z);
//求得op坐标(也就是呈现90度角的坐标)
//如果O不在坐标原点,需要平移,那么最终P的最终坐标 = O的坐标 + 求出来的P的坐标
Vector3d v = ob_UnitVector * op_length;
//从0,0再平移回去
return new Vector3d(v.X + o.X, v.Y + o.Y, v.Z + o.Z);
}
///
/// 获取单位向量,仿照向量的GetNormal的数学实现,了解原理,用了Point3d代替向量
///
///
///
public static Point3d GetNormal(this Point3d ob_vector)
{
//https://www.bilibili.com/video/BV1qb411M7wL?from=search&seid=9280697047969917119
#if true
//向量模长
var ob_length = Point3d.Origin.DistanceTo(ob_vector);
#else
//两点的距离
//向量模长数学版 √(x2+y2+z2)
var ob_length = Sqrt(ob_vector.X * ob_vector.X +
ob_vector.Y * ob_vector.Y +
ob_vector.Z * ob_vector.Z);
#endif
//单位向量数学版 (x/ob_length,y/ob_length,z/ob_length)
return ob_vector / ob_length;
}
叉乘的意义
叉乘有三个意义:
二维叉乘:
A:返回值有正负,表示绕原点四象限的位置变换,也就是有向面积,面积属性可以用来求解凸包的单峰函数....知道有这个意义就好....
B:返回值有正负,如果大于0表示顺时针.
三维叉乘:
A:返回值是一个向量,X轴叉乘Y轴表示Z或者-Z,正负决定了左右手坐标系..可以理解为一个平面的法向量.
必要的视频参考
///
/// 叉积,二维叉乘计算 |p1 p2| X |p1 p|
///
/// 直线点1
/// 直线点2
/// 判断是否在内的点
/// A:返回值有正负,表示绕原点四象限的位置变换,也就是有向面积;
/// B:返回值是一个向量,X*Y表示Z或者-Z,正负是左右手坐标系
/// https://blog.csdn.net/pdcxs007/article/details/51436483
public static double Cross(Point2d a, Point2d b, Point2d n)
{
//三种计算是一样的
//return (b.X - a.X) * (n.Y - a.Y) - (n.X - a.X) * (b.Y - a.Y);
//return (a.X - b.X) * (a.Y - n.Y) - (a.X - n.X) * (a.Y - b.Y);
return (a.X - n.X) * (b.Y - n.Y) - (b.X - n.X) * (a.Y - n.Y);
}
///
/// 叉积,参数三在顺时针方向为真
///
/// 直线点1
/// 直线点2
/// 判断是否在内的点
///
public static bool CrossClockwise(Point2d a, Point2d b, Point2d n)
{
return Cross(a, b, n) > -1e-6;
}
///
/// 叉积,求出法向量,三维叉乘(X轴*Y轴==Z轴)
///
/// 向量a
/// 向量b
///
public static Vector3d CrossNormal(Vector3d a, Vector3d b)
{
//y1*z2-y2*z1,z1*x2-z2*x1,x1*y2-x2*y1
return new Vector3d(a.Y * b.Z - b.Y * a.Z, a.Z * b.X - b.Z * a.X, a.X * b.Y - b.X * a.Y);
}
(完)
cad.net 点乘和叉乘_注释包含数学
标签:product png sqrt log 属性 平面 点积 lock 参考
原文地址:https://www.cnblogs.com/JJBox/p/14300098.html