计算几何
函数 acos和atan2,是关于cos的反解函数
printf("%.9lf",acos(-1));
这个是解cos的函数
可以精确的取到小数点后9位
cout<<atan2(sqrt(3),1);
这个是解tan的函数,因为后面有个2,所以后面要有两个参数
点的表示:二维平面中的点用坐标(x,y)表示,我们通常写一个结构体来处理
struct Point{ double x,y; Point(){} Point(double x,double y):x(x),y(y){} };
两点之间的距离:
把两点堪称直角三角形的两个顶点,那斜边就是两点的距离
double Dist(Point A,Point B){ return sqrt((A.x-B.x)*(A.x-B.x) + (A.y-B.y)*(A.y-B.y)); }
运算,坐标(x1,y1)(x2,y2)
加:(x1+x2,y1+y2)
减:(x1-x2,y1-y2)
乘:一般用double或者long double k·a=(kx1,kx2)
点乘:向量a·向量b=向量a的模x向量b的模成cos夹角
叉乘:向量a x 向量b=(Xa·Yb-Xb·Ya)/2
这样叉乘出来时平行四边形的面积,除以二才是最后的三角形面积
-
加:点与点的加法运算没有意义;点与向量相加得到另一个点;向量与向量相加得到另外一个向量。
Point operator + (Point B){return Point(x+B.x,y+B.y);}
-
减:两个点的差是一个向量;向量 A 减 BB,得到由 B 指向 AA 的向量。
Point operator - (Point B){return Point(x-B.x,y-B.y);}
-
乘:向量与实数相乘得到等比例放大的向量。
Point operator * (double k){return Point(x*k,y*k);}
-
除:向量与实数相除得到等比例缩小的向量。
Point operator / (double k){return Point(x/k,y/k);}
-
等于:
bool operator == (Point B){return sgn(x-B.x)==0 && sgn(y-B.y)==0;}
点积
编程时计算点积,并不需要知道θ。因为如果已知 A=( Ax, Ay),B=( Bx, By),那么就有:A•B = Ax·Bx + Ay·By
所以求a,b的点积的代码
double Dot(Vector A,Vector B){
return A.x*B.x+A.y*B.y;}
叉乘
它的计算公式是:A×B=|A||B|sinθ,其中 θ表示向量 A旋转到向量 B所经过的夹角。两个向量的叉积是一个带正负号的数值。
A×B 的几何意义为向量 A和 B形成的平行四边形的“有向”面积,这个面积是有正负的。叉积的正负符合“右手定则”,可以用下图中的正负情况帮助理解。
我们用以下程序计算向量 A、B的叉积 A×B:
double Cross(Vector A,Vector B){return A.x*B.y – A.y*B.x;}