【发布时间】:2014-10-11 13:54:49
【问题描述】:
我在理解 ccw(逆时针)算法时遇到了一些问题:
int ccw (Point P0, Point P1, Point P2) {
dx1 = P1.x - P0.x;
dx2 = P2.x - P0.x;
dy1 = P1.y - P0.y;
dy2 = P1.y - P0.y;
if (dy1 * dx2 > dy2 * dx1) return -1;
if (dx1 * dy2 > dy1 * dx2) return 1;
if ((dx1 * dx2 < 0) || (dy1 * dy2 < 0)) return 1;
if ((dx1 * dx1 + dy1 * dy1) < (dx2 * dx2 + dy2 * dy2)) return -1;
return 0;
}
这段代码用于查看两条线是否相交:
bool intersect (Vector2D l1, Vector2D l2) {
return (((ccw(l1.start, l1.end, l2.start) * ccw(l1.start, l1.end, l2.end)) <= 0)
&& ((ccw(l2.start, l2.end, l1.start) * ccw(l2.start, l2.end, l1.start)) <= 0))
}
intersect 函数里面的代码我能看懂,但ccw 函数里面的代码我不是很懂。
为什么不用叉积?
【问题讨论】:
-
使用什么的叉积?你不能
cross2d 向量。它仅在 3D 和 7D 空间中定义,AFAIK。 -
@Drop 在二维向量数学中,“叉积”常用于指垂直点积。