Svg 在错误坐标中绘制转换路径

Svg 在错误坐标中绘制转换路径,svg,canvas,Svg,Canvas,我试图建立一个简单的游戏教育的目的,我有问题,以正确的坐标绘制对象 我有一个我想使用的svg太空船,所以我用这个工具将它转换成画布路径系统 因为svg最初是在1000x1000平面上设计的,所以我必须应用缩放以达到所需的大小 // calculate scale, if size (r) has to be 40px then 40px / original size (1000) = 0.04; var size = r / 1000; ctx.scale(size, size); // ap

我试图建立一个简单的游戏教育的目的,我有问题,以正确的坐标绘制对象

我有一个我想使用的svg太空船,所以我用这个工具将它转换成画布路径系统

因为svg最初是在1000x1000平面上设计的,所以我必须应用缩放以达到所需的大小

// calculate scale, if size (r) has to be 40px then 40px / original size (1000) = 0.04;
var size = r / 1000;
ctx.scale(size, size); // apply desired size
这似乎是可行的,但当涉及到在设定坐标(x,y)下渲染时,它显然是不正确的

在演示中,您可以看到船正在旋转并移动到它应该在的位置之外,而且比例不均衡似乎因位置而异,这显然意味着有问题

也许有人能找到原因,我该怎么解决?ofc的目标是在辅助框的中心渲染船舶

这是演示代码:

var cvs=document.querySelector('canvas'),
ctx=cvs.getContext('2d'),
w=cvs.width=1000,
h=cvs.height=1000,
helper=document.querySelector('.helper');
var ship=函数(x,y,r,a){
var size=r/1000;//计算刻度,如果大小(r)必须为40px,则40px/原始大小(1000)=0.04;
x-=r/2;//返回其宽度的一半,使船舶在经过的x坐标上居中
y-=r/2;//返回其高度的一半,使船在经过的y坐标上居中
/*绘制原始船舶-->*/
ctx.save();
ctx.translate(x,y);
缩放(大小,大小);//应用所需大小
ctx.rotate((a+90)*Math.PI/180);//以船舶中心旋转船舶
ctx.translate(-x,-y);
ctx.beginPath();
ctx.moveTo(341.4856.1);
ctx.lineTo(173.2881.80000000001);
ctx.BezierrCurveto(159.7999999998883.80000000001146.5877.7139.399999999998866.2);
ctx.lineTo(76.6999999997764.2);
ctx.BezierrCurveto(73.1999999997758.5,71.5999999998752,71.7999999997745.6);
ctx.BezierrCurveto(71.7999999997745.1,71.6999999997744.5,71.6999999999997744);
ctx.lineTo(71.6999999997528.2);
ctx.BezierrCurveto(71.6999999997509.6,86.7999999999997494.50000000000006105.3999999999998494.50000000000006);
ctx.bezierCurveTo(123.9999999999997494.50000000000006139.0999999997509.600000000001139.0999999997528.2);
ctx.lineTo(139.0999999997617.7);
ctx.lineTo(273.79999999595377.800000000007);
ctx.lineTo(341.49999999493.300000000000007);
ctx.lineTo(341.499999994856.1);
ctx.closePath();
ctx.moveTo(894.7494.5);
ctx.bezierCurveTo(876.1494.5861509.6861528.2);
ctx.lineTo(861617.7);
ctx.lineTo(726.3377.8);
ctx.lineTo(658.59999999493.3);
ctx.lineTo(658.59999999856.1);
ctx.lineTo(826.8881.80000000001);
ctx.bezierCurveTo(840.19999999883.80000000001853.5877.7860.599999999866.1);
ctx.lineTo(923.3764.1);
ctx.bezierCurveTo(926.8758.4928.4751.9928.19999999745.5);
ctx.bezierCurveTo(928.199999999745928.3744.4928.3743.9);
ctx.lineTo(928.3528.2);
ctx.bezierCurveTo(928.3509.6913.3494.5894.7494.5);
ctx.closePath();
ctx.moveTo(591.2857.6);
ctx.lineTo(533.7900.5);
ctx.lineTo(533.7956.4);
ctx.bezierCurveTo(533.7975518.6990.1500.0000000000000 6990.1);
ctx.bezierCurveTo(481.40000000000003990.1466.300000000000007975466.300000000000007956.4);
ctx.lineTo(466.300000000000007900.5);
ctx.lineTo(408.800000000007857.6);
ctx.lineTo(408.800000000007484.2);
ctx.bezierCurveTo(408.800000000007478.2407.200000000000005472.3404.200000000000005467.2);
ctx.lineTo(312.0000000000000 6309.79999995);
ctx.lineTo(470.6,27.2);
比塞尔曲线(476.6,16.6487.8,10500,10);
ctx.bezierCurveTo(512.2,10523.4,16.6529.4,27.2);
ctx.lineTo(688.09999999309.8);
ctx.lineTo(595.89999999467.200000000005);
ctx.bezierCurveTo(592.8999999949472.40000000000003591.2999999999998478.200000000000005591.2999999999998484.200000000000005);
ctx.lineTo(591.2999999998857.6);
ctx.closePath();
ctx.moveTo(591318.2);
ctx.bezierCurveTo(605.3306.4607.4285.09999999797595.5270.8);
ctx.bezierCurveTo(591.6266.1555.8224.6000000000002500.8224.6000000000002);
ctx.bezierCurveTo(446.3224.6000000000002409.1265.40000000000003405270.1);
ctx.bezierCurveTo(392.7284.1394.1305.5408.1317.700000000005);
ctx.bezierCurveTo(414.5323.300000000000007422.40000000000003326.1430.3326.1);
ctx.bezierCurveTo(439.6326.1448.9000000000003322.200000000000005455.5314.700000000005);
ctx.bezierCurveTo(461.2308.40000000000003480.4292.1500.8292.1);
ctx.bezierCurveTo(524.7292.1543.6313.8543.6313.8);
比塞尔曲线图(555.5328576.7330.1591318.2);
ctx.closePath();
ctx.fillStyle='#000';
ctx.strokeStyle='#000';
ctx.lineWidth=1;
ctx.fill();
ctx.stroke();
ctx.restore();

/*=950 | | c.y>=950 | | c.x值得一提的是,您可以像我在下一个演示中所做的那样,在画布中绘制svg路径。此外,我已经重新计算了您的路径。您使用的路径是1000/1000个单位。我已经重新计算了您的路径,从x和y的-500开始,将中心放在原点:点{x:0,y:0}

让svgPath=`M-158.6000000000002356.1L-326.8381.7999999995C-340.2383.799999995,-353.5377.700000000005,-360.6366.20000000000005L-423.3264.20000000000005C-426.8258.5,-428.4252,-428.2245.6000000000002,--428.2245.1000000000002,-,--428.3244.5,--428.32400000045C-428.3,9.60000023,-.394.5.5,-376,-5.5,-360.9,9.60000000000023,-360.99,28.2000000000000045L-360.9117.700000000005,-226.2,-122.199999999999,-158.5,-6.6999999999999,-158.5356.1
M394.700000000005,-5.5C376.1,-5.5C376.1,-5.5361,9.60000000000023361,28.200000000000045L36117.700000000000526.2999999999999999999999995,-122.19999999999999999999999999959158.6900000000005,-6.699999999999999991586000000000002356.1326.799999999999999381.799999999995C340.200000000000005383.79999999999999995353.5377.799999999999999999960.6366.1L4279999999999995,258.4,428.4,251.89999999999998,428.2000