Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将SVG椭圆弧转换为HTML5画布弧()的代码或公式出错?_Svg_Html5 Canvas_Linear Algebra - Fatal编程技术网

将SVG椭圆弧转换为HTML5画布弧()的代码或公式出错?

将SVG椭圆弧转换为HTML5画布弧()的代码或公式出错?,svg,html5-canvas,linear-algebra,Svg,Html5 Canvas,Linear Algebra,我试图转换成一个中心点、开始/停止角度和可能的缩放/旋转(在椭圆的情况下) 我遵循的是SVG实现说明中的等式,但大部分情况下,我没有得到好的值。请参阅下面的代码段,其中更改输入值将以红色绘制SVG弧,然后尝试在HTML5画布上以绿色绘制相同的弧 我很确定我仍然需要纠正超出范围的半径,我知道我还没有处理椭圆(而不是圆),但即使半径相同且正确,我的代码也返回了错误的开始/结束值 有人能看到SVG规范中列出的公式在我的转换中有错误,或者公式本身有错误吗 const{mat2,vec2}=this.v

我试图转换成一个中心点、开始/停止角度和可能的缩放/旋转(在椭圆的情况下)

我遵循的是SVG实现说明中的等式,但大部分情况下,我没有得到好的值。请参阅下面的代码段,其中更改输入值将以红色绘制SVG弧,然后尝试在HTML5画布上以绿色绘制相同的弧

我很确定我仍然需要纠正超出范围的半径,我知道我还没有处理椭圆(而不是圆),但即使半径相同且正确,我的代码也返回了错误的开始/结束值

有人能看到SVG规范中列出的公式在我的转换中有错误,或者公式本身有错误吗

const{mat2,vec2}=this.vmath | | require('vmath');
[]forEach.call(
document.querySelectorAll('x1in、'y1in、'x2in、'y2in、'ain、'sin、'rxin、'ryin、'φin'),
inp=>{inp.addEventListener('input',recalc,false)}
);
recalc();
函数recalc(){
常数x1=x1in.值*1,y1=y1in.值*1,
x2=x2英寸值*1,y2=y2英寸值*1,
ƒa=ƒain.value*1,ƒs=ƒsin.value*1,
rx=rxin.值*1,ry=ryin.值*1,
φ=φ英寸值*1;
setAttribute('d',['M',x1,y1,'A',rx,ry,φ,ƒA,ƒs,x2,y2.)。连接(“”);
//F.6.5.1
常数cosφ=数学cos(φ*数学PI/180),
sinφ=数学sin(φ*数学PI/180);
常数tmpM2=mat2.new(cosφ,-sinφ,sinφ,cosφ);
常数cp=vec2.新((x1-x2)/2,(y1-y2)/2);
vec2.transformMat2(cp,cp,tmpM2);
常数x1p=cp.x,y1p=cp.y;
x1po.innerHTML=x1p;
y1po.innerHTML=y1p;
//F.6.5.2
向量2.集合(cp,rx*y1p/ry,-ry*x1p/rx);
常数rx2=rx*rx,ry2=ry*ry,x1p2=x1p*x1p,y1p2=y1p*y1p;
向量2.量表(cp,cp,(ƒa==ƒs?-1:1)*数学sqrt(
(rx2*ry2-rx2*y1p2-ry2*x1p2)/
(rx2*y1p2+ry2*x1p2)
));
cpxo.innerHTML=cp.x;
cpyo.innerHTML=cp.y;
//F.6.5.3
mat2.set(tmpM2,cosφ,sinφ,-sinφ,cosφ);
const c=vec2.transformat2(vec2.new(),cp,tmpM2);
c、 x+=(x1+x2)/2;
c、 y+=(y1+y2)/2;
cxo.innerHTML=c.x;
cyo.innerHTML=c.y;
常数v1=vec2.新((x1p-cp.x)/rx,(y1p-cp.y)/ry);
常数v2=vec2.新(-x1p-cp.x)/rx、-y1p-cp.y)/ry);
//F.6.5.5
常数θ1=夹角(vec2.new(1,0),v1);
θ1o.innerHTML=θ1*180/Math.PI;
//F.6.5.6
常数Δθ=(v1,v2)%之间的角度(数学PI*2);
Δθo.innerHTML=Δθ*180/Math.PI;
设ctx=can.getContext('2d');
//TODO:φ旋转(?)和缩放(如果rx!=ry)
ctx.clearRect(0,0400200);
ctx.lineWidth=2;
ctx.strokeStyle='rgba(0255,0,1)';
ctx.beginPath();
弧(c.x,c.y,rx,θ1,θ1-Δθ,假);
ctx.stroke();
}
//F.6.5.4
功能角度(u,v){
常数符号=(u.x*v.y-u.y*v.x>1)?1:-1;
返回符号*Math.acos(vec2.dot(u,v)/vec2.length(u)/vec2.length(v));
}
svg,画布{位置:绝对;顶部:0;左侧:0;宽度:400px;高度:200px}
svg路径{填充:无;笔划:红色;笔划宽度:4px}
#ui{margin top:200px}
div{页边距底部:0.5em}
标签{右边距:1em;空白:nowrap}
输入{宽度:2.5em;文本对齐:右}
span{font-family:sans-serif}
img{显示:块;边距:2em}

x1:
y1:
x2:
y2:
ƒa:
ƒs:
接收:
ry:
φ: 
x1ʹ:
y1ʹ:
cxʹ:
赛义夫:
cx:
赛义德:
θ1: 
∆θ: 

这有什么帮助吗@罗伯特朗森也许可以,谢谢!