向量点乘与叉乘

您所在的位置:网站首页 怎么判断叉乘的正负 向量点乘与叉乘

向量点乘与叉乘

2024-06-25 19:09| 来源: 网络整理| 查看: 265

点-线距离      找出一个点和一条线间的距离是经常遇见的几何问题之一。假设给出三个点,A,B和C,你想找出点C到点A、B定出的直线间距离。第一步是找出A到B的向量AB和A到C的向量AC,现在我们用该两向量的叉积除以|AB|,这就是我们要找的的距离了(下图中的红线)。    d = (AB x AC)/|AB| 

      如果你有基础的高中几何知识,你就知道原因了。上一节我们知道(AB X AC)/2是三角形ABC的面积,这个三角形的底是|AB|,高就是C到AB的距离。有时叉积得到的是一个负值,这种情况下距离就是上述结果的绝对值。      当我们要找点到线段的距离时,情况变得稍稍复杂一些。这时线段与点的最短距离可能是点到线段的某一端点,而不是点到直线的垂线。例如上图中点C到线段AB的最短距离应该是线段BC。我们有集中不同的方法来判断这种特殊情况。第一种情况是计算点积AB B来判定两线段间夹角。如果点积大于等于零,那么表示AB到BC是在-90到90度间,也就是说C到AB的垂线在AB外,那么AB上到C距离最近的点就是B。同样,如果BAAC大于等于零,那么点A就是距离C最近的点。如果两者均小于零,那么距离最近的点就在线段AB中的莫一点。

源代码参考如下:     //Compute the dot product AB   BC     int dot(int[] A, int[] B, int[] C){         AB = new int[2];         BC = new int[2];         AB[0] = B[0]-A[0];         AB[1] = B[1]-A[1];         BC[0] = C[0]-B[0];         BC[1] = C[1]-B[1];         int dot = AB[0] * BC[0] + AB[1] * BC[1];         return dot;     }     //Compute the cross product AB x AC     int cross(int[] A, int[] B, int[] C){         AB = new int[2];         AC = new int[2];         AB[0] = B[0]-A[0];         AB[1] = B[1]-A[1];         AC[0] = C[0]-A[0];         AC[1] = C[1]-A[1];         int cross = AB[0] * AC[1] - AB[1] * AC[0];         return cross;     }     //Compute the distance from A to B     double distance(int[] A, int[] B){         int d1 = A[0] - B[0];         int d2 = A[1] - B[1];         return sqrt(d1*d1+d2*d2);     }     //Compute the distance from AB to C     //if isSegment is true, AB is a segment, not a line.     double linePointDist(int[] A, int[] B, int[] C, boolean isSegment){         double dist = cross(A,B,C) / distance(A,B);         if(isSegment){             int dot1 = dot(A,B,C);             if(dot1 > 0)return distance(B,C);             int dot2 = dot(B,A,C);             if(dot2 > 0)return distance(A,C);         }         return abs(dist);     }

      上面的代码看起来似乎是很繁琐。不过我们可以看看在C++和C#中,采用了运算符重载的类point,用‘*’代表点乘,用'^'代表叉乘(当然'+''-'还是你所希望的),那么看起来就简单些,代码如下:

   //Compute the distance from AB to C     //if isSegment is true, AB is a segment, not a line.     double linePointDist(point A, point B, point C, bool isSegment){         double dist = ((B-A)^(C-A)) / sqrt((B-A)*(B-A));         if(isSegment){             int dot1 = (C-B)*(B-A);             if(dot1 > 0)return sqrt((B-C)*(B-C));             int dot2 = (C-A)*(A-B);             if(dot2 > 0)return sqrt((A-C)*(A-C));         }         return abs(dist);     }



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3