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使用弯曲路径动画设置标记结束/标记开始的动画_Svg_Svg Animate - Fatal编程技术网

svg使用弯曲路径动画设置标记结束/标记开始的动画

svg使用弯曲路径动画设置标记结束/标记开始的动画,svg,svg-animate,Svg,Svg Animate,我有使用animate元素设置动画的弯曲路径。它会结合@关键帧设置路径动画,但当我在弯曲路径内添加标记时,标记不会设置动画。我通过更改path-values属性,使用一个简单的路径测试了一个。它使用简单的路径工作得非常好,但是如何使标记元素使用曲线路径设置动画呢 codepen演示:使用简单的曲线路径因为您拥有的是一条Bézier曲线,所以您可以计算从原点到新位置绘制曲线的点。为了理解接下来会发生什么,你需要理解什么是贝塞尔曲线 在下一个示例中,我将使用输入类型范围来更改曲线。您可以将其设置为动

我有使用
animate
元素设置动画的弯曲路径。它会结合
@关键帧设置路径动画,但当我在弯曲路径内添加标记时,标记不会设置动画。我通过更改path-values属性,使用一个简单的路径测试了一个。它使用简单的路径工作得非常好,但是如何使标记元素使用曲线路径设置动画呢


codepen演示:使用简单的曲线路径

因为您拥有的是一条Bézier曲线,所以您可以计算从原点到新位置绘制曲线的点。为了理解接下来会发生什么,你需要理解什么是贝塞尔曲线

在下一个示例中,我将使用输入类型范围来更改曲线。您可以将其设置为动画。请阅读代码中的注释

//用于绘制最终曲线的点
让分数=[[308.7,34.9]、[381.3,37.4]、[444.3,78]、[478.7137.5];
//实际曲线的终点在最终曲线上的位置。
设t=0.5;
//实际曲线的点
设newPoints=getBezierPoints(t);
drawCBezier(newPoints,the_bezier);
//输入时,重新计算曲线和曲线的点
T.addEventListener(“输入”,函数(){
t=该值;
newPoints=getBezierPoints(t);
drawCBezier(newPoints,the_bezier);
});
函数getBezierPoints(t){
让helperPoints=[];
//辅助点0,1,2
for(设i=1;i<4;i++){
//点数。长度必须为4!!!
设p=lerp(点[i-1],点[i],t);
帮助点推(p);
}
//辅助点3,4
helperPoints.push(lerp(helperPoints[0],helperPoints[1],t));
helperPoints.push(lerp(helperPoints[1],helperPoints[2],t));
//辅助点5是第一个Bézier结束和第二个Bézier开始的地方
helperPoints.push(lerp(helperPoints[3],helperPoints[4],t));
//动态bézier的点
设firstBezier=[
分数[0],
帮助点[0],
帮助点[3],
帮助点[5]
];
返回第一贝塞尔;
}
函数lerp(A、B、t){
//从a到B的虚拟线
//得到这条线上一点的位置
//如果(t==0.5)直线中心的点

//0由于您拥有的是一条贝塞尔曲线,因此您可以计算从原点到新位置绘制曲线的点。要了解接下来的内容,您需要了解什么是贝塞尔曲线

在下一个示例中,我使用输入类型范围来更改曲线。您可以将其设置为动画。请阅读代码中的注释

//用于绘制最终曲线的点
让分数=[[308.7,34.9]、[381.3,37.4]、[444.3,78]、[478.7137.5];
//实际曲线的终点在最终曲线上的位置。
设t=0.5;
//实际曲线的点
设newPoints=getBezierPoints(t);
drawCBezier(newPoints,the_bezier);
//输入时,重新计算曲线和曲线的点
T.addEventListener(“输入”,函数(){
t=该值;
newPoints=getBezierPoints(t);
drawCBezier(newPoints,the_bezier);
});
函数getBezierPoints(t){
让helperPoints=[];
//辅助点0,1,2
for(设i=1;i<4;i++){
//点数。长度必须为4!!!
设p=lerp(点[i-1],点[i],t);
帮助点推(p);
}
//辅助点3,4
helperPoints.push(lerp(helperPoints[0],helperPoints[1],t));
helperPoints.push(lerp(helperPoints[1],helperPoints[2],t));
//辅助点5是第一个Bézier结束和第二个Bézier开始的地方
helperPoints.push(lerp(helperPoints[3],helperPoints[4],t));
//动态bézier的点
设firstBezier=[
分数[0],
帮助点[0],
帮助点[3],
帮助点[5]
];
返回第一贝塞尔;
}
函数lerp(A、B、t){
//从a到B的虚拟线
//得到这条线上一点的位置
//如果(t==0.5)直线中心的点
//0读取您将注意到动画值包括箭头开始和结束位置读取您将注意到动画值包括箭头开始和结束位置