这几天一直在看计算几何,看了几道算法题,把自己弄得有点头晕,在这里理理自己的头绪,也为大家提供点东西。
1.计算几何最基础的东西“向量”,接下来为大家理理向量先:以向量a(c,d),b(e,f)举例;
(1) 判断两个向量是否平行:(即对直线而言是斜率相等) a//b => a x b = 0 => c*f - e*d = 0;
(2) 判断两个向量是否垂直:a垂直b => c*e + d*f = 0;
(3) 向量的叉乘:a x b = c*f - e*d ;
(4) 向量的内积:a * b = c*e + d*f;
(5) 判断点在直线L上,L上两点为P1 , P2,如果 点P在直线L上,则fabs((P - P1) x (P2 - P1)) <eps ;(三点共线的等价条件:a x b ==0)
(6) 判断点在线段上,这要分两步:一、判断点在直线上; 二、判断点在线段所形成的矩形内。满足这两点就可以判断。
(7) 判断线段相交 可根据叉乘的点位置判断: 如果相交那么一条线段的俩个点一定在另一条线段的不同侧。叉乘小于等于零,(包括线段端点在另一条上)。
(8) 叉乘的拐向问题,判断凹凸多边形。
(9) 取多边形上一点用叉乘只能求凸多边形的面积。
(10)内积判断点的位置: a,b,c三点,如果向量ac * 向量bc <0,则点 c 在 ab 的中间;如果向量ac * 向量bc ==0,则点 c 在 ab 的端点上,a 或 b;如果向量ac * 向量bc >0,则点 c 在 ab 的外面。
再给大家推荐几个模板:
(1):
(2):求交点:交点一定和两条线段的端点共线,所以利用叉乘列一个方程组即可。
假设交点为p0(x0,y0)。则有:
(p1-p0)X(p2-p0)=0
(p3-p0)X(p2-p0)=0
展开后即是
(y1-y2)x0+(x2-x1)y0+x1y2-x2y1=0
(y3-y4)x0+(x4-x3)y0+x3y4-x4y3=0
将x0,y0作为变量求解二元一次方程组。
假设有二元一次方程组
a1x+b1y+c1=0;
a2x+b2y+c2=0
那么
x=(c1*b2-c2*b1)/(a2*b1-a1*b2);
y=(a2*c1-a1*c2)/(a1*b2-a2*b1);
因为此处两直线不会平行,所以分母不会为0。