准备
#include<bits/stdc++.h> using namespace std; const double eps=1e-6; int n,m; double x,y; struct point{//vector double x,y; };
基本运算
叉积
ab向量围成的平行四边形面积,如图红色部分
除以一边长后,为图形的高,即点线距
double len(point a){return sqrt(a.x*a.x+a.y*a.y);}//向量模 point operator+(point a,point b){return (point){a.x+b.x,a.y+b.y};} //点+向量=点 向量+向量=向量 point operator-(point a,point b){return (point){a.x-b.x,a.y-b.y};} //点-点=向量 向量-向量=向量 double operator*(point a,point b){return a.x*b.y-a.y*b.x;}//叉积
点线关系
点a关于直线b的对称点
point ref(point a,line b){ point vb=b.t-b.f;//用向量表示线 double dis=(b.f-a)*(b.t-a)/len(vb);//点线距 point dw={vb.y/len(vb),-vb.x/len(vb)};//单位向量旋转90 return a+(point){dw.x*2.0*dis,dw.y*2.0*dis}; }
左右关系
将点线转换成向量和向量,利用叉积正负判断向量的拐折关系
若(p2-p0)×(p1-p0)>0 p1p2由p1p0右拐得到,p0在p2p1左侧
若(p2-p0)×(p1-p0)<0 p1p2由p1p0左拐得到,p0在p2p1右侧
若(p2-p0)×(p1-p0)=0 p0p1p2共线