5 void cdDrawCurve(int x1, int y1,
\r
12 double ix, iy, ia, ib, ir;
\r
13 int ox1, oy1, ox2, oy2;
\r
17 double XX, XY, YX, YY;
\r
19 if(kShotai == kMincho){ // mincho
\r
23 delta = -1 * kMinWidthY * 0.5;
\r
40 if(y1 < y2){ y1 = y1 - delta; }
\r
41 else{ y1 = y1 + delta; }
\r
44 if(x1 < x2){ x1 = x1 - delta; }
\r
45 else{ x1 = x1 + delta; }
\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
71 if(y2 < y3){ y3 = y3 + delta; }
\r
72 else{ y3 = y3 - delta; }
\r
75 if(x2 < x3){ x3 = x3 + delta; }
\r
76 else{ x3 = x3 - delta; }
\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
87 for(tt = 0; tt <= 1000; tt = tt + kRate){
\r
88 t = (double)(tt) / 1000;
\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
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
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
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
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
132 //copy as an old point
\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
146 icPolygon(poly, (1000 / kRate + 1) * 2);
\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
152 XY = cos(rad) * v * -1;
\r
158 poly2[0].X = x1 - kMinWidthT;
\r
160 poly2[1].X = x1 + kMinWidthT;
\r
162 poly2[2].X = x1 - kMinWidthT;
\r
163 poly2[2].Y = y1 - kMinWidthT;
\r
164 icPolygon(poly2, 3);
\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
178 if(y1 <= y3){ //from up to bottom
\r
180 poly2[0].X = x1 - kMinWidthT;
\r
182 poly2[1].X = x1 + kMinWidthT;
\r
184 poly2[2].X = x1 - kMinWidthT;
\r
185 poly2[2].Y = y1 - kMinWidthY;
\r
186 icPolygon(poly2, 3);
\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
198 else{ //bottom to up
\r
199 if(x1 == x2){ //is it right?
\r
200 poly2[0].X = x1 - kMinWidthT;
\r
202 poly2[1].X = x1 + kMinWidthT;
\r
204 poly2[2].X = x1 - kMinWidthT;
\r
205 poly2[2].Y = y1 + kMinWidthY;
\r
206 icPolygon(poly2, 3);
\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
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
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
231 icPolygon(poly3, 5);
\r
234 if(a1 == 0){ //beginning of the stroke
\r
235 if(y1 <= y3){ //from up to bottom
\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
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
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
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
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
288 if(a2 == 1 || a2 == 8 || a2 == 15){ //the last filled circle
\r
290 poly3[0].X = x3 - kMinWidthT;
\r
292 poly3[1].X = x3 - kMinWidthT * 0.6;
\r
293 poly3[1].Y = y3 + kMinWidthT * 0.6;
\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
300 icPolygon(poly3, 5);
\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
309 poly3[3].X = x3 + kMinWidthT * 0.6;
\r
310 poly3[3].Y = y3 + kMinWidthT * 0.6;
\r
312 poly3[4].Y = y3 + kMinWidthT;
\r
313 icPolygon(poly3, 5);
\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
330 if(a2 == 17){ //the last filled half circle
\r
332 poly3[0].X = x3 - kMinWidthT * 0.5;
\r
334 poly3[1].X = x3 - kMinWidthT * 0.6 * 0.5;
\r
335 poly3[1].Y = y3 + kMinWidthT * 0.6 * 0.5;
\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
342 icPolygon(poly3, 5);
\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
351 poly3[3].X = x3 + kMinWidthT * 0.6 * 0.5;
\r
352 poly3[3].Y = y3 + kMinWidthT * 0.6 * 0.5;
\r
354 poly3[4].Y = y3 + kMinWidthT * 0.5;
\r
355 icPolygon(poly3, 5);
\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
375 poly2[0].Y = y3 + kMinWidthT;
\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
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
393 if(a2 == 15){ //jump up
\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
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
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
418 if(a2 == 14){ //jump to left, allways go left
\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
433 if(y1 < y2){ y1 = y1 - kWidth; } else{ y1 = y1 + kWidth; }
\r
436 if(x1 < x2){ x1 = x1 - kWidth; } else{ x1 = x1 + kWidth; }
\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
449 y1 = y1 - kWidth * kKakato;
\r
452 y1 = y1 + kWidth * kKakato;
\r
457 x1 = x1 - kWidth * kKakato;
\r
460 x1 = x1 + kWidth * kKakato;
\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
472 if(y2 < y3){ y3 = y3 + kWidth; } else{ y3 = y3 - kWidth; }
\r
475 if(x2 < x3){ x3 = x3 + kWidth; } else{ x3 = x3 - kWidth; }
\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
488 y3 = y3 + kWidth * kKakato;
\r
491 y3 = y3 - kWidth * kKakato;
\r
496 x3 = x3 + kWidth * kKakato;
\r
499 x3 = x3 - kWidth * kKakato;
\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
512 for(tt = 0; tt <= 1000; tt = tt + kRate){
\r
513 t = (double)tt / 1000;
\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
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
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
538 ia = ia * sqrt(1.0 - t);
\r
539 ib = ib * sqrt(1.0 - t);
\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
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
566 //save old points for calculate crossing
\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
580 icPolygon(poly, (1000 / kRate + 1) * 2);
\r
584 void cdDrawLine(int tx1, int ty1, int tx2, int ty2, int ta1, int ta2){
\r
586 int v, x1, y1, x2, y2, a1, a2;
\r
587 double XX, XY, YX, YY;
\r
589 if(kShotai == kMincho){ //mincho
\r
597 if(x1 == x2){ //if TATE stroke, use y-axis
\r
600 poly[0].X = x1 - kMinWidthT;
\r
601 poly[0].Y = y1 - kMinWidthY / 2;
\r
602 poly[3].X = x1 + kMinWidthT;
\r
603 poly[3].Y = y1 + kMinWidthY / 2;
\r
608 poly[0].X = x1 - kMinWidthT;
\r
610 poly[3].X = x1 + kMinWidthT;
\r
614 poly[0].X = x1 - kMinWidthT;
\r
615 poly[0].Y = y1 - kMinWidthY - kMinWidthT;
\r
616 poly[3].X = x1 + kMinWidthT;
\r
617 poly[3].Y = y1 - kMinWidthY;
\r
620 poly[0].X = x1 - kMinWidthT;
\r
621 poly[0].Y = y1 - kMinWidthY;
\r
622 poly[3].X = x1 + kMinWidthT;
\r
623 poly[3].Y = y1 - kMinWidthY;
\r
629 if(a1 == 6){ //KAGI's tail
\r
630 poly[1].X = x2 - kMinWidthT;
\r
632 poly[2].X = x2 + kMinWidthT;
\r
636 poly[1].X = x2 - kMinWidthT;
\r
637 poly[1].Y = y2 + kMinWidthT / 2;
\r
638 poly[2].X = x2 + kMinWidthT;
\r
639 poly[2].Y = y2 - kMinWidthT / 2;
\r
643 poly[1].X = x2 - kMinWidthT;
\r
645 poly[2].X = x2 + kMinWidthT;
\r
649 poly[1].X = x2 - kMinWidthT;
\r
650 poly[1].Y = y2 + kWidth * kKakato + kMinWidthT;
\r
651 poly[2].X = x2 + kMinWidthT;
\r
652 poly[2].Y = y2 + kWidth * kKakato;
\r
655 poly[1].X = x2 - kMinWidthT;
\r
656 poly[1].Y = y2 + kWidth * kKakato * 0.5 + kMinWidthT;
\r
657 poly[2].X = x2 + kMinWidthT;
\r
658 poly[2].Y = y2 + kWidth * kKakato * 0.5;
\r
661 poly[1].X = x2 - kMinWidthT;
\r
662 poly[1].Y = y2 + kMinWidthY;
\r
663 poly[2].X = x2 + kMinWidthT;
\r
664 poly[2].Y = y2 + kMinWidthY;
\r
668 icPolygon(poly, 4);
\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
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
681 icPolygon(poly3, 5);
\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
694 if((a1 == 6 && a2 == 0) || a2 == 1){ //KAGI NO YOKO BOU NO SAIGO NO MARU
\r
695 poly3[0].X = x2 - kMinWidthT;
\r
697 poly3[1].X = x2 - kMinWidthT * 0.6;
\r
698 poly3[1].Y = y2 + kMinWidthT * 0.6;
\r
700 poly3[2].Y = y2 + kMinWidthT;
\r
701 poly3[3].X = x2 + kMinWidthT * 0.6;
\r
702 poly3[3].Y = y2 + kMinWidthT * 0.6;
\r
703 poly3[4].X = x2 + kMinWidthT;
\r
705 icPolygon(poly3, 5);
\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
711 poly[0].Y = y1 - kMinWidthT;
\r
713 poly[1].Y = y2 - kMinWidthT;
\r
715 poly[2].Y = y2 + kMinWidthT;
\r
717 poly[3].Y = y1 + kMinWidthT;
\r
718 icPolygon(poly, 4);
\r
720 if(a2 == 1 || a2 == 0 || a2 == 5){
\r
721 //KAGI NO YOKO BOU NO SAIGO NO MARU
\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
728 poly3[3].X = x2 + kMinWidthT * 0.6;
\r
729 poly3[3].Y = y2 + kMinWidthT * 0.6;
\r
731 poly3[4].Y = y2 + kMinWidthT;
\r
732 icPolygon(poly3, 5);
\r
736 //KAGI NO YOKO BOU NO HANE
\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
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
752 poly[0].Y = y1 - kMinWidthY;
\r
754 poly[3].Y = y1 + kMinWidthY;
\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
767 poly[1].Y = y2 - kMinWidthY;
\r
769 poly[2].Y = y2 + kMinWidthY;
\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
778 icPolygon(poly, 4);
\r
783 poly2[0].Y = y2 - kMinWidthY;
\r
784 poly2[1].X = x2 - 24;
\r
786 poly2[2].X = x2 - 12;
\r
787 poly2[2].Y = y2 - 12;
\r
788 icPolygon(poly2, 3);
\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
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
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
810 switch(a2){ //must be 0 or 2
\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
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
824 icPolygon(poly, 4);
\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
838 else{ //KAKUDO GA FUKAI or KAGI NO YOKO BOU
\r
839 if(x1 > x2){ v = -1; } else{ v = 1; }
\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
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
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
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
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
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
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
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
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
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
911 icPolygon(poly, 4);
\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
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
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
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
951 icPolygon(poly3, 5);
\r
955 XY = cos(rad) * v * -1;
\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
972 if(tx1 == tx2){ //if TATE stroke, use y-axis
\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
995 poly[0].X = x1 - kWidth;
\r
997 poly[1].X = x2 - kWidth;
\r
999 poly[2].X = x2 + kWidth;
\r
1001 poly[3].X = x1 + kWidth;
\r
1004 icPolygon(poly, 4);
\r
1006 else if(ty1 == ty2){ //if YOKO stroke, use x-axis
\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
1029 poly[0].Y = y1 - kWidth;
\r
1031 poly[1].Y = y2 - kWidth;
\r
1033 poly[2].Y = y2 + kWidth;
\r
1035 poly[3].Y = y1 + kWidth;
\r
1037 icPolygon(poly, 4);
\r
1039 else{ //for others, use x-axis
\r
1056 rad = atan((double)(y2 - y1) / (double)(x2 - x1));
\r
1058 x1 = x1 - kWidth * cos(rad);
\r
1059 y1 = y1 - kWidth * sin(rad);
\r
1062 x2 = x2 + kWidth * cos(rad);
\r
1063 y2 = y2 + kWidth * sin(rad);
\r
1066 x1 = x1 - kWidth * cos(rad) * kKakato;
\r
1067 y1 = y1 - kWidth * sin(rad) * kKakato;
\r
1070 x2 = x2 + kWidth * cos(rad) * kKakato;
\r
1071 y2 = y2 + kWidth * sin(rad) * kKakato;
\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
1084 icPolygon(poly, 4);
\r