欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于js Canvas實現(xiàn)二次貝塞爾曲線

 更新時間:2018年12月25日 15:55:47   作者:Orange_J  
這篇文章主要為大家詳細(xì)介紹了基于js Canvas實現(xiàn)二次貝塞爾曲線,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了js Canvas實現(xiàn)二次貝塞爾曲線的具體代碼,供大家參考,具體內(nèi)容如下

先上效果圖:

實現(xiàn)代碼:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>二次貝塞爾曲線</title>
<meta name="Keywords" content="">
<meta name="Description" content="">
<style type="text/css">
 body, h1{margin:0;}
 canvas{margin: 20px; }
</style>
</head>
<body>
 <h1>二次貝塞爾曲線</h1>
 <canvas id="canvas" width=600 height=600 style="border: 1px solid #ccc;"></canvas>
<script>
 /**
 * @param sx 起始點x坐標(biāo)
 * @param sy 起始點y坐標(biāo)
 * @param ex 結(jié)束點x坐標(biāo)
 * @param ey 結(jié)束點y坐標(biāo)
 * @param cx 控制點x坐標(biāo)
 * @param cy 控制點y坐標(biāo)
 * @param part 將起始點到控制點的線段分成的份數(shù),數(shù)值越高,計算出的曲線越精確
 */
 function draw(sx, sy, ex, ey, cx, cy, part) {
 var canvas = document.getElementById('canvas');
 var ctx = canvas.getContext('2d'); 
 //繪制起始點、控制點、終點 
 ctx.beginPath();
 ctx.moveTo(sx, sy);
 ctx.lineTo(cx, cy);
 ctx.lineTo(ex, ey);
 ctx.stroke();
 
 // 繪制二次貝塞爾曲線
 ctx.beginPath();
 ctx.moveTo(sx, sy);
 // 起始點到控制點的x和y每次的增量
 var changeX1 = (cx - sx) / part;
 var changeY1 = (cy - sy) / part;
 // 控制點到結(jié)束點的x和y每次的增量
 var changeX2 = (ex - cx) / part;
 var changeY2 = (ey - cy) / part;
 
 for(var i = 0; i < part; i++) {
 // 計算兩個動點的坐標(biāo)
 var qx1 = sx + changeX1 * i;
 var qy1 = sy + changeY1 * i;
 var qx2 = cx + changeX2 * i;
 var qy2 = cy + changeY2 * i;
 // 計算得到此時的一個貝塞爾曲線上的點坐標(biāo)
 var bx = qx1 + (qx2 - qx1) * i / part;
 var by = qy1 + (qy2 - qy1) * i / part;
 
 ctx.lineTo(bx, by);
 }
 ctx.stroke();
 }
 
 window.onload = function () {
 draw(0, 0, 600, 0, 150, 450, 100);
 };
</script>
</body>
</html>

上面的是靜態(tài)的,來個動態(tài)的看一看:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>二次貝塞爾曲線</title>
<meta name="Keywords" content="">
<meta name="Description" content="">
<style type="text/css">
 body, h1{margin:0;}
 canvas{margin: 20px; }
</style>
</head>
<body>
 <h1>二次貝塞爾曲線</h1>
 <canvas id="canvas" width=600 height=600 style="border: 1px solid #ccc;"></canvas>
