详述Canvas(四)/绘制曲线

Canvas提供了4个绘制曲线的方法:

arc(x,y,stratAngle,endAngle,true/false);//默认为false

arcTo(x1,y1,x2,y2,r);

x1,y2坐标一,x2,y2坐标2,r是圆弧半径

quadraticCurveTo(dx,dy,x,y);

dx,dy控制点,x,y是结束点

bezierCurveTo(dx1,dy1,dx2,dy2,x,y);

dx1,dy1是控制点一,dx2,dy2是控制点二,x,y是结束点

1、arc(x,y,startAngle,endAngle,true/false)的用法。

<body>
<canvas id = "palette" width="300px" height="300px">
    您的浏览器不支持canvas标签,请升级浏览器或更换其它浏览器
</canvas>
</body>
</html>
<script>
    var palette = document.querySelector("#palette").getContext("2d");
    palette.arc(100,100,100,0,Math.PI/2,false);
    palette.fillStyle = "#229138";
    palette.fill();
    palette.strokeStyle = "#FF0000";
    palette.lineWidth = 5;
    palette.stroke();
</script>

对于arc中的startAngle和endAngle,注意是使用弧度表示,值的范围是0~2兀,弧度与角度之间的计算公式为:弧度 = 角度*兀/360。兀在JS中为Math.PI.

如果我们将arc(110,110,100,0,Math.PI/2,false)中的false改为true,得到的图形如下:

由此,我们可以得到一个非常重要的结论:

true/false表示得不是角度旋转的方向,角度的计算始终是顺时针方向来计算的,仅仅代表的是绘制弧度的方向是顺时针绘制还是逆时针绘制。

canvas中默认的0°方向是沿着X轴的正方向:

2、arcTo(x1,y1,x2,y2,r)的用法。

为了更好的看出效果,给canvas背景添加辅助线,每一格为50px*50px。

<body>
    <canvas id = "palette" width="500px" height="500px">
        您的浏览器不支持Canvas标签,请升级或更换浏览器
    </canvas>
</body>
</html>
<script>
var palette = document.querySelector("#palette").getContext("2d");
palette.moveTo(0,0);
palette.lineTo(0,300);
palette.moveTo(50.5,0);
palette.lineTo(50.5,300);
palette.moveTo(100.5,0);
palette.lineTo(100.5,300);
palette.moveTo(150.5,0);
palette.lineTo(150.5,300);
palette.moveTo(200.5,0);
palette.lineTo(200.5,300);
palette.moveTo(250.5,0);
palette.lineTo(250.5,300);
palette.moveTo(300.5,0);
palette.lineTo(300.5,300);
palette.moveTo(0,0);
palette.lineTo(300,0);
palette.moveTo(0,50.5);
palette.lineTo(300,50.5);
palette.moveTo(0,100.5);
palette.lineTo(300,100.5);
palette.moveTo(0,150.5);
palette.lineTo(300,150.5);
palette.moveTo(0,200.5);
palette.lineTo(300,200.5);
palette.moveTo(0,250.5);
palette.lineTo(300,250.5);
palette.moveTo(0,300.5);
palette.lineTo(300,300.5);
palette.stroke();

palette.beginPath();
palette.moveTo(0,300.5);
palette.arcTo(50,100,200,50,100);
palette.strokeStyle = "#FF0000";
palette.lineWidth = 5;
palette.stroke();
</script>

可以看到arcTo画出的是起点到第一个坐标点,第一个坐标点到第二个坐标点的两条直线的一个圆弧,圆弧与这条切线相切。

为了进一步确定,并研究半径对曲线的影响,我们改变一下上面的代码

注:后面的代码中都使用这个格子,代码相同部分不再粘贴出来。

<script>
    palette.beginPath();
    palette.moveTo(50,250);
    palette.arcTo(50,100,300,100,100);
    palette.strokeStyle = "#FF0000";
    palette.lineWidth = 5;
    palette.stroke();
</script>

通过观察,感觉是以(150,200)为圆心,半径为100画的圆弧,而(50,250)到(50,200)即起点到紫色的点部分仅仅是直线,这个紫色的点是canvas通过计算得到的点,如果这一段无法是弧线,那么就会直接是一段直线。

为了验证猜想,我们再改变一下上面的代码。

<script>
    palette.beginPath();
    palette.moveTo(50,300);
    palette.arcTo(50,100,300,100,100);
    palette.strokeStyle = "#FF0000";
    palette.lineWidth = 5;
    palette.stroke();
</script>

可以看出,(50,300)到(50,200)这段完全是直线,而尽管我们将结束点移至(300,100)的位置,但是弧线并未延长。如果补全这个圆的话,几乎应该是下图的蓝色圆,过了(150,100)切点之后,就要向下延伸了。

因此,第二个结论,我认为是:圆弧的结束点,就是圆与第二条直线的切点。

当然,我们也可以尝试改变半径的大小,如我们将半径改为200。

另外一个需要注意的是,起点不能与第一个点重合,否则是不能画图圆弧的。

<script>
    palette.beginPath();
    palette.moveTo(50,100);
    palette.arcTo(50,100,300,100,100);
    palette.strokeStyle = "#FF0000";
    palette.lineWidth = 5;
    palette.stroke();
