关于计算几何

#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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值