Unified curve drawing functions(Bezier and Spline).
[chise/kage.git] / engine / kagecd.js
1 function cdDrawCurveU(kage, polygons, x1, y1, sx1, sy1, sx2, sy2, x2, y2, 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   var hosomi;\r
11   \r
12   if(kage.kShotai == kage.kMincho){ // mincho\r
13     switch(a1 % 100){\r
14     case 0:\r
15     case 7:\r
16       delta = -1 * kage.kMinWidthY * 0.5;\r
17       break;\r
18     case 1:\r
19     case 2: // ... must be 32\r
20     case 6:\r
21     case 22:\r
22     case 32: // changed\r
23       delta = 0;\r
24       break;\r
25     case 12:\r
26     //case 32:\r
27       delta = kage.kMinWidthY;\r
28       break;\r
29     default:\r
30       break;\r
31     }\r
32     \r
33     if(x1 == sx1){\r
34       if(y1 < sy1){ y1 = y1 - delta; }\r
35       else{ y1 = y1 + delta; }\r
36     }\r
37     else if(y1 == sy1){\r
38       if(x1 < sx1){ x1 = x1 - delta; }\r
39       else{ x1 = x1 + delta; }\r
40     }\r
41     else{\r
42       rad = Math.atan((sy1 - y1) / (sx1 - x1));\r
43       if(x1 < sx1){ v = 1; } else{ v = -1; }\r
44       x1 = x1 - delta * Math.cos(rad) * v;\r
45       y1 = y1 - delta * Math.sin(rad) * v;\r
46     }\r
47     \r
48     switch(a2 % 100){\r
49     case 0:\r
50     case 1:\r
51     case 7:\r
52     case 9:\r
53     case 15: // it can change to 15->5\r
54     case 14: // it can change to 14->4\r
55     case 17: // no need\r
56     case 5:\r
57       delta = 0;\r
58       break;\r
59     case 8: // get shorten for tail's circle\r
60       delta = -1 * kage.kMinWidthT * 0.5;\r
61       break;\r
62     default:\r
63       break;\r
64     }\r
65     \r
66     if(sx2 == x2){\r
67       if(sy2 < y2){ y2 = y2 + delta; }\r
68       else{ y2 = y2 - delta; }\r
69     }\r
70     else if(sy2 == y2){\r
71       if(sx2 < x2){ x2 = x2 + delta; }\r
72       else{ x2 = x2 - delta; }\r
73     }\r
74     else{\r
75       rad = Math.atan((y2 - sy2) / (x2 - sx2));\r
76       if(sx2 < x2){ v = 1; } else{ v = -1; }\r
77       x2 = x2 + delta * Math.cos(rad) * v;\r
78       y2 = y2 + delta * Math.sin(rad) * v;\r
79     }\r
80     \r
81     hosomi = 0.5;\r
82     if(Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) < 50){\r
83       hosomi += 0.4 * (1 - Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) / 50);\r
84     }\r
85     \r
86     poly = new Polygon();\r
87     poly2 = new Polygon();\r
88     \r
89     for(tt = 0; tt <= 1000; tt = tt + kage.kRate){\r
90       t = tt / 1000;\r
91       \r
92       if(sx1 == sx2 && sy1 == sy2){ // Spline\r
93         //calculate a dot\r
94         x = ((1.0 - t) * (1.0 - t) * x1 + 2.0 * t * (1.0 - t) * sx1 + t * t * x2);\r
95         y = ((1.0 - t) * (1.0 - t) * y1 + 2.0 * t * (1.0 - t) * sy1 + t * t * y2);\r
96         \r
97         //KATAMUKI of vector by BIBUN\r
98         ix = (x1 - 2.0 * sx1 + x2) * 2.0 * t + (-2.0 * x1 + 2.0 * sx1);\r
99         iy = (y1 - 2.0 * sy1 + y2) * 2.0 * t + (-2.0 * y1 + 2.0 * sy1);\r
100       } else { // Bezier\r
101         //calculate a dot\r
102         x = (1.0 - t) * (1.0 - t) * (1.0 - t) * x1 + 3.0 * t * (1.0 - t) * (1.0 - t) * sx1 + 3 * t * t * (1.0 - t) * sx2 + t * t * t * x2;\r
103         y = (1.0 - t) * (1.0 - t) * (1.0 - t) * y1 + 3.0 * t * (1.0 - t) * (1.0 - t) * sy1 + 3 * t * t * (1.0 - t) * sy2 + t * t * t * y2;\r
104         //KATAMUKI of vector by BIBUN\r
105         ix = t * t * (-3 * x1 + 9 * sx1 + -9 * sx2 + 3 * x2) + t * (6 * x1 + -12 * sx1 + 6 * sx2) + -3 * x1 + 3 * sx1;\r
106         iy = t * t * (-3 * y1 + 9 * sy1 + -9 * sy2 + 3 * y2) + t * (6 * y1 + -12 * sy1 + 6 * sy2) + -3 * y1 + 3 * sy1;\r
107       }\r
108       //line SUICHOKU by vector\r
109       if(ix != 0 && iy != 0){\r
110         ir = Math.atan(iy / ix * -1);\r
111         ia = Math.sin(ir) * (kage.kMinWidthT);\r
112         ib = Math.cos(ir) * (kage.kMinWidthT);\r
113       }\r
114       else if(ix == 0){\r
115         ia = kage.kMinWidthT;\r
116         ib = 0;\r
117       }\r
118       else{\r
119         ia = 0;\r
120         ib = kage.kMinWidthT;\r
121       }\r
122       \r
123       if(a1 == 7 && a2 == 0){ // L2RD: fatten\r
124         deltad = Math.pow(t, hosomi) * kage.kL2RDfatten;\r
125       }\r
126       else if(a1 == 7){\r
127         deltad = Math.pow(t, hosomi);\r
128       }\r
129       else if(a2 == 7){\r
130         deltad = Math.pow(1.0 - t, hosomi);\r
131       }\r
132       else{ deltad = 1; }\r
133       \r
134       if(deltad < 0.15){\r
135         deltad = 0.15;\r
136       }\r
137       ia = ia * deltad;\r
138       ib = ib * deltad;\r
139       \r
140       //reverse if vector is going 2nd/3rd quadrants\r
141       if(ix <= 0){\r
142         ia = ia * -1;\r
143         ib = ib * -1;\r
144       }\r
145       \r
146       //copy to polygon structure\r
147       poly.push(x - ia, y - ib);\r
148       poly2.push(x + ia, y + ib);\r
149     }\r
150     \r
151     // suiheisen ni setsuzoku\r
152     if(a1 == 132){\r
153       var index = 0;\r
154       while(true){\r
155         if(poly2.array[index].y <= y1 && y1 <= poly2.array[index + 1].y){\r
156           break;\r
157         }\r
158         index++;\r
159       }\r
160       newx1 = poly2.array[index + 1].x + (poly2.array[index].x - poly2.array[index + 1].x) *\r
161         (poly2.array[index + 1].y - y1) / (poly2.array[index + 1].y - poly2.array[index].y);\r
162       newy1 = y1;\r
163       newx2 = poly.array[0].x + (poly.array[0].x - poly.array[1].x) * (poly.array[0].y - y1) /\r
164         (poly.array[1].y - poly.array[0].y);\r
165       newy2 = y1;\r
166       \r
167       for(var i = 0; i < index; i++){\r
168         poly2.shift();\r
169       }\r
170       poly2.set(0, newx1, newy1);\r
171       poly.unshift(newx2, newy2);\r
172     }\r
173     \r
174     poly2.reverse();\r
175     poly.concat(poly2);\r
176     polygons.push(poly);\r
177     \r
178     //process for head of stroke\r
179     rad = Math.atan((sy1 - y1) / (sx1 - x1));\r
180     if(x1 < sx1){ v = 1; } else{ v = -1; }\r
181     XX = Math.sin(rad) * v;\r
182     XY = Math.cos(rad) * v * -1;\r
183     YX = Math.cos(rad) * v;\r
184     YY = Math.sin(rad) * v;\r
185     \r
186     if(a1 == 12){\r
187       if(x1 == x2){\r
188         poly= new Polygon();\r
189         poly.push(x1 - kage.kMinWidthT, y1);\r
190         poly.push(x1 + kage.kMinWidthT, y1);\r
191         poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthT);\r
192         polygons.push(poly);\r
193       }\r
194       else{\r
195         poly = new Polygon();\r
196         poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);\r
197         poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);\r
198         poly.push(x1 - kage.kMinWidthT * XX - kage.kMinWidthT * YX, y1 - kage.kMinWidthT * XY - kage.kMinWidthT * YY);\r
199         polygons.push(poly);\r
200       }\r
201     }\r
202     \r
203     if(a1 == 0){\r
204       if(y1 <= y2){ //from up to bottom\r
205         if(x1 == sx1){\r
206           poly = new Polygon();\r
207           poly.push(x1 - kage.kMinWidthT, y1);\r
208           poly.push(x1 + kage.kMinWidthT, y1);\r
209           poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);\r
210           polygons.push(poly);\r
211         }\r
212         else{\r
213           poly = new Polygon();\r
214           poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);\r
215           poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);\r
216           poly.push(x1 - kage.kMinWidthT * XX - kage.kMinWidthY * YX, y1 - kage.kMinWidthT * XY - kage.kMinWidthY * YY);\r
217           polygons.push(poly);\r
218         }\r
219       }\r
220       else{ //bottom to up\r
221         if(x1 == sx1){\r
222           poly = new Polygon();\r
223           poly.push(x1 - kage.kMinWidthT, y1);\r
224           poly.push(x1 + kage.kMinWidthT, y1);\r
225           poly.push(x1 + kage.kMinWidthT, y1 - kage.kMinWidthY);\r
226           polygons.push(poly);\r
227         }\r
228         else{\r
229           poly = new Polygon();\r
230           poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);\r
231           poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);\r
232           poly.push(x1 + kage.kMinWidthT * XX - kage.kMinWidthY * YX, y1 + kage.kMinWidthT * XY - kage.kMinWidthY * YY);\r
233           polygons.push(poly);\r
234         }\r
235       }\r
236     }\r
237     \r
238     if(a1 == 22){ //box's up-right corner, any time same degree\r
239       poly = new Polygon();\r
240       poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);\r
241       poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);\r
242       poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);\r
243       poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);\r
244       poly.push(x1, y1 + kage.kMinWidthT);\r
245       polygons.push(poly);\r
246     }\r
247     \r
248     if(a1 == 0){ //beginning of the stroke\r
249       if(y1 <= y2){ //from up to bottom\r
250         if(x1 == sx1){\r
251           poly = new Polygon();\r
252           poly.push(x1 + kage.kMinWidthT, y1);\r
253           poly.push(x1 + kage.kMinWidthT * 1.5, y1 + kage.kMinWidthY);\r
254           poly.push(x1 + kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 3);\r
255           polygons.push(poly);\r
256         }\r
257         else{\r
258           poly = new Polygon();\r
259           poly.push(x1 + kage.kMinWidthT * XX,\r
260                     y1 + kage.kMinWidthT * XY);\r
261           poly.push(x1 + kage.kMinWidthT * 1.5 * XX + kage.kMinWidthY * YX,\r
262                     y1 + kage.kMinWidthT * 1.5 * XY + kage.kMinWidthY * YY);\r
263           poly.push(x1 + kage.kMinWidthT * 0.5 * XX + kage.kMinWidthY * 3 * YX,\r
264                     y1 + kage.kMinWidthT * 0.5 * XY + kage.kMinWidthY * 3 * YY);\r
265           polygons.push(poly);\r
266         }\r
267       }\r
268       else{ //from bottom to up\r
269         if(x1 == sx1){\r
270           poly = new Polygon();\r
271           poly.push(x1 - kage.kMinWidthT, y1);\r
272           poly.push(x1 - kage.kMinWidthT * 1.5, y1 + kage.kMinWidthY);\r
273           poly.push(x1 - kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 3);\r
274           polygons.push(poly);\r
275         }\r
276         else{\r
277           poly = new Polygon();\r
278           poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);\r
279           poly.push(x1 - kage.kMinWidthT * 1.5 * XX + kage.kMinWidthY * YX, y1 + kage.kMinWidthY * YY - kage.kMinWidthT * 1.5 * XY);\r
280           poly.push(x1 - kage.kMinWidthT * 0.5 * XX + kage.kMinWidthY * 3 * YX, y1 + kage.kMinWidthY * 3 * YY - kage.kMinWidthT * 0.5 * XY);\r
281           polygons.push(poly);\r
282         }\r
283       }\r
284     }\r
285     \r
286     //process for tail\r
287     rad = Math.atan((y2 - sy2) / (x2 - sx2));\r
288     if(sx2 < x2){ v = 1; } else{ v = -1; }\r
289     YX = Math.sin(rad) * v * -1;\r
290     YY = Math.cos(rad) * v;\r
291     XX = Math.cos(rad) * v;\r
292     XY = Math.sin(rad) * v;\r
293     \r
294     if(a2 == 1 || a2 == 8 || a2 == 15){ //the last filled circle ... it can change 15->5\r
295       if(sx2 == x2){\r
296         poly = new Polygon();\r
297         poly.push(x2 - kage.kMinWidthT, y2);\r
298         poly.push(x2 - kage.kMinWidthT * 0.7, y2 + kage.kMinWidthT * 0.7);\r
299         poly.push(x2, y2 + kage.kMinWidthT);\r
300         poly.push(x2 + kage.kMinWidthT * 0.7, y2 + kage.kMinWidthT * 0.7);\r
301         poly.push(x2 + kage.kMinWidthT, y2);\r
302         polygons.push(poly);\r
303       }\r
304       else if(sy2 == y2){\r
305         poly = new Polygon();\r
306         poly.push(x2, y2 - kage.kMinWidthT);\r
307         poly.push(x2 + kage.kMinWidthT * 0.7, y2 - kage.kMinWidthT * 0.7);\r
308         poly.push(x2 + kage.kMinWidthT, y2);\r
309         poly.push(x2 + kage.kMinWidthT * 0.7, y2 + kage.kMinWidthT * 0.7);\r
310         poly.push(x2, y2 + kage.kMinWidthT);\r
311         polygons.push(poly);\r
312       }\r
313       else{\r
314         poly = new Polygon();\r
315         poly.push(x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);\r
316         poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * 0.7 * v + Math.sin(rad) * kage.kMinWidthT * 0.7 * v,\r
317                   y2 + Math.sin(rad) * kage.kMinWidthT * 0.7 * v - Math.cos(rad) * kage.kMinWidthT * 0.7 * v);\r
318         poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * v, y2 + Math.sin(rad) * kage.kMinWidthT * v);\r
319         poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * 0.7 * v - Math.sin(rad) * kage.kMinWidthT * 0.7 * v,\r
320                   y2 + Math.sin(rad) * kage.kMinWidthT * 0.7 * v + Math.cos(rad) * kage.kMinWidthT * 0.7 * v);\r
321         poly.push(x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);\r
322         polygons.push(poly);\r
323       }\r
324     }\r
325     \r
326     if(a2 == 9 || (a1 == 7 && a2 == 0)){ // Math.sinnyu & L2RD Harai ... no need for a2=9\r
327       var type = (Math.atan2(Math.abs(y2 - sy2), Math.abs(x2 - sx2)) / Math.PI * 2 - 0.6);\r
328       if(type > 0){\r
329         type = type * 8;\r
330       } else {\r
331         type = type * 3;\r
332       }\r
333       var pm;\r
334       if(type < 0){\r
335         pm = -1;\r
336       } else {\r
337         pm = 1;\r
338       }\r
339       if(sy2 == y2){\r
340         poly = new Polygon();\r
341         poly.push(x2, y2 + kage.kMinWidthT * kage.kL2RDfatten);\r
342         poly.push(x2, y2 - kage.kMinWidthT * kage.kL2RDfatten);\r
343         poly.push(x2 + kage.kMinWidthT * kage.kL2RDfatten * Math.abs(type), y2 + kage.kMinWidthT * kage.kL2RDfatten * pm);\r
344         polygons.push(poly);\r
345       }\r
346       else{\r
347         poly = new Polygon();\r
348         poly.push(x2 + kage.kMinWidthT * kage.kL2RDfatten * YX, y2 + kage.kMinWidthT * kage.kL2RDfatten * YY);\r
349         poly.push(x2 - kage.kMinWidthT * kage.kL2RDfatten * YX, y2 - kage.kMinWidthT * kage.kL2RDfatten * YY);\r
350         poly.push(x2 + kage.kMinWidthT * kage.kL2RDfatten * Math.abs(type) * XX + kage.kMinWidthT * kage.kL2RDfatten * pm * YX,\r
351                   y2 + kage.kMinWidthT * kage.kL2RDfatten * Math.abs(type) * XY + kage.kMinWidthT * kage.kL2RDfatten * pm * YY);\r
352         polygons.push(poly);\r
353       }\r
354     }\r
355     \r
356     if(a2 == 15){ //jump up ... it can change 15->5\r
357       if(sy2 == y2){\r
358         poly = new Polygon();\r
359         poly.push(x2, y2 - kage.kMinWidthT + 1);\r
360         poly.push(x2 + 2, y2 - kage.kMinWidthT - kage.kWidth * 5);\r
361         poly.push(x2, y2 - kage.kMinWidthT - kage.kWidth * 5);\r
362         poly.push(x2 - kage.kMinWidthT, y2 - kage.kMinWidthT + 1);\r
363         polygons.push(poly);\r
364       }\r
365       else{\r
366         poly = new Polygon();\r
367         poly.push(x2 + (kage.kMinWidthT - 1) * Math.sin(rad) * v, y2 - (kage.kMinWidthT - 1) * Math.cos(rad) * v);\r
368         poly.push(x2 + 2 * Math.cos(rad) * v + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,\r
369                   y2 + 2 * Math.sin(rad) * v - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);\r
370         poly.push(x2 + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,\r
371                   y2 - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);\r
372         poly.push(x2 + (kage.kMinWidthT - 1) * Math.sin(rad) * v - kage.kMinWidthT * Math.cos(rad) * v,\r
373                   y2 - (kage.kMinWidthT - 1) * Math.cos(rad) * v - kage.kMinWidthT * Math.sin(rad) * v);\r
374         polygons.push(poly);\r
375       }\r
376     }\r
377     \r
378     if(a2 == 14){ //jump to left, allways go left ... it can change 14->4\r
379       poly = new Polygon();\r
380       poly.push(x2, y2);\r
381       poly.push(x2, y2 - kage.kMinWidthT);\r
382       poly.push(x2 - kage.kWidth * 4, y2 - kage.kMinWidthT);\r
383       poly.push(x2 - kage.kWidth * 4, y2 - kage.kMinWidthT * 0.5);\r
384       polygons.push(poly);\r
385     }\r
386   }\r
387   else{ //gothic\r
388     if(a1 % 10 == 2){\r
389       if(x1 == sx1){\r
390         if(y1 < sy1){ y1 = y1 - kage.kWidth; } else{ y1 = y1 + kage.kWidth; }\r
391       }\r
392       else if(y1 == sy1){\r
393         if(x1 < sx1){ x1 = x1 - kage.kWidth; } else{ x1 = x1 + kage.kWidth; }\r
394       }\r
395       else{\r
396         rad = Math.atan((sy1 - y1) / (sx1 - x1));\r
397         if(x1 < sx1){ v = 1; } else{ v = -1; }\r
398         x1 = x1 - kage.kWidth * Math.cos(rad) * v;\r
399         y1 = y1 - kage.kWidth * Math.sin(rad) * v;\r
400       }\r
401     }\r
402     \r
403     if(a1 % 10 == 3){\r
404       if(x1 == sx1){\r
405         if(y1 < sy1){\r
406           y1 = y1 - kage.kWidth * kage.kKakato;\r
407         }\r
408         else{\r
409           y1 = y1 + kage.kWidth * kage.kKakato;\r
410         }\r
411       }\r
412       else if(y1 == sy1){\r
413         if(x1 < sx1){\r
414           x1 = x1 - kage.kWidth * kage.kKakato;\r
415         }\r
416         else{\r
417           x1 = x1 + kage.kWidth * kage.kKakato;\r
418         }\r
419       }\r
420       else{\r
421         rad = Math.atan((sy1 - y1) / (sx1 - x1));\r
422         if(x1 < sx1){ v = 1; } else{ v = -1; }\r
423         x1 = x1 - kage.kWidth * Math.cos(rad) * v * kage.kKakato;\r
424         y1 = y1 - kage.kWidth * Math.sin(rad) * v * kage.kKakato;\r
425       }\r
426     }\r
427     if(a2 % 10 == 2){\r
428       if(sx2 == x2){\r
429         if(sy2 < y2){ y2 = y2 + kage.kWidth; } else{ y2 = y2 - kage.kWidth; }\r
430       }\r
431       else if(sy2 == y2){\r
432         if(sx2 < x2){ x2 = x2 + kage.kWidth; } else{ x2 = x2 - kage.kWidth; }\r
433       }\r
434       else{\r
435         rad = Math.atan((y2 - sy2) / (x2 - sx2));\r
436         if(sx2 < x2){ v = 1; } else{ v = -1; }\r
437         x2 = x2 + kage.kWidth * Math.cos(rad) * v;\r
438         y2 = y2 + kage.kWidth * Math.sin(rad) * v;\r
439       }\r
440     }\r
441     \r
442     if(a2 % 10 == 3){\r
443       if(sx2 == x2){\r
444         if(sy2 < y2){\r
445           y2 = y2 + kage.kWidth * kage.kKakato;\r
446         }\r
447         else{\r
448           y2 = y2 - kage.kWidth * kage.kKakato;\r
449         }\r
450       }\r
451       else if(sy2 == y2){\r
452         if(sx2 < x2){\r
453           x2 = x2 + kage.kWidth * kage.kKakato;\r
454         }\r
455         else{\r
456           x2 = x2 - kage.kWidth * kage.kKakato;\r
457         }\r
458       }\r
459       else{\r
460         rad = Math.atan((y2 - sy2) / (x2 - sx2));\r
461         if(sx2 < x2){ v = 1; } else{ v = -1; }\r
462         x2 = x2 + kage.kWidth * Math.cos(rad) * v * kage.kKakato;\r
463         y2 = y2 + kage.kWidth * Math.sin(rad) * v * kage.kKakato;\r
464       }\r
465     }\r
466     \r
467     poly = new Polygon();\r
468     poly2 = new Polygon();\r
469     \r
470     for(tt = 0; tt <= 1000; tt = tt + kage.kRate){\r
471       t = tt / 1000;\r
472       \r
473       if(sx1 == sx2 && sy1 == sy2){\r
474         //calculating each point\r
475         x = ((1.0 - t) * (1.0 - t) * x1 + 2.0 * t * (1.0 - t) * sx1 + t * t * x2);\r
476         y = ((1.0 - t) * (1.0 - t) * y1 + 2.0 * t * (1.0 - t) * sy1 + t * t * y2);\r
477         \r
478         //SESSEN NO KATAMUKI NO KEISAN(BIBUN)\r
479         ix = (x1 - 2.0 * sx1 + x2) * 2.0 * t + (-2.0 * x1 + 2.0 * sx1);\r
480         iy = (y1 - 2.0 * sy1 + y2) * 2.0 * t + (-2.0 * y1 + 2.0 * sy1);\r
481       } else {\r
482       }\r
483       //SESSEN NI SUICHOKU NA CHOKUSEN NO KEISAN\r
484       if(kage.kShotai == kage.kMincho){ //always false ?\r
485         if(ix != 0 && iy != 0){\r
486           ir = Math.atan(iy / ix * -1.0);\r
487           ia = Math.sin(ir) * kage.kMinWidthT;\r
488           ib = Math.cos(ir) * kage.kMinWidthT;\r
489         }\r
490         else if(ix == 0){\r
491           ia = kage.kMinWidthT;\r
492           ib = 0;\r
493         }\r
494         else{\r
495           ia = 0;\r
496           ib = kage.kMinWidthT;\r
497         }\r
498         ia = ia * Math.sqrt(1.0 - t);\r
499         ib = ib * Math.sqrt(1.0 - t);\r
500       }\r
501       else{\r
502         if(ix != 0 && iy != 0){\r
503           ir = Math.atan(iy / ix * -1.0);\r
504           ia = Math.sin(ir) * kage.kWidth;\r
505           ib = Math.cos(ir) * kage.kWidth;\r
506         }\r
507         else if(ix == 0){\r
508           ia = kage.kWidth;\r
509           ib = 0;\r
510         }\r
511         else{\r
512           ia = 0;\r
513           ib = kage.kWidth;\r
514         }\r
515       }\r
516       \r
517       //reverse if vector is going 2nd/3rd quadrants\r
518       if(ix <= 0){\r
519         ia = ia * -1;\r
520         ib = ib * -1;\r
521       }\r
522       \r
523       //save to polygon\r
524       poly.push(x - ia, y - ib);\r
525       poly2.push(x + ia, y + ib);\r
526     }\r
527     \r
528     poly2.reverse();\r
529     poly.concat(poly2);\r
530     polygons.push(poly);\r
531   }\r
532 }\r
533 \r
534 function cdDrawBezier(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a1, a2){\r
535   cdDrawCurveU(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a1, a2);\r
536 }\r
537 \r
538 function cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a1, a2){\r
539   cdDrawCurveU(kage, polygons, x1, y1, x2, y2, x2, y2, x3, y3, a1, a2);\r
540 }\r
541 \r
542 function cdDrawLine(kage, polygons, tx1, ty1, tx2, ty2, ta1, ta2){\r
543   var rad;\r
544   var v, x1, y1, x2, y2;\r
545   var a1, a2, opt1, opt2;\r
546   var XX, XY, YX, YY;\r
547   var poly;\r
548   \r
549   if(kage.kShotai == kage.kMincho){ //mincho\r
550     x1 = tx1;\r
551     y1 = ty1;\r
552     x2 = tx2;\r
553     y2 = ty2;\r
554     a1 = ta1 % 100;\r
555     a2 = ta2 % 100;\r
556     opt1 = Math.floor(ta1 / 100);\r
557     opt2 = Math.floor(ta2 / 100);\r
558     \r
559     if(x1 == x2){ //if TATE stroke, use y-axis\r
560       poly = new Polygon(4);\r
561       switch(a1){\r
562       case 0:\r
563         poly.set(3, x1 - kage.kMinWidthT, y1 - kage.kMinWidthY / 2);\r
564         poly.set(0, x1 + kage.kMinWidthT, y1 + kage.kMinWidthY / 2);\r
565         break;\r
566       case 1:\r
567       case 6: //... no need\r
568       case 22:\r
569         poly.set(3, x1 - kage.kMinWidthT, y1);\r
570         poly.set(0, x1 + kage.kMinWidthT, y1);\r
571         break;\r
572       case 12:\r
573         poly.set(3, x1 - kage.kMinWidthT, y1 - kage.kMinWidthY - kage.kMinWidthT);\r
574         poly.set(0, x1 + kage.kMinWidthT, y1 - kage.kMinWidthY);\r
575         break;\r
576       case 32:\r
577         poly.set(3, x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);\r
578         poly.set(0, x1 + kage.kMinWidthT, y1 - kage.kMinWidthY);\r
579         break;\r
580       }\r
581       \r
582       switch(a2){\r
583       case 0:\r
584         if(a1 == 6){ //KAGI's tail ... no need\r
585           poly.set(2, x2 - kage.kMinWidthT, y2);\r
586           poly.set(1, x2 + kage.kMinWidthT, y2);\r
587         }\r
588         else{\r
589           poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kMinWidthT / 2);\r
590           poly.set(1, x2 + kage.kMinWidthT, y2 - kage.kMinWidthT / 2);\r
591         }\r
592         break;\r
593       case 1:\r
594         poly.set(2, x2 - kage.kMinWidthT, y2);\r
595         poly.set(1, x2 + kage.kMinWidthT, y2);\r
596         break;\r
597       case 13:\r
598         poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kAdjustKakatoL[opt2] + kage.kMinWidthT);\r
599         poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kAdjustKakatoL[opt2]);\r
600         break;\r
601       case 23:\r
602         poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kAdjustKakatoR[opt2] + kage.kMinWidthT);\r
603         poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kAdjustKakatoR[opt2]);\r
604         break;\r
605       case 32:\r
606         poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kMinWidthY);\r
607         poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kMinWidthY);\r
608         break;\r
609       }\r
610       \r
611       polygons.push(poly);\r
612       \r
613       if(a1 == 22){ //box's right top corner\r
614         poly = new Polygon();\r
615         poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);\r
616         poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);\r
617         poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);\r
618         poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);\r
619         poly.push(x1 - kage.kMinWidthT, y1);\r
620         polygons.push(poly);\r
621       }\r
622       \r
623       if(a1 == 0){ //beginning of the stroke\r
624         poly = new Polygon();\r
625         poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthY * 0.5);\r
626         poly.push(x1 + kage.kMinWidthT + kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 0.5 + kage.kMinWidthY);\r
627         poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2);\r
628         polygons.push(poly);\r
629       }\r
630       \r
631       if((a1 == 6 && a2 == 0) || a2 == 1){ //KAGI NO YOKO BOU NO SAIGO NO MARU ... no need only used at 1st=yoko\r
632         poly = new Polygon();\r
633         poly.push(x2 - kage.kMinWidthT, y2);\r
634         poly.push(x2 - kage.kMinWidthT * 0.6, y2 + kage.kMinWidthT * 0.6);\r
635         poly.push(x2, y2 + kage.kMinWidthT);\r
636         poly.push(x2 + kage.kMinWidthT * 0.6, y2 + kage.kMinWidthT * 0.6);\r
637         poly.push(x2 + kage.kMinWidthT, y2);\r
638         poly.reverse(); // for fill-rule\r
639         polygons.push(poly);\r
640       }\r
641     }\r
642     else if(y1 == y2){ //if it is YOKO stroke, use x-axis\r
643       if(a1 == 6){ //if it is KAGI's YOKO stroke, get bold\r
644         poly = new Polygon();\r
645         poly.push(x1, y1 - kage.kMinWidthT);\r
646         poly.push(x2, y2 - kage.kMinWidthT);\r
647         poly.push(x2, y2 + kage.kMinWidthT);\r
648         poly.push(x1, y1 + kage.kMinWidthT);\r
649         polygons.push(poly);\r
650         \r
651         if(a2 == 1 || a2 == 0 || a2 == 5){ // no need a2=1\r
652           //KAGI NO YOKO BOU NO SAIGO NO MARU\r
653           poly = new Polygon();\r
654           poly.push(x2, y2 - kage.kMinWidthT);\r
655           poly.push(x2 + kage.kMinWidthT * 0.6, y2 - kage.kMinWidthT * 0.6);\r
656           poly.push(x2 + kage.kMinWidthT, y2);\r
657           poly.push(x2 + kage.kMinWidthT * 0.6, y2 + kage.kMinWidthT * 0.6);\r
658           poly.push(x2, y2 + kage.kMinWidthT);\r
659           polygons.push(poly);\r
660         }\r
661         \r
662         if(a2 == 5){\r
663           //KAGI NO YOKO BOU NO HANE\r
664           poly = new Polygon();\r
665           poly.push(x2, y2 - kage.kMinWidthT + 1);\r
666           poly.push(x2 + 2, y2 - kage.kMinWidthT - kage.kWidth * 5);\r
667           poly.push(x2, y2 - kage.kMinWidthT - kage.kWidth * 5);\r
668           poly.push(x2 - kage.kMinWidthT, y2 - kage.kMinWidthT + 1);\r
669           poly.reverse(); // for fill-rule\r
670           polygons.push(poly);\r
671         }\r
672       }\r
673       else{\r
674         //always same\r
675         poly = new Polygon(4);\r
676         poly.set(0, x1, y1 - kage.kMinWidthY);\r
677         poly.set(1, x2, y2 - kage.kMinWidthY);\r
678         poly.set(2, x2, y2 + kage.kMinWidthY);\r
679         poly.set(3, x1, y1 + kage.kMinWidthY);\r
680         polygons.push(poly);\r
681         \r
682         //UROKO\r
683         if(a2 == 0){\r
684           poly = new Polygon();\r
685           poly.push(x2, y2 - kage.kMinWidthY);\r
686           poly.push(x2 - kage.kAdjustUrokoX[opt2], y2);\r
687           poly.push(x2 - kage.kAdjustUrokoX[opt2] / 2, y2 - kage.kAdjustUrokoY[opt2]);\r
688           polygons.push(poly);\r
689         }\r
690       }\r
691     }\r
692     else{ //for others, use x-axis\r
693       rad = Math.atan((y2 - y1) / (x2 - x1));\r
694       if((Math.abs(y2 - y1) < Math.abs(x2 - x1)) && (a1 != 6) && (a2 != 6) && !(x1 > x2)){ //ASAI KAUDO\r
695         //always same\r
696         poly = new Polygon(4);\r
697         poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthY, y1 - Math.cos(rad) * kage.kMinWidthY);\r
698         poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthY, y2 - Math.cos(rad) * kage.kMinWidthY);\r
699         poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthY, y2 + Math.cos(rad) * kage.kMinWidthY);\r
700         poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthY, y1 + Math.cos(rad) * kage.kMinWidthY);\r
701         polygons.push(poly);\r
702         \r
703         //UROKO\r
704         if(a2 == 0){\r
705           poly = new Polygon();\r
706           poly.push(x2 + Math.sin(rad) * kage.kMinWidthY, y2 - Math.cos(rad) * kage.kMinWidthY);\r
707           poly.push(x2 - Math.cos(rad) * kage.kAdjustUrokoX[opt2], y2 - Math.sin(rad) * kage.kAdjustUrokoX[opt2]);\r
708           poly.push(x2 - Math.cos(rad) * kage.kAdjustUrokoX[opt2] / 2 + Math.sin(rad) * kage.kAdjustUrokoX[opt2] / 2, y2 - Math.sin(rad) * kage.kAdjustUrokoY[opt2] - Math.cos(rad) * kage.kAdjustUrokoY[opt2]);\r
709           polygons.push(poly);\r
710         }\r
711       }\r
712       \r
713       else{ //KAKUDO GA FUKAI or KAGI NO YOKO BOU\r
714         if(x1 > x2){ v = -1; } else{ v = 1; }\r
715         poly = new Polygon(4);\r
716         switch(a1){\r
717         case 0:\r
718           poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.cos(rad) * 0.5 * v,\r
719                    y1 - Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.sin(rad) * 0.5 * v);\r
720           poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * 0.5 * v,\r
721                    y1 + Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * 0.5 * v);\r
722           break;\r
723         case 1:\r
724         case 6:\r
725         case 22:\r
726           poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v, y1 - Math.cos(rad) * kage.kMinWidthT * v);\r
727           poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v, y1 + Math.cos(rad) * kage.kMinWidthT * v);\r
728           break;\r
729         case 12:\r
730           poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * v,\r
731                    y1 - Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * v);\r
732           poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v - (kage.kMinWidthT + kage.kMinWidthY) * Math.cos(rad) * v,\r
733                    y1 + Math.cos(rad) * kage.kMinWidthT * v - (kage.kMinWidthT + kage.kMinWidthY) * Math.sin(rad) * v);\r
734           break;\r
735         case 32:\r
736           poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * v,\r
737                    y1 - Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * v);\r
738           poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * v,\r
739                    y1 + Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * v);\r
740           break;\r
741         }\r
742         \r
743         switch(a2){\r
744         case 0:\r
745           if(a1 == 6){\r
746             poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);\r
747             poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);\r
748           }\r
749           else{\r
750             poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthT * 0.5 * Math.cos(rad) * v,\r
751                      y2 - Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthT * 0.5 * Math.sin(rad) * v);\r
752             poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthT * 0.5 * Math.cos(rad) * v,\r
753                      y2 + Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthT * 0.5 * Math.sin(rad) * v);\r
754           }\r
755           break;\r
756         case 1: // is needed?\r
757         case 5:\r
758           poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);\r
759           poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);\r
760           break;\r
761         case 13:\r
762           poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kAdjustKakatoL[opt2] * Math.cos(rad) * v,\r
763                    y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kAdjustKakatoL[opt2] * Math.sin(rad) * v);\r
764           poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v + (kage.kAdjustKakatoL[opt2] + kage.kMinWidthT) * Math.cos(rad) * v,\r
765                    y2 + Math.cos(rad) * kage.kMinWidthT * v + (kage.kAdjustKakatoL[opt2] + kage.kMinWidthT) * Math.sin(rad) * v);\r
766           break;\r
767         case 23:\r
768           poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kAdjustKakatoR[opt2] * Math.cos(rad) * v,\r
769                    y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kAdjustKakatoR[opt2] * Math.sin(rad) * v);\r
770           poly.set(2,\r
771                    x2 - Math.sin(rad) * kage.kMinWidthT * v + (kage.kAdjustKakatoR[opt2] + kage.kMinWidthT) * Math.cos(rad) * v,\r
772                    y2 + Math.cos(rad) * kage.kMinWidthT * v + (kage.kAdjustKakatoR[opt2] + kage.kMinWidthT) * Math.sin(rad) * v);\r
773           break;\r
774         case 32:\r
775           poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.cos(rad) * v,\r
776                    y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.sin(rad) * v);\r
777           poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.cos(rad) * v,\r
778                    y2 + Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.sin(rad) * v);\r
779           break;\r
780         }\r
781         \r
782         polygons.push(poly);\r
783         \r
784         if((a1 == 6) && (a2 == 0 || a2 == 5)){ //KAGI NO YOKO BOU NO SAIGO NO MARU\r
785           poly = new Polygon();\r
786           poly.push(x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);\r
787           poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * 0.8 * v + Math.sin(rad) * kage.kMinWidthT * 0.6 * v,\r
788                     y2 + Math.sin(rad) * kage.kMinWidthT * 0.8 * v - Math.cos(rad) * kage.kMinWidthT * 0.6 * v);\r
789           poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * v, y2 + Math.sin(rad) * kage.kMinWidthT * v);\r
790           poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * 0.8 * v - Math.sin(rad) * kage.kMinWidthT * 0.6 * v,\r
791                     y2 + Math.sin(rad) * kage.kMinWidthT * 0.8 * v + Math.cos(rad) * kage.kMinWidthT * 0.6 * v);\r
792           poly.push(x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);\r
793           polygons.push(poly);\r
794         }\r
795         \r
796         if(a1 == 6 && a2 == 5){\r
797           //KAGI NO YOKO BOU NO HANE\r
798           poly = new Polygon();\r
799           poly.push(x2 + (kage.kMinWidthT - 1) * Math.sin(rad) * v, y2 - (kage.kMinWidthT - 1) * Math.cos(rad) * v);\r
800           poly.push(x2 + 2 * Math.cos(rad) * v + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,\r
801                     y2 + 2 * Math.sin(rad) * v - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);\r
802           poly.push(x2 + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,\r
803                     y2 - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);\r
804           poly.push(x2 + (kage.kMinWidthT - 1) * Math.sin(rad) * v - kage.kMinWidthT * Math.cos(rad) * v,\r
805                     y2 - (kage.kMinWidthT - 1) * Math.cos(rad) * v - kage.kMinWidthT * Math.sin(rad) * v);\r
806           polygons.push(poly);\r
807         }\r
808         \r
809         if(a1 == 22){ //SHIKAKU MIGIUE UROKO NANAME DEMO MASSUGU MUKI\r
810           poly = new Polygon();\r
811           poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);\r
812           poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);\r
813           poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);\r
814           poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);\r
815           poly.push(x1 - kage.kMinWidthT, y1);\r
816           polygons.push(poly);\r
817         }\r
818         \r
819         XX = Math.sin(rad) * v;\r
820         XY = Math.cos(rad) * v * -1;\r
821         YX = Math.cos(rad) * v;\r
822         YY = Math.sin(rad) * v;\r
823         \r
824         if(a1 == 0){ //beginning of the storke\r
825           poly = new Polygon();\r
826           poly.push(x1 + kage.kMinWidthT * XX + (kage.kMinWidthY * 0.5) * YX,\r
827                     y1 + kage.kMinWidthT * XY + (kage.kMinWidthY * 0.5) * YY);\r
828           poly.push(x1 + (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YX,\r
829                     y1 + (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YY);\r
830           poly.push(x1 + kage.kMinWidthT * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YX,\r
831                     y1 + kage.kMinWidthT * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YY);\r
832           polygons.push(poly);\r
833         }\r
834       }\r
835     }\r
836   }\r
837   else{ //gothic\r
838     if(tx1 == tx2){ //if TATE stroke, use y-axis\r
839       if(ty1 > ty2){\r
840         x1 = tx2;\r
841         y1 = ty2;\r
842         x2 = tx1;\r
843         y2 = ty1;\r
844         a1 = ta2;\r
845         a2 = ta1;\r
846       }\r
847       else{\r
848         x1 = tx1;\r
849         y1 = ty1;\r
850         x2 = tx2;\r
851         y2 = ty2;\r
852         a1 = ta1;\r
853         a2 = ta2;\r
854       }\r
855       \r
856       if(a1 % 10 == 2){ y1 = y1 - kage.kWidth; }\r
857       if(a2 % 10 == 2){ y2 = y2 + kage.kWidth; }\r
858       if(a1 % 10 == 3){ y1 = y1 - kage.kWidth * kage.kKakato; }\r
859       if(a2 % 10 == 3){ y2 = y2 + kage.kWidth * kage.kKakato; }\r
860       \r
861       poly = new Polygon();\r
862       poly.push(x1 - kage.kWidth, y1);\r
863       poly.push(x2 - kage.kWidth, y2);\r
864       poly.push(x2 + kage.kWidth, y2);\r
865       poly.push(x1 + kage.kWidth, y1);\r
866       poly.reverse(); // for fill-rule\r
867       \r
868       polygons.push(poly);\r
869     }\r
870     else if(ty1 == ty2){ //if YOKO stroke, use x-axis\r
871       if(tx1 > tx2){\r
872         x1 = tx2;\r
873         y1 = ty2;\r
874         x2 = tx1;\r
875         y2 = ty1;\r
876         a1 = ta2;\r
877         a2 = ta1;\r
878       }\r
879       else{\r
880         x1 = tx1;\r
881         y1 = ty1;\r
882         x2 = tx2;\r
883         y2 = ty2;\r
884         a1 = ta1;\r
885         a2 = ta2;\r
886       }\r
887       if(a1 % 10 == 2){ x1 = x1 - kage.kWidth; }\r
888       if(a2 % 10 == 2){ x2 = x2 + kage.kWidth; }\r
889       if(a1 % 10 == 3){ x1 = x1 - kage.kWidth * kage.kKakato; }\r
890       if(a2 % 10 == 3){ x2 = x2 + kage.kWidth * kage.kKakato; }\r
891       \r
892       poly = new Polygon();\r
893       poly.push(x1, y1 - kage.kWidth);\r
894       poly.push(x2, y2 - kage.kWidth);\r
895       poly.push(x2, y2 + kage.kWidth);\r
896       poly.push(x1, y1 + kage.kWidth);\r
897       \r
898       polygons.push(poly);\r
899     }\r
900     else{ //for others, use x-axis\r
901       if(tx1 > tx2){\r
902         x1 = tx2;\r
903         y1 = ty2;\r
904         x2 = tx1;\r
905         y2 = ty1;\r
906         a1 = ta2;\r
907         a2 = ta1;\r
908       }\r
909       else{\r
910         x1 = tx1;\r
911         y1 = ty1;\r
912         x2 = tx2;\r
913         y2 = ty2;\r
914         a1 = ta1;\r
915         a2 = ta2;\r
916       }\r
917       rad = Math.atan((y2 - y1) / (x2 - x1));\r
918       if(a1 % 10 == 2){\r
919         x1 = x1 - kage.kWidth * Math.cos(rad);\r
920         y1 = y1 - kage.kWidth * Math.sin(rad);\r
921       }\r
922       if(a2 % 10 == 2){\r
923         x2 = x2 + kage.kWidth * Math.cos(rad);\r
924         y2 = y2 + kage.kWidth * Math.sin(rad);\r
925       }\r
926       if(a1 % 10 == 3){\r
927         x1 = x1 - kage.kWidth * Math.cos(rad) * kage.kKakato;\r
928         y1 = y1 - kage.kWidth * Math.sin(rad) * kage.kKakato;\r
929       }\r
930       if(a2 % 10 == 3){\r
931         x2 = x2 + kage.kWidth * Math.cos(rad) * kage.kKakato;\r
932         y2 = y2 + kage.kWidth * Math.sin(rad) * kage.kKakato;\r
933       }\r
934       \r
935       //SUICHOKU NO ICHI ZURASHI HA Math.sin TO Math.cos NO IREKAE + x-axis MAINASU KA\r
936       poly = new Polygon();\r
937       poly.push(x1 + Math.sin(rad) * kage.kWidth, y1 - Math.cos(rad) * kage.kWidth);\r
938       poly.push(x2 + Math.sin(rad) * kage.kWidth, y2 - Math.cos(rad) * kage.kWidth);\r
939       poly.push(x2 - Math.sin(rad) * kage.kWidth, y2 + Math.cos(rad) * kage.kWidth);\r
940       poly.push(x1 - Math.sin(rad) * kage.kWidth, y1 + Math.cos(rad) * kage.kWidth);\r
941       \r
942       polygons.push(poly);\r
943     }\r
944   }\r
945 }\r