#include <math.h>
#include <algorithm>
#define MIN 0.0000001
#define MINF -0.0000001
double kkk(double x1,double y1,double x2,double y2){ // 斜率
return ( (y1 - y2) / (x1 - x2) );
}
double length(double x1,double y1,double x2,double y2,double x0,double y0){
// (x0,y0)点到直线(两点式(x1,y1),(x2,y2))的距离
if (x1 - x2 < MIN && x1 - x2 > MINF) return abs(x1-x0); // 如果斜率不存在
double k = kkk(x1,y1,x2,y2);
return (abs(k*x0 - y0 + y2 - k*x2)) / (sqrt(k*k + 1));
}
double lengthline(double x1,double y1,double x2,double y2){ // 计算两点(x1,y1)(x2,y2)之间线段的长度
return sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) );
}
double vector(double x1,double y1,double x2,double y2){ // 传进来的值为两个向量(x1,y1)and(x2,y2) 注意方向
// 计算向量积
return (x1*x2 + y1*y2);
}
今天做了一个
关于几何的题目,总结一下。
主要就是比较double型的数有点不同。直接是不能进行比较的,据说的因为浮点型的数后面几位在内存中是不稳定的。
判断两线段是否相交,运用了二维向量的叉积+跨立实验
//判断两线段是否相交
double XJ(POINT p0,POINT p1, POINT p2,POINT p3){
// 一般情况下计算 p0 p1 X p2 p3 的叉积
// (p1.x-p0.x, p1.y-p0.y) vector|p0p1|
// (p3.x-p2.x, p3.y-p2.y) vector|p2p3|
double res = (p1.x-p0.x)*(p2.y-p0.y) - (p3.x-p2.x)*(p3.y-p2.y);
return res;
}
int XJ(POINT p0,POINT p1, POINT p2){
// p0 p1 -> p0 p2 计算叉积
// (p1.x-p0.x, p1.y-p0.y) vector|p0p1|
// (p2.x-p0.x, p2.y-p0.y) vector|p0p2|
double res = (p1.x-p0.x)*(p2.y-p0.y) - (p2.x-p0.x)*(p1.y-p0.y);
return (res > infiniteS)?(1):(-1);
}
bool Segment(POINT a, POINT b, POINT c, POINT d){
// 说明: 1^-1=-2, 存在两个跨立则判定为线段相交
return ((XJ(a,b,c)^XJ(a,b,d))==-2) && ((XJ(a,c,d)^XJ(b,c,d))==-2);
}