计算几何模板整理(Updating)

我现在发现了我在计算几何方面就是个sillycross

在这里总结一下基本模块吧,

(使用complex<double>模板类)

点乘:

double dot(point a,point b){return real(a*conj(b));}

叉乘:

double det(point a,point b){return imag(a*conj(b));}

判断点x是否在线段[L,R]上:

bool on_seg(point x,point L,point R){return det(L-x,R-x)==0 && dot(L-x,R-x)<=0;}

判断三点是否在一条直线 + L,R是否在x的两侧

判断两线段是否相交(非严格):

bool seg_cross(point a,point b,point c,point d)
{
    double s1=det(c-a,b-a)*det(b-a,d-a);
    double s2=det(a-c,d-c)*det(d-c,b-c);
    if(s1<0 || s2<0) return false;
    if(s1==0 && s2==0) return on_seg(c,a,b) || on_seg(d,a,b);
    return true; 
}

对于每个点判断另一线段的两点是否在其两端  +   对一条线段的端点恰在另一线段上的特殊处理

求点x关于线段[A,B]的对称点:

point sym(point x,point A,point B){return 2*dot(A,B)/dot(B,B)*B-A+x;}

将线段[x,A]延长一倍,求出线段[x,x']的向量,再行加减即可

猜你喜欢

转载自www.cnblogs.com/newera/p/9094543.html