之前,我写了一个arc函数的用法:[js高手之路] html5 canvas系列教程 - arc绘制曲线图形(曲线,弧线,圆形).

arcTo:

cxt.arcTo( cx, cy, x2, y2, 半径 )

cx,cy表示控制点的坐标,x2,y2表示结束点的坐标,如果我们想画一条弧线,需要提供3个坐标,开始点,控制点和结束点. 开始点一般可以通过moveTo或者lineTo提供.arcTo提供控制点和结束点.

 <style>
body {
background: #000;
} #canvas {
background: white;
}
</style>
<script>
window.onload = function () {
var oCanvas = document.querySelector("#canvas"),
oGc = oCanvas.getContext('2d'); var x1 = 50,
y1 = 100,
cx = 500,
cy = 100,
x2 = 450,
y2 = 200;
oGc.lineWidth = '2px';
oGc.strokeStyle = 'red';
oGc.moveTo( x1, y1 );
oGc.arcTo( cx, cy, x2, y2, 50 );
oGc.stroke();
}
</script>
</head>
<body>
<canvas id="canvas" width="800" height="600"></canvas>
</body>

加大半径( 其他代码保持不变,半径调成100 )弧度将会变大!

oGc.arcTo( cx, cy, x2, y2, 100 );

如果调整结束点,把结束点与控制点形成一个直角,那么弧度将不会这么弯曲

 var x1 = 50,
y1 = 100,
cx = 500,
cy = 100,
x2 = 500,
y2 = 200;
oGc.lineWidth = '2px';
oGc.strokeStyle = 'red';
oGc.moveTo( x1, y1 );
oGc.arcTo( cx, cy, x2, y2, 100 );
oGc.stroke();

如果把开始点的横坐标放大,半径也放大,那么得到的形状是这样的!

 var x1 = 400,
y1 = 100,
cx = 500,
cy = 100,
x2 = 500,
y2 = 200;
oGc.lineWidth = '2px';
oGc.strokeStyle = 'red';
oGc.moveTo( x1, y1 );
oGc.arcTo( cx, cy, x2, y2, 300 );
oGc.stroke();

看到这些形状,你知道他能用在哪些地方吗?

贝塞尔曲线:

如果你初次了解贝塞尔曲线,这里有一篇非常不错的文章可以参考下:

http://www.html-js.com/article/1628

再来一个工具,这个工具提供了canvas中贝塞尔曲线的开始点,控制点与结束点的坐标:

http://myst729.github.io/bezier-curve/

canvas二次贝塞尔曲线的函数语法:

cxt.quadraticCurveTo( cx, cy, x2, y2 );

cx,cy控制点坐标,x2,y2:结束点坐标, 开始点一般由moveTo, lineTo提供.

画一个二次贝塞尔曲线:

 <style>
body {
background: #000;
}
#canvas {
background: white;
}
</style>
<script>
window.onload = function () {
var oCanvas = document.querySelector("#canvas"),
oGc = oCanvas.getContext('2d'); oGc.strokeStyle = 'red';
oGc.moveTo( 140, 80 );
oGc.quadraticCurveTo( 411, 77, 418, 277 );
oGc.stroke();
}
</script>
</head>
<body>
<canvas id="canvas" width="800" height="600"></canvas>
</body>

    

三次贝塞尔曲线

canvas三次贝塞尔曲线的函数语法:

cxt.bezierCurveTo( cx1, cy1, cx2, cy2, x2, y2 );

cx1,cx2 表示第一个控制点,cx2,cy2表示第二个控制点,x2, y2表示结束点坐标。开始点一般由moveTo, lineTo提供.

画一个三次贝塞尔曲线:

 <style>
body {
background: #000;
}
#canvas {
background: white;
}
</style>
<script>
window.onload = function () {
var oCanvas = document.querySelector("#canvas"),
oGc = oCanvas.getContext('2d'); oGc.strokeStyle = 'red';
oGc.moveTo( 234, 224 );
oGc.bezierCurveTo( 301, 68, 454, 361, 555, 162 );
oGc.stroke();
}
</script>
</head>
<body>
<canvas id="canvas" width="800" height="600"></canvas>
</body>

     

