关于计算几何

来源:互联网 发布:js美化工具 编辑:程序博客网 时间:2024/06/11 02:10
#include <math.h>#include <algorithm>#define MIN  0.0000001#define MINF -0.0000001double 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);}
原创粉丝点击