<script>
 /**
 * @param sx 起始點x坐標(biāo)
 * @param sy 起始點y坐標(biāo)
 * @param ex 結(jié)束點x坐標(biāo)
 * @param ey 結(jié)束點y坐標(biāo)
 * @param cx 控制點x坐標(biāo)
 * @param cy 控制點y坐標(biāo)
 * @param part 將起始點到控制點的線段分成的份數(shù),數(shù)值越高,計算出的曲線越精確
 * @param interval 畫圖的間隔
 * @return function 調(diào)用一次就向后畫一段曲線
 */
 function draw(sx, sy, ex, ey, cx, cy, part, interval) {
 var canvas = document.getElementById('canvas');
 var ctx = canvas.getContext('2d'); 
 //繪制起始點、控制點、終點 
 ctx.beginPath();
 ctx.moveTo(sx, sy);
 ctx.lineTo(cx, cy);
 ctx.lineTo(ex, ey);
 ctx.stroke();
 
 // 繪制二次貝塞爾曲線
 ctx.beginPath();
 ctx.moveTo(sx, sy);
 // 起始點到控制點的x和y每次的增量
 var changeX1 = (cx - sx) / part;
 var changeY1 = (cy - sy) / part;
 // 控制點到結(jié)束點的x和y每次的增量
 var changeX2 = (ex - cx) / part;
 var changeY2 = (ey - cy) / part;
 // 上次的點坐標(biāo)
 var lastX = sx;
 var lastY = sy;
 
 var i = 0;
 
 return function () {
 // 計算兩個動點的坐標(biāo)
 var qx1 = sx + changeX1 * i;
 var qy1 = sy + changeY1 * i;
 var qx2 = cx + changeX2 * i;
 var qy2 = cy + changeY2 * i;
 // 計算得到此時的一個貝塞爾曲線上的點
 var bx = qx1 + (qx2 - qx1) * i / part;
 var by = qy1 + (qy2 - qy1) * i / part;
 // 從上次的點繼續(xù)畫
 ctx.beginPath();
 ctx.moveTo(lastX, lastY);
 ctx.lineTo(bx, by);
 ctx.stroke();
 // 保存點坐標(biāo)
 lastX = bx;
 lastY = by;
 
 i += 1;
 
 if (i < part) {
 setTimeout(arguments.callee, interval);
 }
 }
 }
 
 window.onload = function () {
 var display = draw(0, 0, 600, 0, 150, 450, 200, 50);
 display();
 };
</script>
</body>
</html>

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于javascript實現(xiàn)表格的簡單操作

    基于javascript實現(xiàn)表格的簡單操作

    這篇文章主要為大家詳細(xì)介紹了基于javascript實現(xiàn)表格的簡單操作,具有一定的參考價值,感興趣的朋友可以參考一下
    2016-05-05
  • JS實現(xiàn)圖片輪播效果實例詳解【可自動和手動】

    JS實現(xiàn)圖片輪播效果實例詳解【可自動和手動】

    這篇文章主要介紹了JS實現(xiàn)圖片輪播效果,結(jié)合完整實例形式分析了javascript可自動和手動輪播圖的原理、布局與輪播功能相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2019-04-04
  • js中reverse函數(shù)的用法詳解

    js中reverse函數(shù)的用法詳解

    本篇文章主要是對js中reverse函數(shù)的用法進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • js獲取及判斷鍵盤按鍵的方法

    js獲取及判斷鍵盤按鍵的方法

    這篇文章主要介紹了js獲取及判斷鍵盤按鍵的方法,涉及JavaScript鍵盤事件的獲取及鍵值的判定技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-12-12
  • Vue 組件渲染詳情

    Vue 組件渲染詳情

    這篇文章主要介紹了Vue 組件渲染詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • JavaScript實現(xiàn)左右下拉框動態(tài)增刪示例

    JavaScript實現(xiàn)左右下拉框動態(tài)增刪示例

    本篇文章主要介紹了JavaScript實現(xiàn)左右下拉框動態(tài)增刪示例,可以對下拉框進(jìn)行刪除和增加,非常具有實用價值,需要的朋友可以參考下。
    2017-03-03
  • js中異步函數(shù)async function變同步函數(shù)的簡單入門

    js中異步函數(shù)async function變同步函數(shù)的簡單入門

    這篇文章主要介紹了js中異步函數(shù)async function變同步函數(shù)的簡單入門,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 一些不錯的JS 自定義函數(shù)

    一些不錯的JS 自定義函數(shù)

    一些不錯的JS 自定義函數(shù) ,不少網(wǎng)站都在用,都是一些比較不錯的函數(shù),可以拿來直接使用。建議學(xué)習(xí)。
    2009-08-08
  • p5.js碼繪“跳動的小正方形”的實現(xiàn)代碼

    p5.js碼繪“跳動的小正方形”的實現(xiàn)代碼

    這篇文章主要介紹了p5.js碼繪“跳動的小正方形”,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10
  • 小程序?qū)崿F(xiàn)錄音上傳功能

    小程序?qū)崿F(xiàn)錄音上傳功能

    這篇文章主要為大家詳細(xì)介紹了小程序?qū)崿F(xiàn)錄音上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11

最新評論