1
+
2
+ window . onload = function ( ) {
3
+ var canvas = document . getElementById ( "canvas" ) ,
4
+ context = canvas . getContext ( "2d" ) ,
5
+ width = canvas . width = window . innerWidth ,
6
+ height = canvas . height = window . innerHeight ;
7
+
8
+
9
+
10
+ var star0 = {
11
+ x : 200 ,
12
+ y : 200 ,
13
+ points : [
14
+ { x : 0 , y : 0 } ,
15
+ { x : 0 , y : 0 } ,
16
+ { x : 0 , y : 0 } ,
17
+ { x : 0 , y : 0 } ,
18
+ { x : 0 , y : 0 } ,
19
+ { x : 0 , y : 0 } ,
20
+ { x : 0 , y : 0 } ,
21
+ { x : 0 , y : 0 } ,
22
+ { x : 0 , y : 0 } ,
23
+ { x : 0 , y : 0 }
24
+ ] ,
25
+ offset : [
26
+ { x : 100 , y : 0 } ,
27
+ { x : 40 , y : 29 } ,
28
+ { x : 31 , y : 95 } ,
29
+ { x : - 15 , y : 48 } ,
30
+ { x : - 81 , y : 59 } ,
31
+ { x : - 50 , y : 0 } ,
32
+ { x : - 81 , y : - 59 } ,
33
+ { x : - 15 , y : - 48 } ,
34
+ { x : 31 , y : - 95 } ,
35
+ { x : 40 , y : - 29 }
36
+ ]
37
+ } ;
38
+ var star1 = {
39
+ x : 600 ,
40
+ y : 500 ,
41
+ points : [
42
+ { x : 0 , y : 0 } ,
43
+ { x : 0 , y : 0 } ,
44
+ { x : 0 , y : 0 } ,
45
+ { x : 0 , y : 0 } ,
46
+ { x : 0 , y : 0 } ,
47
+ { x : 0 , y : 0 } ,
48
+ { x : 0 , y : 0 } ,
49
+ { x : 0 , y : 0 } ,
50
+ { x : 0 , y : 0 } ,
51
+ { x : 0 , y : 0 }
52
+ ] ,
53
+ offset : [
54
+ { x : 100 , y : 0 } ,
55
+ { x : 40 , y : 29 } ,
56
+ { x : 31 , y : 95 } ,
57
+ { x : - 15 , y : 48 } ,
58
+ { x : - 81 , y : 59 } ,
59
+ { x : - 50 , y : 0 } ,
60
+ { x : - 81 , y : - 59 } ,
61
+ { x : - 15 , y : - 48 } ,
62
+ { x : 31 , y : - 95 } ,
63
+ { x : 40 , y : - 29 }
64
+ ]
65
+ } ;
66
+
67
+ document . body . addEventListener ( "mousemove" , function ( event ) {
68
+ context . clearRect ( 0 , 0 , width , height ) ;
69
+ star0 . x = event . clientX ;
70
+ star0 . y = event . clientY ;
71
+ updateStar ( star0 ) ;
72
+ updateStar ( star1 ) ;
73
+ if ( checkStarCollision ( star0 , star1 ) ) {
74
+ context . fillStyle = "red" ;
75
+ }
76
+ else {
77
+ context . fillStyle = "black" ;
78
+ }
79
+ drawStar ( star0 ) ;
80
+ drawStar ( star1 ) ;
81
+ } ) ;
82
+
83
+ function checkStarCollision ( starA , starB ) {
84
+ for ( var i = 0 ; i < starA . points . length ; i ++ ) {
85
+ var p0 = starA . points [ i ] ,
86
+ p1 = starA . points [ ( i + 1 ) % starA . points . length ] ;
87
+
88
+ for ( var j = 0 ; j < starB . points . length ; j ++ ) {
89
+ var p2 = starB . points [ j ] ,
90
+ p3 = starB . points [ ( j + 1 ) % starB . points . length ] ;
91
+
92
+ if ( segmentIntersect ( p0 , p1 , p2 , p3 ) ) {
93
+ return true ;
94
+ }
95
+ }
96
+ }
97
+ return false ;
98
+ }
99
+
100
+
101
+ function updateStar ( star ) {
102
+ for ( var i = 0 ; i < star . points . length ; i ++ ) {
103
+ star . points [ i ] . x = star . x + star . offset [ i ] . x ;
104
+ star . points [ i ] . y = star . y + star . offset [ i ] . y ;
105
+ }
106
+ }
107
+
108
+ function drawStar ( star ) {
109
+ context . beginPath ( ) ;
110
+ context . moveTo ( star . points [ 0 ] . x , star . points [ 0 ] . y ) ;
111
+ for ( var i = 1 ; i < star . points . length ; i ++ ) {
112
+ context . lineTo ( star . points [ i ] . x , star . points [ i ] . y ) ;
113
+ }
114
+ context . closePath ( ) ;
115
+ context . fill ( ) ;
116
+ }
117
+
118
+ function segmentIntersect ( p0 , p1 , p2 , p3 ) {
119
+ var A1 = p1 . y - p0 . y ,
120
+ B1 = p0 . x - p1 . x ,
121
+ C1 = A1 * p0 . x + B1 * p0 . y ,
122
+ A2 = p3 . y - p2 . y ,
123
+ B2 = p2 . x - p3 . x ,
124
+ C2 = A2 * p2 . x + B2 * p2 . y ,
125
+ denominator = A1 * B2 - A2 * B1 ;
126
+
127
+ if ( denominator == 0 ) {
128
+ return null ;
129
+ }
130
+
131
+ var intersectX = ( B2 * C1 - B1 * C2 ) / denominator ,
132
+ intersectY = ( A1 * C2 - A2 * C1 ) / denominator ,
133
+ rx0 = ( intersectX - p0 . x ) / ( p1 . x - p0 . x ) ,
134
+ ry0 = ( intersectY - p0 . y ) / ( p1 . y - p0 . y ) ,
135
+ rx1 = ( intersectX - p2 . x ) / ( p3 . x - p2 . x ) ,
136
+ ry1 = ( intersectY - p2 . y ) / ( p3 . y - p2 . y ) ;
137
+
138
+ if ( ( ( rx0 >= 0 && rx0 <= 1 ) || ( ry0 >= 0 && ry0 <= 1 ) ) &&
139
+ ( ( rx1 >= 0 && rx1 <= 1 ) || ( ry1 >= 0 && ry1 <= 1 ) ) ) {
140
+ return {
141
+ x : intersectX ,
142
+ y : intersectY
143
+ } ;
144
+ }
145
+ else {
146
+ return null ;
147
+ }
148
+ }
149
+ } ;
0 commit comments