@@ -4,23 +4,25 @@ import * as utils from "./utils";
4
4
export const moveTree = ( tree , dx = 0 , dy = 0 ) => {
5
5
if ( dx === 0 && dy === 0 ) return ;
6
6
BST . breadthFirstTraverse ( tree , ( item ) => {
7
- item . extras . x += dx ;
8
- item . extras . x += dy ;
7
+ item . extras . dx += dx ;
8
+ item . extras . dy += dy ;
9
+ item . extras . transitioned = false ;
10
+ item . extras . moveMultiplier = 0 ;
9
11
} ) ;
10
12
} ;
11
13
12
14
export const fixCollisions = ( visualizer , node ) => {
13
15
let parent = node . parent ;
14
16
const { padding, radius } = visualizer ;
15
17
while ( parent ) {
16
- if ( node . value > parent . value && node . extras . x <= parent . extras . x ) {
17
- moveTree ( parent . right , ( parent . extras . x - node . extras . x + padding + radius * 2 ) ) ;
18
+ if ( node . value > parent . value && node . extras . dx <= parent . extras . dx ) {
19
+ moveTree ( parent . right , ( parent . extras . dx - node . extras . dx + padding + radius * 2 ) ) ;
18
20
BST . breadthFirstTraverse ( parent . right , ( item ) => {
19
21
fixCollisions ( visualizer , item ) ;
20
22
} ) ;
21
23
break ;
22
- } else if ( node . value < parent . value && node . extras . x >= parent . extras . x ) {
23
- moveTree ( parent . left , - ( node . extras . x - parent . extras . x + padding + radius * 2 ) ) ;
24
+ } else if ( node . value < parent . value && node . extras . dx >= parent . extras . dx ) {
25
+ moveTree ( parent . left , - ( node . extras . dx - parent . extras . dx + padding + radius * 2 ) ) ;
24
26
BST . breadthFirstTraverse ( parent . left , ( item ) => {
25
27
fixCollisions ( visualizer , item ) ;
26
28
} ) ;
@@ -32,11 +34,10 @@ export const fixCollisions = (visualizer, node) => {
32
34
33
35
export const calculateNodePosition = ( visualizer , node , parent ) => {
34
36
const { radius, padding, dimensions } = visualizer ;
35
-
36
37
return parent
37
38
? {
38
- x : parent . extras . x + ( parent . left === node ? - 1 : + 1 ) * ( padding + radius * 2 ) ,
39
- y : parent . extras . y + padding + radius * 2
39
+ x : parent . extras . dx + ( parent . left === node ? - 1 : + 1 ) * ( padding + radius * 2 ) ,
40
+ y : parent . extras . dy + padding + radius * 2
40
41
} : {
41
42
x : 0 ,
42
43
y : - ( dimensions . height / 2 ) + padding + radius
@@ -49,8 +50,15 @@ export const updateNode = (visualizer, node, parent = null) => {
49
50
if ( ! node . extras . initialized ) {
50
51
node . extras . multiplier = 0 ;
51
52
const { x, y} = calculateNodePosition ( visualizer , node , parent ) ;
52
- node . extras . x = x ;
53
- node . extras . y = y ;
53
+
54
+ node . extras . sx = x ;
55
+ node . extras . sy = y ;
56
+ node . extras . x = x ;
57
+ node . extras . y = y ;
58
+ node . extras . dx = x ;
59
+ node . extras . dy = y ;
60
+ node . extras . transitioned = true ;
61
+ node . extras . moveMultiplier = 0 ;
54
62
// TODO: Find a better place to call these 2 functions
55
63
fixCollisions ( visualizer , node ) ;
56
64
utils . updateCameraBounds ( visualizer ) ;
@@ -60,6 +68,26 @@ export const updateNode = (visualizer, node, parent = null) => {
60
68
node . extras . multiplier += 0.06 ;
61
69
if ( node . extras . multiplier > 1 ) node . extras . entered = true ;
62
70
}
71
+
72
+ if ( ! node . extras . transitioned ) {
73
+ const { sx, sy, dx, dy, moveMultiplier } = node . extras ;
74
+ if ( moveMultiplier >= 1 ) {
75
+ node . extras . transitioned = true ;
76
+ node . extras . sx = dx ;
77
+ node . extras . sy = dy ;
78
+ node . extras . x = dx ;
79
+ node . extras . y = dy ;
80
+ node . moveMultiplier = 0 ;
81
+ return ;
82
+ }
83
+ const distance = utils . distance ( sx , dx , sy , dy ) * moveMultiplier ;
84
+ const angle = utils . angle ( dx , sx , dy , sy ) ;
85
+
86
+ node . extras . x = node . extras . sx + distance * Math . cos ( angle ) ;
87
+ node . extras . y = node . extras . sy + distance * Math . sin ( angle ) ;
88
+
89
+ node . extras . moveMultiplier += 0.06 ;
90
+ }
63
91
}
64
92
65
93
updateNode ( visualizer , node . left , node ) ;
0 commit comments