@@ -8,20 +8,26 @@ const SPACE_COLOR = [63, 63, 70];
88const BASIS1_COLOR = [ 239 , 68 , 68 ] ;
99const BASIS2_COLOR = [ 34 , 197 , 94 ] ;
1010const GRID_COLOR = [ 3 , 7 , 18 ] ;
11+ const INITIAL_GRID_COLOR = [ 3 , 7 , 18 , 80 ] ;
12+ const HANDLE_COLOR = [ 253 , 224 , 71 ] ;
1113
1214// Values
1315
1416let CANVAS_HAS_CHANGED = true ;
1517let SCALE = 50 ;
1618let BASIS = [ null , null ] ;
17-
19+ let INITIAL_BASIS = [ null , null ] ;
20+ let BASIS_HANDLE_ACTIVE = [ false , false ] ;
21+ let MOUSE_TOLERANCE = 0.2 ;
1822
1923// P5
2024
2125function setup ( ) {
2226 createCanvas ( windowWidth + 200 , windowHeight + 200 , P2D , DOM_CANVAS ) ;
2327 BASIS [ 0 ] = createVector ( 1 , 0 ) ;
2428 BASIS [ 1 ] = createVector ( 0 , 1 ) ;
29+ INITIAL_BASIS [ 0 ] = createVector ( 1 , 0 ) ;
30+ INITIAL_BASIS [ 1 ] = createVector ( 0 , 1 ) ;
2531}
2632
2733function draw ( ) {
@@ -31,10 +37,13 @@ function draw() {
3137
3238 translate ( windowWidth / 2 , windowHeight / 2 ) ;
3339 scale ( 1 , - 1 ) ;
40+ cursor ( ARROW ) ;
3441
3542 background ( SPACE_COLOR ) ;
3643 drawBasisGrid ( BASIS , GRID_COLOR ) ;
44+ drawBasisGrid ( INITIAL_BASIS , INITIAL_GRID_COLOR ) ;
3745 drawBasisArrows ( BASIS ) ;
46+ drawBasisHandles ( BASIS ) ;
3847
3948 CANVAS_HAS_CHANGED = false ;
4049}
@@ -44,6 +53,55 @@ function windowResized() {
4453 CANVAS_HAS_CHANGED = true ;
4554}
4655
56+ function mouseMoved ( ) {
57+ const col = ( mouseX - ( windowWidth / 2 ) ) / SCALE ;
58+ const row = ( ( windowHeight / 2 ) - mouseY ) / SCALE ;
59+
60+ if ( abs ( col - BASIS [ 0 ] . x ) < MOUSE_TOLERANCE &&
61+ abs ( row - BASIS [ 0 ] . y ) < MOUSE_TOLERANCE ) {
62+ BASIS_HANDLE_ACTIVE [ 0 ] = true ;
63+ CANVAS_HAS_CHANGED = true ;
64+ }
65+ else if ( BASIS_HANDLE_ACTIVE [ 0 ] === true ) {
66+ BASIS_HANDLE_ACTIVE [ 0 ] = false ;
67+ CANVAS_HAS_CHANGED = true ;
68+ }
69+
70+ if ( abs ( col - BASIS [ 1 ] . x ) < MOUSE_TOLERANCE &&
71+ abs ( row - BASIS [ 1 ] . y ) < MOUSE_TOLERANCE ) {
72+ BASIS_HANDLE_ACTIVE [ 1 ] = true ;
73+ CANVAS_HAS_CHANGED = true ;
74+ }
75+ else if ( BASIS_HANDLE_ACTIVE [ 1 ] === true ) {
76+ BASIS_HANDLE_ACTIVE [ 1 ] = false ;
77+ CANVAS_HAS_CHANGED = true ;
78+ }
79+ }
80+
81+ function mouseDragged ( ) {
82+ let col = ( mouseX - ( windowWidth / 2 ) ) / SCALE ;
83+ const nearestCol = round ( col ) ;
84+ let row = ( ( windowHeight / 2 ) - mouseY ) / SCALE ;
85+ const nearestRow = round ( row ) ;
86+
87+ if ( abs ( col - nearestCol ) < 0.1 ) {
88+ col = nearestCol ;
89+ }
90+
91+ if ( abs ( row - nearestRow ) < 0.1 ) {
92+ row = nearestRow ;
93+ }
94+
95+ if ( BASIS_HANDLE_ACTIVE [ 0 ] ) {
96+ BASIS [ 0 ] . set ( col , row ) ;
97+ CANVAS_HAS_CHANGED = true ;
98+ }
99+ else if ( BASIS_HANDLE_ACTIVE [ 1 ] ) {
100+ BASIS [ 1 ] . set ( col , row ) ;
101+ CANVAS_HAS_CHANGED = true ;
102+ }
103+ }
104+
47105// Canvas utils
48106
49107function drawBasisArrows ( basis ) {
@@ -107,3 +165,17 @@ function drawBasisGrid(basis, color) {
107165 line ( start . x , start . y , end . x , end . y ) ;
108166 }
109167}
168+
169+ function drawBasisHandles ( basis ) {
170+ stroke ( HANDLE_COLOR ) ;
171+ strokeWeight ( 6 ) ;
172+
173+ if ( BASIS_HANDLE_ACTIVE [ 0 ] ) {
174+ point ( BASIS [ 0 ] . x * SCALE , BASIS [ 0 ] . y * SCALE ) ;
175+ cursor ( HAND ) ;
176+ }
177+ else if ( BASIS_HANDLE_ACTIVE [ 1 ] ) {
178+ point ( BASIS [ 1 ] . x * SCALE , BASIS [ 1 ] . y * SCALE ) ;
179+ cursor ( HAND ) ;
180+ }
181+ }
0 commit comments