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