在日常生活工作中,我们经常接触到电子围栏,大部分的电子围栏基本上都是圆形的,想要知道某一个点是否在圆形区域内,算法很简单,只需要知道这个圆形区域的圆心坐标和被测点的坐标的距离是否小于半径即可。两点的距离小于半径,说明被测点在圆形区域内,反之则在圆形区域外。那如果围栏的区域形状不是圆形,而是一个不规则的多边形呢,那我们怎么知道被测点是否在多边形区域内。其实很简单,整体思想如下:
从目标被测点引发一条竖直向上的射线,看这条射线和多边形所有线段的交点数目。如果有奇数个交点,则说明目标点在多边形内部,如果有偶数个交点,则说明目标点在多边形外部。此思路在特殊处理后适用于凸多边形,凹多边形,不规则多边形。但有几个特殊的情况需要处理。
1 当射线与线段的左边顶点相交时,我们认为射线与线段相交。当射线与线段的右边顶点相交时,我们认为射线与线段不相交。如下图所示:
2 当有竖直向上的线段时,我们认为该线段不与射线相交(包括射线和线段重叠的情况)。如:
示列代码如下:
#include <stdio.h>
#include <math.h>
struct Point_t{
double x_value;
double y_value;
};
//给定坐标围成多边形
struct Point_t p_tab[4]={
{10.0, 20.0}, //第0个点
{20.0, 30.0},
{30.0, 20.0},
{20.0, 10.0},
};
//被测点的坐标
s