如何判断一个点和简单多边形的关系(C++代码)

1.声明

此处的简单多边形,是只常见的凸多边形,比如三角形、长方形、五边形、6边形。不包括奇奇怪怪的多边形

2.方法:

常见的有
1.向量叉乘
2.面积法

对于叉乘法的步骤:

3.1.先判断有没有点在多边形的边上

代码如下:

看图,C的位置有如下可能,只有在边上,也就是AC+BC==AB
才满足在边上的情况
在这里插入图片描述

每个vector变量,就存两个坐标:横和纵
bool isOnside(vector<int>& A, vector<int>& B, vector<int>& C)
{
	//先判断该点是否在边上,如果是AC+BC=AB
	// 有一个满足,该点就在边上
	int x1 = C[0] - A[0];
	int y1 = C[1] - A[1];//AC
	int x2 = B[0] - A[0];
	int y2 = B[1] - A[1];//AB
	int x3 = C[0] - B[0];
	int y3 = C[1] - B[1];//BC
	int a = sqrt(pow(x1, 2) + pow(y1, 2));
	int b = sqrt(pow(x3, 2) + pow(y3, 2));
	int c = sqrt(pow(x2, 2) + pow(y2, 2));
	return a + b == c;
}

把目标点和所有的点都遍历一遍就可以知道该点是不是在边上
如果不在边上,再判断是不是在内部或者外部

3.2.通过叉乘的符号是否一致

如图
分别计算
AD x AB
BD x BC
CD x CA
的符号,在图中看来,叉乘的右手准则,因此符号都为负
可以用一个cnt记录为负的个数,
在这里插入图片描述
而对于这种情况而言呢,三个向量的叉积都为正,因此用另一个
flag记录为正的数目
在这里插入图片描述

如果(cnt==n-1 || flag==n-1)
其中n为所有点的个数
if(cnt==n-1 || flag==n-1)
	cout<<"点在多边形内部"<<endl;
else
	cout<<"在外部"<<endl;
int CP(vector<int>& A, vector<int>& B, vector<int>& C)
{
	// AC叉乘AB  ,cross_product
	int x1 = C[0] - A[0];
	int y1 = C[1] - A[1];
	int x2 = B[0] - A[0];
	int y2 = B[1] - A[1];
	return x1 * y2 - x2 * y1;
}

4.完整代码

细节没搞出来,,,但是思路就是这样了
下次想起来再写吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值