go-hep.org/x/hep@v0.38.1/fastjet/internal/delaunay/triangle_test.go (about) 1 // Copyright ©2017 The go-hep Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package delaunay 6 7 import ( 8 "testing" 9 10 "gonum.org/v1/gonum/floats/scalar" 11 ) 12 13 func TestTriangleEquals(t *testing.T) { 14 tests := []struct { 15 a, b *Triangle 16 want bool 17 }{ 18 {NewTriangle(NewPoint(3, 2), NewPoint(0, 0), NewPoint(5, 0)), NewTriangle(NewPoint(3, 2), NewPoint(0, 0), NewPoint(5, 0)), true}, 19 {NewTriangle(NewPoint(3, 2), NewPoint(0, 0), NewPoint(5, 0)), NewTriangle(NewPoint(5, 0), NewPoint(3, 2), NewPoint(0, 0)), true}, 20 {NewTriangle(NewPoint(3, 2), NewPoint(0, 0), NewPoint(5, 0)), NewTriangle(NewPoint(3, 1), NewPoint(0, 0), NewPoint(5, 0)), false}, 21 {NewTriangle(NewPoint(3, 2), NewPoint(0, 0), NewPoint(5, 0)), NewTriangle(NewPoint(5, 0), NewPoint(3, 1), NewPoint(0, 0)), false}, 22 } 23 for i, test := range tests { 24 got := test.a.Equals(test.b) 25 if got != test.want { 26 t.Errorf("Test case %v: %v == %v,\n got = %v, want = %v", i, test.a, test.b, got, test.want) 27 } 28 } 29 } 30 31 func TestTrianglesRemove(t *testing.T) { 32 tests := []struct { 33 triangles triangles 34 toRemove []*Triangle 35 }{ 36 { 37 triangles{NewTriangle(NewPoint(0, 0), NewPoint(0, 1), NewPoint(1, 0)), NewTriangle(NewPoint(0, 0), NewPoint(5, 1), NewPoint(1, 0)), NewTriangle(NewPoint(0, 5), NewPoint(0, 1), NewPoint(1, 0))}, 38 []*Triangle{NewTriangle(NewPoint(0, 0), NewPoint(0, 1), NewPoint(1, 0)), NewTriangle(NewPoint(0, 5), NewPoint(0, 1), NewPoint(1, 0))}, 39 }, 40 } 41 for i, test := range tests { 42 toRemove := make([]*Triangle, len(test.toRemove)) 43 copy(toRemove, test.toRemove) 44 triangles := test.triangles.remove(toRemove...) 45 for _, tri := range triangles { 46 for _, removed := range test.toRemove { 47 if tri.Equals(removed) { 48 t.Errorf("Test case %v: Removed triangle %v still in triangles %v", i, removed, triangles) 49 } 50 } 51 } 52 } 53 } 54 55 func TestTriangleAdd(t *testing.T) { 56 points := []*Point{ 57 NewPoint(0, 0), 58 NewPoint(2, 3), 59 NewPoint(0, 2), 60 NewPoint(5, 5), 61 NewPoint(0.5, -6), 62 } 63 t1 := NewTriangle(points[0], points[1], points[2]) 64 t1.add() 65 t2 := NewTriangle(points[1], points[2], points[3]) 66 t2.add() 67 t3 := NewTriangle(points[0], points[2], points[4]) 68 t3.add() 69 want := []*Point{ 70 points[2], points[2], points[0], points[1], points[0], 71 } 72 var got []*Point 73 for _, p := range points { 74 got = append(got, p.nearest) 75 } 76 for i := range got { 77 if !got[i].Equals(want[i]) { 78 t.Errorf("After adding triangle nearest neighbor of points[%d]=%v, got = %v, want = %v", i, points[i], got[i], want[i]) 79 } 80 } 81 } 82 83 func TestTriangleRemove(t *testing.T) { 84 points := []*Point{ 85 NewPoint(0, 0), 86 NewPoint(2, 3), 87 NewPoint(0, 2), 88 NewPoint(1, 10), 89 } 90 t1 := NewTriangle(points[0], points[1], points[2]) 91 t1.add() 92 t2 := NewTriangle(points[0], points[1], points[3]) 93 t2.add() 94 t1.remove() 95 want := []*Point{ 96 points[1], points[0], nil, points[1], 97 } 98 var got []*Point 99 for _, p := range points { 100 got = append(got, p.nearest) 101 } 102 for i := range got { 103 if !got[i].Equals(want[i]) { 104 t.Errorf("After removing triangle nearest neighbor of points[%d]=%v, got = %v, want = %v", i, points[i], got[i], want[i]) 105 } 106 } 107 } 108 109 func TestTriangleCircumcenter(t *testing.T) { 110 tests := []struct { 111 t *Triangle 112 wantX float64 113 wantY float64 114 }{ 115 {NewTriangle(NewPoint(0, 0), NewPoint(2, 0), NewPoint(0, 2)), 1, 1}, 116 {NewTriangle(NewPoint(-1, 4), NewPoint(3, 8), NewPoint(4, 12)), -5.1667, 12.1667}, 117 {NewTriangle(NewPoint(6, 9), NewPoint(8, 3), NewPoint(5, 15)), 44.5, 18.5}, 118 {NewTriangle(NewPoint(2, 8), NewPoint(3, 7), NewPoint(3, 8)), 2.5, 7.5}, 119 } 120 for _, test := range tests { 121 gotX, gotY := test.t.circumcenter() 122 if !scalar.EqualWithinAbs(gotX, test.wantX, tol) || !scalar.EqualWithinAbs(gotY, test.wantY, tol) { 123 t.Errorf("Circumcenter of %v, got = (%f,%f), want = (%f,%f)", test.t, gotX, gotY, test.wantX, test.wantY) 124 } 125 } 126 }