Improved head shpae of R2LD harai.
[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     var type;\r
204     var pm = 0;\r
205     if(a1 == 0){\r
206       if(y1 <= y2){ //from up to bottom\r
207         type = (Math.atan2(Math.abs(y1 - sy1), Math.abs(x1 - sx1)) / Math.PI * 2 - 0.4);\r
208         if(type > 0){\r
209           type = type * 2;\r
210         } else {\r
211           type = type * 16;\r
212         }\r
213         if(type < 0){\r
214           pm = -1;\r
215         } else {\r
216           pm = 1;\r
217         }\r
218         if(x1 == sx1){\r
219           poly = new Polygon();\r
220           poly.push(x1 - kage.kMinWidthT, y1);\r
221           poly.push(x1 + kage.kMinWidthT, y1);\r
222           poly.push(x1 - kage.kMinWidthT * pm, y1 - kage.kMinWidthY * type * pm);\r
223           polygons.push(poly);\r
224         }\r
225         else{\r
226           poly = new Polygon();\r
227           poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);\r
228           poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);\r
229           poly.push(x1 - kage.kMinWidthT * pm * XX - kage.kMinWidthY * type * pm * YX, y1 - kage.kMinWidthT * pm * XY - kage.kMinWidthY * type * pm * YY);\r
230           polygons.push(poly);\r
231         }\r
232       }\r
233       else{ //bottom to up\r
234         if(x1 == sx1){\r
235           poly = new Polygon();\r
236           poly.push(x1 - kage.kMinWidthT, y1);\r
237           poly.push(x1 + kage.kMinWidthT, y1);\r
238           poly.push(x1 + kage.kMinWidthT, y1 - kage.kMinWidthY);\r
239           polygons.push(poly);\r
240         }\r
241         else{\r
242           poly = new Polygon();\r
243           poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);\r
244           poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);\r
245           poly.push(x1 + kage.kMinWidthT * XX - kage.kMinWidthY * YX, y1 + kage.kMinWidthT * XY - kage.kMinWidthY * YY);\r
246           polygons.push(poly);\r
247         }\r
248       }\r
249     }\r
250     \r
251     if(a1 == 22){ //box's up-right corner, any time same degree\r
252       poly = new Polygon();\r
253       poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);\r
254       poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);\r
255       poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);\r
256       poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);\r
257       poly.push(x1, y1 + kage.kMinWidthT);\r
258       polygons.push(poly);\r
259     }\r
260     \r
261     if(a1 == 0){ //beginning of the stroke\r
262       if(y1 <= y2){ //from up to bottom\r
263         if(pm > 0){\r
264           type = 0;\r
265         }\r
266         var move = kage.kMinWidthY * type * pm;\r
267         if(x1 == sx1){\r
268           poly = new Polygon();\r
269           poly.push(x1 + kage.kMinWidthT, y1 - move);\r
270           poly.push(x1 + kage.kMinWidthT * 1.5, y1 + kage.kMinWidthY - move);\r
271           poly.push(x1 + kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 3 - move / 2);\r
272           polygons.push(poly);\r
273         }\r
274         else{\r
275           poly = new Polygon();\r
276           poly.push(x1 + kage.kMinWidthT * XX - move * YX,\r
277                     y1 + kage.kMinWidthT * XY - move * YY);\r
278           poly.push(x1 + kage.kMinWidthT * 1.5 * XX + (kage.kMinWidthY - move * 1.2) * YX,\r
279                     y1 + kage.kMinWidthT * 1.5 * XY + (kage.kMinWidthY - move * 1.2) * YY);\r
280           poly.push(x1 + kage.kMinWidthT * 0.5 * XX + (kage.kMinWidthY * 3 - move * 0.8) * YX,\r
281                     y1 + kage.kMinWidthT * 0.5 * XY + (kage.kMinWidthY * 3 - move * 0.8) * YY);\r
282           polygons.push(poly);\r
283         }\r
284       }\r
285       else{ //from bottom to up\r
286         if(x1 == sx1){\r
287           poly = new Polygon();\r
288           poly.push(x1 - kage.kMinWidthT, y1);\r
289           poly.push(x1 - kage.kMinWidthT * 1.5, y1 + kage.kMinWidthY);\r
290           poly.push(x1 - kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 3);\r
291           polygons.push(poly);\r
292         }\r
293         else{\r
294           poly = new Polygon();\r
295           poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);\r
296           poly.push(x1 - kage.kMinWidthT * 1.5 * XX + kage.kMinWidthY * YX, y1 + kage.kMinWidthY * YY - kage.kMinWidthT * 1.5 * XY);\r
297           poly.push(x1 - kage.kMinWidthT * 0.5 * XX + kage.kMinWidthY * 3 * YX, y1 + kage.kMinWidthY * 3 * YY - kage.kMinWidthT * 0.5 * XY);\r
298           polygons.push(poly);\r
299         }\r
300       }\r
301     }\r
302     \r
303     //process for tail\r
304     rad = Math.atan((y2 - sy2) / (x2 - sx2));\r
305     if(sx2 < x2){ v = 1; } else{ v = -1; }\r
306     YX = Math.sin(rad) * v * -1;\r
307     YY = Math.cos(rad) * v;\r
308     XX = Math.cos(rad) * v;\r
309     XY = Math.sin(rad) * v;\r
310     \r
311     if(a2 == 1 || a2 == 8 || a2 == 15){ //the last filled circle ... it can change 15->5\r
312       if(sx2 == x2){\r
313         poly = new Polygon();\r
314         poly.push(x2 - kage.kMinWidthT, y2);\r
315         poly.push(x2 - kage.kMinWidthT * 0.7, y2 + kage.kMinWidthT * 0.7);\r
316         poly.push(x2, y2 + kage.kMinWidthT);\r
317         poly.push(x2 + kage.kMinWidthT * 0.7, y2 + kage.kMinWidthT * 0.7);\r
318         poly.push(x2 + kage.kMinWidthT, y2);\r
319         polygons.push(poly);\r
320       }\r
321       else if(sy2 == y2){\r
322         poly = new Polygon();\r
323         poly.push(x2, y2 - kage.kMinWidthT);\r
324         poly.push(x2 + kage.kMinWidthT * 0.7, y2 - kage.kMinWidthT * 0.7);\r
325         poly.push(x2 + kage.kMinWidthT, y2);\r
326         poly.push(x2 + kage.kMinWidthT * 0.7, y2 + kage.kMinWidthT * 0.7);\r
327         poly.push(x2, y2 + kage.kMinWidthT);\r
328         polygons.push(poly);\r
329       }\r
330       else{\r
331         poly = new Polygon();\r
332         poly.push(x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);\r
333         poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * 0.7 * v + Math.sin(rad) * kage.kMinWidthT * 0.7 * v,\r
334                   y2 + Math.sin(rad) * kage.kMinWidthT * 0.7 * v - Math.cos(rad) * kage.kMinWidthT * 0.7 * v);\r
335         poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * v, y2 + Math.sin(rad) * kage.kMinWidthT * v);\r
336         poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * 0.7 * v - Math.sin(rad) * kage.kMinWidthT * 0.7 * v,\r
337                   y2 + Math.sin(rad) * kage.kMinWidthT * 0.7 * v + Math.cos(rad) * kage.kMinWidthT * 0.7 * v);\r
338         poly.push(x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);\r
339         polygons.push(poly);\r
340       }\r
341     }\r
342     \r
343     if(a2 == 9 || (a1 == 7 && a2 == 0)){ // Math.sinnyu & L2RD Harai ... no need for a2=9\r
344       var type = (Math.atan2(Math.abs(y2 - sy2), Math.abs(x2 - sx2)) / Math.PI * 2 - 0.6);\r
345       if(type > 0){\r
346         type = type * 8;\r
347       } else {\r
348         type = type * 3;\r
349       }\r
350       var pm = 0;\r
351       if(type < 0){\r
352         pm = -1;\r
353       } else {\r
354         pm = 1;\r
355       }\r
356       if(sy2 == y2){\r
357         poly = new Polygon();\r
358         poly.push(x2, y2 + kage.kMinWidthT * kage.kL2RDfatten);\r
359         poly.push(x2, y2 - kage.kMinWidthT * kage.kL2RDfatten);\r
360         poly.push(x2 + kage.kMinWidthT * kage.kL2RDfatten * Math.abs(type), y2 + kage.kMinWidthT * kage.kL2RDfatten * pm);\r
361         polygons.push(poly);\r
362       }\r
363       else{\r
364         poly = new Polygon();\r
365         poly.push(x2 + kage.kMinWidthT * kage.kL2RDfatten * YX, y2 + kage.kMinWidthT * kage.kL2RDfatten * YY);\r
366         poly.push(x2 - kage.kMinWidthT * kage.kL2RDfatten * YX, y2 - kage.kMinWidthT * kage.kL2RDfatten * YY);\r
367         poly.push(x2 + kage.kMinWidthT * kage.kL2RDfatten * Math.abs(type) * XX + kage.kMinWidthT * kage.kL2RDfatten * pm * YX,\r
368                   y2 + kage.kMinWidthT * kage.kL2RDfatten * Math.abs(type) * XY + kage.kMinWidthT * kage.kL2RDfatten * pm * YY);\r
369         polygons.push(poly);\r
370       }\r
371     }\r
372     \r
373     if(a2 == 15){ //jump up ... it can change 15->5\r
374       if(sy2 == y2){\r
375         poly = new Polygon();\r
376         poly.push(x2, y2 - kage.kMinWidthT + 1);\r
377         poly.push(x2 + 2, y2 - kage.kMinWidthT - kage.kWidth * 5);\r
378         poly.push(x2, y2 - kage.kMinWidthT - kage.kWidth * 5);\r
379         poly.push(x2 - kage.kMinWidthT, y2 - kage.kMinWidthT + 1);\r
380         polygons.push(poly);\r
381       }\r
382       else{\r
383         poly = new Polygon();\r
384         poly.push(x2 + (kage.kMinWidthT - 1) * Math.sin(rad) * v, y2 - (kage.kMinWidthT - 1) * Math.cos(rad) * v);\r
385         poly.push(x2 + 2 * Math.cos(rad) * v + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,\r
386                   y2 + 2 * Math.sin(rad) * v - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);\r
387         poly.push(x2 + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,\r
388                   y2 - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);\r
389         poly.push(x2 + (kage.kMinWidthT - 1) * Math.sin(rad) * v - kage.kMinWidthT * Math.cos(rad) * v,\r
390                   y2 - (kage.kMinWidthT - 1) * Math.cos(rad) * v - kage.kMinWidthT * Math.sin(rad) * v);\r
391         polygons.push(poly);\r
392       }\r
393     }\r
394     \r
395     if(a2 == 14){ //jump to left, allways go left ... it can change 14->4\r
396       poly = new Polygon();\r
397       poly.push(x2, y2);\r
398       poly.push(x2, y2 - kage.kMinWidthT);\r
399       poly.push(x2 - kage.kWidth * 4, y2 - kage.kMinWidthT);\r
400       poly.push(x2 - kage.kWidth * 4, y2 - kage.kMinWidthT * 0.5);\r
401       polygons.push(poly);\r
402     }\r
403   }\r
404   else{ //gothic\r
405     if(a1 % 10 == 2){\r
406       if(x1 == sx1){\r
407         if(y1 < sy1){ y1 = y1 - kage.kWidth; } else{ y1 = y1 + kage.kWidth; }\r
408       }\r
409       else if(y1 == sy1){\r
410         if(x1 < sx1){ x1 = x1 - kage.kWidth; } else{ x1 = x1 + kage.kWidth; }\r
411       }\r
412       else{\r
413         rad = Math.atan((sy1 - y1) / (sx1 - x1));\r
414         if(x1 < sx1){ v = 1; } else{ v = -1; }\r
415         x1 = x1 - kage.kWidth * Math.cos(rad) * v;\r
416         y1 = y1 - kage.kWidth * Math.sin(rad) * v;\r
417       }\r
418     }\r
419     \r
420     if(a1 % 10 == 3){\r
421       if(x1 == sx1){\r
422         if(y1 < sy1){\r
423           y1 = y1 - kage.kWidth * kage.kKakato;\r
424         }\r
425         else{\r
426           y1 = y1 + kage.kWidth * kage.kKakato;\r
427         }\r
428       }\r
429       else if(y1 == sy1){\r
430         if(x1 < sx1){\r
431           x1 = x1 - kage.kWidth * kage.kKakato;\r
432         }\r
433         else{\r
434           x1 = x1 + kage.kWidth * kage.kKakato;\r
435         }\r
436       }\r
437       else{\r
438         rad = Math.atan((sy1 - y1) / (sx1 - x1));\r
439         if(x1 < sx1){ v = 1; } else{ v = -1; }\r
440         x1 = x1 - kage.kWidth * Math.cos(rad) * v * kage.kKakato;\r
441         y1 = y1 - kage.kWidth * Math.sin(rad) * v * kage.kKakato;\r
442       }\r
443     }\r
444     if(a2 % 10 == 2){\r
445       if(sx2 == x2){\r
446         if(sy2 < y2){ y2 = y2 + kage.kWidth; } else{ y2 = y2 - kage.kWidth; }\r
447       }\r
448       else if(sy2 == y2){\r
449         if(sx2 < x2){ x2 = x2 + kage.kWidth; } else{ x2 = x2 - kage.kWidth; }\r
450       }\r
451       else{\r
452         rad = Math.atan((y2 - sy2) / (x2 - sx2));\r
453         if(sx2 < x2){ v = 1; } else{ v = -1; }\r
454         x2 = x2 + kage.kWidth * Math.cos(rad) * v;\r
455         y2 = y2 + kage.kWidth * Math.sin(rad) * v;\r
456       }\r
457     }\r
458     \r
459     if(a2 % 10 == 3){\r
460       if(sx2 == x2){\r
461         if(sy2 < y2){\r
462           y2 = y2 + kage.kWidth * kage.kKakato;\r
463         }\r
464         else{\r
465           y2 = y2 - kage.kWidth * kage.kKakato;\r
466         }\r
467       }\r
468       else if(sy2 == y2){\r
469         if(sx2 < x2){\r
470           x2 = x2 + kage.kWidth * kage.kKakato;\r
471         }\r
472         else{\r
473           x2 = x2 - kage.kWidth * kage.kKakato;\r
474         }\r
475       }\r
476       else{\r
477         rad = Math.atan((y2 - sy2) / (x2 - sx2));\r
478         if(sx2 < x2){ v = 1; } else{ v = -1; }\r
479         x2 = x2 + kage.kWidth * Math.cos(rad) * v * kage.kKakato;\r
480         y2 = y2 + kage.kWidth * Math.sin(rad) * v * kage.kKakato;\r
481       }\r
482     }\r
483     \r
484     poly = new Polygon();\r
485     poly2 = new Polygon();\r
486     \r
487     for(tt = 0; tt <= 1000; tt = tt + kage.kRate){\r
488       t = tt / 1000;\r
489       \r
490       if(sx1 == sx2 && sy1 == sy2){\r
491         //calculating each point\r
492         x = ((1.0 - t) * (1.0 - t) * x1 + 2.0 * t * (1.0 - t) * sx1 + t * t * x2);\r
493         y = ((1.0 - t) * (1.0 - t) * y1 + 2.0 * t * (1.0 - t) * sy1 + t * t * y2);\r
494         \r
495         //SESSEN NO KATAMUKI NO KEISAN(BIBUN)\r
496         ix = (x1 - 2.0 * sx1 + x2) * 2.0 * t + (-2.0 * x1 + 2.0 * sx1);\r
497         iy = (y1 - 2.0 * sy1 + y2) * 2.0 * t + (-2.0 * y1 + 2.0 * sy1);\r
498       } else {\r
499       }\r
500       //SESSEN NI SUICHOKU NA CHOKUSEN NO KEISAN\r
501       if(kage.kShotai == kage.kMincho){ //always false ?\r
502         if(ix != 0 && iy != 0){\r
503           ir = Math.atan(iy / ix * -1.0);\r
504           ia = Math.sin(ir) * kage.kMinWidthT;\r
505           ib = Math.cos(ir) * kage.kMinWidthT;\r
506         }\r
507         else if(ix == 0){\r
508           ia = kage.kMinWidthT;\r
509           ib = 0;\r
510         }\r
511         else{\r
512           ia = 0;\r
513           ib = kage.kMinWidthT;\r
514         }\r
515         ia = ia * Math.sqrt(1.0 - t);\r
516         ib = ib * Math.sqrt(1.0 - t);\r
517       }\r
518       else{\r
519         if(ix != 0 && iy != 0){\r
520           ir = Math.atan(iy / ix * -1.0);\r
521           ia = Math.sin(ir) * kage.kWidth;\r
522           ib = Math.cos(ir) * kage.kWidth;\r
523         }\r
524         else if(ix == 0){\r
525           ia = kage.kWidth;\r
526           ib = 0;\r
527         }\r
528         else{\r
529           ia = 0;\r
530           ib = kage.kWidth;\r
531         }\r
532       }\r
533       \r
534       //reverse if vector is going 2nd/3rd quadrants\r
535       if(ix <= 0){\r
536         ia = ia * -1;\r
537         ib = ib * -1;\r
538       }\r
539       \r
540       //save to polygon\r
541       poly.push(x - ia, y - ib);\r
542       poly2.push(x + ia, y + ib);\r
543     }\r
544     \r
545     poly2.reverse();\r
546     poly.concat(poly2);\r
547     polygons.push(poly);\r
548   }\r
549 }\r
550 \r
551 function cdDrawBezier(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a1, a2){\r
552   cdDrawCurveU(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a1, a2);\r
553 }\r
554 \r
555 function cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a1, a2){\r
556   cdDrawCurveU(kage, polygons, x1, y1, x2, y2, x2, y2, x3, y3, a1, a2);\r
557 }\r
558 \r
559 function cdDrawLine(kage, polygons, tx1, ty1, tx2, ty2, ta1, ta2){\r
560   var rad;\r
561   var v, x1, y1, x2, y2;\r
562   var a1, a2, opt1, opt2;\r
563   var XX, XY, YX, YY;\r
564   var poly;\r
565   \r
566   if(kage.kShotai == kage.kMincho){ //mincho\r
567     x1 = tx1;\r
568     y1 = ty1;\r
569     x2 = tx2;\r
570     y2 = ty2;\r
571     a1 = ta1 % 100;\r
572     a2 = ta2 % 100;\r
573     opt1 = Math.floor(ta1 / 100);\r
574     opt2 = Math.floor(ta2 / 100);\r
575     \r
576     if(x1 == x2){ //if TATE stroke, use y-axis\r
577       poly = new Polygon(4);\r
578       switch(a1){\r
579       case 0:\r
580         poly.set(3, x1 - kage.kMinWidthT, y1 - kage.kMinWidthY / 2);\r
581         poly.set(0, x1 + kage.kMinWidthT, y1 + kage.kMinWidthY / 2);\r
582         break;\r
583       case 1:\r
584       case 6: //... no need\r
585       case 22:\r
586         poly.set(3, x1 - kage.kMinWidthT, y1);\r
587         poly.set(0, x1 + kage.kMinWidthT, y1);\r
588         break;\r
589       case 12:\r
590         poly.set(3, x1 - kage.kMinWidthT, y1 - kage.kMinWidthY - kage.kMinWidthT);\r
591         poly.set(0, x1 + kage.kMinWidthT, y1 - kage.kMinWidthY);\r
592         break;\r
593       case 32:\r
594         poly.set(3, x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);\r
595         poly.set(0, x1 + kage.kMinWidthT, y1 - kage.kMinWidthY);\r
596         break;\r
597       }\r
598       \r
599       switch(a2){\r
600       case 0:\r
601         if(a1 == 6){ //KAGI's tail ... no need\r
602           poly.set(2, x2 - kage.kMinWidthT, y2);\r
603           poly.set(1, x2 + kage.kMinWidthT, y2);\r
604         }\r
605         else{\r
606           poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kMinWidthT / 2);\r
607           poly.set(1, x2 + kage.kMinWidthT, y2 - kage.kMinWidthT / 2);\r
608         }\r
609         break;\r
610       case 1:\r
611         poly.set(2, x2 - kage.kMinWidthT, y2);\r
612         poly.set(1, x2 + kage.kMinWidthT, y2);\r
613         break;\r
614       case 13:\r
615         poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kAdjustKakatoL[opt2] + kage.kMinWidthT);\r
616         poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kAdjustKakatoL[opt2]);\r
617         break;\r
618       case 23:\r
619         poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kAdjustKakatoR[opt2] + kage.kMinWidthT);\r
620         poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kAdjustKakatoR[opt2]);\r
621         break;\r
622       case 32:\r
623         poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kMinWidthY);\r
624         poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kMinWidthY);\r
625         break;\r
626       }\r
627       \r
628       polygons.push(poly);\r
629       \r
630       if(a1 == 22){ //box's right top corner\r
631         poly = new Polygon();\r
632         poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);\r
633         poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);\r
634         poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);\r
635         poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);\r
636         poly.push(x1 - kage.kMinWidthT, y1);\r
637         polygons.push(poly);\r
638       }\r
639       \r
640       if(a1 == 0){ //beginning of the stroke\r
641         poly = new Polygon();\r
642         poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthY * 0.5);\r
643         poly.push(x1 + kage.kMinWidthT + kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 0.5 + kage.kMinWidthY);\r
644         poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2);\r
645         polygons.push(poly);\r
646       }\r
647       \r
648       if((a1 == 6 && a2 == 0) || a2 == 1){ //KAGI NO YOKO BOU NO SAIGO NO MARU ... no need only used at 1st=yoko\r
649         poly = new Polygon();\r
650         poly.push(x2 - kage.kMinWidthT, y2);\r
651         poly.push(x2 - kage.kMinWidthT * 0.6, y2 + kage.kMinWidthT * 0.6);\r
652         poly.push(x2, y2 + kage.kMinWidthT);\r
653         poly.push(x2 + kage.kMinWidthT * 0.6, y2 + kage.kMinWidthT * 0.6);\r
654         poly.push(x2 + kage.kMinWidthT, y2);\r
655         poly.reverse(); // for fill-rule\r
656         polygons.push(poly);\r
657       }\r
658     }\r
659     else if(y1 == y2){ //if it is YOKO stroke, use x-axis\r
660       if(a1 == 6){ //if it is KAGI's YOKO stroke, get bold\r
661         poly = new Polygon();\r
662         poly.push(x1, y1 - kage.kMinWidthT);\r
663         poly.push(x2, y2 - kage.kMinWidthT);\r
664         poly.push(x2, y2 + kage.kMinWidthT);\r
665         poly.push(x1, y1 + kage.kMinWidthT);\r
666         polygons.push(poly);\r
667         \r
668         if(a2 == 1 || a2 == 0 || a2 == 5){ // no need a2=1\r
669           //KAGI NO YOKO BOU NO SAIGO NO MARU\r
670           poly = new Polygon();\r
671           poly.push(x2, y2 - kage.kMinWidthT);\r
672           poly.push(x2 + kage.kMinWidthT * 0.6, y2 - kage.kMinWidthT * 0.6);\r
673           poly.push(x2 + kage.kMinWidthT, y2);\r
674           poly.push(x2 + kage.kMinWidthT * 0.6, y2 + kage.kMinWidthT * 0.6);\r
675           poly.push(x2, y2 + kage.kMinWidthT);\r
676           polygons.push(poly);\r
677         }\r
678         \r
679         if(a2 == 5){\r
680           //KAGI NO YOKO BOU NO HANE\r
681           poly = new Polygon();\r
682           poly.push(x2, y2 - kage.kMinWidthT + 1);\r
683           poly.push(x2 + 2, y2 - kage.kMinWidthT - kage.kWidth * 5);\r
684           poly.push(x2, y2 - kage.kMinWidthT - kage.kWidth * 5);\r
685           poly.push(x2 - kage.kMinWidthT, y2 - kage.kMinWidthT + 1);\r
686           poly.reverse(); // for fill-rule\r
687           polygons.push(poly);\r
688         }\r
689       }\r
690       else{\r
691         //always same\r
692         poly = new Polygon(4);\r
693         poly.set(0, x1, y1 - kage.kMinWidthY);\r
694         poly.set(1, x2, y2 - kage.kMinWidthY);\r
695         poly.set(2, x2, y2 + kage.kMinWidthY);\r
696         poly.set(3, x1, y1 + kage.kMinWidthY);\r
697         polygons.push(poly);\r
698         \r
699         //UROKO\r
700         if(a2 == 0){\r
701           poly = new Polygon();\r
702           poly.push(x2, y2 - kage.kMinWidthY);\r
703           poly.push(x2 - kage.kAdjustUrokoX[opt2], y2);\r
704           poly.push(x2 - kage.kAdjustUrokoX[opt2] / 2, y2 - kage.kAdjustUrokoY[opt2]);\r
705           polygons.push(poly);\r
706         }\r
707       }\r
708     }\r
709     else{ //for others, use x-axis\r
710       rad = Math.atan((y2 - y1) / (x2 - x1));\r
711       if((Math.abs(y2 - y1) < Math.abs(x2 - x1)) && (a1 != 6) && (a2 != 6) && !(x1 > x2)){ //ASAI KAUDO\r
712         //always same\r
713         poly = new Polygon(4);\r
714         poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthY, y1 - Math.cos(rad) * kage.kMinWidthY);\r
715         poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthY, y2 - Math.cos(rad) * kage.kMinWidthY);\r
716         poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthY, y2 + Math.cos(rad) * kage.kMinWidthY);\r
717         poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthY, y1 + Math.cos(rad) * kage.kMinWidthY);\r
718         polygons.push(poly);\r
719         \r
720         //UROKO\r
721         if(a2 == 0){\r
722           poly = new Polygon();\r
723           poly.push(x2 + Math.sin(rad) * kage.kMinWidthY, y2 - Math.cos(rad) * kage.kMinWidthY);\r
724           poly.push(x2 - Math.cos(rad) * kage.kAdjustUrokoX[opt2], y2 - Math.sin(rad) * kage.kAdjustUrokoX[opt2]);\r
725           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
726           polygons.push(poly);\r
727         }\r
728       }\r
729       \r
730       else{ //KAKUDO GA FUKAI or KAGI NO YOKO BOU\r
731         if(x1 > x2){ v = -1; } else{ v = 1; }\r
732         poly = new Polygon(4);\r
733         switch(a1){\r
734         case 0:\r
735           poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.cos(rad) * 0.5 * v,\r
736                    y1 - Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.sin(rad) * 0.5 * v);\r
737           poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * 0.5 * v,\r
738                    y1 + Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * 0.5 * v);\r
739           break;\r
740         case 1:\r
741         case 6:\r
742         case 22:\r
743           poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v, y1 - Math.cos(rad) * kage.kMinWidthT * v);\r
744           poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v, y1 + Math.cos(rad) * kage.kMinWidthT * v);\r
745           break;\r
746         case 12:\r
747           poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * v,\r
748                    y1 - Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * v);\r
749           poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v - (kage.kMinWidthT + kage.kMinWidthY) * Math.cos(rad) * v,\r
750                    y1 + Math.cos(rad) * kage.kMinWidthT * v - (kage.kMinWidthT + kage.kMinWidthY) * Math.sin(rad) * v);\r
751           break;\r
752         case 32:\r
753           poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * v,\r
754                    y1 - Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * v);\r
755           poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * v,\r
756                    y1 + Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * v);\r
757           break;\r
758         }\r
759         \r
760         switch(a2){\r
761         case 0:\r
762           if(a1 == 6){\r
763             poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);\r
764             poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);\r
765           }\r
766           else{\r
767             poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthT * 0.5 * Math.cos(rad) * v,\r
768                      y2 - Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthT * 0.5 * Math.sin(rad) * v);\r
769             poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthT * 0.5 * Math.cos(rad) * v,\r
770                      y2 + Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthT * 0.5 * Math.sin(rad) * v);\r
771           }\r
772           break;\r
773         case 1: // is needed?\r
774         case 5:\r
775           poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);\r
776           poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);\r
777           break;\r
778         case 13:\r
779           poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kAdjustKakatoL[opt2] * Math.cos(rad) * v,\r
780                    y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kAdjustKakatoL[opt2] * Math.sin(rad) * v);\r
781           poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v + (kage.kAdjustKakatoL[opt2] + kage.kMinWidthT) * Math.cos(rad) * v,\r
782                    y2 + Math.cos(rad) * kage.kMinWidthT * v + (kage.kAdjustKakatoL[opt2] + kage.kMinWidthT) * Math.sin(rad) * v);\r
783           break;\r
784         case 23:\r
785           poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kAdjustKakatoR[opt2] * Math.cos(rad) * v,\r
786                    y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kAdjustKakatoR[opt2] * Math.sin(rad) * v);\r
787           poly.set(2,\r
788                    x2 - Math.sin(rad) * kage.kMinWidthT * v + (kage.kAdjustKakatoR[opt2] + kage.kMinWidthT) * Math.cos(rad) * v,\r
789                    y2 + Math.cos(rad) * kage.kMinWidthT * v + (kage.kAdjustKakatoR[opt2] + kage.kMinWidthT) * Math.sin(rad) * v);\r
790           break;\r
791         case 32:\r
792           poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.cos(rad) * v,\r
793                    y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.sin(rad) * v);\r
794           poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.cos(rad) * v,\r
795                    y2 + Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.sin(rad) * v);\r
796           break;\r
797         }\r
798         \r
799         polygons.push(poly);\r
800         \r
801         if((a1 == 6) && (a2 == 0 || a2 == 5)){ //KAGI NO YOKO BOU NO SAIGO NO MARU\r
802           poly = new Polygon();\r
803           poly.push(x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);\r
804           poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * 0.8 * v + Math.sin(rad) * kage.kMinWidthT * 0.6 * v,\r
805                     y2 + Math.sin(rad) * kage.kMinWidthT * 0.8 * v - Math.cos(rad) * kage.kMinWidthT * 0.6 * v);\r
806           poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * v, y2 + Math.sin(rad) * kage.kMinWidthT * v);\r
807           poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * 0.8 * v - Math.sin(rad) * kage.kMinWidthT * 0.6 * v,\r
808                     y2 + Math.sin(rad) * kage.kMinWidthT * 0.8 * v + Math.cos(rad) * kage.kMinWidthT * 0.6 * v);\r
809           poly.push(x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);\r
810           polygons.push(poly);\r
811         }\r
812         \r
813         if(a1 == 6 && a2 == 5){\r
814           //KAGI NO YOKO BOU NO HANE\r
815           poly = new Polygon();\r
816           poly.push(x2 + (kage.kMinWidthT - 1) * Math.sin(rad) * v, y2 - (kage.kMinWidthT - 1) * Math.cos(rad) * v);\r
817           poly.push(x2 + 2 * Math.cos(rad) * v + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,\r
818                     y2 + 2 * Math.sin(rad) * v - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);\r
819           poly.push(x2 + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,\r
820                     y2 - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);\r
821           poly.push(x2 + (kage.kMinWidthT - 1) * Math.sin(rad) * v - kage.kMinWidthT * Math.cos(rad) * v,\r
822                     y2 - (kage.kMinWidthT - 1) * Math.cos(rad) * v - kage.kMinWidthT * Math.sin(rad) * v);\r
823           polygons.push(poly);\r
824         }\r
825         \r
826         if(a1 == 22){ //SHIKAKU MIGIUE UROKO NANAME DEMO MASSUGU MUKI\r
827           poly = new Polygon();\r
828           poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);\r
829           poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);\r
830           poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);\r
831           poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);\r
832           poly.push(x1 - kage.kMinWidthT, y1);\r
833           polygons.push(poly);\r
834         }\r
835         \r
836         XX = Math.sin(rad) * v;\r
837         XY = Math.cos(rad) * v * -1;\r
838         YX = Math.cos(rad) * v;\r
839         YY = Math.sin(rad) * v;\r
840         \r
841         if(a1 == 0){ //beginning of the storke\r
842           poly = new Polygon();\r
843           poly.push(x1 + kage.kMinWidthT * XX + (kage.kMinWidthY * 0.5) * YX,\r
844                     y1 + kage.kMinWidthT * XY + (kage.kMinWidthY * 0.5) * YY);\r
845           poly.push(x1 + (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YX,\r
846                     y1 + (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YY);\r
847           poly.push(x1 + kage.kMinWidthT * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YX,\r
848                     y1 + kage.kMinWidthT * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YY);\r
849           polygons.push(poly);\r
850         }\r
851       }\r
852     }\r
853   }\r
854   else{ //gothic\r
855     if(tx1 == tx2){ //if TATE stroke, use y-axis\r
856       if(ty1 > ty2){\r
857         x1 = tx2;\r
858         y1 = ty2;\r
859         x2 = tx1;\r
860         y2 = ty1;\r
861         a1 = ta2;\r
862         a2 = ta1;\r
863       }\r
864       else{\r
865         x1 = tx1;\r
866         y1 = ty1;\r
867         x2 = tx2;\r
868         y2 = ty2;\r
869         a1 = ta1;\r
870         a2 = ta2;\r
871       }\r
872       \r
873       if(a1 % 10 == 2){ y1 = y1 - kage.kWidth; }\r
874       if(a2 % 10 == 2){ y2 = y2 + kage.kWidth; }\r
875       if(a1 % 10 == 3){ y1 = y1 - kage.kWidth * kage.kKakato; }\r
876       if(a2 % 10 == 3){ y2 = y2 + kage.kWidth * kage.kKakato; }\r
877       \r
878       poly = new Polygon();\r
879       poly.push(x1 - kage.kWidth, y1);\r
880       poly.push(x2 - kage.kWidth, y2);\r
881       poly.push(x2 + kage.kWidth, y2);\r
882       poly.push(x1 + kage.kWidth, y1);\r
883       poly.reverse(); // for fill-rule\r
884       \r
885       polygons.push(poly);\r
886     }\r
887     else if(ty1 == ty2){ //if YOKO stroke, use x-axis\r
888       if(tx1 > tx2){\r
889         x1 = tx2;\r
890         y1 = ty2;\r
891         x2 = tx1;\r
892         y2 = ty1;\r
893         a1 = ta2;\r
894         a2 = ta1;\r
895       }\r
896       else{\r
897         x1 = tx1;\r
898         y1 = ty1;\r
899         x2 = tx2;\r
900         y2 = ty2;\r
901         a1 = ta1;\r
902         a2 = ta2;\r
903       }\r
904       if(a1 % 10 == 2){ x1 = x1 - kage.kWidth; }\r
905       if(a2 % 10 == 2){ x2 = x2 + kage.kWidth; }\r
906       if(a1 % 10 == 3){ x1 = x1 - kage.kWidth * kage.kKakato; }\r
907       if(a2 % 10 == 3){ x2 = x2 + kage.kWidth * kage.kKakato; }\r
908       \r
909       poly = new Polygon();\r
910       poly.push(x1, y1 - kage.kWidth);\r
911       poly.push(x2, y2 - kage.kWidth);\r
912       poly.push(x2, y2 + kage.kWidth);\r
913       poly.push(x1, y1 + kage.kWidth);\r
914       \r
915       polygons.push(poly);\r
916     }\r
917     else{ //for others, use x-axis\r
918       if(tx1 > tx2){\r
919         x1 = tx2;\r
920         y1 = ty2;\r
921         x2 = tx1;\r
922         y2 = ty1;\r
923         a1 = ta2;\r
924         a2 = ta1;\r
925       }\r
926       else{\r
927         x1 = tx1;\r
928         y1 = ty1;\r
929         x2 = tx2;\r
930         y2 = ty2;\r
931         a1 = ta1;\r
932         a2 = ta2;\r
933       }\r
934       rad = Math.atan((y2 - y1) / (x2 - x1));\r
935       if(a1 % 10 == 2){\r
936         x1 = x1 - kage.kWidth * Math.cos(rad);\r
937         y1 = y1 - kage.kWidth * Math.sin(rad);\r
938       }\r
939       if(a2 % 10 == 2){\r
940         x2 = x2 + kage.kWidth * Math.cos(rad);\r
941         y2 = y2 + kage.kWidth * Math.sin(rad);\r
942       }\r
943       if(a1 % 10 == 3){\r
944         x1 = x1 - kage.kWidth * Math.cos(rad) * kage.kKakato;\r
945         y1 = y1 - kage.kWidth * Math.sin(rad) * kage.kKakato;\r
946       }\r
947       if(a2 % 10 == 3){\r
948         x2 = x2 + kage.kWidth * Math.cos(rad) * kage.kKakato;\r
949         y2 = y2 + kage.kWidth * Math.sin(rad) * kage.kKakato;\r
950       }\r
951       \r
952       //SUICHOKU NO ICHI ZURASHI HA Math.sin TO Math.cos NO IREKAE + x-axis MAINASU KA\r
953       poly = new Polygon();\r
954       poly.push(x1 + Math.sin(rad) * kage.kWidth, y1 - Math.cos(rad) * kage.kWidth);\r
955       poly.push(x2 + Math.sin(rad) * kage.kWidth, y2 - Math.cos(rad) * kage.kWidth);\r
956       poly.push(x2 - Math.sin(rad) * kage.kWidth, y2 + Math.cos(rad) * kage.kWidth);\r
957       poly.push(x1 - Math.sin(rad) * kage.kWidth, y1 + Math.cos(rad) * kage.kWidth);\r
958       \r
959       polygons.push(poly);\r
960     }\r
961   }\r
962 }\r