added context to rectangle

This commit is contained in:
Josh Baker 2016-07-17 17:47:23 -07:00
parent 8904718ccc
commit 4ab2859944
2 changed files with 14 additions and 12 deletions

View File

@ -10,18 +10,20 @@ import (
type Iterator func(item Item) bool
type Item interface {
Rect() (min []float64, max []float64)
Rect(ctx interface{}) (min []float64, max []float64)
}
type RTree struct {
ctx interface{}
tr1 *d1.RTree
tr2 *d2.RTree
tr3 *d3.RTree
tr4 *d4.RTree
}
func New() *RTree {
func New(ctx interface{}) *RTree {
return &RTree{
ctx: ctx,
tr1: d1.NewRTree(),
tr2: d2.NewRTree(),
tr3: d3.NewRTree(),
@ -33,7 +35,7 @@ func (tr *RTree) Insert(item Item) {
if item == nil {
panic("nil item being added to RTree")
}
min, max := item.Rect()
min, max := item.Rect(tr.ctx)
if len(min) != len(max) {
panic("invalid item rectangle")
}
@ -71,7 +73,7 @@ func (tr *RTree) Remove(item Item) {
if item == nil {
panic("nil item being added to RTree")
}
min, max := item.Rect()
min, max := item.Rect(tr.ctx)
if len(min) != len(max) {
panic("invalid item rectangle")
}
@ -117,7 +119,7 @@ func (tr *RTree) Search(bounds Item, iter Iterator) {
if bounds == nil {
panic("nil item being added to RTree")
}
min, max := bounds.Rect()
min, max := bounds.Rect(tr.ctx)
if len(min) != len(max) {
panic("invalid item rectangle")
}

View File

@ -12,12 +12,12 @@ type tRect []float64
func (r *tRect) Arr() []float64 {
return []float64(*r)
}
func (r *tRect) Rect() (min, max []float64) {
func (r *tRect) Rect(ctx interface{}) (min, max []float64) {
return r.Arr()[:len(r.Arr())/2], r.Arr()[len(r.Arr())/2:]
}
func (r *tRect) String() string {
min, max := r.Rect()
min, max := r.Rect(nil)
return fmt.Sprintf("%v,%v", min, max)
}
func tRandRect(dims int) *tRect {
@ -41,7 +41,7 @@ type tPoint struct {
x, y float64
}
func (r *tPoint) Rect() (min, max []float64) {
func (r *tPoint) Rect(ctx interface{}) (min, max []float64) {
return []float64{r.x, r.y}, []float64{r.x, r.y}
}
func tRandPoint() *tPoint {
@ -51,7 +51,7 @@ func tRandPoint() *tPoint {
}
}
func TestRTree(t *testing.T) {
tr := New()
tr := New("hello")
zeroPoint := &tRect{0, 0, 0, 0}
tr.Insert(&tRect{10, 10, 10, 10, 20, 20, 20, 20})
tr.Insert(&tRect{10, 10, 10, 20, 20, 20})
@ -85,7 +85,7 @@ func TestRTree(t *testing.T) {
func TestInsertDelete(t *testing.T) {
rand.Seed(time.Now().UnixNano())
n := 50000
tr := New()
tr := New(nil)
var r2arr []*tRect
for i := 0; i < n; i++ {
r := tRandRect(-1)
@ -120,7 +120,7 @@ func TestInsertDelete(t *testing.T) {
func TestPoints(t *testing.T) {
rand.Seed(time.Now().UnixNano())
n := 25000
tr := New()
tr := New(nil)
var points []*tPoint
for i := 0; i < n; i++ {
r := tRandPoint()
@ -150,7 +150,7 @@ func TestPoints(t *testing.T) {
func BenchmarkInsert(t *testing.B) {
t.StopTimer()
rand.Seed(time.Now().UnixNano())
tr := New()
tr := New(nil)
var points []*tPoint
for i := 0; i < t.N; i++ {
points = append(points, tRandPoint())