1 function cdDrawCurveU(kage, polygons, x1, y1, sx1, sy1, sx2, sy2, x2, y2, a1, a2){
\r
4 var ix, iy, ia, ib, ir;
\r
12 if(kage.kShotai == kage.kMincho){ // mincho
\r
16 delta = -1 * kage.kMinWidthY * 0.5;
\r
19 case 2: // ... must be 32
\r
27 delta = kage.kMinWidthY;
\r
34 if(y1 < sy1){ y1 = y1 - delta; }
\r
35 else{ y1 = y1 + delta; }
\r
38 if(x1 < sx1){ x1 = x1 - delta; }
\r
39 else{ x1 = x1 + delta; }
\r
42 rad = Math.atan((sy1 - y1) / (sx1 - x1));
\r
43 if(x1 < sx1){ v = 1; } else{ v = -1; }
\r
44 x1 = x1 - delta * Math.cos(rad) * v;
\r
45 y1 = y1 - delta * Math.sin(rad) * v;
\r
53 case 15: // it can change to 15->5
\r
54 case 14: // it can change to 14->4
\r
59 case 8: // get shorten for tail's circle
\r
60 delta = -1 * kage.kMinWidthT * 0.5;
\r
67 if(sy2 < y2){ y2 = y2 + delta; }
\r
68 else{ y2 = y2 - delta; }
\r
71 if(sx2 < x2){ x2 = x2 + delta; }
\r
72 else{ x2 = x2 - delta; }
\r
75 rad = Math.atan((y2 - sy2) / (x2 - sx2));
\r
76 if(sx2 < x2){ v = 1; } else{ v = -1; }
\r
77 x2 = x2 + delta * Math.cos(rad) * v;
\r
78 y2 = y2 + delta * Math.sin(rad) * v;
\r
82 if(Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) < 50){
\r
83 hosomi += 0.4 * (1 - Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) / 50);
\r
86 poly = new Polygon();
\r
87 poly2 = new Polygon();
\r
89 for(tt = 0; tt <= 1000; tt = tt + kage.kRate){
\r
92 if(sx1 == sx2 && sy1 == sy2){ // Spline
\r
94 x = ((1.0 - t) * (1.0 - t) * x1 + 2.0 * t * (1.0 - t) * sx1 + t * t * x2);
\r
95 y = ((1.0 - t) * (1.0 - t) * y1 + 2.0 * t * (1.0 - t) * sy1 + t * t * y2);
\r
97 //KATAMUKI of vector by BIBUN
\r
98 ix = (x1 - 2.0 * sx1 + x2) * 2.0 * t + (-2.0 * x1 + 2.0 * sx1);
\r
99 iy = (y1 - 2.0 * sy1 + y2) * 2.0 * t + (-2.0 * y1 + 2.0 * sy1);
\r
102 x = (1.0 - t) * (1.0 - t) * (1.0 - t) * x1 + 3.0 * t * (1.0 - t) * (1.0 - t) * sx1 + 3 * t * t * (1.0 - t) * sx2 + t * t * t * x2;
\r
103 y = (1.0 - t) * (1.0 - t) * (1.0 - t) * y1 + 3.0 * t * (1.0 - t) * (1.0 - t) * sy1 + 3 * t * t * (1.0 - t) * sy2 + t * t * t * y2;
\r
104 //KATAMUKI of vector by BIBUN
\r
105 ix = t * t * (-3 * x1 + 9 * sx1 + -9 * sx2 + 3 * x2) + t * (6 * x1 + -12 * sx1 + 6 * sx2) + -3 * x1 + 3 * sx1;
\r
106 iy = t * t * (-3 * y1 + 9 * sy1 + -9 * sy2 + 3 * y2) + t * (6 * y1 + -12 * sy1 + 6 * sy2) + -3 * y1 + 3 * sy1;
\r
108 //line SUICHOKU by vector
\r
109 if(ix != 0 && iy != 0){
\r
110 ir = Math.atan(iy / ix * -1);
\r
111 ia = Math.sin(ir) * (kage.kMinWidthT);
\r
112 ib = Math.cos(ir) * (kage.kMinWidthT);
\r
115 ia = kage.kMinWidthT;
\r
120 ib = kage.kMinWidthT;
\r
123 if(a1 == 7 && a2 == 0){ // L2RD: fatten
\r
124 deltad = Math.pow(t, hosomi) * kage.kL2RDfatten;
\r
127 deltad = Math.pow(t, hosomi);
\r
130 deltad = Math.pow(1.0 - t, hosomi);
\r
132 else{ deltad = 1; }
\r
140 //reverse if vector is going 2nd/3rd quadrants
\r
146 //copy to polygon structure
\r
147 poly.push(x - ia, y - ib);
\r
148 poly2.push(x + ia, y + ib);
\r
151 // suiheisen ni setsuzoku
\r
155 if(poly2.array[index].y <= y1 && y1 <= poly2.array[index + 1].y){
\r
160 newx1 = poly2.array[index + 1].x + (poly2.array[index].x - poly2.array[index + 1].x) *
\r
161 (poly2.array[index + 1].y - y1) / (poly2.array[index + 1].y - poly2.array[index].y);
\r
163 newx2 = poly.array[0].x + (poly.array[0].x - poly.array[1].x) * (poly.array[0].y - y1) /
\r
164 (poly.array[1].y - poly.array[0].y);
\r
167 for(var i = 0; i < index; i++){
\r
170 poly2.set(0, newx1, newy1);
\r
171 poly.unshift(newx2, newy2);
\r
175 poly.concat(poly2);
\r
176 polygons.push(poly);
\r
178 //process for head of stroke
\r
179 rad = Math.atan((sy1 - y1) / (sx1 - x1));
\r
180 if(x1 < sx1){ v = 1; } else{ v = -1; }
\r
181 XX = Math.sin(rad) * v;
\r
182 XY = Math.cos(rad) * v * -1;
\r
183 YX = Math.cos(rad) * v;
\r
184 YY = Math.sin(rad) * v;
\r
188 poly= new Polygon();
\r
189 poly.push(x1 - kage.kMinWidthT, y1);
\r
190 poly.push(x1 + kage.kMinWidthT, y1);
\r
191 poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthT);
\r
192 polygons.push(poly);
\r
195 poly = new Polygon();
\r
196 poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);
\r
197 poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);
\r
198 poly.push(x1 - kage.kMinWidthT * XX - kage.kMinWidthT * YX, y1 - kage.kMinWidthT * XY - kage.kMinWidthT * YY);
\r
199 polygons.push(poly);
\r
206 if(y1 <= y2){ //from up to bottom
\r
207 type = (Math.atan2(Math.abs(y1 - sy1), Math.abs(x1 - sx1)) / Math.PI * 2 - 0.4);
\r
219 poly = new Polygon();
\r
220 poly.push(x1 - kage.kMinWidthT, y1);
\r
221 poly.push(x1 + kage.kMinWidthT, y1);
\r
222 poly.push(x1 - kage.kMinWidthT * pm, y1 - kage.kMinWidthY * type * pm);
\r
223 polygons.push(poly);
\r
226 poly = new Polygon();
\r
227 poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);
\r
228 poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);
\r
229 poly.push(x1 - kage.kMinWidthT * pm * XX - kage.kMinWidthY * type * pm * YX, y1 - kage.kMinWidthT * pm * XY - kage.kMinWidthY * type * pm * YY);
\r
230 polygons.push(poly);
\r
233 else{ //bottom to up
\r
235 poly = new Polygon();
\r
236 poly.push(x1 - kage.kMinWidthT, y1);
\r
237 poly.push(x1 + kage.kMinWidthT, y1);
\r
238 poly.push(x1 + kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
239 polygons.push(poly);
\r
242 poly = new Polygon();
\r
243 poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);
\r
244 poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);
\r
245 poly.push(x1 + kage.kMinWidthT * XX - kage.kMinWidthY * YX, y1 + kage.kMinWidthT * XY - kage.kMinWidthY * YY);
\r
246 polygons.push(poly);
\r
251 if(a1 == 22){ //box's up-right corner, any time same degree
\r
252 poly = new Polygon();
\r
253 poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
254 poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);
\r
255 poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);
\r
256 poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);
\r
257 poly.push(x1, y1 + kage.kMinWidthT);
\r
258 polygons.push(poly);
\r
261 if(a1 == 0){ //beginning of the stroke
\r
262 if(y1 <= y2){ //from up to bottom
\r
266 var move = kage.kMinWidthY * type * pm;
\r
268 poly = new Polygon();
\r
269 poly.push(x1 + kage.kMinWidthT, y1 - move);
\r
270 poly.push(x1 + kage.kMinWidthT * 1.5, y1 + kage.kMinWidthY - move);
\r
271 poly.push(x1 + kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 3 - move / 2);
\r
272 polygons.push(poly);
\r
275 poly = new Polygon();
\r
276 poly.push(x1 + kage.kMinWidthT * XX - move * YX,
\r
277 y1 + kage.kMinWidthT * XY - move * YY);
\r
278 poly.push(x1 + kage.kMinWidthT * 1.5 * XX + (kage.kMinWidthY - move * 1.2) * YX,
\r
279 y1 + kage.kMinWidthT * 1.5 * XY + (kage.kMinWidthY - move * 1.2) * YY);
\r
280 poly.push(x1 + kage.kMinWidthT * 0.5 * XX + (kage.kMinWidthY * 3 - move * 0.8) * YX,
\r
281 y1 + kage.kMinWidthT * 0.5 * XY + (kage.kMinWidthY * 3 - move * 0.8) * YY);
\r
282 polygons.push(poly);
\r
285 else{ //from bottom to up
\r
287 poly = new Polygon();
\r
288 poly.push(x1 - kage.kMinWidthT, y1);
\r
289 poly.push(x1 - kage.kMinWidthT * 1.5, y1 + kage.kMinWidthY);
\r
290 poly.push(x1 - kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 3);
\r
291 polygons.push(poly);
\r
294 poly = new Polygon();
\r
295 poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);
\r
296 poly.push(x1 - kage.kMinWidthT * 1.5 * XX + kage.kMinWidthY * YX, y1 + kage.kMinWidthY * YY - kage.kMinWidthT * 1.5 * XY);
\r
297 poly.push(x1 - kage.kMinWidthT * 0.5 * XX + kage.kMinWidthY * 3 * YX, y1 + kage.kMinWidthY * 3 * YY - kage.kMinWidthT * 0.5 * XY);
\r
298 polygons.push(poly);
\r
304 rad = Math.atan((y2 - sy2) / (x2 - sx2));
\r
305 if(sx2 < x2){ v = 1; } else{ v = -1; }
\r
306 YX = Math.sin(rad) * v * -1;
\r
307 YY = Math.cos(rad) * v;
\r
308 XX = Math.cos(rad) * v;
\r
309 XY = Math.sin(rad) * v;
\r
311 if(a2 == 1 || a2 == 8 || a2 == 15){ //the last filled circle ... it can change 15->5
\r
313 poly = new Polygon();
\r
314 poly.push(x2 - kage.kMinWidthT, y2);
\r
315 poly.push(x2 - kage.kMinWidthT * 0.7, y2 + kage.kMinWidthT * 0.7);
\r
316 poly.push(x2, y2 + kage.kMinWidthT);
\r
317 poly.push(x2 + kage.kMinWidthT * 0.7, y2 + kage.kMinWidthT * 0.7);
\r
318 poly.push(x2 + kage.kMinWidthT, y2);
\r
319 polygons.push(poly);
\r
321 else if(sy2 == y2){
\r
322 poly = new Polygon();
\r
323 poly.push(x2, y2 - kage.kMinWidthT);
\r
324 poly.push(x2 + kage.kMinWidthT * 0.7, y2 - kage.kMinWidthT * 0.7);
\r
325 poly.push(x2 + kage.kMinWidthT, y2);
\r
326 poly.push(x2 + kage.kMinWidthT * 0.7, y2 + kage.kMinWidthT * 0.7);
\r
327 poly.push(x2, y2 + kage.kMinWidthT);
\r
328 polygons.push(poly);
\r
331 poly = new Polygon();
\r
332 poly.push(x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);
\r
333 poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * 0.7 * v + Math.sin(rad) * kage.kMinWidthT * 0.7 * v,
\r
334 y2 + Math.sin(rad) * kage.kMinWidthT * 0.7 * v - Math.cos(rad) * kage.kMinWidthT * 0.7 * v);
\r
335 poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * v, y2 + Math.sin(rad) * kage.kMinWidthT * v);
\r
336 poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * 0.7 * v - Math.sin(rad) * kage.kMinWidthT * 0.7 * v,
\r
337 y2 + Math.sin(rad) * kage.kMinWidthT * 0.7 * v + Math.cos(rad) * kage.kMinWidthT * 0.7 * v);
\r
338 poly.push(x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);
\r
339 polygons.push(poly);
\r
343 if(a2 == 9 || (a1 == 7 && a2 == 0)){ // Math.sinnyu & L2RD Harai ... no need for a2=9
\r
344 var type = (Math.atan2(Math.abs(y2 - sy2), Math.abs(x2 - sx2)) / Math.PI * 2 - 0.6);
\r
357 poly = new Polygon();
\r
358 poly.push(x2, y2 + kage.kMinWidthT * kage.kL2RDfatten);
\r
359 poly.push(x2, y2 - kage.kMinWidthT * kage.kL2RDfatten);
\r
360 poly.push(x2 + kage.kMinWidthT * kage.kL2RDfatten * Math.abs(type), y2 + kage.kMinWidthT * kage.kL2RDfatten * pm);
\r
361 polygons.push(poly);
\r
364 poly = new Polygon();
\r
365 poly.push(x2 + kage.kMinWidthT * kage.kL2RDfatten * YX, y2 + kage.kMinWidthT * kage.kL2RDfatten * YY);
\r
366 poly.push(x2 - kage.kMinWidthT * kage.kL2RDfatten * YX, y2 - kage.kMinWidthT * kage.kL2RDfatten * YY);
\r
367 poly.push(x2 + kage.kMinWidthT * kage.kL2RDfatten * Math.abs(type) * XX + kage.kMinWidthT * kage.kL2RDfatten * pm * YX,
\r
368 y2 + kage.kMinWidthT * kage.kL2RDfatten * Math.abs(type) * XY + kage.kMinWidthT * kage.kL2RDfatten * pm * YY);
\r
369 polygons.push(poly);
\r
373 if(a2 == 15){ //jump up ... it can change 15->5
\r
375 poly = new Polygon();
\r
376 poly.push(x2, y2 - kage.kMinWidthT + 1);
\r
377 poly.push(x2 + 2, y2 - kage.kMinWidthT - kage.kWidth * 5);
\r
378 poly.push(x2, y2 - kage.kMinWidthT - kage.kWidth * 5);
\r
379 poly.push(x2 - kage.kMinWidthT, y2 - kage.kMinWidthT + 1);
\r
380 polygons.push(poly);
\r
383 poly = new Polygon();
\r
384 poly.push(x2 + (kage.kMinWidthT - 1) * Math.sin(rad) * v, y2 - (kage.kMinWidthT - 1) * Math.cos(rad) * v);
\r
385 poly.push(x2 + 2 * Math.cos(rad) * v + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,
\r
386 y2 + 2 * Math.sin(rad) * v - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);
\r
387 poly.push(x2 + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,
\r
388 y2 - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);
\r
389 poly.push(x2 + (kage.kMinWidthT - 1) * Math.sin(rad) * v - kage.kMinWidthT * Math.cos(rad) * v,
\r
390 y2 - (kage.kMinWidthT - 1) * Math.cos(rad) * v - kage.kMinWidthT * Math.sin(rad) * v);
\r
391 polygons.push(poly);
\r
395 if(a2 == 14){ //jump to left, allways go left ... it can change 14->4
\r
396 poly = new Polygon();
\r
398 poly.push(x2, y2 - kage.kMinWidthT);
\r
399 poly.push(x2 - kage.kWidth * 4, y2 - kage.kMinWidthT);
\r
400 poly.push(x2 - kage.kWidth * 4, y2 - kage.kMinWidthT * 0.5);
\r
401 polygons.push(poly);
\r
407 if(y1 < sy1){ y1 = y1 - kage.kWidth; } else{ y1 = y1 + kage.kWidth; }
\r
409 else if(y1 == sy1){
\r
410 if(x1 < sx1){ x1 = x1 - kage.kWidth; } else{ x1 = x1 + kage.kWidth; }
\r
413 rad = Math.atan((sy1 - y1) / (sx1 - x1));
\r
414 if(x1 < sx1){ v = 1; } else{ v = -1; }
\r
415 x1 = x1 - kage.kWidth * Math.cos(rad) * v;
\r
416 y1 = y1 - kage.kWidth * Math.sin(rad) * v;
\r
423 y1 = y1 - kage.kWidth * kage.kKakato;
\r
426 y1 = y1 + kage.kWidth * kage.kKakato;
\r
429 else if(y1 == sy1){
\r
431 x1 = x1 - kage.kWidth * kage.kKakato;
\r
434 x1 = x1 + kage.kWidth * kage.kKakato;
\r
438 rad = Math.atan((sy1 - y1) / (sx1 - x1));
\r
439 if(x1 < sx1){ v = 1; } else{ v = -1; }
\r
440 x1 = x1 - kage.kWidth * Math.cos(rad) * v * kage.kKakato;
\r
441 y1 = y1 - kage.kWidth * Math.sin(rad) * v * kage.kKakato;
\r
446 if(sy2 < y2){ y2 = y2 + kage.kWidth; } else{ y2 = y2 - kage.kWidth; }
\r
448 else if(sy2 == y2){
\r
449 if(sx2 < x2){ x2 = x2 + kage.kWidth; } else{ x2 = x2 - kage.kWidth; }
\r
452 rad = Math.atan((y2 - sy2) / (x2 - sx2));
\r
453 if(sx2 < x2){ v = 1; } else{ v = -1; }
\r
454 x2 = x2 + kage.kWidth * Math.cos(rad) * v;
\r
455 y2 = y2 + kage.kWidth * Math.sin(rad) * v;
\r
462 y2 = y2 + kage.kWidth * kage.kKakato;
\r
465 y2 = y2 - kage.kWidth * kage.kKakato;
\r
468 else if(sy2 == y2){
\r
470 x2 = x2 + kage.kWidth * kage.kKakato;
\r
473 x2 = x2 - kage.kWidth * kage.kKakato;
\r
477 rad = Math.atan((y2 - sy2) / (x2 - sx2));
\r
478 if(sx2 < x2){ v = 1; } else{ v = -1; }
\r
479 x2 = x2 + kage.kWidth * Math.cos(rad) * v * kage.kKakato;
\r
480 y2 = y2 + kage.kWidth * Math.sin(rad) * v * kage.kKakato;
\r
484 poly = new Polygon();
\r
485 poly2 = new Polygon();
\r
487 for(tt = 0; tt <= 1000; tt = tt + kage.kRate){
\r
490 if(sx1 == sx2 && sy1 == sy2){
\r
491 //calculating each point
\r
492 x = ((1.0 - t) * (1.0 - t) * x1 + 2.0 * t * (1.0 - t) * sx1 + t * t * x2);
\r
493 y = ((1.0 - t) * (1.0 - t) * y1 + 2.0 * t * (1.0 - t) * sy1 + t * t * y2);
\r
495 //SESSEN NO KATAMUKI NO KEISAN(BIBUN)
\r
496 ix = (x1 - 2.0 * sx1 + x2) * 2.0 * t + (-2.0 * x1 + 2.0 * sx1);
\r
497 iy = (y1 - 2.0 * sy1 + y2) * 2.0 * t + (-2.0 * y1 + 2.0 * sy1);
\r
500 //SESSEN NI SUICHOKU NA CHOKUSEN NO KEISAN
\r
501 if(kage.kShotai == kage.kMincho){ //always false ?
\r
502 if(ix != 0 && iy != 0){
\r
503 ir = Math.atan(iy / ix * -1.0);
\r
504 ia = Math.sin(ir) * kage.kMinWidthT;
\r
505 ib = Math.cos(ir) * kage.kMinWidthT;
\r
508 ia = kage.kMinWidthT;
\r
513 ib = kage.kMinWidthT;
\r
515 ia = ia * Math.sqrt(1.0 - t);
\r
516 ib = ib * Math.sqrt(1.0 - t);
\r
519 if(ix != 0 && iy != 0){
\r
520 ir = Math.atan(iy / ix * -1.0);
\r
521 ia = Math.sin(ir) * kage.kWidth;
\r
522 ib = Math.cos(ir) * kage.kWidth;
\r
534 //reverse if vector is going 2nd/3rd quadrants
\r
541 poly.push(x - ia, y - ib);
\r
542 poly2.push(x + ia, y + ib);
\r
546 poly.concat(poly2);
\r
547 polygons.push(poly);
\r
551 function cdDrawBezier(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a1, a2){
\r
552 cdDrawCurveU(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a1, a2);
\r
555 function cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a1, a2){
\r
556 cdDrawCurveU(kage, polygons, x1, y1, x2, y2, x2, y2, x3, y3, a1, a2);
\r
559 function cdDrawLine(kage, polygons, tx1, ty1, tx2, ty2, ta1, ta2){
\r
561 var v, x1, y1, x2, y2;
\r
562 var a1, a2, opt1, opt2;
\r
563 var XX, XY, YX, YY;
\r
566 if(kage.kShotai == kage.kMincho){ //mincho
\r
573 opt1 = Math.floor(ta1 / 100);
\r
574 opt2 = Math.floor(ta2 / 100);
\r
576 if(x1 == x2){ //if TATE stroke, use y-axis
\r
577 poly = new Polygon(4);
\r
580 poly.set(3, x1 - kage.kMinWidthT, y1 - kage.kMinWidthY / 2);
\r
581 poly.set(0, x1 + kage.kMinWidthT, y1 + kage.kMinWidthY / 2);
\r
584 case 6: //... no need
\r
586 poly.set(3, x1 - kage.kMinWidthT, y1);
\r
587 poly.set(0, x1 + kage.kMinWidthT, y1);
\r
590 poly.set(3, x1 - kage.kMinWidthT, y1 - kage.kMinWidthY - kage.kMinWidthT);
\r
591 poly.set(0, x1 + kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
594 poly.set(3, x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
595 poly.set(0, x1 + kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
601 if(a1 == 6){ //KAGI's tail ... no need
\r
602 poly.set(2, x2 - kage.kMinWidthT, y2);
\r
603 poly.set(1, x2 + kage.kMinWidthT, y2);
\r
606 poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kMinWidthT / 2);
\r
607 poly.set(1, x2 + kage.kMinWidthT, y2 - kage.kMinWidthT / 2);
\r
611 poly.set(2, x2 - kage.kMinWidthT, y2);
\r
612 poly.set(1, x2 + kage.kMinWidthT, y2);
\r
615 poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kAdjustKakatoL[opt2] + kage.kMinWidthT);
\r
616 poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kAdjustKakatoL[opt2]);
\r
619 poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kAdjustKakatoR[opt2] + kage.kMinWidthT);
\r
620 poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kAdjustKakatoR[opt2]);
\r
623 poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kMinWidthY);
\r
624 poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kMinWidthY);
\r
628 polygons.push(poly);
\r
630 if(a1 == 22){ //box's right top corner
\r
631 poly = new Polygon();
\r
632 poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
633 poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);
\r
634 poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);
\r
635 poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);
\r
636 poly.push(x1 - kage.kMinWidthT, y1);
\r
637 polygons.push(poly);
\r
640 if(a1 == 0){ //beginning of the stroke
\r
641 poly = new Polygon();
\r
642 poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthY * 0.5);
\r
643 poly.push(x1 + kage.kMinWidthT + kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 0.5 + kage.kMinWidthY);
\r
644 poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2);
\r
645 polygons.push(poly);
\r
648 if((a1 == 6 && a2 == 0) || a2 == 1){ //KAGI NO YOKO BOU NO SAIGO NO MARU ... no need only used at 1st=yoko
\r
649 poly = new Polygon();
\r
650 poly.push(x2 - kage.kMinWidthT, y2);
\r
651 poly.push(x2 - kage.kMinWidthT * 0.6, y2 + kage.kMinWidthT * 0.6);
\r
652 poly.push(x2, y2 + kage.kMinWidthT);
\r
653 poly.push(x2 + kage.kMinWidthT * 0.6, y2 + kage.kMinWidthT * 0.6);
\r
654 poly.push(x2 + kage.kMinWidthT, y2);
\r
655 poly.reverse(); // for fill-rule
\r
656 polygons.push(poly);
\r
659 else if(y1 == y2){ //if it is YOKO stroke, use x-axis
\r
660 if(a1 == 6){ //if it is KAGI's YOKO stroke, get bold
\r
661 poly = new Polygon();
\r
662 poly.push(x1, y1 - kage.kMinWidthT);
\r
663 poly.push(x2, y2 - kage.kMinWidthT);
\r
664 poly.push(x2, y2 + kage.kMinWidthT);
\r
665 poly.push(x1, y1 + kage.kMinWidthT);
\r
666 polygons.push(poly);
\r
668 if(a2 == 1 || a2 == 0 || a2 == 5){ // no need a2=1
\r
669 //KAGI NO YOKO BOU NO SAIGO NO MARU
\r
670 poly = new Polygon();
\r
671 poly.push(x2, y2 - kage.kMinWidthT);
\r
672 poly.push(x2 + kage.kMinWidthT * 0.6, y2 - kage.kMinWidthT * 0.6);
\r
673 poly.push(x2 + kage.kMinWidthT, y2);
\r
674 poly.push(x2 + kage.kMinWidthT * 0.6, y2 + kage.kMinWidthT * 0.6);
\r
675 poly.push(x2, y2 + kage.kMinWidthT);
\r
676 polygons.push(poly);
\r
680 //KAGI NO YOKO BOU NO HANE
\r
681 poly = new Polygon();
\r
682 poly.push(x2, y2 - kage.kMinWidthT + 1);
\r
683 poly.push(x2 + 2, y2 - kage.kMinWidthT - kage.kWidth * 5);
\r
684 poly.push(x2, y2 - kage.kMinWidthT - kage.kWidth * 5);
\r
685 poly.push(x2 - kage.kMinWidthT, y2 - kage.kMinWidthT + 1);
\r
686 poly.reverse(); // for fill-rule
\r
687 polygons.push(poly);
\r
692 poly = new Polygon(4);
\r
693 poly.set(0, x1, y1 - kage.kMinWidthY);
\r
694 poly.set(1, x2, y2 - kage.kMinWidthY);
\r
695 poly.set(2, x2, y2 + kage.kMinWidthY);
\r
696 poly.set(3, x1, y1 + kage.kMinWidthY);
\r
697 polygons.push(poly);
\r
701 poly = new Polygon();
\r
702 poly.push(x2, y2 - kage.kMinWidthY);
\r
703 poly.push(x2 - kage.kAdjustUrokoX[opt2], y2);
\r
704 poly.push(x2 - kage.kAdjustUrokoX[opt2] / 2, y2 - kage.kAdjustUrokoY[opt2]);
\r
705 polygons.push(poly);
\r
709 else{ //for others, use x-axis
\r
710 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
711 if((Math.abs(y2 - y1) < Math.abs(x2 - x1)) && (a1 != 6) && (a2 != 6) && !(x1 > x2)){ //ASAI KAUDO
\r
713 poly = new Polygon(4);
\r
714 poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthY, y1 - Math.cos(rad) * kage.kMinWidthY);
\r
715 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthY, y2 - Math.cos(rad) * kage.kMinWidthY);
\r
716 poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthY, y2 + Math.cos(rad) * kage.kMinWidthY);
\r
717 poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthY, y1 + Math.cos(rad) * kage.kMinWidthY);
\r
718 polygons.push(poly);
\r
722 poly = new Polygon();
\r
723 poly.push(x2 + Math.sin(rad) * kage.kMinWidthY, y2 - Math.cos(rad) * kage.kMinWidthY);
\r
724 poly.push(x2 - Math.cos(rad) * kage.kAdjustUrokoX[opt2], y2 - Math.sin(rad) * kage.kAdjustUrokoX[opt2]);
\r
725 poly.push(x2 - Math.cos(rad) * kage.kAdjustUrokoX[opt2] / 2 + Math.sin(rad) * kage.kAdjustUrokoX[opt2] / 2, y2 - Math.sin(rad) * kage.kAdjustUrokoY[opt2] - Math.cos(rad) * kage.kAdjustUrokoY[opt2]);
\r
726 polygons.push(poly);
\r
730 else{ //KAKUDO GA FUKAI or KAGI NO YOKO BOU
\r
731 if(x1 > x2){ v = -1; } else{ v = 1; }
\r
732 poly = new Polygon(4);
\r
735 poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.cos(rad) * 0.5 * v,
\r
736 y1 - Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.sin(rad) * 0.5 * v);
\r
737 poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * 0.5 * v,
\r
738 y1 + Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * 0.5 * v);
\r
743 poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v, y1 - Math.cos(rad) * kage.kMinWidthT * v);
\r
744 poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v, y1 + Math.cos(rad) * kage.kMinWidthT * v);
\r
747 poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * v,
\r
748 y1 - Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * v);
\r
749 poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v - (kage.kMinWidthT + kage.kMinWidthY) * Math.cos(rad) * v,
\r
750 y1 + Math.cos(rad) * kage.kMinWidthT * v - (kage.kMinWidthT + kage.kMinWidthY) * Math.sin(rad) * v);
\r
753 poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * v,
\r
754 y1 - Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * v);
\r
755 poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * v,
\r
756 y1 + Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * v);
\r
763 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);
\r
764 poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);
\r
767 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthT * 0.5 * Math.cos(rad) * v,
\r
768 y2 - Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthT * 0.5 * Math.sin(rad) * v);
\r
769 poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthT * 0.5 * Math.cos(rad) * v,
\r
770 y2 + Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthT * 0.5 * Math.sin(rad) * v);
\r
773 case 1: // is needed?
\r
775 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);
\r
776 poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);
\r
779 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kAdjustKakatoL[opt2] * Math.cos(rad) * v,
\r
780 y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kAdjustKakatoL[opt2] * Math.sin(rad) * v);
\r
781 poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v + (kage.kAdjustKakatoL[opt2] + kage.kMinWidthT) * Math.cos(rad) * v,
\r
782 y2 + Math.cos(rad) * kage.kMinWidthT * v + (kage.kAdjustKakatoL[opt2] + kage.kMinWidthT) * Math.sin(rad) * v);
\r
785 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kAdjustKakatoR[opt2] * Math.cos(rad) * v,
\r
786 y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kAdjustKakatoR[opt2] * Math.sin(rad) * v);
\r
788 x2 - Math.sin(rad) * kage.kMinWidthT * v + (kage.kAdjustKakatoR[opt2] + kage.kMinWidthT) * Math.cos(rad) * v,
\r
789 y2 + Math.cos(rad) * kage.kMinWidthT * v + (kage.kAdjustKakatoR[opt2] + kage.kMinWidthT) * Math.sin(rad) * v);
\r
792 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.cos(rad) * v,
\r
793 y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.sin(rad) * v);
\r
794 poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.cos(rad) * v,
\r
795 y2 + Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.sin(rad) * v);
\r
799 polygons.push(poly);
\r
801 if((a1 == 6) && (a2 == 0 || a2 == 5)){ //KAGI NO YOKO BOU NO SAIGO NO MARU
\r
802 poly = new Polygon();
\r
803 poly.push(x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);
\r
804 poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * 0.8 * v + Math.sin(rad) * kage.kMinWidthT * 0.6 * v,
\r
805 y2 + Math.sin(rad) * kage.kMinWidthT * 0.8 * v - Math.cos(rad) * kage.kMinWidthT * 0.6 * v);
\r
806 poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * v, y2 + Math.sin(rad) * kage.kMinWidthT * v);
\r
807 poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * 0.8 * v - Math.sin(rad) * kage.kMinWidthT * 0.6 * v,
\r
808 y2 + Math.sin(rad) * kage.kMinWidthT * 0.8 * v + Math.cos(rad) * kage.kMinWidthT * 0.6 * v);
\r
809 poly.push(x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);
\r
810 polygons.push(poly);
\r
813 if(a1 == 6 && a2 == 5){
\r
814 //KAGI NO YOKO BOU NO HANE
\r
815 poly = new Polygon();
\r
816 poly.push(x2 + (kage.kMinWidthT - 1) * Math.sin(rad) * v, y2 - (kage.kMinWidthT - 1) * Math.cos(rad) * v);
\r
817 poly.push(x2 + 2 * Math.cos(rad) * v + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,
\r
818 y2 + 2 * Math.sin(rad) * v - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);
\r
819 poly.push(x2 + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,
\r
820 y2 - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);
\r
821 poly.push(x2 + (kage.kMinWidthT - 1) * Math.sin(rad) * v - kage.kMinWidthT * Math.cos(rad) * v,
\r
822 y2 - (kage.kMinWidthT - 1) * Math.cos(rad) * v - kage.kMinWidthT * Math.sin(rad) * v);
\r
823 polygons.push(poly);
\r
826 if(a1 == 22){ //SHIKAKU MIGIUE UROKO NANAME DEMO MASSUGU MUKI
\r
827 poly = new Polygon();
\r
828 poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
829 poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);
\r
830 poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);
\r
831 poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);
\r
832 poly.push(x1 - kage.kMinWidthT, y1);
\r
833 polygons.push(poly);
\r
836 XX = Math.sin(rad) * v;
\r
837 XY = Math.cos(rad) * v * -1;
\r
838 YX = Math.cos(rad) * v;
\r
839 YY = Math.sin(rad) * v;
\r
841 if(a1 == 0){ //beginning of the storke
\r
842 poly = new Polygon();
\r
843 poly.push(x1 + kage.kMinWidthT * XX + (kage.kMinWidthY * 0.5) * YX,
\r
844 y1 + kage.kMinWidthT * XY + (kage.kMinWidthY * 0.5) * YY);
\r
845 poly.push(x1 + (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YX,
\r
846 y1 + (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YY);
\r
847 poly.push(x1 + kage.kMinWidthT * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YX,
\r
848 y1 + kage.kMinWidthT * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YY);
\r
849 polygons.push(poly);
\r
855 if(tx1 == tx2){ //if TATE stroke, use y-axis
\r
873 if(a1 % 10 == 2){ y1 = y1 - kage.kWidth; }
\r
874 if(a2 % 10 == 2){ y2 = y2 + kage.kWidth; }
\r
875 if(a1 % 10 == 3){ y1 = y1 - kage.kWidth * kage.kKakato; }
\r
876 if(a2 % 10 == 3){ y2 = y2 + kage.kWidth * kage.kKakato; }
\r
878 poly = new Polygon();
\r
879 poly.push(x1 - kage.kWidth, y1);
\r
880 poly.push(x2 - kage.kWidth, y2);
\r
881 poly.push(x2 + kage.kWidth, y2);
\r
882 poly.push(x1 + kage.kWidth, y1);
\r
883 poly.reverse(); // for fill-rule
\r
885 polygons.push(poly);
\r
887 else if(ty1 == ty2){ //if YOKO stroke, use x-axis
\r
904 if(a1 % 10 == 2){ x1 = x1 - kage.kWidth; }
\r
905 if(a2 % 10 == 2){ x2 = x2 + kage.kWidth; }
\r
906 if(a1 % 10 == 3){ x1 = x1 - kage.kWidth * kage.kKakato; }
\r
907 if(a2 % 10 == 3){ x2 = x2 + kage.kWidth * kage.kKakato; }
\r
909 poly = new Polygon();
\r
910 poly.push(x1, y1 - kage.kWidth);
\r
911 poly.push(x2, y2 - kage.kWidth);
\r
912 poly.push(x2, y2 + kage.kWidth);
\r
913 poly.push(x1, y1 + kage.kWidth);
\r
915 polygons.push(poly);
\r
917 else{ //for others, use x-axis
\r
934 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
936 x1 = x1 - kage.kWidth * Math.cos(rad);
\r
937 y1 = y1 - kage.kWidth * Math.sin(rad);
\r
940 x2 = x2 + kage.kWidth * Math.cos(rad);
\r
941 y2 = y2 + kage.kWidth * Math.sin(rad);
\r
944 x1 = x1 - kage.kWidth * Math.cos(rad) * kage.kKakato;
\r
945 y1 = y1 - kage.kWidth * Math.sin(rad) * kage.kKakato;
\r
948 x2 = x2 + kage.kWidth * Math.cos(rad) * kage.kKakato;
\r
949 y2 = y2 + kage.kWidth * Math.sin(rad) * kage.kKakato;
\r
952 //SUICHOKU NO ICHI ZURASHI HA Math.sin TO Math.cos NO IREKAE + x-axis MAINASU KA
\r
953 poly = new Polygon();
\r
954 poly.push(x1 + Math.sin(rad) * kage.kWidth, y1 - Math.cos(rad) * kage.kWidth);
\r
955 poly.push(x2 + Math.sin(rad) * kage.kWidth, y2 - Math.cos(rad) * kage.kWidth);
\r
956 poly.push(x2 - Math.sin(rad) * kage.kWidth, y2 + Math.cos(rad) * kage.kWidth);
\r
957 poly.push(x1 - Math.sin(rad) * kage.kWidth, y1 + Math.cos(rad) * kage.kWidth);
\r
959 polygons.push(poly);
\r