2 updates.
[chise/kage.git] / 2d.js
1 // Reference : http://www.cam.hi-ho.ne.jp/strong_warriors/teacher/chapter0{4,5}.html\r
2 \r
3 function point(x, y){\r
4   this.x = x;\r
5   this.y = y;\r
6 }\r
7 \r
8 function getCrossPoint(x11, y11, x12, y12, x21, y21, x22, y22){ // point\r
9   var a1 = y12 - y11;\r
10   var b1 = x11 - x12;\r
11   var c1 = -1 * a1 * x11 - b1 * y11;\r
12   var a2 = y22 - y21;\r
13   var b2 = x21 - x22;\r
14   var c2 = -1 * a2 * x21 - b2 * y21;\r
15   \r
16   var temp = b1 * a2 - b2 * a1;\r
17   if(temp == 0){ // parallel\r
18     return false;\r
19   }\r
20   return new point((c1 * b2 - c2 * b1) / temp, (a1 * c2 - a2 * c1) / temp);\r
21 }\r
22 \r
23 function isCross(x11, y11, x12, y12, x21, y21, x22, y22){ // boolean\r
24   var temp = getCrossPoint(x11, y11, x12, y12, x21, y21, x22, y22);\r
25   if(!temp){ return false; }\r
26   if(x11 < x12 && (temp.x < x11 || x12 < temp.x) ||\r
27      x11 > x12 && (temp.x < x12 || x11 < temp.x) ||\r
28      y11 < y12 && (temp.y < y11 || y12 < temp.y) ||\r
29      y11 > y12 && (temp.y < y12 || y11 < temp.y)\r
30      ){\r
31     return false;\r
32   }\r
33   if(x21 < x22 && (temp.x < x21 || x22 < temp.x) ||\r
34      x21 > x22 && (temp.x < x22 || x21 < temp.x) ||\r
35      y21 < y22 && (temp.y < y21 || y22 < temp.y) ||\r
36      y21 > y22 && (temp.y < y22 || y21 < temp.y)\r
37      ){\r
38     return false;\r
39   }\r
40   return true;\r
41 }\r
42 \r
43 function isCrossBox(x1, y1, x2, y2, bx1, by1, bx2, by2){ // boolean\r
44   if(isCross(x1, y1, x2, y2, bx1, by1, bx2, by1)){ return true; }\r
45   if(isCross(x1, y1, x2, y2, bx2, by1, bx2, by2)){ return true; }\r
46   if(isCross(x1, y1, x2, y2, bx1, by2, bx2, by2)){ return true; }\r
47   if(isCross(x1, y1, x2, y2, bx1, by1, bx1, by2)){ return true; }\r
48   return false;\r
49 }\r
50 \r
51 function isCrossBoxWithOthers(strokesArray, i, bx1, by1, bx2, by2){ // boolean\r
52   for(var j = 0; j < strokesArray.length; j++){\r
53     if(i == j){ continue; }\r
54     switch(strokesArray[j][0]){\r
55     case 0:\r
56     case 8:\r
57     case 9:\r
58       break;\r
59     case 6:\r
60     case 7:\r
61       if(isCrossBox(strokesArray[j][7],\r
62                     strokesArray[j][8],\r
63                     strokesArray[j][9],\r
64                     strokesArray[j][10],\r
65                     bx1, by1, bx2, by2)){\r
66         return true;\r
67       }\r
68     case 2:\r
69     case 12:\r
70     case 3:\r
71       if(isCrossBox(strokesArray[j][5],\r
72                     strokesArray[j][6],\r
73                     strokesArray[j][7],\r
74                     strokesArray[j][8],\r
75                     bx1, by1, bx2, by2)){\r
76         return true;\r
77       }\r
78     default:\r
79       if(isCrossBox(strokesArray[j][3],\r
80                     strokesArray[j][4],\r
81                     strokesArray[j][5],\r
82                     strokesArray[j][6],\r
83                     bx1, by1, bx2, by2)){\r
84         return true;\r
85       }\r
86     }\r
87   }\r
88   return false;\r
89 }\r
90 \r
91 function isCrossWithOthers(strokesArray, i, bx1, by1, bx2, by2){ // boolean\r
92   for(var j = 0; j < strokesArray.length; j++){\r
93     if(i == j){ continue; }\r
94     switch(strokesArray[j][0]){\r
95     case 0:\r
96     case 8:\r
97     case 9:\r
98       break;\r
99     case 6:\r
100     case 7:\r
101       if(isCross(strokesArray[j][7],\r
102                  strokesArray[j][8],\r
103                  strokesArray[j][9],\r
104                  strokesArray[j][10],\r
105                  bx1, by1, bx2, by2)){\r
106         return true;\r
107       }\r
108     case 2:\r
109     case 12:\r
110     case 3:\r
111       if(isCross(strokesArray[j][5],\r
112                  strokesArray[j][6],\r
113                  strokesArray[j][7],\r
114                  strokesArray[j][8],\r
115                  bx1, by1, bx2, by2)){\r
116         return true;\r
117       }\r
118     default:\r
119       if(isCross(strokesArray[j][3],\r
120                  strokesArray[j][4],\r
121                  strokesArray[j][5],\r
122                  strokesArray[j][6],\r
123                  bx1, by1, bx2, by2)){\r
124         return true;\r
125       }\r
126     }\r
127   }\r
128   return false;\r
129 }\r