Javascript 在画布中沿曲线路径绘制形状

Javascript 在画布中沿曲线路径绘制形状,javascript,canvas,kineticjs,Javascript,Canvas,Kineticjs,我一直在用谷歌搜索,但我找不到答案(我想我问错了问题),但我想知道是否有可能沿着一条路径绘制一组对象 例如,是否可以使用quadraticCurveTo()绘制路径,然后沿该曲线绘制一组圆 提前谢谢。是的。。。但在原始JavaScript中实现这一点需要大量的工作。解决这一问题的最简单方法是使用JavaScript库来操作HTML画布元素——有几十种 以下是我的尝试: (免责声明:我写了Scrawl.js)是的。。。但在原始JavaScript中实现这一点需要大量的工作。解决这一问题的最简单方法

我一直在用谷歌搜索,但我找不到答案(我想我问错了问题),但我想知道是否有可能沿着一条路径绘制一组对象

例如,是否可以使用quadraticCurveTo()绘制路径,然后沿该曲线绘制一组圆


提前谢谢。

是的。。。但在原始JavaScript中实现这一点需要大量的工作。解决这一问题的最简单方法是使用JavaScript库来操作HTML画布元素——有几十种

以下是我的尝试:


(免责声明:我写了Scrawl.js)

是的。。。但在原始JavaScript中实现这一点需要大量的工作。解决这一问题的最简单方法是使用JavaScript库来操作HTML画布元素——有几十种

以下是我的尝试:


(免责声明:我写了Scrawl.js)

是的。。。但在原始JavaScript中实现这一点需要大量的工作。解决这一问题的最简单方法是使用JavaScript库来操作HTML画布元素——有几十种

以下是我的尝试:


(免责声明:我写了Scrawl.js)

是的。。。但在原始JavaScript中实现这一点需要大量的工作。解决这一问题的最简单方法是使用JavaScript库来操作HTML画布元素——有几十种

以下是我的尝试:


(免责声明:我写了Scrawl.js)

这个等式将以二次曲线的间隔给你点

在曲线的起点T==0.00

在曲线末端,T==1.00

function getQuadraticBezierXYatT(startPt,controlPt,endPt,T) {
    var x = Math.pow(1-T,2) * startPt.x + 2 * (1-T) * T * controlPt.x + Math.pow(T,2) * endPt.x; 
    var y = Math.pow(1-T,2) * startPt.y + 2 * (1-T) * T * controlPt.y + Math.pow(T,2) * endPt.y; 
    return( {x:x,y:y} );
}
所以你可以沿着二次曲线画圆,像这样:

这个代码示例使用html画布而不是KineticJS库,但是您可以在这个示例使用的
context.arc

<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<style>
    body{ background-color: ivory; }
    canvas{border:1px solid red;}
</style>
<script>
$(function(){

    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    var startPoint={x:50,y:150};
    var controlPoint={x:125,y:20};
    var endPoint={x:200,y:150};

    ctx.beginPath();
    ctx.moveTo(startPoint.x,startPoint.y);
    ctx.quadraticCurveTo(controlPoint.x,controlPoint.y,endPoint.x,endPoint.y);
    ctx.stroke();

    for(var t=0;t<101;t+=5){
        var point=getQuadraticBezierXYatT(startPoint,controlPoint,endPoint,t/100);
        ctx.beginPath();
        ctx.arc(point.x,point.y,3,0,Math.PI*2);
        ctx.closePath();
        ctx.fillStyle=randomColor();
        ctx.fill();
    }

    function getQuadraticBezierXYatT(startPt,controlPt,endPt,T) {
        var x = Math.pow(1-T,2) * startPt.x + 2 * (1-T) * T * controlPt.x + Math.pow(T,2) * endPt.x; 
        var y = Math.pow(1-T,2) * startPt.y + 2 * (1-T) * T * controlPt.y + Math.pow(T,2) * endPt.y; 
        return( {x:x,y:y} );
    }

    function randomColor(){ 
        return('#'+Math.floor(Math.random()*16777215).toString(16));
    }

}); // end $(function(){});
</script>
</head>
<body>
    <button id="test">Test</button><br>
    <canvas id="canvas" width=300 height=300></canvas>
</body>
</html>

