1
1
import test from 'tape-catch' ;
2
2
3
- import vtkArrowSource from 'vtk.js/Sources/Filters/Sources/ArrowSource' ;
4
3
import vtkCubeSource from 'vtk.js/Sources/Filters/Sources/CubeSource' ;
5
4
import vtkMath from 'vtk.js/Sources/Common/Core/Math' ;
6
5
import vtkOBBTree from 'vtk.js/Sources/Filters/General/OBBTree' ;
@@ -10,39 +9,30 @@ import vtkTriangleFilter from 'vtk.js/Sources/Filters/General/TriangleFilter';
10
9
11
10
const epsilon = 0.0001 ;
12
11
13
- test ( 'Test OBB tree constructor' , ( t ) => {
14
- const source = vtkArrowSource . newInstance ( ) ;
15
- source . update ( ) ;
16
- const mesh = source . getOutputData ( ) ;
17
-
18
- const obbTree = vtkOBBTree . newInstance ( ) ;
19
- obbTree . setDataset ( mesh ) ;
20
- obbTree . setMaxLevel ( 2 ) ;
21
- obbTree . buildLocator ( ) ;
22
-
23
- const corner = [ 0 , 0 , 0 ] ;
24
- const max = [ 0 , 0 , 0 ] ;
25
- const mid = [ 0 , 0 , 0 ] ;
26
- const min = [ 0 , 0 , 0 ] ;
27
- const size = [ 0 , 0 , 0 ] ;
28
- const computedValues = [ corner , max , mid , min , size ] ;
29
- const expectedValues = [
30
- { name : 'corner' , value : [ - 0.325 , - 0.1 , - 0.0866 ] } ,
31
- { name : 'max' , value : [ 1 , 0 , 0 ] } ,
32
- { name : 'mid' , value : [ 0 , 0 , 0.1732 ] } ,
33
- { name : 'min' , value : [ 0 , 0.2 , 0 ] } ,
34
- { name : 'size' , value : [ 0.0658262 , 0.00126738 , 0.00126738 ] } ,
12
+ function getAllCorners ( startCorner , min , mid , max ) {
13
+ const start2min = vtkMath . add ( startCorner , min , [ ] ) ;
14
+ const start2mid = vtkMath . add ( startCorner , mid , [ ] ) ;
15
+ const start2max = vtkMath . add ( startCorner , max , [ ] ) ;
16
+ const start2min2mid = vtkMath . add ( start2min , mid , [ ] ) ;
17
+ const start2mid2max = vtkMath . add ( start2mid , max , [ ] ) ;
18
+ const start2max2min = vtkMath . add ( start2max , min , [ ] ) ;
19
+ const oppositeCorner = vtkMath . add ( start2min2mid , max , [ ] ) ;
20
+ return [
21
+ [ ...startCorner ] ,
22
+ start2min ,
23
+ start2mid ,
24
+ start2max ,
25
+ start2min2mid ,
26
+ start2mid2max ,
27
+ start2max2min ,
28
+ oppositeCorner ,
35
29
] ;
30
+ }
36
31
37
- obbTree . computeOBBFromDataset ( mesh , corner , max , mid , min , size ) ;
38
-
39
- computedValues . forEach ( ( value , index ) => {
40
- const expected = expectedValues [ index ] ;
41
- t . ok ( vtkMath . areEquals ( value , expected . value , epsilon ) , expected . name ) ;
42
- } ) ;
43
-
44
- t . end ( ) ;
45
- } ) ;
32
+ // does point exist in points, with tolerance
33
+ function hasMatchingPoint ( point , points , eps ) {
34
+ return ! ! points . find ( ( pt ) => vtkMath . areEquals ( point , pt , eps ) ) ;
35
+ }
46
36
47
37
test ( 'Test OBB tree transform' , ( t ) => {
48
38
const source = vtkCubeSource . newInstance ( ) ;
@@ -59,39 +49,44 @@ test('Test OBB tree transform', (t) => {
59
49
const mid = [ 0 , 0 , 0 ] ;
60
50
const min = [ 0 , 0 , 0 ] ;
61
51
const size = [ 0 , 0 , 0 ] ;
62
- const computedValues = [ corner , max , mid , min , size ] ;
63
- obbTree . computeOBBFromDataset ( mesh , corner , max , mid , min , size ) ;
64
52
65
- const expectedValues = [
66
- { name : 'corner' , value : [ - 0.5 , - 0.5 , - 0.5 ] } ,
67
- { name : 'max' , value : [ 0 , 0 , 1 ] } ,
68
- { name : 'mid' , value : [ 1 , 0 , 0 ] } ,
69
- { name : 'min' , value : [ 0 , 1 , 0 ] } ,
70
- { name : 'size' , value : [ 0.13888 , 0.13888 , 0.13888 ] } ,
53
+ const expectedSize = [ 0.13888 , 0.13888 , 0.13888 ] ;
54
+ const expectedCorners = [
55
+ [ - 0.5 , - 0.5 , - 0.5 ] ,
56
+ [ - 0.5 , - 0.5 , 0.5 ] ,
57
+ [ - 0.5 , 0.5 , - 0.5 ] ,
58
+ [ - 0.5 , 0.5 , 0.5 ] ,
59
+ [ 0.5 , - 0.5 , - 0.5 ] ,
60
+ [ 0.5 , - 0.5 , 0.5 ] ,
61
+ [ 0.5 , 0.5 , - 0.5 ] ,
62
+ [ 0.5 , 0.5 , 0.5 ] ,
71
63
] ;
72
- computedValues . forEach ( ( value , index ) => {
73
- const expected = expectedValues [ index ] ;
74
- t . ok ( vtkMath . areEquals ( value , expected . value , epsilon ) , expected . name ) ;
64
+
65
+ obbTree . computeOBBFromDataset ( mesh , corner , max , mid , min , size ) ;
66
+ const allCorners = getAllCorners ( corner , min , mid , max ) ;
67
+
68
+ allCorners . forEach ( ( actual , index ) => {
69
+ t . ok ( hasMatchingPoint ( actual , expectedCorners , epsilon ) , `Corner ${ index } ` ) ;
75
70
} ) ;
71
+ t . ok ( vtkMath . areEquals ( size , expectedSize , epsilon ) , 'size' ) ;
76
72
77
73
const translation = [ 10 , 0 , 0 ] ;
78
74
const transform = vtkMatrixBuilder
79
75
. buildFromRadian ( )
80
76
. translate ( ...translation ) ;
81
77
obbTree . transform ( transform ) ;
82
78
const tree = obbTree . getTree ( ) ;
83
- const translatedComputedValues = [
84
- tree . getCorner ( ) ,
85
- tree . getAxes ( ) [ 0 ] ,
86
- tree . getAxes ( ) [ 1 ] ,
87
- tree . getAxes ( ) [ 2 ] ,
88
- ] ;
89
- expectedValues . pop ( ) ;
90
- vtkMath . add ( expectedValues [ 0 ] . value , translation , expectedValues [ 0 ] . value ) ;
91
79
92
- translatedComputedValues . forEach ( ( value , index ) => {
93
- const expected = expectedValues [ index ] ;
94
- t . ok ( vtkMath . areEquals ( value , expected . value , epsilon ) , expected . name ) ;
80
+ const translatedCorners = getAllCorners ( tree . getCorner ( ) , ...tree . getAxes ( ) ) ;
81
+ const expectedTranslatedCorners = expectedCorners . map ( ( point ) =>
82
+ vtkMath . add ( point , translation , [ ] )
83
+ ) ;
84
+
85
+ translatedCorners . forEach ( ( actual , index ) => {
86
+ t . ok (
87
+ hasMatchingPoint ( actual , expectedTranslatedCorners , epsilon ) ,
88
+ `Corner ${ index } `
89
+ ) ;
95
90
} ) ;
96
91
t . end ( ) ;
97
92
} ) ;
0 commit comments