相关文章推荐
func IfPointsInPolygon ( point Point , area [] Point ) bool { // 目标点的x, y坐标 x := point . X y := point . Y // 多边形的点数 count := len ( area ) // 点是否在多边形中 var inInside bool // 浮点类型计算与0的容差 precision := 2e-10 // 依次计算每条边,根据每边两端点和目标点的状态栏判断 for i , j := 0 , count - 1 ; i < count ; j , i = i , i + 1 { // 记录每条边上的两个点坐标 x1 := area [ i ]. X y1 := area [ i ]. Y x2 := area [ j ]. X y2 := area [ j ]. Y // 判断点与多边形顶点是否重合 if ( x1 == x && y1 == y ) || ( x2 == x && y2 == y ) { return true // 判断点是否在水平直线上 if ( y == y1 ) && ( y == y2 ) { return true // 判断线段两端点是否在射线两侧 if ( y > y1 && y < y2 ) || ( y < y1 && y > y2 ) { // 斜率 k := ( x2 - x1 ) / ( y2 - y1 ) // 相交点的 x 坐标 _x := x1 + k * ( y - y1 ) // 点在多边形的边上 if _x == x { return true // 浮点类型计算容差 if math . Abs ( _x - x ) < precision { return true // 射线穿过多边形的边 if _x > x { inInside = ! inInside return inInside func main () { area := [] Point {{ 2 , 1 }, { 8 , 1 }, { 8 , 6 }, { 6 , 6 }, { 6 , 3 }, { 4 , 3 }, { 4 , 5 }, { 2 , 5 }} fmt . Println ( IfPointsInPolygon ( Point { 5 , 4 }, area )) // false fmt . Println ( IfPointsInPolygon ( Point { 6 , 6 }, area )) // true fmt . Println ( IfPointsInPolygon ( Point { 6 , 5 }, area )) // true fmt . Println ( IfPointsInPolygon ( Point { 7 , 4 }, area )) // true fmt . Println ( IfPointsInPolygon ( Point { 8 , 4 }, area )) // true fmt . Println ( IfPointsInPolygon ( Point { 3 , 3 }, area )) // true fmt . Println ( IfPointsInPolygon ( Point { 4 , 3 }, area )) // true fmt . Println ( IfPointsInPolygon ( Point { 2 , 5 }, area )) // true fmt . Println ( IfPointsInPolygon ( Point { 4 , 1 }, area )) // true fmt . Println ( IfPointsInPolygon ( Point { 6 , 1 }, area )) // true fmt . Println ( IfPointsInPolygon ( Point { 4 , 0 }, area )) // false fmt . Println ( IfPointsInPolygon ( Point { 8 , 7 }, area )) // false fmt . Println ( IfPointsInPolygon ( Point { 5 , 4 }, area )) // false fmt . Println ( IfPointsInPolygon ( Point { 8 , 4 }, area )) // true
  • [射线法]判断一个点是否在多边形内部
  •  
    推荐文章