正文{背景色:象牙;}
画布{边框:1px纯红;}
$(函数(){
var canvas=document.getElementById(“canvas”);
var ctx=canvas.getContext(“2d”);
var startPoint={x:50,y:150};
var控制点={x:125,y:20};
var端点={x:200,y:150};
ctx.beginPath();
ctx.moveTo(startPoint.x,startPoint.y);
ctx.二次曲线(控制点.x,控制点.y,端点.x,端点.y);
ctx.stroke();

对于(var t=0;t,该方程将沿二次曲线以一定间隔给出点

在曲线的起点T==0.00

在曲线末端,T==1.00

function getQuadraticBezierXYatT(startPt,controlPt,endPt,T) {
    var x = Math.pow(1-T,2) * startPt.x + 2 * (1-T) * T * controlPt.x + Math.pow(T,2) * endPt.x; 
    var y = Math.pow(1-T,2) * startPt.y + 2 * (1-T) * T * controlPt.y + Math.pow(T,2) * endPt.y; 
    return( {x:x,y:y} );
}
所以你可以沿着二次曲线画圆,像这样:

这个代码示例使用html画布而不是KineticJS库,但是您可以在这个示例使用的
context.arc

<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<style>
    body{ background-color: ivory; }
    canvas{border:1px solid red;}
</style>
<script>
$(function(){

    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    var startPoint={x:50,y:150};
    var controlPoint={x:125,y:20};
    var endPoint={x:200,y:150};

    ctx.beginPath();
    ctx.moveTo(startPoint.x,startPoint.y);
    ctx.quadraticCurveTo(controlPoint.x,controlPoint.y,endPoint.x,endPoint.y);
    ctx.stroke();

    for(var t=0;t<101;t+=5){
        var point=getQuadraticBezierXYatT(startPoint,controlPoint,endPoint,t/100);
        ctx.beginPath();
        ctx.arc(point.x,point.y,3,0,Math.PI*2);
        ctx.closePath();
        ctx.fillStyle=randomColor();
        ctx.fill();
    }

    function getQuadraticBezierXYatT(startPt,controlPt,endPt,T) {
        var x = Math.pow(1-T,2) * startPt.x + 2 * (1-T) * T * controlPt.x + Math.pow(T,2) * endPt.x; 
        var y = Math.pow(1-T,2) * startPt.y + 2 * (1-T) * T * controlPt.y + Math.pow(T,2) * endPt.y; 
        return( {x:x,y:y} );
    }

    function randomColor(){ 
        return('#'+Math.floor(Math.random()*16777215).toString(16));
    }

}); // end $(function(){});
</script>
</head>
<body>
    <button id="test">Test</button><br>
    <canvas id="canvas" width=300 height=300></canvas>
</body>
</html>

正文{背景色:象牙;}
画布{边框:1px纯红;}
$(函数(){
var canvas=document.getElementById(“canvas”);
var ctx=canvas.getContext(“2d”);
var startPoint={x:50,y:150};
var控制点={x:125,y:20};
var端点={x:200,y:150};
ctx.beginPath();
ctx.moveTo(startPoint.x,startPoint.y);
ctx.二次曲线(控制点.x,控制点.y,端点.x,端点.y);
ctx.stroke();

对于(var t=0;t,该方程将沿二次曲线以一定间隔给出点

在曲线的起点T==0.00

在曲线末端,T==1.00

function getQuadraticBezierXYatT(startPt,controlPt,endPt,T) {
    var x = Math.pow(1-T,2) * startPt.x + 2 * (1-T) * T * controlPt.x + Math.pow(T,2) * endPt.x; 
    var y = Math.pow(1-T,2) * startPt.y + 2 * (1-T) * T * controlPt.y + Math.pow(T,2) * endPt.y; 
    return( {x:x,y:y} );
}
所以你可以沿着二次曲线画圆,像这样:

这个代码示例使用html画布而不是KineticJS库,但是您可以在这个示例使用的
context.arc

<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<style>
    body{ background-color: ivory; }
    canvas{border:1px solid red;}
</style>
<script>
$(function(){

    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    var startPoint={x:50,y:150};
    var controlPoint={x:125,y:20};
    var endPoint={x:200,y:150};

    ctx.beginPath();
    ctx.moveTo(startPoint.x,startPoint.y);
    ctx.quadraticCurveTo(controlPoint.x,controlPoint.y,endPoint.x,endPoint.y);
    ctx.stroke();

    for(var t=0;t<101;t+=5){
        var point=getQuadraticBezierXYatT(startPoint,controlPoint,endPoint,t/100);
        ctx.beginPath();
        ctx.arc(point.x,point.y,3,0,Math.PI*2);
        ctx.closePath();
        ctx.fillStyle=randomColor();
        ctx.fill();
    }

    function getQuadraticBezierXYatT(startPt,controlPt,endPt,T) {
        var x = Math.pow(1-T,2) * startPt.x + 2 * (1-T) * T * controlPt.x + Math.pow(T,2) * endPt.x; 
        var y = Math.pow(1-T,2) * startPt.y + 2 * (1-T) * T * controlPt.y + Math.pow(T,2) * endPt.y; 
        return( {x:x,y:y} );
    }

    function randomColor(){ 
        return('#'+Math.floor(Math.random()*16777215).toString(16));
    }

}); // end $(function(){});
</script>
</head>
<body>
    <button id="test">Test</button><br>
    <canvas id="canvas" width=300 height=300></canvas>
</body>
</html>

正文{背景色:象牙;}
画布{边框:1px纯红;}
$(函数(){
var canvas=document.getElementById(“canvas”);
var ctx=canvas.getContext(“2d”);
var startPoint={x:50,y:150};
var控制点={x:125,y:20};
var端点={x:200,y:150};
ctx.beginPath();
ctx.moveTo(startPoint.x,startPoint.y);
ctx.二次曲线(控制点.x,控制点.y,端点.x,端点.y);
ctx.stroke();

对于(var t=0;t,该方程将沿二次曲线以一定间隔给出点

在曲线的起点T==0.00

在曲线末端,T==1.00

function getQuadraticBezierXYatT(startPt,controlPt,endPt,T) {
    var x = Math.pow(1-T,2) * startPt.x + 2 * (1-T) * T * controlPt.x + Math.pow(T,2) * endPt.x; 
    var y = Math.pow(1-T,2) * startPt.y + 2 * (1-T) * T * controlPt.y + Math.pow(T,2) * endPt.y; 
    return( {x:x,y:y} );
}
所以你可以沿着二次曲线画圆,像这样:

这个代码示例使用html画布而不是KineticJS库,但是您可以在这个示例使用的
context.arc

<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<style>
    body{ background-color: ivory; }
    canvas{border:1px solid red;}
</style>
<script>
$(function(){

    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    var startPoint={x:50,y:150};
    var controlPoint={x:125,y:20};
    var endPoint={x:200,y:150};

    ctx.beginPath();
    ctx.moveTo(startPoint.x,startPoint.y);
    ctx.quadraticCurveTo(controlPoint.x,controlPoint.y,endPoint.x,endPoint.y);
    ctx.stroke();

    for(var t=0;t<101;t+=5){
        var point=getQuadraticBezierXYatT(startPoint,controlPoint,endPoint,t/100);
        ctx.beginPath();
        ctx.arc(point.x,point.y,3,0,Math.PI*2);
        ctx.closePath();
        ctx.fillStyle=randomColor();
        ctx.fill();
    }

    function getQuadraticBezierXYatT(startPt,controlPt,endPt,T) {
        var x = Math.pow(1-T,2) * startPt.x + 2 * (1-T) * T * controlPt.x + Math.pow(T,2) * endPt.x; 
        var y = Math.pow(1-T,2) * startPt.y + 2 * (1-T) * T * controlPt.y + Math.pow(T,2) * endPt.y; 
        return( {x:x,y:y} );
    }

    function randomColor(){ 
        return('#'+Math.floor(Math.random()*16777215).toString(16));
    }

}); // end $(function(){});
</script>
</head>
<body>
    <button id="test">Test</button><br>
    <canvas id="canvas" width=300 height=300></canvas>
</body>
</html>

正文{背景色:象牙;}
画布{边框:1px纯红;}
$(函数(){
var canvas=document.getElementById(“canvas”);
var ctx=canvas.getContext(“2d”);
var startPoint={x:50,y:150};
var控制点={x:125,y:20};
var端点={x:200,y:150};
ctx.beginPath();
ctx.moveTo(startPoint.x,startPoint.y);
ctx.二次曲线(控制点.x,控制点.y,端点.x,端点.y);
ctx.stroke();

对于(var t=0;t你需要为此写数学。你需要为此写数学。你需要为此写数学。你需要为此写数学。你需要为此写数学。