mirror of
https://bitbucket.org/s_l_teichmann/mtsatellite
synced 2024-11-17 15:48:17 +01:00
Made unit tests for common/coords compiling again. Fixed NaivBigMin. Added bit based BigMin + unit test, which is still failing.
This commit is contained in:
parent
85741f3b0e
commit
234b487077
@ -232,7 +232,7 @@ func NaiveBigMin(minz, maxz, zcode int64) int64 {
|
|||||||
var (
|
var (
|
||||||
c1 = InterleavedToCoord(minz)
|
c1 = InterleavedToCoord(minz)
|
||||||
c2 = InterleavedToCoord(maxz)
|
c2 = InterleavedToCoord(maxz)
|
||||||
cand = minz
|
cand = maxz
|
||||||
c Coord
|
c Coord
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -248,3 +248,56 @@ func NaiveBigMin(minz, maxz, zcode int64) int64 {
|
|||||||
|
|
||||||
return cand
|
return cand
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
bits = 12
|
||||||
|
msb = uint(3*bits - 1)
|
||||||
|
_000_ = 0
|
||||||
|
_001_ = 1
|
||||||
|
_010_ = 2
|
||||||
|
_011_ = 2 | 1
|
||||||
|
_100_ = 4
|
||||||
|
_101_ = 4 | 1
|
||||||
|
mask = int64(0x924924924924924)
|
||||||
|
full = int64(0xfffffffffffffff)
|
||||||
|
)
|
||||||
|
|
||||||
|
func setbits(p uint, v int64) int64 {
|
||||||
|
m := (mask >> (msb - p)) & (^(full << p) & full)
|
||||||
|
return (v | m) & ^(1 << p) & full
|
||||||
|
}
|
||||||
|
|
||||||
|
func unsetbits(p uint, v int64) int64 {
|
||||||
|
m := ^(mask >> (msb - p)) & full
|
||||||
|
return (v & m) | (int64(1) << p)
|
||||||
|
}
|
||||||
|
|
||||||
|
func BigMin(minz, maxz, zcode int64) int64 {
|
||||||
|
bigmin := maxz
|
||||||
|
pos := msb
|
||||||
|
for m := int64(1) << msb; m != 0; m >>= 1 {
|
||||||
|
var v uint16
|
||||||
|
if zcode&m != 0 {
|
||||||
|
v = _100_
|
||||||
|
}
|
||||||
|
if minz&m != 0 {
|
||||||
|
v |= _010_
|
||||||
|
}
|
||||||
|
if maxz&m != 0 {
|
||||||
|
v |= _001_
|
||||||
|
}
|
||||||
|
switch v {
|
||||||
|
case _001_:
|
||||||
|
bigmin = unsetbits(pos, minz)
|
||||||
|
maxz = setbits(pos, maxz)
|
||||||
|
case _011_:
|
||||||
|
return minz
|
||||||
|
case _100_:
|
||||||
|
return bigmin
|
||||||
|
case _101_:
|
||||||
|
minz = unsetbits(pos, minz)
|
||||||
|
}
|
||||||
|
pos--
|
||||||
|
}
|
||||||
|
return bigmin
|
||||||
|
}
|
||||||
|
@ -4,7 +4,11 @@
|
|||||||
|
|
||||||
package common
|
package common
|
||||||
|
|
||||||
import "testing"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math/rand"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
var data = []int16{
|
var data = []int16{
|
||||||
-2045, -1850, -1811, -1629, -1104,
|
-2045, -1850, -1811, -1629, -1104,
|
||||||
@ -138,14 +142,58 @@ func TestTransforms(t *testing.T) {
|
|||||||
checkTransformer(
|
checkTransformer(
|
||||||
"I2P(P2I(plain))",
|
"I2P(P2I(plain))",
|
||||||
CoordToPlain,
|
CoordToPlain,
|
||||||
compose(TransformPlainToInterleaved, TransformInterleavedPlain),
|
compose(TransformPlainToInterleaved, TransformInterleavedToPlain),
|
||||||
c, t)
|
c, t)
|
||||||
})
|
})
|
||||||
allData(func(c Coord) {
|
allData(func(c Coord) {
|
||||||
checkTransformer(
|
checkTransformer(
|
||||||
"P2I(I2P(interleaved))",
|
"P2I(I2P(interleaved))",
|
||||||
CoordToInterleaved,
|
CoordToInterleaved,
|
||||||
compose(TransformInterleavedPlain, TransformPlainToInterleaved),
|
compose(TransformInterleavedToPlain, TransformPlainToInterleaved),
|
||||||
c, t)
|
c, t)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestBigMin(t *testing.T) {
|
||||||
|
const tries = 1
|
||||||
|
errors, success := 0, 0
|
||||||
|
for i := 0; i < tries; i++ {
|
||||||
|
x1 := rand.Intn(4000) - 2000
|
||||||
|
y1 := rand.Intn(4000) - 2000
|
||||||
|
z1 := rand.Intn(4000) - 2000
|
||||||
|
w := rand.Intn(20) + 1
|
||||||
|
h := rand.Intn(20) + 1
|
||||||
|
d := rand.Intn(20) + 1
|
||||||
|
x2 := x1 + w
|
||||||
|
y2 := y1 + h
|
||||||
|
z2 := z1 + d
|
||||||
|
|
||||||
|
c1 := Coord{X: int16(x1), Y: int16(y1), Z: int16(z1)}
|
||||||
|
c2 := Coord{X: int16(x2), Y: int16(y2), Z: int16(z2)}
|
||||||
|
cub := Cuboid{P1: c1, P2: c2}
|
||||||
|
fmt.Printf("Cuboid: %s\n", cub)
|
||||||
|
|
||||||
|
zmin := CoordToInterleaved(c1)
|
||||||
|
zmax := CoordToInterleaved(c2)
|
||||||
|
|
||||||
|
for zcode := zmin + 1; zcode < zmax; zcode++ {
|
||||||
|
c3 := InterleavedToCoord(zcode)
|
||||||
|
if cub.Contains(c3) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
nbm := NaiveBigMin(zmin, zmax, zcode)
|
||||||
|
cbm := BigMin(zmin, zmax, zcode)
|
||||||
|
//fmt.Printf("cbm: %d\n", cbm)
|
||||||
|
//fmt.Printf("nbm: %d\n", nbm)
|
||||||
|
if nbm != cbm {
|
||||||
|
errors++
|
||||||
|
} else {
|
||||||
|
success++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if errors > 0 {
|
||||||
|
t.Errorf("BigMin: %d errors out of %d (%f)\n",
|
||||||
|
errors, errors+success, float64(errors)/float64(errors+success))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user