package utils

// http://ju.outofmemory.cn/entry/130555
func IsPointInPolygon(x float64, y float64, points [][2]float64) bool {
	if len(points) == 0 {
		return false
	}
	count := 0
	x1, y1 := points[0][0], points[0][1]
	x1Part := (y1 > y) || ((x1-x > 0) && (y1 == y))
	var a = [2]float64{x1, y1}
	p := append(points, a)
	for i := range p {
		if i == 0 {
			continue
		}
		point := p[i]
		x2, y2 := point[0], point[1]
		x2Part := (y2 > y) || ((x2 > x) && (y2 == y))
		if x2Part == x1Part {
			x1, y1 = x2, y2
			continue
		}
		mul := (x1-x)*(y2-y) - (x2-x)*(y1-y)
		if mul > 0 {
			count++
		} else {
			if mul < 0 {
				count--
			}
		}
		x1, y1 = x2, y2
		x1Part = x2Part
	}
	return count == 2 || count == -2
}
