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
14 if(kage.kShotai == kage.kMincho){ // mincho
\r
18 delta = -1 * kage.kMinWidthY * 0.5;
\r
21 case 2: // must be 32
\r
28 delta = kage.kMinWidthY;
\r
35 if(y1 < y2){ y1 = y1 - delta; }
\r
36 else{ y1 = y1 + delta; }
\r
39 if(x1 < x2){ x1 = x1 - delta; }
\r
40 else{ x1 = x1 + delta; }
\r
43 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
44 if(x1 < x2){ v = 1; } else{ v = -1; }
\r
45 x1 = x1 - delta * Math.cos(rad) * v;
\r
46 y1 = y1 - delta * Math.sin(rad) * v;
\r
55 case 15: // it can change to 15->5
\r
56 case 14: // it can change to 14->4
\r
66 if(y3 < y4){ y4 = y4 + delta; }
\r
67 else{ y4 = y4 - delta; }
\r
70 if(x3 < x4){ x4 = x4 + delta; }
\r
71 else{ x4 = x4 - delta; }
\r
74 rad = Math.atan((y4 - y3) / (x4 - x3));
\r
75 if(x3 < x4){ v = 1; } else{ v = -1; }
\r
76 x4 = x4 + delta * Math.cos(rad) * v;
\r
77 y4 = y4 + delta * Math.sin(rad) * v;
\r
81 if(Math.sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1)) < 50){
\r
82 hosomi += 0.4 * (1 - Math.sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1)) / 50);
\r
85 poly = new Polygon();
\r
86 poly2 = new Polygon();
\r
87 for(tt = 0; tt <= 1000; tt = tt + kage.kRate){
\r
91 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
92 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
93 //KATAMUKI of vector by BIBUN
\r
94 ix = t * t * (-3 * x1 + 9 * x2 + -9 * x3 + 3 * x4) + t * (6 * x1 + -12 * x2 + 6 * x3) + -3 * x1 + 3 * x2;
\r
95 iy = t * t * (-3 * y1 + 9 * y2 + -9 * y3 + 3 * y4) + t * (6 * y1 + -12 * y2 + 6 * y3) + -3 * y1 + 3 * y2;
\r
97 //line SUICHOKU by vector
\r
98 if(ix != 0 && iy != 0){
\r
99 ir = Math.atan(iy / ix * -1);
\r
100 ia = Math.sin(ir) * (kage.kMinWidthT);
\r
101 ib = Math.cos(ir) * (kage.kMinWidthT);
\r
104 ia = kage.kMinWidthT;
\r
109 ib = kage.kMinWidthT;
\r
112 if(a1 == 7 && a2 == 0){ // L2RD: fatten
\r
113 deltad = Math.pow(t, hosomi) * kage.kL2RDfatten;
\r
116 deltad = Math.pow(t, hosomi);
\r
119 deltad = Math.pow(1.0 - t, hosomi);
\r
121 else{ deltad = 1; }
\r
129 //reverse if vector is going 2nd/3rd quadrants
\r
135 //copy to polygon structuer
\r
136 poly.push(x - ia, y - ib);
\r
137 poly2.push(x + ia, y + ib);
\r
140 poly.concat(poly2);
\r
141 polygons.push(poly);
\r
143 //process for head of stroke
\r
144 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
145 if(x1 < x2){ v = 1; } else{ v = -1; }
\r
146 XX = Math.sin(rad) * v;
\r
147 XY = Math.cos(rad) * v * -1;
\r
148 YX = Math.cos(rad) * v;
\r
149 YY = Math.sin(rad) * v;
\r
153 poly = new Polygon();
\r
154 poly.push(x1 - kage.kMinWidthT, y1);
\r
155 poly.push(x1 + kage.kMinWidthT, y1);
\r
156 poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthT);
\r
157 polygons.push(poly);
\r
160 poly = new Polygon();
\r
161 poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);
\r
162 poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);
\r
163 poly.push(x1 - kage.kMinWidthT * XX - kage.kMinWidthT * YX, y1 - kage.kMinWidthT * XY - kage.kMinWidthT * YY);
\r
164 polygons.push(poly);
\r
169 if(y1 <= y4){ //from up to bottom
\r
171 poly = new Polygon();
\r
172 poly.push(x1 - kage.kMinWidthT, y1);
\r
173 poly.push(x1 + kage.kMinWidthT, y1);
\r
174 poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
175 polygons.push(poly);
\r
178 poly = new Polygon();
\r
179 poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);
\r
180 poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);
\r
181 poly.push(x1 - kage.kMinWidthT * XX - kage.kMinWidthY * YX, y1 - kage.kMinWidthT * XY - kage.kMinWidthY * YY);
\r
182 polygons.push(poly);
\r
185 else{ //bottom to up
\r
187 poly = new Polygon();
\r
188 poly.push(x1 - kage.kMinWidthT, y1);
\r
189 poly.push(x1 + kage.kMinWidthT, y1);
\r
190 poly.push(x1 + kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
191 polygons.push(poly);
\r
194 poly = new Polygon();
\r
195 poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);
\r
196 poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);
\r
197 poly.push(x1 + kage.kMinWidthT * XX - kage.kMinWidthY * YX, y1 + kage.kMinWidthT * XY - kage.kMinWidthY * YY);
\r
198 polygons.push(poly);
\r
203 if(a1 == 22){ //box's up-right corner, any time same degree
\r
204 poly = new Polygon();
\r
205 poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
206 poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);
\r
207 poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);
\r
208 poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);
\r
209 poly.push(x1, y1 + kage.kMinWidthT);
\r
210 polygons.push(poly);
\r
213 if(a1 == 0){ //beginning of the stroke
\r
214 if(y1 <= y4){ //from up to bottom
\r
216 poly = new Polygon();
\r
217 poly.push(x1 + kage.kMinWidthT, y1);
\r
218 poly.push(x1 + kage.kMinWidthT * 1.5, y1 + kage.kMinWidthY);
\r
219 poly.push(x1 + kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 3);
\r
220 polygons.push(poly);
\r
223 poly = new Polygon();
\r
224 poly.push(x1 + kage.kMinWidthT * XX,
\r
225 y1 + kage.kMinWidthT * XY);
\r
226 poly.push(x1 + kage.kMinWidthT * 1.5 * XX + kage.kMinWidthY * YX,
\r
227 y1 + kage.kMinWidthT * 1.5 * XY + kage.kMinWidthY * YY);
\r
228 poly.push(x1 + kage.kMinWidthT * 0.5 * XX + kage.kMinWidthY * 3 * YX,
\r
229 y1 + kage.kMinWidthT * 0.5 * XY + kage.kMinWidthY * 3 * YY);
\r
230 polygons.push(poly);
\r
233 else{ //from bottom to up
\r
235 poly = new Polygon();
\r
236 poly.push(x1 - kage.kMinWidthT, y1);
\r
237 poly.push(x1 - kage.kMinWidthT * 1.5, y1 + kage.kMinWidthY);
\r
238 poly.push(x1 - kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 3);
\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 * 1.5 * XX + kage.kMinWidthY * YX, y1 + kage.kMinWidthY * YY - kage.kMinWidthT * 1.5 * XY);
\r
245 poly.push(x1 - kage.kMinWidthT * 0.5 * XX + kage.kMinWidthY * 3 * YX, y1 + kage.kMinWidthY * 3 * YY - kage.kMinWidthT * 0.5 * XY);
\r
246 polygons.push(poly);
\r
252 rad = Math.atan((y4 - y3) / (x4 - x3));
\r
253 if(x3 < x4){ v = 1; } else{ v = -1; }
\r
254 YX = Math.sin(rad) * v * -1;
\r
255 YY = Math.cos(rad) * v;
\r
256 XX = Math.cos(rad) * v;
\r
257 XY = Math.sin(rad) * v;
\r
259 if(a2 == 1 || a2 == 8 || a2 == 15){ //the last filled circle ... it can change to 15->5
\r
262 poly.push(x4 - kage.kMinWidthT, y4);
\r
263 poly.push(x4 - kage.kMinWidthT * 0.7, y4 + kage.kMinWidthT * 0.7);
\r
264 poly.push(x4, y4 + kage.kMinWidthT);
\r
265 poly.push(x4 + kage.kMinWidthT * 0.7, y4 + kage.kMinWidthT * 0.7);
\r
266 poly.push(x4 + kage.kMinWidthT, y4);
\r
267 polygons.push(poly);
\r
270 poly = new Polygon();
\r
271 poly.push(x4, y4 - kage.kMinWidthT);
\r
272 poly.push(x4 + kage.kMinWidthT * 0.7, y4 - kage.kMinWidthT * 0.7);
\r
273 poly.push(x4 + kage.kMinWidthT, y4);
\r
274 poly.push(x4 + kage.kMinWidthT * 0.7, y4 + kage.kMinWidthT * 0.7);
\r
275 poly.push(x4, y4 + kage.kMinWidthT);
\r
276 polygons.push(poly);
\r
279 poly = new Polygon();
\r
280 poly.push(x4 + Math.sin(rad) * kage.kMinWidthT * v, y4 - Math.cos(rad) * kage.kMinWidthT * v);
\r
281 poly.push(x4 + Math.cos(rad) * kage.kMinWidthT * 0.7 * v + Math.sin(rad) * kage.kMinWidthT * 0.7 * v,
\r
282 y4 + Math.sin(rad) * kage.kMinWidthT * 0.7 * v - Math.cos(rad) * kage.kMinWidthT * 0.7 * v);
\r
283 poly.push(x4 + Math.cos(rad) * kage.kMinWidthT * v, y4 + Math.sin(rad) * kage.kMinWidthT * v);
\r
284 poly.push(x4 + Math.cos(rad) * kage.kMinWidthT * 0.7 * v - Math.sin(rad) * kage.kMinWidthT * 0.7 * v,
\r
285 y4 + Math.sin(rad) * kage.kMinWidthT * 0.7 * v + Math.cos(rad) * kage.kMinWidthT * 0.7 * v);
\r
286 poly.push(x4 - Math.sin(rad) * kage.kMinWidthT * v, y4 + Math.cos(rad) * kage.kMinWidthT * v);
\r
287 polygons.push(poly);
\r
291 if(a2 == 9 || (a1 == 7 && a2 == 0)){ // Math.sinnyu & L2RD Harai
\r
293 poly = new Polygon();
\r
294 poly.push(x4, y4 + kage.kMinWidthT);
\r
295 poly.push(x4, y4 - kage.kMinWidthT);
\r
296 poly.push(x4 + kage.kMinWidthT, y4 - kage.kMinWidthT);
\r
297 polygons.push(poly);
\r
300 poly = new Polygon();
\r
301 poly.push(x4 + kage.kMinWidthT * YX, y4 + kage.kMinWidthT * YY);
\r
302 poly.push(x4 - kage.kMinWidthT * YX, y4 - kage.kMinWidthT * YY);
\r
303 poly.push(x4 + kage.kMinWidthT * XX - kage.kMinWidthT * YX, y4 + kage.kMinWidthT * XY - kage.kMinWidthT * YY);
\r
304 polygons.push(poly);
\r
308 if(a2 == 15){ //jump up ... it can change to 15->5
\r
310 poly = new Polygon();
\r
311 poly.push(x4, y4 - kage.kMinWidthT + 1);
\r
312 poly.push(x4 + 2, y4 - kage.kMinWidthT - kage.kWidth * 5);
\r
313 poly.push(x4, y4 - kage.kMinWidthT - kage.kWidth * 5);
\r
314 poly.push(x4 - kage.kMinWidthT, y4 - kage.kMinWidthT + 1);
\r
315 polygons.push(poly);
\r
318 poly = new Polygon();
\r
319 poly.push(x4 + (kage.kMinWidthT - 1) * Math.sin(rad) * v, y4 - (kage.kMinWidthT - 1) * Math.cos(rad) * v);
\r
320 poly.push(x4 + 2 * Math.cos(rad) * v + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,
\r
321 y4 + 2 * Math.sin(rad) * v - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);
\r
322 poly.push(x4 + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,
\r
323 y4 - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);
\r
324 poly.push(x4 + (kage.kMinWidthT - 1) * Math.sin(rad) * v - kage.kMinWidthT * Math.cos(rad) * v,
\r
325 y4 - (kage.kMinWidthT - 1) * Math.cos(rad) * v - kage.kMinWidthT * Math.sin(rad) * v);
\r
326 polygons.push(poly);
\r
330 if(a2 == 14){ //jump to left, allways go left ... it can change to 14->4
\r
331 poly = new Polygon();
\r
333 poly.push(x4, y4 - kage.kMinWidthT);
\r
334 poly.push(x4 - kage.kWidth * 4, y4 - kage.kMinWidthT);
\r
335 poly.push(x4 - kage.kWidth * 4, y4 - kage.kMinWidthT * 0.5);
\r
336 polygons.push(poly);
\r
342 if(y1 < y2){ y1 = y1 - kage.kWidth; } else{ y1 = y1 + kage.kWidth; }
\r
345 if(x1 < x2){ x1 = x1 - kage.kWidth; } else{ x1 = x1 + kage.kWidth; }
\r
348 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
349 if(x1 < x2){ v = 1; } else{ v = -1; }
\r
350 x1 = x1 - kage.kWidth * Math.cos(rad) * v;
\r
351 y1 = y1 - kage.kWidth * Math.sin(rad) * v;
\r
358 y1 = y1 - kage.kWidth * kage.kKakato;
\r
361 y1 = y1 + kage.kWidth * kage.kKakato;
\r
366 x1 = x1 - kage.kWidth * kage.kKakato;
\r
369 x1 = x1 + kage.kWidth * kage.kKakato;
\r
373 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
374 if(x1 < x2){ v = 1; } else{ v = -1; }
\r
375 x1 = x1 - kage.kWidth * Math.cos(rad) * v * kage.kKakato;
\r
376 y1 = y1 - kage.kWidth * Math.sin(rad) * v * kage.kKakato;
\r
381 if(y3 < y4){ y4 = y4 + kage.kWidth; } else{ y4 = y4 - kage.kWidth; }
\r
384 if(x3 < x4){ x4 = x4 + kage.kWidth; } else{ x4 = x4 - kage.kWidth; }
\r
387 rad = Math.atan((y4 - y3) / (x4 - x3));
\r
388 if(x3 < x4){ v = 1; } else{ v = -1; }
\r
389 x4 = x4 + kage.kWidth * Math.cos(rad) * v;
\r
390 y4 = y4 + kage.kWidth * Math.sin(rad) * v;
\r
397 y4 = y4 + kage.kWidth * kage.kKakato;
\r
400 y4 = y4 - kage.kWidth * kage.kKakato;
\r
405 x4 = x4 + kage.kWidth * kage.kKakato;
\r
408 x4 = x4 - kage.kWidth * kage.kKakato;
\r
412 rad = Math.atan((y4 - y3) / (x4 - x3));
\r
413 if(x3 < x4){ v = 1; } else{ v = -1; }
\r
414 x4 = x4 + kage.kWidth * Math.cos(rad) * v * kage.kKakato;
\r
415 y4 = y4 + kage.kWidth * Math.sin(rad) * v * kage.kKakato;
\r
419 poly = new Polygon();
\r
420 poly2= new Polygon();
\r
422 for(tt = 0; tt <= 1000; tt = tt + kage.kRate){
\r
426 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
427 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
428 //KATAMUKI of vector by BIBUN
\r
429 ix = t * t * (-3 * x1 + 9 * x2 + -9 * x3 + 3 * x4) + t * (6 * x1 + -12 * x2 + 6 * x3) + -3 * x1 + 3 * x2;
\r
430 iy = t * t * (-3 * y1 + 9 * y2 + -9 * y3 + 3 * y4) + t * (6 * y1 + -12 * y2 + 6 * y3) + -3 * y1 + 3 * y2;
\r
432 //SESSEN NI SUICHOKU NA CHOKUSEN NO KEISAN
\r
433 if(kage.kShotai == kage.kMincho){ //always false ?
\r
434 if(ix != 0 && iy != 0){
\r
435 ir = Math.atan(iy / ix * -1.0);
\r
436 ia = Math.sin(ir) * kage.kMinWidthT;
\r
437 ib = Math.cos(ir) * kage.kMinWidthT;
\r
440 ia = kage.kMinWidthT;
\r
445 ib = kage.kMinWidthT;
\r
447 ia = ia * Math.sqrt(1.0 - t);
\r
448 ib = ib * Math.sqrt(1.0 - t);
\r
451 if(ix != 0 && iy != 0){
\r
452 ir = Math.atan(iy / ix * -1.0);
\r
453 ia = Math.sin(ir) * kage.kWidth;
\r
454 ib = Math.cos(ir) * kage.kWidth;
\r
466 //reverse if vector is going 2nd/3rd quadrants
\r
473 poly.push(x - ia, y - ib);
\r
474 poly2.push(x + ia, y + ib);
\r
478 poly.concat(poly2);
\r
479 polygons.push(poly);
\r
483 function cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a1, a2){
\r
486 var ix, iy, ia, ib, ir;
\r
490 var XX, XY, YX, YY;
\r
494 if(kage.kShotai == kage.kMincho){ // mincho
\r
498 delta = -1 * kage.kMinWidthY * 0.5;
\r
501 case 2: // ... must be 32
\r
504 case 32: // changed
\r
509 delta = kage.kMinWidthY;
\r
516 if(y1 < y2){ y1 = y1 - delta; }
\r
517 else{ y1 = y1 + delta; }
\r
520 if(x1 < x2){ x1 = x1 - delta; }
\r
521 else{ x1 = x1 + delta; }
\r
524 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
525 if(x1 < x2){ v = 1; } else{ v = -1; }
\r
526 x1 = x1 - delta * Math.cos(rad) * v;
\r
527 y1 = y1 - delta * Math.sin(rad) * v;
\r
535 case 15: // it can change to 15->5
\r
536 case 14: // it can change to 14->4
\r
537 case 17: // no need
\r
541 case 8: // get shorten for tail's circle
\r
542 delta = -1 * kage.kMinWidthT * 0.5;
\r
549 if(y2 < y3){ y3 = y3 + delta; }
\r
550 else{ y3 = y3 - delta; }
\r
553 if(x2 < x3){ x3 = x3 + delta; }
\r
554 else{ x3 = x3 - delta; }
\r
557 rad = Math.atan((y3 - y2) / (x3 - x2));
\r
558 if(x2 < x3){ v = 1; } else{ v = -1; }
\r
559 x3 = x3 + delta * Math.cos(rad) * v;
\r
560 y3 = y3 + delta * Math.sin(rad) * v;
\r
564 if(Math.sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1)) < 50){
\r
565 hosomi += 0.4 * (1 - Math.sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1)) / 50);
\r
568 poly = new Polygon();
\r
569 poly2 = new Polygon();
\r
571 for(tt = 0; tt <= 1000; tt = tt + kage.kRate){
\r
575 x = ((1.0 - t) * (1.0 - t) * x1 + 2.0 * t * (1.0 - t) * x2 + t * t * x3);
\r
576 y = ((1.0 - t) * (1.0 - t) * y1 + 2.0 * t * (1.0 - t) * y2 + t * t * y3);
\r
578 //KATAMUKI of vector by BIBUN
\r
579 ix = (x1 - 2.0 * x2 + x3) * 2.0 * t + (-2.0 * x1 + 2.0 * x2);
\r
580 iy = (y1 - 2.0 * y2 + y3) * 2.0 * t + (-2.0 * y1 + 2.0 * y2);
\r
582 //line SUICHOKU by vector
\r
583 if(ix != 0 && iy != 0){
\r
584 ir = Math.atan(iy / ix * -1);
\r
585 ia = Math.sin(ir) * (kage.kMinWidthT);
\r
586 ib = Math.cos(ir) * (kage.kMinWidthT);
\r
589 ia = kage.kMinWidthT;
\r
594 ib = kage.kMinWidthT;
\r
597 if(a1 == 7 && a2 == 0){ // L2RD: fatten
\r
598 deltad = Math.pow(t, hosomi) * kage.kL2RDfatten;
\r
601 deltad = Math.pow(t, hosomi);
\r
604 deltad = Math.pow(1.0 - t, hosomi);
\r
606 else{ deltad = 1; }
\r
614 //reverse if vector is going 2nd/3rd quadrants
\r
620 //copy to polygon structure
\r
621 poly.push(x - ia, y - ib);
\r
622 poly2.push(x + ia, y + ib);
\r
625 // suiheisen ni setsuzoku
\r
629 if(poly2.array[index].y <= y1 && y1 <= poly2.array[index + 1].y){
\r
634 newx1 = poly2.array[index + 1].x + (poly2.array[index].x - poly2.array[index + 1].x) *
\r
635 (poly2.array[index + 1].y - y1) / (poly2.array[index + 1].y - poly2.array[index].y);
\r
637 newx2 = poly.array[0].x + (poly.array[0].x - poly.array[1].x) * (poly.array[0].y - y1) /
\r
638 (poly.array[1].y - poly.array[0].y);
\r
641 for(var i = 0; i < index; i++){
\r
644 poly2.set(0, newx1, newy1);
\r
645 poly.unshift(newx2, newy2);
\r
649 poly.concat(poly2);
\r
650 polygons.push(poly);
\r
652 //process for head of stroke
\r
653 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
654 if(x1 < x2){ v = 1; } else{ v = -1; }
\r
655 XX = Math.sin(rad) * v;
\r
656 XY = Math.cos(rad) * v * -1;
\r
657 YX = Math.cos(rad) * v;
\r
658 YY = Math.sin(rad) * v;
\r
662 poly= new Polygon();
\r
663 poly.push(x1 - kage.kMinWidthT, y1);
\r
664 poly.push(x1 + kage.kMinWidthT, y1);
\r
665 poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthT);
\r
666 polygons.push(poly);
\r
669 poly = new Polygon();
\r
670 poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);
\r
671 poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);
\r
672 poly.push(x1 - kage.kMinWidthT * XX - kage.kMinWidthT * YX, y1 - kage.kMinWidthT * XY - kage.kMinWidthT * YY);
\r
673 polygons.push(poly);
\r
678 if(y1 <= y3){ //from up to bottom
\r
680 poly = new Polygon();
\r
681 poly.push(x1 - kage.kMinWidthT, y1);
\r
682 poly.push(x1 + kage.kMinWidthT, y1);
\r
683 poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
684 polygons.push(poly);
\r
687 poly = new Polygon();
\r
688 poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);
\r
689 poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);
\r
690 poly.push(x1 - kage.kMinWidthT * XX - kage.kMinWidthY * YX, y1 - kage.kMinWidthT * XY - kage.kMinWidthY * YY);
\r
691 polygons.push(poly);
\r
694 else{ //bottom to up
\r
696 poly = new Polygon();
\r
697 poly.push(x1 - kage.kMinWidthT, y1);
\r
698 poly.push(x1 + kage.kMinWidthT, y1);
\r
699 poly.push(x1 + kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
700 polygons.push(poly);
\r
703 poly = new Polygon();
\r
704 poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);
\r
705 poly.push(x1 + kage.kMinWidthT * XX, y1 + kage.kMinWidthT * XY);
\r
706 poly.push(x1 + kage.kMinWidthT * XX - kage.kMinWidthY * YX, y1 + kage.kMinWidthT * XY - kage.kMinWidthY * YY);
\r
707 polygons.push(poly);
\r
712 if(a1 == 22){ //box's up-right corner, any time same degree
\r
713 poly = new Polygon();
\r
714 poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
715 poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);
\r
716 poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);
\r
717 poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);
\r
718 poly.push(x1, y1 + kage.kMinWidthT);
\r
719 polygons.push(poly);
\r
722 if(a1 == 0){ //beginning of the stroke
\r
723 if(y1 <= y3){ //from up to bottom
\r
725 poly = new Polygon();
\r
726 poly.push(x1 + kage.kMinWidthT, y1);
\r
727 poly.push(x1 + kage.kMinWidthT * 1.5, y1 + kage.kMinWidthY);
\r
728 poly.push(x1 + kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 3);
\r
729 polygons.push(poly);
\r
732 poly = new Polygon();
\r
733 poly.push(x1 + kage.kMinWidthT * XX,
\r
734 y1 + kage.kMinWidthT * XY);
\r
735 poly.push(x1 + kage.kMinWidthT * 1.5 * XX + kage.kMinWidthY * YX,
\r
736 y1 + kage.kMinWidthT * 1.5 * XY + kage.kMinWidthY * YY);
\r
737 poly.push(x1 + kage.kMinWidthT * 0.5 * XX + kage.kMinWidthY * 3 * YX,
\r
738 y1 + kage.kMinWidthT * 0.5 * XY + kage.kMinWidthY * 3 * YY);
\r
739 polygons.push(poly);
\r
742 else{ //from bottom to up
\r
744 poly = new Polygon();
\r
745 poly.push(x1 - kage.kMinWidthT, y1);
\r
746 poly.push(x1 - kage.kMinWidthT * 1.5, y1 + kage.kMinWidthY);
\r
747 poly.push(x1 - kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 3);
\r
748 polygons.push(poly);
\r
751 poly = new Polygon();
\r
752 poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);
\r
753 poly.push(x1 - kage.kMinWidthT * 1.5 * XX + kage.kMinWidthY * YX, y1 + kage.kMinWidthY * YY - kage.kMinWidthT * 1.5 * XY);
\r
754 poly.push(x1 - kage.kMinWidthT * 0.5 * XX + kage.kMinWidthY * 3 * YX, y1 + kage.kMinWidthY * 3 * YY - kage.kMinWidthT * 0.5 * XY);
\r
755 polygons.push(poly);
\r
761 rad = Math.atan((y3 - y2) / (x3 - x2));
\r
762 if(x2 < x3){ v = 1; } else{ v = -1; }
\r
763 YX = Math.sin(rad) * v * -1;
\r
764 YY = Math.cos(rad) * v;
\r
765 XX = Math.cos(rad) * v;
\r
766 XY = Math.sin(rad) * v;
\r
768 if(a2 == 1 || a2 == 8 || a2 == 15){ //the last filled circle ... it can change 15->5
\r
770 poly = new Polygon();
\r
771 poly.push(x3 - kage.kMinWidthT, y3);
\r
772 poly.push(x3 - kage.kMinWidthT * 0.7, y3 + kage.kMinWidthT * 0.7);
\r
773 poly.push(x3, y3 + kage.kMinWidthT);
\r
774 poly.push(x3 + kage.kMinWidthT * 0.7, y3 + kage.kMinWidthT * 0.7);
\r
775 poly.push(x3 + kage.kMinWidthT, y3);
\r
776 polygons.push(poly);
\r
779 poly = new Polygon();
\r
780 poly.push(x3, y3 - kage.kMinWidthT);
\r
781 poly.push(x3 + kage.kMinWidthT * 0.7, y3 - kage.kMinWidthT * 0.7);
\r
782 poly.push(x3 + kage.kMinWidthT, y3);
\r
783 poly.push(x3 + kage.kMinWidthT * 0.7, y3 + kage.kMinWidthT * 0.7);
\r
784 poly.push(x3, y3 + kage.kMinWidthT);
\r
785 polygons.push(poly);
\r
788 poly = new Polygon();
\r
789 poly.push(x3 + Math.sin(rad) * kage.kMinWidthT * v, y3 - Math.cos(rad) * kage.kMinWidthT * v);
\r
790 poly.push(x3 + Math.cos(rad) * kage.kMinWidthT * 0.7 * v + Math.sin(rad) * kage.kMinWidthT * 0.7 * v,
\r
791 y3 + Math.sin(rad) * kage.kMinWidthT * 0.7 * v - Math.cos(rad) * kage.kMinWidthT * 0.7 * v);
\r
792 poly.push(x3 + Math.cos(rad) * kage.kMinWidthT * v, y3 + Math.sin(rad) * kage.kMinWidthT * v);
\r
793 poly.push(x3 + Math.cos(rad) * kage.kMinWidthT * 0.7 * v - Math.sin(rad) * kage.kMinWidthT * 0.7 * v,
\r
794 y3 + Math.sin(rad) * kage.kMinWidthT * 0.7 * v + Math.cos(rad) * kage.kMinWidthT * 0.7 * v);
\r
795 poly.push(x3 - Math.sin(rad) * kage.kMinWidthT * v, y3 + Math.cos(rad) * kage.kMinWidthT * v);
\r
796 polygons.push(poly);
\r
800 if(a2 == 9 || (a1 == 7 && a2 == 0)){ // Math.sinnyu & L2RD Harai ... no need for a2=9
\r
802 poly = new Polygon();
\r
803 poly.push(x3, y3 + kage.kMinWidthT * kage.kL2RDfatten);
\r
804 poly.push(x3, y3 - kage.kMinWidthT * kage.kL2RDfatten);
\r
805 poly.push(x3 + kage.kMinWidthT * kage.kL2RDfatten, y3 - kage.kMinWidthT * kage.kL2RDfatten);
\r
806 polygons.push(poly);
\r
809 poly = new Polygon();
\r
810 poly.push(x3 + kage.kMinWidthT * kage.kL2RDfatten * YX, y3 + kage.kMinWidthT * kage.kL2RDfatten * YY);
\r
811 poly.push(x3 - kage.kMinWidthT * kage.kL2RDfatten * YX, y3 - kage.kMinWidthT * kage.kL2RDfatten * YY);
\r
812 poly.push(x3 + kage.kMinWidthT * kage.kL2RDfatten * XX - kage.kMinWidthT * kage.kL2RDfatten * YX,
\r
813 y3 + kage.kMinWidthT * kage.kL2RDfatten * XY - kage.kMinWidthT * kage.kL2RDfatten * YY);
\r
814 polygons.push(poly);
\r
818 if(a2 == 15){ //jump up ... it can change 15->5
\r
820 poly = new Polygon();
\r
821 poly.push(x3, y3 - kage.kMinWidthT + 1);
\r
822 poly.push(x3 + 2, y3 - kage.kMinWidthT - kage.kWidth * 5);
\r
823 poly.push(x3, y3 - kage.kMinWidthT - kage.kWidth * 5);
\r
824 poly.push(x3 - kage.kMinWidthT, y3 - kage.kMinWidthT + 1);
\r
825 polygons.push(poly);
\r
828 poly = new Polygon();
\r
829 poly.push(x3 + (kage.kMinWidthT - 1) * Math.sin(rad) * v, y3 - (kage.kMinWidthT - 1) * Math.cos(rad) * v);
\r
830 poly.push(x3 + 2 * Math.cos(rad) * v + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,
\r
831 y3 + 2 * Math.sin(rad) * v - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);
\r
832 poly.push(x3 + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,
\r
833 y3 - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);
\r
834 poly.push(x3 + (kage.kMinWidthT - 1) * Math.sin(rad) * v - kage.kMinWidthT * Math.cos(rad) * v,
\r
835 y3 - (kage.kMinWidthT - 1) * Math.cos(rad) * v - kage.kMinWidthT * Math.sin(rad) * v);
\r
836 polygons.push(poly);
\r
840 if(a2 == 14){ //jump to left, allways go left ... it can change 14->4
\r
841 poly = new Polygon();
\r
843 poly.push(x3, y3 - kage.kMinWidthT);
\r
844 poly.push(x3 - kage.kWidth * 4, y3 - kage.kMinWidthT);
\r
845 poly.push(x3 - kage.kWidth * 4, y3 - kage.kMinWidthT * 0.5);
\r
846 polygons.push(poly);
\r
852 if(y1 < y2){ y1 = y1 - kage.kWidth; } else{ y1 = y1 + kage.kWidth; }
\r
855 if(x1 < x2){ x1 = x1 - kage.kWidth; } else{ x1 = x1 + kage.kWidth; }
\r
858 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
859 if(x1 < x2){ v = 1; } else{ v = -1; }
\r
860 x1 = x1 - kage.kWidth * Math.cos(rad) * v;
\r
861 y1 = y1 - kage.kWidth * Math.sin(rad) * v;
\r
868 y1 = y1 - kage.kWidth * kage.kKakato;
\r
871 y1 = y1 + kage.kWidth * kage.kKakato;
\r
876 x1 = x1 - kage.kWidth * kage.kKakato;
\r
879 x1 = x1 + kage.kWidth * kage.kKakato;
\r
883 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
884 if(x1 < x2){ v = 1; } else{ v = -1; }
\r
885 x1 = x1 - kage.kWidth * Math.cos(rad) * v * kage.kKakato;
\r
886 y1 = y1 - kage.kWidth * Math.sin(rad) * v * kage.kKakato;
\r
891 if(y2 < y3){ y3 = y3 + kage.kWidth; } else{ y3 = y3 - kage.kWidth; }
\r
894 if(x2 < x3){ x3 = x3 + kage.kWidth; } else{ x3 = x3 - kage.kWidth; }
\r
897 rad = Math.atan((y3 - y2) / (x3 - x2));
\r
898 if(x2 < x3){ v = 1; } else{ v = -1; }
\r
899 x3 = x3 + kage.kWidth * Math.cos(rad) * v;
\r
900 y3 = y3 + kage.kWidth * Math.sin(rad) * v;
\r
907 y3 = y3 + kage.kWidth * kage.kKakato;
\r
910 y3 = y3 - kage.kWidth * kage.kKakato;
\r
915 x3 = x3 + kage.kWidth * kage.kKakato;
\r
918 x3 = x3 - kage.kWidth * kage.kKakato;
\r
922 rad = Math.atan((y3 - y2) / (x3 - x2));
\r
923 if(x2 < x3){ v = 1; } else{ v = -1; }
\r
924 x3 = x3 + kage.kWidth * Math.cos(rad) * v * kage.kKakato;
\r
925 y3 = y3 + kage.kWidth * Math.sin(rad) * v * kage.kKakato;
\r
929 poly = new Polygon();
\r
930 poly2 = new Polygon();
\r
932 for(tt = 0; tt <= 1000; tt = tt + kage.kRate){
\r
935 //calculating each point
\r
936 x = ((1.0 - t) * (1.0 - t) * x1 + 2.0 * t * (1.0 - t) * x2 + t * t * x3);
\r
937 y = ((1.0 - t) * (1.0 - t) * y1 + 2.0 * t * (1.0 - t) * y2 + t * t * y3);
\r
939 //SESSEN NO KATAMUKI NO KEISAN(BIBUN)
\r
940 ix = (x1 - 2.0 * x2 + x3) * 2.0 * t + (-2.0 * x1 + 2.0 * x2);
\r
941 iy = (y1 - 2.0 * y2 + y3) * 2.0 * t + (-2.0 * y1 + 2.0 * y2);
\r
943 //SESSEN NI SUICHOKU NA CHOKUSEN NO KEISAN
\r
944 if(kage.kShotai == kage.kMincho){ //always false ?
\r
945 if(ix != 0 && iy != 0){
\r
946 ir = Math.atan(iy / ix * -1.0);
\r
947 ia = Math.sin(ir) * kage.kMinWidthT;
\r
948 ib = Math.cos(ir) * kage.kMinWidthT;
\r
951 ia = kage.kMinWidthT;
\r
956 ib = kage.kMinWidthT;
\r
958 ia = ia * Math.sqrt(1.0 - t);
\r
959 ib = ib * Math.sqrt(1.0 - t);
\r
962 if(ix != 0 && iy != 0){
\r
963 ir = Math.atan(iy / ix * -1.0);
\r
964 ia = Math.sin(ir) * kage.kWidth;
\r
965 ib = Math.cos(ir) * kage.kWidth;
\r
977 //reverse if vector is going 2nd/3rd quadrants
\r
984 poly.push(x - ia, y - ib);
\r
985 poly2.push(x + ia, y + ib);
\r
989 poly.concat(poly2);
\r
990 polygons.push(poly);
\r
994 function cdDrawLine(kage, polygons, tx1, ty1, tx2, ty2, ta1, ta2){
\r
996 var v, x1, y1, x2, y2;
\r
997 var a1, a2, opt1, opt2;
\r
998 var XX, XY, YX, YY;
\r
1001 if(kage.kShotai == kage.kMincho){ //mincho
\r
1008 opt1 = Math.floor(ta1 / 100);
\r
1009 opt2 = Math.floor(ta2 / 100);
\r
1011 if(x1 == x2){ //if TATE stroke, use y-axis
\r
1012 poly = new Polygon(4);
\r
1015 poly.set(3, x1 - kage.kMinWidthT, y1 - kage.kMinWidthY / 2);
\r
1016 poly.set(0, x1 + kage.kMinWidthT, y1 + kage.kMinWidthY / 2);
\r
1019 case 6: //... no need
\r
1021 poly.set(3, x1 - kage.kMinWidthT, y1);
\r
1022 poly.set(0, x1 + kage.kMinWidthT, y1);
\r
1025 poly.set(3, x1 - kage.kMinWidthT, y1 - kage.kMinWidthY - kage.kMinWidthT);
\r
1026 poly.set(0, x1 + kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
1029 poly.set(3, x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
1030 poly.set(0, x1 + kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
1036 if(a1 == 6){ //KAGI's tail ... no need
\r
1037 poly.set(2, x2 - kage.kMinWidthT, y2);
\r
1038 poly.set(1, x2 + kage.kMinWidthT, y2);
\r
1041 poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kMinWidthT / 2);
\r
1042 poly.set(1, x2 + kage.kMinWidthT, y2 - kage.kMinWidthT / 2);
\r
1046 poly.set(2, x2 - kage.kMinWidthT, y2);
\r
1047 poly.set(1, x2 + kage.kMinWidthT, y2);
\r
1050 poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kAdjustKakatoL[opt2] + kage.kMinWidthT);
\r
1051 poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kAdjustKakatoL[opt2]);
\r
1054 poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kAdjustKakatoR[opt2] + kage.kMinWidthT);
\r
1055 poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kAdjustKakatoR[opt2]);
\r
1058 poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kMinWidthY);
\r
1059 poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kMinWidthY);
\r
1063 polygons.push(poly);
\r
1065 if(a1 == 22){ //box's right top corner
\r
1066 poly = new Polygon();
\r
1067 poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
1068 poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);
\r
1069 poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);
\r
1070 poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);
\r
1071 poly.push(x1 - kage.kMinWidthT, y1);
\r
1072 polygons.push(poly);
\r
1075 if(a1 == 0){ //beginning of the stroke
\r
1076 poly = new Polygon();
\r
1077 poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthY * 0.5);
\r
1078 poly.push(x1 + kage.kMinWidthT + kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 0.5 + kage.kMinWidthY);
\r
1079 poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2);
\r
1080 polygons.push(poly);
\r
1083 if((a1 == 6 && a2 == 0) || a2 == 1){ //KAGI NO YOKO BOU NO SAIGO NO MARU ... no need only used at 1st=yoko
\r
1084 poly = new Polygon();
\r
1085 poly.push(x2 - kage.kMinWidthT, y2);
\r
1086 poly.push(x2 - kage.kMinWidthT * 0.6, y2 + kage.kMinWidthT * 0.6);
\r
1087 poly.push(x2, y2 + kage.kMinWidthT);
\r
1088 poly.push(x2 + kage.kMinWidthT * 0.6, y2 + kage.kMinWidthT * 0.6);
\r
1089 poly.push(x2 + kage.kMinWidthT, y2);
\r
1090 poly.reverse(); // for fill-rule
\r
1091 polygons.push(poly);
\r
1094 else if(y1 == y2){ //if it is YOKO stroke, use x-axis
\r
1095 if(a1 == 6){ //if it is KAGI's YOKO stroke, get bold
\r
1096 poly = new Polygon();
\r
1097 poly.push(x1, y1 - kage.kMinWidthT);
\r
1098 poly.push(x2, y2 - kage.kMinWidthT);
\r
1099 poly.push(x2, y2 + kage.kMinWidthT);
\r
1100 poly.push(x1, y1 + kage.kMinWidthT);
\r
1101 polygons.push(poly);
\r
1103 if(a2 == 1 || a2 == 0 || a2 == 5){ // no need a2=1
\r
1104 //KAGI NO YOKO BOU NO SAIGO NO MARU
\r
1105 poly = new Polygon();
\r
1106 poly.push(x2, y2 - kage.kMinWidthT);
\r
1107 poly.push(x2 + kage.kMinWidthT * 0.6, y2 - kage.kMinWidthT * 0.6);
\r
1108 poly.push(x2 + kage.kMinWidthT, y2);
\r
1109 poly.push(x2 + kage.kMinWidthT * 0.6, y2 + kage.kMinWidthT * 0.6);
\r
1110 poly.push(x2, y2 + kage.kMinWidthT);
\r
1111 polygons.push(poly);
\r
1115 //KAGI NO YOKO BOU NO HANE
\r
1116 poly = new Polygon();
\r
1117 poly.push(x2, y2 - kage.kMinWidthT + 1);
\r
1118 poly.push(x2 + 2, y2 - kage.kMinWidthT - kage.kWidth * 5);
\r
1119 poly.push(x2, y2 - kage.kMinWidthT - kage.kWidth * 5);
\r
1120 poly.push(x2 - kage.kMinWidthT, y2 - kage.kMinWidthT + 1);
\r
1121 poly.reverse(); // for fill-rule
\r
1122 polygons.push(poly);
\r
1127 poly = new Polygon(4);
\r
1128 poly.set(0, x1, y1 - kage.kMinWidthY);
\r
1129 poly.set(1, x2, y2 - kage.kMinWidthY);
\r
1130 poly.set(2, x2, y2 + kage.kMinWidthY);
\r
1131 poly.set(3, x1, y1 + kage.kMinWidthY);
\r
1132 polygons.push(poly);
\r
1136 poly = new Polygon();
\r
1137 poly.push(x2, y2 - kage.kMinWidthY);
\r
1138 poly.push(x2 - kage.kAdjustUrokoX[opt2], y2);
\r
1139 poly.push(x2 - kage.kAdjustUrokoX[opt2] / 2, y2 - kage.kAdjustUrokoY[opt2]);
\r
1140 polygons.push(poly);
\r
1144 else{ //for others, use x-axis
\r
1145 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
1146 if((Math.abs(y2 - y1) < Math.abs(x2 - x1)) && (a1 != 6) && (a2 != 6) && !(x1 > x2)){ //ASAI KAUDO
\r
1148 poly = new Polygon(4);
\r
1149 poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthY, y1 - Math.cos(rad) * kage.kMinWidthY);
\r
1150 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthY, y2 - Math.cos(rad) * kage.kMinWidthY);
\r
1151 poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthY, y2 + Math.cos(rad) * kage.kMinWidthY);
\r
1152 poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthY, y1 + Math.cos(rad) * kage.kMinWidthY);
\r
1153 polygons.push(poly);
\r
1157 poly = new Polygon();
\r
1158 poly.push(x2 + Math.sin(rad) * kage.kMinWidthY, y2 - Math.cos(rad) * kage.kMinWidthY);
\r
1159 poly.push(x2 - Math.cos(rad) * kage.kAdjustUrokoX[opt2], y2 - Math.sin(rad) * kage.kAdjustUrokoX[opt2]);
\r
1160 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
1161 polygons.push(poly);
\r
1165 else{ //KAKUDO GA FUKAI or KAGI NO YOKO BOU
\r
1166 if(x1 > x2){ v = -1; } else{ v = 1; }
\r
1167 poly = new Polygon(4);
\r
1170 poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.cos(rad) * 0.5 * v,
\r
1171 y1 - Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.sin(rad) * 0.5 * v);
\r
1172 poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * 0.5 * v,
\r
1173 y1 + Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * 0.5 * v);
\r
1178 poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v, y1 - Math.cos(rad) * kage.kMinWidthT * v);
\r
1179 poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v, y1 + Math.cos(rad) * kage.kMinWidthT * v);
\r
1182 poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * v,
\r
1183 y1 - Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * v);
\r
1184 poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v - (kage.kMinWidthT + kage.kMinWidthY) * Math.cos(rad) * v,
\r
1185 y1 + Math.cos(rad) * kage.kMinWidthT * v - (kage.kMinWidthT + kage.kMinWidthY) * Math.sin(rad) * v);
\r
1188 poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * v,
\r
1189 y1 - Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * v);
\r
1190 poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.cos(rad) * v,
\r
1191 y1 + Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthY * Math.sin(rad) * v);
\r
1198 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);
\r
1199 poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);
\r
1202 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v - kage.kMinWidthT * 0.5 * Math.cos(rad) * v,
\r
1203 y2 - Math.cos(rad) * kage.kMinWidthT * v - kage.kMinWidthT * 0.5 * Math.sin(rad) * v);
\r
1204 poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthT * 0.5 * Math.cos(rad) * v,
\r
1205 y2 + Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthT * 0.5 * Math.sin(rad) * v);
\r
1208 case 1: // is needed?
\r
1210 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);
\r
1211 poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);
\r
1214 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kAdjustKakatoL[opt2] * Math.cos(rad) * v,
\r
1215 y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kAdjustKakatoL[opt2] * Math.sin(rad) * v);
\r
1216 poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v + (kage.kAdjustKakatoL[opt2] + kage.kMinWidthT) * Math.cos(rad) * v,
\r
1217 y2 + Math.cos(rad) * kage.kMinWidthT * v + (kage.kAdjustKakatoL[opt2] + kage.kMinWidthT) * Math.sin(rad) * v);
\r
1220 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kAdjustKakatoR[opt2] * Math.cos(rad) * v,
\r
1221 y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kAdjustKakatoR[opt2] * Math.sin(rad) * v);
\r
1223 x2 - Math.sin(rad) * kage.kMinWidthT * v + (kage.kAdjustKakatoR[opt2] + kage.kMinWidthT) * Math.cos(rad) * v,
\r
1224 y2 + Math.cos(rad) * kage.kMinWidthT * v + (kage.kAdjustKakatoR[opt2] + kage.kMinWidthT) * Math.sin(rad) * v);
\r
1227 poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.cos(rad) * v,
\r
1228 y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.sin(rad) * v);
\r
1229 poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.cos(rad) * v,
\r
1230 y2 + Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.sin(rad) * v);
\r
1234 polygons.push(poly);
\r
1236 if((a1 == 6) && (a2 == 0 || a2 == 5)){ //KAGI NO YOKO BOU NO SAIGO NO MARU
\r
1237 poly = new Polygon();
\r
1238 poly.push(x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);
\r
1239 poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * 0.8 * v + Math.sin(rad) * kage.kMinWidthT * 0.6 * v,
\r
1240 y2 + Math.sin(rad) * kage.kMinWidthT * 0.8 * v - Math.cos(rad) * kage.kMinWidthT * 0.6 * v);
\r
1241 poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * v, y2 + Math.sin(rad) * kage.kMinWidthT * v);
\r
1242 poly.push(x2 + Math.cos(rad) * kage.kMinWidthT * 0.8 * v - Math.sin(rad) * kage.kMinWidthT * 0.6 * v,
\r
1243 y2 + Math.sin(rad) * kage.kMinWidthT * 0.8 * v + Math.cos(rad) * kage.kMinWidthT * 0.6 * v);
\r
1244 poly.push(x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);
\r
1245 polygons.push(poly);
\r
1248 if(a1 == 6 && a2 == 5){
\r
1249 //KAGI NO YOKO BOU NO HANE
\r
1250 poly = new Polygon();
\r
1251 poly.push(x2 + (kage.kMinWidthT - 1) * Math.sin(rad) * v, y2 - (kage.kMinWidthT - 1) * Math.cos(rad) * v);
\r
1252 poly.push(x2 + 2 * Math.cos(rad) * v + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,
\r
1253 y2 + 2 * Math.sin(rad) * v - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);
\r
1254 poly.push(x2 + (kage.kMinWidthT + kage.kWidth * 5) * Math.sin(rad) * v,
\r
1255 y2 - (kage.kMinWidthT + kage.kWidth * 5) * Math.cos(rad) * v);
\r
1256 poly.push(x2 + (kage.kMinWidthT - 1) * Math.sin(rad) * v - kage.kMinWidthT * Math.cos(rad) * v,
\r
1257 y2 - (kage.kMinWidthT - 1) * Math.cos(rad) * v - kage.kMinWidthT * Math.sin(rad) * v);
\r
1258 polygons.push(poly);
\r
1261 if(a1 == 22){ //SHIKAKU MIGIUE UROKO NANAME DEMO MASSUGU MUKI
\r
1262 poly = new Polygon();
\r
1263 poly.push(x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);
\r
1264 poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);
\r
1265 poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);
\r
1266 poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);
\r
1267 poly.push(x1 - kage.kMinWidthT, y1);
\r
1268 polygons.push(poly);
\r
1271 XX = Math.sin(rad) * v;
\r
1272 XY = Math.cos(rad) * v * -1;
\r
1273 YX = Math.cos(rad) * v;
\r
1274 YY = Math.sin(rad) * v;
\r
1276 if(a1 == 0){ //beginning of the storke
\r
1277 poly = new Polygon();
\r
1278 poly.push(x1 + kage.kMinWidthT * XX + (kage.kMinWidthY * 0.5) * YX,
\r
1279 y1 + kage.kMinWidthT * XY + (kage.kMinWidthY * 0.5) * YY);
\r
1280 poly.push(x1 + (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YX,
\r
1281 y1 + (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YY);
\r
1282 poly.push(x1 + kage.kMinWidthT * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YX,
\r
1283 y1 + kage.kMinWidthT * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YY);
\r
1284 polygons.push(poly);
\r
1290 if(tx1 == tx2){ //if TATE stroke, use y-axis
\r
1308 if(a1 % 10 == 2){ y1 = y1 - kage.kWidth; }
\r
1309 if(a2 % 10 == 2){ y2 = y2 + kage.kWidth; }
\r
1310 if(a1 % 10 == 3){ y1 = y1 - kage.kWidth * kage.kKakato; }
\r
1311 if(a2 % 10 == 3){ y2 = y2 + kage.kWidth * kage.kKakato; }
\r
1313 poly = new Polygon();
\r
1314 poly.push(x1 - kage.kWidth, y1);
\r
1315 poly.push(x2 - kage.kWidth, y2);
\r
1316 poly.push(x2 + kage.kWidth, y2);
\r
1317 poly.push(x1 + kage.kWidth, y1);
\r
1318 poly.reverse(); // for fill-rule
\r
1320 polygons.push(poly);
\r
1322 else if(ty1 == ty2){ //if YOKO stroke, use x-axis
\r
1339 if(a1 % 10 == 2){ x1 = x1 - kage.kWidth; }
\r
1340 if(a2 % 10 == 2){ x2 = x2 + kage.kWidth; }
\r
1341 if(a1 % 10 == 3){ x1 = x1 - kage.kWidth * kage.kKakato; }
\r
1342 if(a2 % 10 == 3){ x2 = x2 + kage.kWidth * kage.kKakato; }
\r
1344 poly = new Polygon();
\r
1345 poly.push(x1, y1 - kage.kWidth);
\r
1346 poly.push(x2, y2 - kage.kWidth);
\r
1347 poly.push(x2, y2 + kage.kWidth);
\r
1348 poly.push(x1, y1 + kage.kWidth);
\r
1350 polygons.push(poly);
\r
1352 else{ //for others, use x-axis
\r
1369 rad = Math.atan((y2 - y1) / (x2 - x1));
\r
1371 x1 = x1 - kage.kWidth * Math.cos(rad);
\r
1372 y1 = y1 - kage.kWidth * Math.sin(rad);
\r
1375 x2 = x2 + kage.kWidth * Math.cos(rad);
\r
1376 y2 = y2 + kage.kWidth * Math.sin(rad);
\r
1379 x1 = x1 - kage.kWidth * Math.cos(rad) * kage.kKakato;
\r
1380 y1 = y1 - kage.kWidth * Math.sin(rad) * kage.kKakato;
\r
1383 x2 = x2 + kage.kWidth * Math.cos(rad) * kage.kKakato;
\r
1384 y2 = y2 + kage.kWidth * Math.sin(rad) * kage.kKakato;
\r
1387 //SUICHOKU NO ICHI ZURASHI HA Math.sin TO Math.cos NO IREKAE + x-axis MAINASU KA
\r
1388 poly = new Polygon();
\r
1389 poly.push(x1 + Math.sin(rad) * kage.kWidth, y1 - Math.cos(rad) * kage.kWidth);
\r
1390 poly.push(x2 + Math.sin(rad) * kage.kWidth, y2 - Math.cos(rad) * kage.kWidth);
\r
1391 poly.push(x2 - Math.sin(rad) * kage.kWidth, y2 + Math.cos(rad) * kage.kWidth);
\r
1392 poly.push(x1 - Math.sin(rad) * kage.kWidth, y1 + Math.cos(rad) * kage.kWidth);
\r
1394 polygons.push(poly);
\r