计算几何

发布时间 2023-08-08 17:11:51作者: yisiwunian

准备

#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共线