123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- package identicon
- var (
-
- cos = []float64{1, 0, -1, 0}
-
- sin = []float64{0, 1, 0, -1}
- )
- func rotate(points []float64, x, y float64, angle int) {
- if angle > 3 {
- panic("rotate:参数angle必须0,1,2,3三值之一")
- }
- for i := 0; i < len(points); i += 2 {
- px := points[i] - x
- py := points[i+1] - y
- points[i] = px*cos[angle] - py*sin[angle] + x
- points[i+1] = px*sin[angle] + py*cos[angle] + y
- }
- }
- func pointInPolygon(x float64, y float64, points []float64) bool {
- if len(points) < 8 {
- return false
- }
-
-
-
-
-
-
-
- r := 0
- x1, y1 := points[0], points[1]
- prev := (y1 > y) || ((x1 > x) && (y1 == y))
- for i := 2; i < len(points); i += 2 {
- x2, y2 := points[i], points[i+1]
- curr := (y2 > y) || ((x2 > x) && (y2 == y))
- if curr == prev {
- x1, y1 = x2, y2
- continue
- }
- mul := (x1-x)*(y2-y) - (x2-x)*(y1-y)
- if mul > 0 {
- r++
- } else if mul < 0 {
- r--
- }
- x1, y1 = x2, y2
- prev = curr
- }
- return r == 2 || r == -2
- }
|