计算几何初步

本文介绍了几何计算中的基本概念,包括点结构定义、判断两点是否接近于零、计算叉积和点积的方法,并详细阐述了如何利用这些概念判断两条线段是否相交。代码示例使用C++实现。


#include<iostream>
#include<algorithm>
#define EPS 1e-6
using namespace std;
typedef struct Point{
	int x, y;
	Point(int xx, int yy):x(xx), y(yy){}
}point;

bool isZero(double x){
	return (x <= EPS && x >= -EPS);
}
//叉积判断 OB相对 OA方向 如果为正 则 OB在OA逆时针方向 为负在顺时针方向 
int cross(const point &O, const point &A, const point &B){
	int xoa = A.x - O.x;
	int xob = B.x - O.x;
	int yoa = A.y - O.y;
	int yob = B.y - O.y;
	return xoa*yob - xob*yoa;
}

//点积为0,两向量垂直;为正,锐角;为负,钝角。仿照叉积,点积的实现如下: 
int dot(const point &O, const point &A, const point &B){
	int xoa = A.x - O.x;
	int xob = B.x - O.x;
	int yoa = A.y - O.y;
	int yob = B.y - O.y;
	return xoa*xob + yoa*yob;
}

//判断两条线段是否相交 跨立 + 叉积 
bool isInter(point A, point B, point C, point D){
	return max(A.x,B.x) >= min(C.x, D.x)
			&&max(C.x, D.x) >= min(A.x, B.x)
			&&max(A.y, B.y) >= min(C.y, D.y)
			&&max(C.y, D.y) >= min(A.y, B.y)
			&&cross(A,B,C)*cross(A,B,D) <= 0
			&&cross(C,D,A)*cross(C,D,B) <= 0 ; 
}
int main()
	{
		//cout << isZero(1e-7);
		point o(0,0);
		point a(1,1);
		point b(1,3);
		point c(2,1);
		point d(3,5);
//		cout << cross(o,a,b);		
//		cout <<endl << dot(o,a,b);
		cout << isInter(a,b,c,d); 
		return 0;	
	} 

参考 :点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值