canvas绘制贝塞尔曲线

简介: 原文:canvas绘制贝塞尔曲线1、绘制二次方贝塞尔曲线 quadraticCurveTo(cp1x,cp1y,x,y); 其中参数cp1x和cp1y是控制点的坐标,x和y是终点坐标 数学公式表示如下: 二次方贝兹曲线的路径由给定点P0、P1、P2的函数B(t)追踪: DOCT...
原文: canvas绘制贝塞尔曲线

1、绘制二次方贝塞尔曲线

quadraticCurveTo(cp1x,cp1y,x,y); 其中参数cp1x和cp1y是控制点的坐标,x和y是终点坐标

数学公式表示如下:

二次方贝兹曲线的路径由给定点P0P1P2的函数Bt)追踪:

\mathbf{B}(t) = (1 - t)^{2}\mathbf{P}_0 + 2t(1 - t)\mathbf{P}_1 + t^{2}\mathbf{P}_2 \mbox{ , } t \in [0,1]

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
*{padding: 0;margin:0;}
body{background: #1b1b1b;}
#div1{margin:50px auto; width:300px; height: 300px;}
canvas{background: #fff;}
</style>
<script type="text/javascript">
window.onload = function(){
    var c = document.getElementById('myCanvas');
    var content = c.getContext('2d');
    
    //绘制二次方贝塞尔曲线
    content.strokeStyle ="#FF5D43";
    content.beginPath();
    content.moveTo(0,200);
    content.quadraticCurveTo(75,50,300,200);
    content.stroke();
    content.globalCompositeOperation = 'source-over';    //目标图像上显示源图像
    
    //绘制上面曲线的控制点和控制线,控制点坐标为两直线的交点(75,50)
    content.strokeStyle = '#f0f';
    content.beginPath();
    content.moveTo(75,50);
    content.lineTo(0,200);
    content.moveTo(75,50);
    content.lineTo(300,200);
    content.stroke();
    
};
</script>
</head>
<body>
    <div id="div1">
        <canvas id="myCanvas" width="300" height="200"></canvas>
    </div>
</body>
</html>

 

2、三次方贝塞尔曲线

bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y)  其中参数cp1x,cp1y表示第一个控制点的坐标, cp2x,cp2y表示第二个控制点的坐标, x,y是终点的坐标;

数学公式表示如下:

P0P1P2P3四个点在平面或在三维空间中定义了三次方贝兹曲线。曲线起始于P0走向P1,并从P2的方向来到P3。一般不会经过P1P2;这两个点只是在那里提供方向资讯。P0P1之间的间距,决定了曲线在转而趋进P3之前,走向P2方向的“长度有多长”。

\mathbf{B}(t)=\mathbf{P}_0(1-t)^3+3\mathbf{P}_1t(1-t)^2+3\mathbf{P}_2t^2(1-t)+\mathbf{P}_3t^3 \mbox{ , } t \in [0,1]

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
*{padding: 0;margin:0;}
body{background: #1b1b1b;}
#div1{margin:50px auto; width:300px; height: 300px;}
canvas{background: #fff;}
</style>
<script type="text/javascript">
window.onload = function(){
    var c = document.getElementById('myCanvas');
    var content = c.getContext('2d');
    
    //三次方贝塞尔曲线
    content.strokeStyle = '#FA7E2A';
    content.beginPath();
    content.moveTo(25,175);
    content.bezierCurveTo(60,80,150,30,170,150);
    content.stroke();
    content.globalCompositeOperation = 'source-over';
    
    //绘制起点、控制点、终点
    content.strokeStyle = 'red';
    content.beginPath();
    content.moveTo(25,175);
    content.lineTo(60,80);
    content.lineTo(150,30);
    content.lineTo(170,150);
    content.stroke();
    
};
</script>
</head>
<body>
    <div id="div1">
        <canvas id="myCanvas" width="300" height="200"></canvas>
    </div>
</body>
</html>

目录
相关文章
|
存储 算法 关系型数据库
深入理解InnoDB索引数据结构和算法
1. **索引定义**:索引是提升查询速度的有序数据结构,帮助数据库系统快速找到数据。 2. **索引类型**:包括普通索引、唯一索引、主键索引、空间索引和全文索引,每种有特定应用场景。 3. **数据结构**:InnoDB使用B+树作为索引结构,确保所有节点按顺序排列,降低查询时的磁盘I/O。 4. **B+树特性**:所有数据都在叶子节点,非叶子节点仅存储索引,提供高效范围查询。 5. **索引优势**:通过减少查找数据所需的磁盘I/O次数,显著提高查询性能。 **总结:**InnoDB索引通过B+树结构,优化了数据访问,使得查询速度快,尤其适合大数据量的场景。
879 0
深入理解InnoDB索引数据结构和算法
|
存储 关系型数据库 数据库
聊多版本并发控制(MVCC)
MVCC是数据库并发控制技术,用于减少读写冲突。它维护数据的多个版本,使事务能读旧数据而写新数据,无需锁定记录。当前读获取最新版本,加锁防止修改;快照读不加锁,根据读取时的读视图(readview)决定读哪个版本。InnoDB通过隐藏字段(DB_TRX_ID, DB_ROLL_PTR)和undo log存储版本,readview记录活跃事务ID。读已提交每次读取都创建新视图,可重复读则在整个事务中复用一个视图,确保一致性。MVCC通过undo log版本链和readview规则决定事务可见性,实现了非阻塞并发读。
1063 5
聊多版本并发控制(MVCC)
|
12月前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
380 5
|
存储 安全 文件存储
云上文件存储:重塑数据存储与管理的新纪元
绿色节能:随着全球对环境保护和可持续发展的重视,未来的云上文件存储将更加注重绿色节能。云服务商将采用更加高效的硬件设备和节能技术降低能耗;同时还将通过优化存储资源的利用率和减少数据传输量等方式进一步降低能耗和碳排放。 强化安全性:面对日益严峻的网络安全威胁和数据保护需求,未来的云上文件存储将进一步加强安全性保障。云服务商将采用更加先进的加密技术和安全防护措施确保数据的安全性和隐私性;同时还将建立完善的安全管理体系和应急响应机制以应对各种安全事件和突发事件。 结语 云上文件存储作为数据存储与管理的新趋势,正以其独特的优势和应用价值引领着数据存储行业的变革。随着技术的不断进步和应用场景
520 0
|
存储 分布式计算 大数据
MaxCompute 数据分区与生命周期管理
【8月更文第31天】随着大数据分析需求的增长,如何高效地管理和组织数据变得至关重要。阿里云的 MaxCompute(原名 ODPS)是一个专为海量数据设计的计算服务,它提供了丰富的功能来帮助用户管理和优化数据。本文将重点讨论 MaxCompute 中的数据分区策略和生命周期管理方法,并通过具体的代码示例来展示如何实施这些策略。
1065 1
|
10天前
|
数据采集 人工智能 安全

热门文章

最新文章