</script>

图上并未出现圆弧。

3、quadraticCurveTo(dx,dy,x,y)的用法。

<script>
    palette.beginPath();
    palette.moveTo(50,200);
    palette.quadraticCurveTo(100,100,250,250);
    palette.strokeStyle = "#FF0000";
    palette.lineWidth = 5;
    palette.stroke();
</script>

因为quadraticCurveTo(dx,dy,x,y)只有一个控制点,最多只能画出图示的曲线,而不能画出S形曲线,引入bezierCurveTo(dx1,dy1,dx2,dy2,x,y)

4、bezierCurveTo(dx1,dy1,dx2,dy2,x,y)的用法。

<script>
    palette.beginPath();
    palette.moveTo(50,150);
    palette.bezierCurveTo(100,50,200,200,250,100);
    palette.strokeStyle = "#FF0000";
    palette.lineWidth = 5;
    palette.stroke();
</script>

一共涉及到四个点,起点:moveTo(x,y);终点,还有两个控制点。当两个控制点在起点和终点的两侧时,会得到S曲线,而当两个控制点在连线的一侧时,会得到曲线,效果类似quadraticCurveTo.当然,如果所有的点都在一条直线上,会得到一条直线,但是我想应该不会有人这么无聊吧。

试试看两个控制点在一侧的情况

<script>
    palette.beginPath();
    palette.moveTo(50,150);
    palette.bezierCurveTo(100,50,200,80,250,100);
    palette.strokeStyle = "#FF0000";
    palette.lineWidth = 5;
    palette.stroke();
</script>

时间: 2024-08-09 09:15:27

详述Canvas(四)/绘制曲线的相关文章

canvas(四)绘制曲线

1.自定义方法绘制曲线 曲线可以看成是无数条极短的直线连接而成的,可以使用lineTo()来绘制一条曲线 圆的方程为:r^2 = x^2 + y^2 可得 y = Math.sqrt(r^2-x^2) 可以根据这个公式来绘制以0,0为圆心的1/4圆的曲线 <script> var canvas = document.querySelector("canvas") var ctx = canvas.getContext("2d") // 设置圆的半径和绘制

详述Canvas(五)/绘制圆角矩形

Canvas并没有提供绘制圆角矩形的方法,但是通过观察,我们可以发现,其实我们可以将圆角矩形分为四段,可以通过使用arcTo来实现. 我们假设起点为x,y.绘制的矩形宽高为w,h.圆角的半径为r;所以将起点设置在(x+r,y)处,然后acrTo(x+w,y,x+w,y+h,r),对于终点,其实只要y值大于绿色点的都是可以的(这部分在绘制曲线部分已经详述).此处我们将终点设为(x+w,y+h);这就是第一段曲线.第一段曲线绘制完毕之后,画笔落在了下图绿色点的位置. 现在再看下第二段曲线: 因此我们

[ html canvas 绘制曲线三种方法 ] canvas绘图 绘制曲线三种方法属性实例演示

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

HTML5之canvas 4 绘制曲线

一.圆弧 (x0,y0)当前坐标点,(x1,y1)控制点坐标,(x2,y2)圆弧终点坐标 Context.arcTo(x1,y1,x2,y2,radiusX) 二.二次贝塞尔曲线 开始点:moveTo(20,20) 控制点 1:quadraticCurveTo(20,100,200,20) 结束点:quadraticCurveTo(20,100,200,20) Context. quadraticCurveTo(cpx,cpy,x,y) (cpx,cpy)控制点坐标,(x,y)终点坐标 三.三次

详述canvas(三)—绘制图形/填充和渐变

未闭合的图形也会被填充 <body> <canvas id = "palette" width="500px" height="500px"> 您的浏览器不支持canvas标签,请升级浏览器或更换其它浏览器 </canvas> </body> </html> <script> var palette = document.querySelector("#palett

canvas绘制曲线

绘制曲线有几种思路: 1.通过quadraticCurveTo(controlX, controlY, endX, endY)方法来绘制二次曲线 2.通过bezierCurveTo(controlX1, controlY1, controlX2, controlY2, endX, endY)方法,来绘制贝塞尔曲线 3.通过画圆的方法arc(x, y, radius, startAngle, endAngle, antiClockwise)来取得某一段圆弧,作为要画出的曲线 1.二次曲线quadr

JavaScript+canvas 利用贝塞尔曲线绘制曲线

效果图: <body> <canvas id="test" width="800" height="300"></canvas> <script type="text/javascript"> //一个工具函数,用于将角度从角度制转化成弧度制 function rads(x){ return Math.PI*x/180;} var canvas = document.getEle

canvas教程(三) 绘制曲线

经过 canvas 教程(二) 绘制直线 我们知道了 canvas 的直线是怎么绘制的 而本次是给大家带来曲线相关的绘制 绘制圆形 在 canvas 中我们可以使用 arc 方法画一个圆 context.beginPath(); context.arc(x, y, r, startRadian, endRadian, antclockwise); context.closePath(); 我们是第一次用到 beginPath 和 closePath 这两个方法,首先这两个方法故名思意就是开始路径

html5 canvas绘图-贝塞尔曲线

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