canvas绘制二次贝塞尔曲线----演示二次贝塞尔四个参数的作用

canvas中绘制二次贝塞尔曲线的方法为ctx.quadraticCurveTo(x1,y1,x2,y2);

四个参数分别为两个控制点的坐标.开始点即当前canvas中目前的点,如果想从指定的点开始,需要使用ctx.moveTo(x,y)方法

演示效果如下图

上代码:

html

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
<style>
*{ margin:0; padding:0;}
#info{ width:800px; height:30px; line-height:30px; margin:50px auto 0 auto;}
#canvas{ display:block; border:1px solid #ccc; margin:0px auto;}
</style>
<script src="js/dot.js"></script>
<script src="js/main.js"></script>
</head>

<body>
<div id="info"></div>
<canvas id="canvas" width="800" height="600"></canvas>
</body>
</html>

JS代码

dot.js

// JavaScript Document
var dot = function ( x , y ){
    this.x = x;
    this.y = y;
    this.r = dotR;
}
dot.prototype.draw = function (ctx){
    ctx.save();
    ctx.beginPath();
    ctx.arc( this.x , this.y , this.r , 0 , Math.PI*2 );
    ctx.fill();
    ctx.closePath();
    ctx.restore();
}

main.js

// JavaScript Document

var CANVERS_WIDTH = 800;
var CANVERS_HEIGHT = 600;

var dotR = 10;
var dotArr = [];
window.onload = function(){

    var oCanvas = document.querySelector("#canvas");

    var oInfo = document.querySelector("#info");

    var ctx = oCanvas.getContext("2d");

    var dotA = new dot( 100 , 400 );
    dotArr.push( dotA );
    var dotB = new dot( 200 , 200 );
    dotArr.push( dotB );
    var dotC = new dot( 400 , 400 );
    dotArr.push( dotC );

    creatGuides();
    createBezier();

    function createBezier(){
        ctx.save();
        ctx.beginPath();
        ctx.moveTo( dotA.x , dotA.y );
        ctx.quadraticCurveTo( dotB.x , dotB.y , dotC.x , dotC.y );
        ctx.stroke();
        ctx.closePath();
        ctx.restore();
    }

    //绘制辅助线

    ctx.lineWidth = 2;
    function creatGuides(){

        dotA.draw( ctx );
        dotB.draw( ctx );
        dotC.draw( ctx );

        ctx.save();
        ctx.beginPath();
        ctx.moveTo( dotA.x, dotA.y );
        ctx.lineTo( dotB.x , dotB.y );
        ctx.lineTo( dotC.x , dotC.y );
        ctx.stroke();
        ctx.closePath();
        ctx.restore();

    }

    oCanvas.onmousedown = function (e){

        var disX = e.clientX - this.offsetLeft;
        var disY = e.clientY - this.offsetTop;
        //判断鼠标放下是是否在控制点上
        var curDot = checkDot(disX,disY)

        if( curDot ){

            if(oCanvas.setCapture){ oCanvas.setCapture(); }

            document.onmousemove = function (e){

                oInfo.textContent ="ctx.quadraticCurveTo("+ dotB.x + "," + dotB.y + "," + dotC.x + "," + dotC.y + ")";

                disX = e.clientX - oCanvas.offsetLeft;
                disY = e.clientY - oCanvas.offsetTop;

                curDot.x = disX;
                curDot.y = disY;

                console.log(disX)
                ctx.clearRect(0,0,CANVERS_WIDTH,CANVERS_HEIGHT);
                creatGuides();
                createBezier();

            }

            document.onmouseup = function (){
                creatGuides();
                createBezier();
                document.onmousemove = null;
                document.onmouseup = null;
                if(oCanvas.setCapture){ oCanvas.releasesCaptrue(); }
            }
            return false;
        }

    }

    function checkDot(x,y){
        for( var i=0; i<dotArr.length; i++ ){
            if( Math.abs( dotArr[i].x - x ) < dotR && Math.abs( dotArr[i].y - y ) < dotR ){
                return dotArr[i];
            }
        }
        return false;
    }

}
时间: 2024-11-01 02:17:23

canvas绘制二次贝塞尔曲线----演示二次贝塞尔四个参数的作用的相关文章

SVG 学习&lt;八&gt; SVG的路径——path(2)贝塞尔曲线命令、光滑贝塞尔曲线命令

