Arcのコードについて

Arctoの値を、ベジェ曲線に変換するArcオブジェクトのコードをここで公開します。
(言語:JavaScript。種類:DOMではなく独自)

function Arc(){
 return this;
}

Arc.prototype.setSegments = function arcsetSegments(x1,y1,rx,ry,psai,fA,fS,x4,y4){
 if(rx == 0 || ry == 0){throw "line";}
 rx = Math.abs(rx); ry = Math.abs(ry);
 var ccx = (x1 - x4) / 2;
 var ccy = (y1 - y4) / 2;
 var cpsi = Math.cos(psai/180*Math.PI);
 var spsi = Math.sin(psai/180*Math.PI);
 var x1d = cpsi*ccx + spsi*ccy;
 var y1d = -spsi*ccx + cpsi*ccy;
 var x1dd = Math.pow(x1d,2);
 var y1dd = Math.pow(y1d,2);
 var rxx = Math.pow(rx,2);
 var ryy = Math.pow(ry,2);
 var lamda = x1dd/rxx + y1dd/ryy; var genkai = 5000;
 while(lamda >= 1 && genkai >= 0){
  rx = Math.sqrt(lamda) * rx;
  ry = Math.sqrt(lamda) * ry;
  rxx = Math.pow(rx,2); ryy = Math.pow(ry,2);
  lamda = x1dd/rxx + y1dd/ryy;
  genkai--;
 }
 if(lamda >= 1){throw "circle";}
 var seif = 1;
 if(fA == fS){
  seif = -1;
 }
 var sds = seif * Math.sqrt(rxx*ryy - rxx*y1dd - ryy*x1dd) / (rxx*y1dd + ryy*x1dd);
 var cxd = sds*(rx*y1d) / ry;
 var cyd = sds*(ry*x1d) / rx;
 var cx = cpsi*cxd - spsi*cyd + ccx;
 var cy = spsi*cxd + cpsi*cyd + ccy;
 var s1 = Math.atan2*1;
 return true;
}

解説は後日です。

*1:x1d-cxd)/rx,(y1d-cyd)/ry); var dr = Math.atan2((-x1d-cxd)/rx,(-y1d-cyd)/ry); if(fS == 0 && dr > 0){ dr = dr - 360; } else if(fS == 1 && dr < 0){ dr += 360; } var s2 = s1 + dr; alert(rx+","+ry+","+s1+","+s2+","+cx+","+cy); var mc1 = Math.cos(s1); var mc2 = Math.cos(s2); var ms1 = Math.sin(s1); var ms2 = Math.sin(s2); var AA = (8*Math.cos((s1+s2)/2) - mc1 - mc2) /3; var BB = (8*Math.sin((s1+s2)/2) - ms1 - ms2) /3; var ms12 = Math.sin(s1-s2); var x2 = (AA*ms1*mc2 + BB*ms1*ms2 - ms1 - ms2) / ms12; var y2 = (AA*mc1*mc2 + BB*mc1*ms2 - mc1 - mc2) / ms12; var x3 = (AA*mc1*ms2 + BB*ms1*ms2 - ms1 - ms2) / ms12; var y3 = (AA*mc1*mc2 + BB*ms1*mc2 - mc1 - mc2) / ms12; this.D = new Array(parseInt(rx*x2+cx),parseInt(ry*y2+cy),parseInt(rx*x3+cx),parseInt(ry*y3+cy),parseInt(x4),parseInt(y4