1 // may be it can join 3curve and 4curve. the difference is may be only calculating x,y,ix,iy
\r
3 function cdDrawBezier(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a1, a2){
\r
6 var ix, iy, ia, ib, ir;
\r
13 if(kage.kShotai == kage.kMincho){ // mincho
\r
17 delta = -1 * kage.kMinWidthY * 0.5;
\r
20 case 2: // must be 32
\r
27 delta = kage.kMinWidthY;
\r
34 if(y1 < y2){ y1 = y1 - delta; }
\r
35 else{ y1 = y1 + delta; }
\r
38 if(x1 < x2){ x1 = x1 - delta; }
\r
39 else{ x1 = x1 + delta; }
\r
42 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
43 if(x1 < x2){ v = 1; } else{ v = -1; }
\r
44 x1 = x1 - delta * Math.cos(rad) * v;
\r
45 y1 = y1 - delta * Math.sin(rad) * v;
\r
54 case 15: // it can change to 15->5
\r
55 case 14: // it can change to 14->4
\r
65 if(y3 < y4){ y4 = y4 + delta; }
\r
66 else{ y4 = y4 - delta; }
\r
69 if(x3 < x4){ x4 = x4 + delta; }
\r
70 else{ x4 = x4 - delta; }
\r
73 rad = Math.atan((y4 - y3) / (x4 - x3));
\r
74 if(x3 < x4){ v = 1; } else{ v = -1; }
\r
75 x4 = x4 + delta * Math.cos(rad) * v;
\r
76 y4 = y4 + delta * Math.sin(rad) * v;
\r
79 poly = new Polygon();
\r
80 poly2 = new Polygon();
\r
81 for(tt = 0; tt <= 1000; tt = tt + kage.kRate){
\r
85 x = (1.0 - t) * (1.0 - t) * (1.0 - t) * x1 + 3.0 * t * (1.0 - t) * (1.0 - t) * x2 + 3 * t * t * (1.0 - t) * x3 + t * t * t * x4;
\r
86 y = (1.0 - t) * (1.0 - t) * (1.0 - t) * y1 + 3.0 * t * (1.0 - t) * (1.0 - t) * y2 + 3 * t * t * (1.0 - t) * y3 + t * t * t * y4;
\r
87 //KATAMUKI of vector by BIBUN
\r
88 ix = t * t * (-3 * x1 + 9 * x2 + -9 * x3 + 3 * x4) + t * (6 * x1 + -12 * x2 + 6 * x3) + -3 * x1 + 3 * x2;
\r
89 iy = t * t * (-3 * y1 + 9 * y2 + -9 * y3 + 3 * y4) + t * (6 * y1 + -12 * y2 + 6 * y3) + -3 * y1 + 3 * y2;
\r
91 //line SUICHOKU by vector
\r
92 if(ix != 0 && iy != 0){
\r
93 ir = Math.atan(iy / ix * -1);
\r
94 ia = Math.sin(ir) * (kage.kMinWidthT);
\r
95 ib = Math.cos(ir) * (kage.kMinWidthT);
\r
98 ia = kage.kMinWidthT;
\r
103 ib = kage.kMinWidthT;
\r
106 if(a1 == 7){ deltad = Math.sqrt(t); }
\r
107 else if(a2 == 7){ deltad = Math.sqrt(1.0 - t); }
\r
108 else{ deltad = 1; }
\r
112 //reverse if vector is going 2nd/3rd quadrants
\r
118 //copy to polygon structuer
\r
119 poly.push(x - ia, y - ib);
\r
120 poly2.push(x + ia, y + ib);
\r
123 poly.concat(poly2);
\r
124 polygons.push(poly);
\r
126 //process for head of stroke
\r
127 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
128 if(x1 < x2){ v = 1; } else{ v = -1; }
\r
129 XX = Math.sin(rad) * v;
\r
130 XY = Math.cos(rad) * v * -1;
\r
131 YX = Math.cos(rad) * v;
\r
132 YY = Math.sin(rad) * v;
\r
136 poly = new Polygon();
\r
137 poly.push(x1 - kage.kMinWidthT, y1);
\r
138 poly.push(x1 + kage.kMinWidthT, y1);
\r
139 poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthT);
\r
140 polygons.push(poly);
\r
143 poly = new Polygon();
\r
144 poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);
\r
145 poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);
\r
146 poly.push(x1 - kage.kMinWidthT * XX - kage.kMinWidthT * YX, y1 - kage.kMinWidthT * XY - kage.kMinWidthT * YY);
\r
147 polygons.push(poly);
\r
152 if(y1 <= y4){ //from up to bottom
\r
154 poly = new Polygon();
\r
155 poly.push(x1 - kage.kMinWidthT, y1);
\r
156 poly.push(x1 + kage.kMinWidthT, y1);
\r
157 poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
158 polygons.push(poly);
\r
161 poly = new Polygon();
\r
162 poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);
\r
163 poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);
\r
164 poly.push(x1 - kage.kMinWidthT * XX - kage.kMinWidthY * YX, y1 - kage.kMinWidthT * XY - kage.kMinWidthY * YY);
\r
165 polygons.push(poly);
\r
168 else{ //bottom to up
\r
170 poly = new Polygon();
\r
171 poly.push(x1 - kage.kMinWidthT, y1);
\r
172 poly.push(x1 + kage.kMinWidthT, y1);
\r
173 poly.push(x1 + kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
174 polygons.push(poly);
\r
177 poly = new Polygon();
\r
178 poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);
\r
179 poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);
\r
180 poly.push(x1 + kage.kMinWidthT * XX - kage.kMinWidthY * YX, y1 + kage.kMinWidthT * XY - kage.kMinWidthY * YY);
\r
181 polygons.push(poly);
\r
186 if(a1 == 22){ //box's up-right corner, any time same degree
\r
187 poly = new Polygon();
\r
188 poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
189 poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);
\r
190 poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);
\r
191 poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);
\r
192 poly.push(x1, y1 + kage.kMinWidthT);
\r
193 polygons.push(poly);
\r
196 if(a1 == 0){ //beginning of the stroke
\r
197 if(y1 <= y4){ //from up to bottom
\r
199 poly = new Polygon();
\r
200 poly.push(x1 + kage.kMinWidthT, y1);
\r
201 poly.push(x1 + kage.kMinWidthT * 1.5, y1 + kage.kMinWidthY);
\r
202 poly.push(x1 + kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 3);
\r
203 polygons.push(poly);
\r
206 poly = new Polygon();
\r
207 poly.push(x1 + kage.kMinWidthT * XX,
\r
208 y1 + kage.kMinWidthT * XY);
\r
209 poly.push(x1 + kage.kMinWidthT * 1.5 * XX + kage.kMinWidthY * YX,
\r
210 y1 + kage.kMinWidthT * 1.5 * XY + kage.kMinWidthY * YY);
\r
211 poly.push(x1 + kage.kMinWidthT * 0.5 * XX + kage.kMinWidthY * 3 * YX,
\r
212 y1 + kage.kMinWidthT * 0.5 * XY + kage.kMinWidthY * 3 * YY);
\r
213 polygons.push(poly);
\r
216 else{ //from bottom to up
\r
218 poly = new Polygon();
\r
219 poly.push(x1 - kage.kMinWidthT, y1);
\r
220 poly.push(x1 - kage.kMinWidthT * 1.5, y1 + kage.kMinWidthY);
\r
221 poly.push(x1 - kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 3);
\r
222 polygons.push(poly);
\r
225 poly = new Polygon();
\r
226 poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);
\r
227 poly.push(x1 - kage.kMinWidthT * 1.5 * XX + kage.kMinWidthY * YX, y1 + kage.kMinWidthY * YY - kage.kMinWidthT * 1.5 * XY);
\r
228 poly.push(x1 - kage.kMinWidthT * 0.5 * XX + kage.kMinWidthY * 3 * YX, y1 + kage.kMinWidthY * 3 * YY - kage.kMinWidthT * 0.5 * XY);
\r
229 polygons.push(poly);
\r
235 rad = Math.atan((y4 - y3) / (x4 - x3));
\r
236 if(x3 < x4){ v = 1; } else{ v = -1; }
\r
237 YX = Math.sin(rad) * v * -1;
\r
238 YY = Math.cos(rad) * v;
\r
239 XX = Math.cos(rad) * v;
\r
240 XY = Math.sin(rad) * v;
\r
242 if(a2 == 1 || a2 == 8 || a2 == 15){ //the last filled circle ... it can change to 15->5
\r
245 poly.push(x4 - kage.kMinWidthT, y4);
\r
246 poly.push(x4 - kage.kMinWidthT * 0.7, y4 + kage.kMinWidthT * 0.7);
\r
247 poly.push(x4, y4 + kage.kMinWidthT);
\r
248 poly.push(x4 + kage.kMinWidthT * 0.7, y4 + kage.kMinWidthT * 0.7);
\r
249 poly.push(x4 + kage.kMinWidthT, y4);
\r
250 polygons.push(poly);
\r
253 poly = new Polygon();
\r
254 poly.push(x4, y4 - kage.kMinWidthT);
\r
255 poly.push(x4 + kage.kMinWidthT * 0.7, y4 - kage.kMinWidthT * 0.7);
\r
256 poly.push(x4 + kage.kMinWidthT, y4);
\r
257 poly.push(x4 + kage.kMinWidthT * 0.7, y4 + kage.kMinWidthT * 0.7);
\r
258 poly.push(x4, y4 + kage.kMinWidthT);
\r
259 polygons.push(poly);
\r
262 poly = new Polygon();
\r
263 poly.push(x4 + Math.sin(rad) * kage.kMinWidthT * v, y4 - Math.cos(rad) * kage.kMinWidthT * v);
\r
264 poly.push(x4 + Math.cos(rad) * kage.kMinWidthT * 0.7 * v + Math.sin(rad) * kage.kMinWidthT * 0.7 * v,
\r
265 y4 + Math.sin(rad) * kage.kMinWidthT * 0.7 * v - Math.cos(rad) * kage.kMinWidthT * 0.7 * v);
\r
266 poly.push(x4 + Math.cos(rad) * kage.kMinWidthT * v, y4 + Math.sin(rad) * kage.kMinWidthT * v);
\r
267 poly.push(x4 + Math.cos(rad) * kage.kMinWidthT * 0.7 * v - Math.sin(rad) * kage.kMinWidthT * 0.7 * v,
\r
268 y4 + Math.sin(rad) * kage.kMinWidthT * 0.7 * v + Math.cos(rad) * kage.kMinWidthT * 0.7 * v);
\r
269 poly.push(x4 - Math.sin(rad) * kage.kMinWidthT * v, y4 + Math.cos(rad) * kage.kMinWidthT * v);
\r
270 polygons.push(poly);
\r
274 if(a2 == 9 || (a1 == 7 && a2 == 0)){ // Math.sinnyu & L2RD Harai
\r
276 poly = new Polygon();
\r
277 poly.push(x4, y4 + kage.kMinWidthT);
\r
278 poly.push(x4, y4 - kage.kMinWidthT);
\r
279 poly.push(x4 + kage.kMinWidthT, y4 - kage.kMinWidthT);
\r
280 polygons.push(poly);
\r
283 poly = new Polygon();
\r
284 poly.push(x4 + kage.kMinWidthT * YX, y4 + kage.kMinWidthT * YY);
\r
285 poly.push(x4 - kage.kMinWidthT * YX, y4 - kage.kMinWidthT * YY);
\r
286 poly.push(x4 + kage.kMinWidthT * XX - kage.kMinWidthT * YX, y4 + kage.kMinWidthT * XY - kage.kMinWidthT * YY);
\r
287 polygons.push(poly);
\r
291 if(a2 == 15){ //jump up ... it can change to 15->5
\r
293 poly = new Polygon();
\r
294 poly.push(x4, y4 - kage.kMinWidthT + 1);
\r
295 poly.push(x4 + 2, y4 - kage.kMinWidthT - kage.kWidth * 5);
\r
296 poly.push(x4, y4 - kage.kMinWidthT - kage.kWidth * 5);
\r
297 poly.push(x4 - kage.kMinWidthT, y4 - kage.kMinWidthT + 1);
\r
298 polygons.push(poly);
\r
301 poly = new Polygon();
\r
302 poly.push(x4 + (kage.kMinWidthT - 1) * Math.sin(rad) * v, y4 - (kage.kMinWidthT - 1) * Math.cos(rad) * v);
\r
303 poly.push(x4 + 2 * Math.cos(rad) * v + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,
\r
304 y4 + 2 * Math.sin(rad) * v - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);
\r
305 poly.push(x4 + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,
\r
306 y4 - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);
\r
307 poly.push(x4 + (kage.kMinWidthT - 1) * Math.sin(rad) * v - kage.kMinWidthT * Math.cos(rad) * v,
\r
308 y4 - (kage.kMinWidthT - 1) * Math.cos(rad) * v - kage.kMinWidthT * Math.sin(rad) * v);
\r
309 polygons.push(poly);
\r
313 if(a2 == 14){ //jump to left, allways go left ... it can change to 14->4
\r
314 poly = new Polygon();
\r
316 poly.push(x4, y4 - kage.kMinWidthT);
\r
317 poly.push(x4 - kage.kWidth * 4, y4 - kage.kMinWidthT);
\r
318 poly.push(x4 - kage.kWidth * 4, y4 - kage.kMinWidthT * 0.5);
\r
319 polygons.push(poly);
\r
325 if(y1 < y2){ y1 = y1 - kage.kWidth; } else{ y1 = y1 + kage.kWidth; }
\r
328 if(x1 < x2){ x1 = x1 - kage.kWidth; } else{ x1 = x1 + kage.kWidth; }
\r
331 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
332 if(x1 < x2){ v = 1; } else{ v = -1; }
\r
333 x1 = x1 - kage.kWidth * Math.cos(rad) * v;
\r
334 y1 = y1 - kage.kWidth * Math.sin(rad) * v;
\r
341 y1 = y1 - kage.kWidth * kage.kKakato;
\r
344 y1 = y1 + kage.kWidth * kage.kKakato;
\r
349 x1 = x1 - kage.kWidth * kage.kKakato;
\r
352 x1 = x1 + kage.kWidth * kage.kKakato;
\r
356 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
357 if(x1 < x2){ v = 1; } else{ v = -1; }
\r
358 x1 = x1 - kage.kWidth * Math.cos(rad) * v * kage.kKakato;
\r
359 y1 = y1 - kage.kWidth * Math.sin(rad) * v * kage.kKakato;
\r
364 if(y3 < y4){ y4 = y4 + kage.kWidth; } else{ y4 = y4 - kage.kWidth; }
\r
367 if(x3 < x4){ x4 = x4 + kage.kWidth; } else{ x4 = x4 - kage.kWidth; }
\r
370 rad = Math.atan((y4 - y3) / (x4 - x3));
\r
371 if(x3 < x4){ v = 1; } else{ v = -1; }
\r
372 x4 = x4 + kage.kWidth * Math.cos(rad) * v;
\r
373 y4 = y4 + kage.kWidth * Math.sin(rad) * v;
\r
380 y4 = y4 + kage.kWidth * kage.kKakato;
\r
383 y4 = y4 - kage.kWidth * kage.kKakato;
\r
388 x4 = x4 + kage.kWidth * kage.kKakato;
\r
391 x4 = x4 - kage.kWidth * kage.kKakato;
\r
395 rad = Math.atan((y4 - y3) / (x4 - x3));
\r
396 if(x3 < x4){ v = 1; } else{ v = -1; }
\r
397 x4 = x4 + kage.kWidth * Math.cos(rad) * v * kage.kKakato;
\r
398 y4 = y4 + kage.kWidth * Math.sin(rad) * v * kage.kKakato;
\r
402 poly = new Polygon();
\r
403 poly2= new Polygon();
\r
405 for(tt = 0; tt <= 1000; tt = tt + kage.kRate){
\r
409 x = (1.0 - t) * (1.0 - t) * (1.0 - t) * x1 + 3.0 * t * (1.0 - t) * (1.0 - t) * x2 + 3 * t * t * (1.0 - t) * x3 + t * t * t * x4;
\r
410 y = (1.0 - t) * (1.0 - t) * (1.0 - t) * y1 + 3.0 * t * (1.0 - t) * (1.0 - t) * y2 + 3 * t * t * (1.0 - t) * y3 + t * t * t * y4;
\r
411 //KATAMUKI of vector by BIBUN
\r
412 ix = t * t * (-3 * x1 + 9 * x2 + -9 * x3 + 3 * x4) + t * (6 * x1 + -12 * x2 + 6 * x3) + -3 * x1 + 3 * x2;
\r
413 iy = t * t * (-3 * y1 + 9 * y2 + -9 * y3 + 3 * y4) + t * (6 * y1 + -12 * y2 + 6 * y3) + -3 * y1 + 3 * y2;
\r
415 //SESSEN NI SUICHOKU NA CHOKUSEN NO KEISAN
\r
416 if(kage.kShotai == kage.kMincho){ //always false ?
\r
417 if(ix != 0 && iy != 0){
\r
418 ir = Math.atan(iy / ix * -1.0);
\r
419 ia = Math.sin(ir) * kage.kMinWidthT;
\r
420 ib = Math.cos(ir) * kage.kMinWidthT;
\r
423 ia = kage.kMinWidthT;
\r
428 ib = kage.kMinWidthT;
\r
430 ia = ia * Math.sqrt(1.0 - t);
\r
431 ib = ib * Math.sqrt(1.0 - t);
\r
434 if(ix != 0 && iy != 0){
\r
435 ir = Math.atan(iy / ix * -1.0);
\r
436 ia = Math.sin(ir) * kage.kWidth;
\r
437 ib = Math.cos(ir) * kage.kWidth;
\r
449 //reverse if vector is going 2nd/3rd quadrants
\r
456 poly.push(x - ia, y - ib);
\r
457 poly2.push(x + ia, y + ib);
\r
461 poly.concat(poly2);
\r
462 polygons.push(poly);
\r
466 function cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a1, a2){
\r
469 var ix, iy, ia, ib, ir;
\r
473 var XX, XY, YX, YY;
\r
476 if(kage.kShotai == kage.kMincho){ // mincho
\r
480 delta = -1 * kage.kMinWidthY * 0.5;
\r
483 case 2: // ... must be 32
\r
490 delta = kage.kMinWidthY;
\r
497 if(y1 < y2){ y1 = y1 - delta; }
\r
498 else{ y1 = y1 + delta; }
\r
501 if(x1 < x2){ x1 = x1 - delta; }
\r
502 else{ x1 = x1 + delta; }
\r
505 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
506 if(x1 < x2){ v = 1; } else{ v = -1; }
\r
507 x1 = x1 - delta * Math.cos(rad) * v;
\r
508 y1 = y1 - delta * Math.sin(rad) * v;
\r
516 case 15: // it can change to 15->5
\r
517 case 14: // it can change to 14->4
\r
518 case 17: // no need
\r
522 case 8: // get shorten for tail's circle
\r
523 delta = -1 * kage.kMinWidthT * 0.5;
\r
530 if(y2 < y3){ y3 = y3 + delta; }
\r
531 else{ y3 = y3 - delta; }
\r
534 if(x2 < x3){ x3 = x3 + delta; }
\r
535 else{ x3 = x3 - delta; }
\r
538 rad = Math.atan((y3 - y2) / (x3 - x2));
\r
539 if(x2 < x3){ v = 1; } else{ v = -1; }
\r
540 x3 = x3 + delta * Math.cos(rad) * v;
\r
541 y3 = y3 + delta * Math.sin(rad) * v;
\r
544 poly = new Polygon();
\r
545 poly2 = new Polygon();
\r
547 for(tt = 0; tt <= 1000; tt = tt + kage.kRate){
\r
551 x = ((1.0 - t) * (1.0 - t) * x1 + 2.0 * t * (1.0 - t) * x2 + t * t * x3);
\r
552 y = ((1.0 - t) * (1.0 - t) * y1 + 2.0 * t * (1.0 - t) * y2 + t * t * y3);
\r
554 //KATAMUKI of vector by BIBUN
\r
555 ix = (x1 - 2.0 * x2 + x3) * 2.0 * t + (-2.0 * x1 + 2.0 * x2);
\r
556 iy = (y1 - 2.0 * y2 + y3) * 2.0 * t + (-2.0 * y1 + 2.0 * y2);
\r
558 //line SUICHOKU by vector
\r
559 if(ix != 0 && iy != 0){
\r
560 ir = Math.atan(iy / ix * -1);
\r
561 ia = Math.sin(ir) * (kage.kMinWidthT);
\r
562 ib = Math.cos(ir) * (kage.kMinWidthT);
\r
565 ia = kage.kMinWidthT;
\r
570 ib = kage.kMinWidthT;
\r
573 if(a1 == 7 && a2 == 0){ deltad = Math.sqrt(t) * kage.kL2RDfatten; } //L2RD: fatten
\r
574 else if(a1 == 7){ deltad = Math.sqrt(t); }
\r
575 else if(a2 == 7){ deltad = Math.sqrt(1.0 - t); }
\r
576 else{ deltad = 1; }
\r
580 //reverse if vector is going 2nd/3rd quadrants
\r
586 //copy to polygon structure
\r
587 poly.push(x - ia, y - ib);
\r
588 poly2.push(x + ia, y + ib);
\r
592 poly.concat(poly2);
\r
593 polygons.push(poly);
\r
595 //process for head of stroke
\r
596 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
597 if(x1 < x2){ v = 1; } else{ v = -1; }
\r
598 XX = Math.sin(rad) * v;
\r
599 XY = Math.cos(rad) * v * -1;
\r
600 YX = Math.cos(rad) * v;
\r
601 YY = Math.sin(rad) * v;
\r
605 poly= new Polygon();
\r
606 poly.push(x1 - kage.kMinWidthT, y1);
\r
607 poly.push(x1 + kage.kMinWidthT, y1);
\r
608 poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthT);
\r
609 polygons.push(poly);
\r
612 poly = new Polygon();
\r
613 poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);
\r
614 poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);
\r
615 poly.push(x1 - kage.kMinWidthT * XX - kage.kMinWidthT * YX, y1 - kage.kMinWidthT * XY - kage.kMinWidthT * YY);
\r
616 polygons.push(poly);
\r
621 if(y1 <= y3){ //from up to bottom
\r
623 poly = new Polygon();
\r
624 poly.push(x1 - kage.kMinWidthT, y1);
\r
625 poly.push(x1 + kage.kMinWidthT, y1);
\r
626 poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
627 polygons.push(poly);
\r
630 poly = new Polygon();
\r
631 poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);
\r
632 poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);
\r
633 poly.push(x1 - kage.kMinWidthT * XX - kage.kMinWidthY * YX, y1 - kage.kMinWidthT * XY - kage.kMinWidthY * YY);
\r
634 polygons.push(poly);
\r
637 else{ //bottom to up
\r
639 poly = new Polygon();
\r
640 poly.push(x1 - kage.kMinWidthT, y1);
\r
641 poly.push(x1 + kage.kMinWidthT, y1);
\r
642 poly.push(x1 + kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
643 polygons.push(poly);
\r
646 poly = new Polygon();
\r
647 poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);
\r
648 poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);
\r
649 poly.push(x1 + kage.kMinWidthT * XX - kage.kMinWidthY * YX, y1 + kage.kMinWidthT * XY - kage.kMinWidthY * YY);
\r
650 polygons.push(poly);
\r
655 if(a1 == 22){ //box's up-right corner, any time same degree
\r
656 poly = new Polygon();
\r
657 poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
658 poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);
\r
659 poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);
\r
660 poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);
\r
661 poly.push(x1, y1 + kage.kMinWidthT);
\r
662 polygons.push(poly);
\r
665 if(a1 == 0){ //beginning of the stroke
\r
666 if(y1 <= y3){ //from up to bottom
\r
668 poly = new Polygon();
\r
669 poly.push(x1 + kage.kMinWidthT, y1);
\r
670 poly.push(x1 + kage.kMinWidthT * 1.5, y1 + kage.kMinWidthY);
\r
671 poly.push(x1 + kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 3);
\r
672 polygons.push(poly);
\r
675 poly = new Polygon();
\r
676 poly.push(x1 + kage.kMinWidthT * XX,
\r
677 y1 + kage.kMinWidthT * XY);
\r
678 poly.push(x1 + kage.kMinWidthT * 1.5 * XX + kage.kMinWidthY * YX,
\r
679 y1 + kage.kMinWidthT * 1.5 * XY + kage.kMinWidthY * YY);
\r
680 poly.push(x1 + kage.kMinWidthT * 0.5 * XX + kage.kMinWidthY * 3 * YX,
\r
681 y1 + kage.kMinWidthT * 0.5 * XY + kage.kMinWidthY * 3 * YY);
\r
682 polygons.push(poly);
\r
685 else{ //from bottom to up
\r
687 poly = new Polygon();
\r
688 poly.push(x1 - kage.kMinWidthT, y1);
\r
689 poly.push(x1 - kage.kMinWidthT * 1.5, y1 + kage.kMinWidthY);
\r
690 poly.push(x1 - kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 3);
\r
691 polygons.push(poly);
\r
694 poly = new Polygon();
\r
695 poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);
\r
696 poly.push(x1 - kage.kMinWidthT * 1.5 * XX + kage.kMinWidthY * YX, y1 + kage.kMinWidthY * YY - kage.kMinWidthT * 1.5 * XY);
\r
697 poly.push(x1 - kage.kMinWidthT * 0.5 * XX + kage.kMinWidthY * 3 * YX, y1 + kage.kMinWidthY * 3 * YY - kage.kMinWidthT * 0.5 * XY);
\r
698 polygons.push(poly);
\r
704 rad = Math.atan((y3 - y2) / (x3 - x2));
\r
705 if(x2 < x3){ v = 1; } else{ v = -1; }
\r
706 YX = Math.sin(rad) * v * -1;
\r
707 YY = Math.cos(rad) * v;
\r
708 XX = Math.cos(rad) * v;
\r
709 XY = Math.sin(rad) * v;
\r
711 if(a2 == 1 || a2 == 8 || a2 == 15){ //the last filled circle ... it can change 15->5
\r
713 poly = new Polygon();
\r
714 poly.push(x3 - kage.kMinWidthT, y3);
\r
715 poly.push(x3 - kage.kMinWidthT * 0.7, y3 + kage.kMinWidthT * 0.7);
\r
716 poly.push(x3, y3 + kage.kMinWidthT);
\r
717 poly.push(x3 + kage.kMinWidthT * 0.7, y3 + kage.kMinWidthT * 0.7);
\r
718 poly.push(x3 + kage.kMinWidthT, y3);
\r
719 polygons.push(poly);
\r
722 poly = new Polygon();
\r
723 poly.push(x3, y3 - kage.kMinWidthT);
\r
724 poly.push(x3 + kage.kMinWidthT * 0.7, y3 - kage.kMinWidthT * 0.7);
\r
725 poly.push(x3 + kage.kMinWidthT, y3);
\r
726 poly.push(x3 + kage.kMinWidthT * 0.7, y3 + kage.kMinWidthT * 0.7);
\r
727 poly.push(x3, y3 + kage.kMinWidthT);
\r
728 polygons.push(poly);
\r
731 poly = new Polygon();
\r
732 poly.push(x3 + Math.sin(rad) * kage.kMinWidthT * v, y3 - Math.cos(rad) * kage.kMinWidthT * v);
\r
733 poly.push(x3 + Math.cos(rad) * kage.kMinWidthT * 0.7 * v + Math.sin(rad) * kage.kMinWidthT * 0.7 * v,
\r
734 y3 + Math.sin(rad) * kage.kMinWidthT * 0.7 * v - Math.cos(rad) * kage.kMinWidthT * 0.7 * v);
\r
735 poly.push(x3 + Math.cos(rad) * kage.kMinWidthT * v, y3 + Math.sin(rad) * kage.kMinWidthT * v);
\r
736 poly.push(x3 + Math.cos(rad) * kage.kMinWidthT * 0.7 * v - Math.sin(rad) * kage.kMinWidthT * 0.7 * v,
\r
737 y3 + Math.sin(rad) * kage.kMinWidthT * 0.7 * v + Math.cos(rad) * kage.kMinWidthT * 0.7 * v);
\r
738 poly.push(x3 - Math.sin(rad) * kage.kMinWidthT * v, y3 + Math.cos(rad) * kage.kMinWidthT * v);
\r
739 polygons.push(poly);
\r
743 if(a2 == 9 || (a1 == 7 && a2 == 0)){ // Math.sinnyu & L2RD Harai ... no need for a2=9
\r
745 poly = new Polygon();
\r
746 poly.push(x3, y3 + kage.kMinWidthT * kage.kL2RDfatten);
\r
747 poly.push(x3, y3 - kage.kMinWidthT * kage.kL2RDfatten);
\r
748 poly.push(x3 + kage.kMinWidthT * kage.kL2RDfatten, y3 - kage.kMinWidthT * kage.kL2RDfatten);
\r
749 polygons.push(poly);
\r
752 poly = new Polygon();
\r
753 poly.push(x3 + kage.kMinWidthT * kage.kL2RDfatten * YX, y3 + kage.kMinWidthT * kage.kL2RDfatten * YY);
\r
754 poly.push(x3 - kage.kMinWidthT * kage.kL2RDfatten * YX, y3 - kage.kMinWidthT * kage.kL2RDfatten * YY);
\r
755 poly.push(x3 + kage.kMinWidthT * kage.kL2RDfatten * XX - kage.kMinWidthT * kage.kL2RDfatten * YX,
\r
756 y3 + kage.kMinWidthT * kage.kL2RDfatten * XY - kage.kMinWidthT * kage.kL2RDfatten * YY);
\r
757 polygons.push(poly);
\r
761 if(a2 == 15){ //jump up ... it can change 15->5
\r
763 poly = new Polygon();
\r
764 poly.push(x3, y3 - kage.kMinWidthT + 1);
\r
765 poly.push(x3 + 2, y3 - kage.kMinWidthT - kage.kWidth * 5);
\r
766 poly.push(x3, y3 - kage.kMinWidthT - kage.kWidth * 5);
\r
767 poly.push(x3 - kage.kMinWidthT, y3 - kage.kMinWidthT + 1);
\r
768 polygons.push(poly);
\r
771 poly = new Polygon();
\r
772 poly.push(x3 + (kage.kMinWidthT - 1) * Math.sin(rad) * v, y3 - (kage.kMinWidthT - 1) * Math.cos(rad) * v);
\r
773 poly.push(x3 + 2 * Math.cos(rad) * v + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,
\r
774 y3 + 2 * Math.sin(rad) * v - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);
\r
775 poly.push(x3 + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,
\r
776 y3 - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);
\r
777 poly.push(x3 + (kage.kMinWidthT - 1) * Math.sin(rad) * v - kage.kMinWidthT * Math.cos(rad) * v,
\r
778 y3 - (kage.kMinWidthT - 1) * Math.cos(rad) * v - kage.kMinWidthT * Math.sin(rad) * v);
\r
779 polygons.push(poly);
\r
783 if(a2 == 14){ //jump to left, allways go left ... it can change 14->4
\r
784 poly = new Polygon();
\r
786 poly.push(x3, y3 - kage.kMinWidthT);
\r
787 poly.push(x3 - kage.kWidth * 4, y3 - kage.kMinWidthT);
\r
788 poly.push(x3 - kage.kWidth * 4, y3 - kage.kMinWidthT * 0.5);
\r
789 polygons.push(poly);
\r
795 if(y1 < y2){ y1 = y1 - kage.kWidth; } else{ y1 = y1 + kage.kWidth; }
\r
798 if(x1 < x2){ x1 = x1 - kage.kWidth; } else{ x1 = x1 + kage.kWidth; }
\r
801 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
802 if(x1 < x2){ v = 1; } else{ v = -1; }
\r
803 x1 = x1 - kage.kWidth * Math.cos(rad) * v;
\r
804 y1 = y1 - kage.kWidth * Math.sin(rad) * v;
\r
811 y1 = y1 - kage.kWidth * kage.kKakato;
\r
814 y1 = y1 + kage.kWidth * kage.kKakato;
\r
819 x1 = x1 - kage.kWidth * kage.kKakato;
\r
822 x1 = x1 + kage.kWidth * kage.kKakato;
\r
826 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
827 if(x1 < x2){ v = 1; } else{ v = -1; }
\r
828 x1 = x1 - kage.kWidth * Math.cos(rad) * v * kage.kKakato;
\r
829 y1 = y1 - kage.kWidth * Math.sin(rad) * v * kage.kKakato;
\r
834 if(y2 < y3){ y3 = y3 + kage.kWidth; } else{ y3 = y3 - kage.kWidth; }
\r
837 if(x2 < x3){ x3 = x3 + kage.kWidth; } else{ x3 = x3 - kage.kWidth; }
\r
840 rad = Math.atan((y3 - y2) / (x3 - x2));
\r
841 if(x2 < x3){ v = 1; } else{ v = -1; }
\r
842 x3 = x3 + kage.kWidth * Math.cos(rad) * v;
\r
843 y3 = y3 + kage.kWidth * Math.sin(rad) * v;
\r
850 y3 = y3 + kage.kWidth * kage.kKakato;
\r
853 y3 = y3 - kage.kWidth * kage.kKakato;
\r
858 x3 = x3 + kage.kWidth * kage.kKakato;
\r
861 x3 = x3 - kage.kWidth * kage.kKakato;
\r
865 rad = Math.atan((y3 - y2) / (x3 - x2));
\r
866 if(x2 < x3){ v = 1; } else{ v = -1; }
\r
867 x3 = x3 + kage.kWidth * Math.cos(rad) * v * kage.kKakato;
\r
868 y3 = y3 + kage.kWidth * Math.sin(rad) * v * kage.kKakato;
\r
872 poly = new Polygon();
\r
873 poly2 = new Polygon();
\r
875 for(tt = 0; tt <= 1000; tt = tt + kage.kRate){
\r
878 //calculating each point
\r
879 x = ((1.0 - t) * (1.0 - t) * x1 + 2.0 * t * (1.0 - t) * x2 + t * t * x3);
\r
880 y = ((1.0 - t) * (1.0 - t) * y1 + 2.0 * t * (1.0 - t) * y2 + t * t * y3);
\r
882 //SESSEN NO KATAMUKI NO KEISAN(BIBUN)
\r
883 ix = (x1 - 2.0 * x2 + x3) * 2.0 * t + (-2.0 * x1 + 2.0 * x2);
\r
884 iy = (y1 - 2.0 * y2 + y3) * 2.0 * t + (-2.0 * y1 + 2.0 * y2);
\r
886 //SESSEN NI SUICHOKU NA CHOKUSEN NO KEISAN
\r
887 if(kage.kShotai == kage.kMincho){ //always false ?
\r
888 if(ix != 0 && iy != 0){
\r
889 ir = Math.atan(iy / ix * -1.0);
\r
890 ia = Math.sin(ir) * kage.kMinWidthT;
\r
891 ib = Math.cos(ir) * kage.kMinWidthT;
\r
894 ia = kage.kMinWidthT;
\r
899 ib = kage.kMinWidthT;
\r
901 ia = ia * Math.sqrt(1.0 - t);
\r
902 ib = ib * Math.sqrt(1.0 - t);
\r
905 if(ix != 0 && iy != 0){
\r
906 ir = Math.atan(iy / ix * -1.0);
\r
907 ia = Math.sin(ir) * kage.kWidth;
\r
908 ib = Math.cos(ir) * kage.kWidth;
\r
920 //reverse if vector is going 2nd/3rd quadrants
\r
927 poly.push(x - ia, y - ib);
\r
928 poly2.push(x + ia, y + ib);
\r
932 poly.concat(poly2);
\r
933 polygons.push(poly);
\r
937 function cdDrawLine(kage, polygons, tx1, ty1, tx2, ty2, ta1, ta2){
\r
939 var v, x1, y1, x2, y2;
\r
941 var XX, XY, YX, YY;
\r
944 if(kage.kShotai == kage.kMincho){ //mincho
\r
952 if(x1 == x2){ //if TATE stroke, use y-axis
\r
953 poly = new Polygon(4);
\r
956 poly.set(3, x1 - kage.kMinWidthT, y1 - kage.kMinWidthY / 2);
\r
957 poly.set(0, x1 + kage.kMinWidthT, y1 + kage.kMinWidthY / 2);
\r
960 case 6: //... no need
\r
962 poly.set(3, x1 - kage.kMinWidthT, y1);
\r
963 poly.set(0, x1 + kage.kMinWidthT, y1);
\r
966 poly.set(3, x1 - kage.kMinWidthT, y1 - kage.kMinWidthY - kage.kMinWidthT);
\r
967 poly.set(0, x1 + kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
970 poly.set(3, x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
971 poly.set(0, x1 + kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
977 if(a1 == 6){ //KAGI's tail ... no need
\r
978 poly.set(2, x2 - kage.kMinWidthT, y2);
\r
979 poly.set(1, x2 + kage.kMinWidthT, y2);
\r
982 poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kMinWidthT / 2);
\r
983 poly.set(1, x2 + kage.kMinWidthT, y2 - kage.kMinWidthT / 2);
\r
987 poly.set(2, x2 - kage.kMinWidthT, y2);
\r
988 poly.set(1, x2 + kage.kMinWidthT, y2);
\r
991 poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kWidth * kage.kKakato + kage.kMinWidthT);
\r
992 poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kWidth * kage.kKakato);
\r
995 poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kWidth * kage.kKakato * 0.5 + kage.kMinWidthT);
\r
996 poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kWidth * kage.kKakato * 0.5);
\r
999 poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kMinWidthY);
\r
1000 poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kMinWidthY);
\r
1004 polygons.push(poly);
\r
1006 if(a1 == 22){ //box's right top corner
\r
1007 poly = new Polygon();
\r
1008 poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
1009 poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);
\r
1010 poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);
\r
1011 poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);
\r
1012 poly.push(x1 - kage.kMinWidthT, y1);
\r
1013 polygons.push(poly);
\r
1016 if(a1 == 0){ //beginning of the stroke
\r
1017 poly = new Polygon();
\r
1018 poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthY * 0.5);
\r
1019 poly.push(x1 + kage.kMinWidthT + kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 0.5 + kage.kMinWidthY);
\r
1020 poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2);
\r
1021 polygons.push(poly);
\r
1024 if((a1 == 6 && a2 == 0) || a2 == 1){ //KAGI NO YOKO BOU NO SAIGO NO MARU ... no need only used at 1st=yoko
\r
1025 poly = new Polygon();
\r
1026 poly.push(x2 - kage.kMinWidthT, y2);
\r
1027 poly.push(x2 - kage.kMinWidthT * 0.6, y2 + kage.kMinWidthT * 0.6);
\r
1028 poly.push(x2, y2 + kage.kMinWidthT);
\r
1029 poly.push(x2 + kage.kMinWidthT * 0.6, y2 + kage.kMinWidthT * 0.6);
\r
1030 poly.push(x2 + kage.kMinWidthT, y2);
\r
1031 poly.reverse(); // for fill-rule
\r
1032 polygons.push(poly);
\r
1035 else if(y1 == y2){ //if it is YOKO stroke, use x-axis
\r
1036 if(a1 == 6){ //if it is KAGI's YOKO stroke, get bold
\r
1037 poly = new Polygon();
\r
1038 poly.push(x1, y1 - kage.kMinWidthT);
\r
1039 poly.push(x2, y2 - kage.kMinWidthT);
\r
1040 poly.push(x2, y2 + kage.kMinWidthT);
\r
1041 poly.push(x1, y1 + kage.kMinWidthT);
\r
1042 polygons.push(poly);
\r
1044 if(a2 == 1 || a2 == 0 || a2 == 5){ // no need a2=1
\r
1045 //KAGI NO YOKO BOU NO SAIGO NO MARU
\r
1046 poly = new Polygon();
\r
1047 poly.push(x2, y2 - kage.kMinWidthT);
\r
1048 poly.push(x2 + kage.kMinWidthT * 0.6, y2 - kage.kMinWidthT * 0.6);
\r
1049 poly.push(x2 + kage.kMinWidthT, y2);
\r
1050 poly.push(x2 + kage.kMinWidthT * 0.6, y2 + kage.kMinWidthT * 0.6);
\r
1051 poly.push(x2, y2 + kage.kMinWidthT);
\r
1052 polygons.push(poly);
\r
1056 //KAGI NO YOKO BOU NO HANE
\r
1057 poly = new Polygon();
\r
1058 poly.push(x2, y2 - kage.kMinWidthT + 1);
\r
1059 poly.push(x2 + 2, y2 - kage.kMinWidthT - kage.kWidth * 5);
\r
1060 poly.push(x2, y2 - kage.kMinWidthT - kage.kWidth * 5);
\r
1061 poly.push(x2 - kage.kMinWidthT, y2 - kage.kMinWidthT + 1);
\r
1062 poly.reverse(); // for fill-rule
\r
1063 polygons.push(poly);
\r
1067 poly = new Polygon(4);
\r
1070 poly.set(0, x1, y1 - kage.kMinWidthY);
\r
1071 poly.set(3, x1, y1 + kage.kMinWidthY);
\r
1074 poly.set(0, x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
1075 poly.set(3, x1 - kage.kMinWidthT, y1 + kage.kMinWidthY);
\r
1081 poly.set(1, x2, y2 - kage.kMinWidthY);
\r
1082 poly.set(2, x2, y2 + kage.kMinWidthY);
\r
1085 poly.set(1, x2 + kage.kMinWidthT, y2 - kage.kMinWidthY);
\r
1086 poly.set(2, x2 + kage.kMinWidthT, y2 + kage.kMinWidthY);
\r
1089 polygons.push(poly);
\r
1093 poly = new Polygon();
\r
1094 poly.push(x2, y2 - kage.kMinWidthY);
\r
1095 poly.push(x2 - 24, y2);
\r
1096 poly.push(x2 - 12, y2 - 12);
\r
1097 polygons.push(poly);
\r
1101 else{ //for others, use x-axis
\r
1102 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
1103 if((Math.abs(y2 - y1) < Math.abs(x2 - x1)) && (a1 != 6) && (a2 != 6) && !(x1 > x2)){ //ASAI KAUDO
\r
1104 poly = new Polygon(4);
\r
1105 switch(a1){ //must be 0 or 2
\r
1107 poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthY, y1 - Math.cos(rad) * kage.kMinWidthY);
\r
1108 poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthY, y1 + Math.cos(rad) * kage.kMinWidthY);
\r
1111 poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthY - kage.kMinWidthT * Math.cos(rad),
\r
1112 y1 - Math.cos(rad) * kage.kMinWidthY - kage.kMinWidthT * Math.sin(rad));
\r
1113 poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthY - kage.kMinWidthT * Math.cos(rad),
\r
1114 y1 + Math.cos(rad) * kage.kMinWidthY - kage.kMinWidthT * Math.sin(rad));
\r
1118 switch(a2){ //must be 0 or 2
\r
1120 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthY, y2 - Math.cos(rad) * kage.kMinWidthY);
\r
1121 poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthY, y2 + Math.cos(rad) * kage.kMinWidthY);
\r
1124 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthY + kage.kMinWidthT * Math.cos(rad),
\r
1125 y2 - Math.cos(rad) * kage.kMinWidthY + kage.kMinWidthT * Math.sin(rad));
\r
1126 poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthY + kage.kMinWidthT * Math.cos(rad),
\r
1127 y2 + Math.cos(rad) * kage.kMinWidthY + kage.kMinWidthT * Math.sin(rad));
\r
1130 polygons.push(poly);
\r
1134 poly = new Polygon();
\r
1135 poly.push(x2 + Math.sin(rad) * kage.kMinWidthY, y2 - Math.cos(rad) * kage.kMinWidthY);
\r
1136 poly.push(x2 - Math.cos(rad) * 24, y2 - Math.sin(rad) * 24);
\r
1137 poly.push(x2 - Math.cos(rad) * 12 + Math.sin(rad) * 12, y2 - Math.sin(rad) * 12 - Math.cos(rad) * 12);
\r
1138 polygons.push(poly);
\r
1142 else{ //KAKUDO GA FUKAI or KAGI NO YOKO BOU
\r
1143 if(x1 > x2){ v = -1; } else{ v = 1; }
\r
1144 poly = new Polygon(4);
\r
1147 poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.cos(rad) * 0.5 * v,
\r
1148 y1 - Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.sin(rad) * 0.5 * v);
\r
1149 poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * 0.5 * v,
\r
1150 y1 + Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * 0.5 * v);
\r
1155 poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v, y1 - Math.cos(rad) * kage.kMinWidthT * v);
\r
1156 poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v, y1 + Math.cos(rad) * kage.kMinWidthT * v);
\r
1159 poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * v,
\r
1160 y1 - Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * v);
\r
1161 poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v - (kage.kMinWidthT + kage.kMinWidthY) * Math.cos(rad) * v,
\r
1162 y1 + Math.cos(rad) * kage.kMinWidthT * v - (kage.kMinWidthT + kage.kMinWidthY) * Math.sin(rad) * v);
\r
1165 poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * v,
\r
1166 y1 - Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * v);
\r
1167 poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * v,
\r
1168 y1 + Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * v);
\r
1175 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);
\r
1176 poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);
\r
1179 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthT * 0.5 * Math.cos(rad) * v,
\r
1180 y2 - Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthT * 0.5 * Math.sin(rad) * v);
\r
1181 poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthT * 0.5 * Math.cos(rad) * v,
\r
1182 y2 + Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthT * 0.5 * Math.sin(rad) * v);
\r
1185 case 1: // is needed?
\r
1187 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);
\r
1188 poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);
\r
1191 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kWidth * kage.kKakato * Math.cos(rad) * v,
\r
1192 y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kWidth * kage.kKakato * Math.sin(rad) * v);
\r
1193 poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v + (kage.kWidth * kage.kKakato + kage.kMinWidthT) * Math.cos(rad) * v,
\r
1194 y2 + Math.cos(rad) * kage.kMinWidthT * v + (kage.kWidth * kage.kKakato + kage.kMinWidthT) * Math.sin(rad) * v);
\r
1197 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kWidth * kage.kKakato * 0.5 * Math.cos(rad) * v,
\r
1198 y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kWidth * kage.kKakato * 0.5 * Math.sin(rad) * v);
\r
1200 x2 - Math.sin(rad) * kage.kMinWidthT * v + (kage.kWidth * kage.kKakato * 0.5 + kage.kMinWidthT) * Math.cos(rad) * v,
\r
1201 y2 + Math.cos(rad) * kage.kMinWidthT * v + (kage.kWidth * kage.kKakato * 0.5 + kage.kMinWidthT) * Math.sin(rad) * v);
\r
1204 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.cos(rad) * v,
\r
1205 y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.sin(rad) * v);
\r
1206 poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.cos(rad) * v,
\r
1207 y2 + Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.sin(rad) * v);
\r
1211 polygons.push(poly);
\r
1213 if((a1 == 6) && (a2 == 0 || a2 == 5)){ //KAGI NO YOKO BOU NO SAIGO NO MARU
\r
1214 poly = new Polygon();
\r
1215 poly.push(x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);
\r
1216 poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * 0.8 * v + Math.sin(rad) * kage.kMinWidthT * 0.6 * v,
\r
1217 y2 + Math.sin(rad) * kage.kMinWidthT * 0.8 * v - Math.cos(rad) * kage.kMinWidthT * 0.6 * v);
\r
1218 poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * v, y2 + Math.sin(rad) * kage.kMinWidthT * v);
\r
1219 poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * 0.8 * v - Math.sin(rad) * kage.kMinWidthT * 0.6 * v,
\r
1220 y2 + Math.sin(rad) * kage.kMinWidthT * 0.8 * v + Math.cos(rad) * kage.kMinWidthT * 0.6 * v);
\r
1221 poly.push(x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);
\r
1222 polygons.push(poly);
\r
1225 if(a1 == 6 && a2 == 5){
\r
1226 //KAGI NO YOKO BOU NO HANE
\r
1227 poly = new Polygon();
\r
1228 poly.push(x2 + (kage.kMinWidthT - 1) * Math.sin(rad) * v, y2 - (kage.kMinWidthT - 1) * Math.cos(rad) * v);
\r
1229 poly.push(x2 + 2 * Math.cos(rad) * v + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,
\r
1230 y2 + 2 * Math.sin(rad) * v - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);
\r
1231 poly.push(x2 + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,
\r
1232 y2 - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);
\r
1233 poly.push(x2 + (kage.kMinWidthT - 1) * Math.sin(rad) * v - kage.kMinWidthT * Math.cos(rad) * v,
\r
1234 y2 - (kage.kMinWidthT - 1) * Math.cos(rad) * v - kage.kMinWidthT * Math.sin(rad) * v);
\r
1235 polygons.push(poly);
\r
1238 if(a1 == 22){ //SHIKAKU MIGIUE UROKO NANAME DEMO MASSUGU MUKI
\r
1239 poly = new Polygon();
\r
1240 poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
1241 poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);
\r
1242 poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);
\r
1243 poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);
\r
1244 poly.push(x1 - kage.kMinWidthT, y1);
\r
1245 polygons.push(poly);
\r
1248 XX = Math.sin(rad) * v;
\r
1249 XY = Math.cos(rad) * v * -1;
\r
1250 YX = Math.cos(rad) * v;
\r
1251 YY = Math.sin(rad) * v;
\r
1253 if(a1 == 0){ //beginning of the storke
\r
1254 poly = new Polygon();
\r
1255 poly.push(x1 + kage.kMinWidthT * XX + (kage.kMinWidthY * 0.5) * YX,
\r
1256 y1 + kage.kMinWidthT * XY + (kage.kMinWidthY * 0.5) * YY);
\r
1257 poly.push(x1 + (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YX,
\r
1258 y1 + (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YY);
\r
1259 poly.push(x1 + kage.kMinWidthT * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YX,
\r
1260 y1 + kage.kMinWidthT * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YY);
\r
1261 polygons.push(poly);
\r
1267 if(tx1 == tx2){ //if TATE stroke, use y-axis
\r
1285 if(a1 % 10 == 2){ y1 = y1 - kage.kWidth; }
\r
1286 if(a2 % 10 == 2){ y2 = y2 + kage.kWidth; }
\r
1287 if(a1 % 10 == 3){ y1 = y1 - kage.kWidth * kage.kKakato; }
\r
1288 if(a2 % 10 == 3){ y2 = y2 + kage.kWidth * kage.kKakato; }
\r
1290 poly = new Polygon();
\r
1291 poly.push(x1 - kage.kWidth, y1);
\r
1292 poly.push(x2 - kage.kWidth, y2);
\r
1293 poly.push(x2 + kage.kWidth, y2);
\r
1294 poly.push(x1 + kage.kWidth, y1);
\r
1295 poly.reverse(); // for fill-rule
\r
1297 polygons.push(poly);
\r
1299 else if(ty1 == ty2){ //if YOKO stroke, use x-axis
\r
1316 if(a1 % 10 == 2){ x1 = x1 - kage.kWidth; }
\r
1317 if(a2 % 10 == 2){ x2 = x2 + kage.kWidth; }
\r
1318 if(a1 % 10 == 3){ x1 = x1 - kage.kWidth * kage.kKakato; }
\r
1319 if(a2 % 10 == 3){ x2 = x2 + kage.kWidth * kage.kKakato; }
\r
1321 poly = new Polygon();
\r
1322 poly.push(x1, y1 - kage.kWidth);
\r
1323 poly.push(x2, y2 - kage.kWidth);
\r
1324 poly.push(x2, y2 + kage.kWidth);
\r
1325 poly.push(x1, y1 + kage.kWidth);
\r
1327 polygons.push(poly);
\r
1329 else{ //for others, use x-axis
\r
1346 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
1348 x1 = x1 - kage.kWidth * Math.cos(rad);
\r
1349 y1 = y1 - kage.kWidth * Math.sin(rad);
\r
1352 x2 = x2 + kage.kWidth * Math.cos(rad);
\r
1353 y2 = y2 + kage.kWidth * Math.sin(rad);
\r
1356 x1 = x1 - kage.kWidth * Math.cos(rad) * kage.kKakato;
\r
1357 y1 = y1 - kage.kWidth * Math.sin(rad) * kage.kKakato;
\r
1360 x2 = x2 + kage.kWidth * Math.cos(rad) * kage.kKakato;
\r
1361 y2 = y2 + kage.kWidth * Math.sin(rad) * kage.kKakato;
\r
1364 //SUICHOKU NO ICHI ZURASHI HA Math.sin TO Math.cos NO IREKAE + x-axis MAINASU KA
\r
1365 poly = new Polygon();
\r
1366 poly.push(x1 + Math.sin(rad) * kage.kWidth, y1 - Math.cos(rad) * kage.kWidth);
\r
1367 poly.push(x2 + Math.sin(rad) * kage.kWidth, y2 - Math.cos(rad) * kage.kWidth);
\r
1368 poly.push(x2 - Math.sin(rad) * kage.kWidth, y2 + Math.cos(rad) * kage.kWidth);
\r
1369 poly.push(x1 - Math.sin(rad) * kage.kWidth, y1 + Math.cos(rad) * kage.kWidth);
\r
1371 polygons.push(poly);
\r