由于经常遇到数学上点的各种问题。所以还是需要个数据结构(轮子)来一直用,为此记录一下,顺便做个题
常用函数总结
1.——2D情况
1.1 数据结构
class Point2D
{
public:
int x, y;
Point2D(int a = 0, int b = 0):x(a),y(b){}
};
1.2 两点距离(注:float可以换成double,但还是可能会有误差的,这点需要注意)
//包含头文件<cmath>
float dis2D(Point2D s_1,Point2D s_2)
{
float x1 = s_1.x-s_2.x;
float y1 = s_1.y-s_2.y;
return sqrt(x1*x1+y1*y1);
}
1.3 是否共线(有两种方法,但都存在误差所以都无法直接等于)
//1.利用斜率判断
bool collinear_3Points_1(Point2D a , Point2D b, Point2D c)
{
if(abs((c.y - b.y)*(b.x - a.x) - (b.y - a.y)*(c.x - b.x))< 1e-6)
return true; //斜率小于临界值,即共线
return false;//不共线
}
//2. 海伦公式 S=sqrt(p(p-a)(p-b)(p-c)) p=(a+b+c)/2
bool collinear_3Points_2(Point2D a , Point2D b, Point2D c)
{
float edge_A=dis2D(a,b);
float edge_B=dis2D(b,c);
float edge_C=dis2D(a,c);
float p = 0.5*(edge_A+edge_B+edge_C);
if(p*(p-edge_A)*(p-edge_B)*(p-edge_C) <1e-6)
return true; //面积小于临界值,即共线
return false;//不共线
}
2.——3D情况
2.1 数据结构:
class Point3D
{
public:
int x, y, z;
Point3D(int a = 0, int b = 0, int c = 0):x(a),y(b),z(c){}
};
2.2 两点距离(注:float可以换成double,但还是可能会有误差的,这点需要注意)
//包含头文件<cmath>
float dis3D(Point3D s_1,Point3D s_2)
{
float x1 = s_1.x-s_2.x;
float y1 = s_1.y-s_2.y;
float z1 = s_1.z-s_2.z;
return sqrt(x1*x1+y1*y1+z1*z1);
}
2.3 是否共线(这里利用海伦公式判断,由于存在误差所以不能直接等于0判断)
//是否共线 海伦公式 S=sqrt(p(p-a)(p-b)(p-c)) p=(a+b+c)/2
bool collinear_3Points(Point3D a , Point3D b, Point3D c)
{
float edge_A=dis3D(a,b);
float edge_B=dis3D(b,c);
float edge_C=dis3D(a,c);
float p = 0.5*(edge_A+edge_B+edge_C);
if(p*(p-edge_A)*(p-edge_B)*(p-edge_C) <1e-6)
return true; //面积小于临界值,即共线
return false;//不共线
}