github.com/joshvarga/voronoi@v0.0.0-20180211004454-2fd26fbdfffb/utils/cell.go (about) 1 // Copyright 2013 Przemyslaw Szczepaniak. 2 // MIT License: See https://github.com/gorhill/Javascript-Voronoi/LICENSE.md 3 4 // Author: Przemyslaw Szczepaniak (przeszczep@gmail.com) 5 // Utils for processing voronoi diagrams 6 7 8 package utils 9 10 import ( 11 "github.com/pzsz/voronoi" 12 ) 13 14 // Calculate area of a cell 15 func CellArea(cell *voronoi.Cell) float64 { 16 area := float64(0) 17 for _, halfedge := range cell.Halfedges { 18 s := halfedge.GetStartpoint() 19 e := halfedge.GetEndpoint() 20 area += s.X * e.Y 21 area -= s.Y * e.X 22 } 23 24 return area/2 25 } 26 27 // Calculate centroid of a cell 28 func CellCentroid(cell *voronoi.Cell) voronoi.Vertex { 29 x, y := float64(0), float64(0) 30 for _, halfedge := range cell.Halfedges { 31 s := halfedge.GetStartpoint() 32 e := halfedge.GetEndpoint() 33 v := s.X*e.Y - e.X*s.Y 34 x += (s.X+e.X) * v 35 y += (s.Y+e.Y) * v 36 } 37 v := CellArea(cell) * 6 38 return voronoi.Vertex{x/v, y/v} 39 } 40 41 42 // Calculate centroid of a cell 43 func InsideCell(cell *voronoi.Cell, v voronoi.Vertex) bool { 44 for _, halfedge := range cell.Halfedges { 45 a := halfedge.GetStartpoint() 46 b := halfedge.GetEndpoint() 47 48 cross := ((b.X - a.X)*(v.Y - a.Y) - (b.Y - a.Y)*(v.X - a.X)) 49 50 if cross > 0 { 51 return false 52 } 53 } 54 return true 55 } 56 57 func EdgeIndex(cell *voronoi.Cell, edge *voronoi.Edge) int { 58 for i, halfedge := range cell.Halfedges { 59 if halfedge.Edge == edge { 60 return i 61 } 62 } 63 return -1 64 }