Added buhin(99) drawing mode.
[chise/kage.git] / engine / kagecd.js
1 function cdDrawBezier(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a1, a2){\r
2   var rad, t;\r
3   var x, y, v;\r
4   var ix, iy, ia, ib, ir;\r
5   var tt;\r
6   var delta;\r
7   var deltad;\r
8   var XX, XY, YX, YY;\r
9   var poly, poly2;\r
10   \r
11   if(kage.kShotai == kage.kMincho){ // mincho\r
12     switch(a1){\r
13     case 0:\r
14     case 7:\r
15       delta = -1 * kage.kMinWidthY * 0.5;\r
16       break;\r
17     case 1:\r
18     case 2:\r
19     case 6:\r
20     case 22:\r
21       delta = 0;\r
22       break;\r
23     case 12:\r
24     case 32:\r
25       delta = kage.kMinWidthY;\r
26       break;\r
27     default:\r
28       break;\r
29     }\r
30     \r
31     if(x1 == x2){\r
32       if(y1 < y2){ y1 = y1 - delta; }\r
33       else{ y1 = y1 + delta; }\r
34     }\r
35     else if(y1 == y2){\r
36       if(x1 < x2){ x1 = x1 - delta; }\r
37       else{ x1 = x1 + delta; }\r
38     }\r
39     else{\r
40       rad = Math.atan((y2 - y1) / (x2 - x1));\r
41       if(x1 < x2){ v = 1; } else{ v = -1; }\r
42       x1 = x1 - delta * Math.cos(rad) * v;\r
43       y1 = y1 - delta * Math.sin(rad) * v;\r
44     }\r
45     \r
46     switch(a2){\r
47     case 0:\r
48     case 1:\r
49     case 8:\r
50     case 7:\r
51     case 9:\r
52     case 15:\r
53     case 14:\r
54     case 17:\r
55     case 5:\r
56       delta = 0;\r
57       break;\r
58     default:\r
59       break;\r
60     }\r
61     \r
62     if(x3 == x4){\r
63       if(y3 < y4){ y4 = y4 + delta; }\r
64       else{ y4 = y4 - delta; }\r
65     }\r
66     else if(y3 == y4){\r
67       if(x3 < x4){ x4 = x4 + delta; }\r
68       else{ x4 = x4 - delta; }\r
69     }\r
70     else{\r
71       rad = Math.atan((y4 - y3) / (x4 - x3));\r
72       if(x3 < x4){ v = 1; } else{ v = -1; }\r
73       x4 = x4 + delta * Math.cos(rad) * v;\r
74       y4 = y4 + delta * Math.sin(rad) * v;\r
75     }\r
76     \r
77     poly = new Polygon();\r
78     poly2 = new Polygon();\r
79     for(tt = 0; tt <= 1000; tt = tt + kage.kRate){\r
80       t = (tt) / 1000;\r
81       \r
82       //calculate a dot\r
83       x = (1.0 - t) * (1.0 - t) * (1.0 - t) * x1 + 3.0 * t * (1.0 - t) * (1.0 - t) * x2 + 3 * t * t * (1.0 - t) * x3 + t * t * t * x4;\r
84       y = (1.0 - t) * (1.0 - t) * (1.0 - t) * y1 + 3.0 * t * (1.0 - t) * (1.0 - t) * y2 + 3 * t * t * (1.0 - t) * y3 + t * t * t * y4;\r
85       //KATAMUKI of vector by BIBUN\r
86       ix = t * t * (-3 * x1 + 9 * x2 + -9 * x3 + 3 * x4) + t * (6 * x1 + -12 * x2 + 6 * x3) + -3 * x1 + 3 * x2;\r
87       iy = t * t * (-3 * y1 + 9 * y2 + -9 * y3 + 3 * y4) + t * (6 * y1 + -12 * y2 + 6 * y3) + -3 * y1 + 3 * y2;\r
88       \r
89       //line SUICHOKU by vector\r
90       if(ix != 0 && iy != 0){\r
91         ir = Math.atan(iy / ix * -1);\r
92         ia = Math.sin(ir) * (kage.kMinWidthT);\r
93         ib = Math.cos(ir) * (kage.kMinWidthT);\r
94       }\r
95       else if(ix == 0){\r
96         ia = kage.kMinWidthT;\r
97         ib = 0;\r
98       }\r
99       else{\r
100         ia = 0;\r
101         ib = kage.kMinWidthT;\r
102       }\r
103       \r
104       if(a1 == 7){ deltad = Math.sqrt(t); }\r
105       else if(a2 == 7){ deltad = Math.sqrt(1.0 - t); }\r
106       else{ deltad = 1; }\r
107       ia = ia * deltad;\r
108       ib = ib * deltad;\r
109       \r
110       //reverse if vector is going 2nd/3rd quadrants\r
111       if(ix <= 0){\r
112         ia = ia * -1;\r
113         ib = ib * -1;\r
114       }\r
115       \r
116       //copy to polygon structuer\r
117       poly.push(x - ia, y - ib);\r
118       poly2.push(x + ia, y + ib);\r
119     }\r
120     poly2.reverse();\r
121     poly.concat(poly2);\r
122     polygons.push(poly);\r
123     \r
124     //process for head of stroke\r
125     rad = Math.atan((y2 - y1) / (x2 - x1));\r
126     if(x1 < x2){ v = 1; } else{ v = -1; }\r
127     XX = Math.sin(rad) * v;\r
128     XY = Math.cos(rad) * v * -1;\r
129     YX = Math.cos(rad) * v;\r
130     YY = Math.sin(rad) * v;\r
131     \r
132     if(a1 == 12){\r
133       if(x1 == x2){\r
134         poly = new Polygon();\r
135         poly.push(x1 - kage.kMinWidthT, y1);\r
136         poly.push(x1 + kage.kMinWidthT, y1);\r
137         poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthT);\r
138         polygons.push(poly);\r
139       }\r
140       else{\r
141         poly = new Polygon();\r
142         poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);\r
143         poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);\r
144         poly.push(x1 - kage.kMinWidthT * XX - kage.kMinWidthT * YX, y1 - kage.kMinWidthT * XY - kage.kMinWidthT * YY);\r
145         polygons.push(poly);\r
146       }\r
147     }\r
148     \r
149     if(a1 == 0){\r
150       if(y1 <= y4){ //from up to bottom\r
151         if(x1 == x2){\r
152           poly = new Polygon();\r
153           poly.push(x1 - kage.kMinWidthT, y1);\r
154           poly.push(x1 + kage.kMinWidthT, y1);\r
155           poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);\r
156           polygons.push(poly);\r
157         }\r
158         else{\r
159           poly = new Polygon();\r
160           poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);\r
161           poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);\r
162           poly.push(x1 - kage.kMinWidthT * XX - kage.kMinWidthY * YX, y1 - kage.kMinWidthT * XY - kage.kMinWidthY * YY);\r
163           polygons.push(poly);\r
164         }\r
165       }\r
166       else{ //bottom to up\r
167         if(x1 == x2){ //is it right?\r
168           poly = new Polygon();\r
169           poly.push(x1 - kage.kMinWidthT, y1);\r
170           poly.push(x1 + kage.kMinWidthT, y1);\r
171           poly.push(x1 - kage.kMinWidthT, y1 + kage.kMinWidthY);\r
172           polygons.push(poly);\r
173         }\r
174         else{\r
175           poly = new Polygon();\r
176           poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);\r
177           poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);\r
178           poly.push(x1 + kage.kMinWidthT * XX - kage.kMinWidthY * YX, y1 + kage.kMinWidthT * XY - kage.kMinWidthY * YY);\r
179           polygons.push(poly);\r
180         }\r
181       }\r
182     }\r
183     \r
184     if(a1 == 22){ //box's up-right corner, any time same degree\r
185       poly = new Polygon();\r
186       poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);\r
187       poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);\r
188       poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);\r
189       poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);\r
190       poly.push(x1 - kage.kMinWidthT, y1);\r
191       polygons.push(poly);\r
192     }\r
193     \r
194     if(a1 == 0){ //beginning of the stroke\r
195       if(y1 <= y4){ //from up to bottom\r
196         if(x1 == x2){\r
197           poly = new Polygon();\r
198           poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthY * 0.5);\r
199           poly.push(x1 + kage.kMinWidthT + kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 0.5 + kage.kMinWidthY);\r
200           poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2);\r
201           polygons.push(poly);\r
202         }\r
203         else{\r
204           poly = new Polygon();\r
205           poly.push(x1 + kage.kMinWidthT * XX + (kage.kMinWidthY * 0.5) * YX,\r
206                     y1 + kage.kMinWidthT * XY + (kage.kMinWidthY * 0.5) * YY);\r
207           poly.push(x1 + (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YX,\r
208                     y1 + (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YY);\r
209           poly.push(x1 + kage.kMinWidthT * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YX,\r
210                     y1 + kage.kMinWidthT * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YY);\r
211           polygons.push(poly);\r
212         }\r
213       }\r
214       else{ //from bottom to up\r
215         if(x1 == x2){ //is it right?\r
216           poly = new Polygon();\r
217           poly.push(x1 + kage.kMinWidthT, y1 - kage.kMinWidthY * 0.5);\r
218           poly.push(x1 + kage.kMinWidthT + kage.kMinWidthT * 0.5, y1 - kage.kMinWidthY * 0.5 - kage.kMinWidthY);\r
219           poly.push(x1 + kage.kMinWidthT, y1 - kage.kMinWidthY * 0.5 - kage.kMinWidthY * 2);\r
220           polygons.push(poly);\r
221         }\r
222         else{ //SETSUGOUMEN GA KAKERUNODE HOKYOU\r
223           poly = new Polygon();\r
224           poly.push(x1 - (kage.kMinWidthT - 1) * XX + (kage.kMinWidthY * 0.5) * YX,\r
225                     y1 - (kage.kMinWidthT - 1) * XY + (kage.kMinWidthY * 0.5) * YY);\r
226           poly.push(x1 - (kage.kMinWidthT - 0) * XX + (kage.kMinWidthY * 0.5) * YX,\r
227                     y1 - (kage.kMinWidthT - 0) * XY + (kage.kMinWidthY * 0.5) * YY);\r
228           poly.push(x1 - (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YX,\r
229                     y1 - (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YY);\r
230           poly.push(x1 - (kage.kMinWidthT - 0) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YX,\r
231                     y1 - (kage.kMinWidthT - 0) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YY);\r
232           poly.push(x1 - (kage.kMinWidthT - 1) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YX,\r
233                     y1 - (kage.kMinWidthT - 1) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YY);\r
234           polygons.push(poly);\r
235         }\r
236       }\r
237     }\r
238     \r
239     //process for tail\r
240     rad = Math.atan((y4 - y3) / (x4 - x3));\r
241     if(x3 < x4){ v = 1; } else{ v = -1; }\r
242     YX = Math.sin(rad) * v * -1;\r
243     YY = Math.cos(rad) * v;\r
244     XX = Math.cos(rad) * v;\r
245     XY = Math.sin(rad) * v;\r
246     \r
247     if(a2 == 1 || a2 == 8 || a2 == 15){ //the last filled circle\r
248       if(x3 == x4){\r
249         poly = Polygon();\r
250         poly.push(x4 - kage.kMinWidthT, y4);\r
251         poly.push(x4 - kage.kMinWidthT * 0.6, y4 + kage.kMinWidthT * 0.6);\r
252         poly.push(x4, y4 + kage.kMinWidthT);\r
253         poly.push(x4 + kage.kMinWidthT * 0.6, y4 + kage.kMinWidthT * 0.6);\r
254         poly.push(x4 + kage.kMinWidthT, y4);\r
255         polygons.push(poly);\r
256       }\r
257       else if(y3 == y4){\r
258         poly = new Polygon();\r
259         poly.push(x4, y4 - kage.kMinWidthT);\r
260         poly.push(x4 + kage.kMinWidthT * 0.6, y4 - kage.kMinWidthT * 0.6);\r
261         poly.push(x4 + kage.kMinWidthT, y4);\r
262         poly.push(x4 + kage.kMinWidthT * 0.6, y4 + kage.kMinWidthT * 0.6);\r
263         poly.push(x4, y4 + kage.kMinWidthT);\r
264         polygons.push(poly);\r
265       }\r
266       else{\r
267         poly = new Polygon();\r
268         poly.push(x4 + Math.sin(rad) * kage.kMinWidthT * v, y4 - Math.cos(rad) * kage.kMinWidthT * v);\r
269         poly.push(x4 + Math.cos(rad) * kage.kMinWidthT * 0.8 * v + Math.sin(rad) * kage.kMinWidthT * 0.6 * v,\r
270                   y4 + Math.sin(rad) * kage.kMinWidthT * 0.8 * v - Math.cos(rad) * kage.kMinWidthT * 0.6 * v);\r
271         poly.push(x4 + Math.cos(rad) * kage.kMinWidthT * v, y4 + Math.sin(rad) * kage.kMinWidthT * v);\r
272         poly.push(x4 + Math.cos(rad) * kage.kMinWidthT * 0.8 * v - Math.sin(rad) * kage.kMinWidthT * 0.6 * v,\r
273                   y4 + Math.sin(rad) * kage.kMinWidthT * 0.8 * v + Math.cos(rad) * kage.kMinWidthT * 0.6 * v);\r
274         poly.push(x4 - Math.sin(rad) * kage.kMinWidthT * v, y4 + Math.cos(rad) * kage.kMinWidthT * v);\r
275         polygons.push(poly);\r
276       }\r
277     }\r
278     \r
279     if(a2 == 9 || (a1 == 7 && a2 == 0)){ // Math.sinnyu & L2RD Harai\r
280       if(y3 == y4){\r
281         poly = new Polygon();\r
282         poly.push(x4, y4 + kage.kMinWidthT);\r
283         poly.push(x4, y4 - kage.kMinWidthT);\r
284         poly.push(x4 + kage.kMinWidthT, y4 - kage.kMinWidthT);\r
285         polygons.push(poly);\r
286       }\r
287       else{\r
288         poly = new Polygon();\r
289         poly.push(x4 + kage.kMinWidthT * YX, y4 + kage.kMinWidthT * YY);\r
290         poly.push(x4 - kage.kMinWidthT * YX, y4 - kage.kMinWidthT * YY);\r
291         poly.push(x4 + kage.kMinWidthT * XX - kage.kMinWidthT * YX, y4 + kage.kMinWidthT * XY - kage.kMinWidthT * YY);\r
292         polygons.push(poly);\r
293       }\r
294     }\r
295     \r
296     if(a2 == 15){ //jump up\r
297       if(y3 == y4){\r
298         poly = new Polygon();\r
299         poly.push(x4, y4 - kage.kMinWidthT + 1);\r
300         poly.push(x4 + 2, y4 - kage.kMinWidthT - kage.kWidth * 5);\r
301         poly.push(x4, y4 - kage.kMinWidthT - kage.kWidth * 5);\r
302         poly.push(x4 - kage.kMinWidthT, y4 - kage.kMinWidthT + 1);\r
303         polygons.push(poly);\r
304       }\r
305       else{\r
306         poly = new Polygon();\r
307         poly.push(x4 + (kage.kMinWidthT - 1) * Math.sin(rad) * v, y4 - (kage.kMinWidthT - 1) * Math.cos(rad) * v);\r
308         poly.push(x4 + 2 * Math.cos(rad) * v + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,\r
309                   y4 + 2 * Math.sin(rad) * v - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);\r
310         poly.push(x4 + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,\r
311                   y4 - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);\r
312         poly.push(x4 + (kage.kMinWidthT - 1) * Math.sin(rad) * v - kage.kMinWidthT * Math.cos(rad) * v,\r
313                   y4 - (kage.kMinWidthT - 1) * Math.cos(rad) * v - kage.kMinWidthT * Math.sin(rad) * v);\r
314         polygons.push(poly);\r
315       }\r
316     }\r
317     \r
318     if(a2 == 14){ //jump to left, allways go left\r
319       poly = new Polygon();\r
320       poly.push(x4, y4);\r
321       poly.push(x4, y4 - kage.kMinWidthT);\r
322       poly.push(x4 - kage.kWidth * 4, y4 - kage.kMinWidthT);\r
323       poly.push(x4 - kage.kWidth * 4, y4 - kage.kMinWidthT * 0.5);\r
324       polygons.push(poly);\r
325     }\r
326   }\r
327   else{ //gothic\r
328     if(a1 % 10 == 2){\r
329       if(x1 == x2){\r
330         if(y1 < y2){ y1 = y1 - kage.kWidth; } else{ y1 = y1 + kage.kWidth; }\r
331       }\r
332       else if(y1 == y2){\r
333         if(x1 < x2){ x1 = x1 - kage.kWidth; } else{ x1 = x1 + kage.kWidth; }\r
334         }\r
335       else{\r
336         rad = Math.atan((y2 - y1) / (x2 - x1));\r
337         if(x1 < x2){ v = 1; } else{ v = -1; }\r
338         x1 = x1 - kage.kWidth * Math.cos(rad) * v;\r
339         y1 = y1 - kage.kWidth * Math.sin(rad) * v;\r
340       }\r
341     }\r
342     \r
343     if(a1 % 10 == 3){\r
344       if(x1 == x2){\r
345         if(y1 < y2){\r
346           y1 = y1 - kage.kWidth * kage.kKakato;\r
347         }\r
348         else{\r
349           y1 = y1 + kage.kWidth * kage.kKakato;\r
350         }\r
351       }\r
352       else if(y1 == y2){\r
353         if(x1 < x2){\r
354           x1 = x1 - kage.kWidth * kage.kKakato;\r
355         }\r
356         else{\r
357           x1 = x1 + kage.kWidth * kage.kKakato;\r
358         }\r
359       }\r
360       else{\r
361         rad = Math.atan((y2 - y1) / (x2 - x1));\r
362         if(x1 < x2){ v = 1; } else{ v = -1; }\r
363         x1 = x1 - kage.kWidth * Math.cos(rad) * v * kage.kKakato;\r
364         y1 = y1 - kage.kWidth * Math.sin(rad) * v * kage.kKakato;\r
365       }\r
366     }\r
367     if(a2 % 10 == 2){\r
368       if(x3 == x4){\r
369         if(y3 < y4){ y4 = y4 + kage.kWidth; } else{ y4 = y4 - kage.kWidth; }\r
370       }\r
371       else if(y3 == y4){\r
372         if(x3 < x4){ x4 = x4 + kage.kWidth; } else{ x4 = x4 - kage.kWidth; }\r
373       }\r
374       else{\r
375         rad = Math.atan((y4 - y3) / (x4 - x3));\r
376         if(x3 < x4){ v = 1; } else{ v = -1; }\r
377         x4 = x4 + kage.kWidth * Math.cos(rad) * v;\r
378         y4 = y4 + kage.kWidth * Math.sin(rad) * v;\r
379       }\r
380     }\r
381     \r
382     if(a2 % 10 == 3){\r
383       if(x3 == x4){\r
384         if(y3 < y4){\r
385           y4 = y4 + kage.kWidth * kage.kKakato;\r
386         }\r
387         else{\r
388           y4 = y4 - kage.kWidth * kage.kKakato;\r
389         }\r
390       }\r
391       else if(y3 == y4){\r
392         if(x3 < x4){\r
393           x4 = x4 + kage.kWidth * kage.kKakato;\r
394         }\r
395         else{\r
396           x4 = x4 - kage.kWidth * kage.kKakato;\r
397         }\r
398       }\r
399       else{\r
400         rad = Math.atan((y4 - y3) / (x4 - x3));\r
401         if(x3 < x4){ v = 1; } else{ v = -1; }\r
402           x4 = x4 + kage.kWidth * Math.cos(rad) * v * kage.kKakato;\r
403         y4 = y4 + kage.kWidth * Math.sin(rad) * v * kage.kKakato;\r
404       }\r
405     }\r
406     \r
407     poly = new Polygon();\r
408     poly2= new Polygon();\r
409     \r
410     for(tt = 0; tt <= 1000; tt = tt + kage.kRate){\r
411       t = tt / 1000;\r
412       \r
413       //calculate a dot\r
414       x = (1.0 - t) * (1.0 - t) * (1.0 - t) * x1 + 3.0 * t * (1.0 - t) * (1.0 - t) * x2 + 3 * t * t * (1.0 - t) * x3 + t * t * t * x4;\r
415       y = (1.0 - t) * (1.0 - t) * (1.0 - t) * y1 + 3.0 * t * (1.0 - t) * (1.0 - t) * y2 + 3 * t * t * (1.0 - t) * y3 + t * t * t * y4;\r
416       //KATAMUKI of vector by BIBUN\r
417       ix = t * t * (-3 * x1 + 9 * x2 + -9 * x3 + 3 * x4) + t * (6 * x1 + -12 * x2 + 6 * x3) + -3 * x1 + 3 * x2;\r
418       iy = t * t * (-3 * y1 + 9 * y2 + -9 * y3 + 3 * y4) + t * (6 * y1 + -12 * y2 + 6 * y3) + -3 * y1 + 3 * y2;\r
419       \r
420       //SESSEN NI SUICHOKU NA CHOKUSEN NO KEISAN\r
421       if(kage.kShotai == kage.kMincho){ //always false ?\r
422         if(ix != 0 && iy != 0){\r
423           ir = Math.atan(iy / ix * -1.0);\r
424           ia = Math.sin(ir) * kage.kMinWidthT;\r
425           ib = Math.cos(ir) * kage.kMinWidthT;\r
426         }\r
427         else if(ix == 0){\r
428           ia = kage.kMinWidthT;\r
429           ib = 0;\r
430         }\r
431         else{\r
432           ia = 0;\r
433           ib = kage.kMinWidthT;\r
434         }\r
435         ia = ia * Math.sqrt(1.0 - t);\r
436         ib = ib * Math.sqrt(1.0 - t);\r
437       }\r
438       else{\r
439         if(ix != 0 && iy != 0){\r
440           ir = Math.atan(iy / ix * -1.0);\r
441           ia = Math.sin(ir) * kage.kWidth;\r
442           ib = Math.cos(ir) * kage.kWidth;\r
443         }\r
444         else if(ix == 0){\r
445           ia = kage.kWidth;\r
446           ib = 0;\r
447         }\r
448         else{\r
449           ia = 0;\r
450           ib = kage.kWidth;\r
451         }\r
452       }\r
453       \r
454       //reverse if vector is going 2nd/3rd quadrants\r
455       if(ix <= 0){\r
456         ia = ia * -1;\r
457         ib = ib * -1;\r
458       }\r
459       \r
460       //save to polygon\r
461       poly.push(x - ia, y - ib);\r
462       poly2.push(x + ia, y + ib);\r
463     }\r
464     \r
465     poly2.reverse();\r
466     poly.concat(poly2);\r
467     polygons.push(poly);\r
468   }\r
469 }\r
470 \r
471 function cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a1, a2){\r
472   var rad, t;\r
473   var x, y, v;\r
474   var ix, iy, ia, ib, ir;\r
475   var tt;\r
476   var delta;\r
477   var deltad;\r
478   var XX, XY, YX, YY;\r
479   var poly, poly2;\r
480   \r
481   if(kage.kShotai == kage.kMincho){ // mincho\r
482     switch(a1){\r
483     case 0:\r
484     case 7:\r
485       delta = -1 * kage.kMinWidthY * 0.5;\r
486       break;\r
487     case 1:\r
488     case 2:\r
489     case 6:\r
490     case 22:\r
491       delta = 0;\r
492       break;\r
493     case 12:\r
494     case 32:\r
495       delta = kage.kMinWidthY;\r
496       break;\r
497     default:\r
498       break;\r
499     }\r
500     \r
501     if(x1 == x2){\r
502       if(y1 < y2){ y1 = y1 - delta; }\r
503       else{ y1 = y1 + delta; }\r
504     }\r
505     else if(y1 == y2){\r
506       if(x1 < x2){ x1 = x1 - delta; }\r
507       else{ x1 = x1 + delta; }\r
508     }\r
509     else{\r
510       rad = Math.atan((y2 - y1) / (x2 - x1));\r
511       if(x1 < x2){ v = 1; } else{ v = -1; }\r
512       x1 = x1 - delta * Math.cos(rad) * v;\r
513       y1 = y1 - delta * Math.sin(rad) * v;\r
514     }\r
515     \r
516     switch(a2){\r
517     case 0:\r
518     case 1:\r
519     case 7:\r
520     case 9:\r
521     case 15:\r
522     case 14:\r
523     case 17:\r
524     case 5:\r
525       delta = 0;\r
526       break;\r
527     case 8: // get shorten for tail's circle\r
528       delta = -1 * kage.kMinWidthT * 0.5;\r
529       break;\r
530     default:\r
531       break;\r
532     }\r
533     \r
534     if(x2 == x3){\r
535       if(y2 < y3){ y3 = y3 + delta; }\r
536       else{ y3 = y3 - delta; }\r
537     }\r
538     else if(y2 == y3){\r
539       if(x2 < x3){ x3 = x3 + delta; }\r
540       else{ x3 = x3 - delta; }\r
541     }\r
542     else{\r
543       rad = Math.atan((y3 - y2) / (x3 - x2));\r
544       if(x2 < x3){ v = 1; } else{ v = -1; }\r
545       x3 = x3 + delta * Math.cos(rad) * v;\r
546       y3 = y3 + delta * Math.sin(rad) * v;\r
547     }\r
548     \r
549     poly = new Polygon();\r
550     poly2 = new Polygon();\r
551     \r
552     for(tt = 0; tt <= 1000; tt = tt + kage.kRate){\r
553       t = tt / 1000;\r
554       \r
555       //calculate a dot\r
556       x = ((1.0 - t) * (1.0 - t) * x1 + 2.0 * t * (1.0 - t) * x2 + t * t * x3);\r
557       y = ((1.0 - t) * (1.0 - t) * y1 + 2.0 * t * (1.0 - t) * y2 + t * t * y3);\r
558       \r
559       //KATAMUKI of vector by BIBUN\r
560       ix = (x1 - 2.0 * x2 + x3) * 2.0 * t + (-2.0 * x1 + 2.0 * x2);\r
561       iy = (y1 - 2.0 * y2 + y3) * 2.0 * t + (-2.0 * y1 + 2.0 * y2);\r
562       \r
563       //line SUICHOKU by vector\r
564       if(ix != 0 && iy != 0){\r
565         ir = Math.atan(iy / ix * -1);\r
566         ia = Math.sin(ir) * (kage.kMinWidthT);\r
567         ib = Math.cos(ir) * (kage.kMinWidthT);\r
568       }\r
569       else if(ix == 0){\r
570         ia = kage.kMinWidthT;\r
571         ib = 0;\r
572       }\r
573       else{\r
574         ia = 0;\r
575         ib = kage.kMinWidthT;\r
576       }\r
577       \r
578       if(a1 == 7 && a2 == 0){ deltad = Math.sqrt(t) * kage.kL2RDfatten; } //L2RD: fatten\r
579       else if(a1 == 7){ deltad = Math.sqrt(t); }\r
580       else if(a2 == 7){ deltad = Math.sqrt(1.0 - t); }\r
581       else{ deltad = 1; }\r
582       ia = ia * deltad;\r
583       ib = ib * deltad;\r
584       \r
585       //reverse if vector is going 2nd/3rd quadrants\r
586       if(ix <= 0){\r
587         ia = ia * -1;\r
588         ib = ib * -1;\r
589       }\r
590       \r
591       //copy to polygon structure\r
592       poly.push(x - ia, y - ib);\r
593       poly2.push(x + ia, y + ib);\r
594     }\r
595     \r
596     poly2.reverse();\r
597     poly.concat(poly2);\r
598     polygons.push(poly);\r
599     \r
600     //process for head of stroke\r
601     rad = Math.atan((y2 - y1) / (x2 - x1));\r
602     if(x1 < x2){ v = 1; } else{ v = -1; }\r
603     XX = Math.sin(rad) * v;\r
604     XY = Math.cos(rad) * v * -1;\r
605     YX = Math.cos(rad) * v;\r
606     YY = Math.sin(rad) * v;\r
607     \r
608     if(a1 == 12){\r
609       if(x1 == x2){\r
610         poly= new Polygon();\r
611         poly.push(x1 - kage.kMinWidthT, y1);\r
612         poly.push(x1 + kage.kMinWidthT, y1);\r
613         poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthT);\r
614         polygons.push(poly);\r
615       }\r
616       else{\r
617         poly = new Polygon();\r
618         poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);\r
619         poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);\r
620         poly.push(x1 - kage.kMinWidthT * XX - kage.kMinWidthT * YX, y1 - kage.kMinWidthT * XY - kage.kMinWidthT * YY);\r
621         polygons.push(poly);\r
622       }\r
623     }\r
624     \r
625     if(a1 == 0){\r
626       if(y1 <= y3){ //from up to bottom\r
627         if(x1 == x2){\r
628           poly = new Polygon();\r
629           poly.push(x1 - kage.kMinWidthT, y1);\r
630           poly.push(x1 + kage.kMinWidthT, y1);\r
631           poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);\r
632           polygons.push(poly);\r
633         }\r
634         else{\r
635           poly = new Polygon();\r
636           poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);\r
637           poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);\r
638           poly.push(x1 - kage.kMinWidthT * XX - kage.kMinWidthY * YX, y1 - kage.kMinWidthT * XY - kage.kMinWidthY * YY);\r
639           polygons.push(poly);\r
640         }\r
641       }\r
642       else{ //bottom to up\r
643         if(x1 == x2){ //is it right?\r
644           poly = new Polygon();\r
645           poly.push(x1 - kage.kMinWidthT, y1);\r
646           poly.push(x1 + kage.kMinWidthT, y1);\r
647           poly.push(x1 - kage.kMinWidthT, y1 + kage.kMinWidthY);\r
648           polygons.push(poly);\r
649         }\r
650         else{\r
651           poly = new Polygon();\r
652           poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);\r
653           poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);\r
654           poly.push(x1 + kage.kMinWidthT * XX - kage.kMinWidthY * YX, y1 + kage.kMinWidthT * XY - kage.kMinWidthY * YY);\r
655           polygons.push(poly);\r
656         }\r
657       }\r
658     }\r
659     \r
660     if(a1 == 22){ //box's up-right corner, any time same degree\r
661       poly = new Polygon();\r
662       poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);\r
663       poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);\r
664       poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);\r
665       poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);\r
666       poly.push(x1 - kage.kMinWidthT, y1);\r
667       polygons.push(poly);\r
668     }\r
669     \r
670     if(a1 == 0){ //beginning of the stroke\r
671       if(y1 <= y3){ //from up to bottom\r
672         if(x1 == x2){\r
673           poly = new Polygon();\r
674           poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthY * 0.5);\r
675           poly.push(x1 + kage.kMinWidthT + kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 0.5 + kage.kMinWidthY);\r
676           poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2);\r
677           polygons.push(poly);\r
678         }\r
679         else{\r
680           poly = new Polygon();\r
681           poly.push(x1 + kage.kMinWidthT * XX + (kage.kMinWidthY * 0.5) * YX,\r
682                     y1 + kage.kMinWidthT * XY + (kage.kMinWidthY * 0.5) * YY);\r
683           poly.push(x1 + (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YX,\r
684                     y1 + (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YY);\r
685           poly.push(x1 + kage.kMinWidthT * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YX,\r
686                     y1 + kage.kMinWidthT * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YY);\r
687           polygons.push(poly);\r
688         }\r
689       }\r
690       else{ //from bottom to up\r
691         if(x1 == x2){ //is it right?\r
692           poly = new Polygon();\r
693           poly.push(x1 + kage.kMinWidthT, poly2[0].Y = y1 - kage.kMinWidthY * 0.5);\r
694           poly.push(x1 + kage.kMinWidthT + kage.kMinWidthT * 0.5, y1 - kage.kMinWidthY * 0.5 - kage.kMinWidthY);\r
695           poly.push(x1 + kage.kMinWidthT, y1 - kage.kMinWidthY * 0.5 - kage.kMinWidthY * 2);\r
696           polygons.push(poly);\r
697         }\r
698         else{ //SETSUGOUMEN GA KAKERUNODE HOKYOU\r
699           poly = new Polygon();\r
700           poly.push(x1 - (kage.kMinWidthT - 1) * XX + (kage.kMinWidthY * 0.5) * YX,\r
701                     y1 - (kage.kMinWidthT - 1) * XY + (kage.kMinWidthY * 0.5) * YY);\r
702           poly.push(x1 - (kage.kMinWidthT - 0) * XX + (kage.kMinWidthY * 0.5) * YX,\r
703                     y1 - (kage.kMinWidthT - 0) * XY + (kage.kMinWidthY * 0.5) * YY);\r
704           poly.push(x1 - (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YX,\r
705                     y1 - (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YY);\r
706           poly.push(x1 - (kage.kMinWidthT - 0) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YX,\r
707                     y1 - (kage.kMinWidthT - 0) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YY);\r
708           poly.push(x1 - (kage.kMinWidthT - 1) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YX,\r
709                     y1 - (kage.kMinWidthT - 1) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YY);\r
710           polygons.push(poly);\r
711         }\r
712       }\r
713     }\r
714     \r
715     //process for tail\r
716     rad = Math.atan((y3 - y2) / (x3 - x2));\r
717     if(x2 < x3){ v = 1; } else{ v = -1; }\r
718     YX = Math.sin(rad) * v * -1;\r
719     YY = Math.cos(rad) * v;\r
720     XX = Math.cos(rad) * v;\r
721     XY = Math.sin(rad) * v;\r
722     \r
723     if(a2 == 1 || a2 == 8 || a2 == 15){ //the last filled circle\r
724       if(x2 == x3){\r
725         poly = new Polygon();\r
726         poly.push(x3 - kage.kMinWidthT, y3);\r
727         poly.push(x3 - kage.kMinWidthT * 0.6, y3 + kage.kMinWidthT * 0.6);\r
728         poly.push(x3, y3 + kage.kMinWidthT);\r
729         poly.push(x3 + kage.kMinWidthT * 0.6, y3 + kage.kMinWidthT * 0.6);\r
730         poly.push(x3 + kage.kMinWidthT, y3);\r
731         polygons.push(poly);\r
732       }\r
733       else if(y2 == y3){\r
734         poly = new Polygon();\r
735         poly.push(x3, y3 - kage.kMinWidthT);\r
736         poly.push(x3 + kage.kMinWidthT * 0.6, y3 - kage.kMinWidthT * 0.6);\r
737         poly.push(x3 + kage.kMinWidthT, y3);\r
738         poly.push(x3 + kage.kMinWidthT * 0.6, y3 + kage.kMinWidthT * 0.6);\r
739         poly.push(x3, y3 + kage.kMinWidthT);\r
740         polygons.push(poly);\r
741       }\r
742       else{\r
743         poly = new Polygon();\r
744         poly.push(x3 + Math.sin(rad) * kage.kMinWidthT * v, y3 - Math.cos(rad) * kage.kMinWidthT * v);\r
745         poly.push(x3 + Math.cos(rad) * kage.kMinWidthT * 0.8 * v + Math.sin(rad) * kage.kMinWidthT * 0.6 * v,\r
746                   y3 + Math.sin(rad) * kage.kMinWidthT * 0.8 * v - Math.cos(rad) * kage.kMinWidthT * 0.6 * v);\r
747         poly.push(x3 + Math.cos(rad) * kage.kMinWidthT * v, y3 + Math.sin(rad) * kage.kMinWidthT * v);\r
748         poly.push(x3 + Math.cos(rad) * kage.kMinWidthT * 0.8 * v - Math.sin(rad) * kage.kMinWidthT * 0.6 * v,\r
749                   y3 + Math.sin(rad) * kage.kMinWidthT * 0.8 * v + Math.cos(rad) * kage.kMinWidthT * 0.6 * v);\r
750         poly.push(x3 - Math.sin(rad) * kage.kMinWidthT * v, y3 + Math.cos(rad) * kage.kMinWidthT * v);\r
751         polygons.push(poly);\r
752       }\r
753     }\r
754     \r
755     if(a2 == 9 || (a1 == 7 && a2 == 0)){ // Math.sinnyu & L2RD Harai\r
756       if(y2 == y3){\r
757         poly = new Polygon();\r
758         poly.push(x3, y3 + kage.kMinWidthT * kage.kL2RDfatten);\r
759         poly.push(x3, y3 - kage.kMinWidthT * kage.kL2RDfatten);\r
760         poly.push(x3 + kage.kMinWidthT * kage.kL2RDfatten, y3 - kage.kMinWidthT * kage.kL2RDfatten);\r
761         polygons.push(poly);\r
762       }\r
763       else{\r
764         poly = new Polygon();\r
765         poly.push(x3 + kage.kMinWidthT * kage.kL2RDfatten * YX, y3 + kage.kMinWidthT * kage.kL2RDfatten * YY);\r
766         poly.push(x3 - kage.kMinWidthT * kage.kL2RDfatten * YX, y3 - kage.kMinWidthT * kage.kL2RDfatten * YY);\r
767         poly.push(x3 + kage.kMinWidthT * kage.kL2RDfatten * XX - kage.kMinWidthT * kage.kL2RDfatten * YX,\r
768                   y3 + kage.kMinWidthT * kage.kL2RDfatten * XY - kage.kMinWidthT * kage.kL2RDfatten * YY);\r
769         polygons.push(poly);\r
770       }\r
771     }\r
772     \r
773     if(a2 == 15){ //jump up\r
774       if(y2 == y3){\r
775         poly = new Polygon();\r
776         poly.push(x3, y3 - kage.kMinWidthT + 1);\r
777         poly.push(x3 + 2, y3 - kage.kMinWidthT - kage.kWidth * 5);\r
778         poly.push(x3, y3 - kage.kMinWidthT - kage.kWidth * 5);\r
779         poly.push(x3 - kage.kMinWidthT, y3 - kage.kMinWidthT + 1);\r
780         polygons.push(poly);\r
781       }\r
782       else{\r
783         poly = new Polygon();\r
784         poly.push(x3 + (kage.kMinWidthT - 1) * Math.sin(rad) * v, y3 - (kage.kMinWidthT - 1) * Math.cos(rad) * v);\r
785         poly.push(x3 + 2 * Math.cos(rad) * v + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,\r
786                   y3 + 2 * Math.sin(rad) * v - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);\r
787         poly.push(x3 + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,\r
788                   y3 - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);\r
789         poly.push(x3 + (kage.kMinWidthT - 1) * Math.sin(rad) * v - kage.kMinWidthT * Math.cos(rad) * v,\r
790                   y3 - (kage.kMinWidthT - 1) * Math.cos(rad) * v - kage.kMinWidthT * Math.sin(rad) * v);\r
791         polygons.push(poly);\r
792       }\r
793     }\r
794     \r
795     if(a2 == 14){ //jump to left, allways go left\r
796       poly = new Polygon();\r
797       poly.push(x3, y3);\r
798       poly.push(x3, y3 - kage.kMinWidthT);\r
799       poly.push(x3 - kage.kWidth * 4, y3 - kage.kMinWidthT);\r
800       poly.push(x3 - kage.kWidth * 4, y3 - kage.kMinWidthT * 0.5);\r
801       polygons.push(poly);\r
802     }\r
803   }\r
804   else{ //gothic\r
805     if(a1 % 10 == 2){\r
806       if(x1 == x2){\r
807         if(y1 < y2){ y1 = y1 - kage.kWidth; } else{ y1 = y1 + kage.kWidth; }\r
808       }\r
809       else if(y1 == y2){\r
810         if(x1 < x2){ x1 = x1 - kage.kWidth; } else{ x1 = x1 + kage.kWidth; }\r
811       }\r
812       else{\r
813         rad = Math.atan((y2 - y1) / (x2 - x1));\r
814         if(x1 < x2){ v = 1; } else{ v = -1; }\r
815         x1 = x1 - kage.kWidth * Math.cos(rad) * v;\r
816         y1 = y1 - kage.kWidth * Math.sin(rad) * v;\r
817       }\r
818     }\r
819     \r
820     if(a1 % 10 == 3){\r
821       if(x1 == x2){\r
822         if(y1 < y2){\r
823           y1 = y1 - kage.kWidth * kage.kKakato;\r
824         }\r
825         else{\r
826           y1 = y1 + kage.kWidth * kage.kKakato;\r
827         }\r
828       }\r
829       else if(y1 == y2){\r
830         if(x1 < x2){\r
831           x1 = x1 - kage.kWidth * kage.kKakato;\r
832         }\r
833         else{\r
834           x1 = x1 + kage.kWidth * kage.kKakato;\r
835         }\r
836       }\r
837       else{\r
838         rad = Math.atan((y2 - y1) / (x2 - x1));\r
839         if(x1 < x2){ v = 1; } else{ v = -1; }\r
840         x1 = x1 - kage.kWidth * Math.cos(rad) * v * kage.kKakato;\r
841         y1 = y1 - kage.kWidth * Math.sin(rad) * v * kage.kKakato;\r
842       }\r
843     }\r
844     if(a2 % 10 == 2){\r
845       if(x2 == x3){\r
846         if(y2 < y3){ y3 = y3 + kage.kWidth; } else{ y3 = y3 - kage.kWidth; }\r
847       }\r
848       else if(y2 == y3){\r
849         if(x2 < x3){ x3 = x3 + kage.kWidth; } else{ x3 = x3 - kage.kWidth; }\r
850       }\r
851       else{\r
852         rad = Math.atan((y3 - y2) / (x3 - x2));\r
853         if(x2 < x3){ v = 1; } else{ v = -1; }\r
854         x3 = x3 + kage.kWidth * Math.cos(rad) * v;\r
855         y3 = y3 + kage.kWidth * Math.sin(rad) * v;\r
856       }\r
857     }\r
858     \r
859     if(a2 % 10 == 3){\r
860       if(x2 == x3){\r
861         if(y2 < y3){\r
862           y3 = y3 + kage.kWidth * kage.kKakato;\r
863         }\r
864         else{\r
865           y3 = y3 - kage.kWidth * kage.kKakato;\r
866         }\r
867       }\r
868       else if(y2 == y3){\r
869         if(x2 < x3){\r
870           x3 = x3 + kage.kWidth * kage.kKakato;\r
871         }\r
872         else{\r
873           x3 = x3 - kage.kWidth * kage.kKakato;\r
874         }\r
875       }\r
876       else{\r
877         rad = Math.atan((y3 - y2) / (x3 - x2));\r
878         if(x2 < x3){ v = 1; } else{ v = -1; }\r
879         x3 = x3 + kage.kWidth * Math.cos(rad) * v * kage.kKakato;\r
880         y3 = y3 + kage.kWidth * Math.sin(rad) * v * kage.kKakato;\r
881       }\r
882     }\r
883     \r
884     poly = new Polygon();\r
885     poly2 = new Polygon();\r
886     \r
887     for(tt = 0; tt <= 1000; tt = tt + kage.kRate){\r
888       t = tt / 1000;\r
889       \r
890       //calculating each point\r
891       x = ((1.0 - t) * (1.0 - t) * x1 + 2.0 * t * (1.0 - t) * x2 + t * t * x3);\r
892       y = ((1.0 - t) * (1.0 - t) * y1 + 2.0 * t * (1.0 - t) * y2 + t * t * y3);\r
893       \r
894       //SESSEN NO KATAMUKI NO KEISAN(BIBUN)\r
895       ix = (x1 - 2.0 * x2 + x3) * 2.0 * t + (-2.0 * x1 + 2.0 * x2);\r
896       iy = (y1 - 2.0 * y2 + y3) * 2.0 * t + (-2.0 * y1 + 2.0 * y2);\r
897       \r
898       //SESSEN NI SUICHOKU NA CHOKUSEN NO KEISAN\r
899       if(kage.kShotai == kage.kMincho){ //always false ?\r
900         if(ix != 0 && iy != 0){\r
901           ir = Math.atan(iy / ix * -1.0);\r
902           ia = Math.sin(ir) * kage.kMinWidthT;\r
903           ib = Math.cos(ir) * kage.kMinWidthT;\r
904         }\r
905         else if(ix == 0){\r
906           ia = kage.kMinWidthT;\r
907           ib = 0;\r
908         }\r
909         else{\r
910           ia = 0;\r
911           ib = kage.kMinWidthT;\r
912         }\r
913         ia = ia * Math.sqrt(1.0 - t);\r
914         ib = ib * Math.sqrt(1.0 - t);\r
915       }\r
916       else{\r
917         if(ix != 0 && iy != 0){\r
918           ir = Math.atan(iy / ix * -1.0);\r
919           ia = Math.sin(ir) * kage.kWidth;\r
920           ib = Math.cos(ir) * kage.kWidth;\r
921         }\r
922         else if(ix == 0){\r
923           ia = kage.kWidth;\r
924           ib = 0;\r
925         }\r
926         else{\r
927           ia = 0;\r
928           ib = kage.kWidth;\r
929         }\r
930       }\r
931       \r
932       //reverse if vector is going 2nd/3rd quadrants\r
933       if(ix <= 0){\r
934         ia = ia * -1;\r
935         ib = ib * -1;\r
936       }\r
937       \r
938       //save to polygon\r
939       poly.push(x - ia, y - ib);\r
940       poly2.push(x + ia, y + ib);\r
941     }\r
942     \r
943     poly2.reverse();\r
944     poly.concat(poly2);\r
945     polygons.push(poly);\r
946   }\r
947 }\r
948 \r
949 function cdDrawLine(kage, polygons, tx1, ty1, tx2, ty2, ta1, ta2){\r
950   var rad;\r
951   var v, x1, y1, x2, y2;\r
952   var a1, a2;\r
953   var XX, XY, YX, YY;\r
954   var poly;\r
955   \r
956   if(kage.kShotai == kage.kMincho){ //mincho\r
957     x1 = tx1;\r
958     y1 = ty1;\r
959     x2 = tx2;\r
960     y2 = ty2;\r
961     a1 = ta1;\r
962     a2 = ta2;\r
963     \r
964     if(x1 == x2){ //if TATE stroke, use y-axis\r
965       poly = new Polygon(4);\r
966       switch(a1){\r
967       case 0:\r
968         poly.set(3, x1 - kage.kMinWidthT, y1 - kage.kMinWidthY / 2);\r
969         poly.set(0, x1 + kage.kMinWidthT, y1 + kage.kMinWidthY / 2);\r
970         break;\r
971       case 1:\r
972       case 6:\r
973       case 22:\r
974         poly.set(3, x1 - kage.kMinWidthT, y1);\r
975         poly.set(0, x1 + kage.kMinWidthT, y1);\r
976         break;\r
977       case 12:\r
978         poly.set(3, x1 - kage.kMinWidthT, y1 - kage.kMinWidthY - kage.kMinWidthT);\r
979         poly.set(0, x1 + kage.kMinWidthT, y1 - kage.kMinWidthY);\r
980         break;\r
981       case 32:\r
982         poly.set(3, x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);\r
983         poly.set(0, x1 + kage.kMinWidthT, y1 - kage.kMinWidthY);\r
984         break;\r
985       }\r
986       \r
987       switch(a2){\r
988       case 0:\r
989         if(a1 == 6){ //KAGI's tail\r
990           poly.set(2, x2 - kage.kMinWidthT, y2);\r
991           poly.set(1, x2 + kage.kMinWidthT, y2);\r
992         }\r
993         else{\r
994           poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kMinWidthT / 2);\r
995           poly.set(1, x2 + kage.kMinWidthT, y2 - kage.kMinWidthT / 2);\r
996         }\r
997         break;\r
998       case 1:\r
999         poly.set(2, x2 - kage.kMinWidthT, y2);\r
1000         poly.set(1, x2 + kage.kMinWidthT, y2);\r
1001         break;\r
1002       case 13:\r
1003         poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kWidth * kage.kKakato + kage.kMinWidthT);\r
1004         poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kWidth * kage.kKakato);\r
1005         break;\r
1006       case 23:\r
1007         poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kWidth * kage.kKakato * 0.5 + kage.kMinWidthT);\r
1008         poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kWidth * kage.kKakato * 0.5);\r
1009         break;\r
1010       case 32:\r
1011         poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kMinWidthY);\r
1012         poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kMinWidthY);\r
1013         break;\r
1014       }\r
1015       \r
1016       polygons.push(poly);\r
1017       \r
1018       if(a1 == 22){ //box's right top corner\r
1019         poly = new Polygon();\r
1020         poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);\r
1021         poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);\r
1022         poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);\r
1023         poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);\r
1024         poly.push(x1 - kage.kMinWidthT, y1);\r
1025         polygons.push(poly);\r
1026       }\r
1027       \r
1028       if(a1 == 0){ //beginning of the stroke\r
1029         poly = new Polygon();\r
1030         poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthY * 0.5);\r
1031         poly.push(x1 + kage.kMinWidthT + kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 0.5 + kage.kMinWidthY);\r
1032         poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2);\r
1033         polygons.push(poly);\r
1034       }\r
1035       \r
1036       if((a1 == 6 && a2 == 0) || a2 == 1){ //KAGI NO YOKO BOU NO SAIGO NO MARU\r
1037         poly = new Polygon();\r
1038         poly.push(x2 - kage.kMinWidthT, y2);\r
1039         poly.push(x2 - kage.kMinWidthT * 0.6, y2 + kage.kMinWidthT * 0.6);\r
1040         poly.push(x2, y2 + kage.kMinWidthT);\r
1041         poly.push(x2 + kage.kMinWidthT * 0.6, y2 + kage.kMinWidthT * 0.6);\r
1042         poly.push(x2 + kage.kMinWidthT, y2);\r
1043         poly.reverse(); // for fill-rule\r
1044         polygons.push(poly);\r
1045       }\r
1046     }\r
1047     else if(y1 == y2){ //if it is YOKO stroke, use x-axis\r
1048       if(a1 == 6){ //if it is KAGI's YOKO stroke, get bold\r
1049         poly = new Polygon();\r
1050         poly.push(x1, y1 - kage.kMinWidthT);\r
1051         poly.push(x2, y2 - kage.kMinWidthT);\r
1052         poly.push(x2, y2 + kage.kMinWidthT);\r
1053         poly.push(x1, y1 + kage.kMinWidthT);\r
1054         polygons.push(poly);\r
1055         \r
1056         if(a2 == 1 || a2 == 0 || a2 == 5){\r
1057           //KAGI NO YOKO BOU NO SAIGO NO MARU\r
1058           poly = new Polygon();\r
1059           poly.push(x2, y2 - kage.kMinWidthT);\r
1060           poly.push(x2 + kage.kMinWidthT * 0.6, y2 - kage.kMinWidthT * 0.6);\r
1061           poly.push(x2 + kage.kMinWidthT, y2);\r
1062           poly.push(x2 + kage.kMinWidthT * 0.6, y2 + kage.kMinWidthT * 0.6);\r
1063           poly.push(x2, y2 + kage.kMinWidthT);\r
1064           polygons.push(poly);\r
1065         }\r
1066         \r
1067         if(a2 == 5){\r
1068           //KAGI NO YOKO BOU NO HANE\r
1069           poly = new Polygon();\r
1070           poly.push(x2, y2 - kage.kMinWidthT + 1);\r
1071           poly.push(x2 + 2, y2 - kage.kMinWidthT - kage.kWidth * 5);\r
1072           poly.push(x2, y2 - kage.kMinWidthT - kage.kWidth * 5);\r
1073           poly.push(x2 - kage.kMinWidthT, y2 - kage.kMinWidthT + 1);\r
1074           poly.reverse(); // for fill-rule\r
1075           polygons.push(poly);\r
1076         }\r
1077       }\r
1078       else{\r
1079         poly = new Polygon(4);\r
1080         switch(a1){\r
1081         case 0:\r
1082           poly.set(0, x1, y1 - kage.kMinWidthY);\r
1083           poly.set(3, x1, y1 + kage.kMinWidthY);\r
1084           break;\r
1085         case 2:\r
1086           poly.set(0, x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);\r
1087           poly.set(3, x1 - kage.kMinWidthT, y1 + kage.kMinWidthY);\r
1088           break;\r
1089         }\r
1090         \r
1091         switch(a2){\r
1092         case 0:\r
1093           poly.set(1, x2, y2 - kage.kMinWidthY);\r
1094           poly.set(2, x2, y2 + kage.kMinWidthY);\r
1095           break;\r
1096         case 2:\r
1097           poly.set(1, x2 + kage.kMinWidthT, y2 - kage.kMinWidthY);\r
1098           poly.set(2, x2 + kage.kMinWidthT, y2 + kage.kMinWidthY);\r
1099         }\r
1100         \r
1101         polygons.push(poly);\r
1102         \r
1103         //UROKO\r
1104         if(a2 == 0){\r
1105           poly = new Polygon();\r
1106           poly.push(x2, y2 - kage.kMinWidthY);\r
1107           poly.push(x2 - 24, y2);\r
1108           poly.push(x2 - 12, y2 - 12);\r
1109           polygons.push(poly);\r
1110         }\r
1111       }\r
1112     }\r
1113     else{ //for others, use x-axis\r
1114       rad = Math.atan((y2 - y1) / (x2 - x1));\r
1115       if((Math.abs(y2 - y1) < Math.abs(x2 - x1)) && (a1 != 6) && (a2 != 6)){ //ASAI KAUDO\r
1116         poly = new Polygon(4);\r
1117         switch(a1){ //must be 0 or 2\r
1118         case 0:\r
1119           poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthY, y1 - Math.cos(rad) * kage.kMinWidthY);\r
1120           poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthY, y1 + Math.cos(rad) * kage.kMinWidthY);\r
1121           break;\r
1122         case 2:\r
1123           poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthY - kage.kMinWidthT * Math.cos(rad),\r
1124                    y1 - Math.cos(rad) * kage.kMinWidthY - kage.kMinWidthT * Math.sin(rad));\r
1125           poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthY - kage.kMinWidthT * Math.cos(rad),\r
1126                    y1 + Math.cos(rad) * kage.kMinWidthY - kage.kMinWidthT * Math.sin(rad));\r
1127           break;\r
1128         }\r
1129         \r
1130         switch(a2){ //must be 0 or 2\r
1131         case 0:\r
1132           poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthY, y2 - Math.cos(rad) * kage.kMinWidthY);\r
1133           poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthY, y2 + Math.cos(rad) * kage.kMinWidthY);\r
1134           break;\r
1135         case 2:\r
1136           poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthY + kage.kMinWidthT * Math.cos(rad),\r
1137                    y2 - Math.cos(rad) * kage.kMinWidthY + kage.kMinWidthT * Math.sin(rad));\r
1138           poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthY + kage.kMinWidthT * Math.cos(rad),\r
1139                    y2 + Math.cos(rad) * kage.kMinWidthY + kage.kMinWidthT * Math.sin(rad));\r
1140         }\r
1141         \r
1142         polygons.push(poly);\r
1143         \r
1144         //UROKO\r
1145         if(a2 == 0){\r
1146           poly = new Polygon();\r
1147           poly.push(x2 + Math.sin(rad) * kage.kMinWidthY, y2 - Math.cos(rad) * kage.kMinWidthY);\r
1148           poly.push(x2 - Math.cos(rad) * 24, y2 - Math.sin(rad) * 24);\r
1149           poly.push(x2 - Math.cos(rad) * 12 + Math.sin(rad) * 12, y2 - Math.sin(rad) * 12 - Math.cos(rad) * 12);\r
1150           polygons.push(poly);\r
1151         }\r
1152       }\r
1153       \r
1154       else{ //KAKUDO GA FUKAI or KAGI NO YOKO BOU\r
1155         if(x1 > x2){ v = -1; } else{ v = 1; }\r
1156         poly = new Polygon(4);\r
1157         switch(a1){\r
1158         case 0:\r
1159           poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.cos(rad) * 0.5 * v,\r
1160                    y1 - Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.sin(rad) * 0.5 * v);\r
1161           poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * 0.5 * v,\r
1162                    y1 + Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * 0.5 * v);\r
1163           break;\r
1164         case 1:\r
1165         case 6:\r
1166         case 22:\r
1167           poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v, y1 - Math.cos(rad) * kage.kMinWidthT * v);\r
1168           poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v, y1 + Math.cos(rad) * kage.kMinWidthT * v);\r
1169           break;\r
1170         case 12:\r
1171           poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * v,\r
1172                    y1 - Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * v);\r
1173           poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v - (kage.kMinWidthT + kage.kMinWidthY) * Math.cos(rad) * v,\r
1174                    y1 + Math.cos(rad) * kage.kMinWidthT * v - (kage.kMinWidthT + kage.kMinWidthY) * Math.sin(rad) * v);\r
1175           break;\r
1176         case 32:\r
1177           poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * v,\r
1178                    y1 - Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * v);\r
1179           poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * v,\r
1180                    y1 + Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * v);\r
1181           break;\r
1182         }\r
1183         \r
1184         switch(a2){\r
1185         case 0:\r
1186           if(a1 == 6){\r
1187             poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);\r
1188             poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);\r
1189           }\r
1190           else{\r
1191             poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthT * 0.5 * Math.cos(rad) * v,\r
1192                      y2 - Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthT * 0.5 * Math.sin(rad) * v);\r
1193             poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthT * 0.5 * Math.cos(rad) * v,\r
1194                      y2 + Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthT * 0.5 * Math.sin(rad) * v);\r
1195           }\r
1196           break;\r
1197         case 1:\r
1198         case 5:\r
1199           poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);\r
1200           poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);\r
1201           break;\r
1202         case 13:\r
1203           poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kWidth * kage.kKakato * Math.cos(rad) * v,\r
1204                    y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kWidth * kage.kKakato * Math.sin(rad) * v);\r
1205           poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v + (kage.kWidth * kage.kKakato + kage.kMinWidthT) * Math.cos(rad) * v,\r
1206                    y2 + Math.cos(rad) * kage.kMinWidthT * v + (kage.kWidth * kage.kKakato + kage.kMinWidthT) * Math.sin(rad) * v);\r
1207           break;\r
1208         case 23:\r
1209           poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kWidth * kage.kKakato * 0.5 * Math.cos(rad) * v,\r
1210                    y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kWidth * kage.kKakato * 0.5 * Math.sin(rad) * v);\r
1211           poly.set(2,\r
1212                    x2 - Math.sin(rad) * kage.kMinWidthT * v + (kage.kWidth * kage.kKakato * 0.5 + kage.kMinWidthT) * Math.cos(rad) * v,\r
1213                    y2 + Math.cos(rad) * kage.kMinWidthT * v + (kage.kWidth * kage.kKakato * 0.5 + kage.kMinWidthT) * Math.sin(rad) * v);\r
1214           break;\r
1215         case 32:\r
1216           poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.cos(rad) * v,\r
1217                    y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.sin(rad) * v);\r
1218           poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.cos(rad) * v,\r
1219                    y2 + Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.sin(rad) * v);\r
1220           break;\r
1221         }\r
1222         \r
1223         polygons.push(poly);\r
1224         \r
1225         if((a1 == 6) && (a2 == 0 || a2 == 5)){ //KAGI NO YOKO BOU NO SAIGO NO MARU\r
1226           poly = new Polygon();\r
1227           poly.push(x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);\r
1228           poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * 0.8 * v + Math.sin(rad) * kage.kMinWidthT * 0.6 * v,\r
1229                     y2 + Math.sin(rad) * kage.kMinWidthT * 0.8 * v - Math.cos(rad) * kage.kMinWidthT * 0.6 * v);\r
1230           poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * v, y2 + Math.sin(rad) * kage.kMinWidthT * v);\r
1231           poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * 0.8 * v - Math.sin(rad) * kage.kMinWidthT * 0.6 * v,\r
1232                     y2 + Math.sin(rad) * kage.kMinWidthT * 0.8 * v + Math.cos(rad) * kage.kMinWidthT * 0.6 * v);\r
1233           poly.push(x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);\r
1234           polygons.push(poly);\r
1235         }\r
1236         \r
1237         if(a1 == 6 && a2 == 5){\r
1238           //KAGI NO YOKO BOU NO HANE\r
1239           poly = new Polygon();\r
1240           poly.push(x2 + (kage.kMinWidthT - 1) * Math.sin(rad) * v, y2 - (kage.kMinWidthT - 1) * Math.cos(rad) * v);\r
1241           poly.push(x2 + 2 * Math.cos(rad) * v + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,\r
1242                     y2 + 2 * Math.sin(rad) * v - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);\r
1243           poly.push(x2 + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,\r
1244                     y2 - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);\r
1245           poly.push(x2 + (kage.kMinWidthT - 1) * Math.sin(rad) * v - kage.kMinWidthT * Math.cos(rad) * v,\r
1246                     y2 - (kage.kMinWidthT - 1) * Math.cos(rad) * v - kage.kMinWidthT * Math.sin(rad) * v);\r
1247           polygons.push(poly);\r
1248         }\r
1249         \r
1250         if(a1 == 22){ //SHIKAKU MIGIUE UROKO NANAME DEMO MASSUGU MUKI\r
1251           poly = new Polygon();\r
1252           poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);\r
1253           poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);\r
1254           poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);\r
1255           poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);\r
1256           poly.push(x1 - kage.kMinWidthT, y1);\r
1257           polygons.push(poly);\r
1258         }\r
1259         \r
1260         XX = Math.sin(rad) * v;\r
1261         XY = Math.cos(rad) * v * -1;\r
1262         YX = Math.cos(rad) * v;\r
1263         YY = Math.sin(rad) * v;\r
1264         \r
1265         if(a1 == 0){ //beginning of the storke\r
1266           poly = new Polygon();\r
1267           poly.push(x1 + kage.kMinWidthT * XX + (kage.kMinWidthY * 0.5) * YX,\r
1268                     y1 + kage.kMinWidthT * XY + (kage.kMinWidthY * 0.5) * YY);\r
1269           poly.push(x1 + (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YX,\r
1270                     y1 + (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YY);\r
1271           poly.push(x1 + kage.kMinWidthT * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YX,\r
1272                     y1 + kage.kMinWidthT * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YY);\r
1273           polygons.push(poly);\r
1274         }\r
1275       }\r
1276     }\r
1277   }\r
1278   else{ //gothic\r
1279     if(tx1 == tx2){ //if TATE stroke, use y-axis\r
1280       if(ty1 > ty2){\r
1281         x1 = tx2;\r
1282         y1 = ty2;\r
1283         x2 = tx1;\r
1284         y2 = ty1;\r
1285         a1 = ta2;\r
1286         a2 = ta1;\r
1287       }\r
1288       else{\r
1289         x1 = tx1;\r
1290         y1 = ty1;\r
1291         x2 = tx2;\r
1292         y2 = ty2;\r
1293         a1 = ta1;\r
1294         a2 = ta2;\r
1295       }\r
1296       \r
1297       if(a1 % 10 == 2){ y1 = y1 - kage.kWidth; }\r
1298       if(a2 % 10 == 2){ y2 = y2 + kage.kWidth; }\r
1299       if(a1 % 10 == 3){ y1 = y1 - kage.kWidth * kage.kKakato; }\r
1300       if(a2 % 10 == 3){ y2 = y2 + kage.kWidth * kage.kKakato; }\r
1301       \r
1302       poly = new Polygon();\r
1303       poly.push(x1 - kage.kWidth, y1);\r
1304       poly.push(x2 - kage.kWidth, y2);\r
1305       poly.push(x2 + kage.kWidth, y2);\r
1306       poly.push(x1 + kage.kWidth, y1);\r
1307       poly.reverse(); // for fill-rule\r
1308       \r
1309       polygons.push(poly);\r
1310     }\r
1311     else if(ty1 == ty2){ //if YOKO stroke, use x-axis\r
1312       if(tx1 > tx2){\r
1313         x1 = tx2;\r
1314         y1 = ty2;\r
1315         x2 = tx1;\r
1316         y2 = ty1;\r
1317         a1 = ta2;\r
1318         a2 = ta1;\r
1319       }\r
1320       else{\r
1321         x1 = tx1;\r
1322         y1 = ty1;\r
1323         x2 = tx2;\r
1324         y2 = ty2;\r
1325         a1 = ta1;\r
1326         a2 = ta2;\r
1327       }\r
1328       if(a1 % 10 == 2){ x1 = x1 - kage.kWidth; }\r
1329       if(a2 % 10 == 2){ x2 = x2 + kage.kWidth; }\r
1330       if(a1 % 10 == 3){ x1 = x1 - kage.kWidth * kage.kKakato; }\r
1331       if(a2 % 10 == 3){ x2 = x2 + kage.kWidth * kage.kKakato; }\r
1332       \r
1333       poly = new Polygon();\r
1334       poly.push(x1, y1 - kage.kWidth);\r
1335       poly.push(x2, y2 - kage.kWidth);\r
1336       poly.push(x2, y2 + kage.kWidth);\r
1337       poly.push(x1, y1 + kage.kWidth);\r
1338       \r
1339       polygons.push(poly);\r
1340     }\r
1341     else{ //for others, use x-axis\r
1342       if(tx1 > tx2){\r
1343         x1 = tx2;\r
1344         y1 = ty2;\r
1345         x2 = tx1;\r
1346         y2 = ty1;\r
1347         a1 = ta2;\r
1348         a2 = ta1;\r
1349       }\r
1350       else{\r
1351         x1 = tx1;\r
1352         y1 = ty1;\r
1353         x2 = tx2;\r
1354         y2 = ty2;\r
1355         a1 = ta1;\r
1356         a2 = ta2;\r
1357       }\r
1358       rad = Math.atan((y2 - y1) / (x2 - x1));\r
1359       if(a1 % 10 == 2){\r
1360         x1 = x1 - kage.kWidth * Math.cos(rad);\r
1361         y1 = y1 - kage.kWidth * Math.sin(rad);\r
1362       }\r
1363       if(a2 % 10 == 2){\r
1364         x2 = x2 + kage.kWidth * Math.cos(rad);\r
1365         y2 = y2 + kage.kWidth * Math.sin(rad);\r
1366       }\r
1367       if(a1 % 10 == 3){\r
1368         x1 = x1 - kage.kWidth * Math.cos(rad) * kage.kKakato;\r
1369         y1 = y1 - kage.kWidth * Math.sin(rad) * kage.kKakato;\r
1370       }\r
1371       if(a2 % 10 == 3){\r
1372         x2 = x2 + kage.kWidth * Math.cos(rad) * kage.kKakato;\r
1373         y2 = y2 + kage.kWidth * Math.sin(rad) * kage.kKakato;\r
1374       }\r
1375       \r
1376       //SUICHOKU NO ICHI ZURASHI HA Math.sin TO Math.cos NO IREKAE + x-axis MAINASU KA\r
1377       poly = new Polygon();\r
1378       poly.push(x1 + Math.sin(rad) * kage.kWidth, y1 - Math.cos(rad) * kage.kWidth);\r
1379       poly.push(x2 + Math.sin(rad) * kage.kWidth, y2 - Math.cos(rad) * kage.kWidth);\r
1380       poly.push(x2 - Math.sin(rad) * kage.kWidth, y2 + Math.cos(rad) * kage.kWidth);\r
1381       poly.push(x1 - Math.sin(rad) * kage.kWidth, y1 + Math.cos(rad) * kage.kWidth);\r
1382       \r
1383       polygons.push(poly);\r
1384     }\r
1385   }\r
1386 }\r