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  }