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