5 void cdDrawCurve(int x1, int y1,
\r
12 double ix, iy, ia, ib, ir;
\r
16 double XX, XY, YX, YY;
\r
18 if(kShotai == kMincho){ // mincho
\r
22 delta = -1 * kMinWidthY * 0.5;
\r
39 if(y1 < y2){ y1 = y1 - delta; }
\r
40 else{ y1 = y1 + delta; }
\r
43 if(x1 < x2){ x1 = x1 - delta; }
\r
44 else{ x1 = x1 + delta; }
\r
47 rad = atan((double)(y2 - y1) / (double)(x2 - x1));
\r
48 if(x1 < x2){ v = 1; } else{ v = -1; }
\r
49 x1 = x1 - delta * cos(rad) * v;
\r
50 y1 = y1 - delta * sin(rad) * v;
\r
70 if(y2 < y3){ y3 = y3 + delta; }
\r
71 else{ y3 = y3 - delta; }
\r
74 if(x2 < x3){ x3 = x3 + delta; }
\r
75 else{ x3 = x3 - delta; }
\r
78 rad = atan((double)(y3 - y2) / (double)(x3 - x2));
\r
79 if(x2 < x3){ v = 1; } else{ v = -1; }
\r
80 x3 = x3 + delta * cos(rad) * v;
\r
81 y3 = y3 + delta * sin(rad) * v;
\r
86 for(tt = 0; tt <= 1000; tt = tt + kRate){
\r
87 t = (double)(tt) / 1000;
\r
90 x = ((1.0 - t) * (1.0 - t) * x1 + 2.0 * t * (1.0 - t) * x2 + t * t * x3);
\r
91 y = ((1.0 - t) * (1.0 - t) * y1 + 2.0 * t * (1.0 - t) * y2 + t * t * y3);
\r
93 //KATAMUKI of vector by BIBUN
\r
94 ix = (x1 - 2.0 * x2 + x3) * 2.0 * t + (-2.0 * x1 + 2.0 * x2);
\r
95 iy = (y1 - 2.0 * y2 + y3) * 2.0 * t + (-2.0 * y1 + 2.0 * y2);
\r
97 //line SUICHOKU by vector
\r
98 if(ix != 0 && iy != 0){
\r
99 ir = atan(iy / ix * -1);
\r
100 ia = sin(ir) * (double)(kMinWidthT);
\r
101 ib = cos(ir) * (double)(kMinWidthT);
\r
112 if(a1 == 7 && a2 != 17){ deltad = sqrt(t); }
\r
113 else if(a2 == 7 && a1 != 17){ deltad = sqrt(1.0 - t); }
\r
114 else if(a1 == 7 && a2 == 17){ deltad = sqrt(t / 2); }
\r
115 else if(a1 == 17 && a2 != 7){ deltad = sqrt(t / 2 + 0.5); }
\r
116 else if(a1 != 7 && a2 == 17){ deltad = sqrt(1.0 - t / 2); }
\r
117 else if(a1 == 17 && a2 == 7){ deltad = sqrt(0.5 - t / 2); }
\r
118 else{ deltad = 1; }
\r
122 //reverse if vector is going 2nd/3rd quadrants
\r
128 //copy to polygon structuer
\r
129 poly[count].X = x - ia;
\r
130 poly[count].Y = y - ib;
\r
131 poly[(1000 / kRate + 1) * 2 - 1 - count].X = x + ia;
\r
132 poly[(1000 / kRate + 1) * 2 - 1 - count].Y = y + ib;
\r
136 icPolygon(poly, (1000 / kRate + 1) * 2);
\r
138 //process for head of stroke
\r
139 rad = atan((double)(y2 - y1) / (double)(x2 - x1));
\r
140 if(x1 < x2){ v = 1; } else{ v = -1; }
\r
142 XY = cos(rad) * v * -1;
\r
148 poly2[0].X = x1 - kMinWidthT;
\r
150 poly2[1].X = x1 + kMinWidthT;
\r
152 poly2[2].X = x1 - kMinWidthT;
\r
153 poly2[2].Y = y1 - kMinWidthT;
\r
154 icPolygon(poly2, 3);
\r
157 poly2[0].X = x1 - kMinWidthT * XX;
\r
158 poly2[0].Y = y1 - kMinWidthT * XY;
\r
159 poly2[1].X = x1 + kMinWidthT * XX;
\r
160 poly2[1].Y = y1 + kMinWidthT * XY;
\r
161 poly2[2].X = x1 - kMinWidthT * XX - kMinWidthT * YX;
\r
162 poly2[2].Y = y1 - kMinWidthT * XY - kMinWidthT * YY;
\r
163 icPolygon(poly2, 3);
\r
168 if(y1 <= y3){ //from up to bottom
\r
170 poly2[0].X = x1 - kMinWidthT;
\r
172 poly2[1].X = x1 + kMinWidthT;
\r
174 poly2[2].X = x1 - kMinWidthT;
\r
175 poly2[2].Y = y1 - kMinWidthY;
\r
176 icPolygon(poly2, 3);
\r
179 poly2[0].X = x1 - kMinWidthT * XX;
\r
180 poly2[0].Y = y1 - kMinWidthT * XY;
\r
181 poly2[1].X = x1 + kMinWidthT * XX;
\r
182 poly2[1].Y = y1 + kMinWidthT * XY;
\r
183 poly2[2].X = x1 - kMinWidthT * XX - kMinWidthY * YX;
\r
184 poly2[2].Y = y1 - kMinWidthT * XY - kMinWidthY * YY;
\r
185 icPolygon(poly2, 3);
\r
188 else{ //bottom to up
\r
189 if(x1 == x2){ //is it right?
\r
190 poly2[0].X = x1 - kMinWidthT;
\r
192 poly2[1].X = x1 + kMinWidthT;
\r
194 poly2[2].X = x1 - kMinWidthT;
\r
195 poly2[2].Y = y1 + kMinWidthY;
\r
196 icPolygon(poly2, 3);
\r
199 poly2[0].X = x1 - kMinWidthT * XX;
\r
200 poly2[0].Y = y1 - kMinWidthT * XY;
\r
201 poly2[1].X = x1 + kMinWidthT * XX;
\r
202 poly2[1].Y = y1 + kMinWidthT * XY;
\r
203 poly2[2].X = x1 + kMinWidthT * XX - kMinWidthY * YX;
\r
204 poly2[2].Y = y1 + kMinWidthT * XY - kMinWidthY * YY;
\r
205 icPolygon(poly2, 3);
\r
210 if(a1 == 22){ //box's up-right corner, any time same degree
\r
211 poly3[0].X = x1 - kMinWidthT;
\r
212 poly3[0].Y = y1 - kMinWidthY;
\r
214 poly3[1].Y = y1 - kMinWidthY - kWidth;
\r
215 poly3[2].X = x1 + kMinWidthT + kWidth;
\r
216 poly3[2].Y = y1 + kMinWidthY;
\r
217 poly3[3].X = x1 + kMinWidthT;
\r
218 poly3[3].Y = y1 + kMinWidthT;
\r
219 poly3[4].X = x1 - kMinWidthT;
\r
221 icPolygon(poly3, 5);
\r
224 if(a1 == 0){ //beginning of the stroke
\r
225 if(y1 <= y3){ //from up to bottom
\r
227 poly2[0].X = x1 + kMinWidthT;
\r
228 poly2[0].Y = y1 + kMinWidthY * 0.5;
\r
229 poly2[1].X = x1 + kMinWidthT + kMinWidthT * 0.5;
\r
230 poly2[1].Y = y1 + kMinWidthY * 0.5 + kMinWidthY;
\r
231 poly2[2].X = x1 + kMinWidthT;
\r
232 poly2[2].Y = y1 + kMinWidthY * 0.5 + kMinWidthY * 2;
\r
233 icPolygon(poly2, 3);
\r
236 poly2[0].X = x1 + kMinWidthT * XX + (kMinWidthY * 0.5) * YX;
\r
237 poly2[0].Y = y1 + kMinWidthT * XY + (kMinWidthY * 0.5) * YY;
\r
238 poly2[1].X = x1 + (kMinWidthT + kMinWidthT * 0.5) * XX + (kMinWidthY * 0.5 + kMinWidthY) * YX;
\r
239 poly2[1].Y = y1 + (kMinWidthT + kMinWidthT * 0.5) * XY + (kMinWidthY * 0.5 + kMinWidthY) * YY;
\r
240 poly2[2].X = x1 + kMinWidthT * XX + (kMinWidthY * 0.5 + kMinWidthY * 2) * YX;
\r
241 poly2[2].Y = y1 + kMinWidthT * XY + (kMinWidthY * 0.5 + kMinWidthY * 2) * YY;
\r
242 icPolygon(poly2, 3);
\r
245 else{ //from bottom to up
\r
246 if(x1 == x2){ //is it right?
\r
247 poly2[0].X = x1 + kMinWidthT;
\r
248 poly2[0].Y = y1 - kMinWidthY * 0.5;
\r
249 poly2[1].X = x1 + kMinWidthT + kMinWidthT * 0.5;
\r
250 poly2[1].Y = y1 - kMinWidthY * 0.5 - kMinWidthY;
\r
251 poly2[2].X = x1 + kMinWidthT;
\r
252 poly2[2].Y = y1 - kMinWidthY * 0.5 - kMinWidthY * 2;
\r
253 icPolygon(poly2, 3);
\r
255 else //SETSUGOUMEN GA KAKERUNODE HOKYOU
\r
256 poly3[0].X = x1 - (kMinWidthT - 1) * XX + (kMinWidthY * 0.5) * YX;
\r
257 poly3[0].Y = y1 - (kMinWidthT - 1) * XY + (kMinWidthY * 0.5) * YY;
\r
258 poly3[1].X = x1 - (kMinWidthT - 0) * XX + (kMinWidthY * 0.5) * YX;
\r
259 poly3[1].Y = y1 - (kMinWidthT - 0) * XY + (kMinWidthY * 0.5) * YY;
\r
260 poly3[2].X = x1 - (kMinWidthT + kMinWidthT * 0.5) * XX + (kMinWidthY * 0.5 + kMinWidthY) * YX;
\r
261 poly3[2].Y = y1 - (kMinWidthT + kMinWidthT * 0.5) * XY + (kMinWidthY * 0.5 + kMinWidthY) * YY;
\r
262 poly3[3].X = x1 - (kMinWidthT - 0) * XX + (kMinWidthY * 0.5 + kMinWidthY * 2) * YX;
\r
263 poly3[3].Y = y1 - (kMinWidthT - 0) * XY + (kMinWidthY * 0.5 + kMinWidthY * 2) * YY;
\r
264 poly3[4].X = x1 - (kMinWidthT - 1) * XX + (kMinWidthY * 0.5 + kMinWidthY * 2) * YX;
\r
265 poly3[4].Y = y1 - (kMinWidthT - 1) * XY + (kMinWidthY * 0.5 + kMinWidthY * 2) * YY;
\r
266 icPolygon(poly3, 5);
\r
271 rad = atan((double)(y3 - y2) / (double)(x3 - x2));
\r
272 if(x2 < x3){ v = 1; } else{ v = -1; }
\r
273 YX = sin(rad) * v * -1;
\r
278 if(a2 == 1 || a2 == 8 || a2 == 15){ //the last filled circle
\r
280 poly3[0].X = x3 - kMinWidthT;
\r
282 poly3[1].X = x3 - kMinWidthT * 0.6;
\r
283 poly3[1].Y = y3 + kMinWidthT * 0.6;
\r
285 poly3[2].Y = y3 + kMinWidthT;
\r
286 poly3[3].X = x3 + kMinWidthT * 0.6;
\r
287 poly3[3].Y = y3 + kMinWidthT * 0.6;
\r
288 poly3[4].X = x3 + kMinWidthT;
\r
290 icPolygon(poly3, 5);
\r
294 poly3[0].Y = y3 - kMinWidthT;
\r
295 poly3[1].X = x3 + kMinWidthT * 0.6;
\r
296 poly3[1].Y = y3 - kMinWidthT * 0.6;
\r
297 poly3[2].X = x3 + kMinWidthT;
\r
299 poly3[3].X = x3 + kMinWidthT * 0.6;
\r
300 poly3[3].Y = y3 + kMinWidthT * 0.6;
\r
302 poly3[4].Y = y3 + kMinWidthT;
\r
303 icPolygon(poly3, 5);
\r
306 poly3[0].X = x3 + sin(rad) * kMinWidthT * v;
\r
307 poly3[0].Y = y3 - cos(rad) * kMinWidthT * v;
\r
308 poly3[1].X = x3 + cos(rad) * kMinWidthT * 0.8 * v + sin(rad) * kMinWidthT * 0.6 * v;
\r
309 poly3[1].Y = y3 + sin(rad) * kMinWidthT * 0.8 * v - cos(rad) * kMinWidthT * 0.6 * v;
\r
310 poly3[2].X = x3 + cos(rad) * kMinWidthT * v;
\r
311 poly3[2].Y = y3 + sin(rad) * kMinWidthT * v;
\r
312 poly3[3].X = x3 + cos(rad) * kMinWidthT * 0.8 * v - sin(rad) * kMinWidthT * 0.6 * v;
\r
313 poly3[3].Y = y3 + sin(rad) * kMinWidthT * 0.8 * v + cos(rad) * kMinWidthT * 0.6 * v;
\r
314 poly3[4].X = x3 - sin(rad) * kMinWidthT * v;
\r
315 poly3[4].Y = y3 + cos(rad) * kMinWidthT * v;
\r
316 icPolygon(poly3, 5);
\r
320 if(a2 == 17){ //the last filled half circle
\r
322 poly3[0].X = x3 - kMinWidthT * 0.5;
\r
324 poly3[1].X = x3 - kMinWidthT * 0.6 * 0.5;
\r
325 poly3[1].Y = y3 + kMinWidthT * 0.6 * 0.5;
\r
327 poly3[2].Y = y3 + kMinWidthT * 0.5;
\r
328 poly3[3].X = x3 + kMinWidthT * 0.6 * 0.5;
\r
329 poly3[3].Y = y3 + kMinWidthT * 0.6 * 0.5;
\r
330 poly3[4].X = x3 + kMinWidthT * 0.5;
\r
332 icPolygon(poly3, 5);
\r
336 poly3[0].Y = y3 - kMinWidthT * 0.5;
\r
337 poly3[1].X = x3 + kMinWidthT * 0.6 * 0.5;
\r
338 poly3[1].Y = y3 - kMinWidthT * 0.6 * 0.5;
\r
339 poly3[2].X = x3 + kMinWidthT * 0.5;
\r
341 poly3[3].X = x3 + kMinWidthT * 0.6 * 0.5;
\r
342 poly3[3].Y = y3 + kMinWidthT * 0.6 * 0.5;
\r
344 poly3[4].Y = y3 + kMinWidthT * 0.5;
\r
345 icPolygon(poly3, 5);
\r
348 poly3[0].X = x3 + sin(rad) * kMinWidthT * 0.5 * v;
\r
349 poly3[0].Y = y3 - cos(rad) * kMinWidthT * 0.5 * v;
\r
350 poly3[1].X = x3 + cos(rad) * kMinWidthT * 0.8 * 0.5 * v + sin(rad) * kMinWidthT * 0.6 * 0.5 * v;
\r
351 poly3[1].Y = y3 + sin(rad) * kMinWidthT * 0.8 * 0.5 * v - cos(rad) * kMinWidthT * 0.6 * 0.5 * v;
\r
352 poly3[2].X = x3 + cos(rad) * kMinWidthT * 0.5 * v;
\r
353 poly3[2].Y = y3 + sin(rad) * kMinWidthT * 0.5 * v;
\r
354 poly3[3].X = x3 + cos(rad) * kMinWidthT * 0.5 * 0.8 * v - sin(rad) * kMinWidthT * 0.6 * 0.5 * v;
\r
355 poly3[3].Y = y3 + sin(rad) * kMinWidthT * 0.5 * 0.8 * v + cos(rad) * kMinWidthT * 0.6 * 0.5 * v;
\r
356 poly3[4].X = x3 - sin(rad) * kMinWidthT * 0.5 * v;
\r
357 poly3[4].Y = y3 + cos(rad) * kMinWidthT * 0.5 * v;
\r
358 icPolygon(poly3, 5);
\r
365 poly2[0].Y = y3 + kMinWidthT;
\r
367 poly2[1].Y = y3 - kMinWidthT;
\r
368 poly2[2].X = x3 + kMinWidthT;
\r
369 poly2[2].Y = y3 - kMinWidthT;
\r
370 icPolygon(poly2, 3);
\r
373 poly2[0].X = x3 + kMinWidthT * YX;
\r
374 poly2[0].Y = y3 + kMinWidthT * YY;
\r
375 poly2[1].X = x3 - kMinWidthT * YX;
\r
376 poly2[1].Y = y3 - kMinWidthT * YY;
\r
377 poly2[2].X = x3 + kMinWidthT * XX - kMinWidthT * YX;
\r
378 poly2[2].Y = y3 + kMinWidthT * XY - kMinWidthT * YY;
\r
379 icPolygon(poly2, 3);
\r
383 if(a2 == 15){ //jump up
\r
386 poly4[0].Y = y3 - kMinWidthT + 1;
\r
387 poly4[1].X = x3 + 2;
\r
388 poly4[1].Y = y3 - kMinWidthT - kWidth * 5;
\r
390 poly4[2].Y = y3 - kMinWidthT - kWidth * 5;
\r
391 poly4[3].X = x3 - kMinWidthT;
\r
392 poly4[3].Y = y3 - kMinWidthT + 1;
\r
393 icPolygon(poly4, 4);
\r
396 poly4[0].X = x3 + (kMinWidthT - 1) * sin(rad) * v;
\r
397 poly4[0].Y = y3 - (kMinWidthT - 1) * cos(rad) * v;
\r
398 poly4[1].X = x3 + 2 * cos(rad) * v + (kMinWidthT + kWidth * 5) * sin(rad) * v;
\r
399 poly4[1].Y = y3 + 2 * sin(rad) * v - (kMinWidthT + kWidth * 5) * cos(rad) * v;
\r
400 poly4[2].X = x3 + (kMinWidthT + kWidth * 5) * sin(rad) * v;
\r
401 poly4[2].Y = y3 - (kMinWidthT + kWidth * 5) * cos(rad) * v;
\r
402 poly4[3].X = x3 + (kMinWidthT - 1) * sin(rad) * v - kMinWidthT * cos(rad) * v;
\r
403 poly4[3].Y = y3 - (kMinWidthT - 1) * cos(rad) * v - kMinWidthT * sin(rad) * v;
\r
404 icPolygon(poly4, 4);
\r
408 if(a2 == 14){ //jump to left, allways go left
\r
412 poly4[1].Y = y3 - kMinWidthT;
\r
413 poly4[2].X = x3 - kWidth * 4;
\r
414 poly4[2].Y = y3 - kMinWidthT;
\r
415 poly4[3].X = x3 - kWidth * 4;
\r
416 poly4[3].Y = y3 - kMinWidthT * 0.5;
\r
417 icPolygon(poly4, 4);
\r
423 if(y1 < y2){ y1 = y1 - kWidth; } else{ y1 = y1 + kWidth; }
\r
426 if(x1 < x2){ x1 = x1 - kWidth; } else{ x1 = x1 + kWidth; }
\r
429 rad = atan((double)(y2 - y1) / (double)(x2 - x1));
\r
430 if(x1 < x2){ v = 1; } else{ v = -1; }
\r
431 x1 = x1 - kWidth * cos(rad) * v;
\r
432 y1 = y1 - kWidth * sin(rad) * v;
\r
439 y1 = y1 - kWidth * kKakato;
\r
442 y1 = y1 + kWidth * kKakato;
\r
447 x1 = x1 - kWidth * kKakato;
\r
450 x1 = x1 + kWidth * kKakato;
\r
454 rad = atan((double)(y2 - y1) / (double)(x2 - x1));
\r
455 if(x1 < x2){ v = 1; } else{ v = -1; }
\r
456 x1 = x1 - kWidth * cos(rad) * v * kKakato;
\r
457 y1 = y1 - kWidth * sin(rad) * v * kKakato;
\r
462 if(y2 < y3){ y3 = y3 + kWidth; } else{ y3 = y3 - kWidth; }
\r
465 if(x2 < x3){ x3 = x3 + kWidth; } else{ x3 = x3 - kWidth; }
\r
468 rad = atan((double)(y3 - y2) / (double)(x3 - x2));
\r
469 if(x2 < x3){ v = 1; } else{ v = -1; }
\r
470 x3 = x3 + kWidth * cos(rad) * v;
\r
471 y3 = y3 + kWidth * sin(rad) * v;
\r
478 y3 = y3 + kWidth * kKakato;
\r
481 y3 = y3 - kWidth * kKakato;
\r
486 x3 = x3 + kWidth * kKakato;
\r
489 x3 = x3 - kWidth * kKakato;
\r
493 rad = atan((double)(y3 - y2) / (double)(x3 - x2));
\r
494 if(x2 < x3){ v = 1; } else{ v = -1; }
\r
495 x3 = x3 + kWidth * cos(rad) * v * kKakato;
\r
496 y3 = y3 + kWidth * sin(rad) * v * kKakato;
\r
502 for(tt = 0; tt <= 1000; tt = tt + kRate){
\r
503 t = (double)tt / 1000;
\r
505 //calculating each point
\r
506 x = ((1.0 - t) * (1.0 - t) * x1 + 2.0 * t * (1.0 - t) * x2 + t * t * x3);
\r
507 y = ((1.0 - t) * (1.0 - t) * y1 + 2.0 * t * (1.0 - t) * y2 + t * t * y3);
\r
509 //SESSEN NO KATAMUKI NO KEISAN(BIBUN)
\r
510 ix = (x1 - 2.0 * x2 + x3) * 2.0 * t + (-2.0 * x1 + 2.0 * x2);
\r
511 iy = (y1 - 2.0 * y2 + y3) * 2.0 * t + (-2.0 * y1 + 2.0 * y2);
\r
513 //SESSEN NI SUICHOKU NA CHOKUSEN NO KEISAN
\r
514 if(kShotai == kMincho){ //always false ?
\r
515 if(ix != 0 && iy != 0){
\r
516 ir = atan(iy / ix * -1.0);
\r
517 ia = sin(ir) * (double)kMinWidthT;
\r
518 ib = cos(ir) * (double)kMinWidthT;
\r
528 ia = ia * sqrt(1.0 - t);
\r
529 ib = ib * sqrt(1.0 - t);
\r
532 if(ix != 0 && iy != 0){
\r
533 ir = atan(iy / ix * -1.0);
\r
534 ia = sin(ir) * (double)kWidth;
\r
535 ib = cos(ir) * (double)kWidth;
\r
547 //reverse if vector is going 2nd/3rd quadrants
\r
554 poly[count].X = x - ia;
\r
555 poly[count].Y = y - ib;
\r
556 poly[(1000 / kRate + 1) * 2 - 1 - count].X = x + ia;
\r
557 poly[(1000 / kRate + 1) * 2 - 1 - count].Y = y + ib;
\r
561 icPolygon(poly, (1000 / kRate + 1) * 2);
\r
565 void cdDrawLine(int tx1, int ty1, int tx2, int ty2, int ta1, int ta2){
\r
567 int v, x1, y1, x2, y2, a1, a2;
\r
568 double XX, XY, YX, YY;
\r
570 if(kShotai == kMincho){ //mincho
\r
578 if(x1 == x2){ //if TATE stroke, use y-axis
\r
581 poly[3].X = x1 - kMinWidthT;
\r
582 poly[3].Y = y1 - kMinWidthY / 2;
\r
583 poly[0].X = x1 + kMinWidthT;
\r
584 poly[0].Y = y1 + kMinWidthY / 2;
\r
589 poly[3].X = x1 - kMinWidthT;
\r
591 poly[0].X = x1 + kMinWidthT;
\r
595 poly[3].X = x1 - kMinWidthT;
\r
596 poly[3].Y = y1 - kMinWidthY - kMinWidthT;
\r
597 poly[0].X = x1 + kMinWidthT;
\r
598 poly[0].Y = y1 - kMinWidthY;
\r
601 poly[3].X = x1 - kMinWidthT;
\r
602 poly[3].Y = y1 - kMinWidthY;
\r
603 poly[0].X = x1 + kMinWidthT;
\r
604 poly[0].Y = y1 - kMinWidthY;
\r
610 if(a1 == 6){ //KAGI's tail
\r
611 poly[2].X = x2 - kMinWidthT;
\r
613 poly[1].X = x2 + kMinWidthT;
\r
617 poly[2].X = x2 - kMinWidthT;
\r
618 poly[2].Y = y2 + kMinWidthT / 2;
\r
619 poly[1].X = x2 + kMinWidthT;
\r
620 poly[1].Y = y2 - kMinWidthT / 2;
\r
624 poly[2].X = x2 - kMinWidthT;
\r
626 poly[1].X = x2 + kMinWidthT;
\r
630 poly[2].X = x2 - kMinWidthT;
\r
631 poly[2].Y = y2 + kWidth * kKakato + kMinWidthT;
\r
632 poly[1].X = x2 + kMinWidthT;
\r
633 poly[1].Y = y2 + kWidth * kKakato;
\r
636 poly[2].X = x2 - kMinWidthT;
\r
637 poly[2].Y = y2 + kWidth * kKakato * 0.5 + kMinWidthT;
\r
638 poly[1].X = x2 + kMinWidthT;
\r
639 poly[1].Y = y2 + kWidth * kKakato * 0.5;
\r
642 poly[2].X = x2 - kMinWidthT;
\r
643 poly[2].Y = y2 + kMinWidthY;
\r
644 poly[1].X = x2 + kMinWidthT;
\r
645 poly[1].Y = y2 + kMinWidthY;
\r
649 icPolygon(poly, 4);
\r
651 if(a1 == 22){ //box's right top corner
\r
652 poly3[0].X = x1 - kMinWidthT;
\r
653 poly3[0].Y = y1 - kMinWidthY;
\r
655 poly3[1].Y = y1 - kMinWidthY - kWidth;
\r
656 poly3[2].X = x1 + kMinWidthT + kWidth;
\r
657 poly3[2].Y = y1 + kMinWidthY;
\r
658 poly3[3].X = x1 + kMinWidthT;
\r
659 poly3[3].Y = y1 + kMinWidthT;
\r
660 poly3[4].X = x1 - kMinWidthT;
\r
662 icPolygon(poly3, 5);
\r
665 if(a1 == 0){ //beginning of the stroke
\r
666 poly2[0].X = x1 + kMinWidthT;
\r
667 poly2[0].Y = y1 + kMinWidthY * 0.5;
\r
668 poly2[1].X = x1 + kMinWidthT + kMinWidthT * 0.5;
\r
669 poly2[1].Y = y1 + kMinWidthY * 0.5 + kMinWidthY;
\r
670 poly2[2].X = x1 + kMinWidthT;
\r
671 poly2[2].Y = y1 + kMinWidthY * 0.5 + kMinWidthY * 2;
\r
672 icPolygon(poly2, 3);
\r
675 if((a1 == 6 && a2 == 0) || a2 == 1){ //KAGI NO YOKO BOU NO SAIGO NO MARU
\r
676 poly3[4].X = x2 - kMinWidthT;
\r
678 poly3[3].X = x2 - kMinWidthT * 0.6;
\r
679 poly3[3].Y = y2 + kMinWidthT * 0.6;
\r
681 poly3[2].Y = y2 + kMinWidthT;
\r
682 poly3[1].X = x2 + kMinWidthT * 0.6;
\r
683 poly3[1].Y = y2 + kMinWidthT * 0.6;
\r
684 poly3[0].X = x2 + kMinWidthT;
\r
686 icPolygon(poly3, 5);
\r
689 else if(y1 == y2){ //if it is YOKO stroke, use x-axis
\r
690 if(a1 == 6){ //if it is KAGI's YOKO stroke, get bold
\r
692 poly[0].Y = y1 - kMinWidthT;
\r
694 poly[1].Y = y2 - kMinWidthT;
\r
696 poly[2].Y = y2 + kMinWidthT;
\r
698 poly[3].Y = y1 + kMinWidthT;
\r
699 icPolygon(poly, 4);
\r
701 if(a2 == 1 || a2 == 0 || a2 == 5){
\r
702 //KAGI NO YOKO BOU NO SAIGO NO MARU
\r
704 poly3[0].Y = y2 - kMinWidthT;
\r
705 poly3[1].X = x2 + kMinWidthT * 0.6;
\r
706 poly3[1].Y = y2 - kMinWidthT * 0.6;
\r
707 poly3[2].X = x2 + kMinWidthT;
\r
709 poly3[3].X = x2 + kMinWidthT * 0.6;
\r
710 poly3[3].Y = y2 + kMinWidthT * 0.6;
\r
712 poly3[4].Y = y2 + kMinWidthT;
\r
713 icPolygon(poly3, 5);
\r
717 //KAGI NO YOKO BOU NO HANE
\r
719 poly[0].Y = y2 - kMinWidthT + 1;
\r
720 poly[1].X = x2 + 2;
\r
721 poly[1].Y = y2 - kMinWidthT - kWidth * 5;
\r
723 poly[2].Y = y2 - kMinWidthT - kWidth * 5;
\r
724 poly[3].X = x2 - kMinWidthT;
\r
725 poly[3].Y = y2 - kMinWidthT + 1;
\r
726 icPolygon(poly, 4);
\r
733 poly[0].Y = y1 - kMinWidthY;
\r
735 poly[3].Y = y1 + kMinWidthY;
\r
738 poly[0].X = x1 - kMinWidthT;
\r
739 poly[0].Y = y1 - kMinWidthY;
\r
740 poly[3].X = x1 - kMinWidthT;
\r
741 poly[3].Y = y1 + kMinWidthY;
\r
748 poly[1].Y = y2 - kMinWidthY;
\r
750 poly[2].Y = y2 + kMinWidthY;
\r
753 poly[1].X = x2 + kMinWidthT;
\r
754 poly[1].Y = y2 - kMinWidthY;
\r
755 poly[2].X = x2 + kMinWidthT;
\r
756 poly[2].Y = y2 + kMinWidthY;
\r
759 icPolygon(poly, 4);
\r
764 poly2[0].Y = y2 - kMinWidthY;
\r
765 poly2[1].X = x2 - 24;
\r
767 poly2[2].X = x2 - 12;
\r
768 poly2[2].Y = y2 - 12;
\r
769 icPolygon(poly2, 3);
\r
773 else{ //for others, use x-axis
\r
774 rad = atan((double)(y2 - y1) / (double)(x2 - x1));
\r
775 if((abs(y2 - y1) < abs(x2 - x1)) && (a1 != 6) && (a2 != 6)){ //ASAI KAUDO
\r
776 switch(a1){ //must be 0 or 2
\r
778 poly[0].X = x1 + sin(rad) * kMinWidthY;
\r
779 poly[0].Y = y1 - cos(rad) * kMinWidthY;
\r
780 poly[3].X = x1 - sin(rad) * kMinWidthY;
\r
781 poly[3].Y = y1 + cos(rad) * kMinWidthY;
\r
784 poly[0].X = x1 + sin(rad) * kMinWidthY - kMinWidthT * cos(rad);
\r
785 poly[0].Y = y1 - cos(rad) * kMinWidthY - kMinWidthT * sin(rad);
\r
786 poly[3].X = x1 - sin(rad) * kMinWidthY - kMinWidthT * cos(rad);
\r
787 poly[3].Y = y1 + cos(rad) * kMinWidthY - kMinWidthT * sin(rad);
\r
791 switch(a2){ //must be 0 or 2
\r
793 poly[1].X = x2 + sin(rad) * kMinWidthY;
\r
794 poly[1].Y = y2 - cos(rad) * kMinWidthY;
\r
795 poly[2].X = x2 - sin(rad) * kMinWidthY;
\r
796 poly[2].Y = y2 + cos(rad) * kMinWidthY;
\r
799 poly[1].X = x2 + sin(rad) * kMinWidthY + kMinWidthT * cos(rad);
\r
800 poly[1].Y = y2 - cos(rad) * kMinWidthY + kMinWidthT * sin(rad);
\r
801 poly[2].X = x2 - sin(rad) * kMinWidthY + kMinWidthT * cos(rad);
\r
802 poly[2].Y = y2 + cos(rad) * kMinWidthY + kMinWidthT * sin(rad);
\r
805 icPolygon(poly, 4);
\r
809 poly2[0].X = x2 + sin(rad) * kMinWidthY;
\r
810 poly2[0].Y = y2 - cos(rad) * kMinWidthY;
\r
811 poly2[1].X = x2 - cos(rad) * 24;
\r
812 poly2[1].Y = y2 - sin(rad) * 24;
\r
813 poly2[2].X = x2 - cos(rad) * 12 + sin(rad) * 12;
\r
814 poly2[2].Y = y2 - sin(rad) * 12 - cos(rad) * 12;
\r
815 icPolygon(poly2, 3);
\r
819 else{ //KAKUDO GA FUKAI or KAGI NO YOKO BOU
\r
820 if(x1 > x2){ v = -1; } else{ v = 1; }
\r
823 poly[0].X = x1 + sin(rad) * kMinWidthT * v + kMinWidthY * cos(rad) * 0.5 * v;
\r
824 poly[0].Y = y1 - cos(rad) * kMinWidthT * v + kMinWidthY * sin(rad) * 0.5 * v;
\r
825 poly[3].X = x1 - sin(rad) * kMinWidthT * v - kMinWidthY * cos(rad) * 0.5 * v;
\r
826 poly[3].Y = y1 + cos(rad) * kMinWidthT * v - kMinWidthY * sin(rad) * 0.5 * v;
\r
831 poly[0].X = x1 + sin(rad) * kMinWidthT * v;
\r
832 poly[0].Y = y1 - cos(rad) * kMinWidthT * v;
\r
833 poly[3].X = x1 - sin(rad) * kMinWidthT * v;
\r
834 poly[3].Y = y1 + cos(rad) * kMinWidthT * v;
\r
837 poly[0].X = x1 + sin(rad) * kMinWidthT * v - kMinWidthY * cos(rad) * v;
\r
838 poly[0].Y = y1 - cos(rad) * kMinWidthT * v - kMinWidthY * sin(rad) * v;
\r
839 poly[3].X = x1 - sin(rad) * kMinWidthT * v - (kMinWidthT + kMinWidthY) * cos(rad) * v;
\r
840 poly[3].Y = y1 + cos(rad) * kMinWidthT * v - (kMinWidthT + kMinWidthY) * sin(rad) * v;
\r
843 poly[0].X = x1 + sin(rad) * kMinWidthT * v - kMinWidthY * cos(rad) * v;
\r
844 poly[0].Y = y1 - cos(rad) * kMinWidthT * v - kMinWidthY * sin(rad) * v;
\r
845 poly[3].X = x1 - sin(rad) * kMinWidthT * v - kMinWidthY * cos(rad) * v;
\r
846 poly[3].Y = y1 + cos(rad) * kMinWidthT * v - kMinWidthY * sin(rad) * v;
\r
853 poly[1].X = x2 + sin(rad) * kMinWidthT * v;
\r
854 poly[1].Y = y2 - cos(rad) * kMinWidthT * v;
\r
855 poly[2].X = x2 - sin(rad) * kMinWidthT * v;
\r
856 poly[2].Y = y2 + cos(rad) * kMinWidthT * v;
\r
859 poly[1].X = x2 + sin(rad) * kMinWidthT * v - kMinWidthT * 0.5 * cos(rad) * v;
\r
860 poly[1].Y = y2 - cos(rad) * kMinWidthT * v - kMinWidthT * 0.5 * sin(rad) * v;
\r
861 poly[2].X = x2 - sin(rad) * kMinWidthT * v + kMinWidthT * 0.5 * cos(rad) * v;
\r
862 poly[2].Y = y2 + cos(rad) * kMinWidthT * v + kMinWidthT * 0.5 * sin(rad) * v;
\r
867 poly[1].X = x2 + sin(rad) * kMinWidthT * v;
\r
868 poly[1].Y = y2 - cos(rad) * kMinWidthT * v;
\r
869 poly[2].X = x2 - sin(rad) * kMinWidthT * v;
\r
870 poly[2].Y = y2 + cos(rad) * kMinWidthT * v;
\r
873 poly[1].X = x2 + sin(rad) * kMinWidthT * v + kWidth * kKakato * cos(rad) * v;
\r
874 poly[1].Y = y2 - cos(rad) * kMinWidthT * v + kWidth * kKakato * sin(rad) * v;
\r
875 poly[2].X = x2 - sin(rad) * kMinWidthT * v + (kWidth * kKakato + kMinWidthT) * cos(rad) * v;
\r
876 poly[2].Y = y2 + cos(rad) * kMinWidthT * v + (kWidth * kKakato + kMinWidthT) * sin(rad) * v;
\r
879 poly[1].X = x2 + sin(rad) * kMinWidthT * v + kWidth * kKakato * 0.5 * cos(rad) * v;
\r
880 poly[1].Y = y2 - cos(rad) * kMinWidthT * v + kWidth * kKakato * 0.5 * sin(rad) * v;
\r
881 poly[2].X = x2 - sin(rad) * kMinWidthT * v + (kWidth * kKakato * 0.5 + kMinWidthT) * cos(rad) * v;
\r
882 poly[2].Y = y2 + cos(rad) * kMinWidthT * v + (kWidth * kKakato * 0.5 + kMinWidthT) * sin(rad) * v;
\r
885 poly[1].X = x2 + sin(rad) * kMinWidthT * v + kMinWidthY * cos(rad) * v;
\r
886 poly[1].Y = y2 - cos(rad) * kMinWidthT * v + kMinWidthY * sin(rad) * v;
\r
887 poly[2].X = x2 - sin(rad) * kMinWidthT * v + kMinWidthY * cos(rad) * v;
\r
888 poly[2].Y = y2 + cos(rad) * kMinWidthT * v + kMinWidthY * sin(rad) * v;
\r
892 icPolygon(poly, 4);
\r
894 if((a1 == 6) && (a2 == 0 || a2 == 5)){ //KAGI NO YOKO BOU NO SAIGO NO MARU
\r
895 poly3[0].X = x2 + sin(rad) * kMinWidthT * v;
\r
896 poly3[0].Y = y2 - cos(rad) * kMinWidthT * v;
\r
897 poly3[1].X = x2 + cos(rad) * kMinWidthT * 0.8 * v + sin(rad) * kMinWidthT * 0.6 * v;
\r
898 poly3[1].Y = y2 + sin(rad) * kMinWidthT * 0.8 * v - cos(rad) * kMinWidthT * 0.6 * v;
\r
899 poly3[2].X = x2 + cos(rad) * kMinWidthT * v;
\r
900 poly3[2].Y = y2 + sin(rad) * kMinWidthT * v;
\r
901 poly3[3].X = x2 + cos(rad) * kMinWidthT * 0.8 * v - sin(rad) * kMinWidthT * 0.6 * v;
\r
902 poly3[3].Y = y2 + sin(rad) * kMinWidthT * 0.8 * v + cos(rad) * kMinWidthT * 0.6 * v;
\r
903 poly3[4].X = x2 - sin(rad) * kMinWidthT * v;
\r
904 poly3[4].Y = y2 + cos(rad) * kMinWidthT * v;
\r
905 icPolygon(poly3, 5);
\r
908 if(a1 == 6 && a2 == 5){
\r
909 //KAGI NO YOKO BOU NO HANE
\r
910 poly[0].X = x2 + (kMinWidthT - 1) * sin(rad) * v;
\r
911 poly[0].Y = y2 - (kMinWidthT - 1) * cos(rad) * v;
\r
912 poly[1].X = x2 + 2 * cos(rad) * v + (kMinWidthT + kWidth * 5) * sin(rad) * v;
\r
913 poly[1].Y = y2 + 2 * sin(rad) * v - (kMinWidthT + kWidth * 5) * cos(rad) * v;
\r
914 poly[2].X = x2 + (kMinWidthT + kWidth * 5) * sin(rad) * v;
\r
915 poly[2].Y = y2 - (kMinWidthT + kWidth * 5) * cos(rad) * v;
\r
916 poly[3].X = x2 + (kMinWidthT - 1) * sin(rad) * v - kMinWidthT * cos(rad) * v;
\r
917 poly[3].Y = y2 - (kMinWidthT - 1) * cos(rad) * v - kMinWidthT * sin(rad) * v;
\r
918 icPolygon(poly, 4);
\r
921 if(a1 == 22){ //SHIKAKU MIGIUE UROKO NANAME DEMO MASSUGU MUKI
\r
922 poly3[0].X = x1 - kMinWidthT;
\r
923 poly3[0].Y = y1 - kMinWidthY;
\r
925 poly3[1].Y = y1 - kMinWidthY - kWidth;
\r
926 poly3[2].X = x1 + kMinWidthT + kWidth;
\r
927 poly3[2].Y = y1 + kMinWidthY;
\r
928 poly3[3].X = x1 + kMinWidthT;
\r
929 poly3[3].Y = y1 + kMinWidthT;
\r
930 poly3[4].X = x1 - kMinWidthT;
\r
932 icPolygon(poly3, 5);
\r
936 XY = cos(rad) * v * -1;
\r
940 if(a1 == 0){ //beginning of the storke
\r
941 poly2[0].X = x1 + kMinWidthT * XX + (kMinWidthY * 0.5) * YX;
\r
942 poly2[0].Y = y1 + kMinWidthT * XY + (kMinWidthY * 0.5) * YY;
\r
943 poly2[1].X = x1 + (kMinWidthT + kMinWidthT * 0.5) * XX + (kMinWidthY * 0.5 + kMinWidthY) * YX;
\r
944 poly2[1].Y = y1 + (kMinWidthT + kMinWidthT * 0.5) * XY + (kMinWidthY * 0.5 + kMinWidthY) * YY;
\r
945 poly2[2].X = x1 + kMinWidthT * XX + (kMinWidthY * 0.5 + kMinWidthY * 2) * YX;
\r
946 poly2[2].Y = y1 + kMinWidthT * XY + (kMinWidthY * 0.5 + kMinWidthY * 2) * YY;
\r
947 icPolygon(poly2, 3);
\r
953 if(tx1 == tx2){ //if TATE stroke, use y-axis
\r
971 if(a1 % 10 == 2){ y1 = y1 - kWidth; }
\r
972 if(a2 % 10 == 2){ y2 = y2 + kWidth; }
\r
973 if(a1 % 10 == 3){ y1 = y1 - kWidth * kKakato; }
\r
974 if(a2 % 10 == 3){ y2 = y2 + kWidth * kKakato; }
\r
976 poly[3].X = x1 - kWidth;
\r
978 poly[2].X = x2 - kWidth;
\r
980 poly[1].X = x2 + kWidth;
\r
982 poly[0].X = x1 + kWidth;
\r
985 icPolygon(poly, 4);
\r
987 else if(ty1 == ty2){ //if YOKO stroke, use x-axis
\r
1004 if(a1 % 10 == 2){ x1 = x1 - kWidth; }
\r
1005 if(a2 % 10 == 2){ x2 = x2 + kWidth; }
\r
1006 if(a1 % 10 == 3){ x1 = x1 - kWidth * kKakato; }
\r
1007 if(a2 % 10 == 3){ x2 = x2 + kWidth * kKakato; }
\r
1010 poly[0].Y = y1 - kWidth;
\r
1012 poly[1].Y = y2 - kWidth;
\r
1014 poly[2].Y = y2 + kWidth;
\r
1016 poly[3].Y = y1 + kWidth;
\r
1018 icPolygon(poly, 4);
\r
1020 else{ //for others, use x-axis
\r
1037 rad = atan((double)(y2 - y1) / (double)(x2 - x1));
\r
1039 x1 = x1 - kWidth * cos(rad);
\r
1040 y1 = y1 - kWidth * sin(rad);
\r
1043 x2 = x2 + kWidth * cos(rad);
\r
1044 y2 = y2 + kWidth * sin(rad);
\r
1047 x1 = x1 - kWidth * cos(rad) * kKakato;
\r
1048 y1 = y1 - kWidth * sin(rad) * kKakato;
\r
1051 x2 = x2 + kWidth * cos(rad) * kKakato;
\r
1052 y2 = y2 + kWidth * sin(rad) * kKakato;
\r
1055 //SUICHOKU NO ICHI ZURASHI HA sin TO cos NO IREKAE + x-axis MAINASU KA
\r
1056 poly[0].X = x1 + sin(rad) * kWidth;
\r
1057 poly[0].Y = y1 - cos(rad) * kWidth;
\r
1058 poly[1].X = x2 + sin(rad) * kWidth;
\r
1059 poly[1].Y = y2 - cos(rad) * kWidth;
\r
1060 poly[2].X = x2 - sin(rad) * kWidth;
\r
1061 poly[2].Y = y2 + cos(rad) * kWidth;
\r
1062 poly[3].X = x1 - sin(rad) * kWidth;
\r
1063 poly[3].Y = y1 + cos(rad) * kWidth;
\r
1065 icPolygon(poly, 4);
\r