changed permission on func and added maximum error
made sure that not all functions were public and changed some to private that need not be exposed. also added in maximum error to deal with floating point inaccuracies
This commit is contained in:
+23
-20
@@ -9,7 +9,10 @@ type Rectangle struct {
|
||||
P1, P2, P3, P4 Point
|
||||
}
|
||||
|
||||
func (r Rectangle) IsRect() bool {
|
||||
// maximum error used for floating point math
|
||||
var ɛ = 0.00001
|
||||
|
||||
func (r Rectangle) isRect() bool {
|
||||
// make sure they aren't all just the same point
|
||||
if (r.P1.X == r.P2.X && r.P1.X == r.P3.X && r.P1.X == r.P4.X) &&
|
||||
(r.P1.Y == r.P2.Y && r.P1.Y == r.P3.Y && r.P1.Y == r.P4.Y) {
|
||||
@@ -23,39 +26,39 @@ func (r Rectangle) IsRect() bool {
|
||||
dd2 := math.Sqrt(math.Abs(cx-r.P2.X)) + math.Sqrt(math.Abs(cy-r.P2.Y))
|
||||
dd3 := math.Sqrt(math.Abs(cx-r.P3.X)) + math.Sqrt(math.Abs(cy-r.P3.Y))
|
||||
dd4 := math.Sqrt(math.Abs(cx-r.P4.X)) + math.Sqrt(math.Abs(cy-r.P4.Y))
|
||||
return dd1 == dd2 && dd1 == dd3 && dd1 == dd4
|
||||
return math.Abs(dd1-dd2) < ɛ && math.Abs(dd1-dd3) < ɛ && math.Abs(dd1-dd4) < ɛ
|
||||
}
|
||||
|
||||
func (r Rectangle) Neighbors(p Point) (Point, Point) {
|
||||
func (r Rectangle) neighbors(p Point) (Point, Point) {
|
||||
keys := []float64{distance(r.P1, p), distance(r.P2, p), distance(r.P3, p), distance(r.P4, p)}
|
||||
sort.Float64s(keys)
|
||||
n := []Point{}
|
||||
d := distance(r.P1, p)
|
||||
if keys[1] == d || keys[2] == d {
|
||||
if math.Abs(keys[1]-d) < ɛ || math.Abs(keys[2]-d) < ɛ {
|
||||
n = append(n, r.P1)
|
||||
}
|
||||
d = distance(r.P2, p)
|
||||
if keys[1] == d || keys[2] == d {
|
||||
if math.Abs(keys[1]-d) < ɛ || math.Abs(keys[2]-d) < ɛ {
|
||||
n = append(n, r.P2)
|
||||
}
|
||||
d = distance(r.P3, p)
|
||||
if keys[1] == d || keys[2] == d {
|
||||
if math.Abs(keys[1]-d) < ɛ || math.Abs(keys[2]-d) < ɛ {
|
||||
n = append(n, r.P3)
|
||||
}
|
||||
d = distance(r.P4, p)
|
||||
if keys[1] == d || keys[2] == d {
|
||||
if math.Abs(keys[1]-d) < ɛ || math.Abs(keys[2]-d) < ɛ {
|
||||
n = append(n, r.P4)
|
||||
}
|
||||
return n[0], n[1]
|
||||
}
|
||||
|
||||
func (r Rectangle) Size() float64 {
|
||||
n1, n2 := r.Neighbors(r.P1)
|
||||
func (r Rectangle) size() float64 {
|
||||
n1, n2 := r.neighbors(r.P1)
|
||||
return distance(r.P1, n1) * distance(r.P1, n2)
|
||||
}
|
||||
|
||||
func (r Rectangle) inOrder() []Point {
|
||||
n1, n2 := r.Neighbors(r.P1)
|
||||
n1, n2 := r.neighbors(r.P1)
|
||||
accross := &Point{}
|
||||
if r.P2 != n1 || r.P2 != n2 {
|
||||
accross = &r.P2
|
||||
@@ -126,26 +129,26 @@ func Intersection(r1, r2 Rectangle) []Point {
|
||||
}
|
||||
|
||||
func sumOfTri(r Rectangle, p Point) bool {
|
||||
n1, n2 := r.Neighbors(r.P1)
|
||||
n1, n2 := r.neighbors(r.P1)
|
||||
x1, x2 := Point{}, Point{}
|
||||
accross := &Point{}
|
||||
if r.P2 != n1 || r.P2 != n2 {
|
||||
accross = &r.P2
|
||||
x1, x2 = r.Neighbors(r.P2)
|
||||
x1, x2 = r.neighbors(r.P2)
|
||||
}
|
||||
if r.P3 != n1 || r.P3 != n2 {
|
||||
accross = &r.P3
|
||||
x1, x2 = r.Neighbors(r.P3)
|
||||
x1, x2 = r.neighbors(r.P3)
|
||||
}
|
||||
if r.P4 != n1 || r.P4 != n2 {
|
||||
accross = &r.P4
|
||||
x1, x2 = r.Neighbors(r.P4)
|
||||
x1, x2 = r.neighbors(r.P4)
|
||||
}
|
||||
sumTri := SizeTriangle(r.P1, n1, p) +
|
||||
SizeTriangle(r.P1, n2, p) +
|
||||
SizeTriangle(*accross, x1, p) +
|
||||
SizeTriangle(*accross, x2, p)
|
||||
if r.Size() == sumTri {
|
||||
sumTri := sizeTriangle(r.P1, n1, p) +
|
||||
sizeTriangle(r.P1, n2, p) +
|
||||
sizeTriangle(*accross, x1, p) +
|
||||
sizeTriangle(*accross, x2, p)
|
||||
if math.Abs(r.size()-sumTri) < ɛ {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
@@ -153,7 +156,7 @@ func sumOfTri(r Rectangle, p Point) bool {
|
||||
|
||||
// Containment returns whether r2 is contained inside of r1
|
||||
func Containment(r1, r2 Rectangle) bool {
|
||||
if r1.Size() <= r2.Size() {
|
||||
if r1.size() <= r2.size() {
|
||||
return false
|
||||
}
|
||||
if sumOfTri(r1, r2.P1) && sumOfTri(r1, r2.P2) && sumOfTri(r1, r2.P3) && sumOfTri(r1, r2.P4) {
|
||||
|
||||
Reference in New Issue
Block a user