画一个饼图:

 <style>
body {
background: #000;
}
#canvas {
background: white;
}
</style>
<script>
window.onload = function () {
var oCanvas = document.querySelector("#canvas"),
oGc = oCanvas.getContext('2d'); oGc.beginPath();
oGc.fillStyle = 'red';
oGc.moveTo( 300, 200 );
oGc.arc( 300, 200, 100, 0 * Math.PI / 180, 120 * Math.PI / 180, false );
oGc.closePath();
oGc.fill(); oGc.beginPath();
oGc.fillStyle = 'orange';
oGc.moveTo( 300, 200 );
oGc.arc( 300, 200, 100, 120 * Math.PI / 180, 240 * Math.PI / 180, false );
oGc.closePath();
oGc.fill(); oGc.beginPath();
oGc.fillStyle = '#09f';
oGc.moveTo( 300, 200 );
oGc.arc( 300, 200, 100, 240 * Math.PI / 180, 360 * Math.PI / 180, false );
oGc.closePath();
oGc.fill();
}
</script>
</head>
<body>
<canvas id="canvas" width="800" height="600"></canvas>
</body>

画一个圆角矩形:

 <style>
body {
background: #000;
}
#canvas {
background: white;
}
</style>
<script>
window.onload = function () {
var oCanvas = document.querySelector("#canvas"),
oGc = oCanvas.getContext('2d'); oGc.strokeStyle = 'red';
oGc.lineWidth = '2px';
oGc.moveTo( 200, 100 );
oGc.lineTo( 500, 100 );
oGc.arcTo( 600, 100, 600, 200, 100 );
oGc.moveTo( 600, 200 );
oGc.lineTo( 600, 400 );
oGc.arcTo( 600, 500, 500, 500, 100 );
oGc.moveTo( 500, 500 );
oGc.lineTo( 200, 500 );
oGc.arcTo( 100, 500, 100, 400, 100 );
oGc.moveTo( 100, 400 );
oGc.lineTo( 100, 200 );
oGc.arcTo( 100, 100, 200, 100, 100 );
oGc.stroke();
}
</script>
</head>
<body>
<canvas id="canvas" width="800" height="600"></canvas>
</body>

[js高手之路] html5 canvas系列教程 - arcTo(弧度与二次,三次贝塞尔曲线以及在线工具)的更多相关文章

  1. [js高手之路] html5 canvas系列教程 - 线条样式(lineWidth,lineCap,lineJoin,setLineDash)

    上文,写完弧度与贝塞尔曲线[js高手之路] html5 canvas系列教程 - arcTo(弧度与二次,三次贝塞尔曲线以及在线工具),本文主要是关于线条的样式设置 lineWidth: 设置线条的宽 ...

  2. [js高手之路] html5 canvas系列教程 - 掌握画直线图形的常用API

    我们接着上文[js高手之路] html5 canvase系列教程 - 认识canvas以及基本使用方法继续. 一.直线的绘制 cxt.moveTo( x1, y1 ): 将画笔移动到x1, y1这个点 ...

  3. [js高手之路] html5 canvas系列教程 - arc绘制曲线图形(曲线,弧线,圆形)

    绘制曲线,经常会用到路径的知识,如果你对路径有疑问,可以参考我的这篇文章[js高手之路] html5 canvas系列教程 - 开始路径beginPath与关闭路径closePath详解. arc:画 ...

  4. [js高手之路] html5 canvas系列教程 - 图片操作(drawImage,clip,createPattern)

    接着上文[js高手之路] html5 canvas系列教程 - 文本样式(strokeText,fillText,measureText,textAlign,textBaseline)继续,本文介绍的 ...

  5. [js高手之路] html5 canvas系列教程 - 文本样式(strokeText,fillText,measureText,textAlign,textBaseline)

    接着上文线条样式[js高手之路] html5 canvas系列教程 - 线条样式(lineWidth,lineCap,lineJoin,setLineDash)继续. canvas提供两种输出文本的方 ...

  6. [js高手之路] html5 canvas系列教程 - 像素操作(反色,黑白,亮度,复古,蒙版,透明)

    接着上文[js高手之路] html5 canvas系列教程 - 状态详解(save与restore),相信大家都应该玩过美颜功能,而我们今天要讲的就是canvas强大的像素处理能力,通过像素处理,实现 ...

  7. [js高手之路] html5 canvas系列教程 - 状态详解(save与restore)

    本文内容与路径([js高手之路] html5 canvas系列教程 - 开始路径beginPath与关闭路径closePath详解)是canvas中比较重要的概念.掌握理解他们是做出复杂canvas动 ...

  8. [js高手之路] html5 canvas系列教程 - 线形渐变,径向渐变与阴影设置

    接着上文[js高手之路] html5 canvas系列教程 - 像素操作(反色,黑白,亮度,复古,蒙版,透明)继续. 一.线形渐变 线形渐变指的是一条直线上发生的渐变. 用法: var linear ...

  9. [js高手之路] html5 canvas动画教程 - 实时获取鼠标的当前坐标

    有了前面的canvas基础之后,现在开始就精彩了,后面写的canvas教程都是属于综合应用,前面已经写了常用的canvas基础知识,参考链接如下: [js高手之路] html5 canvas系列教程 ...

