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  }