查阅一些关于贝塞尔曲线资料后,对贝塞尔曲线有了大概的了解. 个人对贝塞尔曲线的理解: 二次贝塞尔曲线:由起点.终点和一个控制点控制的范围内绘制的一条曲线: 三次贝塞尔曲线:由起点.终点和两个个控制点控制的范围内绘制的一条曲线: 四次贝塞尔曲线/五次贝塞尔曲线 ... ... 以此类推. 贝塞尔曲线命令 理解了什么是贝塞尔曲线,贝塞尔曲线命令就很好理解了. SVG中只能定义二次 三次贝塞尔曲线 二次贝塞尔曲线:Q x1 y1 x y: x1 y1 定义二次贝塞尔曲线控制点坐标, x y 定义二次贝

[ html drawImage 绘制图片 ] canvas绘制图片 drawImage 属性实例演示之二

1 <!DOCTYPE html> 2 <html lang='zh-cn'> 3 <head> 4 <title>Insert you title</title> 5 <meta name='description' content='this is my page'> 6 <meta name='keywords' content='keyword1,keyword2,keyword3'> 7 <meta htt

[ html drawImage 图片预加载 ] canvas绘制图片 drawImage 属性实例演示之三--使用New Image()进行图片预加载

1 <!DOCTYPE html> 2 <html lang='zh-cn'> 3 <head> 4 <title>Insert you title</title> 5 <meta name='description' content='this is my page'> 6 <meta name='keywords' content='keyword1,keyword2,keyword3'> 7 <meta htt

[ html drawImage 绘制图片 ] canvas绘制图片 drawImage 属性实例演示

<!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title> <meta name='description' content='this is my page'> <meta name='keywords' content='keyword1,keyword2,keyword3'> <meta http-equiv="

贝塞尔曲线算法,js贝塞尔曲线路径点

//anchorpoints:贝塞尔基点 //pointsAmount:生成的点数 //return 路径点的Array function CreateBezierPoints(anchorpoints, pointsAmount) { var points = []; for (var i = 0; i < pointsAmount; i++) { var point = MultiPointBezier(anchorpoints, i / pointsAmount); points.push

html5 canvas绘图-贝塞尔曲线

贝塞尔曲线(ezier curve)最迟是由法国物理学家与数学家paul de Casteljau发明的.它的广泛运用则要归功于法国工程师皮埃尔 贝塞尔 贝塞尔曲线期初被用在汽车车身的设计上.现在则多用于计算机图形系统中.例如Adobe Illustrator/Apple的Cocoa框架以及在Html5的canvas. 贝塞尔曲线分为两种:平方(quadratic)贝塞尔曲线及立方(cubic)贝塞尔曲线.平方贝塞尔曲线是一种二次曲线(second degree curve),意思就是说,它们是

canvas绘制贝塞尔曲线

原文:canvas绘制贝塞尔曲线 1.绘制二次方贝塞尔曲线 quadraticCurveTo(cp1x,cp1y,x,y); 其中参数cp1x和cp1y是控制点的坐标,x和y是终点坐标 数学公式表示如下: 二次方贝兹曲线的路径由给定点P0.P1.P2的函数B(t)追踪: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <

HTML5 Canvas中的贝塞尔曲线

在HTML5提供的画布功能,也就是Canvas中,getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性.本文以getContext("2d")中提供的方法为例,简要研究了其中用于绘制曲线路径的贝塞尔曲线. JavaScript中的getContext("2d")为我们提供了两种绘制贝塞尔曲线路径的方法,分别是quadraticCurveTo()用于绘制二次贝塞尔曲线和bezierCurveTo()用于绘制三次贝塞尔曲线. 什么是贝塞

OpenGL 实践之贝塞尔曲线绘制

说到贝塞尔曲线,大家肯定都不陌生,网上有很多关于介绍和理解贝塞尔曲线的优秀文章和动态图. 以下两个是比较经典的动图了. 二阶贝塞尔曲线: 三阶贝塞尔曲线: 由于在工作中经常要和贝塞尔曲线打交道,所以简单说一下自己的理解: 现在假设我们要在坐标系中绘制一条直线,直线的方程很简单,就是 y=x ,很容易得到下图: 现在我们限制一下 x 的取值范围为 0~1 的闭区间,那么可以得出 y 的取值范围也是 0~1. 而在 0~1 的区间范围内,x 能取的数有多少个呢?答案当然是无数个了. 同理,y 的取值