点的表示
struct Point{
double x;double y;
Point(double x=0,double y=0):x(x),y(y) {}//加这句话是为了重载运算用???
}p1,p2;
重载点运算符
Point operator + (Point p1,Point p2){
return Point(p1.x+p2.x,p1.y+p2.y);
}
Point operator - (Point p1,Point p2){
return Point(p1.x-p2.x,p1.y-p2.y);
}
Point operator * (Point p1,Point p2){
return Point(p1.x*p2.x,p1.y*p2.y);
}
Point operator / (Point p1,Point p2){
return Point(p1.x/p2.x,p1.y/p2.y);
}
实现点的运算
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
struct Point{
double x;double y;
Point(double x=0,double y=0):x(x),y(y) {}
};
Point operator + (Point p1,Point p2){
return Point(p1.x+p2.x,p1.y+p2.y);
}
Point operator - (Point p1,Point p2){
return Point(p1.x-p2.x,p1.y-p2.y);
}
Point operator * (Point p1,Point p2){
return Point(p1.x*p2.x,p1.y*p2.y);
}
Point operator / (Point p1,Point p2){
return Point(p1.x/p2.x,p1.y/p2.y);
}
int main(){
Point p1,p2,p3;
p1.x=1.1,p1.y=1.2;
p2.x=0.9,p2.y=0.8;
p3=p1+p2;
printf("相加为%lf %lf\n",p3.x,p3.y);
p3=p1-p2;
printf("相减为%lf %lf\n",p3.x,p3.y);
p3=p1*p2;
printf("相乘为%lf %lf\n",p3.x,p3.y);
p3=p1/p2;
printf("相除为%lf %lf\n",p3.x,p3.y);
return 0;
}
重载向量运算符
Vector operator + (Vector p1,Vector p2){
return Point(p1.x+p2.x,p1.y+p2.y);
}
Vector operator - (Point p1,Point p2){
return Point(p1.x-p2.x,p1.y-p2.y);
}
Vector operator * (Point p1,double p){
return Point(p1.x*p,p1.y*p);
}
Vector operator / (Point p1,double p){
return Point(p1.x/p,p1.y/p);
}
struct Point{
double x, y;
Point(double x = 0, double y = 0):x(x),y(y){}
};
typedef Point Vector;
Vector operator + (Vector A, Vector B){
return Vector(A.x+B.x, A.y+B.y);
}
Vector operator - (Point A, Point B){
return Vector(A.x-B.x, A.y-B.y);
}
Vector operator * (Vector A, double p){
return Vector(A.x*p, A.y*p);
}
Vector operator / (Vector A, double p){
return Vector(A.x/p, A.y/p);
}
小于运算
将点集按照x坐标升序排序,若x坐标相同,则按照y坐标排序
cmp在函数sort();里配合使用
bool operator < (const Point &a,const Point &b){
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
等于运算
判断两个点是否近似相等
bool operator ==(const Point &a,const Point &b){
if(dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y) == 0)
return true;
return false;
}
点积运算
double Dot(Vector a,Vector b){
return a.x*b.x+a.y*b.y;
}
叉乘运算
可用于求面积
double Cross(Vector a,Vector b){
return a.x*b.y-a.y*b.x;
}
取模运算
double Length(Vector a){
return sqrt(Dot(a,a));
}
夹角计算
double Angle(Vector a,Vector b){
return acos(Dot(a,b)/(Length(a)*Length(b)));
}
逆时针选择后的向量
Vector Rotate(Vector A, double rad){//rad为弧度 且为逆时针旋转的角
return Vector(A.x*cos(rad)-A.y*sin(rad), A.x*sin(rad)+A.y*cos(rad));
}
判断折线bc是不是向ab的逆时针方向(左边)转向
bool ToLeftTest(Point a, Point b, Point c){
return Cross(b - a, c - b) > 0;
}
精度问题
定义
static const double PI = acos(-1.0);//π
static const double eps = 1e-16;
static const double inf = 1e100;
x==y
因为浮点的比较运算有些问题,所以改写成
int dcmp(double a,double b){
if(fabs(a-b)<eps)
return 0;//相等
if(a>b)
return 1//a大于b
return -1;//a小于b
}
输出为-0
double a =-0.00001
printf("%.4f",a);