几何的代码实现

点的表示

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);

转载于:https://www.cnblogs.com/Emcikem/p/11354244.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值