随机推荐

  1. python基础教程(三)

    序列概览 Python 包含6 种内建的序列,这里重点讨论最常用的两种类型:列表和元组. 列表与元组的主要区别在于,列表可以修改,元组则不能.也就是说如果要根据要求来添加元素,那么列表可以会更好用:而 ...

  2. 6.26学习 异步委托回调函数 VS 多线程 VS 并行处理

    描述: 我现在是轮询着构建实例,然后这个实例去执行一个方法,但是执行方法需要大约10s时间,全部轮询下来需要很长时间.所以我现在要更改,头给了我两个方法,1多线程 2异步委托回调函数. 异步委托回调函 ...

  3. MemCache在Windows环境下的搭建及启动

    MemCache在Windows环境下的搭建及启动 一.memcache服务器端的安装 1.下载memcached的安装包,memcached_en32or64.zip,下载链接:http://pan ...

  4. Python 的经典入门书籍有哪些?

    是不是很多人跟你说,学Python开发就该老老实实地找书来看,再配合死命敲代码?电脑有了,软件也有了,心也收回来了?万事俱备,唯独只欠书籍?没找到到合适的书籍?可以看看这些. 1.Python基础教程 ...

  5. 针对通达OA20170729集团版设计门户管理解决方案的具体实例

    随着企业信息化建设的深入,应用系统数量不断增加,应用功能不断丰富,数据信息也在呈几何级数增长,在支撑企业正常工作运转的同时,也衍生出许多新的问题: 通达信科根据自身从业多年的行业实践经验,勇于打破传统 ...

  6. Java基础精选,你答对了几道?

    没有技术深度是大多程序员的一种常态. 但是当你成为一个资深的工程师的时候,很多公司并不希望你还是那样平庸,没有深度.虽然你会纳闷,我就算有深度你们也不一定用得上呀?然而到了这个级别的人需求量并不像初中 ...

  7. Linux_window与linux之间文件互传,上传下载

    window与linux之间文件互传 运行环境:Centos os7 + win8.1 +putty putty:是一个Telnet,ssh,rlogin,纯tcp以及串行接口连接软件,由于linux ...

  8. java_eclipse添加DID实现自动提示

    便捷无错开发 对于xml 配置没有自动提示是多么恼火就不用说了,eclipse本身很多都是默认关闭了的,如果开发者不知道的话,就不知道怎么去设置,下面介绍几种自动提示设置的方法: XML:获得提示更好 ...

  9. 在Android上仿百度贴吧客户端Loading图标小球

    封面 前言 使用百度贴吧客户端的时候发发现加载的小动画挺有意思的,于是自己动手写写看.想学习自定义View以及自定义动画的小伙伴一定不要错过哦. 读者朋友需要有最基本的canvas绘图功底,比如画笔P ...

  10. MySQL插入10万数据时间(结论:最快14.967s,每秒插入6681条)

    记录我的一次MySQL操作Demo: 存储过程: DROP PROCEDURE IF EXISTS my_insert; CREATE PROCEDURE my_insert() BEGIN ; lo ...