二维计算几何基础

计算几何中的计算是基于向量中的坐标运算,在计算几何中我们需要对一些概念进行定义。由于是坐标表示,所以计算几何中的点也可以表示向量,对于每一个点和向量,我们记录他们的坐标。加减乘除各个运算也都与数学中的相同。

其中的dcmp解决了精度问题。

一下代码展现了对向量运算的基本定义。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm> 
using namespace std;
const int MAXN=50005;
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);}
bool operator <(const Point& a,const Point& b){
    return a.x<b.x||(a.x==b.x&&a.y<b.y);
}
const double eps=1e-10;
int dcmp(double x){
    if(fabs(x)<eps) return 0; else return x<0?-1:1;
}
bool operator ==(const Point& a,const Point &b){
    return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;
}
bool operator <=(const Point& a,const Point &b){
    return a<b||a==b;
}

之后我们再来看计算几何中的基本运算

1.点积

点积,即 a · b = | a | | b | c o s α ,与数学中的运算方法仍然一致

double Dot(Vector A,Vector B){return A.x*B.x+A.y*B.y;}

通过点积运算,我们可以计算向量的一些东西,比如求出向量的长度

double Length(Vector A){return sqrt(Dot(A,A));}

再者,可以求出两个向量的夹角

double Angle(Vector A,Vector B){return acos(Dot(A,B)/Length(A)/Length(B));}

2.叉积

叉积,即两个向量组成三角形有向面积的两倍,也就是他们组成的平行四边形的有向面积,注意是有向。

double Cross(Vector A,Vector B){return A.x*B.y-A.y*B.x;}

叉积经常用来判断两条直线或点的位置关系,所以值得一提的是叉积的正负问题。
对于Cross(v,w),,当w在v的左边时,叉积为正,当w在v右边时,叉积为负。即看第一个向量与第二个向量的关系,第二个向量在左边时为正,左正右负,一定记好。

叉积可以用于计算三角形面积,这里计算的是三角形面积的二倍

double Area2(Point A,Point B,Point C){return Cross(B-A,C-A);}

接下来介绍几个常用的计算

旋转

Vector Rorate(Vector A,double rad){
    return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad));
}

计算向量的法线

Vector Normal(Vector A){
    double L=Length(A);
    return Vector(-A.y/L,A.x/L);
}

猜你喜欢

转载自blog.csdn.net/NIIFL/article/details/80069022
今日推荐