我现在发现了我在计算几何方面就是个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的两侧
扫描二维码关注公众号,回复:
1044814 查看本文章
判断两线段是否相交(非严格):
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']的向量,再行加减即可